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

Artifact a9c6e33c44efa93d176ce5e0887d5d533c98b429:


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: 44 62 54 72 61 6e 73 50 6f 73 74 43 6d 64 28 0a  DbTransPostCmd(.
8ce0: 20 20 43 6c 69 65 6e 74 44 61 74 61 20 64 61 74    ClientData dat
8cf0: 61 5b 5d 2c 20 20 20 20 20 20 20 20 20 20 20 20  a[],            
8d00: 20 20 20 20 20 20 20 2f 2a 20 64 61 74 61 5b 30         /* data[0
8d10: 5d 20 69 73 20 74 68 65 20 53 71 6c 69 74 65 33  ] is the Sqlite3
8d20: 44 62 2a 20 66 6f 72 20 24 64 62 20 2a 2f 0a 20  Db* for $db */. 
8d30: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
8d40: 65 72 70 2c 20 20 20 20 20 20 20 20 20 20 20 20  erp,            
8d50: 20 20 20 20 20 20 2f 2a 20 54 63 6c 20 69 6e 74        /* Tcl int
8d60: 65 72 70 72 65 74 65 72 20 2a 2f 0a 20 20 69 6e  erpreter */.  in
8d70: 74 20 72 65 73 75 6c 74 20 20 20 20 20 20 20 20  t result        
8d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8d90: 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 6f 66 20     /* Result of 
8da0: 65 76 61 6c 75 61 74 69 6e 67 20 53 43 52 49 50  evaluating SCRIP
8db0: 54 20 2a 2f 0a 29 7b 0a 20 20 73 74 61 74 69 63  T */.){.  static
8dc0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 6e   const char *con
8dd0: 73 74 20 61 7a 45 6e 64 5b 5d 20 3d 20 7b 0a 20  st azEnd[] = {. 
8de0: 20 20 20 22 52 45 4c 45 41 53 45 20 5f 74 63 6c     "RELEASE _tcl
8df0: 5f 74 72 61 6e 73 61 63 74 69 6f 6e 22 2c 20 20  _transaction",  
8e00: 20 20 20 20 20 20 2f 2a 20 72 63 3d 3d 54 43 4c        /* rc==TCL
8e10: 5f 45 52 52 4f 52 2c 20 6e 54 72 61 6e 73 61 63  _ERROR, nTransac
8e20: 74 69 6f 6e 21 3d 30 20 2a 2f 0a 20 20 20 20 22  tion!=0 */.    "
8e30: 43 4f 4d 4d 49 54 22 2c 20 20 20 20 20 20 20 20  COMMIT",        
8e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8e50: 20 20 2f 2a 20 72 63 21 3d 54 43 4c 5f 45 52 52    /* rc!=TCL_ERR
8e60: 4f 52 2c 20 6e 54 72 61 6e 73 61 63 74 69 6f 6e  OR, nTransaction
8e70: 3d 3d 30 20 2a 2f 0a 20 20 20 20 22 52 4f 4c 4c  ==0 */.    "ROLL
8e80: 42 41 43 4b 20 54 4f 20 5f 74 63 6c 5f 74 72 61  BACK TO _tcl_tra
8e90: 6e 73 61 63 74 69 6f 6e 20 3b 20 52 45 4c 45 41  nsaction ; RELEA
8ea0: 53 45 20 5f 74 63 6c 5f 74 72 61 6e 73 61 63 74  SE _tcl_transact
8eb0: 69 6f 6e 22 2c 0a 20 20 20 20 22 52 4f 4c 4c 42  ion",.    "ROLLB
8ec0: 41 43 4b 22 20 20 20 20 20 20 20 20 20 20 20 20  ACK"            
8ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8ee0: 72 63 3d 3d 54 43 4c 5f 45 52 52 4f 52 2c 20 6e  rc==TCL_ERROR, n
8ef0: 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 30 20 2a  Transaction==0 *
8f00: 2f 0a 20 20 7d 3b 0a 20 20 53 71 6c 69 74 65 44  /.  };.  SqliteD
8f10: 62 20 2a 70 44 62 20 3d 20 28 53 71 6c 69 74 65  b *pDb = (Sqlite
8f20: 44 62 2a 29 64 61 74 61 5b 30 5d 3b 0a 20 20 69  Db*)data[0];.  i
8f30: 6e 74 20 72 63 20 3d 20 72 65 73 75 6c 74 3b 0a  nt rc = result;.
8f40: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45    const char *zE
8f50: 6e 64 3b 0a 0a 20 20 70 44 62 2d 3e 6e 54 72 61  nd;..  pDb->nTra
8f60: 6e 73 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20 7a 45  nsaction--;.  zE
8f70: 6e 64 20 3d 20 61 7a 45 6e 64 5b 28 72 63 3d 3d  nd = azEnd[(rc==
8f80: 54 43 4c 5f 45 52 52 4f 52 29 2a 32 20 2b 20 28  TCL_ERROR)*2 + (
8f90: 70 44 62 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f  pDb->nTransactio
8fa0: 6e 3d 3d 30 29 5d 3b 0a 0a 20 20 70 44 62 2d 3e  n==0)];..  pDb->
8fb0: 64 69 73 61 62 6c 65 41 75 74 68 2b 2b 3b 0a 20  disableAuth++;. 
8fc0: 20 69 66 28 20 73 71 6c 69 74 65 33 5f 65 78 65   if( sqlite3_exe
8fd0: 63 28 70 44 62 2d 3e 64 62 2c 20 7a 45 6e 64 2c  c(pDb->db, zEnd,
8fe0: 20 30 2c 20 30 2c 20 30 29 20 29 7b 0a 20 20 20   0, 0, 0) ){.   
8ff0: 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 61 20     /* This is a 
9000: 74 72 69 63 6b 79 20 73 63 65 6e 61 72 69 6f 20  tricky scenario 
9010: 74 6f 20 68 61 6e 64 6c 65 2e 20 54 68 65 20 6d  to handle. The m
9020: 6f 73 74 20 6c 69 6b 65 6c 79 20 63 61 75 73 65  ost likely cause
9030: 20 6f 66 20 61 6e 0a 20 20 20 20 20 20 2a 2a 20   of an.      ** 
9040: 65 72 72 6f 72 20 69 73 20 74 68 61 74 20 74 68  error is that th
9050: 65 20 65 78 65 63 28 29 20 61 62 6f 76 65 20 77  e exec() above w
9060: 61 73 20 61 6e 20 61 74 74 65 6d 70 74 20 74 6f  as an attempt to
9070: 20 63 6f 6d 6d 69 74 20 74 68 65 0a 20 20 20 20   commit the.    
9080: 20 20 2a 2a 20 74 6f 70 2d 6c 65 76 65 6c 20 74    ** top-level t
9090: 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 61 74 20  ransaction that 
90a0: 72 65 74 75 72 6e 65 64 20 53 51 4c 49 54 45 5f  returned SQLITE_
90b0: 42 55 53 59 2e 20 4f 72 2c 20 6c 65 73 73 20 6c  BUSY. Or, less l
90c0: 69 6b 65 6c 79 2c 0a 20 20 20 20 20 20 2a 2a 20  ikely,.      ** 
90d0: 74 68 61 74 20 61 6e 20 49 4f 2d 65 72 72 6f 72  that an IO-error
90e0: 20 68 61 73 20 6f 63 63 75 72 72 65 64 2e 20 49   has occurred. I
90f0: 6e 20 65 69 74 68 65 72 20 63 61 73 65 2c 20 74  n either case, t
9100: 68 72 6f 77 20 61 20 54 63 6c 20 65 78 63 65 70  hrow a Tcl excep
9110: 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 61 6e  tion.      ** an
9120: 64 20 74 72 79 20 74 6f 20 72 6f 6c 6c 62 61 63  d try to rollbac
9130: 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  k the transactio
9140: 6e 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  n..      **.    
9150: 20 20 2a 2a 20 42 75 74 20 69 74 20 63 6f 75 6c    ** But it coul
9160: 64 20 61 6c 73 6f 20 62 65 20 74 68 61 74 20 74  d also be that t
9170: 68 65 20 75 73 65 72 20 65 78 65 63 75 74 65 64  he user executed
9180: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 42 45 47   one or more BEG
9190: 49 4e 2c 0a 20 20 20 20 20 20 2a 2a 20 43 4f 4d  IN,.      ** COM
91a0: 4d 49 54 2c 20 53 41 56 45 50 4f 49 4e 54 2c 20  MIT, SAVEPOINT, 
91b0: 52 45 4c 45 41 53 45 20 6f 72 20 52 4f 4c 4c 42  RELEASE or ROLLB
91c0: 41 43 4b 20 63 6f 6d 6d 61 6e 64 73 20 74 68 61  ACK commands tha
91d0: 74 20 61 72 65 20 63 6f 6e 66 75 73 69 6e 67 0a  t are confusing.
91e0: 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 6d 65        ** this me
91f0: 74 68 6f 64 27 73 20 6c 6f 67 69 63 2e 20 4e 6f  thod's logic. No
9200: 74 20 63 6c 65 61 72 20 68 6f 77 20 74 68 69 73  t clear how this
9210: 20 77 6f 75 6c 64 20 62 65 20 62 65 73 74 20 68   would be best h
9220: 61 6e 64 6c 65 64 2e 0a 20 20 20 20 20 20 2a 2f  andled..      */
9230: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 54 43 4c  .    if( rc!=TCL
9240: 5f 45 52 52 4f 52 20 29 7b 0a 20 20 20 20 20 20  _ERROR ){.      
9250: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
9260: 28 69 6e 74 65 72 70 2c 20 73 71 6c 69 74 65 33  (interp, sqlite3
9270: 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62 29  _errmsg(pDb->db)
9280: 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20  , (char*)0);.   
9290: 20 20 20 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f     rc = TCL_ERRO
92a0: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  R;.    }.    sql
92b0: 69 74 65 33 5f 65 78 65 63 28 70 44 62 2d 3e 64  ite3_exec(pDb->d
92c0: 62 2c 20 22 52 4f 4c 4c 42 41 43 4b 22 2c 20 30  b, "ROLLBACK", 0
92d0: 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 70  , 0, 0);.  }.  p
92e0: 44 62 2d 3e 64 69 73 61 62 6c 65 41 75 74 68 2d  Db->disableAuth-
92f0: 2d 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  -;..  return rc;
9300: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 65 73 73  .}../*.** Unless
9310: 20 53 51 4c 49 54 45 5f 54 45 53 54 20 69 73 20   SQLITE_TEST is 
9320: 64 65 66 69 6e 65 64 2c 20 74 68 69 73 20 66 75  defined, this fu
9330: 6e 63 74 69 6f 6e 20 69 73 20 61 20 73 69 6d 70  nction is a simp
9340: 6c 65 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e  le wrapper aroun
9350: 64 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 70 72 65  d.** sqlite3_pre
9360: 70 61 72 65 5f 76 32 28 29 2e 20 49 66 20 53 51  pare_v2(). If SQ
9370: 4c 49 54 45 5f 54 45 53 54 20 69 73 20 64 65 66  LITE_TEST is def
9380: 69 6e 65 64 2c 20 74 68 65 6e 20 69 74 20 75 73  ined, then it us
9390: 65 73 20 65 69 74 68 65 72 0a 2a 2a 20 73 71 6c  es either.** sql
93a0: 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28  ite3_prepare_v2(
93b0: 29 20 6f 72 20 6c 65 67 61 63 79 20 69 6e 74 65  ) or legacy inte
93c0: 72 66 61 63 65 20 73 71 6c 69 74 65 33 5f 70 72  rface sqlite3_pr
93d0: 65 70 61 72 65 28 29 2c 20 64 65 70 65 6e 64 69  epare(), dependi
93e0: 6e 67 0a 2a 2a 20 6f 6e 20 77 68 65 74 68 65 72  ng.** on whether
93f0: 20 6f 72 20 6e 6f 74 20 74 68 65 20 5b 64 62 5f   or not the [db_
9400: 75 73 65 5f 6c 65 67 61 63 79 5f 70 72 65 70 61  use_legacy_prepa
9410: 72 65 5d 20 63 6f 6d 6d 61 6e 64 20 68 61 73 20  re] command has 
9420: 62 65 65 6e 20 75 73 65 64 20 74 6f 0a 2a 2a 20  been used to.** 
9430: 63 6f 6e 66 69 67 75 72 65 20 74 68 65 20 63 6f  configure the co
9440: 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  nnection..*/.sta
9450: 74 69 63 20 69 6e 74 20 64 62 50 72 65 70 61 72  tic int dbPrepar
9460: 65 28 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70  e(.  SqliteDb *p
9470: 44 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Db,             
9480: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
9490: 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 6f 6e   object */.  con
94a0: 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 2c 20 20  st char *zSql,  
94b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
94c0: 53 51 4c 20 74 6f 20 63 6f 6d 70 69 6c 65 20 2a  SQL to compile *
94d0: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  /.  sqlite3_stmt
94e0: 20 2a 2a 70 70 53 74 6d 74 2c 20 20 20 20 20 20   **ppStmt,      
94f0: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 50 72 65 70      /* OUT: Prep
9500: 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 2a  ared statement *
9510: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
9520: 2a 70 7a 4f 75 74 20 20 20 20 20 20 20 20 20 20  *pzOut          
9530: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 50 6f 69 6e      /* OUT: Poin
9540: 74 65 72 20 74 6f 20 6e 65 78 74 20 53 51 4c 20  ter to next SQL 
9550: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a  statement */.){.
9560: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
9570: 53 54 0a 20 20 69 66 28 20 70 44 62 2d 3e 62 4c  ST.  if( pDb->bL
9580: 65 67 61 63 79 50 72 65 70 61 72 65 20 29 7b 0a  egacyPrepare ){.
9590: 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
95a0: 65 33 5f 70 72 65 70 61 72 65 28 70 44 62 2d 3e  e3_prepare(pDb->
95b0: 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 70 70  db, zSql, -1, pp
95c0: 53 74 6d 74 2c 20 70 7a 4f 75 74 29 3b 0a 20 20  Stmt, pzOut);.  
95d0: 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  }.#endif.  retur
95e0: 6e 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  n sqlite3_prepar
95f0: 65 5f 76 32 28 70 44 62 2d 3e 64 62 2c 20 7a 53  e_v2(pDb->db, zS
9600: 71 6c 2c 20 2d 31 2c 20 70 70 53 74 6d 74 2c 20  ql, -1, ppStmt, 
9610: 70 7a 4f 75 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pzOut);.}../*.**
9620: 20 53 65 61 72 63 68 20 74 68 65 20 63 61 63 68   Search the cach
9630: 65 20 66 6f 72 20 61 20 70 72 65 70 61 72 65 64  e for a prepared
9640: 2d 73 74 61 74 65 6d 65 6e 74 20 6f 62 6a 65 63  -statement objec
9650: 74 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74  t that implement
9660: 73 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 53  s the.** first S
9670: 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20  QL statement in 
9680: 74 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74  the buffer point
9690: 65 64 20 74 6f 20 62 79 20 70 61 72 61 6d 65 74  ed to by paramet
96a0: 65 72 20 7a 49 6e 2e 20 49 66 0a 2a 2a 20 6e 6f  er zIn. If.** no
96b0: 20 73 75 63 68 20 70 72 65 70 61 72 65 64 2d 73   such prepared-s
96c0: 74 61 74 65 6d 65 6e 74 20 63 61 6e 20 62 65 20  tatement can be 
96d0: 66 6f 75 6e 64 2c 20 61 6c 6c 6f 63 61 74 65 20  found, allocate 
96e0: 61 6e 64 20 70 72 65 70 61 72 65 20 61 20 6e 65  and prepare a ne
96f0: 77 0a 2a 2a 20 6f 6e 65 2e 20 49 6e 20 65 69 74  w.** one. In eit
9700: 68 65 72 20 63 61 73 65 2c 20 62 69 6e 64 20 74  her case, bind t
9710: 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65  he current value
9720: 73 20 6f 66 20 74 68 65 20 72 65 6c 65 76 61 6e  s of the relevan
9730: 74 20 54 63 6c 0a 2a 2a 20 76 61 72 69 61 62 6c  t Tcl.** variabl
9740: 65 73 20 74 6f 20 61 6e 79 20 24 76 61 72 2c 20  es to any $var, 
9750: 3a 76 61 72 20 6f 72 20 40 76 61 72 20 76 61 72  :var or @var var
9760: 69 61 62 6c 65 73 20 69 6e 20 74 68 65 20 73 74  iables in the st
9770: 61 74 65 6d 65 6e 74 2e 20 42 65 66 6f 72 65 0a  atement. Before.
9780: 2a 2a 20 72 65 74 75 72 6e 69 6e 67 2c 20 73 65  ** returning, se
9790: 74 20 2a 70 70 50 72 65 53 74 6d 74 20 74 6f 20  t *ppPreStmt to 
97a0: 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 70 72 65  point to the pre
97b0: 70 61 72 65 64 2d 73 74 61 74 65 6d 65 6e 74 20  pared-statement 
97c0: 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 4f 75  object..**.** Ou
97d0: 74 70 75 74 20 70 61 72 61 6d 65 74 65 72 20 2a  tput parameter *
97e0: 70 7a 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20  pzOut is set to 
97f0: 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e 65 78  point to the nex
9800: 74 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  t SQL statement 
9810: 69 6e 0a 2a 2a 20 62 75 66 66 65 72 20 7a 49 6e  in.** buffer zIn
9820: 2c 20 6f 72 20 74 6f 20 74 68 65 20 27 5c 30 27  , or to the '\0'
9830: 20 62 79 74 65 20 61 74 20 74 68 65 20 65 6e 64   byte at the end
9840: 20 6f 66 20 7a 49 6e 20 69 66 20 74 68 65 72 65   of zIn if there
9850: 20 69 73 20 6e 6f 0a 2a 2a 20 6e 65 78 74 20 73   is no.** next s
9860: 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  tatement..**.** 
9870: 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 54  If successful, T
9880: 43 4c 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  CL_OK is returne
9890: 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 54 43  d. Otherwise, TC
98a0: 4c 5f 45 52 52 4f 52 20 69 73 20 72 65 74 75 72  L_ERROR is retur
98b0: 6e 65 64 0a 2a 2a 20 61 6e 64 20 61 6e 20 65 72  ned.** and an er
98c0: 72 6f 72 20 6d 65 73 73 61 67 65 20 6c 6f 61 64  ror message load
98d0: 65 64 20 69 6e 74 6f 20 69 6e 74 65 72 70 72 65  ed into interpre
98e0: 74 65 72 20 70 44 62 2d 3e 69 6e 74 65 72 70 2e  ter pDb->interp.
98f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
9900: 62 50 72 65 70 61 72 65 41 6e 64 42 69 6e 64 28  bPrepareAndBind(
9910: 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62  .  SqliteDb *pDb
9920: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
9930: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6f     /* Database o
9940: 62 6a 65 63 74 20 2a 2f 0a 20 20 63 68 61 72 20  bject */.  char 
9950: 63 6f 6e 73 74 20 2a 7a 49 6e 2c 20 20 20 20 20  const *zIn,     
9960: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51             /* SQ
9970: 4c 20 74 6f 20 63 6f 6d 70 69 6c 65 20 2a 2f 0a  L to compile */.
9980: 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 2a 70    char const **p
9990: 7a 4f 75 74 2c 20 20 20 20 20 20 20 20 20 20 20  zOut,           
99a0: 20 20 2f 2a 20 4f 55 54 3a 20 50 6f 69 6e 74 65    /* OUT: Pointe
99b0: 72 20 74 6f 20 6e 65 78 74 20 53 51 4c 20 73 74  r to next SQL st
99c0: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 53 71 6c  atement */.  Sql
99d0: 50 72 65 70 61 72 65 64 53 74 6d 74 20 2a 2a 70  PreparedStmt **p
99e0: 70 50 72 65 53 74 6d 74 20 20 20 20 20 2f 2a 20  pPreStmt     /* 
99f0: 4f 55 54 3a 20 4f 62 6a 65 63 74 20 75 73 65 64  OUT: Object used
9a00: 20 74 6f 20 63 61 63 68 65 20 73 74 61 74 65 6d   to cache statem
9a10: 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73  ent */.){.  cons
9a20: 74 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20 7a  t char *zSql = z
9a30: 49 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 50  In;         /* P
9a40: 6f 69 6e 74 65 72 20 74 6f 20 66 69 72 73 74 20  ointer to first 
9a50: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 69 6e  SQL statement in
9a60: 20 7a 49 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65   zIn */.  sqlite
9a70: 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20  3_stmt *pStmt = 
9a80: 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65  0;        /* Pre
9a90: 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20  pared statement 
9aa0: 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 53 71 6c 50  object */.  SqlP
9ab0: 72 65 70 61 72 65 64 53 74 6d 74 20 2a 70 50 72  reparedStmt *pPr
9ac0: 65 53 74 6d 74 3b 20 20 20 20 20 20 2f 2a 20 50  eStmt;      /* P
9ad0: 6f 69 6e 74 65 72 20 74 6f 20 63 61 63 68 65 64  ointer to cached
9ae0: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
9af0: 69 6e 74 20 6e 53 71 6c 3b 20 20 20 20 20 20 20  int nSql;       
9b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9b10: 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 7a 53 71  /* Length of zSq
9b20: 6c 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  l in bytes */.  
9b30: 69 6e 74 20 6e 56 61 72 20 3d 20 30 3b 20 20 20  int nVar = 0;   
9b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9b50: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 76 61 72  /* Number of var
9b60: 69 61 62 6c 65 73 20 69 6e 20 73 74 61 74 65 6d  iables in statem
9b70: 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61  ent */.  int iPa
9b80: 72 6d 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  rm = 0;         
9b90: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74           /* Next
9ba0: 20 66 72 65 65 20 65 6e 74 72 79 20 69 6e 20 61   free entry in a
9bb0: 70 50 61 72 6d 20 2a 2f 0a 20 20 63 68 61 72 20  pParm */.  char 
9bc0: 63 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 54 63  c;.  int i;.  Tc
9bd0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
9be0: 20 3d 20 70 44 62 2d 3e 69 6e 74 65 72 70 3b 0a   = pDb->interp;.
9bf0: 0a 20 20 2a 70 70 50 72 65 53 74 6d 74 20 3d 20  .  *ppPreStmt = 
9c00: 30 3b 0a 0a 20 20 2f 2a 20 54 72 69 6d 20 73 70  0;..  /* Trim sp
9c10: 61 63 65 73 20 66 72 6f 6d 20 74 68 65 20 73 74  aces from the st
9c20: 61 72 74 20 6f 66 20 7a 53 71 6c 20 61 6e 64 20  art of zSql and 
9c30: 63 61 6c 63 75 6c 61 74 65 20 74 68 65 20 72 65  calculate the re
9c40: 6d 61 69 6e 69 6e 67 20 6c 65 6e 67 74 68 2e 20  maining length. 
9c50: 2a 2f 0a 20 20 77 68 69 6c 65 28 20 28 63 20 3d  */.  while( (c =
9c60: 20 7a 53 71 6c 5b 30 5d 29 3d 3d 27 20 27 20 7c   zSql[0])==' ' |
9c70: 7c 20 63 3d 3d 27 5c 74 27 20 7c 7c 20 63 3d 3d  | c=='\t' || c==
9c80: 27 5c 72 27 20 7c 7c 20 63 3d 3d 27 5c 6e 27 20  '\r' || c=='\n' 
9c90: 29 7b 20 7a 53 71 6c 2b 2b 3b 20 7d 0a 20 20 6e  ){ zSql++; }.  n
9ca0: 53 71 6c 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a  Sql = strlen30(z
9cb0: 53 71 6c 29 3b 0a 0a 20 20 66 6f 72 28 70 50 72  Sql);..  for(pPr
9cc0: 65 53 74 6d 74 20 3d 20 70 44 62 2d 3e 73 74 6d  eStmt = pDb->stm
9cd0: 74 4c 69 73 74 3b 20 70 50 72 65 53 74 6d 74 3b  tList; pPreStmt;
9ce0: 20 70 50 72 65 53 74 6d 74 3d 70 50 72 65 53 74   pPreStmt=pPreSt
9cf0: 6d 74 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  mt->pNext){.    
9d00: 69 6e 74 20 6e 20 3d 20 70 50 72 65 53 74 6d 74  int n = pPreStmt
9d10: 2d 3e 6e 53 71 6c 3b 0a 20 20 20 20 69 66 28 20  ->nSql;.    if( 
9d20: 6e 53 71 6c 3e 3d 6e 0a 20 20 20 20 20 20 20 20  nSql>=n.        
9d30: 26 26 20 6d 65 6d 63 6d 70 28 70 50 72 65 53 74  && memcmp(pPreSt
9d40: 6d 74 2d 3e 7a 53 71 6c 2c 20 7a 53 71 6c 2c 20  mt->zSql, zSql, 
9d50: 6e 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 26 26  n)==0.        &&
9d60: 20 28 7a 53 71 6c 5b 6e 5d 3d 3d 30 20 7c 7c 20   (zSql[n]==0 || 
9d70: 7a 53 71 6c 5b 6e 2d 31 5d 3d 3d 27 3b 27 29 0a  zSql[n-1]==';').
9d80: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 70 53 74      ){.      pSt
9d90: 6d 74 20 3d 20 70 50 72 65 53 74 6d 74 2d 3e 70  mt = pPreStmt->p
9da0: 53 74 6d 74 3b 0a 20 20 20 20 20 20 2a 70 7a 4f  Stmt;.      *pzO
9db0: 75 74 20 3d 20 26 7a 53 71 6c 5b 70 50 72 65 53  ut = &zSql[pPreS
9dc0: 74 6d 74 2d 3e 6e 53 71 6c 5d 3b 0a 0a 20 20 20  tmt->nSql];..   
9dd0: 20 20 20 2f 2a 20 57 68 65 6e 20 61 20 70 72 65     /* When a pre
9de0: 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20  pared statement 
9df0: 69 73 20 66 6f 75 6e 64 2c 20 75 6e 6c 69 6e 6b  is found, unlink
9e00: 20 69 74 20 66 72 6f 6d 20 74 68 65 0a 20 20 20   it from the.   
9e10: 20 20 20 2a 2a 20 63 61 63 68 65 20 6c 69 73 74     ** cache list
9e20: 2e 20 20 49 74 20 77 69 6c 6c 20 6c 61 74 65 72  .  It will later
9e30: 20 62 65 20 61 64 64 65 64 20 62 61 63 6b 20 74   be added back t
9e40: 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 0a  o the beginning.
9e50: 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20        ** of the 
9e60: 63 61 63 68 65 20 6c 69 73 74 20 69 6e 20 6f 72  cache list in or
9e70: 64 65 72 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  der to implement
9e80: 20 4c 52 55 20 72 65 70 6c 61 63 65 6d 65 6e 74   LRU replacement
9e90: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
9ea0: 20 69 66 28 20 70 50 72 65 53 74 6d 74 2d 3e 70   if( pPreStmt->p
9eb0: 50 72 65 76 20 29 7b 0a 20 20 20 20 20 20 20 20  Prev ){.        
9ec0: 70 50 72 65 53 74 6d 74 2d 3e 70 50 72 65 76 2d  pPreStmt->pPrev-
9ed0: 3e 70 4e 65 78 74 20 3d 20 70 50 72 65 53 74 6d  >pNext = pPreStm
9ee0: 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  t->pNext;.      
9ef0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
9f00: 44 62 2d 3e 73 74 6d 74 4c 69 73 74 20 3d 20 70  Db->stmtList = p
9f10: 50 72 65 53 74 6d 74 2d 3e 70 4e 65 78 74 3b 0a  PreStmt->pNext;.
9f20: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
9f30: 28 20 70 50 72 65 53 74 6d 74 2d 3e 70 4e 65 78  ( pPreStmt->pNex
9f40: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 72  t ){.        pPr
9f50: 65 53 74 6d 74 2d 3e 70 4e 65 78 74 2d 3e 70 50  eStmt->pNext->pP
9f60: 72 65 76 20 3d 20 70 50 72 65 53 74 6d 74 2d 3e  rev = pPreStmt->
9f70: 70 50 72 65 76 3b 0a 20 20 20 20 20 20 7d 65 6c  pPrev;.      }el
9f80: 73 65 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d  se{.        pDb-
9f90: 3e 73 74 6d 74 4c 61 73 74 20 3d 20 70 50 72 65  >stmtLast = pPre
9fa0: 53 74 6d 74 2d 3e 70 50 72 65 76 3b 0a 20 20 20  Stmt->pPrev;.   
9fb0: 20 20 20 7d 0a 20 20 20 20 20 20 70 44 62 2d 3e     }.      pDb->
9fc0: 6e 53 74 6d 74 2d 2d 3b 0a 20 20 20 20 20 20 6e  nStmt--;.      n
9fd0: 56 61 72 20 3d 20 73 71 6c 69 74 65 33 5f 62 69  Var = sqlite3_bi
9fe0: 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 63 6f 75  nd_parameter_cou
9ff0: 6e 74 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20  nt(pStmt);.     
a000: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
a010: 7d 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 20 70 72  }..  /* If no pr
a020: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
a030: 20 77 61 73 20 66 6f 75 6e 64 2e 20 43 6f 6d 70   was found. Comp
a040: 69 6c 65 20 74 68 65 20 53 51 4c 20 74 65 78 74  ile the SQL text
a050: 2e 20 41 6c 73 6f 20 61 6c 6c 6f 63 61 74 65 0a  . Also allocate.
a060: 20 20 2a 2a 20 61 20 6e 65 77 20 53 71 6c 50 72    ** a new SqlPr
a070: 65 70 61 72 65 64 53 74 6d 74 20 73 74 72 75 63  eparedStmt struc
a080: 74 75 72 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20  ture.  */.  if( 
a090: 70 50 72 65 53 74 6d 74 3d 3d 30 20 29 7b 0a 20  pPreStmt==0 ){. 
a0a0: 20 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 0a 20     int nByte;.. 
a0b0: 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b     if( SQLITE_OK
a0c0: 21 3d 64 62 50 72 65 70 61 72 65 28 70 44 62 2c  !=dbPrepare(pDb,
a0d0: 20 7a 53 71 6c 2c 20 26 70 53 74 6d 74 2c 20 70   zSql, &pStmt, p
a0e0: 7a 4f 75 74 29 20 29 7b 0a 20 20 20 20 20 20 54  zOut) ){.      T
a0f0: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
a100: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53  interp, Tcl_NewS
a110: 74 72 69 6e 67 4f 62 6a 28 73 71 6c 69 74 65 33  tringObj(sqlite3
a120: 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62 29  _errmsg(pDb->db)
a130: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 20 20 72 65  , -1));.      re
a140: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
a150: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 53      }.    if( pS
a160: 74 6d 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  tmt==0 ){.      
a170: 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73  if( SQLITE_OK!=s
a180: 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28 70  qlite3_errcode(p
a190: 44 62 2d 3e 64 62 29 20 29 7b 0a 20 20 20 20 20  Db->db) ){.     
a1a0: 20 20 20 2f 2a 20 41 20 63 6f 6d 70 69 6c 65 2d     /* A compile-
a1b0: 74 69 6d 65 20 65 72 72 6f 72 20 69 6e 20 74 68  time error in th
a1c0: 65 20 73 74 61 74 65 6d 65 6e 74 2e 20 2a 2f 0a  e statement. */.
a1d0: 20 20 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f          Tcl_SetO
a1e0: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
a1f0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
a200: 6a 28 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  j(sqlite3_errmsg
a210: 28 70 44 62 2d 3e 64 62 29 2c 20 2d 31 29 29 3b  (pDb->db), -1));
a220: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
a230: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  TCL_ERROR;.     
a240: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
a250: 2f 2a 20 54 68 65 20 73 74 61 74 65 6d 65 6e 74  /* The statement
a260: 20 77 61 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 43   was a no-op.  C
a270: 6f 6e 74 69 6e 75 65 20 74 6f 20 74 68 65 20 6e  ontinue to the n
a280: 65 78 74 20 73 74 61 74 65 6d 65 6e 74 0a 20 20  ext statement.  
a290: 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20        ** in the 
a2a0: 53 51 4c 20 73 74 72 69 6e 67 2e 0a 20 20 20 20  SQL string..    
a2b0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72      */.        r
a2c0: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20  eturn TCL_OK;.  
a2d0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
a2e0: 20 61 73 73 65 72 74 28 20 70 50 72 65 53 74 6d   assert( pPreStm
a2f0: 74 3d 3d 30 20 29 3b 0a 20 20 20 20 6e 56 61 72  t==0 );.    nVar
a300: 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f   = sqlite3_bind_
a310: 70 61 72 61 6d 65 74 65 72 5f 63 6f 75 6e 74 28  parameter_count(
a320: 70 53 74 6d 74 29 3b 0a 20 20 20 20 6e 42 79 74  pStmt);.    nByt
a330: 65 20 3d 20 73 69 7a 65 6f 66 28 53 71 6c 50 72  e = sizeof(SqlPr
a340: 65 70 61 72 65 64 53 74 6d 74 29 20 2b 20 6e 56  eparedStmt) + nV
a350: 61 72 2a 73 69 7a 65 6f 66 28 54 63 6c 5f 4f 62  ar*sizeof(Tcl_Ob
a360: 6a 20 2a 29 3b 0a 20 20 20 20 70 50 72 65 53 74  j *);.    pPreSt
a370: 6d 74 20 3d 20 28 53 71 6c 50 72 65 70 61 72 65  mt = (SqlPrepare
a380: 64 53 74 6d 74 2a 29 54 63 6c 5f 41 6c 6c 6f 63  dStmt*)Tcl_Alloc
a390: 28 6e 42 79 74 65 29 3b 0a 20 20 20 20 6d 65 6d  (nByte);.    mem
a3a0: 73 65 74 28 70 50 72 65 53 74 6d 74 2c 20 30 2c  set(pPreStmt, 0,
a3b0: 20 6e 42 79 74 65 29 3b 0a 0a 20 20 20 20 70 50   nByte);..    pP
a3c0: 72 65 53 74 6d 74 2d 3e 70 53 74 6d 74 20 3d 20  reStmt->pStmt = 
a3d0: 70 53 74 6d 74 3b 0a 20 20 20 20 70 50 72 65 53  pStmt;.    pPreS
a3e0: 74 6d 74 2d 3e 6e 53 71 6c 20 3d 20 28 69 6e 74  tmt->nSql = (int
a3f0: 29 28 2a 70 7a 4f 75 74 20 2d 20 7a 53 71 6c 29  )(*pzOut - zSql)
a400: 3b 0a 20 20 20 20 70 50 72 65 53 74 6d 74 2d 3e  ;.    pPreStmt->
a410: 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 73  zSql = sqlite3_s
a420: 71 6c 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 70  ql(pStmt);.    p
a430: 50 72 65 53 74 6d 74 2d 3e 61 70 50 61 72 6d 20  PreStmt->apParm 
a440: 3d 20 28 54 63 6c 5f 4f 62 6a 20 2a 2a 29 26 70  = (Tcl_Obj **)&p
a450: 50 72 65 53 74 6d 74 5b 31 5d 3b 0a 23 69 66 64  PreStmt[1];.#ifd
a460: 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
a470: 20 20 20 69 66 28 20 70 50 72 65 53 74 6d 74 2d     if( pPreStmt-
a480: 3e 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  >zSql==0 ){.    
a490: 20 20 63 68 61 72 20 2a 7a 43 6f 70 79 20 3d 20    char *zCopy = 
a4a0: 54 63 6c 5f 41 6c 6c 6f 63 28 70 50 72 65 53 74  Tcl_Alloc(pPreSt
a4b0: 6d 74 2d 3e 6e 53 71 6c 20 2b 20 31 29 3b 0a 20  mt->nSql + 1);. 
a4c0: 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 43 6f 70       memcpy(zCop
a4d0: 79 2c 20 7a 53 71 6c 2c 20 70 50 72 65 53 74 6d  y, zSql, pPreStm
a4e0: 74 2d 3e 6e 53 71 6c 29 3b 0a 20 20 20 20 20 20  t->nSql);.      
a4f0: 7a 43 6f 70 79 5b 70 50 72 65 53 74 6d 74 2d 3e  zCopy[pPreStmt->
a500: 6e 53 71 6c 5d 20 3d 20 27 5c 30 27 3b 0a 20 20  nSql] = '\0';.  
a510: 20 20 20 20 70 50 72 65 53 74 6d 74 2d 3e 7a 53      pPreStmt->zS
a520: 71 6c 20 3d 20 7a 43 6f 70 79 3b 0a 20 20 20 20  ql = zCopy;.    
a530: 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 61  }.#endif.  }.  a
a540: 73 73 65 72 74 28 20 70 50 72 65 53 74 6d 74 20  ssert( pPreStmt 
a550: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 74 72  );.  assert( str
a560: 6c 65 6e 33 30 28 70 50 72 65 53 74 6d 74 2d 3e  len30(pPreStmt->
a570: 7a 53 71 6c 29 3d 3d 70 50 72 65 53 74 6d 74 2d  zSql)==pPreStmt-
a580: 3e 6e 53 71 6c 20 29 3b 0a 20 20 61 73 73 65 72  >nSql );.  asser
a590: 74 28 20 30 3d 3d 6d 65 6d 63 6d 70 28 70 50 72  t( 0==memcmp(pPr
a5a0: 65 53 74 6d 74 2d 3e 7a 53 71 6c 2c 20 7a 53 71  eStmt->zSql, zSq
a5b0: 6c 2c 20 70 50 72 65 53 74 6d 74 2d 3e 6e 53 71  l, pPreStmt->nSq
a5c0: 6c 29 20 29 3b 0a 0a 20 20 2f 2a 20 42 69 6e 64  l) );..  /* Bind
a5d0: 20 76 61 6c 75 65 73 20 74 6f 20 70 61 72 61 6d   values to param
a5e0: 65 74 65 72 73 20 74 68 61 74 20 62 65 67 69 6e  eters that begin
a5f0: 20 77 69 74 68 20 24 20 6f 72 20 3a 20 2a 2f 0a   with $ or : */.
a600: 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 6e 56    for(i=1; i<=nV
a610: 61 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6f  ar; i++){.    co
a620: 6e 73 74 20 63 68 61 72 20 2a 7a 56 61 72 20 3d  nst char *zVar =
a630: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61   sqlite3_bind_pa
a640: 72 61 6d 65 74 65 72 5f 6e 61 6d 65 28 70 53 74  rameter_name(pSt
a650: 6d 74 2c 20 69 29 3b 0a 20 20 20 20 69 66 28 20  mt, i);.    if( 
a660: 7a 56 61 72 21 3d 30 20 26 26 20 28 7a 56 61 72  zVar!=0 && (zVar
a670: 5b 30 5d 3d 3d 27 24 27 20 7c 7c 20 7a 56 61 72  [0]=='$' || zVar
a680: 5b 30 5d 3d 3d 27 3a 27 20 7c 7c 20 7a 56 61 72  [0]==':' || zVar
a690: 5b 30 5d 3d 3d 27 40 27 29 20 29 7b 0a 20 20 20  [0]=='@') ){.   
a6a0: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 56 61 72     Tcl_Obj *pVar
a6b0: 20 3d 20 54 63 6c 5f 47 65 74 56 61 72 32 45 78   = Tcl_GetVar2Ex
a6c0: 28 69 6e 74 65 72 70 2c 20 26 7a 56 61 72 5b 31  (interp, &zVar[1
a6d0: 5d 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  ], 0, 0);.      
a6e0: 69 66 28 20 70 56 61 72 20 29 7b 0a 20 20 20 20  if( pVar ){.    
a6f0: 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20      int n;.     
a700: 20 20 20 75 38 20 2a 64 61 74 61 3b 0a 20 20 20     u8 *data;.   
a710: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
a720: 2a 7a 54 79 70 65 20 3d 20 28 70 56 61 72 2d 3e  *zType = (pVar->
a730: 74 79 70 65 50 74 72 20 3f 20 70 56 61 72 2d 3e  typePtr ? pVar->
a740: 74 79 70 65 50 74 72 2d 3e 6e 61 6d 65 20 3a 20  typePtr->name : 
a750: 22 22 29 3b 0a 20 20 20 20 20 20 20 20 63 20 3d  "");.        c =
a760: 20 7a 54 79 70 65 5b 30 5d 3b 0a 20 20 20 20 20   zType[0];.     
a770: 20 20 20 69 66 28 20 7a 56 61 72 5b 30 5d 3d 3d     if( zVar[0]==
a780: 27 40 27 20 7c 7c 0a 20 20 20 20 20 20 20 20 20  '@' ||.         
a790: 20 20 28 63 3d 3d 27 62 27 20 26 26 20 73 74 72    (c=='b' && str
a7a0: 63 6d 70 28 7a 54 79 70 65 2c 22 62 79 74 65 61  cmp(zType,"bytea
a7b0: 72 72 61 79 22 29 3d 3d 30 20 26 26 20 70 56 61  rray")==0 && pVa
a7c0: 72 2d 3e 62 79 74 65 73 3d 3d 30 29 20 29 7b 0a  r->bytes==0) ){.
a7d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 61            /* Loa
a7e0: 64 20 61 20 42 4c 4f 42 20 74 79 70 65 20 69 66  d a BLOB type if
a7f0: 20 74 68 65 20 54 63 6c 20 76 61 72 69 61 62 6c   the Tcl variabl
a800: 65 20 69 73 20 61 20 62 79 74 65 61 72 72 61 79  e is a bytearray
a810: 20 61 6e 64 0a 20 20 20 20 20 20 20 20 20 20 2a   and.          *
a820: 2a 20 69 74 20 68 61 73 20 6e 6f 20 73 74 72 69  * it has no stri
a830: 6e 67 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  ng representatio
a840: 6e 20 6f 72 20 74 68 65 20 68 6f 73 74 0a 20 20  n or the host.  
a850: 20 20 20 20 20 20 20 20 2a 2a 20 70 61 72 61 6d          ** param
a860: 65 74 65 72 20 6e 61 6d 65 20 62 65 67 69 6e 73  eter name begins
a870: 20 77 69 74 68 20 22 40 22 2e 20 2a 2f 0a 20 20   with "@". */.  
a880: 20 20 20 20 20 20 20 20 64 61 74 61 20 3d 20 54          data = T
a890: 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79 46  cl_GetByteArrayF
a8a0: 72 6f 6d 4f 62 6a 28 70 56 61 72 2c 20 26 6e 29  romObj(pVar, &n)
a8b0: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
a8c0: 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 28 70 53  te3_bind_blob(pS
a8d0: 74 6d 74 2c 20 69 2c 20 64 61 74 61 2c 20 6e 2c  tmt, i, data, n,
a8e0: 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b   SQLITE_STATIC);
a8f0: 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 49  .          Tcl_I
a900: 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 56 61 72  ncrRefCount(pVar
a910: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 72  );.          pPr
a920: 65 53 74 6d 74 2d 3e 61 70 50 61 72 6d 5b 69 50  eStmt->apParm[iP
a930: 61 72 6d 2b 2b 5d 20 3d 20 70 56 61 72 3b 0a 20  arm++] = pVar;. 
a940: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
a950: 20 63 3d 3d 27 62 27 20 26 26 20 73 74 72 63 6d   c=='b' && strcm
a960: 70 28 7a 54 79 70 65 2c 22 62 6f 6f 6c 65 61 6e  p(zType,"boolean
a970: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
a980: 20 20 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f     Tcl_GetIntFro
a990: 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 70 56 61  mObj(interp, pVa
a9a0: 72 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 20 20  r, &n);.        
a9b0: 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69    sqlite3_bind_i
a9c0: 6e 74 28 70 53 74 6d 74 2c 20 69 2c 20 6e 29 3b  nt(pStmt, i, n);
a9d0: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
a9e0: 66 28 20 63 3d 3d 27 64 27 20 26 26 20 73 74 72  f( c=='d' && str
a9f0: 63 6d 70 28 7a 54 79 70 65 2c 22 64 6f 75 62 6c  cmp(zType,"doubl
aa00: 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  e")==0 ){.      
aa10: 20 20 20 20 64 6f 75 62 6c 65 20 72 3b 0a 20 20      double r;.  
aa20: 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 44          Tcl_GetD
aa30: 6f 75 62 6c 65 46 72 6f 6d 4f 62 6a 28 69 6e 74  oubleFromObj(int
aa40: 65 72 70 2c 20 70 56 61 72 2c 20 26 72 29 3b 0a  erp, pVar, &r);.
aa50: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
aa60: 33 5f 62 69 6e 64 5f 64 6f 75 62 6c 65 28 70 53  3_bind_double(pS
aa70: 74 6d 74 2c 20 69 2c 20 72 29 3b 0a 20 20 20 20  tmt, i, r);.    
aa80: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 63      }else if( (c
aa90: 3d 3d 27 77 27 20 26 26 20 73 74 72 63 6d 70 28  =='w' && strcmp(
aaa0: 7a 54 79 70 65 2c 22 77 69 64 65 49 6e 74 22 29  zType,"wideInt")
aab0: 3d 3d 30 29 20 7c 7c 0a 20 20 20 20 20 20 20 20  ==0) ||.        
aac0: 20 20 20 20 20 20 28 63 3d 3d 27 69 27 20 26 26        (c=='i' &&
aad0: 20 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22 69   strcmp(zType,"i
aae0: 6e 74 22 29 3d 3d 30 29 20 29 7b 0a 20 20 20 20  nt")==0) ){.    
aaf0: 20 20 20 20 20 20 54 63 6c 5f 57 69 64 65 49 6e        Tcl_WideIn
ab00: 74 20 76 3b 0a 20 20 20 20 20 20 20 20 20 20 54  t v;.          T
ab10: 63 6c 5f 47 65 74 57 69 64 65 49 6e 74 46 72 6f  cl_GetWideIntFro
ab20: 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 70 56 61  mObj(interp, pVa
ab30: 72 2c 20 26 76 29 3b 0a 20 20 20 20 20 20 20 20  r, &v);.        
ab40: 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69    sqlite3_bind_i
ab50: 6e 74 36 34 28 70 53 74 6d 74 2c 20 69 2c 20 76  nt64(pStmt, i, v
ab60: 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
ab70: 7b 0a 20 20 20 20 20 20 20 20 20 20 64 61 74 61  {.          data
ab80: 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61   = (unsigned cha
ab90: 72 20 2a 29 54 63 6c 5f 47 65 74 53 74 72 69 6e  r *)Tcl_GetStrin
aba0: 67 46 72 6f 6d 4f 62 6a 28 70 56 61 72 2c 20 26  gFromObj(pVar, &
abb0: 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  n);.          sq
abc0: 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28  lite3_bind_text(
abd0: 70 53 74 6d 74 2c 20 69 2c 20 28 63 68 61 72 20  pStmt, i, (char 
abe0: 2a 29 64 61 74 61 2c 20 6e 2c 20 53 51 4c 49 54  *)data, n, SQLIT
abf0: 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20  E_STATIC);.     
ac00: 20 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66       Tcl_IncrRef
ac10: 43 6f 75 6e 74 28 70 56 61 72 29 3b 0a 20 20 20  Count(pVar);.   
ac20: 20 20 20 20 20 20 20 70 50 72 65 53 74 6d 74 2d         pPreStmt-
ac30: 3e 61 70 50 61 72 6d 5b 69 50 61 72 6d 2b 2b 5d  >apParm[iParm++]
ac40: 20 3d 20 70 56 61 72 3b 0a 20 20 20 20 20 20 20   = pVar;.       
ac50: 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
ac60: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
ac70: 62 69 6e 64 5f 6e 75 6c 6c 28 70 53 74 6d 74 2c  bind_null(pStmt,
ac80: 20 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   i);.      }.   
ac90: 20 7d 0a 20 20 7d 0a 20 20 70 50 72 65 53 74 6d   }.  }.  pPreStm
aca0: 74 2d 3e 6e 50 61 72 6d 20 3d 20 69 50 61 72 6d  t->nParm = iParm
acb0: 3b 0a 20 20 2a 70 70 50 72 65 53 74 6d 74 20 3d  ;.  *ppPreStmt =
acc0: 20 70 50 72 65 53 74 6d 74 3b 0a 0a 20 20 72 65   pPreStmt;..  re
acd0: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
ace0: 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20  /*.** Release a 
acf0: 73 74 61 74 65 6d 65 6e 74 20 72 65 66 65 72 65  statement refere
ad00: 6e 63 65 20 6f 62 74 61 69 6e 65 64 20 62 79 20  nce obtained by 
ad10: 63 61 6c 6c 69 6e 67 20 64 62 50 72 65 70 61 72  calling dbPrepar
ad20: 65 41 6e 64 42 69 6e 64 28 29 2e 0a 2a 2a 20 54  eAndBind()..** T
ad30: 68 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20 65  here should be e
ad40: 78 61 63 74 6c 79 20 6f 6e 65 20 63 61 6c 6c 20  xactly one call 
ad50: 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
ad60: 20 66 6f 72 20 65 61 63 68 20 63 61 6c 6c 20 74   for each call t
ad70: 6f 0a 2a 2a 20 64 62 50 72 65 70 61 72 65 41 6e  o.** dbPrepareAn
ad80: 64 42 69 6e 64 28 29 2e 0a 2a 2a 0a 2a 2a 20 49  dBind()..**.** I
ad90: 66 20 74 68 65 20 64 69 73 63 61 72 64 20 70 61  f the discard pa
ada0: 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a  rameter is non-z
adb0: 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 73 74  ero, then the st
adc0: 61 74 65 6d 65 6e 74 20 69 73 20 64 65 6c 65 74  atement is delet
add0: 65 64 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c  ed.** immediatel
ade0: 79 2e 20 4f 74 68 65 72 77 69 73 65 20 69 74 20  y. Otherwise it 
adf0: 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  is added to the 
ae00: 4c 52 55 20 6c 69 73 74 20 61 6e 64 20 6d 61 79  LRU list and may
ae10: 20 62 65 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20   be returned.** 
ae20: 62 79 20 61 20 73 75 62 73 65 71 75 65 6e 74 20  by a subsequent 
ae30: 63 61 6c 6c 20 74 6f 20 64 62 50 72 65 70 61 72  call to dbPrepar
ae40: 65 41 6e 64 42 69 6e 64 28 29 2e 0a 2a 2f 0a 73  eAndBind()..*/.s
ae50: 74 61 74 69 63 20 76 6f 69 64 20 64 62 52 65 6c  tatic void dbRel
ae60: 65 61 73 65 53 74 6d 74 28 0a 20 20 53 71 6c 69  easeStmt(.  Sqli
ae70: 74 65 44 62 20 2a 70 44 62 2c 20 20 20 20 20 20  teDb *pDb,      
ae80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
ae90: 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a  atabase handle *
aea0: 2f 0a 20 20 53 71 6c 50 72 65 70 61 72 65 64 53  /.  SqlPreparedS
aeb0: 74 6d 74 20 2a 70 50 72 65 53 74 6d 74 2c 20 20  tmt *pPreStmt,  
aec0: 20 20 20 20 2f 2a 20 50 72 65 70 61 72 65 64 20      /* Prepared 
aed0: 73 74 61 74 65 6d 65 6e 74 20 68 61 6e 64 6c 65  statement handle
aee0: 20 74 6f 20 72 65 6c 65 61 73 65 20 2a 2f 0a 20   to release */. 
aef0: 20 69 6e 74 20 64 69 73 63 61 72 64 20 20 20 20   int discard    
af00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
af10: 20 2f 2a 20 54 72 75 65 20 74 6f 20 64 65 6c 65   /* True to dele
af20: 74 65 20 28 6e 6f 74 20 63 61 63 68 65 29 20 74  te (not cache) t
af30: 68 65 20 70 50 72 65 53 74 6d 74 20 2a 2f 0a 29  he pPreStmt */.)
af40: 7b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a  {.  int i;..  /*
af50: 20 46 72 65 65 20 74 68 65 20 62 6f 75 6e 64 20   Free the bound 
af60: 73 74 72 69 6e 67 20 61 6e 64 20 62 6c 6f 62 20  string and blob 
af70: 70 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20  parameters */.  
af80: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 72 65 53  for(i=0; i<pPreS
af90: 74 6d 74 2d 3e 6e 50 61 72 6d 3b 20 69 2b 2b 29  tmt->nParm; i++)
afa0: 7b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65  {.    Tcl_DecrRe
afb0: 66 43 6f 75 6e 74 28 70 50 72 65 53 74 6d 74 2d  fCount(pPreStmt-
afc0: 3e 61 70 50 61 72 6d 5b 69 5d 29 3b 0a 20 20 7d  >apParm[i]);.  }
afd0: 0a 20 20 70 50 72 65 53 74 6d 74 2d 3e 6e 50 61  .  pPreStmt->nPa
afe0: 72 6d 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70  rm = 0;..  if( p
aff0: 44 62 2d 3e 6d 61 78 53 74 6d 74 3c 3d 30 20 7c  Db->maxStmt<=0 |
b000: 7c 20 64 69 73 63 61 72 64 20 29 7b 0a 20 20 20  | discard ){.   
b010: 20 2f 2a 20 49 66 20 74 68 65 20 63 61 63 68 65   /* If the cache
b020: 20 69 73 20 74 75 72 6e 65 64 20 6f 66 66 2c 20   is turned off, 
b030: 64 65 61 6c 6c 6f 63 61 74 65 64 20 74 68 65 20  deallocated the 
b040: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20  statement */.   
b050: 20 64 62 46 72 65 65 53 74 6d 74 28 70 50 72 65   dbFreeStmt(pPre
b060: 53 74 6d 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Stmt);.  }else{.
b070: 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 70      /* Add the p
b080: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
b090: 74 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69  t to the beginni
b0a0: 6e 67 20 6f 66 20 74 68 65 20 63 61 63 68 65 20  ng of the cache 
b0b0: 6c 69 73 74 2e 20 2a 2f 0a 20 20 20 20 70 50 72  list. */.    pPr
b0c0: 65 53 74 6d 74 2d 3e 70 4e 65 78 74 20 3d 20 70  eStmt->pNext = p
b0d0: 44 62 2d 3e 73 74 6d 74 4c 69 73 74 3b 0a 20 20  Db->stmtList;.  
b0e0: 20 20 70 50 72 65 53 74 6d 74 2d 3e 70 50 72 65    pPreStmt->pPre
b0f0: 76 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70  v = 0;.    if( p
b100: 44 62 2d 3e 73 74 6d 74 4c 69 73 74 20 29 7b 0a  Db->stmtList ){.
b110: 20 20 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c 69       pDb->stmtLi
b120: 73 74 2d 3e 70 50 72 65 76 20 3d 20 70 50 72 65  st->pPrev = pPre
b130: 53 74 6d 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Stmt;.    }.    
b140: 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74 20 3d 20  pDb->stmtList = 
b150: 70 50 72 65 53 74 6d 74 3b 0a 20 20 20 20 69 66  pPreStmt;.    if
b160: 28 20 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74 3d  ( pDb->stmtLast=
b170: 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  =0 ){.      asse
b180: 72 74 28 20 70 44 62 2d 3e 6e 53 74 6d 74 3d 3d  rt( pDb->nStmt==
b190: 30 20 29 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e  0 );.      pDb->
b1a0: 73 74 6d 74 4c 61 73 74 20 3d 20 70 50 72 65 53  stmtLast = pPreS
b1b0: 74 6d 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  tmt;.    }else{.
b1c0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 44        assert( pD
b1d0: 62 2d 3e 6e 53 74 6d 74 3e 30 20 29 3b 0a 20 20  b->nStmt>0 );.  
b1e0: 20 20 7d 0a 20 20 20 20 70 44 62 2d 3e 6e 53 74    }.    pDb->nSt
b1f0: 6d 74 2b 2b 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  mt++;..    /* If
b200: 20 77 65 20 68 61 76 65 20 74 6f 6f 20 6d 61 6e   we have too man
b210: 79 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 63  y statement in c
b220: 61 63 68 65 2c 20 72 65 6d 6f 76 65 20 74 68 65  ache, remove the
b230: 20 73 75 72 70 6c 75 73 20 66 72 6f 6d 0a 20 20   surplus from.  
b240: 20 20 2a 2a 20 74 68 65 20 65 6e 64 20 6f 66 20    ** the end of 
b250: 74 68 65 20 63 61 63 68 65 20 6c 69 73 74 2e 20  the cache list. 
b260: 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28 20 70   */.    while( p
b270: 44 62 2d 3e 6e 53 74 6d 74 3e 70 44 62 2d 3e 6d  Db->nStmt>pDb->m
b280: 61 78 53 74 6d 74 20 29 7b 0a 20 20 20 20 20 20  axStmt ){.      
b290: 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74 20  SqlPreparedStmt 
b2a0: 2a 70 4c 61 73 74 20 3d 20 70 44 62 2d 3e 73 74  *pLast = pDb->st
b2b0: 6d 74 4c 61 73 74 3b 0a 20 20 20 20 20 20 70 44  mtLast;.      pD
b2c0: 62 2d 3e 73 74 6d 74 4c 61 73 74 20 3d 20 70 4c  b->stmtLast = pL
b2d0: 61 73 74 2d 3e 70 50 72 65 76 3b 0a 20 20 20 20  ast->pPrev;.    
b2e0: 20 20 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74 2d    pDb->stmtLast-
b2f0: 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20  >pNext = 0;.    
b300: 20 20 70 44 62 2d 3e 6e 53 74 6d 74 2d 2d 3b 0a    pDb->nStmt--;.
b310: 20 20 20 20 20 20 64 62 46 72 65 65 53 74 6d 74        dbFreeStmt
b320: 28 70 4c 61 73 74 29 3b 0a 20 20 20 20 7d 0a 20  (pLast);.    }. 
b330: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 72 75   }.}../*.** Stru
b340: 63 74 75 72 65 20 75 73 65 64 20 77 69 74 68 20  cture used with 
b350: 64 62 45 76 61 6c 58 58 58 28 29 20 66 75 6e 63  dbEvalXXX() func
b360: 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 64  tions:.**.**   d
b370: 62 45 76 61 6c 49 6e 69 74 28 29 0a 2a 2a 20 20  bEvalInit().**  
b380: 20 64 62 45 76 61 6c 53 74 65 70 28 29 0a 2a 2a   dbEvalStep().**
b390: 20 20 20 64 62 45 76 61 6c 46 69 6e 61 6c 69 7a     dbEvalFinaliz
b3a0: 65 28 29 0a 2a 2a 20 20 20 64 62 45 76 61 6c 52  e().**   dbEvalR
b3b0: 6f 77 49 6e 66 6f 28 29 0a 2a 2a 20 20 20 64 62  owInfo().**   db
b3c0: 45 76 61 6c 43 6f 6c 75 6d 6e 56 61 6c 75 65 28  EvalColumnValue(
b3d0: 29 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  ).*/.typedef str
b3e0: 75 63 74 20 44 62 45 76 61 6c 43 6f 6e 74 65 78  uct DbEvalContex
b3f0: 74 20 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 3b  t DbEvalContext;
b400: 0a 73 74 72 75 63 74 20 44 62 45 76 61 6c 43 6f  .struct DbEvalCo
b410: 6e 74 65 78 74 20 7b 0a 20 20 53 71 6c 69 74 65  ntext {.  Sqlite
b420: 44 62 20 2a 70 44 62 3b 20 20 20 20 20 20 20 20  Db *pDb;        
b430: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
b440: 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a  abase handle */.
b450: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 53 71 6c 3b    Tcl_Obj *pSql;
b460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b470: 20 20 2f 2a 20 4f 62 6a 65 63 74 20 68 6f 6c 64    /* Object hold
b480: 69 6e 67 20 73 74 72 69 6e 67 20 7a 53 71 6c 20  ing string zSql 
b490: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
b4a0: 2a 7a 53 71 6c 3b 20 20 20 20 20 20 20 20 20 20  *zSql;          
b4b0: 20 20 20 20 20 2f 2a 20 52 65 6d 61 69 6e 69 6e       /* Remainin
b4c0: 67 20 53 51 4c 20 74 6f 20 65 78 65 63 75 74 65  g SQL to execute
b4d0: 20 2a 2f 0a 20 20 53 71 6c 50 72 65 70 61 72 65   */.  SqlPrepare
b4e0: 64 53 74 6d 74 20 2a 70 50 72 65 53 74 6d 74 3b  dStmt *pPreStmt;
b4f0: 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
b500: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
b510: 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20  int nCol;       
b520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b530: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  /* Number of col
b540: 75 6d 6e 73 20 72 65 74 75 72 6e 65 64 20 62 79  umns returned by
b550: 20 70 53 74 6d 74 20 2a 2f 0a 20 20 54 63 6c 5f   pStmt */.  Tcl_
b560: 4f 62 6a 20 2a 70 41 72 72 61 79 3b 20 20 20 20  Obj *pArray;    
b570: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
b580: 61 6d 65 20 6f 66 20 61 72 72 61 79 20 76 61 72  ame of array var
b590: 69 61 62 6c 65 20 2a 2f 0a 20 20 54 63 6c 5f 4f  iable */.  Tcl_O
b5a0: 62 6a 20 2a 2a 61 70 43 6f 6c 4e 61 6d 65 3b 20  bj **apColName; 
b5b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72             /* Ar
b5c0: 72 61 79 20 6f 66 20 63 6f 6c 75 6d 6e 20 6e 61  ray of column na
b5d0: 6d 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  mes */.};../*.**
b5e0: 20 52 65 6c 65 61 73 65 20 61 6e 79 20 63 61 63   Release any cac
b5f0: 68 65 20 6f 66 20 63 6f 6c 75 6d 6e 20 6e 61 6d  he of column nam
b600: 65 73 20 63 75 72 72 65 6e 74 6c 79 20 68 65 6c  es currently hel
b610: 64 20 61 73 20 70 61 72 74 20 6f 66 0a 2a 2a 20  d as part of.** 
b620: 74 68 65 20 44 62 45 76 61 6c 43 6f 6e 74 65 78  the DbEvalContex
b630: 74 20 73 74 72 75 63 74 75 72 65 20 70 61 73 73  t structure pass
b640: 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ed as the first 
b650: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61  argument..*/.sta
b660: 74 69 63 20 76 6f 69 64 20 64 62 52 65 6c 65 61  tic void dbRelea
b670: 73 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 44 62  seColumnNames(Db
b680: 45 76 61 6c 43 6f 6e 74 65 78 74 20 2a 70 29 7b  EvalContext *p){
b690: 0a 20 20 69 66 28 20 70 2d 3e 61 70 43 6f 6c 4e  .  if( p->apColN
b6a0: 61 6d 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ame ){.    int i
b6b0: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
b6c0: 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  <p->nCol; i++){.
b6d0: 20 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65        Tcl_DecrRe
b6e0: 66 43 6f 75 6e 74 28 70 2d 3e 61 70 43 6f 6c 4e  fCount(p->apColN
b6f0: 61 6d 65 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20  ame[i]);.    }. 
b700: 20 20 20 54 63 6c 5f 46 72 65 65 28 28 63 68 61     Tcl_Free((cha
b710: 72 20 2a 29 70 2d 3e 61 70 43 6f 6c 4e 61 6d 65  r *)p->apColName
b720: 29 3b 0a 20 20 20 20 70 2d 3e 61 70 43 6f 6c 4e  );.    p->apColN
b730: 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70  ame = 0;.  }.  p
b740: 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 7d 0a 0a 2f  ->nCol = 0;.}../
b750: 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  *.** Initialize 
b760: 61 20 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 20  a DbEvalContext 
b770: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a  structure..**.**
b780: 20 49 66 20 70 41 72 72 61 79 20 69 73 20 6e 6f   If pArray is no
b790: 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 69 74 20  t NULL, then it 
b7a0: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e 61 6d  contains the nam
b7b0: 65 20 6f 66 20 61 20 54 63 6c 20 61 72 72 61 79  e of a Tcl array
b7c0: 0a 2a 2a 20 76 61 72 69 61 62 6c 65 2e 20 54 68  .** variable. Th
b7d0: 65 20 22 2a 22 20 6d 65 6d 62 65 72 20 6f 66 20  e "*" member of 
b7e0: 74 68 69 73 20 61 72 72 61 79 20 69 73 20 73 65  this array is se
b7f0: 74 20 74 6f 20 61 20 6c 69 73 74 20 63 6f 6e 74  t to a list cont
b800: 61 69 6e 69 6e 67 0a 2a 2a 20 74 68 65 20 6e 61  aining.** the na
b810: 6d 65 73 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  mes of the colum
b820: 6e 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  ns returned by t
b830: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 61 73 20  he statement as 
b840: 70 61 72 74 20 6f 66 20 65 61 63 68 0a 2a 2a 20  part of each.** 
b850: 63 61 6c 6c 20 74 6f 20 64 62 45 76 61 6c 53 74  call to dbEvalSt
b860: 65 70 28 29 2c 20 69 6e 20 6f 72 64 65 72 20 66  ep(), in order f
b870: 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68  rom left to righ
b880: 74 2e 20 65 2e 67 2e 20 69 66 20 74 68 65 20 6e  t. e.g. if the n
b890: 61 6d 65 73 0a 2a 2a 20 6f 66 20 74 68 65 20 72  ames.** of the r
b8a0: 65 74 75 72 6e 65 64 20 63 6f 6c 75 6d 6e 73 20  eturned columns 
b8b0: 61 72 65 20 61 2c 20 62 20 61 6e 64 20 63 2c 20  are a, b and c, 
b8c0: 69 74 20 64 6f 65 73 20 74 68 65 20 65 71 75 69  it does the equi
b8d0: 76 61 6c 65 6e 74 20 6f 66 20 74 68 65 0a 2a 2a  valent of the.**
b8e0: 20 74 63 6c 20 63 6f 6d 6d 61 6e 64 3a 0a 2a 2a   tcl command:.**
b8f0: 0a 2a 2a 20 20 20 20 20 73 65 74 20 24 7b 70 41  .**     set ${pA
b900: 72 72 61 79 7d 28 2a 29 20 7b 61 20 62 20 63 7d  rray}(*) {a b c}
b910: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
b920: 64 62 45 76 61 6c 49 6e 69 74 28 0a 20 20 44 62  dbEvalInit(.  Db
b930: 45 76 61 6c 43 6f 6e 74 65 78 74 20 2a 70 2c 20  EvalContext *p, 
b940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b950: 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 74 72 75   Pointer to stru
b960: 63 74 75 72 65 20 74 6f 20 69 6e 69 74 69 61 6c  cture to initial
b970: 69 7a 65 20 2a 2f 0a 20 20 53 71 6c 69 74 65 44  ize */.  SqliteD
b980: 62 20 2a 70 44 62 2c 20 20 20 20 20 20 20 20 20  b *pDb,         
b990: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
b9a0: 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  base handle */. 
b9b0: 20 54 63 6c 5f 4f 62 6a 20 2a 70 53 71 6c 2c 20   Tcl_Obj *pSql, 
b9c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b9d0: 20 2f 2a 20 4f 62 6a 65 63 74 20 63 6f 6e 74 61   /* Object conta
b9e0: 69 6e 69 6e 67 20 53 51 4c 20 73 63 72 69 70 74  ining SQL script
b9f0: 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70   */.  Tcl_Obj *p
ba00: 41 72 72 61 79 20 20 20 20 20 20 20 20 20 20 20  Array           
ba10: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
ba20: 20 54 63 6c 20 61 72 72 61 79 20 74 6f 20 73 65   Tcl array to se
ba30: 74 20 28 2a 29 20 65 6c 65 6d 65 6e 74 20 6f 66  t (*) element of
ba40: 20 2a 2f 0a 29 7b 0a 20 20 6d 65 6d 73 65 74 28   */.){.  memset(
ba50: 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 44 62 45  p, 0, sizeof(DbE
ba60: 76 61 6c 43 6f 6e 74 65 78 74 29 29 3b 0a 20 20  valContext));.  
ba70: 70 2d 3e 70 44 62 20 3d 20 70 44 62 3b 0a 20 20  p->pDb = pDb;.  
ba80: 70 2d 3e 7a 53 71 6c 20 3d 20 54 63 6c 5f 47 65  p->zSql = Tcl_Ge
ba90: 74 53 74 72 69 6e 67 28 70 53 71 6c 29 3b 0a 20  tString(pSql);. 
baa0: 20 70 2d 3e 70 53 71 6c 20 3d 20 70 53 71 6c 3b   p->pSql = pSql;
bab0: 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f  .  Tcl_IncrRefCo
bac0: 75 6e 74 28 70 53 71 6c 29 3b 0a 20 20 69 66 28  unt(pSql);.  if(
bad0: 20 70 41 72 72 61 79 20 29 7b 0a 20 20 20 20 70   pArray ){.    p
bae0: 2d 3e 70 41 72 72 61 79 20 3d 20 70 41 72 72 61  ->pArray = pArra
baf0: 79 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52  y;.    Tcl_IncrR
bb00: 65 66 43 6f 75 6e 74 28 70 41 72 72 61 79 29 3b  efCount(pArray);
bb10: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 62  .  }.}../*.** Ob
bb20: 74 61 69 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  tain information
bb30: 20 61 62 6f 75 74 20 74 68 65 20 72 6f 77 20 74   about the row t
bb40: 68 61 74 20 74 68 65 20 44 62 45 76 61 6c 43 6f  hat the DbEvalCo
bb50: 6e 74 65 78 74 20 70 61 73 73 65 64 20 61 73 20  ntext passed as 
bb60: 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 61 72 67  the.** first arg
bb70: 75 6d 65 6e 74 20 63 75 72 72 65 6e 74 6c 79 20  ument currently 
bb80: 70 6f 69 6e 74 73 20 74 6f 2e 0a 2a 2f 0a 73 74  points to..*/.st
bb90: 61 74 69 63 20 76 6f 69 64 20 64 62 45 76 61 6c  atic void dbEval
bba0: 52 6f 77 49 6e 66 6f 28 0a 20 20 44 62 45 76 61  RowInfo(.  DbEva
bbb0: 6c 43 6f 6e 74 65 78 74 20 2a 70 2c 20 20 20 20  lContext *p,    
bbc0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 76             /* Ev
bbd0: 61 6c 75 61 74 69 6f 6e 20 63 6f 6e 74 65 78 74  aluation context
bbe0: 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 43 6f 6c   */.  int *pnCol
bbf0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
bc00: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 75        /* OUT: Nu
bc10: 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 20 6e  mber of column n
bc20: 61 6d 65 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62  ames */.  Tcl_Ob
bc30: 6a 20 2a 2a 2a 70 61 70 43 6f 6c 4e 61 6d 65 20  j ***papColName 
bc40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
bc50: 3a 20 41 72 72 61 79 20 6f 66 20 63 6f 6c 75 6d  : Array of colum
bc60: 6e 20 6e 61 6d 65 73 20 2a 2f 0a 29 7b 0a 20 20  n names */.){.  
bc70: 2f 2a 20 43 6f 6d 70 75 74 65 20 63 6f 6c 75 6d  /* Compute colum
bc80: 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 69 66 28  n names */.  if(
bc90: 20 30 3d 3d 70 2d 3e 61 70 43 6f 6c 4e 61 6d 65   0==p->apColName
bca0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
bcb0: 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 70 2d  stmt *pStmt = p-
bcc0: 3e 70 50 72 65 53 74 6d 74 2d 3e 70 53 74 6d 74  >pPreStmt->pStmt
bcd0: 3b 0a 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20  ;.    int i;    
bce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bcf0: 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20      /* Iterator 
bd00: 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 20 20  variable */.    
bd10: 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20  int nCol;       
bd20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
bd30: 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   Number of colum
bd40: 6e 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 70  ns returned by p
bd50: 53 74 6d 74 20 2a 2f 0a 20 20 20 20 54 63 6c 5f  Stmt */.    Tcl_
bd60: 4f 62 6a 20 2a 2a 61 70 43 6f 6c 4e 61 6d 65 20  Obj **apColName 
bd70: 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 41 72 72  = 0;      /* Arr
bd80: 61 79 20 6f 66 20 63 6f 6c 75 6d 6e 20 6e 61 6d  ay of column nam
bd90: 65 73 20 2a 2f 0a 0a 20 20 20 20 70 2d 3e 6e 43  es */..    p->nC
bda0: 6f 6c 20 3d 20 6e 43 6f 6c 20 3d 20 73 71 6c 69  ol = nCol = sqli
bdb0: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74  te3_column_count
bdc0: 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 69 66 28  (pStmt);.    if(
bdd0: 20 6e 43 6f 6c 3e 30 20 26 26 20 28 70 61 70 43   nCol>0 && (papC
bde0: 6f 6c 4e 61 6d 65 20 7c 7c 20 70 2d 3e 70 41 72  olName || p->pAr
bdf0: 72 61 79 29 20 29 7b 0a 20 20 20 20 20 20 61 70  ray) ){.      ap
be00: 43 6f 6c 4e 61 6d 65 20 3d 20 28 54 63 6c 5f 4f  ColName = (Tcl_O
be10: 62 6a 2a 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28 20  bj**)Tcl_Alloc( 
be20: 73 69 7a 65 6f 66 28 54 63 6c 5f 4f 62 6a 2a 29  sizeof(Tcl_Obj*)
be30: 2a 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20 66  *nCol );.      f
be40: 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20  or(i=0; i<nCol; 
be50: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 61 70  i++){.        ap
be60: 43 6f 6c 4e 61 6d 65 5b 69 5d 20 3d 20 54 63 6c  ColName[i] = Tcl
be70: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 73 71  _NewStringObj(sq
be80: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d  lite3_column_nam
be90: 65 28 70 53 74 6d 74 2c 69 29 2c 20 2d 31 29 3b  e(pStmt,i), -1);
bea0: 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 49 6e 63  .        Tcl_Inc
beb0: 72 52 65 66 43 6f 75 6e 74 28 61 70 43 6f 6c 4e  rRefCount(apColN
bec0: 61 6d 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d  ame[i]);.      }
bed0: 0a 20 20 20 20 20 20 70 2d 3e 61 70 43 6f 6c 4e  .      p->apColN
bee0: 61 6d 65 20 3d 20 61 70 43 6f 6c 4e 61 6d 65 3b  ame = apColName;
bef0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
bf00: 66 20 72 65 73 75 6c 74 73 20 61 72 65 20 62 65  f results are be
bf10: 69 6e 67 20 73 74 6f 72 65 64 20 69 6e 20 61 6e  ing stored in an
bf20: 20 61 72 72 61 79 20 76 61 72 69 61 62 6c 65 2c   array variable,
bf30: 20 74 68 65 6e 20 63 72 65 61 74 65 0a 20 20 20   then create.   
bf40: 20 2a 2a 20 74 68 65 20 61 72 72 61 79 28 2a 29   ** the array(*)
bf50: 20 65 6e 74 72 79 20 66 6f 72 20 74 68 61 74 20   entry for that 
bf60: 61 72 72 61 79 0a 20 20 20 20 2a 2f 0a 20 20 20  array.    */.   
bf70: 20 69 66 28 20 70 2d 3e 70 41 72 72 61 79 20 29   if( p->pArray )
bf80: 7b 0a 20 20 20 20 20 20 54 63 6c 5f 49 6e 74 65  {.      Tcl_Inte
bf90: 72 70 20 2a 69 6e 74 65 72 70 20 3d 20 70 2d 3e  rp *interp = p->
bfa0: 70 44 62 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20  pDb->interp;.   
bfb0: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 43 6f 6c     Tcl_Obj *pCol
bfc0: 4c 69 73 74 20 3d 20 54 63 6c 5f 4e 65 77 4f 62  List = Tcl_NewOb
bfd0: 6a 28 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 4f  j();.      Tcl_O
bfe0: 62 6a 20 2a 70 53 74 61 72 20 3d 20 54 63 6c 5f  bj *pStar = Tcl_
bff0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 2a 22  NewStringObj("*"
c000: 2c 20 2d 31 29 3b 0a 0a 20 20 20 20 20 20 66 6f  , -1);..      fo
c010: 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69  r(i=0; i<nCol; i
c020: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c  ++){.        Tcl
c030: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
c040: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 43  ement(interp, pC
c050: 6f 6c 4c 69 73 74 2c 20 61 70 43 6f 6c 4e 61 6d  olList, apColNam
c060: 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  e[i]);.      }. 
c070: 20 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66       Tcl_IncrRef
c080: 43 6f 75 6e 74 28 70 53 74 61 72 29 3b 0a 20 20  Count(pStar);.  
c090: 20 20 20 20 54 63 6c 5f 4f 62 6a 53 65 74 56 61      Tcl_ObjSetVa
c0a0: 72 32 28 69 6e 74 65 72 70 2c 20 70 2d 3e 70 41  r2(interp, p->pA
c0b0: 72 72 61 79 2c 20 70 53 74 61 72 2c 20 70 43 6f  rray, pStar, pCo
c0c0: 6c 4c 69 73 74 2c 20 30 29 3b 0a 20 20 20 20 20  lList, 0);.     
c0d0: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
c0e0: 74 28 70 53 74 61 72 29 3b 0a 20 20 20 20 7d 0a  t(pStar);.    }.
c0f0: 20 20 7d 0a 0a 20 20 69 66 28 20 70 61 70 43 6f    }..  if( papCo
c100: 6c 4e 61 6d 65 20 29 7b 0a 20 20 20 20 2a 70 61  lName ){.    *pa
c110: 70 43 6f 6c 4e 61 6d 65 20 3d 20 70 2d 3e 61 70  pColName = p->ap
c120: 43 6f 6c 4e 61 6d 65 3b 0a 20 20 7d 0a 20 20 69  ColName;.  }.  i
c130: 66 28 20 70 6e 43 6f 6c 20 29 7b 0a 20 20 20 20  f( pnCol ){.    
c140: 2a 70 6e 43 6f 6c 20 3d 20 70 2d 3e 6e 43 6f 6c  *pnCol = p->nCol
c150: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
c160: 65 74 75 72 6e 20 6f 6e 65 20 6f 66 20 54 43 4c  eturn one of TCL
c170: 5f 4f 4b 2c 20 54 43 4c 5f 42 52 45 41 4b 20 6f  _OK, TCL_BREAK o
c180: 72 20 54 43 4c 5f 45 52 52 4f 52 2e 20 49 66 20  r TCL_ERROR. If 
c190: 54 43 4c 5f 45 52 52 4f 52 20 69 73 0a 2a 2a 20  TCL_ERROR is.** 
c1a0: 72 65 74 75 72 6e 65 64 2c 20 74 68 65 6e 20 61  returned, then a
c1b0: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
c1c0: 69 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  is stored in the
c1d0: 20 69 6e 74 65 72 70 72 65 74 65 72 20 62 65 66   interpreter bef
c1e0: 6f 72 65 0a 2a 2a 20 72 65 74 75 72 6e 69 6e 67  ore.** returning
c1f0: 2e 0a 2a 2a 0a 2a 2a 20 41 20 72 65 74 75 72 6e  ..**.** A return
c200: 20 76 61 6c 75 65 20 6f 66 20 54 43 4c 5f 4f 4b   value of TCL_OK
c210: 20 6d 65 61 6e 73 20 74 68 65 72 65 20 69 73 20   means there is 
c220: 61 20 72 6f 77 20 6f 66 20 64 61 74 61 20 61 76  a row of data av
c230: 61 69 6c 61 62 6c 65 2e 20 54 68 65 0a 2a 2a 20  ailable. The.** 
c240: 64 61 74 61 20 6d 61 79 20 62 65 20 61 63 63 65  data may be acce
c250: 73 73 65 64 20 75 73 69 6e 67 20 64 62 45 76 61  ssed using dbEva
c260: 6c 52 6f 77 49 6e 66 6f 28 29 20 61 6e 64 20 64  lRowInfo() and d
c270: 62 45 76 61 6c 43 6f 6c 75 6d 6e 56 61 6c 75 65  bEvalColumnValue
c280: 28 29 2e 20 54 68 69 73 0a 2a 2a 20 69 73 20 61  (). This.** is a
c290: 6e 61 6c 6f 67 6f 75 73 20 74 6f 20 61 20 72 65  nalogous to a re
c2a0: 74 75 72 6e 20 6f 66 20 53 51 4c 49 54 45 5f 52  turn of SQLITE_R
c2b0: 4f 57 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f  OW from sqlite3_
c2c0: 73 74 65 70 28 29 2e 20 49 66 20 54 43 4c 5f 42  step(). If TCL_B
c2d0: 52 45 41 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72  REAK.** is retur
c2e0: 6e 65 64 2c 20 74 68 65 6e 20 74 68 65 20 53 51  ned, then the SQ
c2f0: 4c 20 73 63 72 69 70 74 20 68 61 73 20 66 69 6e  L script has fin
c300: 69 73 68 65 64 20 65 78 65 63 75 74 69 6e 67 20  ished executing 
c310: 61 6e 64 20 74 68 65 72 65 20 61 72 65 0a 2a 2a  and there are.**
c320: 20 6e 6f 20 66 75 72 74 68 65 72 20 72 6f 77 73   no further rows
c330: 20 61 76 61 69 6c 61 62 6c 65 2e 20 54 68 69 73   available. This
c340: 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 53   is similar to S
c350: 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 2a 2f 0a 73  QLITE_DONE..*/.s
c360: 74 61 74 69 63 20 69 6e 74 20 64 62 45 76 61 6c  tatic int dbEval
c370: 53 74 65 70 28 44 62 45 76 61 6c 43 6f 6e 74 65  Step(DbEvalConte
c380: 78 74 20 2a 70 29 7b 0a 20 20 63 6f 6e 73 74 20  xt *p){.  const 
c390: 63 68 61 72 20 2a 7a 50 72 65 76 53 71 6c 20 3d  char *zPrevSql =
c3a0: 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 50 72 65   0;       /* Pre
c3b0: 76 69 6f 75 73 20 76 61 6c 75 65 20 6f 66 20 70  vious value of p
c3c0: 2d 3e 7a 53 71 6c 20 2a 2f 0a 0a 20 20 77 68 69  ->zSql */..  whi
c3d0: 6c 65 28 20 70 2d 3e 7a 53 71 6c 5b 30 5d 20 7c  le( p->zSql[0] |
c3e0: 7c 20 70 2d 3e 70 50 72 65 53 74 6d 74 20 29 7b  | p->pPreStmt ){
c3f0: 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20  .    int rc;.   
c400: 20 69 66 28 20 70 2d 3e 70 50 72 65 53 74 6d 74   if( p->pPreStmt
c410: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 50 72  ==0 ){.      zPr
c420: 65 76 53 71 6c 20 3d 20 28 70 2d 3e 7a 53 71 6c  evSql = (p->zSql
c430: 3d 3d 7a 50 72 65 76 53 71 6c 20 3f 20 30 20 3a  ==zPrevSql ? 0 :
c440: 20 70 2d 3e 7a 53 71 6c 29 3b 0a 20 20 20 20 20   p->zSql);.     
c450: 20 72 63 20 3d 20 64 62 50 72 65 70 61 72 65 41   rc = dbPrepareA
c460: 6e 64 42 69 6e 64 28 70 2d 3e 70 44 62 2c 20 70  ndBind(p->pDb, p
c470: 2d 3e 7a 53 71 6c 2c 20 26 70 2d 3e 7a 53 71 6c  ->zSql, &p->zSql
c480: 2c 20 26 70 2d 3e 70 50 72 65 53 74 6d 74 29 3b  , &p->pPreStmt);
c490: 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 54  .      if( rc!=T
c4a0: 43 4c 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  CL_OK ) return r
c4b0: 63 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  c;.    }else{.  
c4c0: 20 20 20 20 69 6e 74 20 72 63 73 3b 0a 20 20 20      int rcs;.   
c4d0: 20 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62     SqliteDb *pDb
c4e0: 20 3d 20 70 2d 3e 70 44 62 3b 0a 20 20 20 20 20   = p->pDb;.     
c4f0: 20 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74   SqlPreparedStmt
c500: 20 2a 70 50 72 65 53 74 6d 74 20 3d 20 70 2d 3e   *pPreStmt = p->
c510: 70 50 72 65 53 74 6d 74 3b 0a 20 20 20 20 20 20  pPreStmt;.      
c520: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
c530: 74 6d 74 20 3d 20 70 50 72 65 53 74 6d 74 2d 3e  tmt = pPreStmt->
c540: 70 53 74 6d 74 3b 0a 0a 20 20 20 20 20 20 72 63  pStmt;..      rc
c550: 73 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70  s = sqlite3_step
c560: 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 69  (pStmt);.      i
c570: 66 28 20 72 63 73 3d 3d 53 51 4c 49 54 45 5f 52  f( rcs==SQLITE_R
c580: 4f 57 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  OW ){.        re
c590: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20  turn TCL_OK;.   
c5a0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
c5b0: 2d 3e 70 41 72 72 61 79 20 29 7b 0a 20 20 20 20  ->pArray ){.    
c5c0: 20 20 20 20 64 62 45 76 61 6c 52 6f 77 49 6e 66      dbEvalRowInf
c5d0: 6f 28 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  o(p, 0, 0);.    
c5e0: 20 20 7d 0a 20 20 20 20 20 20 72 63 73 20 3d 20    }.      rcs = 
c5f0: 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53  sqlite3_reset(pS
c600: 74 6d 74 29 3b 0a 0a 20 20 20 20 20 20 70 44 62  tmt);..      pDb
c610: 2d 3e 6e 53 74 65 70 20 3d 20 73 71 6c 69 74 65  ->nStep = sqlite
c620: 33 5f 73 74 6d 74 5f 73 74 61 74 75 73 28 70 53  3_stmt_status(pS
c630: 74 6d 74 2c 53 51 4c 49 54 45 5f 53 54 4d 54 53  tmt,SQLITE_STMTS
c640: 54 41 54 55 53 5f 46 55 4c 4c 53 43 41 4e 5f 53  TATUS_FULLSCAN_S
c650: 54 45 50 2c 31 29 3b 0a 20 20 20 20 20 20 70 44  TEP,1);.      pD
c660: 62 2d 3e 6e 53 6f 72 74 20 3d 20 73 71 6c 69 74  b->nSort = sqlit
c670: 65 33 5f 73 74 6d 74 5f 73 74 61 74 75 73 28 70  e3_stmt_status(p
c680: 53 74 6d 74 2c 53 51 4c 49 54 45 5f 53 54 4d 54  Stmt,SQLITE_STMT
c690: 53 54 41 54 55 53 5f 53 4f 52 54 2c 31 29 3b 0a  STATUS_SORT,1);.
c6a0: 20 20 20 20 20 20 70 44 62 2d 3e 6e 49 6e 64 65        pDb->nInde
c6b0: 78 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  x = sqlite3_stmt
c6c0: 5f 73 74 61 74 75 73 28 70 53 74 6d 74 2c 53 51  _status(pStmt,SQ
c6d0: 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f  LITE_STMTSTATUS_
c6e0: 41 55 54 4f 49 4e 44 45 58 2c 31 29 3b 0a 20 20  AUTOINDEX,1);.  
c6f0: 20 20 20 20 64 62 52 65 6c 65 61 73 65 43 6f 6c      dbReleaseCol
c700: 75 6d 6e 4e 61 6d 65 73 28 70 29 3b 0a 20 20 20  umnNames(p);.   
c710: 20 20 20 70 2d 3e 70 50 72 65 53 74 6d 74 20 3d     p->pPreStmt =
c720: 20 30 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 72   0;..      if( r
c730: 63 73 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  cs!=SQLITE_OK ){
c740: 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61  .        /* If a
c750: 20 72 75 6e 2d 74 69 6d 65 20 65 72 72 6f 72 20   run-time error 
c760: 6f 63 63 75 72 73 2c 20 72 65 70 6f 72 74 20 74  occurs, report t
c770: 68 65 20 65 72 72 6f 72 20 61 6e 64 20 73 74 6f  he error and sto
c780: 70 20 72 65 61 64 69 6e 67 0a 20 20 20 20 20 20  p reading.      
c790: 20 20 2a 2a 20 74 68 65 20 53 51 4c 2e 20 20 2a    ** the SQL.  *
c7a0: 2f 0a 20 20 20 20 20 20 20 20 64 62 52 65 6c 65  /.        dbRele
c7b0: 61 73 65 53 74 6d 74 28 70 44 62 2c 20 70 50 72  aseStmt(pDb, pPr
c7c0: 65 53 74 6d 74 2c 20 31 29 3b 0a 23 69 66 20 53  eStmt, 1);.#if S
c7d0: 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 20 20 20  QLITE_TEST.     
c7e0: 20 20 20 69 66 28 20 70 2d 3e 70 44 62 2d 3e 62     if( p->pDb->b
c7f0: 4c 65 67 61 63 79 50 72 65 70 61 72 65 20 26 26  LegacyPrepare &&
c800: 20 72 63 73 3d 3d 53 51 4c 49 54 45 5f 53 43 48   rcs==SQLITE_SCH
c810: 45 4d 41 20 26 26 20 7a 50 72 65 76 53 71 6c 20  EMA && zPrevSql 
c820: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
c830: 49 66 20 74 68 65 20 72 75 6e 74 69 6d 65 20 65  If the runtime e
c840: 72 72 6f 72 20 77 61 73 20 61 6e 20 53 51 4c 49  rror was an SQLI
c850: 54 45 5f 53 43 48 45 4d 41 2c 20 61 6e 64 20 74  TE_SCHEMA, and t
c860: 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20  he database.    
c870: 20 20 20 20 20 20 2a 2a 20 68 61 6e 64 6c 65 20        ** handle 
c880: 69 73 20 63 6f 6e 66 69 67 75 72 65 64 20 74 6f  is configured to
c890: 20 75 73 65 20 74 68 65 20 6c 65 67 61 63 79 20   use the legacy 
c8a0: 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28  sqlite3_prepare(
c8b0: 29 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69  ).          ** i
c8c0: 6e 74 65 72 66 61 63 65 2c 20 72 65 74 72 79 20  nterface, retry 
c8d0: 70 72 65 70 61 72 65 28 29 2f 73 74 65 70 28 29  prepare()/step()
c8e0: 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 53 51 4c   on the same SQL
c8f0: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20   statement..    
c900: 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 6f 6e        ** This on
c910: 6c 79 20 68 61 70 70 65 6e 73 20 6f 6e 63 65 2e  ly happens once.
c920: 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20 73   If there is a s
c930: 65 63 6f 6e 64 20 53 51 4c 49 54 45 5f 53 43 48  econd SQLITE_SCH
c940: 45 4d 41 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  EMA.          **
c950: 20 65 72 72 6f 72 2c 20 74 68 65 20 65 72 72 6f   error, the erro
c960: 72 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e  r will be return
c970: 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  ed to the caller
c980: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70  . */.          p
c990: 2d 3e 7a 53 71 6c 20 3d 20 7a 50 72 65 76 53 71  ->zSql = zPrevSq
c9a0: 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e  l;.          con
c9b0: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d  tinue;.        }
c9c0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
c9d0: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
c9e0: 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 0a 20 20  (pDb->interp,.  
c9f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca00: 20 20 20 20 20 20 20 54 63 6c 5f 4e 65 77 53 74         Tcl_NewSt
ca10: 72 69 6e 67 4f 62 6a 28 73 71 6c 69 74 65 33 5f  ringObj(sqlite3_
ca20: 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c  errmsg(pDb->db),
ca30: 20 2d 31 29 29 3b 0a 20 20 20 20 20 20 20 20 72   -1));.        r
ca40: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
ca50: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
ca60: 20 20 20 20 20 20 64 62 52 65 6c 65 61 73 65 53        dbReleaseS
ca70: 74 6d 74 28 70 44 62 2c 20 70 50 72 65 53 74 6d  tmt(pDb, pPreStm
ca80: 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  t, 0);.      }. 
ca90: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46     }.  }..  /* F
caa0: 69 6e 69 73 68 65 64 20 2a 2f 0a 20 20 72 65 74  inished */.  ret
cab0: 75 72 6e 20 54 43 4c 5f 42 52 45 41 4b 3b 0a 7d  urn TCL_BREAK;.}
cac0: 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c  ../*.** Free all
cad0: 20 72 65 73 6f 75 72 63 65 73 20 63 75 72 72 65   resources curre
cae0: 6e 74 6c 79 20 68 65 6c 64 20 62 79 20 74 68 65  ntly held by the
caf0: 20 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 20 73   DbEvalContext s
cb00: 74 72 75 63 74 75 72 65 20 70 61 73 73 65 64 0a  tructure passed.
cb10: 2a 2a 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ** as the first 
cb20: 61 72 67 75 6d 65 6e 74 2e 20 54 68 65 72 65 20  argument. There 
cb30: 73 68 6f 75 6c 64 20 62 65 20 65 78 61 63 74 6c  should be exactl
cb40: 79 20 6f 6e 65 20 63 61 6c 6c 20 74 6f 20 74 68  y one call to th
cb50: 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 66  is function.** f
cb60: 6f 72 20 65 61 63 68 20 63 61 6c 6c 20 74 6f 20  or each call to 
cb70: 64 62 45 76 61 6c 49 6e 69 74 28 29 2e 0a 2a 2f  dbEvalInit()..*/
cb80: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 62 45  .static void dbE
cb90: 76 61 6c 46 69 6e 61 6c 69 7a 65 28 44 62 45 76  valFinalize(DbEv
cba0: 61 6c 43 6f 6e 74 65 78 74 20 2a 70 29 7b 0a 20  alContext *p){. 
cbb0: 20 69 66 28 20 70 2d 3e 70 50 72 65 53 74 6d 74   if( p->pPreStmt
cbc0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
cbd0: 72 65 73 65 74 28 70 2d 3e 70 50 72 65 53 74 6d  reset(p->pPreStm
cbe0: 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 20 20 64  t->pStmt);.    d
cbf0: 62 52 65 6c 65 61 73 65 53 74 6d 74 28 70 2d 3e  bReleaseStmt(p->
cc00: 70 44 62 2c 20 70 2d 3e 70 50 72 65 53 74 6d 74  pDb, p->pPreStmt
cc10: 2c 20 30 29 3b 0a 20 20 20 20 70 2d 3e 70 50 72  , 0);.    p->pPr
cc20: 65 53 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a 20  eStmt = 0;.  }. 
cc30: 20 69 66 28 20 70 2d 3e 70 41 72 72 61 79 20 29   if( p->pArray )
cc40: 7b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65  {.    Tcl_DecrRe
cc50: 66 43 6f 75 6e 74 28 70 2d 3e 70 41 72 72 61 79  fCount(p->pArray
cc60: 29 3b 0a 20 20 20 20 70 2d 3e 70 41 72 72 61 79  );.    p->pArray
cc70: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f   = 0;.  }.  Tcl_
cc80: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 2d 3e  DecrRefCount(p->
cc90: 70 53 71 6c 29 3b 0a 20 20 64 62 52 65 6c 65 61  pSql);.  dbRelea
cca0: 73 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 29  seColumnNames(p)
ccb0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
ccc0: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  n a pointer to a
ccd0: 20 54 63 6c 5f 4f 62 6a 20 73 74 72 75 63 74 75   Tcl_Obj structu
cce0: 72 65 20 77 69 74 68 20 72 65 66 2d 63 6f 75 6e  re with ref-coun
ccf0: 74 20 30 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  t 0 that contain
cd00: 73 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 66  s.** the value f
cd10: 6f 72 20 74 68 65 20 69 43 6f 6c 27 74 68 20 63  or the iCol'th c
cd20: 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 72 6f 77  olumn of the row
cd30: 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
cd40: 65 64 20 74 6f 20 62 79 0a 2a 2a 20 74 68 65 20  ed to by.** the 
cd50: 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 20 73 74  DbEvalContext st
cd60: 72 75 63 74 75 72 65 20 70 61 73 73 65 64 20 61  ructure passed a
cd70: 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  s the first argu
cd80: 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ment..*/.static 
cd90: 54 63 6c 5f 4f 62 6a 20 2a 64 62 45 76 61 6c 43  Tcl_Obj *dbEvalC
cda0: 6f 6c 75 6d 6e 56 61 6c 75 65 28 44 62 45 76 61  olumnValue(DbEva
cdb0: 6c 43 6f 6e 74 65 78 74 20 2a 70 2c 20 69 6e 74  lContext *p, int
cdc0: 20 69 43 6f 6c 29 7b 0a 20 20 73 71 6c 69 74 65   iCol){.  sqlite
cdd0: 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20  3_stmt *pStmt = 
cde0: 70 2d 3e 70 50 72 65 53 74 6d 74 2d 3e 70 53 74  p->pPreStmt->pSt
cdf0: 6d 74 3b 0a 20 20 73 77 69 74 63 68 28 20 73 71  mt;.  switch( sq
ce00: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70  lite3_column_typ
ce10: 65 28 70 53 74 6d 74 2c 20 69 43 6f 6c 29 20 29  e(pStmt, iCol) )
ce20: 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  {.    case SQLIT
ce30: 45 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20  E_BLOB: {.      
ce40: 69 6e 74 20 62 79 74 65 73 20 3d 20 73 71 6c 69  int bytes = sqli
ce50: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73  te3_column_bytes
ce60: 28 70 53 74 6d 74 2c 20 69 43 6f 6c 29 3b 0a 20  (pStmt, iCol);. 
ce70: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
ce80: 2a 7a 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33  *zBlob = sqlite3
ce90: 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70 53 74  _column_blob(pSt
cea0: 6d 74 2c 20 69 43 6f 6c 29 3b 0a 20 20 20 20 20  mt, iCol);.     
ceb0: 20 69 66 28 20 21 7a 42 6c 6f 62 20 29 20 62 79   if( !zBlob ) by
cec0: 74 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  tes = 0;.      r
ced0: 65 74 75 72 6e 20 54 63 6c 5f 4e 65 77 42 79 74  eturn Tcl_NewByt
cee0: 65 41 72 72 61 79 4f 62 6a 28 28 75 38 2a 29 7a  eArrayObj((u8*)z
cef0: 42 6c 6f 62 2c 20 62 79 74 65 73 29 3b 0a 20 20  Blob, bytes);.  
cf00: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
cf10: 49 54 45 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20  ITE_INTEGER: {. 
cf20: 20 20 20 20 20 73 71 6c 69 74 65 5f 69 6e 74 36       sqlite_int6
cf30: 34 20 76 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  4 v = sqlite3_co
cf40: 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 53 74 6d 74  lumn_int64(pStmt
cf50: 2c 20 69 43 6f 6c 29 3b 0a 20 20 20 20 20 20 69  , iCol);.      i
cf60: 66 28 20 76 3e 3d 2d 32 31 34 37 34 38 33 36 34  f( v>=-214748364
cf70: 37 20 26 26 20 76 3c 3d 32 31 34 37 34 38 33 36  7 && v<=21474836
cf80: 34 37 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  47 ){.        re
cf90: 74 75 72 6e 20 54 63 6c 5f 4e 65 77 49 6e 74 4f  turn Tcl_NewIntO
cfa0: 62 6a 28 28 69 6e 74 29 76 29 3b 0a 20 20 20 20  bj((int)v);.    
cfb0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
cfc0: 20 72 65 74 75 72 6e 20 54 63 6c 5f 4e 65 77 57   return Tcl_NewW
cfd0: 69 64 65 49 6e 74 4f 62 6a 28 76 29 3b 0a 20 20  ideIntObj(v);.  
cfe0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
cff0: 63 61 73 65 20 53 51 4c 49 54 45 5f 46 4c 4f 41  case SQLITE_FLOA
d000: 54 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72  T: {.      retur
d010: 6e 20 54 63 6c 5f 4e 65 77 44 6f 75 62 6c 65 4f  n Tcl_NewDoubleO
d020: 62 6a 28 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  bj(sqlite3_colum
d030: 6e 5f 64 6f 75 62 6c 65 28 70 53 74 6d 74 2c 20  n_double(pStmt, 
d040: 69 43 6f 6c 29 29 3b 0a 20 20 20 20 7d 0a 20 20  iCol));.    }.  
d050: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 55    case SQLITE_NU
d060: 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75  LL: {.      retu
d070: 72 6e 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  rn Tcl_NewString
d080: 4f 62 6a 28 70 2d 3e 70 44 62 2d 3e 7a 4e 75 6c  Obj(p->pDb->zNul
d090: 6c 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 0a 20 20  l, -1);.    }.  
d0a0: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54 63 6c 5f  }..  return Tcl_
d0b0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 28 63 68  NewStringObj((ch
d0c0: 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ar*)sqlite3_colu
d0d0: 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 69  mn_text(pStmt, i
d0e0: 43 6f 6c 29 2c 20 2d 31 29 3b 0a 7d 0a 0a 2f 2a  Col), -1);.}../*
d0f0: 0a 2a 2a 20 49 66 20 75 73 69 6e 67 20 54 63 6c  .** If using Tcl
d100: 20 76 65 72 73 69 6f 6e 20 38 2e 36 20 6f 72 20   version 8.6 or 
d110: 67 72 65 61 74 65 72 2c 20 75 73 65 20 74 68 65  greater, use the
d120: 20 4e 52 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f   NR functions to
d130: 20 61 76 6f 69 64 0a 2a 2a 20 72 65 63 75 72 73   avoid.** recurs
d140: 69 76 65 20 65 76 61 6c 75 74 69 6f 6e 20 6f 66  ive evalution of
d150: 20 73 63 72 69 70 74 73 20 62 79 20 74 68 65 20   scripts by the 
d160: 5b 64 62 20 65 76 61 6c 5d 20 61 6e 64 20 5b 64  [db eval] and [d
d170: 62 20 74 72 61 6e 73 5d 0a 2a 2a 20 63 6f 6d 6d  b trans].** comm
d180: 61 6e 64 73 2e 20 45 76 65 6e 20 69 66 20 74 68  ands. Even if th
d190: 65 20 68 65 61 64 65 72 73 20 75 73 65 64 20 77  e headers used w
d1a0: 68 69 6c 65 20 63 6f 6d 70 69 6c 69 6e 67 20 74  hile compiling t
d1b0: 68 65 20 65 78 74 65 6e 73 69 6f 6e 0a 2a 2a 20  he extension.** 
d1c0: 61 72 65 20 38 2e 36 20 6f 72 20 6e 65 77 65 72  are 8.6 or newer
d1d0: 2c 20 74 68 65 20 63 6f 64 65 20 73 74 69 6c 6c  , the code still
d1e0: 20 74 65 73 74 73 20 74 68 65 20 54 63 6c 20 76   tests the Tcl v
d1f0: 65 72 73 69 6f 6e 20 61 74 20 72 75 6e 74 69 6d  ersion at runtim
d200: 65 2e 0a 2a 2a 20 54 68 69 73 20 61 6c 6c 6f 77  e..** This allow
d210: 73 20 73 74 75 62 73 2d 65 6e 61 62 6c 65 64 20  s stubs-enabled 
d220: 62 75 69 6c 64 73 20 74 6f 20 62 65 20 75 73 65  builds to be use
d230: 64 20 77 69 74 68 20 6f 6c 64 65 72 20 54 63 6c  d with older Tcl
d240: 20 6c 69 62 72 61 72 69 65 73 2e 0a 2a 2f 0a 23   libraries..*/.#
d250: 69 66 20 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52  if TCL_MAJOR_VER
d260: 53 49 4f 4e 3e 38 20 7c 7c 20 28 54 43 4c 5f 4d  SION>8 || (TCL_M
d270: 41 4a 4f 52 5f 56 45 52 53 49 4f 4e 3d 3d 38 20  AJOR_VERSION==8 
d280: 26 26 20 54 43 4c 5f 4d 49 4e 4f 52 5f 56 45 52  && TCL_MINOR_VER
d290: 53 49 4f 4e 3e 3d 36 29 0a 23 20 64 65 66 69 6e  SION>=6).# defin
d2a0: 65 20 53 51 4c 49 54 45 5f 54 43 4c 5f 4e 52 45  e SQLITE_TCL_NRE
d2b0: 20 31 0a 73 74 61 74 69 63 20 69 6e 74 20 44 62   1.static int Db
d2c0: 55 73 65 4e 72 65 28 76 6f 69 64 29 7b 0a 20 20  UseNre(void){.  
d2d0: 69 6e 74 20 6d 61 6a 6f 72 2c 20 6d 69 6e 6f 72  int major, minor
d2e0: 3b 0a 20 20 54 63 6c 5f 47 65 74 56 65 72 73 69  ;.  Tcl_GetVersi
d2f0: 6f 6e 28 26 6d 61 6a 6f 72 2c 20 26 6d 69 6e 6f  on(&major, &mino
d300: 72 2c 20 30 2c 20 30 29 3b 0a 20 20 72 65 74 75  r, 0, 0);.  retu
d310: 72 6e 28 20 28 6d 61 6a 6f 72 3d 3d 38 20 26 26  rn( (major==8 &&
d320: 20 6d 69 6e 6f 72 3e 3d 36 29 20 7c 7c 20 6d 61   minor>=6) || ma
d330: 6a 6f 72 3e 38 20 29 3b 0a 7d 0a 23 65 6c 73 65  jor>8 );.}.#else
d340: 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 69 6c 69 6e 67  ./*.** Compiling
d350: 20 75 73 69 6e 67 20 68 65 61 64 65 72 73 20 65   using headers e
d360: 61 72 6c 69 65 72 20 74 68 61 6e 20 38 2e 36 2e  arlier than 8.6.
d370: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 4e 52   In this case NR
d380: 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 75 73   cannot be.** us
d390: 65 64 2c 20 73 6f 20 44 62 55 73 65 4e 72 65 28  ed, so DbUseNre(
d3a0: 29 20 74 6f 20 61 6c 77 61 79 73 20 72 65 74 75  ) to always retu
d3b0: 72 6e 20 7a 65 72 6f 2e 20 41 64 64 20 23 64 65  rn zero. Add #de
d3c0: 66 69 6e 65 73 20 66 6f 72 20 74 68 65 20 6f 74  fines for the ot
d3d0: 68 65 72 0a 2a 2a 20 54 63 6c 5f 4e 52 78 78 78  her.** Tcl_NRxxx
d3e0: 28 29 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20  () functions to 
d3f0: 70 72 65 76 65 6e 74 20 74 68 65 6d 20 66 72 6f  prevent them fro
d400: 6d 20 63 61 75 73 69 6e 67 20 63 6f 6d 70 69 6c  m causing compil
d410: 61 74 69 6f 6e 20 65 72 72 6f 72 73 2c 0a 2a 2a  ation errors,.**
d420: 20 65 76 65 6e 20 74 68 6f 75 67 68 20 74 68 65   even though the
d430: 20 6f 6e 6c 79 20 69 6e 76 6f 63 61 74 69 6f 6e   only invocation
d440: 73 20 6f 66 20 74 68 65 6d 20 61 72 65 20 77 69  s of them are wi
d450: 74 68 69 6e 20 63 6f 6e 64 69 74 69 6f 6e 61 6c  thin conditional
d460: 20 62 6c 6f 63 6b 73 0a 2a 2a 20 6f 66 20 74 68   blocks.** of th
d470: 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20  e form:.**.**   
d480: 69 66 28 20 44 62 55 73 65 4e 72 65 28 29 20 29  if( DbUseNre() )
d490: 20 7b 20 2e 2e 2e 20 7d 0a 2a 2f 0a 23 20 64 65   { ... }.*/.# de
d4a0: 66 69 6e 65 20 53 51 4c 49 54 45 5f 54 43 4c 5f  fine SQLITE_TCL_
d4b0: 4e 52 45 20 30 0a 23 20 64 65 66 69 6e 65 20 44  NRE 0.# define D
d4c0: 62 55 73 65 4e 72 65 28 29 20 30 0a 23 20 64 65  bUseNre() 0.# de
d4d0: 66 69 6e 65 20 54 63 6c 5f 4e 52 41 64 64 43 61  fine Tcl_NRAddCa
d4e0: 6c 6c 62 61 63 6b 28 61 2c 62 2c 63 2c 64 2c 65  llback(a,b,c,d,e
d4f0: 2c 66 29 20 28 76 6f 69 64 29 30 0a 23 20 64 65  ,f) (void)0.# de
d500: 66 69 6e 65 20 54 63 6c 5f 4e 52 45 76 61 6c 4f  fine Tcl_NREvalO
d510: 62 6a 28 61 2c 62 2c 63 29 20 30 0a 23 20 64 65  bj(a,b,c) 0.# de
d520: 66 69 6e 65 20 54 63 6c 5f 4e 52 43 72 65 61 74  fine Tcl_NRCreat
d530: 65 43 6f 6d 6d 61 6e 64 28 61 2c 62 2c 63 2c 64  eCommand(a,b,c,d
d540: 2c 65 2c 66 29 20 28 76 6f 69 64 29 30 0a 23 65  ,e,f) (void)0.#e
d550: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ndif../*.** This
d560: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 70 61 72   function is par
d570: 74 20 6f 66 20 74 68 65 20 69 6d 70 6c 65 6d 65  t of the impleme
d580: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 63  ntation of the c
d590: 6f 6d 6d 61 6e 64 3a 0a 2a 2a 0a 2a 2a 20 20 20  ommand:.**.**   
d5a0: 24 64 62 20 65 76 61 6c 20 53 51 4c 20 3f 41 52  $db eval SQL ?AR
d5b0: 52 41 59 4e 41 4d 45 3f 20 53 43 52 49 50 54 0a  RAYNAME? SCRIPT.
d5c0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 44 62  */.static int Db
d5d0: 45 76 61 6c 4e 65 78 74 43 6d 64 28 0a 20 20 43  EvalNextCmd(.  C
d5e0: 6c 69 65 6e 74 44 61 74 61 20 64 61 74 61 5b 5d  lientData data[]
d5f0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
d600: 20 20 20 20 2f 2a 20 64 61 74 61 5b 30 5d 20 69      /* data[0] i
d610: 73 20 74 68 65 20 28 44 62 45 76 61 6c 43 6f 6e  s the (DbEvalCon
d620: 74 65 78 74 2a 29 20 2a 2f 0a 20 20 54 63 6c 5f  text*) */.  Tcl_
d630: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
d640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d650: 20 2f 2a 20 54 63 6c 20 69 6e 74 65 72 70 72 65   /* Tcl interpre
d660: 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73  ter */.  int res
d670: 75 6c 74 20 20 20 20 20 20 20 20 20 20 20 20 20  ult             
d680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d690: 20 52 65 73 75 6c 74 20 73 6f 20 66 61 72 20 2a   Result so far *
d6a0: 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  /.){.  int rc = 
d6b0: 72 65 73 75 6c 74 3b 20 20 20 20 20 20 20 20 20  result;         
d6c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
d6d0: 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20  eturn code */.. 
d6e0: 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20 65 6c   /* The first el
d6f0: 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 64 61 74  ement of the dat
d700: 61 5b 5d 20 61 72 72 61 79 20 69 73 20 61 20 70  a[] array is a p
d710: 6f 69 6e 74 65 72 20 74 6f 20 61 20 44 62 45 76  ointer to a DbEv
d720: 61 6c 43 6f 6e 74 65 78 74 0a 20 20 2a 2a 20 73  alContext.  ** s
d730: 74 72 75 63 74 75 72 65 20 61 6c 6c 6f 63 61 74  tructure allocat
d740: 65 64 20 75 73 69 6e 67 20 54 63 6c 5f 41 6c 6c  ed using Tcl_All
d750: 6f 63 28 29 2e 20 54 68 65 20 73 65 63 6f 6e 64  oc(). The second
d760: 20 65 6c 65 6d 65 6e 74 20 6f 66 20 64 61 74 61   element of data
d770: 5b 5d 0a 20 20 2a 2a 20 69 73 20 61 20 70 6f 69  [].  ** is a poi
d780: 6e 74 65 72 20 74 6f 20 61 20 54 63 6c 5f 4f 62  nter to a Tcl_Ob
d790: 6a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  j containing the
d7a0: 20 73 63 72 69 70 74 20 74 6f 20 72 75 6e 20 66   script to run f
d7b0: 6f 72 20 65 61 63 68 20 72 6f 77 0a 20 20 2a 2a  or each row.  **
d7c0: 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65   returned by the
d7d0: 20 71 75 65 72 69 65 73 20 65 6e 63 61 70 73 75   queries encapsu
d7e0: 6c 61 74 65 64 20 69 6e 20 64 61 74 61 5b 30 5d  lated in data[0]
d7f0: 2e 20 2a 2f 0a 20 20 44 62 45 76 61 6c 43 6f 6e  . */.  DbEvalCon
d800: 74 65 78 74 20 2a 70 20 3d 20 28 44 62 45 76 61  text *p = (DbEva
d810: 6c 43 6f 6e 74 65 78 74 20 2a 29 64 61 74 61 5b  lContext *)data[
d820: 30 5d 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  0];.  Tcl_Obj *p
d830: 53 63 72 69 70 74 20 3d 20 28 54 63 6c 5f 4f 62  Script = (Tcl_Ob
d840: 6a 20 2a 29 64 61 74 61 5b 31 5d 3b 0a 20 20 54  j *)data[1];.  T
d850: 63 6c 5f 4f 62 6a 20 2a 70 41 72 72 61 79 20 3d  cl_Obj *pArray =
d860: 20 70 2d 3e 70 41 72 72 61 79 3b 0a 0a 20 20 77   p->pArray;..  w
d870: 68 69 6c 65 28 20 28 72 63 3d 3d 54 43 4c 5f 4f  hile( (rc==TCL_O
d880: 4b 20 7c 7c 20 72 63 3d 3d 54 43 4c 5f 43 4f 4e  K || rc==TCL_CON
d890: 54 49 4e 55 45 29 20 26 26 20 54 43 4c 5f 4f 4b  TINUE) && TCL_OK
d8a0: 3d 3d 28 72 63 20 3d 20 64 62 45 76 61 6c 53 74  ==(rc = dbEvalSt
d8b0: 65 70 28 70 29 29 20 29 7b 0a 20 20 20 20 69 6e  ep(p)) ){.    in
d8c0: 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 6e 43 6f  t i;.    int nCo
d8d0: 6c 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a  l;.    Tcl_Obj *
d8e0: 2a 61 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20 20 20  *apColName;.    
d8f0: 64 62 45 76 61 6c 52 6f 77 49 6e 66 6f 28 70 2c  dbEvalRowInfo(p,
d900: 20 26 6e 43 6f 6c 2c 20 26 61 70 43 6f 6c 4e 61   &nCol, &apColNa
d910: 6d 65 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  me);.    for(i=0
d920: 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  ; i<nCol; i++){.
d930: 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70        Tcl_Obj *p
d940: 56 61 6c 20 3d 20 64 62 45 76 61 6c 43 6f 6c 75  Val = dbEvalColu
d950: 6d 6e 56 61 6c 75 65 28 70 2c 20 69 29 3b 0a 20  mnValue(p, i);. 
d960: 20 20 20 20 20 69 66 28 20 70 41 72 72 61 79 3d       if( pArray=
d970: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63  =0 ){.        Tc
d980: 6c 5f 4f 62 6a 53 65 74 56 61 72 32 28 69 6e 74  l_ObjSetVar2(int
d990: 65 72 70 2c 20 61 70 43 6f 6c 4e 61 6d 65 5b 69  erp, apColName[i
d9a0: 5d 2c 20 30 2c 20 70 56 61 6c 2c 20 30 29 3b 0a  ], 0, pVal, 0);.
d9b0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
d9c0: 20 20 20 20 20 54 63 6c 5f 4f 62 6a 53 65 74 56       Tcl_ObjSetV
d9d0: 61 72 32 28 69 6e 74 65 72 70 2c 20 70 41 72 72  ar2(interp, pArr
d9e0: 61 79 2c 20 61 70 43 6f 6c 4e 61 6d 65 5b 69 5d  ay, apColName[i]
d9f0: 2c 20 70 56 61 6c 2c 20 30 29 3b 0a 20 20 20 20  , pVal, 0);.    
da00: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
da10: 2a 20 54 68 65 20 72 65 71 75 69 72 65 64 20 69  * The required i
da20: 6e 74 65 72 70 72 65 74 65 72 20 76 61 72 69 61  nterpreter varia
da30: 62 6c 65 73 20 61 72 65 20 6e 6f 77 20 70 6f 70  bles are now pop
da40: 75 6c 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ulated with the 
da50: 64 61 74 61 0a 20 20 20 20 2a 2a 20 66 72 6f 6d  data.    ** from
da60: 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77   the current row
da70: 2e 20 49 66 20 75 73 69 6e 67 20 4e 52 45 2c 20  . If using NRE, 
da80: 73 63 68 65 64 75 6c 65 20 63 61 6c 6c 62 61 63  schedule callbac
da90: 6b 73 20 74 6f 20 65 76 61 6c 75 61 74 65 0a 20  ks to evaluate. 
daa0: 20 20 20 2a 2a 20 73 63 72 69 70 74 20 70 53 63     ** script pSc
dab0: 72 69 70 74 2c 20 74 68 65 6e 20 74 6f 20 69 6e  ript, then to in
dac0: 76 6f 6b 65 20 74 68 69 73 20 66 75 6e 63 74 69  voke this functi
dad0: 6f 6e 20 61 67 61 69 6e 20 74 6f 20 66 65 74 63  on again to fetc
dae0: 68 20 74 68 65 20 6e 65 78 74 0a 20 20 20 20 2a  h the next.    *
daf0: 2a 20 72 6f 77 20 28 6f 72 20 63 6c 65 61 6e 20  * row (or clean 
db00: 75 70 20 69 66 20 74 68 65 72 65 20 69 73 20 6e  up if there is n
db10: 6f 20 6e 65 78 74 20 72 6f 77 20 6f 72 20 74 68  o next row or th
db20: 65 20 73 63 72 69 70 74 20 74 68 72 6f 77 73 20  e script throws 
db30: 61 6e 0a 20 20 20 20 2a 2a 20 65 78 63 65 70 74  an.    ** except
db40: 69 6f 6e 29 2e 20 41 66 74 65 72 20 73 63 68 65  ion). After sche
db50: 64 75 6c 69 6e 67 20 74 68 65 20 63 61 6c 6c 62  duling the callb
db60: 61 63 6b 73 2c 20 72 65 74 75 72 6e 20 63 6f 6e  acks, return con
db70: 74 72 6f 6c 20 74 6f 20 74 68 65 0a 20 20 20 20  trol to the.    
db80: 2a 2a 20 63 61 6c 6c 65 72 2e 0a 20 20 20 20 2a  ** caller..    *
db90: 2a 0a 20 20 20 20 2a 2a 20 49 66 20 6e 6f 74 20  *.    ** If not 
dba0: 75 73 69 6e 67 20 4e 52 45 2c 20 65 76 61 6c 75  using NRE, evalu
dbb0: 61 74 65 20 70 53 63 72 69 70 74 20 64 69 72 65  ate pScript dire
dbc0: 63 74 6c 79 20 61 6e 64 20 63 6f 6e 74 69 6e 75  ctly and continu
dbd0: 65 20 77 69 74 68 20 74 68 65 0a 20 20 20 20 2a  e with the.    *
dbe0: 2a 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f 6e  * next iteration
dbf0: 20 6f 66 20 74 68 69 73 20 77 68 69 6c 65 28 2e   of this while(.
dc00: 2e 2e 29 20 6c 6f 6f 70 2e 20 20 2a 2f 0a 20 20  ..) loop.  */.  
dc10: 20 20 69 66 28 20 44 62 55 73 65 4e 72 65 28 29    if( DbUseNre()
dc20: 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 4e 52   ){.      Tcl_NR
dc30: 41 64 64 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65  AddCallback(inte
dc40: 72 70 2c 20 44 62 45 76 61 6c 4e 65 78 74 43 6d  rp, DbEvalNextCm
dc50: 64 2c 20 28 76 6f 69 64 2a 29 70 2c 20 28 76 6f  d, (void*)p, (vo
dc60: 69 64 2a 29 70 53 63 72 69 70 74 2c 20 30 2c 20  id*)pScript, 0, 
dc70: 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  0);.      return
dc80: 20 54 63 6c 5f 4e 52 45 76 61 6c 4f 62 6a 28 69   Tcl_NREvalObj(i
dc90: 6e 74 65 72 70 2c 20 70 53 63 72 69 70 74 2c 20  nterp, pScript, 
dca0: 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  0);.    }else{. 
dcb0: 20 20 20 20 20 72 63 20 3d 20 54 63 6c 5f 45 76       rc = Tcl_Ev
dcc0: 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c 20  alObjEx(interp, 
dcd0: 70 53 63 72 69 70 74 2c 20 30 29 3b 0a 20 20 20  pScript, 0);.   
dce0: 20 7d 0a 20 20 7d 0a 0a 20 20 54 63 6c 5f 44 65   }.  }..  Tcl_De
dcf0: 63 72 52 65 66 43 6f 75 6e 74 28 70 53 63 72 69  crRefCount(pScri
dd00: 70 74 29 3b 0a 20 20 64 62 45 76 61 6c 46 69 6e  pt);.  dbEvalFin
dd10: 61 6c 69 7a 65 28 70 29 3b 0a 20 20 54 63 6c 5f  alize(p);.  Tcl_
dd20: 46 72 65 65 28 28 63 68 61 72 20 2a 29 70 29 3b  Free((char *)p);
dd30: 0a 0a 20 20 69 66 28 20 72 63 3d 3d 54 43 4c 5f  ..  if( rc==TCL_
dd40: 4f 4b 20 7c 7c 20 72 63 3d 3d 54 43 4c 5f 42 52  OK || rc==TCL_BR
dd50: 45 41 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 52  EAK ){.    Tcl_R
dd60: 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  esetResult(inter
dd70: 70 29 3b 0a 20 20 20 20 72 63 20 3d 20 54 43 4c  p);.    rc = TCL
dd80: 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  _OK;.  }.  retur
dd90: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
dda0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
ddb0: 75 73 65 64 20 62 79 20 74 68 65 20 69 6d 70 6c  used by the impl
ddc0: 65 6d 65 6e 74 61 74 69 6f 6e 73 20 6f 66 20 74  ementations of t
ddd0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 64 61 74  he following dat
dde0: 61 62 61 73 65 0a 2a 2a 20 68 61 6e 64 6c 65 20  abase.** handle 
ddf0: 73 75 62 2d 63 6f 6d 6d 61 6e 64 73 3a 0a 2a 2a  sub-commands:.**
de00: 0a 2a 2a 20 20 20 24 64 62 20 75 70 64 61 74 65  .**   $db update
de10: 5f 68 6f 6f 6b 20 3f 53 43 52 49 50 54 3f 0a 2a  _hook ?SCRIPT?.*
de20: 2a 20 20 20 24 64 62 20 77 61 6c 5f 68 6f 6f 6b  *   $db wal_hook
de30: 20 3f 53 43 52 49 50 54 3f 0a 2a 2a 20 20 20 24   ?SCRIPT?.**   $
de40: 64 62 20 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 20 3f  db commit_hook ?
de50: 53 43 52 49 50 54 3f 0a 2a 2a 20 20 20 24 64 62  SCRIPT?.**   $db
de60: 20 70 72 65 75 70 64 61 74 65 20 68 6f 6f 6b 20   preupdate hook 
de70: 3f 53 43 52 49 50 54 3f 0a 2a 2f 0a 73 74 61 74  ?SCRIPT?.*/.stat
de80: 69 63 20 76 6f 69 64 20 44 62 48 6f 6f 6b 43 6d  ic void DbHookCm
de90: 64 28 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  d(.  Tcl_Interp 
dea0: 2a 69 6e 74 65 72 70 2c 20 20 20 20 20 20 20 20  *interp,        
deb0: 20 20 20 20 20 2f 2a 20 54 63 6c 20 69 6e 74 65       /* Tcl inte
dec0: 72 70 72 65 74 65 72 20 2a 2f 0a 20 20 53 71 6c  rpreter */.  Sql
ded0: 69 74 65 44 62 20 2a 70 44 62 2c 20 20 20 20 20  iteDb *pDb,     
dee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
def0: 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  Database handle 
df00: 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 41  */.  Tcl_Obj *pA
df10: 72 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  rg,             
df20: 20 20 20 20 20 2f 2a 20 53 43 52 49 50 54 20 61       /* SCRIPT a
df30: 72 67 75 6d 65 6e 74 20 28 6f 72 20 4e 55 4c 4c  rgument (or NULL
df40: 29 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  ) */.  Tcl_Obj *
df50: 2a 70 70 48 6f 6f 6b 20 20 20 20 20 20 20 20 20  *ppHook         
df60: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
df70: 72 20 74 6f 20 6d 65 6d 62 65 72 20 6f 66 20 53  r to member of S
df80: 71 6c 69 74 65 44 62 20 2a 2f 0a 29 7b 0a 20 20  qliteDb */.){.  
df90: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 44  sqlite3 *db = pD
dfa0: 62 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 2a 70  b->db;..  if( *p
dfb0: 70 48 6f 6f 6b 20 29 7b 0a 20 20 20 20 54 63 6c  pHook ){.    Tcl
dfc0: 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
dfd0: 74 65 72 70 2c 20 2a 70 70 48 6f 6f 6b 29 3b 0a  terp, *ppHook);.
dfe0: 20 20 20 20 69 66 28 20 70 41 72 67 20 29 7b 0a      if( pArg ){.
dff0: 20 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65        Tcl_DecrRe
e000: 66 43 6f 75 6e 74 28 2a 70 70 48 6f 6f 6b 29 3b  fCount(*ppHook);
e010: 0a 20 20 20 20 20 20 2a 70 70 48 6f 6f 6b 20 3d  .      *ppHook =
e020: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   0;.    }.  }.  
e030: 69 66 28 20 70 41 72 67 20 29 7b 0a 20 20 20 20  if( pArg ){.    
e040: 61 73 73 65 72 74 28 20 21 28 2a 70 70 48 6f 6f  assert( !(*ppHoo
e050: 6b 29 20 29 3b 0a 20 20 20 20 69 66 28 20 54 63  k) );.    if( Tc
e060: 6c 5f 47 65 74 43 68 61 72 4c 65 6e 67 74 68 28  l_GetCharLength(
e070: 70 41 72 67 29 3e 30 20 29 7b 0a 20 20 20 20 20  pArg)>0 ){.     
e080: 20 2a 70 70 48 6f 6f 6b 20 3d 20 70 41 72 67 3b   *ppHook = pArg;
e090: 0a 20 20 20 20 20 20 54 63 6c 5f 49 6e 63 72 52  .      Tcl_IncrR
e0a0: 65 66 43 6f 75 6e 74 28 2a 70 70 48 6f 6f 6b 29  efCount(*ppHook)
e0b0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66  ;.    }.  }..#if
e0c0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
e0d0: 45 5f 50 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b  E_PREUPDATE_HOOK
e0e0: 0a 20 20 73 71 6c 69 74 65 33 5f 70 72 65 75 70  .  sqlite3_preup
e0f0: 64 61 74 65 5f 68 6f 6f 6b 28 64 62 2c 20 28 70  date_hook(db, (p
e100: 44 62 2d 3e 70 50 72 65 55 70 64 61 74 65 48 6f  Db->pPreUpdateHo
e110: 6f 6b 3f 44 62 50 72 65 55 70 64 61 74 65 48 61  ok?DbPreUpdateHa
e120: 6e 64 6c 65 72 3a 30 29 2c 20 70 44 62 29 3b 0a  ndler:0), pDb);.
e130: 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
e140: 5f 75 70 64 61 74 65 5f 68 6f 6f 6b 28 64 62 2c  _update_hook(db,
e150: 20 28 70 44 62 2d 3e 70 55 70 64 61 74 65 48 6f   (pDb->pUpdateHo
e160: 6f 6b 3f 44 62 55 70 64 61 74 65 48 61 6e 64 6c  ok?DbUpdateHandl
e170: 65 72 3a 30 29 2c 20 70 44 62 29 3b 0a 20 20 73  er:0), pDb);.  s
e180: 71 6c 69 74 65 33 5f 72 6f 6c 6c 62 61 63 6b 5f  qlite3_rollback_
e190: 68 6f 6f 6b 28 64 62 2c 20 28 70 44 62 2d 3e 70  hook(db, (pDb->p
e1a0: 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 3f 44 62 52  RollbackHook?DbR
e1b0: 6f 6c 6c 62 61 63 6b 48 61 6e 64 6c 65 72 3a 30  ollbackHandler:0
e1c0: 29 2c 20 70 44 62 29 3b 0a 20 20 73 71 6c 69 74  ), pDb);.  sqlit
e1d0: 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 64 62 2c 20  e3_wal_hook(db, 
e1e0: 28 70 44 62 2d 3e 70 57 61 6c 48 6f 6f 6b 3f 44  (pDb->pWalHook?D
e1f0: 62 57 61 6c 48 61 6e 64 6c 65 72 3a 30 29 2c 20  bWalHandler:0), 
e200: 70 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  pDb);.}../*.** T
e210: 68 65 20 22 73 71 6c 69 74 65 22 20 63 6f 6d 6d  he "sqlite" comm
e220: 61 6e 64 20 62 65 6c 6f 77 20 63 72 65 61 74 65  and below create
e230: 73 20 61 20 6e 65 77 20 54 63 6c 20 63 6f 6d 6d  s a new Tcl comm
e240: 61 6e 64 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20  and for each.** 
e250: 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 74 20 6f 70  connection it op
e260: 65 6e 73 20 74 6f 20 61 6e 20 53 51 4c 69 74 65  ens to an SQLite
e270: 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 69 73   database.  This
e280: 20 72 6f 75 74 69 6e 65 20 69 73 20 69 6e 76 6f   routine is invo
e290: 6b 65 64 0a 2a 2a 20 77 68 65 6e 65 76 65 72 20  ked.** whenever 
e2a0: 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20 63 6f 6e  one of those con
e2b0: 6e 65 63 74 69 6f 6e 2d 73 70 65 63 69 66 69 63  nection-specific
e2c0: 20 63 6f 6d 6d 61 6e 64 73 20 69 73 20 65 78 65   commands is exe
e2d0: 63 75 74 65 64 0a 2a 2a 20 69 6e 20 54 63 6c 2e  cuted.** in Tcl.
e2e0: 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69    For example, i
e2f0: 66 20 79 6f 75 20 72 75 6e 20 54 63 6c 20 63 6f  f you run Tcl co
e300: 64 65 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a  de like this:.**
e310: 0a 2a 2a 20 20 20 20 20 20 20 73 71 6c 69 74 65  .**       sqlite
e320: 33 20 64 62 31 20 20 22 6d 79 5f 64 61 74 61 62  3 db1  "my_datab
e330: 61 73 65 22 0a 2a 2a 20 20 20 20 20 20 20 64 62  ase".**       db
e340: 31 20 63 6c 6f 73 65 0a 2a 2a 0a 2a 2a 20 54 68  1 close.**.** Th
e350: 65 20 66 69 72 73 74 20 63 6f 6d 6d 61 6e 64 20  e first command 
e360: 6f 70 65 6e 73 20 61 20 63 6f 6e 6e 65 63 74 69  opens a connecti
e370: 6f 6e 20 74 6f 20 74 68 65 20 22 6d 79 5f 64 61  on to the "my_da
e380: 74 61 62 61 73 65 22 20 64 61 74 61 62 61 73 65  tabase" database
e390: 0a 2a 2a 20 61 6e 64 20 63 61 6c 6c 73 20 74 68  .** and calls th
e3a0: 61 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 22 64  at connection "d
e3b0: 62 31 22 2e 20 20 54 68 65 20 73 65 63 6f 6e 64  b1".  The second
e3c0: 20 63 6f 6d 6d 61 6e 64 20 63 61 75 73 65 73 20   command causes 
e3d0: 74 68 69 73 0a 2a 2a 20 73 75 62 72 6f 75 74 69  this.** subrouti
e3e0: 6e 65 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64  ne to be invoked
e3f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
e400: 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 44 62  SQLITE_TCLAPI Db
e410: 4f 62 6a 43 6d 64 28 0a 20 20 76 6f 69 64 20 2a  ObjCmd(.  void *
e420: 63 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  cd,.  Tcl_Interp
e430: 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
e440: 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
e450: 2a 63 6f 6e 73 74 2a 6f 62 6a 76 0a 29 7b 0a 20  *const*objv.){. 
e460: 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d   SqliteDb *pDb =
e470: 20 28 53 71 6c 69 74 65 44 62 2a 29 63 64 3b 0a   (SqliteDb*)cd;.
e480: 20 20 69 6e 74 20 63 68 6f 69 63 65 3b 0a 20 20    int choice;.  
e490: 69 6e 74 20 72 63 20 3d 20 54 43 4c 5f 4f 4b 3b  int rc = TCL_OK;
e4a0: 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
e4b0: 63 68 61 72 20 2a 44 42 5f 73 74 72 73 5b 5d 20  char *DB_strs[] 
e4c0: 3d 20 7b 0a 20 20 20 20 22 61 75 74 68 6f 72 69  = {.    "authori
e4d0: 7a 65 72 22 2c 20 20 20 20 20 20 20 20 20 22 62  zer",         "b
e4e0: 61 63 6b 75 70 22 2c 20 20 20 20 20 20 20 20 20  ackup",         
e4f0: 20 20 20 22 62 75 73 79 22 2c 0a 20 20 20 20 22     "busy",.    "
e500: 63 61 63 68 65 22 2c 20 20 20 20 20 20 20 20 20  cache",         
e510: 20 20 20 20 20 22 63 68 61 6e 67 65 73 22 2c 20       "changes", 
e520: 20 20 20 20 20 20 20 20 20 20 22 63 6c 6f 73 65            "close
e530: 22 2c 0a 20 20 20 20 22 63 6f 6c 6c 61 74 65 22  ",.    "collate"
e540: 2c 20 20 20 20 20 20 20 20 20 20 20 20 22 63 6f  ,            "co
e550: 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64 22 2c  llation_needed",
e560: 20 20 22 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 22 2c    "commit_hook",
e570: 0a 20 20 20 20 22 63 6f 6d 70 6c 65 74 65 22 2c  .    "complete",
e580: 20 20 20 20 20 20 20 20 20 20 20 22 63 6f 70 79             "copy
e590: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
e5a0: 22 65 6e 61 62 6c 65 5f 6c 6f 61 64 5f 65 78 74  "enable_load_ext
e5b0: 65 6e 73 69 6f 6e 22 2c 0a 20 20 20 20 22 65 72  ension",.    "er
e5c0: 72 6f 72 63 6f 64 65 22 2c 20 20 20 20 20 20 20  rorcode",       
e5d0: 20 20 20 22 65 76 61 6c 22 2c 20 20 20 20 20 20     "eval",      
e5e0: 20 20 20 20 20 20 20 20 22 65 78 69 73 74 73 22          "exists"
e5f0: 2c 0a 20 20 20 20 22 66 75 6e 63 74 69 6f 6e 22  ,.    "function"
e600: 2c 20 20 20 20 20 20 20 20 20 20 20 22 69 6e 63  ,           "inc
e610: 72 62 6c 6f 62 22 2c 20 20 20 20 20 20 20 20 20  rblob",         
e620: 20 22 69 6e 74 65 72 72 75 70 74 22 2c 0a 20 20   "interrupt",.  
e630: 20 20 22 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72    "last_insert_r
e640: 6f 77 69 64 22 2c 20 20 22 6e 75 6c 6c 76 61 6c  owid",  "nullval
e650: 75 65 22 2c 20 20 20 20 20 20 20 20 20 22 6f 6e  ue",         "on
e660: 65 63 6f 6c 75 6d 6e 22 2c 0a 20 20 20 20 22 70  ecolumn",.    "p
e670: 72 65 75 70 64 61 74 65 22 2c 20 20 20 20 20 20  reupdate",      
e680: 20 20 20 20 22 70 72 6f 66 69 6c 65 22 2c 20 20      "profile",  
e690: 20 20 20 20 20 20 20 20 20 22 70 72 6f 67 72 65           "progre
e6a0: 73 73 22 2c 0a 20 20 20 20 22 72 65 6b 65 79 22  ss",.    "rekey"
e6b0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  ,              "
e6c0: 72 65 73 74 6f 72 65 22 2c 20 20 20 20 20 20 20  restore",       
e6d0: 20 20 20 20 22 72 6f 6c 6c 62 61 63 6b 5f 68 6f      "rollback_ho
e6e0: 6f 6b 22 2c 0a 20 20 20 20 22 73 74 61 74 75 73  ok",.    "status
e6f0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 22  ",             "
e700: 74 69 6d 65 6f 75 74 22 2c 20 20 20 20 20 20 20  timeout",       
e710: 20 20 20 20 22 74 6f 74 61 6c 5f 63 68 61 6e 67      "total_chang
e720: 65 73 22 2c 0a 20 20 20 20 22 74 72 61 63 65 22  es",.    "trace"
e730: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  ,              "
e740: 74 72 61 63 65 5f 76 32 22 2c 20 20 20 20 20 20  trace_v2",      
e750: 20 20 20 20 22 74 72 61 6e 73 61 63 74 69 6f 6e      "transaction
e760: 22 2c 0a 20 20 20 20 22 75 6e 6c 6f 63 6b 5f 6e  ",.    "unlock_n
e770: 6f 74 69 66 79 22 2c 20 20 20 20 20 20 22 75 70  otify",      "up
e780: 64 61 74 65 5f 68 6f 6f 6b 22 2c 20 20 20 20 20  date_hook",     
e790: 20 20 22 76 65 72 73 69 6f 6e 22 2c 0a 20 20 20    "version",.   
e7a0: 20 22 77 61 6c 5f 68 6f 6f 6b 22 2c 0a 20 20 20   "wal_hook",.   
e7b0: 20 30 0a 20 20 7d 3b 0a 20 20 65 6e 75 6d 20 44   0.  };.  enum D
e7c0: 42 5f 65 6e 75 6d 20 7b 0a 20 20 20 20 44 42 5f  B_enum {.    DB_
e7d0: 41 55 54 48 4f 52 49 5a 45 52 2c 20 20 20 20 20  AUTHORIZER,     
e7e0: 20 20 20 44 42 5f 42 41 43 4b 55 50 2c 20 20 20     DB_BACKUP,   
e7f0: 20 20 20 20 20 20 20 20 44 42 5f 42 55 53 59 2c          DB_BUSY,
e800: 0a 20 20 20 20 44 42 5f 43 41 43 48 45 2c 20 20  .    DB_CACHE,  
e810: 20 20 20 20 20 20 20 20 20 20 20 44 42 5f 43 48             DB_CH
e820: 41 4e 47 45 53 2c 20 20 20 20 20 20 20 20 20 20  ANGES,          
e830: 44 42 5f 43 4c 4f 53 45 2c 0a 20 20 20 20 44 42  DB_CLOSE,.    DB
e840: 5f 43 4f 4c 4c 41 54 45 2c 20 20 20 20 20 20 20  _COLLATE,       
e850: 20 20 20 20 44 42 5f 43 4f 4c 4c 41 54 49 4f 4e      DB_COLLATION
e860: 5f 4e 45 45 44 45 44 2c 20 44 42 5f 43 4f 4d 4d  _NEEDED, DB_COMM
e870: 49 54 5f 48 4f 4f 4b 2c 0a 20 20 20 20 44 42 5f  IT_HOOK,.    DB_
e880: 43 4f 4d 50 4c 45 54 45 2c 20 20 20 20 20 20 20  COMPLETE,       
e890: 20 20 20 44 42 5f 43 4f 50 59 2c 20 20 20 20 20     DB_COPY,     
e8a0: 20 20 20 20 20 20 20 20 44 42 5f 45 4e 41 42 4c          DB_ENABL
e8b0: 45 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e  E_LOAD_EXTENSION
e8c0: 2c 0a 20 20 20 20 44 42 5f 45 52 52 4f 52 43 4f  ,.    DB_ERRORCO
e8d0: 44 45 2c 20 20 20 20 20 20 20 20 20 44 42 5f 45  DE,         DB_E
e8e0: 56 41 4c 2c 20 20 20 20 20 20 20 20 20 20 20 20  VAL,            
e8f0: 20 44 42 5f 45 58 49 53 54 53 2c 0a 20 20 20 20   DB_EXISTS,.    
e900: 44 42 5f 46 55 4e 43 54 49 4f 4e 2c 20 20 20 20  DB_FUNCTION,    
e910: 20 20 20 20 20 20 44 42 5f 49 4e 43 52 42 4c 4f        DB_INCRBLO
e920: 42 2c 20 20 20 20 20 20 20 20 20 44 42 5f 49 4e  B,         DB_IN
e930: 54 45 52 52 55 50 54 2c 0a 20 20 20 20 44 42 5f  TERRUPT,.    DB_
e940: 4c 41 53 54 5f 49 4e 53 45 52 54 5f 52 4f 57 49  LAST_INSERT_ROWI
e950: 44 2c 20 44 42 5f 4e 55 4c 4c 56 41 4c 55 45 2c  D, DB_NULLVALUE,
e960: 20 20 20 20 20 20 20 20 44 42 5f 4f 4e 45 43 4f          DB_ONECO
e970: 4c 55 4d 4e 2c 0a 20 20 20 20 44 42 5f 50 52 45  LUMN,.    DB_PRE
e980: 55 50 44 41 54 45 2c 20 20 20 20 20 20 20 20 20  UPDATE,         
e990: 44 42 5f 50 52 4f 46 49 4c 45 2c 20 20 20 20 20  DB_PROFILE,     
e9a0: 20 20 20 20 20 44 42 5f 50 52 4f 47 52 45 53 53       DB_PROGRESS
e9b0: 2c 0a 20 20 20 20 44 42 5f 52 45 4b 45 59 2c 20  ,.    DB_REKEY, 
e9c0: 20 20 20 20 20 20 20 20 20 20 20 20 44 42 5f 52              DB_R
e9d0: 45 53 54 4f 52 45 2c 20 20 20 20 20 20 20 20 20  ESTORE,         
e9e0: 20 44 42 5f 52 4f 4c 4c 42 41 43 4b 5f 48 4f 4f   DB_ROLLBACK_HOO
e9f0: 4b 2c 0a 20 20 20 20 44 42 5f 53 54 41 54 55 53  K,.    DB_STATUS
ea00: 2c 20 20 20 20 20 20 20 20 20 20 20 20 44 42 5f  ,            DB_
ea10: 54 49 4d 45 4f 55 54 2c 20 20 20 20 20 20 20 20  TIMEOUT,        
ea20: 20 20 44 42 5f 54 4f 54 41 4c 5f 43 48 41 4e 47    DB_TOTAL_CHANG
ea30: 45 53 2c 0a 20 20 20 20 44 42 5f 54 52 41 43 45  ES,.    DB_TRACE
ea40: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 44 42  ,             DB
ea50: 5f 54 52 41 43 45 5f 56 32 2c 20 20 20 20 20 20  _TRACE_V2,      
ea60: 20 20 20 44 42 5f 54 52 41 4e 53 41 43 54 49 4f     DB_TRANSACTIO
ea70: 4e 2c 0a 20 20 20 20 44 42 5f 55 4e 4c 4f 43 4b  N,.    DB_UNLOCK
ea80: 5f 4e 4f 54 49 46 59 2c 20 20 20 20 20 44 42 5f  _NOTIFY,     DB_
ea90: 55 50 44 41 54 45 5f 48 4f 4f 4b 2c 20 20 20 20  UPDATE_HOOK,    
eaa0: 20 20 44 42 5f 56 45 52 53 49 4f 4e 2c 0a 20 20    DB_VERSION,.  
eab0: 20 20 44 42 5f 57 41 4c 5f 48 4f 4f 4b 2c 0a 20    DB_WAL_HOOK,. 
eac0: 20 7d 3b 0a 20 20 2f 2a 20 64 6f 6e 27 74 20 6c   };.  /* don't l
ead0: 65 61 76 65 20 74 72 61 69 6c 69 6e 67 20 63 6f  eave trailing co
eae0: 6d 6d 61 73 20 6f 6e 20 44 42 5f 65 6e 75 6d 2c  mmas on DB_enum,
eaf0: 20 69 74 20 63 6f 6e 66 75 73 65 73 20 74 68 65   it confuses the
eb00: 20 41 49 58 20 78 6c 63 20 63 6f 6d 70 69 6c 65   AIX xlc compile
eb10: 72 20 2a 2f 0a 0a 20 20 69 66 28 20 6f 62 6a 63  r */..  if( objc
eb20: 3c 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  <2 ){.    Tcl_Wr
eb30: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
eb40: 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53 55 42  p, 1, objv, "SUB
eb50: 43 4f 4d 4d 41 4e 44 20 2e 2e 2e 22 29 3b 0a 20  COMMAND ...");. 
eb60: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
eb70: 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54  ROR;.  }.  if( T
eb80: 63 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f  cl_GetIndexFromO
eb90: 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
eba0: 31 5d 2c 20 44 42 5f 73 74 72 73 2c 20 22 6f 70  1], DB_strs, "op
ebb0: 74 69 6f 6e 22 2c 20 30 2c 20 26 63 68 6f 69 63  tion", 0, &choic
ebc0: 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  e) ){.    return
ebd0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
ebe0: 0a 20 20 73 77 69 74 63 68 28 20 28 65 6e 75 6d  .  switch( (enum
ebf0: 20 44 42 5f 65 6e 75 6d 29 63 68 6f 69 63 65 20   DB_enum)choice 
ec00: 29 7b 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20  ){..  /*    $db 
ec10: 61 75 74 68 6f 72 69 7a 65 72 20 3f 43 41 4c 4c  authorizer ?CALL
ec20: 42 41 43 4b 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20  BACK?.  **.  ** 
ec30: 49 6e 76 6f 6b 65 20 74 68 65 20 67 69 76 65 6e  Invoke the given
ec40: 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20 61 75 74   callback to aut
ec50: 68 6f 72 69 7a 65 20 65 61 63 68 20 53 51 4c 20  horize each SQL 
ec60: 6f 70 65 72 61 74 69 6f 6e 20 61 73 20 69 74 20  operation as it 
ec70: 69 73 0a 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 64  is.  ** compiled
ec80: 2e 20 20 35 20 61 72 67 75 6d 65 6e 74 73 20 61  .  5 arguments a
ec90: 72 65 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74  re appended to t
eca0: 68 65 20 63 61 6c 6c 62 61 63 6b 20 62 65 66 6f  he callback befo
ecb0: 72 65 20 69 74 20 69 73 0a 20 20 2a 2a 20 69 6e  re it is.  ** in
ecc0: 76 6f 6b 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  voked:.  **.  **
ecd0: 20 20 20 28 31 29 20 54 68 65 20 61 75 74 68 6f     (1) The autho
ece0: 72 69 7a 61 74 69 6f 6e 20 74 79 70 65 20 28 65  rization type (e
ecf0: 78 3a 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45  x: SQLITE_CREATE
ed00: 5f 54 41 42 4c 45 2c 20 53 51 4c 49 54 45 5f 49  _TABLE, SQLITE_I
ed10: 4e 53 45 52 54 2c 20 2e 2e 2e 29 0a 20 20 2a 2a  NSERT, ...).  **
ed20: 20 20 20 28 32 29 20 46 69 72 73 74 20 64 65 73     (2) First des
ed30: 63 72 69 70 74 69 76 65 20 6e 61 6d 65 20 28 64  criptive name (d
ed40: 65 70 65 6e 64 73 20 6f 6e 20 61 75 74 68 6f 72  epends on author
ed50: 69 7a 61 74 69 6f 6e 20 74 79 70 65 29 0a 20 20  ization type).  
ed60: 2a 2a 20 20 20 28 33 29 20 53 65 63 6f 6e 64 20  **   (3) Second 
ed70: 64 65 73 63 72 69 70 74 69 76 65 20 6e 61 6d 65  descriptive name
ed80: 0a 20 20 2a 2a 20 20 20 28 34 29 20 4e 61 6d 65  .  **   (4) Name
ed90: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
eda0: 20 28 65 78 3a 20 22 6d 61 69 6e 22 2c 20 22 74   (ex: "main", "t
edb0: 65 6d 70 22 29 0a 20 20 2a 2a 20 20 20 28 35 29  emp").  **   (5)
edc0: 20 4e 61 6d 65 20 6f 66 20 74 72 69 67 67 65 72   Name of trigger
edd0: 20 74 68 61 74 20 69 73 20 64 6f 69 6e 67 20 74   that is doing t
ede0: 68 65 20 61 63 63 65 73 73 0a 20 20 2a 2a 0a 20  he access.  **. 
edf0: 20 2a 2a 20 54 68 65 20 63 61 6c 6c 62 61 63 6b   ** The callback
ee00: 20 73 68 6f 75 6c 64 20 72 65 74 75 72 6e 20 6f   should return o
ee10: 6e 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  n of the followi
ee20: 6e 67 20 73 74 72 69 6e 67 73 3a 20 53 51 4c 49  ng strings: SQLI
ee30: 54 45 5f 4f 4b 2c 0a 20 20 2a 2a 20 53 51 4c 49  TE_OK,.  ** SQLI
ee40: 54 45 5f 49 47 4e 4f 52 45 2c 20 6f 72 20 53 51  TE_IGNORE, or SQ
ee50: 4c 49 54 45 5f 44 45 4e 59 2e 20 20 41 6e 79 20  LITE_DENY.  Any 
ee60: 6f 74 68 65 72 20 72 65 74 75 72 6e 20 76 61 6c  other return val
ee70: 75 65 20 69 73 20 61 6e 20 65 72 72 6f 72 2e 0a  ue is an error..
ee80: 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69    **.  ** If thi
ee90: 73 20 6d 65 74 68 6f 64 20 69 73 20 69 6e 76 6f  s method is invo
eea0: 6b 65 64 20 77 69 74 68 20 6e 6f 20 61 72 67 75  ked with no argu
eeb0: 6d 65 6e 74 73 2c 20 74 68 65 20 63 75 72 72 65  ments, the curre
eec0: 6e 74 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e  nt authorization
eed0: 0a 20 20 2a 2a 20 63 61 6c 6c 62 61 63 6b 20 73  .  ** callback s
eee0: 74 72 69 6e 67 20 69 73 20 72 65 74 75 72 6e 65  tring is returne
eef0: 64 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  d..  */.  case D
ef00: 42 5f 41 55 54 48 4f 52 49 5a 45 52 3a 20 7b 0a  B_AUTHORIZER: {.
ef10: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
ef20: 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e  IT_AUTHORIZATION
ef30: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
ef40: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 61  esult(interp, "a
ef50: 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 6e 6f 74  uthorization not
ef60: 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 74 68   available in th
ef70: 69 73 20 62 75 69 6c 64 22 2c 0a 20 20 20 20 20  is build",.     
ef80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ef90: 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 72  (char*)0);.    r
efa0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
efb0: 0a 23 65 6c 73 65 0a 20 20 20 20 69 66 28 20 6f  .#else.    if( o
efc0: 62 6a 63 3e 33 20 29 7b 0a 20 20 20 20 20 20 54  bjc>3 ){.      T
efd0: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
efe0: 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c  interp, 2, objv,
eff0: 20 22 3f 43 41 4c 4c 42 41 43 4b 3f 22 29 3b 0a   "?CALLBACK?");.
f000: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
f010: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73  _ERROR;.    }els
f020: 65 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b  e if( objc==2 ){
f030: 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e  .      if( pDb->
f040: 7a 41 75 74 68 20 29 7b 0a 20 20 20 20 20 20 20  zAuth ){.       
f050: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
f060: 74 28 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a  t(interp, pDb->z
f070: 41 75 74 68 2c 20 28 63 68 61 72 2a 29 30 29 3b  Auth, (char*)0);
f080: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
f090: 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  se{.      char *
f0a0: 7a 41 75 74 68 3b 0a 20 20 20 20 20 20 69 6e 74  zAuth;.      int
f0b0: 20 6c 65 6e 3b 0a 20 20 20 20 20 20 69 66 28 20   len;.      if( 
f0c0: 70 44 62 2d 3e 7a 41 75 74 68 20 29 7b 0a 20 20  pDb->zAuth ){.  
f0d0: 20 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70        Tcl_Free(p
f0e0: 44 62 2d 3e 7a 41 75 74 68 29 3b 0a 20 20 20 20  Db->zAuth);.    
f0f0: 20 20 7d 0a 20 20 20 20 20 20 7a 41 75 74 68 20    }.      zAuth 
f100: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  = Tcl_GetStringF
f110: 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20  romObj(objv[2], 
f120: 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28  &len);.      if(
f130: 20 7a 41 75 74 68 20 26 26 20 6c 65 6e 3e 30 20   zAuth && len>0 
f140: 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e  ){.        pDb->
f150: 7a 41 75 74 68 20 3d 20 54 63 6c 5f 41 6c 6c 6f  zAuth = Tcl_Allo
f160: 63 28 20 6c 65 6e 20 2b 20 31 20 29 3b 0a 20 20  c( len + 1 );.  
f170: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 44 62        memcpy(pDb
f180: 2d 3e 7a 41 75 74 68 2c 20 7a 41 75 74 68 2c 20  ->zAuth, zAuth, 
f190: 6c 65 6e 2b 31 29 3b 0a 20 20 20 20 20 20 7d 65  len+1);.      }e
f1a0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 44 62  lse{.        pDb
f1b0: 2d 3e 7a 41 75 74 68 20 3d 20 30 3b 0a 20 20 20  ->zAuth = 0;.   
f1c0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
f1d0: 44 62 2d 3e 7a 41 75 74 68 20 29 7b 0a 20 20 20  Db->zAuth ){.   
f1e0: 20 20 20 20 20 74 79 70 65 64 65 66 20 69 6e 74       typedef int
f1f0: 20 28 2a 73 71 6c 69 74 65 33 5f 61 75 74 68 5f   (*sqlite3_auth_
f200: 63 62 29 28 0a 20 20 20 20 20 20 20 20 20 20 20  cb)(.           
f210: 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20  void*,int,const 
f220: 63 68 61 72 2a 2c 63 6f 6e 73 74 20 63 68 61 72  char*,const char
f230: 2a 2c 0a 20 20 20 20 20 20 20 20 20 20 20 63 6f  *,.           co
f240: 6e 73 74 20 63 68 61 72 2a 2c 63 6f 6e 73 74 20  nst char*,const 
f250: 63 68 61 72 2a 29 3b 0a 20 20 20 20 20 20 20 20  char*);.        
f260: 70 44 62 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e  pDb->interp = in
f270: 74 65 72 70 3b 0a 20 20 20 20 20 20 20 20 73 71  terp;.        sq
f280: 6c 69 74 65 33 5f 73 65 74 5f 61 75 74 68 6f 72  lite3_set_author
f290: 69 7a 65 72 28 70 44 62 2d 3e 64 62 2c 28 73 71  izer(pDb->db,(sq
f2a0: 6c 69 74 65 33 5f 61 75 74 68 5f 63 62 29 61 75  lite3_auth_cb)au
f2b0: 74 68 5f 63 61 6c 6c 62 61 63 6b 2c 70 44 62 29  th_callback,pDb)
f2c0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
f2d0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
f2e0: 65 74 5f 61 75 74 68 6f 72 69 7a 65 72 28 70 44  et_authorizer(pD
f2f0: 62 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20  b->db, 0, 0);.  
f300: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64      }.    }.#end
f310: 69 66 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  if.    break;.  
f320: 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 62  }..  /*    $db b
f330: 61 63 6b 75 70 20 3f 44 41 54 41 42 41 53 45 3f  ackup ?DATABASE?
f340: 20 46 49 4c 45 4e 41 4d 45 0a 20 20 2a 2a 0a 20   FILENAME.  **. 
f350: 20 2a 2a 20 4f 70 65 6e 20 6f 72 20 63 72 65 61   ** Open or crea
f360: 74 65 20 61 20 64 61 74 61 62 61 73 65 20 66 69  te a database fi
f370: 6c 65 20 6e 61 6d 65 64 20 46 49 4c 45 4e 41 4d  le named FILENAM
f380: 45 2e 20 20 54 72 61 6e 73 66 65 72 20 74 68 65  E.  Transfer the
f390: 0a 20 20 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66  .  ** content of
f3a0: 20 6c 6f 63 61 6c 20 64 61 74 61 62 61 73 65 20   local database 
f3b0: 44 41 54 41 42 41 53 45 20 28 64 65 66 61 75 6c  DATABASE (defaul
f3c0: 74 3a 20 22 6d 61 69 6e 22 29 20 69 6e 74 6f 20  t: "main") into 
f3d0: 74 68 65 0a 20 20 2a 2a 20 46 49 4c 45 4e 41 4d  the.  ** FILENAM
f3e0: 45 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f  E database..  */
f3f0: 0a 20 20 63 61 73 65 20 44 42 5f 42 41 43 4b 55  .  case DB_BACKU
f400: 50 3a 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  P: {.    const c
f410: 68 61 72 20 2a 7a 44 65 73 74 46 69 6c 65 3b 0a  har *zDestFile;.
f420: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
f430: 7a 53 72 63 44 62 3b 0a 20 20 20 20 73 71 6c 69  zSrcDb;.    sqli
f440: 74 65 33 20 2a 70 44 65 73 74 3b 0a 20 20 20 20  te3 *pDest;.    
f450: 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 2a  sqlite3_backup *
f460: 70 42 61 63 6b 75 70 3b 0a 0a 20 20 20 20 69 66  pBackup;..    if
f470: 28 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20 20 20  ( objc==3 ){.   
f480: 20 20 20 7a 53 72 63 44 62 20 3d 20 22 6d 61 69     zSrcDb = "mai
f490: 6e 22 3b 0a 20 20 20 20 20 20 7a 44 65 73 74 46  n";.      zDestF
f4a0: 69 6c 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  ile = Tcl_GetStr
f4b0: 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20  ing(objv[2]);.  
f4c0: 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a 63    }else if( objc
f4d0: 3d 3d 34 20 29 7b 0a 20 20 20 20 20 20 7a 53 72  ==4 ){.      zSr
f4e0: 63 44 62 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  cDb = Tcl_GetStr
f4f0: 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20  ing(objv[2]);.  
f500: 20 20 20 20 7a 44 65 73 74 46 69 6c 65 20 3d 20      zDestFile = 
f510: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
f520: 6a 76 5b 33 5d 29 3b 0a 20 20 20 20 7d 65 6c 73  jv[3]);.    }els
f530: 65 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f  e{.      Tcl_Wro
f540: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
f550: 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 44 41 54  , 2, objv, "?DAT
f560: 41 42 41 53 45 3f 20 46 49 4c 45 4e 41 4d 45 22  ABASE? FILENAME"
f570: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
f580: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
f590: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
f5a0: 33 5f 6f 70 65 6e 5f 76 32 28 7a 44 65 73 74 46  3_open_v2(zDestF
f5b0: 69 6c 65 2c 20 26 70 44 65 73 74 2c 0a 20 20 20  ile, &pDest,.   
f5c0: 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
f5d0: 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
f5e0: 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  E | SQLITE_OPEN_
f5f0: 43 52 45 41 54 45 7c 20 70 44 62 2d 3e 6f 70 65  CREATE| pDb->ope
f600: 6e 46 6c 61 67 73 2c 20 30 29 3b 0a 20 20 20 20  nFlags, 0);.    
f610: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
f620: 4b 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41  K ){.      Tcl_A
f630: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
f640: 72 70 2c 20 22 63 61 6e 6e 6f 74 20 6f 70 65 6e  rp, "cannot open
f650: 20 74 61 72 67 65 74 20 64 61 74 61 62 61 73 65   target database
f660: 3a 20 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  : ",.           
f670: 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70  sqlite3_errmsg(p
f680: 44 65 73 74 29 2c 20 28 63 68 61 72 2a 29 30 29  Dest), (char*)0)
f690: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
f6a0: 63 6c 6f 73 65 28 70 44 65 73 74 29 3b 0a 20 20  close(pDest);.  
f6b0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
f6c0: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
f6d0: 70 42 61 63 6b 75 70 20 3d 20 73 71 6c 69 74 65  pBackup = sqlite
f6e0: 33 5f 62 61 63 6b 75 70 5f 69 6e 69 74 28 70 44  3_backup_init(pD
f6f0: 65 73 74 2c 20 22 6d 61 69 6e 22 2c 20 70 44 62  est, "main", pDb
f700: 2d 3e 64 62 2c 20 7a 53 72 63 44 62 29 3b 0a 20  ->db, zSrcDb);. 
f710: 20 20 20 69 66 28 20 70 42 61 63 6b 75 70 3d 3d     if( pBackup==
f720: 30 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41  0 ){.      Tcl_A
f730: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
f740: 72 70 2c 20 22 62 61 63 6b 75 70 20 66 61 69 6c  rp, "backup fail
f750: 65 64 3a 20 22 2c 0a 20 20 20 20 20 20 20 20 20  ed: ",.         
f760: 20 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67    sqlite3_errmsg
f770: 28 70 44 65 73 74 29 2c 20 28 63 68 61 72 2a 29  (pDest), (char*)
f780: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
f790: 33 5f 63 6c 6f 73 65 28 70 44 65 73 74 29 3b 0a  3_close(pDest);.
f7a0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
f7b0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
f7c0: 20 20 77 68 69 6c 65 28 20 20 28 72 63 20 3d 20    while(  (rc = 
f7d0: 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f 73  sqlite3_backup_s
f7e0: 74 65 70 28 70 42 61 63 6b 75 70 2c 31 30 30 29  tep(pBackup,100)
f7f0: 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 7d  )==SQLITE_OK ){}
f800: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 61 63  .    sqlite3_bac
f810: 6b 75 70 5f 66 69 6e 69 73 68 28 70 42 61 63 6b  kup_finish(pBack
f820: 75 70 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  up);.    if( rc=
f830: 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a  =SQLITE_DONE ){.
f840: 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 4f        rc = TCL_O
f850: 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  K;.    }else{.  
f860: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
f870: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 61  sult(interp, "ba
f880: 63 6b 75 70 20 66 61 69 6c 65 64 3a 20 22 2c 0a  ckup failed: ",.
f890: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
f8a0: 65 33 5f 65 72 72 6d 73 67 28 70 44 65 73 74 29  e3_errmsg(pDest)
f8b0: 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20  , (char*)0);.   
f8c0: 20 20 20 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f     rc = TCL_ERRO
f8d0: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  R;.    }.    sql
f8e0: 69 74 65 33 5f 63 6c 6f 73 65 28 70 44 65 73 74  ite3_close(pDest
f8f0: 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  );.    break;.  
f900: 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 62  }..  /*    $db b
f910: 75 73 79 20 3f 43 41 4c 4c 42 41 43 4b 3f 0a 20  usy ?CALLBACK?. 
f920: 20 2a 2a 0a 20 20 2a 2a 20 49 6e 76 6f 6b 65 20   **.  ** Invoke 
f930: 74 68 65 20 67 69 76 65 6e 20 63 61 6c 6c 62 61  the given callba
f940: 63 6b 20 69 66 20 61 6e 20 53 51 4c 20 73 74 61  ck if an SQL sta
f950: 74 65 6d 65 6e 74 20 61 74 74 65 6d 70 74 73 20  tement attempts 
f960: 74 6f 20 6f 70 65 6e 0a 20 20 2a 2a 20 61 20 6c  to open.  ** a l
f970: 6f 63 6b 65 64 20 64 61 74 61 62 61 73 65 20 66  ocked database f
f980: 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  ile..  */.  case
f990: 20 44 42 5f 42 55 53 59 3a 20 7b 0a 20 20 20 20   DB_BUSY: {.    
f9a0: 69 66 28 20 6f 62 6a 63 3e 33 20 29 7b 0a 20 20  if( objc>3 ){.  
f9b0: 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
f9c0: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20  Args(interp, 2, 
f9d0: 6f 62 6a 76 2c 20 22 43 41 4c 4c 42 41 43 4b 22  objv, "CALLBACK"
f9e0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
f9f0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
fa00: 65 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d 32  else if( objc==2
fa10: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 44   ){.      if( pD
fa20: 62 2d 3e 7a 42 75 73 79 20 29 7b 0a 20 20 20 20  b->zBusy ){.    
fa30: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
fa40: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 44 62  sult(interp, pDb
fa50: 2d 3e 7a 42 75 73 79 2c 20 28 63 68 61 72 2a 29  ->zBusy, (char*)
fa60: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
fa70: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61  }else{.      cha
fa80: 72 20 2a 7a 42 75 73 79 3b 0a 20 20 20 20 20 20  r *zBusy;.      
fa90: 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20 69  int len;.      i
faa0: 66 28 20 70 44 62 2d 3e 7a 42 75 73 79 20 29 7b  f( pDb->zBusy ){
fab0: 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 46 72 65  .        Tcl_Fre
fac0: 65 28 70 44 62 2d 3e 7a 42 75 73 79 29 3b 0a 20  e(pDb->zBusy);. 
fad0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 42 75       }.      zBu
fae0: 73 79 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  sy = Tcl_GetStri
faf0: 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32  ngFromObj(objv[2
fb00: 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20  ], &len);.      
fb10: 69 66 28 20 7a 42 75 73 79 20 26 26 20 6c 65 6e  if( zBusy && len
fb20: 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44  >0 ){.        pD
fb30: 62 2d 3e 7a 42 75 73 79 20 3d 20 54 63 6c 5f 41  b->zBusy = Tcl_A
fb40: 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20 31 20 29 3b  lloc( len + 1 );
fb50: 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
fb60: 70 44 62 2d 3e 7a 42 75 73 79 2c 20 7a 42 75 73  pDb->zBusy, zBus
fb70: 79 2c 20 6c 65 6e 2b 31 29 3b 0a 20 20 20 20 20  y, len+1);.     
fb80: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
fb90: 70 44 62 2d 3e 7a 42 75 73 79 20 3d 20 30 3b 0a  pDb->zBusy = 0;.
fba0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
fbb0: 28 20 70 44 62 2d 3e 7a 42 75 73 79 20 29 7b 0a  ( pDb->zBusy ){.
fbc0: 20 20 20 20 20 20 20 20 70 44 62 2d 3e 69 6e 74          pDb->int
fbd0: 65 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20  erp = interp;.  
fbe0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 75        sqlite3_bu
fbf0: 73 79 5f 68 61 6e 64 6c 65 72 28 70 44 62 2d 3e  sy_handler(pDb->
fc00: 64 62 2c 20 44 62 42 75 73 79 48 61 6e 64 6c 65  db, DbBusyHandle
fc10: 72 2c 20 70 44 62 29 3b 0a 20 20 20 20 20 20 7d  r, pDb);.      }
fc20: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
fc30: 6c 69 74 65 33 5f 62 75 73 79 5f 68 61 6e 64 6c  lite3_busy_handl
fc40: 65 72 28 70 44 62 2d 3e 64 62 2c 20 30 2c 20 30  er(pDb->db, 0, 0
fc50: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
fc60: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
fc70: 0a 20 20 2f 2a 20 20 20 20 20 24 64 62 20 63 61  .  /*     $db ca
fc80: 63 68 65 20 66 6c 75 73 68 0a 20 20 2a 2a 20 20  che flush.  **  
fc90: 20 20 20 24 64 62 20 63 61 63 68 65 20 73 69 7a     $db cache siz
fca0: 65 20 6e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46 6c  e n.  **.  ** Fl
fcb0: 75 73 68 20 74 68 65 20 70 72 65 70 61 72 65 64  ush the prepared
fcc0: 20 73 74 61 74 65 6d 65 6e 74 20 63 61 63 68 65   statement cache
fcd0: 2c 20 6f 72 20 73 65 74 20 74 68 65 20 6d 61 78  , or set the max
fce0: 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 0a 20  imum number of. 
fcf0: 20 2a 2a 20 63 61 63 68 65 64 20 73 74 61 74 65   ** cached state
fd00: 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 63 61  ments..  */.  ca
fd10: 73 65 20 44 42 5f 43 41 43 48 45 3a 20 7b 0a 20  se DB_CACHE: {. 
fd20: 20 20 20 63 68 61 72 20 2a 73 75 62 43 6d 64 3b     char *subCmd;
fd30: 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 0a 20 20 20  .    int n;..   
fd40: 20 69 66 28 20 6f 62 6a 63 3c 3d 32 20 29 7b 0a   if( objc<=2 ){.
fd50: 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
fd60: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
fd70: 2c 20 6f 62 6a 76 2c 20 22 63 61 63 68 65 20 6f  , objv, "cache o
fd80: 70 74 69 6f 6e 20 3f 61 72 67 3f 22 29 3b 0a 20  ption ?arg?");. 
fd90: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
fda0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
fdb0: 20 73 75 62 43 6d 64 20 3d 20 54 63 6c 5f 47 65   subCmd = Tcl_Ge
fdc0: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 20  tStringFromObj( 
fdd0: 6f 62 6a 76 5b 32 5d 2c 20 30 20 29 3b 0a 20 20  objv[2], 0 );.  
fde0: 20 20 69 66 28 20 2a 73 75 62 43 6d 64 3d 3d 27    if( *subCmd=='
fdf0: 66 27 20 26 26 20 73 74 72 63 6d 70 28 73 75 62  f' && strcmp(sub
fe00: 43 6d 64 2c 22 66 6c 75 73 68 22 29 3d 3d 30 20  Cmd,"flush")==0 
fe10: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6f 62 6a  ){.      if( obj
fe20: 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 20 20  c!=3 ){.        
fe30: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
fe40: 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76  (interp, 2, objv
fe50: 2c 20 22 66 6c 75 73 68 22 29 3b 0a 20 20 20 20  , "flush");.    
fe60: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
fe70: 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 65 6c 73  RROR;.      }els
fe80: 65 7b 0a 20 20 20 20 20 20 20 20 66 6c 75 73 68  e{.        flush
fe90: 53 74 6d 74 43 61 63 68 65 28 20 70 44 62 20 29  StmtCache( pDb )
fea0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
feb0: 6c 73 65 20 69 66 28 20 2a 73 75 62 43 6d 64 3d  lse if( *subCmd=
fec0: 3d 27 73 27 20 26 26 20 73 74 72 63 6d 70 28 73  ='s' && strcmp(s
fed0: 75 62 43 6d 64 2c 22 73 69 7a 65 22 29 3d 3d 30  ubCmd,"size")==0
fee0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6f 62   ){.      if( ob
fef0: 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 20 20 20  jc!=4 ){.       
ff00: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
ff10: 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a  s(interp, 2, obj
ff20: 76 2c 20 22 73 69 7a 65 20 6e 22 29 3b 0a 20 20  v, "size n");.  
ff30: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
ff40: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 65  _ERROR;.      }e
ff50: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28  lse{.        if(
ff60: 20 54 43 4c 5f 45 52 52 4f 52 3d 3d 54 63 6c 5f   TCL_ERROR==Tcl_
ff70: 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
ff80: 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26  terp, objv[3], &
ff90: 6e 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  n) ){.          
ffa0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
ffb0: 28 20 69 6e 74 65 72 70 2c 20 22 63 61 6e 6e 6f  ( interp, "canno
ffc0: 74 20 63 6f 6e 76 65 72 74 20 5c 22 22 2c 0a 20  t convert \"",. 
ffd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54 63                Tc
ffe0: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
fff0: 62 6a 28 6f 62 6a 76 5b 33 5d 2c 30 29 2c 20 22  bj(objv[3],0), "
10000 5c 22 20 74 6f 20 69 6e 74 65 67 65 72 22 2c 20  \" to integer", 
10010 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20  (char*)0);.     
10020 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
10030 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d  ERROR;.        }
10040 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
10050 69 66 28 20 6e 3c 30 20 29 7b 0a 20 20 20 20 20  if( n<0 ){.     
10060 20 20 20 20 20 20 20 66 6c 75 73 68 53 74 6d 74         flushStmt
10070 43 61 63 68 65 28 20 70 44 62 20 29 3b 0a 20 20  Cache( pDb );.  
10080 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20 30 3b            n = 0;
10090 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
100a0 20 69 66 28 20 6e 3e 4d 41 58 5f 50 52 45 50 41   if( n>MAX_PREPA
100b0 52 45 44 5f 53 54 4d 54 53 20 29 7b 0a 20 20 20  RED_STMTS ){.   
100c0 20 20 20 20 20 20 20 20 20 6e 20 3d 20 4d 41 58           n = MAX
100d0 5f 50 52 45 50 41 52 45 44 5f 53 54 4d 54 53 3b  _PREPARED_STMTS;
100e0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
100f0 20 20 20 20 20 20 20 70 44 62 2d 3e 6d 61 78 53         pDb->maxS
10100 74 6d 74 20 3d 20 6e 3b 0a 20 20 20 20 20 20 20  tmt = n;.       
10110 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
10120 65 6c 73 65 7b 0a 20 20 20 20 20 20 54 63 6c 5f  else{.      Tcl_
10130 41 70 70 65 6e 64 52 65 73 75 6c 74 28 20 69 6e  AppendResult( in
10140 74 65 72 70 2c 20 22 62 61 64 20 6f 70 74 69 6f  terp, "bad optio
10150 6e 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 20  n \"",.         
10160 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
10170 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 30 29  omObj(objv[2],0)
10180 2c 20 22 5c 22 3a 20 6d 75 73 74 20 62 65 20 66  , "\": must be f
10190 6c 75 73 68 20 6f 72 20 73 69 7a 65 22 2c 0a 20  lush or size",. 
101a0 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29           (char*)
101b0 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  0);.      return
101c0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
101d0 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  }.    break;.  }
101e0 0a 0a 20 20 2f 2a 20 20 20 20 20 24 64 62 20 63  ..  /*     $db c
101f0 68 61 6e 67 65 73 0a 20 20 2a 2a 0a 20 20 2a 2a  hanges.  **.  **
10200 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
10210 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20  er of rows that 
10220 77 65 72 65 20 6d 6f 64 69 66 69 65 64 2c 20 69  were modified, i
10230 6e 73 65 72 74 65 64 2c 20 6f 72 20 64 65 6c 65  nserted, or dele
10240 74 65 64 20 62 79 0a 20 20 2a 2a 20 74 68 65 20  ted by.  ** the 
10250 6d 6f 73 74 20 72 65 63 65 6e 74 20 49 4e 53 45  most recent INSE
10260 52 54 2c 20 55 50 44 41 54 45 20 6f 72 20 44 45  RT, UPDATE or DE
10270 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74 2c 20  LETE statement, 
10280 6e 6f 74 20 69 6e 63 6c 75 64 69 6e 67 0a 20 20  not including.  
10290 2a 2a 20 61 6e 79 20 63 68 61 6e 67 65 73 20 6d  ** any changes m
102a0 61 64 65 20 62 79 20 74 72 69 67 67 65 72 20 70  ade by trigger p
102b0 72 6f 67 72 61 6d 73 2e 0a 20 20 2a 2f 0a 20 20  rograms..  */.  
102c0 63 61 73 65 20 44 42 5f 43 48 41 4e 47 45 53 3a  case DB_CHANGES:
102d0 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a   {.    Tcl_Obj *
102e0 70 52 65 73 75 6c 74 3b 0a 20 20 20 20 69 66 28  pResult;.    if(
102f0 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20   objc!=2 ){.    
10300 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
10310 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62  gs(interp, 2, ob
10320 6a 76 2c 20 22 22 29 3b 0a 20 20 20 20 20 20 72  jv, "");.      r
10330 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
10340 0a 20 20 20 20 7d 0a 20 20 20 20 70 52 65 73 75  .    }.    pResu
10350 6c 74 20 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52  lt = Tcl_GetObjR
10360 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20  esult(interp);. 
10370 20 20 20 54 63 6c 5f 53 65 74 49 6e 74 4f 62 6a     Tcl_SetIntObj
10380 28 70 52 65 73 75 6c 74 2c 20 73 71 6c 69 74 65  (pResult, sqlite
10390 33 5f 63 68 61 6e 67 65 73 28 70 44 62 2d 3e 64  3_changes(pDb->d
103a0 62 29 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a  b));.    break;.
103b0 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62    }..  /*    $db
103c0 20 63 6c 6f 73 65 0a 20 20 2a 2a 0a 20 20 2a 2a   close.  **.  **
103d0 20 53 68 75 74 64 6f 77 6e 20 74 68 65 20 64 61   Shutdown the da
103e0 74 61 62 61 73 65 0a 20 20 2a 2f 0a 20 20 63 61  tabase.  */.  ca
103f0 73 65 20 44 42 5f 43 4c 4f 53 45 3a 20 7b 0a 20  se DB_CLOSE: {. 
10400 20 20 20 54 63 6c 5f 44 65 6c 65 74 65 43 6f 6d     Tcl_DeleteCom
10410 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 54 63 6c  mand(interp, Tcl
10420 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
10430 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 29 3b 0a  j(objv[0], 0));.
10440 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
10450 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64    /*.  **     $d
10460 62 20 63 6f 6c 6c 61 74 65 20 4e 41 4d 45 20 53  b collate NAME S
10470 43 52 49 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20  CRIPT.  **.  ** 
10480 43 72 65 61 74 65 20 61 20 6e 65 77 20 53 51 4c  Create a new SQL
10490 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e 63 74   collation funct
104a0 69 6f 6e 20 63 61 6c 6c 65 64 20 4e 41 4d 45 2e  ion called NAME.
104b0 20 20 57 68 65 6e 65 76 65 72 0a 20 20 2a 2a 20    Whenever.  ** 
104c0 74 68 61 74 20 66 75 6e 63 74 69 6f 6e 20 69 73  that function is
104d0 20 63 61 6c 6c 65 64 2c 20 69 6e 76 6f 6b 65 20   called, invoke 
104e0 53 43 52 49 50 54 20 74 6f 20 65 76 61 6c 75 61  SCRIPT to evalua
104f0 74 65 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 2e  te the function.
10500 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f  .  */.  case DB_
10510 43 4f 4c 4c 41 54 45 3a 20 7b 0a 20 20 20 20 53  COLLATE: {.    S
10520 71 6c 43 6f 6c 6c 61 74 65 20 2a 70 43 6f 6c 6c  qlCollate *pColl
10530 61 74 65 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  ate;.    char *z
10540 4e 61 6d 65 3b 0a 20 20 20 20 63 68 61 72 20 2a  Name;.    char *
10550 7a 53 63 72 69 70 74 3b 0a 20 20 20 20 69 6e 74  zScript;.    int
10560 20 6e 53 63 72 69 70 74 3b 0a 20 20 20 20 69 66   nScript;.    if
10570 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20  ( objc!=4 ){.   
10580 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
10590 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
105a0 62 6a 76 2c 20 22 4e 41 4d 45 20 53 43 52 49 50  bjv, "NAME SCRIP
105b0 54 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  T");.      retur
105c0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
105d0 20 7d 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 54   }.    zName = T
105e0 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
105f0 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30 29 3b  Obj(objv[2], 0);
10600 0a 20 20 20 20 7a 53 63 72 69 70 74 20 3d 20 54  .    zScript = T
10610 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
10620 4f 62 6a 28 6f 62 6a 76 5b 33 5d 2c 20 26 6e 53  Obj(objv[3], &nS
10630 63 72 69 70 74 29 3b 0a 20 20 20 20 70 43 6f 6c  cript);.    pCol
10640 6c 61 74 65 20 3d 20 28 53 71 6c 43 6f 6c 6c 61  late = (SqlColla
10650 74 65 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28 20 73  te*)Tcl_Alloc( s
10660 69 7a 65 6f 66 28 2a 70 43 6f 6c 6c 61 74 65 29  izeof(*pCollate)
10670 20 2b 20 6e 53 63 72 69 70 74 20 2b 20 31 20 29   + nScript + 1 )
10680 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 61  ;.    if( pColla
10690 74 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 54  te==0 ) return T
106a0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 70 43  CL_ERROR;.    pC
106b0 6f 6c 6c 61 74 65 2d 3e 69 6e 74 65 72 70 20 3d  ollate->interp =
106c0 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 70 43 6f   interp;.    pCo
106d0 6c 6c 61 74 65 2d 3e 70 4e 65 78 74 20 3d 20 70  llate->pNext = p
106e0 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 3b 0a 20 20  Db->pCollate;.  
106f0 20 20 70 43 6f 6c 6c 61 74 65 2d 3e 7a 53 63 72    pCollate->zScr
10700 69 70 74 20 3d 20 28 63 68 61 72 2a 29 26 70 43  ipt = (char*)&pC
10710 6f 6c 6c 61 74 65 5b 31 5d 3b 0a 20 20 20 20 70  ollate[1];.    p
10720 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 20 3d 20 70  Db->pCollate = p
10730 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 6d 65 6d  Collate;.    mem
10740 63 70 79 28 70 43 6f 6c 6c 61 74 65 2d 3e 7a 53  cpy(pCollate->zS
10750 63 72 69 70 74 2c 20 7a 53 63 72 69 70 74 2c 20  cript, zScript, 
10760 6e 53 63 72 69 70 74 2b 31 29 3b 0a 20 20 20 20  nScript+1);.    
10770 69 66 28 20 73 71 6c 69 74 65 33 5f 63 72 65 61  if( sqlite3_crea
10780 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 70 44 62  te_collation(pDb
10790 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20 53 51 4c  ->db, zName, SQL
107a0 49 54 45 5f 55 54 46 38 2c 0a 20 20 20 20 20 20  ITE_UTF8,.      
107b0 20 20 70 43 6f 6c 6c 61 74 65 2c 20 74 63 6c 53    pCollate, tclS
107c0 71 6c 43 6f 6c 6c 61 74 65 29 20 29 7b 0a 20 20  qlCollate) ){.  
107d0 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c      Tcl_SetResul
107e0 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20  t(interp, (char 
107f0 2a 29 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  *)sqlite3_errmsg
10800 28 70 44 62 2d 3e 64 62 29 2c 20 54 43 4c 5f 56  (pDb->db), TCL_V
10810 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 20 20 20 20  OLATILE);.      
10820 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
10830 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61  ;.    }.    brea
10840 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  k;.  }..  /*.  *
10850 2a 20 20 20 20 20 24 64 62 20 63 6f 6c 6c 61 74  *     $db collat
10860 69 6f 6e 5f 6e 65 65 64 65 64 20 53 43 52 49 50  ion_needed SCRIP
10870 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 72 65 61  T.  **.  ** Crea
10880 74 65 20 61 20 6e 65 77 20 53 51 4c 20 63 6f 6c  te a new SQL col
10890 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20  lation function 
108a0 63 61 6c 6c 65 64 20 4e 41 4d 45 2e 20 20 57 68  called NAME.  Wh
108b0 65 6e 65 76 65 72 0a 20 20 2a 2a 20 74 68 61 74  enever.  ** that
108c0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
108d0 6c 65 64 2c 20 69 6e 76 6f 6b 65 20 53 43 52 49  led, invoke SCRI
108e0 50 54 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74  PT to evaluate t
108f0 68 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a  he function..  *
10900 2f 0a 20 20 63 61 73 65 20 44 42 5f 43 4f 4c 4c  /.  case DB_COLL
10910 41 54 49 4f 4e 5f 4e 45 45 44 45 44 3a 20 7b 0a  ATION_NEEDED: {.
10920 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20      if( objc!=3 
10930 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f  ){.      Tcl_Wro
10940 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
10950 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 53 43 52 49  , 2, objv, "SCRI
10960 50 54 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  PT");.      retu
10970 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
10980 20 20 7d 0a 20 20 20 20 69 66 28 20 70 44 62 2d    }.    if( pDb-
10990 3e 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64 20  >pCollateNeeded 
109a0 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 44 65 63  ){.      Tcl_Dec
109b0 72 52 65 66 43 6f 75 6e 74 28 70 44 62 2d 3e 70  rRefCount(pDb->p
109c0 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64 29 3b 0a  CollateNeeded);.
109d0 20 20 20 20 7d 0a 20 20 20 20 70 44 62 2d 3e 70      }.    pDb->p
109e0 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64 20 3d 20  CollateNeeded = 
109f0 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a  Tcl_DuplicateObj
10a00 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 20 20 54  (objv[2]);.    T
10a10 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
10a20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65 65  pDb->pCollateNee
10a30 64 65 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ded);.    sqlite
10a40 33 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64  3_collation_need
10a50 65 64 28 70 44 62 2d 3e 64 62 2c 20 70 44 62 2c  ed(pDb->db, pDb,
10a60 20 74 63 6c 43 6f 6c 6c 61 74 65 4e 65 65 64 65   tclCollateNeede
10a70 64 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20  d);.    break;. 
10a80 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20   }..  /*    $db 
10a90 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 20 3f 43 41 4c  commit_hook ?CAL
10aa0 4c 42 41 43 4b 3f 0a 20 20 2a 2a 0a 20 20 2a 2a  LBACK?.  **.  **
10ab0 20 49 6e 76 6f 6b 65 20 74 68 65 20 67 69 76 65   Invoke the give
10ac0 6e 20 63 61 6c 6c 62 61 63 6b 20 6a 75 73 74 20  n callback just 
10ad0 62 65 66 6f 72 65 20 63 6f 6d 6d 69 74 74 69 6e  before committin
10ae0 67 20 65 76 65 72 79 20 53 51 4c 20 74 72 61 6e  g every SQL tran
10af0 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 49 66  saction..  ** If
10b00 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 74 68   the callback th
10b10 72 6f 77 73 20 61 6e 20 65 78 63 65 70 74 69 6f  rows an exceptio
10b20 6e 20 6f 72 20 72 65 74 75 72 6e 73 20 6e 6f 6e  n or returns non
10b30 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 0a  -zero, then the.
10b40 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
10b50 20 69 73 20 61 62 6f 72 74 65 64 2e 20 20 49 66   is aborted.  If
10b60 20 43 41 4c 4c 42 41 43 4b 20 69 73 20 61 6e 20   CALLBACK is an 
10b70 65 6d 70 74 79 20 73 74 72 69 6e 67 2c 20 74 68  empty string, th
10b80 65 20 63 61 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20  e callback.  ** 
10b90 69 73 20 64 69 73 61 62 6c 65 64 2e 0a 20 20 2a  is disabled..  *
10ba0 2f 0a 20 20 63 61 73 65 20 44 42 5f 43 4f 4d 4d  /.  case DB_COMM
10bb0 49 54 5f 48 4f 4f 4b 3a 20 7b 0a 20 20 20 20 69  IT_HOOK: {.    i
10bc0 66 28 20 6f 62 6a 63 3e 33 20 29 7b 0a 20 20 20  f( objc>3 ){.   
10bd0 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
10be0 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
10bf0 62 6a 76 2c 20 22 3f 43 41 4c 4c 42 41 43 4b 3f  bjv, "?CALLBACK?
10c00 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
10c10 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
10c20 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d  }else if( objc==
10c30 32 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  2 ){.      if( p
10c40 44 62 2d 3e 7a 43 6f 6d 6d 69 74 20 29 7b 0a 20  Db->zCommit ){. 
10c50 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e         Tcl_Appen
10c60 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
10c70 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 2c 20 28 63  pDb->zCommit, (c
10c80 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 7d  har*)0);.      }
10c90 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
10ca0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
10cb0 6f 6d 6d 69 74 3b 0a 20 20 20 20 20 20 69 6e 74  ommit;.      int
10cc0 20 6c 65 6e 3b 0a 20 20 20 20 20 20 69 66 28 20   len;.      if( 
10cd0 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 20 29 7b 0a  pDb->zCommit ){.
10ce0 20 20 20 20 20 20 20 20 54 63 6c 5f 46 72 65 65          Tcl_Free
10cf0 28 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 29 3b 0a  (pDb->zCommit);.
10d00 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 43        }.      zC
10d10 6f 6d 6d 69 74 20 3d 20 54 63 6c 5f 47 65 74 53  ommit = Tcl_GetS
10d20 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
10d30 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20 20  v[2], &len);.   
10d40 20 20 20 69 66 28 20 7a 43 6f 6d 6d 69 74 20 26     if( zCommit &
10d50 26 20 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20  & len>0 ){.     
10d60 20 20 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 20     pDb->zCommit 
10d70 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e  = Tcl_Alloc( len
10d80 20 2b 20 31 20 29 3b 0a 20 20 20 20 20 20 20 20   + 1 );.        
10d90 6d 65 6d 63 70 79 28 70 44 62 2d 3e 7a 43 6f 6d  memcpy(pDb->zCom
10da0 6d 69 74 2c 20 7a 43 6f 6d 6d 69 74 2c 20 6c 65  mit, zCommit, le
10db0 6e 2b 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  n+1);.      }els
10dc0 65 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e  e{.        pDb->
10dd0 7a 43 6f 6d 6d 69 74 20 3d 20 30 3b 0a 20 20 20  zCommit = 0;.   
10de0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
10df0 44 62 2d 3e 7a 43 6f 6d 6d 69 74 20 29 7b 0a 20  Db->zCommit ){. 
10e00 20 20 20 20 20 20 20 70 44 62 2d 3e 69 6e 74 65         pDb->inte
10e10 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20  rp = interp;.   
10e20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6d       sqlite3_com
10e30 6d 69 74 5f 68 6f 6f 6b 28 70 44 62 2d 3e 64 62  mit_hook(pDb->db
10e40 2c 20 44 62 43 6f 6d 6d 69 74 48 61 6e 64 6c 65  , DbCommitHandle
10e50 72 2c 20 70 44 62 29 3b 0a 20 20 20 20 20 20 7d  r, pDb);.      }
10e60 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
10e70 6c 69 74 65 33 5f 63 6f 6d 6d 69 74 5f 68 6f 6f  lite3_commit_hoo
10e80 6b 28 70 44 62 2d 3e 64 62 2c 20 30 2c 20 30 29  k(pDb->db, 0, 0)
10e90 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
10ea0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
10eb0 20 20 2f 2a 20 20 20 20 24 64 62 20 63 6f 6d 70    /*    $db comp
10ec0 6c 65 74 65 20 53 51 4c 0a 20 20 2a 2a 0a 20 20  lete SQL.  **.  
10ed0 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
10ee0 66 20 53 51 4c 20 69 73 20 61 20 63 6f 6d 70 6c  f SQL is a compl
10ef0 65 74 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  ete SQL statemen
10f00 74 2e 20 20 52 65 74 75 72 6e 20 46 41 4c 53 45  t.  Return FALSE
10f10 20 69 66 0a 20 20 2a 2a 20 61 64 64 69 74 69 6f   if.  ** additio
10f20 6e 61 6c 20 6c 69 6e 65 73 20 6f 66 20 69 6e 70  nal lines of inp
10f30 75 74 20 61 72 65 20 6e 65 65 64 65 64 2e 20 20  ut are needed.  
10f40 54 68 69 73 20 69 73 20 73 69 6d 69 6c 61 72 20  This is similar 
10f50 74 6f 20 74 68 65 0a 20 20 2a 2a 20 62 75 69 6c  to the.  ** buil
10f60 74 2d 69 6e 20 22 69 6e 66 6f 20 63 6f 6d 70 6c  t-in "info compl
10f70 65 74 65 22 20 63 6f 6d 6d 61 6e 64 20 6f 66 20  ete" command of 
10f80 54 63 6c 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  Tcl..  */.  case
10f90 20 44 42 5f 43 4f 4d 50 4c 45 54 45 3a 20 7b 0a   DB_COMPLETE: {.
10fa0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
10fb0 4d 49 54 5f 43 4f 4d 50 4c 45 54 45 0a 20 20 20  MIT_COMPLETE.   
10fc0 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 73 75 6c   Tcl_Obj *pResul
10fd0 74 3b 0a 20 20 20 20 69 6e 74 20 69 73 43 6f 6d  t;.    int isCom
10fe0 70 6c 65 74 65 3b 0a 20 20 20 20 69 66 28 20 6f  plete;.    if( o
10ff0 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20  bjc!=3 ){.      
11000 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
11010 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76  (interp, 2, objv
11020 2c 20 22 53 51 4c 22 29 3b 0a 20 20 20 20 20 20  , "SQL");.      
11030 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
11040 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 73 43 6f  ;.    }.    isCo
11050 6d 70 6c 65 74 65 20 3d 20 73 71 6c 69 74 65 33  mplete = sqlite3
11060 5f 63 6f 6d 70 6c 65 74 65 28 20 54 63 6c 5f 47  _complete( Tcl_G
11070 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
11080 6f 62 6a 76 5b 32 5d 2c 20 30 29 20 29 3b 0a 20  objv[2], 0) );. 
11090 20 20 20 70 52 65 73 75 6c 74 20 3d 20 54 63 6c     pResult = Tcl
110a0 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _GetObjResult(in
110b0 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f 53  terp);.    Tcl_S
110c0 65 74 42 6f 6f 6c 65 61 6e 4f 62 6a 28 70 52 65  etBooleanObj(pRe
110d0 73 75 6c 74 2c 20 69 73 43 6f 6d 70 6c 65 74 65  sult, isComplete
110e0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 62 72  );.#endif.    br
110f0 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20  eak;.  }..  /*  
11100 20 20 24 64 62 20 63 6f 70 79 20 63 6f 6e 66 6c    $db copy confl
11110 69 63 74 2d 61 6c 67 6f 72 69 74 68 6d 20 74 61  ict-algorithm ta
11120 62 6c 65 20 66 69 6c 65 6e 61 6d 65 20 3f 53 45  ble filename ?SE
11130 50 41 52 41 54 4f 52 3f 20 3f 4e 55 4c 4c 49 4e  PARATOR? ?NULLIN
11140 44 49 43 41 54 4f 52 3f 0a 20 20 2a 2a 0a 20 20  DICATOR?.  **.  
11150 2a 2a 20 43 6f 70 79 20 64 61 74 61 20 69 6e 74  ** Copy data int
11160 6f 20 74 61 62 6c 65 20 66 72 6f 6d 20 66 69 6c  o table from fil
11170 65 6e 61 6d 65 2c 20 6f 70 74 69 6f 6e 61 6c 6c  ename, optionall
11180 79 20 75 73 69 6e 67 20 53 45 50 41 52 41 54 4f  y using SEPARATO
11190 52 0a 20 20 2a 2a 20 61 73 20 63 6f 6c 75 6d 6e  R.  ** as column
111a0 20 73 65 70 61 72 61 74 6f 72 73 2e 20 20 49 66   separators.  If
111b0 20 61 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69   a column contai
111c0 6e 73 20 61 20 6e 75 6c 6c 20 73 74 72 69 6e 67  ns a null string
111d0 2c 20 6f 72 20 74 68 65 0a 20 20 2a 2a 20 76 61  , or the.  ** va
111e0 6c 75 65 20 6f 66 20 4e 55 4c 4c 49 4e 44 49 43  lue of NULLINDIC
111f0 41 54 4f 52 2c 20 61 20 4e 55 4c 4c 20 69 73 20  ATOR, a NULL is 
11200 69 6e 73 65 72 74 65 64 20 66 6f 72 20 74 68 65  inserted for the
11210 20 63 6f 6c 75 6d 6e 2e 0a 20 20 2a 2a 20 63 6f   column..  ** co
11220 6e 66 6c 69 63 74 2d 61 6c 67 6f 72 69 74 68 6d  nflict-algorithm
11230 20 69 73 20 6f 6e 65 20 6f 66 20 74 68 65 20 73   is one of the s
11240 71 6c 69 74 65 20 63 6f 6e 66 6c 69 63 74 20 61  qlite conflict a
11250 6c 67 6f 72 69 74 68 6d 73 3a 0a 20 20 2a 2a 20  lgorithms:.  ** 
11260 20 20 20 72 6f 6c 6c 62 61 63 6b 2c 20 61 62 6f     rollback, abo
11270 72 74 2c 20 66 61 69 6c 2c 20 69 67 6e 6f 72 65  rt, fail, ignore
11280 2c 20 72 65 70 6c 61 63 65 0a 20 20 2a 2a 20 4f  , replace.  ** O
11290 6e 20 73 75 63 63 65 73 73 2c 20 72 65 74 75 72  n success, retur
112a0 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
112b0 6c 69 6e 65 73 20 70 72 6f 63 65 73 73 65 64 2c  lines processed,
112c0 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79   not necessarily
112d0 20 73 61 6d 65 0a 20 20 2a 2a 20 61 73 20 27 64   same.  ** as 'd
112e0 62 20 63 68 61 6e 67 65 73 27 20 64 75 65 20 74  b changes' due t
112f0 6f 20 63 6f 6e 66 6c 69 63 74 2d 61 6c 67 6f 72  o conflict-algor
11300 69 74 68 6d 20 73 65 6c 65 63 74 65 64 2e 0a 20  ithm selected.. 
11310 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 63 6f   **.  ** This co
11320 64 65 20 69 73 20 62 61 73 69 63 61 6c 6c 79 20  de is basically 
11330 61 6e 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  an implementatio
11340 6e 2f 65 6e 68 61 6e 63 65 6d 65 6e 74 20 6f 66  n/enhancement of
11350 0a 20 20 2a 2a 20 74 68 65 20 73 71 6c 69 74 65  .  ** the sqlite
11360 33 20 73 68 65 6c 6c 2e 63 20 22 2e 69 6d 70 6f  3 shell.c ".impo
11370 72 74 22 20 63 6f 6d 6d 61 6e 64 2e 0a 20 20 2a  rt" command..  *
11380 2a 0a 20 20 2a 2a 20 54 68 69 73 20 63 6f 6d 6d  *.  ** This comm
11390 61 6e 64 20 75 73 61 67 65 20 69 73 20 65 71 75  and usage is equ
113a0 69 76 61 6c 65 6e 74 20 74 6f 20 74 68 65 20 73  ivalent to the s
113b0 71 6c 69 74 65 32 2e 78 20 43 4f 50 59 20 73 74  qlite2.x COPY st
113c0 61 74 65 6d 65 6e 74 2c 0a 20 20 2a 2a 20 77 68  atement,.  ** wh
113d0 69 63 68 20 69 6d 70 6f 72 74 73 20 66 69 6c 65  ich imports file
113e0 20 64 61 74 61 20 69 6e 74 6f 20 61 20 74 61 62   data into a tab
113f0 6c 65 20 75 73 69 6e 67 20 74 68 65 20 50 6f 73  le using the Pos
11400 74 67 72 65 53 51 4c 20 43 4f 50 59 20 66 69 6c  tgreSQL COPY fil
11410 65 20 66 6f 72 6d 61 74 3a 0a 20 20 2a 2a 20 20  e format:.  **  
11420 20 24 64 62 20 63 6f 70 79 20 24 63 6f 6e 66 6c   $db copy $confl
11430 69 74 5f 61 6c 67 6f 20 24 74 61 62 6c 65 5f 6e  it_algo $table_n
11440 61 6d 65 20 24 66 69 6c 65 6e 61 6d 65 20 5c 74  ame $filename \t
11450 20 5c 5c 4e 0a 20 20 2a 2f 0a 20 20 63 61 73 65   \\N.  */.  case
11460 20 44 42 5f 43 4f 50 59 3a 20 7b 0a 20 20 20 20   DB_COPY: {.    
11470 63 68 61 72 20 2a 7a 54 61 62 6c 65 3b 20 20 20  char *zTable;   
11480 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
11490 6e 73 65 72 74 20 64 61 74 61 20 69 6e 74 6f 20  nsert data into 
114a0 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20  this table */.  
114b0 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 3b 20 20    char *zFile;  
114c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
114d0 20 54 68 65 20 66 69 6c 65 20 66 72 6f 6d 20 77   The file from w
114e0 68 69 63 68 20 74 6f 20 65 78 74 72 61 63 74 20  hich to extract 
114f0 64 61 74 61 20 2a 2f 0a 20 20 20 20 63 68 61 72  data */.    char
11500 20 2a 7a 43 6f 6e 66 6c 69 63 74 3b 20 20 20 20   *zConflict;    
11510 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
11520 6f 6e 66 6c 69 63 74 20 61 6c 67 6f 72 69 74 68  onflict algorith
11530 6d 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20 20 20  m to use */.    
11540 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
11550 74 6d 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 41  tmt;        /* A
11560 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
11570 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20    int nCol;     
11580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11590 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   Number of colum
115a0 6e 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  ns in the table 
115b0 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65  */.    int nByte
115c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
115d0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
115e0 62 79 74 65 73 20 69 6e 20 61 6e 20 53 51 4c 20  bytes in an SQL 
115f0 73 74 72 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e  string */.    in
11600 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20  t i, j;         
11610 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
11620 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20  p counters */.  
11630 20 20 69 6e 74 20 6e 53 65 70 3b 20 20 20 20 20    int nSep;     
11640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11650 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
11660 20 69 6e 20 7a 53 65 70 5b 5d 20 2a 2f 0a 20 20   in zSep[] */.  
11670 20 20 69 6e 74 20 6e 4e 75 6c 6c 3b 20 20 20 20    int nNull;    
11680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11690 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
116a0 20 69 6e 20 7a 4e 75 6c 6c 5b 5d 20 2a 2f 0a 20   in zNull[] */. 
116b0 20 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 20 20     char *zSql;  
116c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
116d0 2a 20 41 6e 20 53 51 4c 20 73 74 61 74 65 6d 65  * An SQL stateme
116e0 6e 74 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a  nt */.    char *
116f0 7a 4c 69 6e 65 3b 20 20 20 20 20 20 20 20 20 20  zLine;          
11700 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c        /* A singl
11710 65 20 6c 69 6e 65 20 6f 66 20 69 6e 70 75 74 20  e line of input 
11720 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 2a 2f  from the file */
11730 0a 20 20 20 20 63 68 61 72 20 2a 2a 61 7a 43 6f  .    char **azCo
11740 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
11750 20 2f 2a 20 7a 4c 69 6e 65 5b 5d 20 62 72 6f 6b   /* zLine[] brok
11760 65 6e 20 75 70 20 69 6e 74 6f 20 63 6f 6c 75 6d  en up into colum
11770 6e 73 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20  ns */.    const 
11780 63 68 61 72 20 2a 7a 43 6f 6d 6d 69 74 3b 20 20  char *zCommit;  
11790 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20        /* How to 
117a0 63 6f 6d 6d 69 74 20 63 68 61 6e 67 65 73 20 2a  commit changes *
117b0 2f 0a 20 20 20 20 46 49 4c 45 20 2a 69 6e 3b 20  /.    FILE *in; 
117c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
117d0 20 20 2f 2a 20 54 68 65 20 69 6e 70 75 74 20 66    /* The input f
117e0 69 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6c  ile */.    int l
117f0 69 6e 65 6e 6f 20 3d 20 30 3b 20 20 20 20 20 20  ineno = 0;      
11800 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e 65 20 6e         /* Line n
11810 75 6d 62 65 72 20 6f 66 20 69 6e 70 75 74 20 66  umber of input f
11820 69 6c 65 20 2a 2f 0a 20 20 20 20 63 68 61 72 20  ile */.    char 
11830 7a 4c 69 6e 65 4e 75 6d 5b 38 30 5d 3b 20 20 20  zLineNum[80];   
11840 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e 65 20 6e         /* Line n
11850 75 6d 62 65 72 20 70 72 69 6e 74 20 62 75 66 66  umber print buff
11860 65 72 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62  er */.    Tcl_Ob
11870 6a 20 2a 70 52 65 73 75 6c 74 3b 20 20 20 20 20  j *pResult;     
11880 20 20 20 20 20 20 2f 2a 20 69 6e 74 65 72 70 20        /* interp 
11890 72 65 73 75 6c 74 20 2a 2f 0a 0a 20 20 20 20 63  result */..    c
118a0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 65 70 3b  onst char *zSep;
118b0 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
118c0 2a 7a 4e 75 6c 6c 3b 0a 20 20 20 20 69 66 28 20  *zNull;.    if( 
118d0 6f 62 6a 63 3c 35 20 7c 7c 20 6f 62 6a 63 3e 37  objc<5 || objc>7
118e0 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72   ){.      Tcl_Wr
118f0 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
11900 70 2c 20 32 2c 20 6f 62 6a 76 2c 0a 20 20 20 20  p, 2, objv,.    
11910 20 20 20 20 20 22 43 4f 4e 46 4c 49 43 54 2d 41       "CONFLICT-A
11920 4c 47 4f 52 49 54 48 4d 20 54 41 42 4c 45 20 46  LGORITHM TABLE F
11930 49 4c 45 4e 41 4d 45 20 3f 53 45 50 41 52 41 54  ILENAME ?SEPARAT
11940 4f 52 3f 20 3f 4e 55 4c 4c 49 4e 44 49 43 41 54  OR? ?NULLINDICAT
11950 4f 52 3f 22 29 3b 0a 20 20 20 20 20 20 72 65 74  OR?");.      ret
11960 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
11970 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 62 6a     }.    if( obj
11980 63 3e 3d 36 20 29 7b 0a 20 20 20 20 20 20 7a 53  c>=6 ){.      zS
11990 65 70 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  ep = Tcl_GetStri
119a0 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 35  ngFromObj(objv[5
119b0 5d 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65  ], 0);.    }else
119c0 7b 0a 20 20 20 20 20 20 7a 53 65 70 20 3d 20 22  {.      zSep = "
119d0 5c 74 22 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  \t";.    }.    i
119e0 66 28 20 6f 62 6a 63 3e 3d 37 20 29 7b 0a 20 20  f( objc>=7 ){.  
119f0 20 20 20 20 7a 4e 75 6c 6c 20 3d 20 54 63 6c 5f      zNull = Tcl_
11a00 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
11a10 28 6f 62 6a 76 5b 36 5d 2c 20 30 29 3b 0a 20 20  (objv[6], 0);.  
11a20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a    }else{.      z
11a30 4e 75 6c 6c 20 3d 20 22 22 3b 0a 20 20 20 20 7d  Null = "";.    }
11a40 0a 20 20 20 20 7a 43 6f 6e 66 6c 69 63 74 20 3d  .    zConflict =
11a50 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
11a60 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30  omObj(objv[2], 0
11a70 29 3b 0a 20 20 20 20 7a 54 61 62 6c 65 20 3d 20  );.    zTable = 
11a80 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
11a90 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d 2c 20 30 29  mObj(objv[3], 0)
11aa0 3b 0a 20 20 20 20 7a 46 69 6c 65 20 3d 20 54 63  ;.    zFile = Tc
11ab0 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
11ac0 62 6a 28 6f 62 6a 76 5b 34 5d 2c 20 30 29 3b 0a  bj(objv[4], 0);.
11ad0 20 20 20 20 6e 53 65 70 20 3d 20 73 74 72 6c 65      nSep = strle
11ae0 6e 33 30 28 7a 53 65 70 29 3b 0a 20 20 20 20 6e  n30(zSep);.    n
11af0 4e 75 6c 6c 20 3d 20 73 74 72 6c 65 6e 33 30 28  Null = strlen30(
11b00 7a 4e 75 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20  zNull);.    if( 
11b10 6e 53 65 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20  nSep==0 ){.     
11b20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
11b30 74 28 69 6e 74 65 72 70 2c 22 45 72 72 6f 72 3a  t(interp,"Error:
11b40 20 6e 6f 6e 2d 6e 75 6c 6c 20 73 65 70 61 72 61   non-null separa
11b50 74 6f 72 20 72 65 71 75 69 72 65 64 20 66 6f 72  tor required for
11b60 20 63 6f 70 79 22 2c 0a 20 20 20 20 20 20 20 20   copy",.        
11b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
11b80 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20  char*)0);.      
11b90 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
11ba0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 73  ;.    }.    if(s
11bb0 74 72 63 6d 70 28 7a 43 6f 6e 66 6c 69 63 74 2c  trcmp(zConflict,
11bc0 20 22 72 6f 6c 6c 62 61 63 6b 22 29 20 21 3d 20   "rollback") != 
11bd0 30 20 26 26 0a 20 20 20 20 20 20 20 73 74 72 63  0 &&.       strc
11be0 6d 70 28 7a 43 6f 6e 66 6c 69 63 74 2c 20 22 61  mp(zConflict, "a
11bf0 62 6f 72 74 22 20 20 20 29 20 21 3d 20 30 20 26  bort"   ) != 0 &
11c00 26 0a 20 20 20 20 20 20 20 73 74 72 63 6d 70 28  &.       strcmp(
11c10 7a 43 6f 6e 66 6c 69 63 74 2c 20 22 66 61 69 6c  zConflict, "fail
11c20 22 20 20 20 20 29 20 21 3d 20 30 20 26 26 0a 20  "    ) != 0 &&. 
11c30 20 20 20 20 20 20 73 74 72 63 6d 70 28 7a 43 6f        strcmp(zCo
11c40 6e 66 6c 69 63 74 2c 20 22 69 67 6e 6f 72 65 22  nflict, "ignore"
11c50 20 20 29 20 21 3d 20 30 20 26 26 0a 20 20 20 20    ) != 0 &&.    
11c60 20 20 20 73 74 72 63 6d 70 28 7a 43 6f 6e 66 6c     strcmp(zConfl
11c70 69 63 74 2c 20 22 72 65 70 6c 61 63 65 22 20 29  ict, "replace" )
11c80 20 21 3d 20 30 20 29 20 7b 0a 20 20 20 20 20 20   != 0 ) {.      
11c90 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
11ca0 28 69 6e 74 65 72 70 2c 20 22 45 72 72 6f 72 3a  (interp, "Error:
11cb0 20 5c 22 22 2c 20 7a 43 6f 6e 66 6c 69 63 74 2c   \"", zConflict,
11cc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 5c 22  .            "\"
11cd0 2c 20 63 6f 6e 66 6c 69 63 74 2d 61 6c 67 6f 72  , conflict-algor
11ce0 69 74 68 6d 20 6d 75 73 74 20 62 65 20 6f 6e 65  ithm must be one
11cf0 20 6f 66 3a 20 72 6f 6c 6c 62 61 63 6b 2c 20 22   of: rollback, "
11d00 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 61 62  .            "ab
11d10 6f 72 74 2c 20 66 61 69 6c 2c 20 69 67 6e 6f 72  ort, fail, ignor
11d20 65 2c 20 6f 72 20 72 65 70 6c 61 63 65 22 2c 20  e, or replace", 
11d30 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20  (char*)0);.     
11d40 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
11d50 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 53 71  R;.    }.    zSq
11d60 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  l = sqlite3_mpri
11d70 6e 74 66 28 22 53 45 4c 45 43 54 20 2a 20 46 52  ntf("SELECT * FR
11d80 4f 4d 20 27 25 71 27 22 2c 20 7a 54 61 62 6c 65  OM '%q'", zTable
11d90 29 3b 0a 20 20 20 20 69 66 28 20 7a 53 71 6c 3d  );.    if( zSql=
11da0 3d 30 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  =0 ){.      Tcl_
11db0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
11dc0 65 72 70 2c 20 22 45 72 72 6f 72 3a 20 6e 6f 20  erp, "Error: no 
11dd0 73 75 63 68 20 74 61 62 6c 65 3a 20 22 2c 20 7a  such table: ", z
11de0 54 61 62 6c 65 2c 20 28 63 68 61 72 2a 29 30 29  Table, (char*)0)
11df0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
11e00 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
11e10 20 20 20 20 6e 42 79 74 65 20 3d 20 73 74 72 6c      nByte = strl
11e20 65 6e 33 30 28 7a 53 71 6c 29 3b 0a 20 20 20 20  en30(zSql);.    
11e30 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
11e40 70 61 72 65 28 70 44 62 2d 3e 64 62 2c 20 7a 53  pare(pDb->db, zS
11e50 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20  ql, -1, &pStmt, 
11e60 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0);.    sqlite3_
11e70 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20  free(zSql);.    
11e80 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
11e90 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
11ea0 28 69 6e 74 65 72 70 2c 20 22 45 72 72 6f 72 3a  (interp, "Error:
11eb0 20 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d   ", sqlite3_errm
11ec0 73 67 28 70 44 62 2d 3e 64 62 29 2c 20 28 63 68  sg(pDb->db), (ch
11ed0 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 6e 43  ar*)0);.      nC
11ee0 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  ol = 0;.    }els
11ef0 65 7b 0a 20 20 20 20 20 20 6e 43 6f 6c 20 3d 20  e{.      nCol = 
11f00 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63  sqlite3_column_c
11f10 6f 75 6e 74 28 70 53 74 6d 74 29 3b 0a 20 20 20  ount(pStmt);.   
11f20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
11f30 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a  inalize(pStmt);.
11f40 20 20 20 20 69 66 28 20 6e 43 6f 6c 3d 3d 30 20      if( nCol==0 
11f50 29 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ) {.      return
11f60 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
11f70 7d 0a 20 20 20 20 7a 53 71 6c 20 3d 20 6d 61 6c  }.    zSql = mal
11f80 6c 6f 63 28 20 6e 42 79 74 65 20 2b 20 35 30 20  loc( nByte + 50 
11f90 2b 20 6e 43 6f 6c 2a 32 20 29 3b 0a 20 20 20 20  + nCol*2 );.    
11fa0 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29 20 7b 0a  if( zSql==0 ) {.
11fb0 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
11fc0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
11fd0 45 72 72 6f 72 3a 20 63 61 6e 27 74 20 6d 61 6c  Error: can't mal
11fe0 6c 6f 63 28 29 22 2c 20 28 63 68 61 72 2a 29 30  loc()", (char*)0
11ff0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
12000 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
12010 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
12020 72 69 6e 74 66 28 6e 42 79 74 65 2b 35 30 2c 20  rintf(nByte+50, 
12030 7a 53 71 6c 2c 20 22 49 4e 53 45 52 54 20 4f 52  zSql, "INSERT OR
12040 20 25 71 20 49 4e 54 4f 20 27 25 71 27 20 56 41   %q INTO '%q' VA
12050 4c 55 45 53 28 3f 22 2c 0a 20 20 20 20 20 20 20  LUES(?",.       
12060 20 20 7a 43 6f 6e 66 6c 69 63 74 2c 20 7a 54 61    zConflict, zTa
12070 62 6c 65 29 3b 0a 20 20 20 20 6a 20 3d 20 73 74  ble);.    j = st
12080 72 6c 65 6e 33 30 28 7a 53 71 6c 29 3b 0a 20 20  rlen30(zSql);.  
12090 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 43 6f    for(i=1; i<nCo
120a0 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 7a  l; i++){.      z
120b0 53 71 6c 5b 6a 2b 2b 5d 20 3d 20 27 2c 27 3b 0a  Sql[j++] = ',';.
120c0 20 20 20 20 20 20 7a 53 71 6c 5b 6a 2b 2b 5d 20        zSql[j++] 
120d0 3d 20 27 3f 27 3b 0a 20 20 20 20 7d 0a 20 20 20  = '?';.    }.   
120e0 20 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d 20 27 29 27   zSql[j++] = ')'
120f0 3b 0a 20 20 20 20 7a 53 71 6c 5b 6a 5d 20 3d 20  ;.    zSql[j] = 
12100 30 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  0;.    rc = sqli
12110 74 65 33 5f 70 72 65 70 61 72 65 28 70 44 62 2d  te3_prepare(pDb-
12120 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26  >db, zSql, -1, &
12130 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 66  pStmt, 0);.    f
12140 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 69  ree(zSql);.    i
12150 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 54  f( rc ){.      T
12160 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
12170 69 6e 74 65 72 70 2c 20 22 45 72 72 6f 72 3a 20  interp, "Error: 
12180 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  ", sqlite3_errms
12190 67 28 70 44 62 2d 3e 64 62 29 2c 20 28 63 68 61  g(pDb->db), (cha
121a0 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  r*)0);.      sql
121b0 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53  ite3_finalize(pS
121c0 74 6d 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75  tmt);.      retu
121d0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
121e0 20 20 7d 0a 20 20 20 20 69 6e 20 3d 20 66 6f 70    }.    in = fop
121f0 65 6e 28 7a 46 69 6c 65 2c 20 22 72 62 22 29 3b  en(zFile, "rb");
12200 0a 20 20 20 20 69 66 28 20 69 6e 3d 3d 30 20 29  .    if( in==0 )
12210 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65  {.      Tcl_Appe
12220 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
12230 20 22 45 72 72 6f 72 3a 20 63 61 6e 6e 6f 74 20   "Error: cannot 
12240 6f 70 65 6e 20 66 69 6c 65 3a 20 22 2c 20 7a 46  open file: ", zF
12250 69 6c 65 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20  ile, NULL);.    
12260 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
12270 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20  ze(pStmt);.     
12280 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
12290 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 7a 43  R;.    }.    azC
122a0 6f 6c 20 3d 20 6d 61 6c 6c 6f 63 28 20 73 69 7a  ol = malloc( siz
122b0 65 6f 66 28 61 7a 43 6f 6c 5b 30 5d 29 2a 28 6e  eof(azCol[0])*(n
122c0 43 6f 6c 2b 31 29 20 29 3b 0a 20 20 20 20 69 66  Col+1) );.    if
122d0 28 20 61 7a 43 6f 6c 3d 3d 30 20 29 20 7b 0a 20  ( azCol==0 ) {. 
122e0 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
122f0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 45  esult(interp, "E
12300 72 72 6f 72 3a 20 63 61 6e 27 74 20 6d 61 6c 6c  rror: can't mall
12310 6f 63 28 29 22 2c 20 28 63 68 61 72 2a 29 30 29  oc()", (char*)0)
12320 3b 0a 20 20 20 20 20 20 66 63 6c 6f 73 65 28 69  ;.      fclose(i
12330 6e 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  n);.      return
12340 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
12350 7d 0a 20 20 20 20 28 76 6f 69 64 29 73 71 6c 69  }.    (void)sqli
12360 74 65 33 5f 65 78 65 63 28 70 44 62 2d 3e 64 62  te3_exec(pDb->db
12370 2c 20 22 42 45 47 49 4e 22 2c 20 30 2c 20 30 2c  , "BEGIN", 0, 0,
12380 20 30 29 3b 0a 20 20 20 20 7a 43 6f 6d 6d 69 74   0);.    zCommit
12390 20 3d 20 22 43 4f 4d 4d 49 54 22 3b 0a 20 20 20   = "COMMIT";.   
123a0 20 77 68 69 6c 65 28 20 28 7a 4c 69 6e 65 20 3d   while( (zLine =
123b0 20 6c 6f 63 61 6c 5f 67 65 74 6c 69 6e 65 28 30   local_getline(0
123c0 2c 20 69 6e 29 29 21 3d 30 20 29 7b 0a 20 20 20  , in))!=0 ){.   
123d0 20 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20     char *z;.    
123e0 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20    lineno++;.    
123f0 20 20 61 7a 43 6f 6c 5b 30 5d 20 3d 20 7a 4c 69    azCol[0] = zLi
12400 6e 65 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  ne;.      for(i=
12410 30 2c 20 7a 3d 7a 4c 69 6e 65 3b 20 2a 7a 3b 20  0, z=zLine; *z; 
12420 7a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  z++){.        if
12430 28 20 2a 7a 3d 3d 7a 53 65 70 5b 30 5d 20 26 26  ( *z==zSep[0] &&
12440 20 73 74 72 6e 63 6d 70 28 7a 2c 20 7a 53 65 70   strncmp(z, zSep
12450 2c 20 6e 53 65 70 29 3d 3d 30 20 29 7b 0a 20 20  , nSep)==0 ){.  
12460 20 20 20 20 20 20 20 20 2a 7a 20 3d 20 30 3b 0a          *z = 0;.
12470 20 20 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20            i++;. 
12480 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3c 6e           if( i<n
12490 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Col ){.         
124a0 20 20 20 61 7a 43 6f 6c 5b 69 5d 20 3d 20 26 7a     azCol[i] = &z
124b0 5b 6e 53 65 70 5d 3b 0a 20 20 20 20 20 20 20 20  [nSep];.        
124c0 20 20 20 20 7a 20 2b 3d 20 6e 53 65 70 2d 31 3b      z += nSep-1;
124d0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
124e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
124f0 20 20 20 20 20 69 66 28 20 69 2b 31 21 3d 6e 43       if( i+1!=nC
12500 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68  ol ){.        ch
12510 61 72 20 2a 7a 45 72 72 3b 0a 20 20 20 20 20 20  ar *zErr;.      
12520 20 20 69 6e 74 20 6e 45 72 72 20 3d 20 73 74 72    int nErr = str
12530 6c 65 6e 33 30 28 7a 46 69 6c 65 29 20 2b 20 32  len30(zFile) + 2
12540 30 30 3b 0a 20 20 20 20 20 20 20 20 7a 45 72 72  00;.        zErr
12550 20 3d 20 6d 61 6c 6c 6f 63 28 6e 45 72 72 29 3b   = malloc(nErr);
12560 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 45 72  .        if( zEr
12570 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  r ){.          s
12580 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
12590 6e 45 72 72 2c 20 7a 45 72 72 2c 0a 20 20 20 20  nErr, zErr,.    
125a0 20 20 20 20 20 20 20 20 20 22 45 72 72 6f 72 3a           "Error:
125b0 20 25 73 20 6c 69 6e 65 20 25 64 3a 20 65 78 70   %s line %d: exp
125c0 65 63 74 65 64 20 25 64 20 63 6f 6c 75 6d 6e 73  ected %d columns
125d0 20 6f 66 20 64 61 74 61 20 62 75 74 20 66 6f 75   of data but fou
125e0 6e 64 20 25 64 22 2c 0a 20 20 20 20 20 20 20 20  nd %d",.        
125f0 20 20 20 20 20 7a 46 69 6c 65 2c 20 6c 69 6e 65       zFile, line
12600 6e 6f 2c 20 6e 43 6f 6c 2c 20 69 2b 31 29 3b 0a  no, nCol, i+1);.
12610 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70            Tcl_Ap
12620 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
12630 70 2c 20 7a 45 72 72 2c 20 28 63 68 61 72 2a 29  p, zErr, (char*)
12640 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66 72  0);.          fr
12650 65 65 28 7a 45 72 72 29 3b 0a 20 20 20 20 20 20  ee(zErr);.      
12660 20 20 7d 0a 20 20 20 20 20 20 20 20 7a 43 6f 6d    }.        zCom
12670 6d 69 74 20 3d 20 22 52 4f 4c 4c 42 41 43 4b 22  mit = "ROLLBACK"
12680 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
12690 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
126a0 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20  or(i=0; i<nCol; 
126b0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  i++){.        /*
126c0 20 63 68 65 63 6b 20 66 6f 72 20 6e 75 6c 6c 20   check for null 
126d0 64 61 74 61 2c 20 69 66 20 73 6f 2c 20 62 69 6e  data, if so, bin
126e0 64 20 61 73 20 6e 75 6c 6c 20 2a 2f 0a 20 20 20  d as null */.   
126f0 20 20 20 20 20 69 66 28 20 28 6e 4e 75 6c 6c 3e       if( (nNull>
12700 30 20 26 26 20 73 74 72 63 6d 70 28 61 7a 43 6f  0 && strcmp(azCo
12710 6c 5b 69 5d 2c 20 7a 4e 75 6c 6c 29 3d 3d 30 29  l[i], zNull)==0)
12720 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 74  .          || st
12730 72 6c 65 6e 33 30 28 61 7a 43 6f 6c 5b 69 5d 29  rlen30(azCol[i])
12740 3d 3d 30 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  ==0.        ){. 
12750 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
12760 5f 62 69 6e 64 5f 6e 75 6c 6c 28 70 53 74 6d 74  _bind_null(pStmt
12770 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20 20 20 20  , i+1);.        
12780 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
12790 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65   sqlite3_bind_te
127a0 78 74 28 70 53 74 6d 74 2c 20 69 2b 31 2c 20 61  xt(pStmt, i+1, a
127b0 7a 43 6f 6c 5b 69 5d 2c 20 2d 31 2c 20 53 51 4c  zCol[i], -1, SQL
127c0 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20  ITE_STATIC);.   
127d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
127e0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 65       sqlite3_ste
127f0 70 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20  p(pStmt);.      
12800 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73  rc = sqlite3_res
12810 65 74 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20  et(pStmt);.     
12820 20 66 72 65 65 28 7a 4c 69 6e 65 29 3b 0a 20 20   free(zLine);.  
12830 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
12840 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
12850 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
12860 74 28 69 6e 74 65 72 70 2c 22 45 72 72 6f 72 3a  t(interp,"Error:
12870 20 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d   ", sqlite3_errm
12880 73 67 28 70 44 62 2d 3e 64 62 29 2c 20 28 63 68  sg(pDb->db), (ch
12890 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 20 20  ar*)0);.        
128a0 7a 43 6f 6d 6d 69 74 20 3d 20 22 52 4f 4c 4c 42  zCommit = "ROLLB
128b0 41 43 4b 22 3b 0a 20 20 20 20 20 20 20 20 62 72  ACK";.        br
128c0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
128d0 20 7d 0a 20 20 20 20 66 72 65 65 28 61 7a 43 6f   }.    free(azCo
128e0 6c 29 3b 0a 20 20 20 20 66 63 6c 6f 73 65 28 69  l);.    fclose(i
128f0 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  n);.    sqlite3_
12900 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
12910 0a 20 20 20 20 28 76 6f 69 64 29 73 71 6c 69 74  .    (void)sqlit
12920 65 33 5f 65 78 65 63 28 70 44 62 2d 3e 64 62 2c  e3_exec(pDb->db,
12930 20 7a 43 6f 6d 6d 69 74 2c 20 30 2c 20 30 2c 20   zCommit, 0, 0, 
12940 30 29 3b 0a 0a 20 20 20 20 69 66 28 20 7a 43 6f  0);..    if( zCo
12950 6d 6d 69 74 5b 30 5d 20 3d 3d 20 27 43 27 20 29  mmit[0] == 'C' )
12960 7b 0a 20 20 20 20 20 20 2f 2a 20 73 75 63 63 65  {.      /* succe
12970 73 73 2c 20 73 65 74 20 72 65 73 75 6c 74 20 61  ss, set result a
12980 73 20 6e 75 6d 62 65 72 20 6f 66 20 6c 69 6e 65  s number of line
12990 73 20 70 72 6f 63 65 73 73 65 64 20 2a 2f 0a 20  s processed */. 
129a0 20 20 20 20 20 70 52 65 73 75 6c 74 20 3d 20 54       pResult = T
129b0 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_GetObjResult(
129c0 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 20 20 54  interp);.      T
129d0 63 6c 5f 53 65 74 49 6e 74 4f 62 6a 28 70 52 65  cl_SetIntObj(pRe
129e0 73 75 6c 74 2c 20 6c 69 6e 65 6e 6f 29 3b 0a 20  sult, lineno);. 
129f0 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 4f 4b       rc = TCL_OK
12a00 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
12a10 20 20 20 2f 2a 20 66 61 69 6c 75 72 65 2c 20 61     /* failure, a
12a20 70 70 65 6e 64 20 6c 69 6e 65 6e 6f 20 77 68 65  ppend lineno whe
12a30 72 65 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 20  re failed */.   
12a40 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
12a50 6e 74 66 28 73 69 7a 65 6f 66 28 7a 4c 69 6e 65  ntf(sizeof(zLine
12a60 4e 75 6d 29 2c 20 7a 4c 69 6e 65 4e 75 6d 2c 22  Num), zLineNum,"
12a70 25 64 22 2c 6c 69 6e 65 6e 6f 29 3b 0a 20 20 20  %d",lineno);.   
12a80 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
12a90 75 6c 74 28 69 6e 74 65 72 70 2c 22 2c 20 66 61  ult(interp,", fa
12aa0 69 6c 65 64 20 77 68 69 6c 65 20 70 72 6f 63 65  iled while proce
12ab0 73 73 69 6e 67 20 6c 69 6e 65 3a 20 22 2c 7a 4c  ssing line: ",zL
12ac0 69 6e 65 4e 75 6d 2c 0a 20 20 20 20 20 20 20 20  ineNum,.        
12ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
12ae0 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20  char*)0);.      
12af0 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  rc = TCL_ERROR;.
12b00 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b      }.    break;
12b10 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
12b20 20 20 20 24 64 62 20 65 6e 61 62 6c 65 5f 6c 6f     $db enable_lo
12b30 61 64 5f 65 78 74 65 6e 73 69 6f 6e 20 42 4f 4f  ad_extension BOO
12b40 4c 45 41 4e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  LEAN.  **.  ** T
12b50 75 72 6e 20 74 68 65 20 65 78 74 65 6e 73 69 6f  urn the extensio
12b60 6e 20 6c 6f 61 64 69 6e 67 20 66 65 61 74 75 72  n loading featur
12b70 65 20 6f 6e 20 6f 72 20 6f 66 66 2e 20 20 49 74  e on or off.  It
12b80 20 69 66 20 6f 66 66 20 62 79 0a 20 20 2a 2a 20   if off by.  ** 
12b90 64 65 66 61 75 6c 74 2e 0a 20 20 2a 2f 0a 20 20  default..  */.  
12ba0 63 61 73 65 20 44 42 5f 45 4e 41 42 4c 45 5f 4c  case DB_ENABLE_L
12bb0 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 3a 20 7b  OAD_EXTENSION: {
12bc0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
12bd0 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53  OMIT_LOAD_EXTENS
12be0 49 4f 4e 0a 20 20 20 20 69 6e 74 20 6f 6e 6f 66  ION.    int onof
12bf0 66 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21  f;.    if( objc!
12c00 3d 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  =3 ){.      Tcl_
12c10 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
12c20 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 42  erp, 2, objv, "B
12c30 4f 4f 4c 45 41 4e 22 29 3b 0a 20 20 20 20 20 20  OOLEAN");.      
12c40 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
12c50 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
12c60 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72  Tcl_GetBooleanFr
12c70 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
12c80 6a 76 5b 32 5d 2c 20 26 6f 6e 6f 66 66 29 20 29  jv[2], &onoff) )
12c90 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  {.      return T
12ca0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
12cb0 20 20 20 20 73 71 6c 69 74 65 33 5f 65 6e 61 62      sqlite3_enab
12cc0 6c 65 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f  le_load_extensio
12cd0 6e 28 70 44 62 2d 3e 64 62 2c 20 6f 6e 6f 66 66  n(pDb->db, onoff
12ce0 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 23 65  );.    break;.#e
12cf0 6c 73 65 0a 20 20 20 20 54 63 6c 5f 41 70 70 65  lse.    Tcl_Appe
12d00 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
12d10 20 22 65 78 74 65 6e 73 69 6f 6e 20 6c 6f 61 64   "extension load
12d20 69 6e 67 20 69 73 20 74 75 72 6e 65 64 20 6f 66  ing is turned of
12d30 66 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  f at compile-tim
12d40 65 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  e",.            
12d50 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29           (char*)
12d60 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
12d70 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6e 64 69 66  CL_ERROR;.#endif
12d80 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
12d90 20 20 20 24 64 62 20 65 72 72 6f 72 63 6f 64 65     $db errorcode
12da0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72  .  **.  ** Retur
12db0 6e 20 74 68 65 20 6e 75 6d 65 72 69 63 20 65 72  n the numeric er
12dc0 72 6f 72 20 63 6f 64 65 20 74 68 61 74 20 77 61  ror code that wa
12dd0 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  s returned by th
12de0 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 0a 20 20  e most recent.  
12df0 2a 2a 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  ** call to sqlit
12e00 65 33 5f 65 78 65 63 28 29 2e 0a 20 20 2a 2f 0a  e3_exec()..  */.
12e10 20 20 63 61 73 65 20 44 42 5f 45 52 52 4f 52 43    case DB_ERRORC
12e20 4f 44 45 3a 20 7b 0a 20 20 20 20 54 63 6c 5f 53  ODE: {.    Tcl_S
12e30 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
12e40 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  rp, Tcl_NewIntOb
12e50 6a 28 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64  j(sqlite3_errcod
12e60 65 28 70 44 62 2d 3e 64 62 29 29 29 3b 0a 20 20  e(pDb->db)));.  
12e70 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
12e80 2f 2a 0a 20 20 2a 2a 20 20 20 20 24 64 62 20 65  /*.  **    $db e
12e90 78 69 73 74 73 20 24 73 71 6c 0a 20 20 2a 2a 20  xists $sql.  ** 
12ea0 20 20 20 24 64 62 20 6f 6e 65 63 6f 6c 75 6d 6e     $db onecolumn
12eb0 20 24 73 71 6c 0a 20 20 2a 2a 0a 20 20 2a 2a 20   $sql.  **.  ** 
12ec0 54 68 65 20 6f 6e 65 63 6f 6c 75 6d 6e 20 6d 65  The onecolumn me
12ed0 74 68 6f 64 20 69 73 20 74 68 65 20 65 71 75 69  thod is the equi
12ee0 76 61 6c 65 6e 74 20 6f 66 3a 0a 20 20 2a 2a 20  valent of:.  ** 
12ef0 20 20 20 20 6c 69 6e 64 65 78 20 5b 24 64 62 20      lindex [$db 
12f00 65 76 61 6c 20 24 73 71 6c 5d 20 30 0a 20 20 2a  eval $sql] 0.  *
12f10 2f 0a 20 20 63 61 73 65 20 44 42 5f 45 58 49 53  /.  case DB_EXIS
12f20 54 53 3a 0a 20 20 63 61 73 65 20 44 42 5f 4f 4e  TS:.  case DB_ON
12f30 45 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 54  ECOLUMN: {.    T
12f40 63 6c 5f 4f 62 6a 20 2a 70 52 65 73 75 6c 74 20  cl_Obj *pResult 
12f50 3d 20 30 3b 0a 20 20 20 20 44 62 45 76 61 6c 43  = 0;.    DbEvalC
12f60 6f 6e 74 65 78 74 20 73 45 76 61 6c 3b 0a 20 20  ontext sEval;.  
12f70 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b    if( objc!=3 ){
12f80 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  .      Tcl_Wrong
12f90 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
12fa0 32 2c 20 6f 62 6a 76 2c 20 22 53 51 4c 22 29 3b  2, objv, "SQL");
12fb0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
12fc0 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a  L_ERROR;.    }..
12fd0 20 20 20 20 64 62 45 76 61 6c 49 6e 69 74 28 26      dbEvalInit(&
12fe0 73 45 76 61 6c 2c 20 70 44 62 2c 20 6f 62 6a 76  sEval, pDb, objv
12ff0 5b 32 5d 2c 20 30 29 3b 0a 20 20 20 20 72 63 20  [2], 0);.    rc 
13000 3d 20 64 62 45 76 61 6c 53 74 65 70 28 26 73 45  = dbEvalStep(&sE
13010 76 61 6c 29 3b 0a 20 20 20 20 69 66 28 20 63 68  val);.    if( ch
13020 6f 69 63 65 3d 3d 44 42 5f 4f 4e 45 43 4f 4c 55  oice==DB_ONECOLU
13030 4d 4e 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  MN ){.      if( 
13040 72 63 3d 3d 54 43 4c 5f 4f 4b 20 29 7b 0a 20 20  rc==TCL_OK ){.  
13050 20 20 20 20 20 20 70 52 65 73 75 6c 74 20 3d 20        pResult = 
13060 64 62 45 76 61 6c 43 6f 6c 75 6d 6e 56 61 6c 75  dbEvalColumnValu
13070 65 28 26 73 45 76 61 6c 2c 20 30 29 3b 0a 20 20  e(&sEval, 0);.  
13080 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63      }else if( rc
13090 3d 3d 54 43 4c 5f 42 52 45 41 4b 20 29 7b 0a 20  ==TCL_BREAK ){. 
130a0 20 20 20 20 20 20 20 54 63 6c 5f 52 65 73 65 74         Tcl_Reset
130b0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a  Result(interp);.
130c0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
130d0 65 20 69 66 28 20 72 63 3d 3d 54 43 4c 5f 42 52  e if( rc==TCL_BR
130e0 45 41 4b 20 7c 7c 20 72 63 3d 3d 54 43 4c 5f 4f  EAK || rc==TCL_O
130f0 4b 20 29 7b 0a 20 20 20 20 20 20 70 52 65 73 75  K ){.      pResu
13100 6c 74 20 3d 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c  lt = Tcl_NewBool
13110 65 61 6e 4f 62 6a 28 72 63 3d 3d 54 43 4c 5f 4f  eanObj(rc==TCL_O
13120 4b 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 62  K);.    }.    db
13130 45 76 61 6c 46 69 6e 61 6c 69 7a 65 28 26 73 45  EvalFinalize(&sE
13140 76 61 6c 29 3b 0a 20 20 20 20 69 66 28 20 70 52  val);.    if( pR
13150 65 73 75 6c 74 20 29 20 54 63 6c 5f 53 65 74 4f  esult ) Tcl_SetO
13160 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
13170 20 70 52 65 73 75 6c 74 29 3b 0a 0a 20 20 20 20   pResult);..    
13180 69 66 28 20 72 63 3d 3d 54 43 4c 5f 42 52 45 41  if( rc==TCL_BREA
13190 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
131a0 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  TCL_OK;.    }.  
131b0 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
131c0 2f 2a 0a 20 20 2a 2a 20 20 20 20 24 64 62 20 65  /*.  **    $db e
131d0 76 61 6c 20 24 73 71 6c 20 3f 61 72 72 61 79 3f  val $sql ?array?
131e0 20 3f 7b 20 20 2e 2e 2e 63 6f 64 65 2e 2e 2e 20   ?{  ...code... 
131f0 7d 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  }?.  **.  ** The
13200 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 69   SQL statement i
13210 6e 20 24 73 71 6c 20 69 73 20 65 76 61 6c 75 61  n $sql is evalua
13220 74 65 64 2e 20 20 46 6f 72 20 65 61 63 68 20 72  ted.  For each r
13230 6f 77 2c 20 74 68 65 20 76 61 6c 75 65 73 20 61  ow, the values a
13240 72 65 0a 20 20 2a 2a 20 70 6c 61 63 65 64 20 69  re.  ** placed i
13250 6e 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68  n elements of th
13260 65 20 61 72 72 61 79 20 6e 61 6d 65 64 20 22 61  e array named "a
13270 72 72 61 79 22 20 61 6e 64 20 2e 2e 2e 63 6f 64  rray" and ...cod
13280 65 2e 2e 2e 20 69 73 20 65 78 65 63 75 74 65 64  e... is executed
13290 2e 0a 20 20 2a 2a 20 49 66 20 22 61 72 72 61 79  ..  ** If "array
132a0 22 20 61 6e 64 20 22 63 6f 64 65 22 20 61 72 65  " and "code" are
132b0 20 6f 6d 69 74 74 65 64 2c 20 74 68 65 6e 20 6e   omitted, then n
132c0 6f 20 63 61 6c 6c 62 61 63 6b 20 69 73 20 65 76  o callback is ev
132d0 65 72 79 20 69 6e 76 6f 6b 65 64 2e 0a 20 20 2a  ery invoked..  *
132e0 2a 20 49 66 20 22 61 72 72 61 79 22 20 69 73 20  * If "array" is 
132f0 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2c  an empty string,
13300 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 73   then the values
13310 20 61 72 65 20 70 6c 61 63 65 64 20 69 6e 20 76   are placed in v
13320 61 72 69 61 62 6c 65 73 0a 20 20 2a 2a 20 74 68  ariables.  ** th
13330 61 74 20 68 61 76 65 20 74 68 65 20 73 61 6d 65  at have the same
13340 20 6e 61 6d 65 20 61 73 20 74 68 65 20 66 69 65   name as the fie
13350 6c 64 73 20 65 78 74 72 61 63 74 65 64 20 62 79  lds extracted by
13360 20 74 68 65 20 71 75 65 72 79 2e 0a 20 20 2a 2f   the query..  */
13370 0a 20 20 63 61 73 65 20 44 42 5f 45 56 41 4c 3a  .  case DB_EVAL:
13380 20 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3c   {.    if( objc<
13390 33 20 7c 7c 20 6f 62 6a 63 3e 35 20 29 7b 0a 20  3 || objc>5 ){. 
133a0 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
133b0 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
133c0 20 6f 62 6a 76 2c 20 22 53 51 4c 20 3f 41 52 52   objv, "SQL ?ARR
133d0 41 59 2d 4e 41 4d 45 3f 20 3f 53 43 52 49 50 54  AY-NAME? ?SCRIPT
133e0 3f 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ?");.      retur
133f0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
13400 20 7d 0a 0a 20 20 20 20 69 66 28 20 6f 62 6a 63   }..    if( objc
13410 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20 44 62 45  ==3 ){.      DbE
13420 76 61 6c 43 6f 6e 74 65 78 74 20 73 45 76 61 6c  valContext sEval
13430 3b 0a 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20  ;.      Tcl_Obj 
13440 2a 70 52 65 74 20 3d 20 54 63 6c 5f 4e 65 77 4f  *pRet = Tcl_NewO
13450 62 6a 28 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f  bj();.      Tcl_
13460 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 52 65  IncrRefCount(pRe
13470 74 29 3b 0a 20 20 20 20 20 20 64 62 45 76 61 6c  t);.      dbEval
13480 49 6e 69 74 28 26 73 45 76 61 6c 2c 20 70 44 62  Init(&sEval, pDb
13490 2c 20 6f 62 6a 76 5b 32 5d 2c 20 30 29 3b 0a 20  , objv[2], 0);. 
134a0 20 20 20 20 20 77 68 69 6c 65 28 20 54 43 4c 5f       while( TCL_
134b0 4f 4b 3d 3d 28 72 63 20 3d 20 64 62 45 76 61 6c  OK==(rc = dbEval
134c0 53 74 65 70 28 26 73 45 76 61 6c 29 29 20 29 7b  Step(&sEval)) ){
134d0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  .        int i;.
134e0 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c          int nCol
134f0 3b 0a 20 20 20 20 20 20 20 20 64 62 45 76 61 6c  ;.        dbEval
13500 52 6f 77 49 6e 66 6f 28 26 73 45 76 61 6c 2c 20  RowInfo(&sEval, 
13510 26 6e 43 6f 6c 2c 20 30 29 3b 0a 20 20 20 20 20  &nCol, 0);.     
13520 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
13530 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
13540 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
13550 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
13560 65 72 70 2c 20 70 52 65 74 2c 20 64 62 45 76 61  erp, pRet, dbEva
13570 6c 43 6f 6c 75 6d 6e 56 61 6c 75 65 28 26 73 45  lColumnValue(&sE
13580 76 61 6c 2c 20 69 29 29 3b 0a 20 20 20 20 20 20  val, i));.      
13590 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
135a0 20 20 64 62 45 76 61 6c 46 69 6e 61 6c 69 7a 65    dbEvalFinalize
135b0 28 26 73 45 76 61 6c 29 3b 0a 20 20 20 20 20 20  (&sEval);.      
135c0 69 66 28 20 72 63 3d 3d 54 43 4c 5f 42 52 45 41  if( rc==TCL_BREA
135d0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c  K ){.        Tcl
135e0 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
135f0 74 65 72 70 2c 20 70 52 65 74 29 3b 0a 20 20 20  terp, pRet);.   
13600 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 4f 4b       rc = TCL_OK
13610 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
13620 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
13630 28 70 52 65 74 29 3b 0a 20 20 20 20 7d 65 6c 73  (pRet);.    }els
13640 65 7b 0a 20 20 20 20 20 20 43 6c 69 65 6e 74 44  e{.      ClientD
13650 61 74 61 20 63 64 32 5b 32 5d 3b 0a 20 20 20 20  ata cd2[2];.    
13660 20 20 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 20    DbEvalContext 
13670 2a 70 3b 0a 20 20 20 20 20 20 54 63 6c 5f 4f 62  *p;.      Tcl_Ob
13680 6a 20 2a 70 41 72 72 61 79 20 3d 20 30 3b 0a 20  j *pArray = 0;. 
13690 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 53       Tcl_Obj *pS
136a0 63 72 69 70 74 3b 0a 0a 20 20 20 20 20 20 69 66  cript;..      if
136b0 28 20 6f 62 6a 63 3d 3d 35 20 26 26 20 2a 28 63  ( objc==5 && *(c
136c0 68 61 72 20 2a 29 54 63 6c 5f 47 65 74 53 74 72  har *)Tcl_GetStr
136d0 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 20 29 7b 0a  ing(objv[3]) ){.
136e0 20 20 20 20 20 20 20 20 70 41 72 72 61 79 20 3d          pArray =
136f0 20 6f 62 6a 76 5b 33 5d 3b 0a 20 20 20 20 20 20   objv[3];.      
13700 7d 0a 20 20 20 20 20 20 70 53 63 72 69 70 74 20  }.      pScript 
13710 3d 20 6f 62 6a 76 5b 6f 62 6a 63 2d 31 5d 3b 0a  = objv[objc-1];.
13720 20 20 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65        Tcl_IncrRe
13730 66 43 6f 75 6e 74 28 70 53 63 72 69 70 74 29 3b  fCount(pScript);
13740 0a 0a 20 20 20 20 20 20 70 20 3d 20 28 44 62 45  ..      p = (DbE
13750 76 61 6c 43 6f 6e 74 65 78 74 20 2a 29 54 63 6c  valContext *)Tcl
13760 5f 41 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 44 62  _Alloc(sizeof(Db
13770 45 76 61 6c 43 6f 6e 74 65 78 74 29 29 3b 0a 20  EvalContext));. 
13780 20 20 20 20 20 64 62 45 76 61 6c 49 6e 69 74 28       dbEvalInit(
13790 70 2c 20 70 44 62 2c 20 6f 62 6a 76 5b 32 5d 2c  p, pDb, objv[2],
137a0 20 70 41 72 72 61 79 29 3b 0a 0a 20 20 20 20 20   pArray);..     
137b0 20 63 64 32 5b 30 5d 20 3d 20 28 76 6f 69 64 20   cd2[0] = (void 
137c0 2a 29 70 3b 0a 20 20 20 20 20 20 63 64 32 5b 31  *)p;.      cd2[1
137d0 5d 20 3d 20 28 76 6f 69 64 20 2a 29 70 53 63 72  ] = (void *)pScr
137e0 69 70 74 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  ipt;.      rc = 
137f0 44 62 45 76 61 6c 4e 65 78 74 43 6d 64 28 63 64  DbEvalNextCmd(cd
13800 32 2c 20 69 6e 74 65 72 70 2c 20 54 43 4c 5f 4f  2, interp, TCL_O
13810 4b 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 72  K);.    }.    br
13820 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  eak;.  }..  /*. 
13830 20 2a 2a 20 20 20 20 20 24 64 62 20 66 75 6e 63   **     $db func
13840 74 69 6f 6e 20 4e 41 4d 45 20 5b 2d 61 72 67 63  tion NAME [-argc
13850 6f 75 6e 74 20 4e 5d 20 5b 2d 64 65 74 65 72 6d  ount N] [-determ
13860 69 6e 69 73 74 69 63 5d 20 53 43 52 49 50 54 0a  inistic] SCRIPT.
13870 20 20 2a 2a 0a 20 20 2a 2a 20 43 72 65 61 74 65    **.  ** Create
13880 20 61 20 6e 65 77 20 53 51 4c 20 66 75 6e 63 74   a new SQL funct
13890 69 6f 6e 20 63 61 6c 6c 65 64 20 4e 41 4d 45 2e  ion called NAME.
138a0 20 20 57 68 65 6e 65 76 65 72 20 74 68 61 74 20    Whenever that 
138b0 66 75 6e 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a  function is.  **
138c0 20 63 61 6c 6c 65 64 2c 20 69 6e 76 6f 6b 65 20   called, invoke 
138d0 53 43 52 49 50 54 20 74 6f 20 65 76 61 6c 75 61  SCRIPT to evalua
138e0 74 65 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 2e  te the function.
138f0 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f  .  */.  case DB_
13900 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20  FUNCTION: {.    
13910 69 6e 74 20 66 6c 61 67 73 20 3d 20 53 51 4c 49  int flags = SQLI
13920 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 53 71 6c  TE_UTF8;.    Sql
13930 46 75 6e 63 20 2a 70 46 75 6e 63 3b 0a 20 20 20  Func *pFunc;.   
13940 20 54 63 6c 5f 4f 62 6a 20 2a 70 53 63 72 69 70   Tcl_Obj *pScrip
13950 74 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4e 61  t;.    char *zNa
13960 6d 65 3b 0a 20 20 20 20 69 6e 74 20 6e 41 72 67  me;.    int nArg
13970 20 3d 20 2d 31 3b 0a 20 20 20 20 69 6e 74 20 69   = -1;.    int i
13980 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3c 34  ;.    if( objc<4
13990 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72   ){.      Tcl_Wr
139a0 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
139b0 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 4e 41 4d  p, 2, objv, "NAM
139c0 45 20 3f 53 57 49 54 43 48 45 53 3f 20 53 43 52  E ?SWITCHES? SCR
139d0 49 50 54 22 29 3b 0a 20 20 20 20 20 20 72 65 74  IPT");.      ret
139e0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
139f0 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 33     }.    for(i=3
13a00 3b 20 69 3c 28 6f 62 6a 63 2d 31 29 3b 20 69 2b  ; i<(objc-1); i+
13a10 2b 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20  +){.      const 
13a20 63 68 61 72 20 2a 7a 20 3d 20 54 63 6c 5f 47 65  char *z = Tcl_Ge
13a30 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 69 5d 29  tString(objv[i])
13a40 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20  ;.      int n = 
13a50 73 74 72 6c 65 6e 33 30 28 7a 29 3b 0a 20 20 20  strlen30(z);.   
13a60 20 20 20 69 66 28 20 6e 3e 32 20 26 26 20 73 74     if( n>2 && st
13a70 72 6e 63 6d 70 28 7a 2c 20 22 2d 61 72 67 63 6f  rncmp(z, "-argco
13a80 75 6e 74 22 2c 6e 29 3d 3d 30 20 29 7b 0a 20 20  unt",n)==0 ){.  
13a90 20 20 20 20 20 20 69 66 28 20 69 3d 3d 28 6f 62        if( i==(ob
13aa0 6a 63 2d 32 29 20 29 7b 0a 20 20 20 20 20 20 20  jc-2) ){.       
13ab0 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
13ac0 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 6f 70 74  ult(interp, "opt
13ad0 69 6f 6e 20 72 65 71 75 69 72 65 73 20 61 6e 20  ion requires an 
13ae0 61 72 67 75 6d 65 6e 74 3a 20 22 2c 20 7a 2c 20  argument: ", z, 
13af0 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  0);.          re
13b00 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
13b10 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
13b20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
13b30 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
13b40 6f 62 6a 76 5b 69 2b 31 5d 2c 20 26 6e 41 72 67  objv[i+1], &nArg
13b50 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
13b60 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 69 66  RROR;.        if
13b70 28 20 6e 41 72 67 3c 30 20 29 7b 0a 20 20 20 20  ( nArg<0 ){.    
13b80 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
13b90 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
13ba0 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  number of argume
13bb0 6e 74 73 20 6d 75 73 74 20 62 65 20 6e 6f 6e 2d  nts must be non-
13bc0 6e 65 67 61 74 69 76 65 22 2c 0a 20 20 20 20 20  negative",.     
13bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13be0 20 20 20 20 20 20 28 63 68 61 72 2a 29 30 29 3b        (char*)0);
13bf0 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
13c00 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
13c10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
13c20 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a  ++;.      }else.
13c30 20 20 20 20 20 20 69 66 28 20 6e 3e 32 20 26 26        if( n>2 &&
13c40 20 73 74 72 6e 63 6d 70 28 7a 2c 20 22 2d 64 65   strncmp(z, "-de
13c50 74 65 72 6d 69 6e 69 73 74 69 63 22 2c 6e 29 3d  terministic",n)=
13c60 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6c  =0 ){.        fl
13c70 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 44 45  ags |= SQLITE_DE
13c80 54 45 52 4d 49 4e 49 53 54 49 43 3b 0a 20 20 20  TERMINISTIC;.   
13c90 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
13ca0 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
13cb0 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 61 64 20  lt(interp, "bad 
13cc0 6f 70 74 69 6f 6e 20 5c 22 22 2c 20 7a 2c 0a 20  option \"", z,. 
13cd0 20 20 20 20 20 20 20 20 20 20 20 22 5c 22 3a 20             "\": 
13ce0 6d 75 73 74 20 62 65 20 2d 61 72 67 63 6f 75 6e  must be -argcoun
13cf0 74 20 6f 72 20 2d 64 65 74 65 72 6d 69 6e 69 73  t or -determinis
13d00 74 69 63 22 2c 20 30 0a 20 20 20 20 20 20 20 20  tic", 0.        
13d10 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
13d20 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
13d30 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
13d40 70 53 63 72 69 70 74 20 3d 20 6f 62 6a 76 5b 6f  pScript = objv[o
13d50 62 6a 63 2d 31 5d 3b 0a 20 20 20 20 7a 4e 61 6d  bjc-1];.    zNam
13d60 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  e = Tcl_GetStrin
13d70 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d  gFromObj(objv[2]
13d80 2c 20 30 29 3b 0a 20 20 20 20 70 46 75 6e 63 20  , 0);.    pFunc 
13d90 3d 20 66 69 6e 64 53 71 6c 46 75 6e 63 28 70 44  = findSqlFunc(pD
13da0 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69  b, zName);.    i
13db0 66 28 20 70 46 75 6e 63 3d 3d 30 20 29 20 72 65  f( pFunc==0 ) re
13dc0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
13dd0 20 20 20 20 69 66 28 20 70 46 75 6e 63 2d 3e 70      if( pFunc->p
13de0 53 63 72 69 70 74 20 29 7b 0a 20 20 20 20 20 20  Script ){.      
13df0 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
13e00 28 70 46 75 6e 63 2d 3e 70 53 63 72 69 70 74 29  (pFunc->pScript)
13e10 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 46 75 6e  ;.    }.    pFun
13e20 63 2d 3e 70 53 63 72 69 70 74 20 3d 20 70 53 63  c->pScript = pSc
13e30 72 69 70 74 3b 0a 20 20 20 20 54 63 6c 5f 49 6e  ript;.    Tcl_In
13e40 63 72 52 65 66 43 6f 75 6e 74 28 70 53 63 72 69  crRefCount(pScri
13e50 70 74 29 3b 0a 20 20 20 20 70 46 75 6e 63 2d 3e  pt);.    pFunc->
13e60 75 73 65 45 76 61 6c 4f 62 6a 76 20 3d 20 73 61  useEvalObjv = sa
13e70 66 65 54 6f 55 73 65 45 76 61 6c 4f 62 6a 76 28  feToUseEvalObjv(
13e80 69 6e 74 65 72 70 2c 20 70 53 63 72 69 70 74 29  interp, pScript)
13e90 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
13ea0 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
13eb0 6f 6e 28 70 44 62 2d 3e 64 62 2c 20 7a 4e 61 6d  on(pDb->db, zNam
13ec0 65 2c 20 6e 41 72 67 2c 20 66 6c 61 67 73 2c 0a  e, nArg, flags,.
13ed0 20 20 20 20 20 20 20 20 70 46 75 6e 63 2c 20 74          pFunc, t
13ee0 63 6c 53 71 6c 46 75 6e 63 2c 20 30 2c 20 30 29  clSqlFunc, 0, 0)
13ef0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
13f00 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
13f10 20 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b   rc = TCL_ERROR;
13f20 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74 52 65  .      Tcl_SetRe
13f30 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68  sult(interp, (ch
13f40 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 65 72 72  ar *)sqlite3_err
13f50 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c 20 54 43  msg(pDb->db), TC
13f60 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 20  L_VOLATILE);.   
13f70 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20   }.    break;.  
13f80 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20  }..  /*.  **    
13f90 20 24 64 62 20 69 6e 63 72 62 6c 6f 62 20 3f 2d   $db incrblob ?-
13fa0 72 65 61 64 6f 6e 6c 79 3f 20 3f 44 42 3f 20 54  readonly? ?DB? T
13fb0 41 42 4c 45 20 43 4f 4c 55 4d 4e 20 52 4f 57 49  ABLE COLUMN ROWI
13fc0 44 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  D.  */.  case DB
13fd0 5f 49 4e 43 52 42 4c 4f 42 3a 20 7b 0a 23 69 66  _INCRBLOB: {.#if
13fe0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
13ff0 49 4e 43 52 42 4c 4f 42 0a 20 20 20 20 54 63 6c  INCRBLOB.    Tcl
14000 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
14010 74 65 72 70 2c 20 22 69 6e 63 72 62 6c 6f 62 20  terp, "incrblob 
14020 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 69 6e  not available in
14030 20 74 68 69 73 20 62 75 69 6c 64 22 2c 20 28 63   this build", (c
14040 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 72 65 74  har*)0);.    ret
14050 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23  urn TCL_ERROR;.#
14060 65 6c 73 65 0a 20 20 20 20 69 6e 74 20 69 73 52  else.    int isR
14070 65 61 64 6f 6e 6c 79 20 3d 20 30 3b 0a 20 20 20  eadonly = 0;.   
14080 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
14090 20 3d 20 22 6d 61 69 6e 22 3b 0a 20 20 20 20 63   = "main";.    c
140a0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 6c  onst char *zTabl
140b0 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  e;.    const cha
140c0 72 20 2a 7a 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  r *zColumn;.    
140d0 54 63 6c 5f 57 69 64 65 49 6e 74 20 69 52 6f 77  Tcl_WideInt iRow
140e0 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  ;..    /* Check 
140f0 66 6f 72 20 74 68 65 20 2d 72 65 61 64 6f 6e 6c  for the -readonl
14100 79 20 6f 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  y option */.    
14110 69 66 28 20 6f 62 6a 63 3e 33 20 26 26 20 73 74  if( objc>3 && st
14120 72 63 6d 70 28 54 63 6c 5f 47 65 74 53 74 72 69  rcmp(Tcl_GetStri
14130 6e 67 28 6f 62 6a 76 5b 32 5d 29 2c 20 22 2d 72  ng(objv[2]), "-r
14140 65 61 64 6f 6e 6c 79 22 29 3d 3d 30 20 29 7b 0a  eadonly")==0 ){.
14150 20 20 20 20 20 20 69 73 52 65 61 64 6f 6e 6c 79        isReadonly
14160 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   = 1;.    }..   
14170 20 69 66 28 20 6f 62 6a 63 21 3d 28 35 2b 69 73   if( objc!=(5+is
14180 52 65 61 64 6f 6e 6c 79 29 20 26 26 20 6f 62 6a  Readonly) && obj
14190 63 21 3d 28 36 2b 69 73 52 65 61 64 6f 6e 6c 79  c!=(6+isReadonly
141a0 29 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57  ) ){.      Tcl_W
141b0 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
141c0 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 2d  rp, 2, objv, "?-
141d0 72 65 61 64 6f 6e 6c 79 3f 20 3f 44 42 3f 20 54  readonly? ?DB? T
141e0 41 42 4c 45 20 43 4f 4c 55 4d 4e 20 52 4f 57 49  ABLE COLUMN ROWI
141f0 44 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  D");.      retur
14200 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
14210 20 7d 0a 0a 20 20 20 20 69 66 28 20 6f 62 6a 63   }..    if( objc
14220 3d 3d 28 36 2b 69 73 52 65 61 64 6f 6e 6c 79 29  ==(6+isReadonly)
14230 20 29 7b 0a 20 20 20 20 20 20 7a 44 62 20 3d 20   ){.      zDb = 
14240 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
14250 6a 76 5b 32 5d 29 3b 0a 20 20 20 20 7d 0a 20 20  jv[2]);.    }.  
14260 20 20 7a 54 61 62 6c 65 20 3d 20 54 63 6c 5f 47    zTable = Tcl_G
14270 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 6f 62  etString(objv[ob
14280 6a 63 2d 33 5d 29 3b 0a 20 20 20 20 7a 43 6f 6c  jc-3]);.    zCol
14290 75 6d 6e 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  umn = Tcl_GetStr
142a0 69 6e 67 28 6f 62 6a 76 5b 6f 62 6a 63 2d 32 5d  ing(objv[objc-2]
142b0 29 3b 0a 20 20 20 20 72 63 20 3d 20 54 63 6c 5f  );.    rc = Tcl_
142c0 47 65 74 57 69 64 65 49 6e 74 46 72 6f 6d 4f 62  GetWideIntFromOb
142d0 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 6f  j(interp, objv[o
142e0 62 6a 63 2d 31 5d 2c 20 26 69 52 6f 77 29 3b 0a  bjc-1], &iRow);.
142f0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 54 43 4c  .    if( rc==TCL
14300 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
14310 3d 20 63 72 65 61 74 65 49 6e 63 72 62 6c 6f 62  = createIncrblob
14320 43 68 61 6e 6e 65 6c 28 0a 20 20 20 20 20 20 20  Channel(.       
14330 20 20 20 69 6e 74 65 72 70 2c 20 70 44 62 2c 20     interp, pDb, 
14340 7a 44 62 2c 20 7a 54 61 62 6c 65 2c 20 7a 43 6f  zDb, zTable, zCo
14350 6c 75 6d 6e 2c 20 28 73 71 6c 69 74 65 33 5f 69  lumn, (sqlite3_i
14360 6e 74 36 34 29 69 52 6f 77 2c 20 69 73 52 65 61  nt64)iRow, isRea
14370 64 6f 6e 6c 79 0a 20 20 20 20 20 20 29 3b 0a 20  donly.      );. 
14380 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
14390 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
143a0 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20 69 6e  .  **     $db in
143b0 74 65 72 72 75 70 74 0a 20 20 2a 2a 0a 20 20 2a  terrupt.  **.  *
143c0 2a 20 49 6e 74 65 72 72 75 70 74 20 74 68 65 20  * Interrupt the 
143d0 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 74 68 65  execution of the
143e0 20 69 6e 6e 65 72 2d 6d 6f 73 74 20 53 51 4c 20   inner-most SQL 
143f0 69 6e 74 65 72 70 72 65 74 65 72 2e 20 20 54 68  interpreter.  Th
14400 69 73 0a 20 20 2a 2a 20 63 61 75 73 65 73 20 74  is.  ** causes t
14410 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  he SQL statement
14420 20 74 6f 20 72 65 74 75 72 6e 20 61 6e 20 65 72   to return an er
14430 72 6f 72 20 6f 66 20 53 51 4c 49 54 45 5f 49 4e  ror of SQLITE_IN
14440 54 45 52 52 55 50 54 2e 0a 20 20 2a 2f 0a 20 20  TERRUPT..  */.  
14450 63 61 73 65 20 44 42 5f 49 4e 54 45 52 52 55 50  case DB_INTERRUP
14460 54 3a 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  T: {.    sqlite3
14470 5f 69 6e 74 65 72 72 75 70 74 28 70 44 62 2d 3e  _interrupt(pDb->
14480 64 62 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a  db);.    break;.
14490 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20    }..  /*.  **  
144a0 20 20 20 24 64 62 20 6e 75 6c 6c 76 61 6c 75 65     $db nullvalue
144b0 20 3f 53 54 52 49 4e 47 3f 0a 20 20 2a 2a 0a 20   ?STRING?.  **. 
144c0 20 2a 2a 20 43 68 61 6e 67 65 20 74 65 78 74 20   ** Change text 
144d0 75 73 65 64 20 77 68 65 6e 20 61 20 4e 55 4c 4c  used when a NULL
144e0 20 63 6f 6d 65 73 20 62 61 63 6b 20 66 72 6f 6d   comes back from
144f0 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 49   the database. I
14500 66 20 3f 53 54 52 49 4e 47 3f 0a 20 20 2a 2a 20  f ?STRING?.  ** 
14510 69 73 20 6e 6f 74 20 70 72 65 73 65 6e 74 2c 20  is not present, 
14520 74 68 65 6e 20 74 68 65 20 63 75 72 72 65 6e 74  then the current
14530 20 73 74 72 69 6e 67 20 75 73 65 64 20 66 6f 72   string used for
14540 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65   NULL is returne
14550 64 2e 0a 20 20 2a 2a 20 49 66 20 53 54 52 49 4e  d..  ** If STRIN
14560 47 20 69 73 20 70 72 65 73 65 6e 74 2c 20 74 68  G is present, th
14570 65 6e 20 53 54 52 49 4e 47 20 69 73 20 72 65 74  en STRING is ret
14580 75 72 6e 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2f  urned..  **.  */
14590 0a 20 20 63 61 73 65 20 44 42 5f 4e 55 4c 4c 56  .  case DB_NULLV
145a0 41 4c 55 45 3a 20 7b 0a 20 20 20 20 69 66 28 20  ALUE: {.    if( 
145b0 6f 62 6a 63 21 3d 32 20 26 26 20 6f 62 6a 63 21  objc!=2 && objc!
145c0 3d 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  =3 ){.      Tcl_
145d0 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
145e0 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 4e  erp, 2, objv, "N
145f0 55 4c 4c 56 41 4c 55 45 22 29 3b 0a 20 20 20 20  ULLVALUE");.    
14600 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
14610 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  OR;.    }.    if
14620 28 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20 20 20  ( objc==3 ){.   
14630 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20     int len;.    
14640 20 20 63 68 61 72 20 2a 7a 4e 75 6c 6c 20 3d 20    char *zNull = 
14650 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
14660 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c  mObj(objv[2], &l
14670 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  en);.      if( p
14680 44 62 2d 3e 7a 4e 75 6c 6c 20 29 7b 0a 20 20 20  Db->zNull ){.   
14690 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44       Tcl_Free(pD
146a0 62 2d 3e 7a 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  b->zNull);.     
146b0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 4e 75   }.      if( zNu
146c0 6c 6c 20 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20  ll && len>0 ){. 
146d0 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e 75 6c         pDb->zNul
146e0 6c 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c  l = Tcl_Alloc( l
146f0 65 6e 20 2b 20 31 20 29 3b 0a 20 20 20 20 20 20  en + 1 );.      
14700 20 20 6d 65 6d 63 70 79 28 70 44 62 2d 3e 7a 4e    memcpy(pDb->zN
14710 75 6c 6c 2c 20 7a 4e 75 6c 6c 2c 20 6c 65 6e 29  ull, zNull, len)
14720 3b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a  ;.        pDb->z
14730 4e 75 6c 6c 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27  Null[len] = '\0'
14740 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
14750 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e 75 6c         pDb->zNul
14760 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  l = 0;.      }. 
14770 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 53 65 74     }.    Tcl_Set
14780 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
14790 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
147a0 62 6a 28 70 44 62 2d 3e 7a 4e 75 6c 6c 2c 20 2d  bj(pDb->zNull, -
147b0 31 29 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a  1));.    break;.
147c0 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20    }..  /*.  **  
147d0 20 20 20 24 64 62 20 6c 61 73 74 5f 69 6e 73 65     $db last_inse
147e0 72 74 5f 72 6f 77 69 64 0a 20 20 2a 2a 0a 20 20  rt_rowid.  **.  
147f0 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20 69 6e 74  ** Return an int
14800 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68  eger which is th
14810 65 20 52 4f 57 49 44 20 66 6f 72 20 74 68 65 20  e ROWID for the 
14820 6d 6f 73 74 20 72 65 63 65 6e 74 20 69 6e 73 65  most recent inse
14830 72 74 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  rt..  */.  case 
14840 44 42 5f 4c 41 53 54 5f 49 4e 53 45 52 54 5f 52  DB_LAST_INSERT_R
14850 4f 57 49 44 3a 20 7b 0a 20 20 20 20 54 63 6c 5f  OWID: {.    Tcl_
14860 4f 62 6a 20 2a 70 52 65 73 75 6c 74 3b 0a 20 20  Obj *pResult;.  
14870 20 20 54 63 6c 5f 57 69 64 65 49 6e 74 20 72 6f    Tcl_WideInt ro
14880 77 69 64 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a  wid;.    if( obj
14890 63 21 3d 32 20 29 7b 0a 20 20 20 20 20 20 54 63  c!=2 ){.      Tc
148a0 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
148b0 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
148c0 22 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  "");.      retur
148d0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
148e0 20 7d 0a 20 20 20 20 72 6f 77 69 64 20 3d 20 73   }.    rowid = s
148f0 71 6c 69 74 65 33 5f 6c 61 73 74 5f 69 6e 73 65  qlite3_last_inse
14900 72 74 5f 72 6f 77 69 64 28 70 44 62 2d 3e 64 62  rt_rowid(pDb->db
14910 29 3b 0a 20 20 20 20 70 52 65 73 75 6c 74 20 3d  );.    pResult =
14920 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c   Tcl_GetObjResul
14930 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54  t(interp);.    T
14940 63 6c 5f 53 65 74 57 69 64 65 49 6e 74 4f 62 6a  cl_SetWideIntObj
14950 28 70 52 65 73 75 6c 74 2c 20 72 6f 77 69 64 29  (pResult, rowid)
14960 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  ;.    break;.  }
14970 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54 68 65 20  ..  /*.  ** The 
14980 44 42 5f 4f 4e 45 43 4f 4c 55 4d 4e 20 6d 65 74  DB_ONECOLUMN met
14990 68 6f 64 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74  hod is implement
149a0 65 64 20 74 6f 67 65 74 68 65 72 20 77 69 74 68  ed together with
149b0 20 44 42 5f 45 58 49 53 54 53 2e 0a 20 20 2a 2f   DB_EXISTS..  */
149c0 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 70 72  ..  /*    $db pr
149d0 6f 67 72 65 73 73 20 3f 4e 20 43 41 4c 4c 42 41  ogress ?N CALLBA
149e0 43 4b 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e  CK?.  **.  ** In
149f0 76 6f 6b 65 20 74 68 65 20 67 69 76 65 6e 20 63  voke the given c
14a00 61 6c 6c 62 61 63 6b 20 65 76 65 72 79 20 4e 20  allback every N 
14a10 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20  virtual machine 
14a20 6f 70 63 6f 64 65 73 20 77 68 69 6c 65 20 65 78  opcodes while ex
14a30 65 63 75 74 69 6e 67 0a 20 20 2a 2a 20 71 75 65  ecuting.  ** que
14a40 72 69 65 73 2e 0a 20 20 2a 2f 0a 20 20 63 61 73  ries..  */.  cas
14a50 65 20 44 42 5f 50 52 4f 47 52 45 53 53 3a 20 7b  e DB_PROGRESS: {
14a60 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d 32  .    if( objc==2
14a70 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 44   ){.      if( pD
14a80 62 2d 3e 7a 50 72 6f 67 72 65 73 73 20 29 7b 0a  b->zProgress ){.
14a90 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65          Tcl_Appe
14aa0 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
14ab0 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 2c   pDb->zProgress,
14ac0 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20   (char*)0);.    
14ad0 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66    }.    }else if
14ae0 28 20 6f 62 6a 63 3d 3d 34 20 29 7b 0a 20 20 20  ( objc==4 ){.   
14af0 20 20 20 63 68 61 72 20 2a 7a 50 72 6f 67 72 65     char *zProgre
14b00 73 73 3b 0a 20 20 20 20 20 20 69 6e 74 20 6c 65  ss;.      int le
14b10 6e 3b 0a 20 20 20 20 20 20 69 6e 74 20 4e 3b 0a  n;.      int N;.
14b20 20 20 20 20 20 20 69 66 28 20 54 43 4c 5f 4f 4b        if( TCL_OK
14b30 21 3d 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  !=Tcl_GetIntFrom
14b40 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
14b50 5b 32 5d 2c 20 26 4e 29 20 29 7b 0a 20 20 20 20  [2], &N) ){.    
14b60 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
14b70 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 3b 0a 20  RROR;.      };. 
14b80 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 50       if( pDb->zP
14b90 72 6f 67 72 65 73 73 20 29 7b 0a 20 20 20 20 20  rogress ){.     
14ba0 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d     Tcl_Free(pDb-
14bb0 3e 7a 50 72 6f 67 72 65 73 73 29 3b 0a 20 20 20  >zProgress);.   
14bc0 20 20 20 7d 0a 20 20 20 20 20 20 7a 50 72 6f 67     }.      zProg
14bd0 72 65 73 73 20 3d 20 54 63 6c 5f 47 65 74 53 74  ress = Tcl_GetSt
14be0 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
14bf0 5b 33 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20  [3], &len);.    
14c00 20 20 69 66 28 20 7a 50 72 6f 67 72 65 73 73 20    if( zProgress 
14c10 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20  && len>0 ){.    
14c20 20 20 20 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65      pDb->zProgre
14c30 73 73 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 20  ss = Tcl_Alloc( 
14c40 6c 65 6e 20 2b 20 31 20 29 3b 0a 20 20 20 20 20  len + 1 );.     
14c50 20 20 20 6d 65 6d 63 70 79 28 70 44 62 2d 3e 7a     memcpy(pDb->z
14c60 50 72 6f 67 72 65 73 73 2c 20 7a 50 72 6f 67 72  Progress, zProgr
14c70 65 73 73 2c 20 6c 65 6e 2b 31 29 3b 0a 20 20 20  ess, len+1);.   
14c80 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
14c90 20 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73    pDb->zProgress
14ca0 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23 69   = 0;.      }.#i
14cb0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
14cc0 54 5f 50 52 4f 47 52 45 53 53 5f 43 41 4c 4c 42  T_PROGRESS_CALLB
14cd0 41 43 4b 0a 20 20 20 20 20 20 69 66 28 20 70 44  ACK.      if( pD
14ce0 62 2d 3e 7a 50 72 6f 67 72 65 73 73 20 29 7b 0a  b->zProgress ){.
14cf0 20 20 20 20 20 20 20 20 70 44 62 2d 3e 69 6e 74          pDb->int
14d00 65 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20  erp = interp;.  
14d10 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 70 72        sqlite3_pr
14d20 6f 67 72 65 73 73 5f 68 61 6e 64 6c 65 72 28 70  ogress_handler(p
14d30 44 62 2d 3e 64 62 2c 20 4e 2c 20 44 62 50 72 6f  Db->db, N, DbPro
14d40 67 72 65 73 73 48 61 6e 64 6c 65 72 2c 20 70 44  gressHandler, pD
14d50 62 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  b);.      }else{
14d60 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
14d70 5f 70 72 6f 67 72 65 73 73 5f 68 61 6e 64 6c 65  _progress_handle
14d80 72 28 70 44 62 2d 3e 64 62 2c 20 30 2c 20 30 2c  r(pDb->db, 0, 0,
14d90 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e   0);.      }.#en
14da0 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  dif.    }else{. 
14db0 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
14dc0 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
14dd0 20 6f 62 6a 76 2c 20 22 4e 20 43 41 4c 4c 42 41   objv, "N CALLBA
14de0 43 4b 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  CK");.      retu
14df0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
14e00 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20    }.    break;. 
14e10 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20   }..  /*    $db 
14e20 70 72 6f 66 69 6c 65 20 3f 43 41 4c 4c 42 41 43  profile ?CALLBAC
14e30 4b 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 61 6b  K?.  **.  ** Mak
14e40 65 20 61 72 72 61 6e 67 65 6d 65 6e 74 73 20 74  e arrangements t
14e50 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20 43 41 4c  o invoke the CAL
14e60 4c 42 41 43 4b 20 72 6f 75 74 69 6e 65 20 61 66  LBACK routine af
14e70 74 65 72 20 65 61 63 68 20 53 51 4c 20 73 74 61  ter each SQL sta
14e80 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 68 61 74  tement.  ** that
14e90 20 68 61 73 20 72 75 6e 2e 20 20 54 68 65 20 74   has run.  The t
14ea0 65 78 74 20 6f 66 20 74 68 65 20 53 51 4c 20 61  ext of the SQL a
14eb0 6e 64 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66  nd the amount of
14ec0 20 65 6c 61 70 73 65 20 74 69 6d 65 20 61 72 65   elapse time are
14ed0 0a 20 20 2a 2a 20 61 70 70 65 6e 64 65 64 20 74  .  ** appended t
14ee0 6f 20 43 41 4c 4c 42 41 43 4b 20 62 65 66 6f 72  o CALLBACK befor
14ef0 65 20 74 68 65 20 73 63 72 69 70 74 20 69 73 20  e the script is 
14f00 72 75 6e 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  run..  */.  case
14f10 20 44 42 5f 50 52 4f 46 49 4c 45 3a 20 7b 0a 20   DB_PROFILE: {. 
14f20 20 20 20 69 66 28 20 6f 62 6a 63 3e 33 20 29 7b     if( objc>3 ){
14f30 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  .      Tcl_Wrong
14f40 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
14f50 32 2c 20 6f 62 6a 76 2c 20 22 3f 43 41 4c 4c 42  2, objv, "?CALLB
14f60 41 43 4b 3f 22 29 3b 0a 20 20 20 20 20 20 72 65  ACK?");.      re
14f70 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
14f80 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 62      }else if( ob
14f90 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 69  jc==2 ){.      i
14fa0 66 28 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65  f( pDb->zProfile
14fb0 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f   ){.        Tcl_
14fc0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
14fd0 65 72 70 2c 20 70 44 62 2d 3e 7a 50 72 6f 66 69  erp, pDb->zProfi
14fe0 6c 65 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20  le, (char*)0);. 
14ff0 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
15000 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 50  {.      char *zP
15010 72 6f 66 69 6c 65 3b 0a 20 20 20 20 20 20 69 6e  rofile;.      in
15020 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20 69 66 28  t len;.      if(
15030 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 20 29   pDb->zProfile )
15040 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 46 72  {.        Tcl_Fr
15050 65 65 28 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65  ee(pDb->zProfile
15060 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
15070 20 7a 50 72 6f 66 69 6c 65 20 3d 20 54 63 6c 5f   zProfile = Tcl_
15080 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
15090 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b  (objv[2], &len);
150a0 0a 20 20 20 20 20 20 69 66 28 20 7a 50 72 6f 66  .      if( zProf
150b0 69 6c 65 20 26 26 20 6c 65 6e 3e 30 20 29 7b 0a  ile && len>0 ){.
150c0 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 50 72          pDb->zPr
150d0 6f 66 69 6c 65 20 3d 20 54 63 6c 5f 41 6c 6c 6f  ofile = Tcl_Allo
150e0 63 28 20 6c 65 6e 20 2b 20 31 20 29 3b 0a 20 20  c( len + 1 );.  
150f0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 44 62        memcpy(pDb
15100 2d 3e 7a 50 72 6f 66 69 6c 65 2c 20 7a 50 72 6f  ->zProfile, zPro
15110 66 69 6c 65 2c 20 6c 65 6e 2b 31 29 3b 0a 20 20  file, len+1);.  
15120 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
15130 20 20 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65     pDb->zProfile
15140 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23 69   = 0;.      }.#i
15150 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
15160 45 5f 4f 4d 49 54 5f 54 52 41 43 45 29 20 26 26  E_OMIT_TRACE) &&
15170 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
15180 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50  _OMIT_FLOATING_P
15190 4f 49 4e 54 29 0a 20 20 20 20 20 20 69 66 28 20  OINT).      if( 
151a0 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 20 29 7b  pDb->zProfile ){
151b0 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 69 6e  .        pDb->in
151c0 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20  terp = interp;. 
151d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 70         sqlite3_p
151e0 72 6f 66 69 6c 65 28 70 44 62 2d 3e 64 62 2c 20  rofile(pDb->db, 
151f0 44 62 50 72 6f 66 69 6c 65 48 61 6e 64 6c 65 72  DbProfileHandler
15200 2c 20 70 44 62 29 3b 0a 20 20 20 20 20 20 7d 65  , pDb);.      }e
15210 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
15220 69 74 65 33 5f 70 72 6f 66 69 6c 65 28 70 44 62  ite3_profile(pDb
15230 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ->db, 0, 0);.   
15240 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
15250 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  }.    break;.  }
15260 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20  ..  /*.  **     
15270 24 64 62 20 72 65 6b 65 79 20 4b 45 59 0a 20 20  $db rekey KEY.  
15280 2a 2a 0a 20 20 2a 2a 20 43 68 61 6e 67 65 20 74  **.  ** Change t
15290 68 65 20 65 6e 63 72 79 70 74 69 6f 6e 20 6b 65  he encryption ke
152a0 79 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74  y on the current
152b0 6c 79 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65  ly open database
152c0 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  ..  */.  case DB
152d0 5f 52 45 4b 45 59 3a 20 7b 0a 23 69 66 20 64 65  _REKEY: {.#if de
152e0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 48 41 53  fined(SQLITE_HAS
152f0 5f 43 4f 44 45 43 29 20 26 26 20 21 64 65 66 69  _CODEC) && !defi
15300 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
15310 43 4f 44 45 43 5f 46 52 4f 4d 5f 54 43 4c 29 0a  CODEC_FROM_TCL).
15320 20 20 20 20 69 6e 74 20 6e 4b 65 79 3b 0a 20 20      int nKey;.  
15330 20 20 76 6f 69 64 20 2a 70 4b 65 79 3b 0a 23 65    void *pKey;.#e
15340 6e 64 69 66 0a 20 20 20 20 69 66 28 20 6f 62 6a  ndif.    if( obj
15350 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 54 63  c!=3 ){.      Tc
15360 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
15370 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
15380 22 4b 45 59 22 29 3b 0a 20 20 20 20 20 20 72 65  "KEY");.      re
15390 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
153a0 20 20 20 20 7d 0a 23 69 66 20 64 65 66 69 6e 65      }.#if define
153b0 64 28 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  d(SQLITE_HAS_COD
153c0 45 43 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  EC) && !defined(
153d0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 44 45  SQLITE_OMIT_CODE
153e0 43 5f 46 52 4f 4d 5f 54 43 4c 29 0a 20 20 20 20  C_FROM_TCL).    
153f0 70 4b 65 79 20 3d 20 54 63 6c 5f 47 65 74 42 79  pKey = Tcl_GetBy
15400 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6f  teArrayFromObj(o
15410 62 6a 76 5b 32 5d 2c 20 26 6e 4b 65 79 29 3b 0a  bjv[2], &nKey);.
15420 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
15430 5f 72 65 6b 65 79 28 70 44 62 2d 3e 64 62 2c 20  _rekey(pDb->db, 
15440 70 4b 65 79 2c 20 6e 4b 65 79 29 3b 0a 20 20 20  pKey, nKey);.   
15450 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
15460 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
15470 74 28 69 6e 74 65 72 70 2c 20 73 71 6c 69 74 65  t(interp, sqlite
15480 33 5f 65 72 72 73 74 72 28 72 63 29 2c 20 28 63  3_errstr(rc), (c
15490 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 72  har*)0);.      r
154a0 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  c = TCL_ERROR;. 
154b0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
154c0 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
154d0 20 20 20 20 24 64 62 20 72 65 73 74 6f 72 65 20      $db restore 
154e0 3f 44 41 54 41 42 41 53 45 3f 20 46 49 4c 45 4e  ?DATABASE? FILEN
154f0 41 4d 45 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 70  AME.  **.  ** Op
15500 65 6e 20 61 20 64 61 74 61 62 61 73 65 20 66 69  en a database fi
15510 6c 65 20 6e 61 6d 65 64 20 46 49 4c 45 4e 41 4d  le named FILENAM
15520 45 2e 20 20 54 72 61 6e 73 66 65 72 20 74 68 65  E.  Transfer the
15530 20 63 6f 6e 74 65 6e 74 0a 20 20 2a 2a 20 6f 66   content.  ** of
15540 20 46 49 4c 45 4e 41 4d 45 20 69 6e 74 6f 20 74   FILENAME into t
15550 68 65 20 6c 6f 63 61 6c 20 64 61 74 61 62 61 73  he local databas
15560 65 20 44 41 54 41 42 41 53 45 20 28 64 65 66 61  e DATABASE (defa
15570 75 6c 74 3a 20 22 6d 61 69 6e 22 29 2e 0a 20 20  ult: "main")..  
15580 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 52 45 53  */.  case DB_RES
15590 54 4f 52 45 3a 20 7b 0a 20 20 20 20 63 6f 6e 73  TORE: {.    cons
155a0 74 20 63 68 61 72 20 2a 7a 53 72 63 46 69 6c 65  t char *zSrcFile
155b0 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
155c0 20 2a 7a 44 65 73 74 44 62 3b 0a 20 20 20 20 73   *zDestDb;.    s
155d0 71 6c 69 74 65 33 20 2a 70 53 72 63 3b 0a 20 20  qlite3 *pSrc;.  
155e0 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70    sqlite3_backup
155f0 20 2a 70 42 61 63 6b 75 70 3b 0a 20 20 20 20 69   *pBackup;.    i
15600 6e 74 20 6e 54 69 6d 65 6f 75 74 20 3d 20 30 3b  nt nTimeout = 0;
15610 0a 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d  ..    if( objc==
15620 33 20 29 7b 0a 20 20 20 20 20 20 7a 44 65 73 74  3 ){.      zDest
15630 44 62 20 3d 20 22 6d 61 69 6e 22 3b 0a 20 20 20  Db = "main";.   
15640 20 20 20 7a 53 72 63 46 69 6c 65 20 3d 20 54 63     zSrcFile = Tc
15650 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
15660 5b 32 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  [2]);.    }else 
15670 69 66 28 20 6f 62 6a 63 3d 3d 34 20 29 7b 0a 20  if( objc==4 ){. 
15680 20 20 20 20 20 7a 44 65 73 74 44 62 20 3d 20 54       zDestDb = T
15690 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
156a0 76 5b 32 5d 29 3b 0a 20 20 20 20 20 20 7a 53 72  v[2]);.      zSr
156b0 63 46 69 6c 65 20 3d 20 54 63 6c 5f 47 65 74 53  cFile = Tcl_GetS
156c0 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a  tring(objv[3]);.
156d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
156e0 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
156f0 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a  s(interp, 2, obj
15700 76 2c 20 22 3f 44 41 54 41 42 41 53 45 3f 20 46  v, "?DATABASE? F
15710 49 4c 45 4e 41 4d 45 22 29 3b 0a 20 20 20 20 20  ILENAME");.     
15720 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
15730 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  R;.    }.    rc 
15740 3d 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76  = sqlite3_open_v
15750 32 28 7a 53 72 63 46 69 6c 65 2c 20 26 70 53 72  2(zSrcFile, &pSr
15760 63 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  c,.             
15770 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
15780 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
15790 20 7c 20 70 44 62 2d 3e 6f 70 65 6e 46 6c 61 67   | pDb->openFlag
157a0 73 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  s, 0);.    if( r
157b0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
157c0 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
157d0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
157e0 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 73 6f 75 72  cannot open sour
157f0 63 65 20 64 61 74 61 62 61 73 65 3a 20 22 2c 0a  ce database: ",.
15800 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
15810 65 33 5f 65 72 72 6d 73 67 28 70 53 72 63 29 2c  e3_errmsg(pSrc),
15820 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20   (char*)0);.    
15830 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28    sqlite3_close(
15840 70 53 72 63 29 3b 0a 20 20 20 20 20 20 72 65 74  pSrc);.      ret
15850 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
15860 20 20 20 7d 0a 20 20 20 20 70 42 61 63 6b 75 70     }.    pBackup
15870 20 3d 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75   = sqlite3_backu
15880 70 5f 69 6e 69 74 28 70 44 62 2d 3e 64 62 2c 20  p_init(pDb->db, 
15890 7a 44 65 73 74 44 62 2c 20 70 53 72 63 2c 20 22  zDestDb, pSrc, "
158a0 6d 61 69 6e 22 29 3b 0a 20 20 20 20 69 66 28 20  main");.    if( 
158b0 70 42 61 63 6b 75 70 3d 3d 30 20 29 7b 0a 20 20  pBackup==0 ){.  
158c0 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
158d0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 72 65  sult(interp, "re
158e0 73 74 6f 72 65 20 66 61 69 6c 65 64 3a 20 22 2c  store failed: ",
158f0 0a 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  .           sqli
15900 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e  te3_errmsg(pDb->
15910 64 62 29 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  db), (char*)0);.
15920 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c        sqlite3_cl
15930 6f 73 65 28 70 53 72 63 29 3b 0a 20 20 20 20 20  ose(pSrc);.     
15940 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
15950 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69  R;.    }.    whi
15960 6c 65 28 20 28 72 63 20 3d 20 73 71 6c 69 74 65  le( (rc = sqlite
15970 33 5f 62 61 63 6b 75 70 5f 73 74 65 70 28 70 42  3_backup_step(pB
15980 61 63 6b 75 70 2c 31 30 30 29 29 3d 3d 53 51 4c  ackup,100))==SQL
15990 49 54 45 5f 4f 4b 0a 20 20 20 20 20 20 20 20 20  ITE_OK.         
159a0 20 20 20 20 20 7c 7c 20 72 63 3d 3d 53 51 4c 49       || rc==SQLI
159b0 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20  TE_BUSY ){.     
159c0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
159d0 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20 20 20  BUSY ){.        
159e0 69 66 28 20 6e 54 69 6d 65 6f 75 74 2b 2b 20 3e  if( nTimeout++ >
159f0 3d 20 33 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  = 3 ) break;.   
15a00 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6c 65       sqlite3_sle
15a10 65 70 28 31 30 30 29 3b 0a 20 20 20 20 20 20 7d  ep(100);.      }
15a20 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
15a30 65 33 5f 62 61 63 6b 75 70 5f 66 69 6e 69 73 68  e3_backup_finish
15a40 28 70 42 61 63 6b 75 70 29 3b 0a 20 20 20 20 69  (pBackup);.    i
15a50 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f  f( rc==SQLITE_DO
15a60 4e 45 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  NE ){.      rc =
15a70 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c   TCL_OK;.    }el
15a80 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  se if( rc==SQLIT
15a90 45 5f 42 55 53 59 20 7c 7c 20 72 63 3d 3d 53 51  E_BUSY || rc==SQ
15aa0 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 29 7b 0a 20  LITE_LOCKED ){. 
15ab0 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
15ac0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 72  esult(interp, "r
15ad0 65 73 74 6f 72 65 20 66 61 69 6c 65 64 3a 20 73  estore failed: s
15ae0 6f 75 72 63 65 20 64 61 74 61 62 61 73 65 20 62  ource database b
15af0 75 73 79 22 2c 0a 20 20 20 20 20 20 20 20 20 20  usy",.          
15b00 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
15b10 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 72 63  ar*)0);.      rc
15b20 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20   = TCL_ERROR;.  
15b30 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 54    }else{.      T
15b40 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
15b50 69 6e 74 65 72 70 2c 20 22 72 65 73 74 6f 72 65  interp, "restore
15b60 20 66 61 69 6c 65 64 3a 20 22 2c 0a 20 20 20 20   failed: ",.    
15b70 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65         sqlite3_e
15b80 72 72 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c 20  rrmsg(pDb->db), 
15b90 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20  (char*)0);.     
15ba0 20 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b   rc = TCL_ERROR;
15bb0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
15bc0 65 33 5f 63 6c 6f 73 65 28 70 53 72 63 29 3b 0a  e3_close(pSrc);.
15bd0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
15be0 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64    /*.  **     $d
15bf0 62 20 73 74 61 74 75 73 20 28 73 74 65 70 7c 73  b status (step|s
15c00 6f 72 74 7c 61 75 74 6f 69 6e 64 65 78 29 0a 20  ort|autoindex). 
15c10 20 2a 2a 0a 20 20 2a 2a 20 44 69 73 70 6c 61 79   **.  ** Display
15c20 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54   SQLITE_STMTSTAT
15c30 55 53 5f 46 55 4c 4c 53 43 41 4e 5f 53 54 45 50  US_FULLSCAN_STEP
15c40 20 6f 72 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f   or.  ** SQLITE_
15c50 53 54 4d 54 53 54 41 54 55 53 5f 53 4f 52 54 20  STMTSTATUS_SORT 
15c60 66 6f 72 20 74 68 65 20 6d 6f 73 74 20 72 65 63  for the most rec
15c70 65 6e 74 20 65 76 61 6c 2e 0a 20 20 2a 2f 0a 20  ent eval..  */. 
15c80 20 63 61 73 65 20 44 42 5f 53 54 41 54 55 53 3a   case DB_STATUS:
15c90 20 7b 0a 20 20 20 20 69 6e 74 20 76 3b 0a 20 20   {.    int v;.  
15ca0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f    const char *zO
15cb0 70 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21  p;.    if( objc!
15cc0 3d 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  =3 ){.      Tcl_
15cd0 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
15ce0 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 28  erp, 2, objv, "(
15cf0 73 74 65 70 7c 73 6f 72 74 7c 61 75 74 6f 69 6e  step|sort|autoin
15d00 64 65 78 29 22 29 3b 0a 20 20 20 20 20 20 72 65  dex)");.      re
15d10 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
15d20 20 20 20 20 7d 0a 20 20 20 20 7a 4f 70 20 3d 20      }.    zOp = 
15d30 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
15d40 6a 76 5b 32 5d 29 3b 0a 20 20 20 20 69 66 28 20  jv[2]);.    if( 
15d50 73 74 72 63 6d 70 28 7a 4f 70 2c 20 22 73 74 65  strcmp(zOp, "ste
15d60 70 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  p")==0 ){.      
15d70 76 20 3d 20 70 44 62 2d 3e 6e 53 74 65 70 3b 0a  v = pDb->nStep;.
15d80 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
15d90 72 63 6d 70 28 7a 4f 70 2c 20 22 73 6f 72 74 22  rcmp(zOp, "sort"
15da0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 76 20  )==0 ){.      v 
15db0 3d 20 70 44 62 2d 3e 6e 53 6f 72 74 3b 0a 20 20  = pDb->nSort;.  
15dc0 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
15dd0 6d 70 28 7a 4f 70 2c 20 22 61 75 74 6f 69 6e 64  mp(zOp, "autoind
15de0 65 78 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ex")==0 ){.     
15df0 20 76 20 3d 20 70 44 62 2d 3e 6e 49 6e 64 65 78   v = pDb->nIndex
15e00 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
15e10 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
15e20 75 6c 74 28 69 6e 74 65 72 70 2c 0a 20 20 20 20  ult(interp,.    
15e30 20 20 20 20 20 20 20 20 22 62 61 64 20 61 72 67          "bad arg
15e40 75 6d 65 6e 74 3a 20 73 68 6f 75 6c 64 20 62 65  ument: should be
15e50 20 61 75 74 6f 69 6e 64 65 78 2c 20 73 74 65 70   autoindex, step
15e60 2c 20 6f 72 20 73 6f 72 74 22 2c 0a 20 20 20 20  , or sort",.    
15e70 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 30          (char*)0
15e80 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
15e90 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
15ea0 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  .    Tcl_SetObjR
15eb0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
15ec0 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 76 29 29 3b  l_NewIntObj(v));
15ed0 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
15ee0 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24  .  /*.  **     $
15ef0 64 62 20 74 69 6d 65 6f 75 74 20 4d 49 4c 4c 45  db timeout MILLE
15f00 53 45 43 4f 4e 44 53 0a 20 20 2a 2a 0a 20 20 2a  SECONDS.  **.  *
15f10 2a 20 44 65 6c 61 79 20 66 6f 72 20 74 68 65 20  * Delay for the 
15f20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73  number of millis
15f30 65 63 6f 6e 64 73 20 73 70 65 63 69 66 69 65 64  econds specified
15f40 20 77 68 65 6e 20 61 20 66 69 6c 65 20 69 73 20   when a file is 
15f50 6c 6f 63 6b 65 64 2e 0a 20 20 2a 2f 0a 20 20 63  locked..  */.  c
15f60 61 73 65 20 44 42 5f 54 49 4d 45 4f 55 54 3a 20  ase DB_TIMEOUT: 
15f70 7b 0a 20 20 20 20 69 6e 74 20 6d 73 3b 0a 20 20  {.    int ms;.  
15f80 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b    if( objc!=3 ){
15f90 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  .      Tcl_Wrong
15fa0 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
15fb0 32 2c 20 6f 62 6a 76 2c 20 22 4d 49 4c 4c 49 53  2, objv, "MILLIS
15fc0 45 43 4f 4e 44 53 22 29 3b 0a 20 20 20 20 20 20  ECONDS");.      
15fd0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
15fe0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
15ff0 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
16000 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32  j(interp, objv[2
16010 5d 2c 20 26 6d 73 29 20 29 20 72 65 74 75 72 6e  ], &ms) ) return
16020 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
16030 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 74 69 6d  sqlite3_busy_tim
16040 65 6f 75 74 28 70 44 62 2d 3e 64 62 2c 20 6d 73  eout(pDb->db, ms
16050 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  );.    break;.  
16060 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20  }..  /*.  **    
16070 20 24 64 62 20 74 6f 74 61 6c 5f 63 68 61 6e 67   $db total_chang
16080 65 73 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74  es.  **.  ** Ret
16090 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
160a0 66 20 72 6f 77 73 20 74 68 61 74 20 77 65 72 65  f rows that were
160b0 20 6d 6f 64 69 66 69 65 64 2c 20 69 6e 73 65 72   modified, inser
160c0 74 65 64 2c 20 6f 72 20 64 65 6c 65 74 65 64 0a  ted, or deleted.
160d0 20 20 2a 2a 20 73 69 6e 63 65 20 74 68 65 20 64    ** since the d
160e0 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 77  atabase handle w
160f0 61 73 20 63 72 65 61 74 65 64 2e 0a 20 20 2a 2f  as created..  */
16100 0a 20 20 63 61 73 65 20 44 42 5f 54 4f 54 41 4c  .  case DB_TOTAL
16110 5f 43 48 41 4e 47 45 53 3a 20 7b 0a 20 20 20 20  _CHANGES: {.    
16120 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 73 75 6c 74  Tcl_Obj *pResult
16130 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d  ;.    if( objc!=
16140 32 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57  2 ){.      Tcl_W
16150 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
16160 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 22 29  rp, 2, objv, "")
16170 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
16180 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
16190 20 20 20 20 70 52 65 73 75 6c 74 20 3d 20 54 63      pResult = Tc
161a0 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_GetObjResult(i
161b0 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f  nterp);.    Tcl_
161c0 53 65 74 49 6e 74 4f 62 6a 28 70 52 65 73 75 6c  SetIntObj(pResul
161d0 74 2c 20 73 71 6c 69 74 65 33 5f 74 6f 74 61 6c  t, sqlite3_total
161e0 5f 63 68 61 6e 67 65 73 28 70 44 62 2d 3e 64 62  _changes(pDb->db
161f0 29 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20  ));.    break;. 
16200 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20   }..  /*    $db 
16210 74 72 61 63 65 20 3f 43 41 4c 4c 42 41 43 4b 3f  trace ?CALLBACK?
16220 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 61 6b 65 20  .  **.  ** Make 
16230 61 72 72 61 6e 67 65 6d 65 6e 74 73 20 74 6f 20  arrangements to 
16240 69 6e 76 6f 6b 65 20 74 68 65 20 43 41 4c 4c 42  invoke the CALLB
16250 41 43 4b 20 72 6f 75 74 69 6e 65 20 66 6f 72 20  ACK routine for 
16260 65 61 63 68 20 53 51 4c 20 73 74 61 74 65 6d 65  each SQL stateme
16270 6e 74 0a 20 20 2a 2a 20 74 68 61 74 20 69 73 20  nt.  ** that is 
16280 65 78 65 63 75 74 65 64 2e 20 20 54 68 65 20 74  executed.  The t
16290 65 78 74 20 6f 66 20 74 68 65 20 53 51 4c 20 69  ext of the SQL i
162a0 73 20 61 70 70 65 6e 64 65 64 20 74 6f 20 43 41  s appended to CA
162b0 4c 4c 42 41 43 4b 20 62 65 66 6f 72 65 0a 20 20  LLBACK before.  
162c0 2a 2a 20 69 74 20 69 73 20 65 78 65 63 75 74 65  ** it is execute
162d0 64 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  d..  */.  case D
162e0 42 5f 54 52 41 43 45 3a 20 7b 0a 20 20 20 20 69  B_TRACE: {.    i
162f0 66 28 20 6f 62 6a 63 3e 33 20 29 7b 0a 20 20 20  f( objc>3 ){.   
16300 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
16310 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
16320 62 6a 76 2c 20 22 3f 43 41 4c 4c 42 41 43 4b 3f  bjv, "?CALLBACK?
16330 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
16340 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
16350 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d  }else if( objc==
16360 32 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  2 ){.      if( p
16370 44 62 2d 3e 7a 54 72 61 63 65 20 29 7b 0a 20 20  Db->zTrace ){.  
16380 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
16390 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70  Result(interp, p
163a0 44 62 2d 3e 7a 54 72 61 63 65 2c 20 28 63 68 61  Db->zTrace, (cha
163b0 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  r*)0);.      }. 
163c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
163d0 63 68 61 72 20 2a 7a 54 72 61 63 65 3b 0a 20 20  char *zTrace;.  
163e0 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20      int len;.   
163f0 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 54 72 61     if( pDb->zTra
16400 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63  ce ){.        Tc
16410 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 54 72 61  l_Free(pDb->zTra
16420 63 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ce);.      }.   
16430 20 20 20 7a 54 72 61 63 65 20 3d 20 54 63 6c 5f     zTrace = Tcl_
16440 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
16450 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b  (objv[2], &len);
16460 0a 20 20 20 20 20 20 69 66 28 20 7a 54 72 61 63  .      if( zTrac
16470 65 20 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20 20  e && len>0 ){.  
16480 20 20 20 20 20 20 70 44 62 2d 3e 7a 54 72 61 63        pDb->zTrac
16490 65 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c  e = Tcl_Alloc( l
164a0 65 6e 20 2b 20 31 20 29 3b 0a 20 20 20 20 20 20  en + 1 );.      
164b0 20 20 6d 65 6d 63 70 79 28 70 44 62 2d 3e 7a 54    memcpy(pDb->zT
164c0 72 61 63 65 2c 20 7a 54 72 61 63 65 2c 20 6c 65  race, zTrace, le
164d0 6e 2b 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  n+1);.      }els
164e0 65 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e  e{.        pDb->
164f0 7a 54 72 61 63 65 20 3d 20 30 3b 0a 20 20 20 20  zTrace = 0;.    
16500 20 20 7d 0a 23 69 66 20 21 64 65 66 69 6e 65 64    }.#if !defined
16510 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41  (SQLITE_OMIT_TRA
16520 43 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  CE) && !defined(
16530 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41  SQLITE_OMIT_FLOA
16540 54 49 4e 47 5f 50 4f 49 4e 54 29 20 5c 0a 20 20  TING_POINT) \.  
16550 20 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51    && !defined(SQ
16560 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43  LITE_OMIT_DEPREC
16570 41 54 45 44 29 0a 20 20 20 20 20 20 69 66 28 20  ATED).      if( 
16580 70 44 62 2d 3e 7a 54 72 61 63 65 20 29 7b 0a 20  pDb->zTrace ){. 
16590 20 20 20 20 20 20 20 70 44 62 2d 3e 69 6e 74 65         pDb->inte
165a0 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20  rp = interp;.   
165b0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 74 72 61       sqlite3_tra
165c0 63 65 28 70 44 62 2d 3e 64 62 2c 20 44 62 54 72  ce(pDb->db, DbTr
165d0 61 63 65 48 61 6e 64 6c 65 72 2c 20 70 44 62 29  aceHandler, pDb)
165e0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
165f0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 74         sqlite3_t
16600 72 61 63 65 28 70 44 62 2d 3e 64 62 2c 20 30 2c  race(pDb->db, 0,
16610 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e   0);.      }.#en
16620 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 62 72  dif.    }.    br
16630 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20  eak;.  }..  /*  
16640 20 20 24 64 62 20 74 72 61 63 65 5f 76 32 20 3f    $db trace_v2 ?
16650 43 41 4c 4c 42 41 43 4b 3f 20 3f 4d 41 53 4b 3f  CALLBACK? ?MASK?
16660 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 61 6b 65 20  .  **.  ** Make 
16670 61 72 72 61 6e 67 65 6d 65 6e 74 73 20 74 6f 20  arrangements to 
16680 69 6e 76 6f 6b 65 20 74 68 65 20 43 41 4c 4c 42  invoke the CALLB
16690 41 43 4b 20 72 6f 75 74 69 6e 65 20 66 6f 72 20  ACK routine for 
166a0 65 61 63 68 20 74 72 61 63 65 20 65 76 65 6e 74  each trace event
166b0 0a 20 20 2a 2a 20 6d 61 74 63 68 69 6e 67 20 74  .  ** matching t
166c0 68 65 20 6d 61 73 6b 20 74 68 61 74 20 69 73 20  he mask that is 
166d0 67 65 6e 65 72 61 74 65 64 2e 20 20 54 68 65 20  generated.  The 
166e0 70 61 72 61 6d 65 74 65 72 73 20 61 72 65 20 61  parameters are a
166f0 70 70 65 6e 64 65 64 20 74 6f 0a 20 20 2a 2a 20  ppended to.  ** 
16700 43 41 4c 4c 42 41 43 4b 20 62 65 66 6f 72 65 20  CALLBACK before 
16710 69 74 20 69 73 20 65 78 65 63 75 74 65 64 2e 0a  it is executed..
16720 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 54    */.  case DB_T
16730 52 41 43 45 5f 56 32 3a 20 7b 0a 20 20 20 20 69  RACE_V2: {.    i
16740 66 28 20 6f 62 6a 63 3e 34 20 29 7b 0a 20 20 20  f( objc>4 ){.   
16750 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
16760 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
16770 62 6a 76 2c 20 22 3f 43 41 4c 4c 42 41 43 4b 3f  bjv, "?CALLBACK?
16780 20 3f 4d 41 53 4b 3f 22 29 3b 0a 20 20 20 20 20   ?MASK?");.     
16790 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
167a0 52 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  R;.    }else if(
167b0 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20   objc==2 ){.    
167c0 20 20 69 66 28 20 70 44 62 2d 3e 7a 54 72 61 63    if( pDb->zTrac
167d0 65 56 32 20 29 7b 0a 20 20 20 20 20 20 20 20 54  eV2 ){.        T
167e0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
167f0 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a 54 72  interp, pDb->zTr
16800 61 63 65 56 32 2c 20 28 63 68 61 72 2a 29 30 29  aceV2, (char*)0)
16810 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
16820 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20  lse{.      char 
16830 2a 7a 54 72 61 63 65 56 32 3b 0a 20 20 20 20 20  *zTraceV2;.     
16840 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20   int len;.      
16850 54 63 6c 5f 57 69 64 65 49 6e 74 20 77 4d 61 73  Tcl_WideInt wMas
16860 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28  k = 0;.      if(
16870 20 6f 62 6a 63 3d 3d 34 20 29 7b 0a 20 20 20 20   objc==4 ){.    
16880 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
16890 20 63 68 61 72 20 2a 54 54 59 50 45 5f 73 74 72   char *TTYPE_str
168a0 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20  s[] = {.        
168b0 20 20 22 73 74 61 74 65 6d 65 6e 74 22 2c 20 22    "statement", "
168c0 70 72 6f 66 69 6c 65 22 2c 20 22 72 6f 77 22 2c  profile", "row",
168d0 20 22 63 6c 6f 73 65 22 2c 20 30 0a 20 20 20 20   "close", 0.    
168e0 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 20 20 65      };.        e
168f0 6e 75 6d 20 54 54 59 50 45 5f 65 6e 75 6d 20 7b  num TTYPE_enum {
16900 0a 20 20 20 20 20 20 20 20 20 20 54 54 59 50 45  .          TTYPE
16910 5f 53 54 4d 54 2c 20 54 54 59 50 45 5f 50 52 4f  _STMT, TTYPE_PRO
16920 46 49 4c 45 2c 20 54 54 59 50 45 5f 52 4f 57 2c  FILE, TTYPE_ROW,
16930 20 54 54 59 50 45 5f 43 4c 4f 53 45 0a 20 20 20   TTYPE_CLOSE.   
16940 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 20 20       };.        
16950 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20 69  int i;.        i
16960 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 4c  f( TCL_OK!=Tcl_L
16970 69 73 74 4f 62 6a 4c 65 6e 67 74 68 28 69 6e 74  istObjLength(int
16980 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 6c  erp, objv[3], &l
16990 65 6e 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  en) ){.         
169a0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
169b0 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  R;.        }.   
169c0 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
169d0 6c 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  len; i++){.     
169e0 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 4f       Tcl_Obj *pO
169f0 62 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  bj;.          in
16a00 74 20 74 74 79 70 65 3b 0a 20 20 20 20 20 20 20  t ttype;.       
16a10 20 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d 54     if( TCL_OK!=T
16a20 63 6c 5f 4c 69 73 74 4f 62 6a 49 6e 64 65 78 28  cl_ListObjIndex(
16a30 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c  interp, objv[3],
16a40 20 69 2c 20 26 70 4f 62 6a 29 20 29 7b 0a 20 20   i, &pObj) ){.  
16a50 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
16a60 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
16a70 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
16a80 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 64    if( Tcl_GetInd
16a90 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  exFromObj(interp
16aa0 2c 20 70 4f 62 6a 2c 20 54 54 59 50 45 5f 73 74  , pObj, TTYPE_st
16ab0 72 73 2c 20 22 74 72 61 63 65 20 74 79 70 65 22  rs, "trace type"
16ac0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
16ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16ae0 20 20 20 20 30 2c 20 26 74 74 79 70 65 29 21 3d      0, &ttype)!=
16af0 54 43 4c 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  TCL_OK ){.      
16b00 20 20 20 20 20 20 54 63 6c 5f 57 69 64 65 49 6e        Tcl_WideIn
16b10 74 20 77 54 79 70 65 3b 0a 20 20 20 20 20 20 20  t wType;.       
16b20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 45       Tcl_Obj *pE
16b30 72 72 6f 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69  rror = Tcl_Dupli
16b40 63 61 74 65 4f 62 6a 28 54 63 6c 5f 47 65 74 4f  cateObj(Tcl_GetO
16b50 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29  bjResult(interp)
16b60 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 54  );.            T
16b70 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
16b80 70 45 72 72 6f 72 29 3b 0a 20 20 20 20 20 20 20  pError);.       
16b90 20 20 20 20 20 69 66 28 20 54 43 4c 5f 4f 4b 3d       if( TCL_OK=
16ba0 3d 54 63 6c 5f 47 65 74 57 69 64 65 49 6e 74 46  =Tcl_GetWideIntF
16bb0 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 70  romObj(interp, p
16bc0 4f 62 6a 2c 20 26 77 54 79 70 65 29 20 29 7b 0a  Obj, &wType) ){.
16bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54 63                Tc
16be0 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70  l_DecrRefCount(p
16bf0 45 72 72 6f 72 29 3b 0a 20 20 20 20 20 20 20 20  Error);.        
16c00 20 20 20 20 20 20 77 4d 61 73 6b 20 7c 3d 20 77        wMask |= w
16c10 54 79 70 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Type;.          
16c20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
16c30 20 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62         Tcl_SetOb
16c40 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
16c50 70 45 72 72 6f 72 29 3b 0a 20 20 20 20 20 20 20  pError);.       
16c60 20 20 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52         Tcl_DecrR
16c70 65 66 43 6f 75 6e 74 28 70 45 72 72 6f 72 29 3b  efCount(pError);
16c80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72  .              r
16c90 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
16ca0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
16cb0 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
16cc0 20 20 20 20 20 20 20 20 20 20 20 20 73 77 69 74              swit
16cd0 63 68 28 20 28 65 6e 75 6d 20 54 54 59 50 45 5f  ch( (enum TTYPE_
16ce0 65 6e 75 6d 29 74 74 79 70 65 20 29 7b 0a 20 20  enum)ttype ){.  
16cf0 20 20 20 20 20 20 20 20 20 20 20 20 63 61 73 65              case
16d00 20 54 54 59 50 45 5f 53 54 4d 54 3a 20 20 20 20   TTYPE_STMT:    
16d10 77 4d 61 73 6b 20 7c 3d 20 53 51 4c 49 54 45 5f  wMask |= SQLITE_
16d20 54 52 41 43 45 5f 53 54 4d 54 3b 20 20 20 20 62  TRACE_STMT;    b
16d30 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
16d40 20 20 20 20 63 61 73 65 20 54 54 59 50 45 5f 50      case TTYPE_P
16d50 52 4f 46 49 4c 45 3a 20 77 4d 61 73 6b 20 7c 3d  ROFILE: wMask |=
16d60 20 53 51 4c 49 54 45 5f 54 52 41 43 45 5f 50 52   SQLITE_TRACE_PR
16d70 4f 46 49 4c 45 3b 20 62 72 65 61 6b 3b 0a 20 20  OFILE; break;.  
16d80 20 20 20 20 20 20 20 20 20 20 20 20 63 61 73 65              case
16d90 20 54 54 59 50 45 5f 52 4f 57 3a 20 20 20 20 20   TTYPE_ROW:     
16da0 77 4d 61 73 6b 20 7c 3d 20 53 51 4c 49 54 45 5f  wMask |= SQLITE_
16db0 54 52 41 43 45 5f 52 4f 57 3b 20 20 20 20 20 62  TRACE_ROW;     b
16dc0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
16dd0 20 20 20 20 63 61 73 65 20 54 54 59 50 45 5f 43      case TTYPE_C
16de0 4c 4f 53 45 3a 20 20 20 77 4d 61 73 6b 20 7c 3d  LOSE:   wMask |=
16df0 20 53 51 4c 49 54 45 5f 54 52 41 43 45 5f 43 4c   SQLITE_TRACE_CL
16e00 4f 53 45 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20  OSE;   break;.  
16e10 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
16e20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
16e30 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
16e40 20 20 20 20 20 20 20 77 4d 61 73 6b 20 3d 20 53         wMask = S
16e50 51 4c 49 54 45 5f 54 52 41 43 45 5f 53 54 4d 54  QLITE_TRACE_STMT
16e60 3b 20 2f 2a 20 75 73 65 20 74 68 65 20 22 6c 65  ; /* use the "le
16e70 67 61 63 79 22 20 64 65 66 61 75 6c 74 20 2a 2f  gacy" default */
16e80 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
16e90 66 28 20 70 44 62 2d 3e 7a 54 72 61 63 65 56 32  f( pDb->zTraceV2
16ea0 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f   ){.        Tcl_
16eb0 46 72 65 65 28 70 44 62 2d 3e 7a 54 72 61 63 65  Free(pDb->zTrace
16ec0 56 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  V2);.      }.   
16ed0 20 20 20 7a 54 72 61 63 65 56 32 20 3d 20 54 63     zTraceV2 = Tc
16ee0 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
16ef0 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e  bj(objv[2], &len
16f00 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 54 72  );.      if( zTr
16f10 61 63 65 56 32 20 26 26 20 6c 65 6e 3e 30 20 29  aceV2 && len>0 )
16f20 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a  {.        pDb->z
16f30 54 72 61 63 65 56 32 20 3d 20 54 63 6c 5f 41 6c  TraceV2 = Tcl_Al
16f40 6c 6f 63 28 20 6c 65 6e 20 2b 20 31 20 29 3b 0a  loc( len + 1 );.
16f50 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70          memcpy(p
16f60 44 62 2d 3e 7a 54 72 61 63 65 56 32 2c 20 7a 54  Db->zTraceV2, zT
16f70 72 61 63 65 56 32 2c 20 6c 65 6e 2b 31 29 3b 0a  raceV2, len+1);.
16f80 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
16f90 20 20 20 20 20 70 44 62 2d 3e 7a 54 72 61 63 65       pDb->zTrace
16fa0 56 32 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  V2 = 0;.      }.
16fb0 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
16fc0 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 29 20  ITE_OMIT_TRACE) 
16fd0 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
16fe0 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47  TE_OMIT_FLOATING
16ff0 5f 50 4f 49 4e 54 29 0a 20 20 20 20 20 20 69 66  _POINT).      if
17000 28 20 70 44 62 2d 3e 7a 54 72 61 63 65 56 32 20  ( pDb->zTraceV2 
17010 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e  ){.        pDb->
17020 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b  interp = interp;
17030 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
17040 5f 74 72 61 63 65 5f 76 32 28 70 44 62 2d 3e 64  _trace_v2(pDb->d
17050 62 2c 20 28 75 6e 73 69 67 6e 65 64 29 77 4d 61  b, (unsigned)wMa
17060 73 6b 2c 20 44 62 54 72 61 63 65 56 32 48 61 6e  sk, DbTraceV2Han
17070 64 6c 65 72 2c 20 70 44 62 29 3b 0a 20 20 20 20  dler, pDb);.    
17080 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
17090 20 73 71 6c 69 74 65 33 5f 74 72 61 63 65 5f 76   sqlite3_trace_v
170a0 32 28 70 44 62 2d 3e 64 62 2c 20 30 2c 20 30 2c  2(pDb->db, 0, 0,
170b0 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e   0);.      }.#en
170c0 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 62 72  dif.    }.    br
170d0 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20  eak;.  }..  /*  
170e0 20 20 24 64 62 20 74 72 61 6e 73 61 63 74 69 6f    $db transactio
170f0 6e 20 5b 2d 64 65 66 65 72 72 65 64 7c 2d 69 6d  n [-deferred|-im
17100 6d 65 64 69 61 74 65 7c 2d 65 78 63 6c 75 73 69  mediate|-exclusi
17110 76 65 5d 20 53 43 52 49 50 54 0a 20 20 2a 2a 0a  ve] SCRIPT.  **.
17120 20 20 2a 2a 20 53 74 61 72 74 20 61 20 6e 65 77    ** Start a new
17130 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 28 69 66   transaction (if
17140 20 77 65 20 61 72 65 20 6e 6f 74 20 61 6c 72 65   we are not alre
17150 61 64 79 20 69 6e 20 74 68 65 20 6d 69 64 73 74  ady in the midst
17160 20 6f 66 20 61 0a 20 20 2a 2a 20 74 72 61 6e 73   of a.  ** trans
17170 61 63 74 69 6f 6e 29 20 61 6e 64 20 65 78 65 63  action) and exec
17180 75 74 65 20 74 68 65 20 54 43 4c 20 73 63 72 69  ute the TCL scri
17190 70 74 20 53 43 52 49 50 54 2e 20 20 41 66 74 65  pt SCRIPT.  Afte
171a0 72 20 53 43 52 49 50 54 0a 20 20 2a 2a 20 63 6f  r SCRIPT.  ** co
171b0 6d 70 6c 65 74 65 73 2c 20 65 69 74 68 65 72 20  mpletes, either 
171c0 63 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73  commit the trans
171d0 61 63 74 69 6f 6e 20 6f 72 20 72 6f 6c 6c 20 69  action or roll i
171e0 74 20 62 61 63 6b 20 69 66 20 53 43 52 49 50 54  t back if SCRIPT
171f0 0a 20 20 2a 2a 20 74 68 72 6f 77 73 20 61 6e 20  .  ** throws an 
17200 65 78 63 65 70 74 69 6f 6e 2e 20 20 4f 72 20 69  exception.  Or i
17210 66 20 6e 6f 20 6e 65 77 20 74 72 61 6e 73 61 74  f no new transat
17220 69 6f 6e 20 77 61 73 20 73 74 61 72 74 65 64 2c  ion was started,
17230 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 0a 20 20 2a   do nothing..  *
17240 2a 20 70 61 73 73 20 74 68 65 20 65 78 63 65 70  * pass the excep
17250 74 69 6f 6e 20 6f 6e 20 75 70 20 74 68 65 20 73  tion on up the s
17260 74 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  tack..  **.  ** 
17270 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20 77 61 73  This command was
17280 20 69 6e 73 70 69 72 65 64 20 62 79 20 44 61 76   inspired by Dav
17290 65 20 54 68 6f 6d 61 73 27 73 20 74 61 6c 6b 20  e Thomas's talk 
172a0 6f 6e 20 52 75 62 79 20 61 74 20 74 68 65 0a 20  on Ruby at the. 
172b0 20 2a 2a 20 32 30 30 35 20 4f 27 52 65 69 6c 6c   ** 2005 O'Reill
172c0 79 20 4f 70 65 6e 20 53 6f 75 72 63 65 20 43 6f  y Open Source Co
172d0 6e 76 65 6e 74 69 6f 6e 20 28 4f 53 43 4f 4e 29  nvention (OSCON)
172e0 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  ..  */.  case DB
172f0 5f 54 52 41 4e 53 41 43 54 49 4f 4e 3a 20 7b 0a  _TRANSACTION: {.
17300 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 53 63      Tcl_Obj *pSc
17310 72 69 70 74 3b 0a 20 20 20 20 63 6f 6e 73 74 20  ript;.    const 
17320 63 68 61 72 20 2a 7a 42 65 67 69 6e 20 3d 20 22  char *zBegin = "
17330 53 41 56 45 50 4f 49 4e 54 20 5f 74 63 6c 5f 74  SAVEPOINT _tcl_t
17340 72 61 6e 73 61 63 74 69 6f 6e 22 3b 0a 20 20 20  ransaction";.   
17350 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 26 26 20   if( objc!=3 && 
17360 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 20  objc!=4 ){.     
17370 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
17380 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a  s(interp, 2, obj
17390 76 2c 20 22 5b 54 59 50 45 5d 20 53 43 52 49 50  v, "[TYPE] SCRIP
173a0 54 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  T");.      retur
173b0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
173c0 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 44 62 2d   }..    if( pDb-
173d0 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 30  >nTransaction==0
173e0 20 26 26 20 6f 62 6a 63 3d 3d 34 20 29 7b 0a 20   && objc==4 ){. 
173f0 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73       static cons
17400 74 20 63 68 61 72 20 2a 54 54 59 50 45 5f 73 74  t char *TTYPE_st
17410 72 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20  rs[] = {.       
17420 20 22 64 65 66 65 72 72 65 64 22 2c 20 20 20 22   "deferred",   "
17430 65 78 63 6c 75 73 69 76 65 22 2c 20 20 22 69 6d  exclusive",  "im
17440 6d 65 64 69 61 74 65 22 2c 20 30 0a 20 20 20 20  mediate", 0.    
17450 20 20 7d 3b 0a 20 20 20 20 20 20 65 6e 75 6d 20    };.      enum 
17460 54 54 59 50 45 5f 65 6e 75 6d 20 7b 0a 20 20 20  TTYPE_enum {.   
17470 20 20 20 20 20 54 54 59 50 45 5f 44 45 46 45 52       TTYPE_DEFER
17480 52 45 44 2c 20 54 54 59 50 45 5f 45 58 43 4c 55  RED, TTYPE_EXCLU
17490 53 49 56 45 2c 20 54 54 59 50 45 5f 49 4d 4d 45  SIVE, TTYPE_IMME
174a0 44 49 41 54 45 0a 20 20 20 20 20 20 7d 3b 0a 20  DIATE.      };. 
174b0 20 20 20 20 20 69 6e 74 20 74 74 79 70 65 3b 0a       int ttype;.
174c0 20 20 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65        if( Tcl_Ge
174d0 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e  tIndexFromObj(in
174e0 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 54  terp, objv[2], T
174f0 54 59 50 45 5f 73 74 72 73 2c 20 22 74 72 61 6e  TYPE_strs, "tran
17500 73 61 63 74 69 6f 6e 20 74 79 70 65 22 2c 0a 20  saction type",. 
17510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17520 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20               0, 
17530 26 74 74 79 70 65 29 20 29 7b 0a 20 20 20 20 20  &ttype) ){.     
17540 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
17550 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ROR;.      }.   
17560 20 20 20 73 77 69 74 63 68 28 20 28 65 6e 75 6d     switch( (enum
17570 20 54 54 59 50 45 5f 65 6e 75 6d 29 74 74 79 70   TTYPE_enum)ttyp
17580 65 20 29 7b 0a 20 20 20 20 20 20 20 20 63 61 73  e ){.        cas
17590 65 20 54 54 59 50 45 5f 44 45 46 45 52 52 45 44  e TTYPE_DEFERRED
175a0 3a 20 20 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f  :    /* no-op */
175b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
175c0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
175d0 20 63 61 73 65 20 54 54 59 50 45 5f 45 58 43 4c   case TTYPE_EXCL
175e0 55 53 49 56 45 3a 20 20 20 7a 42 65 67 69 6e 20  USIVE:   zBegin 
175f0 3d 20 22 42 45 47 49 4e 20 45 58 43 4c 55 53 49  = "BEGIN EXCLUSI
17600 56 45 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20  VE";  break;.   
17610 20 20 20 20 20 63 61 73 65 20 54 54 59 50 45 5f       case TTYPE_
17620 49 4d 4d 45 44 49 41 54 45 3a 20 20 20 7a 42 65  IMMEDIATE:   zBe
17630 67 69 6e 20 3d 20 22 42 45 47 49 4e 20 49 4d 4d  gin = "BEGIN IMM
17640 45 44 49 41 54 45 22 3b 20 20 62 72 65 61 6b 3b  EDIATE";  break;
17650 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
17660 20 20 20 70 53 63 72 69 70 74 20 3d 20 6f 62 6a     pScript = obj
17670 76 5b 6f 62 6a 63 2d 31 5d 3b 0a 0a 20 20 20 20  v[objc-1];..    
17680 2f 2a 20 52 75 6e 20 74 68 65 20 53 51 4c 69 74  /* Run the SQLit
17690 65 20 42 45 47 49 4e 20 63 6f 6d 6d 61 6e 64 20  e BEGIN command 
176a0 74 6f 20 6f 70 65 6e 20 61 20 74 72 61 6e 73 61  to open a transa
176b0 63 74 69 6f 6e 20 6f 72 20 73 61 76 65 70 6f 69  ction or savepoi
176c0 6e 74 2e 20 2a 2f 0a 20 20 20 20 70 44 62 2d 3e  nt. */.    pDb->
176d0 64 69 73 61 62 6c 65 41 75 74 68 2b 2b 3b 0a 20  disableAuth++;. 
176e0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
176f0 65 78 65 63 28 70 44 62 2d 3e 64 62 2c 20 7a 42  exec(pDb->db, zB
17700 65 67 69 6e 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  egin, 0, 0, 0);.
17710 20 20 20 20 70 44 62 2d 3e 64 69 73 61 62 6c 65      pDb->disable
17720 41 75 74 68 2d 2d 3b 0a 20 20 20 20 69 66 28 20  Auth--;.    if( 
17730 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
17740 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  .      Tcl_Appen
17750 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
17760 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70  sqlite3_errmsg(p
17770 44 62 2d 3e 64 62 29 2c 20 28 63 68 61 72 2a 29  Db->db), (char*)
17780 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  0);.      return
17790 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
177a0 7d 0a 20 20 20 20 70 44 62 2d 3e 6e 54 72 61 6e  }.    pDb->nTran
177b0 73 61 63 74 69 6f 6e 2b 2b 3b 0a 0a 20 20 20 20  saction++;..    
177c0 2f 2a 20 49 66 20 75 73 69 6e 67 20 4e 52 45 2c  /* If using NRE,
177d0 20 73 63 68 65 64 75 6c 65 20 61 20 63 61 6c 6c   schedule a call
177e0 62 61 63 6b 20 74 6f 20 69 6e 76 6f 6b 65 20 74  back to invoke t
177f0 68 65 20 73 63 72 69 70 74 20 70 53 63 72 69 70  he script pScrip
17800 74 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 61  t, then.    ** a
17810 20 73 65 63 6f 6e 64 20 63 61 6c 6c 62 61 63 6b   second callback
17820 20 74 6f 20 63 6f 6d 6d 69 74 20 28 6f 72 20 72   to commit (or r
17830 6f 6c 6c 62 61 63 6b 29 20 74 68 65 20 74 72 61  ollback) the tra
17840 6e 73 61 63 74 69 6f 6e 20 6f 72 20 73 61 76 65  nsaction or save
17850 70 6f 69 6e 74 0a 20 20 20 20 2a 2a 20 6f 70 65  point.    ** ope
17860 6e 65 64 20 61 62 6f 76 65 2e 20 49 66 20 6e 6f  ned above. If no
17870 74 20 75 73 69 6e 67 20 4e 52 45 2c 20 65 76 61  t using NRE, eva
17880 6c 75 61 74 65 20 74 68 65 20 73 63 72 69 70 74  luate the script
17890 20 64 69 72 65 63 74 6c 79 2c 20 74 68 65 6e 0a   directly, then.
178a0 20 20 20 20 2a 2a 20 63 61 6c 6c 20 66 75 6e 63      ** call func
178b0 74 69 6f 6e 20 44 62 54 72 61 6e 73 50 6f 73 74  tion DbTransPost
178c0 43 6d 64 28 29 20 74 6f 20 63 6f 6d 6d 69 74 20  Cmd() to commit 
178d0 28 6f 72 20 72 6f 6c 6c 62 61 63 6b 29 20 74 68  (or rollback) th
178e0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20  e transaction.  
178f0 20 20 2a 2a 20 6f 72 20 73 61 76 65 70 6f 69 6e    ** or savepoin
17900 74 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 44  t.  */.    if( D
17910 62 55 73 65 4e 72 65 28 29 20 29 7b 0a 20 20 20  bUseNre() ){.   
17920 20 20 20 54 63 6c 5f 4e 52 41 64 64 43 61 6c 6c     Tcl_NRAddCall
17930 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 44 62 54  back(interp, DbT
17940 72 61 6e 73 50 6f 73 74 43 6d 64 2c 20 63 64 2c  ransPostCmd, cd,
17950 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20   0, 0, 0);.     
17960 20 28 76 6f 69 64 29 54 63 6c 5f 4e 52 45 76 61   (void)Tcl_NREva
17970 6c 4f 62 6a 28 69 6e 74 65 72 70 2c 20 70 53 63  lObj(interp, pSc
17980 72 69 70 74 2c 20 30 29 3b 0a 20 20 20 20 7d 65  ript, 0);.    }e
17990 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
179a0 44 62 54 72 61 6e 73 50 6f 73 74 43 6d 64 28 26  DbTransPostCmd(&
179b0 63 64 2c 20 69 6e 74 65 72 70 2c 20 54 63 6c 5f  cd, interp, Tcl_
179c0 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70  EvalObjEx(interp
179d0 2c 20 70 53 63 72 69 70 74 2c 20 30 29 29 3b 0a  , pScript, 0));.
179e0 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b      }.    break;
179f0 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
17a00 20 20 20 24 64 62 20 75 6e 6c 6f 63 6b 5f 6e 6f     $db unlock_no
17a10 74 69 66 79 20 3f 73 63 72 69 70 74 3f 0a 20 20  tify ?script?.  
17a20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 55 4e 4c  */.  case DB_UNL
17a30 4f 43 4b 5f 4e 4f 54 49 46 59 3a 20 7b 0a 23 69  OCK_NOTIFY: {.#i
17a40 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  fndef SQLITE_ENA
17a50 42 4c 45 5f 55 4e 4c 4f 43 4b 5f 4e 4f 54 49 46  BLE_UNLOCK_NOTIF
17a60 59 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  Y.    Tcl_Append
17a70 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
17a80 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79 20 6e 6f  unlock_notify no
17a90 74 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 74  t available in t
17aa0 68 69 73 20 62 75 69 6c 64 22 2c 0a 20 20 20 20  his build",.    
17ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17ac0 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20   (char*)0);.    
17ad0 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  rc = TCL_ERROR;.
17ae0 23 65 6c 73 65 0a 20 20 20 20 69 66 28 20 6f 62  #else.    if( ob
17af0 6a 63 21 3d 32 20 26 26 20 6f 62 6a 63 21 3d 33  jc!=2 && objc!=3
17b00 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72   ){.      Tcl_Wr
17b10 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
17b20 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 53 43  p, 2, objv, "?SC
17b30 52 49 50 54 3f 22 29 3b 0a 20 20 20 20 20 20 72  RIPT?");.      r
17b40 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  c = TCL_ERROR;. 
17b50 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
17b60 76 6f 69 64 20 28 2a 78 4e 6f 74 69 66 79 29 28  void (*xNotify)(
17b70 76 6f 69 64 20 2a 2a 2c 20 69 6e 74 29 20 3d 20  void **, int) = 
17b80 30 3b 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70  0;.      void *p
17b90 4e 6f 74 69 66 79 41 72 67 20 3d 20 30 3b 0a 0a  NotifyArg = 0;..
17ba0 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70        if( pDb->p
17bb0 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 20 29 7b 0a  UnlockNotify ){.
17bc0 20 20 20 20 20 20 20 20 54 63 6c 5f 44 65 63 72          Tcl_Decr
17bd0 52 65 66 43 6f 75 6e 74 28 70 44 62 2d 3e 70 55  RefCount(pDb->pU
17be0 6e 6c 6f 63 6b 4e 6f 74 69 66 79 29 3b 0a 20 20  nlockNotify);.  
17bf0 20 20 20 20 20 20 70 44 62 2d 3e 70 55 6e 6c 6f        pDb->pUnlo
17c00 63 6b 4e 6f 74 69 66 79 20 3d 20 30 3b 0a 20 20  ckNotify = 0;.  
17c10 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28      }..      if(
17c20 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20 20 20 20   objc==3 ){.    
17c30 20 20 20 20 78 4e 6f 74 69 66 79 20 3d 20 44 62      xNotify = Db
17c40 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 3b 0a 20 20  UnlockNotify;.  
17c50 20 20 20 20 20 20 70 4e 6f 74 69 66 79 41 72 67        pNotifyArg
17c60 20 3d 20 28 76 6f 69 64 20 2a 29 70 44 62 3b 0a   = (void *)pDb;.
17c70 20 20 20 20 20 20 20 20 70 44 62 2d 3e 70 55 6e          pDb->pUn
17c80 6c 6f 63 6b 4e 6f 74 69 66 79 20 3d 20 6f 62 6a  lockNotify = obj
17c90 76 5b 32 5d 3b 0a 20 20 20 20 20 20 20 20 54 63  v[2];.        Tc
17ca0 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70  l_IncrRefCount(p
17cb0 44 62 2d 3e 70 55 6e 6c 6f 63 6b 4e 6f 74 69 66  Db->pUnlockNotif
17cc0 79 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  y);.      }..   
17cd0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 75     if( sqlite3_u
17ce0 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79 28 70 44 62  nlock_notify(pDb
17cf0 2d 3e 64 62 2c 20 78 4e 6f 74 69 66 79 2c 20 70  ->db, xNotify, p
17d00 4e 6f 74 69 66 79 41 72 67 29 20 29 7b 0a 20 20  NotifyArg) ){.  
17d10 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
17d20 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 73  Result(interp, s
17d30 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44  qlite3_errmsg(pD
17d40 62 2d 3e 64 62 29 2c 20 28 63 68 61 72 2a 29 30  b->db), (char*)0
17d50 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
17d60 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  TCL_ERROR;.     
17d70 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a   }.    }.#endif.
17d80 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
17d90 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 24 64 62    /*.  **    $db
17da0 20 70 72 65 75 70 64 61 74 65 5f 68 6f 6f 6b 20   preupdate_hook 
17db0 63 6f 75 6e 74 0a 20 20 2a 2a 20 20 20 20 24 64  count.  **    $d
17dc0 62 20 70 72 65 75 70 64 61 74 65 5f 68 6f 6f 6b  b preupdate_hook
17dd0 20 68 6f 6f 6b 20 3f 53 43 52 49 50 54 3f 0a 20   hook ?SCRIPT?. 
17de0 20 2a 2a 20 20 20 20 24 64 62 20 70 72 65 75 70   **    $db preup
17df0 64 61 74 65 5f 68 6f 6f 6b 20 6e 65 77 20 49 4e  date_hook new IN
17e00 44 45 58 0a 20 20 2a 2a 20 20 20 20 24 64 62 20  DEX.  **    $db 
17e10 70 72 65 75 70 64 61 74 65 5f 68 6f 6f 6b 20 6f  preupdate_hook o
17e20 6c 64 20 49 4e 44 45 58 0a 20 20 2a 2f 0a 20 20  ld INDEX.  */.  
17e30 63 61 73 65 20 44 42 5f 50 52 45 55 50 44 41 54  case DB_PREUPDAT
17e40 45 3a 20 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  E: {.#ifndef SQL
17e50 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52 45 55 50  ITE_ENABLE_PREUP
17e60 44 41 54 45 5f 48 4f 4f 4b 0a 20 20 20 20 54 63  DATE_HOOK.    Tc
17e70 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
17e80 6e 74 65 72 70 2c 20 22 70 72 65 75 70 64 61 74  nterp, "preupdat
17e90 65 5f 68 6f 6f 6b 20 77 61 73 20 6f 6d 69 74 74  e_hook was omitt
17ea0 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69  ed at compile-ti
17eb0 6d 65 22 29 3b 0a 20 20 20 20 72 63 20 3d 20 54  me");.    rc = T
17ec0 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a  CL_ERROR;.#else.
17ed0 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
17ee0 20 63 68 61 72 20 2a 61 7a 53 75 62 5b 5d 20 3d   char *azSub[] =
17ef0 20 7b 22 63 6f 75 6e 74 22 2c 20 22 64 65 70 74   {"count", "dept
17f00 68 22 2c 20 22 68 6f 6f 6b 22 2c 20 22 6e 65 77  h", "hook", "new
17f10 22 2c 20 22 6f 6c 64 22 2c 20 30 7d 3b 0a 20 20  ", "old", 0};.  
17f20 20 20 65 6e 75 6d 20 44 62 50 72 65 75 70 64 61    enum DbPreupda
17f30 74 65 53 75 62 43 6d 64 20 7b 0a 20 20 20 20 20  teSubCmd {.     
17f40 20 50 52 45 5f 43 4f 55 4e 54 2c 20 50 52 45 5f   PRE_COUNT, PRE_
17f50 44 45 50 54 48 2c 20 50 52 45 5f 48 4f 4f 4b 2c  DEPTH, PRE_HOOK,
17f60 20 50 52 45 5f 4e 45 57 2c 20 50 52 45 5f 4f 4c   PRE_NEW, PRE_OL
17f70 44 0a 20 20 20 20 7d 3b 0a 20 20 20 20 69 6e 74  D.    };.    int
17f80 20 69 53 75 62 3b 0a 0a 20 20 20 20 69 66 28 20   iSub;..    if( 
17f90 6f 62 6a 63 3c 33 20 29 7b 0a 20 20 20 20 20 20  objc<3 ){.      
17fa0 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
17fb0 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76  (interp, 2, objv
17fc0 2c 20 22 53 55 42 2d 43 4f 4d 4d 41 4e 44 20 3f  , "SUB-COMMAND ?
17fd0 41 52 47 53 3f 22 29 3b 0a 20 20 20 20 7d 0a 20  ARGS?");.    }. 
17fe0 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e     if( Tcl_GetIn
17ff0 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  dexFromObj(inter
18000 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 61 7a 53 75  p, objv[2], azSu
18010 62 2c 20 22 73 75 62 2d 63 6f 6d 6d 61 6e 64 22  b, "sub-command"
18020 2c 20 30 2c 20 26 69 53 75 62 29 20 29 7b 0a 20  , 0, &iSub) ){. 
18030 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
18040 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20  ERROR;.    }..  
18050 20 20 73 77 69 74 63 68 28 20 28 65 6e 75 6d 20    switch( (enum 
18060 44 62 50 72 65 75 70 64 61 74 65 53 75 62 43 6d  DbPreupdateSubCm
18070 64 29 69 53 75 62 20 29 7b 0a 20 20 20 20 20 20  d)iSub ){.      
18080 63 61 73 65 20 50 52 45 5f 43 4f 55 4e 54 3a 20  case PRE_COUNT: 
18090 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43  {.        int nC
180a0 6f 6c 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  ol = sqlite3_pre
180b0 75 70 64 61 74 65 5f 63 6f 75 6e 74 28 70 44 62  update_count(pDb
180c0 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20 20 20 54  ->db);.        T
180d0 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
180e0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49  interp, Tcl_NewI
180f0 6e 74 4f 62 6a 28 6e 43 6f 6c 29 29 3b 0a 20 20  ntObj(nCol));.  
18100 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
18110 20 20 20 7d 0a 0a 20 20 20 20 20 20 63 61 73 65     }..      case
18120 20 50 52 45 5f 48 4f 4f 4b 3a 20 7b 0a 20 20 20   PRE_HOOK: {.   
18130 20 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 34 20       if( objc>4 
18140 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c  ){.          Tcl
18150 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
18160 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22  terp, 2, objv, "
18170 68 6f 6f 6b 20 3f 53 43 52 49 50 54 3f 22 29 3b  hook ?SCRIPT?");
18180 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
18190 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
181a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 44       }.        D
181b0 62 48 6f 6f 6b 43 6d 64 28 69 6e 74 65 72 70 2c  bHookCmd(interp,
181c0 20 70 44 62 2c 20 28 6f 62 6a 63 3d 3d 34 20 3f   pDb, (objc==4 ?
181d0 20 6f 62 6a 76 5b 33 5d 20 3a 20 30 29 2c 20 26   objv[3] : 0), &
181e0 70 44 62 2d 3e 70 50 72 65 55 70 64 61 74 65 48  pDb->pPreUpdateH
181f0 6f 6f 6b 29 3b 0a 20 20 20 20 20 20 20 20 62 72  ook);.        br
18200 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  eak;.      }..  
18210 20 20 20 20 63 61 73 65 20 50 52 45 5f 44 45 50      case PRE_DEP
18220 54 48 3a 20 7b 0a 20 20 20 20 20 20 20 20 54 63  TH: {.        Tc
18230 6c 5f 4f 62 6a 20 2a 70 52 65 74 3b 0a 20 20 20  l_Obj *pRet;.   
18240 20 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 33       if( objc!=3
18250 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54 63   ){.          Tc
18260 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
18270 6e 74 65 72 70 2c 20 33 2c 20 6f 62 6a 76 2c 20  nterp, 3, objv, 
18280 22 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  "");.          r
18290 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
182a0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
182b0 20 20 20 70 52 65 74 20 3d 20 54 63 6c 5f 4e 65     pRet = Tcl_Ne
182c0 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f  wIntObj(sqlite3_
182d0 70 72 65 75 70 64 61 74 65 5f 64 65 70 74 68 28  preupdate_depth(
182e0 70 44 62 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20  pDb->db));.     
182f0 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73     Tcl_SetObjRes
18300 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74  ult(interp, pRet
18310 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
18320 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
18330 20 63 61 73 65 20 50 52 45 5f 4e 45 57 3a 0a 20   case PRE_NEW:. 
18340 20 20 20 20 20 63 61 73 65 20 50 52 45 5f 4f 4c       case PRE_OL
18350 44 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  D: {.        int
18360 20 69 49 64 78 3b 0a 20 20 20 20 20 20 20 20 73   iIdx;.        s
18370 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56  qlite3_value *pV
18380 61 6c 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66  alue;.        if
18390 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20  ( objc!=4 ){.   
183a0 20 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67         Tcl_Wrong
183b0 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
183c0 33 2c 20 6f 62 6a 76 2c 20 22 49 4e 44 45 58 22  3, objv, "INDEX"
183d0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
183e0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
183f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
18400 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46   if( Tcl_GetIntF
18410 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
18420 62 6a 76 5b 33 5d 2c 20 26 69 49 64 78 29 20 29  bjv[3], &iIdx) )
18430 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
18440 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
18450 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
18460 20 69 66 28 20 69 53 75 62 3d 3d 50 52 45 5f 4f   if( iSub==PRE_O
18470 4c 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  LD ){.          
18480 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
18490 75 70 64 61 74 65 5f 6f 6c 64 28 70 44 62 2d 3e  update_old(pDb->
184a0 64 62 2c 20 69 49 64 78 2c 20 26 70 56 61 6c 75  db, iIdx, &pValu
184b0 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  e);.        }els
184c0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  e{.          ass
184d0 65 72 74 28 20 69 53 75 62 3d 3d 50 52 45 5f 4e  ert( iSub==PRE_N
184e0 45 57 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  EW );.          
184f0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
18500 75 70 64 61 74 65 5f 6e 65 77 28 70 44 62 2d 3e  update_new(pDb->
18510 64 62 2c 20 69 49 64 78 2c 20 26 70 56 61 6c 75  db, iIdx, &pValu
18520 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  e);.        }.. 
18530 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
18540 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
18550 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70        Tcl_Obj *p
18560 4f 62 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 70  Obj;.          p
18570 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72  Obj = Tcl_NewStr
18580 69 6e 67 4f 62 6a 28 28 63 68 61 72 2a 29 73 71  ingObj((char*)sq
18590 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
185a0 28 70 56 61 6c 75 65 29 2c 20 2d 31 29 3b 0a 20  (pValue), -1);. 
185b0 20 20 20 20 20 20 20 20 20 54 63 6c 5f 53 65 74           Tcl_Set
185c0 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
185d0 2c 20 70 4f 62 6a 29 3b 0a 20 20 20 20 20 20 20  , pObj);.       
185e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
185f0 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
18600 6c 74 28 69 6e 74 65 72 70 2c 20 73 71 6c 69 74  lt(interp, sqlit
18610 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64  e3_errmsg(pDb->d
18620 62 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  b), 0);.        
18630 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
18640 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  OR;.        }.  
18650 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64      }.    }.#end
18660 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41  if /* SQLITE_ENA
18670 42 4c 45 5f 50 52 45 55 50 44 41 54 45 5f 48 4f  BLE_PREUPDATE_HO
18680 4f 4b 20 2a 2f 0a 20 20 20 20 62 72 65 61 6b 3b  OK */.    break;
18690 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
186a0 20 20 20 24 64 62 20 77 61 6c 5f 68 6f 6f 6b 20     $db wal_hook 
186b0 3f 73 63 72 69 70 74 3f 0a 20 20 2a 2a 20 20 20  ?script?.  **   
186c0 20 24 64 62 20 75 70 64 61 74 65 5f 68 6f 6f 6b   $db update_hook
186d0 20 3f 73 63 72 69 70 74 3f 0a 20 20 2a 2a 20 20   ?script?.  **  
186e0 20 20 24 64 62 20 72 6f 6c 6c 62 61 63 6b 5f 68    $db rollback_h
186f0 6f 6f 6b 20 3f 73 63 72 69 70 74 3f 0a 20 20 2a  ook ?script?.  *
18700 2f 0a 20 20 63 61 73 65 20 44 42 5f 57 41 4c 5f  /.  case DB_WAL_
18710 48 4f 4f 4b 3a 0a 20 20 63 61 73 65 20 44 42 5f  HOOK:.  case DB_
18720 55 50 44 41 54 45 5f 48 4f 4f 4b 3a 0a 20 20 63  UPDATE_HOOK:.  c
18730 61 73 65 20 44 42 5f 52 4f 4c 4c 42 41 43 4b 5f  ase DB_ROLLBACK_
18740 48 4f 4f 4b 3a 20 7b 0a 20 20 20 20 2f 2a 20 73  HOOK: {.    /* s
18750 65 74 20 70 70 48 6f 6f 6b 20 74 6f 20 70 6f 69  et ppHook to poi
18760 6e 74 20 61 74 20 70 55 70 64 61 74 65 48 6f 6f  nt at pUpdateHoo
18770 6b 20 6f 72 20 70 52 6f 6c 6c 62 61 63 6b 48 6f  k or pRollbackHo
18780 6f 6b 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e  ok, depending on
18790 0a 20 20 20 20 2a 2a 20 77 68 65 74 68 65 72 20  .    ** whether 
187a0 5b 24 64 62 20 75 70 64 61 74 65 5f 68 6f 6f 6b  [$db update_hook
187b0 5d 20 6f 72 20 5b 24 64 62 20 72 6f 6c 6c 62 61  ] or [$db rollba
187c0 63 6b 5f 68 6f 6f 6b 5d 20 77 61 73 20 69 6e 76  ck_hook] was inv
187d0 6f 6b 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  oked..    */.   
187e0 20 54 63 6c 5f 4f 62 6a 20 2a 2a 70 70 48 6f 6f   Tcl_Obj **ppHoo
187f0 6b 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 63  k = 0;.    if( c
18800 68 6f 69 63 65 3d 3d 44 42 5f 57 41 4c 5f 48 4f  hoice==DB_WAL_HO
18810 4f 4b 20 29 20 70 70 48 6f 6f 6b 20 3d 20 26 70  OK ) ppHook = &p
18820 44 62 2d 3e 70 57 61 6c 48 6f 6f 6b 3b 0a 20 20  Db->pWalHook;.  
18830 20 20 69 66 28 20 63 68 6f 69 63 65 3d 3d 44 42    if( choice==DB
18840 5f 55 50 44 41 54 45 5f 48 4f 4f 4b 20 29 20 70  _UPDATE_HOOK ) p
18850 70 48 6f 6f 6b 20 3d 20 26 70 44 62 2d 3e 70 55  pHook = &pDb->pU
18860 70 64 61 74 65 48 6f 6f 6b 3b 0a 20 20 20 20 69  pdateHook;.    i
18870 66 28 20 63 68 6f 69 63 65 3d 3d 44 42 5f 52 4f  f( choice==DB_RO
18880 4c 4c 42 41 43 4b 5f 48 4f 4f 4b 20 29 20 70 70  LLBACK_HOOK ) pp
18890 48 6f 6f 6b 20 3d 20 26 70 44 62 2d 3e 70 52 6f  Hook = &pDb->pRo
188a0 6c 6c 62 61 63 6b 48 6f 6f 6b 3b 0a 20 20 20 20  llbackHook;.    
188b0 69 66 28 20 6f 62 6a 63 3e 33 20 29 7b 0a 20 20  if( objc>3 ){.  
188c0 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
188d0 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
188e0 20 6f 62 6a 76 2c 20 22 3f 53 43 52 49 50 54 3f   objv, "?SCRIPT?
188f0 22 29 3b 0a 20 20 20 20 20 20 20 72 65 74 75 72  ");.       retur
18900 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
18910 20 7d 0a 0a 20 20 20 20 44 62 48 6f 6f 6b 43 6d   }..    DbHookCm
18920 64 28 69 6e 74 65 72 70 2c 20 70 44 62 2c 20 28  d(interp, pDb, (
18930 6f 62 6a 63 3d 3d 33 20 3f 20 6f 62 6a 76 5b 32  objc==3 ? objv[2
18940 5d 20 3a 20 30 29 2c 20 70 70 48 6f 6f 6b 29 3b  ] : 0), ppHook);
18950 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
18960 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 76 65 72  .  /*    $db ver
18970 73 69 6f 6e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52  sion.  **.  ** R
18980 65 74 75 72 6e 20 74 68 65 20 76 65 72 73 69 6f  eturn the versio
18990 6e 20 73 74 72 69 6e 67 20 66 6f 72 20 74 68 69  n string for thi
189a0 73 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f  s database..  */
189b0 0a 20 20 63 61 73 65 20 44 42 5f 56 45 52 53 49  .  case DB_VERSI
189c0 4f 4e 3a 20 7b 0a 20 20 20 20 54 63 6c 5f 53 65  ON: {.    Tcl_Se
189d0 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  tResult(interp, 
189e0 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f  (char *)sqlite3_
189f0 6c 69 62 76 65 72 73 69 6f 6e 28 29 2c 20 54 43  libversion(), TC
18a00 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 62  L_STATIC);.    b
18a10 72 65 61 6b 3b 0a 20 20 7d 0a 0a 0a 20 20 7d 20  reak;.  }...  } 
18a20 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 53 57  /* End of the SW
18a30 49 54 43 48 20 73 74 61 74 65 6d 65 6e 74 20 2a  ITCH statement *
18a40 2f 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  /.  return rc;.}
18a50 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 43 4c  ..#if SQLITE_TCL
18a60 5f 4e 52 45 0a 2f 2a 0a 2a 2a 20 41 64 61 70 74  _NRE./*.** Adapt
18a70 6f 72 20 74 68 61 74 20 70 72 6f 76 69 64 65 73  or that provides
18a80 20 61 6e 20 6f 62 6a 43 6d 64 20 69 6e 74 65 72   an objCmd inter
18a90 66 61 63 65 20 74 6f 20 74 68 65 20 4e 52 45 2d  face to the NRE-
18aa0 65 6e 61 62 6c 65 64 0a 2a 2a 20 69 6e 74 65 72  enabled.** inter
18ab0 66 61 63 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74  face implementat
18ac0 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
18ad0 6e 74 20 44 62 4f 62 6a 43 6d 64 41 64 61 70 74  nt DbObjCmdAdapt
18ae0 6f 72 28 0a 20 20 76 6f 69 64 20 2a 63 64 2c 0a  or(.  void *cd,.
18af0 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
18b00 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
18b10 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e  ,.  Tcl_Obj *con
18b20 73 74 2a 6f 62 6a 76 0a 29 7b 0a 20 20 72 65 74  st*objv.){.  ret
18b30 75 72 6e 20 54 63 6c 5f 4e 52 43 61 6c 6c 4f 62  urn Tcl_NRCallOb
18b40 6a 50 72 6f 63 28 69 6e 74 65 72 70 2c 20 44 62  jProc(interp, Db
18b50 4f 62 6a 43 6d 64 2c 20 63 64 2c 20 6f 62 6a 63  ObjCmd, cd, objc
18b60 2c 20 6f 62 6a 76 29 3b 0a 7d 0a 23 65 6e 64 69  , objv);.}.#endi
18b70 66 20 2f 2a 20 53 51 4c 49 54 45 5f 54 43 4c 5f  f /* SQLITE_TCL_
18b80 4e 52 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 20 20  NRE */../*.**   
18b90 73 71 6c 69 74 65 33 20 44 42 4e 41 4d 45 20 46  sqlite3 DBNAME F
18ba0 49 4c 45 4e 41 4d 45 20 3f 2d 76 66 73 20 56 46  ILENAME ?-vfs VF
18bb0 53 4e 41 4d 45 3f 20 3f 2d 6b 65 79 20 4b 45 59  SNAME? ?-key KEY
18bc0 3f 20 3f 2d 72 65 61 64 6f 6e 6c 79 20 42 4f 4f  ? ?-readonly BOO
18bd0 4c 45 41 4e 3f 0a 2a 2a 20 20 20 20 20 20 20 20  LEAN?.**        
18be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18bf0 20 20 20 3f 2d 63 72 65 61 74 65 20 42 4f 4f 4c     ?-create BOOL
18c00 45 41 4e 3f 20 3f 2d 6e 6f 6d 75 74 65 78 20 42  EAN? ?-nomutex B
18c10 4f 4f 4c 45 41 4e 3f 0a 2a 2a 0a 2a 2a 20 54 68  OOLEAN?.**.** Th
18c20 69 73 20 69 73 20 74 68 65 20 6d 61 69 6e 20 54  is is the main T
18c30 63 6c 20 63 6f 6d 6d 61 6e 64 2e 20 20 57 68 65  cl command.  Whe
18c40 6e 20 74 68 65 20 22 73 71 6c 69 74 65 22 20 54  n the "sqlite" T
18c50 63 6c 20 63 6f 6d 6d 61 6e 64 20 69 73 0a 2a 2a  cl command is.**
18c60 20 69 6e 76 6f 6b 65 64 2c 20 74 68 69 73 20 72   invoked, this r
18c70 6f 75 74 69 6e 65 20 72 75 6e 73 20 74 6f 20 70  outine runs to p
18c80 72 6f 63 65 73 73 20 74 68 61 74 20 63 6f 6d 6d  rocess that comm
18c90 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  and..**.** The f
18ca0 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2c 20 44  irst argument, D
18cb0 42 4e 41 4d 45 2c 20 69 73 20 61 6e 20 61 72 62  BNAME, is an arb
18cc0 69 74 72 61 72 79 20 6e 61 6d 65 20 66 6f 72 20  itrary name for 
18cd0 61 20 6e 65 77 0a 2a 2a 20 64 61 74 61 62 61 73  a new.** databas
18ce0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 20 54  e connection.  T
18cf0 68 69 73 20 63 6f 6d 6d 61 6e 64 20 63 72 65 61  his command crea
18d00 74 65 73 20 61 20 6e 65 77 20 63 6f 6d 6d 61 6e  tes a new comman
18d10 64 20 6e 61 6d 65 64 0a 2a 2a 20 44 42 4e 41 4d  d named.** DBNAM
18d20 45 20 74 68 61 74 20 69 73 20 75 73 65 64 20 74  E that is used t
18d30 6f 20 63 6f 6e 74 72 6f 6c 20 74 68 61 74 20 63  o control that c
18d40 6f 6e 6e 65 63 74 69 6f 6e 2e 20 20 54 68 65 20  onnection.  The 
18d50 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e 6e  database.** conn
18d60 65 63 74 69 6f 6e 20 69 73 20 64 65 6c 65 74 65  ection is delete
18d70 64 20 77 68 65 6e 20 74 68 65 20 44 42 4e 41 4d  d when the DBNAM
18d80 45 20 63 6f 6d 6d 61 6e 64 20 69 73 20 64 65 6c  E command is del
18d90 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  eted..**.** The 
18da0 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
18db0 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  is the name of t
18dc0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
18dd0 2e 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ..**.*/.static i
18de0 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49  nt SQLITE_TCLAPI
18df0 20 44 62 4d 61 69 6e 28 0a 20 20 76 6f 69 64 20   DbMain(.  void 
18e00 2a 63 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  *cd,.  Tcl_Inter
18e10 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
18e20 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
18e30 20 2a 63 6f 6e 73 74 2a 6f 62 6a 76 0a 29 7b 0a   *const*objv.){.
18e40 20 20 53 71 6c 69 74 65 44 62 20 2a 70 3b 0a 20    SqliteDb *p;. 
18e50 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72   const char *zAr
18e60 67 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 4d  g;.  char *zErrM
18e70 73 67 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63  sg;.  int i;.  c
18e80 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
18e90 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
18ea0 7a 56 66 73 20 3d 20 30 3b 0a 20 20 69 6e 74 20  zVfs = 0;.  int 
18eb0 66 6c 61 67 73 3b 0a 20 20 54 63 6c 5f 44 53 74  flags;.  Tcl_DSt
18ec0 72 69 6e 67 20 74 72 61 6e 73 6c 61 74 65 64 46  ring translatedF
18ed0 69 6c 65 6e 61 6d 65 3b 0a 23 69 66 20 64 65 66  ilename;.#if def
18ee0 69 6e 65 64 28 53 51 4c 49 54 45 5f 48 41 53 5f  ined(SQLITE_HAS_
18ef0 43 4f 44 45 43 29 20 26 26 20 21 64 65 66 69 6e  CODEC) && !defin
18f00 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ed(SQLITE_OMIT_C
18f10 4f 44 45 43 5f 46 52 4f 4d 5f 54 43 4c 29 0a 20  ODEC_FROM_TCL). 
18f20 20 76 6f 69 64 20 2a 70 4b 65 79 20 3d 20 30 3b   void *pKey = 0;
18f30 0a 20 20 69 6e 74 20 6e 4b 65 79 20 3d 20 30 3b  .  int nKey = 0;
18f40 0a 23 65 6e 64 69 66 0a 20 20 69 6e 74 20 72 63  .#endif.  int rc
18f50 3b 0a 0a 20 20 2f 2a 20 49 6e 20 6e 6f 72 6d 61  ;..  /* In norma
18f60 6c 20 75 73 65 2c 20 65 61 63 68 20 54 43 4c 20  l use, each TCL 
18f70 69 6e 74 65 72 70 72 65 74 65 72 20 72 75 6e 73  interpreter runs
18f80 20 69 6e 20 61 20 73 69 6e 67 6c 65 20 74 68 72   in a single thr
18f90 65 61 64 2e 20 20 53 6f 0a 20 20 2a 2a 20 62 79  ead.  So.  ** by
18fa0 20 64 65 66 61 75 6c 74 2c 20 77 65 20 63 61 6e   default, we can
18fb0 20 74 75 72 6e 20 6f 66 20 6d 75 74 65 78 69 6e   turn of mutexin
18fc0 67 20 6f 6e 20 53 51 4c 69 74 65 20 64 61 74 61  g on SQLite data
18fd0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  base connections
18fe0 2e 0a 20 20 2a 2a 20 48 6f 77 65 76 65 72 2c 20  ..  ** However, 
18ff0 66 6f 72 20 74 65 73 74 69 6e 67 20 70 75 72 70  for testing purp
19000 6f 73 65 73 20 69 74 20 69 73 20 75 73 65 66 75  oses it is usefu
19010 6c 20 74 6f 20 68 61 76 65 20 6d 75 74 65 78 65  l to have mutexe
19020 73 20 74 75 72 6e 65 64 0a 20 20 2a 2a 20 6f 6e  s turned.  ** on
19030 2e 20 20 53 6f 2c 20 62 79 20 64 65 66 61 75 6c  .  So, by defaul
19040 74 2c 20 6d 75 74 65 78 65 73 20 64 65 66 61 75  t, mutexes defau
19050 6c 74 20 6f 66 66 2e 20 20 42 75 74 20 69 66 20  lt off.  But if 
19060 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 0a 20 20  compiled with.  
19070 2a 2a 20 53 51 4c 49 54 45 5f 54 43 4c 5f 44 45  ** SQLITE_TCL_DE
19080 46 41 55 4c 54 5f 46 55 4c 4c 4d 55 54 45 58 20  FAULT_FULLMUTEX 
19090 74 68 65 6e 20 6d 75 74 65 78 65 73 20 64 65 66  then mutexes def
190a0 61 75 6c 74 20 6f 6e 2e 0a 20 20 2a 2f 0a 23 69  ault on..  */.#i
190b0 66 64 65 66 20 53 51 4c 49 54 45 5f 54 43 4c 5f  fdef SQLITE_TCL_
190c0 44 45 46 41 55 4c 54 5f 46 55 4c 4c 4d 55 54 45  DEFAULT_FULLMUTE
190d0 58 0a 20 20 66 6c 61 67 73 20 3d 20 53 51 4c 49  X.  flags = SQLI
190e0 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
190f0 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  E | SQLITE_OPEN_
19100 43 52 45 41 54 45 20 7c 20 53 51 4c 49 54 45 5f  CREATE | SQLITE_
19110 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54 45 58 3b 0a  OPEN_FULLMUTEX;.
19120 23 65 6c 73 65 0a 20 20 66 6c 61 67 73 20 3d 20  #else.  flags = 
19130 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
19140 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f  WRITE | SQLITE_O
19150 50 45 4e 5f 43 52 45 41 54 45 20 7c 20 53 51 4c  PEN_CREATE | SQL
19160 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58  ITE_OPEN_NOMUTEX
19170 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20  ;.#endif..  if( 
19180 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20 7a  objc==2 ){.    z
19190 41 72 67 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  Arg = Tcl_GetStr
191a0 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
191b0 31 5d 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  1], 0);.    if( 
191c0 73 74 72 63 6d 70 28 7a 41 72 67 2c 22 2d 76 65  strcmp(zArg,"-ve
191d0 72 73 69 6f 6e 22 29 3d 3d 30 20 29 7b 0a 20 20  rsion")==0 ){.  
191e0 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
191f0 73 75 6c 74 28 69 6e 74 65 72 70 2c 73 71 6c 69  sult(interp,sqli
19200 74 65 33 5f 6c 69 62 76 65 72 73 69 6f 6e 28 29  te3_libversion()
19210 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20  , (char*)0);.   
19220 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b     return TCL_OK
19230 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
19240 73 74 72 63 6d 70 28 7a 41 72 67 2c 22 2d 73 6f  strcmp(zArg,"-so
19250 75 72 63 65 69 64 22 29 3d 3d 30 20 29 7b 0a 20  urceid")==0 ){. 
19260 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
19270 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 73 71 6c  esult(interp,sql
19280 69 74 65 33 5f 73 6f 75 72 63 65 69 64 28 29 2c  ite3_sourceid(),
19290 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20   (char*)0);.    
192a0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
192b0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
192c0 74 72 63 6d 70 28 7a 41 72 67 2c 22 2d 68 61 73  trcmp(zArg,"-has
192d0 2d 63 6f 64 65 63 22 29 3d 3d 30 20 29 7b 0a 23  -codec")==0 ){.#
192e0 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
192f0 45 5f 48 41 53 5f 43 4f 44 45 43 29 20 26 26 20  E_HAS_CODEC) && 
19300 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
19310 4f 4d 49 54 5f 43 4f 44 45 43 5f 46 52 4f 4d 5f  OMIT_CODEC_FROM_
19320 54 43 4c 29 0a 20 20 20 20 20 20 54 63 6c 5f 41  TCL).      Tcl_A
19330 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
19340 72 70 2c 22 31 22 2c 28 63 68 61 72 2a 29 30 29  rp,"1",(char*)0)
19350 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 54 63  ;.#else.      Tc
19360 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
19370 6e 74 65 72 70 2c 22 30 22 2c 28 63 68 61 72 2a  nterp,"0",(char*
19380 29 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  )0);.#endif.    
19390 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
193a0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72  .    }.  }.  for
193b0 28 69 3d 33 3b 20 69 2b 31 3c 6f 62 6a 63 3b 20  (i=3; i+1<objc; 
193c0 69 2b 3d 32 29 7b 0a 20 20 20 20 7a 41 72 67 20  i+=2){.    zArg 
193d0 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  = Tcl_GetString(
193e0 6f 62 6a 76 5b 69 5d 29 3b 0a 20 20 20 20 69 66  objv[i]);.    if
193f0 28 20 73 74 72 63 6d 70 28 7a 41 72 67 2c 22 2d  ( strcmp(zArg,"-
19400 6b 65 79 22 29 3d 3d 30 20 29 7b 0a 23 69 66 20  key")==0 ){.#if 
19410 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 48  defined(SQLITE_H
19420 41 53 5f 43 4f 44 45 43 29 20 26 26 20 21 64 65  AS_CODEC) && !de
19430 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
19440 54 5f 43 4f 44 45 43 5f 46 52 4f 4d 5f 54 43 4c  T_CODEC_FROM_TCL
19450 29 0a 20 20 20 20 20 20 70 4b 65 79 20 3d 20 54  ).      pKey = T
19460 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79 46  cl_GetByteArrayF
19470 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 69 2b 31 5d  romObj(objv[i+1]
19480 2c 20 26 6e 4b 65 79 29 3b 0a 23 65 6e 64 69 66  , &nKey);.#endif
19490 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73  .    }else if( s
194a0 74 72 63 6d 70 28 7a 41 72 67 2c 20 22 2d 76 66  trcmp(zArg, "-vf
194b0 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  s")==0 ){.      
194c0 7a 56 66 73 20 3d 20 54 63 6c 5f 47 65 74 53 74  zVfs = Tcl_GetSt
194d0 72 69 6e 67 28 6f 62 6a 76 5b 69 2b 31 5d 29 3b  ring(objv[i+1]);
194e0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73  .    }else if( s
194f0 74 72 63 6d 70 28 7a 41 72 67 2c 20 22 2d 72 65  trcmp(zArg, "-re
19500 61 64 6f 6e 6c 79 22 29 3d 3d 30 20 29 7b 0a 20  adonly")==0 ){. 
19510 20 20 20 20 20 69 6e 74 20 62 3b 0a 20 20 20 20       int b;.    
19520 20 20 69 66 28 20 54 63 6c 5f 47 65 74 42 6f 6f    if( Tcl_GetBoo
19530 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  leanFromObj(inte
19540 72 70 2c 20 6f 62 6a 76 5b 69 2b 31 5d 2c 20 26  rp, objv[i+1], &
19550 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
19560 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 69 66 28  ERROR;.      if(
19570 20 62 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6c   b ){.        fl
19580 61 67 73 20 26 3d 20 7e 28 53 51 4c 49 54 45 5f  ags &= ~(SQLITE_
19590 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53  OPEN_READWRITE|S
195a0 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
195b0 45 29 3b 0a 20 20 20 20 20 20 20 20 66 6c 61 67  E);.        flag
195c0 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e  s |= SQLITE_OPEN
195d0 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20  _READONLY;.     
195e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
195f0 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45  flags &= ~SQLITE
19600 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a  _OPEN_READONLY;.
19610 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d          flags |=
19620 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
19630 44 57 52 49 54 45 3b 0a 20 20 20 20 20 20 7d 0a  DWRITE;.      }.
19640 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
19650 72 63 6d 70 28 7a 41 72 67 2c 20 22 2d 63 72 65  rcmp(zArg, "-cre
19660 61 74 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ate")==0 ){.    
19670 20 20 69 6e 74 20 62 3b 0a 20 20 20 20 20 20 69    int b;.      i
19680 66 28 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61  f( Tcl_GetBoolea
19690 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  nFromObj(interp,
196a0 20 6f 62 6a 76 5b 69 2b 31 5d 2c 20 26 62 29 20   objv[i+1], &b) 
196b0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
196c0 4f 52 3b 0a 20 20 20 20 20 20 69 66 28 20 62 20  OR;.      if( b 
196d0 26 26 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49  && (flags & SQLI
196e0 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
196f0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
19700 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  flags |= SQLITE_
19710 4f 50 45 4e 5f 43 52 45 41 54 45 3b 0a 20 20 20  OPEN_CREATE;.   
19720 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
19730 20 20 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49    flags &= ~SQLI
19740 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 3b 0a  TE_OPEN_CREATE;.
19750 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
19760 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 41 72  e if( strcmp(zAr
19770 67 2c 20 22 2d 6e 6f 6d 75 74 65 78 22 29 3d 3d  g, "-nomutex")==
19780 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 62  0 ){.      int b
19790 3b 0a 20 20 20 20 20 20 69 66 28 20 54 63 6c 5f  ;.      if( Tcl_
197a0 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62  GetBooleanFromOb
197b0 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 69  j(interp, objv[i
197c0 2b 31 5d 2c 20 26 62 29 20 29 20 72 65 74 75 72  +1], &b) ) retur
197d0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
197e0 20 20 20 69 66 28 20 62 20 29 7b 0a 20 20 20 20     if( b ){.    
197f0 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c      flags |= SQL
19800 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58  ITE_OPEN_NOMUTEX
19810 3b 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73 20  ;.        flags 
19820 26 3d 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  &= ~SQLITE_OPEN_
19830 46 55 4c 4c 4d 55 54 45 58 3b 0a 20 20 20 20 20  FULLMUTEX;.     
19840 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
19850 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45  flags &= ~SQLITE
19860 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58 3b 0a 20  _OPEN_NOMUTEX;. 
19870 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
19880 20 69 66 28 20 73 74 72 63 6d 70 28 7a 41 72 67   if( strcmp(zArg
19890 2c 20 22 2d 66 75 6c 6c 6d 75 74 65 78 22 29 3d  , "-fullmutex")=
198a0 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =0 ){.      int 
198b0 62 3b 0a 20 20 20 20 20 20 69 66 28 20 54 63 6c  b;.      if( Tcl
198c0 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f  _GetBooleanFromO
198d0 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
198e0 69 2b 31 5d 2c 20 26 62 29 20 29 20 72 65 74 75  i+1], &b) ) retu
198f0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
19900 20 20 20 20 69 66 28 20 62 20 29 7b 0a 20 20 20      if( b ){.   
19910 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 53 51       flags |= SQ
19920 4c 49 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55  LITE_OPEN_FULLMU
19930 54 45 58 3b 0a 20 20 20 20 20 20 20 20 66 6c 61  TEX;.        fla
19940 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 4f 50  gs &= ~SQLITE_OP
19950 45 4e 5f 4e 4f 4d 55 54 45 58 3b 0a 20 20 20 20  EN_NOMUTEX;.    
19960 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
19970 20 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54   flags &= ~SQLIT
19980 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54 45 58  E_OPEN_FULLMUTEX
19990 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
199a0 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a  lse if( strcmp(z
199b0 41 72 67 2c 20 22 2d 75 72 69 22 29 3d 3d 30 20  Arg, "-uri")==0 
199c0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 62 3b 0a  ){.      int b;.
199d0 20 20 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65        if( Tcl_Ge
199e0 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28  tBooleanFromObj(
199f0 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 69 2b 31  interp, objv[i+1
19a00 5d 2c 20 26 62 29 20 29 20 72 65 74 75 72 6e 20  ], &b) ) return 
19a10 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  TCL_ERROR;.     
19a20 20 69 66 28 20 62 20 29 7b 0a 20 20 20 20 20 20   if( b ){.      
19a30 20 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54    flags |= SQLIT
19a40 45 5f 4f 50 45 4e 5f 55 52 49 3b 0a 20 20 20 20  E_OPEN_URI;.    
19a50 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
19a60 20 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54   flags &= ~SQLIT
19a70 45 5f 4f 50 45 4e 5f 55 52 49 3b 0a 20 20 20 20  E_OPEN_URI;.    
19a80 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
19a90 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
19aa0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75  esult(interp, "u
19ab0 6e 6b 6e 6f 77 6e 20 6f 70 74 69 6f 6e 3a 20 22  nknown option: "
19ac0 2c 20 7a 41 72 67 2c 20 28 63 68 61 72 2a 29 30  , zArg, (char*)0
19ad0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
19ae0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
19af0 0a 20 20 7d 0a 20 20 69 66 28 20 6f 62 6a 63 3c  .  }.  if( objc<
19b00 33 20 7c 7c 20 28 6f 62 6a 63 26 31 29 21 3d 31  3 || (objc&1)!=1
19b10 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
19b20 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
19b30 20 31 2c 20 6f 62 6a 76 2c 0a 20 20 20 20 20 20   1, objv,.      
19b40 22 48 41 4e 44 4c 45 20 46 49 4c 45 4e 41 4d 45  "HANDLE FILENAME
19b50 20 3f 2d 76 66 73 20 56 46 53 4e 41 4d 45 3f 20   ?-vfs VFSNAME? 
19b60 3f 2d 72 65 61 64 6f 6e 6c 79 20 42 4f 4f 4c 45  ?-readonly BOOLE
19b70 41 4e 3f 20 3f 2d 63 72 65 61 74 65 20 42 4f 4f  AN? ?-create BOO
19b80 4c 45 41 4e 3f 22 0a 20 20 20 20 20 20 22 20 3f  LEAN?".      " ?
19b90 2d 6e 6f 6d 75 74 65 78 20 42 4f 4f 4c 45 41 4e  -nomutex BOOLEAN
19ba0 3f 20 3f 2d 66 75 6c 6c 6d 75 74 65 78 20 42 4f  ? ?-fullmutex BO
19bb0 4f 4c 45 41 4e 3f 20 3f 2d 75 72 69 20 42 4f 4f  OLEAN? ?-uri BOO
19bc0 4c 45 41 4e 3f 22 0a 23 69 66 20 64 65 66 69 6e  LEAN?".#if defin
19bd0 65 64 28 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  ed(SQLITE_HAS_CO
19be0 44 45 43 29 20 26 26 20 21 64 65 66 69 6e 65 64  DEC) && !defined
19bf0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 44  (SQLITE_OMIT_COD
19c00 45 43 5f 46 52 4f 4d 5f 54 43 4c 29 0a 20 20 20  EC_FROM_TCL).   
19c10 20 20 20 22 20 3f 2d 6b 65 79 20 43 4f 44 45 43     " ?-key CODEC
19c20 4b 45 59 3f 22 0a 23 65 6e 64 69 66 0a 20 20 20  KEY?".#endif.   
19c30 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54   );.    return T
19c40 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
19c50 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 70  zErrMsg = 0;.  p
19c60 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 54 63   = (SqliteDb*)Tc
19c70 6c 5f 41 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  l_Alloc( sizeof(
19c80 2a 70 29 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d  *p) );.  if( p==
19c90 30 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74  0 ){.    Tcl_Set
19ca0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28  Result(interp, (
19cb0 63 68 61 72 20 2a 29 22 6d 61 6c 6c 6f 63 20 66  char *)"malloc f
19cc0 61 69 6c 65 64 22 2c 20 54 43 4c 5f 53 54 41 54  ailed", TCL_STAT
19cd0 49 43 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  IC);.    return 
19ce0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
19cf0 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 73 69   memset(p, 0, si
19d00 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 7a 46 69  zeof(*p));.  zFi
19d10 6c 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  le = Tcl_GetStri
19d20 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32  ngFromObj(objv[2
19d30 5d 2c 20 30 29 3b 0a 20 20 7a 46 69 6c 65 20 3d  ], 0);.  zFile =
19d40 20 54 63 6c 5f 54 72 61 6e 73 6c 61 74 65 46 69   Tcl_TranslateFi
19d50 6c 65 4e 61 6d 65 28 69 6e 74 65 72 70 2c 20 7a  leName(interp, z
19d60 46 69 6c 65 2c 20 26 74 72 61 6e 73 6c 61 74 65  File, &translate
19d70 64 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 72 63  dFilename);.  rc
19d80 20 3d 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f   = sqlite3_open_
19d90 76 32 28 7a 46 69 6c 65 2c 20 26 70 2d 3e 64 62  v2(zFile, &p->db
19da0 2c 20 66 6c 61 67 73 2c 20 7a 56 66 73 29 3b 0a  , flags, zVfs);.
19db0 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65    Tcl_DStringFre
19dc0 65 28 26 74 72 61 6e 73 6c 61 74 65 64 46 69 6c  e(&translatedFil
19dd0 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20 70 2d  ename);.  if( p-
19de0 3e 64 62 20 29 7b 0a 20 20 20 20 69 66 28 20 53  >db ){.    if( S
19df0 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65  QLITE_OK!=sqlite
19e00 33 5f 65 72 72 63 6f 64 65 28 70 2d 3e 64 62 29  3_errcode(p->db)
19e10 20 29 7b 0a 20 20 20 20 20 20 7a 45 72 72 4d 73   ){.      zErrMs
19e20 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  g = sqlite3_mpri
19e30 6e 74 66 28 22 25 73 22 2c 20 73 71 6c 69 74 65  ntf("%s", sqlite
19e40 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62 29 29  3_errmsg(p->db))
19e50 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
19e60 63 6c 6f 73 65 28 70 2d 3e 64 62 29 3b 0a 20 20  close(p->db);.  
19e70 20 20 20 20 70 2d 3e 64 62 20 3d 20 30 3b 0a 20      p->db = 0;. 
19e80 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
19e90 20 20 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69    zErrMsg = sqli
19ea0 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22  te3_mprintf("%s"
19eb0 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 73 74 72  , sqlite3_errstr
19ec0 28 72 63 29 29 3b 0a 20 20 7d 0a 23 69 66 20 64  (rc));.  }.#if d
19ed0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 48 41  efined(SQLITE_HA
19ee0 53 5f 43 4f 44 45 43 29 20 26 26 20 21 64 65 66  S_CODEC) && !def
19ef0 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
19f00 5f 43 4f 44 45 43 5f 46 52 4f 4d 5f 54 43 4c 29  _CODEC_FROM_TCL)
19f10 0a 20 20 69 66 28 20 70 2d 3e 64 62 20 29 7b 0a  .  if( p->db ){.
19f20 20 20 20 20 73 71 6c 69 74 65 33 5f 6b 65 79 28      sqlite3_key(
19f30 70 2d 3e 64 62 2c 20 70 4b 65 79 2c 20 6e 4b 65  p->db, pKey, nKe
19f40 79 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  y);.  }.#endif. 
19f50 20 69 66 28 20 70 2d 3e 64 62 3d 3d 30 20 29 7b   if( p->db==0 ){
19f60 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75  .    Tcl_SetResu
19f70 6c 74 28 69 6e 74 65 72 70 2c 20 7a 45 72 72 4d  lt(interp, zErrM
19f80 73 67 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45  sg, TCL_VOLATILE
19f90 29 3b 0a 20 20 20 20 54 63 6c 5f 46 72 65 65 28  );.    Tcl_Free(
19fa0 28 63 68 61 72 2a 29 70 29 3b 0a 20 20 20 20 73  (char*)p);.    s
19fb0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72  qlite3_free(zErr
19fc0 4d 73 67 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  Msg);.    return
19fd0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
19fe0 20 20 70 2d 3e 6d 61 78 53 74 6d 74 20 3d 20 4e    p->maxStmt = N
19ff0 55 4d 5f 50 52 45 50 41 52 45 44 5f 53 54 4d 54  UM_PREPARED_STMT
1a000 53 3b 0a 20 20 70 2d 3e 6f 70 65 6e 46 6c 61 67  S;.  p->openFlag
1a010 73 20 3d 20 66 6c 61 67 73 20 26 20 53 51 4c 49  s = flags & SQLI
1a020 54 45 5f 4f 50 45 4e 5f 55 52 49 3b 0a 20 20 70  TE_OPEN_URI;.  p
1a030 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72  ->interp = inter
1a040 70 3b 0a 20 20 7a 41 72 67 20 3d 20 54 63 6c 5f  p;.  zArg = Tcl_
1a050 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
1a060 28 6f 62 6a 76 5b 31 5d 2c 20 30 29 3b 0a 20 20  (objv[1], 0);.  
1a070 69 66 28 20 44 62 55 73 65 4e 72 65 28 29 20 29  if( DbUseNre() )
1a080 7b 0a 20 20 20 20 54 63 6c 5f 4e 52 43 72 65 61  {.    Tcl_NRCrea
1a090 74 65 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70  teCommand(interp
1a0a0 2c 20 7a 41 72 67 2c 20 44 62 4f 62 6a 43 6d 64  , zArg, DbObjCmd
1a0b0 41 64 61 70 74 6f 72 2c 20 44 62 4f 62 6a 43 6d  Adaptor, DbObjCm
1a0c0 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d,.             
1a0d0 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
1a0e0 2a 29 70 2c 20 44 62 44 65 6c 65 74 65 43 6d 64  *)p, DbDeleteCmd
1a0f0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1a100 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d  Tcl_CreateObjCom
1a110 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 7a 41 72  mand(interp, zAr
1a120 67 2c 20 44 62 4f 62 6a 43 6d 64 2c 20 28 63 68  g, DbObjCmd, (ch
1a130 61 72 2a 29 70 2c 20 44 62 44 65 6c 65 74 65 43  ar*)p, DbDeleteC
1a140 6d 64 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  md);.  }.  retur
1a150 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
1a160 2a 2a 20 50 72 6f 76 69 64 65 20 61 20 64 75 6d  ** Provide a dum
1a170 6d 79 20 54 63 6c 5f 49 6e 69 74 53 74 75 62 73  my Tcl_InitStubs
1a180 20 69 66 20 77 65 20 61 72 65 20 75 73 69 6e 67   if we are using
1a190 20 74 68 69 73 20 61 73 20 61 20 73 74 61 74 69   this as a stati
1a1a0 63 0a 2a 2a 20 6c 69 62 72 61 72 79 2e 0a 2a 2f  c.** library..*/
1a1b0 0a 23 69 66 6e 64 65 66 20 55 53 45 5f 54 43 4c  .#ifndef USE_TCL
1a1c0 5f 53 54 55 42 53 0a 23 20 75 6e 64 65 66 20 20  _STUBS.# undef  
1a1d0 54 63 6c 5f 49 6e 69 74 53 74 75 62 73 0a 23 20  Tcl_InitStubs.# 
1a1e0 64 65 66 69 6e 65 20 54 63 6c 5f 49 6e 69 74 53  define Tcl_InitS
1a1f0 74 75 62 73 28 61 2c 62 2c 63 29 20 54 43 4c 5f  tubs(a,b,c) TCL_
1a200 56 45 52 53 49 4f 4e 0a 23 65 6e 64 69 66 0a 0a  VERSION.#endif..
1a210 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20  /*.** Make sure 
1a220 77 65 20 68 61 76 65 20 61 20 50 41 43 4b 41 47  we have a PACKAG
1a230 45 5f 56 45 52 53 49 4f 4e 20 6d 61 63 72 6f 20  E_VERSION macro 
1a240 64 65 66 69 6e 65 64 2e 20 20 54 68 69 73 20 77  defined.  This w
1a250 69 6c 6c 20 62 65 0a 2a 2a 20 64 65 66 69 6e 65  ill be.** define
1a260 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  d automatically 
1a270 62 79 20 74 68 65 20 54 45 41 20 6d 61 6b 65 66  by the TEA makef
1a280 69 6c 65 2e 20 20 42 75 74 20 6f 74 68 65 72 20  ile.  But other 
1a290 6d 61 6b 65 66 69 6c 65 73 0a 2a 2a 20 64 6f 20  makefiles.** do 
1a2a0 6e 6f 74 20 64 65 66 69 6e 65 20 69 74 2e 0a 2a  not define it..*
1a2b0 2f 0a 23 69 66 6e 64 65 66 20 50 41 43 4b 41 47  /.#ifndef PACKAG
1a2c0 45 5f 56 45 52 53 49 4f 4e 0a 23 20 64 65 66 69  E_VERSION.# defi
1a2d0 6e 65 20 50 41 43 4b 41 47 45 5f 56 45 52 53 49  ne PACKAGE_VERSI
1a2e0 4f 4e 20 53 51 4c 49 54 45 5f 56 45 52 53 49 4f  ON SQLITE_VERSIO
1a2f0 4e 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  N.#endif../*.** 
1a300 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 69 73 20  Initialize this 
1a310 6d 6f 64 75 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  module..**.** Th
1a320 69 73 20 54 63 6c 20 6d 6f 64 75 6c 65 20 63 6f  is Tcl module co
1a330 6e 74 61 69 6e 73 20 6f 6e 6c 79 20 61 20 73 69  ntains only a si
1a340 6e 67 6c 65 20 6e 65 77 20 54 63 6c 20 63 6f 6d  ngle new Tcl com
1a350 6d 61 6e 64 20 6e 61 6d 65 64 20 22 73 71 6c 69  mand named "sqli
1a360 74 65 22 2e 0a 2a 2a 20 28 48 65 6e 63 65 20 74  te"..** (Hence t
1a370 68 65 72 65 20 69 73 20 6e 6f 20 6e 61 6d 65 73  here is no names
1a380 70 61 63 65 2e 20 20 54 68 65 72 65 20 69 73 20  pace.  There is 
1a390 6e 6f 20 70 6f 69 6e 74 20 69 6e 20 75 73 69 6e  no point in usin
1a3a0 67 20 61 20 6e 61 6d 65 73 70 61 63 65 0a 2a 2a  g a namespace.**
1a3b0 20 69 66 20 74 68 65 20 65 78 74 65 6e 73 69 6f   if the extensio
1a3c0 6e 20 6f 6e 6c 79 20 73 75 70 70 6c 69 65 73 20  n only supplies 
1a3d0 6f 6e 65 20 6e 65 77 20 6e 61 6d 65 21 29 20 20  one new name!)  
1a3e0 54 68 65 20 22 73 71 6c 69 74 65 22 20 63 6f 6d  The "sqlite" com
1a3f0 6d 61 6e 64 20 69 73 0a 2a 2a 20 75 73 65 64 20  mand is.** used 
1a400 74 6f 20 6f 70 65 6e 20 61 20 6e 65 77 20 53 51  to open a new SQ
1a410 4c 69 74 65 20 64 61 74 61 62 61 73 65 2e 20 20  Lite database.  
1a420 53 65 65 20 74 68 65 20 44 62 4d 61 69 6e 28 29  See the DbMain()
1a430 20 72 6f 75 74 69 6e 65 20 61 62 6f 76 65 0a 2a   routine above.*
1a440 2a 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c  * for additional
1a450 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2a   information..**
1a460 0a 2a 2a 20 54 68 65 20 45 58 54 45 52 4e 20 6d  .** The EXTERN m
1a470 61 63 72 6f 73 20 61 72 65 20 72 65 71 75 69 72  acros are requir
1a480 65 64 20 62 79 20 54 43 4c 20 69 6e 20 6f 72 64  ed by TCL in ord
1a490 65 72 20 74 6f 20 77 6f 72 6b 20 6f 6e 20 77 69  er to work on wi
1a4a0 6e 64 6f 77 73 2e 0a 2a 2f 0a 45 58 54 45 52 4e  ndows..*/.EXTERN
1a4b0 20 69 6e 74 20 53 71 6c 69 74 65 33 5f 49 6e 69   int Sqlite3_Ini
1a4c0 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  t(Tcl_Interp *in
1a4d0 74 65 72 70 29 7b 0a 20 20 69 6e 74 20 72 63 20  terp){.  int rc 
1a4e0 3d 20 54 63 6c 5f 49 6e 69 74 53 74 75 62 73 28  = Tcl_InitStubs(
1a4f0 69 6e 74 65 72 70 2c 20 22 38 2e 34 22 2c 20 30  interp, "8.4", 0
1a500 29 20 3f 20 54 43 4c 5f 4f 4b 20 3a 20 54 43 4c  ) ? TCL_OK : TCL
1a510 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 72 63  _ERROR;.  if( rc
1a520 3d 3d 54 43 4c 5f 4f 4b 20 29 7b 0a 20 20 20 20  ==TCL_OK ){.    
1a530 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d  Tcl_CreateObjCom
1a540 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 73 71  mand(interp, "sq
1a550 6c 69 74 65 33 22 2c 20 28 54 63 6c 5f 4f 62 6a  lite3", (Tcl_Obj
1a560 43 6d 64 50 72 6f 63 2a 29 44 62 4d 61 69 6e 2c  CmdProc*)DbMain,
1a570 20 30 2c 20 30 29 3b 0a 23 69 66 6e 64 65 66 20   0, 0);.#ifndef 
1a580 53 51 4c 49 54 45 5f 33 5f 53 55 46 46 49 58 5f  SQLITE_3_SUFFIX_
1a590 4f 4e 4c 59 0a 20 20 20 20 2f 2a 20 54 68 65 20  ONLY.    /* The 
1a5a0 22 73 71 6c 69 74 65 22 20 61 6c 69 61 73 20 69  "sqlite" alias i
1a5b0 73 20 75 6e 64 6f 63 75 6d 65 6e 74 65 64 2e 20  s undocumented. 
1a5c0 20 49 74 20 69 73 20 68 65 72 65 20 6f 6e 6c 79   It is here only
1a5d0 20 74 6f 20 73 75 70 70 6f 72 74 0a 20 20 20 20   to support.    
1a5e0 2a 2a 20 6c 65 67 61 63 79 20 73 63 72 69 70 74  ** legacy script
1a5f0 73 2e 20 20 41 6c 6c 20 6e 65 77 20 73 63 72 69  s.  All new scri
1a600 70 74 73 20 73 68 6f 75 6c 64 20 75 73 65 20 6f  pts should use o
1a610 6e 6c 79 20 74 68 65 20 22 73 71 6c 69 74 65 33  nly the "sqlite3
1a620 22 0a 20 20 20 20 2a 2a 20 63 6f 6d 6d 61 6e 64  ".    ** command
1a630 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 43 72 65  . */.    Tcl_Cre
1a640 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e  ateObjCommand(in
1a650 74 65 72 70 2c 20 22 73 71 6c 69 74 65 22 2c 20  terp, "sqlite", 
1a660 28 54 63 6c 5f 4f 62 6a 43 6d 64 50 72 6f 63 2a  (Tcl_ObjCmdProc*
1a670 29 44 62 4d 61 69 6e 2c 20 30 2c 20 30 29 3b 0a  )DbMain, 0, 0);.
1a680 23 65 6e 64 69 66 0a 20 20 20 20 72 63 20 3d 20  #endif.    rc = 
1a690 54 63 6c 5f 50 6b 67 50 72 6f 76 69 64 65 28 69  Tcl_PkgProvide(i
1a6a0 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 33 22  nterp, "sqlite3"
1a6b0 2c 20 50 41 43 4b 41 47 45 5f 56 45 52 53 49 4f  , PACKAGE_VERSIO
1a6c0 4e 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  N);.  }.  return
1a6d0 20 72 63 3b 0a 7d 0a 45 58 54 45 52 4e 20 69 6e   rc;.}.EXTERN in
1a6e0 74 20 54 63 6c 73 71 6c 69 74 65 33 5f 49 6e 69  t Tclsqlite3_Ini
1a6f0 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  t(Tcl_Interp *in
1a700 74 65 72 70 29 7b 20 72 65 74 75 72 6e 20 53 71  terp){ return Sq
1a710 6c 69 74 65 33 5f 49 6e 69 74 28 69 6e 74 65 72  lite3_Init(inter
1a720 70 29 3b 20 7d 0a 45 58 54 45 52 4e 20 69 6e 74  p); }.EXTERN int
1a730 20 53 71 6c 69 74 65 33 5f 55 6e 6c 6f 61 64 28   Sqlite3_Unload(
1a740 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
1a750 72 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 20  rp, int flags){ 
1a760 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 7d  return TCL_OK; }
1a770 0a 45 58 54 45 52 4e 20 69 6e 74 20 54 63 6c 73  .EXTERN int Tcls
1a780 71 6c 69 74 65 33 5f 55 6e 6c 6f 61 64 28 54 63  qlite3_Unload(Tc
1a790 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
1a7a0 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 20 72 65  , int flags){ re
1a7b0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 7d 0a 0a  turn TCL_OK; }..
1a7c0 2f 2a 20 42 65 63 61 75 73 65 20 69 74 20 61 63  /* Because it ac
1a7d0 63 65 73 73 65 73 20 74 68 65 20 66 69 6c 65 2d  cesses the file-
1a7e0 73 79 73 74 65 6d 20 61 6e 64 20 75 73 65 73 20  system and uses 
1a7f0 70 65 72 73 69 73 74 65 6e 74 20 73 74 61 74 65  persistent state
1a800 2c 20 53 51 4c 69 74 65 0a 2a 2a 20 69 73 20 6e  , SQLite.** is n
1a810 6f 74 20 63 6f 6e 73 69 64 65 72 65 64 20 61 70  ot considered ap
1a820 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 73 61  propriate for sa
1a830 66 65 20 69 6e 74 65 72 70 72 65 74 65 72 73 2e  fe interpreters.
1a840 20 20 48 65 6e 63 65 2c 20 77 65 20 63 61 75 73    Hence, we caus
1a850 65 0a 2a 2a 20 74 68 65 20 5f 53 61 66 65 49 6e  e.** the _SafeIn
1a860 69 74 28 29 20 69 6e 74 65 72 66 61 63 65 73 20  it() interfaces 
1a870 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1a880 2e 0a 2a 2f 0a 45 58 54 45 52 4e 20 69 6e 74 20  ..*/.EXTERN int 
1a890 53 71 6c 69 74 65 33 5f 53 61 66 65 49 6e 69 74  Sqlite3_SafeInit
1a8a0 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74  (Tcl_Interp *int
1a8b0 65 72 70 29 7b 20 72 65 74 75 72 6e 20 54 43 4c  erp){ return TCL
1a8c0 5f 45 52 52 4f 52 3b 20 7d 0a 45 58 54 45 52 4e  _ERROR; }.EXTERN
1a8d0 20 69 6e 74 20 53 71 6c 69 74 65 33 5f 53 61 66   int Sqlite3_Saf
1a8e0 65 55 6e 6c 6f 61 64 28 54 63 6c 5f 49 6e 74 65  eUnload(Tcl_Inte
1a8f0 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20  rp *interp, int 
1a900 66 6c 61 67 73 29 7b 72 65 74 75 72 6e 20 54 43  flags){return TC
1a910 4c 5f 45 52 52 4f 52 3b 7d 0a 0a 0a 0a 23 69 66  L_ERROR;}....#if
1a920 6e 64 65 66 20 53 51 4c 49 54 45 5f 33 5f 53 55  ndef SQLITE_3_SU
1a930 46 46 49 58 5f 4f 4e 4c 59 0a 69 6e 74 20 53 71  FFIX_ONLY.int Sq
1a940 6c 69 74 65 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  lite_Init(Tcl_In
1a950 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 20 72  terp *interp){ r
1a960 65 74 75 72 6e 20 53 71 6c 69 74 65 33 5f 49 6e  eturn Sqlite3_In
1a970 69 74 28 69 6e 74 65 72 70 29 3b 20 7d 0a 69 6e  it(interp); }.in
1a980 74 20 54 63 6c 73 71 6c 69 74 65 5f 49 6e 69 74  t Tclsqlite_Init
1a990 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74  (Tcl_Interp *int
1a9a0 65 72 70 29 7b 20 72 65 74 75 72 6e 20 53 71 6c  erp){ return Sql
1a9b0 69 74 65 33 5f 49 6e 69 74 28 69 6e 74 65 72 70  ite3_Init(interp
1a9c0 29 3b 20 7d 0a 69 6e 74 20 53 71 6c 69 74 65 5f  ); }.int Sqlite_
1a9d0 55 6e 6c 6f 61 64 28 54 63 6c 5f 49 6e 74 65 72  Unload(Tcl_Inter
1a9e0 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 66  p *interp, int f
1a9f0 6c 61 67 73 29 7b 20 72 65 74 75 72 6e 20 54 43  lags){ return TC
1aa00 4c 5f 4f 4b 3b 20 7d 0a 69 6e 74 20 54 63 6c 73  L_OK; }.int Tcls
1aa10 71 6c 69 74 65 5f 55 6e 6c 6f 61 64 28 54 63 6c  qlite_Unload(Tcl
1aa20 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
1aa30 20 69 6e 74 20 66 6c 61 67 73 29 7b 20 72 65 74   int flags){ ret
1aa40 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 7d 0a 23 65  urn TCL_OK; }.#e
1aa50 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 54 43 4c  ndif..#ifdef TCL
1aa60 53 48 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  SH./************
1aa70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1aa80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
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 0a 2a 2a 20 41 6c 6c 20 6f 66 20 74 68 65 20  *.** All of the 
1aac0 63 6f 64 65 20 74 68 61 74 20 66 6f 6c 6c 6f 77  code that follow
1aad0 73 20 69 73 20 75 73 65 64 20 74 6f 20 62 75 69  s is used to bui
1aae0 6c 64 20 73 74 61 6e 64 61 6c 6f 6e 65 20 54 43  ld standalone TC
1aaf0 4c 20 69 6e 74 65 72 70 72 65 74 65 72 73 0a 2a  L interpreters.*
1ab00 2a 20 74 68 61 74 20 61 72 65 20 73 74 61 74 69  * that are stati
1ab10 63 61 6c 6c 79 20 6c 69 6e 6b 65 64 20 77 69 74  cally linked wit
1ab20 68 20 53 51 4c 69 74 65 2e 20 20 45 6e 61 62 6c  h SQLite.  Enabl
1ab30 65 20 74 68 65 73 65 20 62 79 20 63 6f 6d 70 69  e these by compi
1ab40 6c 69 6e 67 0a 2a 2a 20 77 69 74 68 20 2d 44 54  ling.** with -DT
1ab50 43 4c 53 48 3d 6e 20 77 68 65 72 65 20 6e 20 63  CLSH=n where n c
1ab60 61 6e 20 62 65 20 31 20 6f 72 20 32 2e 20 20 41  an be 1 or 2.  A
1ab70 6e 20 6e 20 6f 66 20 31 20 67 65 6e 65 72 61 74  n n of 1 generat
1ab80 65 73 20 61 20 73 74 61 6e 64 61 72 64 0a 2a 2a  es a standard.**
1ab90 20 74 63 6c 73 68 20 62 75 74 20 77 69 74 68 20   tclsh but with 
1aba0 53 51 4c 69 74 65 20 62 75 69 6c 74 20 69 6e 2e  SQLite built in.
1abb0 20 20 41 6e 20 6e 20 6f 66 20 32 20 67 65 6e 65    An n of 2 gene
1abc0 72 61 74 65 73 20 74 68 65 20 53 51 4c 69 74 65  rates the SQLite
1abd0 20 73 70 61 63 65 0a 2a 2a 20 61 6e 61 6c 79 73   space.** analys
1abe0 69 73 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 0a  is program..*/..
1abf0 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
1ac00 54 45 5f 54 45 53 54 29 20 7c 7c 20 64 65 66 69  TE_TEST) || defi
1ac10 6e 65 64 28 53 51 4c 49 54 45 5f 54 43 4c 4d 44  ned(SQLITE_TCLMD
1ac20 35 29 0a 2f 2a 0a 20 2a 20 54 68 69 73 20 63 6f  5)./*. * This co
1ac30 64 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68  de implements th
1ac40 65 20 4d 44 35 20 6d 65 73 73 61 67 65 2d 64 69  e MD5 message-di
1ac50 67 65 73 74 20 61 6c 67 6f 72 69 74 68 6d 2e 0a  gest algorithm..
1ac60 20 2a 20 54 68 65 20 61 6c 67 6f 72 69 74 68 6d   * The algorithm
1ac70 20 69 73 20 64 75 65 20 74 6f 20 52 6f 6e 20 52   is due to Ron R
1ac80 69 76 65 73 74 2e 20 20 54 68 69 73 20 63 6f 64  ivest.  This cod
1ac90 65 20 77 61 73 0a 20 2a 20 77 72 69 74 74 65 6e  e was. * written
1aca0 20 62 79 20 43 6f 6c 69 6e 20 50 6c 75 6d 62 20   by Colin Plumb 
1acb0 69 6e 20 31 39 39 33 2c 20 6e 6f 20 63 6f 70 79  in 1993, no copy
1acc0 72 69 67 68 74 20 69 73 20 63 6c 61 69 6d 65 64  right is claimed
1acd0 2e 0a 20 2a 20 54 68 69 73 20 63 6f 64 65 20 69  .. * This code i
1ace0 73 20 69 6e 20 74 68 65 20 70 75 62 6c 69 63 20  s in the public 
1acf0 64 6f 6d 61 69 6e 3b 20 64 6f 20 77 69 74 68 20  domain; do with 
1ad00 69 74 20 77 68 61 74 20 79 6f 75 20 77 69 73 68  it what you wish
1ad10 2e 0a 20 2a 0a 20 2a 20 45 71 75 69 76 61 6c 65  .. *. * Equivale
1ad20 6e 74 20 63 6f 64 65 20 69 73 20 61 76 61 69 6c  nt code is avail
1ad30 61 62 6c 65 20 66 72 6f 6d 20 52 53 41 20 44 61  able from RSA Da
1ad40 74 61 20 53 65 63 75 72 69 74 79 2c 20 49 6e 63  ta Security, Inc
1ad50 2e 0a 20 2a 20 54 68 69 73 20 63 6f 64 65 20 68  .. * This code h
1ad60 61 73 20 62 65 65 6e 20 74 65 73 74 65 64 20 61  as been tested a
1ad70 67 61 69 6e 73 74 20 74 68 61 74 2c 20 61 6e 64  gainst that, and
1ad80 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 2c 0a   is equivalent,.
1ad90 20 2a 20 65 78 63 65 70 74 20 74 68 61 74 20 79   * except that y
1ada0 6f 75 20 64 6f 6e 27 74 20 6e 65 65 64 20 74 6f  ou don't need to
1adb0 20 69 6e 63 6c 75 64 65 20 74 77 6f 20 70 61 67   include two pag
1adc0 65 73 20 6f 66 20 6c 65 67 61 6c 65 73 65 0a 20  es of legalese. 
1add0 2a 20 77 69 74 68 20 65 76 65 72 79 20 63 6f 70  * with every cop
1ade0 79 2e 0a 20 2a 0a 20 2a 20 54 6f 20 63 6f 6d 70  y.. *. * To comp
1adf0 75 74 65 20 74 68 65 20 6d 65 73 73 61 67 65 20  ute the message 
1ae00 64 69 67 65 73 74 20 6f 66 20 61 20 63 68 75 6e  digest of a chun
1ae10 6b 20 6f 66 20 62 79 74 65 73 2c 20 64 65 63 6c  k of bytes, decl
1ae20 61 72 65 20 61 6e 0a 20 2a 20 4d 44 35 43 6f 6e  are an. * MD5Con
1ae30 74 65 78 74 20 73 74 72 75 63 74 75 72 65 2c 20  text structure, 
1ae40 70 61 73 73 20 69 74 20 74 6f 20 4d 44 35 49 6e  pass it to MD5In
1ae50 69 74 2c 20 63 61 6c 6c 20 4d 44 35 55 70 64 61  it, call MD5Upda
1ae60 74 65 20 61 73 0a 20 2a 20 6e 65 65 64 65 64 20  te as. * needed 
1ae70 6f 6e 20 62 75 66 66 65 72 73 20 66 75 6c 6c 20  on buffers full 
1ae80 6f 66 20 62 79 74 65 73 2c 20 61 6e 64 20 74 68  of bytes, and th
1ae90 65 6e 20 63 61 6c 6c 20 4d 44 35 46 69 6e 61 6c  en call MD5Final
1aea0 2c 20 77 68 69 63 68 0a 20 2a 20 77 69 6c 6c 20  , which. * will 
1aeb0 66 69 6c 6c 20 61 20 73 75 70 70 6c 69 65 64 20  fill a supplied 
1aec0 31 36 2d 62 79 74 65 20 61 72 72 61 79 20 77 69  16-byte array wi
1aed0 74 68 20 74 68 65 20 64 69 67 65 73 74 2e 0a 20  th the digest.. 
1aee0 2a 2f 0a 0a 2f 2a 0a 20 2a 20 49 66 20 63 6f 6d  */../*. * If com
1aef0 70 69 6c 65 64 20 6f 6e 20 61 20 6d 61 63 68 69  piled on a machi
1af00 6e 65 20 74 68 61 74 20 64 6f 65 73 6e 27 74 20  ne that doesn't 
1af10 68 61 76 65 20 61 20 33 32 2d 62 69 74 20 69 6e  have a 32-bit in
1af20 74 65 67 65 72 2c 0a 20 2a 20 79 6f 75 20 6a 75  teger,. * you ju
1af30 73 74 20 73 65 74 20 22 75 69 6e 74 33 32 22 20  st set "uint32" 
1af40 74 6f 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  to the appropria
1af50 74 65 20 64 61 74 61 74 79 70 65 20 66 6f 72 20  te datatype for 
1af60 61 6e 0a 20 2a 20 75 6e 73 69 67 6e 65 64 20 33  an. * unsigned 3
1af70 32 2d 62 69 74 20 69 6e 74 65 67 65 72 2e 20 20  2-bit integer.  
1af80 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 20 2a 0a  For example:. *.
1af90 20 2a 20 20 20 20 20 20 20 63 63 20 2d 44 75 69   *       cc -Dui
1afa0 6e 74 33 32 3d 27 75 6e 73 69 67 6e 65 64 20 6c  nt32='unsigned l
1afb0 6f 6e 67 27 20 6d 64 35 2e 63 0a 20 2a 0a 20 2a  ong' md5.c. *. *
1afc0 2f 0a 23 69 66 6e 64 65 66 20 75 69 6e 74 33 32  /.#ifndef uint32
1afd0 0a 23 20 20 64 65 66 69 6e 65 20 75 69 6e 74 33  .#  define uint3
1afe0 32 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 0a 23  2 unsigned int.#
1aff0 65 6e 64 69 66 0a 0a 73 74 72 75 63 74 20 4d 44  endif..struct MD
1b000 35 43 6f 6e 74 65 78 74 20 7b 0a 20 20 69 6e 74  5Context {.  int
1b010 20 69 73 49 6e 69 74 3b 0a 20 20 75 69 6e 74 33   isInit;.  uint3
1b020 32 20 62 75 66 5b 34 5d 3b 0a 20 20 75 69 6e 74  2 buf[4];.  uint
1b030 33 32 20 62 69 74 73 5b 32 5d 3b 0a 20 20 75 6e  32 bits[2];.  un
1b040 73 69 67 6e 65 64 20 63 68 61 72 20 69 6e 5b 36  signed char in[6
1b050 34 5d 3b 0a 7d 3b 0a 74 79 70 65 64 65 66 20 73  4];.};.typedef s
1b060 74 72 75 63 74 20 4d 44 35 43 6f 6e 74 65 78 74  truct MD5Context
1b070 20 4d 44 35 43 6f 6e 74 65 78 74 3b 0a 0a 2f 2a   MD5Context;../*
1b080 0a 20 2a 20 4e 6f 74 65 3a 20 74 68 69 73 20 63  . * Note: this c
1b090 6f 64 65 20 69 73 20 68 61 72 6d 6c 65 73 73 20  ode is harmless 
1b0a0 6f 6e 20 6c 69 74 74 6c 65 2d 65 6e 64 69 61 6e  on little-endian
1b0b0 20 6d 61 63 68 69 6e 65 73 2e 0a 20 2a 2f 0a 73   machines.. */.s
1b0c0 74 61 74 69 63 20 76 6f 69 64 20 62 79 74 65 52  tatic void byteR
1b0d0 65 76 65 72 73 65 20 28 75 6e 73 69 67 6e 65 64  everse (unsigned
1b0e0 20 63 68 61 72 20 2a 62 75 66 2c 20 75 6e 73 69   char *buf, unsi
1b0f0 67 6e 65 64 20 6c 6f 6e 67 73 29 7b 0a 20 20 20  gned longs){.   
1b100 20 20 20 20 20 75 69 6e 74 33 32 20 74 3b 0a 20       uint32 t;. 
1b110 20 20 20 20 20 20 20 64 6f 20 7b 0a 20 20 20 20         do {.    
1b120 20 20 20 20 20 20 20 20 20 20 20 20 74 20 3d 20              t = 
1b130 28 75 69 6e 74 33 32 29 28 28 75 6e 73 69 67 6e  (uint32)((unsign
1b140 65 64 29 62 75 66 5b 33 5d 3c 3c 38 20 7c 20 62  ed)buf[3]<<8 | b
1b150 75 66 5b 32 5d 29 20 3c 3c 20 31 36 20 7c 0a 20  uf[2]) << 16 |. 
1b160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b170 20 20 20 20 20 20 20 20 20 20 20 28 28 75 6e 73             ((uns
1b180 69 67 6e 65 64 29 62 75 66 5b 31 5d 3c 3c 38 20  igned)buf[1]<<8 
1b190 7c 20 62 75 66 5b 30 5d 29 3b 0a 20 20 20 20 20  | buf[0]);.     
1b1a0 20 20 20 20 20 20 20 20 20 20 20 2a 28 75 69 6e             *(uin
1b1b0 74 33 32 20 2a 29 62 75 66 20 3d 20 74 3b 0a 20  t32 *)buf = t;. 
1b1c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
1b1d0 75 66 20 2b 3d 20 34 3b 0a 20 20 20 20 20 20 20  uf += 4;.       
1b1e0 20 7d 20 77 68 69 6c 65 20 28 2d 2d 6c 6f 6e 67   } while (--long
1b1f0 73 29 3b 0a 7d 0a 2f 2a 20 54 68 65 20 66 6f 75  s);.}./* The fou
1b200 72 20 63 6f 72 65 20 66 75 6e 63 74 69 6f 6e 73  r core functions
1b210 20 2d 20 46 31 20 69 73 20 6f 70 74 69 6d 69 7a   - F1 is optimiz
1b220 65 64 20 73 6f 6d 65 77 68 61 74 20 2a 2f 0a 0a  ed somewhat */..
1b230 2f 2a 20 23 64 65 66 69 6e 65 20 46 31 28 78 2c  /* #define F1(x,
1b240 20 79 2c 20 7a 29 20 28 78 20 26 20 79 20 7c 20   y, z) (x & y | 
1b250 7e 78 20 26 20 7a 29 20 2a 2f 0a 23 64 65 66 69  ~x & z) */.#defi
1b260 6e 65 20 46 31 28 78 2c 20 79 2c 20 7a 29 20 28  ne F1(x, y, z) (
1b270 7a 20 5e 20 28 78 20 26 20 28 79 20 5e 20 7a 29  z ^ (x & (y ^ z)
1b280 29 29 0a 23 64 65 66 69 6e 65 20 46 32 28 78 2c  )).#define F2(x,
1b290 20 79 2c 20 7a 29 20 46 31 28 7a 2c 20 78 2c 20   y, z) F1(z, x, 
1b2a0 79 29 0a 23 64 65 66 69 6e 65 20 46 33 28 78 2c  y).#define F3(x,
1b2b0 20 79 2c 20 7a 29 20 28 78 20 5e 20 79 20 5e 20   y, z) (x ^ y ^ 
1b2c0 7a 29 0a 23 64 65 66 69 6e 65 20 46 34 28 78 2c  z).#define F4(x,
1b2d0 20 79 2c 20 7a 29 20 28 79 20 5e 20 28 78 20 7c   y, z) (y ^ (x |
1b2e0 20 7e 7a 29 29 0a 0a 2f 2a 20 54 68 69 73 20 69   ~z))../* This i
1b2f0 73 20 74 68 65 20 63 65 6e 74 72 61 6c 20 73 74  s the central st
1b300 65 70 20 69 6e 20 74 68 65 20 4d 44 35 20 61 6c  ep in the MD5 al
1b310 67 6f 72 69 74 68 6d 2e 20 2a 2f 0a 23 64 65 66  gorithm. */.#def
1b320 69 6e 65 20 4d 44 35 53 54 45 50 28 66 2c 20 77  ine MD5STEP(f, w
1b330 2c 20 78 2c 20 79 2c 20 7a 2c 20 64 61 74 61 2c  , x, y, z, data,
1b340 20 73 29 20 5c 0a 20 20 20 20 20 20 20 20 28 20   s) \.        ( 
1b350 77 20 2b 3d 20 66 28 78 2c 20 79 2c 20 7a 29 20  w += f(x, y, z) 
1b360 2b 20 64 61 74 61 2c 20 20 77 20 3d 20 77 3c 3c  + data,  w = w<<
1b370 73 20 7c 20 77 3e 3e 28 33 32 2d 73 29 2c 20 20  s | w>>(32-s),  
1b380 77 20 2b 3d 20 78 20 29 0a 0a 2f 2a 0a 20 2a 20  w += x )../*. * 
1b390 54 68 65 20 63 6f 72 65 20 6f 66 20 74 68 65 20  The core of the 
1b3a0 4d 44 35 20 61 6c 67 6f 72 69 74 68 6d 2c 20 74  MD5 algorithm, t
1b3b0 68 69 73 20 61 6c 74 65 72 73 20 61 6e 20 65 78  his alters an ex
1b3c0 69 73 74 69 6e 67 20 4d 44 35 20 68 61 73 68 20  isting MD5 hash 
1b3d0 74 6f 0a 20 2a 20 72 65 66 6c 65 63 74 20 74 68  to. * reflect th
1b3e0 65 20 61 64 64 69 74 69 6f 6e 20 6f 66 20 31 36  e addition of 16
1b3f0 20 6c 6f 6e 67 77 6f 72 64 73 20 6f 66 20 6e 65   longwords of ne
1b400 77 20 64 61 74 61 2e 20 20 4d 44 35 55 70 64 61  w data.  MD5Upda
1b410 74 65 20 62 6c 6f 63 6b 73 0a 20 2a 20 74 68 65  te blocks. * the
1b420 20 64 61 74 61 20 61 6e 64 20 63 6f 6e 76 65 72   data and conver
1b430 74 73 20 62 79 74 65 73 20 69 6e 74 6f 20 6c 6f  ts bytes into lo
1b440 6e 67 77 6f 72 64 73 20 66 6f 72 20 74 68 69 73  ngwords for this
1b450 20 72 6f 75 74 69 6e 65 2e 0a 20 2a 2f 0a 73 74   routine.. */.st
1b460 61 74 69 63 20 76 6f 69 64 20 4d 44 35 54 72 61  atic void MD5Tra
1b470 6e 73 66 6f 72 6d 28 75 69 6e 74 33 32 20 62 75  nsform(uint32 bu
1b480 66 5b 34 5d 2c 20 63 6f 6e 73 74 20 75 69 6e 74  f[4], const uint
1b490 33 32 20 69 6e 5b 31 36 5d 29 7b 0a 20 20 20 20  32 in[16]){.    
1b4a0 20 20 20 20 72 65 67 69 73 74 65 72 20 75 69 6e      register uin
1b4b0 74 33 32 20 61 2c 20 62 2c 20 63 2c 20 64 3b 0a  t32 a, b, c, d;.
1b4c0 0a 20 20 20 20 20 20 20 20 61 20 3d 20 62 75 66  .        a = buf
1b4d0 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20 62 20 3d  [0];.        b =
1b4e0 20 62 75 66 5b 31 5d 3b 0a 20 20 20 20 20 20 20   buf[1];.       
1b4f0 20 63 20 3d 20 62 75 66 5b 32 5d 3b 0a 20 20 20   c = buf[2];.   
1b500 20 20 20 20 20 64 20 3d 20 62 75 66 5b 33 5d 3b       d = buf[3];
1b510 0a 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45  ..        MD5STE
1b520 50 28 46 31 2c 20 61 2c 20 62 2c 20 63 2c 20 64  P(F1, a, b, c, d
1b530 2c 20 69 6e 5b 20 30 5d 2b 30 78 64 37 36 61 61  , in[ 0]+0xd76aa
1b540 34 37 38 2c 20 20 37 29 3b 0a 20 20 20 20 20 20  478,  7);.      
1b550 20 20 4d 44 35 53 54 45 50 28 46 31 2c 20 64 2c    MD5STEP(F1, d,
1b560 20 61 2c 20 62 2c 20 63 2c 20 69 6e 5b 20 31 5d   a, b, c, in[ 1]
1b570 2b 30 78 65 38 63 37 62 37 35 36 2c 20 31 32 29  +0xe8c7b756, 12)
1b580 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45  ;.        MD5STE
1b590 50 28 46 31 2c 20 63 2c 20 64 2c 20 61 2c 20 62  P(F1, c, d, a, b
1b5a0 2c 20 69 6e 5b 20 32 5d 2b 30 78 32 34 32 30 37  , in[ 2]+0x24207
1b5b0 30 64 62 2c 20 31 37 29 3b 0a 20 20 20 20 20 20  0db, 17);.      
1b5c0 20 20 4d 44 35 53 54 45 50 28 46 31 2c 20 62 2c    MD5STEP(F1, b,
1b5d0 20 63 2c 20 64 2c 20 61 2c 20 69 6e 5b 20 33 5d   c, d, a, in[ 3]
1b5e0 2b 30 78 63 31 62 64 63 65 65 65 2c 20 32 32 29  +0xc1bdceee, 22)
1b5f0 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45  ;.        MD5STE
1b600 50 28 46 31 2c 20 61 2c 20 62 2c 20 63 2c 20 64  P(F1, a, b, c, d
1b610 2c 20 69 6e 5b 20 34 5d 2b 30 78 66 35 37 63 30  , in[ 4]+0xf57c0
1b620 66 61 66 2c 20 20 37 29 3b 0a 20 20 20 20 20 20  faf,  7);.      
1b630 20 20 4d 44 35 53 54 45 50 28 46 31 2c 20 64 2c    MD5STEP(F1, d,
1b640 20 61 2c 20 62 2c 20 63 2c 20 69 6e 5b 20 35 5d   a, b, c, in[ 5]
1b650 2b 30 78 34 37 38 37 63 36 32 61 2c 20 31 32 29  +0x4787c62a, 12)
1b660 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45  ;.        MD5STE
1b670 50 28 46 31 2c 20 63 2c 20 64 2c 20 61 2c 20 62  P(F1, c, d, a, b
1b680 2c 20 69 6e 5b 20 36 5d 2b 30 78 61 38 33 30 34  , in[ 6]+0xa8304
1b690 36 31 33 2c 20 31 37 29 3b 0a 20 20 20 20 20 20  613, 17);.      
1b6a0 20 20 4d 44 35 53 54 45 50 28 46 31 2c 20 62 2c    MD5STEP(F1, b,
1b6b0 20 63 2c 20 64 2c 20 61 2c 20 69 6e 5b 20 37 5d   c, d, a, in[ 7]
1b6c0 2b 30 78 66 64 34 36 39 35 30 31 2c 20 32 32 29  +0xfd469501, 22)
1b6d0 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45  ;.        MD5STE
1b6e0 50 28 46 31 2c 20 61 2c 20 62 2c 20 63 2c 20 64  P(F1, a, b, c, d
1b6f0 2c 20 69 6e 5b 20 38 5d 2b 30 78 36 39 38 30 39  , in[ 8]+0x69809
1b700 38 64 38 2c 20 20 37 29 3b 0a 20 20 20 20 20 20  8d8,  7);.      
1b710 20 20 4d 44 35 53 54 45 50 28 46 31 2c 20 64 2c    MD5STEP(F1, d,
1b720 20 61 2c 20 62 2c 20 63 2c 20 69 6e 5b 20 39 5d   a, b, c, in[ 9]
1b730 2b 30 78 38 62 34 34 66 37 61 66 2c 20 31 32 29  +0x8b44f7af, 12)
1b740 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45  ;.        MD5STE
1b750 50 28 46 31 2c 20 63 2c 20 64 2c 20 61 2c 20 62  P(F1, c, d, a, b
1b760 2c 20 69 6e 5b 31 30 5d 2b 30 78 66 66 66 66 35  , in[10]+0xffff5
1b770 62 62 31 2c 20 31 37 29 3b 0a 20 20 20 20 20 20  bb1, 17);.      
1b780 20 20 4d 44 35 53 54 45 50 28 46 31 2c 20 62 2c    MD5STEP(F1, b,
1b790 20 63 2c 20 64 2c 20 61 2c 20 69 6e 5b 31 31 5d   c, d, a, in[11]
1b7a0 2b 30 78 38 39 35 63 64 37 62 65 2c 20 32 32 29  +0x895cd7be, 22)
1b7b0 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45  ;.        MD5STE
1b7c0 50 28 46 31 2c 20 61 2c 20 62 2c 20 63 2c 20 64  P(F1, a, b, c, d
1b7d0 2c 20 69 6e 5b 31 32 5d 2b 30 78 36 62 39 30 31  , in[12]+0x6b901
1b7e0 31 32 32 2c 20 20 37 29 3b 0a 20 20 20 20 20 20  122,  7);.      
1b7f0 20 20 4d 44 35 53 54 45 50 28 46 31 2c 20 64 2c    MD5STEP(F1, d,
1b800 20 61 2c 20 62 2c 20 63 2c 20 69 6e 5b 31 33 5d   a, b, c, in[13]
1b810 2b 30 78 66 64 39 38 37 31 39 33 2c 20 31 32 29  +0xfd987193, 12)
1b820 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45  ;.        MD5STE
1b830 50 28 46 31 2c 20 63 2c 20 64 2c 20 61 2c 20 62  P(F1, c, d, a, b
1b840 2c 20 69 6e 5b 31 34 5d 2b 30 78 61 36 37 39 34  , in[14]+0xa6794
1b850 33 38 65 2c 20 31 37 29 3b 0a 20 20 20 20 20 20  38e, 17);.      
1b860 20 20 4d 44 35 53 54 45 50 28 46 31 2c 20 62 2c    MD5STEP(F1, b,
1b870 20 63 2c 20 64 2c 20 61 2c 20 69 6e 5b 31 35 5d   c, d, a, in[15]
1b880 2b 30 78 34 39 62 34 30 38 32 31 2c 20 32 32 29  +0x49b40821, 22)
1b890 3b 0a 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54  ;..        MD5ST
1b8a0 45 50 28 46 32 2c 20 61 2c 20 62 2c 20 63 2c 20  EP(F2, a, b, c, 
1b8b0 64 2c 20 69 6e 5b 20 31 5d 2b 30 78 66 36 31 65  d, in[ 1]+0xf61e
1b8c0 32 35 36 32 2c 20 20 35 29 3b 0a 20 20 20 20 20  2562,  5);.     
1b8d0 20 20 20 4d 44 35 53 54 45 50 28 46 32 2c 20 64     MD5STEP(F2, d
1b8e0 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e 5b 20 36  , a, b, c, in[ 6
1b8f0 5d 2b 30 78 63 30 34 30 62 33 34 30 2c 20 20 39  ]+0xc040b340,  9
1b900 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54  );.        MD5ST
1b910 45 50 28 46 32 2c 20 63 2c 20 64 2c 20 61 2c 20  EP(F2, c, d, a, 
1b920 62 2c 20 69 6e 5b 31 31 5d 2b 30 78 32 36 35 65  b, in[11]+0x265e
1b930 35 61 35 31 2c 20 31 34 29 3b 0a 20 20 20 20 20  5a51, 14);.     
1b940 20 20 20 4d 44 35 53 54 45 50 28 46 32 2c 20 62     MD5STEP(F2, b
1b950 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e 5b 20 30  , c, d, a, in[ 0
1b960 5d 2b 30 78 65 39 62 36 63 37 61 61 2c 20 32 30  ]+0xe9b6c7aa, 20
1b970 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54  );.        MD5ST
1b980 45 50 28 46 32 2c 20 61 2c 20 62 2c 20 63 2c 20  EP(F2, a, b, c, 
1b990 64 2c 20 69 6e 5b 20 35 5d 2b 30 78 64 36 32 66  d, in[ 5]+0xd62f
1b9a0 31 30 35 64 2c 20 20 35 29 3b 0a 20 20 20 20 20  105d,  5);.     
1b9b0 20 20 20 4d 44 35 53 54 45 50 28 46 32 2c 20 64     MD5STEP(F2, d
1b9c0 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e 5b 31 30  , a, b, c, in[10
1b9d0 5d 2b 30 78 30 32 34 34 31 34 35 33 2c 20 20 39  ]+0x02441453,  9
1b9e0 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54  );.        MD5ST
1b9f0 45 50 28 46 32 2c 20 63 2c 20 64 2c 20 61 2c 20  EP(F2, c, d, a, 
1ba00 62 2c 20 69 6e 5b 31 35 5d 2b 30 78 64 38 61 31  b, in[15]+0xd8a1
1ba10 65 36 38 31 2c 20 31 34 29 3b 0a 20 20 20 20 20  e681, 14);.     
1ba20 20 20 20 4d 44 35 53 54 45 50 28 46 32 2c 20 62     MD5STEP(F2, b
1ba30 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e 5b 20 34  , c, d, a, in[ 4
1ba40 5d 2b 30 78 65 37 64 33 66 62 63 38 2c 20 32 30  ]+0xe7d3fbc8, 20
1ba50 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54  );.        MD5ST
1ba60 45 50 28 46 32 2c 20 61 2c 20 62 2c 20 63 2c 20  EP(F2, a, b, c, 
1ba70 64 2c 20 69 6e 5b 20 39 5d 2b 30 78 32 31 65 31  d, in[ 9]+0x21e1
1ba80 63 64 65 36 2c 20 20 35 29 3b 0a 20 20 20 20 20  cde6,  5);.     
1ba90 20 20 20 4d 44 35 53 54 45 50 28 46 32 2c 20 64     MD5STEP(F2, d
1baa0 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e 5b 31 34  , a, b, c, in[14
1bab0 5d 2b 30 78 63 33 33 37 30 37 64 36 2c 20 20 39  ]+0xc33707d6,  9
1bac0 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54  );.        MD5ST
1bad0 45 50 28 46 32 2c 20 63 2c 20 64 2c 20 61 2c 20  EP(F2, c, d, a, 
1bae0 62 2c 20 69 6e 5b 20 33 5d 2b 30 78 66 34 64 35  b, in[ 3]+0xf4d5
1baf0 30 64 38 37 2c 20 31 34 29 3b 0a 20 20 20 20 20  0d87, 14);.     
1bb00 20 20 20 4d 44 35 53 54 45 50 28 46 32 2c 20 62     MD5STEP(F2, b
1bb10 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e 5b 20 38  , c, d, a, in[ 8
1bb20 5d 2b 30 78 34 35 35 61 31 34 65 64 2c 20 32 30  ]+0x455a14ed, 20
1bb30 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54  );.        MD5ST
1bb40 45 50 28 46 32 2c 20 61 2c 20 62 2c 20 63 2c 20  EP(F2, a, b, c, 
1bb50 64 2c 20 69 6e 5b 31 33 5d 2b 30 78 61 39 65 33  d, in[13]+0xa9e3
1bb60 65 39 30 35 2c 20 20 35 29 3b 0a 20 20 20 20 20  e905,  5);.     
1bb70 20 20 20 4d 44 35 53 54 45 50 28 46 32 2c 20 64     MD5STEP(F2, d
1bb80 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e 5b 20 32  , a, b, c, in[ 2
1bb90 5d 2b 30 78 66 63 65 66 61 33 66 38 2c 20 20 39  ]+0xfcefa3f8,  9
1bba0 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54  );.        MD5ST
1bbb0 45 50 28 46 32 2c 20 63 2c 20 64 2c 20 61 2c 20  EP(F2, c, d, a, 
1bbc0 62 2c 20 69 6e 5b 20 37 5d 2b 30 78 36 37 36 66  b, in[ 7]+0x676f
1bbd0 30 32 64 39 2c 20 31 34 29 3b 0a 20 20 20 20 20  02d9, 14);.     
1bbe0 20 20 20 4d 44 35 53 54 45 50 28 46 32 2c 20 62     MD5STEP(F2, b
1bbf0 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e 5b 31 32  , c, d, a, in[12
1bc00 5d 2b 30 78 38 64 32 61 34 63 38 61 2c 20 32 30  ]+0x8d2a4c8a, 20
1bc10 29 3b 0a 0a 20 20 20 20 20 20 20 20 4d 44 35 53  );..        MD5S
1bc20 54 45 50 28 46 33 2c 20 61 2c 20 62 2c 20 63 2c  TEP(F3, a, b, c,
1bc30 20 64 2c 20 69 6e 5b 20 35 5d 2b 30 78 66 66 66   d, in[ 5]+0xfff
1bc40 61 33 39 34 32 2c 20 20 34 29 3b 0a 20 20 20 20  a3942,  4);.    
1bc50 20 20 20 20 4d 44 35 53 54 45 50 28 46 33 2c 20      MD5STEP(F3, 
1bc60 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e 5b 20  d, a, b, c, in[ 
1bc70 38 5d 2b 30 78 38 37 37 31 66 36 38 31 2c 20 31  8]+0x8771f681, 1
1bc80 31 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53  1);.        MD5S
1bc90 54 45 50 28 46 33 2c 20 63 2c 20 64 2c 20 61 2c  TEP(F3, c, d, a,
1bca0 20 62 2c 20 69 6e 5b 31 31 5d 2b 30 78 36 64 39   b, in[11]+0x6d9
1bcb0 64 36 31 32 32 2c 20 31 36 29 3b 0a 20 20 20 20  d6122, 16);.    
1bcc0 20 20 20 20 4d 44 35 53 54 45 50 28 46 33 2c 20      MD5STEP(F3, 
1bcd0 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e 5b 31  b, c, d, a, in[1
1bce0 34 5d 2b 30 78 66 64 65 35 33 38 30 63 2c 20 32  4]+0xfde5380c, 2
1bcf0 33 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53  3);.        MD5S
1bd00 54 45 50 28 46 33 2c 20 61 2c 20 62 2c 20 63 2c  TEP(F3, a, b, c,
1bd10 20 64 2c 20 69 6e 5b 20 31 5d 2b 30 78 61 34 62   d, in[ 1]+0xa4b
1bd20 65 65 61 34 34 2c 20 20 34 29 3b 0a 20 20 20 20  eea44,  4);.    
1bd30 20 20 20 20 4d 44 35 53 54 45 50 28 46 33 2c 20      MD5STEP(F3, 
1bd40 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e 5b 20  d, a, b, c, in[ 
1bd50 34 5d 2b 30 78 34 62 64 65 63 66 61 39 2c 20 31  4]+0x4bdecfa9, 1
1bd60 31 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53  1);.        MD5S
1bd70 54 45 50 28 46 33 2c 20 63 2c 20 64 2c 20 61 2c  TEP(F3, c, d, a,
1bd80 20 62 2c 20 69 6e 5b 20 37 5d 2b 30 78 66 36 62   b, in[ 7]+0xf6b
1bd90 62 34 62 36 30 2c 20 31 36 29 3b 0a 20 20 20 20  b4b60, 16);.    
1bda0 20 20 20 20 4d 44 35 53 54 45 50 28 46 33 2c 20      MD5STEP(F3, 
1bdb0 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e 5b 31  b, c, d, a, in[1
1bdc0 30 5d 2b 30 78 62 65 62 66 62 63 37 30 2c 20 32  0]+0xbebfbc70, 2
1bdd0 33 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53  3);.        MD5S
1bde0 54 45 50 28 46 33 2c 20 61 2c 20 62 2c 20 63 2c  TEP(F3, a, b, c,
1bdf0 20 64 2c 20 69 6e 5b 31 33 5d 2b 30 78 32 38 39   d, in[13]+0x289
1be00 62 37 65 63 36 2c 20 20 34 29 3b 0a 20 20 20 20  b7ec6,  4);.    
1be10 20 20 20 20 4d 44 35 53 54 45 50 28 46 33 2c 20      MD5STEP(F3, 
1be20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e 5b 20  d, a, b, c, in[ 
1be30 30 5d 2b 30 78 65 61 61 31 32 37 66 61 2c 20 31  0]+0xeaa127fa, 1
1be40 31 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53  1);.        MD5S
1be50 54 45 50 28 46 33 2c 20 63 2c 20 64 2c 20 61 2c  TEP(F3, c, d, a,
1be60 20 62 2c 20 69 6e 5b 20 33 5d 2b 30 78 64 34 65   b, in[ 3]+0xd4e
1be70 66 33 30 38 35 2c 20 31 36 29 3b 0a 20 20 20 20  f3085, 16);.    
1be80 20 20 20 20 4d 44 35 53 54 45 50 28 46 33 2c 20      MD5STEP(F3, 
1be90 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e 5b 20  b, c, d, a, in[ 
1bea0 36 5d 2b 30 78 30 34 38 38 31 64 30 35 2c 20 32  6]+0x04881d05, 2
1beb0 33 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53  3);.        MD5S
1bec0 54 45 50 28 46 33 2c 20 61 2c 20 62 2c 20 63 2c  TEP(F3, a, b, c,
1bed0 20 64 2c 20 69 6e 5b 20 39 5d 2b 30 78 64 39 64   d, in[ 9]+0xd9d
1bee0 34 64 30 33 39 2c 20 20 34 29 3b 0a 20 20 20 20  4d039,  4);.    
1bef0 20 20 20 20 4d 44 35 53 54 45 50 28 46 33 2c 20      MD5STEP(F3, 
1bf00 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e 5b 31  d, a, b, c, in[1
1bf10 32 5d 2b 30 78 65 36 64 62 39 39 65 35 2c 20 31  2]+0xe6db99e5, 1
1bf20 31 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53  1);.        MD5S
1bf30 54 45 50 28 46 33 2c 20 63 2c 20 64 2c 20 61 2c  TEP(F3, c, d, a,
1bf40 20 62 2c 20 69 6e 5b 31 35 5d 2b 30 78 31 66 61   b, in[15]+0x1fa
1bf50 32 37 63 66 38 2c 20 31 36 29 3b 0a 20 20 20 20  27cf8, 16);.    
1bf60 20 20 20 20 4d 44 35 53 54 45 50 28 46 33 2c 20      MD5STEP(F3, 
1bf70 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e 5b 20  b, c, d, a, in[ 
1bf80 32 5d 2b 30 78 63 34 61 63 35 36 36 35 2c 20 32  2]+0xc4ac5665, 2
1bf90 33 29 3b 0a 0a 20 20 20 20 20 20 20 20 4d 44 35  3);..        MD5
1bfa0 53 54 45 50 28 46 34 2c 20 61 2c 20 62 2c 20 63  STEP(F4, a, b, c
1bfb0 2c 20 64 2c 20 69 6e 5b 20 30 5d 2b 30 78 66 34  , d, in[ 0]+0xf4
1bfc0 32 39 32 32 34 34 2c 20 20 36 29 3b 0a 20 20 20  292244,  6);.   
1bfd0 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 34 2c       MD5STEP(F4,
1bfe0 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e 5b   d, a, b, c, in[
1bff0 20 37 5d 2b 30 78 34 33 32 61 66 66 39 37 2c 20   7]+0x432aff97, 
1c000 31 30 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35  10);.        MD5
1c010 53 54 45 50 28 46 34 2c 20 63 2c 20 64 2c 20 61  STEP(F4, c, d, a
1c020 2c 20 62 2c 20 69 6e 5b 31 34 5d 2b 30 78 61 62  , b, in[14]+0xab
1c030 39 34 32 33 61 37 2c 20 31 35 29 3b 0a 20 20 20  9423a7, 15);.   
1c040 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 34 2c       MD5STEP(F4,
1c050 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e 5b   b, c, d, a, in[
1c060 20 35 5d 2b 30 78 66 63 39 33 61 30 33 39 2c 20   5]+0xfc93a039, 
1c070 32 31 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35  21);.        MD5
1c080 53 54 45 50 28 46 34 2c 20 61 2c 20 62 2c 20 63  STEP(F4, a, b, c
1c090 2c 20 64 2c 20 69 6e 5b 31 32 5d 2b 30 78 36 35  , d, in[12]+0x65
1c0a0 35 62 35 39 63 33 2c 20 20 36 29 3b 0a 20 20 20  5b59c3,  6);.   
1c0b0 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 34 2c       MD5STEP(F4,
1c0c0 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e 5b   d, a, b, c, in[
1c0d0 20 33 5d 2b 30 78 38 66 30 63 63 63 39 32 2c 20   3]+0x8f0ccc92, 
1c0e0 31 30 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35  10);.        MD5
1c0f0 53 54 45 50 28 46 34 2c 20 63 2c 20 64 2c 20 61  STEP(F4, c, d, a
1c100 2c 20 62 2c 20 69 6e 5b 31 30 5d 2b 30 78 66 66  , b, in[10]+0xff
1c110 65 66 66 34 37 64 2c 20 31 35 29 3b 0a 20 20 20  eff47d, 15);.   
1c120 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 34 2c       MD5STEP(F4,
1c130 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e 5b   b, c, d, a, in[
1c140 20 31 5d 2b 30 78 38 35 38 34 35 64 64 31 2c 20   1]+0x85845dd1, 
1c150 32 31 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35  21);.        MD5
1c160 53 54 45 50 28 46 34 2c 20 61 2c 20 62 2c 20 63  STEP(F4, a, b, c
1c170 2c 20 64 2c 20 69 6e 5b 20 38 5d 2b 30 78 36 66  , d, in[ 8]+0x6f
1c180 61 38 37 65 34 66 2c 20 20 36 29 3b 0a 20 20 20  a87e4f,  6);.   
1c190 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 34 2c       MD5STEP(F4,
1c1a0 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e 5b   d, a, b, c, in[
1c1b0 31 35 5d 2b 30 78 66 65 32 63 65 36 65 30 2c 20  15]+0xfe2ce6e0, 
1c1c0 31 30 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35  10);.        MD5
1c1d0 53 54 45 50 28 46 34 2c 20 63 2c 20 64 2c 20 61  STEP(F4, c, d, a
1c1e0 2c 20 62 2c 20 69 6e 5b 20 36 5d 2b 30 78 61 33  , b, in[ 6]+0xa3
1c1f0 30 31 34 33 31 34 2c 20 31 35 29 3b 0a 20 20 20  014314, 15);.   
1c200 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 34 2c       MD5STEP(F4,
1c210 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e 5b   b, c, d, a, in[
1c220 31 33 5d 2b 30 78 34 65 30 38 31 31 61 31 2c 20  13]+0x4e0811a1, 
1c230 32 31 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35  21);.        MD5
1c240 53 54 45 50 28 46 34 2c 20 61 2c 20 62 2c 20 63  STEP(F4, a, b, c
1c250 2c 20 64 2c 20 69 6e 5b 20 34 5d 2b 30 78 66 37  , d, in[ 4]+0xf7
1c260 35 33 37 65 38 32 2c 20 20 36 29 3b 0a 20 20 20  537e82,  6);.   
1c270 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 34 2c       MD5STEP(F4,
1c280 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e 5b   d, a, b, c, in[
1c290 31 31 5d 2b 30 78 62 64 33 61 66 32 33 35 2c 20  11]+0xbd3af235, 
1c2a0 31 30 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35  10);.        MD5
1c2b0 53 54 45 50 28 46 34 2c 20 63 2c 20 64 2c 20 61  STEP(F4, c, d, a
1c2c0 2c 20 62 2c 20 69 6e 5b 20 32 5d 2b 30 78 32 61  , b, in[ 2]+0x2a
1c2d0 64 37 64 32 62 62 2c 20 31 35 29 3b 0a 20 20 20  d7d2bb, 15);.   
1c2e0 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 34 2c       MD5STEP(F4,
1c2f0 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e 5b   b, c, d, a, in[
1c300 20 39 5d 2b 30 78 65 62 38 36 64 33 39 31 2c 20   9]+0xeb86d391, 
1c310 32 31 29 3b 0a 0a 20 20 20 20 20 20 20 20 62 75  21);..        bu
1c320 66 5b 30 5d 20 2b 3d 20 61 3b 0a 20 20 20 20 20  f[0] += a;.     
1c330 20 20 20 62 75 66 5b 31 5d 20 2b 3d 20 62 3b 0a     buf[1] += b;.
1c340 20 20 20 20 20 20 20 20 62 75 66 5b 32 5d 20 2b          buf[2] +
1c350 3d 20 63 3b 0a 20 20 20 20 20 20 20 20 62 75 66  = c;.        buf
1c360 5b 33 5d 20 2b 3d 20 64 3b 0a 7d 0a 0a 2f 2a 0a  [3] += d;.}../*.
1c370 20 2a 20 53 74 61 72 74 20 4d 44 35 20 61 63 63   * Start MD5 acc
1c380 75 6d 75 6c 61 74 69 6f 6e 2e 20 20 53 65 74 20  umulation.  Set 
1c390 62 69 74 20 63 6f 75 6e 74 20 74 6f 20 30 20 61  bit count to 0 a
1c3a0 6e 64 20 62 75 66 66 65 72 20 74 6f 20 6d 79 73  nd buffer to mys
1c3b0 74 65 72 69 6f 75 73 0a 20 2a 20 69 6e 69 74 69  terious. * initi
1c3c0 61 6c 69 7a 61 74 69 6f 6e 20 63 6f 6e 73 74 61  alization consta
1c3d0 6e 74 73 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20  nts.. */.static 
1c3e0 76 6f 69 64 20 4d 44 35 49 6e 69 74 28 4d 44 35  void MD5Init(MD5
1c3f0 43 6f 6e 74 65 78 74 20 2a 63 74 78 29 7b 0a 20  Context *ctx){. 
1c400 20 20 20 20 20 20 20 63 74 78 2d 3e 69 73 49 6e         ctx->isIn
1c410 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  it = 1;.        
1c420 63 74 78 2d 3e 62 75 66 5b 30 5d 20 3d 20 30 78  ctx->buf[0] = 0x
1c430 36 37 34 35 32 33 30 31 3b 0a 20 20 20 20 20 20  67452301;.      
1c440 20 20 63 74 78 2d 3e 62 75 66 5b 31 5d 20 3d 20    ctx->buf[1] = 
1c450 30 78 65 66 63 64 61 62 38 39 3b 0a 20 20 20 20  0xefcdab89;.    
1c460 20 20 20 20 63 74 78 2d 3e 62 75 66 5b 32 5d 20      ctx->buf[2] 
1c470 3d 20 30 78 39 38 62 61 64 63 66 65 3b 0a 20 20  = 0x98badcfe;.  
1c480 20 20 20 20 20 20 63 74 78 2d 3e 62 75 66 5b 33        ctx->buf[3
1c490 5d 20 3d 20 30 78 31 30 33 32 35 34 37 36 3b 0a  ] = 0x10325476;.
1c4a0 20 20 20 20 20 20 20 20 63 74 78 2d 3e 62 69 74          ctx->bit
1c4b0 73 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  s[0] = 0;.      
1c4c0 20 20 63 74 78 2d 3e 62 69 74 73 5b 31 5d 20 3d    ctx->bits[1] =
1c4d0 20 30 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 55 70 64   0;.}../*. * Upd
1c4e0 61 74 65 20 63 6f 6e 74 65 78 74 20 74 6f 20 72  ate context to r
1c4f0 65 66 6c 65 63 74 20 74 68 65 20 63 6f 6e 63 61  eflect the conca
1c500 74 65 6e 61 74 69 6f 6e 20 6f 66 20 61 6e 6f 74  tenation of anot
1c510 68 65 72 20 62 75 66 66 65 72 20 66 75 6c 6c 0a  her buffer full.
1c520 20 2a 20 6f 66 20 62 79 74 65 73 2e 0a 20 2a 2f   * of bytes.. */
1c530 0a 73 74 61 74 69 63 0a 76 6f 69 64 20 4d 44 35  .static.void MD5
1c540 55 70 64 61 74 65 28 4d 44 35 43 6f 6e 74 65 78  Update(MD5Contex
1c550 74 20 2a 63 74 78 2c 20 63 6f 6e 73 74 20 75 6e  t *ctx, const un
1c560 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66  signed char *buf
1c570 2c 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 6c  , unsigned int l
1c580 65 6e 29 7b 0a 20 20 20 20 20 20 20 20 75 69 6e  en){.        uin
1c590 74 33 32 20 74 3b 0a 0a 20 20 20 20 20 20 20 20  t32 t;..        
1c5a0 2f 2a 20 55 70 64 61 74 65 20 62 69 74 63 6f 75  /* Update bitcou
1c5b0 6e 74 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 74  nt */..        t
1c5c0 20 3d 20 63 74 78 2d 3e 62 69 74 73 5b 30 5d 3b   = ctx->bits[0];
1c5d0 0a 20 20 20 20 20 20 20 20 69 66 20 28 28 63 74  .        if ((ct
1c5e0 78 2d 3e 62 69 74 73 5b 30 5d 20 3d 20 74 20 2b  x->bits[0] = t +
1c5f0 20 28 28 75 69 6e 74 33 32 29 6c 65 6e 20 3c 3c   ((uint32)len <<
1c600 20 33 29 29 20 3c 20 74 29 0a 20 20 20 20 20 20   3)) < t).      
1c610 20 20 20 20 20 20 20 20 20 20 63 74 78 2d 3e 62            ctx->b
1c620 69 74 73 5b 31 5d 2b 2b 3b 20 2f 2a 20 43 61 72  its[1]++; /* Car
1c630 72 79 20 66 72 6f 6d 20 6c 6f 77 20 74 6f 20 68  ry from low to h
1c640 69 67 68 20 2a 2f 0a 20 20 20 20 20 20 20 20 63  igh */.        c
1c650 74 78 2d 3e 62 69 74 73 5b 31 5d 20 2b 3d 20 6c  tx->bits[1] += l
1c660 65 6e 20 3e 3e 20 32 39 3b 0a 0a 20 20 20 20 20  en >> 29;..     
1c670 20 20 20 74 20 3d 20 28 74 20 3e 3e 20 33 29 20     t = (t >> 3) 
1c680 26 20 30 78 33 66 3b 20 20 20 20 2f 2a 20 42 79  & 0x3f;    /* By
1c690 74 65 73 20 61 6c 72 65 61 64 79 20 69 6e 20 73  tes already in s
1c6a0 68 73 49 6e 66 6f 2d 3e 64 61 74 61 20 2a 2f 0a  hsInfo->data */.
1c6b0 0a 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64  .        /* Hand
1c6c0 6c 65 20 61 6e 79 20 6c 65 61 64 69 6e 67 20 6f  le any leading o
1c6d0 64 64 2d 73 69 7a 65 64 20 63 68 75 6e 6b 73 20  dd-sized chunks 
1c6e0 2a 2f 0a 0a 20 20 20 20 20 20 20 20 69 66 20 28  */..        if (
1c6f0 20 74 20 29 20 7b 0a 20 20 20 20 20 20 20 20 20   t ) {.         
1c700 20 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20         unsigned 
1c710 63 68 61 72 20 2a 70 20 3d 20 28 75 6e 73 69 67  char *p = (unsig
1c720 6e 65 64 20 63 68 61 72 20 2a 29 63 74 78 2d 3e  ned char *)ctx->
1c730 69 6e 20 2b 20 74 3b 0a 0a 20 20 20 20 20 20 20  in + t;..       
1c740 20 20 20 20 20 20 20 20 20 74 20 3d 20 36 34 2d           t = 64-
1c750 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t;.             
1c760 20 20 20 69 66 20 28 6c 65 6e 20 3c 20 74 29 20     if (len < t) 
1c770 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
1c780 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
1c790 28 70 2c 20 62 75 66 2c 20 6c 65 6e 29 3b 0a 20  (p, buf, len);. 
1c7a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c7b0 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20         return;. 
1c7c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
1c7d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1c7e0 20 6d 65 6d 63 70 79 28 70 2c 20 62 75 66 2c 20   memcpy(p, buf, 
1c7f0 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  t);.            
1c800 20 20 20 20 62 79 74 65 52 65 76 65 72 73 65 28      byteReverse(
1c810 63 74 78 2d 3e 69 6e 2c 20 31 36 29 3b 0a 20 20  ctx->in, 16);.  
1c820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4d 44                MD
1c830 35 54 72 61 6e 73 66 6f 72 6d 28 63 74 78 2d 3e  5Transform(ctx->
1c840 62 75 66 2c 20 28 75 69 6e 74 33 32 20 2a 29 63  buf, (uint32 *)c
1c850 74 78 2d 3e 69 6e 29 3b 0a 20 20 20 20 20 20 20  tx->in);.       
1c860 20 20 20 20 20 20 20 20 20 62 75 66 20 2b 3d 20           buf += 
1c870 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t;.             
1c880 20 20 20 6c 65 6e 20 2d 3d 20 74 3b 0a 20 20 20     len -= t;.   
1c890 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
1c8a0 2f 2a 20 50 72 6f 63 65 73 73 20 64 61 74 61 20  /* Process data 
1c8b0 69 6e 20 36 34 2d 62 79 74 65 20 63 68 75 6e 6b  in 64-byte chunk
1c8c0 73 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 77 68  s */..        wh
1c8d0 69 6c 65 20 28 6c 65 6e 20 3e 3d 20 36 34 29 20  ile (len >= 64) 
1c8e0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
1c8f0 20 20 6d 65 6d 63 70 79 28 63 74 78 2d 3e 69 6e    memcpy(ctx->in
1c900 2c 20 62 75 66 2c 20 36 34 29 3b 0a 20 20 20 20  , buf, 64);.    
1c910 20 20 20 20 20 20 20 20 20 20 20 20 62 79 74 65              byte
1c920 52 65 76 65 72 73 65 28 63 74 78 2d 3e 69 6e 2c  Reverse(ctx->in,
1c930 20 31 36 29 3b 0a 20 20 20 20 20 20 20 20 20 20   16);.          
1c940 20 20 20 20 20 20 4d 44 35 54 72 61 6e 73 66 6f        MD5Transfo
1c950 72 6d 28 63 74 78 2d 3e 62 75 66 2c 20 28 75 69  rm(ctx->buf, (ui
1c960 6e 74 33 32 20 2a 29 63 74 78 2d 3e 69 6e 29 3b  nt32 *)ctx->in);
1c970 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1c980 20 62 75 66 20 2b 3d 20 36 34 3b 0a 20 20 20 20   buf += 64;.    
1c990 20 20 20 20 20 20 20 20 20 20 20 20 6c 65 6e 20              len 
1c9a0 2d 3d 20 36 34 3b 0a 20 20 20 20 20 20 20 20 7d  -= 64;.        }
1c9b0 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e  ..        /* Han
1c9c0 64 6c 65 20 61 6e 79 20 72 65 6d 61 69 6e 69 6e  dle any remainin
1c9d0 67 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 2e  g bytes of data.
1c9e0 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 6d 65 6d   */..        mem
1c9f0 63 70 79 28 63 74 78 2d 3e 69 6e 2c 20 62 75 66  cpy(ctx->in, buf
1ca00 2c 20 6c 65 6e 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a  , len);.}../*. *
1ca10 20 46 69 6e 61 6c 20 77 72 61 70 75 70 20 2d 20   Final wrapup - 
1ca20 70 61 64 20 74 6f 20 36 34 2d 62 79 74 65 20 62  pad to 64-byte b
1ca30 6f 75 6e 64 61 72 79 20 77 69 74 68 20 74 68 65  oundary with the
1ca40 20 62 69 74 20 70 61 74 74 65 72 6e 0a 20 2a 20   bit pattern. * 
1ca50 31 20 30 2a 20 28 36 34 2d 62 69 74 20 63 6f 75  1 0* (64-bit cou
1ca60 6e 74 20 6f 66 20 62 69 74 73 20 70 72 6f 63 65  nt of bits proce
1ca70 73 73 65 64 2c 20 4d 53 42 2d 66 69 72 73 74 29  ssed, MSB-first)
1ca80 0a 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  . */.static void
1ca90 20 4d 44 35 46 69 6e 61 6c 28 75 6e 73 69 67 6e   MD5Final(unsign
1caa0 65 64 20 63 68 61 72 20 64 69 67 65 73 74 5b 31  ed char digest[1
1cab0 36 5d 2c 20 4d 44 35 43 6f 6e 74 65 78 74 20 2a  6], MD5Context *
1cac0 63 74 78 29 7b 0a 20 20 20 20 20 20 20 20 75 6e  ctx){.        un
1cad0 73 69 67 6e 65 64 20 63 6f 75 6e 74 3b 0a 20 20  signed count;.  
1cae0 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63        unsigned c
1caf0 68 61 72 20 2a 70 3b 0a 0a 20 20 20 20 20 20 20  har *p;..       
1cb00 20 2f 2a 20 43 6f 6d 70 75 74 65 20 6e 75 6d 62   /* Compute numb
1cb10 65 72 20 6f 66 20 62 79 74 65 73 20 6d 6f 64 20  er of bytes mod 
1cb20 36 34 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f  64 */.        co
1cb30 75 6e 74 20 3d 20 28 63 74 78 2d 3e 62 69 74 73  unt = (ctx->bits
1cb40 5b 30 5d 20 3e 3e 20 33 29 20 26 20 30 78 33 46  [0] >> 3) & 0x3F
1cb50 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 65  ;..        /* Se
1cb60 74 20 74 68 65 20 66 69 72 73 74 20 63 68 61 72  t the first char
1cb70 20 6f 66 20 70 61 64 64 69 6e 67 20 74 6f 20 30   of padding to 0
1cb80 78 38 30 2e 20 20 54 68 69 73 20 69 73 20 73 61  x80.  This is sa
1cb90 66 65 20 73 69 6e 63 65 20 74 68 65 72 65 20 69  fe since there i
1cba0 73 0a 20 20 20 20 20 20 20 20 20 20 20 61 6c 77  s.           alw
1cbb0 61 79 73 20 61 74 20 6c 65 61 73 74 20 6f 6e 65  ays at least one
1cbc0 20 62 79 74 65 20 66 72 65 65 20 2a 2f 0a 20 20   byte free */.  
1cbd0 20 20 20 20 20 20 70 20 3d 20 63 74 78 2d 3e 69        p = ctx->i
1cbe0 6e 20 2b 20 63 6f 75 6e 74 3b 0a 20 20 20 20 20  n + count;.     
1cbf0 20 20 20 2a 70 2b 2b 20 3d 20 30 78 38 30 3b 0a     *p++ = 0x80;.
1cc00 0a 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65  .        /* Byte
1cc10 73 20 6f 66 20 70 61 64 64 69 6e 67 20 6e 65 65  s of padding nee
1cc20 64 65 64 20 74 6f 20 6d 61 6b 65 20 36 34 20 62  ded to make 64 b
1cc30 79 74 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  ytes */.        
1cc40 63 6f 75 6e 74 20 3d 20 36 34 20 2d 20 31 20 2d  count = 64 - 1 -
1cc50 20 63 6f 75 6e 74 3b 0a 0a 20 20 20 20 20 20 20   count;..       
1cc60 20 2f 2a 20 50 61 64 20 6f 75 74 20 74 6f 20 35   /* Pad out to 5
1cc70 36 20 6d 6f 64 20 36 34 20 2a 2f 0a 20 20 20 20  6 mod 64 */.    
1cc80 20 20 20 20 69 66 20 28 63 6f 75 6e 74 20 3c 20      if (count < 
1cc90 38 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  8) {.           
1cca0 20 20 20 20 20 2f 2a 20 54 77 6f 20 6c 6f 74 73       /* Two lots
1ccb0 20 6f 66 20 70 61 64 64 69 6e 67 3a 20 20 50 61   of padding:  Pa
1ccc0 64 20 74 68 65 20 66 69 72 73 74 20 62 6c 6f 63  d the first bloc
1ccd0 6b 20 74 6f 20 36 34 20 62 79 74 65 73 20 2a 2f  k to 64 bytes */
1cce0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1ccf0 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 63 6f   memset(p, 0, co
1cd00 75 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  unt);.          
1cd10 20 20 20 20 20 20 62 79 74 65 52 65 76 65 72 73        byteRevers
1cd20 65 28 63 74 78 2d 3e 69 6e 2c 20 31 36 29 3b 0a  e(ctx->in, 16);.
1cd30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cd40 4d 44 35 54 72 61 6e 73 66 6f 72 6d 28 63 74 78  MD5Transform(ctx
1cd50 2d 3e 62 75 66 2c 20 28 75 69 6e 74 33 32 20 2a  ->buf, (uint32 *
1cd60 29 63 74 78 2d 3e 69 6e 29 3b 0a 0a 20 20 20 20  )ctx->in);..    
1cd70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1cd80 6f 77 20 66 69 6c 6c 20 74 68 65 20 6e 65 78 74  ow fill the next
1cd90 20 62 6c 6f 63 6b 20 77 69 74 68 20 35 36 20 62   block with 56 b
1cda0 79 74 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  ytes */.        
1cdb0 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 63          memset(c
1cdc0 74 78 2d 3e 69 6e 2c 20 30 2c 20 35 36 29 3b 0a  tx->in, 0, 56);.
1cdd0 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
1cde0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1cdf0 20 2f 2a 20 50 61 64 20 62 6c 6f 63 6b 20 74 6f   /* Pad block to
1ce00 20 35 36 20 62 79 74 65 73 20 2a 2f 0a 20 20 20   56 bytes */.   
1ce10 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d               mem
1ce20 73 65 74 28 70 2c 20 30 2c 20 63 6f 75 6e 74 2d  set(p, 0, count-
1ce30 38 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  8);.        }.  
1ce40 20 20 20 20 20 20 62 79 74 65 52 65 76 65 72 73        byteRevers
1ce50 65 28 63 74 78 2d 3e 69 6e 2c 20 31 34 29 3b 0a  e(ctx->in, 14);.
1ce60 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 70 70 65  .        /* Appe
1ce70 6e 64 20 6c 65 6e 67 74 68 20 69 6e 20 62 69 74  nd length in bit
1ce80 73 20 61 6e 64 20 74 72 61 6e 73 66 6f 72 6d 20  s and transform 
1ce90 2a 2f 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  */.        memcp
1cea0 79 28 63 74 78 2d 3e 69 6e 20 2b 20 31 34 2a 34  y(ctx->in + 14*4
1ceb0 2c 20 63 74 78 2d 3e 62 69 74 73 2c 20 38 29 3b  , ctx->bits, 8);
1cec0 0a 0a 20 20 20 20 20 20 20 20 4d 44 35 54 72 61  ..        MD5Tra
1ced0 6e 73 66 6f 72 6d 28 63 74 78 2d 3e 62 75 66 2c  nsform(ctx->buf,
1cee0 20 28 75 69 6e 74 33 32 20 2a 29 63 74 78 2d 3e   (uint32 *)ctx->
1cef0 69 6e 29 3b 0a 20 20 20 20 20 20 20 20 62 79 74  in);.        byt
1cf00 65 52 65 76 65 72 73 65 28 28 75 6e 73 69 67 6e  eReverse((unsign
1cf10 65 64 20 63 68 61 72 20 2a 29 63 74 78 2d 3e 62  ed char *)ctx->b
1cf20 75 66 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20  uf, 4);.        
1cf30 6d 65 6d 63 70 79 28 64 69 67 65 73 74 2c 20 63  memcpy(digest, c
1cf40 74 78 2d 3e 62 75 66 2c 20 31 36 29 3b 0a 7d 0a  tx->buf, 16);.}.
1cf50 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61  ./*.** Convert a
1cf60 20 31 32 38 2d 62 69 74 20 4d 44 35 20 64 69 67   128-bit MD5 dig
1cf70 65 73 74 20 69 6e 74 6f 20 61 20 33 32 2d 64 69  est into a 32-di
1cf80 67 69 74 20 62 61 73 65 2d 31 36 20 6e 75 6d 62  git base-16 numb
1cf90 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  er..*/.static vo
1cfa0 69 64 20 4d 44 35 44 69 67 65 73 74 54 6f 42 61  id MD5DigestToBa
1cfb0 73 65 31 36 28 75 6e 73 69 67 6e 65 64 20 63 68  se16(unsigned ch
1cfc0 61 72 20 2a 64 69 67 65 73 74 2c 20 63 68 61 72  ar *digest, char
1cfd0 20 2a 7a 42 75 66 29 7b 0a 20 20 73 74 61 74 69   *zBuf){.  stati
1cfe0 63 20 63 68 61 72 20 63 6f 6e 73 74 20 7a 45 6e  c char const zEn
1cff0 63 6f 64 65 5b 5d 20 3d 20 22 30 31 32 33 34 35  code[] = "012345
1d000 36 37 38 39 61 62 63 64 65 66 22 3b 0a 20 20 69  6789abcdef";.  i
1d010 6e 74 20 69 2c 20 6a 3b 0a 0a 20 20 66 6f 72 28  nt i, j;..  for(
1d020 6a 3d 69 3d 30 3b 20 69 3c 31 36 3b 20 69 2b 2b  j=i=0; i<16; i++
1d030 29 7b 0a 20 20 20 20 69 6e 74 20 61 20 3d 20 64  ){.    int a = d
1d040 69 67 65 73 74 5b 69 5d 3b 0a 20 20 20 20 7a 42  igest[i];.    zB
1d050 75 66 5b 6a 2b 2b 5d 20 3d 20 7a 45 6e 63 6f 64  uf[j++] = zEncod
1d060 65 5b 28 61 3e 3e 34 29 26 30 78 66 5d 3b 0a 20  e[(a>>4)&0xf];. 
1d070 20 20 20 7a 42 75 66 5b 6a 2b 2b 5d 20 3d 20 7a     zBuf[j++] = z
1d080 45 6e 63 6f 64 65 5b 61 20 26 20 30 78 66 5d 3b  Encode[a & 0xf];
1d090 0a 20 20 7d 0a 20 20 7a 42 75 66 5b 6a 5d 20 3d  .  }.  zBuf[j] =
1d0a0 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f   0;.}.../*.** Co
1d0b0 6e 76 65 72 74 20 61 20 31 32 38 2d 62 69 74 20  nvert a 128-bit 
1d0c0 4d 44 35 20 64 69 67 65 73 74 20 69 6e 74 6f 20  MD5 digest into 
1d0d0 73 65 71 75 65 6e 63 79 20 6f 66 20 65 69 67 68  sequency of eigh
1d0e0 74 20 35 2d 64 69 67 69 74 20 69 6e 74 65 67 65  t 5-digit intege
1d0f0 72 73 0a 2a 2a 20 65 61 63 68 20 72 65 70 72 65  rs.** each repre
1d100 73 65 6e 74 69 6e 67 20 31 36 20 62 69 74 73 20  senting 16 bits 
1d110 6f 66 20 74 68 65 20 64 69 67 65 73 74 20 61 6e  of the digest an
1d120 64 20 73 65 70 61 72 61 74 65 64 20 66 72 6f 6d  d separated from
1d130 20 65 61 63 68 0a 2a 2a 20 6f 74 68 65 72 20 62   each.** other b
1d140 79 20 61 20 22 2d 22 20 63 68 61 72 61 63 74 65  y a "-" characte
1d150 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  r..*/.static voi
1d160 64 20 4d 44 35 44 69 67 65 73 74 54 6f 42 61 73  d MD5DigestToBas
1d170 65 31 30 78 38 28 75 6e 73 69 67 6e 65 64 20 63  e10x8(unsigned c
1d180 68 61 72 20 64 69 67 65 73 74 5b 31 36 5d 2c 20  har digest[16], 
1d190 63 68 61 72 20 7a 44 69 67 65 73 74 5b 35 30 5d  char zDigest[50]
1d1a0 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  ){.  int i, j;. 
1d1b0 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 78 3b   unsigned int x;
1d1c0 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c  .  for(i=j=0; i<
1d1d0 31 36 3b 20 69 2b 3d 32 29 7b 0a 20 20 20 20 78  16; i+=2){.    x
1d1e0 20 3d 20 64 69 67 65 73 74 5b 69 5d 2a 32 35 36   = digest[i]*256
1d1f0 20 2b 20 64 69 67 65 73 74 5b 69 2b 31 5d 3b 0a   + digest[i+1];.
1d200 20 20 20 20 69 66 28 20 69 3e 30 20 29 20 7a 44      if( i>0 ) zD
1d210 69 67 65 73 74 5b 6a 2b 2b 5d 20 3d 20 27 2d 27  igest[j++] = '-'
1d220 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  ;.    sqlite3_sn
1d230 70 72 69 6e 74 66 28 35 30 2d 6a 2c 20 26 7a 44  printf(50-j, &zD
1d240 69 67 65 73 74 5b 6a 5d 2c 20 22 25 30 35 75 22  igest[j], "%05u"
1d250 2c 20 78 29 3b 0a 20 20 20 20 6a 20 2b 3d 20 35  , x);.    j += 5
1d260 3b 0a 20 20 7d 0a 20 20 7a 44 69 67 65 73 74 5b  ;.  }.  zDigest[
1d270 6a 5d 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  j] = 0;.}../*.**
1d280 20 41 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20 66   A TCL command f
1d290 6f 72 20 6d 64 35 2e 20 20 54 68 65 20 61 72 67  or md5.  The arg
1d2a0 75 6d 65 6e 74 20 69 73 20 74 68 65 20 74 65 78  ument is the tex
1d2b0 74 20 74 6f 20 62 65 20 68 61 73 68 65 64 2e 20  t to be hashed. 
1d2c0 20 54 68 65 0a 2a 2a 20 52 65 73 75 6c 74 20 69   The.** Result i
1d2d0 73 20 74 68 65 20 68 61 73 68 20 69 6e 20 62 61  s the hash in ba
1d2e0 73 65 36 34 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  se64..*/.static 
1d2f0 69 6e 74 20 6d 64 35 5f 63 6d 64 28 76 6f 69 64  int md5_cmd(void
1d300 2a 63 64 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20  *cd, Tcl_Interp 
1d310 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 61 72 67  *interp, int arg
1d320 63 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a  c, const char **
1d330 61 72 67 76 29 7b 0a 20 20 4d 44 35 43 6f 6e 74  argv){.  MD5Cont
1d340 65 78 74 20 63 74 78 3b 0a 20 20 75 6e 73 69 67  ext ctx;.  unsig
1d350 6e 65 64 20 63 68 61 72 20 64 69 67 65 73 74 5b  ned char digest[
1d360 31 36 5d 3b 0a 20 20 63 68 61 72 20 7a 42 75 66  16];.  char zBuf
1d370 5b 35 30 5d 3b 0a 20 20 76 6f 69 64 20 28 2a 63  [50];.  void (*c
1d380 6f 6e 76 65 72 74 65 72 29 28 75 6e 73 69 67 6e  onverter)(unsign
1d390 65 64 20 63 68 61 72 2a 2c 20 63 68 61 72 2a 29  ed char*, char*)
1d3a0 3b 0a 0a 20 20 69 66 28 20 61 72 67 63 21 3d 32  ;..  if( argc!=2
1d3b0 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
1d3c0 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
1d3d0 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
1d3e0 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72  hould be \"", ar
1d3f0 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 20 22  gv[0],.        "
1d400 20 54 45 58 54 5c 22 22 2c 20 28 63 68 61 72 2a   TEXT\"", (char*
1d410 29 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  )0);.    return 
1d420 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
1d430 20 4d 44 35 49 6e 69 74 28 26 63 74 78 29 3b 0a   MD5Init(&ctx);.
1d440 20 20 4d 44 35 55 70 64 61 74 65 28 26 63 74 78    MD5Update(&ctx
1d450 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  , (unsigned char
1d460 2a 29 61 72 67 76 5b 31 5d 2c 20 28 75 6e 73 69  *)argv[1], (unsi
1d470 67 6e 65 64 29 73 74 72 6c 65 6e 28 61 72 67 76  gned)strlen(argv
1d480 5b 31 5d 29 29 3b 0a 20 20 4d 44 35 46 69 6e 61  [1]));.  MD5Fina
1d490 6c 28 64 69 67 65 73 74 2c 20 26 63 74 78 29 3b  l(digest, &ctx);
1d4a0 0a 20 20 63 6f 6e 76 65 72 74 65 72 20 3d 20 28  .  converter = (
1d4b0 76 6f 69 64 28 2a 29 28 75 6e 73 69 67 6e 65 64  void(*)(unsigned
1d4c0 20 63 68 61 72 2a 2c 63 68 61 72 2a 29 29 63 64   char*,char*))cd
1d4d0 3b 0a 20 20 63 6f 6e 76 65 72 74 65 72 28 64 69  ;.  converter(di
1d4e0 67 65 73 74 2c 20 7a 42 75 66 29 3b 0a 20 20 54  gest, zBuf);.  T
1d4f0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
1d500 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 28 63  interp, zBuf, (c
1d510 68 61 72 2a 29 30 29 3b 0a 20 20 72 65 74 75 72  har*)0);.  retur
1d520 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
1d530 2a 2a 20 41 20 54 43 4c 20 63 6f 6d 6d 61 6e 64  ** A TCL command
1d540 20 74 6f 20 74 61 6b 65 20 74 68 65 20 6d 64 35   to take the md5
1d550 20 68 61 73 68 20 6f 66 20 61 20 66 69 6c 65 2e   hash of a file.
1d560 20 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20 69    The argument i
1d570 73 20 74 68 65 0a 2a 2a 20 6e 61 6d 65 20 6f 66  s the.** name of
1d580 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74   the file..*/.st
1d590 61 74 69 63 20 69 6e 74 20 6d 64 35 66 69 6c 65  atic int md5file
1d5a0 5f 63 6d 64 28 76 6f 69 64 2a 63 64 2c 20 54 63  _cmd(void*cd, Tc
1d5b0 6c 5f 49 6e 74 65 72 70 2a 69 6e 74 65 72 70 2c  l_Interp*interp,
1d5c0 20 69 6e 74 20 61 72 67 63 2c 20 63 6f 6e 73 74   int argc, const
1d5d0 20 63 68 61 72 20 2a 2a 61 72 67 76 29 7b 0a 20   char **argv){. 
1d5e0 20 46 49 4c 45 20 2a 69 6e 3b 0a 20 20 4d 44 35   FILE *in;.  MD5
1d5f0 43 6f 6e 74 65 78 74 20 63 74 78 3b 0a 20 20 76  Context ctx;.  v
1d600 6f 69 64 20 28 2a 63 6f 6e 76 65 72 74 65 72 29  oid (*converter)
1d610 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 2c  (unsigned char*,
1d620 20 63 68 61 72 2a 29 3b 0a 20 20 75 6e 73 69 67   char*);.  unsig
1d630 6e 65 64 20 63 68 61 72 20 64 69 67 65 73 74 5b  ned char digest[
1d640 31 36 5d 3b 0a 20 20 63 68 61 72 20 7a 42 75 66  16];.  char zBuf
1d650 5b 31 30 32 34 30 5d 3b 0a 0a 20 20 69 66 28 20  [10240];..  if( 
1d660 61 72 67 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  argc!=2 ){.    T
1d670 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
1d680 69 6e 74 65 72 70 2c 22 77 72 6f 6e 67 20 23 20  interp,"wrong # 
1d690 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
1d6a0 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20  \"", argv[0],.  
1d6b0 20 20 20 20 20 20 22 20 46 49 4c 45 4e 41 4d 45        " FILENAME
1d6c0 5c 22 22 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  \"", (char*)0);.
1d6d0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
1d6e0 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 6e 20 3d  RROR;.  }.  in =
1d6f0 20 66 6f 70 65 6e 28 61 72 67 76 5b 31 5d 2c 22   fopen(argv[1],"
1d700 72 62 22 29 3b 0a 20 20 69 66 28 20 69 6e 3d 3d  rb");.  if( in==
1d710 30 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  0 ){.    Tcl_App
1d720 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
1d730 2c 22 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e  ,"unable to open
1d740 20 66 69 6c 65 20 5c 22 22 2c 20 61 72 67 76 5b   file \"", argv[
1d750 31 5d 2c 0a 20 20 20 20 20 20 20 20 20 22 5c 22  1],.         "\"
1d760 20 66 6f 72 20 72 65 61 64 69 6e 67 22 2c 20 28   for reading", (
1d770 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 72 65  char*)0);.    re
1d780 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1d790 20 20 7d 0a 20 20 4d 44 35 49 6e 69 74 28 26 63    }.  MD5Init(&c
1d7a0 74 78 29 3b 0a 20 20 66 6f 72 28 3b 3b 29 7b 0a  tx);.  for(;;){.
1d7b0 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 6e      int n;.    n
1d7c0 20 3d 20 28 69 6e 74 29 66 72 65 61 64 28 7a 42   = (int)fread(zB
1d7d0 75 66 2c 20 31 2c 20 73 69 7a 65 6f 66 28 7a 42  uf, 1, sizeof(zB
1d7e0 75 66 29 2c 20 69 6e 29 3b 0a 20 20 20 20 69 66  uf), in);.    if
1d7f0 28 20 6e 3c 3d 30 20 29 20 62 72 65 61 6b 3b 0a  ( n<=0 ) break;.
1d800 20 20 20 20 4d 44 35 55 70 64 61 74 65 28 26 63      MD5Update(&c
1d810 74 78 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68  tx, (unsigned ch
1d820 61 72 2a 29 7a 42 75 66 2c 20 28 75 6e 73 69 67  ar*)zBuf, (unsig
1d830 6e 65 64 29 6e 29 3b 0a 20 20 7d 0a 20 20 66 63  ned)n);.  }.  fc
1d840 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 4d 44 35 46  lose(in);.  MD5F
1d850 69 6e 61 6c 28 64 69 67 65 73 74 2c 20 26 63 74  inal(digest, &ct
1d860 78 29 3b 0a 20 20 63 6f 6e 76 65 72 74 65 72 20  x);.  converter 
1d870 3d 20 28 76 6f 69 64 28 2a 29 28 75 6e 73 69 67  = (void(*)(unsig
1d880 6e 65 64 20 63 68 61 72 2a 2c 63 68 61 72 2a 29  ned char*,char*)
1d890 29 63 64 3b 0a 20 20 63 6f 6e 76 65 72 74 65 72  )cd;.  converter
1d8a0 28 64 69 67 65 73 74 2c 20 7a 42 75 66 29 3b 0a  (digest, zBuf);.
1d8b0 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
1d8c0 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c  lt(interp, zBuf,
1d8d0 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 72 65   (char*)0);.  re
1d8e0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
1d8f0 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 74  /*.** Register t
1d900 68 65 20 66 6f 75 72 20 6e 65 77 20 54 43 4c 20  he four new TCL 
1d910 63 6f 6d 6d 61 6e 64 73 20 66 6f 72 20 67 65 6e  commands for gen
1d920 65 72 61 74 69 6e 67 20 4d 44 35 20 63 68 65 63  erating MD5 chec
1d930 6b 73 75 6d 73 0a 2a 2a 20 77 69 74 68 20 74 68  ksums.** with th
1d940 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
1d950 72 2e 0a 2a 2f 0a 69 6e 74 20 4d 64 35 5f 49 6e  r..*/.int Md5_In
1d960 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  it(Tcl_Interp *i
1d970 6e 74 65 72 70 29 7b 0a 20 20 54 63 6c 5f 43 72  nterp){.  Tcl_Cr
1d980 65 61 74 65 43 6f 6d 6d 61 6e 64 28 69 6e 74 65  eateCommand(inte
1d990 72 70 2c 20 22 6d 64 35 22 2c 20 28 54 63 6c 5f  rp, "md5", (Tcl_
1d9a0 43 6d 64 50 72 6f 63 2a 29 6d 64 35 5f 63 6d 64  CmdProc*)md5_cmd
1d9b0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1d9c0 20 20 20 20 20 20 4d 44 35 44 69 67 65 73 74 54        MD5DigestT
1d9d0 6f 42 61 73 65 31 36 2c 20 30 29 3b 0a 20 20 54  oBase16, 0);.  T
1d9e0 63 6c 5f 43 72 65 61 74 65 43 6f 6d 6d 61 6e 64  cl_CreateCommand
1d9f0 28 69 6e 74 65 72 70 2c 20 22 6d 64 35 2d 31 30  (interp, "md5-10
1da00 78 38 22 2c 20 28 54 63 6c 5f 43 6d 64 50 72 6f  x8", (Tcl_CmdPro
1da10 63 2a 29 6d 64 35 5f 63 6d 64 2c 0a 20 20 20 20  c*)md5_cmd,.    
1da20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1da30 4d 44 35 44 69 67 65 73 74 54 6f 42 61 73 65 31  MD5DigestToBase1
1da40 30 78 38 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 43  0x8, 0);.  Tcl_C
1da50 72 65 61 74 65 43 6f 6d 6d 61 6e 64 28 69 6e 74  reateCommand(int
1da60 65 72 70 2c 20 22 6d 64 35 66 69 6c 65 22 2c 20  erp, "md5file", 
1da70 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 6d 64  (Tcl_CmdProc*)md
1da80 35 66 69 6c 65 5f 63 6d 64 2c 0a 20 20 20 20 20  5file_cmd,.     
1da90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4d                 M
1daa0 44 35 44 69 67 65 73 74 54 6f 42 61 73 65 31 36  D5DigestToBase16
1dab0 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 43 72 65 61  , 0);.  Tcl_Crea
1dac0 74 65 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70  teCommand(interp
1dad0 2c 20 22 6d 64 35 66 69 6c 65 2d 31 30 78 38 22  , "md5file-10x8"
1dae0 2c 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29  , (Tcl_CmdProc*)
1daf0 6d 64 35 66 69 6c 65 5f 63 6d 64 2c 0a 20 20 20  md5file_cmd,.   
1db00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1db10 20 4d 44 35 44 69 67 65 73 74 54 6f 42 61 73 65   MD5DigestToBase
1db20 31 30 78 38 2c 20 30 29 3b 0a 20 20 72 65 74 75  10x8, 0);.  retu
1db30 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e  rn TCL_OK;.}.#en
1db40 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 53  dif /* defined(S
1db50 51 4c 49 54 45 5f 54 45 53 54 29 20 7c 7c 20 64  QLITE_TEST) || d
1db60 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 43  efined(SQLITE_TC
1db70 4c 4d 44 35 29 20 2a 2f 0a 0a 23 69 66 20 64 65  LMD5) */..#if de
1db80 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53  fined(SQLITE_TES
1db90 54 29 0a 2f 2a 0a 2a 2a 20 44 75 72 69 6e 67 20  T)./*.** During 
1dba0 74 65 73 74 69 6e 67 2c 20 74 68 65 20 73 70 65  testing, the spe
1dbb0 63 69 61 6c 20 6d 64 35 73 75 6d 28 29 20 61 67  cial md5sum() ag
1dbc0 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
1dbd0 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a   is available..*
1dbe0 2a 20 69 6e 73 69 64 65 20 53 51 4c 69 74 65 2e  * inside SQLite.
1dbf0 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
1dc00 72 6f 75 74 69 6e 65 73 20 69 6d 70 6c 65 6d 65  routines impleme
1dc10 6e 74 20 74 68 61 74 20 66 75 6e 63 74 69 6f 6e  nt that function
1dc20 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1dc30 20 6d 64 35 73 74 65 70 28 73 71 6c 69 74 65 33   md5step(sqlite3
1dc40 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  _context *contex
1dc50 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c  t, int argc, sql
1dc60 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67  ite3_value **arg
1dc70 76 29 7b 0a 20 20 4d 44 35 43 6f 6e 74 65 78 74  v){.  MD5Context
1dc80 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20   *p;.  int i;.  
1dc90 69 66 28 20 61 72 67 63 3c 31 20 29 20 72 65 74  if( argc<1 ) ret
1dca0 75 72 6e 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74  urn;.  p = sqlit
1dcb0 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e  e3_aggregate_con
1dcc0 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 73 69  text(context, si
1dcd0 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69 66 28  zeof(*p));.  if(
1dce0 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   p==0 ) return;.
1dcf0 20 20 69 66 28 20 21 70 2d 3e 69 73 49 6e 69 74    if( !p->isInit
1dd00 20 29 7b 0a 20 20 20 20 4d 44 35 49 6e 69 74 28   ){.    MD5Init(
1dd10 70 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d  p);.  }.  for(i=
1dd20 30 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b 29 7b  0; i<argc; i++){
1dd30 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
1dd40 2a 7a 44 61 74 61 20 3d 20 28 63 68 61 72 2a 29  *zData = (char*)
1dd50 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
1dd60 78 74 28 61 72 67 76 5b 69 5d 29 3b 0a 20 20 20  xt(argv[i]);.   
1dd70 20 69 66 28 20 7a 44 61 74 61 20 29 7b 0a 20 20   if( zData ){.  
1dd80 20 20 20 20 4d 44 35 55 70 64 61 74 65 28 70 2c      MD5Update(p,
1dd90 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a   (unsigned char*
1dda0 29 7a 44 61 74 61 2c 20 28 69 6e 74 29 73 74 72  )zData, (int)str
1ddb0 6c 65 6e 28 7a 44 61 74 61 29 29 3b 0a 20 20 20  len(zData));.   
1ddc0 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20   }.  }.}.static 
1ddd0 76 6f 69 64 20 6d 64 35 66 69 6e 61 6c 69 7a 65  void md5finalize
1dde0 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
1ddf0 20 2a 63 6f 6e 74 65 78 74 29 7b 0a 20 20 4d 44   *context){.  MD
1de00 35 43 6f 6e 74 65 78 74 20 2a 70 3b 0a 20 20 75  5Context *p;.  u
1de10 6e 73 69 67 6e 65 64 20 63 68 61 72 20 64 69 67  nsigned char dig
1de20 65 73 74 5b 31 36 5d 3b 0a 20 20 63 68 61 72 20  est[16];.  char 
1de30 7a 42 75 66 5b 33 33 5d 3b 0a 20 20 70 20 3d 20  zBuf[33];.  p = 
1de40 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74  sqlite3_aggregat
1de50 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e 74 65 78  e_context(contex
1de60 74 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a  t, sizeof(*p));.
1de70 20 20 4d 44 35 46 69 6e 61 6c 28 64 69 67 65 73    MD5Final(diges
1de80 74 2c 70 29 3b 0a 20 20 4d 44 35 44 69 67 65 73  t,p);.  MD5Diges
1de90 74 54 6f 42 61 73 65 31 36 28 64 69 67 65 73 74  tToBase16(digest
1dea0 2c 20 7a 42 75 66 29 3b 0a 20 20 73 71 6c 69 74  , zBuf);.  sqlit
1deb0 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63  e3_result_text(c
1dec0 6f 6e 74 65 78 74 2c 20 7a 42 75 66 2c 20 2d 31  ontext, zBuf, -1
1ded0 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
1dee0 4e 54 29 3b 0a 7d 0a 69 6e 74 20 4d 64 35 5f 52  NT);.}.int Md5_R
1def0 65 67 69 73 74 65 72 28 73 71 6c 69 74 65 33 20  egister(sqlite3 
1df00 2a 64 62 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  *db){.  int rc =
1df10 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
1df20 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 6d 64  function(db, "md
1df30 35 73 75 6d 22 2c 20 2d 31 2c 20 53 51 4c 49 54  5sum", -1, SQLIT
1df40 45 5f 55 54 46 38 2c 20 30 2c 20 30 2c 0a 20 20  E_UTF8, 0, 0,.  
1df50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1df60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d                 m
1df70 64 35 73 74 65 70 2c 20 6d 64 35 66 69 6e 61 6c  d5step, md5final
1df80 69 7a 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ize);.  sqlite3_
1df90 6f 76 65 72 6c 6f 61 64 5f 66 75 6e 63 74 69 6f  overload_functio
1dfa0 6e 28 64 62 2c 20 22 6d 64 35 73 75 6d 22 2c 20  n(db, "md5sum", 
1dfb0 2d 31 29 3b 20 20 2f 2a 20 54 6f 20 65 78 65 72  -1);  /* To exer
1dfc0 63 69 73 65 20 74 68 69 73 20 41 50 49 20 2a 2f  cise this API */
1dfd0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1dfe0 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65  #endif /* define
1dff0 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 20 2a  d(SQLITE_TEST) *
1e000 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  /.../*.** If the
1e010 20 6d 61 63 72 6f 20 54 43 4c 53 48 20 69 73 20   macro TCLSH is 
1e020 6f 6e 65 2c 20 74 68 65 6e 20 70 75 74 20 69 6e  one, then put in
1e030 20 63 6f 64 65 20 74 68 69 73 20 66 6f 72 20 74   code this for t
1e040 68 65 0a 2a 2a 20 22 6d 61 69 6e 22 20 72 6f 75  he.** "main" rou
1e050 74 69 6e 65 20 74 68 61 74 20 77 69 6c 6c 20 69  tine that will i
1e060 6e 69 74 69 61 6c 69 7a 65 20 54 63 6c 20 61 6e  nitialize Tcl an
1e070 64 20 74 61 6b 65 20 69 6e 70 75 74 20 66 72 6f  d take input fro
1e080 6d 0a 2a 2a 20 73 74 61 6e 64 61 72 64 20 69 6e  m.** standard in
1e090 70 75 74 2c 20 6f 72 20 69 66 20 61 20 66 69 6c  put, or if a fil
1e0a0 65 20 69 73 20 6e 61 6d 65 64 20 6f 6e 20 74 68  e is named on th
1e0b0 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 0a 2a  e command line.*
1e0c0 2a 20 74 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * the TCL interp
1e0d0 72 65 74 65 72 20 72 65 61 64 73 20 61 6e 64 20  reter reads and 
1e0e0 65 76 61 6c 75 61 74 65 73 20 74 68 61 74 20 66  evaluates that f
1e0f0 69 6c 65 2e 0a 2a 2f 0a 23 69 66 20 54 43 4c 53  ile..*/.#if TCLS
1e100 48 3d 3d 31 0a 73 74 61 74 69 63 20 63 6f 6e 73  H==1.static cons
1e110 74 20 63 68 61 72 20 2a 74 63 6c 73 68 5f 6d 61  t char *tclsh_ma
1e120 69 6e 5f 6c 6f 6f 70 28 76 6f 69 64 29 7b 0a 20  in_loop(void){. 
1e130 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68   static const ch
1e140 61 72 20 7a 4d 61 69 6e 6c 6f 6f 70 5b 5d 20 3d  ar zMainloop[] =
1e150 0a 20 20 20 20 22 73 65 74 20 6c 69 6e 65 20 7b  .    "set line {
1e160 7d 5c 6e 22 0a 20 20 20 20 22 77 68 69 6c 65 20  }\n".    "while 
1e170 7b 21 5b 65 6f 66 20 73 74 64 69 6e 5d 7d 20 7b  {![eof stdin]} {
1e180 5c 6e 22 0a 20 20 20 20 20 20 22 69 66 20 7b 24  \n".      "if {$
1e190 6c 69 6e 65 21 3d 5c 22 5c 22 7d 20 7b 5c 6e 22  line!=\"\"} {\n"
1e1a0 0a 20 20 20 20 20 20 20 20 22 70 75 74 73 20 2d  .        "puts -
1e1b0 6e 6f 6e 65 77 6c 69 6e 65 20 5c 22 3e 20 5c 22  nonewline \"> \"
1e1c0 5c 6e 22 0a 20 20 20 20 20 20 22 7d 20 65 6c 73  \n".      "} els
1e1d0 65 20 7b 5c 6e 22 0a 20 20 20 20 20 20 20 20 22  e {\n".        "
1e1e0 70 75 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20  puts -nonewline 
1e1f0 5c 22 25 20 5c 22 5c 6e 22 0a 20 20 20 20 20 20  \"% \"\n".      
1e200 22 7d 5c 6e 22 0a 20 20 20 20 20 20 22 66 6c 75  "}\n".      "flu
1e210 73 68 20 73 74 64 6f 75 74 5c 6e 22 0a 20 20 20  sh stdout\n".   
1e220 20 20 20 22 61 70 70 65 6e 64 20 6c 69 6e 65 20     "append line 
1e230 5b 67 65 74 73 20 73 74 64 69 6e 5d 5c 6e 22 0a  [gets stdin]\n".
1e240 20 20 20 20 20 20 22 69 66 20 7b 5b 69 6e 66 6f        "if {[info
1e250 20 63 6f 6d 70 6c 65 74 65 20 24 6c 69 6e 65 5d   complete $line]
1e260 7d 20 7b 5c 6e 22 0a 20 20 20 20 20 20 20 20 22  } {\n".        "
1e270 69 66 20 7b 5b 63 61 74 63 68 20 7b 75 70 6c 65  if {[catch {uple
1e280 76 65 6c 20 23 30 20 24 6c 69 6e 65 7d 20 72 65  vel #0 $line} re
1e290 73 75 6c 74 5d 7d 20 7b 5c 6e 22 0a 20 20 20 20  sult]} {\n".    
1e2a0 20 20 20 20 20 20 22 70 75 74 73 20 73 74 64 65        "puts stde
1e2b0 72 72 20 5c 22 45 72 72 6f 72 3a 20 24 72 65 73  rr \"Error: $res
1e2c0 75 6c 74 5c 22 5c 6e 22 0a 20 20 20 20 20 20 20  ult\"\n".       
1e2d0 20 22 7d 20 65 6c 73 65 69 66 20 7b 24 72 65 73   "} elseif {$res
1e2e0 75 6c 74 21 3d 5c 22 5c 22 7d 20 7b 5c 6e 22 0a  ult!=\"\"} {\n".
1e2f0 20 20 20 20 20 20 20 20 20 20 22 70 75 74 73 20            "puts 
1e300 24 72 65 73 75 6c 74 5c 6e 22 0a 20 20 20 20 20  $result\n".     
1e310 20 20 20 22 7d 5c 6e 22 0a 20 20 20 20 20 20 20     "}\n".       
1e320 20 22 73 65 74 20 6c 69 6e 65 20 7b 7d 5c 6e 22   "set line {}\n"
1e330 0a 20 20 20 20 20 20 22 7d 20 65 6c 73 65 20 7b  .      "} else {
1e340 5c 6e 22 0a 20 20 20 20 20 20 20 20 22 61 70 70  \n".        "app
1e350 65 6e 64 20 6c 69 6e 65 20 5c 5c 6e 5c 6e 22 0a  end line \\n\n".
1e360 20 20 20 20 20 20 22 7d 5c 6e 22 0a 20 20 20 20        "}\n".    
1e370 22 7d 5c 6e 22 0a 20 20 3b 0a 20 20 72 65 74 75  "}\n".  ;.  retu
1e380 72 6e 20 7a 4d 61 69 6e 6c 6f 6f 70 3b 0a 7d 0a  rn zMainloop;.}.
1e390 23 65 6e 64 69 66 0a 23 69 66 20 54 43 4c 53 48  #endif.#if TCLSH
1e3a0 3d 3d 32 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  ==2.static const
1e3b0 20 63 68 61 72 20 2a 74 63 6c 73 68 5f 6d 61 69   char *tclsh_mai
1e3c0 6e 5f 6c 6f 6f 70 28 76 6f 69 64 29 3b 0a 23 65  n_loop(void);.#e
1e3d0 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c  ndif..#ifdef SQL
1e3e0 49 54 45 5f 54 45 53 54 0a 73 74 61 74 69 63 20  ITE_TEST.static 
1e3f0 76 6f 69 64 20 69 6e 69 74 5f 61 6c 6c 28 54 63  void init_all(Tc
1e400 6c 5f 49 6e 74 65 72 70 20 2a 29 3b 0a 73 74 61  l_Interp *);.sta
1e410 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54  tic int SQLITE_T
1e420 43 4c 41 50 49 20 69 6e 69 74 5f 61 6c 6c 5f 63  CLAPI init_all_c
1e430 6d 64 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61  md(.  ClientData
1e440 20 63 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72   cd,.  Tcl_Inter
1e450 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
1e460 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
1e470 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
1e480 7b 0a 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  {..  Tcl_Interp 
1e490 2a 73 6c 61 76 65 3b 0a 20 20 69 66 28 20 6f 62  *slave;.  if( ob
1e4a0 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=2 ){.    Tcl
1e4b0 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
1e4c0 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
1e4d0 53 4c 41 56 45 22 29 3b 0a 20 20 20 20 72 65 74  SLAVE");.    ret
1e4e0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1e4f0 20 7d 0a 0a 20 20 73 6c 61 76 65 20 3d 20 54 63   }..  slave = Tc
1e500 6c 5f 47 65 74 53 6c 61 76 65 28 69 6e 74 65 72  l_GetSlave(inter
1e510 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
1e520 28 6f 62 6a 76 5b 31 5d 29 29 3b 0a 20 20 69 66  (objv[1]));.  if
1e530 28 20 21 73 6c 61 76 65 20 29 7b 0a 20 20 20 20  ( !slave ){.    
1e540 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1e550 3b 0a 20 20 7d 0a 0a 20 20 69 6e 69 74 5f 61 6c  ;.  }..  init_al
1e560 6c 28 73 6c 61 76 65 29 3b 0a 20 20 72 65 74 75  l(slave);.  retu
1e570 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
1e580 0a 2a 2a 20 54 63 6c 63 6d 64 3a 20 64 62 5f 75  .** Tclcmd: db_u
1e590 73 65 5f 6c 65 67 61 63 79 5f 70 72 65 70 61 72  se_legacy_prepar
1e5a0 65 20 44 42 20 42 4f 4f 4c 45 41 4e 0a 2a 2a 0a  e DB BOOLEAN.**.
1e5b0 2a 2a 20 20 20 54 68 65 20 66 69 72 73 74 20 61  **   The first a
1e5c0 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20  rgument to this 
1e5d0 63 6f 6d 6d 61 6e 64 20 6d 75 73 74 20 62 65 20  command must be 
1e5e0 61 20 64 61 74 61 62 61 73 65 20 63 6f 6d 6d 61  a database comma
1e5f0 6e 64 20 63 72 65 61 74 65 64 20 62 79 0a 2a 2a  nd created by.**
1e600 20 20 20 5b 73 71 6c 69 74 65 33 5d 2e 20 49 66     [sqlite3]. If
1e610 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
1e620 6d 65 6e 74 20 69 73 20 74 72 75 65 2c 20 74 68  ment is true, th
1e630 65 6e 20 74 68 65 20 68 61 6e 64 6c 65 20 69 73  en the handle is
1e640 20 63 6f 6e 66 69 67 75 72 65 64 0a 2a 2a 20 20   configured.**  
1e650 20 74 6f 20 75 73 65 20 74 68 65 20 73 71 6c 69   to use the sqli
1e660 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 29  te3_prepare_v2()
1e670 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 70 72 65   function to pre
1e680 70 61 72 65 20 73 74 61 74 65 6d 65 6e 74 73 2e  pare statements.
1e690 20 49 66 20 69 74 0a 2a 2a 20 20 20 69 73 20 66   If it.**   is f
1e6a0 61 6c 73 65 2c 20 73 71 6c 69 74 65 33 5f 70 72  alse, sqlite3_pr
1e6b0 65 70 61 72 65 28 29 2e 0a 2a 2f 0a 73 74 61 74  epare()..*/.stat
1e6c0 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43  ic int SQLITE_TC
1e6d0 4c 41 50 49 20 64 62 5f 75 73 65 5f 6c 65 67 61  LAPI db_use_lega
1e6e0 63 79 5f 70 72 65 70 61 72 65 5f 63 6d 64 28 0a  cy_prepare_cmd(.
1e6f0 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 64 2c    ClientData cd,
1e700 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
1e710 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
1e720 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
1e730 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
1e740 54 63 6c 5f 43 6d 64 49 6e 66 6f 20 63 6d 64 49  Tcl_CmdInfo cmdI
1e750 6e 66 6f 3b 0a 20 20 53 71 6c 69 74 65 44 62 20  nfo;.  SqliteDb 
1e760 2a 70 44 62 3b 0a 20 20 69 6e 74 20 62 50 72 65  *pDb;.  int bPre
1e770 70 61 72 65 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  pare;..  if( obj
1e780 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=3 ){.    Tcl_
1e790 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
1e7a0 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44  erp, 1, objv, "D
1e7b0 42 20 42 4f 4f 4c 45 41 4e 22 29 3b 0a 20 20 20  B BOOLEAN");.   
1e7c0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1e7d0 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 54  R;.  }..  if( !T
1e7e0 63 6c 5f 47 65 74 43 6f 6d 6d 61 6e 64 49 6e 66  cl_GetCommandInf
1e7f0 6f 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  o(interp, Tcl_Ge
1e800 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
1e810 2c 20 26 63 6d 64 49 6e 66 6f 29 20 29 7b 0a 20  , &cmdInfo) ){. 
1e820 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
1e830 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 6e 6f 20  ult(interp, "no 
1e840 73 75 63 68 20 64 62 3a 20 22 2c 20 54 63 6c 5f  such db: ", Tcl_
1e850 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
1e860 5d 29 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20  ]), (char*)0);. 
1e870 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
1e880 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 44 62 20 3d  ROR;.  }.  pDb =
1e890 20 28 53 71 6c 69 74 65 44 62 2a 29 63 6d 64 49   (SqliteDb*)cmdI
1e8a0 6e 66 6f 2e 6f 62 6a 43 6c 69 65 6e 74 44 61 74  nfo.objClientDat
1e8b0 61 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74  a;.  if( Tcl_Get
1e8c0 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69  BooleanFromObj(i
1e8d0 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20  nterp, objv[2], 
1e8e0 26 62 50 72 65 70 61 72 65 29 20 29 7b 0a 20 20  &bPrepare) ){.  
1e8f0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
1e900 4f 52 3b 0a 20 20 7d 0a 0a 20 20 70 44 62 2d 3e  OR;.  }..  pDb->
1e910 62 4c 65 67 61 63 79 50 72 65 70 61 72 65 20 3d  bLegacyPrepare =
1e920 20 62 50 72 65 70 61 72 65 3b 0a 0a 20 20 54 63   bPrepare;..  Tc
1e930 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e  l_ResetResult(in
1e940 74 65 72 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  terp);.  return 
1e950 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
1e960 20 54 63 6c 63 6d 64 3a 20 64 62 5f 6c 61 73 74   Tclcmd: db_last
1e970 5f 73 74 6d 74 5f 70 74 72 20 44 42 0a 2a 2a 0a  _stmt_ptr DB.**.
1e980 2a 2a 20 20 20 49 66 20 74 68 65 20 73 74 61 74  **   If the stat
1e990 65 6d 65 6e 74 20 63 61 63 68 65 20 61 73 73 6f  ement cache asso
1e9a0 63 69 61 74 65 64 20 77 69 74 68 20 64 61 74 61  ciated with data
1e9b0 62 61 73 65 20 44 42 20 69 73 20 6e 6f 74 20 65  base DB is not e
1e9c0 6d 70 74 79 2c 0a 2a 2a 20 20 20 72 65 74 75 72  mpty,.**   retur
1e9d0 6e 20 74 68 65 20 74 65 78 74 20 72 65 70 72 65  n the text repre
1e9e0 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  sentation of the
1e9f0 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 75   most recently u
1ea00 73 65 64 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a  sed statement.**
1ea10 20 20 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74     handle..*/.st
1ea20 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
1ea30 54 43 4c 41 50 49 20 64 62 5f 6c 61 73 74 5f 73  TCLAPI db_last_s
1ea40 74 6d 74 5f 70 74 72 28 0a 20 20 43 6c 69 65 6e  tmt_ptr(.  Clien
1ea50 74 44 61 74 61 20 63 64 2c 0a 20 20 54 63 6c 5f  tData cd,.  Tcl_
1ea60 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
1ea70 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
1ea80 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
1ea90 76 5b 5d 0a 29 7b 0a 20 20 65 78 74 65 72 6e 20  v[].){.  extern 
1eaa0 69 6e 74 20 73 71 6c 69 74 65 33 54 65 73 74 4d  int sqlite3TestM
1eab0 61 6b 65 50 6f 69 6e 74 65 72 53 74 72 28 54 63  akePointerStr(Tc
1eac0 6c 5f 49 6e 74 65 72 70 2a 2c 20 63 68 61 72 2a  l_Interp*, char*
1ead0 2c 20 76 6f 69 64 2a 29 3b 0a 20 20 54 63 6c 5f  , void*);.  Tcl_
1eae0 43 6d 64 49 6e 66 6f 20 63 6d 64 49 6e 66 6f 3b  CmdInfo cmdInfo;
1eaf0 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62  .  SqliteDb *pDb
1eb00 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  ;.  sqlite3_stmt
1eb10 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 63   *pStmt = 0;.  c
1eb20 68 61 72 20 7a 42 75 66 5b 31 30 30 5d 3b 0a 0a  har zBuf[100];..
1eb30 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b    if( objc!=2 ){
1eb40 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  .    Tcl_WrongNu
1eb50 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
1eb60 20 6f 62 6a 76 2c 20 22 44 42 22 29 3b 0a 20 20   objv, "DB");.  
1eb70 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
1eb80 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21  OR;.  }..  if( !
1eb90 54 63 6c 5f 47 65 74 43 6f 6d 6d 61 6e 64 49 6e  Tcl_GetCommandIn
1eba0 66 6f 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  fo(interp, Tcl_G
1ebb0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
1ebc0 29 2c 20 26 63 6d 64 49 6e 66 6f 29 20 29 7b 0a  ), &cmdInfo) ){.
1ebd0 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
1ebe0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 6e 6f  sult(interp, "no
1ebf0 20 73 75 63 68 20 64 62 3a 20 22 2c 20 54 63 6c   such db: ", Tcl
1ec00 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
1ec10 31 5d 29 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  1]), (char*)0);.
1ec20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
1ec30 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 44 62 20  RROR;.  }.  pDb 
1ec40 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 63 6d 64  = (SqliteDb*)cmd
1ec50 49 6e 66 6f 2e 6f 62 6a 43 6c 69 65 6e 74 44 61  Info.objClientDa
1ec60 74 61 3b 0a 0a 20 20 69 66 28 20 70 44 62 2d 3e  ta;..  if( pDb->
1ec70 73 74 6d 74 4c 69 73 74 20 29 20 70 53 74 6d 74  stmtList ) pStmt
1ec80 20 3d 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74   = pDb->stmtList
1ec90 2d 3e 70 53 74 6d 74 3b 0a 20 20 69 66 28 20 73  ->pStmt;.  if( s
1eca0 71 6c 69 74 65 33 54 65 73 74 4d 61 6b 65 50 6f  qlite3TestMakePo
1ecb0 69 6e 74 65 72 53 74 72 28 69 6e 74 65 72 70 2c  interStr(interp,
1ecc0 20 7a 42 75 66 2c 20 70 53 74 6d 74 29 20 29 7b   zBuf, pStmt) ){
1ecd0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
1ece0 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 54 63 6c  ERROR;.  }.  Tcl
1ecf0 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
1ed00 70 2c 20 7a 42 75 66 2c 20 54 43 4c 5f 56 4f 4c  p, zBuf, TCL_VOL
1ed10 41 54 49 4c 45 29 3b 0a 0a 20 20 72 65 74 75 72  ATILE);..  retur
1ed20 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  n TCL_OK;.}.#end
1ed30 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 54 45 53  if /* SQLITE_TES
1ed40 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66  T */../*.** Conf
1ed50 69 67 75 72 65 20 74 68 65 20 69 6e 74 65 72 70  igure the interp
1ed60 72 65 74 65 72 20 70 61 73 73 65 64 20 61 73 20  reter passed as 
1ed70 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
1ed80 6e 74 20 74 6f 20 68 61 76 65 20 61 63 63 65 73  nt to have acces
1ed90 73 0a 2a 2a 20 74 6f 20 74 68 65 20 63 6f 6d 6d  s.** to the comm
1eda0 61 6e 64 73 20 61 6e 64 20 6c 69 6e 6b 65 64 20  ands and linked 
1edb0 76 61 72 69 61 62 6c 65 73 20 74 68 61 74 20 6d  variables that m
1edc0 61 6b 65 20 75 70 3a 0a 2a 2a 0a 2a 2a 20 20 20  ake up:.**.**   
1edd0 2a 20 74 68 65 20 5b 73 71 6c 69 74 65 33 5d 20  * the [sqlite3] 
1ede0 65 78 74 65 6e 73 69 6f 6e 20 69 74 73 65 6c 66  extension itself
1edf0 2c 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 53  ,.**.**   * If S
1ee00 51 4c 49 54 45 5f 54 43 4c 4d 44 35 20 6f 72 20  QLITE_TCLMD5 or 
1ee10 53 51 4c 49 54 45 5f 54 45 53 54 20 69 73 20 64  SQLITE_TEST is d
1ee20 65 66 69 6e 65 64 2c 20 74 68 65 20 4d 64 35 20  efined, the Md5 
1ee30 63 6f 6d 6d 61 6e 64 73 2c 20 61 6e 64 0a 2a 2a  commands, and.**
1ee40 0a 2a 2a 20 20 20 2a 20 49 66 20 53 51 4c 49 54  .**   * If SQLIT
1ee50 45 5f 54 45 53 54 20 69 73 20 73 65 74 2c 20 74  E_TEST is set, t
1ee60 68 65 20 76 61 72 69 6f 75 73 20 74 65 73 74 20  he various test 
1ee70 69 6e 74 65 72 66 61 63 65 73 20 75 73 65 64 20  interfaces used 
1ee80 62 79 20 74 68 65 20 54 63 6c 0a 2a 2a 20 20 20  by the Tcl.**   
1ee90 20 20 74 65 73 74 20 73 75 69 74 65 2e 0a 2a 2f    test suite..*/
1eea0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e 69  .static void ini
1eeb0 74 5f 61 6c 6c 28 54 63 6c 5f 49 6e 74 65 72 70  t_all(Tcl_Interp
1eec0 20 2a 69 6e 74 65 72 70 29 7b 0a 20 20 53 71 6c   *interp){.  Sql
1eed0 69 74 65 33 5f 49 6e 69 74 28 69 6e 74 65 72 70  ite3_Init(interp
1eee0 29 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  );..#if defined(
1eef0 53 51 4c 49 54 45 5f 54 45 53 54 29 20 7c 7c 20  SQLITE_TEST) || 
1ef00 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
1ef10 43 4c 4d 44 35 29 0a 20 20 4d 64 35 5f 49 6e 69  CLMD5).  Md5_Ini
1ef20 74 28 69 6e 74 65 72 70 29 3b 0a 23 65 6e 64 69  t(interp);.#endi
1ef30 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  f..#ifdef SQLITE
1ef40 5f 54 45 53 54 0a 20 20 7b 0a 20 20 20 20 65 78  _TEST.  {.    ex
1ef50 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 63  tern int Sqlitec
1ef60 6f 6e 66 69 67 5f 49 6e 69 74 28 54 63 6c 5f 49  onfig_Init(Tcl_I
1ef70 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74  nterp*);.    ext
1ef80 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65  ern int Sqlitete
1ef90 73 74 31 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74  st1_Init(Tcl_Int
1efa0 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72  erp*);.    exter
1efb0 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74  n int Sqlitetest
1efc0 32 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  2_Init(Tcl_Inter
1efd0 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20  p*);.    extern 
1efe0 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 33 5f  int Sqlitetest3_
1eff0 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a  Init(Tcl_Interp*
1f000 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e  );.    extern in
1f010 74 20 53 71 6c 69 74 65 74 65 73 74 34 5f 49 6e  t Sqlitetest4_In
1f020 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b  it(Tcl_Interp*);
1f030 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20  .    extern int 
1f040 53 71 6c 69 74 65 74 65 73 74 35 5f 49 6e 69 74  Sqlitetest5_Init
1f050 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20  (Tcl_Interp*);. 
1f060 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71     extern int Sq
1f070 6c 69 74 65 74 65 73 74 36 5f 49 6e 69 74 28 54  litetest6_Init(T
1f080 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20  cl_Interp*);.   
1f090 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69   extern int Sqli
1f0a0 74 65 74 65 73 74 37 5f 49 6e 69 74 28 54 63 6c  tetest7_Init(Tcl
1f0b0 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65  _Interp*);.    e
1f0c0 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65  xtern int Sqlite
1f0d0 74 65 73 74 38 5f 49 6e 69 74 28 54 63 6c 5f 49  test8_Init(Tcl_I
1f0e0 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74  nterp*);.    ext
1f0f0 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65  ern int Sqlitete
1f100 73 74 39 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74  st9_Init(Tcl_Int
1f110 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72  erp*);.    exter
1f120 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74  n int Sqlitetest
1f130 61 73 79 6e 63 5f 49 6e 69 74 28 54 63 6c 5f 49  async_Init(Tcl_I
1f140 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74  nterp*);.    ext
1f150 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65  ern int Sqlitete
1f160 73 74 5f 61 75 74 6f 65 78 74 5f 49 6e 69 74 28  st_autoext_Init(
1f170 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20  Tcl_Interp*);.  
1f180 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c    extern int Sql
1f190 69 74 65 74 65 73 74 5f 62 6c 6f 62 5f 49 6e 69  itetest_blob_Ini
1f1a0 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a  t(Tcl_Interp*);.
1f1b0 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53      extern int S
1f1c0 71 6c 69 74 65 74 65 73 74 5f 64 65 6d 6f 76 66  qlitetest_demovf
1f1d0 73 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  s_Init(Tcl_Inter
1f1e0 70 20 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e  p *);.    extern
1f1f0 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 5f   int Sqlitetest_
1f200 66 75 6e 63 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  func_Init(Tcl_In
1f210 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65  terp*);.    exte
1f220 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73  rn int Sqlitetes
1f230 74 5f 68 65 78 69 6f 5f 49 6e 69 74 28 54 63 6c  t_hexio_Init(Tcl
1f240 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65  _Interp*);.    e
1f250 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65  xtern int Sqlite
1f260 74 65 73 74 5f 69 6e 69 74 5f 49 6e 69 74 28 54  test_init_Init(T
1f270 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20  cl_Interp*);.   
1f280 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69   extern int Sqli
1f290 74 65 74 65 73 74 5f 6d 61 6c 6c 6f 63 5f 49 6e  tetest_malloc_In
1f2a0 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b  it(Tcl_Interp*);
1f2b0 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20  .    extern int 
1f2c0 53 71 6c 69 74 65 74 65 73 74 5f 6d 75 74 65 78  Sqlitetest_mutex
1f2d0 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
1f2e0 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69  *);.    extern i
1f2f0 6e 74 20 53 71 6c 69 74 65 74 65 73 74 73 63 68  nt Sqlitetestsch
1f300 65 6d 61 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74  ema_Init(Tcl_Int
1f310 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72  erp*);.    exter
1f320 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74  n int Sqlitetest
1f330 73 73 65 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74  sse_Init(Tcl_Int
1f340 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72  erp*);.    exter
1f350 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74  n int Sqlitetest
1f360 74 63 6c 76 61 72 5f 49 6e 69 74 28 54 63 6c 5f  tclvar_Init(Tcl_
1f370 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78  Interp*);.    ex
1f380 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74  tern int Sqlitet
1f390 65 73 74 66 73 5f 49 6e 69 74 28 54 63 6c 5f 49  estfs_Init(Tcl_I
1f3a0 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74  nterp*);.    ext
1f3b0 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65  ern int Sqlitete
1f3c0 73 74 54 68 72 65 61 64 5f 49 6e 69 74 28 54 63  stThread_Init(Tc
1f3d0 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20  l_Interp*);.    
1f3e0 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74  extern int Sqlit
1f3f0 65 74 65 73 74 4f 6e 65 66 69 6c 65 5f 49 6e 69  etestOnefile_Ini
1f400 74 28 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20  t();.    extern 
1f410 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 4f 73  int SqlitetestOs
1f420 69 6e 73 74 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  inst_Init(Tcl_In
1f430 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65  terp*);.    exte
1f440 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73  rn int Sqlitetes
1f450 74 62 61 63 6b 75 70 5f 49 6e 69 74 28 54 63 6c  tbackup_Init(Tcl
1f460 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65  _Interp*);.    e
1f470 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65  xtern int Sqlite
1f480 74 65 73 74 69 6e 74 61 72 72 61 79 5f 49 6e 69  testintarray_Ini
1f490 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a  t(Tcl_Interp*);.
1f4a0 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53      extern int S
1f4b0 71 6c 69 74 65 74 65 73 74 76 66 73 5f 49 6e 69  qlitetestvfs_Ini
1f4c0 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 29 3b  t(Tcl_Interp *);
1f4d0 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20  .    extern int 
1f4e0 53 71 6c 69 74 65 74 65 73 74 72 74 72 65 65 5f  Sqlitetestrtree_
1f4f0 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a  Init(Tcl_Interp*
1f500 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e  );.    extern in
1f510 74 20 53 71 6c 69 74 65 71 75 6f 74 61 5f 49 6e  t Sqlitequota_In
1f520 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b  it(Tcl_Interp*);
1f530 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20  .    extern int 
1f540 53 71 6c 69 74 65 6d 75 6c 74 69 70 6c 65 78 5f  Sqlitemultiplex_
1f550 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a  Init(Tcl_Interp*
1f560 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e  );.    extern in
1f570 74 20 53 71 6c 69 74 65 53 75 70 65 72 6c 6f 63  t SqliteSuperloc
1f580 6b 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  k_Init(Tcl_Inter
1f590 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20  p*);.    extern 
1f5a0 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 53 79  int SqlitetestSy
1f5b0 73 63 61 6c 6c 5f 49 6e 69 74 28 54 63 6c 5f 49  scall_Init(Tcl_I
1f5c0 6e 74 65 72 70 2a 29 3b 0a 23 69 66 20 64 65 66  nterp*);.#if def
1f5d0 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
1f5e0 4c 45 5f 53 45 53 53 49 4f 4e 29 20 26 26 20 64  LE_SESSION) && d
1f5f0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
1f600 41 42 4c 45 5f 50 52 45 55 50 44 41 54 45 5f 48  ABLE_PREUPDATE_H
1f610 4f 4f 4b 29 0a 20 20 20 20 65 78 74 65 72 6e 20  OOK).    extern 
1f620 69 6e 74 20 54 65 73 74 53 65 73 73 69 6f 6e 5f  int TestSession_
1f630 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a  Init(Tcl_Interp*
1f640 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 65 78  );.#endif.    ex
1f650 74 65 72 6e 20 69 6e 74 20 46 74 73 35 74 63 6c  tern int Fts5tcl
1f660 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
1f670 20 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20   *);.    extern 
1f680 69 6e 74 20 53 71 6c 69 74 65 52 62 75 5f 49 6e  int SqliteRbu_In
1f690 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b  it(Tcl_Interp*);
1f6a0 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20  .    extern int 
1f6b0 53 71 6c 69 74 65 74 65 73 74 74 63 6c 5f 49 6e  Sqlitetesttcl_In
1f6c0 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b  it(Tcl_Interp*);
1f6d0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
1f6e0 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 33 29  ITE_ENABLE_FTS3)
1f6f0 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49   || defined(SQLI
1f700 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 34 29 0a  TE_ENABLE_FTS4).
1f710 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53      extern int S
1f720 71 6c 69 74 65 74 65 73 74 66 74 73 33 5f 49 6e  qlitetestfts3_In
1f730 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  it(Tcl_Interp *i
1f740 6e 74 65 72 70 29 3b 0a 23 65 6e 64 69 66 0a 0a  nterp);.#endif..
1f750 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
1f760 41 42 4c 45 5f 5a 49 50 56 46 53 0a 20 20 20 20  ABLE_ZIPVFS.    
1f770 65 78 74 65 72 6e 20 69 6e 74 20 5a 69 70 76 66  extern int Zipvf
1f780 73 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  s_Init(Tcl_Inter
1f790 70 2a 29 3b 0a 20 20 20 20 5a 69 70 76 66 73 5f  p*);.    Zipvfs_
1f7a0 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 23 65  Init(interp);.#e
1f7b0 6e 64 69 66 0a 0a 20 20 20 20 53 71 6c 69 74 65  ndif..    Sqlite
1f7c0 63 6f 6e 66 69 67 5f 49 6e 69 74 28 69 6e 74 65  config_Init(inte
1f7d0 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74  rp);.    Sqlitet
1f7e0 65 73 74 31 5f 49 6e 69 74 28 69 6e 74 65 72 70  est1_Init(interp
1f7f0 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73  );.    Sqlitetes
1f800 74 32 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b  t2_Init(interp);
1f810 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 33  .    Sqlitetest3
1f820 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20  _Init(interp);. 
1f830 20 20 20 53 71 6c 69 74 65 74 65 73 74 34 5f 49     Sqlitetest4_I
1f840 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20  nit(interp);.   
1f850 20 53 71 6c 69 74 65 74 65 73 74 35 5f 49 6e 69   Sqlitetest5_Ini
1f860 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53  t(interp);.    S
1f870 71 6c 69 74 65 74 65 73 74 36 5f 49 6e 69 74 28  qlitetest6_Init(
1f880 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c  interp);.    Sql
1f890 69 74 65 74 65 73 74 37 5f 49 6e 69 74 28 69 6e  itetest7_Init(in
1f8a0 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74  terp);.    Sqlit
1f8b0 65 74 65 73 74 38 5f 49 6e 69 74 28 69 6e 74 65  etest8_Init(inte
1f8c0 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74  rp);.    Sqlitet
1f8d0 65 73 74 39 5f 49 6e 69 74 28 69 6e 74 65 72 70  est9_Init(interp
1f8e0 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73  );.    Sqlitetes
1f8f0 74 61 73 79 6e 63 5f 49 6e 69 74 28 69 6e 74 65  tasync_Init(inte
1f900 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74  rp);.    Sqlitet
1f910 65 73 74 5f 61 75 74 6f 65 78 74 5f 49 6e 69 74  est_autoext_Init
1f920 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71  (interp);.    Sq
1f930 6c 69 74 65 74 65 73 74 5f 62 6c 6f 62 5f 49 6e  litetest_blob_In
1f940 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  it(interp);.    
1f950 53 71 6c 69 74 65 74 65 73 74 5f 64 65 6d 6f 76  Sqlitetest_demov
1f960 66 73 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b  fs_Init(interp);
1f970 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 5f  .    Sqlitetest_
1f980 66 75 6e 63 5f 49 6e 69 74 28 69 6e 74 65 72 70  func_Init(interp
1f990 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73  );.    Sqlitetes
1f9a0 74 5f 68 65 78 69 6f 5f 49 6e 69 74 28 69 6e 74  t_hexio_Init(int
1f9b0 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65  erp);.    Sqlite
1f9c0 74 65 73 74 5f 69 6e 69 74 5f 49 6e 69 74 28 69  test_init_Init(i
1f9d0 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69  nterp);.    Sqli
1f9e0 74 65 74 65 73 74 5f 6d 61 6c 6c 6f 63 5f 49 6e  tetest_malloc_In
1f9f0 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  it(interp);.    
1fa00 53 71 6c 69 74 65 74 65 73 74 5f 6d 75 74 65 78  Sqlitetest_mutex
1fa10 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20  _Init(interp);. 
1fa20 20 20 20 53 71 6c 69 74 65 74 65 73 74 73 63 68     Sqlitetestsch
1fa30 65 6d 61 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  ema_Init(interp)
1fa40 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74  ;.    Sqlitetest
1fa50 74 63 6c 76 61 72 5f 49 6e 69 74 28 69 6e 74 65  tclvar_Init(inte
1fa60 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74  rp);.    Sqlitet
1fa70 65 73 74 66 73 5f 49 6e 69 74 28 69 6e 74 65 72  estfs_Init(inter
1fa80 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65  p);.    Sqlitete
1fa90 73 74 54 68 72 65 61 64 5f 49 6e 69 74 28 69 6e  stThread_Init(in
1faa0 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74  terp);.    Sqlit
1fab0 65 74 65 73 74 4f 6e 65 66 69 6c 65 5f 49 6e 69  etestOnefile_Ini
1fac0 74 28 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74  t();.    Sqlitet
1fad0 65 73 74 4f 73 69 6e 73 74 5f 49 6e 69 74 28 69  estOsinst_Init(i
1fae0 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69  nterp);.    Sqli
1faf0 74 65 74 65 73 74 62 61 63 6b 75 70 5f 49 6e 69  tetestbackup_Ini
1fb00 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53  t(interp);.    S
1fb10 71 6c 69 74 65 74 65 73 74 69 6e 74 61 72 72 61  qlitetestintarra
1fb20 79 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a  y_Init(interp);.
1fb30 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 76 66      Sqlitetestvf
1fb40 73 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a  s_Init(interp);.
1fb50 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 72 74      Sqlitetestrt
1fb60 72 65 65 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  ree_Init(interp)
1fb70 3b 0a 20 20 20 20 53 71 6c 69 74 65 71 75 6f 74  ;.    Sqlitequot
1fb80 61 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a  a_Init(interp);.
1fb90 20 20 20 20 53 71 6c 69 74 65 6d 75 6c 74 69 70      Sqlitemultip
1fba0 6c 65 78 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  lex_Init(interp)
1fbb0 3b 0a 20 20 20 20 53 71 6c 69 74 65 53 75 70 65  ;.    SqliteSupe
1fbc0 72 6c 6f 63 6b 5f 49 6e 69 74 28 69 6e 74 65 72  rlock_Init(inter
1fbd0 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65  p);.    Sqlitete
1fbe0 73 74 53 79 73 63 61 6c 6c 5f 49 6e 69 74 28 69  stSyscall_Init(i
1fbf0 6e 74 65 72 70 29 3b 0a 23 69 66 20 64 65 66 69  nterp);.#if defi
1fc00 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
1fc10 45 5f 53 45 53 53 49 4f 4e 29 20 26 26 20 64 65  E_SESSION) && de
1fc20 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
1fc30 42 4c 45 5f 50 52 45 55 50 44 41 54 45 5f 48 4f  BLE_PREUPDATE_HO
1fc40 4f 4b 29 0a 20 20 20 20 54 65 73 74 53 65 73 73  OK).    TestSess
1fc50 69 6f 6e 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  ion_Init(interp)
1fc60 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 46 74 73  ;.#endif.    Fts
1fc70 35 74 63 6c 5f 49 6e 69 74 28 69 6e 74 65 72 70  5tcl_Init(interp
1fc80 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 52 62 75  );.    SqliteRbu
1fc90 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20  _Init(interp);. 
1fca0 20 20 20 53 71 6c 69 74 65 74 65 73 74 74 63 6c     Sqlitetesttcl
1fcb0 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 0a  _Init(interp);..
1fcc0 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
1fcd0 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 33 29 20  TE_ENABLE_FTS3) 
1fce0 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  || defined(SQLIT
1fcf0 45 5f 45 4e 41 42 4c 45 5f 46 54 53 34 29 0a 20  E_ENABLE_FTS4). 
1fd00 20 20 20 53 71 6c 69 74 65 74 65 73 74 66 74 73     Sqlitetestfts
1fd10 33 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a  3_Init(interp);.
1fd20 23 65 6e 64 69 66 0a 0a 20 20 20 20 54 63 6c 5f  #endif..    Tcl_
1fd30 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64  CreateObjCommand
1fd40 28 0a 20 20 20 20 20 20 20 20 69 6e 74 65 72 70  (.        interp
1fd50 2c 20 22 6c 6f 61 64 5f 74 65 73 74 66 69 78 74  , "load_testfixt
1fd60 75 72 65 5f 65 78 74 65 6e 73 69 6f 6e 73 22 2c  ure_extensions",
1fd70 20 69 6e 69 74 5f 61 6c 6c 5f 63 6d 64 2c 20 30   init_all_cmd, 0
1fd80 2c 20 30 0a 20 20 20 20 29 3b 0a 20 20 20 20 54  , 0.    );.    T
1fd90 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d  cl_CreateObjComm
1fda0 61 6e 64 28 0a 20 20 20 20 20 20 20 20 69 6e 74  and(.        int
1fdb0 65 72 70 2c 20 22 64 62 5f 75 73 65 5f 6c 65 67  erp, "db_use_leg
1fdc0 61 63 79 5f 70 72 65 70 61 72 65 22 2c 20 64 62  acy_prepare", db
1fdd0 5f 75 73 65 5f 6c 65 67 61 63 79 5f 70 72 65 70  _use_legacy_prep
1fde0 61 72 65 5f 63 6d 64 2c 20 30 2c 20 30 0a 20 20  are_cmd, 0, 0.  
1fdf0 20 20 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65    );.    Tcl_Cre
1fe00 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 0a 20  ateObjCommand(. 
1fe10 20 20 20 20 20 20 20 69 6e 74 65 72 70 2c 20 22         interp, "
1fe20 64 62 5f 6c 61 73 74 5f 73 74 6d 74 5f 70 74 72  db_last_stmt_ptr
1fe30 22 2c 20 64 62 5f 6c 61 73 74 5f 73 74 6d 74 5f  ", db_last_stmt_
1fe40 70 74 72 2c 20 30 2c 20 30 0a 20 20 20 20 29 3b  ptr, 0, 0.    );
1fe50 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
1fe60 53 53 45 0a 20 20 20 20 53 71 6c 69 74 65 74 65  SSE.    Sqlitete
1fe70 73 74 73 73 65 5f 49 6e 69 74 28 69 6e 74 65 72  stsse_Init(inter
1fe80 70 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23  p);.#endif.  }.#
1fe90 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 20 4e 65 65 64  endif.}../* Need
1fea0 65 64 20 66 6f 72 20 74 68 65 20 73 65 74 72 6c  ed for the setrl
1feb0 69 6d 69 74 28 29 20 73 79 73 74 65 6d 20 63 61  imit() system ca
1fec0 6c 6c 20 6f 6e 20 75 6e 69 78 20 2a 2f 0a 23 69  ll on unix */.#i
1fed0 66 20 64 65 66 69 6e 65 64 28 75 6e 69 78 29 0a  f defined(unix).
1fee0 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 72 65  #include <sys/re
1fef0 73 6f 75 72 63 65 2e 68 3e 0a 23 65 6e 64 69 66  source.h>.#endif
1ff00 0a 0a 23 64 65 66 69 6e 65 20 54 43 4c 53 48 5f  ..#define TCLSH_
1ff10 4d 41 49 4e 20 6d 61 69 6e 20 20 20 2f 2a 20 4e  MAIN main   /* N
1ff20 65 65 64 65 64 20 74 6f 20 66 61 6b 65 20 6f 75  eeded to fake ou
1ff30 74 20 6d 6b 74 63 6c 61 70 70 20 2a 2f 0a 69 6e  t mktclapp */.in
1ff40 74 20 53 51 4c 49 54 45 5f 43 44 45 43 4c 20 54  t SQLITE_CDECL T
1ff50 43 4c 53 48 5f 4d 41 49 4e 28 69 6e 74 20 61 72  CLSH_MAIN(int ar
1ff60 67 63 2c 20 63 68 61 72 20 2a 2a 61 72 67 76 29  gc, char **argv)
1ff70 7b 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  {.  Tcl_Interp *
1ff80 69 6e 74 65 72 70 3b 0a 0a 23 69 66 20 21 64 65  interp;..#if !de
1ff90 66 69 6e 65 64 28 5f 57 49 4e 33 32 5f 57 43 45  fined(_WIN32_WCE
1ffa0 29 0a 20 20 69 66 28 20 67 65 74 65 6e 76 28 22  ).  if( getenv("
1ffb0 42 52 45 41 4b 22 29 20 29 7b 0a 20 20 20 20 66  BREAK") ){.    f
1ffc0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 0a 20  printf(stderr,. 
1ffd0 20 20 20 20 20 20 20 22 61 74 74 61 63 68 20 64         "attach d
1ffe0 65 62 75 67 67 65 72 20 74 6f 20 70 72 6f 63 65  ebugger to proce
1fff0 73 73 20 25 64 20 61 6e 64 20 70 72 65 73 73 20  ss %d and press 
20000 61 6e 79 20 6b 65 79 20 74 6f 20 63 6f 6e 74 69  any key to conti
20010 6e 75 65 2e 5c 6e 22 2c 0a 20 20 20 20 20 20 20  nue.\n",.       
20020 20 47 45 54 50 49 44 28 29 29 3b 0a 20 20 20 20   GETPID());.    
20030 66 67 65 74 63 28 73 74 64 69 6e 29 3b 0a 20 20  fgetc(stdin);.  
20040 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 53  }.#endif..  /* S
20050 69 6e 63 65 20 74 68 65 20 70 72 69 6d 61 72 79  ince the primary
20060 20 75 73 65 20 63 61 73 65 20 66 6f 72 20 74 68   use case for th
20070 69 73 20 62 69 6e 61 72 79 20 69 73 20 74 65 73  is binary is tes
20080 74 69 6e 67 20 6f 66 20 53 51 4c 69 74 65 2c 0a  ting of SQLite,.
20090 20 20 2a 2a 20 62 65 20 73 75 72 65 20 74 6f 20    ** be sure to 
200a0 67 65 6e 65 72 61 74 65 20 63 6f 72 65 20 66 69  generate core fi
200b0 6c 65 73 20 69 66 20 77 65 20 63 72 61 73 68 20  les if we crash 
200c0 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  */.#if defined(S
200d0 51 4c 49 54 45 5f 54 45 53 54 29 20 26 26 20 64  QLITE_TEST) && d
200e0 65 66 69 6e 65 64 28 75 6e 69 78 29 0a 20 20 7b  efined(unix).  {
200f0 20 73 74 72 75 63 74 20 72 6c 69 6d 69 74 20 78   struct rlimit x
20100 3b 0a 20 20 20 20 67 65 74 72 6c 69 6d 69 74 28  ;.    getrlimit(
20110 52 4c 49 4d 49 54 5f 43 4f 52 45 2c 20 26 78 29  RLIMIT_CORE, &x)
20120 3b 0a 20 20 20 20 78 2e 72 6c 69 6d 5f 63 75 72  ;.    x.rlim_cur
20130 20 3d 20 78 2e 72 6c 69 6d 5f 6d 61 78 3b 0a 20   = x.rlim_max;. 
20140 20 20 20 73 65 74 72 6c 69 6d 69 74 28 52 4c 49     setrlimit(RLI
20150 4d 49 54 5f 43 4f 52 45 2c 20 26 78 29 3b 0a 20  MIT_CORE, &x);. 
20160 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
20170 49 54 45 5f 54 45 53 54 20 26 26 20 75 6e 69 78  ITE_TEST && unix
20180 20 2a 2f 0a 0a 0a 20 20 2f 2a 20 43 61 6c 6c 20   */...  /* Call 
20190 73 71 6c 69 74 65 33 5f 73 68 75 74 64 6f 77 6e  sqlite3_shutdown
201a0 28 29 20 6f 6e 63 65 20 62 65 66 6f 72 65 20 64  () once before d
201b0 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 65 6c  oing anything el
201c0 73 65 2e 20 54 68 69 73 20 69 73 20 74 6f 0a 20  se. This is to. 
201d0 20 2a 2a 20 74 65 73 74 20 74 68 61 74 20 73 71   ** test that sq
201e0 6c 69 74 65 33 5f 73 68 75 74 64 6f 77 6e 28 29  lite3_shutdown()
201f0 20 63 61 6e 20 62 65 20 73 61 66 65 6c 79 20 63   can be safely c
20200 61 6c 6c 65 64 20 62 79 20 61 20 70 72 6f 63 65  alled by a proce
20210 73 73 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20 73  ss before.  ** s
20220 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a  qlite3_initializ
20230 65 28 29 20 69 73 2e 20 2a 2f 0a 20 20 73 71 6c  e() is. */.  sql
20240 69 74 65 33 5f 73 68 75 74 64 6f 77 6e 28 29 3b  ite3_shutdown();
20250 0a 0a 20 20 54 63 6c 5f 46 69 6e 64 45 78 65 63  ..  Tcl_FindExec
20260 75 74 61 62 6c 65 28 61 72 67 76 5b 30 5d 29 3b  utable(argv[0]);
20270 0a 20 20 54 63 6c 5f 53 65 74 53 79 73 74 65 6d  .  Tcl_SetSystem
20280 45 6e 63 6f 64 69 6e 67 28 4e 55 4c 4c 2c 20 22  Encoding(NULL, "
20290 75 74 66 2d 38 22 29 3b 0a 20 20 69 6e 74 65 72  utf-8");.  inter
202a0 70 20 3d 20 54 63 6c 5f 43 72 65 61 74 65 49 6e  p = Tcl_CreateIn
202b0 74 65 72 70 28 29 3b 0a 0a 23 69 66 20 54 43 4c  terp();..#if TCL
202c0 53 48 3d 3d 32 0a 20 20 73 71 6c 69 74 65 33 5f  SH==2.  sqlite3_
202d0 63 6f 6e 66 69 67 28 53 51 4c 49 54 45 5f 43 4f  config(SQLITE_CO
202e0 4e 46 49 47 5f 53 49 4e 47 4c 45 54 48 52 45 41  NFIG_SINGLETHREA
202f0 44 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69 6e  D);.#endif..  in
20300 69 74 5f 61 6c 6c 28 69 6e 74 65 72 70 29 3b 0a  it_all(interp);.
20310 20 20 69 66 28 20 61 72 67 63 3e 3d 32 20 29 7b    if( argc>=2 ){
20320 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
20330 63 68 61 72 20 7a 41 72 67 63 5b 33 32 5d 3b 0a  char zArgc[32];.
20340 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
20350 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 41 72 67  intf(sizeof(zArg
20360 63 29 2c 20 7a 41 72 67 63 2c 20 22 25 64 22 2c  c), zArgc, "%d",
20370 20 61 72 67 63 2d 28 33 2d 54 43 4c 53 48 29 29   argc-(3-TCLSH))
20380 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 56 61 72  ;.    Tcl_SetVar
20390 28 69 6e 74 65 72 70 2c 22 61 72 67 63 22 2c 20  (interp,"argc", 
203a0 7a 41 72 67 63 2c 20 54 43 4c 5f 47 4c 4f 42 41  zArgc, TCL_GLOBA
203b0 4c 5f 4f 4e 4c 59 29 3b 0a 20 20 20 20 54 63 6c  L_ONLY);.    Tcl
203c0 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c 22  _SetVar(interp,"
203d0 61 72 67 76 30 22 2c 61 72 67 76 5b 31 5d 2c 54  argv0",argv[1],T
203e0 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b  CL_GLOBAL_ONLY);
203f0 0a 20 20 20 20 54 63 6c 5f 53 65 74 56 61 72 28  .    Tcl_SetVar(
20400 69 6e 74 65 72 70 2c 22 61 72 67 76 22 2c 20 22  interp,"argv", "
20410 22 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e  ", TCL_GLOBAL_ON
20420 4c 59 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 33  LY);.    for(i=3
20430 2d 54 43 4c 53 48 3b 20 69 3c 61 72 67 63 3b 20  -TCLSH; i<argc; 
20440 69 2b 2b 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  i++){.      Tcl_
20450 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c 20 22  SetVar(interp, "
20460 61 72 67 76 22 2c 20 61 72 67 76 5b 69 5d 2c 0a  argv", argv[i],.
20470 20 20 20 20 20 20 20 20 20 20 54 43 4c 5f 47 4c            TCL_GL
20480 4f 42 41 4c 5f 4f 4e 4c 59 20 7c 20 54 43 4c 5f  OBAL_ONLY | TCL_
20490 4c 49 53 54 5f 45 4c 45 4d 45 4e 54 20 7c 20 54  LIST_ELEMENT | T
204a0 43 4c 5f 41 50 50 45 4e 44 5f 56 41 4c 55 45 29  CL_APPEND_VALUE)
204b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
204c0 54 43 4c 53 48 3d 3d 31 20 26 26 20 54 63 6c 5f  TCLSH==1 && Tcl_
204d0 45 76 61 6c 46 69 6c 65 28 69 6e 74 65 72 70 2c  EvalFile(interp,
204e0 20 61 72 67 76 5b 31 5d 29 21 3d 54 43 4c 5f 4f   argv[1])!=TCL_O
204f0 4b 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  K ){.      const
20500 20 63 68 61 72 20 2a 7a 49 6e 66 6f 20 3d 20 54   char *zInfo = T
20510 63 6c 5f 47 65 74 56 61 72 28 69 6e 74 65 72 70  cl_GetVar(interp
20520 2c 20 22 65 72 72 6f 72 49 6e 66 6f 22 2c 20 54  , "errorInfo", T
20530 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b  CL_GLOBAL_ONLY);
20540 0a 20 20 20 20 20 20 69 66 28 20 7a 49 6e 66 6f  .      if( zInfo
20550 3d 3d 30 20 29 20 7a 49 6e 66 6f 20 3d 20 54 63  ==0 ) zInfo = Tc
20560 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c  l_GetStringResul
20570 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 20  t(interp);.     
20580 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
20590 22 25 73 3a 20 25 73 5c 6e 22 2c 20 2a 61 72 67  "%s: %s\n", *arg
205a0 76 2c 20 7a 49 6e 66 6f 29 3b 0a 20 20 20 20 20  v, zInfo);.     
205b0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
205c0 0a 20 20 7d 0a 20 20 69 66 28 20 54 43 4c 53 48  .  }.  if( TCLSH
205d0 3d 3d 32 20 7c 7c 20 61 72 67 63 3c 3d 31 20 29  ==2 || argc<=1 )
205e0 7b 0a 20 20 20 20 54 63 6c 5f 47 6c 6f 62 61 6c  {.    Tcl_Global
205f0 45 76 61 6c 28 69 6e 74 65 72 70 2c 20 74 63 6c  Eval(interp, tcl
20600 73 68 5f 6d 61 69 6e 5f 6c 6f 6f 70 28 29 29 3b  sh_main_loop());
20610 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
20620 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 54 43 4c  .}.#endif /* TCL
20630 53 48 20 2a 2f 0a                                SH */.