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

Artifact 342379845d52c62a778c76c3dd0a2695af723e04:


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 54  tion */.  int nT
17f0: 72 61 6e 73 61 63 74 69 6f 6e 3b 20 20 20 20 20  ransaction;     
1800: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1810: 66 20 6e 65 73 74 65 64 20 5b 74 72 61 6e 73 61  f nested [transa
1820: 63 74 69 6f 6e 5d 20 6d 65 74 68 6f 64 73 20 2a  ction] methods *
1830: 2f 0a 20 20 69 6e 74 20 6f 70 65 6e 46 6c 61 67  /.  int openFlag
1840: 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  s;             /
1850: 2a 20 46 6c 61 67 73 20 75 73 65 64 20 74 6f 20  * Flags used to 
1860: 6f 70 65 6e 2e 20 20 28 53 51 4c 49 54 45 5f 4f  open.  (SQLITE_O
1870: 50 45 4e 5f 55 52 49 29 20 2a 2f 0a 23 69 66 64  PEN_URI) */.#ifd
1880: 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
1890: 20 69 6e 74 20 62 4c 65 67 61 63 79 50 72 65 70   int bLegacyPrep
18a0: 61 72 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  are;        /* T
18b0: 72 75 65 20 74 6f 20 75 73 65 20 73 71 6c 69 74  rue to use sqlit
18c0: 65 33 5f 70 72 65 70 61 72 65 28 29 20 2a 2f 0a  e3_prepare() */.
18d0: 23 65 6e 64 69 66 0a 7d 3b 0a 0a 73 74 72 75 63  #endif.};..struc
18e0: 74 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65  t IncrblobChanne
18f0: 6c 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 62 6c  l {.  sqlite3_bl
1900: 6f 62 20 2a 70 42 6c 6f 62 3b 20 20 20 20 20 20  ob *pBlob;      
1910: 2f 2a 20 73 71 6c 69 74 65 33 20 62 6c 6f 62 20  /* sqlite3 blob 
1920: 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 53 71 6c 69  handle */.  Sqli
1930: 74 65 44 62 20 2a 70 44 62 3b 20 20 20 20 20 20  teDb *pDb;      
1940: 20 20 20 20 20 20 2f 2a 20 41 73 73 6f 63 69 61        /* Associa
1950: 74 65 64 20 64 61 74 61 62 61 73 65 20 63 6f 6e  ted database con
1960: 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  nection */.  int
1970: 20 69 53 65 65 6b 3b 20 20 20 20 20 20 20 20 20   iSeek;         
1980: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
1990: 74 20 73 65 65 6b 20 6f 66 66 73 65 74 20 2a 2f  t seek offset */
19a0: 0a 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63  .  Tcl_Channel c
19b0: 68 61 6e 6e 65 6c 3b 20 20 20 20 20 20 2f 2a 20  hannel;      /* 
19c0: 43 68 61 6e 6e 65 6c 20 69 64 65 6e 74 69 66 69  Channel identifi
19d0: 65 72 20 2a 2f 0a 20 20 49 6e 63 72 62 6c 6f 62  er */.  Incrblob
19e0: 43 68 61 6e 6e 65 6c 20 2a 70 4e 65 78 74 3b 20  Channel *pNext; 
19f0: 20 20 2f 2a 20 4c 69 6e 6b 65 64 20 6c 69 73 74    /* Linked list
1a00: 20 6f 66 20 61 6c 6c 20 6f 70 65 6e 20 69 6e 63   of all open inc
1a10: 72 62 6c 6f 62 20 63 68 61 6e 6e 65 6c 73 20 2a  rblob channels *
1a20: 2f 0a 20 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e  /.  IncrblobChan
1a30: 6e 65 6c 20 2a 70 50 72 65 76 3b 20 20 20 2f 2a  nel *pPrev;   /*
1a40: 20 4c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20   Linked list of 
1a50: 61 6c 6c 20 6f 70 65 6e 20 69 6e 63 72 62 6c 6f  all open incrblo
1a60: 62 20 63 68 61 6e 6e 65 6c 73 20 2a 2f 0a 7d 3b  b channels */.};
1a70: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20  ../*.** Compute 
1a80: 61 20 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  a string length 
1a90: 74 68 61 74 20 69 73 20 6c 69 6d 69 74 65 64 20  that is limited 
1aa0: 74 6f 20 77 68 61 74 20 63 61 6e 20 62 65 20 73  to what can be s
1ab0: 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 6c 6f 77 65  tored in.** lowe
1ac0: 72 20 33 30 20 62 69 74 73 20 6f 66 20 61 20 33  r 30 bits of a 3
1ad0: 32 2d 62 69 74 20 73 69 67 6e 65 64 20 69 6e 74  2-bit signed int
1ae0: 65 67 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  eger..*/.static 
1af0: 69 6e 74 20 73 74 72 6c 65 6e 33 30 28 63 6f 6e  int strlen30(con
1b00: 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 63  st char *z){.  c
1b10: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 32 20 3d 20  onst char *z2 = 
1b20: 7a 3b 0a 20 20 77 68 69 6c 65 28 20 2a 7a 32 20  z;.  while( *z2 
1b30: 29 7b 20 7a 32 2b 2b 3b 20 7d 0a 20 20 72 65 74  ){ z2++; }.  ret
1b40: 75 72 6e 20 30 78 33 66 66 66 66 66 66 66 20 26  urn 0x3fffffff &
1b50: 20 28 69 6e 74 29 28 7a 32 20 2d 20 7a 29 3b 0a   (int)(z2 - z);.
1b60: 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  }...#ifndef SQLI
1b70: 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42  TE_OMIT_INCRBLOB
1b80: 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c  ./*.** Close all
1b90: 20 69 6e 63 72 62 6c 6f 62 20 63 68 61 6e 6e 65   incrblob channe
1ba0: 6c 73 20 6f 70 65 6e 65 64 20 75 73 69 6e 67 20  ls opened using 
1bb0: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
1bc0: 69 6f 6e 20 70 44 62 2e 0a 2a 2a 20 54 68 69 73  ion pDb..** This
1bd0: 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   is called when 
1be0: 73 68 75 74 74 69 6e 67 20 64 6f 77 6e 20 74 68  shutting down th
1bf0: 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
1c00: 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
1c10: 20 76 6f 69 64 20 63 6c 6f 73 65 49 6e 63 72 62   void closeIncrb
1c20: 6c 6f 62 43 68 61 6e 6e 65 6c 73 28 53 71 6c 69  lobChannels(Sqli
1c30: 74 65 44 62 20 2a 70 44 62 29 7b 0a 20 20 49 6e  teDb *pDb){.  In
1c40: 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 70  crblobChannel *p
1c50: 3b 0a 20 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e  ;.  IncrblobChan
1c60: 6e 65 6c 20 2a 70 4e 65 78 74 3b 0a 0a 20 20 66  nel *pNext;..  f
1c70: 6f 72 28 70 3d 70 44 62 2d 3e 70 49 6e 63 72 62  or(p=pDb->pIncrb
1c80: 6c 6f 62 3b 20 70 3b 20 70 3d 70 4e 65 78 74 29  lob; p; p=pNext)
1c90: 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 2d  {.    pNext = p-
1ca0: 3e 70 4e 65 78 74 3b 0a 0a 20 20 20 20 2f 2a 20  >pNext;..    /* 
1cb0: 4e 6f 74 65 3a 20 43 61 6c 6c 69 6e 67 20 75 6e  Note: Calling un
1cc0: 72 65 67 69 73 74 65 72 20 68 65 72 65 20 63 61  register here ca
1cd0: 6c 6c 20 54 63 6c 5f 43 6c 6f 73 65 20 6f 6e 20  ll Tcl_Close on 
1ce0: 74 68 65 20 69 6e 63 72 62 6c 6f 62 20 63 68 61  the incrblob cha
1cf0: 6e 6e 65 6c 2c 0a 20 20 20 20 2a 2a 20 77 68 69  nnel,.    ** whi
1d00: 63 68 20 64 65 6c 65 74 65 73 20 74 68 65 20 49  ch deletes the I
1d10: 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 73  ncrblobChannel s
1d20: 74 72 75 63 74 75 72 65 20 61 74 20 2a 70 2e 20  tructure at *p. 
1d30: 53 6f 20 64 6f 20 6e 6f 74 0a 20 20 20 20 2a 2a  So do not.    **
1d40: 20 63 61 6c 6c 20 54 63 6c 5f 46 72 65 65 28 29   call Tcl_Free()
1d50: 20 68 65 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   here..    */.  
1d60: 20 20 54 63 6c 5f 55 6e 72 65 67 69 73 74 65 72    Tcl_Unregister
1d70: 43 68 61 6e 6e 65 6c 28 70 44 62 2d 3e 69 6e 74  Channel(pDb->int
1d80: 65 72 70 2c 20 70 2d 3e 63 68 61 6e 6e 65 6c 29  erp, p->channel)
1d90: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ;.  }.}../*.** C
1da0: 6c 6f 73 65 20 61 6e 20 69 6e 63 72 65 6d 65 6e  lose an incremen
1db0: 74 61 6c 20 62 6c 6f 62 20 63 68 61 6e 6e 65 6c  tal blob channel
1dc0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1dd0: 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 69 6e  SQLITE_TCLAPI in
1de0: 63 72 62 6c 6f 62 43 6c 6f 73 65 28 0a 20 20 43  crblobClose(.  C
1df0: 6c 69 65 6e 74 44 61 74 61 20 69 6e 73 74 61 6e  lientData instan
1e00: 63 65 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ceData,.  Tcl_In
1e10: 74 65 72 70 20 2a 69 6e 74 65 72 70 0a 29 7b 0a  terp *interp.){.
1e20: 20 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65    IncrblobChanne
1e30: 6c 20 2a 70 20 3d 20 28 49 6e 63 72 62 6c 6f 62  l *p = (Incrblob
1e40: 43 68 61 6e 6e 65 6c 20 2a 29 69 6e 73 74 61 6e  Channel *)instan
1e50: 63 65 44 61 74 61 3b 0a 20 20 69 6e 74 20 72 63  ceData;.  int rc
1e60: 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f   = sqlite3_blob_
1e70: 63 6c 6f 73 65 28 70 2d 3e 70 42 6c 6f 62 29 3b  close(p->pBlob);
1e80: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
1e90: 20 70 2d 3e 70 44 62 2d 3e 64 62 3b 0a 0a 20 20   p->pDb->db;..  
1ea0: 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 63 68  /* Remove the ch
1eb0: 61 6e 6e 65 6c 20 66 72 6f 6d 20 74 68 65 20 53  annel from the S
1ec0: 71 6c 69 74 65 44 62 2e 70 49 6e 63 72 62 6c 6f  qliteDb.pIncrblo
1ed0: 62 20 6c 69 73 74 2e 20 2a 2f 0a 20 20 69 66 28  b list. */.  if(
1ee0: 20 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20   p->pNext ){.   
1ef0: 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76   p->pNext->pPrev
1f00: 20 3d 20 70 2d 3e 70 50 72 65 76 3b 0a 20 20 7d   = p->pPrev;.  }
1f10: 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 65 76 20  .  if( p->pPrev 
1f20: 29 7b 0a 20 20 20 20 70 2d 3e 70 50 72 65 76 2d  ){.    p->pPrev-
1f30: 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78  >pNext = p->pNex
1f40: 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  t;.  }.  if( p->
1f50: 70 44 62 2d 3e 70 49 6e 63 72 62 6c 6f 62 3d 3d  pDb->pIncrblob==
1f60: 70 20 29 7b 0a 20 20 20 20 70 2d 3e 70 44 62 2d  p ){.    p->pDb-
1f70: 3e 70 49 6e 63 72 62 6c 6f 62 20 3d 20 70 2d 3e  >pIncrblob = p->
1f80: 70 4e 65 78 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  pNext;.  }..  /*
1f90: 20 46 72 65 65 20 74 68 65 20 49 6e 63 72 62 6c   Free the Incrbl
1fa0: 6f 62 43 68 61 6e 6e 65 6c 20 73 74 72 75 63 74  obChannel struct
1fb0: 75 72 65 20 2a 2f 0a 20 20 54 63 6c 5f 46 72 65  ure */.  Tcl_Fre
1fc0: 65 28 28 63 68 61 72 20 2a 29 70 29 3b 0a 0a 20  e((char *)p);.. 
1fd0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1fe0: 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65  OK ){.    Tcl_Se
1ff0: 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  tResult(interp, 
2000: 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f  (char *)sqlite3_
2010: 65 72 72 6d 73 67 28 64 62 29 2c 20 54 43 4c 5f  errmsg(db), TCL_
2020: 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 20 20 72  VOLATILE);.    r
2030: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
2040: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43  .  }.  return TC
2050: 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  L_OK;.}../*.** R
2060: 65 61 64 20 64 61 74 61 20 66 72 6f 6d 20 61 6e  ead data from an
2070: 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 62 6c 6f   incremental blo
2080: 62 20 63 68 61 6e 6e 65 6c 2e 0a 2a 2f 0a 73 74  b channel..*/.st
2090: 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
20a0: 54 43 4c 41 50 49 20 69 6e 63 72 62 6c 6f 62 49  TCLAPI incrblobI
20b0: 6e 70 75 74 28 0a 20 20 43 6c 69 65 6e 74 44 61  nput(.  ClientDa
20c0: 74 61 20 69 6e 73 74 61 6e 63 65 44 61 74 61 2c  ta instanceData,
20d0: 0a 20 20 63 68 61 72 20 2a 62 75 66 2c 0a 20 20  .  char *buf,.  
20e0: 69 6e 74 20 62 75 66 53 69 7a 65 2c 0a 20 20 69  int bufSize,.  i
20f0: 6e 74 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72  nt *errorCodePtr
2100: 0a 29 7b 0a 20 20 49 6e 63 72 62 6c 6f 62 43 68  .){.  IncrblobCh
2110: 61 6e 6e 65 6c 20 2a 70 20 3d 20 28 49 6e 63 72  annel *p = (Incr
2120: 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 29 69 6e  blobChannel *)in
2130: 73 74 61 6e 63 65 44 61 74 61 3b 0a 20 20 69 6e  stanceData;.  in
2140: 74 20 6e 52 65 61 64 20 3d 20 62 75 66 53 69 7a  t nRead = bufSiz
2150: 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  e;         /* Nu
2160: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f  mber of bytes to
2170: 20 72 65 61 64 20 2a 2f 0a 20 20 69 6e 74 20 6e   read */.  int n
2180: 42 6c 6f 62 3b 20 20 20 20 20 20 20 20 20 20 20  Blob;           
2190: 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c          /* Total
21a0: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 62 6c 6f   size of the blo
21b0: 62 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  b */.  int rc;  
21c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21d0: 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 20 65 72      /* sqlite er
21e0: 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 6e  ror code */..  n
21f0: 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f 62  Blob = sqlite3_b
2200: 6c 6f 62 5f 62 79 74 65 73 28 70 2d 3e 70 42 6c  lob_bytes(p->pBl
2210: 6f 62 29 3b 0a 20 20 69 66 28 20 28 70 2d 3e 69  ob);.  if( (p->i
2220: 53 65 65 6b 2b 6e 52 65 61 64 29 3e 6e 42 6c 6f  Seek+nRead)>nBlo
2230: 62 20 29 7b 0a 20 20 20 20 6e 52 65 61 64 20 3d  b ){.    nRead =
2240: 20 6e 42 6c 6f 62 2d 70 2d 3e 69 53 65 65 6b 3b   nBlob-p->iSeek;
2250: 0a 20 20 7d 0a 20 20 69 66 28 20 6e 52 65 61 64  .  }.  if( nRead
2260: 3c 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  <=0 ){.    retur
2270: 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d  n 0;.  }..  rc =
2280: 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 72 65   sqlite3_blob_re
2290: 61 64 28 70 2d 3e 70 42 6c 6f 62 2c 20 28 76 6f  ad(p->pBlob, (vo
22a0: 69 64 20 2a 29 62 75 66 2c 20 6e 52 65 61 64 2c  id *)buf, nRead,
22b0: 20 70 2d 3e 69 53 65 65 6b 29 3b 0a 20 20 69 66   p->iSeek);.  if
22c0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
22d0: 29 7b 0a 20 20 20 20 2a 65 72 72 6f 72 43 6f 64  ){.    *errorCod
22e0: 65 50 74 72 20 3d 20 72 63 3b 0a 20 20 20 20 72  ePtr = rc;.    r
22f0: 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 0a 20  eturn -1;.  }.. 
2300: 20 70 2d 3e 69 53 65 65 6b 20 2b 3d 20 6e 52 65   p->iSeek += nRe
2310: 61 64 3b 0a 20 20 72 65 74 75 72 6e 20 6e 52 65  ad;.  return nRe
2320: 61 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  ad;.}../*.** Wri
2330: 74 65 20 64 61 74 61 20 74 6f 20 61 6e 20 69 6e  te data to an in
2340: 63 72 65 6d 65 6e 74 61 6c 20 62 6c 6f 62 20 63  cremental blob c
2350: 68 61 6e 6e 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69  hannel..*/.stati
2360: 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c  c int SQLITE_TCL
2370: 41 50 49 20 69 6e 63 72 62 6c 6f 62 4f 75 74 70  API incrblobOutp
2380: 75 74 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61  ut(.  ClientData
2390: 20 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 0a 20   instanceData,. 
23a0: 20 43 4f 4e 53 54 20 63 68 61 72 20 2a 62 75 66   CONST char *buf
23b0: 2c 0a 20 20 69 6e 74 20 74 6f 57 72 69 74 65 2c  ,.  int toWrite,
23c0: 0a 20 20 69 6e 74 20 2a 65 72 72 6f 72 43 6f 64  .  int *errorCod
23d0: 65 50 74 72 0a 29 7b 0a 20 20 49 6e 63 72 62 6c  ePtr.){.  Incrbl
23e0: 6f 62 43 68 61 6e 6e 65 6c 20 2a 70 20 3d 20 28  obChannel *p = (
23f0: 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20  IncrblobChannel 
2400: 2a 29 69 6e 73 74 61 6e 63 65 44 61 74 61 3b 0a  *)instanceData;.
2410: 20 20 69 6e 74 20 6e 57 72 69 74 65 20 3d 20 74    int nWrite = t
2420: 6f 57 72 69 74 65 3b 20 20 20 20 20 20 20 20 2f  oWrite;        /
2430: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
2440: 73 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a 20 20  s to write */.  
2450: 69 6e 74 20 6e 42 6c 6f 62 3b 20 20 20 20 20 20  int nBlob;      
2460: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2470: 54 6f 74 61 6c 20 73 69 7a 65 20 6f 66 20 74 68  Total size of th
2480: 65 20 62 6c 6f 62 20 2a 2f 0a 20 20 69 6e 74 20  e blob */.  int 
2490: 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
24a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69           /* sqli
24b0: 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f  te error code */
24c0: 0a 0a 20 20 6e 42 6c 6f 62 20 3d 20 73 71 6c 69  ..  nBlob = sqli
24d0: 74 65 33 5f 62 6c 6f 62 5f 62 79 74 65 73 28 70  te3_blob_bytes(p
24e0: 2d 3e 70 42 6c 6f 62 29 3b 0a 20 20 69 66 28 20  ->pBlob);.  if( 
24f0: 28 70 2d 3e 69 53 65 65 6b 2b 6e 57 72 69 74 65  (p->iSeek+nWrite
2500: 29 3e 6e 42 6c 6f 62 20 29 7b 0a 20 20 20 20 2a  )>nBlob ){.    *
2510: 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 45  errorCodePtr = E
2520: 49 4e 56 41 4c 3b 0a 20 20 20 20 72 65 74 75 72  INVAL;.    retur
2530: 6e 20 2d 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20  n -1;.  }.  if( 
2540: 6e 57 72 69 74 65 3c 3d 30 20 29 7b 0a 20 20 20  nWrite<=0 ){.   
2550: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a   return 0;.  }..
2560: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62    rc = sqlite3_b
2570: 6c 6f 62 5f 77 72 69 74 65 28 70 2d 3e 70 42 6c  lob_write(p->pBl
2580: 6f 62 2c 20 28 76 6f 69 64 20 2a 29 62 75 66 2c  ob, (void *)buf,
2590: 20 6e 57 72 69 74 65 2c 20 70 2d 3e 69 53 65 65   nWrite, p->iSee
25a0: 6b 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  k);.  if( rc!=SQ
25b0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a  LITE_OK ){.    *
25c0: 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 45  errorCodePtr = E
25d0: 49 4f 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 2d  IO;.    return -
25e0: 31 3b 0a 20 20 7d 0a 0a 20 20 70 2d 3e 69 53 65  1;.  }..  p->iSe
25f0: 65 6b 20 2b 3d 20 6e 57 72 69 74 65 3b 0a 20 20  ek += nWrite;.  
2600: 72 65 74 75 72 6e 20 6e 57 72 69 74 65 3b 0a 7d  return nWrite;.}
2610: 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20 61 6e 20  ../*.** Seek an 
2620: 69 6e 63 72 65 6d 65 6e 74 61 6c 20 62 6c 6f 62  incremental blob
2630: 20 63 68 61 6e 6e 65 6c 2e 0a 2a 2f 0a 73 74 61   channel..*/.sta
2640: 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54  tic int SQLITE_T
2650: 43 4c 41 50 49 20 69 6e 63 72 62 6c 6f 62 53 65  CLAPI incrblobSe
2660: 65 6b 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61  ek(.  ClientData
2670: 20 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 0a 20   instanceData,. 
2680: 20 6c 6f 6e 67 20 6f 66 66 73 65 74 2c 0a 20 20   long offset,.  
2690: 69 6e 74 20 73 65 65 6b 4d 6f 64 65 2c 0a 20 20  int seekMode,.  
26a0: 69 6e 74 20 2a 65 72 72 6f 72 43 6f 64 65 50 74  int *errorCodePt
26b0: 72 0a 29 7b 0a 20 20 49 6e 63 72 62 6c 6f 62 43  r.){.  IncrblobC
26c0: 68 61 6e 6e 65 6c 20 2a 70 20 3d 20 28 49 6e 63  hannel *p = (Inc
26d0: 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 29 69  rblobChannel *)i
26e0: 6e 73 74 61 6e 63 65 44 61 74 61 3b 0a 0a 20 20  nstanceData;..  
26f0: 73 77 69 74 63 68 28 20 73 65 65 6b 4d 6f 64 65  switch( seekMode
2700: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 45 45   ){.    case SEE
2710: 4b 5f 53 45 54 3a 0a 20 20 20 20 20 20 70 2d 3e  K_SET:.      p->
2720: 69 53 65 65 6b 20 3d 20 6f 66 66 73 65 74 3b 0a  iSeek = offset;.
2730: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2740: 20 63 61 73 65 20 53 45 45 4b 5f 43 55 52 3a 0a   case SEEK_CUR:.
2750: 20 20 20 20 20 20 70 2d 3e 69 53 65 65 6b 20 2b        p->iSeek +
2760: 3d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  = offset;.      
2770: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
2780: 53 45 45 4b 5f 45 4e 44 3a 0a 20 20 20 20 20 20  SEEK_END:.      
2790: 70 2d 3e 69 53 65 65 6b 20 3d 20 73 71 6c 69 74  p->iSeek = sqlit
27a0: 65 33 5f 62 6c 6f 62 5f 62 79 74 65 73 28 70 2d  e3_blob_bytes(p-
27b0: 3e 70 42 6c 6f 62 29 20 2b 20 6f 66 66 73 65 74  >pBlob) + offset
27c0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a  ;.      break;..
27d0: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 61 73 73      default: ass
27e0: 65 72 74 28 21 22 42 61 64 20 73 65 65 6b 4d 6f  ert(!"Bad seekMo
27f0: 64 65 22 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  de");.  }..  ret
2800: 75 72 6e 20 70 2d 3e 69 53 65 65 6b 3b 0a 7d 0a  urn p->iSeek;.}.
2810: 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 53 51  ..static void SQ
2820: 4c 49 54 45 5f 54 43 4c 41 50 49 20 69 6e 63 72  LITE_TCLAPI incr
2830: 62 6c 6f 62 57 61 74 63 68 28 0a 20 20 43 6c 69  blobWatch(.  Cli
2840: 65 6e 74 44 61 74 61 20 69 6e 73 74 61 6e 63 65  entData instance
2850: 44 61 74 61 2c 0a 20 20 69 6e 74 20 6d 6f 64 65  Data,.  int mode
2860: 0a 29 7b 0a 20 20 2f 2a 20 4e 4f 2d 4f 50 20 2a  .){.  /* NO-OP *
2870: 2f 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 53  /.}.static int S
2880: 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 69 6e 63  QLITE_TCLAPI inc
2890: 72 62 6c 6f 62 48 61 6e 64 6c 65 28 0a 20 20 43  rblobHandle(.  C
28a0: 6c 69 65 6e 74 44 61 74 61 20 69 6e 73 74 61 6e  lientData instan
28b0: 63 65 44 61 74 61 2c 0a 20 20 69 6e 74 20 64 69  ceData,.  int di
28c0: 72 2c 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20  r,.  ClientData 
28d0: 2a 68 50 74 72 0a 29 7b 0a 20 20 72 65 74 75 72  *hPtr.){.  retur
28e0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 7d 0a 0a  n TCL_ERROR;.}..
28f0: 73 74 61 74 69 63 20 54 63 6c 5f 43 68 61 6e 6e  static Tcl_Chann
2900: 65 6c 54 79 70 65 20 49 6e 63 72 62 6c 6f 62 43  elType IncrblobC
2910: 68 61 6e 6e 65 6c 54 79 70 65 20 3d 20 7b 0a 20  hannelType = {. 
2920: 20 22 69 6e 63 72 62 6c 6f 62 22 2c 20 20 20 20   "incrblob",    
2930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2940: 20 20 20 20 2f 2a 20 74 79 70 65 4e 61 6d 65 20      /* typeName 
2950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2960: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20              */. 
2970: 20 54 43 4c 5f 43 48 41 4e 4e 45 4c 5f 56 45 52   TCL_CHANNEL_VER
2980: 53 49 4f 4e 5f 32 2c 20 20 20 20 20 20 20 20 20  SION_2,         
2990: 20 20 20 20 2f 2a 20 76 65 72 73 69 6f 6e 20 20      /* version  
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 20 2a 2f 0a 20              */. 
29c0: 20 69 6e 63 72 62 6c 6f 62 43 6c 6f 73 65 2c 20   incrblobClose, 
29d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29e0: 20 20 20 20 2f 2a 20 63 6c 6f 73 65 50 72 6f 63      /* closeProc
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 20 2a 2f 0a 20              */. 
2a10: 20 69 6e 63 72 62 6c 6f 62 49 6e 70 75 74 2c 20   incrblobInput, 
2a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a30: 20 20 20 20 2f 2a 20 69 6e 70 75 74 50 72 6f 63      /* inputProc
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 20 2a 2f 0a 20              */. 
2a60: 20 69 6e 63 72 62 6c 6f 62 4f 75 74 70 75 74 2c   incrblobOutput,
2a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a80: 20 20 20 20 2f 2a 20 6f 75 74 70 75 74 50 72 6f      /* outputPro
2a90: 63 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c               
2aa0: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20              */. 
2ab0: 20 69 6e 63 72 62 6c 6f 62 53 65 65 6b 2c 20 20   incrblobSeek,  
2ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ad0: 20 20 20 20 2f 2a 20 73 65 65 6b 50 72 6f 63 20      /* seekProc 
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 20 2a 2f 0a 20              */. 
2b00: 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
2b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b20: 20 20 20 20 2f 2a 20 73 65 74 4f 70 74 69 6f 6e      /* setOption
2b30: 50 72 6f 63 20 20 20 20 20 20 20 20 20 20 20 20  Proc            
2b40: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20              */. 
2b50: 20 30 2c 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 20 2f 2a 20 67 65 74 4f 70 74 69 6f 6e      /* getOption
2b80: 50 72 6f 63 20 20 20 20 20 20 20 20 20 20 20 20  Proc            
2b90: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20              */. 
2ba0: 20 69 6e 63 72 62 6c 6f 62 57 61 74 63 68 2c 20   incrblobWatch, 
2bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bc0: 20 20 20 20 2f 2a 20 77 61 74 63 68 50 72 6f 63      /* watchProc
2bd0: 20 28 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f   (this is a no-o
2be0: 70 29 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  p)          */. 
2bf0: 20 69 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 2c   incrblobHandle,
2c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c10: 20 20 20 20 2f 2a 20 67 65 74 48 61 6e 64 6c 65      /* getHandle
2c20: 50 72 6f 63 20 28 61 6c 77 61 79 73 20 72 65 74  Proc (always ret
2c30: 75 72 6e 73 20 65 72 72 6f 72 29 20 2a 2f 0a 20  urns error) */. 
2c40: 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
2c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c60: 20 20 20 20 2f 2a 20 63 6c 6f 73 65 32 50 72 6f      /* close2Pro
2c70: 63 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c               
2c80: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20              */. 
2c90: 20 30 2c 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 20 2f 2a 20 62 6c 6f 63 6b 4d 6f 64 65      /* blockMode
2cc0: 50 72 6f 63 20 20 20 20 20 20 20 20 20 20 20 20  Proc            
2cd0: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20              */. 
2ce0: 20 30 2c 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 20 2f 2a 20 66 6c 75 73 68 50 72 6f 63      /* flushProc
2d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d20: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20              */. 
2d30: 20 30 2c 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 20 2f 2a 20 68 61 6e 64 6c 65 72 50 72      /* handlerPr
2d60: 6f 63 20 20 20 20 20 20 20 20 20 20 20 20 20 20  oc              
2d70: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20              */. 
2d80: 20 30 2c 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 20 2f 2a 20 77 69 64 65 53 65 65 6b 50      /* wideSeekP
2db0: 72 6f 63 20 20 20 20 20 20 20 20 20 20 20 20 20  roc             
2dc0: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 7d              */.}
2dd0: 3b 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  ;../*.** Create 
2de0: 61 20 6e 65 77 20 69 6e 63 72 62 6c 6f 62 20 63  a new incrblob c
2df0: 68 61 6e 6e 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69  hannel..*/.stati
2e00: 63 20 69 6e 74 20 63 72 65 61 74 65 49 6e 63 72  c int createIncr
2e10: 62 6c 6f 62 43 68 61 6e 6e 65 6c 28 0a 20 20 54  blobChannel(.  T
2e20: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
2e30: 70 2c 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70  p,.  SqliteDb *p
2e40: 44 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  Db,.  const char
2e50: 20 2a 7a 44 62 2c 0a 20 20 63 6f 6e 73 74 20 63   *zDb,.  const c
2e60: 68 61 72 20 2a 7a 54 61 62 6c 65 2c 0a 20 20 63  har *zTable,.  c
2e70: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 75  onst char *zColu
2e80: 6d 6e 2c 0a 20 20 73 71 6c 69 74 65 5f 69 6e 74  mn,.  sqlite_int
2e90: 36 34 20 69 52 6f 77 2c 0a 20 20 69 6e 74 20 69  64 iRow,.  int i
2ea0: 73 52 65 61 64 6f 6e 6c 79 0a 29 7b 0a 20 20 49  sReadonly.){.  I
2eb0: 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a  ncrblobChannel *
2ec0: 70 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  p;.  sqlite3 *db
2ed0: 20 3d 20 70 44 62 2d 3e 64 62 3b 0a 20 20 73 71   = pDb->db;.  sq
2ee0: 6c 69 74 65 33 5f 62 6c 6f 62 20 2a 70 42 6c 6f  lite3_blob *pBlo
2ef0: 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  b;.  int rc;.  i
2f00: 6e 74 20 66 6c 61 67 73 20 3d 20 54 43 4c 5f 52  nt flags = TCL_R
2f10: 45 41 44 41 42 4c 45 7c 28 69 73 52 65 61 64 6f  EADABLE|(isReado
2f20: 6e 6c 79 20 3f 20 30 20 3a 20 54 43 4c 5f 57 52  nly ? 0 : TCL_WR
2f30: 49 54 41 42 4c 45 29 3b 0a 0a 20 20 2f 2a 20 54  ITABLE);..  /* T
2f40: 68 69 73 20 76 61 72 69 61 62 6c 65 20 69 73 20  his variable is 
2f50: 75 73 65 64 20 74 6f 20 6e 61 6d 65 20 74 68 65  used to name the
2f60: 20 63 68 61 6e 6e 65 6c 73 3a 20 22 69 6e 63 72   channels: "incr
2f70: 62 6c 6f 62 5f 5b 69 6e 63 72 20 63 6f 75 6e 74  blob_[incr count
2f80: 5d 22 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 69  ]" */.  static i
2f90: 6e 74 20 63 6f 75 6e 74 20 3d 20 30 3b 0a 20 20  nt count = 0;.  
2fa0: 63 68 61 72 20 7a 43 68 61 6e 6e 65 6c 5b 36 34  char zChannel[64
2fb0: 5d 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  ];..  rc = sqlit
2fc0: 65 33 5f 62 6c 6f 62 5f 6f 70 65 6e 28 64 62 2c  e3_blob_open(db,
2fd0: 20 7a 44 62 2c 20 7a 54 61 62 6c 65 2c 20 7a 43   zDb, zTable, zC
2fe0: 6f 6c 75 6d 6e 2c 20 69 52 6f 77 2c 20 21 69 73  olumn, iRow, !is
2ff0: 52 65 61 64 6f 6e 6c 79 2c 20 26 70 42 6c 6f 62  Readonly, &pBlob
3000: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
3010: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63  ITE_OK ){.    Tc
3020: 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
3030: 72 70 2c 20 28 63 68 61 72 20 2a 29 73 71 6c 69  rp, (char *)sqli
3040: 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e  te3_errmsg(pDb->
3050: 64 62 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c  db), TCL_VOLATIL
3060: 45 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  E);.    return T
3070: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
3080: 20 70 20 3d 20 28 49 6e 63 72 62 6c 6f 62 43 68   p = (IncrblobCh
3090: 61 6e 6e 65 6c 20 2a 29 54 63 6c 5f 41 6c 6c 6f  annel *)Tcl_Allo
30a0: 63 28 73 69 7a 65 6f 66 28 49 6e 63 72 62 6c 6f  c(sizeof(Incrblo
30b0: 62 43 68 61 6e 6e 65 6c 29 29 3b 0a 20 20 70 2d  bChannel));.  p-
30c0: 3e 69 53 65 65 6b 20 3d 20 30 3b 0a 20 20 70 2d  >iSeek = 0;.  p-
30d0: 3e 70 42 6c 6f 62 20 3d 20 70 42 6c 6f 62 3b 0a  >pBlob = pBlob;.
30e0: 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69  .  sqlite3_snpri
30f0: 6e 74 66 28 73 69 7a 65 6f 66 28 7a 43 68 61 6e  ntf(sizeof(zChan
3100: 6e 65 6c 29 2c 20 7a 43 68 61 6e 6e 65 6c 2c 20  nel), zChannel, 
3110: 22 69 6e 63 72 62 6c 6f 62 5f 25 64 22 2c 20 2b  "incrblob_%d", +
3120: 2b 63 6f 75 6e 74 29 3b 0a 20 20 70 2d 3e 63 68  +count);.  p->ch
3130: 61 6e 6e 65 6c 20 3d 20 54 63 6c 5f 43 72 65 61  annel = Tcl_Crea
3140: 74 65 43 68 61 6e 6e 65 6c 28 26 49 6e 63 72 62  teChannel(&Incrb
3150: 6c 6f 62 43 68 61 6e 6e 65 6c 54 79 70 65 2c 20  lobChannelType, 
3160: 7a 43 68 61 6e 6e 65 6c 2c 20 70 2c 20 66 6c 61  zChannel, p, fla
3170: 67 73 29 3b 0a 20 20 54 63 6c 5f 52 65 67 69 73  gs);.  Tcl_Regis
3180: 74 65 72 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72  terChannel(inter
3190: 70 2c 20 70 2d 3e 63 68 61 6e 6e 65 6c 29 3b 0a  p, p->channel);.
31a0: 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 6e  .  /* Link the n
31b0: 65 77 20 63 68 61 6e 6e 65 6c 20 69 6e 74 6f 20  ew channel into 
31c0: 74 68 65 20 53 71 6c 69 74 65 44 62 2e 70 49 6e  the SqliteDb.pIn
31d0: 63 72 62 6c 6f 62 20 6c 69 73 74 2e 20 2a 2f 0a  crblob list. */.
31e0: 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 44 62    p->pNext = pDb
31f0: 2d 3e 70 49 6e 63 72 62 6c 6f 62 3b 0a 20 20 70  ->pIncrblob;.  p
3200: 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 69  ->pPrev = 0;.  i
3210: 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20  f( p->pNext ){. 
3220: 20 20 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72     p->pNext->pPr
3230: 65 76 20 3d 20 70 3b 0a 20 20 7d 0a 20 20 70 44  ev = p;.  }.  pD
3240: 62 2d 3e 70 49 6e 63 72 62 6c 6f 62 20 3d 20 70  b->pIncrblob = p
3250: 3b 0a 20 20 70 2d 3e 70 44 62 20 3d 20 70 44 62  ;.  p->pDb = pDb
3260: 3b 0a 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75  ;..  Tcl_SetResu
3270: 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72  lt(interp, (char
3280: 20 2a 29 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65   *)Tcl_GetChanne
3290: 6c 4e 61 6d 65 28 70 2d 3e 63 68 61 6e 6e 65 6c  lName(p->channel
32a0: 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29  ), TCL_VOLATILE)
32b0: 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
32c0: 4b 3b 0a 7d 0a 23 65 6c 73 65 20 20 2f 2a 20 65  K;.}.#else  /* e
32d0: 6c 73 65 20 63 6c 61 75 73 65 20 66 6f 72 20 22  lse clause for "
32e0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
32f0: 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 22 20 2a 2f  MIT_INCRBLOB" */
3300: 0a 20 20 23 64 65 66 69 6e 65 20 63 6c 6f 73 65  .  #define close
3310: 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 73  IncrblobChannels
3320: 28 70 44 62 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  (pDb).#endif../*
3330: 0a 2a 2a 20 4c 6f 6f 6b 20 61 74 20 74 68 65 20  .** Look at the 
3340: 73 63 72 69 70 74 20 70 72 65 66 69 78 20 69 6e  script prefix in
3350: 20 70 43 6d 64 2e 20 20 57 65 20 77 69 6c 6c 20   pCmd.  We will 
3360: 62 65 20 65 78 65 63 75 74 69 6e 67 20 74 68 69  be executing thi
3370: 73 20 73 63 72 69 70 74 0a 2a 2a 20 61 66 74 65  s script.** afte
3380: 72 20 66 69 72 73 74 20 61 70 70 65 6e 64 69 6e  r first appendin
3390: 67 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 61 72  g one or more ar
33a0: 67 75 6d 65 6e 74 73 2e 20 20 54 68 69 73 20 72  guments.  This r
33b0: 6f 75 74 69 6e 65 20 61 6e 61 6c 79 7a 65 73 0a  outine analyzes.
33c0: 2a 2a 20 74 68 65 20 73 63 72 69 70 74 20 74 6f  ** the script to
33d0: 20 73 65 65 20 69 66 20 69 74 20 69 73 20 73 61   see if it is sa
33e0: 66 65 20 74 6f 20 75 73 65 20 54 63 6c 5f 45 76  fe to use Tcl_Ev
33f0: 61 6c 4f 62 6a 76 28 29 20 6f 6e 20 74 68 65 20  alObjv() on the 
3400: 73 63 72 69 70 74 0a 2a 2a 20 72 61 74 68 65 72  script.** rather
3410: 20 74 68 61 6e 20 74 68 65 20 6d 6f 72 65 20 67   than the more g
3420: 65 6e 65 72 61 6c 20 54 63 6c 5f 45 76 61 6c 45  eneral Tcl_EvalE
3430: 78 28 29 2e 20 20 54 63 6c 5f 45 76 61 6c 4f 62  x().  Tcl_EvalOb
3440: 6a 76 28 29 20 69 73 20 6d 75 63 68 0a 2a 2a 20  jv() is much.** 
3450: 66 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 53 63  faster..**.** Sc
3460: 72 69 70 74 73 20 74 68 61 74 20 61 72 65 20 73  ripts that are s
3470: 61 66 65 20 74 6f 20 75 73 65 20 77 69 74 68 20  afe to use with 
3480: 54 63 6c 5f 45 76 61 6c 4f 62 6a 76 28 29 20 63  Tcl_EvalObjv() c
3490: 6f 6e 73 69 73 74 73 20 6f 66 20 61 0a 2a 2a 20  onsists of a.** 
34a0: 63 6f 6d 6d 61 6e 64 20 6e 61 6d 65 20 66 6f 6c  command name fol
34b0: 6c 6f 77 65 64 20 62 79 20 7a 65 72 6f 20 6f 72  lowed by zero or
34c0: 20 6d 6f 72 65 20 61 72 67 75 6d 65 6e 74 73 20   more arguments 
34d0: 77 69 74 68 20 6e 6f 20 5b 2e 2e 2e 5d 20 6f 72  with no [...] or
34e0: 20 24 0a 2a 2a 20 6f 72 20 7b 2e 2e 2e 7d 20 6f   $.** or {...} o
34f0: 72 20 3b 20 74 6f 20 62 65 20 73 65 65 6e 20 61  r ; to be seen a
3500: 6e 79 77 68 65 72 65 2e 20 20 4d 6f 73 74 20 63  nywhere.  Most c
3510: 61 6c 6c 62 61 63 6b 20 73 63 72 69 70 74 73 20  allback scripts 
3520: 63 6f 6e 73 69 73 74 0a 2a 2a 20 6f 66 20 6a 75  consist.** of ju
3530: 73 74 20 61 20 73 69 6e 67 6c 65 20 70 72 6f 63  st a single proc
3540: 65 64 75 72 65 20 6e 61 6d 65 20 61 6e 64 20 74  edure name and t
3550: 68 65 79 20 6d 65 65 74 20 74 68 69 73 20 72 65  hey meet this re
3560: 71 75 69 72 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74  quirement..*/.st
3570: 61 74 69 63 20 69 6e 74 20 73 61 66 65 54 6f 55  atic int safeToU
3580: 73 65 45 76 61 6c 4f 62 6a 76 28 54 63 6c 5f 49  seEvalObjv(Tcl_I
3590: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 54  nterp *interp, T
35a0: 63 6c 5f 4f 62 6a 20 2a 70 43 6d 64 29 7b 0a 20  cl_Obj *pCmd){. 
35b0: 20 2f 2a 20 57 65 20 63 6f 75 6c 64 20 74 72 79   /* We could try
35c0: 20 74 6f 20 64 6f 20 73 6f 6d 65 74 68 69 6e 67   to do something
35d0: 20 77 69 74 68 20 54 63 6c 5f 50 61 72 73 65 28   with Tcl_Parse(
35e0: 29 2e 20 20 42 75 74 20 77 65 20 77 69 6c 6c 20  ).  But we will 
35f0: 69 6e 73 74 65 61 64 0a 20 20 2a 2a 20 6a 75 73  instead.  ** jus
3600: 74 20 64 6f 20 61 20 73 65 61 72 63 68 20 66 6f  t do a search fo
3610: 72 20 66 6f 72 62 69 64 64 65 6e 20 63 68 61 72  r forbidden char
3620: 61 63 74 65 72 73 2e 20 20 49 66 20 61 6e 79 20  acters.  If any 
3630: 6f 66 20 74 68 65 20 66 6f 72 62 69 64 64 65 6e  of the forbidden
3640: 0a 20 20 2a 2a 20 63 68 61 72 61 63 74 65 72 73  .  ** characters
3650: 20 61 70 70 65 61 72 20 69 6e 20 70 43 6d 64 2c   appear in pCmd,
3660: 20 77 65 20 77 69 6c 6c 20 72 65 70 6f 72 74 20   we will report 
3670: 74 68 65 20 73 74 72 69 6e 67 20 61 73 20 75 6e  the string as un
3680: 73 61 66 65 2e 0a 20 20 2a 2f 0a 20 20 63 6f 6e  safe..  */.  con
3690: 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 6e  st char *z;.  in
36a0: 74 20 6e 3b 0a 20 20 7a 20 3d 20 54 63 6c 5f 47  t n;.  z = Tcl_G
36b0: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
36c0: 70 43 6d 64 2c 20 26 6e 29 3b 0a 20 20 77 68 69  pCmd, &n);.  whi
36d0: 6c 65 28 20 6e 2d 2d 20 3e 20 30 20 29 7b 0a 20  le( n-- > 0 ){. 
36e0: 20 20 20 69 6e 74 20 63 20 3d 20 2a 28 7a 2b 2b     int c = *(z++
36f0: 29 3b 0a 20 20 20 20 69 66 28 20 63 3d 3d 27 24  );.    if( c=='$
3700: 27 20 7c 7c 20 63 3d 3d 27 5b 27 20 7c 7c 20 63  ' || c=='[' || c
3710: 3d 3d 27 3b 27 20 29 20 72 65 74 75 72 6e 20 30  ==';' ) return 0
3720: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31  ;.  }.  return 1
3730: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20  ;.}../*.** Find 
3740: 61 6e 20 53 71 6c 46 75 6e 63 20 73 74 72 75 63  an SqlFunc struc
3750: 74 75 72 65 20 77 69 74 68 20 74 68 65 20 67 69  ture with the gi
3760: 76 65 6e 20 6e 61 6d 65 2e 20 20 4f 72 20 63 72  ven name.  Or cr
3770: 65 61 74 65 20 61 20 6e 65 77 0a 2a 2a 20 6f 6e  eate a new.** on
3780: 65 20 69 66 20 61 6e 20 65 78 69 73 74 69 6e 67  e if an existing
3790: 20 6f 6e 65 20 63 61 6e 6e 6f 74 20 62 65 20 66   one cannot be f
37a0: 6f 75 6e 64 2e 20 20 52 65 74 75 72 6e 20 61 20  ound.  Return a 
37b0: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 0a 2a  pointer to the.*
37c0: 2a 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a  * structure..*/.
37d0: 73 74 61 74 69 63 20 53 71 6c 46 75 6e 63 20 2a  static SqlFunc *
37e0: 66 69 6e 64 53 71 6c 46 75 6e 63 28 53 71 6c 69  findSqlFunc(Sqli
37f0: 74 65 44 62 20 2a 70 44 62 2c 20 63 6f 6e 73 74  teDb *pDb, const
3800: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20   char *zName){. 
3810: 20 53 71 6c 46 75 6e 63 20 2a 70 2c 20 2a 70 4e   SqlFunc *p, *pN
3820: 65 77 3b 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 20  ew;.  int nName 
3830: 3d 20 73 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65  = strlen30(zName
3840: 29 3b 0a 20 20 70 4e 65 77 20 3d 20 28 53 71 6c  );.  pNew = (Sql
3850: 46 75 6e 63 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28  Func*)Tcl_Alloc(
3860: 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 2b   sizeof(*pNew) +
3870: 20 6e 4e 61 6d 65 20 2b 20 31 20 29 3b 0a 20 20   nName + 1 );.  
3880: 70 4e 65 77 2d 3e 7a 4e 61 6d 65 20 3d 20 28 63  pNew->zName = (c
3890: 68 61 72 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a 20  har*)&pNew[1];. 
38a0: 20 6d 65 6d 63 70 79 28 70 4e 65 77 2d 3e 7a 4e   memcpy(pNew->zN
38b0: 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d  ame, zName, nNam
38c0: 65 2b 31 29 3b 0a 20 20 66 6f 72 28 70 3d 70 44  e+1);.  for(p=pD
38d0: 62 2d 3e 70 46 75 6e 63 3b 20 70 3b 20 70 3d 70  b->pFunc; p; p=p
38e0: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66  ->pNext){.    if
38f0: 28 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d  ( sqlite3_stricm
3900: 70 28 70 2d 3e 7a 4e 61 6d 65 2c 20 70 4e 65 77  p(p->zName, pNew
3910: 2d 3e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20  ->zName)==0 ){. 
3920: 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28 28 63       Tcl_Free((c
3930: 68 61 72 2a 29 70 4e 65 77 29 3b 0a 20 20 20 20  har*)pNew);.    
3940: 20 20 72 65 74 75 72 6e 20 70 3b 0a 20 20 20 20    return p;.    
3950: 7d 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 69 6e  }.  }.  pNew->in
3960: 74 65 72 70 20 3d 20 70 44 62 2d 3e 69 6e 74 65  terp = pDb->inte
3970: 72 70 3b 0a 20 20 70 4e 65 77 2d 3e 70 44 62 20  rp;.  pNew->pDb 
3980: 3d 20 70 44 62 3b 0a 20 20 70 4e 65 77 2d 3e 70  = pDb;.  pNew->p
3990: 53 63 72 69 70 74 20 3d 20 30 3b 0a 20 20 70 4e  Script = 0;.  pN
39a0: 65 77 2d 3e 70 4e 65 78 74 20 3d 20 70 44 62 2d  ew->pNext = pDb-
39b0: 3e 70 46 75 6e 63 3b 0a 20 20 70 44 62 2d 3e 70  >pFunc;.  pDb->p
39c0: 46 75 6e 63 20 3d 20 70 4e 65 77 3b 0a 20 20 72  Func = pNew;.  r
39d0: 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f  eturn pNew;.}../
39e0: 2a 0a 2a 2a 20 46 72 65 65 20 61 20 73 69 6e 67  *.** Free a sing
39f0: 6c 65 20 53 71 6c 50 72 65 70 61 72 65 64 53 74  le SqlPreparedSt
3a00: 6d 74 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74  mt object..*/.st
3a10: 61 74 69 63 20 76 6f 69 64 20 64 62 46 72 65 65  atic void dbFree
3a20: 53 74 6d 74 28 53 71 6c 50 72 65 70 61 72 65 64  Stmt(SqlPrepared
3a30: 53 74 6d 74 20 2a 70 53 74 6d 74 29 7b 0a 23 69  Stmt *pStmt){.#i
3a40: 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
3a50: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73  .  if( sqlite3_s
3a60: 71 6c 28 70 53 74 6d 74 2d 3e 70 53 74 6d 74 29  ql(pStmt->pStmt)
3a70: 3d 3d 30 20 29 7b 0a 20 20 20 20 54 63 6c 5f 46  ==0 ){.    Tcl_F
3a80: 72 65 65 28 28 63 68 61 72 20 2a 29 70 53 74 6d  ree((char *)pStm
3a90: 74 2d 3e 7a 53 71 6c 29 3b 0a 20 20 7d 0a 23 65  t->zSql);.  }.#e
3aa0: 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 66  ndif.  sqlite3_f
3ab0: 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 2d 3e 70  inalize(pStmt->p
3ac0: 53 74 6d 74 29 3b 0a 20 20 54 63 6c 5f 46 72 65  Stmt);.  Tcl_Fre
3ad0: 65 28 28 63 68 61 72 20 2a 29 70 53 74 6d 74 29  e((char *)pStmt)
3ae0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 61 6c  ;.}../*.** Final
3af0: 69 7a 65 20 61 6e 64 20 66 72 65 65 20 61 20 6c  ize and free a l
3b00: 69 73 74 20 6f 66 20 70 72 65 70 61 72 65 64 20  ist of prepared 
3b10: 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2f 0a 73 74  statements.*/.st
3b20: 61 74 69 63 20 76 6f 69 64 20 66 6c 75 73 68 53  atic void flushS
3b30: 74 6d 74 43 61 63 68 65 28 53 71 6c 69 74 65 44  tmtCache(SqliteD
3b40: 62 20 2a 70 44 62 29 7b 0a 20 20 53 71 6c 50 72  b *pDb){.  SqlPr
3b50: 65 70 61 72 65 64 53 74 6d 74 20 2a 70 50 72 65  eparedStmt *pPre
3b60: 53 74 6d 74 3b 0a 20 20 53 71 6c 50 72 65 70 61  Stmt;.  SqlPrepa
3b70: 72 65 64 53 74 6d 74 20 2a 70 4e 65 78 74 3b 0a  redStmt *pNext;.
3b80: 0a 20 20 66 6f 72 28 70 50 72 65 53 74 6d 74 20  .  for(pPreStmt 
3b90: 3d 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74 3b  = pDb->stmtList;
3ba0: 20 70 50 72 65 53 74 6d 74 3b 20 70 50 72 65 53   pPreStmt; pPreS
3bb0: 74 6d 74 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20  tmt=pNext){.    
3bc0: 70 4e 65 78 74 20 3d 20 70 50 72 65 53 74 6d 74  pNext = pPreStmt
3bd0: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 64 62 46  ->pNext;.    dbF
3be0: 72 65 65 53 74 6d 74 28 70 50 72 65 53 74 6d 74  reeStmt(pPreStmt
3bf0: 29 3b 0a 20 20 7d 0a 20 20 70 44 62 2d 3e 6e 53  );.  }.  pDb->nS
3c00: 74 6d 74 20 3d 20 30 3b 0a 20 20 70 44 62 2d 3e  tmt = 0;.  pDb->
3c10: 73 74 6d 74 4c 61 73 74 20 3d 20 30 3b 0a 20 20  stmtLast = 0;.  
3c20: 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74 20 3d 20  pDb->stmtList = 
3c30: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 43 4c 20  0;.}../*.** TCL 
3c40: 63 61 6c 6c 73 20 74 68 69 73 20 70 72 6f 63 65  calls this proce
3c50: 64 75 72 65 20 77 68 65 6e 20 61 6e 20 73 71 6c  dure when an sql
3c60: 69 74 65 33 20 64 61 74 61 62 61 73 65 20 63 6f  ite3 database co
3c70: 6d 6d 61 6e 64 20 69 73 0a 2a 2a 20 64 65 6c 65  mmand is.** dele
3c80: 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ted..*/.static v
3c90: 6f 69 64 20 53 51 4c 49 54 45 5f 54 43 4c 41 50  oid SQLITE_TCLAP
3ca0: 49 20 44 62 44 65 6c 65 74 65 43 6d 64 28 76 6f  I DbDeleteCmd(vo
3cb0: 69 64 20 2a 64 62 29 7b 0a 20 20 53 71 6c 69 74  id *db){.  Sqlit
3cc0: 65 44 62 20 2a 70 44 62 20 3d 20 28 53 71 6c 69  eDb *pDb = (Sqli
3cd0: 74 65 44 62 2a 29 64 62 3b 0a 20 20 66 6c 75 73  teDb*)db;.  flus
3ce0: 68 53 74 6d 74 43 61 63 68 65 28 70 44 62 29 3b  hStmtCache(pDb);
3cf0: 0a 20 20 63 6c 6f 73 65 49 6e 63 72 62 6c 6f 62  .  closeIncrblob
3d00: 43 68 61 6e 6e 65 6c 73 28 70 44 62 29 3b 0a 20  Channels(pDb);. 
3d10: 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70   sqlite3_close(p
3d20: 44 62 2d 3e 64 62 29 3b 0a 20 20 77 68 69 6c 65  Db->db);.  while
3d30: 28 20 70 44 62 2d 3e 70 46 75 6e 63 20 29 7b 0a  ( pDb->pFunc ){.
3d40: 20 20 20 20 53 71 6c 46 75 6e 63 20 2a 70 46 75      SqlFunc *pFu
3d50: 6e 63 20 3d 20 70 44 62 2d 3e 70 46 75 6e 63 3b  nc = pDb->pFunc;
3d60: 0a 20 20 20 20 70 44 62 2d 3e 70 46 75 6e 63 20  .    pDb->pFunc 
3d70: 3d 20 70 46 75 6e 63 2d 3e 70 4e 65 78 74 3b 0a  = pFunc->pNext;.
3d80: 20 20 20 20 61 73 73 65 72 74 28 20 70 46 75 6e      assert( pFun
3d90: 63 2d 3e 70 44 62 3d 3d 70 44 62 20 29 3b 0a 20  c->pDb==pDb );. 
3da0: 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f     Tcl_DecrRefCo
3db0: 75 6e 74 28 70 46 75 6e 63 2d 3e 70 53 63 72 69  unt(pFunc->pScri
3dc0: 70 74 29 3b 0a 20 20 20 20 54 63 6c 5f 46 72 65  pt);.    Tcl_Fre
3dd0: 65 28 28 63 68 61 72 2a 29 70 46 75 6e 63 29 3b  e((char*)pFunc);
3de0: 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 70 44  .  }.  while( pD
3df0: 62 2d 3e 70 43 6f 6c 6c 61 74 65 20 29 7b 0a 20  b->pCollate ){. 
3e00: 20 20 20 53 71 6c 43 6f 6c 6c 61 74 65 20 2a 70     SqlCollate *p
3e10: 43 6f 6c 6c 61 74 65 20 3d 20 70 44 62 2d 3e 70  Collate = pDb->p
3e20: 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 70 44 62  Collate;.    pDb
3e30: 2d 3e 70 43 6f 6c 6c 61 74 65 20 3d 20 70 43 6f  ->pCollate = pCo
3e40: 6c 6c 61 74 65 2d 3e 70 4e 65 78 74 3b 0a 20 20  llate->pNext;.  
3e50: 20 20 54 63 6c 5f 46 72 65 65 28 28 63 68 61 72    Tcl_Free((char
3e60: 2a 29 70 43 6f 6c 6c 61 74 65 29 3b 0a 20 20 7d  *)pCollate);.  }
3e70: 0a 20 20 69 66 28 20 70 44 62 2d 3e 7a 42 75 73  .  if( pDb->zBus
3e80: 79 20 29 7b 0a 20 20 20 20 54 63 6c 5f 46 72 65  y ){.    Tcl_Fre
3e90: 65 28 70 44 62 2d 3e 7a 42 75 73 79 29 3b 0a 20  e(pDb->zBusy);. 
3ea0: 20 7d 0a 20 20 69 66 28 20 70 44 62 2d 3e 7a 54   }.  if( pDb->zT
3eb0: 72 61 63 65 20 29 7b 0a 20 20 20 20 54 63 6c 5f  race ){.    Tcl_
3ec0: 46 72 65 65 28 70 44 62 2d 3e 7a 54 72 61 63 65  Free(pDb->zTrace
3ed0: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 62  );.  }.  if( pDb
3ee0: 2d 3e 7a 54 72 61 63 65 56 32 20 29 7b 0a 20 20  ->zTraceV2 ){.  
3ef0: 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e    Tcl_Free(pDb->
3f00: 7a 54 72 61 63 65 56 32 29 3b 0a 20 20 7d 0a 20  zTraceV2);.  }. 
3f10: 20 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f 66 69   if( pDb->zProfi
3f20: 6c 65 20 29 7b 0a 20 20 20 20 54 63 6c 5f 46 72  le ){.    Tcl_Fr
3f30: 65 65 28 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65  ee(pDb->zProfile
3f40: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 62  );.  }.  if( pDb
3f50: 2d 3e 7a 41 75 74 68 20 29 7b 0a 20 20 20 20 54  ->zAuth ){.    T
3f60: 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 41 75  cl_Free(pDb->zAu
3f70: 74 68 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  th);.  }.  if( p
3f80: 44 62 2d 3e 7a 4e 75 6c 6c 20 29 7b 0a 20 20 20  Db->zNull ){.   
3f90: 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a   Tcl_Free(pDb->z
3fa0: 4e 75 6c 6c 29 3b 0a 20 20 7d 0a 20 20 69 66 28  Null);.  }.  if(
3fb0: 20 70 44 62 2d 3e 70 55 70 64 61 74 65 48 6f 6f   pDb->pUpdateHoo
3fc0: 6b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 44 65 63  k ){.    Tcl_Dec
3fd0: 72 52 65 66 43 6f 75 6e 74 28 70 44 62 2d 3e 70  rRefCount(pDb->p
3fe0: 55 70 64 61 74 65 48 6f 6f 6b 29 3b 0a 20 20 7d  UpdateHook);.  }
3ff0: 0a 20 20 69 66 28 20 70 44 62 2d 3e 70 50 72 65  .  if( pDb->pPre
4000: 55 70 64 61 74 65 48 6f 6f 6b 20 29 7b 0a 20 20  UpdateHook ){.  
4010: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
4020: 6e 74 28 70 44 62 2d 3e 70 50 72 65 55 70 64 61  nt(pDb->pPreUpda
4030: 74 65 48 6f 6f 6b 29 3b 0a 20 20 7d 0a 20 20 69  teHook);.  }.  i
4040: 66 28 20 70 44 62 2d 3e 70 52 6f 6c 6c 62 61 63  f( pDb->pRollbac
4050: 6b 48 6f 6f 6b 20 29 7b 0a 20 20 20 20 54 63 6c  kHook ){.    Tcl
4060: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 44  _DecrRefCount(pD
4070: 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b  b->pRollbackHook
4080: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 62  );.  }.  if( pDb
4090: 2d 3e 70 57 61 6c 48 6f 6f 6b 20 29 7b 0a 20 20  ->pWalHook ){.  
40a0: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
40b0: 6e 74 28 70 44 62 2d 3e 70 57 61 6c 48 6f 6f 6b  nt(pDb->pWalHook
40c0: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 62  );.  }.  if( pDb
40d0: 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64  ->pCollateNeeded
40e0: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72   ){.    Tcl_Decr
40f0: 52 65 66 43 6f 75 6e 74 28 70 44 62 2d 3e 70 43  RefCount(pDb->pC
4100: 6f 6c 6c 61 74 65 4e 65 65 64 65 64 29 3b 0a 20  ollateNeeded);. 
4110: 20 7d 0a 20 20 54 63 6c 5f 46 72 65 65 28 28 63   }.  Tcl_Free((c
4120: 68 61 72 2a 29 70 44 62 29 3b 0a 7d 0a 0a 2f 2a  har*)pDb);.}../*
4130: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
4140: 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   is called when 
4150: 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  a database file 
4160: 69 73 20 6c 6f 63 6b 65 64 20 77 68 69 6c 65 20  is locked while 
4170: 74 72 79 69 6e 67 0a 2a 2a 20 74 6f 20 65 78 65  trying.** to exe
4180: 63 75 74 65 20 53 51 4c 2e 0a 2a 2f 0a 73 74 61  cute SQL..*/.sta
4190: 74 69 63 20 69 6e 74 20 44 62 42 75 73 79 48 61  tic int DbBusyHa
41a0: 6e 64 6c 65 72 28 76 6f 69 64 20 2a 63 64 2c 20  ndler(void *cd, 
41b0: 69 6e 74 20 6e 54 72 69 65 73 29 7b 0a 20 20 53  int nTries){.  S
41c0: 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28  qliteDb *pDb = (
41d0: 53 71 6c 69 74 65 44 62 2a 29 63 64 3b 0a 20 20  SqliteDb*)cd;.  
41e0: 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72 20 7a  int rc;.  char z
41f0: 56 61 6c 5b 33 30 5d 3b 0a 0a 20 20 73 71 6c 69  Val[30];..  sqli
4200: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
4210: 65 6f 66 28 7a 56 61 6c 29 2c 20 7a 56 61 6c 2c  eof(zVal), zVal,
4220: 20 22 25 64 22 2c 20 6e 54 72 69 65 73 29 3b 0a   "%d", nTries);.
4230: 20 20 72 63 20 3d 20 54 63 6c 5f 56 61 72 45 76    rc = Tcl_VarEv
4240: 61 6c 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20  al(pDb->interp, 
4250: 70 44 62 2d 3e 7a 42 75 73 79 2c 20 22 20 22 2c  pDb->zBusy, " ",
4260: 20 7a 56 61 6c 2c 20 28 63 68 61 72 2a 29 30 29   zVal, (char*)0)
4270: 3b 0a 20 20 69 66 28 20 72 63 21 3d 54 43 4c 5f  ;.  if( rc!=TCL_
4280: 4f 4b 20 7c 7c 20 61 74 6f 69 28 54 63 6c 5f 47  OK || atoi(Tcl_G
4290: 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28 70  etStringResult(p
42a0: 44 62 2d 3e 69 6e 74 65 72 70 29 29 20 29 7b 0a  Db->interp)) ){.
42b0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
42c0: 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  }.  return 1;.}.
42d0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
42e0: 4f 4d 49 54 5f 50 52 4f 47 52 45 53 53 5f 43 41  OMIT_PROGRESS_CA
42f0: 4c 4c 42 41 43 4b 0a 2f 2a 0a 2a 2a 20 54 68 69  LLBACK./*.** Thi
4300: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 69 6e 76  s routine is inv
4310: 6f 6b 65 64 20 61 73 20 74 68 65 20 27 70 72 6f  oked as the 'pro
4320: 67 72 65 73 73 20 63 61 6c 6c 62 61 63 6b 27 20  gress callback' 
4330: 66 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65  for the database
4340: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
4350: 44 62 50 72 6f 67 72 65 73 73 48 61 6e 64 6c 65  DbProgressHandle
4360: 72 28 76 6f 69 64 20 2a 63 64 29 7b 0a 20 20 53  r(void *cd){.  S
4370: 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28  qliteDb *pDb = (
4380: 53 71 6c 69 74 65 44 62 2a 29 63 64 3b 0a 20 20  SqliteDb*)cd;.  
4390: 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
43a0: 74 28 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73  t( pDb->zProgres
43b0: 73 20 29 3b 0a 20 20 72 63 20 3d 20 54 63 6c 5f  s );.  rc = Tcl_
43c0: 45 76 61 6c 28 70 44 62 2d 3e 69 6e 74 65 72 70  Eval(pDb->interp
43d0: 2c 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73  , pDb->zProgress
43e0: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 54 43 4c  );.  if( rc!=TCL
43f0: 5f 4f 4b 20 7c 7c 20 61 74 6f 69 28 54 63 6c 5f  _OK || atoi(Tcl_
4400: 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28  GetStringResult(
4410: 70 44 62 2d 3e 69 6e 74 65 72 70 29 29 20 29 7b  pDb->interp)) ){
4420: 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
4430: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
4440: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
4450: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41   SQLITE_OMIT_TRA
4460: 43 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  CE./*.** This ro
4470: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
4480: 62 79 20 74 68 65 20 53 51 4c 69 74 65 20 74 72  by the SQLite tr
4490: 61 63 65 20 68 61 6e 64 6c 65 72 20 77 68 65 6e  ace handler when
44a0: 65 76 65 72 20 61 20 6e 65 77 0a 2a 2a 20 62 6c  ever a new.** bl
44b0: 6f 63 6b 20 6f 66 20 53 51 4c 20 69 73 20 65 78  ock of SQL is ex
44c0: 65 63 75 74 65 64 2e 20 20 54 68 65 20 54 43 4c  ecuted.  The TCL
44d0: 20 73 63 72 69 70 74 20 69 6e 20 70 44 62 2d 3e   script in pDb->
44e0: 7a 54 72 61 63 65 20 69 73 20 65 78 65 63 75 74  zTrace is execut
44f0: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
4500: 69 64 20 44 62 54 72 61 63 65 48 61 6e 64 6c 65  id DbTraceHandle
4510: 72 28 76 6f 69 64 20 2a 63 64 2c 20 63 6f 6e 73  r(void *cd, cons
4520: 74 20 63 68 61 72 20 2a 7a 53 71 6c 29 7b 0a 20  t char *zSql){. 
4530: 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d   SqliteDb *pDb =
4540: 20 28 53 71 6c 69 74 65 44 62 2a 29 63 64 3b 0a   (SqliteDb*)cd;.
4550: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 73 74    Tcl_DString st
4560: 72 3b 0a 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e  r;..  Tcl_DStrin
4570: 67 49 6e 69 74 28 26 73 74 72 29 3b 0a 20 20 54  gInit(&str);.  T
4580: 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64  cl_DStringAppend
4590: 28 26 73 74 72 2c 20 70 44 62 2d 3e 7a 54 72 61  (&str, pDb->zTra
45a0: 63 65 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 44  ce, -1);.  Tcl_D
45b0: 53 74 72 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d  StringAppendElem
45c0: 65 6e 74 28 26 73 74 72 2c 20 7a 53 71 6c 29 3b  ent(&str, zSql);
45d0: 0a 20 20 54 63 6c 5f 45 76 61 6c 28 70 44 62 2d  .  Tcl_Eval(pDb-
45e0: 3e 69 6e 74 65 72 70 2c 20 54 63 6c 5f 44 53 74  >interp, Tcl_DSt
45f0: 72 69 6e 67 56 61 6c 75 65 28 26 73 74 72 29 29  ringValue(&str))
4600: 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46  ;.  Tcl_DStringF
4610: 72 65 65 28 26 73 74 72 29 3b 0a 20 20 54 63 6c  ree(&str);.  Tcl
4620: 5f 52 65 73 65 74 52 65 73 75 6c 74 28 70 44 62  _ResetResult(pDb
4630: 2d 3e 69 6e 74 65 72 70 29 3b 0a 7d 0a 23 65 6e  ->interp);.}.#en
4640: 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  dif..#ifndef SQL
4650: 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 0a 2f  ITE_OMIT_TRACE./
4660: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
4670: 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74  e is called by t
4680: 68 65 20 53 51 4c 69 74 65 20 74 72 61 63 65 5f  he SQLite trace_
4690: 76 32 20 68 61 6e 64 6c 65 72 20 77 68 65 6e 65  v2 handler whene
46a0: 76 65 72 20 61 20 6e 65 77 0a 2a 2a 20 73 75 70  ver a new.** sup
46b0: 70 6f 72 74 65 64 20 65 76 65 6e 74 20 69 73 20  ported event is 
46c0: 67 65 6e 65 72 61 74 65 64 2e 20 20 55 6e 73 75  generated.  Unsu
46d0: 70 70 6f 72 74 65 64 20 65 76 65 6e 74 20 74 79  pported event ty
46e0: 70 65 73 20 61 72 65 20 69 67 6e 6f 72 65 64 2e  pes are ignored.
46f0: 0a 2a 2a 20 54 68 65 20 54 43 4c 20 73 63 72 69  .** The TCL scri
4700: 70 74 20 69 6e 20 70 44 62 2d 3e 7a 54 72 61 63  pt in pDb->zTrac
4710: 65 56 32 20 69 73 20 65 78 65 63 75 74 65 64 2c  eV2 is executed,
4720: 20 77 69 74 68 20 74 68 65 20 61 72 67 75 6d 65   with the argume
4730: 6e 74 73 20 66 6f 72 0a 2a 2a 20 74 68 65 20 65  nts for.** the e
4740: 76 65 6e 74 20 61 70 70 65 6e 64 65 64 20 74 6f  vent appended to
4750: 20 69 74 20 28 61 73 20 6c 69 73 74 20 65 6c 65   it (as list ele
4760: 6d 65 6e 74 73 29 2e 0a 2a 2f 0a 73 74 61 74 69  ments)..*/.stati
4770: 63 20 69 6e 74 20 44 62 54 72 61 63 65 56 32 48  c int DbTraceV2H
4780: 61 6e 64 6c 65 72 28 0a 20 20 75 6e 73 69 67 6e  andler(.  unsign
4790: 65 64 20 74 79 70 65 2c 20 2f 2a 20 4f 6e 65 20  ed type, /* One 
47a0: 6f 66 20 74 68 65 20 53 51 4c 49 54 45 5f 54 52  of the SQLITE_TR
47b0: 41 43 45 5f 2a 20 65 76 65 6e 74 20 74 79 70 65  ACE_* event type
47c0: 73 2e 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 63 64  s. */.  void *cd
47d0: 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 72  ,      /* The or
47e0: 69 67 69 6e 61 6c 20 63 6f 6e 74 65 78 74 20 64  iginal context d
47f0: 61 74 61 20 70 6f 69 6e 74 65 72 2e 20 2a 2f 0a  ata pointer. */.
4800: 20 20 76 6f 69 64 20 2a 70 64 2c 20 20 20 20 20    void *pd,     
4810: 20 2f 2a 20 50 72 69 6d 61 72 79 20 65 76 65 6e   /* Primary even
4820: 74 20 64 61 74 61 2c 20 64 65 70 65 6e 64 73 20  t data, depends 
4830: 6f 6e 20 65 76 65 6e 74 20 74 79 70 65 2e 20 2a  on event type. *
4840: 2f 0a 20 20 76 6f 69 64 20 2a 78 64 20 20 20 20  /.  void *xd    
4850: 20 20 20 2f 2a 20 45 78 74 72 61 20 65 76 65 6e     /* Extra even
4860: 74 20 64 61 74 61 2c 20 64 65 70 65 6e 64 73 20  t data, depends 
4870: 6f 6e 20 65 76 65 6e 74 20 74 79 70 65 2e 20 2a  on event type. *
4880: 2f 0a 29 7b 0a 20 20 53 71 6c 69 74 65 44 62 20  /.){.  SqliteDb 
4890: 2a 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62  *pDb = (SqliteDb
48a0: 2a 29 63 64 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20  *)cd;.  Tcl_Obj 
48b0: 2a 70 43 6d 64 3b 0a 0a 20 20 73 77 69 74 63 68  *pCmd;..  switch
48c0: 28 20 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61  ( type ){.    ca
48d0: 73 65 20 53 51 4c 49 54 45 5f 54 52 41 43 45 5f  se SQLITE_TRACE_
48e0: 53 54 4d 54 3a 20 7b 0a 20 20 20 20 20 20 73 71  STMT: {.      sq
48f0: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
4900: 74 20 3d 20 28 73 71 6c 69 74 65 33 5f 73 74 6d  t = (sqlite3_stm
4910: 74 20 2a 29 70 64 3b 0a 20 20 20 20 20 20 63 68  t *)pd;.      ch
4920: 61 72 20 2a 7a 53 71 6c 20 3d 20 28 63 68 61 72  ar *zSql = (char
4930: 20 2a 29 78 64 3b 0a 0a 20 20 20 20 20 20 70 43   *)xd;..      pC
4940: 6d 64 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69  md = Tcl_NewStri
4950: 6e 67 4f 62 6a 28 70 44 62 2d 3e 7a 54 72 61 63  ngObj(pDb->zTrac
4960: 65 56 32 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20  eV2, -1);.      
4970: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
4980: 28 70 43 6d 64 29 3b 0a 20 20 20 20 20 20 54 63  (pCmd);.      Tc
4990: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
49a0: 6c 65 6d 65 6e 74 28 70 44 62 2d 3e 69 6e 74 65  lement(pDb->inte
49b0: 72 70 2c 20 70 43 6d 64 2c 0a 20 20 20 20 20 20  rp, pCmd,.      
49c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
49d0: 20 20 20 20 20 20 20 20 20 54 63 6c 5f 4e 65 77           Tcl_New
49e0: 57 69 64 65 49 6e 74 4f 62 6a 28 28 54 63 6c 5f  WideIntObj((Tcl_
49f0: 57 69 64 65 49 6e 74 29 70 53 74 6d 74 29 29 3b  WideInt)pStmt));
4a00: 0a 20 20 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  .      Tcl_ListO
4a10: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
4a20: 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20 70 43 6d  pDb->interp, pCm
4a30: 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d,.             
4a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4a50: 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f    Tcl_NewStringO
4a60: 62 6a 28 7a 53 71 6c 2c 20 2d 31 29 29 3b 0a 20  bj(zSql, -1));. 
4a70: 20 20 20 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a       Tcl_EvalObj
4a80: 45 78 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20  Ex(pDb->interp, 
4a90: 70 43 6d 64 2c 20 54 43 4c 5f 45 56 41 4c 5f 44  pCmd, TCL_EVAL_D
4aa0: 49 52 45 43 54 29 3b 0a 20 20 20 20 20 20 54 63  IRECT);.      Tc
4ab0: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70  l_DecrRefCount(p
4ac0: 43 6d 64 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f  Cmd);.      Tcl_
4ad0: 52 65 73 65 74 52 65 73 75 6c 74 28 70 44 62 2d  ResetResult(pDb-
4ae0: 3e 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 20 20  >interp);.      
4af0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
4b00: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 52 41   case SQLITE_TRA
4b10: 43 45 5f 50 52 4f 46 49 4c 45 3a 20 7b 0a 20 20  CE_PROFILE: {.  
4b20: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74      sqlite3_stmt
4b30: 20 2a 70 53 74 6d 74 20 3d 20 28 73 71 6c 69 74   *pStmt = (sqlit
4b40: 65 33 5f 73 74 6d 74 20 2a 29 70 64 3b 0a 20 20  e3_stmt *)pd;.  
4b50: 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
4b60: 34 20 6e 73 20 3d 20 28 73 71 6c 69 74 65 33 5f  4 ns = (sqlite3_
4b70: 69 6e 74 36 34 29 78 64 3b 0a 0a 20 20 20 20 20  int64)xd;..     
4b80: 20 70 43 6d 64 20 3d 20 54 63 6c 5f 4e 65 77 53   pCmd = Tcl_NewS
4b90: 74 72 69 6e 67 4f 62 6a 28 70 44 62 2d 3e 7a 54  tringObj(pDb->zT
4ba0: 72 61 63 65 56 32 2c 20 2d 31 29 3b 0a 20 20 20  raceV2, -1);.   
4bb0: 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f     Tcl_IncrRefCo
4bc0: 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20 20 20 20  unt(pCmd);.     
4bd0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
4be0: 6e 64 45 6c 65 6d 65 6e 74 28 70 44 62 2d 3e 69  ndElement(pDb->i
4bf0: 6e 74 65 72 70 2c 20 70 43 6d 64 2c 0a 20 20 20  nterp, pCmd,.   
4c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c10: 20 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f              Tcl_
4c20: 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 28 54  NewWideIntObj((T
4c30: 63 6c 5f 57 69 64 65 49 6e 74 29 70 53 74 6d 74  cl_WideInt)pStmt
4c40: 29 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 4c 69  ));.      Tcl_Li
4c50: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
4c60: 6e 74 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20  nt(pDb->interp, 
4c70: 70 43 6d 64 2c 0a 20 20 20 20 20 20 20 20 20 20  pCmd,.          
4c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c90: 20 20 20 20 20 54 63 6c 5f 4e 65 77 57 69 64 65       Tcl_NewWide
4ca0: 49 6e 74 4f 62 6a 28 28 54 63 6c 5f 57 69 64 65  IntObj((Tcl_Wide
4cb0: 49 6e 74 29 6e 73 29 29 3b 0a 20 20 20 20 20 20  Int)ns));.      
4cc0: 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70 44  Tcl_EvalObjEx(pD
4cd0: 62 2d 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c  b->interp, pCmd,
4ce0: 20 54 43 4c 5f 45 56 41 4c 5f 44 49 52 45 43 54   TCL_EVAL_DIRECT
4cf0: 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 44 65 63  );.      Tcl_Dec
4d00: 72 52 65 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b  rRefCount(pCmd);
4d10: 0a 20 20 20 20 20 20 54 63 6c 5f 52 65 73 65 74  .      Tcl_Reset
4d20: 52 65 73 75 6c 74 28 70 44 62 2d 3e 69 6e 74 65  Result(pDb->inte
4d30: 72 70 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  rp);.      break
4d40: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
4d50: 20 53 51 4c 49 54 45 5f 54 52 41 43 45 5f 52 4f   SQLITE_TRACE_RO
4d60: 57 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  W: {.      sqlit
4d70: 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d  e3_stmt *pStmt =
4d80: 20 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a   (sqlite3_stmt *
4d90: 29 70 64 3b 0a 0a 20 20 20 20 20 20 70 43 6d 64  )pd;..      pCmd
4da0: 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67   = Tcl_NewString
4db0: 4f 62 6a 28 70 44 62 2d 3e 7a 54 72 61 63 65 56  Obj(pDb->zTraceV
4dc0: 32 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 54 63  2, -1);.      Tc
4dd0: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70  l_IncrRefCount(p
4de0: 43 6d 64 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f  Cmd);.      Tcl_
4df0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
4e00: 6d 65 6e 74 28 70 44 62 2d 3e 69 6e 74 65 72 70  ment(pDb->interp
4e10: 2c 20 70 43 6d 64 2c 0a 20 20 20 20 20 20 20 20  , pCmd,.        
4e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e30: 20 20 20 20 20 20 20 54 63 6c 5f 4e 65 77 57 69         Tcl_NewWi
4e40: 64 65 49 6e 74 4f 62 6a 28 28 54 63 6c 5f 57 69  deIntObj((Tcl_Wi
4e50: 64 65 49 6e 74 29 70 53 74 6d 74 29 29 3b 0a 20  deInt)pStmt));. 
4e60: 20 20 20 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a       Tcl_EvalObj
4e70: 45 78 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20  Ex(pDb->interp, 
4e80: 70 43 6d 64 2c 20 54 43 4c 5f 45 56 41 4c 5f 44  pCmd, TCL_EVAL_D
4e90: 49 52 45 43 54 29 3b 0a 20 20 20 20 20 20 54 63  IRECT);.      Tc
4ea0: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70  l_DecrRefCount(p
4eb0: 43 6d 64 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f  Cmd);.      Tcl_
4ec0: 52 65 73 65 74 52 65 73 75 6c 74 28 70 44 62 2d  ResetResult(pDb-
4ed0: 3e 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 20 20  >interp);.      
4ee0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
4ef0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 52 41   case SQLITE_TRA
4f00: 43 45 5f 43 4c 4f 53 45 3a 20 7b 0a 20 20 20 20  CE_CLOSE: {.    
4f10: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
4f20: 28 73 71 6c 69 74 65 33 20 2a 29 70 64 3b 0a 0a  (sqlite3 *)pd;..
4f30: 20 20 20 20 20 20 70 43 6d 64 20 3d 20 54 63 6c        pCmd = Tcl
4f40: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 44  _NewStringObj(pD
4f50: 62 2d 3e 7a 54 72 61 63 65 56 32 2c 20 2d 31 29  b->zTraceV2, -1)
4f60: 3b 0a 20 20 20 20 20 20 54 63 6c 5f 49 6e 63 72  ;.      Tcl_Incr
4f70: 52 65 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a  RefCount(pCmd);.
4f80: 20 20 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62        Tcl_ListOb
4f90: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 70  jAppendElement(p
4fa0: 44 62 2d 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64  Db->interp, pCmd
4fb0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
4fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4fd0: 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f   Tcl_NewWideIntO
4fe0: 62 6a 28 28 54 63 6c 5f 57 69 64 65 49 6e 74 29  bj((Tcl_WideInt)
4ff0: 64 62 29 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f  db));.      Tcl_
5000: 45 76 61 6c 4f 62 6a 45 78 28 70 44 62 2d 3e 69  EvalObjEx(pDb->i
5010: 6e 74 65 72 70 2c 20 70 43 6d 64 2c 20 54 43 4c  nterp, pCmd, TCL
5020: 5f 45 56 41 4c 5f 44 49 52 45 43 54 29 3b 0a 20  _EVAL_DIRECT);. 
5030: 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66       Tcl_DecrRef
5040: 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20 20  Count(pCmd);.   
5050: 20 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73 75     Tcl_ResetResu
5060: 6c 74 28 70 44 62 2d 3e 69 6e 74 65 72 70 29 3b  lt(pDb->interp);
5070: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
5080: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
5090: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
50a0: 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
50b0: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 0a  LITE_OMIT_TRACE.
50c0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
50d0: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20  ne is called by 
50e0: 74 68 65 20 53 51 4c 69 74 65 20 70 72 6f 66 69  the SQLite profi
50f0: 6c 65 20 68 61 6e 64 6c 65 72 20 61 66 74 65 72  le handler after
5100: 20 61 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20   a statement.** 
5110: 53 51 4c 20 68 61 73 20 65 78 65 63 75 74 65 64  SQL has executed
5120: 2e 20 20 54 68 65 20 54 43 4c 20 73 63 72 69 70  .  The TCL scrip
5130: 74 20 69 6e 20 70 44 62 2d 3e 7a 50 72 6f 66 69  t in pDb->zProfi
5140: 6c 65 20 69 73 20 65 76 61 6c 75 61 74 65 64 2e  le is evaluated.
5150: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
5160: 44 62 50 72 6f 66 69 6c 65 48 61 6e 64 6c 65 72  DbProfileHandler
5170: 28 76 6f 69 64 20 2a 63 64 2c 20 63 6f 6e 73 74  (void *cd, const
5180: 20 63 68 61 72 20 2a 7a 53 71 6c 2c 20 73 71 6c   char *zSql, sql
5190: 69 74 65 5f 75 69 6e 74 36 34 20 74 6d 29 7b 0a  ite_uint64 tm){.
51a0: 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20    SqliteDb *pDb 
51b0: 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 63 64 3b  = (SqliteDb*)cd;
51c0: 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 73  .  Tcl_DString s
51d0: 74 72 3b 0a 20 20 63 68 61 72 20 7a 54 6d 5b 31  tr;.  char zTm[1
51e0: 30 30 5d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f  00];..  sqlite3_
51f0: 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
5200: 7a 54 6d 29 2d 31 2c 20 7a 54 6d 2c 20 22 25 6c  zTm)-1, zTm, "%l
5210: 6c 64 22 2c 20 74 6d 29 3b 0a 20 20 54 63 6c 5f  ld", tm);.  Tcl_
5220: 44 53 74 72 69 6e 67 49 6e 69 74 28 26 73 74 72  DStringInit(&str
5230: 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  );.  Tcl_DString
5240: 41 70 70 65 6e 64 28 26 73 74 72 2c 20 70 44 62  Append(&str, pDb
5250: 2d 3e 7a 50 72 6f 66 69 6c 65 2c 20 2d 31 29 3b  ->zProfile, -1);
5260: 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70  .  Tcl_DStringAp
5270: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 26 73 74 72  pendElement(&str
5280: 2c 20 7a 53 71 6c 29 3b 0a 20 20 54 63 6c 5f 44  , zSql);.  Tcl_D
5290: 53 74 72 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d  StringAppendElem
52a0: 65 6e 74 28 26 73 74 72 2c 20 7a 54 6d 29 3b 0a  ent(&str, zTm);.
52b0: 20 20 54 63 6c 5f 45 76 61 6c 28 70 44 62 2d 3e    Tcl_Eval(pDb->
52c0: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 44 53 74 72  interp, Tcl_DStr
52d0: 69 6e 67 56 61 6c 75 65 28 26 73 74 72 29 29 3b  ingValue(&str));
52e0: 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72  .  Tcl_DStringFr
52f0: 65 65 28 26 73 74 72 29 3b 0a 20 20 54 63 6c 5f  ee(&str);.  Tcl_
5300: 52 65 73 65 74 52 65 73 75 6c 74 28 70 44 62 2d  ResetResult(pDb-
5310: 3e 69 6e 74 65 72 70 29 3b 0a 7d 0a 23 65 6e 64  >interp);.}.#end
5320: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  if../*.** This r
5330: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
5340: 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74   when a transact
5350: 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64  ion is committed
5360: 2e 20 20 54 68 65 0a 2a 2a 20 54 43 4c 20 73 63  .  The.** TCL sc
5370: 72 69 70 74 20 69 6e 20 70 44 62 2d 3e 7a 43 6f  ript in pDb->zCo
5380: 6d 6d 69 74 20 69 73 20 65 78 65 63 75 74 65 64  mmit is executed
5390: 2e 20 20 49 66 20 69 74 20 72 65 74 75 72 6e 73  .  If it returns
53a0: 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 72 0a 2a 2a 20   non-zero or.** 
53b0: 69 66 20 69 74 20 74 68 72 6f 77 73 20 61 6e 20  if it throws an 
53c0: 65 78 63 65 70 74 69 6f 6e 2c 20 74 68 65 20 74  exception, the t
53d0: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f  ransaction is ro
53e0: 6c 6c 65 64 20 62 61 63 6b 20 69 6e 73 74 65 61  lled back instea
53f0: 64 0a 2a 2a 20 6f 66 20 62 65 69 6e 67 20 63 6f  d.** of being co
5400: 6d 6d 69 74 74 65 64 2e 0a 2a 2f 0a 73 74 61 74  mmitted..*/.stat
5410: 69 63 20 69 6e 74 20 44 62 43 6f 6d 6d 69 74 48  ic int DbCommitH
5420: 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a 63 64 29  andler(void *cd)
5430: 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44  {.  SqliteDb *pD
5440: 62 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 63  b = (SqliteDb*)c
5450: 64 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  d;.  int rc;..  
5460: 72 63 20 3d 20 54 63 6c 5f 45 76 61 6c 28 70 44  rc = Tcl_Eval(pD
5470: 62 2d 3e 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e  b->interp, pDb->
5480: 7a 43 6f 6d 6d 69 74 29 3b 0a 20 20 69 66 28 20  zCommit);.  if( 
5490: 72 63 21 3d 54 43 4c 5f 4f 4b 20 7c 7c 20 61 74  rc!=TCL_OK || at
54a0: 6f 69 28 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  oi(Tcl_GetString
54b0: 52 65 73 75 6c 74 28 70 44 62 2d 3e 69 6e 74 65  Result(pDb->inte
54c0: 72 70 29 29 20 29 7b 0a 20 20 20 20 72 65 74 75  rp)) ){.    retu
54d0: 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 1;.  }.  retu
54e0: 72 6e 20 30 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  rn 0;.}..static 
54f0: 76 6f 69 64 20 44 62 52 6f 6c 6c 62 61 63 6b 48  void DbRollbackH
5500: 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a 63 6c 69  andler(void *cli
5510: 65 6e 74 44 61 74 61 29 7b 0a 20 20 53 71 6c 69  entData){.  Sqli
5520: 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53 71 6c  teDb *pDb = (Sql
5530: 69 74 65 44 62 2a 29 63 6c 69 65 6e 74 44 61 74  iteDb*)clientDat
5540: 61 3b 0a 20 20 61 73 73 65 72 74 28 70 44 62 2d  a;.  assert(pDb-
5550: 3e 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 29 3b  >pRollbackHook);
5560: 0a 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d 54  .  if( TCL_OK!=T
5570: 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70 44 62  cl_EvalObjEx(pDb
5580: 2d 3e 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 70  ->interp, pDb->p
5590: 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 2c 20 30 29  RollbackHook, 0)
55a0: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 42 61 63 6b   ){.    Tcl_Back
55b0: 67 72 6f 75 6e 64 45 72 72 6f 72 28 70 44 62 2d  groundError(pDb-
55c0: 3e 69 6e 74 65 72 70 29 3b 0a 20 20 7d 0a 7d 0a  >interp);.  }.}.
55d0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 70 72 6f 63  ./*.** This proc
55e0: 65 64 75 72 65 20 68 61 6e 64 6c 65 73 20 77 61  edure handles wa
55f0: 6c 5f 68 6f 6f 6b 20 63 61 6c 6c 62 61 63 6b 73  l_hook callbacks
5600: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
5610: 44 62 57 61 6c 48 61 6e 64 6c 65 72 28 0a 20 20  DbWalHandler(.  
5620: 76 6f 69 64 20 2a 63 6c 69 65 6e 74 44 61 74 61  void *clientData
5630: 2c 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  ,.  sqlite3 *db,
5640: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
5650: 44 62 2c 0a 20 20 69 6e 74 20 6e 45 6e 74 72 79  Db,.  int nEntry
5660: 0a 29 7b 0a 20 20 69 6e 74 20 72 65 74 20 3d 20  .){.  int ret = 
5670: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 54 63 6c  SQLITE_OK;.  Tcl
5680: 5f 4f 62 6a 20 2a 70 3b 0a 20 20 53 71 6c 69 74  _Obj *p;.  Sqlit
5690: 65 44 62 20 2a 70 44 62 20 3d 20 28 53 71 6c 69  eDb *pDb = (Sqli
56a0: 74 65 44 62 2a 29 63 6c 69 65 6e 74 44 61 74 61  teDb*)clientData
56b0: 3b 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ;.  Tcl_Interp *
56c0: 69 6e 74 65 72 70 20 3d 20 70 44 62 2d 3e 69 6e  interp = pDb->in
56d0: 74 65 72 70 3b 0a 20 20 61 73 73 65 72 74 28 70  terp;.  assert(p
56e0: 44 62 2d 3e 70 57 61 6c 48 6f 6f 6b 29 3b 0a 0a  Db->pWalHook);..
56f0: 20 20 61 73 73 65 72 74 28 20 64 62 3d 3d 70 44    assert( db==pD
5700: 62 2d 3e 64 62 20 29 3b 0a 20 20 70 20 3d 20 54  b->db );.  p = T
5710: 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28  cl_DuplicateObj(
5720: 70 44 62 2d 3e 70 57 61 6c 48 6f 6f 6b 29 3b 0a  pDb->pWalHook);.
5730: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
5740: 6e 74 28 70 29 3b 0a 20 20 54 63 6c 5f 4c 69 73  nt(p);.  Tcl_Lis
5750: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
5760: 74 28 69 6e 74 65 72 70 2c 20 70 2c 20 54 63 6c  t(interp, p, Tcl
5770: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 44  _NewStringObj(zD
5780: 62 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c  b, -1));.  Tcl_L
5790: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
57a0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 2c 20 54  ent(interp, p, T
57b0: 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 6e 45 6e  cl_NewIntObj(nEn
57c0: 74 72 79 29 29 3b 0a 20 20 69 66 28 20 54 43 4c  try));.  if( TCL
57d0: 5f 4f 4b 21 3d 54 63 6c 5f 45 76 61 6c 4f 62 6a  _OK!=Tcl_EvalObj
57e0: 45 78 28 69 6e 74 65 72 70 2c 20 70 2c 20 30 29  Ex(interp, p, 0)
57f0: 0a 20 20 20 7c 7c 20 54 43 4c 5f 4f 4b 21 3d 54  .   || TCL_OK!=T
5800: 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
5810: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
5820: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
5830: 29 2c 20 26 72 65 74 29 0a 20 20 29 7b 0a 20 20  ), &ret).  ){.  
5840: 20 20 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64    Tcl_Background
5850: 45 72 72 6f 72 28 69 6e 74 65 72 70 29 3b 0a 20  Error(interp);. 
5860: 20 7d 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66   }.  Tcl_DecrRef
5870: 43 6f 75 6e 74 28 70 29 3b 0a 0a 20 20 72 65 74  Count(p);..  ret
5880: 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 23 69 66 20  urn ret;.}..#if 
5890: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
58a0: 45 53 54 29 20 26 26 20 64 65 66 69 6e 65 64 28  EST) && defined(
58b0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 55 4e  SQLITE_ENABLE_UN
58c0: 4c 4f 43 4b 5f 4e 4f 54 49 46 59 29 0a 73 74 61  LOCK_NOTIFY).sta
58d0: 74 69 63 20 76 6f 69 64 20 73 65 74 54 65 73 74  tic void setTest
58e0: 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 56 61 72 73  UnlockNotifyVars
58f0: 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74  (Tcl_Interp *int
5900: 65 72 70 2c 20 69 6e 74 20 69 41 72 67 2c 20 69  erp, int iArg, i
5910: 6e 74 20 6e 41 72 67 29 7b 0a 20 20 63 68 61 72  nt nArg){.  char
5920: 20 7a 42 75 66 5b 36 34 5d 3b 0a 20 20 73 71 6c   zBuf[64];.  sql
5930: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
5940: 7a 65 6f 66 28 7a 42 75 66 29 2c 20 7a 42 75 66  zeof(zBuf), zBuf
5950: 2c 20 22 25 64 22 2c 20 69 41 72 67 29 3b 0a 20  , "%d", iArg);. 
5960: 20 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65   Tcl_SetVar(inte
5970: 72 70 2c 20 22 73 71 6c 69 74 65 5f 75 6e 6c 6f  rp, "sqlite_unlo
5980: 63 6b 5f 6e 6f 74 69 66 79 5f 61 72 67 22 2c 20  ck_notify_arg", 
5990: 7a 42 75 66 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c  zBuf, TCL_GLOBAL
59a0: 5f 4f 4e 4c 59 29 3b 0a 20 20 73 71 6c 69 74 65  _ONLY);.  sqlite
59b0: 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
59c0: 66 28 7a 42 75 66 29 2c 20 7a 42 75 66 2c 20 22  f(zBuf), zBuf, "
59d0: 25 64 22 2c 20 6e 41 72 67 29 3b 0a 20 20 54 63  %d", nArg);.  Tc
59e0: 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c  l_SetVar(interp,
59f0: 20 22 73 71 6c 69 74 65 5f 75 6e 6c 6f 63 6b 5f   "sqlite_unlock_
5a00: 6e 6f 74 69 66 79 5f 61 72 67 63 6f 75 6e 74 22  notify_argcount"
5a10: 2c 20 7a 42 75 66 2c 20 54 43 4c 5f 47 4c 4f 42  , zBuf, TCL_GLOB
5a20: 41 4c 5f 4f 4e 4c 59 29 3b 0a 7d 0a 23 65 6c 73  AL_ONLY);.}.#els
5a30: 65 0a 23 20 64 65 66 69 6e 65 20 73 65 74 54 65  e.# define setTe
5a40: 73 74 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 56 61  stUnlockNotifyVa
5a50: 72 73 28 78 2c 79 2c 7a 29 0a 23 65 6e 64 69 66  rs(x,y,z).#endif
5a60: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
5a70: 45 4e 41 42 4c 45 5f 55 4e 4c 4f 43 4b 5f 4e 4f  ENABLE_UNLOCK_NO
5a80: 54 49 46 59 0a 73 74 61 74 69 63 20 76 6f 69 64  TIFY.static void
5a90: 20 44 62 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 28   DbUnlockNotify(
5aa0: 76 6f 69 64 20 2a 2a 61 70 41 72 67 2c 20 69 6e  void **apArg, in
5ab0: 74 20 6e 41 72 67 29 7b 0a 20 20 69 6e 74 20 69  t nArg){.  int i
5ac0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
5ad0: 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63  Arg; i++){.    c
5ae0: 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67 73 20 3d  onst int flags =
5af0: 20 28 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41   (TCL_EVAL_GLOBA
5b00: 4c 7c 54 43 4c 5f 45 56 41 4c 5f 44 49 52 45 43  L|TCL_EVAL_DIREC
5b10: 54 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 44 62  T);.    SqliteDb
5b20: 20 2a 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44   *pDb = (SqliteD
5b30: 62 20 2a 29 61 70 41 72 67 5b 69 5d 3b 0a 20 20  b *)apArg[i];.  
5b40: 20 20 73 65 74 54 65 73 74 55 6e 6c 6f 63 6b 4e    setTestUnlockN
5b50: 6f 74 69 66 79 56 61 72 73 28 70 44 62 2d 3e 69  otifyVars(pDb->i
5b60: 6e 74 65 72 70 2c 20 69 2c 20 6e 41 72 67 29 3b  nterp, i, nArg);
5b70: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 44 62  .    assert( pDb
5b80: 2d 3e 70 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 29  ->pUnlockNotify)
5b90: 3b 0a 20 20 20 20 54 63 6c 5f 45 76 61 6c 4f 62  ;.    Tcl_EvalOb
5ba0: 6a 45 78 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c  jEx(pDb->interp,
5bb0: 20 70 44 62 2d 3e 70 55 6e 6c 6f 63 6b 4e 6f 74   pDb->pUnlockNot
5bc0: 69 66 79 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20  ify, flags);.   
5bd0: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
5be0: 74 28 70 44 62 2d 3e 70 55 6e 6c 6f 63 6b 4e 6f  t(pDb->pUnlockNo
5bf0: 74 69 66 79 29 3b 0a 20 20 20 20 70 44 62 2d 3e  tify);.    pDb->
5c00: 70 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 20 3d 20  pUnlockNotify = 
5c10: 30 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a  0;.  }.}.#endif.
5c20: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
5c30: 4e 41 42 4c 45 5f 50 52 45 55 50 44 41 54 45 5f  NABLE_PREUPDATE_
5c40: 48 4f 4f 4b 0a 2f 2a 0a 2a 2a 20 50 72 65 2d 75  HOOK./*.** Pre-u
5c50: 70 64 61 74 65 20 68 6f 6f 6b 20 63 61 6c 6c 62  pdate hook callb
5c60: 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ack..*/.static v
5c70: 6f 69 64 20 44 62 50 72 65 55 70 64 61 74 65 48  oid DbPreUpdateH
5c80: 61 6e 64 6c 65 72 28 0a 20 20 76 6f 69 64 20 2a  andler(.  void *
5c90: 70 2c 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  p,.  sqlite3 *db
5ca0: 2c 0a 20 20 69 6e 74 20 6f 70 2c 0a 20 20 63 6f  ,.  int op,.  co
5cb0: 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 2c 0a 20  nst char *zDb,. 
5cc0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 62   const char *zTb
5cd0: 6c 2c 0a 20 20 73 71 6c 69 74 65 5f 69 6e 74 36  l,.  sqlite_int6
5ce0: 34 20 69 4b 65 79 31 2c 0a 20 20 73 71 6c 69 74  4 iKey1,.  sqlit
5cf0: 65 5f 69 6e 74 36 34 20 69 4b 65 79 32 0a 29 7b  e_int64 iKey2.){
5d00: 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62  .  SqliteDb *pDb
5d10: 20 3d 20 28 53 71 6c 69 74 65 44 62 20 2a 29 70   = (SqliteDb *)p
5d20: 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 43 6d  ;.  Tcl_Obj *pCm
5d30: 64 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  d;.  static cons
5d40: 74 20 63 68 61 72 20 2a 61 7a 53 74 72 5b 5d 20  t char *azStr[] 
5d50: 3d 20 7b 22 44 45 4c 45 54 45 22 2c 20 22 49 4e  = {"DELETE", "IN
5d60: 53 45 52 54 22 2c 20 22 55 50 44 41 54 45 22 7d  SERT", "UPDATE"}
5d70: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 28 53 51  ;..  assert( (SQ
5d80: 4c 49 54 45 5f 44 45 4c 45 54 45 2d 31 29 2f 39  LITE_DELETE-1)/9
5d90: 20 3d 3d 20 30 20 29 3b 0a 20 20 61 73 73 65 72   == 0 );.  asser
5da0: 74 28 20 28 53 51 4c 49 54 45 5f 49 4e 53 45 52  t( (SQLITE_INSER
5db0: 54 2d 31 29 2f 39 20 3d 3d 20 31 20 29 3b 0a 20  T-1)/9 == 1 );. 
5dc0: 20 61 73 73 65 72 74 28 20 28 53 51 4c 49 54 45   assert( (SQLITE
5dd0: 5f 55 50 44 41 54 45 2d 31 29 2f 39 20 3d 3d 20  _UPDATE-1)/9 == 
5de0: 32 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  2 );.  assert( p
5df0: 44 62 2d 3e 70 50 72 65 55 70 64 61 74 65 48 6f  Db->pPreUpdateHo
5e00: 6f 6b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ok );.  assert( 
5e10: 64 62 3d 3d 70 44 62 2d 3e 64 62 20 29 3b 0a 20  db==pDb->db );. 
5e20: 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 53 51 4c   assert( op==SQL
5e30: 49 54 45 5f 49 4e 53 45 52 54 20 7c 7c 20 6f 70  ITE_INSERT || op
5e40: 3d 3d 53 51 4c 49 54 45 5f 55 50 44 41 54 45 20  ==SQLITE_UPDATE 
5e50: 7c 7c 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 44 45  || op==SQLITE_DE
5e60: 4c 45 54 45 20 29 3b 0a 0a 20 20 70 43 6d 64 20  LETE );..  pCmd 
5e70: 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f  = Tcl_DuplicateO
5e80: 62 6a 28 70 44 62 2d 3e 70 50 72 65 55 70 64 61  bj(pDb->pPreUpda
5e90: 74 65 48 6f 6f 6b 29 3b 0a 20 20 54 63 6c 5f 49  teHook);.  Tcl_I
5ea0: 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 43 6d 64  ncrRefCount(pCmd
5eb0: 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  );.  Tcl_ListObj
5ec0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c  AppendElement(0,
5ed0: 20 70 43 6d 64 2c 20 54 63 6c 5f 4e 65 77 53 74   pCmd, Tcl_NewSt
5ee0: 72 69 6e 67 4f 62 6a 28 61 7a 53 74 72 5b 28 6f  ringObj(azStr[(o
5ef0: 70 2d 31 29 2f 39 5d 2c 20 2d 31 29 29 3b 0a 20  p-1)/9], -1));. 
5f00: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
5f10: 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 43 6d  ndElement(0, pCm
5f20: 64 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  d, Tcl_NewString
5f30: 4f 62 6a 28 7a 44 62 2c 20 2d 31 29 29 3b 0a 20  Obj(zDb, -1));. 
5f40: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
5f50: 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 43 6d  ndElement(0, pCm
5f60: 64 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  d, Tcl_NewString
5f70: 4f 62 6a 28 7a 54 62 6c 2c 20 2d 31 29 29 3b 0a  Obj(zTbl, -1));.
5f80: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
5f90: 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 43  endElement(0, pC
5fa0: 6d 64 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65 49  md, Tcl_NewWideI
5fb0: 6e 74 4f 62 6a 28 69 4b 65 79 31 29 29 3b 0a 20  ntObj(iKey1));. 
5fc0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
5fd0: 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 43 6d  ndElement(0, pCm
5fe0: 64 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e  d, Tcl_NewWideIn
5ff0: 74 4f 62 6a 28 69 4b 65 79 32 29 29 3b 0a 20 20  tObj(iKey2));.  
6000: 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70 44  Tcl_EvalObjEx(pD
6010: 62 2d 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c  b->interp, pCmd,
6020: 20 54 43 4c 5f 45 56 41 4c 5f 44 49 52 45 43 54   TCL_EVAL_DIRECT
6030: 29 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66  );.  Tcl_DecrRef
6040: 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 7d 0a 23  Count(pCmd);.}.#
6050: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
6060: 45 4e 41 42 4c 45 5f 50 52 45 55 50 44 41 54 45  ENABLE_PREUPDATE
6070: 5f 48 4f 4f 4b 20 2a 2f 0a 0a 73 74 61 74 69 63  _HOOK */..static
6080: 20 76 6f 69 64 20 44 62 55 70 64 61 74 65 48 61   void DbUpdateHa
6090: 6e 64 6c 65 72 28 0a 20 20 76 6f 69 64 20 2a 70  ndler(.  void *p
60a0: 2c 0a 20 20 69 6e 74 20 6f 70 2c 0a 20 20 63 6f  ,.  int op,.  co
60b0: 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 2c 0a 20  nst char *zDb,. 
60c0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 62   const char *zTb
60d0: 6c 2c 0a 20 20 73 71 6c 69 74 65 5f 69 6e 74 36  l,.  sqlite_int6
60e0: 34 20 72 6f 77 69 64 0a 29 7b 0a 20 20 53 71 6c  4 rowid.){.  Sql
60f0: 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53 71  iteDb *pDb = (Sq
6100: 6c 69 74 65 44 62 20 2a 29 70 3b 0a 20 20 54 63  liteDb *)p;.  Tc
6110: 6c 5f 4f 62 6a 20 2a 70 43 6d 64 3b 0a 20 20 73  l_Obj *pCmd;.  s
6120: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
6130: 20 2a 61 7a 53 74 72 5b 5d 20 3d 20 7b 22 44 45   *azStr[] = {"DE
6140: 4c 45 54 45 22 2c 20 22 49 4e 53 45 52 54 22 2c  LETE", "INSERT",
6150: 20 22 55 50 44 41 54 45 22 7d 3b 0a 0a 20 20 61   "UPDATE"};..  a
6160: 73 73 65 72 74 28 20 28 53 51 4c 49 54 45 5f 44  ssert( (SQLITE_D
6170: 45 4c 45 54 45 2d 31 29 2f 39 20 3d 3d 20 30 20  ELETE-1)/9 == 0 
6180: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 53 51  );.  assert( (SQ
6190: 4c 49 54 45 5f 49 4e 53 45 52 54 2d 31 29 2f 39  LITE_INSERT-1)/9
61a0: 20 3d 3d 20 31 20 29 3b 0a 20 20 61 73 73 65 72   == 1 );.  asser
61b0: 74 28 20 28 53 51 4c 49 54 45 5f 55 50 44 41 54  t( (SQLITE_UPDAT
61c0: 45 2d 31 29 2f 39 20 3d 3d 20 32 20 29 3b 0a 0a  E-1)/9 == 2 );..
61d0: 20 20 61 73 73 65 72 74 28 20 70 44 62 2d 3e 70    assert( pDb->p
61e0: 55 70 64 61 74 65 48 6f 6f 6b 20 29 3b 0a 20 20  UpdateHook );.  
61f0: 61 73 73 65 72 74 28 20 6f 70 3d 3d 53 51 4c 49  assert( op==SQLI
6200: 54 45 5f 49 4e 53 45 52 54 20 7c 7c 20 6f 70 3d  TE_INSERT || op=
6210: 3d 53 51 4c 49 54 45 5f 55 50 44 41 54 45 20 7c  =SQLITE_UPDATE |
6220: 7c 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 44 45 4c  | op==SQLITE_DEL
6230: 45 54 45 20 29 3b 0a 0a 20 20 70 43 6d 64 20 3d  ETE );..  pCmd =
6240: 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62   Tcl_DuplicateOb
6250: 6a 28 70 44 62 2d 3e 70 55 70 64 61 74 65 48 6f  j(pDb->pUpdateHo
6260: 6f 6b 29 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52  ok);.  Tcl_IncrR
6270: 65 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20  efCount(pCmd);. 
6280: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
6290: 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 43 6d  ndElement(0, pCm
62a0: 64 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  d, Tcl_NewString
62b0: 4f 62 6a 28 61 7a 53 74 72 5b 28 6f 70 2d 31 29  Obj(azStr[(op-1)
62c0: 2f 39 5d 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c  /9], -1));.  Tcl
62d0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
62e0: 65 6d 65 6e 74 28 30 2c 20 70 43 6d 64 2c 20 54  ement(0, pCmd, T
62f0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
6300: 7a 44 62 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c  zDb, -1));.  Tcl
6310: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
6320: 65 6d 65 6e 74 28 30 2c 20 70 43 6d 64 2c 20 54  ement(0, pCmd, T
6330: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
6340: 7a 54 62 6c 2c 20 2d 31 29 29 3b 0a 20 20 54 63  zTbl, -1));.  Tc
6350: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
6360: 6c 65 6d 65 6e 74 28 30 2c 20 70 43 6d 64 2c 20  lement(0, pCmd, 
6370: 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62  Tcl_NewWideIntOb
6380: 6a 28 72 6f 77 69 64 29 29 3b 0a 20 20 54 63 6c  j(rowid));.  Tcl
6390: 5f 45 76 61 6c 4f 62 6a 45 78 28 70 44 62 2d 3e  _EvalObjEx(pDb->
63a0: 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c 20 54 43  interp, pCmd, TC
63b0: 4c 5f 45 56 41 4c 5f 44 49 52 45 43 54 29 3b 0a  L_EVAL_DIRECT);.
63c0: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
63d0: 6e 74 28 70 43 6d 64 29 3b 0a 7d 0a 0a 73 74 61  nt(pCmd);.}..sta
63e0: 74 69 63 20 76 6f 69 64 20 74 63 6c 43 6f 6c 6c  tic void tclColl
63f0: 61 74 65 4e 65 65 64 65 64 28 0a 20 20 76 6f 69  ateNeeded(.  voi
6400: 64 20 2a 70 43 74 78 2c 0a 20 20 73 71 6c 69 74  d *pCtx,.  sqlit
6410: 65 33 20 2a 64 62 2c 0a 20 20 69 6e 74 20 65 6e  e3 *db,.  int en
6420: 63 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  c,.  const char 
6430: 2a 7a 4e 61 6d 65 0a 29 7b 0a 20 20 53 71 6c 69  *zName.){.  Sqli
6440: 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53 71 6c  teDb *pDb = (Sql
6450: 69 74 65 44 62 20 2a 29 70 43 74 78 3b 0a 20 20  iteDb *)pCtx;.  
6460: 54 63 6c 5f 4f 62 6a 20 2a 70 53 63 72 69 70 74  Tcl_Obj *pScript
6470: 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65   = Tcl_Duplicate
6480: 4f 62 6a 28 70 44 62 2d 3e 70 43 6f 6c 6c 61 74  Obj(pDb->pCollat
6490: 65 4e 65 65 64 65 64 29 3b 0a 20 20 54 63 6c 5f  eNeeded);.  Tcl_
64a0: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 53 63  IncrRefCount(pSc
64b0: 72 69 70 74 29 3b 0a 20 20 54 63 6c 5f 4c 69 73  ript);.  Tcl_Lis
64c0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
64d0: 74 28 30 2c 20 70 53 63 72 69 70 74 2c 20 54 63  t(0, pScript, Tc
64e0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a  l_NewStringObj(z
64f0: 4e 61 6d 65 2c 20 2d 31 29 29 3b 0a 20 20 54 63  Name, -1));.  Tc
6500: 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70 44 62 2d  l_EvalObjEx(pDb-
6510: 3e 69 6e 74 65 72 70 2c 20 70 53 63 72 69 70 74  >interp, pScript
6520: 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 44 65 63 72  , 0);.  Tcl_Decr
6530: 52 65 66 43 6f 75 6e 74 28 70 53 63 72 69 70 74  RefCount(pScript
6540: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
6550: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
6560: 65 64 20 74 6f 20 65 76 61 6c 75 61 74 65 20 61  ed to evaluate a
6570: 6e 20 53 51 4c 20 63 6f 6c 6c 61 74 69 6f 6e 20  n SQL collation 
6580: 66 75 6e 63 74 69 6f 6e 20 69 6d 70 6c 65 6d 65  function impleme
6590: 6e 74 65 64 0a 2a 2a 20 75 73 69 6e 67 20 54 43  nted.** using TC
65a0: 4c 20 73 63 72 69 70 74 2e 0a 2a 2f 0a 73 74 61  L script..*/.sta
65b0: 74 69 63 20 69 6e 74 20 74 63 6c 53 71 6c 43 6f  tic int tclSqlCo
65c0: 6c 6c 61 74 65 28 0a 20 20 76 6f 69 64 20 2a 70  llate(.  void *p
65d0: 43 74 78 2c 0a 20 20 69 6e 74 20 6e 41 2c 0a 20  Ctx,.  int nA,. 
65e0: 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 41 2c   const void *zA,
65f0: 0a 20 20 69 6e 74 20 6e 42 2c 0a 20 20 63 6f 6e  .  int nB,.  con
6600: 73 74 20 76 6f 69 64 20 2a 7a 42 0a 29 7b 0a 20  st void *zB.){. 
6610: 20 53 71 6c 43 6f 6c 6c 61 74 65 20 2a 70 20 3d   SqlCollate *p =
6620: 20 28 53 71 6c 43 6f 6c 6c 61 74 65 20 2a 29 70   (SqlCollate *)p
6630: 43 74 78 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  Ctx;.  Tcl_Obj *
6640: 70 43 6d 64 3b 0a 0a 20 20 70 43 6d 64 20 3d 20  pCmd;..  pCmd = 
6650: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
6660: 28 70 2d 3e 7a 53 63 72 69 70 74 2c 20 2d 31 29  (p->zScript, -1)
6670: 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43  ;.  Tcl_IncrRefC
6680: 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20 54 63  ount(pCmd);.  Tc
6690: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
66a0: 6c 65 6d 65 6e 74 28 70 2d 3e 69 6e 74 65 72 70  lement(p->interp
66b0: 2c 20 70 43 6d 64 2c 20 54 63 6c 5f 4e 65 77 53  , pCmd, Tcl_NewS
66c0: 74 72 69 6e 67 4f 62 6a 28 7a 41 2c 20 6e 41 29  tringObj(zA, nA)
66d0: 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  );.  Tcl_ListObj
66e0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 70 2d  AppendElement(p-
66f0: 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c 20 54  >interp, pCmd, T
6700: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
6710: 7a 42 2c 20 6e 42 29 29 3b 0a 20 20 54 63 6c 5f  zB, nB));.  Tcl_
6720: 45 76 61 6c 4f 62 6a 45 78 28 70 2d 3e 69 6e 74  EvalObjEx(p->int
6730: 65 72 70 2c 20 70 43 6d 64 2c 20 54 43 4c 5f 45  erp, pCmd, TCL_E
6740: 56 41 4c 5f 44 49 52 45 43 54 29 3b 0a 20 20 54  VAL_DIRECT);.  T
6750: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
6760: 70 43 6d 64 29 3b 0a 20 20 72 65 74 75 72 6e 20  pCmd);.  return 
6770: 28 61 74 6f 69 28 54 63 6c 5f 47 65 74 53 74 72  (atoi(Tcl_GetStr
6780: 69 6e 67 52 65 73 75 6c 74 28 70 2d 3e 69 6e 74  ingResult(p->int
6790: 65 72 70 29 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  erp)));.}../*.**
67a0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
67b0: 20 63 61 6c 6c 65 64 20 74 6f 20 65 76 61 6c 75   called to evalu
67c0: 61 74 65 20 61 6e 20 53 51 4c 20 66 75 6e 63 74  ate an SQL funct
67d0: 69 6f 6e 20 69 6d 70 6c 65 6d 65 6e 74 65 64 0a  ion implemented.
67e0: 2a 2a 20 75 73 69 6e 67 20 54 43 4c 20 73 63 72  ** using TCL scr
67f0: 69 70 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ipt..*/.static v
6800: 6f 69 64 20 74 63 6c 53 71 6c 46 75 6e 63 28 73  oid tclSqlFunc(s
6810: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
6820: 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67  context, int arg
6830: 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  c, sqlite3_value
6840: 2a 2a 61 72 67 76 29 7b 0a 20 20 53 71 6c 46 75  **argv){.  SqlFu
6850: 6e 63 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 5f  nc *p = sqlite3_
6860: 75 73 65 72 5f 64 61 74 61 28 63 6f 6e 74 65 78  user_data(contex
6870: 74 29 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  t);.  Tcl_Obj *p
6880: 43 6d 64 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  Cmd;.  int i;.  
6890: 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 61  int rc;..  if( a
68a0: 72 67 63 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  rgc==0 ){.    /*
68b0: 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f   If there are no
68c0: 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 74 68   arguments to th
68d0: 65 20 66 75 6e 63 74 69 6f 6e 2c 20 63 61 6c 6c  e function, call
68e0: 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 20 6f   Tcl_EvalObjEx o
68f0: 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 73 63 72  n the.    ** scr
6900: 69 70 74 20 6f 62 6a 65 63 74 20 64 69 72 65 63  ipt object direc
6910: 74 6c 79 2e 20 20 54 68 69 73 20 61 6c 6c 6f 77  tly.  This allow
6920: 73 20 74 68 65 20 54 43 4c 20 63 6f 6d 70 69 6c  s the TCL compil
6930: 65 72 20 74 6f 20 67 65 6e 65 72 61 74 65 0a 20  er to generate. 
6940: 20 20 20 2a 2a 20 62 79 74 65 63 6f 64 65 20 66     ** bytecode f
6950: 6f 72 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6f  or the command o
6960: 6e 20 74 68 65 20 66 69 72 73 74 20 69 6e 76 6f  n the first invo
6970: 63 61 74 69 6f 6e 20 61 6e 64 20 74 68 75 73 20  cation and thus 
6980: 6d 61 6b 65 0a 20 20 20 20 2a 2a 20 73 75 62 73  make.    ** subs
6990: 65 71 75 65 6e 74 20 69 6e 76 6f 63 61 74 69 6f  equent invocatio
69a0: 6e 73 20 6d 75 63 68 20 66 61 73 74 65 72 2e 20  ns much faster. 
69b0: 2a 2f 0a 20 20 20 20 70 43 6d 64 20 3d 20 70 2d  */.    pCmd = p-
69c0: 3e 70 53 63 72 69 70 74 3b 0a 20 20 20 20 54 63  >pScript;.    Tc
69d0: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70  l_IncrRefCount(p
69e0: 43 6d 64 29 3b 0a 20 20 20 20 72 63 20 3d 20 54  Cmd);.    rc = T
69f0: 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70 2d 3e  cl_EvalObjEx(p->
6a00: 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c 20 30 29  interp, pCmd, 0)
6a10: 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65  ;.    Tcl_DecrRe
6a20: 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20  fCount(pCmd);.  
6a30: 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66  }else{.    /* If
6a40: 20 74 68 65 72 65 20 61 72 65 20 61 72 67 75 6d   there are argum
6a50: 65 6e 74 73 20 74 6f 20 74 68 65 20 66 75 6e 63  ents to the func
6a60: 74 69 6f 6e 2c 20 6d 61 6b 65 20 61 20 73 68 61  tion, make a sha
6a70: 6c 6c 6f 77 20 63 6f 70 79 20 6f 66 20 74 68 65  llow copy of the
6a80: 0a 20 20 20 20 2a 2a 20 73 63 72 69 70 74 20 6f  .    ** script o
6a90: 62 6a 65 63 74 2c 20 6c 61 70 70 65 6e 64 20 74  bject, lappend t
6aa0: 68 65 20 61 72 67 75 6d 65 6e 74 73 2c 20 74 68  he arguments, th
6ab0: 65 6e 20 65 76 61 6c 75 61 74 65 20 74 68 65 20  en evaluate the 
6ac0: 63 6f 70 79 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  copy..    **.   
6ad0: 20 2a 2a 20 42 79 20 22 73 68 61 6c 6c 6f 77 22   ** By "shallow"
6ae0: 20 63 6f 70 79 2c 20 77 65 20 6d 65 61 6e 20 6f   copy, we mean o
6af0: 6e 6c 79 20 74 68 65 20 6f 75 74 65 72 20 6c 69  nly the outer li
6b00: 73 74 20 54 63 6c 5f 4f 62 6a 20 69 73 20 64 75  st Tcl_Obj is du
6b10: 70 6c 69 63 61 74 65 64 2e 0a 20 20 20 20 2a 2a  plicated..    **
6b20: 20 54 68 65 20 6e 65 77 20 54 63 6c 5f 4f 62 6a   The new Tcl_Obj
6b30: 20 63 6f 6e 74 61 69 6e 73 20 70 6f 69 6e 74 65   contains pointe
6b40: 72 73 20 74 6f 20 74 68 65 20 6f 72 69 67 69 6e  rs to the origin
6b50: 61 6c 20 6c 69 73 74 20 65 6c 65 6d 65 6e 74 73  al list elements
6b60: 2e 0a 20 20 20 20 2a 2a 20 54 68 61 74 20 77 61  ..    ** That wa
6b70: 79 2c 20 77 68 65 6e 20 54 63 6c 5f 45 76 61 6c  y, when Tcl_Eval
6b80: 4f 62 6a 76 28 29 20 69 73 20 72 75 6e 20 61 6e  Objv() is run an
6b90: 64 20 73 68 69 6d 6d 65 72 73 20 74 68 65 20 66  d shimmers the f
6ba0: 69 72 73 74 20 65 6c 65 6d 65 6e 74 0a 20 20 20  irst element.   
6bb0: 20 2a 2a 20 6f 66 20 74 68 65 20 6c 69 73 74 20   ** of the list 
6bc0: 74 6f 20 74 63 6c 43 6d 64 4e 61 6d 65 54 79 70  to tclCmdNameTyp
6bd0: 65 2c 20 74 68 61 74 20 61 6c 74 65 72 6e 61 74  e, that alternat
6be0: 65 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  e representation
6bf0: 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20   will.    ** be 
6c00: 70 72 65 73 65 72 76 65 64 20 61 6e 64 20 72 65  preserved and re
6c10: 75 73 65 64 20 6f 6e 20 74 68 65 20 6e 65 78 74  used on the next
6c20: 20 69 6e 76 6f 63 61 74 69 6f 6e 2e 0a 20 20 20   invocation..   
6c30: 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20   */.    Tcl_Obj 
6c40: 2a 2a 61 41 72 67 3b 0a 20 20 20 20 69 6e 74 20  **aArg;.    int 
6c50: 6e 41 72 67 3b 0a 20 20 20 20 69 66 28 20 54 63  nArg;.    if( Tc
6c60: 6c 5f 4c 69 73 74 4f 62 6a 47 65 74 45 6c 65 6d  l_ListObjGetElem
6c70: 65 6e 74 73 28 70 2d 3e 69 6e 74 65 72 70 2c 20  ents(p->interp, 
6c80: 70 2d 3e 70 53 63 72 69 70 74 2c 20 26 6e 41 72  p->pScript, &nAr
6c90: 67 2c 20 26 61 41 72 67 29 20 29 7b 0a 20 20 20  g, &aArg) ){.   
6ca0: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
6cb0: 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c  t_error(context,
6cc0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65   Tcl_GetStringRe
6cd0: 73 75 6c 74 28 70 2d 3e 69 6e 74 65 72 70 29 2c  sult(p->interp),
6ce0: 20 2d 31 29 3b 0a 20 20 20 20 20 20 72 65 74 75   -1);.      retu
6cf0: 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43  rn;.    }.    pC
6d00: 6d 64 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74  md = Tcl_NewList
6d10: 4f 62 6a 28 6e 41 72 67 2c 20 61 41 72 67 29 3b  Obj(nArg, aArg);
6d20: 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66  .    Tcl_IncrRef
6d30: 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20 20  Count(pCmd);.   
6d40: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 67 63   for(i=0; i<argc
6d50: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71  ; i++){.      sq
6d60: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 49 6e  lite3_value *pIn
6d70: 20 3d 20 61 72 67 76 5b 69 5d 3b 0a 20 20 20 20   = argv[i];.    
6d80: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 56 61 6c 3b    Tcl_Obj *pVal;
6d90: 0a 0a 20 20 20 20 20 20 2f 2a 20 53 65 74 20 70  ..      /* Set p
6da0: 56 61 6c 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74  Val to contain t
6db0: 68 65 20 69 27 74 68 20 63 6f 6c 75 6d 6e 20 6f  he i'th column o
6dc0: 66 20 74 68 69 73 20 72 6f 77 2e 20 2a 2f 0a 20  f this row. */. 
6dd0: 20 20 20 20 20 73 77 69 74 63 68 28 20 73 71 6c       switch( sql
6de0: 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28  ite3_value_type(
6df0: 70 49 6e 29 20 29 7b 0a 20 20 20 20 20 20 20 20  pIn) ){.        
6e00: 63 61 73 65 20 53 51 4c 49 54 45 5f 42 4c 4f 42  case SQLITE_BLOB
6e10: 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  : {.          in
6e20: 74 20 62 79 74 65 73 20 3d 20 73 71 6c 69 74 65  t bytes = sqlite
6e30: 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 70 49  3_value_bytes(pI
6e40: 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 56  n);.          pV
6e50: 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 42 79 74 65  al = Tcl_NewByte
6e60: 41 72 72 61 79 4f 62 6a 28 73 71 6c 69 74 65 33  ArrayObj(sqlite3
6e70: 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 70 49 6e 29  _value_blob(pIn)
6e80: 2c 20 62 79 74 65 73 29 3b 0a 20 20 20 20 20 20  , bytes);.      
6e90: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
6ea0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63 61 73     }.        cas
6eb0: 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52  e SQLITE_INTEGER
6ec0: 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71  : {.          sq
6ed0: 6c 69 74 65 5f 69 6e 74 36 34 20 76 20 3d 20 73  lite_int64 v = s
6ee0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74  qlite3_value_int
6ef0: 36 34 28 70 49 6e 29 3b 0a 20 20 20 20 20 20 20  64(pIn);.       
6f00: 20 20 20 69 66 28 20 76 3e 3d 2d 32 31 34 37 34     if( v>=-21474
6f10: 38 33 36 34 37 20 26 26 20 76 3c 3d 32 31 34 37  83647 && v<=2147
6f20: 34 38 33 36 34 37 20 29 7b 0a 20 20 20 20 20 20  483647 ){.      
6f30: 20 20 20 20 20 20 70 56 61 6c 20 3d 20 54 63 6c        pVal = Tcl
6f40: 5f 4e 65 77 49 6e 74 4f 62 6a 28 28 69 6e 74 29  _NewIntObj((int)
6f50: 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  v);.          }e
6f60: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
6f70: 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 57   pVal = Tcl_NewW
6f80: 69 64 65 49 6e 74 4f 62 6a 28 76 29 3b 0a 20 20  ideIntObj(v);.  
6f90: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
6fa0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
6fb0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63 61 73     }.        cas
6fc0: 65 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54 3a 20  e SQLITE_FLOAT: 
6fd0: 7b 0a 20 20 20 20 20 20 20 20 20 20 64 6f 75 62  {.          doub
6fe0: 6c 65 20 72 20 3d 20 73 71 6c 69 74 65 33 5f 76  le r = sqlite3_v
6ff0: 61 6c 75 65 5f 64 6f 75 62 6c 65 28 70 49 6e 29  alue_double(pIn)
7000: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 56 61 6c  ;.          pVal
7010: 20 3d 20 54 63 6c 5f 4e 65 77 44 6f 75 62 6c 65   = Tcl_NewDouble
7020: 4f 62 6a 28 72 29 3b 0a 20 20 20 20 20 20 20 20  Obj(r);.        
7030: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
7040: 20 7d 0a 20 20 20 20 20 20 20 20 63 61 73 65 20   }.        case 
7050: 53 51 4c 49 54 45 5f 4e 55 4c 4c 3a 20 7b 0a 20  SQLITE_NULL: {. 
7060: 20 20 20 20 20 20 20 20 20 70 56 61 6c 20 3d 20           pVal = 
7070: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
7080: 28 70 2d 3e 70 44 62 2d 3e 7a 4e 75 6c 6c 2c 20  (p->pDb->zNull, 
7090: 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62  -1);.          b
70a0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
70b0: 20 20 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a          default:
70c0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74   {.          int
70d0: 20 62 79 74 65 73 20 3d 20 73 71 6c 69 74 65 33   bytes = sqlite3
70e0: 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 70 49 6e  _value_bytes(pIn
70f0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 56 61  );.          pVa
7100: 6c 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  l = Tcl_NewStrin
7110: 67 4f 62 6a 28 28 63 68 61 72 20 2a 29 73 71 6c  gObj((char *)sql
7120: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
7130: 70 49 6e 29 2c 20 62 79 74 65 73 29 3b 0a 20 20  pIn), bytes);.  
7140: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
7150: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
7160: 0a 20 20 20 20 20 20 72 63 20 3d 20 54 63 6c 5f  .      rc = Tcl_
7170: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
7180: 6d 65 6e 74 28 70 2d 3e 69 6e 74 65 72 70 2c 20  ment(p->interp, 
7190: 70 43 6d 64 2c 20 70 56 61 6c 29 3b 0a 20 20 20  pCmd, pVal);.   
71a0: 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
71b0: 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66       Tcl_DecrRef
71c0: 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20 20  Count(pCmd);.   
71d0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
71e0: 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78  ult_error(contex
71f0: 74 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  t, Tcl_GetString
7200: 52 65 73 75 6c 74 28 70 2d 3e 69 6e 74 65 72 70  Result(p->interp
7210: 29 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 20 20  ), -1);.        
7220: 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a  return;.      }.
7230: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 70      }.    if( !p
7240: 2d 3e 75 73 65 45 76 61 6c 4f 62 6a 76 20 29 7b  ->useEvalObjv ){
7250: 0a 20 20 20 20 20 20 2f 2a 20 54 63 6c 5f 45 76  .      /* Tcl_Ev
7260: 61 6c 4f 62 6a 45 78 28 29 20 77 69 6c 6c 20 61  alObjEx() will a
7270: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 61 6c  utomatically cal
7280: 6c 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 76 28 29  l Tcl_EvalObjv()
7290: 20 69 66 20 70 43 6d 64 0a 20 20 20 20 20 20 2a   if pCmd.      *
72a0: 2a 20 69 73 20 61 20 6c 69 73 74 20 77 69 74 68  * is a list with
72b0: 6f 75 74 20 61 20 73 74 72 69 6e 67 20 72 65 70  out a string rep
72c0: 72 65 73 65 6e 74 61 74 69 6f 6e 2e 20 20 54 6f  resentation.  To
72d0: 20 70 72 65 76 65 6e 74 20 74 68 69 73 20 66 72   prevent this fr
72e0: 6f 6d 0a 20 20 20 20 20 20 2a 2a 20 68 61 70 70  om.      ** happ
72f0: 65 6e 69 6e 67 2c 20 6d 61 6b 65 20 73 75 72 65  ening, make sure
7300: 20 70 43 6d 64 20 68 61 73 20 61 20 76 61 6c 69   pCmd has a vali
7310: 64 20 73 74 72 69 6e 67 20 72 65 70 72 65 73 65  d string represe
7320: 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  ntation */.     
7330: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 70   Tcl_GetString(p
7340: 43 6d 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Cmd);.    }.    
7350: 72 63 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a  rc = Tcl_EvalObj
7360: 45 78 28 70 2d 3e 69 6e 74 65 72 70 2c 20 70 43  Ex(p->interp, pC
7370: 6d 64 2c 20 54 43 4c 5f 45 56 41 4c 5f 44 49 52  md, TCL_EVAL_DIR
7380: 45 43 54 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65  ECT);.    Tcl_De
7390: 63 72 52 65 66 43 6f 75 6e 74 28 70 43 6d 64 29  crRefCount(pCmd)
73a0: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 20  ;.  }..  if( rc 
73b0: 26 26 20 72 63 21 3d 54 43 4c 5f 52 45 54 55 52  && rc!=TCL_RETUR
73c0: 4e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  N ){.    sqlite3
73d0: 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f  _result_error(co
73e0: 6e 74 65 78 74 2c 20 54 63 6c 5f 47 65 74 53 74  ntext, Tcl_GetSt
73f0: 72 69 6e 67 52 65 73 75 6c 74 28 70 2d 3e 69 6e  ringResult(p->in
7400: 74 65 72 70 29 2c 20 2d 31 29 3b 0a 20 20 7d 65  terp), -1);.  }e
7410: 6c 73 65 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  lse{.    Tcl_Obj
7420: 20 2a 70 56 61 72 20 3d 20 54 63 6c 5f 47 65 74   *pVar = Tcl_Get
7430: 4f 62 6a 52 65 73 75 6c 74 28 70 2d 3e 69 6e 74  ObjResult(p->int
7440: 65 72 70 29 3b 0a 20 20 20 20 69 6e 74 20 6e 3b  erp);.    int n;
7450: 0a 20 20 20 20 75 38 20 2a 64 61 74 61 3b 0a 20  .    u8 *data;. 
7460: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
7470: 54 79 70 65 20 3d 20 28 70 56 61 72 2d 3e 74 79  Type = (pVar->ty
7480: 70 65 50 74 72 20 3f 20 70 56 61 72 2d 3e 74 79  pePtr ? pVar->ty
7490: 70 65 50 74 72 2d 3e 6e 61 6d 65 20 3a 20 22 22  pePtr->name : ""
74a0: 29 3b 0a 20 20 20 20 63 68 61 72 20 63 20 3d 20  );.    char c = 
74b0: 7a 54 79 70 65 5b 30 5d 3b 0a 20 20 20 20 69 66  zType[0];.    if
74c0: 28 20 63 3d 3d 27 62 27 20 26 26 20 73 74 72 63  ( c=='b' && strc
74d0: 6d 70 28 7a 54 79 70 65 2c 22 62 79 74 65 61 72  mp(zType,"bytear
74e0: 72 61 79 22 29 3d 3d 30 20 26 26 20 70 56 61 72  ray")==0 && pVar
74f0: 2d 3e 62 79 74 65 73 3d 3d 30 20 29 7b 0a 20 20  ->bytes==0 ){.  
7500: 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 72 65 74 75      /* Only retu
7510: 72 6e 20 61 20 42 4c 4f 42 20 74 79 70 65 20 69  rn a BLOB type i
7520: 66 20 74 68 65 20 54 63 6c 20 76 61 72 69 61 62  f the Tcl variab
7530: 6c 65 20 69 73 20 61 20 62 79 74 65 61 72 72 61  le is a bytearra
7540: 79 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 68  y and.      ** h
7550: 61 73 20 6e 6f 20 73 74 72 69 6e 67 20 72 65 70  as no string rep
7560: 72 65 73 65 6e 74 61 74 69 6f 6e 2e 20 2a 2f 0a  resentation. */.
7570: 20 20 20 20 20 20 64 61 74 61 20 3d 20 54 63 6c        data = Tcl
7580: 5f 47 65 74 42 79 74 65 41 72 72 61 79 46 72 6f  _GetByteArrayFro
7590: 6d 4f 62 6a 28 70 56 61 72 2c 20 26 6e 29 3b 0a  mObj(pVar, &n);.
75a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
75b0: 73 75 6c 74 5f 62 6c 6f 62 28 63 6f 6e 74 65 78  sult_blob(contex
75c0: 74 2c 20 64 61 74 61 2c 20 6e 2c 20 53 51 4c 49  t, data, n, SQLI
75d0: 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
75e0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d     }else if( c==
75f0: 27 62 27 20 26 26 20 73 74 72 63 6d 70 28 7a 54  'b' && strcmp(zT
7600: 79 70 65 2c 22 62 6f 6f 6c 65 61 6e 22 29 3d 3d  ype,"boolean")==
7610: 30 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 47  0 ){.      Tcl_G
7620: 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 30 2c 20  etIntFromObj(0, 
7630: 70 56 61 72 2c 20 26 6e 29 3b 0a 20 20 20 20 20  pVar, &n);.     
7640: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
7650: 69 6e 74 28 63 6f 6e 74 65 78 74 2c 20 6e 29 3b  int(context, n);
7660: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63  .    }else if( c
7670: 3d 3d 27 64 27 20 26 26 20 73 74 72 63 6d 70 28  =='d' && strcmp(
7680: 7a 54 79 70 65 2c 22 64 6f 75 62 6c 65 22 29 3d  zType,"double")=
7690: 3d 30 20 29 7b 0a 20 20 20 20 20 20 64 6f 75 62  =0 ){.      doub
76a0: 6c 65 20 72 3b 0a 20 20 20 20 20 20 54 63 6c 5f  le r;.      Tcl_
76b0: 47 65 74 44 6f 75 62 6c 65 46 72 6f 6d 4f 62 6a  GetDoubleFromObj
76c0: 28 30 2c 20 70 56 61 72 2c 20 26 72 29 3b 0a 20  (0, pVar, &r);. 
76d0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
76e0: 75 6c 74 5f 64 6f 75 62 6c 65 28 63 6f 6e 74 65  ult_double(conte
76f0: 78 74 2c 20 72 29 3b 0a 20 20 20 20 7d 65 6c 73  xt, r);.    }els
7700: 65 20 69 66 28 20 28 63 3d 3d 27 77 27 20 26 26  e if( (c=='w' &&
7710: 20 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22 77   strcmp(zType,"w
7720: 69 64 65 49 6e 74 22 29 3d 3d 30 29 20 7c 7c 0a  ideInt")==0) ||.
7730: 20 20 20 20 20 20 20 20 20 20 28 63 3d 3d 27 69            (c=='i
7740: 27 20 26 26 20 73 74 72 63 6d 70 28 7a 54 79 70  ' && strcmp(zTyp
7750: 65 2c 22 69 6e 74 22 29 3d 3d 30 29 20 29 7b 0a  e,"int")==0) ){.
7760: 20 20 20 20 20 20 54 63 6c 5f 57 69 64 65 49 6e        Tcl_WideIn
7770: 74 20 76 3b 0a 20 20 20 20 20 20 54 63 6c 5f 47  t v;.      Tcl_G
7780: 65 74 57 69 64 65 49 6e 74 46 72 6f 6d 4f 62 6a  etWideIntFromObj
7790: 28 30 2c 20 70 56 61 72 2c 20 26 76 29 3b 0a 20  (0, pVar, &v);. 
77a0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
77b0: 75 6c 74 5f 69 6e 74 36 34 28 63 6f 6e 74 65 78  ult_int64(contex
77c0: 74 2c 20 76 29 3b 0a 20 20 20 20 7d 65 6c 73 65  t, v);.    }else
77d0: 7b 0a 20 20 20 20 20 20 64 61 74 61 20 3d 20 28  {.      data = (
77e0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
77f0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
7800: 6d 4f 62 6a 28 70 56 61 72 2c 20 26 6e 29 3b 0a  mObj(pVar, &n);.
7810: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
7820: 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78  sult_text(contex
7830: 74 2c 20 28 63 68 61 72 20 2a 29 64 61 74 61 2c  t, (char *)data,
7840: 20 6e 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53   n, SQLITE_TRANS
7850: 49 45 4e 54 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  IENT);.    }.  }
7860: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
7870: 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a  TE_OMIT_AUTHORIZ
7880: 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ATION./*.** This
7890: 20 69 73 20 74 68 65 20 61 75 74 68 65 6e 74 69   is the authenti
78a0: 63 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 2e  cation function.
78b0: 20 20 49 74 20 61 70 70 65 6e 64 73 20 74 68 65    It appends the
78c0: 20 61 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 0a   authentication.
78d0: 2a 2a 20 74 79 70 65 20 63 6f 64 65 20 61 6e 64  ** type code and
78e0: 20 74 68 65 20 74 77 6f 20 61 72 67 75 6d 65 6e   the two argumen
78f0: 74 73 20 74 6f 20 7a 43 6d 64 5b 5d 20 74 68 65  ts to zCmd[] the
7900: 6e 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 72 65  n invokes the re
7910: 73 75 6c 74 0a 2a 2a 20 6f 6e 20 74 68 65 20 69  sult.** on the i
7920: 6e 74 65 72 70 72 65 74 65 72 2e 20 20 54 68 65  nterpreter.  The
7930: 20 72 65 70 6c 79 20 69 73 20 65 78 61 6d 69 6e   reply is examin
7940: 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ed to determine 
7950: 69 66 20 74 68 65 0a 2a 2a 20 61 75 74 68 65 6e  if the.** authen
7960: 74 69 63 61 74 69 6f 6e 20 66 61 69 6c 73 20 6f  tication fails o
7970: 72 20 73 75 63 63 65 65 64 73 2e 0a 2a 2f 0a 73  r succeeds..*/.s
7980: 74 61 74 69 63 20 69 6e 74 20 61 75 74 68 5f 63  tatic int auth_c
7990: 61 6c 6c 62 61 63 6b 28 0a 20 20 76 6f 69 64 20  allback(.  void 
79a0: 2a 70 41 72 67 2c 0a 20 20 69 6e 74 20 63 6f 64  *pArg,.  int cod
79b0: 65 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  e,.  const char 
79c0: 2a 7a 41 72 67 31 2c 0a 20 20 63 6f 6e 73 74 20  *zArg1,.  const 
79d0: 63 68 61 72 20 2a 7a 41 72 67 32 2c 0a 20 20 63  char *zArg2,.  c
79e0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67 33  onst char *zArg3
79f0: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
7a00: 7a 41 72 67 34 0a 23 69 66 64 65 66 20 53 51 4c  zArg4.#ifdef SQL
7a10: 49 54 45 5f 55 53 45 52 5f 41 55 54 48 45 4e 54  ITE_USER_AUTHENT
7a20: 49 43 41 54 49 4f 4e 0a 20 20 2c 63 6f 6e 73 74  ICATION.  ,const
7a30: 20 63 68 61 72 20 2a 7a 41 72 67 35 0a 23 65 6e   char *zArg5.#en
7a40: 64 69 66 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63  dif.){.  const c
7a50: 68 61 72 20 2a 7a 43 6f 64 65 3b 0a 20 20 54 63  har *zCode;.  Tc
7a60: 6c 5f 44 53 74 72 69 6e 67 20 73 74 72 3b 0a 20  l_DString str;. 
7a70: 20 69 6e 74 20 72 63 3b 0a 20 20 63 6f 6e 73 74   int rc;.  const
7a80: 20 63 68 61 72 20 2a 7a 52 65 70 6c 79 3b 0a 20   char *zReply;. 
7a90: 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d   SqliteDb *pDb =
7aa0: 20 28 53 71 6c 69 74 65 44 62 2a 29 70 41 72 67   (SqliteDb*)pArg
7ab0: 3b 0a 20 20 69 66 28 20 70 44 62 2d 3e 64 69 73  ;.  if( pDb->dis
7ac0: 61 62 6c 65 41 75 74 68 20 29 20 72 65 74 75 72  ableAuth ) retur
7ad0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  n SQLITE_OK;..  
7ae0: 73 77 69 74 63 68 28 20 63 6f 64 65 20 29 7b 0a  switch( code ){.
7af0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
7b00: 43 4f 50 59 20 20 20 20 20 20 20 20 20 20 20 20  COPY            
7b10: 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54    : zCode="SQLIT
7b20: 45 5f 43 4f 50 59 22 3b 20 62 72 65 61 6b 3b 0a  E_COPY"; break;.
7b30: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
7b40: 43 52 45 41 54 45 5f 49 4e 44 45 58 20 20 20 20  CREATE_INDEX    
7b50: 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54    : zCode="SQLIT
7b60: 45 5f 43 52 45 41 54 45 5f 49 4e 44 45 58 22 3b  E_CREATE_INDEX";
7b70: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
7b80: 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54   SQLITE_CREATE_T
7b90: 41 42 4c 45 20 20 20 20 20 20 3a 20 7a 43 6f 64  ABLE      : zCod
7ba0: 65 3d 22 53 51 4c 49 54 45 5f 43 52 45 41 54 45  e="SQLITE_CREATE
7bb0: 5f 54 41 42 4c 45 22 3b 20 62 72 65 61 6b 3b 0a  _TABLE"; break;.
7bc0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
7bd0: 43 52 45 41 54 45 5f 54 45 4d 50 5f 49 4e 44 45  CREATE_TEMP_INDE
7be0: 58 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54  X : zCode="SQLIT
7bf0: 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 49 4e  E_CREATE_TEMP_IN
7c00: 44 45 58 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  DEX"; break;.   
7c10: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 52 45   case SQLITE_CRE
7c20: 41 54 45 5f 54 45 4d 50 5f 54 41 42 4c 45 20 3a  ATE_TEMP_TABLE :
7c30: 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43   zCode="SQLITE_C
7c40: 52 45 41 54 45 5f 54 45 4d 50 5f 54 41 42 4c 45  REATE_TEMP_TABLE
7c50: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
7c60: 73 65 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45  se SQLITE_CREATE
7c70: 5f 54 45 4d 50 5f 54 52 49 47 47 45 52 3a 20 7a  _TEMP_TRIGGER: z
7c80: 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43 52 45  Code="SQLITE_CRE
7c90: 41 54 45 5f 54 45 4d 50 5f 54 52 49 47 47 45 52  ATE_TEMP_TRIGGER
7ca0: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
7cb0: 73 65 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45  se SQLITE_CREATE
7cc0: 5f 54 45 4d 50 5f 56 49 45 57 20 20 3a 20 7a 43  _TEMP_VIEW  : zC
7cd0: 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43 52 45 41  ode="SQLITE_CREA
7ce0: 54 45 5f 54 45 4d 50 5f 56 49 45 57 22 3b 20 62  TE_TEMP_VIEW"; b
7cf0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
7d00: 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 52 49  QLITE_CREATE_TRI
7d10: 47 47 45 52 20 20 20 20 3a 20 7a 43 6f 64 65 3d  GGER    : zCode=
7d20: 22 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54  "SQLITE_CREATE_T
7d30: 52 49 47 47 45 52 22 3b 20 62 72 65 61 6b 3b 0a  RIGGER"; break;.
7d40: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
7d50: 43 52 45 41 54 45 5f 56 49 45 57 20 20 20 20 20  CREATE_VIEW     
7d60: 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54    : zCode="SQLIT
7d70: 45 5f 43 52 45 41 54 45 5f 56 49 45 57 22 3b 20  E_CREATE_VIEW"; 
7d80: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
7d90: 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 20 20 20  SQLITE_DELETE   
7da0: 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65           : zCode
7db0: 3d 22 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 22  ="SQLITE_DELETE"
7dc0: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
7dd0: 65 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 49 4e  e SQLITE_DROP_IN
7de0: 44 45 58 20 20 20 20 20 20 20 20 3a 20 7a 43 6f  DEX        : zCo
7df0: 64 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f  de="SQLITE_DROP_
7e00: 49 4e 44 45 58 22 3b 20 62 72 65 61 6b 3b 0a 20  INDEX"; break;. 
7e10: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44     case SQLITE_D
7e20: 52 4f 50 5f 54 41 42 4c 45 20 20 20 20 20 20 20  ROP_TABLE       
7e30: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
7e40: 5f 44 52 4f 50 5f 54 41 42 4c 45 22 3b 20 62 72  _DROP_TABLE"; br
7e50: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
7e60: 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 49  LITE_DROP_TEMP_I
7e70: 4e 44 45 58 20 20 20 3a 20 7a 43 6f 64 65 3d 22  NDEX   : zCode="
7e80: 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50  SQLITE_DROP_TEMP
7e90: 5f 49 4e 44 45 58 22 3b 20 62 72 65 61 6b 3b 0a  _INDEX"; break;.
7ea0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
7eb0: 44 52 4f 50 5f 54 45 4d 50 5f 54 41 42 4c 45 20  DROP_TEMP_TABLE 
7ec0: 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54    : zCode="SQLIT
7ed0: 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 54 41 42 4c  E_DROP_TEMP_TABL
7ee0: 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  E"; break;.    c
7ef0: 61 73 65 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f  ase SQLITE_DROP_
7f00: 54 45 4d 50 5f 54 52 49 47 47 45 52 20 3a 20 7a  TEMP_TRIGGER : z
7f10: 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f  Code="SQLITE_DRO
7f20: 50 5f 54 45 4d 50 5f 54 52 49 47 47 45 52 22 3b  P_TEMP_TRIGGER";
7f30: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
7f40: 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d   SQLITE_DROP_TEM
7f50: 50 5f 56 49 45 57 20 20 20 20 3a 20 7a 43 6f 64  P_VIEW    : zCod
7f60: 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54  e="SQLITE_DROP_T
7f70: 45 4d 50 5f 56 49 45 57 22 3b 20 62 72 65 61 6b  EMP_VIEW"; break
7f80: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
7f90: 45 5f 44 52 4f 50 5f 54 52 49 47 47 45 52 20 20  E_DROP_TRIGGER  
7fa0: 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c      : zCode="SQL
7fb0: 49 54 45 5f 44 52 4f 50 5f 54 52 49 47 47 45 52  ITE_DROP_TRIGGER
7fc0: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
7fd0: 73 65 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56  se SQLITE_DROP_V
7fe0: 49 45 57 20 20 20 20 20 20 20 20 20 3a 20 7a 43  IEW         : zC
7ff0: 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50  ode="SQLITE_DROP
8000: 5f 56 49 45 57 22 3b 20 62 72 65 61 6b 3b 0a 20  _VIEW"; break;. 
8010: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
8020: 4e 53 45 52 54 20 20 20 20 20 20 20 20 20 20 20  NSERT           
8030: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
8040: 5f 49 4e 53 45 52 54 22 3b 20 62 72 65 61 6b 3b  _INSERT"; break;
8050: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
8060: 5f 50 52 41 47 4d 41 20 20 20 20 20 20 20 20 20  _PRAGMA         
8070: 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49     : zCode="SQLI
8080: 54 45 5f 50 52 41 47 4d 41 22 3b 20 62 72 65 61  TE_PRAGMA"; brea
8090: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
80a0: 54 45 5f 52 45 41 44 20 20 20 20 20 20 20 20 20  TE_READ         
80b0: 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51       : zCode="SQ
80c0: 4c 49 54 45 5f 52 45 41 44 22 3b 20 62 72 65 61  LITE_READ"; brea
80d0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
80e0: 54 45 5f 53 45 4c 45 43 54 20 20 20 20 20 20 20  TE_SELECT       
80f0: 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51       : zCode="SQ
8100: 4c 49 54 45 5f 53 45 4c 45 43 54 22 3b 20 62 72  LITE_SELECT"; br
8110: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
8120: 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e  LITE_TRANSACTION
8130: 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22         : zCode="
8140: 53 51 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49  SQLITE_TRANSACTI
8150: 4f 4e 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  ON"; break;.    
8160: 63 61 73 65 20 53 51 4c 49 54 45 5f 55 50 44 41  case SQLITE_UPDA
8170: 54 45 20 20 20 20 20 20 20 20 20 20 20 20 3a 20  TE            : 
8180: 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 55 50  zCode="SQLITE_UP
8190: 44 41 54 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20  DATE"; break;.  
81a0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 54    case SQLITE_AT
81b0: 54 41 43 48 20 20 20 20 20 20 20 20 20 20 20 20  TACH            
81c0: 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f  : zCode="SQLITE_
81d0: 41 54 54 41 43 48 22 3b 20 62 72 65 61 6b 3b 0a  ATTACH"; break;.
81e0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
81f0: 44 45 54 41 43 48 20 20 20 20 20 20 20 20 20 20  DETACH          
8200: 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54    : zCode="SQLIT
8210: 45 5f 44 45 54 41 43 48 22 3b 20 62 72 65 61 6b  E_DETACH"; break
8220: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
8230: 45 5f 41 4c 54 45 52 5f 54 41 42 4c 45 20 20 20  E_ALTER_TABLE   
8240: 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c      : zCode="SQL
8250: 49 54 45 5f 41 4c 54 45 52 5f 54 41 42 4c 45 22  ITE_ALTER_TABLE"
8260: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
8270: 65 20 53 51 4c 49 54 45 5f 52 45 49 4e 44 45 58  e SQLITE_REINDEX
8280: 20 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f             : zCo
8290: 64 65 3d 22 53 51 4c 49 54 45 5f 52 45 49 4e 44  de="SQLITE_REIND
82a0: 45 58 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  EX"; break;.    
82b0: 63 61 73 65 20 53 51 4c 49 54 45 5f 41 4e 41 4c  case SQLITE_ANAL
82c0: 59 5a 45 20 20 20 20 20 20 20 20 20 20 20 3a 20  YZE           : 
82d0: 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 41 4e  zCode="SQLITE_AN
82e0: 41 4c 59 5a 45 22 3b 20 62 72 65 61 6b 3b 0a 20  ALYZE"; break;. 
82f0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
8300: 52 45 41 54 45 5f 56 54 41 42 4c 45 20 20 20 20  REATE_VTABLE    
8310: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
8320: 5f 43 52 45 41 54 45 5f 56 54 41 42 4c 45 22 3b  _CREATE_VTABLE";
8330: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
8340: 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56 54 41   SQLITE_DROP_VTA
8350: 42 4c 45 20 20 20 20 20 20 20 3a 20 7a 43 6f 64  BLE       : zCod
8360: 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56  e="SQLITE_DROP_V
8370: 54 41 42 4c 45 22 3b 20 62 72 65 61 6b 3b 0a 20  TABLE"; break;. 
8380: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
8390: 55 4e 43 54 49 4f 4e 20 20 20 20 20 20 20 20 20  UNCTION         
83a0: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
83b0: 5f 46 55 4e 43 54 49 4f 4e 22 3b 20 62 72 65 61  _FUNCTION"; brea
83c0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
83d0: 54 45 5f 53 41 56 45 50 4f 49 4e 54 20 20 20 20  TE_SAVEPOINT    
83e0: 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51       : zCode="SQ
83f0: 4c 49 54 45 5f 53 41 56 45 50 4f 49 4e 54 22 3b  LITE_SAVEPOINT";
8400: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
8410: 20 53 51 4c 49 54 45 5f 52 45 43 55 52 53 49 56   SQLITE_RECURSIV
8420: 45 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64  E         : zCod
8430: 65 3d 22 53 51 4c 49 54 45 5f 52 45 43 55 52 53  e="SQLITE_RECURS
8440: 49 56 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  IVE"; break;.   
8450: 20 64 65 66 61 75 6c 74 20 20 20 20 20 20 20 20   default        
8460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3a                 :
8470: 20 7a 43 6f 64 65 3d 22 3f 3f 3f 3f 22 3b 20 62   zCode="????"; b
8480: 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f  reak;.  }.  Tcl_
8490: 44 53 74 72 69 6e 67 49 6e 69 74 28 26 73 74 72  DStringInit(&str
84a0: 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  );.  Tcl_DString
84b0: 41 70 70 65 6e 64 28 26 73 74 72 2c 20 70 44 62  Append(&str, pDb
84c0: 2d 3e 7a 41 75 74 68 2c 20 2d 31 29 3b 0a 20 20  ->zAuth, -1);.  
84d0: 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e  Tcl_DStringAppen
84e0: 64 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c 20 7a  dElement(&str, z
84f0: 43 6f 64 65 29 3b 0a 20 20 54 63 6c 5f 44 53 74  Code);.  Tcl_DSt
8500: 72 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e  ringAppendElemen
8510: 74 28 26 73 74 72 2c 20 7a 41 72 67 31 20 3f 20  t(&str, zArg1 ? 
8520: 7a 41 72 67 31 20 3a 20 22 22 29 3b 0a 20 20 54  zArg1 : "");.  T
8530: 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64  cl_DStringAppend
8540: 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c 20 7a 41  Element(&str, zA
8550: 72 67 32 20 3f 20 7a 41 72 67 32 20 3a 20 22 22  rg2 ? zArg2 : ""
8560: 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  );.  Tcl_DString
8570: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 26 73  AppendElement(&s
8580: 74 72 2c 20 7a 41 72 67 33 20 3f 20 7a 41 72 67  tr, zArg3 ? zArg
8590: 33 20 3a 20 22 22 29 3b 0a 20 20 54 63 6c 5f 44  3 : "");.  Tcl_D
85a0: 53 74 72 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d  StringAppendElem
85b0: 65 6e 74 28 26 73 74 72 2c 20 7a 41 72 67 34 20  ent(&str, zArg4 
85c0: 3f 20 7a 41 72 67 34 20 3a 20 22 22 29 3b 0a 23  ? zArg4 : "");.#
85d0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 55 53 45  ifdef SQLITE_USE
85e0: 52 5f 41 55 54 48 45 4e 54 49 43 41 54 49 4f 4e  R_AUTHENTICATION
85f0: 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70  .  Tcl_DStringAp
8600: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 26 73 74 72  pendElement(&str
8610: 2c 20 7a 41 72 67 35 20 3f 20 7a 41 72 67 35 20  , zArg5 ? zArg5 
8620: 3a 20 22 22 29 3b 0a 23 65 6e 64 69 66 0a 20 20  : "");.#endif.  
8630: 72 63 20 3d 20 54 63 6c 5f 47 6c 6f 62 61 6c 45  rc = Tcl_GlobalE
8640: 76 61 6c 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c  val(pDb->interp,
8650: 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75   Tcl_DStringValu
8660: 65 28 26 73 74 72 29 29 3b 0a 20 20 54 63 6c 5f  e(&str));.  Tcl_
8670: 44 53 74 72 69 6e 67 46 72 65 65 28 26 73 74 72  DStringFree(&str
8680: 29 3b 0a 20 20 7a 52 65 70 6c 79 20 3d 20 72 63  );.  zReply = rc
8690: 3d 3d 54 43 4c 5f 4f 4b 20 3f 20 54 63 6c 5f 47  ==TCL_OK ? Tcl_G
86a0: 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28 70  etStringResult(p
86b0: 44 62 2d 3e 69 6e 74 65 72 70 29 20 3a 20 22 53  Db->interp) : "S
86c0: 51 4c 49 54 45 5f 44 45 4e 59 22 3b 0a 20 20 69  QLITE_DENY";.  i
86d0: 66 28 20 73 74 72 63 6d 70 28 7a 52 65 70 6c 79  f( strcmp(zReply
86e0: 2c 22 53 51 4c 49 54 45 5f 4f 4b 22 29 3d 3d 30  ,"SQLITE_OK")==0
86f0: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
8700: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 20  ITE_OK;.  }else 
8710: 69 66 28 20 73 74 72 63 6d 70 28 7a 52 65 70 6c  if( strcmp(zRepl
8720: 79 2c 22 53 51 4c 49 54 45 5f 44 45 4e 59 22 29  y,"SQLITE_DENY")
8730: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
8740: 53 51 4c 49 54 45 5f 44 45 4e 59 3b 0a 20 20 7d  SQLITE_DENY;.  }
8750: 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
8760: 7a 52 65 70 6c 79 2c 22 53 51 4c 49 54 45 5f 49  zReply,"SQLITE_I
8770: 47 4e 4f 52 45 22 29 3d 3d 30 20 29 7b 0a 20 20  GNORE")==0 ){.  
8780: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 47    rc = SQLITE_IG
8790: 4e 4f 52 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  NORE;.  }else{. 
87a0: 20 20 20 72 63 20 3d 20 39 39 39 3b 0a 20 20 7d     rc = 999;.  }
87b0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
87c0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
87d0: 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54  _OMIT_AUTHORIZAT
87e0: 49 4f 4e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68  ION */../*.** Th
87f0: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 61 64 73  is routine reads
8800: 20 61 20 6c 69 6e 65 20 6f 66 20 74 65 78 74 20   a line of text 
8810: 66 72 6f 6d 20 46 49 4c 45 20 69 6e 2c 20 73 74  from FILE in, st
8820: 6f 72 65 73 0a 2a 2a 20 74 68 65 20 74 65 78 74  ores.** the text
8830: 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69   in memory obtai
8840: 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28  ned from malloc(
8850: 29 20 61 6e 64 20 72 65 74 75 72 6e 73 20 61 20  ) and returns a 
8860: 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68  pointer.** to th
8870: 65 20 74 65 78 74 2e 20 20 4e 55 4c 4c 20 69 73  e text.  NULL is
8880: 20 72 65 74 75 72 6e 65 64 20 61 74 20 65 6e 64   returned at end
8890: 20 6f 66 20 66 69 6c 65 2c 20 6f 72 20 69 66 20   of file, or if 
88a0: 6d 61 6c 6c 6f 63 28 29 0a 2a 2a 20 66 61 69 6c  malloc().** fail
88b0: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 74  s..**.** The int
88c0: 65 72 66 61 63 65 20 69 73 20 6c 69 6b 65 20 22  erface is like "
88d0: 72 65 61 64 6c 69 6e 65 22 20 62 75 74 20 6e 6f  readline" but no
88e0: 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 65 64   command-line ed
88f0: 69 74 69 6e 67 0a 2a 2a 20 69 73 20 64 6f 6e 65  iting.** is done
8900: 2e 0a 2a 2a 0a 2a 2a 20 63 6f 70 69 65 64 20 66  ..**.** copied f
8910: 72 6f 6d 20 73 68 65 6c 6c 2e 63 20 66 72 6f 6d  rom shell.c from
8920: 20 27 2e 69 6d 70 6f 72 74 27 20 63 6f 6d 6d 61   '.import' comma
8930: 6e 64 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  nd.*/.static cha
8940: 72 20 2a 6c 6f 63 61 6c 5f 67 65 74 6c 69 6e 65  r *local_getline
8950: 28 63 68 61 72 20 2a 7a 50 72 6f 6d 70 74 2c 20  (char *zPrompt, 
8960: 46 49 4c 45 20 2a 69 6e 29 7b 0a 20 20 63 68 61  FILE *in){.  cha
8970: 72 20 2a 7a 4c 69 6e 65 3b 0a 20 20 69 6e 74 20  r *zLine;.  int 
8980: 6e 4c 69 6e 65 3b 0a 20 20 69 6e 74 20 6e 3b 0a  nLine;.  int n;.
8990: 0a 20 20 6e 4c 69 6e 65 20 3d 20 31 30 30 3b 0a  .  nLine = 100;.
89a0: 20 20 7a 4c 69 6e 65 20 3d 20 6d 61 6c 6c 6f 63    zLine = malloc
89b0: 28 20 6e 4c 69 6e 65 20 29 3b 0a 20 20 69 66 28  ( nLine );.  if(
89c0: 20 7a 4c 69 6e 65 3d 3d 30 20 29 20 72 65 74 75   zLine==0 ) retu
89d0: 72 6e 20 30 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20  rn 0;.  n = 0;. 
89e0: 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20   while( 1 ){.   
89f0: 20 69 66 28 20 6e 2b 31 30 30 3e 6e 4c 69 6e 65   if( n+100>nLine
8a00: 20 29 7b 0a 20 20 20 20 20 20 6e 4c 69 6e 65 20   ){.      nLine 
8a10: 3d 20 6e 4c 69 6e 65 2a 32 20 2b 20 31 30 30 3b  = nLine*2 + 100;
8a20: 0a 20 20 20 20 20 20 7a 4c 69 6e 65 20 3d 20 72  .      zLine = r
8a30: 65 61 6c 6c 6f 63 28 7a 4c 69 6e 65 2c 20 6e 4c  ealloc(zLine, nL
8a40: 69 6e 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ine);.      if( 
8a50: 7a 4c 69 6e 65 3d 3d 30 20 29 20 72 65 74 75 72  zLine==0 ) retur
8a60: 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  n 0;.    }.    i
8a70: 66 28 20 66 67 65 74 73 28 26 7a 4c 69 6e 65 5b  f( fgets(&zLine[
8a80: 6e 5d 2c 20 6e 4c 69 6e 65 20 2d 20 6e 2c 20 69  n], nLine - n, i
8a90: 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  n)==0 ){.      i
8aa0: 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( n==0 ){.     
8ab0: 20 20 20 66 72 65 65 28 7a 4c 69 6e 65 29 3b 0a     free(zLine);.
8ac0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30          return 0
8ad0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
8ae0: 7a 4c 69 6e 65 5b 6e 5d 20 3d 20 30 3b 0a 20 20  zLine[n] = 0;.  
8af0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
8b00: 0a 20 20 20 20 77 68 69 6c 65 28 20 7a 4c 69 6e  .    while( zLin
8b10: 65 5b 6e 5d 20 29 7b 20 6e 2b 2b 3b 20 7d 0a 20  e[n] ){ n++; }. 
8b20: 20 20 20 69 66 28 20 6e 3e 30 20 26 26 20 7a 4c     if( n>0 && zL
8b30: 69 6e 65 5b 6e 2d 31 5d 3d 3d 27 5c 6e 27 20 29  ine[n-1]=='\n' )
8b40: 7b 0a 20 20 20 20 20 20 6e 2d 2d 3b 0a 20 20 20  {.      n--;.   
8b50: 20 20 20 7a 4c 69 6e 65 5b 6e 5d 20 3d 20 30 3b     zLine[n] = 0;
8b60: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
8b70: 20 20 7d 0a 20 20 7d 0a 20 20 7a 4c 69 6e 65 20    }.  }.  zLine 
8b80: 3d 20 72 65 61 6c 6c 6f 63 28 20 7a 4c 69 6e 65  = realloc( zLine
8b90: 2c 20 6e 2b 31 20 29 3b 0a 20 20 72 65 74 75 72  , n+1 );.  retur
8ba0: 6e 20 7a 4c 69 6e 65 3b 0a 7d 0a 0a 0a 2f 2a 0a  n zLine;.}.../*.
8bb0: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
8bc0: 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   is part of the 
8bd0: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
8be0: 66 20 74 68 65 20 63 6f 6d 6d 61 6e 64 3a 0a 2a  f the command:.*
8bf0: 2a 0a 2a 2a 20 20 20 24 64 62 20 74 72 61 6e 73  *.**   $db trans
8c00: 61 63 74 69 6f 6e 20 5b 2d 64 65 66 65 72 72 65  action [-deferre
8c10: 64 7c 2d 69 6d 6d 65 64 69 61 74 65 7c 2d 65 78  d|-immediate|-ex
8c20: 63 6c 75 73 69 76 65 5d 20 53 43 52 49 50 54 0a  clusive] SCRIPT.
8c30: 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 69 6e 76 6f  **.** It is invo
8c40: 6b 65 64 20 61 66 74 65 72 20 65 76 61 6c 75 61  ked after evalua
8c50: 74 69 6e 67 20 74 68 65 20 73 63 72 69 70 74 20  ting the script 
8c60: 53 43 52 49 50 54 20 74 6f 20 63 6f 6d 6d 69 74  SCRIPT to commit
8c70: 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20   or rollback.** 
8c80: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
8c90: 6f 72 20 73 61 76 65 70 6f 69 6e 74 20 6f 70 65  or savepoint ope
8ca0: 6e 65 64 20 62 79 20 74 68 65 20 5b 74 72 61 6e  ned by the [tran
8cb0: 73 61 63 74 69 6f 6e 5d 20 63 6f 6d 6d 61 6e 64  saction] command
8cc0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
8cd0: 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 44 62  SQLITE_TCLAPI Db
8ce0: 54 72 61 6e 73 50 6f 73 74 43 6d 64 28 0a 20 20  TransPostCmd(.  
8cf0: 43 6c 69 65 6e 74 44 61 74 61 20 64 61 74 61 5b  ClientData data[
8d00: 5d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ],              
8d10: 20 20 20 20 20 2f 2a 20 64 61 74 61 5b 30 5d 20       /* data[0] 
8d20: 69 73 20 74 68 65 20 53 71 6c 69 74 65 33 44 62  is the Sqlite3Db
8d30: 2a 20 66 6f 72 20 24 64 62 20 2a 2f 0a 20 20 54  * for $db */.  T
8d40: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
8d50: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
8d60: 20 20 20 20 2f 2a 20 54 63 6c 20 69 6e 74 65 72      /* Tcl inter
8d70: 70 72 65 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  preter */.  int 
8d80: 72 65 73 75 6c 74 20 20 20 20 20 20 20 20 20 20  result          
8d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8da0: 20 2f 2a 20 52 65 73 75 6c 74 20 6f 66 20 65 76   /* Result of ev
8db0: 61 6c 75 61 74 69 6e 67 20 53 43 52 49 50 54 20  aluating SCRIPT 
8dc0: 2a 2f 0a 29 7b 0a 20 20 73 74 61 74 69 63 20 63  */.){.  static c
8dd0: 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 6e 73 74  onst char *const
8de0: 20 61 7a 45 6e 64 5b 5d 20 3d 20 7b 0a 20 20 20   azEnd[] = {.   
8df0: 20 22 52 45 4c 45 41 53 45 20 5f 74 63 6c 5f 74   "RELEASE _tcl_t
8e00: 72 61 6e 73 61 63 74 69 6f 6e 22 2c 20 20 20 20  ransaction",    
8e10: 20 20 20 20 2f 2a 20 72 63 3d 3d 54 43 4c 5f 45      /* rc==TCL_E
8e20: 52 52 4f 52 2c 20 6e 54 72 61 6e 73 61 63 74 69  RROR, nTransacti
8e30: 6f 6e 21 3d 30 20 2a 2f 0a 20 20 20 20 22 43 4f  on!=0 */.    "CO
8e40: 4d 4d 49 54 22 2c 20 20 20 20 20 20 20 20 20 20  MMIT",          
8e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8e60: 2f 2a 20 72 63 21 3d 54 43 4c 5f 45 52 52 4f 52  /* rc!=TCL_ERROR
8e70: 2c 20 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  , nTransaction==
8e80: 30 20 2a 2f 0a 20 20 20 20 22 52 4f 4c 4c 42 41  0 */.    "ROLLBA
8e90: 43 4b 20 54 4f 20 5f 74 63 6c 5f 74 72 61 6e 73  CK TO _tcl_trans
8ea0: 61 63 74 69 6f 6e 20 3b 20 52 45 4c 45 41 53 45  action ; RELEASE
8eb0: 20 5f 74 63 6c 5f 74 72 61 6e 73 61 63 74 69 6f   _tcl_transactio
8ec0: 6e 22 2c 0a 20 20 20 20 22 52 4f 4c 4c 42 41 43  n",.    "ROLLBAC
8ed0: 4b 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K"              
8ee0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 72 63             /* rc
8ef0: 3d 3d 54 43 4c 5f 45 52 52 4f 52 2c 20 6e 54 72  ==TCL_ERROR, nTr
8f00: 61 6e 73 61 63 74 69 6f 6e 3d 3d 30 20 2a 2f 0a  ansaction==0 */.
8f10: 20 20 7d 3b 0a 20 20 53 71 6c 69 74 65 44 62 20    };.  SqliteDb 
8f20: 2a 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62  *pDb = (SqliteDb
8f30: 2a 29 64 61 74 61 5b 30 5d 3b 0a 20 20 69 6e 74  *)data[0];.  int
8f40: 20 72 63 20 3d 20 72 65 73 75 6c 74 3b 0a 20 20   rc = result;.  
8f50: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 6e 64  const char *zEnd
8f60: 3b 0a 0a 20 20 70 44 62 2d 3e 6e 54 72 61 6e 73  ;..  pDb->nTrans
8f70: 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20 7a 45 6e 64  action--;.  zEnd
8f80: 20 3d 20 61 7a 45 6e 64 5b 28 72 63 3d 3d 54 43   = azEnd[(rc==TC
8f90: 4c 5f 45 52 52 4f 52 29 2a 32 20 2b 20 28 70 44  L_ERROR)*2 + (pD
8fa0: 62 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  b->nTransaction=
8fb0: 3d 30 29 5d 3b 0a 0a 20 20 70 44 62 2d 3e 64 69  =0)];..  pDb->di
8fc0: 73 61 62 6c 65 41 75 74 68 2b 2b 3b 0a 20 20 69  sableAuth++;.  i
8fd0: 66 28 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28  f( sqlite3_exec(
8fe0: 70 44 62 2d 3e 64 62 2c 20 7a 45 6e 64 2c 20 30  pDb->db, zEnd, 0
8ff0: 2c 20 30 2c 20 30 29 20 29 7b 0a 20 20 20 20 20  , 0, 0) ){.     
9000: 20 2f 2a 20 54 68 69 73 20 69 73 20 61 20 74 72   /* This is a tr
9010: 69 63 6b 79 20 73 63 65 6e 61 72 69 6f 20 74 6f  icky scenario to
9020: 20 68 61 6e 64 6c 65 2e 20 54 68 65 20 6d 6f 73   handle. The mos
9030: 74 20 6c 69 6b 65 6c 79 20 63 61 75 73 65 20 6f  t likely cause o
9040: 66 20 61 6e 0a 20 20 20 20 20 20 2a 2a 20 65 72  f an.      ** er
9050: 72 6f 72 20 69 73 20 74 68 61 74 20 74 68 65 20  ror is that the 
9060: 65 78 65 63 28 29 20 61 62 6f 76 65 20 77 61 73  exec() above was
9070: 20 61 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 63   an attempt to c
9080: 6f 6d 6d 69 74 20 74 68 65 0a 20 20 20 20 20 20  ommit the.      
9090: 2a 2a 20 74 6f 70 2d 6c 65 76 65 6c 20 74 72 61  ** top-level tra
90a0: 6e 73 61 63 74 69 6f 6e 20 74 68 61 74 20 72 65  nsaction that re
90b0: 74 75 72 6e 65 64 20 53 51 4c 49 54 45 5f 42 55  turned SQLITE_BU
90c0: 53 59 2e 20 4f 72 2c 20 6c 65 73 73 20 6c 69 6b  SY. Or, less lik
90d0: 65 6c 79 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68  ely,.      ** th
90e0: 61 74 20 61 6e 20 49 4f 2d 65 72 72 6f 72 20 68  at an IO-error h
90f0: 61 73 20 6f 63 63 75 72 72 65 64 2e 20 49 6e 20  as occurred. In 
9100: 65 69 74 68 65 72 20 63 61 73 65 2c 20 74 68 72  either case, thr
9110: 6f 77 20 61 20 54 63 6c 20 65 78 63 65 70 74 69  ow a Tcl excepti
9120: 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20  on.      ** and 
9130: 74 72 79 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20  try to rollback 
9140: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  the transaction.
9150: 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
9160: 2a 2a 20 42 75 74 20 69 74 20 63 6f 75 6c 64 20  ** But it could 
9170: 61 6c 73 6f 20 62 65 20 74 68 61 74 20 74 68 65  also be that the
9180: 20 75 73 65 72 20 65 78 65 63 75 74 65 64 20 6f   user executed o
9190: 6e 65 20 6f 72 20 6d 6f 72 65 20 42 45 47 49 4e  ne or more BEGIN
91a0: 2c 0a 20 20 20 20 20 20 2a 2a 20 43 4f 4d 4d 49  ,.      ** COMMI
91b0: 54 2c 20 53 41 56 45 50 4f 49 4e 54 2c 20 52 45  T, SAVEPOINT, RE
91c0: 4c 45 41 53 45 20 6f 72 20 52 4f 4c 4c 42 41 43  LEASE or ROLLBAC
91d0: 4b 20 63 6f 6d 6d 61 6e 64 73 20 74 68 61 74 20  K commands that 
91e0: 61 72 65 20 63 6f 6e 66 75 73 69 6e 67 0a 20 20  are confusing.  
91f0: 20 20 20 20 2a 2a 20 74 68 69 73 20 6d 65 74 68      ** this meth
9200: 6f 64 27 73 20 6c 6f 67 69 63 2e 20 4e 6f 74 20  od's logic. Not 
9210: 63 6c 65 61 72 20 68 6f 77 20 74 68 69 73 20 77  clear how this w
9220: 6f 75 6c 64 20 62 65 20 62 65 73 74 20 68 61 6e  ould be best han
9230: 64 6c 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  dled..      */. 
9240: 20 20 20 69 66 28 20 72 63 21 3d 54 43 4c 5f 45     if( rc!=TCL_E
9250: 52 52 4f 52 20 29 7b 0a 20 20 20 20 20 20 54 63  RROR ){.      Tc
9260: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
9270: 6e 74 65 72 70 2c 20 73 71 6c 69 74 65 33 5f 65  nterp, sqlite3_e
9280: 72 72 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c 20  rrmsg(pDb->db), 
9290: 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20  (char*)0);.     
92a0: 20 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b   rc = TCL_ERROR;
92b0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
92c0: 65 33 5f 65 78 65 63 28 70 44 62 2d 3e 64 62 2c  e3_exec(pDb->db,
92d0: 20 22 52 4f 4c 4c 42 41 43 4b 22 2c 20 30 2c 20   "ROLLBACK", 0, 
92e0: 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 70 44 62  0, 0);.  }.  pDb
92f0: 2d 3e 64 69 73 61 62 6c 65 41 75 74 68 2d 2d 3b  ->disableAuth--;
9300: 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
9310: 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 53  ../*.** Unless S
9320: 51 4c 49 54 45 5f 54 45 53 54 20 69 73 20 64 65  QLITE_TEST is de
9330: 66 69 6e 65 64 2c 20 74 68 69 73 20 66 75 6e 63  fined, this func
9340: 74 69 6f 6e 20 69 73 20 61 20 73 69 6d 70 6c 65  tion is a simple
9350: 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64 0a   wrapper around.
9360: 2a 2a 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61  ** sqlite3_prepa
9370: 72 65 5f 76 32 28 29 2e 20 49 66 20 53 51 4c 49  re_v2(). If SQLI
9380: 54 45 5f 54 45 53 54 20 69 73 20 64 65 66 69 6e  TE_TEST is defin
9390: 65 64 2c 20 74 68 65 6e 20 69 74 20 75 73 65 73  ed, then it uses
93a0: 20 65 69 74 68 65 72 0a 2a 2a 20 73 71 6c 69 74   either.** sqlit
93b0: 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 29 20  e3_prepare_v2() 
93c0: 6f 72 20 6c 65 67 61 63 79 20 69 6e 74 65 72 66  or legacy interf
93d0: 61 63 65 20 73 71 6c 69 74 65 33 5f 70 72 65 70  ace sqlite3_prep
93e0: 61 72 65 28 29 2c 20 64 65 70 65 6e 64 69 6e 67  are(), depending
93f0: 0a 2a 2a 20 6f 6e 20 77 68 65 74 68 65 72 20 6f  .** on whether o
9400: 72 20 6e 6f 74 20 74 68 65 20 5b 64 62 5f 75 73  r not the [db_us
9410: 65 5f 6c 65 67 61 63 79 5f 70 72 65 70 61 72 65  e_legacy_prepare
9420: 5d 20 63 6f 6d 6d 61 6e 64 20 68 61 73 20 62 65  ] command has be
9430: 65 6e 20 75 73 65 64 20 74 6f 0a 2a 2a 20 63 6f  en used to.** co
9440: 6e 66 69 67 75 72 65 20 74 68 65 20 63 6f 6e 6e  nfigure the conn
9450: 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  ection..*/.stati
9460: 63 20 69 6e 74 20 64 62 50 72 65 70 61 72 65 28  c int dbPrepare(
9470: 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62  .  SqliteDb *pDb
9480: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
9490: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6f     /* Database o
94a0: 62 6a 65 63 74 20 2a 2f 0a 20 20 63 6f 6e 73 74  bject */.  const
94b0: 20 63 68 61 72 20 2a 7a 53 71 6c 2c 20 20 20 20   char *zSql,    
94c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51             /* SQ
94d0: 4c 20 74 6f 20 63 6f 6d 70 69 6c 65 20 2a 2f 0a  L to compile */.
94e0: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
94f0: 2a 70 70 53 74 6d 74 2c 20 20 20 20 20 20 20 20  *ppStmt,        
9500: 20 20 2f 2a 20 4f 55 54 3a 20 50 72 65 70 61 72    /* OUT: Prepar
9510: 65 64 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  ed statement */.
9520: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70    const char **p
9530: 7a 4f 75 74 20 20 20 20 20 20 20 20 20 20 20 20  zOut            
9540: 20 20 2f 2a 20 4f 55 54 3a 20 50 6f 69 6e 74 65    /* OUT: Pointe
9550: 72 20 74 6f 20 6e 65 78 74 20 53 51 4c 20 73 74  r to next SQL st
9560: 61 74 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 23 69  atement */.){.#i
9570: 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
9580: 0a 20 20 69 66 28 20 70 44 62 2d 3e 62 4c 65 67  .  if( pDb->bLeg
9590: 61 63 79 50 72 65 70 61 72 65 20 29 7b 0a 20 20  acyPrepare ){.  
95a0: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
95b0: 5f 70 72 65 70 61 72 65 28 70 44 62 2d 3e 64 62  _prepare(pDb->db
95c0: 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 70 70 53 74  , zSql, -1, ppSt
95d0: 6d 74 2c 20 70 7a 4f 75 74 29 3b 0a 20 20 7d 0a  mt, pzOut);.  }.
95e0: 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
95f0: 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
9600: 76 32 28 70 44 62 2d 3e 64 62 2c 20 7a 53 71 6c  v2(pDb->db, zSql
9610: 2c 20 2d 31 2c 20 70 70 53 74 6d 74 2c 20 70 7a  , -1, ppStmt, pz
9620: 4f 75 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  Out);.}../*.** S
9630: 65 61 72 63 68 20 74 68 65 20 63 61 63 68 65 20  earch the cache 
9640: 66 6f 72 20 61 20 70 72 65 70 61 72 65 64 2d 73  for a prepared-s
9650: 74 61 74 65 6d 65 6e 74 20 6f 62 6a 65 63 74 20  tatement object 
9660: 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20  that implements 
9670: 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 53 51 4c  the.** first SQL
9680: 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 74 68   statement in th
9690: 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64  e buffer pointed
96a0: 20 74 6f 20 62 79 20 70 61 72 61 6d 65 74 65 72   to by parameter
96b0: 20 7a 49 6e 2e 20 49 66 0a 2a 2a 20 6e 6f 20 73   zIn. If.** no s
96c0: 75 63 68 20 70 72 65 70 61 72 65 64 2d 73 74 61  uch prepared-sta
96d0: 74 65 6d 65 6e 74 20 63 61 6e 20 62 65 20 66 6f  tement can be fo
96e0: 75 6e 64 2c 20 61 6c 6c 6f 63 61 74 65 20 61 6e  und, allocate an
96f0: 64 20 70 72 65 70 61 72 65 20 61 20 6e 65 77 0a  d prepare a new.
9700: 2a 2a 20 6f 6e 65 2e 20 49 6e 20 65 69 74 68 65  ** one. In eithe
9710: 72 20 63 61 73 65 2c 20 62 69 6e 64 20 74 68 65  r case, bind the
9720: 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 73 20   current values 
9730: 6f 66 20 74 68 65 20 72 65 6c 65 76 61 6e 74 20  of the relevant 
9740: 54 63 6c 0a 2a 2a 20 76 61 72 69 61 62 6c 65 73  Tcl.** variables
9750: 20 74 6f 20 61 6e 79 20 24 76 61 72 2c 20 3a 76   to any $var, :v
9760: 61 72 20 6f 72 20 40 76 61 72 20 76 61 72 69 61  ar or @var varia
9770: 62 6c 65 73 20 69 6e 20 74 68 65 20 73 74 61 74  bles in the stat
9780: 65 6d 65 6e 74 2e 20 42 65 66 6f 72 65 0a 2a 2a  ement. Before.**
9790: 20 72 65 74 75 72 6e 69 6e 67 2c 20 73 65 74 20   returning, set 
97a0: 2a 70 70 50 72 65 53 74 6d 74 20 74 6f 20 70 6f  *ppPreStmt to po
97b0: 69 6e 74 20 74 6f 20 74 68 65 20 70 72 65 70 61  int to the prepa
97c0: 72 65 64 2d 73 74 61 74 65 6d 65 6e 74 20 6f 62  red-statement ob
97d0: 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 4f 75 74 70  ject..**.** Outp
97e0: 75 74 20 70 61 72 61 6d 65 74 65 72 20 2a 70 7a  ut parameter *pz
97f0: 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 70 6f  Out is set to po
9800: 69 6e 74 20 74 6f 20 74 68 65 20 6e 65 78 74 20  int to the next 
9810: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 69 6e  SQL statement in
9820: 0a 2a 2a 20 62 75 66 66 65 72 20 7a 49 6e 2c 20  .** buffer zIn, 
9830: 6f 72 20 74 6f 20 74 68 65 20 27 5c 30 27 20 62  or to the '\0' b
9840: 79 74 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f  yte at the end o
9850: 66 20 7a 49 6e 20 69 66 20 74 68 65 72 65 20 69  f zIn if there i
9860: 73 20 6e 6f 0a 2a 2a 20 6e 65 78 74 20 73 74 61  s no.** next sta
9870: 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  tement..**.** If
9880: 20 73 75 63 63 65 73 73 66 75 6c 2c 20 54 43 4c   successful, TCL
9890: 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
98a0: 20 4f 74 68 65 72 77 69 73 65 2c 20 54 43 4c 5f   Otherwise, TCL_
98b0: 45 52 52 4f 52 20 69 73 20 72 65 74 75 72 6e 65  ERROR is returne
98c0: 64 0a 2a 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f  d.** and an erro
98d0: 72 20 6d 65 73 73 61 67 65 20 6c 6f 61 64 65 64  r message loaded
98e0: 20 69 6e 74 6f 20 69 6e 74 65 72 70 72 65 74 65   into interprete
98f0: 72 20 70 44 62 2d 3e 69 6e 74 65 72 70 2e 0a 2a  r pDb->interp..*
9900: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 62 50  /.static int dbP
9910: 72 65 70 61 72 65 41 6e 64 42 69 6e 64 28 0a 20  repareAndBind(. 
9920: 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 2c 20   SqliteDb *pDb, 
9930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9940: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6f 62 6a   /* Database obj
9950: 65 63 74 20 2a 2f 0a 20 20 63 68 61 72 20 63 6f  ect */.  char co
9960: 6e 73 74 20 2a 7a 49 6e 2c 20 20 20 20 20 20 20  nst *zIn,       
9970: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 20           /* SQL 
9980: 74 6f 20 63 6f 6d 70 69 6c 65 20 2a 2f 0a 20 20  to compile */.  
9990: 63 68 61 72 20 63 6f 6e 73 74 20 2a 2a 70 7a 4f  char const **pzO
99a0: 75 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ut,             
99b0: 2f 2a 20 4f 55 54 3a 20 50 6f 69 6e 74 65 72 20  /* OUT: Pointer 
99c0: 74 6f 20 6e 65 78 74 20 53 51 4c 20 73 74 61 74  to next SQL stat
99d0: 65 6d 65 6e 74 20 2a 2f 0a 20 20 53 71 6c 50 72  ement */.  SqlPr
99e0: 65 70 61 72 65 64 53 74 6d 74 20 2a 2a 70 70 50  eparedStmt **ppP
99f0: 72 65 53 74 6d 74 20 20 20 20 20 2f 2a 20 4f 55  reStmt     /* OU
9a00: 54 3a 20 4f 62 6a 65 63 74 20 75 73 65 64 20 74  T: Object used t
9a10: 6f 20 63 61 63 68 65 20 73 74 61 74 65 6d 65 6e  o cache statemen
9a20: 74 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20  t */.){.  const 
9a30: 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20 7a 49 6e  char *zSql = zIn
9a40: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69  ;         /* Poi
9a50: 6e 74 65 72 20 74 6f 20 66 69 72 73 74 20 53 51  nter to first SQ
9a60: 4c 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 7a  L statement in z
9a70: 49 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  In */.  sqlite3_
9a80: 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b  stmt *pStmt = 0;
9a90: 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 70 61          /* Prepa
9aa0: 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 6f 62  red statement ob
9ab0: 6a 65 63 74 20 2a 2f 0a 20 20 53 71 6c 50 72 65  ject */.  SqlPre
9ac0: 70 61 72 65 64 53 74 6d 74 20 2a 70 50 72 65 53  paredStmt *pPreS
9ad0: 74 6d 74 3b 20 20 20 20 20 20 2f 2a 20 50 6f 69  tmt;      /* Poi
9ae0: 6e 74 65 72 20 74 6f 20 63 61 63 68 65 64 20 73  nter to cached s
9af0: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e  tatement */.  in
9b00: 74 20 6e 53 71 6c 3b 20 20 20 20 20 20 20 20 20  t nSql;         
9b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9b20: 20 4c 65 6e 67 74 68 20 6f 66 20 7a 53 71 6c 20   Length of zSql 
9b30: 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e  in bytes */.  in
9b40: 74 20 6e 56 61 72 20 3d 20 30 3b 20 20 20 20 20  t nVar = 0;     
9b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9b60: 20 4e 75 6d 62 65 72 20 6f 66 20 76 61 72 69 61   Number of varia
9b70: 62 6c 65 73 20 69 6e 20 73 74 61 74 65 6d 65 6e  bles in statemen
9b80: 74 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 6d  t */.  int iParm
9b90: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
9ba0: 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 66         /* Next f
9bb0: 72 65 65 20 65 6e 74 72 79 20 69 6e 20 61 70 50  ree entry in apP
9bc0: 61 72 6d 20 2a 2f 0a 20 20 63 68 61 72 20 63 3b  arm */.  char c;
9bd0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 54 63 6c 5f  .  int i;.  Tcl_
9be0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 20 3d  Interp *interp =
9bf0: 20 70 44 62 2d 3e 69 6e 74 65 72 70 3b 0a 0a 20   pDb->interp;.. 
9c00: 20 2a 70 70 50 72 65 53 74 6d 74 20 3d 20 30 3b   *ppPreStmt = 0;
9c10: 0a 0a 20 20 2f 2a 20 54 72 69 6d 20 73 70 61 63  ..  /* Trim spac
9c20: 65 73 20 66 72 6f 6d 20 74 68 65 20 73 74 61 72  es from the star
9c30: 74 20 6f 66 20 7a 53 71 6c 20 61 6e 64 20 63 61  t of zSql and ca
9c40: 6c 63 75 6c 61 74 65 20 74 68 65 20 72 65 6d 61  lculate the rema
9c50: 69 6e 69 6e 67 20 6c 65 6e 67 74 68 2e 20 2a 2f  ining length. */
9c60: 0a 20 20 77 68 69 6c 65 28 20 28 63 20 3d 20 7a  .  while( (c = z
9c70: 53 71 6c 5b 30 5d 29 3d 3d 27 20 27 20 7c 7c 20  Sql[0])==' ' || 
9c80: 63 3d 3d 27 5c 74 27 20 7c 7c 20 63 3d 3d 27 5c  c=='\t' || c=='\
9c90: 72 27 20 7c 7c 20 63 3d 3d 27 5c 6e 27 20 29 7b  r' || c=='\n' ){
9ca0: 20 7a 53 71 6c 2b 2b 3b 20 7d 0a 20 20 6e 53 71   zSql++; }.  nSq
9cb0: 6c 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 53 71  l = strlen30(zSq
9cc0: 6c 29 3b 0a 0a 20 20 66 6f 72 28 70 50 72 65 53  l);..  for(pPreS
9cd0: 74 6d 74 20 3d 20 70 44 62 2d 3e 73 74 6d 74 4c  tmt = pDb->stmtL
9ce0: 69 73 74 3b 20 70 50 72 65 53 74 6d 74 3b 20 70  ist; pPreStmt; p
9cf0: 50 72 65 53 74 6d 74 3d 70 50 72 65 53 74 6d 74  PreStmt=pPreStmt
9d00: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 6e  ->pNext){.    in
9d10: 74 20 6e 20 3d 20 70 50 72 65 53 74 6d 74 2d 3e  t n = pPreStmt->
9d20: 6e 53 71 6c 3b 0a 20 20 20 20 69 66 28 20 6e 53  nSql;.    if( nS
9d30: 71 6c 3e 3d 6e 0a 20 20 20 20 20 20 20 20 26 26  ql>=n.        &&
9d40: 20 6d 65 6d 63 6d 70 28 70 50 72 65 53 74 6d 74   memcmp(pPreStmt
9d50: 2d 3e 7a 53 71 6c 2c 20 7a 53 71 6c 2c 20 6e 29  ->zSql, zSql, n)
9d60: 3d 3d 30 0a 20 20 20 20 20 20 20 20 26 26 20 28  ==0.        && (
9d70: 7a 53 71 6c 5b 6e 5d 3d 3d 30 20 7c 7c 20 7a 53  zSql[n]==0 || zS
9d80: 71 6c 5b 6e 2d 31 5d 3d 3d 27 3b 27 29 0a 20 20  ql[n-1]==';').  
9d90: 20 20 29 7b 0a 20 20 20 20 20 20 70 53 74 6d 74    ){.      pStmt
9da0: 20 3d 20 70 50 72 65 53 74 6d 74 2d 3e 70 53 74   = pPreStmt->pSt
9db0: 6d 74 3b 0a 20 20 20 20 20 20 2a 70 7a 4f 75 74  mt;.      *pzOut
9dc0: 20 3d 20 26 7a 53 71 6c 5b 70 50 72 65 53 74 6d   = &zSql[pPreStm
9dd0: 74 2d 3e 6e 53 71 6c 5d 3b 0a 0a 20 20 20 20 20  t->nSql];..     
9de0: 20 2f 2a 20 57 68 65 6e 20 61 20 70 72 65 70 61   /* When a prepa
9df0: 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 69 73  red statement is
9e00: 20 66 6f 75 6e 64 2c 20 75 6e 6c 69 6e 6b 20 69   found, unlink i
9e10: 74 20 66 72 6f 6d 20 74 68 65 0a 20 20 20 20 20  t from the.     
9e20: 20 2a 2a 20 63 61 63 68 65 20 6c 69 73 74 2e 20   ** cache list. 
9e30: 20 49 74 20 77 69 6c 6c 20 6c 61 74 65 72 20 62   It will later b
9e40: 65 20 61 64 64 65 64 20 62 61 63 6b 20 74 6f 20  e added back to 
9e50: 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20  the beginning.  
9e60: 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 63 61      ** of the ca
9e70: 63 68 65 20 6c 69 73 74 20 69 6e 20 6f 72 64 65  che list in orde
9e80: 72 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 4c  r to implement L
9e90: 52 55 20 72 65 70 6c 61 63 65 6d 65 6e 74 2e 0a  RU replacement..
9ea0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
9eb0: 66 28 20 70 50 72 65 53 74 6d 74 2d 3e 70 50 72  f( pPreStmt->pPr
9ec0: 65 76 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50  ev ){.        pP
9ed0: 72 65 53 74 6d 74 2d 3e 70 50 72 65 76 2d 3e 70  reStmt->pPrev->p
9ee0: 4e 65 78 74 20 3d 20 70 50 72 65 53 74 6d 74 2d  Next = pPreStmt-
9ef0: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 65  >pNext;.      }e
9f00: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 44 62  lse{.        pDb
9f10: 2d 3e 73 74 6d 74 4c 69 73 74 20 3d 20 70 50 72  ->stmtList = pPr
9f20: 65 53 74 6d 74 2d 3e 70 4e 65 78 74 3b 0a 20 20  eStmt->pNext;.  
9f30: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
9f40: 70 50 72 65 53 74 6d 74 2d 3e 70 4e 65 78 74 20  pPreStmt->pNext 
9f50: 29 7b 0a 20 20 20 20 20 20 20 20 70 50 72 65 53  ){.        pPreS
9f60: 74 6d 74 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65  tmt->pNext->pPre
9f70: 76 20 3d 20 70 50 72 65 53 74 6d 74 2d 3e 70 50  v = pPreStmt->pP
9f80: 72 65 76 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  rev;.      }else
9f90: 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 73  {.        pDb->s
9fa0: 74 6d 74 4c 61 73 74 20 3d 20 70 50 72 65 53 74  tmtLast = pPreSt
9fb0: 6d 74 2d 3e 70 50 72 65 76 3b 0a 20 20 20 20 20  mt->pPrev;.     
9fc0: 20 7d 0a 20 20 20 20 20 20 70 44 62 2d 3e 6e 53   }.      pDb->nS
9fd0: 74 6d 74 2d 2d 3b 0a 20 20 20 20 20 20 6e 56 61  tmt--;.      nVa
9fe0: 72 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  r = sqlite3_bind
9ff0: 5f 70 61 72 61 6d 65 74 65 72 5f 63 6f 75 6e 74  _parameter_count
a000: 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 62  (pStmt);.      b
a010: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
a020: 0a 20 20 2f 2a 20 49 66 20 6e 6f 20 70 72 65 70  .  /* If no prep
a030: 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 77  ared statement w
a040: 61 73 20 66 6f 75 6e 64 2e 20 43 6f 6d 70 69 6c  as found. Compil
a050: 65 20 74 68 65 20 53 51 4c 20 74 65 78 74 2e 20  e the SQL text. 
a060: 41 6c 73 6f 20 61 6c 6c 6f 63 61 74 65 0a 20 20  Also allocate.  
a070: 2a 2a 20 61 20 6e 65 77 20 53 71 6c 50 72 65 70  ** a new SqlPrep
a080: 61 72 65 64 53 74 6d 74 20 73 74 72 75 63 74 75  aredStmt structu
a090: 72 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  re.  */.  if( pP
a0a0: 72 65 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20 20  reStmt==0 ){.   
a0b0: 20 69 6e 74 20 6e 42 79 74 65 3b 0a 0a 20 20 20   int nByte;..   
a0c0: 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
a0d0: 64 62 50 72 65 70 61 72 65 28 70 44 62 2c 20 7a  dbPrepare(pDb, z
a0e0: 53 71 6c 2c 20 26 70 53 74 6d 74 2c 20 70 7a 4f  Sql, &pStmt, pzO
a0f0: 75 74 29 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  ut) ){.      Tcl
a100: 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
a110: 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72  terp, Tcl_NewStr
a120: 69 6e 67 4f 62 6a 28 73 71 6c 69 74 65 33 5f 65  ingObj(sqlite3_e
a130: 72 72 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c 20  rrmsg(pDb->db), 
a140: 2d 31 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75  -1));.      retu
a150: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
a160: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 53 74 6d    }.    if( pStm
a170: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  t==0 ){.      if
a180: 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c  ( SQLITE_OK!=sql
a190: 69 74 65 33 5f 65 72 72 63 6f 64 65 28 70 44 62  ite3_errcode(pDb
a1a0: 2d 3e 64 62 29 20 29 7b 0a 20 20 20 20 20 20 20  ->db) ){.       
a1b0: 20 2f 2a 20 41 20 63 6f 6d 70 69 6c 65 2d 74 69   /* A compile-ti
a1c0: 6d 65 20 65 72 72 6f 72 20 69 6e 20 74 68 65 20  me error in the 
a1d0: 73 74 61 74 65 6d 65 6e 74 2e 20 2a 2f 0a 20 20  statement. */.  
a1e0: 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a        Tcl_SetObj
a1f0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
a200: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
a210: 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70  sqlite3_errmsg(p
a220: 44 62 2d 3e 64 62 29 2c 20 2d 31 29 29 3b 0a 20  Db->db), -1));. 
a230: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43         return TC
a240: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d  L_ERROR;.      }
a250: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
a260: 20 54 68 65 20 73 74 61 74 65 6d 65 6e 74 20 77   The statement w
a270: 61 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 43 6f 6e  as a no-op.  Con
a280: 74 69 6e 75 65 20 74 6f 20 74 68 65 20 6e 65 78  tinue to the nex
a290: 74 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 20 20  t statement.    
a2a0: 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 53 51      ** in the SQ
a2b0: 4c 20 73 74 72 69 6e 67 2e 0a 20 20 20 20 20 20  L string..      
a2c0: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 74    */.        ret
a2d0: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20  urn TCL_OK;.    
a2e0: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61    }.    }..    a
a2f0: 73 73 65 72 74 28 20 70 50 72 65 53 74 6d 74 3d  ssert( pPreStmt=
a300: 3d 30 20 29 3b 0a 20 20 20 20 6e 56 61 72 20 3d  =0 );.    nVar =
a310: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61   sqlite3_bind_pa
a320: 72 61 6d 65 74 65 72 5f 63 6f 75 6e 74 28 70 53  rameter_count(pS
a330: 74 6d 74 29 3b 0a 20 20 20 20 6e 42 79 74 65 20  tmt);.    nByte 
a340: 3d 20 73 69 7a 65 6f 66 28 53 71 6c 50 72 65 70  = sizeof(SqlPrep
a350: 61 72 65 64 53 74 6d 74 29 20 2b 20 6e 56 61 72  aredStmt) + nVar
a360: 2a 73 69 7a 65 6f 66 28 54 63 6c 5f 4f 62 6a 20  *sizeof(Tcl_Obj 
a370: 2a 29 3b 0a 20 20 20 20 70 50 72 65 53 74 6d 74  *);.    pPreStmt
a380: 20 3d 20 28 53 71 6c 50 72 65 70 61 72 65 64 53   = (SqlPreparedS
a390: 74 6d 74 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28 6e  tmt*)Tcl_Alloc(n
a3a0: 42 79 74 65 29 3b 0a 20 20 20 20 6d 65 6d 73 65  Byte);.    memse
a3b0: 74 28 70 50 72 65 53 74 6d 74 2c 20 30 2c 20 6e  t(pPreStmt, 0, n
a3c0: 42 79 74 65 29 3b 0a 0a 20 20 20 20 70 50 72 65  Byte);..    pPre
a3d0: 53 74 6d 74 2d 3e 70 53 74 6d 74 20 3d 20 70 53  Stmt->pStmt = pS
a3e0: 74 6d 74 3b 0a 20 20 20 20 70 50 72 65 53 74 6d  tmt;.    pPreStm
a3f0: 74 2d 3e 6e 53 71 6c 20 3d 20 28 69 6e 74 29 28  t->nSql = (int)(
a400: 2a 70 7a 4f 75 74 20 2d 20 7a 53 71 6c 29 3b 0a  *pzOut - zSql);.
a410: 20 20 20 20 70 50 72 65 53 74 6d 74 2d 3e 7a 53      pPreStmt->zS
a420: 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 73 71 6c  ql = sqlite3_sql
a430: 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 70 50 72  (pStmt);.    pPr
a440: 65 53 74 6d 74 2d 3e 61 70 50 61 72 6d 20 3d 20  eStmt->apParm = 
a450: 28 54 63 6c 5f 4f 62 6a 20 2a 2a 29 26 70 50 72  (Tcl_Obj **)&pPr
a460: 65 53 74 6d 74 5b 31 5d 3b 0a 23 69 66 64 65 66  eStmt[1];.#ifdef
a470: 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 20   SQLITE_TEST.   
a480: 20 69 66 28 20 70 50 72 65 53 74 6d 74 2d 3e 7a   if( pPreStmt->z
a490: 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Sql==0 ){.      
a4a0: 63 68 61 72 20 2a 7a 43 6f 70 79 20 3d 20 54 63  char *zCopy = Tc
a4b0: 6c 5f 41 6c 6c 6f 63 28 70 50 72 65 53 74 6d 74  l_Alloc(pPreStmt
a4c0: 2d 3e 6e 53 71 6c 20 2b 20 31 29 3b 0a 20 20 20  ->nSql + 1);.   
a4d0: 20 20 20 6d 65 6d 63 70 79 28 7a 43 6f 70 79 2c     memcpy(zCopy,
a4e0: 20 7a 53 71 6c 2c 20 70 50 72 65 53 74 6d 74 2d   zSql, pPreStmt-
a4f0: 3e 6e 53 71 6c 29 3b 0a 20 20 20 20 20 20 7a 43  >nSql);.      zC
a500: 6f 70 79 5b 70 50 72 65 53 74 6d 74 2d 3e 6e 53  opy[pPreStmt->nS
a510: 71 6c 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20  ql] = '\0';.    
a520: 20 20 70 50 72 65 53 74 6d 74 2d 3e 7a 53 71 6c    pPreStmt->zSql
a530: 20 3d 20 7a 43 6f 70 79 3b 0a 20 20 20 20 7d 0a   = zCopy;.    }.
a540: 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 61 73 73  #endif.  }.  ass
a550: 65 72 74 28 20 70 50 72 65 53 74 6d 74 20 29 3b  ert( pPreStmt );
a560: 0a 20 20 61 73 73 65 72 74 28 20 73 74 72 6c 65  .  assert( strle
a570: 6e 33 30 28 70 50 72 65 53 74 6d 74 2d 3e 7a 53  n30(pPreStmt->zS
a580: 71 6c 29 3d 3d 70 50 72 65 53 74 6d 74 2d 3e 6e  ql)==pPreStmt->n
a590: 53 71 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  Sql );.  assert(
a5a0: 20 30 3d 3d 6d 65 6d 63 6d 70 28 70 50 72 65 53   0==memcmp(pPreS
a5b0: 74 6d 74 2d 3e 7a 53 71 6c 2c 20 7a 53 71 6c 2c  tmt->zSql, zSql,
a5c0: 20 70 50 72 65 53 74 6d 74 2d 3e 6e 53 71 6c 29   pPreStmt->nSql)
a5d0: 20 29 3b 0a 0a 20 20 2f 2a 20 42 69 6e 64 20 76   );..  /* Bind v
a5e0: 61 6c 75 65 73 20 74 6f 20 70 61 72 61 6d 65 74  alues to paramet
a5f0: 65 72 73 20 74 68 61 74 20 62 65 67 69 6e 20 77  ers that begin w
a600: 69 74 68 20 24 20 6f 72 20 3a 20 2a 2f 0a 20 20  ith $ or : */.  
a610: 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 6e 56 61 72  for(i=1; i<=nVar
a620: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73  ; i++){.    cons
a630: 74 20 63 68 61 72 20 2a 7a 56 61 72 20 3d 20 73  t char *zVar = s
a640: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61  qlite3_bind_para
a650: 6d 65 74 65 72 5f 6e 61 6d 65 28 70 53 74 6d 74  meter_name(pStmt
a660: 2c 20 69 29 3b 0a 20 20 20 20 69 66 28 20 7a 56  , i);.    if( zV
a670: 61 72 21 3d 30 20 26 26 20 28 7a 56 61 72 5b 30  ar!=0 && (zVar[0
a680: 5d 3d 3d 27 24 27 20 7c 7c 20 7a 56 61 72 5b 30  ]=='$' || zVar[0
a690: 5d 3d 3d 27 3a 27 20 7c 7c 20 7a 56 61 72 5b 30  ]==':' || zVar[0
a6a0: 5d 3d 3d 27 40 27 29 20 29 7b 0a 20 20 20 20 20  ]=='@') ){.     
a6b0: 20 54 63 6c 5f 4f 62 6a 20 2a 70 56 61 72 20 3d   Tcl_Obj *pVar =
a6c0: 20 54 63 6c 5f 47 65 74 56 61 72 32 45 78 28 69   Tcl_GetVar2Ex(i
a6d0: 6e 74 65 72 70 2c 20 26 7a 56 61 72 5b 31 5d 2c  nterp, &zVar[1],
a6e0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66   0, 0);.      if
a6f0: 28 20 70 56 61 72 20 29 7b 0a 20 20 20 20 20 20  ( pVar ){.      
a700: 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 20    int n;.       
a710: 20 75 38 20 2a 64 61 74 61 3b 0a 20 20 20 20 20   u8 *data;.     
a720: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
a730: 54 79 70 65 20 3d 20 28 70 56 61 72 2d 3e 74 79  Type = (pVar->ty
a740: 70 65 50 74 72 20 3f 20 70 56 61 72 2d 3e 74 79  pePtr ? pVar->ty
a750: 70 65 50 74 72 2d 3e 6e 61 6d 65 20 3a 20 22 22  pePtr->name : ""
a760: 29 3b 0a 20 20 20 20 20 20 20 20 63 20 3d 20 7a  );.        c = z
a770: 54 79 70 65 5b 30 5d 3b 0a 20 20 20 20 20 20 20  Type[0];.       
a780: 20 69 66 28 20 7a 56 61 72 5b 30 5d 3d 3d 27 40   if( zVar[0]=='@
a790: 27 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20  ' ||.           
a7a0: 28 63 3d 3d 27 62 27 20 26 26 20 73 74 72 63 6d  (c=='b' && strcm
a7b0: 70 28 7a 54 79 70 65 2c 22 62 79 74 65 61 72 72  p(zType,"bytearr
a7c0: 61 79 22 29 3d 3d 30 20 26 26 20 70 56 61 72 2d  ay")==0 && pVar-
a7d0: 3e 62 79 74 65 73 3d 3d 30 29 20 29 7b 0a 20 20  >bytes==0) ){.  
a7e0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 61 64 20          /* Load 
a7f0: 61 20 42 4c 4f 42 20 74 79 70 65 20 69 66 20 74  a BLOB type if t
a800: 68 65 20 54 63 6c 20 76 61 72 69 61 62 6c 65 20  he Tcl variable 
a810: 69 73 20 61 20 62 79 74 65 61 72 72 61 79 20 61  is a bytearray a
a820: 6e 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  nd.          ** 
a830: 69 74 20 68 61 73 20 6e 6f 20 73 74 72 69 6e 67  it has no string
a840: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
a850: 6f 72 20 74 68 65 20 68 6f 73 74 0a 20 20 20 20  or the host.    
a860: 20 20 20 20 20 20 2a 2a 20 70 61 72 61 6d 65 74        ** paramet
a870: 65 72 20 6e 61 6d 65 20 62 65 67 69 6e 73 20 77  er name begins w
a880: 69 74 68 20 22 40 22 2e 20 2a 2f 0a 20 20 20 20  ith "@". */.    
a890: 20 20 20 20 20 20 64 61 74 61 20 3d 20 54 63 6c        data = Tcl
a8a0: 5f 47 65 74 42 79 74 65 41 72 72 61 79 46 72 6f  _GetByteArrayFro
a8b0: 6d 4f 62 6a 28 70 56 61 72 2c 20 26 6e 29 3b 0a  mObj(pVar, &n);.
a8c0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
a8d0: 33 5f 62 69 6e 64 5f 62 6c 6f 62 28 70 53 74 6d  3_bind_blob(pStm
a8e0: 74 2c 20 69 2c 20 64 61 74 61 2c 20 6e 2c 20 53  t, i, data, n, S
a8f0: 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20  QLITE_STATIC);. 
a900: 20 20 20 20 20 20 20 20 20 54 63 6c 5f 49 6e 63           Tcl_Inc
a910: 72 52 65 66 43 6f 75 6e 74 28 70 56 61 72 29 3b  rRefCount(pVar);
a920: 0a 20 20 20 20 20 20 20 20 20 20 70 50 72 65 53  .          pPreS
a930: 74 6d 74 2d 3e 61 70 50 61 72 6d 5b 69 50 61 72  tmt->apParm[iPar
a940: 6d 2b 2b 5d 20 3d 20 70 56 61 72 3b 0a 20 20 20  m++] = pVar;.   
a950: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63       }else if( c
a960: 3d 3d 27 62 27 20 26 26 20 73 74 72 63 6d 70 28  =='b' && strcmp(
a970: 7a 54 79 70 65 2c 22 62 6f 6f 6c 65 61 6e 22 29  zType,"boolean")
a980: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
a990: 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
a9a0: 62 6a 28 69 6e 74 65 72 70 2c 20 70 56 61 72 2c  bj(interp, pVar,
a9b0: 20 26 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20   &n);.          
a9c0: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
a9d0: 28 70 53 74 6d 74 2c 20 69 2c 20 6e 29 3b 0a 20  (pStmt, i, n);. 
a9e0: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
a9f0: 20 63 3d 3d 27 64 27 20 26 26 20 73 74 72 63 6d   c=='d' && strcm
aa00: 70 28 7a 54 79 70 65 2c 22 64 6f 75 62 6c 65 22  p(zType,"double"
aa10: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
aa20: 20 20 64 6f 75 62 6c 65 20 72 3b 0a 20 20 20 20    double r;.    
aa30: 20 20 20 20 20 20 54 63 6c 5f 47 65 74 44 6f 75        Tcl_GetDou
aa40: 62 6c 65 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  bleFromObj(inter
aa50: 70 2c 20 70 56 61 72 2c 20 26 72 29 3b 0a 20 20  p, pVar, &r);.  
aa60: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
aa70: 62 69 6e 64 5f 64 6f 75 62 6c 65 28 70 53 74 6d  bind_double(pStm
aa80: 74 2c 20 69 2c 20 72 29 3b 0a 20 20 20 20 20 20  t, i, r);.      
aa90: 20 20 7d 65 6c 73 65 20 69 66 28 20 28 63 3d 3d    }else if( (c==
aaa0: 27 77 27 20 26 26 20 73 74 72 63 6d 70 28 7a 54  'w' && strcmp(zT
aab0: 79 70 65 2c 22 77 69 64 65 49 6e 74 22 29 3d 3d  ype,"wideInt")==
aac0: 30 29 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20  0) ||.          
aad0: 20 20 20 20 28 63 3d 3d 27 69 27 20 26 26 20 73      (c=='i' && s
aae0: 74 72 63 6d 70 28 7a 54 79 70 65 2c 22 69 6e 74  trcmp(zType,"int
aaf0: 22 29 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20 20  ")==0) ){.      
ab00: 20 20 20 20 54 63 6c 5f 57 69 64 65 49 6e 74 20      Tcl_WideInt 
ab10: 76 3b 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c  v;.          Tcl
ab20: 5f 47 65 74 57 69 64 65 49 6e 74 46 72 6f 6d 4f  _GetWideIntFromO
ab30: 62 6a 28 69 6e 74 65 72 70 2c 20 70 56 61 72 2c  bj(interp, pVar,
ab40: 20 26 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20   &v);.          
ab50: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
ab60: 36 34 28 70 53 74 6d 74 2c 20 69 2c 20 76 29 3b  64(pStmt, i, v);
ab70: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
ab80: 20 20 20 20 20 20 20 20 20 20 64 61 74 61 20 3d            data =
ab90: 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20   (unsigned char 
aba0: 2a 29 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  *)Tcl_GetStringF
abb0: 72 6f 6d 4f 62 6a 28 70 56 61 72 2c 20 26 6e 29  romObj(pVar, &n)
abc0: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
abd0: 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 53  te3_bind_text(pS
abe0: 74 6d 74 2c 20 69 2c 20 28 63 68 61 72 20 2a 29  tmt, i, (char *)
abf0: 64 61 74 61 2c 20 6e 2c 20 53 51 4c 49 54 45 5f  data, n, SQLITE_
ac00: 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 20  STATIC);.       
ac10: 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f     Tcl_IncrRefCo
ac20: 75 6e 74 28 70 56 61 72 29 3b 0a 20 20 20 20 20  unt(pVar);.     
ac30: 20 20 20 20 20 70 50 72 65 53 74 6d 74 2d 3e 61       pPreStmt->a
ac40: 70 50 61 72 6d 5b 69 50 61 72 6d 2b 2b 5d 20 3d  pParm[iParm++] =
ac50: 20 70 56 61 72 3b 0a 20 20 20 20 20 20 20 20 7d   pVar;.        }
ac60: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
ac70: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69        sqlite3_bi
ac80: 6e 64 5f 6e 75 6c 6c 28 70 53 74 6d 74 2c 20 69  nd_null(pStmt, i
ac90: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
aca0: 0a 20 20 7d 0a 20 20 70 50 72 65 53 74 6d 74 2d  .  }.  pPreStmt-
acb0: 3e 6e 50 61 72 6d 20 3d 20 69 50 61 72 6d 3b 0a  >nParm = iParm;.
acc0: 20 20 2a 70 70 50 72 65 53 74 6d 74 20 3d 20 70    *ppPreStmt = p
acd0: 50 72 65 53 74 6d 74 3b 0a 0a 20 20 72 65 74 75  PreStmt;..  retu
ace0: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
acf0: 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 73 74  .** Release a st
ad00: 61 74 65 6d 65 6e 74 20 72 65 66 65 72 65 6e 63  atement referenc
ad10: 65 20 6f 62 74 61 69 6e 65 64 20 62 79 20 63 61  e obtained by ca
ad20: 6c 6c 69 6e 67 20 64 62 50 72 65 70 61 72 65 41  lling dbPrepareA
ad30: 6e 64 42 69 6e 64 28 29 2e 0a 2a 2a 20 54 68 65  ndBind()..** The
ad40: 72 65 20 73 68 6f 75 6c 64 20 62 65 20 65 78 61  re should be exa
ad50: 63 74 6c 79 20 6f 6e 65 20 63 61 6c 6c 20 74 6f  ctly one call to
ad60: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 66   this function f
ad70: 6f 72 20 65 61 63 68 20 63 61 6c 6c 20 74 6f 0a  or each call to.
ad80: 2a 2a 20 64 62 50 72 65 70 61 72 65 41 6e 64 42  ** dbPrepareAndB
ad90: 69 6e 64 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ind()..**.** If 
ada0: 74 68 65 20 64 69 73 63 61 72 64 20 70 61 72 61  the discard para
adb0: 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72  meter is non-zer
adc0: 6f 2c 20 74 68 65 6e 20 74 68 65 20 73 74 61 74  o, then the stat
add0: 65 6d 65 6e 74 20 69 73 20 64 65 6c 65 74 65 64  ement is deleted
ade0: 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e  .** immediately.
adf0: 20 4f 74 68 65 72 77 69 73 65 20 69 74 20 69 73   Otherwise it is
ae00: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 4c 52   added to the LR
ae10: 55 20 6c 69 73 74 20 61 6e 64 20 6d 61 79 20 62  U list and may b
ae20: 65 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 62 79  e returned.** by
ae30: 20 61 20 73 75 62 73 65 71 75 65 6e 74 20 63 61   a subsequent ca
ae40: 6c 6c 20 74 6f 20 64 62 50 72 65 70 61 72 65 41  ll to dbPrepareA
ae50: 6e 64 42 69 6e 64 28 29 2e 0a 2a 2f 0a 73 74 61  ndBind()..*/.sta
ae60: 74 69 63 20 76 6f 69 64 20 64 62 52 65 6c 65 61  tic void dbRelea
ae70: 73 65 53 74 6d 74 28 0a 20 20 53 71 6c 69 74 65  seStmt(.  Sqlite
ae80: 44 62 20 2a 70 44 62 2c 20 20 20 20 20 20 20 20  Db *pDb,        
ae90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
aea0: 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a  abase handle */.
aeb0: 20 20 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d    SqlPreparedStm
aec0: 74 20 2a 70 50 72 65 53 74 6d 74 2c 20 20 20 20  t *pPreStmt,    
aed0: 20 20 2f 2a 20 50 72 65 70 61 72 65 64 20 73 74    /* Prepared st
aee0: 61 74 65 6d 65 6e 74 20 68 61 6e 64 6c 65 20 74  atement handle t
aef0: 6f 20 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 69  o release */.  i
af00: 6e 74 20 64 69 73 63 61 72 64 20 20 20 20 20 20  nt discard      
af10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
af20: 2a 20 54 72 75 65 20 74 6f 20 64 65 6c 65 74 65  * True to delete
af30: 20 28 6e 6f 74 20 63 61 63 68 65 29 20 74 68 65   (not cache) the
af40: 20 70 50 72 65 53 74 6d 74 20 2a 2f 0a 29 7b 0a   pPreStmt */.){.
af50: 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 46    int i;..  /* F
af60: 72 65 65 20 74 68 65 20 62 6f 75 6e 64 20 73 74  ree the bound st
af70: 72 69 6e 67 20 61 6e 64 20 62 6c 6f 62 20 70 61  ring and blob pa
af80: 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20 66 6f  rameters */.  fo
af90: 72 28 69 3d 30 3b 20 69 3c 70 50 72 65 53 74 6d  r(i=0; i<pPreStm
afa0: 74 2d 3e 6e 50 61 72 6d 3b 20 69 2b 2b 29 7b 0a  t->nParm; i++){.
afb0: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
afc0: 6f 75 6e 74 28 70 50 72 65 53 74 6d 74 2d 3e 61  ount(pPreStmt->a
afd0: 70 50 61 72 6d 5b 69 5d 29 3b 0a 20 20 7d 0a 20  pParm[i]);.  }. 
afe0: 20 70 50 72 65 53 74 6d 74 2d 3e 6e 50 61 72 6d   pPreStmt->nParm
aff0: 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70 44 62   = 0;..  if( pDb
b000: 2d 3e 6d 61 78 53 74 6d 74 3c 3d 30 20 7c 7c 20  ->maxStmt<=0 || 
b010: 64 69 73 63 61 72 64 20 29 7b 0a 20 20 20 20 2f  discard ){.    /
b020: 2a 20 49 66 20 74 68 65 20 63 61 63 68 65 20 69  * If the cache i
b030: 73 20 74 75 72 6e 65 64 20 6f 66 66 2c 20 64 65  s turned off, de
b040: 61 6c 6c 6f 63 61 74 65 64 20 74 68 65 20 73 74  allocated the st
b050: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 64  atement */.    d
b060: 62 46 72 65 65 53 74 6d 74 28 70 50 72 65 53 74  bFreeStmt(pPreSt
b070: 6d 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  mt);.  }else{.  
b080: 20 20 2f 2a 20 41 64 64 20 74 68 65 20 70 72 65    /* Add the pre
b090: 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20  pared statement 
b0a0: 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  to the beginning
b0b0: 20 6f 66 20 74 68 65 20 63 61 63 68 65 20 6c 69   of the cache li
b0c0: 73 74 2e 20 2a 2f 0a 20 20 20 20 70 50 72 65 53  st. */.    pPreS
b0d0: 74 6d 74 2d 3e 70 4e 65 78 74 20 3d 20 70 44 62  tmt->pNext = pDb
b0e0: 2d 3e 73 74 6d 74 4c 69 73 74 3b 0a 20 20 20 20  ->stmtList;.    
b0f0: 70 50 72 65 53 74 6d 74 2d 3e 70 50 72 65 76 20  pPreStmt->pPrev 
b100: 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 44 62  = 0;.    if( pDb
b110: 2d 3e 73 74 6d 74 4c 69 73 74 20 29 7b 0a 20 20  ->stmtList ){.  
b120: 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74     pDb->stmtList
b130: 2d 3e 70 50 72 65 76 20 3d 20 70 50 72 65 53 74  ->pPrev = pPreSt
b140: 6d 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 44  mt;.    }.    pD
b150: 62 2d 3e 73 74 6d 74 4c 69 73 74 20 3d 20 70 50  b->stmtList = pP
b160: 72 65 53 74 6d 74 3b 0a 20 20 20 20 69 66 28 20  reStmt;.    if( 
b170: 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74 3d 3d 30  pDb->stmtLast==0
b180: 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
b190: 28 20 70 44 62 2d 3e 6e 53 74 6d 74 3d 3d 30 20  ( pDb->nStmt==0 
b1a0: 29 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e 73 74  );.      pDb->st
b1b0: 6d 74 4c 61 73 74 20 3d 20 70 50 72 65 53 74 6d  mtLast = pPreStm
b1c0: 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  t;.    }else{.  
b1d0: 20 20 20 20 61 73 73 65 72 74 28 20 70 44 62 2d      assert( pDb-
b1e0: 3e 6e 53 74 6d 74 3e 30 20 29 3b 0a 20 20 20 20  >nStmt>0 );.    
b1f0: 7d 0a 20 20 20 20 70 44 62 2d 3e 6e 53 74 6d 74  }.    pDb->nStmt
b200: 2b 2b 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 77  ++;..    /* If w
b210: 65 20 68 61 76 65 20 74 6f 6f 20 6d 61 6e 79 20  e have too many 
b220: 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 63 61 63  statement in cac
b230: 68 65 2c 20 72 65 6d 6f 76 65 20 74 68 65 20 73  he, remove the s
b240: 75 72 70 6c 75 73 20 66 72 6f 6d 0a 20 20 20 20  urplus from.    
b250: 2a 2a 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  ** the end of th
b260: 65 20 63 61 63 68 65 20 6c 69 73 74 2e 20 20 2a  e cache list.  *
b270: 2f 0a 20 20 20 20 77 68 69 6c 65 28 20 70 44 62  /.    while( pDb
b280: 2d 3e 6e 53 74 6d 74 3e 70 44 62 2d 3e 6d 61 78  ->nStmt>pDb->max
b290: 53 74 6d 74 20 29 7b 0a 20 20 20 20 20 20 53 71  Stmt ){.      Sq
b2a0: 6c 50 72 65 70 61 72 65 64 53 74 6d 74 20 2a 70  lPreparedStmt *p
b2b0: 4c 61 73 74 20 3d 20 70 44 62 2d 3e 73 74 6d 74  Last = pDb->stmt
b2c0: 4c 61 73 74 3b 0a 20 20 20 20 20 20 70 44 62 2d  Last;.      pDb-
b2d0: 3e 73 74 6d 74 4c 61 73 74 20 3d 20 70 4c 61 73  >stmtLast = pLas
b2e0: 74 2d 3e 70 50 72 65 76 3b 0a 20 20 20 20 20 20  t->pPrev;.      
b2f0: 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74 2d 3e 70  pDb->stmtLast->p
b300: 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Next = 0;.      
b310: 70 44 62 2d 3e 6e 53 74 6d 74 2d 2d 3b 0a 20 20  pDb->nStmt--;.  
b320: 20 20 20 20 64 62 46 72 65 65 53 74 6d 74 28 70      dbFreeStmt(p
b330: 4c 61 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Last);.    }.  }
b340: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 72 75 63 74  .}../*.** Struct
b350: 75 72 65 20 75 73 65 64 20 77 69 74 68 20 64 62  ure used with db
b360: 45 76 61 6c 58 58 58 28 29 20 66 75 6e 63 74 69  EvalXXX() functi
b370: 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 64 62 45  ons:.**.**   dbE
b380: 76 61 6c 49 6e 69 74 28 29 0a 2a 2a 20 20 20 64  valInit().**   d
b390: 62 45 76 61 6c 53 74 65 70 28 29 0a 2a 2a 20 20  bEvalStep().**  
b3a0: 20 64 62 45 76 61 6c 46 69 6e 61 6c 69 7a 65 28   dbEvalFinalize(
b3b0: 29 0a 2a 2a 20 20 20 64 62 45 76 61 6c 52 6f 77  ).**   dbEvalRow
b3c0: 49 6e 66 6f 28 29 0a 2a 2a 20 20 20 64 62 45 76  Info().**   dbEv
b3d0: 61 6c 43 6f 6c 75 6d 6e 56 61 6c 75 65 28 29 0a  alColumnValue().
b3e0: 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
b3f0: 74 20 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 20  t DbEvalContext 
b400: 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 3b 0a 73  DbEvalContext;.s
b410: 74 72 75 63 74 20 44 62 45 76 61 6c 43 6f 6e 74  truct DbEvalCont
b420: 65 78 74 20 7b 0a 20 20 53 71 6c 69 74 65 44 62  ext {.  SqliteDb
b430: 20 2a 70 44 62 3b 20 20 20 20 20 20 20 20 20 20   *pDb;          
b440: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
b450: 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ase handle */.  
b460: 54 63 6c 5f 4f 62 6a 20 2a 70 53 71 6c 3b 20 20  Tcl_Obj *pSql;  
b470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b480: 2f 2a 20 4f 62 6a 65 63 74 20 68 6f 6c 64 69 6e  /* Object holdin
b490: 67 20 73 74 72 69 6e 67 20 7a 53 71 6c 20 2a 2f  g string zSql */
b4a0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
b4b0: 53 71 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Sql;            
b4c0: 20 20 20 2f 2a 20 52 65 6d 61 69 6e 69 6e 67 20     /* Remaining 
b4d0: 53 51 4c 20 74 6f 20 65 78 65 63 75 74 65 20 2a  SQL to execute *
b4e0: 2f 0a 20 20 53 71 6c 50 72 65 70 61 72 65 64 53  /.  SqlPreparedS
b4f0: 74 6d 74 20 2a 70 50 72 65 53 74 6d 74 3b 20 20  tmt *pPreStmt;  
b500: 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 73      /* Current s
b510: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e  tatement */.  in
b520: 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20 20  t nCol;         
b530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b540: 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   Number of colum
b550: 6e 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 70  ns returned by p
b560: 53 74 6d 74 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62  Stmt */.  Tcl_Ob
b570: 6a 20 2a 70 41 72 72 61 79 3b 20 20 20 20 20 20  j *pArray;      
b580: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
b590: 65 20 6f 66 20 61 72 72 61 79 20 76 61 72 69 61  e of array varia
b5a0: 62 6c 65 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a  ble */.  Tcl_Obj
b5b0: 20 2a 2a 61 70 43 6f 6c 4e 61 6d 65 3b 20 20 20   **apColName;   
b5c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61           /* Arra
b5d0: 79 20 6f 66 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  y of column name
b5e0: 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 52  s */.};../*.** R
b5f0: 65 6c 65 61 73 65 20 61 6e 79 20 63 61 63 68 65  elease any cache
b600: 20 6f 66 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73   of column names
b610: 20 63 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 20   currently held 
b620: 61 73 20 70 61 72 74 20 6f 66 0a 2a 2a 20 74 68  as part of.** th
b630: 65 20 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 20  e DbEvalContext 
b640: 73 74 72 75 63 74 75 72 65 20 70 61 73 73 65 64  structure passed
b650: 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
b660: 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  gument..*/.stati
b670: 63 20 76 6f 69 64 20 64 62 52 65 6c 65 61 73 65  c void dbRelease
b680: 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 44 62 45 76  ColumnNames(DbEv
b690: 61 6c 43 6f 6e 74 65 78 74 20 2a 70 29 7b 0a 20  alContext *p){. 
b6a0: 20 69 66 28 20 70 2d 3e 61 70 43 6f 6c 4e 61 6d   if( p->apColNam
b6b0: 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  e ){.    int i;.
b6c0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
b6d0: 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  ->nCol; i++){.  
b6e0: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
b6f0: 6f 75 6e 74 28 70 2d 3e 61 70 43 6f 6c 4e 61 6d  ount(p->apColNam
b700: 65 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20  e[i]);.    }.   
b710: 20 54 63 6c 5f 46 72 65 65 28 28 63 68 61 72 20   Tcl_Free((char 
b720: 2a 29 70 2d 3e 61 70 43 6f 6c 4e 61 6d 65 29 3b  *)p->apColName);
b730: 0a 20 20 20 20 70 2d 3e 61 70 43 6f 6c 4e 61 6d  .    p->apColNam
b740: 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 2d 3e  e = 0;.  }.  p->
b750: 6e 43 6f 6c 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  nCol = 0;.}../*.
b760: 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 20  ** Initialize a 
b770: 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 20 73 74  DbEvalContext st
b780: 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49  ructure..**.** I
b790: 66 20 70 41 72 72 61 79 20 69 73 20 6e 6f 74 20  f pArray is not 
b7a0: 4e 55 4c 4c 2c 20 74 68 65 6e 20 69 74 20 63 6f  NULL, then it co
b7b0: 6e 74 61 69 6e 73 20 74 68 65 20 6e 61 6d 65 20  ntains the name 
b7c0: 6f 66 20 61 20 54 63 6c 20 61 72 72 61 79 0a 2a  of a Tcl array.*
b7d0: 2a 20 76 61 72 69 61 62 6c 65 2e 20 54 68 65 20  * variable. The 
b7e0: 22 2a 22 20 6d 65 6d 62 65 72 20 6f 66 20 74 68  "*" member of th
b7f0: 69 73 20 61 72 72 61 79 20 69 73 20 73 65 74 20  is array is set 
b800: 74 6f 20 61 20 6c 69 73 74 20 63 6f 6e 74 61 69  to a list contai
b810: 6e 69 6e 67 0a 2a 2a 20 74 68 65 20 6e 61 6d 65  ning.** the name
b820: 73 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73  s of the columns
b830: 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65   returned by the
b840: 20 73 74 61 74 65 6d 65 6e 74 20 61 73 20 70 61   statement as pa
b850: 72 74 20 6f 66 20 65 61 63 68 0a 2a 2a 20 63 61  rt of each.** ca
b860: 6c 6c 20 74 6f 20 64 62 45 76 61 6c 53 74 65 70  ll to dbEvalStep
b870: 28 29 2c 20 69 6e 20 6f 72 64 65 72 20 66 72 6f  (), in order fro
b880: 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74 2e  m left to right.
b890: 20 65 2e 67 2e 20 69 66 20 74 68 65 20 6e 61 6d   e.g. if the nam
b8a0: 65 73 0a 2a 2a 20 6f 66 20 74 68 65 20 72 65 74  es.** of the ret
b8b0: 75 72 6e 65 64 20 63 6f 6c 75 6d 6e 73 20 61 72  urned columns ar
b8c0: 65 20 61 2c 20 62 20 61 6e 64 20 63 2c 20 69 74  e a, b and c, it
b8d0: 20 64 6f 65 73 20 74 68 65 20 65 71 75 69 76 61   does the equiva
b8e0: 6c 65 6e 74 20 6f 66 20 74 68 65 0a 2a 2a 20 74  lent of the.** t
b8f0: 63 6c 20 63 6f 6d 6d 61 6e 64 3a 0a 2a 2a 0a 2a  cl command:.**.*
b900: 2a 20 20 20 20 20 73 65 74 20 24 7b 70 41 72 72  *     set ${pArr
b910: 61 79 7d 28 2a 29 20 7b 61 20 62 20 63 7d 0a 2a  ay}(*) {a b c}.*
b920: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 62  /.static void db
b930: 45 76 61 6c 49 6e 69 74 28 0a 20 20 44 62 45 76  EvalInit(.  DbEv
b940: 61 6c 43 6f 6e 74 65 78 74 20 2a 70 2c 20 20 20  alContext *p,   
b950: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
b960: 6f 69 6e 74 65 72 20 74 6f 20 73 74 72 75 63 74  ointer to struct
b970: 75 72 65 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a  ure to initializ
b980: 65 20 2a 2f 0a 20 20 53 71 6c 69 74 65 44 62 20  e */.  SqliteDb 
b990: 2a 70 44 62 2c 20 20 20 20 20 20 20 20 20 20 20  *pDb,           
b9a0: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
b9b0: 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 54  se handle */.  T
b9c0: 63 6c 5f 4f 62 6a 20 2a 70 53 71 6c 2c 20 20 20  cl_Obj *pSql,   
b9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
b9e0: 2a 20 4f 62 6a 65 63 74 20 63 6f 6e 74 61 69 6e  * Object contain
b9f0: 69 6e 67 20 53 51 4c 20 73 63 72 69 70 74 20 2a  ing SQL script *
ba00: 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 41 72  /.  Tcl_Obj *pAr
ba10: 72 61 79 20 20 20 20 20 20 20 20 20 20 20 20 20  ray             
ba20: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 54      /* Name of T
ba30: 63 6c 20 61 72 72 61 79 20 74 6f 20 73 65 74 20  cl array to set 
ba40: 28 2a 29 20 65 6c 65 6d 65 6e 74 20 6f 66 20 2a  (*) element of *
ba50: 2f 0a 29 7b 0a 20 20 6d 65 6d 73 65 74 28 70 2c  /.){.  memset(p,
ba60: 20 30 2c 20 73 69 7a 65 6f 66 28 44 62 45 76 61   0, sizeof(DbEva
ba70: 6c 43 6f 6e 74 65 78 74 29 29 3b 0a 20 20 70 2d  lContext));.  p-
ba80: 3e 70 44 62 20 3d 20 70 44 62 3b 0a 20 20 70 2d  >pDb = pDb;.  p-
ba90: 3e 7a 53 71 6c 20 3d 20 54 63 6c 5f 47 65 74 53  >zSql = Tcl_GetS
baa0: 74 72 69 6e 67 28 70 53 71 6c 29 3b 0a 20 20 70  tring(pSql);.  p
bab0: 2d 3e 70 53 71 6c 20 3d 20 70 53 71 6c 3b 0a 20  ->pSql = pSql;. 
bac0: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
bad0: 74 28 70 53 71 6c 29 3b 0a 20 20 69 66 28 20 70  t(pSql);.  if( p
bae0: 41 72 72 61 79 20 29 7b 0a 20 20 20 20 70 2d 3e  Array ){.    p->
baf0: 70 41 72 72 61 79 20 3d 20 70 41 72 72 61 79 3b  pArray = pArray;
bb00: 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66  .    Tcl_IncrRef
bb10: 43 6f 75 6e 74 28 70 41 72 72 61 79 29 3b 0a 20  Count(pArray);. 
bb20: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 62 74 61   }.}../*.** Obta
bb30: 69 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  in information a
bb40: 62 6f 75 74 20 74 68 65 20 72 6f 77 20 74 68 61  bout the row tha
bb50: 74 20 74 68 65 20 44 62 45 76 61 6c 43 6f 6e 74  t the DbEvalCont
bb60: 65 78 74 20 70 61 73 73 65 64 20 61 73 20 74 68  ext passed as th
bb70: 65 0a 2a 2a 20 66 69 72 73 74 20 61 72 67 75 6d  e.** first argum
bb80: 65 6e 74 20 63 75 72 72 65 6e 74 6c 79 20 70 6f  ent currently po
bb90: 69 6e 74 73 20 74 6f 2e 0a 2a 2f 0a 73 74 61 74  ints to..*/.stat
bba0: 69 63 20 76 6f 69 64 20 64 62 45 76 61 6c 52 6f  ic void dbEvalRo
bbb0: 77 49 6e 66 6f 28 0a 20 20 44 62 45 76 61 6c 43  wInfo(.  DbEvalC
bbc0: 6f 6e 74 65 78 74 20 2a 70 2c 20 20 20 20 20 20  ontext *p,      
bbd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 76 61 6c           /* Eval
bbe0: 75 61 74 69 6f 6e 20 63 6f 6e 74 65 78 74 20 2a  uation context *
bbf0: 2f 0a 20 20 69 6e 74 20 2a 70 6e 43 6f 6c 2c 20  /.  int *pnCol, 
bc00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bc10: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 75 6d 62      /* OUT: Numb
bc20: 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 20 6e 61 6d  er of column nam
bc30: 65 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  es */.  Tcl_Obj 
bc40: 2a 2a 2a 70 61 70 43 6f 6c 4e 61 6d 65 20 20 20  ***papColName   
bc50: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
bc60: 41 72 72 61 79 20 6f 66 20 63 6f 6c 75 6d 6e 20  Array of column 
bc70: 6e 61 6d 65 73 20 2a 2f 0a 29 7b 0a 20 20 2f 2a  names */.){.  /*
bc80: 20 43 6f 6d 70 75 74 65 20 63 6f 6c 75 6d 6e 20   Compute column 
bc90: 6e 61 6d 65 73 20 2a 2f 0a 20 20 69 66 28 20 30  names */.  if( 0
bca0: 3d 3d 70 2d 3e 61 70 43 6f 6c 4e 61 6d 65 20 29  ==p->apColName )
bcb0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74  {.    sqlite3_st
bcc0: 6d 74 20 2a 70 53 74 6d 74 20 3d 20 70 2d 3e 70  mt *pStmt = p->p
bcd0: 50 72 65 53 74 6d 74 2d 3e 70 53 74 6d 74 3b 0a  PreStmt->pStmt;.
bce0: 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20      int i;      
bcf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bd00: 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 61    /* Iterator va
bd10: 72 69 61 62 6c 65 20 2a 2f 0a 20 20 20 20 69 6e  riable */.    in
bd20: 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20 20  t nCol;         
bd30: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
bd40: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
bd50: 20 72 65 74 75 72 6e 65 64 20 62 79 20 70 53 74   returned by pSt
bd60: 6d 74 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62  mt */.    Tcl_Ob
bd70: 6a 20 2a 2a 61 70 43 6f 6c 4e 61 6d 65 20 3d 20  j **apColName = 
bd80: 30 3b 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79  0;      /* Array
bd90: 20 6f 66 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73   of column names
bda0: 20 2a 2f 0a 0a 20 20 20 20 70 2d 3e 6e 43 6f 6c   */..    p->nCol
bdb0: 20 3d 20 6e 43 6f 6c 20 3d 20 73 71 6c 69 74 65   = nCol = sqlite
bdc0: 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70  3_column_count(p
bdd0: 53 74 6d 74 29 3b 0a 20 20 20 20 69 66 28 20 6e  Stmt);.    if( n
bde0: 43 6f 6c 3e 30 20 26 26 20 28 70 61 70 43 6f 6c  Col>0 && (papCol
bdf0: 4e 61 6d 65 20 7c 7c 20 70 2d 3e 70 41 72 72 61  Name || p->pArra
be00: 79 29 20 29 7b 0a 20 20 20 20 20 20 61 70 43 6f  y) ){.      apCo
be10: 6c 4e 61 6d 65 20 3d 20 28 54 63 6c 5f 4f 62 6a  lName = (Tcl_Obj
be20: 2a 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28 20 73 69  **)Tcl_Alloc( si
be30: 7a 65 6f 66 28 54 63 6c 5f 4f 62 6a 2a 29 2a 6e  zeof(Tcl_Obj*)*n
be40: 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20 66 6f 72  Col );.      for
be50: 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b  (i=0; i<nCol; i+
be60: 2b 29 7b 0a 20 20 20 20 20 20 20 20 61 70 43 6f  +){.        apCo
be70: 6c 4e 61 6d 65 5b 69 5d 20 3d 20 54 63 6c 5f 4e  lName[i] = Tcl_N
be80: 65 77 53 74 72 69 6e 67 4f 62 6a 28 73 71 6c 69  ewStringObj(sqli
be90: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 28  te3_column_name(
bea0: 70 53 74 6d 74 2c 69 29 2c 20 2d 31 29 3b 0a 20  pStmt,i), -1);. 
beb0: 20 20 20 20 20 20 20 54 63 6c 5f 49 6e 63 72 52         Tcl_IncrR
bec0: 65 66 43 6f 75 6e 74 28 61 70 43 6f 6c 4e 61 6d  efCount(apColNam
bed0: 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  e[i]);.      }. 
bee0: 20 20 20 20 20 70 2d 3e 61 70 43 6f 6c 4e 61 6d       p->apColNam
bef0: 65 20 3d 20 61 70 43 6f 6c 4e 61 6d 65 3b 0a 20  e = apColName;. 
bf00: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
bf10: 72 65 73 75 6c 74 73 20 61 72 65 20 62 65 69 6e  results are bein
bf20: 67 20 73 74 6f 72 65 64 20 69 6e 20 61 6e 20 61  g stored in an a
bf30: 72 72 61 79 20 76 61 72 69 61 62 6c 65 2c 20 74  rray variable, t
bf40: 68 65 6e 20 63 72 65 61 74 65 0a 20 20 20 20 2a  hen create.    *
bf50: 2a 20 74 68 65 20 61 72 72 61 79 28 2a 29 20 65  * the array(*) e
bf60: 6e 74 72 79 20 66 6f 72 20 74 68 61 74 20 61 72  ntry for that ar
bf70: 72 61 79 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ray.    */.    i
bf80: 66 28 20 70 2d 3e 70 41 72 72 61 79 20 29 7b 0a  f( p->pArray ){.
bf90: 20 20 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70        Tcl_Interp
bfa0: 20 2a 69 6e 74 65 72 70 20 3d 20 70 2d 3e 70 44   *interp = p->pD
bfb0: 62 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 20  b->interp;.     
bfc0: 20 54 63 6c 5f 4f 62 6a 20 2a 70 43 6f 6c 4c 69   Tcl_Obj *pColLi
bfd0: 73 74 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a 28  st = Tcl_NewObj(
bfe0: 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a  );.      Tcl_Obj
bff0: 20 2a 70 53 74 61 72 20 3d 20 54 63 6c 5f 4e 65   *pStar = Tcl_Ne
c000: 77 53 74 72 69 6e 67 4f 62 6a 28 22 2a 22 2c 20  wStringObj("*", 
c010: 2d 31 29 3b 0a 0a 20 20 20 20 20 20 66 6f 72 28  -1);..      for(
c020: 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b  i=0; i<nCol; i++
c030: 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 4c  ){.        Tcl_L
c040: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
c050: 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 43 6f 6c  ent(interp, pCol
c060: 4c 69 73 74 2c 20 61 70 43 6f 6c 4e 61 6d 65 5b  List, apColName[
c070: 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  i]);.      }.   
c080: 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f     Tcl_IncrRefCo
c090: 75 6e 74 28 70 53 74 61 72 29 3b 0a 20 20 20 20  unt(pStar);.    
c0a0: 20 20 54 63 6c 5f 4f 62 6a 53 65 74 56 61 72 32    Tcl_ObjSetVar2
c0b0: 28 69 6e 74 65 72 70 2c 20 70 2d 3e 70 41 72 72  (interp, p->pArr
c0c0: 61 79 2c 20 70 53 74 61 72 2c 20 70 43 6f 6c 4c  ay, pStar, pColL
c0d0: 69 73 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 54  ist, 0);.      T
c0e0: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
c0f0: 70 53 74 61 72 29 3b 0a 20 20 20 20 7d 0a 20 20  pStar);.    }.  
c100: 7d 0a 0a 20 20 69 66 28 20 70 61 70 43 6f 6c 4e  }..  if( papColN
c110: 61 6d 65 20 29 7b 0a 20 20 20 20 2a 70 61 70 43  ame ){.    *papC
c120: 6f 6c 4e 61 6d 65 20 3d 20 70 2d 3e 61 70 43 6f  olName = p->apCo
c130: 6c 4e 61 6d 65 3b 0a 20 20 7d 0a 20 20 69 66 28  lName;.  }.  if(
c140: 20 70 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 2a 70   pnCol ){.    *p
c150: 6e 43 6f 6c 20 3d 20 70 2d 3e 6e 43 6f 6c 3b 0a  nCol = p->nCol;.
c160: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74    }.}../*.** Ret
c170: 75 72 6e 20 6f 6e 65 20 6f 66 20 54 43 4c 5f 4f  urn one of TCL_O
c180: 4b 2c 20 54 43 4c 5f 42 52 45 41 4b 20 6f 72 20  K, TCL_BREAK or 
c190: 54 43 4c 5f 45 52 52 4f 52 2e 20 49 66 20 54 43  TCL_ERROR. If TC
c1a0: 4c 5f 45 52 52 4f 52 20 69 73 0a 2a 2a 20 72 65  L_ERROR is.** re
c1b0: 74 75 72 6e 65 64 2c 20 74 68 65 6e 20 61 6e 20  turned, then an 
c1c0: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73  error message is
c1d0: 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 69   stored in the i
c1e0: 6e 74 65 72 70 72 65 74 65 72 20 62 65 66 6f 72  nterpreter befor
c1f0: 65 0a 2a 2a 20 72 65 74 75 72 6e 69 6e 67 2e 0a  e.** returning..
c200: 2a 2a 0a 2a 2a 20 41 20 72 65 74 75 72 6e 20 76  **.** A return v
c210: 61 6c 75 65 20 6f 66 20 54 43 4c 5f 4f 4b 20 6d  alue of TCL_OK m
c220: 65 61 6e 73 20 74 68 65 72 65 20 69 73 20 61 20  eans there is a 
c230: 72 6f 77 20 6f 66 20 64 61 74 61 20 61 76 61 69  row of data avai
c240: 6c 61 62 6c 65 2e 20 54 68 65 0a 2a 2a 20 64 61  lable. The.** da
c250: 74 61 20 6d 61 79 20 62 65 20 61 63 63 65 73 73  ta may be access
c260: 65 64 20 75 73 69 6e 67 20 64 62 45 76 61 6c 52  ed using dbEvalR
c270: 6f 77 49 6e 66 6f 28 29 20 61 6e 64 20 64 62 45  owInfo() and dbE
c280: 76 61 6c 43 6f 6c 75 6d 6e 56 61 6c 75 65 28 29  valColumnValue()
c290: 2e 20 54 68 69 73 0a 2a 2a 20 69 73 20 61 6e 61  . This.** is ana
c2a0: 6c 6f 67 6f 75 73 20 74 6f 20 61 20 72 65 74 75  logous to a retu
c2b0: 72 6e 20 6f 66 20 53 51 4c 49 54 45 5f 52 4f 57  rn of SQLITE_ROW
c2c0: 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 73 74   from sqlite3_st
c2d0: 65 70 28 29 2e 20 49 66 20 54 43 4c 5f 42 52 45  ep(). If TCL_BRE
c2e0: 41 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65  AK.** is returne
c2f0: 64 2c 20 74 68 65 6e 20 74 68 65 20 53 51 4c 20  d, then the SQL 
c300: 73 63 72 69 70 74 20 68 61 73 20 66 69 6e 69 73  script has finis
c310: 68 65 64 20 65 78 65 63 75 74 69 6e 67 20 61 6e  hed executing an
c320: 64 20 74 68 65 72 65 20 61 72 65 0a 2a 2a 20 6e  d there are.** n
c330: 6f 20 66 75 72 74 68 65 72 20 72 6f 77 73 20 61  o further rows a
c340: 76 61 69 6c 61 62 6c 65 2e 20 54 68 69 73 20 69  vailable. This i
c350: 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 53 51 4c  s similar to SQL
c360: 49 54 45 5f 44 4f 4e 45 2e 0a 2a 2f 0a 73 74 61  ITE_DONE..*/.sta
c370: 74 69 63 20 69 6e 74 20 64 62 45 76 61 6c 53 74  tic int dbEvalSt
c380: 65 70 28 44 62 45 76 61 6c 43 6f 6e 74 65 78 74  ep(DbEvalContext
c390: 20 2a 70 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68   *p){.  const ch
c3a0: 61 72 20 2a 7a 50 72 65 76 53 71 6c 20 3d 20 30  ar *zPrevSql = 0
c3b0: 3b 20 20 20 20 20 20 20 2f 2a 20 50 72 65 76 69  ;       /* Previ
c3c0: 6f 75 73 20 76 61 6c 75 65 20 6f 66 20 70 2d 3e  ous value of p->
c3d0: 7a 53 71 6c 20 2a 2f 0a 0a 20 20 77 68 69 6c 65  zSql */..  while
c3e0: 28 20 70 2d 3e 7a 53 71 6c 5b 30 5d 20 7c 7c 20  ( p->zSql[0] || 
c3f0: 70 2d 3e 70 50 72 65 53 74 6d 74 20 29 7b 0a 20  p->pPreStmt ){. 
c400: 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 69     int rc;.    i
c410: 66 28 20 70 2d 3e 70 50 72 65 53 74 6d 74 3d 3d  f( p->pPreStmt==
c420: 30 20 29 7b 0a 20 20 20 20 20 20 7a 50 72 65 76  0 ){.      zPrev
c430: 53 71 6c 20 3d 20 28 70 2d 3e 7a 53 71 6c 3d 3d  Sql = (p->zSql==
c440: 7a 50 72 65 76 53 71 6c 20 3f 20 30 20 3a 20 70  zPrevSql ? 0 : p
c450: 2d 3e 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 72  ->zSql);.      r
c460: 63 20 3d 20 64 62 50 72 65 70 61 72 65 41 6e 64  c = dbPrepareAnd
c470: 42 69 6e 64 28 70 2d 3e 70 44 62 2c 20 70 2d 3e  Bind(p->pDb, p->
c480: 7a 53 71 6c 2c 20 26 70 2d 3e 7a 53 71 6c 2c 20  zSql, &p->zSql, 
c490: 26 70 2d 3e 70 50 72 65 53 74 6d 74 29 3b 0a 20  &p->pPreStmt);. 
c4a0: 20 20 20 20 20 69 66 28 20 72 63 21 3d 54 43 4c       if( rc!=TCL
c4b0: 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
c4c0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
c4d0: 20 20 69 6e 74 20 72 63 73 3b 0a 20 20 20 20 20    int rcs;.     
c4e0: 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d   SqliteDb *pDb =
c4f0: 20 70 2d 3e 70 44 62 3b 0a 20 20 20 20 20 20 53   p->pDb;.      S
c500: 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74 20 2a  qlPreparedStmt *
c510: 70 50 72 65 53 74 6d 74 20 3d 20 70 2d 3e 70 50  pPreStmt = p->pP
c520: 72 65 53 74 6d 74 3b 0a 20 20 20 20 20 20 73 71  reStmt;.      sq
c530: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
c540: 74 20 3d 20 70 50 72 65 53 74 6d 74 2d 3e 70 53  t = pPreStmt->pS
c550: 74 6d 74 3b 0a 0a 20 20 20 20 20 20 72 63 73 20  tmt;..      rcs 
c560: 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  = sqlite3_step(p
c570: 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 69 66 28  Stmt);.      if(
c580: 20 72 63 73 3d 3d 53 51 4c 49 54 45 5f 52 4f 57   rcs==SQLITE_ROW
c590: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
c5a0: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 20  rn TCL_OK;.     
c5b0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e   }.      if( p->
c5c0: 70 41 72 72 61 79 20 29 7b 0a 20 20 20 20 20 20  pArray ){.      
c5d0: 20 20 64 62 45 76 61 6c 52 6f 77 49 6e 66 6f 28    dbEvalRowInfo(
c5e0: 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  p, 0, 0);.      
c5f0: 7d 0a 20 20 20 20 20 20 72 63 73 20 3d 20 73 71  }.      rcs = sq
c600: 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53 74 6d  lite3_reset(pStm
c610: 74 29 3b 0a 0a 20 20 20 20 20 20 70 44 62 2d 3e  t);..      pDb->
c620: 6e 53 74 65 70 20 3d 20 73 71 6c 69 74 65 33 5f  nStep = sqlite3_
c630: 73 74 6d 74 5f 73 74 61 74 75 73 28 70 53 74 6d  stmt_status(pStm
c640: 74 2c 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41  t,SQLITE_STMTSTA
c650: 54 55 53 5f 46 55 4c 4c 53 43 41 4e 5f 53 54 45  TUS_FULLSCAN_STE
c660: 50 2c 31 29 3b 0a 20 20 20 20 20 20 70 44 62 2d  P,1);.      pDb-
c670: 3e 6e 53 6f 72 74 20 3d 20 73 71 6c 69 74 65 33  >nSort = sqlite3
c680: 5f 73 74 6d 74 5f 73 74 61 74 75 73 28 70 53 74  _stmt_status(pSt
c690: 6d 74 2c 53 51 4c 49 54 45 5f 53 54 4d 54 53 54  mt,SQLITE_STMTST
c6a0: 41 54 55 53 5f 53 4f 52 54 2c 31 29 3b 0a 20 20  ATUS_SORT,1);.  
c6b0: 20 20 20 20 70 44 62 2d 3e 6e 49 6e 64 65 78 20      pDb->nIndex 
c6c0: 3d 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73  = sqlite3_stmt_s
c6d0: 74 61 74 75 73 28 70 53 74 6d 74 2c 53 51 4c 49  tatus(pStmt,SQLI
c6e0: 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 41 55  TE_STMTSTATUS_AU
c6f0: 54 4f 49 4e 44 45 58 2c 31 29 3b 0a 20 20 20 20  TOINDEX,1);.    
c700: 20 20 64 62 52 65 6c 65 61 73 65 43 6f 6c 75 6d    dbReleaseColum
c710: 6e 4e 61 6d 65 73 28 70 29 3b 0a 20 20 20 20 20  nNames(p);.     
c720: 20 70 2d 3e 70 50 72 65 53 74 6d 74 20 3d 20 30   p->pPreStmt = 0
c730: 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 72 63 73  ;..      if( rcs
c740: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
c750: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 20 72         /* If a r
c760: 75 6e 2d 74 69 6d 65 20 65 72 72 6f 72 20 6f 63  un-time error oc
c770: 63 75 72 73 2c 20 72 65 70 6f 72 74 20 74 68 65  curs, report the
c780: 20 65 72 72 6f 72 20 61 6e 64 20 73 74 6f 70 20   error and stop 
c790: 72 65 61 64 69 6e 67 0a 20 20 20 20 20 20 20 20  reading.        
c7a0: 2a 2a 20 74 68 65 20 53 51 4c 2e 20 20 2a 2f 0a  ** the SQL.  */.
c7b0: 20 20 20 20 20 20 20 20 64 62 52 65 6c 65 61 73          dbReleas
c7c0: 65 53 74 6d 74 28 70 44 62 2c 20 70 50 72 65 53  eStmt(pDb, pPreS
c7d0: 74 6d 74 2c 20 31 29 3b 0a 23 69 66 20 53 51 4c  tmt, 1);.#if SQL
c7e0: 49 54 45 5f 54 45 53 54 0a 20 20 20 20 20 20 20  ITE_TEST.       
c7f0: 20 69 66 28 20 70 2d 3e 70 44 62 2d 3e 62 4c 65   if( p->pDb->bLe
c800: 67 61 63 79 50 72 65 70 61 72 65 20 26 26 20 72  gacyPrepare && r
c810: 63 73 3d 3d 53 51 4c 49 54 45 5f 53 43 48 45 4d  cs==SQLITE_SCHEM
c820: 41 20 26 26 20 7a 50 72 65 76 53 71 6c 20 29 7b  A && zPrevSql ){
c830: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66  .          /* If
c840: 20 74 68 65 20 72 75 6e 74 69 6d 65 20 65 72 72   the runtime err
c850: 6f 72 20 77 61 73 20 61 6e 20 53 51 4c 49 54 45  or was an SQLITE
c860: 5f 53 43 48 45 4d 41 2c 20 61 6e 64 20 74 68 65  _SCHEMA, and the
c870: 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 20 20   database.      
c880: 20 20 20 20 2a 2a 20 68 61 6e 64 6c 65 20 69 73      ** handle is
c890: 20 63 6f 6e 66 69 67 75 72 65 64 20 74 6f 20 75   configured to u
c8a0: 73 65 20 74 68 65 20 6c 65 67 61 63 79 20 73 71  se the legacy sq
c8b0: 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28 29 0a  lite3_prepare().
c8c0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 74            ** int
c8d0: 65 72 66 61 63 65 2c 20 72 65 74 72 79 20 70 72  erface, retry pr
c8e0: 65 70 61 72 65 28 29 2f 73 74 65 70 28 29 20 6f  epare()/step() o
c8f0: 6e 20 74 68 65 20 73 61 6d 65 20 53 51 4c 20 73  n the same SQL s
c900: 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20  tatement..      
c910: 20 20 20 20 2a 2a 20 54 68 69 73 20 6f 6e 6c 79      ** This only
c920: 20 68 61 70 70 65 6e 73 20 6f 6e 63 65 2e 20 49   happens once. I
c930: 66 20 74 68 65 72 65 20 69 73 20 61 20 73 65 63  f there is a sec
c940: 6f 6e 64 20 53 51 4c 49 54 45 5f 53 43 48 45 4d  ond SQLITE_SCHEM
c950: 41 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 65  A.          ** e
c960: 72 72 6f 72 2c 20 74 68 65 20 65 72 72 6f 72 20  rror, the error 
c970: 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64  will be returned
c980: 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 20   to the caller. 
c990: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  */.          p->
c9a0: 7a 53 71 6c 20 3d 20 7a 50 72 65 76 53 71 6c 3b  zSql = zPrevSql;
c9b0: 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69  .          conti
c9c0: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23  nue;.        }.#
c9d0: 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 54 63  endif.        Tc
c9e0: 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 70  l_SetObjResult(p
c9f0: 44 62 2d 3e 69 6e 74 65 72 70 2c 0a 20 20 20 20  Db->interp,.    
ca00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca10: 20 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69       Tcl_NewStri
ca20: 6e 67 4f 62 6a 28 73 71 6c 69 74 65 33 5f 65 72  ngObj(sqlite3_er
ca30: 72 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c 20 2d  rmsg(pDb->db), -
ca40: 31 29 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  1));.        ret
ca50: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
ca60: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
ca70: 20 20 20 20 64 62 52 65 6c 65 61 73 65 53 74 6d      dbReleaseStm
ca80: 74 28 70 44 62 2c 20 70 50 72 65 53 74 6d 74 2c  t(pDb, pPreStmt,
ca90: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
caa0: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e   }.  }..  /* Fin
cab0: 69 73 68 65 64 20 2a 2f 0a 20 20 72 65 74 75 72  ished */.  retur
cac0: 6e 20 54 43 4c 5f 42 52 45 41 4b 3b 0a 7d 0a 0a  n TCL_BREAK;.}..
cad0: 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20 72  /*.** Free all r
cae0: 65 73 6f 75 72 63 65 73 20 63 75 72 72 65 6e 74  esources current
caf0: 6c 79 20 68 65 6c 64 20 62 79 20 74 68 65 20 44  ly held by the D
cb00: 62 45 76 61 6c 43 6f 6e 74 65 78 74 20 73 74 72  bEvalContext str
cb10: 75 63 74 75 72 65 20 70 61 73 73 65 64 0a 2a 2a  ucture passed.**
cb20: 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
cb30: 67 75 6d 65 6e 74 2e 20 54 68 65 72 65 20 73 68  gument. There sh
cb40: 6f 75 6c 64 20 62 65 20 65 78 61 63 74 6c 79 20  ould be exactly 
cb50: 6f 6e 65 20 63 61 6c 6c 20 74 6f 20 74 68 69 73  one call to this
cb60: 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 66 6f 72   function.** for
cb70: 20 65 61 63 68 20 63 61 6c 6c 20 74 6f 20 64 62   each call to db
cb80: 45 76 61 6c 49 6e 69 74 28 29 2e 0a 2a 2f 0a 73  EvalInit()..*/.s
cb90: 74 61 74 69 63 20 76 6f 69 64 20 64 62 45 76 61  tatic void dbEva
cba0: 6c 46 69 6e 61 6c 69 7a 65 28 44 62 45 76 61 6c  lFinalize(DbEval
cbb0: 43 6f 6e 74 65 78 74 20 2a 70 29 7b 0a 20 20 69  Context *p){.  i
cbc0: 66 28 20 70 2d 3e 70 50 72 65 53 74 6d 74 20 29  f( p->pPreStmt )
cbd0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  {.    sqlite3_re
cbe0: 73 65 74 28 70 2d 3e 70 50 72 65 53 74 6d 74 2d  set(p->pPreStmt-
cbf0: 3e 70 53 74 6d 74 29 3b 0a 20 20 20 20 64 62 52  >pStmt);.    dbR
cc00: 65 6c 65 61 73 65 53 74 6d 74 28 70 2d 3e 70 44  eleaseStmt(p->pD
cc10: 62 2c 20 70 2d 3e 70 50 72 65 53 74 6d 74 2c 20  b, p->pPreStmt, 
cc20: 30 29 3b 0a 20 20 20 20 70 2d 3e 70 50 72 65 53  0);.    p->pPreS
cc30: 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69  tmt = 0;.  }.  i
cc40: 66 28 20 70 2d 3e 70 41 72 72 61 79 20 29 7b 0a  f( p->pArray ){.
cc50: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
cc60: 6f 75 6e 74 28 70 2d 3e 70 41 72 72 61 79 29 3b  ount(p->pArray);
cc70: 0a 20 20 20 20 70 2d 3e 70 41 72 72 61 79 20 3d  .    p->pArray =
cc80: 20 30 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 44 65   0;.  }.  Tcl_De
cc90: 63 72 52 65 66 43 6f 75 6e 74 28 70 2d 3e 70 53  crRefCount(p->pS
cca0: 71 6c 29 3b 0a 20 20 64 62 52 65 6c 65 61 73 65  ql);.  dbRelease
ccb0: 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 29 3b 0a  ColumnNames(p);.
ccc0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
ccd0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 54  a pointer to a T
cce0: 63 6c 5f 4f 62 6a 20 73 74 72 75 63 74 75 72 65  cl_Obj structure
ccf0: 20 77 69 74 68 20 72 65 66 2d 63 6f 75 6e 74 20   with ref-count 
cd00: 30 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 0a  0 that contains.
cd10: 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 66 6f 72  ** the value for
cd20: 20 74 68 65 20 69 43 6f 6c 27 74 68 20 63 6f 6c   the iCol'th col
cd30: 75 6d 6e 20 6f 66 20 74 68 65 20 72 6f 77 20 63  umn of the row c
cd40: 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 65 64  urrently pointed
cd50: 20 74 6f 20 62 79 0a 2a 2a 20 74 68 65 20 44 62   to by.** the Db
cd60: 45 76 61 6c 43 6f 6e 74 65 78 74 20 73 74 72 75  EvalContext stru
cd70: 63 74 75 72 65 20 70 61 73 73 65 64 20 61 73 20  cture passed as 
cd80: 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
cd90: 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 54 63  nt..*/.static Tc
cda0: 6c 5f 4f 62 6a 20 2a 64 62 45 76 61 6c 43 6f 6c  l_Obj *dbEvalCol
cdb0: 75 6d 6e 56 61 6c 75 65 28 44 62 45 76 61 6c 43  umnValue(DbEvalC
cdc0: 6f 6e 74 65 78 74 20 2a 70 2c 20 69 6e 74 20 69  ontext *p, int i
cdd0: 43 6f 6c 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  Col){.  sqlite3_
cde0: 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 70 2d  stmt *pStmt = p-
cdf0: 3e 70 50 72 65 53 74 6d 74 2d 3e 70 53 74 6d 74  >pPreStmt->pStmt
ce00: 3b 0a 20 20 73 77 69 74 63 68 28 20 73 71 6c 69  ;.  switch( sqli
ce10: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 28  te3_column_type(
ce20: 70 53 74 6d 74 2c 20 69 43 6f 6c 29 20 29 7b 0a  pStmt, iCol) ){.
ce30: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
ce40: 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20 69 6e  BLOB: {.      in
ce50: 74 20 62 79 74 65 73 20 3d 20 73 71 6c 69 74 65  t bytes = sqlite
ce60: 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70  3_column_bytes(p
ce70: 53 74 6d 74 2c 20 69 43 6f 6c 29 3b 0a 20 20 20  Stmt, iCol);.   
ce80: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
ce90: 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f 63  Blob = sqlite3_c
cea0: 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70 53 74 6d 74  olumn_blob(pStmt
ceb0: 2c 20 69 43 6f 6c 29 3b 0a 20 20 20 20 20 20 69  , iCol);.      i
cec0: 66 28 20 21 7a 42 6c 6f 62 20 29 20 62 79 74 65  f( !zBlob ) byte
ced0: 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74  s = 0;.      ret
cee0: 75 72 6e 20 54 63 6c 5f 4e 65 77 42 79 74 65 41  urn Tcl_NewByteA
cef0: 72 72 61 79 4f 62 6a 28 28 75 38 2a 29 7a 42 6c  rrayObj((u8*)zBl
cf00: 6f 62 2c 20 62 79 74 65 73 29 3b 0a 20 20 20 20  ob, bytes);.    
cf10: 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
cf20: 45 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20  E_INTEGER: {.   
cf30: 20 20 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20     sqlite_int64 
cf40: 76 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  v = sqlite3_colu
cf50: 6d 6e 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20  mn_int64(pStmt, 
cf60: 69 43 6f 6c 29 3b 0a 20 20 20 20 20 20 69 66 28  iCol);.      if(
cf70: 20 76 3e 3d 2d 32 31 34 37 34 38 33 36 34 37 20   v>=-2147483647 
cf80: 26 26 20 76 3c 3d 32 31 34 37 34 38 33 36 34 37  && v<=2147483647
cf90: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
cfa0: 72 6e 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  rn Tcl_NewIntObj
cfb0: 28 28 69 6e 74 29 76 29 3b 0a 20 20 20 20 20 20  ((int)v);.      
cfc0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
cfd0: 65 74 75 72 6e 20 54 63 6c 5f 4e 65 77 57 69 64  eturn Tcl_NewWid
cfe0: 65 49 6e 74 4f 62 6a 28 76 29 3b 0a 20 20 20 20  eIntObj(v);.    
cff0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 63 61    }.    }.    ca
d000: 73 65 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54 3a  se SQLITE_FLOAT:
d010: 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   {.      return 
d020: 54 63 6c 5f 4e 65 77 44 6f 75 62 6c 65 4f 62 6a  Tcl_NewDoubleObj
d030: 28 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  (sqlite3_column_
d040: 64 6f 75 62 6c 65 28 70 53 74 6d 74 2c 20 69 43  double(pStmt, iC
d050: 6f 6c 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ol));.    }.    
d060: 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 55 4c 4c  case SQLITE_NULL
d070: 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  : {.      return
d080: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
d090: 6a 28 70 2d 3e 70 44 62 2d 3e 7a 4e 75 6c 6c 2c  j(p->pDb->zNull,
d0a0: 20 2d 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   -1);.    }.  }.
d0b0: 0a 20 20 72 65 74 75 72 6e 20 54 63 6c 5f 4e 65  .  return Tcl_Ne
d0c0: 77 53 74 72 69 6e 67 4f 62 6a 28 28 63 68 61 72  wStringObj((char
d0d0: 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
d0e0: 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 69 43 6f  _text(pStmt, iCo
d0f0: 6c 29 2c 20 2d 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  l), -1);.}../*.*
d100: 2a 20 49 66 20 75 73 69 6e 67 20 54 63 6c 20 76  * If using Tcl v
d110: 65 72 73 69 6f 6e 20 38 2e 36 20 6f 72 20 67 72  ersion 8.6 or gr
d120: 65 61 74 65 72 2c 20 75 73 65 20 74 68 65 20 4e  eater, use the N
d130: 52 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20 61  R functions to a
d140: 76 6f 69 64 0a 2a 2a 20 72 65 63 75 72 73 69 76  void.** recursiv
d150: 65 20 65 76 61 6c 75 74 69 6f 6e 20 6f 66 20 73  e evalution of s
d160: 63 72 69 70 74 73 20 62 79 20 74 68 65 20 5b 64  cripts by the [d
d170: 62 20 65 76 61 6c 5d 20 61 6e 64 20 5b 64 62 20  b eval] and [db 
d180: 74 72 61 6e 73 5d 0a 2a 2a 20 63 6f 6d 6d 61 6e  trans].** comman
d190: 64 73 2e 20 45 76 65 6e 20 69 66 20 74 68 65 20  ds. Even if the 
d1a0: 68 65 61 64 65 72 73 20 75 73 65 64 20 77 68 69  headers used whi
d1b0: 6c 65 20 63 6f 6d 70 69 6c 69 6e 67 20 74 68 65  le compiling the
d1c0: 20 65 78 74 65 6e 73 69 6f 6e 0a 2a 2a 20 61 72   extension.** ar
d1d0: 65 20 38 2e 36 20 6f 72 20 6e 65 77 65 72 2c 20  e 8.6 or newer, 
d1e0: 74 68 65 20 63 6f 64 65 20 73 74 69 6c 6c 20 74  the code still t
d1f0: 65 73 74 73 20 74 68 65 20 54 63 6c 20 76 65 72  ests the Tcl ver
d200: 73 69 6f 6e 20 61 74 20 72 75 6e 74 69 6d 65 2e  sion at runtime.
d210: 0a 2a 2a 20 54 68 69 73 20 61 6c 6c 6f 77 73 20  .** This allows 
d220: 73 74 75 62 73 2d 65 6e 61 62 6c 65 64 20 62 75  stubs-enabled bu
d230: 69 6c 64 73 20 74 6f 20 62 65 20 75 73 65 64 20  ilds to be used 
d240: 77 69 74 68 20 6f 6c 64 65 72 20 54 63 6c 20 6c  with older Tcl l
d250: 69 62 72 61 72 69 65 73 2e 0a 2a 2f 0a 23 69 66  ibraries..*/.#if
d260: 20 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49   TCL_MAJOR_VERSI
d270: 4f 4e 3e 38 20 7c 7c 20 28 54 43 4c 5f 4d 41 4a  ON>8 || (TCL_MAJ
d280: 4f 52 5f 56 45 52 53 49 4f 4e 3d 3d 38 20 26 26  OR_VERSION==8 &&
d290: 20 54 43 4c 5f 4d 49 4e 4f 52 5f 56 45 52 53 49   TCL_MINOR_VERSI
d2a0: 4f 4e 3e 3d 36 29 0a 23 20 64 65 66 69 6e 65 20  ON>=6).# define 
d2b0: 53 51 4c 49 54 45 5f 54 43 4c 5f 4e 52 45 20 31  SQLITE_TCL_NRE 1
d2c0: 0a 73 74 61 74 69 63 20 69 6e 74 20 44 62 55 73  .static int DbUs
d2d0: 65 4e 72 65 28 76 6f 69 64 29 7b 0a 20 20 69 6e  eNre(void){.  in
d2e0: 74 20 6d 61 6a 6f 72 2c 20 6d 69 6e 6f 72 3b 0a  t major, minor;.
d2f0: 20 20 54 63 6c 5f 47 65 74 56 65 72 73 69 6f 6e    Tcl_GetVersion
d300: 28 26 6d 61 6a 6f 72 2c 20 26 6d 69 6e 6f 72 2c  (&major, &minor,
d310: 20 30 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e   0, 0);.  return
d320: 28 20 28 6d 61 6a 6f 72 3d 3d 38 20 26 26 20 6d  ( (major==8 && m
d330: 69 6e 6f 72 3e 3d 36 29 20 7c 7c 20 6d 61 6a 6f  inor>=6) || majo
d340: 72 3e 38 20 29 3b 0a 7d 0a 23 65 6c 73 65 0a 2f  r>8 );.}.#else./
d350: 2a 0a 2a 2a 20 43 6f 6d 70 69 6c 69 6e 67 20 75  *.** Compiling u
d360: 73 69 6e 67 20 68 65 61 64 65 72 73 20 65 61 72  sing headers ear
d370: 6c 69 65 72 20 74 68 61 6e 20 38 2e 36 2e 20 49  lier than 8.6. I
d380: 6e 20 74 68 69 73 20 63 61 73 65 20 4e 52 20 63  n this case NR c
d390: 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 75 73 65 64  annot be.** used
d3a0: 2c 20 73 6f 20 44 62 55 73 65 4e 72 65 28 29 20  , so DbUseNre() 
d3b0: 74 6f 20 61 6c 77 61 79 73 20 72 65 74 75 72 6e  to always return
d3c0: 20 7a 65 72 6f 2e 20 41 64 64 20 23 64 65 66 69   zero. Add #defi
d3d0: 6e 65 73 20 66 6f 72 20 74 68 65 20 6f 74 68 65  nes for the othe
d3e0: 72 0a 2a 2a 20 54 63 6c 5f 4e 52 78 78 78 28 29  r.** Tcl_NRxxx()
d3f0: 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20 70 72   functions to pr
d400: 65 76 65 6e 74 20 74 68 65 6d 20 66 72 6f 6d 20  event them from 
d410: 63 61 75 73 69 6e 67 20 63 6f 6d 70 69 6c 61 74  causing compilat
d420: 69 6f 6e 20 65 72 72 6f 72 73 2c 0a 2a 2a 20 65  ion errors,.** e
d430: 76 65 6e 20 74 68 6f 75 67 68 20 74 68 65 20 6f  ven though the o
d440: 6e 6c 79 20 69 6e 76 6f 63 61 74 69 6f 6e 73 20  nly invocations 
d450: 6f 66 20 74 68 65 6d 20 61 72 65 20 77 69 74 68  of them are with
d460: 69 6e 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 62  in conditional b
d470: 6c 6f 63 6b 73 0a 2a 2a 20 6f 66 20 74 68 65 20  locks.** of the 
d480: 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66  form:.**.**   if
d490: 28 20 44 62 55 73 65 4e 72 65 28 29 20 29 20 7b  ( DbUseNre() ) {
d4a0: 20 2e 2e 2e 20 7d 0a 2a 2f 0a 23 20 64 65 66 69   ... }.*/.# defi
d4b0: 6e 65 20 53 51 4c 49 54 45 5f 54 43 4c 5f 4e 52  ne SQLITE_TCL_NR
d4c0: 45 20 30 0a 23 20 64 65 66 69 6e 65 20 44 62 55  E 0.# define DbU
d4d0: 73 65 4e 72 65 28 29 20 30 0a 23 20 64 65 66 69  seNre() 0.# defi
d4e0: 6e 65 20 54 63 6c 5f 4e 52 41 64 64 43 61 6c 6c  ne Tcl_NRAddCall
d4f0: 62 61 63 6b 28 61 2c 62 2c 63 2c 64 2c 65 2c 66  back(a,b,c,d,e,f
d500: 29 20 28 76 6f 69 64 29 30 0a 23 20 64 65 66 69  ) (void)0.# defi
d510: 6e 65 20 54 63 6c 5f 4e 52 45 76 61 6c 4f 62 6a  ne Tcl_NREvalObj
d520: 28 61 2c 62 2c 63 29 20 30 0a 23 20 64 65 66 69  (a,b,c) 0.# defi
d530: 6e 65 20 54 63 6c 5f 4e 52 43 72 65 61 74 65 43  ne Tcl_NRCreateC
d540: 6f 6d 6d 61 6e 64 28 61 2c 62 2c 63 2c 64 2c 65  ommand(a,b,c,d,e
d550: 2c 66 29 20 28 76 6f 69 64 29 30 0a 23 65 6e 64  ,f) (void)0.#end
d560: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  if../*.** This f
d570: 75 6e 63 74 69 6f 6e 20 69 73 20 70 61 72 74 20  unction is part 
d580: 6f 66 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74  of the implement
d590: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 63 6f 6d  ation of the com
d5a0: 6d 61 6e 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 24 64  mand:.**.**   $d
d5b0: 62 20 65 76 61 6c 20 53 51 4c 20 3f 41 52 52 41  b eval SQL ?ARRA
d5c0: 59 4e 41 4d 45 3f 20 53 43 52 49 50 54 0a 2a 2f  YNAME? SCRIPT.*/
d5d0: 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
d5e0: 54 45 5f 54 43 4c 41 50 49 20 44 62 45 76 61 6c  TE_TCLAPI DbEval
d5f0: 4e 65 78 74 43 6d 64 28 0a 20 20 43 6c 69 65 6e  NextCmd(.  Clien
d600: 74 44 61 74 61 20 64 61 74 61 5b 5d 2c 20 20 20  tData data[],   
d610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d620: 2f 2a 20 64 61 74 61 5b 30 5d 20 69 73 20 74 68  /* data[0] is th
d630: 65 20 28 44 62 45 76 61 6c 43 6f 6e 74 65 78 74  e (DbEvalContext
d640: 2a 29 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65  *) */.  Tcl_Inte
d650: 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 20  rp *interp,     
d660: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d670: 54 63 6c 20 69 6e 74 65 72 70 72 65 74 65 72 20  Tcl interpreter 
d680: 2a 2f 0a 20 20 69 6e 74 20 72 65 73 75 6c 74 20  */.  int result 
d690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d6a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
d6b0: 75 6c 74 20 73 6f 20 66 61 72 20 2a 2f 0a 29 7b  ult so far */.){
d6c0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 72 65 73 75  .  int rc = resu
d6d0: 6c 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  lt;             
d6e0: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
d6f0: 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20  n code */..  /* 
d700: 54 68 65 20 66 69 72 73 74 20 65 6c 65 6d 65 6e  The first elemen
d710: 74 20 6f 66 20 74 68 65 20 64 61 74 61 5b 5d 20  t of the data[] 
d720: 61 72 72 61 79 20 69 73 20 61 20 70 6f 69 6e 74  array is a point
d730: 65 72 20 74 6f 20 61 20 44 62 45 76 61 6c 43 6f  er to a DbEvalCo
d740: 6e 74 65 78 74 0a 20 20 2a 2a 20 73 74 72 75 63  ntext.  ** struc
d750: 74 75 72 65 20 61 6c 6c 6f 63 61 74 65 64 20 75  ture allocated u
d760: 73 69 6e 67 20 54 63 6c 5f 41 6c 6c 6f 63 28 29  sing Tcl_Alloc()
d770: 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 65 6c 65  . The second ele
d780: 6d 65 6e 74 20 6f 66 20 64 61 74 61 5b 5d 0a 20  ment of data[]. 
d790: 20 2a 2a 20 69 73 20 61 20 70 6f 69 6e 74 65 72   ** is a pointer
d7a0: 20 74 6f 20 61 20 54 63 6c 5f 4f 62 6a 20 63 6f   to a Tcl_Obj co
d7b0: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 73 63 72  ntaining the scr
d7c0: 69 70 74 20 74 6f 20 72 75 6e 20 66 6f 72 20 65  ipt to run for e
d7d0: 61 63 68 20 72 6f 77 0a 20 20 2a 2a 20 72 65 74  ach row.  ** ret
d7e0: 75 72 6e 65 64 20 62 79 20 74 68 65 20 71 75 65  urned by the que
d7f0: 72 69 65 73 20 65 6e 63 61 70 73 75 6c 61 74 65  ries encapsulate
d800: 64 20 69 6e 20 64 61 74 61 5b 30 5d 2e 20 2a 2f  d in data[0]. */
d810: 0a 20 20 44 62 45 76 61 6c 43 6f 6e 74 65 78 74  .  DbEvalContext
d820: 20 2a 70 20 3d 20 28 44 62 45 76 61 6c 43 6f 6e   *p = (DbEvalCon
d830: 74 65 78 74 20 2a 29 64 61 74 61 5b 30 5d 3b 0a  text *)data[0];.
d840: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 53 63 72 69    Tcl_Obj *pScri
d850: 70 74 20 3d 20 28 54 63 6c 5f 4f 62 6a 20 2a 29  pt = (Tcl_Obj *)
d860: 64 61 74 61 5b 31 5d 3b 0a 20 20 54 63 6c 5f 4f  data[1];.  Tcl_O
d870: 62 6a 20 2a 70 41 72 72 61 79 20 3d 20 70 2d 3e  bj *pArray = p->
d880: 70 41 72 72 61 79 3b 0a 0a 20 20 77 68 69 6c 65  pArray;..  while
d890: 28 20 28 72 63 3d 3d 54 43 4c 5f 4f 4b 20 7c 7c  ( (rc==TCL_OK ||
d8a0: 20 72 63 3d 3d 54 43 4c 5f 43 4f 4e 54 49 4e 55   rc==TCL_CONTINU
d8b0: 45 29 20 26 26 20 54 43 4c 5f 4f 4b 3d 3d 28 72  E) && TCL_OK==(r
d8c0: 63 20 3d 20 64 62 45 76 61 6c 53 74 65 70 28 70  c = dbEvalStep(p
d8d0: 29 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  )) ){.    int i;
d8e0: 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20  .    int nCol;. 
d8f0: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 61 70 43     Tcl_Obj **apC
d900: 6f 6c 4e 61 6d 65 3b 0a 20 20 20 20 64 62 45 76  olName;.    dbEv
d910: 61 6c 52 6f 77 49 6e 66 6f 28 70 2c 20 26 6e 43  alRowInfo(p, &nC
d920: 6f 6c 2c 20 26 61 70 43 6f 6c 4e 61 6d 65 29 3b  ol, &apColName);
d930: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
d940: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
d950: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 56 61 6c 20    Tcl_Obj *pVal 
d960: 3d 20 64 62 45 76 61 6c 43 6f 6c 75 6d 6e 56 61  = dbEvalColumnVa
d970: 6c 75 65 28 70 2c 20 69 29 3b 0a 20 20 20 20 20  lue(p, i);.     
d980: 20 69 66 28 20 70 41 72 72 61 79 3d 3d 30 20 29   if( pArray==0 )
d990: 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 4f 62  {.        Tcl_Ob
d9a0: 6a 53 65 74 56 61 72 32 28 69 6e 74 65 72 70 2c  jSetVar2(interp,
d9b0: 20 61 70 43 6f 6c 4e 61 6d 65 5b 69 5d 2c 20 30   apColName[i], 0
d9c0: 2c 20 70 56 61 6c 2c 20 30 29 3b 0a 20 20 20 20  , pVal, 0);.    
d9d0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
d9e0: 20 54 63 6c 5f 4f 62 6a 53 65 74 56 61 72 32 28   Tcl_ObjSetVar2(
d9f0: 69 6e 74 65 72 70 2c 20 70 41 72 72 61 79 2c 20  interp, pArray, 
da00: 61 70 43 6f 6c 4e 61 6d 65 5b 69 5d 2c 20 70 56  apColName[i], pV
da10: 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  al, 0);.      }.
da20: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68      }..    /* Th
da30: 65 20 72 65 71 75 69 72 65 64 20 69 6e 74 65 72  e required inter
da40: 70 72 65 74 65 72 20 76 61 72 69 61 62 6c 65 73  preter variables
da50: 20 61 72 65 20 6e 6f 77 20 70 6f 70 75 6c 61 74   are now populat
da60: 65 64 20 77 69 74 68 20 74 68 65 20 64 61 74 61  ed with the data
da70: 0a 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65  .    ** from the
da80: 20 63 75 72 72 65 6e 74 20 72 6f 77 2e 20 49 66   current row. If
da90: 20 75 73 69 6e 67 20 4e 52 45 2c 20 73 63 68 65   using NRE, sche
daa0: 64 75 6c 65 20 63 61 6c 6c 62 61 63 6b 73 20 74  dule callbacks t
dab0: 6f 20 65 76 61 6c 75 61 74 65 0a 20 20 20 20 2a  o evaluate.    *
dac0: 2a 20 73 63 72 69 70 74 20 70 53 63 72 69 70 74  * script pScript
dad0: 2c 20 74 68 65 6e 20 74 6f 20 69 6e 76 6f 6b 65  , then to invoke
dae0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   this function a
daf0: 67 61 69 6e 20 74 6f 20 66 65 74 63 68 20 74 68  gain to fetch th
db00: 65 20 6e 65 78 74 0a 20 20 20 20 2a 2a 20 72 6f  e next.    ** ro
db10: 77 20 28 6f 72 20 63 6c 65 61 6e 20 75 70 20 69  w (or clean up i
db20: 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65  f there is no ne
db30: 78 74 20 72 6f 77 20 6f 72 20 74 68 65 20 73 63  xt row or the sc
db40: 72 69 70 74 20 74 68 72 6f 77 73 20 61 6e 0a 20  ript throws an. 
db50: 20 20 20 2a 2a 20 65 78 63 65 70 74 69 6f 6e 29     ** exception)
db60: 2e 20 41 66 74 65 72 20 73 63 68 65 64 75 6c 69  . After scheduli
db70: 6e 67 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 73  ng the callbacks
db80: 2c 20 72 65 74 75 72 6e 20 63 6f 6e 74 72 6f 6c  , return control
db90: 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 63   to the.    ** c
dba0: 61 6c 6c 65 72 2e 0a 20 20 20 20 2a 2a 0a 20 20  aller..    **.  
dbb0: 20 20 2a 2a 20 49 66 20 6e 6f 74 20 75 73 69 6e    ** If not usin
dbc0: 67 20 4e 52 45 2c 20 65 76 61 6c 75 61 74 65 20  g NRE, evaluate 
dbd0: 70 53 63 72 69 70 74 20 64 69 72 65 63 74 6c 79  pScript directly
dbe0: 20 61 6e 64 20 63 6f 6e 74 69 6e 75 65 20 77 69   and continue wi
dbf0: 74 68 20 74 68 65 0a 20 20 20 20 2a 2a 20 6e 65  th the.    ** ne
dc00: 78 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20  xt iteration of 
dc10: 74 68 69 73 20 77 68 69 6c 65 28 2e 2e 2e 29 20  this while(...) 
dc20: 6c 6f 6f 70 2e 20 20 2a 2f 0a 20 20 20 20 69 66  loop.  */.    if
dc30: 28 20 44 62 55 73 65 4e 72 65 28 29 20 29 7b 0a  ( DbUseNre() ){.
dc40: 20 20 20 20 20 20 54 63 6c 5f 4e 52 41 64 64 43        Tcl_NRAddC
dc50: 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c 20  allback(interp, 
dc60: 44 62 45 76 61 6c 4e 65 78 74 43 6d 64 2c 20 28  DbEvalNextCmd, (
dc70: 76 6f 69 64 2a 29 70 2c 20 28 76 6f 69 64 2a 29  void*)p, (void*)
dc80: 70 53 63 72 69 70 74 2c 20 30 2c 20 30 29 3b 0a  pScript, 0, 0);.
dc90: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 63 6c        return Tcl
dca0: 5f 4e 52 45 76 61 6c 4f 62 6a 28 69 6e 74 65 72  _NREvalObj(inter
dcb0: 70 2c 20 70 53 63 72 69 70 74 2c 20 30 29 3b 0a  p, pScript, 0);.
dcc0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
dcd0: 20 72 63 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62   rc = Tcl_EvalOb
dce0: 6a 45 78 28 69 6e 74 65 72 70 2c 20 70 53 63 72  jEx(interp, pScr
dcf0: 69 70 74 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  ipt, 0);.    }. 
dd00: 20 7d 0a 0a 20 20 54 63 6c 5f 44 65 63 72 52 65   }..  Tcl_DecrRe
dd10: 66 43 6f 75 6e 74 28 70 53 63 72 69 70 74 29 3b  fCount(pScript);
dd20: 0a 20 20 64 62 45 76 61 6c 46 69 6e 61 6c 69 7a  .  dbEvalFinaliz
dd30: 65 28 70 29 3b 0a 20 20 54 63 6c 5f 46 72 65 65  e(p);.  Tcl_Free
dd40: 28 28 63 68 61 72 20 2a 29 70 29 3b 0a 0a 20 20  ((char *)p);..  
dd50: 69 66 28 20 72 63 3d 3d 54 43 4c 5f 4f 4b 20 7c  if( rc==TCL_OK |
dd60: 7c 20 72 63 3d 3d 54 43 4c 5f 42 52 45 41 4b 20  | rc==TCL_BREAK 
dd70: 29 7b 0a 20 20 20 20 54 63 6c 5f 52 65 73 65 74  ){.    Tcl_Reset
dd80: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a  Result(interp);.
dd90: 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 4f 4b 3b      rc = TCL_OK;
dda0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
ddb0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
ddc0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
ddd0: 20 62 79 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e   by the implemen
dde0: 74 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 66  tations of the f
ddf0: 6f 6c 6c 6f 77 69 6e 67 20 64 61 74 61 62 61 73  ollowing databas
de00: 65 0a 2a 2a 20 68 61 6e 64 6c 65 20 73 75 62 2d  e.** handle sub-
de10: 63 6f 6d 6d 61 6e 64 73 3a 0a 2a 2a 0a 2a 2a 20  commands:.**.** 
de20: 20 20 24 64 62 20 75 70 64 61 74 65 5f 68 6f 6f    $db update_hoo
de30: 6b 20 3f 53 43 52 49 50 54 3f 0a 2a 2a 20 20 20  k ?SCRIPT?.**   
de40: 24 64 62 20 77 61 6c 5f 68 6f 6f 6b 20 3f 53 43  $db wal_hook ?SC
de50: 52 49 50 54 3f 0a 2a 2a 20 20 20 24 64 62 20 63  RIPT?.**   $db c
de60: 6f 6d 6d 69 74 5f 68 6f 6f 6b 20 3f 53 43 52 49  ommit_hook ?SCRI
de70: 50 54 3f 0a 2a 2a 20 20 20 24 64 62 20 70 72 65  PT?.**   $db pre
de80: 75 70 64 61 74 65 20 68 6f 6f 6b 20 3f 53 43 52  update hook ?SCR
de90: 49 50 54 3f 0a 2a 2f 0a 73 74 61 74 69 63 20 76  IPT?.*/.static v
dea0: 6f 69 64 20 44 62 48 6f 6f 6b 43 6d 64 28 0a 20  oid DbHookCmd(. 
deb0: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
dec0: 65 72 70 2c 20 20 20 20 20 20 20 20 20 20 20 20  erp,            
ded0: 20 2f 2a 20 54 63 6c 20 69 6e 74 65 72 70 72 65   /* Tcl interpre
dee0: 74 65 72 20 2a 2f 0a 20 20 53 71 6c 69 74 65 44  ter */.  SqliteD
def0: 62 20 2a 70 44 62 2c 20 20 20 20 20 20 20 20 20  b *pDb,         
df00: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
df10: 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  base handle */. 
df20: 20 54 63 6c 5f 4f 62 6a 20 2a 70 41 72 67 2c 20   Tcl_Obj *pArg, 
df30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df40: 20 2f 2a 20 53 43 52 49 50 54 20 61 72 67 75 6d   /* SCRIPT argum
df50: 65 6e 74 20 28 6f 72 20 4e 55 4c 4c 29 20 2a 2f  ent (or NULL) */
df60: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 70 70 48  .  Tcl_Obj **ppH
df70: 6f 6f 6b 20 20 20 20 20 20 20 20 20 20 20 20 20  ook             
df80: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
df90: 20 6d 65 6d 62 65 72 20 6f 66 20 53 71 6c 69 74   member of Sqlit
dfa0: 65 44 62 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  eDb */.){.  sqli
dfb0: 74 65 33 20 2a 64 62 20 3d 20 70 44 62 2d 3e 64  te3 *db = pDb->d
dfc0: 62 3b 0a 0a 20 20 69 66 28 20 2a 70 70 48 6f 6f  b;..  if( *ppHoo
dfd0: 6b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74  k ){.    Tcl_Set
dfe0: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
dff0: 2c 20 2a 70 70 48 6f 6f 6b 29 3b 0a 20 20 20 20  , *ppHook);.    
e000: 69 66 28 20 70 41 72 67 20 29 7b 0a 20 20 20 20  if( pArg ){.    
e010: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
e020: 6e 74 28 2a 70 70 48 6f 6f 6b 29 3b 0a 20 20 20  nt(*ppHook);.   
e030: 20 20 20 2a 70 70 48 6f 6f 6b 20 3d 20 30 3b 0a     *ppHook = 0;.
e040: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
e050: 70 41 72 67 20 29 7b 0a 20 20 20 20 61 73 73 65  pArg ){.    asse
e060: 72 74 28 20 21 28 2a 70 70 48 6f 6f 6b 29 20 29  rt( !(*ppHook) )
e070: 3b 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65  ;.    if( Tcl_Ge
e080: 74 43 68 61 72 4c 65 6e 67 74 68 28 70 41 72 67  tCharLength(pArg
e090: 29 3e 30 20 29 7b 0a 20 20 20 20 20 20 2a 70 70  )>0 ){.      *pp
e0a0: 48 6f 6f 6b 20 3d 20 70 41 72 67 3b 0a 20 20 20  Hook = pArg;.   
e0b0: 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f     Tcl_IncrRefCo
e0c0: 75 6e 74 28 2a 70 70 48 6f 6f 6b 29 3b 0a 20 20  unt(*ppHook);.  
e0d0: 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20    }.  }..#ifdef 
e0e0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52  SQLITE_ENABLE_PR
e0f0: 45 55 50 44 41 54 45 5f 48 4f 4f 4b 0a 20 20 73  EUPDATE_HOOK.  s
e100: 71 6c 69 74 65 33 5f 70 72 65 75 70 64 61 74 65  qlite3_preupdate
e110: 5f 68 6f 6f 6b 28 64 62 2c 20 28 70 44 62 2d 3e  _hook(db, (pDb->
e120: 70 50 72 65 55 70 64 61 74 65 48 6f 6f 6b 3f 44  pPreUpdateHook?D
e130: 62 50 72 65 55 70 64 61 74 65 48 61 6e 64 6c 65  bPreUpdateHandle
e140: 72 3a 30 29 2c 20 70 44 62 29 3b 0a 23 65 6e 64  r:0), pDb);.#end
e150: 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 75 70 64  if.  sqlite3_upd
e160: 61 74 65 5f 68 6f 6f 6b 28 64 62 2c 20 28 70 44  ate_hook(db, (pD
e170: 62 2d 3e 70 55 70 64 61 74 65 48 6f 6f 6b 3f 44  b->pUpdateHook?D
e180: 62 55 70 64 61 74 65 48 61 6e 64 6c 65 72 3a 30  bUpdateHandler:0
e190: 29 2c 20 70 44 62 29 3b 0a 20 20 73 71 6c 69 74  ), pDb);.  sqlit
e1a0: 65 33 5f 72 6f 6c 6c 62 61 63 6b 5f 68 6f 6f 6b  e3_rollback_hook
e1b0: 28 64 62 2c 20 28 70 44 62 2d 3e 70 52 6f 6c 6c  (db, (pDb->pRoll
e1c0: 62 61 63 6b 48 6f 6f 6b 3f 44 62 52 6f 6c 6c 62  backHook?DbRollb
e1d0: 61 63 6b 48 61 6e 64 6c 65 72 3a 30 29 2c 20 70  ackHandler:0), p
e1e0: 44 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 77  Db);.  sqlite3_w
e1f0: 61 6c 5f 68 6f 6f 6b 28 64 62 2c 20 28 70 44 62  al_hook(db, (pDb
e200: 2d 3e 70 57 61 6c 48 6f 6f 6b 3f 44 62 57 61 6c  ->pWalHook?DbWal
e210: 48 61 6e 64 6c 65 72 3a 30 29 2c 20 70 44 62 29  Handler:0), pDb)
e220: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 22  ;.}../*.** The "
e230: 73 71 6c 69 74 65 22 20 63 6f 6d 6d 61 6e 64 20  sqlite" command 
e240: 62 65 6c 6f 77 20 63 72 65 61 74 65 73 20 61 20  below creates a 
e250: 6e 65 77 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 20  new Tcl command 
e260: 66 6f 72 20 65 61 63 68 0a 2a 2a 20 63 6f 6e 6e  for each.** conn
e270: 65 63 74 69 6f 6e 20 69 74 20 6f 70 65 6e 73 20  ection it opens 
e280: 74 6f 20 61 6e 20 53 51 4c 69 74 65 20 64 61 74  to an SQLite dat
e290: 61 62 61 73 65 2e 20 20 54 68 69 73 20 72 6f 75  abase.  This rou
e2a0: 74 69 6e 65 20 69 73 20 69 6e 76 6f 6b 65 64 0a  tine is invoked.
e2b0: 2a 2a 20 77 68 65 6e 65 76 65 72 20 6f 6e 65 20  ** whenever one 
e2c0: 6f 66 20 74 68 6f 73 65 20 63 6f 6e 6e 65 63 74  of those connect
e2d0: 69 6f 6e 2d 73 70 65 63 69 66 69 63 20 63 6f 6d  ion-specific com
e2e0: 6d 61 6e 64 73 20 69 73 20 65 78 65 63 75 74 65  mands is execute
e2f0: 64 0a 2a 2a 20 69 6e 20 54 63 6c 2e 20 20 46 6f  d.** in Tcl.  Fo
e300: 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 79 6f  r example, if yo
e310: 75 20 72 75 6e 20 54 63 6c 20 63 6f 64 65 20 6c  u run Tcl code l
e320: 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20  ike this:.**.** 
e330: 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 64 62        sqlite3 db
e340: 31 20 20 22 6d 79 5f 64 61 74 61 62 61 73 65 22  1  "my_database"
e350: 0a 2a 2a 20 20 20 20 20 20 20 64 62 31 20 63 6c  .**       db1 cl
e360: 6f 73 65 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69  ose.**.** The fi
e370: 72 73 74 20 63 6f 6d 6d 61 6e 64 20 6f 70 65 6e  rst command open
e380: 73 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74  s a connection t
e390: 6f 20 74 68 65 20 22 6d 79 5f 64 61 74 61 62 61  o the "my_databa
e3a0: 73 65 22 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  se" database.** 
e3b0: 61 6e 64 20 63 61 6c 6c 73 20 74 68 61 74 20 63  and calls that c
e3c0: 6f 6e 6e 65 63 74 69 6f 6e 20 22 64 62 31 22 2e  onnection "db1".
e3d0: 20 20 54 68 65 20 73 65 63 6f 6e 64 20 63 6f 6d    The second com
e3e0: 6d 61 6e 64 20 63 61 75 73 65 73 20 74 68 69 73  mand causes this
e3f0: 0a 2a 2a 20 73 75 62 72 6f 75 74 69 6e 65 20 74  .** subroutine t
e400: 6f 20 62 65 20 69 6e 76 6f 6b 65 64 2e 0a 2a 2f  o be invoked..*/
e410: 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
e420: 54 45 5f 54 43 4c 41 50 49 20 44 62 4f 62 6a 43  TE_TCLAPI DbObjC
e430: 6d 64 28 0a 20 20 76 6f 69 64 20 2a 63 64 2c 0a  md(.  void *cd,.
e440: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
e450: 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
e460: 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e  ,.  Tcl_Obj *con
e470: 73 74 2a 6f 62 6a 76 0a 29 7b 0a 20 20 53 71 6c  st*objv.){.  Sql
e480: 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53 71  iteDb *pDb = (Sq
e490: 6c 69 74 65 44 62 2a 29 63 64 3b 0a 20 20 69 6e  liteDb*)cd;.  in
e4a0: 74 20 63 68 6f 69 63 65 3b 0a 20 20 69 6e 74 20  t choice;.  int 
e4b0: 72 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20 73  rc = TCL_OK;.  s
e4c0: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
e4d0: 20 2a 44 42 5f 73 74 72 73 5b 5d 20 3d 20 7b 0a   *DB_strs[] = {.
e4e0: 20 20 20 20 22 61 75 74 68 6f 72 69 7a 65 72 22      "authorizer"
e4f0: 2c 20 20 20 20 20 20 20 20 20 22 62 61 63 6b 75  ,         "backu
e500: 70 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 22  p",            "
e510: 62 75 73 79 22 2c 0a 20 20 20 20 22 63 61 63 68  busy",.    "cach
e520: 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  e",             
e530: 20 22 63 68 61 6e 67 65 73 22 2c 20 20 20 20 20   "changes",     
e540: 20 20 20 20 20 20 22 63 6c 6f 73 65 22 2c 0a 20        "close",. 
e550: 20 20 20 22 63 6f 6c 6c 61 74 65 22 2c 20 20 20     "collate",   
e560: 20 20 20 20 20 20 20 20 20 22 63 6f 6c 6c 61 74           "collat
e570: 69 6f 6e 5f 6e 65 65 64 65 64 22 2c 20 20 22 63  ion_needed",  "c
e580: 6f 6d 6d 69 74 5f 68 6f 6f 6b 22 2c 0a 20 20 20  ommit_hook",.   
e590: 20 22 63 6f 6d 70 6c 65 74 65 22 2c 20 20 20 20   "complete",    
e5a0: 20 20 20 20 20 20 20 22 63 6f 70 79 22 2c 20 20         "copy",  
e5b0: 20 20 20 20 20 20 20 20 20 20 20 20 22 65 6e 61              "ena
e5c0: 62 6c 65 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69  ble_load_extensi
e5d0: 6f 6e 22 2c 0a 20 20 20 20 22 65 72 72 6f 72 63  on",.    "errorc
e5e0: 6f 64 65 22 2c 20 20 20 20 20 20 20 20 20 20 22  ode",          "
e5f0: 65 76 61 6c 22 2c 20 20 20 20 20 20 20 20 20 20  eval",          
e600: 20 20 20 20 22 65 78 69 73 74 73 22 2c 0a 20 20      "exists",.  
e610: 20 20 22 66 75 6e 63 74 69 6f 6e 22 2c 20 20 20    "function",   
e620: 20 20 20 20 20 20 20 20 22 69 6e 63 72 62 6c 6f          "incrblo
e630: 62 22 2c 20 20 20 20 20 20 20 20 20 20 22 69 6e  b",          "in
e640: 74 65 72 72 75 70 74 22 2c 0a 20 20 20 20 22 6c  terrupt",.    "l
e650: 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64  ast_insert_rowid
e660: 22 2c 20 20 22 6e 75 6c 6c 76 61 6c 75 65 22 2c  ",  "nullvalue",
e670: 20 20 20 20 20 20 20 20 20 22 6f 6e 65 63 6f 6c           "onecol
e680: 75 6d 6e 22 2c 0a 20 20 20 20 22 70 72 65 75 70  umn",.    "preup
e690: 64 61 74 65 22 2c 20 20 20 20 20 20 20 20 20 20  date",          
e6a0: 22 70 72 6f 66 69 6c 65 22 2c 20 20 20 20 20 20  "profile",      
e6b0: 20 20 20 20 20 22 70 72 6f 67 72 65 73 73 22 2c       "progress",
e6c0: 0a 20 20 20 20 22 72 65 6b 65 79 22 2c 20 20 20  .    "rekey",   
e6d0: 20 20 20 20 20 20 20 20 20 20 20 22 72 65 73 74             "rest
e6e0: 6f 72 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ore",           
e6f0: 22 72 6f 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 22 2c  "rollback_hook",
e700: 0a 20 20 20 20 22 73 74 61 74 75 73 22 2c 20 20  .    "status",  
e710: 20 20 20 20 20 20 20 20 20 20 20 22 74 69 6d 65             "time
e720: 6f 75 74 22 2c 20 20 20 20 20 20 20 20 20 20 20  out",           
e730: 22 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73 22 2c  "total_changes",
e740: 0a 20 20 20 20 22 74 72 61 63 65 22 2c 20 20 20  .    "trace",   
e750: 20 20 20 20 20 20 20 20 20 20 20 22 74 72 61 63             "trac
e760: 65 5f 76 32 22 2c 20 20 20 20 20 20 20 20 20 20  e_v2",          
e770: 22 74 72 61 6e 73 61 63 74 69 6f 6e 22 2c 0a 20  "transaction",. 
e780: 20 20 20 22 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66     "unlock_notif
e790: 79 22 2c 20 20 20 20 20 20 22 75 70 64 61 74 65  y",      "update
e7a0: 5f 68 6f 6f 6b 22 2c 20 20 20 20 20 20 20 22 76  _hook",       "v
e7b0: 65 72 73 69 6f 6e 22 2c 0a 20 20 20 20 22 77 61  ersion",.    "wa
e7c0: 6c 5f 68 6f 6f 6b 22 2c 0a 20 20 20 20 30 0a 20  l_hook",.    0. 
e7d0: 20 7d 3b 0a 20 20 65 6e 75 6d 20 44 42 5f 65 6e   };.  enum DB_en
e7e0: 75 6d 20 7b 0a 20 20 20 20 44 42 5f 41 55 54 48  um {.    DB_AUTH
e7f0: 4f 52 49 5a 45 52 2c 20 20 20 20 20 20 20 20 44  ORIZER,        D
e800: 42 5f 42 41 43 4b 55 50 2c 20 20 20 20 20 20 20  B_BACKUP,       
e810: 20 20 20 20 44 42 5f 42 55 53 59 2c 0a 20 20 20      DB_BUSY,.   
e820: 20 44 42 5f 43 41 43 48 45 2c 20 20 20 20 20 20   DB_CACHE,      
e830: 20 20 20 20 20 20 20 44 42 5f 43 48 41 4e 47 45         DB_CHANGE
e840: 53 2c 20 20 20 20 20 20 20 20 20 20 44 42 5f 43  S,          DB_C
e850: 4c 4f 53 45 2c 0a 20 20 20 20 44 42 5f 43 4f 4c  LOSE,.    DB_COL
e860: 4c 41 54 45 2c 20 20 20 20 20 20 20 20 20 20 20  LATE,           
e870: 44 42 5f 43 4f 4c 4c 41 54 49 4f 4e 5f 4e 45 45  DB_COLLATION_NEE
e880: 44 45 44 2c 20 44 42 5f 43 4f 4d 4d 49 54 5f 48  DED, DB_COMMIT_H
e890: 4f 4f 4b 2c 0a 20 20 20 20 44 42 5f 43 4f 4d 50  OOK,.    DB_COMP
e8a0: 4c 45 54 45 2c 20 20 20 20 20 20 20 20 20 20 44  LETE,          D
e8b0: 42 5f 43 4f 50 59 2c 20 20 20 20 20 20 20 20 20  B_COPY,         
e8c0: 20 20 20 20 44 42 5f 45 4e 41 42 4c 45 5f 4c 4f      DB_ENABLE_LO
e8d0: 41 44 5f 45 58 54 45 4e 53 49 4f 4e 2c 0a 20 20  AD_EXTENSION,.  
e8e0: 20 20 44 42 5f 45 52 52 4f 52 43 4f 44 45 2c 20    DB_ERRORCODE, 
e8f0: 20 20 20 20 20 20 20 20 44 42 5f 45 56 41 4c 2c          DB_EVAL,
e900: 20 20 20 20 20 20 20 20 20 20 20 20 20 44 42 5f               DB_
e910: 45 58 49 53 54 53 2c 0a 20 20 20 20 44 42 5f 46  EXISTS,.    DB_F
e920: 55 4e 43 54 49 4f 4e 2c 20 20 20 20 20 20 20 20  UNCTION,        
e930: 20 20 44 42 5f 49 4e 43 52 42 4c 4f 42 2c 20 20    DB_INCRBLOB,  
e940: 20 20 20 20 20 20 20 44 42 5f 49 4e 54 45 52 52         DB_INTERR
e950: 55 50 54 2c 0a 20 20 20 20 44 42 5f 4c 41 53 54  UPT,.    DB_LAST
e960: 5f 49 4e 53 45 52 54 5f 52 4f 57 49 44 2c 20 44  _INSERT_ROWID, D
e970: 42 5f 4e 55 4c 4c 56 41 4c 55 45 2c 20 20 20 20  B_NULLVALUE,    
e980: 20 20 20 20 44 42 5f 4f 4e 45 43 4f 4c 55 4d 4e      DB_ONECOLUMN
e990: 2c 0a 20 20 20 20 44 42 5f 50 52 45 55 50 44 41  ,.    DB_PREUPDA
e9a0: 54 45 2c 20 20 20 20 20 20 20 20 20 44 42 5f 50  TE,         DB_P
e9b0: 52 4f 46 49 4c 45 2c 20 20 20 20 20 20 20 20 20  ROFILE,         
e9c0: 20 44 42 5f 50 52 4f 47 52 45 53 53 2c 0a 20 20   DB_PROGRESS,.  
e9d0: 20 20 44 42 5f 52 45 4b 45 59 2c 20 20 20 20 20    DB_REKEY,     
e9e0: 20 20 20 20 20 20 20 20 44 42 5f 52 45 53 54 4f          DB_RESTO
e9f0: 52 45 2c 20 20 20 20 20 20 20 20 20 20 44 42 5f  RE,          DB_
ea00: 52 4f 4c 4c 42 41 43 4b 5f 48 4f 4f 4b 2c 0a 20  ROLLBACK_HOOK,. 
ea10: 20 20 20 44 42 5f 53 54 41 54 55 53 2c 20 20 20     DB_STATUS,   
ea20: 20 20 20 20 20 20 20 20 20 44 42 5f 54 49 4d 45           DB_TIME
ea30: 4f 55 54 2c 20 20 20 20 20 20 20 20 20 20 44 42  OUT,          DB
ea40: 5f 54 4f 54 41 4c 5f 43 48 41 4e 47 45 53 2c 0a  _TOTAL_CHANGES,.
ea50: 20 20 20 20 44 42 5f 54 52 41 43 45 2c 20 20 20      DB_TRACE,   
ea60: 20 20 20 20 20 20 20 20 20 20 44 42 5f 54 52 41            DB_TRA
ea70: 43 45 5f 56 32 2c 20 20 20 20 20 20 20 20 20 44  CE_V2,         D
ea80: 42 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c 0a 20  B_TRANSACTION,. 
ea90: 20 20 20 44 42 5f 55 4e 4c 4f 43 4b 5f 4e 4f 54     DB_UNLOCK_NOT
eaa0: 49 46 59 2c 20 20 20 20 20 44 42 5f 55 50 44 41  IFY,     DB_UPDA
eab0: 54 45 5f 48 4f 4f 4b 2c 20 20 20 20 20 20 44 42  TE_HOOK,      DB
eac0: 5f 56 45 52 53 49 4f 4e 2c 0a 20 20 20 20 44 42  _VERSION,.    DB
ead0: 5f 57 41 4c 5f 48 4f 4f 4b 2c 0a 20 20 7d 3b 0a  _WAL_HOOK,.  };.
eae0: 20 20 2f 2a 20 64 6f 6e 27 74 20 6c 65 61 76 65    /* don't leave
eaf0: 20 74 72 61 69 6c 69 6e 67 20 63 6f 6d 6d 61 73   trailing commas
eb00: 20 6f 6e 20 44 42 5f 65 6e 75 6d 2c 20 69 74 20   on DB_enum, it 
eb10: 63 6f 6e 66 75 73 65 73 20 74 68 65 20 41 49 58  confuses the AIX
eb20: 20 78 6c 63 20 63 6f 6d 70 69 6c 65 72 20 2a 2f   xlc compiler */
eb30: 0a 0a 20 20 69 66 28 20 6f 62 6a 63 3c 32 20 29  ..  if( objc<2 )
eb40: 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
eb50: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
eb60: 2c 20 6f 62 6a 76 2c 20 22 53 55 42 43 4f 4d 4d  , objv, "SUBCOMM
eb70: 41 4e 44 20 2e 2e 2e 22 29 3b 0a 20 20 20 20 72  AND ...");.    r
eb80: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
eb90: 0a 20 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47  .  }.  if( Tcl_G
eba0: 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69  etIndexFromObj(i
ebb0: 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20  nterp, objv[1], 
ebc0: 44 42 5f 73 74 72 73 2c 20 22 6f 70 74 69 6f 6e  DB_strs, "option
ebd0: 22 2c 20 30 2c 20 26 63 68 6f 69 63 65 29 20 29  ", 0, &choice) )
ebe0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  {.    return TCL
ebf0: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 73  _ERROR;.  }..  s
ec00: 77 69 74 63 68 28 20 28 65 6e 75 6d 20 44 42 5f  witch( (enum DB_
ec10: 65 6e 75 6d 29 63 68 6f 69 63 65 20 29 7b 0a 0a  enum)choice ){..
ec20: 20 20 2f 2a 20 20 20 20 24 64 62 20 61 75 74 68    /*    $db auth
ec30: 6f 72 69 7a 65 72 20 3f 43 41 4c 4c 42 41 43 4b  orizer ?CALLBACK
ec40: 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 76 6f  ?.  **.  ** Invo
ec50: 6b 65 20 74 68 65 20 67 69 76 65 6e 20 63 61 6c  ke the given cal
ec60: 6c 62 61 63 6b 20 74 6f 20 61 75 74 68 6f 72 69  lback to authori
ec70: 7a 65 20 65 61 63 68 20 53 51 4c 20 6f 70 65 72  ze each SQL oper
ec80: 61 74 69 6f 6e 20 61 73 20 69 74 20 69 73 0a 20  ation as it is. 
ec90: 20 2a 2a 20 63 6f 6d 70 69 6c 65 64 2e 20 20 35   ** compiled.  5
eca0: 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65 20 61   arguments are a
ecb0: 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 63  ppended to the c
ecc0: 61 6c 6c 62 61 63 6b 20 62 65 66 6f 72 65 20 69  allback before i
ecd0: 74 20 69 73 0a 20 20 2a 2a 20 69 6e 76 6f 6b 65  t is.  ** invoke
ece0: 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 28  d:.  **.  **   (
ecf0: 31 29 20 54 68 65 20 61 75 74 68 6f 72 69 7a 61  1) The authoriza
ed00: 74 69 6f 6e 20 74 79 70 65 20 28 65 78 3a 20 53  tion type (ex: S
ed10: 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 41 42  QLITE_CREATE_TAB
ed20: 4c 45 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45 52  LE, SQLITE_INSER
ed30: 54 2c 20 2e 2e 2e 29 0a 20 20 2a 2a 20 20 20 28  T, ...).  **   (
ed40: 32 29 20 46 69 72 73 74 20 64 65 73 63 72 69 70  2) First descrip
ed50: 74 69 76 65 20 6e 61 6d 65 20 28 64 65 70 65 6e  tive name (depen
ed60: 64 73 20 6f 6e 20 61 75 74 68 6f 72 69 7a 61 74  ds on authorizat
ed70: 69 6f 6e 20 74 79 70 65 29 0a 20 20 2a 2a 20 20  ion type).  **  
ed80: 20 28 33 29 20 53 65 63 6f 6e 64 20 64 65 73 63   (3) Second desc
ed90: 72 69 70 74 69 76 65 20 6e 61 6d 65 0a 20 20 2a  riptive name.  *
eda0: 2a 20 20 20 28 34 29 20 4e 61 6d 65 20 6f 66 20  *   (4) Name of 
edb0: 74 68 65 20 64 61 74 61 62 61 73 65 20 28 65 78  the database (ex
edc0: 3a 20 22 6d 61 69 6e 22 2c 20 22 74 65 6d 70 22  : "main", "temp"
edd0: 29 0a 20 20 2a 2a 20 20 20 28 35 29 20 4e 61 6d  ).  **   (5) Nam
ede0: 65 20 6f 66 20 74 72 69 67 67 65 72 20 74 68 61  e of trigger tha
edf0: 74 20 69 73 20 64 6f 69 6e 67 20 74 68 65 20 61  t is doing the a
ee00: 63 63 65 73 73 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ccess.  **.  ** 
ee10: 54 68 65 20 63 61 6c 6c 62 61 63 6b 20 73 68 6f  The callback sho
ee20: 75 6c 64 20 72 65 74 75 72 6e 20 6f 6e 20 6f 66  uld return on of
ee30: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
ee40: 74 72 69 6e 67 73 3a 20 53 51 4c 49 54 45 5f 4f  trings: SQLITE_O
ee50: 4b 2c 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 49  K,.  ** SQLITE_I
ee60: 47 4e 4f 52 45 2c 20 6f 72 20 53 51 4c 49 54 45  GNORE, or SQLITE
ee70: 5f 44 45 4e 59 2e 20 20 41 6e 79 20 6f 74 68 65  _DENY.  Any othe
ee80: 72 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  r return value i
ee90: 73 20 61 6e 20 65 72 72 6f 72 2e 0a 20 20 2a 2a  s an error..  **
eea0: 0a 20 20 2a 2a 20 49 66 20 74 68 69 73 20 6d 65  .  ** If this me
eeb0: 74 68 6f 64 20 69 73 20 69 6e 76 6f 6b 65 64 20  thod is invoked 
eec0: 77 69 74 68 20 6e 6f 20 61 72 67 75 6d 65 6e 74  with no argument
eed0: 73 2c 20 74 68 65 20 63 75 72 72 65 6e 74 20 61  s, the current a
eee0: 75 74 68 6f 72 69 7a 61 74 69 6f 6e 0a 20 20 2a  uthorization.  *
eef0: 2a 20 63 61 6c 6c 62 61 63 6b 20 73 74 72 69 6e  * callback strin
ef00: 67 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 20  g is returned.. 
ef10: 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 41 55   */.  case DB_AU
ef20: 54 48 4f 52 49 5a 45 52 3a 20 7b 0a 23 69 66 64  THORIZER: {.#ifd
ef30: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
ef40: 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 20  UTHORIZATION.   
ef50: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
ef60: 74 28 69 6e 74 65 72 70 2c 20 22 61 75 74 68 6f  t(interp, "autho
ef70: 72 69 7a 61 74 69 6f 6e 20 6e 6f 74 20 61 76 61  rization not ava
ef80: 69 6c 61 62 6c 65 20 69 6e 20 74 68 69 73 20 62  ilable in this b
ef90: 75 69 6c 64 22 2c 0a 20 20 20 20 20 20 20 20 20  uild",.         
efa0: 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
efb0: 72 2a 29 30 29 3b 0a 20 20 20 20 72 65 74 75 72  r*)0);.    retur
efc0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c  n TCL_ERROR;.#el
efd0: 73 65 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3e  se.    if( objc>
efe0: 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57  3 ){.      Tcl_W
eff0: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
f000: 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 43  rp, 2, objv, "?C
f010: 41 4c 4c 42 41 43 4b 3f 22 29 3b 0a 20 20 20 20  ALLBACK?");.    
f020: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
f030: 4f 52 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  OR;.    }else if
f040: 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20  ( objc==2 ){.   
f050: 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 41 75 74     if( pDb->zAut
f060: 68 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c  h ){.        Tcl
f070: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
f080: 74 65 72 70 2c 20 70 44 62 2d 3e 7a 41 75 74 68  terp, pDb->zAuth
f090: 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20  , (char*)0);.   
f0a0: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
f0b0: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 41 75 74        char *zAut
f0c0: 68 3b 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e  h;.      int len
f0d0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d  ;.      if( pDb-
f0e0: 3e 7a 41 75 74 68 20 29 7b 0a 20 20 20 20 20 20  >zAuth ){.      
f0f0: 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e    Tcl_Free(pDb->
f100: 7a 41 75 74 68 29 3b 0a 20 20 20 20 20 20 7d 0a  zAuth);.      }.
f110: 20 20 20 20 20 20 7a 41 75 74 68 20 3d 20 54 63        zAuth = Tc
f120: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
f130: 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e  bj(objv[2], &len
f140: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 41 75  );.      if( zAu
f150: 74 68 20 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20  th && len>0 ){. 
f160: 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 41 75 74         pDb->zAut
f170: 68 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c  h = Tcl_Alloc( l
f180: 65 6e 20 2b 20 31 20 29 3b 0a 20 20 20 20 20 20  en + 1 );.      
f190: 20 20 6d 65 6d 63 70 79 28 70 44 62 2d 3e 7a 41    memcpy(pDb->zA
f1a0: 75 74 68 2c 20 7a 41 75 74 68 2c 20 6c 65 6e 2b  uth, zAuth, len+
f1b0: 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  1);.      }else{
f1c0: 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 41  .        pDb->zA
f1d0: 75 74 68 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  uth = 0;.      }
f1e0: 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e  .      if( pDb->
f1f0: 7a 41 75 74 68 20 29 7b 0a 20 20 20 20 20 20 20  zAuth ){.       
f200: 20 74 79 70 65 64 65 66 20 69 6e 74 20 28 2a 73   typedef int (*s
f210: 71 6c 69 74 65 33 5f 61 75 74 68 5f 63 62 29 28  qlite3_auth_cb)(
f220: 0a 20 20 20 20 20 20 20 20 20 20 20 76 6f 69 64  .           void
f230: 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 63 68 61 72  *,int,const char
f240: 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c 0a 20  *,const char*,. 
f250: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20            const 
f260: 63 68 61 72 2a 2c 63 6f 6e 73 74 20 63 68 61 72  char*,const char
f270: 2a 29 3b 0a 20 20 20 20 20 20 20 20 70 44 62 2d  *);.        pDb-
f280: 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70  >interp = interp
f290: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
f2a0: 33 5f 73 65 74 5f 61 75 74 68 6f 72 69 7a 65 72  3_set_authorizer
f2b0: 28 70 44 62 2d 3e 64 62 2c 28 73 71 6c 69 74 65  (pDb->db,(sqlite
f2c0: 33 5f 61 75 74 68 5f 63 62 29 61 75 74 68 5f 63  3_auth_cb)auth_c
f2d0: 61 6c 6c 62 61 63 6b 2c 70 44 62 29 3b 0a 20 20  allback,pDb);.  
f2e0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
f2f0: 20 20 20 73 71 6c 69 74 65 33 5f 73 65 74 5f 61     sqlite3_set_a
f300: 75 74 68 6f 72 69 7a 65 72 28 70 44 62 2d 3e 64  uthorizer(pDb->d
f310: 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  b, 0, 0);.      
f320: 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  }.    }.#endif. 
f330: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
f340: 20 2f 2a 20 20 20 20 24 64 62 20 62 61 63 6b 75   /*    $db backu
f350: 70 20 3f 44 41 54 41 42 41 53 45 3f 20 46 49 4c  p ?DATABASE? FIL
f360: 45 4e 41 4d 45 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ENAME.  **.  ** 
f370: 4f 70 65 6e 20 6f 72 20 63 72 65 61 74 65 20 61  Open or create a
f380: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e   database file n
f390: 61 6d 65 64 20 46 49 4c 45 4e 41 4d 45 2e 20 20  amed FILENAME.  
f3a0: 54 72 61 6e 73 66 65 72 20 74 68 65 0a 20 20 2a  Transfer the.  *
f3b0: 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20 6c 6f 63  * content of loc
f3c0: 61 6c 20 64 61 74 61 62 61 73 65 20 44 41 54 41  al database DATA
f3d0: 42 41 53 45 20 28 64 65 66 61 75 6c 74 3a 20 22  BASE (default: "
f3e0: 6d 61 69 6e 22 29 20 69 6e 74 6f 20 74 68 65 0a  main") into the.
f3f0: 20 20 2a 2a 20 46 49 4c 45 4e 41 4d 45 20 64 61    ** FILENAME da
f400: 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 63  tabase..  */.  c
f410: 61 73 65 20 44 42 5f 42 41 43 4b 55 50 3a 20 7b  ase DB_BACKUP: {
f420: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
f430: 2a 7a 44 65 73 74 46 69 6c 65 3b 0a 20 20 20 20  *zDestFile;.    
f440: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 72 63  const char *zSrc
f450: 44 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 20  Db;.    sqlite3 
f460: 2a 70 44 65 73 74 3b 0a 20 20 20 20 73 71 6c 69  *pDest;.    sqli
f470: 74 65 33 5f 62 61 63 6b 75 70 20 2a 70 42 61 63  te3_backup *pBac
f480: 6b 75 70 3b 0a 0a 20 20 20 20 69 66 28 20 6f 62  kup;..    if( ob
f490: 6a 63 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20 7a  jc==3 ){.      z
f4a0: 53 72 63 44 62 20 3d 20 22 6d 61 69 6e 22 3b 0a  SrcDb = "main";.
f4b0: 20 20 20 20 20 20 7a 44 65 73 74 46 69 6c 65 20        zDestFile 
f4c0: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  = Tcl_GetString(
f4d0: 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 20 20 7d 65  objv[2]);.    }e
f4e0: 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d 34 20  lse if( objc==4 
f4f0: 29 7b 0a 20 20 20 20 20 20 7a 53 72 63 44 62 20  ){.      zSrcDb 
f500: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  = Tcl_GetString(
f510: 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 20 20 20 20  objv[2]);.      
f520: 7a 44 65 73 74 46 69 6c 65 20 3d 20 54 63 6c 5f  zDestFile = Tcl_
f530: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33  GetString(objv[3
f540: 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ]);.    }else{. 
f550: 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
f560: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
f570: 20 6f 62 6a 76 2c 20 22 3f 44 41 54 41 42 41 53   objv, "?DATABAS
f580: 45 3f 20 46 49 4c 45 4e 41 4d 45 22 29 3b 0a 20  E? FILENAME");. 
f590: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
f5a0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
f5b0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 6f 70   rc = sqlite3_op
f5c0: 65 6e 5f 76 32 28 7a 44 65 73 74 46 69 6c 65 2c  en_v2(zDestFile,
f5d0: 20 26 70 44 65 73 74 2c 0a 20 20 20 20 20 20 20   &pDest,.       
f5e0: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
f5f0: 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20  PEN_READWRITE | 
f600: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
f610: 54 45 7c 20 70 44 62 2d 3e 6f 70 65 6e 46 6c 61  TE| pDb->openFla
f620: 67 73 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  gs, 0);.    if( 
f630: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
f640: 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  .      Tcl_Appen
f650: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
f660: 22 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 74 61 72  "cannot open tar
f670: 67 65 74 20 64 61 74 61 62 61 73 65 3a 20 22 2c  get database: ",
f680: 0a 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  .           sqli
f690: 74 65 33 5f 65 72 72 6d 73 67 28 70 44 65 73 74  te3_errmsg(pDest
f6a0: 29 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  ), (char*)0);.  
f6b0: 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73      sqlite3_clos
f6c0: 65 28 70 44 65 73 74 29 3b 0a 20 20 20 20 20 20  e(pDest);.      
f6d0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
f6e0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 61 63  ;.    }.    pBac
f6f0: 6b 75 70 20 3d 20 73 71 6c 69 74 65 33 5f 62 61  kup = sqlite3_ba
f700: 63 6b 75 70 5f 69 6e 69 74 28 70 44 65 73 74 2c  ckup_init(pDest,
f710: 20 22 6d 61 69 6e 22 2c 20 70 44 62 2d 3e 64 62   "main", pDb->db
f720: 2c 20 7a 53 72 63 44 62 29 3b 0a 20 20 20 20 69  , zSrcDb);.    i
f730: 66 28 20 70 42 61 63 6b 75 70 3d 3d 30 20 29 7b  f( pBackup==0 ){
f740: 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  .      Tcl_Appen
f750: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
f760: 22 62 61 63 6b 75 70 20 66 61 69 6c 65 64 3a 20  "backup failed: 
f770: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 73 71  ",.           sq
f780: 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44 65  lite3_errmsg(pDe
f790: 73 74 29 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  st), (char*)0);.
f7a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c        sqlite3_cl
f7b0: 6f 73 65 28 70 44 65 73 74 29 3b 0a 20 20 20 20  ose(pDest);.    
f7c0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
f7d0: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 68  OR;.    }.    wh
f7e0: 69 6c 65 28 20 20 28 72 63 20 3d 20 73 71 6c 69  ile(  (rc = sqli
f7f0: 74 65 33 5f 62 61 63 6b 75 70 5f 73 74 65 70 28  te3_backup_step(
f800: 70 42 61 63 6b 75 70 2c 31 30 30 29 29 3d 3d 53  pBackup,100))==S
f810: 51 4c 49 54 45 5f 4f 4b 20 29 7b 7d 0a 20 20 20  QLITE_OK ){}.   
f820: 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f   sqlite3_backup_
f830: 66 69 6e 69 73 68 28 70 42 61 63 6b 75 70 29 3b  finish(pBackup);
f840: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
f850: 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20  ITE_DONE ){.    
f860: 20 20 72 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20    rc = TCL_OK;. 
f870: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
f880: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
f890: 28 69 6e 74 65 72 70 2c 20 22 62 61 63 6b 75 70  (interp, "backup
f8a0: 20 66 61 69 6c 65 64 3a 20 22 2c 0a 20 20 20 20   failed: ",.    
f8b0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65         sqlite3_e
f8c0: 72 72 6d 73 67 28 70 44 65 73 74 29 2c 20 28 63  rrmsg(pDest), (c
f8d0: 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 72  har*)0);.      r
f8e0: 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  c = TCL_ERROR;. 
f8f0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
f900: 5f 63 6c 6f 73 65 28 70 44 65 73 74 29 3b 0a 20  _close(pDest);. 
f910: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
f920: 20 2f 2a 20 20 20 20 24 64 62 20 62 75 73 79 20   /*    $db busy 
f930: 3f 43 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a 0a  ?CALLBACK?.  **.
f940: 20 20 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20    ** Invoke the 
f950: 67 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b 20 69  given callback i
f960: 66 20 61 6e 20 53 51 4c 20 73 74 61 74 65 6d 65  f an SQL stateme
f970: 6e 74 20 61 74 74 65 6d 70 74 73 20 74 6f 20 6f  nt attempts to o
f980: 70 65 6e 0a 20 20 2a 2a 20 61 20 6c 6f 63 6b 65  pen.  ** a locke
f990: 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  d database file.
f9a0: 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f  .  */.  case DB_
f9b0: 42 55 53 59 3a 20 7b 0a 20 20 20 20 69 66 28 20  BUSY: {.    if( 
f9c0: 6f 62 6a 63 3e 33 20 29 7b 0a 20 20 20 20 20 20  objc>3 ){.      
f9d0: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
f9e0: 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76  (interp, 2, objv
f9f0: 2c 20 22 43 41 4c 4c 42 41 43 4b 22 29 3b 0a 20  , "CALLBACK");. 
fa00: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
fa10: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73 65  ERROR;.    }else
fa20: 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a   if( objc==2 ){.
fa30: 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a        if( pDb->z
fa40: 42 75 73 79 20 29 7b 0a 20 20 20 20 20 20 20 20  Busy ){.        
fa50: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
fa60: 28 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a 42  (interp, pDb->zB
fa70: 75 73 79 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  usy, (char*)0);.
fa80: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
fa90: 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  e{.      char *z
faa0: 42 75 73 79 3b 0a 20 20 20 20 20 20 69 6e 74 20  Busy;.      int 
fab0: 6c 65 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 70  len;.      if( p
fac0: 44 62 2d 3e 7a 42 75 73 79 20 29 7b 0a 20 20 20  Db->zBusy ){.   
fad0: 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44       Tcl_Free(pD
fae0: 62 2d 3e 7a 42 75 73 79 29 3b 0a 20 20 20 20 20  b->zBusy);.     
faf0: 20 7d 0a 20 20 20 20 20 20 7a 42 75 73 79 20 3d   }.      zBusy =
fb00: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
fb10: 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26  omObj(objv[2], &
fb20: 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20  len);.      if( 
fb30: 7a 42 75 73 79 20 26 26 20 6c 65 6e 3e 30 20 29  zBusy && len>0 )
fb40: 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a  {.        pDb->z
fb50: 42 75 73 79 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63  Busy = Tcl_Alloc
fb60: 28 20 6c 65 6e 20 2b 20 31 20 29 3b 0a 20 20 20  ( len + 1 );.   
fb70: 20 20 20 20 20 6d 65 6d 63 70 79 28 70 44 62 2d       memcpy(pDb-
fb80: 3e 7a 42 75 73 79 2c 20 7a 42 75 73 79 2c 20 6c  >zBusy, zBusy, l
fb90: 65 6e 2b 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c  en+1);.      }el
fba0: 73 65 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d  se{.        pDb-
fbb0: 3e 7a 42 75 73 79 20 3d 20 30 3b 0a 20 20 20 20  >zBusy = 0;.    
fbc0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 44    }.      if( pD
fbd0: 62 2d 3e 7a 42 75 73 79 20 29 7b 0a 20 20 20 20  b->zBusy ){.    
fbe0: 20 20 20 20 70 44 62 2d 3e 69 6e 74 65 72 70 20      pDb->interp 
fbf0: 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 20 20  = interp;.      
fc00: 20 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 68    sqlite3_busy_h
fc10: 61 6e 64 6c 65 72 28 70 44 62 2d 3e 64 62 2c 20  andler(pDb->db, 
fc20: 44 62 42 75 73 79 48 61 6e 64 6c 65 72 2c 20 70  DbBusyHandler, p
fc30: 44 62 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  Db);.      }else
fc40: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
fc50: 33 5f 62 75 73 79 5f 68 61 6e 64 6c 65 72 28 70  3_busy_handler(p
fc60: 44 62 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20  Db->db, 0, 0);. 
fc70: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
fc80: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
fc90: 2a 20 20 20 20 20 24 64 62 20 63 61 63 68 65 20  *     $db cache 
fca0: 66 6c 75 73 68 0a 20 20 2a 2a 20 20 20 20 20 24  flush.  **     $
fcb0: 64 62 20 63 61 63 68 65 20 73 69 7a 65 20 6e 0a  db cache size n.
fcc0: 20 20 2a 2a 0a 20 20 2a 2a 20 46 6c 75 73 68 20    **.  ** Flush 
fcd0: 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61  the prepared sta
fce0: 74 65 6d 65 6e 74 20 63 61 63 68 65 2c 20 6f 72  tement cache, or
fcf0: 20 73 65 74 20 74 68 65 20 6d 61 78 69 6d 75 6d   set the maximum
fd00: 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 2a 2a 20   number of.  ** 
fd10: 63 61 63 68 65 64 20 73 74 61 74 65 6d 65 6e 74  cached statement
fd20: 73 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  s..  */.  case D
fd30: 42 5f 43 41 43 48 45 3a 20 7b 0a 20 20 20 20 63  B_CACHE: {.    c
fd40: 68 61 72 20 2a 73 75 62 43 6d 64 3b 0a 20 20 20  har *subCmd;.   
fd50: 20 69 6e 74 20 6e 3b 0a 0a 20 20 20 20 69 66 28   int n;..    if(
fd60: 20 6f 62 6a 63 3c 3d 32 20 29 7b 0a 20 20 20 20   objc<=2 ){.    
fd70: 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
fd80: 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
fd90: 6a 76 2c 20 22 63 61 63 68 65 20 6f 70 74 69 6f  jv, "cache optio
fda0: 6e 20 3f 61 72 67 3f 22 29 3b 0a 20 20 20 20 20  n ?arg?");.     
fdb0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
fdc0: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 75 62  R;.    }.    sub
fdd0: 43 6d 64 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  Cmd = Tcl_GetStr
fde0: 69 6e 67 46 72 6f 6d 4f 62 6a 28 20 6f 62 6a 76  ingFromObj( objv
fdf0: 5b 32 5d 2c 20 30 20 29 3b 0a 20 20 20 20 69 66  [2], 0 );.    if
fe00: 28 20 2a 73 75 62 43 6d 64 3d 3d 27 66 27 20 26  ( *subCmd=='f' &
fe10: 26 20 73 74 72 63 6d 70 28 73 75 62 43 6d 64 2c  & strcmp(subCmd,
fe20: 22 66 6c 75 73 68 22 29 3d 3d 30 20 29 7b 0a 20  "flush")==0 ){. 
fe30: 20 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 33       if( objc!=3
fe40: 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f   ){.        Tcl_
fe50: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
fe60: 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 66  erp, 2, objv, "f
fe70: 6c 75 73 68 22 29 3b 0a 20 20 20 20 20 20 20 20  lush");.        
fe80: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
fe90: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
fea0: 20 20 20 20 20 20 20 66 6c 75 73 68 53 74 6d 74         flushStmt
feb0: 43 61 63 68 65 28 20 70 44 62 20 29 3b 0a 20 20  Cache( pDb );.  
fec0: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
fed0: 69 66 28 20 2a 73 75 62 43 6d 64 3d 3d 27 73 27  if( *subCmd=='s'
fee0: 20 26 26 20 73 74 72 63 6d 70 28 73 75 62 43 6d   && strcmp(subCm
fef0: 64 2c 22 73 69 7a 65 22 29 3d 3d 30 20 29 7b 0a  d,"size")==0 ){.
ff00: 20 20 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d        if( objc!=
ff10: 34 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c  4 ){.        Tcl
ff20: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
ff30: 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22  terp, 2, objv, "
ff40: 73 69 7a 65 20 6e 22 29 3b 0a 20 20 20 20 20 20  size n");.      
ff50: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
ff60: 4f 52 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  OR;.      }else{
ff70: 0a 20 20 20 20 20 20 20 20 69 66 28 20 54 43 4c  .        if( TCL
ff80: 5f 45 52 52 4f 52 3d 3d 54 63 6c 5f 47 65 74 49  _ERROR==Tcl_GetI
ff90: 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
ffa0: 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 6e 29 20 29  , objv[3], &n) )
ffb0: 7b 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f  {.          Tcl_
ffc0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 20 69 6e  AppendResult( in
ffd0: 74 65 72 70 2c 20 22 63 61 6e 6e 6f 74 20 63 6f  terp, "cannot co
ffe0: 6e 76 65 72 74 20 5c 22 22 2c 0a 20 20 20 20 20  nvert \"",.     
fff0: 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65            Tcl_Ge
10000 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
10010 62 6a 76 5b 33 5d 2c 30 29 2c 20 22 5c 22 20 74  bjv[3],0), "\" t
10020 6f 20 69 6e 74 65 67 65 72 22 2c 20 28 63 68 61  o integer", (cha
10030 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 20 20 20  r*)0);.         
10040 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
10050 52 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  R;.        }else
10060 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
10070 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  n<0 ){.         
10080 20 20 20 66 6c 75 73 68 53 74 6d 74 43 61 63 68     flushStmtCach
10090 65 28 20 70 44 62 20 29 3b 0a 20 20 20 20 20 20  e( pDb );.      
100a0 20 20 20 20 20 20 6e 20 3d 20 30 3b 0a 20 20 20        n = 0;.   
100b0 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
100c0 20 6e 3e 4d 41 58 5f 50 52 45 50 41 52 45 44 5f   n>MAX_PREPARED_
100d0 53 54 4d 54 53 20 29 7b 0a 20 20 20 20 20 20 20  STMTS ){.       
100e0 20 20 20 20 20 6e 20 3d 20 4d 41 58 5f 50 52 45       n = MAX_PRE
100f0 50 41 52 45 44 5f 53 54 4d 54 53 3b 0a 20 20 20  PARED_STMTS;.   
10100 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
10110 20 20 20 70 44 62 2d 3e 6d 61 78 53 74 6d 74 20     pDb->maxStmt 
10120 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = n;.        }. 
10130 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
10140 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65  {.      Tcl_Appe
10150 6e 64 52 65 73 75 6c 74 28 20 69 6e 74 65 72 70  ndResult( interp
10160 2c 20 22 62 61 64 20 6f 70 74 69 6f 6e 20 5c 22  , "bad option \"
10170 22 2c 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c  ",.          Tcl
10180 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
10190 6a 28 6f 62 6a 76 5b 32 5d 2c 30 29 2c 20 22 5c  j(objv[2],0), "\
101a0 22 3a 20 6d 75 73 74 20 62 65 20 66 6c 75 73 68  ": must be flush
101b0 20 6f 72 20 73 69 7a 65 22 2c 0a 20 20 20 20 20   or size",.     
101c0 20 20 20 20 20 28 63 68 61 72 2a 29 30 29 3b 0a       (char*)0);.
101d0 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
101e0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
101f0 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
10200 2f 2a 20 20 20 20 20 24 64 62 20 63 68 61 6e 67  /*     $db chang
10210 65 73 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74  es.  **.  ** Ret
10220 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
10230 66 20 72 6f 77 73 20 74 68 61 74 20 77 65 72 65  f rows that were
10240 20 6d 6f 64 69 66 69 65 64 2c 20 69 6e 73 65 72   modified, inser
10250 74 65 64 2c 20 6f 72 20 64 65 6c 65 74 65 64 20  ted, or deleted 
10260 62 79 0a 20 20 2a 2a 20 74 68 65 20 6d 6f 73 74  by.  ** the most
10270 20 72 65 63 65 6e 74 20 49 4e 53 45 52 54 2c 20   recent INSERT, 
10280 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45  UPDATE or DELETE
10290 20 73 74 61 74 65 6d 65 6e 74 2c 20 6e 6f 74 20   statement, not 
102a0 69 6e 63 6c 75 64 69 6e 67 0a 20 20 2a 2a 20 61  including.  ** a
102b0 6e 79 20 63 68 61 6e 67 65 73 20 6d 61 64 65 20  ny changes made 
102c0 62 79 20 74 72 69 67 67 65 72 20 70 72 6f 67 72  by trigger progr
102d0 61 6d 73 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  ams..  */.  case
102e0 20 44 42 5f 43 48 41 4e 47 45 53 3a 20 7b 0a 20   DB_CHANGES: {. 
102f0 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 73     Tcl_Obj *pRes
10300 75 6c 74 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a  ult;.    if( obj
10310 63 21 3d 32 20 29 7b 0a 20 20 20 20 20 20 54 63  c!=2 ){.      Tc
10320 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
10330 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
10340 22 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  "");.      retur
10350 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
10360 20 7d 0a 20 20 20 20 70 52 65 73 75 6c 74 20 3d   }.    pResult =
10370 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c   Tcl_GetObjResul
10380 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54  t(interp);.    T
10390 63 6c 5f 53 65 74 49 6e 74 4f 62 6a 28 70 52 65  cl_SetIntObj(pRe
103a0 73 75 6c 74 2c 20 73 71 6c 69 74 65 33 5f 63 68  sult, sqlite3_ch
103b0 61 6e 67 65 73 28 70 44 62 2d 3e 64 62 29 29 3b  anges(pDb->db));
103c0 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
103d0 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 63 6c 6f  .  /*    $db clo
103e0 73 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 68 75  se.  **.  ** Shu
103f0 74 64 6f 77 6e 20 74 68 65 20 64 61 74 61 62 61  tdown the databa
10400 73 65 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  se.  */.  case D
10410 42 5f 43 4c 4f 53 45 3a 20 7b 0a 20 20 20 20 54  B_CLOSE: {.    T
10420 63 6c 5f 44 65 6c 65 74 65 43 6f 6d 6d 61 6e 64  cl_DeleteCommand
10430 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
10440 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
10450 6a 76 5b 30 5d 2c 20 30 29 29 3b 0a 20 20 20 20  jv[0], 0));.    
10460 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
10470 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20 63 6f  .  **     $db co
10480 6c 6c 61 74 65 20 4e 41 4d 45 20 53 43 52 49 50  llate NAME SCRIP
10490 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 72 65 61  T.  **.  ** Crea
104a0 74 65 20 61 20 6e 65 77 20 53 51 4c 20 63 6f 6c  te a new SQL col
104b0 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20  lation function 
104c0 63 61 6c 6c 65 64 20 4e 41 4d 45 2e 20 20 57 68  called NAME.  Wh
104d0 65 6e 65 76 65 72 0a 20 20 2a 2a 20 74 68 61 74  enever.  ** that
104e0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
104f0 6c 65 64 2c 20 69 6e 76 6f 6b 65 20 53 43 52 49  led, invoke SCRI
10500 50 54 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74  PT to evaluate t
10510 68 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a  he function..  *
10520 2f 0a 20 20 63 61 73 65 20 44 42 5f 43 4f 4c 4c  /.  case DB_COLL
10530 41 54 45 3a 20 7b 0a 20 20 20 20 53 71 6c 43 6f  ATE: {.    SqlCo
10540 6c 6c 61 74 65 20 2a 70 43 6f 6c 6c 61 74 65 3b  llate *pCollate;
10550 0a 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65  .    char *zName
10560 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 63 72  ;.    char *zScr
10570 69 70 74 3b 0a 20 20 20 20 69 6e 74 20 6e 53 63  ipt;.    int nSc
10580 72 69 70 74 3b 0a 20 20 20 20 69 66 28 20 6f 62  ript;.    if( ob
10590 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 20 20 54  jc!=4 ){.      T
105a0 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
105b0 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c  interp, 2, objv,
105c0 20 22 4e 41 4d 45 20 53 43 52 49 50 54 22 29 3b   "NAME SCRIPT");
105d0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
105e0 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
105f0 20 20 20 7a 4e 61 6d 65 20 3d 20 54 63 6c 5f 47     zName = Tcl_G
10600 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
10610 6f 62 6a 76 5b 32 5d 2c 20 30 29 3b 0a 20 20 20  objv[2], 0);.   
10620 20 7a 53 63 72 69 70 74 20 3d 20 54 63 6c 5f 47   zScript = Tcl_G
10630 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
10640 6f 62 6a 76 5b 33 5d 2c 20 26 6e 53 63 72 69 70  objv[3], &nScrip
10650 74 29 3b 0a 20 20 20 20 70 43 6f 6c 6c 61 74 65  t);.    pCollate
10660 20 3d 20 28 53 71 6c 43 6f 6c 6c 61 74 65 2a 29   = (SqlCollate*)
10670 54 63 6c 5f 41 6c 6c 6f 63 28 20 73 69 7a 65 6f  Tcl_Alloc( sizeo
10680 66 28 2a 70 43 6f 6c 6c 61 74 65 29 20 2b 20 6e  f(*pCollate) + n
10690 53 63 72 69 70 74 20 2b 20 31 20 29 3b 0a 20 20  Script + 1 );.  
106a0 20 20 69 66 28 20 70 43 6f 6c 6c 61 74 65 3d 3d    if( pCollate==
106b0 30 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  0 ) return TCL_E
106c0 52 52 4f 52 3b 0a 20 20 20 20 70 43 6f 6c 6c 61  RROR;.    pColla
106d0 74 65 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74  te->interp = int
106e0 65 72 70 3b 0a 20 20 20 20 70 43 6f 6c 6c 61 74  erp;.    pCollat
106f0 65 2d 3e 70 4e 65 78 74 20 3d 20 70 44 62 2d 3e  e->pNext = pDb->
10700 70 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 70 43  pCollate;.    pC
10710 6f 6c 6c 61 74 65 2d 3e 7a 53 63 72 69 70 74 20  ollate->zScript 
10720 3d 20 28 63 68 61 72 2a 29 26 70 43 6f 6c 6c 61  = (char*)&pColla
10730 74 65 5b 31 5d 3b 0a 20 20 20 20 70 44 62 2d 3e  te[1];.    pDb->
10740 70 43 6f 6c 6c 61 74 65 20 3d 20 70 43 6f 6c 6c  pCollate = pColl
10750 61 74 65 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  ate;.    memcpy(
10760 70 43 6f 6c 6c 61 74 65 2d 3e 7a 53 63 72 69 70  pCollate->zScrip
10770 74 2c 20 7a 53 63 72 69 70 74 2c 20 6e 53 63 72  t, zScript, nScr
10780 69 70 74 2b 31 29 3b 0a 20 20 20 20 69 66 28 20  ipt+1);.    if( 
10790 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63  sqlite3_create_c
107a0 6f 6c 6c 61 74 69 6f 6e 28 70 44 62 2d 3e 64 62  ollation(pDb->db
107b0 2c 20 7a 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f  , zName, SQLITE_
107c0 55 54 46 38 2c 0a 20 20 20 20 20 20 20 20 70 43  UTF8,.        pC
107d0 6f 6c 6c 61 74 65 2c 20 74 63 6c 53 71 6c 43 6f  ollate, tclSqlCo
107e0 6c 6c 61 74 65 29 20 29 7b 0a 20 20 20 20 20 20  llate) ){.      
107f0 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
10800 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 73 71  terp, (char *)sq
10810 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62  lite3_errmsg(pDb
10820 2d 3e 64 62 29 2c 20 54 43 4c 5f 56 4f 4c 41 54  ->db), TCL_VOLAT
10830 49 4c 45 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ILE);.      retu
10840 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
10850 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20    }.    break;. 
10860 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20   }..  /*.  **   
10870 20 20 24 64 62 20 63 6f 6c 6c 61 74 69 6f 6e 5f    $db collation_
10880 6e 65 65 64 65 64 20 53 43 52 49 50 54 0a 20 20  needed SCRIPT.  
10890 2a 2a 0a 20 20 2a 2a 20 43 72 65 61 74 65 20 61  **.  ** Create a
108a0 20 6e 65 77 20 53 51 4c 20 63 6f 6c 6c 61 74 69   new SQL collati
108b0 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c  on function call
108c0 65 64 20 4e 41 4d 45 2e 20 20 57 68 65 6e 65 76  ed NAME.  Whenev
108d0 65 72 0a 20 20 2a 2a 20 74 68 61 74 20 66 75 6e  er.  ** that fun
108e0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
108f0 20 69 6e 76 6f 6b 65 20 53 43 52 49 50 54 20 74   invoke SCRIPT t
10900 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65 20 66  o evaluate the f
10910 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20  unction..  */.  
10920 63 61 73 65 20 44 42 5f 43 4f 4c 4c 41 54 49 4f  case DB_COLLATIO
10930 4e 5f 4e 45 45 44 45 44 3a 20 7b 0a 20 20 20 20  N_NEEDED: {.    
10940 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20  if( objc!=3 ){. 
10950 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
10960 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
10970 20 6f 62 6a 76 2c 20 22 53 43 52 49 50 54 22 29   objv, "SCRIPT")
10980 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
10990 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
109a0 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 43 6f      if( pDb->pCo
109b0 6c 6c 61 74 65 4e 65 65 64 65 64 20 29 7b 0a 20  llateNeeded ){. 
109c0 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66       Tcl_DecrRef
109d0 43 6f 75 6e 74 28 70 44 62 2d 3e 70 43 6f 6c 6c  Count(pDb->pColl
109e0 61 74 65 4e 65 65 64 65 64 29 3b 0a 20 20 20 20  ateNeeded);.    
109f0 7d 0a 20 20 20 20 70 44 62 2d 3e 70 43 6f 6c 6c  }.    pDb->pColl
10a00 61 74 65 4e 65 65 64 65 64 20 3d 20 54 63 6c 5f  ateNeeded = Tcl_
10a10 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 6f 62 6a  DuplicateObj(obj
10a20 76 5b 32 5d 29 3b 0a 20 20 20 20 54 63 6c 5f 49  v[2]);.    Tcl_I
10a30 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 44 62 2d  ncrRefCount(pDb-
10a40 3e 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64 29  >pCollateNeeded)
10a50 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f  ;.    sqlite3_co
10a60 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64 28 70  llation_needed(p
10a70 44 62 2d 3e 64 62 2c 20 70 44 62 2c 20 74 63 6c  Db->db, pDb, tcl
10a80 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64 29 3b 0a  CollateNeeded);.
10a90 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
10aa0 20 20 2f 2a 20 20 20 20 24 64 62 20 63 6f 6d 6d    /*    $db comm
10ab0 69 74 5f 68 6f 6f 6b 20 3f 43 41 4c 4c 42 41 43  it_hook ?CALLBAC
10ac0 4b 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 76  K?.  **.  ** Inv
10ad0 6f 6b 65 20 74 68 65 20 67 69 76 65 6e 20 63 61  oke the given ca
10ae0 6c 6c 62 61 63 6b 20 6a 75 73 74 20 62 65 66 6f  llback just befo
10af0 72 65 20 63 6f 6d 6d 69 74 74 69 6e 67 20 65 76  re committing ev
10b00 65 72 79 20 53 51 4c 20 74 72 61 6e 73 61 63 74  ery SQL transact
10b10 69 6f 6e 2e 0a 20 20 2a 2a 20 49 66 20 74 68 65  ion..  ** If the
10b20 20 63 61 6c 6c 62 61 63 6b 20 74 68 72 6f 77 73   callback throws
10b30 20 61 6e 20 65 78 63 65 70 74 69 6f 6e 20 6f 72   an exception or
10b40 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72   returns non-zer
10b50 6f 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 2a 2a  o, then the.  **
10b60 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
10b70 61 62 6f 72 74 65 64 2e 20 20 49 66 20 43 41 4c  aborted.  If CAL
10b80 4c 42 41 43 4b 20 69 73 20 61 6e 20 65 6d 70 74  LBACK is an empt
10b90 79 20 73 74 72 69 6e 67 2c 20 74 68 65 20 63 61  y string, the ca
10ba0 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 69 73 20 64  llback.  ** is d
10bb0 69 73 61 62 6c 65 64 2e 0a 20 20 2a 2f 0a 20 20  isabled..  */.  
10bc0 63 61 73 65 20 44 42 5f 43 4f 4d 4d 49 54 5f 48  case DB_COMMIT_H
10bd0 4f 4f 4b 3a 20 7b 0a 20 20 20 20 69 66 28 20 6f  OOK: {.    if( o
10be0 62 6a 63 3e 33 20 29 7b 0a 20 20 20 20 20 20 54  bjc>3 ){.      T
10bf0 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
10c00 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c  interp, 2, objv,
10c10 20 22 3f 43 41 4c 4c 42 41 43 4b 3f 22 29 3b 0a   "?CALLBACK?");.
10c20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
10c30 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73  _ERROR;.    }els
10c40 65 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b  e if( objc==2 ){
10c50 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e  .      if( pDb->
10c60 7a 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 20  zCommit ){.     
10c70 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
10c80 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 44 62 2d  ult(interp, pDb-
10c90 3e 7a 43 6f 6d 6d 69 74 2c 20 28 63 68 61 72 2a  >zCommit, (char*
10ca0 29 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  )0);.      }.   
10cb0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 6f   }else{.      co
10cc0 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6d 6d 69  nst char *zCommi
10cd0 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e  t;.      int len
10ce0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d  ;.      if( pDb-
10cf0 3e 7a 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20  >zCommit ){.    
10d00 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62      Tcl_Free(pDb
10d10 2d 3e 7a 43 6f 6d 6d 69 74 29 3b 0a 20 20 20 20  ->zCommit);.    
10d20 20 20 7d 0a 20 20 20 20 20 20 7a 43 6f 6d 6d 69    }.      zCommi
10d30 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  t = Tcl_GetStrin
10d40 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d  gFromObj(objv[2]
10d50 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69  , &len);.      i
10d60 66 28 20 7a 43 6f 6d 6d 69 74 20 26 26 20 6c 65  f( zCommit && le
10d70 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  n>0 ){.        p
10d80 44 62 2d 3e 7a 43 6f 6d 6d 69 74 20 3d 20 54 63  Db->zCommit = Tc
10d90 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20 31  l_Alloc( len + 1
10da0 20 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63   );.        memc
10db0 70 79 28 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 2c  py(pDb->zCommit,
10dc0 20 7a 43 6f 6d 6d 69 74 2c 20 6c 65 6e 2b 31 29   zCommit, len+1)
10dd0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
10de0 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 43 6f 6d         pDb->zCom
10df0 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  mit = 0;.      }
10e00 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e  .      if( pDb->
10e10 7a 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 20  zCommit ){.     
10e20 20 20 20 70 44 62 2d 3e 69 6e 74 65 72 70 20 3d     pDb->interp =
10e30 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 20 20 20   interp;.       
10e40 20 73 71 6c 69 74 65 33 5f 63 6f 6d 6d 69 74 5f   sqlite3_commit_
10e50 68 6f 6f 6b 28 70 44 62 2d 3e 64 62 2c 20 44 62  hook(pDb->db, Db
10e60 43 6f 6d 6d 69 74 48 61 6e 64 6c 65 72 2c 20 70  CommitHandler, p
10e70 44 62 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  Db);.      }else
10e80 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
10e90 33 5f 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 28 70 44  3_commit_hook(pD
10ea0 62 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20  b->db, 0, 0);.  
10eb0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
10ec0 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
10ed0 20 20 20 20 24 64 62 20 63 6f 6d 70 6c 65 74 65      $db complete
10ee0 20 53 51 4c 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52   SQL.  **.  ** R
10ef0 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 53 51  eturn TRUE if SQ
10f00 4c 20 69 73 20 61 20 63 6f 6d 70 6c 65 74 65 20  L is a complete 
10f10 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  SQL statement.  
10f20 52 65 74 75 72 6e 20 46 41 4c 53 45 20 69 66 0a  Return FALSE if.
10f30 20 20 2a 2a 20 61 64 64 69 74 69 6f 6e 61 6c 20    ** additional 
10f40 6c 69 6e 65 73 20 6f 66 20 69 6e 70 75 74 20 61  lines of input a
10f50 72 65 20 6e 65 65 64 65 64 2e 20 20 54 68 69 73  re needed.  This
10f60 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 74   is similar to t
10f70 68 65 0a 20 20 2a 2a 20 62 75 69 6c 74 2d 69 6e  he.  ** built-in
10f80 20 22 69 6e 66 6f 20 63 6f 6d 70 6c 65 74 65 22   "info complete"
10f90 20 63 6f 6d 6d 61 6e 64 20 6f 66 20 54 63 6c 2e   command of Tcl.
10fa0 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f  .  */.  case DB_
10fb0 43 4f 4d 50 4c 45 54 45 3a 20 7b 0a 23 69 66 6e  COMPLETE: {.#ifn
10fc0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
10fd0 43 4f 4d 50 4c 45 54 45 0a 20 20 20 20 54 63 6c  COMPLETE.    Tcl
10fe0 5f 4f 62 6a 20 2a 70 52 65 73 75 6c 74 3b 0a 20  _Obj *pResult;. 
10ff0 20 20 20 69 6e 74 20 69 73 43 6f 6d 70 6c 65 74     int isComplet
11000 65 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21  e;.    if( objc!
11010 3d 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  =3 ){.      Tcl_
11020 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
11030 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 53  erp, 2, objv, "S
11040 51 4c 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  QL");.      retu
11050 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
11060 20 20 7d 0a 20 20 20 20 69 73 43 6f 6d 70 6c 65    }.    isComple
11070 74 65 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6d  te = sqlite3_com
11080 70 6c 65 74 65 28 20 54 63 6c 5f 47 65 74 53 74  plete( Tcl_GetSt
11090 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
110a0 5b 32 5d 2c 20 30 29 20 29 3b 0a 20 20 20 20 70  [2], 0) );.    p
110b0 52 65 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65 74  Result = Tcl_Get
110c0 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
110d0 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 42 6f  );.    Tcl_SetBo
110e0 6f 6c 65 61 6e 4f 62 6a 28 70 52 65 73 75 6c 74  oleanObj(pResult
110f0 2c 20 69 73 43 6f 6d 70 6c 65 74 65 29 3b 0a 23  , isComplete);.#
11100 65 6e 64 69 66 0a 20 20 20 20 62 72 65 61 6b 3b  endif.    break;
11110 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64  .  }..  /*    $d
11120 62 20 63 6f 70 79 20 63 6f 6e 66 6c 69 63 74 2d  b copy conflict-
11130 61 6c 67 6f 72 69 74 68 6d 20 74 61 62 6c 65 20  algorithm table 
11140 66 69 6c 65 6e 61 6d 65 20 3f 53 45 50 41 52 41  filename ?SEPARA
11150 54 4f 52 3f 20 3f 4e 55 4c 4c 49 4e 44 49 43 41  TOR? ?NULLINDICA
11160 54 4f 52 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43  TOR?.  **.  ** C
11170 6f 70 79 20 64 61 74 61 20 69 6e 74 6f 20 74 61  opy data into ta
11180 62 6c 65 20 66 72 6f 6d 20 66 69 6c 65 6e 61 6d  ble from filenam
11190 65 2c 20 6f 70 74 69 6f 6e 61 6c 6c 79 20 75 73  e, optionally us
111a0 69 6e 67 20 53 45 50 41 52 41 54 4f 52 0a 20 20  ing SEPARATOR.  
111b0 2a 2a 20 61 73 20 63 6f 6c 75 6d 6e 20 73 65 70  ** as column sep
111c0 61 72 61 74 6f 72 73 2e 20 20 49 66 20 61 20 63  arators.  If a c
111d0 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 73 20 61  olumn contains a
111e0 20 6e 75 6c 6c 20 73 74 72 69 6e 67 2c 20 6f 72   null string, or
111f0 20 74 68 65 0a 20 20 2a 2a 20 76 61 6c 75 65 20   the.  ** value 
11200 6f 66 20 4e 55 4c 4c 49 4e 44 49 43 41 54 4f 52  of NULLINDICATOR
11210 2c 20 61 20 4e 55 4c 4c 20 69 73 20 69 6e 73 65  , a NULL is inse
11220 72 74 65 64 20 66 6f 72 20 74 68 65 20 63 6f 6c  rted for the col
11230 75 6d 6e 2e 0a 20 20 2a 2a 20 63 6f 6e 66 6c 69  umn..  ** confli
11240 63 74 2d 61 6c 67 6f 72 69 74 68 6d 20 69 73 20  ct-algorithm is 
11250 6f 6e 65 20 6f 66 20 74 68 65 20 73 71 6c 69 74  one of the sqlit
11260 65 20 63 6f 6e 66 6c 69 63 74 20 61 6c 67 6f 72  e conflict algor
11270 69 74 68 6d 73 3a 0a 20 20 2a 2a 20 20 20 20 72  ithms:.  **    r
11280 6f 6c 6c 62 61 63 6b 2c 20 61 62 6f 72 74 2c 20  ollback, abort, 
11290 66 61 69 6c 2c 20 69 67 6e 6f 72 65 2c 20 72 65  fail, ignore, re
112a0 70 6c 61 63 65 0a 20 20 2a 2a 20 4f 6e 20 73 75  place.  ** On su
112b0 63 63 65 73 73 2c 20 72 65 74 75 72 6e 20 74 68  ccess, return th
112c0 65 20 6e 75 6d 62 65 72 20 6f 66 20 6c 69 6e 65  e number of line
112d0 73 20 70 72 6f 63 65 73 73 65 64 2c 20 6e 6f 74  s processed, not
112e0 20 6e 65 63 65 73 73 61 72 69 6c 79 20 73 61 6d   necessarily sam
112f0 65 0a 20 20 2a 2a 20 61 73 20 27 64 62 20 63 68  e.  ** as 'db ch
11300 61 6e 67 65 73 27 20 64 75 65 20 74 6f 20 63 6f  anges' due to co
11310 6e 66 6c 69 63 74 2d 61 6c 67 6f 72 69 74 68 6d  nflict-algorithm
11320 20 73 65 6c 65 63 74 65 64 2e 0a 20 20 2a 2a 0a   selected..  **.
11330 20 20 2a 2a 20 54 68 69 73 20 63 6f 64 65 20 69    ** This code i
11340 73 20 62 61 73 69 63 61 6c 6c 79 20 61 6e 20 69  s basically an i
11350 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2f 65 6e  mplementation/en
11360 68 61 6e 63 65 6d 65 6e 74 20 6f 66 0a 20 20 2a  hancement of.  *
11370 2a 20 74 68 65 20 73 71 6c 69 74 65 33 20 73 68  * the sqlite3 sh
11380 65 6c 6c 2e 63 20 22 2e 69 6d 70 6f 72 74 22 20  ell.c ".import" 
11390 63 6f 6d 6d 61 6e 64 2e 0a 20 20 2a 2a 0a 20 20  command..  **.  
113a0 2a 2a 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ** This command 
113b0 75 73 61 67 65 20 69 73 20 65 71 75 69 76 61 6c  usage is equival
113c0 65 6e 74 20 74 6f 20 74 68 65 20 73 71 6c 69 74  ent to the sqlit
113d0 65 32 2e 78 20 43 4f 50 59 20 73 74 61 74 65 6d  e2.x COPY statem
113e0 65 6e 74 2c 0a 20 20 2a 2a 20 77 68 69 63 68 20  ent,.  ** which 
113f0 69 6d 70 6f 72 74 73 20 66 69 6c 65 20 64 61 74  imports file dat
11400 61 20 69 6e 74 6f 20 61 20 74 61 62 6c 65 20 75  a into a table u
11410 73 69 6e 67 20 74 68 65 20 50 6f 73 74 67 72 65  sing the Postgre
11420 53 51 4c 20 43 4f 50 59 20 66 69 6c 65 20 66 6f  SQL COPY file fo
11430 72 6d 61 74 3a 0a 20 20 2a 2a 20 20 20 24 64 62  rmat:.  **   $db
11440 20 63 6f 70 79 20 24 63 6f 6e 66 6c 69 74 5f 61   copy $conflit_a
11450 6c 67 6f 20 24 74 61 62 6c 65 5f 6e 61 6d 65 20  lgo $table_name 
11460 24 66 69 6c 65 6e 61 6d 65 20 5c 74 20 5c 5c 4e  $filename \t \\N
11470 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f  .  */.  case DB_
11480 43 4f 50 59 3a 20 7b 0a 20 20 20 20 63 68 61 72  COPY: {.    char
11490 20 2a 7a 54 61 62 6c 65 3b 20 20 20 20 20 20 20   *zTable;       
114a0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 73 65 72          /* Inser
114b0 74 20 64 61 74 61 20 69 6e 74 6f 20 74 68 69 73  t data into this
114c0 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 63 68   table */.    ch
114d0 61 72 20 2a 7a 46 69 6c 65 3b 20 20 20 20 20 20  ar *zFile;      
114e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
114f0 20 66 69 6c 65 20 66 72 6f 6d 20 77 68 69 63 68   file from which
11500 20 74 6f 20 65 78 74 72 61 63 74 20 64 61 74 61   to extract data
11510 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 43   */.    char *zC
11520 6f 6e 66 6c 69 63 74 3b 20 20 20 20 20 20 20 20  onflict;        
11530 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 66 6c      /* The confl
11540 69 63 74 20 61 6c 67 6f 72 69 74 68 6d 20 74 6f  ict algorithm to
11550 20 75 73 65 20 2a 2f 0a 20 20 20 20 73 71 6c 69   use */.    sqli
11560 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
11570 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 74 61          /* A sta
11580 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 69 6e  tement */.    in
11590 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20 20  t nCol;         
115a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
115b0 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
115c0 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20  n the table */. 
115d0 20 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20 20     int nByte;   
115e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
115f0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
11600 73 20 69 6e 20 61 6e 20 53 51 4c 20 73 74 72 69  s in an SQL stri
11610 6e 67 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 2c  ng */.    int i,
11620 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   j;             
11630 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
11640 75 6e 74 65 72 73 20 2a 2f 0a 20 20 20 20 69 6e  unters */.    in
11650 74 20 6e 53 65 70 3b 20 20 20 20 20 20 20 20 20  t nSep;         
11660 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
11670 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
11680 7a 53 65 70 5b 5d 20 2a 2f 0a 20 20 20 20 69 6e  zSep[] */.    in
11690 74 20 6e 4e 75 6c 6c 3b 20 20 20 20 20 20 20 20  t nNull;        
116a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
116b0 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
116c0 7a 4e 75 6c 6c 5b 5d 20 2a 2f 0a 20 20 20 20 63  zNull[] */.    c
116d0 68 61 72 20 2a 7a 53 71 6c 3b 20 20 20 20 20 20  har *zSql;      
116e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e             /* An
116f0 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 2a   SQL statement *
11700 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 4c 69 6e  /.    char *zLin
11710 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
11720 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 6c 69    /* A single li
11730 6e 65 20 6f 66 20 69 6e 70 75 74 20 66 72 6f 6d  ne of input from
11740 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20   the file */.   
11750 20 63 68 61 72 20 2a 2a 61 7a 43 6f 6c 3b 20 20   char **azCol;  
11760 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11770 7a 4c 69 6e 65 5b 5d 20 62 72 6f 6b 65 6e 20 75  zLine[] broken u
11780 70 20 69 6e 74 6f 20 63 6f 6c 75 6d 6e 73 20 2a  p into columns *
11790 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  /.    const char
117a0 20 2a 7a 43 6f 6d 6d 69 74 3b 20 20 20 20 20 20   *zCommit;      
117b0 20 20 2f 2a 20 48 6f 77 20 74 6f 20 63 6f 6d 6d    /* How to comm
117c0 69 74 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20  it changes */.  
117d0 20 20 46 49 4c 45 20 2a 69 6e 3b 20 20 20 20 20    FILE *in;     
117e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
117f0 20 54 68 65 20 69 6e 70 75 74 20 66 69 6c 65 20   The input file 
11800 2a 2f 0a 20 20 20 20 69 6e 74 20 6c 69 6e 65 6e  */.    int linen
11810 6f 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  o = 0;          
11820 20 20 20 2f 2a 20 4c 69 6e 65 20 6e 75 6d 62 65     /* Line numbe
11830 72 20 6f 66 20 69 6e 70 75 74 20 66 69 6c 65 20  r of input file 
11840 2a 2f 0a 20 20 20 20 63 68 61 72 20 7a 4c 69 6e  */.    char zLin
11850 65 4e 75 6d 5b 38 30 5d 3b 20 20 20 20 20 20 20  eNum[80];       
11860 20 20 20 2f 2a 20 4c 69 6e 65 20 6e 75 6d 62 65     /* Line numbe
11870 72 20 70 72 69 6e 74 20 62 75 66 66 65 72 20 2a  r print buffer *
11880 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  /.    Tcl_Obj *p
11890 52 65 73 75 6c 74 3b 20 20 20 20 20 20 20 20 20  Result;         
118a0 20 20 2f 2a 20 69 6e 74 65 72 70 20 72 65 73 75    /* interp resu
118b0 6c 74 20 2a 2f 0a 0a 20 20 20 20 63 6f 6e 73 74  lt */..    const
118c0 20 63 68 61 72 20 2a 7a 53 65 70 3b 0a 20 20 20   char *zSep;.   
118d0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 75   const char *zNu
118e0 6c 6c 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63  ll;.    if( objc
118f0 3c 35 20 7c 7c 20 6f 62 6a 63 3e 37 20 29 7b 0a  <5 || objc>7 ){.
11900 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
11910 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
11920 2c 20 6f 62 6a 76 2c 0a 20 20 20 20 20 20 20 20  , objv,.        
11930 20 22 43 4f 4e 46 4c 49 43 54 2d 41 4c 47 4f 52   "CONFLICT-ALGOR
11940 49 54 48 4d 20 54 41 42 4c 45 20 46 49 4c 45 4e  ITHM TABLE FILEN
11950 41 4d 45 20 3f 53 45 50 41 52 41 54 4f 52 3f 20  AME ?SEPARATOR? 
11960 3f 4e 55 4c 4c 49 4e 44 49 43 41 54 4f 52 3f 22  ?NULLINDICATOR?"
11970 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
11980 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
11990 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 3d 36  .    if( objc>=6
119a0 20 29 7b 0a 20 20 20 20 20 20 7a 53 65 70 20 3d   ){.      zSep =
119b0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
119c0 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 35 5d 2c 20 30  omObj(objv[5], 0
119d0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
119e0 20 20 20 20 7a 53 65 70 20 3d 20 22 5c 74 22 3b      zSep = "\t";
119f0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f  .    }.    if( o
11a00 62 6a 63 3e 3d 37 20 29 7b 0a 20 20 20 20 20 20  bjc>=7 ){.      
11a10 7a 4e 75 6c 6c 20 3d 20 54 63 6c 5f 47 65 74 53  zNull = Tcl_GetS
11a20 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
11a30 76 5b 36 5d 2c 20 30 29 3b 0a 20 20 20 20 7d 65  v[6], 0);.    }e
11a40 6c 73 65 7b 0a 20 20 20 20 20 20 7a 4e 75 6c 6c  lse{.      zNull
11a50 20 3d 20 22 22 3b 0a 20 20 20 20 7d 0a 20 20 20   = "";.    }.   
11a60 20 7a 43 6f 6e 66 6c 69 63 74 20 3d 20 54 63 6c   zConflict = Tcl
11a70 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
11a80 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30 29 3b 0a 20  j(objv[2], 0);. 
11a90 20 20 20 7a 54 61 62 6c 65 20 3d 20 54 63 6c 5f     zTable = Tcl_
11aa0 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
11ab0 28 6f 62 6a 76 5b 33 5d 2c 20 30 29 3b 0a 20 20  (objv[3], 0);.  
11ac0 20 20 7a 46 69 6c 65 20 3d 20 54 63 6c 5f 47 65    zFile = Tcl_Ge
11ad0 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
11ae0 62 6a 76 5b 34 5d 2c 20 30 29 3b 0a 20 20 20 20  bjv[4], 0);.    
11af0 6e 53 65 70 20 3d 20 73 74 72 6c 65 6e 33 30 28  nSep = strlen30(
11b00 7a 53 65 70 29 3b 0a 20 20 20 20 6e 4e 75 6c 6c  zSep);.    nNull
11b10 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 4e 75 6c   = strlen30(zNul
11b20 6c 29 3b 0a 20 20 20 20 69 66 28 20 6e 53 65 70  l);.    if( nSep
11b30 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  ==0 ){.      Tcl
11b40 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
11b50 74 65 72 70 2c 22 45 72 72 6f 72 3a 20 6e 6f 6e  terp,"Error: non
11b60 2d 6e 75 6c 6c 20 73 65 70 61 72 61 74 6f 72 20  -null separator 
11b70 72 65 71 75 69 72 65 64 20 66 6f 72 20 63 6f 70  required for cop
11b80 79 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  y",.            
11b90 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
11ba0 2a 29 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75  *)0);.      retu
11bb0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
11bc0 20 20 7d 0a 20 20 20 20 69 66 28 73 74 72 63 6d    }.    if(strcm
11bd0 70 28 7a 43 6f 6e 66 6c 69 63 74 2c 20 22 72 6f  p(zConflict, "ro
11be0 6c 6c 62 61 63 6b 22 29 20 21 3d 20 30 20 26 26  llback") != 0 &&
11bf0 0a 20 20 20 20 20 20 20 73 74 72 63 6d 70 28 7a  .       strcmp(z
11c00 43 6f 6e 66 6c 69 63 74 2c 20 22 61 62 6f 72 74  Conflict, "abort
11c10 22 20 20 20 29 20 21 3d 20 30 20 26 26 0a 20 20  "   ) != 0 &&.  
11c20 20 20 20 20 20 73 74 72 63 6d 70 28 7a 43 6f 6e       strcmp(zCon
11c30 66 6c 69 63 74 2c 20 22 66 61 69 6c 22 20 20 20  flict, "fail"   
11c40 20 29 20 21 3d 20 30 20 26 26 0a 20 20 20 20 20   ) != 0 &&.     
11c50 20 20 73 74 72 63 6d 70 28 7a 43 6f 6e 66 6c 69    strcmp(zConfli
11c60 63 74 2c 20 22 69 67 6e 6f 72 65 22 20 20 29 20  ct, "ignore"  ) 
11c70 21 3d 20 30 20 26 26 0a 20 20 20 20 20 20 20 73  != 0 &&.       s
11c80 74 72 63 6d 70 28 7a 43 6f 6e 66 6c 69 63 74 2c  trcmp(zConflict,
11c90 20 22 72 65 70 6c 61 63 65 22 20 29 20 21 3d 20   "replace" ) != 
11ca0 30 20 29 20 7b 0a 20 20 20 20 20 20 54 63 6c 5f  0 ) {.      Tcl_
11cb0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
11cc0 65 72 70 2c 20 22 45 72 72 6f 72 3a 20 5c 22 22  erp, "Error: \""
11cd0 2c 20 7a 43 6f 6e 66 6c 69 63 74 2c 0a 20 20 20  , zConflict,.   
11ce0 20 20 20 20 20 20 20 20 20 22 5c 22 2c 20 63 6f           "\", co
11cf0 6e 66 6c 69 63 74 2d 61 6c 67 6f 72 69 74 68 6d  nflict-algorithm
11d00 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f 66 3a   must be one of:
11d10 20 72 6f 6c 6c 62 61 63 6b 2c 20 22 0a 20 20 20   rollback, ".   
11d20 20 20 20 20 20 20 20 20 20 22 61 62 6f 72 74 2c           "abort,
11d30 20 66 61 69 6c 2c 20 69 67 6e 6f 72 65 2c 20 6f   fail, ignore, o
11d40 72 20 72 65 70 6c 61 63 65 22 2c 20 28 63 68 61  r replace", (cha
11d50 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 72 65 74  r*)0);.      ret
11d60 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
11d70 20 20 20 7d 0a 20 20 20 20 7a 53 71 6c 20 3d 20     }.    zSql = 
11d80 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
11d90 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 27  "SELECT * FROM '
11da0 25 71 27 22 2c 20 7a 54 61 62 6c 65 29 3b 0a 20  %q'", zTable);. 
11db0 20 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29     if( zSql==0 )
11dc0 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65  {.      Tcl_Appe
11dd0 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
11de0 20 22 45 72 72 6f 72 3a 20 6e 6f 20 73 75 63 68   "Error: no such
11df0 20 74 61 62 6c 65 3a 20 22 2c 20 7a 54 61 62 6c   table: ", zTabl
11e00 65 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  e, (char*)0);.  
11e10 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
11e20 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
11e30 6e 42 79 74 65 20 3d 20 73 74 72 6c 65 6e 33 30  nByte = strlen30
11e40 28 7a 53 71 6c 29 3b 0a 20 20 20 20 72 63 20 3d  (zSql);.    rc =
11e50 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
11e60 28 70 44 62 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20  (pDb->db, zSql, 
11e70 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a  -1, &pStmt, 0);.
11e80 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
11e90 28 7a 53 71 6c 29 3b 0a 20 20 20 20 69 66 28 20  (zSql);.    if( 
11ea0 72 63 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  rc ){.      Tcl_
11eb0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
11ec0 65 72 70 2c 20 22 45 72 72 6f 72 3a 20 22 2c 20  erp, "Error: ", 
11ed0 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70  sqlite3_errmsg(p
11ee0 44 62 2d 3e 64 62 29 2c 20 28 63 68 61 72 2a 29  Db->db), (char*)
11ef0 30 29 3b 0a 20 20 20 20 20 20 6e 43 6f 6c 20 3d  0);.      nCol =
11f00 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
11f10 20 20 20 20 20 6e 43 6f 6c 20 3d 20 73 71 6c 69       nCol = sqli
11f20 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74  te3_column_count
11f30 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 7d 0a 20  (pStmt);.    }. 
11f40 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c     sqlite3_final
11f50 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  ize(pStmt);.    
11f60 69 66 28 20 6e 43 6f 6c 3d 3d 30 20 29 20 7b 0a  if( nCol==0 ) {.
11f70 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
11f80 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
11f90 20 20 7a 53 71 6c 20 3d 20 6d 61 6c 6c 6f 63 28    zSql = malloc(
11fa0 20 6e 42 79 74 65 20 2b 20 35 30 20 2b 20 6e 43   nByte + 50 + nC
11fb0 6f 6c 2a 32 20 29 3b 0a 20 20 20 20 69 66 28 20  ol*2 );.    if( 
11fc0 7a 53 71 6c 3d 3d 30 20 29 20 7b 0a 20 20 20 20  zSql==0 ) {.    
11fd0 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
11fe0 6c 74 28 69 6e 74 65 72 70 2c 20 22 45 72 72 6f  lt(interp, "Erro
11ff0 72 3a 20 63 61 6e 27 74 20 6d 61 6c 6c 6f 63 28  r: can't malloc(
12000 29 22 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20  )", (char*)0);. 
12010 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
12020 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
12030 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
12040 66 28 6e 42 79 74 65 2b 35 30 2c 20 7a 53 71 6c  f(nByte+50, zSql
12050 2c 20 22 49 4e 53 45 52 54 20 4f 52 20 25 71 20  , "INSERT OR %q 
12060 49 4e 54 4f 20 27 25 71 27 20 56 41 4c 55 45 53  INTO '%q' VALUES
12070 28 3f 22 2c 0a 20 20 20 20 20 20 20 20 20 7a 43  (?",.         zC
12080 6f 6e 66 6c 69 63 74 2c 20 7a 54 61 62 6c 65 29  onflict, zTable)
12090 3b 0a 20 20 20 20 6a 20 3d 20 73 74 72 6c 65 6e  ;.    j = strlen
120a0 33 30 28 7a 53 71 6c 29 3b 0a 20 20 20 20 66 6f  30(zSql);.    fo
120b0 72 28 69 3d 31 3b 20 69 3c 6e 43 6f 6c 3b 20 69  r(i=1; i<nCol; i
120c0 2b 2b 29 7b 0a 20 20 20 20 20 20 7a 53 71 6c 5b  ++){.      zSql[
120d0 6a 2b 2b 5d 20 3d 20 27 2c 27 3b 0a 20 20 20 20  j++] = ',';.    
120e0 20 20 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d 20 27 3f    zSql[j++] = '?
120f0 27 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 53 71  ';.    }.    zSq
12100 6c 5b 6a 2b 2b 5d 20 3d 20 27 29 27 3b 0a 20 20  l[j++] = ')';.  
12110 20 20 7a 53 71 6c 5b 6a 5d 20 3d 20 30 3b 0a 20    zSql[j] = 0;. 
12120 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
12130 70 72 65 70 61 72 65 28 70 44 62 2d 3e 64 62 2c  prepare(pDb->db,
12140 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d   zSql, -1, &pStm
12150 74 2c 20 30 29 3b 0a 20 20 20 20 66 72 65 65 28  t, 0);.    free(
12160 7a 53 71 6c 29 3b 0a 20 20 20 20 69 66 28 20 72  zSql);.    if( r
12170 63 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41  c ){.      Tcl_A
12180 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
12190 72 70 2c 20 22 45 72 72 6f 72 3a 20 22 2c 20 73  rp, "Error: ", s
121a0 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44  qlite3_errmsg(pD
121b0 62 2d 3e 64 62 29 2c 20 28 63 68 61 72 2a 29 30  b->db), (char*)0
121c0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
121d0 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
121e0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
121f0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
12200 20 20 20 20 69 6e 20 3d 20 66 6f 70 65 6e 28 7a      in = fopen(z
12210 46 69 6c 65 2c 20 22 72 62 22 29 3b 0a 20 20 20  File, "rb");.   
12220 20 69 66 28 20 69 6e 3d 3d 30 20 29 7b 0a 20 20   if( in==0 ){.  
12230 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
12240 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 45 72  sult(interp, "Er
12250 72 6f 72 3a 20 63 61 6e 6e 6f 74 20 6f 70 65 6e  ror: cannot open
12260 20 66 69 6c 65 3a 20 22 2c 20 7a 46 69 6c 65 2c   file: ", zFile,
12270 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 71   NULL);.      sq
12280 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
12290 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 72 65 74  Stmt);.      ret
122a0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
122b0 20 20 20 7d 0a 20 20 20 20 61 7a 43 6f 6c 20 3d     }.    azCol =
122c0 20 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28   malloc( sizeof(
122d0 61 7a 43 6f 6c 5b 30 5d 29 2a 28 6e 43 6f 6c 2b  azCol[0])*(nCol+
122e0 31 29 20 29 3b 0a 20 20 20 20 69 66 28 20 61 7a  1) );.    if( az
122f0 43 6f 6c 3d 3d 30 20 29 20 7b 0a 20 20 20 20 20  Col==0 ) {.     
12300 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
12310 74 28 69 6e 74 65 72 70 2c 20 22 45 72 72 6f 72  t(interp, "Error
12320 3a 20 63 61 6e 27 74 20 6d 61 6c 6c 6f 63 28 29  : can't malloc()
12330 22 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  ", (char*)0);.  
12340 20 20 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a      fclose(in);.
12350 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
12360 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
12370 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33 5f    (void)sqlite3_
12380 65 78 65 63 28 70 44 62 2d 3e 64 62 2c 20 22 42  exec(pDb->db, "B
12390 45 47 49 4e 22 2c 20 30 2c 20 30 2c 20 30 29 3b  EGIN", 0, 0, 0);
123a0 0a 20 20 20 20 7a 43 6f 6d 6d 69 74 20 3d 20 22  .    zCommit = "
123b0 43 4f 4d 4d 49 54 22 3b 0a 20 20 20 20 77 68 69  COMMIT";.    whi
123c0 6c 65 28 20 28 7a 4c 69 6e 65 20 3d 20 6c 6f 63  le( (zLine = loc
123d0 61 6c 5f 67 65 74 6c 69 6e 65 28 30 2c 20 69 6e  al_getline(0, in
123e0 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 63  ))!=0 ){.      c
123f0 68 61 72 20 2a 7a 3b 0a 20 20 20 20 20 20 6c 69  har *z;.      li
12400 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 61 7a  neno++;.      az
12410 43 6f 6c 5b 30 5d 20 3d 20 7a 4c 69 6e 65 3b 0a  Col[0] = zLine;.
12420 20 20 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 7a        for(i=0, z
12430 3d 7a 4c 69 6e 65 3b 20 2a 7a 3b 20 7a 2b 2b 29  =zLine; *z; z++)
12440 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 2a 7a  {.        if( *z
12450 3d 3d 7a 53 65 70 5b 30 5d 20 26 26 20 73 74 72  ==zSep[0] && str
12460 6e 63 6d 70 28 7a 2c 20 7a 53 65 70 2c 20 6e 53  ncmp(z, zSep, nS
12470 65 70 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ep)==0 ){.      
12480 20 20 20 20 2a 7a 20 3d 20 30 3b 0a 20 20 20 20      *z = 0;.    
12490 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20        i++;.     
124a0 20 20 20 20 20 69 66 28 20 69 3c 6e 43 6f 6c 20       if( i<nCol 
124b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  ){.            a
124c0 7a 43 6f 6c 5b 69 5d 20 3d 20 26 7a 5b 6e 53 65  zCol[i] = &z[nSe
124d0 70 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  p];.            
124e0 7a 20 2b 3d 20 6e 53 65 70 2d 31 3b 0a 20 20 20  z += nSep-1;.   
124f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
12500 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
12510 20 69 66 28 20 69 2b 31 21 3d 6e 43 6f 6c 20 29   if( i+1!=nCol )
12520 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  {.        char *
12530 7a 45 72 72 3b 0a 20 20 20 20 20 20 20 20 69 6e  zErr;.        in
12540 74 20 6e 45 72 72 20 3d 20 73 74 72 6c 65 6e 33  t nErr = strlen3
12550 30 28 7a 46 69 6c 65 29 20 2b 20 32 30 30 3b 0a  0(zFile) + 200;.
12560 20 20 20 20 20 20 20 20 7a 45 72 72 20 3d 20 6d          zErr = m
12570 61 6c 6c 6f 63 28 6e 45 72 72 29 3b 0a 20 20 20  alloc(nErr);.   
12580 20 20 20 20 20 69 66 28 20 7a 45 72 72 20 29 7b       if( zErr ){
12590 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
125a0 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 45 72 72  e3_snprintf(nErr
125b0 2c 20 7a 45 72 72 2c 0a 20 20 20 20 20 20 20 20  , zErr,.        
125c0 20 20 20 20 20 22 45 72 72 6f 72 3a 20 25 73 20       "Error: %s 
125d0 6c 69 6e 65 20 25 64 3a 20 65 78 70 65 63 74 65  line %d: expecte
125e0 64 20 25 64 20 63 6f 6c 75 6d 6e 73 20 6f 66 20  d %d columns of 
125f0 64 61 74 61 20 62 75 74 20 66 6f 75 6e 64 20 25  data but found %
12600 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  d",.            
12610 20 7a 46 69 6c 65 2c 20 6c 69 6e 65 6e 6f 2c 20   zFile, lineno, 
12620 6e 43 6f 6c 2c 20 69 2b 31 29 3b 0a 20 20 20 20  nCol, i+1);.    
12630 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
12640 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a  Result(interp, z
12650 45 72 72 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  Err, (char*)0);.
12660 20 20 20 20 20 20 20 20 20 20 66 72 65 65 28 7a            free(z
12670 45 72 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Err);.        }.
12680 20 20 20 20 20 20 20 20 7a 43 6f 6d 6d 69 74 20          zCommit 
12690 3d 20 22 52 4f 4c 4c 42 41 43 4b 22 3b 0a 20 20  = "ROLLBACK";.  
126a0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
126b0 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69     }.      for(i
126c0 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29  =0; i<nCol; i++)
126d0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 63 68 65  {.        /* che
126e0 63 6b 20 66 6f 72 20 6e 75 6c 6c 20 64 61 74 61  ck for null data
126f0 2c 20 69 66 20 73 6f 2c 20 62 69 6e 64 20 61 73  , if so, bind as
12700 20 6e 75 6c 6c 20 2a 2f 0a 20 20 20 20 20 20 20   null */.       
12710 20 69 66 28 20 28 6e 4e 75 6c 6c 3e 30 20 26 26   if( (nNull>0 &&
12720 20 73 74 72 63 6d 70 28 61 7a 43 6f 6c 5b 69 5d   strcmp(azCol[i]
12730 2c 20 7a 4e 75 6c 6c 29 3d 3d 30 29 0a 20 20 20  , zNull)==0).   
12740 20 20 20 20 20 20 20 7c 7c 20 73 74 72 6c 65 6e         || strlen
12750 33 30 28 61 7a 43 6f 6c 5b 69 5d 29 3d 3d 30 0a  30(azCol[i])==0.
12760 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
12770 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e       sqlite3_bin
12780 64 5f 6e 75 6c 6c 28 70 53 74 6d 74 2c 20 69 2b  d_null(pStmt, i+
12790 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  1);.        }els
127a0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  e{.          sql
127b0 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70  ite3_bind_text(p
127c0 53 74 6d 74 2c 20 69 2b 31 2c 20 61 7a 43 6f 6c  Stmt, i+1, azCol
127d0 5b 69 5d 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f  [i], -1, SQLITE_
127e0 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 20  STATIC);.       
127f0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
12800 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53   sqlite3_step(pS
12810 74 6d 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  tmt);.      rc =
12820 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70   sqlite3_reset(p
12830 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 66 72 65  Stmt);.      fre
12840 65 28 7a 4c 69 6e 65 29 3b 0a 20 20 20 20 20 20  e(zLine);.      
12850 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
12860 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c  K ){.        Tcl
12870 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
12880 74 65 72 70 2c 22 45 72 72 6f 72 3a 20 22 2c 20  terp,"Error: ", 
12890 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70  sqlite3_errmsg(p
128a0 44 62 2d 3e 64 62 29 2c 20 28 63 68 61 72 2a 29  Db->db), (char*)
128b0 30 29 3b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6d  0);.        zCom
128c0 6d 69 74 20 3d 20 22 52 4f 4c 4c 42 41 43 4b 22  mit = "ROLLBACK"
128d0 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
128e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
128f0 20 20 20 66 72 65 65 28 61 7a 43 6f 6c 29 3b 0a     free(azCol);.
12900 20 20 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a      fclose(in);.
12910 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61      sqlite3_fina
12920 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20  lize(pStmt);.   
12930 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33 5f 65   (void)sqlite3_e
12940 78 65 63 28 70 44 62 2d 3e 64 62 2c 20 7a 43 6f  xec(pDb->db, zCo
12950 6d 6d 69 74 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  mmit, 0, 0, 0);.
12960 0a 20 20 20 20 69 66 28 20 7a 43 6f 6d 6d 69 74  .    if( zCommit
12970 5b 30 5d 20 3d 3d 20 27 43 27 20 29 7b 0a 20 20  [0] == 'C' ){.  
12980 20 20 20 20 2f 2a 20 73 75 63 63 65 73 73 2c 20      /* success, 
12990 73 65 74 20 72 65 73 75 6c 74 20 61 73 20 6e 75  set result as nu
129a0 6d 62 65 72 20 6f 66 20 6c 69 6e 65 73 20 70 72  mber of lines pr
129b0 6f 63 65 73 73 65 64 20 2a 2f 0a 20 20 20 20 20  ocessed */.     
129c0 20 70 52 65 73 75 6c 74 20 3d 20 54 63 6c 5f 47   pResult = Tcl_G
129d0 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
129e0 72 70 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 53  rp);.      Tcl_S
129f0 65 74 49 6e 74 4f 62 6a 28 70 52 65 73 75 6c 74  etIntObj(pResult
12a00 2c 20 6c 69 6e 65 6e 6f 29 3b 0a 20 20 20 20 20  , lineno);.     
12a10 20 72 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20   rc = TCL_OK;.  
12a20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
12a30 2a 20 66 61 69 6c 75 72 65 2c 20 61 70 70 65 6e  * failure, appen
12a40 64 20 6c 69 6e 65 6e 6f 20 77 68 65 72 65 20 66  d lineno where f
12a50 61 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20 73  ailed */.      s
12a60 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
12a70 73 69 7a 65 6f 66 28 7a 4c 69 6e 65 4e 75 6d 29  sizeof(zLineNum)
12a80 2c 20 7a 4c 69 6e 65 4e 75 6d 2c 22 25 64 22 2c  , zLineNum,"%d",
12a90 6c 69 6e 65 6e 6f 29 3b 0a 20 20 20 20 20 20 54  lineno);.      T
12aa0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
12ab0 69 6e 74 65 72 70 2c 22 2c 20 66 61 69 6c 65 64  interp,", failed
12ac0 20 77 68 69 6c 65 20 70 72 6f 63 65 73 73 69 6e   while processin
12ad0 67 20 6c 69 6e 65 3a 20 22 2c 7a 4c 69 6e 65 4e  g line: ",zLineN
12ae0 75 6d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  um,.            
12af0 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
12b00 2a 29 30 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  *)0);.      rc =
12b10 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
12b20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  }.    break;.  }
12b30 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 24  ..  /*.  **    $
12b40 64 62 20 65 6e 61 62 6c 65 5f 6c 6f 61 64 5f 65  db enable_load_e
12b50 78 74 65 6e 73 69 6f 6e 20 42 4f 4f 4c 45 41 4e  xtension BOOLEAN
12b60 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 75 72 6e 20  .  **.  ** Turn 
12b70 74 68 65 20 65 78 74 65 6e 73 69 6f 6e 20 6c 6f  the extension lo
12b80 61 64 69 6e 67 20 66 65 61 74 75 72 65 20 6f 6e  ading feature on
12b90 20 6f 72 20 6f 66 66 2e 20 20 49 74 20 69 66 20   or off.  It if 
12ba0 6f 66 66 20 62 79 0a 20 20 2a 2a 20 64 65 66 61  off by.  ** defa
12bb0 75 6c 74 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  ult..  */.  case
12bc0 20 44 42 5f 45 4e 41 42 4c 45 5f 4c 4f 41 44 5f   DB_ENABLE_LOAD_
12bd0 45 58 54 45 4e 53 49 4f 4e 3a 20 7b 0a 23 69 66  EXTENSION: {.#if
12be0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
12bf0 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a  _LOAD_EXTENSION.
12c00 20 20 20 20 69 6e 74 20 6f 6e 6f 66 66 3b 0a 20      int onoff;. 
12c10 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29     if( objc!=3 )
12c20 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e  {.      Tcl_Wron
12c30 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
12c40 20 32 2c 20 6f 62 6a 76 2c 20 22 42 4f 4f 4c 45   2, objv, "BOOLE
12c50 41 4e 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  AN");.      retu
12c60 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
12c70 20 20 7d 0a 20 20 20 20 69 66 28 20 54 63 6c 5f    }.    if( Tcl_
12c80 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62  GetBooleanFromOb
12c90 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32  j(interp, objv[2
12ca0 5d 2c 20 26 6f 6e 6f 66 66 29 20 29 7b 0a 20 20  ], &onoff) ){.  
12cb0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
12cc0 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
12cd0 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 6c  sqlite3_enable_l
12ce0 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e 28 70 44  oad_extension(pD
12cf0 62 2d 3e 64 62 2c 20 6f 6e 6f 66 66 29 3b 0a 20  b->db, onoff);. 
12d00 20 20 20 62 72 65 61 6b 3b 0a 23 65 6c 73 65 0a     break;.#else.
12d10 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
12d20 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 65 78  sult(interp, "ex
12d30 74 65 6e 73 69 6f 6e 20 6c 6f 61 64 69 6e 67 20  tension loading 
12d40 69 73 20 74 75 72 6e 65 64 20 6f 66 66 20 61 74  is turned off at
12d50 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 22 2c 0a   compile-time",.
12d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d70 20 20 20 20 20 28 63 68 61 72 2a 29 30 29 3b 0a       (char*)0);.
12d80 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
12d90 52 52 4f 52 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  RROR;.#endif.  }
12da0 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 24  ..  /*.  **    $
12db0 64 62 20 65 72 72 6f 72 63 6f 64 65 0a 20 20 2a  db errorcode.  *
12dc0 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 74 68  *.  ** Return th
12dd0 65 20 6e 75 6d 65 72 69 63 20 65 72 72 6f 72 20  e numeric error 
12de0 63 6f 64 65 20 74 68 61 74 20 77 61 73 20 72 65  code that was re
12df0 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 6d 6f  turned by the mo
12e00 73 74 20 72 65 63 65 6e 74 0a 20 20 2a 2a 20 63  st recent.  ** c
12e10 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 65  all to sqlite3_e
12e20 78 65 63 28 29 2e 0a 20 20 2a 2f 0a 20 20 63 61  xec()..  */.  ca
12e30 73 65 20 44 42 5f 45 52 52 4f 52 43 4f 44 45 3a  se DB_ERRORCODE:
12e40 20 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62   {.    Tcl_SetOb
12e50 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
12e60 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 71  Tcl_NewIntObj(sq
12e70 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28 70 44  lite3_errcode(pD
12e80 62 2d 3e 64 62 29 29 29 3b 0a 20 20 20 20 62 72  b->db)));.    br
12e90 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  eak;.  }..  /*. 
12ea0 20 2a 2a 20 20 20 20 24 64 62 20 65 78 69 73 74   **    $db exist
12eb0 73 20 24 73 71 6c 0a 20 20 2a 2a 20 20 20 20 24  s $sql.  **    $
12ec0 64 62 20 6f 6e 65 63 6f 6c 75 6d 6e 20 24 73 71  db onecolumn $sq
12ed0 6c 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  l.  **.  ** The 
12ee0 6f 6e 65 63 6f 6c 75 6d 6e 20 6d 65 74 68 6f 64  onecolumn method
12ef0 20 69 73 20 74 68 65 20 65 71 75 69 76 61 6c 65   is the equivale
12f00 6e 74 20 6f 66 3a 0a 20 20 2a 2a 20 20 20 20 20  nt of:.  **     
12f10 6c 69 6e 64 65 78 20 5b 24 64 62 20 65 76 61 6c  lindex [$db eval
12f20 20 24 73 71 6c 5d 20 30 0a 20 20 2a 2f 0a 20 20   $sql] 0.  */.  
12f30 63 61 73 65 20 44 42 5f 45 58 49 53 54 53 3a 0a  case DB_EXISTS:.
12f40 20 20 63 61 73 65 20 44 42 5f 4f 4e 45 43 4f 4c    case DB_ONECOL
12f50 55 4d 4e 3a 20 7b 0a 20 20 20 20 54 63 6c 5f 4f  UMN: {.    Tcl_O
12f60 62 6a 20 2a 70 52 65 73 75 6c 74 20 3d 20 30 3b  bj *pResult = 0;
12f70 0a 20 20 20 20 44 62 45 76 61 6c 43 6f 6e 74 65  .    DbEvalConte
12f80 78 74 20 73 45 76 61 6c 3b 0a 20 20 20 20 69 66  xt sEval;.    if
12f90 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20  ( objc!=3 ){.   
12fa0 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
12fb0 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
12fc0 62 6a 76 2c 20 22 53 51 4c 22 29 3b 0a 20 20 20  bjv, "SQL");.   
12fd0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
12fe0 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ROR;.    }..    
12ff0 64 62 45 76 61 6c 49 6e 69 74 28 26 73 45 76 61  dbEvalInit(&sEva
13000 6c 2c 20 70 44 62 2c 20 6f 62 6a 76 5b 32 5d 2c  l, pDb, objv[2],
13010 20 30 29 3b 0a 20 20 20 20 72 63 20 3d 20 64 62   0);.    rc = db
13020 45 76 61 6c 53 74 65 70 28 26 73 45 76 61 6c 29  EvalStep(&sEval)
13030 3b 0a 20 20 20 20 69 66 28 20 63 68 6f 69 63 65  ;.    if( choice
13040 3d 3d 44 42 5f 4f 4e 45 43 4f 4c 55 4d 4e 20 29  ==DB_ONECOLUMN )
13050 7b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  {.      if( rc==
13060 54 43 4c 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  TCL_OK ){.      
13070 20 20 70 52 65 73 75 6c 74 20 3d 20 64 62 45 76    pResult = dbEv
13080 61 6c 43 6f 6c 75 6d 6e 56 61 6c 75 65 28 26 73  alColumnValue(&s
13090 45 76 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20  Eval, 0);.      
130a0 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 54 43  }else if( rc==TC
130b0 4c 5f 42 52 45 41 4b 20 29 7b 0a 20 20 20 20 20  L_BREAK ){.     
130c0 20 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73 75     Tcl_ResetResu
130d0 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  lt(interp);.    
130e0 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66    }.    }else if
130f0 28 20 72 63 3d 3d 54 43 4c 5f 42 52 45 41 4b 20  ( rc==TCL_BREAK 
13100 7c 7c 20 72 63 3d 3d 54 43 4c 5f 4f 4b 20 29 7b  || rc==TCL_OK ){
13110 0a 20 20 20 20 20 20 70 52 65 73 75 6c 74 20 3d  .      pResult =
13120 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f   Tcl_NewBooleanO
13130 62 6a 28 72 63 3d 3d 54 43 4c 5f 4f 4b 29 3b 0a  bj(rc==TCL_OK);.
13140 20 20 20 20 7d 0a 20 20 20 20 64 62 45 76 61 6c      }.    dbEval
13150 46 69 6e 61 6c 69 7a 65 28 26 73 45 76 61 6c 29  Finalize(&sEval)
13160 3b 0a 20 20 20 20 69 66 28 20 70 52 65 73 75 6c  ;.    if( pResul
13170 74 20 29 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65  t ) Tcl_SetObjRe
13180 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 52 65  sult(interp, pRe
13190 73 75 6c 74 29 3b 0a 0a 20 20 20 20 69 66 28 20  sult);..    if( 
131a0 72 63 3d 3d 54 43 4c 5f 42 52 45 41 4b 20 29 7b  rc==TCL_BREAK ){
131b0 0a 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f  .      rc = TCL_
131c0 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 72  OK;.    }.    br
131d0 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  eak;.  }..  /*. 
131e0 20 2a 2a 20 20 20 20 24 64 62 20 65 76 61 6c 20   **    $db eval 
131f0 24 73 71 6c 20 3f 61 72 72 61 79 3f 20 3f 7b 20  $sql ?array? ?{ 
13200 20 2e 2e 2e 63 6f 64 65 2e 2e 2e 20 7d 3f 0a 20   ...code... }?. 
13210 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 53 51 4c   **.  ** The SQL
13220 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 24 73   statement in $s
13230 71 6c 20 69 73 20 65 76 61 6c 75 61 74 65 64 2e  ql is evaluated.
13240 20 20 46 6f 72 20 65 61 63 68 20 72 6f 77 2c 20    For each row, 
13250 74 68 65 20 76 61 6c 75 65 73 20 61 72 65 0a 20  the values are. 
13260 20 2a 2a 20 70 6c 61 63 65 64 20 69 6e 20 65 6c   ** placed in el
13270 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 61 72  ements of the ar
13280 72 61 79 20 6e 61 6d 65 64 20 22 61 72 72 61 79  ray named "array
13290 22 20 61 6e 64 20 2e 2e 2e 63 6f 64 65 2e 2e 2e  " and ...code...
132a0 20 69 73 20 65 78 65 63 75 74 65 64 2e 0a 20 20   is executed..  
132b0 2a 2a 20 49 66 20 22 61 72 72 61 79 22 20 61 6e  ** If "array" an
132c0 64 20 22 63 6f 64 65 22 20 61 72 65 20 6f 6d 69  d "code" are omi
132d0 74 74 65 64 2c 20 74 68 65 6e 20 6e 6f 20 63 61  tted, then no ca
132e0 6c 6c 62 61 63 6b 20 69 73 20 65 76 65 72 79 20  llback is every 
132f0 69 6e 76 6f 6b 65 64 2e 0a 20 20 2a 2a 20 49 66  invoked..  ** If
13300 20 22 61 72 72 61 79 22 20 69 73 20 61 6e 20 65   "array" is an e
13310 6d 70 74 79 20 73 74 72 69 6e 67 2c 20 74 68 65  mpty string, the
13320 6e 20 74 68 65 20 76 61 6c 75 65 73 20 61 72 65  n the values are
13330 20 70 6c 61 63 65 64 20 69 6e 20 76 61 72 69 61   placed in varia
13340 62 6c 65 73 0a 20 20 2a 2a 20 74 68 61 74 20 68  bles.  ** that h
13350 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e 61 6d  ave the same nam
13360 65 20 61 73 20 74 68 65 20 66 69 65 6c 64 73 20  e as the fields 
13370 65 78 74 72 61 63 74 65 64 20 62 79 20 74 68 65  extracted by the
13380 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 63   query..  */.  c
13390 61 73 65 20 44 42 5f 45 56 41 4c 3a 20 7b 0a 20  ase DB_EVAL: {. 
133a0 20 20 20 69 66 28 20 6f 62 6a 63 3c 33 20 7c 7c     if( objc<3 ||
133b0 20 6f 62 6a 63 3e 35 20 29 7b 0a 20 20 20 20 20   objc>5 ){.     
133c0 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
133d0 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a  s(interp, 2, obj
133e0 76 2c 20 22 53 51 4c 20 3f 41 52 52 41 59 2d 4e  v, "SQL ?ARRAY-N
133f0 41 4d 45 3f 20 3f 53 43 52 49 50 54 3f 22 29 3b  AME? ?SCRIPT?");
13400 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
13410 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a  L_ERROR;.    }..
13420 20 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d 33 20      if( objc==3 
13430 29 7b 0a 20 20 20 20 20 20 44 62 45 76 61 6c 43  ){.      DbEvalC
13440 6f 6e 74 65 78 74 20 73 45 76 61 6c 3b 0a 20 20  ontext sEval;.  
13450 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65      Tcl_Obj *pRe
13460 74 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a 28 29  t = Tcl_NewObj()
13470 3b 0a 20 20 20 20 20 20 54 63 6c 5f 49 6e 63 72  ;.      Tcl_Incr
13480 52 65 66 43 6f 75 6e 74 28 70 52 65 74 29 3b 0a  RefCount(pRet);.
13490 20 20 20 20 20 20 64 62 45 76 61 6c 49 6e 69 74        dbEvalInit
134a0 28 26 73 45 76 61 6c 2c 20 70 44 62 2c 20 6f 62  (&sEval, pDb, ob
134b0 6a 76 5b 32 5d 2c 20 30 29 3b 0a 20 20 20 20 20  jv[2], 0);.     
134c0 20 77 68 69 6c 65 28 20 54 43 4c 5f 4f 4b 3d 3d   while( TCL_OK==
134d0 28 72 63 20 3d 20 64 62 45 76 61 6c 53 74 65 70  (rc = dbEvalStep
134e0 28 26 73 45 76 61 6c 29 29 20 29 7b 0a 20 20 20  (&sEval)) ){.   
134f0 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
13500 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20      int nCol;.  
13510 20 20 20 20 20 20 64 62 45 76 61 6c 52 6f 77 49        dbEvalRowI
13520 6e 66 6f 28 26 73 45 76 61 6c 2c 20 26 6e 43 6f  nfo(&sEval, &nCo
13530 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 66  l, 0);.        f
13540 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20  or(i=0; i<nCol; 
13550 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
13560 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
13570 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
13580 20 70 52 65 74 2c 20 64 62 45 76 61 6c 43 6f 6c   pRet, dbEvalCol
13590 75 6d 6e 56 61 6c 75 65 28 26 73 45 76 61 6c 2c  umnValue(&sEval,
135a0 20 69 29 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a   i));.        }.
135b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64 62        }.      db
135c0 45 76 61 6c 46 69 6e 61 6c 69 7a 65 28 26 73 45  EvalFinalize(&sE
135d0 76 61 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20  val);.      if( 
135e0 72 63 3d 3d 54 43 4c 5f 42 52 45 41 4b 20 29 7b  rc==TCL_BREAK ){
135f0 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 53 65 74  .        Tcl_Set
13600 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
13610 2c 20 70 52 65 74 29 3b 0a 20 20 20 20 20 20 20  , pRet);.       
13620 20 72 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20   rc = TCL_OK;.  
13630 20 20 20 20 7d 0a 20 20 20 20 20 20 54 63 6c 5f      }.      Tcl_
13640 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 52 65  DecrRefCount(pRe
13650 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  t);.    }else{. 
13660 20 20 20 20 20 43 6c 69 65 6e 74 44 61 74 61 20       ClientData 
13670 63 64 32 5b 32 5d 3b 0a 20 20 20 20 20 20 44 62  cd2[2];.      Db
13680 45 76 61 6c 43 6f 6e 74 65 78 74 20 2a 70 3b 0a  EvalContext *p;.
13690 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70        Tcl_Obj *p
136a0 41 72 72 61 79 20 3d 20 30 3b 0a 20 20 20 20 20  Array = 0;.     
136b0 20 54 63 6c 5f 4f 62 6a 20 2a 70 53 63 72 69 70   Tcl_Obj *pScrip
136c0 74 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 6f 62  t;..      if( ob
136d0 6a 63 3d 3d 35 20 26 26 20 2a 28 63 68 61 72 20  jc==5 && *(char 
136e0 2a 29 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  *)Tcl_GetString(
136f0 6f 62 6a 76 5b 33 5d 29 20 29 7b 0a 20 20 20 20  objv[3]) ){.    
13700 20 20 20 20 70 41 72 72 61 79 20 3d 20 6f 62 6a      pArray = obj
13710 76 5b 33 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  v[3];.      }.  
13720 20 20 20 20 70 53 63 72 69 70 74 20 3d 20 6f 62      pScript = ob
13730 6a 76 5b 6f 62 6a 63 2d 31 5d 3b 0a 20 20 20 20  jv[objc-1];.    
13740 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
13750 6e 74 28 70 53 63 72 69 70 74 29 3b 0a 0a 20 20  nt(pScript);..  
13760 20 20 20 20 70 20 3d 20 28 44 62 45 76 61 6c 43      p = (DbEvalC
13770 6f 6e 74 65 78 74 20 2a 29 54 63 6c 5f 41 6c 6c  ontext *)Tcl_All
13780 6f 63 28 73 69 7a 65 6f 66 28 44 62 45 76 61 6c  oc(sizeof(DbEval
13790 43 6f 6e 74 65 78 74 29 29 3b 0a 20 20 20 20 20  Context));.     
137a0 20 64 62 45 76 61 6c 49 6e 69 74 28 70 2c 20 70   dbEvalInit(p, p
137b0 44 62 2c 20 6f 62 6a 76 5b 32 5d 2c 20 70 41 72  Db, objv[2], pAr
137c0 72 61 79 29 3b 0a 0a 20 20 20 20 20 20 63 64 32  ray);..      cd2
137d0 5b 30 5d 20 3d 20 28 76 6f 69 64 20 2a 29 70 3b  [0] = (void *)p;
137e0 0a 20 20 20 20 20 20 63 64 32 5b 31 5d 20 3d 20  .      cd2[1] = 
137f0 28 76 6f 69 64 20 2a 29 70 53 63 72 69 70 74 3b  (void *)pScript;
13800 0a 20 20 20 20 20 20 72 63 20 3d 20 44 62 45 76  .      rc = DbEv
13810 61 6c 4e 65 78 74 43 6d 64 28 63 64 32 2c 20 69  alNextCmd(cd2, i
13820 6e 74 65 72 70 2c 20 54 43 4c 5f 4f 4b 29 3b 0a  nterp, TCL_OK);.
13830 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b      }.    break;
13840 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
13850 20 20 20 20 24 64 62 20 66 75 6e 63 74 69 6f 6e      $db function
13860 20 4e 41 4d 45 20 5b 2d 61 72 67 63 6f 75 6e 74   NAME [-argcount
13870 20 4e 5d 20 5b 2d 64 65 74 65 72 6d 69 6e 69 73   N] [-determinis
13880 74 69 63 5d 20 53 43 52 49 50 54 0a 20 20 2a 2a  tic] SCRIPT.  **
13890 0a 20 20 2a 2a 20 43 72 65 61 74 65 20 61 20 6e  .  ** Create a n
138a0 65 77 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20  ew SQL function 
138b0 63 61 6c 6c 65 64 20 4e 41 4d 45 2e 20 20 57 68  called NAME.  Wh
138c0 65 6e 65 76 65 72 20 74 68 61 74 20 66 75 6e 63  enever that func
138d0 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 63 61 6c  tion is.  ** cal
138e0 6c 65 64 2c 20 69 6e 76 6f 6b 65 20 53 43 52 49  led, invoke SCRI
138f0 50 54 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74  PT to evaluate t
13900 68 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a  he function..  *
13910 2f 0a 20 20 63 61 73 65 20 44 42 5f 46 55 4e 43  /.  case DB_FUNC
13920 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 69 6e 74 20  TION: {.    int 
13930 66 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 55  flags = SQLITE_U
13940 54 46 38 3b 0a 20 20 20 20 53 71 6c 46 75 6e 63  TF8;.    SqlFunc
13950 20 2a 70 46 75 6e 63 3b 0a 20 20 20 20 54 63 6c   *pFunc;.    Tcl
13960 5f 4f 62 6a 20 2a 70 53 63 72 69 70 74 3b 0a 20  _Obj *pScript;. 
13970 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a     char *zName;.
13980 20 20 20 20 69 6e 74 20 6e 41 72 67 20 3d 20 2d      int nArg = -
13990 31 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  1;.    int i;.  
139a0 20 20 69 66 28 20 6f 62 6a 63 3c 34 20 29 7b 0a    if( objc<4 ){.
139b0 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
139c0 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
139d0 2c 20 6f 62 6a 76 2c 20 22 4e 41 4d 45 20 3f 53  , objv, "NAME ?S
139e0 57 49 54 43 48 45 53 3f 20 53 43 52 49 50 54 22  WITCHES? SCRIPT"
139f0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
13a00 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
13a10 0a 20 20 20 20 66 6f 72 28 69 3d 33 3b 20 69 3c  .    for(i=3; i<
13a20 28 6f 62 6a 63 2d 31 29 3b 20 69 2b 2b 29 7b 0a  (objc-1); i++){.
13a30 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
13a40 20 2a 7a 20 3d 20 54 63 6c 5f 47 65 74 53 74 72   *z = Tcl_GetStr
13a50 69 6e 67 28 6f 62 6a 76 5b 69 5d 29 3b 0a 20 20  ing(objv[i]);.  
13a60 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 74 72 6c      int n = strl
13a70 65 6e 33 30 28 7a 29 3b 0a 20 20 20 20 20 20 69  en30(z);.      i
13a80 66 28 20 6e 3e 32 20 26 26 20 73 74 72 6e 63 6d  f( n>2 && strncm
13a90 70 28 7a 2c 20 22 2d 61 72 67 63 6f 75 6e 74 22  p(z, "-argcount"
13aa0 2c 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ,n)==0 ){.      
13ab0 20 20 69 66 28 20 69 3d 3d 28 6f 62 6a 63 2d 32    if( i==(objc-2
13ac0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54  ) ){.          T
13ad0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
13ae0 69 6e 74 65 72 70 2c 20 22 6f 70 74 69 6f 6e 20  interp, "option 
13af0 72 65 71 75 69 72 65 73 20 61 6e 20 61 72 67 75  requires an argu
13b00 6d 65 6e 74 3a 20 22 2c 20 7a 2c 20 30 29 3b 0a  ment: ", z, 0);.
13b10 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
13b20 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
13b30 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
13b40 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  ( Tcl_GetIntFrom
13b50 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
13b60 5b 69 2b 31 5d 2c 20 26 6e 41 72 67 29 20 29 20  [i+1], &nArg) ) 
13b70 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
13b80 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 41  ;.        if( nA
13b90 72 67 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  rg<0 ){.        
13ba0 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
13bb0 6c 74 28 69 6e 74 65 72 70 2c 20 22 6e 75 6d 62  lt(interp, "numb
13bc0 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
13bd0 6d 75 73 74 20 62 65 20 6e 6f 6e 2d 6e 65 67 61  must be non-nega
13be0 74 69 76 65 22 2c 0a 20 20 20 20 20 20 20 20 20  tive",.         
13bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13c00 20 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20    (char*)0);.   
13c10 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43         return TC
13c20 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20  L_ERROR;.       
13c30 20 7d 0a 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a   }.        i++;.
13c40 20 20 20 20 20 20 7d 65 6c 73 65 0a 20 20 20 20        }else.    
13c50 20 20 69 66 28 20 6e 3e 32 20 26 26 20 73 74 72    if( n>2 && str
13c60 6e 63 6d 70 28 7a 2c 20 22 2d 64 65 74 65 72 6d  ncmp(z, "-determ
13c70 69 6e 69 73 74 69 63 22 2c 6e 29 3d 3d 30 20 29  inistic",n)==0 )
13c80 7b 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73 20  {.        flags 
13c90 7c 3d 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d  |= SQLITE_DETERM
13ca0 49 4e 49 53 54 49 43 3b 0a 20 20 20 20 20 20 7d  INISTIC;.      }
13cb0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 54 63  else{.        Tc
13cc0 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
13cd0 6e 74 65 72 70 2c 20 22 62 61 64 20 6f 70 74 69  nterp, "bad opti
13ce0 6f 6e 20 5c 22 22 2c 20 7a 2c 0a 20 20 20 20 20  on \"", z,.     
13cf0 20 20 20 20 20 20 20 22 5c 22 3a 20 6d 75 73 74         "\": must
13d00 20 62 65 20 2d 61 72 67 63 6f 75 6e 74 20 6f 72   be -argcount or
13d10 20 2d 64 65 74 65 72 6d 69 6e 69 73 74 69 63 22   -deterministic"
13d20 2c 20 30 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  , 0.        );. 
13d30 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43         return TC
13d40 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d  L_ERROR;.      }
13d50 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 53 63 72  .    }..    pScr
13d60 69 70 74 20 3d 20 6f 62 6a 76 5b 6f 62 6a 63 2d  ipt = objv[objc-
13d70 31 5d 3b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20  1];.    zName = 
13d80 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
13d90 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30 29  mObj(objv[2], 0)
13da0 3b 0a 20 20 20 20 70 46 75 6e 63 20 3d 20 66 69  ;.    pFunc = fi
13db0 6e 64 53 71 6c 46 75 6e 63 28 70 44 62 2c 20 7a  ndSqlFunc(pDb, z
13dc0 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 70  Name);.    if( p
13dd0 46 75 6e 63 3d 3d 30 20 29 20 72 65 74 75 72 6e  Func==0 ) return
13de0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
13df0 69 66 28 20 70 46 75 6e 63 2d 3e 70 53 63 72 69  if( pFunc->pScri
13e00 70 74 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  pt ){.      Tcl_
13e10 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 46 75  DecrRefCount(pFu
13e20 6e 63 2d 3e 70 53 63 72 69 70 74 29 3b 0a 20 20  nc->pScript);.  
13e30 20 20 7d 0a 20 20 20 20 70 46 75 6e 63 2d 3e 70    }.    pFunc->p
13e40 53 63 72 69 70 74 20 3d 20 70 53 63 72 69 70 74  Script = pScript
13e50 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65  ;.    Tcl_IncrRe
13e60 66 43 6f 75 6e 74 28 70 53 63 72 69 70 74 29 3b  fCount(pScript);
13e70 0a 20 20 20 20 70 46 75 6e 63 2d 3e 75 73 65 45  .    pFunc->useE
13e80 76 61 6c 4f 62 6a 76 20 3d 20 73 61 66 65 54 6f  valObjv = safeTo
13e90 55 73 65 45 76 61 6c 4f 62 6a 76 28 69 6e 74 65  UseEvalObjv(inte
13ea0 72 70 2c 20 70 53 63 72 69 70 74 29 3b 0a 20 20  rp, pScript);.  
13eb0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63    rc = sqlite3_c
13ec0 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 70  reate_function(p
13ed0 44 62 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20 6e  Db->db, zName, n
13ee0 41 72 67 2c 20 66 6c 61 67 73 2c 0a 20 20 20 20  Arg, flags,.    
13ef0 20 20 20 20 70 46 75 6e 63 2c 20 74 63 6c 53 71      pFunc, tclSq
13f00 6c 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20  lFunc, 0, 0);.  
13f10 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
13f20 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
13f30 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  = TCL_ERROR;.   
13f40 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74     Tcl_SetResult
13f50 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a  (interp, (char *
13f60 29 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28  )sqlite3_errmsg(
13f70 70 44 62 2d 3e 64 62 29 2c 20 54 43 4c 5f 56 4f  pDb->db), TCL_VO
13f80 4c 41 54 49 4c 45 29 3b 0a 20 20 20 20 7d 0a 20  LATILE);.    }. 
13f90 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
13fa0 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62   /*.  **     $db
13fb0 20 69 6e 63 72 62 6c 6f 62 20 3f 2d 72 65 61 64   incrblob ?-read
13fc0 6f 6e 6c 79 3f 20 3f 44 42 3f 20 54 41 42 4c 45  only? ?DB? TABLE
13fd0 20 43 4f 4c 55 4d 4e 20 52 4f 57 49 44 0a 20 20   COLUMN ROWID.  
13fe0 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 49 4e 43  */.  case DB_INC
13ff0 52 42 4c 4f 42 3a 20 7b 0a 23 69 66 64 65 66 20  RBLOB: {.#ifdef 
14000 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52  SQLITE_OMIT_INCR
14010 42 4c 4f 42 0a 20 20 20 20 54 63 6c 5f 41 70 70  BLOB.    Tcl_App
14020 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
14030 2c 20 22 69 6e 63 72 62 6c 6f 62 20 6e 6f 74 20  , "incrblob not 
14040 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 74 68 69  available in thi
14050 73 20 62 75 69 6c 64 22 2c 20 28 63 68 61 72 2a  s build", (char*
14060 29 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  )0);.    return 
14070 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65  TCL_ERROR;.#else
14080 0a 20 20 20 20 69 6e 74 20 69 73 52 65 61 64 6f  .    int isReado
14090 6e 6c 79 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e  nly = 0;.    con
140a0 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 22  st char *zDb = "
140b0 6d 61 69 6e 22 3b 0a 20 20 20 20 63 6f 6e 73 74  main";.    const
140c0 20 63 68 61 72 20 2a 7a 54 61 62 6c 65 3b 0a 20   char *zTable;. 
140d0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
140e0 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 54 63 6c 5f  Column;.    Tcl_
140f0 57 69 64 65 49 6e 74 20 69 52 6f 77 3b 0a 0a 20  WideInt iRow;.. 
14100 20 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20     /* Check for 
14110 74 68 65 20 2d 72 65 61 64 6f 6e 6c 79 20 6f 70  the -readonly op
14120 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 66 28 20  tion */.    if( 
14130 6f 62 6a 63 3e 33 20 26 26 20 73 74 72 63 6d 70  objc>3 && strcmp
14140 28 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f  (Tcl_GetString(o
14150 62 6a 76 5b 32 5d 29 2c 20 22 2d 72 65 61 64 6f  bjv[2]), "-reado
14160 6e 6c 79 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  nly")==0 ){.    
14170 20 20 69 73 52 65 61 64 6f 6e 6c 79 20 3d 20 31    isReadonly = 1
14180 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
14190 20 6f 62 6a 63 21 3d 28 35 2b 69 73 52 65 61 64   objc!=(5+isRead
141a0 6f 6e 6c 79 29 20 26 26 20 6f 62 6a 63 21 3d 28  only) && objc!=(
141b0 36 2b 69 73 52 65 61 64 6f 6e 6c 79 29 20 29 7b  6+isReadonly) ){
141c0 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  .      Tcl_Wrong
141d0 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
141e0 32 2c 20 6f 62 6a 76 2c 20 22 3f 2d 72 65 61 64  2, objv, "?-read
141f0 6f 6e 6c 79 3f 20 3f 44 42 3f 20 54 41 42 4c 45  only? ?DB? TABLE
14200 20 43 4f 4c 55 4d 4e 20 52 4f 57 49 44 22 29 3b   COLUMN ROWID");
14210 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
14220 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a  L_ERROR;.    }..
14230 20 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d 28 36      if( objc==(6
14240 2b 69 73 52 65 61 64 6f 6e 6c 79 29 20 29 7b 0a  +isReadonly) ){.
14250 20 20 20 20 20 20 7a 44 62 20 3d 20 54 63 6c 5f        zDb = Tcl_
14260 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32  GetString(objv[2
14270 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 54  ]);.    }.    zT
14280 61 62 6c 65 20 3d 20 54 63 6c 5f 47 65 74 53 74  able = Tcl_GetSt
14290 72 69 6e 67 28 6f 62 6a 76 5b 6f 62 6a 63 2d 33  ring(objv[objc-3
142a0 5d 29 3b 0a 20 20 20 20 7a 43 6f 6c 75 6d 6e 20  ]);.    zColumn 
142b0 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  = Tcl_GetString(
142c0 6f 62 6a 76 5b 6f 62 6a 63 2d 32 5d 29 3b 0a 20  objv[objc-2]);. 
142d0 20 20 20 72 63 20 3d 20 54 63 6c 5f 47 65 74 57     rc = Tcl_GetW
142e0 69 64 65 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  ideIntFromObj(in
142f0 74 65 72 70 2c 20 6f 62 6a 76 5b 6f 62 6a 63 2d  terp, objv[objc-
14300 31 5d 2c 20 26 69 52 6f 77 29 3b 0a 0a 20 20 20  1], &iRow);..   
14310 20 69 66 28 20 72 63 3d 3d 54 43 4c 5f 4f 4b 20   if( rc==TCL_OK 
14320 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 63 72  ){.      rc = cr
14330 65 61 74 65 49 6e 63 72 62 6c 6f 62 43 68 61 6e  eateIncrblobChan
14340 6e 65 6c 28 0a 20 20 20 20 20 20 20 20 20 20 69  nel(.          i
14350 6e 74 65 72 70 2c 20 70 44 62 2c 20 7a 44 62 2c  nterp, pDb, zDb,
14360 20 7a 54 61 62 6c 65 2c 20 7a 43 6f 6c 75 6d 6e   zTable, zColumn
14370 2c 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  , (sqlite3_int64
14380 29 69 52 6f 77 2c 20 69 73 52 65 61 64 6f 6e 6c  )iRow, isReadonl
14390 79 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d  y.      );.    }
143a0 0a 23 65 6e 64 69 66 0a 20 20 20 20 62 72 65 61  .#endif.    brea
143b0 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  k;.  }..  /*.  *
143c0 2a 20 20 20 20 20 24 64 62 20 69 6e 74 65 72 72  *     $db interr
143d0 75 70 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e  upt.  **.  ** In
143e0 74 65 72 72 75 70 74 20 74 68 65 20 65 78 65 63  terrupt the exec
143f0 75 74 69 6f 6e 20 6f 66 20 74 68 65 20 69 6e 6e  ution of the inn
14400 65 72 2d 6d 6f 73 74 20 53 51 4c 20 69 6e 74 65  er-most SQL inte
14410 72 70 72 65 74 65 72 2e 20 20 54 68 69 73 0a 20  rpreter.  This. 
14420 20 2a 2a 20 63 61 75 73 65 73 20 74 68 65 20 53   ** causes the S
14430 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20  QL statement to 
14440 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20  return an error 
14450 6f 66 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52  of SQLITE_INTERR
14460 55 50 54 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  UPT..  */.  case
14470 20 44 42 5f 49 4e 54 45 52 52 55 50 54 3a 20 7b   DB_INTERRUPT: {
14480 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  .    sqlite3_int
14490 65 72 72 75 70 74 28 70 44 62 2d 3e 64 62 29 3b  errupt(pDb->db);
144a0 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
144b0 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24  .  /*.  **     $
144c0 64 62 20 6e 75 6c 6c 76 61 6c 75 65 20 3f 53 54  db nullvalue ?ST
144d0 52 49 4e 47 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20  RING?.  **.  ** 
144e0 43 68 61 6e 67 65 20 74 65 78 74 20 75 73 65 64  Change text used
144f0 20 77 68 65 6e 20 61 20 4e 55 4c 4c 20 63 6f 6d   when a NULL com
14500 65 73 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65  es back from the
14510 20 64 61 74 61 62 61 73 65 2e 20 49 66 20 3f 53   database. If ?S
14520 54 52 49 4e 47 3f 0a 20 20 2a 2a 20 69 73 20 6e  TRING?.  ** is n
14530 6f 74 20 70 72 65 73 65 6e 74 2c 20 74 68 65 6e  ot present, then
14540 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 74 72   the current str
14550 69 6e 67 20 75 73 65 64 20 66 6f 72 20 4e 55 4c  ing used for NUL
14560 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 20  L is returned.. 
14570 20 2a 2a 20 49 66 20 53 54 52 49 4e 47 20 69 73   ** If STRING is
14580 20 70 72 65 73 65 6e 74 2c 20 74 68 65 6e 20 53   present, then S
14590 54 52 49 4e 47 20 69 73 20 72 65 74 75 72 6e 65  TRING is returne
145a0 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2f 0a 20 20 63  d..  **.  */.  c
145b0 61 73 65 20 44 42 5f 4e 55 4c 4c 56 41 4c 55 45  ase DB_NULLVALUE
145c0 3a 20 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63  : {.    if( objc
145d0 21 3d 32 20 26 26 20 6f 62 6a 63 21 3d 33 20 29  !=2 && objc!=3 )
145e0 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e  {.      Tcl_Wron
145f0 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
14600 20 32 2c 20 6f 62 6a 76 2c 20 22 4e 55 4c 4c 56   2, objv, "NULLV
14610 41 4c 55 45 22 29 3b 0a 20 20 20 20 20 20 72 65  ALUE");.      re
14620 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
14630 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 62      }.    if( ob
14640 6a 63 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20 69  jc==3 ){.      i
14650 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20 63 68  nt len;.      ch
14660 61 72 20 2a 7a 4e 75 6c 6c 20 3d 20 54 63 6c 5f  ar *zNull = Tcl_
14670 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
14680 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b  (objv[2], &len);
14690 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e  .      if( pDb->
146a0 7a 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20  zNull ){.       
146b0 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a   Tcl_Free(pDb->z
146c0 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Null);.      }. 
146d0 20 20 20 20 20 69 66 28 20 7a 4e 75 6c 6c 20 26       if( zNull &
146e0 26 20 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20  & len>0 ){.     
146f0 20 20 20 70 44 62 2d 3e 7a 4e 75 6c 6c 20 3d 20     pDb->zNull = 
14700 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b  Tcl_Alloc( len +
14710 20 31 20 29 3b 0a 20 20 20 20 20 20 20 20 6d 65   1 );.        me
14720 6d 63 70 79 28 70 44 62 2d 3e 7a 4e 75 6c 6c 2c  mcpy(pDb->zNull,
14730 20 7a 4e 75 6c 6c 2c 20 6c 65 6e 29 3b 0a 20 20   zNull, len);.  
14740 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e 75 6c 6c        pDb->zNull
14750 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a 20 20  [len] = '\0';.  
14760 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
14770 20 20 20 70 44 62 2d 3e 7a 4e 75 6c 6c 20 3d 20     pDb->zNull = 
14780 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
14790 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  .    Tcl_SetObjR
147a0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
147b0 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70  l_NewStringObj(p
147c0 44 62 2d 3e 7a 4e 75 6c 6c 2c 20 2d 31 29 29 3b  Db->zNull, -1));
147d0 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
147e0 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24  .  /*.  **     $
147f0 64 62 20 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72  db last_insert_r
14800 6f 77 69 64 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52  owid.  **.  ** R
14810 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72  eturn an integer
14820 20 77 68 69 63 68 20 69 73 20 74 68 65 20 52 4f   which is the RO
14830 57 49 44 20 66 6f 72 20 74 68 65 20 6d 6f 73 74  WID for the most
14840 20 72 65 63 65 6e 74 20 69 6e 73 65 72 74 2e 0a   recent insert..
14850 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 4c    */.  case DB_L
14860 41 53 54 5f 49 4e 53 45 52 54 5f 52 4f 57 49 44  AST_INSERT_ROWID
14870 3a 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20  : {.    Tcl_Obj 
14880 2a 70 52 65 73 75 6c 74 3b 0a 20 20 20 20 54 63  *pResult;.    Tc
14890 6c 5f 57 69 64 65 49 6e 74 20 72 6f 77 69 64 3b  l_WideInt rowid;
148a0 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 32  .    if( objc!=2
148b0 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72   ){.      Tcl_Wr
148c0 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
148d0 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 22 29 3b  p, 2, objv, "");
148e0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
148f0 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
14900 20 20 20 72 6f 77 69 64 20 3d 20 73 71 6c 69 74     rowid = sqlit
14910 65 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72  e3_last_insert_r
14920 6f 77 69 64 28 70 44 62 2d 3e 64 62 29 3b 0a 20  owid(pDb->db);. 
14930 20 20 20 70 52 65 73 75 6c 74 20 3d 20 54 63 6c     pResult = Tcl
14940 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _GetObjResult(in
14950 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f 53  terp);.    Tcl_S
14960 65 74 57 69 64 65 49 6e 74 4f 62 6a 28 70 52 65  etWideIntObj(pRe
14970 73 75 6c 74 2c 20 72 6f 77 69 64 29 3b 0a 20 20  sult, rowid);.  
14980 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
14990 2f 2a 0a 20 20 2a 2a 20 54 68 65 20 44 42 5f 4f  /*.  ** The DB_O
149a0 4e 45 43 4f 4c 55 4d 4e 20 6d 65 74 68 6f 64 20  NECOLUMN method 
149b0 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 74  is implemented t
149c0 6f 67 65 74 68 65 72 20 77 69 74 68 20 44 42 5f  ogether with DB_
149d0 45 58 49 53 54 53 2e 0a 20 20 2a 2f 0a 0a 20 20  EXISTS..  */..  
149e0 2f 2a 20 20 20 20 24 64 62 20 70 72 6f 67 72 65  /*    $db progre
149f0 73 73 20 3f 4e 20 43 41 4c 4c 42 41 43 4b 3f 0a  ss ?N CALLBACK?.
14a00 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 76 6f 6b 65    **.  ** Invoke
14a10 20 74 68 65 20 67 69 76 65 6e 20 63 61 6c 6c 62   the given callb
14a20 61 63 6b 20 65 76 65 72 79 20 4e 20 76 69 72 74  ack every N virt
14a30 75 61 6c 20 6d 61 63 68 69 6e 65 20 6f 70 63 6f  ual machine opco
14a40 64 65 73 20 77 68 69 6c 65 20 65 78 65 63 75 74  des while execut
14a50 69 6e 67 0a 20 20 2a 2a 20 71 75 65 72 69 65 73  ing.  ** queries
14a60 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  ..  */.  case DB
14a70 5f 50 52 4f 47 52 45 53 53 3a 20 7b 0a 20 20 20  _PROGRESS: {.   
14a80 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a   if( objc==2 ){.
14a90 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a        if( pDb->z
14aa0 50 72 6f 67 72 65 73 73 20 29 7b 0a 20 20 20 20  Progress ){.    
14ab0 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
14ac0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 44 62  sult(interp, pDb
14ad0 2d 3e 7a 50 72 6f 67 72 65 73 73 2c 20 28 63 68  ->zProgress, (ch
14ae0 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 7d 0a  ar*)0);.      }.
14af0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 62      }else if( ob
14b00 6a 63 3d 3d 34 20 29 7b 0a 20 20 20 20 20 20 63  jc==4 ){.      c
14b10 68 61 72 20 2a 7a 50 72 6f 67 72 65 73 73 3b 0a  har *zProgress;.
14b20 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20        int len;. 
14b30 20 20 20 20 20 69 6e 74 20 4e 3b 0a 20 20 20 20       int N;.    
14b40 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63    if( TCL_OK!=Tc
14b50 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
14b60 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c  interp, objv[2],
14b70 20 26 4e 29 20 29 7b 0a 20 20 20 20 20 20 20 20   &N) ){.        
14b80 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
14b90 3b 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20  ;.      };.     
14ba0 20 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f 67 72   if( pDb->zProgr
14bb0 65 73 73 20 29 7b 0a 20 20 20 20 20 20 20 20 54  ess ){.        T
14bc0 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 50 72  cl_Free(pDb->zPr
14bd0 6f 67 72 65 73 73 29 3b 0a 20 20 20 20 20 20 7d  ogress);.      }
14be0 0a 20 20 20 20 20 20 7a 50 72 6f 67 72 65 73 73  .      zProgress
14bf0 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
14c00 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d 2c  FromObj(objv[3],
14c10 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69 66   &len);.      if
14c20 28 20 7a 50 72 6f 67 72 65 73 73 20 26 26 20 6c  ( zProgress && l
14c30 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  en>0 ){.        
14c40 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 20 3d  pDb->zProgress =
14c50 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20   Tcl_Alloc( len 
14c60 2b 20 31 20 29 3b 0a 20 20 20 20 20 20 20 20 6d  + 1 );.        m
14c70 65 6d 63 70 79 28 70 44 62 2d 3e 7a 50 72 6f 67  emcpy(pDb->zProg
14c80 72 65 73 73 2c 20 7a 50 72 6f 67 72 65 73 73 2c  ress, zProgress,
14c90 20 6c 65 6e 2b 31 29 3b 0a 20 20 20 20 20 20 7d   len+1);.      }
14ca0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 44  else{.        pD
14cb0 62 2d 3e 7a 50 72 6f 67 72 65 73 73 20 3d 20 30  b->zProgress = 0
14cc0 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65  ;.      }.#ifnde
14cd0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 52  f SQLITE_OMIT_PR
14ce0 4f 47 52 45 53 53 5f 43 41 4c 4c 42 41 43 4b 0a  OGRESS_CALLBACK.
14cf0 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a        if( pDb->z
14d00 50 72 6f 67 72 65 73 73 20 29 7b 0a 20 20 20 20  Progress ){.    
14d10 20 20 20 20 70 44 62 2d 3e 69 6e 74 65 72 70 20      pDb->interp 
14d20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 20 20  = interp;.      
14d30 20 20 73 71 6c 69 74 65 33 5f 70 72 6f 67 72 65    sqlite3_progre
14d40 73 73 5f 68 61 6e 64 6c 65 72 28 70 44 62 2d 3e  ss_handler(pDb->
14d50 64 62 2c 20 4e 2c 20 44 62 50 72 6f 67 72 65 73  db, N, DbProgres
14d60 73 48 61 6e 64 6c 65 72 2c 20 70 44 62 29 3b 0a  sHandler, pDb);.
14d70 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
14d80 20 20 20 20 20 73 71 6c 69 74 65 33 5f 70 72 6f       sqlite3_pro
14d90 67 72 65 73 73 5f 68 61 6e 64 6c 65 72 28 70 44  gress_handler(pD
14da0 62 2d 3e 64 62 2c 20 30 2c 20 30 2c 20 30 29 3b  b->db, 0, 0, 0);
14db0 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
14dc0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
14dd0 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
14de0 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a  s(interp, 2, obj
14df0 76 2c 20 22 4e 20 43 41 4c 4c 42 41 43 4b 22 29  v, "N CALLBACK")
14e00 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
14e10 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
14e20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
14e30 20 20 2f 2a 20 20 20 20 24 64 62 20 70 72 6f 66    /*    $db prof
14e40 69 6c 65 20 3f 43 41 4c 4c 42 41 43 4b 3f 0a 20  ile ?CALLBACK?. 
14e50 20 2a 2a 0a 20 20 2a 2a 20 4d 61 6b 65 20 61 72   **.  ** Make ar
14e60 72 61 6e 67 65 6d 65 6e 74 73 20 74 6f 20 69 6e  rangements to in
14e70 76 6f 6b 65 20 74 68 65 20 43 41 4c 4c 42 41 43  voke the CALLBAC
14e80 4b 20 72 6f 75 74 69 6e 65 20 61 66 74 65 72 20  K routine after 
14e90 65 61 63 68 20 53 51 4c 20 73 74 61 74 65 6d 65  each SQL stateme
14ea0 6e 74 0a 20 20 2a 2a 20 74 68 61 74 20 68 61 73  nt.  ** that has
14eb0 20 72 75 6e 2e 20 20 54 68 65 20 74 65 78 74 20   run.  The text 
14ec0 6f 66 20 74 68 65 20 53 51 4c 20 61 6e 64 20 74  of the SQL and t
14ed0 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 65 6c 61  he amount of ela
14ee0 70 73 65 20 74 69 6d 65 20 61 72 65 0a 20 20 2a  pse time are.  *
14ef0 2a 20 61 70 70 65 6e 64 65 64 20 74 6f 20 43 41  * appended to CA
14f00 4c 4c 42 41 43 4b 20 62 65 66 6f 72 65 20 74 68  LLBACK before th
14f10 65 20 73 63 72 69 70 74 20 69 73 20 72 75 6e 2e  e script is run.
14f20 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f  .  */.  case DB_
14f30 50 52 4f 46 49 4c 45 3a 20 7b 0a 20 20 20 20 69  PROFILE: {.    i
14f40 66 28 20 6f 62 6a 63 3e 33 20 29 7b 0a 20 20 20  f( objc>3 ){.   
14f50 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
14f60 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
14f70 62 6a 76 2c 20 22 3f 43 41 4c 4c 42 41 43 4b 3f  bjv, "?CALLBACK?
14f80 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
14f90 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
14fa0 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d  }else if( objc==
14fb0 32 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  2 ){.      if( p
14fc0 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 20 29 7b 0a  Db->zProfile ){.
14fd0 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65          Tcl_Appe
14fe0 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
14ff0 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 2c 20   pDb->zProfile, 
15000 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20  (char*)0);.     
15010 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
15020 20 20 20 20 63 68 61 72 20 2a 7a 50 72 6f 66 69      char *zProfi
15030 6c 65 3b 0a 20 20 20 20 20 20 69 6e 74 20 6c 65  le;.      int le
15040 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62  n;.      if( pDb
15050 2d 3e 7a 50 72 6f 66 69 6c 65 20 29 7b 0a 20 20  ->zProfile ){.  
15060 20 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70        Tcl_Free(p
15070 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 29 3b 0a 20  Db->zProfile);. 
15080 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 50 72       }.      zPr
15090 6f 66 69 6c 65 20 3d 20 54 63 6c 5f 47 65 74 53  ofile = Tcl_GetS
150a0 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
150b0 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20 20  v[2], &len);.   
150c0 20 20 20 69 66 28 20 7a 50 72 6f 66 69 6c 65 20     if( zProfile 
150d0 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20  && len>0 ){.    
150e0 20 20 20 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c      pDb->zProfil
150f0 65 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c  e = Tcl_Alloc( l
15100 65 6e 20 2b 20 31 20 29 3b 0a 20 20 20 20 20 20  en + 1 );.      
15110 20 20 6d 65 6d 63 70 79 28 70 44 62 2d 3e 7a 50    memcpy(pDb->zP
15120 72 6f 66 69 6c 65 2c 20 7a 50 72 6f 66 69 6c 65  rofile, zProfile
15130 2c 20 6c 65 6e 2b 31 29 3b 0a 20 20 20 20 20 20  , len+1);.      
15140 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
15150 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 20 3d 20 30  Db->zProfile = 0
15160 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 20 21 64  ;.      }.#if !d
15170 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
15180 49 54 5f 54 52 41 43 45 29 20 26 26 20 21 64 65  IT_TRACE) && !de
15190 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
151a0 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54  T_FLOATING_POINT
151b0 29 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d  ).      if( pDb-
151c0 3e 7a 50 72 6f 66 69 6c 65 20 29 7b 0a 20 20 20  >zProfile ){.   
151d0 20 20 20 20 20 70 44 62 2d 3e 69 6e 74 65 72 70       pDb->interp
151e0 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 20   = interp;.     
151f0 20 20 20 73 71 6c 69 74 65 33 5f 70 72 6f 66 69     sqlite3_profi
15200 6c 65 28 70 44 62 2d 3e 64 62 2c 20 44 62 50 72  le(pDb->db, DbPr
15210 6f 66 69 6c 65 48 61 6e 64 6c 65 72 2c 20 70 44  ofileHandler, pD
15220 62 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  b);.      }else{
15230 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
15240 5f 70 72 6f 66 69 6c 65 28 70 44 62 2d 3e 64 62  _profile(pDb->db
15250 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  , 0, 0);.      }
15260 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20  .#endif.    }.  
15270 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
15280 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20  /*.  **     $db 
15290 72 65 6b 65 79 20 4b 45 59 0a 20 20 2a 2a 0a 20  rekey KEY.  **. 
152a0 20 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 65   ** Change the e
152b0 6e 63 72 79 70 74 69 6f 6e 20 6b 65 79 20 6f 6e  ncryption key on
152c0 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79 20 6f   the currently o
152d0 70 65 6e 20 64 61 74 61 62 61 73 65 2e 0a 20 20  pen database..  
152e0 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 52 45 4b  */.  case DB_REK
152f0 45 59 3a 20 7b 0a 23 69 66 20 64 65 66 69 6e 65  EY: {.#if define
15300 64 28 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  d(SQLITE_HAS_COD
15310 45 43 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  EC) && !defined(
15320 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 44 45  SQLITE_OMIT_CODE
15330 43 5f 46 52 4f 4d 5f 54 43 4c 29 0a 20 20 20 20  C_FROM_TCL).    
15340 69 6e 74 20 6e 4b 65 79 3b 0a 20 20 20 20 76 6f  int nKey;.    vo
15350 69 64 20 2a 70 4b 65 79 3b 0a 23 65 6e 64 69 66  id *pKey;.#endif
15360 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 33  .    if( objc!=3
15370 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72   ){.      Tcl_Wr
15380 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
15390 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 4b 45 59  p, 2, objv, "KEY
153a0 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
153b0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
153c0 7d 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  }.#if defined(SQ
153d0 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 29 20  LITE_HAS_CODEC) 
153e0 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
153f0 54 45 5f 4f 4d 49 54 5f 43 4f 44 45 43 5f 46 52  TE_OMIT_CODEC_FR
15400 4f 4d 5f 54 43 4c 29 0a 20 20 20 20 70 4b 65 79  OM_TCL).    pKey
15410 20 3d 20 54 63 6c 5f 47 65 74 42 79 74 65 41 72   = Tcl_GetByteAr
15420 72 61 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  rayFromObj(objv[
15430 32 5d 2c 20 26 6e 4b 65 79 29 3b 0a 20 20 20 20  2], &nKey);.    
15440 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 6b  rc = sqlite3_rek
15450 65 79 28 70 44 62 2d 3e 64 62 2c 20 70 4b 65 79  ey(pDb->db, pKey
15460 2c 20 6e 4b 65 79 29 3b 0a 20 20 20 20 69 66 28  , nKey);.    if(
15470 20 72 63 20 29 7b 0a 20 20 20 20 20 20 54 63 6c   rc ){.      Tcl
15480 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
15490 74 65 72 70 2c 20 73 71 6c 69 74 65 33 5f 65 72  terp, sqlite3_er
154a0 72 73 74 72 28 72 63 29 2c 20 28 63 68 61 72 2a  rstr(rc), (char*
154b0 29 30 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  )0);.      rc = 
154c0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
154d0 0a 23 65 6e 64 69 66 0a 20 20 20 20 62 72 65 61  .#endif.    brea
154e0 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20  k;.  }..  /*    
154f0 24 64 62 20 72 65 73 74 6f 72 65 20 3f 44 41 54  $db restore ?DAT
15500 41 42 41 53 45 3f 20 46 49 4c 45 4e 41 4d 45 0a  ABASE? FILENAME.
15510 20 20 2a 2a 0a 20 20 2a 2a 20 4f 70 65 6e 20 61    **.  ** Open a
15520 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e   database file n
15530 61 6d 65 64 20 46 49 4c 45 4e 41 4d 45 2e 20 20  amed FILENAME.  
15540 54 72 61 6e 73 66 65 72 20 74 68 65 20 63 6f 6e  Transfer the con
15550 74 65 6e 74 0a 20 20 2a 2a 20 6f 66 20 46 49 4c  tent.  ** of FIL
15560 45 4e 41 4d 45 20 69 6e 74 6f 20 74 68 65 20 6c  ENAME into the l
15570 6f 63 61 6c 20 64 61 74 61 62 61 73 65 20 44 41  ocal database DA
15580 54 41 42 41 53 45 20 28 64 65 66 61 75 6c 74 3a  TABASE (default:
15590 20 22 6d 61 69 6e 22 29 2e 0a 20 20 2a 2f 0a 20   "main")..  */. 
155a0 20 63 61 73 65 20 44 42 5f 52 45 53 54 4f 52 45   case DB_RESTORE
155b0 3a 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  : {.    const ch
155c0 61 72 20 2a 7a 53 72 63 46 69 6c 65 3b 0a 20 20  ar *zSrcFile;.  
155d0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
155e0 65 73 74 44 62 3b 0a 20 20 20 20 73 71 6c 69 74  estDb;.    sqlit
155f0 65 33 20 2a 70 53 72 63 3b 0a 20 20 20 20 73 71  e3 *pSrc;.    sq
15600 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 2a 70 42  lite3_backup *pB
15610 61 63 6b 75 70 3b 0a 20 20 20 20 69 6e 74 20 6e  ackup;.    int n
15620 54 69 6d 65 6f 75 74 20 3d 20 30 3b 0a 0a 20 20  Timeout = 0;..  
15630 20 20 69 66 28 20 6f 62 6a 63 3d 3d 33 20 29 7b    if( objc==3 ){
15640 0a 20 20 20 20 20 20 7a 44 65 73 74 44 62 20 3d  .      zDestDb =
15650 20 22 6d 61 69 6e 22 3b 0a 20 20 20 20 20 20 7a   "main";.      z
15660 53 72 63 46 69 6c 65 20 3d 20 54 63 6c 5f 47 65  SrcFile = Tcl_Ge
15670 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29  tString(objv[2])
15680 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
15690 6f 62 6a 63 3d 3d 34 20 29 7b 0a 20 20 20 20 20  objc==4 ){.     
156a0 20 7a 44 65 73 74 44 62 20 3d 20 54 63 6c 5f 47   zDestDb = Tcl_G
156b0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d  etString(objv[2]
156c0 29 3b 0a 20 20 20 20 20 20 7a 53 72 63 46 69 6c  );.      zSrcFil
156d0 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  e = Tcl_GetStrin
156e0 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a 20 20 20 20  g(objv[3]);.    
156f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 54 63 6c  }else{.      Tcl
15700 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
15710 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22  terp, 2, objv, "
15720 3f 44 41 54 41 42 41 53 45 3f 20 46 49 4c 45 4e  ?DATABASE? FILEN
15730 41 4d 45 22 29 3b 0a 20 20 20 20 20 20 72 65 74  AME");.      ret
15740 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
15750 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71     }.    rc = sq
15760 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 7a 53  lite3_open_v2(zS
15770 72 63 46 69 6c 65 2c 20 26 70 53 72 63 2c 0a 20  rcFile, &pSrc,. 
15780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15790 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
157a0 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 7c 20 70  PEN_READONLY | p
157b0 44 62 2d 3e 6f 70 65 6e 46 6c 61 67 73 2c 20 30  Db->openFlags, 0
157c0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
157d0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
157e0 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
157f0 6c 74 28 69 6e 74 65 72 70 2c 20 22 63 61 6e 6e  lt(interp, "cann
15800 6f 74 20 6f 70 65 6e 20 73 6f 75 72 63 65 20 64  ot open source d
15810 61 74 61 62 61 73 65 3a 20 22 2c 0a 20 20 20 20  atabase: ",.    
15820 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65         sqlite3_e
15830 72 72 6d 73 67 28 70 53 72 63 29 2c 20 28 63 68  rrmsg(pSrc), (ch
15840 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 73 71  ar*)0);.      sq
15850 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70 53 72 63  lite3_close(pSrc
15860 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
15870 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
15880 0a 20 20 20 20 70 42 61 63 6b 75 70 20 3d 20 73  .    pBackup = s
15890 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f 69 6e  qlite3_backup_in
158a0 69 74 28 70 44 62 2d 3e 64 62 2c 20 7a 44 65 73  it(pDb->db, zDes
158b0 74 44 62 2c 20 70 53 72 63 2c 20 22 6d 61 69 6e  tDb, pSrc, "main
158c0 22 29 3b 0a 20 20 20 20 69 66 28 20 70 42 61 63  ");.    if( pBac
158d0 6b 75 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  kup==0 ){.      
158e0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
158f0 28 69 6e 74 65 72 70 2c 20 22 72 65 73 74 6f 72  (interp, "restor
15900 65 20 66 61 69 6c 65 64 3a 20 22 2c 0a 20 20 20  e failed: ",.   
15910 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
15920 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c  errmsg(pDb->db),
15930 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20   (char*)0);.    
15940 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28    sqlite3_close(
15950 70 53 72 63 29 3b 0a 20 20 20 20 20 20 72 65 74  pSrc);.      ret
15960 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
15970 20 20 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20     }.    while( 
15980 28 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 61  (rc = sqlite3_ba
15990 63 6b 75 70 5f 73 74 65 70 28 70 42 61 63 6b 75  ckup_step(pBacku
159a0 70 2c 31 30 30 29 29 3d 3d 53 51 4c 49 54 45 5f  p,100))==SQLITE_
159b0 4f 4b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  OK.             
159c0 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42   || rc==SQLITE_B
159d0 55 53 59 20 29 7b 0a 20 20 20 20 20 20 69 66 28  USY ){.      if(
159e0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59   rc==SQLITE_BUSY
159f0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
15a00 6e 54 69 6d 65 6f 75 74 2b 2b 20 3e 3d 20 33 20  nTimeout++ >= 3 
15a10 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
15a20 20 73 71 6c 69 74 65 33 5f 73 6c 65 65 70 28 31   sqlite3_sleep(1
15a30 30 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  00);.      }.   
15a40 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62   }.    sqlite3_b
15a50 61 63 6b 75 70 5f 66 69 6e 69 73 68 28 70 42 61  ackup_finish(pBa
15a60 63 6b 75 70 29 3b 0a 20 20 20 20 69 66 28 20 72  ckup);.    if( r
15a70 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c==SQLITE_DONE )
15a80 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c  {.      rc = TCL
15a90 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  _OK;.    }else i
15aa0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55  f( rc==SQLITE_BU
15ab0 53 59 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45  SY || rc==SQLITE
15ac0 5f 4c 4f 43 4b 45 44 20 29 7b 0a 20 20 20 20 20  _LOCKED ){.     
15ad0 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
15ae0 74 28 69 6e 74 65 72 70 2c 20 22 72 65 73 74 6f  t(interp, "resto
15af0 72 65 20 66 61 69 6c 65 64 3a 20 73 6f 75 72 63  re failed: sourc
15b00 65 20 64 61 74 61 62 61 73 65 20 62 75 73 79 22  e database busy"
15b10 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
15b20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29           (char*)
15b30 30 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 54  0);.      rc = T
15b40 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65  CL_ERROR;.    }e
15b50 6c 73 65 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41  lse{.      Tcl_A
15b60 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
15b70 72 70 2c 20 22 72 65 73 74 6f 72 65 20 66 61 69  rp, "restore fai
15b80 6c 65 64 3a 20 22 2c 0a 20 20 20 20 20 20 20 20  led: ",.        
15b90 20 20 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73     sqlite3_errms
15ba0 67 28 70 44 62 2d 3e 64 62 29 2c 20 28 63 68 61  g(pDb->db), (cha
15bb0 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 72 63 20  r*)0);.      rc 
15bc0 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  = TCL_ERROR;.   
15bd0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63   }.    sqlite3_c
15be0 6c 6f 73 65 28 70 53 72 63 29 3b 0a 20 20 20 20  lose(pSrc);.    
15bf0 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
15c00 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20 73 74  .  **     $db st
15c10 61 74 75 73 20 28 73 74 65 70 7c 73 6f 72 74 7c  atus (step|sort|
15c20 61 75 74 6f 69 6e 64 65 78 29 0a 20 20 2a 2a 0a  autoindex).  **.
15c30 20 20 2a 2a 20 44 69 73 70 6c 61 79 20 53 51 4c    ** Display SQL
15c40 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 46  ITE_STMTSTATUS_F
15c50 55 4c 4c 53 43 41 4e 5f 53 54 45 50 20 6f 72 0a  ULLSCAN_STEP or.
15c60 20 20 2a 2a 20 53 51 4c 49 54 45 5f 53 54 4d 54    ** SQLITE_STMT
15c70 53 54 41 54 55 53 5f 53 4f 52 54 20 66 6f 72 20  STATUS_SORT for 
15c80 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20  the most recent 
15c90 65 76 61 6c 2e 0a 20 20 2a 2f 0a 20 20 63 61 73  eval..  */.  cas
15ca0 65 20 44 42 5f 53 54 41 54 55 53 3a 20 7b 0a 20  e DB_STATUS: {. 
15cb0 20 20 20 69 6e 74 20 76 3b 0a 20 20 20 20 63 6f     int v;.    co
15cc0 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70 3b 0a 20  nst char *zOp;. 
15cd0 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29     if( objc!=3 )
15ce0 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e  {.      Tcl_Wron
15cf0 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
15d00 20 32 2c 20 6f 62 6a 76 2c 20 22 28 73 74 65 70   2, objv, "(step
15d10 7c 73 6f 72 74 7c 61 75 74 6f 69 6e 64 65 78 29  |sort|autoindex)
15d20 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
15d30 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
15d40 7d 0a 20 20 20 20 7a 4f 70 20 3d 20 54 63 6c 5f  }.    zOp = Tcl_
15d50 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32  GetString(objv[2
15d60 5d 29 3b 0a 20 20 20 20 69 66 28 20 73 74 72 63  ]);.    if( strc
15d70 6d 70 28 7a 4f 70 2c 20 22 73 74 65 70 22 29 3d  mp(zOp, "step")=
15d80 3d 30 20 29 7b 0a 20 20 20 20 20 20 76 20 3d 20  =0 ){.      v = 
15d90 70 44 62 2d 3e 6e 53 74 65 70 3b 0a 20 20 20 20  pDb->nStep;.    
15da0 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
15db0 28 7a 4f 70 2c 20 22 73 6f 72 74 22 29 3d 3d 30  (zOp, "sort")==0
15dc0 20 29 7b 0a 20 20 20 20 20 20 76 20 3d 20 70 44   ){.      v = pD
15dd0 62 2d 3e 6e 53 6f 72 74 3b 0a 20 20 20 20 7d 65  b->nSort;.    }e
15de0 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a  lse if( strcmp(z
15df0 4f 70 2c 20 22 61 75 74 6f 69 6e 64 65 78 22 29  Op, "autoindex")
15e00 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 76 20 3d  ==0 ){.      v =
15e10 20 70 44 62 2d 3e 6e 49 6e 64 65 78 3b 0a 20 20   pDb->nIndex;.  
15e20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 54    }else{.      T
15e30 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
15e40 69 6e 74 65 72 70 2c 0a 20 20 20 20 20 20 20 20  interp,.        
15e50 20 20 20 20 22 62 61 64 20 61 72 67 75 6d 65 6e      "bad argumen
15e60 74 3a 20 73 68 6f 75 6c 64 20 62 65 20 61 75 74  t: should be aut
15e70 6f 69 6e 64 65 78 2c 20 73 74 65 70 2c 20 6f 72  oindex, step, or
15e80 20 73 6f 72 74 22 2c 0a 20 20 20 20 20 20 20 20   sort",.        
15e90 20 20 20 20 28 63 68 61 72 2a 29 30 29 3b 0a 20      (char*)0);. 
15ea0 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
15eb0 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
15ec0 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
15ed0 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
15ee0 77 49 6e 74 4f 62 6a 28 76 29 29 3b 0a 20 20 20  wIntObj(v));.   
15ef0 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
15f00 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20 74  *.  **     $db t
15f10 69 6d 65 6f 75 74 20 4d 49 4c 4c 45 53 45 43 4f  imeout MILLESECO
15f20 4e 44 53 0a 20 20 2a 2a 0a 20 20 2a 2a 20 44 65  NDS.  **.  ** De
15f30 6c 61 79 20 66 6f 72 20 74 68 65 20 6e 75 6d 62  lay for the numb
15f40 65 72 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e  er of millisecon
15f50 64 73 20 73 70 65 63 69 66 69 65 64 20 77 68 65  ds specified whe
15f60 6e 20 61 20 66 69 6c 65 20 69 73 20 6c 6f 63 6b  n a file is lock
15f70 65 64 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  ed..  */.  case 
15f80 44 42 5f 54 49 4d 45 4f 55 54 3a 20 7b 0a 20 20  DB_TIMEOUT: {.  
15f90 20 20 69 6e 74 20 6d 73 3b 0a 20 20 20 20 69 66    int ms;.    if
15fa0 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20  ( objc!=3 ){.   
15fb0 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
15fc0 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
15fd0 62 6a 76 2c 20 22 4d 49 4c 4c 49 53 45 43 4f 4e  bjv, "MILLISECON
15fe0 44 53 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  DS");.      retu
15ff0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
16000 20 20 7d 0a 20 20 20 20 69 66 28 20 54 63 6c 5f    }.    if( Tcl_
16010 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
16020 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26  terp, objv[2], &
16030 6d 73 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  ms) ) return TCL
16040 5f 45 52 52 4f 52 3b 0a 20 20 20 20 73 71 6c 69  _ERROR;.    sqli
16050 74 65 33 5f 62 75 73 79 5f 74 69 6d 65 6f 75 74  te3_busy_timeout
16060 28 70 44 62 2d 3e 64 62 2c 20 6d 73 29 3b 0a 20  (pDb->db, ms);. 
16070 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
16080 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62   /*.  **     $db
16090 20 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73 0a 20   total_changes. 
160a0 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20   **.  ** Return 
160b0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
160c0 77 73 20 74 68 61 74 20 77 65 72 65 20 6d 6f 64  ws that were mod
160d0 69 66 69 65 64 2c 20 69 6e 73 65 72 74 65 64 2c  ified, inserted,
160e0 20 6f 72 20 64 65 6c 65 74 65 64 0a 20 20 2a 2a   or deleted.  **
160f0 20 73 69 6e 63 65 20 74 68 65 20 64 61 74 61 62   since the datab
16100 61 73 65 20 68 61 6e 64 6c 65 20 77 61 73 20 63  ase handle was c
16110 72 65 61 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 63  reated..  */.  c
16120 61 73 65 20 44 42 5f 54 4f 54 41 4c 5f 43 48 41  ase DB_TOTAL_CHA
16130 4e 47 45 53 3a 20 7b 0a 20 20 20 20 54 63 6c 5f  NGES: {.    Tcl_
16140 4f 62 6a 20 2a 70 52 65 73 75 6c 74 3b 0a 20 20  Obj *pResult;.  
16150 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b    if( objc!=2 ){
16160 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  .      Tcl_Wrong
16170 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
16180 32 2c 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 20 20  2, objv, "");.  
16190 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
161a0 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
161b0 70 52 65 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65  pResult = Tcl_Ge
161c0 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
161d0 70 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 49  p);.    Tcl_SetI
161e0 6e 74 4f 62 6a 28 70 52 65 73 75 6c 74 2c 20 73  ntObj(pResult, s
161f0 71 6c 69 74 65 33 5f 74 6f 74 61 6c 5f 63 68 61  qlite3_total_cha
16200 6e 67 65 73 28 70 44 62 2d 3e 64 62 29 29 3b 0a  nges(pDb->db));.
16210 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
16220 20 20 2f 2a 20 20 20 20 24 64 62 20 74 72 61 63    /*    $db trac
16230 65 20 3f 43 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a  e ?CALLBACK?.  *
16240 2a 0a 20 20 2a 2a 20 4d 61 6b 65 20 61 72 72 61  *.  ** Make arra
16250 6e 67 65 6d 65 6e 74 73 20 74 6f 20 69 6e 76 6f  ngements to invo
16260 6b 65 20 74 68 65 20 43 41 4c 4c 42 41 43 4b 20  ke the CALLBACK 
16270 72 6f 75 74 69 6e 65 20 66 6f 72 20 65 61 63 68  routine for each
16280 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 0a 20   SQL statement. 
16290 20 2a 2a 20 74 68 61 74 20 69 73 20 65 78 65 63   ** that is exec
162a0 75 74 65 64 2e 20 20 54 68 65 20 74 65 78 74 20  uted.  The text 
162b0 6f 66 20 74 68 65 20 53 51 4c 20 69 73 20 61 70  of the SQL is ap
162c0 70 65 6e 64 65 64 20 74 6f 20 43 41 4c 4c 42 41  pended to CALLBA
162d0 43 4b 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20 69  CK before.  ** i
162e0 74 20 69 73 20 65 78 65 63 75 74 65 64 2e 0a 20  t is executed.. 
162f0 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 54 52   */.  case DB_TR
16300 41 43 45 3a 20 7b 0a 20 20 20 20 69 66 28 20 6f  ACE: {.    if( o
16310 62 6a 63 3e 33 20 29 7b 0a 20 20 20 20 20 20 54  bjc>3 ){.      T
16320 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
16330 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c  interp, 2, objv,
16340 20 22 3f 43 41 4c 4c 42 41 43 4b 3f 22 29 3b 0a   "?CALLBACK?");.
16350 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
16360 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73  _ERROR;.    }els
16370 65 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b  e if( objc==2 ){
16380 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e  .      if( pDb->
16390 7a 54 72 61 63 65 20 29 7b 0a 20 20 20 20 20 20  zTrace ){.      
163a0 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
163b0 6c 74 28 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e  lt(interp, pDb->
163c0 7a 54 72 61 63 65 2c 20 28 63 68 61 72 2a 29 30  zTrace, (char*)0
163d0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
163e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72  else{.      char
163f0 20 2a 7a 54 72 61 63 65 3b 0a 20 20 20 20 20 20   *zTrace;.      
16400 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20 69  int len;.      i
16410 66 28 20 70 44 62 2d 3e 7a 54 72 61 63 65 20 29  f( pDb->zTrace )
16420 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 46 72  {.        Tcl_Fr
16430 65 65 28 70 44 62 2d 3e 7a 54 72 61 63 65 29 3b  ee(pDb->zTrace);
16440 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a  .      }.      z
16450 54 72 61 63 65 20 3d 20 54 63 6c 5f 47 65 74 53  Trace = Tcl_GetS
16460 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
16470 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20 20  v[2], &len);.   
16480 20 20 20 69 66 28 20 7a 54 72 61 63 65 20 26 26     if( zTrace &&
16490 20 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20   len>0 ){.      
164a0 20 20 70 44 62 2d 3e 7a 54 72 61 63 65 20 3d 20    pDb->zTrace = 
164b0 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b  Tcl_Alloc( len +
164c0 20 31 20 29 3b 0a 20 20 20 20 20 20 20 20 6d 65   1 );.        me
164d0 6d 63 70 79 28 70 44 62 2d 3e 7a 54 72 61 63 65  mcpy(pDb->zTrace
164e0 2c 20 7a 54 72 61 63 65 2c 20 6c 65 6e 2b 31 29  , zTrace, len+1)
164f0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
16500 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 54 72 61         pDb->zTra
16510 63 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  ce = 0;.      }.
16520 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
16530 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 29 20  ITE_OMIT_TRACE) 
16540 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
16550 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47  TE_OMIT_FLOATING
16560 5f 50 4f 49 4e 54 29 20 5c 0a 20 20 20 20 26 26  _POINT) \.    &&
16570 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
16580 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41 54 45 44  _OMIT_DEPRECATED
16590 29 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d  ).      if( pDb-
165a0 3e 7a 54 72 61 63 65 20 29 7b 0a 20 20 20 20 20  >zTrace ){.     
165b0 20 20 20 70 44 62 2d 3e 69 6e 74 65 72 70 20 3d     pDb->interp =
165c0 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 20 20 20   interp;.       
165d0 20 73 71 6c 69 74 65 33 5f 74 72 61 63 65 28 70   sqlite3_trace(p
165e0 44 62 2d 3e 64 62 2c 20 44 62 54 72 61 63 65 48  Db->db, DbTraceH
165f0 61 6e 64 6c 65 72 2c 20 70 44 62 29 3b 0a 20 20  andler, pDb);.  
16600 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
16610 20 20 20 73 71 6c 69 74 65 33 5f 74 72 61 63 65     sqlite3_trace
16620 28 70 44 62 2d 3e 64 62 2c 20 30 2c 20 30 29 3b  (pDb->db, 0, 0);
16630 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
16640 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b      }.    break;
16650 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64  .  }..  /*    $d
16660 62 20 74 72 61 63 65 5f 76 32 20 3f 43 41 4c 4c  b trace_v2 ?CALL
16670 42 41 43 4b 3f 20 3f 4d 41 53 4b 3f 0a 20 20 2a  BACK? ?MASK?.  *
16680 2a 0a 20 20 2a 2a 20 4d 61 6b 65 20 61 72 72 61  *.  ** Make arra
16690 6e 67 65 6d 65 6e 74 73 20 74 6f 20 69 6e 76 6f  ngements to invo
166a0 6b 65 20 74 68 65 20 43 41 4c 4c 42 41 43 4b 20  ke the CALLBACK 
166b0 72 6f 75 74 69 6e 65 20 66 6f 72 20 65 61 63 68  routine for each
166c0 20 74 72 61 63 65 20 65 76 65 6e 74 0a 20 20 2a   trace event.  *
166d0 2a 20 6d 61 74 63 68 69 6e 67 20 74 68 65 20 6d  * matching the m
166e0 61 73 6b 20 74 68 61 74 20 69 73 20 67 65 6e 65  ask that is gene
166f0 72 61 74 65 64 2e 20 20 54 68 65 20 70 61 72 61  rated.  The para
16700 6d 65 74 65 72 73 20 61 72 65 20 61 70 70 65 6e  meters are appen
16710 64 65 64 20 74 6f 0a 20 20 2a 2a 20 43 41 4c 4c  ded to.  ** CALL
16720 42 41 43 4b 20 62 65 66 6f 72 65 20 69 74 20 69  BACK before it i
16730 73 20 65 78 65 63 75 74 65 64 2e 0a 20 20 2a 2f  s executed..  */
16740 0a 20 20 63 61 73 65 20 44 42 5f 54 52 41 43 45  .  case DB_TRACE
16750 5f 56 32 3a 20 7b 0a 20 20 20 20 69 66 28 20 6f  _V2: {.    if( o
16760 62 6a 63 3e 34 20 29 7b 0a 20 20 20 20 20 20 54  bjc>4 ){.      T
16770 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
16780 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c  interp, 2, objv,
16790 20 22 3f 43 41 4c 4c 42 41 43 4b 3f 20 3f 4d 41   "?CALLBACK? ?MA
167a0 53 4b 3f 22 29 3b 0a 20 20 20 20 20 20 72 65 74  SK?");.      ret
167b0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
167c0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a     }else if( obj
167d0 63 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 69 66  c==2 ){.      if
167e0 28 20 70 44 62 2d 3e 7a 54 72 61 63 65 56 32 20  ( pDb->zTraceV2 
167f0 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41  ){.        Tcl_A
16800 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
16810 72 70 2c 20 70 44 62 2d 3e 7a 54 72 61 63 65 56  rp, pDb->zTraceV
16820 32 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  2, (char*)0);.  
16830 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
16840 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 72  .      char *zTr
16850 61 63 65 56 32 3b 0a 20 20 20 20 20 20 69 6e 74  aceV2;.      int
16860 20 6c 65 6e 3b 0a 20 20 20 20 20 20 54 63 6c 5f   len;.      Tcl_
16870 57 69 64 65 49 6e 74 20 77 4d 61 73 6b 20 3d 20  WideInt wMask = 
16880 30 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 62 6a  0;.      if( obj
16890 63 3d 3d 34 20 29 7b 0a 20 20 20 20 20 20 20 20  c==4 ){.        
168a0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
168b0 72 20 2a 54 54 59 50 45 5f 73 74 72 73 5b 5d 20  r *TTYPE_strs[] 
168c0 3d 20 7b 0a 20 20 20 20 20 20 20 20 20 20 22 73  = {.          "s
168d0 74 61 74 65 6d 65 6e 74 22 2c 20 22 70 72 6f 66  tatement", "prof
168e0 69 6c 65 22 2c 20 22 72 6f 77 22 2c 20 22 63 6c  ile", "row", "cl
168f0 6f 73 65 22 2c 20 30 0a 20 20 20 20 20 20 20 20  ose", 0.        
16900 7d 3b 0a 20 20 20 20 20 20 20 20 65 6e 75 6d 20  };.        enum 
16910 54 54 59 50 45 5f 65 6e 75 6d 20 7b 0a 20 20 20  TTYPE_enum {.   
16920 20 20 20 20 20 20 20 54 54 59 50 45 5f 53 54 4d         TTYPE_STM
16930 54 2c 20 54 54 59 50 45 5f 50 52 4f 46 49 4c 45  T, TTYPE_PROFILE
16940 2c 20 54 54 59 50 45 5f 52 4f 57 2c 20 54 54 59  , TTYPE_ROW, TTY
16950 50 45 5f 43 4c 4f 53 45 0a 20 20 20 20 20 20 20  PE_CLOSE.       
16960 20 7d 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   };.        int 
16970 69 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 54  i;.        if( T
16980 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 4c 69 73 74 4f  CL_OK!=Tcl_ListO
16990 62 6a 4c 65 6e 67 74 68 28 69 6e 74 65 72 70 2c  bjLength(interp,
169a0 20 6f 62 6a 76 5b 33 5d 2c 20 26 6c 65 6e 29 20   objv[3], &len) 
169b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
169c0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
169d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
169e0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6e 3b   for(i=0; i<len;
169f0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
16a00 20 54 63 6c 5f 4f 62 6a 20 2a 70 4f 62 6a 3b 0a   Tcl_Obj *pObj;.
16a10 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 74 74            int tt
16a20 79 70 65 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ype;.          i
16a30 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 4c  f( TCL_OK!=Tcl_L
16a40 69 73 74 4f 62 6a 49 6e 64 65 78 28 69 6e 74 65  istObjIndex(inte
16a50 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 69 2c 20  rp, objv[3], i, 
16a60 26 70 4f 62 6a 29 20 29 7b 0a 20 20 20 20 20 20  &pObj) ){.      
16a70 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
16a80 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20  _ERROR;.        
16a90 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66    }.          if
16aa0 28 20 54 63 6c 5f 47 65 74 49 6e 64 65 78 46 72  ( Tcl_GetIndexFr
16ab0 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 70 4f  omObj(interp, pO
16ac0 62 6a 2c 20 54 54 59 50 45 5f 73 74 72 73 2c 20  bj, TTYPE_strs, 
16ad0 22 74 72 61 63 65 20 74 79 70 65 22 2c 0a 20 20  "trace type",.  
16ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16b00 30 2c 20 26 74 74 79 70 65 29 21 3d 54 43 4c 5f  0, &ttype)!=TCL_
16b10 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
16b20 20 20 54 63 6c 5f 57 69 64 65 49 6e 74 20 77 54    Tcl_WideInt wT
16b30 79 70 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ype;.           
16b40 20 54 63 6c 5f 4f 62 6a 20 2a 70 45 72 72 6f 72   Tcl_Obj *pError
16b50 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65   = Tcl_Duplicate
16b60 4f 62 6a 28 54 63 6c 5f 47 65 74 4f 62 6a 52 65  Obj(Tcl_GetObjRe
16b70 73 75 6c 74 28 69 6e 74 65 72 70 29 29 3b 0a 20  sult(interp));. 
16b80 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 49             Tcl_I
16b90 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 45 72 72  ncrRefCount(pErr
16ba0 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  or);.           
16bb0 20 69 66 28 20 54 43 4c 5f 4f 4b 3d 3d 54 63 6c   if( TCL_OK==Tcl
16bc0 5f 47 65 74 57 69 64 65 49 6e 74 46 72 6f 6d 4f  _GetWideIntFromO
16bd0 62 6a 28 69 6e 74 65 72 70 2c 20 70 4f 62 6a 2c  bj(interp, pObj,
16be0 20 26 77 54 79 70 65 29 20 29 7b 0a 20 20 20 20   &wType) ){.    
16bf0 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 44 65            Tcl_De
16c00 63 72 52 65 66 43 6f 75 6e 74 28 70 45 72 72 6f  crRefCount(pErro
16c10 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  r);.            
16c20 20 20 77 4d 61 73 6b 20 7c 3d 20 77 54 79 70 65    wMask |= wType
16c30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65  ;.            }e
16c40 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
16c50 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73     Tcl_SetObjRes
16c60 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 45 72 72  ult(interp, pErr
16c70 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  or);.           
16c80 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f     Tcl_DecrRefCo
16c90 75 6e 74 28 70 45 72 72 6f 72 29 3b 0a 20 20 20  unt(pError);.   
16ca0 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
16cb0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
16cc0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
16cd0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
16ce0 20 20 20 20 20 20 20 20 73 77 69 74 63 68 28 20          switch( 
16cf0 28 65 6e 75 6d 20 54 54 59 50 45 5f 65 6e 75 6d  (enum TTYPE_enum
16d00 29 74 74 79 70 65 20 29 7b 0a 20 20 20 20 20 20  )ttype ){.      
16d10 20 20 20 20 20 20 20 20 63 61 73 65 20 54 54 59          case TTY
16d20 50 45 5f 53 54 4d 54 3a 20 20 20 20 77 4d 61 73  PE_STMT:    wMas
16d30 6b 20 7c 3d 20 53 51 4c 49 54 45 5f 54 52 41 43  k |= SQLITE_TRAC
16d40 45 5f 53 54 4d 54 3b 20 20 20 20 62 72 65 61 6b  E_STMT;    break
16d50 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
16d60 63 61 73 65 20 54 54 59 50 45 5f 50 52 4f 46 49  case TTYPE_PROFI
16d70 4c 45 3a 20 77 4d 61 73 6b 20 7c 3d 20 53 51 4c  LE: wMask |= SQL
16d80 49 54 45 5f 54 52 41 43 45 5f 50 52 4f 46 49 4c  ITE_TRACE_PROFIL
16d90 45 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  E; break;.      
16da0 20 20 20 20 20 20 20 20 63 61 73 65 20 54 54 59          case TTY
16db0 50 45 5f 52 4f 57 3a 20 20 20 20 20 77 4d 61 73  PE_ROW:     wMas
16dc0 6b 20 7c 3d 20 53 51 4c 49 54 45 5f 54 52 41 43  k |= SQLITE_TRAC
16dd0 45 5f 52 4f 57 3b 20 20 20 20 20 62 72 65 61 6b  E_ROW;     break
16de0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
16df0 63 61 73 65 20 54 54 59 50 45 5f 43 4c 4f 53 45  case TTYPE_CLOSE
16e00 3a 20 20 20 77 4d 61 73 6b 20 7c 3d 20 53 51 4c  :   wMask |= SQL
16e10 49 54 45 5f 54 52 41 43 45 5f 43 4c 4f 53 45 3b  ITE_TRACE_CLOSE;
16e20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
16e30 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
16e40 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
16e50 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
16e60 20 20 20 77 4d 61 73 6b 20 3d 20 53 51 4c 49 54     wMask = SQLIT
16e70 45 5f 54 52 41 43 45 5f 53 54 4d 54 3b 20 2f 2a  E_TRACE_STMT; /*
16e80 20 75 73 65 20 74 68 65 20 22 6c 65 67 61 63 79   use the "legacy
16e90 22 20 64 65 66 61 75 6c 74 20 2a 2f 0a 20 20 20  " default */.   
16ea0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
16eb0 44 62 2d 3e 7a 54 72 61 63 65 56 32 20 29 7b 0a  Db->zTraceV2 ){.
16ec0 20 20 20 20 20 20 20 20 54 63 6c 5f 46 72 65 65          Tcl_Free
16ed0 28 70 44 62 2d 3e 7a 54 72 61 63 65 56 32 29 3b  (pDb->zTraceV2);
16ee0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a  .      }.      z
16ef0 54 72 61 63 65 56 32 20 3d 20 54 63 6c 5f 47 65  TraceV2 = Tcl_Ge
16f00 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
16f10 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a 20  bjv[2], &len);. 
16f20 20 20 20 20 20 69 66 28 20 7a 54 72 61 63 65 56       if( zTraceV
16f30 32 20 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20 20  2 && len>0 ){.  
16f40 20 20 20 20 20 20 70 44 62 2d 3e 7a 54 72 61 63        pDb->zTrac
16f50 65 56 32 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28  eV2 = Tcl_Alloc(
16f60 20 6c 65 6e 20 2b 20 31 20 29 3b 0a 20 20 20 20   len + 1 );.    
16f70 20 20 20 20 6d 65 6d 63 70 79 28 70 44 62 2d 3e      memcpy(pDb->
16f80 7a 54 72 61 63 65 56 32 2c 20 7a 54 72 61 63 65  zTraceV2, zTrace
16f90 56 32 2c 20 6c 65 6e 2b 31 29 3b 0a 20 20 20 20  V2, len+1);.    
16fa0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
16fb0 20 70 44 62 2d 3e 7a 54 72 61 63 65 56 32 20 3d   pDb->zTraceV2 =
16fc0 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 20   0;.      }.#if 
16fd0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
16fe0 4f 4d 49 54 5f 54 52 41 43 45 29 20 26 26 20 21  OMIT_TRACE) && !
16ff0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
17000 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49  MIT_FLOATING_POI
17010 4e 54 29 0a 20 20 20 20 20 20 69 66 28 20 70 44  NT).      if( pD
17020 62 2d 3e 7a 54 72 61 63 65 56 32 20 29 7b 0a 20  b->zTraceV2 ){. 
17030 20 20 20 20 20 20 20 70 44 62 2d 3e 69 6e 74 65         pDb->inte
17040 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20  rp = interp;.   
17050 20 20 20 20 20 73 71 6c 69 74 65 33 5f 74 72 61       sqlite3_tra
17060 63 65 5f 76 32 28 70 44 62 2d 3e 64 62 2c 20 28  ce_v2(pDb->db, (
17070 75 6e 73 69 67 6e 65 64 29 77 4d 61 73 6b 2c 20  unsigned)wMask, 
17080 44 62 54 72 61 63 65 56 32 48 61 6e 64 6c 65 72  DbTraceV2Handler
17090 2c 20 70 44 62 29 3b 0a 20 20 20 20 20 20 7d 65  , pDb);.      }e
170a0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
170b0 69 74 65 33 5f 74 72 61 63 65 5f 76 32 28 70 44  ite3_trace_v2(pD
170c0 62 2d 3e 64 62 2c 20 30 2c 20 30 2c 20 30 29 3b  b->db, 0, 0, 0);
170d0 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
170e0 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b      }.    break;
170f0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64  .  }..  /*    $d
17100 62 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 5b 2d  b transaction [-
17110 64 65 66 65 72 72 65 64 7c 2d 69 6d 6d 65 64 69  deferred|-immedi
17120 61 74 65 7c 2d 65 78 63 6c 75 73 69 76 65 5d 20  ate|-exclusive] 
17130 53 43 52 49 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a  SCRIPT.  **.  **
17140 20 53 74 61 72 74 20 61 20 6e 65 77 20 74 72 61   Start a new tra
17150 6e 73 61 63 74 69 6f 6e 20 28 69 66 20 77 65 20  nsaction (if we 
17160 61 72 65 20 6e 6f 74 20 61 6c 72 65 61 64 79 20  are not already 
17170 69 6e 20 74 68 65 20 6d 69 64 73 74 20 6f 66 20  in the midst of 
17180 61 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69  a.  ** transacti
17190 6f 6e 29 20 61 6e 64 20 65 78 65 63 75 74 65 20  on) and execute 
171a0 74 68 65 20 54 43 4c 20 73 63 72 69 70 74 20 53  the TCL script S
171b0 43 52 49 50 54 2e 20 20 41 66 74 65 72 20 53 43  CRIPT.  After SC
171c0 52 49 50 54 0a 20 20 2a 2a 20 63 6f 6d 70 6c 65  RIPT.  ** comple
171d0 74 65 73 2c 20 65 69 74 68 65 72 20 63 6f 6d 6d  tes, either comm
171e0 69 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  it the transacti
171f0 6f 6e 20 6f 72 20 72 6f 6c 6c 20 69 74 20 62 61  on or roll it ba
17200 63 6b 20 69 66 20 53 43 52 49 50 54 0a 20 20 2a  ck if SCRIPT.  *
17210 2a 20 74 68 72 6f 77 73 20 61 6e 20 65 78 63 65  * throws an exce
17220 70 74 69 6f 6e 2e 20 20 4f 72 20 69 66 20 6e 6f  ption.  Or if no
17230 20 6e 65 77 20 74 72 61 6e 73 61 74 69 6f 6e 20   new transation 
17240 77 61 73 20 73 74 61 72 74 65 64 2c 20 64 6f 20  was started, do 
17250 6e 6f 74 68 69 6e 67 2e 0a 20 20 2a 2a 20 70 61  nothing..  ** pa
17260 73 73 20 74 68 65 20 65 78 63 65 70 74 69 6f 6e  ss the exception
17270 20 6f 6e 20 75 70 20 74 68 65 20 73 74 61 63 6b   on up the stack
17280 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73  ..  **.  ** This
17290 20 63 6f 6d 6d 61 6e 64 20 77 61 73 20 69 6e 73   command was ins
172a0 70 69 72 65 64 20 62 79 20 44 61 76 65 20 54 68  pired by Dave Th
172b0 6f 6d 61 73 27 73 20 74 61 6c 6b 20 6f 6e 20 52  omas's talk on R
172c0 75 62 79 20 61 74 20 74 68 65 0a 20 20 2a 2a 20  uby at the.  ** 
172d0 32 30 30 35 20 4f 27 52 65 69 6c 6c 79 20 4f 70  2005 O'Reilly Op
172e0 65 6e 20 53 6f 75 72 63 65 20 43 6f 6e 76 65 6e  en Source Conven
172f0 74 69 6f 6e 20 28 4f 53 43 4f 4e 29 2e 0a 20 20  tion (OSCON)..  
17300 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 54 52 41  */.  case DB_TRA
17310 4e 53 41 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20  NSACTION: {.    
17320 54 63 6c 5f 4f 62 6a 20 2a 70 53 63 72 69 70 74  Tcl_Obj *pScript
17330 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
17340 20 2a 7a 42 65 67 69 6e 20 3d 20 22 53 41 56 45   *zBegin = "SAVE
17350 50 4f 49 4e 54 20 5f 74 63 6c 5f 74 72 61 6e 73  POINT _tcl_trans
17360 61 63 74 69 6f 6e 22 3b 0a 20 20 20 20 69 66 28  action";.    if(
17370 20 6f 62 6a 63 21 3d 33 20 26 26 20 6f 62 6a 63   objc!=3 && objc
17380 21 3d 34 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  !=4 ){.      Tcl
17390 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
173a0 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22  terp, 2, objv, "
173b0 5b 54 59 50 45 5d 20 53 43 52 49 50 54 22 29 3b  [TYPE] SCRIPT");
173c0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
173d0 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a  L_ERROR;.    }..
173e0 20 20 20 20 69 66 28 20 70 44 62 2d 3e 6e 54 72      if( pDb->nTr
173f0 61 6e 73 61 63 74 69 6f 6e 3d 3d 30 20 26 26 20  ansaction==0 && 
17400 6f 62 6a 63 3d 3d 34 20 29 7b 0a 20 20 20 20 20  objc==4 ){.     
17410 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68   static const ch
17420 61 72 20 2a 54 54 59 50 45 5f 73 74 72 73 5b 5d  ar *TTYPE_strs[]
17430 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 22 64 65   = {.        "de
17440 66 65 72 72 65 64 22 2c 20 20 20 22 65 78 63 6c  ferred",   "excl
17450 75 73 69 76 65 22 2c 20 20 22 69 6d 6d 65 64 69  usive",  "immedi
17460 61 74 65 22 2c 20 30 0a 20 20 20 20 20 20 7d 3b  ate", 0.      };
17470 0a 20 20 20 20 20 20 65 6e 75 6d 20 54 54 59 50  .      enum TTYP
17480 45 5f 65 6e 75 6d 20 7b 0a 20 20 20 20 20 20 20  E_enum {.       
17490 20 54 54 59 50 45 5f 44 45 46 45 52 52 45 44 2c   TTYPE_DEFERRED,
174a0 20 54 54 59 50 45 5f 45 58 43 4c 55 53 49 56 45   TTYPE_EXCLUSIVE
174b0 2c 20 54 54 59 50 45 5f 49 4d 4d 45 44 49 41 54  , TTYPE_IMMEDIAT
174c0 45 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20  E.      };.     
174d0 20 69 6e 74 20 74 74 79 70 65 3b 0a 20 20 20 20   int ttype;.    
174e0 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 64    if( Tcl_GetInd
174f0 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  exFromObj(interp
17500 2c 20 6f 62 6a 76 5b 32 5d 2c 20 54 54 59 50 45  , objv[2], TTYPE
17510 5f 73 74 72 73 2c 20 22 74 72 61 6e 73 61 63 74  _strs, "transact
17520 69 6f 6e 20 74 79 70 65 22 2c 0a 20 20 20 20 20  ion type",.     
17530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17540 20 20 20 20 20 20 20 20 20 30 2c 20 26 74 74 79           0, &tty
17550 70 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  pe) ){.        r
17560 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
17570 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
17580 77 69 74 63 68 28 20 28 65 6e 75 6d 20 54 54 59  witch( (enum TTY
17590 50 45 5f 65 6e 75 6d 29 74 74 79 70 65 20 29 7b  PE_enum)ttype ){
175a0 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 54 54  .        case TT
175b0 59 50 45 5f 44 45 46 45 52 52 45 44 3a 20 20 20  YPE_DEFERRED:   
175c0 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 3b 20 20 20   /* no-op */;   
175d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
175e0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73  eak;.        cas
175f0 65 20 54 54 59 50 45 5f 45 58 43 4c 55 53 49 56  e TTYPE_EXCLUSIV
17600 45 3a 20 20 20 7a 42 65 67 69 6e 20 3d 20 22 42  E:   zBegin = "B
17610 45 47 49 4e 20 45 58 43 4c 55 53 49 56 45 22 3b  EGIN EXCLUSIVE";
17620 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
17630 20 63 61 73 65 20 54 54 59 50 45 5f 49 4d 4d 45   case TTYPE_IMME
17640 44 49 41 54 45 3a 20 20 20 7a 42 65 67 69 6e 20  DIATE:   zBegin 
17650 3d 20 22 42 45 47 49 4e 20 49 4d 4d 45 44 49 41  = "BEGIN IMMEDIA
17660 54 45 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20  TE";  break;.   
17670 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
17680 53 63 72 69 70 74 20 3d 20 6f 62 6a 76 5b 6f 62  Script = objv[ob
17690 6a 63 2d 31 5d 3b 0a 0a 20 20 20 20 2f 2a 20 52  jc-1];..    /* R
176a0 75 6e 20 74 68 65 20 53 51 4c 69 74 65 20 42 45  un the SQLite BE
176b0 47 49 4e 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 6f  GIN command to o
176c0 70 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f  pen a transactio
176d0 6e 20 6f 72 20 73 61 76 65 70 6f 69 6e 74 2e 20  n or savepoint. 
176e0 2a 2f 0a 20 20 20 20 70 44 62 2d 3e 64 69 73 61  */.    pDb->disa
176f0 62 6c 65 41 75 74 68 2b 2b 3b 0a 20 20 20 20 72  bleAuth++;.    r
17700 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63  c = sqlite3_exec
17710 28 70 44 62 2d 3e 64 62 2c 20 7a 42 65 67 69 6e  (pDb->db, zBegin
17720 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
17730 70 44 62 2d 3e 64 69 73 61 62 6c 65 41 75 74 68  pDb->disableAuth
17740 2d 2d 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  --;.    if( rc!=
17750 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
17760 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
17770 75 6c 74 28 69 6e 74 65 72 70 2c 20 73 71 6c 69  ult(interp, sqli
17780 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e  te3_errmsg(pDb->
17790 64 62 29 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  db), (char*)0);.
177a0 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
177b0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
177c0 20 20 70 44 62 2d 3e 6e 54 72 61 6e 73 61 63 74    pDb->nTransact
177d0 69 6f 6e 2b 2b 3b 0a 0a 20 20 20 20 2f 2a 20 49  ion++;..    /* I
177e0 66 20 75 73 69 6e 67 20 4e 52 45 2c 20 73 63 68  f using NRE, sch
177f0 65 64 75 6c 65 20 61 20 63 61 6c 6c 62 61 63 6b  edule a callback
17800 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20 73   to invoke the s
17810 63 72 69 70 74 20 70 53 63 72 69 70 74 2c 20 74  cript pScript, t
17820 68 65 6e 0a 20 20 20 20 2a 2a 20 61 20 73 65 63  hen.    ** a sec
17830 6f 6e 64 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20  ond callback to 
17840 63 6f 6d 6d 69 74 20 28 6f 72 20 72 6f 6c 6c 62  commit (or rollb
17850 61 63 6b 29 20 74 68 65 20 74 72 61 6e 73 61 63  ack) the transac
17860 74 69 6f 6e 20 6f 72 20 73 61 76 65 70 6f 69 6e  tion or savepoin
17870 74 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 65 64 20  t.    ** opened 
17880 61 62 6f 76 65 2e 20 49 66 20 6e 6f 74 20 75 73  above. If not us
17890 69 6e 67 20 4e 52 45 2c 20 65 76 61 6c 75 61 74  ing NRE, evaluat
178a0 65 20 74 68 65 20 73 63 72 69 70 74 20 64 69 72  e the script dir
178b0 65 63 74 6c 79 2c 20 74 68 65 6e 0a 20 20 20 20  ectly, then.    
178c0 2a 2a 20 63 61 6c 6c 20 66 75 6e 63 74 69 6f 6e  ** call function
178d0 20 44 62 54 72 61 6e 73 50 6f 73 74 43 6d 64 28   DbTransPostCmd(
178e0 29 20 74 6f 20 63 6f 6d 6d 69 74 20 28 6f 72 20  ) to commit (or 
178f0 72 6f 6c 6c 62 61 63 6b 29 20 74 68 65 20 74 72  rollback) the tr
17900 61 6e 73 61 63 74 69 6f 6e 0a 20 20 20 20 2a 2a  ansaction.    **
17910 20 6f 72 20 73 61 76 65 70 6f 69 6e 74 2e 20 20   or savepoint.  
17920 2a 2f 0a 20 20 20 20 69 66 28 20 44 62 55 73 65  */.    if( DbUse
17930 4e 72 65 28 29 20 29 7b 0a 20 20 20 20 20 20 54  Nre() ){.      T
17940 63 6c 5f 4e 52 41 64 64 43 61 6c 6c 62 61 63 6b  cl_NRAddCallback
17950 28 69 6e 74 65 72 70 2c 20 44 62 54 72 61 6e 73  (interp, DbTrans
17960 50 6f 73 74 43 6d 64 2c 20 63 64 2c 20 30 2c 20  PostCmd, cd, 0, 
17970 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 28 76 6f  0, 0);.      (vo
17980 69 64 29 54 63 6c 5f 4e 52 45 76 61 6c 4f 62 6a  id)Tcl_NREvalObj
17990 28 69 6e 74 65 72 70 2c 20 70 53 63 72 69 70 74  (interp, pScript
179a0 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , 0);.    }else{
179b0 0a 20 20 20 20 20 20 72 63 20 3d 20 44 62 54 72  .      rc = DbTr
179c0 61 6e 73 50 6f 73 74 43 6d 64 28 26 63 64 2c 20  ansPostCmd(&cd, 
179d0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 45 76 61 6c  interp, Tcl_Eval
179e0 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c 20 70 53  ObjEx(interp, pS
179f0 63 72 69 70 74 2c 20 30 29 29 3b 0a 20 20 20 20  cript, 0));.    
17a00 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  }.    break;.  }
17a10 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 24  ..  /*.  **    $
17a20 64 62 20 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79  db unlock_notify
17a30 20 3f 73 63 72 69 70 74 3f 0a 20 20 2a 2f 0a 20   ?script?.  */. 
17a40 20 63 61 73 65 20 44 42 5f 55 4e 4c 4f 43 4b 5f   case DB_UNLOCK_
17a50 4e 4f 54 49 46 59 3a 20 7b 0a 23 69 66 6e 64 65  NOTIFY: {.#ifnde
17a60 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
17a70 55 4e 4c 4f 43 4b 5f 4e 4f 54 49 46 59 0a 20 20  UNLOCK_NOTIFY.  
17a80 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
17a90 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 6c 6f  lt(interp, "unlo
17aa0 63 6b 5f 6e 6f 74 69 66 79 20 6e 6f 74 20 61 76  ck_notify not av
17ab0 61 69 6c 61 62 6c 65 20 69 6e 20 74 68 69 73 20  ailable in this 
17ac0 62 75 69 6c 64 22 2c 0a 20 20 20 20 20 20 20 20  build",.        
17ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
17ae0 61 72 2a 29 30 29 3b 0a 20 20 20 20 72 63 20 3d  ar*)0);.    rc =
17af0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73   TCL_ERROR;.#els
17b00 65 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d  e.    if( objc!=
17b10 32 20 26 26 20 6f 62 6a 63 21 3d 33 20 29 7b 0a  2 && objc!=3 ){.
17b20 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
17b30 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
17b40 2c 20 6f 62 6a 76 2c 20 22 3f 53 43 52 49 50 54  , objv, "?SCRIPT
17b50 3f 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  ?");.      rc = 
17b60 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
17b70 65 6c 73 65 7b 0a 20 20 20 20 20 20 76 6f 69 64  else{.      void
17b80 20 28 2a 78 4e 6f 74 69 66 79 29 28 76 6f 69 64   (*xNotify)(void
17b90 20 2a 2a 2c 20 69 6e 74 29 20 3d 20 30 3b 0a 20   **, int) = 0;. 
17ba0 20 20 20 20 20 76 6f 69 64 20 2a 70 4e 6f 74 69       void *pNoti
17bb0 66 79 41 72 67 20 3d 20 30 3b 0a 0a 20 20 20 20  fyArg = 0;..    
17bc0 20 20 69 66 28 20 70 44 62 2d 3e 70 55 6e 6c 6f    if( pDb->pUnlo
17bd0 63 6b 4e 6f 74 69 66 79 20 29 7b 0a 20 20 20 20  ckNotify ){.    
17be0 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
17bf0 6f 75 6e 74 28 70 44 62 2d 3e 70 55 6e 6c 6f 63  ount(pDb->pUnloc
17c00 6b 4e 6f 74 69 66 79 29 3b 0a 20 20 20 20 20 20  kNotify);.      
17c10 20 20 70 44 62 2d 3e 70 55 6e 6c 6f 63 6b 4e 6f    pDb->pUnlockNo
17c20 74 69 66 79 20 3d 20 30 3b 0a 20 20 20 20 20 20  tify = 0;.      
17c30 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 6f 62 6a  }..      if( obj
17c40 63 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20 20 20  c==3 ){.        
17c50 78 4e 6f 74 69 66 79 20 3d 20 44 62 55 6e 6c 6f  xNotify = DbUnlo
17c60 63 6b 4e 6f 74 69 66 79 3b 0a 20 20 20 20 20 20  ckNotify;.      
17c70 20 20 70 4e 6f 74 69 66 79 41 72 67 20 3d 20 28    pNotifyArg = (
17c80 76 6f 69 64 20 2a 29 70 44 62 3b 0a 20 20 20 20  void *)pDb;.    
17c90 20 20 20 20 70 44 62 2d 3e 70 55 6e 6c 6f 63 6b      pDb->pUnlock
17ca0 4e 6f 74 69 66 79 20 3d 20 6f 62 6a 76 5b 32 5d  Notify = objv[2]
17cb0 3b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 49 6e  ;.        Tcl_In
17cc0 63 72 52 65 66 43 6f 75 6e 74 28 70 44 62 2d 3e  crRefCount(pDb->
17cd0 70 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 29 3b 0a  pUnlockNotify);.
17ce0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69        }..      i
17cf0 66 28 20 73 71 6c 69 74 65 33 5f 75 6e 6c 6f 63  f( sqlite3_unloc
17d00 6b 5f 6e 6f 74 69 66 79 28 70 44 62 2d 3e 64 62  k_notify(pDb->db
17d10 2c 20 78 4e 6f 74 69 66 79 2c 20 70 4e 6f 74 69  , xNotify, pNoti
17d20 66 79 41 72 67 29 20 29 7b 0a 20 20 20 20 20 20  fyArg) ){.      
17d30 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
17d40 6c 74 28 69 6e 74 65 72 70 2c 20 73 71 6c 69 74  lt(interp, sqlit
17d50 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64  e3_errmsg(pDb->d
17d60 62 29 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20  b), (char*)0);. 
17d70 20 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f         rc = TCL_
17d80 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20  ERROR;.      }. 
17d90 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
17da0 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
17db0 0a 20 20 2a 2a 20 20 20 20 24 64 62 20 70 72 65  .  **    $db pre
17dc0 75 70 64 61 74 65 5f 68 6f 6f 6b 20 63 6f 75 6e  update_hook coun
17dd0 74 0a 20 20 2a 2a 20 20 20 20 24 64 62 20 70 72  t.  **    $db pr
17de0 65 75 70 64 61 74 65 5f 68 6f 6f 6b 20 68 6f 6f  eupdate_hook hoo
17df0 6b 20 3f 53 43 52 49 50 54 3f 0a 20 20 2a 2a 20  k ?SCRIPT?.  ** 
17e00 20 20 20 24 64 62 20 70 72 65 75 70 64 61 74 65     $db preupdate
17e10 5f 68 6f 6f 6b 20 6e 65 77 20 49 4e 44 45 58 0a  _hook new INDEX.
17e20 20 20 2a 2a 20 20 20 20 24 64 62 20 70 72 65 75    **    $db preu
17e30 70 64 61 74 65 5f 68 6f 6f 6b 20 6f 6c 64 20 49  pdate_hook old I
17e40 4e 44 45 58 0a 20 20 2a 2f 0a 20 20 63 61 73 65  NDEX.  */.  case
17e50 20 44 42 5f 50 52 45 55 50 44 41 54 45 3a 20 7b   DB_PREUPDATE: {
17e60 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
17e70 45 4e 41 42 4c 45 5f 50 52 45 55 50 44 41 54 45  ENABLE_PREUPDATE
17e80 5f 48 4f 4f 4b 0a 20 20 20 20 54 63 6c 5f 41 70  _HOOK.    Tcl_Ap
17e90 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
17ea0 70 2c 20 22 70 72 65 75 70 64 61 74 65 5f 68 6f  p, "preupdate_ho
17eb0 6f 6b 20 77 61 73 20 6f 6d 69 74 74 65 64 20 61  ok was omitted a
17ec0 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 22 29  t compile-time")
17ed0 3b 0a 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45  ;.    rc = TCL_E
17ee0 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 20 20 20 20  RROR;.#else.    
17ef0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
17f00 72 20 2a 61 7a 53 75 62 5b 5d 20 3d 20 7b 22 63  r *azSub[] = {"c
17f10 6f 75 6e 74 22 2c 20 22 64 65 70 74 68 22 2c 20  ount", "depth", 
17f20 22 68 6f 6f 6b 22 2c 20 22 6e 65 77 22 2c 20 22  "hook", "new", "
17f30 6f 6c 64 22 2c 20 30 7d 3b 0a 20 20 20 20 65 6e  old", 0};.    en
17f40 75 6d 20 44 62 50 72 65 75 70 64 61 74 65 53 75  um DbPreupdateSu
17f50 62 43 6d 64 20 7b 0a 20 20 20 20 20 20 50 52 45  bCmd {.      PRE
17f60 5f 43 4f 55 4e 54 2c 20 50 52 45 5f 44 45 50 54  _COUNT, PRE_DEPT
17f70 48 2c 20 50 52 45 5f 48 4f 4f 4b 2c 20 50 52 45  H, PRE_HOOK, PRE
17f80 5f 4e 45 57 2c 20 50 52 45 5f 4f 4c 44 0a 20 20  _NEW, PRE_OLD.  
17f90 20 20 7d 3b 0a 20 20 20 20 69 6e 74 20 69 53 75    };.    int iSu
17fa0 62 3b 0a 0a 20 20 20 20 69 66 28 20 6f 62 6a 63  b;..    if( objc
17fb0 3c 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  <3 ){.      Tcl_
17fc0 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
17fd0 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 53  erp, 2, objv, "S
17fe0 55 42 2d 43 4f 4d 4d 41 4e 44 20 3f 41 52 47 53  UB-COMMAND ?ARGS
17ff0 3f 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ?");.    }.    i
18000 66 28 20 54 63 6c 5f 47 65 74 49 6e 64 65 78 46  f( Tcl_GetIndexF
18010 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
18020 62 6a 76 5b 32 5d 2c 20 61 7a 53 75 62 2c 20 22  bjv[2], azSub, "
18030 73 75 62 2d 63 6f 6d 6d 61 6e 64 22 2c 20 30 2c  sub-command", 0,
18040 20 26 69 53 75 62 29 20 29 7b 0a 20 20 20 20 20   &iSub) ){.     
18050 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
18060 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 77  R;.    }..    sw
18070 69 74 63 68 28 20 28 65 6e 75 6d 20 44 62 50 72  itch( (enum DbPr
18080 65 75 70 64 61 74 65 53 75 62 43 6d 64 29 69 53  eupdateSubCmd)iS
18090 75 62 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65  ub ){.      case
180a0 20 50 52 45 5f 43 4f 55 4e 54 3a 20 7b 0a 20 20   PRE_COUNT: {.  
180b0 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c 20 3d        int nCol =
180c0 20 73 71 6c 69 74 65 33 5f 70 72 65 75 70 64 61   sqlite3_preupda
180d0 74 65 5f 63 6f 75 6e 74 28 70 44 62 2d 3e 64 62  te_count(pDb->db
180e0 29 3b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 53  );.        Tcl_S
180f0 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
18100 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  rp, Tcl_NewIntOb
18110 6a 28 6e 43 6f 6c 29 29 3b 0a 20 20 20 20 20 20  j(nCol));.      
18120 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
18130 0a 0a 20 20 20 20 20 20 63 61 73 65 20 50 52 45  ..      case PRE
18140 5f 48 4f 4f 4b 3a 20 7b 0a 20 20 20 20 20 20 20  _HOOK: {.       
18150 20 69 66 28 20 6f 62 6a 63 3e 34 20 29 7b 0a 20   if( objc>4 ){. 
18160 20 20 20 20 20 20 20 20 20 54 63 6c 5f 57 72 6f           Tcl_Wro
18170 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
18180 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 68 6f 6f 6b  , 2, objv, "hook
18190 20 3f 53 43 52 49 50 54 3f 22 29 3b 0a 20 20 20   ?SCRIPT?");.   
181a0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43         return TC
181b0 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20  L_ERROR;.       
181c0 20 7d 0a 20 20 20 20 20 20 20 20 44 62 48 6f 6f   }.        DbHoo
181d0 6b 43 6d 64 28 69 6e 74 65 72 70 2c 20 70 44 62  kCmd(interp, pDb
181e0 2c 20 28 6f 62 6a 63 3d 3d 34 20 3f 20 6f 62 6a  , (objc==4 ? obj
181f0 76 5b 33 5d 20 3a 20 30 29 2c 20 26 70 44 62 2d  v[3] : 0), &pDb-
18200 3e 70 50 72 65 55 70 64 61 74 65 48 6f 6f 6b 29  >pPreUpdateHook)
18210 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
18220 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
18230 63 61 73 65 20 50 52 45 5f 44 45 50 54 48 3a 20  case PRE_DEPTH: 
18240 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 4f 62  {.        Tcl_Ob
18250 6a 20 2a 70 52 65 74 3b 0a 20 20 20 20 20 20 20  j *pRet;.       
18260 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a   if( objc!=3 ){.
18270 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 57 72            Tcl_Wr
18280 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
18290 70 2c 20 33 2c 20 6f 62 6a 76 2c 20 22 22 29 3b  p, 3, objv, "");
182a0 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
182b0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
182c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
182d0 52 65 74 20 3d 20 54 63 6c 5f 4e 65 77 49 6e 74  Ret = Tcl_NewInt
182e0 4f 62 6a 28 73 71 6c 69 74 65 33 5f 70 72 65 75  Obj(sqlite3_preu
182f0 70 64 61 74 65 5f 64 65 70 74 68 28 70 44 62 2d  pdate_depth(pDb-
18300 3e 64 62 29 29 3b 0a 20 20 20 20 20 20 20 20 54  >db));.        T
18310 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
18320 69 6e 74 65 72 70 2c 20 70 52 65 74 29 3b 0a 20  interp, pRet);. 
18330 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
18340 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 63 61 73      }..      cas
18350 65 20 50 52 45 5f 4e 45 57 3a 0a 20 20 20 20 20  e PRE_NEW:.     
18360 20 63 61 73 65 20 50 52 45 5f 4f 4c 44 3a 20 7b   case PRE_OLD: {
18370 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 49 64  .        int iId
18380 78 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  x;.        sqlit
18390 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 75 65  e3_value *pValue
183a0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6f 62  ;.        if( ob
183b0 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 20 20 20  jc!=4 ){.       
183c0 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
183d0 72 67 73 28 69 6e 74 65 72 70 2c 20 33 2c 20 6f  rgs(interp, 3, o
183e0 62 6a 76 2c 20 22 49 4e 44 45 58 22 29 3b 0a 20  bjv, "INDEX");. 
183f0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
18400 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  TCL_ERROR;.     
18410 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
18420 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
18430 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
18440 33 5d 2c 20 26 69 49 64 78 29 20 29 7b 0a 20 20  3], &iIdx) ){.  
18450 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54          return T
18460 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  CL_ERROR;.      
18470 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 66 28    }..        if(
18480 20 69 53 75 62 3d 3d 50 52 45 5f 4f 4c 44 20 29   iSub==PRE_OLD )
18490 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
184a0 20 73 71 6c 69 74 65 33 5f 70 72 65 75 70 64 61   sqlite3_preupda
184b0 74 65 5f 6f 6c 64 28 70 44 62 2d 3e 64 62 2c 20  te_old(pDb->db, 
184c0 69 49 64 78 2c 20 26 70 56 61 6c 75 65 29 3b 0a  iIdx, &pValue);.
184d0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
184e0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
184f0 20 69 53 75 62 3d 3d 50 52 45 5f 4e 45 57 20 29   iSub==PRE_NEW )
18500 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
18510 20 73 71 6c 69 74 65 33 5f 70 72 65 75 70 64 61   sqlite3_preupda
18520 74 65 5f 6e 65 77 28 70 44 62 2d 3e 64 62 2c 20  te_new(pDb->db, 
18530 69 49 64 78 2c 20 26 70 56 61 6c 75 65 29 3b 0a  iIdx, &pValue);.
18540 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
18550 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
18560 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
18570 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 4f 62 6a 3b    Tcl_Obj *pObj;
18580 0a 20 20 20 20 20 20 20 20 20 20 70 4f 62 6a 20  .          pObj 
18590 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  = Tcl_NewStringO
185a0 62 6a 28 28 63 68 61 72 2a 29 73 71 6c 69 74 65  bj((char*)sqlite
185b0 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 70 56 61  3_value_text(pVa
185c0 6c 75 65 29 2c 20 2d 31 29 3b 0a 20 20 20 20 20  lue), -1);.     
185d0 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52       Tcl_SetObjR
185e0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 4f  esult(interp, pO
185f0 62 6a 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  bj);.        }el
18600 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 54 63  se{.          Tc
18610 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
18620 6e 74 65 72 70 2c 20 73 71 6c 69 74 65 33 5f 65  nterp, sqlite3_e
18630 72 72 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c 20  rrmsg(pDb->db), 
18640 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  0);.          re
18650 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
18660 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
18670 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f  }.    }.#endif /
18680 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  * SQLITE_ENABLE_
18690 50 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b 20 2a  PREUPDATE_HOOK *
186a0 2f 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  /.    break;.  }
186b0 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 24  ..  /*.  **    $
186c0 64 62 20 77 61 6c 5f 68 6f 6f 6b 20 3f 73 63 72  db wal_hook ?scr
186d0 69 70 74 3f 0a 20 20 2a 2a 20 20 20 20 24 64 62  ipt?.  **    $db
186e0 20 75 70 64 61 74 65 5f 68 6f 6f 6b 20 3f 73 63   update_hook ?sc
186f0 72 69 70 74 3f 0a 20 20 2a 2a 20 20 20 20 24 64  ript?.  **    $d
18700 62 20 72 6f 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 20  b rollback_hook 
18710 3f 73 63 72 69 70 74 3f 0a 20 20 2a 2f 0a 20 20  ?script?.  */.  
18720 63 61 73 65 20 44 42 5f 57 41 4c 5f 48 4f 4f 4b  case DB_WAL_HOOK
18730 3a 0a 20 20 63 61 73 65 20 44 42 5f 55 50 44 41  :.  case DB_UPDA
18740 54 45 5f 48 4f 4f 4b 3a 0a 20 20 63 61 73 65 20  TE_HOOK:.  case 
18750 44 42 5f 52 4f 4c 4c 42 41 43 4b 5f 48 4f 4f 4b  DB_ROLLBACK_HOOK
18760 3a 20 7b 0a 20 20 20 20 2f 2a 20 73 65 74 20 70  : {.    /* set p
18770 70 48 6f 6f 6b 20 74 6f 20 70 6f 69 6e 74 20 61  pHook to point a
18780 74 20 70 55 70 64 61 74 65 48 6f 6f 6b 20 6f 72  t pUpdateHook or
18790 20 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 2c 20   pRollbackHook, 
187a0 64 65 70 65 6e 64 69 6e 67 20 6f 6e 0a 20 20 20  depending on.   
187b0 20 2a 2a 20 77 68 65 74 68 65 72 20 5b 24 64 62   ** whether [$db
187c0 20 75 70 64 61 74 65 5f 68 6f 6f 6b 5d 20 6f 72   update_hook] or
187d0 20 5b 24 64 62 20 72 6f 6c 6c 62 61 63 6b 5f 68   [$db rollback_h
187e0 6f 6f 6b 5d 20 77 61 73 20 69 6e 76 6f 6b 65 64  ook] was invoked
187f0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 54 63 6c  ..    */.    Tcl
18800 5f 4f 62 6a 20 2a 2a 70 70 48 6f 6f 6b 20 3d 20  _Obj **ppHook = 
18810 30 3b 0a 20 20 20 20 69 66 28 20 63 68 6f 69 63  0;.    if( choic
18820 65 3d 3d 44 42 5f 57 41 4c 5f 48 4f 4f 4b 20 29  e==DB_WAL_HOOK )
18830 20 70 70 48 6f 6f 6b 20 3d 20 26 70 44 62 2d 3e   ppHook = &pDb->
18840 70 57 61 6c 48 6f 6f 6b 3b 0a 20 20 20 20 69 66  pWalHook;.    if
18850 28 20 63 68 6f 69 63 65 3d 3d 44 42 5f 55 50 44  ( choice==DB_UPD
18860 41 54 45 5f 48 4f 4f 4b 20 29 20 70 70 48 6f 6f  ATE_HOOK ) ppHoo
18870 6b 20 3d 20 26 70 44 62 2d 3e 70 55 70 64 61 74  k = &pDb->pUpdat
18880 65 48 6f 6f 6b 3b 0a 20 20 20 20 69 66 28 20 63  eHook;.    if( c
18890 68 6f 69 63 65 3d 3d 44 42 5f 52 4f 4c 4c 42 41  hoice==DB_ROLLBA
188a0 43 4b 5f 48 4f 4f 4b 20 29 20 70 70 48 6f 6f 6b  CK_HOOK ) ppHook
188b0 20 3d 20 26 70 44 62 2d 3e 70 52 6f 6c 6c 62 61   = &pDb->pRollba
188c0 63 6b 48 6f 6f 6b 3b 0a 20 20 20 20 69 66 28 20  ckHook;.    if( 
188d0 6f 62 6a 63 3e 33 20 29 7b 0a 20 20 20 20 20 20  objc>3 ){.      
188e0 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
188f0 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a  s(interp, 2, obj
18900 76 2c 20 22 3f 53 43 52 49 50 54 3f 22 29 3b 0a  v, "?SCRIPT?");.
18910 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43         return TC
18920 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a  L_ERROR;.    }..
18930 20 20 20 20 44 62 48 6f 6f 6b 43 6d 64 28 69 6e      DbHookCmd(in
18940 74 65 72 70 2c 20 70 44 62 2c 20 28 6f 62 6a 63  terp, pDb, (objc
18950 3d 3d 33 20 3f 20 6f 62 6a 76 5b 32 5d 20 3a 20  ==3 ? objv[2] : 
18960 30 29 2c 20 70 70 48 6f 6f 6b 29 3b 0a 20 20 20  0), ppHook);.   
18970 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
18980 2a 20 20 20 20 24 64 62 20 76 65 72 73 69 6f 6e  *    $db version
18990 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72  .  **.  ** Retur
189a0 6e 20 74 68 65 20 76 65 72 73 69 6f 6e 20 73 74  n the version st
189b0 72 69 6e 67 20 66 6f 72 20 74 68 69 73 20 64 61  ring for this da
189c0 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 63  tabase..  */.  c
189d0 61 73 65 20 44 42 5f 56 45 52 53 49 4f 4e 3a 20  ase DB_VERSION: 
189e0 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73  {.    Tcl_SetRes
189f0 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61  ult(interp, (cha
18a00 72 20 2a 29 73 71 6c 69 74 65 33 5f 6c 69 62 76  r *)sqlite3_libv
18a10 65 72 73 69 6f 6e 28 29 2c 20 54 43 4c 5f 53 54  ersion(), TCL_ST
18a20 41 54 49 43 29 3b 0a 20 20 20 20 62 72 65 61 6b  ATIC);.    break
18a30 3b 0a 20 20 7d 0a 0a 0a 20 20 7d 20 2f 2a 20 45  ;.  }...  } /* E
18a40 6e 64 20 6f 66 20 74 68 65 20 53 57 49 54 43 48  nd of the SWITCH
18a50 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
18a60 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69  return rc;.}..#i
18a70 66 20 53 51 4c 49 54 45 5f 54 43 4c 5f 4e 52 45  f SQLITE_TCL_NRE
18a80 0a 2f 2a 0a 2a 2a 20 41 64 61 70 74 6f 72 20 74  ./*.** Adaptor t
18a90 68 61 74 20 70 72 6f 76 69 64 65 73 20 61 6e 20  hat provides an 
18aa0 6f 62 6a 43 6d 64 20 69 6e 74 65 72 66 61 63 65  objCmd interface
18ab0 20 74 6f 20 74 68 65 20 4e 52 45 2d 65 6e 61 62   to the NRE-enab
18ac0 6c 65 64 0a 2a 2a 20 69 6e 74 65 72 66 61 63 65  led.** interface
18ad0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e   implementation.
18ae0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53  .*/.static int S
18af0 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 44 62 4f  QLITE_TCLAPI DbO
18b00 62 6a 43 6d 64 41 64 61 70 74 6f 72 28 0a 20 20  bjCmdAdaptor(.  
18b10 76 6f 69 64 20 2a 63 64 2c 0a 20 20 54 63 6c 5f  void *cd,.  Tcl_
18b20 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
18b30 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
18b40 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 2a 6f 62 6a  l_Obj *const*obj
18b50 76 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 54 63  v.){.  return Tc
18b60 6c 5f 4e 52 43 61 6c 6c 4f 62 6a 50 72 6f 63 28  l_NRCallObjProc(
18b70 69 6e 74 65 72 70 2c 20 44 62 4f 62 6a 43 6d 64  interp, DbObjCmd
18b80 2c 20 63 64 2c 20 6f 62 6a 63 2c 20 6f 62 6a 76  , cd, objc, objv
18b90 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  );.}.#endif /* S
18ba0 51 4c 49 54 45 5f 54 43 4c 5f 4e 52 45 20 2a 2f  QLITE_TCL_NRE */
18bb0 0a 0a 2f 2a 0a 2a 2a 20 20 20 73 71 6c 69 74 65  ../*.**   sqlite
18bc0 33 20 44 42 4e 41 4d 45 20 46 49 4c 45 4e 41 4d  3 DBNAME FILENAM
18bd0 45 20 3f 2d 76 66 73 20 56 46 53 4e 41 4d 45 3f  E ?-vfs VFSNAME?
18be0 20 3f 2d 6b 65 79 20 4b 45 59 3f 20 3f 2d 72 65   ?-key KEY? ?-re
18bf0 61 64 6f 6e 6c 79 20 42 4f 4f 4c 45 41 4e 3f 0a  adonly BOOLEAN?.
18c00 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
18c10 20 20 20 20 20 20 20 20 20 20 20 20 20 3f 2d 63               ?-c
18c20 72 65 61 74 65 20 42 4f 4f 4c 45 41 4e 3f 20 3f  reate BOOLEAN? ?
18c30 2d 6e 6f 6d 75 74 65 78 20 42 4f 4f 4c 45 41 4e  -nomutex BOOLEAN
18c40 3f 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ?.**.** This is 
18c50 74 68 65 20 6d 61 69 6e 20 54 63 6c 20 63 6f 6d  the main Tcl com
18c60 6d 61 6e 64 2e 20 20 57 68 65 6e 20 74 68 65 20  mand.  When the 
18c70 22 73 71 6c 69 74 65 22 20 54 63 6c 20 63 6f 6d  "sqlite" Tcl com
18c80 6d 61 6e 64 20 69 73 0a 2a 2a 20 69 6e 76 6f 6b  mand is.** invok
18c90 65 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ed, this routine
18ca0 20 72 75 6e 73 20 74 6f 20 70 72 6f 63 65 73 73   runs to process
18cb0 20 74 68 61 74 20 63 6f 6d 6d 61 6e 64 2e 0a 2a   that command..*
18cc0 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 61  *.** The first a
18cd0 72 67 75 6d 65 6e 74 2c 20 44 42 4e 41 4d 45 2c  rgument, DBNAME,
18ce0 20 69 73 20 61 6e 20 61 72 62 69 74 72 61 72 79   is an arbitrary
18cf0 20 6e 61 6d 65 20 66 6f 72 20 61 20 6e 65 77 0a   name for a new.
18d00 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  ** database conn
18d10 65 63 74 69 6f 6e 2e 20 20 54 68 69 73 20 63 6f  ection.  This co
18d20 6d 6d 61 6e 64 20 63 72 65 61 74 65 73 20 61 20  mmand creates a 
18d30 6e 65 77 20 63 6f 6d 6d 61 6e 64 20 6e 61 6d 65  new command name
18d40 64 0a 2a 2a 20 44 42 4e 41 4d 45 20 74 68 61 74  d.** DBNAME that
18d50 20 69 73 20 75 73 65 64 20 74 6f 20 63 6f 6e 74   is used to cont
18d60 72 6f 6c 20 74 68 61 74 20 63 6f 6e 6e 65 63 74  rol that connect
18d70 69 6f 6e 2e 20 20 54 68 65 20 64 61 74 61 62 61  ion.  The databa
18d80 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e  se.** connection
18d90 20 69 73 20 64 65 6c 65 74 65 64 20 77 68 65 6e   is deleted when
18da0 20 74 68 65 20 44 42 4e 41 4d 45 20 63 6f 6d 6d   the DBNAME comm
18db0 61 6e 64 20 69 73 20 64 65 6c 65 74 65 64 2e 0a  and is deleted..
18dc0 2a 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64  **.** The second
18dd0 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65   argument is the
18de0 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   name of the dat
18df0 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  abase file..**.*
18e00 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c  /.static int SQL
18e10 49 54 45 5f 54 43 4c 41 50 49 20 44 62 4d 61 69  ITE_TCLAPI DbMai
18e20 6e 28 0a 20 20 76 6f 69 64 20 2a 63 64 2c 0a 20  n(.  void *cd,. 
18e30 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
18e40 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
18e50 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73  .  Tcl_Obj *cons
18e60 74 2a 6f 62 6a 76 0a 29 7b 0a 20 20 53 71 6c 69  t*objv.){.  Sqli
18e70 74 65 44 62 20 2a 70 3b 0a 20 20 63 6f 6e 73 74  teDb *p;.  const
18e80 20 63 68 61 72 20 2a 7a 41 72 67 3b 0a 20 20 63   char *zArg;.  c
18e90 68 61 72 20 2a 7a 45 72 72 4d 73 67 3b 0a 20 20  har *zErrMsg;.  
18ea0 69 6e 74 20 69 3b 0a 20 20 63 6f 6e 73 74 20 63  int i;.  const c
18eb0 68 61 72 20 2a 7a 46 69 6c 65 3b 0a 20 20 63 6f  har *zFile;.  co
18ec0 6e 73 74 20 63 68 61 72 20 2a 7a 56 66 73 20 3d  nst char *zVfs =
18ed0 20 30 3b 0a 20 20 69 6e 74 20 66 6c 61 67 73 3b   0;.  int flags;
18ee0 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 74  .  Tcl_DString t
18ef0 72 61 6e 73 6c 61 74 65 64 46 69 6c 65 6e 61 6d  ranslatedFilenam
18f00 65 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  e;.#if defined(S
18f10 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 29  QLITE_HAS_CODEC)
18f20 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
18f30 49 54 45 5f 4f 4d 49 54 5f 43 4f 44 45 43 5f 46  ITE_OMIT_CODEC_F
18f40 52 4f 4d 5f 54 43 4c 29 0a 20 20 76 6f 69 64 20  ROM_TCL).  void 
18f50 2a 70 4b 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74  *pKey = 0;.  int
18f60 20 6e 4b 65 79 20 3d 20 30 3b 0a 23 65 6e 64 69   nKey = 0;.#endi
18f70 66 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f  f.  int rc;..  /
18f80 2a 20 49 6e 20 6e 6f 72 6d 61 6c 20 75 73 65 2c  * In normal use,
18f90 20 65 61 63 68 20 54 43 4c 20 69 6e 74 65 72 70   each TCL interp
18fa0 72 65 74 65 72 20 72 75 6e 73 20 69 6e 20 61 20  reter runs in a 
18fb0 73 69 6e 67 6c 65 20 74 68 72 65 61 64 2e 20 20  single thread.  
18fc0 53 6f 0a 20 20 2a 2a 20 62 79 20 64 65 66 61 75  So.  ** by defau
18fd0 6c 74 2c 20 77 65 20 63 61 6e 20 74 75 72 6e 20  lt, we can turn 
18fe0 6f 66 20 6d 75 74 65 78 69 6e 67 20 6f 6e 20 53  of mutexing on S
18ff0 51 4c 69 74 65 20 64 61 74 61 62 61 73 65 20 63  QLite database c
19000 6f 6e 6e 65 63 74 69 6f 6e 73 2e 0a 20 20 2a 2a  onnections..  **
19010 20 48 6f 77 65 76 65 72 2c 20 66 6f 72 20 74 65   However, for te
19020 73 74 69 6e 67 20 70 75 72 70 6f 73 65 73 20 69  sting purposes i
19030 74 20 69 73 20 75 73 65 66 75 6c 20 74 6f 20 68  t is useful to h
19040 61 76 65 20 6d 75 74 65 78 65 73 20 74 75 72 6e  ave mutexes turn
19050 65 64 0a 20 20 2a 2a 20 6f 6e 2e 20 20 53 6f 2c  ed.  ** on.  So,
19060 20 62 79 20 64 65 66 61 75 6c 74 2c 20 6d 75 74   by default, mut
19070 65 78 65 73 20 64 65 66 61 75 6c 74 20 6f 66 66  exes default off
19080 2e 20 20 42 75 74 20 69 66 20 63 6f 6d 70 69 6c  .  But if compil
19090 65 64 20 77 69 74 68 0a 20 20 2a 2a 20 53 51 4c  ed with.  ** SQL
190a0 49 54 45 5f 54 43 4c 5f 44 45 46 41 55 4c 54 5f  ITE_TCL_DEFAULT_
190b0 46 55 4c 4c 4d 55 54 45 58 20 74 68 65 6e 20 6d  FULLMUTEX then m
190c0 75 74 65 78 65 73 20 64 65 66 61 75 6c 74 20 6f  utexes default o
190d0 6e 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53  n..  */.#ifdef S
190e0 51 4c 49 54 45 5f 54 43 4c 5f 44 45 46 41 55 4c  QLITE_TCL_DEFAUL
190f0 54 5f 46 55 4c 4c 4d 55 54 45 58 0a 20 20 66 6c  T_FULLMUTEX.  fl
19100 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45  ags = SQLITE_OPE
19110 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53 51  N_READWRITE | SQ
19120 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
19130 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46   | SQLITE_OPEN_F
19140 55 4c 4c 4d 55 54 45 58 3b 0a 23 65 6c 73 65 0a  ULLMUTEX;.#else.
19150 20 20 66 6c 61 67 73 20 3d 20 53 51 4c 49 54 45    flags = SQLITE
19160 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20  _OPEN_READWRITE 
19170 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  | SQLITE_OPEN_CR
19180 45 41 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50  EATE | SQLITE_OP
19190 45 4e 5f 4e 4f 4d 55 54 45 58 3b 0a 23 65 6e 64  EN_NOMUTEX;.#end
191a0 69 66 0a 0a 20 20 69 66 28 20 6f 62 6a 63 3d 3d  if..  if( objc==
191b0 32 20 29 7b 0a 20 20 20 20 7a 41 72 67 20 3d 20  2 ){.    zArg = 
191c0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
191d0 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 30 29  mObj(objv[1], 0)
191e0 3b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70  ;.    if( strcmp
191f0 28 7a 41 72 67 2c 22 2d 76 65 72 73 69 6f 6e 22  (zArg,"-version"
19200 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 54 63  )==0 ){.      Tc
19210 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
19220 6e 74 65 72 70 2c 73 71 6c 69 74 65 33 5f 6c 69  nterp,sqlite3_li
19230 62 76 65 72 73 69 6f 6e 28 29 2c 20 28 63 68 61  bversion(), (cha
19240 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 72 65 74  r*)0);.      ret
19250 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20  urn TCL_OK;.    
19260 7d 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70  }.    if( strcmp
19270 28 7a 41 72 67 2c 22 2d 73 6f 75 72 63 65 69 64  (zArg,"-sourceid
19280 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 54  ")==0 ){.      T
19290 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
192a0 69 6e 74 65 72 70 2c 73 71 6c 69 74 65 33 5f 73  interp,sqlite3_s
192b0 6f 75 72 63 65 69 64 28 29 2c 20 28 63 68 61 72  ourceid(), (char
192c0 2a 29 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75  *)0);.      retu
192d0 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d  rn TCL_OK;.    }
192e0 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28  .    if( strcmp(
192f0 7a 41 72 67 2c 22 2d 68 61 73 2d 63 6f 64 65 63  zArg,"-has-codec
19300 22 29 3d 3d 30 20 29 7b 0a 23 69 66 20 64 65 66  ")==0 ){.#if def
19310 69 6e 65 64 28 53 51 4c 49 54 45 5f 48 41 53 5f  ined(SQLITE_HAS_
19320 43 4f 44 45 43 29 20 26 26 20 21 64 65 66 69 6e  CODEC) && !defin
19330 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ed(SQLITE_OMIT_C
19340 4f 44 45 43 5f 46 52 4f 4d 5f 54 43 4c 29 0a 20  ODEC_FROM_TCL). 
19350 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
19360 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 31 22  esult(interp,"1"
19370 2c 28 63 68 61 72 2a 29 30 29 3b 0a 23 65 6c 73  ,(char*)0);.#els
19380 65 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65  e.      Tcl_Appe
19390 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
193a0 22 30 22 2c 28 63 68 61 72 2a 29 30 29 3b 0a 23  "0",(char*)0);.#
193b0 65 6e 64 69 66 0a 20 20 20 20 20 20 72 65 74 75  endif.      retu
193c0 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d  rn TCL_OK;.    }
193d0 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 33 3b 20  .  }.  for(i=3; 
193e0 69 2b 31 3c 6f 62 6a 63 3b 20 69 2b 3d 32 29 7b  i+1<objc; i+=2){
193f0 0a 20 20 20 20 7a 41 72 67 20 3d 20 54 63 6c 5f  .    zArg = Tcl_
19400 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 69  GetString(objv[i
19410 5d 29 3b 0a 20 20 20 20 69 66 28 20 73 74 72 63  ]);.    if( strc
19420 6d 70 28 7a 41 72 67 2c 22 2d 6b 65 79 22 29 3d  mp(zArg,"-key")=
19430 3d 30 20 29 7b 0a 23 69 66 20 64 65 66 69 6e 65  =0 ){.#if define
19440 64 28 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  d(SQLITE_HAS_COD
19450 45 43 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  EC) && !defined(
19460 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 44 45  SQLITE_OMIT_CODE
19470 43 5f 46 52 4f 4d 5f 54 43 4c 29 0a 20 20 20 20  C_FROM_TCL).    
19480 20 20 70 4b 65 79 20 3d 20 54 63 6c 5f 47 65 74    pKey = Tcl_Get
19490 42 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a  ByteArrayFromObj
194a0 28 6f 62 6a 76 5b 69 2b 31 5d 2c 20 26 6e 4b 65  (objv[i+1], &nKe
194b0 79 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d  y);.#endif.    }
194c0 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
194d0 7a 41 72 67 2c 20 22 2d 76 66 73 22 29 3d 3d 30  zArg, "-vfs")==0
194e0 20 29 7b 0a 20 20 20 20 20 20 7a 56 66 73 20 3d   ){.      zVfs =
194f0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
19500 62 6a 76 5b 69 2b 31 5d 29 3b 0a 20 20 20 20 7d  bjv[i+1]);.    }
19510 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
19520 7a 41 72 67 2c 20 22 2d 72 65 61 64 6f 6e 6c 79  zArg, "-readonly
19530 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ")==0 ){.      i
19540 6e 74 20 62 3b 0a 20 20 20 20 20 20 69 66 28 20  nt b;.      if( 
19550 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72  Tcl_GetBooleanFr
19560 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
19570 6a 76 5b 69 2b 31 5d 2c 20 26 62 29 20 29 20 72  jv[i+1], &b) ) r
19580 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
19590 0a 20 20 20 20 20 20 69 66 28 20 62 20 29 7b 0a  .      if( b ){.
195a0 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 26 3d          flags &=
195b0 20 7e 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52   ~(SQLITE_OPEN_R
195c0 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f  EADWRITE|SQLITE_
195d0 4f 50 45 4e 5f 43 52 45 41 54 45 29 3b 0a 20 20  OPEN_CREATE);.  
195e0 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 53        flags |= S
195f0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
19600 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  NLY;.      }else
19610 7b 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73 20  {.        flags 
19620 26 3d 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  &= ~SQLITE_OPEN_
19630 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20  READONLY;.      
19640 20 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54    flags |= SQLIT
19650 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
19660 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
19670 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a  lse if( strcmp(z
19680 41 72 67 2c 20 22 2d 63 72 65 61 74 65 22 29 3d  Arg, "-create")=
19690 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =0 ){.      int 
196a0 62 3b 0a 20 20 20 20 20 20 69 66 28 20 54 63 6c  b;.      if( Tcl
196b0 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f  _GetBooleanFromO
196c0 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
196d0 69 2b 31 5d 2c 20 26 62 29 20 29 20 72 65 74 75  i+1], &b) ) retu
196e0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
196f0 20 20 20 20 69 66 28 20 62 20 26 26 20 28 66 6c      if( b && (fl
19700 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
19710 4e 5f 52 45 41 44 4f 4e 4c 59 29 3d 3d 30 20 29  N_READONLY)==0 )
19720 7b 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73 20  {.        flags 
19730 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43  |= SQLITE_OPEN_C
19740 52 45 41 54 45 3b 0a 20 20 20 20 20 20 7d 65 6c  REATE;.      }el
19750 73 65 7b 0a 20 20 20 20 20 20 20 20 66 6c 61 67  se{.        flag
19760 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 4f 50 45  s &= ~SQLITE_OPE
19770 4e 5f 43 52 45 41 54 45 3b 0a 20 20 20 20 20 20  N_CREATE;.      
19780 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  }.    }else if( 
19790 73 74 72 63 6d 70 28 7a 41 72 67 2c 20 22 2d 6e  strcmp(zArg, "-n
197a0 6f 6d 75 74 65 78 22 29 3d 3d 30 20 29 7b 0a 20  omutex")==0 ){. 
197b0 20 20 20 20 20 69 6e 74 20 62 3b 0a 20 20 20 20       int b;.    
197c0 20 20 69 66 28 20 54 63 6c 5f 47 65 74 42 6f 6f    if( Tcl_GetBoo
197d0 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  leanFromObj(inte
197e0 72 70 2c 20 6f 62 6a 76 5b 69 2b 31 5d 2c 20 26  rp, objv[i+1], &
197f0 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
19800 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 69 66 28  ERROR;.      if(
19810 20 62 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6c   b ){.        fl
19820 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50  ags |= SQLITE_OP
19830 45 4e 5f 4e 4f 4d 55 54 45 58 3b 0a 20 20 20 20  EN_NOMUTEX;.    
19840 20 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 53 51      flags &= ~SQ
19850 4c 49 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55  LITE_OPEN_FULLMU
19860 54 45 58 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  TEX;.      }else
19870 7b 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73 20  {.        flags 
19880 26 3d 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  &= ~SQLITE_OPEN_
19890 4e 4f 4d 55 54 45 58 3b 0a 20 20 20 20 20 20 7d  NOMUTEX;.      }
198a0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73  .    }else if( s
198b0 74 72 63 6d 70 28 7a 41 72 67 2c 20 22 2d 66 75  trcmp(zArg, "-fu
198c0 6c 6c 6d 75 74 65 78 22 29 3d 3d 30 20 29 7b 0a  llmutex")==0 ){.
198d0 20 20 20 20 20 20 69 6e 74 20 62 3b 0a 20 20 20        int b;.   
198e0 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 42 6f     if( Tcl_GetBo
198f0 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74  oleanFromObj(int
19900 65 72 70 2c 20 6f 62 6a 76 5b 69 2b 31 5d 2c 20  erp, objv[i+1], 
19910 26 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  &b) ) return TCL
19920 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 69 66  _ERROR;.      if
19930 28 20 62 20 29 7b 0a 20 20 20 20 20 20 20 20 66  ( b ){.        f
19940 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f  lags |= SQLITE_O
19950 50 45 4e 5f 46 55 4c 4c 4d 55 54 45 58 3b 0a 20  PEN_FULLMUTEX;. 
19960 20 20 20 20 20 20 20 66 6c 61 67 73 20 26 3d 20         flags &= 
19970 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d  ~SQLITE_OPEN_NOM
19980 55 54 45 58 3b 0a 20 20 20 20 20 20 7d 65 6c 73  UTEX;.      }els
19990 65 7b 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73  e{.        flags
199a0 20 26 3d 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e   &= ~SQLITE_OPEN
199b0 5f 46 55 4c 4c 4d 55 54 45 58 3b 0a 20 20 20 20  _FULLMUTEX;.    
199c0 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66    }.    }else if
199d0 28 20 73 74 72 63 6d 70 28 7a 41 72 67 2c 20 22  ( strcmp(zArg, "
199e0 2d 75 72 69 22 29 3d 3d 30 20 29 7b 0a 20 20 20  -uri")==0 ){.   
199f0 20 20 20 69 6e 74 20 62 3b 0a 20 20 20 20 20 20     int b;.      
19a00 69 66 28 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65  if( Tcl_GetBoole
19a10 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  anFromObj(interp
19a20 2c 20 6f 62 6a 76 5b 69 2b 31 5d 2c 20 26 62 29  , objv[i+1], &b)
19a30 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
19a40 52 4f 52 3b 0a 20 20 20 20 20 20 69 66 28 20 62  ROR;.      if( b
19a50 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6c 61 67   ){.        flag
19a60 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e  s |= SQLITE_OPEN
19a70 5f 55 52 49 3b 0a 20 20 20 20 20 20 7d 65 6c 73  _URI;.      }els
19a80 65 7b 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73  e{.        flags
19a90 20 26 3d 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e   &= ~SQLITE_OPEN
19aa0 5f 55 52 49 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _URI;.      }.  
19ab0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 54    }else{.      T
19ac0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
19ad0 69 6e 74 65 72 70 2c 20 22 75 6e 6b 6e 6f 77 6e  interp, "unknown
19ae0 20 6f 70 74 69 6f 6e 3a 20 22 2c 20 7a 41 72 67   option: ", zArg
19af0 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20  , (char*)0);.   
19b00 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
19b10 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ROR;.    }.  }. 
19b20 20 69 66 28 20 6f 62 6a 63 3c 33 20 7c 7c 20 28   if( objc<3 || (
19b30 6f 62 6a 63 26 31 29 21 3d 31 20 29 7b 0a 20 20  objc&1)!=1 ){.  
19b40 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
19b50 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
19b60 6a 76 2c 0a 20 20 20 20 20 20 22 48 41 4e 44 4c  jv,.      "HANDL
19b70 45 20 46 49 4c 45 4e 41 4d 45 20 3f 2d 76 66 73  E FILENAME ?-vfs
19b80 20 56 46 53 4e 41 4d 45 3f 20 3f 2d 72 65 61 64   VFSNAME? ?-read
19b90 6f 6e 6c 79 20 42 4f 4f 4c 45 41 4e 3f 20 3f 2d  only BOOLEAN? ?-
19ba0 63 72 65 61 74 65 20 42 4f 4f 4c 45 41 4e 3f 22  create BOOLEAN?"
19bb0 0a 20 20 20 20 20 20 22 20 3f 2d 6e 6f 6d 75 74  .      " ?-nomut
19bc0 65 78 20 42 4f 4f 4c 45 41 4e 3f 20 3f 2d 66 75  ex BOOLEAN? ?-fu
19bd0 6c 6c 6d 75 74 65 78 20 42 4f 4f 4c 45 41 4e 3f  llmutex BOOLEAN?
19be0 20 3f 2d 75 72 69 20 42 4f 4f 4c 45 41 4e 3f 22   ?-uri BOOLEAN?"
19bf0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
19c00 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 29 20 26  ITE_HAS_CODEC) &
19c10 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
19c20 45 5f 4f 4d 49 54 5f 43 4f 44 45 43 5f 46 52 4f  E_OMIT_CODEC_FRO
19c30 4d 5f 54 43 4c 29 0a 20 20 20 20 20 20 22 20 3f  M_TCL).      " ?
19c40 2d 6b 65 79 20 43 4f 44 45 43 4b 45 59 3f 22 0a  -key CODECKEY?".
19c50 23 65 6e 64 69 66 0a 20 20 20 20 29 3b 0a 20 20  #endif.    );.  
19c60 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
19c70 4f 52 3b 0a 20 20 7d 0a 20 20 7a 45 72 72 4d 73  OR;.  }.  zErrMs
19c80 67 20 3d 20 30 3b 0a 20 20 70 20 3d 20 28 53 71  g = 0;.  p = (Sq
19c90 6c 69 74 65 44 62 2a 29 54 63 6c 5f 41 6c 6c 6f  liteDb*)Tcl_Allo
19ca0 63 28 20 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b  c( sizeof(*p) );
19cb0 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20  .  if( p==0 ){. 
19cc0 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74     Tcl_SetResult
19cd0 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a  (interp, (char *
19ce0 29 22 6d 61 6c 6c 6f 63 20 66 61 69 6c 65 64 22  )"malloc failed"
19cf0 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20  , TCL_STATIC);. 
19d00 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
19d10 52 4f 52 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65  ROR;.  }.  memse
19d20 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  t(p, 0, sizeof(*
19d30 70 29 29 3b 0a 20 20 7a 46 69 6c 65 20 3d 20 54  p));.  zFile = T
19d40 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
19d50 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30 29 3b  Obj(objv[2], 0);
19d60 0a 20 20 7a 46 69 6c 65 20 3d 20 54 63 6c 5f 54  .  zFile = Tcl_T
19d70 72 61 6e 73 6c 61 74 65 46 69 6c 65 4e 61 6d 65  ranslateFileName
19d80 28 69 6e 74 65 72 70 2c 20 7a 46 69 6c 65 2c 20  (interp, zFile, 
19d90 26 74 72 61 6e 73 6c 61 74 65 64 46 69 6c 65 6e  &translatedFilen
19da0 61 6d 65 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  ame);.  rc = sql
19db0 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 7a 46 69  ite3_open_v2(zFi
19dc0 6c 65 2c 20 26 70 2d 3e 64 62 2c 20 66 6c 61 67  le, &p->db, flag
19dd0 73 2c 20 7a 56 66 73 29 3b 0a 20 20 54 63 6c 5f  s, zVfs);.  Tcl_
19de0 44 53 74 72 69 6e 67 46 72 65 65 28 26 74 72 61  DStringFree(&tra
19df0 6e 73 6c 61 74 65 64 46 69 6c 65 6e 61 6d 65 29  nslatedFilename)
19e00 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 20 29 7b  ;.  if( p->db ){
19e10 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f  .    if( SQLITE_
19e20 4f 4b 21 3d 73 71 6c 69 74 65 33 5f 65 72 72 63  OK!=sqlite3_errc
19e30 6f 64 65 28 70 2d 3e 64 62 29 20 29 7b 0a 20 20  ode(p->db) ){.  
19e40 20 20 20 20 7a 45 72 72 4d 73 67 20 3d 20 73 71      zErrMsg = sq
19e50 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25  lite3_mprintf("%
19e60 73 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  s", sqlite3_errm
19e70 73 67 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20  sg(p->db));.    
19e80 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28    sqlite3_close(
19e90 70 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20 70 2d  p->db);.      p-
19ea0 3e 64 62 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  >db = 0;.    }. 
19eb0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 45 72 72   }else{.    zErr
19ec0 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Msg = sqlite3_mp
19ed0 72 69 6e 74 66 28 22 25 73 22 2c 20 73 71 6c 69  rintf("%s", sqli
19ee0 74 65 33 5f 65 72 72 73 74 72 28 72 63 29 29 3b  te3_errstr(rc));
19ef0 0a 20 20 7d 0a 23 69 66 20 64 65 66 69 6e 65 64  .  }.#if defined
19f00 28 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45  (SQLITE_HAS_CODE
19f10 43 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  C) && !defined(S
19f20 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 44 45 43  QLITE_OMIT_CODEC
19f30 5f 46 52 4f 4d 5f 54 43 4c 29 0a 20 20 69 66 28  _FROM_TCL).  if(
19f40 20 70 2d 3e 64 62 20 29 7b 0a 20 20 20 20 73 71   p->db ){.    sq
19f50 6c 69 74 65 33 5f 6b 65 79 28 70 2d 3e 64 62 2c  lite3_key(p->db,
19f60 20 70 4b 65 79 2c 20 6e 4b 65 79 29 3b 0a 20 20   pKey, nKey);.  
19f70 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70  }.#endif.  if( p
19f80 2d 3e 64 62 3d 3d 30 20 29 7b 0a 20 20 20 20 54  ->db==0 ){.    T
19f90 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
19fa0 65 72 70 2c 20 7a 45 72 72 4d 73 67 2c 20 54 43  erp, zErrMsg, TC
19fb0 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 20  L_VOLATILE);.   
19fc0 20 54 63 6c 5f 46 72 65 65 28 28 63 68 61 72 2a   Tcl_Free((char*
19fd0 29 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  )p);.    sqlite3
19fe0 5f 66 72 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a  _free(zErrMsg);.
19ff0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
1a000 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d  RROR;.  }.  p->m
1a010 61 78 53 74 6d 74 20 3d 20 4e 55 4d 5f 50 52 45  axStmt = NUM_PRE
1a020 50 41 52 45 44 5f 53 54 4d 54 53 3b 0a 20 20 70  PARED_STMTS;.  p
1a030 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20 66 6c  ->openFlags = fl
1a040 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
1a050 4e 5f 55 52 49 3b 0a 20 20 70 2d 3e 69 6e 74 65  N_URI;.  p->inte
1a060 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 7a  rp = interp;.  z
1a070 41 72 67 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  Arg = Tcl_GetStr
1a080 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
1a090 31 5d 2c 20 30 29 3b 0a 20 20 69 66 28 20 44 62  1], 0);.  if( Db
1a0a0 55 73 65 4e 72 65 28 29 20 29 7b 0a 20 20 20 20  UseNre() ){.    
1a0b0 54 63 6c 5f 4e 52 43 72 65 61 74 65 43 6f 6d 6d  Tcl_NRCreateComm
1a0c0 61 6e 64 28 69 6e 74 65 72 70 2c 20 7a 41 72 67  and(interp, zArg
1a0d0 2c 20 44 62 4f 62 6a 43 6d 64 41 64 61 70 74 6f  , DbObjCmdAdapto
1a0e0 72 2c 20 44 62 4f 62 6a 43 6d 64 2c 0a 20 20 20  r, DbObjCmd,.   
1a0f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a100 20 20 20 20 20 28 63 68 61 72 2a 29 70 2c 20 44       (char*)p, D
1a110 62 44 65 6c 65 74 65 43 6d 64 29 3b 0a 20 20 7d  bDeleteCmd);.  }
1a120 65 6c 73 65 7b 0a 20 20 20 20 54 63 6c 5f 43 72  else{.    Tcl_Cr
1a130 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69  eateObjCommand(i
1a140 6e 74 65 72 70 2c 20 7a 41 72 67 2c 20 44 62 4f  nterp, zArg, DbO
1a150 62 6a 43 6d 64 2c 20 28 63 68 61 72 2a 29 70 2c  bjCmd, (char*)p,
1a160 20 44 62 44 65 6c 65 74 65 43 6d 64 29 3b 0a 20   DbDeleteCmd);. 
1a170 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f   }.  return TCL_
1a180 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f  OK;.}../*.** Pro
1a190 76 69 64 65 20 61 20 64 75 6d 6d 79 20 54 63 6c  vide a dummy Tcl
1a1a0 5f 49 6e 69 74 53 74 75 62 73 20 69 66 20 77 65  _InitStubs if we
1a1b0 20 61 72 65 20 75 73 69 6e 67 20 74 68 69 73 20   are using this 
1a1c0 61 73 20 61 20 73 74 61 74 69 63 0a 2a 2a 20 6c  as a static.** l
1a1d0 69 62 72 61 72 79 2e 0a 2a 2f 0a 23 69 66 6e 64  ibrary..*/.#ifnd
1a1e0 65 66 20 55 53 45 5f 54 43 4c 5f 53 54 55 42 53  ef USE_TCL_STUBS
1a1f0 0a 23 20 75 6e 64 65 66 20 20 54 63 6c 5f 49 6e  .# undef  Tcl_In
1a200 69 74 53 74 75 62 73 0a 23 20 64 65 66 69 6e 65  itStubs.# define
1a210 20 54 63 6c 5f 49 6e 69 74 53 74 75 62 73 28 61   Tcl_InitStubs(a
1a220 2c 62 2c 63 29 20 54 43 4c 5f 56 45 52 53 49 4f  ,b,c) TCL_VERSIO
1a230 4e 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  N.#endif../*.** 
1a240 4d 61 6b 65 20 73 75 72 65 20 77 65 20 68 61 76  Make sure we hav
1a250 65 20 61 20 50 41 43 4b 41 47 45 5f 56 45 52 53  e a PACKAGE_VERS
1a260 49 4f 4e 20 6d 61 63 72 6f 20 64 65 66 69 6e 65  ION macro define
1a270 64 2e 20 20 54 68 69 73 20 77 69 6c 6c 20 62 65  d.  This will be
1a280 0a 2a 2a 20 64 65 66 69 6e 65 64 20 61 75 74 6f  .** defined auto
1a290 6d 61 74 69 63 61 6c 6c 79 20 62 79 20 74 68 65  matically by the
1a2a0 20 54 45 41 20 6d 61 6b 65 66 69 6c 65 2e 20 20   TEA makefile.  
1a2b0 42 75 74 20 6f 74 68 65 72 20 6d 61 6b 65 66 69  But other makefi
1a2c0 6c 65 73 0a 2a 2a 20 64 6f 20 6e 6f 74 20 64 65  les.** do not de
1a2d0 66 69 6e 65 20 69 74 2e 0a 2a 2f 0a 23 69 66 6e  fine it..*/.#ifn
1a2e0 64 65 66 20 50 41 43 4b 41 47 45 5f 56 45 52 53  def PACKAGE_VERS
1a2f0 49 4f 4e 0a 23 20 64 65 66 69 6e 65 20 50 41 43  ION.# define PAC
1a300 4b 41 47 45 5f 56 45 52 53 49 4f 4e 20 53 51 4c  KAGE_VERSION SQL
1a310 49 54 45 5f 56 45 52 53 49 4f 4e 0a 23 65 6e 64  ITE_VERSION.#end
1a320 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61  if../*.** Initia
1a330 6c 69 7a 65 20 74 68 69 73 20 6d 6f 64 75 6c 65  lize this module
1a340 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 54 63 6c  ..**.** This Tcl
1a350 20 6d 6f 64 75 6c 65 20 63 6f 6e 74 61 69 6e 73   module contains
1a360 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 6e   only a single n
1a370 65 77 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 20 6e  ew Tcl command n
1a380 61 6d 65 64 20 22 73 71 6c 69 74 65 22 2e 0a 2a  amed "sqlite"..*
1a390 2a 20 28 48 65 6e 63 65 20 74 68 65 72 65 20 69  * (Hence there i
1a3a0 73 20 6e 6f 20 6e 61 6d 65 73 70 61 63 65 2e 20  s no namespace. 
1a3b0 20 54 68 65 72 65 20 69 73 20 6e 6f 20 70 6f 69   There is no poi
1a3c0 6e 74 20 69 6e 20 75 73 69 6e 67 20 61 20 6e 61  nt in using a na
1a3d0 6d 65 73 70 61 63 65 0a 2a 2a 20 69 66 20 74 68  mespace.** if th
1a3e0 65 20 65 78 74 65 6e 73 69 6f 6e 20 6f 6e 6c 79  e extension only
1a3f0 20 73 75 70 70 6c 69 65 73 20 6f 6e 65 20 6e 65   supplies one ne
1a400 77 20 6e 61 6d 65 21 29 20 20 54 68 65 20 22 73  w name!)  The "s
1a410 71 6c 69 74 65 22 20 63 6f 6d 6d 61 6e 64 20 69  qlite" command i
1a420 73 0a 2a 2a 20 75 73 65 64 20 74 6f 20 6f 70 65  s.** used to ope
1a430 6e 20 61 20 6e 65 77 20 53 51 4c 69 74 65 20 64  n a new SQLite d
1a440 61 74 61 62 61 73 65 2e 20 20 53 65 65 20 74 68  atabase.  See th
1a450 65 20 44 62 4d 61 69 6e 28 29 20 72 6f 75 74 69  e DbMain() routi
1a460 6e 65 20 61 62 6f 76 65 0a 2a 2a 20 66 6f 72 20  ne above.** for 
1a470 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
1a480 6d 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  mation..**.** Th
1a490 65 20 45 58 54 45 52 4e 20 6d 61 63 72 6f 73 20  e EXTERN macros 
1a4a0 61 72 65 20 72 65 71 75 69 72 65 64 20 62 79 20  are required by 
1a4b0 54 43 4c 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  TCL in order to 
1a4c0 77 6f 72 6b 20 6f 6e 20 77 69 6e 64 6f 77 73 2e  work on windows.
1a4d0 0a 2a 2f 0a 45 58 54 45 52 4e 20 69 6e 74 20 53  .*/.EXTERN int S
1a4e0 71 6c 69 74 65 33 5f 49 6e 69 74 28 54 63 6c 5f  qlite3_Init(Tcl_
1a4f0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b  Interp *interp){
1a500 0a 20 20 69 6e 74 20 72 63 20 3d 20 54 63 6c 5f  .  int rc = Tcl_
1a510 49 6e 69 74 53 74 75 62 73 28 69 6e 74 65 72 70  InitStubs(interp
1a520 2c 20 22 38 2e 34 22 2c 20 30 29 20 3f 20 54 43  , "8.4", 0) ? TC
1a530 4c 5f 4f 4b 20 3a 20 54 43 4c 5f 45 52 52 4f 52  L_OK : TCL_ERROR
1a540 3b 0a 20 20 69 66 28 20 72 63 3d 3d 54 43 4c 5f  ;.  if( rc==TCL_
1a550 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 43 72  OK ){.    Tcl_Cr
1a560 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69  eateObjCommand(i
1a570 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 33 22  nterp, "sqlite3"
1a580 2c 20 28 54 63 6c 5f 4f 62 6a 43 6d 64 50 72 6f  , (Tcl_ObjCmdPro
1a590 63 2a 29 44 62 4d 61 69 6e 2c 20 30 2c 20 30 29  c*)DbMain, 0, 0)
1a5a0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
1a5b0 5f 33 5f 53 55 46 46 49 58 5f 4f 4e 4c 59 0a 20  _3_SUFFIX_ONLY. 
1a5c0 20 20 20 2f 2a 20 54 68 65 20 22 73 71 6c 69 74     /* The "sqlit
1a5d0 65 22 20 61 6c 69 61 73 20 69 73 20 75 6e 64 6f  e" alias is undo
1a5e0 63 75 6d 65 6e 74 65 64 2e 20 20 49 74 20 69 73  cumented.  It is
1a5f0 20 68 65 72 65 20 6f 6e 6c 79 20 74 6f 20 73 75   here only to su
1a600 70 70 6f 72 74 0a 20 20 20 20 2a 2a 20 6c 65 67  pport.    ** leg
1a610 61 63 79 20 73 63 72 69 70 74 73 2e 20 20 41 6c  acy scripts.  Al
1a620 6c 20 6e 65 77 20 73 63 72 69 70 74 73 20 73 68  l new scripts sh
1a630 6f 75 6c 64 20 75 73 65 20 6f 6e 6c 79 20 74 68  ould use only th
1a640 65 20 22 73 71 6c 69 74 65 33 22 0a 20 20 20 20  e "sqlite3".    
1a650 2a 2a 20 63 6f 6d 6d 61 6e 64 2e 20 2a 2f 0a 20  ** command. */. 
1a660 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a     Tcl_CreateObj
1a670 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20  Command(interp, 
1a680 22 73 71 6c 69 74 65 22 2c 20 28 54 63 6c 5f 4f  "sqlite", (Tcl_O
1a690 62 6a 43 6d 64 50 72 6f 63 2a 29 44 62 4d 61 69  bjCmdProc*)DbMai
1a6a0 6e 2c 20 30 2c 20 30 29 3b 0a 23 65 6e 64 69 66  n, 0, 0);.#endif
1a6b0 0a 20 20 20 20 72 63 20 3d 20 54 63 6c 5f 50 6b  .    rc = Tcl_Pk
1a6c0 67 50 72 6f 76 69 64 65 28 69 6e 74 65 72 70 2c  gProvide(interp,
1a6d0 20 22 73 71 6c 69 74 65 33 22 2c 20 50 41 43 4b   "sqlite3", PACK
1a6e0 41 47 45 5f 56 45 52 53 49 4f 4e 29 3b 0a 20 20  AGE_VERSION);.  
1a6f0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
1a700 0a 45 58 54 45 52 4e 20 69 6e 74 20 54 63 6c 73  .EXTERN int Tcls
1a710 71 6c 69 74 65 33 5f 49 6e 69 74 28 54 63 6c 5f  qlite3_Init(Tcl_
1a720 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b  Interp *interp){
1a730 20 72 65 74 75 72 6e 20 53 71 6c 69 74 65 33 5f   return Sqlite3_
1a740 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 20 7d 0a  Init(interp); }.
1a750 45 58 54 45 52 4e 20 69 6e 74 20 53 71 6c 69 74  EXTERN int Sqlit
1a760 65 33 5f 55 6e 6c 6f 61 64 28 54 63 6c 5f 49 6e  e3_Unload(Tcl_In
1a770 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e  terp *interp, in
1a780 74 20 66 6c 61 67 73 29 7b 20 72 65 74 75 72 6e  t flags){ return
1a790 20 54 43 4c 5f 4f 4b 3b 20 7d 0a 45 58 54 45 52   TCL_OK; }.EXTER
1a7a0 4e 20 69 6e 74 20 54 63 6c 73 71 6c 69 74 65 33  N int Tclsqlite3
1a7b0 5f 55 6e 6c 6f 61 64 28 54 63 6c 5f 49 6e 74 65  _Unload(Tcl_Inte
1a7c0 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20  rp *interp, int 
1a7d0 66 6c 61 67 73 29 7b 20 72 65 74 75 72 6e 20 54  flags){ return T
1a7e0 43 4c 5f 4f 4b 3b 20 7d 0a 0a 2f 2a 20 42 65 63  CL_OK; }../* Bec
1a7f0 61 75 73 65 20 69 74 20 61 63 63 65 73 73 65 73  ause it accesses
1a800 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
1a810 20 61 6e 64 20 75 73 65 73 20 70 65 72 73 69 73   and uses persis
1a820 74 65 6e 74 20 73 74 61 74 65 2c 20 53 51 4c 69  tent state, SQLi
1a830 74 65 0a 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6e  te.** is not con
1a840 73 69 64 65 72 65 64 20 61 70 70 72 6f 70 72 69  sidered appropri
1a850 61 74 65 20 66 6f 72 20 73 61 66 65 20 69 6e 74  ate for safe int
1a860 65 72 70 72 65 74 65 72 73 2e 20 20 48 65 6e 63  erpreters.  Henc
1a870 65 2c 20 77 65 20 63 61 75 73 65 0a 2a 2a 20 74  e, we cause.** t
1a880 68 65 20 5f 53 61 66 65 49 6e 69 74 28 29 20 69  he _SafeInit() i
1a890 6e 74 65 72 66 61 63 65 73 20 72 65 74 75 72 6e  nterfaces return
1a8a0 20 54 43 4c 5f 45 52 52 4f 52 2e 0a 2a 2f 0a 45   TCL_ERROR..*/.E
1a8b0 58 54 45 52 4e 20 69 6e 74 20 53 71 6c 69 74 65  XTERN int Sqlite
1a8c0 33 5f 53 61 66 65 49 6e 69 74 28 54 63 6c 5f 49  3_SafeInit(Tcl_I
1a8d0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 20  nterp *interp){ 
1a8e0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1a8f0 3b 20 7d 0a 45 58 54 45 52 4e 20 69 6e 74 20 53  ; }.EXTERN int S
1a900 71 6c 69 74 65 33 5f 53 61 66 65 55 6e 6c 6f 61  qlite3_SafeUnloa
1a910 64 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  d(Tcl_Interp *in
1a920 74 65 72 70 2c 20 69 6e 74 20 66 6c 61 67 73 29  terp, int flags)
1a930 7b 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  {return TCL_ERRO
1a940 52 3b 7d 0a 0a 0a 0a 23 69 66 6e 64 65 66 20 53  R;}....#ifndef S
1a950 51 4c 49 54 45 5f 33 5f 53 55 46 46 49 58 5f 4f  QLITE_3_SUFFIX_O
1a960 4e 4c 59 0a 69 6e 74 20 53 71 6c 69 74 65 5f 49  NLY.int Sqlite_I
1a970 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a  nit(Tcl_Interp *
1a980 69 6e 74 65 72 70 29 7b 20 72 65 74 75 72 6e 20  interp){ return 
1a990 53 71 6c 69 74 65 33 5f 49 6e 69 74 28 69 6e 74  Sqlite3_Init(int
1a9a0 65 72 70 29 3b 20 7d 0a 69 6e 74 20 54 63 6c 73  erp); }.int Tcls
1a9b0 71 6c 69 74 65 5f 49 6e 69 74 28 54 63 6c 5f 49  qlite_Init(Tcl_I
1a9c0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 20  nterp *interp){ 
1a9d0 72 65 74 75 72 6e 20 53 71 6c 69 74 65 33 5f 49  return Sqlite3_I
1a9e0 6e 69 74 28 69 6e 74 65 72 70 29 3b 20 7d 0a 69  nit(interp); }.i
1a9f0 6e 74 20 53 71 6c 69 74 65 5f 55 6e 6c 6f 61 64  nt Sqlite_Unload
1aa00 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74  (Tcl_Interp *int
1aa10 65 72 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b  erp, int flags){
1aa20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20   return TCL_OK; 
1aa30 7d 0a 69 6e 74 20 54 63 6c 73 71 6c 69 74 65 5f  }.int Tclsqlite_
1aa40 55 6e 6c 6f 61 64 28 54 63 6c 5f 49 6e 74 65 72  Unload(Tcl_Inter
1aa50 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 66  p *interp, int f
1aa60 6c 61 67 73 29 7b 20 72 65 74 75 72 6e 20 54 43  lags){ return TC
1aa70 4c 5f 4f 4b 3b 20 7d 0a 23 65 6e 64 69 66 0a 0a  L_OK; }.#endif..
1aa80 23 69 66 64 65 66 20 54 43 4c 53 48 0a 2f 2a 2a  #ifdef TCLSH./**
1aa90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1aaa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1aab0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1aac0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1aad0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 41  ***********.** A
1aae0 6c 6c 20 6f 66 20 74 68 65 20 63 6f 64 65 20 74  ll of the code t
1aaf0 68 61 74 20 66 6f 6c 6c 6f 77 73 20 69 73 20 75  hat follows is u
1ab00 73 65 64 20 74 6f 20 62 75 69 6c 64 20 73 74 61  sed to build sta
1ab10 6e 64 61 6c 6f 6e 65 20 54 43 4c 20 69 6e 74 65  ndalone TCL inte
1ab20 72 70 72 65 74 65 72 73 0a 2a 2a 20 74 68 61 74  rpreters.** that
1ab30 20 61 72 65 20 73 74 61 74 69 63 61 6c 6c 79 20   are statically 
1ab40 6c 69 6e 6b 65 64 20 77 69 74 68 20 53 51 4c 69  linked with SQLi
1ab50 74 65 2e 20 20 45 6e 61 62 6c 65 20 74 68 65 73  te.  Enable thes
1ab60 65 20 62 79 20 63 6f 6d 70 69 6c 69 6e 67 0a 2a  e by compiling.*
1ab70 2a 20 77 69 74 68 20 2d 44 54 43 4c 53 48 3d 6e  * with -DTCLSH=n
1ab80 20 77 68 65 72 65 20 6e 20 63 61 6e 20 62 65 20   where n can be 
1ab90 31 20 6f 72 20 32 2e 20 20 41 6e 20 6e 20 6f 66  1 or 2.  An n of
1aba0 20 31 20 67 65 6e 65 72 61 74 65 73 20 61 20 73   1 generates a s
1abb0 74 61 6e 64 61 72 64 0a 2a 2a 20 74 63 6c 73 68  tandard.** tclsh
1abc0 20 62 75 74 20 77 69 74 68 20 53 51 4c 69 74 65   but with SQLite
1abd0 20 62 75 69 6c 74 20 69 6e 2e 20 20 41 6e 20 6e   built in.  An n
1abe0 20 6f 66 20 32 20 67 65 6e 65 72 61 74 65 73 20   of 2 generates 
1abf0 74 68 65 20 53 51 4c 69 74 65 20 73 70 61 63 65  the SQLite space
1ac00 0a 2a 2a 20 61 6e 61 6c 79 73 69 73 20 70 72 6f  .** analysis pro
1ac10 67 72 61 6d 2e 0a 2a 2f 0a 0a 23 69 66 20 64 65  gram..*/..#if de
1ac20 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53  fined(SQLITE_TES
1ac30 54 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  T) || defined(SQ
1ac40 4c 49 54 45 5f 54 43 4c 4d 44 35 29 0a 2f 2a 0a  LITE_TCLMD5)./*.
1ac50 20 2a 20 54 68 69 73 20 63 6f 64 65 20 69 6d 70   * This code imp
1ac60 6c 65 6d 65 6e 74 73 20 74 68 65 20 4d 44 35 20  lements the MD5 
1ac70 6d 65 73 73 61 67 65 2d 64 69 67 65 73 74 20 61  message-digest a
1ac80 6c 67 6f 72 69 74 68 6d 2e 0a 20 2a 20 54 68 65  lgorithm.. * The
1ac90 20 61 6c 67 6f 72 69 74 68 6d 20 69 73 20 64 75   algorithm is du
1aca0 65 20 74 6f 20 52 6f 6e 20 52 69 76 65 73 74 2e  e to Ron Rivest.
1acb0 20 20 54 68 69 73 20 63 6f 64 65 20 77 61 73 0a    This code was.
1acc0 20 2a 20 77 72 69 74 74 65 6e 20 62 79 20 43 6f   * written by Co
1acd0 6c 69 6e 20 50 6c 75 6d 62 20 69 6e 20 31 39 39  lin Plumb in 199
1ace0 33 2c 20 6e 6f 20 63 6f 70 79 72 69 67 68 74 20  3, no copyright 
1acf0 69 73 20 63 6c 61 69 6d 65 64 2e 0a 20 2a 20 54  is claimed.. * T
1ad00 68 69 73 20 63 6f 64 65 20 69 73 20 69 6e 20 74  his code is in t
1ad10 68 65 20 70 75 62 6c 69 63 20 64 6f 6d 61 69 6e  he public domain
1ad20 3b 20 64 6f 20 77 69 74 68 20 69 74 20 77 68 61  ; do with it wha
1ad30 74 20 79 6f 75 20 77 69 73 68 2e 0a 20 2a 0a 20  t you wish.. *. 
1ad40 2a 20 45 71 75 69 76 61 6c 65 6e 74 20 63 6f 64  * Equivalent cod
1ad50 65 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20 66  e is available f
1ad60 72 6f 6d 20 52 53 41 20 44 61 74 61 20 53 65 63  rom RSA Data Sec
1ad70 75 72 69 74 79 2c 20 49 6e 63 2e 0a 20 2a 20 54  urity, Inc.. * T
1ad80 68 69 73 20 63 6f 64 65 20 68 61 73 20 62 65 65  his code has bee
1ad90 6e 20 74 65 73 74 65 64 20 61 67 61 69 6e 73 74  n tested against
1ada0 20 74 68 61 74 2c 20 61 6e 64 20 69 73 20 65 71   that, and is eq
1adb0 75 69 76 61 6c 65 6e 74 2c 0a 20 2a 20 65 78 63  uivalent,. * exc
1adc0 65 70 74 20 74 68 61 74 20 79 6f 75 20 64 6f 6e  ept that you don
1add0 27 74 20 6e 65 65 64 20 74 6f 20 69 6e 63 6c 75  't need to inclu
1ade0 64 65 20 74 77 6f 20 70 61 67 65 73 20 6f 66 20  de two pages of 
1adf0 6c 65 67 61 6c 65 73 65 0a 20 2a 20 77 69 74 68  legalese. * with
1ae00 20 65 76 65 72 79 20 63 6f 70 79 2e 0a 20 2a 0a   every copy.. *.
1ae10 20 2a 20 54 6f 20 63 6f 6d 70 75 74 65 20 74 68   * To compute th
1ae20 65 20 6d 65 73 73 61 67 65 20 64 69 67 65 73 74  e message digest
1ae30 20 6f 66 20 61 20 63 68 75 6e 6b 20 6f 66 20 62   of a chunk of b
1ae40 79 74 65 73 2c 20 64 65 63 6c 61 72 65 20 61 6e  ytes, declare an
1ae50 0a 20 2a 20 4d 44 35 43 6f 6e 74 65 78 74 20 73  . * MD5Context s
1ae60 74 72 75 63 74 75 72 65 2c 20 70 61 73 73 20 69  tructure, pass i
1ae70 74 20 74 6f 20 4d 44 35 49 6e 69 74 2c 20 63 61  t to MD5Init, ca
1ae80 6c 6c 20 4d 44 35 55 70 64 61 74 65 20 61 73 0a  ll MD5Update as.
1ae90 20 2a 20 6e 65 65 64 65 64 20 6f 6e 20 62 75 66   * needed on buf
1aea0 66 65 72 73 20 66 75 6c 6c 20 6f 66 20 62 79 74  fers full of byt
1aeb0 65 73 2c 20 61 6e 64 20 74 68 65 6e 20 63 61 6c  es, and then cal
1aec0 6c 20 4d 44 35 46 69 6e 61 6c 2c 20 77 68 69 63  l MD5Final, whic
1aed0 68 0a 20 2a 20 77 69 6c 6c 20 66 69 6c 6c 20 61  h. * will fill a
1aee0 20 73 75 70 70 6c 69 65 64 20 31 36 2d 62 79 74   supplied 16-byt
1aef0 65 20 61 72 72 61 79 20 77 69 74 68 20 74 68 65  e array with the
1af00 20 64 69 67 65 73 74 2e 0a 20 2a 2f 0a 0a 2f 2a   digest.. */../*
1af10 0a 20 2a 20 49 66 20 63 6f 6d 70 69 6c 65 64 20  . * If compiled 
1af20 6f 6e 20 61 20 6d 61 63 68 69 6e 65 20 74 68 61  on a machine tha
1af30 74 20 64 6f 65 73 6e 27 74 20 68 61 76 65 20 61  t doesn't have a
1af40 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 2c   32-bit integer,
1af50 0a 20 2a 20 79 6f 75 20 6a 75 73 74 20 73 65 74  . * you just set
1af60 20 22 75 69 6e 74 33 32 22 20 74 6f 20 74 68 65   "uint32" to the
1af70 20 61 70 70 72 6f 70 72 69 61 74 65 20 64 61 74   appropriate dat
1af80 61 74 79 70 65 20 66 6f 72 20 61 6e 0a 20 2a 20  atype for an. * 
1af90 75 6e 73 69 67 6e 65 64 20 33 32 2d 62 69 74 20  unsigned 32-bit 
1afa0 69 6e 74 65 67 65 72 2e 20 20 46 6f 72 20 65 78  integer.  For ex
1afb0 61 6d 70 6c 65 3a 0a 20 2a 0a 20 2a 20 20 20 20  ample:. *. *    
1afc0 20 20 20 63 63 20 2d 44 75 69 6e 74 33 32 3d 27     cc -Duint32='
1afd0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 27 20 6d  unsigned long' m
1afe0 64 35 2e 63 0a 20 2a 0a 20 2a 2f 0a 23 69 66 6e  d5.c. *. */.#ifn
1aff0 64 65 66 20 75 69 6e 74 33 32 0a 23 20 20 64 65  def uint32.#  de
1b000 66 69 6e 65 20 75 69 6e 74 33 32 20 75 6e 73 69  fine uint32 unsi
1b010 67 6e 65 64 20 69 6e 74 0a 23 65 6e 64 69 66 0a  gned int.#endif.
1b020 0a 73 74 72 75 63 74 20 4d 44 35 43 6f 6e 74 65  .struct MD5Conte
1b030 78 74 20 7b 0a 20 20 69 6e 74 20 69 73 49 6e 69  xt {.  int isIni
1b040 74 3b 0a 20 20 75 69 6e 74 33 32 20 62 75 66 5b  t;.  uint32 buf[
1b050 34 5d 3b 0a 20 20 75 69 6e 74 33 32 20 62 69 74  4];.  uint32 bit
1b060 73 5b 32 5d 3b 0a 20 20 75 6e 73 69 67 6e 65 64  s[2];.  unsigned
1b070 20 63 68 61 72 20 69 6e 5b 36 34 5d 3b 0a 7d 3b   char in[64];.};
1b080 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
1b090 4d 44 35 43 6f 6e 74 65 78 74 20 4d 44 35 43 6f  MD5Context MD5Co
1b0a0 6e 74 65 78 74 3b 0a 0a 2f 2a 0a 20 2a 20 4e 6f  ntext;../*. * No
1b0b0 74 65 3a 20 74 68 69 73 20 63 6f 64 65 20 69 73  te: this code is
1b0c0 20 68 61 72 6d 6c 65 73 73 20 6f 6e 20 6c 69 74   harmless on lit
1b0d0 74 6c 65 2d 65 6e 64 69 61 6e 20 6d 61 63 68 69  tle-endian machi
1b0e0 6e 65 73 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20  nes.. */.static 
1b0f0 76 6f 69 64 20 62 79 74 65 52 65 76 65 72 73 65  void byteReverse
1b100 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20   (unsigned char 
1b110 2a 62 75 66 2c 20 75 6e 73 69 67 6e 65 64 20 6c  *buf, unsigned l
1b120 6f 6e 67 73 29 7b 0a 20 20 20 20 20 20 20 20 75  ongs){.        u
1b130 69 6e 74 33 32 20 74 3b 0a 20 20 20 20 20 20 20  int32 t;.       
1b140 20 64 6f 20 7b 0a 20 20 20 20 20 20 20 20 20 20   do {.          
1b150 20 20 20 20 20 20 74 20 3d 20 28 75 69 6e 74 33        t = (uint3
1b160 32 29 28 28 75 6e 73 69 67 6e 65 64 29 62 75 66  2)((unsigned)buf
1b170 5b 33 5d 3c 3c 38 20 7c 20 62 75 66 5b 32 5d 29  [3]<<8 | buf[2])
1b180 20 3c 3c 20 31 36 20 7c 0a 20 20 20 20 20 20 20   << 16 |.       
1b190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b1a0 20 20 20 20 20 28 28 75 6e 73 69 67 6e 65 64 29       ((unsigned)
1b1b0 62 75 66 5b 31 5d 3c 3c 38 20 7c 20 62 75 66 5b  buf[1]<<8 | buf[
1b1c0 30 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  0]);.           
1b1d0 20 20 20 20 20 2a 28 75 69 6e 74 33 32 20 2a 29       *(uint32 *)
1b1e0 62 75 66 20 3d 20 74 3b 0a 20 20 20 20 20 20 20  buf = t;.       
1b1f0 20 20 20 20 20 20 20 20 20 62 75 66 20 2b 3d 20           buf += 
1b200 34 3b 0a 20 20 20 20 20 20 20 20 7d 20 77 68 69  4;.        } whi
1b210 6c 65 20 28 2d 2d 6c 6f 6e 67 73 29 3b 0a 7d 0a  le (--longs);.}.
1b220 2f 2a 20 54 68 65 20 66 6f 75 72 20 63 6f 72 65  /* The four core
1b230 20 66 75 6e 63 74 69 6f 6e 73 20 2d 20 46 31 20   functions - F1 
1b240 69 73 20 6f 70 74 69 6d 69 7a 65 64 20 73 6f 6d  is optimized som
1b250 65 77 68 61 74 20 2a 2f 0a 0a 2f 2a 20 23 64 65  ewhat */../* #de
1b260 66 69 6e 65 20 46 31 28 78 2c 20 79 2c 20 7a 29  fine F1(x, y, z)
1b270 20 28 78 20 26 20 79 20 7c 20 7e 78 20 26 20 7a   (x & y | ~x & z
1b280 29 20 2a 2f 0a 23 64 65 66 69 6e 65 20 46 31 28  ) */.#define F1(
1b290 78 2c 20 79 2c 20 7a 29 20 28 7a 20 5e 20 28 78  x, y, z) (z ^ (x
1b2a0 20 26 20 28 79 20 5e 20 7a 29 29 29 0a 23 64 65   & (y ^ z))).#de
1b2b0 66 69 6e 65 20 46 32 28 78 2c 20 79 2c 20 7a 29  fine F2(x, y, z)
1b2c0 20 46 31 28 7a 2c 20 78 2c 20 79 29 0a 23 64 65   F1(z, x, y).#de
1b2d0 66 69 6e 65 20 46 33 28 78 2c 20 79 2c 20 7a 29  fine F3(x, y, z)
1b2e0 20 28 78 20 5e 20 79 20 5e 20 7a 29 0a 23 64 65   (x ^ y ^ z).#de
1b2f0 66 69 6e 65 20 46 34 28 78 2c 20 79 2c 20 7a 29  fine F4(x, y, z)
1b300 20 28 79 20 5e 20 28 78 20 7c 20 7e 7a 29 29 0a   (y ^ (x | ~z)).
1b310 0a 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65 20  ./* This is the 
1b320 63 65 6e 74 72 61 6c 20 73 74 65 70 20 69 6e 20  central step in 
1b330 74 68 65 20 4d 44 35 20 61 6c 67 6f 72 69 74 68  the MD5 algorith
1b340 6d 2e 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 44  m. */.#define MD
1b350 35 53 54 45 50 28 66 2c 20 77 2c 20 78 2c 20 79  5STEP(f, w, x, y
1b360 2c 20 7a 2c 20 64 61 74 61 2c 20 73 29 20 5c 0a  , z, data, s) \.
1b370 20 20 20 20 20 20 20 20 28 20 77 20 2b 3d 20 66          ( w += f
1b380 28 78 2c 20 79 2c 20 7a 29 20 2b 20 64 61 74 61  (x, y, z) + data
1b390 2c 20 20 77 20 3d 20 77 3c 3c 73 20 7c 20 77 3e  ,  w = w<<s | w>
1b3a0 3e 28 33 32 2d 73 29 2c 20 20 77 20 2b 3d 20 78  >(32-s),  w += x
1b3b0 20 29 0a 0a 2f 2a 0a 20 2a 20 54 68 65 20 63 6f   )../*. * The co
1b3c0 72 65 20 6f 66 20 74 68 65 20 4d 44 35 20 61 6c  re of the MD5 al
1b3d0 67 6f 72 69 74 68 6d 2c 20 74 68 69 73 20 61 6c  gorithm, this al
1b3e0 74 65 72 73 20 61 6e 20 65 78 69 73 74 69 6e 67  ters an existing
1b3f0 20 4d 44 35 20 68 61 73 68 20 74 6f 0a 20 2a 20   MD5 hash to. * 
1b400 72 65 66 6c 65 63 74 20 74 68 65 20 61 64 64 69  reflect the addi
1b410 74 69 6f 6e 20 6f 66 20 31 36 20 6c 6f 6e 67 77  tion of 16 longw
1b420 6f 72 64 73 20 6f 66 20 6e 65 77 20 64 61 74 61  ords of new data
1b430 2e 20 20 4d 44 35 55 70 64 61 74 65 20 62 6c 6f  .  MD5Update blo
1b440 63 6b 73 0a 20 2a 20 74 68 65 20 64 61 74 61 20  cks. * the data 
1b450 61 6e 64 20 63 6f 6e 76 65 72 74 73 20 62 79 74  and converts byt
1b460 65 73 20 69 6e 74 6f 20 6c 6f 6e 67 77 6f 72 64  es into longword
1b470 73 20 66 6f 72 20 74 68 69 73 20 72 6f 75 74 69  s for this routi
1b480 6e 65 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20 76  ne.. */.static v
1b490 6f 69 64 20 4d 44 35 54 72 61 6e 73 66 6f 72 6d  oid MD5Transform
1b4a0 28 75 69 6e 74 33 32 20 62 75 66 5b 34 5d 2c 20  (uint32 buf[4], 
1b4b0 63 6f 6e 73 74 20 75 69 6e 74 33 32 20 69 6e 5b  const uint32 in[
1b4c0 31 36 5d 29 7b 0a 20 20 20 20 20 20 20 20 72 65  16]){.        re
1b4d0 67 69 73 74 65 72 20 75 69 6e 74 33 32 20 61 2c  gister uint32 a,
1b4e0 20 62 2c 20 63 2c 20 64 3b 0a 0a 20 20 20 20 20   b, c, d;..     
1b4f0 20 20 20 61 20 3d 20 62 75 66 5b 30 5d 3b 0a 20     a = buf[0];. 
1b500 20 20 20 20 20 20 20 62 20 3d 20 62 75 66 5b 31         b = buf[1
1b510 5d 3b 0a 20 20 20 20 20 20 20 20 63 20 3d 20 62  ];.        c = b
1b520 75 66 5b 32 5d 3b 0a 20 20 20 20 20 20 20 20 64  uf[2];.        d
1b530 20 3d 20 62 75 66 5b 33 5d 3b 0a 0a 20 20 20 20   = buf[3];..    
1b540 20 20 20 20 4d 44 35 53 54 45 50 28 46 31 2c 20      MD5STEP(F1, 
1b550 61 2c 20 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 20  a, b, c, d, in[ 
1b560 30 5d 2b 30 78 64 37 36 61 61 34 37 38 2c 20 20  0]+0xd76aa478,  
1b570 37 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53  7);.        MD5S
1b580 54 45 50 28 46 31 2c 20 64 2c 20 61 2c 20 62 2c  TEP(F1, d, a, b,
1b590 20 63 2c 20 69 6e 5b 20 31 5d 2b 30 78 65 38 63   c, in[ 1]+0xe8c
1b5a0 37 62 37 35 36 2c 20 31 32 29 3b 0a 20 20 20 20  7b756, 12);.    
1b5b0 20 20 20 20 4d 44 35 53 54 45 50 28 46 31 2c 20      MD5STEP(F1, 
1b5c0 63 2c 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 20  c, d, a, b, in[ 
1b5d0 32 5d 2b 30 78 32 34 32 30 37 30 64 62 2c 20 31  2]+0x242070db, 1
1b5e0 37 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53  7);.        MD5S
1b5f0 54 45 50 28 46 31 2c 20 62 2c 20 63 2c 20 64 2c  TEP(F1, b, c, d,
1b600 20 61 2c 20 69 6e 5b 20 33 5d 2b 30 78 63 31 62   a, in[ 3]+0xc1b
1b610 64 63 65 65 65 2c 20 32 32 29 3b 0a 20 20 20 20  dceee, 22);.    
1b620 20 20 20 20 4d 44 35 53 54 45 50 28 46 31 2c 20      MD5STEP(F1, 
1b630 61 2c 20 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 20  a, b, c, d, in[ 
1b640 34 5d 2b 30 78 66 35 37 63 30 66 61 66 2c 20 20  4]+0xf57c0faf,  
1b650 37 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53  7);.        MD5S
1b660 54 45 50 28 46 31 2c 20 64 2c 20 61 2c 20 62 2c  TEP(F1, d, a, b,
1b670 20 63 2c 20 69 6e 5b 20 35 5d 2b 30 78 34 37 38   c, in[ 5]+0x478
1b680 37 63 36 32 61 2c 20 31 32 29 3b 0a 20 20 20 20  7c62a, 12);.    
1b690 20 20 20 20 4d 44 35 53 54 45 50 28 46 31 2c 20      MD5STEP(F1, 
1b6a0 63 2c 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 20  c, d, a, b, in[ 
1b6b0 36 5d 2b 30 78 61 38 33 30 34 36 31 33 2c 20 31  6]+0xa8304613, 1
1b6c0 37 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53  7);.        MD5S
1b6d0 54 45 50 28 46 31 2c 20 62 2c 20 63 2c 20 64 2c  TEP(F1, b, c, d,
1b6e0 20 61 2c 20 69 6e 5b 20 37 5d 2b 30 78 66 64 34   a, in[ 7]+0xfd4
1b6f0 36 39 35 30 31 2c 20 32 32 29 3b 0a 20 20 20 20  69501, 22);.    
1b700 20 20 20 20 4d 44 35 53 54 45 50 28 46 31 2c 20      MD5STEP(F1, 
1b710 61 2c 20 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 20  a, b, c, d, in[ 
1b720 38 5d 2b 30 78 36 39 38 30 39 38 64 38 2c 20 20  8]+0x698098d8,  
1b730 37 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53  7);.        MD5S
1b740 54 45 50 28 46 31 2c 20 64 2c 20 61 2c 20 62 2c  TEP(F1, d, a, b,
1b750 20 63 2c 20 69 6e 5b 20 39 5d 2b 30 78 38 62 34   c, in[ 9]+0x8b4
1b760 34 66 37 61 66 2c 20 31 32 29 3b 0a 20 20 20 20  4f7af, 12);.    
1b770 20 20 20 20 4d 44 35 53 54 45 50 28 46 31 2c 20      MD5STEP(F1, 
1b780 63 2c 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 31  c, d, a, b, in[1
1b790 30 5d 2b 30 78 66 66 66 66 35 62 62 31 2c 20 31  0]+0xffff5bb1, 1
1b7a0 37 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53  7);.        MD5S
1b7b0 54 45 50 28 46 31 2c 20 62 2c 20 63 2c 20 64 2c  TEP(F1, b, c, d,
1b7c0 20 61 2c 20 69 6e 5b 31 31 5d 2b 30 78 38 39 35   a, in[11]+0x895
1b7d0 63 64 37 62 65 2c 20 32 32 29 3b 0a 20 20 20 20  cd7be, 22);.    
1b7e0 20 20 20 20 4d 44 35 53 54 45 50 28 46 31 2c 20      MD5STEP(F1, 
1b7f0 61 2c 20 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 31  a, b, c, d, in[1
1b800 32 5d 2b 30 78 36 62 39 30 31 31 32 32 2c 20 20  2]+0x6b901122,  
1b810 37 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53  7);.        MD5S
1b820 54 45 50 28 46 31 2c 20 64 2c 20 61 2c 20 62 2c  TEP(F1, d, a, b,
1b830 20 63 2c 20 69 6e 5b 31 33 5d 2b 30 78 66 64 39   c, in[13]+0xfd9
1b840 38 37 31 39 33 2c 20 31 32 29 3b 0a 20 20 20 20  87193, 12);.    
1b850 20 20 20 20 4d 44 35 53 54 45 50 28 46 31 2c 20      MD5STEP(F1, 
1b860 63 2c 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 31  c, d, a, b, in[1
1b870 34 5d 2b 30 78 61 36 37 39 34 33 38 65 2c 20 31  4]+0xa679438e, 1
1b880 37 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53  7);.        MD5S
1b890 54 45 50 28 46 31 2c 20 62 2c 20 63 2c 20 64 2c  TEP(F1, b, c, d,
1b8a0 20 61 2c 20 69 6e 5b 31 35 5d 2b 30 78 34 39 62   a, in[15]+0x49b
1b8b0 34 30 38 32 31 2c 20 32 32 29 3b 0a 0a 20 20 20  40821, 22);..   
1b8c0 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 32 2c       MD5STEP(F2,
1b8d0 20 61 2c 20 62 2c 20 63 2c 20 64 2c 20 69 6e 5b   a, b, c, d, in[
1b8e0 20 31 5d 2b 30 78 66 36 31 65 32 35 36 32 2c 20   1]+0xf61e2562, 
1b8f0 20 35 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35   5);.        MD5
1b900 53 54 45 50 28 46 32 2c 20 64 2c 20 61 2c 20 62  STEP(F2, d, a, b
1b910 2c 20 63 2c 20 69 6e 5b 20 36 5d 2b 30 78 63 30  , c, in[ 6]+0xc0
1b920 34 30 62 33 34 30 2c 20 20 39 29 3b 0a 20 20 20  40b340,  9);.   
1b930 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 32 2c       MD5STEP(F2,
1b940 20 63 2c 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b   c, d, a, b, in[
1b950 31 31 5d 2b 30 78 32 36 35 65 35 61 35 31 2c 20  11]+0x265e5a51, 
1b960 31 34 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35  14);.        MD5
1b970 53 54 45 50 28 46 32 2c 20 62 2c 20 63 2c 20 64  STEP(F2, b, c, d
1b980 2c 20 61 2c 20 69 6e 5b 20 30 5d 2b 30 78 65 39  , a, in[ 0]+0xe9
1b990 62 36 63 37 61 61 2c 20 32 30 29 3b 0a 20 20 20  b6c7aa, 20);.   
1b9a0 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 32 2c       MD5STEP(F2,
1b9b0 20 61 2c 20 62 2c 20 63 2c 20 64 2c 20 69 6e 5b   a, b, c, d, in[
1b9c0 20 35 5d 2b 30 78 64 36 32 66 31 30 35 64 2c 20   5]+0xd62f105d, 
1b9d0 20 35 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35   5);.        MD5
1b9e0 53 54 45 50 28 46 32 2c 20 64 2c 20 61 2c 20 62  STEP(F2, d, a, b
1b9f0 2c 20 63 2c 20 69 6e 5b 31 30 5d 2b 30 78 30 32  , c, in[10]+0x02
1ba00 34 34 31 34 35 33 2c 20 20 39 29 3b 0a 20 20 20  441453,  9);.   
1ba10 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 32 2c       MD5STEP(F2,
1ba20 20 63 2c 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b   c, d, a, b, in[
1ba30 31 35 5d 2b 30 78 64 38 61 31 65 36 38 31 2c 20  15]+0xd8a1e681, 
1ba40 31 34 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35  14);.        MD5
1ba50 53 54 45 50 28 46 32 2c 20 62 2c 20 63 2c 20 64  STEP(F2, b, c, d
1ba60 2c 20 61 2c 20 69 6e 5b 20 34 5d 2b 30 78 65 37  , a, in[ 4]+0xe7
1ba70 64 33 66 62 63 38 2c 20 32 30 29 3b 0a 20 20 20  d3fbc8, 20);.   
1ba80 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 32 2c       MD5STEP(F2,
1ba90 20 61 2c 20 62 2c 20 63 2c 20 64 2c 20 69 6e 5b   a, b, c, d, in[
1baa0 20 39 5d 2b 30 78 32 31 65 31 63 64 65 36 2c 20   9]+0x21e1cde6, 
1bab0 20 35 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35   5);.        MD5
1bac0 53 54 45 50 28 46 32 2c 20 64 2c 20 61 2c 20 62  STEP(F2, d, a, b
1bad0 2c 20 63 2c 20 69 6e 5b 31 34 5d 2b 30 78 63 33  , c, in[14]+0xc3
1bae0 33 37 30 37 64 36 2c 20 20 39 29 3b 0a 20 20 20  3707d6,  9);.   
1baf0 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 32 2c       MD5STEP(F2,
1bb00 20 63 2c 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b   c, d, a, b, in[
1bb10 20 33 5d 2b 30 78 66 34 64 35 30 64 38 37 2c 20   3]+0xf4d50d87, 
1bb20 31 34 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35  14);.        MD5
1bb30 53 54 45 50 28 46 32 2c 20 62 2c 20 63 2c 20 64  STEP(F2, b, c, d
1bb40 2c 20 61 2c 20 69 6e 5b 20 38 5d 2b 30 78 34 35  , a, in[ 8]+0x45
1bb50 35 61 31 34 65 64 2c 20 32 30 29 3b 0a 20 20 20  5a14ed, 20);.   
1bb60 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 32 2c       MD5STEP(F2,
1bb70 20 61 2c 20 62 2c 20 63 2c 20 64 2c 20 69 6e 5b   a, b, c, d, in[
1bb80 31 33 5d 2b 30 78 61 39 65 33 65 39 30 35 2c 20  13]+0xa9e3e905, 
1bb90 20 35 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35   5);.        MD5
1bba0 53 54 45 50 28 46 32 2c 20 64 2c 20 61 2c 20 62  STEP(F2, d, a, b
1bbb0 2c 20 63 2c 20 69 6e 5b 20 32 5d 2b 30 78 66 63  , c, in[ 2]+0xfc
1bbc0 65 66 61 33 66 38 2c 20 20 39 29 3b 0a 20 20 20  efa3f8,  9);.   
1bbd0 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 32 2c       MD5STEP(F2,
1bbe0 20 63 2c 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b   c, d, a, b, in[
1bbf0 20 37 5d 2b 30 78 36 37 36 66 30 32 64 39 2c 20   7]+0x676f02d9, 
1bc00 31 34 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35  14);.        MD5
1bc10 53 54 45 50 28 46 32 2c 20 62 2c 20 63 2c 20 64  STEP(F2, b, c, d
1bc20 2c 20 61 2c 20 69 6e 5b 31 32 5d 2b 30 78 38 64  , a, in[12]+0x8d
1bc30 32 61 34 63 38 61 2c 20 32 30 29 3b 0a 0a 20 20  2a4c8a, 20);..  
1bc40 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 33        MD5STEP(F3
1bc50 2c 20 61 2c 20 62 2c 20 63 2c 20 64 2c 20 69 6e  , a, b, c, d, in
1bc60 5b 20 35 5d 2b 30 78 66 66 66 61 33 39 34 32 2c  [ 5]+0xfffa3942,
1bc70 20 20 34 29 3b 0a 20 20 20 20 20 20 20 20 4d 44    4);.        MD
1bc80 35 53 54 45 50 28 46 33 2c 20 64 2c 20 61 2c 20  5STEP(F3, d, a, 
1bc90 62 2c 20 63 2c 20 69 6e 5b 20 38 5d 2b 30 78 38  b, c, in[ 8]+0x8
1bca0 37 37 31 66 36 38 31 2c 20 31 31 29 3b 0a 20 20  771f681, 11);.  
1bcb0 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 33        MD5STEP(F3
1bcc0 2c 20 63 2c 20 64 2c 20 61 2c 20 62 2c 20 69 6e  , c, d, a, b, in
1bcd0 5b 31 31 5d 2b 30 78 36 64 39 64 36 31 32 32 2c  [11]+0x6d9d6122,
1bce0 20 31 36 29 3b 0a 20 20 20 20 20 20 20 20 4d 44   16);.        MD
1bcf0 35 53 54 45 50 28 46 33 2c 20 62 2c 20 63 2c 20  5STEP(F3, b, c, 
1bd00 64 2c 20 61 2c 20 69 6e 5b 31 34 5d 2b 30 78 66  d, a, in[14]+0xf
1bd10 64 65 35 33 38 30 63 2c 20 32 33 29 3b 0a 20 20  de5380c, 23);.  
1bd20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 33        MD5STEP(F3
1bd30 2c 20 61 2c 20 62 2c 20 63 2c 20 64 2c 20 69 6e  , a, b, c, d, in
1bd40 5b 20 31 5d 2b 30 78 61 34 62 65 65 61 34 34 2c  [ 1]+0xa4beea44,
1bd50 20 20 34 29 3b 0a 20 20 20 20 20 20 20 20 4d 44    4);.        MD
1bd60 35 53 54 45 50 28 46 33 2c 20 64 2c 20 61 2c 20  5STEP(F3, d, a, 
1bd70 62 2c 20 63 2c 20 69 6e 5b 20 34 5d 2b 30 78 34  b, c, in[ 4]+0x4
1bd80 62 64 65 63 66 61 39 2c 20 31 31 29 3b 0a 20 20  bdecfa9, 11);.  
1bd90 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 33        MD5STEP(F3
1bda0 2c 20 63 2c 20 64 2c 20 61 2c 20 62 2c 20 69 6e  , c, d, a, b, in
1bdb0 5b 20 37 5d 2b 30 78 66 36 62 62 34 62 36 30 2c  [ 7]+0xf6bb4b60,
1bdc0 20 31 36 29 3b 0a 20 20 20 20 20 20 20 20 4d 44   16);.        MD
1bdd0 35 53 54 45 50 28 46 33 2c 20 62 2c 20 63 2c 20  5STEP(F3, b, c, 
1bde0 64 2c 20 61 2c 20 69 6e 5b 31 30 5d 2b 30 78 62  d, a, in[10]+0xb
1bdf0 65 62 66 62 63 37 30 2c 20 32 33 29 3b 0a 20 20  ebfbc70, 23);.  
1be00 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 33        MD5STEP(F3
1be10 2c 20 61 2c 20 62 2c 20 63 2c 20 64 2c 20 69 6e  , a, b, c, d, in
1be20 5b 31 33 5d 2b 30 78 32 38 39 62 37 65 63 36 2c  [13]+0x289b7ec6,
1be30 20 20 34 29 3b 0a 20 20 20 20 20 20 20 20 4d 44    4);.        MD
1be40 35 53 54 45 50 28 46 33 2c 20 64 2c 20 61 2c 20  5STEP(F3, d, a, 
1be50 62 2c 20 63 2c 20 69 6e 5b 20 30 5d 2b 30 78 65  b, c, in[ 0]+0xe
1be60 61 61 31 32 37 66 61 2c 20 31 31 29 3b 0a 20 20  aa127fa, 11);.  
1be70 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 33        MD5STEP(F3
1be80 2c 20 63 2c 20 64 2c 20 61 2c 20 62 2c 20 69 6e  , c, d, a, b, in
1be90 5b 20 33 5d 2b 30 78 64 34 65 66 33 30 38 35 2c  [ 3]+0xd4ef3085,
1bea0 20 31 36 29 3b 0a 20 20 20 20 20 20 20 20 4d 44   16);.        MD
1beb0 35 53 54 45 50 28 46 33 2c 20 62 2c 20 63 2c 20  5STEP(F3, b, c, 
1bec0 64 2c 20 61 2c 20 69 6e 5b 20 36 5d 2b 30 78 30  d, a, in[ 6]+0x0
1bed0 34 38 38 31 64 30 35 2c 20 32 33 29 3b 0a 20 20  4881d05, 23);.  
1bee0 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 33        MD5STEP(F3
1bef0 2c 20 61 2c 20 62 2c 20 63 2c 20 64 2c 20 69 6e  , a, b, c, d, in
1bf00 5b 20 39 5d 2b 30 78 64 39 64 34 64 30 33 39 2c  [ 9]+0xd9d4d039,
1bf10 20 20 34 29 3b 0a 20 20 20 20 20 20 20 20 4d 44    4);.        MD
1bf20 35 53 54 45 50 28 46 33 2c 20 64 2c 20 61 2c 20  5STEP(F3, d, a, 
1bf30 62 2c 20 63 2c 20 69 6e 5b 31 32 5d 2b 30 78 65  b, c, in[12]+0xe
1bf40 36 64 62 39 39 65 35 2c 20 31 31 29 3b 0a 20 20  6db99e5, 11);.  
1bf50 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 33        MD5STEP(F3
1bf60 2c 20 63 2c 20 64 2c 20 61 2c 20 62 2c 20 69 6e  , c, d, a, b, in
1bf70 5b 31 35 5d 2b 30 78 31 66 61 32 37 63 66 38 2c  [15]+0x1fa27cf8,
1bf80 20 31 36 29 3b 0a 20 20 20 20 20 20 20 20 4d 44   16);.        MD
1bf90 35 53 54 45 50 28 46 33 2c 20 62 2c 20 63 2c 20  5STEP(F3, b, c, 
1bfa0 64 2c 20 61 2c 20 69 6e 5b 20 32 5d 2b 30 78 63  d, a, in[ 2]+0xc
1bfb0 34 61 63 35 36 36 35 2c 20 32 33 29 3b 0a 0a 20  4ac5665, 23);.. 
1bfc0 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
1bfd0 34 2c 20 61 2c 20 62 2c 20 63 2c 20 64 2c 20 69  4, a, b, c, d, i
1bfe0 6e 5b 20 30 5d 2b 30 78 66 34 32 39 32 32 34 34  n[ 0]+0xf4292244
1bff0 2c 20 20 36 29 3b 0a 20 20 20 20 20 20 20 20 4d  ,  6);.        M
1c000 44 35 53 54 45 50 28 46 34 2c 20 64 2c 20 61 2c  D5STEP(F4, d, a,
1c010 20 62 2c 20 63 2c 20 69 6e 5b 20 37 5d 2b 30 78   b, c, in[ 7]+0x
1c020 34 33 32 61 66 66 39 37 2c 20 31 30 29 3b 0a 20  432aff97, 10);. 
1c030 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
1c040 34 2c 20 63 2c 20 64 2c 20 61 2c 20 62 2c 20 69  4, c, d, a, b, i
1c050 6e 5b 31 34 5d 2b 30 78 61 62 39 34 32 33 61 37  n[14]+0xab9423a7
1c060 2c 20 31 35 29 3b 0a 20 20 20 20 20 20 20 20 4d  , 15);.        M
1c070 44 35 53 54 45 50 28 46 34 2c 20 62 2c 20 63 2c  D5STEP(F4, b, c,
1c080 20 64 2c 20 61 2c 20 69 6e 5b 20 35 5d 2b 30 78   d, a, in[ 5]+0x
1c090 66 63 39 33 61 30 33 39 2c 20 32 31 29 3b 0a 20  fc93a039, 21);. 
1c0a0 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
1c0b0 34 2c 20 61 2c 20 62 2c 20 63 2c 20 64 2c 20 69  4, a, b, c, d, i
1c0c0 6e 5b 31 32 5d 2b 30 78 36 35 35 62 35 39 63 33  n[12]+0x655b59c3
1c0d0 2c 20 20 36 29 3b 0a 20 20 20 20 20 20 20 20 4d  ,  6);.        M
1c0e0 44 35 53 54 45 50 28 46 34 2c 20 64 2c 20 61 2c  D5STEP(F4, d, a,
1c0f0 20 62 2c 20 63 2c 20 69 6e 5b 20 33 5d 2b 30 78   b, c, in[ 3]+0x
1c100 38 66 30 63 63 63 39 32 2c 20 31 30 29 3b 0a 20  8f0ccc92, 10);. 
1c110 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
1c120 34 2c 20 63 2c 20 64 2c 20 61 2c 20 62 2c 20 69  4, c, d, a, b, i
1c130 6e 5b 31 30 5d 2b 30 78 66 66 65 66 66 34 37 64  n[10]+0xffeff47d
1c140 2c 20 31 35 29 3b 0a 20 20 20 20 20 20 20 20 4d  , 15);.        M
1c150 44 35 53 54 45 50 28 46 34 2c 20 62 2c 20 63 2c  D5STEP(F4, b, c,
1c160 20 64 2c 20 61 2c 20 69 6e 5b 20 31 5d 2b 30 78   d, a, in[ 1]+0x
1c170 38 35 38 34 35 64 64 31 2c 20 32 31 29 3b 0a 20  85845dd1, 21);. 
1c180 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
1c190 34 2c 20 61 2c 20 62 2c 20 63 2c 20 64 2c 20 69  4, a, b, c, d, i
1c1a0 6e 5b 20 38 5d 2b 30 78 36 66 61 38 37 65 34 66  n[ 8]+0x6fa87e4f
1c1b0 2c 20 20 36 29 3b 0a 20 20 20 20 20 20 20 20 4d  ,  6);.        M
1c1c0 44 35 53 54 45 50 28 46 34 2c 20 64 2c 20 61 2c  D5STEP(F4, d, a,
1c1d0 20 62 2c 20 63 2c 20 69 6e 5b 31 35 5d 2b 30 78   b, c, in[15]+0x
1c1e0 66 65 32 63 65 36 65 30 2c 20 31 30 29 3b 0a 20  fe2ce6e0, 10);. 
1c1f0 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
1c200 34 2c 20 63 2c 20 64 2c 20 61 2c 20 62 2c 20 69  4, c, d, a, b, i
1c210 6e 5b 20 36 5d 2b 30 78 61 33 30 31 34 33 31 34  n[ 6]+0xa3014314
1c220 2c 20 31 35 29 3b 0a 20 20 20 20 20 20 20 20 4d  , 15);.        M
1c230 44 35 53 54 45 50 28 46 34 2c 20 62 2c 20 63 2c  D5STEP(F4, b, c,
1c240 20 64 2c 20 61 2c 20 69 6e 5b 31 33 5d 2b 30 78   d, a, in[13]+0x
1c250 34 65 30 38 31 31 61 31 2c 20 32 31 29 3b 0a 20  4e0811a1, 21);. 
1c260 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
1c270 34 2c 20 61 2c 20 62 2c 20 63 2c 20 64 2c 20 69  4, a, b, c, d, i
1c280 6e 5b 20 34 5d 2b 30 78 66 37 35 33 37 65 38 32  n[ 4]+0xf7537e82
1c290 2c 20 20 36 29 3b 0a 20 20 20 20 20 20 20 20 4d  ,  6);.        M
1c2a0 44 35 53 54 45 50 28 46 34 2c 20 64 2c 20 61 2c  D5STEP(F4, d, a,
1c2b0 20 62 2c 20 63 2c 20 69 6e 5b 31 31 5d 2b 30 78   b, c, in[11]+0x
1c2c0 62 64 33 61 66 32 33 35 2c 20 31 30 29 3b 0a 20  bd3af235, 10);. 
1c2d0 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
1c2e0 34 2c 20 63 2c 20 64 2c 20 61 2c 20 62 2c 20 69  4, c, d, a, b, i
1c2f0 6e 5b 20 32 5d 2b 30 78 32 61 64 37 64 32 62 62  n[ 2]+0x2ad7d2bb
1c300 2c 20 31 35 29 3b 0a 20 20 20 20 20 20 20 20 4d  , 15);.        M
1c310 44 35 53 54 45 50 28 46 34 2c 20 62 2c 20 63 2c  D5STEP(F4, b, c,
1c320 20 64 2c 20 61 2c 20 69 6e 5b 20 39 5d 2b 30 78   d, a, in[ 9]+0x
1c330 65 62 38 36 64 33 39 31 2c 20 32 31 29 3b 0a 0a  eb86d391, 21);..
1c340 20 20 20 20 20 20 20 20 62 75 66 5b 30 5d 20 2b          buf[0] +
1c350 3d 20 61 3b 0a 20 20 20 20 20 20 20 20 62 75 66  = a;.        buf
1c360 5b 31 5d 20 2b 3d 20 62 3b 0a 20 20 20 20 20 20  [1] += b;.      
1c370 20 20 62 75 66 5b 32 5d 20 2b 3d 20 63 3b 0a 20    buf[2] += c;. 
1c380 20 20 20 20 20 20 20 62 75 66 5b 33 5d 20 2b 3d         buf[3] +=
1c390 20 64 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 74 61   d;.}../*. * Sta
1c3a0 72 74 20 4d 44 35 20 61 63 63 75 6d 75 6c 61 74  rt MD5 accumulat
1c3b0 69 6f 6e 2e 20 20 53 65 74 20 62 69 74 20 63 6f  ion.  Set bit co
1c3c0 75 6e 74 20 74 6f 20 30 20 61 6e 64 20 62 75 66  unt to 0 and buf
1c3d0 66 65 72 20 74 6f 20 6d 79 73 74 65 72 69 6f 75  fer to mysteriou
1c3e0 73 0a 20 2a 20 69 6e 69 74 69 61 6c 69 7a 61 74  s. * initializat
1c3f0 69 6f 6e 20 63 6f 6e 73 74 61 6e 74 73 2e 0a 20  ion constants.. 
1c400 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 4d  */.static void M
1c410 44 35 49 6e 69 74 28 4d 44 35 43 6f 6e 74 65 78  D5Init(MD5Contex
1c420 74 20 2a 63 74 78 29 7b 0a 20 20 20 20 20 20 20  t *ctx){.       
1c430 20 63 74 78 2d 3e 69 73 49 6e 69 74 20 3d 20 31   ctx->isInit = 1
1c440 3b 0a 20 20 20 20 20 20 20 20 63 74 78 2d 3e 62  ;.        ctx->b
1c450 75 66 5b 30 5d 20 3d 20 30 78 36 37 34 35 32 33  uf[0] = 0x674523
1c460 30 31 3b 0a 20 20 20 20 20 20 20 20 63 74 78 2d  01;.        ctx-
1c470 3e 62 75 66 5b 31 5d 20 3d 20 30 78 65 66 63 64  >buf[1] = 0xefcd
1c480 61 62 38 39 3b 0a 20 20 20 20 20 20 20 20 63 74  ab89;.        ct
1c490 78 2d 3e 62 75 66 5b 32 5d 20 3d 20 30 78 39 38  x->buf[2] = 0x98
1c4a0 62 61 64 63 66 65 3b 0a 20 20 20 20 20 20 20 20  badcfe;.        
1c4b0 63 74 78 2d 3e 62 75 66 5b 33 5d 20 3d 20 30 78  ctx->buf[3] = 0x
1c4c0 31 30 33 32 35 34 37 36 3b 0a 20 20 20 20 20 20  10325476;.      
1c4d0 20 20 63 74 78 2d 3e 62 69 74 73 5b 30 5d 20 3d    ctx->bits[0] =
1c4e0 20 30 3b 0a 20 20 20 20 20 20 20 20 63 74 78 2d   0;.        ctx-
1c4f0 3e 62 69 74 73 5b 31 5d 20 3d 20 30 3b 0a 7d 0a  >bits[1] = 0;.}.
1c500 0a 2f 2a 0a 20 2a 20 55 70 64 61 74 65 20 63 6f  ./*. * Update co
1c510 6e 74 65 78 74 20 74 6f 20 72 65 66 6c 65 63 74  ntext to reflect
1c520 20 74 68 65 20 63 6f 6e 63 61 74 65 6e 61 74 69   the concatenati
1c530 6f 6e 20 6f 66 20 61 6e 6f 74 68 65 72 20 62 75  on of another bu
1c540 66 66 65 72 20 66 75 6c 6c 0a 20 2a 20 6f 66 20  ffer full. * of 
1c550 62 79 74 65 73 2e 0a 20 2a 2f 0a 73 74 61 74 69  bytes.. */.stati
1c560 63 0a 76 6f 69 64 20 4d 44 35 55 70 64 61 74 65  c.void MD5Update
1c570 28 4d 44 35 43 6f 6e 74 65 78 74 20 2a 63 74 78  (MD5Context *ctx
1c580 2c 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64  , const unsigned
1c590 20 63 68 61 72 20 2a 62 75 66 2c 20 75 6e 73 69   char *buf, unsi
1c5a0 67 6e 65 64 20 69 6e 74 20 6c 65 6e 29 7b 0a 20  gned int len){. 
1c5b0 20 20 20 20 20 20 20 75 69 6e 74 33 32 20 74 3b         uint32 t;
1c5c0 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 55 70 64  ..        /* Upd
1c5d0 61 74 65 20 62 69 74 63 6f 75 6e 74 20 2a 2f 0a  ate bitcount */.
1c5e0 0a 20 20 20 20 20 20 20 20 74 20 3d 20 63 74 78  .        t = ctx
1c5f0 2d 3e 62 69 74 73 5b 30 5d 3b 0a 20 20 20 20 20  ->bits[0];.     
1c600 20 20 20 69 66 20 28 28 63 74 78 2d 3e 62 69 74     if ((ctx->bit
1c610 73 5b 30 5d 20 3d 20 74 20 2b 20 28 28 75 69 6e  s[0] = t + ((uin
1c620 74 33 32 29 6c 65 6e 20 3c 3c 20 33 29 29 20 3c  t32)len << 3)) <
1c630 20 74 29 0a 20 20 20 20 20 20 20 20 20 20 20 20   t).            
1c640 20 20 20 20 63 74 78 2d 3e 62 69 74 73 5b 31 5d      ctx->bits[1]
1c650 2b 2b 3b 20 2f 2a 20 43 61 72 72 79 20 66 72 6f  ++; /* Carry fro
1c660 6d 20 6c 6f 77 20 74 6f 20 68 69 67 68 20 2a 2f  m low to high */
1c670 0a 20 20 20 20 20 20 20 20 63 74 78 2d 3e 62 69  .        ctx->bi
1c680 74 73 5b 31 5d 20 2b 3d 20 6c 65 6e 20 3e 3e 20  ts[1] += len >> 
1c690 32 39 3b 0a 0a 20 20 20 20 20 20 20 20 74 20 3d  29;..        t =
1c6a0 20 28 74 20 3e 3e 20 33 29 20 26 20 30 78 33 66   (t >> 3) & 0x3f
1c6b0 3b 20 20 20 20 2f 2a 20 42 79 74 65 73 20 61 6c  ;    /* Bytes al
1c6c0 72 65 61 64 79 20 69 6e 20 73 68 73 49 6e 66 6f  ready in shsInfo
1c6d0 2d 3e 64 61 74 61 20 2a 2f 0a 0a 20 20 20 20 20  ->data */..     
1c6e0 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 61 6e 79     /* Handle any
1c6f0 20 6c 65 61 64 69 6e 67 20 6f 64 64 2d 73 69 7a   leading odd-siz
1c700 65 64 20 63 68 75 6e 6b 73 20 2a 2f 0a 0a 20 20  ed chunks */..  
1c710 20 20 20 20 20 20 69 66 20 28 20 74 20 29 20 7b        if ( t ) {
1c720 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1c730 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
1c740 70 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68  p = (unsigned ch
1c750 61 72 20 2a 29 63 74 78 2d 3e 69 6e 20 2b 20 74  ar *)ctx->in + t
1c760 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ;..             
1c770 20 20 20 74 20 3d 20 36 34 2d 74 3b 0a 20 20 20     t = 64-t;.   
1c780 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
1c790 28 6c 65 6e 20 3c 20 74 29 20 7b 0a 20 20 20 20  (len < t) {.    
1c7a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c7b0 20 20 20 20 6d 65 6d 63 70 79 28 70 2c 20 62 75      memcpy(p, bu
1c7c0 66 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 20 20 20  f, len);.       
1c7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c7e0 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20   return;.       
1c7f0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1c800 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70             memcp
1c810 79 28 70 2c 20 62 75 66 2c 20 74 29 3b 0a 20 20  y(p, buf, t);.  
1c820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 79                by
1c830 74 65 52 65 76 65 72 73 65 28 63 74 78 2d 3e 69  teReverse(ctx->i
1c840 6e 2c 20 31 36 29 3b 0a 20 20 20 20 20 20 20 20  n, 16);.        
1c850 20 20 20 20 20 20 20 20 4d 44 35 54 72 61 6e 73          MD5Trans
1c860 66 6f 72 6d 28 63 74 78 2d 3e 62 75 66 2c 20 28  form(ctx->buf, (
1c870 75 69 6e 74 33 32 20 2a 29 63 74 78 2d 3e 69 6e  uint32 *)ctx->in
1c880 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
1c890 20 20 20 62 75 66 20 2b 3d 20 74 3b 0a 20 20 20     buf += t;.   
1c8a0 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 65 6e               len
1c8b0 20 2d 3d 20 74 3b 0a 20 20 20 20 20 20 20 20 7d   -= t;.        }
1c8c0 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 50 72 6f  ..        /* Pro
1c8d0 63 65 73 73 20 64 61 74 61 20 69 6e 20 36 34 2d  cess data in 64-
1c8e0 62 79 74 65 20 63 68 75 6e 6b 73 20 2a 2f 0a 0a  byte chunks */..
1c8f0 20 20 20 20 20 20 20 20 77 68 69 6c 65 20 28 6c          while (l
1c900 65 6e 20 3e 3d 20 36 34 29 20 7b 0a 20 20 20 20  en >= 64) {.    
1c910 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63              memc
1c920 70 79 28 63 74 78 2d 3e 69 6e 2c 20 62 75 66 2c  py(ctx->in, buf,
1c930 20 36 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20   64);.          
1c940 20 20 20 20 20 20 62 79 74 65 52 65 76 65 72 73        byteRevers
1c950 65 28 63 74 78 2d 3e 69 6e 2c 20 31 36 29 3b 0a  e(ctx->in, 16);.
1c960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c970 4d 44 35 54 72 61 6e 73 66 6f 72 6d 28 63 74 78  MD5Transform(ctx
1c980 2d 3e 62 75 66 2c 20 28 75 69 6e 74 33 32 20 2a  ->buf, (uint32 *
1c990 29 63 74 78 2d 3e 69 6e 29 3b 0a 20 20 20 20 20  )ctx->in);.     
1c9a0 20 20 20 20 20 20 20 20 20 20 20 62 75 66 20 2b             buf +
1c9b0 3d 20 36 34 3b 0a 20 20 20 20 20 20 20 20 20 20  = 64;.          
1c9c0 20 20 20 20 20 20 6c 65 6e 20 2d 3d 20 36 34 3b        len -= 64;
1c9d0 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
1c9e0 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 61 6e      /* Handle an
1c9f0 79 20 72 65 6d 61 69 6e 69 6e 67 20 62 79 74 65  y remaining byte
1ca00 73 20 6f 66 20 64 61 74 61 2e 20 2a 2f 0a 0a 20  s of data. */.. 
1ca10 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 63 74         memcpy(ct
1ca20 78 2d 3e 69 6e 2c 20 62 75 66 2c 20 6c 65 6e 29  x->in, buf, len)
1ca30 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 46 69 6e 61 6c  ;.}../*. * Final
1ca40 20 77 72 61 70 75 70 20 2d 20 70 61 64 20 74 6f   wrapup - pad to
1ca50 20 36 34 2d 62 79 74 65 20 62 6f 75 6e 64 61 72   64-byte boundar
1ca60 79 20 77 69 74 68 20 74 68 65 20 62 69 74 20 70  y with the bit p
1ca70 61 74 74 65 72 6e 0a 20 2a 20 31 20 30 2a 20 28  attern. * 1 0* (
1ca80 36 34 2d 62 69 74 20 63 6f 75 6e 74 20 6f 66 20  64-bit count of 
1ca90 62 69 74 73 20 70 72 6f 63 65 73 73 65 64 2c 20  bits processed, 
1caa0 4d 53 42 2d 66 69 72 73 74 29 0a 20 2a 2f 0a 73  MSB-first). */.s
1cab0 74 61 74 69 63 20 76 6f 69 64 20 4d 44 35 46 69  tatic void MD5Fi
1cac0 6e 61 6c 28 75 6e 73 69 67 6e 65 64 20 63 68 61  nal(unsigned cha
1cad0 72 20 64 69 67 65 73 74 5b 31 36 5d 2c 20 4d 44  r digest[16], MD
1cae0 35 43 6f 6e 74 65 78 74 20 2a 63 74 78 29 7b 0a  5Context *ctx){.
1caf0 20 20 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64          unsigned
1cb00 20 63 6f 75 6e 74 3b 0a 20 20 20 20 20 20 20 20   count;.        
1cb10 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
1cb20 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  ;..        /* Co
1cb30 6d 70 75 74 65 20 6e 75 6d 62 65 72 20 6f 66 20  mpute number of 
1cb40 62 79 74 65 73 20 6d 6f 64 20 36 34 20 2a 2f 0a  bytes mod 64 */.
1cb50 20 20 20 20 20 20 20 20 63 6f 75 6e 74 20 3d 20          count = 
1cb60 28 63 74 78 2d 3e 62 69 74 73 5b 30 5d 20 3e 3e  (ctx->bits[0] >>
1cb70 20 33 29 20 26 20 30 78 33 46 3b 0a 0a 20 20 20   3) & 0x3F;..   
1cb80 20 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20       /* Set the 
1cb90 66 69 72 73 74 20 63 68 61 72 20 6f 66 20 70 61  first char of pa
1cba0 64 64 69 6e 67 20 74 6f 20 30 78 38 30 2e 20 20  dding to 0x80.  
1cbb0 54 68 69 73 20 69 73 20 73 61 66 65 20 73 69 6e  This is safe sin
1cbc0 63 65 20 74 68 65 72 65 20 69 73 0a 20 20 20 20  ce there is.    
1cbd0 20 20 20 20 20 20 20 61 6c 77 61 79 73 20 61 74         always at
1cbe0 20 6c 65 61 73 74 20 6f 6e 65 20 62 79 74 65 20   least one byte 
1cbf0 66 72 65 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  free */.        
1cc00 70 20 3d 20 63 74 78 2d 3e 69 6e 20 2b 20 63 6f  p = ctx->in + co
1cc10 75 6e 74 3b 0a 20 20 20 20 20 20 20 20 2a 70 2b  unt;.        *p+
1cc20 2b 20 3d 20 30 78 38 30 3b 0a 0a 20 20 20 20 20  + = 0x80;..     
1cc30 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 70     /* Bytes of p
1cc40 61 64 64 69 6e 67 20 6e 65 65 64 65 64 20 74 6f  adding needed to
1cc50 20 6d 61 6b 65 20 36 34 20 62 79 74 65 73 20 2a   make 64 bytes *
1cc60 2f 0a 20 20 20 20 20 20 20 20 63 6f 75 6e 74 20  /.        count 
1cc70 3d 20 36 34 20 2d 20 31 20 2d 20 63 6f 75 6e 74  = 64 - 1 - count
1cc80 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ;..        /* Pa
1cc90 64 20 6f 75 74 20 74 6f 20 35 36 20 6d 6f 64 20  d out to 56 mod 
1cca0 36 34 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66  64 */.        if
1ccb0 20 28 63 6f 75 6e 74 20 3c 20 38 29 20 7b 0a 20   (count < 8) {. 
1ccc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1ccd0 2a 20 54 77 6f 20 6c 6f 74 73 20 6f 66 20 70 61  * Two lots of pa
1cce0 64 64 69 6e 67 3a 20 20 50 61 64 20 74 68 65 20  dding:  Pad the 
1ccf0 66 69 72 73 74 20 62 6c 6f 63 6b 20 74 6f 20 36  first block to 6
1cd00 34 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 20  4 bytes */.     
1cd10 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 73 65             memse
1cd20 74 28 70 2c 20 30 2c 20 63 6f 75 6e 74 29 3b 0a  t(p, 0, count);.
1cd30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cd40 62 79 74 65 52 65 76 65 72 73 65 28 63 74 78 2d  byteReverse(ctx-
1cd50 3e 69 6e 2c 20 31 36 29 3b 0a 20 20 20 20 20 20  >in, 16);.      
1cd60 20 20 20 20 20 20 20 20 20 20 4d 44 35 54 72 61            MD5Tra
1cd70 6e 73 66 6f 72 6d 28 63 74 78 2d 3e 62 75 66 2c  nsform(ctx->buf,
1cd80 20 28 75 69 6e 74 33 32 20 2a 29 63 74 78 2d 3e   (uint32 *)ctx->
1cd90 69 6e 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20  in);..          
1cda0 20 20 20 20 20 20 2f 2a 20 4e 6f 77 20 66 69 6c        /* Now fil
1cdb0 6c 20 74 68 65 20 6e 65 78 74 20 62 6c 6f 63 6b  l the next block
1cdc0 20 77 69 74 68 20 35 36 20 62 79 74 65 73 20 2a   with 56 bytes *
1cdd0 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
1cde0 20 20 6d 65 6d 73 65 74 28 63 74 78 2d 3e 69 6e    memset(ctx->in
1cdf0 2c 20 30 2c 20 35 36 29 3b 0a 20 20 20 20 20 20  , 0, 56);.      
1ce00 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
1ce10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
1ce20 64 20 62 6c 6f 63 6b 20 74 6f 20 35 36 20 62 79  d block to 56 by
1ce30 74 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  tes */.         
1ce40 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 2c         memset(p,
1ce50 20 30 2c 20 63 6f 75 6e 74 2d 38 29 3b 0a 20 20   0, count-8);.  
1ce60 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1ce70 62 79 74 65 52 65 76 65 72 73 65 28 63 74 78 2d  byteReverse(ctx-
1ce80 3e 69 6e 2c 20 31 34 29 3b 0a 0a 20 20 20 20 20  >in, 14);..     
1ce90 20 20 20 2f 2a 20 41 70 70 65 6e 64 20 6c 65 6e     /* Append len
1cea0 67 74 68 20 69 6e 20 62 69 74 73 20 61 6e 64 20  gth in bits and 
1ceb0 74 72 61 6e 73 66 6f 72 6d 20 2a 2f 0a 20 20 20  transform */.   
1cec0 20 20 20 20 20 6d 65 6d 63 70 79 28 63 74 78 2d       memcpy(ctx-
1ced0 3e 69 6e 20 2b 20 31 34 2a 34 2c 20 63 74 78 2d  >in + 14*4, ctx-
1cee0 3e 62 69 74 73 2c 20 38 29 3b 0a 0a 20 20 20 20  >bits, 8);..    
1cef0 20 20 20 20 4d 44 35 54 72 61 6e 73 66 6f 72 6d      MD5Transform
1cf00 28 63 74 78 2d 3e 62 75 66 2c 20 28 75 69 6e 74  (ctx->buf, (uint
1cf10 33 32 20 2a 29 63 74 78 2d 3e 69 6e 29 3b 0a 20  32 *)ctx->in);. 
1cf20 20 20 20 20 20 20 20 62 79 74 65 52 65 76 65 72         byteRever
1cf30 73 65 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61  se((unsigned cha
1cf40 72 20 2a 29 63 74 78 2d 3e 62 75 66 2c 20 34 29  r *)ctx->buf, 4)
1cf50 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  ;.        memcpy
1cf60 28 64 69 67 65 73 74 2c 20 63 74 78 2d 3e 62 75  (digest, ctx->bu
1cf70 66 2c 20 31 36 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  f, 16);.}../*.**
1cf80 20 43 6f 6e 76 65 72 74 20 61 20 31 32 38 2d 62   Convert a 128-b
1cf90 69 74 20 4d 44 35 20 64 69 67 65 73 74 20 69 6e  it MD5 digest in
1cfa0 74 6f 20 61 20 33 32 2d 64 69 67 69 74 20 62 61  to a 32-digit ba
1cfb0 73 65 2d 31 36 20 6e 75 6d 62 65 72 2e 0a 2a 2f  se-16 number..*/
1cfc0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 4d 44 35  .static void MD5
1cfd0 44 69 67 65 73 74 54 6f 42 61 73 65 31 36 28 75  DigestToBase16(u
1cfe0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 69  nsigned char *di
1cff0 67 65 73 74 2c 20 63 68 61 72 20 2a 7a 42 75 66  gest, char *zBuf
1d000 29 7b 0a 20 20 73 74 61 74 69 63 20 63 68 61 72  ){.  static char
1d010 20 63 6f 6e 73 74 20 7a 45 6e 63 6f 64 65 5b 5d   const zEncode[]
1d020 20 3d 20 22 30 31 32 33 34 35 36 37 38 39 61 62   = "0123456789ab
1d030 63 64 65 66 22 3b 0a 20 20 69 6e 74 20 69 2c 20  cdef";.  int i, 
1d040 6a 3b 0a 0a 20 20 66 6f 72 28 6a 3d 69 3d 30 3b  j;..  for(j=i=0;
1d050 20 69 3c 31 36 3b 20 69 2b 2b 29 7b 0a 20 20 20   i<16; i++){.   
1d060 20 69 6e 74 20 61 20 3d 20 64 69 67 65 73 74 5b   int a = digest[
1d070 69 5d 3b 0a 20 20 20 20 7a 42 75 66 5b 6a 2b 2b  i];.    zBuf[j++
1d080 5d 20 3d 20 7a 45 6e 63 6f 64 65 5b 28 61 3e 3e  ] = zEncode[(a>>
1d090 34 29 26 30 78 66 5d 3b 0a 20 20 20 20 7a 42 75  4)&0xf];.    zBu
1d0a0 66 5b 6a 2b 2b 5d 20 3d 20 7a 45 6e 63 6f 64 65  f[j++] = zEncode
1d0b0 5b 61 20 26 20 30 78 66 5d 3b 0a 20 20 7d 0a 20  [a & 0xf];.  }. 
1d0c0 20 7a 42 75 66 5b 6a 5d 20 3d 20 30 3b 0a 7d 0a   zBuf[j] = 0;.}.
1d0d0 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20  ../*.** Convert 
1d0e0 61 20 31 32 38 2d 62 69 74 20 4d 44 35 20 64 69  a 128-bit MD5 di
1d0f0 67 65 73 74 20 69 6e 74 6f 20 73 65 71 75 65 6e  gest into sequen
1d100 63 79 20 6f 66 20 65 69 67 68 74 20 35 2d 64 69  cy of eight 5-di
1d110 67 69 74 20 69 6e 74 65 67 65 72 73 0a 2a 2a 20  git integers.** 
1d120 65 61 63 68 20 72 65 70 72 65 73 65 6e 74 69 6e  each representin
1d130 67 20 31 36 20 62 69 74 73 20 6f 66 20 74 68 65  g 16 bits of the
1d140 20 64 69 67 65 73 74 20 61 6e 64 20 73 65 70 61   digest and sepa
1d150 72 61 74 65 64 20 66 72 6f 6d 20 65 61 63 68 0a  rated from each.
1d160 2a 2a 20 6f 74 68 65 72 20 62 79 20 61 20 22 2d  ** other by a "-
1d170 22 20 63 68 61 72 61 63 74 65 72 2e 0a 2a 2f 0a  " character..*/.
1d180 73 74 61 74 69 63 20 76 6f 69 64 20 4d 44 35 44  static void MD5D
1d190 69 67 65 73 74 54 6f 42 61 73 65 31 30 78 38 28  igestToBase10x8(
1d1a0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 64 69  unsigned char di
1d1b0 67 65 73 74 5b 31 36 5d 2c 20 63 68 61 72 20 7a  gest[16], char z
1d1c0 44 69 67 65 73 74 5b 35 30 5d 29 7b 0a 20 20 69  Digest[50]){.  i
1d1d0 6e 74 20 69 2c 20 6a 3b 0a 20 20 75 6e 73 69 67  nt i, j;.  unsig
1d1e0 6e 65 64 20 69 6e 74 20 78 3b 0a 20 20 66 6f 72  ned int x;.  for
1d1f0 28 69 3d 6a 3d 30 3b 20 69 3c 31 36 3b 20 69 2b  (i=j=0; i<16; i+
1d200 3d 32 29 7b 0a 20 20 20 20 78 20 3d 20 64 69 67  =2){.    x = dig
1d210 65 73 74 5b 69 5d 2a 32 35 36 20 2b 20 64 69 67  est[i]*256 + dig
1d220 65 73 74 5b 69 2b 31 5d 3b 0a 20 20 20 20 69 66  est[i+1];.    if
1d230 28 20 69 3e 30 20 29 20 7a 44 69 67 65 73 74 5b  ( i>0 ) zDigest[
1d240 6a 2b 2b 5d 20 3d 20 27 2d 27 3b 0a 20 20 20 20  j++] = '-';.    
1d250 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
1d260 28 35 30 2d 6a 2c 20 26 7a 44 69 67 65 73 74 5b  (50-j, &zDigest[
1d270 6a 5d 2c 20 22 25 30 35 75 22 2c 20 78 29 3b 0a  j], "%05u", x);.
1d280 20 20 20 20 6a 20 2b 3d 20 35 3b 0a 20 20 7d 0a      j += 5;.  }.
1d290 20 20 7a 44 69 67 65 73 74 5b 6a 5d 20 3d 20 30    zDigest[j] = 0
1d2a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 54 43 4c  ;.}../*.** A TCL
1d2b0 20 63 6f 6d 6d 61 6e 64 20 66 6f 72 20 6d 64 35   command for md5
1d2c0 2e 20 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20  .  The argument 
1d2d0 69 73 20 74 68 65 20 74 65 78 74 20 74 6f 20 62  is the text to b
1d2e0 65 20 68 61 73 68 65 64 2e 20 20 54 68 65 0a 2a  e hashed.  The.*
1d2f0 2a 20 52 65 73 75 6c 74 20 69 73 20 74 68 65 20  * Result is the 
1d300 68 61 73 68 20 69 6e 20 62 61 73 65 36 34 2e 0a  hash in base64..
1d310 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 64  */.static int md
1d320 35 5f 63 6d 64 28 76 6f 69 64 2a 63 64 2c 20 54  5_cmd(void*cd, T
1d330 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
1d340 70 2c 20 69 6e 74 20 61 72 67 63 2c 20 63 6f 6e  p, int argc, con
1d350 73 74 20 63 68 61 72 20 2a 2a 61 72 67 76 29 7b  st char **argv){
1d360 0a 20 20 4d 44 35 43 6f 6e 74 65 78 74 20 63 74  .  MD5Context ct
1d370 78 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  x;.  unsigned ch
1d380 61 72 20 64 69 67 65 73 74 5b 31 36 5d 3b 0a 20  ar digest[16];. 
1d390 20 63 68 61 72 20 7a 42 75 66 5b 35 30 5d 3b 0a   char zBuf[50];.
1d3a0 20 20 76 6f 69 64 20 28 2a 63 6f 6e 76 65 72 74    void (*convert
1d3b0 65 72 29 28 75 6e 73 69 67 6e 65 64 20 63 68 61  er)(unsigned cha
1d3c0 72 2a 2c 20 63 68 61 72 2a 29 3b 0a 0a 20 20 69  r*, char*);..  i
1d3d0 66 28 20 61 72 67 63 21 3d 32 20 29 7b 0a 20 20  f( argc!=2 ){.  
1d3e0 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
1d3f0 6c 74 28 69 6e 74 65 72 70 2c 22 77 72 6f 6e 67  lt(interp,"wrong
1d400 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
1d410 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c  be \"", argv[0],
1d420 0a 20 20 20 20 20 20 20 20 22 20 54 45 58 54 5c  .        " TEXT\
1d430 22 22 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20  "", (char*)0);. 
1d440 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
1d450 52 4f 52 3b 0a 20 20 7d 0a 20 20 4d 44 35 49 6e  ROR;.  }.  MD5In
1d460 69 74 28 26 63 74 78 29 3b 0a 20 20 4d 44 35 55  it(&ctx);.  MD5U
1d470 70 64 61 74 65 28 26 63 74 78 2c 20 28 75 6e 73  pdate(&ctx, (uns
1d480 69 67 6e 65 64 20 63 68 61 72 2a 29 61 72 67 76  igned char*)argv
1d490 5b 31 5d 2c 20 28 75 6e 73 69 67 6e 65 64 29 73  [1], (unsigned)s
1d4a0 74 72 6c 65 6e 28 61 72 67 76 5b 31 5d 29 29 3b  trlen(argv[1]));
1d4b0 0a 20 20 4d 44 35 46 69 6e 61 6c 28 64 69 67 65  .  MD5Final(dige
1d4c0 73 74 2c 20 26 63 74 78 29 3b 0a 20 20 63 6f 6e  st, &ctx);.  con
1d4d0 76 65 72 74 65 72 20 3d 20 28 76 6f 69 64 28 2a  verter = (void(*
1d4e0 29 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a  )(unsigned char*
1d4f0 2c 63 68 61 72 2a 29 29 63 64 3b 0a 20 20 63 6f  ,char*))cd;.  co
1d500 6e 76 65 72 74 65 72 28 64 69 67 65 73 74 2c 20  nverter(digest, 
1d510 7a 42 75 66 29 3b 0a 20 20 54 63 6c 5f 41 70 70  zBuf);.  Tcl_App
1d520 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
1d530 2c 20 7a 42 75 66 2c 20 28 63 68 61 72 2a 29 30  , zBuf, (char*)0
1d540 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
1d550 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 54  OK;.}../*.** A T
1d560 43 4c 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 74 61  CL command to ta
1d570 6b 65 20 74 68 65 20 6d 64 35 20 68 61 73 68 20  ke the md5 hash 
1d580 6f 66 20 61 20 66 69 6c 65 2e 20 20 54 68 65 20  of a file.  The 
1d590 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 0a  argument is the.
1d5a0 2a 2a 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 66  ** name of the f
1d5b0 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
1d5c0 6e 74 20 6d 64 35 66 69 6c 65 5f 63 6d 64 28 76  nt md5file_cmd(v
1d5d0 6f 69 64 2a 63 64 2c 20 54 63 6c 5f 49 6e 74 65  oid*cd, Tcl_Inte
1d5e0 72 70 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 61  rp*interp, int a
1d5f0 72 67 63 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  rgc, const char 
1d600 2a 2a 61 72 67 76 29 7b 0a 20 20 46 49 4c 45 20  **argv){.  FILE 
1d610 2a 69 6e 3b 0a 20 20 4d 44 35 43 6f 6e 74 65 78  *in;.  MD5Contex
1d620 74 20 63 74 78 3b 0a 20 20 76 6f 69 64 20 28 2a  t ctx;.  void (*
1d630 63 6f 6e 76 65 72 74 65 72 29 28 75 6e 73 69 67  converter)(unsig
1d640 6e 65 64 20 63 68 61 72 2a 2c 20 63 68 61 72 2a  ned char*, char*
1d650 29 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  );.  unsigned ch
1d660 61 72 20 64 69 67 65 73 74 5b 31 36 5d 3b 0a 20  ar digest[16];. 
1d670 20 63 68 61 72 20 7a 42 75 66 5b 31 30 32 34 30   char zBuf[10240
1d680 5d 3b 0a 0a 20 20 69 66 28 20 61 72 67 63 21 3d  ];..  if( argc!=
1d690 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  2 ){.    Tcl_App
1d6a0 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
1d6b0 2c 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20  ,"wrong # args: 
1d6c0 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61  should be \"", a
1d6d0 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 20  rgv[0],.        
1d6e0 22 20 46 49 4c 45 4e 41 4d 45 5c 22 22 2c 20 28  " FILENAME\"", (
1d6f0 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 72 65  char*)0);.    re
1d700 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1d710 20 20 7d 0a 20 20 69 6e 20 3d 20 66 6f 70 65 6e    }.  in = fopen
1d720 28 61 72 67 76 5b 31 5d 2c 22 72 62 22 29 3b 0a  (argv[1],"rb");.
1d730 20 20 69 66 28 20 69 6e 3d 3d 30 20 29 7b 0a 20    if( in==0 ){. 
1d740 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
1d750 75 6c 74 28 69 6e 74 65 72 70 2c 22 75 6e 61 62  ult(interp,"unab
1d760 6c 65 20 74 6f 20 6f 70 65 6e 20 66 69 6c 65 20  le to open file 
1d770 5c 22 22 2c 20 61 72 67 76 5b 31 5d 2c 0a 20 20  \"", argv[1],.  
1d780 20 20 20 20 20 20 20 22 5c 22 20 66 6f 72 20 72         "\" for r
1d790 65 61 64 69 6e 67 22 2c 20 28 63 68 61 72 2a 29  eading", (char*)
1d7a0 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
1d7b0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
1d7c0 4d 44 35 49 6e 69 74 28 26 63 74 78 29 3b 0a 20  MD5Init(&ctx);. 
1d7d0 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 69 6e   for(;;){.    in
1d7e0 74 20 6e 3b 0a 20 20 20 20 6e 20 3d 20 28 69 6e  t n;.    n = (in
1d7f0 74 29 66 72 65 61 64 28 7a 42 75 66 2c 20 31 2c  t)fread(zBuf, 1,
1d800 20 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c 20 69   sizeof(zBuf), i
1d810 6e 29 3b 0a 20 20 20 20 69 66 28 20 6e 3c 3d 30  n);.    if( n<=0
1d820 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 4d 44   ) break;.    MD
1d830 35 55 70 64 61 74 65 28 26 63 74 78 2c 20 28 75  5Update(&ctx, (u
1d840 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 7a 42  nsigned char*)zB
1d850 75 66 2c 20 28 75 6e 73 69 67 6e 65 64 29 6e 29  uf, (unsigned)n)
1d860 3b 0a 20 20 7d 0a 20 20 66 63 6c 6f 73 65 28 69  ;.  }.  fclose(i
1d870 6e 29 3b 0a 20 20 4d 44 35 46 69 6e 61 6c 28 64  n);.  MD5Final(d
1d880 69 67 65 73 74 2c 20 26 63 74 78 29 3b 0a 20 20  igest, &ctx);.  
1d890 63 6f 6e 76 65 72 74 65 72 20 3d 20 28 76 6f 69  converter = (voi
1d8a0 64 28 2a 29 28 75 6e 73 69 67 6e 65 64 20 63 68  d(*)(unsigned ch
1d8b0 61 72 2a 2c 63 68 61 72 2a 29 29 63 64 3b 0a 20  ar*,char*))cd;. 
1d8c0 20 63 6f 6e 76 65 72 74 65 72 28 64 69 67 65 73   converter(diges
1d8d0 74 2c 20 7a 42 75 66 29 3b 0a 20 20 54 63 6c 5f  t, zBuf);.  Tcl_
1d8e0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
1d8f0 65 72 70 2c 20 7a 42 75 66 2c 20 28 63 68 61 72  erp, zBuf, (char
1d900 2a 29 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  *)0);.  return T
1d910 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
1d920 52 65 67 69 73 74 65 72 20 74 68 65 20 66 6f 75  Register the fou
1d930 72 20 6e 65 77 20 54 43 4c 20 63 6f 6d 6d 61 6e  r new TCL comman
1d940 64 73 20 66 6f 72 20 67 65 6e 65 72 61 74 69 6e  ds for generatin
1d950 67 20 4d 44 35 20 63 68 65 63 6b 73 75 6d 73 0a  g MD5 checksums.
1d960 2a 2a 20 77 69 74 68 20 74 68 65 20 54 43 4c 20  ** with the TCL 
1d970 69 6e 74 65 72 70 72 65 74 65 72 2e 0a 2a 2f 0a  interpreter..*/.
1d980 69 6e 74 20 4d 64 35 5f 49 6e 69 74 28 54 63 6c  int Md5_Init(Tcl
1d990 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29  _Interp *interp)
1d9a0 7b 0a 20 20 54 63 6c 5f 43 72 65 61 74 65 43 6f  {.  Tcl_CreateCo
1d9b0 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 6d  mmand(interp, "m
1d9c0 64 35 22 2c 20 28 54 63 6c 5f 43 6d 64 50 72 6f  d5", (Tcl_CmdPro
1d9d0 63 2a 29 6d 64 35 5f 63 6d 64 2c 0a 20 20 20 20  c*)md5_cmd,.    
1d9e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d9f0 4d 44 35 44 69 67 65 73 74 54 6f 42 61 73 65 31  MD5DigestToBase1
1da00 36 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 43 72 65  6, 0);.  Tcl_Cre
1da10 61 74 65 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72  ateCommand(inter
1da20 70 2c 20 22 6d 64 35 2d 31 30 78 38 22 2c 20 28  p, "md5-10x8", (
1da30 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 6d 64 35  Tcl_CmdProc*)md5
1da40 5f 63 6d 64 2c 0a 20 20 20 20 20 20 20 20 20 20  _cmd,.          
1da50 20 20 20 20 20 20 20 20 20 20 4d 44 35 44 69 67            MD5Dig
1da60 65 73 74 54 6f 42 61 73 65 31 30 78 38 2c 20 30  estToBase10x8, 0
1da70 29 3b 0a 20 20 54 63 6c 5f 43 72 65 61 74 65 43  );.  Tcl_CreateC
1da80 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22  ommand(interp, "
1da90 6d 64 35 66 69 6c 65 22 2c 20 28 54 63 6c 5f 43  md5file", (Tcl_C
1daa0 6d 64 50 72 6f 63 2a 29 6d 64 35 66 69 6c 65 5f  mdProc*)md5file_
1dab0 63 6d 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20  cmd,.           
1dac0 20 20 20 20 20 20 20 20 20 4d 44 35 44 69 67 65           MD5Dige
1dad0 73 74 54 6f 42 61 73 65 31 36 2c 20 30 29 3b 0a  stToBase16, 0);.
1dae0 20 20 54 63 6c 5f 43 72 65 61 74 65 43 6f 6d 6d    Tcl_CreateComm
1daf0 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 6d 64 35  and(interp, "md5
1db00 66 69 6c 65 2d 31 30 78 38 22 2c 20 28 54 63 6c  file-10x8", (Tcl
1db10 5f 43 6d 64 50 72 6f 63 2a 29 6d 64 35 66 69 6c  _CmdProc*)md5fil
1db20 65 5f 63 6d 64 2c 0a 20 20 20 20 20 20 20 20 20  e_cmd,.         
1db30 20 20 20 20 20 20 20 20 20 20 20 4d 44 35 44 69             MD5Di
1db40 67 65 73 74 54 6f 42 61 73 65 31 30 78 38 2c 20  gestToBase10x8, 
1db50 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  0);.  return TCL
1db60 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  _OK;.}.#endif /*
1db70 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
1db80 54 45 53 54 29 20 7c 7c 20 64 65 66 69 6e 65 64  TEST) || defined
1db90 28 53 51 4c 49 54 45 5f 54 43 4c 4d 44 35 29 20  (SQLITE_TCLMD5) 
1dba0 2a 2f 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  */..#if defined(
1dbb0 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 2f 2a 0a  SQLITE_TEST)./*.
1dbc0 2a 2a 20 44 75 72 69 6e 67 20 74 65 73 74 69 6e  ** During testin
1dbd0 67 2c 20 74 68 65 20 73 70 65 63 69 61 6c 20 6d  g, the special m
1dbe0 64 35 73 75 6d 28 29 20 61 67 67 72 65 67 61 74  d5sum() aggregat
1dbf0 65 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 76  e function is av
1dc00 61 69 6c 61 62 6c 65 2e 0a 2a 2a 20 69 6e 73 69  ailable..** insi
1dc10 64 65 20 53 51 4c 69 74 65 2e 20 20 54 68 65 20  de SQLite.  The 
1dc20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e  following routin
1dc30 65 73 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 61  es implement tha
1dc40 74 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  t function..*/.s
1dc50 74 61 74 69 63 20 76 6f 69 64 20 6d 64 35 73 74  tatic void md5st
1dc60 65 70 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  ep(sqlite3_conte
1dc70 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 69 6e 74  xt *context, int
1dc80 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76   argc, sqlite3_v
1dc90 61 6c 75 65 20 2a 2a 61 72 67 76 29 7b 0a 20 20  alue **argv){.  
1dca0 4d 44 35 43 6f 6e 74 65 78 74 20 2a 70 3b 0a 20  MD5Context *p;. 
1dcb0 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 61 72   int i;.  if( ar
1dcc0 67 63 3c 31 20 29 20 72 65 74 75 72 6e 3b 0a 20  gc<1 ) return;. 
1dcd0 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 61 67 67   p = sqlite3_agg
1dce0 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 63  regate_context(c
1dcf0 6f 6e 74 65 78 74 2c 20 73 69 7a 65 6f 66 28 2a  ontext, sizeof(*
1dd00 70 29 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  p));.  if( p==0 
1dd10 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
1dd20 21 70 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20  !p->isInit ){.  
1dd30 20 20 4d 44 35 49 6e 69 74 28 70 29 3b 0a 20 20    MD5Init(p);.  
1dd40 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61  }.  for(i=0; i<a
1dd50 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63  rgc; i++){.    c
1dd60 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 61 74 61  onst char *zData
1dd70 20 3d 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65   = (char*)sqlite
1dd80 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
1dd90 76 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28 20 7a  v[i]);.    if( z
1dda0 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 4d 44  Data ){.      MD
1ddb0 35 55 70 64 61 74 65 28 70 2c 20 28 75 6e 73 69  5Update(p, (unsi
1ddc0 67 6e 65 64 20 63 68 61 72 2a 29 7a 44 61 74 61  gned char*)zData
1ddd0 2c 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 44  , (int)strlen(zD
1dde0 61 74 61 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ata));.    }.  }
1ddf0 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d  .}.static void m
1de00 64 35 66 69 6e 61 6c 69 7a 65 28 73 71 6c 69 74  d5finalize(sqlit
1de10 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  e3_context *cont
1de20 65 78 74 29 7b 0a 20 20 4d 44 35 43 6f 6e 74 65  ext){.  MD5Conte
1de30 78 74 20 2a 70 3b 0a 20 20 75 6e 73 69 67 6e 65  xt *p;.  unsigne
1de40 64 20 63 68 61 72 20 64 69 67 65 73 74 5b 31 36  d char digest[16
1de50 5d 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 33  ];.  char zBuf[3
1de60 33 5d 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65  3];.  p = sqlite
1de70 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74  3_aggregate_cont
1de80 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 73 69 7a  ext(context, siz
1de90 65 6f 66 28 2a 70 29 29 3b 0a 20 20 4d 44 35 46  eof(*p));.  MD5F
1dea0 69 6e 61 6c 28 64 69 67 65 73 74 2c 70 29 3b 0a  inal(digest,p);.
1deb0 20 20 4d 44 35 44 69 67 65 73 74 54 6f 42 61 73    MD5DigestToBas
1dec0 65 31 36 28 64 69 67 65 73 74 2c 20 7a 42 75 66  e16(digest, zBuf
1ded0 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73  );.  sqlite3_res
1dee0 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74  ult_text(context
1def0 2c 20 7a 42 75 66 2c 20 2d 31 2c 20 53 51 4c 49  , zBuf, -1, SQLI
1df00 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 7d  TE_TRANSIENT);.}
1df10 0a 69 6e 74 20 4d 64 35 5f 52 65 67 69 73 74 65  .int Md5_Registe
1df20 72 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  r(sqlite3 *db){.
1df30 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74    int rc = sqlit
1df40 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
1df50 6f 6e 28 64 62 2c 20 22 6d 64 35 73 75 6d 22 2c  on(db, "md5sum",
1df60 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38   -1, SQLITE_UTF8
1df70 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  , 0, 0,.        
1df80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1df90 20 20 20 20 20 20 20 20 20 6d 64 35 73 74 65 70           md5step
1dfa0 2c 20 6d 64 35 66 69 6e 61 6c 69 7a 65 29 3b 0a  , md5finalize);.
1dfb0 20 20 73 71 6c 69 74 65 33 5f 6f 76 65 72 6c 6f    sqlite3_overlo
1dfc0 61 64 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20  ad_function(db, 
1dfd0 22 6d 64 35 73 75 6d 22 2c 20 2d 31 29 3b 20 20  "md5sum", -1);  
1dfe0 2f 2a 20 54 6f 20 65 78 65 72 63 69 73 65 20 74  /* To exercise t
1dff0 68 69 73 20 41 50 49 20 2a 2f 0a 20 20 72 65 74  his API */.  ret
1e000 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
1e010 20 2f 2a 20 64 65 66 69 6e 65 64 28 53 51 4c 49   /* defined(SQLI
1e020 54 45 5f 54 45 53 54 29 20 2a 2f 0a 0a 0a 2f 2a  TE_TEST) */.../*
1e030 0a 2a 2a 20 49 66 20 74 68 65 20 6d 61 63 72 6f  .** If the macro
1e040 20 54 43 4c 53 48 20 69 73 20 6f 6e 65 2c 20 74   TCLSH is one, t
1e050 68 65 6e 20 70 75 74 20 69 6e 20 63 6f 64 65 20  hen put in code 
1e060 74 68 69 73 20 66 6f 72 20 74 68 65 0a 2a 2a 20  this for the.** 
1e070 22 6d 61 69 6e 22 20 72 6f 75 74 69 6e 65 20 74  "main" routine t
1e080 68 61 74 20 77 69 6c 6c 20 69 6e 69 74 69 61 6c  hat will initial
1e090 69 7a 65 20 54 63 6c 20 61 6e 64 20 74 61 6b 65  ize Tcl and take
1e0a0 20 69 6e 70 75 74 20 66 72 6f 6d 0a 2a 2a 20 73   input from.** s
1e0b0 74 61 6e 64 61 72 64 20 69 6e 70 75 74 2c 20 6f  tandard input, o
1e0c0 72 20 69 66 20 61 20 66 69 6c 65 20 69 73 20 6e  r if a file is n
1e0d0 61 6d 65 64 20 6f 6e 20 74 68 65 20 63 6f 6d 6d  amed on the comm
1e0e0 61 6e 64 20 6c 69 6e 65 0a 2a 2a 20 74 68 65 20  and line.** the 
1e0f0 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
1e100 72 65 61 64 73 20 61 6e 64 20 65 76 61 6c 75 61  reads and evalua
1e110 74 65 73 20 74 68 61 74 20 66 69 6c 65 2e 0a 2a  tes that file..*
1e120 2f 0a 23 69 66 20 54 43 4c 53 48 3d 3d 31 0a 73  /.#if TCLSH==1.s
1e130 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
1e140 20 2a 74 63 6c 73 68 5f 6d 61 69 6e 5f 6c 6f 6f   *tclsh_main_loo
1e150 70 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69  p(void){.  stati
1e160 63 20 63 6f 6e 73 74 20 63 68 61 72 20 7a 4d 61  c const char zMa
1e170 69 6e 6c 6f 6f 70 5b 5d 20 3d 0a 20 20 20 20 22  inloop[] =.    "
1e180 73 65 74 20 6c 69 6e 65 20 7b 7d 5c 6e 22 0a 20  set line {}\n". 
1e190 20 20 20 22 77 68 69 6c 65 20 7b 21 5b 65 6f 66     "while {![eof
1e1a0 20 73 74 64 69 6e 5d 7d 20 7b 5c 6e 22 0a 20 20   stdin]} {\n".  
1e1b0 20 20 20 20 22 69 66 20 7b 24 6c 69 6e 65 21 3d      "if {$line!=
1e1c0 5c 22 5c 22 7d 20 7b 5c 6e 22 0a 20 20 20 20 20  \"\"} {\n".     
1e1d0 20 20 20 22 70 75 74 73 20 2d 6e 6f 6e 65 77 6c     "puts -nonewl
1e1e0 69 6e 65 20 5c 22 3e 20 5c 22 5c 6e 22 0a 20 20  ine \"> \"\n".  
1e1f0 20 20 20 20 22 7d 20 65 6c 73 65 20 7b 5c 6e 22      "} else {\n"
1e200 0a 20 20 20 20 20 20 20 20 22 70 75 74 73 20 2d  .        "puts -
1e210 6e 6f 6e 65 77 6c 69 6e 65 20 5c 22 25 20 5c 22  nonewline \"% \"
1e220 5c 6e 22 0a 20 20 20 20 20 20 22 7d 5c 6e 22 0a  \n".      "}\n".
1e230 20 20 20 20 20 20 22 66 6c 75 73 68 20 73 74 64        "flush std
1e240 6f 75 74 5c 6e 22 0a 20 20 20 20 20 20 22 61 70  out\n".      "ap
1e250 70 65 6e 64 20 6c 69 6e 65 20 5b 67 65 74 73 20  pend line [gets 
1e260 73 74 64 69 6e 5d 5c 6e 22 0a 20 20 20 20 20 20  stdin]\n".      
1e270 22 69 66 20 7b 5b 69 6e 66 6f 20 63 6f 6d 70 6c  "if {[info compl
1e280 65 74 65 20 24 6c 69 6e 65 5d 7d 20 7b 5c 6e 22  ete $line]} {\n"
1e290 0a 20 20 20 20 20 20 20 20 22 69 66 20 7b 5b 63  .        "if {[c
1e2a0 61 74 63 68 20 7b 75 70 6c 65 76 65 6c 20 23 30  atch {uplevel #0
1e2b0 20 24 6c 69 6e 65 7d 20 72 65 73 75 6c 74 5d 7d   $line} result]}
1e2c0 20 7b 5c 6e 22 0a 20 20 20 20 20 20 20 20 20 20   {\n".          
1e2d0 22 70 75 74 73 20 73 74 64 65 72 72 20 5c 22 45  "puts stderr \"E
1e2e0 72 72 6f 72 3a 20 24 72 65 73 75 6c 74 5c 22 5c  rror: $result\"\
1e2f0 6e 22 0a 20 20 20 20 20 20 20 20 22 7d 20 65 6c  n".        "} el
1e300 73 65 69 66 20 7b 24 72 65 73 75 6c 74 21 3d 5c  seif {$result!=\
1e310 22 5c 22 7d 20 7b 5c 6e 22 0a 20 20 20 20 20 20  "\"} {\n".      
1e320 20 20 20 20 22 70 75 74 73 20 24 72 65 73 75 6c      "puts $resul
1e330 74 5c 6e 22 0a 20 20 20 20 20 20 20 20 22 7d 5c  t\n".        "}\
1e340 6e 22 0a 20 20 20 20 20 20 20 20 22 73 65 74 20  n".        "set 
1e350 6c 69 6e 65 20 7b 7d 5c 6e 22 0a 20 20 20 20 20  line {}\n".     
1e360 20 22 7d 20 65 6c 73 65 20 7b 5c 6e 22 0a 20 20   "} else {\n".  
1e370 20 20 20 20 20 20 22 61 70 70 65 6e 64 20 6c 69        "append li
1e380 6e 65 20 5c 5c 6e 5c 6e 22 0a 20 20 20 20 20 20  ne \\n\n".      
1e390 22 7d 5c 6e 22 0a 20 20 20 20 22 7d 5c 6e 22 0a  "}\n".    "}\n".
1e3a0 20 20 3b 0a 20 20 72 65 74 75 72 6e 20 7a 4d 61    ;.  return zMa
1e3b0 69 6e 6c 6f 6f 70 3b 0a 7d 0a 23 65 6e 64 69 66  inloop;.}.#endif
1e3c0 0a 23 69 66 20 54 43 4c 53 48 3d 3d 32 0a 73 74  .#if TCLSH==2.st
1e3d0 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
1e3e0 2a 74 63 6c 73 68 5f 6d 61 69 6e 5f 6c 6f 6f 70  *tclsh_main_loop
1e3f0 28 76 6f 69 64 29 3b 0a 23 65 6e 64 69 66 0a 0a  (void);.#endif..
1e400 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
1e410 53 54 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69  ST.static void i
1e420 6e 69 74 5f 61 6c 6c 28 54 63 6c 5f 49 6e 74 65  nit_all(Tcl_Inte
1e430 72 70 20 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e  rp *);.static in
1e440 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20  t SQLITE_TCLAPI 
1e450 69 6e 69 74 5f 61 6c 6c 5f 63 6d 64 28 0a 20 20  init_all_cmd(.  
1e460 43 6c 69 65 6e 74 44 61 74 61 20 63 64 2c 0a 20  ClientData cd,. 
1e470 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
1e480 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
1e490 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
1e4a0 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 0a 20 20 54  T objv[].){..  T
1e4b0 63 6c 5f 49 6e 74 65 72 70 20 2a 73 6c 61 76 65  cl_Interp *slave
1e4c0 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20  ;.  if( objc!=2 
1e4d0 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
1e4e0 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
1e4f0 31 2c 20 6f 62 6a 76 2c 20 22 53 4c 41 56 45 22  1, objv, "SLAVE"
1e500 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
1e510 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
1e520 73 6c 61 76 65 20 3d 20 54 63 6c 5f 47 65 74 53  slave = Tcl_GetS
1e530 6c 61 76 65 28 69 6e 74 65 72 70 2c 20 54 63 6c  lave(interp, Tcl
1e540 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
1e550 31 5d 29 29 3b 0a 20 20 69 66 28 20 21 73 6c 61  1]));.  if( !sla
1e560 76 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ve ){.    return
1e570 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
1e580 0a 20 20 69 6e 69 74 5f 61 6c 6c 28 73 6c 61 76  .  init_all(slav
1e590 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  e);.  return TCL
1e5a0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 63  _OK;.}../*.** Tc
1e5b0 6c 63 6d 64 3a 20 64 62 5f 75 73 65 5f 6c 65 67  lcmd: db_use_leg
1e5c0 61 63 79 5f 70 72 65 70 61 72 65 20 44 42 20 42  acy_prepare DB B
1e5d0 4f 4f 4c 45 41 4e 0a 2a 2a 0a 2a 2a 20 20 20 54  OOLEAN.**.**   T
1e5e0 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
1e5f0 74 20 74 6f 20 74 68 69 73 20 63 6f 6d 6d 61 6e  t to this comman
1e600 64 20 6d 75 73 74 20 62 65 20 61 20 64 61 74 61  d must be a data
1e610 62 61 73 65 20 63 6f 6d 6d 61 6e 64 20 63 72 65  base command cre
1e620 61 74 65 64 20 62 79 0a 2a 2a 20 20 20 5b 73 71  ated by.**   [sq
1e630 6c 69 74 65 33 5d 2e 20 49 66 20 74 68 65 20 73  lite3]. If the s
1e640 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69  econd argument i
1e650 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65  s true, then the
1e660 20 68 61 6e 64 6c 65 20 69 73 20 63 6f 6e 66 69   handle is confi
1e670 67 75 72 65 64 0a 2a 2a 20 20 20 74 6f 20 75 73  gured.**   to us
1e680 65 20 74 68 65 20 73 71 6c 69 74 65 33 5f 70 72  e the sqlite3_pr
1e690 65 70 61 72 65 5f 76 32 28 29 20 66 75 6e 63 74  epare_v2() funct
1e6a0 69 6f 6e 20 74 6f 20 70 72 65 70 61 72 65 20 73  ion to prepare s
1e6b0 74 61 74 65 6d 65 6e 74 73 2e 20 49 66 20 69 74  tatements. If it
1e6c0 0a 2a 2a 20 20 20 69 73 20 66 61 6c 73 65 2c 20  .**   is false, 
1e6d0 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28  sqlite3_prepare(
1e6e0 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
1e6f0 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 64   SQLITE_TCLAPI d
1e700 62 5f 75 73 65 5f 6c 65 67 61 63 79 5f 70 72 65  b_use_legacy_pre
1e710 70 61 72 65 5f 63 6d 64 28 0a 20 20 43 6c 69 65  pare_cmd(.  Clie
1e720 6e 74 44 61 74 61 20 63 64 2c 0a 20 20 54 63 6c  ntData cd,.  Tcl
1e730 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
1e740 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
1e750 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
1e760 6a 76 5b 5d 0a 29 7b 0a 20 20 54 63 6c 5f 43 6d  jv[].){.  Tcl_Cm
1e770 64 49 6e 66 6f 20 63 6d 64 49 6e 66 6f 3b 0a 20  dInfo cmdInfo;. 
1e780 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 3b 0a   SqliteDb *pDb;.
1e790 20 20 69 6e 74 20 62 50 72 65 70 61 72 65 3b 0a    int bPrepare;.
1e7a0 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29  .  if( objc!=3 )
1e7b0 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
1e7c0 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
1e7d0 2c 20 6f 62 6a 76 2c 20 22 44 42 20 42 4f 4f 4c  , objv, "DB BOOL
1e7e0 45 41 4e 22 29 3b 0a 20 20 20 20 72 65 74 75 72  EAN");.    retur
1e7f0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
1e800 0a 0a 20 20 69 66 28 20 21 54 63 6c 5f 47 65 74  ..  if( !Tcl_Get
1e810 43 6f 6d 6d 61 6e 64 49 6e 66 6f 28 69 6e 74 65  CommandInfo(inte
1e820 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
1e830 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 63 6d 64  g(objv[1]), &cmd
1e840 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20 54 63 6c  Info) ){.    Tcl
1e850 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
1e860 74 65 72 70 2c 20 22 6e 6f 20 73 75 63 68 20 64  terp, "no such d
1e870 62 3a 20 22 2c 20 54 63 6c 5f 47 65 74 53 74 72  b: ", Tcl_GetStr
1e880 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 28 63  ing(objv[1]), (c
1e890 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 72 65 74  har*)0);.    ret
1e8a0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1e8b0 20 7d 0a 20 20 70 44 62 20 3d 20 28 53 71 6c 69   }.  pDb = (Sqli
1e8c0 74 65 44 62 2a 29 63 6d 64 49 6e 66 6f 2e 6f 62  teDb*)cmdInfo.ob
1e8d0 6a 43 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20 69  jClientData;.  i
1e8e0 66 28 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61  f( Tcl_GetBoolea
1e8f0 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  nFromObj(interp,
1e900 20 6f 62 6a 76 5b 32 5d 2c 20 26 62 50 72 65 70   objv[2], &bPrep
1e910 61 72 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75  are) ){.    retu
1e920 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1e930 7d 0a 0a 20 20 70 44 62 2d 3e 62 4c 65 67 61 63  }..  pDb->bLegac
1e940 79 50 72 65 70 61 72 65 20 3d 20 62 50 72 65 70  yPrepare = bPrep
1e950 61 72 65 3b 0a 0a 20 20 54 63 6c 5f 52 65 73 65  are;..  Tcl_Rese
1e960 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b  tResult(interp);
1e970 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
1e980 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 63 6c 63 6d  ;.}../*.** Tclcm
1e990 64 3a 20 64 62 5f 6c 61 73 74 5f 73 74 6d 74 5f  d: db_last_stmt_
1e9a0 70 74 72 20 44 42 0a 2a 2a 0a 2a 2a 20 20 20 49  ptr DB.**.**   I
1e9b0 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  f the statement 
1e9c0 63 61 63 68 65 20 61 73 73 6f 63 69 61 74 65 64  cache associated
1e9d0 20 77 69 74 68 20 64 61 74 61 62 61 73 65 20 44   with database D
1e9e0 42 20 69 73 20 6e 6f 74 20 65 6d 70 74 79 2c 0a  B is not empty,.
1e9f0 2a 2a 20 20 20 72 65 74 75 72 6e 20 74 68 65 20  **   return the 
1ea00 74 65 78 74 20 72 65 70 72 65 73 65 6e 74 61 74  text representat
1ea10 69 6f 6e 20 6f 66 20 74 68 65 20 6d 6f 73 74 20  ion of the most 
1ea20 72 65 63 65 6e 74 6c 79 20 75 73 65 64 20 73 74  recently used st
1ea30 61 74 65 6d 65 6e 74 0a 2a 2a 20 20 20 68 61 6e  atement.**   han
1ea40 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  dle..*/.static i
1ea50 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49  nt SQLITE_TCLAPI
1ea60 20 64 62 5f 6c 61 73 74 5f 73 74 6d 74 5f 70 74   db_last_stmt_pt
1ea70 72 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20  r(.  ClientData 
1ea80 63 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  cd,.  Tcl_Interp
1ea90 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
1eaa0 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
1eab0 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
1eac0 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71  .  extern int sq
1ead0 6c 69 74 65 33 54 65 73 74 4d 61 6b 65 50 6f 69  lite3TestMakePoi
1eae0 6e 74 65 72 53 74 72 28 54 63 6c 5f 49 6e 74 65  nterStr(Tcl_Inte
1eaf0 72 70 2a 2c 20 63 68 61 72 2a 2c 20 76 6f 69 64  rp*, char*, void
1eb00 2a 29 3b 0a 20 20 54 63 6c 5f 43 6d 64 49 6e 66  *);.  Tcl_CmdInf
1eb10 6f 20 63 6d 64 49 6e 66 6f 3b 0a 20 20 53 71 6c  o cmdInfo;.  Sql
1eb20 69 74 65 44 62 20 2a 70 44 62 3b 0a 20 20 73 71  iteDb *pDb;.  sq
1eb30 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
1eb40 74 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a 42  t = 0;.  char zB
1eb50 75 66 5b 31 30 30 5d 3b 0a 0a 20 20 69 66 28 20  uf[100];..  if( 
1eb60 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  objc!=2 ){.    T
1eb70 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
1eb80 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
1eb90 20 22 44 42 22 29 3b 0a 20 20 20 20 72 65 74 75   "DB");.    retu
1eba0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1ebb0 7d 0a 0a 20 20 69 66 28 20 21 54 63 6c 5f 47 65  }..  if( !Tcl_Ge
1ebc0 74 43 6f 6d 6d 61 6e 64 49 6e 66 6f 28 69 6e 74  tCommandInfo(int
1ebd0 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
1ebe0 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 63 6d  ng(objv[1]), &cm
1ebf0 64 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20 54 63  dInfo) ){.    Tc
1ec00 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
1ec10 6e 74 65 72 70 2c 20 22 6e 6f 20 73 75 63 68 20  nterp, "no such 
1ec20 64 62 3a 20 22 2c 20 54 63 6c 5f 47 65 74 53 74  db: ", Tcl_GetSt
1ec30 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 28  ring(objv[1]), (
1ec40 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 72 65  char*)0);.    re
1ec50 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1ec60 20 20 7d 0a 20 20 70 44 62 20 3d 20 28 53 71 6c    }.  pDb = (Sql
1ec70 69 74 65 44 62 2a 29 63 6d 64 49 6e 66 6f 2e 6f  iteDb*)cmdInfo.o
1ec80 62 6a 43 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20  bjClientData;.. 
1ec90 20 69 66 28 20 70 44 62 2d 3e 73 74 6d 74 4c 69   if( pDb->stmtLi
1eca0 73 74 20 29 20 70 53 74 6d 74 20 3d 20 70 44 62  st ) pStmt = pDb
1ecb0 2d 3e 73 74 6d 74 4c 69 73 74 2d 3e 70 53 74 6d  ->stmtList->pStm
1ecc0 74 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  t;.  if( sqlite3
1ecd0 54 65 73 74 4d 61 6b 65 50 6f 69 6e 74 65 72 53  TestMakePointerS
1ece0 74 72 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c  tr(interp, zBuf,
1ecf0 20 70 53 74 6d 74 29 20 29 7b 0a 20 20 20 20 72   pStmt) ){.    r
1ed00 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1ed10 0a 20 20 7d 0a 20 20 54 63 6c 5f 53 65 74 52 65  .  }.  Tcl_SetRe
1ed20 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75  sult(interp, zBu
1ed30 66 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29  f, TCL_VOLATILE)
1ed40 3b 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  ;..  return TCL_
1ed50 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  OK;.}.#endif /* 
1ed60 53 51 4c 49 54 45 5f 54 45 53 54 20 2a 2f 0a 0a  SQLITE_TEST */..
1ed70 2f 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 65 20  /*.** Configure 
1ed80 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 72 20  the interpreter 
1ed90 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69  passed as the fi
1eda0 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  rst argument to 
1edb0 68 61 76 65 20 61 63 63 65 73 73 0a 2a 2a 20 74  have access.** t
1edc0 6f 20 74 68 65 20 63 6f 6d 6d 61 6e 64 73 20 61  o the commands a
1edd0 6e 64 20 6c 69 6e 6b 65 64 20 76 61 72 69 61 62  nd linked variab
1ede0 6c 65 73 20 74 68 61 74 20 6d 61 6b 65 20 75 70  les that make up
1edf0 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 20  :.**.**   * the 
1ee00 5b 73 71 6c 69 74 65 33 5d 20 65 78 74 65 6e 73  [sqlite3] extens
1ee10 69 6f 6e 20 69 74 73 65 6c 66 2c 0a 2a 2a 0a 2a  ion itself,.**.*
1ee20 2a 20 20 20 2a 20 49 66 20 53 51 4c 49 54 45 5f  *   * If SQLITE_
1ee30 54 43 4c 4d 44 35 20 6f 72 20 53 51 4c 49 54 45  TCLMD5 or SQLITE
1ee40 5f 54 45 53 54 20 69 73 20 64 65 66 69 6e 65 64  _TEST is defined
1ee50 2c 20 74 68 65 20 4d 64 35 20 63 6f 6d 6d 61 6e  , the Md5 comman
1ee60 64 73 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20  ds, and.**.**   
1ee70 2a 20 49 66 20 53 51 4c 49 54 45 5f 54 45 53 54  * If SQLITE_TEST
1ee80 20 69 73 20 73 65 74 2c 20 74 68 65 20 76 61 72   is set, the var
1ee90 69 6f 75 73 20 74 65 73 74 20 69 6e 74 65 72 66  ious test interf
1eea0 61 63 65 73 20 75 73 65 64 20 62 79 20 74 68 65  aces used by the
1eeb0 20 54 63 6c 0a 2a 2a 20 20 20 20 20 74 65 73 74   Tcl.**     test
1eec0 20 73 75 69 74 65 2e 0a 2a 2f 0a 73 74 61 74 69   suite..*/.stati
1eed0 63 20 76 6f 69 64 20 69 6e 69 74 5f 61 6c 6c 28  c void init_all(
1eee0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
1eef0 72 70 29 7b 0a 20 20 53 71 6c 69 74 65 33 5f 49  rp){.  Sqlite3_I
1ef00 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 0a 23 69  nit(interp);..#i
1ef10 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
1ef20 5f 54 45 53 54 29 20 7c 7c 20 64 65 66 69 6e 65  _TEST) || define
1ef30 64 28 53 51 4c 49 54 45 5f 54 43 4c 4d 44 35 29  d(SQLITE_TCLMD5)
1ef40 0a 20 20 4d 64 35 5f 49 6e 69 74 28 69 6e 74 65  .  Md5_Init(inte
1ef50 72 70 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66  rp);.#endif..#if
1ef60 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
1ef70 20 20 7b 0a 20 20 20 20 65 78 74 65 72 6e 20 69    {.    extern i
1ef80 6e 74 20 53 71 6c 69 74 65 63 6f 6e 66 69 67 5f  nt Sqliteconfig_
1ef90 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a  Init(Tcl_Interp*
1efa0 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e  );.    extern in
1efb0 74 20 53 71 6c 69 74 65 74 65 73 74 31 5f 49 6e  t Sqlitetest1_In
1efc0 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b  it(Tcl_Interp*);
1efd0 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20  .    extern int 
1efe0 53 71 6c 69 74 65 74 65 73 74 32 5f 49 6e 69 74  Sqlitetest2_Init
1eff0 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20  (Tcl_Interp*);. 
1f000 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71     extern int Sq
1f010 6c 69 74 65 74 65 73 74 33 5f 49 6e 69 74 28 54  litetest3_Init(T
1f020 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20  cl_Interp*);.   
1f030 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69   extern int Sqli
1f040 74 65 74 65 73 74 34 5f 49 6e 69 74 28 54 63 6c  tetest4_Init(Tcl
1f050 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65  _Interp*);.    e
1f060 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65  xtern int Sqlite
1f070 74 65 73 74 35 5f 49 6e 69 74 28 54 63 6c 5f 49  test5_Init(Tcl_I
1f080 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74  nterp*);.    ext
1f090 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65  ern int Sqlitete
1f0a0 73 74 36 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74  st6_Init(Tcl_Int
1f0b0 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72  erp*);.    exter
1f0c0 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74  n int Sqlitetest
1f0d0 37 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  7_Init(Tcl_Inter
1f0e0 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20  p*);.    extern 
1f0f0 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 38 5f  int Sqlitetest8_
1f100 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a  Init(Tcl_Interp*
1f110 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e  );.    extern in
1f120 74 20 53 71 6c 69 74 65 74 65 73 74 39 5f 49 6e  t Sqlitetest9_In
1f130 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b  it(Tcl_Interp*);
1f140 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20  .    extern int 
1f150 53 71 6c 69 74 65 74 65 73 74 61 73 79 6e 63 5f  Sqlitetestasync_
1f160 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a  Init(Tcl_Interp*
1f170 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e  );.    extern in
1f180 74 20 53 71 6c 69 74 65 74 65 73 74 5f 61 75 74  t Sqlitetest_aut
1f190 6f 65 78 74 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  oext_Init(Tcl_In
1f1a0 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65  terp*);.    exte
1f1b0 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73  rn int Sqlitetes
1f1c0 74 5f 62 6c 6f 62 5f 49 6e 69 74 28 54 63 6c 5f  t_blob_Init(Tcl_
1f1d0 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78  Interp*);.    ex
1f1e0 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74  tern int Sqlitet
1f1f0 65 73 74 5f 64 65 6d 6f 76 66 73 5f 49 6e 69 74  est_demovfs_Init
1f200 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 29 3b 0a  (Tcl_Interp *);.
1f210 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53      extern int S
1f220 71 6c 69 74 65 74 65 73 74 5f 66 75 6e 63 5f 49  qlitetest_func_I
1f230 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29  nit(Tcl_Interp*)
1f240 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74  ;.    extern int
1f250 20 53 71 6c 69 74 65 74 65 73 74 5f 68 65 78 69   Sqlitetest_hexi
1f260 6f 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  o_Init(Tcl_Inter
1f270 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20  p*);.    extern 
1f280 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 5f 69  int Sqlitetest_i
1f290 6e 69 74 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74  nit_Init(Tcl_Int
1f2a0 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72  erp*);.    exter
1f2b0 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74  n int Sqlitetest
1f2c0 5f 6d 61 6c 6c 6f 63 5f 49 6e 69 74 28 54 63 6c  _malloc_Init(Tcl
1f2d0 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65  _Interp*);.    e
1f2e0 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65  xtern int Sqlite
1f2f0 74 65 73 74 5f 6d 75 74 65 78 5f 49 6e 69 74 28  test_mutex_Init(
1f300 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20  Tcl_Interp*);.  
1f310 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c    extern int Sql
1f320 69 74 65 74 65 73 74 73 63 68 65 6d 61 5f 49 6e  itetestschema_In
1f330 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b  it(Tcl_Interp*);
1f340 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20  .    extern int 
1f350 53 71 6c 69 74 65 74 65 73 74 73 73 65 5f 49 6e  Sqlitetestsse_In
1f360 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b  it(Tcl_Interp*);
1f370 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20  .    extern int 
1f380 53 71 6c 69 74 65 74 65 73 74 74 63 6c 76 61 72  Sqlitetesttclvar
1f390 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
1f3a0 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69  *);.    extern i
1f3b0 6e 74 20 53 71 6c 69 74 65 74 65 73 74 66 73 5f  nt Sqlitetestfs_
1f3c0 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a  Init(Tcl_Interp*
1f3d0 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e  );.    extern in
1f3e0 74 20 53 71 6c 69 74 65 74 65 73 74 54 68 72 65  t SqlitetestThre
1f3f0 61 64 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  ad_Init(Tcl_Inte
1f400 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e  rp*);.    extern
1f410 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 4f   int SqlitetestO
1f420 6e 65 66 69 6c 65 5f 49 6e 69 74 28 29 3b 0a 20  nefile_Init();. 
1f430 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71     extern int Sq
1f440 6c 69 74 65 74 65 73 74 4f 73 69 6e 73 74 5f 49  litetestOsinst_I
1f450 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29  nit(Tcl_Interp*)
1f460 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74  ;.    extern int
1f470 20 53 71 6c 69 74 65 74 65 73 74 62 61 63 6b 75   Sqlitetestbacku
1f480 70 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  p_Init(Tcl_Inter
1f490 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20  p*);.    extern 
1f4a0 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 69 6e  int Sqlitetestin
1f4b0 74 61 72 72 61 79 5f 49 6e 69 74 28 54 63 6c 5f  tarray_Init(Tcl_
1f4c0 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78  Interp*);.    ex
1f4d0 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74  tern int Sqlitet
1f4e0 65 73 74 76 66 73 5f 49 6e 69 74 28 54 63 6c 5f  estvfs_Init(Tcl_
1f4f0 49 6e 74 65 72 70 20 2a 29 3b 0a 20 20 20 20 65  Interp *);.    e
1f500 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65  xtern int Sqlite
1f510 74 65 73 74 72 74 72 65 65 5f 49 6e 69 74 28 54  testrtree_Init(T
1f520 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20  cl_Interp*);.   
1f530 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69   extern int Sqli
1f540 74 65 71 75 6f 74 61 5f 49 6e 69 74 28 54 63 6c  tequota_Init(Tcl
1f550 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65  _Interp*);.    e
1f560 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65  xtern int Sqlite
1f570 6d 75 6c 74 69 70 6c 65 78 5f 49 6e 69 74 28 54  multiplex_Init(T
1f580 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20  cl_Interp*);.   
1f590 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69   extern int Sqli
1f5a0 74 65 53 75 70 65 72 6c 6f 63 6b 5f 49 6e 69 74  teSuperlock_Init
1f5b0 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20  (Tcl_Interp*);. 
1f5c0 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71     extern int Sq
1f5d0 6c 69 74 65 74 65 73 74 53 79 73 63 61 6c 6c 5f  litetestSyscall_
1f5e0 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a  Init(Tcl_Interp*
1f5f0 29 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  );.#if defined(S
1f600 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45 53  QLITE_ENABLE_SES
1f610 53 49 4f 4e 29 20 26 26 20 64 65 66 69 6e 65 64  SION) && defined
1f620 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50  (SQLITE_ENABLE_P
1f630 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b 29 0a 20  REUPDATE_HOOK). 
1f640 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 54 65     extern int Te
1f650 73 74 53 65 73 73 69 6f 6e 5f 49 6e 69 74 28 54  stSession_Init(T
1f660 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 23 65 6e  cl_Interp*);.#en
1f670 64 69 66 0a 20 20 20 20 65 78 74 65 72 6e 20 69  dif.    extern i
1f680 6e 74 20 46 74 73 35 74 63 6c 5f 49 6e 69 74 28  nt Fts5tcl_Init(
1f690 54 63 6c 5f 49 6e 74 65 72 70 20 2a 29 3b 0a 20  Tcl_Interp *);. 
1f6a0 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71     extern int Sq
1f6b0 6c 69 74 65 52 62 75 5f 49 6e 69 74 28 54 63 6c  liteRbu_Init(Tcl
1f6c0 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65  _Interp*);.    e
1f6d0 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65  xtern int Sqlite
1f6e0 74 65 73 74 74 63 6c 5f 49 6e 69 74 28 54 63 6c  testtcl_Init(Tcl
1f6f0 5f 49 6e 74 65 72 70 2a 29 3b 0a 23 69 66 20 64  _Interp*);.#if d
1f700 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
1f710 41 42 4c 45 5f 46 54 53 33 29 20 7c 7c 20 64 65  ABLE_FTS3) || de
1f720 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
1f730 42 4c 45 5f 46 54 53 34 29 0a 20 20 20 20 65 78  BLE_FTS4).    ex
1f740 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74  tern int Sqlitet
1f750 65 73 74 66 74 73 33 5f 49 6e 69 74 28 54 63 6c  estfts3_Init(Tcl
1f760 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29  _Interp *interp)
1f770 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66  ;.#endif..#ifdef
1f780 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 5a   SQLITE_ENABLE_Z
1f790 49 50 56 46 53 0a 20 20 20 20 65 78 74 65 72 6e  IPVFS.    extern
1f7a0 20 69 6e 74 20 5a 69 70 76 66 73 5f 49 6e 69 74   int Zipvfs_Init
1f7b0 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20  (Tcl_Interp*);. 
1f7c0 20 20 20 5a 69 70 76 66 73 5f 49 6e 69 74 28 69     Zipvfs_Init(i
1f7d0 6e 74 65 72 70 29 3b 0a 23 65 6e 64 69 66 0a 0a  nterp);.#endif..
1f7e0 20 20 20 20 53 71 6c 69 74 65 63 6f 6e 66 69 67      Sqliteconfig
1f7f0 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20  _Init(interp);. 
1f800 20 20 20 53 71 6c 69 74 65 74 65 73 74 31 5f 49     Sqlitetest1_I
1f810 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20  nit(interp);.   
1f820 20 53 71 6c 69 74 65 74 65 73 74 32 5f 49 6e 69   Sqlitetest2_Ini
1f830 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53  t(interp);.    S
1f840 71 6c 69 74 65 74 65 73 74 33 5f 49 6e 69 74 28  qlitetest3_Init(
1f850 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c  interp);.    Sql
1f860 69 74 65 74 65 73 74 34 5f 49 6e 69 74 28 69 6e  itetest4_Init(in
1f870 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74  terp);.    Sqlit
1f880 65 74 65 73 74 35 5f 49 6e 69 74 28 69 6e 74 65  etest5_Init(inte
1f890 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74  rp);.    Sqlitet
1f8a0 65 73 74 36 5f 49 6e 69 74 28 69 6e 74 65 72 70  est6_Init(interp
1f8b0 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73  );.    Sqlitetes
1f8c0 74 37 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b  t7_Init(interp);
1f8d0 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 38  .    Sqlitetest8
1f8e0 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20  _Init(interp);. 
1f8f0 20 20 20 53 71 6c 69 74 65 74 65 73 74 39 5f 49     Sqlitetest9_I
1f900 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20  nit(interp);.   
1f910 20 53 71 6c 69 74 65 74 65 73 74 61 73 79 6e 63   Sqlitetestasync
1f920 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20  _Init(interp);. 
1f930 20 20 20 53 71 6c 69 74 65 74 65 73 74 5f 61 75     Sqlitetest_au
1f940 74 6f 65 78 74 5f 49 6e 69 74 28 69 6e 74 65 72  toext_Init(inter
1f950 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65  p);.    Sqlitete
1f960 73 74 5f 62 6c 6f 62 5f 49 6e 69 74 28 69 6e 74  st_blob_Init(int
1f970 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65  erp);.    Sqlite
1f980 74 65 73 74 5f 64 65 6d 6f 76 66 73 5f 49 6e 69  test_demovfs_Ini
1f990 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53  t(interp);.    S
1f9a0 71 6c 69 74 65 74 65 73 74 5f 66 75 6e 63 5f 49  qlitetest_func_I
1f9b0 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20  nit(interp);.   
1f9c0 20 53 71 6c 69 74 65 74 65 73 74 5f 68 65 78 69   Sqlitetest_hexi
1f9d0 6f 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a  o_Init(interp);.
1f9e0 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 5f 69      Sqlitetest_i
1f9f0 6e 69 74 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  nit_Init(interp)
1fa00 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74  ;.    Sqlitetest
1fa10 5f 6d 61 6c 6c 6f 63 5f 49 6e 69 74 28 69 6e 74  _malloc_Init(int
1fa20 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65  erp);.    Sqlite
1fa30 74 65 73 74 5f 6d 75 74 65 78 5f 49 6e 69 74 28  test_mutex_Init(
1fa40 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c  interp);.    Sql
1fa50 69 74 65 74 65 73 74 73 63 68 65 6d 61 5f 49 6e  itetestschema_In
1fa60 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  it(interp);.    
1fa70 53 71 6c 69 74 65 74 65 73 74 74 63 6c 76 61 72  Sqlitetesttclvar
1fa80 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20  _Init(interp);. 
1fa90 20 20 20 53 71 6c 69 74 65 74 65 73 74 66 73 5f     Sqlitetestfs_
1faa0 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  Init(interp);.  
1fab0 20 20 53 71 6c 69 74 65 74 65 73 74 54 68 72 65    SqlitetestThre
1fac0 61 64 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b  ad_Init(interp);
1fad0 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 4f  .    SqlitetestO
1fae0 6e 65 66 69 6c 65 5f 49 6e 69 74 28 29 3b 0a 20  nefile_Init();. 
1faf0 20 20 20 53 71 6c 69 74 65 74 65 73 74 4f 73 69     SqlitetestOsi
1fb00 6e 73 74 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  nst_Init(interp)
1fb10 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74  ;.    Sqlitetest
1fb20 62 61 63 6b 75 70 5f 49 6e 69 74 28 69 6e 74 65  backup_Init(inte
1fb30 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74  rp);.    Sqlitet
1fb40 65 73 74 69 6e 74 61 72 72 61 79 5f 49 6e 69 74  estintarray_Init
1fb50 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71  (interp);.    Sq
1fb60 6c 69 74 65 74 65 73 74 76 66 73 5f 49 6e 69 74  litetestvfs_Init
1fb70 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71  (interp);.    Sq
1fb80 6c 69 74 65 74 65 73 74 72 74 72 65 65 5f 49 6e  litetestrtree_In
1fb90 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  it(interp);.    
1fba0 53 71 6c 69 74 65 71 75 6f 74 61 5f 49 6e 69 74  Sqlitequota_Init
1fbb0 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71  (interp);.    Sq
1fbc0 6c 69 74 65 6d 75 6c 74 69 70 6c 65 78 5f 49 6e  litemultiplex_In
1fbd0 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  it(interp);.    
1fbe0 53 71 6c 69 74 65 53 75 70 65 72 6c 6f 63 6b 5f  SqliteSuperlock_
1fbf0 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  Init(interp);.  
1fc00 20 20 53 71 6c 69 74 65 74 65 73 74 53 79 73 63    SqlitetestSysc
1fc10 61 6c 6c 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  all_Init(interp)
1fc20 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ;.#if defined(SQ
1fc30 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45 53 53  LITE_ENABLE_SESS
1fc40 49 4f 4e 29 20 26 26 20 64 65 66 69 6e 65 64 28  ION) && defined(
1fc50 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52  SQLITE_ENABLE_PR
1fc60 45 55 50 44 41 54 45 5f 48 4f 4f 4b 29 0a 20 20  EUPDATE_HOOK).  
1fc70 20 20 54 65 73 74 53 65 73 73 69 6f 6e 5f 49 6e    TestSession_In
1fc80 69 74 28 69 6e 74 65 72 70 29 3b 0a 23 65 6e 64  it(interp);.#end
1fc90 69 66 0a 20 20 20 20 46 74 73 35 74 63 6c 5f 49  if.    Fts5tcl_I
1fca0 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20  nit(interp);.   
1fcb0 20 53 71 6c 69 74 65 52 62 75 5f 49 6e 69 74 28   SqliteRbu_Init(
1fcc0 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c  interp);.    Sql
1fcd0 69 74 65 74 65 73 74 74 63 6c 5f 49 6e 69 74 28  itetesttcl_Init(
1fce0 69 6e 74 65 72 70 29 3b 0a 0a 23 69 66 20 64 65  interp);..#if de
1fcf0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
1fd00 42 4c 45 5f 46 54 53 33 29 20 7c 7c 20 64 65 66  BLE_FTS3) || def
1fd10 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
1fd20 4c 45 5f 46 54 53 34 29 0a 20 20 20 20 53 71 6c  LE_FTS4).    Sql
1fd30 69 74 65 74 65 73 74 66 74 73 33 5f 49 6e 69 74  itetestfts3_Init
1fd40 28 69 6e 74 65 72 70 29 3b 0a 23 65 6e 64 69 66  (interp);.#endif
1fd50 0a 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65  ..    Tcl_Create
1fd60 4f 62 6a 43 6f 6d 6d 61 6e 64 28 0a 20 20 20 20  ObjCommand(.    
1fd70 20 20 20 20 69 6e 74 65 72 70 2c 20 22 6c 6f 61      interp, "loa
1fd80 64 5f 74 65 73 74 66 69 78 74 75 72 65 5f 65 78  d_testfixture_ex
1fd90 74 65 6e 73 69 6f 6e 73 22 2c 20 69 6e 69 74 5f  tensions", init_
1fda0 61 6c 6c 5f 63 6d 64 2c 20 30 2c 20 30 0a 20 20  all_cmd, 0, 0.  
1fdb0 20 20 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65    );.    Tcl_Cre
1fdc0 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 0a 20  ateObjCommand(. 
1fdd0 20 20 20 20 20 20 20 69 6e 74 65 72 70 2c 20 22         interp, "
1fde0 64 62 5f 75 73 65 5f 6c 65 67 61 63 79 5f 70 72  db_use_legacy_pr
1fdf0 65 70 61 72 65 22 2c 20 64 62 5f 75 73 65 5f 6c  epare", db_use_l
1fe00 65 67 61 63 79 5f 70 72 65 70 61 72 65 5f 63 6d  egacy_prepare_cm
1fe10 64 2c 20 30 2c 20 30 0a 20 20 20 20 29 3b 0a 20  d, 0, 0.    );. 
1fe20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a     Tcl_CreateObj
1fe30 43 6f 6d 6d 61 6e 64 28 0a 20 20 20 20 20 20 20  Command(.       
1fe40 20 69 6e 74 65 72 70 2c 20 22 64 62 5f 6c 61 73   interp, "db_las
1fe50 74 5f 73 74 6d 74 5f 70 74 72 22 2c 20 64 62 5f  t_stmt_ptr", db_
1fe60 6c 61 73 74 5f 73 74 6d 74 5f 70 74 72 2c 20 30  last_stmt_ptr, 0
1fe70 2c 20 30 0a 20 20 20 20 29 3b 0a 0a 23 69 66 64  , 0.    );..#ifd
1fe80 65 66 20 53 51 4c 49 54 45 5f 53 53 45 0a 20 20  ef SQLITE_SSE.  
1fe90 20 20 53 71 6c 69 74 65 74 65 73 74 73 73 65 5f    Sqlitetestsse_
1fea0 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 23 65  Init(interp);.#e
1feb0 6e 64 69 66 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ndif.  }.#endif.
1fec0 7d 0a 0a 2f 2a 20 4e 65 65 64 65 64 20 66 6f 72  }../* Needed for
1fed0 20 74 68 65 20 73 65 74 72 6c 69 6d 69 74 28 29   the setrlimit()
1fee0 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 6f 6e 20   system call on 
1fef0 75 6e 69 78 20 2a 2f 0a 23 69 66 20 64 65 66 69  unix */.#if defi
1ff00 6e 65 64 28 75 6e 69 78 29 0a 23 69 6e 63 6c 75  ned(unix).#inclu
1ff10 64 65 20 3c 73 79 73 2f 72 65 73 6f 75 72 63 65  de <sys/resource
1ff20 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66  .h>.#endif..#def
1ff30 69 6e 65 20 54 43 4c 53 48 5f 4d 41 49 4e 20 6d  ine TCLSH_MAIN m
1ff40 61 69 6e 20 20 20 2f 2a 20 4e 65 65 64 65 64 20  ain   /* Needed 
1ff50 74 6f 20 66 61 6b 65 20 6f 75 74 20 6d 6b 74 63  to fake out mktc
1ff60 6c 61 70 70 20 2a 2f 0a 69 6e 74 20 53 51 4c 49  lapp */.int SQLI
1ff70 54 45 5f 43 44 45 43 4c 20 54 43 4c 53 48 5f 4d  TE_CDECL TCLSH_M
1ff80 41 49 4e 28 69 6e 74 20 61 72 67 63 2c 20 63 68  AIN(int argc, ch
1ff90 61 72 20 2a 2a 61 72 67 76 29 7b 0a 20 20 54 63  ar **argv){.  Tc
1ffa0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
1ffb0 3b 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  ;..#if !defined(
1ffc0 5f 57 49 4e 33 32 5f 57 43 45 29 0a 20 20 69 66  _WIN32_WCE).  if
1ffd0 28 20 67 65 74 65 6e 76 28 22 42 52 45 41 4b 22  ( getenv("BREAK"
1ffe0 29 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66  ) ){.    fprintf
1fff0 28 73 74 64 65 72 72 2c 0a 20 20 20 20 20 20 20  (stderr,.       
20000 20 22 61 74 74 61 63 68 20 64 65 62 75 67 67 65   "attach debugge
20010 72 20 74 6f 20 70 72 6f 63 65 73 73 20 25 64 20  r to process %d 
20020 61 6e 64 20 70 72 65 73 73 20 61 6e 79 20 6b 65  and press any ke
20030 79 20 74 6f 20 63 6f 6e 74 69 6e 75 65 2e 5c 6e  y to continue.\n
20040 22 2c 0a 20 20 20 20 20 20 20 20 47 45 54 50 49  ",.        GETPI
20050 44 28 29 29 3b 0a 20 20 20 20 66 67 65 74 63 28  D());.    fgetc(
20060 73 74 64 69 6e 29 3b 0a 20 20 7d 0a 23 65 6e 64  stdin);.  }.#end
20070 69 66 0a 0a 20 20 2f 2a 20 53 69 6e 63 65 20 74  if..  /* Since t
20080 68 65 20 70 72 69 6d 61 72 79 20 75 73 65 20 63  he primary use c
20090 61 73 65 20 66 6f 72 20 74 68 69 73 20 62 69 6e  ase for this bin
200a0 61 72 79 20 69 73 20 74 65 73 74 69 6e 67 20 6f  ary is testing o
200b0 66 20 53 51 4c 69 74 65 2c 0a 20 20 2a 2a 20 62  f SQLite,.  ** b
200c0 65 20 73 75 72 65 20 74 6f 20 67 65 6e 65 72 61  e sure to genera
200d0 74 65 20 63 6f 72 65 20 66 69 6c 65 73 20 69 66  te core files if
200e0 20 77 65 20 63 72 61 73 68 20 2a 2f 0a 23 69 66   we crash */.#if
200f0 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
20100 54 45 53 54 29 20 26 26 20 64 65 66 69 6e 65 64  TEST) && defined
20110 28 75 6e 69 78 29 0a 20 20 7b 20 73 74 72 75 63  (unix).  { struc
20120 74 20 72 6c 69 6d 69 74 20 78 3b 0a 20 20 20 20  t rlimit x;.    
20130 67 65 74 72 6c 69 6d 69 74 28 52 4c 49 4d 49 54  getrlimit(RLIMIT
20140 5f 43 4f 52 45 2c 20 26 78 29 3b 0a 20 20 20 20  _CORE, &x);.    
20150 78 2e 72 6c 69 6d 5f 63 75 72 20 3d 20 78 2e 72  x.rlim_cur = x.r
20160 6c 69 6d 5f 6d 61 78 3b 0a 20 20 20 20 73 65 74  lim_max;.    set
20170 72 6c 69 6d 69 74 28 52 4c 49 4d 49 54 5f 43 4f  rlimit(RLIMIT_CO
20180 52 45 2c 20 26 78 29 3b 0a 20 20 7d 0a 23 65 6e  RE, &x);.  }.#en
20190 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 54 45  dif /* SQLITE_TE
201a0 53 54 20 26 26 20 75 6e 69 78 20 2a 2f 0a 0a 0a  ST && unix */...
201b0 20 20 2f 2a 20 43 61 6c 6c 20 73 71 6c 69 74 65    /* Call sqlite
201c0 33 5f 73 68 75 74 64 6f 77 6e 28 29 20 6f 6e 63  3_shutdown() onc
201d0 65 20 62 65 66 6f 72 65 20 64 6f 69 6e 67 20 61  e before doing a
201e0 6e 79 74 68 69 6e 67 20 65 6c 73 65 2e 20 54 68  nything else. Th
201f0 69 73 20 69 73 20 74 6f 0a 20 20 2a 2a 20 74 65  is is to.  ** te
20200 73 74 20 74 68 61 74 20 73 71 6c 69 74 65 33 5f  st that sqlite3_
20210 73 68 75 74 64 6f 77 6e 28 29 20 63 61 6e 20 62  shutdown() can b
20220 65 20 73 61 66 65 6c 79 20 63 61 6c 6c 65 64 20  e safely called 
20230 62 79 20 61 20 70 72 6f 63 65 73 73 20 62 65 66  by a process bef
20240 6f 72 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33  ore.  ** sqlite3
20250 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 20 69 73  _initialize() is
20260 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73  . */.  sqlite3_s
20270 68 75 74 64 6f 77 6e 28 29 3b 0a 0a 20 20 54 63  hutdown();..  Tc
20280 6c 5f 46 69 6e 64 45 78 65 63 75 74 61 62 6c 65  l_FindExecutable
20290 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 54 63 6c  (argv[0]);.  Tcl
202a0 5f 53 65 74 53 79 73 74 65 6d 45 6e 63 6f 64 69  _SetSystemEncodi
202b0 6e 67 28 4e 55 4c 4c 2c 20 22 75 74 66 2d 38 22  ng(NULL, "utf-8"
202c0 29 3b 0a 20 20 69 6e 74 65 72 70 20 3d 20 54 63  );.  interp = Tc
202d0 6c 5f 43 72 65 61 74 65 49 6e 74 65 72 70 28 29  l_CreateInterp()
202e0 3b 0a 0a 23 69 66 20 54 43 4c 53 48 3d 3d 32 0a  ;..#if TCLSH==2.
202f0 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67    sqlite3_config
20300 28 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53  (SQLITE_CONFIG_S
20310 49 4e 47 4c 45 54 48 52 45 41 44 29 3b 0a 23 65  INGLETHREAD);.#e
20320 6e 64 69 66 0a 0a 20 20 69 6e 69 74 5f 61 6c 6c  ndif..  init_all
20330 28 69 6e 74 65 72 70 29 3b 0a 20 20 69 66 28 20  (interp);.  if( 
20340 61 72 67 63 3e 3d 32 20 29 7b 0a 20 20 20 20 69  argc>=2 ){.    i
20350 6e 74 20 69 3b 0a 20 20 20 20 63 68 61 72 20 7a  nt i;.    char z
20360 41 72 67 63 5b 33 32 5d 3b 0a 20 20 20 20 73 71  Argc[32];.    sq
20370 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
20380 69 7a 65 6f 66 28 7a 41 72 67 63 29 2c 20 7a 41  izeof(zArgc), zA
20390 72 67 63 2c 20 22 25 64 22 2c 20 61 72 67 63 2d  rgc, "%d", argc-
203a0 28 33 2d 54 43 4c 53 48 29 29 3b 0a 20 20 20 20  (3-TCLSH));.    
203b0 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72  Tcl_SetVar(inter
203c0 70 2c 22 61 72 67 63 22 2c 20 7a 41 72 67 63 2c  p,"argc", zArgc,
203d0 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59   TCL_GLOBAL_ONLY
203e0 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 56 61  );.    Tcl_SetVa
203f0 72 28 69 6e 74 65 72 70 2c 22 61 72 67 76 30 22  r(interp,"argv0"
20400 2c 61 72 67 76 5b 31 5d 2c 54 43 4c 5f 47 4c 4f  ,argv[1],TCL_GLO
20410 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 20 20 20 20 54  BAL_ONLY);.    T
20420 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70  cl_SetVar(interp
20430 2c 22 61 72 67 76 22 2c 20 22 22 2c 20 54 43 4c  ,"argv", "", TCL
20440 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 20  _GLOBAL_ONLY);. 
20450 20 20 20 66 6f 72 28 69 3d 33 2d 54 43 4c 53 48     for(i=3-TCLSH
20460 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a  ; i<argc; i++){.
20470 20 20 20 20 20 20 54 63 6c 5f 53 65 74 56 61 72        Tcl_SetVar
20480 28 69 6e 74 65 72 70 2c 20 22 61 72 67 76 22 2c  (interp, "argv",
20490 20 61 72 67 76 5b 69 5d 2c 0a 20 20 20 20 20 20   argv[i],.      
204a0 20 20 20 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f      TCL_GLOBAL_O
204b0 4e 4c 59 20 7c 20 54 43 4c 5f 4c 49 53 54 5f 45  NLY | TCL_LIST_E
204c0 4c 45 4d 45 4e 54 20 7c 20 54 43 4c 5f 41 50 50  LEMENT | TCL_APP
204d0 45 4e 44 5f 56 41 4c 55 45 29 3b 0a 20 20 20 20  END_VALUE);.    
204e0 7d 0a 20 20 20 20 69 66 28 20 54 43 4c 53 48 3d  }.    if( TCLSH=
204f0 3d 31 20 26 26 20 54 63 6c 5f 45 76 61 6c 46 69  =1 && Tcl_EvalFi
20500 6c 65 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b  le(interp, argv[
20510 31 5d 29 21 3d 54 43 4c 5f 4f 4b 20 29 7b 0a 20  1])!=TCL_OK ){. 
20520 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
20530 2a 7a 49 6e 66 6f 20 3d 20 54 63 6c 5f 47 65 74  *zInfo = Tcl_Get
20540 56 61 72 28 69 6e 74 65 72 70 2c 20 22 65 72 72  Var(interp, "err
20550 6f 72 49 6e 66 6f 22 2c 20 54 43 4c 5f 47 4c 4f  orInfo", TCL_GLO
20560 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 20 20 20 20 20  BAL_ONLY);.     
20570 20 69 66 28 20 7a 49 6e 66 6f 3d 3d 30 20 29 20   if( zInfo==0 ) 
20580 7a 49 6e 66 6f 20 3d 20 54 63 6c 5f 47 65 74 53  zInfo = Tcl_GetS
20590 74 72 69 6e 67 52 65 73 75 6c 74 28 69 6e 74 65  tringResult(inte
205a0 72 70 29 3b 0a 20 20 20 20 20 20 66 70 72 69 6e  rp);.      fprin
205b0 74 66 28 73 74 64 65 72 72 2c 22 25 73 3a 20 25  tf(stderr,"%s: %
205c0 73 5c 6e 22 2c 20 2a 61 72 67 76 2c 20 7a 49 6e  s\n", *argv, zIn
205d0 66 6f 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  fo);.      retur
205e0 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n 1;.    }.  }. 
205f0 20 69 66 28 20 54 43 4c 53 48 3d 3d 32 20 7c 7c   if( TCLSH==2 ||
20600 20 61 72 67 63 3c 3d 31 20 29 7b 0a 20 20 20 20   argc<=1 ){.    
20610 54 63 6c 5f 47 6c 6f 62 61 6c 45 76 61 6c 28 69  Tcl_GlobalEval(i
20620 6e 74 65 72 70 2c 20 74 63 6c 73 68 5f 6d 61 69  nterp, tclsh_mai
20630 6e 5f 6c 6f 6f 70 28 29 29 3b 0a 20 20 7d 0a 20  n_loop());.  }. 
20640 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e   return 0;.}.#en
20650 64 69 66 20 2f 2a 20 54 43 4c 53 48 20 2a 2f 0a  dif /* TCLSH */.