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

Artifact 172792eb66e9a8985e8a246e689318cadbda50e10c13f0e51eea32215c6c9161:


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 6e 66 69 67 22 2c 0a 20 20 20 20 22   "config",.    "
f3d0: 63 6f 70 79 22 2c 20 20 20 20 20 20 20 20 20 20  copy",          
f3e0: 20 20 20 20 20 20 20 20 20 22 64 65 73 65 72 69           "deseri
f3f0: 61 6c 69 7a 65 22 2c 20 20 20 20 20 20 20 20 20  alize",         
f400: 20 20 22 65 6e 61 62 6c 65 5f 6c 6f 61 64 5f 65    "enable_load_e
f410: 78 74 65 6e 73 69 6f 6e 22 2c 0a 20 20 20 20 22  xtension",.    "
f420: 65 72 72 6f 72 63 6f 64 65 22 2c 20 20 20 20 20  errorcode",     
f430: 20 20 20 20 20 20 20 20 20 22 65 76 61 6c 22 2c           "eval",
f440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f450: 20 20 22 65 78 69 73 74 73 22 2c 0a 20 20 20 20    "exists",.    
f460: 22 66 75 6e 63 74 69 6f 6e 22 2c 20 20 20 20 20  "function",     
f470: 20 20 20 20 20 20 20 20 20 20 22 69 6e 63 72 62            "incrb
f480: 6c 6f 62 22 2c 20 20 20 20 20 20 20 20 20 20 20  lob",           
f490: 20 20 20 22 69 6e 74 65 72 72 75 70 74 22 2c 0a     "interrupt",.
f4a0: 20 20 20 20 22 6c 61 73 74 5f 69 6e 73 65 72 74      "last_insert
f4b0: 5f 72 6f 77 69 64 22 2c 20 20 20 20 20 20 22 6e  _rowid",      "n
f4c0: 75 6c 6c 76 61 6c 75 65 22 2c 20 20 20 20 20 20  ullvalue",      
f4d0: 20 20 20 20 20 20 20 22 6f 6e 65 63 6f 6c 75 6d         "onecolum
f4e0: 6e 22 2c 0a 20 20 20 20 22 70 72 65 75 70 64 61  n",.    "preupda
f4f0: 74 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  te",            
f500: 20 20 22 70 72 6f 66 69 6c 65 22 2c 20 20 20 20    "profile",    
f510: 20 20 20 20 20 20 20 20 20 20 20 22 70 72 6f 67             "prog
f520: 72 65 73 73 22 2c 0a 20 20 20 20 22 72 65 6b 65  ress",.    "reke
f530: 79 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  y",             
f540: 20 20 20 20 20 22 72 65 73 74 6f 72 65 22 2c 20       "restore", 
f550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 72                "r
f560: 6f 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 22 2c 0a 20  ollback_hook",. 
f570: 20 20 20 22 73 65 72 69 61 6c 69 7a 65 22 2c 20     "serialize", 
f580: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 73 74               "st
f590: 61 74 75 73 22 2c 20 20 20 20 20 20 20 20 20 20  atus",          
f5a0: 20 20 20 20 20 20 22 74 69 6d 65 6f 75 74 22 2c        "timeout",
f5b0: 0a 20 20 20 20 22 74 6f 74 61 6c 5f 63 68 61 6e  .    "total_chan
f5c0: 67 65 73 22 2c 20 20 20 20 20 20 20 20 20 20 22  ges",          "
f5d0: 74 72 61 63 65 22 2c 20 20 20 20 20 20 20 20 20  trace",         
f5e0: 20 20 20 20 20 20 20 20 22 74 72 61 63 65 5f 76          "trace_v
f5f0: 32 22 2c 0a 20 20 20 20 22 74 72 61 6e 73 61 63  2",.    "transac
f600: 74 69 6f 6e 22 2c 20 20 20 20 20 20 20 20 20 20  tion",          
f610: 20 20 22 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79    "unlock_notify
f620: 22 2c 20 20 20 20 20 20 20 20 20 22 75 70 64 61  ",         "upda
f630: 74 65 5f 68 6f 6f 6b 22 2c 0a 20 20 20 20 22 76  te_hook",.    "v
f640: 65 72 73 69 6f 6e 22 2c 20 20 20 20 20 20 20 20  ersion",        
f650: 20 20 20 20 20 20 20 20 22 77 61 6c 5f 68 6f 6f          "wal_hoo
f660: 6b 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  k",             
f670: 20 30 0a 20 20 7d 3b 0a 20 20 65 6e 75 6d 20 44   0.  };.  enum D
f680: 42 5f 65 6e 75 6d 20 7b 0a 20 20 20 20 44 42 5f  B_enum {.    DB_
f690: 41 55 54 48 4f 52 49 5a 45 52 2c 20 20 20 20 20  AUTHORIZER,     
f6a0: 20 20 20 20 20 20 20 44 42 5f 42 41 43 4b 55 50         DB_BACKUP
f6b0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
f6c0: 44 42 5f 42 49 4e 44 5f 46 41 4c 4c 42 41 43 4b  DB_BIND_FALLBACK
f6d0: 2c 0a 20 20 20 20 44 42 5f 42 55 53 59 2c 20 20  ,.    DB_BUSY,  
f6e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f6f0: 44 42 5f 43 41 43 48 45 2c 20 20 20 20 20 20 20  DB_CACHE,       
f700: 20 20 20 20 20 20 20 20 20 44 42 5f 43 48 41 4e           DB_CHAN
f710: 47 45 53 2c 0a 20 20 20 20 44 42 5f 43 4c 4f 53  GES,.    DB_CLOS
f720: 45 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  E,              
f730: 20 20 20 44 42 5f 43 4f 4c 4c 41 54 45 2c 20 20     DB_COLLATE,  
f740: 20 20 20 20 20 20 20 20 20 20 20 20 44 42 5f 43              DB_C
f750: 4f 4c 4c 41 54 49 4f 4e 5f 4e 45 45 44 45 44 2c  OLLATION_NEEDED,
f760: 0a 20 20 20 20 44 42 5f 43 4f 4d 4d 49 54 5f 48  .    DB_COMMIT_H
f770: 4f 4f 4b 2c 20 20 20 20 20 20 20 20 20 20 20 44  OOK,           D
f780: 42 5f 43 4f 4d 50 4c 45 54 45 2c 20 20 20 20 20  B_COMPLETE,     
f790: 20 20 20 20 20 20 20 20 44 42 5f 43 4f 4e 46 49          DB_CONFI
f7a0: 47 2c 0a 20 20 20 20 44 42 5f 43 4f 50 59 2c 20  G,.    DB_COPY, 
f7b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f7c0: 20 44 42 5f 44 45 53 45 52 49 41 4c 49 5a 45 2c   DB_DESERIALIZE,
f7d0: 20 20 20 20 20 20 20 20 20 20 44 42 5f 45 4e 41            DB_ENA
f7e0: 42 4c 45 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49  BLE_LOAD_EXTENSI
f7f0: 4f 4e 2c 0a 20 20 20 20 44 42 5f 45 52 52 4f 52  ON,.    DB_ERROR
f800: 43 4f 44 45 2c 20 20 20 20 20 20 20 20 20 20 20  CODE,           
f810: 20 20 44 42 5f 45 56 41 4c 2c 20 20 20 20 20 20    DB_EVAL,      
f820: 20 20 20 20 20 20 20 20 20 20 20 44 42 5f 45 58             DB_EX
f830: 49 53 54 53 2c 0a 20 20 20 20 44 42 5f 46 55 4e  ISTS,.    DB_FUN
f840: 43 54 49 4f 4e 2c 20 20 20 20 20 20 20 20 20 20  CTION,          
f850: 20 20 20 20 44 42 5f 49 4e 43 52 42 4c 4f 42 2c      DB_INCRBLOB,
f860: 20 20 20 20 20 20 20 20 20 20 20 20 20 44 42 5f               DB_
f870: 49 4e 54 45 52 52 55 50 54 2c 0a 20 20 20 20 44  INTERRUPT,.    D
f880: 42 5f 4c 41 53 54 5f 49 4e 53 45 52 54 5f 52 4f  B_LAST_INSERT_RO
f890: 57 49 44 2c 20 20 20 20 20 44 42 5f 4e 55 4c 4c  WID,     DB_NULL
f8a0: 56 41 4c 55 45 2c 20 20 20 20 20 20 20 20 20 20  VALUE,          
f8b0: 20 20 44 42 5f 4f 4e 45 43 4f 4c 55 4d 4e 2c 0a    DB_ONECOLUMN,.
f8c0: 20 20 20 20 44 42 5f 50 52 45 55 50 44 41 54 45      DB_PREUPDATE
f8d0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 44 42  ,             DB
f8e0: 5f 50 52 4f 46 49 4c 45 2c 20 20 20 20 20 20 20  _PROFILE,       
f8f0: 20 20 20 20 20 20 20 44 42 5f 50 52 4f 47 52 45         DB_PROGRE
f900: 53 53 2c 0a 20 20 20 20 44 42 5f 52 45 4b 45 59  SS,.    DB_REKEY
f910: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
f920: 20 20 44 42 5f 52 45 53 54 4f 52 45 2c 20 20 20    DB_RESTORE,   
f930: 20 20 20 20 20 20 20 20 20 20 20 44 42 5f 52 4f             DB_RO
f940: 4c 4c 42 41 43 4b 5f 48 4f 4f 4b 2c 0a 20 20 20  LLBACK_HOOK,.   
f950: 20 44 42 5f 53 45 52 49 41 4c 49 5a 45 2c 20 20   DB_SERIALIZE,  
f960: 20 20 20 20 20 20 20 20 20 20 20 44 42 5f 53 54             DB_ST
f970: 41 54 55 53 2c 20 20 20 20 20 20 20 20 20 20 20  ATUS,           
f980: 20 20 20 20 44 42 5f 54 49 4d 45 4f 55 54 2c 0a      DB_TIMEOUT,.
f990: 20 20 20 20 44 42 5f 54 4f 54 41 4c 5f 43 48 41      DB_TOTAL_CHA
f9a0: 4e 47 45 53 2c 20 20 20 20 20 20 20 20 20 44 42  NGES,         DB
f9b0: 5f 54 52 41 43 45 2c 20 20 20 20 20 20 20 20 20  _TRACE,         
f9c0: 20 20 20 20 20 20 20 44 42 5f 54 52 41 43 45 5f         DB_TRACE_
f9d0: 56 32 2c 0a 20 20 20 20 44 42 5f 54 52 41 4e 53  V2,.    DB_TRANS
f9e0: 41 43 54 49 4f 4e 2c 20 20 20 20 20 20 20 20 20  ACTION,         
f9f0: 20 20 44 42 5f 55 4e 4c 4f 43 4b 5f 4e 4f 54 49    DB_UNLOCK_NOTI
fa00: 46 59 2c 20 20 20 20 20 20 20 20 44 42 5f 55 50  FY,        DB_UP
fa10: 44 41 54 45 5f 48 4f 4f 4b 2c 0a 20 20 20 20 44  DATE_HOOK,.    D
fa20: 42 5f 56 45 52 53 49 4f 4e 2c 20 20 20 20 20 20  B_VERSION,      
fa30: 20 20 20 20 20 20 20 20 20 44 42 5f 57 41 4c 5f           DB_WAL_
fa40: 48 4f 4f 4b 20 20 20 20 20 20 20 20 20 20 20 20  HOOK            
fa50: 20 0a 20 20 7d 3b 0a 20 20 2f 2a 20 64 6f 6e 27   .  };.  /* don'
fa60: 74 20 6c 65 61 76 65 20 74 72 61 69 6c 69 6e 67  t leave trailing
fa70: 20 63 6f 6d 6d 61 73 20 6f 6e 20 44 42 5f 65 6e   commas on DB_en
fa80: 75 6d 2c 20 69 74 20 63 6f 6e 66 75 73 65 73 20  um, it confuses 
fa90: 74 68 65 20 41 49 58 20 78 6c 63 20 63 6f 6d 70  the AIX xlc comp
faa0: 69 6c 65 72 20 2a 2f 0a 0a 20 20 69 66 28 20 6f  iler */..  if( o
fab0: 62 6a 63 3c 32 20 29 7b 0a 20 20 20 20 54 63 6c  bjc<2 ){.    Tcl
fac0: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
fad0: 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
fae0: 53 55 42 43 4f 4d 4d 41 4e 44 20 2e 2e 2e 22 29  SUBCOMMAND ...")
faf0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
fb00: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
fb10: 28 20 54 63 6c 5f 47 65 74 49 6e 64 65 78 46 72  ( Tcl_GetIndexFr
fb20: 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
fb30: 6a 76 5b 31 5d 2c 20 44 42 5f 73 74 72 73 2c 20  jv[1], DB_strs, 
fb40: 22 6f 70 74 69 6f 6e 22 2c 20 30 2c 20 26 63 68  "option", 0, &ch
fb50: 6f 69 63 65 29 20 29 7b 0a 20 20 20 20 72 65 74  oice) ){.    ret
fb60: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
fb70: 20 7d 0a 0a 20 20 73 77 69 74 63 68 28 20 28 65   }..  switch( (e
fb80: 6e 75 6d 20 44 42 5f 65 6e 75 6d 29 63 68 6f 69  num DB_enum)choi
fb90: 63 65 20 29 7b 0a 0a 20 20 2f 2a 20 20 20 20 24  ce ){..  /*    $
fba0: 64 62 20 61 75 74 68 6f 72 69 7a 65 72 20 3f 43  db authorizer ?C
fbb0: 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a 0a 20 20  ALLBACK?.  **.  
fbc0: 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 67 69  ** Invoke the gi
fbd0: 76 65 6e 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20  ven callback to 
fbe0: 61 75 74 68 6f 72 69 7a 65 20 65 61 63 68 20 53  authorize each S
fbf0: 51 4c 20 6f 70 65 72 61 74 69 6f 6e 20 61 73 20  QL operation as 
fc00: 69 74 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 70 69  it is.  ** compi
fc10: 6c 65 64 2e 20 20 35 20 61 72 67 75 6d 65 6e 74  led.  5 argument
fc20: 73 20 61 72 65 20 61 70 70 65 6e 64 65 64 20 74  s are appended t
fc30: 6f 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 62  o the callback b
fc40: 65 66 6f 72 65 20 69 74 20 69 73 0a 20 20 2a 2a  efore it is.  **
fc50: 20 69 6e 76 6f 6b 65 64 3a 0a 20 20 2a 2a 0a 20   invoked:.  **. 
fc60: 20 2a 2a 20 20 20 28 31 29 20 54 68 65 20 61 75   **   (1) The au
fc70: 74 68 6f 72 69 7a 61 74 69 6f 6e 20 74 79 70 65  thorization type
fc80: 20 28 65 78 3a 20 53 51 4c 49 54 45 5f 43 52 45   (ex: SQLITE_CRE
fc90: 41 54 45 5f 54 41 42 4c 45 2c 20 53 51 4c 49 54  ATE_TABLE, SQLIT
fca0: 45 5f 49 4e 53 45 52 54 2c 20 2e 2e 2e 29 0a 20  E_INSERT, ...). 
fcb0: 20 2a 2a 20 20 20 28 32 29 20 46 69 72 73 74 20   **   (2) First 
fcc0: 64 65 73 63 72 69 70 74 69 76 65 20 6e 61 6d 65  descriptive name
fcd0: 20 28 64 65 70 65 6e 64 73 20 6f 6e 20 61 75 74   (depends on aut
fce0: 68 6f 72 69 7a 61 74 69 6f 6e 20 74 79 70 65 29  horization type)
fcf0: 0a 20 20 2a 2a 20 20 20 28 33 29 20 53 65 63 6f  .  **   (3) Seco
fd00: 6e 64 20 64 65 73 63 72 69 70 74 69 76 65 20 6e  nd descriptive n
fd10: 61 6d 65 0a 20 20 2a 2a 20 20 20 28 34 29 20 4e  ame.  **   (4) N
fd20: 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
fd30: 61 73 65 20 28 65 78 3a 20 22 6d 61 69 6e 22 2c  ase (ex: "main",
fd40: 20 22 74 65 6d 70 22 29 0a 20 20 2a 2a 20 20 20   "temp").  **   
fd50: 28 35 29 20 4e 61 6d 65 20 6f 66 20 74 72 69 67  (5) Name of trig
fd60: 67 65 72 20 74 68 61 74 20 69 73 20 64 6f 69 6e  ger that is doin
fd70: 67 20 74 68 65 20 61 63 63 65 73 73 0a 20 20 2a  g the access.  *
fd80: 2a 0a 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c 62  *.  ** The callb
fd90: 61 63 6b 20 73 68 6f 75 6c 64 20 72 65 74 75 72  ack should retur
fda0: 6e 20 6f 6e 20 6f 66 20 74 68 65 20 66 6f 6c 6c  n on of the foll
fdb0: 6f 77 69 6e 67 20 73 74 72 69 6e 67 73 3a 20 53  owing strings: S
fdc0: 51 4c 49 54 45 5f 4f 4b 2c 0a 20 20 2a 2a 20 53  QLITE_OK,.  ** S
fdd0: 51 4c 49 54 45 5f 49 47 4e 4f 52 45 2c 20 6f 72  QLITE_IGNORE, or
fde0: 20 53 51 4c 49 54 45 5f 44 45 4e 59 2e 20 20 41   SQLITE_DENY.  A
fdf0: 6e 79 20 6f 74 68 65 72 20 72 65 74 75 72 6e 20  ny other return 
fe00: 76 61 6c 75 65 20 69 73 20 61 6e 20 65 72 72 6f  value is an erro
fe10: 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  r..  **.  ** If 
fe20: 74 68 69 73 20 6d 65 74 68 6f 64 20 69 73 20 69  this method is i
fe30: 6e 76 6f 6b 65 64 20 77 69 74 68 20 6e 6f 20 61  nvoked with no a
fe40: 72 67 75 6d 65 6e 74 73 2c 20 74 68 65 20 63 75  rguments, the cu
fe50: 72 72 65 6e 74 20 61 75 74 68 6f 72 69 7a 61 74  rrent authorizat
fe60: 69 6f 6e 0a 20 20 2a 2a 20 63 61 6c 6c 62 61 63  ion.  ** callbac
fe70: 6b 20 73 74 72 69 6e 67 20 69 73 20 72 65 74 75  k string is retu
fe80: 72 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 63 61 73  rned..  */.  cas
fe90: 65 20 44 42 5f 41 55 54 48 4f 52 49 5a 45 52 3a  e DB_AUTHORIZER:
fea0: 20 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   {.#ifdef SQLITE
feb0: 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54  _OMIT_AUTHORIZAT
fec0: 49 4f 4e 0a 20 20 20 20 54 63 6c 5f 41 70 70 65  ION.    Tcl_Appe
fed0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
fee0: 20 22 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20   "authorization 
fef0: 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 69 6e  not available in
ff00: 20 74 68 69 73 20 62 75 69 6c 64 22 2c 0a 20 20   this build",.  
ff10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ff20: 20 20 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20     (char*)0);.  
ff30: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
ff40: 4f 52 3b 0a 23 65 6c 73 65 0a 20 20 20 20 69 66  OR;.#else.    if
ff50: 28 20 6f 62 6a 63 3e 33 20 29 7b 0a 20 20 20 20  ( objc>3 ){.    
ff60: 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
ff70: 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62  gs(interp, 2, ob
ff80: 6a 76 2c 20 22 3f 43 41 4c 4c 42 41 43 4b 3f 22  jv, "?CALLBACK?"
ff90: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
ffa0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
ffb0: 65 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d 32  else if( objc==2
ffc0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 44   ){.      if( pD
ffd0: 62 2d 3e 7a 41 75 74 68 20 29 7b 0a 20 20 20 20  b->zAuth ){.    
ffe0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
fff0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 44 62  sult(interp, pDb
10000 2d 3e 7a 41 75 74 68 2c 20 28 63 68 61 72 2a 29  ->zAuth, (char*)
10010 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
10020 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61  }else{.      cha
10030 72 20 2a 7a 41 75 74 68 3b 0a 20 20 20 20 20 20  r *zAuth;.      
10040 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20 69  int len;.      i
10050 66 28 20 70 44 62 2d 3e 7a 41 75 74 68 20 29 7b  f( pDb->zAuth ){
10060 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 46 72 65  .        Tcl_Fre
10070 65 28 70 44 62 2d 3e 7a 41 75 74 68 29 3b 0a 20  e(pDb->zAuth);. 
10080 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 41 75       }.      zAu
10090 74 68 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  th = Tcl_GetStri
100a0 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32  ngFromObj(objv[2
100b0 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20  ], &len);.      
100c0 69 66 28 20 7a 41 75 74 68 20 26 26 20 6c 65 6e  if( zAuth && len
100d0 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44  >0 ){.        pD
100e0 62 2d 3e 7a 41 75 74 68 20 3d 20 54 63 6c 5f 41  b->zAuth = Tcl_A
100f0 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20 31 20 29 3b  lloc( len + 1 );
10100 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
10110 70 44 62 2d 3e 7a 41 75 74 68 2c 20 7a 41 75 74  pDb->zAuth, zAut
10120 68 2c 20 6c 65 6e 2b 31 29 3b 0a 20 20 20 20 20  h, len+1);.     
10130 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
10140 70 44 62 2d 3e 7a 41 75 74 68 20 3d 20 30 3b 0a  pDb->zAuth = 0;.
10150 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
10160 28 20 70 44 62 2d 3e 7a 41 75 74 68 20 29 7b 0a  ( pDb->zAuth ){.
10170 20 20 20 20 20 20 20 20 74 79 70 65 64 65 66 20          typedef 
10180 69 6e 74 20 28 2a 73 71 6c 69 74 65 33 5f 61 75  int (*sqlite3_au
10190 74 68 5f 63 62 29 28 0a 20 20 20 20 20 20 20 20  th_cb)(.        
101a0 20 20 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e     void*,int,con
101b0 73 74 20 63 68 61 72 2a 2c 63 6f 6e 73 74 20 63  st char*,const c
101c0 68 61 72 2a 2c 0a 20 20 20 20 20 20 20 20 20 20  har*,.          
101d0 20 63 6f 6e 73 74 20 63 68 61 72 2a 2c 63 6f 6e   const char*,con
101e0 73 74 20 63 68 61 72 2a 29 3b 0a 20 20 20 20 20  st char*);.     
101f0 20 20 20 70 44 62 2d 3e 69 6e 74 65 72 70 20 3d     pDb->interp =
10200 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 20 20 20   interp;.       
10210 20 73 71 6c 69 74 65 33 5f 73 65 74 5f 61 75 74   sqlite3_set_aut
10220 68 6f 72 69 7a 65 72 28 70 44 62 2d 3e 64 62 2c  horizer(pDb->db,
10230 28 73 71 6c 69 74 65 33 5f 61 75 74 68 5f 63 62  (sqlite3_auth_cb
10240 29 61 75 74 68 5f 63 61 6c 6c 62 61 63 6b 2c 70  )auth_callback,p
10250 44 62 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  Db);.      }else
10260 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
10270 33 5f 73 65 74 5f 61 75 74 68 6f 72 69 7a 65 72  3_set_authorizer
10280 28 70 44 62 2d 3e 64 62 2c 20 30 2c 20 30 29 3b  (pDb->db, 0, 0);
10290 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
102a0 65 6e 64 69 66 0a 20 20 20 20 62 72 65 61 6b 3b  endif.    break;
102b0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64  .  }..  /*    $d
102c0 62 20 62 61 63 6b 75 70 20 3f 44 41 54 41 42 41  b backup ?DATABA
102d0 53 45 3f 20 46 49 4c 45 4e 41 4d 45 0a 20 20 2a  SE? FILENAME.  *
102e0 2a 0a 20 20 2a 2a 20 4f 70 65 6e 20 6f 72 20 63  *.  ** Open or c
102f0 72 65 61 74 65 20 61 20 64 61 74 61 62 61 73 65  reate a database
10300 20 66 69 6c 65 20 6e 61 6d 65 64 20 46 49 4c 45   file named FILE
10310 4e 41 4d 45 2e 20 20 54 72 61 6e 73 66 65 72 20  NAME.  Transfer 
10320 74 68 65 0a 20 20 2a 2a 20 63 6f 6e 74 65 6e 74  the.  ** content
10330 20 6f 66 20 6c 6f 63 61 6c 20 64 61 74 61 62 61   of local databa
10340 73 65 20 44 41 54 41 42 41 53 45 20 28 64 65 66  se DATABASE (def
10350 61 75 6c 74 3a 20 22 6d 61 69 6e 22 29 20 69 6e  ault: "main") in
10360 74 6f 20 74 68 65 0a 20 20 2a 2a 20 46 49 4c 45  to the.  ** FILE
10370 4e 41 4d 45 20 64 61 74 61 62 61 73 65 2e 0a 20  NAME database.. 
10380 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 42 41   */.  case DB_BA
10390 43 4b 55 50 3a 20 7b 0a 20 20 20 20 63 6f 6e 73  CKUP: {.    cons
103a0 74 20 63 68 61 72 20 2a 7a 44 65 73 74 46 69 6c  t char *zDestFil
103b0 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  e;.    const cha
103c0 72 20 2a 7a 53 72 63 44 62 3b 0a 20 20 20 20 73  r *zSrcDb;.    s
103d0 71 6c 69 74 65 33 20 2a 70 44 65 73 74 3b 0a 20  qlite3 *pDest;. 
103e0 20 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75     sqlite3_backu
103f0 70 20 2a 70 42 61 63 6b 75 70 3b 0a 0a 20 20 20  p *pBackup;..   
10400 20 69 66 28 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a   if( objc==3 ){.
10410 20 20 20 20 20 20 7a 53 72 63 44 62 20 3d 20 22        zSrcDb = "
10420 6d 61 69 6e 22 3b 0a 20 20 20 20 20 20 7a 44 65  main";.      zDe
10430 73 74 46 69 6c 65 20 3d 20 54 63 6c 5f 47 65 74  stFile = Tcl_Get
10440 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b  String(objv[2]);
10450 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f  .    }else if( o
10460 62 6a 63 3d 3d 34 20 29 7b 0a 20 20 20 20 20 20  bjc==4 ){.      
10470 7a 53 72 63 44 62 20 3d 20 54 63 6c 5f 47 65 74  zSrcDb = Tcl_Get
10480 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b  String(objv[2]);
10490 0a 20 20 20 20 20 20 7a 44 65 73 74 46 69 6c 65  .      zDestFile
104a0 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
104b0 28 6f 62 6a 76 5b 33 5d 29 3b 0a 20 20 20 20 7d  (objv[3]);.    }
104c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 54 63 6c 5f  else{.      Tcl_
104d0 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
104e0 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f  erp, 2, objv, "?
104f0 44 41 54 41 42 41 53 45 3f 20 46 49 4c 45 4e 41  DATABASE? FILENA
10500 4d 45 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ME");.      retu
10510 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
10520 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c    }.    rc = sql
10530 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 7a 44 65  ite3_open_v2(zDe
10540 73 74 46 69 6c 65 2c 20 26 70 44 65 73 74 2c 0a  stFile, &pDest,.
10550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
10560 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
10570 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50  RITE | SQLITE_OP
10580 45 4e 5f 43 52 45 41 54 45 7c 20 70 44 62 2d 3e  EN_CREATE| pDb->
10590 6f 70 65 6e 46 6c 61 67 73 2c 20 30 29 3b 0a 20  openFlags, 0);. 
105a0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
105b0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 54 63  E_OK ){.      Tc
105c0 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
105d0 6e 74 65 72 70 2c 20 22 63 61 6e 6e 6f 74 20 6f  nterp, "cannot o
105e0 70 65 6e 20 74 61 72 67 65 74 20 64 61 74 61 62  pen target datab
105f0 61 73 65 3a 20 22 2c 0a 20 20 20 20 20 20 20 20  ase: ",.        
10600 20 20 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73     sqlite3_errms
10610 67 28 70 44 65 73 74 29 2c 20 28 63 68 61 72 2a  g(pDest), (char*
10620 29 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  )0);.      sqlit
10630 65 33 5f 63 6c 6f 73 65 28 70 44 65 73 74 29 3b  e3_close(pDest);
10640 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
10650 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
10660 20 20 20 70 42 61 63 6b 75 70 20 3d 20 73 71 6c     pBackup = sql
10670 69 74 65 33 5f 62 61 63 6b 75 70 5f 69 6e 69 74  ite3_backup_init
10680 28 70 44 65 73 74 2c 20 22 6d 61 69 6e 22 2c 20  (pDest, "main", 
10690 70 44 62 2d 3e 64 62 2c 20 7a 53 72 63 44 62 29  pDb->db, zSrcDb)
106a0 3b 0a 20 20 20 20 69 66 28 20 70 42 61 63 6b 75  ;.    if( pBacku
106b0 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 54 63  p==0 ){.      Tc
106c0 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
106d0 6e 74 65 72 70 2c 20 22 62 61 63 6b 75 70 20 66  nterp, "backup f
106e0 61 69 6c 65 64 3a 20 22 2c 0a 20 20 20 20 20 20  ailed: ",.      
106f0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65 72 72       sqlite3_err
10700 6d 73 67 28 70 44 65 73 74 29 2c 20 28 63 68 61  msg(pDest), (cha
10710 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  r*)0);.      sql
10720 69 74 65 33 5f 63 6c 6f 73 65 28 70 44 65 73 74  ite3_close(pDest
10730 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
10740 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
10750 0a 20 20 20 20 77 68 69 6c 65 28 20 20 28 72 63  .    while(  (rc
10760 20 3d 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75   = sqlite3_backu
10770 70 5f 73 74 65 70 28 70 42 61 63 6b 75 70 2c 31  p_step(pBackup,1
10780 30 30 29 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  00))==SQLITE_OK 
10790 29 7b 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  ){}.    sqlite3_
107a0 62 61 63 6b 75 70 5f 66 69 6e 69 73 68 28 70 42  backup_finish(pB
107b0 61 63 6b 75 70 29 3b 0a 20 20 20 20 69 66 28 20  ackup);.    if( 
107c0 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc==SQLITE_DONE 
107d0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 54 43  ){.      rc = TC
107e0 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  L_OK;.    }else{
107f0 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  .      Tcl_Appen
10800 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
10810 22 62 61 63 6b 75 70 20 66 61 69 6c 65 64 3a 20  "backup failed: 
10820 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 73 71  ",.           sq
10830 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44 65  lite3_errmsg(pDe
10840 73 74 29 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  st), (char*)0);.
10850 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45        rc = TCL_E
10860 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
10870 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70 44  sqlite3_close(pD
10880 65 73 74 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b  est);.    break;
10890 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64  .  }..  /*    $d
108a0 62 20 62 69 6e 64 5f 66 61 6c 6c 62 61 63 6b 20  b bind_fallback 
108b0 3f 43 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a 0a  ?CALLBACK?.  **.
108c0 20 20 2a 2a 20 57 68 65 6e 20 72 65 73 6f 6c 76    ** When resolv
108d0 69 6e 67 20 62 69 6e 64 20 70 61 72 61 6d 65 74  ing bind paramet
108e0 65 72 73 20 69 6e 20 61 6e 20 53 51 4c 20 73 74  ers in an SQL st
108f0 61 74 65 6d 65 6e 74 2c 20 69 66 20 74 68 65 20  atement, if the 
10900 70 61 72 61 6d 65 74 65 72 0a 20 20 2a 2a 20 63  parameter.  ** c
10910 61 6e 6e 6f 74 20 62 65 20 61 73 73 6f 63 69 61  annot be associa
10920 74 65 64 20 77 69 74 68 20 61 20 54 43 4c 20 76  ted with a TCL v
10930 61 72 69 61 62 6c 65 20 74 68 65 6e 20 69 6e 76  ariable then inv
10940 6f 6b 65 20 43 41 4c 4c 42 41 43 4b 20 77 69 74  oke CALLBACK wit
10950 68 20 61 0a 20 20 2a 2a 20 73 69 6e 67 6c 65 20  h a.  ** single 
10960 61 72 67 75 6d 65 6e 74 20 74 68 61 74 20 69 73  argument that is
10970 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
10980 20 70 61 72 61 6d 65 74 65 72 20 61 6e 64 20 75   parameter and u
10990 73 65 20 74 68 65 20 72 65 74 75 72 6e 0a 20 20  se the return.  
109a0 2a 2a 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  ** value of the 
109b0 43 41 4c 4c 42 41 43 4b 20 61 73 20 74 68 65 20  CALLBACK as the 
109c0 62 69 6e 64 69 6e 67 2e 20 20 49 66 20 43 41 4c  binding.  If CAL
109d0 4c 42 41 43 4b 20 72 65 74 75 72 6e 73 20 73 6f  LBACK returns so
109e0 6d 65 74 68 69 6e 67 0a 20 20 2a 2a 20 6f 74 68  mething.  ** oth
109f0 65 72 20 74 68 61 6e 20 54 43 4c 5f 4f 4b 20 6f  er than TCL_OK o
10a00 72 20 54 43 4c 5f 45 52 52 4f 52 20 74 68 65 6e  r TCL_ERROR then
10a10 20 62 69 6e 64 20 61 20 4e 55 4c 4c 2e 0a 20 20   bind a NULL..  
10a20 2a 2a 0a 20 20 2a 2a 20 49 66 20 43 41 4c 4c 42  **.  ** If CALLB
10a30 41 43 4b 20 69 73 20 61 6e 20 65 6d 70 74 79 20  ACK is an empty 
10a40 73 74 72 69 6e 67 2c 20 74 68 65 6e 20 72 65 76  string, then rev
10a50 65 72 74 20 74 6f 20 74 68 65 20 64 65 66 61 75  ert to the defau
10a60 6c 74 20 62 65 68 61 76 69 6f 72 20 0a 20 20 2a  lt behavior .  *
10a70 2a 20 77 68 69 63 68 20 69 73 20 74 6f 20 73 65  * which is to se
10a80 74 20 74 68 65 20 62 69 6e 64 69 6e 67 20 74 6f  t the binding to
10a90 20 4e 55 4c 4c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a   NULL..  **.  **
10aa0 20 49 66 20 43 41 4c 4c 42 41 43 4b 20 72 65 74   If CALLBACK ret
10ab0 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 2c 20 74  urns an error, t
10ac0 68 61 74 20 63 61 75 73 65 73 20 74 68 65 20 73  hat causes the s
10ad0 74 61 74 65 6d 65 6e 74 20 65 78 65 63 75 74 69  tatement executi
10ae0 6f 6e 20 74 6f 0a 20 20 2a 2a 20 61 62 6f 72 74  on to.  ** abort
10af0 2e 20 20 48 65 6e 63 65 2c 20 74 6f 20 63 6f 6e  .  Hence, to con
10b00 66 69 67 75 72 65 20 61 20 63 6f 6e 6e 65 63 74  figure a connect
10b10 69 6f 6e 20 73 6f 20 74 68 61 74 20 69 74 20 74  ion so that it t
10b20 68 72 6f 77 73 20 61 6e 20 65 72 72 6f 72 0a 20  hrows an error. 
10b30 20 2a 2a 20 6f 6e 20 61 6e 20 61 74 74 65 6d 70   ** on an attemp
10b40 74 20 74 6f 20 62 69 6e 64 20 61 6e 20 75 6e 6b  t to bind an unk
10b50 6e 6f 77 6e 20 76 61 72 69 61 62 6c 65 2c 20 64  nown variable, d
10b60 6f 20 73 6f 6d 65 74 68 69 6e 67 20 6c 69 6b 65  o something like
10b70 20 74 68 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a   this:.  **.  **
10b80 20 20 20 20 20 70 72 6f 63 20 62 69 6e 64 5f 65       proc bind_e
10b90 72 72 6f 72 20 7b 6e 61 6d 65 7d 20 7b 65 72 72  rror {name} {err
10ba0 6f 72 20 22 6e 6f 20 73 75 63 68 20 76 61 72 69  or "no such vari
10bb0 61 62 6c 65 3a 20 24 6e 61 6d 65 22 7d 0a 20 20  able: $name"}.  
10bc0 2a 2a 20 20 20 20 20 64 62 20 62 69 6e 64 5f 66  **     db bind_f
10bd0 61 6c 6c 62 61 63 6b 20 62 69 6e 64 5f 65 72 72  allback bind_err
10be0 6f 72 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  or.  */.  case D
10bf0 42 5f 42 49 4e 44 5f 46 41 4c 4c 42 41 43 4b 3a  B_BIND_FALLBACK:
10c00 20 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3e   {.    if( objc>
10c10 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57  3 ){.      Tcl_W
10c20 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
10c30 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 43  rp, 2, objv, "?C
10c40 41 4c 4c 42 41 43 4b 3f 22 29 3b 0a 20 20 20 20  ALLBACK?");.    
10c50 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
10c60 4f 52 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  OR;.    }else if
10c70 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20  ( objc==2 ){.   
10c80 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 42 69 6e     if( pDb->zBin
10c90 64 46 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20  dFallback ){.   
10ca0 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
10cb0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 44  esult(interp, pD
10cc0 62 2d 3e 7a 42 69 6e 64 46 61 6c 6c 62 61 63 6b  b->zBindFallback
10cd0 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20  , (char*)0);.   
10ce0 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
10cf0 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43 61 6c        char *zCal
10d00 6c 62 61 63 6b 3b 0a 20 20 20 20 20 20 69 6e 74  lback;.      int
10d10 20 6c 65 6e 3b 0a 20 20 20 20 20 20 69 66 28 20   len;.      if( 
10d20 70 44 62 2d 3e 7a 42 69 6e 64 46 61 6c 6c 62 61  pDb->zBindFallba
10d30 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63  ck ){.        Tc
10d40 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 42 69 6e  l_Free(pDb->zBin
10d50 64 46 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20  dFallback);.    
10d60 20 20 7d 0a 20 20 20 20 20 20 7a 43 61 6c 6c 62    }.      zCallb
10d70 61 63 6b 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  ack = Tcl_GetStr
10d80 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
10d90 32 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20  2], &len);.     
10da0 20 69 66 28 20 7a 43 61 6c 6c 62 61 63 6b 20 26   if( zCallback &
10db0 26 20 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20  & len>0 ){.     
10dc0 20 20 20 70 44 62 2d 3e 7a 42 69 6e 64 46 61 6c     pDb->zBindFal
10dd0 6c 62 61 63 6b 20 3d 20 54 63 6c 5f 41 6c 6c 6f  lback = Tcl_Allo
10de0 63 28 20 6c 65 6e 20 2b 20 31 20 29 3b 0a 20 20  c( len + 1 );.  
10df0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 44 62        memcpy(pDb
10e00 2d 3e 7a 42 69 6e 64 46 61 6c 6c 62 61 63 6b 2c  ->zBindFallback,
10e10 20 7a 43 61 6c 6c 62 61 63 6b 2c 20 6c 65 6e 2b   zCallback, len+
10e20 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  1);.      }else{
10e30 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 42  .        pDb->zB
10e40 69 6e 64 46 61 6c 6c 62 61 63 6b 20 3d 20 30 3b  indFallback = 0;
10e50 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
10e60 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
10e70 20 2f 2a 20 20 20 20 24 64 62 20 62 75 73 79 20   /*    $db busy 
10e80 3f 43 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a 0a  ?CALLBACK?.  **.
10e90 20 20 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20    ** Invoke the 
10ea0 67 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b 20 69  given callback i
10eb0 66 20 61 6e 20 53 51 4c 20 73 74 61 74 65 6d 65  f an SQL stateme
10ec0 6e 74 20 61 74 74 65 6d 70 74 73 20 74 6f 20 6f  nt attempts to o
10ed0 70 65 6e 0a 20 20 2a 2a 20 61 20 6c 6f 63 6b 65  pen.  ** a locke
10ee0 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  d database file.
10ef0 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f  .  */.  case DB_
10f00 42 55 53 59 3a 20 7b 0a 20 20 20 20 69 66 28 20  BUSY: {.    if( 
10f10 6f 62 6a 63 3e 33 20 29 7b 0a 20 20 20 20 20 20  objc>3 ){.      
10f20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
10f30 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76  (interp, 2, objv
10f40 2c 20 22 43 41 4c 4c 42 41 43 4b 22 29 3b 0a 20  , "CALLBACK");. 
10f50 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
10f60 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73 65  ERROR;.    }else
10f70 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a   if( objc==2 ){.
10f80 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a        if( pDb->z
10f90 42 75 73 79 20 29 7b 0a 20 20 20 20 20 20 20 20  Busy ){.        
10fa0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
10fb0 28 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a 42  (interp, pDb->zB
10fc0 75 73 79 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  usy, (char*)0);.
10fd0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
10fe0 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  e{.      char *z
10ff0 42 75 73 79 3b 0a 20 20 20 20 20 20 69 6e 74 20  Busy;.      int 
11000 6c 65 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 70  len;.      if( p
11010 44 62 2d 3e 7a 42 75 73 79 20 29 7b 0a 20 20 20  Db->zBusy ){.   
11020 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44       Tcl_Free(pD
11030 62 2d 3e 7a 42 75 73 79 29 3b 0a 20 20 20 20 20  b->zBusy);.     
11040 20 7d 0a 20 20 20 20 20 20 7a 42 75 73 79 20 3d   }.      zBusy =
11050 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
11060 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26  omObj(objv[2], &
11070 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20  len);.      if( 
11080 7a 42 75 73 79 20 26 26 20 6c 65 6e 3e 30 20 29  zBusy && len>0 )
11090 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a  {.        pDb->z
110a0 42 75 73 79 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63  Busy = Tcl_Alloc
110b0 28 20 6c 65 6e 20 2b 20 31 20 29 3b 0a 20 20 20  ( len + 1 );.   
110c0 20 20 20 20 20 6d 65 6d 63 70 79 28 70 44 62 2d       memcpy(pDb-
110d0 3e 7a 42 75 73 79 2c 20 7a 42 75 73 79 2c 20 6c  >zBusy, zBusy, l
110e0 65 6e 2b 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c  en+1);.      }el
110f0 73 65 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d  se{.        pDb-
11100 3e 7a 42 75 73 79 20 3d 20 30 3b 0a 20 20 20 20  >zBusy = 0;.    
11110 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 44    }.      if( pD
11120 62 2d 3e 7a 42 75 73 79 20 29 7b 0a 20 20 20 20  b->zBusy ){.    
11130 20 20 20 20 70 44 62 2d 3e 69 6e 74 65 72 70 20      pDb->interp 
11140 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 20 20  = interp;.      
11150 20 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 68    sqlite3_busy_h
11160 61 6e 64 6c 65 72 28 70 44 62 2d 3e 64 62 2c 20  andler(pDb->db, 
11170 44 62 42 75 73 79 48 61 6e 64 6c 65 72 2c 20 70  DbBusyHandler, p
11180 44 62 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  Db);.      }else
11190 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
111a0 33 5f 62 75 73 79 5f 68 61 6e 64 6c 65 72 28 70  3_busy_handler(p
111b0 44 62 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20  Db->db, 0, 0);. 
111c0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
111d0 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
111e0 2a 20 20 20 20 20 24 64 62 20 63 61 63 68 65 20  *     $db cache 
111f0 66 6c 75 73 68 0a 20 20 2a 2a 20 20 20 20 20 24  flush.  **     $
11200 64 62 20 63 61 63 68 65 20 73 69 7a 65 20 6e 0a  db cache size n.
11210 20 20 2a 2a 0a 20 20 2a 2a 20 46 6c 75 73 68 20    **.  ** Flush 
11220 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61  the prepared sta
11230 74 65 6d 65 6e 74 20 63 61 63 68 65 2c 20 6f 72  tement cache, or
11240 20 73 65 74 20 74 68 65 20 6d 61 78 69 6d 75 6d   set the maximum
11250 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 2a 2a 20   number of.  ** 
11260 63 61 63 68 65 64 20 73 74 61 74 65 6d 65 6e 74  cached statement
11270 73 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  s..  */.  case D
11280 42 5f 43 41 43 48 45 3a 20 7b 0a 20 20 20 20 63  B_CACHE: {.    c
11290 68 61 72 20 2a 73 75 62 43 6d 64 3b 0a 20 20 20  har *subCmd;.   
112a0 20 69 6e 74 20 6e 3b 0a 0a 20 20 20 20 69 66 28   int n;..    if(
112b0 20 6f 62 6a 63 3c 3d 32 20 29 7b 0a 20 20 20 20   objc<=2 ){.    
112c0 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
112d0 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
112e0 6a 76 2c 20 22 63 61 63 68 65 20 6f 70 74 69 6f  jv, "cache optio
112f0 6e 20 3f 61 72 67 3f 22 29 3b 0a 20 20 20 20 20  n ?arg?");.     
11300 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
11310 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 75 62  R;.    }.    sub
11320 43 6d 64 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  Cmd = Tcl_GetStr
11330 69 6e 67 46 72 6f 6d 4f 62 6a 28 20 6f 62 6a 76  ingFromObj( objv
11340 5b 32 5d 2c 20 30 20 29 3b 0a 20 20 20 20 69 66  [2], 0 );.    if
11350 28 20 2a 73 75 62 43 6d 64 3d 3d 27 66 27 20 26  ( *subCmd=='f' &
11360 26 20 73 74 72 63 6d 70 28 73 75 62 43 6d 64 2c  & strcmp(subCmd,
11370 22 66 6c 75 73 68 22 29 3d 3d 30 20 29 7b 0a 20  "flush")==0 ){. 
11380 20 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 33       if( objc!=3
11390 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f   ){.        Tcl_
113a0 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
113b0 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 66  erp, 2, objv, "f
113c0 6c 75 73 68 22 29 3b 0a 20 20 20 20 20 20 20 20  lush");.        
113d0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
113e0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
113f0 20 20 20 20 20 20 20 66 6c 75 73 68 53 74 6d 74         flushStmt
11400 43 61 63 68 65 28 20 70 44 62 20 29 3b 0a 20 20  Cache( pDb );.  
11410 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
11420 69 66 28 20 2a 73 75 62 43 6d 64 3d 3d 27 73 27  if( *subCmd=='s'
11430 20 26 26 20 73 74 72 63 6d 70 28 73 75 62 43 6d   && strcmp(subCm
11440 64 2c 22 73 69 7a 65 22 29 3d 3d 30 20 29 7b 0a  d,"size")==0 ){.
11450 20 20 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d        if( objc!=
11460 34 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c  4 ){.        Tcl
11470 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
11480 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22  terp, 2, objv, "
11490 73 69 7a 65 20 6e 22 29 3b 0a 20 20 20 20 20 20  size n");.      
114a0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
114b0 4f 52 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  OR;.      }else{
114c0 0a 20 20 20 20 20 20 20 20 69 66 28 20 54 43 4c  .        if( TCL
114d0 5f 45 52 52 4f 52 3d 3d 54 63 6c 5f 47 65 74 49  _ERROR==Tcl_GetI
114e0 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
114f0 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 6e 29 20 29  , objv[3], &n) )
11500 7b 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f  {.          Tcl_
11510 41 70 70 65 6e 64 52 65 73 75 6c 74 28 20 69 6e  AppendResult( in
11520 74 65 72 70 2c 20 22 63 61 6e 6e 6f 74 20 63 6f  terp, "cannot co
11530 6e 76 65 72 74 20 5c 22 22 2c 0a 20 20 20 20 20  nvert \"",.     
11540 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65            Tcl_Ge
11550 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
11560 62 6a 76 5b 33 5d 2c 30 29 2c 20 22 5c 22 20 74  bjv[3],0), "\" t
11570 6f 20 69 6e 74 65 67 65 72 22 2c 20 28 63 68 61  o integer", (cha
11580 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 20 20 20  r*)0);.         
11590 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
115a0 52 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  R;.        }else
115b0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
115c0 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  n<0 ){.         
115d0 20 20 20 66 6c 75 73 68 53 74 6d 74 43 61 63 68     flushStmtCach
115e0 65 28 20 70 44 62 20 29 3b 0a 20 20 20 20 20 20  e( pDb );.      
115f0 20 20 20 20 20 20 6e 20 3d 20 30 3b 0a 20 20 20        n = 0;.   
11600 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
11610 20 6e 3e 4d 41 58 5f 50 52 45 50 41 52 45 44 5f   n>MAX_PREPARED_
11620 53 54 4d 54 53 20 29 7b 0a 20 20 20 20 20 20 20  STMTS ){.       
11630 20 20 20 20 20 6e 20 3d 20 4d 41 58 5f 50 52 45       n = MAX_PRE
11640 50 41 52 45 44 5f 53 54 4d 54 53 3b 0a 20 20 20  PARED_STMTS;.   
11650 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
11660 20 20 20 70 44 62 2d 3e 6d 61 78 53 74 6d 74 20     pDb->maxStmt 
11670 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = n;.        }. 
11680 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
11690 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65  {.      Tcl_Appe
116a0 6e 64 52 65 73 75 6c 74 28 20 69 6e 74 65 72 70  ndResult( interp
116b0 2c 20 22 62 61 64 20 6f 70 74 69 6f 6e 20 5c 22  , "bad option \"
116c0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c  ",.          Tcl
116d0 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
116e0 6a 28 6f 62 6a 76 5b 32 5d 2c 30 29 2c 20 22 5c  j(objv[2],0), "\
116f0 22 3a 20 6d 75 73 74 20 62 65 20 66 6c 75 73 68  ": must be flush
11700 20 6f 72 20 73 69 7a 65 22 2c 0a 20 20 20 20 20   or size",.     
11710 20 20 20 20 20 28 63 68 61 72 2a 29 30 29 3b 0a       (char*)0);.
11720 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
11730 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
11740 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
11750 2f 2a 20 20 20 20 20 24 64 62 20 63 68 61 6e 67  /*     $db chang
11760 65 73 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74  es.  **.  ** Ret
11770 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
11780 66 20 72 6f 77 73 20 74 68 61 74 20 77 65 72 65  f rows that were
11790 20 6d 6f 64 69 66 69 65 64 2c 20 69 6e 73 65 72   modified, inser
117a0 74 65 64 2c 20 6f 72 20 64 65 6c 65 74 65 64 20  ted, or deleted 
117b0 62 79 0a 20 20 2a 2a 20 74 68 65 20 6d 6f 73 74  by.  ** the most
117c0 20 72 65 63 65 6e 74 20 49 4e 53 45 52 54 2c 20   recent INSERT, 
117d0 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45  UPDATE or DELETE
117e0 20 73 74 61 74 65 6d 65 6e 74 2c 20 6e 6f 74 20   statement, not 
117f0 69 6e 63 6c 75 64 69 6e 67 0a 20 20 2a 2a 20 61  including.  ** a
11800 6e 79 20 63 68 61 6e 67 65 73 20 6d 61 64 65 20  ny changes made 
11810 62 79 20 74 72 69 67 67 65 72 20 70 72 6f 67 72  by trigger progr
11820 61 6d 73 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  ams..  */.  case
11830 20 44 42 5f 43 48 41 4e 47 45 53 3a 20 7b 0a 20   DB_CHANGES: {. 
11840 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 73     Tcl_Obj *pRes
11850 75 6c 74 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a  ult;.    if( obj
11860 63 21 3d 32 20 29 7b 0a 20 20 20 20 20 20 54 63  c!=2 ){.      Tc
11870 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
11880 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
11890 22 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  "");.      retur
118a0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
118b0 20 7d 0a 20 20 20 20 70 52 65 73 75 6c 74 20 3d   }.    pResult =
118c0 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c   Tcl_GetObjResul
118d0 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54  t(interp);.    T
118e0 63 6c 5f 53 65 74 49 6e 74 4f 62 6a 28 70 52 65  cl_SetIntObj(pRe
118f0 73 75 6c 74 2c 20 73 71 6c 69 74 65 33 5f 63 68  sult, sqlite3_ch
11900 61 6e 67 65 73 28 70 44 62 2d 3e 64 62 29 29 3b  anges(pDb->db));
11910 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
11920 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 63 6c 6f  .  /*    $db clo
11930 73 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 68 75  se.  **.  ** Shu
11940 74 64 6f 77 6e 20 74 68 65 20 64 61 74 61 62 61  tdown the databa
11950 73 65 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  se.  */.  case D
11960 42 5f 43 4c 4f 53 45 3a 20 7b 0a 20 20 20 20 54  B_CLOSE: {.    T
11970 63 6c 5f 44 65 6c 65 74 65 43 6f 6d 6d 61 6e 64  cl_DeleteCommand
11980 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
11990 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
119a0 6a 76 5b 30 5d 2c 20 30 29 29 3b 0a 20 20 20 20  jv[0], 0));.    
119b0 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
119c0 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20 63 6f  .  **     $db co
119d0 6c 6c 61 74 65 20 4e 41 4d 45 20 53 43 52 49 50  llate NAME SCRIP
119e0 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 72 65 61  T.  **.  ** Crea
119f0 74 65 20 61 20 6e 65 77 20 53 51 4c 20 63 6f 6c  te a new SQL col
11a00 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20  lation function 
11a10 63 61 6c 6c 65 64 20 4e 41 4d 45 2e 20 20 57 68  called NAME.  Wh
11a20 65 6e 65 76 65 72 0a 20 20 2a 2a 20 74 68 61 74  enever.  ** that
11a30 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
11a40 6c 65 64 2c 20 69 6e 76 6f 6b 65 20 53 43 52 49  led, invoke SCRI
11a50 50 54 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74  PT to evaluate t
11a60 68 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a  he function..  *
11a70 2f 0a 20 20 63 61 73 65 20 44 42 5f 43 4f 4c 4c  /.  case DB_COLL
11a80 41 54 45 3a 20 7b 0a 20 20 20 20 53 71 6c 43 6f  ATE: {.    SqlCo
11a90 6c 6c 61 74 65 20 2a 70 43 6f 6c 6c 61 74 65 3b  llate *pCollate;
11aa0 0a 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65  .    char *zName
11ab0 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 63 72  ;.    char *zScr
11ac0 69 70 74 3b 0a 20 20 20 20 69 6e 74 20 6e 53 63  ipt;.    int nSc
11ad0 72 69 70 74 3b 0a 20 20 20 20 69 66 28 20 6f 62  ript;.    if( ob
11ae0 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 20 20 54  jc!=4 ){.      T
11af0 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
11b00 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c  interp, 2, objv,
11b10 20 22 4e 41 4d 45 20 53 43 52 49 50 54 22 29 3b   "NAME SCRIPT");
11b20 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
11b30 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
11b40 20 20 20 7a 4e 61 6d 65 20 3d 20 54 63 6c 5f 47     zName = Tcl_G
11b50 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
11b60 6f 62 6a 76 5b 32 5d 2c 20 30 29 3b 0a 20 20 20  objv[2], 0);.   
11b70 20 7a 53 63 72 69 70 74 20 3d 20 54 63 6c 5f 47   zScript = Tcl_G
11b80 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
11b90 6f 62 6a 76 5b 33 5d 2c 20 26 6e 53 63 72 69 70  objv[3], &nScrip
11ba0 74 29 3b 0a 20 20 20 20 70 43 6f 6c 6c 61 74 65  t);.    pCollate
11bb0 20 3d 20 28 53 71 6c 43 6f 6c 6c 61 74 65 2a 29   = (SqlCollate*)
11bc0 54 63 6c 5f 41 6c 6c 6f 63 28 20 73 69 7a 65 6f  Tcl_Alloc( sizeo
11bd0 66 28 2a 70 43 6f 6c 6c 61 74 65 29 20 2b 20 6e  f(*pCollate) + n
11be0 53 63 72 69 70 74 20 2b 20 31 20 29 3b 0a 20 20  Script + 1 );.  
11bf0 20 20 69 66 28 20 70 43 6f 6c 6c 61 74 65 3d 3d    if( pCollate==
11c00 30 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  0 ) return TCL_E
11c10 52 52 4f 52 3b 0a 20 20 20 20 70 43 6f 6c 6c 61  RROR;.    pColla
11c20 74 65 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74  te->interp = int
11c30 65 72 70 3b 0a 20 20 20 20 70 43 6f 6c 6c 61 74  erp;.    pCollat
11c40 65 2d 3e 70 4e 65 78 74 20 3d 20 70 44 62 2d 3e  e->pNext = pDb->
11c50 70 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 70 43  pCollate;.    pC
11c60 6f 6c 6c 61 74 65 2d 3e 7a 53 63 72 69 70 74 20  ollate->zScript 
11c70 3d 20 28 63 68 61 72 2a 29 26 70 43 6f 6c 6c 61  = (char*)&pColla
11c80 74 65 5b 31 5d 3b 0a 20 20 20 20 70 44 62 2d 3e  te[1];.    pDb->
11c90 70 43 6f 6c 6c 61 74 65 20 3d 20 70 43 6f 6c 6c  pCollate = pColl
11ca0 61 74 65 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  ate;.    memcpy(
11cb0 70 43 6f 6c 6c 61 74 65 2d 3e 7a 53 63 72 69 70  pCollate->zScrip
11cc0 74 2c 20 7a 53 63 72 69 70 74 2c 20 6e 53 63 72  t, zScript, nScr
11cd0 69 70 74 2b 31 29 3b 0a 20 20 20 20 69 66 28 20  ipt+1);.    if( 
11ce0 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63  sqlite3_create_c
11cf0 6f 6c 6c 61 74 69 6f 6e 28 70 44 62 2d 3e 64 62  ollation(pDb->db
11d00 2c 20 7a 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f  , zName, SQLITE_
11d10 55 54 46 38 2c 0a 20 20 20 20 20 20 20 20 70 43  UTF8,.        pC
11d20 6f 6c 6c 61 74 65 2c 20 74 63 6c 53 71 6c 43 6f  ollate, tclSqlCo
11d30 6c 6c 61 74 65 29 20 29 7b 0a 20 20 20 20 20 20  llate) ){.      
11d40 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
11d50 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 73 71  terp, (char *)sq
11d60 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62  lite3_errmsg(pDb
11d70 2d 3e 64 62 29 2c 20 54 43 4c 5f 56 4f 4c 41 54  ->db), TCL_VOLAT
11d80 49 4c 45 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ILE);.      retu
11d90 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
11da0 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20    }.    break;. 
11db0 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20   }..  /*.  **   
11dc0 20 20 24 64 62 20 63 6f 6c 6c 61 74 69 6f 6e 5f    $db collation_
11dd0 6e 65 65 64 65 64 20 53 43 52 49 50 54 0a 20 20  needed SCRIPT.  
11de0 2a 2a 0a 20 20 2a 2a 20 43 72 65 61 74 65 20 61  **.  ** Create a
11df0 20 6e 65 77 20 53 51 4c 20 63 6f 6c 6c 61 74 69   new SQL collati
11e00 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c  on function call
11e10 65 64 20 4e 41 4d 45 2e 20 20 57 68 65 6e 65 76  ed NAME.  Whenev
11e20 65 72 0a 20 20 2a 2a 20 74 68 61 74 20 66 75 6e  er.  ** that fun
11e30 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
11e40 20 69 6e 76 6f 6b 65 20 53 43 52 49 50 54 20 74   invoke SCRIPT t
11e50 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65 20 66  o evaluate the f
11e60 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20  unction..  */.  
11e70 63 61 73 65 20 44 42 5f 43 4f 4c 4c 41 54 49 4f  case DB_COLLATIO
11e80 4e 5f 4e 45 45 44 45 44 3a 20 7b 0a 20 20 20 20  N_NEEDED: {.    
11e90 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20  if( objc!=3 ){. 
11ea0 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
11eb0 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
11ec0 20 6f 62 6a 76 2c 20 22 53 43 52 49 50 54 22 29   objv, "SCRIPT")
11ed0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
11ee0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
11ef0 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 43 6f      if( pDb->pCo
11f00 6c 6c 61 74 65 4e 65 65 64 65 64 20 29 7b 0a 20  llateNeeded ){. 
11f10 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66       Tcl_DecrRef
11f20 43 6f 75 6e 74 28 70 44 62 2d 3e 70 43 6f 6c 6c  Count(pDb->pColl
11f30 61 74 65 4e 65 65 64 65 64 29 3b 0a 20 20 20 20  ateNeeded);.    
11f40 7d 0a 20 20 20 20 70 44 62 2d 3e 70 43 6f 6c 6c  }.    pDb->pColl
11f50 61 74 65 4e 65 65 64 65 64 20 3d 20 54 63 6c 5f  ateNeeded = Tcl_
11f60 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 6f 62 6a  DuplicateObj(obj
11f70 76 5b 32 5d 29 3b 0a 20 20 20 20 54 63 6c 5f 49  v[2]);.    Tcl_I
11f80 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 44 62 2d  ncrRefCount(pDb-
11f90 3e 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64 29  >pCollateNeeded)
11fa0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f  ;.    sqlite3_co
11fb0 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64 28 70  llation_needed(p
11fc0 44 62 2d 3e 64 62 2c 20 70 44 62 2c 20 74 63 6c  Db->db, pDb, tcl
11fd0 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64 29 3b 0a  CollateNeeded);.
11fe0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
11ff0 20 20 2f 2a 20 20 20 20 24 64 62 20 63 6f 6d 6d    /*    $db comm
12000 69 74 5f 68 6f 6f 6b 20 3f 43 41 4c 4c 42 41 43  it_hook ?CALLBAC
12010 4b 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 76  K?.  **.  ** Inv
12020 6f 6b 65 20 74 68 65 20 67 69 76 65 6e 20 63 61  oke the given ca
12030 6c 6c 62 61 63 6b 20 6a 75 73 74 20 62 65 66 6f  llback just befo
12040 72 65 20 63 6f 6d 6d 69 74 74 69 6e 67 20 65 76  re committing ev
12050 65 72 79 20 53 51 4c 20 74 72 61 6e 73 61 63 74  ery SQL transact
12060 69 6f 6e 2e 0a 20 20 2a 2a 20 49 66 20 74 68 65  ion..  ** If the
12070 20 63 61 6c 6c 62 61 63 6b 20 74 68 72 6f 77 73   callback throws
12080 20 61 6e 20 65 78 63 65 70 74 69 6f 6e 20 6f 72   an exception or
12090 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72   returns non-zer
120a0 6f 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 2a 2a  o, then the.  **
120b0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
120c0 61 62 6f 72 74 65 64 2e 20 20 49 66 20 43 41 4c  aborted.  If CAL
120d0 4c 42 41 43 4b 20 69 73 20 61 6e 20 65 6d 70 74  LBACK is an empt
120e0 79 20 73 74 72 69 6e 67 2c 20 74 68 65 20 63 61  y string, the ca
120f0 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 69 73 20 64  llback.  ** is d
12100 69 73 61 62 6c 65 64 2e 0a 20 20 2a 2f 0a 20 20  isabled..  */.  
12110 63 61 73 65 20 44 42 5f 43 4f 4d 4d 49 54 5f 48  case DB_COMMIT_H
12120 4f 4f 4b 3a 20 7b 0a 20 20 20 20 69 66 28 20 6f  OOK: {.    if( o
12130 62 6a 63 3e 33 20 29 7b 0a 20 20 20 20 20 20 54  bjc>3 ){.      T
12140 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
12150 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c  interp, 2, objv,
12160 20 22 3f 43 41 4c 4c 42 41 43 4b 3f 22 29 3b 0a   "?CALLBACK?");.
12170 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
12180 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73  _ERROR;.    }els
12190 65 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b  e if( objc==2 ){
121a0 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e  .      if( pDb->
121b0 7a 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 20  zCommit ){.     
121c0 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
121d0 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 44 62 2d  ult(interp, pDb-
121e0 3e 7a 43 6f 6d 6d 69 74 2c 20 28 63 68 61 72 2a  >zCommit, (char*
121f0 29 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  )0);.      }.   
12200 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 6f   }else{.      co
12210 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6d 6d 69  nst char *zCommi
12220 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e  t;.      int len
12230 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d  ;.      if( pDb-
12240 3e 7a 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20  >zCommit ){.    
12250 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62      Tcl_Free(pDb
12260 2d 3e 7a 43 6f 6d 6d 69 74 29 3b 0a 20 20 20 20  ->zCommit);.    
12270 20 20 7d 0a 20 20 20 20 20 20 7a 43 6f 6d 6d 69    }.      zCommi
12280 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  t = Tcl_GetStrin
12290 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d  gFromObj(objv[2]
122a0 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69  , &len);.      i
122b0 66 28 20 7a 43 6f 6d 6d 69 74 20 26 26 20 6c 65  f( zCommit && le
122c0 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  n>0 ){.        p
122d0 44 62 2d 3e 7a 43 6f 6d 6d 69 74 20 3d 20 54 63  Db->zCommit = Tc
122e0 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20 31  l_Alloc( len + 1
122f0 20 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63   );.        memc
12300 70 79 28 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 2c  py(pDb->zCommit,
12310 20 7a 43 6f 6d 6d 69 74 2c 20 6c 65 6e 2b 31 29   zCommit, len+1)
12320 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
12330 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 43 6f 6d         pDb->zCom
12340 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  mit = 0;.      }
12350 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e  .      if( pDb->
12360 7a 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 20  zCommit ){.     
12370 20 20 20 70 44 62 2d 3e 69 6e 74 65 72 70 20 3d     pDb->interp =
12380 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 20 20 20   interp;.       
12390 20 73 71 6c 69 74 65 33 5f 63 6f 6d 6d 69 74 5f   sqlite3_commit_
123a0 68 6f 6f 6b 28 70 44 62 2d 3e 64 62 2c 20 44 62  hook(pDb->db, Db
123b0 43 6f 6d 6d 69 74 48 61 6e 64 6c 65 72 2c 20 70  CommitHandler, p
123c0 44 62 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  Db);.      }else
123d0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
123e0 33 5f 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 28 70 44  3_commit_hook(pD
123f0 62 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20  b->db, 0, 0);.  
12400 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
12410 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
12420 20 20 20 20 24 64 62 20 63 6f 6d 70 6c 65 74 65      $db complete
12430 20 53 51 4c 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52   SQL.  **.  ** R
12440 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 53 51  eturn TRUE if SQ
12450 4c 20 69 73 20 61 20 63 6f 6d 70 6c 65 74 65 20  L is a complete 
12460 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  SQL statement.  
12470 52 65 74 75 72 6e 20 46 41 4c 53 45 20 69 66 0a  Return FALSE if.
12480 20 20 2a 2a 20 61 64 64 69 74 69 6f 6e 61 6c 20    ** additional 
12490 6c 69 6e 65 73 20 6f 66 20 69 6e 70 75 74 20 61  lines of input a
124a0 72 65 20 6e 65 65 64 65 64 2e 20 20 54 68 69 73  re needed.  This
124b0 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 74   is similar to t
124c0 68 65 0a 20 20 2a 2a 20 62 75 69 6c 74 2d 69 6e  he.  ** built-in
124d0 20 22 69 6e 66 6f 20 63 6f 6d 70 6c 65 74 65 22   "info complete"
124e0 20 63 6f 6d 6d 61 6e 64 20 6f 66 20 54 63 6c 2e   command of Tcl.
124f0 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f  .  */.  case DB_
12500 43 4f 4d 50 4c 45 54 45 3a 20 7b 0a 23 69 66 6e  COMPLETE: {.#ifn
12510 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
12520 43 4f 4d 50 4c 45 54 45 0a 20 20 20 20 54 63 6c  COMPLETE.    Tcl
12530 5f 4f 62 6a 20 2a 70 52 65 73 75 6c 74 3b 0a 20  _Obj *pResult;. 
12540 20 20 20 69 6e 74 20 69 73 43 6f 6d 70 6c 65 74     int isComplet
12550 65 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21  e;.    if( objc!
12560 3d 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  =3 ){.      Tcl_
12570 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
12580 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 53  erp, 2, objv, "S
12590 51 4c 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  QL");.      retu
125a0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
125b0 20 20 7d 0a 20 20 20 20 69 73 43 6f 6d 70 6c 65    }.    isComple
125c0 74 65 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6d  te = sqlite3_com
125d0 70 6c 65 74 65 28 20 54 63 6c 5f 47 65 74 53 74  plete( Tcl_GetSt
125e0 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
125f0 5b 32 5d 2c 20 30 29 20 29 3b 0a 20 20 20 20 70  [2], 0) );.    p
12600 52 65 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65 74  Result = Tcl_Get
12610 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
12620 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 42 6f  );.    Tcl_SetBo
12630 6f 6c 65 61 6e 4f 62 6a 28 70 52 65 73 75 6c 74  oleanObj(pResult
12640 2c 20 69 73 43 6f 6d 70 6c 65 74 65 29 3b 0a 23  , isComplete);.#
12650 65 6e 64 69 66 0a 20 20 20 20 62 72 65 61 6b 3b  endif.    break;
12660 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64  .  }..  /*    $d
12670 62 20 63 6f 6e 66 69 67 20 3f 4f 50 54 49 4f 4e  b config ?OPTION
12680 3f 20 3f 42 4f 4f 4c 45 41 4e 3f 0a 20 20 2a 2a  ? ?BOOLEAN?.  **
12690 0a 20 20 2a 2a 20 43 6f 6e 66 69 67 75 72 65 20  .  ** Configure 
126a0 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  the database con
126b0 6e 65 63 74 69 6f 6e 20 75 73 69 6e 67 20 74 68  nection using th
126c0 65 20 73 71 6c 69 74 65 33 5f 64 62 5f 63 6f 6e  e sqlite3_db_con
126d0 66 69 67 28 29 0a 20 20 2a 2a 20 69 6e 74 65 72  fig().  ** inter
126e0 66 61 63 65 2e 0a 20 20 2a 2f 0a 20 20 63 61 73  face..  */.  cas
126f0 65 20 44 42 5f 43 4f 4e 46 49 47 3a 20 7b 0a 20  e DB_CONFIG: {. 
12700 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
12710 73 74 72 75 63 74 20 44 62 43 6f 6e 66 69 67 43  struct DbConfigC
12720 68 6f 69 63 65 73 20 7b 0a 20 20 20 20 20 20 63  hoices {.      c
12730 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
12740 3b 0a 20 20 20 20 20 20 69 6e 74 20 6f 70 3b 0a  ;.      int op;.
12750 20 20 20 20 7d 20 61 44 62 43 6f 6e 66 69 67 5b      } aDbConfig[
12760 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 7b 20  ] = {.        { 
12770 22 65 6e 61 62 6c 65 5f 66 6b 65 79 22 2c 20 20  "enable_fkey",  
12780 20 20 20 20 20 20 53 51 4c 49 54 45 5f 44 42 43        SQLITE_DBC
12790 4f 4e 46 49 47 5f 45 4e 41 42 4c 45 5f 46 4b 45  ONFIG_ENABLE_FKE
127a0 59 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  Y           },. 
127b0 20 20 20 20 20 20 20 7b 20 22 65 6e 61 62 6c 65         { "enable
127c0 5f 74 72 69 67 67 65 72 22 2c 20 20 20 20 20 53  _trigger",     S
127d0 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 45  QLITE_DBCONFIG_E
127e0 4e 41 42 4c 45 5f 54 52 49 47 47 45 52 20 20 20  NABLE_TRIGGER   
127f0 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 20 20       },.        
12800 7b 20 22 65 6e 61 62 6c 65 5f 76 69 65 77 22 2c  { "enable_view",
12810 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 44          SQLITE_D
12820 42 43 4f 4e 46 49 47 5f 45 4e 41 42 4c 45 5f 56  BCONFIG_ENABLE_V
12830 49 45 57 20 20 20 20 20 20 20 20 20 20 20 7d 2c  IEW           },
12840 0a 20 20 20 20 20 20 20 20 7b 20 22 66 74 73 33  .        { "fts3
12850 5f 74 6f 6b 65 6e 69 7a 65 72 22 2c 20 20 20 20  _tokenizer",    
12860 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47   SQLITE_DBCONFIG
12870 5f 45 4e 41 42 4c 45 5f 46 54 53 33 5f 54 4f 4b  _ENABLE_FTS3_TOK
12880 45 4e 49 5a 45 52 20 7d 2c 0a 20 20 20 20 20 20  ENIZER },.      
12890 20 20 7b 20 22 6c 6f 61 64 5f 65 78 74 65 6e 73    { "load_extens
128a0 69 6f 6e 22 2c 20 20 20 20 20 53 51 4c 49 54 45  ion",     SQLITE
128b0 5f 44 42 43 4f 4e 46 49 47 5f 45 4e 41 42 4c 45  _DBCONFIG_ENABLE
128c0 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 20  _LOAD_EXTENSION 
128d0 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 22 6e 6f  },.        { "no
128e0 5f 63 6b 70 74 5f 6f 6e 5f 63 6c 6f 73 65 22 2c  _ckpt_on_close",
128f0 20 20 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46     SQLITE_DBCONF
12900 49 47 5f 4e 4f 5f 43 4b 50 54 5f 4f 4e 5f 43 4c  IG_NO_CKPT_ON_CL
12910 4f 53 45 20 20 20 20 20 20 7d 2c 0a 20 20 20 20  OSE      },.    
12920 20 20 20 20 7b 20 22 65 6e 61 62 6c 65 5f 71 70      { "enable_qp
12930 73 67 22 2c 20 20 20 20 20 20 20 20 53 51 4c 49  sg",        SQLI
12940 54 45 5f 44 42 43 4f 4e 46 49 47 5f 45 4e 41 42  TE_DBCONFIG_ENAB
12950 4c 45 5f 51 50 53 47 20 20 20 20 20 20 20 20 20  LE_QPSG         
12960 20 20 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 22    },.        { "
12970 74 72 69 67 67 65 72 5f 65 71 70 22 2c 20 20 20  trigger_eqp",   
12980 20 20 20 20 20 53 51 4c 49 54 45 5f 44 42 43 4f       SQLITE_DBCO
12990 4e 46 49 47 5f 54 52 49 47 47 45 52 5f 45 51 50  NFIG_TRIGGER_EQP
129a0 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
129b0 20 20 20 20 20 20 7b 20 22 72 65 73 65 74 5f 64        { "reset_d
129c0 61 74 61 62 61 73 65 22 2c 20 20 20 20 20 53 51  atabase",     SQ
129d0 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 52 45  LITE_DBCONFIG_RE
129e0 53 45 54 5f 44 41 54 41 42 41 53 45 20 20 20 20  SET_DATABASE    
129f0 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 20 20 7b      },.        {
12a00 20 22 64 65 66 65 6e 73 69 76 65 22 2c 20 20 20   "defensive",   
12a10 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 44 42         SQLITE_DB
12a20 43 4f 4e 46 49 47 5f 44 45 46 45 4e 53 49 56 45  CONFIG_DEFENSIVE
12a30 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
12a40 20 20 20 20 20 20 20 20 7b 20 22 77 72 69 74 61          { "writa
12a50 62 6c 65 5f 73 63 68 65 6d 61 22 2c 20 20 20 20  ble_schema",    
12a60 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f  SQLITE_DBCONFIG_
12a70 57 52 49 54 41 42 4c 45 5f 53 43 48 45 4d 41 20  WRITABLE_SCHEMA 
12a80 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 20        },.       
12a90 20 7b 20 22 6c 65 67 61 63 79 5f 61 6c 74 65 72   { "legacy_alter
12aa0 5f 74 61 62 6c 65 22 2c 20 53 51 4c 49 54 45 5f  _table", SQLITE_
12ab0 44 42 43 4f 4e 46 49 47 5f 4c 45 47 41 43 59 5f  DBCONFIG_LEGACY_
12ac0 41 4c 54 45 52 5f 54 41 42 4c 45 20 20 20 20 7d  ALTER_TABLE    }
12ad0 2c 0a 20 20 20 20 20 20 20 20 7b 20 22 64 71 73  ,.        { "dqs
12ae0 5f 64 6d 6c 22 2c 20 20 20 20 20 20 20 20 20 20  _dml",          
12af0 20 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49    SQLITE_DBCONFI
12b00 47 5f 44 51 53 5f 44 4d 4c 20 20 20 20 20 20 20  G_DQS_DML       
12b10 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20          },.     
12b20 20 20 20 7b 20 22 64 71 73 5f 64 64 6c 22 2c 20     { "dqs_ddl", 
12b30 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
12b40 45 5f 44 42 43 4f 4e 46 49 47 5f 44 51 53 5f 44  E_DBCONFIG_DQS_D
12b50 44 4c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  DL              
12b60 20 7d 2c 0a 20 20 20 20 7d 3b 0a 20 20 20 20 54   },.    };.    T
12b70 63 6c 5f 4f 62 6a 20 2a 70 52 65 73 75 6c 74 3b  cl_Obj *pResult;
12b80 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20  .    int ii;.   
12b90 20 69 66 28 20 6f 62 6a 63 3e 34 20 29 7b 0a 20   if( objc>4 ){. 
12ba0 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
12bb0 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
12bc0 20 6f 62 6a 76 2c 20 22 3f 4f 50 54 49 4f 4e 3f   objv, "?OPTION?
12bd0 20 3f 42 4f 4f 4c 45 41 4e 3f 22 29 3b 0a 20 20   ?BOOLEAN?");.  
12be0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
12bf0 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
12c00 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20  if( objc==2 ){. 
12c10 20 20 20 20 20 2f 2a 20 57 69 74 68 20 6e 6f 20       /* With no 
12c20 61 72 67 75 6d 65 6e 74 73 2c 20 6c 69 73 74 20  arguments, list 
12c30 61 6c 6c 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  all configuratio
12c40 6e 20 6f 70 74 69 6f 6e 73 20 61 6e 64 20 77 69  n options and wi
12c50 74 68 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  th the.      ** 
12c60 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 2a 2f  current value */
12c70 0a 20 20 20 20 20 20 70 52 65 73 75 6c 74 20 3d  .      pResult =
12c80 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28   Tcl_NewListObj(
12c90 30 2c 30 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  0,0);.      for(
12ca0 69 69 3d 30 3b 20 69 69 3c 73 69 7a 65 6f 66 28  ii=0; ii<sizeof(
12cb0 61 44 62 43 6f 6e 66 69 67 29 2f 73 69 7a 65 6f  aDbConfig)/sizeo
12cc0 66 28 61 44 62 43 6f 6e 66 69 67 5b 30 5d 29 3b  f(aDbConfig[0]);
12cd0 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20   ii++){.        
12ce0 69 6e 74 20 76 20 3d 20 30 3b 0a 20 20 20 20 20  int v = 0;.     
12cf0 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69     int rc = sqli
12d00 74 65 33 5f 64 62 5f 63 6f 6e 66 69 67 28 70 44  te3_db_config(pD
12d10 62 2d 3e 64 62 2c 20 61 44 62 43 6f 6e 66 69 67  b->db, aDbConfig
12d20 5b 69 69 5d 2e 6f 70 2c 20 2d 31 2c 20 26 76 29  [ii].op, -1, &v)
12d30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
12d40 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 63 6f  !=SQLITE_OK ) co
12d50 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
12d60 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
12d70 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
12d80 20 70 52 65 73 75 6c 74 2c 0a 20 20 20 20 20 20   pResult,.      
12d90 20 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69       Tcl_NewStri
12da0 6e 67 4f 62 6a 28 61 44 62 43 6f 6e 66 69 67 5b  ngObj(aDbConfig[
12db0 69 69 5d 2e 7a 4e 61 6d 65 2c 2d 31 29 29 3b 0a  ii].zName,-1));.
12dc0 20 20 20 20 20 20 20 20 54 63 6c 5f 4c 69 73 74          Tcl_List
12dd0 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
12de0 28 69 6e 74 65 72 70 2c 20 70 52 65 73 75 6c 74  (interp, pResult
12df0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 54 63 6c  ,.           Tcl
12e00 5f 4e 65 77 49 6e 74 4f 62 6a 28 76 29 29 3b 0a  _NewIntObj(v));.
12e10 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
12e20 65 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  e{.      const c
12e30 68 61 72 20 2a 7a 4f 70 74 20 3d 20 54 63 6c 5f  har *zOpt = Tcl_
12e40 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32  GetString(objv[2
12e50 5d 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 63  ]);.      int rc
12e60 3b 0a 20 20 20 20 20 20 69 6e 74 20 6f 6e 6f 66  ;.      int onof
12e70 66 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 69 6e  f = -1;.      in
12e80 74 20 76 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  t v = 0;.      i
12e90 66 28 20 7a 4f 70 74 5b 30 5d 3d 3d 27 2d 27 20  f( zOpt[0]=='-' 
12ea0 29 20 7a 4f 70 74 2b 2b 3b 0a 20 20 20 20 20 20  ) zOpt++;.      
12eb0 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 73 69 7a  for(ii=0; ii<siz
12ec0 65 6f 66 28 61 44 62 43 6f 6e 66 69 67 29 2f 73  eof(aDbConfig)/s
12ed0 69 7a 65 6f 66 28 61 44 62 43 6f 6e 66 69 67 5b  izeof(aDbConfig[
12ee0 30 5d 29 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  0]); ii++){.    
12ef0 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 61      if( strcmp(a
12f00 44 62 43 6f 6e 66 69 67 5b 69 69 5d 2e 7a 4e 61  DbConfig[ii].zNa
12f10 6d 65 2c 20 7a 4f 70 74 29 3d 3d 30 20 29 20 62  me, zOpt)==0 ) b
12f20 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
12f30 20 20 20 20 69 66 28 20 69 69 3e 3d 73 69 7a 65      if( ii>=size
12f40 6f 66 28 61 44 62 43 6f 6e 66 69 67 29 2f 73 69  of(aDbConfig)/si
12f50 7a 65 6f 66 28 61 44 62 43 6f 6e 66 69 67 5b 30  zeof(aDbConfig[0
12f60 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63  ]) ){.        Tc
12f70 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
12f80 6e 74 65 72 70 2c 20 22 75 6e 6b 6e 6f 77 6e 20  nterp, "unknown 
12f90 63 6f 6e 66 69 67 20 6f 70 74 69 6f 6e 3a 20 5c  config option: \
12fa0 22 22 2c 20 7a 4f 70 74 2c 0a 20 20 20 20 20 20  "", zOpt,.      
12fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12fc0 20 20 20 20 20 20 20 20 20 20 22 5c 22 22 2c 20            "\"", 
12fd0 28 76 6f 69 64 2a 29 30 29 3b 0a 20 20 20 20 20  (void*)0);.     
12fe0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
12ff0 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ROR;.      }.   
13000 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d 34 20 29     if( objc==4 )
13010 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 54 63  {.        if( Tc
13020 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d  l_GetBooleanFrom
13030 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
13040 5b 33 5d 2c 20 26 6f 6e 6f 66 66 29 20 29 7b 0a  [3], &onoff) ){.
13050 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
13060 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
13070 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
13080 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
13090 5f 64 62 5f 63 6f 6e 66 69 67 28 70 44 62 2d 3e  _db_config(pDb->
130a0 64 62 2c 20 61 44 62 43 6f 6e 66 69 67 5b 69 69  db, aDbConfig[ii
130b0 5d 2e 6f 70 2c 20 6f 6e 6f 66 66 2c 20 26 76 29  ].op, onoff, &v)
130c0 3b 0a 20 20 20 20 20 20 70 52 65 73 75 6c 74 20  ;.      pResult 
130d0 3d 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28  = Tcl_NewIntObj(
130e0 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63  v);.    }.    Tc
130f0 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
13100 6e 74 65 72 70 2c 20 70 52 65 73 75 6c 74 29 3b  nterp, pResult);
13110 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
13120 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 63 6f 70  .  /*    $db cop
13130 79 20 63 6f 6e 66 6c 69 63 74 2d 61 6c 67 6f 72  y conflict-algor
13140 69 74 68 6d 20 74 61 62 6c 65 20 66 69 6c 65 6e  ithm table filen
13150 61 6d 65 20 3f 53 45 50 41 52 41 54 4f 52 3f 20  ame ?SEPARATOR? 
13160 3f 4e 55 4c 4c 49 4e 44 49 43 41 54 4f 52 3f 0a  ?NULLINDICATOR?.
13170 20 20 2a 2a 0a 20 20 2a 2a 20 43 6f 70 79 20 64    **.  ** Copy d
13180 61 74 61 20 69 6e 74 6f 20 74 61 62 6c 65 20 66  ata into table f
13190 72 6f 6d 20 66 69 6c 65 6e 61 6d 65 2c 20 6f 70  rom filename, op
131a0 74 69 6f 6e 61 6c 6c 79 20 75 73 69 6e 67 20 53  tionally using S
131b0 45 50 41 52 41 54 4f 52 0a 20 20 2a 2a 20 61 73  EPARATOR.  ** as
131c0 20 63 6f 6c 75 6d 6e 20 73 65 70 61 72 61 74 6f   column separato
131d0 72 73 2e 20 20 49 66 20 61 20 63 6f 6c 75 6d 6e  rs.  If a column
131e0 20 63 6f 6e 74 61 69 6e 73 20 61 20 6e 75 6c 6c   contains a null
131f0 20 73 74 72 69 6e 67 2c 20 6f 72 20 74 68 65 0a   string, or the.
13200 20 20 2a 2a 20 76 61 6c 75 65 20 6f 66 20 4e 55    ** value of NU
13210 4c 4c 49 4e 44 49 43 41 54 4f 52 2c 20 61 20 4e  LLINDICATOR, a N
13220 55 4c 4c 20 69 73 20 69 6e 73 65 72 74 65 64 20  ULL is inserted 
13230 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 2e 0a  for the column..
13240 20 20 2a 2a 20 63 6f 6e 66 6c 69 63 74 2d 61 6c    ** conflict-al
13250 67 6f 72 69 74 68 6d 20 69 73 20 6f 6e 65 20 6f  gorithm is one o
13260 66 20 74 68 65 20 73 71 6c 69 74 65 20 63 6f 6e  f the sqlite con
13270 66 6c 69 63 74 20 61 6c 67 6f 72 69 74 68 6d 73  flict algorithms
13280 3a 0a 20 20 2a 2a 20 20 20 20 72 6f 6c 6c 62 61  :.  **    rollba
13290 63 6b 2c 20 61 62 6f 72 74 2c 20 66 61 69 6c 2c  ck, abort, fail,
132a0 20 69 67 6e 6f 72 65 2c 20 72 65 70 6c 61 63 65   ignore, replace
132b0 0a 20 20 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73  .  ** On success
132c0 2c 20 72 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  , return the num
132d0 62 65 72 20 6f 66 20 6c 69 6e 65 73 20 70 72 6f  ber of lines pro
132e0 63 65 73 73 65 64 2c 20 6e 6f 74 20 6e 65 63 65  cessed, not nece
132f0 73 73 61 72 69 6c 79 20 73 61 6d 65 0a 20 20 2a  ssarily same.  *
13300 2a 20 61 73 20 27 64 62 20 63 68 61 6e 67 65 73  * as 'db changes
13310 27 20 64 75 65 20 74 6f 20 63 6f 6e 66 6c 69 63  ' due to conflic
13320 74 2d 61 6c 67 6f 72 69 74 68 6d 20 73 65 6c 65  t-algorithm sele
13330 63 74 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  cted..  **.  ** 
13340 54 68 69 73 20 63 6f 64 65 20 69 73 20 62 61 73  This code is bas
13350 69 63 61 6c 6c 79 20 61 6e 20 69 6d 70 6c 65 6d  ically an implem
13360 65 6e 74 61 74 69 6f 6e 2f 65 6e 68 61 6e 63 65  entation/enhance
13370 6d 65 6e 74 20 6f 66 0a 20 20 2a 2a 20 74 68 65  ment of.  ** the
13380 20 73 71 6c 69 74 65 33 20 73 68 65 6c 6c 2e 63   sqlite3 shell.c
13390 20 22 2e 69 6d 70 6f 72 74 22 20 63 6f 6d 6d 61   ".import" comma
133a0 6e 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  nd..  **.  ** Th
133b0 69 73 20 63 6f 6d 6d 61 6e 64 20 75 73 61 67 65  is command usage
133c0 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74   is equivalent t
133d0 6f 20 74 68 65 20 73 71 6c 69 74 65 32 2e 78 20  o the sqlite2.x 
133e0 43 4f 50 59 20 73 74 61 74 65 6d 65 6e 74 2c 0a  COPY statement,.
133f0 20 20 2a 2a 20 77 68 69 63 68 20 69 6d 70 6f 72    ** which impor
13400 74 73 20 66 69 6c 65 20 64 61 74 61 20 69 6e 74  ts file data int
13410 6f 20 61 20 74 61 62 6c 65 20 75 73 69 6e 67 20  o a table using 
13420 74 68 65 20 50 6f 73 74 67 72 65 53 51 4c 20 43  the PostgreSQL C
13430 4f 50 59 20 66 69 6c 65 20 66 6f 72 6d 61 74 3a  OPY file format:
13440 0a 20 20 2a 2a 20 20 20 24 64 62 20 63 6f 70 79  .  **   $db copy
13450 20 24 63 6f 6e 66 6c 69 74 5f 61 6c 67 6f 20 24   $conflit_algo $
13460 74 61 62 6c 65 5f 6e 61 6d 65 20 24 66 69 6c 65  table_name $file
13470 6e 61 6d 65 20 5c 74 20 5c 5c 4e 0a 20 20 2a 2f  name \t \\N.  */
13480 0a 20 20 63 61 73 65 20 44 42 5f 43 4f 50 59 3a  .  case DB_COPY:
13490 20 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 61   {.    char *zTa
134a0 62 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ble;            
134b0 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 64 61 74     /* Insert dat
134c0 61 20 69 6e 74 6f 20 74 68 69 73 20 74 61 62 6c  a into this tabl
134d0 65 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a  e */.    char *z
134e0 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20  File;           
134f0 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65       /* The file
13500 20 66 72 6f 6d 20 77 68 69 63 68 20 74 6f 20 65   from which to e
13510 78 74 72 61 63 74 20 64 61 74 61 20 2a 2f 0a 20  xtract data */. 
13520 20 20 20 63 68 61 72 20 2a 7a 43 6f 6e 66 6c 69     char *zConfli
13530 63 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ct;            /
13540 2a 20 54 68 65 20 63 6f 6e 66 6c 69 63 74 20 61  * The conflict a
13550 6c 67 6f 72 69 74 68 6d 20 74 6f 20 75 73 65 20  lgorithm to use 
13560 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  */.    sqlite3_s
13570 74 6d 74 20 2a 70 53 74 6d 74 3b 20 20 20 20 20  tmt *pStmt;     
13580 20 20 20 2f 2a 20 41 20 73 74 61 74 65 6d 65 6e     /* A statemen
13590 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 43 6f  t */.    int nCo
135a0 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
135b0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
135c0 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  f columns in the
135d0 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 69 6e   table */.    in
135e0 74 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20  t nByte;        
135f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
13600 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
13610 61 6e 20 53 51 4c 20 73 74 72 69 6e 67 20 2a 2f  an SQL string */
13620 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20  .    int i, j;  
13630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13640 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
13650 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53 65  s */.    int nSe
13660 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
13670 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
13680 66 20 62 79 74 65 73 20 69 6e 20 7a 53 65 70 5b  f bytes in zSep[
13690 5d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 4e 75  ] */.    int nNu
136a0 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
136b0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
136c0 66 20 62 79 74 65 73 20 69 6e 20 7a 4e 75 6c 6c  f bytes in zNull
136d0 5b 5d 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a  [] */.    char *
136e0 7a 53 71 6c 3b 20 20 20 20 20 20 20 20 20 20 20  zSql;           
136f0 20 20 20 20 20 20 2f 2a 20 41 6e 20 53 51 4c 20        /* An SQL 
13700 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20  statement */.   
13710 20 63 68 61 72 20 2a 7a 4c 69 6e 65 3b 20 20 20   char *zLine;   
13720 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13730 41 20 73 69 6e 67 6c 65 20 6c 69 6e 65 20 6f 66  A single line of
13740 20 69 6e 70 75 74 20 66 72 6f 6d 20 74 68 65 20   input from the 
13750 66 69 6c 65 20 2a 2f 0a 20 20 20 20 63 68 61 72  file */.    char
13760 20 2a 2a 61 7a 43 6f 6c 3b 20 20 20 20 20 20 20   **azCol;       
13770 20 20 20 20 20 20 20 20 2f 2a 20 7a 4c 69 6e 65          /* zLine
13780 5b 5d 20 62 72 6f 6b 65 6e 20 75 70 20 69 6e 74  [] broken up int
13790 6f 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20  o columns */.   
137a0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f   const char *zCo
137b0 6d 6d 69 74 3b 20 20 20 20 20 20 20 20 2f 2a 20  mmit;        /* 
137c0 48 6f 77 20 74 6f 20 63 6f 6d 6d 69 74 20 63 68  How to commit ch
137d0 61 6e 67 65 73 20 2a 2f 0a 20 20 20 20 46 49 4c  anges */.    FIL
137e0 45 20 2a 69 6e 3b 20 20 20 20 20 20 20 20 20 20  E *in;          
137f0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
13800 69 6e 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20 20  input file */.  
13810 20 20 69 6e 74 20 6c 69 6e 65 6e 6f 20 3d 20 30    int lineno = 0
13820 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
13830 20 4c 69 6e 65 20 6e 75 6d 62 65 72 20 6f 66 20   Line number of 
13840 69 6e 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20 20  input file */.  
13850 20 20 63 68 61 72 20 7a 4c 69 6e 65 4e 75 6d 5b    char zLineNum[
13860 38 30 5d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  80];          /*
13870 20 4c 69 6e 65 20 6e 75 6d 62 65 72 20 70 72 69   Line number pri
13880 6e 74 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 20  nt buffer */.   
13890 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 73 75 6c   Tcl_Obj *pResul
138a0 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t;           /* 
138b0 69 6e 74 65 72 70 20 72 65 73 75 6c 74 20 2a 2f  interp result */
138c0 0a 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ..    const char
138d0 20 2a 7a 53 65 70 3b 0a 20 20 20 20 63 6f 6e 73   *zSep;.    cons
138e0 74 20 63 68 61 72 20 2a 7a 4e 75 6c 6c 3b 0a 20  t char *zNull;. 
138f0 20 20 20 69 66 28 20 6f 62 6a 63 3c 35 20 7c 7c     if( objc<5 ||
13900 20 6f 62 6a 63 3e 37 20 29 7b 0a 20 20 20 20 20   objc>7 ){.     
13910 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
13920 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a  s(interp, 2, obj
13930 76 2c 0a 20 20 20 20 20 20 20 20 20 22 43 4f 4e  v,.         "CON
13940 46 4c 49 43 54 2d 41 4c 47 4f 52 49 54 48 4d 20  FLICT-ALGORITHM 
13950 54 41 42 4c 45 20 46 49 4c 45 4e 41 4d 45 20 3f  TABLE FILENAME ?
13960 53 45 50 41 52 41 54 4f 52 3f 20 3f 4e 55 4c 4c  SEPARATOR? ?NULL
13970 49 4e 44 49 43 41 54 4f 52 3f 22 29 3b 0a 20 20  INDICATOR?");.  
13980 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
13990 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
139a0 69 66 28 20 6f 62 6a 63 3e 3d 36 20 29 7b 0a 20  if( objc>=6 ){. 
139b0 20 20 20 20 20 7a 53 65 70 20 3d 20 54 63 6c 5f       zSep = Tcl_
139c0 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
139d0 28 6f 62 6a 76 5b 35 5d 2c 20 30 29 3b 0a 20 20  (objv[5], 0);.  
139e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a    }else{.      z
139f0 53 65 70 20 3d 20 22 5c 74 22 3b 0a 20 20 20 20  Sep = "\t";.    
13a00 7d 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 3d  }.    if( objc>=
13a10 37 20 29 7b 0a 20 20 20 20 20 20 7a 4e 75 6c 6c  7 ){.      zNull
13a20 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
13a30 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 36 5d 2c  FromObj(objv[6],
13a40 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   0);.    }else{.
13a50 20 20 20 20 20 20 7a 4e 75 6c 6c 20 3d 20 22 22        zNull = ""
13a60 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 43 6f 6e  ;.    }.    zCon
13a70 66 6c 69 63 74 20 3d 20 54 63 6c 5f 47 65 74 53  flict = Tcl_GetS
13a80 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
13a90 76 5b 32 5d 2c 20 30 29 3b 0a 20 20 20 20 7a 54  v[2], 0);.    zT
13aa0 61 62 6c 65 20 3d 20 54 63 6c 5f 47 65 74 53 74  able = Tcl_GetSt
13ab0 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
13ac0 5b 33 5d 2c 20 30 29 3b 0a 20 20 20 20 7a 46 69  [3], 0);.    zFi
13ad0 6c 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  le = Tcl_GetStri
13ae0 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 34  ngFromObj(objv[4
13af0 5d 2c 20 30 29 3b 0a 20 20 20 20 6e 53 65 70 20  ], 0);.    nSep 
13b00 3d 20 73 74 72 6c 65 6e 33 30 28 7a 53 65 70 29  = strlen30(zSep)
13b10 3b 0a 20 20 20 20 6e 4e 75 6c 6c 20 3d 20 73 74  ;.    nNull = st
13b20 72 6c 65 6e 33 30 28 7a 4e 75 6c 6c 29 3b 0a 20  rlen30(zNull);. 
13b30 20 20 20 69 66 28 20 6e 53 65 70 3d 3d 30 20 29     if( nSep==0 )
13b40 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65  {.      Tcl_Appe
13b50 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
13b60 22 45 72 72 6f 72 3a 20 6e 6f 6e 2d 6e 75 6c 6c  "Error: non-null
13b70 20 73 65 70 61 72 61 74 6f 72 20 72 65 71 75 69   separator requi
13b80 72 65 64 20 66 6f 72 20 63 6f 70 79 22 2c 0a 20  red for copy",. 
13b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ba0 20 20 20 20 20 20 28 63 68 61 72 2a 29 30 29 3b        (char*)0);
13bb0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
13bc0 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
13bd0 20 20 20 69 66 28 73 74 72 63 6d 70 28 7a 43 6f     if(strcmp(zCo
13be0 6e 66 6c 69 63 74 2c 20 22 72 6f 6c 6c 62 61 63  nflict, "rollbac
13bf0 6b 22 29 20 21 3d 20 30 20 26 26 0a 20 20 20 20  k") != 0 &&.    
13c00 20 20 20 73 74 72 63 6d 70 28 7a 43 6f 6e 66 6c     strcmp(zConfl
13c10 69 63 74 2c 20 22 61 62 6f 72 74 22 20 20 20 29  ict, "abort"   )
13c20 20 21 3d 20 30 20 26 26 0a 20 20 20 20 20 20 20   != 0 &&.       
13c30 73 74 72 63 6d 70 28 7a 43 6f 6e 66 6c 69 63 74  strcmp(zConflict
13c40 2c 20 22 66 61 69 6c 22 20 20 20 20 29 20 21 3d  , "fail"    ) !=
13c50 20 30 20 26 26 0a 20 20 20 20 20 20 20 73 74 72   0 &&.       str
13c60 63 6d 70 28 7a 43 6f 6e 66 6c 69 63 74 2c 20 22  cmp(zConflict, "
13c70 69 67 6e 6f 72 65 22 20 20 29 20 21 3d 20 30 20  ignore"  ) != 0 
13c80 26 26 0a 20 20 20 20 20 20 20 73 74 72 63 6d 70  &&.       strcmp
13c90 28 7a 43 6f 6e 66 6c 69 63 74 2c 20 22 72 65 70  (zConflict, "rep
13ca0 6c 61 63 65 22 20 29 20 21 3d 20 30 20 29 20 7b  lace" ) != 0 ) {
13cb0 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  .      Tcl_Appen
13cc0 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
13cd0 22 45 72 72 6f 72 3a 20 5c 22 22 2c 20 7a 43 6f  "Error: \"", zCo
13ce0 6e 66 6c 69 63 74 2c 0a 20 20 20 20 20 20 20 20  nflict,.        
13cf0 20 20 20 20 22 5c 22 2c 20 63 6f 6e 66 6c 69 63      "\", conflic
13d00 74 2d 61 6c 67 6f 72 69 74 68 6d 20 6d 75 73 74  t-algorithm must
13d10 20 62 65 20 6f 6e 65 20 6f 66 3a 20 72 6f 6c 6c   be one of: roll
13d20 62 61 63 6b 2c 20 22 0a 20 20 20 20 20 20 20 20  back, ".        
13d30 20 20 20 20 22 61 62 6f 72 74 2c 20 66 61 69 6c      "abort, fail
13d40 2c 20 69 67 6e 6f 72 65 2c 20 6f 72 20 72 65 70  , ignore, or rep
13d50 6c 61 63 65 22 2c 20 28 63 68 61 72 2a 29 30 29  lace", (char*)0)
13d60 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
13d70 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
13d80 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74      zSql = sqlit
13d90 65 33 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c 45  e3_mprintf("SELE
13da0 43 54 20 2a 20 46 52 4f 4d 20 27 25 71 27 22 2c  CT * FROM '%q'",
13db0 20 7a 54 61 62 6c 65 29 3b 0a 20 20 20 20 69 66   zTable);.    if
13dc0 28 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20  ( zSql==0 ){.   
13dd0 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
13de0 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 45 72 72  ult(interp, "Err
13df0 6f 72 3a 20 6e 6f 20 73 75 63 68 20 74 61 62 6c  or: no such tabl
13e00 65 3a 20 22 2c 20 7a 54 61 62 6c 65 2c 20 28 63  e: ", zTable, (c
13e10 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 72  har*)0);.      r
13e20 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
13e30 0a 20 20 20 20 7d 0a 20 20 20 20 6e 42 79 74 65  .    }.    nByte
13e40 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 53 71 6c   = strlen30(zSql
13e50 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
13e60 74 65 33 5f 70 72 65 70 61 72 65 28 70 44 62 2d  te3_prepare(pDb-
13e70 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26  >db, zSql, -1, &
13e80 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 73  pStmt, 0);.    s
13e90 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c  qlite3_free(zSql
13ea0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  );.    if( rc ){
13eb0 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  .      Tcl_Appen
13ec0 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
13ed0 22 45 72 72 6f 72 3a 20 22 2c 20 73 71 6c 69 74  "Error: ", sqlit
13ee0 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64  e3_errmsg(pDb->d
13ef0 62 29 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20  b), (char*)0);. 
13f00 20 20 20 20 20 6e 43 6f 6c 20 3d 20 30 3b 0a 20       nCol = 0;. 
13f10 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
13f20 6e 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63  nCol = sqlite3_c
13f30 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70 53 74 6d  olumn_count(pStm
13f40 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  t);.    }.    sq
13f50 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
13f60 53 74 6d 74 29 3b 0a 20 20 20 20 69 66 28 20 6e  Stmt);.    if( n
13f70 43 6f 6c 3d 3d 30 20 29 20 7b 0a 20 20 20 20 20  Col==0 ) {.     
13f80 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
13f90 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 53 71  R;.    }.    zSq
13fa0 6c 20 3d 20 6d 61 6c 6c 6f 63 28 20 6e 42 79 74  l = malloc( nByt
13fb0 65 20 2b 20 35 30 20 2b 20 6e 43 6f 6c 2a 32 20  e + 50 + nCol*2 
13fc0 29 3b 0a 20 20 20 20 69 66 28 20 7a 53 71 6c 3d  );.    if( zSql=
13fd0 3d 30 20 29 20 7b 0a 20 20 20 20 20 20 54 63 6c  =0 ) {.      Tcl
13fe0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
13ff0 74 65 72 70 2c 20 22 45 72 72 6f 72 3a 20 63 61  terp, "Error: ca
14000 6e 27 74 20 6d 61 6c 6c 6f 63 28 29 22 2c 20 28  n't malloc()", (
14010 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20  char*)0);.      
14020 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
14030 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
14040 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 79  te3_snprintf(nBy
14050 74 65 2b 35 30 2c 20 7a 53 71 6c 2c 20 22 49 4e  te+50, zSql, "IN
14060 53 45 52 54 20 4f 52 20 25 71 20 49 4e 54 4f 20  SERT OR %q INTO 
14070 27 25 71 27 20 56 41 4c 55 45 53 28 3f 22 2c 0a  '%q' VALUES(?",.
14080 20 20 20 20 20 20 20 20 20 7a 43 6f 6e 66 6c 69           zConfli
14090 63 74 2c 20 7a 54 61 62 6c 65 29 3b 0a 20 20 20  ct, zTable);.   
140a0 20 6a 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 53   j = strlen30(zS
140b0 71 6c 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31  ql);.    for(i=1
140c0 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  ; i<nCol; i++){.
140d0 20 20 20 20 20 20 7a 53 71 6c 5b 6a 2b 2b 5d 20        zSql[j++] 
140e0 3d 20 27 2c 27 3b 0a 20 20 20 20 20 20 7a 53 71  = ',';.      zSq
140f0 6c 5b 6a 2b 2b 5d 20 3d 20 27 3f 27 3b 0a 20 20  l[j++] = '?';.  
14100 20 20 7d 0a 20 20 20 20 7a 53 71 6c 5b 6a 2b 2b    }.    zSql[j++
14110 5d 20 3d 20 27 29 27 3b 0a 20 20 20 20 7a 53 71  ] = ')';.    zSq
14120 6c 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 72 63  l[j] = 0;.    rc
14130 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61   = sqlite3_prepa
14140 72 65 28 70 44 62 2d 3e 64 62 2c 20 7a 53 71 6c  re(pDb->db, zSql
14150 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29  , -1, &pStmt, 0)
14160 3b 0a 20 20 20 20 66 72 65 65 28 7a 53 71 6c 29  ;.    free(zSql)
14170 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  ;.    if( rc ){.
14180 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
14190 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
141a0 45 72 72 6f 72 3a 20 22 2c 20 73 71 6c 69 74 65  Error: ", sqlite
141b0 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62  3_errmsg(pDb->db
141c0 29 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  ), (char*)0);.  
141d0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61      sqlite3_fina
141e0 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20  lize(pStmt);.   
141f0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
14200 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ROR;.    }.    i
14210 6e 20 3d 20 66 6f 70 65 6e 28 7a 46 69 6c 65 2c  n = fopen(zFile,
14220 20 22 72 62 22 29 3b 0a 20 20 20 20 69 66 28 20   "rb");.    if( 
14230 69 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 54  in==0 ){.      T
14240 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
14250 69 6e 74 65 72 70 2c 20 22 45 72 72 6f 72 3a 20  interp, "Error: 
14260 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 66 69 6c 65  cannot open file
14270 3a 20 22 2c 20 7a 46 69 6c 65 2c 20 28 63 68 61  : ", zFile, (cha
14280 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  r*)0);.      sql
14290 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53  ite3_finalize(pS
142a0 74 6d 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75  tmt);.      retu
142b0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
142c0 20 20 7d 0a 20 20 20 20 61 7a 43 6f 6c 20 3d 20    }.    azCol = 
142d0 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 61  malloc( sizeof(a
142e0 7a 43 6f 6c 5b 30 5d 29 2a 28 6e 43 6f 6c 2b 31  zCol[0])*(nCol+1
142f0 29 20 29 3b 0a 20 20 20 20 69 66 28 20 61 7a 43  ) );.    if( azC
14300 6f 6c 3d 3d 30 20 29 20 7b 0a 20 20 20 20 20 20  ol==0 ) {.      
14310 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
14320 28 69 6e 74 65 72 70 2c 20 22 45 72 72 6f 72 3a  (interp, "Error:
14330 20 63 61 6e 27 74 20 6d 61 6c 6c 6f 63 28 29 22   can't malloc()"
14340 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20  , (char*)0);.   
14350 20 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20     fclose(in);. 
14360 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
14370 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
14380 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33 5f 65   (void)sqlite3_e
14390 78 65 63 28 70 44 62 2d 3e 64 62 2c 20 22 42 45  xec(pDb->db, "BE
143a0 47 49 4e 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  GIN", 0, 0, 0);.
143b0 20 20 20 20 7a 43 6f 6d 6d 69 74 20 3d 20 22 43      zCommit = "C
143c0 4f 4d 4d 49 54 22 3b 0a 20 20 20 20 77 68 69 6c  OMMIT";.    whil
143d0 65 28 20 28 7a 4c 69 6e 65 20 3d 20 6c 6f 63 61  e( (zLine = loca
143e0 6c 5f 67 65 74 6c 69 6e 65 28 30 2c 20 69 6e 29  l_getline(0, in)
143f0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 68  )!=0 ){.      ch
14400 61 72 20 2a 7a 3b 0a 20 20 20 20 20 20 6c 69 6e  ar *z;.      lin
14410 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 61 7a 43  eno++;.      azC
14420 6f 6c 5b 30 5d 20 3d 20 7a 4c 69 6e 65 3b 0a 20  ol[0] = zLine;. 
14430 20 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 7a 3d       for(i=0, z=
14440 7a 4c 69 6e 65 3b 20 2a 7a 3b 20 7a 2b 2b 29 7b  zLine; *z; z++){
14450 0a 20 20 20 20 20 20 20 20 69 66 28 20 2a 7a 3d  .        if( *z=
14460 3d 7a 53 65 70 5b 30 5d 20 26 26 20 73 74 72 6e  =zSep[0] && strn
14470 63 6d 70 28 7a 2c 20 7a 53 65 70 2c 20 6e 53 65  cmp(z, zSep, nSe
14480 70 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  p)==0 ){.       
14490 20 20 20 2a 7a 20 3d 20 30 3b 0a 20 20 20 20 20     *z = 0;.     
144a0 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20       i++;.      
144b0 20 20 20 20 69 66 28 20 69 3c 6e 43 6f 6c 20 29      if( i<nCol )
144c0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 7a  {.            az
144d0 43 6f 6c 5b 69 5d 20 3d 20 26 7a 5b 6e 53 65 70  Col[i] = &z[nSep
144e0 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a  ];.            z
144f0 20 2b 3d 20 6e 53 65 70 2d 31 3b 0a 20 20 20 20   += nSep-1;.    
14500 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
14510 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
14520 69 66 28 20 69 2b 31 21 3d 6e 43 6f 6c 20 29 7b  if( i+1!=nCol ){
14530 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a  .        char *z
14540 45 72 72 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  Err;.        int
14550 20 6e 45 72 72 20 3d 20 73 74 72 6c 65 6e 33 30   nErr = strlen30
14560 28 7a 46 69 6c 65 29 20 2b 20 32 30 30 3b 0a 20  (zFile) + 200;. 
14570 20 20 20 20 20 20 20 7a 45 72 72 20 3d 20 6d 61         zErr = ma
14580 6c 6c 6f 63 28 6e 45 72 72 29 3b 0a 20 20 20 20  lloc(nErr);.    
14590 20 20 20 20 69 66 28 20 7a 45 72 72 20 29 7b 0a      if( zErr ){.
145a0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
145b0 33 5f 73 6e 70 72 69 6e 74 66 28 6e 45 72 72 2c  3_snprintf(nErr,
145c0 20 7a 45 72 72 2c 0a 20 20 20 20 20 20 20 20 20   zErr,.         
145d0 20 20 20 20 22 45 72 72 6f 72 3a 20 25 73 20 6c      "Error: %s l
145e0 69 6e 65 20 25 64 3a 20 65 78 70 65 63 74 65 64  ine %d: expected
145f0 20 25 64 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 64   %d columns of d
14600 61 74 61 20 62 75 74 20 66 6f 75 6e 64 20 25 64  ata but found %d
14610 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
14620 7a 46 69 6c 65 2c 20 6c 69 6e 65 6e 6f 2c 20 6e  zFile, lineno, n
14630 43 6f 6c 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20  Col, i+1);.     
14640 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
14650 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 45  esult(interp, zE
14660 72 72 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20  rr, (char*)0);. 
14670 20 20 20 20 20 20 20 20 20 66 72 65 65 28 7a 45           free(zE
14680 72 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  rr);.        }. 
14690 20 20 20 20 20 20 20 7a 43 6f 6d 6d 69 74 20 3d         zCommit =
146a0 20 22 52 4f 4c 4c 42 41 43 4b 22 3b 0a 20 20 20   "ROLLBACK";.   
146b0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
146c0 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d    }.      for(i=
146d0 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  0; i<nCol; i++){
146e0 0a 20 20 20 20 20 20 20 20 2f 2a 20 63 68 65 63  .        /* chec
146f0 6b 20 66 6f 72 20 6e 75 6c 6c 20 64 61 74 61 2c  k for null data,
14700 20 69 66 20 73 6f 2c 20 62 69 6e 64 20 61 73 20   if so, bind as 
14710 6e 75 6c 6c 20 2a 2f 0a 20 20 20 20 20 20 20 20  null */.        
14720 69 66 28 20 28 6e 4e 75 6c 6c 3e 30 20 26 26 20  if( (nNull>0 && 
14730 73 74 72 63 6d 70 28 61 7a 43 6f 6c 5b 69 5d 2c  strcmp(azCol[i],
14740 20 7a 4e 75 6c 6c 29 3d 3d 30 29 0a 20 20 20 20   zNull)==0).    
14750 20 20 20 20 20 20 7c 7c 20 73 74 72 6c 65 6e 33        || strlen3
14760 30 28 61 7a 43 6f 6c 5b 69 5d 29 3d 3d 30 0a 20  0(azCol[i])==0. 
14770 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
14780 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
14790 5f 6e 75 6c 6c 28 70 53 74 6d 74 2c 20 69 2b 31  _null(pStmt, i+1
147a0 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
147b0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
147c0 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 53  te3_bind_text(pS
147d0 74 6d 74 2c 20 69 2b 31 2c 20 61 7a 43 6f 6c 5b  tmt, i+1, azCol[
147e0 69 5d 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53  i], -1, SQLITE_S
147f0 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 20 20  TATIC);.        
14800 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
14810 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74  sqlite3_step(pSt
14820 6d 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  mt);.      rc = 
14830 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53  sqlite3_reset(pS
14840 74 6d 74 29 3b 0a 20 20 20 20 20 20 66 72 65 65  tmt);.      free
14850 28 7a 4c 69 6e 65 29 3b 0a 20 20 20 20 20 20 69  (zLine);.      i
14860 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
14870 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f   ){.        Tcl_
14880 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
14890 65 72 70 2c 22 45 72 72 6f 72 3a 20 22 2c 20 73  erp,"Error: ", s
148a0 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44  qlite3_errmsg(pD
148b0 62 2d 3e 64 62 29 2c 20 28 63 68 61 72 2a 29 30  b->db), (char*)0
148c0 29 3b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6d 6d  );.        zComm
148d0 69 74 20 3d 20 22 52 4f 4c 4c 42 41 43 4b 22 3b  it = "ROLLBACK";
148e0 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
148f0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
14900 20 20 66 72 65 65 28 61 7a 43 6f 6c 29 3b 0a 20    free(azCol);. 
14910 20 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20     fclose(in);. 
14920 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c     sqlite3_final
14930 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  ize(pStmt);.    
14940 28 76 6f 69 64 29 73 71 6c 69 74 65 33 5f 65 78  (void)sqlite3_ex
14950 65 63 28 70 44 62 2d 3e 64 62 2c 20 7a 43 6f 6d  ec(pDb->db, zCom
14960 6d 69 74 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 0a  mit, 0, 0, 0);..
14970 20 20 20 20 69 66 28 20 7a 43 6f 6d 6d 69 74 5b      if( zCommit[
14980 30 5d 20 3d 3d 20 27 43 27 20 29 7b 0a 20 20 20  0] == 'C' ){.   
14990 20 20 20 2f 2a 20 73 75 63 63 65 73 73 2c 20 73     /* success, s
149a0 65 74 20 72 65 73 75 6c 74 20 61 73 20 6e 75 6d  et result as num
149b0 62 65 72 20 6f 66 20 6c 69 6e 65 73 20 70 72 6f  ber of lines pro
149c0 63 65 73 73 65 64 20 2a 2f 0a 20 20 20 20 20 20  cessed */.      
149d0 70 52 65 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65  pResult = Tcl_Ge
149e0 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
149f0 70 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 53 65  p);.      Tcl_Se
14a00 74 49 6e 74 4f 62 6a 28 70 52 65 73 75 6c 74 2c  tIntObj(pResult,
14a10 20 6c 69 6e 65 6e 6f 29 3b 0a 20 20 20 20 20 20   lineno);.      
14a20 72 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20  rc = TCL_OK;.   
14a30 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
14a40 20 66 61 69 6c 75 72 65 2c 20 61 70 70 65 6e 64   failure, append
14a50 20 6c 69 6e 65 6e 6f 20 77 68 65 72 65 20 66 61   lineno where fa
14a60 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20 73 71  iled */.      sq
14a70 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
14a80 69 7a 65 6f 66 28 7a 4c 69 6e 65 4e 75 6d 29 2c  izeof(zLineNum),
14a90 20 7a 4c 69 6e 65 4e 75 6d 2c 22 25 64 22 2c 6c   zLineNum,"%d",l
14aa0 69 6e 65 6e 6f 29 3b 0a 20 20 20 20 20 20 54 63  ineno);.      Tc
14ab0 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
14ac0 6e 74 65 72 70 2c 22 2c 20 66 61 69 6c 65 64 20  nterp,", failed 
14ad0 77 68 69 6c 65 20 70 72 6f 63 65 73 73 69 6e 67  while processing
14ae0 20 6c 69 6e 65 3a 20 22 2c 7a 4c 69 6e 65 4e 75   line: ",zLineNu
14af0 6d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  m,.             
14b00 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
14b10 29 30 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  )0);.      rc = 
14b20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
14b30 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
14b40 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24  .  /*.  **     $
14b50 64 62 20 64 65 73 65 72 69 61 6c 69 7a 65 20 3f  db deserialize ?
14b60 2d 6d 61 78 73 69 7a 65 20 4e 3f 20 3f 2d 72 65  -maxsize N? ?-re
14b70 61 64 6f 6e 6c 79 20 42 4f 4f 4c 3f 20 3f 44 41  adonly BOOL? ?DA
14b80 54 41 42 41 53 45 3f 20 56 41 4c 55 45 0a 20 20  TABASE? VALUE.  
14b90 2a 2a 0a 20 20 2a 2a 20 52 65 6f 70 65 6e 20 44  **.  ** Reopen D
14ba0 41 54 41 42 41 53 45 20 28 64 65 66 61 75 6c 74  ATABASE (default
14bb0 20 22 6d 61 69 6e 22 29 20 75 73 69 6e 67 20 74   "main") using t
14bc0 68 65 20 63 6f 6e 74 65 6e 74 20 69 6e 20 24 56  he content in $V
14bd0 41 4c 55 45 0a 20 20 2a 2f 0a 20 20 63 61 73 65  ALUE.  */.  case
14be0 20 44 42 5f 44 45 53 45 52 49 41 4c 49 5a 45 3a   DB_DESERIALIZE:
14bf0 20 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   {.#ifndef SQLIT
14c00 45 5f 45 4e 41 42 4c 45 5f 44 45 53 45 52 49 41  E_ENABLE_DESERIA
14c10 4c 49 5a 45 0a 20 20 20 20 54 63 6c 5f 41 70 70  LIZE.    Tcl_App
14c20 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
14c30 2c 20 22 4d 45 4d 44 42 20 6e 6f 74 20 61 76 61  , "MEMDB not ava
14c40 69 6c 61 62 6c 65 20 69 6e 20 74 68 69 73 20 62  ilable in this b
14c50 75 69 6c 64 22 2c 0a 20 20 20 20 20 20 20 20 20  uild",.         
14c60 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
14c70 72 2a 29 30 29 3b 0a 20 20 20 20 72 63 20 3d 20  r*)0);.    rc = 
14c80 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65  TCL_ERROR;.#else
14c90 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
14ca0 2a 7a 53 63 68 65 6d 61 20 3d 20 30 3b 0a 20 20  *zSchema = 0;.  
14cb0 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 56 61 6c 75    Tcl_Obj *pValu
14cc0 65 20 3d 20 30 3b 0a 20 20 20 20 75 6e 73 69 67  e = 0;.    unsig
14cd0 6e 65 64 20 63 68 61 72 20 2a 70 42 41 3b 0a 20  ned char *pBA;. 
14ce0 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72     unsigned char
14cf0 20 2a 70 44 61 74 61 3b 0a 20 20 20 20 69 6e 74   *pData;.    int
14d00 20 6c 65 6e 2c 20 78 72 63 3b 0a 20 20 20 20 73   len, xrc;.    s
14d10 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d 78 53  qlite3_int64 mxS
14d20 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  ize = 0;.    int
14d30 20 69 3b 0a 20 20 20 20 69 6e 74 20 69 73 52 65   i;.    int isRe
14d40 61 64 6f 6e 6c 79 20 3d 20 30 3b 0a 0a 0a 20 20  adonly = 0;...  
14d50 20 20 69 66 28 20 6f 62 6a 63 3c 33 20 29 7b 0a    if( objc<3 ){.
14d60 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
14d70 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
14d80 2c 20 6f 62 6a 76 2c 20 22 3f 44 41 54 41 42 41  , objv, "?DATABA
14d90 53 45 3f 20 56 41 4c 55 45 22 29 3b 0a 20 20 20  SE? VALUE");.   
14da0 20 20 20 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f     rc = TCL_ERRO
14db0 52 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  R;.      break;.
14dc0 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d      }.    for(i=
14dd0 32 3b 20 69 3c 6f 62 6a 63 2d 31 3b 20 69 2b 2b  2; i<objc-1; i++
14de0 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  ){.      const c
14df0 68 61 72 20 2a 7a 20 3d 20 54 63 6c 5f 47 65 74  har *z = Tcl_Get
14e00 53 74 72 69 6e 67 28 6f 62 6a 76 5b 69 5d 29 3b  String(objv[i]);
14e10 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d  .      if( strcm
14e20 70 28 7a 2c 22 2d 6d 61 78 73 69 7a 65 22 29 3d  p(z,"-maxsize")=
14e30 3d 30 20 26 26 20 69 3c 6f 62 6a 63 2d 32 20 29  =0 && i<objc-2 )
14e40 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 54  {.        rc = T
14e50 63 6c 5f 47 65 74 57 69 64 65 49 6e 74 46 72 6f  cl_GetWideIntFro
14e60 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
14e70 76 5b 2b 2b 69 5d 2c 20 26 6d 78 53 69 7a 65 29  v[++i], &mxSize)
14e80 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
14e90 20 29 20 67 6f 74 6f 20 64 65 73 65 72 69 61 6c   ) goto deserial
14ea0 69 7a 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20  ize_error;.     
14eb0 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
14ec0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 73     }.      if( s
14ed0 74 72 63 6d 70 28 7a 2c 22 2d 72 65 61 64 6f 6e  trcmp(z,"-readon
14ee0 6c 79 22 29 3d 3d 30 20 26 26 20 69 3c 6f 62 6a  ly")==0 && i<obj
14ef0 63 2d 32 20 29 7b 0a 20 20 20 20 20 20 20 20 72  c-2 ){.        r
14f00 63 20 3d 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65  c = Tcl_GetBoole
14f10 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  anFromObj(interp
14f20 2c 20 6f 62 6a 76 5b 2b 2b 69 5d 2c 20 26 69 73  , objv[++i], &is
14f30 52 65 61 64 6f 6e 6c 79 29 3b 0a 20 20 20 20 20  Readonly);.     
14f40 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
14f50 20 64 65 73 65 72 69 61 6c 69 7a 65 5f 65 72 72   deserialize_err
14f60 6f 72 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74  or;.        cont
14f70 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  inue;.      }.  
14f80 20 20 20 20 69 66 28 20 7a 53 63 68 65 6d 61 3d      if( zSchema=
14f90 3d 30 20 26 26 20 69 3d 3d 6f 62 6a 63 2d 32 20  =0 && i==objc-2 
14fa0 26 26 20 7a 5b 30 5d 21 3d 27 2d 27 20 29 7b 0a  && z[0]!='-' ){.
14fb0 20 20 20 20 20 20 20 20 7a 53 63 68 65 6d 61 20          zSchema 
14fc0 3d 20 7a 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e  = z;.        con
14fd0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20  tinue;.      }. 
14fe0 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
14ff0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75  esult(interp, "u
15000 6e 6b 6e 6f 77 6e 20 6f 70 74 69 6f 6e 3a 20 22  nknown option: "
15010 2c 20 7a 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  , z, (char*)0);.
15020 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45        rc = TCL_E
15030 52 52 4f 52 3b 0a 20 20 20 20 20 20 67 6f 74 6f  RROR;.      goto
15040 20 64 65 73 65 72 69 61 6c 69 7a 65 5f 65 72 72   deserialize_err
15050 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 56  or;.    }.    pV
15060 61 6c 75 65 20 3d 20 6f 62 6a 76 5b 6f 62 6a 63  alue = objv[objc
15070 2d 31 5d 3b 0a 20 20 20 20 70 42 41 20 3d 20 54  -1];.    pBA = T
15080 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79 46  cl_GetByteArrayF
15090 72 6f 6d 4f 62 6a 28 70 56 61 6c 75 65 2c 20 26  romObj(pValue, &
150a0 6c 65 6e 29 3b 0a 20 20 20 20 70 44 61 74 61 20  len);.    pData 
150b0 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
150c0 36 34 28 20 6c 65 6e 20 29 3b 0a 20 20 20 20 69  64( len );.    i
150d0 66 28 20 70 44 61 74 61 3d 3d 30 20 26 26 20 6c  f( pData==0 && l
150e0 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 54 63  en>0 ){.      Tc
150f0 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
15100 6e 74 65 72 70 2c 20 22 6f 75 74 20 6f 66 20 6d  nterp, "out of m
15110 65 6d 6f 72 79 22 2c 20 28 63 68 61 72 2a 29 30  emory", (char*)0
15120 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 54 43  );.      rc = TC
15130 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c  L_ERROR;.    }el
15140 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 66 6c  se{.      int fl
15150 61 67 73 3b 0a 20 20 20 20 20 20 69 66 28 20 6c  ags;.      if( l
15160 65 6e 3e 30 20 29 20 6d 65 6d 63 70 79 28 70 44  en>0 ) memcpy(pD
15170 61 74 61 2c 20 70 42 41 2c 20 6c 65 6e 29 3b 0a  ata, pBA, len);.
15180 20 20 20 20 20 20 69 66 28 20 69 73 52 65 61 64        if( isRead
15190 6f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 20 20  only ){.        
151a0 66 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 44  flags = SQLITE_D
151b0 45 53 45 52 49 41 4c 49 5a 45 5f 46 52 45 45 4f  ESERIALIZE_FREEO
151c0 4e 43 4c 4f 53 45 20 7c 20 53 51 4c 49 54 45 5f  NCLOSE | SQLITE_
151d0 44 45 53 45 52 49 41 4c 49 5a 45 5f 52 45 41 44  DESERIALIZE_READ
151e0 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ONLY;.      }els
151f0 65 7b 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73  e{.        flags
15200 20 3d 20 53 51 4c 49 54 45 5f 44 45 53 45 52 49   = SQLITE_DESERI
15210 41 4c 49 5a 45 5f 46 52 45 45 4f 4e 43 4c 4f 53  ALIZE_FREEONCLOS
15220 45 20 7c 20 53 51 4c 49 54 45 5f 44 45 53 45 52  E | SQLITE_DESER
15230 49 41 4c 49 5a 45 5f 52 45 53 49 5a 45 41 42 4c  IALIZE_RESIZEABL
15240 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  E;.      }.     
15250 20 78 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 64   xrc = sqlite3_d
15260 65 73 65 72 69 61 6c 69 7a 65 28 70 44 62 2d 3e  eserialize(pDb->
15270 64 62 2c 20 7a 53 63 68 65 6d 61 2c 20 70 44 61  db, zSchema, pDa
15280 74 61 2c 20 6c 65 6e 2c 20 6c 65 6e 2c 20 66 6c  ta, len, len, fl
15290 61 67 73 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ags);.      if( 
152a0 78 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 54  xrc ){.        T
152b0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
152c0 69 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 20  interp, "unable 
152d0 74 6f 20 73 65 74 20 4d 45 4d 44 42 20 63 6f 6e  to set MEMDB con
152e0 74 65 6e 74 22 2c 20 28 63 68 61 72 2a 29 30 29  tent", (char*)0)
152f0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 54  ;.        rc = T
15300 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  CL_ERROR;.      
15310 7d 0a 20 20 20 20 20 20 69 66 28 20 6d 78 53 69  }.      if( mxSi
15320 7a 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ze>0 ){.        
15330 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e  sqlite3_file_con
15340 74 72 6f 6c 28 70 44 62 2d 3e 64 62 2c 20 7a 53  trol(pDb->db, zS
15350 63 68 65 6d 61 2c 53 51 4c 49 54 45 5f 46 43 4e  chema,SQLITE_FCN
15360 54 4c 5f 53 49 5a 45 5f 4c 49 4d 49 54 2c 26 6d  TL_SIZE_LIMIT,&m
15370 78 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a  xSize);.      }.
15380 20 20 20 20 7d 0a 64 65 73 65 72 69 61 6c 69 7a      }.deserializ
15390 65 5f 65 72 72 6f 72 3a 0a 23 65 6e 64 69 66 0a  e_error:.#endif.
153a0 20 20 20 20 62 72 65 61 6b 3b 20 0a 20 20 7d 0a      break; .  }.
153b0 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 24 64  .  /*.  **    $d
153c0 62 20 65 6e 61 62 6c 65 5f 6c 6f 61 64 5f 65 78  b enable_load_ex
153d0 74 65 6e 73 69 6f 6e 20 42 4f 4f 4c 45 41 4e 0a  tension BOOLEAN.
153e0 20 20 2a 2a 0a 20 20 2a 2a 20 54 75 72 6e 20 74    **.  ** Turn t
153f0 68 65 20 65 78 74 65 6e 73 69 6f 6e 20 6c 6f 61  he extension loa
15400 64 69 6e 67 20 66 65 61 74 75 72 65 20 6f 6e 20  ding feature on 
15410 6f 72 20 6f 66 66 2e 20 20 49 74 20 69 66 20 6f  or off.  It if o
15420 66 66 20 62 79 0a 20 20 2a 2a 20 64 65 66 61 75  ff by.  ** defau
15430 6c 74 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  lt..  */.  case 
15440 44 42 5f 45 4e 41 42 4c 45 5f 4c 4f 41 44 5f 45  DB_ENABLE_LOAD_E
15450 58 54 45 4e 53 49 4f 4e 3a 20 7b 0a 23 69 66 6e  XTENSION: {.#ifn
15460 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
15470 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 20  LOAD_EXTENSION. 
15480 20 20 20 69 6e 74 20 6f 6e 6f 66 66 3b 0a 20 20     int onoff;.  
15490 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b    if( objc!=3 ){
154a0 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  .      Tcl_Wrong
154b0 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
154c0 32 2c 20 6f 62 6a 76 2c 20 22 42 4f 4f 4c 45 41  2, objv, "BOOLEA
154d0 4e 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  N");.      retur
154e0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
154f0 20 7d 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 47   }.    if( Tcl_G
15500 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a  etBooleanFromObj
15510 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d  (interp, objv[2]
15520 2c 20 26 6f 6e 6f 66 66 29 20 29 7b 0a 20 20 20  , &onoff) ){.   
15530 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
15540 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ROR;.    }.    s
15550 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 6c 6f  qlite3_enable_lo
15560 61 64 5f 65 78 74 65 6e 73 69 6f 6e 28 70 44 62  ad_extension(pDb
15570 2d 3e 64 62 2c 20 6f 6e 6f 66 66 29 3b 0a 20 20  ->db, onoff);.  
15580 20 20 62 72 65 61 6b 3b 0a 23 65 6c 73 65 0a 20    break;.#else. 
15590 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
155a0 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 65 78 74  ult(interp, "ext
155b0 65 6e 73 69 6f 6e 20 6c 6f 61 64 69 6e 67 20 69  ension loading i
155c0 73 20 74 75 72 6e 65 64 20 6f 66 66 20 61 74 20  s turned off at 
155d0 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 22 2c 0a 20  compile-time",. 
155e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
155f0 20 20 20 20 28 63 68 61 72 2a 29 30 29 3b 0a 20      (char*)0);. 
15600 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
15610 52 4f 52 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a  ROR;.#endif.  }.
15620 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 24 64  .  /*.  **    $d
15630 62 20 65 72 72 6f 72 63 6f 64 65 0a 20 20 2a 2a  b errorcode.  **
15640 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  .  ** Return the
15650 20 6e 75 6d 65 72 69 63 20 65 72 72 6f 72 20 63   numeric error c
15660 6f 64 65 20 74 68 61 74 20 77 61 73 20 72 65 74  ode that was ret
15670 75 72 6e 65 64 20 62 79 20 74 68 65 20 6d 6f 73  urned by the mos
15680 74 20 72 65 63 65 6e 74 0a 20 20 2a 2a 20 63 61  t recent.  ** ca
15690 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 78  ll to sqlite3_ex
156a0 65 63 28 29 2e 0a 20 20 2a 2f 0a 20 20 63 61 73  ec()..  */.  cas
156b0 65 20 44 42 5f 45 52 52 4f 52 43 4f 44 45 3a 20  e DB_ERRORCODE: 
156c0 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a  {.    Tcl_SetObj
156d0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
156e0 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 71 6c  cl_NewIntObj(sql
156f0 69 74 65 33 5f 65 72 72 63 6f 64 65 28 70 44 62  ite3_errcode(pDb
15700 2d 3e 64 62 29 29 29 3b 0a 20 20 20 20 62 72 65  ->db)));.    bre
15710 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  ak;.  }..  /*.  
15720 2a 2a 20 20 20 20 24 64 62 20 65 78 69 73 74 73  **    $db exists
15730 20 24 73 71 6c 0a 20 20 2a 2a 20 20 20 20 24 64   $sql.  **    $d
15740 62 20 6f 6e 65 63 6f 6c 75 6d 6e 20 24 73 71 6c  b onecolumn $sql
15750 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6f  .  **.  ** The o
15760 6e 65 63 6f 6c 75 6d 6e 20 6d 65 74 68 6f 64 20  necolumn method 
15770 69 73 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e  is the equivalen
15780 74 20 6f 66 3a 0a 20 20 2a 2a 20 20 20 20 20 6c  t of:.  **     l
15790 69 6e 64 65 78 20 5b 24 64 62 20 65 76 61 6c 20  index [$db eval 
157a0 24 73 71 6c 5d 20 30 0a 20 20 2a 2f 0a 20 20 63  $sql] 0.  */.  c
157b0 61 73 65 20 44 42 5f 45 58 49 53 54 53 3a 0a 20  ase DB_EXISTS:. 
157c0 20 63 61 73 65 20 44 42 5f 4f 4e 45 43 4f 4c 55   case DB_ONECOLU
157d0 4d 4e 3a 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62  MN: {.    Tcl_Ob
157e0 6a 20 2a 70 52 65 73 75 6c 74 20 3d 20 30 3b 0a  j *pResult = 0;.
157f0 20 20 20 20 44 62 45 76 61 6c 43 6f 6e 74 65 78      DbEvalContex
15800 74 20 73 45 76 61 6c 3b 0a 20 20 20 20 69 66 28  t sEval;.    if(
15810 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20   objc!=3 ){.    
15820 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
15830 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62  gs(interp, 2, ob
15840 6a 76 2c 20 22 53 51 4c 22 29 3b 0a 20 20 20 20  jv, "SQL");.    
15850 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
15860 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64  OR;.    }..    d
15870 62 45 76 61 6c 49 6e 69 74 28 26 73 45 76 61 6c  bEvalInit(&sEval
15880 2c 20 70 44 62 2c 20 6f 62 6a 76 5b 32 5d 2c 20  , pDb, objv[2], 
15890 30 2c 20 30 29 3b 0a 20 20 20 20 72 63 20 3d 20  0, 0);.    rc = 
158a0 64 62 45 76 61 6c 53 74 65 70 28 26 73 45 76 61  dbEvalStep(&sEva
158b0 6c 29 3b 0a 20 20 20 20 69 66 28 20 63 68 6f 69  l);.    if( choi
158c0 63 65 3d 3d 44 42 5f 4f 4e 45 43 4f 4c 55 4d 4e  ce==DB_ONECOLUMN
158d0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 72 63   ){.      if( rc
158e0 3d 3d 54 43 4c 5f 4f 4b 20 29 7b 0a 20 20 20 20  ==TCL_OK ){.    
158f0 20 20 20 20 70 52 65 73 75 6c 74 20 3d 20 64 62      pResult = db
15900 45 76 61 6c 43 6f 6c 75 6d 6e 56 61 6c 75 65 28  EvalColumnValue(
15910 26 73 45 76 61 6c 2c 20 30 29 3b 0a 20 20 20 20  &sEval, 0);.    
15920 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d    }else if( rc==
15930 54 43 4c 5f 42 52 45 41 4b 20 29 7b 0a 20 20 20  TCL_BREAK ){.   
15940 20 20 20 20 20 54 63 6c 5f 52 65 73 65 74 52 65       Tcl_ResetRe
15950 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  sult(interp);.  
15960 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
15970 69 66 28 20 72 63 3d 3d 54 43 4c 5f 42 52 45 41  if( rc==TCL_BREA
15980 4b 20 7c 7c 20 72 63 3d 3d 54 43 4c 5f 4f 4b 20  K || rc==TCL_OK 
15990 29 7b 0a 20 20 20 20 20 20 70 52 65 73 75 6c 74  ){.      pResult
159a0 20 3d 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61   = Tcl_NewBoolea
159b0 6e 4f 62 6a 28 72 63 3d 3d 54 43 4c 5f 4f 4b 29  nObj(rc==TCL_OK)
159c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 45 76  ;.    }.    dbEv
159d0 61 6c 46 69 6e 61 6c 69 7a 65 28 26 73 45 76 61  alFinalize(&sEva
159e0 6c 29 3b 0a 20 20 20 20 69 66 28 20 70 52 65 73  l);.    if( pRes
159f0 75 6c 74 20 29 20 54 63 6c 5f 53 65 74 4f 62 6a  ult ) Tcl_SetObj
15a00 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70  Result(interp, p
15a10 52 65 73 75 6c 74 29 3b 0a 0a 20 20 20 20 69 66  Result);..    if
15a20 28 20 72 63 3d 3d 54 43 4c 5f 42 52 45 41 4b 20  ( rc==TCL_BREAK 
15a30 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 54 43  ){.      rc = TC
15a40 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  L_OK;.    }.    
15a50 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
15a60 0a 20 20 2a 2a 20 20 20 20 24 64 62 20 65 76 61  .  **    $db eva
15a70 6c 20 3f 6f 70 74 69 6f 6e 73 3f 20 24 73 71 6c  l ?options? $sql
15a80 20 3f 61 72 72 61 79 3f 20 3f 7b 20 20 2e 2e 2e   ?array? ?{  ...
15a90 63 6f 64 65 2e 2e 2e 20 7d 3f 0a 20 20 2a 2a 0a  code... }?.  **.
15aa0 20 20 2a 2a 20 54 68 65 20 53 51 4c 20 73 74 61    ** The SQL sta
15ab0 74 65 6d 65 6e 74 20 69 6e 20 24 73 71 6c 20 69  tement in $sql i
15ac0 73 20 65 76 61 6c 75 61 74 65 64 2e 20 20 46 6f  s evaluated.  Fo
15ad0 72 20 65 61 63 68 20 72 6f 77 2c 20 74 68 65 20  r each row, the 
15ae0 76 61 6c 75 65 73 20 61 72 65 0a 20 20 2a 2a 20  values are.  ** 
15af0 70 6c 61 63 65 64 20 69 6e 20 65 6c 65 6d 65 6e  placed in elemen
15b00 74 73 20 6f 66 20 74 68 65 20 61 72 72 61 79 20  ts of the array 
15b10 6e 61 6d 65 64 20 22 61 72 72 61 79 22 20 61 6e  named "array" an
15b20 64 20 2e 2e 2e 63 6f 64 65 2e 2e 2e 20 69 73 20  d ...code... is 
15b30 65 78 65 63 75 74 65 64 2e 0a 20 20 2a 2a 20 49  executed..  ** I
15b40 66 20 22 61 72 72 61 79 22 20 61 6e 64 20 22 63  f "array" and "c
15b50 6f 64 65 22 20 61 72 65 20 6f 6d 69 74 74 65 64  ode" are omitted
15b60 2c 20 74 68 65 6e 20 6e 6f 20 63 61 6c 6c 62 61  , then no callba
15b70 63 6b 20 69 73 20 65 76 65 72 79 20 69 6e 76 6f  ck is every invo
15b80 6b 65 64 2e 0a 20 20 2a 2a 20 49 66 20 22 61 72  ked..  ** If "ar
15b90 72 61 79 22 20 69 73 20 61 6e 20 65 6d 70 74 79  ray" is an empty
15ba0 20 73 74 72 69 6e 67 2c 20 74 68 65 6e 20 74 68   string, then th
15bb0 65 20 76 61 6c 75 65 73 20 61 72 65 20 70 6c 61  e values are pla
15bc0 63 65 64 20 69 6e 20 76 61 72 69 61 62 6c 65 73  ced in variables
15bd0 0a 20 20 2a 2a 20 74 68 61 74 20 68 61 76 65 20  .  ** that have 
15be0 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 61 73  the same name as
15bf0 20 74 68 65 20 66 69 65 6c 64 73 20 65 78 74 72   the fields extr
15c00 61 63 74 65 64 20 62 79 20 74 68 65 20 71 75 65  acted by the que
15c10 72 79 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  ry..  */.  case 
15c20 44 42 5f 45 56 41 4c 3a 20 7b 0a 20 20 20 20 69  DB_EVAL: {.    i
15c30 6e 74 20 65 76 61 6c 46 6c 61 67 73 20 3d 20 30  nt evalFlags = 0
15c40 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
15c50 20 2a 7a 4f 70 74 3b 0a 20 20 20 20 77 68 69 6c   *zOpt;.    whil
15c60 65 28 20 6f 62 6a 63 3e 33 20 26 26 20 28 7a 4f  e( objc>3 && (zO
15c70 70 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  pt = Tcl_GetStri
15c80 6e 67 28 6f 62 6a 76 5b 32 5d 29 29 21 3d 30 20  ng(objv[2]))!=0 
15c90 26 26 20 7a 4f 70 74 5b 30 5d 3d 3d 27 2d 27 20  && zOpt[0]=='-' 
15ca0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72  ){.      if( str
15cb0 63 6d 70 28 7a 4f 70 74 2c 20 22 2d 77 69 74 68  cmp(zOpt, "-with
15cc0 6f 75 74 6e 75 6c 6c 73 22 29 3d 3d 30 20 29 7b  outnulls")==0 ){
15cd0 0a 20 20 20 20 20 20 20 20 65 76 61 6c 46 6c 61  .        evalFla
15ce0 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 45 56 41  gs |= SQLITE_EVA
15cf0 4c 5f 57 49 54 48 4f 55 54 4e 55 4c 4c 53 3b 0a  L_WITHOUTNULLS;.
15d00 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 65 6c        }.      el
15d10 73 65 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f  se{.        Tcl_
15d20 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
15d30 65 72 70 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6f 70  erp, "unknown op
15d40 74 69 6f 6e 3a 20 5c 22 22 2c 20 7a 4f 70 74 2c  tion: \"", zOpt,
15d50 20 22 5c 22 22 2c 20 28 76 6f 69 64 2a 29 30 29   "\"", (void*)0)
15d60 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
15d70 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
15d80 20 20 7d 0a 20 20 20 20 20 20 6f 62 6a 63 2d 2d    }.      objc--
15d90 3b 0a 20 20 20 20 20 20 6f 62 6a 76 2b 2b 3b 0a  ;.      objv++;.
15da0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 62      }.    if( ob
15db0 6a 63 3c 33 20 7c 7c 20 6f 62 6a 63 3e 35 20 29  jc<3 || objc>5 )
15dc0 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e  {.      Tcl_Wron
15dd0 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
15de0 20 32 2c 20 6f 62 6a 76 2c 20 0a 20 20 20 20 20   2, objv, .     
15df0 20 20 20 20 20 22 3f 4f 50 54 49 4f 4e 53 3f 20       "?OPTIONS? 
15e00 53 51 4c 20 3f 41 52 52 41 59 2d 4e 41 4d 45 3f  SQL ?ARRAY-NAME?
15e10 20 3f 53 43 52 49 50 54 3f 22 29 3b 0a 20 20 20   ?SCRIPT?");.   
15e20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
15e30 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ROR;.    }..    
15e40 69 66 28 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20  if( objc==3 ){. 
15e50 20 20 20 20 20 44 62 45 76 61 6c 43 6f 6e 74 65       DbEvalConte
15e60 78 74 20 73 45 76 61 6c 3b 0a 20 20 20 20 20 20  xt sEval;.      
15e70 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 74 20 3d 20  Tcl_Obj *pRet = 
15e80 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20 20  Tcl_NewObj();.  
15e90 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43      Tcl_IncrRefC
15ea0 6f 75 6e 74 28 70 52 65 74 29 3b 0a 20 20 20 20  ount(pRet);.    
15eb0 20 20 64 62 45 76 61 6c 49 6e 69 74 28 26 73 45    dbEvalInit(&sE
15ec0 76 61 6c 2c 20 70 44 62 2c 20 6f 62 6a 76 5b 32  val, pDb, objv[2
15ed0 5d 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  ], 0, 0);.      
15ee0 77 68 69 6c 65 28 20 54 43 4c 5f 4f 4b 3d 3d 28  while( TCL_OK==(
15ef0 72 63 20 3d 20 64 62 45 76 61 6c 53 74 65 70 28  rc = dbEvalStep(
15f00 26 73 45 76 61 6c 29 29 20 29 7b 0a 20 20 20 20  &sEval)) ){.    
15f10 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
15f20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 20     int nCol;.   
15f30 20 20 20 20 20 64 62 45 76 61 6c 52 6f 77 49 6e       dbEvalRowIn
15f40 66 6f 28 26 73 45 76 61 6c 2c 20 26 6e 43 6f 6c  fo(&sEval, &nCol
15f50 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 66 6f  , 0);.        fo
15f60 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69  r(i=0; i<nCol; i
15f70 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54  ++){.          T
15f80 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
15f90 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
15fa0 70 52 65 74 2c 20 64 62 45 76 61 6c 43 6f 6c 75  pRet, dbEvalColu
15fb0 6d 6e 56 61 6c 75 65 28 26 73 45 76 61 6c 2c 20  mnValue(&sEval, 
15fc0 69 29 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  i));.        }. 
15fd0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64 62 45       }.      dbE
15fe0 76 61 6c 46 69 6e 61 6c 69 7a 65 28 26 73 45 76  valFinalize(&sEv
15ff0 61 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  al);.      if( r
16000 63 3d 3d 54 43 4c 5f 42 52 45 41 4b 20 29 7b 0a  c==TCL_BREAK ){.
16010 20 20 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f          Tcl_SetO
16020 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
16030 20 70 52 65 74 29 3b 0a 20 20 20 20 20 20 20 20   pRet);.        
16040 72 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20  rc = TCL_OK;.   
16050 20 20 20 7d 0a 20 20 20 20 20 20 54 63 6c 5f 44     }.      Tcl_D
16060 65 63 72 52 65 66 43 6f 75 6e 74 28 70 52 65 74  ecrRefCount(pRet
16070 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
16080 20 20 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63      ClientData c
16090 64 32 5b 32 5d 3b 0a 20 20 20 20 20 20 44 62 45  d2[2];.      DbE
160a0 76 61 6c 43 6f 6e 74 65 78 74 20 2a 70 3b 0a 20  valContext *p;. 
160b0 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 41       Tcl_Obj *pA
160c0 72 72 61 79 20 3d 20 30 3b 0a 20 20 20 20 20 20  rray = 0;.      
160d0 54 63 6c 5f 4f 62 6a 20 2a 70 53 63 72 69 70 74  Tcl_Obj *pScript
160e0 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 6f 62 6a  ;..      if( obj
160f0 63 3e 3d 35 20 26 26 20 2a 28 63 68 61 72 20 2a  c>=5 && *(char *
16100 29 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f  )Tcl_GetString(o
16110 62 6a 76 5b 33 5d 29 20 29 7b 0a 20 20 20 20 20  bjv[3]) ){.     
16120 20 20 20 70 41 72 72 61 79 20 3d 20 6f 62 6a 76     pArray = objv
16130 5b 33 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  [3];.      }.   
16140 20 20 20 70 53 63 72 69 70 74 20 3d 20 6f 62 6a     pScript = obj
16150 76 5b 6f 62 6a 63 2d 31 5d 3b 0a 20 20 20 20 20  v[objc-1];.     
16160 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
16170 74 28 70 53 63 72 69 70 74 29 3b 0a 0a 20 20 20  t(pScript);..   
16180 20 20 20 70 20 3d 20 28 44 62 45 76 61 6c 43 6f     p = (DbEvalCo
16190 6e 74 65 78 74 20 2a 29 54 63 6c 5f 41 6c 6c 6f  ntext *)Tcl_Allo
161a0 63 28 73 69 7a 65 6f 66 28 44 62 45 76 61 6c 43  c(sizeof(DbEvalC
161b0 6f 6e 74 65 78 74 29 29 3b 0a 20 20 20 20 20 20  ontext));.      
161c0 64 62 45 76 61 6c 49 6e 69 74 28 70 2c 20 70 44  dbEvalInit(p, pD
161d0 62 2c 20 6f 62 6a 76 5b 32 5d 2c 20 70 41 72 72  b, objv[2], pArr
161e0 61 79 2c 20 65 76 61 6c 46 6c 61 67 73 29 3b 0a  ay, evalFlags);.
161f0 0a 20 20 20 20 20 20 63 64 32 5b 30 5d 20 3d 20  .      cd2[0] = 
16200 28 76 6f 69 64 20 2a 29 70 3b 0a 20 20 20 20 20  (void *)p;.     
16210 20 63 64 32 5b 31 5d 20 3d 20 28 76 6f 69 64 20   cd2[1] = (void 
16220 2a 29 70 53 63 72 69 70 74 3b 0a 20 20 20 20 20  *)pScript;.     
16230 20 72 63 20 3d 20 44 62 45 76 61 6c 4e 65 78 74   rc = DbEvalNext
16240 43 6d 64 28 63 64 32 2c 20 69 6e 74 65 72 70 2c  Cmd(cd2, interp,
16250 20 54 43 4c 5f 4f 4b 29 3b 0a 20 20 20 20 7d 0a   TCL_OK);.    }.
16260 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
16270 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64    /*.  **     $d
16280 62 20 66 75 6e 63 74 69 6f 6e 20 4e 41 4d 45 20  b function NAME 
16290 5b 2d 61 72 67 63 6f 75 6e 74 20 4e 5d 20 5b 2d  [-argcount N] [-
162a0 64 65 74 65 72 6d 69 6e 69 73 74 69 63 5d 20 53  deterministic] S
162b0 43 52 49 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20  CRIPT.  **.  ** 
162c0 43 72 65 61 74 65 20 61 20 6e 65 77 20 53 51 4c  Create a new SQL
162d0 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64   function called
162e0 20 4e 41 4d 45 2e 20 20 57 68 65 6e 65 76 65 72   NAME.  Whenever
162f0 20 74 68 61 74 20 66 75 6e 63 74 69 6f 6e 20 69   that function i
16300 73 0a 20 20 2a 2a 20 63 61 6c 6c 65 64 2c 20 69  s.  ** called, i
16310 6e 76 6f 6b 65 20 53 43 52 49 50 54 20 74 6f 20  nvoke SCRIPT to 
16320 65 76 61 6c 75 61 74 65 20 74 68 65 20 66 75 6e  evaluate the fun
16330 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 63 61  ction..  */.  ca
16340 73 65 20 44 42 5f 46 55 4e 43 54 49 4f 4e 3a 20  se DB_FUNCTION: 
16350 7b 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20  {.    int flags 
16360 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20  = SQLITE_UTF8;. 
16370 20 20 20 53 71 6c 46 75 6e 63 20 2a 70 46 75 6e     SqlFunc *pFun
16380 63 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a  c;.    Tcl_Obj *
16390 70 53 63 72 69 70 74 3b 0a 20 20 20 20 63 68 61  pScript;.    cha
163a0 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 6e  r *zName;.    in
163b0 74 20 6e 41 72 67 20 3d 20 2d 31 3b 0a 20 20 20  t nArg = -1;.   
163c0 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20   int i;.    int 
163d0 65 54 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 4e  eType = SQLITE_N
163e0 55 4c 4c 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a  ULL;.    if( obj
163f0 63 3c 34 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  c<4 ){.      Tcl
16400 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
16410 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22  terp, 2, objv, "
16420 4e 41 4d 45 20 3f 53 57 49 54 43 48 45 53 3f 20  NAME ?SWITCHES? 
16430 53 43 52 49 50 54 22 29 3b 0a 20 20 20 20 20 20  SCRIPT");.      
16440 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
16450 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
16460 69 3d 33 3b 20 69 3c 28 6f 62 6a 63 2d 31 29 3b  i=3; i<(objc-1);
16470 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 63 6f 6e   i++){.      con
16480 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 54 63 6c  st char *z = Tcl
16490 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
164a0 69 5d 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e  i]);.      int n
164b0 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 29 3b 0a   = strlen30(z);.
164c0 20 20 20 20 20 20 69 66 28 20 6e 3e 31 20 26 26        if( n>1 &&
164d0 20 73 74 72 6e 63 6d 70 28 7a 2c 20 22 2d 61 72   strncmp(z, "-ar
164e0 67 63 6f 75 6e 74 22 2c 6e 29 3d 3d 30 20 29 7b  gcount",n)==0 ){
164f0 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 3d 3d  .        if( i==
16500 28 6f 62 6a 63 2d 32 29 20 29 7b 0a 20 20 20 20  (objc-2) ){.    
16510 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
16520 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
16530 6f 70 74 69 6f 6e 20 72 65 71 75 69 72 65 73 20  option requires 
16540 61 6e 20 61 72 67 75 6d 65 6e 74 3a 20 22 2c 20  an argument: ", 
16550 7a 2c 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20  z,(char*)0);.   
16560 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43         return TC
16570 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20  L_ERROR;.       
16580 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 54   }.        if( T
16590 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
165a0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 69 2b  (interp, objv[i+
165b0 31 5d 2c 20 26 6e 41 72 67 29 20 29 20 72 65 74  1], &nArg) ) ret
165c0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
165d0 20 20 20 20 20 20 20 69 66 28 20 6e 41 72 67 3c         if( nArg<
165e0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54  0 ){.          T
165f0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
16600 69 6e 74 65 72 70 2c 20 22 6e 75 6d 62 65 72 20  interp, "number 
16610 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 6d 75 73  of arguments mus
16620 74 20 62 65 20 6e 6f 6e 2d 6e 65 67 61 74 69 76  t be non-negativ
16630 65 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  e",.            
16640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
16650 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20  char*)0);.      
16660 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
16670 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a  RROR;.        }.
16680 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20          i++;.   
16690 20 20 20 7d 65 6c 73 65 0a 20 20 20 20 20 20 69     }else.      i
166a0 66 28 20 6e 3e 31 20 26 26 20 73 74 72 6e 63 6d  f( n>1 && strncm
166b0 70 28 7a 2c 20 22 2d 64 65 74 65 72 6d 69 6e 69  p(z, "-determini
166c0 73 74 69 63 22 2c 6e 29 3d 3d 30 20 29 7b 0a 20  stic",n)==0 ){. 
166d0 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20         flags |= 
166e0 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49  SQLITE_DETERMINI
166f0 53 54 49 43 3b 0a 20 20 20 20 20 20 7d 65 6c 73  STIC;.      }els
16700 65 0a 20 20 20 20 20 20 69 66 28 20 6e 3e 31 20  e.      if( n>1 
16710 26 26 20 73 74 72 6e 63 6d 70 28 7a 2c 20 22 2d  && strncmp(z, "-
16720 72 65 74 75 72 6e 74 79 70 65 22 2c 20 6e 29 3d  returntype", n)=
16730 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  =0 ){.        co
16740 6e 73 74 20 63 68 61 72 20 2a 61 7a 54 79 70 65  nst char *azType
16750 5b 5d 20 3d 20 7b 22 69 6e 74 65 67 65 72 22 2c  [] = {"integer",
16760 20 22 72 65 61 6c 22 2c 20 22 74 65 78 74 22 2c   "real", "text",
16770 20 22 62 6c 6f 62 22 2c 20 22 61 6e 79 22 2c 20   "blob", "any", 
16780 30 7d 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  0};.        asse
16790 72 74 28 20 53 51 4c 49 54 45 5f 49 4e 54 45 47  rt( SQLITE_INTEG
167a0 45 52 3d 3d 31 20 26 26 20 53 51 4c 49 54 45 5f  ER==1 && SQLITE_
167b0 46 4c 4f 41 54 3d 3d 32 20 26 26 20 53 51 4c 49  FLOAT==2 && SQLI
167c0 54 45 5f 54 45 58 54 3d 3d 33 20 29 3b 0a 20 20  TE_TEXT==3 );.  
167d0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 53 51        assert( SQ
167e0 4c 49 54 45 5f 42 4c 4f 42 3d 3d 34 20 26 26 20  LITE_BLOB==4 && 
167f0 53 51 4c 49 54 45 5f 4e 55 4c 4c 3d 3d 35 20 29  SQLITE_NULL==5 )
16800 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 3d  ;.        if( i=
16810 3d 28 6f 62 6a 63 2d 32 29 20 29 7b 0a 20 20 20  =(objc-2) ){.   
16820 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e         Tcl_Appen
16830 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
16840 22 6f 70 74 69 6f 6e 20 72 65 71 75 69 72 65 73  "option requires
16850 20 61 6e 20 61 72 67 75 6d 65 6e 74 3a 20 22 2c   an argument: ",
16860 20 7a 2c 28 63 68 61 72 2a 29 30 29 3b 0a 20 20   z,(char*)0);.  
16870 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54          return T
16880 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  CL_ERROR;.      
16890 20 20 7d 0a 20 20 20 20 20 20 20 20 69 2b 2b 3b    }.        i++;
168a0 0a 20 20 20 20 20 20 20 20 69 66 28 20 54 63 6c  .        if( Tcl
168b0 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a  _GetIndexFromObj
168c0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 69 5d  (interp, objv[i]
168d0 2c 20 61 7a 54 79 70 65 2c 20 22 74 79 70 65 22  , azType, "type"
168e0 2c 20 30 2c 20 26 65 54 79 70 65 29 20 29 7b 0a  , 0, &eType) ){.
168f0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
16900 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
16910 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 65 54      }.        eT
16920 79 70 65 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c  ype++;.      }el
16930 73 65 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f  se{.        Tcl_
16940 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
16950 65 72 70 2c 20 22 62 61 64 20 6f 70 74 69 6f 6e  erp, "bad option
16960 20 5c 22 22 2c 20 7a 2c 0a 20 20 20 20 20 20 20   \"", z,.       
16970 20 20 20 20 20 22 5c 22 3a 20 6d 75 73 74 20 62       "\": must b
16980 65 20 2d 61 72 67 63 6f 75 6e 74 2c 20 2d 64 65  e -argcount, -de
16990 74 65 72 6d 69 6e 69 73 74 69 63 20 6f 72 20 2d  terministic or -
169a0 72 65 74 75 72 6e 74 79 70 65 22 2c 20 28 63 68  returntype", (ch
169b0 61 72 2a 29 30 0a 20 20 20 20 20 20 20 20 29 3b  ar*)0.        );
169c0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
169d0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  TCL_ERROR;.     
169e0 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 53   }.    }..    pS
169f0 63 72 69 70 74 20 3d 20 6f 62 6a 76 5b 6f 62 6a  cript = objv[obj
16a00 63 2d 31 5d 3b 0a 20 20 20 20 7a 4e 61 6d 65 20  c-1];.    zName 
16a10 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  = Tcl_GetStringF
16a20 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20  romObj(objv[2], 
16a30 30 29 3b 0a 20 20 20 20 70 46 75 6e 63 20 3d 20  0);.    pFunc = 
16a40 66 69 6e 64 53 71 6c 46 75 6e 63 28 70 44 62 2c  findSqlFunc(pDb,
16a50 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28   zName);.    if(
16a60 20 70 46 75 6e 63 3d 3d 30 20 29 20 72 65 74 75   pFunc==0 ) retu
16a70 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
16a80 20 20 69 66 28 20 70 46 75 6e 63 2d 3e 70 53 63    if( pFunc->pSc
16a90 72 69 70 74 20 29 7b 0a 20 20 20 20 20 20 54 63  ript ){.      Tc
16aa0 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70  l_DecrRefCount(p
16ab0 46 75 6e 63 2d 3e 70 53 63 72 69 70 74 29 3b 0a  Func->pScript);.
16ac0 20 20 20 20 7d 0a 20 20 20 20 70 46 75 6e 63 2d      }.    pFunc-
16ad0 3e 70 53 63 72 69 70 74 20 3d 20 70 53 63 72 69  >pScript = pScri
16ae0 70 74 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72  pt;.    Tcl_Incr
16af0 52 65 66 43 6f 75 6e 74 28 70 53 63 72 69 70 74  RefCount(pScript
16b00 29 3b 0a 20 20 20 20 70 46 75 6e 63 2d 3e 75 73  );.    pFunc->us
16b10 65 45 76 61 6c 4f 62 6a 76 20 3d 20 73 61 66 65  eEvalObjv = safe
16b20 54 6f 55 73 65 45 76 61 6c 4f 62 6a 76 28 69 6e  ToUseEvalObjv(in
16b30 74 65 72 70 2c 20 70 53 63 72 69 70 74 29 3b 0a  terp, pScript);.
16b40 20 20 20 20 70 46 75 6e 63 2d 3e 65 54 79 70 65      pFunc->eType
16b50 20 3d 20 65 54 79 70 65 3b 0a 20 20 20 20 72 63   = eType;.    rc
16b60 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74   = sqlite3_creat
16b70 65 5f 66 75 6e 63 74 69 6f 6e 28 70 44 62 2d 3e  e_function(pDb->
16b80 64 62 2c 20 7a 4e 61 6d 65 2c 20 6e 41 72 67 2c  db, zName, nArg,
16b90 20 66 6c 61 67 73 2c 0a 20 20 20 20 20 20 20 20   flags,.        
16ba0 70 46 75 6e 63 2c 20 74 63 6c 53 71 6c 46 75 6e  pFunc, tclSqlFun
16bb0 63 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66  c, 0, 0);.    if
16bc0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
16bd0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 54 43  ){.      rc = TC
16be0 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 54  L_ERROR;.      T
16bf0 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
16c00 65 72 70 2c 20 28 63 68 61 72 20 2a 29 73 71 6c  erp, (char *)sql
16c10 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d  ite3_errmsg(pDb-
16c20 3e 64 62 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49  >db), TCL_VOLATI
16c30 4c 45 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62  LE);.    }.    b
16c40 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a  reak;.  }..  /*.
16c50 20 20 2a 2a 20 20 20 20 20 24 64 62 20 69 6e 63    **     $db inc
16c60 72 62 6c 6f 62 20 3f 2d 72 65 61 64 6f 6e 6c 79  rblob ?-readonly
16c70 3f 20 3f 44 42 3f 20 54 41 42 4c 45 20 43 4f 4c  ? ?DB? TABLE COL
16c80 55 4d 4e 20 52 4f 57 49 44 0a 20 20 2a 2f 0a 20  UMN ROWID.  */. 
16c90 20 63 61 73 65 20 44 42 5f 49 4e 43 52 42 4c 4f   case DB_INCRBLO
16ca0 42 3a 20 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  B: {.#ifdef SQLI
16cb0 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42  TE_OMIT_INCRBLOB
16cc0 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
16cd0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 69  esult(interp, "i
16ce0 6e 63 72 62 6c 6f 62 20 6e 6f 74 20 61 76 61 69  ncrblob not avai
16cf0 6c 61 62 6c 65 20 69 6e 20 74 68 69 73 20 62 75  lable in this bu
16d00 69 6c 64 22 2c 20 28 63 68 61 72 2a 29 30 29 3b  ild", (char*)0);
16d10 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
16d20 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 20 20 20  ERROR;.#else.   
16d30 20 69 6e 74 20 69 73 52 65 61 64 6f 6e 6c 79 20   int isReadonly 
16d40 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  = 0;.    const c
16d50 68 61 72 20 2a 7a 44 62 20 3d 20 22 6d 61 69 6e  har *zDb = "main
16d60 22 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ";.    const cha
16d70 72 20 2a 7a 54 61 62 6c 65 3b 0a 20 20 20 20 63  r *zTable;.    c
16d80 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 75  onst char *zColu
16d90 6d 6e 3b 0a 20 20 20 20 54 63 6c 5f 57 69 64 65  mn;.    Tcl_Wide
16da0 49 6e 74 20 69 52 6f 77 3b 0a 0a 20 20 20 20 2f  Int iRow;..    /
16db0 2a 20 43 68 65 63 6b 20 66 6f 72 20 74 68 65 20  * Check for the 
16dc0 2d 72 65 61 64 6f 6e 6c 79 20 6f 70 74 69 6f 6e  -readonly option
16dd0 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f 62 6a 63   */.    if( objc
16de0 3e 33 20 26 26 20 73 74 72 63 6d 70 28 54 63 6c  >3 && strcmp(Tcl
16df0 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
16e00 32 5d 29 2c 20 22 2d 72 65 61 64 6f 6e 6c 79 22  2]), "-readonly"
16e10 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 73  )==0 ){.      is
16e20 52 65 61 64 6f 6e 6c 79 20 3d 20 31 3b 0a 20 20  Readonly = 1;.  
16e30 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 6f 62 6a    }..    if( obj
16e40 63 21 3d 28 35 2b 69 73 52 65 61 64 6f 6e 6c 79  c!=(5+isReadonly
16e50 29 20 26 26 20 6f 62 6a 63 21 3d 28 36 2b 69 73  ) && objc!=(6+is
16e60 52 65 61 64 6f 6e 6c 79 29 20 29 7b 0a 20 20 20  Readonly) ){.   
16e70 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
16e80 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
16e90 62 6a 76 2c 20 22 3f 2d 72 65 61 64 6f 6e 6c 79  bjv, "?-readonly
16ea0 3f 20 3f 44 42 3f 20 54 41 42 4c 45 20 43 4f 4c  ? ?DB? TABLE COL
16eb0 55 4d 4e 20 52 4f 57 49 44 22 29 3b 0a 20 20 20  UMN ROWID");.   
16ec0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
16ed0 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ROR;.    }..    
16ee0 69 66 28 20 6f 62 6a 63 3d 3d 28 36 2b 69 73 52  if( objc==(6+isR
16ef0 65 61 64 6f 6e 6c 79 29 20 29 7b 0a 20 20 20 20  eadonly) ){.    
16f00 20 20 7a 44 62 20 3d 20 54 63 6c 5f 47 65 74 53    zDb = Tcl_GetS
16f10 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a  tring(objv[2]);.
16f20 20 20 20 20 7d 0a 20 20 20 20 7a 54 61 62 6c 65      }.    zTable
16f30 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
16f40 28 6f 62 6a 76 5b 6f 62 6a 63 2d 33 5d 29 3b 0a  (objv[objc-3]);.
16f50 20 20 20 20 7a 43 6f 6c 75 6d 6e 20 3d 20 54 63      zColumn = Tc
16f60 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
16f70 5b 6f 62 6a 63 2d 32 5d 29 3b 0a 20 20 20 20 72  [objc-2]);.    r
16f80 63 20 3d 20 54 63 6c 5f 47 65 74 57 69 64 65 49  c = Tcl_GetWideI
16f90 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
16fa0 2c 20 6f 62 6a 76 5b 6f 62 6a 63 2d 31 5d 2c 20  , objv[objc-1], 
16fb0 26 69 52 6f 77 29 3b 0a 0a 20 20 20 20 69 66 28  &iRow);..    if(
16fc0 20 72 63 3d 3d 54 43 4c 5f 4f 4b 20 29 7b 0a 20   rc==TCL_OK ){. 
16fd0 20 20 20 20 20 72 63 20 3d 20 63 72 65 61 74 65       rc = create
16fe0 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 28  IncrblobChannel(
16ff0 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 65 72  .          inter
17000 70 2c 20 70 44 62 2c 20 7a 44 62 2c 20 7a 54 61  p, pDb, zDb, zTa
17010 62 6c 65 2c 20 7a 43 6f 6c 75 6d 6e 2c 20 28 73  ble, zColumn, (s
17020 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 69 52 6f  qlite3_int64)iRo
17030 77 2c 20 69 73 52 65 61 64 6f 6e 6c 79 0a 20 20  w, isReadonly.  
17040 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 23 65 6e      );.    }.#en
17050 64 69 66 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20  dif.    break;. 
17060 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20   }..  /*.  **   
17070 20 20 24 64 62 20 69 6e 74 65 72 72 75 70 74 0a    $db interrupt.
17080 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 74 65 72 72    **.  ** Interr
17090 75 70 74 20 74 68 65 20 65 78 65 63 75 74 69 6f  upt the executio
170a0 6e 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 2d 6d  n of the inner-m
170b0 6f 73 74 20 53 51 4c 20 69 6e 74 65 72 70 72 65  ost SQL interpre
170c0 74 65 72 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20  ter.  This.  ** 
170d0 63 61 75 73 65 73 20 74 68 65 20 53 51 4c 20 73  causes the SQL s
170e0 74 61 74 65 6d 65 6e 74 20 74 6f 20 72 65 74 75  tatement to retu
170f0 72 6e 20 61 6e 20 65 72 72 6f 72 20 6f 66 20 53  rn an error of S
17100 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 2e  QLITE_INTERRUPT.
17110 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f  .  */.  case DB_
17120 49 4e 54 45 52 52 55 50 54 3a 20 7b 0a 20 20 20  INTERRUPT: {.   
17130 20 73 71 6c 69 74 65 33 5f 69 6e 74 65 72 72 75   sqlite3_interru
17140 70 74 28 70 44 62 2d 3e 64 62 29 3b 0a 20 20 20  pt(pDb->db);.   
17150 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
17160 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20 6e  *.  **     $db n
17170 75 6c 6c 76 61 6c 75 65 20 3f 53 54 52 49 4e 47  ullvalue ?STRING
17180 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 68 61 6e  ?.  **.  ** Chan
17190 67 65 20 74 65 78 74 20 75 73 65 64 20 77 68 65  ge text used whe
171a0 6e 20 61 20 4e 55 4c 4c 20 63 6f 6d 65 73 20 62  n a NULL comes b
171b0 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ack from the dat
171c0 61 62 61 73 65 2e 20 49 66 20 3f 53 54 52 49 4e  abase. If ?STRIN
171d0 47 3f 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 70  G?.  ** is not p
171e0 72 65 73 65 6e 74 2c 20 74 68 65 6e 20 74 68 65  resent, then the
171f0 20 63 75 72 72 65 6e 74 20 73 74 72 69 6e 67 20   current string 
17200 75 73 65 64 20 66 6f 72 20 4e 55 4c 4c 20 69 73  used for NULL is
17210 20 72 65 74 75 72 6e 65 64 2e 0a 20 20 2a 2a 20   returned..  ** 
17220 49 66 20 53 54 52 49 4e 47 20 69 73 20 70 72 65  If STRING is pre
17230 73 65 6e 74 2c 20 74 68 65 6e 20 53 54 52 49 4e  sent, then STRIN
17240 47 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 20  G is returned.. 
17250 20 2a 2a 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20   **.  */.  case 
17260 44 42 5f 4e 55 4c 4c 56 41 4c 55 45 3a 20 7b 0a  DB_NULLVALUE: {.
17270 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20      if( objc!=2 
17280 26 26 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20  && objc!=3 ){.  
17290 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
172a0 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20  Args(interp, 2, 
172b0 6f 62 6a 76 2c 20 22 4e 55 4c 4c 56 41 4c 55 45  objv, "NULLVALUE
172c0 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
172d0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
172e0 7d 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d  }.    if( objc==
172f0 33 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6c  3 ){.      int l
17300 65 6e 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  en;.      char *
17310 7a 4e 75 6c 6c 20 3d 20 54 63 6c 5f 47 65 74 53  zNull = Tcl_GetS
17320 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
17330 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20 20  v[2], &len);.   
17340 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 4e 75 6c     if( pDb->zNul
17350 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c  l ){.        Tcl
17360 5f 46 72 65 65 28 70 44 62 2d 3e 7a 4e 75 6c 6c  _Free(pDb->zNull
17370 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
17380 20 69 66 28 20 7a 4e 75 6c 6c 20 26 26 20 6c 65   if( zNull && le
17390 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  n>0 ){.        p
173a0 44 62 2d 3e 7a 4e 75 6c 6c 20 3d 20 54 63 6c 5f  Db->zNull = Tcl_
173b0 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20 31 20 29  Alloc( len + 1 )
173c0 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  ;.        memcpy
173d0 28 70 44 62 2d 3e 7a 4e 75 6c 6c 2c 20 7a 4e 75  (pDb->zNull, zNu
173e0 6c 6c 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 20 20  ll, len);.      
173f0 20 20 70 44 62 2d 3e 7a 4e 75 6c 6c 5b 6c 65 6e    pDb->zNull[len
17400 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20 20  ] = '\0';.      
17410 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
17420 44 62 2d 3e 7a 4e 75 6c 6c 20 3d 20 30 3b 0a 20  Db->zNull = 0;. 
17430 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
17440 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
17450 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
17460 77 53 74 72 69 6e 67 4f 62 6a 28 70 44 62 2d 3e  wStringObj(pDb->
17470 7a 4e 75 6c 6c 2c 20 2d 31 29 29 3b 0a 20 20 20  zNull, -1));.   
17480 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
17490 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20 6c  *.  **     $db l
174a0 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64  ast_insert_rowid
174b0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72  .  **.  ** Retur
174c0 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69  n an integer whi
174d0 63 68 20 69 73 20 74 68 65 20 52 4f 57 49 44 20  ch is the ROWID 
174e0 66 6f 72 20 74 68 65 20 6d 6f 73 74 20 72 65 63  for the most rec
174f0 65 6e 74 20 69 6e 73 65 72 74 2e 0a 20 20 2a 2f  ent insert..  */
17500 0a 20 20 63 61 73 65 20 44 42 5f 4c 41 53 54 5f  .  case DB_LAST_
17510 49 4e 53 45 52 54 5f 52 4f 57 49 44 3a 20 7b 0a  INSERT_ROWID: {.
17520 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65      Tcl_Obj *pRe
17530 73 75 6c 74 3b 0a 20 20 20 20 54 63 6c 5f 57 69  sult;.    Tcl_Wi
17540 64 65 49 6e 74 20 72 6f 77 69 64 3b 0a 20 20 20  deInt rowid;.   
17550 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a   if( objc!=2 ){.
17560 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
17570 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
17580 2c 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 20 20 20  , objv, "");.   
17590 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
175a0 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  ROR;.    }.    r
175b0 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33 5f 6c  owid = sqlite3_l
175c0 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64  ast_insert_rowid
175d0 28 70 44 62 2d 3e 64 62 29 3b 0a 20 20 20 20 70  (pDb->db);.    p
175e0 52 65 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65 74  Result = Tcl_Get
175f0 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
17600 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 57 69  );.    Tcl_SetWi
17610 64 65 49 6e 74 4f 62 6a 28 70 52 65 73 75 6c 74  deIntObj(pResult
17620 2c 20 72 6f 77 69 64 29 3b 0a 20 20 20 20 62 72  , rowid);.    br
17630 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  eak;.  }..  /*. 
17640 20 2a 2a 20 54 68 65 20 44 42 5f 4f 4e 45 43 4f   ** The DB_ONECO
17650 4c 55 4d 4e 20 6d 65 74 68 6f 64 20 69 73 20 69  LUMN method is i
17660 6d 70 6c 65 6d 65 6e 74 65 64 20 74 6f 67 65 74  mplemented toget
17670 68 65 72 20 77 69 74 68 20 44 42 5f 45 58 49 53  her with DB_EXIS
17680 54 53 2e 0a 20 20 2a 2f 0a 0a 20 20 2f 2a 20 20  TS..  */..  /*  
17690 20 20 24 64 62 20 70 72 6f 67 72 65 73 73 20 3f    $db progress ?
176a0 4e 20 43 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a  N CALLBACK?.  **
176b0 0a 20 20 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65  .  ** Invoke the
176c0 20 67 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b 20   given callback 
176d0 65 76 65 72 79 20 4e 20 76 69 72 74 75 61 6c 20  every N virtual 
176e0 6d 61 63 68 69 6e 65 20 6f 70 63 6f 64 65 73 20  machine opcodes 
176f0 77 68 69 6c 65 20 65 78 65 63 75 74 69 6e 67 0a  while executing.
17700 20 20 2a 2a 20 71 75 65 72 69 65 73 2e 0a 20 20    ** queries..  
17710 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 50 52 4f  */.  case DB_PRO
17720 47 52 45 53 53 3a 20 7b 0a 20 20 20 20 69 66 28  GRESS: {.    if(
17730 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20   objc==2 ){.    
17740 20 20 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f 67    if( pDb->zProg
17750 72 65 73 73 20 29 7b 0a 20 20 20 20 20 20 20 20  ress ){.        
17760 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
17770 28 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a 50  (interp, pDb->zP
17780 72 6f 67 72 65 73 73 2c 20 28 63 68 61 72 2a 29  rogress, (char*)
17790 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
177a0 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d  }else if( objc==
177b0 34 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20  4 ){.      char 
177c0 2a 7a 50 72 6f 67 72 65 73 73 3b 0a 20 20 20 20  *zProgress;.    
177d0 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20    int len;.     
177e0 20 69 6e 74 20 4e 3b 0a 20 20 20 20 20 20 69 66   int N;.      if
177f0 28 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65  ( TCL_OK!=Tcl_Ge
17800 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
17810 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 4e 29  rp, objv[2], &N)
17820 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
17830 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
17840 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 69 66 28      };.      if(
17850 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 20   pDb->zProgress 
17860 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 46  ){.        Tcl_F
17870 72 65 65 28 70 44 62 2d 3e 7a 50 72 6f 67 72 65  ree(pDb->zProgre
17880 73 73 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ss);.      }.   
17890 20 20 20 7a 50 72 6f 67 72 65 73 73 20 3d 20 54     zProgress = T
178a0 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
178b0 4f 62 6a 28 6f 62 6a 76 5b 33 5d 2c 20 26 6c 65  Obj(objv[3], &le
178c0 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 50  n);.      if( zP
178d0 72 6f 67 72 65 73 73 20 26 26 20 6c 65 6e 3e 30  rogress && len>0
178e0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d   ){.        pDb-
178f0 3e 7a 50 72 6f 67 72 65 73 73 20 3d 20 54 63 6c  >zProgress = Tcl
17900 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20 31 20  _Alloc( len + 1 
17910 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  );.        memcp
17920 79 28 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73  y(pDb->zProgress
17930 2c 20 7a 50 72 6f 67 72 65 73 73 2c 20 6c 65 6e  , zProgress, len
17940 2b 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  +1);.      }else
17950 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a  {.        pDb->z
17960 50 72 6f 67 72 65 73 73 20 3d 20 30 3b 0a 20 20  Progress = 0;.  
17970 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
17980 4c 49 54 45 5f 4f 4d 49 54 5f 50 52 4f 47 52 45  LITE_OMIT_PROGRE
17990 53 53 5f 43 41 4c 4c 42 41 43 4b 0a 20 20 20 20  SS_CALLBACK.    
179a0 20 20 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f 67    if( pDb->zProg
179b0 72 65 73 73 20 29 7b 0a 20 20 20 20 20 20 20 20  ress ){.        
179c0 70 44 62 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e  pDb->interp = in
179d0 74 65 72 70 3b 0a 20 20 20 20 20 20 20 20 73 71  terp;.        sq
179e0 6c 69 74 65 33 5f 70 72 6f 67 72 65 73 73 5f 68  lite3_progress_h
179f0 61 6e 64 6c 65 72 28 70 44 62 2d 3e 64 62 2c 20  andler(pDb->db, 
17a00 4e 2c 20 44 62 50 72 6f 67 72 65 73 73 48 61 6e  N, DbProgressHan
17a10 64 6c 65 72 2c 20 70 44 62 29 3b 0a 20 20 20 20  dler, pDb);.    
17a20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
17a30 20 73 71 6c 69 74 65 33 5f 70 72 6f 67 72 65 73   sqlite3_progres
17a40 73 5f 68 61 6e 64 6c 65 72 28 70 44 62 2d 3e 64  s_handler(pDb->d
17a50 62 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  b, 0, 0, 0);.   
17a60 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
17a70 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 54 63 6c  }else{.      Tcl
17a80 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
17a90 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22  terp, 2, objv, "
17aa0 4e 20 43 41 4c 4c 42 41 43 4b 22 29 3b 0a 20 20  N CALLBACK");.  
17ab0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
17ac0 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
17ad0 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
17ae0 20 20 20 20 24 64 62 20 70 72 6f 66 69 6c 65 20      $db profile 
17af0 3f 43 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a 0a  ?CALLBACK?.  **.
17b00 20 20 2a 2a 20 4d 61 6b 65 20 61 72 72 61 6e 67    ** Make arrang
17b10 65 6d 65 6e 74 73 20 74 6f 20 69 6e 76 6f 6b 65  ements to invoke
17b20 20 74 68 65 20 43 41 4c 4c 42 41 43 4b 20 72 6f   the CALLBACK ro
17b30 75 74 69 6e 65 20 61 66 74 65 72 20 65 61 63 68  utine after each
17b40 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 0a 20   SQL statement. 
17b50 20 2a 2a 20 74 68 61 74 20 68 61 73 20 72 75 6e   ** that has run
17b60 2e 20 20 54 68 65 20 74 65 78 74 20 6f 66 20 74  .  The text of t
17b70 68 65 20 53 51 4c 20 61 6e 64 20 74 68 65 20 61  he SQL and the a
17b80 6d 6f 75 6e 74 20 6f 66 20 65 6c 61 70 73 65 20  mount of elapse 
17b90 74 69 6d 65 20 61 72 65 0a 20 20 2a 2a 20 61 70  time are.  ** ap
17ba0 70 65 6e 64 65 64 20 74 6f 20 43 41 4c 4c 42 41  pended to CALLBA
17bb0 43 4b 20 62 65 66 6f 72 65 20 74 68 65 20 73 63  CK before the sc
17bc0 72 69 70 74 20 69 73 20 72 75 6e 2e 0a 20 20 2a  ript is run..  *
17bd0 2f 0a 20 20 63 61 73 65 20 44 42 5f 50 52 4f 46  /.  case DB_PROF
17be0 49 4c 45 3a 20 7b 0a 20 20 20 20 69 66 28 20 6f  ILE: {.    if( o
17bf0 62 6a 63 3e 33 20 29 7b 0a 20 20 20 20 20 20 54  bjc>3 ){.      T
17c00 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
17c10 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c  interp, 2, objv,
17c20 20 22 3f 43 41 4c 4c 42 41 43 4b 3f 22 29 3b 0a   "?CALLBACK?");.
17c30 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
17c40 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73  _ERROR;.    }els
17c50 65 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b  e if( objc==2 ){
17c60 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e  .      if( pDb->
17c70 7a 50 72 6f 66 69 6c 65 20 29 7b 0a 20 20 20 20  zProfile ){.    
17c80 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
17c90 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 44 62  sult(interp, pDb
17ca0 2d 3e 7a 50 72 6f 66 69 6c 65 2c 20 28 63 68 61  ->zProfile, (cha
17cb0 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  r*)0);.      }. 
17cc0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
17cd0 63 68 61 72 20 2a 7a 50 72 6f 66 69 6c 65 3b 0a  char *zProfile;.
17ce0 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20        int len;. 
17cf0 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 50       if( pDb->zP
17d00 72 6f 66 69 6c 65 20 29 7b 0a 20 20 20 20 20 20  rofile ){.      
17d10 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e    Tcl_Free(pDb->
17d20 7a 50 72 6f 66 69 6c 65 29 3b 0a 20 20 20 20 20  zProfile);.     
17d30 20 7d 0a 20 20 20 20 20 20 7a 50 72 6f 66 69 6c   }.      zProfil
17d40 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  e = Tcl_GetStrin
17d50 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d  gFromObj(objv[2]
17d60 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69  , &len);.      i
17d70 66 28 20 7a 50 72 6f 66 69 6c 65 20 26 26 20 6c  f( zProfile && l
17d80 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  en>0 ){.        
17d90 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 20 3d 20  pDb->zProfile = 
17da0 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b  Tcl_Alloc( len +
17db0 20 31 20 29 3b 0a 20 20 20 20 20 20 20 20 6d 65   1 );.        me
17dc0 6d 63 70 79 28 70 44 62 2d 3e 7a 50 72 6f 66 69  mcpy(pDb->zProfi
17dd0 6c 65 2c 20 7a 50 72 6f 66 69 6c 65 2c 20 6c 65  le, zProfile, le
17de0 6e 2b 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  n+1);.      }els
17df0 65 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e  e{.        pDb->
17e00 7a 50 72 6f 66 69 6c 65 20 3d 20 30 3b 0a 20 20  zProfile = 0;.  
17e10 20 20 20 20 7d 0a 23 69 66 20 21 64 65 66 69 6e      }.#if !defin
17e20 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ed(SQLITE_OMIT_T
17e30 52 41 43 45 29 20 26 26 20 21 64 65 66 69 6e 65  RACE) && !define
17e40 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c  d(SQLITE_OMIT_FL
17e50 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 29 20 26 26  OATING_POINT) &&
17e60 20 5c 0a 20 20 20 20 21 64 65 66 69 6e 65 64 28   \.    !defined(
17e70 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52  SQLITE_OMIT_DEPR
17e80 45 43 41 54 45 44 29 0a 20 20 20 20 20 20 69 66  ECATED).      if
17e90 28 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 20  ( pDb->zProfile 
17ea0 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e  ){.        pDb->
17eb0 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b  interp = interp;
17ec0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
17ed0 5f 70 72 6f 66 69 6c 65 28 70 44 62 2d 3e 64 62  _profile(pDb->db
17ee0 2c 20 44 62 50 72 6f 66 69 6c 65 48 61 6e 64 6c  , DbProfileHandl
17ef0 65 72 2c 20 70 44 62 29 3b 0a 20 20 20 20 20 20  er, pDb);.      
17f00 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
17f10 71 6c 69 74 65 33 5f 70 72 6f 66 69 6c 65 28 70  qlite3_profile(p
17f20 44 62 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20  Db->db, 0, 0);. 
17f30 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
17f40 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20    }.    break;. 
17f50 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20   }..  /*.  **   
17f60 20 20 24 64 62 20 72 65 6b 65 79 20 4b 45 59 0a    $db rekey KEY.
17f70 20 20 2a 2a 0a 20 20 2a 2a 20 43 68 61 6e 67 65    **.  ** Change
17f80 20 74 68 65 20 65 6e 63 72 79 70 74 69 6f 6e 20   the encryption 
17f90 6b 65 79 20 6f 6e 20 74 68 65 20 63 75 72 72 65  key on the curre
17fa0 6e 74 6c 79 20 6f 70 65 6e 20 64 61 74 61 62 61  ntly open databa
17fb0 73 65 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  se..  */.  case 
17fc0 44 42 5f 52 45 4b 45 59 3a 20 7b 0a 23 69 66 20  DB_REKEY: {.#if 
17fd0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 48  defined(SQLITE_H
17fe0 41 53 5f 43 4f 44 45 43 29 20 26 26 20 21 64 65  AS_CODEC) && !de
17ff0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
18000 54 5f 43 4f 44 45 43 5f 46 52 4f 4d 5f 54 43 4c  T_CODEC_FROM_TCL
18010 29 0a 20 20 20 20 69 6e 74 20 6e 4b 65 79 3b 0a  ).    int nKey;.
18020 20 20 20 20 76 6f 69 64 20 2a 70 4b 65 79 3b 0a      void *pKey;.
18030 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 6f  #endif.    if( o
18040 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20  bjc!=3 ){.      
18050 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
18060 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76  (interp, 2, objv
18070 2c 20 22 4b 45 59 22 29 3b 0a 20 20 20 20 20 20  , "KEY");.      
18080 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
18090 3b 0a 20 20 20 20 7d 0a 23 69 66 20 64 65 66 69  ;.    }.#if defi
180a0 6e 65 64 28 53 51 4c 49 54 45 5f 48 41 53 5f 43  ned(SQLITE_HAS_C
180b0 4f 44 45 43 29 20 26 26 20 21 64 65 66 69 6e 65  ODEC) && !define
180c0 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  d(SQLITE_OMIT_CO
180d0 44 45 43 5f 46 52 4f 4d 5f 54 43 4c 29 0a 20 20  DEC_FROM_TCL).  
180e0 20 20 70 4b 65 79 20 3d 20 54 63 6c 5f 47 65 74    pKey = Tcl_Get
180f0 42 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a  ByteArrayFromObj
18100 28 6f 62 6a 76 5b 32 5d 2c 20 26 6e 4b 65 79 29  (objv[2], &nKey)
18110 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
18120 65 33 5f 72 65 6b 65 79 28 70 44 62 2d 3e 64 62  e3_rekey(pDb->db
18130 2c 20 70 4b 65 79 2c 20 6e 4b 65 79 29 3b 0a 20  , pKey, nKey);. 
18140 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
18150 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
18160 75 6c 74 28 69 6e 74 65 72 70 2c 20 73 71 6c 69  ult(interp, sqli
18170 74 65 33 5f 65 72 72 73 74 72 28 72 63 29 2c 20  te3_errstr(rc), 
18180 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20  (char*)0);.     
18190 20 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b   rc = TCL_ERROR;
181a0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
181b0 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
181c0 2f 2a 20 20 20 20 24 64 62 20 72 65 73 74 6f 72  /*    $db restor
181d0 65 20 3f 44 41 54 41 42 41 53 45 3f 20 46 49 4c  e ?DATABASE? FIL
181e0 45 4e 41 4d 45 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ENAME.  **.  ** 
181f0 4f 70 65 6e 20 61 20 64 61 74 61 62 61 73 65 20  Open a database 
18200 66 69 6c 65 20 6e 61 6d 65 64 20 46 49 4c 45 4e  file named FILEN
18210 41 4d 45 2e 20 20 54 72 61 6e 73 66 65 72 20 74  AME.  Transfer t
18220 68 65 20 63 6f 6e 74 65 6e 74 0a 20 20 2a 2a 20  he content.  ** 
18230 6f 66 20 46 49 4c 45 4e 41 4d 45 20 69 6e 74 6f  of FILENAME into
18240 20 74 68 65 20 6c 6f 63 61 6c 20 64 61 74 61 62   the local datab
18250 61 73 65 20 44 41 54 41 42 41 53 45 20 28 64 65  ase DATABASE (de
18260 66 61 75 6c 74 3a 20 22 6d 61 69 6e 22 29 2e 0a  fault: "main")..
18270 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 52    */.  case DB_R
18280 45 53 54 4f 52 45 3a 20 7b 0a 20 20 20 20 63 6f  ESTORE: {.    co
18290 6e 73 74 20 63 68 61 72 20 2a 7a 53 72 63 46 69  nst char *zSrcFi
182a0 6c 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  le;.    const ch
182b0 61 72 20 2a 7a 44 65 73 74 44 62 3b 0a 20 20 20  ar *zDestDb;.   
182c0 20 73 71 6c 69 74 65 33 20 2a 70 53 72 63 3b 0a   sqlite3 *pSrc;.
182d0 20 20 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b      sqlite3_back
182e0 75 70 20 2a 70 42 61 63 6b 75 70 3b 0a 20 20 20  up *pBackup;.   
182f0 20 69 6e 74 20 6e 54 69 6d 65 6f 75 74 20 3d 20   int nTimeout = 
18300 30 3b 0a 0a 20 20 20 20 69 66 28 20 6f 62 6a 63  0;..    if( objc
18310 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20 7a 44 65  ==3 ){.      zDe
18320 73 74 44 62 20 3d 20 22 6d 61 69 6e 22 3b 0a 20  stDb = "main";. 
18330 20 20 20 20 20 7a 53 72 63 46 69 6c 65 20 3d 20       zSrcFile = 
18340 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
18350 6a 76 5b 32 5d 29 3b 0a 20 20 20 20 7d 65 6c 73  jv[2]);.    }els
18360 65 20 69 66 28 20 6f 62 6a 63 3d 3d 34 20 29 7b  e if( objc==4 ){
18370 0a 20 20 20 20 20 20 7a 44 65 73 74 44 62 20 3d  .      zDestDb =
18380 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
18390 62 6a 76 5b 32 5d 29 3b 0a 20 20 20 20 20 20 7a  bjv[2]);.      z
183a0 53 72 63 46 69 6c 65 20 3d 20 54 63 6c 5f 47 65  SrcFile = Tcl_Ge
183b0 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d 29  tString(objv[3])
183c0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
183d0 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
183e0 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
183f0 62 6a 76 2c 20 22 3f 44 41 54 41 42 41 53 45 3f  bjv, "?DATABASE?
18400 20 46 49 4c 45 4e 41 4d 45 22 29 3b 0a 20 20 20   FILENAME");.   
18410 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
18420 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  ROR;.    }.    r
18430 63 20 3d 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  c = sqlite3_open
18440 5f 76 32 28 7a 53 72 63 46 69 6c 65 2c 20 26 70  _v2(zSrcFile, &p
18450 53 72 63 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Src,.           
18460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
18470 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
18480 4c 59 20 7c 20 70 44 62 2d 3e 6f 70 65 6e 46 6c  LY | pDb->openFl
18490 61 67 73 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  ags, 0);.    if(
184a0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
184b0 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65  {.      Tcl_Appe
184c0 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
184d0 20 22 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 73 6f   "cannot open so
184e0 75 72 63 65 20 64 61 74 61 62 61 73 65 3a 20 22  urce database: "
184f0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  ,.           sql
18500 69 74 65 33 5f 65 72 72 6d 73 67 28 70 53 72 63  ite3_errmsg(pSrc
18510 29 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  ), (char*)0);.  
18520 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73      sqlite3_clos
18530 65 28 70 53 72 63 29 3b 0a 20 20 20 20 20 20 72  e(pSrc);.      r
18540 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
18550 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 61 63 6b  .    }.    pBack
18560 75 70 20 3d 20 73 71 6c 69 74 65 33 5f 62 61 63  up = sqlite3_bac
18570 6b 75 70 5f 69 6e 69 74 28 70 44 62 2d 3e 64 62  kup_init(pDb->db
18580 2c 20 7a 44 65 73 74 44 62 2c 20 70 53 72 63 2c  , zDestDb, pSrc,
18590 20 22 6d 61 69 6e 22 29 3b 0a 20 20 20 20 69 66   "main");.    if
185a0 28 20 70 42 61 63 6b 75 70 3d 3d 30 20 29 7b 0a  ( pBackup==0 ){.
185b0 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
185c0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
185d0 72 65 73 74 6f 72 65 20 66 61 69 6c 65 64 3a 20  restore failed: 
185e0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 73 71  ",.           sq
185f0 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62  lite3_errmsg(pDb
18600 2d 3e 64 62 29 2c 20 28 63 68 61 72 2a 29 30 29  ->db), (char*)0)
18610 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
18620 63 6c 6f 73 65 28 70 53 72 63 29 3b 0a 20 20 20  close(pSrc);.   
18630 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
18640 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77  ROR;.    }.    w
18650 68 69 6c 65 28 20 28 72 63 20 3d 20 73 71 6c 69  hile( (rc = sqli
18660 74 65 33 5f 62 61 63 6b 75 70 5f 73 74 65 70 28  te3_backup_step(
18670 70 42 61 63 6b 75 70 2c 31 30 30 29 29 3d 3d 53  pBackup,100))==S
18680 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 20 20 20 20  QLITE_OK.       
18690 20 20 20 20 20 20 20 7c 7c 20 72 63 3d 3d 53 51         || rc==SQ
186a0 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20  LITE_BUSY ){.   
186b0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
186c0 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20  E_BUSY ){.      
186d0 20 20 69 66 28 20 6e 54 69 6d 65 6f 75 74 2b 2b    if( nTimeout++
186e0 20 3e 3d 20 33 20 29 20 62 72 65 61 6b 3b 0a 20   >= 3 ) break;. 
186f0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
18700 6c 65 65 70 28 31 30 30 29 3b 0a 20 20 20 20 20  leep(100);.     
18710 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
18720 69 74 65 33 5f 62 61 63 6b 75 70 5f 66 69 6e 69  ite3_backup_fini
18730 73 68 28 70 42 61 63 6b 75 70 29 3b 0a 20 20 20  sh(pBackup);.   
18740 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
18750 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 72 63  DONE ){.      rc
18760 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d   = TCL_OK;.    }
18770 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c  else if( rc==SQL
18780 49 54 45 5f 42 55 53 59 20 7c 7c 20 72 63 3d 3d  ITE_BUSY || rc==
18790 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 29 7b  SQLITE_LOCKED ){
187a0 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  .      Tcl_Appen
187b0 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
187c0 22 72 65 73 74 6f 72 65 20 66 61 69 6c 65 64 3a  "restore failed:
187d0 20 73 6f 75 72 63 65 20 64 61 74 61 62 61 73 65   source database
187e0 20 62 75 73 79 22 2c 0a 20 20 20 20 20 20 20 20   busy",.        
187f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
18800 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20  char*)0);.      
18810 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  rc = TCL_ERROR;.
18820 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
18830 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
18840 74 28 69 6e 74 65 72 70 2c 20 22 72 65 73 74 6f  t(interp, "resto
18850 72 65 20 66 61 69 6c 65 64 3a 20 22 2c 0a 20 20  re failed: ",.  
18860 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
18870 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62 29  _errmsg(pDb->db)
18880 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20  , (char*)0);.   
18890 20 20 20 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f     rc = TCL_ERRO
188a0 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  R;.    }.    sql
188b0 69 74 65 33 5f 63 6c 6f 73 65 28 70 53 72 63 29  ite3_close(pSrc)
188c0 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  ;.    break;.  }
188d0 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20  ..  /*.  **     
188e0 24 64 62 20 73 65 72 69 61 6c 69 7a 65 20 3f 44  $db serialize ?D
188f0 41 54 41 42 41 53 45 3f 0a 20 20 2a 2a 0a 20 20  ATABASE?.  **.  
18900 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 65 72 69  ** Return a seri
18910 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 61 20 64  alization of a d
18920 61 74 61 62 61 73 65 2e 20 20 0a 20 20 2a 2f 0a  atabase.  .  */.
18930 20 20 63 61 73 65 20 44 42 5f 53 45 52 49 41 4c    case DB_SERIAL
18940 49 5a 45 3a 20 7b 0a 23 69 66 6e 64 65 66 20 53  IZE: {.#ifndef S
18950 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 44 45 53  QLITE_ENABLE_DES
18960 45 52 49 41 4c 49 5a 45 0a 20 20 20 20 54 63 6c  ERIALIZE.    Tcl
18970 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
18980 74 65 72 70 2c 20 22 4d 45 4d 44 42 20 6e 6f 74  terp, "MEMDB not
18990 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 74 68   available in th
189a0 69 73 20 62 75 69 6c 64 22 2c 0a 20 20 20 20 20  is build",.     
189b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
189c0 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 72  (char*)0);.    r
189d0 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23  c = TCL_ERROR;.#
189e0 65 6c 73 65 0a 20 20 20 20 63 6f 6e 73 74 20 63  else.    const c
189f0 68 61 72 20 2a 7a 53 63 68 65 6d 61 20 3d 20 6f  har *zSchema = o
18a00 62 6a 63 3e 3d 33 20 3f 20 54 63 6c 5f 47 65 74  bjc>=3 ? Tcl_Get
18a10 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 20  String(objv[2]) 
18a20 3a 20 22 6d 61 69 6e 22 3b 0a 20 20 20 20 73 71  : "main";.    sq
18a30 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 20 3d  lite3_int64 sz =
18a40 20 30 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64   0;.    unsigned
18a50 20 63 68 61 72 20 2a 70 44 61 74 61 3b 0a 20 20   char *pData;.  
18a60 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 26 26    if( objc!=2 &&
18a70 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20   objc!=3 ){.    
18a80 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
18a90 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62  gs(interp, 2, ob
18aa0 6a 76 2c 20 22 3f 44 41 54 41 42 41 53 45 3f 22  jv, "?DATABASE?"
18ab0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 54 43  );.      rc = TC
18ac0 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c  L_ERROR;.    }el
18ad0 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 65  se{.      int ne
18ae0 65 64 46 72 65 65 3b 0a 20 20 20 20 20 20 70 44  edFree;.      pD
18af0 61 74 61 20 3d 20 73 71 6c 69 74 65 33 5f 73 65  ata = sqlite3_se
18b00 72 69 61 6c 69 7a 65 28 70 44 62 2d 3e 64 62 2c  rialize(pDb->db,
18b10 20 7a 53 63 68 65 6d 61 2c 20 26 73 7a 2c 20 53   zSchema, &sz, S
18b20 51 4c 49 54 45 5f 53 45 52 49 41 4c 49 5a 45 5f  QLITE_SERIALIZE_
18b30 4e 4f 43 4f 50 59 29 3b 0a 20 20 20 20 20 20 69  NOCOPY);.      i
18b40 66 28 20 70 44 61 74 61 20 29 7b 0a 20 20 20 20  f( pData ){.    
18b50 20 20 20 20 6e 65 65 64 46 72 65 65 20 3d 20 30      needFree = 0
18b60 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
18b70 20 20 20 20 20 20 20 70 44 61 74 61 20 3d 20 73         pData = s
18b80 71 6c 69 74 65 33 5f 73 65 72 69 61 6c 69 7a 65  qlite3_serialize
18b90 28 70 44 62 2d 3e 64 62 2c 20 7a 53 63 68 65 6d  (pDb->db, zSchem
18ba0 61 2c 20 26 73 7a 2c 20 30 29 3b 0a 20 20 20 20  a, &sz, 0);.    
18bb0 20 20 20 20 6e 65 65 64 46 72 65 65 20 3d 20 31      needFree = 1
18bc0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
18bd0 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
18be0 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
18bf0 42 79 74 65 41 72 72 61 79 4f 62 6a 28 70 44 61  ByteArrayObj(pDa
18c00 74 61 2c 73 7a 29 29 3b 0a 20 20 20 20 20 20 69  ta,sz));.      i
18c10 66 28 20 6e 65 65 64 46 72 65 65 20 29 20 73 71  f( needFree ) sq
18c20 6c 69 74 65 33 5f 66 72 65 65 28 70 44 61 74 61  lite3_free(pData
18c30 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
18c40 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
18c50 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64    /*.  **     $d
18c60 62 20 73 74 61 74 75 73 20 28 73 74 65 70 7c 73  b status (step|s
18c70 6f 72 74 7c 61 75 74 6f 69 6e 64 65 78 7c 76 6d  ort|autoindex|vm
18c80 73 74 65 70 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20  step).  **.  ** 
18c90 44 69 73 70 6c 61 79 20 53 51 4c 49 54 45 5f 53  Display SQLITE_S
18ca0 54 4d 54 53 54 41 54 55 53 5f 46 55 4c 4c 53 43  TMTSTATUS_FULLSC
18cb0 41 4e 5f 53 54 45 50 20 6f 72 0a 20 20 2a 2a 20  AN_STEP or.  ** 
18cc0 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55  SQLITE_STMTSTATU
18cd0 53 5f 53 4f 52 54 20 66 6f 72 20 74 68 65 20 6d  S_SORT for the m
18ce0 6f 73 74 20 72 65 63 65 6e 74 20 65 76 61 6c 2e  ost recent eval.
18cf0 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f  .  */.  case DB_
18d00 53 54 41 54 55 53 3a 20 7b 0a 20 20 20 20 69 6e  STATUS: {.    in
18d10 74 20 76 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  t v;.    const c
18d20 68 61 72 20 2a 7a 4f 70 3b 0a 20 20 20 20 69 66  har *zOp;.    if
18d30 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20  ( objc!=3 ){.   
18d40 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
18d50 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
18d60 62 6a 76 2c 20 22 28 73 74 65 70 7c 73 6f 72 74  bjv, "(step|sort
18d70 7c 61 75 74 6f 69 6e 64 65 78 29 22 29 3b 0a 20  |autoindex)");. 
18d80 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
18d90 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
18da0 20 7a 4f 70 20 3d 20 54 63 6c 5f 47 65 74 53 74   zOp = Tcl_GetSt
18db0 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20  ring(objv[2]);. 
18dc0 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4f     if( strcmp(zO
18dd0 70 2c 20 22 73 74 65 70 22 29 3d 3d 30 20 29 7b  p, "step")==0 ){
18de0 0a 20 20 20 20 20 20 76 20 3d 20 70 44 62 2d 3e  .      v = pDb->
18df0 6e 53 74 65 70 3b 0a 20 20 20 20 7d 65 6c 73 65  nStep;.    }else
18e00 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4f 70 2c   if( strcmp(zOp,
18e10 20 22 73 6f 72 74 22 29 3d 3d 30 20 29 7b 0a 20   "sort")==0 ){. 
18e20 20 20 20 20 20 76 20 3d 20 70 44 62 2d 3e 6e 53       v = pDb->nS
18e30 6f 72 74 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  ort;.    }else i
18e40 66 28 20 73 74 72 63 6d 70 28 7a 4f 70 2c 20 22  f( strcmp(zOp, "
18e50 61 75 74 6f 69 6e 64 65 78 22 29 3d 3d 30 20 29  autoindex")==0 )
18e60 7b 0a 20 20 20 20 20 20 76 20 3d 20 70 44 62 2d  {.      v = pDb-
18e70 3e 6e 49 6e 64 65 78 3b 0a 20 20 20 20 7d 65 6c  >nIndex;.    }el
18e80 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4f  se if( strcmp(zO
18e90 70 2c 20 22 76 6d 73 74 65 70 22 29 3d 3d 30 20  p, "vmstep")==0 
18ea0 29 7b 0a 20 20 20 20 20 20 76 20 3d 20 70 44 62  ){.      v = pDb
18eb0 2d 3e 6e 56 4d 53 74 65 70 3b 0a 20 20 20 20 7d  ->nVMStep;.    }
18ec0 65 6c 73 65 7b 0a 20 20 20 20 20 20 54 63 6c 5f  else{.      Tcl_
18ed0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
18ee0 65 72 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20  erp,.           
18ef0 20 22 62 61 64 20 61 72 67 75 6d 65 6e 74 3a 20   "bad argument: 
18f00 73 68 6f 75 6c 64 20 62 65 20 61 75 74 6f 69 6e  should be autoin
18f10 64 65 78 2c 20 73 74 65 70 2c 20 73 6f 72 74 20  dex, step, sort 
18f20 6f 72 20 76 6d 73 74 65 70 22 2c 0a 20 20 20 20  or vmstep",.    
18f30 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 30          (char*)0
18f40 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
18f50 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
18f60 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  .    Tcl_SetObjR
18f70 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
18f80 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 76 29 29 3b  l_NewIntObj(v));
18f90 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
18fa0 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24  .  /*.  **     $
18fb0 64 62 20 74 69 6d 65 6f 75 74 20 4d 49 4c 4c 45  db timeout MILLE
18fc0 53 45 43 4f 4e 44 53 0a 20 20 2a 2a 0a 20 20 2a  SECONDS.  **.  *
18fd0 2a 20 44 65 6c 61 79 20 66 6f 72 20 74 68 65 20  * Delay for the 
18fe0 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73  number of millis
18ff0 65 63 6f 6e 64 73 20 73 70 65 63 69 66 69 65 64  econds specified
19000 20 77 68 65 6e 20 61 20 66 69 6c 65 20 69 73 20   when a file is 
19010 6c 6f 63 6b 65 64 2e 0a 20 20 2a 2f 0a 20 20 63  locked..  */.  c
19020 61 73 65 20 44 42 5f 54 49 4d 45 4f 55 54 3a 20  ase DB_TIMEOUT: 
19030 7b 0a 20 20 20 20 69 6e 74 20 6d 73 3b 0a 20 20  {.    int ms;.  
19040 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b    if( objc!=3 ){
19050 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  .      Tcl_Wrong
19060 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
19070 32 2c 20 6f 62 6a 76 2c 20 22 4d 49 4c 4c 49 53  2, objv, "MILLIS
19080 45 43 4f 4e 44 53 22 29 3b 0a 20 20 20 20 20 20  ECONDS");.      
19090 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
190a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
190b0 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
190c0 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32  j(interp, objv[2
190d0 5d 2c 20 26 6d 73 29 20 29 20 72 65 74 75 72 6e  ], &ms) ) return
190e0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
190f0 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 74 69 6d  sqlite3_busy_tim
19100 65 6f 75 74 28 70 44 62 2d 3e 64 62 2c 20 6d 73  eout(pDb->db, ms
19110 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  );.    break;.  
19120 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20  }..  /*.  **    
19130 20 24 64 62 20 74 6f 74 61 6c 5f 63 68 61 6e 67   $db total_chang
19140 65 73 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74  es.  **.  ** Ret
19150 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
19160 66 20 72 6f 77 73 20 74 68 61 74 20 77 65 72 65  f rows that were
19170 20 6d 6f 64 69 66 69 65 64 2c 20 69 6e 73 65 72   modified, inser
19180 74 65 64 2c 20 6f 72 20 64 65 6c 65 74 65 64 0a  ted, or deleted.
19190 20 20 2a 2a 20 73 69 6e 63 65 20 74 68 65 20 64    ** since the d
191a0 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 77  atabase handle w
191b0 61 73 20 63 72 65 61 74 65 64 2e 0a 20 20 2a 2f  as created..  */
191c0 0a 20 20 63 61 73 65 20 44 42 5f 54 4f 54 41 4c  .  case DB_TOTAL
191d0 5f 43 48 41 4e 47 45 53 3a 20 7b 0a 20 20 20 20  _CHANGES: {.    
191e0 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 73 75 6c 74  Tcl_Obj *pResult
191f0 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d  ;.    if( objc!=
19200 32 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57  2 ){.      Tcl_W
19210 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
19220 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 22 29  rp, 2, objv, "")
19230 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
19240 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
19250 20 20 20 20 70 52 65 73 75 6c 74 20 3d 20 54 63      pResult = Tc
19260 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_GetObjResult(i
19270 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f  nterp);.    Tcl_
19280 53 65 74 49 6e 74 4f 62 6a 28 70 52 65 73 75 6c  SetIntObj(pResul
19290 74 2c 20 73 71 6c 69 74 65 33 5f 74 6f 74 61 6c  t, sqlite3_total
192a0 5f 63 68 61 6e 67 65 73 28 70 44 62 2d 3e 64 62  _changes(pDb->db
192b0 29 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20  ));.    break;. 
192c0 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20   }..  /*    $db 
192d0 74 72 61 63 65 20 3f 43 41 4c 4c 42 41 43 4b 3f  trace ?CALLBACK?
192e0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 61 6b 65 20  .  **.  ** Make 
192f0 61 72 72 61 6e 67 65 6d 65 6e 74 73 20 74 6f 20  arrangements to 
19300 69 6e 76 6f 6b 65 20 74 68 65 20 43 41 4c 4c 42  invoke the CALLB
19310 41 43 4b 20 72 6f 75 74 69 6e 65 20 66 6f 72 20  ACK routine for 
19320 65 61 63 68 20 53 51 4c 20 73 74 61 74 65 6d 65  each SQL stateme
19330 6e 74 0a 20 20 2a 2a 20 74 68 61 74 20 69 73 20  nt.  ** that is 
19340 65 78 65 63 75 74 65 64 2e 20 20 54 68 65 20 74  executed.  The t
19350 65 78 74 20 6f 66 20 74 68 65 20 53 51 4c 20 69  ext of the SQL i
19360 73 20 61 70 70 65 6e 64 65 64 20 74 6f 20 43 41  s appended to CA
19370 4c 4c 42 41 43 4b 20 62 65 66 6f 72 65 0a 20 20  LLBACK before.  
19380 2a 2a 20 69 74 20 69 73 20 65 78 65 63 75 74 65  ** it is execute
19390 64 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  d..  */.  case D
193a0 42 5f 54 52 41 43 45 3a 20 7b 0a 20 20 20 20 69  B_TRACE: {.    i
193b0 66 28 20 6f 62 6a 63 3e 33 20 29 7b 0a 20 20 20  f( objc>3 ){.   
193c0 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
193d0 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
193e0 62 6a 76 2c 20 22 3f 43 41 4c 4c 42 41 43 4b 3f  bjv, "?CALLBACK?
193f0 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
19400 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
19410 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d  }else if( objc==
19420 32 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  2 ){.      if( p
19430 44 62 2d 3e 7a 54 72 61 63 65 20 29 7b 0a 20 20  Db->zTrace ){.  
19440 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
19450 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70  Result(interp, p
19460 44 62 2d 3e 7a 54 72 61 63 65 2c 20 28 63 68 61  Db->zTrace, (cha
19470 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  r*)0);.      }. 
19480 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
19490 63 68 61 72 20 2a 7a 54 72 61 63 65 3b 0a 20 20  char *zTrace;.  
194a0 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20      int len;.   
194b0 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 54 72 61     if( pDb->zTra
194c0 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63  ce ){.        Tc
194d0 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 54 72 61  l_Free(pDb->zTra
194e0 63 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ce);.      }.   
194f0 20 20 20 7a 54 72 61 63 65 20 3d 20 54 63 6c 5f     zTrace = Tcl_
19500 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
19510 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b  (objv[2], &len);
19520 0a 20 20 20 20 20 20 69 66 28 20 7a 54 72 61 63  .      if( zTrac
19530 65 20 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20 20  e && len>0 ){.  
19540 20 20 20 20 20 20 70 44 62 2d 3e 7a 54 72 61 63        pDb->zTrac
19550 65 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c  e = Tcl_Alloc( l
19560 65 6e 20 2b 20 31 20 29 3b 0a 20 20 20 20 20 20  en + 1 );.      
19570 20 20 6d 65 6d 63 70 79 28 70 44 62 2d 3e 7a 54    memcpy(pDb->zT
19580 72 61 63 65 2c 20 7a 54 72 61 63 65 2c 20 6c 65  race, zTrace, le
19590 6e 2b 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  n+1);.      }els
195a0 65 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e  e{.        pDb->
195b0 7a 54 72 61 63 65 20 3d 20 30 3b 0a 20 20 20 20  zTrace = 0;.    
195c0 20 20 7d 0a 23 69 66 20 21 64 65 66 69 6e 65 64    }.#if !defined
195d0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41  (SQLITE_OMIT_TRA
195e0 43 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  CE) && !defined(
195f0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41  SQLITE_OMIT_FLOA
19600 54 49 4e 47 5f 50 4f 49 4e 54 29 20 26 26 20 5c  TING_POINT) && \
19610 0a 20 20 20 20 21 64 65 66 69 6e 65 64 28 53 51  .    !defined(SQ
19620 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43  LITE_OMIT_DEPREC
19630 41 54 45 44 29 0a 20 20 20 20 20 20 69 66 28 20  ATED).      if( 
19640 70 44 62 2d 3e 7a 54 72 61 63 65 20 29 7b 0a 20  pDb->zTrace ){. 
19650 20 20 20 20 20 20 20 70 44 62 2d 3e 69 6e 74 65         pDb->inte
19660 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20  rp = interp;.   
19670 20 20 20 20 20 73 71 6c 69 74 65 33 5f 74 72 61       sqlite3_tra
19680 63 65 28 70 44 62 2d 3e 64 62 2c 20 44 62 54 72  ce(pDb->db, DbTr
19690 61 63 65 48 61 6e 64 6c 65 72 2c 20 70 44 62 29  aceHandler, pDb)
196a0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
196b0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 74         sqlite3_t
196c0 72 61 63 65 28 70 44 62 2d 3e 64 62 2c 20 30 2c  race(pDb->db, 0,
196d0 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e   0);.      }.#en
196e0 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 62 72  dif.    }.    br
196f0 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20  eak;.  }..  /*  
19700 20 20 24 64 62 20 74 72 61 63 65 5f 76 32 20 3f    $db trace_v2 ?
19710 43 41 4c 4c 42 41 43 4b 3f 20 3f 4d 41 53 4b 3f  CALLBACK? ?MASK?
19720 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 61 6b 65 20  .  **.  ** Make 
19730 61 72 72 61 6e 67 65 6d 65 6e 74 73 20 74 6f 20  arrangements to 
19740 69 6e 76 6f 6b 65 20 74 68 65 20 43 41 4c 4c 42  invoke the CALLB
19750 41 43 4b 20 72 6f 75 74 69 6e 65 20 66 6f 72 20  ACK routine for 
19760 65 61 63 68 20 74 72 61 63 65 20 65 76 65 6e 74  each trace event
19770 0a 20 20 2a 2a 20 6d 61 74 63 68 69 6e 67 20 74  .  ** matching t
19780 68 65 20 6d 61 73 6b 20 74 68 61 74 20 69 73 20  he mask that is 
19790 67 65 6e 65 72 61 74 65 64 2e 20 20 54 68 65 20  generated.  The 
197a0 70 61 72 61 6d 65 74 65 72 73 20 61 72 65 20 61  parameters are a
197b0 70 70 65 6e 64 65 64 20 74 6f 0a 20 20 2a 2a 20  ppended to.  ** 
197c0 43 41 4c 4c 42 41 43 4b 20 62 65 66 6f 72 65 20  CALLBACK before 
197d0 69 74 20 69 73 20 65 78 65 63 75 74 65 64 2e 0a  it is executed..
197e0 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 54    */.  case DB_T
197f0 52 41 43 45 5f 56 32 3a 20 7b 0a 20 20 20 20 69  RACE_V2: {.    i
19800 66 28 20 6f 62 6a 63 3e 34 20 29 7b 0a 20 20 20  f( objc>4 ){.   
19810 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
19820 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
19830 62 6a 76 2c 20 22 3f 43 41 4c 4c 42 41 43 4b 3f  bjv, "?CALLBACK?
19840 20 3f 4d 41 53 4b 3f 22 29 3b 0a 20 20 20 20 20   ?MASK?");.     
19850 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
19860 52 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  R;.    }else if(
19870 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20   objc==2 ){.    
19880 20 20 69 66 28 20 70 44 62 2d 3e 7a 54 72 61 63    if( pDb->zTrac
19890 65 56 32 20 29 7b 0a 20 20 20 20 20 20 20 20 54  eV2 ){.        T
198a0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
198b0 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a 54 72  interp, pDb->zTr
198c0 61 63 65 56 32 2c 20 28 63 68 61 72 2a 29 30 29  aceV2, (char*)0)
198d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
198e0 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20  lse{.      char 
198f0 2a 7a 54 72 61 63 65 56 32 3b 0a 20 20 20 20 20  *zTraceV2;.     
19900 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20   int len;.      
19910 54 63 6c 5f 57 69 64 65 49 6e 74 20 77 4d 61 73  Tcl_WideInt wMas
19920 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28  k = 0;.      if(
19930 20 6f 62 6a 63 3d 3d 34 20 29 7b 0a 20 20 20 20   objc==4 ){.    
19940 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
19950 20 63 68 61 72 20 2a 54 54 59 50 45 5f 73 74 72   char *TTYPE_str
19960 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20  s[] = {.        
19970 20 20 22 73 74 61 74 65 6d 65 6e 74 22 2c 20 22    "statement", "
19980 70 72 6f 66 69 6c 65 22 2c 20 22 72 6f 77 22 2c  profile", "row",
19990 20 22 63 6c 6f 73 65 22 2c 20 30 0a 20 20 20 20   "close", 0.    
199a0 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 20 20 65      };.        e
199b0 6e 75 6d 20 54 54 59 50 45 5f 65 6e 75 6d 20 7b  num TTYPE_enum {
199c0 0a 20 20 20 20 20 20 20 20 20 20 54 54 59 50 45  .          TTYPE
199d0 5f 53 54 4d 54 2c 20 54 54 59 50 45 5f 50 52 4f  _STMT, TTYPE_PRO
199e0 46 49 4c 45 2c 20 54 54 59 50 45 5f 52 4f 57 2c  FILE, TTYPE_ROW,
199f0 20 54 54 59 50 45 5f 43 4c 4f 53 45 0a 20 20 20   TTYPE_CLOSE.   
19a00 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 20 20       };.        
19a10 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20 69  int i;.        i
19a20 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 4c  f( TCL_OK!=Tcl_L
19a30 69 73 74 4f 62 6a 4c 65 6e 67 74 68 28 69 6e 74  istObjLength(int
19a40 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 6c  erp, objv[3], &l
19a50 65 6e 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  en) ){.         
19a60 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
19a70 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  R;.        }.   
19a80 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
19a90 6c 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  len; i++){.     
19aa0 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 4f       Tcl_Obj *pO
19ab0 62 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  bj;.          in
19ac0 74 20 74 74 79 70 65 3b 0a 20 20 20 20 20 20 20  t ttype;.       
19ad0 20 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d 54     if( TCL_OK!=T
19ae0 63 6c 5f 4c 69 73 74 4f 62 6a 49 6e 64 65 78 28  cl_ListObjIndex(
19af0 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c  interp, objv[3],
19b00 20 69 2c 20 26 70 4f 62 6a 29 20 29 7b 0a 20 20   i, &pObj) ){.  
19b10 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
19b20 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
19b30 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
19b40 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 64    if( Tcl_GetInd
19b50 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  exFromObj(interp
19b60 2c 20 70 4f 62 6a 2c 20 54 54 59 50 45 5f 73 74  , pObj, TTYPE_st
19b70 72 73 2c 20 22 74 72 61 63 65 20 74 79 70 65 22  rs, "trace type"
19b80 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
19b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19ba0 20 20 20 20 30 2c 20 26 74 74 79 70 65 29 21 3d      0, &ttype)!=
19bb0 54 43 4c 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  TCL_OK ){.      
19bc0 20 20 20 20 20 20 54 63 6c 5f 57 69 64 65 49 6e        Tcl_WideIn
19bd0 74 20 77 54 79 70 65 3b 0a 20 20 20 20 20 20 20  t wType;.       
19be0 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 45       Tcl_Obj *pE
19bf0 72 72 6f 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69  rror = Tcl_Dupli
19c00 63 61 74 65 4f 62 6a 28 54 63 6c 5f 47 65 74 4f  cateObj(Tcl_GetO
19c10 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29  bjResult(interp)
19c20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 54  );.            T
19c30 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
19c40 70 45 72 72 6f 72 29 3b 0a 20 20 20 20 20 20 20  pError);.       
19c50 20 20 20 20 20 69 66 28 20 54 43 4c 5f 4f 4b 3d       if( TCL_OK=
19c60 3d 54 63 6c 5f 47 65 74 57 69 64 65 49 6e 74 46  =Tcl_GetWideIntF
19c70 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 70  romObj(interp, p
19c80 4f 62 6a 2c 20 26 77 54 79 70 65 29 20 29 7b 0a  Obj, &wType) ){.
19c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54 63                Tc
19ca0 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70  l_DecrRefCount(p
19cb0 45 72 72 6f 72 29 3b 0a 20 20 20 20 20 20 20 20  Error);.        
19cc0 20 20 20 20 20 20 77 4d 61 73 6b 20 7c 3d 20 77        wMask |= w
19cd0 54 79 70 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Type;.          
19ce0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
19cf0 20 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62         Tcl_SetOb
19d00 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
19d10 70 45 72 72 6f 72 29 3b 0a 20 20 20 20 20 20 20  pError);.       
19d20 20 20 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52         Tcl_DecrR
19d30 65 66 43 6f 75 6e 74 28 70 45 72 72 6f 72 29 3b  efCount(pError);
19d40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72  .              r
19d50 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
19d60 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
19d70 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
19d80 20 20 20 20 20 20 20 20 20 20 20 20 73 77 69 74              swit
19d90 63 68 28 20 28 65 6e 75 6d 20 54 54 59 50 45 5f  ch( (enum TTYPE_
19da0 65 6e 75 6d 29 74 74 79 70 65 20 29 7b 0a 20 20  enum)ttype ){.  
19db0 20 20 20 20 20 20 20 20 20 20 20 20 63 61 73 65              case
19dc0 20 54 54 59 50 45 5f 53 54 4d 54 3a 20 20 20 20   TTYPE_STMT:    
19dd0 77 4d 61 73 6b 20 7c 3d 20 53 51 4c 49 54 45 5f  wMask |= SQLITE_
19de0 54 52 41 43 45 5f 53 54 4d 54 3b 20 20 20 20 62  TRACE_STMT;    b
19df0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
19e00 20 20 20 20 63 61 73 65 20 54 54 59 50 45 5f 50      case TTYPE_P
19e10 52 4f 46 49 4c 45 3a 20 77 4d 61 73 6b 20 7c 3d  ROFILE: wMask |=
19e20 20 53 51 4c 49 54 45 5f 54 52 41 43 45 5f 50 52   SQLITE_TRACE_PR
19e30 4f 46 49 4c 45 3b 20 62 72 65 61 6b 3b 0a 20 20  OFILE; break;.  
19e40 20 20 20 20 20 20 20 20 20 20 20 20 63 61 73 65              case
19e50 20 54 54 59 50 45 5f 52 4f 57 3a 20 20 20 20 20   TTYPE_ROW:     
19e60 77 4d 61 73 6b 20 7c 3d 20 53 51 4c 49 54 45 5f  wMask |= SQLITE_
19e70 54 52 41 43 45 5f 52 4f 57 3b 20 20 20 20 20 62  TRACE_ROW;     b
19e80 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
19e90 20 20 20 20 63 61 73 65 20 54 54 59 50 45 5f 43      case TTYPE_C
19ea0 4c 4f 53 45 3a 20 20 20 77 4d 61 73 6b 20 7c 3d  LOSE:   wMask |=
19eb0 20 53 51 4c 49 54 45 5f 54 52 41 43 45 5f 43 4c   SQLITE_TRACE_CL
19ec0 4f 53 45 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20  OSE;   break;.  
19ed0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
19ee0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
19ef0 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
19f00 20 20 20 20 20 20 20 77 4d 61 73 6b 20 3d 20 53         wMask = S
19f10 51 4c 49 54 45 5f 54 52 41 43 45 5f 53 54 4d 54  QLITE_TRACE_STMT
19f20 3b 20 2f 2a 20 75 73 65 20 74 68 65 20 22 6c 65  ; /* use the "le
19f30 67 61 63 79 22 20 64 65 66 61 75 6c 74 20 2a 2f  gacy" default */
19f40 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
19f50 66 28 20 70 44 62 2d 3e 7a 54 72 61 63 65 56 32  f( pDb->zTraceV2
19f60 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f   ){.        Tcl_
19f70 46 72 65 65 28 70 44 62 2d 3e 7a 54 72 61 63 65  Free(pDb->zTrace
19f80 56 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  V2);.      }.   
19f90 20 20 20 7a 54 72 61 63 65 56 32 20 3d 20 54 63     zTraceV2 = Tc
19fa0 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
19fb0 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e  bj(objv[2], &len
19fc0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 54 72  );.      if( zTr
19fd0 61 63 65 56 32 20 26 26 20 6c 65 6e 3e 30 20 29  aceV2 && len>0 )
19fe0 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a  {.        pDb->z
19ff0 54 72 61 63 65 56 32 20 3d 20 54 63 6c 5f 41 6c  TraceV2 = Tcl_Al
1a000 6c 6f 63 28 20 6c 65 6e 20 2b 20 31 20 29 3b 0a  loc( len + 1 );.
1a010 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70          memcpy(p
1a020 44 62 2d 3e 7a 54 72 61 63 65 56 32 2c 20 7a 54  Db->zTraceV2, zT
1a030 72 61 63 65 56 32 2c 20 6c 65 6e 2b 31 29 3b 0a  raceV2, len+1);.
1a040 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1a050 20 20 20 20 20 70 44 62 2d 3e 7a 54 72 61 63 65       pDb->zTrace
1a060 56 32 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  V2 = 0;.      }.
1a070 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
1a080 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 29 20  ITE_OMIT_TRACE) 
1a090 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
1a0a0 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47  TE_OMIT_FLOATING
1a0b0 5f 50 4f 49 4e 54 29 0a 20 20 20 20 20 20 69 66  _POINT).      if
1a0c0 28 20 70 44 62 2d 3e 7a 54 72 61 63 65 56 32 20  ( pDb->zTraceV2 
1a0d0 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e  ){.        pDb->
1a0e0 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b  interp = interp;
1a0f0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1a100 5f 74 72 61 63 65 5f 76 32 28 70 44 62 2d 3e 64  _trace_v2(pDb->d
1a110 62 2c 20 28 75 6e 73 69 67 6e 65 64 29 77 4d 61  b, (unsigned)wMa
1a120 73 6b 2c 20 44 62 54 72 61 63 65 56 32 48 61 6e  sk, DbTraceV2Han
1a130 64 6c 65 72 2c 20 70 44 62 29 3b 0a 20 20 20 20  dler, pDb);.    
1a140 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1a150 20 73 71 6c 69 74 65 33 5f 74 72 61 63 65 5f 76   sqlite3_trace_v
1a160 32 28 70 44 62 2d 3e 64 62 2c 20 30 2c 20 30 2c  2(pDb->db, 0, 0,
1a170 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e   0);.      }.#en
1a180 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 62 72  dif.    }.    br
1a190 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20  eak;.  }..  /*  
1a1a0 20 20 24 64 62 20 74 72 61 6e 73 61 63 74 69 6f    $db transactio
1a1b0 6e 20 5b 2d 64 65 66 65 72 72 65 64 7c 2d 69 6d  n [-deferred|-im
1a1c0 6d 65 64 69 61 74 65 7c 2d 65 78 63 6c 75 73 69  mediate|-exclusi
1a1d0 76 65 5d 20 53 43 52 49 50 54 0a 20 20 2a 2a 0a  ve] SCRIPT.  **.
1a1e0 20 20 2a 2a 20 53 74 61 72 74 20 61 20 6e 65 77    ** Start a new
1a1f0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 28 69 66   transaction (if
1a200 20 77 65 20 61 72 65 20 6e 6f 74 20 61 6c 72 65   we are not alre
1a210 61 64 79 20 69 6e 20 74 68 65 20 6d 69 64 73 74  ady in the midst
1a220 20 6f 66 20 61 0a 20 20 2a 2a 20 74 72 61 6e 73   of a.  ** trans
1a230 61 63 74 69 6f 6e 29 20 61 6e 64 20 65 78 65 63  action) and exec
1a240 75 74 65 20 74 68 65 20 54 43 4c 20 73 63 72 69  ute the TCL scri
1a250 70 74 20 53 43 52 49 50 54 2e 20 20 41 66 74 65  pt SCRIPT.  Afte
1a260 72 20 53 43 52 49 50 54 0a 20 20 2a 2a 20 63 6f  r SCRIPT.  ** co
1a270 6d 70 6c 65 74 65 73 2c 20 65 69 74 68 65 72 20  mpletes, either 
1a280 63 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73  commit the trans
1a290 61 63 74 69 6f 6e 20 6f 72 20 72 6f 6c 6c 20 69  action or roll i
1a2a0 74 20 62 61 63 6b 20 69 66 20 53 43 52 49 50 54  t back if SCRIPT
1a2b0 0a 20 20 2a 2a 20 74 68 72 6f 77 73 20 61 6e 20  .  ** throws an 
1a2c0 65 78 63 65 70 74 69 6f 6e 2e 20 20 4f 72 20 69  exception.  Or i
1a2d0 66 20 6e 6f 20 6e 65 77 20 74 72 61 6e 73 61 74  f no new transat
1a2e0 69 6f 6e 20 77 61 73 20 73 74 61 72 74 65 64 2c  ion was started,
1a2f0 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 0a 20 20 2a   do nothing..  *
1a300 2a 20 70 61 73 73 20 74 68 65 20 65 78 63 65 70  * pass the excep
1a310 74 69 6f 6e 20 6f 6e 20 75 70 20 74 68 65 20 73  tion on up the s
1a320 74 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  tack..  **.  ** 
1a330 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20 77 61 73  This command was
1a340 20 69 6e 73 70 69 72 65 64 20 62 79 20 44 61 76   inspired by Dav
1a350 65 20 54 68 6f 6d 61 73 27 73 20 74 61 6c 6b 20  e Thomas's talk 
1a360 6f 6e 20 52 75 62 79 20 61 74 20 74 68 65 0a 20  on Ruby at the. 
1a370 20 2a 2a 20 32 30 30 35 20 4f 27 52 65 69 6c 6c   ** 2005 O'Reill
1a380 79 20 4f 70 65 6e 20 53 6f 75 72 63 65 20 43 6f  y Open Source Co
1a390 6e 76 65 6e 74 69 6f 6e 20 28 4f 53 43 4f 4e 29  nvention (OSCON)
1a3a0 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  ..  */.  case DB
1a3b0 5f 54 52 41 4e 53 41 43 54 49 4f 4e 3a 20 7b 0a  _TRANSACTION: {.
1a3c0 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 53 63      Tcl_Obj *pSc
1a3d0 72 69 70 74 3b 0a 20 20 20 20 63 6f 6e 73 74 20  ript;.    const 
1a3e0 63 68 61 72 20 2a 7a 42 65 67 69 6e 20 3d 20 22  char *zBegin = "
1a3f0 53 41 56 45 50 4f 49 4e 54 20 5f 74 63 6c 5f 74  SAVEPOINT _tcl_t
1a400 72 61 6e 73 61 63 74 69 6f 6e 22 3b 0a 20 20 20  ransaction";.   
1a410 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 26 26 20   if( objc!=3 && 
1a420 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 20  objc!=4 ){.     
1a430 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
1a440 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a  s(interp, 2, obj
1a450 76 2c 20 22 5b 54 59 50 45 5d 20 53 43 52 49 50  v, "[TYPE] SCRIP
1a460 54 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  T");.      retur
1a470 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
1a480 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 44 62 2d   }..    if( pDb-
1a490 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 30  >nTransaction==0
1a4a0 20 26 26 20 6f 62 6a 63 3d 3d 34 20 29 7b 0a 20   && objc==4 ){. 
1a4b0 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73       static cons
1a4c0 74 20 63 68 61 72 20 2a 54 54 59 50 45 5f 73 74  t char *TTYPE_st
1a4d0 72 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20  rs[] = {.       
1a4e0 20 22 64 65 66 65 72 72 65 64 22 2c 20 20 20 22   "deferred",   "
1a4f0 65 78 63 6c 75 73 69 76 65 22 2c 20 20 22 69 6d  exclusive",  "im
1a500 6d 65 64 69 61 74 65 22 2c 20 30 0a 20 20 20 20  mediate", 0.    
1a510 20 20 7d 3b 0a 20 20 20 20 20 20 65 6e 75 6d 20    };.      enum 
1a520 54 54 59 50 45 5f 65 6e 75 6d 20 7b 0a 20 20 20  TTYPE_enum {.   
1a530 20 20 20 20 20 54 54 59 50 45 5f 44 45 46 45 52       TTYPE_DEFER
1a540 52 45 44 2c 20 54 54 59 50 45 5f 45 58 43 4c 55  RED, TTYPE_EXCLU
1a550 53 49 56 45 2c 20 54 54 59 50 45 5f 49 4d 4d 45  SIVE, TTYPE_IMME
1a560 44 49 41 54 45 0a 20 20 20 20 20 20 7d 3b 0a 20  DIATE.      };. 
1a570 20 20 20 20 20 69 6e 74 20 74 74 79 70 65 3b 0a       int ttype;.
1a580 20 20 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65        if( Tcl_Ge
1a590 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e  tIndexFromObj(in
1a5a0 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 54  terp, objv[2], T
1a5b0 54 59 50 45 5f 73 74 72 73 2c 20 22 74 72 61 6e  TYPE_strs, "tran
1a5c0 73 61 63 74 69 6f 6e 20 74 79 70 65 22 2c 0a 20  saction type",. 
1a5d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a5e0 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20               0, 
1a5f0 26 74 74 79 70 65 29 20 29 7b 0a 20 20 20 20 20  &ttype) ){.     
1a600 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
1a610 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ROR;.      }.   
1a620 20 20 20 73 77 69 74 63 68 28 20 28 65 6e 75 6d     switch( (enum
1a630 20 54 54 59 50 45 5f 65 6e 75 6d 29 74 74 79 70   TTYPE_enum)ttyp
1a640 65 20 29 7b 0a 20 20 20 20 20 20 20 20 63 61 73  e ){.        cas
1a650 65 20 54 54 59 50 45 5f 44 45 46 45 52 52 45 44  e TTYPE_DEFERRED
1a660 3a 20 20 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f  :    /* no-op */
1a670 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1a680 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
1a690 20 63 61 73 65 20 54 54 59 50 45 5f 45 58 43 4c   case TTYPE_EXCL
1a6a0 55 53 49 56 45 3a 20 20 20 7a 42 65 67 69 6e 20  USIVE:   zBegin 
1a6b0 3d 20 22 42 45 47 49 4e 20 45 58 43 4c 55 53 49  = "BEGIN EXCLUSI
1a6c0 56 45 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20  VE";  break;.   
1a6d0 20 20 20 20 20 63 61 73 65 20 54 54 59 50 45 5f       case TTYPE_
1a6e0 49 4d 4d 45 44 49 41 54 45 3a 20 20 20 7a 42 65  IMMEDIATE:   zBe
1a6f0 67 69 6e 20 3d 20 22 42 45 47 49 4e 20 49 4d 4d  gin = "BEGIN IMM
1a700 45 44 49 41 54 45 22 3b 20 20 62 72 65 61 6b 3b  EDIATE";  break;
1a710 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1a720 20 20 20 70 53 63 72 69 70 74 20 3d 20 6f 62 6a     pScript = obj
1a730 76 5b 6f 62 6a 63 2d 31 5d 3b 0a 0a 20 20 20 20  v[objc-1];..    
1a740 2f 2a 20 52 75 6e 20 74 68 65 20 53 51 4c 69 74  /* Run the SQLit
1a750 65 20 42 45 47 49 4e 20 63 6f 6d 6d 61 6e 64 20  e BEGIN command 
1a760 74 6f 20 6f 70 65 6e 20 61 20 74 72 61 6e 73 61  to open a transa
1a770 63 74 69 6f 6e 20 6f 72 20 73 61 76 65 70 6f 69  ction or savepoi
1a780 6e 74 2e 20 2a 2f 0a 20 20 20 20 70 44 62 2d 3e  nt. */.    pDb->
1a790 64 69 73 61 62 6c 65 41 75 74 68 2b 2b 3b 0a 20  disableAuth++;. 
1a7a0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
1a7b0 65 78 65 63 28 70 44 62 2d 3e 64 62 2c 20 7a 42  exec(pDb->db, zB
1a7c0 65 67 69 6e 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  egin, 0, 0, 0);.
1a7d0 20 20 20 20 70 44 62 2d 3e 64 69 73 61 62 6c 65      pDb->disable
1a7e0 41 75 74 68 2d 2d 3b 0a 20 20 20 20 69 66 28 20  Auth--;.    if( 
1a7f0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1a800 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  .      Tcl_Appen
1a810 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
1a820 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70  sqlite3_errmsg(p
1a830 44 62 2d 3e 64 62 29 2c 20 28 63 68 61 72 2a 29  Db->db), (char*)
1a840 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  0);.      return
1a850 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
1a860 7d 0a 20 20 20 20 70 44 62 2d 3e 6e 54 72 61 6e  }.    pDb->nTran
1a870 73 61 63 74 69 6f 6e 2b 2b 3b 0a 0a 20 20 20 20  saction++;..    
1a880 2f 2a 20 49 66 20 75 73 69 6e 67 20 4e 52 45 2c  /* If using NRE,
1a890 20 73 63 68 65 64 75 6c 65 20 61 20 63 61 6c 6c   schedule a call
1a8a0 62 61 63 6b 20 74 6f 20 69 6e 76 6f 6b 65 20 74  back to invoke t
1a8b0 68 65 20 73 63 72 69 70 74 20 70 53 63 72 69 70  he script pScrip
1a8c0 74 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 61  t, then.    ** a
1a8d0 20 73 65 63 6f 6e 64 20 63 61 6c 6c 62 61 63 6b   second callback
1a8e0 20 74 6f 20 63 6f 6d 6d 69 74 20 28 6f 72 20 72   to commit (or r
1a8f0 6f 6c 6c 62 61 63 6b 29 20 74 68 65 20 74 72 61  ollback) the tra
1a900 6e 73 61 63 74 69 6f 6e 20 6f 72 20 73 61 76 65  nsaction or save
1a910 70 6f 69 6e 74 0a 20 20 20 20 2a 2a 20 6f 70 65  point.    ** ope
1a920 6e 65 64 20 61 62 6f 76 65 2e 20 49 66 20 6e 6f  ned above. If no
1a930 74 20 75 73 69 6e 67 20 4e 52 45 2c 20 65 76 61  t using NRE, eva
1a940 6c 75 61 74 65 20 74 68 65 20 73 63 72 69 70 74  luate the script
1a950 20 64 69 72 65 63 74 6c 79 2c 20 74 68 65 6e 0a   directly, then.
1a960 20 20 20 20 2a 2a 20 63 61 6c 6c 20 66 75 6e 63      ** call func
1a970 74 69 6f 6e 20 44 62 54 72 61 6e 73 50 6f 73 74  tion DbTransPost
1a980 43 6d 64 28 29 20 74 6f 20 63 6f 6d 6d 69 74 20  Cmd() to commit 
1a990 28 6f 72 20 72 6f 6c 6c 62 61 63 6b 29 20 74 68  (or rollback) th
1a9a0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20  e transaction.  
1a9b0 20 20 2a 2a 20 6f 72 20 73 61 76 65 70 6f 69 6e    ** or savepoin
1a9c0 74 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 44  t.  */.    if( D
1a9d0 62 55 73 65 4e 72 65 28 29 20 29 7b 0a 20 20 20  bUseNre() ){.   
1a9e0 20 20 20 54 63 6c 5f 4e 52 41 64 64 43 61 6c 6c     Tcl_NRAddCall
1a9f0 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 44 62 54  back(interp, DbT
1aa00 72 61 6e 73 50 6f 73 74 43 6d 64 2c 20 63 64 2c  ransPostCmd, cd,
1aa10 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20   0, 0, 0);.     
1aa20 20 28 76 6f 69 64 29 54 63 6c 5f 4e 52 45 76 61   (void)Tcl_NREva
1aa30 6c 4f 62 6a 28 69 6e 74 65 72 70 2c 20 70 53 63  lObj(interp, pSc
1aa40 72 69 70 74 2c 20 30 29 3b 0a 20 20 20 20 7d 65  ript, 0);.    }e
1aa50 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
1aa60 44 62 54 72 61 6e 73 50 6f 73 74 43 6d 64 28 26  DbTransPostCmd(&
1aa70 63 64 2c 20 69 6e 74 65 72 70 2c 20 54 63 6c 5f  cd, interp, Tcl_
1aa80 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70  EvalObjEx(interp
1aa90 2c 20 70 53 63 72 69 70 74 2c 20 30 29 29 3b 0a  , pScript, 0));.
1aaa0 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b      }.    break;
1aab0 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
1aac0 20 20 20 24 64 62 20 75 6e 6c 6f 63 6b 5f 6e 6f     $db unlock_no
1aad0 74 69 66 79 20 3f 73 63 72 69 70 74 3f 0a 20 20  tify ?script?.  
1aae0 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 55 4e 4c  */.  case DB_UNL
1aaf0 4f 43 4b 5f 4e 4f 54 49 46 59 3a 20 7b 0a 23 69  OCK_NOTIFY: {.#i
1ab00 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  fndef SQLITE_ENA
1ab10 42 4c 45 5f 55 4e 4c 4f 43 4b 5f 4e 4f 54 49 46  BLE_UNLOCK_NOTIF
1ab20 59 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  Y.    Tcl_Append
1ab30 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
1ab40 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79 20 6e 6f  unlock_notify no
1ab50 74 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 74  t available in t
1ab60 68 69 73 20 62 75 69 6c 64 22 2c 0a 20 20 20 20  his build",.    
1ab70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ab80 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20   (char*)0);.    
1ab90 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  rc = TCL_ERROR;.
1aba0 23 65 6c 73 65 0a 20 20 20 20 69 66 28 20 6f 62  #else.    if( ob
1abb0 6a 63 21 3d 32 20 26 26 20 6f 62 6a 63 21 3d 33  jc!=2 && objc!=3
1abc0 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72   ){.      Tcl_Wr
1abd0 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
1abe0 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 53 43  p, 2, objv, "?SC
1abf0 52 49 50 54 3f 22 29 3b 0a 20 20 20 20 20 20 72  RIPT?");.      r
1ac00 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  c = TCL_ERROR;. 
1ac10 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1ac20 76 6f 69 64 20 28 2a 78 4e 6f 74 69 66 79 29 28  void (*xNotify)(
1ac30 76 6f 69 64 20 2a 2a 2c 20 69 6e 74 29 20 3d 20  void **, int) = 
1ac40 30 3b 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70  0;.      void *p
1ac50 4e 6f 74 69 66 79 41 72 67 20 3d 20 30 3b 0a 0a  NotifyArg = 0;..
1ac60 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70        if( pDb->p
1ac70 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 20 29 7b 0a  UnlockNotify ){.
1ac80 20 20 20 20 20 20 20 20 54 63 6c 5f 44 65 63 72          Tcl_Decr
1ac90 52 65 66 43 6f 75 6e 74 28 70 44 62 2d 3e 70 55  RefCount(pDb->pU
1aca0 6e 6c 6f 63 6b 4e 6f 74 69 66 79 29 3b 0a 20 20  nlockNotify);.  
1acb0 20 20 20 20 20 20 70 44 62 2d 3e 70 55 6e 6c 6f        pDb->pUnlo
1acc0 63 6b 4e 6f 74 69 66 79 20 3d 20 30 3b 0a 20 20  ckNotify = 0;.  
1acd0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28      }..      if(
1ace0 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20 20 20 20   objc==3 ){.    
1acf0 20 20 20 20 78 4e 6f 74 69 66 79 20 3d 20 44 62      xNotify = Db
1ad00 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 3b 0a 20 20  UnlockNotify;.  
1ad10 20 20 20 20 20 20 70 4e 6f 74 69 66 79 41 72 67        pNotifyArg
1ad20 20 3d 20 28 76 6f 69 64 20 2a 29 70 44 62 3b 0a   = (void *)pDb;.
1ad30 20 20 20 20 20 20 20 20 70 44 62 2d 3e 70 55 6e          pDb->pUn
1ad40 6c 6f 63 6b 4e 6f 74 69 66 79 20 3d 20 6f 62 6a  lockNotify = obj
1ad50 76 5b 32 5d 3b 0a 20 20 20 20 20 20 20 20 54 63  v[2];.        Tc
1ad60 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70  l_IncrRefCount(p
1ad70 44 62 2d 3e 70 55 6e 6c 6f 63 6b 4e 6f 74 69 66  Db->pUnlockNotif
1ad80 79 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  y);.      }..   
1ad90 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 75     if( sqlite3_u
1ada0 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79 28 70 44 62  nlock_notify(pDb
1adb0 2d 3e 64 62 2c 20 78 4e 6f 74 69 66 79 2c 20 70  ->db, xNotify, p
1adc0 4e 6f 74 69 66 79 41 72 67 29 20 29 7b 0a 20 20  NotifyArg) ){.  
1add0 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
1ade0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 73  Result(interp, s
1adf0 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44  qlite3_errmsg(pD
1ae00 62 2d 3e 64 62 29 2c 20 28 63 68 61 72 2a 29 30  b->db), (char*)0
1ae10 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
1ae20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  TCL_ERROR;.     
1ae30 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a   }.    }.#endif.
1ae40 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
1ae50 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 24 64 62    /*.  **    $db
1ae60 20 70 72 65 75 70 64 61 74 65 5f 68 6f 6f 6b 20   preupdate_hook 
1ae70 63 6f 75 6e 74 0a 20 20 2a 2a 20 20 20 20 24 64  count.  **    $d
1ae80 62 20 70 72 65 75 70 64 61 74 65 5f 68 6f 6f 6b  b preupdate_hook
1ae90 20 68 6f 6f 6b 20 3f 53 43 52 49 50 54 3f 0a 20   hook ?SCRIPT?. 
1aea0 20 2a 2a 20 20 20 20 24 64 62 20 70 72 65 75 70   **    $db preup
1aeb0 64 61 74 65 5f 68 6f 6f 6b 20 6e 65 77 20 49 4e  date_hook new IN
1aec0 44 45 58 0a 20 20 2a 2a 20 20 20 20 24 64 62 20  DEX.  **    $db 
1aed0 70 72 65 75 70 64 61 74 65 5f 68 6f 6f 6b 20 6f  preupdate_hook o
1aee0 6c 64 20 49 4e 44 45 58 0a 20 20 2a 2f 0a 20 20  ld INDEX.  */.  
1aef0 63 61 73 65 20 44 42 5f 50 52 45 55 50 44 41 54  case DB_PREUPDAT
1af00 45 3a 20 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  E: {.#ifndef SQL
1af10 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52 45 55 50  ITE_ENABLE_PREUP
1af20 44 41 54 45 5f 48 4f 4f 4b 0a 20 20 20 20 54 63  DATE_HOOK.    Tc
1af30 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
1af40 6e 74 65 72 70 2c 20 22 70 72 65 75 70 64 61 74  nterp, "preupdat
1af50 65 5f 68 6f 6f 6b 20 77 61 73 20 6f 6d 69 74 74  e_hook was omitt
1af60 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69  ed at compile-ti
1af70 6d 65 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20  me", .          
1af80 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
1af90 2a 29 30 29 3b 0a 20 20 20 20 72 63 20 3d 20 54  *)0);.    rc = T
1afa0 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a  CL_ERROR;.#else.
1afb0 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
1afc0 20 63 68 61 72 20 2a 61 7a 53 75 62 5b 5d 20 3d   char *azSub[] =
1afd0 20 7b 22 63 6f 75 6e 74 22 2c 20 22 64 65 70 74   {"count", "dept
1afe0 68 22 2c 20 22 68 6f 6f 6b 22 2c 20 22 6e 65 77  h", "hook", "new
1aff0 22 2c 20 22 6f 6c 64 22 2c 20 30 7d 3b 0a 20 20  ", "old", 0};.  
1b000 20 20 65 6e 75 6d 20 44 62 50 72 65 75 70 64 61    enum DbPreupda
1b010 74 65 53 75 62 43 6d 64 20 7b 0a 20 20 20 20 20  teSubCmd {.     
1b020 20 50 52 45 5f 43 4f 55 4e 54 2c 20 50 52 45 5f   PRE_COUNT, PRE_
1b030 44 45 50 54 48 2c 20 50 52 45 5f 48 4f 4f 4b 2c  DEPTH, PRE_HOOK,
1b040 20 50 52 45 5f 4e 45 57 2c 20 50 52 45 5f 4f 4c   PRE_NEW, PRE_OL
1b050 44 0a 20 20 20 20 7d 3b 0a 20 20 20 20 69 6e 74  D.    };.    int
1b060 20 69 53 75 62 3b 0a 0a 20 20 20 20 69 66 28 20   iSub;..    if( 
1b070 6f 62 6a 63 3c 33 20 29 7b 0a 20 20 20 20 20 20  objc<3 ){.      
1b080 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
1b090 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76  (interp, 2, objv
1b0a0 2c 20 22 53 55 42 2d 43 4f 4d 4d 41 4e 44 20 3f  , "SUB-COMMAND ?
1b0b0 41 52 47 53 3f 22 29 3b 0a 20 20 20 20 7d 0a 20  ARGS?");.    }. 
1b0c0 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e     if( Tcl_GetIn
1b0d0 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  dexFromObj(inter
1b0e0 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 61 7a 53 75  p, objv[2], azSu
1b0f0 62 2c 20 22 73 75 62 2d 63 6f 6d 6d 61 6e 64 22  b, "sub-command"
1b100 2c 20 30 2c 20 26 69 53 75 62 29 20 29 7b 0a 20  , 0, &iSub) ){. 
1b110 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
1b120 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20  ERROR;.    }..  
1b130 20 20 73 77 69 74 63 68 28 20 28 65 6e 75 6d 20    switch( (enum 
1b140 44 62 50 72 65 75 70 64 61 74 65 53 75 62 43 6d  DbPreupdateSubCm
1b150 64 29 69 53 75 62 20 29 7b 0a 20 20 20 20 20 20  d)iSub ){.      
1b160 63 61 73 65 20 50 52 45 5f 43 4f 55 4e 54 3a 20  case PRE_COUNT: 
1b170 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43  {.        int nC
1b180 6f 6c 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  ol = sqlite3_pre
1b190 75 70 64 61 74 65 5f 63 6f 75 6e 74 28 70 44 62  update_count(pDb
1b1a0 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20 20 20 54  ->db);.        T
1b1b0 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
1b1c0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49  interp, Tcl_NewI
1b1d0 6e 74 4f 62 6a 28 6e 43 6f 6c 29 29 3b 0a 20 20  ntObj(nCol));.  
1b1e0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1b1f0 20 20 20 7d 0a 0a 20 20 20 20 20 20 63 61 73 65     }..      case
1b200 20 50 52 45 5f 48 4f 4f 4b 3a 20 7b 0a 20 20 20   PRE_HOOK: {.   
1b210 20 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 34 20       if( objc>4 
1b220 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c  ){.          Tcl
1b230 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
1b240 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22  terp, 2, objv, "
1b250 68 6f 6f 6b 20 3f 53 43 52 49 50 54 3f 22 29 3b  hook ?SCRIPT?");
1b260 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
1b270 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
1b280 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 44       }.        D
1b290 62 48 6f 6f 6b 43 6d 64 28 69 6e 74 65 72 70 2c  bHookCmd(interp,
1b2a0 20 70 44 62 2c 20 28 6f 62 6a 63 3d 3d 34 20 3f   pDb, (objc==4 ?
1b2b0 20 6f 62 6a 76 5b 33 5d 20 3a 20 30 29 2c 20 26   objv[3] : 0), &
1b2c0 70 44 62 2d 3e 70 50 72 65 55 70 64 61 74 65 48  pDb->pPreUpdateH
1b2d0 6f 6f 6b 29 3b 0a 20 20 20 20 20 20 20 20 62 72  ook);.        br
1b2e0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  eak;.      }..  
1b2f0 20 20 20 20 63 61 73 65 20 50 52 45 5f 44 45 50      case PRE_DEP
1b300 54 48 3a 20 7b 0a 20 20 20 20 20 20 20 20 54 63  TH: {.        Tc
1b310 6c 5f 4f 62 6a 20 2a 70 52 65 74 3b 0a 20 20 20  l_Obj *pRet;.   
1b320 20 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 33       if( objc!=3
1b330 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54 63   ){.          Tc
1b340 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
1b350 6e 74 65 72 70 2c 20 33 2c 20 6f 62 6a 76 2c 20  nterp, 3, objv, 
1b360 22 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  "");.          r
1b370 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1b380 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1b390 20 20 20 70 52 65 74 20 3d 20 54 63 6c 5f 4e 65     pRet = Tcl_Ne
1b3a0 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f  wIntObj(sqlite3_
1b3b0 70 72 65 75 70 64 61 74 65 5f 64 65 70 74 68 28  preupdate_depth(
1b3c0 70 44 62 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20  pDb->db));.     
1b3d0 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73     Tcl_SetObjRes
1b3e0 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74  ult(interp, pRet
1b3f0 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
1b400 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
1b410 20 63 61 73 65 20 50 52 45 5f 4e 45 57 3a 0a 20   case PRE_NEW:. 
1b420 20 20 20 20 20 63 61 73 65 20 50 52 45 5f 4f 4c       case PRE_OL
1b430 44 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  D: {.        int
1b440 20 69 49 64 78 3b 0a 20 20 20 20 20 20 20 20 73   iIdx;.        s
1b450 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56  qlite3_value *pV
1b460 61 6c 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66  alue;.        if
1b470 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20  ( objc!=4 ){.   
1b480 20 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67         Tcl_Wrong
1b490 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
1b4a0 33 2c 20 6f 62 6a 76 2c 20 22 49 4e 44 45 58 22  3, objv, "INDEX"
1b4b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
1b4c0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1b4d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1b4e0 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46   if( Tcl_GetIntF
1b4f0 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
1b500 62 6a 76 5b 33 5d 2c 20 26 69 49 64 78 29 20 29  bjv[3], &iIdx) )
1b510 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
1b520 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1b530 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
1b540 20 69 66 28 20 69 53 75 62 3d 3d 50 52 45 5f 4f   if( iSub==PRE_O
1b550 4c 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  LD ){.          
1b560 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
1b570 75 70 64 61 74 65 5f 6f 6c 64 28 70 44 62 2d 3e  update_old(pDb->
1b580 64 62 2c 20 69 49 64 78 2c 20 26 70 56 61 6c 75  db, iIdx, &pValu
1b590 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  e);.        }els
1b5a0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  e{.          ass
1b5b0 65 72 74 28 20 69 53 75 62 3d 3d 50 52 45 5f 4e  ert( iSub==PRE_N
1b5c0 45 57 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  EW );.          
1b5d0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
1b5e0 75 70 64 61 74 65 5f 6e 65 77 28 70 44 62 2d 3e  update_new(pDb->
1b5f0 64 62 2c 20 69 49 64 78 2c 20 26 70 56 61 6c 75  db, iIdx, &pValu
1b600 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  e);.        }.. 
1b610 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
1b620 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1b630 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70        Tcl_Obj *p
1b640 4f 62 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 70  Obj;.          p
1b650 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72  Obj = Tcl_NewStr
1b660 69 6e 67 4f 62 6a 28 28 63 68 61 72 2a 29 73 71  ingObj((char*)sq
1b670 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
1b680 28 70 56 61 6c 75 65 29 2c 20 2d 31 29 3b 0a 20  (pValue), -1);. 
1b690 20 20 20 20 20 20 20 20 20 54 63 6c 5f 53 65 74           Tcl_Set
1b6a0 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
1b6b0 2c 20 70 4f 62 6a 29 3b 0a 20 20 20 20 20 20 20  , pObj);.       
1b6c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1b6d0 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
1b6e0 6c 74 28 69 6e 74 65 72 70 2c 20 73 71 6c 69 74  lt(interp, sqlit
1b6f0 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64  e3_errmsg(pDb->d
1b700 62 29 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20  b), (char*)0);. 
1b710 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
1b720 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  TCL_ERROR;.     
1b730 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1b740 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
1b750 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52 45 55 50  ITE_ENABLE_PREUP
1b760 44 41 54 45 5f 48 4f 4f 4b 20 2a 2f 0a 20 20 20  DATE_HOOK */.   
1b770 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
1b780 2a 0a 20 20 2a 2a 20 20 20 20 24 64 62 20 77 61  *.  **    $db wa
1b790 6c 5f 68 6f 6f 6b 20 3f 73 63 72 69 70 74 3f 0a  l_hook ?script?.
1b7a0 20 20 2a 2a 20 20 20 20 24 64 62 20 75 70 64 61    **    $db upda
1b7b0 74 65 5f 68 6f 6f 6b 20 3f 73 63 72 69 70 74 3f  te_hook ?script?
1b7c0 0a 20 20 2a 2a 20 20 20 20 24 64 62 20 72 6f 6c  .  **    $db rol
1b7d0 6c 62 61 63 6b 5f 68 6f 6f 6b 20 3f 73 63 72 69  lback_hook ?scri
1b7e0 70 74 3f 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  pt?.  */.  case 
1b7f0 44 42 5f 57 41 4c 5f 48 4f 4f 4b 3a 0a 20 20 63  DB_WAL_HOOK:.  c
1b800 61 73 65 20 44 42 5f 55 50 44 41 54 45 5f 48 4f  ase DB_UPDATE_HO
1b810 4f 4b 3a 0a 20 20 63 61 73 65 20 44 42 5f 52 4f  OK:.  case DB_RO
1b820 4c 4c 42 41 43 4b 5f 48 4f 4f 4b 3a 20 7b 0a 20  LLBACK_HOOK: {. 
1b830 20 20 20 2f 2a 20 73 65 74 20 70 70 48 6f 6f 6b     /* set ppHook
1b840 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 70 55 70   to point at pUp
1b850 64 61 74 65 48 6f 6f 6b 20 6f 72 20 70 52 6f 6c  dateHook or pRol
1b860 6c 62 61 63 6b 48 6f 6f 6b 2c 20 64 65 70 65 6e  lbackHook, depen
1b870 64 69 6e 67 20 6f 6e 0a 20 20 20 20 2a 2a 20 77  ding on.    ** w
1b880 68 65 74 68 65 72 20 5b 24 64 62 20 75 70 64 61  hether [$db upda
1b890 74 65 5f 68 6f 6f 6b 5d 20 6f 72 20 5b 24 64 62  te_hook] or [$db
1b8a0 20 72 6f 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 5d 20   rollback_hook] 
1b8b0 77 61 73 20 69 6e 76 6f 6b 65 64 2e 0a 20 20 20  was invoked..   
1b8c0 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20   */.    Tcl_Obj 
1b8d0 2a 2a 70 70 48 6f 6f 6b 20 3d 20 30 3b 0a 20 20  **ppHook = 0;.  
1b8e0 20 20 69 66 28 20 63 68 6f 69 63 65 3d 3d 44 42    if( choice==DB
1b8f0 5f 57 41 4c 5f 48 4f 4f 4b 20 29 20 70 70 48 6f  _WAL_HOOK ) ppHo
1b900 6f 6b 20 3d 20 26 70 44 62 2d 3e 70 57 61 6c 48  ok = &pDb->pWalH
1b910 6f 6f 6b 3b 0a 20 20 20 20 69 66 28 20 63 68 6f  ook;.    if( cho
1b920 69 63 65 3d 3d 44 42 5f 55 50 44 41 54 45 5f 48  ice==DB_UPDATE_H
1b930 4f 4f 4b 20 29 20 70 70 48 6f 6f 6b 20 3d 20 26  OOK ) ppHook = &
1b940 70 44 62 2d 3e 70 55 70 64 61 74 65 48 6f 6f 6b  pDb->pUpdateHook
1b950 3b 0a 20 20 20 20 69 66 28 20 63 68 6f 69 63 65  ;.    if( choice
1b960 3d 3d 44 42 5f 52 4f 4c 4c 42 41 43 4b 5f 48 4f  ==DB_ROLLBACK_HO
1b970 4f 4b 20 29 20 70 70 48 6f 6f 6b 20 3d 20 26 70  OK ) ppHook = &p
1b980 44 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f  Db->pRollbackHoo
1b990 6b 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3e  k;.    if( objc>
1b9a0 33 20 29 7b 0a 20 20 20 20 20 20 20 54 63 6c 5f  3 ){.       Tcl_
1b9b0 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
1b9c0 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f  erp, 2, objv, "?
1b9d0 53 43 52 49 50 54 3f 22 29 3b 0a 20 20 20 20 20  SCRIPT?");.     
1b9e0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
1b9f0 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 44  OR;.    }..    D
1ba00 62 48 6f 6f 6b 43 6d 64 28 69 6e 74 65 72 70 2c  bHookCmd(interp,
1ba10 20 70 44 62 2c 20 28 6f 62 6a 63 3d 3d 33 20 3f   pDb, (objc==3 ?
1ba20 20 6f 62 6a 76 5b 32 5d 20 3a 20 30 29 2c 20 70   objv[2] : 0), p
1ba30 70 48 6f 6f 6b 29 3b 0a 20 20 20 20 62 72 65 61  pHook);.    brea
1ba40 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20  k;.  }..  /*    
1ba50 24 64 62 20 76 65 72 73 69 6f 6e 0a 20 20 2a 2a  $db version.  **
1ba60 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  .  ** Return the
1ba70 20 76 65 72 73 69 6f 6e 20 73 74 72 69 6e 67 20   version string 
1ba80 66 6f 72 20 74 68 69 73 20 64 61 74 61 62 61 73  for this databas
1ba90 65 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  e..  */.  case D
1baa0 42 5f 56 45 52 53 49 4f 4e 3a 20 7b 0a 20 20 20  B_VERSION: {.   
1bab0 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
1bac0 69 3d 32 3b 20 69 3c 6f 62 6a 63 3b 20 69 2b 2b  i=2; i<objc; i++
1bad0 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  ){.      const c
1bae0 68 61 72 20 2a 7a 41 72 67 20 3d 20 54 63 6c 5f  har *zArg = Tcl_
1baf0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 69  GetString(objv[i
1bb00 5d 29 3b 0a 20 20 20 20 20 20 2f 2a 20 4f 70 74  ]);.      /* Opt
1bb10 69 6f 6e 61 6c 20 61 72 67 75 6d 65 6e 74 73 20  ional arguments 
1bb20 74 6f 20 24 64 62 20 76 65 72 73 69 6f 6e 20 61  to $db version a
1bb30 72 65 20 75 73 65 64 20 66 6f 72 20 74 65 73 74  re used for test
1bb40 69 6e 67 20 70 75 72 70 6f 73 65 20 2a 2f 0a 23  ing purpose */.#
1bb50 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
1bb60 54 0a 20 20 20 20 20 20 2f 2a 20 24 64 62 20 76  T.      /* $db v
1bb70 65 72 73 69 6f 6e 20 2d 75 73 65 2d 6c 65 67 61  ersion -use-lega
1bb80 63 79 2d 70 72 65 70 61 72 65 20 42 4f 4f 4c 45  cy-prepare BOOLE
1bb90 41 4e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  AN.      **.    
1bba0 20 20 2a 2a 20 54 75 72 6e 20 74 68 65 20 75 73    ** Turn the us
1bbb0 65 20 6f 66 20 6c 65 67 61 63 79 20 73 71 6c 69  e of legacy sqli
1bbc0 74 65 33 5f 70 72 65 70 61 72 65 28 29 20 6f 6e  te3_prepare() on
1bbd0 20 6f 72 20 6f 66 66 2e 0a 20 20 20 20 20 20 2a   or off..      *
1bbe0 2f 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 63  /.      if( strc
1bbf0 6d 70 28 7a 41 72 67 2c 20 22 2d 75 73 65 2d 6c  mp(zArg, "-use-l
1bc00 65 67 61 63 79 2d 70 72 65 70 61 72 65 22 29 3d  egacy-prepare")=
1bc10 3d 30 20 26 26 20 69 2b 31 3c 6f 62 6a 63 20 29  =0 && i+1<objc )
1bc20 7b 0a 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20  {.        i++;. 
1bc30 20 20 20 20 20 20 20 69 66 28 20 54 63 6c 5f 47         if( Tcl_G
1bc40 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a  etBooleanFromObj
1bc50 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 69 5d  (interp, objv[i]
1bc60 2c 20 26 70 44 62 2d 3e 62 4c 65 67 61 63 79 50  , &pDb->bLegacyP
1bc70 72 65 70 61 72 65 29 20 29 7b 0a 20 20 20 20 20  repare) ){.     
1bc80 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
1bc90 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d  ERROR;.        }
1bca0 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 0a 20 20  .      }else..  
1bcb0 20 20 20 20 2f 2a 20 24 64 62 20 76 65 72 73 69      /* $db versi
1bcc0 6f 6e 20 2d 6c 61 73 74 2d 73 74 6d 74 2d 70 74  on -last-stmt-pt
1bcd0 72 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  r.      **.     
1bce0 20 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 74 72   ** Return a str
1bcf0 69 6e 67 20 77 68 69 63 68 20 69 73 20 61 20 68  ing which is a h
1bd00 65 78 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20 74  ex encoding of t
1bd10 68 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68  he pointer to th
1bd20 65 0a 20 20 20 20 20 20 2a 2a 20 6d 6f 73 74 20  e.      ** most 
1bd30 72 65 63 65 6e 74 20 73 71 6c 69 74 65 33 5f 73  recent sqlite3_s
1bd40 74 6d 74 20 69 6e 20 74 68 65 20 73 74 61 74 65  tmt in the state
1bd50 6d 65 6e 74 20 63 61 63 68 65 2e 0a 20 20 20 20  ment cache..    
1bd60 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 73    */.      if( s
1bd70 74 72 63 6d 70 28 7a 41 72 67 2c 20 22 2d 6c 61  trcmp(zArg, "-la
1bd80 73 74 2d 73 74 6d 74 2d 70 74 72 22 29 3d 3d 30  st-stmt-ptr")==0
1bd90 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72   ){.        char
1bda0 20 7a 42 75 66 5b 31 30 30 5d 3b 0a 20 20 20 20   zBuf[100];.    
1bdb0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
1bdc0 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42 75 66  intf(sizeof(zBuf
1bdd0 29 2c 20 7a 42 75 66 2c 20 22 25 70 22 2c 0a 20  ), zBuf, "%p",. 
1bde0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bdf0 20 20 20 20 20 20 20 20 70 44 62 2d 3e 73 74 6d          pDb->stm
1be00 74 4c 69 73 74 20 3f 20 70 44 62 2d 3e 73 74 6d  tList ? pDb->stm
1be10 74 4c 69 73 74 2d 3e 70 53 74 6d 74 3a 20 30 29  tList->pStmt: 0)
1be20 3b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 53 65  ;.        Tcl_Se
1be30 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  tResult(interp, 
1be40 7a 42 75 66 2c 20 54 43 4c 5f 56 4f 4c 41 54 49  zBuf, TCL_VOLATI
1be50 4c 45 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  LE);.      }else
1be60 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
1be70 45 5f 54 45 53 54 20 2a 2f 0a 20 20 20 20 20 20  E_TEST */.      
1be80 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70  {.        Tcl_Ap
1be90 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
1bea0 70 2c 20 22 75 6e 6b 6e 6f 77 6e 20 61 72 67 75  p, "unknown argu
1beb0 6d 65 6e 74 3a 20 22 2c 20 7a 41 72 67 2c 20 28  ment: ", zArg, (
1bec0 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20  char*)0);.      
1bed0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
1bee0 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OR;.      }.    
1bef0 7d 0a 20 20 20 20 69 66 28 20 69 3d 3d 32 20 29  }.    if( i==2 )
1bf00 7b 20 20 20 0a 20 20 20 20 20 20 54 63 6c 5f 53  {   .      Tcl_S
1bf10 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
1bf20 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33   (char *)sqlite3
1bf30 5f 6c 69 62 76 65 72 73 69 6f 6e 28 29 2c 20 54  _libversion(), T
1bf40 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  CL_STATIC);.    
1bf50 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  }.    break;.  }
1bf60 0a 0a 0a 20 20 7d 20 2f 2a 20 45 6e 64 20 6f 66  ...  } /* End of
1bf70 20 74 68 65 20 53 57 49 54 43 48 20 73 74 61 74   the SWITCH stat
1bf80 65 6d 65 6e 74 20 2a 2f 0a 20 20 72 65 74 75 72  ement */.  retur
1bf90 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c  n rc;.}..#if SQL
1bfa0 49 54 45 5f 54 43 4c 5f 4e 52 45 0a 2f 2a 0a 2a  ITE_TCL_NRE./*.*
1bfb0 2a 20 41 64 61 70 74 6f 72 20 74 68 61 74 20 70  * Adaptor that p
1bfc0 72 6f 76 69 64 65 73 20 61 6e 20 6f 62 6a 43 6d  rovides an objCm
1bfd0 64 20 69 6e 74 65 72 66 61 63 65 20 74 6f 20 74  d interface to t
1bfe0 68 65 20 4e 52 45 2d 65 6e 61 62 6c 65 64 0a 2a  he NRE-enabled.*
1bff0 2a 20 69 6e 74 65 72 66 61 63 65 20 69 6d 70 6c  * interface impl
1c000 65 6d 65 6e 74 61 74 69 6f 6e 2e 0a 2a 2f 0a 73  ementation..*/.s
1c010 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
1c020 5f 54 43 4c 41 50 49 20 44 62 4f 62 6a 43 6d 64  _TCLAPI DbObjCmd
1c030 41 64 61 70 74 6f 72 28 0a 20 20 76 6f 69 64 20  Adaptor(.  void 
1c040 2a 63 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  *cd,.  Tcl_Inter
1c050 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
1c060 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
1c070 20 2a 63 6f 6e 73 74 2a 6f 62 6a 76 0a 29 7b 0a   *const*objv.){.
1c080 20 20 72 65 74 75 72 6e 20 54 63 6c 5f 4e 52 43    return Tcl_NRC
1c090 61 6c 6c 4f 62 6a 50 72 6f 63 28 69 6e 74 65 72  allObjProc(inter
1c0a0 70 2c 20 44 62 4f 62 6a 43 6d 64 2c 20 63 64 2c  p, DbObjCmd, cd,
1c0b0 20 6f 62 6a 63 2c 20 6f 62 6a 76 29 3b 0a 7d 0a   objc, objv);.}.
1c0c0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
1c0d0 5f 54 43 4c 5f 4e 52 45 20 2a 2f 0a 0a 2f 2a 0a  _TCL_NRE */../*.
1c0e0 2a 2a 20 49 73 73 75 65 20 74 68 65 20 75 73 61  ** Issue the usa
1c0f0 67 65 20 6d 65 73 73 61 67 65 20 77 68 65 6e 20  ge message when 
1c100 74 68 65 20 22 73 71 6c 69 74 65 33 22 20 63 6f  the "sqlite3" co
1c110 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20  mmand arguments 
1c120 61 72 65 0a 2a 2a 20 69 6e 63 6f 72 72 65 63 74  are.** incorrect
1c130 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1c140 73 71 6c 69 74 65 43 6d 64 55 73 61 67 65 28 0a  sqliteCmdUsage(.
1c150 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
1c160 74 65 72 70 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  terp,.  Tcl_Obj 
1c170 2a 63 6f 6e 73 74 2a 6f 62 6a 76 0a 29 7b 0a 20  *const*objv.){. 
1c180 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
1c190 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
1c1a0 76 2c 0a 20 20 20 20 22 48 41 4e 44 4c 45 20 3f  v,.    "HANDLE ?
1c1b0 46 49 4c 45 4e 41 4d 45 3f 20 3f 2d 76 66 73 20  FILENAME? ?-vfs 
1c1c0 56 46 53 4e 41 4d 45 3f 20 3f 2d 72 65 61 64 6f  VFSNAME? ?-reado
1c1d0 6e 6c 79 20 42 4f 4f 4c 45 41 4e 3f 20 3f 2d 63  nly BOOLEAN? ?-c
1c1e0 72 65 61 74 65 20 42 4f 4f 4c 45 41 4e 3f 22 0a  reate BOOLEAN?".
1c1f0 20 20 20 20 22 20 3f 2d 6e 6f 6d 75 74 65 78 20      " ?-nomutex 
1c200 42 4f 4f 4c 45 41 4e 3f 20 3f 2d 66 75 6c 6c 6d  BOOLEAN? ?-fullm
1c210 75 74 65 78 20 42 4f 4f 4c 45 41 4e 3f 20 3f 2d  utex BOOLEAN? ?-
1c220 75 72 69 20 42 4f 4f 4c 45 41 4e 3f 22 0a 23 69  uri BOOLEAN?".#i
1c230 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
1c240 5f 48 41 53 5f 43 4f 44 45 43 29 20 26 26 20 21  _HAS_CODEC) && !
1c250 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
1c260 4d 49 54 5f 43 4f 44 45 43 5f 46 52 4f 4d 5f 54  MIT_CODEC_FROM_T
1c270 43 4c 29 0a 20 20 20 20 22 20 3f 2d 6b 65 79 20  CL).    " ?-key 
1c280 43 4f 44 45 43 4b 45 59 3f 22 0a 23 65 6e 64 69  CODECKEY?".#endi
1c290 66 0a 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  f.  );.  return 
1c2a0 54 43 4c 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a  TCL_ERROR;.}../*
1c2b0 0a 2a 2a 20 20 20 73 71 6c 69 74 65 33 20 44 42  .**   sqlite3 DB
1c2c0 4e 41 4d 45 20 46 49 4c 45 4e 41 4d 45 20 3f 2d  NAME FILENAME ?-
1c2d0 76 66 73 20 56 46 53 4e 41 4d 45 3f 20 3f 2d 6b  vfs VFSNAME? ?-k
1c2e0 65 79 20 4b 45 59 3f 20 3f 2d 72 65 61 64 6f 6e  ey KEY? ?-readon
1c2f0 6c 79 20 42 4f 4f 4c 45 41 4e 3f 0a 2a 2a 20 20  ly BOOLEAN?.**  
1c300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c310 20 20 20 20 20 20 20 20 20 3f 2d 63 72 65 61 74           ?-creat
1c320 65 20 42 4f 4f 4c 45 41 4e 3f 20 3f 2d 6e 6f 6d  e BOOLEAN? ?-nom
1c330 75 74 65 78 20 42 4f 4f 4c 45 41 4e 3f 0a 2a 2a  utex BOOLEAN?.**
1c340 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20  .** This is the 
1c350 6d 61 69 6e 20 54 63 6c 20 63 6f 6d 6d 61 6e 64  main Tcl command
1c360 2e 20 20 57 68 65 6e 20 74 68 65 20 22 73 71 6c  .  When the "sql
1c370 69 74 65 22 20 54 63 6c 20 63 6f 6d 6d 61 6e 64  ite" Tcl command
1c380 20 69 73 0a 2a 2a 20 69 6e 76 6f 6b 65 64 2c 20   is.** invoked, 
1c390 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e  this routine run
1c3a0 73 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 61  s to process tha
1c3b0 74 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a  t command..**.**
1c3c0 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   The first argum
1c3d0 65 6e 74 2c 20 44 42 4e 41 4d 45 2c 20 69 73 20  ent, DBNAME, is 
1c3e0 61 6e 20 61 72 62 69 74 72 61 72 79 20 6e 61 6d  an arbitrary nam
1c3f0 65 20 66 6f 72 20 61 20 6e 65 77 0a 2a 2a 20 64  e for a new.** d
1c400 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
1c410 6f 6e 2e 20 20 54 68 69 73 20 63 6f 6d 6d 61 6e  on.  This comman
1c420 64 20 63 72 65 61 74 65 73 20 61 20 6e 65 77 20  d creates a new 
1c430 63 6f 6d 6d 61 6e 64 20 6e 61 6d 65 64 0a 2a 2a  command named.**
1c440 20 44 42 4e 41 4d 45 20 74 68 61 74 20 69 73 20   DBNAME that is 
1c450 75 73 65 64 20 74 6f 20 63 6f 6e 74 72 6f 6c 20  used to control 
1c460 74 68 61 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  that connection.
1c470 20 20 54 68 65 20 64 61 74 61 62 61 73 65 0a 2a    The database.*
1c480 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20  * connection is 
1c490 64 65 6c 65 74 65 64 20 77 68 65 6e 20 74 68 65  deleted when the
1c4a0 20 44 42 4e 41 4d 45 20 63 6f 6d 6d 61 6e 64 20   DBNAME command 
1c4b0 69 73 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a  is deleted..**.*
1c4c0 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67  * The second arg
1c4d0 75 6d 65 6e 74 20 69 73 20 74 68 65 20 6e 61 6d  ument is the nam
1c4e0 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
1c4f0 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2f 0a 73 74  e file..**.*/.st
1c500 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
1c510 54 43 4c 41 50 49 20 44 62 4d 61 69 6e 28 0a 20  TCLAPI DbMain(. 
1c520 20 76 6f 69 64 20 2a 63 64 2c 0a 20 20 54 63 6c   void *cd,.  Tcl
1c530 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
1c540 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
1c550 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 2a 6f 62  cl_Obj *const*ob
1c560 6a 76 0a 29 7b 0a 20 20 53 71 6c 69 74 65 44 62  jv.){.  SqliteDb
1c570 20 2a 70 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61   *p;.  const cha
1c580 72 20 2a 7a 41 72 67 3b 0a 20 20 63 68 61 72 20  r *zArg;.  char 
1c590 2a 7a 45 72 72 4d 73 67 3b 0a 20 20 69 6e 74 20  *zErrMsg;.  int 
1c5a0 69 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  i;.  const char 
1c5b0 2a 7a 46 69 6c 65 20 3d 20 30 3b 0a 20 20 63 6f  *zFile = 0;.  co
1c5c0 6e 73 74 20 63 68 61 72 20 2a 7a 56 66 73 20 3d  nst char *zVfs =
1c5d0 20 30 3b 0a 20 20 69 6e 74 20 66 6c 61 67 73 3b   0;.  int flags;
1c5e0 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 74  .  Tcl_DString t
1c5f0 72 61 6e 73 6c 61 74 65 64 46 69 6c 65 6e 61 6d  ranslatedFilenam
1c600 65 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  e;.#if defined(S
1c610 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 29  QLITE_HAS_CODEC)
1c620 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
1c630 49 54 45 5f 4f 4d 49 54 5f 43 4f 44 45 43 5f 46  ITE_OMIT_CODEC_F
1c640 52 4f 4d 5f 54 43 4c 29 0a 20 20 76 6f 69 64 20  ROM_TCL).  void 
1c650 2a 70 4b 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74  *pKey = 0;.  int
1c660 20 6e 4b 65 79 20 3d 20 30 3b 0a 23 65 6e 64 69   nKey = 0;.#endi
1c670 66 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f  f.  int rc;..  /
1c680 2a 20 49 6e 20 6e 6f 72 6d 61 6c 20 75 73 65 2c  * In normal use,
1c690 20 65 61 63 68 20 54 43 4c 20 69 6e 74 65 72 70   each TCL interp
1c6a0 72 65 74 65 72 20 72 75 6e 73 20 69 6e 20 61 20  reter runs in a 
1c6b0 73 69 6e 67 6c 65 20 74 68 72 65 61 64 2e 20 20  single thread.  
1c6c0 53 6f 0a 20 20 2a 2a 20 62 79 20 64 65 66 61 75  So.  ** by defau
1c6d0 6c 74 2c 20 77 65 20 63 61 6e 20 74 75 72 6e 20  lt, we can turn 
1c6e0 6f 66 66 20 6d 75 74 65 78 69 6e 67 20 6f 6e 20  off mutexing on 
1c6f0 53 51 4c 69 74 65 20 64 61 74 61 62 61 73 65 20  SQLite database 
1c700 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 0a 20 20 2a  connections..  *
1c710 2a 20 48 6f 77 65 76 65 72 2c 20 66 6f 72 20 74  * However, for t
1c720 65 73 74 69 6e 67 20 70 75 72 70 6f 73 65 73 20  esting purposes 
1c730 69 74 20 69 73 20 75 73 65 66 75 6c 20 74 6f 20  it is useful to 
1c740 68 61 76 65 20 6d 75 74 65 78 65 73 20 74 75 72  have mutexes tur
1c750 6e 65 64 0a 20 20 2a 2a 20 6f 6e 2e 20 20 53 6f  ned.  ** on.  So
1c760 2c 20 62 79 20 64 65 66 61 75 6c 74 2c 20 6d 75  , by default, mu
1c770 74 65 78 65 73 20 64 65 66 61 75 6c 74 20 6f 66  texes default of
1c780 66 2e 20 20 42 75 74 20 69 66 20 63 6f 6d 70 69  f.  But if compi
1c790 6c 65 64 20 77 69 74 68 0a 20 20 2a 2a 20 53 51  led with.  ** SQ
1c7a0 4c 49 54 45 5f 54 43 4c 5f 44 45 46 41 55 4c 54  LITE_TCL_DEFAULT
1c7b0 5f 46 55 4c 4c 4d 55 54 45 58 20 74 68 65 6e 20  _FULLMUTEX then 
1c7c0 6d 75 74 65 78 65 73 20 64 65 66 61 75 6c 74 20  mutexes default 
1c7d0 6f 6e 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20  on..  */.#ifdef 
1c7e0 53 51 4c 49 54 45 5f 54 43 4c 5f 44 45 46 41 55  SQLITE_TCL_DEFAU
1c7f0 4c 54 5f 46 55 4c 4c 4d 55 54 45 58 0a 20 20 66  LT_FULLMUTEX.  f
1c800 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50  lags = SQLITE_OP
1c810 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53  EN_READWRITE | S
1c820 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
1c830 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  E | SQLITE_OPEN_
1c840 46 55 4c 4c 4d 55 54 45 58 3b 0a 23 65 6c 73 65  FULLMUTEX;.#else
1c850 0a 20 20 66 6c 61 67 73 20 3d 20 53 51 4c 49 54  .  flags = SQLIT
1c860 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
1c870 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43   | SQLITE_OPEN_C
1c880 52 45 41 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f  REATE | SQLITE_O
1c890 50 45 4e 5f 4e 4f 4d 55 54 45 58 3b 0a 23 65 6e  PEN_NOMUTEX;.#en
1c8a0 64 69 66 0a 0a 20 20 69 66 28 20 6f 62 6a 63 3d  dif..  if( objc=
1c8b0 3d 31 20 29 20 72 65 74 75 72 6e 20 73 71 6c 69  =1 ) return sqli
1c8c0 74 65 43 6d 64 55 73 61 67 65 28 69 6e 74 65 72  teCmdUsage(inter
1c8d0 70 2c 20 6f 62 6a 76 29 3b 0a 20 20 69 66 28 20  p, objv);.  if( 
1c8e0 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20 7a  objc==2 ){.    z
1c8f0 41 72 67 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  Arg = Tcl_GetStr
1c900 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
1c910 31 5d 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  1], 0);.    if( 
1c920 73 74 72 63 6d 70 28 7a 41 72 67 2c 22 2d 76 65  strcmp(zArg,"-ve
1c930 72 73 69 6f 6e 22 29 3d 3d 30 20 29 7b 0a 20 20  rsion")==0 ){.  
1c940 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
1c950 73 75 6c 74 28 69 6e 74 65 72 70 2c 73 71 6c 69  sult(interp,sqli
1c960 74 65 33 5f 6c 69 62 76 65 72 73 69 6f 6e 28 29  te3_libversion()
1c970 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20  , (char*)0);.   
1c980 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b     return TCL_OK
1c990 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1c9a0 73 74 72 63 6d 70 28 7a 41 72 67 2c 22 2d 73 6f  strcmp(zArg,"-so
1c9b0 75 72 63 65 69 64 22 29 3d 3d 30 20 29 7b 0a 20  urceid")==0 ){. 
1c9c0 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
1c9d0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 73 71 6c  esult(interp,sql
1c9e0 69 74 65 33 5f 73 6f 75 72 63 65 69 64 28 29 2c  ite3_sourceid(),
1c9f0 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20   (char*)0);.    
1ca00 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
1ca10 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
1ca20 74 72 63 6d 70 28 7a 41 72 67 2c 22 2d 68 61 73  trcmp(zArg,"-has
1ca30 2d 63 6f 64 65 63 22 29 3d 3d 30 20 29 7b 0a 23  -codec")==0 ){.#
1ca40 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
1ca50 45 5f 48 41 53 5f 43 4f 44 45 43 29 20 26 26 20  E_HAS_CODEC) && 
1ca60 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
1ca70 4f 4d 49 54 5f 43 4f 44 45 43 5f 46 52 4f 4d 5f  OMIT_CODEC_FROM_
1ca80 54 43 4c 29 0a 20 20 20 20 20 20 54 63 6c 5f 41  TCL).      Tcl_A
1ca90 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
1caa0 72 70 2c 22 31 22 2c 28 63 68 61 72 2a 29 30 29  rp,"1",(char*)0)
1cab0 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 54 63  ;.#else.      Tc
1cac0 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
1cad0 6e 74 65 72 70 2c 22 30 22 2c 28 63 68 61 72 2a  nterp,"0",(char*
1cae0 29 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  )0);.#endif.    
1caf0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
1cb00 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a  .    }.    if( z
1cb10 41 72 67 5b 30 5d 3d 3d 27 2d 27 20 29 20 72 65  Arg[0]=='-' ) re
1cb20 74 75 72 6e 20 73 71 6c 69 74 65 43 6d 64 55 73  turn sqliteCmdUs
1cb30 61 67 65 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  age(interp, objv
1cb40 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 32  );.  }.  for(i=2
1cb50 3b 20 69 3c 6f 62 6a 63 3b 20 69 2b 2b 29 7b 0a  ; i<objc; i++){.
1cb60 20 20 20 20 7a 41 72 67 20 3d 20 54 63 6c 5f 47      zArg = Tcl_G
1cb70 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 69 5d  etString(objv[i]
1cb80 29 3b 0a 20 20 20 20 69 66 28 20 7a 41 72 67 5b  );.    if( zArg[
1cb90 30 5d 21 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20  0]!='-' ){.     
1cba0 20 69 66 28 20 7a 46 69 6c 65 21 3d 30 20 29 20   if( zFile!=0 ) 
1cbb0 72 65 74 75 72 6e 20 73 71 6c 69 74 65 43 6d 64  return sqliteCmd
1cbc0 55 73 61 67 65 28 69 6e 74 65 72 70 2c 20 6f 62  Usage(interp, ob
1cbd0 6a 76 29 3b 0a 20 20 20 20 20 20 7a 46 69 6c 65  jv);.      zFile
1cbe0 20 3d 20 7a 41 72 67 3b 0a 20 20 20 20 20 20 63   = zArg;.      c
1cbf0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20  ontinue;.    }. 
1cc00 20 20 20 69 66 28 20 69 3d 3d 6f 62 6a 63 2d 31     if( i==objc-1
1cc10 20 29 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65   ) return sqlite
1cc20 43 6d 64 55 73 61 67 65 28 69 6e 74 65 72 70 2c  CmdUsage(interp,
1cc30 20 6f 62 6a 76 29 3b 0a 20 20 20 20 69 2b 2b 3b   objv);.    i++;
1cc40 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28  .    if( strcmp(
1cc50 7a 41 72 67 2c 22 2d 6b 65 79 22 29 3d 3d 30 20  zArg,"-key")==0 
1cc60 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  ){.#if defined(S
1cc70 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 29  QLITE_HAS_CODEC)
1cc80 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
1cc90 49 54 45 5f 4f 4d 49 54 5f 43 4f 44 45 43 5f 46  ITE_OMIT_CODEC_F
1cca0 52 4f 4d 5f 54 43 4c 29 0a 20 20 20 20 20 20 70  ROM_TCL).      p
1ccb0 4b 65 79 20 3d 20 54 63 6c 5f 47 65 74 42 79 74  Key = Tcl_GetByt
1ccc0 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6f 62  eArrayFromObj(ob
1ccd0 6a 76 5b 69 5d 2c 20 26 6e 4b 65 79 29 3b 0a 23  jv[i], &nKey);.#
1cce0 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 20  endif.    }else 
1ccf0 69 66 28 20 73 74 72 63 6d 70 28 7a 41 72 67 2c  if( strcmp(zArg,
1cd00 20 22 2d 76 66 73 22 29 3d 3d 30 20 29 7b 0a 20   "-vfs")==0 ){. 
1cd10 20 20 20 20 20 7a 56 66 73 20 3d 20 54 63 6c 5f       zVfs = Tcl_
1cd20 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 69  GetString(objv[i
1cd30 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  ]);.    }else if
1cd40 28 20 73 74 72 63 6d 70 28 7a 41 72 67 2c 20 22  ( strcmp(zArg, "
1cd50 2d 72 65 61 64 6f 6e 6c 79 22 29 3d 3d 30 20 29  -readonly")==0 )
1cd60 7b 0a 20 20 20 20 20 20 69 6e 74 20 62 3b 0a 20  {.      int b;. 
1cd70 20 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74       if( Tcl_Get
1cd80 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69  BooleanFromObj(i
1cd90 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 69 5d 2c 20  nterp, objv[i], 
1cda0 26 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  &b) ) return TCL
1cdb0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 69 66  _ERROR;.      if
1cdc0 28 20 62 20 29 7b 0a 20 20 20 20 20 20 20 20 66  ( b ){.        f
1cdd0 6c 61 67 73 20 26 3d 20 7e 28 53 51 4c 49 54 45  lags &= ~(SQLITE
1cde0 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c  _OPEN_READWRITE|
1cdf0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
1ce00 54 45 29 3b 0a 20 20 20 20 20 20 20 20 66 6c 61  TE);.        fla
1ce10 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45  gs |= SQLITE_OPE
1ce20 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20  N_READONLY;.    
1ce30 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1ce40 20 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54   flags &= ~SQLIT
1ce50 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b  E_OPEN_READONLY;
1ce60 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c  .        flags |
1ce70 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  = SQLITE_OPEN_RE
1ce80 41 44 57 52 49 54 45 3b 0a 20 20 20 20 20 20 7d  ADWRITE;.      }
1ce90 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73  .    }else if( s
1cea0 74 72 63 6d 70 28 7a 41 72 67 2c 20 22 2d 63 72  trcmp(zArg, "-cr
1ceb0 65 61 74 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20  eate")==0 ){.   
1cec0 20 20 20 69 6e 74 20 62 3b 0a 20 20 20 20 20 20     int b;.      
1ced0 69 66 28 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65  if( Tcl_GetBoole
1cee0 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  anFromObj(interp
1cef0 2c 20 6f 62 6a 76 5b 69 5d 2c 20 26 62 29 20 29  , objv[i], &b) )
1cf00 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1cf10 52 3b 0a 20 20 20 20 20 20 69 66 28 20 62 20 26  R;.      if( b &
1cf20 26 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  & (flags & SQLIT
1cf30 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29  E_OPEN_READONLY)
1cf40 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66  ==0 ){.        f
1cf50 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f  lags |= SQLITE_O
1cf60 50 45 4e 5f 43 52 45 41 54 45 3b 0a 20 20 20 20  PEN_CREATE;.    
1cf70 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1cf80 20 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54   flags &= ~SQLIT
1cf90 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 3b 0a 20  E_OPEN_CREATE;. 
1cfa0 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
1cfb0 20 69 66 28 20 73 74 72 63 6d 70 28 7a 41 72 67   if( strcmp(zArg
1cfc0 2c 20 22 2d 6e 6f 6d 75 74 65 78 22 29 3d 3d 30  , "-nomutex")==0
1cfd0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 62 3b   ){.      int b;
1cfe0 0a 20 20 20 20 20 20 69 66 28 20 54 63 6c 5f 47  .      if( Tcl_G
1cff0 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a  etBooleanFromObj
1d000 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 69 5d  (interp, objv[i]
1d010 2c 20 26 62 29 20 29 20 72 65 74 75 72 6e 20 54  , &b) ) return T
1d020 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  CL_ERROR;.      
1d030 69 66 28 20 62 20 29 7b 0a 20 20 20 20 20 20 20  if( b ){.       
1d040 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45   flags |= SQLITE
1d050 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58 3b 0a 20  _OPEN_NOMUTEX;. 
1d060 20 20 20 20 20 20 20 66 6c 61 67 73 20 26 3d 20         flags &= 
1d070 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55 4c  ~SQLITE_OPEN_FUL
1d080 4c 4d 55 54 45 58 3b 0a 20 20 20 20 20 20 7d 65  LMUTEX;.      }e
1d090 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66 6c 61  lse{.        fla
1d0a0 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 4f 50  gs &= ~SQLITE_OP
1d0b0 45 4e 5f 4e 4f 4d 55 54 45 58 3b 0a 20 20 20 20  EN_NOMUTEX;.    
1d0c0 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66    }.    }else if
1d0d0 28 20 73 74 72 63 6d 70 28 7a 41 72 67 2c 20 22  ( strcmp(zArg, "
1d0e0 2d 66 75 6c 6c 6d 75 74 65 78 22 29 3d 3d 30 20  -fullmutex")==0 
1d0f0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 62 3b 0a  ){.      int b;.
1d100 20 20 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65        if( Tcl_Ge
1d110 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28  tBooleanFromObj(
1d120 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 69 5d 2c  interp, objv[i],
1d130 20 26 62 29 20 29 20 72 65 74 75 72 6e 20 54 43   &b) ) return TC
1d140 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 69  L_ERROR;.      i
1d150 66 28 20 62 20 29 7b 0a 20 20 20 20 20 20 20 20  f( b ){.        
1d160 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  flags |= SQLITE_
1d170 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54 45 58 3b 0a  OPEN_FULLMUTEX;.
1d180 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 26 3d          flags &=
1d190 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f   ~SQLITE_OPEN_NO
1d1a0 4d 55 54 45 58 3b 0a 20 20 20 20 20 20 7d 65 6c  MUTEX;.      }el
1d1b0 73 65 7b 0a 20 20 20 20 20 20 20 20 66 6c 61 67  se{.        flag
1d1c0 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 4f 50 45  s &= ~SQLITE_OPE
1d1d0 4e 5f 46 55 4c 4c 4d 55 54 45 58 3b 0a 20 20 20  N_FULLMUTEX;.   
1d1e0 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69     }.    }else i
1d1f0 66 28 20 73 74 72 63 6d 70 28 7a 41 72 67 2c 20  f( strcmp(zArg, 
1d200 22 2d 75 72 69 22 29 3d 3d 30 20 29 7b 0a 20 20  "-uri")==0 ){.  
1d210 20 20 20 20 69 6e 74 20 62 3b 0a 20 20 20 20 20      int b;.     
1d220 20 69 66 28 20 54 63 6c 5f 47 65 74 42 6f 6f 6c   if( Tcl_GetBool
1d230 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  eanFromObj(inter
1d240 70 2c 20 6f 62 6a 76 5b 69 5d 2c 20 26 62 29 20  p, objv[i], &b) 
1d250 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
1d260 4f 52 3b 0a 20 20 20 20 20 20 69 66 28 20 62 20  OR;.      if( b 
1d270 29 7b 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73  ){.        flags
1d280 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   |= SQLITE_OPEN_
1d290 55 52 49 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  URI;.      }else
1d2a0 7b 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73 20  {.        flags 
1d2b0 26 3d 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  &= ~SQLITE_OPEN_
1d2c0 55 52 49 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  URI;.      }.   
1d2d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 54 63   }else{.      Tc
1d2e0 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
1d2f0 6e 74 65 72 70 2c 20 22 75 6e 6b 6e 6f 77 6e 20  nterp, "unknown 
1d300 6f 70 74 69 6f 6e 3a 20 22 2c 20 7a 41 72 67 2c  option: ", zArg,
1d310 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20   (char*)0);.    
1d320 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
1d330 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  OR;.    }.  }.  
1d340 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 70  zErrMsg = 0;.  p
1d350 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 54 63   = (SqliteDb*)Tc
1d360 6c 5f 41 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  l_Alloc( sizeof(
1d370 2a 70 29 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28  *p) );.  memset(
1d380 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 29  p, 0, sizeof(*p)
1d390 29 3b 0a 20 20 69 66 28 20 7a 46 69 6c 65 3d 3d  );.  if( zFile==
1d3a0 30 20 29 20 7a 46 69 6c 65 20 3d 20 22 22 3b 0a  0 ) zFile = "";.
1d3b0 20 20 7a 46 69 6c 65 20 3d 20 54 63 6c 5f 54 72    zFile = Tcl_Tr
1d3c0 61 6e 73 6c 61 74 65 46 69 6c 65 4e 61 6d 65 28  anslateFileName(
1d3d0 69 6e 74 65 72 70 2c 20 7a 46 69 6c 65 2c 20 26  interp, zFile, &
1d3e0 74 72 61 6e 73 6c 61 74 65 64 46 69 6c 65 6e 61  translatedFilena
1d3f0 6d 65 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  me);.  rc = sqli
1d400 74 65 33 5f 6f 70 65 6e 5f 76 32 28 7a 46 69 6c  te3_open_v2(zFil
1d410 65 2c 20 26 70 2d 3e 64 62 2c 20 66 6c 61 67 73  e, &p->db, flags
1d420 2c 20 7a 56 66 73 29 3b 0a 20 20 54 63 6c 5f 44  , zVfs);.  Tcl_D
1d430 53 74 72 69 6e 67 46 72 65 65 28 26 74 72 61 6e  StringFree(&tran
1d440 73 6c 61 74 65 64 46 69 6c 65 6e 61 6d 65 29 3b  slatedFilename);
1d450 0a 20 20 69 66 28 20 70 2d 3e 64 62 20 29 7b 0a  .  if( p->db ){.
1d460 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f      if( SQLITE_O
1d470 4b 21 3d 73 71 6c 69 74 65 33 5f 65 72 72 63 6f  K!=sqlite3_errco
1d480 64 65 28 70 2d 3e 64 62 29 20 29 7b 0a 20 20 20  de(p->db) ){.   
1d490 20 20 20 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c     zErrMsg = sql
1d4a0 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73  ite3_mprintf("%s
1d4b0 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  ", sqlite3_errms
1d4c0 67 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20  g(p->db));.     
1d4d0 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70   sqlite3_close(p
1d4e0 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20 70 2d 3e  ->db);.      p->
1d4f0 64 62 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  db = 0;.    }.  
1d500 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 45 72 72 4d  }else{.    zErrM
1d510 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  sg = sqlite3_mpr
1d520 69 6e 74 66 28 22 25 73 22 2c 20 73 71 6c 69 74  intf("%s", sqlit
1d530 65 33 5f 65 72 72 73 74 72 28 72 63 29 29 3b 0a  e3_errstr(rc));.
1d540 20 20 7d 0a 23 69 66 20 64 65 66 69 6e 65 64 28    }.#if defined(
1d550 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43  SQLITE_HAS_CODEC
1d560 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  ) && !defined(SQ
1d570 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 44 45 43 5f  LITE_OMIT_CODEC_
1d580 46 52 4f 4d 5f 54 43 4c 29 0a 20 20 69 66 28 20  FROM_TCL).  if( 
1d590 70 2d 3e 64 62 20 29 7b 0a 20 20 20 20 73 71 6c  p->db ){.    sql
1d5a0 69 74 65 33 5f 6b 65 79 28 70 2d 3e 64 62 2c 20  ite3_key(p->db, 
1d5b0 70 4b 65 79 2c 20 6e 4b 65 79 29 3b 0a 20 20 7d  pKey, nKey);.  }
1d5c0 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 2d  .#endif.  if( p-
1d5d0 3e 64 62 3d 3d 30 20 29 7b 0a 20 20 20 20 54 63  >db==0 ){.    Tc
1d5e0 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
1d5f0 72 70 2c 20 7a 45 72 72 4d 73 67 2c 20 54 43 4c  rp, zErrMsg, TCL
1d600 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 20 20  _VOLATILE);.    
1d610 54 63 6c 5f 46 72 65 65 28 28 63 68 61 72 2a 29  Tcl_Free((char*)
1d620 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  p);.    sqlite3_
1d630 66 72 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20  free(zErrMsg);. 
1d640 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
1d650 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d 61  ROR;.  }.  p->ma
1d660 78 53 74 6d 74 20 3d 20 4e 55 4d 5f 50 52 45 50  xStmt = NUM_PREP
1d670 41 52 45 44 5f 53 54 4d 54 53 3b 0a 20 20 70 2d  ARED_STMTS;.  p-
1d680 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20 66 6c 61  >openFlags = fla
1d690 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
1d6a0 5f 55 52 49 3b 0a 20 20 70 2d 3e 69 6e 74 65 72  _URI;.  p->inter
1d6b0 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 7a 41  p = interp;.  zA
1d6c0 72 67 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  rg = Tcl_GetStri
1d6d0 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31  ngFromObj(objv[1
1d6e0 5d 2c 20 30 29 3b 0a 20 20 69 66 28 20 44 62 55  ], 0);.  if( DbU
1d6f0 73 65 4e 72 65 28 29 20 29 7b 0a 20 20 20 20 54  seNre() ){.    T
1d700 63 6c 5f 4e 52 43 72 65 61 74 65 43 6f 6d 6d 61  cl_NRCreateComma
1d710 6e 64 28 69 6e 74 65 72 70 2c 20 7a 41 72 67 2c  nd(interp, zArg,
1d720 20 44 62 4f 62 6a 43 6d 64 41 64 61 70 74 6f 72   DbObjCmdAdaptor
1d730 2c 20 44 62 4f 62 6a 43 6d 64 2c 0a 20 20 20 20  , DbObjCmd,.    
1d740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d750 20 20 20 20 28 63 68 61 72 2a 29 70 2c 20 44 62      (char*)p, Db
1d760 44 65 6c 65 74 65 43 6d 64 29 3b 0a 20 20 7d 65  DeleteCmd);.  }e
1d770 6c 73 65 7b 0a 20 20 20 20 54 63 6c 5f 43 72 65  lse{.    Tcl_Cre
1d780 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e  ateObjCommand(in
1d790 74 65 72 70 2c 20 7a 41 72 67 2c 20 44 62 4f 62  terp, zArg, DbOb
1d7a0 6a 43 6d 64 2c 20 28 63 68 61 72 2a 29 70 2c 20  jCmd, (char*)p, 
1d7b0 44 62 44 65 6c 65 74 65 43 6d 64 29 3b 0a 20 20  DbDeleteCmd);.  
1d7c0 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  }.  return TCL_O
1d7d0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 76  K;.}../*.** Prov
1d7e0 69 64 65 20 61 20 64 75 6d 6d 79 20 54 63 6c 5f  ide a dummy Tcl_
1d7f0 49 6e 69 74 53 74 75 62 73 20 69 66 20 77 65 20  InitStubs if we 
1d800 61 72 65 20 75 73 69 6e 67 20 74 68 69 73 20 61  are using this a
1d810 73 20 61 20 73 74 61 74 69 63 0a 2a 2a 20 6c 69  s a static.** li
1d820 62 72 61 72 79 2e 0a 2a 2f 0a 23 69 66 6e 64 65  brary..*/.#ifnde
1d830 66 20 55 53 45 5f 54 43 4c 5f 53 54 55 42 53 0a  f USE_TCL_STUBS.
1d840 23 20 75 6e 64 65 66 20 20 54 63 6c 5f 49 6e 69  # undef  Tcl_Ini
1d850 74 53 74 75 62 73 0a 23 20 64 65 66 69 6e 65 20  tStubs.# define 
1d860 54 63 6c 5f 49 6e 69 74 53 74 75 62 73 28 61 2c  Tcl_InitStubs(a,
1d870 62 2c 63 29 20 54 43 4c 5f 56 45 52 53 49 4f 4e  b,c) TCL_VERSION
1d880 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d  .#endif../*.** M
1d890 61 6b 65 20 73 75 72 65 20 77 65 20 68 61 76 65  ake sure we have
1d8a0 20 61 20 50 41 43 4b 41 47 45 5f 56 45 52 53 49   a PACKAGE_VERSI
1d8b0 4f 4e 20 6d 61 63 72 6f 20 64 65 66 69 6e 65 64  ON macro defined
1d8c0 2e 20 20 54 68 69 73 20 77 69 6c 6c 20 62 65 0a  .  This will be.
1d8d0 2a 2a 20 64 65 66 69 6e 65 64 20 61 75 74 6f 6d  ** defined autom
1d8e0 61 74 69 63 61 6c 6c 79 20 62 79 20 74 68 65 20  atically by the 
1d8f0 54 45 41 20 6d 61 6b 65 66 69 6c 65 2e 20 20 42  TEA makefile.  B
1d900 75 74 20 6f 74 68 65 72 20 6d 61 6b 65 66 69 6c  ut other makefil
1d910 65 73 0a 2a 2a 20 64 6f 20 6e 6f 74 20 64 65 66  es.** do not def
1d920 69 6e 65 20 69 74 2e 0a 2a 2f 0a 23 69 66 6e 64  ine it..*/.#ifnd
1d930 65 66 20 50 41 43 4b 41 47 45 5f 56 45 52 53 49  ef PACKAGE_VERSI
1d940 4f 4e 0a 23 20 64 65 66 69 6e 65 20 50 41 43 4b  ON.# define PACK
1d950 41 47 45 5f 56 45 52 53 49 4f 4e 20 53 51 4c 49  AGE_VERSION SQLI
1d960 54 45 5f 56 45 52 53 49 4f 4e 0a 23 65 6e 64 69  TE_VERSION.#endi
1d970 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  f../*.** Initial
1d980 69 7a 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 2e  ize this module.
1d990 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 54 63 6c 20  .**.** This Tcl 
1d9a0 6d 6f 64 75 6c 65 20 63 6f 6e 74 61 69 6e 73 20  module contains 
1d9b0 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 6e 65  only a single ne
1d9c0 77 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 20 6e 61  w Tcl command na
1d9d0 6d 65 64 20 22 73 71 6c 69 74 65 22 2e 0a 2a 2a  med "sqlite"..**
1d9e0 20 28 48 65 6e 63 65 20 74 68 65 72 65 20 69 73   (Hence there is
1d9f0 20 6e 6f 20 6e 61 6d 65 73 70 61 63 65 2e 20 20   no namespace.  
1da00 54 68 65 72 65 20 69 73 20 6e 6f 20 70 6f 69 6e  There is no poin
1da10 74 20 69 6e 20 75 73 69 6e 67 20 61 20 6e 61 6d  t in using a nam
1da20 65 73 70 61 63 65 0a 2a 2a 20 69 66 20 74 68 65  espace.** if the
1da30 20 65 78 74 65 6e 73 69 6f 6e 20 6f 6e 6c 79 20   extension only 
1da40 73 75 70 70 6c 69 65 73 20 6f 6e 65 20 6e 65 77  supplies one new
1da50 20 6e 61 6d 65 21 29 20 20 54 68 65 20 22 73 71   name!)  The "sq
1da60 6c 69 74 65 22 20 63 6f 6d 6d 61 6e 64 20 69 73  lite" command is
1da70 0a 2a 2a 20 75 73 65 64 20 74 6f 20 6f 70 65 6e  .** used to open
1da80 20 61 20 6e 65 77 20 53 51 4c 69 74 65 20 64 61   a new SQLite da
1da90 74 61 62 61 73 65 2e 20 20 53 65 65 20 74 68 65  tabase.  See the
1daa0 20 44 62 4d 61 69 6e 28 29 20 72 6f 75 74 69 6e   DbMain() routin
1dab0 65 20 61 62 6f 76 65 0a 2a 2a 20 66 6f 72 20 61  e above.** for a
1dac0 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
1dad0 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ation..**.** The
1dae0 20 45 58 54 45 52 4e 20 6d 61 63 72 6f 73 20 61   EXTERN macros a
1daf0 72 65 20 72 65 71 75 69 72 65 64 20 62 79 20 54  re required by T
1db00 43 4c 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 77  CL in order to w
1db10 6f 72 6b 20 6f 6e 20 77 69 6e 64 6f 77 73 2e 0a  ork on windows..
1db20 2a 2f 0a 45 58 54 45 52 4e 20 69 6e 74 20 53 71  */.EXTERN int Sq
1db30 6c 69 74 65 33 5f 49 6e 69 74 28 54 63 6c 5f 49  lite3_Init(Tcl_I
1db40 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 0a  nterp *interp){.
1db50 20 20 69 6e 74 20 72 63 20 3d 20 54 63 6c 5f 49    int rc = Tcl_I
1db60 6e 69 74 53 74 75 62 73 28 69 6e 74 65 72 70 2c  nitStubs(interp,
1db70 20 22 38 2e 34 22 2c 20 30 29 20 3f 20 54 43 4c   "8.4", 0) ? TCL
1db80 5f 4f 4b 20 3a 20 54 43 4c 5f 45 52 52 4f 52 3b  _OK : TCL_ERROR;
1db90 0a 20 20 69 66 28 20 72 63 3d 3d 54 43 4c 5f 4f  .  if( rc==TCL_O
1dba0 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 43 72 65  K ){.    Tcl_Cre
1dbb0 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e  ateObjCommand(in
1dbc0 74 65 72 70 2c 20 22 73 71 6c 69 74 65 33 22 2c  terp, "sqlite3",
1dbd0 20 28 54 63 6c 5f 4f 62 6a 43 6d 64 50 72 6f 63   (Tcl_ObjCmdProc
1dbe0 2a 29 44 62 4d 61 69 6e 2c 20 30 2c 20 30 29 3b  *)DbMain, 0, 0);
1dbf0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1dc00 33 5f 53 55 46 46 49 58 5f 4f 4e 4c 59 0a 20 20  3_SUFFIX_ONLY.  
1dc10 20 20 2f 2a 20 54 68 65 20 22 73 71 6c 69 74 65    /* The "sqlite
1dc20 22 20 61 6c 69 61 73 20 69 73 20 75 6e 64 6f 63  " alias is undoc
1dc30 75 6d 65 6e 74 65 64 2e 20 20 49 74 20 69 73 20  umented.  It is 
1dc40 68 65 72 65 20 6f 6e 6c 79 20 74 6f 20 73 75 70  here only to sup
1dc50 70 6f 72 74 0a 20 20 20 20 2a 2a 20 6c 65 67 61  port.    ** lega
1dc60 63 79 20 73 63 72 69 70 74 73 2e 20 20 41 6c 6c  cy scripts.  All
1dc70 20 6e 65 77 20 73 63 72 69 70 74 73 20 73 68 6f   new scripts sho
1dc80 75 6c 64 20 75 73 65 20 6f 6e 6c 79 20 74 68 65  uld use only the
1dc90 20 22 73 71 6c 69 74 65 33 22 0a 20 20 20 20 2a   "sqlite3".    *
1dca0 2a 20 63 6f 6d 6d 61 6e 64 2e 20 2a 2f 0a 20 20  * command. */.  
1dcb0 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43    Tcl_CreateObjC
1dcc0 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22  ommand(interp, "
1dcd0 73 71 6c 69 74 65 22 2c 20 28 54 63 6c 5f 4f 62  sqlite", (Tcl_Ob
1dce0 6a 43 6d 64 50 72 6f 63 2a 29 44 62 4d 61 69 6e  jCmdProc*)DbMain
1dcf0 2c 20 30 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a  , 0, 0);.#endif.
1dd00 20 20 20 20 72 63 20 3d 20 54 63 6c 5f 50 6b 67      rc = Tcl_Pkg
1dd10 50 72 6f 76 69 64 65 28 69 6e 74 65 72 70 2c 20  Provide(interp, 
1dd20 22 73 71 6c 69 74 65 33 22 2c 20 50 41 43 4b 41  "sqlite3", PACKA
1dd30 47 45 5f 56 45 52 53 49 4f 4e 29 3b 0a 20 20 7d  GE_VERSION);.  }
1dd40 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1dd50 45 58 54 45 52 4e 20 69 6e 74 20 54 63 6c 73 71  EXTERN int Tclsq
1dd60 6c 69 74 65 33 5f 49 6e 69 74 28 54 63 6c 5f 49  lite3_Init(Tcl_I
1dd70 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 20  nterp *interp){ 
1dd80 72 65 74 75 72 6e 20 53 71 6c 69 74 65 33 5f 49  return Sqlite3_I
1dd90 6e 69 74 28 69 6e 74 65 72 70 29 3b 20 7d 0a 45  nit(interp); }.E
1dda0 58 54 45 52 4e 20 69 6e 74 20 53 71 6c 69 74 65  XTERN int Sqlite
1ddb0 33 5f 55 6e 6c 6f 61 64 28 54 63 6c 5f 49 6e 74  3_Unload(Tcl_Int
1ddc0 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74  erp *interp, int
1ddd0 20 66 6c 61 67 73 29 7b 20 72 65 74 75 72 6e 20   flags){ return 
1dde0 54 43 4c 5f 4f 4b 3b 20 7d 0a 45 58 54 45 52 4e  TCL_OK; }.EXTERN
1ddf0 20 69 6e 74 20 54 63 6c 73 71 6c 69 74 65 33 5f   int Tclsqlite3_
1de00 55 6e 6c 6f 61 64 28 54 63 6c 5f 49 6e 74 65 72  Unload(Tcl_Inter
1de10 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 66  p *interp, int f
1de20 6c 61 67 73 29 7b 20 72 65 74 75 72 6e 20 54 43  lags){ return TC
1de30 4c 5f 4f 4b 3b 20 7d 0a 0a 2f 2a 20 42 65 63 61  L_OK; }../* Beca
1de40 75 73 65 20 69 74 20 61 63 63 65 73 73 65 73 20  use it accesses 
1de50 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  the file-system 
1de60 61 6e 64 20 75 73 65 73 20 70 65 72 73 69 73 74  and uses persist
1de70 65 6e 74 20 73 74 61 74 65 2c 20 53 51 4c 69 74  ent state, SQLit
1de80 65 0a 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6e 73  e.** is not cons
1de90 69 64 65 72 65 64 20 61 70 70 72 6f 70 72 69 61  idered appropria
1dea0 74 65 20 66 6f 72 20 73 61 66 65 20 69 6e 74 65  te for safe inte
1deb0 72 70 72 65 74 65 72 73 2e 20 20 48 65 6e 63 65  rpreters.  Hence
1dec0 2c 20 77 65 20 63 61 75 73 65 0a 2a 2a 20 74 68  , we cause.** th
1ded0 65 20 5f 53 61 66 65 49 6e 69 74 28 29 20 69 6e  e _SafeInit() in
1dee0 74 65 72 66 61 63 65 73 20 72 65 74 75 72 6e 20  terfaces return 
1def0 54 43 4c 5f 45 52 52 4f 52 2e 0a 2a 2f 0a 45 58  TCL_ERROR..*/.EX
1df00 54 45 52 4e 20 69 6e 74 20 53 71 6c 69 74 65 33  TERN int Sqlite3
1df10 5f 53 61 66 65 49 6e 69 74 28 54 63 6c 5f 49 6e  _SafeInit(Tcl_In
1df20 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 20 72  terp *interp){ r
1df30 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1df40 20 7d 0a 45 58 54 45 52 4e 20 69 6e 74 20 53 71   }.EXTERN int Sq
1df50 6c 69 74 65 33 5f 53 61 66 65 55 6e 6c 6f 61 64  lite3_SafeUnload
1df60 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74  (Tcl_Interp *int
1df70 65 72 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b  erp, int flags){
1df80 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1df90 3b 7d 0a 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51  ;}....#ifndef SQ
1dfa0 4c 49 54 45 5f 33 5f 53 55 46 46 49 58 5f 4f 4e  LITE_3_SUFFIX_ON
1dfb0 4c 59 0a 69 6e 74 20 53 71 6c 69 74 65 5f 49 6e  LY.int Sqlite_In
1dfc0 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  it(Tcl_Interp *i
1dfd0 6e 74 65 72 70 29 7b 20 72 65 74 75 72 6e 20 53  nterp){ return S
1dfe0 71 6c 69 74 65 33 5f 49 6e 69 74 28 69 6e 74 65  qlite3_Init(inte
1dff0 72 70 29 3b 20 7d 0a 69 6e 74 20 54 63 6c 73 71  rp); }.int Tclsq
1e000 6c 69 74 65 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  lite_Init(Tcl_In
1e010 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 20 72  terp *interp){ r
1e020 65 74 75 72 6e 20 53 71 6c 69 74 65 33 5f 49 6e  eturn Sqlite3_In
1e030 69 74 28 69 6e 74 65 72 70 29 3b 20 7d 0a 69 6e  it(interp); }.in
1e040 74 20 53 71 6c 69 74 65 5f 55 6e 6c 6f 61 64 28  t Sqlite_Unload(
1e050 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
1e060 72 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 20  rp, int flags){ 
1e070 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 7d  return TCL_OK; }
1e080 0a 69 6e 74 20 54 63 6c 73 71 6c 69 74 65 5f 55  .int Tclsqlite_U
1e090 6e 6c 6f 61 64 28 54 63 6c 5f 49 6e 74 65 72 70  nload(Tcl_Interp
1e0a0 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 66 6c   *interp, int fl
1e0b0 61 67 73 29 7b 20 72 65 74 75 72 6e 20 54 43 4c  ags){ return TCL
1e0c0 5f 4f 4b 3b 20 7d 0a 23 65 6e 64 69 66 0a 0a 2f  _OK; }.#endif../
1e0d0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 54 43 4c 53  *.** If the TCLS
1e0e0 48 20 6d 61 63 72 6f 20 69 73 20 64 65 66 69 6e  H macro is defin
1e0f0 65 64 2c 20 61 64 64 20 63 6f 64 65 20 74 6f 20  ed, add code to 
1e100 6d 61 6b 65 20 61 20 73 74 61 6e 64 2d 61 6c 6f  make a stand-alo
1e110 6e 65 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 23  ne program..*/.#
1e120 69 66 20 64 65 66 69 6e 65 64 28 54 43 4c 53 48  if defined(TCLSH
1e130 29 0a 0a 2f 2a 20 54 68 69 73 20 69 73 20 74 68  )../* This is th
1e140 65 20 6d 61 69 6e 20 72 6f 75 74 69 6e 65 20 66  e main routine f
1e150 6f 72 20 61 6e 20 6f 72 64 69 6e 61 72 79 20 54  or an ordinary T
1e160 43 4c 20 73 68 65 6c 6c 2e 20 20 49 66 20 74 68  CL shell.  If th
1e170 65 72 65 20 61 72 65 0a 2a 2a 20 61 72 65 20 61  ere are.** are a
1e180 72 67 75 6d 65 6e 74 73 2c 20 72 75 6e 20 74 68  rguments, run th
1e190 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
1e1a0 20 61 73 20 61 20 73 63 72 69 70 74 2e 20 20 4f   as a script.  O
1e1b0 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20 72 65 61  therwise,.** rea
1e1c0 64 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 73 20 66  d TCL commands f
1e1d0 72 6f 6d 20 73 74 61 6e 64 61 72 64 20 69 6e 70  rom standard inp
1e1e0 75 74 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  ut.*/.static con
1e1f0 73 74 20 63 68 61 72 20 2a 74 63 6c 73 68 5f 6d  st char *tclsh_m
1e200 61 69 6e 5f 6c 6f 6f 70 28 76 6f 69 64 29 7b 0a  ain_loop(void){.
1e210 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63    static const c
1e220 68 61 72 20 7a 4d 61 69 6e 6c 6f 6f 70 5b 5d 20  har zMainloop[] 
1e230 3d 0a 20 20 20 20 22 69 66 20 7b 5b 6c 6c 65 6e  =.    "if {[llen
1e240 67 74 68 20 24 61 72 67 76 5d 3e 3d 31 7d 20 7b  gth $argv]>=1} {
1e250 5c 6e 22 0a 20 20 20 20 20 20 22 73 65 74 20 61  \n".      "set a
1e260 72 67 76 30 20 5b 6c 69 6e 64 65 78 20 24 61 72  rgv0 [lindex $ar
1e270 67 76 20 30 5d 5c 6e 22 0a 20 20 20 20 20 20 22  gv 0]\n".      "
1e280 73 65 74 20 61 72 67 76 20 5b 6c 72 61 6e 67 65  set argv [lrange
1e290 20 24 61 72 67 76 20 31 20 65 6e 64 5d 5c 6e 22   $argv 1 end]\n"
1e2a0 0a 20 20 20 20 20 20 22 73 6f 75 72 63 65 20 24  .      "source $
1e2b0 61 72 67 76 30 5c 6e 22 0a 20 20 20 20 22 7d 20  argv0\n".    "} 
1e2c0 65 6c 73 65 20 7b 5c 6e 22 0a 20 20 20 20 20 20  else {\n".      
1e2d0 22 73 65 74 20 6c 69 6e 65 20 7b 7d 5c 6e 22 0a  "set line {}\n".
1e2e0 20 20 20 20 20 20 22 77 68 69 6c 65 20 7b 21 5b        "while {![
1e2f0 65 6f 66 20 73 74 64 69 6e 5d 7d 20 7b 5c 6e 22  eof stdin]} {\n"
1e300 0a 20 20 20 20 20 20 20 20 22 69 66 20 7b 24 6c  .        "if {$l
1e310 69 6e 65 21 3d 5c 22 5c 22 7d 20 7b 5c 6e 22 0a  ine!=\"\"} {\n".
1e320 20 20 20 20 20 20 20 20 20 20 22 70 75 74 73 20            "puts 
1e330 2d 6e 6f 6e 65 77 6c 69 6e 65 20 5c 22 3e 20 5c  -nonewline \"> \
1e340 22 5c 6e 22 0a 20 20 20 20 20 20 20 20 22 7d 20  "\n".        "} 
1e350 65 6c 73 65 20 7b 5c 6e 22 0a 20 20 20 20 20 20  else {\n".      
1e360 20 20 20 20 22 70 75 74 73 20 2d 6e 6f 6e 65 77      "puts -nonew
1e370 6c 69 6e 65 20 5c 22 25 20 5c 22 5c 6e 22 0a 20  line \"% \"\n". 
1e380 20 20 20 20 20 20 20 22 7d 5c 6e 22 0a 20 20 20         "}\n".   
1e390 20 20 20 20 20 22 66 6c 75 73 68 20 73 74 64 6f       "flush stdo
1e3a0 75 74 5c 6e 22 0a 20 20 20 20 20 20 20 20 22 61  ut\n".        "a
1e3b0 70 70 65 6e 64 20 6c 69 6e 65 20 5b 67 65 74 73  ppend line [gets
1e3c0 20 73 74 64 69 6e 5d 5c 6e 22 0a 20 20 20 20 20   stdin]\n".     
1e3d0 20 20 20 22 69 66 20 7b 5b 69 6e 66 6f 20 63 6f     "if {[info co
1e3e0 6d 70 6c 65 74 65 20 24 6c 69 6e 65 5d 7d 20 7b  mplete $line]} {
1e3f0 5c 6e 22 0a 20 20 20 20 20 20 20 20 20 20 22 69  \n".          "i
1e400 66 20 7b 5b 63 61 74 63 68 20 7b 75 70 6c 65 76  f {[catch {uplev
1e410 65 6c 20 23 30 20 24 6c 69 6e 65 7d 20 72 65 73  el #0 $line} res
1e420 75 6c 74 5d 7d 20 7b 5c 6e 22 0a 20 20 20 20 20  ult]} {\n".     
1e430 20 20 20 20 20 20 20 22 70 75 74 73 20 73 74 64         "puts std
1e440 65 72 72 20 5c 22 45 72 72 6f 72 3a 20 24 72 65  err \"Error: $re
1e450 73 75 6c 74 5c 22 5c 6e 22 0a 20 20 20 20 20 20  sult\"\n".      
1e460 20 20 20 20 22 7d 20 65 6c 73 65 69 66 20 7b 24      "} elseif {$
1e470 72 65 73 75 6c 74 21 3d 5c 22 5c 22 7d 20 7b 5c  result!=\"\"} {\
1e480 6e 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  n".            "
1e490 70 75 74 73 20 24 72 65 73 75 6c 74 5c 6e 22 0a  puts $result\n".
1e4a0 20 20 20 20 20 20 20 20 20 20 22 7d 5c 6e 22 0a            "}\n".
1e4b0 20 20 20 20 20 20 20 20 20 20 22 73 65 74 20 6c            "set l
1e4c0 69 6e 65 20 7b 7d 5c 6e 22 0a 20 20 20 20 20 20  ine {}\n".      
1e4d0 20 20 22 7d 20 65 6c 73 65 20 7b 5c 6e 22 0a 20    "} else {\n". 
1e4e0 20 20 20 20 20 20 20 20 20 22 61 70 70 65 6e 64           "append
1e4f0 20 6c 69 6e 65 20 5c 5c 6e 5c 6e 22 0a 20 20 20   line \\n\n".   
1e500 20 20 20 20 20 22 7d 5c 6e 22 0a 20 20 20 20 20       "}\n".     
1e510 20 22 7d 5c 6e 22 0a 20 20 20 20 22 7d 5c 6e 22   "}\n".    "}\n"
1e520 0a 20 20 3b 0a 20 20 72 65 74 75 72 6e 20 7a 4d  .  ;.  return zM
1e530 61 69 6e 6c 6f 6f 70 3b 0a 7d 0a 0a 23 64 65 66  ainloop;.}..#def
1e540 69 6e 65 20 54 43 4c 53 48 5f 4d 41 49 4e 20 6d  ine TCLSH_MAIN m
1e550 61 69 6e 20 20 20 2f 2a 20 4e 65 65 64 65 64 20  ain   /* Needed 
1e560 74 6f 20 66 61 6b 65 20 6f 75 74 20 6d 6b 74 63  to fake out mktc
1e570 6c 61 70 70 20 2a 2f 0a 69 6e 74 20 53 51 4c 49  lapp */.int SQLI
1e580 54 45 5f 43 44 45 43 4c 20 54 43 4c 53 48 5f 4d  TE_CDECL TCLSH_M
1e590 41 49 4e 28 69 6e 74 20 61 72 67 63 2c 20 63 68  AIN(int argc, ch
1e5a0 61 72 20 2a 2a 61 72 67 76 29 7b 0a 20 20 54 63  ar **argv){.  Tc
1e5b0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
1e5c0 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e  ;.  int i;.  con
1e5d0 73 74 20 63 68 61 72 20 2a 7a 53 63 72 69 70 74  st char *zScript
1e5e0 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a 41 72   = 0;.  char zAr
1e5f0 67 63 5b 33 32 5d 3b 0a 23 69 66 20 64 65 66 69  gc[32];.#if defi
1e600 6e 65 64 28 54 43 4c 53 48 5f 49 4e 49 54 5f 50  ned(TCLSH_INIT_P
1e610 52 4f 43 29 0a 20 20 65 78 74 65 72 6e 20 63 6f  ROC).  extern co
1e620 6e 73 74 20 63 68 61 72 20 2a 54 43 4c 53 48 5f  nst char *TCLSH_
1e630 49 4e 49 54 5f 50 52 4f 43 28 54 63 6c 5f 49 6e  INIT_PROC(Tcl_In
1e640 74 65 72 70 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a  terp*);.#endif..
1e650 23 69 66 20 21 64 65 66 69 6e 65 64 28 5f 57 49  #if !defined(_WI
1e660 4e 33 32 5f 57 43 45 29 0a 20 20 69 66 28 20 67  N32_WCE).  if( g
1e670 65 74 65 6e 76 28 22 53 51 4c 49 54 45 5f 44 45  etenv("SQLITE_DE
1e680 42 55 47 5f 42 52 45 41 4b 22 29 20 29 7b 0a 20  BUG_BREAK") ){. 
1e690 20 20 20 69 66 28 20 69 73 61 74 74 79 28 30 29     if( isatty(0)
1e6a0 20 26 26 20 69 73 61 74 74 79 28 32 29 20 29 7b   && isatty(2) ){
1e6b0 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73  .      fprintf(s
1e6c0 74 64 65 72 72 2c 0a 20 20 20 20 20 20 20 20 20  tderr,.         
1e6d0 20 22 61 74 74 61 63 68 20 64 65 62 75 67 67 65   "attach debugge
1e6e0 72 20 74 6f 20 70 72 6f 63 65 73 73 20 25 64 20  r to process %d 
1e6f0 61 6e 64 20 70 72 65 73 73 20 61 6e 79 20 6b 65  and press any ke
1e700 79 20 74 6f 20 63 6f 6e 74 69 6e 75 65 2e 5c 6e  y to continue.\n
1e710 22 2c 0a 20 20 20 20 20 20 20 20 20 20 47 45 54  ",.          GET
1e720 50 49 44 28 29 29 3b 0a 20 20 20 20 20 20 66 67  PID());.      fg
1e730 65 74 63 28 73 74 64 69 6e 29 3b 0a 20 20 20 20  etc(stdin);.    
1e740 7d 65 6c 73 65 7b 0a 23 69 66 20 64 65 66 69 6e  }else{.#if defin
1e750 65 64 28 5f 57 49 4e 33 32 29 20 7c 7c 20 64 65  ed(_WIN32) || de
1e760 66 69 6e 65 64 28 57 49 4e 33 32 29 0a 20 20 20  fined(WIN32).   
1e770 20 20 20 44 65 62 75 67 42 72 65 61 6b 28 29 3b     DebugBreak();
1e780 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 53  .#elif defined(S
1e790 49 47 54 52 41 50 29 0a 20 20 20 20 20 20 72 61  IGTRAP).      ra
1e7a0 69 73 65 28 53 49 47 54 52 41 50 29 3b 0a 23 65  ise(SIGTRAP);.#e
1e7b0 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  ndif.    }.  }.#
1e7c0 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 61 6c 6c  endif..  /* Call
1e7d0 20 73 71 6c 69 74 65 33 5f 73 68 75 74 64 6f 77   sqlite3_shutdow
1e7e0 6e 28 29 20 6f 6e 63 65 20 62 65 66 6f 72 65 20  n() once before 
1e7f0 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 65  doing anything e
1e800 6c 73 65 2e 20 54 68 69 73 20 69 73 20 74 6f 0a  lse. This is to.
1e810 20 20 2a 2a 20 74 65 73 74 20 74 68 61 74 20 73    ** test that s
1e820 71 6c 69 74 65 33 5f 73 68 75 74 64 6f 77 6e 28  qlite3_shutdown(
1e830 29 20 63 61 6e 20 62 65 20 73 61 66 65 6c 79 20  ) can be safely 
1e840 63 61 6c 6c 65 64 20 62 79 20 61 20 70 72 6f 63  called by a proc
1e850 65 73 73 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20  ess before.  ** 
1e860 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69  sqlite3_initiali
1e870 7a 65 28 29 20 69 73 2e 20 2a 2f 0a 20 20 73 71  ze() is. */.  sq
1e880 6c 69 74 65 33 5f 73 68 75 74 64 6f 77 6e 28 29  lite3_shutdown()
1e890 3b 0a 0a 20 20 54 63 6c 5f 46 69 6e 64 45 78 65  ;..  Tcl_FindExe
1e8a0 63 75 74 61 62 6c 65 28 61 72 67 76 5b 30 5d 29  cutable(argv[0])
1e8b0 3b 0a 20 20 54 63 6c 5f 53 65 74 53 79 73 74 65  ;.  Tcl_SetSyste
1e8c0 6d 45 6e 63 6f 64 69 6e 67 28 4e 55 4c 4c 2c 20  mEncoding(NULL, 
1e8d0 22 75 74 66 2d 38 22 29 3b 0a 20 20 69 6e 74 65  "utf-8");.  inte
1e8e0 72 70 20 3d 20 54 63 6c 5f 43 72 65 61 74 65 49  rp = Tcl_CreateI
1e8f0 6e 74 65 72 70 28 29 3b 0a 20 20 53 71 6c 69 74  nterp();.  Sqlit
1e900 65 33 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b  e3_Init(interp);
1e910 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72  ..  sqlite3_snpr
1e920 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 41 72 67  intf(sizeof(zArg
1e930 63 29 2c 20 7a 41 72 67 63 2c 20 22 25 64 22 2c  c), zArgc, "%d",
1e940 20 61 72 67 63 2d 31 29 3b 0a 20 20 54 63 6c 5f   argc-1);.  Tcl_
1e950 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c 22 61  SetVar(interp,"a
1e960 72 67 63 22 2c 20 7a 41 72 67 63 2c 20 54 43 4c  rgc", zArgc, TCL
1e970 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 20  _GLOBAL_ONLY);. 
1e980 20 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65   Tcl_SetVar(inte
1e990 72 70 2c 22 61 72 67 76 30 22 2c 61 72 67 76 5b  rp,"argv0",argv[
1e9a0 30 5d 2c 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e  0],TCL_GLOBAL_ON
1e9b0 4c 59 29 3b 0a 20 20 54 63 6c 5f 53 65 74 56 61  LY);.  Tcl_SetVa
1e9c0 72 28 69 6e 74 65 72 70 2c 22 61 72 67 76 22 2c  r(interp,"argv",
1e9d0 20 22 22 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f   "", TCL_GLOBAL_
1e9e0 4f 4e 4c 59 29 3b 0a 20 20 66 6f 72 28 69 3d 31  ONLY);.  for(i=1
1e9f0 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a  ; i<argc; i++){.
1ea00 20 20 20 20 54 63 6c 5f 53 65 74 56 61 72 28 69      Tcl_SetVar(i
1ea10 6e 74 65 72 70 2c 20 22 61 72 67 76 22 2c 20 61  nterp, "argv", a
1ea20 72 67 76 5b 69 5d 2c 0a 20 20 20 20 20 20 20 20  rgv[i],.        
1ea30 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 20  TCL_GLOBAL_ONLY 
1ea40 7c 20 54 43 4c 5f 4c 49 53 54 5f 45 4c 45 4d 45  | TCL_LIST_ELEME
1ea50 4e 54 20 7c 20 54 43 4c 5f 41 50 50 45 4e 44 5f  NT | TCL_APPEND_
1ea60 56 41 4c 55 45 29 3b 0a 20 20 7d 0a 23 69 66 20  VALUE);.  }.#if 
1ea70 64 65 66 69 6e 65 64 28 54 43 4c 53 48 5f 49 4e  defined(TCLSH_IN
1ea80 49 54 5f 50 52 4f 43 29 0a 20 20 7a 53 63 72 69  IT_PROC).  zScri
1ea90 70 74 20 3d 20 54 43 4c 53 48 5f 49 4e 49 54 5f  pt = TCLSH_INIT_
1eaa0 50 52 4f 43 28 69 6e 74 65 72 70 29 3b 0a 23 65  PROC(interp);.#e
1eab0 6e 64 69 66 0a 20 20 69 66 28 20 7a 53 63 72 69  ndif.  if( zScri
1eac0 70 74 3d 3d 30 20 29 7b 0a 20 20 20 20 7a 53 63  pt==0 ){.    zSc
1ead0 72 69 70 74 20 3d 20 74 63 6c 73 68 5f 6d 61 69  ript = tclsh_mai
1eae0 6e 5f 6c 6f 6f 70 28 29 3b 0a 20 20 7d 0a 20 20  n_loop();.  }.  
1eaf0 69 66 28 20 54 63 6c 5f 47 6c 6f 62 61 6c 45 76  if( Tcl_GlobalEv
1eb00 61 6c 28 69 6e 74 65 72 70 2c 20 7a 53 63 72 69  al(interp, zScri
1eb10 70 74 29 21 3d 54 43 4c 5f 4f 4b 20 29 7b 0a 20  pt)!=TCL_OK ){. 
1eb20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
1eb30 49 6e 66 6f 20 3d 20 54 63 6c 5f 47 65 74 56 61  Info = Tcl_GetVa
1eb40 72 28 69 6e 74 65 72 70 2c 20 22 65 72 72 6f 72  r(interp, "error
1eb50 49 6e 66 6f 22 2c 20 54 43 4c 5f 47 4c 4f 42 41  Info", TCL_GLOBA
1eb60 4c 5f 4f 4e 4c 59 29 3b 0a 20 20 20 20 69 66 28  L_ONLY);.    if(
1eb70 20 7a 49 6e 66 6f 3d 3d 30 20 29 20 7a 49 6e 66   zInfo==0 ) zInf
1eb80 6f 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  o = Tcl_GetStrin
1eb90 67 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b  gResult(interp);
1eba0 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64  .    fprintf(std
1ebb0 65 72 72 2c 22 25 73 3a 20 25 73 5c 6e 22 2c 20  err,"%s: %s\n", 
1ebc0 2a 61 72 67 76 2c 20 7a 49 6e 66 6f 29 3b 0a 20  *argv, zInfo);. 
1ebd0 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
1ebe0 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23  .  return 0;.}.#
1ebf0 65 6e 64 69 66 20 2f 2a 20 54 43 4c 53 48 20 2a  endif /* TCLSH *
1ec00 2f 0a                                            /.