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

Artifact 2c29b0b76e91edfd1b43bf135c32c8674710089197327682b6b7e6af88062c3d:


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 3d 31 20 20 20 20 20 20 20  -DTCLSH=1       
0230: 20 20 20 20 20 20 41 64 64 20 61 20 22 6d 61 69        Add a "mai
0240: 6e 28 29 22 20 72 6f 75 74 69 6e 65 20 74 68 61  n()" routine tha
0250: 74 20 77 6f 72 6b 73 20 61 73 20 61 20 74 63 6c  t works as a tcl
0260: 73 68 2e 0a 2a 2a 0a 2a 2a 20 20 2d 44 53 51 4c  sh..**.**  -DSQL
0270: 49 54 45 5f 54 43 4c 4d 44 35 20 20 20 20 20 20  ITE_TCLMD5      
0280: 20 57 68 65 6e 20 75 73 65 64 20 69 6e 20 63 6f   When used in co
0290: 6e 6a 75 63 74 69 6f 6e 20 77 69 74 68 20 2d 44  njuction with -D
02a0: 54 43 4c 53 48 3d 31 2c 20 61 64 64 0a 2a 2a 20  TCLSH=1, add.** 
02b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
02c0: 20 20 20 20 20 20 20 66 6f 75 72 20 6e 65 77 20         four new 
02d0: 63 6f 6d 6d 61 6e 64 73 20 74 6f 20 74 68 65 20  commands to the 
02e0: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
02f0: 66 6f 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  for.**          
0300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 67 65                ge
0310: 6e 65 72 61 74 69 6e 67 20 4d 44 35 20 63 68 65  nerating MD5 che
0320: 63 6b 73 75 6d 73 3a 20 20 6d 64 35 2c 20 6d 64  cksums:  md5, md
0330: 35 66 69 6c 65 2c 0a 2a 2a 20 20 20 20 20 20 20  5file,.**       
0340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0350: 20 6d 64 35 2d 31 30 78 38 2c 20 61 6e 64 20 6d   md5-10x8, and m
0360: 64 35 66 69 6c 65 2d 31 30 78 38 2e 0a 2a 2a 0a  d5file-10x8..**.
0370: 2a 2a 20 20 2d 44 53 51 4c 49 54 45 5f 54 45 53  **  -DSQLITE_TES
0380: 54 20 20 20 20 20 20 20 20 20 57 68 65 6e 20 75  T         When u
0390: 73 65 64 20 69 6e 20 63 6f 6e 6a 75 63 74 69 6f  sed in conjuctio
03a0: 6e 20 77 69 74 68 20 2d 44 54 43 4c 53 48 3d 31  n with -DTCLSH=1
03b0: 2c 20 61 64 64 0a 2a 2a 20 20 20 20 20 20 20 20  , add.**        
03c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
03d0: 68 75 6e 64 72 65 64 73 20 6f 66 20 6e 65 77 20  hundreds of new 
03e0: 63 6f 6d 6d 61 6e 64 73 20 75 73 65 64 20 66 6f  commands used fo
03f0: 72 20 74 65 73 74 69 6e 67 0a 2a 2a 20 20 20 20  r testing.**    
0400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0410: 20 20 20 20 53 51 4c 69 74 65 2e 20 20 54 68 69      SQLite.  Thi
0420: 73 20 6f 70 74 69 6f 6e 20 69 6d 70 6c 69 65 73  s option implies
0430: 20 2d 44 53 51 4c 49 54 45 5f 54 43 4c 4d 44 35   -DSQLITE_TCLMD5
0440: 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 72  ..*/../*.** If r
0450: 65 71 75 65 73 74 65 64 2c 20 69 6e 63 6c 75 64  equested, includ
0460: 65 20 74 68 65 20 53 51 4c 69 74 65 20 63 6f 6d  e the SQLite com
0470: 70 69 6c 65 72 20 6f 70 74 69 6f 6e 73 20 66 69  piler options fi
0480: 6c 65 20 66 6f 72 20 4d 53 56 43 2e 0a 2a 2f 0a  le for MSVC..*/.
0490: 23 69 66 20 64 65 66 69 6e 65 64 28 49 4e 43 4c  #if defined(INCL
04a0: 55 44 45 5f 4d 53 56 43 5f 48 29 0a 23 20 69 6e  UDE_MSVC_H).# in
04b0: 63 6c 75 64 65 20 22 6d 73 76 63 2e 68 22 0a 23  clude "msvc.h".#
04c0: 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69 6e  endif..#if defin
04d0: 65 64 28 49 4e 43 4c 55 44 45 5f 53 51 4c 49 54  ed(INCLUDE_SQLIT
04e0: 45 5f 54 43 4c 5f 48 29 0a 23 20 69 6e 63 6c 75  E_TCL_H).# inclu
04f0: 64 65 20 22 73 71 6c 69 74 65 5f 74 63 6c 2e 68  de "sqlite_tcl.h
0500: 22 0a 23 65 6c 73 65 0a 23 20 69 6e 63 6c 75 64  ".#else.# includ
0510: 65 20 22 74 63 6c 2e 68 22 0a 23 20 69 66 6e 64  e "tcl.h".# ifnd
0520: 65 66 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49  ef SQLITE_TCLAPI
0530: 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54  .#  define SQLIT
0540: 45 5f 54 43 4c 41 50 49 0a 23 20 65 6e 64 69 66  E_TCLAPI.# endif
0550: 0a 23 65 6e 64 69 66 0a 23 69 6e 63 6c 75 64 65  .#endif.#include
0560: 20 3c 65 72 72 6e 6f 2e 68 3e 0a 0a 2f 2a 0a 2a   <errno.h>../*.*
0570: 2a 20 53 6f 6d 65 20 61 64 64 69 74 69 6f 6e 61  * Some additiona
0580: 6c 20 69 6e 63 6c 75 64 65 20 66 69 6c 65 73 20  l include files 
0590: 61 72 65 20 6e 65 65 64 65 64 20 69 66 20 74 68  are needed if th
05a0: 69 73 20 66 69 6c 65 20 69 73 20 6e 6f 74 0a 2a  is file is not.*
05b0: 2a 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68  * appended to th
05c0: 65 20 61 6d 61 6c 67 61 6d 61 74 69 6f 6e 2e 0a  e amalgamation..
05d0: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
05e0: 45 5f 41 4d 41 4c 47 41 4d 41 54 49 4f 4e 0a 23  E_AMALGAMATION.#
05f0: 20 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65   include "sqlite
0600: 33 2e 68 22 0a 23 20 69 6e 63 6c 75 64 65 20 3c  3.h".# include <
0610: 73 74 64 6c 69 62 2e 68 3e 0a 23 20 69 6e 63 6c  stdlib.h>.# incl
0620: 75 64 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a 23  ude <string.h>.#
0630: 20 69 6e 63 6c 75 64 65 20 3c 61 73 73 65 72 74   include <assert
0640: 2e 68 3e 0a 20 20 74 79 70 65 64 65 66 20 75 6e  .h>.  typedef un
0650: 73 69 67 6e 65 64 20 63 68 61 72 20 75 38 3b 0a  signed char u8;.
0660: 23 65 6e 64 69 66 0a 23 69 6e 63 6c 75 64 65 20  #endif.#include 
0670: 3c 63 74 79 70 65 2e 68 3e 0a 0a 2f 2a 20 55 73  <ctype.h>../* Us
0680: 65 64 20 74 6f 20 67 65 74 20 74 68 65 20 63 75  ed to get the cu
0690: 72 72 65 6e 74 20 70 72 6f 63 65 73 73 20 49 44  rrent process ID
06a0: 20 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64   */.#if !defined
06b0: 28 5f 57 49 4e 33 32 29 0a 23 20 69 6e 63 6c 75  (_WIN32).# inclu
06c0: 64 65 20 3c 75 6e 69 73 74 64 2e 68 3e 0a 23 20  de <unistd.h>.# 
06d0: 64 65 66 69 6e 65 20 47 45 54 50 49 44 20 67 65  define GETPID ge
06e0: 74 70 69 64 0a 23 65 6c 69 66 20 21 64 65 66 69  tpid.#elif !defi
06f0: 6e 65 64 28 5f 57 49 4e 33 32 5f 57 43 45 29 0a  ned(_WIN32_WCE).
0700: 23 20 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  # ifndef SQLITE_
0710: 41 4d 41 4c 47 41 4d 41 54 49 4f 4e 0a 23 20 20  AMALGAMATION.#  
0720: 64 65 66 69 6e 65 20 57 49 4e 33 32 5f 4c 45 41  define WIN32_LEA
0730: 4e 5f 41 4e 44 5f 4d 45 41 4e 0a 23 20 20 69 6e  N_AND_MEAN.#  in
0740: 63 6c 75 64 65 20 3c 77 69 6e 64 6f 77 73 2e 68  clude <windows.h
0750: 3e 0a 23 20 65 6e 64 69 66 0a 23 20 64 65 66 69  >.# endif.# defi
0760: 6e 65 20 47 45 54 50 49 44 20 28 69 6e 74 29 47  ne GETPID (int)G
0770: 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73  etCurrentProcess
0780: 49 64 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a  Id.#endif../*. *
0790: 20 57 69 6e 64 6f 77 73 20 6e 65 65 64 73 20 74   Windows needs t
07a0: 6f 20 6b 6e 6f 77 20 77 68 69 63 68 20 73 79 6d  o know which sym
07b0: 62 6f 6c 73 20 74 6f 20 65 78 70 6f 72 74 2e 20  bols to export. 
07c0: 20 55 6e 69 78 20 64 6f 65 73 20 6e 6f 74 2e 0a   Unix does not..
07d0: 20 2a 20 42 55 49 4c 44 5f 73 71 6c 69 74 65 20   * BUILD_sqlite 
07e0: 73 68 6f 75 6c 64 20 62 65 20 75 6e 64 65 66 69  should be undefi
07f0: 6e 65 64 20 66 6f 72 20 55 6e 69 78 2e 0a 20 2a  ned for Unix.. *
0800: 2f 0a 23 69 66 64 65 66 20 42 55 49 4c 44 5f 73  /.#ifdef BUILD_s
0810: 71 6c 69 74 65 0a 23 75 6e 64 65 66 20 54 43 4c  qlite.#undef TCL
0820: 5f 53 54 4f 52 41 47 45 5f 43 4c 41 53 53 0a 23  _STORAGE_CLASS.#
0830: 64 65 66 69 6e 65 20 54 43 4c 5f 53 54 4f 52 41  define TCL_STORA
0840: 47 45 5f 43 4c 41 53 53 20 44 4c 4c 45 58 50 4f  GE_CLASS DLLEXPO
0850: 52 54 0a 23 65 6e 64 69 66 20 2f 2a 20 42 55 49  RT.#endif /* BUI
0860: 4c 44 5f 73 71 6c 69 74 65 20 2a 2f 0a 0a 23 64  LD_sqlite */..#d
0870: 65 66 69 6e 65 20 4e 55 4d 5f 50 52 45 50 41 52  efine NUM_PREPAR
0880: 45 44 5f 53 54 4d 54 53 20 31 30 0a 23 64 65 66  ED_STMTS 10.#def
0890: 69 6e 65 20 4d 41 58 5f 50 52 45 50 41 52 45 44  ine MAX_PREPARED
08a0: 5f 53 54 4d 54 53 20 31 30 30 0a 0a 2f 2a 20 46  _STMTS 100../* F
08b0: 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69  orward declarati
08c0: 6f 6e 20 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  on */.typedef st
08d0: 72 75 63 74 20 53 71 6c 69 74 65 44 62 20 53 71  ruct SqliteDb Sq
08e0: 6c 69 74 65 44 62 3b 0a 0a 2f 2a 0a 2a 2a 20 4e  liteDb;../*.** N
08f0: 65 77 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 73  ew SQL functions
0900: 20 63 61 6e 20 62 65 20 63 72 65 61 74 65 64 20   can be created 
0910: 61 73 20 54 43 4c 20 73 63 72 69 70 74 73 2e 20  as TCL scripts. 
0920: 20 45 61 63 68 20 73 75 63 68 20 66 75 6e 63 74   Each such funct
0930: 69 6f 6e 0a 2a 2a 20 69 73 20 64 65 73 63 72 69  ion.** is descri
0940: 62 65 64 20 62 79 20 61 6e 20 69 6e 73 74 61 6e  bed by an instan
0950: 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ce of the follow
0960: 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  ing structure..*
0970: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
0980: 20 53 71 6c 46 75 6e 63 20 53 71 6c 46 75 6e 63   SqlFunc SqlFunc
0990: 3b 0a 73 74 72 75 63 74 20 53 71 6c 46 75 6e 63  ;.struct SqlFunc
09a0: 20 7b 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20   {.  Tcl_Interp 
09b0: 2a 69 6e 74 65 72 70 3b 20 20 20 2f 2a 20 54 68  *interp;   /* Th
09c0: 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 20  e TCL interpret 
09d0: 74 6f 20 65 78 65 63 75 74 65 20 74 68 65 20 66  to execute the f
09e0: 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c  unction */.  Tcl
09f0: 5f 4f 62 6a 20 2a 70 53 63 72 69 70 74 3b 20 20  _Obj *pScript;  
0a00: 20 20 20 2f 2a 20 54 68 65 20 54 63 6c 5f 4f 62     /* The Tcl_Ob
0a10: 6a 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  j representation
0a20: 20 6f 66 20 74 68 65 20 73 63 72 69 70 74 20 2a   of the script *
0a30: 2f 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44  /.  SqliteDb *pD
0a40: 62 3b 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74  b;        /* Dat
0a50: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
0a60: 20 74 68 61 74 20 6f 77 6e 73 20 74 68 69 73 20   that owns this 
0a70: 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  function */.  in
0a80: 74 20 75 73 65 45 76 61 6c 4f 62 6a 76 3b 20 20  t useEvalObjv;  
0a90: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 69      /* True if i
0aa0: 74 20 69 73 20 73 61 66 65 20 74 6f 20 75 73 65  t is safe to use
0ab0: 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 76 20 2a 2f   Tcl_EvalObjv */
0ac0: 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20  .  char *zName; 
0ad0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
0ae0: 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   of this functio
0af0: 6e 20 2a 2f 0a 20 20 53 71 6c 46 75 6e 63 20 2a  n */.  SqlFunc *
0b00: 70 4e 65 78 74 3b 20 20 20 20 20 20 20 2f 2a 20  pNext;       /* 
0b10: 4e 65 78 74 20 66 75 6e 63 74 69 6f 6e 20 6f 6e  Next function on
0b20: 20 74 68 65 20 6c 69 73 74 20 6f 66 20 74 68 65   the list of the
0b30: 6d 20 61 6c 6c 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a  m all */.};../*.
0b40: 2a 2a 20 4e 65 77 20 63 6f 6c 6c 61 74 69 6f 6e  ** New collation
0b50: 20 73 65 71 75 65 6e 63 65 73 20 66 75 6e 63 74   sequences funct
0b60: 69 6f 6e 20 63 61 6e 20 62 65 20 63 72 65 61 74  ion can be creat
0b70: 65 64 20 61 73 20 54 43 4c 20 73 63 72 69 70 74  ed as TCL script
0b80: 73 2e 20 20 45 61 63 68 20 73 75 63 68 0a 2a 2a  s.  Each such.**
0b90: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 64 65 73   function is des
0ba0: 63 72 69 62 65 64 20 62 79 20 61 6e 20 69 6e 73  cribed by an ins
0bb0: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c  tance of the fol
0bc0: 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
0bd0: 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  ..*/.typedef str
0be0: 75 63 74 20 53 71 6c 43 6f 6c 6c 61 74 65 20 53  uct SqlCollate S
0bf0: 71 6c 43 6f 6c 6c 61 74 65 3b 0a 73 74 72 75 63  qlCollate;.struc
0c00: 74 20 53 71 6c 43 6f 6c 6c 61 74 65 20 7b 0a 20  t SqlCollate {. 
0c10: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
0c20: 65 72 70 3b 20 20 20 2f 2a 20 54 68 65 20 54 43  erp;   /* The TC
0c30: 4c 20 69 6e 74 65 72 70 72 65 74 20 74 6f 20 65  L interpret to e
0c40: 78 65 63 75 74 65 20 74 68 65 20 66 75 6e 63 74  xecute the funct
0c50: 69 6f 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ion */.  char *z
0c60: 53 63 72 69 70 74 3b 20 20 20 20 20 20 20 20 2f  Script;        /
0c70: 2a 20 54 68 65 20 73 63 72 69 70 74 20 74 6f 20  * The script to 
0c80: 62 65 20 72 75 6e 20 2a 2f 0a 20 20 53 71 6c 43  be run */.  SqlC
0c90: 6f 6c 6c 61 74 65 20 2a 70 4e 65 78 74 3b 20 20  ollate *pNext;  
0ca0: 20 20 2f 2a 20 4e 65 78 74 20 66 75 6e 63 74 69    /* Next functi
0cb0: 6f 6e 20 6f 6e 20 74 68 65 20 6c 69 73 74 20 6f  on on the list o
0cc0: 66 20 74 68 65 6d 20 61 6c 6c 20 2a 2f 0a 7d 3b  f them all */.};
0cd0: 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61 72 65 64  ../*.** Prepared
0ce0: 20 73 74 61 74 65 6d 65 6e 74 73 20 61 72 65 20   statements are 
0cf0: 63 61 63 68 65 64 20 66 6f 72 20 66 61 73 74 65  cached for faste
0d00: 72 20 65 78 65 63 75 74 69 6f 6e 2e 20 20 45 61  r execution.  Ea
0d10: 63 68 20 70 72 65 70 61 72 65 64 0a 2a 2a 20 73  ch prepared.** s
0d20: 74 61 74 65 6d 65 6e 74 20 69 73 20 64 65 73 63  tatement is desc
0d30: 72 69 62 65 64 20 62 79 20 61 6e 20 69 6e 73 74  ribed by an inst
0d40: 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ance of the foll
0d50: 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e  owing structure.
0d60: 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
0d70: 63 74 20 53 71 6c 50 72 65 70 61 72 65 64 53 74  ct SqlPreparedSt
0d80: 6d 74 20 53 71 6c 50 72 65 70 61 72 65 64 53 74  mt SqlPreparedSt
0d90: 6d 74 3b 0a 73 74 72 75 63 74 20 53 71 6c 50 72  mt;.struct SqlPr
0da0: 65 70 61 72 65 64 53 74 6d 74 20 7b 0a 20 20 53  eparedStmt {.  S
0db0: 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74 20 2a  qlPreparedStmt *
0dc0: 70 4e 65 78 74 3b 20 20 2f 2a 20 4e 65 78 74 20  pNext;  /* Next 
0dd0: 69 6e 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 2a  in linked list *
0de0: 2f 0a 20 20 53 71 6c 50 72 65 70 61 72 65 64 53  /.  SqlPreparedS
0df0: 74 6d 74 20 2a 70 50 72 65 76 3b 20 20 2f 2a 20  tmt *pPrev;  /* 
0e00: 50 72 65 76 69 6f 75 73 20 6f 6e 20 74 68 65 20  Previous on the 
0e10: 6c 69 73 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65  list */.  sqlite
0e20: 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 20 20  3_stmt *pStmt;  
0e30: 20 20 20 2f 2a 20 54 68 65 20 70 72 65 70 61 72     /* The prepar
0e40: 65 64 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  ed statement */.
0e50: 20 20 69 6e 74 20 6e 53 71 6c 3b 20 20 20 20 20    int nSql;     
0e60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 63 68             /* ch
0e70: 61 72 73 20 69 6e 20 7a 53 71 6c 5b 5d 20 2a 2f  ars in zSql[] */
0e80: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
0e90: 53 71 6c 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  Sql;        /* T
0ea0: 65 78 74 20 6f 66 20 74 68 65 20 53 51 4c 20 73  ext of the SQL s
0eb0: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e  tatement */.  in
0ec0: 74 20 6e 50 61 72 6d 3b 20 20 20 20 20 20 20 20  t nParm;        
0ed0: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
0ee0: 66 20 61 70 50 61 72 6d 20 61 72 72 61 79 20 2a  f apParm array *
0ef0: 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 61 70  /.  Tcl_Obj **ap
0f00: 50 61 72 6d 3b 20 20 20 20 20 20 20 20 2f 2a 20  Parm;        /* 
0f10: 41 72 72 61 79 20 6f 66 20 72 65 66 65 72 65 6e  Array of referen
0f20: 63 65 64 20 6f 62 6a 65 63 74 20 70 6f 69 6e 74  ced object point
0f30: 65 72 73 20 2a 2f 0a 7d 3b 0a 0a 74 79 70 65 64  ers */.};..typed
0f40: 65 66 20 73 74 72 75 63 74 20 49 6e 63 72 62 6c  ef struct Incrbl
0f50: 6f 62 43 68 61 6e 6e 65 6c 20 49 6e 63 72 62 6c  obChannel Incrbl
0f60: 6f 62 43 68 61 6e 6e 65 6c 3b 0a 0a 2f 2a 0a 2a  obChannel;../*.*
0f70: 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20 69  * There is one i
0f80: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20  nstance of this 
0f90: 73 74 72 75 63 74 75 72 65 20 66 6f 72 20 65 61  structure for ea
0fa0: 63 68 20 53 51 4c 69 74 65 20 64 61 74 61 62 61  ch SQLite databa
0fb0: 73 65 0a 2a 2a 20 74 68 61 74 20 68 61 73 20 62  se.** that has b
0fc0: 65 65 6e 20 6f 70 65 6e 65 64 20 62 79 20 74 68  een opened by th
0fd0: 65 20 53 51 4c 69 74 65 20 54 43 4c 20 69 6e 74  e SQLite TCL int
0fe0: 65 72 66 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  erface..**.** If
0ff0: 20 74 68 69 73 20 6d 6f 64 75 6c 65 20 69 73 20   this module is 
1000: 62 75 69 6c 74 20 77 69 74 68 20 53 51 4c 49 54  built with SQLIT
1010: 45 5f 54 45 53 54 20 64 65 66 69 6e 65 64 20 28  E_TEST defined (
1020: 74 6f 20 63 72 65 61 74 65 20 74 68 65 20 53 51  to create the SQ
1030: 4c 69 74 65 0a 2a 2a 20 74 65 73 74 66 69 78 74  Lite.** testfixt
1040: 75 72 65 20 65 78 65 63 75 74 61 62 6c 65 29 2c  ure executable),
1050: 20 74 68 65 6e 20 69 74 20 6d 61 79 20 62 65 20   then it may be 
1060: 63 6f 6e 66 69 67 75 72 65 64 20 74 6f 20 75 73  configured to us
1070: 65 20 65 69 74 68 65 72 0a 2a 2a 20 73 71 6c 69  e either.** sqli
1080: 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 29  te3_prepare_v2()
1090: 20 6f 72 20 73 71 6c 69 74 65 33 5f 70 72 65 70   or sqlite3_prep
10a0: 61 72 65 28 29 20 74 6f 20 70 72 65 70 61 72 65  are() to prepare
10b0: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 2e   SQL statements.
10c0: 0a 2a 2a 20 49 66 20 53 71 6c 69 74 65 44 62 2e  .** If SqliteDb.
10d0: 62 4c 65 67 61 63 79 50 72 65 70 61 72 65 20 69  bLegacyPrepare i
10e0: 73 20 74 72 75 65 2c 20 73 71 6c 69 74 65 33 5f  s true, sqlite3_
10f0: 70 72 65 70 61 72 65 28 29 20 69 73 20 75 73 65  prepare() is use
1100: 64 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 53 71 6c  d..*/.struct Sql
1110: 69 74 65 44 62 20 7b 0a 20 20 73 71 6c 69 74 65  iteDb {.  sqlite
1120: 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20  3 *db;          
1130: 20 20 20 20 20 2f 2a 20 54 68 65 20 22 72 65 61       /* The "rea
1140: 6c 22 20 64 61 74 61 62 61 73 65 20 73 74 72 75  l" database stru
1150: 63 74 75 72 65 2e 20 4d 55 53 54 20 42 45 20 46  cture. MUST BE F
1160: 49 52 53 54 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e  IRST */.  Tcl_In
1170: 74 65 72 70 20 2a 69 6e 74 65 72 70 3b 20 20 20  terp *interp;   
1180: 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 74 65       /* The inte
1190: 72 70 72 65 74 65 72 20 75 73 65 64 20 66 6f 72  rpreter used for
11a0: 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 2a   this database *
11b0: 2f 0a 20 20 63 68 61 72 20 2a 7a 42 75 73 79 3b  /.  char *zBusy;
11c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11d0: 2a 20 54 68 65 20 62 75 73 79 20 63 61 6c 6c 62  * The busy callb
11e0: 61 63 6b 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 20  ack routine */. 
11f0: 20 63 68 61 72 20 2a 7a 43 6f 6d 6d 69 74 3b 20   char *zCommit; 
1200: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1210: 68 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20 63  he commit hook c
1220: 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 20  allback routine 
1230: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 54 72 61 63  */.  char *zTrac
1240: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
1250: 2f 2a 20 54 68 65 20 74 72 61 63 65 20 63 61 6c  /* The trace cal
1260: 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 20 2a 2f  lback routine */
1270: 0a 20 20 63 68 61 72 20 2a 7a 54 72 61 63 65 56  .  char *zTraceV
1280: 32 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  2;            /*
1290: 20 54 68 65 20 74 72 61 63 65 5f 76 32 20 63 61   The trace_v2 ca
12a0: 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 20 2a  llback routine *
12b0: 2f 0a 20 20 63 68 61 72 20 2a 7a 50 72 6f 66 69  /.  char *zProfi
12c0: 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  le;            /
12d0: 2a 20 54 68 65 20 70 72 6f 66 69 6c 65 20 63 61  * The profile ca
12e0: 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 20 2a  llback routine *
12f0: 2f 0a 20 20 63 68 61 72 20 2a 7a 50 72 6f 67 72  /.  char *zProgr
1300: 65 73 73 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ess;           /
1310: 2a 20 54 68 65 20 70 72 6f 67 72 65 73 73 20 63  * The progress c
1320: 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 20  allback routine 
1330: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 41 75 74 68  */.  char *zAuth
1340: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1350: 2f 2a 20 54 68 65 20 61 75 74 68 6f 72 69 7a 61  /* The authoriza
1360: 74 69 6f 6e 20 63 61 6c 6c 62 61 63 6b 20 72 6f  tion callback ro
1370: 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 64  utine */.  int d
1380: 69 73 61 62 6c 65 41 75 74 68 3b 20 20 20 20 20  isableAuth;     
1390: 20 20 20 20 20 20 2f 2a 20 44 69 73 61 62 6c 65        /* Disable
13a0: 20 74 68 65 20 61 75 74 68 6f 72 69 7a 65 72 20   the authorizer 
13b0: 69 66 20 69 74 20 65 78 69 73 74 73 20 2a 2f 0a  if it exists */.
13c0: 20 20 63 68 61 72 20 2a 7a 4e 75 6c 6c 3b 20 20    char *zNull;  
13d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13e0: 54 65 78 74 20 74 6f 20 73 75 62 73 74 69 74 75  Text to substitu
13f0: 74 65 20 66 6f 72 20 61 6e 20 53 51 4c 20 4e 55  te for an SQL NU
1400: 4c 4c 20 76 61 6c 75 65 20 2a 2f 0a 20 20 53 71  LL value */.  Sq
1410: 6c 46 75 6e 63 20 2a 70 46 75 6e 63 3b 20 20 20  lFunc *pFunc;   
1420: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74           /* List
1430: 20 6f 66 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e   of SQL function
1440: 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  s */.  Tcl_Obj *
1450: 70 55 70 64 61 74 65 48 6f 6f 6b 3b 20 20 20 20  pUpdateHook;    
1460: 20 20 2f 2a 20 55 70 64 61 74 65 20 68 6f 6f 6b    /* Update hook
1470: 20 73 63 72 69 70 74 20 28 69 66 20 61 6e 79 29   script (if any)
1480: 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70   */.  Tcl_Obj *p
1490: 50 72 65 55 70 64 61 74 65 48 6f 6f 6b 3b 20 20  PreUpdateHook;  
14a0: 20 2f 2a 20 50 72 65 2d 75 70 64 61 74 65 20 68   /* Pre-update h
14b0: 6f 6f 6b 20 73 63 72 69 70 74 20 28 69 66 20 61  ook script (if a
14c0: 6e 79 29 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a  ny) */.  Tcl_Obj
14d0: 20 2a 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 3b   *pRollbackHook;
14e0: 20 20 20 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20      /* Rollback 
14f0: 68 6f 6f 6b 20 73 63 72 69 70 74 20 28 69 66 20  hook script (if 
1500: 61 6e 79 29 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62  any) */.  Tcl_Ob
1510: 6a 20 2a 70 57 61 6c 48 6f 6f 6b 3b 20 20 20 20  j *pWalHook;    
1520: 20 20 20 20 20 2f 2a 20 57 41 4c 20 68 6f 6f 6b       /* WAL hook
1530: 20 73 63 72 69 70 74 20 28 69 66 20 61 6e 79 29   script (if any)
1540: 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70   */.  Tcl_Obj *p
1550: 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 3b 20 20 20  UnlockNotify;   
1560: 20 2f 2a 20 55 6e 6c 6f 63 6b 20 6e 6f 74 69 66   /* Unlock notif
1570: 79 20 73 63 72 69 70 74 20 28 69 66 20 61 6e 79  y script (if any
1580: 29 20 2a 2f 0a 20 20 53 71 6c 43 6f 6c 6c 61 74  ) */.  SqlCollat
1590: 65 20 2a 70 43 6f 6c 6c 61 74 65 3b 20 20 20 20  e *pCollate;    
15a0: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 53 51 4c    /* List of SQL
15b0: 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e 63 74   collation funct
15c0: 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ions */.  int rc
15d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
15e0: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
15f0: 6f 64 65 20 6f 66 20 6d 6f 73 74 20 72 65 63 65  ode of most rece
1600: 6e 74 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28  nt sqlite3_exec(
1610: 29 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  ) */.  Tcl_Obj *
1620: 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64 3b 20  pCollateNeeded; 
1630: 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6f 6e 20 6e    /* Collation n
1640: 65 65 64 65 64 20 73 63 72 69 70 74 20 2a 2f 0a  eeded script */.
1650: 20 20 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d    SqlPreparedStm
1660: 74 20 2a 73 74 6d 74 4c 69 73 74 3b 20 2f 2a 20  t *stmtList; /* 
1670: 4c 69 73 74 20 6f 66 20 70 72 65 70 61 72 65 64  List of prepared
1680: 20 73 74 61 74 65 6d 65 6e 74 73 2a 2f 0a 20 20   statements*/.  
1690: 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74 20  SqlPreparedStmt 
16a0: 2a 73 74 6d 74 4c 61 73 74 3b 20 2f 2a 20 4c 61  *stmtLast; /* La
16b0: 73 74 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20  st statement in 
16c0: 74 68 65 20 6c 69 73 74 20 2a 2f 0a 20 20 69 6e  the list */.  in
16d0: 74 20 6d 61 78 53 74 6d 74 3b 20 20 20 20 20 20  t maxStmt;      
16e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
16f0: 6e 65 78 74 20 6d 61 78 69 6d 75 6d 20 6e 75 6d  next maximum num
1700: 62 65 72 20 6f 66 20 73 74 6d 74 4c 69 73 74 20  ber of stmtList 
1710: 2a 2f 0a 20 20 69 6e 74 20 6e 53 74 6d 74 3b 20  */.  int nStmt; 
1720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1730: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 74 61  /* Number of sta
1740: 74 65 6d 65 6e 74 73 20 69 6e 20 73 74 6d 74 4c  tements in stmtL
1750: 69 73 74 20 2a 2f 0a 20 20 49 6e 63 72 62 6c 6f  ist */.  Incrblo
1760: 62 43 68 61 6e 6e 65 6c 20 2a 70 49 6e 63 72 62  bChannel *pIncrb
1770: 6c 6f 62 3b 2f 2a 20 4c 69 6e 6b 65 64 20 6c 69  lob;/* Linked li
1780: 73 74 20 6f 66 20 6f 70 65 6e 20 69 6e 63 72 62  st of open incrb
1790: 6c 6f 62 20 63 68 61 6e 6e 65 6c 73 20 2a 2f 0a  lob channels */.
17a0: 20 20 69 6e 74 20 6e 53 74 65 70 2c 20 6e 53 6f    int nStep, nSo
17b0: 72 74 2c 20 6e 49 6e 64 65 78 3b 20 20 2f 2a 20  rt, nIndex;  /* 
17c0: 53 74 61 74 69 73 74 69 63 73 20 66 6f 72 20 6d  Statistics for m
17d0: 6f 73 74 20 72 65 63 65 6e 74 20 6f 70 65 72 61  ost recent opera
17e0: 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 56  tion */.  int nV
17f0: 4d 53 74 65 70 3b 20 20 20 20 20 20 20 20 20 20  MStep;          
1800: 20 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20       /* Another 
1810: 73 74 61 74 69 73 74 69 63 20 66 6f 72 20 6d 6f  statistic for mo
1820: 73 74 20 72 65 63 65 6e 74 20 6f 70 65 72 61 74  st recent operat
1830: 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 72  ion */.  int nTr
1840: 61 6e 73 61 63 74 69 6f 6e 3b 20 20 20 20 20 20  ansaction;      
1850: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1860: 20 6e 65 73 74 65 64 20 5b 74 72 61 6e 73 61 63   nested [transac
1870: 74 69 6f 6e 5d 20 6d 65 74 68 6f 64 73 20 2a 2f  tion] methods */
1880: 0a 20 20 69 6e 74 20 6f 70 65 6e 46 6c 61 67 73  .  int openFlags
1890: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
18a0: 20 46 6c 61 67 73 20 75 73 65 64 20 74 6f 20 6f   Flags used to o
18b0: 70 65 6e 2e 20 20 28 53 51 4c 49 54 45 5f 4f 50  pen.  (SQLITE_OP
18c0: 45 4e 5f 55 52 49 29 20 2a 2f 0a 23 69 66 64 65  EN_URI) */.#ifde
18d0: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
18e0: 69 6e 74 20 62 4c 65 67 61 63 79 50 72 65 70 61  int bLegacyPrepa
18f0: 72 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72  re;        /* Tr
1900: 75 65 20 74 6f 20 75 73 65 20 73 71 6c 69 74 65  ue to use sqlite
1910: 33 5f 70 72 65 70 61 72 65 28 29 20 2a 2f 0a 23  3_prepare() */.#
1920: 65 6e 64 69 66 0a 7d 3b 0a 0a 73 74 72 75 63 74  endif.};..struct
1930: 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c   IncrblobChannel
1940: 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f   {.  sqlite3_blo
1950: 62 20 2a 70 42 6c 6f 62 3b 20 20 20 20 20 20 2f  b *pBlob;      /
1960: 2a 20 73 71 6c 69 74 65 33 20 62 6c 6f 62 20 68  * sqlite3 blob h
1970: 61 6e 64 6c 65 20 2a 2f 0a 20 20 53 71 6c 69 74  andle */.  Sqlit
1980: 65 44 62 20 2a 70 44 62 3b 20 20 20 20 20 20 20  eDb *pDb;       
1990: 20 20 20 20 20 2f 2a 20 41 73 73 6f 63 69 61 74       /* Associat
19a0: 65 64 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  ed database conn
19b0: 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ection */.  int 
19c0: 69 53 65 65 6b 3b 20 20 20 20 20 20 20 20 20 20  iSeek;          
19d0: 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
19e0: 20 73 65 65 6b 20 6f 66 66 73 65 74 20 2a 2f 0a   seek offset */.
19f0: 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68    Tcl_Channel ch
1a00: 61 6e 6e 65 6c 3b 20 20 20 20 20 20 2f 2a 20 43  annel;      /* C
1a10: 68 61 6e 6e 65 6c 20 69 64 65 6e 74 69 66 69 65  hannel identifie
1a20: 72 20 2a 2f 0a 20 20 49 6e 63 72 62 6c 6f 62 43  r */.  IncrblobC
1a30: 68 61 6e 6e 65 6c 20 2a 70 4e 65 78 74 3b 20 20  hannel *pNext;  
1a40: 20 2f 2a 20 4c 69 6e 6b 65 64 20 6c 69 73 74 20   /* Linked list 
1a50: 6f 66 20 61 6c 6c 20 6f 70 65 6e 20 69 6e 63 72  of all open incr
1a60: 62 6c 6f 62 20 63 68 61 6e 6e 65 6c 73 20 2a 2f  blob channels */
1a70: 0a 20 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e  .  IncrblobChann
1a80: 65 6c 20 2a 70 50 72 65 76 3b 20 20 20 2f 2a 20  el *pPrev;   /* 
1a90: 4c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 61  Linked list of a
1aa0: 6c 6c 20 6f 70 65 6e 20 69 6e 63 72 62 6c 6f 62  ll open incrblob
1ab0: 20 63 68 61 6e 6e 65 6c 73 20 2a 2f 0a 7d 3b 0a   channels */.};.
1ac0: 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61  ./*.** Compute a
1ad0: 20 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 74   string length t
1ae0: 68 61 74 20 69 73 20 6c 69 6d 69 74 65 64 20 74  hat is limited t
1af0: 6f 20 77 68 61 74 20 63 61 6e 20 62 65 20 73 74  o what can be st
1b00: 6f 72 65 64 20 69 6e 0a 2a 2a 20 6c 6f 77 65 72  ored in.** lower
1b10: 20 33 30 20 62 69 74 73 20 6f 66 20 61 20 33 32   30 bits of a 32
1b20: 2d 62 69 74 20 73 69 67 6e 65 64 20 69 6e 74 65  -bit signed inte
1b30: 67 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ger..*/.static i
1b40: 6e 74 20 73 74 72 6c 65 6e 33 30 28 63 6f 6e 73  nt strlen30(cons
1b50: 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 63 6f  t char *z){.  co
1b60: 6e 73 74 20 63 68 61 72 20 2a 7a 32 20 3d 20 7a  nst char *z2 = z
1b70: 3b 0a 20 20 77 68 69 6c 65 28 20 2a 7a 32 20 29  ;.  while( *z2 )
1b80: 7b 20 7a 32 2b 2b 3b 20 7d 0a 20 20 72 65 74 75  { z2++; }.  retu
1b90: 72 6e 20 30 78 33 66 66 66 66 66 66 66 20 26 20  rn 0x3fffffff & 
1ba0: 28 69 6e 74 29 28 7a 32 20 2d 20 7a 29 3b 0a 7d  (int)(z2 - z);.}
1bb0: 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ...#ifndef SQLIT
1bc0: 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a  E_OMIT_INCRBLOB.
1bd0: 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20  /*.** Close all 
1be0: 69 6e 63 72 62 6c 6f 62 20 63 68 61 6e 6e 65 6c  incrblob channel
1bf0: 73 20 6f 70 65 6e 65 64 20 75 73 69 6e 67 20 64  s opened using d
1c00: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
1c10: 6f 6e 20 70 44 62 2e 0a 2a 2a 20 54 68 69 73 20  on pDb..** This 
1c20: 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 73  is called when s
1c30: 68 75 74 74 69 6e 67 20 64 6f 77 6e 20 74 68 65  hutting down the
1c40: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
1c50: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
1c60: 76 6f 69 64 20 63 6c 6f 73 65 49 6e 63 72 62 6c  void closeIncrbl
1c70: 6f 62 43 68 61 6e 6e 65 6c 73 28 53 71 6c 69 74  obChannels(Sqlit
1c80: 65 44 62 20 2a 70 44 62 29 7b 0a 20 20 49 6e 63  eDb *pDb){.  Inc
1c90: 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 70 3b  rblobChannel *p;
1ca0: 0a 20 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e  .  IncrblobChann
1cb0: 65 6c 20 2a 70 4e 65 78 74 3b 0a 0a 20 20 66 6f  el *pNext;..  fo
1cc0: 72 28 70 3d 70 44 62 2d 3e 70 49 6e 63 72 62 6c  r(p=pDb->pIncrbl
1cd0: 6f 62 3b 20 70 3b 20 70 3d 70 4e 65 78 74 29 7b  ob; p; p=pNext){
1ce0: 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 2d 3e  .    pNext = p->
1cf0: 70 4e 65 78 74 3b 0a 0a 20 20 20 20 2f 2a 20 4e  pNext;..    /* N
1d00: 6f 74 65 3a 20 43 61 6c 6c 69 6e 67 20 75 6e 72  ote: Calling unr
1d10: 65 67 69 73 74 65 72 20 68 65 72 65 20 63 61 6c  egister here cal
1d20: 6c 20 54 63 6c 5f 43 6c 6f 73 65 20 6f 6e 20 74  l Tcl_Close on t
1d30: 68 65 20 69 6e 63 72 62 6c 6f 62 20 63 68 61 6e  he incrblob chan
1d40: 6e 65 6c 2c 0a 20 20 20 20 2a 2a 20 77 68 69 63  nel,.    ** whic
1d50: 68 20 64 65 6c 65 74 65 73 20 74 68 65 20 49 6e  h deletes the In
1d60: 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 73 74  crblobChannel st
1d70: 72 75 63 74 75 72 65 20 61 74 20 2a 70 2e 20 53  ructure at *p. S
1d80: 6f 20 64 6f 20 6e 6f 74 0a 20 20 20 20 2a 2a 20  o do not.    ** 
1d90: 63 61 6c 6c 20 54 63 6c 5f 46 72 65 65 28 29 20  call Tcl_Free() 
1da0: 68 65 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  here..    */.   
1db0: 20 54 63 6c 5f 55 6e 72 65 67 69 73 74 65 72 43   Tcl_UnregisterC
1dc0: 68 61 6e 6e 65 6c 28 70 44 62 2d 3e 69 6e 74 65  hannel(pDb->inte
1dd0: 72 70 2c 20 70 2d 3e 63 68 61 6e 6e 65 6c 29 3b  rp, p->channel);
1de0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  .  }.}../*.** Cl
1df0: 6f 73 65 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74  ose an increment
1e00: 61 6c 20 62 6c 6f 62 20 63 68 61 6e 6e 65 6c 2e  al blob channel.
1e10: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53  .*/.static int S
1e20: 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 69 6e 63  QLITE_TCLAPI inc
1e30: 72 62 6c 6f 62 43 6c 6f 73 65 28 0a 20 20 43 6c  rblobClose(.  Cl
1e40: 69 65 6e 74 44 61 74 61 20 69 6e 73 74 61 6e 63  ientData instanc
1e50: 65 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  eData,.  Tcl_Int
1e60: 65 72 70 20 2a 69 6e 74 65 72 70 0a 29 7b 0a 20  erp *interp.){. 
1e70: 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c   IncrblobChannel
1e80: 20 2a 70 20 3d 20 28 49 6e 63 72 62 6c 6f 62 43   *p = (IncrblobC
1e90: 68 61 6e 6e 65 6c 20 2a 29 69 6e 73 74 61 6e 63  hannel *)instanc
1ea0: 65 44 61 74 61 3b 0a 20 20 69 6e 74 20 72 63 20  eData;.  int rc 
1eb0: 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 63  = sqlite3_blob_c
1ec0: 6c 6f 73 65 28 70 2d 3e 70 42 6c 6f 62 29 3b 0a  lose(p->pBlob);.
1ed0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
1ee0: 70 2d 3e 70 44 62 2d 3e 64 62 3b 0a 0a 20 20 2f  p->pDb->db;..  /
1ef0: 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 63 68 61  * Remove the cha
1f00: 6e 6e 65 6c 20 66 72 6f 6d 20 74 68 65 20 53 71  nnel from the Sq
1f10: 6c 69 74 65 44 62 2e 70 49 6e 63 72 62 6c 6f 62  liteDb.pIncrblob
1f20: 20 6c 69 73 74 2e 20 2a 2f 0a 20 20 69 66 28 20   list. */.  if( 
1f30: 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20  p->pNext ){.    
1f40: 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20  p->pNext->pPrev 
1f50: 3d 20 70 2d 3e 70 50 72 65 76 3b 0a 20 20 7d 0a  = p->pPrev;.  }.
1f60: 20 20 69 66 28 20 70 2d 3e 70 50 72 65 76 20 29    if( p->pPrev )
1f70: 7b 0a 20 20 20 20 70 2d 3e 70 50 72 65 76 2d 3e  {.    p->pPrev->
1f80: 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74  pNext = p->pNext
1f90: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70  ;.  }.  if( p->p
1fa0: 44 62 2d 3e 70 49 6e 63 72 62 6c 6f 62 3d 3d 70  Db->pIncrblob==p
1fb0: 20 29 7b 0a 20 20 20 20 70 2d 3e 70 44 62 2d 3e   ){.    p->pDb->
1fc0: 70 49 6e 63 72 62 6c 6f 62 20 3d 20 70 2d 3e 70  pIncrblob = p->p
1fd0: 4e 65 78 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  Next;.  }..  /* 
1fe0: 46 72 65 65 20 74 68 65 20 49 6e 63 72 62 6c 6f  Free the Incrblo
1ff0: 62 43 68 61 6e 6e 65 6c 20 73 74 72 75 63 74 75  bChannel structu
2000: 72 65 20 2a 2f 0a 20 20 54 63 6c 5f 46 72 65 65  re */.  Tcl_Free
2010: 28 28 63 68 61 72 20 2a 29 70 29 3b 0a 0a 20 20  ((char *)p);..  
2020: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2030: 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74  K ){.    Tcl_Set
2040: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28  Result(interp, (
2050: 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 65  char *)sqlite3_e
2060: 72 72 6d 73 67 28 64 62 29 2c 20 54 43 4c 5f 56  rrmsg(db), TCL_V
2070: 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 20 20 72 65  OLATILE);.    re
2080: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
2090: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c    }.  return TCL
20a0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  _OK;.}../*.** Re
20b0: 61 64 20 64 61 74 61 20 66 72 6f 6d 20 61 6e 20  ad data from an 
20c0: 69 6e 63 72 65 6d 65 6e 74 61 6c 20 62 6c 6f 62  incremental blob
20d0: 20 63 68 61 6e 6e 65 6c 2e 0a 2a 2f 0a 73 74 61   channel..*/.sta
20e0: 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54  tic int SQLITE_T
20f0: 43 4c 41 50 49 20 69 6e 63 72 62 6c 6f 62 49 6e  CLAPI incrblobIn
2100: 70 75 74 28 0a 20 20 43 6c 69 65 6e 74 44 61 74  put(.  ClientDat
2110: 61 20 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 0a  a instanceData,.
2120: 20 20 63 68 61 72 20 2a 62 75 66 2c 0a 20 20 69    char *buf,.  i
2130: 6e 74 20 62 75 66 53 69 7a 65 2c 0a 20 20 69 6e  nt bufSize,.  in
2140: 74 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 0a  t *errorCodePtr.
2150: 29 7b 0a 20 20 49 6e 63 72 62 6c 6f 62 43 68 61  ){.  IncrblobCha
2160: 6e 6e 65 6c 20 2a 70 20 3d 20 28 49 6e 63 72 62  nnel *p = (Incrb
2170: 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 29 69 6e 73  lobChannel *)ins
2180: 74 61 6e 63 65 44 61 74 61 3b 0a 20 20 69 6e 74  tanceData;.  int
2190: 20 6e 52 65 61 64 20 3d 20 62 75 66 53 69 7a 65   nRead = bufSize
21a0: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  ;         /* Num
21b0: 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20  ber of bytes to 
21c0: 72 65 61 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 42  read */.  int nB
21d0: 6c 6f 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  lob;            
21e0: 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20         /* Total 
21f0: 73 69 7a 65 20 6f 66 20 74 68 65 20 62 6c 6f 62  size of the blob
2200: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
2210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2220: 20 20 20 2f 2a 20 73 71 6c 69 74 65 20 65 72 72     /* sqlite err
2230: 6f 72 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 6e 42  or code */..  nB
2240: 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c  lob = sqlite3_bl
2250: 6f 62 5f 62 79 74 65 73 28 70 2d 3e 70 42 6c 6f  ob_bytes(p->pBlo
2260: 62 29 3b 0a 20 20 69 66 28 20 28 70 2d 3e 69 53  b);.  if( (p->iS
2270: 65 65 6b 2b 6e 52 65 61 64 29 3e 6e 42 6c 6f 62  eek+nRead)>nBlob
2280: 20 29 7b 0a 20 20 20 20 6e 52 65 61 64 20 3d 20   ){.    nRead = 
2290: 6e 42 6c 6f 62 2d 70 2d 3e 69 53 65 65 6b 3b 0a  nBlob-p->iSeek;.
22a0: 20 20 7d 0a 20 20 69 66 28 20 6e 52 65 61 64 3c    }.  if( nRead<
22b0: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
22c0: 20 30 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20   0;.  }..  rc = 
22d0: 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 72 65 61  sqlite3_blob_rea
22e0: 64 28 70 2d 3e 70 42 6c 6f 62 2c 20 28 76 6f 69  d(p->pBlob, (voi
22f0: 64 20 2a 29 62 75 66 2c 20 6e 52 65 61 64 2c 20  d *)buf, nRead, 
2300: 70 2d 3e 69 53 65 65 6b 29 3b 0a 20 20 69 66 28  p->iSeek);.  if(
2310: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2320: 7b 0a 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65  {.    *errorCode
2330: 50 74 72 20 3d 20 72 63 3b 0a 20 20 20 20 72 65  Ptr = rc;.    re
2340: 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20  turn -1;.  }..  
2350: 70 2d 3e 69 53 65 65 6b 20 2b 3d 20 6e 52 65 61  p->iSeek += nRea
2360: 64 3b 0a 20 20 72 65 74 75 72 6e 20 6e 52 65 61  d;.  return nRea
2370: 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  d;.}../*.** Writ
2380: 65 20 64 61 74 61 20 74 6f 20 61 6e 20 69 6e 63  e data to an inc
2390: 72 65 6d 65 6e 74 61 6c 20 62 6c 6f 62 20 63 68  remental blob ch
23a0: 61 6e 6e 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63  annel..*/.static
23b0: 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41   int SQLITE_TCLA
23c0: 50 49 20 69 6e 63 72 62 6c 6f 62 4f 75 74 70 75  PI incrblobOutpu
23d0: 74 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20  t(.  ClientData 
23e0: 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 0a 20 20  instanceData,.  
23f0: 43 4f 4e 53 54 20 63 68 61 72 20 2a 62 75 66 2c  CONST char *buf,
2400: 0a 20 20 69 6e 74 20 74 6f 57 72 69 74 65 2c 0a  .  int toWrite,.
2410: 20 20 69 6e 74 20 2a 65 72 72 6f 72 43 6f 64 65    int *errorCode
2420: 50 74 72 0a 29 7b 0a 20 20 49 6e 63 72 62 6c 6f  Ptr.){.  Incrblo
2430: 62 43 68 61 6e 6e 65 6c 20 2a 70 20 3d 20 28 49  bChannel *p = (I
2440: 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a  ncrblobChannel *
2450: 29 69 6e 73 74 61 6e 63 65 44 61 74 61 3b 0a 20  )instanceData;. 
2460: 20 69 6e 74 20 6e 57 72 69 74 65 20 3d 20 74 6f   int nWrite = to
2470: 57 72 69 74 65 3b 20 20 20 20 20 20 20 20 2f 2a  Write;        /*
2480: 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
2490: 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a 20 20 69   to write */.  i
24a0: 6e 74 20 6e 42 6c 6f 62 3b 20 20 20 20 20 20 20  nt nBlob;       
24b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
24c0: 6f 74 61 6c 20 73 69 7a 65 20 6f 66 20 74 68 65  otal size of the
24d0: 20 62 6c 6f 62 20 2a 2f 0a 20 20 69 6e 74 20 72   blob */.  int r
24e0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
24f0: 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74          /* sqlit
2500: 65 20 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a  e error code */.
2510: 0a 20 20 6e 42 6c 6f 62 20 3d 20 73 71 6c 69 74  .  nBlob = sqlit
2520: 65 33 5f 62 6c 6f 62 5f 62 79 74 65 73 28 70 2d  e3_blob_bytes(p-
2530: 3e 70 42 6c 6f 62 29 3b 0a 20 20 69 66 28 20 28  >pBlob);.  if( (
2540: 70 2d 3e 69 53 65 65 6b 2b 6e 57 72 69 74 65 29  p->iSeek+nWrite)
2550: 3e 6e 42 6c 6f 62 20 29 7b 0a 20 20 20 20 2a 65  >nBlob ){.    *e
2560: 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 49  rrorCodePtr = EI
2570: 4e 56 41 4c 3b 0a 20 20 20 20 72 65 74 75 72 6e  NVAL;.    return
2580: 20 2d 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e   -1;.  }.  if( n
2590: 57 72 69 74 65 3c 3d 30 20 29 7b 0a 20 20 20 20  Write<=0 ){.    
25a0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20  return 0;.  }.. 
25b0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c   rc = sqlite3_bl
25c0: 6f 62 5f 77 72 69 74 65 28 70 2d 3e 70 42 6c 6f  ob_write(p->pBlo
25d0: 62 2c 20 28 76 6f 69 64 20 2a 29 62 75 66 2c 20  b, (void *)buf, 
25e0: 6e 57 72 69 74 65 2c 20 70 2d 3e 69 53 65 65 6b  nWrite, p->iSeek
25f0: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
2600: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 65  ITE_OK ){.    *e
2610: 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 49  rrorCodePtr = EI
2620: 4f 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 2d 31  O;.    return -1
2630: 3b 0a 20 20 7d 0a 0a 20 20 70 2d 3e 69 53 65 65  ;.  }..  p->iSee
2640: 6b 20 2b 3d 20 6e 57 72 69 74 65 3b 0a 20 20 72  k += nWrite;.  r
2650: 65 74 75 72 6e 20 6e 57 72 69 74 65 3b 0a 7d 0a  eturn nWrite;.}.
2660: 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20 61 6e 20 69  ./*.** Seek an i
2670: 6e 63 72 65 6d 65 6e 74 61 6c 20 62 6c 6f 62 20  ncremental blob 
2680: 63 68 61 6e 6e 65 6c 2e 0a 2a 2f 0a 73 74 61 74  channel..*/.stat
2690: 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43  ic int SQLITE_TC
26a0: 4c 41 50 49 20 69 6e 63 72 62 6c 6f 62 53 65 65  LAPI incrblobSee
26b0: 6b 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20  k(.  ClientData 
26c0: 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 0a 20 20  instanceData,.  
26d0: 6c 6f 6e 67 20 6f 66 66 73 65 74 2c 0a 20 20 69  long offset,.  i
26e0: 6e 74 20 73 65 65 6b 4d 6f 64 65 2c 0a 20 20 69  nt seekMode,.  i
26f0: 6e 74 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72  nt *errorCodePtr
2700: 0a 29 7b 0a 20 20 49 6e 63 72 62 6c 6f 62 43 68  .){.  IncrblobCh
2710: 61 6e 6e 65 6c 20 2a 70 20 3d 20 28 49 6e 63 72  annel *p = (Incr
2720: 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 29 69 6e  blobChannel *)in
2730: 73 74 61 6e 63 65 44 61 74 61 3b 0a 0a 20 20 73  stanceData;..  s
2740: 77 69 74 63 68 28 20 73 65 65 6b 4d 6f 64 65 20  witch( seekMode 
2750: 29 7b 0a 20 20 20 20 63 61 73 65 20 53 45 45 4b  ){.    case SEEK
2760: 5f 53 45 54 3a 0a 20 20 20 20 20 20 70 2d 3e 69  _SET:.      p->i
2770: 53 65 65 6b 20 3d 20 6f 66 66 73 65 74 3b 0a 20  Seek = offset;. 
2780: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2790: 63 61 73 65 20 53 45 45 4b 5f 43 55 52 3a 0a 20  case SEEK_CUR:. 
27a0: 20 20 20 20 20 70 2d 3e 69 53 65 65 6b 20 2b 3d       p->iSeek +=
27b0: 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 62   offset;.      b
27c0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
27d0: 45 45 4b 5f 45 4e 44 3a 0a 20 20 20 20 20 20 70  EEK_END:.      p
27e0: 2d 3e 69 53 65 65 6b 20 3d 20 73 71 6c 69 74 65  ->iSeek = sqlite
27f0: 33 5f 62 6c 6f 62 5f 62 79 74 65 73 28 70 2d 3e  3_blob_bytes(p->
2800: 70 42 6c 6f 62 29 20 2b 20 6f 66 66 73 65 74 3b  pBlob) + offset;
2810: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20  .      break;.. 
2820: 20 20 20 64 65 66 61 75 6c 74 3a 20 61 73 73 65     default: asse
2830: 72 74 28 21 22 42 61 64 20 73 65 65 6b 4d 6f 64  rt(!"Bad seekMod
2840: 65 22 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  e");.  }..  retu
2850: 72 6e 20 70 2d 3e 69 53 65 65 6b 3b 0a 7d 0a 0a  rn p->iSeek;.}..
2860: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 53 51 4c  .static void SQL
2870: 49 54 45 5f 54 43 4c 41 50 49 20 69 6e 63 72 62  ITE_TCLAPI incrb
2880: 6c 6f 62 57 61 74 63 68 28 0a 20 20 43 6c 69 65  lobWatch(.  Clie
2890: 6e 74 44 61 74 61 20 69 6e 73 74 61 6e 63 65 44  ntData instanceD
28a0: 61 74 61 2c 0a 20 20 69 6e 74 20 6d 6f 64 65 0a  ata,.  int mode.
28b0: 29 7b 0a 20 20 2f 2a 20 4e 4f 2d 4f 50 20 2a 2f  ){.  /* NO-OP */
28c0: 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  .}.static int SQ
28d0: 4c 49 54 45 5f 54 43 4c 41 50 49 20 69 6e 63 72  LITE_TCLAPI incr
28e0: 62 6c 6f 62 48 61 6e 64 6c 65 28 0a 20 20 43 6c  blobHandle(.  Cl
28f0: 69 65 6e 74 44 61 74 61 20 69 6e 73 74 61 6e 63  ientData instanc
2900: 65 44 61 74 61 2c 0a 20 20 69 6e 74 20 64 69 72  eData,.  int dir
2910: 2c 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 2a  ,.  ClientData *
2920: 68 50 74 72 0a 29 7b 0a 20 20 72 65 74 75 72 6e  hPtr.){.  return
2930: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 73   TCL_ERROR;.}..s
2940: 74 61 74 69 63 20 54 63 6c 5f 43 68 61 6e 6e 65  tatic Tcl_Channe
2950: 6c 54 79 70 65 20 49 6e 63 72 62 6c 6f 62 43 68  lType IncrblobCh
2960: 61 6e 6e 65 6c 54 79 70 65 20 3d 20 7b 0a 20 20  annelType = {.  
2970: 22 69 6e 63 72 62 6c 6f 62 22 2c 20 20 20 20 20  "incrblob",     
2980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2990: 20 20 20 2f 2a 20 74 79 70 65 4e 61 6d 65 20 20     /* typeName  
29a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29b0: 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20             */.  
29c0: 54 43 4c 5f 43 48 41 4e 4e 45 4c 5f 56 45 52 53  TCL_CHANNEL_VERS
29d0: 49 4f 4e 5f 32 2c 20 20 20 20 20 20 20 20 20 20  ION_2,          
29e0: 20 20 20 2f 2a 20 76 65 72 73 69 6f 6e 20 20 20     /* version   
29f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a00: 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20             */.  
2a10: 69 6e 63 72 62 6c 6f 62 43 6c 6f 73 65 2c 20 20  incrblobClose,  
2a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a30: 20 20 20 2f 2a 20 63 6c 6f 73 65 50 72 6f 63 20     /* closeProc 
2a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a50: 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20             */.  
2a60: 69 6e 63 72 62 6c 6f 62 49 6e 70 75 74 2c 20 20  incrblobInput,  
2a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a80: 20 20 20 2f 2a 20 69 6e 70 75 74 50 72 6f 63 20     /* inputProc 
2a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aa0: 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20             */.  
2ab0: 69 6e 63 72 62 6c 6f 62 4f 75 74 70 75 74 2c 20  incrblobOutput, 
2ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ad0: 20 20 20 2f 2a 20 6f 75 74 70 75 74 50 72 6f 63     /* outputProc
2ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2af0: 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20             */.  
2b00: 69 6e 63 72 62 6c 6f 62 53 65 65 6b 2c 20 20 20  incrblobSeek,   
2b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b20: 20 20 20 2f 2a 20 73 65 65 6b 50 72 6f 63 20 20     /* seekProc  
2b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b40: 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20             */.  
2b50: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
2b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b70: 20 20 20 2f 2a 20 73 65 74 4f 70 74 69 6f 6e 50     /* setOptionP
2b80: 72 6f 63 20 20 20 20 20 20 20 20 20 20 20 20 20  roc             
2b90: 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20             */.  
2ba0: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
2bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bc0: 20 20 20 2f 2a 20 67 65 74 4f 70 74 69 6f 6e 50     /* getOptionP
2bd0: 72 6f 63 20 20 20 20 20 20 20 20 20 20 20 20 20  roc             
2be0: 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20             */.  
2bf0: 69 6e 63 72 62 6c 6f 62 57 61 74 63 68 2c 20 20  incrblobWatch,  
2c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c10: 20 20 20 2f 2a 20 77 61 74 63 68 50 72 6f 63 20     /* watchProc 
2c20: 28 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70  (this is a no-op
2c30: 29 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  )          */.  
2c40: 69 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 2c 20  incrblobHandle, 
2c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c60: 20 20 20 2f 2a 20 67 65 74 48 61 6e 64 6c 65 50     /* getHandleP
2c70: 72 6f 63 20 28 61 6c 77 61 79 73 20 72 65 74 75  roc (always retu
2c80: 72 6e 73 20 65 72 72 6f 72 29 20 2a 2f 0a 20 20  rns error) */.  
2c90: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
2ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cb0: 20 20 20 2f 2a 20 63 6c 6f 73 65 32 50 72 6f 63     /* close2Proc
2cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cd0: 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20             */.  
2ce0: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
2cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d00: 20 20 20 2f 2a 20 62 6c 6f 63 6b 4d 6f 64 65 50     /* blockModeP
2d10: 72 6f 63 20 20 20 20 20 20 20 20 20 20 20 20 20  roc             
2d20: 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20             */.  
2d30: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
2d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d50: 20 20 20 2f 2a 20 66 6c 75 73 68 50 72 6f 63 20     /* flushProc 
2d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d70: 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20             */.  
2d80: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
2d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2da0: 20 20 20 2f 2a 20 68 61 6e 64 6c 65 72 50 72 6f     /* handlerPro
2db0: 63 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c               
2dc0: 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20             */.  
2dd0: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
2de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2df0: 20 20 20 2f 2a 20 77 69 64 65 53 65 65 6b 50 72     /* wideSeekPr
2e00: 6f 63 20 20 20 20 20 20 20 20 20 20 20 20 20 20  oc              
2e10: 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 7d 3b             */.};
2e20: 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
2e30: 20 6e 65 77 20 69 6e 63 72 62 6c 6f 62 20 63 68   new incrblob ch
2e40: 61 6e 6e 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63  annel..*/.static
2e50: 20 69 6e 74 20 63 72 65 61 74 65 49 6e 63 72 62   int createIncrb
2e60: 6c 6f 62 43 68 61 6e 6e 65 6c 28 0a 20 20 54 63  lobChannel(.  Tc
2e70: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
2e80: 2c 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44  ,.  SqliteDb *pD
2e90: 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  b,.  const char 
2ea0: 2a 7a 44 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68  *zDb,.  const ch
2eb0: 61 72 20 2a 7a 54 61 62 6c 65 2c 0a 20 20 63 6f  ar *zTable,.  co
2ec0: 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 75 6d  nst char *zColum
2ed0: 6e 2c 0a 20 20 73 71 6c 69 74 65 5f 69 6e 74 36  n,.  sqlite_int6
2ee0: 34 20 69 52 6f 77 2c 0a 20 20 69 6e 74 20 69 73  4 iRow,.  int is
2ef0: 52 65 61 64 6f 6e 6c 79 0a 29 7b 0a 20 20 49 6e  Readonly.){.  In
2f00: 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 70  crblobChannel *p
2f10: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
2f20: 3d 20 70 44 62 2d 3e 64 62 3b 0a 20 20 73 71 6c  = pDb->db;.  sql
2f30: 69 74 65 33 5f 62 6c 6f 62 20 2a 70 42 6c 6f 62  ite3_blob *pBlob
2f40: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e  ;.  int rc;.  in
2f50: 74 20 66 6c 61 67 73 20 3d 20 54 43 4c 5f 52 45  t flags = TCL_RE
2f60: 41 44 41 42 4c 45 7c 28 69 73 52 65 61 64 6f 6e  ADABLE|(isReadon
2f70: 6c 79 20 3f 20 30 20 3a 20 54 43 4c 5f 57 52 49  ly ? 0 : TCL_WRI
2f80: 54 41 42 4c 45 29 3b 0a 0a 20 20 2f 2a 20 54 68  TABLE);..  /* Th
2f90: 69 73 20 76 61 72 69 61 62 6c 65 20 69 73 20 75  is variable is u
2fa0: 73 65 64 20 74 6f 20 6e 61 6d 65 20 74 68 65 20  sed to name the 
2fb0: 63 68 61 6e 6e 65 6c 73 3a 20 22 69 6e 63 72 62  channels: "incrb
2fc0: 6c 6f 62 5f 5b 69 6e 63 72 20 63 6f 75 6e 74 5d  lob_[incr count]
2fd0: 22 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 69 6e  " */.  static in
2fe0: 74 20 63 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 63  t count = 0;.  c
2ff0: 68 61 72 20 7a 43 68 61 6e 6e 65 6c 5b 36 34 5d  har zChannel[64]
3000: 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
3010: 33 5f 62 6c 6f 62 5f 6f 70 65 6e 28 64 62 2c 20  3_blob_open(db, 
3020: 7a 44 62 2c 20 7a 54 61 62 6c 65 2c 20 7a 43 6f  zDb, zTable, zCo
3030: 6c 75 6d 6e 2c 20 69 52 6f 77 2c 20 21 69 73 52  lumn, iRow, !isR
3040: 65 61 64 6f 6e 6c 79 2c 20 26 70 42 6c 6f 62 29  eadonly, &pBlob)
3050: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
3060: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c  TE_OK ){.    Tcl
3070: 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
3080: 70 2c 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74  p, (char *)sqlit
3090: 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64  e3_errmsg(pDb->d
30a0: 62 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45  b), TCL_VOLATILE
30b0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
30c0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
30d0: 70 20 3d 20 28 49 6e 63 72 62 6c 6f 62 43 68 61  p = (IncrblobCha
30e0: 6e 6e 65 6c 20 2a 29 54 63 6c 5f 41 6c 6c 6f 63  nnel *)Tcl_Alloc
30f0: 28 73 69 7a 65 6f 66 28 49 6e 63 72 62 6c 6f 62  (sizeof(Incrblob
3100: 43 68 61 6e 6e 65 6c 29 29 3b 0a 20 20 70 2d 3e  Channel));.  p->
3110: 69 53 65 65 6b 20 3d 20 30 3b 0a 20 20 70 2d 3e  iSeek = 0;.  p->
3120: 70 42 6c 6f 62 20 3d 20 70 42 6c 6f 62 3b 0a 0a  pBlob = pBlob;..
3130: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
3140: 74 66 28 73 69 7a 65 6f 66 28 7a 43 68 61 6e 6e  tf(sizeof(zChann
3150: 65 6c 29 2c 20 7a 43 68 61 6e 6e 65 6c 2c 20 22  el), zChannel, "
3160: 69 6e 63 72 62 6c 6f 62 5f 25 64 22 2c 20 2b 2b  incrblob_%d", ++
3170: 63 6f 75 6e 74 29 3b 0a 20 20 70 2d 3e 63 68 61  count);.  p->cha
3180: 6e 6e 65 6c 20 3d 20 54 63 6c 5f 43 72 65 61 74  nnel = Tcl_Creat
3190: 65 43 68 61 6e 6e 65 6c 28 26 49 6e 63 72 62 6c  eChannel(&Incrbl
31a0: 6f 62 43 68 61 6e 6e 65 6c 54 79 70 65 2c 20 7a  obChannelType, z
31b0: 43 68 61 6e 6e 65 6c 2c 20 70 2c 20 66 6c 61 67  Channel, p, flag
31c0: 73 29 3b 0a 20 20 54 63 6c 5f 52 65 67 69 73 74  s);.  Tcl_Regist
31d0: 65 72 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70  erChannel(interp
31e0: 2c 20 70 2d 3e 63 68 61 6e 6e 65 6c 29 3b 0a 0a  , p->channel);..
31f0: 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 6e 65    /* Link the ne
3200: 77 20 63 68 61 6e 6e 65 6c 20 69 6e 74 6f 20 74  w channel into t
3210: 68 65 20 53 71 6c 69 74 65 44 62 2e 70 49 6e 63  he SqliteDb.pInc
3220: 72 62 6c 6f 62 20 6c 69 73 74 2e 20 2a 2f 0a 20  rblob list. */. 
3230: 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 44 62 2d   p->pNext = pDb-
3240: 3e 70 49 6e 63 72 62 6c 6f 62 3b 0a 20 20 70 2d  >pIncrblob;.  p-
3250: 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 69 66  >pPrev = 0;.  if
3260: 28 20 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20  ( p->pNext ){.  
3270: 20 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65    p->pNext->pPre
3280: 76 20 3d 20 70 3b 0a 20 20 7d 0a 20 20 70 44 62  v = p;.  }.  pDb
3290: 2d 3e 70 49 6e 63 72 62 6c 6f 62 20 3d 20 70 3b  ->pIncrblob = p;
32a0: 0a 20 20 70 2d 3e 70 44 62 20 3d 20 70 44 62 3b  .  p->pDb = pDb;
32b0: 0a 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c  ..  Tcl_SetResul
32c0: 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20  t(interp, (char 
32d0: 2a 29 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c  *)Tcl_GetChannel
32e0: 4e 61 6d 65 28 70 2d 3e 63 68 61 6e 6e 65 6c 29  Name(p->channel)
32f0: 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b  , TCL_VOLATILE);
3300: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
3310: 3b 0a 7d 0a 23 65 6c 73 65 20 20 2f 2a 20 65 6c  ;.}.#else  /* el
3320: 73 65 20 63 6c 61 75 73 65 20 66 6f 72 20 22 23  se clause for "#
3330: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
3340: 49 54 5f 49 4e 43 52 42 4c 4f 42 22 20 2a 2f 0a  IT_INCRBLOB" */.
3350: 20 20 23 64 65 66 69 6e 65 20 63 6c 6f 73 65 49    #define closeI
3360: 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 73 28  ncrblobChannels(
3370: 70 44 62 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  pDb).#endif../*.
3380: 2a 2a 20 4c 6f 6f 6b 20 61 74 20 74 68 65 20 73  ** Look at the s
3390: 63 72 69 70 74 20 70 72 65 66 69 78 20 69 6e 20  cript prefix in 
33a0: 70 43 6d 64 2e 20 20 57 65 20 77 69 6c 6c 20 62  pCmd.  We will b
33b0: 65 20 65 78 65 63 75 74 69 6e 67 20 74 68 69 73  e executing this
33c0: 20 73 63 72 69 70 74 0a 2a 2a 20 61 66 74 65 72   script.** after
33d0: 20 66 69 72 73 74 20 61 70 70 65 6e 64 69 6e 67   first appending
33e0: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 61 72 67   one or more arg
33f0: 75 6d 65 6e 74 73 2e 20 20 54 68 69 73 20 72 6f  uments.  This ro
3400: 75 74 69 6e 65 20 61 6e 61 6c 79 7a 65 73 0a 2a  utine analyzes.*
3410: 2a 20 74 68 65 20 73 63 72 69 70 74 20 74 6f 20  * the script to 
3420: 73 65 65 20 69 66 20 69 74 20 69 73 20 73 61 66  see if it is saf
3430: 65 20 74 6f 20 75 73 65 20 54 63 6c 5f 45 76 61  e to use Tcl_Eva
3440: 6c 4f 62 6a 76 28 29 20 6f 6e 20 74 68 65 20 73  lObjv() on the s
3450: 63 72 69 70 74 0a 2a 2a 20 72 61 74 68 65 72 20  cript.** rather 
3460: 74 68 61 6e 20 74 68 65 20 6d 6f 72 65 20 67 65  than the more ge
3470: 6e 65 72 61 6c 20 54 63 6c 5f 45 76 61 6c 45 78  neral Tcl_EvalEx
3480: 28 29 2e 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a  ().  Tcl_EvalObj
3490: 76 28 29 20 69 73 20 6d 75 63 68 0a 2a 2a 20 66  v() is much.** f
34a0: 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 53 63 72  aster..**.** Scr
34b0: 69 70 74 73 20 74 68 61 74 20 61 72 65 20 73 61  ipts that are sa
34c0: 66 65 20 74 6f 20 75 73 65 20 77 69 74 68 20 54  fe to use with T
34d0: 63 6c 5f 45 76 61 6c 4f 62 6a 76 28 29 20 63 6f  cl_EvalObjv() co
34e0: 6e 73 69 73 74 73 20 6f 66 20 61 0a 2a 2a 20 63  nsists of a.** c
34f0: 6f 6d 6d 61 6e 64 20 6e 61 6d 65 20 66 6f 6c 6c  ommand name foll
3500: 6f 77 65 64 20 62 79 20 7a 65 72 6f 20 6f 72 20  owed by zero or 
3510: 6d 6f 72 65 20 61 72 67 75 6d 65 6e 74 73 20 77  more arguments w
3520: 69 74 68 20 6e 6f 20 5b 2e 2e 2e 5d 20 6f 72 20  ith no [...] or 
3530: 24 0a 2a 2a 20 6f 72 20 7b 2e 2e 2e 7d 20 6f 72  $.** or {...} or
3540: 20 3b 20 74 6f 20 62 65 20 73 65 65 6e 20 61 6e   ; to be seen an
3550: 79 77 68 65 72 65 2e 20 20 4d 6f 73 74 20 63 61  ywhere.  Most ca
3560: 6c 6c 62 61 63 6b 20 73 63 72 69 70 74 73 20 63  llback scripts c
3570: 6f 6e 73 69 73 74 0a 2a 2a 20 6f 66 20 6a 75 73  onsist.** of jus
3580: 74 20 61 20 73 69 6e 67 6c 65 20 70 72 6f 63 65  t a single proce
3590: 64 75 72 65 20 6e 61 6d 65 20 61 6e 64 20 74 68  dure name and th
35a0: 65 79 20 6d 65 65 74 20 74 68 69 73 20 72 65 71  ey meet this req
35b0: 75 69 72 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61  uirement..*/.sta
35c0: 74 69 63 20 69 6e 74 20 73 61 66 65 54 6f 55 73  tic int safeToUs
35d0: 65 45 76 61 6c 4f 62 6a 76 28 54 63 6c 5f 49 6e  eEvalObjv(Tcl_In
35e0: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 54 63  terp *interp, Tc
35f0: 6c 5f 4f 62 6a 20 2a 70 43 6d 64 29 7b 0a 20 20  l_Obj *pCmd){.  
3600: 2f 2a 20 57 65 20 63 6f 75 6c 64 20 74 72 79 20  /* We could try 
3610: 74 6f 20 64 6f 20 73 6f 6d 65 74 68 69 6e 67 20  to do something 
3620: 77 69 74 68 20 54 63 6c 5f 50 61 72 73 65 28 29  with Tcl_Parse()
3630: 2e 20 20 42 75 74 20 77 65 20 77 69 6c 6c 20 69  .  But we will i
3640: 6e 73 74 65 61 64 0a 20 20 2a 2a 20 6a 75 73 74  nstead.  ** just
3650: 20 64 6f 20 61 20 73 65 61 72 63 68 20 66 6f 72   do a search for
3660: 20 66 6f 72 62 69 64 64 65 6e 20 63 68 61 72 61   forbidden chara
3670: 63 74 65 72 73 2e 20 20 49 66 20 61 6e 79 20 6f  cters.  If any o
3680: 66 20 74 68 65 20 66 6f 72 62 69 64 64 65 6e 0a  f the forbidden.
3690: 20 20 2a 2a 20 63 68 61 72 61 63 74 65 72 73 20    ** characters 
36a0: 61 70 70 65 61 72 20 69 6e 20 70 43 6d 64 2c 20  appear in pCmd, 
36b0: 77 65 20 77 69 6c 6c 20 72 65 70 6f 72 74 20 74  we will report t
36c0: 68 65 20 73 74 72 69 6e 67 20 61 73 20 75 6e 73  he string as uns
36d0: 61 66 65 2e 0a 20 20 2a 2f 0a 20 20 63 6f 6e 73  afe..  */.  cons
36e0: 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 6e 74  t char *z;.  int
36f0: 20 6e 3b 0a 20 20 7a 20 3d 20 54 63 6c 5f 47 65   n;.  z = Tcl_Ge
3700: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 70  tStringFromObj(p
3710: 43 6d 64 2c 20 26 6e 29 3b 0a 20 20 77 68 69 6c  Cmd, &n);.  whil
3720: 65 28 20 6e 2d 2d 20 3e 20 30 20 29 7b 0a 20 20  e( n-- > 0 ){.  
3730: 20 20 69 6e 74 20 63 20 3d 20 2a 28 7a 2b 2b 29    int c = *(z++)
3740: 3b 0a 20 20 20 20 69 66 28 20 63 3d 3d 27 24 27  ;.    if( c=='$'
3750: 20 7c 7c 20 63 3d 3d 27 5b 27 20 7c 7c 20 63 3d   || c=='[' || c=
3760: 3d 27 3b 27 20 29 20 72 65 74 75 72 6e 20 30 3b  =';' ) return 0;
3770: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b  .  }.  return 1;
3780: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61  .}../*.** Find a
3790: 6e 20 53 71 6c 46 75 6e 63 20 73 74 72 75 63 74  n SqlFunc struct
37a0: 75 72 65 20 77 69 74 68 20 74 68 65 20 67 69 76  ure with the giv
37b0: 65 6e 20 6e 61 6d 65 2e 20 20 4f 72 20 63 72 65  en name.  Or cre
37c0: 61 74 65 20 61 20 6e 65 77 0a 2a 2a 20 6f 6e 65  ate a new.** one
37d0: 20 69 66 20 61 6e 20 65 78 69 73 74 69 6e 67 20   if an existing 
37e0: 6f 6e 65 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f  one cannot be fo
37f0: 75 6e 64 2e 20 20 52 65 74 75 72 6e 20 61 20 70  und.  Return a p
3800: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 0a 2a 2a  ointer to the.**
3810: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73   structure..*/.s
3820: 74 61 74 69 63 20 53 71 6c 46 75 6e 63 20 2a 66  tatic SqlFunc *f
3830: 69 6e 64 53 71 6c 46 75 6e 63 28 53 71 6c 69 74  indSqlFunc(Sqlit
3840: 65 44 62 20 2a 70 44 62 2c 20 63 6f 6e 73 74 20  eDb *pDb, const 
3850: 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20  char *zName){.  
3860: 53 71 6c 46 75 6e 63 20 2a 70 2c 20 2a 70 4e 65  SqlFunc *p, *pNe
3870: 77 3b 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 20 3d  w;.  int nName =
3880: 20 73 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29   strlen30(zName)
3890: 3b 0a 20 20 70 4e 65 77 20 3d 20 28 53 71 6c 46  ;.  pNew = (SqlF
38a0: 75 6e 63 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28 20  unc*)Tcl_Alloc( 
38b0: 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 2b 20  sizeof(*pNew) + 
38c0: 6e 4e 61 6d 65 20 2b 20 31 20 29 3b 0a 20 20 70  nName + 1 );.  p
38d0: 4e 65 77 2d 3e 7a 4e 61 6d 65 20 3d 20 28 63 68  New->zName = (ch
38e0: 61 72 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a 20 20  ar*)&pNew[1];.  
38f0: 6d 65 6d 63 70 79 28 70 4e 65 77 2d 3e 7a 4e 61  memcpy(pNew->zNa
3900: 6d 65 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65  me, zName, nName
3910: 2b 31 29 3b 0a 20 20 66 6f 72 28 70 3d 70 44 62  +1);.  for(p=pDb
3920: 2d 3e 70 46 75 6e 63 3b 20 70 3b 20 70 3d 70 2d  ->pFunc; p; p=p-
3930: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  >pNext){.    if(
3940: 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70   sqlite3_stricmp
3950: 28 70 2d 3e 7a 4e 61 6d 65 2c 20 70 4e 65 77 2d  (p->zName, pNew-
3960: 3e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20  >zName)==0 ){.  
3970: 20 20 20 20 54 63 6c 5f 46 72 65 65 28 28 63 68      Tcl_Free((ch
3980: 61 72 2a 29 70 4e 65 77 29 3b 0a 20 20 20 20 20  ar*)pNew);.     
3990: 20 72 65 74 75 72 6e 20 70 3b 0a 20 20 20 20 7d   return p;.    }
39a0: 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 69 6e 74  .  }.  pNew->int
39b0: 65 72 70 20 3d 20 70 44 62 2d 3e 69 6e 74 65 72  erp = pDb->inter
39c0: 70 3b 0a 20 20 70 4e 65 77 2d 3e 70 44 62 20 3d  p;.  pNew->pDb =
39d0: 20 70 44 62 3b 0a 20 20 70 4e 65 77 2d 3e 70 53   pDb;.  pNew->pS
39e0: 63 72 69 70 74 20 3d 20 30 3b 0a 20 20 70 4e 65  cript = 0;.  pNe
39f0: 77 2d 3e 70 4e 65 78 74 20 3d 20 70 44 62 2d 3e  w->pNext = pDb->
3a00: 70 46 75 6e 63 3b 0a 20 20 70 44 62 2d 3e 70 46  pFunc;.  pDb->pF
3a10: 75 6e 63 20 3d 20 70 4e 65 77 3b 0a 20 20 72 65  unc = pNew;.  re
3a20: 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a  turn pNew;.}../*
3a30: 0a 2a 2a 20 46 72 65 65 20 61 20 73 69 6e 67 6c  .** Free a singl
3a40: 65 20 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d  e SqlPreparedStm
3a50: 74 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61  t object..*/.sta
3a60: 74 69 63 20 76 6f 69 64 20 64 62 46 72 65 65 53  tic void dbFreeS
3a70: 74 6d 74 28 53 71 6c 50 72 65 70 61 72 65 64 53  tmt(SqlPreparedS
3a80: 74 6d 74 20 2a 70 53 74 6d 74 29 7b 0a 23 69 66  tmt *pStmt){.#if
3a90: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
3aa0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 71    if( sqlite3_sq
3ab0: 6c 28 70 53 74 6d 74 2d 3e 70 53 74 6d 74 29 3d  l(pStmt->pStmt)=
3ac0: 3d 30 20 29 7b 0a 20 20 20 20 54 63 6c 5f 46 72  =0 ){.    Tcl_Fr
3ad0: 65 65 28 28 63 68 61 72 20 2a 29 70 53 74 6d 74  ee((char *)pStmt
3ae0: 2d 3e 7a 53 71 6c 29 3b 0a 20 20 7d 0a 23 65 6e  ->zSql);.  }.#en
3af0: 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  dif.  sqlite3_fi
3b00: 6e 61 6c 69 7a 65 28 70 53 74 6d 74 2d 3e 70 53  nalize(pStmt->pS
3b10: 74 6d 74 29 3b 0a 20 20 54 63 6c 5f 46 72 65 65  tmt);.  Tcl_Free
3b20: 28 28 63 68 61 72 20 2a 29 70 53 74 6d 74 29 3b  ((char *)pStmt);
3b30: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 61 6c 69  .}../*.** Finali
3b40: 7a 65 20 61 6e 64 20 66 72 65 65 20 61 20 6c 69  ze and free a li
3b50: 73 74 20 6f 66 20 70 72 65 70 61 72 65 64 20 73  st of prepared s
3b60: 74 61 74 65 6d 65 6e 74 73 0a 2a 2f 0a 73 74 61  tatements.*/.sta
3b70: 74 69 63 20 76 6f 69 64 20 66 6c 75 73 68 53 74  tic void flushSt
3b80: 6d 74 43 61 63 68 65 28 53 71 6c 69 74 65 44 62  mtCache(SqliteDb
3b90: 20 2a 70 44 62 29 7b 0a 20 20 53 71 6c 50 72 65   *pDb){.  SqlPre
3ba0: 70 61 72 65 64 53 74 6d 74 20 2a 70 50 72 65 53  paredStmt *pPreS
3bb0: 74 6d 74 3b 0a 20 20 53 71 6c 50 72 65 70 61 72  tmt;.  SqlPrepar
3bc0: 65 64 53 74 6d 74 20 2a 70 4e 65 78 74 3b 0a 0a  edStmt *pNext;..
3bd0: 20 20 66 6f 72 28 70 50 72 65 53 74 6d 74 20 3d    for(pPreStmt =
3be0: 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74 3b 20   pDb->stmtList; 
3bf0: 70 50 72 65 53 74 6d 74 3b 20 70 50 72 65 53 74  pPreStmt; pPreSt
3c00: 6d 74 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70  mt=pNext){.    p
3c10: 4e 65 78 74 20 3d 20 70 50 72 65 53 74 6d 74 2d  Next = pPreStmt-
3c20: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 64 62 46 72  >pNext;.    dbFr
3c30: 65 65 53 74 6d 74 28 70 50 72 65 53 74 6d 74 29  eeStmt(pPreStmt)
3c40: 3b 0a 20 20 7d 0a 20 20 70 44 62 2d 3e 6e 53 74  ;.  }.  pDb->nSt
3c50: 6d 74 20 3d 20 30 3b 0a 20 20 70 44 62 2d 3e 73  mt = 0;.  pDb->s
3c60: 74 6d 74 4c 61 73 74 20 3d 20 30 3b 0a 20 20 70  tmtLast = 0;.  p
3c70: 44 62 2d 3e 73 74 6d 74 4c 69 73 74 20 3d 20 30  Db->stmtList = 0
3c80: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 43 4c 20 63  ;.}../*.** TCL c
3c90: 61 6c 6c 73 20 74 68 69 73 20 70 72 6f 63 65 64  alls this proced
3ca0: 75 72 65 20 77 68 65 6e 20 61 6e 20 73 71 6c 69  ure when an sqli
3cb0: 74 65 33 20 64 61 74 61 62 61 73 65 20 63 6f 6d  te3 database com
3cc0: 6d 61 6e 64 20 69 73 0a 2a 2a 20 64 65 6c 65 74  mand is.** delet
3cd0: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
3ce0: 69 64 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49  id SQLITE_TCLAPI
3cf0: 20 44 62 44 65 6c 65 74 65 43 6d 64 28 76 6f 69   DbDeleteCmd(voi
3d00: 64 20 2a 64 62 29 7b 0a 20 20 53 71 6c 69 74 65  d *db){.  Sqlite
3d10: 44 62 20 2a 70 44 62 20 3d 20 28 53 71 6c 69 74  Db *pDb = (Sqlit
3d20: 65 44 62 2a 29 64 62 3b 0a 20 20 66 6c 75 73 68  eDb*)db;.  flush
3d30: 53 74 6d 74 43 61 63 68 65 28 70 44 62 29 3b 0a  StmtCache(pDb);.
3d40: 20 20 63 6c 6f 73 65 49 6e 63 72 62 6c 6f 62 43    closeIncrblobC
3d50: 68 61 6e 6e 65 6c 73 28 70 44 62 29 3b 0a 20 20  hannels(pDb);.  
3d60: 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70 44  sqlite3_close(pD
3d70: 62 2d 3e 64 62 29 3b 0a 20 20 77 68 69 6c 65 28  b->db);.  while(
3d80: 20 70 44 62 2d 3e 70 46 75 6e 63 20 29 7b 0a 20   pDb->pFunc ){. 
3d90: 20 20 20 53 71 6c 46 75 6e 63 20 2a 70 46 75 6e     SqlFunc *pFun
3da0: 63 20 3d 20 70 44 62 2d 3e 70 46 75 6e 63 3b 0a  c = pDb->pFunc;.
3db0: 20 20 20 20 70 44 62 2d 3e 70 46 75 6e 63 20 3d      pDb->pFunc =
3dc0: 20 70 46 75 6e 63 2d 3e 70 4e 65 78 74 3b 0a 20   pFunc->pNext;. 
3dd0: 20 20 20 61 73 73 65 72 74 28 20 70 46 75 6e 63     assert( pFunc
3de0: 2d 3e 70 44 62 3d 3d 70 44 62 20 29 3b 0a 20 20  ->pDb==pDb );.  
3df0: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
3e00: 6e 74 28 70 46 75 6e 63 2d 3e 70 53 63 72 69 70  nt(pFunc->pScrip
3e10: 74 29 3b 0a 20 20 20 20 54 63 6c 5f 46 72 65 65  t);.    Tcl_Free
3e20: 28 28 63 68 61 72 2a 29 70 46 75 6e 63 29 3b 0a  ((char*)pFunc);.
3e30: 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 70 44 62    }.  while( pDb
3e40: 2d 3e 70 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20  ->pCollate ){.  
3e50: 20 20 53 71 6c 43 6f 6c 6c 61 74 65 20 2a 70 43    SqlCollate *pC
3e60: 6f 6c 6c 61 74 65 20 3d 20 70 44 62 2d 3e 70 43  ollate = pDb->pC
3e70: 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 70 44 62 2d  ollate;.    pDb-
3e80: 3e 70 43 6f 6c 6c 61 74 65 20 3d 20 70 43 6f 6c  >pCollate = pCol
3e90: 6c 61 74 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  late->pNext;.   
3ea0: 20 54 63 6c 5f 46 72 65 65 28 28 63 68 61 72 2a   Tcl_Free((char*
3eb0: 29 70 43 6f 6c 6c 61 74 65 29 3b 0a 20 20 7d 0a  )pCollate);.  }.
3ec0: 20 20 69 66 28 20 70 44 62 2d 3e 7a 42 75 73 79    if( pDb->zBusy
3ed0: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 46 72 65 65   ){.    Tcl_Free
3ee0: 28 70 44 62 2d 3e 7a 42 75 73 79 29 3b 0a 20 20  (pDb->zBusy);.  
3ef0: 7d 0a 20 20 69 66 28 20 70 44 62 2d 3e 7a 54 72  }.  if( pDb->zTr
3f00: 61 63 65 20 29 7b 0a 20 20 20 20 54 63 6c 5f 46  ace ){.    Tcl_F
3f10: 72 65 65 28 70 44 62 2d 3e 7a 54 72 61 63 65 29  ree(pDb->zTrace)
3f20: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 62 2d  ;.  }.  if( pDb-
3f30: 3e 7a 54 72 61 63 65 56 32 20 29 7b 0a 20 20 20  >zTraceV2 ){.   
3f40: 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a   Tcl_Free(pDb->z
3f50: 54 72 61 63 65 56 32 29 3b 0a 20 20 7d 0a 20 20  TraceV2);.  }.  
3f60: 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c  if( pDb->zProfil
3f70: 65 20 29 7b 0a 20 20 20 20 54 63 6c 5f 46 72 65  e ){.    Tcl_Fre
3f80: 65 28 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 29  e(pDb->zProfile)
3f90: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 62 2d  ;.  }.  if( pDb-
3fa0: 3e 7a 41 75 74 68 20 29 7b 0a 20 20 20 20 54 63  >zAuth ){.    Tc
3fb0: 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 41 75 74  l_Free(pDb->zAut
3fc0: 68 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44  h);.  }.  if( pD
3fd0: 62 2d 3e 7a 4e 75 6c 6c 20 29 7b 0a 20 20 20 20  b->zNull ){.    
3fe0: 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 4e  Tcl_Free(pDb->zN
3ff0: 75 6c 6c 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ull);.  }.  if( 
4000: 70 44 62 2d 3e 70 55 70 64 61 74 65 48 6f 6f 6b  pDb->pUpdateHook
4010: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72   ){.    Tcl_Decr
4020: 52 65 66 43 6f 75 6e 74 28 70 44 62 2d 3e 70 55  RefCount(pDb->pU
4030: 70 64 61 74 65 48 6f 6f 6b 29 3b 0a 20 20 7d 0a  pdateHook);.  }.
4040: 20 20 69 66 28 20 70 44 62 2d 3e 70 50 72 65 55    if( pDb->pPreU
4050: 70 64 61 74 65 48 6f 6f 6b 20 29 7b 0a 20 20 20  pdateHook ){.   
4060: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
4070: 74 28 70 44 62 2d 3e 70 50 72 65 55 70 64 61 74  t(pDb->pPreUpdat
4080: 65 48 6f 6f 6b 29 3b 0a 20 20 7d 0a 20 20 69 66  eHook);.  }.  if
4090: 28 20 70 44 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b  ( pDb->pRollback
40a0: 48 6f 6f 6b 20 29 7b 0a 20 20 20 20 54 63 6c 5f  Hook ){.    Tcl_
40b0: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 44 62  DecrRefCount(pDb
40c0: 2d 3e 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 29  ->pRollbackHook)
40d0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 62 2d  ;.  }.  if( pDb-
40e0: 3e 70 57 61 6c 48 6f 6f 6b 20 29 7b 0a 20 20 20  >pWalHook ){.   
40f0: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
4100: 74 28 70 44 62 2d 3e 70 57 61 6c 48 6f 6f 6b 29  t(pDb->pWalHook)
4110: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 62 2d  ;.  }.  if( pDb-
4120: 3e 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64 20  >pCollateNeeded 
4130: 29 7b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52  ){.    Tcl_DecrR
4140: 65 66 43 6f 75 6e 74 28 70 44 62 2d 3e 70 43 6f  efCount(pDb->pCo
4150: 6c 6c 61 74 65 4e 65 65 64 65 64 29 3b 0a 20 20  llateNeeded);.  
4160: 7d 0a 20 20 54 63 6c 5f 46 72 65 65 28 28 63 68  }.  Tcl_Free((ch
4170: 61 72 2a 29 70 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a  ar*)pDb);.}../*.
4180: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
4190: 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61  is called when a
41a0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
41b0: 73 20 6c 6f 63 6b 65 64 20 77 68 69 6c 65 20 74  s locked while t
41c0: 72 79 69 6e 67 0a 2a 2a 20 74 6f 20 65 78 65 63  rying.** to exec
41d0: 75 74 65 20 53 51 4c 2e 0a 2a 2f 0a 73 74 61 74  ute SQL..*/.stat
41e0: 69 63 20 69 6e 74 20 44 62 42 75 73 79 48 61 6e  ic int DbBusyHan
41f0: 64 6c 65 72 28 76 6f 69 64 20 2a 63 64 2c 20 69  dler(void *cd, i
4200: 6e 74 20 6e 54 72 69 65 73 29 7b 0a 20 20 53 71  nt nTries){.  Sq
4210: 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53  liteDb *pDb = (S
4220: 71 6c 69 74 65 44 62 2a 29 63 64 3b 0a 20 20 69  qliteDb*)cd;.  i
4230: 6e 74 20 72 63 3b 0a 20 20 63 68 61 72 20 7a 56  nt rc;.  char zV
4240: 61 6c 5b 33 30 5d 3b 0a 0a 20 20 73 71 6c 69 74  al[30];..  sqlit
4250: 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
4260: 6f 66 28 7a 56 61 6c 29 2c 20 7a 56 61 6c 2c 20  of(zVal), zVal, 
4270: 22 25 64 22 2c 20 6e 54 72 69 65 73 29 3b 0a 20  "%d", nTries);. 
4280: 20 72 63 20 3d 20 54 63 6c 5f 56 61 72 45 76 61   rc = Tcl_VarEva
4290: 6c 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20 70  l(pDb->interp, p
42a0: 44 62 2d 3e 7a 42 75 73 79 2c 20 22 20 22 2c 20  Db->zBusy, " ", 
42b0: 7a 56 61 6c 2c 20 28 63 68 61 72 2a 29 30 29 3b  zVal, (char*)0);
42c0: 0a 20 20 69 66 28 20 72 63 21 3d 54 43 4c 5f 4f  .  if( rc!=TCL_O
42d0: 4b 20 7c 7c 20 61 74 6f 69 28 54 63 6c 5f 47 65  K || atoi(Tcl_Ge
42e0: 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28 70 44  tStringResult(pD
42f0: 62 2d 3e 69 6e 74 65 72 70 29 29 20 29 7b 0a 20  b->interp)) ){. 
4300: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
4310: 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a  .  return 1;.}..
4320: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
4330: 4d 49 54 5f 50 52 4f 47 52 45 53 53 5f 43 41 4c  MIT_PROGRESS_CAL
4340: 4c 42 41 43 4b 0a 2f 2a 0a 2a 2a 20 54 68 69 73  LBACK./*.** This
4350: 20 72 6f 75 74 69 6e 65 20 69 73 20 69 6e 76 6f   routine is invo
4360: 6b 65 64 20 61 73 20 74 68 65 20 27 70 72 6f 67  ked as the 'prog
4370: 72 65 73 73 20 63 61 6c 6c 62 61 63 6b 27 20 66  ress callback' f
4380: 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  or the database.
4390: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 44  .*/.static int D
43a0: 62 50 72 6f 67 72 65 73 73 48 61 6e 64 6c 65 72  bProgressHandler
43b0: 28 76 6f 69 64 20 2a 63 64 29 7b 0a 20 20 53 71  (void *cd){.  Sq
43c0: 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53  liteDb *pDb = (S
43d0: 71 6c 69 74 65 44 62 2a 29 63 64 3b 0a 20 20 69  qliteDb*)cd;.  i
43e0: 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
43f0: 28 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73  ( pDb->zProgress
4400: 20 29 3b 0a 20 20 72 63 20 3d 20 54 63 6c 5f 45   );.  rc = Tcl_E
4410: 76 61 6c 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c  val(pDb->interp,
4420: 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 29   pDb->zProgress)
4430: 3b 0a 20 20 69 66 28 20 72 63 21 3d 54 43 4c 5f  ;.  if( rc!=TCL_
4440: 4f 4b 20 7c 7c 20 61 74 6f 69 28 54 63 6c 5f 47  OK || atoi(Tcl_G
4450: 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28 70  etStringResult(p
4460: 44 62 2d 3e 69 6e 74 65 72 70 29 29 20 29 7b 0a  Db->interp)) ){.
4470: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
4480: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
4490: 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66  #endif..#if !def
44a0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
44b0: 5f 54 52 41 43 45 29 20 26 26 20 21 64 65 66 69  _TRACE) && !defi
44c0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
44d0: 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 29 20  FLOATING_POINT) 
44e0: 26 26 20 5c 0a 20 20 20 20 21 64 65 66 69 6e 65  && \.    !define
44f0: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45  d(SQLITE_OMIT_DE
4500: 50 52 45 43 41 54 45 44 29 0a 2f 2a 0a 2a 2a 20  PRECATED)./*.** 
4510: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
4520: 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 53 51  called by the SQ
4530: 4c 69 74 65 20 74 72 61 63 65 20 68 61 6e 64 6c  Lite trace handl
4540: 65 72 20 77 68 65 6e 65 76 65 72 20 61 20 6e 65  er whenever a ne
4550: 77 0a 2a 2a 20 62 6c 6f 63 6b 20 6f 66 20 53 51  w.** block of SQ
4560: 4c 20 69 73 20 65 78 65 63 75 74 65 64 2e 20 20  L is executed.  
4570: 54 68 65 20 54 43 4c 20 73 63 72 69 70 74 20 69  The TCL script i
4580: 6e 20 70 44 62 2d 3e 7a 54 72 61 63 65 20 69 73  n pDb->zTrace is
4590: 20 65 78 65 63 75 74 65 64 2e 0a 2a 2f 0a 73 74   executed..*/.st
45a0: 61 74 69 63 20 76 6f 69 64 20 44 62 54 72 61 63  atic void DbTrac
45b0: 65 48 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a 63  eHandler(void *c
45c0: 64 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  d, const char *z
45d0: 53 71 6c 29 7b 0a 20 20 53 71 6c 69 74 65 44 62  Sql){.  SqliteDb
45e0: 20 2a 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44   *pDb = (SqliteD
45f0: 62 2a 29 63 64 3b 0a 20 20 54 63 6c 5f 44 53 74  b*)cd;.  Tcl_DSt
4600: 72 69 6e 67 20 73 74 72 3b 0a 0a 20 20 54 63 6c  ring str;..  Tcl
4610: 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 73 74  _DStringInit(&st
4620: 72 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e  r);.  Tcl_DStrin
4630: 67 41 70 70 65 6e 64 28 26 73 74 72 2c 20 70 44  gAppend(&str, pD
4640: 62 2d 3e 7a 54 72 61 63 65 2c 20 2d 31 29 3b 0a  b->zTrace, -1);.
4650: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70    Tcl_DStringApp
4660: 65 6e 64 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c  endElement(&str,
4670: 20 7a 53 71 6c 29 3b 0a 20 20 54 63 6c 5f 45 76   zSql);.  Tcl_Ev
4680: 61 6c 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20  al(pDb->interp, 
4690: 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65  Tcl_DStringValue
46a0: 28 26 73 74 72 29 29 3b 0a 20 20 54 63 6c 5f 44  (&str));.  Tcl_D
46b0: 53 74 72 69 6e 67 46 72 65 65 28 26 73 74 72 29  StringFree(&str)
46c0: 3b 0a 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73  ;.  Tcl_ResetRes
46d0: 75 6c 74 28 70 44 62 2d 3e 69 6e 74 65 72 70 29  ult(pDb->interp)
46e0: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  ;.}.#endif..#ifn
46f0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
4700: 54 52 41 43 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73  TRACE./*.** This
4710: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
4720: 65 64 20 62 79 20 74 68 65 20 53 51 4c 69 74 65  ed by the SQLite
4730: 20 74 72 61 63 65 5f 76 32 20 68 61 6e 64 6c 65   trace_v2 handle
4740: 72 20 77 68 65 6e 65 76 65 72 20 61 20 6e 65 77  r whenever a new
4750: 0a 2a 2a 20 73 75 70 70 6f 72 74 65 64 20 65 76  .** supported ev
4760: 65 6e 74 20 69 73 20 67 65 6e 65 72 61 74 65 64  ent is generated
4770: 2e 20 20 55 6e 73 75 70 70 6f 72 74 65 64 20 65  .  Unsupported e
4780: 76 65 6e 74 20 74 79 70 65 73 20 61 72 65 20 69  vent types are i
4790: 67 6e 6f 72 65 64 2e 0a 2a 2a 20 54 68 65 20 54  gnored..** The T
47a0: 43 4c 20 73 63 72 69 70 74 20 69 6e 20 70 44 62  CL script in pDb
47b0: 2d 3e 7a 54 72 61 63 65 56 32 20 69 73 20 65 78  ->zTraceV2 is ex
47c0: 65 63 75 74 65 64 2c 20 77 69 74 68 20 74 68 65  ecuted, with the
47d0: 20 61 72 67 75 6d 65 6e 74 73 20 66 6f 72 0a 2a   arguments for.*
47e0: 2a 20 74 68 65 20 65 76 65 6e 74 20 61 70 70 65  * the event appe
47f0: 6e 64 65 64 20 74 6f 20 69 74 20 28 61 73 20 6c  nded to it (as l
4800: 69 73 74 20 65 6c 65 6d 65 6e 74 73 29 2e 0a 2a  ist elements)..*
4810: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 44 62 54  /.static int DbT
4820: 72 61 63 65 56 32 48 61 6e 64 6c 65 72 28 0a 20  raceV2Handler(. 
4830: 20 75 6e 73 69 67 6e 65 64 20 74 79 70 65 2c 20   unsigned type, 
4840: 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 53 51  /* One of the SQ
4850: 4c 49 54 45 5f 54 52 41 43 45 5f 2a 20 65 76 65  LITE_TRACE_* eve
4860: 6e 74 20 74 79 70 65 73 2e 20 2a 2f 0a 20 20 76  nt types. */.  v
4870: 6f 69 64 20 2a 63 64 2c 20 20 20 20 20 20 2f 2a  oid *cd,      /*
4880: 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 63 6f   The original co
4890: 6e 74 65 78 74 20 64 61 74 61 20 70 6f 69 6e 74  ntext data point
48a0: 65 72 2e 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70  er. */.  void *p
48b0: 64 2c 20 20 20 20 20 20 2f 2a 20 50 72 69 6d 61  d,      /* Prima
48c0: 72 79 20 65 76 65 6e 74 20 64 61 74 61 2c 20 64  ry event data, d
48d0: 65 70 65 6e 64 73 20 6f 6e 20 65 76 65 6e 74 20  epends on event 
48e0: 74 79 70 65 2e 20 2a 2f 0a 20 20 76 6f 69 64 20  type. */.  void 
48f0: 2a 78 64 20 20 20 20 20 20 20 2f 2a 20 45 78 74  *xd       /* Ext
4900: 72 61 20 65 76 65 6e 74 20 64 61 74 61 2c 20 64  ra event data, d
4910: 65 70 65 6e 64 73 20 6f 6e 20 65 76 65 6e 74 20  epends on event 
4920: 74 79 70 65 2e 20 2a 2f 0a 29 7b 0a 20 20 53 71  type. */.){.  Sq
4930: 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53  liteDb *pDb = (S
4940: 71 6c 69 74 65 44 62 2a 29 63 64 3b 0a 20 20 54  qliteDb*)cd;.  T
4950: 63 6c 5f 4f 62 6a 20 2a 70 43 6d 64 3b 0a 0a 20  cl_Obj *pCmd;.. 
4960: 20 73 77 69 74 63 68 28 20 74 79 70 65 20 29 7b   switch( type ){
4970: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
4980: 5f 54 52 41 43 45 5f 53 54 4d 54 3a 20 7b 0a 20  _TRACE_STMT: {. 
4990: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d       sqlite3_stm
49a0: 74 20 2a 70 53 74 6d 74 20 3d 20 28 73 71 6c 69  t *pStmt = (sqli
49b0: 74 65 33 5f 73 74 6d 74 20 2a 29 70 64 3b 0a 20  te3_stmt *)pd;. 
49c0: 20 20 20 20 20 63 68 61 72 20 2a 7a 53 71 6c 20       char *zSql 
49d0: 3d 20 28 63 68 61 72 20 2a 29 78 64 3b 0a 0a 20  = (char *)xd;.. 
49e0: 20 20 20 20 20 70 43 6d 64 20 3d 20 54 63 6c 5f       pCmd = Tcl_
49f0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 44 62  NewStringObj(pDb
4a00: 2d 3e 7a 54 72 61 63 65 56 32 2c 20 2d 31 29 3b  ->zTraceV2, -1);
4a10: 0a 20 20 20 20 20 20 54 63 6c 5f 49 6e 63 72 52  .      Tcl_IncrR
4a20: 65 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20  efCount(pCmd);. 
4a30: 20 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a       Tcl_ListObj
4a40: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 70 44  AppendElement(pD
4a50: 62 2d 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c  b->interp, pCmd,
4a60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
4a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4a80: 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62  Tcl_NewWideIntOb
4a90: 6a 28 28 54 63 6c 5f 57 69 64 65 49 6e 74 29 70  j((Tcl_WideInt)p
4aa0: 53 74 6d 74 29 29 3b 0a 20 20 20 20 20 20 54 63  Stmt));.      Tc
4ab0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
4ac0: 6c 65 6d 65 6e 74 28 70 44 62 2d 3e 69 6e 74 65  lement(pDb->inte
4ad0: 72 70 2c 20 70 43 6d 64 2c 0a 20 20 20 20 20 20  rp, pCmd,.      
4ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4af0: 20 20 20 20 20 20 20 20 20 54 63 6c 5f 4e 65 77           Tcl_New
4b00: 53 74 72 69 6e 67 4f 62 6a 28 7a 53 71 6c 2c 20  StringObj(zSql, 
4b10: 2d 31 29 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f  -1));.      Tcl_
4b20: 45 76 61 6c 4f 62 6a 45 78 28 70 44 62 2d 3e 69  EvalObjEx(pDb->i
4b30: 6e 74 65 72 70 2c 20 70 43 6d 64 2c 20 54 43 4c  nterp, pCmd, TCL
4b40: 5f 45 56 41 4c 5f 44 49 52 45 43 54 29 3b 0a 20  _EVAL_DIRECT);. 
4b50: 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66       Tcl_DecrRef
4b60: 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20 20  Count(pCmd);.   
4b70: 20 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73 75     Tcl_ResetResu
4b80: 6c 74 28 70 44 62 2d 3e 69 6e 74 65 72 70 29 3b  lt(pDb->interp);
4b90: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
4ba0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
4bb0: 49 54 45 5f 54 52 41 43 45 5f 50 52 4f 46 49 4c  ITE_TRACE_PROFIL
4bc0: 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  E: {.      sqlit
4bd0: 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d  e3_stmt *pStmt =
4be0: 20 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a   (sqlite3_stmt *
4bf0: 29 70 64 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  )pd;.      sqlit
4c00: 65 33 5f 69 6e 74 36 34 20 6e 73 20 3d 20 28 73  e3_int64 ns = (s
4c10: 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 78 64 3b  qlite3_int64)xd;
4c20: 0a 0a 20 20 20 20 20 20 70 43 6d 64 20 3d 20 54  ..      pCmd = T
4c30: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
4c40: 70 44 62 2d 3e 7a 54 72 61 63 65 56 32 2c 20 2d  pDb->zTraceV2, -
4c50: 31 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 49 6e  1);.      Tcl_In
4c60: 63 72 52 65 66 43 6f 75 6e 74 28 70 43 6d 64 29  crRefCount(pCmd)
4c70: 3b 0a 20 20 20 20 20 20 54 63 6c 5f 4c 69 73 74  ;.      Tcl_List
4c80: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
4c90: 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20 70 43  (pDb->interp, pC
4ca0: 6d 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  md,.            
4cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4cc0: 20 20 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e     Tcl_NewWideIn
4cd0: 74 4f 62 6a 28 28 54 63 6c 5f 57 69 64 65 49 6e  tObj((Tcl_WideIn
4ce0: 74 29 70 53 74 6d 74 29 29 3b 0a 20 20 20 20 20  t)pStmt));.     
4cf0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
4d00: 6e 64 45 6c 65 6d 65 6e 74 28 70 44 62 2d 3e 69  ndElement(pDb->i
4d10: 6e 74 65 72 70 2c 20 70 43 6d 64 2c 0a 20 20 20  nterp, pCmd,.   
4d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4d30: 20 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f              Tcl_
4d40: 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 28 54  NewWideIntObj((T
4d50: 63 6c 5f 57 69 64 65 49 6e 74 29 6e 73 29 29 3b  cl_WideInt)ns));
4d60: 0a 20 20 20 20 20 20 54 63 6c 5f 45 76 61 6c 4f  .      Tcl_EvalO
4d70: 62 6a 45 78 28 70 44 62 2d 3e 69 6e 74 65 72 70  bjEx(pDb->interp
4d80: 2c 20 70 43 6d 64 2c 20 54 43 4c 5f 45 56 41 4c  , pCmd, TCL_EVAL
4d90: 5f 44 49 52 45 43 54 29 3b 0a 20 20 20 20 20 20  _DIRECT);.      
4da0: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
4db0: 28 70 43 6d 64 29 3b 0a 20 20 20 20 20 20 54 63  (pCmd);.      Tc
4dc0: 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28 70 44  l_ResetResult(pD
4dd0: 62 2d 3e 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  b->interp);.    
4de0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
4df0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
4e00: 52 41 43 45 5f 52 4f 57 3a 20 7b 0a 20 20 20 20  RACE_ROW: {.    
4e10: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
4e20: 70 53 74 6d 74 20 3d 20 28 73 71 6c 69 74 65 33  pStmt = (sqlite3
4e30: 5f 73 74 6d 74 20 2a 29 70 64 3b 0a 0a 20 20 20  _stmt *)pd;..   
4e40: 20 20 20 70 43 6d 64 20 3d 20 54 63 6c 5f 4e 65     pCmd = Tcl_Ne
4e50: 77 53 74 72 69 6e 67 4f 62 6a 28 70 44 62 2d 3e  wStringObj(pDb->
4e60: 7a 54 72 61 63 65 56 32 2c 20 2d 31 29 3b 0a 20  zTraceV2, -1);. 
4e70: 20 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66       Tcl_IncrRef
4e80: 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20 20  Count(pCmd);.   
4e90: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
4ea0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 70 44 62 2d  pendElement(pDb-
4eb0: 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c 0a 20  >interp, pCmd,. 
4ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54 63                Tc
4ee0: 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28  l_NewWideIntObj(
4ef0: 28 54 63 6c 5f 57 69 64 65 49 6e 74 29 70 53 74  (Tcl_WideInt)pSt
4f00: 6d 74 29 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f  mt));.      Tcl_
4f10: 45 76 61 6c 4f 62 6a 45 78 28 70 44 62 2d 3e 69  EvalObjEx(pDb->i
4f20: 6e 74 65 72 70 2c 20 70 43 6d 64 2c 20 54 43 4c  nterp, pCmd, TCL
4f30: 5f 45 56 41 4c 5f 44 49 52 45 43 54 29 3b 0a 20  _EVAL_DIRECT);. 
4f40: 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66       Tcl_DecrRef
4f50: 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20 20  Count(pCmd);.   
4f60: 20 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73 75     Tcl_ResetResu
4f70: 6c 74 28 70 44 62 2d 3e 69 6e 74 65 72 70 29 3b  lt(pDb->interp);
4f80: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
4f90: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
4fa0: 49 54 45 5f 54 52 41 43 45 5f 43 4c 4f 53 45 3a  ITE_TRACE_CLOSE:
4fb0: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
4fc0: 20 2a 64 62 20 3d 20 28 73 71 6c 69 74 65 33 20   *db = (sqlite3 
4fd0: 2a 29 70 64 3b 0a 0a 20 20 20 20 20 20 70 43 6d  *)pd;..      pCm
4fe0: 64 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  d = Tcl_NewStrin
4ff0: 67 4f 62 6a 28 70 44 62 2d 3e 7a 54 72 61 63 65  gObj(pDb->zTrace
5000: 56 32 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 54  V2, -1);.      T
5010: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
5020: 70 43 6d 64 29 3b 0a 20 20 20 20 20 20 54 63 6c  pCmd);.      Tcl
5030: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
5040: 65 6d 65 6e 74 28 70 44 62 2d 3e 69 6e 74 65 72  ement(pDb->inter
5050: 70 2c 20 70 43 6d 64 2c 0a 20 20 20 20 20 20 20  p, pCmd,.       
5060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5070: 20 20 20 20 20 20 20 20 54 63 6c 5f 4e 65 77 57          Tcl_NewW
5080: 69 64 65 49 6e 74 4f 62 6a 28 28 54 63 6c 5f 57  ideIntObj((Tcl_W
5090: 69 64 65 49 6e 74 29 64 62 29 29 3b 0a 20 20 20  ideInt)db));.   
50a0: 20 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78     Tcl_EvalObjEx
50b0: 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20 70 43  (pDb->interp, pC
50c0: 6d 64 2c 20 54 43 4c 5f 45 56 41 4c 5f 44 49 52  md, TCL_EVAL_DIR
50d0: 45 43 54 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f  ECT);.      Tcl_
50e0: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 43 6d  DecrRefCount(pCm
50f0: 64 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 52 65  d);.      Tcl_Re
5100: 73 65 74 52 65 73 75 6c 74 28 70 44 62 2d 3e 69  setResult(pDb->i
5110: 6e 74 65 72 70 29 3b 0a 20 20 20 20 20 20 62 72  nterp);.      br
5120: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
5130: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
5140: 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  K;.}.#endif..#if
5150: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
5160: 5f 4f 4d 49 54 5f 54 52 41 43 45 29 20 26 26 20  _OMIT_TRACE) && 
5170: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
5180: 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f  OMIT_FLOATING_PO
5190: 49 4e 54 29 20 26 26 20 5c 0a 20 20 20 20 21 64  INT) && \.    !d
51a0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
51b0: 49 54 5f 44 45 50 52 45 43 41 54 45 44 29 0a 2f  IT_DEPRECATED)./
51c0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
51d0: 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74  e is called by t
51e0: 68 65 20 53 51 4c 69 74 65 20 70 72 6f 66 69 6c  he SQLite profil
51f0: 65 20 68 61 6e 64 6c 65 72 20 61 66 74 65 72 20  e handler after 
5200: 61 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 53  a statement.** S
5210: 51 4c 20 68 61 73 20 65 78 65 63 75 74 65 64 2e  QL has executed.
5220: 20 20 54 68 65 20 54 43 4c 20 73 63 72 69 70 74    The TCL script
5230: 20 69 6e 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c   in pDb->zProfil
5240: 65 20 69 73 20 65 76 61 6c 75 61 74 65 64 2e 0a  e is evaluated..
5250: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 44  */.static void D
5260: 62 50 72 6f 66 69 6c 65 48 61 6e 64 6c 65 72 28  bProfileHandler(
5270: 76 6f 69 64 20 2a 63 64 2c 20 63 6f 6e 73 74 20  void *cd, const 
5280: 63 68 61 72 20 2a 7a 53 71 6c 2c 20 73 71 6c 69  char *zSql, sqli
5290: 74 65 5f 75 69 6e 74 36 34 20 74 6d 29 7b 0a 20  te_uint64 tm){. 
52a0: 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d   SqliteDb *pDb =
52b0: 20 28 53 71 6c 69 74 65 44 62 2a 29 63 64 3b 0a   (SqliteDb*)cd;.
52c0: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 73 74    Tcl_DString st
52d0: 72 3b 0a 20 20 63 68 61 72 20 7a 54 6d 5b 31 30  r;.  char zTm[10
52e0: 30 5d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73  0];..  sqlite3_s
52f0: 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a  nprintf(sizeof(z
5300: 54 6d 29 2d 31 2c 20 7a 54 6d 2c 20 22 25 6c 6c  Tm)-1, zTm, "%ll
5310: 64 22 2c 20 74 6d 29 3b 0a 20 20 54 63 6c 5f 44  d", tm);.  Tcl_D
5320: 53 74 72 69 6e 67 49 6e 69 74 28 26 73 74 72 29  StringInit(&str)
5330: 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41  ;.  Tcl_DStringA
5340: 70 70 65 6e 64 28 26 73 74 72 2c 20 70 44 62 2d  ppend(&str, pDb-
5350: 3e 7a 50 72 6f 66 69 6c 65 2c 20 2d 31 29 3b 0a  >zProfile, -1);.
5360: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70    Tcl_DStringApp
5370: 65 6e 64 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c  endElement(&str,
5380: 20 7a 53 71 6c 29 3b 0a 20 20 54 63 6c 5f 44 53   zSql);.  Tcl_DS
5390: 74 72 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65  tringAppendEleme
53a0: 6e 74 28 26 73 74 72 2c 20 7a 54 6d 29 3b 0a 20  nt(&str, zTm);. 
53b0: 20 54 63 6c 5f 45 76 61 6c 28 70 44 62 2d 3e 69   Tcl_Eval(pDb->i
53c0: 6e 74 65 72 70 2c 20 54 63 6c 5f 44 53 74 72 69  nterp, Tcl_DStri
53d0: 6e 67 56 61 6c 75 65 28 26 73 74 72 29 29 3b 0a  ngValue(&str));.
53e0: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65    Tcl_DStringFre
53f0: 65 28 26 73 74 72 29 3b 0a 20 20 54 63 6c 5f 52  e(&str);.  Tcl_R
5400: 65 73 65 74 52 65 73 75 6c 74 28 70 44 62 2d 3e  esetResult(pDb->
5410: 69 6e 74 65 72 70 29 3b 0a 7d 0a 23 65 6e 64 69  interp);.}.#endi
5420: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  f../*.** This ro
5430: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
5440: 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69  when a transacti
5450: 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2e  on is committed.
5460: 20 20 54 68 65 0a 2a 2a 20 54 43 4c 20 73 63 72    The.** TCL scr
5470: 69 70 74 20 69 6e 20 70 44 62 2d 3e 7a 43 6f 6d  ipt in pDb->zCom
5480: 6d 69 74 20 69 73 20 65 78 65 63 75 74 65 64 2e  mit is executed.
5490: 20 20 49 66 20 69 74 20 72 65 74 75 72 6e 73 20    If it returns 
54a0: 6e 6f 6e 2d 7a 65 72 6f 20 6f 72 0a 2a 2a 20 69  non-zero or.** i
54b0: 66 20 69 74 20 74 68 72 6f 77 73 20 61 6e 20 65  f it throws an e
54c0: 78 63 65 70 74 69 6f 6e 2c 20 74 68 65 20 74 72  xception, the tr
54d0: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c  ansaction is rol
54e0: 6c 65 64 20 62 61 63 6b 20 69 6e 73 74 65 61 64  led back instead
54f0: 0a 2a 2a 20 6f 66 20 62 65 69 6e 67 20 63 6f 6d  .** of being com
5500: 6d 69 74 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  mitted..*/.stati
5510: 63 20 69 6e 74 20 44 62 43 6f 6d 6d 69 74 48 61  c int DbCommitHa
5520: 6e 64 6c 65 72 28 76 6f 69 64 20 2a 63 64 29 7b  ndler(void *cd){
5530: 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62  .  SqliteDb *pDb
5540: 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 63 64   = (SqliteDb*)cd
5550: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 72  ;.  int rc;..  r
5560: 63 20 3d 20 54 63 6c 5f 45 76 61 6c 28 70 44 62  c = Tcl_Eval(pDb
5570: 2d 3e 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a  ->interp, pDb->z
5580: 43 6f 6d 6d 69 74 29 3b 0a 20 20 69 66 28 20 72  Commit);.  if( r
5590: 63 21 3d 54 43 4c 5f 4f 4b 20 7c 7c 20 61 74 6f  c!=TCL_OK || ato
55a0: 69 28 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52  i(Tcl_GetStringR
55b0: 65 73 75 6c 74 28 70 44 62 2d 3e 69 6e 74 65 72  esult(pDb->inter
55c0: 70 29 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  p)) ){.    retur
55d0: 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 1;.  }.  retur
55e0: 6e 20 30 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76  n 0;.}..static v
55f0: 6f 69 64 20 44 62 52 6f 6c 6c 62 61 63 6b 48 61  oid DbRollbackHa
5600: 6e 64 6c 65 72 28 76 6f 69 64 20 2a 63 6c 69 65  ndler(void *clie
5610: 6e 74 44 61 74 61 29 7b 0a 20 20 53 71 6c 69 74  ntData){.  Sqlit
5620: 65 44 62 20 2a 70 44 62 20 3d 20 28 53 71 6c 69  eDb *pDb = (Sqli
5630: 74 65 44 62 2a 29 63 6c 69 65 6e 74 44 61 74 61  teDb*)clientData
5640: 3b 0a 20 20 61 73 73 65 72 74 28 70 44 62 2d 3e  ;.  assert(pDb->
5650: 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 29 3b 0a  pRollbackHook);.
5660: 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63    if( TCL_OK!=Tc
5670: 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70 44 62 2d  l_EvalObjEx(pDb-
5680: 3e 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 70 52  >interp, pDb->pR
5690: 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 2c 20 30 29 20  ollbackHook, 0) 
56a0: 29 7b 0a 20 20 20 20 54 63 6c 5f 42 61 63 6b 67  ){.    Tcl_Backg
56b0: 72 6f 75 6e 64 45 72 72 6f 72 28 70 44 62 2d 3e  roundError(pDb->
56c0: 69 6e 74 65 72 70 29 3b 0a 20 20 7d 0a 7d 0a 0a  interp);.  }.}..
56d0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 70 72 6f 63 65  /*.** This proce
56e0: 64 75 72 65 20 68 61 6e 64 6c 65 73 20 77 61 6c  dure handles wal
56f0: 5f 68 6f 6f 6b 20 63 61 6c 6c 62 61 63 6b 73 2e  _hook callbacks.
5700: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 44  .*/.static int D
5710: 62 57 61 6c 48 61 6e 64 6c 65 72 28 0a 20 20 76  bWalHandler(.  v
5720: 6f 69 64 20 2a 63 6c 69 65 6e 74 44 61 74 61 2c  oid *clientData,
5730: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a  .  sqlite3 *db,.
5740: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
5750: 62 2c 0a 20 20 69 6e 74 20 6e 45 6e 74 72 79 0a  b,.  int nEntry.
5760: 29 7b 0a 20 20 69 6e 74 20 72 65 74 20 3d 20 53  ){.  int ret = S
5770: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 54 63 6c 5f  QLITE_OK;.  Tcl_
5780: 4f 62 6a 20 2a 70 3b 0a 20 20 53 71 6c 69 74 65  Obj *p;.  Sqlite
5790: 44 62 20 2a 70 44 62 20 3d 20 28 53 71 6c 69 74  Db *pDb = (Sqlit
57a0: 65 44 62 2a 29 63 6c 69 65 6e 74 44 61 74 61 3b  eDb*)clientData;
57b0: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
57c0: 6e 74 65 72 70 20 3d 20 70 44 62 2d 3e 69 6e 74  nterp = pDb->int
57d0: 65 72 70 3b 0a 20 20 61 73 73 65 72 74 28 70 44  erp;.  assert(pD
57e0: 62 2d 3e 70 57 61 6c 48 6f 6f 6b 29 3b 0a 0a 20  b->pWalHook);.. 
57f0: 20 61 73 73 65 72 74 28 20 64 62 3d 3d 70 44 62   assert( db==pDb
5800: 2d 3e 64 62 20 29 3b 0a 20 20 70 20 3d 20 54 63  ->db );.  p = Tc
5810: 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 70  l_DuplicateObj(p
5820: 44 62 2d 3e 70 57 61 6c 48 6f 6f 6b 29 3b 0a 20  Db->pWalHook);. 
5830: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
5840: 74 28 70 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74  t(p);.  Tcl_List
5850: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
5860: 28 69 6e 74 65 72 70 2c 20 70 2c 20 54 63 6c 5f  (interp, p, Tcl_
5870: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 44 62  NewStringObj(zDb
5880: 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69  , -1));.  Tcl_Li
5890: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
58a0: 6e 74 28 69 6e 74 65 72 70 2c 20 70 2c 20 54 63  nt(interp, p, Tc
58b0: 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 6e 45 6e 74  l_NewIntObj(nEnt
58c0: 72 79 29 29 3b 0a 20 20 69 66 28 20 54 43 4c 5f  ry));.  if( TCL_
58d0: 4f 4b 21 3d 54 63 6c 5f 45 76 61 6c 4f 62 6a 45  OK!=Tcl_EvalObjE
58e0: 78 28 69 6e 74 65 72 70 2c 20 70 2c 20 30 29 0a  x(interp, p, 0).
58f0: 20 20 20 7c 7c 20 54 43 4c 5f 4f 4b 21 3d 54 63     || TCL_OK!=Tc
5900: 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
5910: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 4f  interp, Tcl_GetO
5920: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29  bjResult(interp)
5930: 2c 20 26 72 65 74 29 0a 20 20 29 7b 0a 20 20 20  , &ret).  ){.   
5940: 20 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45   Tcl_BackgroundE
5950: 72 72 6f 72 28 69 6e 74 65 72 70 29 3b 0a 20 20  rror(interp);.  
5960: 7d 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43  }.  Tcl_DecrRefC
5970: 6f 75 6e 74 28 70 29 3b 0a 0a 20 20 72 65 74 75  ount(p);..  retu
5980: 72 6e 20 72 65 74 3b 0a 7d 0a 0a 23 69 66 20 64  rn ret;.}..#if d
5990: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45  efined(SQLITE_TE
59a0: 53 54 29 20 26 26 20 64 65 66 69 6e 65 64 28 53  ST) && defined(S
59b0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 55 4e 4c  QLITE_ENABLE_UNL
59c0: 4f 43 4b 5f 4e 4f 54 49 46 59 29 0a 73 74 61 74  OCK_NOTIFY).stat
59d0: 69 63 20 76 6f 69 64 20 73 65 74 54 65 73 74 55  ic void setTestU
59e0: 6e 6c 6f 63 6b 4e 6f 74 69 66 79 56 61 72 73 28  nlockNotifyVars(
59f0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
5a00: 72 70 2c 20 69 6e 74 20 69 41 72 67 2c 20 69 6e  rp, int iArg, in
5a10: 74 20 6e 41 72 67 29 7b 0a 20 20 63 68 61 72 20  t nArg){.  char 
5a20: 7a 42 75 66 5b 36 34 5d 3b 0a 20 20 73 71 6c 69  zBuf[64];.  sqli
5a30: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
5a40: 65 6f 66 28 7a 42 75 66 29 2c 20 7a 42 75 66 2c  eof(zBuf), zBuf,
5a50: 20 22 25 64 22 2c 20 69 41 72 67 29 3b 0a 20 20   "%d", iArg);.  
5a60: 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72  Tcl_SetVar(inter
5a70: 70 2c 20 22 73 71 6c 69 74 65 5f 75 6e 6c 6f 63  p, "sqlite_unloc
5a80: 6b 5f 6e 6f 74 69 66 79 5f 61 72 67 22 2c 20 7a  k_notify_arg", z
5a90: 42 75 66 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f  Buf, TCL_GLOBAL_
5aa0: 4f 4e 4c 59 29 3b 0a 20 20 73 71 6c 69 74 65 33  ONLY);.  sqlite3
5ab0: 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
5ac0: 28 7a 42 75 66 29 2c 20 7a 42 75 66 2c 20 22 25  (zBuf), zBuf, "%
5ad0: 64 22 2c 20 6e 41 72 67 29 3b 0a 20 20 54 63 6c  d", nArg);.  Tcl
5ae0: 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c 20  _SetVar(interp, 
5af0: 22 73 71 6c 69 74 65 5f 75 6e 6c 6f 63 6b 5f 6e  "sqlite_unlock_n
5b00: 6f 74 69 66 79 5f 61 72 67 63 6f 75 6e 74 22 2c  otify_argcount",
5b10: 20 7a 42 75 66 2c 20 54 43 4c 5f 47 4c 4f 42 41   zBuf, TCL_GLOBA
5b20: 4c 5f 4f 4e 4c 59 29 3b 0a 7d 0a 23 65 6c 73 65  L_ONLY);.}.#else
5b30: 0a 23 20 64 65 66 69 6e 65 20 73 65 74 54 65 73  .# define setTes
5b40: 74 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 56 61 72  tUnlockNotifyVar
5b50: 73 28 78 2c 79 2c 7a 29 0a 23 65 6e 64 69 66 0a  s(x,y,z).#endif.
5b60: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
5b70: 4e 41 42 4c 45 5f 55 4e 4c 4f 43 4b 5f 4e 4f 54  NABLE_UNLOCK_NOT
5b80: 49 46 59 0a 73 74 61 74 69 63 20 76 6f 69 64 20  IFY.static void 
5b90: 44 62 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 28 76  DbUnlockNotify(v
5ba0: 6f 69 64 20 2a 2a 61 70 41 72 67 2c 20 69 6e 74  oid **apArg, int
5bb0: 20 6e 41 72 67 29 7b 0a 20 20 69 6e 74 20 69 3b   nArg){.  int i;
5bc0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41  .  for(i=0; i<nA
5bd0: 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6f  rg; i++){.    co
5be0: 6e 73 74 20 69 6e 74 20 66 6c 61 67 73 20 3d 20  nst int flags = 
5bf0: 28 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c  (TCL_EVAL_GLOBAL
5c00: 7c 54 43 4c 5f 45 56 41 4c 5f 44 49 52 45 43 54  |TCL_EVAL_DIRECT
5c10: 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 44 62 20  );.    SqliteDb 
5c20: 2a 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62  *pDb = (SqliteDb
5c30: 20 2a 29 61 70 41 72 67 5b 69 5d 3b 0a 20 20 20   *)apArg[i];.   
5c40: 20 73 65 74 54 65 73 74 55 6e 6c 6f 63 6b 4e 6f   setTestUnlockNo
5c50: 74 69 66 79 56 61 72 73 28 70 44 62 2d 3e 69 6e  tifyVars(pDb->in
5c60: 74 65 72 70 2c 20 69 2c 20 6e 41 72 67 29 3b 0a  terp, i, nArg);.
5c70: 20 20 20 20 61 73 73 65 72 74 28 20 70 44 62 2d      assert( pDb-
5c80: 3e 70 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 29 3b  >pUnlockNotify);
5c90: 0a 20 20 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a  .    Tcl_EvalObj
5ca0: 45 78 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20  Ex(pDb->interp, 
5cb0: 70 44 62 2d 3e 70 55 6e 6c 6f 63 6b 4e 6f 74 69  pDb->pUnlockNoti
5cc0: 66 79 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20  fy, flags);.    
5cd0: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
5ce0: 28 70 44 62 2d 3e 70 55 6e 6c 6f 63 6b 4e 6f 74  (pDb->pUnlockNot
5cf0: 69 66 79 29 3b 0a 20 20 20 20 70 44 62 2d 3e 70  ify);.    pDb->p
5d00: 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 20 3d 20 30  UnlockNotify = 0
5d10: 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ;.  }.}.#endif..
5d20: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
5d30: 41 42 4c 45 5f 50 52 45 55 50 44 41 54 45 5f 48  ABLE_PREUPDATE_H
5d40: 4f 4f 4b 0a 2f 2a 0a 2a 2a 20 50 72 65 2d 75 70  OOK./*.** Pre-up
5d50: 64 61 74 65 20 68 6f 6f 6b 20 63 61 6c 6c 62 61  date hook callba
5d60: 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ck..*/.static vo
5d70: 69 64 20 44 62 50 72 65 55 70 64 61 74 65 48 61  id DbPreUpdateHa
5d80: 6e 64 6c 65 72 28 0a 20 20 76 6f 69 64 20 2a 70  ndler(.  void *p
5d90: 2c 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  ,.  sqlite3 *db,
5da0: 0a 20 20 69 6e 74 20 6f 70 2c 0a 20 20 63 6f 6e  .  int op,.  con
5db0: 73 74 20 63 68 61 72 20 2a 7a 44 62 2c 0a 20 20  st char *zDb,.  
5dc0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 62 6c  const char *zTbl
5dd0: 2c 0a 20 20 73 71 6c 69 74 65 5f 69 6e 74 36 34  ,.  sqlite_int64
5de0: 20 69 4b 65 79 31 2c 0a 20 20 73 71 6c 69 74 65   iKey1,.  sqlite
5df0: 5f 69 6e 74 36 34 20 69 4b 65 79 32 0a 29 7b 0a  _int64 iKey2.){.
5e00: 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20    SqliteDb *pDb 
5e10: 3d 20 28 53 71 6c 69 74 65 44 62 20 2a 29 70 3b  = (SqliteDb *)p;
5e20: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 43 6d 64  .  Tcl_Obj *pCmd
5e30: 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  ;.  static const
5e40: 20 63 68 61 72 20 2a 61 7a 53 74 72 5b 5d 20 3d   char *azStr[] =
5e50: 20 7b 22 44 45 4c 45 54 45 22 2c 20 22 49 4e 53   {"DELETE", "INS
5e60: 45 52 54 22 2c 20 22 55 50 44 41 54 45 22 7d 3b  ERT", "UPDATE"};
5e70: 0a 0a 20 20 61 73 73 65 72 74 28 20 28 53 51 4c  ..  assert( (SQL
5e80: 49 54 45 5f 44 45 4c 45 54 45 2d 31 29 2f 39 20  ITE_DELETE-1)/9 
5e90: 3d 3d 20 30 20 29 3b 0a 20 20 61 73 73 65 72 74  == 0 );.  assert
5ea0: 28 20 28 53 51 4c 49 54 45 5f 49 4e 53 45 52 54  ( (SQLITE_INSERT
5eb0: 2d 31 29 2f 39 20 3d 3d 20 31 20 29 3b 0a 20 20  -1)/9 == 1 );.  
5ec0: 61 73 73 65 72 74 28 20 28 53 51 4c 49 54 45 5f  assert( (SQLITE_
5ed0: 55 50 44 41 54 45 2d 31 29 2f 39 20 3d 3d 20 32  UPDATE-1)/9 == 2
5ee0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44   );.  assert( pD
5ef0: 62 2d 3e 70 50 72 65 55 70 64 61 74 65 48 6f 6f  b->pPreUpdateHoo
5f00: 6b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64  k );.  assert( d
5f10: 62 3d 3d 70 44 62 2d 3e 64 62 20 29 3b 0a 20 20  b==pDb->db );.  
5f20: 61 73 73 65 72 74 28 20 6f 70 3d 3d 53 51 4c 49  assert( op==SQLI
5f30: 54 45 5f 49 4e 53 45 52 54 20 7c 7c 20 6f 70 3d  TE_INSERT || op=
5f40: 3d 53 51 4c 49 54 45 5f 55 50 44 41 54 45 20 7c  =SQLITE_UPDATE |
5f50: 7c 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 44 45 4c  | op==SQLITE_DEL
5f60: 45 54 45 20 29 3b 0a 0a 20 20 70 43 6d 64 20 3d  ETE );..  pCmd =
5f70: 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62   Tcl_DuplicateOb
5f80: 6a 28 70 44 62 2d 3e 70 50 72 65 55 70 64 61 74  j(pDb->pPreUpdat
5f90: 65 48 6f 6f 6b 29 3b 0a 20 20 54 63 6c 5f 49 6e  eHook);.  Tcl_In
5fa0: 63 72 52 65 66 43 6f 75 6e 74 28 70 43 6d 64 29  crRefCount(pCmd)
5fb0: 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  ;.  Tcl_ListObjA
5fc0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20  ppendElement(0, 
5fd0: 70 43 6d 64 2c 20 54 63 6c 5f 4e 65 77 53 74 72  pCmd, Tcl_NewStr
5fe0: 69 6e 67 4f 62 6a 28 61 7a 53 74 72 5b 28 6f 70  ingObj(azStr[(op
5ff0: 2d 31 29 2f 39 5d 2c 20 2d 31 29 29 3b 0a 20 20  -1)/9], -1));.  
6000: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
6010: 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 43 6d 64  dElement(0, pCmd
6020: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
6030: 62 6a 28 7a 44 62 2c 20 2d 31 29 29 3b 0a 20 20  bj(zDb, -1));.  
6040: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
6050: 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 43 6d 64  dElement(0, pCmd
6060: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
6070: 62 6a 28 7a 54 62 6c 2c 20 2d 31 29 29 3b 0a 20  bj(zTbl, -1));. 
6080: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
6090: 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 43 6d  ndElement(0, pCm
60a0: 64 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e  d, Tcl_NewWideIn
60b0: 74 4f 62 6a 28 69 4b 65 79 31 29 29 3b 0a 20 20  tObj(iKey1));.  
60c0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
60d0: 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 43 6d 64  dElement(0, pCmd
60e0: 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74  , Tcl_NewWideInt
60f0: 4f 62 6a 28 69 4b 65 79 32 29 29 3b 0a 20 20 54  Obj(iKey2));.  T
6100: 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70 44 62  cl_EvalObjEx(pDb
6110: 2d 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c 20  ->interp, pCmd, 
6120: 54 43 4c 5f 45 56 41 4c 5f 44 49 52 45 43 54 29  TCL_EVAL_DIRECT)
6130: 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43  ;.  Tcl_DecrRefC
6140: 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 7d 0a 23 65  ount(pCmd);.}.#e
6150: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45  ndif /* SQLITE_E
6160: 4e 41 42 4c 45 5f 50 52 45 55 50 44 41 54 45 5f  NABLE_PREUPDATE_
6170: 48 4f 4f 4b 20 2a 2f 0a 0a 73 74 61 74 69 63 20  HOOK */..static 
6180: 76 6f 69 64 20 44 62 55 70 64 61 74 65 48 61 6e  void DbUpdateHan
6190: 64 6c 65 72 28 0a 20 20 76 6f 69 64 20 2a 70 2c  dler(.  void *p,
61a0: 0a 20 20 69 6e 74 20 6f 70 2c 0a 20 20 63 6f 6e  .  int op,.  con
61b0: 73 74 20 63 68 61 72 20 2a 7a 44 62 2c 0a 20 20  st char *zDb,.  
61c0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 62 6c  const char *zTbl
61d0: 2c 0a 20 20 73 71 6c 69 74 65 5f 69 6e 74 36 34  ,.  sqlite_int64
61e0: 20 72 6f 77 69 64 0a 29 7b 0a 20 20 53 71 6c 69   rowid.){.  Sqli
61f0: 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53 71 6c  teDb *pDb = (Sql
6200: 69 74 65 44 62 20 2a 29 70 3b 0a 20 20 54 63 6c  iteDb *)p;.  Tcl
6210: 5f 4f 62 6a 20 2a 70 43 6d 64 3b 0a 20 20 73 74  _Obj *pCmd;.  st
6220: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
6230: 2a 61 7a 53 74 72 5b 5d 20 3d 20 7b 22 44 45 4c  *azStr[] = {"DEL
6240: 45 54 45 22 2c 20 22 49 4e 53 45 52 54 22 2c 20  ETE", "INSERT", 
6250: 22 55 50 44 41 54 45 22 7d 3b 0a 0a 20 20 61 73  "UPDATE"};..  as
6260: 73 65 72 74 28 20 28 53 51 4c 49 54 45 5f 44 45  sert( (SQLITE_DE
6270: 4c 45 54 45 2d 31 29 2f 39 20 3d 3d 20 30 20 29  LETE-1)/9 == 0 )
6280: 3b 0a 20 20 61 73 73 65 72 74 28 20 28 53 51 4c  ;.  assert( (SQL
6290: 49 54 45 5f 49 4e 53 45 52 54 2d 31 29 2f 39 20  ITE_INSERT-1)/9 
62a0: 3d 3d 20 31 20 29 3b 0a 20 20 61 73 73 65 72 74  == 1 );.  assert
62b0: 28 20 28 53 51 4c 49 54 45 5f 55 50 44 41 54 45  ( (SQLITE_UPDATE
62c0: 2d 31 29 2f 39 20 3d 3d 20 32 20 29 3b 0a 0a 20  -1)/9 == 2 );.. 
62d0: 20 61 73 73 65 72 74 28 20 70 44 62 2d 3e 70 55   assert( pDb->pU
62e0: 70 64 61 74 65 48 6f 6f 6b 20 29 3b 0a 20 20 61  pdateHook );.  a
62f0: 73 73 65 72 74 28 20 6f 70 3d 3d 53 51 4c 49 54  ssert( op==SQLIT
6300: 45 5f 49 4e 53 45 52 54 20 7c 7c 20 6f 70 3d 3d  E_INSERT || op==
6310: 53 51 4c 49 54 45 5f 55 50 44 41 54 45 20 7c 7c  SQLITE_UPDATE ||
6320: 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 44 45 4c 45   op==SQLITE_DELE
6330: 54 45 20 29 3b 0a 0a 20 20 70 43 6d 64 20 3d 20  TE );..  pCmd = 
6340: 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a  Tcl_DuplicateObj
6350: 28 70 44 62 2d 3e 70 55 70 64 61 74 65 48 6f 6f  (pDb->pUpdateHoo
6360: 6b 29 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65  k);.  Tcl_IncrRe
6370: 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20  fCount(pCmd);.  
6380: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
6390: 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 43 6d 64  dElement(0, pCmd
63a0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
63b0: 62 6a 28 61 7a 53 74 72 5b 28 6f 70 2d 31 29 2f  bj(azStr[(op-1)/
63c0: 39 5d 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f  9], -1));.  Tcl_
63d0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
63e0: 6d 65 6e 74 28 30 2c 20 70 43 6d 64 2c 20 54 63  ment(0, pCmd, Tc
63f0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a  l_NewStringObj(z
6400: 44 62 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f  Db, -1));.  Tcl_
6410: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
6420: 6d 65 6e 74 28 30 2c 20 70 43 6d 64 2c 20 54 63  ment(0, pCmd, Tc
6430: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a  l_NewStringObj(z
6440: 54 62 6c 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c  Tbl, -1));.  Tcl
6450: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
6460: 65 6d 65 6e 74 28 30 2c 20 70 43 6d 64 2c 20 54  ement(0, pCmd, T
6470: 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a  cl_NewWideIntObj
6480: 28 72 6f 77 69 64 29 29 3b 0a 20 20 54 63 6c 5f  (rowid));.  Tcl_
6490: 45 76 61 6c 4f 62 6a 45 78 28 70 44 62 2d 3e 69  EvalObjEx(pDb->i
64a0: 6e 74 65 72 70 2c 20 70 43 6d 64 2c 20 54 43 4c  nterp, pCmd, TCL
64b0: 5f 45 56 41 4c 5f 44 49 52 45 43 54 29 3b 0a 20  _EVAL_DIRECT);. 
64c0: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
64d0: 74 28 70 43 6d 64 29 3b 0a 7d 0a 0a 73 74 61 74  t(pCmd);.}..stat
64e0: 69 63 20 76 6f 69 64 20 74 63 6c 43 6f 6c 6c 61  ic void tclColla
64f0: 74 65 4e 65 65 64 65 64 28 0a 20 20 76 6f 69 64  teNeeded(.  void
6500: 20 2a 70 43 74 78 2c 0a 20 20 73 71 6c 69 74 65   *pCtx,.  sqlite
6510: 33 20 2a 64 62 2c 0a 20 20 69 6e 74 20 65 6e 63  3 *db,.  int enc
6520: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
6530: 7a 4e 61 6d 65 0a 29 7b 0a 20 20 53 71 6c 69 74  zName.){.  Sqlit
6540: 65 44 62 20 2a 70 44 62 20 3d 20 28 53 71 6c 69  eDb *pDb = (Sqli
6550: 74 65 44 62 20 2a 29 70 43 74 78 3b 0a 20 20 54  teDb *)pCtx;.  T
6560: 63 6c 5f 4f 62 6a 20 2a 70 53 63 72 69 70 74 20  cl_Obj *pScript 
6570: 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f  = Tcl_DuplicateO
6580: 62 6a 28 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65  bj(pDb->pCollate
6590: 4e 65 65 64 65 64 29 3b 0a 20 20 54 63 6c 5f 49  Needed);.  Tcl_I
65a0: 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 53 63 72  ncrRefCount(pScr
65b0: 69 70 74 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74  ipt);.  Tcl_List
65c0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
65d0: 28 30 2c 20 70 53 63 72 69 70 74 2c 20 54 63 6c  (0, pScript, Tcl
65e0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 4e  _NewStringObj(zN
65f0: 61 6d 65 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c  ame, -1));.  Tcl
6600: 5f 45 76 61 6c 4f 62 6a 45 78 28 70 44 62 2d 3e  _EvalObjEx(pDb->
6610: 69 6e 74 65 72 70 2c 20 70 53 63 72 69 70 74 2c  interp, pScript,
6620: 20 30 29 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52   0);.  Tcl_DecrR
6630: 65 66 43 6f 75 6e 74 28 70 53 63 72 69 70 74 29  efCount(pScript)
6640: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
6650: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
6660: 64 20 74 6f 20 65 76 61 6c 75 61 74 65 20 61 6e  d to evaluate an
6670: 20 53 51 4c 20 63 6f 6c 6c 61 74 69 6f 6e 20 66   SQL collation f
6680: 75 6e 63 74 69 6f 6e 20 69 6d 70 6c 65 6d 65 6e  unction implemen
6690: 74 65 64 0a 2a 2a 20 75 73 69 6e 67 20 54 43 4c  ted.** using TCL
66a0: 20 73 63 72 69 70 74 2e 0a 2a 2f 0a 73 74 61 74   script..*/.stat
66b0: 69 63 20 69 6e 74 20 74 63 6c 53 71 6c 43 6f 6c  ic int tclSqlCol
66c0: 6c 61 74 65 28 0a 20 20 76 6f 69 64 20 2a 70 43  late(.  void *pC
66d0: 74 78 2c 0a 20 20 69 6e 74 20 6e 41 2c 0a 20 20  tx,.  int nA,.  
66e0: 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 41 2c 0a  const void *zA,.
66f0: 20 20 69 6e 74 20 6e 42 2c 0a 20 20 63 6f 6e 73    int nB,.  cons
6700: 74 20 76 6f 69 64 20 2a 7a 42 0a 29 7b 0a 20 20  t void *zB.){.  
6710: 53 71 6c 43 6f 6c 6c 61 74 65 20 2a 70 20 3d 20  SqlCollate *p = 
6720: 28 53 71 6c 43 6f 6c 6c 61 74 65 20 2a 29 70 43  (SqlCollate *)pC
6730: 74 78 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  tx;.  Tcl_Obj *p
6740: 43 6d 64 3b 0a 0a 20 20 70 43 6d 64 20 3d 20 54  Cmd;..  pCmd = T
6750: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
6760: 70 2d 3e 7a 53 63 72 69 70 74 2c 20 2d 31 29 3b  p->zScript, -1);
6770: 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f  .  Tcl_IncrRefCo
6780: 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20 54 63 6c  unt(pCmd);.  Tcl
6790: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
67a0: 65 6d 65 6e 74 28 70 2d 3e 69 6e 74 65 72 70 2c  ement(p->interp,
67b0: 20 70 43 6d 64 2c 20 54 63 6c 5f 4e 65 77 53 74   pCmd, Tcl_NewSt
67c0: 72 69 6e 67 4f 62 6a 28 7a 41 2c 20 6e 41 29 29  ringObj(zA, nA))
67d0: 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  ;.  Tcl_ListObjA
67e0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 70 2d 3e  ppendElement(p->
67f0: 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c 20 54 63  interp, pCmd, Tc
6800: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a  l_NewStringObj(z
6810: 42 2c 20 6e 42 29 29 3b 0a 20 20 54 63 6c 5f 45  B, nB));.  Tcl_E
6820: 76 61 6c 4f 62 6a 45 78 28 70 2d 3e 69 6e 74 65  valObjEx(p->inte
6830: 72 70 2c 20 70 43 6d 64 2c 20 54 43 4c 5f 45 56  rp, pCmd, TCL_EV
6840: 41 4c 5f 44 49 52 45 43 54 29 3b 0a 20 20 54 63  AL_DIRECT);.  Tc
6850: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70  l_DecrRefCount(p
6860: 43 6d 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 28  Cmd);.  return (
6870: 61 74 6f 69 28 54 63 6c 5f 47 65 74 53 74 72 69  atoi(Tcl_GetStri
6880: 6e 67 52 65 73 75 6c 74 28 70 2d 3e 69 6e 74 65  ngResult(p->inte
6890: 72 70 29 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rp)));.}../*.** 
68a0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
68b0: 63 61 6c 6c 65 64 20 74 6f 20 65 76 61 6c 75 61  called to evalua
68c0: 74 65 20 61 6e 20 53 51 4c 20 66 75 6e 63 74 69  te an SQL functi
68d0: 6f 6e 20 69 6d 70 6c 65 6d 65 6e 74 65 64 0a 2a  on implemented.*
68e0: 2a 20 75 73 69 6e 67 20 54 43 4c 20 73 63 72 69  * using TCL scri
68f0: 70 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  pt..*/.static vo
6900: 69 64 20 74 63 6c 53 71 6c 46 75 6e 63 28 73 71  id tclSqlFunc(sq
6910: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
6920: 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63  ontext, int argc
6930: 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a  , sqlite3_value*
6940: 2a 61 72 67 76 29 7b 0a 20 20 53 71 6c 46 75 6e  *argv){.  SqlFun
6950: 63 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 5f 75  c *p = sqlite3_u
6960: 73 65 72 5f 64 61 74 61 28 63 6f 6e 74 65 78 74  ser_data(context
6970: 29 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 43  );.  Tcl_Obj *pC
6980: 6d 64 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  md;.  int i;.  i
6990: 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 61 72  nt rc;..  if( ar
69a0: 67 63 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  gc==0 ){.    /* 
69b0: 49 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  If there are no 
69c0: 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 74 68 65  arguments to the
69d0: 20 66 75 6e 63 74 69 6f 6e 2c 20 63 61 6c 6c 20   function, call 
69e0: 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 20 6f 6e  Tcl_EvalObjEx on
69f0: 20 74 68 65 0a 20 20 20 20 2a 2a 20 73 63 72 69   the.    ** scri
6a00: 70 74 20 6f 62 6a 65 63 74 20 64 69 72 65 63 74  pt object direct
6a10: 6c 79 2e 20 20 54 68 69 73 20 61 6c 6c 6f 77 73  ly.  This allows
6a20: 20 74 68 65 20 54 43 4c 20 63 6f 6d 70 69 6c 65   the TCL compile
6a30: 72 20 74 6f 20 67 65 6e 65 72 61 74 65 0a 20 20  r to generate.  
6a40: 20 20 2a 2a 20 62 79 74 65 63 6f 64 65 20 66 6f    ** bytecode fo
6a50: 72 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6f 6e  r the command on
6a60: 20 74 68 65 20 66 69 72 73 74 20 69 6e 76 6f 63   the first invoc
6a70: 61 74 69 6f 6e 20 61 6e 64 20 74 68 75 73 20 6d  ation and thus m
6a80: 61 6b 65 0a 20 20 20 20 2a 2a 20 73 75 62 73 65  ake.    ** subse
6a90: 71 75 65 6e 74 20 69 6e 76 6f 63 61 74 69 6f 6e  quent invocation
6aa0: 73 20 6d 75 63 68 20 66 61 73 74 65 72 2e 20 2a  s much faster. *
6ab0: 2f 0a 20 20 20 20 70 43 6d 64 20 3d 20 70 2d 3e  /.    pCmd = p->
6ac0: 70 53 63 72 69 70 74 3b 0a 20 20 20 20 54 63 6c  pScript;.    Tcl
6ad0: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 43  _IncrRefCount(pC
6ae0: 6d 64 29 3b 0a 20 20 20 20 72 63 20 3d 20 54 63  md);.    rc = Tc
6af0: 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70 2d 3e 69  l_EvalObjEx(p->i
6b00: 6e 74 65 72 70 2c 20 70 43 6d 64 2c 20 30 29 3b  nterp, pCmd, 0);
6b10: 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66  .    Tcl_DecrRef
6b20: 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20 7d  Count(pCmd);.  }
6b30: 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20  else{.    /* If 
6b40: 74 68 65 72 65 20 61 72 65 20 61 72 67 75 6d 65  there are argume
6b50: 6e 74 73 20 74 6f 20 74 68 65 20 66 75 6e 63 74  nts to the funct
6b60: 69 6f 6e 2c 20 6d 61 6b 65 20 61 20 73 68 61 6c  ion, make a shal
6b70: 6c 6f 77 20 63 6f 70 79 20 6f 66 20 74 68 65 0a  low copy of the.
6b80: 20 20 20 20 2a 2a 20 73 63 72 69 70 74 20 6f 62      ** script ob
6b90: 6a 65 63 74 2c 20 6c 61 70 70 65 6e 64 20 74 68  ject, lappend th
6ba0: 65 20 61 72 67 75 6d 65 6e 74 73 2c 20 74 68 65  e arguments, the
6bb0: 6e 20 65 76 61 6c 75 61 74 65 20 74 68 65 20 63  n evaluate the c
6bc0: 6f 70 79 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  opy..    **.    
6bd0: 2a 2a 20 42 79 20 22 73 68 61 6c 6c 6f 77 22 20  ** By "shallow" 
6be0: 63 6f 70 79 2c 20 77 65 20 6d 65 61 6e 20 6f 6e  copy, we mean on
6bf0: 6c 79 20 74 68 65 20 6f 75 74 65 72 20 6c 69 73  ly the outer lis
6c00: 74 20 54 63 6c 5f 4f 62 6a 20 69 73 20 64 75 70  t Tcl_Obj is dup
6c10: 6c 69 63 61 74 65 64 2e 0a 20 20 20 20 2a 2a 20  licated..    ** 
6c20: 54 68 65 20 6e 65 77 20 54 63 6c 5f 4f 62 6a 20  The new Tcl_Obj 
6c30: 63 6f 6e 74 61 69 6e 73 20 70 6f 69 6e 74 65 72  contains pointer
6c40: 73 20 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61  s to the origina
6c50: 6c 20 6c 69 73 74 20 65 6c 65 6d 65 6e 74 73 2e  l list elements.
6c60: 0a 20 20 20 20 2a 2a 20 54 68 61 74 20 77 61 79  .    ** That way
6c70: 2c 20 77 68 65 6e 20 54 63 6c 5f 45 76 61 6c 4f  , when Tcl_EvalO
6c80: 62 6a 76 28 29 20 69 73 20 72 75 6e 20 61 6e 64  bjv() is run and
6c90: 20 73 68 69 6d 6d 65 72 73 20 74 68 65 20 66 69   shimmers the fi
6ca0: 72 73 74 20 65 6c 65 6d 65 6e 74 0a 20 20 20 20  rst element.    
6cb0: 2a 2a 20 6f 66 20 74 68 65 20 6c 69 73 74 20 74  ** of the list t
6cc0: 6f 20 74 63 6c 43 6d 64 4e 61 6d 65 54 79 70 65  o tclCmdNameType
6cd0: 2c 20 74 68 61 74 20 61 6c 74 65 72 6e 61 74 65  , that alternate
6ce0: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
6cf0: 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20 70  will.    ** be p
6d00: 72 65 73 65 72 76 65 64 20 61 6e 64 20 72 65 75  reserved and reu
6d10: 73 65 64 20 6f 6e 20 74 68 65 20 6e 65 78 74 20  sed on the next 
6d20: 69 6e 76 6f 63 61 74 69 6f 6e 2e 0a 20 20 20 20  invocation..    
6d30: 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a  */.    Tcl_Obj *
6d40: 2a 61 41 72 67 3b 0a 20 20 20 20 69 6e 74 20 6e  *aArg;.    int n
6d50: 41 72 67 3b 0a 20 20 20 20 69 66 28 20 54 63 6c  Arg;.    if( Tcl
6d60: 5f 4c 69 73 74 4f 62 6a 47 65 74 45 6c 65 6d 65  _ListObjGetEleme
6d70: 6e 74 73 28 70 2d 3e 69 6e 74 65 72 70 2c 20 70  nts(p->interp, p
6d80: 2d 3e 70 53 63 72 69 70 74 2c 20 26 6e 41 72 67  ->pScript, &nArg
6d90: 2c 20 26 61 41 72 67 29 20 29 7b 0a 20 20 20 20  , &aArg) ){.    
6da0: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
6db0: 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20  _error(context, 
6dc0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73  Tcl_GetStringRes
6dd0: 75 6c 74 28 70 2d 3e 69 6e 74 65 72 70 29 2c 20  ult(p->interp), 
6de0: 2d 31 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  -1);.      retur
6df0: 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 6d  n;.    }.    pCm
6e00: 64 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f  d = Tcl_NewListO
6e10: 62 6a 28 6e 41 72 67 2c 20 61 41 72 67 29 3b 0a  bj(nArg, aArg);.
6e20: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43      Tcl_IncrRefC
6e30: 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20 20 20  ount(pCmd);.    
6e40: 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 67 63 3b  for(i=0; i<argc;
6e50: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c   i++){.      sql
6e60: 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 49 6e 20  ite3_value *pIn 
6e70: 3d 20 61 72 67 76 5b 69 5d 3b 0a 20 20 20 20 20  = argv[i];.     
6e80: 20 54 63 6c 5f 4f 62 6a 20 2a 70 56 61 6c 3b 0a   Tcl_Obj *pVal;.
6e90: 0a 20 20 20 20 20 20 2f 2a 20 53 65 74 20 70 56  .      /* Set pV
6ea0: 61 6c 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68  al to contain th
6eb0: 65 20 69 27 74 68 20 63 6f 6c 75 6d 6e 20 6f 66  e i'th column of
6ec0: 20 74 68 69 73 20 72 6f 77 2e 20 2a 2f 0a 20 20   this row. */.  
6ed0: 20 20 20 20 73 77 69 74 63 68 28 20 73 71 6c 69      switch( sqli
6ee0: 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 70  te3_value_type(p
6ef0: 49 6e 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63  In) ){.        c
6f00: 61 73 65 20 53 51 4c 49 54 45 5f 42 4c 4f 42 3a  ase SQLITE_BLOB:
6f10: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74   {.          int
6f20: 20 62 79 74 65 73 20 3d 20 73 71 6c 69 74 65 33   bytes = sqlite3
6f30: 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 70 49 6e  _value_bytes(pIn
6f40: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 56 61  );.          pVa
6f50: 6c 20 3d 20 54 63 6c 5f 4e 65 77 42 79 74 65 41  l = Tcl_NewByteA
6f60: 72 72 61 79 4f 62 6a 28 73 71 6c 69 74 65 33 5f  rrayObj(sqlite3_
6f70: 76 61 6c 75 65 5f 62 6c 6f 62 28 70 49 6e 29 2c  value_blob(pIn),
6f80: 20 62 79 74 65 73 29 3b 0a 20 20 20 20 20 20 20   bytes);.       
6f90: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
6fa0: 20 20 7d 0a 20 20 20 20 20 20 20 20 63 61 73 65    }.        case
6fb0: 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3a   SQLITE_INTEGER:
6fc0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c   {.          sql
6fd0: 69 74 65 5f 69 6e 74 36 34 20 76 20 3d 20 73 71  ite_int64 v = sq
6fe0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36  lite3_value_int6
6ff0: 34 28 70 49 6e 29 3b 0a 20 20 20 20 20 20 20 20  4(pIn);.        
7000: 20 20 69 66 28 20 76 3e 3d 2d 32 31 34 37 34 38    if( v>=-214748
7010: 33 36 34 37 20 26 26 20 76 3c 3d 32 31 34 37 34  3647 && v<=21474
7020: 38 33 36 34 37 20 29 7b 0a 20 20 20 20 20 20 20  83647 ){.       
7030: 20 20 20 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f       pVal = Tcl_
7040: 4e 65 77 49 6e 74 4f 62 6a 28 28 69 6e 74 29 76  NewIntObj((int)v
7050: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  );.          }el
7060: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
7070: 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 57 69  pVal = Tcl_NewWi
7080: 64 65 49 6e 74 4f 62 6a 28 76 29 3b 0a 20 20 20  deIntObj(v);.   
7090: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
70a0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
70b0: 20 20 7d 0a 20 20 20 20 20 20 20 20 63 61 73 65    }.        case
70c0: 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54 3a 20 7b   SQLITE_FLOAT: {
70d0: 0a 20 20 20 20 20 20 20 20 20 20 64 6f 75 62 6c  .          doubl
70e0: 65 20 72 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  e r = sqlite3_va
70f0: 6c 75 65 5f 64 6f 75 62 6c 65 28 70 49 6e 29 3b  lue_double(pIn);
7100: 0a 20 20 20 20 20 20 20 20 20 20 70 56 61 6c 20  .          pVal 
7110: 3d 20 54 63 6c 5f 4e 65 77 44 6f 75 62 6c 65 4f  = Tcl_NewDoubleO
7120: 62 6a 28 72 29 3b 0a 20 20 20 20 20 20 20 20 20  bj(r);.         
7130: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
7140: 7d 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 53  }.        case S
7150: 51 4c 49 54 45 5f 4e 55 4c 4c 3a 20 7b 0a 20 20  QLITE_NULL: {.  
7160: 20 20 20 20 20 20 20 20 70 56 61 6c 20 3d 20 54          pVal = T
7170: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
7180: 70 2d 3e 70 44 62 2d 3e 7a 4e 75 6c 6c 2c 20 2d  p->pDb->zNull, -
7190: 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  1);.          br
71a0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
71b0: 20 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20         default: 
71c0: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
71d0: 62 79 74 65 73 20 3d 20 73 71 6c 69 74 65 33 5f  bytes = sqlite3_
71e0: 76 61 6c 75 65 5f 62 79 74 65 73 28 70 49 6e 29  value_bytes(pIn)
71f0: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 56 61 6c  ;.          pVal
7200: 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67   = Tcl_NewString
7210: 4f 62 6a 28 28 63 68 61 72 20 2a 29 73 71 6c 69  Obj((char *)sqli
7220: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 70  te3_value_text(p
7230: 49 6e 29 2c 20 62 79 74 65 73 29 3b 0a 20 20 20  In), bytes);.   
7240: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
7250: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
7260: 20 20 20 20 20 20 72 63 20 3d 20 54 63 6c 5f 4c        rc = Tcl_L
7270: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
7280: 65 6e 74 28 70 2d 3e 69 6e 74 65 72 70 2c 20 70  ent(p->interp, p
7290: 43 6d 64 2c 20 70 56 61 6c 29 3b 0a 20 20 20 20  Cmd, pVal);.    
72a0: 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
72b0: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
72c0: 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20 20 20  ount(pCmd);.    
72d0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
72e0: 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74  lt_error(context
72f0: 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52  , Tcl_GetStringR
7300: 65 73 75 6c 74 28 70 2d 3e 69 6e 74 65 72 70 29  esult(p->interp)
7310: 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 72  , -1);.        r
7320: 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  eturn;.      }. 
7330: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 70 2d     }.    if( !p-
7340: 3e 75 73 65 45 76 61 6c 4f 62 6a 76 20 29 7b 0a  >useEvalObjv ){.
7350: 20 20 20 20 20 20 2f 2a 20 54 63 6c 5f 45 76 61        /* Tcl_Eva
7360: 6c 4f 62 6a 45 78 28 29 20 77 69 6c 6c 20 61 75  lObjEx() will au
7370: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 61 6c 6c  tomatically call
7380: 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 76 28 29 20   Tcl_EvalObjv() 
7390: 69 66 20 70 43 6d 64 0a 20 20 20 20 20 20 2a 2a  if pCmd.      **
73a0: 20 69 73 20 61 20 6c 69 73 74 20 77 69 74 68 6f   is a list witho
73b0: 75 74 20 61 20 73 74 72 69 6e 67 20 72 65 70 72  ut a string repr
73c0: 65 73 65 6e 74 61 74 69 6f 6e 2e 20 20 54 6f 20  esentation.  To 
73d0: 70 72 65 76 65 6e 74 20 74 68 69 73 20 66 72 6f  prevent this fro
73e0: 6d 0a 20 20 20 20 20 20 2a 2a 20 68 61 70 70 65  m.      ** happe
73f0: 6e 69 6e 67 2c 20 6d 61 6b 65 20 73 75 72 65 20  ning, make sure 
7400: 70 43 6d 64 20 68 61 73 20 61 20 76 61 6c 69 64  pCmd has a valid
7410: 20 73 74 72 69 6e 67 20 72 65 70 72 65 73 65 6e   string represen
7420: 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  tation */.      
7430: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 70 43  Tcl_GetString(pC
7440: 6d 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  md);.    }.    r
7450: 63 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45  c = Tcl_EvalObjE
7460: 78 28 70 2d 3e 69 6e 74 65 72 70 2c 20 70 43 6d  x(p->interp, pCm
7470: 64 2c 20 54 43 4c 5f 45 56 41 4c 5f 44 49 52 45  d, TCL_EVAL_DIRE
7480: 43 54 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63  CT);.    Tcl_Dec
7490: 72 52 65 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b  rRefCount(pCmd);
74a0: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 20 26  .  }..  if( rc &
74b0: 26 20 72 63 21 3d 54 43 4c 5f 52 45 54 55 52 4e  & rc!=TCL_RETURN
74c0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
74d0: 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e  result_error(con
74e0: 74 65 78 74 2c 20 54 63 6c 5f 47 65 74 53 74 72  text, Tcl_GetStr
74f0: 69 6e 67 52 65 73 75 6c 74 28 70 2d 3e 69 6e 74  ingResult(p->int
7500: 65 72 70 29 2c 20 2d 31 29 3b 0a 20 20 7d 65 6c  erp), -1);.  }el
7510: 73 65 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20  se{.    Tcl_Obj 
7520: 2a 70 56 61 72 20 3d 20 54 63 6c 5f 47 65 74 4f  *pVar = Tcl_GetO
7530: 62 6a 52 65 73 75 6c 74 28 70 2d 3e 69 6e 74 65  bjResult(p->inte
7540: 72 70 29 3b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a  rp);.    int n;.
7550: 20 20 20 20 75 38 20 2a 64 61 74 61 3b 0a 20 20      u8 *data;.  
7560: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
7570: 79 70 65 20 3d 20 28 70 56 61 72 2d 3e 74 79 70  ype = (pVar->typ
7580: 65 50 74 72 20 3f 20 70 56 61 72 2d 3e 74 79 70  ePtr ? pVar->typ
7590: 65 50 74 72 2d 3e 6e 61 6d 65 20 3a 20 22 22 29  ePtr->name : "")
75a0: 3b 0a 20 20 20 20 63 68 61 72 20 63 20 3d 20 7a  ;.    char c = z
75b0: 54 79 70 65 5b 30 5d 3b 0a 20 20 20 20 69 66 28  Type[0];.    if(
75c0: 20 63 3d 3d 27 62 27 20 26 26 20 73 74 72 63 6d   c=='b' && strcm
75d0: 70 28 7a 54 79 70 65 2c 22 62 79 74 65 61 72 72  p(zType,"bytearr
75e0: 61 79 22 29 3d 3d 30 20 26 26 20 70 56 61 72 2d  ay")==0 && pVar-
75f0: 3e 62 79 74 65 73 3d 3d 30 20 29 7b 0a 20 20 20  >bytes==0 ){.   
7600: 20 20 20 2f 2a 20 4f 6e 6c 79 20 72 65 74 75 72     /* Only retur
7610: 6e 20 61 20 42 4c 4f 42 20 74 79 70 65 20 69 66  n a BLOB type if
7620: 20 74 68 65 20 54 63 6c 20 76 61 72 69 61 62 6c   the Tcl variabl
7630: 65 20 69 73 20 61 20 62 79 74 65 61 72 72 61 79  e is a bytearray
7640: 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 68 61   and.      ** ha
7650: 73 20 6e 6f 20 73 74 72 69 6e 67 20 72 65 70 72  s no string repr
7660: 65 73 65 6e 74 61 74 69 6f 6e 2e 20 2a 2f 0a 20  esentation. */. 
7670: 20 20 20 20 20 64 61 74 61 20 3d 20 54 63 6c 5f       data = Tcl_
7680: 47 65 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d  GetByteArrayFrom
7690: 4f 62 6a 28 70 56 61 72 2c 20 26 6e 29 3b 0a 20  Obj(pVar, &n);. 
76a0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
76b0: 75 6c 74 5f 62 6c 6f 62 28 63 6f 6e 74 65 78 74  ult_blob(context
76c0: 2c 20 64 61 74 61 2c 20 6e 2c 20 53 51 4c 49 54  , data, n, SQLIT
76d0: 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  E_TRANSIENT);.  
76e0: 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27    }else if( c=='
76f0: 62 27 20 26 26 20 73 74 72 63 6d 70 28 7a 54 79  b' && strcmp(zTy
7700: 70 65 2c 22 62 6f 6f 6c 65 61 6e 22 29 3d 3d 30  pe,"boolean")==0
7710: 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 47 65   ){.      Tcl_Ge
7720: 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 30 2c 20 70  tIntFromObj(0, p
7730: 56 61 72 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20  Var, &n);.      
7740: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69  sqlite3_result_i
7750: 6e 74 28 63 6f 6e 74 65 78 74 2c 20 6e 29 3b 0a  nt(context, n);.
7760: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d      }else if( c=
7770: 3d 27 64 27 20 26 26 20 73 74 72 63 6d 70 28 7a  ='d' && strcmp(z
7780: 54 79 70 65 2c 22 64 6f 75 62 6c 65 22 29 3d 3d  Type,"double")==
7790: 30 20 29 7b 0a 20 20 20 20 20 20 64 6f 75 62 6c  0 ){.      doubl
77a0: 65 20 72 3b 0a 20 20 20 20 20 20 54 63 6c 5f 47  e r;.      Tcl_G
77b0: 65 74 44 6f 75 62 6c 65 46 72 6f 6d 4f 62 6a 28  etDoubleFromObj(
77c0: 30 2c 20 70 56 61 72 2c 20 26 72 29 3b 0a 20 20  0, pVar, &r);.  
77d0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
77e0: 6c 74 5f 64 6f 75 62 6c 65 28 63 6f 6e 74 65 78  lt_double(contex
77f0: 74 2c 20 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65  t, r);.    }else
7800: 20 69 66 28 20 28 63 3d 3d 27 77 27 20 26 26 20   if( (c=='w' && 
7810: 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22 77 69  strcmp(zType,"wi
7820: 64 65 49 6e 74 22 29 3d 3d 30 29 20 7c 7c 0a 20  deInt")==0) ||. 
7830: 20 20 20 20 20 20 20 20 20 28 63 3d 3d 27 69 27           (c=='i'
7840: 20 26 26 20 73 74 72 63 6d 70 28 7a 54 79 70 65   && strcmp(zType
7850: 2c 22 69 6e 74 22 29 3d 3d 30 29 20 29 7b 0a 20  ,"int")==0) ){. 
7860: 20 20 20 20 20 54 63 6c 5f 57 69 64 65 49 6e 74       Tcl_WideInt
7870: 20 76 3b 0a 20 20 20 20 20 20 54 63 6c 5f 47 65   v;.      Tcl_Ge
7880: 74 57 69 64 65 49 6e 74 46 72 6f 6d 4f 62 6a 28  tWideIntFromObj(
7890: 30 2c 20 70 56 61 72 2c 20 26 76 29 3b 0a 20 20  0, pVar, &v);.  
78a0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
78b0: 6c 74 5f 69 6e 74 36 34 28 63 6f 6e 74 65 78 74  lt_int64(context
78c0: 2c 20 76 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , v);.    }else{
78d0: 0a 20 20 20 20 20 20 64 61 74 61 20 3d 20 28 75  .      data = (u
78e0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 54  nsigned char *)T
78f0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
7900: 4f 62 6a 28 70 56 61 72 2c 20 26 6e 29 3b 0a 20  Obj(pVar, &n);. 
7910: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
7920: 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74  ult_text(context
7930: 2c 20 28 63 68 61 72 20 2a 29 64 61 74 61 2c 20  , (char *)data, 
7940: 6e 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  n, SQLITE_TRANSI
7950: 45 4e 54 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ENT);.    }.  }.
7960: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
7970: 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41  E_OMIT_AUTHORIZA
7980: 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  TION./*.** This 
7990: 69 73 20 74 68 65 20 61 75 74 68 65 6e 74 69 63  is the authentic
79a0: 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 2e 20  ation function. 
79b0: 20 49 74 20 61 70 70 65 6e 64 73 20 74 68 65 20   It appends the 
79c0: 61 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 0a 2a  authentication.*
79d0: 2a 20 74 79 70 65 20 63 6f 64 65 20 61 6e 64 20  * type code and 
79e0: 74 68 65 20 74 77 6f 20 61 72 67 75 6d 65 6e 74  the two argument
79f0: 73 20 74 6f 20 7a 43 6d 64 5b 5d 20 74 68 65 6e  s to zCmd[] then
7a00: 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 72 65 73   invokes the res
7a10: 75 6c 74 0a 2a 2a 20 6f 6e 20 74 68 65 20 69 6e  ult.** on the in
7a20: 74 65 72 70 72 65 74 65 72 2e 20 20 54 68 65 20  terpreter.  The 
7a30: 72 65 70 6c 79 20 69 73 20 65 78 61 6d 69 6e 65  reply is examine
7a40: 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69  d to determine i
7a50: 66 20 74 68 65 0a 2a 2a 20 61 75 74 68 65 6e 74  f the.** authent
7a60: 69 63 61 74 69 6f 6e 20 66 61 69 6c 73 20 6f 72  ication fails or
7a70: 20 73 75 63 63 65 65 64 73 2e 0a 2a 2f 0a 73 74   succeeds..*/.st
7a80: 61 74 69 63 20 69 6e 74 20 61 75 74 68 5f 63 61  atic int auth_ca
7a90: 6c 6c 62 61 63 6b 28 0a 20 20 76 6f 69 64 20 2a  llback(.  void *
7aa0: 70 41 72 67 2c 0a 20 20 69 6e 74 20 63 6f 64 65  pArg,.  int code
7ab0: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
7ac0: 7a 41 72 67 31 2c 0a 20 20 63 6f 6e 73 74 20 63  zArg1,.  const c
7ad0: 68 61 72 20 2a 7a 41 72 67 32 2c 0a 20 20 63 6f  har *zArg2,.  co
7ae0: 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67 33 2c  nst char *zArg3,
7af0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
7b00: 41 72 67 34 0a 23 69 66 64 65 66 20 53 51 4c 49  Arg4.#ifdef SQLI
7b10: 54 45 5f 55 53 45 52 5f 41 55 54 48 45 4e 54 49  TE_USER_AUTHENTI
7b20: 43 41 54 49 4f 4e 0a 20 20 2c 63 6f 6e 73 74 20  CATION.  ,const 
7b30: 63 68 61 72 20 2a 7a 41 72 67 35 0a 23 65 6e 64  char *zArg5.#end
7b40: 69 66 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  if.){.  const ch
7b50: 61 72 20 2a 7a 43 6f 64 65 3b 0a 20 20 54 63 6c  ar *zCode;.  Tcl
7b60: 5f 44 53 74 72 69 6e 67 20 73 74 72 3b 0a 20 20  _DString str;.  
7b70: 69 6e 74 20 72 63 3b 0a 20 20 63 6f 6e 73 74 20  int rc;.  const 
7b80: 63 68 61 72 20 2a 7a 52 65 70 6c 79 3b 0a 20 20  char *zReply;.  
7b90: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
7ba0: 52 2d 33 38 35 39 30 2d 36 32 37 36 39 20 54 68  R-38590-62769 Th
7bb0: 65 20 66 69 72 73 74 20 70 61 72 61 6d 65 74 65  e first paramete
7bc0: 72 20 74 6f 20 74 68 65 20 61 75 74 68 6f 72 69  r to the authori
7bd0: 7a 65 72 0a 20 20 2a 2a 20 63 61 6c 6c 62 61 63  zer.  ** callbac
7be0: 6b 20 69 73 20 61 20 63 6f 70 79 20 6f 66 20 74  k is a copy of t
7bf0: 68 65 20 74 68 69 72 64 20 70 61 72 61 6d 65 74  he third paramet
7c00: 65 72 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 73  er to the.  ** s
7c10: 71 6c 69 74 65 33 5f 73 65 74 5f 61 75 74 68 6f  qlite3_set_autho
7c20: 72 69 7a 65 72 28 29 20 69 6e 74 65 72 66 61 63  rizer() interfac
7c30: 65 2e 0a 20 20 2a 2f 0a 20 20 53 71 6c 69 74 65  e..  */.  Sqlite
7c40: 44 62 20 2a 70 44 62 20 3d 20 28 53 71 6c 69 74  Db *pDb = (Sqlit
7c50: 65 44 62 2a 29 70 41 72 67 3b 0a 20 20 69 66 28  eDb*)pArg;.  if(
7c60: 20 70 44 62 2d 3e 64 69 73 61 62 6c 65 41 75 74   pDb->disableAut
7c70: 68 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  h ) return SQLIT
7c80: 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 45 56 49 44  E_OK;..  /* EVID
7c90: 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 36 35 31 38  ENCE-OF: R-56518
7ca0: 2d 34 34 33 31 30 20 54 68 65 20 73 65 63 6f 6e  -44310 The secon
7cb0: 64 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20 74  d parameter to t
7cc0: 68 65 20 63 61 6c 6c 62 61 63 6b 20 69 73 20 61  he callback is a
7cd0: 6e 0a 20 20 2a 2a 20 69 6e 74 65 67 65 72 20 61  n.  ** integer a
7ce0: 63 74 69 6f 6e 20 63 6f 64 65 20 74 68 61 74 20  ction code that 
7cf0: 73 70 65 63 69 66 69 65 73 20 74 68 65 20 70 61  specifies the pa
7d00: 72 74 69 63 75 6c 61 72 20 61 63 74 69 6f 6e 20  rticular action 
7d10: 74 6f 20 62 65 0a 20 20 2a 2a 20 61 75 74 68 6f  to be.  ** autho
7d20: 72 69 7a 65 64 2e 20 2a 2f 0a 20 20 73 77 69 74  rized. */.  swit
7d30: 63 68 28 20 63 6f 64 65 20 29 7b 0a 20 20 20 20  ch( code ){.    
7d40: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 50 59  case SQLITE_COPY
7d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3a 20                : 
7d60: 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43 4f  zCode="SQLITE_CO
7d70: 50 59 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  PY"; break;.    
7d80: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 52 45 41  case SQLITE_CREA
7d90: 54 45 5f 49 4e 44 45 58 20 20 20 20 20 20 3a 20  TE_INDEX      : 
7da0: 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43 52  zCode="SQLITE_CR
7db0: 45 41 54 45 5f 49 4e 44 45 58 22 3b 20 62 72 65  EATE_INDEX"; bre
7dc0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
7dd0: 49 54 45 5f 43 52 45 41 54 45 5f 54 41 42 4c 45  ITE_CREATE_TABLE
7de0: 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53        : zCode="S
7df0: 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 41 42  QLITE_CREATE_TAB
7e00: 4c 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  LE"; break;.    
7e10: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 52 45 41  case SQLITE_CREA
7e20: 54 45 5f 54 45 4d 50 5f 49 4e 44 45 58 20 3a 20  TE_TEMP_INDEX : 
7e30: 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43 52  zCode="SQLITE_CR
7e40: 45 41 54 45 5f 54 45 4d 50 5f 49 4e 44 45 58 22  EATE_TEMP_INDEX"
7e50: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
7e60: 65 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  e SQLITE_CREATE_
7e70: 54 45 4d 50 5f 54 41 42 4c 45 20 3a 20 7a 43 6f  TEMP_TABLE : zCo
7e80: 64 65 3d 22 53 51 4c 49 54 45 5f 43 52 45 41 54  de="SQLITE_CREAT
7e90: 45 5f 54 45 4d 50 5f 54 41 42 4c 45 22 3b 20 62  E_TEMP_TABLE"; b
7ea0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
7eb0: 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d  QLITE_CREATE_TEM
7ec0: 50 5f 54 52 49 47 47 45 52 3a 20 7a 43 6f 64 65  P_TRIGGER: zCode
7ed0: 3d 22 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  ="SQLITE_CREATE_
7ee0: 54 45 4d 50 5f 54 52 49 47 47 45 52 22 3b 20 62  TEMP_TRIGGER"; b
7ef0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
7f00: 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d  QLITE_CREATE_TEM
7f10: 50 5f 56 49 45 57 20 20 3a 20 7a 43 6f 64 65 3d  P_VIEW  : zCode=
7f20: 22 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54  "SQLITE_CREATE_T
7f30: 45 4d 50 5f 56 49 45 57 22 3b 20 62 72 65 61 6b  EMP_VIEW"; break
7f40: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
7f50: 45 5f 43 52 45 41 54 45 5f 54 52 49 47 47 45 52  E_CREATE_TRIGGER
7f60: 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c      : zCode="SQL
7f70: 49 54 45 5f 43 52 45 41 54 45 5f 54 52 49 47 47  ITE_CREATE_TRIGG
7f80: 45 52 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  ER"; break;.    
7f90: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 52 45 41  case SQLITE_CREA
7fa0: 54 45 5f 56 49 45 57 20 20 20 20 20 20 20 3a 20  TE_VIEW       : 
7fb0: 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43 52  zCode="SQLITE_CR
7fc0: 45 41 54 45 5f 56 49 45 57 22 3b 20 62 72 65 61  EATE_VIEW"; brea
7fd0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
7fe0: 54 45 5f 44 45 4c 45 54 45 20 20 20 20 20 20 20  TE_DELETE       
7ff0: 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51       : zCode="SQ
8000: 4c 49 54 45 5f 44 45 4c 45 54 45 22 3b 20 62 72  LITE_DELETE"; br
8010: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
8020: 4c 49 54 45 5f 44 52 4f 50 5f 49 4e 44 45 58 20  LITE_DROP_INDEX 
8030: 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22         : zCode="
8040: 53 51 4c 49 54 45 5f 44 52 4f 50 5f 49 4e 44 45  SQLITE_DROP_INDE
8050: 58 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  X"; break;.    c
8060: 61 73 65 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f  ase SQLITE_DROP_
8070: 54 41 42 4c 45 20 20 20 20 20 20 20 20 3a 20 7a  TABLE        : z
8080: 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f  Code="SQLITE_DRO
8090: 50 5f 54 41 42 4c 45 22 3b 20 62 72 65 61 6b 3b  P_TABLE"; break;
80a0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
80b0: 5f 44 52 4f 50 5f 54 45 4d 50 5f 49 4e 44 45 58  _DROP_TEMP_INDEX
80c0: 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49     : zCode="SQLI
80d0: 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 49 4e 44  TE_DROP_TEMP_IND
80e0: 45 58 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  EX"; break;.    
80f0: 63 61 73 65 20 53 51 4c 49 54 45 5f 44 52 4f 50  case SQLITE_DROP
8100: 5f 54 45 4d 50 5f 54 41 42 4c 45 20 20 20 3a 20  _TEMP_TABLE   : 
8110: 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44 52  zCode="SQLITE_DR
8120: 4f 50 5f 54 45 4d 50 5f 54 41 42 4c 45 22 3b 20  OP_TEMP_TABLE"; 
8130: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
8140: 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50  SQLITE_DROP_TEMP
8150: 5f 54 52 49 47 47 45 52 20 3a 20 7a 43 6f 64 65  _TRIGGER : zCode
8160: 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45  ="SQLITE_DROP_TE
8170: 4d 50 5f 54 52 49 47 47 45 52 22 3b 20 62 72 65  MP_TRIGGER"; bre
8180: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
8190: 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 56 49  ITE_DROP_TEMP_VI
81a0: 45 57 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53  EW    : zCode="S
81b0: 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f  QLITE_DROP_TEMP_
81c0: 56 49 45 57 22 3b 20 62 72 65 61 6b 3b 0a 20 20  VIEW"; break;.  
81d0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44 52    case SQLITE_DR
81e0: 4f 50 5f 54 52 49 47 47 45 52 20 20 20 20 20 20  OP_TRIGGER      
81f0: 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f  : zCode="SQLITE_
8200: 44 52 4f 50 5f 54 52 49 47 47 45 52 22 3b 20 62  DROP_TRIGGER"; b
8210: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
8220: 51 4c 49 54 45 5f 44 52 4f 50 5f 56 49 45 57 20  QLITE_DROP_VIEW 
8230: 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d          : zCode=
8240: 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56 49 45  "SQLITE_DROP_VIE
8250: 57 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  W"; break;.    c
8260: 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 53 45 52  ase SQLITE_INSER
8270: 54 20 20 20 20 20 20 20 20 20 20 20 20 3a 20 7a  T            : z
8280: 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 49 4e 53  Code="SQLITE_INS
8290: 45 52 54 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  ERT"; break;.   
82a0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 50 52 41   case SQLITE_PRA
82b0: 47 4d 41 20 20 20 20 20 20 20 20 20 20 20 20 3a  GMA            :
82c0: 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 50   zCode="SQLITE_P
82d0: 52 41 47 4d 41 22 3b 20 62 72 65 61 6b 3b 0a 20  RAGMA"; break;. 
82e0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 52     case SQLITE_R
82f0: 45 41 44 20 20 20 20 20 20 20 20 20 20 20 20 20  EAD             
8300: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
8310: 5f 52 45 41 44 22 3b 20 62 72 65 61 6b 3b 0a 20  _READ"; break;. 
8320: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 53     case SQLITE_S
8330: 45 4c 45 43 54 20 20 20 20 20 20 20 20 20 20 20  ELECT           
8340: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
8350: 5f 53 45 4c 45 43 54 22 3b 20 62 72 65 61 6b 3b  _SELECT"; break;
8360: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
8370: 5f 54 52 41 4e 53 41 43 54 49 4f 4e 20 20 20 20  _TRANSACTION    
8380: 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49     : zCode="SQLI
8390: 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 22 3b  TE_TRANSACTION";
83a0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
83b0: 20 53 51 4c 49 54 45 5f 55 50 44 41 54 45 20 20   SQLITE_UPDATE  
83c0: 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64            : zCod
83d0: 65 3d 22 53 51 4c 49 54 45 5f 55 50 44 41 54 45  e="SQLITE_UPDATE
83e0: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
83f0: 73 65 20 53 51 4c 49 54 45 5f 41 54 54 41 43 48  se SQLITE_ATTACH
8400: 20 20 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43              : zC
8410: 6f 64 65 3d 22 53 51 4c 49 54 45 5f 41 54 54 41  ode="SQLITE_ATTA
8420: 43 48 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  CH"; break;.    
8430: 63 61 73 65 20 53 51 4c 49 54 45 5f 44 45 54 41  case SQLITE_DETA
8440: 43 48 20 20 20 20 20 20 20 20 20 20 20 20 3a 20  CH            : 
8450: 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44 45  zCode="SQLITE_DE
8460: 54 41 43 48 22 3b 20 62 72 65 61 6b 3b 0a 20 20  TACH"; break;.  
8470: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 4c    case SQLITE_AL
8480: 54 45 52 5f 54 41 42 4c 45 20 20 20 20 20 20 20  TER_TABLE       
8490: 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f  : zCode="SQLITE_
84a0: 41 4c 54 45 52 5f 54 41 42 4c 45 22 3b 20 62 72  ALTER_TABLE"; br
84b0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
84c0: 4c 49 54 45 5f 52 45 49 4e 44 45 58 20 20 20 20  LITE_REINDEX    
84d0: 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22         : zCode="
84e0: 53 51 4c 49 54 45 5f 52 45 49 4e 44 45 58 22 3b  SQLITE_REINDEX";
84f0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
8500: 20 53 51 4c 49 54 45 5f 41 4e 41 4c 59 5a 45 20   SQLITE_ANALYZE 
8510: 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64            : zCod
8520: 65 3d 22 53 51 4c 49 54 45 5f 41 4e 41 4c 59 5a  e="SQLITE_ANALYZ
8530: 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  E"; break;.    c
8540: 61 73 65 20 53 51 4c 49 54 45 5f 43 52 45 41 54  ase SQLITE_CREAT
8550: 45 5f 56 54 41 42 4c 45 20 20 20 20 20 3a 20 7a  E_VTABLE     : z
8560: 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43 52 45  Code="SQLITE_CRE
8570: 41 54 45 5f 56 54 41 42 4c 45 22 3b 20 62 72 65  ATE_VTABLE"; bre
8580: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
8590: 49 54 45 5f 44 52 4f 50 5f 56 54 41 42 4c 45 20  ITE_DROP_VTABLE 
85a0: 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53        : zCode="S
85b0: 51 4c 49 54 45 5f 44 52 4f 50 5f 56 54 41 42 4c  QLITE_DROP_VTABL
85c0: 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  E"; break;.    c
85d0: 61 73 65 20 53 51 4c 49 54 45 5f 46 55 4e 43 54  ase SQLITE_FUNCT
85e0: 49 4f 4e 20 20 20 20 20 20 20 20 20 20 3a 20 7a  ION          : z
85f0: 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 46 55 4e  Code="SQLITE_FUN
8600: 43 54 49 4f 4e 22 3b 20 62 72 65 61 6b 3b 0a 20  CTION"; break;. 
8610: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 53     case SQLITE_S
8620: 41 56 45 50 4f 49 4e 54 20 20 20 20 20 20 20 20  AVEPOINT        
8630: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
8640: 5f 53 41 56 45 50 4f 49 4e 54 22 3b 20 62 72 65  _SAVEPOINT"; bre
8650: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
8660: 49 54 45 5f 52 45 43 55 52 53 49 56 45 20 20 20  ITE_RECURSIVE   
8670: 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53        : zCode="S
8680: 51 4c 49 54 45 5f 52 45 43 55 52 53 49 56 45 22  QLITE_RECURSIVE"
8690: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66  ; break;.    def
86a0: 61 75 6c 74 20 20 20 20 20 20 20 20 20 20 20 20  ault            
86b0: 20 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f             : zCo
86c0: 64 65 3d 22 3f 3f 3f 3f 22 3b 20 62 72 65 61 6b  de="????"; break
86d0: 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 44 53 74 72  ;.  }.  Tcl_DStr
86e0: 69 6e 67 49 6e 69 74 28 26 73 74 72 29 3b 0a 20  ingInit(&str);. 
86f0: 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65   Tcl_DStringAppe
8700: 6e 64 28 26 73 74 72 2c 20 70 44 62 2d 3e 7a 41  nd(&str, pDb->zA
8710: 75 74 68 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f  uth, -1);.  Tcl_
8720: 44 53 74 72 69 6e 67 41 70 70 65 6e 64 45 6c 65  DStringAppendEle
8730: 6d 65 6e 74 28 26 73 74 72 2c 20 7a 43 6f 64 65  ment(&str, zCode
8740: 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  );.  Tcl_DString
8750: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 26 73  AppendElement(&s
8760: 74 72 2c 20 7a 41 72 67 31 20 3f 20 7a 41 72 67  tr, zArg1 ? zArg
8770: 31 20 3a 20 22 22 29 3b 0a 20 20 54 63 6c 5f 44  1 : "");.  Tcl_D
8780: 53 74 72 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d  StringAppendElem
8790: 65 6e 74 28 26 73 74 72 2c 20 7a 41 72 67 32 20  ent(&str, zArg2 
87a0: 3f 20 7a 41 72 67 32 20 3a 20 22 22 29 3b 0a 20  ? zArg2 : "");. 
87b0: 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65   Tcl_DStringAppe
87c0: 6e 64 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c 20  ndElement(&str, 
87d0: 7a 41 72 67 33 20 3f 20 7a 41 72 67 33 20 3a 20  zArg3 ? zArg3 : 
87e0: 22 22 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69  "");.  Tcl_DStri
87f0: 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  ngAppendElement(
8800: 26 73 74 72 2c 20 7a 41 72 67 34 20 3f 20 7a 41  &str, zArg4 ? zA
8810: 72 67 34 20 3a 20 22 22 29 3b 0a 23 69 66 64 65  rg4 : "");.#ifde
8820: 66 20 53 51 4c 49 54 45 5f 55 53 45 52 5f 41 55  f SQLITE_USER_AU
8830: 54 48 45 4e 54 49 43 41 54 49 4f 4e 0a 20 20 54  THENTICATION.  T
8840: 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64  cl_DStringAppend
8850: 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c 20 7a 41  Element(&str, zA
8860: 72 67 35 20 3f 20 7a 41 72 67 35 20 3a 20 22 22  rg5 ? zArg5 : ""
8870: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 63 20 3d  );.#endif.  rc =
8880: 20 54 63 6c 5f 47 6c 6f 62 61 6c 45 76 61 6c 28   Tcl_GlobalEval(
8890: 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20 54 63 6c  pDb->interp, Tcl
88a0: 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 73  _DStringValue(&s
88b0: 74 72 29 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72  tr));.  Tcl_DStr
88c0: 69 6e 67 46 72 65 65 28 26 73 74 72 29 3b 0a 20  ingFree(&str);. 
88d0: 20 7a 52 65 70 6c 79 20 3d 20 72 63 3d 3d 54 43   zReply = rc==TC
88e0: 4c 5f 4f 4b 20 3f 20 54 63 6c 5f 47 65 74 53 74  L_OK ? Tcl_GetSt
88f0: 72 69 6e 67 52 65 73 75 6c 74 28 70 44 62 2d 3e  ringResult(pDb->
8900: 69 6e 74 65 72 70 29 20 3a 20 22 53 51 4c 49 54  interp) : "SQLIT
8910: 45 5f 44 45 4e 59 22 3b 0a 20 20 69 66 28 20 73  E_DENY";.  if( s
8920: 74 72 63 6d 70 28 7a 52 65 70 6c 79 2c 22 53 51  trcmp(zReply,"SQ
8930: 4c 49 54 45 5f 4f 4b 22 29 3d 3d 30 20 29 7b 0a  LITE_OK")==0 ){.
8940: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
8950: 4f 4b 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  OK;.  }else if( 
8960: 73 74 72 63 6d 70 28 7a 52 65 70 6c 79 2c 22 53  strcmp(zReply,"S
8970: 51 4c 49 54 45 5f 44 45 4e 59 22 29 3d 3d 30 20  QLITE_DENY")==0 
8980: 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
8990: 54 45 5f 44 45 4e 59 3b 0a 20 20 7d 65 6c 73 65  TE_DENY;.  }else
89a0: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 52 65 70   if( strcmp(zRep
89b0: 6c 79 2c 22 53 51 4c 49 54 45 5f 49 47 4e 4f 52  ly,"SQLITE_IGNOR
89c0: 45 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63  E")==0 ){.    rc
89d0: 20 3d 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45   = SQLITE_IGNORE
89e0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
89f0: 63 20 3d 20 39 39 39 3b 0a 20 20 7d 0a 20 20 72  c = 999;.  }.  r
8a00: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64  eturn rc;.}.#end
8a10: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
8a20: 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 20  T_AUTHORIZATION 
8a30: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  */../*.** This r
8a40: 6f 75 74 69 6e 65 20 72 65 61 64 73 20 61 20 6c  outine reads a l
8a50: 69 6e 65 20 6f 66 20 74 65 78 74 20 66 72 6f 6d  ine of text from
8a60: 20 46 49 4c 45 20 69 6e 2c 20 73 74 6f 72 65 73   FILE in, stores
8a70: 0a 2a 2a 20 74 68 65 20 74 65 78 74 20 69 6e 20  .** the text in 
8a80: 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20  memory obtained 
8a90: 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 20 61 6e  from malloc() an
8aa0: 64 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e  d returns a poin
8ab0: 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 74 65  ter.** to the te
8ac0: 78 74 2e 20 20 4e 55 4c 4c 20 69 73 20 72 65 74  xt.  NULL is ret
8ad0: 75 72 6e 65 64 20 61 74 20 65 6e 64 20 6f 66 20  urned at end of 
8ae0: 66 69 6c 65 2c 20 6f 72 20 69 66 20 6d 61 6c 6c  file, or if mall
8af0: 6f 63 28 29 0a 2a 2a 20 66 61 69 6c 73 2e 0a 2a  oc().** fails..*
8b00: 2a 0a 2a 2a 20 54 68 65 20 69 6e 74 65 72 66 61  *.** The interfa
8b10: 63 65 20 69 73 20 6c 69 6b 65 20 22 72 65 61 64  ce is like "read
8b20: 6c 69 6e 65 22 20 62 75 74 20 6e 6f 20 63 6f 6d  line" but no com
8b30: 6d 61 6e 64 2d 6c 69 6e 65 20 65 64 69 74 69 6e  mand-line editin
8b40: 67 0a 2a 2a 20 69 73 20 64 6f 6e 65 2e 0a 2a 2a  g.** is done..**
8b50: 0a 2a 2a 20 63 6f 70 69 65 64 20 66 72 6f 6d 20  .** copied from 
8b60: 73 68 65 6c 6c 2e 63 20 66 72 6f 6d 20 27 2e 69  shell.c from '.i
8b70: 6d 70 6f 72 74 27 20 63 6f 6d 6d 61 6e 64 0a 2a  mport' command.*
8b80: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 6c  /.static char *l
8b90: 6f 63 61 6c 5f 67 65 74 6c 69 6e 65 28 63 68 61  ocal_getline(cha
8ba0: 72 20 2a 7a 50 72 6f 6d 70 74 2c 20 46 49 4c 45  r *zPrompt, FILE
8bb0: 20 2a 69 6e 29 7b 0a 20 20 63 68 61 72 20 2a 7a   *in){.  char *z
8bc0: 4c 69 6e 65 3b 0a 20 20 69 6e 74 20 6e 4c 69 6e  Line;.  int nLin
8bd0: 65 3b 0a 20 20 69 6e 74 20 6e 3b 0a 0a 20 20 6e  e;.  int n;..  n
8be0: 4c 69 6e 65 20 3d 20 31 30 30 3b 0a 20 20 7a 4c  Line = 100;.  zL
8bf0: 69 6e 65 20 3d 20 6d 61 6c 6c 6f 63 28 20 6e 4c  ine = malloc( nL
8c00: 69 6e 65 20 29 3b 0a 20 20 69 66 28 20 7a 4c 69  ine );.  if( zLi
8c10: 6e 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ne==0 ) return 0
8c20: 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20 20 77 68 69  ;.  n = 0;.  whi
8c30: 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 69 66 28  le( 1 ){.    if(
8c40: 20 6e 2b 31 30 30 3e 6e 4c 69 6e 65 20 29 7b 0a   n+100>nLine ){.
8c50: 20 20 20 20 20 20 6e 4c 69 6e 65 20 3d 20 6e 4c        nLine = nL
8c60: 69 6e 65 2a 32 20 2b 20 31 30 30 3b 0a 20 20 20  ine*2 + 100;.   
8c70: 20 20 20 7a 4c 69 6e 65 20 3d 20 72 65 61 6c 6c     zLine = reall
8c80: 6f 63 28 7a 4c 69 6e 65 2c 20 6e 4c 69 6e 65 29  oc(zLine, nLine)
8c90: 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 4c 69 6e  ;.      if( zLin
8ca0: 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  e==0 ) return 0;
8cb0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 66  .    }.    if( f
8cc0: 67 65 74 73 28 26 7a 4c 69 6e 65 5b 6e 5d 2c 20  gets(&zLine[n], 
8cd0: 6e 4c 69 6e 65 20 2d 20 6e 2c 20 69 6e 29 3d 3d  nLine - n, in)==
8ce0: 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e  0 ){.      if( n
8cf0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66  ==0 ){.        f
8d00: 72 65 65 28 7a 4c 69 6e 65 29 3b 0a 20 20 20 20  ree(zLine);.    
8d10: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
8d20: 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 4c 69 6e      }.      zLin
8d30: 65 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  e[n] = 0;.      
8d40: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
8d50: 20 77 68 69 6c 65 28 20 7a 4c 69 6e 65 5b 6e 5d   while( zLine[n]
8d60: 20 29 7b 20 6e 2b 2b 3b 20 7d 0a 20 20 20 20 69   ){ n++; }.    i
8d70: 66 28 20 6e 3e 30 20 26 26 20 7a 4c 69 6e 65 5b  f( n>0 && zLine[
8d80: 6e 2d 31 5d 3d 3d 27 5c 6e 27 20 29 7b 0a 20 20  n-1]=='\n' ){.  
8d90: 20 20 20 20 6e 2d 2d 3b 0a 20 20 20 20 20 20 7a      n--;.      z
8da0: 4c 69 6e 65 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20  Line[n] = 0;.   
8db0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
8dc0: 20 20 7d 0a 20 20 7a 4c 69 6e 65 20 3d 20 72 65    }.  zLine = re
8dd0: 61 6c 6c 6f 63 28 20 7a 4c 69 6e 65 2c 20 6e 2b  alloc( zLine, n+
8de0: 31 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 4c  1 );.  return zL
8df0: 69 6e 65 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54  ine;.}.../*.** T
8e00: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
8e10: 70 61 72 74 20 6f 66 20 74 68 65 20 69 6d 70 6c  part of the impl
8e20: 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  ementation of th
8e30: 65 20 63 6f 6d 6d 61 6e 64 3a 0a 2a 2a 0a 2a 2a  e command:.**.**
8e40: 20 20 20 24 64 62 20 74 72 61 6e 73 61 63 74 69     $db transacti
8e50: 6f 6e 20 5b 2d 64 65 66 65 72 72 65 64 7c 2d 69  on [-deferred|-i
8e60: 6d 6d 65 64 69 61 74 65 7c 2d 65 78 63 6c 75 73  mmediate|-exclus
8e70: 69 76 65 5d 20 53 43 52 49 50 54 0a 2a 2a 0a 2a  ive] SCRIPT.**.*
8e80: 2a 20 49 74 20 69 73 20 69 6e 76 6f 6b 65 64 20  * It is invoked 
8e90: 61 66 74 65 72 20 65 76 61 6c 75 61 74 69 6e 67  after evaluating
8ea0: 20 74 68 65 20 73 63 72 69 70 74 20 53 43 52 49   the script SCRI
8eb0: 50 54 20 74 6f 20 63 6f 6d 6d 69 74 20 6f 72 20  PT to commit or 
8ec0: 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 74 68 65 20  rollback.** the 
8ed0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 72 20 73  transaction or s
8ee0: 61 76 65 70 6f 69 6e 74 20 6f 70 65 6e 65 64 20  avepoint opened 
8ef0: 62 79 20 74 68 65 20 5b 74 72 61 6e 73 61 63 74  by the [transact
8f00: 69 6f 6e 5d 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f  ion] command..*/
8f10: 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
8f20: 54 45 5f 54 43 4c 41 50 49 20 44 62 54 72 61 6e  TE_TCLAPI DbTran
8f30: 73 50 6f 73 74 43 6d 64 28 0a 20 20 43 6c 69 65  sPostCmd(.  Clie
8f40: 6e 74 44 61 74 61 20 64 61 74 61 5b 5d 2c 20 20  ntData data[],  
8f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8f60: 20 2f 2a 20 64 61 74 61 5b 30 5d 20 69 73 20 74   /* data[0] is t
8f70: 68 65 20 53 71 6c 69 74 65 33 44 62 2a 20 66 6f  he Sqlite3Db* fo
8f80: 72 20 24 64 62 20 2a 2f 0a 20 20 54 63 6c 5f 49  r $db */.  Tcl_I
8f90: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
8fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8fb0: 2f 2a 20 54 63 6c 20 69 6e 74 65 72 70 72 65 74  /* Tcl interpret
8fc0: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73 75  er */.  int resu
8fd0: 6c 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  lt              
8fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8ff0: 52 65 73 75 6c 74 20 6f 66 20 65 76 61 6c 75 61  Result of evalua
9000: 74 69 6e 67 20 53 43 52 49 50 54 20 2a 2f 0a 29  ting SCRIPT */.)
9010: 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  {.  static const
9020: 20 63 68 61 72 20 2a 63 6f 6e 73 74 20 61 7a 45   char *const azE
9030: 6e 64 5b 5d 20 3d 20 7b 0a 20 20 20 20 22 52 45  nd[] = {.    "RE
9040: 4c 45 41 53 45 20 5f 74 63 6c 5f 74 72 61 6e 73  LEASE _tcl_trans
9050: 61 63 74 69 6f 6e 22 2c 20 20 20 20 20 20 20 20  action",        
9060: 2f 2a 20 72 63 3d 3d 54 43 4c 5f 45 52 52 4f 52  /* rc==TCL_ERROR
9070: 2c 20 6e 54 72 61 6e 73 61 63 74 69 6f 6e 21 3d  , nTransaction!=
9080: 30 20 2a 2f 0a 20 20 20 20 22 43 4f 4d 4d 49 54  0 */.    "COMMIT
9090: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
90a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 72              /* r
90b0: 63 21 3d 54 43 4c 5f 45 52 52 4f 52 2c 20 6e 54  c!=TCL_ERROR, nT
90c0: 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 30 20 2a 2f  ransaction==0 */
90d0: 0a 20 20 20 20 22 52 4f 4c 4c 42 41 43 4b 20 54  .    "ROLLBACK T
90e0: 4f 20 5f 74 63 6c 5f 74 72 61 6e 73 61 63 74 69  O _tcl_transacti
90f0: 6f 6e 20 3b 20 52 45 4c 45 41 53 45 20 5f 74 63  on ; RELEASE _tc
9100: 6c 5f 74 72 61 6e 73 61 63 74 69 6f 6e 22 2c 0a  l_transaction",.
9110: 20 20 20 20 22 52 4f 4c 4c 42 41 43 4b 22 20 20      "ROLLBACK"  
9120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9130: 20 20 20 20 20 20 20 2f 2a 20 72 63 3d 3d 54 43         /* rc==TC
9140: 4c 5f 45 52 52 4f 52 2c 20 6e 54 72 61 6e 73 61  L_ERROR, nTransa
9150: 63 74 69 6f 6e 3d 3d 30 20 2a 2f 0a 20 20 7d 3b  ction==0 */.  };
9160: 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62  .  SqliteDb *pDb
9170: 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 64 61   = (SqliteDb*)da
9180: 74 61 5b 30 5d 3b 0a 20 20 69 6e 74 20 72 63 20  ta[0];.  int rc 
9190: 3d 20 72 65 73 75 6c 74 3b 0a 20 20 63 6f 6e 73  = result;.  cons
91a0: 74 20 63 68 61 72 20 2a 7a 45 6e 64 3b 0a 0a 20  t char *zEnd;.. 
91b0: 20 70 44 62 2d 3e 6e 54 72 61 6e 73 61 63 74 69   pDb->nTransacti
91c0: 6f 6e 2d 2d 3b 0a 20 20 7a 45 6e 64 20 3d 20 61  on--;.  zEnd = a
91d0: 7a 45 6e 64 5b 28 72 63 3d 3d 54 43 4c 5f 45 52  zEnd[(rc==TCL_ER
91e0: 52 4f 52 29 2a 32 20 2b 20 28 70 44 62 2d 3e 6e  ROR)*2 + (pDb->n
91f0: 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 30 29 5d  Transaction==0)]
9200: 3b 0a 0a 20 20 70 44 62 2d 3e 64 69 73 61 62 6c  ;..  pDb->disabl
9210: 65 41 75 74 68 2b 2b 3b 0a 20 20 69 66 28 20 73  eAuth++;.  if( s
9220: 71 6c 69 74 65 33 5f 65 78 65 63 28 70 44 62 2d  qlite3_exec(pDb-
9230: 3e 64 62 2c 20 7a 45 6e 64 2c 20 30 2c 20 30 2c  >db, zEnd, 0, 0,
9240: 20 30 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20   0) ){.      /* 
9250: 54 68 69 73 20 69 73 20 61 20 74 72 69 63 6b 79  This is a tricky
9260: 20 73 63 65 6e 61 72 69 6f 20 74 6f 20 68 61 6e   scenario to han
9270: 64 6c 65 2e 20 54 68 65 20 6d 6f 73 74 20 6c 69  dle. The most li
9280: 6b 65 6c 79 20 63 61 75 73 65 20 6f 66 20 61 6e  kely cause of an
9290: 0a 20 20 20 20 20 20 2a 2a 20 65 72 72 6f 72 20  .      ** error 
92a0: 69 73 20 74 68 61 74 20 74 68 65 20 65 78 65 63  is that the exec
92b0: 28 29 20 61 62 6f 76 65 20 77 61 73 20 61 6e 20  () above was an 
92c0: 61 74 74 65 6d 70 74 20 74 6f 20 63 6f 6d 6d 69  attempt to commi
92d0: 74 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 74  t the.      ** t
92e0: 6f 70 2d 6c 65 76 65 6c 20 74 72 61 6e 73 61 63  op-level transac
92f0: 74 69 6f 6e 20 74 68 61 74 20 72 65 74 75 72 6e  tion that return
9300: 65 64 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20  ed SQLITE_BUSY. 
9310: 4f 72 2c 20 6c 65 73 73 20 6c 69 6b 65 6c 79 2c  Or, less likely,
9320: 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 61  .      ** that a
9330: 6e 20 49 4f 2d 65 72 72 6f 72 20 68 61 73 20 6f  n IO-error has o
9340: 63 63 75 72 72 65 64 2e 20 49 6e 20 65 69 74 68  ccurred. In eith
9350: 65 72 20 63 61 73 65 2c 20 74 68 72 6f 77 20 61  er case, throw a
9360: 20 54 63 6c 20 65 78 63 65 70 74 69 6f 6e 0a 20   Tcl exception. 
9370: 20 20 20 20 20 2a 2a 20 61 6e 64 20 74 72 79 20       ** and try 
9380: 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20  to rollback the 
9390: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20  transaction..   
93a0: 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 42     **.      ** B
93b0: 75 74 20 69 74 20 63 6f 75 6c 64 20 61 6c 73 6f  ut it could also
93c0: 20 62 65 20 74 68 61 74 20 74 68 65 20 75 73 65   be that the use
93d0: 72 20 65 78 65 63 75 74 65 64 20 6f 6e 65 20 6f  r executed one o
93e0: 72 20 6d 6f 72 65 20 42 45 47 49 4e 2c 0a 20 20  r more BEGIN,.  
93f0: 20 20 20 20 2a 2a 20 43 4f 4d 4d 49 54 2c 20 53      ** COMMIT, S
9400: 41 56 45 50 4f 49 4e 54 2c 20 52 45 4c 45 41 53  AVEPOINT, RELEAS
9410: 45 20 6f 72 20 52 4f 4c 4c 42 41 43 4b 20 63 6f  E or ROLLBACK co
9420: 6d 6d 61 6e 64 73 20 74 68 61 74 20 61 72 65 20  mmands that are 
9430: 63 6f 6e 66 75 73 69 6e 67 0a 20 20 20 20 20 20  confusing.      
9440: 2a 2a 20 74 68 69 73 20 6d 65 74 68 6f 64 27 73  ** this method's
9450: 20 6c 6f 67 69 63 2e 20 4e 6f 74 20 63 6c 65 61   logic. Not clea
9460: 72 20 68 6f 77 20 74 68 69 73 20 77 6f 75 6c 64  r how this would
9470: 20 62 65 20 62 65 73 74 20 68 61 6e 64 6c 65 64   be best handled
9480: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 69  ..      */.    i
9490: 66 28 20 72 63 21 3d 54 43 4c 5f 45 52 52 4f 52  f( rc!=TCL_ERROR
94a0: 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70   ){.      Tcl_Ap
94b0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
94c0: 70 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  p, sqlite3_errms
94d0: 67 28 70 44 62 2d 3e 64 62 29 2c 20 28 63 68 61  g(pDb->db), (cha
94e0: 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 72 63 20  r*)0);.      rc 
94f0: 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  = TCL_ERROR;.   
9500: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 65   }.    sqlite3_e
9510: 78 65 63 28 70 44 62 2d 3e 64 62 2c 20 22 52 4f  xec(pDb->db, "RO
9520: 4c 4c 42 41 43 4b 22 2c 20 30 2c 20 30 2c 20 30  LLBACK", 0, 0, 0
9530: 29 3b 0a 20 20 7d 0a 20 20 70 44 62 2d 3e 64 69  );.  }.  pDb->di
9540: 73 61 62 6c 65 41 75 74 68 2d 2d 3b 0a 0a 20 20  sableAuth--;..  
9550: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
9560: 0a 2a 2a 20 55 6e 6c 65 73 73 20 53 51 4c 49 54  .** Unless SQLIT
9570: 45 5f 54 45 53 54 20 69 73 20 64 65 66 69 6e 65  E_TEST is define
9580: 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  d, this function
9590: 20 69 73 20 61 20 73 69 6d 70 6c 65 20 77 72 61   is a simple wra
95a0: 70 70 65 72 20 61 72 6f 75 6e 64 0a 2a 2a 20 73  pper around.** s
95b0: 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76  qlite3_prepare_v
95c0: 32 28 29 2e 20 49 66 20 53 51 4c 49 54 45 5f 54  2(). If SQLITE_T
95d0: 45 53 54 20 69 73 20 64 65 66 69 6e 65 64 2c 20  EST is defined, 
95e0: 74 68 65 6e 20 69 74 20 75 73 65 73 20 65 69 74  then it uses eit
95f0: 68 65 72 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 70  her.** sqlite3_p
9600: 72 65 70 61 72 65 5f 76 32 28 29 20 6f 72 20 6c  repare_v2() or l
9610: 65 67 61 63 79 20 69 6e 74 65 72 66 61 63 65 20  egacy interface 
9620: 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28  sqlite3_prepare(
9630: 29 2c 20 64 65 70 65 6e 64 69 6e 67 0a 2a 2a 20  ), depending.** 
9640: 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  on whether or no
9650: 74 20 74 68 65 20 5b 64 62 5f 75 73 65 5f 6c 65  t the [db_use_le
9660: 67 61 63 79 5f 70 72 65 70 61 72 65 5d 20 63 6f  gacy_prepare] co
9670: 6d 6d 61 6e 64 20 68 61 73 20 62 65 65 6e 20 75  mmand has been u
9680: 73 65 64 20 74 6f 0a 2a 2a 20 63 6f 6e 66 69 67  sed to.** config
9690: 75 72 65 20 74 68 65 20 63 6f 6e 6e 65 63 74 69  ure the connecti
96a0: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
96b0: 74 20 64 62 50 72 65 70 61 72 65 28 0a 20 20 53  t dbPrepare(.  S
96c0: 71 6c 69 74 65 44 62 20 2a 70 44 62 2c 20 20 20  qliteDb *pDb,   
96d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
96e0: 2a 20 44 61 74 61 62 61 73 65 20 6f 62 6a 65 63  * Database objec
96f0: 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  t */.  const cha
9700: 72 20 2a 7a 53 71 6c 2c 20 20 20 20 20 20 20 20  r *zSql,        
9710: 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 20 74 6f         /* SQL to
9720: 20 63 6f 6d 70 69 6c 65 20 2a 2f 0a 20 20 73 71   compile */.  sq
9730: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 2a 70 70 53  lite3_stmt **ppS
9740: 74 6d 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  tmt,          /*
9750: 20 4f 55 54 3a 20 50 72 65 70 61 72 65 64 20 73   OUT: Prepared s
9760: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 63 6f  tatement */.  co
9770: 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f 75 74  nst char **pzOut
9780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9790: 20 4f 55 54 3a 20 50 6f 69 6e 74 65 72 20 74 6f   OUT: Pointer to
97a0: 20 6e 65 78 74 20 53 51 4c 20 73 74 61 74 65 6d   next SQL statem
97b0: 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69  ent */.){.  unsi
97c0: 67 6e 65 64 20 69 6e 74 20 70 72 65 70 46 6c 61  gned int prepFla
97d0: 67 73 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53  gs = 0;.#ifdef S
97e0: 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 66 28  QLITE_TEST.  if(
97f0: 20 70 44 62 2d 3e 62 4c 65 67 61 63 79 50 72 65   pDb->bLegacyPre
9800: 70 61 72 65 20 29 7b 0a 20 20 20 20 72 65 74 75  pare ){.    retu
9810: 72 6e 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61  rn sqlite3_prepa
9820: 72 65 28 70 44 62 2d 3e 64 62 2c 20 7a 53 71 6c  re(pDb->db, zSql
9830: 2c 20 2d 31 2c 20 70 70 53 74 6d 74 2c 20 70 7a  , -1, ppStmt, pz
9840: 4f 75 74 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  Out);.  }.#endif
9850: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 73 74 61  .  /* If the sta
9860: 74 65 6d 65 6e 74 20 63 61 63 68 65 20 69 73 20  tement cache is 
9870: 6c 61 72 67 65 2c 20 75 73 65 20 74 68 65 20 53  large, use the S
9880: 51 4c 49 54 45 5f 50 52 45 50 41 52 45 5f 50 45  QLITE_PREPARE_PE
9890: 52 53 49 53 54 45 4e 54 0a 20 20 2a 2a 20 66 6c  RSISTENT.  ** fl
98a0: 61 67 73 2c 20 77 68 69 63 68 20 75 73 65 73 20  ags, which uses 
98b0: 6c 65 73 73 20 6c 6f 6f 6b 61 73 69 64 65 20 6d  less lookaside m
98c0: 65 6d 6f 72 79 2e 20 20 42 75 74 20 69 66 20 74  emory.  But if t
98d0: 68 65 20 63 61 63 68 65 20 69 73 20 73 6d 61 6c  he cache is smal
98e0: 6c 2c 0a 20 20 2a 2a 20 6f 6d 69 74 20 74 68 61  l,.  ** omit tha
98f0: 74 20 66 6c 61 67 20 74 6f 20 6d 61 6b 65 20 66  t flag to make f
9900: 75 6c 6c 20 75 73 65 20 6f 66 20 6c 6f 6f 6b 61  ull use of looka
9910: 73 69 64 65 20 2a 2f 0a 20 20 69 66 28 20 70 44  side */.  if( pD
9920: 62 2d 3e 6d 61 78 53 74 6d 74 3e 35 20 29 20 70  b->maxStmt>5 ) p
9930: 72 65 70 46 6c 61 67 73 20 3d 20 53 51 4c 49 54  repFlags = SQLIT
9940: 45 5f 50 52 45 50 41 52 45 5f 50 45 52 53 49 53  E_PREPARE_PERSIS
9950: 54 45 4e 54 3b 0a 0a 20 20 72 65 74 75 72 6e 20  TENT;..  return 
9960: 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
9970: 76 33 28 70 44 62 2d 3e 64 62 2c 20 7a 53 71 6c  v3(pDb->db, zSql
9980: 2c 20 2d 31 2c 20 70 72 65 70 46 6c 61 67 73 2c  , -1, prepFlags,
9990: 20 70 70 53 74 6d 74 2c 20 70 7a 4f 75 74 29 3b   ppStmt, pzOut);
99a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68  .}../*.** Search
99b0: 20 74 68 65 20 63 61 63 68 65 20 66 6f 72 20 61   the cache for a
99c0: 20 70 72 65 70 61 72 65 64 2d 73 74 61 74 65 6d   prepared-statem
99d0: 65 6e 74 20 6f 62 6a 65 63 74 20 74 68 61 74 20  ent object that 
99e0: 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 0a 2a  implements the.*
99f0: 2a 20 66 69 72 73 74 20 53 51 4c 20 73 74 61 74  * first SQL stat
9a00: 65 6d 65 6e 74 20 69 6e 20 74 68 65 20 62 75 66  ement in the buf
9a10: 66 65 72 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  fer pointed to b
9a20: 79 20 70 61 72 61 6d 65 74 65 72 20 7a 49 6e 2e  y parameter zIn.
9a30: 20 49 66 0a 2a 2a 20 6e 6f 20 73 75 63 68 20 70   If.** no such p
9a40: 72 65 70 61 72 65 64 2d 73 74 61 74 65 6d 65 6e  repared-statemen
9a50: 74 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 2c 20  t can be found, 
9a60: 61 6c 6c 6f 63 61 74 65 20 61 6e 64 20 70 72 65  allocate and pre
9a70: 70 61 72 65 20 61 20 6e 65 77 0a 2a 2a 20 6f 6e  pare a new.** on
9a80: 65 2e 20 49 6e 20 65 69 74 68 65 72 20 63 61 73  e. In either cas
9a90: 65 2c 20 62 69 6e 64 20 74 68 65 20 63 75 72 72  e, bind the curr
9aa0: 65 6e 74 20 76 61 6c 75 65 73 20 6f 66 20 74 68  ent values of th
9ab0: 65 20 72 65 6c 65 76 61 6e 74 20 54 63 6c 0a 2a  e relevant Tcl.*
9ac0: 2a 20 76 61 72 69 61 62 6c 65 73 20 74 6f 20 61  * variables to a
9ad0: 6e 79 20 24 76 61 72 2c 20 3a 76 61 72 20 6f 72  ny $var, :var or
9ae0: 20 40 76 61 72 20 76 61 72 69 61 62 6c 65 73 20   @var variables 
9af0: 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  in the statement
9b00: 2e 20 42 65 66 6f 72 65 0a 2a 2a 20 72 65 74 75  . Before.** retu
9b10: 72 6e 69 6e 67 2c 20 73 65 74 20 2a 70 70 50 72  rning, set *ppPr
9b20: 65 53 74 6d 74 20 74 6f 20 70 6f 69 6e 74 20 74  eStmt to point t
9b30: 6f 20 74 68 65 20 70 72 65 70 61 72 65 64 2d 73  o the prepared-s
9b40: 74 61 74 65 6d 65 6e 74 20 6f 62 6a 65 63 74 2e  tatement object.
9b50: 0a 2a 2a 0a 2a 2a 20 4f 75 74 70 75 74 20 70 61  .**.** Output pa
9b60: 72 61 6d 65 74 65 72 20 2a 70 7a 4f 75 74 20 69  rameter *pzOut i
9b70: 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  s set to point t
9b80: 6f 20 74 68 65 20 6e 65 78 74 20 53 51 4c 20 73  o the next SQL s
9b90: 74 61 74 65 6d 65 6e 74 20 69 6e 0a 2a 2a 20 62  tatement in.** b
9ba0: 75 66 66 65 72 20 7a 49 6e 2c 20 6f 72 20 74 6f  uffer zIn, or to
9bb0: 20 74 68 65 20 27 5c 30 27 20 62 79 74 65 20 61   the '\0' byte a
9bc0: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 7a 49 6e  t the end of zIn
9bd0: 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 0a   if there is no.
9be0: 2a 2a 20 6e 65 78 74 20 73 74 61 74 65 6d 65 6e  ** next statemen
9bf0: 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63  t..**.** If succ
9c00: 65 73 73 66 75 6c 2c 20 54 43 4c 5f 4f 4b 20 69  essful, TCL_OK i
9c10: 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
9c20: 72 77 69 73 65 2c 20 54 43 4c 5f 45 52 52 4f 52  rwise, TCL_ERROR
9c30: 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20   is returned.** 
9c40: 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  and an error mes
9c50: 73 61 67 65 20 6c 6f 61 64 65 64 20 69 6e 74 6f  sage loaded into
9c60: 20 69 6e 74 65 72 70 72 65 74 65 72 20 70 44 62   interpreter pDb
9c70: 2d 3e 69 6e 74 65 72 70 2e 0a 2a 2f 0a 73 74 61  ->interp..*/.sta
9c80: 74 69 63 20 69 6e 74 20 64 62 50 72 65 70 61 72  tic int dbPrepar
9c90: 65 41 6e 64 42 69 6e 64 28 0a 20 20 53 71 6c 69  eAndBind(.  Sqli
9ca0: 74 65 44 62 20 2a 70 44 62 2c 20 20 20 20 20 20  teDb *pDb,      
9cb0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
9cc0: 61 74 61 62 61 73 65 20 6f 62 6a 65 63 74 20 2a  atabase object *
9cd0: 2f 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a  /.  char const *
9ce0: 7a 49 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  zIn,            
9cf0: 20 20 20 20 2f 2a 20 53 51 4c 20 74 6f 20 63 6f      /* SQL to co
9d00: 6d 70 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20  mpile */.  char 
9d10: 63 6f 6e 73 74 20 2a 2a 70 7a 4f 75 74 2c 20 20  const **pzOut,  
9d20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
9d30: 54 3a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6e 65  T: Pointer to ne
9d40: 78 74 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  xt SQL statement
9d50: 20 2a 2f 0a 20 20 53 71 6c 50 72 65 70 61 72 65   */.  SqlPrepare
9d60: 64 53 74 6d 74 20 2a 2a 70 70 50 72 65 53 74 6d  dStmt **ppPreStm
9d70: 74 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4f 62  t     /* OUT: Ob
9d80: 6a 65 63 74 20 75 73 65 64 20 74 6f 20 63 61 63  ject used to cac
9d90: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  he statement */.
9da0: 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
9db0: 2a 7a 53 71 6c 20 3d 20 7a 49 6e 3b 20 20 20 20  *zSql = zIn;    
9dc0: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
9dd0: 74 6f 20 66 69 72 73 74 20 53 51 4c 20 73 74 61  to first SQL sta
9de0: 74 65 6d 65 6e 74 20 69 6e 20 7a 49 6e 20 2a 2f  tement in zIn */
9df0: 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
9e00: 2a 70 53 74 6d 74 20 3d 20 30 3b 20 20 20 20 20  *pStmt = 0;     
9e10: 20 20 20 2f 2a 20 50 72 65 70 61 72 65 64 20 73     /* Prepared s
9e20: 74 61 74 65 6d 65 6e 74 20 6f 62 6a 65 63 74 20  tatement object 
9e30: 2a 2f 0a 20 20 53 71 6c 50 72 65 70 61 72 65 64  */.  SqlPrepared
9e40: 53 74 6d 74 20 2a 70 50 72 65 53 74 6d 74 3b 20  Stmt *pPreStmt; 
9e50: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
9e60: 74 6f 20 63 61 63 68 65 64 20 73 74 61 74 65 6d  to cached statem
9e70: 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 71  ent */.  int nSq
9e80: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
9e90: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67           /* Leng
9ea0: 74 68 20 6f 66 20 7a 53 71 6c 20 69 6e 20 62 79  th of zSql in by
9eb0: 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 56 61  tes */.  int nVa
9ec0: 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  r = 0;          
9ed0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
9ee0: 65 72 20 6f 66 20 76 61 72 69 61 62 6c 65 73 20  er of variables 
9ef0: 69 6e 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  in statement */.
9f00: 20 20 69 6e 74 20 69 50 61 72 6d 20 3d 20 30 3b    int iParm = 0;
9f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9f20: 20 20 2f 2a 20 4e 65 78 74 20 66 72 65 65 20 65    /* Next free e
9f30: 6e 74 72 79 20 69 6e 20 61 70 50 61 72 6d 20 2a  ntry in apParm *
9f40: 2f 0a 20 20 63 68 61 72 20 63 3b 0a 20 20 69 6e  /.  char c;.  in
9f50: 74 20 69 3b 0a 20 20 54 63 6c 5f 49 6e 74 65 72  t i;.  Tcl_Inter
9f60: 70 20 2a 69 6e 74 65 72 70 20 3d 20 70 44 62 2d  p *interp = pDb-
9f70: 3e 69 6e 74 65 72 70 3b 0a 0a 20 20 2a 70 70 50  >interp;..  *ppP
9f80: 72 65 53 74 6d 74 20 3d 20 30 3b 0a 0a 20 20 2f  reStmt = 0;..  /
9f90: 2a 20 54 72 69 6d 20 73 70 61 63 65 73 20 66 72  * Trim spaces fr
9fa0: 6f 6d 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  om the start of 
9fb0: 7a 53 71 6c 20 61 6e 64 20 63 61 6c 63 75 6c 61  zSql and calcula
9fc0: 74 65 20 74 68 65 20 72 65 6d 61 69 6e 69 6e 67  te the remaining
9fd0: 20 6c 65 6e 67 74 68 2e 20 2a 2f 0a 20 20 77 68   length. */.  wh
9fe0: 69 6c 65 28 20 28 63 20 3d 20 7a 53 71 6c 5b 30  ile( (c = zSql[0
9ff0: 5d 29 3d 3d 27 20 27 20 7c 7c 20 63 3d 3d 27 5c  ])==' ' || c=='\
a000: 74 27 20 7c 7c 20 63 3d 3d 27 5c 72 27 20 7c 7c  t' || c=='\r' ||
a010: 20 63 3d 3d 27 5c 6e 27 20 29 7b 20 7a 53 71 6c   c=='\n' ){ zSql
a020: 2b 2b 3b 20 7d 0a 20 20 6e 53 71 6c 20 3d 20 73  ++; }.  nSql = s
a030: 74 72 6c 65 6e 33 30 28 7a 53 71 6c 29 3b 0a 0a  trlen30(zSql);..
a040: 20 20 66 6f 72 28 70 50 72 65 53 74 6d 74 20 3d    for(pPreStmt =
a050: 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74 3b 20   pDb->stmtList; 
a060: 70 50 72 65 53 74 6d 74 3b 20 70 50 72 65 53 74  pPreStmt; pPreSt
a070: 6d 74 3d 70 50 72 65 53 74 6d 74 2d 3e 70 4e 65  mt=pPreStmt->pNe
a080: 78 74 29 7b 0a 20 20 20 20 69 6e 74 20 6e 20 3d  xt){.    int n =
a090: 20 70 50 72 65 53 74 6d 74 2d 3e 6e 53 71 6c 3b   pPreStmt->nSql;
a0a0: 0a 20 20 20 20 69 66 28 20 6e 53 71 6c 3e 3d 6e  .    if( nSql>=n
a0b0: 0a 20 20 20 20 20 20 20 20 26 26 20 6d 65 6d 63  .        && memc
a0c0: 6d 70 28 70 50 72 65 53 74 6d 74 2d 3e 7a 53 71  mp(pPreStmt->zSq
a0d0: 6c 2c 20 7a 53 71 6c 2c 20 6e 29 3d 3d 30 0a 20  l, zSql, n)==0. 
a0e0: 20 20 20 20 20 20 20 26 26 20 28 7a 53 71 6c 5b         && (zSql[
a0f0: 6e 5d 3d 3d 30 20 7c 7c 20 7a 53 71 6c 5b 6e 2d  n]==0 || zSql[n-
a100: 31 5d 3d 3d 27 3b 27 29 0a 20 20 20 20 29 7b 0a  1]==';').    ){.
a110: 20 20 20 20 20 20 70 53 74 6d 74 20 3d 20 70 50        pStmt = pP
a120: 72 65 53 74 6d 74 2d 3e 70 53 74 6d 74 3b 0a 20  reStmt->pStmt;. 
a130: 20 20 20 20 20 2a 70 7a 4f 75 74 20 3d 20 26 7a       *pzOut = &z
a140: 53 71 6c 5b 70 50 72 65 53 74 6d 74 2d 3e 6e 53  Sql[pPreStmt->nS
a150: 71 6c 5d 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57  ql];..      /* W
a160: 68 65 6e 20 61 20 70 72 65 70 61 72 65 64 20 73  hen a prepared s
a170: 74 61 74 65 6d 65 6e 74 20 69 73 20 66 6f 75 6e  tatement is foun
a180: 64 2c 20 75 6e 6c 69 6e 6b 20 69 74 20 66 72 6f  d, unlink it fro
a190: 6d 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 63  m the.      ** c
a1a0: 61 63 68 65 20 6c 69 73 74 2e 20 20 49 74 20 77  ache list.  It w
a1b0: 69 6c 6c 20 6c 61 74 65 72 20 62 65 20 61 64 64  ill later be add
a1c0: 65 64 20 62 61 63 6b 20 74 6f 20 74 68 65 20 62  ed back to the b
a1d0: 65 67 69 6e 6e 69 6e 67 0a 20 20 20 20 20 20 2a  eginning.      *
a1e0: 2a 20 6f 66 20 74 68 65 20 63 61 63 68 65 20 6c  * of the cache l
a1f0: 69 73 74 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ist in order to 
a200: 69 6d 70 6c 65 6d 65 6e 74 20 4c 52 55 20 72 65  implement LRU re
a210: 70 6c 61 63 65 6d 65 6e 74 2e 0a 20 20 20 20 20  placement..     
a220: 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 50   */.      if( pP
a230: 72 65 53 74 6d 74 2d 3e 70 50 72 65 76 20 29 7b  reStmt->pPrev ){
a240: 0a 20 20 20 20 20 20 20 20 70 50 72 65 53 74 6d  .        pPreStm
a250: 74 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20  t->pPrev->pNext 
a260: 3d 20 70 50 72 65 53 74 6d 74 2d 3e 70 4e 65 78  = pPreStmt->pNex
a270: 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  t;.      }else{.
a280: 20 20 20 20 20 20 20 20 70 44 62 2d 3e 73 74 6d          pDb->stm
a290: 74 4c 69 73 74 20 3d 20 70 50 72 65 53 74 6d 74  tList = pPreStmt
a2a0: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d  ->pNext;.      }
a2b0: 0a 20 20 20 20 20 20 69 66 28 20 70 50 72 65 53  .      if( pPreS
a2c0: 74 6d 74 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20  tmt->pNext ){.  
a2d0: 20 20 20 20 20 20 70 50 72 65 53 74 6d 74 2d 3e        pPreStmt->
a2e0: 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70  pNext->pPrev = p
a2f0: 50 72 65 53 74 6d 74 2d 3e 70 50 72 65 76 3b 0a  PreStmt->pPrev;.
a300: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
a310: 20 20 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c 61       pDb->stmtLa
a320: 73 74 20 3d 20 70 50 72 65 53 74 6d 74 2d 3e 70  st = pPreStmt->p
a330: 50 72 65 76 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Prev;.      }.  
a340: 20 20 20 20 70 44 62 2d 3e 6e 53 74 6d 74 2d 2d      pDb->nStmt--
a350: 3b 0a 20 20 20 20 20 20 6e 56 61 72 20 3d 20 73  ;.      nVar = s
a360: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61  qlite3_bind_para
a370: 6d 65 74 65 72 5f 63 6f 75 6e 74 28 70 53 74 6d  meter_count(pStm
a380: 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  t);.      break;
a390: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
a3a0: 20 49 66 20 6e 6f 20 70 72 65 70 61 72 65 64 20   If no prepared 
a3b0: 73 74 61 74 65 6d 65 6e 74 20 77 61 73 20 66 6f  statement was fo
a3c0: 75 6e 64 2e 20 43 6f 6d 70 69 6c 65 20 74 68 65  und. Compile the
a3d0: 20 53 51 4c 20 74 65 78 74 2e 20 41 6c 73 6f 20   SQL text. Also 
a3e0: 61 6c 6c 6f 63 61 74 65 0a 20 20 2a 2a 20 61 20  allocate.  ** a 
a3f0: 6e 65 77 20 53 71 6c 50 72 65 70 61 72 65 64 53  new SqlPreparedS
a400: 74 6d 74 20 73 74 72 75 63 74 75 72 65 2e 20 20  tmt structure.  
a410: 2a 2f 0a 20 20 69 66 28 20 70 50 72 65 53 74 6d  */.  if( pPreStm
a420: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  t==0 ){.    int 
a430: 6e 42 79 74 65 3b 0a 0a 20 20 20 20 69 66 28 20  nByte;..    if( 
a440: 53 51 4c 49 54 45 5f 4f 4b 21 3d 64 62 50 72 65  SQLITE_OK!=dbPre
a450: 70 61 72 65 28 70 44 62 2c 20 7a 53 71 6c 2c 20  pare(pDb, zSql, 
a460: 26 70 53 74 6d 74 2c 20 70 7a 4f 75 74 29 20 29  &pStmt, pzOut) )
a470: 7b 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f  {.      Tcl_SetO
a480: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
a490: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
a4a0: 6a 28 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  j(sqlite3_errmsg
a4b0: 28 70 44 62 2d 3e 64 62 29 2c 20 2d 31 29 29 3b  (pDb->db), -1));
a4c0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
a4d0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
a4e0: 20 20 20 69 66 28 20 70 53 74 6d 74 3d 3d 30 20     if( pStmt==0 
a4f0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c  ){.      if( SQL
a500: 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 5f  ITE_OK!=sqlite3_
a510: 65 72 72 63 6f 64 65 28 70 44 62 2d 3e 64 62 29  errcode(pDb->db)
a520: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41   ){.        /* A
a530: 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 65 72   compile-time er
a540: 72 6f 72 20 69 6e 20 74 68 65 20 73 74 61 74 65  ror in the state
a550: 6d 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20  ment. */.       
a560: 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
a570: 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
a580: 77 53 74 72 69 6e 67 4f 62 6a 28 73 71 6c 69 74  wStringObj(sqlit
a590: 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64  e3_errmsg(pDb->d
a5a0: 62 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 20 20  b), -1));.      
a5b0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
a5c0: 4f 52 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  OR;.      }else{
a5d0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
a5e0: 73 74 61 74 65 6d 65 6e 74 20 77 61 73 20 61 20  statement was a 
a5f0: 6e 6f 2d 6f 70 2e 20 20 43 6f 6e 74 69 6e 75 65  no-op.  Continue
a600: 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73 74 61   to the next sta
a610: 74 65 6d 65 6e 74 0a 20 20 20 20 20 20 20 20 2a  tement.        *
a620: 2a 20 69 6e 20 74 68 65 20 53 51 4c 20 73 74 72  * in the SQL str
a630: 69 6e 67 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ing..        */.
a640: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54          return T
a650: 43 4c 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  CL_OK;.      }. 
a660: 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74     }..    assert
a670: 28 20 70 50 72 65 53 74 6d 74 3d 3d 30 20 29 3b  ( pPreStmt==0 );
a680: 0a 20 20 20 20 6e 56 61 72 20 3d 20 73 71 6c 69  .    nVar = sqli
a690: 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74  te3_bind_paramet
a6a0: 65 72 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29 3b  er_count(pStmt);
a6b0: 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 73 69 7a  .    nByte = siz
a6c0: 65 6f 66 28 53 71 6c 50 72 65 70 61 72 65 64 53  eof(SqlPreparedS
a6d0: 74 6d 74 29 20 2b 20 6e 56 61 72 2a 73 69 7a 65  tmt) + nVar*size
a6e0: 6f 66 28 54 63 6c 5f 4f 62 6a 20 2a 29 3b 0a 20  of(Tcl_Obj *);. 
a6f0: 20 20 20 70 50 72 65 53 74 6d 74 20 3d 20 28 53     pPreStmt = (S
a700: 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74 2a 29  qlPreparedStmt*)
a710: 54 63 6c 5f 41 6c 6c 6f 63 28 6e 42 79 74 65 29  Tcl_Alloc(nByte)
a720: 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 50 72  ;.    memset(pPr
a730: 65 53 74 6d 74 2c 20 30 2c 20 6e 42 79 74 65 29  eStmt, 0, nByte)
a740: 3b 0a 0a 20 20 20 20 70 50 72 65 53 74 6d 74 2d  ;..    pPreStmt-
a750: 3e 70 53 74 6d 74 20 3d 20 70 53 74 6d 74 3b 0a  >pStmt = pStmt;.
a760: 20 20 20 20 70 50 72 65 53 74 6d 74 2d 3e 6e 53      pPreStmt->nS
a770: 71 6c 20 3d 20 28 69 6e 74 29 28 2a 70 7a 4f 75  ql = (int)(*pzOu
a780: 74 20 2d 20 7a 53 71 6c 29 3b 0a 20 20 20 20 70  t - zSql);.    p
a790: 50 72 65 53 74 6d 74 2d 3e 7a 53 71 6c 20 3d 20  PreStmt->zSql = 
a7a0: 73 71 6c 69 74 65 33 5f 73 71 6c 28 70 53 74 6d  sqlite3_sql(pStm
a7b0: 74 29 3b 0a 20 20 20 20 70 50 72 65 53 74 6d 74  t);.    pPreStmt
a7c0: 2d 3e 61 70 50 61 72 6d 20 3d 20 28 54 63 6c 5f  ->apParm = (Tcl_
a7d0: 4f 62 6a 20 2a 2a 29 26 70 50 72 65 53 74 6d 74  Obj **)&pPreStmt
a7e0: 5b 31 5d 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  [1];.#ifdef SQLI
a7f0: 54 45 5f 54 45 53 54 0a 20 20 20 20 69 66 28 20  TE_TEST.    if( 
a800: 70 50 72 65 53 74 6d 74 2d 3e 7a 53 71 6c 3d 3d  pPreStmt->zSql==
a810: 30 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20  0 ){.      char 
a820: 2a 7a 43 6f 70 79 20 3d 20 54 63 6c 5f 41 6c 6c  *zCopy = Tcl_All
a830: 6f 63 28 70 50 72 65 53 74 6d 74 2d 3e 6e 53 71  oc(pPreStmt->nSq
a840: 6c 20 2b 20 31 29 3b 0a 20 20 20 20 20 20 6d 65  l + 1);.      me
a850: 6d 63 70 79 28 7a 43 6f 70 79 2c 20 7a 53 71 6c  mcpy(zCopy, zSql
a860: 2c 20 70 50 72 65 53 74 6d 74 2d 3e 6e 53 71 6c  , pPreStmt->nSql
a870: 29 3b 0a 20 20 20 20 20 20 7a 43 6f 70 79 5b 70  );.      zCopy[p
a880: 50 72 65 53 74 6d 74 2d 3e 6e 53 71 6c 5d 20 3d  PreStmt->nSql] =
a890: 20 27 5c 30 27 3b 0a 20 20 20 20 20 20 70 50 72   '\0';.      pPr
a8a0: 65 53 74 6d 74 2d 3e 7a 53 71 6c 20 3d 20 7a 43  eStmt->zSql = zC
a8b0: 6f 70 79 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  opy;.    }.#endi
a8c0: 66 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  f.  }.  assert( 
a8d0: 70 50 72 65 53 74 6d 74 20 29 3b 0a 20 20 61 73  pPreStmt );.  as
a8e0: 73 65 72 74 28 20 73 74 72 6c 65 6e 33 30 28 70  sert( strlen30(p
a8f0: 50 72 65 53 74 6d 74 2d 3e 7a 53 71 6c 29 3d 3d  PreStmt->zSql)==
a900: 70 50 72 65 53 74 6d 74 2d 3e 6e 53 71 6c 20 29  pPreStmt->nSql )
a910: 3b 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 6d  ;.  assert( 0==m
a920: 65 6d 63 6d 70 28 70 50 72 65 53 74 6d 74 2d 3e  emcmp(pPreStmt->
a930: 7a 53 71 6c 2c 20 7a 53 71 6c 2c 20 70 50 72 65  zSql, zSql, pPre
a940: 53 74 6d 74 2d 3e 6e 53 71 6c 29 20 29 3b 0a 0a  Stmt->nSql) );..
a950: 20 20 2f 2a 20 42 69 6e 64 20 76 61 6c 75 65 73    /* Bind values
a960: 20 74 6f 20 70 61 72 61 6d 65 74 65 72 73 20 74   to parameters t
a970: 68 61 74 20 62 65 67 69 6e 20 77 69 74 68 20 24  hat begin with $
a980: 20 6f 72 20 3a 20 2a 2f 0a 20 20 66 6f 72 28 69   or : */.  for(i
a990: 3d 31 3b 20 69 3c 3d 6e 56 61 72 3b 20 69 2b 2b  =1; i<=nVar; i++
a9a0: 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ){.    const cha
a9b0: 72 20 2a 7a 56 61 72 20 3d 20 73 71 6c 69 74 65  r *zVar = sqlite
a9c0: 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72  3_bind_parameter
a9d0: 5f 6e 61 6d 65 28 70 53 74 6d 74 2c 20 69 29 3b  _name(pStmt, i);
a9e0: 0a 20 20 20 20 69 66 28 20 7a 56 61 72 21 3d 30  .    if( zVar!=0
a9f0: 20 26 26 20 28 7a 56 61 72 5b 30 5d 3d 3d 27 24   && (zVar[0]=='$
aa00: 27 20 7c 7c 20 7a 56 61 72 5b 30 5d 3d 3d 27 3a  ' || zVar[0]==':
aa10: 27 20 7c 7c 20 7a 56 61 72 5b 30 5d 3d 3d 27 40  ' || zVar[0]=='@
aa20: 27 29 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  ') ){.      Tcl_
aa30: 4f 62 6a 20 2a 70 56 61 72 20 3d 20 54 63 6c 5f  Obj *pVar = Tcl_
aa40: 47 65 74 56 61 72 32 45 78 28 69 6e 74 65 72 70  GetVar2Ex(interp
aa50: 2c 20 26 7a 56 61 72 5b 31 5d 2c 20 30 2c 20 30  , &zVar[1], 0, 0
aa60: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 56 61  );.      if( pVa
aa70: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  r ){.        int
aa80: 20 6e 3b 0a 20 20 20 20 20 20 20 20 75 38 20 2a   n;.        u8 *
aa90: 64 61 74 61 3b 0a 20 20 20 20 20 20 20 20 63 6f  data;.        co
aaa0: 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 20  nst char *zType 
aab0: 3d 20 28 70 56 61 72 2d 3e 74 79 70 65 50 74 72  = (pVar->typePtr
aac0: 20 3f 20 70 56 61 72 2d 3e 74 79 70 65 50 74 72   ? pVar->typePtr
aad0: 2d 3e 6e 61 6d 65 20 3a 20 22 22 29 3b 0a 20 20  ->name : "");.  
aae0: 20 20 20 20 20 20 63 20 3d 20 7a 54 79 70 65 5b        c = zType[
aaf0: 30 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0];.        if( 
ab00: 7a 56 61 72 5b 30 5d 3d 3d 27 40 27 20 7c 7c 0a  zVar[0]=='@' ||.
ab10: 20 20 20 20 20 20 20 20 20 20 20 28 63 3d 3d 27             (c=='
ab20: 62 27 20 26 26 20 73 74 72 63 6d 70 28 7a 54 79  b' && strcmp(zTy
ab30: 70 65 2c 22 62 79 74 65 61 72 72 61 79 22 29 3d  pe,"bytearray")=
ab40: 3d 30 20 26 26 20 70 56 61 72 2d 3e 62 79 74 65  =0 && pVar->byte
ab50: 73 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20  s==0) ){.       
ab60: 20 20 20 2f 2a 20 4c 6f 61 64 20 61 20 42 4c 4f     /* Load a BLO
ab70: 42 20 74 79 70 65 20 69 66 20 74 68 65 20 54 63  B type if the Tc
ab80: 6c 20 76 61 72 69 61 62 6c 65 20 69 73 20 61 20  l variable is a 
ab90: 62 79 74 65 61 72 72 61 79 20 61 6e 64 0a 20 20  bytearray and.  
aba0: 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 68 61          ** it ha
abb0: 73 20 6e 6f 20 73 74 72 69 6e 67 20 72 65 70 72  s no string repr
abc0: 65 73 65 6e 74 61 74 69 6f 6e 20 6f 72 20 74 68  esentation or th
abd0: 65 20 68 6f 73 74 0a 20 20 20 20 20 20 20 20 20  e host.         
abe0: 20 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 6e 61   ** parameter na
abf0: 6d 65 20 62 65 67 69 6e 73 20 77 69 74 68 20 22  me begins with "
ac00: 40 22 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  @". */.         
ac10: 20 64 61 74 61 20 3d 20 54 63 6c 5f 47 65 74 42   data = Tcl_GetB
ac20: 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28  yteArrayFromObj(
ac30: 70 56 61 72 2c 20 26 6e 29 3b 0a 20 20 20 20 20  pVar, &n);.     
ac40: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e       sqlite3_bin
ac50: 64 5f 62 6c 6f 62 28 70 53 74 6d 74 2c 20 69 2c  d_blob(pStmt, i,
ac60: 20 64 61 74 61 2c 20 6e 2c 20 53 51 4c 49 54 45   data, n, SQLITE
ac70: 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20  _STATIC);.      
ac80: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43      Tcl_IncrRefC
ac90: 6f 75 6e 74 28 70 56 61 72 29 3b 0a 20 20 20 20  ount(pVar);.    
aca0: 20 20 20 20 20 20 70 50 72 65 53 74 6d 74 2d 3e        pPreStmt->
acb0: 61 70 50 61 72 6d 5b 69 50 61 72 6d 2b 2b 5d 20  apParm[iParm++] 
acc0: 3d 20 70 56 61 72 3b 0a 20 20 20 20 20 20 20 20  = pVar;.        
acd0: 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 62 27  }else if( c=='b'
ace0: 20 26 26 20 73 74 72 63 6d 70 28 7a 54 79 70 65   && strcmp(zType
acf0: 2c 22 62 6f 6f 6c 65 61 6e 22 29 3d 3d 30 20 29  ,"boolean")==0 )
ad00: 7b 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f  {.          Tcl_
ad10: 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
ad20: 74 65 72 70 2c 20 70 56 61 72 2c 20 26 6e 29 3b  terp, pVar, &n);
ad30: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
ad40: 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 53 74 6d  e3_bind_int(pStm
ad50: 74 2c 20 69 2c 20 6e 29 3b 0a 20 20 20 20 20 20  t, i, n);.      
ad60: 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27    }else if( c=='
ad70: 64 27 20 26 26 20 73 74 72 63 6d 70 28 7a 54 79  d' && strcmp(zTy
ad80: 70 65 2c 22 64 6f 75 62 6c 65 22 29 3d 3d 30 20  pe,"double")==0 
ad90: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 64 6f 75  ){.          dou
ada0: 62 6c 65 20 72 3b 0a 20 20 20 20 20 20 20 20 20  ble r;.         
adb0: 20 54 63 6c 5f 47 65 74 44 6f 75 62 6c 65 46 72   Tcl_GetDoubleFr
adc0: 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 70 56  omObj(interp, pV
add0: 61 72 2c 20 26 72 29 3b 0a 20 20 20 20 20 20 20  ar, &r);.       
ade0: 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
adf0: 64 6f 75 62 6c 65 28 70 53 74 6d 74 2c 20 69 2c  double(pStmt, i,
ae00: 20 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c   r);.        }el
ae10: 73 65 20 69 66 28 20 28 63 3d 3d 27 77 27 20 26  se if( (c=='w' &
ae20: 26 20 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22  & strcmp(zType,"
ae30: 77 69 64 65 49 6e 74 22 29 3d 3d 30 29 20 7c 7c  wideInt")==0) ||
ae40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28  .              (
ae50: 63 3d 3d 27 69 27 20 26 26 20 73 74 72 63 6d 70  c=='i' && strcmp
ae60: 28 7a 54 79 70 65 2c 22 69 6e 74 22 29 3d 3d 30  (zType,"int")==0
ae70: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54  ) ){.          T
ae80: 63 6c 5f 57 69 64 65 49 6e 74 20 76 3b 0a 20 20  cl_WideInt v;.  
ae90: 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 57          Tcl_GetW
aea0: 69 64 65 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  ideIntFromObj(in
aeb0: 74 65 72 70 2c 20 70 56 61 72 2c 20 26 76 29 3b  terp, pVar, &v);
aec0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
aed0: 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 53  e3_bind_int64(pS
aee0: 74 6d 74 2c 20 69 2c 20 76 29 3b 0a 20 20 20 20  tmt, i, v);.    
aef0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
af00: 20 20 20 20 20 64 61 74 61 20 3d 20 28 75 6e 73       data = (uns
af10: 69 67 6e 65 64 20 63 68 61 72 20 2a 29 54 63 6c  igned char *)Tcl
af20: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
af30: 6a 28 70 56 61 72 2c 20 26 6e 29 3b 0a 20 20 20  j(pVar, &n);.   
af40: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62         sqlite3_b
af50: 69 6e 64 5f 74 65 78 74 28 70 53 74 6d 74 2c 20  ind_text(pStmt, 
af60: 69 2c 20 28 63 68 61 72 20 2a 29 64 61 74 61 2c  i, (char *)data,
af70: 20 6e 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49   n, SQLITE_STATI
af80: 43 29 3b 0a 20 20 20 20 20 20 20 20 20 20 54 63  C);.          Tc
af90: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70  l_IncrRefCount(p
afa0: 56 61 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Var);.          
afb0: 70 50 72 65 53 74 6d 74 2d 3e 61 70 50 61 72 6d  pPreStmt->apParm
afc0: 5b 69 50 61 72 6d 2b 2b 5d 20 3d 20 70 56 61 72  [iParm++] = pVar
afd0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
afe0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
aff0: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75   sqlite3_bind_nu
b000: 6c 6c 28 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20  ll(pStmt, i);.  
b010: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
b020: 20 20 70 50 72 65 53 74 6d 74 2d 3e 6e 50 61 72    pPreStmt->nPar
b030: 6d 20 3d 20 69 50 61 72 6d 3b 0a 20 20 2a 70 70  m = iParm;.  *pp
b040: 50 72 65 53 74 6d 74 20 3d 20 70 50 72 65 53 74  PreStmt = pPreSt
b050: 6d 74 3b 0a 0a 20 20 72 65 74 75 72 6e 20 54 43  mt;..  return TC
b060: 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  L_OK;.}../*.** R
b070: 65 6c 65 61 73 65 20 61 20 73 74 61 74 65 6d 65  elease a stateme
b080: 6e 74 20 72 65 66 65 72 65 6e 63 65 20 6f 62 74  nt reference obt
b090: 61 69 6e 65 64 20 62 79 20 63 61 6c 6c 69 6e 67  ained by calling
b0a0: 20 64 62 50 72 65 70 61 72 65 41 6e 64 42 69 6e   dbPrepareAndBin
b0b0: 64 28 29 2e 0a 2a 2a 20 54 68 65 72 65 20 73 68  d()..** There sh
b0c0: 6f 75 6c 64 20 62 65 20 65 78 61 63 74 6c 79 20  ould be exactly 
b0d0: 6f 6e 65 20 63 61 6c 6c 20 74 6f 20 74 68 69 73  one call to this
b0e0: 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 65 61   function for ea
b0f0: 63 68 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20 64 62  ch call to.** db
b100: 50 72 65 70 61 72 65 41 6e 64 42 69 6e 64 28 29  PrepareAndBind()
b110: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64  ..**.** If the d
b120: 69 73 63 61 72 64 20 70 61 72 61 6d 65 74 65 72  iscard parameter
b130: 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
b140: 65 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  en the statement
b150: 20 69 73 20 64 65 6c 65 74 65 64 0a 2a 2a 20 69   is deleted.** i
b160: 6d 6d 65 64 69 61 74 65 6c 79 2e 20 4f 74 68 65  mmediately. Othe
b170: 72 77 69 73 65 20 69 74 20 69 73 20 61 64 64 65  rwise it is adde
b180: 64 20 74 6f 20 74 68 65 20 4c 52 55 20 6c 69 73  d to the LRU lis
b190: 74 20 61 6e 64 20 6d 61 79 20 62 65 20 72 65 74  t and may be ret
b1a0: 75 72 6e 65 64 0a 2a 2a 20 62 79 20 61 20 73 75  urned.** by a su
b1b0: 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 20 74 6f  bsequent call to
b1c0: 20 64 62 50 72 65 70 61 72 65 41 6e 64 42 69 6e   dbPrepareAndBin
b1d0: 64 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  d()..*/.static v
b1e0: 6f 69 64 20 64 62 52 65 6c 65 61 73 65 53 74 6d  oid dbReleaseStm
b1f0: 74 28 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70  t(.  SqliteDb *p
b200: 44 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Db,             
b210: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
b220: 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 53 71 6c   handle */.  Sql
b230: 50 72 65 70 61 72 65 64 53 74 6d 74 20 2a 70 50  PreparedStmt *pP
b240: 72 65 53 74 6d 74 2c 20 20 20 20 20 20 2f 2a 20  reStmt,      /* 
b250: 50 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  Prepared stateme
b260: 6e 74 20 68 61 6e 64 6c 65 20 74 6f 20 72 65 6c  nt handle to rel
b270: 65 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 64 69  ease */.  int di
b280: 73 63 61 72 64 20 20 20 20 20 20 20 20 20 20 20  scard           
b290: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
b2a0: 65 20 74 6f 20 64 65 6c 65 74 65 20 28 6e 6f 74  e to delete (not
b2b0: 20 63 61 63 68 65 29 20 74 68 65 20 70 50 72 65   cache) the pPre
b2c0: 53 74 6d 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  Stmt */.){.  int
b2d0: 20 69 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20 74   i;..  /* Free t
b2e0: 68 65 20 62 6f 75 6e 64 20 73 74 72 69 6e 67 20  he bound string 
b2f0: 61 6e 64 20 62 6c 6f 62 20 70 61 72 61 6d 65 74  and blob paramet
b300: 65 72 73 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ers */.  for(i=0
b310: 3b 20 69 3c 70 50 72 65 53 74 6d 74 2d 3e 6e 50  ; i<pPreStmt->nP
b320: 61 72 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 54  arm; i++){.    T
b330: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
b340: 70 50 72 65 53 74 6d 74 2d 3e 61 70 50 61 72 6d  pPreStmt->apParm
b350: 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 70 50 72 65  [i]);.  }.  pPre
b360: 53 74 6d 74 2d 3e 6e 50 61 72 6d 20 3d 20 30 3b  Stmt->nParm = 0;
b370: 0a 0a 20 20 69 66 28 20 70 44 62 2d 3e 6d 61 78  ..  if( pDb->max
b380: 53 74 6d 74 3c 3d 30 20 7c 7c 20 64 69 73 63 61  Stmt<=0 || disca
b390: 72 64 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  rd ){.    /* If 
b3a0: 74 68 65 20 63 61 63 68 65 20 69 73 20 74 75 72  the cache is tur
b3b0: 6e 65 64 20 6f 66 66 2c 20 64 65 61 6c 6c 6f 63  ned off, dealloc
b3c0: 61 74 65 64 20 74 68 65 20 73 74 61 74 65 6d 65  ated the stateme
b3d0: 6e 74 20 2a 2f 0a 20 20 20 20 64 62 46 72 65 65  nt */.    dbFree
b3e0: 53 74 6d 74 28 70 50 72 65 53 74 6d 74 29 3b 0a  Stmt(pPreStmt);.
b3f0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
b400: 41 64 64 20 74 68 65 20 70 72 65 70 61 72 65 64  Add the prepared
b410: 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 74 68   statement to th
b420: 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
b430: 68 65 20 63 61 63 68 65 20 6c 69 73 74 2e 20 2a  he cache list. *
b440: 2f 0a 20 20 20 20 70 50 72 65 53 74 6d 74 2d 3e  /.    pPreStmt->
b450: 70 4e 65 78 74 20 3d 20 70 44 62 2d 3e 73 74 6d  pNext = pDb->stm
b460: 74 4c 69 73 74 3b 0a 20 20 20 20 70 50 72 65 53  tList;.    pPreS
b470: 74 6d 74 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a  tmt->pPrev = 0;.
b480: 20 20 20 20 69 66 28 20 70 44 62 2d 3e 73 74 6d      if( pDb->stm
b490: 74 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 70 44  tList ){.     pD
b4a0: 62 2d 3e 73 74 6d 74 4c 69 73 74 2d 3e 70 50 72  b->stmtList->pPr
b4b0: 65 76 20 3d 20 70 50 72 65 53 74 6d 74 3b 0a 20  ev = pPreStmt;. 
b4c0: 20 20 20 7d 0a 20 20 20 20 70 44 62 2d 3e 73 74     }.    pDb->st
b4d0: 6d 74 4c 69 73 74 20 3d 20 70 50 72 65 53 74 6d  mtList = pPreStm
b4e0: 74 3b 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e  t;.    if( pDb->
b4f0: 73 74 6d 74 4c 61 73 74 3d 3d 30 20 29 7b 0a 20  stmtLast==0 ){. 
b500: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 44 62       assert( pDb
b510: 2d 3e 6e 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20  ->nStmt==0 );.  
b520: 20 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c 61 73      pDb->stmtLas
b530: 74 20 3d 20 70 50 72 65 53 74 6d 74 3b 0a 20 20  t = pPreStmt;.  
b540: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
b550: 73 73 65 72 74 28 20 70 44 62 2d 3e 6e 53 74 6d  ssert( pDb->nStm
b560: 74 3e 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20  t>0 );.    }.   
b570: 20 70 44 62 2d 3e 6e 53 74 6d 74 2b 2b 3b 0a 0a   pDb->nStmt++;..
b580: 20 20 20 20 2f 2a 20 49 66 20 77 65 20 68 61 76      /* If we hav
b590: 65 20 74 6f 6f 20 6d 61 6e 79 20 73 74 61 74 65  e too many state
b5a0: 6d 65 6e 74 20 69 6e 20 63 61 63 68 65 2c 20 72  ment in cache, r
b5b0: 65 6d 6f 76 65 20 74 68 65 20 73 75 72 70 6c 75  emove the surplu
b5c0: 73 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68  s from.    ** th
b5d0: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 63 61 63  e end of the cac
b5e0: 68 65 20 6c 69 73 74 2e 20 20 2a 2f 0a 20 20 20  he list.  */.   
b5f0: 20 77 68 69 6c 65 28 20 70 44 62 2d 3e 6e 53 74   while( pDb->nSt
b600: 6d 74 3e 70 44 62 2d 3e 6d 61 78 53 74 6d 74 20  mt>pDb->maxStmt 
b610: 29 7b 0a 20 20 20 20 20 20 53 71 6c 50 72 65 70  ){.      SqlPrep
b620: 61 72 65 64 53 74 6d 74 20 2a 70 4c 61 73 74 20  aredStmt *pLast 
b630: 3d 20 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74 3b  = pDb->stmtLast;
b640: 0a 20 20 20 20 20 20 70 44 62 2d 3e 73 74 6d 74  .      pDb->stmt
b650: 4c 61 73 74 20 3d 20 70 4c 61 73 74 2d 3e 70 50  Last = pLast->pP
b660: 72 65 76 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e  rev;.      pDb->
b670: 73 74 6d 74 4c 61 73 74 2d 3e 70 4e 65 78 74 20  stmtLast->pNext 
b680: 3d 20 30 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e  = 0;.      pDb->
b690: 6e 53 74 6d 74 2d 2d 3b 0a 20 20 20 20 20 20 64  nStmt--;.      d
b6a0: 62 46 72 65 65 53 74 6d 74 28 70 4c 61 73 74 29  bFreeStmt(pLast)
b6b0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
b6c0: 2a 0a 2a 2a 20 53 74 72 75 63 74 75 72 65 20 75  *.** Structure u
b6d0: 73 65 64 20 77 69 74 68 20 64 62 45 76 61 6c 58  sed with dbEvalX
b6e0: 58 58 28 29 20 66 75 6e 63 74 69 6f 6e 73 3a 0a  XX() functions:.
b6f0: 2a 2a 0a 2a 2a 20 20 20 64 62 45 76 61 6c 49 6e  **.**   dbEvalIn
b700: 69 74 28 29 0a 2a 2a 20 20 20 64 62 45 76 61 6c  it().**   dbEval
b710: 53 74 65 70 28 29 0a 2a 2a 20 20 20 64 62 45 76  Step().**   dbEv
b720: 61 6c 46 69 6e 61 6c 69 7a 65 28 29 0a 2a 2a 20  alFinalize().** 
b730: 20 20 64 62 45 76 61 6c 52 6f 77 49 6e 66 6f 28    dbEvalRowInfo(
b740: 29 0a 2a 2a 20 20 20 64 62 45 76 61 6c 43 6f 6c  ).**   dbEvalCol
b750: 75 6d 6e 56 61 6c 75 65 28 29 0a 2a 2f 0a 74 79  umnValue().*/.ty
b760: 70 65 64 65 66 20 73 74 72 75 63 74 20 44 62 45  pedef struct DbE
b770: 76 61 6c 43 6f 6e 74 65 78 74 20 44 62 45 76 61  valContext DbEva
b780: 6c 43 6f 6e 74 65 78 74 3b 0a 73 74 72 75 63 74  lContext;.struct
b790: 20 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 20 7b   DbEvalContext {
b7a0: 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62  .  SqliteDb *pDb
b7b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
b7c0: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68     /* Database h
b7d0: 61 6e 64 6c 65 20 2a 2f 0a 20 20 54 63 6c 5f 4f  andle */.  Tcl_O
b7e0: 62 6a 20 2a 70 53 71 6c 3b 20 20 20 20 20 20 20  bj *pSql;       
b7f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 62             /* Ob
b800: 6a 65 63 74 20 68 6f 6c 64 69 6e 67 20 73 74 72  ject holding str
b810: 69 6e 67 20 7a 53 71 6c 20 2a 2f 0a 20 20 63 6f  ing zSql */.  co
b820: 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 3b 20  nst char *zSql; 
b830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b840: 20 52 65 6d 61 69 6e 69 6e 67 20 53 51 4c 20 74   Remaining SQL t
b850: 6f 20 65 78 65 63 75 74 65 20 2a 2f 0a 20 20 53  o execute */.  S
b860: 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74 20 2a  qlPreparedStmt *
b870: 70 50 72 65 53 74 6d 74 3b 20 20 20 20 20 20 2f  pPreStmt;      /
b880: 2a 20 43 75 72 72 65 6e 74 20 73 74 61 74 65 6d  * Current statem
b890: 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f  ent */.  int nCo
b8a0: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
b8b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
b8c0: 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 72 65  er of columns re
b8d0: 74 75 72 6e 65 64 20 62 79 20 70 53 74 6d 74 20  turned by pStmt 
b8e0: 2a 2f 0a 20 20 69 6e 74 20 65 76 61 6c 46 6c 61  */.  int evalFla
b8f0: 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  gs;             
b900: 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 75 73       /* Flags us
b910: 65 64 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  ed */.  Tcl_Obj 
b920: 2a 70 41 72 72 61 79 3b 20 20 20 20 20 20 20 20  *pArray;        
b930: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
b940: 6f 66 20 61 72 72 61 79 20 76 61 72 69 61 62 6c  of array variabl
b950: 65 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  e */.  Tcl_Obj *
b960: 2a 61 70 43 6f 6c 4e 61 6d 65 3b 20 20 20 20 20  *apColName;     
b970: 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20         /* Array 
b980: 6f 66 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  of column names 
b990: 2a 2f 0a 7d 3b 0a 0a 23 64 65 66 69 6e 65 20 53  */.};..#define S
b9a0: 51 4c 49 54 45 5f 45 56 41 4c 5f 57 49 54 48 4f  QLITE_EVAL_WITHO
b9b0: 55 54 4e 55 4c 4c 53 20 20 30 78 30 30 30 30 31  UTNULLS  0x00001
b9c0: 20 20 2f 2a 20 55 6e 73 65 74 20 61 72 72 61 79    /* Unset array
b9d0: 28 2a 29 20 66 6f 72 20 4e 55 4c 4c 20 2a 2f 0a  (*) for NULL */.
b9e0: 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61  ./*.** Release a
b9f0: 6e 79 20 63 61 63 68 65 20 6f 66 20 63 6f 6c 75  ny cache of colu
ba00: 6d 6e 20 6e 61 6d 65 73 20 63 75 72 72 65 6e 74  mn names current
ba10: 6c 79 20 68 65 6c 64 20 61 73 20 70 61 72 74 20  ly held as part 
ba20: 6f 66 0a 2a 2a 20 74 68 65 20 44 62 45 76 61 6c  of.** the DbEval
ba30: 43 6f 6e 74 65 78 74 20 73 74 72 75 63 74 75 72  Context structur
ba40: 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  e passed as the 
ba50: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a  first argument..
ba60: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64  */.static void d
ba70: 62 52 65 6c 65 61 73 65 43 6f 6c 75 6d 6e 4e 61  bReleaseColumnNa
ba80: 6d 65 73 28 44 62 45 76 61 6c 43 6f 6e 74 65 78  mes(DbEvalContex
ba90: 74 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e  t *p){.  if( p->
baa0: 61 70 43 6f 6c 4e 61 6d 65 20 29 7b 0a 20 20 20  apColName ){.   
bab0: 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
bac0: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20  i=0; i<p->nCol; 
bad0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  i++){.      Tcl_
bae0: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 2d 3e  DecrRefCount(p->
baf0: 61 70 43 6f 6c 4e 61 6d 65 5b 69 5d 29 3b 0a 20  apColName[i]);. 
bb00: 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 46 72 65     }.    Tcl_Fre
bb10: 65 28 28 63 68 61 72 20 2a 29 70 2d 3e 61 70 43  e((char *)p->apC
bb20: 6f 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 70 2d 3e  olName);.    p->
bb30: 61 70 43 6f 6c 4e 61 6d 65 20 3d 20 30 3b 0a 20  apColName = 0;. 
bb40: 20 7d 0a 20 20 70 2d 3e 6e 43 6f 6c 20 3d 20 30   }.  p->nCol = 0
bb50: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69  ;.}../*.** Initi
bb60: 61 6c 69 7a 65 20 61 20 44 62 45 76 61 6c 43 6f  alize a DbEvalCo
bb70: 6e 74 65 78 74 20 73 74 72 75 63 74 75 72 65 2e  ntext structure.
bb80: 0a 2a 2a 0a 2a 2a 20 49 66 20 70 41 72 72 61 79  .**.** If pArray
bb90: 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68   is not NULL, th
bba0: 65 6e 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 74  en it contains t
bbb0: 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 54 63 6c  he name of a Tcl
bbc0: 20 61 72 72 61 79 0a 2a 2a 20 76 61 72 69 61 62   array.** variab
bbd0: 6c 65 2e 20 54 68 65 20 22 2a 22 20 6d 65 6d 62  le. The "*" memb
bbe0: 65 72 20 6f 66 20 74 68 69 73 20 61 72 72 61 79  er of this array
bbf0: 20 69 73 20 73 65 74 20 74 6f 20 61 20 6c 69 73   is set to a lis
bc00: 74 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 2a 2a 20  t containing.** 
bc10: 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 74 68 65  the names of the
bc20: 20 63 6f 6c 75 6d 6e 73 20 72 65 74 75 72 6e 65   columns returne
bc30: 64 20 62 79 20 74 68 65 20 73 74 61 74 65 6d 65  d by the stateme
bc40: 6e 74 20 61 73 20 70 61 72 74 20 6f 66 20 65 61  nt as part of ea
bc50: 63 68 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 64 62  ch.** call to db
bc60: 45 76 61 6c 53 74 65 70 28 29 2c 20 69 6e 20 6f  EvalStep(), in o
bc70: 72 64 65 72 20 66 72 6f 6d 20 6c 65 66 74 20 74  rder from left t
bc80: 6f 20 72 69 67 68 74 2e 20 65 2e 67 2e 20 69 66  o right. e.g. if
bc90: 20 74 68 65 20 6e 61 6d 65 73 0a 2a 2a 20 6f 66   the names.** of
bca0: 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 63 6f   the returned co
bcb0: 6c 75 6d 6e 73 20 61 72 65 20 61 2c 20 62 20 61  lumns are a, b a
bcc0: 6e 64 20 63 2c 20 69 74 20 64 6f 65 73 20 74 68  nd c, it does th
bcd0: 65 20 65 71 75 69 76 61 6c 65 6e 74 20 6f 66 20  e equivalent of 
bce0: 74 68 65 0a 2a 2a 20 74 63 6c 20 63 6f 6d 6d 61  the.** tcl comma
bcf0: 6e 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 73 65  nd:.**.**     se
bd00: 74 20 24 7b 70 41 72 72 61 79 7d 28 2a 29 20 7b  t ${pArray}(*) {
bd10: 61 20 62 20 63 7d 0a 2a 2f 0a 73 74 61 74 69 63  a b c}.*/.static
bd20: 20 76 6f 69 64 20 64 62 45 76 61 6c 49 6e 69 74   void dbEvalInit
bd30: 28 0a 20 20 44 62 45 76 61 6c 43 6f 6e 74 65 78  (.  DbEvalContex
bd40: 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
bd50: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
bd60: 6f 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 69  o structure to i
bd70: 6e 69 74 69 61 6c 69 7a 65 20 2a 2f 0a 20 20 53  nitialize */.  S
bd80: 71 6c 69 74 65 44 62 20 2a 70 44 62 2c 20 20 20  qliteDb *pDb,   
bd90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
bda0: 2a 20 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c  * Database handl
bdb0: 65 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  e */.  Tcl_Obj *
bdc0: 70 53 71 6c 2c 20 20 20 20 20 20 20 20 20 20 20  pSql,           
bdd0: 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63 74         /* Object
bde0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 53 51 4c 20   containing SQL 
bdf0: 73 63 72 69 70 74 20 2a 2f 0a 20 20 54 63 6c 5f  script */.  Tcl_
be00: 4f 62 6a 20 2a 70 41 72 72 61 79 2c 20 20 20 20  Obj *pArray,    
be10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
be20: 61 6d 65 20 6f 66 20 54 63 6c 20 61 72 72 61 79  ame of Tcl array
be30: 20 74 6f 20 73 65 74 20 28 2a 29 20 65 6c 65 6d   to set (*) elem
be40: 65 6e 74 20 6f 66 20 2a 2f 0a 20 20 69 6e 74 20  ent of */.  int 
be50: 65 76 61 6c 46 6c 61 67 73 20 20 20 20 20 20 20  evalFlags       
be60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
be70: 6c 61 67 73 20 63 6f 6e 74 72 6f 6c 6c 69 6e 67  lags controlling
be80: 20 65 76 61 6c 75 61 74 69 6f 6e 20 2a 2f 0a 29   evaluation */.)
be90: 7b 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c  {.  memset(p, 0,
bea0: 20 73 69 7a 65 6f 66 28 44 62 45 76 61 6c 43 6f   sizeof(DbEvalCo
beb0: 6e 74 65 78 74 29 29 3b 0a 20 20 70 2d 3e 70 44  ntext));.  p->pD
bec0: 62 20 3d 20 70 44 62 3b 0a 20 20 70 2d 3e 7a 53  b = pDb;.  p->zS
bed0: 71 6c 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  ql = Tcl_GetStri
bee0: 6e 67 28 70 53 71 6c 29 3b 0a 20 20 70 2d 3e 70  ng(pSql);.  p->p
bef0: 53 71 6c 20 3d 20 70 53 71 6c 3b 0a 20 20 54 63  Sql = pSql;.  Tc
bf00: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70  l_IncrRefCount(p
bf10: 53 71 6c 29 3b 0a 20 20 69 66 28 20 70 41 72 72  Sql);.  if( pArr
bf20: 61 79 20 29 7b 0a 20 20 20 20 70 2d 3e 70 41 72  ay ){.    p->pAr
bf30: 72 61 79 20 3d 20 70 41 72 72 61 79 3b 0a 20 20  ray = pArray;.  
bf40: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
bf50: 6e 74 28 70 41 72 72 61 79 29 3b 0a 20 20 7d 0a  nt(pArray);.  }.
bf60: 20 20 70 2d 3e 65 76 61 6c 46 6c 61 67 73 20 3d    p->evalFlags =
bf70: 20 65 76 61 6c 46 6c 61 67 73 3b 0a 7d 0a 0a 2f   evalFlags;.}../
bf80: 2a 0a 2a 2a 20 4f 62 74 61 69 6e 20 69 6e 66 6f  *.** Obtain info
bf90: 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68  rmation about th
bfa0: 65 20 72 6f 77 20 74 68 61 74 20 74 68 65 20 44  e row that the D
bfb0: 62 45 76 61 6c 43 6f 6e 74 65 78 74 20 70 61 73  bEvalContext pas
bfc0: 73 65 64 20 61 73 20 74 68 65 0a 2a 2a 20 66 69  sed as the.** fi
bfd0: 72 73 74 20 61 72 67 75 6d 65 6e 74 20 63 75 72  rst argument cur
bfe0: 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f  rently points to
bff0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
c000: 20 64 62 45 76 61 6c 52 6f 77 49 6e 66 6f 28 0a   dbEvalRowInfo(.
c010: 20 20 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 20    DbEvalContext 
c020: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
c030: 20 20 2f 2a 20 45 76 61 6c 75 61 74 69 6f 6e 20    /* Evaluation 
c040: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74  context */.  int
c050: 20 2a 70 6e 43 6f 6c 2c 20 20 20 20 20 20 20 20   *pnCol,        
c060: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c070: 4f 55 54 3a 20 4e 75 6d 62 65 72 20 6f 66 20 63  OUT: Number of c
c080: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20  olumn names */. 
c090: 20 54 63 6c 5f 4f 62 6a 20 2a 2a 2a 70 61 70 43   Tcl_Obj ***papC
c0a0: 6f 6c 4e 61 6d 65 20 20 20 20 20 20 20 20 20 20  olName          
c0b0: 20 2f 2a 20 4f 55 54 3a 20 41 72 72 61 79 20 6f   /* OUT: Array o
c0c0: 66 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a  f column names *
c0d0: 2f 0a 29 7b 0a 20 20 2f 2a 20 43 6f 6d 70 75 74  /.){.  /* Comput
c0e0: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a  e column names *
c0f0: 2f 0a 20 20 69 66 28 20 30 3d 3d 70 2d 3e 61 70  /.  if( 0==p->ap
c100: 43 6f 6c 4e 61 6d 65 20 29 7b 0a 20 20 20 20 73  ColName ){.    s
c110: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
c120: 6d 74 20 3d 20 70 2d 3e 70 50 72 65 53 74 6d 74  mt = p->pPreStmt
c130: 2d 3e 70 53 74 6d 74 3b 0a 20 20 20 20 69 6e 74  ->pStmt;.    int
c140: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
c150: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74             /* It
c160: 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c 65 20  erator variable 
c170: 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b  */.    int nCol;
c180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c190: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
c1a0: 66 20 63 6f 6c 75 6d 6e 73 20 72 65 74 75 72 6e  f columns return
c1b0: 65 64 20 62 79 20 70 53 74 6d 74 20 2a 2f 0a 20  ed by pStmt */. 
c1c0: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 61 70 43     Tcl_Obj **apC
c1d0: 6f 6c 4e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20  olName = 0;     
c1e0: 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 63 6f 6c   /* Array of col
c1f0: 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 0a 20 20  umn names */..  
c200: 20 20 70 2d 3e 6e 43 6f 6c 20 3d 20 6e 43 6f 6c    p->nCol = nCol
c210: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
c220: 6e 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29 3b 0a  n_count(pStmt);.
c230: 20 20 20 20 69 66 28 20 6e 43 6f 6c 3e 30 20 26      if( nCol>0 &
c240: 26 20 28 70 61 70 43 6f 6c 4e 61 6d 65 20 7c 7c  & (papColName ||
c250: 20 70 2d 3e 70 41 72 72 61 79 29 20 29 7b 0a 20   p->pArray) ){. 
c260: 20 20 20 20 20 61 70 43 6f 6c 4e 61 6d 65 20 3d       apColName =
c270: 20 28 54 63 6c 5f 4f 62 6a 2a 2a 29 54 63 6c 5f   (Tcl_Obj**)Tcl_
c280: 41 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 54 63  Alloc( sizeof(Tc
c290: 6c 5f 4f 62 6a 2a 29 2a 6e 43 6f 6c 20 29 3b 0a  l_Obj*)*nCol );.
c2a0: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
c2b0: 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nCol; i++){.   
c2c0: 20 20 20 20 20 61 70 43 6f 6c 4e 61 6d 65 5b 69       apColName[i
c2d0: 5d 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  ] = Tcl_NewStrin
c2e0: 67 4f 62 6a 28 73 71 6c 69 74 65 33 5f 63 6f 6c  gObj(sqlite3_col
c2f0: 75 6d 6e 5f 6e 61 6d 65 28 70 53 74 6d 74 2c 69  umn_name(pStmt,i
c300: 29 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 20 20  ), -1);.        
c310: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
c320: 28 61 70 43 6f 6c 4e 61 6d 65 5b 69 5d 29 3b 0a  (apColName[i]);.
c330: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d        }.      p-
c340: 3e 61 70 43 6f 6c 4e 61 6d 65 20 3d 20 61 70 43  >apColName = apC
c350: 6f 6c 4e 61 6d 65 3b 0a 20 20 20 20 7d 0a 0a 20  olName;.    }.. 
c360: 20 20 20 2f 2a 20 49 66 20 72 65 73 75 6c 74 73     /* If results
c370: 20 61 72 65 20 62 65 69 6e 67 20 73 74 6f 72 65   are being store
c380: 64 20 69 6e 20 61 6e 20 61 72 72 61 79 20 76 61  d in an array va
c390: 72 69 61 62 6c 65 2c 20 74 68 65 6e 20 63 72 65  riable, then cre
c3a0: 61 74 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 61  ate.    ** the a
c3b0: 72 72 61 79 28 2a 29 20 65 6e 74 72 79 20 66 6f  rray(*) entry fo
c3c0: 72 20 74 68 61 74 20 61 72 72 61 79 0a 20 20 20  r that array.   
c3d0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 70   */.    if( p->p
c3e0: 41 72 72 61 79 20 29 7b 0a 20 20 20 20 20 20 54  Array ){.      T
c3f0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
c400: 70 20 3d 20 70 2d 3e 70 44 62 2d 3e 69 6e 74 65  p = p->pDb->inte
c410: 72 70 3b 0a 20 20 20 20 20 20 54 63 6c 5f 4f 62  rp;.      Tcl_Ob
c420: 6a 20 2a 70 43 6f 6c 4c 69 73 74 20 3d 20 54 63  j *pColList = Tc
c430: 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20 20 20 20  l_NewObj();.    
c440: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 53 74 61 72    Tcl_Obj *pStar
c450: 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67   = Tcl_NewString
c460: 4f 62 6a 28 22 2a 22 2c 20 2d 31 29 3b 0a 0a 20  Obj("*", -1);.. 
c470: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
c480: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
c490: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
c4a0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
c4b0: 65 72 70 2c 20 70 43 6f 6c 4c 69 73 74 2c 20 61  erp, pColList, a
c4c0: 70 43 6f 6c 4e 61 6d 65 5b 69 5d 29 3b 0a 20 20  pColName[i]);.  
c4d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 54 63 6c 5f      }.      Tcl_
c4e0: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 53 74  IncrRefCount(pSt
c4f0: 61 72 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 4f  ar);.      Tcl_O
c500: 62 6a 53 65 74 56 61 72 32 28 69 6e 74 65 72 70  bjSetVar2(interp
c510: 2c 20 70 2d 3e 70 41 72 72 61 79 2c 20 70 53 74  , p->pArray, pSt
c520: 61 72 2c 20 70 43 6f 6c 4c 69 73 74 2c 20 30 29  ar, pColList, 0)
c530: 3b 0a 20 20 20 20 20 20 54 63 6c 5f 44 65 63 72  ;.      Tcl_Decr
c540: 52 65 66 43 6f 75 6e 74 28 70 53 74 61 72 29 3b  RefCount(pStar);
c550: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
c560: 28 20 70 61 70 43 6f 6c 4e 61 6d 65 20 29 7b 0a  ( papColName ){.
c570: 20 20 20 20 2a 70 61 70 43 6f 6c 4e 61 6d 65 20      *papColName 
c580: 3d 20 70 2d 3e 61 70 43 6f 6c 4e 61 6d 65 3b 0a  = p->apColName;.
c590: 20 20 7d 0a 20 20 69 66 28 20 70 6e 43 6f 6c 20    }.  if( pnCol 
c5a0: 29 7b 0a 20 20 20 20 2a 70 6e 43 6f 6c 20 3d 20  ){.    *pnCol = 
c5b0: 70 2d 3e 6e 43 6f 6c 3b 0a 20 20 7d 0a 7d 0a 0a  p->nCol;.  }.}..
c5c0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 6f 6e 65  /*.** Return one
c5d0: 20 6f 66 20 54 43 4c 5f 4f 4b 2c 20 54 43 4c 5f   of TCL_OK, TCL_
c5e0: 42 52 45 41 4b 20 6f 72 20 54 43 4c 5f 45 52 52  BREAK or TCL_ERR
c5f0: 4f 52 2e 20 49 66 20 54 43 4c 5f 45 52 52 4f 52  OR. If TCL_ERROR
c600: 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2c   is.** returned,
c610: 20 74 68 65 6e 20 61 6e 20 65 72 72 6f 72 20 6d   then an error m
c620: 65 73 73 61 67 65 20 69 73 20 73 74 6f 72 65 64  essage is stored
c630: 20 69 6e 20 74 68 65 20 69 6e 74 65 72 70 72 65   in the interpre
c640: 74 65 72 20 62 65 66 6f 72 65 0a 2a 2a 20 72 65  ter before.** re
c650: 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41  turning..**.** A
c660: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66   return value of
c670: 20 54 43 4c 5f 4f 4b 20 6d 65 61 6e 73 20 74 68   TCL_OK means th
c680: 65 72 65 20 69 73 20 61 20 72 6f 77 20 6f 66 20  ere is a row of 
c690: 64 61 74 61 20 61 76 61 69 6c 61 62 6c 65 2e 20  data available. 
c6a0: 54 68 65 0a 2a 2a 20 64 61 74 61 20 6d 61 79 20  The.** data may 
c6b0: 62 65 20 61 63 63 65 73 73 65 64 20 75 73 69 6e  be accessed usin
c6c0: 67 20 64 62 45 76 61 6c 52 6f 77 49 6e 66 6f 28  g dbEvalRowInfo(
c6d0: 29 20 61 6e 64 20 64 62 45 76 61 6c 43 6f 6c 75  ) and dbEvalColu
c6e0: 6d 6e 56 61 6c 75 65 28 29 2e 20 54 68 69 73 0a  mnValue(). This.
c6f0: 2a 2a 20 69 73 20 61 6e 61 6c 6f 67 6f 75 73 20  ** is analogous 
c700: 74 6f 20 61 20 72 65 74 75 72 6e 20 6f 66 20 53  to a return of S
c710: 51 4c 49 54 45 5f 52 4f 57 20 66 72 6f 6d 20 73  QLITE_ROW from s
c720: 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2e 20 49  qlite3_step(). I
c730: 66 20 54 43 4c 5f 42 52 45 41 4b 0a 2a 2a 20 69  f TCL_BREAK.** i
c740: 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65 6e  s returned, then
c750: 20 74 68 65 20 53 51 4c 20 73 63 72 69 70 74 20   the SQL script 
c760: 68 61 73 20 66 69 6e 69 73 68 65 64 20 65 78 65  has finished exe
c770: 63 75 74 69 6e 67 20 61 6e 64 20 74 68 65 72 65  cuting and there
c780: 20 61 72 65 0a 2a 2a 20 6e 6f 20 66 75 72 74 68   are.** no furth
c790: 65 72 20 72 6f 77 73 20 61 76 61 69 6c 61 62 6c  er rows availabl
c7a0: 65 2e 20 54 68 69 73 20 69 73 20 73 69 6d 69 6c  e. This is simil
c7b0: 61 72 20 74 6f 20 53 51 4c 49 54 45 5f 44 4f 4e  ar to SQLITE_DON
c7c0: 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  E..*/.static int
c7d0: 20 64 62 45 76 61 6c 53 74 65 70 28 44 62 45 76   dbEvalStep(DbEv
c7e0: 61 6c 43 6f 6e 74 65 78 74 20 2a 70 29 7b 0a 20  alContext *p){. 
c7f0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 72   const char *zPr
c800: 65 76 53 71 6c 20 3d 20 30 3b 20 20 20 20 20 20  evSql = 0;      
c810: 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 76 61 6c   /* Previous val
c820: 75 65 20 6f 66 20 70 2d 3e 7a 53 71 6c 20 2a 2f  ue of p->zSql */
c830: 0a 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 7a 53  ..  while( p->zS
c840: 71 6c 5b 30 5d 20 7c 7c 20 70 2d 3e 70 50 72 65  ql[0] || p->pPre
c850: 53 74 6d 74 20 29 7b 0a 20 20 20 20 69 6e 74 20  Stmt ){.    int 
c860: 72 63 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70  rc;.    if( p->p
c870: 50 72 65 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20  PreStmt==0 ){.  
c880: 20 20 20 20 7a 50 72 65 76 53 71 6c 20 3d 20 28      zPrevSql = (
c890: 70 2d 3e 7a 53 71 6c 3d 3d 7a 50 72 65 76 53 71  p->zSql==zPrevSq
c8a0: 6c 20 3f 20 30 20 3a 20 70 2d 3e 7a 53 71 6c 29  l ? 0 : p->zSql)
c8b0: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 64 62 50  ;.      rc = dbP
c8c0: 72 65 70 61 72 65 41 6e 64 42 69 6e 64 28 70 2d  repareAndBind(p-
c8d0: 3e 70 44 62 2c 20 70 2d 3e 7a 53 71 6c 2c 20 26  >pDb, p->zSql, &
c8e0: 70 2d 3e 7a 53 71 6c 2c 20 26 70 2d 3e 70 50 72  p->zSql, &p->pPr
c8f0: 65 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 69 66  eStmt);.      if
c900: 28 20 72 63 21 3d 54 43 4c 5f 4f 4b 20 29 20 72  ( rc!=TCL_OK ) r
c910: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 65  eturn rc;.    }e
c920: 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 72  lse{.      int r
c930: 63 73 3b 0a 20 20 20 20 20 20 53 71 6c 69 74 65  cs;.      Sqlite
c940: 44 62 20 2a 70 44 62 20 3d 20 70 2d 3e 70 44 62  Db *pDb = p->pDb
c950: 3b 0a 20 20 20 20 20 20 53 71 6c 50 72 65 70 61  ;.      SqlPrepa
c960: 72 65 64 53 74 6d 74 20 2a 70 50 72 65 53 74 6d  redStmt *pPreStm
c970: 74 20 3d 20 70 2d 3e 70 50 72 65 53 74 6d 74 3b  t = p->pPreStmt;
c980: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
c990: 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 70 50 72  tmt *pStmt = pPr
c9a0: 65 53 74 6d 74 2d 3e 70 53 74 6d 74 3b 0a 0a 20  eStmt->pStmt;.. 
c9b0: 20 20 20 20 20 72 63 73 20 3d 20 73 71 6c 69 74       rcs = sqlit
c9c0: 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3b 0a  e3_step(pStmt);.
c9d0: 20 20 20 20 20 20 69 66 28 20 72 63 73 3d 3d 53        if( rcs==S
c9e0: 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20  QLITE_ROW ){.   
c9f0: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
ca00: 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OK;.      }.    
ca10: 20 20 69 66 28 20 70 2d 3e 70 41 72 72 61 79 20    if( p->pArray 
ca20: 29 7b 0a 20 20 20 20 20 20 20 20 64 62 45 76 61  ){.        dbEva
ca30: 6c 52 6f 77 49 6e 66 6f 28 70 2c 20 30 2c 20 30  lRowInfo(p, 0, 0
ca40: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
ca50: 20 72 63 73 20 3d 20 73 71 6c 69 74 65 33 5f 72   rcs = sqlite3_r
ca60: 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 0a 20 20  eset(pStmt);..  
ca70: 20 20 20 20 70 44 62 2d 3e 6e 53 74 65 70 20 3d      pDb->nStep =
ca80: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74   sqlite3_stmt_st
ca90: 61 74 75 73 28 70 53 74 6d 74 2c 53 51 4c 49 54  atus(pStmt,SQLIT
caa0: 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 46 55 4c  E_STMTSTATUS_FUL
cab0: 4c 53 43 41 4e 5f 53 54 45 50 2c 31 29 3b 0a 20  LSCAN_STEP,1);. 
cac0: 20 20 20 20 20 70 44 62 2d 3e 6e 53 6f 72 74 20       pDb->nSort 
cad0: 3d 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73  = sqlite3_stmt_s
cae0: 74 61 74 75 73 28 70 53 74 6d 74 2c 53 51 4c 49  tatus(pStmt,SQLI
caf0: 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 53 4f  TE_STMTSTATUS_SO
cb00: 52 54 2c 31 29 3b 0a 20 20 20 20 20 20 70 44 62  RT,1);.      pDb
cb10: 2d 3e 6e 49 6e 64 65 78 20 3d 20 73 71 6c 69 74  ->nIndex = sqlit
cb20: 65 33 5f 73 74 6d 74 5f 73 74 61 74 75 73 28 70  e3_stmt_status(p
cb30: 53 74 6d 74 2c 53 51 4c 49 54 45 5f 53 54 4d 54  Stmt,SQLITE_STMT
cb40: 53 54 41 54 55 53 5f 41 55 54 4f 49 4e 44 45 58  STATUS_AUTOINDEX
cb50: 2c 31 29 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e  ,1);.      pDb->
cb60: 6e 56 4d 53 74 65 70 20 3d 20 73 71 6c 69 74 65  nVMStep = sqlite
cb70: 33 5f 73 74 6d 74 5f 73 74 61 74 75 73 28 70 53  3_stmt_status(pS
cb80: 74 6d 74 2c 53 51 4c 49 54 45 5f 53 54 4d 54 53  tmt,SQLITE_STMTS
cb90: 54 41 54 55 53 5f 56 4d 5f 53 54 45 50 2c 31 29  TATUS_VM_STEP,1)
cba0: 3b 0a 20 20 20 20 20 20 64 62 52 65 6c 65 61 73  ;.      dbReleas
cbb0: 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 29 3b  eColumnNames(p);
cbc0: 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 65 53 74  .      p->pPreSt
cbd0: 6d 74 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 69  mt = 0;..      i
cbe0: 66 28 20 72 63 73 21 3d 53 51 4c 49 54 45 5f 4f  f( rcs!=SQLITE_O
cbf0: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  K ){.        /* 
cc00: 49 66 20 61 20 72 75 6e 2d 74 69 6d 65 20 65 72  If a run-time er
cc10: 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 70 6f  ror occurs, repo
cc20: 72 74 20 74 68 65 20 65 72 72 6f 72 20 61 6e 64  rt the error and
cc30: 20 73 74 6f 70 20 72 65 61 64 69 6e 67 0a 20 20   stop reading.  
cc40: 20 20 20 20 20 20 2a 2a 20 74 68 65 20 53 51 4c        ** the SQL
cc50: 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 64 62  .  */.        db
cc60: 52 65 6c 65 61 73 65 53 74 6d 74 28 70 44 62 2c  ReleaseStmt(pDb,
cc70: 20 70 50 72 65 53 74 6d 74 2c 20 31 29 3b 0a 23   pPreStmt, 1);.#
cc80: 69 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  if SQLITE_TEST. 
cc90: 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 44         if( p->pD
cca0: 62 2d 3e 62 4c 65 67 61 63 79 50 72 65 70 61 72  b->bLegacyPrepar
ccb0: 65 20 26 26 20 72 63 73 3d 3d 53 51 4c 49 54 45  e && rcs==SQLITE
ccc0: 5f 53 43 48 45 4d 41 20 26 26 20 7a 50 72 65 76  _SCHEMA && zPrev
ccd0: 53 71 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Sql ){.         
cce0: 20 2f 2a 20 49 66 20 74 68 65 20 72 75 6e 74 69   /* If the runti
ccf0: 6d 65 20 65 72 72 6f 72 20 77 61 73 20 61 6e 20  me error was an 
cd00: 53 51 4c 49 54 45 5f 53 43 48 45 4d 41 2c 20 61  SQLITE_SCHEMA, a
cd10: 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  nd the database.
cd20: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 68 61 6e            ** han
cd30: 64 6c 65 20 69 73 20 63 6f 6e 66 69 67 75 72 65  dle is configure
cd40: 64 20 74 6f 20 75 73 65 20 74 68 65 20 6c 65 67  d to use the leg
cd50: 61 63 79 20 73 71 6c 69 74 65 33 5f 70 72 65 70  acy sqlite3_prep
cd60: 61 72 65 28 29 0a 20 20 20 20 20 20 20 20 20 20  are().          
cd70: 2a 2a 20 69 6e 74 65 72 66 61 63 65 2c 20 72 65  ** interface, re
cd80: 74 72 79 20 70 72 65 70 61 72 65 28 29 2f 73 74  try prepare()/st
cd90: 65 70 28 29 20 6f 6e 20 74 68 65 20 73 61 6d 65  ep() on the same
cda0: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a   SQL statement..
cdb0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69            ** Thi
cdc0: 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 6f  s only happens o
cdd0: 6e 63 65 2e 20 49 66 20 74 68 65 72 65 20 69 73  nce. If there is
cde0: 20 61 20 73 65 63 6f 6e 64 20 53 51 4c 49 54 45   a second SQLITE
cdf0: 5f 53 43 48 45 4d 41 0a 20 20 20 20 20 20 20 20  _SCHEMA.        
ce00: 20 20 2a 2a 20 65 72 72 6f 72 2c 20 74 68 65 20    ** error, the 
ce10: 65 72 72 6f 72 20 77 69 6c 6c 20 62 65 20 72 65  error will be re
ce20: 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61  turned to the ca
ce30: 6c 6c 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20  ller. */.       
ce40: 20 20 20 70 2d 3e 7a 53 71 6c 20 3d 20 7a 50 72     p->zSql = zPr
ce50: 65 76 53 71 6c 3b 0a 20 20 20 20 20 20 20 20 20  evSql;.         
ce60: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
ce70: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
ce80: 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65      Tcl_SetObjRe
ce90: 73 75 6c 74 28 70 44 62 2d 3e 69 6e 74 65 72 70  sult(pDb->interp
cea0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
ceb0: 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 4e             Tcl_N
cec0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 73 71 6c 69  ewStringObj(sqli
ced0: 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e  te3_errmsg(pDb->
cee0: 64 62 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 20  db), -1));.     
cef0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
cf00: 52 4f 52 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ROR;.      }else
cf10: 7b 0a 20 20 20 20 20 20 20 20 64 62 52 65 6c 65  {.        dbRele
cf20: 61 73 65 53 74 6d 74 28 70 44 62 2c 20 70 50 72  aseStmt(pDb, pPr
cf30: 65 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 20  eStmt, 0);.     
cf40: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
cf50: 2f 2a 20 46 69 6e 69 73 68 65 64 20 2a 2f 0a 20  /* Finished */. 
cf60: 20 72 65 74 75 72 6e 20 54 43 4c 5f 42 52 45 41   return TCL_BREA
cf70: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65  K;.}../*.** Free
cf80: 20 61 6c 6c 20 72 65 73 6f 75 72 63 65 73 20 63   all resources c
cf90: 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 20 62 79  urrently held by
cfa0: 20 74 68 65 20 44 62 45 76 61 6c 43 6f 6e 74 65   the DbEvalConte
cfb0: 78 74 20 73 74 72 75 63 74 75 72 65 20 70 61 73  xt structure pas
cfc0: 73 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 66 69  sed.** as the fi
cfd0: 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 54 68  rst argument. Th
cfe0: 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20 65 78  ere should be ex
cff0: 61 63 74 6c 79 20 6f 6e 65 20 63 61 6c 6c 20 74  actly one call t
d000: 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  o this function.
d010: 2a 2a 20 66 6f 72 20 65 61 63 68 20 63 61 6c 6c  ** for each call
d020: 20 74 6f 20 64 62 45 76 61 6c 49 6e 69 74 28 29   to dbEvalInit()
d030: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
d040: 20 64 62 45 76 61 6c 46 69 6e 61 6c 69 7a 65 28   dbEvalFinalize(
d050: 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 20 2a 70  DbEvalContext *p
d060: 29 7b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 65  ){.  if( p->pPre
d070: 53 74 6d 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  Stmt ){.    sqli
d080: 74 65 33 5f 72 65 73 65 74 28 70 2d 3e 70 50 72  te3_reset(p->pPr
d090: 65 53 74 6d 74 2d 3e 70 53 74 6d 74 29 3b 0a 20  eStmt->pStmt);. 
d0a0: 20 20 20 64 62 52 65 6c 65 61 73 65 53 74 6d 74     dbReleaseStmt
d0b0: 28 70 2d 3e 70 44 62 2c 20 70 2d 3e 70 50 72 65  (p->pDb, p->pPre
d0c0: 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 70 2d  Stmt, 0);.    p-
d0d0: 3e 70 50 72 65 53 74 6d 74 20 3d 20 30 3b 0a 20  >pPreStmt = 0;. 
d0e0: 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 41 72 72   }.  if( p->pArr
d0f0: 61 79 20 29 7b 0a 20 20 20 20 54 63 6c 5f 44 65  ay ){.    Tcl_De
d100: 63 72 52 65 66 43 6f 75 6e 74 28 70 2d 3e 70 41  crRefCount(p->pA
d110: 72 72 61 79 29 3b 0a 20 20 20 20 70 2d 3e 70 41  rray);.    p->pA
d120: 72 72 61 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  rray = 0;.  }.  
d130: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
d140: 28 70 2d 3e 70 53 71 6c 29 3b 0a 20 20 64 62 52  (p->pSql);.  dbR
d150: 65 6c 65 61 73 65 43 6f 6c 75 6d 6e 4e 61 6d 65  eleaseColumnName
d160: 73 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  s(p);.}../*.** R
d170: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
d180: 74 6f 20 61 20 54 63 6c 5f 4f 62 6a 20 73 74 72  to a Tcl_Obj str
d190: 75 63 74 75 72 65 20 77 69 74 68 20 72 65 66 2d  ucture with ref-
d1a0: 63 6f 75 6e 74 20 30 20 74 68 61 74 20 63 6f 6e  count 0 that con
d1b0: 74 61 69 6e 73 0a 2a 2a 20 74 68 65 20 76 61 6c  tains.** the val
d1c0: 75 65 20 66 6f 72 20 74 68 65 20 69 43 6f 6c 27  ue for the iCol'
d1d0: 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65  th column of the
d1e0: 20 72 6f 77 20 63 75 72 72 65 6e 74 6c 79 20 70   row currently p
d1f0: 6f 69 6e 74 65 64 20 74 6f 20 62 79 0a 2a 2a 20  ointed to by.** 
d200: 74 68 65 20 44 62 45 76 61 6c 43 6f 6e 74 65 78  the DbEvalContex
d210: 74 20 73 74 72 75 63 74 75 72 65 20 70 61 73 73  t structure pass
d220: 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ed as the first 
d230: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61  argument..*/.sta
d240: 74 69 63 20 54 63 6c 5f 4f 62 6a 20 2a 64 62 45  tic Tcl_Obj *dbE
d250: 76 61 6c 43 6f 6c 75 6d 6e 56 61 6c 75 65 28 44  valColumnValue(D
d260: 62 45 76 61 6c 43 6f 6e 74 65 78 74 20 2a 70 2c  bEvalContext *p,
d270: 20 69 6e 74 20 69 43 6f 6c 29 7b 0a 20 20 73 71   int iCol){.  sq
d280: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
d290: 74 20 3d 20 70 2d 3e 70 50 72 65 53 74 6d 74 2d  t = p->pPreStmt-
d2a0: 3e 70 53 74 6d 74 3b 0a 20 20 73 77 69 74 63 68  >pStmt;.  switch
d2b0: 28 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  ( sqlite3_column
d2c0: 5f 74 79 70 65 28 70 53 74 6d 74 2c 20 69 43 6f  _type(pStmt, iCo
d2d0: 6c 29 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53  l) ){.    case S
d2e0: 51 4c 49 54 45 5f 42 4c 4f 42 3a 20 7b 0a 20 20  QLITE_BLOB: {.  
d2f0: 20 20 20 20 69 6e 74 20 62 79 74 65 73 20 3d 20      int bytes = 
d300: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62  sqlite3_column_b
d310: 79 74 65 73 28 70 53 74 6d 74 2c 20 69 43 6f 6c  ytes(pStmt, iCol
d320: 29 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  );.      const c
d330: 68 61 72 20 2a 7a 42 6c 6f 62 20 3d 20 73 71 6c  har *zBlob = sql
d340: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62  ite3_column_blob
d350: 28 70 53 74 6d 74 2c 20 69 43 6f 6c 29 3b 0a 20  (pStmt, iCol);. 
d360: 20 20 20 20 20 69 66 28 20 21 7a 42 6c 6f 62 20       if( !zBlob 
d370: 29 20 62 79 74 65 73 20 3d 20 30 3b 0a 20 20 20  ) bytes = 0;.   
d380: 20 20 20 72 65 74 75 72 6e 20 54 63 6c 5f 4e 65     return Tcl_Ne
d390: 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 28 75  wByteArrayObj((u
d3a0: 38 2a 29 7a 42 6c 6f 62 2c 20 62 79 74 65 73 29  8*)zBlob, bytes)
d3b0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
d3c0: 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3a   SQLITE_INTEGER:
d3d0: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 5f   {.      sqlite_
d3e0: 69 6e 74 36 34 20 76 20 3d 20 73 71 6c 69 74 65  int64 v = sqlite
d3f0: 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70  3_column_int64(p
d400: 53 74 6d 74 2c 20 69 43 6f 6c 29 3b 0a 20 20 20  Stmt, iCol);.   
d410: 20 20 20 69 66 28 20 76 3e 3d 2d 32 31 34 37 34     if( v>=-21474
d420: 38 33 36 34 37 20 26 26 20 76 3c 3d 32 31 34 37  83647 && v<=2147
d430: 34 38 33 36 34 37 20 29 7b 0a 20 20 20 20 20 20  483647 ){.      
d440: 20 20 72 65 74 75 72 6e 20 54 63 6c 5f 4e 65 77    return Tcl_New
d450: 49 6e 74 4f 62 6a 28 28 69 6e 74 29 76 29 3b 0a  IntObj((int)v);.
d460: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
d470: 20 20 20 20 20 72 65 74 75 72 6e 20 54 63 6c 5f       return Tcl_
d480: 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 76 29  NewWideIntObj(v)
d490: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
d4a0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
d4b0: 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20 72  FLOAT: {.      r
d4c0: 65 74 75 72 6e 20 54 63 6c 5f 4e 65 77 44 6f 75  eturn Tcl_NewDou
d4d0: 62 6c 65 4f 62 6a 28 73 71 6c 69 74 65 33 5f 63  bleObj(sqlite3_c
d4e0: 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 28 70 53 74  olumn_double(pSt
d4f0: 6d 74 2c 20 69 43 6f 6c 29 29 3b 0a 20 20 20 20  mt, iCol));.    
d500: 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
d510: 45 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20  E_NULL: {.      
d520: 72 65 74 75 72 6e 20 54 63 6c 5f 4e 65 77 53 74  return Tcl_NewSt
d530: 72 69 6e 67 4f 62 6a 28 70 2d 3e 70 44 62 2d 3e  ringObj(p->pDb->
d540: 7a 4e 75 6c 6c 2c 20 2d 31 29 3b 0a 20 20 20 20  zNull, -1);.    
d550: 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
d560: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
d570: 28 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  ((char*)sqlite3_
d580: 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d  column_text(pStm
d590: 74 2c 20 69 43 6f 6c 29 2c 20 2d 31 29 3b 0a 7d  t, iCol), -1);.}
d5a0: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 75 73 69 6e 67  ../*.** If using
d5b0: 20 54 63 6c 20 76 65 72 73 69 6f 6e 20 38 2e 36   Tcl version 8.6
d5c0: 20 6f 72 20 67 72 65 61 74 65 72 2c 20 75 73 65   or greater, use
d5d0: 20 74 68 65 20 4e 52 20 66 75 6e 63 74 69 6f 6e   the NR function
d5e0: 73 20 74 6f 20 61 76 6f 69 64 0a 2a 2a 20 72 65  s to avoid.** re
d5f0: 63 75 72 73 69 76 65 20 65 76 61 6c 75 74 69 6f  cursive evalutio
d600: 6e 20 6f 66 20 73 63 72 69 70 74 73 20 62 79 20  n of scripts by 
d610: 74 68 65 20 5b 64 62 20 65 76 61 6c 5d 20 61 6e  the [db eval] an
d620: 64 20 5b 64 62 20 74 72 61 6e 73 5d 0a 2a 2a 20  d [db trans].** 
d630: 63 6f 6d 6d 61 6e 64 73 2e 20 45 76 65 6e 20 69  commands. Even i
d640: 66 20 74 68 65 20 68 65 61 64 65 72 73 20 75 73  f the headers us
d650: 65 64 20 77 68 69 6c 65 20 63 6f 6d 70 69 6c 69  ed while compili
d660: 6e 67 20 74 68 65 20 65 78 74 65 6e 73 69 6f 6e  ng the extension
d670: 0a 2a 2a 20 61 72 65 20 38 2e 36 20 6f 72 20 6e  .** are 8.6 or n
d680: 65 77 65 72 2c 20 74 68 65 20 63 6f 64 65 20 73  ewer, the code s
d690: 74 69 6c 6c 20 74 65 73 74 73 20 74 68 65 20 54  till tests the T
d6a0: 63 6c 20 76 65 72 73 69 6f 6e 20 61 74 20 72 75  cl version at ru
d6b0: 6e 74 69 6d 65 2e 0a 2a 2a 20 54 68 69 73 20 61  ntime..** This a
d6c0: 6c 6c 6f 77 73 20 73 74 75 62 73 2d 65 6e 61 62  llows stubs-enab
d6d0: 6c 65 64 20 62 75 69 6c 64 73 20 74 6f 20 62 65  led builds to be
d6e0: 20 75 73 65 64 20 77 69 74 68 20 6f 6c 64 65 72   used with older
d6f0: 20 54 63 6c 20 6c 69 62 72 61 72 69 65 73 2e 0a   Tcl libraries..
d700: 2a 2f 0a 23 69 66 20 54 43 4c 5f 4d 41 4a 4f 52  */.#if TCL_MAJOR
d710: 5f 56 45 52 53 49 4f 4e 3e 38 20 7c 7c 20 28 54  _VERSION>8 || (T
d720: 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f 4e  CL_MAJOR_VERSION
d730: 3d 3d 38 20 26 26 20 54 43 4c 5f 4d 49 4e 4f 52  ==8 && TCL_MINOR
d740: 5f 56 45 52 53 49 4f 4e 3e 3d 36 29 0a 23 20 64  _VERSION>=6).# d
d750: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 54 43 4c  efine SQLITE_TCL
d760: 5f 4e 52 45 20 31 0a 73 74 61 74 69 63 20 69 6e  _NRE 1.static in
d770: 74 20 44 62 55 73 65 4e 72 65 28 76 6f 69 64 29  t DbUseNre(void)
d780: 7b 0a 20 20 69 6e 74 20 6d 61 6a 6f 72 2c 20 6d  {.  int major, m
d790: 69 6e 6f 72 3b 0a 20 20 54 63 6c 5f 47 65 74 56  inor;.  Tcl_GetV
d7a0: 65 72 73 69 6f 6e 28 26 6d 61 6a 6f 72 2c 20 26  ersion(&major, &
d7b0: 6d 69 6e 6f 72 2c 20 30 2c 20 30 29 3b 0a 20 20  minor, 0, 0);.  
d7c0: 72 65 74 75 72 6e 28 20 28 6d 61 6a 6f 72 3d 3d  return( (major==
d7d0: 38 20 26 26 20 6d 69 6e 6f 72 3e 3d 36 29 20 7c  8 && minor>=6) |
d7e0: 7c 20 6d 61 6a 6f 72 3e 38 20 29 3b 0a 7d 0a 23  | major>8 );.}.#
d7f0: 65 6c 73 65 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 69  else./*.** Compi
d800: 6c 69 6e 67 20 75 73 69 6e 67 20 68 65 61 64 65  ling using heade
d810: 72 73 20 65 61 72 6c 69 65 72 20 74 68 61 6e 20  rs earlier than 
d820: 38 2e 36 2e 20 49 6e 20 74 68 69 73 20 63 61 73  8.6. In this cas
d830: 65 20 4e 52 20 63 61 6e 6e 6f 74 20 62 65 0a 2a  e NR cannot be.*
d840: 2a 20 75 73 65 64 2c 20 73 6f 20 44 62 55 73 65  * used, so DbUse
d850: 4e 72 65 28 29 20 74 6f 20 61 6c 77 61 79 73 20  Nre() to always 
d860: 72 65 74 75 72 6e 20 7a 65 72 6f 2e 20 41 64 64  return zero. Add
d870: 20 23 64 65 66 69 6e 65 73 20 66 6f 72 20 74 68   #defines for th
d880: 65 20 6f 74 68 65 72 0a 2a 2a 20 54 63 6c 5f 4e  e other.** Tcl_N
d890: 52 78 78 78 28 29 20 66 75 6e 63 74 69 6f 6e 73  Rxxx() functions
d8a0: 20 74 6f 20 70 72 65 76 65 6e 74 20 74 68 65 6d   to prevent them
d8b0: 20 66 72 6f 6d 20 63 61 75 73 69 6e 67 20 63 6f   from causing co
d8c0: 6d 70 69 6c 61 74 69 6f 6e 20 65 72 72 6f 72 73  mpilation errors
d8d0: 2c 0a 2a 2a 20 65 76 65 6e 20 74 68 6f 75 67 68  ,.** even though
d8e0: 20 74 68 65 20 6f 6e 6c 79 20 69 6e 76 6f 63 61   the only invoca
d8f0: 74 69 6f 6e 73 20 6f 66 20 74 68 65 6d 20 61 72  tions of them ar
d900: 65 20 77 69 74 68 69 6e 20 63 6f 6e 64 69 74 69  e within conditi
d910: 6f 6e 61 6c 20 62 6c 6f 63 6b 73 0a 2a 2a 20 6f  onal blocks.** o
d920: 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a  f the form:.**.*
d930: 2a 20 20 20 69 66 28 20 44 62 55 73 65 4e 72 65  *   if( DbUseNre
d940: 28 29 20 29 20 7b 20 2e 2e 2e 20 7d 0a 2a 2f 0a  () ) { ... }.*/.
d950: 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f  # define SQLITE_
d960: 54 43 4c 5f 4e 52 45 20 30 0a 23 20 64 65 66 69  TCL_NRE 0.# defi
d970: 6e 65 20 44 62 55 73 65 4e 72 65 28 29 20 30 0a  ne DbUseNre() 0.
d980: 23 20 64 65 66 69 6e 65 20 54 63 6c 5f 4e 52 41  # define Tcl_NRA
d990: 64 64 43 61 6c 6c 62 61 63 6b 28 61 2c 62 2c 63  ddCallback(a,b,c
d9a0: 2c 64 2c 65 2c 66 29 20 28 76 6f 69 64 29 30 0a  ,d,e,f) (void)0.
d9b0: 23 20 64 65 66 69 6e 65 20 54 63 6c 5f 4e 52 45  # define Tcl_NRE
d9c0: 76 61 6c 4f 62 6a 28 61 2c 62 2c 63 29 20 30 0a  valObj(a,b,c) 0.
d9d0: 23 20 64 65 66 69 6e 65 20 54 63 6c 5f 4e 52 43  # define Tcl_NRC
d9e0: 72 65 61 74 65 43 6f 6d 6d 61 6e 64 28 61 2c 62  reateCommand(a,b
d9f0: 2c 63 2c 64 2c 65 2c 66 29 20 28 76 6f 69 64 29  ,c,d,e,f) (void)
da00: 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  0.#endif../*.** 
da10: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
da20: 20 70 61 72 74 20 6f 66 20 74 68 65 20 69 6d 70   part of the imp
da30: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
da40: 68 65 20 63 6f 6d 6d 61 6e 64 3a 0a 2a 2a 0a 2a  he command:.**.*
da50: 2a 20 20 20 24 64 62 20 65 76 61 6c 20 53 51 4c  *   $db eval SQL
da60: 20 3f 41 52 52 41 59 4e 41 4d 45 3f 20 53 43 52   ?ARRAYNAME? SCR
da70: 49 50 54 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  IPT.*/.static in
da80: 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20  t SQLITE_TCLAPI 
da90: 44 62 45 76 61 6c 4e 65 78 74 43 6d 64 28 0a 20  DbEvalNextCmd(. 
daa0: 20 43 6c 69 65 6e 74 44 61 74 61 20 64 61 74 61   ClientData data
dab0: 5b 5d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  [],             
dac0: 20 20 20 20 20 20 2f 2a 20 64 61 74 61 5b 30 5d        /* data[0]
dad0: 20 69 73 20 74 68 65 20 28 44 62 45 76 61 6c 43   is the (DbEvalC
dae0: 6f 6e 74 65 78 74 2a 29 20 2a 2f 0a 20 20 54 63  ontext*) */.  Tc
daf0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
db00: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
db10: 20 20 20 2f 2a 20 54 63 6c 20 69 6e 74 65 72 70     /* Tcl interp
db20: 72 65 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72  reter */.  int r
db30: 65 73 75 6c 74 20 20 20 20 20 20 20 20 20 20 20  esult           
db40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db50: 2f 2a 20 52 65 73 75 6c 74 20 73 6f 20 66 61 72  /* Result so far
db60: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   */.){.  int rc 
db70: 3d 20 72 65 73 75 6c 74 3b 20 20 20 20 20 20 20  = result;       
db80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
db90: 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
dba0: 0a 20 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20  .  /* The first 
dbb0: 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 64  element of the d
dbc0: 61 74 61 5b 5d 20 61 72 72 61 79 20 69 73 20 61  ata[] array is a
dbd0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 44 62   pointer to a Db
dbe0: 45 76 61 6c 43 6f 6e 74 65 78 74 0a 20 20 2a 2a  EvalContext.  **
dbf0: 20 73 74 72 75 63 74 75 72 65 20 61 6c 6c 6f 63   structure alloc
dc00: 61 74 65 64 20 75 73 69 6e 67 20 54 63 6c 5f 41  ated using Tcl_A
dc10: 6c 6c 6f 63 28 29 2e 20 54 68 65 20 73 65 63 6f  lloc(). The seco
dc20: 6e 64 20 65 6c 65 6d 65 6e 74 20 6f 66 20 64 61  nd element of da
dc30: 74 61 5b 5d 0a 20 20 2a 2a 20 69 73 20 61 20 70  ta[].  ** is a p
dc40: 6f 69 6e 74 65 72 20 74 6f 20 61 20 54 63 6c 5f  ointer to a Tcl_
dc50: 4f 62 6a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  Obj containing t
dc60: 68 65 20 73 63 72 69 70 74 20 74 6f 20 72 75 6e  he script to run
dc70: 20 66 6f 72 20 65 61 63 68 20 72 6f 77 0a 20 20   for each row.  
dc80: 2a 2a 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  ** returned by t
dc90: 68 65 20 71 75 65 72 69 65 73 20 65 6e 63 61 70  he queries encap
dca0: 73 75 6c 61 74 65 64 20 69 6e 20 64 61 74 61 5b  sulated in data[
dcb0: 30 5d 2e 20 2a 2f 0a 20 20 44 62 45 76 61 6c 43  0]. */.  DbEvalC
dcc0: 6f 6e 74 65 78 74 20 2a 70 20 3d 20 28 44 62 45  ontext *p = (DbE
dcd0: 76 61 6c 43 6f 6e 74 65 78 74 20 2a 29 64 61 74  valContext *)dat
dce0: 61 5b 30 5d 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20  a[0];.  Tcl_Obj 
dcf0: 2a 70 53 63 72 69 70 74 20 3d 20 28 54 63 6c 5f  *pScript = (Tcl_
dd00: 4f 62 6a 20 2a 29 64 61 74 61 5b 31 5d 3b 0a 20  Obj *)data[1];. 
dd10: 20 54 63 6c 5f 4f 62 6a 20 2a 70 41 72 72 61 79   Tcl_Obj *pArray
dd20: 20 3d 20 70 2d 3e 70 41 72 72 61 79 3b 0a 0a 20   = p->pArray;.. 
dd30: 20 77 68 69 6c 65 28 20 28 72 63 3d 3d 54 43 4c   while( (rc==TCL
dd40: 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 54 43 4c 5f 43  _OK || rc==TCL_C
dd50: 4f 4e 54 49 4e 55 45 29 20 26 26 20 54 43 4c 5f  ONTINUE) && TCL_
dd60: 4f 4b 3d 3d 28 72 63 20 3d 20 64 62 45 76 61 6c  OK==(rc = dbEval
dd70: 53 74 65 70 28 70 29 29 20 29 7b 0a 20 20 20 20  Step(p)) ){.    
dd80: 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 6e  int i;.    int n
dd90: 43 6f 6c 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  Col;.    Tcl_Obj
dda0: 20 2a 2a 61 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20   **apColName;.  
ddb0: 20 20 64 62 45 76 61 6c 52 6f 77 49 6e 66 6f 28    dbEvalRowInfo(
ddc0: 70 2c 20 26 6e 43 6f 6c 2c 20 26 61 70 43 6f 6c  p, &nCol, &apCol
ddd0: 4e 61 6d 65 29 3b 0a 20 20 20 20 66 6f 72 28 69  Name);.    for(i
dde0: 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29  =0; i<nCol; i++)
ddf0: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 41 72 72  {.      if( pArr
de00: 61 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ay==0 ){.       
de10: 20 54 63 6c 5f 4f 62 6a 53 65 74 56 61 72 32 28   Tcl_ObjSetVar2(
de20: 69 6e 74 65 72 70 2c 20 61 70 43 6f 6c 4e 61 6d  interp, apColNam
de30: 65 5b 69 5d 2c 20 30 2c 20 64 62 45 76 61 6c 43  e[i], 0, dbEvalC
de40: 6f 6c 75 6d 6e 56 61 6c 75 65 28 70 2c 69 29 2c  olumnValue(p,i),
de50: 20 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   0);.      }else
de60: 20 69 66 28 20 28 70 2d 3e 65 76 61 6c 46 6c 61   if( (p->evalFla
de70: 67 73 20 26 20 53 51 4c 49 54 45 5f 45 56 41 4c  gs & SQLITE_EVAL
de80: 5f 57 49 54 48 4f 55 54 4e 55 4c 4c 53 29 21 3d  _WITHOUTNULLS)!=
de90: 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26  0.             &
dea0: 26 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  & sqlite3_column
deb0: 5f 74 79 70 65 28 70 2d 3e 70 50 72 65 53 74 6d  _type(p->pPreStm
dec0: 74 2d 3e 70 53 74 6d 74 2c 20 69 29 3d 3d 53 51  t->pStmt, i)==SQ
ded0: 4c 49 54 45 5f 4e 55 4c 4c 20 0a 20 20 20 20 20  LITE_NULL .     
dee0: 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f   ){.        Tcl_
def0: 55 6e 73 65 74 56 61 72 32 28 69 6e 74 65 72 70  UnsetVar2(interp
df00: 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
df10: 70 41 72 72 61 79 29 2c 20 0a 20 20 20 20 20 20  pArray), .      
df20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df30: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 61 70  Tcl_GetString(ap
df40: 43 6f 6c 4e 61 6d 65 5b 69 5d 29 2c 20 30 29 3b  ColName[i]), 0);
df50: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
df60: 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 53 65 74        Tcl_ObjSet
df70: 56 61 72 32 28 69 6e 74 65 72 70 2c 20 70 41 72  Var2(interp, pAr
df80: 72 61 79 2c 20 61 70 43 6f 6c 4e 61 6d 65 5b 69  ray, apColName[i
df90: 5d 2c 20 64 62 45 76 61 6c 43 6f 6c 75 6d 6e 56  ], dbEvalColumnV
dfa0: 61 6c 75 65 28 70 2c 69 29 2c 20 30 29 3b 0a 20  alue(p,i), 0);. 
dfb0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
dfc0: 20 20 2f 2a 20 54 68 65 20 72 65 71 75 69 72 65    /* The require
dfd0: 64 20 69 6e 74 65 72 70 72 65 74 65 72 20 76 61  d interpreter va
dfe0: 72 69 61 62 6c 65 73 20 61 72 65 20 6e 6f 77 20  riables are now 
dff0: 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 74  populated with t
e000: 68 65 20 64 61 74 61 0a 20 20 20 20 2a 2a 20 66  he data.    ** f
e010: 72 6f 6d 20 74 68 65 20 63 75 72 72 65 6e 74 20  rom the current 
e020: 72 6f 77 2e 20 49 66 20 75 73 69 6e 67 20 4e 52  row. If using NR
e030: 45 2c 20 73 63 68 65 64 75 6c 65 20 63 61 6c 6c  E, schedule call
e040: 62 61 63 6b 73 20 74 6f 20 65 76 61 6c 75 61 74  backs to evaluat
e050: 65 0a 20 20 20 20 2a 2a 20 73 63 72 69 70 74 20  e.    ** script 
e060: 70 53 63 72 69 70 74 2c 20 74 68 65 6e 20 74 6f  pScript, then to
e070: 20 69 6e 76 6f 6b 65 20 74 68 69 73 20 66 75 6e   invoke this fun
e080: 63 74 69 6f 6e 20 61 67 61 69 6e 20 74 6f 20 66  ction again to f
e090: 65 74 63 68 20 74 68 65 20 6e 65 78 74 0a 20 20  etch the next.  
e0a0: 20 20 2a 2a 20 72 6f 77 20 28 6f 72 20 63 6c 65    ** row (or cle
e0b0: 61 6e 20 75 70 20 69 66 20 74 68 65 72 65 20 69  an up if there i
e0c0: 73 20 6e 6f 20 6e 65 78 74 20 72 6f 77 20 6f 72  s no next row or
e0d0: 20 74 68 65 20 73 63 72 69 70 74 20 74 68 72 6f   the script thro
e0e0: 77 73 20 61 6e 0a 20 20 20 20 2a 2a 20 65 78 63  ws an.    ** exc
e0f0: 65 70 74 69 6f 6e 29 2e 20 41 66 74 65 72 20 73  eption). After s
e100: 63 68 65 64 75 6c 69 6e 67 20 74 68 65 20 63 61  cheduling the ca
e110: 6c 6c 62 61 63 6b 73 2c 20 72 65 74 75 72 6e 20  llbacks, return 
e120: 63 6f 6e 74 72 6f 6c 20 74 6f 20 74 68 65 0a 20  control to the. 
e130: 20 20 20 2a 2a 20 63 61 6c 6c 65 72 2e 0a 20 20     ** caller..  
e140: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 6e    **.    ** If n
e150: 6f 74 20 75 73 69 6e 67 20 4e 52 45 2c 20 65 76  ot using NRE, ev
e160: 61 6c 75 61 74 65 20 70 53 63 72 69 70 74 20 64  aluate pScript d
e170: 69 72 65 63 74 6c 79 20 61 6e 64 20 63 6f 6e 74  irectly and cont
e180: 69 6e 75 65 20 77 69 74 68 20 74 68 65 0a 20 20  inue with the.  
e190: 20 20 2a 2a 20 6e 65 78 74 20 69 74 65 72 61 74    ** next iterat
e1a0: 69 6f 6e 20 6f 66 20 74 68 69 73 20 77 68 69 6c  ion of this whil
e1b0: 65 28 2e 2e 2e 29 20 6c 6f 6f 70 2e 20 20 2a 2f  e(...) loop.  */
e1c0: 0a 20 20 20 20 69 66 28 20 44 62 55 73 65 4e 72  .    if( DbUseNr
e1d0: 65 28 29 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  e() ){.      Tcl
e1e0: 5f 4e 52 41 64 64 43 61 6c 6c 62 61 63 6b 28 69  _NRAddCallback(i
e1f0: 6e 74 65 72 70 2c 20 44 62 45 76 61 6c 4e 65 78  nterp, DbEvalNex
e200: 74 43 6d 64 2c 20 28 76 6f 69 64 2a 29 70 2c 20  tCmd, (void*)p, 
e210: 28 76 6f 69 64 2a 29 70 53 63 72 69 70 74 2c 20  (void*)pScript, 
e220: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 65 74  0, 0);.      ret
e230: 75 72 6e 20 54 63 6c 5f 4e 52 45 76 61 6c 4f 62  urn Tcl_NREvalOb
e240: 6a 28 69 6e 74 65 72 70 2c 20 70 53 63 72 69 70  j(interp, pScrip
e250: 74 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65  t, 0);.    }else
e260: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 54 63 6c  {.      rc = Tcl
e270: 5f 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72  _EvalObjEx(inter
e280: 70 2c 20 70 53 63 72 69 70 74 2c 20 30 29 3b 0a  p, pScript, 0);.
e290: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 54 63 6c      }.  }..  Tcl
e2a0: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 53  _DecrRefCount(pS
e2b0: 63 72 69 70 74 29 3b 0a 20 20 64 62 45 76 61 6c  cript);.  dbEval
e2c0: 46 69 6e 61 6c 69 7a 65 28 70 29 3b 0a 20 20 54  Finalize(p);.  T
e2d0: 63 6c 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29  cl_Free((char *)
e2e0: 70 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 54  p);..  if( rc==T
e2f0: 43 4c 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 54 43 4c  CL_OK || rc==TCL
e300: 5f 42 52 45 41 4b 20 29 7b 0a 20 20 20 20 54 63  _BREAK ){.    Tc
e310: 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e  l_ResetResult(in
e320: 74 65 72 70 29 3b 0a 20 20 20 20 72 63 20 3d 20  terp);.    rc = 
e330: 54 43 4c 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65  TCL_OK;.  }.  re
e340: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
e350: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
e360: 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20 69  is used by the i
e370: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 6f  mplementations o
e380: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
e390: 64 61 74 61 62 61 73 65 0a 2a 2a 20 68 61 6e 64  database.** hand
e3a0: 6c 65 20 73 75 62 2d 63 6f 6d 6d 61 6e 64 73 3a  le sub-commands:
e3b0: 0a 2a 2a 0a 2a 2a 20 20 20 24 64 62 20 75 70 64  .**.**   $db upd
e3c0: 61 74 65 5f 68 6f 6f 6b 20 3f 53 43 52 49 50 54  ate_hook ?SCRIPT
e3d0: 3f 0a 2a 2a 20 20 20 24 64 62 20 77 61 6c 5f 68  ?.**   $db wal_h
e3e0: 6f 6f 6b 20 3f 53 43 52 49 50 54 3f 0a 2a 2a 20  ook ?SCRIPT?.** 
e3f0: 20 20 24 64 62 20 63 6f 6d 6d 69 74 5f 68 6f 6f    $db commit_hoo
e400: 6b 20 3f 53 43 52 49 50 54 3f 0a 2a 2a 20 20 20  k ?SCRIPT?.**   
e410: 24 64 62 20 70 72 65 75 70 64 61 74 65 20 68 6f  $db preupdate ho
e420: 6f 6b 20 3f 53 43 52 49 50 54 3f 0a 2a 2f 0a 73  ok ?SCRIPT?.*/.s
e430: 74 61 74 69 63 20 76 6f 69 64 20 44 62 48 6f 6f  tatic void DbHoo
e440: 6b 43 6d 64 28 0a 20 20 54 63 6c 5f 49 6e 74 65  kCmd(.  Tcl_Inte
e450: 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 20  rp *interp,     
e460: 20 20 20 20 20 20 20 20 2f 2a 20 54 63 6c 20 69          /* Tcl i
e470: 6e 74 65 72 70 72 65 74 65 72 20 2a 2f 0a 20 20  nterpreter */.  
e480: 53 71 6c 69 74 65 44 62 20 2a 70 44 62 2c 20 20  SqliteDb *pDb,  
e490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e4a0: 2f 2a 20 44 61 74 61 62 61 73 65 20 68 61 6e 64  /* Database hand
e4b0: 6c 65 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  le */.  Tcl_Obj 
e4c0: 2a 70 41 72 67 2c 20 20 20 20 20 20 20 20 20 20  *pArg,          
e4d0: 20 20 20 20 20 20 20 20 2f 2a 20 53 43 52 49 50          /* SCRIP
e4e0: 54 20 61 72 67 75 6d 65 6e 74 20 28 6f 72 20 4e  T argument (or N
e4f0: 55 4c 4c 29 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62  ULL) */.  Tcl_Ob
e500: 6a 20 2a 2a 70 70 48 6f 6f 6b 20 20 20 20 20 20  j **ppHook      
e510: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
e520: 6e 74 65 72 20 74 6f 20 6d 65 6d 62 65 72 20 6f  nter to member o
e530: 66 20 53 71 6c 69 74 65 44 62 20 2a 2f 0a 29 7b  f SqliteDb */.){
e540: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
e550: 20 70 44 62 2d 3e 64 62 3b 0a 0a 20 20 69 66 28   pDb->db;..  if(
e560: 20 2a 70 70 48 6f 6f 6b 20 29 7b 0a 20 20 20 20   *ppHook ){.    
e570: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
e580: 28 69 6e 74 65 72 70 2c 20 2a 70 70 48 6f 6f 6b  (interp, *ppHook
e590: 29 3b 0a 20 20 20 20 69 66 28 20 70 41 72 67 20  );.    if( pArg 
e5a0: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 44 65 63  ){.      Tcl_Dec
e5b0: 72 52 65 66 43 6f 75 6e 74 28 2a 70 70 48 6f 6f  rRefCount(*ppHoo
e5c0: 6b 29 3b 0a 20 20 20 20 20 20 2a 70 70 48 6f 6f  k);.      *ppHoo
e5d0: 6b 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  k = 0;.    }.  }
e5e0: 0a 20 20 69 66 28 20 70 41 72 67 20 29 7b 0a 20  .  if( pArg ){. 
e5f0: 20 20 20 61 73 73 65 72 74 28 20 21 28 2a 70 70     assert( !(*pp
e600: 48 6f 6f 6b 29 20 29 3b 0a 20 20 20 20 69 66 28  Hook) );.    if(
e610: 20 54 63 6c 5f 47 65 74 43 68 61 72 4c 65 6e 67   Tcl_GetCharLeng
e620: 74 68 28 70 41 72 67 29 3e 30 20 29 7b 0a 20 20  th(pArg)>0 ){.  
e630: 20 20 20 20 2a 70 70 48 6f 6f 6b 20 3d 20 70 41      *ppHook = pA
e640: 72 67 3b 0a 20 20 20 20 20 20 54 63 6c 5f 49 6e  rg;.      Tcl_In
e650: 63 72 52 65 66 43 6f 75 6e 74 28 2a 70 70 48 6f  crRefCount(*ppHo
e660: 6f 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ok);.    }.  }..
e670: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
e680: 41 42 4c 45 5f 50 52 45 55 50 44 41 54 45 5f 48  ABLE_PREUPDATE_H
e690: 4f 4f 4b 0a 20 20 73 71 6c 69 74 65 33 5f 70 72  OOK.  sqlite3_pr
e6a0: 65 75 70 64 61 74 65 5f 68 6f 6f 6b 28 64 62 2c  eupdate_hook(db,
e6b0: 20 28 70 44 62 2d 3e 70 50 72 65 55 70 64 61 74   (pDb->pPreUpdat
e6c0: 65 48 6f 6f 6b 3f 44 62 50 72 65 55 70 64 61 74  eHook?DbPreUpdat
e6d0: 65 48 61 6e 64 6c 65 72 3a 30 29 2c 20 70 44 62  eHandler:0), pDb
e6e0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69  );.#endif.  sqli
e6f0: 74 65 33 5f 75 70 64 61 74 65 5f 68 6f 6f 6b 28  te3_update_hook(
e700: 64 62 2c 20 28 70 44 62 2d 3e 70 55 70 64 61 74  db, (pDb->pUpdat
e710: 65 48 6f 6f 6b 3f 44 62 55 70 64 61 74 65 48 61  eHook?DbUpdateHa
e720: 6e 64 6c 65 72 3a 30 29 2c 20 70 44 62 29 3b 0a  ndler:0), pDb);.
e730: 20 20 73 71 6c 69 74 65 33 5f 72 6f 6c 6c 62 61    sqlite3_rollba
e740: 63 6b 5f 68 6f 6f 6b 28 64 62 2c 20 28 70 44 62  ck_hook(db, (pDb
e750: 2d 3e 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 3f  ->pRollbackHook?
e760: 44 62 52 6f 6c 6c 62 61 63 6b 48 61 6e 64 6c 65  DbRollbackHandle
e770: 72 3a 30 29 2c 20 70 44 62 29 3b 0a 20 20 73 71  r:0), pDb);.  sq
e780: 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 64  lite3_wal_hook(d
e790: 62 2c 20 28 70 44 62 2d 3e 70 57 61 6c 48 6f 6f  b, (pDb->pWalHoo
e7a0: 6b 3f 44 62 57 61 6c 48 61 6e 64 6c 65 72 3a 30  k?DbWalHandler:0
e7b0: 29 2c 20 70 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ), pDb);.}../*.*
e7c0: 2a 20 54 68 65 20 22 73 71 6c 69 74 65 22 20 63  * The "sqlite" c
e7d0: 6f 6d 6d 61 6e 64 20 62 65 6c 6f 77 20 63 72 65  ommand below cre
e7e0: 61 74 65 73 20 61 20 6e 65 77 20 54 63 6c 20 63  ates a new Tcl c
e7f0: 6f 6d 6d 61 6e 64 20 66 6f 72 20 65 61 63 68 0a  ommand for each.
e800: 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 74  ** connection it
e810: 20 6f 70 65 6e 73 20 74 6f 20 61 6e 20 53 51 4c   opens to an SQL
e820: 69 74 65 20 64 61 74 61 62 61 73 65 2e 20 20 54  ite database.  T
e830: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 69  his routine is i
e840: 6e 76 6f 6b 65 64 0a 2a 2a 20 77 68 65 6e 65 76  nvoked.** whenev
e850: 65 72 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20  er one of those 
e860: 63 6f 6e 6e 65 63 74 69 6f 6e 2d 73 70 65 63 69  connection-speci
e870: 66 69 63 20 63 6f 6d 6d 61 6e 64 73 20 69 73 20  fic commands is 
e880: 65 78 65 63 75 74 65 64 0a 2a 2a 20 69 6e 20 54  executed.** in T
e890: 63 6c 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65  cl.  For example
e8a0: 2c 20 69 66 20 79 6f 75 20 72 75 6e 20 54 63 6c  , if you run Tcl
e8b0: 20 63 6f 64 65 20 6c 69 6b 65 20 74 68 69 73 3a   code like this:
e8c0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 73 71 6c  .**.**       sql
e8d0: 69 74 65 33 20 64 62 31 20 20 22 6d 79 5f 64 61  ite3 db1  "my_da
e8e0: 74 61 62 61 73 65 22 0a 2a 2a 20 20 20 20 20 20  tabase".**      
e8f0: 20 64 62 31 20 63 6c 6f 73 65 0a 2a 2a 0a 2a 2a   db1 close.**.**
e900: 20 54 68 65 20 66 69 72 73 74 20 63 6f 6d 6d 61   The first comma
e910: 6e 64 20 6f 70 65 6e 73 20 61 20 63 6f 6e 6e 65  nd opens a conne
e920: 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 22 6d 79  ction to the "my
e930: 5f 64 61 74 61 62 61 73 65 22 20 64 61 74 61 62  _database" datab
e940: 61 73 65 0a 2a 2a 20 61 6e 64 20 63 61 6c 6c 73  ase.** and calls
e950: 20 74 68 61 74 20 63 6f 6e 6e 65 63 74 69 6f 6e   that connection
e960: 20 22 64 62 31 22 2e 20 20 54 68 65 20 73 65 63   "db1".  The sec
e970: 6f 6e 64 20 63 6f 6d 6d 61 6e 64 20 63 61 75 73  ond command caus
e980: 65 73 20 74 68 69 73 0a 2a 2a 20 73 75 62 72 6f  es this.** subro
e990: 75 74 69 6e 65 20 74 6f 20 62 65 20 69 6e 76 6f  utine to be invo
e9a0: 6b 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ked..*/.static i
e9b0: 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49  nt SQLITE_TCLAPI
e9c0: 20 44 62 4f 62 6a 43 6d 64 28 0a 20 20 76 6f 69   DbObjCmd(.  voi
e9d0: 64 20 2a 63 64 2c 0a 20 20 54 63 6c 5f 49 6e 74  d *cd,.  Tcl_Int
e9e0: 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
e9f0: 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
ea00: 62 6a 20 2a 63 6f 6e 73 74 2a 6f 62 6a 76 0a 29  bj *const*objv.)
ea10: 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44  {.  SqliteDb *pD
ea20: 62 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 63  b = (SqliteDb*)c
ea30: 64 3b 0a 20 20 69 6e 74 20 63 68 6f 69 63 65 3b  d;.  int choice;
ea40: 0a 20 20 69 6e 74 20 72 63 20 3d 20 54 43 4c 5f  .  int rc = TCL_
ea50: 4f 4b 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  OK;.  static con
ea60: 73 74 20 63 68 61 72 20 2a 44 42 5f 73 74 72 73  st char *DB_strs
ea70: 5b 5d 20 3d 20 7b 0a 20 20 20 20 22 61 75 74 68  [] = {.    "auth
ea80: 6f 72 69 7a 65 72 22 2c 20 20 20 20 20 20 20 20  orizer",        
ea90: 20 22 62 61 63 6b 75 70 22 2c 20 20 20 20 20 20   "backup",      
eaa0: 20 20 20 20 20 20 22 62 75 73 79 22 2c 0a 20 20        "busy",.  
eab0: 20 20 22 63 61 63 68 65 22 2c 20 20 20 20 20 20    "cache",      
eac0: 20 20 20 20 20 20 20 20 22 63 68 61 6e 67 65 73          "changes
ead0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 22 63 6c  ",           "cl
eae0: 6f 73 65 22 2c 0a 20 20 20 20 22 63 6f 6c 6c 61  ose",.    "colla
eaf0: 74 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  te",            
eb00: 22 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65  "collation_neede
eb10: 64 22 2c 20 20 22 63 6f 6d 6d 69 74 5f 68 6f 6f  d",  "commit_hoo
eb20: 6b 22 2c 0a 20 20 20 20 22 63 6f 6d 70 6c 65 74  k",.    "complet
eb30: 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 22 63  e",           "c
eb40: 6f 70 79 22 2c 20 20 20 20 20 20 20 20 20 20 20  opy",           
eb50: 20 20 20 22 65 6e 61 62 6c 65 5f 6c 6f 61 64 5f     "enable_load_
eb60: 65 78 74 65 6e 73 69 6f 6e 22 2c 0a 20 20 20 20  extension",.    
eb70: 22 65 72 72 6f 72 63 6f 64 65 22 2c 20 20 20 20  "errorcode",    
eb80: 20 20 20 20 20 20 22 65 76 61 6c 22 2c 20 20 20        "eval",   
eb90: 20 20 20 20 20 20 20 20 20 20 20 22 65 78 69 73             "exis
eba0: 74 73 22 2c 0a 20 20 20 20 22 66 75 6e 63 74 69  ts",.    "functi
ebb0: 6f 6e 22 2c 20 20 20 20 20 20 20 20 20 20 20 22  on",           "
ebc0: 69 6e 63 72 62 6c 6f 62 22 2c 20 20 20 20 20 20  incrblob",      
ebd0: 20 20 20 20 22 69 6e 74 65 72 72 75 70 74 22 2c      "interrupt",
ebe0: 0a 20 20 20 20 22 6c 61 73 74 5f 69 6e 73 65 72  .    "last_inser
ebf0: 74 5f 72 6f 77 69 64 22 2c 20 20 22 6e 75 6c 6c  t_rowid",  "null
ec00: 76 61 6c 75 65 22 2c 20 20 20 20 20 20 20 20 20  value",         
ec10: 22 6f 6e 65 63 6f 6c 75 6d 6e 22 2c 0a 20 20 20  "onecolumn",.   
ec20: 20 22 70 72 65 75 70 64 61 74 65 22 2c 20 20 20   "preupdate",   
ec30: 20 20 20 20 20 20 20 22 70 72 6f 66 69 6c 65 22         "profile"
ec40: 2c 20 20 20 20 20 20 20 20 20 20 20 22 70 72 6f  ,           "pro
ec50: 67 72 65 73 73 22 2c 0a 20 20 20 20 22 72 65 6b  gress",.    "rek
ec60: 65 79 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ey",            
ec70: 20 20 22 72 65 73 74 6f 72 65 22 2c 20 20 20 20    "restore",    
ec80: 20 20 20 20 20 20 20 22 72 6f 6c 6c 62 61 63 6b         "rollback
ec90: 5f 68 6f 6f 6b 22 2c 0a 20 20 20 20 22 73 74 61  _hook",.    "sta
eca0: 74 75 73 22 2c 20 20 20 20 20 20 20 20 20 20 20  tus",           
ecb0: 20 20 22 74 69 6d 65 6f 75 74 22 2c 20 20 20 20    "timeout",    
ecc0: 20 20 20 20 20 20 20 22 74 6f 74 61 6c 5f 63 68         "total_ch
ecd0: 61 6e 67 65 73 22 2c 0a 20 20 20 20 22 74 72 61  anges",.    "tra
ece0: 63 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ce",            
ecf0: 20 20 22 74 72 61 63 65 5f 76 32 22 2c 20 20 20    "trace_v2",   
ed00: 20 20 20 20 20 20 20 22 74 72 61 6e 73 61 63 74         "transact
ed10: 69 6f 6e 22 2c 0a 20 20 20 20 22 75 6e 6c 6f 63  ion",.    "unloc
ed20: 6b 5f 6e 6f 74 69 66 79 22 2c 20 20 20 20 20 20  k_notify",      
ed30: 22 75 70 64 61 74 65 5f 68 6f 6f 6b 22 2c 20 20  "update_hook",  
ed40: 20 20 20 20 20 22 76 65 72 73 69 6f 6e 22 2c 0a       "version",.
ed50: 20 20 20 20 22 77 61 6c 5f 68 6f 6f 6b 22 2c 0a      "wal_hook",.
ed60: 20 20 20 20 30 0a 20 20 7d 3b 0a 20 20 65 6e 75      0.  };.  enu
ed70: 6d 20 44 42 5f 65 6e 75 6d 20 7b 0a 20 20 20 20  m DB_enum {.    
ed80: 44 42 5f 41 55 54 48 4f 52 49 5a 45 52 2c 20 20  DB_AUTHORIZER,  
ed90: 20 20 20 20 20 20 44 42 5f 42 41 43 4b 55 50 2c        DB_BACKUP,
eda0: 20 20 20 20 20 20 20 20 20 20 20 44 42 5f 42 55             DB_BU
edb0: 53 59 2c 0a 20 20 20 20 44 42 5f 43 41 43 48 45  SY,.    DB_CACHE
edc0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 44 42  ,             DB
edd0: 5f 43 48 41 4e 47 45 53 2c 20 20 20 20 20 20 20  _CHANGES,       
ede0: 20 20 20 44 42 5f 43 4c 4f 53 45 2c 0a 20 20 20     DB_CLOSE,.   
edf0: 20 44 42 5f 43 4f 4c 4c 41 54 45 2c 20 20 20 20   DB_COLLATE,    
ee00: 20 20 20 20 20 20 20 44 42 5f 43 4f 4c 4c 41 54         DB_COLLAT
ee10: 49 4f 4e 5f 4e 45 45 44 45 44 2c 20 44 42 5f 43  ION_NEEDED, DB_C
ee20: 4f 4d 4d 49 54 5f 48 4f 4f 4b 2c 0a 20 20 20 20  OMMIT_HOOK,.    
ee30: 44 42 5f 43 4f 4d 50 4c 45 54 45 2c 20 20 20 20  DB_COMPLETE,    
ee40: 20 20 20 20 20 20 44 42 5f 43 4f 50 59 2c 20 20        DB_COPY,  
ee50: 20 20 20 20 20 20 20 20 20 20 20 44 42 5f 45 4e             DB_EN
ee60: 41 42 4c 45 5f 4c 4f 41 44 5f 45 58 54 45 4e 53  ABLE_LOAD_EXTENS
ee70: 49 4f 4e 2c 0a 20 20 20 20 44 42 5f 45 52 52 4f  ION,.    DB_ERRO
ee80: 52 43 4f 44 45 2c 20 20 20 20 20 20 20 20 20 44  RCODE,         D
ee90: 42 5f 45 56 41 4c 2c 20 20 20 20 20 20 20 20 20  B_EVAL,         
eea0: 20 20 20 20 44 42 5f 45 58 49 53 54 53 2c 0a 20      DB_EXISTS,. 
eeb0: 20 20 20 44 42 5f 46 55 4e 43 54 49 4f 4e 2c 20     DB_FUNCTION, 
eec0: 20 20 20 20 20 20 20 20 20 44 42 5f 49 4e 43 52           DB_INCR
eed0: 42 4c 4f 42 2c 20 20 20 20 20 20 20 20 20 44 42  BLOB,         DB
eee0: 5f 49 4e 54 45 52 52 55 50 54 2c 0a 20 20 20 20  _INTERRUPT,.    
eef0: 44 42 5f 4c 41 53 54 5f 49 4e 53 45 52 54 5f 52  DB_LAST_INSERT_R
ef00: 4f 57 49 44 2c 20 44 42 5f 4e 55 4c 4c 56 41 4c  OWID, DB_NULLVAL
ef10: 55 45 2c 20 20 20 20 20 20 20 20 44 42 5f 4f 4e  UE,        DB_ON
ef20: 45 43 4f 4c 55 4d 4e 2c 0a 20 20 20 20 44 42 5f  ECOLUMN,.    DB_
ef30: 50 52 45 55 50 44 41 54 45 2c 20 20 20 20 20 20  PREUPDATE,      
ef40: 20 20 20 44 42 5f 50 52 4f 46 49 4c 45 2c 20 20     DB_PROFILE,  
ef50: 20 20 20 20 20 20 20 20 44 42 5f 50 52 4f 47 52          DB_PROGR
ef60: 45 53 53 2c 0a 20 20 20 20 44 42 5f 52 45 4b 45  ESS,.    DB_REKE
ef70: 59 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 44  Y,             D
ef80: 42 5f 52 45 53 54 4f 52 45 2c 20 20 20 20 20 20  B_RESTORE,      
ef90: 20 20 20 20 44 42 5f 52 4f 4c 4c 42 41 43 4b 5f      DB_ROLLBACK_
efa0: 48 4f 4f 4b 2c 0a 20 20 20 20 44 42 5f 53 54 41  HOOK,.    DB_STA
efb0: 54 55 53 2c 20 20 20 20 20 20 20 20 20 20 20 20  TUS,            
efc0: 44 42 5f 54 49 4d 45 4f 55 54 2c 20 20 20 20 20  DB_TIMEOUT,     
efd0: 20 20 20 20 20 44 42 5f 54 4f 54 41 4c 5f 43 48       DB_TOTAL_CH
efe0: 41 4e 47 45 53 2c 0a 20 20 20 20 44 42 5f 54 52  ANGES,.    DB_TR
eff0: 41 43 45 2c 20 20 20 20 20 20 20 20 20 20 20 20  ACE,            
f000: 20 44 42 5f 54 52 41 43 45 5f 56 32 2c 20 20 20   DB_TRACE_V2,   
f010: 20 20 20 20 20 20 44 42 5f 54 52 41 4e 53 41 43        DB_TRANSAC
f020: 54 49 4f 4e 2c 0a 20 20 20 20 44 42 5f 55 4e 4c  TION,.    DB_UNL
f030: 4f 43 4b 5f 4e 4f 54 49 46 59 2c 20 20 20 20 20  OCK_NOTIFY,     
f040: 44 42 5f 55 50 44 41 54 45 5f 48 4f 4f 4b 2c 20  DB_UPDATE_HOOK, 
f050: 20 20 20 20 20 44 42 5f 56 45 52 53 49 4f 4e 2c       DB_VERSION,
f060: 0a 20 20 20 20 44 42 5f 57 41 4c 5f 48 4f 4f 4b  .    DB_WAL_HOOK
f070: 2c 0a 20 20 7d 3b 0a 20 20 2f 2a 20 64 6f 6e 27  ,.  };.  /* don'
f080: 74 20 6c 65 61 76 65 20 74 72 61 69 6c 69 6e 67  t leave trailing
f090: 20 63 6f 6d 6d 61 73 20 6f 6e 20 44 42 5f 65 6e   commas on DB_en
f0a0: 75 6d 2c 20 69 74 20 63 6f 6e 66 75 73 65 73 20  um, it confuses 
f0b0: 74 68 65 20 41 49 58 20 78 6c 63 20 63 6f 6d 70  the AIX xlc comp
f0c0: 69 6c 65 72 20 2a 2f 0a 0a 20 20 69 66 28 20 6f  iler */..  if( o
f0d0: 62 6a 63 3c 32 20 29 7b 0a 20 20 20 20 54 63 6c  bjc<2 ){.    Tcl
f0e0: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
f0f0: 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
f100: 53 55 42 43 4f 4d 4d 41 4e 44 20 2e 2e 2e 22 29  SUBCOMMAND ...")
f110: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
f120: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
f130: 28 20 54 63 6c 5f 47 65 74 49 6e 64 65 78 46 72  ( Tcl_GetIndexFr
f140: 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
f150: 6a 76 5b 31 5d 2c 20 44 42 5f 73 74 72 73 2c 20  jv[1], DB_strs, 
f160: 22 6f 70 74 69 6f 6e 22 2c 20 30 2c 20 26 63 68  "option", 0, &ch
f170: 6f 69 63 65 29 20 29 7b 0a 20 20 20 20 72 65 74  oice) ){.    ret
f180: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
f190: 20 7d 0a 0a 20 20 73 77 69 74 63 68 28 20 28 65   }..  switch( (e
f1a0: 6e 75 6d 20 44 42 5f 65 6e 75 6d 29 63 68 6f 69  num DB_enum)choi
f1b0: 63 65 20 29 7b 0a 0a 20 20 2f 2a 20 20 20 20 24  ce ){..  /*    $
f1c0: 64 62 20 61 75 74 68 6f 72 69 7a 65 72 20 3f 43  db authorizer ?C
f1d0: 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a 0a 20 20  ALLBACK?.  **.  
f1e0: 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 67 69  ** Invoke the gi
f1f0: 76 65 6e 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20  ven callback to 
f200: 61 75 74 68 6f 72 69 7a 65 20 65 61 63 68 20 53  authorize each S
f210: 51 4c 20 6f 70 65 72 61 74 69 6f 6e 20 61 73 20  QL operation as 
f220: 69 74 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 70 69  it is.  ** compi
f230: 6c 65 64 2e 20 20 35 20 61 72 67 75 6d 65 6e 74  led.  5 argument
f240: 73 20 61 72 65 20 61 70 70 65 6e 64 65 64 20 74  s are appended t
f250: 6f 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 62  o the callback b
f260: 65 66 6f 72 65 20 69 74 20 69 73 0a 20 20 2a 2a  efore it is.  **
f270: 20 69 6e 76 6f 6b 65 64 3a 0a 20 20 2a 2a 0a 20   invoked:.  **. 
f280: 20 2a 2a 20 20 20 28 31 29 20 54 68 65 20 61 75   **   (1) The au
f290: 74 68 6f 72 69 7a 61 74 69 6f 6e 20 74 79 70 65  thorization type
f2a0: 20 28 65 78 3a 20 53 51 4c 49 54 45 5f 43 52 45   (ex: SQLITE_CRE
f2b0: 41 54 45 5f 54 41 42 4c 45 2c 20 53 51 4c 49 54  ATE_TABLE, SQLIT
f2c0: 45 5f 49 4e 53 45 52 54 2c 20 2e 2e 2e 29 0a 20  E_INSERT, ...). 
f2d0: 20 2a 2a 20 20 20 28 32 29 20 46 69 72 73 74 20   **   (2) First 
f2e0: 64 65 73 63 72 69 70 74 69 76 65 20 6e 61 6d 65  descriptive name
f2f0: 20 28 64 65 70 65 6e 64 73 20 6f 6e 20 61 75 74   (depends on aut
f300: 68 6f 72 69 7a 61 74 69 6f 6e 20 74 79 70 65 29  horization type)
f310: 0a 20 20 2a 2a 20 20 20 28 33 29 20 53 65 63 6f  .  **   (3) Seco
f320: 6e 64 20 64 65 73 63 72 69 70 74 69 76 65 20 6e  nd descriptive n
f330: 61 6d 65 0a 20 20 2a 2a 20 20 20 28 34 29 20 4e  ame.  **   (4) N
f340: 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
f350: 61 73 65 20 28 65 78 3a 20 22 6d 61 69 6e 22 2c  ase (ex: "main",
f360: 20 22 74 65 6d 70 22 29 0a 20 20 2a 2a 20 20 20   "temp").  **   
f370: 28 35 29 20 4e 61 6d 65 20 6f 66 20 74 72 69 67  (5) Name of trig
f380: 67 65 72 20 74 68 61 74 20 69 73 20 64 6f 69 6e  ger that is doin
f390: 67 20 74 68 65 20 61 63 63 65 73 73 0a 20 20 2a  g the access.  *
f3a0: 2a 0a 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c 62  *.  ** The callb
f3b0: 61 63 6b 20 73 68 6f 75 6c 64 20 72 65 74 75 72  ack should retur
f3c0: 6e 20 6f 6e 20 6f 66 20 74 68 65 20 66 6f 6c 6c  n on of the foll
f3d0: 6f 77 69 6e 67 20 73 74 72 69 6e 67 73 3a 20 53  owing strings: S
f3e0: 51 4c 49 54 45 5f 4f 4b 2c 0a 20 20 2a 2a 20 53  QLITE_OK,.  ** S
f3f0: 51 4c 49 54 45 5f 49 47 4e 4f 52 45 2c 20 6f 72  QLITE_IGNORE, or
f400: 20 53 51 4c 49 54 45 5f 44 45 4e 59 2e 20 20 41   SQLITE_DENY.  A
f410: 6e 79 20 6f 74 68 65 72 20 72 65 74 75 72 6e 20  ny other return 
f420: 76 61 6c 75 65 20 69 73 20 61 6e 20 65 72 72 6f  value is an erro
f430: 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  r..  **.  ** If 
f440: 74 68 69 73 20 6d 65 74 68 6f 64 20 69 73 20 69  this method is i
f450: 6e 76 6f 6b 65 64 20 77 69 74 68 20 6e 6f 20 61  nvoked with no a
f460: 72 67 75 6d 65 6e 74 73 2c 20 74 68 65 20 63 75  rguments, the cu
f470: 72 72 65 6e 74 20 61 75 74 68 6f 72 69 7a 61 74  rrent authorizat
f480: 69 6f 6e 0a 20 20 2a 2a 20 63 61 6c 6c 62 61 63  ion.  ** callbac
f490: 6b 20 73 74 72 69 6e 67 20 69 73 20 72 65 74 75  k string is retu
f4a0: 72 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 63 61 73  rned..  */.  cas
f4b0: 65 20 44 42 5f 41 55 54 48 4f 52 49 5a 45 52 3a  e DB_AUTHORIZER:
f4c0: 20 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   {.#ifdef SQLITE
f4d0: 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54  _OMIT_AUTHORIZAT
f4e0: 49 4f 4e 0a 20 20 20 20 54 63 6c 5f 41 70 70 65  ION.    Tcl_Appe
f4f0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
f500: 20 22 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20   "authorization 
f510: 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 69 6e  not available in
f520: 20 74 68 69 73 20 62 75 69 6c 64 22 2c 0a 20 20   this build",.  
f530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f540: 20 20 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20     (char*)0);.  
f550: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
f560: 4f 52 3b 0a 23 65 6c 73 65 0a 20 20 20 20 69 66  OR;.#else.    if
f570: 28 20 6f 62 6a 63 3e 33 20 29 7b 0a 20 20 20 20  ( objc>3 ){.    
f580: 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
f590: 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62  gs(interp, 2, ob
f5a0: 6a 76 2c 20 22 3f 43 41 4c 4c 42 41 43 4b 3f 22  jv, "?CALLBACK?"
f5b0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
f5c0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
f5d0: 65 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d 32  else if( objc==2
f5e0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 44   ){.      if( pD
f5f0: 62 2d 3e 7a 41 75 74 68 20 29 7b 0a 20 20 20 20  b->zAuth ){.    
f600: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
f610: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 44 62  sult(interp, pDb
f620: 2d 3e 7a 41 75 74 68 2c 20 28 63 68 61 72 2a 29  ->zAuth, (char*)
f630: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
f640: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61  }else{.      cha
f650: 72 20 2a 7a 41 75 74 68 3b 0a 20 20 20 20 20 20  r *zAuth;.      
f660: 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20 69  int len;.      i
f670: 66 28 20 70 44 62 2d 3e 7a 41 75 74 68 20 29 7b  f( pDb->zAuth ){
f680: 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 46 72 65  .        Tcl_Fre
f690: 65 28 70 44 62 2d 3e 7a 41 75 74 68 29 3b 0a 20  e(pDb->zAuth);. 
f6a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 41 75       }.      zAu
f6b0: 74 68 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  th = Tcl_GetStri
f6c0: 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32  ngFromObj(objv[2
f6d0: 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20  ], &len);.      
f6e0: 69 66 28 20 7a 41 75 74 68 20 26 26 20 6c 65 6e  if( zAuth && len
f6f0: 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44  >0 ){.        pD
f700: 62 2d 3e 7a 41 75 74 68 20 3d 20 54 63 6c 5f 41  b->zAuth = Tcl_A
f710: 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20 31 20 29 3b  lloc( len + 1 );
f720: 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
f730: 70 44 62 2d 3e 7a 41 75 74 68 2c 20 7a 41 75 74  pDb->zAuth, zAut
f740: 68 2c 20 6c 65 6e 2b 31 29 3b 0a 20 20 20 20 20  h, len+1);.     
f750: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
f760: 70 44 62 2d 3e 7a 41 75 74 68 20 3d 20 30 3b 0a  pDb->zAuth = 0;.
f770: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
f780: 28 20 70 44 62 2d 3e 7a 41 75 74 68 20 29 7b 0a  ( pDb->zAuth ){.
f790: 20 20 20 20 20 20 20 20 74 79 70 65 64 65 66 20          typedef 
f7a0: 69 6e 74 20 28 2a 73 71 6c 69 74 65 33 5f 61 75  int (*sqlite3_au
f7b0: 74 68 5f 63 62 29 28 0a 20 20 20 20 20 20 20 20  th_cb)(.        
f7c0: 20 20 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e     void*,int,con
f7d0: 73 74 20 63 68 61 72 2a 2c 63 6f 6e 73 74 20 63  st char*,const c
f7e0: 68 61 72 2a 2c 0a 20 20 20 20 20 20 20 20 20 20  har*,.          
f7f0: 20 63 6f 6e 73 74 20 63 68 61 72 2a 2c 63 6f 6e   const char*,con
f800: 73 74 20 63 68 61 72 2a 29 3b 0a 20 20 20 20 20  st char*);.     
f810: 20 20 20 70 44 62 2d 3e 69 6e 74 65 72 70 20 3d     pDb->interp =
f820: 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 20 20 20   interp;.       
f830: 20 73 71 6c 69 74 65 33 5f 73 65 74 5f 61 75 74   sqlite3_set_aut
f840: 68 6f 72 69 7a 65 72 28 70 44 62 2d 3e 64 62 2c  horizer(pDb->db,
f850: 28 73 71 6c 69 74 65 33 5f 61 75 74 68 5f 63 62  (sqlite3_auth_cb
f860: 29 61 75 74 68 5f 63 61 6c 6c 62 61 63 6b 2c 70  )auth_callback,p
f870: 44 62 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  Db);.      }else
f880: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
f890: 33 5f 73 65 74 5f 61 75 74 68 6f 72 69 7a 65 72  3_set_authorizer
f8a0: 28 70 44 62 2d 3e 64 62 2c 20 30 2c 20 30 29 3b  (pDb->db, 0, 0);
f8b0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
f8c0: 65 6e 64 69 66 0a 20 20 20 20 62 72 65 61 6b 3b  endif.    break;
f8d0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64  .  }..  /*    $d
f8e0: 62 20 62 61 63 6b 75 70 20 3f 44 41 54 41 42 41  b backup ?DATABA
f8f0: 53 45 3f 20 46 49 4c 45 4e 41 4d 45 0a 20 20 2a  SE? FILENAME.  *
f900: 2a 0a 20 20 2a 2a 20 4f 70 65 6e 20 6f 72 20 63  *.  ** Open or c
f910: 72 65 61 74 65 20 61 20 64 61 74 61 62 61 73 65  reate a database
f920: 20 66 69 6c 65 20 6e 61 6d 65 64 20 46 49 4c 45   file named FILE
f930: 4e 41 4d 45 2e 20 20 54 72 61 6e 73 66 65 72 20  NAME.  Transfer 
f940: 74 68 65 0a 20 20 2a 2a 20 63 6f 6e 74 65 6e 74  the.  ** content
f950: 20 6f 66 20 6c 6f 63 61 6c 20 64 61 74 61 62 61   of local databa
f960: 73 65 20 44 41 54 41 42 41 53 45 20 28 64 65 66  se DATABASE (def
f970: 61 75 6c 74 3a 20 22 6d 61 69 6e 22 29 20 69 6e  ault: "main") in
f980: 74 6f 20 74 68 65 0a 20 20 2a 2a 20 46 49 4c 45  to the.  ** FILE
f990: 4e 41 4d 45 20 64 61 74 61 62 61 73 65 2e 0a 20  NAME database.. 
f9a0: 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 42 41   */.  case DB_BA
f9b0: 43 4b 55 50 3a 20 7b 0a 20 20 20 20 63 6f 6e 73  CKUP: {.    cons
f9c0: 74 20 63 68 61 72 20 2a 7a 44 65 73 74 46 69 6c  t char *zDestFil
f9d0: 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  e;.    const cha
f9e0: 72 20 2a 7a 53 72 63 44 62 3b 0a 20 20 20 20 73  r *zSrcDb;.    s
f9f0: 71 6c 69 74 65 33 20 2a 70 44 65 73 74 3b 0a 20  qlite3 *pDest;. 
fa00: 20 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75     sqlite3_backu
fa10: 70 20 2a 70 42 61 63 6b 75 70 3b 0a 0a 20 20 20  p *pBackup;..   
fa20: 20 69 66 28 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a   if( objc==3 ){.
fa30: 20 20 20 20 20 20 7a 53 72 63 44 62 20 3d 20 22        zSrcDb = "
fa40: 6d 61 69 6e 22 3b 0a 20 20 20 20 20 20 7a 44 65  main";.      zDe
fa50: 73 74 46 69 6c 65 20 3d 20 54 63 6c 5f 47 65 74  stFile = Tcl_Get
fa60: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b  String(objv[2]);
fa70: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f  .    }else if( o
fa80: 62 6a 63 3d 3d 34 20 29 7b 0a 20 20 20 20 20 20  bjc==4 ){.      
fa90: 7a 53 72 63 44 62 20 3d 20 54 63 6c 5f 47 65 74  zSrcDb = Tcl_Get
faa0: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b  String(objv[2]);
fab0: 0a 20 20 20 20 20 20 7a 44 65 73 74 46 69 6c 65  .      zDestFile
fac0: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
fad0: 28 6f 62 6a 76 5b 33 5d 29 3b 0a 20 20 20 20 7d  (objv[3]);.    }
fae0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 54 63 6c 5f  else{.      Tcl_
faf0: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
fb00: 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f  erp, 2, objv, "?
fb10: 44 41 54 41 42 41 53 45 3f 20 46 49 4c 45 4e 41  DATABASE? FILENA
fb20: 4d 45 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ME");.      retu
fb30: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
fb40: 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c    }.    rc = sql
fb50: 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 7a 44 65  ite3_open_v2(zDe
fb60: 73 74 46 69 6c 65 2c 20 26 70 44 65 73 74 2c 0a  stFile, &pDest,.
fb70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
fb80: 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
fb90: 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50  RITE | SQLITE_OP
fba0: 45 4e 5f 43 52 45 41 54 45 7c 20 70 44 62 2d 3e  EN_CREATE| pDb->
fbb0: 6f 70 65 6e 46 6c 61 67 73 2c 20 30 29 3b 0a 20  openFlags, 0);. 
fbc0: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
fbd0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 54 63  E_OK ){.      Tc
fbe0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
fbf0: 6e 74 65 72 70 2c 20 22 63 61 6e 6e 6f 74 20 6f  nterp, "cannot o
fc00: 70 65 6e 20 74 61 72 67 65 74 20 64 61 74 61 62  pen target datab
fc10: 61 73 65 3a 20 22 2c 0a 20 20 20 20 20 20 20 20  ase: ",.        
fc20: 20 20 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73     sqlite3_errms
fc30: 67 28 70 44 65 73 74 29 2c 20 28 63 68 61 72 2a  g(pDest), (char*
fc40: 29 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  )0);.      sqlit
fc50: 65 33 5f 63 6c 6f 73 65 28 70 44 65 73 74 29 3b  e3_close(pDest);
fc60: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
fc70: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
fc80: 20 20 20 70 42 61 63 6b 75 70 20 3d 20 73 71 6c     pBackup = sql
fc90: 69 74 65 33 5f 62 61 63 6b 75 70 5f 69 6e 69 74  ite3_backup_init
fca0: 28 70 44 65 73 74 2c 20 22 6d 61 69 6e 22 2c 20  (pDest, "main", 
fcb0: 70 44 62 2d 3e 64 62 2c 20 7a 53 72 63 44 62 29  pDb->db, zSrcDb)
fcc0: 3b 0a 20 20 20 20 69 66 28 20 70 42 61 63 6b 75  ;.    if( pBacku
fcd0: 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 54 63  p==0 ){.      Tc
fce0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
fcf0: 6e 74 65 72 70 2c 20 22 62 61 63 6b 75 70 20 66  nterp, "backup f
fd00: 61 69 6c 65 64 3a 20 22 2c 0a 20 20 20 20 20 20  ailed: ",.      
fd10: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65 72 72       sqlite3_err
fd20: 6d 73 67 28 70 44 65 73 74 29 2c 20 28 63 68 61  msg(pDest), (cha
fd30: 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  r*)0);.      sql
fd40: 69 74 65 33 5f 63 6c 6f 73 65 28 70 44 65 73 74  ite3_close(pDest
fd50: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
fd60: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
fd70: 0a 20 20 20 20 77 68 69 6c 65 28 20 20 28 72 63  .    while(  (rc
fd80: 20 3d 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75   = sqlite3_backu
fd90: 70 5f 73 74 65 70 28 70 42 61 63 6b 75 70 2c 31  p_step(pBackup,1
fda0: 30 30 29 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  00))==SQLITE_OK 
fdb0: 29 7b 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  ){}.    sqlite3_
fdc0: 62 61 63 6b 75 70 5f 66 69 6e 69 73 68 28 70 42  backup_finish(pB
fdd0: 61 63 6b 75 70 29 3b 0a 20 20 20 20 69 66 28 20  ackup);.    if( 
fde0: 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc==SQLITE_DONE 
fdf0: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 54 43  ){.      rc = TC
fe00: 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  L_OK;.    }else{
fe10: 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  .      Tcl_Appen
fe20: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
fe30: 22 62 61 63 6b 75 70 20 66 61 69 6c 65 64 3a 20  "backup failed: 
fe40: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 73 71  ",.           sq
fe50: 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44 65  lite3_errmsg(pDe
fe60: 73 74 29 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  st), (char*)0);.
fe70: 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45        rc = TCL_E
fe80: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
fe90: 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70 44  sqlite3_close(pD
fea0: 65 73 74 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b  est);.    break;
feb0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64  .  }..  /*    $d
fec0: 62 20 62 75 73 79 20 3f 43 41 4c 4c 42 41 43 4b  b busy ?CALLBACK
fed0: 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 76 6f  ?.  **.  ** Invo
fee0: 6b 65 20 74 68 65 20 67 69 76 65 6e 20 63 61 6c  ke the given cal
fef0: 6c 62 61 63 6b 20 69 66 20 61 6e 20 53 51 4c 20  lback if an SQL 
ff00: 73 74 61 74 65 6d 65 6e 74 20 61 74 74 65 6d 70  statement attemp
ff10: 74 73 20 74 6f 20 6f 70 65 6e 0a 20 20 2a 2a 20  ts to open.  ** 
ff20: 61 20 6c 6f 63 6b 65 64 20 64 61 74 61 62 61 73  a locked databas
ff30: 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 63  e file..  */.  c
ff40: 61 73 65 20 44 42 5f 42 55 53 59 3a 20 7b 0a 20  ase DB_BUSY: {. 
ff50: 20 20 20 69 66 28 20 6f 62 6a 63 3e 33 20 29 7b     if( objc>3 ){
ff60: 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  .      Tcl_Wrong
ff70: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
ff80: 32 2c 20 6f 62 6a 76 2c 20 22 43 41 4c 4c 42 41  2, objv, "CALLBA
ff90: 43 4b 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  CK");.      retu
ffa0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
ffb0: 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a 63    }else if( objc
ffc0: 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==2 ){.      if(
ffd0: 20 70 44 62 2d 3e 7a 42 75 73 79 20 29 7b 0a 20   pDb->zBusy ){. 
ffe0: 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e         Tcl_Appen
fff0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
10000 70 44 62 2d 3e 7a 42 75 73 79 2c 20 28 63 68 61  pDb->zBusy, (cha
10010 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  r*)0);.      }. 
10020 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
10030 63 68 61 72 20 2a 7a 42 75 73 79 3b 0a 20 20 20  char *zBusy;.   
10040 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20     int len;.    
10050 20 20 69 66 28 20 70 44 62 2d 3e 7a 42 75 73 79    if( pDb->zBusy
10060 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f   ){.        Tcl_
10070 46 72 65 65 28 70 44 62 2d 3e 7a 42 75 73 79 29  Free(pDb->zBusy)
10080 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
10090 7a 42 75 73 79 20 3d 20 54 63 6c 5f 47 65 74 53  zBusy = Tcl_GetS
100a0 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
100b0 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20 20  v[2], &len);.   
100c0 20 20 20 69 66 28 20 7a 42 75 73 79 20 26 26 20     if( zBusy && 
100d0 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  len>0 ){.       
100e0 20 70 44 62 2d 3e 7a 42 75 73 79 20 3d 20 54 63   pDb->zBusy = Tc
100f0 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20 31  l_Alloc( len + 1
10100 20 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63   );.        memc
10110 70 79 28 70 44 62 2d 3e 7a 42 75 73 79 2c 20 7a  py(pDb->zBusy, z
10120 42 75 73 79 2c 20 6c 65 6e 2b 31 29 3b 0a 20 20  Busy, len+1);.  
10130 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
10140 20 20 20 70 44 62 2d 3e 7a 42 75 73 79 20 3d 20     pDb->zBusy = 
10150 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
10160 20 69 66 28 20 70 44 62 2d 3e 7a 42 75 73 79 20   if( pDb->zBusy 
10170 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e  ){.        pDb->
10180 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b  interp = interp;
10190 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
101a0 5f 62 75 73 79 5f 68 61 6e 64 6c 65 72 28 70 44  _busy_handler(pD
101b0 62 2d 3e 64 62 2c 20 44 62 42 75 73 79 48 61 6e  b->db, DbBusyHan
101c0 64 6c 65 72 2c 20 70 44 62 29 3b 0a 20 20 20 20  dler, pDb);.    
101d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
101e0 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 68 61   sqlite3_busy_ha
101f0 6e 64 6c 65 72 28 70 44 62 2d 3e 64 62 2c 20 30  ndler(pDb->db, 0
10200 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
10210 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20    }.    break;. 
10220 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 20 24 64 62   }..  /*     $db
10230 20 63 61 63 68 65 20 66 6c 75 73 68 0a 20 20 2a   cache flush.  *
10240 2a 20 20 20 20 20 24 64 62 20 63 61 63 68 65 20  *     $db cache 
10250 73 69 7a 65 20 6e 0a 20 20 2a 2a 0a 20 20 2a 2a  size n.  **.  **
10260 20 46 6c 75 73 68 20 74 68 65 20 70 72 65 70 61   Flush the prepa
10270 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 63 61  red statement ca
10280 63 68 65 2c 20 6f 72 20 73 65 74 20 74 68 65 20  che, or set the 
10290 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f  maximum number o
102a0 66 0a 20 20 2a 2a 20 63 61 63 68 65 64 20 73 74  f.  ** cached st
102b0 61 74 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20  atements..  */. 
102c0 20 63 61 73 65 20 44 42 5f 43 41 43 48 45 3a 20   case DB_CACHE: 
102d0 7b 0a 20 20 20 20 63 68 61 72 20 2a 73 75 62 43  {.    char *subC
102e0 6d 64 3b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 0a  md;.    int n;..
102f0 20 20 20 20 69 66 28 20 6f 62 6a 63 3c 3d 32 20      if( objc<=2 
10300 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f  ){.      Tcl_Wro
10310 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
10320 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 61 63 68  , 1, objv, "cach
10330 65 20 6f 70 74 69 6f 6e 20 3f 61 72 67 3f 22 29  e option ?arg?")
10340 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
10350 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
10360 20 20 20 20 73 75 62 43 6d 64 20 3d 20 54 63 6c      subCmd = Tcl
10370 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
10380 6a 28 20 6f 62 6a 76 5b 32 5d 2c 20 30 20 29 3b  j( objv[2], 0 );
10390 0a 20 20 20 20 69 66 28 20 2a 73 75 62 43 6d 64  .    if( *subCmd
103a0 3d 3d 27 66 27 20 26 26 20 73 74 72 63 6d 70 28  =='f' && strcmp(
103b0 73 75 62 43 6d 64 2c 22 66 6c 75 73 68 22 29 3d  subCmd,"flush")=
103c0 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
103d0 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 20  objc!=3 ){.     
103e0 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
103f0 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
10400 62 6a 76 2c 20 22 66 6c 75 73 68 22 29 3b 0a 20  bjv, "flush");. 
10410 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43         return TC
10420 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d  L_ERROR;.      }
10430 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66 6c  else{.        fl
10440 75 73 68 53 74 6d 74 43 61 63 68 65 28 20 70 44  ushStmtCache( pD
10450 62 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  b );.      }.   
10460 20 7d 65 6c 73 65 20 69 66 28 20 2a 73 75 62 43   }else if( *subC
10470 6d 64 3d 3d 27 73 27 20 26 26 20 73 74 72 63 6d  md=='s' && strcm
10480 70 28 73 75 62 43 6d 64 2c 22 73 69 7a 65 22 29  p(subCmd,"size")
10490 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==0 ){.      if(
104a0 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20   objc!=4 ){.    
104b0 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
104c0 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20  Args(interp, 2, 
104d0 6f 62 6a 76 2c 20 22 73 69 7a 65 20 6e 22 29 3b  objv, "size n");
104e0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
104f0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  TCL_ERROR;.     
10500 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
10510 69 66 28 20 54 43 4c 5f 45 52 52 4f 52 3d 3d 54  if( TCL_ERROR==T
10520 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
10530 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d  (interp, objv[3]
10540 2c 20 26 6e 29 20 29 7b 0a 20 20 20 20 20 20 20  , &n) ){.       
10550 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
10560 75 6c 74 28 20 69 6e 74 65 72 70 2c 20 22 63 61  ult( interp, "ca
10570 6e 6e 6f 74 20 63 6f 6e 76 65 72 74 20 5c 22 22  nnot convert \""
10580 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
10590 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
105a0 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d 2c 30 29  omObj(objv[3],0)
105b0 2c 20 22 5c 22 20 74 6f 20 69 6e 74 65 67 65 72  , "\" to integer
105c0 22 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  ", (char*)0);.  
105d0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54          return T
105e0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  CL_ERROR;.      
105f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
10600 20 20 20 69 66 28 20 6e 3c 30 20 29 7b 0a 20 20     if( n<0 ){.  
10610 20 20 20 20 20 20 20 20 20 20 66 6c 75 73 68 53            flushS
10620 74 6d 74 43 61 63 68 65 28 20 70 44 62 20 29 3b  tmtCache( pDb );
10630 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 20 3d  .            n =
10640 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65   0;.          }e
10650 6c 73 65 20 69 66 28 20 6e 3e 4d 41 58 5f 50 52  lse if( n>MAX_PR
10660 45 50 41 52 45 44 5f 53 54 4d 54 53 20 29 7b 0a  EPARED_STMTS ){.
10670 20 20 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20              n = 
10680 4d 41 58 5f 50 52 45 50 41 52 45 44 5f 53 54 4d  MAX_PREPARED_STM
10690 54 53 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  TS;.          }.
106a0 20 20 20 20 20 20 20 20 20 20 70 44 62 2d 3e 6d            pDb->m
106b0 61 78 53 74 6d 74 20 3d 20 6e 3b 0a 20 20 20 20  axStmt = n;.    
106c0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
106d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 54    }else{.      T
106e0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
106f0 20 69 6e 74 65 72 70 2c 20 22 62 61 64 20 6f 70   interp, "bad op
10700 74 69 6f 6e 20 5c 22 22 2c 0a 20 20 20 20 20 20  tion \"",.      
10710 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
10720 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d  gFromObj(objv[2]
10730 2c 30 29 2c 20 22 5c 22 3a 20 6d 75 73 74 20 62  ,0), "\": must b
10740 65 20 66 6c 75 73 68 20 6f 72 20 73 69 7a 65 22  e flush or size"
10750 2c 0a 20 20 20 20 20 20 20 20 20 20 28 63 68 61  ,.          (cha
10760 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 72 65 74  r*)0);.      ret
10770 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
10780 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a     }.    break;.
10790 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 20 24 64    }..  /*     $d
107a0 62 20 63 68 61 6e 67 65 73 0a 20 20 2a 2a 0a 20  b changes.  **. 
107b0 20 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e   ** Return the n
107c0 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68  umber of rows th
107d0 61 74 20 77 65 72 65 20 6d 6f 64 69 66 69 65 64  at were modified
107e0 2c 20 69 6e 73 65 72 74 65 64 2c 20 6f 72 20 64  , inserted, or d
107f0 65 6c 65 74 65 64 20 62 79 0a 20 20 2a 2a 20 74  eleted by.  ** t
10800 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 49  he most recent I
10810 4e 53 45 52 54 2c 20 55 50 44 41 54 45 20 6f 72  NSERT, UPDATE or
10820 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e   DELETE statemen
10830 74 2c 20 6e 6f 74 20 69 6e 63 6c 75 64 69 6e 67  t, not including
10840 0a 20 20 2a 2a 20 61 6e 79 20 63 68 61 6e 67 65  .  ** any change
10850 73 20 6d 61 64 65 20 62 79 20 74 72 69 67 67 65  s made by trigge
10860 72 20 70 72 6f 67 72 61 6d 73 2e 0a 20 20 2a 2f  r programs..  */
10870 0a 20 20 63 61 73 65 20 44 42 5f 43 48 41 4e 47  .  case DB_CHANG
10880 45 53 3a 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62  ES: {.    Tcl_Ob
10890 6a 20 2a 70 52 65 73 75 6c 74 3b 0a 20 20 20 20  j *pResult;.    
108a0 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20  if( objc!=2 ){. 
108b0 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
108c0 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
108d0 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 20 20 20 20   objv, "");.    
108e0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
108f0 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 52  OR;.    }.    pR
10900 65 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65 74 4f  esult = Tcl_GetO
10910 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29  bjResult(interp)
10920 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 49 6e 74  ;.    Tcl_SetInt
10930 4f 62 6a 28 70 52 65 73 75 6c 74 2c 20 73 71 6c  Obj(pResult, sql
10940 69 74 65 33 5f 63 68 61 6e 67 65 73 28 70 44 62  ite3_changes(pDb
10950 2d 3e 64 62 29 29 3b 0a 20 20 20 20 62 72 65 61  ->db));.    brea
10960 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20  k;.  }..  /*    
10970 24 64 62 20 63 6c 6f 73 65 0a 20 20 2a 2a 0a 20  $db close.  **. 
10980 20 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74 68 65   ** Shutdown the
10990 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2f 0a 20   database.  */. 
109a0 20 63 61 73 65 20 44 42 5f 43 4c 4f 53 45 3a 20   case DB_CLOSE: 
109b0 7b 0a 20 20 20 20 54 63 6c 5f 44 65 6c 65 74 65  {.    Tcl_Delete
109c0 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20  Command(interp, 
109d0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
109e0 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29  mObj(objv[0], 0)
109f0 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  );.    break;.  
10a00 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20  }..  /*.  **    
10a10 20 24 64 62 20 63 6f 6c 6c 61 74 65 20 4e 41 4d   $db collate NAM
10a20 45 20 53 43 52 49 50 54 0a 20 20 2a 2a 0a 20 20  E SCRIPT.  **.  
10a30 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  ** Create a new 
10a40 53 51 4c 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75  SQL collation fu
10a50 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 20 4e 41  nction called NA
10a60 4d 45 2e 20 20 57 68 65 6e 65 76 65 72 0a 20 20  ME.  Whenever.  
10a70 2a 2a 20 74 68 61 74 20 66 75 6e 63 74 69 6f 6e  ** that function
10a80 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 6e 76 6f   is called, invo
10a90 6b 65 20 53 43 52 49 50 54 20 74 6f 20 65 76 61  ke SCRIPT to eva
10aa0 6c 75 61 74 65 20 74 68 65 20 66 75 6e 63 74 69  luate the functi
10ab0 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  on..  */.  case 
10ac0 44 42 5f 43 4f 4c 4c 41 54 45 3a 20 7b 0a 20 20  DB_COLLATE: {.  
10ad0 20 20 53 71 6c 43 6f 6c 6c 61 74 65 20 2a 70 43    SqlCollate *pC
10ae0 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 63 68 61 72  ollate;.    char
10af0 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 63 68 61   *zName;.    cha
10b00 72 20 2a 7a 53 63 72 69 70 74 3b 0a 20 20 20 20  r *zScript;.    
10b10 69 6e 74 20 6e 53 63 72 69 70 74 3b 0a 20 20 20  int nScript;.   
10b20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a   if( objc!=4 ){.
10b30 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
10b40 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
10b50 2c 20 6f 62 6a 76 2c 20 22 4e 41 4d 45 20 53 43  , objv, "NAME SC
10b60 52 49 50 54 22 29 3b 0a 20 20 20 20 20 20 72 65  RIPT");.      re
10b70 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
10b80 20 20 20 20 7d 0a 20 20 20 20 7a 4e 61 6d 65 20      }.    zName 
10b90 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  = Tcl_GetStringF
10ba0 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20  romObj(objv[2], 
10bb0 30 29 3b 0a 20 20 20 20 7a 53 63 72 69 70 74 20  0);.    zScript 
10bc0 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  = Tcl_GetStringF
10bd0 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d 2c 20  romObj(objv[3], 
10be0 26 6e 53 63 72 69 70 74 29 3b 0a 20 20 20 20 70  &nScript);.    p
10bf0 43 6f 6c 6c 61 74 65 20 3d 20 28 53 71 6c 43 6f  Collate = (SqlCo
10c00 6c 6c 61 74 65 2a 29 54 63 6c 5f 41 6c 6c 6f 63  llate*)Tcl_Alloc
10c10 28 20 73 69 7a 65 6f 66 28 2a 70 43 6f 6c 6c 61  ( sizeof(*pColla
10c20 74 65 29 20 2b 20 6e 53 63 72 69 70 74 20 2b 20  te) + nScript + 
10c30 31 20 29 3b 0a 20 20 20 20 69 66 28 20 70 43 6f  1 );.    if( pCo
10c40 6c 6c 61 74 65 3d 3d 30 20 29 20 72 65 74 75 72  llate==0 ) retur
10c50 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
10c60 20 70 43 6f 6c 6c 61 74 65 2d 3e 69 6e 74 65 72   pCollate->inter
10c70 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20  p = interp;.    
10c80 70 43 6f 6c 6c 61 74 65 2d 3e 70 4e 65 78 74 20  pCollate->pNext 
10c90 3d 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 3b  = pDb->pCollate;
10ca0 0a 20 20 20 20 70 43 6f 6c 6c 61 74 65 2d 3e 7a  .    pCollate->z
10cb0 53 63 72 69 70 74 20 3d 20 28 63 68 61 72 2a 29  Script = (char*)
10cc0 26 70 43 6f 6c 6c 61 74 65 5b 31 5d 3b 0a 20 20  &pCollate[1];.  
10cd0 20 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 20    pDb->pCollate 
10ce0 3d 20 70 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20  = pCollate;.    
10cf0 6d 65 6d 63 70 79 28 70 43 6f 6c 6c 61 74 65 2d  memcpy(pCollate-
10d00 3e 7a 53 63 72 69 70 74 2c 20 7a 53 63 72 69 70  >zScript, zScrip
10d10 74 2c 20 6e 53 63 72 69 70 74 2b 31 29 3b 0a 20  t, nScript+1);. 
10d20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 63     if( sqlite3_c
10d30 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28  reate_collation(
10d40 70 44 62 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20  pDb->db, zName, 
10d50 53 51 4c 49 54 45 5f 55 54 46 38 2c 0a 20 20 20  SQLITE_UTF8,.   
10d60 20 20 20 20 20 70 43 6f 6c 6c 61 74 65 2c 20 74       pCollate, t
10d70 63 6c 53 71 6c 43 6f 6c 6c 61 74 65 29 20 29 7b  clSqlCollate) ){
10d80 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74 52 65  .      Tcl_SetRe
10d90 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68  sult(interp, (ch
10da0 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 65 72 72  ar *)sqlite3_err
10db0 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c 20 54 43  msg(pDb->db), TC
10dc0 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 20  L_VOLATILE);.   
10dd0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
10de0 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62  ROR;.    }.    b
10df0 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a  reak;.  }..  /*.
10e00 20 20 2a 2a 20 20 20 20 20 24 64 62 20 63 6f 6c    **     $db col
10e10 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64 20 53 43  lation_needed SC
10e20 52 49 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43  RIPT.  **.  ** C
10e30 72 65 61 74 65 20 61 20 6e 65 77 20 53 51 4c 20  reate a new SQL 
10e40 63 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69  collation functi
10e50 6f 6e 20 63 61 6c 6c 65 64 20 4e 41 4d 45 2e 20  on called NAME. 
10e60 20 57 68 65 6e 65 76 65 72 0a 20 20 2a 2a 20 74   Whenever.  ** t
10e70 68 61 74 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  hat function is 
10e80 63 61 6c 6c 65 64 2c 20 69 6e 76 6f 6b 65 20 53  called, invoke S
10e90 43 52 49 50 54 20 74 6f 20 65 76 61 6c 75 61 74  CRIPT to evaluat
10ea0 65 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 2e 0a  e the function..
10eb0 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 43    */.  case DB_C
10ec0 4f 4c 4c 41 54 49 4f 4e 5f 4e 45 45 44 45 44 3a  OLLATION_NEEDED:
10ed0 20 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21   {.    if( objc!
10ee0 3d 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  =3 ){.      Tcl_
10ef0 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
10f00 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 53  erp, 2, objv, "S
10f10 43 52 49 50 54 22 29 3b 0a 20 20 20 20 20 20 72  CRIPT");.      r
10f20 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
10f30 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
10f40 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65 65 64  Db->pCollateNeed
10f50 65 64 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  ed ){.      Tcl_
10f60 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 44 62  DecrRefCount(pDb
10f70 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64  ->pCollateNeeded
10f80 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 44 62  );.    }.    pDb
10f90 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64  ->pCollateNeeded
10fa0 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65   = Tcl_Duplicate
10fb0 4f 62 6a 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20  Obj(objv[2]);.  
10fc0 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
10fd0 6e 74 28 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65  nt(pDb->pCollate
10fe0 4e 65 65 64 65 64 29 3b 0a 20 20 20 20 73 71 6c  Needed);.    sql
10ff0 69 74 65 33 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 6e  ite3_collation_n
11000 65 65 64 65 64 28 70 44 62 2d 3e 64 62 2c 20 70  eeded(pDb->db, p
11010 44 62 2c 20 74 63 6c 43 6f 6c 6c 61 74 65 4e 65  Db, tclCollateNe
11020 65 64 65 64 29 3b 0a 20 20 20 20 62 72 65 61 6b  eded);.    break
11030 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24  ;.  }..  /*    $
11040 64 62 20 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 20 3f  db commit_hook ?
11050 43 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a 0a 20  CALLBACK?.  **. 
11060 20 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 67   ** Invoke the g
11070 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b 20 6a 75  iven callback ju
11080 73 74 20 62 65 66 6f 72 65 20 63 6f 6d 6d 69 74  st before commit
11090 74 69 6e 67 20 65 76 65 72 79 20 53 51 4c 20 74  ting every SQL t
110a0 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a  ransaction..  **
110b0 20 49 66 20 74 68 65 20 63 61 6c 6c 62 61 63 6b   If the callback
110c0 20 74 68 72 6f 77 73 20 61 6e 20 65 78 63 65 70   throws an excep
110d0 74 69 6f 6e 20 6f 72 20 72 65 74 75 72 6e 73 20  tion or returns 
110e0 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74  non-zero, then t
110f0 68 65 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  he.  ** transact
11100 69 6f 6e 20 69 73 20 61 62 6f 72 74 65 64 2e 20  ion is aborted. 
11110 20 49 66 20 43 41 4c 4c 42 41 43 4b 20 69 73 20   If CALLBACK is 
11120 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2c  an empty string,
11130 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 0a 20 20   the callback.  
11140 2a 2a 20 69 73 20 64 69 73 61 62 6c 65 64 2e 0a  ** is disabled..
11150 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 43    */.  case DB_C
11160 4f 4d 4d 49 54 5f 48 4f 4f 4b 3a 20 7b 0a 20 20  OMMIT_HOOK: {.  
11170 20 20 69 66 28 20 6f 62 6a 63 3e 33 20 29 7b 0a    if( objc>3 ){.
11180 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
11190 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
111a0 2c 20 6f 62 6a 76 2c 20 22 3f 43 41 4c 4c 42 41  , objv, "?CALLBA
111b0 43 4b 3f 22 29 3b 0a 20 20 20 20 20 20 72 65 74  CK?");.      ret
111c0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
111d0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a     }else if( obj
111e0 63 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 69 66  c==2 ){.      if
111f0 28 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 20 29  ( pDb->zCommit )
11200 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70  {.        Tcl_Ap
11210 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
11220 70 2c 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 2c  p, pDb->zCommit,
11230 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20   (char*)0);.    
11240 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
11250 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
11260 2a 7a 43 6f 6d 6d 69 74 3b 0a 20 20 20 20 20 20  *zCommit;.      
11270 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20 69  int len;.      i
11280 66 28 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 20  f( pDb->zCommit 
11290 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 46  ){.        Tcl_F
112a0 72 65 65 28 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74  ree(pDb->zCommit
112b0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
112c0 20 7a 43 6f 6d 6d 69 74 20 3d 20 54 63 6c 5f 47   zCommit = Tcl_G
112d0 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
112e0 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a  objv[2], &len);.
112f0 20 20 20 20 20 20 69 66 28 20 7a 43 6f 6d 6d 69        if( zCommi
11300 74 20 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20 20  t && len>0 ){.  
11310 20 20 20 20 20 20 70 44 62 2d 3e 7a 43 6f 6d 6d        pDb->zComm
11320 69 74 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 20  it = Tcl_Alloc( 
11330 6c 65 6e 20 2b 20 31 20 29 3b 0a 20 20 20 20 20  len + 1 );.     
11340 20 20 20 6d 65 6d 63 70 79 28 70 44 62 2d 3e 7a     memcpy(pDb->z
11350 43 6f 6d 6d 69 74 2c 20 7a 43 6f 6d 6d 69 74 2c  Commit, zCommit,
11360 20 6c 65 6e 2b 31 29 3b 0a 20 20 20 20 20 20 7d   len+1);.      }
11370 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 44  else{.        pD
11380 62 2d 3e 7a 43 6f 6d 6d 69 74 20 3d 20 30 3b 0a  b->zCommit = 0;.
11390 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
113a0 28 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 20 29  ( pDb->zCommit )
113b0 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 69  {.        pDb->i
113c0 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a  nterp = interp;.
113d0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
113e0 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 28 70 44 62 2d  commit_hook(pDb-
113f0 3e 64 62 2c 20 44 62 43 6f 6d 6d 69 74 48 61 6e  >db, DbCommitHan
11400 64 6c 65 72 2c 20 70 44 62 29 3b 0a 20 20 20 20  dler, pDb);.    
11410 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
11420 20 73 71 6c 69 74 65 33 5f 63 6f 6d 6d 69 74 5f   sqlite3_commit_
11430 68 6f 6f 6b 28 70 44 62 2d 3e 64 62 2c 20 30 2c  hook(pDb->db, 0,
11440 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
11450 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20   }.    break;.  
11460 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 63  }..  /*    $db c
11470 6f 6d 70 6c 65 74 65 20 53 51 4c 0a 20 20 2a 2a  omplete SQL.  **
11480 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  .  ** Return TRU
11490 45 20 69 66 20 53 51 4c 20 69 73 20 61 20 63 6f  E if SQL is a co
114a0 6d 70 6c 65 74 65 20 53 51 4c 20 73 74 61 74 65  mplete SQL state
114b0 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 20 46 41  ment.  Return FA
114c0 4c 53 45 20 69 66 0a 20 20 2a 2a 20 61 64 64 69  LSE if.  ** addi
114d0 74 69 6f 6e 61 6c 20 6c 69 6e 65 73 20 6f 66 20  tional lines of 
114e0 69 6e 70 75 74 20 61 72 65 20 6e 65 65 64 65 64  input are needed
114f0 2e 20 20 54 68 69 73 20 69 73 20 73 69 6d 69 6c  .  This is simil
11500 61 72 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 62  ar to the.  ** b
11510 75 69 6c 74 2d 69 6e 20 22 69 6e 66 6f 20 63 6f  uilt-in "info co
11520 6d 70 6c 65 74 65 22 20 63 6f 6d 6d 61 6e 64 20  mplete" command 
11530 6f 66 20 54 63 6c 2e 0a 20 20 2a 2f 0a 20 20 63  of Tcl..  */.  c
11540 61 73 65 20 44 42 5f 43 4f 4d 50 4c 45 54 45 3a  ase DB_COMPLETE:
11550 20 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   {.#ifndef SQLIT
11560 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4c 45 54 45 0a  E_OMIT_COMPLETE.
11570 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65      Tcl_Obj *pRe
11580 73 75 6c 74 3b 0a 20 20 20 20 69 6e 74 20 69 73  sult;.    int is
11590 43 6f 6d 70 6c 65 74 65 3b 0a 20 20 20 20 69 66  Complete;.    if
115a0 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20  ( objc!=3 ){.   
115b0 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
115c0 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
115d0 62 6a 76 2c 20 22 53 51 4c 22 29 3b 0a 20 20 20  bjv, "SQL");.   
115e0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
115f0 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ROR;.    }.    i
11600 73 43 6f 6d 70 6c 65 74 65 20 3d 20 73 71 6c 69  sComplete = sqli
11610 74 65 33 5f 63 6f 6d 70 6c 65 74 65 28 20 54 63  te3_complete( Tc
11620 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
11630 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30 29 20 29  bj(objv[2], 0) )
11640 3b 0a 20 20 20 20 70 52 65 73 75 6c 74 20 3d 20  ;.    pResult = 
11650 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_GetObjResult
11660 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 63  (interp);.    Tc
11670 6c 5f 53 65 74 42 6f 6f 6c 65 61 6e 4f 62 6a 28  l_SetBooleanObj(
11680 70 52 65 73 75 6c 74 2c 20 69 73 43 6f 6d 70 6c  pResult, isCompl
11690 65 74 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  ete);.#endif.   
116a0 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
116b0 2a 20 20 20 20 24 64 62 20 63 6f 70 79 20 63 6f  *    $db copy co
116c0 6e 66 6c 69 63 74 2d 61 6c 67 6f 72 69 74 68 6d  nflict-algorithm
116d0 20 74 61 62 6c 65 20 66 69 6c 65 6e 61 6d 65 20   table filename 
116e0 3f 53 45 50 41 52 41 54 4f 52 3f 20 3f 4e 55 4c  ?SEPARATOR? ?NUL
116f0 4c 49 4e 44 49 43 41 54 4f 52 3f 0a 20 20 2a 2a  LINDICATOR?.  **
11700 0a 20 20 2a 2a 20 43 6f 70 79 20 64 61 74 61 20  .  ** Copy data 
11710 69 6e 74 6f 20 74 61 62 6c 65 20 66 72 6f 6d 20  into table from 
11720 66 69 6c 65 6e 61 6d 65 2c 20 6f 70 74 69 6f 6e  filename, option
11730 61 6c 6c 79 20 75 73 69 6e 67 20 53 45 50 41 52  ally using SEPAR
11740 41 54 4f 52 0a 20 20 2a 2a 20 61 73 20 63 6f 6c  ATOR.  ** as col
11750 75 6d 6e 20 73 65 70 61 72 61 74 6f 72 73 2e 20  umn separators. 
11760 20 49 66 20 61 20 63 6f 6c 75 6d 6e 20 63 6f 6e   If a column con
11770 74 61 69 6e 73 20 61 20 6e 75 6c 6c 20 73 74 72  tains a null str
11780 69 6e 67 2c 20 6f 72 20 74 68 65 0a 20 20 2a 2a  ing, or the.  **
11790 20 76 61 6c 75 65 20 6f 66 20 4e 55 4c 4c 49 4e   value of NULLIN
117a0 44 49 43 41 54 4f 52 2c 20 61 20 4e 55 4c 4c 20  DICATOR, a NULL 
117b0 69 73 20 69 6e 73 65 72 74 65 64 20 66 6f 72 20  is inserted for 
117c0 74 68 65 20 63 6f 6c 75 6d 6e 2e 0a 20 20 2a 2a  the column..  **
117d0 20 63 6f 6e 66 6c 69 63 74 2d 61 6c 67 6f 72 69   conflict-algori
117e0 74 68 6d 20 69 73 20 6f 6e 65 20 6f 66 20 74 68  thm is one of th
117f0 65 20 73 71 6c 69 74 65 20 63 6f 6e 66 6c 69 63  e sqlite conflic
11800 74 20 61 6c 67 6f 72 69 74 68 6d 73 3a 0a 20 20  t algorithms:.  
11810 2a 2a 20 20 20 20 72 6f 6c 6c 62 61 63 6b 2c 20  **    rollback, 
11820 61 62 6f 72 74 2c 20 66 61 69 6c 2c 20 69 67 6e  abort, fail, ign
11830 6f 72 65 2c 20 72 65 70 6c 61 63 65 0a 20 20 2a  ore, replace.  *
11840 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c 20 72 65  * On success, re
11850 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
11860 6f 66 20 6c 69 6e 65 73 20 70 72 6f 63 65 73 73  of lines process
11870 65 64 2c 20 6e 6f 74 20 6e 65 63 65 73 73 61 72  ed, not necessar
11880 69 6c 79 20 73 61 6d 65 0a 20 20 2a 2a 20 61 73  ily same.  ** as
11890 20 27 64 62 20 63 68 61 6e 67 65 73 27 20 64 75   'db changes' du
118a0 65 20 74 6f 20 63 6f 6e 66 6c 69 63 74 2d 61 6c  e to conflict-al
118b0 67 6f 72 69 74 68 6d 20 73 65 6c 65 63 74 65 64  gorithm selected
118c0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73  ..  **.  ** This
118d0 20 63 6f 64 65 20 69 73 20 62 61 73 69 63 61 6c   code is basical
118e0 6c 79 20 61 6e 20 69 6d 70 6c 65 6d 65 6e 74 61  ly an implementa
118f0 74 69 6f 6e 2f 65 6e 68 61 6e 63 65 6d 65 6e 74  tion/enhancement
11900 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 73 71 6c   of.  ** the sql
11910 69 74 65 33 20 73 68 65 6c 6c 2e 63 20 22 2e 69  ite3 shell.c ".i
11920 6d 70 6f 72 74 22 20 63 6f 6d 6d 61 6e 64 2e 0a  mport" command..
11930 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 63    **.  ** This c
11940 6f 6d 6d 61 6e 64 20 75 73 61 67 65 20 69 73 20  ommand usage is 
11950 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 74 68  equivalent to th
11960 65 20 73 71 6c 69 74 65 32 2e 78 20 43 4f 50 59  e sqlite2.x COPY
11970 20 73 74 61 74 65 6d 65 6e 74 2c 0a 20 20 2a 2a   statement,.  **
11980 20 77 68 69 63 68 20 69 6d 70 6f 72 74 73 20 66   which imports f
11990 69 6c 65 20 64 61 74 61 20 69 6e 74 6f 20 61 20  ile data into a 
119a0 74 61 62 6c 65 20 75 73 69 6e 67 20 74 68 65 20  table using the 
119b0 50 6f 73 74 67 72 65 53 51 4c 20 43 4f 50 59 20  PostgreSQL COPY 
119c0 66 69 6c 65 20 66 6f 72 6d 61 74 3a 0a 20 20 2a  file format:.  *
119d0 2a 20 20 20 24 64 62 20 63 6f 70 79 20 24 63 6f  *   $db copy $co
119e0 6e 66 6c 69 74 5f 61 6c 67 6f 20 24 74 61 62 6c  nflit_algo $tabl
119f0 65 5f 6e 61 6d 65 20 24 66 69 6c 65 6e 61 6d 65  e_name $filename
11a00 20 5c 74 20 5c 5c 4e 0a 20 20 2a 2f 0a 20 20 63   \t \\N.  */.  c
11a10 61 73 65 20 44 42 5f 43 4f 50 59 3a 20 7b 0a 20  ase DB_COPY: {. 
11a20 20 20 20 63 68 61 72 20 2a 7a 54 61 62 6c 65 3b     char *zTable;
11a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11a40 2a 20 49 6e 73 65 72 74 20 64 61 74 61 20 69 6e  * Insert data in
11a50 74 6f 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f  to this table */
11a60 0a 20 20 20 20 63 68 61 72 20 2a 7a 46 69 6c 65  .    char *zFile
11a70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
11a80 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 66 72 6f   /* The file fro
11a90 6d 20 77 68 69 63 68 20 74 6f 20 65 78 74 72 61  m which to extra
11aa0 63 74 20 64 61 74 61 20 2a 2f 0a 20 20 20 20 63  ct data */.    c
11ab0 68 61 72 20 2a 7a 43 6f 6e 66 6c 69 63 74 3b 20  har *zConflict; 
11ac0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
11ad0 65 20 63 6f 6e 66 6c 69 63 74 20 61 6c 67 6f 72  e conflict algor
11ae0 69 74 68 6d 20 74 6f 20 75 73 65 20 2a 2f 0a 20  ithm to use */. 
11af0 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20     sqlite3_stmt 
11b00 2a 70 53 74 6d 74 3b 20 20 20 20 20 20 20 20 2f  *pStmt;        /
11b10 2a 20 41 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  * A statement */
11b20 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20  .    int nCol;  
11b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11b40 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f   /* Number of co
11b50 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 74 61 62  lumns in the tab
11b60 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 42  le */.    int nB
11b70 79 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  yte;            
11b80 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
11b90 6f 66 20 62 79 74 65 73 20 69 6e 20 61 6e 20 53  of bytes in an S
11ba0 51 4c 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 20  QL string */.   
11bb0 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20   int i, j;      
11bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11bd0 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f  Loop counters */
11be0 0a 20 20 20 20 69 6e 74 20 6e 53 65 70 3b 20 20  .    int nSep;  
11bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11c00 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
11c10 74 65 73 20 69 6e 20 7a 53 65 70 5b 5d 20 2a 2f  tes in zSep[] */
11c20 0a 20 20 20 20 69 6e 74 20 6e 4e 75 6c 6c 3b 20  .    int nNull; 
11c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11c40 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
11c50 74 65 73 20 69 6e 20 7a 4e 75 6c 6c 5b 5d 20 2a  tes in zNull[] *
11c60 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 71 6c  /.    char *zSql
11c70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
11c80 20 20 2f 2a 20 41 6e 20 53 51 4c 20 73 74 61 74    /* An SQL stat
11c90 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 63 68 61  ement */.    cha
11ca0 72 20 2a 7a 4c 69 6e 65 3b 20 20 20 20 20 20 20  r *zLine;       
11cb0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69           /* A si
11cc0 6e 67 6c 65 20 6c 69 6e 65 20 6f 66 20 69 6e 70  ngle line of inp
11cd0 75 74 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65  ut from the file
11ce0 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 2a 61   */.    char **a
11cf0 7a 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20  zCol;           
11d00 20 20 20 20 2f 2a 20 7a 4c 69 6e 65 5b 5d 20 62      /* zLine[] b
11d10 72 6f 6b 65 6e 20 75 70 20 69 6e 74 6f 20 63 6f  roken up into co
11d20 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 63 6f 6e  lumns */.    con
11d30 73 74 20 63 68 61 72 20 2a 7a 43 6f 6d 6d 69 74  st char *zCommit
11d40 3b 20 20 20 20 20 20 20 20 2f 2a 20 48 6f 77 20  ;        /* How 
11d50 74 6f 20 63 6f 6d 6d 69 74 20 63 68 61 6e 67 65  to commit change
11d60 73 20 2a 2f 0a 20 20 20 20 46 49 4c 45 20 2a 69  s */.    FILE *i
11d70 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
11d80 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 70 75       /* The inpu
11d90 74 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 69 6e  t file */.    in
11da0 74 20 6c 69 6e 65 6e 6f 20 3d 20 30 3b 20 20 20  t lineno = 0;   
11db0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e            /* Lin
11dc0 65 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 70 75  e number of inpu
11dd0 74 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 63 68  t file */.    ch
11de0 61 72 20 7a 4c 69 6e 65 4e 75 6d 5b 38 30 5d 3b  ar zLineNum[80];
11df0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e            /* Lin
11e00 65 20 6e 75 6d 62 65 72 20 70 72 69 6e 74 20 62  e number print b
11e10 75 66 66 65 72 20 2a 2f 0a 20 20 20 20 54 63 6c  uffer */.    Tcl
11e20 5f 4f 62 6a 20 2a 70 52 65 73 75 6c 74 3b 20 20  _Obj *pResult;  
11e30 20 20 20 20 20 20 20 20 20 2f 2a 20 69 6e 74 65           /* inte
11e40 72 70 20 72 65 73 75 6c 74 20 2a 2f 0a 0a 20 20  rp result */..  
11e50 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
11e60 65 70 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  ep;.    const ch
11e70 61 72 20 2a 7a 4e 75 6c 6c 3b 0a 20 20 20 20 69  ar *zNull;.    i
11e80 66 28 20 6f 62 6a 63 3c 35 20 7c 7c 20 6f 62 6a  f( objc<5 || obj
11e90 63 3e 37 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  c>7 ){.      Tcl
11ea0 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
11eb0 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 0a 20  terp, 2, objv,. 
11ec0 20 20 20 20 20 20 20 20 22 43 4f 4e 46 4c 49 43          "CONFLIC
11ed0 54 2d 41 4c 47 4f 52 49 54 48 4d 20 54 41 42 4c  T-ALGORITHM TABL
11ee0 45 20 46 49 4c 45 4e 41 4d 45 20 3f 53 45 50 41  E FILENAME ?SEPA
11ef0 52 41 54 4f 52 3f 20 3f 4e 55 4c 4c 49 4e 44 49  RATOR? ?NULLINDI
11f00 43 41 54 4f 52 3f 22 29 3b 0a 20 20 20 20 20 20  CATOR?");.      
11f10 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
11f20 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
11f30 6f 62 6a 63 3e 3d 36 20 29 7b 0a 20 20 20 20 20  objc>=6 ){.     
11f40 20 7a 53 65 70 20 3d 20 54 63 6c 5f 47 65 74 53   zSep = Tcl_GetS
11f50 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
11f60 76 5b 35 5d 2c 20 30 29 3b 0a 20 20 20 20 7d 65  v[5], 0);.    }e
11f70 6c 73 65 7b 0a 20 20 20 20 20 20 7a 53 65 70 20  lse{.      zSep 
11f80 3d 20 22 5c 74 22 3b 0a 20 20 20 20 7d 0a 20 20  = "\t";.    }.  
11f90 20 20 69 66 28 20 6f 62 6a 63 3e 3d 37 20 29 7b    if( objc>=7 ){
11fa0 0a 20 20 20 20 20 20 7a 4e 75 6c 6c 20 3d 20 54  .      zNull = T
11fb0 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
11fc0 4f 62 6a 28 6f 62 6a 76 5b 36 5d 2c 20 30 29 3b  Obj(objv[6], 0);
11fd0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
11fe0 20 20 7a 4e 75 6c 6c 20 3d 20 22 22 3b 0a 20 20    zNull = "";.  
11ff0 20 20 7d 0a 20 20 20 20 7a 43 6f 6e 66 6c 69 63    }.    zConflic
12000 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  t = Tcl_GetStrin
12010 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d  gFromObj(objv[2]
12020 2c 20 30 29 3b 0a 20 20 20 20 7a 54 61 62 6c 65  , 0);.    zTable
12030 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
12040 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d 2c  FromObj(objv[3],
12050 20 30 29 3b 0a 20 20 20 20 7a 46 69 6c 65 20 3d   0);.    zFile =
12060 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
12070 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 34 5d 2c 20 30  omObj(objv[4], 0
12080 29 3b 0a 20 20 20 20 6e 53 65 70 20 3d 20 73 74  );.    nSep = st
12090 72 6c 65 6e 33 30 28 7a 53 65 70 29 3b 0a 20 20  rlen30(zSep);.  
120a0 20 20 6e 4e 75 6c 6c 20 3d 20 73 74 72 6c 65 6e    nNull = strlen
120b0 33 30 28 7a 4e 75 6c 6c 29 3b 0a 20 20 20 20 69  30(zNull);.    i
120c0 66 28 20 6e 53 65 70 3d 3d 30 20 29 7b 0a 20 20  f( nSep==0 ){.  
120d0 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
120e0 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 45 72 72  sult(interp,"Err
120f0 6f 72 3a 20 6e 6f 6e 2d 6e 75 6c 6c 20 73 65 70  or: non-null sep
12100 61 72 61 74 6f 72 20 72 65 71 75 69 72 65 64 20  arator required 
12110 66 6f 72 20 63 6f 70 79 22 2c 0a 20 20 20 20 20  for copy",.     
12120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12130 20 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20    (char*)0);.   
12140 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
12150 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ROR;.    }.    i
12160 66 28 73 74 72 63 6d 70 28 7a 43 6f 6e 66 6c 69  f(strcmp(zConfli
12170 63 74 2c 20 22 72 6f 6c 6c 62 61 63 6b 22 29 20  ct, "rollback") 
12180 21 3d 20 30 20 26 26 0a 20 20 20 20 20 20 20 73  != 0 &&.       s
12190 74 72 63 6d 70 28 7a 43 6f 6e 66 6c 69 63 74 2c  trcmp(zConflict,
121a0 20 22 61 62 6f 72 74 22 20 20 20 29 20 21 3d 20   "abort"   ) != 
121b0 30 20 26 26 0a 20 20 20 20 20 20 20 73 74 72 63  0 &&.       strc
121c0 6d 70 28 7a 43 6f 6e 66 6c 69 63 74 2c 20 22 66  mp(zConflict, "f
121d0 61 69 6c 22 20 20 20 20 29 20 21 3d 20 30 20 26  ail"    ) != 0 &
121e0 26 0a 20 20 20 20 20 20 20 73 74 72 63 6d 70 28  &.       strcmp(
121f0 7a 43 6f 6e 66 6c 69 63 74 2c 20 22 69 67 6e 6f  zConflict, "igno
12200 72 65 22 20 20 29 20 21 3d 20 30 20 26 26 0a 20  re"  ) != 0 &&. 
12210 20 20 20 20 20 20 73 74 72 63 6d 70 28 7a 43 6f        strcmp(zCo
12220 6e 66 6c 69 63 74 2c 20 22 72 65 70 6c 61 63 65  nflict, "replace
12230 22 20 29 20 21 3d 20 30 20 29 20 7b 0a 20 20 20  " ) != 0 ) {.   
12240 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
12250 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 45 72 72  ult(interp, "Err
12260 6f 72 3a 20 5c 22 22 2c 20 7a 43 6f 6e 66 6c 69  or: \"", zConfli
12270 63 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ct,.            
12280 22 5c 22 2c 20 63 6f 6e 66 6c 69 63 74 2d 61 6c  "\", conflict-al
12290 67 6f 72 69 74 68 6d 20 6d 75 73 74 20 62 65 20  gorithm must be 
122a0 6f 6e 65 20 6f 66 3a 20 72 6f 6c 6c 62 61 63 6b  one of: rollback
122b0 2c 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  , ".            
122c0 22 61 62 6f 72 74 2c 20 66 61 69 6c 2c 20 69 67  "abort, fail, ig
122d0 6e 6f 72 65 2c 20 6f 72 20 72 65 70 6c 61 63 65  nore, or replace
122e0 22 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  ", (char*)0);.  
122f0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
12300 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
12310 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zSql = sqlite3_m
12320 70 72 69 6e 74 66 28 22 53 45 4c 45 43 54 20 2a  printf("SELECT *
12330 20 46 52 4f 4d 20 27 25 71 27 22 2c 20 7a 54 61   FROM '%q'", zTa
12340 62 6c 65 29 3b 0a 20 20 20 20 69 66 28 20 7a 53  ble);.    if( zS
12350 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 54  ql==0 ){.      T
12360 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
12370 69 6e 74 65 72 70 2c 20 22 45 72 72 6f 72 3a 20  interp, "Error: 
12380 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 3a 20 22  no such table: "
12390 2c 20 7a 54 61 62 6c 65 2c 20 28 63 68 61 72 2a  , zTable, (char*
123a0 29 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  )0);.      retur
123b0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
123c0 20 7d 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 73   }.    nByte = s
123d0 74 72 6c 65 6e 33 30 28 7a 53 71 6c 29 3b 0a 20  trlen30(zSql);. 
123e0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
123f0 70 72 65 70 61 72 65 28 70 44 62 2d 3e 64 62 2c  prepare(pDb->db,
12400 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d   zSql, -1, &pStm
12410 74 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  t, 0);.    sqlit
12420 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20  e3_free(zSql);. 
12430 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
12440 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
12450 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 45 72 72  ult(interp, "Err
12460 6f 72 3a 20 22 2c 20 73 71 6c 69 74 65 33 5f 65  or: ", sqlite3_e
12470 72 72 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c 20  rrmsg(pDb->db), 
12480 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20  (char*)0);.     
12490 20 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 7d   nCol = 0;.    }
124a0 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 43 6f 6c  else{.      nCol
124b0 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
124c0 6e 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29 3b 0a  n_count(pStmt);.
124d0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
124e0 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
124f0 29 3b 0a 20 20 20 20 69 66 28 20 6e 43 6f 6c 3d  );.    if( nCol=
12500 3d 30 20 29 20 7b 0a 20 20 20 20 20 20 72 65 74  =0 ) {.      ret
12510 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
12520 20 20 20 7d 0a 20 20 20 20 7a 53 71 6c 20 3d 20     }.    zSql = 
12530 6d 61 6c 6c 6f 63 28 20 6e 42 79 74 65 20 2b 20  malloc( nByte + 
12540 35 30 20 2b 20 6e 43 6f 6c 2a 32 20 29 3b 0a 20  50 + nCol*2 );. 
12550 20 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29     if( zSql==0 )
12560 20 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70   {.      Tcl_App
12570 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
12580 2c 20 22 45 72 72 6f 72 3a 20 63 61 6e 27 74 20  , "Error: can't 
12590 6d 61 6c 6c 6f 63 28 29 22 2c 20 28 63 68 61 72  malloc()", (char
125a0 2a 29 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75  *)0);.      retu
125b0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
125c0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
125d0 73 6e 70 72 69 6e 74 66 28 6e 42 79 74 65 2b 35  snprintf(nByte+5
125e0 30 2c 20 7a 53 71 6c 2c 20 22 49 4e 53 45 52 54  0, zSql, "INSERT
125f0 20 4f 52 20 25 71 20 49 4e 54 4f 20 27 25 71 27   OR %q INTO '%q'
12600 20 56 41 4c 55 45 53 28 3f 22 2c 0a 20 20 20 20   VALUES(?",.    
12610 20 20 20 20 20 7a 43 6f 6e 66 6c 69 63 74 2c 20       zConflict, 
12620 7a 54 61 62 6c 65 29 3b 0a 20 20 20 20 6a 20 3d  zTable);.    j =
12630 20 73 74 72 6c 65 6e 33 30 28 7a 53 71 6c 29 3b   strlen30(zSql);
12640 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c  .    for(i=1; i<
12650 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
12660 20 20 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d 20 27 2c    zSql[j++] = ',
12670 27 3b 0a 20 20 20 20 20 20 7a 53 71 6c 5b 6a 2b  ';.      zSql[j+
12680 2b 5d 20 3d 20 27 3f 27 3b 0a 20 20 20 20 7d 0a  +] = '?';.    }.
12690 20 20 20 20 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d 20      zSql[j++] = 
126a0 27 29 27 3b 0a 20 20 20 20 7a 53 71 6c 5b 6a 5d  ')';.    zSql[j]
126b0 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 73   = 0;.    rc = s
126c0 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28 70  qlite3_prepare(p
126d0 44 62 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31  Db->db, zSql, -1
126e0 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20  , &pStmt, 0);.  
126f0 20 20 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20    free(zSql);.  
12700 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
12710 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
12720 6c 74 28 69 6e 74 65 72 70 2c 20 22 45 72 72 6f  lt(interp, "Erro
12730 72 3a 20 22 2c 20 73 71 6c 69 74 65 33 5f 65 72  r: ", sqlite3_er
12740 72 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c 20 28  rmsg(pDb->db), (
12750 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20  char*)0);.      
12760 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
12770 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 72  (pStmt);.      r
12780 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
12790 0a 20 20 20 20 7d 0a 20 20 20 20 69 6e 20 3d 20  .    }.    in = 
127a0 66 6f 70 65 6e 28 7a 46 69 6c 65 2c 20 22 72 62  fopen(zFile, "rb
127b0 22 29 3b 0a 20 20 20 20 69 66 28 20 69 6e 3d 3d  ");.    if( in==
127c0 30 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41  0 ){.      Tcl_A
127d0 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
127e0 72 70 2c 20 22 45 72 72 6f 72 3a 20 63 61 6e 6e  rp, "Error: cann
127f0 6f 74 20 6f 70 65 6e 20 66 69 6c 65 3a 20 22 2c  ot open file: ",
12800 20 7a 46 69 6c 65 2c 20 28 63 68 61 72 2a 29 30   zFile, (char*)0
12810 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
12820 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
12830 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
12840 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
12850 20 20 20 20 61 7a 43 6f 6c 20 3d 20 6d 61 6c 6c      azCol = mall
12860 6f 63 28 20 73 69 7a 65 6f 66 28 61 7a 43 6f 6c  oc( sizeof(azCol
12870 5b 30 5d 29 2a 28 6e 43 6f 6c 2b 31 29 20 29 3b  [0])*(nCol+1) );
12880 0a 20 20 20 20 69 66 28 20 61 7a 43 6f 6c 3d 3d  .    if( azCol==
12890 30 20 29 20 7b 0a 20 20 20 20 20 20 54 63 6c 5f  0 ) {.      Tcl_
128a0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
128b0 65 72 70 2c 20 22 45 72 72 6f 72 3a 20 63 61 6e  erp, "Error: can
128c0 27 74 20 6d 61 6c 6c 6f 63 28 29 22 2c 20 28 63  't malloc()", (c
128d0 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 66  har*)0);.      f
128e0 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 20 20 20  close(in);.     
128f0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
12900 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 28 76 6f  R;.    }.    (vo
12910 69 64 29 73 71 6c 69 74 65 33 5f 65 78 65 63 28  id)sqlite3_exec(
12920 70 44 62 2d 3e 64 62 2c 20 22 42 45 47 49 4e 22  pDb->db, "BEGIN"
12930 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
12940 7a 43 6f 6d 6d 69 74 20 3d 20 22 43 4f 4d 4d 49  zCommit = "COMMI
12950 54 22 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28  T";.    while( (
12960 7a 4c 69 6e 65 20 3d 20 6c 6f 63 61 6c 5f 67 65  zLine = local_ge
12970 74 6c 69 6e 65 28 30 2c 20 69 6e 29 29 21 3d 30  tline(0, in))!=0
12980 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a   ){.      char *
12990 7a 3b 0a 20 20 20 20 20 20 6c 69 6e 65 6e 6f 2b  z;.      lineno+
129a0 2b 3b 0a 20 20 20 20 20 20 61 7a 43 6f 6c 5b 30  +;.      azCol[0
129b0 5d 20 3d 20 7a 4c 69 6e 65 3b 0a 20 20 20 20 20  ] = zLine;.     
129c0 20 66 6f 72 28 69 3d 30 2c 20 7a 3d 7a 4c 69 6e   for(i=0, z=zLin
129d0 65 3b 20 2a 7a 3b 20 7a 2b 2b 29 7b 0a 20 20 20  e; *z; z++){.   
129e0 20 20 20 20 20 69 66 28 20 2a 7a 3d 3d 7a 53 65       if( *z==zSe
129f0 70 5b 30 5d 20 26 26 20 73 74 72 6e 63 6d 70 28  p[0] && strncmp(
12a00 7a 2c 20 7a 53 65 70 2c 20 6e 53 65 70 29 3d 3d  z, zSep, nSep)==
12a10 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2a  0 ){.          *
12a20 7a 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  z = 0;.         
12a30 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20   i++;.          
12a40 69 66 28 20 69 3c 6e 43 6f 6c 20 29 7b 0a 20 20  if( i<nCol ){.  
12a50 20 20 20 20 20 20 20 20 20 20 61 7a 43 6f 6c 5b            azCol[
12a60 69 5d 20 3d 20 26 7a 5b 6e 53 65 70 5d 3b 0a 20  i] = &z[nSep];. 
12a70 20 20 20 20 20 20 20 20 20 20 20 7a 20 2b 3d 20             z += 
12a80 6e 53 65 70 2d 31 3b 0a 20 20 20 20 20 20 20 20  nSep-1;.        
12a90 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
12aa0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
12ab0 69 2b 31 21 3d 6e 43 6f 6c 20 29 7b 0a 20 20 20  i+1!=nCol ){.   
12ac0 20 20 20 20 20 63 68 61 72 20 2a 7a 45 72 72 3b       char *zErr;
12ad0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 45 72  .        int nEr
12ae0 72 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 46 69  r = strlen30(zFi
12af0 6c 65 29 20 2b 20 32 30 30 3b 0a 20 20 20 20 20  le) + 200;.     
12b00 20 20 20 7a 45 72 72 20 3d 20 6d 61 6c 6c 6f 63     zErr = malloc
12b10 28 6e 45 72 72 29 3b 0a 20 20 20 20 20 20 20 20  (nErr);.        
12b20 69 66 28 20 7a 45 72 72 20 29 7b 0a 20 20 20 20  if( zErr ){.    
12b30 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
12b40 70 72 69 6e 74 66 28 6e 45 72 72 2c 20 7a 45 72  printf(nErr, zEr
12b50 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r,.             
12b60 22 45 72 72 6f 72 3a 20 25 73 20 6c 69 6e 65 20  "Error: %s line 
12b70 25 64 3a 20 65 78 70 65 63 74 65 64 20 25 64 20  %d: expected %d 
12b80 63 6f 6c 75 6d 6e 73 20 6f 66 20 64 61 74 61 20  columns of data 
12b90 62 75 74 20 66 6f 75 6e 64 20 25 64 22 2c 0a 20  but found %d",. 
12ba0 20 20 20 20 20 20 20 20 20 20 20 20 7a 46 69 6c              zFil
12bb0 65 2c 20 6c 69 6e 65 6e 6f 2c 20 6e 43 6f 6c 2c  e, lineno, nCol,
12bc0 20 69 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 20   i+1);.         
12bd0 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
12be0 74 28 69 6e 74 65 72 70 2c 20 7a 45 72 72 2c 20  t(interp, zErr, 
12bf0 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20  (char*)0);.     
12c00 20 20 20 20 20 66 72 65 65 28 7a 45 72 72 29 3b       free(zErr);
12c10 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
12c20 20 20 20 7a 43 6f 6d 6d 69 74 20 3d 20 22 52 4f     zCommit = "RO
12c30 4c 4c 42 41 43 4b 22 3b 0a 20 20 20 20 20 20 20  LLBACK";.       
12c40 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
12c50 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
12c60 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nCol; i++){.   
12c70 20 20 20 20 20 2f 2a 20 63 68 65 63 6b 20 66 6f       /* check fo
12c80 72 20 6e 75 6c 6c 20 64 61 74 61 2c 20 69 66 20  r null data, if 
12c90 73 6f 2c 20 62 69 6e 64 20 61 73 20 6e 75 6c 6c  so, bind as null
12ca0 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
12cb0 28 6e 4e 75 6c 6c 3e 30 20 26 26 20 73 74 72 63  (nNull>0 && strc
12cc0 6d 70 28 61 7a 43 6f 6c 5b 69 5d 2c 20 7a 4e 75  mp(azCol[i], zNu
12cd0 6c 6c 29 3d 3d 30 29 0a 20 20 20 20 20 20 20 20  ll)==0).        
12ce0 20 20 7c 7c 20 73 74 72 6c 65 6e 33 30 28 61 7a    || strlen30(az
12cf0 43 6f 6c 5b 69 5d 29 3d 3d 30 0a 20 20 20 20 20  Col[i])==0.     
12d00 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
12d10 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c  sqlite3_bind_nul
12d20 6c 28 70 53 74 6d 74 2c 20 69 2b 31 29 3b 0a 20  l(pStmt, i+1);. 
12d30 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
12d40 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
12d50 62 69 6e 64 5f 74 65 78 74 28 70 53 74 6d 74 2c  bind_text(pStmt,
12d60 20 69 2b 31 2c 20 61 7a 43 6f 6c 5b 69 5d 2c 20   i+1, azCol[i], 
12d70 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49  -1, SQLITE_STATI
12d80 43 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  C);.        }.  
12d90 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
12da0 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3b  te3_step(pStmt);
12db0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
12dc0 74 65 33 5f 72 65 73 65 74 28 70 53 74 6d 74 29  te3_reset(pStmt)
12dd0 3b 0a 20 20 20 20 20 20 66 72 65 65 28 7a 4c 69  ;.      free(zLi
12de0 6e 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ne);.      if( r
12df0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
12e00 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65          Tcl_Appe
12e10 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
12e20 22 45 72 72 6f 72 3a 20 22 2c 20 73 71 6c 69 74  "Error: ", sqlit
12e30 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64  e3_errmsg(pDb->d
12e40 62 29 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20  b), (char*)0);. 
12e50 20 20 20 20 20 20 20 7a 43 6f 6d 6d 69 74 20 3d         zCommit =
12e60 20 22 52 4f 4c 4c 42 41 43 4b 22 3b 0a 20 20 20   "ROLLBACK";.   
12e70 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
12e80 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 72    }.    }.    fr
12e90 65 65 28 61 7a 43 6f 6c 29 3b 0a 20 20 20 20 66  ee(azCol);.    f
12ea0 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 20 20 73  close(in);.    s
12eb0 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
12ec0 70 53 74 6d 74 29 3b 0a 20 20 20 20 28 76 6f 69  pStmt);.    (voi
12ed0 64 29 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70  d)sqlite3_exec(p
12ee0 44 62 2d 3e 64 62 2c 20 7a 43 6f 6d 6d 69 74 2c  Db->db, zCommit,
12ef0 20 30 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 20 20   0, 0, 0);..    
12f00 69 66 28 20 7a 43 6f 6d 6d 69 74 5b 30 5d 20 3d  if( zCommit[0] =
12f10 3d 20 27 43 27 20 29 7b 0a 20 20 20 20 20 20 2f  = 'C' ){.      /
12f20 2a 20 73 75 63 63 65 73 73 2c 20 73 65 74 20 72  * success, set r
12f30 65 73 75 6c 74 20 61 73 20 6e 75 6d 62 65 72 20  esult as number 
12f40 6f 66 20 6c 69 6e 65 73 20 70 72 6f 63 65 73 73  of lines process
12f50 65 64 20 2a 2f 0a 20 20 20 20 20 20 70 52 65 73  ed */.      pRes
12f60 75 6c 74 20 3d 20 54 63 6c 5f 47 65 74 4f 62 6a  ult = Tcl_GetObj
12f70 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a  Result(interp);.
12f80 20 20 20 20 20 20 54 63 6c 5f 53 65 74 49 6e 74        Tcl_SetInt
12f90 4f 62 6a 28 70 52 65 73 75 6c 74 2c 20 6c 69 6e  Obj(pResult, lin
12fa0 65 6e 6f 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  eno);.      rc =
12fb0 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c   TCL_OK;.    }el
12fc0 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 66 61 69  se{.      /* fai
12fd0 6c 75 72 65 2c 20 61 70 70 65 6e 64 20 6c 69 6e  lure, append lin
12fe0 65 6e 6f 20 77 68 65 72 65 20 66 61 69 6c 65 64  eno where failed
12ff0 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
13000 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
13010 66 28 7a 4c 69 6e 65 4e 75 6d 29 2c 20 7a 4c 69  f(zLineNum), zLi
13020 6e 65 4e 75 6d 2c 22 25 64 22 2c 6c 69 6e 65 6e  neNum,"%d",linen
13030 6f 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70  o);.      Tcl_Ap
13040 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
13050 70 2c 22 2c 20 66 61 69 6c 65 64 20 77 68 69 6c  p,", failed whil
13060 65 20 70 72 6f 63 65 73 73 69 6e 67 20 6c 69 6e  e processing lin
13070 65 3a 20 22 2c 7a 4c 69 6e 65 4e 75 6d 2c 0a 20  e: ",zLineNum,. 
13080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13090 20 20 20 20 20 20 28 63 68 61 72 2a 29 30 29 3b        (char*)0);
130a0 0a 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f  .      rc = TCL_
130b0 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
130c0 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
130d0 2a 0a 20 20 2a 2a 20 20 20 20 24 64 62 20 65 6e  *.  **    $db en
130e0 61 62 6c 65 5f 6c 6f 61 64 5f 65 78 74 65 6e 73  able_load_extens
130f0 69 6f 6e 20 42 4f 4f 4c 45 41 4e 0a 20 20 2a 2a  ion BOOLEAN.  **
13100 0a 20 20 2a 2a 20 54 75 72 6e 20 74 68 65 20 65  .  ** Turn the e
13110 78 74 65 6e 73 69 6f 6e 20 6c 6f 61 64 69 6e 67  xtension loading
13120 20 66 65 61 74 75 72 65 20 6f 6e 20 6f 72 20 6f   feature on or o
13130 66 66 2e 20 20 49 74 20 69 66 20 6f 66 66 20 62  ff.  It if off b
13140 79 0a 20 20 2a 2a 20 64 65 66 61 75 6c 74 2e 0a  y.  ** default..
13150 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 45    */.  case DB_E
13160 4e 41 42 4c 45 5f 4c 4f 41 44 5f 45 58 54 45 4e  NABLE_LOAD_EXTEN
13170 53 49 4f 4e 3a 20 7b 0a 23 69 66 6e 64 65 66 20  SION: {.#ifndef 
13180 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44  SQLITE_OMIT_LOAD
13190 5f 45 58 54 45 4e 53 49 4f 4e 0a 20 20 20 20 69  _EXTENSION.    i
131a0 6e 74 20 6f 6e 6f 66 66 3b 0a 20 20 20 20 69 66  nt onoff;.    if
131b0 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20  ( objc!=3 ){.   
131c0 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
131d0 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
131e0 62 6a 76 2c 20 22 42 4f 4f 4c 45 41 4e 22 29 3b  bjv, "BOOLEAN");
131f0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
13200 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
13210 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 42 6f     if( Tcl_GetBo
13220 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74  oleanFromObj(int
13230 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 6f  erp, objv[2], &o
13240 6e 6f 66 66 29 20 29 7b 0a 20 20 20 20 20 20 72  noff) ){.      r
13250 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
13260 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
13270 65 33 5f 65 6e 61 62 6c 65 5f 6c 6f 61 64 5f 65  e3_enable_load_e
13280 78 74 65 6e 73 69 6f 6e 28 70 44 62 2d 3e 64 62  xtension(pDb->db
13290 2c 20 6f 6e 6f 66 66 29 3b 0a 20 20 20 20 62 72  , onoff);.    br
132a0 65 61 6b 3b 0a 23 65 6c 73 65 0a 20 20 20 20 54  eak;.#else.    T
132b0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
132c0 69 6e 74 65 72 70 2c 20 22 65 78 74 65 6e 73 69  interp, "extensi
132d0 6f 6e 20 6c 6f 61 64 69 6e 67 20 69 73 20 74 75  on loading is tu
132e0 72 6e 65 64 20 6f 66 66 20 61 74 20 63 6f 6d 70  rned off at comp
132f0 69 6c 65 2d 74 69 6d 65 22 2c 0a 20 20 20 20 20  ile-time",.     
13300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13310 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 72  (char*)0);.    r
13320 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
13330 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f  .#endif.  }..  /
13340 2a 0a 20 20 2a 2a 20 20 20 20 24 64 62 20 65 72  *.  **    $db er
13350 72 6f 72 63 6f 64 65 0a 20 20 2a 2a 0a 20 20 2a  rorcode.  **.  *
13360 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
13370 65 72 69 63 20 65 72 72 6f 72 20 63 6f 64 65 20  eric error code 
13380 74 68 61 74 20 77 61 73 20 72 65 74 75 72 6e 65  that was returne
13390 64 20 62 79 20 74 68 65 20 6d 6f 73 74 20 72 65  d by the most re
133a0 63 65 6e 74 0a 20 20 2a 2a 20 63 61 6c 6c 20 74  cent.  ** call t
133b0 6f 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29  o sqlite3_exec()
133c0 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  ..  */.  case DB
133d0 5f 45 52 52 4f 52 43 4f 44 45 3a 20 7b 0a 20 20  _ERRORCODE: {.  
133e0 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
133f0 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
13400 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33  ewIntObj(sqlite3
13410 5f 65 72 72 63 6f 64 65 28 70 44 62 2d 3e 64 62  _errcode(pDb->db
13420 29 29 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a  )));.    break;.
13430 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20    }..  /*.  **  
13440 20 20 24 64 62 20 65 78 69 73 74 73 20 24 73 71    $db exists $sq
13450 6c 0a 20 20 2a 2a 20 20 20 20 24 64 62 20 6f 6e  l.  **    $db on
13460 65 63 6f 6c 75 6d 6e 20 24 73 71 6c 0a 20 20 2a  ecolumn $sql.  *
13470 2a 0a 20 20 2a 2a 20 54 68 65 20 6f 6e 65 63 6f  *.  ** The oneco
13480 6c 75 6d 6e 20 6d 65 74 68 6f 64 20 69 73 20 74  lumn method is t
13490 68 65 20 65 71 75 69 76 61 6c 65 6e 74 20 6f 66  he equivalent of
134a0 3a 0a 20 20 2a 2a 20 20 20 20 20 6c 69 6e 64 65  :.  **     linde
134b0 78 20 5b 24 64 62 20 65 76 61 6c 20 24 73 71 6c  x [$db eval $sql
134c0 5d 20 30 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  ] 0.  */.  case 
134d0 44 42 5f 45 58 49 53 54 53 3a 0a 20 20 63 61 73  DB_EXISTS:.  cas
134e0 65 20 44 42 5f 4f 4e 45 43 4f 4c 55 4d 4e 3a 20  e DB_ONECOLUMN: 
134f0 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  {.    Tcl_Obj *p
13500 52 65 73 75 6c 74 20 3d 20 30 3b 0a 20 20 20 20  Result = 0;.    
13510 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 20 73 45  DbEvalContext sE
13520 76 61 6c 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a  val;.    if( obj
13530 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 54 63  c!=3 ){.      Tc
13540 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
13550 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
13560 22 53 51 4c 22 29 3b 0a 20 20 20 20 20 20 72 65  "SQL");.      re
13570 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
13580 20 20 20 20 7d 0a 0a 20 20 20 20 64 62 45 76 61      }..    dbEva
13590 6c 49 6e 69 74 28 26 73 45 76 61 6c 2c 20 70 44  lInit(&sEval, pD
135a0 62 2c 20 6f 62 6a 76 5b 32 5d 2c 20 30 2c 20 30  b, objv[2], 0, 0
135b0 29 3b 0a 20 20 20 20 72 63 20 3d 20 64 62 45 76  );.    rc = dbEv
135c0 61 6c 53 74 65 70 28 26 73 45 76 61 6c 29 3b 0a  alStep(&sEval);.
135d0 20 20 20 20 69 66 28 20 63 68 6f 69 63 65 3d 3d      if( choice==
135e0 44 42 5f 4f 4e 45 43 4f 4c 55 4d 4e 20 29 7b 0a  DB_ONECOLUMN ){.
135f0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 54 43        if( rc==TC
13600 4c 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  L_OK ){.        
13610 70 52 65 73 75 6c 74 20 3d 20 64 62 45 76 61 6c  pResult = dbEval
13620 43 6f 6c 75 6d 6e 56 61 6c 75 65 28 26 73 45 76  ColumnValue(&sEv
13630 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 65  al, 0);.      }e
13640 6c 73 65 20 69 66 28 20 72 63 3d 3d 54 43 4c 5f  lse if( rc==TCL_
13650 42 52 45 41 4b 20 29 7b 0a 20 20 20 20 20 20 20  BREAK ){.       
13660 20 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74   Tcl_ResetResult
13670 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 20 20  (interp);.      
13680 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  }.    }else if( 
13690 72 63 3d 3d 54 43 4c 5f 42 52 45 41 4b 20 7c 7c  rc==TCL_BREAK ||
136a0 20 72 63 3d 3d 54 43 4c 5f 4f 4b 20 29 7b 0a 20   rc==TCL_OK ){. 
136b0 20 20 20 20 20 70 52 65 73 75 6c 74 20 3d 20 54       pResult = T
136c0 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a  cl_NewBooleanObj
136d0 28 72 63 3d 3d 54 43 4c 5f 4f 4b 29 3b 0a 20 20  (rc==TCL_OK);.  
136e0 20 20 7d 0a 20 20 20 20 64 62 45 76 61 6c 46 69    }.    dbEvalFi
136f0 6e 61 6c 69 7a 65 28 26 73 45 76 61 6c 29 3b 0a  nalize(&sEval);.
13700 20 20 20 20 69 66 28 20 70 52 65 73 75 6c 74 20      if( pResult 
13710 29 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75  ) Tcl_SetObjResu
13720 6c 74 28 69 6e 74 65 72 70 2c 20 70 52 65 73 75  lt(interp, pResu
13730 6c 74 29 3b 0a 0a 20 20 20 20 69 66 28 20 72 63  lt);..    if( rc
13740 3d 3d 54 43 4c 5f 42 52 45 41 4b 20 29 7b 0a 20  ==TCL_BREAK ){. 
13750 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 4f 4b       rc = TCL_OK
13760 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61  ;.    }.    brea
13770 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  k;.  }..  /*.  *
13780 2a 20 20 20 20 24 64 62 20 65 76 61 6c 20 3f 6f  *    $db eval ?o
13790 70 74 69 6f 6e 73 3f 20 24 73 71 6c 20 3f 61 72  ptions? $sql ?ar
137a0 72 61 79 3f 20 3f 7b 20 20 2e 2e 2e 63 6f 64 65  ray? ?{  ...code
137b0 2e 2e 2e 20 7d 3f 0a 20 20 2a 2a 0a 20 20 2a 2a  ... }?.  **.  **
137c0 20 54 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65   The SQL stateme
137d0 6e 74 20 69 6e 20 24 73 71 6c 20 69 73 20 65 76  nt in $sql is ev
137e0 61 6c 75 61 74 65 64 2e 20 20 46 6f 72 20 65 61  aluated.  For ea
137f0 63 68 20 72 6f 77 2c 20 74 68 65 20 76 61 6c 75  ch row, the valu
13800 65 73 20 61 72 65 0a 20 20 2a 2a 20 70 6c 61 63  es are.  ** plac
13810 65 64 20 69 6e 20 65 6c 65 6d 65 6e 74 73 20 6f  ed in elements o
13820 66 20 74 68 65 20 61 72 72 61 79 20 6e 61 6d 65  f the array name
13830 64 20 22 61 72 72 61 79 22 20 61 6e 64 20 2e 2e  d "array" and ..
13840 2e 63 6f 64 65 2e 2e 2e 20 69 73 20 65 78 65 63  .code... is exec
13850 75 74 65 64 2e 0a 20 20 2a 2a 20 49 66 20 22 61  uted..  ** If "a
13860 72 72 61 79 22 20 61 6e 64 20 22 63 6f 64 65 22  rray" and "code"
13870 20 61 72 65 20 6f 6d 69 74 74 65 64 2c 20 74 68   are omitted, th
13880 65 6e 20 6e 6f 20 63 61 6c 6c 62 61 63 6b 20 69  en no callback i
13890 73 20 65 76 65 72 79 20 69 6e 76 6f 6b 65 64 2e  s every invoked.
138a0 0a 20 20 2a 2a 20 49 66 20 22 61 72 72 61 79 22  .  ** If "array"
138b0 20 69 73 20 61 6e 20 65 6d 70 74 79 20 73 74 72   is an empty str
138c0 69 6e 67 2c 20 74 68 65 6e 20 74 68 65 20 76 61  ing, then the va
138d0 6c 75 65 73 20 61 72 65 20 70 6c 61 63 65 64 20  lues are placed 
138e0 69 6e 20 76 61 72 69 61 62 6c 65 73 0a 20 20 2a  in variables.  *
138f0 2a 20 74 68 61 74 20 68 61 76 65 20 74 68 65 20  * that have the 
13900 73 61 6d 65 20 6e 61 6d 65 20 61 73 20 74 68 65  same name as the
13910 20 66 69 65 6c 64 73 20 65 78 74 72 61 63 74 65   fields extracte
13920 64 20 62 79 20 74 68 65 20 71 75 65 72 79 2e 0a  d by the query..
13930 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 45    */.  case DB_E
13940 56 41 4c 3a 20 7b 0a 20 20 20 20 69 6e 74 20 65  VAL: {.    int e
13950 76 61 6c 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20  valFlags = 0;.  
13960 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f    const char *zO
13970 70 74 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 6f  pt;.    while( o
13980 62 6a 63 3e 33 20 26 26 20 28 7a 4f 70 74 20 3d  bjc>3 && (zOpt =
13990 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
139a0 62 6a 76 5b 32 5d 29 29 21 3d 30 20 26 26 20 7a  bjv[2]))!=0 && z
139b0 4f 70 74 5b 30 5d 3d 3d 27 2d 27 20 29 7b 0a 20  Opt[0]=='-' ){. 
139c0 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28       if( strcmp(
139d0 7a 4f 70 74 2c 20 22 2d 77 69 74 68 6f 75 74 6e  zOpt, "-withoutn
139e0 75 6c 6c 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20  ulls")==0 ){.   
139f0 20 20 20 20 20 65 76 61 6c 46 6c 61 67 73 20 7c       evalFlags |
13a00 3d 20 53 51 4c 49 54 45 5f 45 56 41 4c 5f 57 49  = SQLITE_EVAL_WI
13a10 54 48 4f 55 54 4e 55 4c 4c 53 3b 0a 20 20 20 20  THOUTNULLS;.    
13a20 20 20 7d 0a 20 20 20 20 20 20 65 6c 73 65 7b 0a    }.      else{.
13a30 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65          Tcl_Appe
13a40 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
13a50 20 22 75 6e 6b 6e 6f 77 6e 20 6f 70 74 69 6f 6e   "unknown option
13a60 3a 20 5c 22 22 2c 20 7a 4f 70 74 2c 20 22 5c 22  : \"", zOpt, "\"
13a70 22 2c 20 28 76 6f 69 64 2a 29 30 29 3b 0a 20 20  ", (void*)0);.  
13a80 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
13a90 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a  _ERROR;.      }.
13aa0 20 20 20 20 20 20 6f 62 6a 63 2d 2d 3b 0a 20 20        objc--;.  
13ab0 20 20 20 20 6f 62 6a 76 2b 2b 3b 0a 20 20 20 20      objv++;.    
13ac0 7d 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3c 33  }.    if( objc<3
13ad0 20 7c 7c 20 6f 62 6a 63 3e 35 20 29 7b 0a 20 20   || objc>5 ){.  
13ae0 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
13af0 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20  Args(interp, 2, 
13b00 6f 62 6a 76 2c 20 0a 20 20 20 20 20 20 20 20 20  objv, .         
13b10 20 22 3f 4f 50 54 49 4f 4e 53 3f 20 53 51 4c 20   "?OPTIONS? SQL 
13b20 3f 41 52 52 41 59 2d 4e 41 4d 45 3f 20 3f 53 43  ?ARRAY-NAME? ?SC
13b30 52 49 50 54 3f 22 29 3b 0a 20 20 20 20 20 20 72  RIPT?");.      r
13b40 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
13b50 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
13b60 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20 20 20 20 20  objc==3 ){.     
13b70 20 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 20 73   DbEvalContext s
13b80 45 76 61 6c 3b 0a 20 20 20 20 20 20 54 63 6c 5f  Eval;.      Tcl_
13b90 4f 62 6a 20 2a 70 52 65 74 20 3d 20 54 63 6c 5f  Obj *pRet = Tcl_
13ba0 4e 65 77 4f 62 6a 28 29 3b 0a 20 20 20 20 20 20  NewObj();.      
13bb0 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
13bc0 28 70 52 65 74 29 3b 0a 20 20 20 20 20 20 64 62  (pRet);.      db
13bd0 45 76 61 6c 49 6e 69 74 28 26 73 45 76 61 6c 2c  EvalInit(&sEval,
13be0 20 70 44 62 2c 20 6f 62 6a 76 5b 32 5d 2c 20 30   pDb, objv[2], 0
13bf0 2c 20 30 29 3b 0a 20 20 20 20 20 20 77 68 69 6c  , 0);.      whil
13c00 65 28 20 54 43 4c 5f 4f 4b 3d 3d 28 72 63 20 3d  e( TCL_OK==(rc =
13c10 20 64 62 45 76 61 6c 53 74 65 70 28 26 73 45 76   dbEvalStep(&sEv
13c20 61 6c 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20  al)) ){.        
13c30 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20 69  int i;.        i
13c40 6e 74 20 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 20  nt nCol;.       
13c50 20 64 62 45 76 61 6c 52 6f 77 49 6e 66 6f 28 26   dbEvalRowInfo(&
13c60 73 45 76 61 6c 2c 20 26 6e 43 6f 6c 2c 20 30 29  sEval, &nCol, 0)
13c70 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
13c80 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  0; i<nCol; i++){
13c90 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 4c  .          Tcl_L
13ca0 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
13cb0 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74  ent(interp, pRet
13cc0 2c 20 64 62 45 76 61 6c 43 6f 6c 75 6d 6e 56 61  , dbEvalColumnVa
13cd0 6c 75 65 28 26 73 45 76 61 6c 2c 20 69 29 29 3b  lue(&sEval, i));
13ce0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
13cf0 20 7d 0a 20 20 20 20 20 20 64 62 45 76 61 6c 46   }.      dbEvalF
13d00 69 6e 61 6c 69 7a 65 28 26 73 45 76 61 6c 29 3b  inalize(&sEval);
13d10 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 54  .      if( rc==T
13d20 43 4c 5f 42 52 45 41 4b 20 29 7b 0a 20 20 20 20  CL_BREAK ){.    
13d30 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65      Tcl_SetObjRe
13d40 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 52 65  sult(interp, pRe
13d50 74 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  t);.        rc =
13d60 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d   TCL_OK;.      }
13d70 0a 20 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52  .      Tcl_DecrR
13d80 65 66 43 6f 75 6e 74 28 70 52 65 74 29 3b 0a 20  efCount(pRet);. 
13d90 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
13da0 43 6c 69 65 6e 74 44 61 74 61 20 63 64 32 5b 32  ClientData cd2[2
13db0 5d 3b 0a 20 20 20 20 20 20 44 62 45 76 61 6c 43  ];.      DbEvalC
13dc0 6f 6e 74 65 78 74 20 2a 70 3b 0a 20 20 20 20 20  ontext *p;.     
13dd0 20 54 63 6c 5f 4f 62 6a 20 2a 70 41 72 72 61 79   Tcl_Obj *pArray
13de0 20 3d 20 30 3b 0a 20 20 20 20 20 20 54 63 6c 5f   = 0;.      Tcl_
13df0 4f 62 6a 20 2a 70 53 63 72 69 70 74 3b 0a 0a 20  Obj *pScript;.. 
13e00 20 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 3d 35       if( objc>=5
13e10 20 26 26 20 2a 28 63 68 61 72 20 2a 29 54 63 6c   && *(char *)Tcl
13e20 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
13e30 33 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  3]) ){.        p
13e40 41 72 72 61 79 20 3d 20 6f 62 6a 76 5b 33 5d 3b  Array = objv[3];
13e50 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
13e60 53 63 72 69 70 74 20 3d 20 6f 62 6a 76 5b 6f 62  Script = objv[ob
13e70 6a 63 2d 31 5d 3b 0a 20 20 20 20 20 20 54 63 6c  jc-1];.      Tcl
13e80 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 53  _IncrRefCount(pS
13e90 63 72 69 70 74 29 3b 0a 0a 20 20 20 20 20 20 70  cript);..      p
13ea0 20 3d 20 28 44 62 45 76 61 6c 43 6f 6e 74 65 78   = (DbEvalContex
13eb0 74 20 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28 73 69  t *)Tcl_Alloc(si
13ec0 7a 65 6f 66 28 44 62 45 76 61 6c 43 6f 6e 74 65  zeof(DbEvalConte
13ed0 78 74 29 29 3b 0a 20 20 20 20 20 20 64 62 45 76  xt));.      dbEv
13ee0 61 6c 49 6e 69 74 28 70 2c 20 70 44 62 2c 20 6f  alInit(p, pDb, o
13ef0 62 6a 76 5b 32 5d 2c 20 70 41 72 72 61 79 2c 20  bjv[2], pArray, 
13f00 65 76 61 6c 46 6c 61 67 73 29 3b 0a 0a 20 20 20  evalFlags);..   
13f10 20 20 20 63 64 32 5b 30 5d 20 3d 20 28 76 6f 69     cd2[0] = (voi
13f20 64 20 2a 29 70 3b 0a 20 20 20 20 20 20 63 64 32  d *)p;.      cd2
13f30 5b 31 5d 20 3d 20 28 76 6f 69 64 20 2a 29 70 53  [1] = (void *)pS
13f40 63 72 69 70 74 3b 0a 20 20 20 20 20 20 72 63 20  cript;.      rc 
13f50 3d 20 44 62 45 76 61 6c 4e 65 78 74 43 6d 64 28  = DbEvalNextCmd(
13f60 63 64 32 2c 20 69 6e 74 65 72 70 2c 20 54 43 4c  cd2, interp, TCL
13f70 5f 4f 4b 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _OK);.    }.    
13f80 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
13f90 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20 66 75  .  **     $db fu
13fa0 6e 63 74 69 6f 6e 20 4e 41 4d 45 20 5b 2d 61 72  nction NAME [-ar
13fb0 67 63 6f 75 6e 74 20 4e 5d 20 5b 2d 64 65 74 65  gcount N] [-dete
13fc0 72 6d 69 6e 69 73 74 69 63 5d 20 53 43 52 49 50  rministic] SCRIP
13fd0 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 72 65 61  T.  **.  ** Crea
13fe0 74 65 20 61 20 6e 65 77 20 53 51 4c 20 66 75 6e  te a new SQL fun
13ff0 63 74 69 6f 6e 20 63 61 6c 6c 65 64 20 4e 41 4d  ction called NAM
14000 45 2e 20 20 57 68 65 6e 65 76 65 72 20 74 68 61  E.  Whenever tha
14010 74 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a 20 20  t function is.  
14020 2a 2a 20 63 61 6c 6c 65 64 2c 20 69 6e 76 6f 6b  ** called, invok
14030 65 20 53 43 52 49 50 54 20 74 6f 20 65 76 61 6c  e SCRIPT to eval
14040 75 61 74 65 20 74 68 65 20 66 75 6e 63 74 69 6f  uate the functio
14050 6e 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  n..  */.  case D
14060 42 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20  B_FUNCTION: {.  
14070 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 53 51    int flags = SQ
14080 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 53  LITE_UTF8;.    S
14090 71 6c 46 75 6e 63 20 2a 70 46 75 6e 63 3b 0a 20  qlFunc *pFunc;. 
140a0 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 53 63 72     Tcl_Obj *pScr
140b0 69 70 74 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  ipt;.    char *z
140c0 4e 61 6d 65 3b 0a 20 20 20 20 69 6e 74 20 6e 41  Name;.    int nA
140d0 72 67 20 3d 20 2d 31 3b 0a 20 20 20 20 69 6e 74  rg = -1;.    int
140e0 20 69 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63   i;.    if( objc
140f0 3c 34 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  <4 ){.      Tcl_
14100 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
14110 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 4e  erp, 2, objv, "N
14120 41 4d 45 20 3f 53 57 49 54 43 48 45 53 3f 20 53  AME ?SWITCHES? S
14130 43 52 49 50 54 22 29 3b 0a 20 20 20 20 20 20 72  CRIPT");.      r
14140 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
14150 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
14160 3d 33 3b 20 69 3c 28 6f 62 6a 63 2d 31 29 3b 20  =3; i<(objc-1); 
14170 69 2b 2b 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73  i++){.      cons
14180 74 20 63 68 61 72 20 2a 7a 20 3d 20 54 63 6c 5f  t char *z = Tcl_
14190 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 69  GetString(objv[i
141a0 5d 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20  ]);.      int n 
141b0 3d 20 73 74 72 6c 65 6e 33 30 28 7a 29 3b 0a 20  = strlen30(z);. 
141c0 20 20 20 20 20 69 66 28 20 6e 3e 32 20 26 26 20       if( n>2 && 
141d0 73 74 72 6e 63 6d 70 28 7a 2c 20 22 2d 61 72 67  strncmp(z, "-arg
141e0 63 6f 75 6e 74 22 2c 6e 29 3d 3d 30 20 29 7b 0a  count",n)==0 ){.
141f0 20 20 20 20 20 20 20 20 69 66 28 20 69 3d 3d 28          if( i==(
14200 6f 62 6a 63 2d 32 29 20 29 7b 0a 20 20 20 20 20  objc-2) ){.     
14210 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
14220 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 6f  esult(interp, "o
14230 70 74 69 6f 6e 20 72 65 71 75 69 72 65 73 20 61  ption requires a
14240 6e 20 61 72 67 75 6d 65 6e 74 3a 20 22 2c 20 7a  n argument: ", z
14250 2c 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20  ,(char*)0);.    
14260 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
14270 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20  _ERROR;.        
14280 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 54 63  }.        if( Tc
14290 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
142a0 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 69 2b 31  interp, objv[i+1
142b0 5d 2c 20 26 6e 41 72 67 29 20 29 20 72 65 74 75  ], &nArg) ) retu
142c0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
142d0 20 20 20 20 20 20 69 66 28 20 6e 41 72 67 3c 30        if( nArg<0
142e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54 63   ){.          Tc
142f0 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
14300 6e 74 65 72 70 2c 20 22 6e 75 6d 62 65 72 20 6f  nterp, "number o
14310 66 20 61 72 67 75 6d 65 6e 74 73 20 6d 75 73 74  f arguments must
14320 20 62 65 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65   be non-negative
14330 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
14340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
14350 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 20  har*)0);.       
14360 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
14370 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ROR;.        }. 
14380 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20         i++;.    
14390 20 20 7d 65 6c 73 65 0a 20 20 20 20 20 20 69 66    }else.      if
143a0 28 20 6e 3e 32 20 26 26 20 73 74 72 6e 63 6d 70  ( n>2 && strncmp
143b0 28 7a 2c 20 22 2d 64 65 74 65 72 6d 69 6e 69 73  (z, "-determinis
143c0 74 69 63 22 2c 6e 29 3d 3d 30 20 29 7b 0a 20 20  tic",n)==0 ){.  
143d0 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 53        flags |= S
143e0 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53  QLITE_DETERMINIS
143f0 54 49 43 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  TIC;.      }else
14400 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70  {.        Tcl_Ap
14410 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
14420 70 2c 20 22 62 61 64 20 6f 70 74 69 6f 6e 20 5c  p, "bad option \
14430 22 22 2c 20 7a 2c 0a 20 20 20 20 20 20 20 20 20  "", z,.         
14440 20 20 20 22 5c 22 3a 20 6d 75 73 74 20 62 65 20     "\": must be 
14450 2d 61 72 67 63 6f 75 6e 74 20 6f 72 20 2d 64 65  -argcount or -de
14460 74 65 72 6d 69 6e 69 73 74 69 63 22 2c 20 28 63  terministic", (c
14470 68 61 72 2a 29 30 0a 20 20 20 20 20 20 20 20 29  har*)0.        )
14480 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
14490 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
144a0 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70    }.    }..    p
144b0 53 63 72 69 70 74 20 3d 20 6f 62 6a 76 5b 6f 62  Script = objv[ob
144c0 6a 63 2d 31 5d 3b 0a 20 20 20 20 7a 4e 61 6d 65  jc-1];.    zName
144d0 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
144e0 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c  FromObj(objv[2],
144f0 20 30 29 3b 0a 20 20 20 20 70 46 75 6e 63 20 3d   0);.    pFunc =
14500 20 66 69 6e 64 53 71 6c 46 75 6e 63 28 70 44 62   findSqlFunc(pDb
14510 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66  , zName);.    if
14520 28 20 70 46 75 6e 63 3d 3d 30 20 29 20 72 65 74  ( pFunc==0 ) ret
14530 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
14540 20 20 20 69 66 28 20 70 46 75 6e 63 2d 3e 70 53     if( pFunc->pS
14550 63 72 69 70 74 20 29 7b 0a 20 20 20 20 20 20 54  cript ){.      T
14560 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
14570 70 46 75 6e 63 2d 3e 70 53 63 72 69 70 74 29 3b  pFunc->pScript);
14580 0a 20 20 20 20 7d 0a 20 20 20 20 70 46 75 6e 63  .    }.    pFunc
14590 2d 3e 70 53 63 72 69 70 74 20 3d 20 70 53 63 72  ->pScript = pScr
145a0 69 70 74 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 63  ipt;.    Tcl_Inc
145b0 72 52 65 66 43 6f 75 6e 74 28 70 53 63 72 69 70  rRefCount(pScrip
145c0 74 29 3b 0a 20 20 20 20 70 46 75 6e 63 2d 3e 75  t);.    pFunc->u
145d0 73 65 45 76 61 6c 4f 62 6a 76 20 3d 20 73 61 66  seEvalObjv = saf
145e0 65 54 6f 55 73 65 45 76 61 6c 4f 62 6a 76 28 69  eToUseEvalObjv(i
145f0 6e 74 65 72 70 2c 20 70 53 63 72 69 70 74 29 3b  nterp, pScript);
14600 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
14610 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
14620 6e 28 70 44 62 2d 3e 64 62 2c 20 7a 4e 61 6d 65  n(pDb->db, zName
14630 2c 20 6e 41 72 67 2c 20 66 6c 61 67 73 2c 0a 20  , nArg, flags,. 
14640 20 20 20 20 20 20 20 70 46 75 6e 63 2c 20 74 63         pFunc, tc
14650 6c 53 71 6c 46 75 6e 63 2c 20 30 2c 20 30 29 3b  lSqlFunc, 0, 0);
14660 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
14670 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
14680 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  rc = TCL_ERROR;.
14690 20 20 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73        Tcl_SetRes
146a0 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61  ult(interp, (cha
146b0 72 20 2a 29 73 71 6c 69 74 65 33 5f 65 72 72 6d  r *)sqlite3_errm
146c0 73 67 28 70 44 62 2d 3e 64 62 29 2c 20 54 43 4c  sg(pDb->db), TCL
146d0 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 20 20  _VOLATILE);.    
146e0 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  }.    break;.  }
146f0 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20  ..  /*.  **     
14700 24 64 62 20 69 6e 63 72 62 6c 6f 62 20 3f 2d 72  $db incrblob ?-r
14710 65 61 64 6f 6e 6c 79 3f 20 3f 44 42 3f 20 54 41  eadonly? ?DB? TA
14720 42 4c 45 20 43 4f 4c 55 4d 4e 20 52 4f 57 49 44  BLE COLUMN ROWID
14730 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f  .  */.  case DB_
14740 49 4e 43 52 42 4c 4f 42 3a 20 7b 0a 23 69 66 64  INCRBLOB: {.#ifd
14750 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  ef SQLITE_OMIT_I
14760 4e 43 52 42 4c 4f 42 0a 20 20 20 20 54 63 6c 5f  NCRBLOB.    Tcl_
14770 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
14780 65 72 70 2c 20 22 69 6e 63 72 62 6c 6f 62 20 6e  erp, "incrblob n
14790 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20  ot available in 
147a0 74 68 69 73 20 62 75 69 6c 64 22 2c 20 28 63 68  this build", (ch
147b0 61 72 2a 29 30 29 3b 0a 20 20 20 20 72 65 74 75  ar*)0);.    retu
147c0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65  rn TCL_ERROR;.#e
147d0 6c 73 65 0a 20 20 20 20 69 6e 74 20 69 73 52 65  lse.    int isRe
147e0 61 64 6f 6e 6c 79 20 3d 20 30 3b 0a 20 20 20 20  adonly = 0;.    
147f0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20  const char *zDb 
14800 3d 20 22 6d 61 69 6e 22 3b 0a 20 20 20 20 63 6f  = "main";.    co
14810 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 6c 65  nst char *zTable
14820 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
14830 20 2a 7a 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 54   *zColumn;.    T
14840 63 6c 5f 57 69 64 65 49 6e 74 20 69 52 6f 77 3b  cl_WideInt iRow;
14850 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 66  ..    /* Check f
14860 6f 72 20 74 68 65 20 2d 72 65 61 64 6f 6e 6c 79  or the -readonly
14870 20 6f 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 69   option */.    i
14880 66 28 20 6f 62 6a 63 3e 33 20 26 26 20 73 74 72  f( objc>3 && str
14890 63 6d 70 28 54 63 6c 5f 47 65 74 53 74 72 69 6e  cmp(Tcl_GetStrin
148a0 67 28 6f 62 6a 76 5b 32 5d 29 2c 20 22 2d 72 65  g(objv[2]), "-re
148b0 61 64 6f 6e 6c 79 22 29 3d 3d 30 20 29 7b 0a 20  adonly")==0 ){. 
148c0 20 20 20 20 20 69 73 52 65 61 64 6f 6e 6c 79 20       isReadonly 
148d0 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  = 1;.    }..    
148e0 69 66 28 20 6f 62 6a 63 21 3d 28 35 2b 69 73 52  if( objc!=(5+isR
148f0 65 61 64 6f 6e 6c 79 29 20 26 26 20 6f 62 6a 63  eadonly) && objc
14900 21 3d 28 36 2b 69 73 52 65 61 64 6f 6e 6c 79 29  !=(6+isReadonly)
14910 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72   ){.      Tcl_Wr
14920 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
14930 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 2d 72  p, 2, objv, "?-r
14940 65 61 64 6f 6e 6c 79 3f 20 3f 44 42 3f 20 54 41  eadonly? ?DB? TA
14950 42 4c 45 20 43 4f 4c 55 4d 4e 20 52 4f 57 49 44  BLE COLUMN ROWID
14960 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
14970 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
14980 7d 0a 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3d  }..    if( objc=
14990 3d 28 36 2b 69 73 52 65 61 64 6f 6e 6c 79 29 20  =(6+isReadonly) 
149a0 29 7b 0a 20 20 20 20 20 20 7a 44 62 20 3d 20 54  ){.      zDb = T
149b0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
149c0 76 5b 32 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20  v[2]);.    }.   
149d0 20 7a 54 61 62 6c 65 20 3d 20 54 63 6c 5f 47 65   zTable = Tcl_Ge
149e0 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 6f 62 6a  tString(objv[obj
149f0 63 2d 33 5d 29 3b 0a 20 20 20 20 7a 43 6f 6c 75  c-3]);.    zColu
14a00 6d 6e 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  mn = Tcl_GetStri
14a10 6e 67 28 6f 62 6a 76 5b 6f 62 6a 63 2d 32 5d 29  ng(objv[objc-2])
14a20 3b 0a 20 20 20 20 72 63 20 3d 20 54 63 6c 5f 47  ;.    rc = Tcl_G
14a30 65 74 57 69 64 65 49 6e 74 46 72 6f 6d 4f 62 6a  etWideIntFromObj
14a40 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 6f 62  (interp, objv[ob
14a50 6a 63 2d 31 5d 2c 20 26 69 52 6f 77 29 3b 0a 0a  jc-1], &iRow);..
14a60 20 20 20 20 69 66 28 20 72 63 3d 3d 54 43 4c 5f      if( rc==TCL_
14a70 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
14a80 20 63 72 65 61 74 65 49 6e 63 72 62 6c 6f 62 43   createIncrblobC
14a90 68 61 6e 6e 65 6c 28 0a 20 20 20 20 20 20 20 20  hannel(.        
14aa0 20 20 69 6e 74 65 72 70 2c 20 70 44 62 2c 20 7a    interp, pDb, z
14ab0 44 62 2c 20 7a 54 61 62 6c 65 2c 20 7a 43 6f 6c  Db, zTable, zCol
14ac0 75 6d 6e 2c 20 28 73 71 6c 69 74 65 33 5f 69 6e  umn, (sqlite3_in
14ad0 74 36 34 29 69 52 6f 77 2c 20 69 73 52 65 61 64  t64)iRow, isRead
14ae0 6f 6e 6c 79 0a 20 20 20 20 20 20 29 3b 0a 20 20  only.      );.  
14af0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 62    }.#endif.    b
14b00 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a  reak;.  }..  /*.
14b10 20 20 2a 2a 20 20 20 20 20 24 64 62 20 69 6e 74    **     $db int
14b20 65 72 72 75 70 74 0a 20 20 2a 2a 0a 20 20 2a 2a  errupt.  **.  **
14b30 20 49 6e 74 65 72 72 75 70 74 20 74 68 65 20 65   Interrupt the e
14b40 78 65 63 75 74 69 6f 6e 20 6f 66 20 74 68 65 20  xecution of the 
14b50 69 6e 6e 65 72 2d 6d 6f 73 74 20 53 51 4c 20 69  inner-most SQL i
14b60 6e 74 65 72 70 72 65 74 65 72 2e 20 20 54 68 69  nterpreter.  Thi
14b70 73 0a 20 20 2a 2a 20 63 61 75 73 65 73 20 74 68  s.  ** causes th
14b80 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  e SQL statement 
14b90 74 6f 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72  to return an err
14ba0 6f 72 20 6f 66 20 53 51 4c 49 54 45 5f 49 4e 54  or of SQLITE_INT
14bb0 45 52 52 55 50 54 2e 0a 20 20 2a 2f 0a 20 20 63  ERRUPT..  */.  c
14bc0 61 73 65 20 44 42 5f 49 4e 54 45 52 52 55 50 54  ase DB_INTERRUPT
14bd0 3a 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  : {.    sqlite3_
14be0 69 6e 74 65 72 72 75 70 74 28 70 44 62 2d 3e 64  interrupt(pDb->d
14bf0 62 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20  b);.    break;. 
14c00 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20   }..  /*.  **   
14c10 20 20 24 64 62 20 6e 75 6c 6c 76 61 6c 75 65 20    $db nullvalue 
14c20 3f 53 54 52 49 4e 47 3f 0a 20 20 2a 2a 0a 20 20  ?STRING?.  **.  
14c30 2a 2a 20 43 68 61 6e 67 65 20 74 65 78 74 20 75  ** Change text u
14c40 73 65 64 20 77 68 65 6e 20 61 20 4e 55 4c 4c 20  sed when a NULL 
14c50 63 6f 6d 65 73 20 62 61 63 6b 20 66 72 6f 6d 20  comes back from 
14c60 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 49 66  the database. If
14c70 20 3f 53 54 52 49 4e 47 3f 0a 20 20 2a 2a 20 69   ?STRING?.  ** i
14c80 73 20 6e 6f 74 20 70 72 65 73 65 6e 74 2c 20 74  s not present, t
14c90 68 65 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20  hen the current 
14ca0 73 74 72 69 6e 67 20 75 73 65 64 20 66 6f 72 20  string used for 
14cb0 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64  NULL is returned
14cc0 2e 0a 20 20 2a 2a 20 49 66 20 53 54 52 49 4e 47  ..  ** If STRING
14cd0 20 69 73 20 70 72 65 73 65 6e 74 2c 20 74 68 65   is present, the
14ce0 6e 20 53 54 52 49 4e 47 20 69 73 20 72 65 74 75  n STRING is retu
14cf0 72 6e 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2f 0a  rned..  **.  */.
14d00 20 20 63 61 73 65 20 44 42 5f 4e 55 4c 4c 56 41    case DB_NULLVA
14d10 4c 55 45 3a 20 7b 0a 20 20 20 20 69 66 28 20 6f  LUE: {.    if( o
14d20 62 6a 63 21 3d 32 20 26 26 20 6f 62 6a 63 21 3d  bjc!=2 && objc!=
14d30 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57  3 ){.      Tcl_W
14d40 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
14d50 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 4e 55  rp, 2, objv, "NU
14d60 4c 4c 56 41 4c 55 45 22 29 3b 0a 20 20 20 20 20  LLVALUE");.     
14d70 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
14d80 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  R;.    }.    if(
14d90 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20 20 20 20   objc==3 ){.    
14da0 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20    int len;.     
14db0 20 63 68 61 72 20 2a 7a 4e 75 6c 6c 20 3d 20 54   char *zNull = T
14dc0 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
14dd0 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65  Obj(objv[2], &le
14de0 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44  n);.      if( pD
14df0 62 2d 3e 7a 4e 75 6c 6c 20 29 7b 0a 20 20 20 20  b->zNull ){.    
14e00 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62      Tcl_Free(pDb
14e10 2d 3e 7a 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  ->zNull);.      
14e20 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 4e 75 6c  }.      if( zNul
14e30 6c 20 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20 20  l && len>0 ){.  
14e40 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e 75 6c 6c        pDb->zNull
14e50 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65   = Tcl_Alloc( le
14e60 6e 20 2b 20 31 20 29 3b 0a 20 20 20 20 20 20 20  n + 1 );.       
14e70 20 6d 65 6d 63 70 79 28 70 44 62 2d 3e 7a 4e 75   memcpy(pDb->zNu
14e80 6c 6c 2c 20 7a 4e 75 6c 6c 2c 20 6c 65 6e 29 3b  ll, zNull, len);
14e90 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e  .        pDb->zN
14ea0 75 6c 6c 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b  ull[len] = '\0';
14eb0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
14ec0 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e 75 6c 6c        pDb->zNull
14ed0 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
14ee0 20 20 7d 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f    }.    Tcl_SetO
14ef0 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
14f00 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
14f10 6a 28 70 44 62 2d 3e 7a 4e 75 6c 6c 2c 20 2d 31  j(pDb->zNull, -1
14f20 29 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20  ));.    break;. 
14f30 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20   }..  /*.  **   
14f40 20 20 24 64 62 20 6c 61 73 74 5f 69 6e 73 65 72    $db last_inser
14f50 74 5f 72 6f 77 69 64 0a 20 20 2a 2a 0a 20 20 2a  t_rowid.  **.  *
14f60 2a 20 52 65 74 75 72 6e 20 61 6e 20 69 6e 74 65  * Return an inte
14f70 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65  ger which is the
14f80 20 52 4f 57 49 44 20 66 6f 72 20 74 68 65 20 6d   ROWID for the m
14f90 6f 73 74 20 72 65 63 65 6e 74 20 69 6e 73 65 72  ost recent inser
14fa0 74 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  t..  */.  case D
14fb0 42 5f 4c 41 53 54 5f 49 4e 53 45 52 54 5f 52 4f  B_LAST_INSERT_RO
14fc0 57 49 44 3a 20 7b 0a 20 20 20 20 54 63 6c 5f 4f  WID: {.    Tcl_O
14fd0 62 6a 20 2a 70 52 65 73 75 6c 74 3b 0a 20 20 20  bj *pResult;.   
14fe0 20 54 63 6c 5f 57 69 64 65 49 6e 74 20 72 6f 77   Tcl_WideInt row
14ff0 69 64 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63  id;.    if( objc
15000 21 3d 32 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  !=2 ){.      Tcl
15010 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
15020 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22  terp, 2, objv, "
15030 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
15040 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
15050 7d 0a 20 20 20 20 72 6f 77 69 64 20 3d 20 73 71  }.    rowid = sq
15060 6c 69 74 65 33 5f 6c 61 73 74 5f 69 6e 73 65 72  lite3_last_inser
15070 74 5f 72 6f 77 69 64 28 70 44 62 2d 3e 64 62 29  t_rowid(pDb->db)
15080 3b 0a 20 20 20 20 70 52 65 73 75 6c 74 20 3d 20  ;.    pResult = 
15090 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_GetObjResult
150a0 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 63  (interp);.    Tc
150b0 6c 5f 53 65 74 57 69 64 65 49 6e 74 4f 62 6a 28  l_SetWideIntObj(
150c0 70 52 65 73 75 6c 74 2c 20 72 6f 77 69 64 29 3b  pResult, rowid);
150d0 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
150e0 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54 68 65 20 44  .  /*.  ** The D
150f0 42 5f 4f 4e 45 43 4f 4c 55 4d 4e 20 6d 65 74 68  B_ONECOLUMN meth
15100 6f 64 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65  od is implemente
15110 64 20 74 6f 67 65 74 68 65 72 20 77 69 74 68 20  d together with 
15120 44 42 5f 45 58 49 53 54 53 2e 0a 20 20 2a 2f 0a  DB_EXISTS..  */.
15130 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 70 72 6f  .  /*    $db pro
15140 67 72 65 73 73 20 3f 4e 20 43 41 4c 4c 42 41 43  gress ?N CALLBAC
15150 4b 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 76  K?.  **.  ** Inv
15160 6f 6b 65 20 74 68 65 20 67 69 76 65 6e 20 63 61  oke the given ca
15170 6c 6c 62 61 63 6b 20 65 76 65 72 79 20 4e 20 76  llback every N v
15180 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 6f  irtual machine o
15190 70 63 6f 64 65 73 20 77 68 69 6c 65 20 65 78 65  pcodes while exe
151a0 63 75 74 69 6e 67 0a 20 20 2a 2a 20 71 75 65 72  cuting.  ** quer
151b0 69 65 73 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  ies..  */.  case
151c0 20 44 42 5f 50 52 4f 47 52 45 53 53 3a 20 7b 0a   DB_PROGRESS: {.
151d0 20 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20      if( objc==2 
151e0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62  ){.      if( pDb
151f0 2d 3e 7a 50 72 6f 67 72 65 73 73 20 29 7b 0a 20  ->zProgress ){. 
15200 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e         Tcl_Appen
15210 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
15220 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 2c 20  pDb->zProgress, 
15230 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20  (char*)0);.     
15240 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28   }.    }else if(
15250 20 6f 62 6a 63 3d 3d 34 20 29 7b 0a 20 20 20 20   objc==4 ){.    
15260 20 20 63 68 61 72 20 2a 7a 50 72 6f 67 72 65 73    char *zProgres
15270 73 3b 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e  s;.      int len
15280 3b 0a 20 20 20 20 20 20 69 6e 74 20 4e 3b 0a 20  ;.      int N;. 
15290 20 20 20 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21       if( TCL_OK!
152a0 3d 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f  =Tcl_GetIntFromO
152b0 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
152c0 32 5d 2c 20 26 4e 29 20 29 7b 0a 20 20 20 20 20  2], &N) ){.     
152d0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
152e0 52 4f 52 3b 0a 20 20 20 20 20 20 7d 3b 0a 20 20  ROR;.      };.  
152f0 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 50 72      if( pDb->zPr
15300 6f 67 72 65 73 73 20 29 7b 0a 20 20 20 20 20 20  ogress ){.      
15310 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e    Tcl_Free(pDb->
15320 7a 50 72 6f 67 72 65 73 73 29 3b 0a 20 20 20 20  zProgress);.    
15330 20 20 7d 0a 20 20 20 20 20 20 7a 50 72 6f 67 72    }.      zProgr
15340 65 73 73 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  ess = Tcl_GetStr
15350 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
15360 33 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20  3], &len);.     
15370 20 69 66 28 20 7a 50 72 6f 67 72 65 73 73 20 26   if( zProgress &
15380 26 20 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20  & len>0 ){.     
15390 20 20 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73     pDb->zProgres
153a0 73 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c  s = Tcl_Alloc( l
153b0 65 6e 20 2b 20 31 20 29 3b 0a 20 20 20 20 20 20  en + 1 );.      
153c0 20 20 6d 65 6d 63 70 79 28 70 44 62 2d 3e 7a 50    memcpy(pDb->zP
153d0 72 6f 67 72 65 73 73 2c 20 7a 50 72 6f 67 72 65  rogress, zProgre
153e0 73 73 2c 20 6c 65 6e 2b 31 29 3b 0a 20 20 20 20  ss, len+1);.    
153f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
15400 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 20   pDb->zProgress 
15410 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66  = 0;.      }.#if
15420 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
15430 5f 50 52 4f 47 52 45 53 53 5f 43 41 4c 4c 42 41  _PROGRESS_CALLBA
15440 43 4b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62  CK.      if( pDb
15450 2d 3e 7a 50 72 6f 67 72 65 73 73 20 29 7b 0a 20  ->zProgress ){. 
15460 20 20 20 20 20 20 20 70 44 62 2d 3e 69 6e 74 65         pDb->inte
15470 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20  rp = interp;.   
15480 20 20 20 20 20 73 71 6c 69 74 65 33 5f 70 72 6f       sqlite3_pro
15490 67 72 65 73 73 5f 68 61 6e 64 6c 65 72 28 70 44  gress_handler(pD
154a0 62 2d 3e 64 62 2c 20 4e 2c 20 44 62 50 72 6f 67  b->db, N, DbProg
154b0 72 65 73 73 48 61 6e 64 6c 65 72 2c 20 70 44 62  ressHandler, pDb
154c0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
154d0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
154e0 70 72 6f 67 72 65 73 73 5f 68 61 6e 64 6c 65 72  progress_handler
154f0 28 70 44 62 2d 3e 64 62 2c 20 30 2c 20 30 2c 20  (pDb->db, 0, 0, 
15500 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  0);.      }.#end
15510 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  if.    }else{.  
15520 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
15530 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20  Args(interp, 2, 
15540 6f 62 6a 76 2c 20 22 4e 20 43 41 4c 4c 42 41 43  objv, "N CALLBAC
15550 4b 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  K");.      retur
15560 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
15570 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20   }.    break;.  
15580 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 70  }..  /*    $db p
15590 72 6f 66 69 6c 65 20 3f 43 41 4c 4c 42 41 43 4b  rofile ?CALLBACK
155a0 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 61 6b 65  ?.  **.  ** Make
155b0 20 61 72 72 61 6e 67 65 6d 65 6e 74 73 20 74 6f   arrangements to
155c0 20 69 6e 76 6f 6b 65 20 74 68 65 20 43 41 4c 4c   invoke the CALL
155d0 42 41 43 4b 20 72 6f 75 74 69 6e 65 20 61 66 74  BACK routine aft
155e0 65 72 20 65 61 63 68 20 53 51 4c 20 73 74 61 74  er each SQL stat
155f0 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 68 61 74 20  ement.  ** that 
15600 68 61 73 20 72 75 6e 2e 20 20 54 68 65 20 74 65  has run.  The te
15610 78 74 20 6f 66 20 74 68 65 20 53 51 4c 20 61 6e  xt of the SQL an
15620 64 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20  d the amount of 
15630 65 6c 61 70 73 65 20 74 69 6d 65 20 61 72 65 0a  elapse time are.
15640 20 20 2a 2a 20 61 70 70 65 6e 64 65 64 20 74 6f    ** appended to
15650 20 43 41 4c 4c 42 41 43 4b 20 62 65 66 6f 72 65   CALLBACK before
15660 20 74 68 65 20 73 63 72 69 70 74 20 69 73 20 72   the script is r
15670 75 6e 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  un..  */.  case 
15680 44 42 5f 50 52 4f 46 49 4c 45 3a 20 7b 0a 20 20  DB_PROFILE: {.  
15690 20 20 69 66 28 20 6f 62 6a 63 3e 33 20 29 7b 0a    if( objc>3 ){.
156a0 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
156b0 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
156c0 2c 20 6f 62 6a 76 2c 20 22 3f 43 41 4c 4c 42 41  , objv, "?CALLBA
156d0 43 4b 3f 22 29 3b 0a 20 20 20 20 20 20 72 65 74  CK?");.      ret
156e0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
156f0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a     }else if( obj
15700 63 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 69 66  c==2 ){.      if
15710 28 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 20  ( pDb->zProfile 
15720 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41  ){.        Tcl_A
15730 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
15740 72 70 2c 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c  rp, pDb->zProfil
15750 65 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  e, (char*)0);.  
15760 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
15770 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 50 72  .      char *zPr
15780 6f 66 69 6c 65 3b 0a 20 20 20 20 20 20 69 6e 74  ofile;.      int
15790 20 6c 65 6e 3b 0a 20 20 20 20 20 20 69 66 28 20   len;.      if( 
157a0 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 20 29 7b  pDb->zProfile ){
157b0 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 46 72 65  .        Tcl_Fre
157c0 65 28 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 29  e(pDb->zProfile)
157d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
157e0 7a 50 72 6f 66 69 6c 65 20 3d 20 54 63 6c 5f 47  zProfile = Tcl_G
157f0 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
15800 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a  objv[2], &len);.
15810 20 20 20 20 20 20 69 66 28 20 7a 50 72 6f 66 69        if( zProfi
15820 6c 65 20 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20  le && len>0 ){. 
15830 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 50 72 6f         pDb->zPro
15840 66 69 6c 65 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63  file = Tcl_Alloc
15850 28 20 6c 65 6e 20 2b 20 31 20 29 3b 0a 20 20 20  ( len + 1 );.   
15860 20 20 20 20 20 6d 65 6d 63 70 79 28 70 44 62 2d       memcpy(pDb-
15870 3e 7a 50 72 6f 66 69 6c 65 2c 20 7a 50 72 6f 66  >zProfile, zProf
15880 69 6c 65 2c 20 6c 65 6e 2b 31 29 3b 0a 20 20 20  ile, len+1);.   
15890 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
158a0 20 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 20    pDb->zProfile 
158b0 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66  = 0;.      }.#if
158c0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
158d0 5f 4f 4d 49 54 5f 54 52 41 43 45 29 20 26 26 20  _OMIT_TRACE) && 
158e0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
158f0 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f  OMIT_FLOATING_PO
15900 49 4e 54 29 20 26 26 20 5c 0a 20 20 20 20 21 64  INT) && \.    !d
15910 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
15920 49 54 5f 44 45 50 52 45 43 41 54 45 44 29 0a 20  IT_DEPRECATED). 
15930 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 50       if( pDb->zP
15940 72 6f 66 69 6c 65 20 29 7b 0a 20 20 20 20 20 20  rofile ){.      
15950 20 20 70 44 62 2d 3e 69 6e 74 65 72 70 20 3d 20    pDb->interp = 
15960 69 6e 74 65 72 70 3b 0a 20 20 20 20 20 20 20 20  interp;.        
15970 73 71 6c 69 74 65 33 5f 70 72 6f 66 69 6c 65 28  sqlite3_profile(
15980 70 44 62 2d 3e 64 62 2c 20 44 62 50 72 6f 66 69  pDb->db, DbProfi
15990 6c 65 48 61 6e 64 6c 65 72 2c 20 70 44 62 29 3b  leHandler, pDb);
159a0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
159b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 70 72        sqlite3_pr
159c0 6f 66 69 6c 65 28 70 44 62 2d 3e 64 62 2c 20 30  ofile(pDb->db, 0
159d0 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65  , 0);.      }.#e
159e0 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 62  ndif.    }.    b
159f0 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a  reak;.  }..  /*.
15a00 20 20 2a 2a 20 20 20 20 20 24 64 62 20 72 65 6b    **     $db rek
15a10 65 79 20 4b 45 59 0a 20 20 2a 2a 0a 20 20 2a 2a  ey KEY.  **.  **
15a20 20 43 68 61 6e 67 65 20 74 68 65 20 65 6e 63 72   Change the encr
15a30 79 70 74 69 6f 6e 20 6b 65 79 20 6f 6e 20 74 68  yption key on th
15a40 65 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e  e currently open
15a50 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a   database..  */.
15a60 20 20 63 61 73 65 20 44 42 5f 52 45 4b 45 59 3a    case DB_REKEY:
15a70 20 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53   {.#if defined(S
15a80 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 29  QLITE_HAS_CODEC)
15a90 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
15aa0 49 54 45 5f 4f 4d 49 54 5f 43 4f 44 45 43 5f 46  ITE_OMIT_CODEC_F
15ab0 52 4f 4d 5f 54 43 4c 29 0a 20 20 20 20 69 6e 74  ROM_TCL).    int
15ac0 20 6e 4b 65 79 3b 0a 20 20 20 20 76 6f 69 64 20   nKey;.    void 
15ad0 2a 70 4b 65 79 3b 0a 23 65 6e 64 69 66 0a 20 20  *pKey;.#endif.  
15ae0 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b    if( objc!=3 ){
15af0 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  .      Tcl_Wrong
15b00 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
15b10 32 2c 20 6f 62 6a 76 2c 20 22 4b 45 59 22 29 3b  2, objv, "KEY");
15b20 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
15b30 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 23  L_ERROR;.    }.#
15b40 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
15b50 45 5f 48 41 53 5f 43 4f 44 45 43 29 20 26 26 20  E_HAS_CODEC) && 
15b60 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
15b70 4f 4d 49 54 5f 43 4f 44 45 43 5f 46 52 4f 4d 5f  OMIT_CODEC_FROM_
15b80 54 43 4c 29 0a 20 20 20 20 70 4b 65 79 20 3d 20  TCL).    pKey = 
15b90 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79  Tcl_GetByteArray
15ba0 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c  FromObj(objv[2],
15bb0 20 26 6e 4b 65 79 29 3b 0a 20 20 20 20 72 63 20   &nKey);.    rc 
15bc0 3d 20 73 71 6c 69 74 65 33 5f 72 65 6b 65 79 28  = sqlite3_rekey(
15bd0 70 44 62 2d 3e 64 62 2c 20 70 4b 65 79 2c 20 6e  pDb->db, pKey, n
15be0 4b 65 79 29 3b 0a 20 20 20 20 69 66 28 20 72 63  Key);.    if( rc
15bf0 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70   ){.      Tcl_Ap
15c00 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
15c10 70 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 73 74  p, sqlite3_errst
15c20 72 28 72 63 29 2c 20 28 63 68 61 72 2a 29 30 29  r(rc), (char*)0)
15c30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c  ;.      rc = TCL
15c40 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 23 65  _ERROR;.    }.#e
15c50 6e 64 69 66 0a 20 20 20 20 62 72 65 61 6b 3b 0a  ndif.    break;.
15c60 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62    }..  /*    $db
15c70 20 72 65 73 74 6f 72 65 20 3f 44 41 54 41 42 41   restore ?DATABA
15c80 53 45 3f 20 46 49 4c 45 4e 41 4d 45 0a 20 20 2a  SE? FILENAME.  *
15c90 2a 0a 20 20 2a 2a 20 4f 70 65 6e 20 61 20 64 61  *.  ** Open a da
15ca0 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65  tabase file name
15cb0 64 20 46 49 4c 45 4e 41 4d 45 2e 20 20 54 72 61  d FILENAME.  Tra
15cc0 6e 73 66 65 72 20 74 68 65 20 63 6f 6e 74 65 6e  nsfer the conten
15cd0 74 0a 20 20 2a 2a 20 6f 66 20 46 49 4c 45 4e 41  t.  ** of FILENA
15ce0 4d 45 20 69 6e 74 6f 20 74 68 65 20 6c 6f 63 61  ME into the loca
15cf0 6c 20 64 61 74 61 62 61 73 65 20 44 41 54 41 42  l database DATAB
15d00 41 53 45 20 28 64 65 66 61 75 6c 74 3a 20 22 6d  ASE (default: "m
15d10 61 69 6e 22 29 2e 0a 20 20 2a 2f 0a 20 20 63 61  ain")..  */.  ca
15d20 73 65 20 44 42 5f 52 45 53 54 4f 52 45 3a 20 7b  se DB_RESTORE: {
15d30 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
15d40 2a 7a 53 72 63 46 69 6c 65 3b 0a 20 20 20 20 63  *zSrcFile;.    c
15d50 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 65 73 74  onst char *zDest
15d60 44 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 20  Db;.    sqlite3 
15d70 2a 70 53 72 63 3b 0a 20 20 20 20 73 71 6c 69 74  *pSrc;.    sqlit
15d80 65 33 5f 62 61 63 6b 75 70 20 2a 70 42 61 63 6b  e3_backup *pBack
15d90 75 70 3b 0a 20 20 20 20 69 6e 74 20 6e 54 69 6d  up;.    int nTim
15da0 65 6f 75 74 20 3d 20 30 3b 0a 0a 20 20 20 20 69  eout = 0;..    i
15db0 66 28 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20 20  f( objc==3 ){.  
15dc0 20 20 20 20 7a 44 65 73 74 44 62 20 3d 20 22 6d      zDestDb = "m
15dd0 61 69 6e 22 3b 0a 20 20 20 20 20 20 7a 53 72 63  ain";.      zSrc
15de0 46 69 6c 65 20 3d 20 54 63 6c 5f 47 65 74 53 74  File = Tcl_GetSt
15df0 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20  ring(objv[2]);. 
15e00 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a     }else if( obj
15e10 63 3d 3d 34 20 29 7b 0a 20 20 20 20 20 20 7a 44  c==4 ){.      zD
15e20 65 73 74 44 62 20 3d 20 54 63 6c 5f 47 65 74 53  estDb = Tcl_GetS
15e30 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a  tring(objv[2]);.
15e40 20 20 20 20 20 20 7a 53 72 63 46 69 6c 65 20 3d        zSrcFile =
15e50 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
15e60 62 6a 76 5b 33 5d 29 3b 0a 20 20 20 20 7d 65 6c  bjv[3]);.    }el
15e70 73 65 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72  se{.      Tcl_Wr
15e80 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
15e90 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 44 41  p, 2, objv, "?DA
15ea0 54 41 42 41 53 45 3f 20 46 49 4c 45 4e 41 4d 45  TABASE? FILENAME
15eb0 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
15ec0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
15ed0 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  }.    rc = sqlit
15ee0 65 33 5f 6f 70 65 6e 5f 76 32 28 7a 53 72 63 46  e3_open_v2(zSrcF
15ef0 69 6c 65 2c 20 26 70 53 72 63 2c 0a 20 20 20 20  ile, &pSrc,.    
15f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15f10 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
15f20 5f 52 45 41 44 4f 4e 4c 59 20 7c 20 70 44 62 2d  _READONLY | pDb-
15f30 3e 6f 70 65 6e 46 6c 61 67 73 2c 20 30 29 3b 0a  >openFlags, 0);.
15f40 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
15f50 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 54  TE_OK ){.      T
15f60 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
15f70 69 6e 74 65 72 70 2c 20 22 63 61 6e 6e 6f 74 20  interp, "cannot 
15f80 6f 70 65 6e 20 73 6f 75 72 63 65 20 64 61 74 61  open source data
15f90 62 61 73 65 3a 20 22 2c 0a 20 20 20 20 20 20 20  base: ",.       
15fa0 20 20 20 20 73 71 6c 69 74 65 33 5f 65 72 72 6d      sqlite3_errm
15fb0 73 67 28 70 53 72 63 29 2c 20 28 63 68 61 72 2a  sg(pSrc), (char*
15fc0 29 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  )0);.      sqlit
15fd0 65 33 5f 63 6c 6f 73 65 28 70 53 72 63 29 3b 0a  e3_close(pSrc);.
15fe0 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
15ff0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
16000 20 20 70 42 61 63 6b 75 70 20 3d 20 73 71 6c 69    pBackup = sqli
16010 74 65 33 5f 62 61 63 6b 75 70 5f 69 6e 69 74 28  te3_backup_init(
16020 70 44 62 2d 3e 64 62 2c 20 7a 44 65 73 74 44 62  pDb->db, zDestDb
16030 2c 20 70 53 72 63 2c 20 22 6d 61 69 6e 22 29 3b  , pSrc, "main");
16040 0a 20 20 20 20 69 66 28 20 70 42 61 63 6b 75 70  .    if( pBackup
16050 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  ==0 ){.      Tcl
16060 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
16070 74 65 72 70 2c 20 22 72 65 73 74 6f 72 65 20 66  terp, "restore f
16080 61 69 6c 65 64 3a 20 22 2c 0a 20 20 20 20 20 20  ailed: ",.      
16090 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65 72 72       sqlite3_err
160a0 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c 20 28 63  msg(pDb->db), (c
160b0 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 73  har*)0);.      s
160c0 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70 53 72  qlite3_close(pSr
160d0 63 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  c);.      return
160e0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
160f0 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 28 72 63  }.    while( (rc
16100 20 3d 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75   = sqlite3_backu
16110 70 5f 73 74 65 70 28 70 42 61 63 6b 75 70 2c 31  p_step(pBackup,1
16120 30 30 29 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a  00))==SQLITE_OK.
16130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c                ||
16140 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59   rc==SQLITE_BUSY
16150 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 72 63   ){.      if( rc
16160 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b  ==SQLITE_BUSY ){
16170 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 54 69  .        if( nTi
16180 6d 65 6f 75 74 2b 2b 20 3e 3d 20 33 20 29 20 62  meout++ >= 3 ) b
16190 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 73 71  reak;.        sq
161a0 6c 69 74 65 33 5f 73 6c 65 65 70 28 31 30 30 29  lite3_sleep(100)
161b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
161c0 20 20 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b      sqlite3_back
161d0 75 70 5f 66 69 6e 69 73 68 28 70 42 61 63 6b 75  up_finish(pBacku
161e0 70 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  p);.    if( rc==
161f0 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20  SQLITE_DONE ){. 
16200 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 4f 4b       rc = TCL_OK
16210 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
16220 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc==SQLITE_BUSY 
16230 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4c 4f  || rc==SQLITE_LO
16240 43 4b 45 44 20 29 7b 0a 20 20 20 20 20 20 54 63  CKED ){.      Tc
16250 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
16260 6e 74 65 72 70 2c 20 22 72 65 73 74 6f 72 65 20  nterp, "restore 
16270 66 61 69 6c 65 64 3a 20 73 6f 75 72 63 65 20 64  failed: source d
16280 61 74 61 62 61 73 65 20 62 75 73 79 22 2c 0a 20  atabase busy",. 
16290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
162a0 20 20 20 20 20 20 28 63 68 61 72 2a 29 30 29 3b        (char*)0);
162b0 0a 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f  .      rc = TCL_
162c0 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73 65  ERROR;.    }else
162d0 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65  {.      Tcl_Appe
162e0 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
162f0 20 22 72 65 73 74 6f 72 65 20 66 61 69 6c 65 64   "restore failed
16300 3a 20 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  : ",.           
16310 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70  sqlite3_errmsg(p
16320 44 62 2d 3e 64 62 29 2c 20 28 63 68 61 72 2a 29  Db->db), (char*)
16330 30 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 54  0);.      rc = T
16340 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
16350 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73      sqlite3_clos
16360 65 28 70 53 72 63 29 3b 0a 20 20 20 20 62 72 65  e(pSrc);.    bre
16370 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  ak;.  }..  /*.  
16380 2a 2a 20 20 20 20 20 24 64 62 20 73 74 61 74 75  **     $db statu
16390 73 20 28 73 74 65 70 7c 73 6f 72 74 7c 61 75 74  s (step|sort|aut
163a0 6f 69 6e 64 65 78 7c 76 6d 73 74 65 70 29 0a 20  oindex|vmstep). 
163b0 20 2a 2a 0a 20 20 2a 2a 20 44 69 73 70 6c 61 79   **.  ** Display
163c0 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54   SQLITE_STMTSTAT
163d0 55 53 5f 46 55 4c 4c 53 43 41 4e 5f 53 54 45 50  US_FULLSCAN_STEP
163e0 20 6f 72 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f   or.  ** SQLITE_
163f0 53 54 4d 54 53 54 41 54 55 53 5f 53 4f 52 54 20  STMTSTATUS_SORT 
16400 66 6f 72 20 74 68 65 20 6d 6f 73 74 20 72 65 63  for the most rec
16410 65 6e 74 20 65 76 61 6c 2e 0a 20 20 2a 2f 0a 20  ent eval..  */. 
16420 20 63 61 73 65 20 44 42 5f 53 54 41 54 55 53 3a   case DB_STATUS:
16430 20 7b 0a 20 20 20 20 69 6e 74 20 76 3b 0a 20 20   {.    int v;.  
16440 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f    const char *zO
16450 70 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21  p;.    if( objc!
16460 3d 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  =3 ){.      Tcl_
16470 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
16480 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 28  erp, 2, objv, "(
16490 73 74 65 70 7c 73 6f 72 74 7c 61 75 74 6f 69 6e  step|sort|autoin
164a0 64 65 78 29 22 29 3b 0a 20 20 20 20 20 20 72 65  dex)");.      re
164b0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
164c0 20 20 20 20 7d 0a 20 20 20 20 7a 4f 70 20 3d 20      }.    zOp = 
164d0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
164e0 6a 76 5b 32 5d 29 3b 0a 20 20 20 20 69 66 28 20  jv[2]);.    if( 
164f0 73 74 72 63 6d 70 28 7a 4f 70 2c 20 22 73 74 65  strcmp(zOp, "ste
16500 70 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  p")==0 ){.      
16510 76 20 3d 20 70 44 62 2d 3e 6e 53 74 65 70 3b 0a  v = pDb->nStep;.
16520 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
16530 72 63 6d 70 28 7a 4f 70 2c 20 22 73 6f 72 74 22  rcmp(zOp, "sort"
16540 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 76 20  )==0 ){.      v 
16550 3d 20 70 44 62 2d 3e 6e 53 6f 72 74 3b 0a 20 20  = pDb->nSort;.  
16560 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
16570 6d 70 28 7a 4f 70 2c 20 22 61 75 74 6f 69 6e 64  mp(zOp, "autoind
16580 65 78 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ex")==0 ){.     
16590 20 76 20 3d 20 70 44 62 2d 3e 6e 49 6e 64 65 78   v = pDb->nIndex
165a0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
165b0 73 74 72 63 6d 70 28 7a 4f 70 2c 20 22 76 6d 73  strcmp(zOp, "vms
165c0 74 65 70 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  tep")==0 ){.    
165d0 20 20 76 20 3d 20 70 44 62 2d 3e 6e 56 4d 53 74    v = pDb->nVMSt
165e0 65 70 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ep;.    }else{. 
165f0 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
16600 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 0a 20 20  esult(interp,.  
16610 20 20 20 20 20 20 20 20 20 20 22 62 61 64 20 61            "bad a
16620 72 67 75 6d 65 6e 74 3a 20 73 68 6f 75 6c 64 20  rgument: should 
16630 62 65 20 61 75 74 6f 69 6e 64 65 78 2c 20 73 74  be autoindex, st
16640 65 70 2c 20 73 6f 72 74 20 6f 72 20 76 6d 73 74  ep, sort or vmst
16650 65 70 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ep",.           
16660 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20   (char*)0);.    
16670 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
16680 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63  OR;.    }.    Tc
16690 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
166a0 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e  nterp, Tcl_NewIn
166b0 74 4f 62 6a 28 76 29 29 3b 0a 20 20 20 20 62 72  tObj(v));.    br
166c0 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  eak;.  }..  /*. 
166d0 20 2a 2a 20 20 20 20 20 24 64 62 20 74 69 6d 65   **     $db time
166e0 6f 75 74 20 4d 49 4c 4c 45 53 45 43 4f 4e 44 53  out MILLESECONDS
166f0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 44 65 6c 61 79  .  **.  ** Delay
16700 20 66 6f 72 20 74 68 65 20 6e 75 6d 62 65 72 20   for the number 
16710 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20  of milliseconds 
16720 73 70 65 63 69 66 69 65 64 20 77 68 65 6e 20 61  specified when a
16730 20 66 69 6c 65 20 69 73 20 6c 6f 63 6b 65 64 2e   file is locked.
16740 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f  .  */.  case DB_
16750 54 49 4d 45 4f 55 54 3a 20 7b 0a 20 20 20 20 69  TIMEOUT: {.    i
16760 6e 74 20 6d 73 3b 0a 20 20 20 20 69 66 28 20 6f  nt ms;.    if( o
16770 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20  bjc!=3 ){.      
16780 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
16790 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76  (interp, 2, objv
167a0 2c 20 22 4d 49 4c 4c 49 53 45 43 4f 4e 44 53 22  , "MILLISECONDS"
167b0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
167c0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
167d0 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74  .    if( Tcl_Get
167e0 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
167f0 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 6d 73 29  p, objv[2], &ms)
16800 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
16810 52 4f 52 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ROR;.    sqlite3
16820 5f 62 75 73 79 5f 74 69 6d 65 6f 75 74 28 70 44  _busy_timeout(pD
16830 62 2d 3e 64 62 2c 20 6d 73 29 3b 0a 20 20 20 20  b->db, ms);.    
16840 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
16850 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20 74 6f  .  **     $db to
16860 74 61 6c 5f 63 68 61 6e 67 65 73 0a 20 20 2a 2a  tal_changes.  **
16870 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  .  ** Return the
16880 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
16890 74 68 61 74 20 77 65 72 65 20 6d 6f 64 69 66 69  that were modifi
168a0 65 64 2c 20 69 6e 73 65 72 74 65 64 2c 20 6f 72  ed, inserted, or
168b0 20 64 65 6c 65 74 65 64 0a 20 20 2a 2a 20 73 69   deleted.  ** si
168c0 6e 63 65 20 74 68 65 20 64 61 74 61 62 61 73 65  nce the database
168d0 20 68 61 6e 64 6c 65 20 77 61 73 20 63 72 65 61   handle was crea
168e0 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  ted..  */.  case
168f0 20 44 42 5f 54 4f 54 41 4c 5f 43 48 41 4e 47 45   DB_TOTAL_CHANGE
16900 53 3a 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  S: {.    Tcl_Obj
16910 20 2a 70 52 65 73 75 6c 74 3b 0a 20 20 20 20 69   *pResult;.    i
16920 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20  f( objc!=2 ){.  
16930 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
16940 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20  Args(interp, 2, 
16950 6f 62 6a 76 2c 20 22 22 29 3b 0a 20 20 20 20 20  objv, "");.     
16960 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
16970 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 52 65  R;.    }.    pRe
16980 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65 74 4f 62  sult = Tcl_GetOb
16990 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b  jResult(interp);
169a0 0a 20 20 20 20 54 63 6c 5f 53 65 74 49 6e 74 4f  .    Tcl_SetIntO
169b0 62 6a 28 70 52 65 73 75 6c 74 2c 20 73 71 6c 69  bj(pResult, sqli
169c0 74 65 33 5f 74 6f 74 61 6c 5f 63 68 61 6e 67 65  te3_total_change
169d0 73 28 70 44 62 2d 3e 64 62 29 29 3b 0a 20 20 20  s(pDb->db));.   
169e0 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
169f0 2a 20 20 20 20 24 64 62 20 74 72 61 63 65 20 3f  *    $db trace ?
16a00 43 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a 0a 20  CALLBACK?.  **. 
16a10 20 2a 2a 20 4d 61 6b 65 20 61 72 72 61 6e 67 65   ** Make arrange
16a20 6d 65 6e 74 73 20 74 6f 20 69 6e 76 6f 6b 65 20  ments to invoke 
16a30 74 68 65 20 43 41 4c 4c 42 41 43 4b 20 72 6f 75  the CALLBACK rou
16a40 74 69 6e 65 20 66 6f 72 20 65 61 63 68 20 53 51  tine for each SQ
16a50 4c 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a  L statement.  **
16a60 20 74 68 61 74 20 69 73 20 65 78 65 63 75 74 65   that is execute
16a70 64 2e 20 20 54 68 65 20 74 65 78 74 20 6f 66 20  d.  The text of 
16a80 74 68 65 20 53 51 4c 20 69 73 20 61 70 70 65 6e  the SQL is appen
16a90 64 65 64 20 74 6f 20 43 41 4c 4c 42 41 43 4b 20  ded to CALLBACK 
16aa0 62 65 66 6f 72 65 0a 20 20 2a 2a 20 69 74 20 69  before.  ** it i
16ab0 73 20 65 78 65 63 75 74 65 64 2e 0a 20 20 2a 2f  s executed..  */
16ac0 0a 20 20 63 61 73 65 20 44 42 5f 54 52 41 43 45  .  case DB_TRACE
16ad0 3a 20 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63  : {.    if( objc
16ae0 3e 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  >3 ){.      Tcl_
16af0 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
16b00 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f  erp, 2, objv, "?
16b10 43 41 4c 4c 42 41 43 4b 3f 22 29 3b 0a 20 20 20  CALLBACK?");.   
16b20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
16b30 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  ROR;.    }else i
16b40 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20  f( objc==2 ){.  
16b50 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 54 72      if( pDb->zTr
16b60 61 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20 54  ace ){.        T
16b70 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
16b80 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a 54 72  interp, pDb->zTr
16b90 61 63 65 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  ace, (char*)0);.
16ba0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
16bb0 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  e{.      char *z
16bc0 54 72 61 63 65 3b 0a 20 20 20 20 20 20 69 6e 74  Trace;.      int
16bd0 20 6c 65 6e 3b 0a 20 20 20 20 20 20 69 66 28 20   len;.      if( 
16be0 70 44 62 2d 3e 7a 54 72 61 63 65 20 29 7b 0a 20  pDb->zTrace ){. 
16bf0 20 20 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28         Tcl_Free(
16c00 70 44 62 2d 3e 7a 54 72 61 63 65 29 3b 0a 20 20  pDb->zTrace);.  
16c10 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 54 72 61      }.      zTra
16c20 63 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  ce = Tcl_GetStri
16c30 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32  ngFromObj(objv[2
16c40 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20  ], &len);.      
16c50 69 66 28 20 7a 54 72 61 63 65 20 26 26 20 6c 65  if( zTrace && le
16c60 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  n>0 ){.        p
16c70 44 62 2d 3e 7a 54 72 61 63 65 20 3d 20 54 63 6c  Db->zTrace = Tcl
16c80 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20 31 20  _Alloc( len + 1 
16c90 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  );.        memcp
16ca0 79 28 70 44 62 2d 3e 7a 54 72 61 63 65 2c 20 7a  y(pDb->zTrace, z
16cb0 54 72 61 63 65 2c 20 6c 65 6e 2b 31 29 3b 0a 20  Trace, len+1);. 
16cc0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
16cd0 20 20 20 20 70 44 62 2d 3e 7a 54 72 61 63 65 20      pDb->zTrace 
16ce0 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66  = 0;.      }.#if
16cf0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
16d00 5f 4f 4d 49 54 5f 54 52 41 43 45 29 20 26 26 20  _OMIT_TRACE) && 
16d10 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
16d20 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f  OMIT_FLOATING_PO
16d30 49 4e 54 29 20 26 26 20 5c 0a 20 20 20 20 21 64  INT) && \.    !d
16d40 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
16d50 49 54 5f 44 45 50 52 45 43 41 54 45 44 29 0a 20  IT_DEPRECATED). 
16d60 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 54       if( pDb->zT
16d70 72 61 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20  race ){.        
16d80 70 44 62 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e  pDb->interp = in
16d90 74 65 72 70 3b 0a 20 20 20 20 20 20 20 20 73 71  terp;.        sq
16da0 6c 69 74 65 33 5f 74 72 61 63 65 28 70 44 62 2d  lite3_trace(pDb-
16db0 3e 64 62 2c 20 44 62 54 72 61 63 65 48 61 6e 64  >db, DbTraceHand
16dc0 6c 65 72 2c 20 70 44 62 29 3b 0a 20 20 20 20 20  ler, pDb);.     
16dd0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
16de0 73 71 6c 69 74 65 33 5f 74 72 61 63 65 28 70 44  sqlite3_trace(pD
16df0 62 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20  b->db, 0, 0);.  
16e00 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
16e10 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20   }.    break;.  
16e20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 74  }..  /*    $db t
16e30 72 61 63 65 5f 76 32 20 3f 43 41 4c 4c 42 41 43  race_v2 ?CALLBAC
16e40 4b 3f 20 3f 4d 41 53 4b 3f 0a 20 20 2a 2a 0a 20  K? ?MASK?.  **. 
16e50 20 2a 2a 20 4d 61 6b 65 20 61 72 72 61 6e 67 65   ** Make arrange
16e60 6d 65 6e 74 73 20 74 6f 20 69 6e 76 6f 6b 65 20  ments to invoke 
16e70 74 68 65 20 43 41 4c 4c 42 41 43 4b 20 72 6f 75  the CALLBACK rou
16e80 74 69 6e 65 20 66 6f 72 20 65 61 63 68 20 74 72  tine for each tr
16e90 61 63 65 20 65 76 65 6e 74 0a 20 20 2a 2a 20 6d  ace event.  ** m
16ea0 61 74 63 68 69 6e 67 20 74 68 65 20 6d 61 73 6b  atching the mask
16eb0 20 74 68 61 74 20 69 73 20 67 65 6e 65 72 61 74   that is generat
16ec0 65 64 2e 20 20 54 68 65 20 70 61 72 61 6d 65 74  ed.  The paramet
16ed0 65 72 73 20 61 72 65 20 61 70 70 65 6e 64 65 64  ers are appended
16ee0 20 74 6f 0a 20 20 2a 2a 20 43 41 4c 4c 42 41 43   to.  ** CALLBAC
16ef0 4b 20 62 65 66 6f 72 65 20 69 74 20 69 73 20 65  K before it is e
16f00 78 65 63 75 74 65 64 2e 0a 20 20 2a 2f 0a 20 20  xecuted..  */.  
16f10 63 61 73 65 20 44 42 5f 54 52 41 43 45 5f 56 32  case DB_TRACE_V2
16f20 3a 20 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63  : {.    if( objc
16f30 3e 34 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  >4 ){.      Tcl_
16f40 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
16f50 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f  erp, 2, objv, "?
16f60 43 41 4c 4c 42 41 43 4b 3f 20 3f 4d 41 53 4b 3f  CALLBACK? ?MASK?
16f70 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
16f80 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
16f90 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d  }else if( objc==
16fa0 32 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  2 ){.      if( p
16fb0 44 62 2d 3e 7a 54 72 61 63 65 56 32 20 29 7b 0a  Db->zTraceV2 ){.
16fc0 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65          Tcl_Appe
16fd0 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
16fe0 20 70 44 62 2d 3e 7a 54 72 61 63 65 56 32 2c 20   pDb->zTraceV2, 
16ff0 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20  (char*)0);.     
17000 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
17010 20 20 20 20 63 68 61 72 20 2a 7a 54 72 61 63 65      char *zTrace
17020 56 32 3b 0a 20 20 20 20 20 20 69 6e 74 20 6c 65  V2;.      int le
17030 6e 3b 0a 20 20 20 20 20 20 54 63 6c 5f 57 69 64  n;.      Tcl_Wid
17040 65 49 6e 74 20 77 4d 61 73 6b 20 3d 20 30 3b 0a  eInt wMask = 0;.
17050 20 20 20 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d        if( objc==
17060 34 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74 61  4 ){.        sta
17070 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
17080 54 54 59 50 45 5f 73 74 72 73 5b 5d 20 3d 20 7b  TTYPE_strs[] = {
17090 0a 20 20 20 20 20 20 20 20 20 20 22 73 74 61 74  .          "stat
170a0 65 6d 65 6e 74 22 2c 20 22 70 72 6f 66 69 6c 65  ement", "profile
170b0 22 2c 20 22 72 6f 77 22 2c 20 22 63 6c 6f 73 65  ", "row", "close
170c0 22 2c 20 30 0a 20 20 20 20 20 20 20 20 7d 3b 0a  ", 0.        };.
170d0 20 20 20 20 20 20 20 20 65 6e 75 6d 20 54 54 59          enum TTY
170e0 50 45 5f 65 6e 75 6d 20 7b 0a 20 20 20 20 20 20  PE_enum {.      
170f0 20 20 20 20 54 54 59 50 45 5f 53 54 4d 54 2c 20      TTYPE_STMT, 
17100 54 54 59 50 45 5f 50 52 4f 46 49 4c 45 2c 20 54  TTYPE_PROFILE, T
17110 54 59 50 45 5f 52 4f 57 2c 20 54 54 59 50 45 5f  TYPE_ROW, TTYPE_
17120 43 4c 4f 53 45 0a 20 20 20 20 20 20 20 20 7d 3b  CLOSE.        };
17130 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  .        int i;.
17140 20 20 20 20 20 20 20 20 69 66 28 20 54 43 4c 5f          if( TCL_
17150 4f 4b 21 3d 54 63 6c 5f 4c 69 73 74 4f 62 6a 4c  OK!=Tcl_ListObjL
17160 65 6e 67 74 68 28 69 6e 74 65 72 70 2c 20 6f 62  ength(interp, ob
17170 6a 76 5b 33 5d 2c 20 26 6c 65 6e 29 20 29 7b 0a  jv[3], &len) ){.
17180 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
17190 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
171a0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 66 6f      }.        fo
171b0 72 28 69 3d 30 3b 20 69 3c 6c 65 6e 3b 20 69 2b  r(i=0; i<len; i+
171c0 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54 63  +){.          Tc
171d0 6c 5f 4f 62 6a 20 2a 70 4f 62 6a 3b 0a 20 20 20  l_Obj *pObj;.   
171e0 20 20 20 20 20 20 20 69 6e 74 20 74 74 79 70 65         int ttype
171f0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
17200 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 4c 69 73 74  TCL_OK!=Tcl_List
17210 4f 62 6a 49 6e 64 65 78 28 69 6e 74 65 72 70 2c  ObjIndex(interp,
17220 20 6f 62 6a 76 5b 33 5d 2c 20 69 2c 20 26 70 4f   objv[3], i, &pO
17230 62 6a 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  bj) ){.         
17240 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
17250 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ROR;.          }
17260 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 54  .          if( T
17270 63 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f  cl_GetIndexFromO
17280 62 6a 28 69 6e 74 65 72 70 2c 20 70 4f 62 6a 2c  bj(interp, pObj,
17290 20 54 54 59 50 45 5f 73 74 72 73 2c 20 22 74 72   TTYPE_strs, "tr
172a0 61 63 65 20 74 79 70 65 22 2c 0a 20 20 20 20 20  ace type",.     
172b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
172c0 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20               0, 
172d0 26 74 74 79 70 65 29 21 3d 54 43 4c 5f 4f 4b 20  &ttype)!=TCL_OK 
172e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 54  ){.            T
172f0 63 6c 5f 57 69 64 65 49 6e 74 20 77 54 79 70 65  cl_WideInt wType
17300 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 54 63  ;.            Tc
17310 6c 5f 4f 62 6a 20 2a 70 45 72 72 6f 72 20 3d 20  l_Obj *pError = 
17320 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a  Tcl_DuplicateObj
17330 28 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c  (Tcl_GetObjResul
17340 74 28 69 6e 74 65 72 70 29 29 3b 0a 20 20 20 20  t(interp));.    
17350 20 20 20 20 20 20 20 20 54 63 6c 5f 49 6e 63 72          Tcl_Incr
17360 52 65 66 43 6f 75 6e 74 28 70 45 72 72 6f 72 29  RefCount(pError)
17370 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
17380 28 20 54 43 4c 5f 4f 4b 3d 3d 54 63 6c 5f 47 65  ( TCL_OK==Tcl_Ge
17390 74 57 69 64 65 49 6e 74 46 72 6f 6d 4f 62 6a 28  tWideIntFromObj(
173a0 69 6e 74 65 72 70 2c 20 70 4f 62 6a 2c 20 26 77  interp, pObj, &w
173b0 54 79 70 65 29 20 29 7b 0a 20 20 20 20 20 20 20  Type) ){.       
173c0 20 20 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52         Tcl_DecrR
173d0 65 66 43 6f 75 6e 74 28 70 45 72 72 6f 72 29 3b  efCount(pError);
173e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77  .              w
173f0 4d 61 73 6b 20 7c 3d 20 77 54 79 70 65 3b 0a 20  Mask |= wType;. 
17400 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65             }else
17410 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
17420 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
17430 28 69 6e 74 65 72 70 2c 20 70 45 72 72 6f 72 29  (interp, pError)
17440 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
17450 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
17460 28 70 45 72 72 6f 72 29 3b 0a 20 20 20 20 20 20  (pError);.      
17470 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54          return T
17480 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  CL_ERROR;.      
17490 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
174a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
174b0 20 20 20 20 20 73 77 69 74 63 68 28 20 28 65 6e       switch( (en
174c0 75 6d 20 54 54 59 50 45 5f 65 6e 75 6d 29 74 74  um TTYPE_enum)tt
174d0 79 70 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ype ){.         
174e0 20 20 20 20 20 63 61 73 65 20 54 54 59 50 45 5f       case TTYPE_
174f0 53 54 4d 54 3a 20 20 20 20 77 4d 61 73 6b 20 7c  STMT:    wMask |
17500 3d 20 53 51 4c 49 54 45 5f 54 52 41 43 45 5f 53  = SQLITE_TRACE_S
17510 54 4d 54 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20  TMT;    break;. 
17520 20 20 20 20 20 20 20 20 20 20 20 20 20 63 61 73               cas
17530 65 20 54 54 59 50 45 5f 50 52 4f 46 49 4c 45 3a  e TTYPE_PROFILE:
17540 20 77 4d 61 73 6b 20 7c 3d 20 53 51 4c 49 54 45   wMask |= SQLITE
17550 5f 54 52 41 43 45 5f 50 52 4f 46 49 4c 45 3b 20  _TRACE_PROFILE; 
17560 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
17570 20 20 20 20 20 63 61 73 65 20 54 54 59 50 45 5f       case TTYPE_
17580 52 4f 57 3a 20 20 20 20 20 77 4d 61 73 6b 20 7c  ROW:     wMask |
17590 3d 20 53 51 4c 49 54 45 5f 54 52 41 43 45 5f 52  = SQLITE_TRACE_R
175a0 4f 57 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  OW;     break;. 
175b0 20 20 20 20 20 20 20 20 20 20 20 20 20 63 61 73               cas
175c0 65 20 54 54 59 50 45 5f 43 4c 4f 53 45 3a 20 20  e TTYPE_CLOSE:  
175d0 20 77 4d 61 73 6b 20 7c 3d 20 53 51 4c 49 54 45   wMask |= SQLITE
175e0 5f 54 52 41 43 45 5f 43 4c 4f 53 45 3b 20 20 20  _TRACE_CLOSE;   
175f0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
17600 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
17610 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
17620 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
17630 77 4d 61 73 6b 20 3d 20 53 51 4c 49 54 45 5f 54  wMask = SQLITE_T
17640 52 41 43 45 5f 53 54 4d 54 3b 20 2f 2a 20 75 73  RACE_STMT; /* us
17650 65 20 74 68 65 20 22 6c 65 67 61 63 79 22 20 64  e the "legacy" d
17660 65 66 61 75 6c 74 20 2a 2f 0a 20 20 20 20 20 20  efault */.      
17670 7d 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d  }.      if( pDb-
17680 3e 7a 54 72 61 63 65 56 32 20 29 7b 0a 20 20 20  >zTraceV2 ){.   
17690 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44       Tcl_Free(pD
176a0 62 2d 3e 7a 54 72 61 63 65 56 32 29 3b 0a 20 20  b->zTraceV2);.  
176b0 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 54 72 61      }.      zTra
176c0 63 65 56 32 20 3d 20 54 63 6c 5f 47 65 74 53 74  ceV2 = Tcl_GetSt
176d0 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
176e0 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20  [2], &len);.    
176f0 20 20 69 66 28 20 7a 54 72 61 63 65 56 32 20 26    if( zTraceV2 &
17700 26 20 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20  & len>0 ){.     
17710 20 20 20 70 44 62 2d 3e 7a 54 72 61 63 65 56 32     pDb->zTraceV2
17720 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65   = Tcl_Alloc( le
17730 6e 20 2b 20 31 20 29 3b 0a 20 20 20 20 20 20 20  n + 1 );.       
17740 20 6d 65 6d 63 70 79 28 70 44 62 2d 3e 7a 54 72   memcpy(pDb->zTr
17750 61 63 65 56 32 2c 20 7a 54 72 61 63 65 56 32 2c  aceV2, zTraceV2,
17760 20 6c 65 6e 2b 31 29 3b 0a 20 20 20 20 20 20 7d   len+1);.      }
17770 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 44  else{.        pD
17780 62 2d 3e 7a 54 72 61 63 65 56 32 20 3d 20 30 3b  b->zTraceV2 = 0;
17790 0a 20 20 20 20 20 20 7d 0a 23 69 66 20 21 64 65  .      }.#if !de
177a0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
177b0 54 5f 54 52 41 43 45 29 20 26 26 20 21 64 65 66  T_TRACE) && !def
177c0 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
177d0 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 29  _FLOATING_POINT)
177e0 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e  .      if( pDb->
177f0 7a 54 72 61 63 65 56 32 20 29 7b 0a 20 20 20 20  zTraceV2 ){.    
17800 20 20 20 20 70 44 62 2d 3e 69 6e 74 65 72 70 20      pDb->interp 
17810 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 20 20  = interp;.      
17820 20 20 73 71 6c 69 74 65 33 5f 74 72 61 63 65 5f    sqlite3_trace_
17830 76 32 28 70 44 62 2d 3e 64 62 2c 20 28 75 6e 73  v2(pDb->db, (uns
17840 69 67 6e 65 64 29 77 4d 61 73 6b 2c 20 44 62 54  igned)wMask, DbT
17850 72 61 63 65 56 32 48 61 6e 64 6c 65 72 2c 20 70  raceV2Handler, p
17860 44 62 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  Db);.      }else
17870 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
17880 33 5f 74 72 61 63 65 5f 76 32 28 70 44 62 2d 3e  3_trace_v2(pDb->
17890 64 62 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  db, 0, 0, 0);.  
178a0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
178b0 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20   }.    break;.  
178c0 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 74  }..  /*    $db t
178d0 72 61 6e 73 61 63 74 69 6f 6e 20 5b 2d 64 65 66  ransaction [-def
178e0 65 72 72 65 64 7c 2d 69 6d 6d 65 64 69 61 74 65  erred|-immediate
178f0 7c 2d 65 78 63 6c 75 73 69 76 65 5d 20 53 43 52  |-exclusive] SCR
17900 49 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 74  IPT.  **.  ** St
17910 61 72 74 20 61 20 6e 65 77 20 74 72 61 6e 73 61  art a new transa
17920 63 74 69 6f 6e 20 28 69 66 20 77 65 20 61 72 65  ction (if we are
17930 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 69 6e 20   not already in 
17940 74 68 65 20 6d 69 64 73 74 20 6f 66 20 61 0a 20  the midst of a. 
17950 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 29   ** transaction)
17960 20 61 6e 64 20 65 78 65 63 75 74 65 20 74 68 65   and execute the
17970 20 54 43 4c 20 73 63 72 69 70 74 20 53 43 52 49   TCL script SCRI
17980 50 54 2e 20 20 41 66 74 65 72 20 53 43 52 49 50  PT.  After SCRIP
17990 54 0a 20 20 2a 2a 20 63 6f 6d 70 6c 65 74 65 73  T.  ** completes
179a0 2c 20 65 69 74 68 65 72 20 63 6f 6d 6d 69 74 20  , either commit 
179b0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
179c0 6f 72 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 20  or roll it back 
179d0 69 66 20 53 43 52 49 50 54 0a 20 20 2a 2a 20 74  if SCRIPT.  ** t
179e0 68 72 6f 77 73 20 61 6e 20 65 78 63 65 70 74 69  hrows an excepti
179f0 6f 6e 2e 20 20 4f 72 20 69 66 20 6e 6f 20 6e 65  on.  Or if no ne
17a00 77 20 74 72 61 6e 73 61 74 69 6f 6e 20 77 61 73  w transation was
17a10 20 73 74 61 72 74 65 64 2c 20 64 6f 20 6e 6f 74   started, do not
17a20 68 69 6e 67 2e 0a 20 20 2a 2a 20 70 61 73 73 20  hing..  ** pass 
17a30 74 68 65 20 65 78 63 65 70 74 69 6f 6e 20 6f 6e  the exception on
17a40 20 75 70 20 74 68 65 20 73 74 61 63 6b 2e 0a 20   up the stack.. 
17a50 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 63 6f   **.  ** This co
17a60 6d 6d 61 6e 64 20 77 61 73 20 69 6e 73 70 69 72  mmand was inspir
17a70 65 64 20 62 79 20 44 61 76 65 20 54 68 6f 6d 61  ed by Dave Thoma
17a80 73 27 73 20 74 61 6c 6b 20 6f 6e 20 52 75 62 79  s's talk on Ruby
17a90 20 61 74 20 74 68 65 0a 20 20 2a 2a 20 32 30 30   at the.  ** 200
17aa0 35 20 4f 27 52 65 69 6c 6c 79 20 4f 70 65 6e 20  5 O'Reilly Open 
17ab0 53 6f 75 72 63 65 20 43 6f 6e 76 65 6e 74 69 6f  Source Conventio
17ac0 6e 20 28 4f 53 43 4f 4e 29 2e 0a 20 20 2a 2f 0a  n (OSCON)..  */.
17ad0 20 20 63 61 73 65 20 44 42 5f 54 52 41 4e 53 41    case DB_TRANSA
17ae0 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 54 63 6c  CTION: {.    Tcl
17af0 5f 4f 62 6a 20 2a 70 53 63 72 69 70 74 3b 0a 20  _Obj *pScript;. 
17b00 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
17b10 42 65 67 69 6e 20 3d 20 22 53 41 56 45 50 4f 49  Begin = "SAVEPOI
17b20 4e 54 20 5f 74 63 6c 5f 74 72 61 6e 73 61 63 74  NT _tcl_transact
17b30 69 6f 6e 22 3b 0a 20 20 20 20 69 66 28 20 6f 62  ion";.    if( ob
17b40 6a 63 21 3d 33 20 26 26 20 6f 62 6a 63 21 3d 34  jc!=3 && objc!=4
17b50 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72   ){.      Tcl_Wr
17b60 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
17b70 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 5b 54 59  p, 2, objv, "[TY
17b80 50 45 5d 20 53 43 52 49 50 54 22 29 3b 0a 20 20  PE] SCRIPT");.  
17b90 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
17ba0 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  RROR;.    }..   
17bb0 20 69 66 28 20 70 44 62 2d 3e 6e 54 72 61 6e 73   if( pDb->nTrans
17bc0 61 63 74 69 6f 6e 3d 3d 30 20 26 26 20 6f 62 6a  action==0 && obj
17bd0 63 3d 3d 34 20 29 7b 0a 20 20 20 20 20 20 73 74  c==4 ){.      st
17be0 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
17bf0 2a 54 54 59 50 45 5f 73 74 72 73 5b 5d 20 3d 20  *TTYPE_strs[] = 
17c00 7b 0a 20 20 20 20 20 20 20 20 22 64 65 66 65 72  {.        "defer
17c10 72 65 64 22 2c 20 20 20 22 65 78 63 6c 75 73 69  red",   "exclusi
17c20 76 65 22 2c 20 20 22 69 6d 6d 65 64 69 61 74 65  ve",  "immediate
17c30 22 2c 20 30 0a 20 20 20 20 20 20 7d 3b 0a 20 20  ", 0.      };.  
17c40 20 20 20 20 65 6e 75 6d 20 54 54 59 50 45 5f 65      enum TTYPE_e
17c50 6e 75 6d 20 7b 0a 20 20 20 20 20 20 20 20 54 54  num {.        TT
17c60 59 50 45 5f 44 45 46 45 52 52 45 44 2c 20 54 54  YPE_DEFERRED, TT
17c70 59 50 45 5f 45 58 43 4c 55 53 49 56 45 2c 20 54  YPE_EXCLUSIVE, T
17c80 54 59 50 45 5f 49 4d 4d 45 44 49 41 54 45 0a 20  TYPE_IMMEDIATE. 
17c90 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 69 6e       };.      in
17ca0 74 20 74 74 79 70 65 3b 0a 20 20 20 20 20 20 69  t ttype;.      i
17cb0 66 28 20 54 63 6c 5f 47 65 74 49 6e 64 65 78 46  f( Tcl_GetIndexF
17cc0 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
17cd0 62 6a 76 5b 32 5d 2c 20 54 54 59 50 45 5f 73 74  bjv[2], TTYPE_st
17ce0 72 73 2c 20 22 74 72 61 6e 73 61 63 74 69 6f 6e  rs, "transaction
17cf0 20 74 79 70 65 22 2c 0a 20 20 20 20 20 20 20 20   type",.        
17d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17d10 20 20 20 20 20 20 30 2c 20 26 74 74 79 70 65 29        0, &ttype)
17d20 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
17d30 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
17d40 20 20 20 20 7d 0a 20 20 20 20 20 20 73 77 69 74      }.      swit
17d50 63 68 28 20 28 65 6e 75 6d 20 54 54 59 50 45 5f  ch( (enum TTYPE_
17d60 65 6e 75 6d 29 74 74 79 70 65 20 29 7b 0a 20 20  enum)ttype ){.  
17d70 20 20 20 20 20 20 63 61 73 65 20 54 54 59 50 45        case TTYPE
17d80 5f 44 45 46 45 52 52 45 44 3a 20 20 20 20 2f 2a  _DEFERRED:    /*
17d90 20 6e 6f 2d 6f 70 20 2a 2f 3b 20 20 20 20 20 20   no-op */;      
17da0 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
17db0 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 54  ;.        case T
17dc0 54 59 50 45 5f 45 58 43 4c 55 53 49 56 45 3a 20  TYPE_EXCLUSIVE: 
17dd0 20 20 7a 42 65 67 69 6e 20 3d 20 22 42 45 47 49    zBegin = "BEGI
17de0 4e 20 45 58 43 4c 55 53 49 56 45 22 3b 20 20 62  N EXCLUSIVE";  b
17df0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61  reak;.        ca
17e00 73 65 20 54 54 59 50 45 5f 49 4d 4d 45 44 49 41  se TTYPE_IMMEDIA
17e10 54 45 3a 20 20 20 7a 42 65 67 69 6e 20 3d 20 22  TE:   zBegin = "
17e20 42 45 47 49 4e 20 49 4d 4d 45 44 49 41 54 45 22  BEGIN IMMEDIATE"
17e30 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  ;  break;.      
17e40 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 63 72  }.    }.    pScr
17e50 69 70 74 20 3d 20 6f 62 6a 76 5b 6f 62 6a 63 2d  ipt = objv[objc-
17e60 31 5d 3b 0a 0a 20 20 20 20 2f 2a 20 52 75 6e 20  1];..    /* Run 
17e70 74 68 65 20 53 51 4c 69 74 65 20 42 45 47 49 4e  the SQLite BEGIN
17e80 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 6f 70 65 6e   command to open
17e90 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f   a transaction o
17ea0 72 20 73 61 76 65 70 6f 69 6e 74 2e 20 2a 2f 0a  r savepoint. */.
17eb0 20 20 20 20 70 44 62 2d 3e 64 69 73 61 62 6c 65      pDb->disable
17ec0 41 75 74 68 2b 2b 3b 0a 20 20 20 20 72 63 20 3d  Auth++;.    rc =
17ed0 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 44   sqlite3_exec(pD
17ee0 62 2d 3e 64 62 2c 20 7a 42 65 67 69 6e 2c 20 30  b->db, zBegin, 0
17ef0 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 70 44 62  , 0, 0);.    pDb
17f00 2d 3e 64 69 73 61 62 6c 65 41 75 74 68 2d 2d 3b  ->disableAuth--;
17f10 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
17f20 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
17f30 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
17f40 28 69 6e 74 65 72 70 2c 20 73 71 6c 69 74 65 33  (interp, sqlite3
17f50 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62 29  _errmsg(pDb->db)
17f60 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20  , (char*)0);.   
17f70 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
17f80 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ROR;.    }.    p
17f90 44 62 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e  Db->nTransaction
17fa0 2b 2b 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 75  ++;..    /* If u
17fb0 73 69 6e 67 20 4e 52 45 2c 20 73 63 68 65 64 75  sing NRE, schedu
17fc0 6c 65 20 61 20 63 61 6c 6c 62 61 63 6b 20 74 6f  le a callback to
17fd0 20 69 6e 76 6f 6b 65 20 74 68 65 20 73 63 72 69   invoke the scri
17fe0 70 74 20 70 53 63 72 69 70 74 2c 20 74 68 65 6e  pt pScript, then
17ff0 0a 20 20 20 20 2a 2a 20 61 20 73 65 63 6f 6e 64  .    ** a second
18000 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20 63 6f 6d   callback to com
18010 6d 69 74 20 28 6f 72 20 72 6f 6c 6c 62 61 63 6b  mit (or rollback
18020 29 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  ) the transactio
18030 6e 20 6f 72 20 73 61 76 65 70 6f 69 6e 74 0a 20  n or savepoint. 
18040 20 20 20 2a 2a 20 6f 70 65 6e 65 64 20 61 62 6f     ** opened abo
18050 76 65 2e 20 49 66 20 6e 6f 74 20 75 73 69 6e 67  ve. If not using
18060 20 4e 52 45 2c 20 65 76 61 6c 75 61 74 65 20 74   NRE, evaluate t
18070 68 65 20 73 63 72 69 70 74 20 64 69 72 65 63 74  he script direct
18080 6c 79 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20  ly, then.    ** 
18090 63 61 6c 6c 20 66 75 6e 63 74 69 6f 6e 20 44 62  call function Db
180a0 54 72 61 6e 73 50 6f 73 74 43 6d 64 28 29 20 74  TransPostCmd() t
180b0 6f 20 63 6f 6d 6d 69 74 20 28 6f 72 20 72 6f 6c  o commit (or rol
180c0 6c 62 61 63 6b 29 20 74 68 65 20 74 72 61 6e 73  lback) the trans
180d0 61 63 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 6f 72  action.    ** or
180e0 20 73 61 76 65 70 6f 69 6e 74 2e 20 20 2a 2f 0a   savepoint.  */.
180f0 20 20 20 20 69 66 28 20 44 62 55 73 65 4e 72 65      if( DbUseNre
18100 28 29 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  () ){.      Tcl_
18110 4e 52 41 64 64 43 61 6c 6c 62 61 63 6b 28 69 6e  NRAddCallback(in
18120 74 65 72 70 2c 20 44 62 54 72 61 6e 73 50 6f 73  terp, DbTransPos
18130 74 43 6d 64 2c 20 63 64 2c 20 30 2c 20 30 2c 20  tCmd, cd, 0, 0, 
18140 30 29 3b 0a 20 20 20 20 20 20 28 76 6f 69 64 29  0);.      (void)
18150 54 63 6c 5f 4e 52 45 76 61 6c 4f 62 6a 28 69 6e  Tcl_NREvalObj(in
18160 74 65 72 70 2c 20 70 53 63 72 69 70 74 2c 20 30  terp, pScript, 0
18170 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
18180 20 20 20 20 72 63 20 3d 20 44 62 54 72 61 6e 73      rc = DbTrans
18190 50 6f 73 74 43 6d 64 28 26 63 64 2c 20 69 6e 74  PostCmd(&cd, int
181a0 65 72 70 2c 20 54 63 6c 5f 45 76 61 6c 4f 62 6a  erp, Tcl_EvalObj
181b0 45 78 28 69 6e 74 65 72 70 2c 20 70 53 63 72 69  Ex(interp, pScri
181c0 70 74 2c 20 30 29 29 3b 0a 20 20 20 20 7d 0a 20  pt, 0));.    }. 
181d0 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
181e0 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 24 64 62 20   /*.  **    $db 
181f0 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79 20 3f 73  unlock_notify ?s
18200 63 72 69 70 74 3f 0a 20 20 2a 2f 0a 20 20 63 61  cript?.  */.  ca
18210 73 65 20 44 42 5f 55 4e 4c 4f 43 4b 5f 4e 4f 54  se DB_UNLOCK_NOT
18220 49 46 59 3a 20 7b 0a 23 69 66 6e 64 65 66 20 53  IFY: {.#ifndef S
18230 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 55 4e 4c  QLITE_ENABLE_UNL
18240 4f 43 4b 5f 4e 4f 54 49 46 59 0a 20 20 20 20 54  OCK_NOTIFY.    T
18250 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
18260 69 6e 74 65 72 70 2c 20 22 75 6e 6c 6f 63 6b 5f  interp, "unlock_
18270 6e 6f 74 69 66 79 20 6e 6f 74 20 61 76 61 69 6c  notify not avail
18280 61 62 6c 65 20 69 6e 20 74 68 69 73 20 62 75 69  able in this bui
18290 6c 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ld",.           
182a0 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
182b0 29 30 29 3b 0a 20 20 20 20 72 63 20 3d 20 54 43  )0);.    rc = TC
182c0 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 20  L_ERROR;.#else. 
182d0 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 26     if( objc!=2 &
182e0 26 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20  & objc!=3 ){.   
182f0 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
18300 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
18310 62 6a 76 2c 20 22 3f 53 43 52 49 50 54 3f 22 29  bjv, "?SCRIPT?")
18320 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c  ;.      rc = TCL
18330 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73  _ERROR;.    }els
18340 65 7b 0a 20 20 20 20 20 20 76 6f 69 64 20 28 2a  e{.      void (*
18350 78 4e 6f 74 69 66 79 29 28 76 6f 69 64 20 2a 2a  xNotify)(void **
18360 2c 20 69 6e 74 29 20 3d 20 30 3b 0a 20 20 20 20  , int) = 0;.    
18370 20 20 76 6f 69 64 20 2a 70 4e 6f 74 69 66 79 41    void *pNotifyA
18380 72 67 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 69  rg = 0;..      i
18390 66 28 20 70 44 62 2d 3e 70 55 6e 6c 6f 63 6b 4e  f( pDb->pUnlockN
183a0 6f 74 69 66 79 20 29 7b 0a 20 20 20 20 20 20 20  otify ){.       
183b0 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
183c0 74 28 70 44 62 2d 3e 70 55 6e 6c 6f 63 6b 4e 6f  t(pDb->pUnlockNo
183d0 74 69 66 79 29 3b 0a 20 20 20 20 20 20 20 20 70  tify);.        p
183e0 44 62 2d 3e 70 55 6e 6c 6f 63 6b 4e 6f 74 69 66  Db->pUnlockNotif
183f0 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 0a  y = 0;.      }..
18400 20 20 20 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d        if( objc==
18410 33 20 29 7b 0a 20 20 20 20 20 20 20 20 78 4e 6f  3 ){.        xNo
18420 74 69 66 79 20 3d 20 44 62 55 6e 6c 6f 63 6b 4e  tify = DbUnlockN
18430 6f 74 69 66 79 3b 0a 20 20 20 20 20 20 20 20 70  otify;.        p
18440 4e 6f 74 69 66 79 41 72 67 20 3d 20 28 76 6f 69  NotifyArg = (voi
18450 64 20 2a 29 70 44 62 3b 0a 20 20 20 20 20 20 20  d *)pDb;.       
18460 20 70 44 62 2d 3e 70 55 6e 6c 6f 63 6b 4e 6f 74   pDb->pUnlockNot
18470 69 66 79 20 3d 20 6f 62 6a 76 5b 32 5d 3b 0a 20  ify = objv[2];. 
18480 20 20 20 20 20 20 20 54 63 6c 5f 49 6e 63 72 52         Tcl_IncrR
18490 65 66 43 6f 75 6e 74 28 70 44 62 2d 3e 70 55 6e  efCount(pDb->pUn
184a0 6c 6f 63 6b 4e 6f 74 69 66 79 29 3b 0a 20 20 20  lockNotify);.   
184b0 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
184c0 73 71 6c 69 74 65 33 5f 75 6e 6c 6f 63 6b 5f 6e  sqlite3_unlock_n
184d0 6f 74 69 66 79 28 70 44 62 2d 3e 64 62 2c 20 78  otify(pDb->db, x
184e0 4e 6f 74 69 66 79 2c 20 70 4e 6f 74 69 66 79 41  Notify, pNotifyA
184f0 72 67 29 20 29 7b 0a 20 20 20 20 20 20 20 20 54  rg) ){.        T
18500 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
18510 69 6e 74 65 72 70 2c 20 73 71 6c 69 74 65 33 5f  interp, sqlite3_
18520 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c  errmsg(pDb->db),
18530 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20   (char*)0);.    
18540 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45 52 52      rc = TCL_ERR
18550 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OR;.      }.    
18560 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 62 72 65  }.#endif.    bre
18570 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  ak;.  }..  /*.  
18580 2a 2a 20 20 20 20 24 64 62 20 70 72 65 75 70 64  **    $db preupd
18590 61 74 65 5f 68 6f 6f 6b 20 63 6f 75 6e 74 0a 20  ate_hook count. 
185a0 20 2a 2a 20 20 20 20 24 64 62 20 70 72 65 75 70   **    $db preup
185b0 64 61 74 65 5f 68 6f 6f 6b 20 68 6f 6f 6b 20 3f  date_hook hook ?
185c0 53 43 52 49 50 54 3f 0a 20 20 2a 2a 20 20 20 20  SCRIPT?.  **    
185d0 24 64 62 20 70 72 65 75 70 64 61 74 65 5f 68 6f  $db preupdate_ho
185e0 6f 6b 20 6e 65 77 20 49 4e 44 45 58 0a 20 20 2a  ok new INDEX.  *
185f0 2a 20 20 20 20 24 64 62 20 70 72 65 75 70 64 61  *    $db preupda
18600 74 65 5f 68 6f 6f 6b 20 6f 6c 64 20 49 4e 44 45  te_hook old INDE
18610 58 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  X.  */.  case DB
18620 5f 50 52 45 55 50 44 41 54 45 3a 20 7b 0a 23 69  _PREUPDATE: {.#i
18630 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  fndef SQLITE_ENA
18640 42 4c 45 5f 50 52 45 55 50 44 41 54 45 5f 48 4f  BLE_PREUPDATE_HO
18650 4f 4b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  OK.    Tcl_Appen
18660 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
18670 22 70 72 65 75 70 64 61 74 65 5f 68 6f 6f 6b 20  "preupdate_hook 
18680 77 61 73 20 6f 6d 69 74 74 65 64 20 61 74 20 63  was omitted at c
18690 6f 6d 70 69 6c 65 2d 74 69 6d 65 22 2c 20 0a 20  ompile-time", . 
186a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
186b0 20 20 20 20 28 63 68 61 72 2a 29 30 29 3b 0a 20      (char*)0);. 
186c0 20 20 20 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f     rc = TCL_ERRO
186d0 52 3b 0a 23 65 6c 73 65 0a 20 20 20 20 73 74 61  R;.#else.    sta
186e0 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
186f0 61 7a 53 75 62 5b 5d 20 3d 20 7b 22 63 6f 75 6e  azSub[] = {"coun
18700 74 22 2c 20 22 64 65 70 74 68 22 2c 20 22 68 6f  t", "depth", "ho
18710 6f 6b 22 2c 20 22 6e 65 77 22 2c 20 22 6f 6c 64  ok", "new", "old
18720 22 2c 20 30 7d 3b 0a 20 20 20 20 65 6e 75 6d 20  ", 0};.    enum 
18730 44 62 50 72 65 75 70 64 61 74 65 53 75 62 43 6d  DbPreupdateSubCm
18740 64 20 7b 0a 20 20 20 20 20 20 50 52 45 5f 43 4f  d {.      PRE_CO
18750 55 4e 54 2c 20 50 52 45 5f 44 45 50 54 48 2c 20  UNT, PRE_DEPTH, 
18760 50 52 45 5f 48 4f 4f 4b 2c 20 50 52 45 5f 4e 45  PRE_HOOK, PRE_NE
18770 57 2c 20 50 52 45 5f 4f 4c 44 0a 20 20 20 20 7d  W, PRE_OLD.    }
18780 3b 0a 20 20 20 20 69 6e 74 20 69 53 75 62 3b 0a  ;.    int iSub;.
18790 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3c 33 20  .    if( objc<3 
187a0 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f  ){.      Tcl_Wro
187b0 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
187c0 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 53 55 42 2d  , 2, objv, "SUB-
187d0 43 4f 4d 4d 41 4e 44 20 3f 41 52 47 53 3f 22 29  COMMAND ?ARGS?")
187e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
187f0 54 63 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d  Tcl_GetIndexFrom
18800 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
18810 5b 32 5d 2c 20 61 7a 53 75 62 2c 20 22 73 75 62  [2], azSub, "sub
18820 2d 63 6f 6d 6d 61 6e 64 22 2c 20 30 2c 20 26 69  -command", 0, &i
18830 53 75 62 29 20 29 7b 0a 20 20 20 20 20 20 72 65  Sub) ){.      re
18840 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
18850 20 20 20 20 7d 0a 0a 20 20 20 20 73 77 69 74 63      }..    switc
18860 68 28 20 28 65 6e 75 6d 20 44 62 50 72 65 75 70  h( (enum DbPreup
18870 64 61 74 65 53 75 62 43 6d 64 29 69 53 75 62 20  dateSubCmd)iSub 
18880 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 50 52  ){.      case PR
18890 45 5f 43 4f 55 4e 54 3a 20 7b 0a 20 20 20 20 20  E_COUNT: {.     
188a0 20 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 73 71     int nCol = sq
188b0 6c 69 74 65 33 5f 70 72 65 75 70 64 61 74 65 5f  lite3_preupdate_
188c0 63 6f 75 6e 74 28 70 44 62 2d 3e 64 62 29 3b 0a  count(pDb->db);.
188d0 20 20 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f          Tcl_SetO
188e0 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
188f0 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 6e   Tcl_NewIntObj(n
18900 43 6f 6c 29 29 3b 0a 20 20 20 20 20 20 20 20 62  Col));.        b
18910 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  reak;.      }.. 
18920 20 20 20 20 20 63 61 73 65 20 50 52 45 5f 48 4f       case PRE_HO
18930 4f 4b 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66  OK: {.        if
18940 28 20 6f 62 6a 63 3e 34 20 29 7b 0a 20 20 20 20  ( objc>4 ){.    
18950 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
18960 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
18970 2c 20 6f 62 6a 76 2c 20 22 68 6f 6f 6b 20 3f 53  , objv, "hook ?S
18980 43 52 49 50 54 3f 22 29 3b 0a 20 20 20 20 20 20  CRIPT?");.      
18990 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
189a0 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a  RROR;.        }.
189b0 20 20 20 20 20 20 20 20 44 62 48 6f 6f 6b 43 6d          DbHookCm
189c0 64 28 69 6e 74 65 72 70 2c 20 70 44 62 2c 20 28  d(interp, pDb, (
189d0 6f 62 6a 63 3d 3d 34 20 3f 20 6f 62 6a 76 5b 33  objc==4 ? objv[3
189e0 5d 20 3a 20 30 29 2c 20 26 70 44 62 2d 3e 70 50  ] : 0), &pDb->pP
189f0 72 65 55 70 64 61 74 65 48 6f 6f 6b 29 3b 0a 20  reUpdateHook);. 
18a00 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
18a10 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 63 61 73      }..      cas
18a20 65 20 50 52 45 5f 44 45 50 54 48 3a 20 7b 0a 20  e PRE_DEPTH: {. 
18a30 20 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a         Tcl_Obj *
18a40 70 52 65 74 3b 0a 20 20 20 20 20 20 20 20 69 66  pRet;.        if
18a50 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20  ( objc!=3 ){.   
18a60 20 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67         Tcl_Wrong
18a70 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
18a80 33 2c 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 20 20  3, objv, "");.  
18a90 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54          return T
18aa0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  CL_ERROR;.      
18ab0 20 20 7d 0a 20 20 20 20 20 20 20 20 70 52 65 74    }.        pRet
18ac0 20 3d 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a   = Tcl_NewIntObj
18ad0 28 73 71 6c 69 74 65 33 5f 70 72 65 75 70 64 61  (sqlite3_preupda
18ae0 74 65 5f 64 65 70 74 68 28 70 44 62 2d 3e 64 62  te_depth(pDb->db
18af0 29 29 3b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f  ));.        Tcl_
18b00 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
18b10 65 72 70 2c 20 70 52 65 74 29 3b 0a 20 20 20 20  erp, pRet);.    
18b20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
18b30 20 7d 0a 0a 20 20 20 20 20 20 63 61 73 65 20 50   }..      case P
18b40 52 45 5f 4e 45 57 3a 0a 20 20 20 20 20 20 63 61  RE_NEW:.      ca
18b50 73 65 20 50 52 45 5f 4f 4c 44 3a 20 7b 0a 20 20  se PRE_OLD: {.  
18b60 20 20 20 20 20 20 69 6e 74 20 69 49 64 78 3b 0a        int iIdx;.
18b70 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
18b80 76 61 6c 75 65 20 2a 70 56 61 6c 75 65 3b 0a 20  value *pValue;. 
18b90 20 20 20 20 20 20 20 69 66 28 20 6f 62 6a 63 21         if( objc!
18ba0 3d 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =4 ){.          
18bb0 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
18bc0 28 69 6e 74 65 72 70 2c 20 33 2c 20 6f 62 6a 76  (interp, 3, objv
18bd0 2c 20 22 49 4e 44 45 58 22 29 3b 0a 20 20 20 20  , "INDEX");.    
18be0 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
18bf0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20  _ERROR;.        
18c00 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 54 63  }.        if( Tc
18c10 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
18c20 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c  interp, objv[3],
18c30 20 26 69 49 64 78 29 20 29 7b 0a 20 20 20 20 20   &iIdx) ){.     
18c40 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
18c50 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d  ERROR;.        }
18c60 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 53  ..        if( iS
18c70 75 62 3d 3d 50 52 45 5f 4f 4c 44 20 29 7b 0a 20  ub==PRE_OLD ){. 
18c80 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
18c90 6c 69 74 65 33 5f 70 72 65 75 70 64 61 74 65 5f  lite3_preupdate_
18ca0 6f 6c 64 28 70 44 62 2d 3e 64 62 2c 20 69 49 64  old(pDb->db, iId
18cb0 78 2c 20 26 70 56 61 6c 75 65 29 3b 0a 20 20 20  x, &pValue);.   
18cc0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
18cd0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 53        assert( iS
18ce0 75 62 3d 3d 50 52 45 5f 4e 45 57 20 29 3b 0a 20  ub==PRE_NEW );. 
18cf0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
18d00 6c 69 74 65 33 5f 70 72 65 75 70 64 61 74 65 5f  lite3_preupdate_
18d10 6e 65 77 28 70 44 62 2d 3e 64 62 2c 20 69 49 64  new(pDb->db, iId
18d20 78 2c 20 26 70 56 61 6c 75 65 29 3b 0a 20 20 20  x, &pValue);.   
18d30 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
18d40 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
18d50 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54  K ){.          T
18d60 63 6c 5f 4f 62 6a 20 2a 70 4f 62 6a 3b 0a 20 20  cl_Obj *pObj;.  
18d70 20 20 20 20 20 20 20 20 70 4f 62 6a 20 3d 20 54          pObj = T
18d80 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
18d90 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76  (char*)sqlite3_v
18da0 61 6c 75 65 5f 74 65 78 74 28 70 56 61 6c 75 65  alue_text(pValue
18db0 29 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 20 20  ), -1);.        
18dc0 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
18dd0 6c 74 28 69 6e 74 65 72 70 2c 20 70 4f 62 6a 29  lt(interp, pObj)
18de0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
18df0 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 41  .          Tcl_A
18e00 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
18e10 72 70 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  rp, sqlite3_errm
18e20 73 67 28 70 44 62 2d 3e 64 62 29 2c 20 28 63 68  sg(pDb->db), (ch
18e30 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 20 20  ar*)0);.        
18e40 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
18e50 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  OR;.        }.  
18e60 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64      }.    }.#end
18e70 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41  if /* SQLITE_ENA
18e80 42 4c 45 5f 50 52 45 55 50 44 41 54 45 5f 48 4f  BLE_PREUPDATE_HO
18e90 4f 4b 20 2a 2f 0a 20 20 20 20 62 72 65 61 6b 3b  OK */.    break;
18ea0 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
18eb0 20 20 20 24 64 62 20 77 61 6c 5f 68 6f 6f 6b 20     $db wal_hook 
18ec0 3f 73 63 72 69 70 74 3f 0a 20 20 2a 2a 20 20 20  ?script?.  **   
18ed0 20 24 64 62 20 75 70 64 61 74 65 5f 68 6f 6f 6b   $db update_hook
18ee0 20 3f 73 63 72 69 70 74 3f 0a 20 20 2a 2a 20 20   ?script?.  **  
18ef0 20 20 24 64 62 20 72 6f 6c 6c 62 61 63 6b 5f 68    $db rollback_h
18f00 6f 6f 6b 20 3f 73 63 72 69 70 74 3f 0a 20 20 2a  ook ?script?.  *
18f10 2f 0a 20 20 63 61 73 65 20 44 42 5f 57 41 4c 5f  /.  case DB_WAL_
18f20 48 4f 4f 4b 3a 0a 20 20 63 61 73 65 20 44 42 5f  HOOK:.  case DB_
18f30 55 50 44 41 54 45 5f 48 4f 4f 4b 3a 0a 20 20 63  UPDATE_HOOK:.  c
18f40 61 73 65 20 44 42 5f 52 4f 4c 4c 42 41 43 4b 5f  ase DB_ROLLBACK_
18f50 48 4f 4f 4b 3a 20 7b 0a 20 20 20 20 2f 2a 20 73  HOOK: {.    /* s
18f60 65 74 20 70 70 48 6f 6f 6b 20 74 6f 20 70 6f 69  et ppHook to poi
18f70 6e 74 20 61 74 20 70 55 70 64 61 74 65 48 6f 6f  nt at pUpdateHoo
18f80 6b 20 6f 72 20 70 52 6f 6c 6c 62 61 63 6b 48 6f  k or pRollbackHo
18f90 6f 6b 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e  ok, depending on
18fa0 0a 20 20 20 20 2a 2a 20 77 68 65 74 68 65 72 20  .    ** whether 
18fb0 5b 24 64 62 20 75 70 64 61 74 65 5f 68 6f 6f 6b  [$db update_hook
18fc0 5d 20 6f 72 20 5b 24 64 62 20 72 6f 6c 6c 62 61  ] or [$db rollba
18fd0 63 6b 5f 68 6f 6f 6b 5d 20 77 61 73 20 69 6e 76  ck_hook] was inv
18fe0 6f 6b 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  oked..    */.   
18ff0 20 54 63 6c 5f 4f 62 6a 20 2a 2a 70 70 48 6f 6f   Tcl_Obj **ppHoo
19000 6b 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 63  k = 0;.    if( c
19010 68 6f 69 63 65 3d 3d 44 42 5f 57 41 4c 5f 48 4f  hoice==DB_WAL_HO
19020 4f 4b 20 29 20 70 70 48 6f 6f 6b 20 3d 20 26 70  OK ) ppHook = &p
19030 44 62 2d 3e 70 57 61 6c 48 6f 6f 6b 3b 0a 20 20  Db->pWalHook;.  
19040 20 20 69 66 28 20 63 68 6f 69 63 65 3d 3d 44 42    if( choice==DB
19050 5f 55 50 44 41 54 45 5f 48 4f 4f 4b 20 29 20 70  _UPDATE_HOOK ) p
19060 70 48 6f 6f 6b 20 3d 20 26 70 44 62 2d 3e 70 55  pHook = &pDb->pU
19070 70 64 61 74 65 48 6f 6f 6b 3b 0a 20 20 20 20 69  pdateHook;.    i
19080 66 28 20 63 68 6f 69 63 65 3d 3d 44 42 5f 52 4f  f( choice==DB_RO
19090 4c 4c 42 41 43 4b 5f 48 4f 4f 4b 20 29 20 70 70  LLBACK_HOOK ) pp
190a0 48 6f 6f 6b 20 3d 20 26 70 44 62 2d 3e 70 52 6f  Hook = &pDb->pRo
190b0 6c 6c 62 61 63 6b 48 6f 6f 6b 3b 0a 20 20 20 20  llbackHook;.    
190c0 69 66 28 20 6f 62 6a 63 3e 33 20 29 7b 0a 20 20  if( objc>3 ){.  
190d0 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
190e0 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
190f0 20 6f 62 6a 76 2c 20 22 3f 53 43 52 49 50 54 3f   objv, "?SCRIPT?
19100 22 29 3b 0a 20 20 20 20 20 20 20 72 65 74 75 72  ");.       retur
19110 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
19120 20 7d 0a 0a 20 20 20 20 44 62 48 6f 6f 6b 43 6d   }..    DbHookCm
19130 64 28 69 6e 74 65 72 70 2c 20 70 44 62 2c 20 28  d(interp, pDb, (
19140 6f 62 6a 63 3d 3d 33 20 3f 20 6f 62 6a 76 5b 32  objc==3 ? objv[2
19150 5d 20 3a 20 30 29 2c 20 70 70 48 6f 6f 6b 29 3b  ] : 0), ppHook);
19160 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
19170 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 76 65 72  .  /*    $db ver
19180 73 69 6f 6e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52  sion.  **.  ** R
19190 65 74 75 72 6e 20 74 68 65 20 76 65 72 73 69 6f  eturn the versio
191a0 6e 20 73 74 72 69 6e 67 20 66 6f 72 20 74 68 69  n string for thi
191b0 73 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f  s database..  */
191c0 0a 20 20 63 61 73 65 20 44 42 5f 56 45 52 53 49  .  case DB_VERSI
191d0 4f 4e 3a 20 7b 0a 20 20 20 20 54 63 6c 5f 53 65  ON: {.    Tcl_Se
191e0 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  tResult(interp, 
191f0 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f  (char *)sqlite3_
19200 6c 69 62 76 65 72 73 69 6f 6e 28 29 2c 20 54 43  libversion(), TC
19210 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 62  L_STATIC);.    b
19220 72 65 61 6b 3b 0a 20 20 7d 0a 0a 0a 20 20 7d 20  reak;.  }...  } 
19230 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 53 57  /* End of the SW
19240 49 54 43 48 20 73 74 61 74 65 6d 65 6e 74 20 2a  ITCH statement *
19250 2f 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  /.  return rc;.}
19260 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 43 4c  ..#if SQLITE_TCL
19270 5f 4e 52 45 0a 2f 2a 0a 2a 2a 20 41 64 61 70 74  _NRE./*.** Adapt
19280 6f 72 20 74 68 61 74 20 70 72 6f 76 69 64 65 73  or that provides
19290 20 61 6e 20 6f 62 6a 43 6d 64 20 69 6e 74 65 72   an objCmd inter
192a0 66 61 63 65 20 74 6f 20 74 68 65 20 4e 52 45 2d  face to the NRE-
192b0 65 6e 61 62 6c 65 64 0a 2a 2a 20 69 6e 74 65 72  enabled.** inter
192c0 66 61 63 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74  face implementat
192d0 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
192e0 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49  nt SQLITE_TCLAPI
192f0 20 44 62 4f 62 6a 43 6d 64 41 64 61 70 74 6f 72   DbObjCmdAdaptor
19300 28 0a 20 20 76 6f 69 64 20 2a 63 64 2c 0a 20 20  (.  void *cd,.  
19310 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
19320 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
19330 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74    Tcl_Obj *const
19340 2a 6f 62 6a 76 0a 29 7b 0a 20 20 72 65 74 75 72  *objv.){.  retur
19350 6e 20 54 63 6c 5f 4e 52 43 61 6c 6c 4f 62 6a 50  n Tcl_NRCallObjP
19360 72 6f 63 28 69 6e 74 65 72 70 2c 20 44 62 4f 62  roc(interp, DbOb
19370 6a 43 6d 64 2c 20 63 64 2c 20 6f 62 6a 63 2c 20  jCmd, cd, objc, 
19380 6f 62 6a 76 29 3b 0a 7d 0a 23 65 6e 64 69 66 20  objv);.}.#endif 
19390 2f 2a 20 53 51 4c 49 54 45 5f 54 43 4c 5f 4e 52  /* SQLITE_TCL_NR
193a0 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 20 20 73 71  E */../*.**   sq
193b0 6c 69 74 65 33 20 44 42 4e 41 4d 45 20 46 49 4c  lite3 DBNAME FIL
193c0 45 4e 41 4d 45 20 3f 2d 76 66 73 20 56 46 53 4e  ENAME ?-vfs VFSN
193d0 41 4d 45 3f 20 3f 2d 6b 65 79 20 4b 45 59 3f 20  AME? ?-key KEY? 
193e0 3f 2d 72 65 61 64 6f 6e 6c 79 20 42 4f 4f 4c 45  ?-readonly BOOLE
193f0 41 4e 3f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  AN?.**          
19400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19410 20 3f 2d 63 72 65 61 74 65 20 42 4f 4f 4c 45 41   ?-create BOOLEA
19420 4e 3f 20 3f 2d 6e 6f 6d 75 74 65 78 20 42 4f 4f  N? ?-nomutex BOO
19430 4c 45 41 4e 3f 0a 2a 2a 0a 2a 2a 20 54 68 69 73  LEAN?.**.** This
19440 20 69 73 20 74 68 65 20 6d 61 69 6e 20 54 63 6c   is the main Tcl
19450 20 63 6f 6d 6d 61 6e 64 2e 20 20 57 68 65 6e 20   command.  When 
19460 74 68 65 20 22 73 71 6c 69 74 65 22 20 54 63 6c  the "sqlite" Tcl
19470 20 63 6f 6d 6d 61 6e 64 20 69 73 0a 2a 2a 20 69   command is.** i
19480 6e 76 6f 6b 65 64 2c 20 74 68 69 73 20 72 6f 75  nvoked, this rou
19490 74 69 6e 65 20 72 75 6e 73 20 74 6f 20 70 72 6f  tine runs to pro
194a0 63 65 73 73 20 74 68 61 74 20 63 6f 6d 6d 61 6e  cess that comman
194b0 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72  d..**.** The fir
194c0 73 74 20 61 72 67 75 6d 65 6e 74 2c 20 44 42 4e  st argument, DBN
194d0 41 4d 45 2c 20 69 73 20 61 6e 20 61 72 62 69 74  AME, is an arbit
194e0 72 61 72 79 20 6e 61 6d 65 20 66 6f 72 20 61 20  rary name for a 
194f0 6e 65 77 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  new.** database 
19500 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 20 54 68 69  connection.  Thi
19510 73 20 63 6f 6d 6d 61 6e 64 20 63 72 65 61 74 65  s command create
19520 73 20 61 20 6e 65 77 20 63 6f 6d 6d 61 6e 64 20  s a new command 
19530 6e 61 6d 65 64 0a 2a 2a 20 44 42 4e 41 4d 45 20  named.** DBNAME 
19540 74 68 61 74 20 69 73 20 75 73 65 64 20 74 6f 20  that is used to 
19550 63 6f 6e 74 72 6f 6c 20 74 68 61 74 20 63 6f 6e  control that con
19560 6e 65 63 74 69 6f 6e 2e 20 20 54 68 65 20 64 61  nection.  The da
19570 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63  tabase.** connec
19580 74 69 6f 6e 20 69 73 20 64 65 6c 65 74 65 64 20  tion is deleted 
19590 77 68 65 6e 20 74 68 65 20 44 42 4e 41 4d 45 20  when the DBNAME 
195a0 63 6f 6d 6d 61 6e 64 20 69 73 20 64 65 6c 65 74  command is delet
195b0 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 65  ed..**.** The se
195c0 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73  cond argument is
195d0 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
195e0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
195f0 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  **.*/.static int
19600 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 44   SQLITE_TCLAPI D
19610 62 4d 61 69 6e 28 0a 20 20 76 6f 69 64 20 2a 63  bMain(.  void *c
19620 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  d,.  Tcl_Interp 
19630 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
19640 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
19650 63 6f 6e 73 74 2a 6f 62 6a 76 0a 29 7b 0a 20 20  const*objv.){.  
19660 53 71 6c 69 74 65 44 62 20 2a 70 3b 0a 20 20 63  SqliteDb *p;.  c
19670 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67 3b  onst char *zArg;
19680 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67  .  char *zErrMsg
19690 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e  ;.  int i;.  con
196a0 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 3b 0a  st char *zFile;.
196b0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56    const char *zV
196c0 66 73 20 3d 20 30 3b 0a 20 20 69 6e 74 20 66 6c  fs = 0;.  int fl
196d0 61 67 73 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69  ags;.  Tcl_DStri
196e0 6e 67 20 74 72 61 6e 73 6c 61 74 65 64 46 69 6c  ng translatedFil
196f0 65 6e 61 6d 65 3b 0a 23 69 66 20 64 65 66 69 6e  ename;.#if defin
19700 65 64 28 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  ed(SQLITE_HAS_CO
19710 44 45 43 29 20 26 26 20 21 64 65 66 69 6e 65 64  DEC) && !defined
19720 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 44  (SQLITE_OMIT_COD
19730 45 43 5f 46 52 4f 4d 5f 54 43 4c 29 0a 20 20 76  EC_FROM_TCL).  v
19740 6f 69 64 20 2a 70 4b 65 79 20 3d 20 30 3b 0a 20  oid *pKey = 0;. 
19750 20 69 6e 74 20 6e 4b 65 79 20 3d 20 30 3b 0a 23   int nKey = 0;.#
19760 65 6e 64 69 66 0a 20 20 69 6e 74 20 72 63 3b 0a  endif.  int rc;.
19770 0a 20 20 2f 2a 20 49 6e 20 6e 6f 72 6d 61 6c 20  .  /* In normal 
19780 75 73 65 2c 20 65 61 63 68 20 54 43 4c 20 69 6e  use, each TCL in
19790 74 65 72 70 72 65 74 65 72 20 72 75 6e 73 20 69  terpreter runs i
197a0 6e 20 61 20 73 69 6e 67 6c 65 20 74 68 72 65 61  n a single threa
197b0 64 2e 20 20 53 6f 0a 20 20 2a 2a 20 62 79 20 64  d.  So.  ** by d
197c0 65 66 61 75 6c 74 2c 20 77 65 20 63 61 6e 20 74  efault, we can t
197d0 75 72 6e 20 6f 66 20 6d 75 74 65 78 69 6e 67 20  urn of mutexing 
197e0 6f 6e 20 53 51 4c 69 74 65 20 64 61 74 61 62 61  on SQLite databa
197f0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 0a  se connections..
19800 20 20 2a 2a 20 48 6f 77 65 76 65 72 2c 20 66 6f    ** However, fo
19810 72 20 74 65 73 74 69 6e 67 20 70 75 72 70 6f 73  r testing purpos
19820 65 73 20 69 74 20 69 73 20 75 73 65 66 75 6c 20  es it is useful 
19830 74 6f 20 68 61 76 65 20 6d 75 74 65 78 65 73 20  to have mutexes 
19840 74 75 72 6e 65 64 0a 20 20 2a 2a 20 6f 6e 2e 20  turned.  ** on. 
19850 20 53 6f 2c 20 62 79 20 64 65 66 61 75 6c 74 2c   So, by default,
19860 20 6d 75 74 65 78 65 73 20 64 65 66 61 75 6c 74   mutexes default
19870 20 6f 66 66 2e 20 20 42 75 74 20 69 66 20 63 6f   off.  But if co
19880 6d 70 69 6c 65 64 20 77 69 74 68 0a 20 20 2a 2a  mpiled with.  **
19890 20 53 51 4c 49 54 45 5f 54 43 4c 5f 44 45 46 41   SQLITE_TCL_DEFA
198a0 55 4c 54 5f 46 55 4c 4c 4d 55 54 45 58 20 74 68  ULT_FULLMUTEX th
198b0 65 6e 20 6d 75 74 65 78 65 73 20 64 65 66 61 75  en mutexes defau
198c0 6c 74 20 6f 6e 2e 0a 20 20 2a 2f 0a 23 69 66 64  lt on..  */.#ifd
198d0 65 66 20 53 51 4c 49 54 45 5f 54 43 4c 5f 44 45  ef SQLITE_TCL_DE
198e0 46 41 55 4c 54 5f 46 55 4c 4c 4d 55 54 45 58 0a  FAULT_FULLMUTEX.
198f0 20 20 66 6c 61 67 73 20 3d 20 53 51 4c 49 54 45    flags = SQLITE
19900 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20  _OPEN_READWRITE 
19910 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  | SQLITE_OPEN_CR
19920 45 41 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50  EATE | SQLITE_OP
19930 45 4e 5f 46 55 4c 4c 4d 55 54 45 58 3b 0a 23 65  EN_FULLMUTEX;.#e
19940 6c 73 65 0a 20 20 66 6c 61 67 73 20 3d 20 53 51  lse.  flags = SQ
19950 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
19960 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45  ITE | SQLITE_OPE
19970 4e 5f 43 52 45 41 54 45 20 7c 20 53 51 4c 49 54  N_CREATE | SQLIT
19980 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58 3b 0a  E_OPEN_NOMUTEX;.
19990 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 6f 62  #endif..  if( ob
199a0 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20 7a 41 72  jc==2 ){.    zAr
199b0 67 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  g = Tcl_GetStrin
199c0 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d  gFromObj(objv[1]
199d0 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 73 74  , 0);.    if( st
199e0 72 63 6d 70 28 7a 41 72 67 2c 22 2d 76 65 72 73  rcmp(zArg,"-vers
199f0 69 6f 6e 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ion")==0 ){.    
19a00 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
19a10 6c 74 28 69 6e 74 65 72 70 2c 73 71 6c 69 74 65  lt(interp,sqlite
19a20 33 5f 6c 69 62 76 65 72 73 69 6f 6e 28 29 2c 20  3_libversion(), 
19a30 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20  (char*)0);.     
19a40 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
19a50 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 74      }.    if( st
19a60 72 63 6d 70 28 7a 41 72 67 2c 22 2d 73 6f 75 72  rcmp(zArg,"-sour
19a70 63 65 69 64 22 29 3d 3d 30 20 29 7b 0a 20 20 20  ceid")==0 ){.   
19a80 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
19a90 75 6c 74 28 69 6e 74 65 72 70 2c 73 71 6c 69 74  ult(interp,sqlit
19aa0 65 33 5f 73 6f 75 72 63 65 69 64 28 29 2c 20 28  e3_sourceid(), (
19ab0 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20  char*)0);.      
19ac0 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20  return TCL_OK;. 
19ad0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 74 72     }.    if( str
19ae0 63 6d 70 28 7a 41 72 67 2c 22 2d 68 61 73 2d 63  cmp(zArg,"-has-c
19af0 6f 64 65 63 22 29 3d 3d 30 20 29 7b 0a 23 69 66  odec")==0 ){.#if
19b00 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
19b10 48 41 53 5f 43 4f 44 45 43 29 20 26 26 20 21 64  HAS_CODEC) && !d
19b20 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
19b30 49 54 5f 43 4f 44 45 43 5f 46 52 4f 4d 5f 54 43  IT_CODEC_FROM_TC
19b40 4c 29 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70  L).      Tcl_App
19b50 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
19b60 2c 22 31 22 2c 28 63 68 61 72 2a 29 30 29 3b 0a  ,"1",(char*)0);.
19b70 23 65 6c 73 65 0a 20 20 20 20 20 20 54 63 6c 5f  #else.      Tcl_
19b80 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
19b90 65 72 70 2c 22 30 22 2c 28 63 68 61 72 2a 29 30  erp,"0",(char*)0
19ba0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  );.#endif.      
19bb0 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20  return TCL_OK;. 
19bc0 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69     }.  }.  for(i
19bd0 3d 33 3b 20 69 2b 31 3c 6f 62 6a 63 3b 20 69 2b  =3; i+1<objc; i+
19be0 3d 32 29 7b 0a 20 20 20 20 7a 41 72 67 20 3d 20  =2){.    zArg = 
19bf0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
19c00 6a 76 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28 20  jv[i]);.    if( 
19c10 73 74 72 63 6d 70 28 7a 41 72 67 2c 22 2d 6b 65  strcmp(zArg,"-ke
19c20 79 22 29 3d 3d 30 20 29 7b 0a 23 69 66 20 64 65  y")==0 ){.#if de
19c30 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 48 41 53  fined(SQLITE_HAS
19c40 5f 43 4f 44 45 43 29 20 26 26 20 21 64 65 66 69  _CODEC) && !defi
19c50 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
19c60 43 4f 44 45 43 5f 46 52 4f 4d 5f 54 43 4c 29 0a  CODEC_FROM_TCL).
19c70 20 20 20 20 20 20 70 4b 65 79 20 3d 20 54 63 6c        pKey = Tcl
19c80 5f 47 65 74 42 79 74 65 41 72 72 61 79 46 72 6f  _GetByteArrayFro
19c90 6d 4f 62 6a 28 6f 62 6a 76 5b 69 2b 31 5d 2c 20  mObj(objv[i+1], 
19ca0 26 6e 4b 65 79 29 3b 0a 23 65 6e 64 69 66 0a 20  &nKey);.#endif. 
19cb0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
19cc0 63 6d 70 28 7a 41 72 67 2c 20 22 2d 76 66 73 22  cmp(zArg, "-vfs"
19cd0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 56  )==0 ){.      zV
19ce0 66 73 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  fs = Tcl_GetStri
19cf0 6e 67 28 6f 62 6a 76 5b 69 2b 31 5d 29 3b 0a 20  ng(objv[i+1]);. 
19d00 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
19d10 63 6d 70 28 7a 41 72 67 2c 20 22 2d 72 65 61 64  cmp(zArg, "-read
19d20 6f 6e 6c 79 22 29 3d 3d 30 20 29 7b 0a 20 20 20  only")==0 ){.   
19d30 20 20 20 69 6e 74 20 62 3b 0a 20 20 20 20 20 20     int b;.      
19d40 69 66 28 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65  if( Tcl_GetBoole
19d50 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  anFromObj(interp
19d60 2c 20 6f 62 6a 76 5b 69 2b 31 5d 2c 20 26 62 29  , objv[i+1], &b)
19d70 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
19d80 52 4f 52 3b 0a 20 20 20 20 20 20 69 66 28 20 62  ROR;.      if( b
19d90 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6c 61 67   ){.        flag
19da0 73 20 26 3d 20 7e 28 53 51 4c 49 54 45 5f 4f 50  s &= ~(SQLITE_OP
19db0 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c  EN_READWRITE|SQL
19dc0 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 29  ITE_OPEN_CREATE)
19dd0 3b 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73 20  ;.        flags 
19de0 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  |= SQLITE_OPEN_R
19df0 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d  EADONLY;.      }
19e00 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66 6c  else{.        fl
19e10 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 4f  ags &= ~SQLITE_O
19e20 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20  PEN_READONLY;.  
19e30 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 53        flags |= S
19e40 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
19e50 52 49 54 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20  RITE;.      }.  
19e60 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
19e70 6d 70 28 7a 41 72 67 2c 20 22 2d 63 72 65 61 74  mp(zArg, "-creat
19e80 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  e")==0 ){.      
19e90 69 6e 74 20 62 3b 0a 20 20 20 20 20 20 69 66 28  int b;.      if(
19ea0 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46   Tcl_GetBooleanF
19eb0 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
19ec0 62 6a 76 5b 69 2b 31 5d 2c 20 26 62 29 20 29 20  bjv[i+1], &b) ) 
19ed0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
19ee0 3b 0a 20 20 20 20 20 20 69 66 28 20 62 20 26 26  ;.      if( b &&
19ef0 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
19f00 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3d  _OPEN_READONLY)=
19f10 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6c  =0 ){.        fl
19f20 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50  ags |= SQLITE_OP
19f30 45 4e 5f 43 52 45 41 54 45 3b 0a 20 20 20 20 20  EN_CREATE;.     
19f40 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
19f50 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45  flags &= ~SQLITE
19f60 5f 4f 50 45 4e 5f 43 52 45 41 54 45 3b 0a 20 20  _OPEN_CREATE;.  
19f70 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
19f80 69 66 28 20 73 74 72 63 6d 70 28 7a 41 72 67 2c  if( strcmp(zArg,
19f90 20 22 2d 6e 6f 6d 75 74 65 78 22 29 3d 3d 30 20   "-nomutex")==0 
19fa0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 62 3b 0a  ){.      int b;.
19fb0 20 20 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65        if( Tcl_Ge
19fc0 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28  tBooleanFromObj(
19fd0 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 69 2b 31  interp, objv[i+1
19fe0 5d 2c 20 26 62 29 20 29 20 72 65 74 75 72 6e 20  ], &b) ) return 
19ff0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  TCL_ERROR;.     
1a000 20 69 66 28 20 62 20 29 7b 0a 20 20 20 20 20 20   if( b ){.      
1a010 20 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54    flags |= SQLIT
1a020 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58 3b 0a  E_OPEN_NOMUTEX;.
1a030 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 26 3d          flags &=
1a040 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55   ~SQLITE_OPEN_FU
1a050 4c 4c 4d 55 54 45 58 3b 0a 20 20 20 20 20 20 7d  LLMUTEX;.      }
1a060 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66 6c  else{.        fl
1a070 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 4f  ags &= ~SQLITE_O
1a080 50 45 4e 5f 4e 4f 4d 55 54 45 58 3b 0a 20 20 20  PEN_NOMUTEX;.   
1a090 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69     }.    }else i
1a0a0 66 28 20 73 74 72 63 6d 70 28 7a 41 72 67 2c 20  f( strcmp(zArg, 
1a0b0 22 2d 66 75 6c 6c 6d 75 74 65 78 22 29 3d 3d 30  "-fullmutex")==0
1a0c0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 62 3b   ){.      int b;
1a0d0 0a 20 20 20 20 20 20 69 66 28 20 54 63 6c 5f 47  .      if( Tcl_G
1a0e0 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a  etBooleanFromObj
1a0f0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 69 2b  (interp, objv[i+
1a100 31 5d 2c 20 26 62 29 20 29 20 72 65 74 75 72 6e  1], &b) ) return
1a110 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
1a120 20 20 69 66 28 20 62 20 29 7b 0a 20 20 20 20 20    if( b ){.     
1a130 20 20 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49     flags |= SQLI
1a140 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54 45  TE_OPEN_FULLMUTE
1a150 58 3b 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73  X;.        flags
1a160 20 26 3d 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e   &= ~SQLITE_OPEN
1a170 5f 4e 4f 4d 55 54 45 58 3b 0a 20 20 20 20 20 20  _NOMUTEX;.      
1a180 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66  }else{.        f
1a190 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f  lags &= ~SQLITE_
1a1a0 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54 45 58 3b 0a  OPEN_FULLMUTEX;.
1a1b0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
1a1c0 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 41 72  e if( strcmp(zAr
1a1d0 67 2c 20 22 2d 75 72 69 22 29 3d 3d 30 20 29 7b  g, "-uri")==0 ){
1a1e0 0a 20 20 20 20 20 20 69 6e 74 20 62 3b 0a 20 20  .      int b;.  
1a1f0 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 42      if( Tcl_GetB
1a200 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e  ooleanFromObj(in
1a210 74 65 72 70 2c 20 6f 62 6a 76 5b 69 2b 31 5d 2c  terp, objv[i+1],
1a220 20 26 62 29 20 29 20 72 65 74 75 72 6e 20 54 43   &b) ) return TC
1a230 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 69  L_ERROR;.      i
1a240 66 28 20 62 20 29 7b 0a 20 20 20 20 20 20 20 20  f( b ){.        
1a250 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  flags |= SQLITE_
1a260 4f 50 45 4e 5f 55 52 49 3b 0a 20 20 20 20 20 20  OPEN_URI;.      
1a270 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66  }else{.        f
1a280 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f  lags &= ~SQLITE_
1a290 4f 50 45 4e 5f 55 52 49 3b 0a 20 20 20 20 20 20  OPEN_URI;.      
1a2a0 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
1a2b0 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
1a2c0 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 6b  ult(interp, "unk
1a2d0 6e 6f 77 6e 20 6f 70 74 69 6f 6e 3a 20 22 2c 20  nown option: ", 
1a2e0 7a 41 72 67 2c 20 28 63 68 61 72 2a 29 30 29 3b  zArg, (char*)0);
1a2f0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
1a300 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
1a310 20 7d 0a 20 20 69 66 28 20 6f 62 6a 63 3c 33 20   }.  if( objc<3 
1a320 7c 7c 20 28 6f 62 6a 63 26 31 29 21 3d 31 20 29  || (objc&1)!=1 )
1a330 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
1a340 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
1a350 2c 20 6f 62 6a 76 2c 0a 20 20 20 20 20 20 22 48  , objv,.      "H
1a360 41 4e 44 4c 45 20 46 49 4c 45 4e 41 4d 45 20 3f  ANDLE FILENAME ?
1a370 2d 76 66 73 20 56 46 53 4e 41 4d 45 3f 20 3f 2d  -vfs VFSNAME? ?-
1a380 72 65 61 64 6f 6e 6c 79 20 42 4f 4f 4c 45 41 4e  readonly BOOLEAN
1a390 3f 20 3f 2d 63 72 65 61 74 65 20 42 4f 4f 4c 45  ? ?-create BOOLE
1a3a0 41 4e 3f 22 0a 20 20 20 20 20 20 22 20 3f 2d 6e  AN?".      " ?-n
1a3b0 6f 6d 75 74 65 78 20 42 4f 4f 4c 45 41 4e 3f 20  omutex BOOLEAN? 
1a3c0 3f 2d 66 75 6c 6c 6d 75 74 65 78 20 42 4f 4f 4c  ?-fullmutex BOOL
1a3d0 45 41 4e 3f 20 3f 2d 75 72 69 20 42 4f 4f 4c 45  EAN? ?-uri BOOLE
1a3e0 41 4e 3f 22 0a 23 69 66 20 64 65 66 69 6e 65 64  AN?".#if defined
1a3f0 28 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45  (SQLITE_HAS_CODE
1a400 43 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  C) && !defined(S
1a410 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 44 45 43  QLITE_OMIT_CODEC
1a420 5f 46 52 4f 4d 5f 54 43 4c 29 0a 20 20 20 20 20  _FROM_TCL).     
1a430 20 22 20 3f 2d 6b 65 79 20 43 4f 44 45 43 4b 45   " ?-key CODECKE
1a440 59 3f 22 0a 23 65 6e 64 69 66 0a 20 20 20 20 29  Y?".#endif.    )
1a450 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
1a460 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 45  _ERROR;.  }.  zE
1a470 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 70 20 3d  rrMsg = 0;.  p =
1a480 20 28 53 71 6c 69 74 65 44 62 2a 29 54 63 6c 5f   (SqliteDb*)Tcl_
1a490 41 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70  Alloc( sizeof(*p
1a4a0 29 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70 2c  ) );.  memset(p,
1a4b0 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b   0, sizeof(*p));
1a4c0 0a 20 20 7a 46 69 6c 65 20 3d 20 54 63 6c 5f 47  .  zFile = Tcl_G
1a4d0 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
1a4e0 6f 62 6a 76 5b 32 5d 2c 20 30 29 3b 0a 20 20 7a  objv[2], 0);.  z
1a4f0 46 69 6c 65 20 3d 20 54 63 6c 5f 54 72 61 6e 73  File = Tcl_Trans
1a500 6c 61 74 65 46 69 6c 65 4e 61 6d 65 28 69 6e 74  lateFileName(int
1a510 65 72 70 2c 20 7a 46 69 6c 65 2c 20 26 74 72 61  erp, zFile, &tra
1a520 6e 73 6c 61 74 65 64 46 69 6c 65 6e 61 6d 65 29  nslatedFilename)
1a530 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
1a540 5f 6f 70 65 6e 5f 76 32 28 7a 46 69 6c 65 2c 20  _open_v2(zFile, 
1a550 26 70 2d 3e 64 62 2c 20 66 6c 61 67 73 2c 20 7a  &p->db, flags, z
1a560 56 66 73 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72  Vfs);.  Tcl_DStr
1a570 69 6e 67 46 72 65 65 28 26 74 72 61 6e 73 6c 61  ingFree(&transla
1a580 74 65 64 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  tedFilename);.  
1a590 69 66 28 20 70 2d 3e 64 62 20 29 7b 0a 20 20 20  if( p->db ){.   
1a5a0 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
1a5b0 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28  sqlite3_errcode(
1a5c0 70 2d 3e 64 62 29 20 29 7b 0a 20 20 20 20 20 20  p->db) ){.      
1a5d0 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65  zErrMsg = sqlite
1a5e0 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20  3_mprintf("%s", 
1a5f0 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70  sqlite3_errmsg(p
1a600 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20 20 73 71  ->db));.      sq
1a610 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70 2d 3e 64  lite3_close(p->d
1a620 62 29 3b 0a 20 20 20 20 20 20 70 2d 3e 64 62 20  b);.      p->db 
1a630 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  = 0;.    }.  }el
1a640 73 65 7b 0a 20 20 20 20 7a 45 72 72 4d 73 67 20  se{.    zErrMsg 
1a650 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
1a660 66 28 22 25 73 22 2c 20 73 71 6c 69 74 65 33 5f  f("%s", sqlite3_
1a670 65 72 72 73 74 72 28 72 63 29 29 3b 0a 20 20 7d  errstr(rc));.  }
1a680 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
1a690 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 29 20 26  ITE_HAS_CODEC) &
1a6a0 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
1a6b0 45 5f 4f 4d 49 54 5f 43 4f 44 45 43 5f 46 52 4f  E_OMIT_CODEC_FRO
1a6c0 4d 5f 54 43 4c 29 0a 20 20 69 66 28 20 70 2d 3e  M_TCL).  if( p->
1a6d0 64 62 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  db ){.    sqlite
1a6e0 33 5f 6b 65 79 28 70 2d 3e 64 62 2c 20 70 4b 65  3_key(p->db, pKe
1a6f0 79 2c 20 6e 4b 65 79 29 3b 0a 20 20 7d 0a 23 65  y, nKey);.  }.#e
1a700 6e 64 69 66 0a 20 20 69 66 28 20 70 2d 3e 64 62  ndif.  if( p->db
1a710 3d 3d 30 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53  ==0 ){.    Tcl_S
1a720 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
1a730 20 7a 45 72 72 4d 73 67 2c 20 54 43 4c 5f 56 4f   zErrMsg, TCL_VO
1a740 4c 41 54 49 4c 45 29 3b 0a 20 20 20 20 54 63 6c  LATILE);.    Tcl
1a750 5f 46 72 65 65 28 28 63 68 61 72 2a 29 70 29 3b  _Free((char*)p);
1a760 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
1a770 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20  e(zErrMsg);.    
1a780 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1a790 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d 61 78 53 74  ;.  }.  p->maxSt
1a7a0 6d 74 20 3d 20 4e 55 4d 5f 50 52 45 50 41 52 45  mt = NUM_PREPARE
1a7b0 44 5f 53 54 4d 54 53 3b 0a 20 20 70 2d 3e 6f 70  D_STMTS;.  p->op
1a7c0 65 6e 46 6c 61 67 73 20 3d 20 66 6c 61 67 73 20  enFlags = flags 
1a7d0 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52  & SQLITE_OPEN_UR
1a7e0 49 3b 0a 20 20 70 2d 3e 69 6e 74 65 72 70 20 3d  I;.  p->interp =
1a7f0 20 69 6e 74 65 72 70 3b 0a 20 20 7a 41 72 67 20   interp;.  zArg 
1a800 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  = Tcl_GetStringF
1a810 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20  romObj(objv[1], 
1a820 30 29 3b 0a 20 20 69 66 28 20 44 62 55 73 65 4e  0);.  if( DbUseN
1a830 72 65 28 29 20 29 7b 0a 20 20 20 20 54 63 6c 5f  re() ){.    Tcl_
1a840 4e 52 43 72 65 61 74 65 43 6f 6d 6d 61 6e 64 28  NRCreateCommand(
1a850 69 6e 74 65 72 70 2c 20 7a 41 72 67 2c 20 44 62  interp, zArg, Db
1a860 4f 62 6a 43 6d 64 41 64 61 70 74 6f 72 2c 20 44  ObjCmdAdaptor, D
1a870 62 4f 62 6a 43 6d 64 2c 0a 20 20 20 20 20 20 20  bObjCmd,.       
1a880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a890 20 28 63 68 61 72 2a 29 70 2c 20 44 62 44 65 6c   (char*)p, DbDel
1a8a0 65 74 65 43 6d 64 29 3b 0a 20 20 7d 65 6c 73 65  eteCmd);.  }else
1a8b0 7b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65  {.    Tcl_Create
1a8c0 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72  ObjCommand(inter
1a8d0 70 2c 20 7a 41 72 67 2c 20 44 62 4f 62 6a 43 6d  p, zArg, DbObjCm
1a8e0 64 2c 20 28 63 68 61 72 2a 29 70 2c 20 44 62 44  d, (char*)p, DbD
1a8f0 65 6c 65 74 65 43 6d 64 29 3b 0a 20 20 7d 0a 20  eleteCmd);.  }. 
1a900 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
1a910 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 76 69 64 65  }../*.** Provide
1a920 20 61 20 64 75 6d 6d 79 20 54 63 6c 5f 49 6e 69   a dummy Tcl_Ini
1a930 74 53 74 75 62 73 20 69 66 20 77 65 20 61 72 65  tStubs if we are
1a940 20 75 73 69 6e 67 20 74 68 69 73 20 61 73 20 61   using this as a
1a950 20 73 74 61 74 69 63 0a 2a 2a 20 6c 69 62 72 61   static.** libra
1a960 72 79 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 55  ry..*/.#ifndef U
1a970 53 45 5f 54 43 4c 5f 53 54 55 42 53 0a 23 20 75  SE_TCL_STUBS.# u
1a980 6e 64 65 66 20 20 54 63 6c 5f 49 6e 69 74 53 74  ndef  Tcl_InitSt
1a990 75 62 73 0a 23 20 64 65 66 69 6e 65 20 54 63 6c  ubs.# define Tcl
1a9a0 5f 49 6e 69 74 53 74 75 62 73 28 61 2c 62 2c 63  _InitStubs(a,b,c
1a9b0 29 20 54 43 4c 5f 56 45 52 53 49 4f 4e 0a 23 65  ) TCL_VERSION.#e
1a9c0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65  ndif../*.** Make
1a9d0 20 73 75 72 65 20 77 65 20 68 61 76 65 20 61 20   sure we have a 
1a9e0 50 41 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e 20  PACKAGE_VERSION 
1a9f0 6d 61 63 72 6f 20 64 65 66 69 6e 65 64 2e 20 20  macro defined.  
1aa00 54 68 69 73 20 77 69 6c 6c 20 62 65 0a 2a 2a 20  This will be.** 
1aa10 64 65 66 69 6e 65 64 20 61 75 74 6f 6d 61 74 69  defined automati
1aa20 63 61 6c 6c 79 20 62 79 20 74 68 65 20 54 45 41  cally by the TEA
1aa30 20 6d 61 6b 65 66 69 6c 65 2e 20 20 42 75 74 20   makefile.  But 
1aa40 6f 74 68 65 72 20 6d 61 6b 65 66 69 6c 65 73 0a  other makefiles.
1aa50 2a 2a 20 64 6f 20 6e 6f 74 20 64 65 66 69 6e 65  ** do not define
1aa60 20 69 74 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20   it..*/.#ifndef 
1aa70 50 41 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e 0a  PACKAGE_VERSION.
1aa80 23 20 64 65 66 69 6e 65 20 50 41 43 4b 41 47 45  # define PACKAGE
1aa90 5f 56 45 52 53 49 4f 4e 20 53 51 4c 49 54 45 5f  _VERSION SQLITE_
1aaa0 56 45 52 53 49 4f 4e 0a 23 65 6e 64 69 66 0a 0a  VERSION.#endif..
1aab0 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65  /*.** Initialize
1aac0 20 74 68 69 73 20 6d 6f 64 75 6c 65 2e 0a 2a 2a   this module..**
1aad0 0a 2a 2a 20 54 68 69 73 20 54 63 6c 20 6d 6f 64  .** This Tcl mod
1aae0 75 6c 65 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 6c  ule contains onl
1aaf0 79 20 61 20 73 69 6e 67 6c 65 20 6e 65 77 20 54  y a single new T
1ab00 63 6c 20 63 6f 6d 6d 61 6e 64 20 6e 61 6d 65 64  cl command named
1ab10 20 22 73 71 6c 69 74 65 22 2e 0a 2a 2a 20 28 48   "sqlite"..** (H
1ab20 65 6e 63 65 20 74 68 65 72 65 20 69 73 20 6e 6f  ence there is no
1ab30 20 6e 61 6d 65 73 70 61 63 65 2e 20 20 54 68 65   namespace.  The
1ab40 72 65 20 69 73 20 6e 6f 20 70 6f 69 6e 74 20 69  re is no point i
1ab50 6e 20 75 73 69 6e 67 20 61 20 6e 61 6d 65 73 70  n using a namesp
1ab60 61 63 65 0a 2a 2a 20 69 66 20 74 68 65 20 65 78  ace.** if the ex
1ab70 74 65 6e 73 69 6f 6e 20 6f 6e 6c 79 20 73 75 70  tension only sup
1ab80 70 6c 69 65 73 20 6f 6e 65 20 6e 65 77 20 6e 61  plies one new na
1ab90 6d 65 21 29 20 20 54 68 65 20 22 73 71 6c 69 74  me!)  The "sqlit
1aba0 65 22 20 63 6f 6d 6d 61 6e 64 20 69 73 0a 2a 2a  e" command is.**
1abb0 20 75 73 65 64 20 74 6f 20 6f 70 65 6e 20 61 20   used to open a 
1abc0 6e 65 77 20 53 51 4c 69 74 65 20 64 61 74 61 62  new SQLite datab
1abd0 61 73 65 2e 20 20 53 65 65 20 74 68 65 20 44 62  ase.  See the Db
1abe0 4d 61 69 6e 28 29 20 72 6f 75 74 69 6e 65 20 61  Main() routine a
1abf0 62 6f 76 65 0a 2a 2a 20 66 6f 72 20 61 64 64 69  bove.** for addi
1ac00 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69  tional informati
1ac10 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 58  on..**.** The EX
1ac20 54 45 52 4e 20 6d 61 63 72 6f 73 20 61 72 65 20  TERN macros are 
1ac30 72 65 71 75 69 72 65 64 20 62 79 20 54 43 4c 20  required by TCL 
1ac40 69 6e 20 6f 72 64 65 72 20 74 6f 20 77 6f 72 6b  in order to work
1ac50 20 6f 6e 20 77 69 6e 64 6f 77 73 2e 0a 2a 2f 0a   on windows..*/.
1ac60 45 58 54 45 52 4e 20 69 6e 74 20 53 71 6c 69 74  EXTERN int Sqlit
1ac70 65 33 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  e3_Init(Tcl_Inte
1ac80 72 70 20 2a 69 6e 74 65 72 70 29 7b 0a 20 20 69  rp *interp){.  i
1ac90 6e 74 20 72 63 20 3d 20 54 63 6c 5f 49 6e 69 74  nt rc = Tcl_Init
1aca0 53 74 75 62 73 28 69 6e 74 65 72 70 2c 20 22 38  Stubs(interp, "8
1acb0 2e 34 22 2c 20 30 29 20 3f 20 54 43 4c 5f 4f 4b  .4", 0) ? TCL_OK
1acc0 20 3a 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20   : TCL_ERROR;.  
1acd0 69 66 28 20 72 63 3d 3d 54 43 4c 5f 4f 4b 20 29  if( rc==TCL_OK )
1ace0 7b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65  {.    Tcl_Create
1acf0 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72  ObjCommand(inter
1ad00 70 2c 20 22 73 71 6c 69 74 65 33 22 2c 20 28 54  p, "sqlite3", (T
1ad10 63 6c 5f 4f 62 6a 43 6d 64 50 72 6f 63 2a 29 44  cl_ObjCmdProc*)D
1ad20 62 4d 61 69 6e 2c 20 30 2c 20 30 29 3b 0a 23 69  bMain, 0, 0);.#i
1ad30 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 33 5f 53  fndef SQLITE_3_S
1ad40 55 46 46 49 58 5f 4f 4e 4c 59 0a 20 20 20 20 2f  UFFIX_ONLY.    /
1ad50 2a 20 54 68 65 20 22 73 71 6c 69 74 65 22 20 61  * The "sqlite" a
1ad60 6c 69 61 73 20 69 73 20 75 6e 64 6f 63 75 6d 65  lias is undocume
1ad70 6e 74 65 64 2e 20 20 49 74 20 69 73 20 68 65 72  nted.  It is her
1ad80 65 20 6f 6e 6c 79 20 74 6f 20 73 75 70 70 6f 72  e only to suppor
1ad90 74 0a 20 20 20 20 2a 2a 20 6c 65 67 61 63 79 20  t.    ** legacy 
1ada0 73 63 72 69 70 74 73 2e 20 20 41 6c 6c 20 6e 65  scripts.  All ne
1adb0 77 20 73 63 72 69 70 74 73 20 73 68 6f 75 6c 64  w scripts should
1adc0 20 75 73 65 20 6f 6e 6c 79 20 74 68 65 20 22 73   use only the "s
1add0 71 6c 69 74 65 33 22 0a 20 20 20 20 2a 2a 20 63  qlite3".    ** c
1ade0 6f 6d 6d 61 6e 64 2e 20 2a 2f 0a 20 20 20 20 54  ommand. */.    T
1adf0 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d  cl_CreateObjComm
1ae00 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 73 71 6c  and(interp, "sql
1ae10 69 74 65 22 2c 20 28 54 63 6c 5f 4f 62 6a 43 6d  ite", (Tcl_ObjCm
1ae20 64 50 72 6f 63 2a 29 44 62 4d 61 69 6e 2c 20 30  dProc*)DbMain, 0
1ae30 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  , 0);.#endif.   
1ae40 20 72 63 20 3d 20 54 63 6c 5f 50 6b 67 50 72 6f   rc = Tcl_PkgPro
1ae50 76 69 64 65 28 69 6e 74 65 72 70 2c 20 22 73 71  vide(interp, "sq
1ae60 6c 69 74 65 33 22 2c 20 50 41 43 4b 41 47 45 5f  lite3", PACKAGE_
1ae70 56 45 52 53 49 4f 4e 29 3b 0a 20 20 7d 0a 20 20  VERSION);.  }.  
1ae80 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 45 58 54  return rc;.}.EXT
1ae90 45 52 4e 20 69 6e 74 20 54 63 6c 73 71 6c 69 74  ERN int Tclsqlit
1aea0 65 33 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  e3_Init(Tcl_Inte
1aeb0 72 70 20 2a 69 6e 74 65 72 70 29 7b 20 72 65 74  rp *interp){ ret
1aec0 75 72 6e 20 53 71 6c 69 74 65 33 5f 49 6e 69 74  urn Sqlite3_Init
1aed0 28 69 6e 74 65 72 70 29 3b 20 7d 0a 45 58 54 45  (interp); }.EXTE
1aee0 52 4e 20 69 6e 74 20 53 71 6c 69 74 65 33 5f 55  RN int Sqlite3_U
1aef0 6e 6c 6f 61 64 28 54 63 6c 5f 49 6e 74 65 72 70  nload(Tcl_Interp
1af00 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 66 6c   *interp, int fl
1af10 61 67 73 29 7b 20 72 65 74 75 72 6e 20 54 43 4c  ags){ return TCL
1af20 5f 4f 4b 3b 20 7d 0a 45 58 54 45 52 4e 20 69 6e  _OK; }.EXTERN in
1af30 74 20 54 63 6c 73 71 6c 69 74 65 33 5f 55 6e 6c  t Tclsqlite3_Unl
1af40 6f 61 64 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a  oad(Tcl_Interp *
1af50 69 6e 74 65 72 70 2c 20 69 6e 74 20 66 6c 61 67  interp, int flag
1af60 73 29 7b 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  s){ return TCL_O
1af70 4b 3b 20 7d 0a 0a 2f 2a 20 42 65 63 61 75 73 65  K; }../* Because
1af80 20 69 74 20 61 63 63 65 73 73 65 73 20 74 68 65   it accesses the
1af90 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 61 6e 64   file-system and
1afa0 20 75 73 65 73 20 70 65 72 73 69 73 74 65 6e 74   uses persistent
1afb0 20 73 74 61 74 65 2c 20 53 51 4c 69 74 65 0a 2a   state, SQLite.*
1afc0 2a 20 69 73 20 6e 6f 74 20 63 6f 6e 73 69 64 65  * is not conside
1afd0 72 65 64 20 61 70 70 72 6f 70 72 69 61 74 65 20  red appropriate 
1afe0 66 6f 72 20 73 61 66 65 20 69 6e 74 65 72 70 72  for safe interpr
1aff0 65 74 65 72 73 2e 20 20 48 65 6e 63 65 2c 20 77  eters.  Hence, w
1b000 65 20 63 61 75 73 65 0a 2a 2a 20 74 68 65 20 5f  e cause.** the _
1b010 53 61 66 65 49 6e 69 74 28 29 20 69 6e 74 65 72  SafeInit() inter
1b020 66 61 63 65 73 20 72 65 74 75 72 6e 20 54 43 4c  faces return TCL
1b030 5f 45 52 52 4f 52 2e 0a 2a 2f 0a 45 58 54 45 52  _ERROR..*/.EXTER
1b040 4e 20 69 6e 74 20 53 71 6c 69 74 65 33 5f 53 61  N int Sqlite3_Sa
1b050 66 65 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  feInit(Tcl_Inter
1b060 70 20 2a 69 6e 74 65 72 70 29 7b 20 72 65 74 75  p *interp){ retu
1b070 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 20 7d 0a  rn TCL_ERROR; }.
1b080 45 58 54 45 52 4e 20 69 6e 74 20 53 71 6c 69 74  EXTERN int Sqlit
1b090 65 33 5f 53 61 66 65 55 6e 6c 6f 61 64 28 54 63  e3_SafeUnload(Tc
1b0a0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
1b0b0 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 72 65 74  , int flags){ret
1b0c0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 7d 0a  urn TCL_ERROR;}.
1b0d0 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ...#ifndef SQLIT
1b0e0 45 5f 33 5f 53 55 46 46 49 58 5f 4f 4e 4c 59 0a  E_3_SUFFIX_ONLY.
1b0f0 69 6e 74 20 53 71 6c 69 74 65 5f 49 6e 69 74 28  int Sqlite_Init(
1b100 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
1b110 72 70 29 7b 20 72 65 74 75 72 6e 20 53 71 6c 69  rp){ return Sqli
1b120 74 65 33 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  te3_Init(interp)
1b130 3b 20 7d 0a 69 6e 74 20 54 63 6c 73 71 6c 69 74  ; }.int Tclsqlit
1b140 65 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  e_Init(Tcl_Inter
1b150 70 20 2a 69 6e 74 65 72 70 29 7b 20 72 65 74 75  p *interp){ retu
1b160 72 6e 20 53 71 6c 69 74 65 33 5f 49 6e 69 74 28  rn Sqlite3_Init(
1b170 69 6e 74 65 72 70 29 3b 20 7d 0a 69 6e 74 20 53  interp); }.int S
1b180 71 6c 69 74 65 5f 55 6e 6c 6f 61 64 28 54 63 6c  qlite_Unload(Tcl
1b190 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
1b1a0 20 69 6e 74 20 66 6c 61 67 73 29 7b 20 72 65 74   int flags){ ret
1b1b0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 7d 0a 69 6e  urn TCL_OK; }.in
1b1c0 74 20 54 63 6c 73 71 6c 69 74 65 5f 55 6e 6c 6f  t Tclsqlite_Unlo
1b1d0 61 64 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  ad(Tcl_Interp *i
1b1e0 6e 74 65 72 70 2c 20 69 6e 74 20 66 6c 61 67 73  nterp, int flags
1b1f0 29 7b 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  ){ return TCL_OK
1b200 3b 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64  ; }.#endif..#ifd
1b210 65 66 20 54 43 4c 53 48 0a 2f 2a 2a 2a 2a 2a 2a  ef TCLSH./******
1b220 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1b230 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1b240 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1b250 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1b260 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f  *******.** All o
1b270 66 20 74 68 65 20 63 6f 64 65 20 74 68 61 74 20  f the code that 
1b280 66 6f 6c 6c 6f 77 73 20 69 73 20 75 73 65 64 20  follows is used 
1b290 74 6f 20 62 75 69 6c 64 20 73 74 61 6e 64 61 6c  to build standal
1b2a0 6f 6e 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  one TCL interpre
1b2b0 74 65 72 73 0a 2a 2a 20 74 68 61 74 20 61 72 65  ters.** that are
1b2c0 20 73 74 61 74 69 63 61 6c 6c 79 20 6c 69 6e 6b   statically link
1b2d0 65 64 20 77 69 74 68 20 53 51 4c 69 74 65 2e 20  ed with SQLite. 
1b2e0 20 45 6e 61 62 6c 65 20 74 68 65 73 65 20 62 79   Enable these by
1b2f0 20 63 6f 6d 70 69 6c 69 6e 67 0a 2a 2a 20 77 69   compiling.** wi
1b300 74 68 20 2d 44 54 43 4c 53 48 3d 6e 20 77 68 65  th -DTCLSH=n whe
1b310 72 65 20 6e 20 63 61 6e 20 62 65 20 31 20 6f 72  re n can be 1 or
1b320 20 32 2e 20 20 41 6e 20 6e 20 6f 66 20 31 20 67   2.  An n of 1 g
1b330 65 6e 65 72 61 74 65 73 20 61 20 73 74 61 6e 64  enerates a stand
1b340 61 72 64 0a 2a 2a 20 74 63 6c 73 68 20 62 75 74  ard.** tclsh but
1b350 20 77 69 74 68 20 53 51 4c 69 74 65 20 62 75 69   with SQLite bui
1b360 6c 74 20 69 6e 2e 20 20 41 6e 20 6e 20 6f 66 20  lt in.  An n of 
1b370 32 20 67 65 6e 65 72 61 74 65 73 20 74 68 65 20  2 generates the 
1b380 53 51 4c 69 74 65 20 73 70 61 63 65 0a 2a 2a 20  SQLite space.** 
1b390 61 6e 61 6c 79 73 69 73 20 70 72 6f 67 72 61 6d  analysis program
1b3a0 2e 0a 2a 2f 0a 0a 23 69 66 20 64 65 66 69 6e 65  ..*/..#if define
1b3b0 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 20 7c  d(SQLITE_TEST) |
1b3c0 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  | defined(SQLITE
1b3d0 5f 54 43 4c 4d 44 35 29 0a 2f 2a 0a 20 2a 20 54  _TCLMD5)./*. * T
1b3e0 68 69 73 20 63 6f 64 65 20 69 6d 70 6c 65 6d 65  his code impleme
1b3f0 6e 74 73 20 74 68 65 20 4d 44 35 20 6d 65 73 73  nts the MD5 mess
1b400 61 67 65 2d 64 69 67 65 73 74 20 61 6c 67 6f 72  age-digest algor
1b410 69 74 68 6d 2e 0a 20 2a 20 54 68 65 20 61 6c 67  ithm.. * The alg
1b420 6f 72 69 74 68 6d 20 69 73 20 64 75 65 20 74 6f  orithm is due to
1b430 20 52 6f 6e 20 52 69 76 65 73 74 2e 20 20 54 68   Ron Rivest.  Th
1b440 69 73 20 63 6f 64 65 20 77 61 73 0a 20 2a 20 77  is code was. * w
1b450 72 69 74 74 65 6e 20 62 79 20 43 6f 6c 69 6e 20  ritten by Colin 
1b460 50 6c 75 6d 62 20 69 6e 20 31 39 39 33 2c 20 6e  Plumb in 1993, n
1b470 6f 20 63 6f 70 79 72 69 67 68 74 20 69 73 20 63  o copyright is c
1b480 6c 61 69 6d 65 64 2e 0a 20 2a 20 54 68 69 73 20  laimed.. * This 
1b490 63 6f 64 65 20 69 73 20 69 6e 20 74 68 65 20 70  code is in the p
1b4a0 75 62 6c 69 63 20 64 6f 6d 61 69 6e 3b 20 64 6f  ublic domain; do
1b4b0 20 77 69 74 68 20 69 74 20 77 68 61 74 20 79 6f   with it what yo
1b4c0 75 20 77 69 73 68 2e 0a 20 2a 0a 20 2a 20 45 71  u wish.. *. * Eq
1b4d0 75 69 76 61 6c 65 6e 74 20 63 6f 64 65 20 69 73  uivalent code is
1b4e0 20 61 76 61 69 6c 61 62 6c 65 20 66 72 6f 6d 20   available from 
1b4f0 52 53 41 20 44 61 74 61 20 53 65 63 75 72 69 74  RSA Data Securit
1b500 79 2c 20 49 6e 63 2e 0a 20 2a 20 54 68 69 73 20  y, Inc.. * This 
1b510 63 6f 64 65 20 68 61 73 20 62 65 65 6e 20 74 65  code has been te
1b520 73 74 65 64 20 61 67 61 69 6e 73 74 20 74 68 61  sted against tha
1b530 74 2c 20 61 6e 64 20 69 73 20 65 71 75 69 76 61  t, and is equiva
1b540 6c 65 6e 74 2c 0a 20 2a 20 65 78 63 65 70 74 20  lent,. * except 
1b550 74 68 61 74 20 79 6f 75 20 64 6f 6e 27 74 20 6e  that you don't n
1b560 65 65 64 20 74 6f 20 69 6e 63 6c 75 64 65 20 74  eed to include t
1b570 77 6f 20 70 61 67 65 73 20 6f 66 20 6c 65 67 61  wo pages of lega
1b580 6c 65 73 65 0a 20 2a 20 77 69 74 68 20 65 76 65  lese. * with eve
1b590 72 79 20 63 6f 70 79 2e 0a 20 2a 0a 20 2a 20 54  ry copy.. *. * T
1b5a0 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20 6d 65  o compute the me
1b5b0 73 73 61 67 65 20 64 69 67 65 73 74 20 6f 66 20  ssage digest of 
1b5c0 61 20 63 68 75 6e 6b 20 6f 66 20 62 79 74 65 73  a chunk of bytes
1b5d0 2c 20 64 65 63 6c 61 72 65 20 61 6e 0a 20 2a 20  , declare an. * 
1b5e0 4d 44 35 43 6f 6e 74 65 78 74 20 73 74 72 75 63  MD5Context struc
1b5f0 74 75 72 65 2c 20 70 61 73 73 20 69 74 20 74 6f  ture, pass it to
1b600 20 4d 44 35 49 6e 69 74 2c 20 63 61 6c 6c 20 4d   MD5Init, call M
1b610 44 35 55 70 64 61 74 65 20 61 73 0a 20 2a 20 6e  D5Update as. * n
1b620 65 65 64 65 64 20 6f 6e 20 62 75 66 66 65 72 73  eeded on buffers
1b630 20 66 75 6c 6c 20 6f 66 20 62 79 74 65 73 2c 20   full of bytes, 
1b640 61 6e 64 20 74 68 65 6e 20 63 61 6c 6c 20 4d 44  and then call MD
1b650 35 46 69 6e 61 6c 2c 20 77 68 69 63 68 0a 20 2a  5Final, which. *
1b660 20 77 69 6c 6c 20 66 69 6c 6c 20 61 20 73 75 70   will fill a sup
1b670 70 6c 69 65 64 20 31 36 2d 62 79 74 65 20 61 72  plied 16-byte ar
1b680 72 61 79 20 77 69 74 68 20 74 68 65 20 64 69 67  ray with the dig
1b690 65 73 74 2e 0a 20 2a 2f 0a 0a 2f 2a 0a 20 2a 20  est.. */../*. * 
1b6a0 49 66 20 63 6f 6d 70 69 6c 65 64 20 6f 6e 20 61  If compiled on a
1b6b0 20 6d 61 63 68 69 6e 65 20 74 68 61 74 20 64 6f   machine that do
1b6c0 65 73 6e 27 74 20 68 61 76 65 20 61 20 33 32 2d  esn't have a 32-
1b6d0 62 69 74 20 69 6e 74 65 67 65 72 2c 0a 20 2a 20  bit integer,. * 
1b6e0 79 6f 75 20 6a 75 73 74 20 73 65 74 20 22 75 69  you just set "ui
1b6f0 6e 74 33 32 22 20 74 6f 20 74 68 65 20 61 70 70  nt32" to the app
1b700 72 6f 70 72 69 61 74 65 20 64 61 74 61 74 79 70  ropriate datatyp
1b710 65 20 66 6f 72 20 61 6e 0a 20 2a 20 75 6e 73 69  e for an. * unsi
1b720 67 6e 65 64 20 33 32 2d 62 69 74 20 69 6e 74 65  gned 32-bit inte
1b730 67 65 72 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c  ger.  For exampl
1b740 65 3a 0a 20 2a 0a 20 2a 20 20 20 20 20 20 20 63  e:. *. *       c
1b750 63 20 2d 44 75 69 6e 74 33 32 3d 27 75 6e 73 69  c -Duint32='unsi
1b760 67 6e 65 64 20 6c 6f 6e 67 27 20 6d 64 35 2e 63  gned long' md5.c
1b770 0a 20 2a 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20  . *. */.#ifndef 
1b780 75 69 6e 74 33 32 0a 23 20 20 64 65 66 69 6e 65  uint32.#  define
1b790 20 75 69 6e 74 33 32 20 75 6e 73 69 67 6e 65 64   uint32 unsigned
1b7a0 20 69 6e 74 0a 23 65 6e 64 69 66 0a 0a 73 74 72   int.#endif..str
1b7b0 75 63 74 20 4d 44 35 43 6f 6e 74 65 78 74 20 7b  uct MD5Context {
1b7c0 0a 20 20 69 6e 74 20 69 73 49 6e 69 74 3b 0a 20  .  int isInit;. 
1b7d0 20 75 69 6e 74 33 32 20 62 75 66 5b 34 5d 3b 0a   uint32 buf[4];.
1b7e0 20 20 75 69 6e 74 33 32 20 62 69 74 73 5b 32 5d    uint32 bits[2]
1b7f0 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
1b800 72 20 69 6e 5b 36 34 5d 3b 0a 7d 3b 0a 74 79 70  r in[64];.};.typ
1b810 65 64 65 66 20 73 74 72 75 63 74 20 4d 44 35 43  edef struct MD5C
1b820 6f 6e 74 65 78 74 20 4d 44 35 43 6f 6e 74 65 78  ontext MD5Contex
1b830 74 3b 0a 0a 2f 2a 0a 20 2a 20 4e 6f 74 65 3a 20  t;../*. * Note: 
1b840 74 68 69 73 20 63 6f 64 65 20 69 73 20 68 61 72  this code is har
1b850 6d 6c 65 73 73 20 6f 6e 20 6c 69 74 74 6c 65 2d  mless on little-
1b860 65 6e 64 69 61 6e 20 6d 61 63 68 69 6e 65 73 2e  endian machines.
1b870 0a 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  . */.static void
1b880 20 62 79 74 65 52 65 76 65 72 73 65 20 28 75 6e   byteReverse (un
1b890 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66  signed char *buf
1b8a0 2c 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 73  , unsigned longs
1b8b0 29 7b 0a 20 20 20 20 20 20 20 20 75 69 6e 74 33  ){.        uint3
1b8c0 32 20 74 3b 0a 20 20 20 20 20 20 20 20 64 6f 20  2 t;.        do 
1b8d0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
1b8e0 20 20 74 20 3d 20 28 75 69 6e 74 33 32 29 28 28    t = (uint32)((
1b8f0 75 6e 73 69 67 6e 65 64 29 62 75 66 5b 33 5d 3c  unsigned)buf[3]<
1b900 3c 38 20 7c 20 62 75 66 5b 32 5d 29 20 3c 3c 20  <8 | buf[2]) << 
1b910 31 36 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20  16 |.           
1b920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b930 20 28 28 75 6e 73 69 67 6e 65 64 29 62 75 66 5b   ((unsigned)buf[
1b940 31 5d 3c 3c 38 20 7c 20 62 75 66 5b 30 5d 29 3b  1]<<8 | buf[0]);
1b950 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1b960 20 2a 28 75 69 6e 74 33 32 20 2a 29 62 75 66 20   *(uint32 *)buf 
1b970 3d 20 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = t;.           
1b980 20 20 20 20 20 62 75 66 20 2b 3d 20 34 3b 0a 20       buf += 4;. 
1b990 20 20 20 20 20 20 20 7d 20 77 68 69 6c 65 20 28         } while (
1b9a0 2d 2d 6c 6f 6e 67 73 29 3b 0a 7d 0a 2f 2a 20 54  --longs);.}./* T
1b9b0 68 65 20 66 6f 75 72 20 63 6f 72 65 20 66 75 6e  he four core fun
1b9c0 63 74 69 6f 6e 73 20 2d 20 46 31 20 69 73 20 6f  ctions - F1 is o
1b9d0 70 74 69 6d 69 7a 65 64 20 73 6f 6d 65 77 68 61  ptimized somewha
1b9e0 74 20 2a 2f 0a 0a 2f 2a 20 23 64 65 66 69 6e 65  t */../* #define
1b9f0 20 46 31 28 78 2c 20 79 2c 20 7a 29 20 28 78 20   F1(x, y, z) (x 
1ba00 26 20 79 20 7c 20 7e 78 20 26 20 7a 29 20 2a 2f  & y | ~x & z) */
1ba10 0a 23 64 65 66 69 6e 65 20 46 31 28 78 2c 20 79  .#define F1(x, y
1ba20 2c 20 7a 29 20 28 7a 20 5e 20 28 78 20 26 20 28  , z) (z ^ (x & (
1ba30 79 20 5e 20 7a 29 29 29 0a 23 64 65 66 69 6e 65  y ^ z))).#define
1ba40 20 46 32 28 78 2c 20 79 2c 20 7a 29 20 46 31 28   F2(x, y, z) F1(
1ba50 7a 2c 20 78 2c 20 79 29 0a 23 64 65 66 69 6e 65  z, x, y).#define
1ba60 20 46 33 28 78 2c 20 79 2c 20 7a 29 20 28 78 20   F3(x, y, z) (x 
1ba70 5e 20 79 20 5e 20 7a 29 0a 23 64 65 66 69 6e 65  ^ y ^ z).#define
1ba80 20 46 34 28 78 2c 20 79 2c 20 7a 29 20 28 79 20   F4(x, y, z) (y 
1ba90 5e 20 28 78 20 7c 20 7e 7a 29 29 0a 0a 2f 2a 20  ^ (x | ~z))../* 
1baa0 54 68 69 73 20 69 73 20 74 68 65 20 63 65 6e 74  This is the cent
1bab0 72 61 6c 20 73 74 65 70 20 69 6e 20 74 68 65 20  ral step in the 
1bac0 4d 44 35 20 61 6c 67 6f 72 69 74 68 6d 2e 20 2a  MD5 algorithm. *
1bad0 2f 0a 23 64 65 66 69 6e 65 20 4d 44 35 53 54 45  /.#define MD5STE
1bae0 50 28 66 2c 20 77 2c 20 78 2c 20 79 2c 20 7a 2c  P(f, w, x, y, z,
1baf0 20 64 61 74 61 2c 20 73 29 20 5c 0a 20 20 20 20   data, s) \.    
1bb00 20 20 20 20 28 20 77 20 2b 3d 20 66 28 78 2c 20      ( w += f(x, 
1bb10 79 2c 20 7a 29 20 2b 20 64 61 74 61 2c 20 20 77  y, z) + data,  w
1bb20 20 3d 20 77 3c 3c 73 20 7c 20 77 3e 3e 28 33 32   = w<<s | w>>(32
1bb30 2d 73 29 2c 20 20 77 20 2b 3d 20 78 20 29 0a 0a  -s),  w += x )..
1bb40 2f 2a 0a 20 2a 20 54 68 65 20 63 6f 72 65 20 6f  /*. * The core o
1bb50 66 20 74 68 65 20 4d 44 35 20 61 6c 67 6f 72 69  f the MD5 algori
1bb60 74 68 6d 2c 20 74 68 69 73 20 61 6c 74 65 72 73  thm, this alters
1bb70 20 61 6e 20 65 78 69 73 74 69 6e 67 20 4d 44 35   an existing MD5
1bb80 20 68 61 73 68 20 74 6f 0a 20 2a 20 72 65 66 6c   hash to. * refl
1bb90 65 63 74 20 74 68 65 20 61 64 64 69 74 69 6f 6e  ect the addition
1bba0 20 6f 66 20 31 36 20 6c 6f 6e 67 77 6f 72 64 73   of 16 longwords
1bbb0 20 6f 66 20 6e 65 77 20 64 61 74 61 2e 20 20 4d   of new data.  M
1bbc0 44 35 55 70 64 61 74 65 20 62 6c 6f 63 6b 73 0a  D5Update blocks.
1bbd0 20 2a 20 74 68 65 20 64 61 74 61 20 61 6e 64 20   * the data and 
1bbe0 63 6f 6e 76 65 72 74 73 20 62 79 74 65 73 20 69  converts bytes i
1bbf0 6e 74 6f 20 6c 6f 6e 67 77 6f 72 64 73 20 66 6f  nto longwords fo
1bc00 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a  r this routine..
1bc10 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20   */.static void 
1bc20 4d 44 35 54 72 61 6e 73 66 6f 72 6d 28 75 69 6e  MD5Transform(uin
1bc30 74 33 32 20 62 75 66 5b 34 5d 2c 20 63 6f 6e 73  t32 buf[4], cons
1bc40 74 20 75 69 6e 74 33 32 20 69 6e 5b 31 36 5d 29  t uint32 in[16])
1bc50 7b 0a 20 20 20 20 20 20 20 20 72 65 67 69 73 74  {.        regist
1bc60 65 72 20 75 69 6e 74 33 32 20 61 2c 20 62 2c 20  er uint32 a, b, 
1bc70 63 2c 20 64 3b 0a 0a 20 20 20 20 20 20 20 20 61  c, d;..        a
1bc80 20 3d 20 62 75 66 5b 30 5d 3b 0a 20 20 20 20 20   = buf[0];.     
1bc90 20 20 20 62 20 3d 20 62 75 66 5b 31 5d 3b 0a 20     b = buf[1];. 
1bca0 20 20 20 20 20 20 20 63 20 3d 20 62 75 66 5b 32         c = buf[2
1bcb0 5d 3b 0a 20 20 20 20 20 20 20 20 64 20 3d 20 62  ];.        d = b
1bcc0 75 66 5b 33 5d 3b 0a 0a 20 20 20 20 20 20 20 20  uf[3];..        
1bcd0 4d 44 35 53 54 45 50 28 46 31 2c 20 61 2c 20 62  MD5STEP(F1, a, b
1bce0 2c 20 63 2c 20 64 2c 20 69 6e 5b 20 30 5d 2b 30  , c, d, in[ 0]+0
1bcf0 78 64 37 36 61 61 34 37 38 2c 20 20 37 29 3b 0a  xd76aa478,  7);.
1bd00 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28          MD5STEP(
1bd10 46 31 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20  F1, d, a, b, c, 
1bd20 69 6e 5b 20 31 5d 2b 30 78 65 38 63 37 62 37 35  in[ 1]+0xe8c7b75
1bd30 36 2c 20 31 32 29 3b 0a 20 20 20 20 20 20 20 20  6, 12);.        
1bd40 4d 44 35 53 54 45 50 28 46 31 2c 20 63 2c 20 64  MD5STEP(F1, c, d
1bd50 2c 20 61 2c 20 62 2c 20 69 6e 5b 20 32 5d 2b 30  , a, b, in[ 2]+0
1bd60 78 32 34 32 30 37 30 64 62 2c 20 31 37 29 3b 0a  x242070db, 17);.
1bd70 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28          MD5STEP(
1bd80 46 31 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20  F1, b, c, d, a, 
1bd90 69 6e 5b 20 33 5d 2b 30 78 63 31 62 64 63 65 65  in[ 3]+0xc1bdcee
1bda0 65 2c 20 32 32 29 3b 0a 20 20 20 20 20 20 20 20  e, 22);.        
1bdb0 4d 44 35 53 54 45 50 28 46 31 2c 20 61 2c 20 62  MD5STEP(F1, a, b
1bdc0 2c 20 63 2c 20 64 2c 20 69 6e 5b 20 34 5d 2b 30  , c, d, in[ 4]+0
1bdd0 78 66 35 37 63 30 66 61 66 2c 20 20 37 29 3b 0a  xf57c0faf,  7);.
1bde0 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28          MD5STEP(
1bdf0 46 31 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20  F1, d, a, b, c, 
1be00 69 6e 5b 20 35 5d 2b 30 78 34 37 38 37 63 36 32  in[ 5]+0x4787c62
1be10 61 2c 20 31 32 29 3b 0a 20 20 20 20 20 20 20 20  a, 12);.        
1be20 4d 44 35 53 54 45 50 28 46 31 2c 20 63 2c 20 64  MD5STEP(F1, c, d
1be30 2c 20 61 2c 20 62 2c 20 69 6e 5b 20 36 5d 2b 30  , a, b, in[ 6]+0
1be40 78 61 38 33 30 34 36 31 33 2c 20 31 37 29 3b 0a  xa8304613, 17);.
1be50 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28          MD5STEP(
1be60 46 31 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20  F1, b, c, d, a, 
1be70 69 6e 5b 20 37 5d 2b 30 78 66 64 34 36 39 35 30  in[ 7]+0xfd46950
1be80 31 2c 20 32 32 29 3b 0a 20 20 20 20 20 20 20 20  1, 22);.        
1be90 4d 44 35 53 54 45 50 28 46 31 2c 20 61 2c 20 62  MD5STEP(F1, a, b
1bea0 2c 20 63 2c 20 64 2c 20 69 6e 5b 20 38 5d 2b 30  , c, d, in[ 8]+0
1beb0 78 36 39 38 30 39 38 64 38 2c 20 20 37 29 3b 0a  x698098d8,  7);.
1bec0 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28          MD5STEP(
1bed0 46 31 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20  F1, d, a, b, c, 
1bee0 69 6e 5b 20 39 5d 2b 30 78 38 62 34 34 66 37 61  in[ 9]+0x8b44f7a
1bef0 66 2c 20 31 32 29 3b 0a 20 20 20 20 20 20 20 20  f, 12);.        
1bf00 4d 44 35 53 54 45 50 28 46 31 2c 20 63 2c 20 64  MD5STEP(F1, c, d
1bf10 2c 20 61 2c 20 62 2c 20 69 6e 5b 31 30 5d 2b 30  , a, b, in[10]+0
1bf20 78 66 66 66 66 35 62 62 31 2c 20 31 37 29 3b 0a  xffff5bb1, 17);.
1bf30 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28          MD5STEP(
1bf40 46 31 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20  F1, b, c, d, a, 
1bf50 69 6e 5b 31 31 5d 2b 30 78 38 39 35 63 64 37 62  in[11]+0x895cd7b
1bf60 65 2c 20 32 32 29 3b 0a 20 20 20 20 20 20 20 20  e, 22);.        
1bf70 4d 44 35 53 54 45 50 28 46 31 2c 20 61 2c 20 62  MD5STEP(F1, a, b
1bf80 2c 20 63 2c 20 64 2c 20 69 6e 5b 31 32 5d 2b 30  , c, d, in[12]+0
1bf90 78 36 62 39 30 31 31 32 32 2c 20 20 37 29 3b 0a  x6b901122,  7);.
1bfa0 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28          MD5STEP(
1bfb0 46 31 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20  F1, d, a, b, c, 
1bfc0 69 6e 5b 31 33 5d 2b 30 78 66 64 39 38 37 31 39  in[13]+0xfd98719
1bfd0 33 2c 20 31 32 29 3b 0a 20 20 20 20 20 20 20 20  3, 12);.        
1bfe0 4d 44 35 53 54 45 50 28 46 31 2c 20 63 2c 20 64  MD5STEP(F1, c, d
1bff0 2c 20 61 2c 20 62 2c 20 69 6e 5b 31 34 5d 2b 30  , a, b, in[14]+0
1c000 78 61 36 37 39 34 33 38 65 2c 20 31 37 29 3b 0a  xa679438e, 17);.
1c010 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28          MD5STEP(
1c020 46 31 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20  F1, b, c, d, a, 
1c030 69 6e 5b 31 35 5d 2b 30 78 34 39 62 34 30 38 32  in[15]+0x49b4082
1c040 31 2c 20 32 32 29 3b 0a 0a 20 20 20 20 20 20 20  1, 22);..       
1c050 20 4d 44 35 53 54 45 50 28 46 32 2c 20 61 2c 20   MD5STEP(F2, a, 
1c060 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 20 31 5d 2b  b, c, d, in[ 1]+
1c070 30 78 66 36 31 65 32 35 36 32 2c 20 20 35 29 3b  0xf61e2562,  5);
1c080 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50  .        MD5STEP
1c090 28 46 32 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c  (F2, d, a, b, c,
1c0a0 20 69 6e 5b 20 36 5d 2b 30 78 63 30 34 30 62 33   in[ 6]+0xc040b3
1c0b0 34 30 2c 20 20 39 29 3b 0a 20 20 20 20 20 20 20  40,  9);.       
1c0c0 20 4d 44 35 53 54 45 50 28 46 32 2c 20 63 2c 20   MD5STEP(F2, c, 
1c0d0 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 31 31 5d 2b  d, a, b, in[11]+
1c0e0 30 78 32 36 35 65 35 61 35 31 2c 20 31 34 29 3b  0x265e5a51, 14);
1c0f0 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50  .        MD5STEP
1c100 28 46 32 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c  (F2, b, c, d, a,
1c110 20 69 6e 5b 20 30 5d 2b 30 78 65 39 62 36 63 37   in[ 0]+0xe9b6c7
1c120 61 61 2c 20 32 30 29 3b 0a 20 20 20 20 20 20 20  aa, 20);.       
1c130 20 4d 44 35 53 54 45 50 28 46 32 2c 20 61 2c 20   MD5STEP(F2, a, 
1c140 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 20 35 5d 2b  b, c, d, in[ 5]+
1c150 30 78 64 36 32 66 31 30 35 64 2c 20 20 35 29 3b  0xd62f105d,  5);
1c160 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50  .        MD5STEP
1c170 28 46 32 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c  (F2, d, a, b, c,
1c180 20 69 6e 5b 31 30 5d 2b 30 78 30 32 34 34 31 34   in[10]+0x024414
1c190 35 33 2c 20 20 39 29 3b 0a 20 20 20 20 20 20 20  53,  9);.       
1c1a0 20 4d 44 35 53 54 45 50 28 46 32 2c 20 63 2c 20   MD5STEP(F2, c, 
1c1b0 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 31 35 5d 2b  d, a, b, in[15]+
1c1c0 30 78 64 38 61 31 65 36 38 31 2c 20 31 34 29 3b  0xd8a1e681, 14);
1c1d0 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50  .        MD5STEP
1c1e0 28 46 32 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c  (F2, b, c, d, a,
1c1f0 20 69 6e 5b 20 34 5d 2b 30 78 65 37 64 33 66 62   in[ 4]+0xe7d3fb
1c200 63 38 2c 20 32 30 29 3b 0a 20 20 20 20 20 20 20  c8, 20);.       
1c210 20 4d 44 35 53 54 45 50 28 46 32 2c 20 61 2c 20   MD5STEP(F2, a, 
1c220 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 20 39 5d 2b  b, c, d, in[ 9]+
1c230 30 78 32 31 65 31 63 64 65 36 2c 20 20 35 29 3b  0x21e1cde6,  5);
1c240 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50  .        MD5STEP
1c250 28 46 32 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c  (F2, d, a, b, c,
1c260 20 69 6e 5b 31 34 5d 2b 30 78 63 33 33 37 30 37   in[14]+0xc33707
1c270 64 36 2c 20 20 39 29 3b 0a 20 20 20 20 20 20 20  d6,  9);.       
1c280 20 4d 44 35 53 54 45 50 28 46 32 2c 20 63 2c 20   MD5STEP(F2, c, 
1c290 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 20 33 5d 2b  d, a, b, in[ 3]+
1c2a0 30 78 66 34 64 35 30 64 38 37 2c 20 31 34 29 3b  0xf4d50d87, 14);
1c2b0 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50  .        MD5STEP
1c2c0 28 46 32 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c  (F2, b, c, d, a,
1c2d0 20 69 6e 5b 20 38 5d 2b 30 78 34 35 35 61 31 34   in[ 8]+0x455a14
1c2e0 65 64 2c 20 32 30 29 3b 0a 20 20 20 20 20 20 20  ed, 20);.       
1c2f0 20 4d 44 35 53 54 45 50 28 46 32 2c 20 61 2c 20   MD5STEP(F2, a, 
1c300 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 31 33 5d 2b  b, c, d, in[13]+
1c310 30 78 61 39 65 33 65 39 30 35 2c 20 20 35 29 3b  0xa9e3e905,  5);
1c320 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50  .        MD5STEP
1c330 28 46 32 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c  (F2, d, a, b, c,
1c340 20 69 6e 5b 20 32 5d 2b 30 78 66 63 65 66 61 33   in[ 2]+0xfcefa3
1c350 66 38 2c 20 20 39 29 3b 0a 20 20 20 20 20 20 20  f8,  9);.       
1c360 20 4d 44 35 53 54 45 50 28 46 32 2c 20 63 2c 20   MD5STEP(F2, c, 
1c370 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 20 37 5d 2b  d, a, b, in[ 7]+
1c380 30 78 36 37 36 66 30 32 64 39 2c 20 31 34 29 3b  0x676f02d9, 14);
1c390 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50  .        MD5STEP
1c3a0 28 46 32 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c  (F2, b, c, d, a,
1c3b0 20 69 6e 5b 31 32 5d 2b 30 78 38 64 32 61 34 63   in[12]+0x8d2a4c
1c3c0 38 61 2c 20 32 30 29 3b 0a 0a 20 20 20 20 20 20  8a, 20);..      
1c3d0 20 20 4d 44 35 53 54 45 50 28 46 33 2c 20 61 2c    MD5STEP(F3, a,
1c3e0 20 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 20 35 5d   b, c, d, in[ 5]
1c3f0 2b 30 78 66 66 66 61 33 39 34 32 2c 20 20 34 29  +0xfffa3942,  4)
1c400 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45  ;.        MD5STE
1c410 50 28 46 33 2c 20 64 2c 20 61 2c 20 62 2c 20 63  P(F3, d, a, b, c
1c420 2c 20 69 6e 5b 20 38 5d 2b 30 78 38 37 37 31 66  , in[ 8]+0x8771f
1c430 36 38 31 2c 20 31 31 29 3b 0a 20 20 20 20 20 20  681, 11);.      
1c440 20 20 4d 44 35 53 54 45 50 28 46 33 2c 20 63 2c    MD5STEP(F3, c,
1c450 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 31 31 5d   d, a, b, in[11]
1c460 2b 30 78 36 64 39 64 36 31 32 32 2c 20 31 36 29  +0x6d9d6122, 16)
1c470 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45  ;.        MD5STE
1c480 50 28 46 33 2c 20 62 2c 20 63 2c 20 64 2c 20 61  P(F3, b, c, d, a
1c490 2c 20 69 6e 5b 31 34 5d 2b 30 78 66 64 65 35 33  , in[14]+0xfde53
1c4a0 38 30 63 2c 20 32 33 29 3b 0a 20 20 20 20 20 20  80c, 23);.      
1c4b0 20 20 4d 44 35 53 54 45 50 28 46 33 2c 20 61 2c    MD5STEP(F3, a,
1c4c0 20 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 20 31 5d   b, c, d, in[ 1]
1c4d0 2b 30 78 61 34 62 65 65 61 34 34 2c 20 20 34 29  +0xa4beea44,  4)
1c4e0 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45  ;.        MD5STE
1c4f0 50 28 46 33 2c 20 64 2c 20 61 2c 20 62 2c 20 63  P(F3, d, a, b, c
1c500 2c 20 69 6e 5b 20 34 5d 2b 30 78 34 62 64 65 63  , in[ 4]+0x4bdec
1c510 66 61 39 2c 20 31 31 29 3b 0a 20 20 20 20 20 20  fa9, 11);.      
1c520 20 20 4d 44 35 53 54 45 50 28 46 33 2c 20 63 2c    MD5STEP(F3, c,
1c530 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 20 37 5d   d, a, b, in[ 7]
1c540 2b 30 78 66 36 62 62 34 62 36 30 2c 20 31 36 29  +0xf6bb4b60, 16)
1c550 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45  ;.        MD5STE
1c560 50 28 46 33 2c 20 62 2c 20 63 2c 20 64 2c 20 61  P(F3, b, c, d, a
1c570 2c 20 69 6e 5b 31 30 5d 2b 30 78 62 65 62 66 62  , in[10]+0xbebfb
1c580 63 37 30 2c 20 32 33 29 3b 0a 20 20 20 20 20 20  c70, 23);.      
1c590 20 20 4d 44 35 53 54 45 50 28 46 33 2c 20 61 2c    MD5STEP(F3, a,
1c5a0 20 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 31 33 5d   b, c, d, in[13]
1c5b0 2b 30 78 32 38 39 62 37 65 63 36 2c 20 20 34 29  +0x289b7ec6,  4)
1c5c0 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45  ;.        MD5STE
1c5d0 50 28 46 33 2c 20 64 2c 20 61 2c 20 62 2c 20 63  P(F3, d, a, b, c
1c5e0 2c 20 69 6e 5b 20 30 5d 2b 30 78 65 61 61 31 32  , in[ 0]+0xeaa12
1c5f0 37 66 61 2c 20 31 31 29 3b 0a 20 20 20 20 20 20  7fa, 11);.      
1c600 20 20 4d 44 35 53 54 45 50 28 46 33 2c 20 63 2c    MD5STEP(F3, c,
1c610 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 20 33 5d   d, a, b, in[ 3]
1c620 2b 30 78 64 34 65 66 33 30 38 35 2c 20 31 36 29  +0xd4ef3085, 16)
1c630 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45  ;.        MD5STE
1c640 50 28 46 33 2c 20 62 2c 20 63 2c 20 64 2c 20 61  P(F3, b, c, d, a
1c650 2c 20 69 6e 5b 20 36 5d 2b 30 78 30 34 38 38 31  , in[ 6]+0x04881
1c660 64 30 35 2c 20 32 33 29 3b 0a 20 20 20 20 20 20  d05, 23);.      
1c670 20 20 4d 44 35 53 54 45 50 28 46 33 2c 20 61 2c    MD5STEP(F3, a,
1c680 20 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 20 39 5d   b, c, d, in[ 9]
1c690 2b 30 78 64 39 64 34 64 30 33 39 2c 20 20 34 29  +0xd9d4d039,  4)
1c6a0 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45  ;.        MD5STE
1c6b0 50 28 46 33 2c 20 64 2c 20 61 2c 20 62 2c 20 63  P(F3, d, a, b, c
1c6c0 2c 20 69 6e 5b 31 32 5d 2b 30 78 65 36 64 62 39  , in[12]+0xe6db9
1c6d0 39 65 35 2c 20 31 31 29 3b 0a 20 20 20 20 20 20  9e5, 11);.      
1c6e0 20 20 4d 44 35 53 54 45 50 28 46 33 2c 20 63 2c    MD5STEP(F3, c,
1c6f0 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 31 35 5d   d, a, b, in[15]
1c700 2b 30 78 31 66 61 32 37 63 66 38 2c 20 31 36 29  +0x1fa27cf8, 16)
1c710 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45  ;.        MD5STE
1c720 50 28 46 33 2c 20 62 2c 20 63 2c 20 64 2c 20 61  P(F3, b, c, d, a
1c730 2c 20 69 6e 5b 20 32 5d 2b 30 78 63 34 61 63 35  , in[ 2]+0xc4ac5
1c740 36 36 35 2c 20 32 33 29 3b 0a 0a 20 20 20 20 20  665, 23);..     
1c750 20 20 20 4d 44 35 53 54 45 50 28 46 34 2c 20 61     MD5STEP(F4, a
1c760 2c 20 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 20 30  , b, c, d, in[ 0
1c770 5d 2b 30 78 66 34 32 39 32 32 34 34 2c 20 20 36  ]+0xf4292244,  6
1c780 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54  );.        MD5ST
1c790 45 50 28 46 34 2c 20 64 2c 20 61 2c 20 62 2c 20  EP(F4, d, a, b, 
1c7a0 63 2c 20 69 6e 5b 20 37 5d 2b 30 78 34 33 32 61  c, in[ 7]+0x432a
1c7b0 66 66 39 37 2c 20 31 30 29 3b 0a 20 20 20 20 20  ff97, 10);.     
1c7c0 20 20 20 4d 44 35 53 54 45 50 28 46 34 2c 20 63     MD5STEP(F4, c
1c7d0 2c 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 31 34  , d, a, b, in[14
1c7e0 5d 2b 30 78 61 62 39 34 32 33 61 37 2c 20 31 35  ]+0xab9423a7, 15
1c7f0 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54  );.        MD5ST
1c800 45 50 28 46 34 2c 20 62 2c 20 63 2c 20 64 2c 20  EP(F4, b, c, d, 
1c810 61 2c 20 69 6e 5b 20 35 5d 2b 30 78 66 63 39 33  a, in[ 5]+0xfc93
1c820 61 30 33 39 2c 20 32 31 29 3b 0a 20 20 20 20 20  a039, 21);.     
1c830 20 20 20 4d 44 35 53 54 45 50 28 46 34 2c 20 61     MD5STEP(F4, a
1c840 2c 20 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 31 32  , b, c, d, in[12
1c850 5d 2b 30 78 36 35 35 62 35 39 63 33 2c 20 20 36  ]+0x655b59c3,  6
1c860 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54  );.        MD5ST
1c870 45 50 28 46 34 2c 20 64 2c 20 61 2c 20 62 2c 20  EP(F4, d, a, b, 
1c880 63 2c 20 69 6e 5b 20 33 5d 2b 30 78 38 66 30 63  c, in[ 3]+0x8f0c
1c890 63 63 39 32 2c 20 31 30 29 3b 0a 20 20 20 20 20  cc92, 10);.     
1c8a0 20 20 20 4d 44 35 53 54 45 50 28 46 34 2c 20 63     MD5STEP(F4, c
1c8b0 2c 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 31 30  , d, a, b, in[10
1c8c0 5d 2b 30 78 66 66 65 66 66 34 37 64 2c 20 31 35  ]+0xffeff47d, 15
1c8d0 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54  );.        MD5ST
1c8e0 45 50 28 46 34 2c 20 62 2c 20 63 2c 20 64 2c 20  EP(F4, b, c, d, 
1c8f0 61 2c 20 69 6e 5b 20 31 5d 2b 30 78 38 35 38 34  a, in[ 1]+0x8584
1c900 35 64 64 31 2c 20 32 31 29 3b 0a 20 20 20 20 20  5dd1, 21);.     
1c910 20 20 20 4d 44 35 53 54 45 50 28 46 34 2c 20 61     MD5STEP(F4, a
1c920 2c 20 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 20 38  , b, c, d, in[ 8
1c930 5d 2b 30 78 36 66 61 38 37 65 34 66 2c 20 20 36  ]+0x6fa87e4f,  6
1c940 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54  );.        MD5ST
1c950 45 50 28 46 34 2c 20 64 2c 20 61 2c 20 62 2c 20  EP(F4, d, a, b, 
1c960 63 2c 20 69 6e 5b 31 35 5d 2b 30 78 66 65 32 63  c, in[15]+0xfe2c
1c970 65 36 65 30 2c 20 31 30 29 3b 0a 20 20 20 20 20  e6e0, 10);.     
1c980 20 20 20 4d 44 35 53 54 45 50 28 46 34 2c 20 63     MD5STEP(F4, c
1c990 2c 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 20 36  , d, a, b, in[ 6
1c9a0 5d 2b 30 78 61 33 30 31 34 33 31 34 2c 20 31 35  ]+0xa3014314, 15
1c9b0 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54  );.        MD5ST
1c9c0 45 50 28 46 34 2c 20 62 2c 20 63 2c 20 64 2c 20  EP(F4, b, c, d, 
1c9d0 61 2c 20 69 6e 5b 31 33 5d 2b 30 78 34 65 30 38  a, in[13]+0x4e08
1c9e0 31 31 61 31 2c 20 32 31 29 3b 0a 20 20 20 20 20  11a1, 21);.     
1c9f0 20 20 20 4d 44 35 53 54 45 50 28 46 34 2c 20 61     MD5STEP(F4, a
1ca00 2c 20 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 20 34  , b, c, d, in[ 4
1ca10 5d 2b 30 78 66 37 35 33 37 65 38 32 2c 20 20 36  ]+0xf7537e82,  6
1ca20 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54  );.        MD5ST
1ca30 45 50 28 46 34 2c 20 64 2c 20 61 2c 20 62 2c 20  EP(F4, d, a, b, 
1ca40 63 2c 20 69 6e 5b 31 31 5d 2b 30 78 62 64 33 61  c, in[11]+0xbd3a
1ca50 66 32 33 35 2c 20 31 30 29 3b 0a 20 20 20 20 20  f235, 10);.     
1ca60 20 20 20 4d 44 35 53 54 45 50 28 46 34 2c 20 63     MD5STEP(F4, c
1ca70 2c 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 20 32  , d, a, b, in[ 2
1ca80 5d 2b 30 78 32 61 64 37 64 32 62 62 2c 20 31 35  ]+0x2ad7d2bb, 15
1ca90 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54  );.        MD5ST
1caa0 45 50 28 46 34 2c 20 62 2c 20 63 2c 20 64 2c 20  EP(F4, b, c, d, 
1cab0 61 2c 20 69 6e 5b 20 39 5d 2b 30 78 65 62 38 36  a, in[ 9]+0xeb86
1cac0 64 33 39 31 2c 20 32 31 29 3b 0a 0a 20 20 20 20  d391, 21);..    
1cad0 20 20 20 20 62 75 66 5b 30 5d 20 2b 3d 20 61 3b      buf[0] += a;
1cae0 0a 20 20 20 20 20 20 20 20 62 75 66 5b 31 5d 20  .        buf[1] 
1caf0 2b 3d 20 62 3b 0a 20 20 20 20 20 20 20 20 62 75  += b;.        bu
1cb00 66 5b 32 5d 20 2b 3d 20 63 3b 0a 20 20 20 20 20  f[2] += c;.     
1cb10 20 20 20 62 75 66 5b 33 5d 20 2b 3d 20 64 3b 0a     buf[3] += d;.
1cb20 7d 0a 0a 2f 2a 0a 20 2a 20 53 74 61 72 74 20 4d  }../*. * Start M
1cb30 44 35 20 61 63 63 75 6d 75 6c 61 74 69 6f 6e 2e  D5 accumulation.
1cb40 20 20 53 65 74 20 62 69 74 20 63 6f 75 6e 74 20    Set bit count 
1cb50 74 6f 20 30 20 61 6e 64 20 62 75 66 66 65 72 20  to 0 and buffer 
1cb60 74 6f 20 6d 79 73 74 65 72 69 6f 75 73 0a 20 2a  to mysterious. *
1cb70 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
1cb80 63 6f 6e 73 74 61 6e 74 73 2e 0a 20 2a 2f 0a 73  constants.. */.s
1cb90 74 61 74 69 63 20 76 6f 69 64 20 4d 44 35 49 6e  tatic void MD5In
1cba0 69 74 28 4d 44 35 43 6f 6e 74 65 78 74 20 2a 63  it(MD5Context *c
1cbb0 74 78 29 7b 0a 20 20 20 20 20 20 20 20 63 74 78  tx){.        ctx
1cbc0 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a 20 20  ->isInit = 1;.  
1cbd0 20 20 20 20 20 20 63 74 78 2d 3e 62 75 66 5b 30        ctx->buf[0
1cbe0 5d 20 3d 20 30 78 36 37 34 35 32 33 30 31 3b 0a  ] = 0x67452301;.
1cbf0 20 20 20 20 20 20 20 20 63 74 78 2d 3e 62 75 66          ctx->buf
1cc00 5b 31 5d 20 3d 20 30 78 65 66 63 64 61 62 38 39  [1] = 0xefcdab89
1cc10 3b 0a 20 20 20 20 20 20 20 20 63 74 78 2d 3e 62  ;.        ctx->b
1cc20 75 66 5b 32 5d 20 3d 20 30 78 39 38 62 61 64 63  uf[2] = 0x98badc
1cc30 66 65 3b 0a 20 20 20 20 20 20 20 20 63 74 78 2d  fe;.        ctx-
1cc40 3e 62 75 66 5b 33 5d 20 3d 20 30 78 31 30 33 32  >buf[3] = 0x1032
1cc50 35 34 37 36 3b 0a 20 20 20 20 20 20 20 20 63 74  5476;.        ct
1cc60 78 2d 3e 62 69 74 73 5b 30 5d 20 3d 20 30 3b 0a  x->bits[0] = 0;.
1cc70 20 20 20 20 20 20 20 20 63 74 78 2d 3e 62 69 74          ctx->bit
1cc80 73 5b 31 5d 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  s[1] = 0;.}../*.
1cc90 20 2a 20 55 70 64 61 74 65 20 63 6f 6e 74 65 78   * Update contex
1cca0 74 20 74 6f 20 72 65 66 6c 65 63 74 20 74 68 65  t to reflect the
1ccb0 20 63 6f 6e 63 61 74 65 6e 61 74 69 6f 6e 20 6f   concatenation o
1ccc0 66 20 61 6e 6f 74 68 65 72 20 62 75 66 66 65 72  f another buffer
1ccd0 20 66 75 6c 6c 0a 20 2a 20 6f 66 20 62 79 74 65   full. * of byte
1cce0 73 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 0a 76 6f  s.. */.static.vo
1ccf0 69 64 20 4d 44 35 55 70 64 61 74 65 28 4d 44 35  id MD5Update(MD5
1cd00 43 6f 6e 74 65 78 74 20 2a 63 74 78 2c 20 63 6f  Context *ctx, co
1cd10 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
1cd20 72 20 2a 62 75 66 2c 20 75 6e 73 69 67 6e 65 64  r *buf, unsigned
1cd30 20 69 6e 74 20 6c 65 6e 29 7b 0a 20 20 20 20 20   int len){.     
1cd40 20 20 20 75 69 6e 74 33 32 20 74 3b 0a 0a 20 20     uint32 t;..  
1cd50 20 20 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20        /* Update 
1cd60 62 69 74 63 6f 75 6e 74 20 2a 2f 0a 0a 20 20 20  bitcount */..   
1cd70 20 20 20 20 20 74 20 3d 20 63 74 78 2d 3e 62 69       t = ctx->bi
1cd80 74 73 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20 69  ts[0];.        i
1cd90 66 20 28 28 63 74 78 2d 3e 62 69 74 73 5b 30 5d  f ((ctx->bits[0]
1cda0 20 3d 20 74 20 2b 20 28 28 75 69 6e 74 33 32 29   = t + ((uint32)
1cdb0 6c 65 6e 20 3c 3c 20 33 29 29 20 3c 20 74 29 0a  len << 3)) < t).
1cdc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cdd0 63 74 78 2d 3e 62 69 74 73 5b 31 5d 2b 2b 3b 20  ctx->bits[1]++; 
1cde0 2f 2a 20 43 61 72 72 79 20 66 72 6f 6d 20 6c 6f  /* Carry from lo
1cdf0 77 20 74 6f 20 68 69 67 68 20 2a 2f 0a 20 20 20  w to high */.   
1ce00 20 20 20 20 20 63 74 78 2d 3e 62 69 74 73 5b 31       ctx->bits[1
1ce10 5d 20 2b 3d 20 6c 65 6e 20 3e 3e 20 32 39 3b 0a  ] += len >> 29;.
1ce20 0a 20 20 20 20 20 20 20 20 74 20 3d 20 28 74 20  .        t = (t 
1ce30 3e 3e 20 33 29 20 26 20 30 78 33 66 3b 20 20 20  >> 3) & 0x3f;   
1ce40 20 2f 2a 20 42 79 74 65 73 20 61 6c 72 65 61 64   /* Bytes alread
1ce50 79 20 69 6e 20 73 68 73 49 6e 66 6f 2d 3e 64 61  y in shsInfo->da
1ce60 74 61 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 2f  ta */..        /
1ce70 2a 20 48 61 6e 64 6c 65 20 61 6e 79 20 6c 65 61  * Handle any lea
1ce80 64 69 6e 67 20 6f 64 64 2d 73 69 7a 65 64 20 63  ding odd-sized c
1ce90 68 75 6e 6b 73 20 2a 2f 0a 0a 20 20 20 20 20 20  hunks */..      
1cea0 20 20 69 66 20 28 20 74 20 29 20 7b 0a 20 20 20    if ( t ) {.   
1ceb0 20 20 20 20 20 20 20 20 20 20 20 20 20 75 6e 73               uns
1cec0 69 67 6e 65 64 20 63 68 61 72 20 2a 70 20 3d 20  igned char *p = 
1ced0 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  (unsigned char *
1cee0 29 63 74 78 2d 3e 69 6e 20 2b 20 74 3b 0a 0a 20  )ctx->in + t;.. 
1cef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
1cf00 20 3d 20 36 34 2d 74 3b 0a 20 20 20 20 20 20 20   = 64-t;.       
1cf10 20 20 20 20 20 20 20 20 20 69 66 20 28 6c 65 6e           if (len
1cf20 20 3c 20 74 29 20 7b 0a 20 20 20 20 20 20 20 20   < t) {.        
1cf30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cf40 6d 65 6d 63 70 79 28 70 2c 20 62 75 66 2c 20 6c  memcpy(p, buf, l
1cf50 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  en);.           
1cf60 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74               ret
1cf70 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20  urn;.           
1cf80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1cf90 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 2c         memcpy(p,
1cfa0 20 62 75 66 2c 20 74 29 3b 0a 20 20 20 20 20 20   buf, t);.      
1cfb0 20 20 20 20 20 20 20 20 20 20 62 79 74 65 52 65            byteRe
1cfc0 76 65 72 73 65 28 63 74 78 2d 3e 69 6e 2c 20 31  verse(ctx->in, 1
1cfd0 36 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  6);.            
1cfe0 20 20 20 20 4d 44 35 54 72 61 6e 73 66 6f 72 6d      MD5Transform
1cff0 28 63 74 78 2d 3e 62 75 66 2c 20 28 75 69 6e 74  (ctx->buf, (uint
1d000 33 32 20 2a 29 63 74 78 2d 3e 69 6e 29 3b 0a 20  32 *)ctx->in);. 
1d010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
1d020 75 66 20 2b 3d 20 74 3b 0a 20 20 20 20 20 20 20  uf += t;.       
1d030 20 20 20 20 20 20 20 20 20 6c 65 6e 20 2d 3d 20           len -= 
1d040 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  t;.        }..  
1d050 20 20 20 20 20 20 2f 2a 20 50 72 6f 63 65 73 73        /* Process
1d060 20 64 61 74 61 20 69 6e 20 36 34 2d 62 79 74 65   data in 64-byte
1d070 20 63 68 75 6e 6b 73 20 2a 2f 0a 0a 20 20 20 20   chunks */..    
1d080 20 20 20 20 77 68 69 6c 65 20 28 6c 65 6e 20 3e      while (len >
1d090 3d 20 36 34 29 20 7b 0a 20 20 20 20 20 20 20 20  = 64) {.        
1d0a0 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 63          memcpy(c
1d0b0 74 78 2d 3e 69 6e 2c 20 62 75 66 2c 20 36 34 29  tx->in, buf, 64)
1d0c0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1d0d0 20 20 62 79 74 65 52 65 76 65 72 73 65 28 63 74    byteReverse(ct
1d0e0 78 2d 3e 69 6e 2c 20 31 36 29 3b 0a 20 20 20 20  x->in, 16);.    
1d0f0 20 20 20 20 20 20 20 20 20 20 20 20 4d 44 35 54              MD5T
1d100 72 61 6e 73 66 6f 72 6d 28 63 74 78 2d 3e 62 75  ransform(ctx->bu
1d110 66 2c 20 28 75 69 6e 74 33 32 20 2a 29 63 74 78  f, (uint32 *)ctx
1d120 2d 3e 69 6e 29 3b 0a 20 20 20 20 20 20 20 20 20  ->in);.         
1d130 20 20 20 20 20 20 20 62 75 66 20 2b 3d 20 36 34         buf += 64
1d140 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1d150 20 20 6c 65 6e 20 2d 3d 20 36 34 3b 0a 20 20 20    len -= 64;.   
1d160 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
1d170 2f 2a 20 48 61 6e 64 6c 65 20 61 6e 79 20 72 65  /* Handle any re
1d180 6d 61 69 6e 69 6e 67 20 62 79 74 65 73 20 6f 66  maining bytes of
1d190 20 64 61 74 61 2e 20 2a 2f 0a 0a 20 20 20 20 20   data. */..     
1d1a0 20 20 20 6d 65 6d 63 70 79 28 63 74 78 2d 3e 69     memcpy(ctx->i
1d1b0 6e 2c 20 62 75 66 2c 20 6c 65 6e 29 3b 0a 7d 0a  n, buf, len);.}.
1d1c0 0a 2f 2a 0a 20 2a 20 46 69 6e 61 6c 20 77 72 61  ./*. * Final wra
1d1d0 70 75 70 20 2d 20 70 61 64 20 74 6f 20 36 34 2d  pup - pad to 64-
1d1e0 62 79 74 65 20 62 6f 75 6e 64 61 72 79 20 77 69  byte boundary wi
1d1f0 74 68 20 74 68 65 20 62 69 74 20 70 61 74 74 65  th the bit patte
1d200 72 6e 0a 20 2a 20 31 20 30 2a 20 28 36 34 2d 62  rn. * 1 0* (64-b
1d210 69 74 20 63 6f 75 6e 74 20 6f 66 20 62 69 74 73  it count of bits
1d220 20 70 72 6f 63 65 73 73 65 64 2c 20 4d 53 42 2d   processed, MSB-
1d230 66 69 72 73 74 29 0a 20 2a 2f 0a 73 74 61 74 69  first). */.stati
1d240 63 20 76 6f 69 64 20 4d 44 35 46 69 6e 61 6c 28  c void MD5Final(
1d250 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 64 69  unsigned char di
1d260 67 65 73 74 5b 31 36 5d 2c 20 4d 44 35 43 6f 6e  gest[16], MD5Con
1d270 74 65 78 74 20 2a 63 74 78 29 7b 0a 20 20 20 20  text *ctx){.    
1d280 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 6f 75      unsigned cou
1d290 6e 74 3b 0a 20 20 20 20 20 20 20 20 75 6e 73 69  nt;.        unsi
1d2a0 67 6e 65 64 20 63 68 61 72 20 2a 70 3b 0a 0a 20  gned char *p;.. 
1d2b0 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74         /* Comput
1d2c0 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
1d2d0 73 20 6d 6f 64 20 36 34 20 2a 2f 0a 20 20 20 20  s mod 64 */.    
1d2e0 20 20 20 20 63 6f 75 6e 74 20 3d 20 28 63 74 78      count = (ctx
1d2f0 2d 3e 62 69 74 73 5b 30 5d 20 3e 3e 20 33 29 20  ->bits[0] >> 3) 
1d300 26 20 30 78 33 46 3b 0a 0a 20 20 20 20 20 20 20  & 0x3F;..       
1d310 20 2f 2a 20 53 65 74 20 74 68 65 20 66 69 72 73   /* Set the firs
1d320 74 20 63 68 61 72 20 6f 66 20 70 61 64 64 69 6e  t char of paddin
1d330 67 20 74 6f 20 30 78 38 30 2e 20 20 54 68 69 73  g to 0x80.  This
1d340 20 69 73 20 73 61 66 65 20 73 69 6e 63 65 20 74   is safe since t
1d350 68 65 72 65 20 69 73 0a 20 20 20 20 20 20 20 20  here is.        
1d360 20 20 20 61 6c 77 61 79 73 20 61 74 20 6c 65 61     always at lea
1d370 73 74 20 6f 6e 65 20 62 79 74 65 20 66 72 65 65  st one byte free
1d380 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 20 3d 20   */.        p = 
1d390 63 74 78 2d 3e 69 6e 20 2b 20 63 6f 75 6e 74 3b  ctx->in + count;
1d3a0 0a 20 20 20 20 20 20 20 20 2a 70 2b 2b 20 3d 20  .        *p++ = 
1d3b0 30 78 38 30 3b 0a 0a 20 20 20 20 20 20 20 20 2f  0x80;..        /
1d3c0 2a 20 42 79 74 65 73 20 6f 66 20 70 61 64 64 69  * Bytes of paddi
1d3d0 6e 67 20 6e 65 65 64 65 64 20 74 6f 20 6d 61 6b  ng needed to mak
1d3e0 65 20 36 34 20 62 79 74 65 73 20 2a 2f 0a 20 20  e 64 bytes */.  
1d3f0 20 20 20 20 20 20 63 6f 75 6e 74 20 3d 20 36 34        count = 64
1d400 20 2d 20 31 20 2d 20 63 6f 75 6e 74 3b 0a 0a 20   - 1 - count;.. 
1d410 20 20 20 20 20 20 20 2f 2a 20 50 61 64 20 6f 75         /* Pad ou
1d420 74 20 74 6f 20 35 36 20 6d 6f 64 20 36 34 20 2a  t to 56 mod 64 *
1d430 2f 0a 20 20 20 20 20 20 20 20 69 66 20 28 63 6f  /.        if (co
1d440 75 6e 74 20 3c 20 38 29 20 7b 0a 20 20 20 20 20  unt < 8) {.     
1d450 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 77             /* Tw
1d460 6f 20 6c 6f 74 73 20 6f 66 20 70 61 64 64 69 6e  o lots of paddin
1d470 67 3a 20 20 50 61 64 20 74 68 65 20 66 69 72 73  g:  Pad the firs
1d480 74 20 62 6c 6f 63 6b 20 74 6f 20 36 34 20 62 79  t block to 64 by
1d490 74 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  tes */.         
1d4a0 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 2c         memset(p,
1d4b0 20 30 2c 20 63 6f 75 6e 74 29 3b 0a 20 20 20 20   0, count);.    
1d4c0 20 20 20 20 20 20 20 20 20 20 20 20 62 79 74 65              byte
1d4d0 52 65 76 65 72 73 65 28 63 74 78 2d 3e 69 6e 2c  Reverse(ctx->in,
1d4e0 20 31 36 29 3b 0a 20 20 20 20 20 20 20 20 20 20   16);.          
1d4f0 20 20 20 20 20 20 4d 44 35 54 72 61 6e 73 66 6f        MD5Transfo
1d500 72 6d 28 63 74 78 2d 3e 62 75 66 2c 20 28 75 69  rm(ctx->buf, (ui
1d510 6e 74 33 32 20 2a 29 63 74 78 2d 3e 69 6e 29 3b  nt32 *)ctx->in);
1d520 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1d530 20 20 2f 2a 20 4e 6f 77 20 66 69 6c 6c 20 74 68    /* Now fill th
1d540 65 20 6e 65 78 74 20 62 6c 6f 63 6b 20 77 69 74  e next block wit
1d550 68 20 35 36 20 62 79 74 65 73 20 2a 2f 0a 20 20  h 56 bytes */.  
1d560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 65                me
1d570 6d 73 65 74 28 63 74 78 2d 3e 69 6e 2c 20 30 2c  mset(ctx->in, 0,
1d580 20 35 36 29 3b 0a 20 20 20 20 20 20 20 20 7d 20   56);.        } 
1d590 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20  else {.         
1d5a0 20 20 20 20 20 20 20 2f 2a 20 50 61 64 20 62 6c         /* Pad bl
1d5b0 6f 63 6b 20 74 6f 20 35 36 20 62 79 74 65 73 20  ock to 56 bytes 
1d5c0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
1d5d0 20 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20     memset(p, 0, 
1d5e0 63 6f 75 6e 74 2d 38 29 3b 0a 20 20 20 20 20 20  count-8);.      
1d5f0 20 20 7d 0a 20 20 20 20 20 20 20 20 62 79 74 65    }.        byte
1d600 52 65 76 65 72 73 65 28 63 74 78 2d 3e 69 6e 2c  Reverse(ctx->in,
1d610 20 31 34 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f   14);..        /
1d620 2a 20 41 70 70 65 6e 64 20 6c 65 6e 67 74 68 20  * Append length 
1d630 69 6e 20 62 69 74 73 20 61 6e 64 20 74 72 61 6e  in bits and tran
1d640 73 66 6f 72 6d 20 2a 2f 0a 20 20 20 20 20 20 20  sform */.       
1d650 20 6d 65 6d 63 70 79 28 63 74 78 2d 3e 69 6e 20   memcpy(ctx->in 
1d660 2b 20 31 34 2a 34 2c 20 63 74 78 2d 3e 62 69 74  + 14*4, ctx->bit
1d670 73 2c 20 38 29 3b 0a 0a 20 20 20 20 20 20 20 20  s, 8);..        
1d680 4d 44 35 54 72 61 6e 73 66 6f 72 6d 28 63 74 78  MD5Transform(ctx
1d690 2d 3e 62 75 66 2c 20 28 75 69 6e 74 33 32 20 2a  ->buf, (uint32 *
1d6a0 29 63 74 78 2d 3e 69 6e 29 3b 0a 20 20 20 20 20  )ctx->in);.     
1d6b0 20 20 20 62 79 74 65 52 65 76 65 72 73 65 28 28     byteReverse((
1d6c0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
1d6d0 63 74 78 2d 3e 62 75 66 2c 20 34 29 3b 0a 20 20  ctx->buf, 4);.  
1d6e0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 64 69 67        memcpy(dig
1d6f0 65 73 74 2c 20 63 74 78 2d 3e 62 75 66 2c 20 31  est, ctx->buf, 1
1d700 36 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  6);.}../*.** Con
1d710 76 65 72 74 20 61 20 31 32 38 2d 62 69 74 20 4d  vert a 128-bit M
1d720 44 35 20 64 69 67 65 73 74 20 69 6e 74 6f 20 61  D5 digest into a
1d730 20 33 32 2d 64 69 67 69 74 20 62 61 73 65 2d 31   32-digit base-1
1d740 36 20 6e 75 6d 62 65 72 2e 0a 2a 2f 0a 73 74 61  6 number..*/.sta
1d750 74 69 63 20 76 6f 69 64 20 4d 44 35 44 69 67 65  tic void MD5Dige
1d760 73 74 54 6f 42 61 73 65 31 36 28 75 6e 73 69 67  stToBase16(unsig
1d770 6e 65 64 20 63 68 61 72 20 2a 64 69 67 65 73 74  ned char *digest
1d780 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20  , char *zBuf){. 
1d790 20 73 74 61 74 69 63 20 63 68 61 72 20 63 6f 6e   static char con
1d7a0 73 74 20 7a 45 6e 63 6f 64 65 5b 5d 20 3d 20 22  st zEncode[] = "
1d7b0 30 31 32 33 34 35 36 37 38 39 61 62 63 64 65 66  0123456789abcdef
1d7c0 22 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 0a  ";.  int i, j;..
1d7d0 20 20 66 6f 72 28 6a 3d 69 3d 30 3b 20 69 3c 31    for(j=i=0; i<1
1d7e0 36 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  6; i++){.    int
1d7f0 20 61 20 3d 20 64 69 67 65 73 74 5b 69 5d 3b 0a   a = digest[i];.
1d800 20 20 20 20 7a 42 75 66 5b 6a 2b 2b 5d 20 3d 20      zBuf[j++] = 
1d810 7a 45 6e 63 6f 64 65 5b 28 61 3e 3e 34 29 26 30  zEncode[(a>>4)&0
1d820 78 66 5d 3b 0a 20 20 20 20 7a 42 75 66 5b 6a 2b  xf];.    zBuf[j+
1d830 2b 5d 20 3d 20 7a 45 6e 63 6f 64 65 5b 61 20 26  +] = zEncode[a &
1d840 20 30 78 66 5d 3b 0a 20 20 7d 0a 20 20 7a 42 75   0xf];.  }.  zBu
1d850 66 5b 6a 5d 20 3d 20 30 3b 0a 7d 0a 0a 0a 2f 2a  f[j] = 0;.}.../*
1d860 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 31 32  .** Convert a 12
1d870 38 2d 62 69 74 20 4d 44 35 20 64 69 67 65 73 74  8-bit MD5 digest
1d880 20 69 6e 74 6f 20 73 65 71 75 65 6e 63 79 20 6f   into sequency o
1d890 66 20 65 69 67 68 74 20 35 2d 64 69 67 69 74 20  f eight 5-digit 
1d8a0 69 6e 74 65 67 65 72 73 0a 2a 2a 20 65 61 63 68  integers.** each
1d8b0 20 72 65 70 72 65 73 65 6e 74 69 6e 67 20 31 36   representing 16
1d8c0 20 62 69 74 73 20 6f 66 20 74 68 65 20 64 69 67   bits of the dig
1d8d0 65 73 74 20 61 6e 64 20 73 65 70 61 72 61 74 65  est and separate
1d8e0 64 20 66 72 6f 6d 20 65 61 63 68 0a 2a 2a 20 6f  d from each.** o
1d8f0 74 68 65 72 20 62 79 20 61 20 22 2d 22 20 63 68  ther by a "-" ch
1d900 61 72 61 63 74 65 72 2e 0a 2a 2f 0a 73 74 61 74  aracter..*/.stat
1d910 69 63 20 76 6f 69 64 20 4d 44 35 44 69 67 65 73  ic void MD5Diges
1d920 74 54 6f 42 61 73 65 31 30 78 38 28 75 6e 73 69  tToBase10x8(unsi
1d930 67 6e 65 64 20 63 68 61 72 20 64 69 67 65 73 74  gned char digest
1d940 5b 31 36 5d 2c 20 63 68 61 72 20 7a 44 69 67 65  [16], char zDige
1d950 73 74 5b 35 30 5d 29 7b 0a 20 20 69 6e 74 20 69  st[50]){.  int i
1d960 2c 20 6a 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  , j;.  unsigned 
1d970 69 6e 74 20 78 3b 0a 20 20 66 6f 72 28 69 3d 6a  int x;.  for(i=j
1d980 3d 30 3b 20 69 3c 31 36 3b 20 69 2b 3d 32 29 7b  =0; i<16; i+=2){
1d990 0a 20 20 20 20 78 20 3d 20 64 69 67 65 73 74 5b  .    x = digest[
1d9a0 69 5d 2a 32 35 36 20 2b 20 64 69 67 65 73 74 5b  i]*256 + digest[
1d9b0 69 2b 31 5d 3b 0a 20 20 20 20 69 66 28 20 69 3e  i+1];.    if( i>
1d9c0 30 20 29 20 7a 44 69 67 65 73 74 5b 6a 2b 2b 5d  0 ) zDigest[j++]
1d9d0 20 3d 20 27 2d 27 3b 0a 20 20 20 20 73 71 6c 69   = '-';.    sqli
1d9e0 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 35 30 2d  te3_snprintf(50-
1d9f0 6a 2c 20 26 7a 44 69 67 65 73 74 5b 6a 5d 2c 20  j, &zDigest[j], 
1da00 22 25 30 35 75 22 2c 20 78 29 3b 0a 20 20 20 20  "%05u", x);.    
1da10 6a 20 2b 3d 20 35 3b 0a 20 20 7d 0a 20 20 7a 44  j += 5;.  }.  zD
1da20 69 67 65 73 74 5b 6a 5d 20 3d 20 30 3b 0a 7d 0a  igest[j] = 0;.}.
1da30 0a 2f 2a 0a 2a 2a 20 41 20 54 43 4c 20 63 6f 6d  ./*.** A TCL com
1da40 6d 61 6e 64 20 66 6f 72 20 6d 64 35 2e 20 20 54  mand for md5.  T
1da50 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74  he argument is t
1da60 68 65 20 74 65 78 74 20 74 6f 20 62 65 20 68 61  he text to be ha
1da70 73 68 65 64 2e 20 20 54 68 65 0a 2a 2a 20 52 65  shed.  The.** Re
1da80 73 75 6c 74 20 69 73 20 74 68 65 20 68 61 73 68  sult is the hash
1da90 20 69 6e 20 62 61 73 65 36 34 2e 0a 2a 2f 0a 73   in base64..*/.s
1daa0 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
1dab0 5f 54 43 4c 41 50 49 20 6d 64 35 5f 63 6d 64 28  _TCLAPI md5_cmd(
1dac0 0a 20 20 76 6f 69 64 2a 63 64 2c 0a 20 20 54 63  .  void*cd,.  Tc
1dad0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
1dae0 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20  ,.  int argc,.  
1daf0 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 61 72 67  const char **arg
1db00 76 0a 29 7b 0a 20 20 4d 44 35 43 6f 6e 74 65 78  v.){.  MD5Contex
1db10 74 20 63 74 78 3b 0a 20 20 75 6e 73 69 67 6e 65  t ctx;.  unsigne
1db20 64 20 63 68 61 72 20 64 69 67 65 73 74 5b 31 36  d char digest[16
1db30 5d 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 35  ];.  char zBuf[5
1db40 30 5d 3b 0a 20 20 76 6f 69 64 20 28 2a 63 6f 6e  0];.  void (*con
1db50 76 65 72 74 65 72 29 28 75 6e 73 69 67 6e 65 64  verter)(unsigned
1db60 20 63 68 61 72 2a 2c 20 63 68 61 72 2a 29 3b 0a   char*, char*);.
1db70 0a 20 20 69 66 28 20 61 72 67 63 21 3d 32 20 29  .  if( argc!=2 )
1db80 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
1db90 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 77  Result(interp,"w
1dba0 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
1dbb0 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76  uld be \"", argv
1dbc0 5b 30 5d 2c 0a 20 20 20 20 20 20 20 20 22 20 54  [0],.        " T
1dbd0 45 58 54 5c 22 22 2c 20 28 63 68 61 72 2a 29 30  EXT\"", (char*)0
1dbe0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
1dbf0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 4d  L_ERROR;.  }.  M
1dc00 44 35 49 6e 69 74 28 26 63 74 78 29 3b 0a 20 20  D5Init(&ctx);.  
1dc10 4d 44 35 55 70 64 61 74 65 28 26 63 74 78 2c 20  MD5Update(&ctx, 
1dc20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29  (unsigned char*)
1dc30 61 72 67 76 5b 31 5d 2c 20 28 75 6e 73 69 67 6e  argv[1], (unsign
1dc40 65 64 29 73 74 72 6c 65 6e 28 61 72 67 76 5b 31  ed)strlen(argv[1
1dc50 5d 29 29 3b 0a 20 20 4d 44 35 46 69 6e 61 6c 28  ]));.  MD5Final(
1dc60 64 69 67 65 73 74 2c 20 26 63 74 78 29 3b 0a 20  digest, &ctx);. 
1dc70 20 63 6f 6e 76 65 72 74 65 72 20 3d 20 28 76 6f   converter = (vo
1dc80 69 64 28 2a 29 28 75 6e 73 69 67 6e 65 64 20 63  id(*)(unsigned c
1dc90 68 61 72 2a 2c 63 68 61 72 2a 29 29 63 64 3b 0a  har*,char*))cd;.
1dca0 20 20 63 6f 6e 76 65 72 74 65 72 28 64 69 67 65    converter(dige
1dcb0 73 74 2c 20 7a 42 75 66 29 3b 0a 20 20 54 63 6c  st, zBuf);.  Tcl
1dcc0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
1dcd0 74 65 72 70 2c 20 7a 42 75 66 2c 20 28 63 68 61  terp, zBuf, (cha
1dce0 72 2a 29 30 29 3b 0a 20 20 72 65 74 75 72 6e 20  r*)0);.  return 
1dcf0 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
1dd00 20 41 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20 74   A TCL command t
1dd10 6f 20 74 61 6b 65 20 74 68 65 20 6d 64 35 20 68  o take the md5 h
1dd20 61 73 68 20 6f 66 20 61 20 66 69 6c 65 2e 20 20  ash of a file.  
1dd30 54 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20  The argument is 
1dd40 74 68 65 0a 2a 2a 20 6e 61 6d 65 20 6f 66 20 74  the.** name of t
1dd50 68 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74  he file..*/.stat
1dd60 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43  ic int SQLITE_TC
1dd70 4c 41 50 49 20 6d 64 35 66 69 6c 65 5f 63 6d 64  LAPI md5file_cmd
1dd80 28 0a 20 20 76 6f 69 64 2a 63 64 2c 0a 20 20 54  (.  void*cd,.  T
1dd90 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
1dda0 70 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20  p,.  int argc,. 
1ddb0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 61 72   const char **ar
1ddc0 67 76 0a 29 7b 0a 20 20 46 49 4c 45 20 2a 69 6e  gv.){.  FILE *in
1ddd0 3b 0a 20 20 4d 44 35 43 6f 6e 74 65 78 74 20 63  ;.  MD5Context c
1dde0 74 78 3b 0a 20 20 76 6f 69 64 20 28 2a 63 6f 6e  tx;.  void (*con
1ddf0 76 65 72 74 65 72 29 28 75 6e 73 69 67 6e 65 64  verter)(unsigned
1de00 20 63 68 61 72 2a 2c 20 63 68 61 72 2a 29 3b 0a   char*, char*);.
1de10 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
1de20 64 69 67 65 73 74 5b 31 36 5d 3b 0a 20 20 63 68  digest[16];.  ch
1de30 61 72 20 7a 42 75 66 5b 31 30 32 34 30 5d 3b 0a  ar zBuf[10240];.
1de40 0a 20 20 69 66 28 20 61 72 67 63 21 3d 32 20 29  .  if( argc!=2 )
1de50 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
1de60 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 77  Result(interp,"w
1de70 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
1de80 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76  uld be \"", argv
1de90 5b 30 5d 2c 0a 20 20 20 20 20 20 20 20 22 20 46  [0],.        " F
1dea0 49 4c 45 4e 41 4d 45 5c 22 22 2c 20 28 63 68 61  ILENAME\"", (cha
1deb0 72 2a 29 30 29 3b 0a 20 20 20 20 72 65 74 75 72  r*)0);.    retur
1dec0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
1ded0 0a 20 20 69 6e 20 3d 20 66 6f 70 65 6e 28 61 72  .  in = fopen(ar
1dee0 67 76 5b 31 5d 2c 22 72 62 22 29 3b 0a 20 20 69  gv[1],"rb");.  i
1def0 66 28 20 69 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  f( in==0 ){.    
1df00 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
1df10 28 69 6e 74 65 72 70 2c 22 75 6e 61 62 6c 65 20  (interp,"unable 
1df20 74 6f 20 6f 70 65 6e 20 66 69 6c 65 20 5c 22 22  to open file \""
1df30 2c 20 61 72 67 76 5b 31 5d 2c 0a 20 20 20 20 20  , argv[1],.     
1df40 20 20 20 20 22 5c 22 20 66 6f 72 20 72 65 61 64      "\" for read
1df50 69 6e 67 22 2c 20 28 63 68 61 72 2a 29 30 29 3b  ing", (char*)0);
1df60 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
1df70 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 4d 44 35  ERROR;.  }.  MD5
1df80 49 6e 69 74 28 26 63 74 78 29 3b 0a 20 20 66 6f  Init(&ctx);.  fo
1df90 72 28 3b 3b 29 7b 0a 20 20 20 20 69 6e 74 20 6e  r(;;){.    int n
1dfa0 3b 0a 20 20 20 20 6e 20 3d 20 28 69 6e 74 29 66  ;.    n = (int)f
1dfb0 72 65 61 64 28 7a 42 75 66 2c 20 31 2c 20 73 69  read(zBuf, 1, si
1dfc0 7a 65 6f 66 28 7a 42 75 66 29 2c 20 69 6e 29 3b  zeof(zBuf), in);
1dfd0 0a 20 20 20 20 69 66 28 20 6e 3c 3d 30 20 29 20  .    if( n<=0 ) 
1dfe0 62 72 65 61 6b 3b 0a 20 20 20 20 4d 44 35 55 70  break;.    MD5Up
1dff0 64 61 74 65 28 26 63 74 78 2c 20 28 75 6e 73 69  date(&ctx, (unsi
1e000 67 6e 65 64 20 63 68 61 72 2a 29 7a 42 75 66 2c  gned char*)zBuf,
1e010 20 28 75 6e 73 69 67 6e 65 64 29 6e 29 3b 0a 20   (unsigned)n);. 
1e020 20 7d 0a 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b   }.  fclose(in);
1e030 0a 20 20 4d 44 35 46 69 6e 61 6c 28 64 69 67 65  .  MD5Final(dige
1e040 73 74 2c 20 26 63 74 78 29 3b 0a 20 20 63 6f 6e  st, &ctx);.  con
1e050 76 65 72 74 65 72 20 3d 20 28 76 6f 69 64 28 2a  verter = (void(*
1e060 29 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a  )(unsigned char*
1e070 2c 63 68 61 72 2a 29 29 63 64 3b 0a 20 20 63 6f  ,char*))cd;.  co
1e080 6e 76 65 72 74 65 72 28 64 69 67 65 73 74 2c 20  nverter(digest, 
1e090 7a 42 75 66 29 3b 0a 20 20 54 63 6c 5f 41 70 70  zBuf);.  Tcl_App
1e0a0 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
1e0b0 2c 20 7a 42 75 66 2c 20 28 63 68 61 72 2a 29 30  , zBuf, (char*)0
1e0c0 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
1e0d0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67  OK;.}../*.** Reg
1e0e0 69 73 74 65 72 20 74 68 65 20 66 6f 75 72 20 6e  ister the four n
1e0f0 65 77 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 73 20  ew TCL commands 
1e100 66 6f 72 20 67 65 6e 65 72 61 74 69 6e 67 20 4d  for generating M
1e110 44 35 20 63 68 65 63 6b 73 75 6d 73 0a 2a 2a 20  D5 checksums.** 
1e120 77 69 74 68 20 74 68 65 20 54 43 4c 20 69 6e 74  with the TCL int
1e130 65 72 70 72 65 74 65 72 2e 0a 2a 2f 0a 69 6e 74  erpreter..*/.int
1e140 20 4d 64 35 5f 49 6e 69 74 28 54 63 6c 5f 49 6e   Md5_Init(Tcl_In
1e150 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 0a 20  terp *interp){. 
1e160 20 54 63 6c 5f 43 72 65 61 74 65 43 6f 6d 6d 61   Tcl_CreateComma
1e170 6e 64 28 69 6e 74 65 72 70 2c 20 22 6d 64 35 22  nd(interp, "md5"
1e180 2c 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29  , (Tcl_CmdProc*)
1e190 6d 64 35 5f 63 6d 64 2c 0a 20 20 20 20 20 20 20  md5_cmd,.       
1e1a0 20 20 20 20 20 20 20 20 20 20 20 20 20 4d 44 35               MD5
1e1b0 44 69 67 65 73 74 54 6f 42 61 73 65 31 36 2c 20  DigestToBase16, 
1e1c0 30 29 3b 0a 20 20 54 63 6c 5f 43 72 65 61 74 65  0);.  Tcl_Create
1e1d0 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20  Command(interp, 
1e1e0 22 6d 64 35 2d 31 30 78 38 22 2c 20 28 54 63 6c  "md5-10x8", (Tcl
1e1f0 5f 43 6d 64 50 72 6f 63 2a 29 6d 64 35 5f 63 6d  _CmdProc*)md5_cm
1e200 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d,.             
1e210 20 20 20 20 20 20 20 4d 44 35 44 69 67 65 73 74         MD5Digest
1e220 54 6f 42 61 73 65 31 30 78 38 2c 20 30 29 3b 0a  ToBase10x8, 0);.
1e230 20 20 54 63 6c 5f 43 72 65 61 74 65 43 6f 6d 6d    Tcl_CreateComm
1e240 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 6d 64 35  and(interp, "md5
1e250 66 69 6c 65 22 2c 20 28 54 63 6c 5f 43 6d 64 50  file", (Tcl_CmdP
1e260 72 6f 63 2a 29 6d 64 35 66 69 6c 65 5f 63 6d 64  roc*)md5file_cmd
1e270 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1e280 20 20 20 20 20 20 4d 44 35 44 69 67 65 73 74 54        MD5DigestT
1e290 6f 42 61 73 65 31 36 2c 20 30 29 3b 0a 20 20 54  oBase16, 0);.  T
1e2a0 63 6c 5f 43 72 65 61 74 65 43 6f 6d 6d 61 6e 64  cl_CreateCommand
1e2b0 28 69 6e 74 65 72 70 2c 20 22 6d 64 35 66 69 6c  (interp, "md5fil
1e2c0 65 2d 31 30 78 38 22 2c 20 28 54 63 6c 5f 43 6d  e-10x8", (Tcl_Cm
1e2d0 64 50 72 6f 63 2a 29 6d 64 35 66 69 6c 65 5f 63  dProc*)md5file_c
1e2e0 6d 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  md,.            
1e2f0 20 20 20 20 20 20 20 20 4d 44 35 44 69 67 65 73          MD5Diges
1e300 74 54 6f 42 61 73 65 31 30 78 38 2c 20 30 29 3b  tToBase10x8, 0);
1e310 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
1e320 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65  ;.}.#endif /* de
1e330 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53  fined(SQLITE_TES
1e340 54 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  T) || defined(SQ
1e350 4c 49 54 45 5f 54 43 4c 4d 44 35 29 20 2a 2f 0a  LITE_TCLMD5) */.
1e360 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
1e370 49 54 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20  ITE_TEST)./*.** 
1e380 44 75 72 69 6e 67 20 74 65 73 74 69 6e 67 2c 20  During testing, 
1e390 74 68 65 20 73 70 65 63 69 61 6c 20 6d 64 35 73  the special md5s
1e3a0 75 6d 28 29 20 61 67 67 72 65 67 61 74 65 20 66  um() aggregate f
1e3b0 75 6e 63 74 69 6f 6e 20 69 73 20 61 76 61 69 6c  unction is avail
1e3c0 61 62 6c 65 2e 0a 2a 2a 20 69 6e 73 69 64 65 20  able..** inside 
1e3d0 53 51 4c 69 74 65 2e 20 20 54 68 65 20 66 6f 6c  SQLite.  The fol
1e3e0 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 20  lowing routines 
1e3f0 69 6d 70 6c 65 6d 65 6e 74 20 74 68 61 74 20 66  implement that f
1e400 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  unction..*/.stat
1e410 69 63 20 76 6f 69 64 20 6d 64 35 73 74 65 70 28  ic void md5step(
1e420 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
1e430 2a 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72  *context, int ar
1e440 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  gc, sqlite3_valu
1e450 65 20 2a 2a 61 72 67 76 29 7b 0a 20 20 4d 44 35  e **argv){.  MD5
1e460 43 6f 6e 74 65 78 74 20 2a 70 3b 0a 20 20 69 6e  Context *p;.  in
1e470 74 20 69 3b 0a 20 20 69 66 28 20 61 72 67 63 3c  t i;.  if( argc<
1e480 31 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 20  1 ) return;.  p 
1e490 3d 20 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67  = sqlite3_aggreg
1e4a0 61 74 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e 74  ate_context(cont
1e4b0 65 78 74 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29  ext, sizeof(*p))
1e4c0 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
1e4d0 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 21 70 2d  eturn;.  if( !p-
1e4e0 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20 20 20 4d  >isInit ){.    M
1e4f0 44 35 49 6e 69 74 28 70 29 3b 0a 20 20 7d 0a 20  D5Init(p);.  }. 
1e500 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 67 63   for(i=0; i<argc
1e510 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73  ; i++){.    cons
1e520 74 20 63 68 61 72 20 2a 7a 44 61 74 61 20 3d 20  t char *zData = 
1e530 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76  (char*)sqlite3_v
1e540 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 69  alue_text(argv[i
1e550 5d 29 3b 0a 20 20 20 20 69 66 28 20 7a 44 61 74  ]);.    if( zDat
1e560 61 20 29 7b 0a 20 20 20 20 20 20 4d 44 35 55 70  a ){.      MD5Up
1e570 64 61 74 65 28 70 2c 20 28 75 6e 73 69 67 6e 65  date(p, (unsigne
1e580 64 20 63 68 61 72 2a 29 7a 44 61 74 61 2c 20 28  d char*)zData, (
1e590 69 6e 74 29 73 74 72 6c 65 6e 28 7a 44 61 74 61  int)strlen(zData
1e5a0 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  ));.    }.  }.}.
1e5b0 73 74 61 74 69 63 20 76 6f 69 64 20 6d 64 35 66  static void md5f
1e5c0 69 6e 61 6c 69 7a 65 28 73 71 6c 69 74 65 33 5f  inalize(sqlite3_
1e5d0 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  context *context
1e5e0 29 7b 0a 20 20 4d 44 35 43 6f 6e 74 65 78 74 20  ){.  MD5Context 
1e5f0 2a 70 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  *p;.  unsigned c
1e600 68 61 72 20 64 69 67 65 73 74 5b 31 36 5d 3b 0a  har digest[16];.
1e610 20 20 63 68 61 72 20 7a 42 75 66 5b 33 33 5d 3b    char zBuf[33];
1e620 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 61  .  p = sqlite3_a
1e630 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74  ggregate_context
1e640 28 63 6f 6e 74 65 78 74 2c 20 73 69 7a 65 6f 66  (context, sizeof
1e650 28 2a 70 29 29 3b 0a 20 20 4d 44 35 46 69 6e 61  (*p));.  MD5Fina
1e660 6c 28 64 69 67 65 73 74 2c 70 29 3b 0a 20 20 4d  l(digest,p);.  M
1e670 44 35 44 69 67 65 73 74 54 6f 42 61 73 65 31 36  D5DigestToBase16
1e680 28 64 69 67 65 73 74 2c 20 7a 42 75 66 29 3b 0a  (digest, zBuf);.
1e690 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
1e6a0 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 7a  _text(context, z
1e6b0 42 75 66 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f  Buf, -1, SQLITE_
1e6c0 54 52 41 4e 53 49 45 4e 54 29 3b 0a 7d 0a 69 6e  TRANSIENT);.}.in
1e6d0 74 20 4d 64 35 5f 52 65 67 69 73 74 65 72 28 0a  t Md5_Register(.
1e6e0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20    sqlite3 *db,. 
1e6f0 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 4d 73 67   char **pzErrMsg
1e700 2c 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  ,.  const sqlite
1e710 33 5f 61 70 69 5f 72 6f 75 74 69 6e 65 73 20 2a  3_api_routines *
1e720 70 54 68 75 6e 6b 0a 29 7b 0a 20 20 69 6e 74 20  pThunk.){.  int 
1e730 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65  rc = sqlite3_cre
1e740 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c  ate_function(db,
1e750 20 22 6d 64 35 73 75 6d 22 2c 20 2d 31 2c 20 53   "md5sum", -1, S
1e760 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 30  QLITE_UTF8, 0, 0
1e770 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1e780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e790 20 20 20 6d 64 35 73 74 65 70 2c 20 6d 64 35 66     md5step, md5f
1e7a0 69 6e 61 6c 69 7a 65 29 3b 0a 20 20 73 71 6c 69  inalize);.  sqli
1e7b0 74 65 33 5f 6f 76 65 72 6c 6f 61 64 5f 66 75 6e  te3_overload_fun
1e7c0 63 74 69 6f 6e 28 64 62 2c 20 22 6d 64 35 73 75  ction(db, "md5su
1e7d0 6d 22 2c 20 2d 31 29 3b 20 20 2f 2a 20 54 6f 20  m", -1);  /* To 
1e7e0 65 78 65 72 63 69 73 65 20 74 68 69 73 20 41 50  exercise this AP
1e7f0 49 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72 63  I */.  return rc
1e800 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65  ;.}.#endif /* de
1e810 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53  fined(SQLITE_TES
1e820 54 29 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66  T) */.../*.** If
1e830 20 74 68 65 20 6d 61 63 72 6f 20 54 43 4c 53 48   the macro TCLSH
1e840 20 69 73 20 6f 6e 65 2c 20 74 68 65 6e 20 70 75   is one, then pu
1e850 74 20 69 6e 20 63 6f 64 65 20 74 68 69 73 20 66  t in code this f
1e860 6f 72 20 74 68 65 0a 2a 2a 20 22 6d 61 69 6e 22  or the.** "main"
1e870 20 72 6f 75 74 69 6e 65 20 74 68 61 74 20 77 69   routine that wi
1e880 6c 6c 20 69 6e 69 74 69 61 6c 69 7a 65 20 54 63  ll initialize Tc
1e890 6c 20 61 6e 64 20 74 61 6b 65 20 69 6e 70 75 74  l and take input
1e8a0 20 66 72 6f 6d 0a 2a 2a 20 73 74 61 6e 64 61 72   from.** standar
1e8b0 64 20 69 6e 70 75 74 2c 20 6f 72 20 69 66 20 61  d input, or if a
1e8c0 20 66 69 6c 65 20 69 73 20 6e 61 6d 65 64 20 6f   file is named o
1e8d0 6e 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69  n the command li
1e8e0 6e 65 0a 2a 2a 20 74 68 65 20 54 43 4c 20 69 6e  ne.** the TCL in
1e8f0 74 65 72 70 72 65 74 65 72 20 72 65 61 64 73 20  terpreter reads 
1e900 61 6e 64 20 65 76 61 6c 75 61 74 65 73 20 74 68  and evaluates th
1e910 61 74 20 66 69 6c 65 2e 0a 2a 2f 0a 23 69 66 20  at file..*/.#if 
1e920 54 43 4c 53 48 3d 3d 31 0a 73 74 61 74 69 63 20  TCLSH==1.static 
1e930 63 6f 6e 73 74 20 63 68 61 72 20 2a 74 63 6c 73  const char *tcls
1e940 68 5f 6d 61 69 6e 5f 6c 6f 6f 70 28 76 6f 69 64  h_main_loop(void
1e950 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  ){.  static cons
1e960 74 20 63 68 61 72 20 7a 4d 61 69 6e 6c 6f 6f 70  t char zMainloop
1e970 5b 5d 20 3d 0a 20 20 20 20 22 73 65 74 20 6c 69  [] =.    "set li
1e980 6e 65 20 7b 7d 5c 6e 22 0a 20 20 20 20 22 77 68  ne {}\n".    "wh
1e990 69 6c 65 20 7b 21 5b 65 6f 66 20 73 74 64 69 6e  ile {![eof stdin
1e9a0 5d 7d 20 7b 5c 6e 22 0a 20 20 20 20 20 20 22 69  ]} {\n".      "i
1e9b0 66 20 7b 24 6c 69 6e 65 21 3d 5c 22 5c 22 7d 20  f {$line!=\"\"} 
1e9c0 7b 5c 6e 22 0a 20 20 20 20 20 20 20 20 22 70 75  {\n".        "pu
1e9d0 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20 5c 22  ts -nonewline \"
1e9e0 3e 20 5c 22 5c 6e 22 0a 20 20 20 20 20 20 22 7d  > \"\n".      "}
1e9f0 20 65 6c 73 65 20 7b 5c 6e 22 0a 20 20 20 20 20   else {\n".     
1ea00 20 20 20 22 70 75 74 73 20 2d 6e 6f 6e 65 77 6c     "puts -nonewl
1ea10 69 6e 65 20 5c 22 25 20 5c 22 5c 6e 22 0a 20 20  ine \"% \"\n".  
1ea20 20 20 20 20 22 7d 5c 6e 22 0a 20 20 20 20 20 20      "}\n".      
1ea30 22 66 6c 75 73 68 20 73 74 64 6f 75 74 5c 6e 22  "flush stdout\n"
1ea40 0a 20 20 20 20 20 20 22 61 70 70 65 6e 64 20 6c  .      "append l
1ea50 69 6e 65 20 5b 67 65 74 73 20 73 74 64 69 6e 5d  ine [gets stdin]
1ea60 5c 6e 22 0a 20 20 20 20 20 20 22 69 66 20 7b 5b  \n".      "if {[
1ea70 69 6e 66 6f 20 63 6f 6d 70 6c 65 74 65 20 24 6c  info complete $l
1ea80 69 6e 65 5d 7d 20 7b 5c 6e 22 0a 20 20 20 20 20  ine]} {\n".     
1ea90 20 20 20 22 69 66 20 7b 5b 63 61 74 63 68 20 7b     "if {[catch {
1eaa0 75 70 6c 65 76 65 6c 20 23 30 20 24 6c 69 6e 65  uplevel #0 $line
1eab0 7d 20 72 65 73 75 6c 74 5d 7d 20 7b 5c 6e 22 0a  } result]} {\n".
1eac0 20 20 20 20 20 20 20 20 20 20 22 70 75 74 73 20            "puts 
1ead0 73 74 64 65 72 72 20 5c 22 45 72 72 6f 72 3a 20  stderr \"Error: 
1eae0 24 72 65 73 75 6c 74 5c 22 5c 6e 22 0a 20 20 20  $result\"\n".   
1eaf0 20 20 20 20 20 22 7d 20 65 6c 73 65 69 66 20 7b       "} elseif {
1eb00 24 72 65 73 75 6c 74 21 3d 5c 22 5c 22 7d 20 7b  $result!=\"\"} {
1eb10 5c 6e 22 0a 20 20 20 20 20 20 20 20 20 20 22 70  \n".          "p
1eb20 75 74 73 20 24 72 65 73 75 6c 74 5c 6e 22 0a 20  uts $result\n". 
1eb30 20 20 20 20 20 20 20 22 7d 5c 6e 22 0a 20 20 20         "}\n".   
1eb40 20 20 20 20 20 22 73 65 74 20 6c 69 6e 65 20 7b       "set line {
1eb50 7d 5c 6e 22 0a 20 20 20 20 20 20 22 7d 20 65 6c  }\n".      "} el
1eb60 73 65 20 7b 5c 6e 22 0a 20 20 20 20 20 20 20 20  se {\n".        
1eb70 22 61 70 70 65 6e 64 20 6c 69 6e 65 20 5c 5c 6e  "append line \\n
1eb80 5c 6e 22 0a 20 20 20 20 20 20 22 7d 5c 6e 22 0a  \n".      "}\n".
1eb90 20 20 20 20 22 7d 5c 6e 22 0a 20 20 3b 0a 20 20      "}\n".  ;.  
1eba0 72 65 74 75 72 6e 20 7a 4d 61 69 6e 6c 6f 6f 70  return zMainloop
1ebb0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 54  ;.}.#endif.#if T
1ebc0 43 4c 53 48 3d 3d 32 0a 73 74 61 74 69 63 20 63  CLSH==2.static c
1ebd0 6f 6e 73 74 20 63 68 61 72 20 2a 74 63 6c 73 68  onst char *tclsh
1ebe0 5f 6d 61 69 6e 5f 6c 6f 6f 70 28 76 6f 69 64 29  _main_loop(void)
1ebf0 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66  ;.#endif..#ifdef
1ec00 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 73 74 61   SQLITE_TEST.sta
1ec10 74 69 63 20 76 6f 69 64 20 69 6e 69 74 5f 61 6c  tic void init_al
1ec20 6c 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 29 3b  l(Tcl_Interp *);
1ec30 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
1ec40 54 45 5f 54 43 4c 41 50 49 20 69 6e 69 74 5f 61  TE_TCLAPI init_a
1ec50 6c 6c 5f 63 6d 64 28 0a 20 20 43 6c 69 65 6e 74  ll_cmd(.  Client
1ec60 44 61 74 61 20 63 64 2c 0a 20 20 54 63 6c 5f 49  Data cd,.  Tcl_I
1ec70 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
1ec80 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
1ec90 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
1eca0 5b 5d 0a 29 7b 0a 0a 20 20 54 63 6c 5f 49 6e 74  [].){..  Tcl_Int
1ecb0 65 72 70 20 2a 73 6c 61 76 65 3b 0a 20 20 69 66  erp *slave;.  if
1ecc0 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20  ( objc!=2 ){.   
1ecd0 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
1ece0 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
1ecf0 76 2c 20 22 53 4c 41 56 45 22 29 3b 0a 20 20 20  v, "SLAVE");.   
1ed00 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1ed10 52 3b 0a 20 20 7d 0a 0a 20 20 73 6c 61 76 65 20  R;.  }..  slave 
1ed20 3d 20 54 63 6c 5f 47 65 74 53 6c 61 76 65 28 69  = Tcl_GetSlave(i
1ed30 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
1ed40 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 29 3b 0a  ring(objv[1]));.
1ed50 20 20 69 66 28 20 21 73 6c 61 76 65 20 29 7b 0a    if( !slave ){.
1ed60 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
1ed70 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 6e 69  RROR;.  }..  ini
1ed80 74 5f 61 6c 6c 28 73 6c 61 76 65 29 3b 0a 20 20  t_all(slave);.  
1ed90 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
1eda0 0a 0a 2f 2a 0a 2a 2a 20 54 63 6c 63 6d 64 3a 20  ../*.** Tclcmd: 
1edb0 64 62 5f 75 73 65 5f 6c 65 67 61 63 79 5f 70 72  db_use_legacy_pr
1edc0 65 70 61 72 65 20 44 42 20 42 4f 4f 4c 45 41 4e  epare DB BOOLEAN
1edd0 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 66 69 72  .**.**   The fir
1ede0 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  st argument to t
1edf0 68 69 73 20 63 6f 6d 6d 61 6e 64 20 6d 75 73 74  his command must
1ee00 20 62 65 20 61 20 64 61 74 61 62 61 73 65 20 63   be a database c
1ee10 6f 6d 6d 61 6e 64 20 63 72 65 61 74 65 64 20 62  ommand created b
1ee20 79 0a 2a 2a 20 20 20 5b 73 71 6c 69 74 65 33 5d  y.**   [sqlite3]
1ee30 2e 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20  . If the second 
1ee40 61 72 67 75 6d 65 6e 74 20 69 73 20 74 72 75 65  argument is true
1ee50 2c 20 74 68 65 6e 20 74 68 65 20 68 61 6e 64 6c  , then the handl
1ee60 65 20 69 73 20 63 6f 6e 66 69 67 75 72 65 64 0a  e is configured.
1ee70 2a 2a 20 20 20 74 6f 20 75 73 65 20 74 68 65 20  **   to use the 
1ee80 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
1ee90 76 32 28 29 20 66 75 6e 63 74 69 6f 6e 20 74 6f  v2() function to
1eea0 20 70 72 65 70 61 72 65 20 73 74 61 74 65 6d 65   prepare stateme
1eeb0 6e 74 73 2e 20 49 66 20 69 74 0a 2a 2a 20 20 20  nts. If it.**   
1eec0 69 73 20 66 61 6c 73 65 2c 20 73 71 6c 69 74 65  is false, sqlite
1eed0 33 5f 70 72 65 70 61 72 65 28 29 2e 0a 2a 2f 0a  3_prepare()..*/.
1eee0 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54  static int SQLIT
1eef0 45 5f 54 43 4c 41 50 49 20 64 62 5f 75 73 65 5f  E_TCLAPI db_use_
1ef00 6c 65 67 61 63 79 5f 70 72 65 70 61 72 65 5f 63  legacy_prepare_c
1ef10 6d 64 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61  md(.  ClientData
1ef20 20 63 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72   cd,.  Tcl_Inter
1ef30 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
1ef40 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
1ef50 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
1ef60 7b 0a 20 20 54 63 6c 5f 43 6d 64 49 6e 66 6f 20  {.  Tcl_CmdInfo 
1ef70 63 6d 64 49 6e 66 6f 3b 0a 20 20 53 71 6c 69 74  cmdInfo;.  Sqlit
1ef80 65 44 62 20 2a 70 44 62 3b 0a 20 20 69 6e 74 20  eDb *pDb;.  int 
1ef90 62 50 72 65 70 61 72 65 3b 0a 0a 20 20 69 66 28  bPrepare;..  if(
1efa0 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20   objc!=3 ){.    
1efb0 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
1efc0 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
1efd0 2c 20 22 44 42 20 42 4f 4f 4c 45 41 4e 22 29 3b  , "DB BOOLEAN");
1efe0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
1eff0 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66  ERROR;.  }..  if
1f000 28 20 21 54 63 6c 5f 47 65 74 43 6f 6d 6d 61 6e  ( !Tcl_GetComman
1f010 64 49 6e 66 6f 28 69 6e 74 65 72 70 2c 20 54 63  dInfo(interp, Tc
1f020 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
1f030 5b 31 5d 29 2c 20 26 63 6d 64 49 6e 66 6f 29 20  [1]), &cmdInfo) 
1f040 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
1f050 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
1f060 22 6e 6f 20 73 75 63 68 20 64 62 3a 20 22 2c 20  "no such db: ", 
1f070 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
1f080 6a 76 5b 31 5d 29 2c 20 28 63 68 61 72 2a 29 30  jv[1]), (char*)0
1f090 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
1f0a0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70  L_ERROR;.  }.  p
1f0b0 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29  Db = (SqliteDb*)
1f0c0 63 6d 64 49 6e 66 6f 2e 6f 62 6a 43 6c 69 65 6e  cmdInfo.objClien
1f0d0 74 44 61 74 61 3b 0a 20 20 69 66 28 20 54 63 6c  tData;.  if( Tcl
1f0e0 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f  _GetBooleanFromO
1f0f0 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
1f100 32 5d 2c 20 26 62 50 72 65 70 61 72 65 29 20 29  2], &bPrepare) )
1f110 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  {.    return TCL
1f120 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 70  _ERROR;.  }..  p
1f130 44 62 2d 3e 62 4c 65 67 61 63 79 50 72 65 70 61  Db->bLegacyPrepa
1f140 72 65 20 3d 20 62 50 72 65 70 61 72 65 3b 0a 0a  re = bPrepare;..
1f150 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c    Tcl_ResetResul
1f160 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 72 65 74  t(interp);.  ret
1f170 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
1f180 2a 0a 2a 2a 20 54 63 6c 63 6d 64 3a 20 64 62 5f  *.** Tclcmd: db_
1f190 6c 61 73 74 5f 73 74 6d 74 5f 70 74 72 20 44 42  last_stmt_ptr DB
1f1a0 0a 2a 2a 0a 2a 2a 20 20 20 49 66 20 74 68 65 20  .**.**   If the 
1f1b0 73 74 61 74 65 6d 65 6e 74 20 63 61 63 68 65 20  statement cache 
1f1c0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
1f1d0 64 61 74 61 62 61 73 65 20 44 42 20 69 73 20 6e  database DB is n
1f1e0 6f 74 20 65 6d 70 74 79 2c 0a 2a 2a 20 20 20 72  ot empty,.**   r
1f1f0 65 74 75 72 6e 20 74 68 65 20 74 65 78 74 20 72  eturn the text r
1f200 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66  epresentation of
1f210 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
1f220 6c 79 20 75 73 65 64 20 73 74 61 74 65 6d 65 6e  ly used statemen
1f230 74 0a 2a 2a 20 20 20 68 61 6e 64 6c 65 2e 0a 2a  t.**   handle..*
1f240 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c  /.static int SQL
1f250 49 54 45 5f 54 43 4c 41 50 49 20 64 62 5f 6c 61  ITE_TCLAPI db_la
1f260 73 74 5f 73 74 6d 74 5f 70 74 72 28 0a 20 20 43  st_stmt_ptr(.  C
1f270 6c 69 65 6e 74 44 61 74 61 20 63 64 2c 0a 20 20  lientData cd,.  
1f280 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
1f290 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
1f2a0 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
1f2b0 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 65 78 74   objv[].){.  ext
1f2c0 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 54  ern int sqlite3T
1f2d0 65 73 74 4d 61 6b 65 50 6f 69 6e 74 65 72 53 74  estMakePointerSt
1f2e0 72 28 54 63 6c 5f 49 6e 74 65 72 70 2a 2c 20 63  r(Tcl_Interp*, c
1f2f0 68 61 72 2a 2c 20 76 6f 69 64 2a 29 3b 0a 20 20  har*, void*);.  
1f300 54 63 6c 5f 43 6d 64 49 6e 66 6f 20 63 6d 64 49  Tcl_CmdInfo cmdI
1f310 6e 66 6f 3b 0a 20 20 53 71 6c 69 74 65 44 62 20  nfo;.  SqliteDb 
1f320 2a 70 44 62 3b 0a 20 20 73 71 6c 69 74 65 33 5f  *pDb;.  sqlite3_
1f330 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b  stmt *pStmt = 0;
1f340 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 31 30 30  .  char zBuf[100
1f350 5d 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  ];..  if( objc!=
1f360 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  2 ){.    Tcl_Wro
1f370 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
1f380 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 22 29  , 1, objv, "DB")
1f390 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
1f3a0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69  _ERROR;.  }..  i
1f3b0 66 28 20 21 54 63 6c 5f 47 65 74 43 6f 6d 6d 61  f( !Tcl_GetComma
1f3c0 6e 64 49 6e 66 6f 28 69 6e 74 65 72 70 2c 20 54  ndInfo(interp, T
1f3d0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
1f3e0 76 5b 31 5d 29 2c 20 26 63 6d 64 49 6e 66 6f 29  v[1]), &cmdInfo)
1f3f0 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
1f400 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
1f410 20 22 6e 6f 20 73 75 63 68 20 64 62 3a 20 22 2c   "no such db: ",
1f420 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
1f430 62 6a 76 5b 31 5d 29 2c 20 28 63 68 61 72 2a 29  bjv[1]), (char*)
1f440 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
1f450 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
1f460 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62 2a  pDb = (SqliteDb*
1f470 29 63 6d 64 49 6e 66 6f 2e 6f 62 6a 43 6c 69 65  )cmdInfo.objClie
1f480 6e 74 44 61 74 61 3b 0a 0a 20 20 69 66 28 20 70  ntData;..  if( p
1f490 44 62 2d 3e 73 74 6d 74 4c 69 73 74 20 29 20 70  Db->stmtList ) p
1f4a0 53 74 6d 74 20 3d 20 70 44 62 2d 3e 73 74 6d 74  Stmt = pDb->stmt
1f4b0 4c 69 73 74 2d 3e 70 53 74 6d 74 3b 0a 20 20 69  List->pStmt;.  i
1f4c0 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 4d 61  f( sqlite3TestMa
1f4d0 6b 65 50 6f 69 6e 74 65 72 53 74 72 28 69 6e 74  kePointerStr(int
1f4e0 65 72 70 2c 20 7a 42 75 66 2c 20 70 53 74 6d 74  erp, zBuf, pStmt
1f4f0 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
1f500 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
1f510 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
1f520 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 54 43 4c  nterp, zBuf, TCL
1f530 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 0a 20 20 72  _VOLATILE);..  r
1f540 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
1f550 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
1f560 5f 54 45 53 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  _TEST */../*.** 
1f570 43 6f 6e 66 69 67 75 72 65 20 74 68 65 20 69 6e  Configure the in
1f580 74 65 72 70 72 65 74 65 72 20 70 61 73 73 65 64  terpreter passed
1f590 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
1f5a0 67 75 6d 65 6e 74 20 74 6f 20 68 61 76 65 20 61  gument to have a
1f5b0 63 63 65 73 73 0a 2a 2a 20 74 6f 20 74 68 65 20  ccess.** to the 
1f5c0 63 6f 6d 6d 61 6e 64 73 20 61 6e 64 20 6c 69 6e  commands and lin
1f5d0 6b 65 64 20 76 61 72 69 61 62 6c 65 73 20 74 68  ked variables th
1f5e0 61 74 20 6d 61 6b 65 20 75 70 3a 0a 2a 2a 0a 2a  at make up:.**.*
1f5f0 2a 20 20 20 2a 20 74 68 65 20 5b 73 71 6c 69 74  *   * the [sqlit
1f600 65 33 5d 20 65 78 74 65 6e 73 69 6f 6e 20 69 74  e3] extension it
1f610 73 65 6c 66 2c 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  self,.**.**   * 
1f620 49 66 20 53 51 4c 49 54 45 5f 54 43 4c 4d 44 35  If SQLITE_TCLMD5
1f630 20 6f 72 20 53 51 4c 49 54 45 5f 54 45 53 54 20   or SQLITE_TEST 
1f640 69 73 20 64 65 66 69 6e 65 64 2c 20 74 68 65 20  is defined, the 
1f650 4d 64 35 20 63 6f 6d 6d 61 6e 64 73 2c 20 61 6e  Md5 commands, an
1f660 64 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 53  d.**.**   * If S
1f670 51 4c 49 54 45 5f 54 45 53 54 20 69 73 20 73 65  QLITE_TEST is se
1f680 74 2c 20 74 68 65 20 76 61 72 69 6f 75 73 20 74  t, the various t
1f690 65 73 74 20 69 6e 74 65 72 66 61 63 65 73 20 75  est interfaces u
1f6a0 73 65 64 20 62 79 20 74 68 65 20 54 63 6c 0a 2a  sed by the Tcl.*
1f6b0 2a 20 20 20 20 20 74 65 73 74 20 73 75 69 74 65  *     test suite
1f6c0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1f6d0 20 69 6e 69 74 5f 61 6c 6c 28 54 63 6c 5f 49 6e   init_all(Tcl_In
1f6e0 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 0a 20  terp *interp){. 
1f6f0 20 53 71 6c 69 74 65 33 5f 49 6e 69 74 28 69 6e   Sqlite3_Init(in
1f700 74 65 72 70 29 3b 0a 0a 23 69 66 20 64 65 66 69  terp);..#if defi
1f710 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29  ned(SQLITE_TEST)
1f720 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49   || defined(SQLI
1f730 54 45 5f 54 43 4c 4d 44 35 29 0a 20 20 4d 64 35  TE_TCLMD5).  Md5
1f740 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 23  _Init(interp);.#
1f750 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51  endif..#ifdef SQ
1f760 4c 49 54 45 5f 54 45 53 54 0a 20 20 7b 0a 20 20  LITE_TEST.  {.  
1f770 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c    extern int Sql
1f780 69 74 65 63 6f 6e 66 69 67 5f 49 6e 69 74 28 54  iteconfig_Init(T
1f790 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20  cl_Interp*);.   
1f7a0 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69   extern int Sqli
1f7b0 74 65 74 65 73 74 31 5f 49 6e 69 74 28 54 63 6c  tetest1_Init(Tcl
1f7c0 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65  _Interp*);.    e
1f7d0 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65  xtern int Sqlite
1f7e0 74 65 73 74 32 5f 49 6e 69 74 28 54 63 6c 5f 49  test2_Init(Tcl_I
1f7f0 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74  nterp*);.    ext
1f800 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65  ern int Sqlitete
1f810 73 74 33 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74  st3_Init(Tcl_Int
1f820 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72  erp*);.    exter
1f830 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74  n int Sqlitetest
1f840 34 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  4_Init(Tcl_Inter
1f850 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20  p*);.    extern 
1f860 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 35 5f  int Sqlitetest5_
1f870 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a  Init(Tcl_Interp*
1f880 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e  );.    extern in
1f890 74 20 53 71 6c 69 74 65 74 65 73 74 36 5f 49 6e  t Sqlitetest6_In
1f8a0 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b  it(Tcl_Interp*);
1f8b0 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20  .    extern int 
1f8c0 53 71 6c 69 74 65 74 65 73 74 37 5f 49 6e 69 74  Sqlitetest7_Init
1f8d0 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20  (Tcl_Interp*);. 
1f8e0 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71     extern int Sq
1f8f0 6c 69 74 65 74 65 73 74 38 5f 49 6e 69 74 28 54  litetest8_Init(T
1f900 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20  cl_Interp*);.   
1f910 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69   extern int Sqli
1f920 74 65 74 65 73 74 39 5f 49 6e 69 74 28 54 63 6c  tetest9_Init(Tcl
1f930 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65  _Interp*);.    e
1f940 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65  xtern int Sqlite
1f950 74 65 73 74 61 73 79 6e 63 5f 49 6e 69 74 28 54  testasync_Init(T
1f960 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20  cl_Interp*);.   
1f970 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69   extern int Sqli
1f980 74 65 74 65 73 74 5f 61 75 74 6f 65 78 74 5f 49  tetest_autoext_I
1f990 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29  nit(Tcl_Interp*)
1f9a0 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74  ;.    extern int
1f9b0 20 53 71 6c 69 74 65 74 65 73 74 5f 62 6c 6f 62   Sqlitetest_blob
1f9c0 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
1f9d0 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69  *);.    extern i
1f9e0 6e 74 20 53 71 6c 69 74 65 74 65 73 74 5f 64 65  nt Sqlitetest_de
1f9f0 6d 6f 76 66 73 5f 49 6e 69 74 28 54 63 6c 5f 49  movfs_Init(Tcl_I
1fa00 6e 74 65 72 70 20 2a 29 3b 0a 20 20 20 20 65 78  nterp *);.    ex
1fa10 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74  tern int Sqlitet
1fa20 65 73 74 5f 66 75 6e 63 5f 49 6e 69 74 28 54 63  est_func_Init(Tc
1fa30 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20  l_Interp*);.    
1fa40 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74  extern int Sqlit
1fa50 65 74 65 73 74 5f 68 65 78 69 6f 5f 49 6e 69 74  etest_hexio_Init
1fa60 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20  (Tcl_Interp*);. 
1fa70 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71     extern int Sq
1fa80 6c 69 74 65 74 65 73 74 5f 69 6e 69 74 5f 49 6e  litetest_init_In
1fa90 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b  it(Tcl_Interp*);
1faa0 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20  .    extern int 
1fab0 53 71 6c 69 74 65 74 65 73 74 5f 6d 61 6c 6c 6f  Sqlitetest_mallo
1fac0 63 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  c_Init(Tcl_Inter
1fad0 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20  p*);.    extern 
1fae0 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 5f 6d  int Sqlitetest_m
1faf0 75 74 65 78 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  utex_Init(Tcl_In
1fb00 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65  terp*);.    exte
1fb10 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73  rn int Sqlitetes
1fb20 74 73 63 68 65 6d 61 5f 49 6e 69 74 28 54 63 6c  tschema_Init(Tcl
1fb30 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65  _Interp*);.    e
1fb40 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65  xtern int Sqlite
1fb50 74 65 73 74 73 73 65 5f 49 6e 69 74 28 54 63 6c  testsse_Init(Tcl
1fb60 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65  _Interp*);.    e
1fb70 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65  xtern int Sqlite
1fb80 74 65 73 74 74 63 6c 76 61 72 5f 49 6e 69 74 28  testtclvar_Init(
1fb90 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20  Tcl_Interp*);.  
1fba0 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c    extern int Sql
1fbb0 69 74 65 74 65 73 74 66 73 5f 49 6e 69 74 28 54  itetestfs_Init(T
1fbc0 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20  cl_Interp*);.   
1fbd0 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69   extern int Sqli
1fbe0 74 65 74 65 73 74 54 68 72 65 61 64 5f 49 6e 69  tetestThread_Ini
1fbf0 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a  t(Tcl_Interp*);.
1fc00 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53      extern int S
1fc10 71 6c 69 74 65 74 65 73 74 4f 6e 65 66 69 6c 65  qlitetestOnefile
1fc20 5f 49 6e 69 74 28 29 3b 0a 20 20 20 20 65 78 74  _Init();.    ext
1fc30 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65  ern int Sqlitete
1fc40 73 74 4f 73 69 6e 73 74 5f 49 6e 69 74 28 54 63  stOsinst_Init(Tc
1fc50 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20  l_Interp*);.    
1fc60 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74  extern int Sqlit
1fc70 65 74 65 73 74 62 61 63 6b 75 70 5f 49 6e 69 74  etestbackup_Init
1fc80 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20  (Tcl_Interp*);. 
1fc90 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71     extern int Sq
1fca0 6c 69 74 65 74 65 73 74 69 6e 74 61 72 72 61 79  litetestintarray
1fcb0 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
1fcc0 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69  *);.    extern i
1fcd0 6e 74 20 53 71 6c 69 74 65 74 65 73 74 76 66 73  nt Sqlitetestvfs
1fce0 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
1fcf0 20 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20   *);.    extern 
1fd00 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 72 74  int Sqlitetestrt
1fd10 72 65 65 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74  ree_Init(Tcl_Int
1fd20 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72  erp*);.    exter
1fd30 6e 20 69 6e 74 20 53 71 6c 69 74 65 71 75 6f 74  n int Sqlitequot
1fd40 61 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  a_Init(Tcl_Inter
1fd50 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20  p*);.    extern 
1fd60 69 6e 74 20 53 71 6c 69 74 65 6d 75 6c 74 69 70  int Sqlitemultip
1fd70 6c 65 78 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74  lex_Init(Tcl_Int
1fd80 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72  erp*);.    exter
1fd90 6e 20 69 6e 74 20 53 71 6c 69 74 65 53 75 70 65  n int SqliteSupe
1fda0 72 6c 6f 63 6b 5f 49 6e 69 74 28 54 63 6c 5f 49  rlock_Init(Tcl_I
1fdb0 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74  nterp*);.    ext
1fdc0 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65  ern int Sqlitete
1fdd0 73 74 53 79 73 63 61 6c 6c 5f 49 6e 69 74 28 54  stSyscall_Init(T
1fde0 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 23 69 66  cl_Interp*);.#if
1fdf0 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
1fe00 45 4e 41 42 4c 45 5f 53 45 53 53 49 4f 4e 29 20  ENABLE_SESSION) 
1fe10 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
1fe20 45 5f 45 4e 41 42 4c 45 5f 50 52 45 55 50 44 41  E_ENABLE_PREUPDA
1fe30 54 45 5f 48 4f 4f 4b 29 0a 20 20 20 20 65 78 74  TE_HOOK).    ext
1fe40 65 72 6e 20 69 6e 74 20 54 65 73 74 53 65 73 73  ern int TestSess
1fe50 69 6f 6e 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74  ion_Init(Tcl_Int
1fe60 65 72 70 2a 29 3b 0a 23 65 6e 64 69 66 0a 20 20  erp*);.#endif.  
1fe70 20 20 65 78 74 65 72 6e 20 69 6e 74 20 46 74 73    extern int Fts
1fe80 35 74 63 6c 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  5tcl_Init(Tcl_In
1fe90 74 65 72 70 20 2a 29 3b 0a 20 20 20 20 65 78 74  terp *);.    ext
1fea0 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 52 62  ern int SqliteRb
1feb0 75 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  u_Init(Tcl_Inter
1fec0 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20  p*);.    extern 
1fed0 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 74 63  int Sqlitetesttc
1fee0 6c 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  l_Init(Tcl_Inter
1fef0 70 2a 29 3b 0a 23 69 66 20 64 65 66 69 6e 65 64  p*);.#if defined
1ff00 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46  (SQLITE_ENABLE_F
1ff10 54 53 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  TS3) || defined(
1ff20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54  SQLITE_ENABLE_FT
1ff30 53 34 29 0a 20 20 20 20 65 78 74 65 72 6e 20 69  S4).    extern i
1ff40 6e 74 20 53 71 6c 69 74 65 74 65 73 74 66 74 73  nt Sqlitetestfts
1ff50 33 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  3_Init(Tcl_Inter
1ff60 70 20 2a 69 6e 74 65 72 70 29 3b 0a 23 65 6e 64  p *interp);.#end
1ff70 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  if..#ifdef SQLIT
1ff80 45 5f 45 4e 41 42 4c 45 5f 5a 49 50 56 46 53 0a  E_ENABLE_ZIPVFS.
1ff90 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 5a      extern int Z
1ffa0 69 70 76 66 73 5f 49 6e 69 74 28 54 63 6c 5f 49  ipvfs_Init(Tcl_I
1ffb0 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 5a 69 70  nterp*);.    Zip
1ffc0 76 66 73 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  vfs_Init(interp)
1ffd0 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 53 71  ;.#endif..    Sq
1ffe0 6c 69 74 65 63 6f 6e 66 69 67 5f 49 6e 69 74 28  liteconfig_Init(
1fff0 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c  interp);.    Sql
20000 69 74 65 74 65 73 74 31 5f 49 6e 69 74 28 69 6e  itetest1_Init(in
20010 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74  terp);.    Sqlit
20020 65 74 65 73 74 32 5f 49 6e 69 74 28 69 6e 74 65  etest2_Init(inte
20030 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74  rp);.    Sqlitet
20040 65 73 74 33 5f 49 6e 69 74 28 69 6e 74 65 72 70  est3_Init(interp
20050 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73  );.    Sqlitetes
20060 74 34 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b  t4_Init(interp);
20070 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 35  .    Sqlitetest5
20080 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20  _Init(interp);. 
20090 20 20 20 53 71 6c 69 74 65 74 65 73 74 36 5f 49     Sqlitetest6_I
200a0 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20  nit(interp);.   
200b0 20 53 71 6c 69 74 65 74 65 73 74 37 5f 49 6e 69   Sqlitetest7_Ini
200c0 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53  t(interp);.    S
200d0 71 6c 69 74 65 74 65 73 74 38 5f 49 6e 69 74 28  qlitetest8_Init(
200e0 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c  interp);.    Sql
200f0 69 74 65 74 65 73 74 39 5f 49 6e 69 74 28 69 6e  itetest9_Init(in
20100 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74  terp);.    Sqlit
20110 65 74 65 73 74 61 73 79 6e 63 5f 49 6e 69 74 28  etestasync_Init(
20120 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c  interp);.    Sql
20130 69 74 65 74 65 73 74 5f 61 75 74 6f 65 78 74 5f  itetest_autoext_
20140 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  Init(interp);.  
20150 20 20 53 71 6c 69 74 65 74 65 73 74 5f 62 6c 6f    Sqlitetest_blo
20160 62 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a  b_Init(interp);.
20170 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 5f 64      Sqlitetest_d
20180 65 6d 6f 76 66 73 5f 49 6e 69 74 28 69 6e 74 65  emovfs_Init(inte
20190 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74  rp);.    Sqlitet
201a0 65 73 74 5f 66 75 6e 63 5f 49 6e 69 74 28 69 6e  est_func_Init(in
201b0 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74  terp);.    Sqlit
201c0 65 74 65 73 74 5f 68 65 78 69 6f 5f 49 6e 69 74  etest_hexio_Init
201d0 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71  (interp);.    Sq
201e0 6c 69 74 65 74 65 73 74 5f 69 6e 69 74 5f 49 6e  litetest_init_In
201f0 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  it(interp);.    
20200 53 71 6c 69 74 65 74 65 73 74 5f 6d 61 6c 6c 6f  Sqlitetest_mallo
20210 63 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a  c_Init(interp);.
20220 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 5f 6d      Sqlitetest_m
20230 75 74 65 78 5f 49 6e 69 74 28 69 6e 74 65 72 70  utex_Init(interp
20240 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73  );.    Sqlitetes
20250 74 73 63 68 65 6d 61 5f 49 6e 69 74 28 69 6e 74  tschema_Init(int
20260 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65  erp);.    Sqlite
20270 74 65 73 74 74 63 6c 76 61 72 5f 49 6e 69 74 28  testtclvar_Init(
20280 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c  interp);.    Sql
20290 69 74 65 74 65 73 74 66 73 5f 49 6e 69 74 28 69  itetestfs_Init(i
202a0 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69  nterp);.    Sqli
202b0 74 65 74 65 73 74 54 68 72 65 61 64 5f 49 6e 69  tetestThread_Ini
202c0 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53  t(interp);.    S
202d0 71 6c 69 74 65 74 65 73 74 4f 6e 65 66 69 6c 65  qlitetestOnefile
202e0 5f 49 6e 69 74 28 29 3b 0a 20 20 20 20 53 71 6c  _Init();.    Sql
202f0 69 74 65 74 65 73 74 4f 73 69 6e 73 74 5f 49 6e  itetestOsinst_In
20300 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  it(interp);.    
20310 53 71 6c 69 74 65 74 65 73 74 62 61 63 6b 75 70  Sqlitetestbackup
20320 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20  _Init(interp);. 
20330 20 20 20 53 71 6c 69 74 65 74 65 73 74 69 6e 74     Sqlitetestint
20340 61 72 72 61 79 5f 49 6e 69 74 28 69 6e 74 65 72  array_Init(inter
20350 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65  p);.    Sqlitete
20360 73 74 76 66 73 5f 49 6e 69 74 28 69 6e 74 65 72  stvfs_Init(inter
20370 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65  p);.    Sqlitete
20380 73 74 72 74 72 65 65 5f 49 6e 69 74 28 69 6e 74  strtree_Init(int
20390 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65  erp);.    Sqlite
203a0 71 75 6f 74 61 5f 49 6e 69 74 28 69 6e 74 65 72  quota_Init(inter
203b0 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 6d 75  p);.    Sqlitemu
203c0 6c 74 69 70 6c 65 78 5f 49 6e 69 74 28 69 6e 74  ltiplex_Init(int
203d0 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65  erp);.    Sqlite
203e0 53 75 70 65 72 6c 6f 63 6b 5f 49 6e 69 74 28 69  Superlock_Init(i
203f0 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69  nterp);.    Sqli
20400 74 65 74 65 73 74 53 79 73 63 61 6c 6c 5f 49 6e  tetestSyscall_In
20410 69 74 28 69 6e 74 65 72 70 29 3b 0a 23 69 66 20  it(interp);.#if 
20420 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
20430 4e 41 42 4c 45 5f 53 45 53 53 49 4f 4e 29 20 26  NABLE_SESSION) &
20440 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
20450 5f 45 4e 41 42 4c 45 5f 50 52 45 55 50 44 41 54  _ENABLE_PREUPDAT
20460 45 5f 48 4f 4f 4b 29 0a 20 20 20 20 54 65 73 74  E_HOOK).    Test
20470 53 65 73 73 69 6f 6e 5f 49 6e 69 74 28 69 6e 74  Session_Init(int
20480 65 72 70 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  erp);.#endif.   
20490 20 46 74 73 35 74 63 6c 5f 49 6e 69 74 28 69 6e   Fts5tcl_Init(in
204a0 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74  terp);.    Sqlit
204b0 65 52 62 75 5f 49 6e 69 74 28 69 6e 74 65 72 70  eRbu_Init(interp
204c0 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73  );.    Sqlitetes
204d0 74 74 63 6c 5f 49 6e 69 74 28 69 6e 74 65 72 70  ttcl_Init(interp
204e0 29 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  );..#if defined(
204f0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54  SQLITE_ENABLE_FT
20500 53 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53  S3) || defined(S
20510 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53  QLITE_ENABLE_FTS
20520 34 29 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73  4).    Sqlitetes
20530 74 66 74 73 33 5f 49 6e 69 74 28 69 6e 74 65 72  tfts3_Init(inter
20540 70 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20  p);.#endif..    
20550 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d  Tcl_CreateObjCom
20560 6d 61 6e 64 28 0a 20 20 20 20 20 20 20 20 69 6e  mand(.        in
20570 74 65 72 70 2c 20 22 6c 6f 61 64 5f 74 65 73 74  terp, "load_test
20580 66 69 78 74 75 72 65 5f 65 78 74 65 6e 73 69 6f  fixture_extensio
20590 6e 73 22 2c 20 69 6e 69 74 5f 61 6c 6c 5f 63 6d  ns", init_all_cm
205a0 64 2c 20 30 2c 20 30 0a 20 20 20 20 29 3b 0a 20  d, 0, 0.    );. 
205b0 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a     Tcl_CreateObj
205c0 43 6f 6d 6d 61 6e 64 28 0a 20 20 20 20 20 20 20  Command(.       
205d0 20 69 6e 74 65 72 70 2c 20 22 64 62 5f 75 73 65   interp, "db_use
205e0 5f 6c 65 67 61 63 79 5f 70 72 65 70 61 72 65 22  _legacy_prepare"
205f0 2c 20 64 62 5f 75 73 65 5f 6c 65 67 61 63 79 5f  , db_use_legacy_
20600 70 72 65 70 61 72 65 5f 63 6d 64 2c 20 30 2c 20  prepare_cmd, 0, 
20610 30 0a 20 20 20 20 29 3b 0a 20 20 20 20 54 63 6c  0.    );.    Tcl
20620 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e  _CreateObjComman
20630 64 28 0a 20 20 20 20 20 20 20 20 69 6e 74 65 72  d(.        inter
20640 70 2c 20 22 64 62 5f 6c 61 73 74 5f 73 74 6d 74  p, "db_last_stmt
20650 5f 70 74 72 22 2c 20 64 62 5f 6c 61 73 74 5f 73  _ptr", db_last_s
20660 74 6d 74 5f 70 74 72 2c 20 30 2c 20 30 0a 20 20  tmt_ptr, 0, 0.  
20670 20 20 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c    );..#ifdef SQL
20680 49 54 45 5f 53 53 45 0a 20 20 20 20 53 71 6c 69  ITE_SSE.    Sqli
20690 74 65 74 65 73 74 73 73 65 5f 49 6e 69 74 28 69  tetestsse_Init(i
206a0 6e 74 65 72 70 29 3b 0a 23 65 6e 64 69 66 0a 20  nterp);.#endif. 
206b0 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 20   }.#endif.}../* 
206c0 4e 65 65 64 65 64 20 66 6f 72 20 74 68 65 20 73  Needed for the s
206d0 65 74 72 6c 69 6d 69 74 28 29 20 73 79 73 74 65  etrlimit() syste
206e0 6d 20 63 61 6c 6c 20 6f 6e 20 75 6e 69 78 20 2a  m call on unix *
206f0 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 75 6e  /.#if defined(un
20700 69 78 29 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79  ix).#include <sy
20710 73 2f 72 65 73 6f 75 72 63 65 2e 68 3e 0a 23 65  s/resource.h>.#e
20720 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 54 43  ndif..#define TC
20730 4c 53 48 5f 4d 41 49 4e 20 6d 61 69 6e 20 20 20  LSH_MAIN main   
20740 2f 2a 20 4e 65 65 64 65 64 20 74 6f 20 66 61 6b  /* Needed to fak
20750 65 20 6f 75 74 20 6d 6b 74 63 6c 61 70 70 20 2a  e out mktclapp *
20760 2f 0a 69 6e 74 20 53 51 4c 49 54 45 5f 43 44 45  /.int SQLITE_CDE
20770 43 4c 20 54 43 4c 53 48 5f 4d 41 49 4e 28 69 6e  CL TCLSH_MAIN(in
20780 74 20 61 72 67 63 2c 20 63 68 61 72 20 2a 2a 61  t argc, char **a
20790 72 67 76 29 7b 0a 20 20 54 63 6c 5f 49 6e 74 65  rgv){.  Tcl_Inte
207a0 72 70 20 2a 69 6e 74 65 72 70 3b 0a 0a 23 69 66  rp *interp;..#if
207b0 20 21 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32   !defined(_WIN32
207c0 5f 57 43 45 29 0a 20 20 69 66 28 20 67 65 74 65  _WCE).  if( gete
207d0 6e 76 28 22 42 52 45 41 4b 22 29 20 29 7b 0a 20  nv("BREAK") ){. 
207e0 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
207f0 72 2c 0a 20 20 20 20 20 20 20 20 22 61 74 74 61  r,.        "atta
20800 63 68 20 64 65 62 75 67 67 65 72 20 74 6f 20 70  ch debugger to p
20810 72 6f 63 65 73 73 20 25 64 20 61 6e 64 20 70 72  rocess %d and pr
20820 65 73 73 20 61 6e 79 20 6b 65 79 20 74 6f 20 63  ess any key to c
20830 6f 6e 74 69 6e 75 65 2e 5c 6e 22 2c 0a 20 20 20  ontinue.\n",.   
20840 20 20 20 20 20 47 45 54 50 49 44 28 29 29 3b 0a       GETPID());.
20850 20 20 20 20 66 67 65 74 63 28 73 74 64 69 6e 29      fgetc(stdin)
20860 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
20870 2f 2a 20 53 69 6e 63 65 20 74 68 65 20 70 72 69  /* Since the pri
20880 6d 61 72 79 20 75 73 65 20 63 61 73 65 20 66 6f  mary use case fo
20890 72 20 74 68 69 73 20 62 69 6e 61 72 79 20 69 73  r this binary is
208a0 20 74 65 73 74 69 6e 67 20 6f 66 20 53 51 4c 69   testing of SQLi
208b0 74 65 2c 0a 20 20 2a 2a 20 62 65 20 73 75 72 65  te,.  ** be sure
208c0 20 74 6f 20 67 65 6e 65 72 61 74 65 20 63 6f 72   to generate cor
208d0 65 20 66 69 6c 65 73 20 69 66 20 77 65 20 63 72  e files if we cr
208e0 61 73 68 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e  ash */.#if defin
208f0 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 20  ed(SQLITE_TEST) 
20900 26 26 20 64 65 66 69 6e 65 64 28 75 6e 69 78 29  && defined(unix)
20910 0a 20 20 7b 20 73 74 72 75 63 74 20 72 6c 69 6d  .  { struct rlim
20920 69 74 20 78 3b 0a 20 20 20 20 67 65 74 72 6c 69  it x;.    getrli
20930 6d 69 74 28 52 4c 49 4d 49 54 5f 43 4f 52 45 2c  mit(RLIMIT_CORE,
20940 20 26 78 29 3b 0a 20 20 20 20 78 2e 72 6c 69 6d   &x);.    x.rlim
20950 5f 63 75 72 20 3d 20 78 2e 72 6c 69 6d 5f 6d 61  _cur = x.rlim_ma
20960 78 3b 0a 20 20 20 20 73 65 74 72 6c 69 6d 69 74  x;.    setrlimit
20970 28 52 4c 49 4d 49 54 5f 43 4f 52 45 2c 20 26 78  (RLIMIT_CORE, &x
20980 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  );.  }.#endif /*
20990 20 53 51 4c 49 54 45 5f 54 45 53 54 20 26 26 20   SQLITE_TEST && 
209a0 75 6e 69 78 20 2a 2f 0a 0a 0a 20 20 2f 2a 20 43  unix */...  /* C
209b0 61 6c 6c 20 73 71 6c 69 74 65 33 5f 73 68 75 74  all sqlite3_shut
209c0 64 6f 77 6e 28 29 20 6f 6e 63 65 20 62 65 66 6f  down() once befo
209d0 72 65 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e  re doing anythin
209e0 67 20 65 6c 73 65 2e 20 54 68 69 73 20 69 73 20  g else. This is 
209f0 74 6f 0a 20 20 2a 2a 20 74 65 73 74 20 74 68 61  to.  ** test tha
20a00 74 20 73 71 6c 69 74 65 33 5f 73 68 75 74 64 6f  t sqlite3_shutdo
20a10 77 6e 28 29 20 63 61 6e 20 62 65 20 73 61 66 65  wn() can be safe
20a20 6c 79 20 63 61 6c 6c 65 64 20 62 79 20 61 20 70  ly called by a p
20a30 72 6f 63 65 73 73 20 62 65 66 6f 72 65 0a 20 20  rocess before.  
20a40 2a 2a 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69  ** sqlite3_initi
20a50 61 6c 69 7a 65 28 29 20 69 73 2e 20 2a 2f 0a 20  alize() is. */. 
20a60 20 73 71 6c 69 74 65 33 5f 73 68 75 74 64 6f 77   sqlite3_shutdow
20a70 6e 28 29 3b 0a 0a 20 20 54 63 6c 5f 46 69 6e 64  n();..  Tcl_Find
20a80 45 78 65 63 75 74 61 62 6c 65 28 61 72 67 76 5b  Executable(argv[
20a90 30 5d 29 3b 0a 20 20 54 63 6c 5f 53 65 74 53 79  0]);.  Tcl_SetSy
20aa0 73 74 65 6d 45 6e 63 6f 64 69 6e 67 28 4e 55 4c  stemEncoding(NUL
20ab0 4c 2c 20 22 75 74 66 2d 38 22 29 3b 0a 20 20 69  L, "utf-8");.  i
20ac0 6e 74 65 72 70 20 3d 20 54 63 6c 5f 43 72 65 61  nterp = Tcl_Crea
20ad0 74 65 49 6e 74 65 72 70 28 29 3b 0a 0a 23 69 66  teInterp();..#if
20ae0 20 54 43 4c 53 48 3d 3d 32 0a 20 20 73 71 6c 69   TCLSH==2.  sqli
20af0 74 65 33 5f 63 6f 6e 66 69 67 28 53 51 4c 49 54  te3_config(SQLIT
20b00 45 5f 43 4f 4e 46 49 47 5f 53 49 4e 47 4c 45 54  E_CONFIG_SINGLET
20b10 48 52 45 41 44 29 3b 0a 23 65 6e 64 69 66 0a 0a  HREAD);.#endif..
20b20 20 20 69 6e 69 74 5f 61 6c 6c 28 69 6e 74 65 72    init_all(inter
20b30 70 29 3b 0a 20 20 69 66 28 20 61 72 67 63 3e 3d  p);.  if( argc>=
20b40 32 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  2 ){.    int i;.
20b50 20 20 20 20 63 68 61 72 20 7a 41 72 67 63 5b 33      char zArgc[3
20b60 32 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  2];.    sqlite3_
20b70 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
20b80 7a 41 72 67 63 29 2c 20 7a 41 72 67 63 2c 20 22  zArgc), zArgc, "
20b90 25 64 22 2c 20 61 72 67 63 2d 28 33 2d 54 43 4c  %d", argc-(3-TCL
20ba0 53 48 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65  SH));.    Tcl_Se
20bb0 74 56 61 72 28 69 6e 74 65 72 70 2c 22 61 72 67  tVar(interp,"arg
20bc0 63 22 2c 20 7a 41 72 67 63 2c 20 54 43 4c 5f 47  c", zArgc, TCL_G
20bd0 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 20 20 20  LOBAL_ONLY);.   
20be0 20 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65   Tcl_SetVar(inte
20bf0 72 70 2c 22 61 72 67 76 30 22 2c 61 72 67 76 5b  rp,"argv0",argv[
20c00 31 5d 2c 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e  1],TCL_GLOBAL_ON
20c10 4c 59 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74  LY);.    Tcl_Set
20c20 56 61 72 28 69 6e 74 65 72 70 2c 22 61 72 67 76  Var(interp,"argv
20c30 22 2c 20 22 22 2c 20 54 43 4c 5f 47 4c 4f 42 41  ", "", TCL_GLOBA
20c40 4c 5f 4f 4e 4c 59 29 3b 0a 20 20 20 20 66 6f 72  L_ONLY);.    for
20c50 28 69 3d 33 2d 54 43 4c 53 48 3b 20 69 3c 61 72  (i=3-TCLSH; i<ar
20c60 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  gc; i++){.      
20c70 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72  Tcl_SetVar(inter
20c80 70 2c 20 22 61 72 67 76 22 2c 20 61 72 67 76 5b  p, "argv", argv[
20c90 69 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 54 43  i],.          TC
20ca0 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 20 7c 20  L_GLOBAL_ONLY | 
20cb0 54 43 4c 5f 4c 49 53 54 5f 45 4c 45 4d 45 4e 54  TCL_LIST_ELEMENT
20cc0 20 7c 20 54 43 4c 5f 41 50 50 45 4e 44 5f 56 41   | TCL_APPEND_VA
20cd0 4c 55 45 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  LUE);.    }.    
20ce0 69 66 28 20 54 43 4c 53 48 3d 3d 31 20 26 26 20  if( TCLSH==1 && 
20cf0 54 63 6c 5f 45 76 61 6c 46 69 6c 65 28 69 6e 74  Tcl_EvalFile(int
20d00 65 72 70 2c 20 61 72 67 76 5b 31 5d 29 21 3d 54  erp, argv[1])!=T
20d10 43 4c 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 63  CL_OK ){.      c
20d20 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e 66 6f  onst char *zInfo
20d30 20 3d 20 54 63 6c 5f 47 65 74 56 61 72 28 69 6e   = Tcl_GetVar(in
20d40 74 65 72 70 2c 20 22 65 72 72 6f 72 49 6e 66 6f  terp, "errorInfo
20d50 22 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e  ", TCL_GLOBAL_ON
20d60 4c 59 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  LY);.      if( z
20d70 49 6e 66 6f 3d 3d 30 20 29 20 7a 49 6e 66 6f 20  Info==0 ) zInfo 
20d80 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52  = Tcl_GetStringR
20d90 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20  esult(interp);. 
20da0 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64       fprintf(std
20db0 65 72 72 2c 22 25 73 3a 20 25 73 5c 6e 22 2c 20  err,"%s: %s\n", 
20dc0 2a 61 72 67 76 2c 20 7a 49 6e 66 6f 29 3b 0a 20  *argv, zInfo);. 
20dd0 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
20de0 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 54     }.  }.  if( T
20df0 43 4c 53 48 3d 3d 32 20 7c 7c 20 61 72 67 63 3c  CLSH==2 || argc<
20e00 3d 31 20 29 7b 0a 20 20 20 20 54 63 6c 5f 47 6c  =1 ){.    Tcl_Gl
20e10 6f 62 61 6c 45 76 61 6c 28 69 6e 74 65 72 70 2c  obalEval(interp,
20e20 20 74 63 6c 73 68 5f 6d 61 69 6e 5f 6c 6f 6f 70   tclsh_main_loop
20e30 28 29 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ());.  }.  retur
20e40 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  n 0;.}.#endif /*
20e50 20 54 43 4c 53 48 20 2a 2f 0a                     TCLSH */.