/ Hex Artifact Content
Login

Artifact aef87dcd8cb66564d560ab48d43d19ac812a1eab:


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 20 21 64 65  .#endif..#if !de
4450: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
4460: 54 5f 54 52 41 43 45 29 20 26 26 20 21 64 65 66  T_TRACE) && !def
4470: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
4480: 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 29  _FLOATING_POINT)
4490: 20 26 26 20 5c 0a 20 20 20 20 21 64 65 66 69 6e   && \.    !defin
44a0: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ed(SQLITE_OMIT_D
44b0: 45 50 52 45 43 41 54 45 44 29 0a 2f 2a 0a 2a 2a  EPRECATED)./*.**
44c0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
44d0: 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 53   called by the S
44e0: 51 4c 69 74 65 20 74 72 61 63 65 20 68 61 6e 64  QLite trace hand
44f0: 6c 65 72 20 77 68 65 6e 65 76 65 72 20 61 20 6e  ler whenever a n
4500: 65 77 0a 2a 2a 20 62 6c 6f 63 6b 20 6f 66 20 53  ew.** block of S
4510: 51 4c 20 69 73 20 65 78 65 63 75 74 65 64 2e 20  QL is executed. 
4520: 20 54 68 65 20 54 43 4c 20 73 63 72 69 70 74 20   The TCL script 
4530: 69 6e 20 70 44 62 2d 3e 7a 54 72 61 63 65 20 69  in pDb->zTrace i
4540: 73 20 65 78 65 63 75 74 65 64 2e 0a 2a 2f 0a 73  s executed..*/.s
4550: 74 61 74 69 63 20 76 6f 69 64 20 44 62 54 72 61  tatic void DbTra
4560: 63 65 48 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a  ceHandler(void *
4570: 63 64 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  cd, const char *
4580: 7a 53 71 6c 29 7b 0a 20 20 53 71 6c 69 74 65 44  zSql){.  SqliteD
4590: 62 20 2a 70 44 62 20 3d 20 28 53 71 6c 69 74 65  b *pDb = (Sqlite
45a0: 44 62 2a 29 63 64 3b 0a 20 20 54 63 6c 5f 44 53  Db*)cd;.  Tcl_DS
45b0: 74 72 69 6e 67 20 73 74 72 3b 0a 0a 20 20 54 63  tring str;..  Tc
45c0: 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 73  l_DStringInit(&s
45d0: 74 72 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69  tr);.  Tcl_DStri
45e0: 6e 67 41 70 70 65 6e 64 28 26 73 74 72 2c 20 70  ngAppend(&str, p
45f0: 44 62 2d 3e 7a 54 72 61 63 65 2c 20 2d 31 29 3b  Db->zTrace, -1);
4600: 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70  .  Tcl_DStringAp
4610: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 26 73 74 72  pendElement(&str
4620: 2c 20 7a 53 71 6c 29 3b 0a 20 20 54 63 6c 5f 45  , zSql);.  Tcl_E
4630: 76 61 6c 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c  val(pDb->interp,
4640: 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75   Tcl_DStringValu
4650: 65 28 26 73 74 72 29 29 3b 0a 20 20 54 63 6c 5f  e(&str));.  Tcl_
4660: 44 53 74 72 69 6e 67 46 72 65 65 28 26 73 74 72  DStringFree(&str
4670: 29 3b 0a 20 20 54 63 6c 5f 52 65 73 65 74 52 65  );.  Tcl_ResetRe
4680: 73 75 6c 74 28 70 44 62 2d 3e 69 6e 74 65 72 70  sult(pDb->interp
4690: 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  );.}.#endif..#if
46a0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
46b0: 5f 54 52 41 43 45 0a 2f 2a 0a 2a 2a 20 54 68 69  _TRACE./*.** Thi
46c0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
46d0: 6c 65 64 20 62 79 20 74 68 65 20 53 51 4c 69 74  led by the SQLit
46e0: 65 20 74 72 61 63 65 5f 76 32 20 68 61 6e 64 6c  e trace_v2 handl
46f0: 65 72 20 77 68 65 6e 65 76 65 72 20 61 20 6e 65  er whenever a ne
4700: 77 0a 2a 2a 20 73 75 70 70 6f 72 74 65 64 20 65  w.** supported e
4710: 76 65 6e 74 20 69 73 20 67 65 6e 65 72 61 74 65  vent is generate
4720: 64 2e 20 20 55 6e 73 75 70 70 6f 72 74 65 64 20  d.  Unsupported 
4730: 65 76 65 6e 74 20 74 79 70 65 73 20 61 72 65 20  event types are 
4740: 69 67 6e 6f 72 65 64 2e 0a 2a 2a 20 54 68 65 20  ignored..** The 
4750: 54 43 4c 20 73 63 72 69 70 74 20 69 6e 20 70 44  TCL script in pD
4760: 62 2d 3e 7a 54 72 61 63 65 56 32 20 69 73 20 65  b->zTraceV2 is e
4770: 78 65 63 75 74 65 64 2c 20 77 69 74 68 20 74 68  xecuted, with th
4780: 65 20 61 72 67 75 6d 65 6e 74 73 20 66 6f 72 0a  e arguments for.
4790: 2a 2a 20 74 68 65 20 65 76 65 6e 74 20 61 70 70  ** the event app
47a0: 65 6e 64 65 64 20 74 6f 20 69 74 20 28 61 73 20  ended to it (as 
47b0: 6c 69 73 74 20 65 6c 65 6d 65 6e 74 73 29 2e 0a  list elements)..
47c0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 44 62  */.static int Db
47d0: 54 72 61 63 65 56 32 48 61 6e 64 6c 65 72 28 0a  TraceV2Handler(.
47e0: 20 20 75 6e 73 69 67 6e 65 64 20 74 79 70 65 2c    unsigned type,
47f0: 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 53   /* One of the S
4800: 51 4c 49 54 45 5f 54 52 41 43 45 5f 2a 20 65 76  QLITE_TRACE_* ev
4810: 65 6e 74 20 74 79 70 65 73 2e 20 2a 2f 0a 20 20  ent types. */.  
4820: 76 6f 69 64 20 2a 63 64 2c 20 20 20 20 20 20 2f  void *cd,      /
4830: 2a 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 63  * The original c
4840: 6f 6e 74 65 78 74 20 64 61 74 61 20 70 6f 69 6e  ontext data poin
4850: 74 65 72 2e 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  ter. */.  void *
4860: 70 64 2c 20 20 20 20 20 20 2f 2a 20 50 72 69 6d  pd,      /* Prim
4870: 61 72 79 20 65 76 65 6e 74 20 64 61 74 61 2c 20  ary event data, 
4880: 64 65 70 65 6e 64 73 20 6f 6e 20 65 76 65 6e 74  depends on event
4890: 20 74 79 70 65 2e 20 2a 2f 0a 20 20 76 6f 69 64   type. */.  void
48a0: 20 2a 78 64 20 20 20 20 20 20 20 2f 2a 20 45 78   *xd       /* Ex
48b0: 74 72 61 20 65 76 65 6e 74 20 64 61 74 61 2c 20  tra event data, 
48c0: 64 65 70 65 6e 64 73 20 6f 6e 20 65 76 65 6e 74  depends on event
48d0: 20 74 79 70 65 2e 20 2a 2f 0a 29 7b 0a 20 20 53   type. */.){.  S
48e0: 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28  qliteDb *pDb = (
48f0: 53 71 6c 69 74 65 44 62 2a 29 63 64 3b 0a 20 20  SqliteDb*)cd;.  
4900: 54 63 6c 5f 4f 62 6a 20 2a 70 43 6d 64 3b 0a 0a  Tcl_Obj *pCmd;..
4910: 20 20 73 77 69 74 63 68 28 20 74 79 70 65 20 29    switch( type )
4920: 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  {.    case SQLIT
4930: 45 5f 54 52 41 43 45 5f 53 54 4d 54 3a 20 7b 0a  E_TRACE_STMT: {.
4940: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74        sqlite3_st
4950: 6d 74 20 2a 70 53 74 6d 74 20 3d 20 28 73 71 6c  mt *pStmt = (sql
4960: 69 74 65 33 5f 73 74 6d 74 20 2a 29 70 64 3b 0a  ite3_stmt *)pd;.
4970: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 53 71 6c        char *zSql
4980: 20 3d 20 28 63 68 61 72 20 2a 29 78 64 3b 0a 0a   = (char *)xd;..
4990: 20 20 20 20 20 20 70 43 6d 64 20 3d 20 54 63 6c        pCmd = Tcl
49a0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 44  _NewStringObj(pD
49b0: 62 2d 3e 7a 54 72 61 63 65 56 32 2c 20 2d 31 29  b->zTraceV2, -1)
49c0: 3b 0a 20 20 20 20 20 20 54 63 6c 5f 49 6e 63 72  ;.      Tcl_Incr
49d0: 52 65 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a  RefCount(pCmd);.
49e0: 20 20 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62        Tcl_ListOb
49f0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 70  jAppendElement(p
4a00: 44 62 2d 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64  Db->interp, pCmd
4a10: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
4a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4a30: 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f   Tcl_NewWideIntO
4a40: 62 6a 28 28 54 63 6c 5f 57 69 64 65 49 6e 74 29  bj((Tcl_WideInt)
4a50: 70 53 74 6d 74 29 29 3b 0a 20 20 20 20 20 20 54  pStmt));.      T
4a60: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
4a70: 45 6c 65 6d 65 6e 74 28 70 44 62 2d 3e 69 6e 74  Element(pDb->int
4a80: 65 72 70 2c 20 70 43 6d 64 2c 0a 20 20 20 20 20  erp, pCmd,.     
4a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4aa0: 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 4e 65            Tcl_Ne
4ab0: 77 53 74 72 69 6e 67 4f 62 6a 28 7a 53 71 6c 2c  wStringObj(zSql,
4ac0: 20 2d 31 29 29 3b 0a 20 20 20 20 20 20 54 63 6c   -1));.      Tcl
4ad0: 5f 45 76 61 6c 4f 62 6a 45 78 28 70 44 62 2d 3e  _EvalObjEx(pDb->
4ae0: 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c 20 54 43  interp, pCmd, TC
4af0: 4c 5f 45 56 41 4c 5f 44 49 52 45 43 54 29 3b 0a  L_EVAL_DIRECT);.
4b00: 20 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65        Tcl_DecrRe
4b10: 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20  fCount(pCmd);.  
4b20: 20 20 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73      Tcl_ResetRes
4b30: 75 6c 74 28 70 44 62 2d 3e 69 6e 74 65 72 70 29  ult(pDb->interp)
4b40: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
4b50: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
4b60: 4c 49 54 45 5f 54 52 41 43 45 5f 50 52 4f 46 49  LITE_TRACE_PROFI
4b70: 4c 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  LE: {.      sqli
4b80: 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20  te3_stmt *pStmt 
4b90: 3d 20 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  = (sqlite3_stmt 
4ba0: 2a 29 70 64 3b 0a 20 20 20 20 20 20 73 71 6c 69  *)pd;.      sqli
4bb0: 74 65 33 5f 69 6e 74 36 34 20 6e 73 20 3d 20 28  te3_int64 ns = (
4bc0: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 78 64  sqlite3_int64)xd
4bd0: 3b 0a 0a 20 20 20 20 20 20 70 43 6d 64 20 3d 20  ;..      pCmd = 
4be0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
4bf0: 28 70 44 62 2d 3e 7a 54 72 61 63 65 56 32 2c 20  (pDb->zTraceV2, 
4c00: 2d 31 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 49  -1);.      Tcl_I
4c10: 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 43 6d 64  ncrRefCount(pCmd
4c20: 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 4c 69 73  );.      Tcl_Lis
4c30: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
4c40: 74 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20 70  t(pDb->interp, p
4c50: 43 6d 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Cmd,.           
4c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c70: 20 20 20 20 54 63 6c 5f 4e 65 77 57 69 64 65 49      Tcl_NewWideI
4c80: 6e 74 4f 62 6a 28 28 54 63 6c 5f 57 69 64 65 49  ntObj((Tcl_WideI
4c90: 6e 74 29 70 53 74 6d 74 29 29 3b 0a 20 20 20 20  nt)pStmt));.    
4ca0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
4cb0: 65 6e 64 45 6c 65 6d 65 6e 74 28 70 44 62 2d 3e  endElement(pDb->
4cc0: 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c 0a 20 20  interp, pCmd,.  
4cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 54 63 6c               Tcl
4cf0: 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 28  _NewWideIntObj((
4d00: 54 63 6c 5f 57 69 64 65 49 6e 74 29 6e 73 29 29  Tcl_WideInt)ns))
4d10: 3b 0a 20 20 20 20 20 20 54 63 6c 5f 45 76 61 6c  ;.      Tcl_Eval
4d20: 4f 62 6a 45 78 28 70 44 62 2d 3e 69 6e 74 65 72  ObjEx(pDb->inter
4d30: 70 2c 20 70 43 6d 64 2c 20 54 43 4c 5f 45 56 41  p, pCmd, TCL_EVA
4d40: 4c 5f 44 49 52 45 43 54 29 3b 0a 20 20 20 20 20  L_DIRECT);.     
4d50: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
4d60: 74 28 70 43 6d 64 29 3b 0a 20 20 20 20 20 20 54  t(pCmd);.      T
4d70: 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28 70  cl_ResetResult(p
4d80: 44 62 2d 3e 69 6e 74 65 72 70 29 3b 0a 20 20 20  Db->interp);.   
4d90: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
4da0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
4db0: 54 52 41 43 45 5f 52 4f 57 3a 20 7b 0a 20 20 20  TRACE_ROW: {.   
4dc0: 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20     sqlite3_stmt 
4dd0: 2a 70 53 74 6d 74 20 3d 20 28 73 71 6c 69 74 65  *pStmt = (sqlite
4de0: 33 5f 73 74 6d 74 20 2a 29 70 64 3b 0a 0a 20 20  3_stmt *)pd;..  
4df0: 20 20 20 20 70 43 6d 64 20 3d 20 54 63 6c 5f 4e      pCmd = Tcl_N
4e00: 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 44 62 2d  ewStringObj(pDb-
4e10: 3e 7a 54 72 61 63 65 56 32 2c 20 2d 31 29 3b 0a  >zTraceV2, -1);.
4e20: 20 20 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65        Tcl_IncrRe
4e30: 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20  fCount(pCmd);.  
4e40: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
4e50: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 70 44 62  ppendElement(pDb
4e60: 2d 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c 0a  ->interp, pCmd,.
4e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54                 T
4e90: 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a  cl_NewWideIntObj
4ea0: 28 28 54 63 6c 5f 57 69 64 65 49 6e 74 29 70 53  ((Tcl_WideInt)pS
4eb0: 74 6d 74 29 29 3b 0a 20 20 20 20 20 20 54 63 6c  tmt));.      Tcl
4ec0: 5f 45 76 61 6c 4f 62 6a 45 78 28 70 44 62 2d 3e  _EvalObjEx(pDb->
4ed0: 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c 20 54 43  interp, pCmd, TC
4ee0: 4c 5f 45 56 41 4c 5f 44 49 52 45 43 54 29 3b 0a  L_EVAL_DIRECT);.
4ef0: 20 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65        Tcl_DecrRe
4f00: 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20  fCount(pCmd);.  
4f10: 20 20 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73      Tcl_ResetRes
4f20: 75 6c 74 28 70 44 62 2d 3e 69 6e 74 65 72 70 29  ult(pDb->interp)
4f30: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
4f40: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
4f50: 4c 49 54 45 5f 54 52 41 43 45 5f 43 4c 4f 53 45  LITE_TRACE_CLOSE
4f60: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
4f70: 33 20 2a 64 62 20 3d 20 28 73 71 6c 69 74 65 33  3 *db = (sqlite3
4f80: 20 2a 29 70 64 3b 0a 0a 20 20 20 20 20 20 70 43   *)pd;..      pC
4f90: 6d 64 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69  md = Tcl_NewStri
4fa0: 6e 67 4f 62 6a 28 70 44 62 2d 3e 7a 54 72 61 63  ngObj(pDb->zTrac
4fb0: 65 56 32 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20  eV2, -1);.      
4fc0: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
4fd0: 28 70 43 6d 64 29 3b 0a 20 20 20 20 20 20 54 63  (pCmd);.      Tc
4fe0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
4ff0: 6c 65 6d 65 6e 74 28 70 44 62 2d 3e 69 6e 74 65  lement(pDb->inte
5000: 72 70 2c 20 70 43 6d 64 2c 0a 20 20 20 20 20 20  rp, pCmd,.      
5010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5020: 20 20 20 20 20 20 20 20 20 54 63 6c 5f 4e 65 77           Tcl_New
5030: 57 69 64 65 49 6e 74 4f 62 6a 28 28 54 63 6c 5f  WideIntObj((Tcl_
5040: 57 69 64 65 49 6e 74 29 64 62 29 29 3b 0a 20 20  WideInt)db));.  
5050: 20 20 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45      Tcl_EvalObjE
5060: 78 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20 70  x(pDb->interp, p
5070: 43 6d 64 2c 20 54 43 4c 5f 45 56 41 4c 5f 44 49  Cmd, TCL_EVAL_DI
5080: 52 45 43 54 29 3b 0a 20 20 20 20 20 20 54 63 6c  RECT);.      Tcl
5090: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 43  _DecrRefCount(pC
50a0: 6d 64 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 52  md);.      Tcl_R
50b0: 65 73 65 74 52 65 73 75 6c 74 28 70 44 62 2d 3e  esetResult(pDb->
50c0: 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 20 20 62  interp);.      b
50d0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
50e0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
50f0: 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  OK;.}.#endif..#i
5100: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
5110: 45 5f 4f 4d 49 54 5f 54 52 41 43 45 29 20 26 26  E_OMIT_TRACE) &&
5120: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
5130: 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50  _OMIT_FLOATING_P
5140: 4f 49 4e 54 29 20 26 26 20 5c 0a 20 20 20 20 21  OINT) && \.    !
5150: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
5160: 4d 49 54 5f 44 45 50 52 45 43 41 54 45 44 29 0a  MIT_DEPRECATED).
5170: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
5180: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20  ne is called by 
5190: 74 68 65 20 53 51 4c 69 74 65 20 70 72 6f 66 69  the SQLite profi
51a0: 6c 65 20 68 61 6e 64 6c 65 72 20 61 66 74 65 72  le handler after
51b0: 20 61 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20   a statement.** 
51c0: 53 51 4c 20 68 61 73 20 65 78 65 63 75 74 65 64  SQL has executed
51d0: 2e 20 20 54 68 65 20 54 43 4c 20 73 63 72 69 70  .  The TCL scrip
51e0: 74 20 69 6e 20 70 44 62 2d 3e 7a 50 72 6f 66 69  t in pDb->zProfi
51f0: 6c 65 20 69 73 20 65 76 61 6c 75 61 74 65 64 2e  le is evaluated.
5200: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
5210: 44 62 50 72 6f 66 69 6c 65 48 61 6e 64 6c 65 72  DbProfileHandler
5220: 28 76 6f 69 64 20 2a 63 64 2c 20 63 6f 6e 73 74  (void *cd, const
5230: 20 63 68 61 72 20 2a 7a 53 71 6c 2c 20 73 71 6c   char *zSql, sql
5240: 69 74 65 5f 75 69 6e 74 36 34 20 74 6d 29 7b 0a  ite_uint64 tm){.
5250: 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20    SqliteDb *pDb 
5260: 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 63 64 3b  = (SqliteDb*)cd;
5270: 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 73  .  Tcl_DString s
5280: 74 72 3b 0a 20 20 63 68 61 72 20 7a 54 6d 5b 31  tr;.  char zTm[1
5290: 30 30 5d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f  00];..  sqlite3_
52a0: 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
52b0: 7a 54 6d 29 2d 31 2c 20 7a 54 6d 2c 20 22 25 6c  zTm)-1, zTm, "%l
52c0: 6c 64 22 2c 20 74 6d 29 3b 0a 20 20 54 63 6c 5f  ld", tm);.  Tcl_
52d0: 44 53 74 72 69 6e 67 49 6e 69 74 28 26 73 74 72  DStringInit(&str
52e0: 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  );.  Tcl_DString
52f0: 41 70 70 65 6e 64 28 26 73 74 72 2c 20 70 44 62  Append(&str, pDb
5300: 2d 3e 7a 50 72 6f 66 69 6c 65 2c 20 2d 31 29 3b  ->zProfile, -1);
5310: 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70  .  Tcl_DStringAp
5320: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 26 73 74 72  pendElement(&str
5330: 2c 20 7a 53 71 6c 29 3b 0a 20 20 54 63 6c 5f 44  , zSql);.  Tcl_D
5340: 53 74 72 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d  StringAppendElem
5350: 65 6e 74 28 26 73 74 72 2c 20 7a 54 6d 29 3b 0a  ent(&str, zTm);.
5360: 20 20 54 63 6c 5f 45 76 61 6c 28 70 44 62 2d 3e    Tcl_Eval(pDb->
5370: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 44 53 74 72  interp, Tcl_DStr
5380: 69 6e 67 56 61 6c 75 65 28 26 73 74 72 29 29 3b  ingValue(&str));
5390: 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72  .  Tcl_DStringFr
53a0: 65 65 28 26 73 74 72 29 3b 0a 20 20 54 63 6c 5f  ee(&str);.  Tcl_
53b0: 52 65 73 65 74 52 65 73 75 6c 74 28 70 44 62 2d  ResetResult(pDb-
53c0: 3e 69 6e 74 65 72 70 29 3b 0a 7d 0a 23 65 6e 64  >interp);.}.#end
53d0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  if../*.** This r
53e0: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
53f0: 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74   when a transact
5400: 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64  ion is committed
5410: 2e 20 20 54 68 65 0a 2a 2a 20 54 43 4c 20 73 63  .  The.** TCL sc
5420: 72 69 70 74 20 69 6e 20 70 44 62 2d 3e 7a 43 6f  ript in pDb->zCo
5430: 6d 6d 69 74 20 69 73 20 65 78 65 63 75 74 65 64  mmit is executed
5440: 2e 20 20 49 66 20 69 74 20 72 65 74 75 72 6e 73  .  If it returns
5450: 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 72 0a 2a 2a 20   non-zero or.** 
5460: 69 66 20 69 74 20 74 68 72 6f 77 73 20 61 6e 20  if it throws an 
5470: 65 78 63 65 70 74 69 6f 6e 2c 20 74 68 65 20 74  exception, the t
5480: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f  ransaction is ro
5490: 6c 6c 65 64 20 62 61 63 6b 20 69 6e 73 74 65 61  lled back instea
54a0: 64 0a 2a 2a 20 6f 66 20 62 65 69 6e 67 20 63 6f  d.** of being co
54b0: 6d 6d 69 74 74 65 64 2e 0a 2a 2f 0a 73 74 61 74  mmitted..*/.stat
54c0: 69 63 20 69 6e 74 20 44 62 43 6f 6d 6d 69 74 48  ic int DbCommitH
54d0: 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a 63 64 29  andler(void *cd)
54e0: 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44  {.  SqliteDb *pD
54f0: 62 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 63  b = (SqliteDb*)c
5500: 64 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  d;.  int rc;..  
5510: 72 63 20 3d 20 54 63 6c 5f 45 76 61 6c 28 70 44  rc = Tcl_Eval(pD
5520: 62 2d 3e 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e  b->interp, pDb->
5530: 7a 43 6f 6d 6d 69 74 29 3b 0a 20 20 69 66 28 20  zCommit);.  if( 
5540: 72 63 21 3d 54 43 4c 5f 4f 4b 20 7c 7c 20 61 74  rc!=TCL_OK || at
5550: 6f 69 28 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  oi(Tcl_GetString
5560: 52 65 73 75 6c 74 28 70 44 62 2d 3e 69 6e 74 65  Result(pDb->inte
5570: 72 70 29 29 20 29 7b 0a 20 20 20 20 72 65 74 75  rp)) ){.    retu
5580: 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 1;.  }.  retu
5590: 72 6e 20 30 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  rn 0;.}..static 
55a0: 76 6f 69 64 20 44 62 52 6f 6c 6c 62 61 63 6b 48  void DbRollbackH
55b0: 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a 63 6c 69  andler(void *cli
55c0: 65 6e 74 44 61 74 61 29 7b 0a 20 20 53 71 6c 69  entData){.  Sqli
55d0: 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53 71 6c  teDb *pDb = (Sql
55e0: 69 74 65 44 62 2a 29 63 6c 69 65 6e 74 44 61 74  iteDb*)clientDat
55f0: 61 3b 0a 20 20 61 73 73 65 72 74 28 70 44 62 2d  a;.  assert(pDb-
5600: 3e 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 29 3b  >pRollbackHook);
5610: 0a 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d 54  .  if( TCL_OK!=T
5620: 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70 44 62  cl_EvalObjEx(pDb
5630: 2d 3e 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 70  ->interp, pDb->p
5640: 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 2c 20 30 29  RollbackHook, 0)
5650: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 42 61 63 6b   ){.    Tcl_Back
5660: 67 72 6f 75 6e 64 45 72 72 6f 72 28 70 44 62 2d  groundError(pDb-
5670: 3e 69 6e 74 65 72 70 29 3b 0a 20 20 7d 0a 7d 0a  >interp);.  }.}.
5680: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 70 72 6f 63  ./*.** This proc
5690: 65 64 75 72 65 20 68 61 6e 64 6c 65 73 20 77 61  edure handles wa
56a0: 6c 5f 68 6f 6f 6b 20 63 61 6c 6c 62 61 63 6b 73  l_hook callbacks
56b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
56c0: 44 62 57 61 6c 48 61 6e 64 6c 65 72 28 0a 20 20  DbWalHandler(.  
56d0: 76 6f 69 64 20 2a 63 6c 69 65 6e 74 44 61 74 61  void *clientData
56e0: 2c 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  ,.  sqlite3 *db,
56f0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
5700: 44 62 2c 0a 20 20 69 6e 74 20 6e 45 6e 74 72 79  Db,.  int nEntry
5710: 0a 29 7b 0a 20 20 69 6e 74 20 72 65 74 20 3d 20  .){.  int ret = 
5720: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 54 63 6c  SQLITE_OK;.  Tcl
5730: 5f 4f 62 6a 20 2a 70 3b 0a 20 20 53 71 6c 69 74  _Obj *p;.  Sqlit
5740: 65 44 62 20 2a 70 44 62 20 3d 20 28 53 71 6c 69  eDb *pDb = (Sqli
5750: 74 65 44 62 2a 29 63 6c 69 65 6e 74 44 61 74 61  teDb*)clientData
5760: 3b 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ;.  Tcl_Interp *
5770: 69 6e 74 65 72 70 20 3d 20 70 44 62 2d 3e 69 6e  interp = pDb->in
5780: 74 65 72 70 3b 0a 20 20 61 73 73 65 72 74 28 70  terp;.  assert(p
5790: 44 62 2d 3e 70 57 61 6c 48 6f 6f 6b 29 3b 0a 0a  Db->pWalHook);..
57a0: 20 20 61 73 73 65 72 74 28 20 64 62 3d 3d 70 44    assert( db==pD
57b0: 62 2d 3e 64 62 20 29 3b 0a 20 20 70 20 3d 20 54  b->db );.  p = T
57c0: 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28  cl_DuplicateObj(
57d0: 70 44 62 2d 3e 70 57 61 6c 48 6f 6f 6b 29 3b 0a  pDb->pWalHook);.
57e0: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
57f0: 6e 74 28 70 29 3b 0a 20 20 54 63 6c 5f 4c 69 73  nt(p);.  Tcl_Lis
5800: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
5810: 74 28 69 6e 74 65 72 70 2c 20 70 2c 20 54 63 6c  t(interp, p, Tcl
5820: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 44  _NewStringObj(zD
5830: 62 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c  b, -1));.  Tcl_L
5840: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
5850: 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 2c 20 54  ent(interp, p, T
5860: 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 6e 45 6e  cl_NewIntObj(nEn
5870: 74 72 79 29 29 3b 0a 20 20 69 66 28 20 54 43 4c  try));.  if( TCL
5880: 5f 4f 4b 21 3d 54 63 6c 5f 45 76 61 6c 4f 62 6a  _OK!=Tcl_EvalObj
5890: 45 78 28 69 6e 74 65 72 70 2c 20 70 2c 20 30 29  Ex(interp, p, 0)
58a0: 0a 20 20 20 7c 7c 20 54 43 4c 5f 4f 4b 21 3d 54  .   || TCL_OK!=T
58b0: 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
58c0: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
58d0: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
58e0: 29 2c 20 26 72 65 74 29 0a 20 20 29 7b 0a 20 20  ), &ret).  ){.  
58f0: 20 20 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64    Tcl_Background
5900: 45 72 72 6f 72 28 69 6e 74 65 72 70 29 3b 0a 20  Error(interp);. 
5910: 20 7d 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66   }.  Tcl_DecrRef
5920: 43 6f 75 6e 74 28 70 29 3b 0a 0a 20 20 72 65 74  Count(p);..  ret
5930: 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 23 69 66 20  urn ret;.}..#if 
5940: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
5950: 45 53 54 29 20 26 26 20 64 65 66 69 6e 65 64 28  EST) && defined(
5960: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 55 4e  SQLITE_ENABLE_UN
5970: 4c 4f 43 4b 5f 4e 4f 54 49 46 59 29 0a 73 74 61  LOCK_NOTIFY).sta
5980: 74 69 63 20 76 6f 69 64 20 73 65 74 54 65 73 74  tic void setTest
5990: 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 56 61 72 73  UnlockNotifyVars
59a0: 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74  (Tcl_Interp *int
59b0: 65 72 70 2c 20 69 6e 74 20 69 41 72 67 2c 20 69  erp, int iArg, i
59c0: 6e 74 20 6e 41 72 67 29 7b 0a 20 20 63 68 61 72  nt nArg){.  char
59d0: 20 7a 42 75 66 5b 36 34 5d 3b 0a 20 20 73 71 6c   zBuf[64];.  sql
59e0: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
59f0: 7a 65 6f 66 28 7a 42 75 66 29 2c 20 7a 42 75 66  zeof(zBuf), zBuf
5a00: 2c 20 22 25 64 22 2c 20 69 41 72 67 29 3b 0a 20  , "%d", iArg);. 
5a10: 20 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65   Tcl_SetVar(inte
5a20: 72 70 2c 20 22 73 71 6c 69 74 65 5f 75 6e 6c 6f  rp, "sqlite_unlo
5a30: 63 6b 5f 6e 6f 74 69 66 79 5f 61 72 67 22 2c 20  ck_notify_arg", 
5a40: 7a 42 75 66 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c  zBuf, TCL_GLOBAL
5a50: 5f 4f 4e 4c 59 29 3b 0a 20 20 73 71 6c 69 74 65  _ONLY);.  sqlite
5a60: 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
5a70: 66 28 7a 42 75 66 29 2c 20 7a 42 75 66 2c 20 22  f(zBuf), zBuf, "
5a80: 25 64 22 2c 20 6e 41 72 67 29 3b 0a 20 20 54 63  %d", nArg);.  Tc
5a90: 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c  l_SetVar(interp,
5aa0: 20 22 73 71 6c 69 74 65 5f 75 6e 6c 6f 63 6b 5f   "sqlite_unlock_
5ab0: 6e 6f 74 69 66 79 5f 61 72 67 63 6f 75 6e 74 22  notify_argcount"
5ac0: 2c 20 7a 42 75 66 2c 20 54 43 4c 5f 47 4c 4f 42  , zBuf, TCL_GLOB
5ad0: 41 4c 5f 4f 4e 4c 59 29 3b 0a 7d 0a 23 65 6c 73  AL_ONLY);.}.#els
5ae0: 65 0a 23 20 64 65 66 69 6e 65 20 73 65 74 54 65  e.# define setTe
5af0: 73 74 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 56 61  stUnlockNotifyVa
5b00: 72 73 28 78 2c 79 2c 7a 29 0a 23 65 6e 64 69 66  rs(x,y,z).#endif
5b10: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
5b20: 45 4e 41 42 4c 45 5f 55 4e 4c 4f 43 4b 5f 4e 4f  ENABLE_UNLOCK_NO
5b30: 54 49 46 59 0a 73 74 61 74 69 63 20 76 6f 69 64  TIFY.static void
5b40: 20 44 62 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 28   DbUnlockNotify(
5b50: 76 6f 69 64 20 2a 2a 61 70 41 72 67 2c 20 69 6e  void **apArg, in
5b60: 74 20 6e 41 72 67 29 7b 0a 20 20 69 6e 74 20 69  t nArg){.  int i
5b70: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
5b80: 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63  Arg; i++){.    c
5b90: 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67 73 20 3d  onst int flags =
5ba0: 20 28 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41   (TCL_EVAL_GLOBA
5bb0: 4c 7c 54 43 4c 5f 45 56 41 4c 5f 44 49 52 45 43  L|TCL_EVAL_DIREC
5bc0: 54 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 44 62  T);.    SqliteDb
5bd0: 20 2a 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44   *pDb = (SqliteD
5be0: 62 20 2a 29 61 70 41 72 67 5b 69 5d 3b 0a 20 20  b *)apArg[i];.  
5bf0: 20 20 73 65 74 54 65 73 74 55 6e 6c 6f 63 6b 4e    setTestUnlockN
5c00: 6f 74 69 66 79 56 61 72 73 28 70 44 62 2d 3e 69  otifyVars(pDb->i
5c10: 6e 74 65 72 70 2c 20 69 2c 20 6e 41 72 67 29 3b  nterp, i, nArg);
5c20: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 44 62  .    assert( pDb
5c30: 2d 3e 70 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 29  ->pUnlockNotify)
5c40: 3b 0a 20 20 20 20 54 63 6c 5f 45 76 61 6c 4f 62  ;.    Tcl_EvalOb
5c50: 6a 45 78 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c  jEx(pDb->interp,
5c60: 20 70 44 62 2d 3e 70 55 6e 6c 6f 63 6b 4e 6f 74   pDb->pUnlockNot
5c70: 69 66 79 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20  ify, flags);.   
5c80: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
5c90: 74 28 70 44 62 2d 3e 70 55 6e 6c 6f 63 6b 4e 6f  t(pDb->pUnlockNo
5ca0: 74 69 66 79 29 3b 0a 20 20 20 20 70 44 62 2d 3e  tify);.    pDb->
5cb0: 70 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 20 3d 20  pUnlockNotify = 
5cc0: 30 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a  0;.  }.}.#endif.
5cd0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
5ce0: 4e 41 42 4c 45 5f 50 52 45 55 50 44 41 54 45 5f  NABLE_PREUPDATE_
5cf0: 48 4f 4f 4b 0a 2f 2a 0a 2a 2a 20 50 72 65 2d 75  HOOK./*.** Pre-u
5d00: 70 64 61 74 65 20 68 6f 6f 6b 20 63 61 6c 6c 62  pdate hook callb
5d10: 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ack..*/.static v
5d20: 6f 69 64 20 44 62 50 72 65 55 70 64 61 74 65 48  oid DbPreUpdateH
5d30: 61 6e 64 6c 65 72 28 0a 20 20 76 6f 69 64 20 2a  andler(.  void *
5d40: 70 2c 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  p,.  sqlite3 *db
5d50: 2c 0a 20 20 69 6e 74 20 6f 70 2c 0a 20 20 63 6f  ,.  int op,.  co
5d60: 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 2c 0a 20  nst char *zDb,. 
5d70: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 62   const char *zTb
5d80: 6c 2c 0a 20 20 73 71 6c 69 74 65 5f 69 6e 74 36  l,.  sqlite_int6
5d90: 34 20 69 4b 65 79 31 2c 0a 20 20 73 71 6c 69 74  4 iKey1,.  sqlit
5da0: 65 5f 69 6e 74 36 34 20 69 4b 65 79 32 0a 29 7b  e_int64 iKey2.){
5db0: 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62  .  SqliteDb *pDb
5dc0: 20 3d 20 28 53 71 6c 69 74 65 44 62 20 2a 29 70   = (SqliteDb *)p
5dd0: 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 43 6d  ;.  Tcl_Obj *pCm
5de0: 64 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  d;.  static cons
5df0: 74 20 63 68 61 72 20 2a 61 7a 53 74 72 5b 5d 20  t char *azStr[] 
5e00: 3d 20 7b 22 44 45 4c 45 54 45 22 2c 20 22 49 4e  = {"DELETE", "IN
5e10: 53 45 52 54 22 2c 20 22 55 50 44 41 54 45 22 7d  SERT", "UPDATE"}
5e20: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 28 53 51  ;..  assert( (SQ
5e30: 4c 49 54 45 5f 44 45 4c 45 54 45 2d 31 29 2f 39  LITE_DELETE-1)/9
5e40: 20 3d 3d 20 30 20 29 3b 0a 20 20 61 73 73 65 72   == 0 );.  asser
5e50: 74 28 20 28 53 51 4c 49 54 45 5f 49 4e 53 45 52  t( (SQLITE_INSER
5e60: 54 2d 31 29 2f 39 20 3d 3d 20 31 20 29 3b 0a 20  T-1)/9 == 1 );. 
5e70: 20 61 73 73 65 72 74 28 20 28 53 51 4c 49 54 45   assert( (SQLITE
5e80: 5f 55 50 44 41 54 45 2d 31 29 2f 39 20 3d 3d 20  _UPDATE-1)/9 == 
5e90: 32 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  2 );.  assert( p
5ea0: 44 62 2d 3e 70 50 72 65 55 70 64 61 74 65 48 6f  Db->pPreUpdateHo
5eb0: 6f 6b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ok );.  assert( 
5ec0: 64 62 3d 3d 70 44 62 2d 3e 64 62 20 29 3b 0a 20  db==pDb->db );. 
5ed0: 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 53 51 4c   assert( op==SQL
5ee0: 49 54 45 5f 49 4e 53 45 52 54 20 7c 7c 20 6f 70  ITE_INSERT || op
5ef0: 3d 3d 53 51 4c 49 54 45 5f 55 50 44 41 54 45 20  ==SQLITE_UPDATE 
5f00: 7c 7c 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 44 45  || op==SQLITE_DE
5f10: 4c 45 54 45 20 29 3b 0a 0a 20 20 70 43 6d 64 20  LETE );..  pCmd 
5f20: 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f  = Tcl_DuplicateO
5f30: 62 6a 28 70 44 62 2d 3e 70 50 72 65 55 70 64 61  bj(pDb->pPreUpda
5f40: 74 65 48 6f 6f 6b 29 3b 0a 20 20 54 63 6c 5f 49  teHook);.  Tcl_I
5f50: 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 43 6d 64  ncrRefCount(pCmd
5f60: 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  );.  Tcl_ListObj
5f70: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c  AppendElement(0,
5f80: 20 70 43 6d 64 2c 20 54 63 6c 5f 4e 65 77 53 74   pCmd, Tcl_NewSt
5f90: 72 69 6e 67 4f 62 6a 28 61 7a 53 74 72 5b 28 6f  ringObj(azStr[(o
5fa0: 70 2d 31 29 2f 39 5d 2c 20 2d 31 29 29 3b 0a 20  p-1)/9], -1));. 
5fb0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
5fc0: 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 43 6d  ndElement(0, pCm
5fd0: 64 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  d, Tcl_NewString
5fe0: 4f 62 6a 28 7a 44 62 2c 20 2d 31 29 29 3b 0a 20  Obj(zDb, -1));. 
5ff0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
6000: 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 43 6d  ndElement(0, pCm
6010: 64 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  d, Tcl_NewString
6020: 4f 62 6a 28 7a 54 62 6c 2c 20 2d 31 29 29 3b 0a  Obj(zTbl, -1));.
6030: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
6040: 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 43  endElement(0, pC
6050: 6d 64 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65 49  md, Tcl_NewWideI
6060: 6e 74 4f 62 6a 28 69 4b 65 79 31 29 29 3b 0a 20  ntObj(iKey1));. 
6070: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
6080: 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 43 6d  ndElement(0, pCm
6090: 64 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e  d, Tcl_NewWideIn
60a0: 74 4f 62 6a 28 69 4b 65 79 32 29 29 3b 0a 20 20  tObj(iKey2));.  
60b0: 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70 44  Tcl_EvalObjEx(pD
60c0: 62 2d 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c  b->interp, pCmd,
60d0: 20 54 43 4c 5f 45 56 41 4c 5f 44 49 52 45 43 54   TCL_EVAL_DIRECT
60e0: 29 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66  );.  Tcl_DecrRef
60f0: 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 7d 0a 23  Count(pCmd);.}.#
6100: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
6110: 45 4e 41 42 4c 45 5f 50 52 45 55 50 44 41 54 45  ENABLE_PREUPDATE
6120: 5f 48 4f 4f 4b 20 2a 2f 0a 0a 73 74 61 74 69 63  _HOOK */..static
6130: 20 76 6f 69 64 20 44 62 55 70 64 61 74 65 48 61   void DbUpdateHa
6140: 6e 64 6c 65 72 28 0a 20 20 76 6f 69 64 20 2a 70  ndler(.  void *p
6150: 2c 0a 20 20 69 6e 74 20 6f 70 2c 0a 20 20 63 6f  ,.  int op,.  co
6160: 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 2c 0a 20  nst char *zDb,. 
6170: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 62   const char *zTb
6180: 6c 2c 0a 20 20 73 71 6c 69 74 65 5f 69 6e 74 36  l,.  sqlite_int6
6190: 34 20 72 6f 77 69 64 0a 29 7b 0a 20 20 53 71 6c  4 rowid.){.  Sql
61a0: 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53 71  iteDb *pDb = (Sq
61b0: 6c 69 74 65 44 62 20 2a 29 70 3b 0a 20 20 54 63  liteDb *)p;.  Tc
61c0: 6c 5f 4f 62 6a 20 2a 70 43 6d 64 3b 0a 20 20 73  l_Obj *pCmd;.  s
61d0: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
61e0: 20 2a 61 7a 53 74 72 5b 5d 20 3d 20 7b 22 44 45   *azStr[] = {"DE
61f0: 4c 45 54 45 22 2c 20 22 49 4e 53 45 52 54 22 2c  LETE", "INSERT",
6200: 20 22 55 50 44 41 54 45 22 7d 3b 0a 0a 20 20 61   "UPDATE"};..  a
6210: 73 73 65 72 74 28 20 28 53 51 4c 49 54 45 5f 44  ssert( (SQLITE_D
6220: 45 4c 45 54 45 2d 31 29 2f 39 20 3d 3d 20 30 20  ELETE-1)/9 == 0 
6230: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 53 51  );.  assert( (SQ
6240: 4c 49 54 45 5f 49 4e 53 45 52 54 2d 31 29 2f 39  LITE_INSERT-1)/9
6250: 20 3d 3d 20 31 20 29 3b 0a 20 20 61 73 73 65 72   == 1 );.  asser
6260: 74 28 20 28 53 51 4c 49 54 45 5f 55 50 44 41 54  t( (SQLITE_UPDAT
6270: 45 2d 31 29 2f 39 20 3d 3d 20 32 20 29 3b 0a 0a  E-1)/9 == 2 );..
6280: 20 20 61 73 73 65 72 74 28 20 70 44 62 2d 3e 70    assert( pDb->p
6290: 55 70 64 61 74 65 48 6f 6f 6b 20 29 3b 0a 20 20  UpdateHook );.  
62a0: 61 73 73 65 72 74 28 20 6f 70 3d 3d 53 51 4c 49  assert( op==SQLI
62b0: 54 45 5f 49 4e 53 45 52 54 20 7c 7c 20 6f 70 3d  TE_INSERT || op=
62c0: 3d 53 51 4c 49 54 45 5f 55 50 44 41 54 45 20 7c  =SQLITE_UPDATE |
62d0: 7c 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 44 45 4c  | op==SQLITE_DEL
62e0: 45 54 45 20 29 3b 0a 0a 20 20 70 43 6d 64 20 3d  ETE );..  pCmd =
62f0: 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62   Tcl_DuplicateOb
6300: 6a 28 70 44 62 2d 3e 70 55 70 64 61 74 65 48 6f  j(pDb->pUpdateHo
6310: 6f 6b 29 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52  ok);.  Tcl_IncrR
6320: 65 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20  efCount(pCmd);. 
6330: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
6340: 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 43 6d  ndElement(0, pCm
6350: 64 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  d, Tcl_NewString
6360: 4f 62 6a 28 61 7a 53 74 72 5b 28 6f 70 2d 31 29  Obj(azStr[(op-1)
6370: 2f 39 5d 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c  /9], -1));.  Tcl
6380: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
6390: 65 6d 65 6e 74 28 30 2c 20 70 43 6d 64 2c 20 54  ement(0, pCmd, T
63a0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
63b0: 7a 44 62 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c  zDb, -1));.  Tcl
63c0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
63d0: 65 6d 65 6e 74 28 30 2c 20 70 43 6d 64 2c 20 54  ement(0, pCmd, T
63e0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
63f0: 7a 54 62 6c 2c 20 2d 31 29 29 3b 0a 20 20 54 63  zTbl, -1));.  Tc
6400: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
6410: 6c 65 6d 65 6e 74 28 30 2c 20 70 43 6d 64 2c 20  lement(0, pCmd, 
6420: 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62  Tcl_NewWideIntOb
6430: 6a 28 72 6f 77 69 64 29 29 3b 0a 20 20 54 63 6c  j(rowid));.  Tcl
6440: 5f 45 76 61 6c 4f 62 6a 45 78 28 70 44 62 2d 3e  _EvalObjEx(pDb->
6450: 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c 20 54 43  interp, pCmd, TC
6460: 4c 5f 45 56 41 4c 5f 44 49 52 45 43 54 29 3b 0a  L_EVAL_DIRECT);.
6470: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
6480: 6e 74 28 70 43 6d 64 29 3b 0a 7d 0a 0a 73 74 61  nt(pCmd);.}..sta
6490: 74 69 63 20 76 6f 69 64 20 74 63 6c 43 6f 6c 6c  tic void tclColl
64a0: 61 74 65 4e 65 65 64 65 64 28 0a 20 20 76 6f 69  ateNeeded(.  voi
64b0: 64 20 2a 70 43 74 78 2c 0a 20 20 73 71 6c 69 74  d *pCtx,.  sqlit
64c0: 65 33 20 2a 64 62 2c 0a 20 20 69 6e 74 20 65 6e  e3 *db,.  int en
64d0: 63 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  c,.  const char 
64e0: 2a 7a 4e 61 6d 65 0a 29 7b 0a 20 20 53 71 6c 69  *zName.){.  Sqli
64f0: 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53 71 6c  teDb *pDb = (Sql
6500: 69 74 65 44 62 20 2a 29 70 43 74 78 3b 0a 20 20  iteDb *)pCtx;.  
6510: 54 63 6c 5f 4f 62 6a 20 2a 70 53 63 72 69 70 74  Tcl_Obj *pScript
6520: 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65   = Tcl_Duplicate
6530: 4f 62 6a 28 70 44 62 2d 3e 70 43 6f 6c 6c 61 74  Obj(pDb->pCollat
6540: 65 4e 65 65 64 65 64 29 3b 0a 20 20 54 63 6c 5f  eNeeded);.  Tcl_
6550: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 53 63  IncrRefCount(pSc
6560: 72 69 70 74 29 3b 0a 20 20 54 63 6c 5f 4c 69 73  ript);.  Tcl_Lis
6570: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
6580: 74 28 30 2c 20 70 53 63 72 69 70 74 2c 20 54 63  t(0, pScript, Tc
6590: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a  l_NewStringObj(z
65a0: 4e 61 6d 65 2c 20 2d 31 29 29 3b 0a 20 20 54 63  Name, -1));.  Tc
65b0: 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70 44 62 2d  l_EvalObjEx(pDb-
65c0: 3e 69 6e 74 65 72 70 2c 20 70 53 63 72 69 70 74  >interp, pScript
65d0: 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 44 65 63 72  , 0);.  Tcl_Decr
65e0: 52 65 66 43 6f 75 6e 74 28 70 53 63 72 69 70 74  RefCount(pScript
65f0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
6600: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
6610: 65 64 20 74 6f 20 65 76 61 6c 75 61 74 65 20 61  ed to evaluate a
6620: 6e 20 53 51 4c 20 63 6f 6c 6c 61 74 69 6f 6e 20  n SQL collation 
6630: 66 75 6e 63 74 69 6f 6e 20 69 6d 70 6c 65 6d 65  function impleme
6640: 6e 74 65 64 0a 2a 2a 20 75 73 69 6e 67 20 54 43  nted.** using TC
6650: 4c 20 73 63 72 69 70 74 2e 0a 2a 2f 0a 73 74 61  L script..*/.sta
6660: 74 69 63 20 69 6e 74 20 74 63 6c 53 71 6c 43 6f  tic int tclSqlCo
6670: 6c 6c 61 74 65 28 0a 20 20 76 6f 69 64 20 2a 70  llate(.  void *p
6680: 43 74 78 2c 0a 20 20 69 6e 74 20 6e 41 2c 0a 20  Ctx,.  int nA,. 
6690: 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 41 2c   const void *zA,
66a0: 0a 20 20 69 6e 74 20 6e 42 2c 0a 20 20 63 6f 6e  .  int nB,.  con
66b0: 73 74 20 76 6f 69 64 20 2a 7a 42 0a 29 7b 0a 20  st void *zB.){. 
66c0: 20 53 71 6c 43 6f 6c 6c 61 74 65 20 2a 70 20 3d   SqlCollate *p =
66d0: 20 28 53 71 6c 43 6f 6c 6c 61 74 65 20 2a 29 70   (SqlCollate *)p
66e0: 43 74 78 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  Ctx;.  Tcl_Obj *
66f0: 70 43 6d 64 3b 0a 0a 20 20 70 43 6d 64 20 3d 20  pCmd;..  pCmd = 
6700: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
6710: 28 70 2d 3e 7a 53 63 72 69 70 74 2c 20 2d 31 29  (p->zScript, -1)
6720: 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43  ;.  Tcl_IncrRefC
6730: 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20 54 63  ount(pCmd);.  Tc
6740: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
6750: 6c 65 6d 65 6e 74 28 70 2d 3e 69 6e 74 65 72 70  lement(p->interp
6760: 2c 20 70 43 6d 64 2c 20 54 63 6c 5f 4e 65 77 53  , pCmd, Tcl_NewS
6770: 74 72 69 6e 67 4f 62 6a 28 7a 41 2c 20 6e 41 29  tringObj(zA, nA)
6780: 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  );.  Tcl_ListObj
6790: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 70 2d  AppendElement(p-
67a0: 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c 20 54  >interp, pCmd, T
67b0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
67c0: 7a 42 2c 20 6e 42 29 29 3b 0a 20 20 54 63 6c 5f  zB, nB));.  Tcl_
67d0: 45 76 61 6c 4f 62 6a 45 78 28 70 2d 3e 69 6e 74  EvalObjEx(p->int
67e0: 65 72 70 2c 20 70 43 6d 64 2c 20 54 43 4c 5f 45  erp, pCmd, TCL_E
67f0: 56 41 4c 5f 44 49 52 45 43 54 29 3b 0a 20 20 54  VAL_DIRECT);.  T
6800: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
6810: 70 43 6d 64 29 3b 0a 20 20 72 65 74 75 72 6e 20  pCmd);.  return 
6820: 28 61 74 6f 69 28 54 63 6c 5f 47 65 74 53 74 72  (atoi(Tcl_GetStr
6830: 69 6e 67 52 65 73 75 6c 74 28 70 2d 3e 69 6e 74  ingResult(p->int
6840: 65 72 70 29 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  erp)));.}../*.**
6850: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
6860: 20 63 61 6c 6c 65 64 20 74 6f 20 65 76 61 6c 75   called to evalu
6870: 61 74 65 20 61 6e 20 53 51 4c 20 66 75 6e 63 74  ate an SQL funct
6880: 69 6f 6e 20 69 6d 70 6c 65 6d 65 6e 74 65 64 0a  ion implemented.
6890: 2a 2a 20 75 73 69 6e 67 20 54 43 4c 20 73 63 72  ** using TCL scr
68a0: 69 70 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ipt..*/.static v
68b0: 6f 69 64 20 74 63 6c 53 71 6c 46 75 6e 63 28 73  oid tclSqlFunc(s
68c0: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
68d0: 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67  context, int arg
68e0: 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  c, sqlite3_value
68f0: 2a 2a 61 72 67 76 29 7b 0a 20 20 53 71 6c 46 75  **argv){.  SqlFu
6900: 6e 63 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 5f  nc *p = sqlite3_
6910: 75 73 65 72 5f 64 61 74 61 28 63 6f 6e 74 65 78  user_data(contex
6920: 74 29 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  t);.  Tcl_Obj *p
6930: 43 6d 64 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  Cmd;.  int i;.  
6940: 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 61  int rc;..  if( a
6950: 72 67 63 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  rgc==0 ){.    /*
6960: 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f   If there are no
6970: 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 74 68   arguments to th
6980: 65 20 66 75 6e 63 74 69 6f 6e 2c 20 63 61 6c 6c  e function, call
6990: 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 20 6f   Tcl_EvalObjEx o
69a0: 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 73 63 72  n the.    ** scr
69b0: 69 70 74 20 6f 62 6a 65 63 74 20 64 69 72 65 63  ipt object direc
69c0: 74 6c 79 2e 20 20 54 68 69 73 20 61 6c 6c 6f 77  tly.  This allow
69d0: 73 20 74 68 65 20 54 43 4c 20 63 6f 6d 70 69 6c  s the TCL compil
69e0: 65 72 20 74 6f 20 67 65 6e 65 72 61 74 65 0a 20  er to generate. 
69f0: 20 20 20 2a 2a 20 62 79 74 65 63 6f 64 65 20 66     ** bytecode f
6a00: 6f 72 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6f  or the command o
6a10: 6e 20 74 68 65 20 66 69 72 73 74 20 69 6e 76 6f  n the first invo
6a20: 63 61 74 69 6f 6e 20 61 6e 64 20 74 68 75 73 20  cation and thus 
6a30: 6d 61 6b 65 0a 20 20 20 20 2a 2a 20 73 75 62 73  make.    ** subs
6a40: 65 71 75 65 6e 74 20 69 6e 76 6f 63 61 74 69 6f  equent invocatio
6a50: 6e 73 20 6d 75 63 68 20 66 61 73 74 65 72 2e 20  ns much faster. 
6a60: 2a 2f 0a 20 20 20 20 70 43 6d 64 20 3d 20 70 2d  */.    pCmd = p-
6a70: 3e 70 53 63 72 69 70 74 3b 0a 20 20 20 20 54 63  >pScript;.    Tc
6a80: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70  l_IncrRefCount(p
6a90: 43 6d 64 29 3b 0a 20 20 20 20 72 63 20 3d 20 54  Cmd);.    rc = T
6aa0: 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70 2d 3e  cl_EvalObjEx(p->
6ab0: 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c 20 30 29  interp, pCmd, 0)
6ac0: 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65  ;.    Tcl_DecrRe
6ad0: 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20  fCount(pCmd);.  
6ae0: 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66  }else{.    /* If
6af0: 20 74 68 65 72 65 20 61 72 65 20 61 72 67 75 6d   there are argum
6b00: 65 6e 74 73 20 74 6f 20 74 68 65 20 66 75 6e 63  ents to the func
6b10: 74 69 6f 6e 2c 20 6d 61 6b 65 20 61 20 73 68 61  tion, make a sha
6b20: 6c 6c 6f 77 20 63 6f 70 79 20 6f 66 20 74 68 65  llow copy of the
6b30: 0a 20 20 20 20 2a 2a 20 73 63 72 69 70 74 20 6f  .    ** script o
6b40: 62 6a 65 63 74 2c 20 6c 61 70 70 65 6e 64 20 74  bject, lappend t
6b50: 68 65 20 61 72 67 75 6d 65 6e 74 73 2c 20 74 68  he arguments, th
6b60: 65 6e 20 65 76 61 6c 75 61 74 65 20 74 68 65 20  en evaluate the 
6b70: 63 6f 70 79 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  copy..    **.   
6b80: 20 2a 2a 20 42 79 20 22 73 68 61 6c 6c 6f 77 22   ** By "shallow"
6b90: 20 63 6f 70 79 2c 20 77 65 20 6d 65 61 6e 20 6f   copy, we mean o
6ba0: 6e 6c 79 20 74 68 65 20 6f 75 74 65 72 20 6c 69  nly the outer li
6bb0: 73 74 20 54 63 6c 5f 4f 62 6a 20 69 73 20 64 75  st Tcl_Obj is du
6bc0: 70 6c 69 63 61 74 65 64 2e 0a 20 20 20 20 2a 2a  plicated..    **
6bd0: 20 54 68 65 20 6e 65 77 20 54 63 6c 5f 4f 62 6a   The new Tcl_Obj
6be0: 20 63 6f 6e 74 61 69 6e 73 20 70 6f 69 6e 74 65   contains pointe
6bf0: 72 73 20 74 6f 20 74 68 65 20 6f 72 69 67 69 6e  rs to the origin
6c00: 61 6c 20 6c 69 73 74 20 65 6c 65 6d 65 6e 74 73  al list elements
6c10: 2e 0a 20 20 20 20 2a 2a 20 54 68 61 74 20 77 61  ..    ** That wa
6c20: 79 2c 20 77 68 65 6e 20 54 63 6c 5f 45 76 61 6c  y, when Tcl_Eval
6c30: 4f 62 6a 76 28 29 20 69 73 20 72 75 6e 20 61 6e  Objv() is run an
6c40: 64 20 73 68 69 6d 6d 65 72 73 20 74 68 65 20 66  d shimmers the f
6c50: 69 72 73 74 20 65 6c 65 6d 65 6e 74 0a 20 20 20  irst element.   
6c60: 20 2a 2a 20 6f 66 20 74 68 65 20 6c 69 73 74 20   ** of the list 
6c70: 74 6f 20 74 63 6c 43 6d 64 4e 61 6d 65 54 79 70  to tclCmdNameTyp
6c80: 65 2c 20 74 68 61 74 20 61 6c 74 65 72 6e 61 74  e, that alternat
6c90: 65 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  e representation
6ca0: 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20   will.    ** be 
6cb0: 70 72 65 73 65 72 76 65 64 20 61 6e 64 20 72 65  preserved and re
6cc0: 75 73 65 64 20 6f 6e 20 74 68 65 20 6e 65 78 74  used on the next
6cd0: 20 69 6e 76 6f 63 61 74 69 6f 6e 2e 0a 20 20 20   invocation..   
6ce0: 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20   */.    Tcl_Obj 
6cf0: 2a 2a 61 41 72 67 3b 0a 20 20 20 20 69 6e 74 20  **aArg;.    int 
6d00: 6e 41 72 67 3b 0a 20 20 20 20 69 66 28 20 54 63  nArg;.    if( Tc
6d10: 6c 5f 4c 69 73 74 4f 62 6a 47 65 74 45 6c 65 6d  l_ListObjGetElem
6d20: 65 6e 74 73 28 70 2d 3e 69 6e 74 65 72 70 2c 20  ents(p->interp, 
6d30: 70 2d 3e 70 53 63 72 69 70 74 2c 20 26 6e 41 72  p->pScript, &nAr
6d40: 67 2c 20 26 61 41 72 67 29 20 29 7b 0a 20 20 20  g, &aArg) ){.   
6d50: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
6d60: 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c  t_error(context,
6d70: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65   Tcl_GetStringRe
6d80: 73 75 6c 74 28 70 2d 3e 69 6e 74 65 72 70 29 2c  sult(p->interp),
6d90: 20 2d 31 29 3b 0a 20 20 20 20 20 20 72 65 74 75   -1);.      retu
6da0: 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43  rn;.    }.    pC
6db0: 6d 64 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74  md = Tcl_NewList
6dc0: 4f 62 6a 28 6e 41 72 67 2c 20 61 41 72 67 29 3b  Obj(nArg, aArg);
6dd0: 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66  .    Tcl_IncrRef
6de0: 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20 20  Count(pCmd);.   
6df0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 67 63   for(i=0; i<argc
6e00: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71  ; i++){.      sq
6e10: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 49 6e  lite3_value *pIn
6e20: 20 3d 20 61 72 67 76 5b 69 5d 3b 0a 20 20 20 20   = argv[i];.    
6e30: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 56 61 6c 3b    Tcl_Obj *pVal;
6e40: 0a 0a 20 20 20 20 20 20 2f 2a 20 53 65 74 20 70  ..      /* Set p
6e50: 56 61 6c 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74  Val to contain t
6e60: 68 65 20 69 27 74 68 20 63 6f 6c 75 6d 6e 20 6f  he i'th column o
6e70: 66 20 74 68 69 73 20 72 6f 77 2e 20 2a 2f 0a 20  f this row. */. 
6e80: 20 20 20 20 20 73 77 69 74 63 68 28 20 73 71 6c       switch( sql
6e90: 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28  ite3_value_type(
6ea0: 70 49 6e 29 20 29 7b 0a 20 20 20 20 20 20 20 20  pIn) ){.        
6eb0: 63 61 73 65 20 53 51 4c 49 54 45 5f 42 4c 4f 42  case SQLITE_BLOB
6ec0: 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  : {.          in
6ed0: 74 20 62 79 74 65 73 20 3d 20 73 71 6c 69 74 65  t bytes = sqlite
6ee0: 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 70 49  3_value_bytes(pI
6ef0: 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 56  n);.          pV
6f00: 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 42 79 74 65  al = Tcl_NewByte
6f10: 41 72 72 61 79 4f 62 6a 28 73 71 6c 69 74 65 33  ArrayObj(sqlite3
6f20: 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 70 49 6e 29  _value_blob(pIn)
6f30: 2c 20 62 79 74 65 73 29 3b 0a 20 20 20 20 20 20  , bytes);.      
6f40: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
6f50: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63 61 73     }.        cas
6f60: 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52  e SQLITE_INTEGER
6f70: 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71  : {.          sq
6f80: 6c 69 74 65 5f 69 6e 74 36 34 20 76 20 3d 20 73  lite_int64 v = s
6f90: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74  qlite3_value_int
6fa0: 36 34 28 70 49 6e 29 3b 0a 20 20 20 20 20 20 20  64(pIn);.       
6fb0: 20 20 20 69 66 28 20 76 3e 3d 2d 32 31 34 37 34     if( v>=-21474
6fc0: 38 33 36 34 37 20 26 26 20 76 3c 3d 32 31 34 37  83647 && v<=2147
6fd0: 34 38 33 36 34 37 20 29 7b 0a 20 20 20 20 20 20  483647 ){.      
6fe0: 20 20 20 20 20 20 70 56 61 6c 20 3d 20 54 63 6c        pVal = Tcl
6ff0: 5f 4e 65 77 49 6e 74 4f 62 6a 28 28 69 6e 74 29  _NewIntObj((int)
7000: 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  v);.          }e
7010: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
7020: 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 57   pVal = Tcl_NewW
7030: 69 64 65 49 6e 74 4f 62 6a 28 76 29 3b 0a 20 20  ideIntObj(v);.  
7040: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7050: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
7060: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63 61 73     }.        cas
7070: 65 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54 3a 20  e SQLITE_FLOAT: 
7080: 7b 0a 20 20 20 20 20 20 20 20 20 20 64 6f 75 62  {.          doub
7090: 6c 65 20 72 20 3d 20 73 71 6c 69 74 65 33 5f 76  le r = sqlite3_v
70a0: 61 6c 75 65 5f 64 6f 75 62 6c 65 28 70 49 6e 29  alue_double(pIn)
70b0: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 56 61 6c  ;.          pVal
70c0: 20 3d 20 54 63 6c 5f 4e 65 77 44 6f 75 62 6c 65   = Tcl_NewDouble
70d0: 4f 62 6a 28 72 29 3b 0a 20 20 20 20 20 20 20 20  Obj(r);.        
70e0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
70f0: 20 7d 0a 20 20 20 20 20 20 20 20 63 61 73 65 20   }.        case 
7100: 53 51 4c 49 54 45 5f 4e 55 4c 4c 3a 20 7b 0a 20  SQLITE_NULL: {. 
7110: 20 20 20 20 20 20 20 20 20 70 56 61 6c 20 3d 20           pVal = 
7120: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
7130: 28 70 2d 3e 70 44 62 2d 3e 7a 4e 75 6c 6c 2c 20  (p->pDb->zNull, 
7140: 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62  -1);.          b
7150: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
7160: 20 20 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a          default:
7170: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74   {.          int
7180: 20 62 79 74 65 73 20 3d 20 73 71 6c 69 74 65 33   bytes = sqlite3
7190: 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 70 49 6e  _value_bytes(pIn
71a0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 56 61  );.          pVa
71b0: 6c 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  l = Tcl_NewStrin
71c0: 67 4f 62 6a 28 28 63 68 61 72 20 2a 29 73 71 6c  gObj((char *)sql
71d0: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
71e0: 70 49 6e 29 2c 20 62 79 74 65 73 29 3b 0a 20 20  pIn), bytes);.  
71f0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
7200: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
7210: 0a 20 20 20 20 20 20 72 63 20 3d 20 54 63 6c 5f  .      rc = Tcl_
7220: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
7230: 6d 65 6e 74 28 70 2d 3e 69 6e 74 65 72 70 2c 20  ment(p->interp, 
7240: 70 43 6d 64 2c 20 70 56 61 6c 29 3b 0a 20 20 20  pCmd, pVal);.   
7250: 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
7260: 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66       Tcl_DecrRef
7270: 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20 20  Count(pCmd);.   
7280: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
7290: 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78  ult_error(contex
72a0: 74 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  t, Tcl_GetString
72b0: 52 65 73 75 6c 74 28 70 2d 3e 69 6e 74 65 72 70  Result(p->interp
72c0: 29 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 20 20  ), -1);.        
72d0: 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a  return;.      }.
72e0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 70      }.    if( !p
72f0: 2d 3e 75 73 65 45 76 61 6c 4f 62 6a 76 20 29 7b  ->useEvalObjv ){
7300: 0a 20 20 20 20 20 20 2f 2a 20 54 63 6c 5f 45 76  .      /* Tcl_Ev
7310: 61 6c 4f 62 6a 45 78 28 29 20 77 69 6c 6c 20 61  alObjEx() will a
7320: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 61 6c  utomatically cal
7330: 6c 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 76 28 29  l Tcl_EvalObjv()
7340: 20 69 66 20 70 43 6d 64 0a 20 20 20 20 20 20 2a   if pCmd.      *
7350: 2a 20 69 73 20 61 20 6c 69 73 74 20 77 69 74 68  * is a list with
7360: 6f 75 74 20 61 20 73 74 72 69 6e 67 20 72 65 70  out a string rep
7370: 72 65 73 65 6e 74 61 74 69 6f 6e 2e 20 20 54 6f  resentation.  To
7380: 20 70 72 65 76 65 6e 74 20 74 68 69 73 20 66 72   prevent this fr
7390: 6f 6d 0a 20 20 20 20 20 20 2a 2a 20 68 61 70 70  om.      ** happ
73a0: 65 6e 69 6e 67 2c 20 6d 61 6b 65 20 73 75 72 65  ening, make sure
73b0: 20 70 43 6d 64 20 68 61 73 20 61 20 76 61 6c 69   pCmd has a vali
73c0: 64 20 73 74 72 69 6e 67 20 72 65 70 72 65 73 65  d string represe
73d0: 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  ntation */.     
73e0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 70   Tcl_GetString(p
73f0: 43 6d 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Cmd);.    }.    
7400: 72 63 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a  rc = Tcl_EvalObj
7410: 45 78 28 70 2d 3e 69 6e 74 65 72 70 2c 20 70 43  Ex(p->interp, pC
7420: 6d 64 2c 20 54 43 4c 5f 45 56 41 4c 5f 44 49 52  md, TCL_EVAL_DIR
7430: 45 43 54 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65  ECT);.    Tcl_De
7440: 63 72 52 65 66 43 6f 75 6e 74 28 70 43 6d 64 29  crRefCount(pCmd)
7450: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 20  ;.  }..  if( rc 
7460: 26 26 20 72 63 21 3d 54 43 4c 5f 52 45 54 55 52  && rc!=TCL_RETUR
7470: 4e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  N ){.    sqlite3
7480: 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f  _result_error(co
7490: 6e 74 65 78 74 2c 20 54 63 6c 5f 47 65 74 53 74  ntext, Tcl_GetSt
74a0: 72 69 6e 67 52 65 73 75 6c 74 28 70 2d 3e 69 6e  ringResult(p->in
74b0: 74 65 72 70 29 2c 20 2d 31 29 3b 0a 20 20 7d 65  terp), -1);.  }e
74c0: 6c 73 65 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  lse{.    Tcl_Obj
74d0: 20 2a 70 56 61 72 20 3d 20 54 63 6c 5f 47 65 74   *pVar = Tcl_Get
74e0: 4f 62 6a 52 65 73 75 6c 74 28 70 2d 3e 69 6e 74  ObjResult(p->int
74f0: 65 72 70 29 3b 0a 20 20 20 20 69 6e 74 20 6e 3b  erp);.    int n;
7500: 0a 20 20 20 20 75 38 20 2a 64 61 74 61 3b 0a 20  .    u8 *data;. 
7510: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
7520: 54 79 70 65 20 3d 20 28 70 56 61 72 2d 3e 74 79  Type = (pVar->ty
7530: 70 65 50 74 72 20 3f 20 70 56 61 72 2d 3e 74 79  pePtr ? pVar->ty
7540: 70 65 50 74 72 2d 3e 6e 61 6d 65 20 3a 20 22 22  pePtr->name : ""
7550: 29 3b 0a 20 20 20 20 63 68 61 72 20 63 20 3d 20  );.    char c = 
7560: 7a 54 79 70 65 5b 30 5d 3b 0a 20 20 20 20 69 66  zType[0];.    if
7570: 28 20 63 3d 3d 27 62 27 20 26 26 20 73 74 72 63  ( c=='b' && strc
7580: 6d 70 28 7a 54 79 70 65 2c 22 62 79 74 65 61 72  mp(zType,"bytear
7590: 72 61 79 22 29 3d 3d 30 20 26 26 20 70 56 61 72  ray")==0 && pVar
75a0: 2d 3e 62 79 74 65 73 3d 3d 30 20 29 7b 0a 20 20  ->bytes==0 ){.  
75b0: 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 72 65 74 75      /* Only retu
75c0: 72 6e 20 61 20 42 4c 4f 42 20 74 79 70 65 20 69  rn a BLOB type i
75d0: 66 20 74 68 65 20 54 63 6c 20 76 61 72 69 61 62  f the Tcl variab
75e0: 6c 65 20 69 73 20 61 20 62 79 74 65 61 72 72 61  le is a bytearra
75f0: 79 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 68  y and.      ** h
7600: 61 73 20 6e 6f 20 73 74 72 69 6e 67 20 72 65 70  as no string rep
7610: 72 65 73 65 6e 74 61 74 69 6f 6e 2e 20 2a 2f 0a  resentation. */.
7620: 20 20 20 20 20 20 64 61 74 61 20 3d 20 54 63 6c        data = Tcl
7630: 5f 47 65 74 42 79 74 65 41 72 72 61 79 46 72 6f  _GetByteArrayFro
7640: 6d 4f 62 6a 28 70 56 61 72 2c 20 26 6e 29 3b 0a  mObj(pVar, &n);.
7650: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
7660: 73 75 6c 74 5f 62 6c 6f 62 28 63 6f 6e 74 65 78  sult_blob(contex
7670: 74 2c 20 64 61 74 61 2c 20 6e 2c 20 53 51 4c 49  t, data, n, SQLI
7680: 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
7690: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d     }else if( c==
76a0: 27 62 27 20 26 26 20 73 74 72 63 6d 70 28 7a 54  'b' && strcmp(zT
76b0: 79 70 65 2c 22 62 6f 6f 6c 65 61 6e 22 29 3d 3d  ype,"boolean")==
76c0: 30 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 47  0 ){.      Tcl_G
76d0: 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 30 2c 20  etIntFromObj(0, 
76e0: 70 56 61 72 2c 20 26 6e 29 3b 0a 20 20 20 20 20  pVar, &n);.     
76f0: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
7700: 69 6e 74 28 63 6f 6e 74 65 78 74 2c 20 6e 29 3b  int(context, n);
7710: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63  .    }else if( c
7720: 3d 3d 27 64 27 20 26 26 20 73 74 72 63 6d 70 28  =='d' && strcmp(
7730: 7a 54 79 70 65 2c 22 64 6f 75 62 6c 65 22 29 3d  zType,"double")=
7740: 3d 30 20 29 7b 0a 20 20 20 20 20 20 64 6f 75 62  =0 ){.      doub
7750: 6c 65 20 72 3b 0a 20 20 20 20 20 20 54 63 6c 5f  le r;.      Tcl_
7760: 47 65 74 44 6f 75 62 6c 65 46 72 6f 6d 4f 62 6a  GetDoubleFromObj
7770: 28 30 2c 20 70 56 61 72 2c 20 26 72 29 3b 0a 20  (0, pVar, &r);. 
7780: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
7790: 75 6c 74 5f 64 6f 75 62 6c 65 28 63 6f 6e 74 65  ult_double(conte
77a0: 78 74 2c 20 72 29 3b 0a 20 20 20 20 7d 65 6c 73  xt, r);.    }els
77b0: 65 20 69 66 28 20 28 63 3d 3d 27 77 27 20 26 26  e if( (c=='w' &&
77c0: 20 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22 77   strcmp(zType,"w
77d0: 69 64 65 49 6e 74 22 29 3d 3d 30 29 20 7c 7c 0a  ideInt")==0) ||.
77e0: 20 20 20 20 20 20 20 20 20 20 28 63 3d 3d 27 69            (c=='i
77f0: 27 20 26 26 20 73 74 72 63 6d 70 28 7a 54 79 70  ' && strcmp(zTyp
7800: 65 2c 22 69 6e 74 22 29 3d 3d 30 29 20 29 7b 0a  e,"int")==0) ){.
7810: 20 20 20 20 20 20 54 63 6c 5f 57 69 64 65 49 6e        Tcl_WideIn
7820: 74 20 76 3b 0a 20 20 20 20 20 20 54 63 6c 5f 47  t v;.      Tcl_G
7830: 65 74 57 69 64 65 49 6e 74 46 72 6f 6d 4f 62 6a  etWideIntFromObj
7840: 28 30 2c 20 70 56 61 72 2c 20 26 76 29 3b 0a 20  (0, pVar, &v);. 
7850: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
7860: 75 6c 74 5f 69 6e 74 36 34 28 63 6f 6e 74 65 78  ult_int64(contex
7870: 74 2c 20 76 29 3b 0a 20 20 20 20 7d 65 6c 73 65  t, v);.    }else
7880: 7b 0a 20 20 20 20 20 20 64 61 74 61 20 3d 20 28  {.      data = (
7890: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
78a0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
78b0: 6d 4f 62 6a 28 70 56 61 72 2c 20 26 6e 29 3b 0a  mObj(pVar, &n);.
78c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
78d0: 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78  sult_text(contex
78e0: 74 2c 20 28 63 68 61 72 20 2a 29 64 61 74 61 2c  t, (char *)data,
78f0: 20 6e 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53   n, SQLITE_TRANS
7900: 49 45 4e 54 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  IENT);.    }.  }
7910: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
7920: 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a  TE_OMIT_AUTHORIZ
7930: 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ATION./*.** This
7940: 20 69 73 20 74 68 65 20 61 75 74 68 65 6e 74 69   is the authenti
7950: 63 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 2e  cation function.
7960: 20 20 49 74 20 61 70 70 65 6e 64 73 20 74 68 65    It appends the
7970: 20 61 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 0a   authentication.
7980: 2a 2a 20 74 79 70 65 20 63 6f 64 65 20 61 6e 64  ** type code and
7990: 20 74 68 65 20 74 77 6f 20 61 72 67 75 6d 65 6e   the two argumen
79a0: 74 73 20 74 6f 20 7a 43 6d 64 5b 5d 20 74 68 65  ts to zCmd[] the
79b0: 6e 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 72 65  n invokes the re
79c0: 73 75 6c 74 0a 2a 2a 20 6f 6e 20 74 68 65 20 69  sult.** on the i
79d0: 6e 74 65 72 70 72 65 74 65 72 2e 20 20 54 68 65  nterpreter.  The
79e0: 20 72 65 70 6c 79 20 69 73 20 65 78 61 6d 69 6e   reply is examin
79f0: 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ed to determine 
7a00: 69 66 20 74 68 65 0a 2a 2a 20 61 75 74 68 65 6e  if the.** authen
7a10: 74 69 63 61 74 69 6f 6e 20 66 61 69 6c 73 20 6f  tication fails o
7a20: 72 20 73 75 63 63 65 65 64 73 2e 0a 2a 2f 0a 73  r succeeds..*/.s
7a30: 74 61 74 69 63 20 69 6e 74 20 61 75 74 68 5f 63  tatic int auth_c
7a40: 61 6c 6c 62 61 63 6b 28 0a 20 20 76 6f 69 64 20  allback(.  void 
7a50: 2a 70 41 72 67 2c 0a 20 20 69 6e 74 20 63 6f 64  *pArg,.  int cod
7a60: 65 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  e,.  const char 
7a70: 2a 7a 41 72 67 31 2c 0a 20 20 63 6f 6e 73 74 20  *zArg1,.  const 
7a80: 63 68 61 72 20 2a 7a 41 72 67 32 2c 0a 20 20 63  char *zArg2,.  c
7a90: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67 33  onst char *zArg3
7aa0: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
7ab0: 7a 41 72 67 34 0a 23 69 66 64 65 66 20 53 51 4c  zArg4.#ifdef SQL
7ac0: 49 54 45 5f 55 53 45 52 5f 41 55 54 48 45 4e 54  ITE_USER_AUTHENT
7ad0: 49 43 41 54 49 4f 4e 0a 20 20 2c 63 6f 6e 73 74  ICATION.  ,const
7ae0: 20 63 68 61 72 20 2a 7a 41 72 67 35 0a 23 65 6e   char *zArg5.#en
7af0: 64 69 66 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63  dif.){.  const c
7b00: 68 61 72 20 2a 7a 43 6f 64 65 3b 0a 20 20 54 63  har *zCode;.  Tc
7b10: 6c 5f 44 53 74 72 69 6e 67 20 73 74 72 3b 0a 20  l_DString str;. 
7b20: 20 69 6e 74 20 72 63 3b 0a 20 20 63 6f 6e 73 74   int rc;.  const
7b30: 20 63 68 61 72 20 2a 7a 52 65 70 6c 79 3b 0a 20   char *zReply;. 
7b40: 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d   SqliteDb *pDb =
7b50: 20 28 53 71 6c 69 74 65 44 62 2a 29 70 41 72 67   (SqliteDb*)pArg
7b60: 3b 0a 20 20 69 66 28 20 70 44 62 2d 3e 64 69 73  ;.  if( pDb->dis
7b70: 61 62 6c 65 41 75 74 68 20 29 20 72 65 74 75 72  ableAuth ) retur
7b80: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  n SQLITE_OK;..  
7b90: 73 77 69 74 63 68 28 20 63 6f 64 65 20 29 7b 0a  switch( code ){.
7ba0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
7bb0: 43 4f 50 59 20 20 20 20 20 20 20 20 20 20 20 20  COPY            
7bc0: 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54    : zCode="SQLIT
7bd0: 45 5f 43 4f 50 59 22 3b 20 62 72 65 61 6b 3b 0a  E_COPY"; break;.
7be0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
7bf0: 43 52 45 41 54 45 5f 49 4e 44 45 58 20 20 20 20  CREATE_INDEX    
7c00: 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54    : zCode="SQLIT
7c10: 45 5f 43 52 45 41 54 45 5f 49 4e 44 45 58 22 3b  E_CREATE_INDEX";
7c20: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
7c30: 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54   SQLITE_CREATE_T
7c40: 41 42 4c 45 20 20 20 20 20 20 3a 20 7a 43 6f 64  ABLE      : zCod
7c50: 65 3d 22 53 51 4c 49 54 45 5f 43 52 45 41 54 45  e="SQLITE_CREATE
7c60: 5f 54 41 42 4c 45 22 3b 20 62 72 65 61 6b 3b 0a  _TABLE"; break;.
7c70: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
7c80: 43 52 45 41 54 45 5f 54 45 4d 50 5f 49 4e 44 45  CREATE_TEMP_INDE
7c90: 58 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54  X : zCode="SQLIT
7ca0: 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 49 4e  E_CREATE_TEMP_IN
7cb0: 44 45 58 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  DEX"; break;.   
7cc0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 52 45   case SQLITE_CRE
7cd0: 41 54 45 5f 54 45 4d 50 5f 54 41 42 4c 45 20 3a  ATE_TEMP_TABLE :
7ce0: 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43   zCode="SQLITE_C
7cf0: 52 45 41 54 45 5f 54 45 4d 50 5f 54 41 42 4c 45  REATE_TEMP_TABLE
7d00: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
7d10: 73 65 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45  se SQLITE_CREATE
7d20: 5f 54 45 4d 50 5f 54 52 49 47 47 45 52 3a 20 7a  _TEMP_TRIGGER: z
7d30: 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43 52 45  Code="SQLITE_CRE
7d40: 41 54 45 5f 54 45 4d 50 5f 54 52 49 47 47 45 52  ATE_TEMP_TRIGGER
7d50: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
7d60: 73 65 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45  se SQLITE_CREATE
7d70: 5f 54 45 4d 50 5f 56 49 45 57 20 20 3a 20 7a 43  _TEMP_VIEW  : zC
7d80: 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43 52 45 41  ode="SQLITE_CREA
7d90: 54 45 5f 54 45 4d 50 5f 56 49 45 57 22 3b 20 62  TE_TEMP_VIEW"; b
7da0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
7db0: 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 52 49  QLITE_CREATE_TRI
7dc0: 47 47 45 52 20 20 20 20 3a 20 7a 43 6f 64 65 3d  GGER    : zCode=
7dd0: 22 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54  "SQLITE_CREATE_T
7de0: 52 49 47 47 45 52 22 3b 20 62 72 65 61 6b 3b 0a  RIGGER"; break;.
7df0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
7e00: 43 52 45 41 54 45 5f 56 49 45 57 20 20 20 20 20  CREATE_VIEW     
7e10: 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54    : zCode="SQLIT
7e20: 45 5f 43 52 45 41 54 45 5f 56 49 45 57 22 3b 20  E_CREATE_VIEW"; 
7e30: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
7e40: 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 20 20 20  SQLITE_DELETE   
7e50: 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65           : zCode
7e60: 3d 22 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 22  ="SQLITE_DELETE"
7e70: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
7e80: 65 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 49 4e  e SQLITE_DROP_IN
7e90: 44 45 58 20 20 20 20 20 20 20 20 3a 20 7a 43 6f  DEX        : zCo
7ea0: 64 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f  de="SQLITE_DROP_
7eb0: 49 4e 44 45 58 22 3b 20 62 72 65 61 6b 3b 0a 20  INDEX"; break;. 
7ec0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44     case SQLITE_D
7ed0: 52 4f 50 5f 54 41 42 4c 45 20 20 20 20 20 20 20  ROP_TABLE       
7ee0: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
7ef0: 5f 44 52 4f 50 5f 54 41 42 4c 45 22 3b 20 62 72  _DROP_TABLE"; br
7f00: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
7f10: 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 49  LITE_DROP_TEMP_I
7f20: 4e 44 45 58 20 20 20 3a 20 7a 43 6f 64 65 3d 22  NDEX   : zCode="
7f30: 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50  SQLITE_DROP_TEMP
7f40: 5f 49 4e 44 45 58 22 3b 20 62 72 65 61 6b 3b 0a  _INDEX"; break;.
7f50: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
7f60: 44 52 4f 50 5f 54 45 4d 50 5f 54 41 42 4c 45 20  DROP_TEMP_TABLE 
7f70: 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54    : zCode="SQLIT
7f80: 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 54 41 42 4c  E_DROP_TEMP_TABL
7f90: 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  E"; break;.    c
7fa0: 61 73 65 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f  ase SQLITE_DROP_
7fb0: 54 45 4d 50 5f 54 52 49 47 47 45 52 20 3a 20 7a  TEMP_TRIGGER : z
7fc0: 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f  Code="SQLITE_DRO
7fd0: 50 5f 54 45 4d 50 5f 54 52 49 47 47 45 52 22 3b  P_TEMP_TRIGGER";
7fe0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
7ff0: 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d   SQLITE_DROP_TEM
8000: 50 5f 56 49 45 57 20 20 20 20 3a 20 7a 43 6f 64  P_VIEW    : zCod
8010: 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54  e="SQLITE_DROP_T
8020: 45 4d 50 5f 56 49 45 57 22 3b 20 62 72 65 61 6b  EMP_VIEW"; break
8030: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
8040: 45 5f 44 52 4f 50 5f 54 52 49 47 47 45 52 20 20  E_DROP_TRIGGER  
8050: 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c      : zCode="SQL
8060: 49 54 45 5f 44 52 4f 50 5f 54 52 49 47 47 45 52  ITE_DROP_TRIGGER
8070: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
8080: 73 65 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56  se SQLITE_DROP_V
8090: 49 45 57 20 20 20 20 20 20 20 20 20 3a 20 7a 43  IEW         : zC
80a0: 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50  ode="SQLITE_DROP
80b0: 5f 56 49 45 57 22 3b 20 62 72 65 61 6b 3b 0a 20  _VIEW"; break;. 
80c0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
80d0: 4e 53 45 52 54 20 20 20 20 20 20 20 20 20 20 20  NSERT           
80e0: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
80f0: 5f 49 4e 53 45 52 54 22 3b 20 62 72 65 61 6b 3b  _INSERT"; break;
8100: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
8110: 5f 50 52 41 47 4d 41 20 20 20 20 20 20 20 20 20  _PRAGMA         
8120: 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49     : zCode="SQLI
8130: 54 45 5f 50 52 41 47 4d 41 22 3b 20 62 72 65 61  TE_PRAGMA"; brea
8140: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
8150: 54 45 5f 52 45 41 44 20 20 20 20 20 20 20 20 20  TE_READ         
8160: 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51       : zCode="SQ
8170: 4c 49 54 45 5f 52 45 41 44 22 3b 20 62 72 65 61  LITE_READ"; brea
8180: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
8190: 54 45 5f 53 45 4c 45 43 54 20 20 20 20 20 20 20  TE_SELECT       
81a0: 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51       : zCode="SQ
81b0: 4c 49 54 45 5f 53 45 4c 45 43 54 22 3b 20 62 72  LITE_SELECT"; br
81c0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
81d0: 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e  LITE_TRANSACTION
81e0: 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22         : zCode="
81f0: 53 51 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49  SQLITE_TRANSACTI
8200: 4f 4e 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  ON"; break;.    
8210: 63 61 73 65 20 53 51 4c 49 54 45 5f 55 50 44 41  case SQLITE_UPDA
8220: 54 45 20 20 20 20 20 20 20 20 20 20 20 20 3a 20  TE            : 
8230: 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 55 50  zCode="SQLITE_UP
8240: 44 41 54 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20  DATE"; break;.  
8250: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 54    case SQLITE_AT
8260: 54 41 43 48 20 20 20 20 20 20 20 20 20 20 20 20  TACH            
8270: 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f  : zCode="SQLITE_
8280: 41 54 54 41 43 48 22 3b 20 62 72 65 61 6b 3b 0a  ATTACH"; break;.
8290: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
82a0: 44 45 54 41 43 48 20 20 20 20 20 20 20 20 20 20  DETACH          
82b0: 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54    : zCode="SQLIT
82c0: 45 5f 44 45 54 41 43 48 22 3b 20 62 72 65 61 6b  E_DETACH"; break
82d0: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
82e0: 45 5f 41 4c 54 45 52 5f 54 41 42 4c 45 20 20 20  E_ALTER_TABLE   
82f0: 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c      : zCode="SQL
8300: 49 54 45 5f 41 4c 54 45 52 5f 54 41 42 4c 45 22  ITE_ALTER_TABLE"
8310: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
8320: 65 20 53 51 4c 49 54 45 5f 52 45 49 4e 44 45 58  e SQLITE_REINDEX
8330: 20 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f             : zCo
8340: 64 65 3d 22 53 51 4c 49 54 45 5f 52 45 49 4e 44  de="SQLITE_REIND
8350: 45 58 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  EX"; break;.    
8360: 63 61 73 65 20 53 51 4c 49 54 45 5f 41 4e 41 4c  case SQLITE_ANAL
8370: 59 5a 45 20 20 20 20 20 20 20 20 20 20 20 3a 20  YZE           : 
8380: 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 41 4e  zCode="SQLITE_AN
8390: 41 4c 59 5a 45 22 3b 20 62 72 65 61 6b 3b 0a 20  ALYZE"; break;. 
83a0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
83b0: 52 45 41 54 45 5f 56 54 41 42 4c 45 20 20 20 20  REATE_VTABLE    
83c0: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
83d0: 5f 43 52 45 41 54 45 5f 56 54 41 42 4c 45 22 3b  _CREATE_VTABLE";
83e0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
83f0: 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56 54 41   SQLITE_DROP_VTA
8400: 42 4c 45 20 20 20 20 20 20 20 3a 20 7a 43 6f 64  BLE       : zCod
8410: 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56  e="SQLITE_DROP_V
8420: 54 41 42 4c 45 22 3b 20 62 72 65 61 6b 3b 0a 20  TABLE"; break;. 
8430: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
8440: 55 4e 43 54 49 4f 4e 20 20 20 20 20 20 20 20 20  UNCTION         
8450: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
8460: 5f 46 55 4e 43 54 49 4f 4e 22 3b 20 62 72 65 61  _FUNCTION"; brea
8470: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
8480: 54 45 5f 53 41 56 45 50 4f 49 4e 54 20 20 20 20  TE_SAVEPOINT    
8490: 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51       : zCode="SQ
84a0: 4c 49 54 45 5f 53 41 56 45 50 4f 49 4e 54 22 3b  LITE_SAVEPOINT";
84b0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
84c0: 20 53 51 4c 49 54 45 5f 52 45 43 55 52 53 49 56   SQLITE_RECURSIV
84d0: 45 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64  E         : zCod
84e0: 65 3d 22 53 51 4c 49 54 45 5f 52 45 43 55 52 53  e="SQLITE_RECURS
84f0: 49 56 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  IVE"; break;.   
8500: 20 64 65 66 61 75 6c 74 20 20 20 20 20 20 20 20   default        
8510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3a                 :
8520: 20 7a 43 6f 64 65 3d 22 3f 3f 3f 3f 22 3b 20 62   zCode="????"; b
8530: 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f  reak;.  }.  Tcl_
8540: 44 53 74 72 69 6e 67 49 6e 69 74 28 26 73 74 72  DStringInit(&str
8550: 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  );.  Tcl_DString
8560: 41 70 70 65 6e 64 28 26 73 74 72 2c 20 70 44 62  Append(&str, pDb
8570: 2d 3e 7a 41 75 74 68 2c 20 2d 31 29 3b 0a 20 20  ->zAuth, -1);.  
8580: 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e  Tcl_DStringAppen
8590: 64 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c 20 7a  dElement(&str, z
85a0: 43 6f 64 65 29 3b 0a 20 20 54 63 6c 5f 44 53 74  Code);.  Tcl_DSt
85b0: 72 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e  ringAppendElemen
85c0: 74 28 26 73 74 72 2c 20 7a 41 72 67 31 20 3f 20  t(&str, zArg1 ? 
85d0: 7a 41 72 67 31 20 3a 20 22 22 29 3b 0a 20 20 54  zArg1 : "");.  T
85e0: 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64  cl_DStringAppend
85f0: 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c 20 7a 41  Element(&str, zA
8600: 72 67 32 20 3f 20 7a 41 72 67 32 20 3a 20 22 22  rg2 ? zArg2 : ""
8610: 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  );.  Tcl_DString
8620: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 26 73  AppendElement(&s
8630: 74 72 2c 20 7a 41 72 67 33 20 3f 20 7a 41 72 67  tr, zArg3 ? zArg
8640: 33 20 3a 20 22 22 29 3b 0a 20 20 54 63 6c 5f 44  3 : "");.  Tcl_D
8650: 53 74 72 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d  StringAppendElem
8660: 65 6e 74 28 26 73 74 72 2c 20 7a 41 72 67 34 20  ent(&str, zArg4 
8670: 3f 20 7a 41 72 67 34 20 3a 20 22 22 29 3b 0a 23  ? zArg4 : "");.#
8680: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 55 53 45  ifdef SQLITE_USE
8690: 52 5f 41 55 54 48 45 4e 54 49 43 41 54 49 4f 4e  R_AUTHENTICATION
86a0: 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70  .  Tcl_DStringAp
86b0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 26 73 74 72  pendElement(&str
86c0: 2c 20 7a 41 72 67 35 20 3f 20 7a 41 72 67 35 20  , zArg5 ? zArg5 
86d0: 3a 20 22 22 29 3b 0a 23 65 6e 64 69 66 0a 20 20  : "");.#endif.  
86e0: 72 63 20 3d 20 54 63 6c 5f 47 6c 6f 62 61 6c 45  rc = Tcl_GlobalE
86f0: 76 61 6c 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c  val(pDb->interp,
8700: 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75   Tcl_DStringValu
8710: 65 28 26 73 74 72 29 29 3b 0a 20 20 54 63 6c 5f  e(&str));.  Tcl_
8720: 44 53 74 72 69 6e 67 46 72 65 65 28 26 73 74 72  DStringFree(&str
8730: 29 3b 0a 20 20 7a 52 65 70 6c 79 20 3d 20 72 63  );.  zReply = rc
8740: 3d 3d 54 43 4c 5f 4f 4b 20 3f 20 54 63 6c 5f 47  ==TCL_OK ? Tcl_G
8750: 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28 70  etStringResult(p
8760: 44 62 2d 3e 69 6e 74 65 72 70 29 20 3a 20 22 53  Db->interp) : "S
8770: 51 4c 49 54 45 5f 44 45 4e 59 22 3b 0a 20 20 69  QLITE_DENY";.  i
8780: 66 28 20 73 74 72 63 6d 70 28 7a 52 65 70 6c 79  f( strcmp(zReply
8790: 2c 22 53 51 4c 49 54 45 5f 4f 4b 22 29 3d 3d 30  ,"SQLITE_OK")==0
87a0: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
87b0: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 20  ITE_OK;.  }else 
87c0: 69 66 28 20 73 74 72 63 6d 70 28 7a 52 65 70 6c  if( strcmp(zRepl
87d0: 79 2c 22 53 51 4c 49 54 45 5f 44 45 4e 59 22 29  y,"SQLITE_DENY")
87e0: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
87f0: 53 51 4c 49 54 45 5f 44 45 4e 59 3b 0a 20 20 7d  SQLITE_DENY;.  }
8800: 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
8810: 7a 52 65 70 6c 79 2c 22 53 51 4c 49 54 45 5f 49  zReply,"SQLITE_I
8820: 47 4e 4f 52 45 22 29 3d 3d 30 20 29 7b 0a 20 20  GNORE")==0 ){.  
8830: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 47    rc = SQLITE_IG
8840: 4e 4f 52 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  NORE;.  }else{. 
8850: 20 20 20 72 63 20 3d 20 39 39 39 3b 0a 20 20 7d     rc = 999;.  }
8860: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
8870: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
8880: 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54  _OMIT_AUTHORIZAT
8890: 49 4f 4e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68  ION */../*.** Th
88a0: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 61 64 73  is routine reads
88b0: 20 61 20 6c 69 6e 65 20 6f 66 20 74 65 78 74 20   a line of text 
88c0: 66 72 6f 6d 20 46 49 4c 45 20 69 6e 2c 20 73 74  from FILE in, st
88d0: 6f 72 65 73 0a 2a 2a 20 74 68 65 20 74 65 78 74  ores.** the text
88e0: 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69   in memory obtai
88f0: 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28  ned from malloc(
8900: 29 20 61 6e 64 20 72 65 74 75 72 6e 73 20 61 20  ) and returns a 
8910: 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68  pointer.** to th
8920: 65 20 74 65 78 74 2e 20 20 4e 55 4c 4c 20 69 73  e text.  NULL is
8930: 20 72 65 74 75 72 6e 65 64 20 61 74 20 65 6e 64   returned at end
8940: 20 6f 66 20 66 69 6c 65 2c 20 6f 72 20 69 66 20   of file, or if 
8950: 6d 61 6c 6c 6f 63 28 29 0a 2a 2a 20 66 61 69 6c  malloc().** fail
8960: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 74  s..**.** The int
8970: 65 72 66 61 63 65 20 69 73 20 6c 69 6b 65 20 22  erface is like "
8980: 72 65 61 64 6c 69 6e 65 22 20 62 75 74 20 6e 6f  readline" but no
8990: 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 65 64   command-line ed
89a0: 69 74 69 6e 67 0a 2a 2a 20 69 73 20 64 6f 6e 65  iting.** is done
89b0: 2e 0a 2a 2a 0a 2a 2a 20 63 6f 70 69 65 64 20 66  ..**.** copied f
89c0: 72 6f 6d 20 73 68 65 6c 6c 2e 63 20 66 72 6f 6d  rom shell.c from
89d0: 20 27 2e 69 6d 70 6f 72 74 27 20 63 6f 6d 6d 61   '.import' comma
89e0: 6e 64 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  nd.*/.static cha
89f0: 72 20 2a 6c 6f 63 61 6c 5f 67 65 74 6c 69 6e 65  r *local_getline
8a00: 28 63 68 61 72 20 2a 7a 50 72 6f 6d 70 74 2c 20  (char *zPrompt, 
8a10: 46 49 4c 45 20 2a 69 6e 29 7b 0a 20 20 63 68 61  FILE *in){.  cha
8a20: 72 20 2a 7a 4c 69 6e 65 3b 0a 20 20 69 6e 74 20  r *zLine;.  int 
8a30: 6e 4c 69 6e 65 3b 0a 20 20 69 6e 74 20 6e 3b 0a  nLine;.  int n;.
8a40: 0a 20 20 6e 4c 69 6e 65 20 3d 20 31 30 30 3b 0a  .  nLine = 100;.
8a50: 20 20 7a 4c 69 6e 65 20 3d 20 6d 61 6c 6c 6f 63    zLine = malloc
8a60: 28 20 6e 4c 69 6e 65 20 29 3b 0a 20 20 69 66 28  ( nLine );.  if(
8a70: 20 7a 4c 69 6e 65 3d 3d 30 20 29 20 72 65 74 75   zLine==0 ) retu
8a80: 72 6e 20 30 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20  rn 0;.  n = 0;. 
8a90: 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20   while( 1 ){.   
8aa0: 20 69 66 28 20 6e 2b 31 30 30 3e 6e 4c 69 6e 65   if( n+100>nLine
8ab0: 20 29 7b 0a 20 20 20 20 20 20 6e 4c 69 6e 65 20   ){.      nLine 
8ac0: 3d 20 6e 4c 69 6e 65 2a 32 20 2b 20 31 30 30 3b  = nLine*2 + 100;
8ad0: 0a 20 20 20 20 20 20 7a 4c 69 6e 65 20 3d 20 72  .      zLine = r
8ae0: 65 61 6c 6c 6f 63 28 7a 4c 69 6e 65 2c 20 6e 4c  ealloc(zLine, nL
8af0: 69 6e 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ine);.      if( 
8b00: 7a 4c 69 6e 65 3d 3d 30 20 29 20 72 65 74 75 72  zLine==0 ) retur
8b10: 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  n 0;.    }.    i
8b20: 66 28 20 66 67 65 74 73 28 26 7a 4c 69 6e 65 5b  f( fgets(&zLine[
8b30: 6e 5d 2c 20 6e 4c 69 6e 65 20 2d 20 6e 2c 20 69  n], nLine - n, i
8b40: 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  n)==0 ){.      i
8b50: 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( n==0 ){.     
8b60: 20 20 20 66 72 65 65 28 7a 4c 69 6e 65 29 3b 0a     free(zLine);.
8b70: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30          return 0
8b80: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
8b90: 7a 4c 69 6e 65 5b 6e 5d 20 3d 20 30 3b 0a 20 20  zLine[n] = 0;.  
8ba0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
8bb0: 0a 20 20 20 20 77 68 69 6c 65 28 20 7a 4c 69 6e  .    while( zLin
8bc0: 65 5b 6e 5d 20 29 7b 20 6e 2b 2b 3b 20 7d 0a 20  e[n] ){ n++; }. 
8bd0: 20 20 20 69 66 28 20 6e 3e 30 20 26 26 20 7a 4c     if( n>0 && zL
8be0: 69 6e 65 5b 6e 2d 31 5d 3d 3d 27 5c 6e 27 20 29  ine[n-1]=='\n' )
8bf0: 7b 0a 20 20 20 20 20 20 6e 2d 2d 3b 0a 20 20 20  {.      n--;.   
8c00: 20 20 20 7a 4c 69 6e 65 5b 6e 5d 20 3d 20 30 3b     zLine[n] = 0;
8c10: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
8c20: 20 20 7d 0a 20 20 7d 0a 20 20 7a 4c 69 6e 65 20    }.  }.  zLine 
8c30: 3d 20 72 65 61 6c 6c 6f 63 28 20 7a 4c 69 6e 65  = realloc( zLine
8c40: 2c 20 6e 2b 31 20 29 3b 0a 20 20 72 65 74 75 72  , n+1 );.  retur
8c50: 6e 20 7a 4c 69 6e 65 3b 0a 7d 0a 0a 0a 2f 2a 0a  n zLine;.}.../*.
8c60: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
8c70: 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   is part of the 
8c80: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
8c90: 66 20 74 68 65 20 63 6f 6d 6d 61 6e 64 3a 0a 2a  f the command:.*
8ca0: 2a 0a 2a 2a 20 20 20 24 64 62 20 74 72 61 6e 73  *.**   $db trans
8cb0: 61 63 74 69 6f 6e 20 5b 2d 64 65 66 65 72 72 65  action [-deferre
8cc0: 64 7c 2d 69 6d 6d 65 64 69 61 74 65 7c 2d 65 78  d|-immediate|-ex
8cd0: 63 6c 75 73 69 76 65 5d 20 53 43 52 49 50 54 0a  clusive] SCRIPT.
8ce0: 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 69 6e 76 6f  **.** It is invo
8cf0: 6b 65 64 20 61 66 74 65 72 20 65 76 61 6c 75 61  ked after evalua
8d00: 74 69 6e 67 20 74 68 65 20 73 63 72 69 70 74 20  ting the script 
8d10: 53 43 52 49 50 54 20 74 6f 20 63 6f 6d 6d 69 74  SCRIPT to commit
8d20: 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20   or rollback.** 
8d30: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
8d40: 6f 72 20 73 61 76 65 70 6f 69 6e 74 20 6f 70 65  or savepoint ope
8d50: 6e 65 64 20 62 79 20 74 68 65 20 5b 74 72 61 6e  ned by the [tran
8d60: 73 61 63 74 69 6f 6e 5d 20 63 6f 6d 6d 61 6e 64  saction] command
8d70: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
8d80: 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 44 62  SQLITE_TCLAPI Db
8d90: 54 72 61 6e 73 50 6f 73 74 43 6d 64 28 0a 20 20  TransPostCmd(.  
8da0: 43 6c 69 65 6e 74 44 61 74 61 20 64 61 74 61 5b  ClientData data[
8db0: 5d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ],              
8dc0: 20 20 20 20 20 2f 2a 20 64 61 74 61 5b 30 5d 20       /* data[0] 
8dd0: 69 73 20 74 68 65 20 53 71 6c 69 74 65 33 44 62  is the Sqlite3Db
8de0: 2a 20 66 6f 72 20 24 64 62 20 2a 2f 0a 20 20 54  * for $db */.  T
8df0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
8e00: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
8e10: 20 20 20 20 2f 2a 20 54 63 6c 20 69 6e 74 65 72      /* Tcl inter
8e20: 70 72 65 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  preter */.  int 
8e30: 72 65 73 75 6c 74 20 20 20 20 20 20 20 20 20 20  result          
8e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8e50: 20 2f 2a 20 52 65 73 75 6c 74 20 6f 66 20 65 76   /* Result of ev
8e60: 61 6c 75 61 74 69 6e 67 20 53 43 52 49 50 54 20  aluating SCRIPT 
8e70: 2a 2f 0a 29 7b 0a 20 20 73 74 61 74 69 63 20 63  */.){.  static c
8e80: 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 6e 73 74  onst char *const
8e90: 20 61 7a 45 6e 64 5b 5d 20 3d 20 7b 0a 20 20 20   azEnd[] = {.   
8ea0: 20 22 52 45 4c 45 41 53 45 20 5f 74 63 6c 5f 74   "RELEASE _tcl_t
8eb0: 72 61 6e 73 61 63 74 69 6f 6e 22 2c 20 20 20 20  ransaction",    
8ec0: 20 20 20 20 2f 2a 20 72 63 3d 3d 54 43 4c 5f 45      /* rc==TCL_E
8ed0: 52 52 4f 52 2c 20 6e 54 72 61 6e 73 61 63 74 69  RROR, nTransacti
8ee0: 6f 6e 21 3d 30 20 2a 2f 0a 20 20 20 20 22 43 4f  on!=0 */.    "CO
8ef0: 4d 4d 49 54 22 2c 20 20 20 20 20 20 20 20 20 20  MMIT",          
8f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8f10: 2f 2a 20 72 63 21 3d 54 43 4c 5f 45 52 52 4f 52  /* rc!=TCL_ERROR
8f20: 2c 20 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  , nTransaction==
8f30: 30 20 2a 2f 0a 20 20 20 20 22 52 4f 4c 4c 42 41  0 */.    "ROLLBA
8f40: 43 4b 20 54 4f 20 5f 74 63 6c 5f 74 72 61 6e 73  CK TO _tcl_trans
8f50: 61 63 74 69 6f 6e 20 3b 20 52 45 4c 45 41 53 45  action ; RELEASE
8f60: 20 5f 74 63 6c 5f 74 72 61 6e 73 61 63 74 69 6f   _tcl_transactio
8f70: 6e 22 2c 0a 20 20 20 20 22 52 4f 4c 4c 42 41 43  n",.    "ROLLBAC
8f80: 4b 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K"              
8f90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 72 63             /* rc
8fa0: 3d 3d 54 43 4c 5f 45 52 52 4f 52 2c 20 6e 54 72  ==TCL_ERROR, nTr
8fb0: 61 6e 73 61 63 74 69 6f 6e 3d 3d 30 20 2a 2f 0a  ansaction==0 */.
8fc0: 20 20 7d 3b 0a 20 20 53 71 6c 69 74 65 44 62 20    };.  SqliteDb 
8fd0: 2a 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62  *pDb = (SqliteDb
8fe0: 2a 29 64 61 74 61 5b 30 5d 3b 0a 20 20 69 6e 74  *)data[0];.  int
8ff0: 20 72 63 20 3d 20 72 65 73 75 6c 74 3b 0a 20 20   rc = result;.  
9000: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 6e 64  const char *zEnd
9010: 3b 0a 0a 20 20 70 44 62 2d 3e 6e 54 72 61 6e 73  ;..  pDb->nTrans
9020: 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20 7a 45 6e 64  action--;.  zEnd
9030: 20 3d 20 61 7a 45 6e 64 5b 28 72 63 3d 3d 54 43   = azEnd[(rc==TC
9040: 4c 5f 45 52 52 4f 52 29 2a 32 20 2b 20 28 70 44  L_ERROR)*2 + (pD
9050: 62 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  b->nTransaction=
9060: 3d 30 29 5d 3b 0a 0a 20 20 70 44 62 2d 3e 64 69  =0)];..  pDb->di
9070: 73 61 62 6c 65 41 75 74 68 2b 2b 3b 0a 20 20 69  sableAuth++;.  i
9080: 66 28 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28  f( sqlite3_exec(
9090: 70 44 62 2d 3e 64 62 2c 20 7a 45 6e 64 2c 20 30  pDb->db, zEnd, 0
90a0: 2c 20 30 2c 20 30 29 20 29 7b 0a 20 20 20 20 20  , 0, 0) ){.     
90b0: 20 2f 2a 20 54 68 69 73 20 69 73 20 61 20 74 72   /* This is a tr
90c0: 69 63 6b 79 20 73 63 65 6e 61 72 69 6f 20 74 6f  icky scenario to
90d0: 20 68 61 6e 64 6c 65 2e 20 54 68 65 20 6d 6f 73   handle. The mos
90e0: 74 20 6c 69 6b 65 6c 79 20 63 61 75 73 65 20 6f  t likely cause o
90f0: 66 20 61 6e 0a 20 20 20 20 20 20 2a 2a 20 65 72  f an.      ** er
9100: 72 6f 72 20 69 73 20 74 68 61 74 20 74 68 65 20  ror is that the 
9110: 65 78 65 63 28 29 20 61 62 6f 76 65 20 77 61 73  exec() above was
9120: 20 61 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 63   an attempt to c
9130: 6f 6d 6d 69 74 20 74 68 65 0a 20 20 20 20 20 20  ommit the.      
9140: 2a 2a 20 74 6f 70 2d 6c 65 76 65 6c 20 74 72 61  ** top-level tra
9150: 6e 73 61 63 74 69 6f 6e 20 74 68 61 74 20 72 65  nsaction that re
9160: 74 75 72 6e 65 64 20 53 51 4c 49 54 45 5f 42 55  turned SQLITE_BU
9170: 53 59 2e 20 4f 72 2c 20 6c 65 73 73 20 6c 69 6b  SY. Or, less lik
9180: 65 6c 79 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68  ely,.      ** th
9190: 61 74 20 61 6e 20 49 4f 2d 65 72 72 6f 72 20 68  at an IO-error h
91a0: 61 73 20 6f 63 63 75 72 72 65 64 2e 20 49 6e 20  as occurred. In 
91b0: 65 69 74 68 65 72 20 63 61 73 65 2c 20 74 68 72  either case, thr
91c0: 6f 77 20 61 20 54 63 6c 20 65 78 63 65 70 74 69  ow a Tcl excepti
91d0: 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20  on.      ** and 
91e0: 74 72 79 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20  try to rollback 
91f0: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  the transaction.
9200: 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
9210: 2a 2a 20 42 75 74 20 69 74 20 63 6f 75 6c 64 20  ** But it could 
9220: 61 6c 73 6f 20 62 65 20 74 68 61 74 20 74 68 65  also be that the
9230: 20 75 73 65 72 20 65 78 65 63 75 74 65 64 20 6f   user executed o
9240: 6e 65 20 6f 72 20 6d 6f 72 65 20 42 45 47 49 4e  ne or more BEGIN
9250: 2c 0a 20 20 20 20 20 20 2a 2a 20 43 4f 4d 4d 49  ,.      ** COMMI
9260: 54 2c 20 53 41 56 45 50 4f 49 4e 54 2c 20 52 45  T, SAVEPOINT, RE
9270: 4c 45 41 53 45 20 6f 72 20 52 4f 4c 4c 42 41 43  LEASE or ROLLBAC
9280: 4b 20 63 6f 6d 6d 61 6e 64 73 20 74 68 61 74 20  K commands that 
9290: 61 72 65 20 63 6f 6e 66 75 73 69 6e 67 0a 20 20  are confusing.  
92a0: 20 20 20 20 2a 2a 20 74 68 69 73 20 6d 65 74 68      ** this meth
92b0: 6f 64 27 73 20 6c 6f 67 69 63 2e 20 4e 6f 74 20  od's logic. Not 
92c0: 63 6c 65 61 72 20 68 6f 77 20 74 68 69 73 20 77  clear how this w
92d0: 6f 75 6c 64 20 62 65 20 62 65 73 74 20 68 61 6e  ould be best han
92e0: 64 6c 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  dled..      */. 
92f0: 20 20 20 69 66 28 20 72 63 21 3d 54 43 4c 5f 45     if( rc!=TCL_E
9300: 52 52 4f 52 20 29 7b 0a 20 20 20 20 20 20 54 63  RROR ){.      Tc
9310: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
9320: 6e 74 65 72 70 2c 20 73 71 6c 69 74 65 33 5f 65  nterp, sqlite3_e
9330: 72 72 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c 20  rrmsg(pDb->db), 
9340: 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20  (char*)0);.     
9350: 20 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b   rc = TCL_ERROR;
9360: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
9370: 65 33 5f 65 78 65 63 28 70 44 62 2d 3e 64 62 2c  e3_exec(pDb->db,
9380: 20 22 52 4f 4c 4c 42 41 43 4b 22 2c 20 30 2c 20   "ROLLBACK", 0, 
9390: 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 70 44 62  0, 0);.  }.  pDb
93a0: 2d 3e 64 69 73 61 62 6c 65 41 75 74 68 2d 2d 3b  ->disableAuth--;
93b0: 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
93c0: 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 53  ../*.** Unless S
93d0: 51 4c 49 54 45 5f 54 45 53 54 20 69 73 20 64 65  QLITE_TEST is de
93e0: 66 69 6e 65 64 2c 20 74 68 69 73 20 66 75 6e 63  fined, this func
93f0: 74 69 6f 6e 20 69 73 20 61 20 73 69 6d 70 6c 65  tion is a simple
9400: 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64 0a   wrapper around.
9410: 2a 2a 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61  ** sqlite3_prepa
9420: 72 65 5f 76 32 28 29 2e 20 49 66 20 53 51 4c 49  re_v2(). If SQLI
9430: 54 45 5f 54 45 53 54 20 69 73 20 64 65 66 69 6e  TE_TEST is defin
9440: 65 64 2c 20 74 68 65 6e 20 69 74 20 75 73 65 73  ed, then it uses
9450: 20 65 69 74 68 65 72 0a 2a 2a 20 73 71 6c 69 74   either.** sqlit
9460: 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 29 20  e3_prepare_v2() 
9470: 6f 72 20 6c 65 67 61 63 79 20 69 6e 74 65 72 66  or legacy interf
9480: 61 63 65 20 73 71 6c 69 74 65 33 5f 70 72 65 70  ace sqlite3_prep
9490: 61 72 65 28 29 2c 20 64 65 70 65 6e 64 69 6e 67  are(), depending
94a0: 0a 2a 2a 20 6f 6e 20 77 68 65 74 68 65 72 20 6f  .** on whether o
94b0: 72 20 6e 6f 74 20 74 68 65 20 5b 64 62 5f 75 73  r not the [db_us
94c0: 65 5f 6c 65 67 61 63 79 5f 70 72 65 70 61 72 65  e_legacy_prepare
94d0: 5d 20 63 6f 6d 6d 61 6e 64 20 68 61 73 20 62 65  ] command has be
94e0: 65 6e 20 75 73 65 64 20 74 6f 0a 2a 2a 20 63 6f  en used to.** co
94f0: 6e 66 69 67 75 72 65 20 74 68 65 20 63 6f 6e 6e  nfigure the conn
9500: 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  ection..*/.stati
9510: 63 20 69 6e 74 20 64 62 50 72 65 70 61 72 65 28  c int dbPrepare(
9520: 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62  .  SqliteDb *pDb
9530: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
9540: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6f     /* Database o
9550: 62 6a 65 63 74 20 2a 2f 0a 20 20 63 6f 6e 73 74  bject */.  const
9560: 20 63 68 61 72 20 2a 7a 53 71 6c 2c 20 20 20 20   char *zSql,    
9570: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51             /* SQ
9580: 4c 20 74 6f 20 63 6f 6d 70 69 6c 65 20 2a 2f 0a  L to compile */.
9590: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
95a0: 2a 70 70 53 74 6d 74 2c 20 20 20 20 20 20 20 20  *ppStmt,        
95b0: 20 20 2f 2a 20 4f 55 54 3a 20 50 72 65 70 61 72    /* OUT: Prepar
95c0: 65 64 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  ed statement */.
95d0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70    const char **p
95e0: 7a 4f 75 74 20 20 20 20 20 20 20 20 20 20 20 20  zOut            
95f0: 20 20 2f 2a 20 4f 55 54 3a 20 50 6f 69 6e 74 65    /* OUT: Pointe
9600: 72 20 74 6f 20 6e 65 78 74 20 53 51 4c 20 73 74  r to next SQL st
9610: 61 74 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 23 69  atement */.){.#i
9620: 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
9630: 0a 20 20 69 66 28 20 70 44 62 2d 3e 62 4c 65 67  .  if( pDb->bLeg
9640: 61 63 79 50 72 65 70 61 72 65 20 29 7b 0a 20 20  acyPrepare ){.  
9650: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
9660: 5f 70 72 65 70 61 72 65 28 70 44 62 2d 3e 64 62  _prepare(pDb->db
9670: 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 70 70 53 74  , zSql, -1, ppSt
9680: 6d 74 2c 20 70 7a 4f 75 74 29 3b 0a 20 20 7d 0a  mt, pzOut);.  }.
9690: 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
96a0: 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
96b0: 76 32 28 70 44 62 2d 3e 64 62 2c 20 7a 53 71 6c  v2(pDb->db, zSql
96c0: 2c 20 2d 31 2c 20 70 70 53 74 6d 74 2c 20 70 7a  , -1, ppStmt, pz
96d0: 4f 75 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  Out);.}../*.** S
96e0: 65 61 72 63 68 20 74 68 65 20 63 61 63 68 65 20  earch the cache 
96f0: 66 6f 72 20 61 20 70 72 65 70 61 72 65 64 2d 73  for a prepared-s
9700: 74 61 74 65 6d 65 6e 74 20 6f 62 6a 65 63 74 20  tatement object 
9710: 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20  that implements 
9720: 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 53 51 4c  the.** first SQL
9730: 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 74 68   statement in th
9740: 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64  e buffer pointed
9750: 20 74 6f 20 62 79 20 70 61 72 61 6d 65 74 65 72   to by parameter
9760: 20 7a 49 6e 2e 20 49 66 0a 2a 2a 20 6e 6f 20 73   zIn. If.** no s
9770: 75 63 68 20 70 72 65 70 61 72 65 64 2d 73 74 61  uch prepared-sta
9780: 74 65 6d 65 6e 74 20 63 61 6e 20 62 65 20 66 6f  tement can be fo
9790: 75 6e 64 2c 20 61 6c 6c 6f 63 61 74 65 20 61 6e  und, allocate an
97a0: 64 20 70 72 65 70 61 72 65 20 61 20 6e 65 77 0a  d prepare a new.
97b0: 2a 2a 20 6f 6e 65 2e 20 49 6e 20 65 69 74 68 65  ** one. In eithe
97c0: 72 20 63 61 73 65 2c 20 62 69 6e 64 20 74 68 65  r case, bind the
97d0: 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 73 20   current values 
97e0: 6f 66 20 74 68 65 20 72 65 6c 65 76 61 6e 74 20  of the relevant 
97f0: 54 63 6c 0a 2a 2a 20 76 61 72 69 61 62 6c 65 73  Tcl.** variables
9800: 20 74 6f 20 61 6e 79 20 24 76 61 72 2c 20 3a 76   to any $var, :v
9810: 61 72 20 6f 72 20 40 76 61 72 20 76 61 72 69 61  ar or @var varia
9820: 62 6c 65 73 20 69 6e 20 74 68 65 20 73 74 61 74  bles in the stat
9830: 65 6d 65 6e 74 2e 20 42 65 66 6f 72 65 0a 2a 2a  ement. Before.**
9840: 20 72 65 74 75 72 6e 69 6e 67 2c 20 73 65 74 20   returning, set 
9850: 2a 70 70 50 72 65 53 74 6d 74 20 74 6f 20 70 6f  *ppPreStmt to po
9860: 69 6e 74 20 74 6f 20 74 68 65 20 70 72 65 70 61  int to the prepa
9870: 72 65 64 2d 73 74 61 74 65 6d 65 6e 74 20 6f 62  red-statement ob
9880: 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 4f 75 74 70  ject..**.** Outp
9890: 75 74 20 70 61 72 61 6d 65 74 65 72 20 2a 70 7a  ut parameter *pz
98a0: 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 70 6f  Out is set to po
98b0: 69 6e 74 20 74 6f 20 74 68 65 20 6e 65 78 74 20  int to the next 
98c0: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 69 6e  SQL statement in
98d0: 0a 2a 2a 20 62 75 66 66 65 72 20 7a 49 6e 2c 20  .** buffer zIn, 
98e0: 6f 72 20 74 6f 20 74 68 65 20 27 5c 30 27 20 62  or to the '\0' b
98f0: 79 74 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f  yte at the end o
9900: 66 20 7a 49 6e 20 69 66 20 74 68 65 72 65 20 69  f zIn if there i
9910: 73 20 6e 6f 0a 2a 2a 20 6e 65 78 74 20 73 74 61  s no.** next sta
9920: 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  tement..**.** If
9930: 20 73 75 63 63 65 73 73 66 75 6c 2c 20 54 43 4c   successful, TCL
9940: 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
9950: 20 4f 74 68 65 72 77 69 73 65 2c 20 54 43 4c 5f   Otherwise, TCL_
9960: 45 52 52 4f 52 20 69 73 20 72 65 74 75 72 6e 65  ERROR is returne
9970: 64 0a 2a 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f  d.** and an erro
9980: 72 20 6d 65 73 73 61 67 65 20 6c 6f 61 64 65 64  r message loaded
9990: 20 69 6e 74 6f 20 69 6e 74 65 72 70 72 65 74 65   into interprete
99a0: 72 20 70 44 62 2d 3e 69 6e 74 65 72 70 2e 0a 2a  r pDb->interp..*
99b0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 62 50  /.static int dbP
99c0: 72 65 70 61 72 65 41 6e 64 42 69 6e 64 28 0a 20  repareAndBind(. 
99d0: 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 2c 20   SqliteDb *pDb, 
99e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
99f0: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6f 62 6a   /* Database obj
9a00: 65 63 74 20 2a 2f 0a 20 20 63 68 61 72 20 63 6f  ect */.  char co
9a10: 6e 73 74 20 2a 7a 49 6e 2c 20 20 20 20 20 20 20  nst *zIn,       
9a20: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 20           /* SQL 
9a30: 74 6f 20 63 6f 6d 70 69 6c 65 20 2a 2f 0a 20 20  to compile */.  
9a40: 63 68 61 72 20 63 6f 6e 73 74 20 2a 2a 70 7a 4f  char const **pzO
9a50: 75 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ut,             
9a60: 2f 2a 20 4f 55 54 3a 20 50 6f 69 6e 74 65 72 20  /* OUT: Pointer 
9a70: 74 6f 20 6e 65 78 74 20 53 51 4c 20 73 74 61 74  to next SQL stat
9a80: 65 6d 65 6e 74 20 2a 2f 0a 20 20 53 71 6c 50 72  ement */.  SqlPr
9a90: 65 70 61 72 65 64 53 74 6d 74 20 2a 2a 70 70 50  eparedStmt **ppP
9aa0: 72 65 53 74 6d 74 20 20 20 20 20 2f 2a 20 4f 55  reStmt     /* OU
9ab0: 54 3a 20 4f 62 6a 65 63 74 20 75 73 65 64 20 74  T: Object used t
9ac0: 6f 20 63 61 63 68 65 20 73 74 61 74 65 6d 65 6e  o cache statemen
9ad0: 74 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20  t */.){.  const 
9ae0: 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20 7a 49 6e  char *zSql = zIn
9af0: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69  ;         /* Poi
9b00: 6e 74 65 72 20 74 6f 20 66 69 72 73 74 20 53 51  nter to first SQ
9b10: 4c 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 7a  L statement in z
9b20: 49 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  In */.  sqlite3_
9b30: 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b  stmt *pStmt = 0;
9b40: 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 70 61          /* Prepa
9b50: 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 6f 62  red statement ob
9b60: 6a 65 63 74 20 2a 2f 0a 20 20 53 71 6c 50 72 65  ject */.  SqlPre
9b70: 70 61 72 65 64 53 74 6d 74 20 2a 70 50 72 65 53  paredStmt *pPreS
9b80: 74 6d 74 3b 20 20 20 20 20 20 2f 2a 20 50 6f 69  tmt;      /* Poi
9b90: 6e 74 65 72 20 74 6f 20 63 61 63 68 65 64 20 73  nter to cached s
9ba0: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e  tatement */.  in
9bb0: 74 20 6e 53 71 6c 3b 20 20 20 20 20 20 20 20 20  t nSql;         
9bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9bd0: 20 4c 65 6e 67 74 68 20 6f 66 20 7a 53 71 6c 20   Length of zSql 
9be0: 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e  in bytes */.  in
9bf0: 74 20 6e 56 61 72 20 3d 20 30 3b 20 20 20 20 20  t nVar = 0;     
9c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9c10: 20 4e 75 6d 62 65 72 20 6f 66 20 76 61 72 69 61   Number of varia
9c20: 62 6c 65 73 20 69 6e 20 73 74 61 74 65 6d 65 6e  bles in statemen
9c30: 74 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 6d  t */.  int iParm
9c40: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
9c50: 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 66         /* Next f
9c60: 72 65 65 20 65 6e 74 72 79 20 69 6e 20 61 70 50  ree entry in apP
9c70: 61 72 6d 20 2a 2f 0a 20 20 63 68 61 72 20 63 3b  arm */.  char c;
9c80: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 54 63 6c 5f  .  int i;.  Tcl_
9c90: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 20 3d  Interp *interp =
9ca0: 20 70 44 62 2d 3e 69 6e 74 65 72 70 3b 0a 0a 20   pDb->interp;.. 
9cb0: 20 2a 70 70 50 72 65 53 74 6d 74 20 3d 20 30 3b   *ppPreStmt = 0;
9cc0: 0a 0a 20 20 2f 2a 20 54 72 69 6d 20 73 70 61 63  ..  /* Trim spac
9cd0: 65 73 20 66 72 6f 6d 20 74 68 65 20 73 74 61 72  es from the star
9ce0: 74 20 6f 66 20 7a 53 71 6c 20 61 6e 64 20 63 61  t of zSql and ca
9cf0: 6c 63 75 6c 61 74 65 20 74 68 65 20 72 65 6d 61  lculate the rema
9d00: 69 6e 69 6e 67 20 6c 65 6e 67 74 68 2e 20 2a 2f  ining length. */
9d10: 0a 20 20 77 68 69 6c 65 28 20 28 63 20 3d 20 7a  .  while( (c = z
9d20: 53 71 6c 5b 30 5d 29 3d 3d 27 20 27 20 7c 7c 20  Sql[0])==' ' || 
9d30: 63 3d 3d 27 5c 74 27 20 7c 7c 20 63 3d 3d 27 5c  c=='\t' || c=='\
9d40: 72 27 20 7c 7c 20 63 3d 3d 27 5c 6e 27 20 29 7b  r' || c=='\n' ){
9d50: 20 7a 53 71 6c 2b 2b 3b 20 7d 0a 20 20 6e 53 71   zSql++; }.  nSq
9d60: 6c 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 53 71  l = strlen30(zSq
9d70: 6c 29 3b 0a 0a 20 20 66 6f 72 28 70 50 72 65 53  l);..  for(pPreS
9d80: 74 6d 74 20 3d 20 70 44 62 2d 3e 73 74 6d 74 4c  tmt = pDb->stmtL
9d90: 69 73 74 3b 20 70 50 72 65 53 74 6d 74 3b 20 70  ist; pPreStmt; p
9da0: 50 72 65 53 74 6d 74 3d 70 50 72 65 53 74 6d 74  PreStmt=pPreStmt
9db0: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 6e  ->pNext){.    in
9dc0: 74 20 6e 20 3d 20 70 50 72 65 53 74 6d 74 2d 3e  t n = pPreStmt->
9dd0: 6e 53 71 6c 3b 0a 20 20 20 20 69 66 28 20 6e 53  nSql;.    if( nS
9de0: 71 6c 3e 3d 6e 0a 20 20 20 20 20 20 20 20 26 26  ql>=n.        &&
9df0: 20 6d 65 6d 63 6d 70 28 70 50 72 65 53 74 6d 74   memcmp(pPreStmt
9e00: 2d 3e 7a 53 71 6c 2c 20 7a 53 71 6c 2c 20 6e 29  ->zSql, zSql, n)
9e10: 3d 3d 30 0a 20 20 20 20 20 20 20 20 26 26 20 28  ==0.        && (
9e20: 7a 53 71 6c 5b 6e 5d 3d 3d 30 20 7c 7c 20 7a 53  zSql[n]==0 || zS
9e30: 71 6c 5b 6e 2d 31 5d 3d 3d 27 3b 27 29 0a 20 20  ql[n-1]==';').  
9e40: 20 20 29 7b 0a 20 20 20 20 20 20 70 53 74 6d 74    ){.      pStmt
9e50: 20 3d 20 70 50 72 65 53 74 6d 74 2d 3e 70 53 74   = pPreStmt->pSt
9e60: 6d 74 3b 0a 20 20 20 20 20 20 2a 70 7a 4f 75 74  mt;.      *pzOut
9e70: 20 3d 20 26 7a 53 71 6c 5b 70 50 72 65 53 74 6d   = &zSql[pPreStm
9e80: 74 2d 3e 6e 53 71 6c 5d 3b 0a 0a 20 20 20 20 20  t->nSql];..     
9e90: 20 2f 2a 20 57 68 65 6e 20 61 20 70 72 65 70 61   /* When a prepa
9ea0: 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 69 73  red statement is
9eb0: 20 66 6f 75 6e 64 2c 20 75 6e 6c 69 6e 6b 20 69   found, unlink i
9ec0: 74 20 66 72 6f 6d 20 74 68 65 0a 20 20 20 20 20  t from the.     
9ed0: 20 2a 2a 20 63 61 63 68 65 20 6c 69 73 74 2e 20   ** cache list. 
9ee0: 20 49 74 20 77 69 6c 6c 20 6c 61 74 65 72 20 62   It will later b
9ef0: 65 20 61 64 64 65 64 20 62 61 63 6b 20 74 6f 20  e added back to 
9f00: 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20  the beginning.  
9f10: 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 63 61      ** of the ca
9f20: 63 68 65 20 6c 69 73 74 20 69 6e 20 6f 72 64 65  che list in orde
9f30: 72 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 4c  r to implement L
9f40: 52 55 20 72 65 70 6c 61 63 65 6d 65 6e 74 2e 0a  RU replacement..
9f50: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
9f60: 66 28 20 70 50 72 65 53 74 6d 74 2d 3e 70 50 72  f( pPreStmt->pPr
9f70: 65 76 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50  ev ){.        pP
9f80: 72 65 53 74 6d 74 2d 3e 70 50 72 65 76 2d 3e 70  reStmt->pPrev->p
9f90: 4e 65 78 74 20 3d 20 70 50 72 65 53 74 6d 74 2d  Next = pPreStmt-
9fa0: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 65  >pNext;.      }e
9fb0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 44 62  lse{.        pDb
9fc0: 2d 3e 73 74 6d 74 4c 69 73 74 20 3d 20 70 50 72  ->stmtList = pPr
9fd0: 65 53 74 6d 74 2d 3e 70 4e 65 78 74 3b 0a 20 20  eStmt->pNext;.  
9fe0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
9ff0: 70 50 72 65 53 74 6d 74 2d 3e 70 4e 65 78 74 20  pPreStmt->pNext 
a000: 29 7b 0a 20 20 20 20 20 20 20 20 70 50 72 65 53  ){.        pPreS
a010: 74 6d 74 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65  tmt->pNext->pPre
a020: 76 20 3d 20 70 50 72 65 53 74 6d 74 2d 3e 70 50  v = pPreStmt->pP
a030: 72 65 76 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  rev;.      }else
a040: 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 73  {.        pDb->s
a050: 74 6d 74 4c 61 73 74 20 3d 20 70 50 72 65 53 74  tmtLast = pPreSt
a060: 6d 74 2d 3e 70 50 72 65 76 3b 0a 20 20 20 20 20  mt->pPrev;.     
a070: 20 7d 0a 20 20 20 20 20 20 70 44 62 2d 3e 6e 53   }.      pDb->nS
a080: 74 6d 74 2d 2d 3b 0a 20 20 20 20 20 20 6e 56 61  tmt--;.      nVa
a090: 72 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  r = sqlite3_bind
a0a0: 5f 70 61 72 61 6d 65 74 65 72 5f 63 6f 75 6e 74  _parameter_count
a0b0: 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 62  (pStmt);.      b
a0c0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
a0d0: 0a 20 20 2f 2a 20 49 66 20 6e 6f 20 70 72 65 70  .  /* If no prep
a0e0: 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 77  ared statement w
a0f0: 61 73 20 66 6f 75 6e 64 2e 20 43 6f 6d 70 69 6c  as found. Compil
a100: 65 20 74 68 65 20 53 51 4c 20 74 65 78 74 2e 20  e the SQL text. 
a110: 41 6c 73 6f 20 61 6c 6c 6f 63 61 74 65 0a 20 20  Also allocate.  
a120: 2a 2a 20 61 20 6e 65 77 20 53 71 6c 50 72 65 70  ** a new SqlPrep
a130: 61 72 65 64 53 74 6d 74 20 73 74 72 75 63 74 75  aredStmt structu
a140: 72 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  re.  */.  if( pP
a150: 72 65 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20 20  reStmt==0 ){.   
a160: 20 69 6e 74 20 6e 42 79 74 65 3b 0a 0a 20 20 20   int nByte;..   
a170: 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
a180: 64 62 50 72 65 70 61 72 65 28 70 44 62 2c 20 7a  dbPrepare(pDb, z
a190: 53 71 6c 2c 20 26 70 53 74 6d 74 2c 20 70 7a 4f  Sql, &pStmt, pzO
a1a0: 75 74 29 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  ut) ){.      Tcl
a1b0: 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
a1c0: 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72  terp, Tcl_NewStr
a1d0: 69 6e 67 4f 62 6a 28 73 71 6c 69 74 65 33 5f 65  ingObj(sqlite3_e
a1e0: 72 72 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c 20  rrmsg(pDb->db), 
a1f0: 2d 31 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75  -1));.      retu
a200: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
a210: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 53 74 6d    }.    if( pStm
a220: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  t==0 ){.      if
a230: 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c  ( SQLITE_OK!=sql
a240: 69 74 65 33 5f 65 72 72 63 6f 64 65 28 70 44 62  ite3_errcode(pDb
a250: 2d 3e 64 62 29 20 29 7b 0a 20 20 20 20 20 20 20  ->db) ){.       
a260: 20 2f 2a 20 41 20 63 6f 6d 70 69 6c 65 2d 74 69   /* A compile-ti
a270: 6d 65 20 65 72 72 6f 72 20 69 6e 20 74 68 65 20  me error in the 
a280: 73 74 61 74 65 6d 65 6e 74 2e 20 2a 2f 0a 20 20  statement. */.  
a290: 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a        Tcl_SetObj
a2a0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
a2b0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
a2c0: 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70  sqlite3_errmsg(p
a2d0: 44 62 2d 3e 64 62 29 2c 20 2d 31 29 29 3b 0a 20  Db->db), -1));. 
a2e0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43         return TC
a2f0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d  L_ERROR;.      }
a300: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
a310: 20 54 68 65 20 73 74 61 74 65 6d 65 6e 74 20 77   The statement w
a320: 61 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 43 6f 6e  as a no-op.  Con
a330: 74 69 6e 75 65 20 74 6f 20 74 68 65 20 6e 65 78  tinue to the nex
a340: 74 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 20 20  t statement.    
a350: 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 53 51      ** in the SQ
a360: 4c 20 73 74 72 69 6e 67 2e 0a 20 20 20 20 20 20  L string..      
a370: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 74    */.        ret
a380: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20  urn TCL_OK;.    
a390: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61    }.    }..    a
a3a0: 73 73 65 72 74 28 20 70 50 72 65 53 74 6d 74 3d  ssert( pPreStmt=
a3b0: 3d 30 20 29 3b 0a 20 20 20 20 6e 56 61 72 20 3d  =0 );.    nVar =
a3c0: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61   sqlite3_bind_pa
a3d0: 72 61 6d 65 74 65 72 5f 63 6f 75 6e 74 28 70 53  rameter_count(pS
a3e0: 74 6d 74 29 3b 0a 20 20 20 20 6e 42 79 74 65 20  tmt);.    nByte 
a3f0: 3d 20 73 69 7a 65 6f 66 28 53 71 6c 50 72 65 70  = sizeof(SqlPrep
a400: 61 72 65 64 53 74 6d 74 29 20 2b 20 6e 56 61 72  aredStmt) + nVar
a410: 2a 73 69 7a 65 6f 66 28 54 63 6c 5f 4f 62 6a 20  *sizeof(Tcl_Obj 
a420: 2a 29 3b 0a 20 20 20 20 70 50 72 65 53 74 6d 74  *);.    pPreStmt
a430: 20 3d 20 28 53 71 6c 50 72 65 70 61 72 65 64 53   = (SqlPreparedS
a440: 74 6d 74 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28 6e  tmt*)Tcl_Alloc(n
a450: 42 79 74 65 29 3b 0a 20 20 20 20 6d 65 6d 73 65  Byte);.    memse
a460: 74 28 70 50 72 65 53 74 6d 74 2c 20 30 2c 20 6e  t(pPreStmt, 0, n
a470: 42 79 74 65 29 3b 0a 0a 20 20 20 20 70 50 72 65  Byte);..    pPre
a480: 53 74 6d 74 2d 3e 70 53 74 6d 74 20 3d 20 70 53  Stmt->pStmt = pS
a490: 74 6d 74 3b 0a 20 20 20 20 70 50 72 65 53 74 6d  tmt;.    pPreStm
a4a0: 74 2d 3e 6e 53 71 6c 20 3d 20 28 69 6e 74 29 28  t->nSql = (int)(
a4b0: 2a 70 7a 4f 75 74 20 2d 20 7a 53 71 6c 29 3b 0a  *pzOut - zSql);.
a4c0: 20 20 20 20 70 50 72 65 53 74 6d 74 2d 3e 7a 53      pPreStmt->zS
a4d0: 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 73 71 6c  ql = sqlite3_sql
a4e0: 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 70 50 72  (pStmt);.    pPr
a4f0: 65 53 74 6d 74 2d 3e 61 70 50 61 72 6d 20 3d 20  eStmt->apParm = 
a500: 28 54 63 6c 5f 4f 62 6a 20 2a 2a 29 26 70 50 72  (Tcl_Obj **)&pPr
a510: 65 53 74 6d 74 5b 31 5d 3b 0a 23 69 66 64 65 66  eStmt[1];.#ifdef
a520: 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 20   SQLITE_TEST.   
a530: 20 69 66 28 20 70 50 72 65 53 74 6d 74 2d 3e 7a   if( pPreStmt->z
a540: 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Sql==0 ){.      
a550: 63 68 61 72 20 2a 7a 43 6f 70 79 20 3d 20 54 63  char *zCopy = Tc
a560: 6c 5f 41 6c 6c 6f 63 28 70 50 72 65 53 74 6d 74  l_Alloc(pPreStmt
a570: 2d 3e 6e 53 71 6c 20 2b 20 31 29 3b 0a 20 20 20  ->nSql + 1);.   
a580: 20 20 20 6d 65 6d 63 70 79 28 7a 43 6f 70 79 2c     memcpy(zCopy,
a590: 20 7a 53 71 6c 2c 20 70 50 72 65 53 74 6d 74 2d   zSql, pPreStmt-
a5a0: 3e 6e 53 71 6c 29 3b 0a 20 20 20 20 20 20 7a 43  >nSql);.      zC
a5b0: 6f 70 79 5b 70 50 72 65 53 74 6d 74 2d 3e 6e 53  opy[pPreStmt->nS
a5c0: 71 6c 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20  ql] = '\0';.    
a5d0: 20 20 70 50 72 65 53 74 6d 74 2d 3e 7a 53 71 6c    pPreStmt->zSql
a5e0: 20 3d 20 7a 43 6f 70 79 3b 0a 20 20 20 20 7d 0a   = zCopy;.    }.
a5f0: 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 61 73 73  #endif.  }.  ass
a600: 65 72 74 28 20 70 50 72 65 53 74 6d 74 20 29 3b  ert( pPreStmt );
a610: 0a 20 20 61 73 73 65 72 74 28 20 73 74 72 6c 65  .  assert( strle
a620: 6e 33 30 28 70 50 72 65 53 74 6d 74 2d 3e 7a 53  n30(pPreStmt->zS
a630: 71 6c 29 3d 3d 70 50 72 65 53 74 6d 74 2d 3e 6e  ql)==pPreStmt->n
a640: 53 71 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  Sql );.  assert(
a650: 20 30 3d 3d 6d 65 6d 63 6d 70 28 70 50 72 65 53   0==memcmp(pPreS
a660: 74 6d 74 2d 3e 7a 53 71 6c 2c 20 7a 53 71 6c 2c  tmt->zSql, zSql,
a670: 20 70 50 72 65 53 74 6d 74 2d 3e 6e 53 71 6c 29   pPreStmt->nSql)
a680: 20 29 3b 0a 0a 20 20 2f 2a 20 42 69 6e 64 20 76   );..  /* Bind v
a690: 61 6c 75 65 73 20 74 6f 20 70 61 72 61 6d 65 74  alues to paramet
a6a0: 65 72 73 20 74 68 61 74 20 62 65 67 69 6e 20 77  ers that begin w
a6b0: 69 74 68 20 24 20 6f 72 20 3a 20 2a 2f 0a 20 20  ith $ or : */.  
a6c0: 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 6e 56 61 72  for(i=1; i<=nVar
a6d0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73  ; i++){.    cons
a6e0: 74 20 63 68 61 72 20 2a 7a 56 61 72 20 3d 20 73  t char *zVar = s
a6f0: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61  qlite3_bind_para
a700: 6d 65 74 65 72 5f 6e 61 6d 65 28 70 53 74 6d 74  meter_name(pStmt
a710: 2c 20 69 29 3b 0a 20 20 20 20 69 66 28 20 7a 56  , i);.    if( zV
a720: 61 72 21 3d 30 20 26 26 20 28 7a 56 61 72 5b 30  ar!=0 && (zVar[0
a730: 5d 3d 3d 27 24 27 20 7c 7c 20 7a 56 61 72 5b 30  ]=='$' || zVar[0
a740: 5d 3d 3d 27 3a 27 20 7c 7c 20 7a 56 61 72 5b 30  ]==':' || zVar[0
a750: 5d 3d 3d 27 40 27 29 20 29 7b 0a 20 20 20 20 20  ]=='@') ){.     
a760: 20 54 63 6c 5f 4f 62 6a 20 2a 70 56 61 72 20 3d   Tcl_Obj *pVar =
a770: 20 54 63 6c 5f 47 65 74 56 61 72 32 45 78 28 69   Tcl_GetVar2Ex(i
a780: 6e 74 65 72 70 2c 20 26 7a 56 61 72 5b 31 5d 2c  nterp, &zVar[1],
a790: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66   0, 0);.      if
a7a0: 28 20 70 56 61 72 20 29 7b 0a 20 20 20 20 20 20  ( pVar ){.      
a7b0: 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 20    int n;.       
a7c0: 20 75 38 20 2a 64 61 74 61 3b 0a 20 20 20 20 20   u8 *data;.     
a7d0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
a7e0: 54 79 70 65 20 3d 20 28 70 56 61 72 2d 3e 74 79  Type = (pVar->ty
a7f0: 70 65 50 74 72 20 3f 20 70 56 61 72 2d 3e 74 79  pePtr ? pVar->ty
a800: 70 65 50 74 72 2d 3e 6e 61 6d 65 20 3a 20 22 22  pePtr->name : ""
a810: 29 3b 0a 20 20 20 20 20 20 20 20 63 20 3d 20 7a  );.        c = z
a820: 54 79 70 65 5b 30 5d 3b 0a 20 20 20 20 20 20 20  Type[0];.       
a830: 20 69 66 28 20 7a 56 61 72 5b 30 5d 3d 3d 27 40   if( zVar[0]=='@
a840: 27 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20  ' ||.           
a850: 28 63 3d 3d 27 62 27 20 26 26 20 73 74 72 63 6d  (c=='b' && strcm
a860: 70 28 7a 54 79 70 65 2c 22 62 79 74 65 61 72 72  p(zType,"bytearr
a870: 61 79 22 29 3d 3d 30 20 26 26 20 70 56 61 72 2d  ay")==0 && pVar-
a880: 3e 62 79 74 65 73 3d 3d 30 29 20 29 7b 0a 20 20  >bytes==0) ){.  
a890: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 61 64 20          /* Load 
a8a0: 61 20 42 4c 4f 42 20 74 79 70 65 20 69 66 20 74  a BLOB type if t
a8b0: 68 65 20 54 63 6c 20 76 61 72 69 61 62 6c 65 20  he Tcl variable 
a8c0: 69 73 20 61 20 62 79 74 65 61 72 72 61 79 20 61  is a bytearray a
a8d0: 6e 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  nd.          ** 
a8e0: 69 74 20 68 61 73 20 6e 6f 20 73 74 72 69 6e 67  it has no string
a8f0: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
a900: 6f 72 20 74 68 65 20 68 6f 73 74 0a 20 20 20 20  or the host.    
a910: 20 20 20 20 20 20 2a 2a 20 70 61 72 61 6d 65 74        ** paramet
a920: 65 72 20 6e 61 6d 65 20 62 65 67 69 6e 73 20 77  er name begins w
a930: 69 74 68 20 22 40 22 2e 20 2a 2f 0a 20 20 20 20  ith "@". */.    
a940: 20 20 20 20 20 20 64 61 74 61 20 3d 20 54 63 6c        data = Tcl
a950: 5f 47 65 74 42 79 74 65 41 72 72 61 79 46 72 6f  _GetByteArrayFro
a960: 6d 4f 62 6a 28 70 56 61 72 2c 20 26 6e 29 3b 0a  mObj(pVar, &n);.
a970: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
a980: 33 5f 62 69 6e 64 5f 62 6c 6f 62 28 70 53 74 6d  3_bind_blob(pStm
a990: 74 2c 20 69 2c 20 64 61 74 61 2c 20 6e 2c 20 53  t, i, data, n, S
a9a0: 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20  QLITE_STATIC);. 
a9b0: 20 20 20 20 20 20 20 20 20 54 63 6c 5f 49 6e 63           Tcl_Inc
a9c0: 72 52 65 66 43 6f 75 6e 74 28 70 56 61 72 29 3b  rRefCount(pVar);
a9d0: 0a 20 20 20 20 20 20 20 20 20 20 70 50 72 65 53  .          pPreS
a9e0: 74 6d 74 2d 3e 61 70 50 61 72 6d 5b 69 50 61 72  tmt->apParm[iPar
a9f0: 6d 2b 2b 5d 20 3d 20 70 56 61 72 3b 0a 20 20 20  m++] = pVar;.   
aa00: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63       }else if( c
aa10: 3d 3d 27 62 27 20 26 26 20 73 74 72 63 6d 70 28  =='b' && strcmp(
aa20: 7a 54 79 70 65 2c 22 62 6f 6f 6c 65 61 6e 22 29  zType,"boolean")
aa30: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
aa40: 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
aa50: 62 6a 28 69 6e 74 65 72 70 2c 20 70 56 61 72 2c  bj(interp, pVar,
aa60: 20 26 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20   &n);.          
aa70: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
aa80: 28 70 53 74 6d 74 2c 20 69 2c 20 6e 29 3b 0a 20  (pStmt, i, n);. 
aa90: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
aaa0: 20 63 3d 3d 27 64 27 20 26 26 20 73 74 72 63 6d   c=='d' && strcm
aab0: 70 28 7a 54 79 70 65 2c 22 64 6f 75 62 6c 65 22  p(zType,"double"
aac0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
aad0: 20 20 64 6f 75 62 6c 65 20 72 3b 0a 20 20 20 20    double r;.    
aae0: 20 20 20 20 20 20 54 63 6c 5f 47 65 74 44 6f 75        Tcl_GetDou
aaf0: 62 6c 65 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  bleFromObj(inter
ab00: 70 2c 20 70 56 61 72 2c 20 26 72 29 3b 0a 20 20  p, pVar, &r);.  
ab10: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
ab20: 62 69 6e 64 5f 64 6f 75 62 6c 65 28 70 53 74 6d  bind_double(pStm
ab30: 74 2c 20 69 2c 20 72 29 3b 0a 20 20 20 20 20 20  t, i, r);.      
ab40: 20 20 7d 65 6c 73 65 20 69 66 28 20 28 63 3d 3d    }else if( (c==
ab50: 27 77 27 20 26 26 20 73 74 72 63 6d 70 28 7a 54  'w' && strcmp(zT
ab60: 79 70 65 2c 22 77 69 64 65 49 6e 74 22 29 3d 3d  ype,"wideInt")==
ab70: 30 29 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20  0) ||.          
ab80: 20 20 20 20 28 63 3d 3d 27 69 27 20 26 26 20 73      (c=='i' && s
ab90: 74 72 63 6d 70 28 7a 54 79 70 65 2c 22 69 6e 74  trcmp(zType,"int
aba0: 22 29 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20 20  ")==0) ){.      
abb0: 20 20 20 20 54 63 6c 5f 57 69 64 65 49 6e 74 20      Tcl_WideInt 
abc0: 76 3b 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c  v;.          Tcl
abd0: 5f 47 65 74 57 69 64 65 49 6e 74 46 72 6f 6d 4f  _GetWideIntFromO
abe0: 62 6a 28 69 6e 74 65 72 70 2c 20 70 56 61 72 2c  bj(interp, pVar,
abf0: 20 26 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20   &v);.          
ac00: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
ac10: 36 34 28 70 53 74 6d 74 2c 20 69 2c 20 76 29 3b  64(pStmt, i, v);
ac20: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
ac30: 20 20 20 20 20 20 20 20 20 20 64 61 74 61 20 3d            data =
ac40: 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20   (unsigned char 
ac50: 2a 29 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  *)Tcl_GetStringF
ac60: 72 6f 6d 4f 62 6a 28 70 56 61 72 2c 20 26 6e 29  romObj(pVar, &n)
ac70: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
ac80: 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 53  te3_bind_text(pS
ac90: 74 6d 74 2c 20 69 2c 20 28 63 68 61 72 20 2a 29  tmt, i, (char *)
aca0: 64 61 74 61 2c 20 6e 2c 20 53 51 4c 49 54 45 5f  data, n, SQLITE_
acb0: 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 20  STATIC);.       
acc0: 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f     Tcl_IncrRefCo
acd0: 75 6e 74 28 70 56 61 72 29 3b 0a 20 20 20 20 20  unt(pVar);.     
ace0: 20 20 20 20 20 70 50 72 65 53 74 6d 74 2d 3e 61       pPreStmt->a
acf0: 70 50 61 72 6d 5b 69 50 61 72 6d 2b 2b 5d 20 3d  pParm[iParm++] =
ad00: 20 70 56 61 72 3b 0a 20 20 20 20 20 20 20 20 7d   pVar;.        }
ad10: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
ad20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69        sqlite3_bi
ad30: 6e 64 5f 6e 75 6c 6c 28 70 53 74 6d 74 2c 20 69  nd_null(pStmt, i
ad40: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
ad50: 0a 20 20 7d 0a 20 20 70 50 72 65 53 74 6d 74 2d  .  }.  pPreStmt-
ad60: 3e 6e 50 61 72 6d 20 3d 20 69 50 61 72 6d 3b 0a  >nParm = iParm;.
ad70: 20 20 2a 70 70 50 72 65 53 74 6d 74 20 3d 20 70    *ppPreStmt = p
ad80: 50 72 65 53 74 6d 74 3b 0a 0a 20 20 72 65 74 75  PreStmt;..  retu
ad90: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
ada0: 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 73 74  .** Release a st
adb0: 61 74 65 6d 65 6e 74 20 72 65 66 65 72 65 6e 63  atement referenc
adc0: 65 20 6f 62 74 61 69 6e 65 64 20 62 79 20 63 61  e obtained by ca
add0: 6c 6c 69 6e 67 20 64 62 50 72 65 70 61 72 65 41  lling dbPrepareA
ade0: 6e 64 42 69 6e 64 28 29 2e 0a 2a 2a 20 54 68 65  ndBind()..** The
adf0: 72 65 20 73 68 6f 75 6c 64 20 62 65 20 65 78 61  re should be exa
ae00: 63 74 6c 79 20 6f 6e 65 20 63 61 6c 6c 20 74 6f  ctly one call to
ae10: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 66   this function f
ae20: 6f 72 20 65 61 63 68 20 63 61 6c 6c 20 74 6f 0a  or each call to.
ae30: 2a 2a 20 64 62 50 72 65 70 61 72 65 41 6e 64 42  ** dbPrepareAndB
ae40: 69 6e 64 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ind()..**.** If 
ae50: 74 68 65 20 64 69 73 63 61 72 64 20 70 61 72 61  the discard para
ae60: 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72  meter is non-zer
ae70: 6f 2c 20 74 68 65 6e 20 74 68 65 20 73 74 61 74  o, then the stat
ae80: 65 6d 65 6e 74 20 69 73 20 64 65 6c 65 74 65 64  ement is deleted
ae90: 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e  .** immediately.
aea0: 20 4f 74 68 65 72 77 69 73 65 20 69 74 20 69 73   Otherwise it is
aeb0: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 4c 52   added to the LR
aec0: 55 20 6c 69 73 74 20 61 6e 64 20 6d 61 79 20 62  U list and may b
aed0: 65 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 62 79  e returned.** by
aee0: 20 61 20 73 75 62 73 65 71 75 65 6e 74 20 63 61   a subsequent ca
aef0: 6c 6c 20 74 6f 20 64 62 50 72 65 70 61 72 65 41  ll to dbPrepareA
af00: 6e 64 42 69 6e 64 28 29 2e 0a 2a 2f 0a 73 74 61  ndBind()..*/.sta
af10: 74 69 63 20 76 6f 69 64 20 64 62 52 65 6c 65 61  tic void dbRelea
af20: 73 65 53 74 6d 74 28 0a 20 20 53 71 6c 69 74 65  seStmt(.  Sqlite
af30: 44 62 20 2a 70 44 62 2c 20 20 20 20 20 20 20 20  Db *pDb,        
af40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
af50: 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a  abase handle */.
af60: 20 20 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d    SqlPreparedStm
af70: 74 20 2a 70 50 72 65 53 74 6d 74 2c 20 20 20 20  t *pPreStmt,    
af80: 20 20 2f 2a 20 50 72 65 70 61 72 65 64 20 73 74    /* Prepared st
af90: 61 74 65 6d 65 6e 74 20 68 61 6e 64 6c 65 20 74  atement handle t
afa0: 6f 20 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 69  o release */.  i
afb0: 6e 74 20 64 69 73 63 61 72 64 20 20 20 20 20 20  nt discard      
afc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
afd0: 2a 20 54 72 75 65 20 74 6f 20 64 65 6c 65 74 65  * True to delete
afe0: 20 28 6e 6f 74 20 63 61 63 68 65 29 20 74 68 65   (not cache) the
aff0: 20 70 50 72 65 53 74 6d 74 20 2a 2f 0a 29 7b 0a   pPreStmt */.){.
b000: 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 46    int i;..  /* F
b010: 72 65 65 20 74 68 65 20 62 6f 75 6e 64 20 73 74  ree the bound st
b020: 72 69 6e 67 20 61 6e 64 20 62 6c 6f 62 20 70 61  ring and blob pa
b030: 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20 66 6f  rameters */.  fo
b040: 72 28 69 3d 30 3b 20 69 3c 70 50 72 65 53 74 6d  r(i=0; i<pPreStm
b050: 74 2d 3e 6e 50 61 72 6d 3b 20 69 2b 2b 29 7b 0a  t->nParm; i++){.
b060: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
b070: 6f 75 6e 74 28 70 50 72 65 53 74 6d 74 2d 3e 61  ount(pPreStmt->a
b080: 70 50 61 72 6d 5b 69 5d 29 3b 0a 20 20 7d 0a 20  pParm[i]);.  }. 
b090: 20 70 50 72 65 53 74 6d 74 2d 3e 6e 50 61 72 6d   pPreStmt->nParm
b0a0: 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70 44 62   = 0;..  if( pDb
b0b0: 2d 3e 6d 61 78 53 74 6d 74 3c 3d 30 20 7c 7c 20  ->maxStmt<=0 || 
b0c0: 64 69 73 63 61 72 64 20 29 7b 0a 20 20 20 20 2f  discard ){.    /
b0d0: 2a 20 49 66 20 74 68 65 20 63 61 63 68 65 20 69  * If the cache i
b0e0: 73 20 74 75 72 6e 65 64 20 6f 66 66 2c 20 64 65  s turned off, de
b0f0: 61 6c 6c 6f 63 61 74 65 64 20 74 68 65 20 73 74  allocated the st
b100: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 64  atement */.    d
b110: 62 46 72 65 65 53 74 6d 74 28 70 50 72 65 53 74  bFreeStmt(pPreSt
b120: 6d 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  mt);.  }else{.  
b130: 20 20 2f 2a 20 41 64 64 20 74 68 65 20 70 72 65    /* Add the pre
b140: 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20  pared statement 
b150: 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  to the beginning
b160: 20 6f 66 20 74 68 65 20 63 61 63 68 65 20 6c 69   of the cache li
b170: 73 74 2e 20 2a 2f 0a 20 20 20 20 70 50 72 65 53  st. */.    pPreS
b180: 74 6d 74 2d 3e 70 4e 65 78 74 20 3d 20 70 44 62  tmt->pNext = pDb
b190: 2d 3e 73 74 6d 74 4c 69 73 74 3b 0a 20 20 20 20  ->stmtList;.    
b1a0: 70 50 72 65 53 74 6d 74 2d 3e 70 50 72 65 76 20  pPreStmt->pPrev 
b1b0: 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 44 62  = 0;.    if( pDb
b1c0: 2d 3e 73 74 6d 74 4c 69 73 74 20 29 7b 0a 20 20  ->stmtList ){.  
b1d0: 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74     pDb->stmtList
b1e0: 2d 3e 70 50 72 65 76 20 3d 20 70 50 72 65 53 74  ->pPrev = pPreSt
b1f0: 6d 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 44  mt;.    }.    pD
b200: 62 2d 3e 73 74 6d 74 4c 69 73 74 20 3d 20 70 50  b->stmtList = pP
b210: 72 65 53 74 6d 74 3b 0a 20 20 20 20 69 66 28 20  reStmt;.    if( 
b220: 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74 3d 3d 30  pDb->stmtLast==0
b230: 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
b240: 28 20 70 44 62 2d 3e 6e 53 74 6d 74 3d 3d 30 20  ( pDb->nStmt==0 
b250: 29 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e 73 74  );.      pDb->st
b260: 6d 74 4c 61 73 74 20 3d 20 70 50 72 65 53 74 6d  mtLast = pPreStm
b270: 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  t;.    }else{.  
b280: 20 20 20 20 61 73 73 65 72 74 28 20 70 44 62 2d      assert( pDb-
b290: 3e 6e 53 74 6d 74 3e 30 20 29 3b 0a 20 20 20 20  >nStmt>0 );.    
b2a0: 7d 0a 20 20 20 20 70 44 62 2d 3e 6e 53 74 6d 74  }.    pDb->nStmt
b2b0: 2b 2b 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 77  ++;..    /* If w
b2c0: 65 20 68 61 76 65 20 74 6f 6f 20 6d 61 6e 79 20  e have too many 
b2d0: 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 63 61 63  statement in cac
b2e0: 68 65 2c 20 72 65 6d 6f 76 65 20 74 68 65 20 73  he, remove the s
b2f0: 75 72 70 6c 75 73 20 66 72 6f 6d 0a 20 20 20 20  urplus from.    
b300: 2a 2a 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  ** the end of th
b310: 65 20 63 61 63 68 65 20 6c 69 73 74 2e 20 20 2a  e cache list.  *
b320: 2f 0a 20 20 20 20 77 68 69 6c 65 28 20 70 44 62  /.    while( pDb
b330: 2d 3e 6e 53 74 6d 74 3e 70 44 62 2d 3e 6d 61 78  ->nStmt>pDb->max
b340: 53 74 6d 74 20 29 7b 0a 20 20 20 20 20 20 53 71  Stmt ){.      Sq
b350: 6c 50 72 65 70 61 72 65 64 53 74 6d 74 20 2a 70  lPreparedStmt *p
b360: 4c 61 73 74 20 3d 20 70 44 62 2d 3e 73 74 6d 74  Last = pDb->stmt
b370: 4c 61 73 74 3b 0a 20 20 20 20 20 20 70 44 62 2d  Last;.      pDb-
b380: 3e 73 74 6d 74 4c 61 73 74 20 3d 20 70 4c 61 73  >stmtLast = pLas
b390: 74 2d 3e 70 50 72 65 76 3b 0a 20 20 20 20 20 20  t->pPrev;.      
b3a0: 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74 2d 3e 70  pDb->stmtLast->p
b3b0: 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Next = 0;.      
b3c0: 70 44 62 2d 3e 6e 53 74 6d 74 2d 2d 3b 0a 20 20  pDb->nStmt--;.  
b3d0: 20 20 20 20 64 62 46 72 65 65 53 74 6d 74 28 70      dbFreeStmt(p
b3e0: 4c 61 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Last);.    }.  }
b3f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 72 75 63 74  .}../*.** Struct
b400: 75 72 65 20 75 73 65 64 20 77 69 74 68 20 64 62  ure used with db
b410: 45 76 61 6c 58 58 58 28 29 20 66 75 6e 63 74 69  EvalXXX() functi
b420: 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 64 62 45  ons:.**.**   dbE
b430: 76 61 6c 49 6e 69 74 28 29 0a 2a 2a 20 20 20 64  valInit().**   d
b440: 62 45 76 61 6c 53 74 65 70 28 29 0a 2a 2a 20 20  bEvalStep().**  
b450: 20 64 62 45 76 61 6c 46 69 6e 61 6c 69 7a 65 28   dbEvalFinalize(
b460: 29 0a 2a 2a 20 20 20 64 62 45 76 61 6c 52 6f 77  ).**   dbEvalRow
b470: 49 6e 66 6f 28 29 0a 2a 2a 20 20 20 64 62 45 76  Info().**   dbEv
b480: 61 6c 43 6f 6c 75 6d 6e 56 61 6c 75 65 28 29 0a  alColumnValue().
b490: 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
b4a0: 74 20 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 20  t DbEvalContext 
b4b0: 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 3b 0a 73  DbEvalContext;.s
b4c0: 74 72 75 63 74 20 44 62 45 76 61 6c 43 6f 6e 74  truct DbEvalCont
b4d0: 65 78 74 20 7b 0a 20 20 53 71 6c 69 74 65 44 62  ext {.  SqliteDb
b4e0: 20 2a 70 44 62 3b 20 20 20 20 20 20 20 20 20 20   *pDb;          
b4f0: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
b500: 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ase handle */.  
b510: 54 63 6c 5f 4f 62 6a 20 2a 70 53 71 6c 3b 20 20  Tcl_Obj *pSql;  
b520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b530: 2f 2a 20 4f 62 6a 65 63 74 20 68 6f 6c 64 69 6e  /* Object holdin
b540: 67 20 73 74 72 69 6e 67 20 7a 53 71 6c 20 2a 2f  g string zSql */
b550: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
b560: 53 71 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Sql;            
b570: 20 20 20 2f 2a 20 52 65 6d 61 69 6e 69 6e 67 20     /* Remaining 
b580: 53 51 4c 20 74 6f 20 65 78 65 63 75 74 65 20 2a  SQL to execute *
b590: 2f 0a 20 20 53 71 6c 50 72 65 70 61 72 65 64 53  /.  SqlPreparedS
b5a0: 74 6d 74 20 2a 70 50 72 65 53 74 6d 74 3b 20 20  tmt *pPreStmt;  
b5b0: 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 73      /* Current s
b5c0: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e  tatement */.  in
b5d0: 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20 20  t nCol;         
b5e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b5f0: 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   Number of colum
b600: 6e 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 70  ns returned by p
b610: 53 74 6d 74 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62  Stmt */.  Tcl_Ob
b620: 6a 20 2a 70 41 72 72 61 79 3b 20 20 20 20 20 20  j *pArray;      
b630: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
b640: 65 20 6f 66 20 61 72 72 61 79 20 76 61 72 69 61  e of array varia
b650: 62 6c 65 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a  ble */.  Tcl_Obj
b660: 20 2a 2a 61 70 43 6f 6c 4e 61 6d 65 3b 20 20 20   **apColName;   
b670: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61           /* Arra
b680: 79 20 6f 66 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  y of column name
b690: 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 52  s */.};../*.** R
b6a0: 65 6c 65 61 73 65 20 61 6e 79 20 63 61 63 68 65  elease any cache
b6b0: 20 6f 66 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73   of column names
b6c0: 20 63 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 20   currently held 
b6d0: 61 73 20 70 61 72 74 20 6f 66 0a 2a 2a 20 74 68  as part of.** th
b6e0: 65 20 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 20  e DbEvalContext 
b6f0: 73 74 72 75 63 74 75 72 65 20 70 61 73 73 65 64  structure passed
b700: 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
b710: 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  gument..*/.stati
b720: 63 20 76 6f 69 64 20 64 62 52 65 6c 65 61 73 65  c void dbRelease
b730: 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 44 62 45 76  ColumnNames(DbEv
b740: 61 6c 43 6f 6e 74 65 78 74 20 2a 70 29 7b 0a 20  alContext *p){. 
b750: 20 69 66 28 20 70 2d 3e 61 70 43 6f 6c 4e 61 6d   if( p->apColNam
b760: 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  e ){.    int i;.
b770: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
b780: 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  ->nCol; i++){.  
b790: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
b7a0: 6f 75 6e 74 28 70 2d 3e 61 70 43 6f 6c 4e 61 6d  ount(p->apColNam
b7b0: 65 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20  e[i]);.    }.   
b7c0: 20 54 63 6c 5f 46 72 65 65 28 28 63 68 61 72 20   Tcl_Free((char 
b7d0: 2a 29 70 2d 3e 61 70 43 6f 6c 4e 61 6d 65 29 3b  *)p->apColName);
b7e0: 0a 20 20 20 20 70 2d 3e 61 70 43 6f 6c 4e 61 6d  .    p->apColNam
b7f0: 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 2d 3e  e = 0;.  }.  p->
b800: 6e 43 6f 6c 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  nCol = 0;.}../*.
b810: 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 20  ** Initialize a 
b820: 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 20 73 74  DbEvalContext st
b830: 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49  ructure..**.** I
b840: 66 20 70 41 72 72 61 79 20 69 73 20 6e 6f 74 20  f pArray is not 
b850: 4e 55 4c 4c 2c 20 74 68 65 6e 20 69 74 20 63 6f  NULL, then it co
b860: 6e 74 61 69 6e 73 20 74 68 65 20 6e 61 6d 65 20  ntains the name 
b870: 6f 66 20 61 20 54 63 6c 20 61 72 72 61 79 0a 2a  of a Tcl array.*
b880: 2a 20 76 61 72 69 61 62 6c 65 2e 20 54 68 65 20  * variable. The 
b890: 22 2a 22 20 6d 65 6d 62 65 72 20 6f 66 20 74 68  "*" member of th
b8a0: 69 73 20 61 72 72 61 79 20 69 73 20 73 65 74 20  is array is set 
b8b0: 74 6f 20 61 20 6c 69 73 74 20 63 6f 6e 74 61 69  to a list contai
b8c0: 6e 69 6e 67 0a 2a 2a 20 74 68 65 20 6e 61 6d 65  ning.** the name
b8d0: 73 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73  s of the columns
b8e0: 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65   returned by the
b8f0: 20 73 74 61 74 65 6d 65 6e 74 20 61 73 20 70 61   statement as pa
b900: 72 74 20 6f 66 20 65 61 63 68 0a 2a 2a 20 63 61  rt of each.** ca
b910: 6c 6c 20 74 6f 20 64 62 45 76 61 6c 53 74 65 70  ll to dbEvalStep
b920: 28 29 2c 20 69 6e 20 6f 72 64 65 72 20 66 72 6f  (), in order fro
b930: 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74 2e  m left to right.
b940: 20 65 2e 67 2e 20 69 66 20 74 68 65 20 6e 61 6d   e.g. if the nam
b950: 65 73 0a 2a 2a 20 6f 66 20 74 68 65 20 72 65 74  es.** of the ret
b960: 75 72 6e 65 64 20 63 6f 6c 75 6d 6e 73 20 61 72  urned columns ar
b970: 65 20 61 2c 20 62 20 61 6e 64 20 63 2c 20 69 74  e a, b and c, it
b980: 20 64 6f 65 73 20 74 68 65 20 65 71 75 69 76 61   does the equiva
b990: 6c 65 6e 74 20 6f 66 20 74 68 65 0a 2a 2a 20 74  lent of the.** t
b9a0: 63 6c 20 63 6f 6d 6d 61 6e 64 3a 0a 2a 2a 0a 2a  cl command:.**.*
b9b0: 2a 20 20 20 20 20 73 65 74 20 24 7b 70 41 72 72  *     set ${pArr
b9c0: 61 79 7d 28 2a 29 20 7b 61 20 62 20 63 7d 0a 2a  ay}(*) {a b c}.*
b9d0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 62  /.static void db
b9e0: 45 76 61 6c 49 6e 69 74 28 0a 20 20 44 62 45 76  EvalInit(.  DbEv
b9f0: 61 6c 43 6f 6e 74 65 78 74 20 2a 70 2c 20 20 20  alContext *p,   
ba00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
ba10: 6f 69 6e 74 65 72 20 74 6f 20 73 74 72 75 63 74  ointer to struct
ba20: 75 72 65 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a  ure to initializ
ba30: 65 20 2a 2f 0a 20 20 53 71 6c 69 74 65 44 62 20  e */.  SqliteDb 
ba40: 2a 70 44 62 2c 20 20 20 20 20 20 20 20 20 20 20  *pDb,           
ba50: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
ba60: 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 54  se handle */.  T
ba70: 63 6c 5f 4f 62 6a 20 2a 70 53 71 6c 2c 20 20 20  cl_Obj *pSql,   
ba80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ba90: 2a 20 4f 62 6a 65 63 74 20 63 6f 6e 74 61 69 6e  * Object contain
baa0: 69 6e 67 20 53 51 4c 20 73 63 72 69 70 74 20 2a  ing SQL script *
bab0: 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 41 72  /.  Tcl_Obj *pAr
bac0: 72 61 79 20 20 20 20 20 20 20 20 20 20 20 20 20  ray             
bad0: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 54      /* Name of T
bae0: 63 6c 20 61 72 72 61 79 20 74 6f 20 73 65 74 20  cl array to set 
baf0: 28 2a 29 20 65 6c 65 6d 65 6e 74 20 6f 66 20 2a  (*) element of *
bb00: 2f 0a 29 7b 0a 20 20 6d 65 6d 73 65 74 28 70 2c  /.){.  memset(p,
bb10: 20 30 2c 20 73 69 7a 65 6f 66 28 44 62 45 76 61   0, sizeof(DbEva
bb20: 6c 43 6f 6e 74 65 78 74 29 29 3b 0a 20 20 70 2d  lContext));.  p-
bb30: 3e 70 44 62 20 3d 20 70 44 62 3b 0a 20 20 70 2d  >pDb = pDb;.  p-
bb40: 3e 7a 53 71 6c 20 3d 20 54 63 6c 5f 47 65 74 53  >zSql = Tcl_GetS
bb50: 74 72 69 6e 67 28 70 53 71 6c 29 3b 0a 20 20 70  tring(pSql);.  p
bb60: 2d 3e 70 53 71 6c 20 3d 20 70 53 71 6c 3b 0a 20  ->pSql = pSql;. 
bb70: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
bb80: 74 28 70 53 71 6c 29 3b 0a 20 20 69 66 28 20 70  t(pSql);.  if( p
bb90: 41 72 72 61 79 20 29 7b 0a 20 20 20 20 70 2d 3e  Array ){.    p->
bba0: 70 41 72 72 61 79 20 3d 20 70 41 72 72 61 79 3b  pArray = pArray;
bbb0: 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66  .    Tcl_IncrRef
bbc0: 43 6f 75 6e 74 28 70 41 72 72 61 79 29 3b 0a 20  Count(pArray);. 
bbd0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 62 74 61   }.}../*.** Obta
bbe0: 69 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  in information a
bbf0: 62 6f 75 74 20 74 68 65 20 72 6f 77 20 74 68 61  bout the row tha
bc00: 74 20 74 68 65 20 44 62 45 76 61 6c 43 6f 6e 74  t the DbEvalCont
bc10: 65 78 74 20 70 61 73 73 65 64 20 61 73 20 74 68  ext passed as th
bc20: 65 0a 2a 2a 20 66 69 72 73 74 20 61 72 67 75 6d  e.** first argum
bc30: 65 6e 74 20 63 75 72 72 65 6e 74 6c 79 20 70 6f  ent currently po
bc40: 69 6e 74 73 20 74 6f 2e 0a 2a 2f 0a 73 74 61 74  ints to..*/.stat
bc50: 69 63 20 76 6f 69 64 20 64 62 45 76 61 6c 52 6f  ic void dbEvalRo
bc60: 77 49 6e 66 6f 28 0a 20 20 44 62 45 76 61 6c 43  wInfo(.  DbEvalC
bc70: 6f 6e 74 65 78 74 20 2a 70 2c 20 20 20 20 20 20  ontext *p,      
bc80: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 76 61 6c           /* Eval
bc90: 75 61 74 69 6f 6e 20 63 6f 6e 74 65 78 74 20 2a  uation context *
bca0: 2f 0a 20 20 69 6e 74 20 2a 70 6e 43 6f 6c 2c 20  /.  int *pnCol, 
bcb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bcc0: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 75 6d 62      /* OUT: Numb
bcd0: 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 20 6e 61 6d  er of column nam
bce0: 65 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  es */.  Tcl_Obj 
bcf0: 2a 2a 2a 70 61 70 43 6f 6c 4e 61 6d 65 20 20 20  ***papColName   
bd00: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
bd10: 41 72 72 61 79 20 6f 66 20 63 6f 6c 75 6d 6e 20  Array of column 
bd20: 6e 61 6d 65 73 20 2a 2f 0a 29 7b 0a 20 20 2f 2a  names */.){.  /*
bd30: 20 43 6f 6d 70 75 74 65 20 63 6f 6c 75 6d 6e 20   Compute column 
bd40: 6e 61 6d 65 73 20 2a 2f 0a 20 20 69 66 28 20 30  names */.  if( 0
bd50: 3d 3d 70 2d 3e 61 70 43 6f 6c 4e 61 6d 65 20 29  ==p->apColName )
bd60: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74  {.    sqlite3_st
bd70: 6d 74 20 2a 70 53 74 6d 74 20 3d 20 70 2d 3e 70  mt *pStmt = p->p
bd80: 50 72 65 53 74 6d 74 2d 3e 70 53 74 6d 74 3b 0a  PreStmt->pStmt;.
bd90: 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20      int i;      
bda0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bdb0: 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 61    /* Iterator va
bdc0: 72 69 61 62 6c 65 20 2a 2f 0a 20 20 20 20 69 6e  riable */.    in
bdd0: 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20 20  t nCol;         
bde0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
bdf0: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
be00: 20 72 65 74 75 72 6e 65 64 20 62 79 20 70 53 74   returned by pSt
be10: 6d 74 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62  mt */.    Tcl_Ob
be20: 6a 20 2a 2a 61 70 43 6f 6c 4e 61 6d 65 20 3d 20  j **apColName = 
be30: 30 3b 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79  0;      /* Array
be40: 20 6f 66 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73   of column names
be50: 20 2a 2f 0a 0a 20 20 20 20 70 2d 3e 6e 43 6f 6c   */..    p->nCol
be60: 20 3d 20 6e 43 6f 6c 20 3d 20 73 71 6c 69 74 65   = nCol = sqlite
be70: 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70  3_column_count(p
be80: 53 74 6d 74 29 3b 0a 20 20 20 20 69 66 28 20 6e  Stmt);.    if( n
be90: 43 6f 6c 3e 30 20 26 26 20 28 70 61 70 43 6f 6c  Col>0 && (papCol
bea0: 4e 61 6d 65 20 7c 7c 20 70 2d 3e 70 41 72 72 61  Name || p->pArra
beb0: 79 29 20 29 7b 0a 20 20 20 20 20 20 61 70 43 6f  y) ){.      apCo
bec0: 6c 4e 61 6d 65 20 3d 20 28 54 63 6c 5f 4f 62 6a  lName = (Tcl_Obj
bed0: 2a 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28 20 73 69  **)Tcl_Alloc( si
bee0: 7a 65 6f 66 28 54 63 6c 5f 4f 62 6a 2a 29 2a 6e  zeof(Tcl_Obj*)*n
bef0: 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20 66 6f 72  Col );.      for
bf00: 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b  (i=0; i<nCol; i+
bf10: 2b 29 7b 0a 20 20 20 20 20 20 20 20 61 70 43 6f  +){.        apCo
bf20: 6c 4e 61 6d 65 5b 69 5d 20 3d 20 54 63 6c 5f 4e  lName[i] = Tcl_N
bf30: 65 77 53 74 72 69 6e 67 4f 62 6a 28 73 71 6c 69  ewStringObj(sqli
bf40: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 28  te3_column_name(
bf50: 70 53 74 6d 74 2c 69 29 2c 20 2d 31 29 3b 0a 20  pStmt,i), -1);. 
bf60: 20 20 20 20 20 20 20 54 63 6c 5f 49 6e 63 72 52         Tcl_IncrR
bf70: 65 66 43 6f 75 6e 74 28 61 70 43 6f 6c 4e 61 6d  efCount(apColNam
bf80: 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  e[i]);.      }. 
bf90: 20 20 20 20 20 70 2d 3e 61 70 43 6f 6c 4e 61 6d       p->apColNam
bfa0: 65 20 3d 20 61 70 43 6f 6c 4e 61 6d 65 3b 0a 20  e = apColName;. 
bfb0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
bfc0: 72 65 73 75 6c 74 73 20 61 72 65 20 62 65 69 6e  results are bein
bfd0: 67 20 73 74 6f 72 65 64 20 69 6e 20 61 6e 20 61  g stored in an a
bfe0: 72 72 61 79 20 76 61 72 69 61 62 6c 65 2c 20 74  rray variable, t
bff0: 68 65 6e 20 63 72 65 61 74 65 0a 20 20 20 20 2a  hen create.    *
c000: 2a 20 74 68 65 20 61 72 72 61 79 28 2a 29 20 65  * the array(*) e
c010: 6e 74 72 79 20 66 6f 72 20 74 68 61 74 20 61 72  ntry for that ar
c020: 72 61 79 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ray.    */.    i
c030: 66 28 20 70 2d 3e 70 41 72 72 61 79 20 29 7b 0a  f( p->pArray ){.
c040: 20 20 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70        Tcl_Interp
c050: 20 2a 69 6e 74 65 72 70 20 3d 20 70 2d 3e 70 44   *interp = p->pD
c060: 62 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 20  b->interp;.     
c070: 20 54 63 6c 5f 4f 62 6a 20 2a 70 43 6f 6c 4c 69   Tcl_Obj *pColLi
c080: 73 74 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a 28  st = Tcl_NewObj(
c090: 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a  );.      Tcl_Obj
c0a0: 20 2a 70 53 74 61 72 20 3d 20 54 63 6c 5f 4e 65   *pStar = Tcl_Ne
c0b0: 77 53 74 72 69 6e 67 4f 62 6a 28 22 2a 22 2c 20  wStringObj("*", 
c0c0: 2d 31 29 3b 0a 0a 20 20 20 20 20 20 66 6f 72 28  -1);..      for(
c0d0: 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b  i=0; i<nCol; i++
c0e0: 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 4c  ){.        Tcl_L
c0f0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
c100: 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 43 6f 6c  ent(interp, pCol
c110: 4c 69 73 74 2c 20 61 70 43 6f 6c 4e 61 6d 65 5b  List, apColName[
c120: 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  i]);.      }.   
c130: 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f     Tcl_IncrRefCo
c140: 75 6e 74 28 70 53 74 61 72 29 3b 0a 20 20 20 20  unt(pStar);.    
c150: 20 20 54 63 6c 5f 4f 62 6a 53 65 74 56 61 72 32    Tcl_ObjSetVar2
c160: 28 69 6e 74 65 72 70 2c 20 70 2d 3e 70 41 72 72  (interp, p->pArr
c170: 61 79 2c 20 70 53 74 61 72 2c 20 70 43 6f 6c 4c  ay, pStar, pColL
c180: 69 73 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 54  ist, 0);.      T
c190: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
c1a0: 70 53 74 61 72 29 3b 0a 20 20 20 20 7d 0a 20 20  pStar);.    }.  
c1b0: 7d 0a 0a 20 20 69 66 28 20 70 61 70 43 6f 6c 4e  }..  if( papColN
c1c0: 61 6d 65 20 29 7b 0a 20 20 20 20 2a 70 61 70 43  ame ){.    *papC
c1d0: 6f 6c 4e 61 6d 65 20 3d 20 70 2d 3e 61 70 43 6f  olName = p->apCo
c1e0: 6c 4e 61 6d 65 3b 0a 20 20 7d 0a 20 20 69 66 28  lName;.  }.  if(
c1f0: 20 70 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 2a 70   pnCol ){.    *p
c200: 6e 43 6f 6c 20 3d 20 70 2d 3e 6e 43 6f 6c 3b 0a  nCol = p->nCol;.
c210: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74    }.}../*.** Ret
c220: 75 72 6e 20 6f 6e 65 20 6f 66 20 54 43 4c 5f 4f  urn one of TCL_O
c230: 4b 2c 20 54 43 4c 5f 42 52 45 41 4b 20 6f 72 20  K, TCL_BREAK or 
c240: 54 43 4c 5f 45 52 52 4f 52 2e 20 49 66 20 54 43  TCL_ERROR. If TC
c250: 4c 5f 45 52 52 4f 52 20 69 73 0a 2a 2a 20 72 65  L_ERROR is.** re
c260: 74 75 72 6e 65 64 2c 20 74 68 65 6e 20 61 6e 20  turned, then an 
c270: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73  error message is
c280: 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 69   stored in the i
c290: 6e 74 65 72 70 72 65 74 65 72 20 62 65 66 6f 72  nterpreter befor
c2a0: 65 0a 2a 2a 20 72 65 74 75 72 6e 69 6e 67 2e 0a  e.** returning..
c2b0: 2a 2a 0a 2a 2a 20 41 20 72 65 74 75 72 6e 20 76  **.** A return v
c2c0: 61 6c 75 65 20 6f 66 20 54 43 4c 5f 4f 4b 20 6d  alue of TCL_OK m
c2d0: 65 61 6e 73 20 74 68 65 72 65 20 69 73 20 61 20  eans there is a 
c2e0: 72 6f 77 20 6f 66 20 64 61 74 61 20 61 76 61 69  row of data avai
c2f0: 6c 61 62 6c 65 2e 20 54 68 65 0a 2a 2a 20 64 61  lable. The.** da
c300: 74 61 20 6d 61 79 20 62 65 20 61 63 63 65 73 73  ta may be access
c310: 65 64 20 75 73 69 6e 67 20 64 62 45 76 61 6c 52  ed using dbEvalR
c320: 6f 77 49 6e 66 6f 28 29 20 61 6e 64 20 64 62 45  owInfo() and dbE
c330: 76 61 6c 43 6f 6c 75 6d 6e 56 61 6c 75 65 28 29  valColumnValue()
c340: 2e 20 54 68 69 73 0a 2a 2a 20 69 73 20 61 6e 61  . This.** is ana
c350: 6c 6f 67 6f 75 73 20 74 6f 20 61 20 72 65 74 75  logous to a retu
c360: 72 6e 20 6f 66 20 53 51 4c 49 54 45 5f 52 4f 57  rn of SQLITE_ROW
c370: 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 73 74   from sqlite3_st
c380: 65 70 28 29 2e 20 49 66 20 54 43 4c 5f 42 52 45  ep(). If TCL_BRE
c390: 41 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65  AK.** is returne
c3a0: 64 2c 20 74 68 65 6e 20 74 68 65 20 53 51 4c 20  d, then the SQL 
c3b0: 73 63 72 69 70 74 20 68 61 73 20 66 69 6e 69 73  script has finis
c3c0: 68 65 64 20 65 78 65 63 75 74 69 6e 67 20 61 6e  hed executing an
c3d0: 64 20 74 68 65 72 65 20 61 72 65 0a 2a 2a 20 6e  d there are.** n
c3e0: 6f 20 66 75 72 74 68 65 72 20 72 6f 77 73 20 61  o further rows a
c3f0: 76 61 69 6c 61 62 6c 65 2e 20 54 68 69 73 20 69  vailable. This i
c400: 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 53 51 4c  s similar to SQL
c410: 49 54 45 5f 44 4f 4e 45 2e 0a 2a 2f 0a 73 74 61  ITE_DONE..*/.sta
c420: 74 69 63 20 69 6e 74 20 64 62 45 76 61 6c 53 74  tic int dbEvalSt
c430: 65 70 28 44 62 45 76 61 6c 43 6f 6e 74 65 78 74  ep(DbEvalContext
c440: 20 2a 70 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68   *p){.  const ch
c450: 61 72 20 2a 7a 50 72 65 76 53 71 6c 20 3d 20 30  ar *zPrevSql = 0
c460: 3b 20 20 20 20 20 20 20 2f 2a 20 50 72 65 76 69  ;       /* Previ
c470: 6f 75 73 20 76 61 6c 75 65 20 6f 66 20 70 2d 3e  ous value of p->
c480: 7a 53 71 6c 20 2a 2f 0a 0a 20 20 77 68 69 6c 65  zSql */..  while
c490: 28 20 70 2d 3e 7a 53 71 6c 5b 30 5d 20 7c 7c 20  ( p->zSql[0] || 
c4a0: 70 2d 3e 70 50 72 65 53 74 6d 74 20 29 7b 0a 20  p->pPreStmt ){. 
c4b0: 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 69     int rc;.    i
c4c0: 66 28 20 70 2d 3e 70 50 72 65 53 74 6d 74 3d 3d  f( p->pPreStmt==
c4d0: 30 20 29 7b 0a 20 20 20 20 20 20 7a 50 72 65 76  0 ){.      zPrev
c4e0: 53 71 6c 20 3d 20 28 70 2d 3e 7a 53 71 6c 3d 3d  Sql = (p->zSql==
c4f0: 7a 50 72 65 76 53 71 6c 20 3f 20 30 20 3a 20 70  zPrevSql ? 0 : p
c500: 2d 3e 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 72  ->zSql);.      r
c510: 63 20 3d 20 64 62 50 72 65 70 61 72 65 41 6e 64  c = dbPrepareAnd
c520: 42 69 6e 64 28 70 2d 3e 70 44 62 2c 20 70 2d 3e  Bind(p->pDb, p->
c530: 7a 53 71 6c 2c 20 26 70 2d 3e 7a 53 71 6c 2c 20  zSql, &p->zSql, 
c540: 26 70 2d 3e 70 50 72 65 53 74 6d 74 29 3b 0a 20  &p->pPreStmt);. 
c550: 20 20 20 20 20 69 66 28 20 72 63 21 3d 54 43 4c       if( rc!=TCL
c560: 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
c570: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
c580: 20 20 69 6e 74 20 72 63 73 3b 0a 20 20 20 20 20    int rcs;.     
c590: 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d   SqliteDb *pDb =
c5a0: 20 70 2d 3e 70 44 62 3b 0a 20 20 20 20 20 20 53   p->pDb;.      S
c5b0: 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74 20 2a  qlPreparedStmt *
c5c0: 70 50 72 65 53 74 6d 74 20 3d 20 70 2d 3e 70 50  pPreStmt = p->pP
c5d0: 72 65 53 74 6d 74 3b 0a 20 20 20 20 20 20 73 71  reStmt;.      sq
c5e0: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
c5f0: 74 20 3d 20 70 50 72 65 53 74 6d 74 2d 3e 70 53  t = pPreStmt->pS
c600: 74 6d 74 3b 0a 0a 20 20 20 20 20 20 72 63 73 20  tmt;..      rcs 
c610: 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  = sqlite3_step(p
c620: 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 69 66 28  Stmt);.      if(
c630: 20 72 63 73 3d 3d 53 51 4c 49 54 45 5f 52 4f 57   rcs==SQLITE_ROW
c640: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
c650: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 20  rn TCL_OK;.     
c660: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e   }.      if( p->
c670: 70 41 72 72 61 79 20 29 7b 0a 20 20 20 20 20 20  pArray ){.      
c680: 20 20 64 62 45 76 61 6c 52 6f 77 49 6e 66 6f 28    dbEvalRowInfo(
c690: 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  p, 0, 0);.      
c6a0: 7d 0a 20 20 20 20 20 20 72 63 73 20 3d 20 73 71  }.      rcs = sq
c6b0: 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53 74 6d  lite3_reset(pStm
c6c0: 74 29 3b 0a 0a 20 20 20 20 20 20 70 44 62 2d 3e  t);..      pDb->
c6d0: 6e 53 74 65 70 20 3d 20 73 71 6c 69 74 65 33 5f  nStep = sqlite3_
c6e0: 73 74 6d 74 5f 73 74 61 74 75 73 28 70 53 74 6d  stmt_status(pStm
c6f0: 74 2c 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41  t,SQLITE_STMTSTA
c700: 54 55 53 5f 46 55 4c 4c 53 43 41 4e 5f 53 54 45  TUS_FULLSCAN_STE
c710: 50 2c 31 29 3b 0a 20 20 20 20 20 20 70 44 62 2d  P,1);.      pDb-
c720: 3e 6e 53 6f 72 74 20 3d 20 73 71 6c 69 74 65 33  >nSort = sqlite3
c730: 5f 73 74 6d 74 5f 73 74 61 74 75 73 28 70 53 74  _stmt_status(pSt
c740: 6d 74 2c 53 51 4c 49 54 45 5f 53 54 4d 54 53 54  mt,SQLITE_STMTST
c750: 41 54 55 53 5f 53 4f 52 54 2c 31 29 3b 0a 20 20  ATUS_SORT,1);.  
c760: 20 20 20 20 70 44 62 2d 3e 6e 49 6e 64 65 78 20      pDb->nIndex 
c770: 3d 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73  = sqlite3_stmt_s
c780: 74 61 74 75 73 28 70 53 74 6d 74 2c 53 51 4c 49  tatus(pStmt,SQLI
c790: 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 41 55  TE_STMTSTATUS_AU
c7a0: 54 4f 49 4e 44 45 58 2c 31 29 3b 0a 20 20 20 20  TOINDEX,1);.    
c7b0: 20 20 64 62 52 65 6c 65 61 73 65 43 6f 6c 75 6d    dbReleaseColum
c7c0: 6e 4e 61 6d 65 73 28 70 29 3b 0a 20 20 20 20 20  nNames(p);.     
c7d0: 20 70 2d 3e 70 50 72 65 53 74 6d 74 20 3d 20 30   p->pPreStmt = 0
c7e0: 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 72 63 73  ;..      if( rcs
c7f0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
c800: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 20 72         /* If a r
c810: 75 6e 2d 74 69 6d 65 20 65 72 72 6f 72 20 6f 63  un-time error oc
c820: 63 75 72 73 2c 20 72 65 70 6f 72 74 20 74 68 65  curs, report the
c830: 20 65 72 72 6f 72 20 61 6e 64 20 73 74 6f 70 20   error and stop 
c840: 72 65 61 64 69 6e 67 0a 20 20 20 20 20 20 20 20  reading.        
c850: 2a 2a 20 74 68 65 20 53 51 4c 2e 20 20 2a 2f 0a  ** the SQL.  */.
c860: 20 20 20 20 20 20 20 20 64 62 52 65 6c 65 61 73          dbReleas
c870: 65 53 74 6d 74 28 70 44 62 2c 20 70 50 72 65 53  eStmt(pDb, pPreS
c880: 74 6d 74 2c 20 31 29 3b 0a 23 69 66 20 53 51 4c  tmt, 1);.#if SQL
c890: 49 54 45 5f 54 45 53 54 0a 20 20 20 20 20 20 20  ITE_TEST.       
c8a0: 20 69 66 28 20 70 2d 3e 70 44 62 2d 3e 62 4c 65   if( p->pDb->bLe
c8b0: 67 61 63 79 50 72 65 70 61 72 65 20 26 26 20 72  gacyPrepare && r
c8c0: 63 73 3d 3d 53 51 4c 49 54 45 5f 53 43 48 45 4d  cs==SQLITE_SCHEM
c8d0: 41 20 26 26 20 7a 50 72 65 76 53 71 6c 20 29 7b  A && zPrevSql ){
c8e0: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66  .          /* If
c8f0: 20 74 68 65 20 72 75 6e 74 69 6d 65 20 65 72 72   the runtime err
c900: 6f 72 20 77 61 73 20 61 6e 20 53 51 4c 49 54 45  or was an SQLITE
c910: 5f 53 43 48 45 4d 41 2c 20 61 6e 64 20 74 68 65  _SCHEMA, and the
c920: 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 20 20   database.      
c930: 20 20 20 20 2a 2a 20 68 61 6e 64 6c 65 20 69 73      ** handle is
c940: 20 63 6f 6e 66 69 67 75 72 65 64 20 74 6f 20 75   configured to u
c950: 73 65 20 74 68 65 20 6c 65 67 61 63 79 20 73 71  se the legacy sq
c960: 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28 29 0a  lite3_prepare().
c970: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 74            ** int
c980: 65 72 66 61 63 65 2c 20 72 65 74 72 79 20 70 72  erface, retry pr
c990: 65 70 61 72 65 28 29 2f 73 74 65 70 28 29 20 6f  epare()/step() o
c9a0: 6e 20 74 68 65 20 73 61 6d 65 20 53 51 4c 20 73  n the same SQL s
c9b0: 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20  tatement..      
c9c0: 20 20 20 20 2a 2a 20 54 68 69 73 20 6f 6e 6c 79      ** This only
c9d0: 20 68 61 70 70 65 6e 73 20 6f 6e 63 65 2e 20 49   happens once. I
c9e0: 66 20 74 68 65 72 65 20 69 73 20 61 20 73 65 63  f there is a sec
c9f0: 6f 6e 64 20 53 51 4c 49 54 45 5f 53 43 48 45 4d  ond SQLITE_SCHEM
ca00: 41 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 65  A.          ** e
ca10: 72 72 6f 72 2c 20 74 68 65 20 65 72 72 6f 72 20  rror, the error 
ca20: 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64  will be returned
ca30: 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 20   to the caller. 
ca40: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  */.          p->
ca50: 7a 53 71 6c 20 3d 20 7a 50 72 65 76 53 71 6c 3b  zSql = zPrevSql;
ca60: 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69  .          conti
ca70: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23  nue;.        }.#
ca80: 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 54 63  endif.        Tc
ca90: 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 70  l_SetObjResult(p
caa0: 44 62 2d 3e 69 6e 74 65 72 70 2c 0a 20 20 20 20  Db->interp,.    
cab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cac0: 20 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69       Tcl_NewStri
cad0: 6e 67 4f 62 6a 28 73 71 6c 69 74 65 33 5f 65 72  ngObj(sqlite3_er
cae0: 72 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c 20 2d  rmsg(pDb->db), -
caf0: 31 29 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  1));.        ret
cb00: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
cb10: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
cb20: 20 20 20 20 64 62 52 65 6c 65 61 73 65 53 74 6d      dbReleaseStm
cb30: 74 28 70 44 62 2c 20 70 50 72 65 53 74 6d 74 2c  t(pDb, pPreStmt,
cb40: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
cb50: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e   }.  }..  /* Fin
cb60: 69 73 68 65 64 20 2a 2f 0a 20 20 72 65 74 75 72  ished */.  retur
cb70: 6e 20 54 43 4c 5f 42 52 45 41 4b 3b 0a 7d 0a 0a  n TCL_BREAK;.}..
cb80: 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20 72  /*.** Free all r
cb90: 65 73 6f 75 72 63 65 73 20 63 75 72 72 65 6e 74  esources current
cba0: 6c 79 20 68 65 6c 64 20 62 79 20 74 68 65 20 44  ly held by the D
cbb0: 62 45 76 61 6c 43 6f 6e 74 65 78 74 20 73 74 72  bEvalContext str
cbc0: 75 63 74 75 72 65 20 70 61 73 73 65 64 0a 2a 2a  ucture passed.**
cbd0: 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
cbe0: 67 75 6d 65 6e 74 2e 20 54 68 65 72 65 20 73 68  gument. There sh
cbf0: 6f 75 6c 64 20 62 65 20 65 78 61 63 74 6c 79 20  ould be exactly 
cc00: 6f 6e 65 20 63 61 6c 6c 20 74 6f 20 74 68 69 73  one call to this
cc10: 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 66 6f 72   function.** for
cc20: 20 65 61 63 68 20 63 61 6c 6c 20 74 6f 20 64 62   each call to db
cc30: 45 76 61 6c 49 6e 69 74 28 29 2e 0a 2a 2f 0a 73  EvalInit()..*/.s
cc40: 74 61 74 69 63 20 76 6f 69 64 20 64 62 45 76 61  tatic void dbEva
cc50: 6c 46 69 6e 61 6c 69 7a 65 28 44 62 45 76 61 6c  lFinalize(DbEval
cc60: 43 6f 6e 74 65 78 74 20 2a 70 29 7b 0a 20 20 69  Context *p){.  i
cc70: 66 28 20 70 2d 3e 70 50 72 65 53 74 6d 74 20 29  f( p->pPreStmt )
cc80: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  {.    sqlite3_re
cc90: 73 65 74 28 70 2d 3e 70 50 72 65 53 74 6d 74 2d  set(p->pPreStmt-
cca0: 3e 70 53 74 6d 74 29 3b 0a 20 20 20 20 64 62 52  >pStmt);.    dbR
ccb0: 65 6c 65 61 73 65 53 74 6d 74 28 70 2d 3e 70 44  eleaseStmt(p->pD
ccc0: 62 2c 20 70 2d 3e 70 50 72 65 53 74 6d 74 2c 20  b, p->pPreStmt, 
ccd0: 30 29 3b 0a 20 20 20 20 70 2d 3e 70 50 72 65 53  0);.    p->pPreS
cce0: 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69  tmt = 0;.  }.  i
ccf0: 66 28 20 70 2d 3e 70 41 72 72 61 79 20 29 7b 0a  f( p->pArray ){.
cd00: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
cd10: 6f 75 6e 74 28 70 2d 3e 70 41 72 72 61 79 29 3b  ount(p->pArray);
cd20: 0a 20 20 20 20 70 2d 3e 70 41 72 72 61 79 20 3d  .    p->pArray =
cd30: 20 30 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 44 65   0;.  }.  Tcl_De
cd40: 63 72 52 65 66 43 6f 75 6e 74 28 70 2d 3e 70 53  crRefCount(p->pS
cd50: 71 6c 29 3b 0a 20 20 64 62 52 65 6c 65 61 73 65  ql);.  dbRelease
cd60: 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 29 3b 0a  ColumnNames(p);.
cd70: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
cd80: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 54  a pointer to a T
cd90: 63 6c 5f 4f 62 6a 20 73 74 72 75 63 74 75 72 65  cl_Obj structure
cda0: 20 77 69 74 68 20 72 65 66 2d 63 6f 75 6e 74 20   with ref-count 
cdb0: 30 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 0a  0 that contains.
cdc0: 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 66 6f 72  ** the value for
cdd0: 20 74 68 65 20 69 43 6f 6c 27 74 68 20 63 6f 6c   the iCol'th col
cde0: 75 6d 6e 20 6f 66 20 74 68 65 20 72 6f 77 20 63  umn of the row c
cdf0: 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 65 64  urrently pointed
ce00: 20 74 6f 20 62 79 0a 2a 2a 20 74 68 65 20 44 62   to by.** the Db
ce10: 45 76 61 6c 43 6f 6e 74 65 78 74 20 73 74 72 75  EvalContext stru
ce20: 63 74 75 72 65 20 70 61 73 73 65 64 20 61 73 20  cture passed as 
ce30: 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
ce40: 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 54 63  nt..*/.static Tc
ce50: 6c 5f 4f 62 6a 20 2a 64 62 45 76 61 6c 43 6f 6c  l_Obj *dbEvalCol
ce60: 75 6d 6e 56 61 6c 75 65 28 44 62 45 76 61 6c 43  umnValue(DbEvalC
ce70: 6f 6e 74 65 78 74 20 2a 70 2c 20 69 6e 74 20 69  ontext *p, int i
ce80: 43 6f 6c 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  Col){.  sqlite3_
ce90: 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 70 2d  stmt *pStmt = p-
cea0: 3e 70 50 72 65 53 74 6d 74 2d 3e 70 53 74 6d 74  >pPreStmt->pStmt
ceb0: 3b 0a 20 20 73 77 69 74 63 68 28 20 73 71 6c 69  ;.  switch( sqli
cec0: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 28  te3_column_type(
ced0: 70 53 74 6d 74 2c 20 69 43 6f 6c 29 20 29 7b 0a  pStmt, iCol) ){.
cee0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
cef0: 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20 69 6e  BLOB: {.      in
cf00: 74 20 62 79 74 65 73 20 3d 20 73 71 6c 69 74 65  t bytes = sqlite
cf10: 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70  3_column_bytes(p
cf20: 53 74 6d 74 2c 20 69 43 6f 6c 29 3b 0a 20 20 20  Stmt, iCol);.   
cf30: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
cf40: 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f 63  Blob = sqlite3_c
cf50: 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70 53 74 6d 74  olumn_blob(pStmt
cf60: 2c 20 69 43 6f 6c 29 3b 0a 20 20 20 20 20 20 69  , iCol);.      i
cf70: 66 28 20 21 7a 42 6c 6f 62 20 29 20 62 79 74 65  f( !zBlob ) byte
cf80: 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74  s = 0;.      ret
cf90: 75 72 6e 20 54 63 6c 5f 4e 65 77 42 79 74 65 41  urn Tcl_NewByteA
cfa0: 72 72 61 79 4f 62 6a 28 28 75 38 2a 29 7a 42 6c  rrayObj((u8*)zBl
cfb0: 6f 62 2c 20 62 79 74 65 73 29 3b 0a 20 20 20 20  ob, bytes);.    
cfc0: 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
cfd0: 45 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20  E_INTEGER: {.   
cfe0: 20 20 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20     sqlite_int64 
cff0: 76 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  v = sqlite3_colu
d000: 6d 6e 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20  mn_int64(pStmt, 
d010: 69 43 6f 6c 29 3b 0a 20 20 20 20 20 20 69 66 28  iCol);.      if(
d020: 20 76 3e 3d 2d 32 31 34 37 34 38 33 36 34 37 20   v>=-2147483647 
d030: 26 26 20 76 3c 3d 32 31 34 37 34 38 33 36 34 37  && v<=2147483647
d040: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
d050: 72 6e 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  rn Tcl_NewIntObj
d060: 28 28 69 6e 74 29 76 29 3b 0a 20 20 20 20 20 20  ((int)v);.      
d070: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
d080: 65 74 75 72 6e 20 54 63 6c 5f 4e 65 77 57 69 64  eturn Tcl_NewWid
d090: 65 49 6e 74 4f 62 6a 28 76 29 3b 0a 20 20 20 20  eIntObj(v);.    
d0a0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 63 61    }.    }.    ca
d0b0: 73 65 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54 3a  se SQLITE_FLOAT:
d0c0: 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   {.      return 
d0d0: 54 63 6c 5f 4e 65 77 44 6f 75 62 6c 65 4f 62 6a  Tcl_NewDoubleObj
d0e0: 28 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  (sqlite3_column_
d0f0: 64 6f 75 62 6c 65 28 70 53 74 6d 74 2c 20 69 43  double(pStmt, iC
d100: 6f 6c 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ol));.    }.    
d110: 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 55 4c 4c  case SQLITE_NULL
d120: 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  : {.      return
d130: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
d140: 6a 28 70 2d 3e 70 44 62 2d 3e 7a 4e 75 6c 6c 2c  j(p->pDb->zNull,
d150: 20 2d 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   -1);.    }.  }.
d160: 0a 20 20 72 65 74 75 72 6e 20 54 63 6c 5f 4e 65  .  return Tcl_Ne
d170: 77 53 74 72 69 6e 67 4f 62 6a 28 28 63 68 61 72  wStringObj((char
d180: 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
d190: 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 69 43 6f  _text(pStmt, iCo
d1a0: 6c 29 2c 20 2d 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  l), -1);.}../*.*
d1b0: 2a 20 49 66 20 75 73 69 6e 67 20 54 63 6c 20 76  * If using Tcl v
d1c0: 65 72 73 69 6f 6e 20 38 2e 36 20 6f 72 20 67 72  ersion 8.6 or gr
d1d0: 65 61 74 65 72 2c 20 75 73 65 20 74 68 65 20 4e  eater, use the N
d1e0: 52 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20 61  R functions to a
d1f0: 76 6f 69 64 0a 2a 2a 20 72 65 63 75 72 73 69 76  void.** recursiv
d200: 65 20 65 76 61 6c 75 74 69 6f 6e 20 6f 66 20 73  e evalution of s
d210: 63 72 69 70 74 73 20 62 79 20 74 68 65 20 5b 64  cripts by the [d
d220: 62 20 65 76 61 6c 5d 20 61 6e 64 20 5b 64 62 20  b eval] and [db 
d230: 74 72 61 6e 73 5d 0a 2a 2a 20 63 6f 6d 6d 61 6e  trans].** comman
d240: 64 73 2e 20 45 76 65 6e 20 69 66 20 74 68 65 20  ds. Even if the 
d250: 68 65 61 64 65 72 73 20 75 73 65 64 20 77 68 69  headers used whi
d260: 6c 65 20 63 6f 6d 70 69 6c 69 6e 67 20 74 68 65  le compiling the
d270: 20 65 78 74 65 6e 73 69 6f 6e 0a 2a 2a 20 61 72   extension.** ar
d280: 65 20 38 2e 36 20 6f 72 20 6e 65 77 65 72 2c 20  e 8.6 or newer, 
d290: 74 68 65 20 63 6f 64 65 20 73 74 69 6c 6c 20 74  the code still t
d2a0: 65 73 74 73 20 74 68 65 20 54 63 6c 20 76 65 72  ests the Tcl ver
d2b0: 73 69 6f 6e 20 61 74 20 72 75 6e 74 69 6d 65 2e  sion at runtime.
d2c0: 0a 2a 2a 20 54 68 69 73 20 61 6c 6c 6f 77 73 20  .** This allows 
d2d0: 73 74 75 62 73 2d 65 6e 61 62 6c 65 64 20 62 75  stubs-enabled bu
d2e0: 69 6c 64 73 20 74 6f 20 62 65 20 75 73 65 64 20  ilds to be used 
d2f0: 77 69 74 68 20 6f 6c 64 65 72 20 54 63 6c 20 6c  with older Tcl l
d300: 69 62 72 61 72 69 65 73 2e 0a 2a 2f 0a 23 69 66  ibraries..*/.#if
d310: 20 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49   TCL_MAJOR_VERSI
d320: 4f 4e 3e 38 20 7c 7c 20 28 54 43 4c 5f 4d 41 4a  ON>8 || (TCL_MAJ
d330: 4f 52 5f 56 45 52 53 49 4f 4e 3d 3d 38 20 26 26  OR_VERSION==8 &&
d340: 20 54 43 4c 5f 4d 49 4e 4f 52 5f 56 45 52 53 49   TCL_MINOR_VERSI
d350: 4f 4e 3e 3d 36 29 0a 23 20 64 65 66 69 6e 65 20  ON>=6).# define 
d360: 53 51 4c 49 54 45 5f 54 43 4c 5f 4e 52 45 20 31  SQLITE_TCL_NRE 1
d370: 0a 73 74 61 74 69 63 20 69 6e 74 20 44 62 55 73  .static int DbUs
d380: 65 4e 72 65 28 76 6f 69 64 29 7b 0a 20 20 69 6e  eNre(void){.  in
d390: 74 20 6d 61 6a 6f 72 2c 20 6d 69 6e 6f 72 3b 0a  t major, minor;.
d3a0: 20 20 54 63 6c 5f 47 65 74 56 65 72 73 69 6f 6e    Tcl_GetVersion
d3b0: 28 26 6d 61 6a 6f 72 2c 20 26 6d 69 6e 6f 72 2c  (&major, &minor,
d3c0: 20 30 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e   0, 0);.  return
d3d0: 28 20 28 6d 61 6a 6f 72 3d 3d 38 20 26 26 20 6d  ( (major==8 && m
d3e0: 69 6e 6f 72 3e 3d 36 29 20 7c 7c 20 6d 61 6a 6f  inor>=6) || majo
d3f0: 72 3e 38 20 29 3b 0a 7d 0a 23 65 6c 73 65 0a 2f  r>8 );.}.#else./
d400: 2a 0a 2a 2a 20 43 6f 6d 70 69 6c 69 6e 67 20 75  *.** Compiling u
d410: 73 69 6e 67 20 68 65 61 64 65 72 73 20 65 61 72  sing headers ear
d420: 6c 69 65 72 20 74 68 61 6e 20 38 2e 36 2e 20 49  lier than 8.6. I
d430: 6e 20 74 68 69 73 20 63 61 73 65 20 4e 52 20 63  n this case NR c
d440: 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 75 73 65 64  annot be.** used
d450: 2c 20 73 6f 20 44 62 55 73 65 4e 72 65 28 29 20  , so DbUseNre() 
d460: 74 6f 20 61 6c 77 61 79 73 20 72 65 74 75 72 6e  to always return
d470: 20 7a 65 72 6f 2e 20 41 64 64 20 23 64 65 66 69   zero. Add #defi
d480: 6e 65 73 20 66 6f 72 20 74 68 65 20 6f 74 68 65  nes for the othe
d490: 72 0a 2a 2a 20 54 63 6c 5f 4e 52 78 78 78 28 29  r.** Tcl_NRxxx()
d4a0: 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20 70 72   functions to pr
d4b0: 65 76 65 6e 74 20 74 68 65 6d 20 66 72 6f 6d 20  event them from 
d4c0: 63 61 75 73 69 6e 67 20 63 6f 6d 70 69 6c 61 74  causing compilat
d4d0: 69 6f 6e 20 65 72 72 6f 72 73 2c 0a 2a 2a 20 65  ion errors,.** e
d4e0: 76 65 6e 20 74 68 6f 75 67 68 20 74 68 65 20 6f  ven though the o
d4f0: 6e 6c 79 20 69 6e 76 6f 63 61 74 69 6f 6e 73 20  nly invocations 
d500: 6f 66 20 74 68 65 6d 20 61 72 65 20 77 69 74 68  of them are with
d510: 69 6e 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 62  in conditional b
d520: 6c 6f 63 6b 73 0a 2a 2a 20 6f 66 20 74 68 65 20  locks.** of the 
d530: 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66  form:.**.**   if
d540: 28 20 44 62 55 73 65 4e 72 65 28 29 20 29 20 7b  ( DbUseNre() ) {
d550: 20 2e 2e 2e 20 7d 0a 2a 2f 0a 23 20 64 65 66 69   ... }.*/.# defi
d560: 6e 65 20 53 51 4c 49 54 45 5f 54 43 4c 5f 4e 52  ne SQLITE_TCL_NR
d570: 45 20 30 0a 23 20 64 65 66 69 6e 65 20 44 62 55  E 0.# define DbU
d580: 73 65 4e 72 65 28 29 20 30 0a 23 20 64 65 66 69  seNre() 0.# defi
d590: 6e 65 20 54 63 6c 5f 4e 52 41 64 64 43 61 6c 6c  ne Tcl_NRAddCall
d5a0: 62 61 63 6b 28 61 2c 62 2c 63 2c 64 2c 65 2c 66  back(a,b,c,d,e,f
d5b0: 29 20 28 76 6f 69 64 29 30 0a 23 20 64 65 66 69  ) (void)0.# defi
d5c0: 6e 65 20 54 63 6c 5f 4e 52 45 76 61 6c 4f 62 6a  ne Tcl_NREvalObj
d5d0: 28 61 2c 62 2c 63 29 20 30 0a 23 20 64 65 66 69  (a,b,c) 0.# defi
d5e0: 6e 65 20 54 63 6c 5f 4e 52 43 72 65 61 74 65 43  ne Tcl_NRCreateC
d5f0: 6f 6d 6d 61 6e 64 28 61 2c 62 2c 63 2c 64 2c 65  ommand(a,b,c,d,e
d600: 2c 66 29 20 28 76 6f 69 64 29 30 0a 23 65 6e 64  ,f) (void)0.#end
d610: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  if../*.** This f
d620: 75 6e 63 74 69 6f 6e 20 69 73 20 70 61 72 74 20  unction is part 
d630: 6f 66 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74  of the implement
d640: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 63 6f 6d  ation of the com
d650: 6d 61 6e 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 24 64  mand:.**.**   $d
d660: 62 20 65 76 61 6c 20 53 51 4c 20 3f 41 52 52 41  b eval SQL ?ARRA
d670: 59 4e 41 4d 45 3f 20 53 43 52 49 50 54 0a 2a 2f  YNAME? SCRIPT.*/
d680: 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
d690: 54 45 5f 54 43 4c 41 50 49 20 44 62 45 76 61 6c  TE_TCLAPI DbEval
d6a0: 4e 65 78 74 43 6d 64 28 0a 20 20 43 6c 69 65 6e  NextCmd(.  Clien
d6b0: 74 44 61 74 61 20 64 61 74 61 5b 5d 2c 20 20 20  tData data[],   
d6c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d6d0: 2f 2a 20 64 61 74 61 5b 30 5d 20 69 73 20 74 68  /* data[0] is th
d6e0: 65 20 28 44 62 45 76 61 6c 43 6f 6e 74 65 78 74  e (DbEvalContext
d6f0: 2a 29 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65  *) */.  Tcl_Inte
d700: 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 20  rp *interp,     
d710: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d720: 54 63 6c 20 69 6e 74 65 72 70 72 65 74 65 72 20  Tcl interpreter 
d730: 2a 2f 0a 20 20 69 6e 74 20 72 65 73 75 6c 74 20  */.  int result 
d740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d750: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
d760: 75 6c 74 20 73 6f 20 66 61 72 20 2a 2f 0a 29 7b  ult so far */.){
d770: 0a 20 20 69 6e 74 20 72 63 20 3d 20 72 65 73 75  .  int rc = resu
d780: 6c 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  lt;             
d790: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
d7a0: 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20  n code */..  /* 
d7b0: 54 68 65 20 66 69 72 73 74 20 65 6c 65 6d 65 6e  The first elemen
d7c0: 74 20 6f 66 20 74 68 65 20 64 61 74 61 5b 5d 20  t of the data[] 
d7d0: 61 72 72 61 79 20 69 73 20 61 20 70 6f 69 6e 74  array is a point
d7e0: 65 72 20 74 6f 20 61 20 44 62 45 76 61 6c 43 6f  er to a DbEvalCo
d7f0: 6e 74 65 78 74 0a 20 20 2a 2a 20 73 74 72 75 63  ntext.  ** struc
d800: 74 75 72 65 20 61 6c 6c 6f 63 61 74 65 64 20 75  ture allocated u
d810: 73 69 6e 67 20 54 63 6c 5f 41 6c 6c 6f 63 28 29  sing Tcl_Alloc()
d820: 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 65 6c 65  . The second ele
d830: 6d 65 6e 74 20 6f 66 20 64 61 74 61 5b 5d 0a 20  ment of data[]. 
d840: 20 2a 2a 20 69 73 20 61 20 70 6f 69 6e 74 65 72   ** is a pointer
d850: 20 74 6f 20 61 20 54 63 6c 5f 4f 62 6a 20 63 6f   to a Tcl_Obj co
d860: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 73 63 72  ntaining the scr
d870: 69 70 74 20 74 6f 20 72 75 6e 20 66 6f 72 20 65  ipt to run for e
d880: 61 63 68 20 72 6f 77 0a 20 20 2a 2a 20 72 65 74  ach row.  ** ret
d890: 75 72 6e 65 64 20 62 79 20 74 68 65 20 71 75 65  urned by the que
d8a0: 72 69 65 73 20 65 6e 63 61 70 73 75 6c 61 74 65  ries encapsulate
d8b0: 64 20 69 6e 20 64 61 74 61 5b 30 5d 2e 20 2a 2f  d in data[0]. */
d8c0: 0a 20 20 44 62 45 76 61 6c 43 6f 6e 74 65 78 74  .  DbEvalContext
d8d0: 20 2a 70 20 3d 20 28 44 62 45 76 61 6c 43 6f 6e   *p = (DbEvalCon
d8e0: 74 65 78 74 20 2a 29 64 61 74 61 5b 30 5d 3b 0a  text *)data[0];.
d8f0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 53 63 72 69    Tcl_Obj *pScri
d900: 70 74 20 3d 20 28 54 63 6c 5f 4f 62 6a 20 2a 29  pt = (Tcl_Obj *)
d910: 64 61 74 61 5b 31 5d 3b 0a 20 20 54 63 6c 5f 4f  data[1];.  Tcl_O
d920: 62 6a 20 2a 70 41 72 72 61 79 20 3d 20 70 2d 3e  bj *pArray = p->
d930: 70 41 72 72 61 79 3b 0a 0a 20 20 77 68 69 6c 65  pArray;..  while
d940: 28 20 28 72 63 3d 3d 54 43 4c 5f 4f 4b 20 7c 7c  ( (rc==TCL_OK ||
d950: 20 72 63 3d 3d 54 43 4c 5f 43 4f 4e 54 49 4e 55   rc==TCL_CONTINU
d960: 45 29 20 26 26 20 54 43 4c 5f 4f 4b 3d 3d 28 72  E) && TCL_OK==(r
d970: 63 20 3d 20 64 62 45 76 61 6c 53 74 65 70 28 70  c = dbEvalStep(p
d980: 29 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  )) ){.    int i;
d990: 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20  .    int nCol;. 
d9a0: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 61 70 43     Tcl_Obj **apC
d9b0: 6f 6c 4e 61 6d 65 3b 0a 20 20 20 20 64 62 45 76  olName;.    dbEv
d9c0: 61 6c 52 6f 77 49 6e 66 6f 28 70 2c 20 26 6e 43  alRowInfo(p, &nC
d9d0: 6f 6c 2c 20 26 61 70 43 6f 6c 4e 61 6d 65 29 3b  ol, &apColName);
d9e0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
d9f0: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
da00: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 56 61 6c 20    Tcl_Obj *pVal 
da10: 3d 20 64 62 45 76 61 6c 43 6f 6c 75 6d 6e 56 61  = dbEvalColumnVa
da20: 6c 75 65 28 70 2c 20 69 29 3b 0a 20 20 20 20 20  lue(p, i);.     
da30: 20 69 66 28 20 70 41 72 72 61 79 3d 3d 30 20 29   if( pArray==0 )
da40: 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 4f 62  {.        Tcl_Ob
da50: 6a 53 65 74 56 61 72 32 28 69 6e 74 65 72 70 2c  jSetVar2(interp,
da60: 20 61 70 43 6f 6c 4e 61 6d 65 5b 69 5d 2c 20 30   apColName[i], 0
da70: 2c 20 70 56 61 6c 2c 20 30 29 3b 0a 20 20 20 20  , pVal, 0);.    
da80: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
da90: 20 54 63 6c 5f 4f 62 6a 53 65 74 56 61 72 32 28   Tcl_ObjSetVar2(
daa0: 69 6e 74 65 72 70 2c 20 70 41 72 72 61 79 2c 20  interp, pArray, 
dab0: 61 70 43 6f 6c 4e 61 6d 65 5b 69 5d 2c 20 70 56  apColName[i], pV
dac0: 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  al, 0);.      }.
dad0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68      }..    /* Th
dae0: 65 20 72 65 71 75 69 72 65 64 20 69 6e 74 65 72  e required inter
daf0: 70 72 65 74 65 72 20 76 61 72 69 61 62 6c 65 73  preter variables
db00: 20 61 72 65 20 6e 6f 77 20 70 6f 70 75 6c 61 74   are now populat
db10: 65 64 20 77 69 74 68 20 74 68 65 20 64 61 74 61  ed with the data
db20: 0a 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65  .    ** from the
db30: 20 63 75 72 72 65 6e 74 20 72 6f 77 2e 20 49 66   current row. If
db40: 20 75 73 69 6e 67 20 4e 52 45 2c 20 73 63 68 65   using NRE, sche
db50: 64 75 6c 65 20 63 61 6c 6c 62 61 63 6b 73 20 74  dule callbacks t
db60: 6f 20 65 76 61 6c 75 61 74 65 0a 20 20 20 20 2a  o evaluate.    *
db70: 2a 20 73 63 72 69 70 74 20 70 53 63 72 69 70 74  * script pScript
db80: 2c 20 74 68 65 6e 20 74 6f 20 69 6e 76 6f 6b 65  , then to invoke
db90: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   this function a
dba0: 67 61 69 6e 20 74 6f 20 66 65 74 63 68 20 74 68  gain to fetch th
dbb0: 65 20 6e 65 78 74 0a 20 20 20 20 2a 2a 20 72 6f  e next.    ** ro
dbc0: 77 20 28 6f 72 20 63 6c 65 61 6e 20 75 70 20 69  w (or clean up i
dbd0: 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65  f there is no ne
dbe0: 78 74 20 72 6f 77 20 6f 72 20 74 68 65 20 73 63  xt row or the sc
dbf0: 72 69 70 74 20 74 68 72 6f 77 73 20 61 6e 0a 20  ript throws an. 
dc00: 20 20 20 2a 2a 20 65 78 63 65 70 74 69 6f 6e 29     ** exception)
dc10: 2e 20 41 66 74 65 72 20 73 63 68 65 64 75 6c 69  . After scheduli
dc20: 6e 67 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 73  ng the callbacks
dc30: 2c 20 72 65 74 75 72 6e 20 63 6f 6e 74 72 6f 6c  , return control
dc40: 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 63   to the.    ** c
dc50: 61 6c 6c 65 72 2e 0a 20 20 20 20 2a 2a 0a 20 20  aller..    **.  
dc60: 20 20 2a 2a 20 49 66 20 6e 6f 74 20 75 73 69 6e    ** If not usin
dc70: 67 20 4e 52 45 2c 20 65 76 61 6c 75 61 74 65 20  g NRE, evaluate 
dc80: 70 53 63 72 69 70 74 20 64 69 72 65 63 74 6c 79  pScript directly
dc90: 20 61 6e 64 20 63 6f 6e 74 69 6e 75 65 20 77 69   and continue wi
dca0: 74 68 20 74 68 65 0a 20 20 20 20 2a 2a 20 6e 65  th the.    ** ne
dcb0: 78 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20  xt iteration of 
dcc0: 74 68 69 73 20 77 68 69 6c 65 28 2e 2e 2e 29 20  this while(...) 
dcd0: 6c 6f 6f 70 2e 20 20 2a 2f 0a 20 20 20 20 69 66  loop.  */.    if
dce0: 28 20 44 62 55 73 65 4e 72 65 28 29 20 29 7b 0a  ( DbUseNre() ){.
dcf0: 20 20 20 20 20 20 54 63 6c 5f 4e 52 41 64 64 43        Tcl_NRAddC
dd00: 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c 20  allback(interp, 
dd10: 44 62 45 76 61 6c 4e 65 78 74 43 6d 64 2c 20 28  DbEvalNextCmd, (
dd20: 76 6f 69 64 2a 29 70 2c 20 28 76 6f 69 64 2a 29  void*)p, (void*)
dd30: 70 53 63 72 69 70 74 2c 20 30 2c 20 30 29 3b 0a  pScript, 0, 0);.
dd40: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 63 6c        return Tcl
dd50: 5f 4e 52 45 76 61 6c 4f 62 6a 28 69 6e 74 65 72  _NREvalObj(inter
dd60: 70 2c 20 70 53 63 72 69 70 74 2c 20 30 29 3b 0a  p, pScript, 0);.
dd70: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
dd80: 20 72 63 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62   rc = Tcl_EvalOb
dd90: 6a 45 78 28 69 6e 74 65 72 70 2c 20 70 53 63 72  jEx(interp, pScr
dda0: 69 70 74 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  ipt, 0);.    }. 
ddb0: 20 7d 0a 0a 20 20 54 63 6c 5f 44 65 63 72 52 65   }..  Tcl_DecrRe
ddc0: 66 43 6f 75 6e 74 28 70 53 63 72 69 70 74 29 3b  fCount(pScript);
ddd0: 0a 20 20 64 62 45 76 61 6c 46 69 6e 61 6c 69 7a  .  dbEvalFinaliz
dde0: 65 28 70 29 3b 0a 20 20 54 63 6c 5f 46 72 65 65  e(p);.  Tcl_Free
ddf0: 28 28 63 68 61 72 20 2a 29 70 29 3b 0a 0a 20 20  ((char *)p);..  
de00: 69 66 28 20 72 63 3d 3d 54 43 4c 5f 4f 4b 20 7c  if( rc==TCL_OK |
de10: 7c 20 72 63 3d 3d 54 43 4c 5f 42 52 45 41 4b 20  | rc==TCL_BREAK 
de20: 29 7b 0a 20 20 20 20 54 63 6c 5f 52 65 73 65 74  ){.    Tcl_Reset
de30: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a  Result(interp);.
de40: 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 4f 4b 3b      rc = TCL_OK;
de50: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
de60: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
de70: 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
de80: 20 62 79 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e   by the implemen
de90: 74 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 66  tations of the f
dea0: 6f 6c 6c 6f 77 69 6e 67 20 64 61 74 61 62 61 73  ollowing databas
deb0: 65 0a 2a 2a 20 68 61 6e 64 6c 65 20 73 75 62 2d  e.** handle sub-
dec0: 63 6f 6d 6d 61 6e 64 73 3a 0a 2a 2a 0a 2a 2a 20  commands:.**.** 
ded0: 20 20 24 64 62 20 75 70 64 61 74 65 5f 68 6f 6f    $db update_hoo
dee0: 6b 20 3f 53 43 52 49 50 54 3f 0a 2a 2a 20 20 20  k ?SCRIPT?.**   
def0: 24 64 62 20 77 61 6c 5f 68 6f 6f 6b 20 3f 53 43  $db wal_hook ?SC
df00: 52 49 50 54 3f 0a 2a 2a 20 20 20 24 64 62 20 63  RIPT?.**   $db c
df10: 6f 6d 6d 69 74 5f 68 6f 6f 6b 20 3f 53 43 52 49  ommit_hook ?SCRI
df20: 50 54 3f 0a 2a 2a 20 20 20 24 64 62 20 70 72 65  PT?.**   $db pre
df30: 75 70 64 61 74 65 20 68 6f 6f 6b 20 3f 53 43 52  update hook ?SCR
df40: 49 50 54 3f 0a 2a 2f 0a 73 74 61 74 69 63 20 76  IPT?.*/.static v
df50: 6f 69 64 20 44 62 48 6f 6f 6b 43 6d 64 28 0a 20  oid DbHookCmd(. 
df60: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
df70: 65 72 70 2c 20 20 20 20 20 20 20 20 20 20 20 20  erp,            
df80: 20 2f 2a 20 54 63 6c 20 69 6e 74 65 72 70 72 65   /* Tcl interpre
df90: 74 65 72 20 2a 2f 0a 20 20 53 71 6c 69 74 65 44  ter */.  SqliteD
dfa0: 62 20 2a 70 44 62 2c 20 20 20 20 20 20 20 20 20  b *pDb,         
dfb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
dfc0: 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  base handle */. 
dfd0: 20 54 63 6c 5f 4f 62 6a 20 2a 70 41 72 67 2c 20   Tcl_Obj *pArg, 
dfe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dff0: 20 2f 2a 20 53 43 52 49 50 54 20 61 72 67 75 6d   /* SCRIPT argum
e000: 65 6e 74 20 28 6f 72 20 4e 55 4c 4c 29 20 2a 2f  ent (or NULL) */
e010: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 70 70 48  .  Tcl_Obj **ppH
e020: 6f 6f 6b 20 20 20 20 20 20 20 20 20 20 20 20 20  ook             
e030: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
e040: 20 6d 65 6d 62 65 72 20 6f 66 20 53 71 6c 69 74   member of Sqlit
e050: 65 44 62 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  eDb */.){.  sqli
e060: 74 65 33 20 2a 64 62 20 3d 20 70 44 62 2d 3e 64  te3 *db = pDb->d
e070: 62 3b 0a 0a 20 20 69 66 28 20 2a 70 70 48 6f 6f  b;..  if( *ppHoo
e080: 6b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74  k ){.    Tcl_Set
e090: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
e0a0: 2c 20 2a 70 70 48 6f 6f 6b 29 3b 0a 20 20 20 20  , *ppHook);.    
e0b0: 69 66 28 20 70 41 72 67 20 29 7b 0a 20 20 20 20  if( pArg ){.    
e0c0: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
e0d0: 6e 74 28 2a 70 70 48 6f 6f 6b 29 3b 0a 20 20 20  nt(*ppHook);.   
e0e0: 20 20 20 2a 70 70 48 6f 6f 6b 20 3d 20 30 3b 0a     *ppHook = 0;.
e0f0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
e100: 70 41 72 67 20 29 7b 0a 20 20 20 20 61 73 73 65  pArg ){.    asse
e110: 72 74 28 20 21 28 2a 70 70 48 6f 6f 6b 29 20 29  rt( !(*ppHook) )
e120: 3b 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65  ;.    if( Tcl_Ge
e130: 74 43 68 61 72 4c 65 6e 67 74 68 28 70 41 72 67  tCharLength(pArg
e140: 29 3e 30 20 29 7b 0a 20 20 20 20 20 20 2a 70 70  )>0 ){.      *pp
e150: 48 6f 6f 6b 20 3d 20 70 41 72 67 3b 0a 20 20 20  Hook = pArg;.   
e160: 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f     Tcl_IncrRefCo
e170: 75 6e 74 28 2a 70 70 48 6f 6f 6b 29 3b 0a 20 20  unt(*ppHook);.  
e180: 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20    }.  }..#ifdef 
e190: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52  SQLITE_ENABLE_PR
e1a0: 45 55 50 44 41 54 45 5f 48 4f 4f 4b 0a 20 20 73  EUPDATE_HOOK.  s
e1b0: 71 6c 69 74 65 33 5f 70 72 65 75 70 64 61 74 65  qlite3_preupdate
e1c0: 5f 68 6f 6f 6b 28 64 62 2c 20 28 70 44 62 2d 3e  _hook(db, (pDb->
e1d0: 70 50 72 65 55 70 64 61 74 65 48 6f 6f 6b 3f 44  pPreUpdateHook?D
e1e0: 62 50 72 65 55 70 64 61 74 65 48 61 6e 64 6c 65  bPreUpdateHandle
e1f0: 72 3a 30 29 2c 20 70 44 62 29 3b 0a 23 65 6e 64  r:0), pDb);.#end
e200: 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 75 70 64  if.  sqlite3_upd
e210: 61 74 65 5f 68 6f 6f 6b 28 64 62 2c 20 28 70 44  ate_hook(db, (pD
e220: 62 2d 3e 70 55 70 64 61 74 65 48 6f 6f 6b 3f 44  b->pUpdateHook?D
e230: 62 55 70 64 61 74 65 48 61 6e 64 6c 65 72 3a 30  bUpdateHandler:0
e240: 29 2c 20 70 44 62 29 3b 0a 20 20 73 71 6c 69 74  ), pDb);.  sqlit
e250: 65 33 5f 72 6f 6c 6c 62 61 63 6b 5f 68 6f 6f 6b  e3_rollback_hook
e260: 28 64 62 2c 20 28 70 44 62 2d 3e 70 52 6f 6c 6c  (db, (pDb->pRoll
e270: 62 61 63 6b 48 6f 6f 6b 3f 44 62 52 6f 6c 6c 62  backHook?DbRollb
e280: 61 63 6b 48 61 6e 64 6c 65 72 3a 30 29 2c 20 70  ackHandler:0), p
e290: 44 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 77  Db);.  sqlite3_w
e2a0: 61 6c 5f 68 6f 6f 6b 28 64 62 2c 20 28 70 44 62  al_hook(db, (pDb
e2b0: 2d 3e 70 57 61 6c 48 6f 6f 6b 3f 44 62 57 61 6c  ->pWalHook?DbWal
e2c0: 48 61 6e 64 6c 65 72 3a 30 29 2c 20 70 44 62 29  Handler:0), pDb)
e2d0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 22  ;.}../*.** The "
e2e0: 73 71 6c 69 74 65 22 20 63 6f 6d 6d 61 6e 64 20  sqlite" command 
e2f0: 62 65 6c 6f 77 20 63 72 65 61 74 65 73 20 61 20  below creates a 
e300: 6e 65 77 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 20  new Tcl command 
e310: 66 6f 72 20 65 61 63 68 0a 2a 2a 20 63 6f 6e 6e  for each.** conn
e320: 65 63 74 69 6f 6e 20 69 74 20 6f 70 65 6e 73 20  ection it opens 
e330: 74 6f 20 61 6e 20 53 51 4c 69 74 65 20 64 61 74  to an SQLite dat
e340: 61 62 61 73 65 2e 20 20 54 68 69 73 20 72 6f 75  abase.  This rou
e350: 74 69 6e 65 20 69 73 20 69 6e 76 6f 6b 65 64 0a  tine is invoked.
e360: 2a 2a 20 77 68 65 6e 65 76 65 72 20 6f 6e 65 20  ** whenever one 
e370: 6f 66 20 74 68 6f 73 65 20 63 6f 6e 6e 65 63 74  of those connect
e380: 69 6f 6e 2d 73 70 65 63 69 66 69 63 20 63 6f 6d  ion-specific com
e390: 6d 61 6e 64 73 20 69 73 20 65 78 65 63 75 74 65  mands is execute
e3a0: 64 0a 2a 2a 20 69 6e 20 54 63 6c 2e 20 20 46 6f  d.** in Tcl.  Fo
e3b0: 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 79 6f  r example, if yo
e3c0: 75 20 72 75 6e 20 54 63 6c 20 63 6f 64 65 20 6c  u run Tcl code l
e3d0: 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20  ike this:.**.** 
e3e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 64 62        sqlite3 db
e3f0: 31 20 20 22 6d 79 5f 64 61 74 61 62 61 73 65 22  1  "my_database"
e400: 0a 2a 2a 20 20 20 20 20 20 20 64 62 31 20 63 6c  .**       db1 cl
e410: 6f 73 65 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69  ose.**.** The fi
e420: 72 73 74 20 63 6f 6d 6d 61 6e 64 20 6f 70 65 6e  rst command open
e430: 73 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74  s a connection t
e440: 6f 20 74 68 65 20 22 6d 79 5f 64 61 74 61 62 61  o the "my_databa
e450: 73 65 22 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  se" database.** 
e460: 61 6e 64 20 63 61 6c 6c 73 20 74 68 61 74 20 63  and calls that c
e470: 6f 6e 6e 65 63 74 69 6f 6e 20 22 64 62 31 22 2e  onnection "db1".
e480: 20 20 54 68 65 20 73 65 63 6f 6e 64 20 63 6f 6d    The second com
e490: 6d 61 6e 64 20 63 61 75 73 65 73 20 74 68 69 73  mand causes this
e4a0: 0a 2a 2a 20 73 75 62 72 6f 75 74 69 6e 65 20 74  .** subroutine t
e4b0: 6f 20 62 65 20 69 6e 76 6f 6b 65 64 2e 0a 2a 2f  o be invoked..*/
e4c0: 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
e4d0: 54 45 5f 54 43 4c 41 50 49 20 44 62 4f 62 6a 43  TE_TCLAPI DbObjC
e4e0: 6d 64 28 0a 20 20 76 6f 69 64 20 2a 63 64 2c 0a  md(.  void *cd,.
e4f0: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
e500: 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
e510: 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e  ,.  Tcl_Obj *con
e520: 73 74 2a 6f 62 6a 76 0a 29 7b 0a 20 20 53 71 6c  st*objv.){.  Sql
e530: 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53 71  iteDb *pDb = (Sq
e540: 6c 69 74 65 44 62 2a 29 63 64 3b 0a 20 20 69 6e  liteDb*)cd;.  in
e550: 74 20 63 68 6f 69 63 65 3b 0a 20 20 69 6e 74 20  t choice;.  int 
e560: 72 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20 73  rc = TCL_OK;.  s
e570: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
e580: 20 2a 44 42 5f 73 74 72 73 5b 5d 20 3d 20 7b 0a   *DB_strs[] = {.
e590: 20 20 20 20 22 61 75 74 68 6f 72 69 7a 65 72 22      "authorizer"
e5a0: 2c 20 20 20 20 20 20 20 20 20 22 62 61 63 6b 75  ,         "backu
e5b0: 70 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 22  p",            "
e5c0: 62 75 73 79 22 2c 0a 20 20 20 20 22 63 61 63 68  busy",.    "cach
e5d0: 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  e",             
e5e0: 20 22 63 68 61 6e 67 65 73 22 2c 20 20 20 20 20   "changes",     
e5f0: 20 20 20 20 20 20 22 63 6c 6f 73 65 22 2c 0a 20        "close",. 
e600: 20 20 20 22 63 6f 6c 6c 61 74 65 22 2c 20 20 20     "collate",   
e610: 20 20 20 20 20 20 20 20 20 22 63 6f 6c 6c 61 74           "collat
e620: 69 6f 6e 5f 6e 65 65 64 65 64 22 2c 20 20 22 63  ion_needed",  "c
e630: 6f 6d 6d 69 74 5f 68 6f 6f 6b 22 2c 0a 20 20 20  ommit_hook",.   
e640: 20 22 63 6f 6d 70 6c 65 74 65 22 2c 20 20 20 20   "complete",    
e650: 20 20 20 20 20 20 20 22 63 6f 70 79 22 2c 20 20         "copy",  
e660: 20 20 20 20 20 20 20 20 20 20 20 20 22 65 6e 61              "ena
e670: 62 6c 65 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69  ble_load_extensi
e680: 6f 6e 22 2c 0a 20 20 20 20 22 65 72 72 6f 72 63  on",.    "errorc
e690: 6f 64 65 22 2c 20 20 20 20 20 20 20 20 20 20 22  ode",          "
e6a0: 65 76 61 6c 22 2c 20 20 20 20 20 20 20 20 20 20  eval",          
e6b0: 20 20 20 20 22 65 78 69 73 74 73 22 2c 0a 20 20      "exists",.  
e6c0: 20 20 22 66 75 6e 63 74 69 6f 6e 22 2c 20 20 20    "function",   
e6d0: 20 20 20 20 20 20 20 20 22 69 6e 63 72 62 6c 6f          "incrblo
e6e0: 62 22 2c 20 20 20 20 20 20 20 20 20 20 22 69 6e  b",          "in
e6f0: 74 65 72 72 75 70 74 22 2c 0a 20 20 20 20 22 6c  terrupt",.    "l
e700: 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64  ast_insert_rowid
e710: 22 2c 20 20 22 6e 75 6c 6c 76 61 6c 75 65 22 2c  ",  "nullvalue",
e720: 20 20 20 20 20 20 20 20 20 22 6f 6e 65 63 6f 6c           "onecol
e730: 75 6d 6e 22 2c 0a 20 20 20 20 22 70 72 65 75 70  umn",.    "preup
e740: 64 61 74 65 22 2c 20 20 20 20 20 20 20 20 20 20  date",          
e750: 22 70 72 6f 66 69 6c 65 22 2c 20 20 20 20 20 20  "profile",      
e760: 20 20 20 20 20 22 70 72 6f 67 72 65 73 73 22 2c       "progress",
e770: 0a 20 20 20 20 22 72 65 6b 65 79 22 2c 20 20 20  .    "rekey",   
e780: 20 20 20 20 20 20 20 20 20 20 20 22 72 65 73 74             "rest
e790: 6f 72 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ore",           
e7a0: 22 72 6f 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 22 2c  "rollback_hook",
e7b0: 0a 20 20 20 20 22 73 74 61 74 75 73 22 2c 20 20  .    "status",  
e7c0: 20 20 20 20 20 20 20 20 20 20 20 22 74 69 6d 65             "time
e7d0: 6f 75 74 22 2c 20 20 20 20 20 20 20 20 20 20 20  out",           
e7e0: 22 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73 22 2c  "total_changes",
e7f0: 0a 20 20 20 20 22 74 72 61 63 65 22 2c 20 20 20  .    "trace",   
e800: 20 20 20 20 20 20 20 20 20 20 20 22 74 72 61 63             "trac
e810: 65 5f 76 32 22 2c 20 20 20 20 20 20 20 20 20 20  e_v2",          
e820: 22 74 72 61 6e 73 61 63 74 69 6f 6e 22 2c 0a 20  "transaction",. 
e830: 20 20 20 22 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66     "unlock_notif
e840: 79 22 2c 20 20 20 20 20 20 22 75 70 64 61 74 65  y",      "update
e850: 5f 68 6f 6f 6b 22 2c 20 20 20 20 20 20 20 22 76  _hook",       "v
e860: 65 72 73 69 6f 6e 22 2c 0a 20 20 20 20 22 77 61  ersion",.    "wa
e870: 6c 5f 68 6f 6f 6b 22 2c 0a 20 20 20 20 30 0a 20  l_hook",.    0. 
e880: 20 7d 3b 0a 20 20 65 6e 75 6d 20 44 42 5f 65 6e   };.  enum DB_en
e890: 75 6d 20 7b 0a 20 20 20 20 44 42 5f 41 55 54 48  um {.    DB_AUTH
e8a0: 4f 52 49 5a 45 52 2c 20 20 20 20 20 20 20 20 44  ORIZER,        D
e8b0: 42 5f 42 41 43 4b 55 50 2c 20 20 20 20 20 20 20  B_BACKUP,       
e8c0: 20 20 20 20 44 42 5f 42 55 53 59 2c 0a 20 20 20      DB_BUSY,.   
e8d0: 20 44 42 5f 43 41 43 48 45 2c 20 20 20 20 20 20   DB_CACHE,      
e8e0: 20 20 20 20 20 20 20 44 42 5f 43 48 41 4e 47 45         DB_CHANGE
e8f0: 53 2c 20 20 20 20 20 20 20 20 20 20 44 42 5f 43  S,          DB_C
e900: 4c 4f 53 45 2c 0a 20 20 20 20 44 42 5f 43 4f 4c  LOSE,.    DB_COL
e910: 4c 41 54 45 2c 20 20 20 20 20 20 20 20 20 20 20  LATE,           
e920: 44 42 5f 43 4f 4c 4c 41 54 49 4f 4e 5f 4e 45 45  DB_COLLATION_NEE
e930: 44 45 44 2c 20 44 42 5f 43 4f 4d 4d 49 54 5f 48  DED, DB_COMMIT_H
e940: 4f 4f 4b 2c 0a 20 20 20 20 44 42 5f 43 4f 4d 50  OOK,.    DB_COMP
e950: 4c 45 54 45 2c 20 20 20 20 20 20 20 20 20 20 44  LETE,          D
e960: 42 5f 43 4f 50 59 2c 20 20 20 20 20 20 20 20 20  B_COPY,         
e970: 20 20 20 20 44 42 5f 45 4e 41 42 4c 45 5f 4c 4f      DB_ENABLE_LO
e980: 41 44 5f 45 58 54 45 4e 53 49 4f 4e 2c 0a 20 20  AD_EXTENSION,.  
e990: 20 20 44 42 5f 45 52 52 4f 52 43 4f 44 45 2c 20    DB_ERRORCODE, 
e9a0: 20 20 20 20 20 20 20 20 44 42 5f 45 56 41 4c 2c          DB_EVAL,
e9b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 44 42 5f               DB_
e9c0: 45 58 49 53 54 53 2c 0a 20 20 20 20 44 42 5f 46  EXISTS,.    DB_F
e9d0: 55 4e 43 54 49 4f 4e 2c 20 20 20 20 20 20 20 20  UNCTION,        
e9e0: 20 20 44 42 5f 49 4e 43 52 42 4c 4f 42 2c 20 20    DB_INCRBLOB,  
e9f0: 20 20 20 20 20 20 20 44 42 5f 49 4e 54 45 52 52         DB_INTERR
ea00: 55 50 54 2c 0a 20 20 20 20 44 42 5f 4c 41 53 54  UPT,.    DB_LAST
ea10: 5f 49 4e 53 45 52 54 5f 52 4f 57 49 44 2c 20 44  _INSERT_ROWID, D
ea20: 42 5f 4e 55 4c 4c 56 41 4c 55 45 2c 20 20 20 20  B_NULLVALUE,    
ea30: 20 20 20 20 44 42 5f 4f 4e 45 43 4f 4c 55 4d 4e      DB_ONECOLUMN
ea40: 2c 0a 20 20 20 20 44 42 5f 50 52 45 55 50 44 41  ,.    DB_PREUPDA
ea50: 54 45 2c 20 20 20 20 20 20 20 20 20 44 42 5f 50  TE,         DB_P
ea60: 52 4f 46 49 4c 45 2c 20 20 20 20 20 20 20 20 20  ROFILE,         
ea70: 20 44 42 5f 50 52 4f 47 52 45 53 53 2c 0a 20 20   DB_PROGRESS,.  
ea80: 20 20 44 42 5f 52 45 4b 45 59 2c 20 20 20 20 20    DB_REKEY,     
ea90: 20 20 20 20 20 20 20 20 44 42 5f 52 45 53 54 4f          DB_RESTO
eaa0: 52 45 2c 20 20 20 20 20 20 20 20 20 20 44 42 5f  RE,          DB_
eab0: 52 4f 4c 4c 42 41 43 4b 5f 48 4f 4f 4b 2c 0a 20  ROLLBACK_HOOK,. 
eac0: 20 20 20 44 42 5f 53 54 41 54 55 53 2c 20 20 20     DB_STATUS,   
ead0: 20 20 20 20 20 20 20 20 20 44 42 5f 54 49 4d 45           DB_TIME
eae0: 4f 55 54 2c 20 20 20 20 20 20 20 20 20 20 44 42  OUT,          DB
eaf0: 5f 54 4f 54 41 4c 5f 43 48 41 4e 47 45 53 2c 0a  _TOTAL_CHANGES,.
eb00: 20 20 20 20 44 42 5f 54 52 41 43 45 2c 20 20 20      DB_TRACE,   
eb10: 20 20 20 20 20 20 20 20 20 20 44 42 5f 54 52 41            DB_TRA
eb20: 43 45 5f 56 32 2c 20 20 20 20 20 20 20 20 20 44  CE_V2,         D
eb30: 42 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c 0a 20  B_TRANSACTION,. 
eb40: 20 20 20 44 42 5f 55 4e 4c 4f 43 4b 5f 4e 4f 54     DB_UNLOCK_NOT
eb50: 49 46 59 2c 20 20 20 20 20 44 42 5f 55 50 44 41  IFY,     DB_UPDA
eb60: 54 45 5f 48 4f 4f 4b 2c 20 20 20 20 20 20 44 42  TE_HOOK,      DB
eb70: 5f 56 45 52 53 49 4f 4e 2c 0a 20 20 20 20 44 42  _VERSION,.    DB
eb80: 5f 57 41 4c 5f 48 4f 4f 4b 2c 0a 20 20 7d 3b 0a  _WAL_HOOK,.  };.
eb90: 20 20 2f 2a 20 64 6f 6e 27 74 20 6c 65 61 76 65    /* don't leave
eba0: 20 74 72 61 69 6c 69 6e 67 20 63 6f 6d 6d 61 73   trailing commas
ebb0: 20 6f 6e 20 44 42 5f 65 6e 75 6d 2c 20 69 74 20   on DB_enum, it 
ebc0: 63 6f 6e 66 75 73 65 73 20 74 68 65 20 41 49 58  confuses the AIX
ebd0: 20 78 6c 63 20 63 6f 6d 70 69 6c 65 72 20 2a 2f   xlc compiler */
ebe0: 0a 0a 20 20 69 66 28 20 6f 62 6a 63 3c 32 20 29  ..  if( objc<2 )
ebf0: 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
ec00: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
ec10: 2c 20 6f 62 6a 76 2c 20 22 53 55 42 43 4f 4d 4d  , objv, "SUBCOMM
ec20: 41 4e 44 20 2e 2e 2e 22 29 3b 0a 20 20 20 20 72  AND ...");.    r
ec30: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
ec40: 0a 20 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47  .  }.  if( Tcl_G
ec50: 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69  etIndexFromObj(i
ec60: 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20  nterp, objv[1], 
ec70: 44 42 5f 73 74 72 73 2c 20 22 6f 70 74 69 6f 6e  DB_strs, "option
ec80: 22 2c 20 30 2c 20 26 63 68 6f 69 63 65 29 20 29  ", 0, &choice) )
ec90: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  {.    return TCL
eca0: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 73  _ERROR;.  }..  s
ecb0: 77 69 74 63 68 28 20 28 65 6e 75 6d 20 44 42 5f  witch( (enum DB_
ecc0: 65 6e 75 6d 29 63 68 6f 69 63 65 20 29 7b 0a 0a  enum)choice ){..
ecd0: 20 20 2f 2a 20 20 20 20 24 64 62 20 61 75 74 68    /*    $db auth
ece0: 6f 72 69 7a 65 72 20 3f 43 41 4c 4c 42 41 43 4b  orizer ?CALLBACK
ecf0: 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 76 6f  ?.  **.  ** Invo
ed00: 6b 65 20 74 68 65 20 67 69 76 65 6e 20 63 61 6c  ke the given cal
ed10: 6c 62 61 63 6b 20 74 6f 20 61 75 74 68 6f 72 69  lback to authori
ed20: 7a 65 20 65 61 63 68 20 53 51 4c 20 6f 70 65 72  ze each SQL oper
ed30: 61 74 69 6f 6e 20 61 73 20 69 74 20 69 73 0a 20  ation as it is. 
ed40: 20 2a 2a 20 63 6f 6d 70 69 6c 65 64 2e 20 20 35   ** compiled.  5
ed50: 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65 20 61   arguments are a
ed60: 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 63  ppended to the c
ed70: 61 6c 6c 62 61 63 6b 20 62 65 66 6f 72 65 20 69  allback before i
ed80: 74 20 69 73 0a 20 20 2a 2a 20 69 6e 76 6f 6b 65  t is.  ** invoke
ed90: 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 28  d:.  **.  **   (
eda0: 31 29 20 54 68 65 20 61 75 74 68 6f 72 69 7a 61  1) The authoriza
edb0: 74 69 6f 6e 20 74 79 70 65 20 28 65 78 3a 20 53  tion type (ex: S
edc0: 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 41 42  QLITE_CREATE_TAB
edd0: 4c 45 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45 52  LE, SQLITE_INSER
ede0: 54 2c 20 2e 2e 2e 29 0a 20 20 2a 2a 20 20 20 28  T, ...).  **   (
edf0: 32 29 20 46 69 72 73 74 20 64 65 73 63 72 69 70  2) First descrip
ee00: 74 69 76 65 20 6e 61 6d 65 20 28 64 65 70 65 6e  tive name (depen
ee10: 64 73 20 6f 6e 20 61 75 74 68 6f 72 69 7a 61 74  ds on authorizat
ee20: 69 6f 6e 20 74 79 70 65 29 0a 20 20 2a 2a 20 20  ion type).  **  
ee30: 20 28 33 29 20 53 65 63 6f 6e 64 20 64 65 73 63   (3) Second desc
ee40: 72 69 70 74 69 76 65 20 6e 61 6d 65 0a 20 20 2a  riptive name.  *
ee50: 2a 20 20 20 28 34 29 20 4e 61 6d 65 20 6f 66 20  *   (4) Name of 
ee60: 74 68 65 20 64 61 74 61 62 61 73 65 20 28 65 78  the database (ex
ee70: 3a 20 22 6d 61 69 6e 22 2c 20 22 74 65 6d 70 22  : "main", "temp"
ee80: 29 0a 20 20 2a 2a 20 20 20 28 35 29 20 4e 61 6d  ).  **   (5) Nam
ee90: 65 20 6f 66 20 74 72 69 67 67 65 72 20 74 68 61  e of trigger tha
eea0: 74 20 69 73 20 64 6f 69 6e 67 20 74 68 65 20 61  t is doing the a
eeb0: 63 63 65 73 73 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ccess.  **.  ** 
eec0: 54 68 65 20 63 61 6c 6c 62 61 63 6b 20 73 68 6f  The callback sho
eed0: 75 6c 64 20 72 65 74 75 72 6e 20 6f 6e 20 6f 66  uld return on of
eee0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
eef0: 74 72 69 6e 67 73 3a 20 53 51 4c 49 54 45 5f 4f  trings: SQLITE_O
ef00: 4b 2c 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 49  K,.  ** SQLITE_I
ef10: 47 4e 4f 52 45 2c 20 6f 72 20 53 51 4c 49 54 45  GNORE, or SQLITE
ef20: 5f 44 45 4e 59 2e 20 20 41 6e 79 20 6f 74 68 65  _DENY.  Any othe
ef30: 72 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  r return value i
ef40: 73 20 61 6e 20 65 72 72 6f 72 2e 0a 20 20 2a 2a  s an error..  **
ef50: 0a 20 20 2a 2a 20 49 66 20 74 68 69 73 20 6d 65  .  ** If this me
ef60: 74 68 6f 64 20 69 73 20 69 6e 76 6f 6b 65 64 20  thod is invoked 
ef70: 77 69 74 68 20 6e 6f 20 61 72 67 75 6d 65 6e 74  with no argument
ef80: 73 2c 20 74 68 65 20 63 75 72 72 65 6e 74 20 61  s, the current a
ef90: 75 74 68 6f 72 69 7a 61 74 69 6f 6e 0a 20 20 2a  uthorization.  *
efa0: 2a 20 63 61 6c 6c 62 61 63 6b 20 73 74 72 69 6e  * callback strin
efb0: 67 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 20  g is returned.. 
efc0: 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 41 55   */.  case DB_AU
efd0: 54 48 4f 52 49 5a 45 52 3a 20 7b 0a 23 69 66 64  THORIZER: {.#ifd
efe0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
eff0: 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 20  UTHORIZATION.   
f000: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
f010: 74 28 69 6e 74 65 72 70 2c 20 22 61 75 74 68 6f  t(interp, "autho
f020: 72 69 7a 61 74 69 6f 6e 20 6e 6f 74 20 61 76 61  rization not ava
f030: 69 6c 61 62 6c 65 20 69 6e 20 74 68 69 73 20 62  ilable in this b
f040: 75 69 6c 64 22 2c 0a 20 20 20 20 20 20 20 20 20  uild",.         
f050: 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
f060: 72 2a 29 30 29 3b 0a 20 20 20 20 72 65 74 75 72  r*)0);.    retur
f070: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c  n TCL_ERROR;.#el
f080: 73 65 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3e  se.    if( objc>
f090: 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57  3 ){.      Tcl_W
f0a0: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
f0b0: 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 43  rp, 2, objv, "?C
f0c0: 41 4c 4c 42 41 43 4b 3f 22 29 3b 0a 20 20 20 20  ALLBACK?");.    
f0d0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
f0e0: 4f 52 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  OR;.    }else if
f0f0: 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20  ( objc==2 ){.   
f100: 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 41 75 74     if( pDb->zAut
f110: 68 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c  h ){.        Tcl
f120: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
f130: 74 65 72 70 2c 20 70 44 62 2d 3e 7a 41 75 74 68  terp, pDb->zAuth
f140: 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20  , (char*)0);.   
f150: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
f160: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 41 75 74        char *zAut
f170: 68 3b 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e  h;.      int len
f180: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d  ;.      if( pDb-
f190: 3e 7a 41 75 74 68 20 29 7b 0a 20 20 20 20 20 20  >zAuth ){.      
f1a0: 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e    Tcl_Free(pDb->
f1b0: 7a 41 75 74 68 29 3b 0a 20 20 20 20 20 20 7d 0a  zAuth);.      }.
f1c0: 20 20 20 20 20 20 7a 41 75 74 68 20 3d 20 54 63        zAuth = Tc
f1d0: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
f1e0: 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e  bj(objv[2], &len
f1f0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 41 75  );.      if( zAu
f200: 74 68 20 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20  th && len>0 ){. 
f210: 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 41 75 74         pDb->zAut
f220: 68 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c  h = Tcl_Alloc( l
f230: 65 6e 20 2b 20 31 20 29 3b 0a 20 20 20 20 20 20  en + 1 );.      
f240: 20 20 6d 65 6d 63 70 79 28 70 44 62 2d 3e 7a 41    memcpy(pDb->zA
f250: 75 74 68 2c 20 7a 41 75 74 68 2c 20 6c 65 6e 2b  uth, zAuth, len+
f260: 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  1);.      }else{
f270: 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 41  .        pDb->zA
f280: 75 74 68 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  uth = 0;.      }
f290: 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e  .      if( pDb->
f2a0: 7a 41 75 74 68 20 29 7b 0a 20 20 20 20 20 20 20  zAuth ){.       
f2b0: 20 74 79 70 65 64 65 66 20 69 6e 74 20 28 2a 73   typedef int (*s
f2c0: 71 6c 69 74 65 33 5f 61 75 74 68 5f 63 62 29 28  qlite3_auth_cb)(
f2d0: 0a 20 20 20 20 20 20 20 20 20 20 20 76 6f 69 64  .           void
f2e0: 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 63 68 61 72  *,int,const char
f2f0: 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c 0a 20  *,const char*,. 
f300: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20            const 
f310: 63 68 61 72 2a 2c 63 6f 6e 73 74 20 63 68 61 72  char*,const char
f320: 2a 29 3b 0a 20 20 20 20 20 20 20 20 70 44 62 2d  *);.        pDb-
f330: 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70  >interp = interp
f340: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
f350: 33 5f 73 65 74 5f 61 75 74 68 6f 72 69 7a 65 72  3_set_authorizer
f360: 28 70 44 62 2d 3e 64 62 2c 28 73 71 6c 69 74 65  (pDb->db,(sqlite
f370: 33 5f 61 75 74 68 5f 63 62 29 61 75 74 68 5f 63  3_auth_cb)auth_c
f380: 61 6c 6c 62 61 63 6b 2c 70 44 62 29 3b 0a 20 20  allback,pDb);.  
f390: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
f3a0: 20 20 20 73 71 6c 69 74 65 33 5f 73 65 74 5f 61     sqlite3_set_a
f3b0: 75 74 68 6f 72 69 7a 65 72 28 70 44 62 2d 3e 64  uthorizer(pDb->d
f3c0: 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  b, 0, 0);.      
f3d0: 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  }.    }.#endif. 
f3e0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
f3f0: 20 2f 2a 20 20 20 20 24 64 62 20 62 61 63 6b 75   /*    $db backu
f400: 70 20 3f 44 41 54 41 42 41 53 45 3f 20 46 49 4c  p ?DATABASE? FIL
f410: 45 4e 41 4d 45 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ENAME.  **.  ** 
f420: 4f 70 65 6e 20 6f 72 20 63 72 65 61 74 65 20 61  Open or create a
f430: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e   database file n
f440: 61 6d 65 64 20 46 49 4c 45 4e 41 4d 45 2e 20 20  amed FILENAME.  
f450: 54 72 61 6e 73 66 65 72 20 74 68 65 0a 20 20 2a  Transfer the.  *
f460: 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20 6c 6f 63  * content of loc
f470: 61 6c 20 64 61 74 61 62 61 73 65 20 44 41 54 41  al database DATA
f480: 42 41 53 45 20 28 64 65 66 61 75 6c 74 3a 20 22  BASE (default: "
f490: 6d 61 69 6e 22 29 20 69 6e 74 6f 20 74 68 65 0a  main") into the.
f4a0: 20 20 2a 2a 20 46 49 4c 45 4e 41 4d 45 20 64 61    ** FILENAME da
f4b0: 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 63  tabase..  */.  c
f4c0: 61 73 65 20 44 42 5f 42 41 43 4b 55 50 3a 20 7b  ase DB_BACKUP: {
f4d0: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
f4e0: 2a 7a 44 65 73 74 46 69 6c 65 3b 0a 20 20 20 20  *zDestFile;.    
f4f0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 72 63  const char *zSrc
f500: 44 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 20  Db;.    sqlite3 
f510: 2a 70 44 65 73 74 3b 0a 20 20 20 20 73 71 6c 69  *pDest;.    sqli
f520: 74 65 33 5f 62 61 63 6b 75 70 20 2a 70 42 61 63  te3_backup *pBac
f530: 6b 75 70 3b 0a 0a 20 20 20 20 69 66 28 20 6f 62  kup;..    if( ob
f540: 6a 63 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20 7a  jc==3 ){.      z
f550: 53 72 63 44 62 20 3d 20 22 6d 61 69 6e 22 3b 0a  SrcDb = "main";.
f560: 20 20 20 20 20 20 7a 44 65 73 74 46 69 6c 65 20        zDestFile 
f570: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  = Tcl_GetString(
f580: 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 20 20 7d 65  objv[2]);.    }e
f590: 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d 34 20  lse if( objc==4 
f5a0: 29 7b 0a 20 20 20 20 20 20 7a 53 72 63 44 62 20  ){.      zSrcDb 
f5b0: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  = Tcl_GetString(
f5c0: 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 20 20 20 20  objv[2]);.      
f5d0: 7a 44 65 73 74 46 69 6c 65 20 3d 20 54 63 6c 5f  zDestFile = Tcl_
f5e0: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33  GetString(objv[3
f5f0: 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ]);.    }else{. 
f600: 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
f610: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
f620: 20 6f 62 6a 76 2c 20 22 3f 44 41 54 41 42 41 53   objv, "?DATABAS
f630: 45 3f 20 46 49 4c 45 4e 41 4d 45 22 29 3b 0a 20  E? FILENAME");. 
f640: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
f650: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
f660: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 6f 70   rc = sqlite3_op
f670: 65 6e 5f 76 32 28 7a 44 65 73 74 46 69 6c 65 2c  en_v2(zDestFile,
f680: 20 26 70 44 65 73 74 2c 0a 20 20 20 20 20 20 20   &pDest,.       
f690: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
f6a0: 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20  PEN_READWRITE | 
f6b0: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
f6c0: 54 45 7c 20 70 44 62 2d 3e 6f 70 65 6e 46 6c 61  TE| pDb->openFla
f6d0: 67 73 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  gs, 0);.    if( 
f6e0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
f6f0: 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  .      Tcl_Appen
f700: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
f710: 22 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 74 61 72  "cannot open tar
f720: 67 65 74 20 64 61 74 61 62 61 73 65 3a 20 22 2c  get database: ",
f730: 0a 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  .           sqli
f740: 74 65 33 5f 65 72 72 6d 73 67 28 70 44 65 73 74  te3_errmsg(pDest
f750: 29 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  ), (char*)0);.  
f760: 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73      sqlite3_clos
f770: 65 28 70 44 65 73 74 29 3b 0a 20 20 20 20 20 20  e(pDest);.      
f780: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
f790: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 61 63  ;.    }.    pBac
f7a0: 6b 75 70 20 3d 20 73 71 6c 69 74 65 33 5f 62 61  kup = sqlite3_ba
f7b0: 63 6b 75 70 5f 69 6e 69 74 28 70 44 65 73 74 2c  ckup_init(pDest,
f7c0: 20 22 6d 61 69 6e 22 2c 20 70 44 62 2d 3e 64 62   "main", pDb->db
f7d0: 2c 20 7a 53 72 63 44 62 29 3b 0a 20 20 20 20 69  , zSrcDb);.    i
f7e0: 66 28 20 70 42 61 63 6b 75 70 3d 3d 30 20 29 7b  f( pBackup==0 ){
f7f0: 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  .      Tcl_Appen
f800: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
f810: 22 62 61 63 6b 75 70 20 66 61 69 6c 65 64 3a 20  "backup failed: 
f820: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 73 71  ",.           sq
f830: 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44 65  lite3_errmsg(pDe
f840: 73 74 29 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  st), (char*)0);.
f850: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c        sqlite3_cl
f860: 6f 73 65 28 70 44 65 73 74 29 3b 0a 20 20 20 20  ose(pDest);.    
f870: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
f880: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 68  OR;.    }.    wh
f890: 69 6c 65 28 20 20 28 72 63 20 3d 20 73 71 6c 69  ile(  (rc = sqli
f8a0: 74 65 33 5f 62 61 63 6b 75 70 5f 73 74 65 70 28  te3_backup_step(
f8b0: 70 42 61 63 6b 75 70 2c 31 30 30 29 29 3d 3d 53  pBackup,100))==S
f8c0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 7d 0a 20 20 20  QLITE_OK ){}.   
f8d0: 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f   sqlite3_backup_
f8e0: 66 69 6e 69 73 68 28 70 42 61 63 6b 75 70 29 3b  finish(pBackup);
f8f0: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
f900: 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20  ITE_DONE ){.    
f910: 20 20 72 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20    rc = TCL_OK;. 
f920: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
f930: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
f940: 28 69 6e 74 65 72 70 2c 20 22 62 61 63 6b 75 70  (interp, "backup
f950: 20 66 61 69 6c 65 64 3a 20 22 2c 0a 20 20 20 20   failed: ",.    
f960: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65         sqlite3_e
f970: 72 72 6d 73 67 28 70 44 65 73 74 29 2c 20 28 63  rrmsg(pDest), (c
f980: 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 72  har*)0);.      r
f990: 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  c = TCL_ERROR;. 
f9a0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
f9b0: 5f 63 6c 6f 73 65 28 70 44 65 73 74 29 3b 0a 20  _close(pDest);. 
f9c0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
f9d0: 20 2f 2a 20 20 20 20 24 64 62 20 62 75 73 79 20   /*    $db busy 
f9e0: 3f 43 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a 0a  ?CALLBACK?.  **.
f9f0: 20 20 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20    ** Invoke the 
fa00: 67 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b 20 69  given callback i
fa10: 66 20 61 6e 20 53 51 4c 20 73 74 61 74 65 6d 65  f an SQL stateme
fa20: 6e 74 20 61 74 74 65 6d 70 74 73 20 74 6f 20 6f  nt attempts to o
fa30: 70 65 6e 0a 20 20 2a 2a 20 61 20 6c 6f 63 6b 65  pen.  ** a locke
fa40: 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  d database file.
fa50: 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f  .  */.  case DB_
fa60: 42 55 53 59 3a 20 7b 0a 20 20 20 20 69 66 28 20  BUSY: {.    if( 
fa70: 6f 62 6a 63 3e 33 20 29 7b 0a 20 20 20 20 20 20  objc>3 ){.      
fa80: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
fa90: 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76  (interp, 2, objv
faa0: 2c 20 22 43 41 4c 4c 42 41 43 4b 22 29 3b 0a 20  , "CALLBACK");. 
fab0: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
fac0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73 65  ERROR;.    }else
fad0: 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a   if( objc==2 ){.
fae0: 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a        if( pDb->z
faf0: 42 75 73 79 20 29 7b 0a 20 20 20 20 20 20 20 20  Busy ){.        
fb00: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
fb10: 28 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a 42  (interp, pDb->zB
fb20: 75 73 79 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  usy, (char*)0);.
fb30: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
fb40: 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  e{.      char *z
fb50: 42 75 73 79 3b 0a 20 20 20 20 20 20 69 6e 74 20  Busy;.      int 
fb60: 6c 65 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 70  len;.      if( p
fb70: 44 62 2d 3e 7a 42 75 73 79 20 29 7b 0a 20 20 20  Db->zBusy ){.   
fb80: 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44       Tcl_Free(pD
fb90: 62 2d 3e 7a 42 75 73 79 29 3b 0a 20 20 20 20 20  b->zBusy);.     
fba0: 20 7d 0a 20 20 20 20 20 20 7a 42 75 73 79 20 3d   }.      zBusy =
fbb0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
fbc0: 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26  omObj(objv[2], &
fbd0: 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20  len);.      if( 
fbe0: 7a 42 75 73 79 20 26 26 20 6c 65 6e 3e 30 20 29  zBusy && len>0 )
fbf0: 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a  {.        pDb->z
fc00: 42 75 73 79 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63  Busy = Tcl_Alloc
fc10: 28 20 6c 65 6e 20 2b 20 31 20 29 3b 0a 20 20 20  ( len + 1 );.   
fc20: 20 20 20 20 20 6d 65 6d 63 70 79 28 70 44 62 2d       memcpy(pDb-
fc30: 3e 7a 42 75 73 79 2c 20 7a 42 75 73 79 2c 20 6c  >zBusy, zBusy, l
fc40: 65 6e 2b 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c  en+1);.      }el
fc50: 73 65 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d  se{.        pDb-
fc60: 3e 7a 42 75 73 79 20 3d 20 30 3b 0a 20 20 20 20  >zBusy = 0;.    
fc70: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 44    }.      if( pD
fc80: 62 2d 3e 7a 42 75 73 79 20 29 7b 0a 20 20 20 20  b->zBusy ){.    
fc90: 20 20 20 20 70 44 62 2d 3e 69 6e 74 65 72 70 20      pDb->interp 
fca0: 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 20 20  = interp;.      
fcb0: 20 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 68    sqlite3_busy_h
fcc0: 61 6e 64 6c 65 72 28 70 44 62 2d 3e 64 62 2c 20  andler(pDb->db, 
fcd0: 44 62 42 75 73 79 48 61 6e 64 6c 65 72 2c 20 70  DbBusyHandler, p
fce0: 44 62 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  Db);.      }else
fcf0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
fd00: 33 5f 62 75 73 79 5f 68 61 6e 64 6c 65 72 28 70  3_busy_handler(p
fd10: 44 62 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20  Db->db, 0, 0);. 
fd20: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
fd30: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
fd40: 2a 20 20 20 20 20 24 64 62 20 63 61 63 68 65 20  *     $db cache 
fd50: 66 6c 75 73 68 0a 20 20 2a 2a 20 20 20 20 20 24  flush.  **     $
fd60: 64 62 20 63 61 63 68 65 20 73 69 7a 65 20 6e 0a  db cache size n.
fd70: 20 20 2a 2a 0a 20 20 2a 2a 20 46 6c 75 73 68 20    **.  ** Flush 
fd80: 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61  the prepared sta
fd90: 74 65 6d 65 6e 74 20 63 61 63 68 65 2c 20 6f 72  tement cache, or
fda0: 20 73 65 74 20 74 68 65 20 6d 61 78 69 6d 75 6d   set the maximum
fdb0: 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 2a 2a 20   number of.  ** 
fdc0: 63 61 63 68 65 64 20 73 74 61 74 65 6d 65 6e 74  cached statement
fdd0: 73 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  s..  */.  case D
fde0: 42 5f 43 41 43 48 45 3a 20 7b 0a 20 20 20 20 63  B_CACHE: {.    c
fdf0: 68 61 72 20 2a 73 75 62 43 6d 64 3b 0a 20 20 20  har *subCmd;.   
fe00: 20 69 6e 74 20 6e 3b 0a 0a 20 20 20 20 69 66 28   int n;..    if(
fe10: 20 6f 62 6a 63 3c 3d 32 20 29 7b 0a 20 20 20 20   objc<=2 ){.    
fe20: 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
fe30: 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
fe40: 6a 76 2c 20 22 63 61 63 68 65 20 6f 70 74 69 6f  jv, "cache optio
fe50: 6e 20 3f 61 72 67 3f 22 29 3b 0a 20 20 20 20 20  n ?arg?");.     
fe60: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
fe70: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 75 62  R;.    }.    sub
fe80: 43 6d 64 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  Cmd = Tcl_GetStr
fe90: 69 6e 67 46 72 6f 6d 4f 62 6a 28 20 6f 62 6a 76  ingFromObj( objv
fea0: 5b 32 5d 2c 20 30 20 29 3b 0a 20 20 20 20 69 66  [2], 0 );.    if
feb0: 28 20 2a 73 75 62 43 6d 64 3d 3d 27 66 27 20 26  ( *subCmd=='f' &
fec0: 26 20 73 74 72 63 6d 70 28 73 75 62 43 6d 64 2c  & strcmp(subCmd,
fed0: 22 66 6c 75 73 68 22 29 3d 3d 30 20 29 7b 0a 20  "flush")==0 ){. 
fee0: 20 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 33       if( objc!=3
fef0: 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f   ){.        Tcl_
ff00: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
ff10: 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 66  erp, 2, objv, "f
ff20: 6c 75 73 68 22 29 3b 0a 20 20 20 20 20 20 20 20  lush");.        
ff30: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
ff40: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
ff50: 20 20 20 20 20 20 20 66 6c 75 73 68 53 74 6d 74         flushStmt
ff60: 43 61 63 68 65 28 20 70 44 62 20 29 3b 0a 20 20  Cache( pDb );.  
ff70: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
ff80: 69 66 28 20 2a 73 75 62 43 6d 64 3d 3d 27 73 27  if( *subCmd=='s'
ff90: 20 26 26 20 73 74 72 63 6d 70 28 73 75 62 43 6d   && strcmp(subCm
ffa0: 64 2c 22 73 69 7a 65 22 29 3d 3d 30 20 29 7b 0a  d,"size")==0 ){.
ffb0: 20 20 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d        if( objc!=
ffc0: 34 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c  4 ){.        Tcl
ffd0: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
ffe0: 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22  terp, 2, objv, "
fff0: 73 69 7a 65 20 6e 22 29 3b 0a 20 20 20 20 20 20  size n");.      
10000 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
10010 4f 52 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  OR;.      }else{
10020 0a 20 20 20 20 20 20 20 20 69 66 28 20 54 43 4c  .        if( TCL
10030 5f 45 52 52 4f 52 3d 3d 54 63 6c 5f 47 65 74 49  _ERROR==Tcl_GetI
10040 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
10050 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 6e 29 20 29  , objv[3], &n) )
10060 7b 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f  {.          Tcl_
10070 41 70 70 65 6e 64 52 65 73 75 6c 74 28 20 69 6e  AppendResult( in
10080 74 65 72 70 2c 20 22 63 61 6e 6e 6f 74 20 63 6f  terp, "cannot co
10090 6e 76 65 72 74 20 5c 22 22 2c 0a 20 20 20 20 20  nvert \"",.     
100a0 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65            Tcl_Ge
100b0 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
100c0 62 6a 76 5b 33 5d 2c 30 29 2c 20 22 5c 22 20 74  bjv[3],0), "\" t
100d0 6f 20 69 6e 74 65 67 65 72 22 2c 20 28 63 68 61  o integer", (cha
100e0 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 20 20 20  r*)0);.         
100f0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
10100 52 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  R;.        }else
10110 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
10120 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  n<0 ){.         
10130 20 20 20 66 6c 75 73 68 53 74 6d 74 43 61 63 68     flushStmtCach
10140 65 28 20 70 44 62 20 29 3b 0a 20 20 20 20 20 20  e( pDb );.      
10150 20 20 20 20 20 20 6e 20 3d 20 30 3b 0a 20 20 20        n = 0;.   
10160 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
10170 20 6e 3e 4d 41 58 5f 50 52 45 50 41 52 45 44 5f   n>MAX_PREPARED_
10180 53 54 4d 54 53 20 29 7b 0a 20 20 20 20 20 20 20  STMTS ){.       
10190 20 20 20 20 20 6e 20 3d 20 4d 41 58 5f 50 52 45       n = MAX_PRE
101a0 50 41 52 45 44 5f 53 54 4d 54 53 3b 0a 20 20 20  PARED_STMTS;.   
101b0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
101c0 20 20 20 70 44 62 2d 3e 6d 61 78 53 74 6d 74 20     pDb->maxStmt 
101d0 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = n;.        }. 
101e0 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
101f0 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65  {.      Tcl_Appe
10200 6e 64 52 65 73 75 6c 74 28 20 69 6e 74 65 72 70  ndResult( interp
10210 2c 20 22 62 61 64 20 6f 70 74 69 6f 6e 20 5c 22  , "bad option \"
10220 22 2c 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c  ",.          Tcl
10230 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
10240 6a 28 6f 62 6a 76 5b 32 5d 2c 30 29 2c 20 22 5c  j(objv[2],0), "\
10250 22 3a 20 6d 75 73 74 20 62 65 20 66 6c 75 73 68  ": must be flush
10260 20 6f 72 20 73 69 7a 65 22 2c 0a 20 20 20 20 20   or size",.     
10270 20 20 20 20 20 28 63 68 61 72 2a 29 30 29 3b 0a       (char*)0);.
10280 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
10290 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
102a0 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
102b0 2f 2a 20 20 20 20 20 24 64 62 20 63 68 61 6e 67  /*     $db chang
102c0 65 73 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74  es.  **.  ** Ret
102d0 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
102e0 66 20 72 6f 77 73 20 74 68 61 74 20 77 65 72 65  f rows that were
102f0 20 6d 6f 64 69 66 69 65 64 2c 20 69 6e 73 65 72   modified, inser
10300 74 65 64 2c 20 6f 72 20 64 65 6c 65 74 65 64 20  ted, or deleted 
10310 62 79 0a 20 20 2a 2a 20 74 68 65 20 6d 6f 73 74  by.  ** the most
10320 20 72 65 63 65 6e 74 20 49 4e 53 45 52 54 2c 20   recent INSERT, 
10330 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45  UPDATE or DELETE
10340 20 73 74 61 74 65 6d 65 6e 74 2c 20 6e 6f 74 20   statement, not 
10350 69 6e 63 6c 75 64 69 6e 67 0a 20 20 2a 2a 20 61  including.  ** a
10360 6e 79 20 63 68 61 6e 67 65 73 20 6d 61 64 65 20  ny changes made 
10370 62 79 20 74 72 69 67 67 65 72 20 70 72 6f 67 72  by trigger progr
10380 61 6d 73 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  ams..  */.  case
10390 20 44 42 5f 43 48 41 4e 47 45 53 3a 20 7b 0a 20   DB_CHANGES: {. 
103a0 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 73     Tcl_Obj *pRes
103b0 75 6c 74 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a  ult;.    if( obj
103c0 63 21 3d 32 20 29 7b 0a 20 20 20 20 20 20 54 63  c!=2 ){.      Tc
103d0 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
103e0 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
103f0 22 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  "");.      retur
10400 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
10410 20 7d 0a 20 20 20 20 70 52 65 73 75 6c 74 20 3d   }.    pResult =
10420 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c   Tcl_GetObjResul
10430 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54  t(interp);.    T
10440 63 6c 5f 53 65 74 49 6e 74 4f 62 6a 28 70 52 65  cl_SetIntObj(pRe
10450 73 75 6c 74 2c 20 73 71 6c 69 74 65 33 5f 63 68  sult, sqlite3_ch
10460 61 6e 67 65 73 28 70 44 62 2d 3e 64 62 29 29 3b  anges(pDb->db));
10470 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
10480 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 63 6c 6f  .  /*    $db clo
10490 73 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 68 75  se.  **.  ** Shu
104a0 74 64 6f 77 6e 20 74 68 65 20 64 61 74 61 62 61  tdown the databa
104b0 73 65 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  se.  */.  case D
104c0 42 5f 43 4c 4f 53 45 3a 20 7b 0a 20 20 20 20 54  B_CLOSE: {.    T
104d0 63 6c 5f 44 65 6c 65 74 65 43 6f 6d 6d 61 6e 64  cl_DeleteCommand
104e0 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
104f0 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
10500 6a 76 5b 30 5d 2c 20 30 29 29 3b 0a 20 20 20 20  jv[0], 0));.    
10510 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
10520 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20 63 6f  .  **     $db co
10530 6c 6c 61 74 65 20 4e 41 4d 45 20 53 43 52 49 50  llate NAME SCRIP
10540 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 72 65 61  T.  **.  ** Crea
10550 74 65 20 61 20 6e 65 77 20 53 51 4c 20 63 6f 6c  te a new SQL col
10560 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20  lation function 
10570 63 61 6c 6c 65 64 20 4e 41 4d 45 2e 20 20 57 68  called NAME.  Wh
10580 65 6e 65 76 65 72 0a 20 20 2a 2a 20 74 68 61 74  enever.  ** that
10590 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
105a0 6c 65 64 2c 20 69 6e 76 6f 6b 65 20 53 43 52 49  led, invoke SCRI
105b0 50 54 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74  PT to evaluate t
105c0 68 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a  he function..  *
105d0 2f 0a 20 20 63 61 73 65 20 44 42 5f 43 4f 4c 4c  /.  case DB_COLL
105e0 41 54 45 3a 20 7b 0a 20 20 20 20 53 71 6c 43 6f  ATE: {.    SqlCo
105f0 6c 6c 61 74 65 20 2a 70 43 6f 6c 6c 61 74 65 3b  llate *pCollate;
10600 0a 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65  .    char *zName
10610 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 63 72  ;.    char *zScr
10620 69 70 74 3b 0a 20 20 20 20 69 6e 74 20 6e 53 63  ipt;.    int nSc
10630 72 69 70 74 3b 0a 20 20 20 20 69 66 28 20 6f 62  ript;.    if( ob
10640 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 20 20 54  jc!=4 ){.      T
10650 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
10660 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c  interp, 2, objv,
10670 20 22 4e 41 4d 45 20 53 43 52 49 50 54 22 29 3b   "NAME SCRIPT");
10680 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
10690 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
106a0 20 20 20 7a 4e 61 6d 65 20 3d 20 54 63 6c 5f 47     zName = Tcl_G
106b0 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
106c0 6f 62 6a 76 5b 32 5d 2c 20 30 29 3b 0a 20 20 20  objv[2], 0);.   
106d0 20 7a 53 63 72 69 70 74 20 3d 20 54 63 6c 5f 47   zScript = Tcl_G
106e0 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
106f0 6f 62 6a 76 5b 33 5d 2c 20 26 6e 53 63 72 69 70  objv[3], &nScrip
10700 74 29 3b 0a 20 20 20 20 70 43 6f 6c 6c 61 74 65  t);.    pCollate
10710 20 3d 20 28 53 71 6c 43 6f 6c 6c 61 74 65 2a 29   = (SqlCollate*)
10720 54 63 6c 5f 41 6c 6c 6f 63 28 20 73 69 7a 65 6f  Tcl_Alloc( sizeo
10730 66 28 2a 70 43 6f 6c 6c 61 74 65 29 20 2b 20 6e  f(*pCollate) + n
10740 53 63 72 69 70 74 20 2b 20 31 20 29 3b 0a 20 20  Script + 1 );.  
10750 20 20 69 66 28 20 70 43 6f 6c 6c 61 74 65 3d 3d    if( pCollate==
10760 30 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  0 ) return TCL_E
10770 52 52 4f 52 3b 0a 20 20 20 20 70 43 6f 6c 6c 61  RROR;.    pColla
10780 74 65 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74  te->interp = int
10790 65 72 70 3b 0a 20 20 20 20 70 43 6f 6c 6c 61 74  erp;.    pCollat
107a0 65 2d 3e 70 4e 65 78 74 20 3d 20 70 44 62 2d 3e  e->pNext = pDb->
107b0 70 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 70 43  pCollate;.    pC
107c0 6f 6c 6c 61 74 65 2d 3e 7a 53 63 72 69 70 74 20  ollate->zScript 
107d0 3d 20 28 63 68 61 72 2a 29 26 70 43 6f 6c 6c 61  = (char*)&pColla
107e0 74 65 5b 31 5d 3b 0a 20 20 20 20 70 44 62 2d 3e  te[1];.    pDb->
107f0 70 43 6f 6c 6c 61 74 65 20 3d 20 70 43 6f 6c 6c  pCollate = pColl
10800 61 74 65 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  ate;.    memcpy(
10810 70 43 6f 6c 6c 61 74 65 2d 3e 7a 53 63 72 69 70  pCollate->zScrip
10820 74 2c 20 7a 53 63 72 69 70 74 2c 20 6e 53 63 72  t, zScript, nScr
10830 69 70 74 2b 31 29 3b 0a 20 20 20 20 69 66 28 20  ipt+1);.    if( 
10840 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63  sqlite3_create_c
10850 6f 6c 6c 61 74 69 6f 6e 28 70 44 62 2d 3e 64 62  ollation(pDb->db
10860 2c 20 7a 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f  , zName, SQLITE_
10870 55 54 46 38 2c 0a 20 20 20 20 20 20 20 20 70 43  UTF8,.        pC
10880 6f 6c 6c 61 74 65 2c 20 74 63 6c 53 71 6c 43 6f  ollate, tclSqlCo
10890 6c 6c 61 74 65 29 20 29 7b 0a 20 20 20 20 20 20  llate) ){.      
108a0 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
108b0 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 73 71  terp, (char *)sq
108c0 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62  lite3_errmsg(pDb
108d0 2d 3e 64 62 29 2c 20 54 43 4c 5f 56 4f 4c 41 54  ->db), TCL_VOLAT
108e0 49 4c 45 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ILE);.      retu
108f0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
10900 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20    }.    break;. 
10910 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20   }..  /*.  **   
10920 20 20 24 64 62 20 63 6f 6c 6c 61 74 69 6f 6e 5f    $db collation_
10930 6e 65 65 64 65 64 20 53 43 52 49 50 54 0a 20 20  needed SCRIPT.  
10940 2a 2a 0a 20 20 2a 2a 20 43 72 65 61 74 65 20 61  **.  ** Create a
10950 20 6e 65 77 20 53 51 4c 20 63 6f 6c 6c 61 74 69   new SQL collati
10960 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c  on function call
10970 65 64 20 4e 41 4d 45 2e 20 20 57 68 65 6e 65 76  ed NAME.  Whenev
10980 65 72 0a 20 20 2a 2a 20 74 68 61 74 20 66 75 6e  er.  ** that fun
10990 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
109a0 20 69 6e 76 6f 6b 65 20 53 43 52 49 50 54 20 74   invoke SCRIPT t
109b0 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65 20 66  o evaluate the f
109c0 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20  unction..  */.  
109d0 63 61 73 65 20 44 42 5f 43 4f 4c 4c 41 54 49 4f  case DB_COLLATIO
109e0 4e 5f 4e 45 45 44 45 44 3a 20 7b 0a 20 20 20 20  N_NEEDED: {.    
109f0 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20  if( objc!=3 ){. 
10a00 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
10a10 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
10a20 20 6f 62 6a 76 2c 20 22 53 43 52 49 50 54 22 29   objv, "SCRIPT")
10a30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
10a40 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
10a50 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 43 6f      if( pDb->pCo
10a60 6c 6c 61 74 65 4e 65 65 64 65 64 20 29 7b 0a 20  llateNeeded ){. 
10a70 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66       Tcl_DecrRef
10a80 43 6f 75 6e 74 28 70 44 62 2d 3e 70 43 6f 6c 6c  Count(pDb->pColl
10a90 61 74 65 4e 65 65 64 65 64 29 3b 0a 20 20 20 20  ateNeeded);.    
10aa0 7d 0a 20 20 20 20 70 44 62 2d 3e 70 43 6f 6c 6c  }.    pDb->pColl
10ab0 61 74 65 4e 65 65 64 65 64 20 3d 20 54 63 6c 5f  ateNeeded = Tcl_
10ac0 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 6f 62 6a  DuplicateObj(obj
10ad0 76 5b 32 5d 29 3b 0a 20 20 20 20 54 63 6c 5f 49  v[2]);.    Tcl_I
10ae0 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 44 62 2d  ncrRefCount(pDb-
10af0 3e 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64 29  >pCollateNeeded)
10b00 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f  ;.    sqlite3_co
10b10 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64 28 70  llation_needed(p
10b20 44 62 2d 3e 64 62 2c 20 70 44 62 2c 20 74 63 6c  Db->db, pDb, tcl
10b30 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64 29 3b 0a  CollateNeeded);.
10b40 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
10b50 20 20 2f 2a 20 20 20 20 24 64 62 20 63 6f 6d 6d    /*    $db comm
10b60 69 74 5f 68 6f 6f 6b 20 3f 43 41 4c 4c 42 41 43  it_hook ?CALLBAC
10b70 4b 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 76  K?.  **.  ** Inv
10b80 6f 6b 65 20 74 68 65 20 67 69 76 65 6e 20 63 61  oke the given ca
10b90 6c 6c 62 61 63 6b 20 6a 75 73 74 20 62 65 66 6f  llback just befo
10ba0 72 65 20 63 6f 6d 6d 69 74 74 69 6e 67 20 65 76  re committing ev
10bb0 65 72 79 20 53 51 4c 20 74 72 61 6e 73 61 63 74  ery SQL transact
10bc0 69 6f 6e 2e 0a 20 20 2a 2a 20 49 66 20 74 68 65  ion..  ** If the
10bd0 20 63 61 6c 6c 62 61 63 6b 20 74 68 72 6f 77 73   callback throws
10be0 20 61 6e 20 65 78 63 65 70 74 69 6f 6e 20 6f 72   an exception or
10bf0 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72   returns non-zer
10c00 6f 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 2a 2a  o, then the.  **
10c10 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
10c20 61 62 6f 72 74 65 64 2e 20 20 49 66 20 43 41 4c  aborted.  If CAL
10c30 4c 42 41 43 4b 20 69 73 20 61 6e 20 65 6d 70 74  LBACK is an empt
10c40 79 20 73 74 72 69 6e 67 2c 20 74 68 65 20 63 61  y string, the ca
10c50 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 69 73 20 64  llback.  ** is d
10c60 69 73 61 62 6c 65 64 2e 0a 20 20 2a 2f 0a 20 20  isabled..  */.  
10c70 63 61 73 65 20 44 42 5f 43 4f 4d 4d 49 54 5f 48  case DB_COMMIT_H
10c80 4f 4f 4b 3a 20 7b 0a 20 20 20 20 69 66 28 20 6f  OOK: {.    if( o
10c90 62 6a 63 3e 33 20 29 7b 0a 20 20 20 20 20 20 54  bjc>3 ){.      T
10ca0 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
10cb0 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c  interp, 2, objv,
10cc0 20 22 3f 43 41 4c 4c 42 41 43 4b 3f 22 29 3b 0a   "?CALLBACK?");.
10cd0 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
10ce0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73  _ERROR;.    }els
10cf0 65 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b  e if( objc==2 ){
10d00 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e  .      if( pDb->
10d10 7a 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 20  zCommit ){.     
10d20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
10d30 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 44 62 2d  ult(interp, pDb-
10d40 3e 7a 43 6f 6d 6d 69 74 2c 20 28 63 68 61 72 2a  >zCommit, (char*
10d50 29 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  )0);.      }.   
10d60 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 6f   }else{.      co
10d70 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6d 6d 69  nst char *zCommi
10d80 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e  t;.      int len
10d90 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d  ;.      if( pDb-
10da0 3e 7a 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20  >zCommit ){.    
10db0 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62      Tcl_Free(pDb
10dc0 2d 3e 7a 43 6f 6d 6d 69 74 29 3b 0a 20 20 20 20  ->zCommit);.    
10dd0 20 20 7d 0a 20 20 20 20 20 20 7a 43 6f 6d 6d 69    }.      zCommi
10de0 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  t = Tcl_GetStrin
10df0 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d  gFromObj(objv[2]
10e00 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69  , &len);.      i
10e10 66 28 20 7a 43 6f 6d 6d 69 74 20 26 26 20 6c 65  f( zCommit && le
10e20 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  n>0 ){.        p
10e30 44 62 2d 3e 7a 43 6f 6d 6d 69 74 20 3d 20 54 63  Db->zCommit = Tc
10e40 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20 31  l_Alloc( len + 1
10e50 20 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63   );.        memc
10e60 70 79 28 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 2c  py(pDb->zCommit,
10e70 20 7a 43 6f 6d 6d 69 74 2c 20 6c 65 6e 2b 31 29   zCommit, len+1)
10e80 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
10e90 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 43 6f 6d         pDb->zCom
10ea0 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  mit = 0;.      }
10eb0 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e  .      if( pDb->
10ec0 7a 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 20  zCommit ){.     
10ed0 20 20 20 70 44 62 2d 3e 69 6e 74 65 72 70 20 3d     pDb->interp =
10ee0 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 20 20 20   interp;.       
10ef0 20 73 71 6c 69 74 65 33 5f 63 6f 6d 6d 69 74 5f   sqlite3_commit_
10f00 68 6f 6f 6b 28 70 44 62 2d 3e 64 62 2c 20 44 62  hook(pDb->db, Db
10f10 43 6f 6d 6d 69 74 48 61 6e 64 6c 65 72 2c 20 70  CommitHandler, p
10f20 44 62 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  Db);.      }else
10f30 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
10f40 33 5f 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 28 70 44  3_commit_hook(pD
10f50 62 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20  b->db, 0, 0);.  
10f60 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
10f70 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
10f80 20 20 20 20 24 64 62 20 63 6f 6d 70 6c 65 74 65      $db complete
10f90 20 53 51 4c 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52   SQL.  **.  ** R
10fa0 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 53 51  eturn TRUE if SQ
10fb0 4c 20 69 73 20 61 20 63 6f 6d 70 6c 65 74 65 20  L is a complete 
10fc0 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  SQL statement.  
10fd0 52 65 74 75 72 6e 20 46 41 4c 53 45 20 69 66 0a  Return FALSE if.
10fe0 20 20 2a 2a 20 61 64 64 69 74 69 6f 6e 61 6c 20    ** additional 
10ff0 6c 69 6e 65 73 20 6f 66 20 69 6e 70 75 74 20 61  lines of input a
11000 72 65 20 6e 65 65 64 65 64 2e 20 20 54 68 69 73  re needed.  This
11010 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 74   is similar to t
11020 68 65 0a 20 20 2a 2a 20 62 75 69 6c 74 2d 69 6e  he.  ** built-in
11030 20 22 69 6e 66 6f 20 63 6f 6d 70 6c 65 74 65 22   "info complete"
11040 20 63 6f 6d 6d 61 6e 64 20 6f 66 20 54 63 6c 2e   command of Tcl.
11050 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f  .  */.  case DB_
11060 43 4f 4d 50 4c 45 54 45 3a 20 7b 0a 23 69 66 6e  COMPLETE: {.#ifn
11070 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
11080 43 4f 4d 50 4c 45 54 45 0a 20 20 20 20 54 63 6c  COMPLETE.    Tcl
11090 5f 4f 62 6a 20 2a 70 52 65 73 75 6c 74 3b 0a 20  _Obj *pResult;. 
110a0 20 20 20 69 6e 74 20 69 73 43 6f 6d 70 6c 65 74     int isComplet
110b0 65 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21  e;.    if( objc!
110c0 3d 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  =3 ){.      Tcl_
110d0 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
110e0 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 53  erp, 2, objv, "S
110f0 51 4c 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  QL");.      retu
11100 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
11110 20 20 7d 0a 20 20 20 20 69 73 43 6f 6d 70 6c 65    }.    isComple
11120 74 65 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6d  te = sqlite3_com
11130 70 6c 65 74 65 28 20 54 63 6c 5f 47 65 74 53 74  plete( Tcl_GetSt
11140 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
11150 5b 32 5d 2c 20 30 29 20 29 3b 0a 20 20 20 20 70  [2], 0) );.    p
11160 52 65 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65 74  Result = Tcl_Get
11170 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
11180 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 42 6f  );.    Tcl_SetBo
11190 6f 6c 65 61 6e 4f 62 6a 28 70 52 65 73 75 6c 74  oleanObj(pResult
111a0 2c 20 69 73 43 6f 6d 70 6c 65 74 65 29 3b 0a 23  , isComplete);.#
111b0 65 6e 64 69 66 0a 20 20 20 20 62 72 65 61 6b 3b  endif.    break;
111c0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64  .  }..  /*    $d
111d0 62 20 63 6f 70 79 20 63 6f 6e 66 6c 69 63 74 2d  b copy conflict-
111e0 61 6c 67 6f 72 69 74 68 6d 20 74 61 62 6c 65 20  algorithm table 
111f0 66 69 6c 65 6e 61 6d 65 20 3f 53 45 50 41 52 41  filename ?SEPARA
11200 54 4f 52 3f 20 3f 4e 55 4c 4c 49 4e 44 49 43 41  TOR? ?NULLINDICA
11210 54 4f 52 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43  TOR?.  **.  ** C
11220 6f 70 79 20 64 61 74 61 20 69 6e 74 6f 20 74 61  opy data into ta
11230 62 6c 65 20 66 72 6f 6d 20 66 69 6c 65 6e 61 6d  ble from filenam
11240 65 2c 20 6f 70 74 69 6f 6e 61 6c 6c 79 20 75 73  e, optionally us
11250 69 6e 67 20 53 45 50 41 52 41 54 4f 52 0a 20 20  ing SEPARATOR.  
11260 2a 2a 20 61 73 20 63 6f 6c 75 6d 6e 20 73 65 70  ** as column sep
11270 61 72 61 74 6f 72 73 2e 20 20 49 66 20 61 20 63  arators.  If a c
11280 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 73 20 61  olumn contains a
11290 20 6e 75 6c 6c 20 73 74 72 69 6e 67 2c 20 6f 72   null string, or
112a0 20 74 68 65 0a 20 20 2a 2a 20 76 61 6c 75 65 20   the.  ** value 
112b0 6f 66 20 4e 55 4c 4c 49 4e 44 49 43 41 54 4f 52  of NULLINDICATOR
112c0 2c 20 61 20 4e 55 4c 4c 20 69 73 20 69 6e 73 65  , a NULL is inse
112d0 72 74 65 64 20 66 6f 72 20 74 68 65 20 63 6f 6c  rted for the col
112e0 75 6d 6e 2e 0a 20 20 2a 2a 20 63 6f 6e 66 6c 69  umn..  ** confli
112f0 63 74 2d 61 6c 67 6f 72 69 74 68 6d 20 69 73 20  ct-algorithm is 
11300 6f 6e 65 20 6f 66 20 74 68 65 20 73 71 6c 69 74  one of the sqlit
11310 65 20 63 6f 6e 66 6c 69 63 74 20 61 6c 67 6f 72  e conflict algor
11320 69 74 68 6d 73 3a 0a 20 20 2a 2a 20 20 20 20 72  ithms:.  **    r
11330 6f 6c 6c 62 61 63 6b 2c 20 61 62 6f 72 74 2c 20  ollback, abort, 
11340 66 61 69 6c 2c 20 69 67 6e 6f 72 65 2c 20 72 65  fail, ignore, re
11350 70 6c 61 63 65 0a 20 20 2a 2a 20 4f 6e 20 73 75  place.  ** On su
11360 63 63 65 73 73 2c 20 72 65 74 75 72 6e 20 74 68  ccess, return th
11370 65 20 6e 75 6d 62 65 72 20 6f 66 20 6c 69 6e 65  e number of line
11380 73 20 70 72 6f 63 65 73 73 65 64 2c 20 6e 6f 74  s processed, not
11390 20 6e 65 63 65 73 73 61 72 69 6c 79 20 73 61 6d   necessarily sam
113a0 65 0a 20 20 2a 2a 20 61 73 20 27 64 62 20 63 68  e.  ** as 'db ch
113b0 61 6e 67 65 73 27 20 64 75 65 20 74 6f 20 63 6f  anges' due to co
113c0 6e 66 6c 69 63 74 2d 61 6c 67 6f 72 69 74 68 6d  nflict-algorithm
113d0 20 73 65 6c 65 63 74 65 64 2e 0a 20 20 2a 2a 0a   selected..  **.
113e0 20 20 2a 2a 20 54 68 69 73 20 63 6f 64 65 20 69    ** This code i
113f0 73 20 62 61 73 69 63 61 6c 6c 79 20 61 6e 20 69  s basically an i
11400 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2f 65 6e  mplementation/en
11410 68 61 6e 63 65 6d 65 6e 74 20 6f 66 0a 20 20 2a  hancement of.  *
11420 2a 20 74 68 65 20 73 71 6c 69 74 65 33 20 73 68  * the sqlite3 sh
11430 65 6c 6c 2e 63 20 22 2e 69 6d 70 6f 72 74 22 20  ell.c ".import" 
11440 63 6f 6d 6d 61 6e 64 2e 0a 20 20 2a 2a 0a 20 20  command..  **.  
11450 2a 2a 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ** This command 
11460 75 73 61 67 65 20 69 73 20 65 71 75 69 76 61 6c  usage is equival
11470 65 6e 74 20 74 6f 20 74 68 65 20 73 71 6c 69 74  ent to the sqlit
11480 65 32 2e 78 20 43 4f 50 59 20 73 74 61 74 65 6d  e2.x COPY statem
11490 65 6e 74 2c 0a 20 20 2a 2a 20 77 68 69 63 68 20  ent,.  ** which 
114a0 69 6d 70 6f 72 74 73 20 66 69 6c 65 20 64 61 74  imports file dat
114b0 61 20 69 6e 74 6f 20 61 20 74 61 62 6c 65 20 75  a into a table u
114c0 73 69 6e 67 20 74 68 65 20 50 6f 73 74 67 72 65  sing the Postgre
114d0 53 51 4c 20 43 4f 50 59 20 66 69 6c 65 20 66 6f  SQL COPY file fo
114e0 72 6d 61 74 3a 0a 20 20 2a 2a 20 20 20 24 64 62  rmat:.  **   $db
114f0 20 63 6f 70 79 20 24 63 6f 6e 66 6c 69 74 5f 61   copy $conflit_a
11500 6c 67 6f 20 24 74 61 62 6c 65 5f 6e 61 6d 65 20  lgo $table_name 
11510 24 66 69 6c 65 6e 61 6d 65 20 5c 74 20 5c 5c 4e  $filename \t \\N
11520 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f  .  */.  case DB_
11530 43 4f 50 59 3a 20 7b 0a 20 20 20 20 63 68 61 72  COPY: {.    char
11540 20 2a 7a 54 61 62 6c 65 3b 20 20 20 20 20 20 20   *zTable;       
11550 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 73 65 72          /* Inser
11560 74 20 64 61 74 61 20 69 6e 74 6f 20 74 68 69 73  t data into this
11570 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 63 68   table */.    ch
11580 61 72 20 2a 7a 46 69 6c 65 3b 20 20 20 20 20 20  ar *zFile;      
11590 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
115a0 20 66 69 6c 65 20 66 72 6f 6d 20 77 68 69 63 68   file from which
115b0 20 74 6f 20 65 78 74 72 61 63 74 20 64 61 74 61   to extract data
115c0 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 43   */.    char *zC
115d0 6f 6e 66 6c 69 63 74 3b 20 20 20 20 20 20 20 20  onflict;        
115e0 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 66 6c      /* The confl
115f0 69 63 74 20 61 6c 67 6f 72 69 74 68 6d 20 74 6f  ict algorithm to
11600 20 75 73 65 20 2a 2f 0a 20 20 20 20 73 71 6c 69   use */.    sqli
11610 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
11620 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 74 61          /* A sta
11630 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 69 6e  tement */.    in
11640 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20 20  t nCol;         
11650 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
11660 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
11670 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20  n the table */. 
11680 20 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20 20     int nByte;   
11690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
116a0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
116b0 73 20 69 6e 20 61 6e 20 53 51 4c 20 73 74 72 69  s in an SQL stri
116c0 6e 67 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 2c  ng */.    int i,
116d0 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   j;             
116e0 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
116f0 75 6e 74 65 72 73 20 2a 2f 0a 20 20 20 20 69 6e  unters */.    in
11700 74 20 6e 53 65 70 3b 20 20 20 20 20 20 20 20 20  t nSep;         
11710 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
11720 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
11730 7a 53 65 70 5b 5d 20 2a 2f 0a 20 20 20 20 69 6e  zSep[] */.    in
11740 74 20 6e 4e 75 6c 6c 3b 20 20 20 20 20 20 20 20  t nNull;        
11750 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
11760 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
11770 7a 4e 75 6c 6c 5b 5d 20 2a 2f 0a 20 20 20 20 63  zNull[] */.    c
11780 68 61 72 20 2a 7a 53 71 6c 3b 20 20 20 20 20 20  har *zSql;      
11790 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e             /* An
117a0 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 2a   SQL statement *
117b0 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 4c 69 6e  /.    char *zLin
117c0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
117d0 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 6c 69    /* A single li
117e0 6e 65 20 6f 66 20 69 6e 70 75 74 20 66 72 6f 6d  ne of input from
117f0 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20   the file */.   
11800 20 63 68 61 72 20 2a 2a 61 7a 43 6f 6c 3b 20 20   char **azCol;  
11810 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11820 7a 4c 69 6e 65 5b 5d 20 62 72 6f 6b 65 6e 20 75  zLine[] broken u
11830 70 20 69 6e 74 6f 20 63 6f 6c 75 6d 6e 73 20 2a  p into columns *
11840 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  /.    const char
11850 20 2a 7a 43 6f 6d 6d 69 74 3b 20 20 20 20 20 20   *zCommit;      
11860 20 20 2f 2a 20 48 6f 77 20 74 6f 20 63 6f 6d 6d    /* How to comm
11870 69 74 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20  it changes */.  
11880 20 20 46 49 4c 45 20 2a 69 6e 3b 20 20 20 20 20    FILE *in;     
11890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
118a0 20 54 68 65 20 69 6e 70 75 74 20 66 69 6c 65 20   The input file 
118b0 2a 2f 0a 20 20 20 20 69 6e 74 20 6c 69 6e 65 6e  */.    int linen
118c0 6f 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  o = 0;          
118d0 20 20 20 2f 2a 20 4c 69 6e 65 20 6e 75 6d 62 65     /* Line numbe
118e0 72 20 6f 66 20 69 6e 70 75 74 20 66 69 6c 65 20  r of input file 
118f0 2a 2f 0a 20 20 20 20 63 68 61 72 20 7a 4c 69 6e  */.    char zLin
11900 65 4e 75 6d 5b 38 30 5d 3b 20 20 20 20 20 20 20  eNum[80];       
11910 20 20 20 2f 2a 20 4c 69 6e 65 20 6e 75 6d 62 65     /* Line numbe
11920 72 20 70 72 69 6e 74 20 62 75 66 66 65 72 20 2a  r print buffer *
11930 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  /.    Tcl_Obj *p
11940 52 65 73 75 6c 74 3b 20 20 20 20 20 20 20 20 20  Result;         
11950 20 20 2f 2a 20 69 6e 74 65 72 70 20 72 65 73 75    /* interp resu
11960 6c 74 20 2a 2f 0a 0a 20 20 20 20 63 6f 6e 73 74  lt */..    const
11970 20 63 68 61 72 20 2a 7a 53 65 70 3b 0a 20 20 20   char *zSep;.   
11980 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 75   const char *zNu
11990 6c 6c 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63  ll;.    if( objc
119a0 3c 35 20 7c 7c 20 6f 62 6a 63 3e 37 20 29 7b 0a  <5 || objc>7 ){.
119b0 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
119c0 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
119d0 2c 20 6f 62 6a 76 2c 0a 20 20 20 20 20 20 20 20  , objv,.        
119e0 20 22 43 4f 4e 46 4c 49 43 54 2d 41 4c 47 4f 52   "CONFLICT-ALGOR
119f0 49 54 48 4d 20 54 41 42 4c 45 20 46 49 4c 45 4e  ITHM TABLE FILEN
11a00 41 4d 45 20 3f 53 45 50 41 52 41 54 4f 52 3f 20  AME ?SEPARATOR? 
11a10 3f 4e 55 4c 4c 49 4e 44 49 43 41 54 4f 52 3f 22  ?NULLINDICATOR?"
11a20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
11a30 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
11a40 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 3d 36  .    if( objc>=6
11a50 20 29 7b 0a 20 20 20 20 20 20 7a 53 65 70 20 3d   ){.      zSep =
11a60 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
11a70 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 35 5d 2c 20 30  omObj(objv[5], 0
11a80 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
11a90 20 20 20 20 7a 53 65 70 20 3d 20 22 5c 74 22 3b      zSep = "\t";
11aa0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f  .    }.    if( o
11ab0 62 6a 63 3e 3d 37 20 29 7b 0a 20 20 20 20 20 20  bjc>=7 ){.      
11ac0 7a 4e 75 6c 6c 20 3d 20 54 63 6c 5f 47 65 74 53  zNull = Tcl_GetS
11ad0 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
11ae0 76 5b 36 5d 2c 20 30 29 3b 0a 20 20 20 20 7d 65  v[6], 0);.    }e
11af0 6c 73 65 7b 0a 20 20 20 20 20 20 7a 4e 75 6c 6c  lse{.      zNull
11b00 20 3d 20 22 22 3b 0a 20 20 20 20 7d 0a 20 20 20   = "";.    }.   
11b10 20 7a 43 6f 6e 66 6c 69 63 74 20 3d 20 54 63 6c   zConflict = Tcl
11b20 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
11b30 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30 29 3b 0a 20  j(objv[2], 0);. 
11b40 20 20 20 7a 54 61 62 6c 65 20 3d 20 54 63 6c 5f     zTable = Tcl_
11b50 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
11b60 28 6f 62 6a 76 5b 33 5d 2c 20 30 29 3b 0a 20 20  (objv[3], 0);.  
11b70 20 20 7a 46 69 6c 65 20 3d 20 54 63 6c 5f 47 65    zFile = Tcl_Ge
11b80 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
11b90 62 6a 76 5b 34 5d 2c 20 30 29 3b 0a 20 20 20 20  bjv[4], 0);.    
11ba0 6e 53 65 70 20 3d 20 73 74 72 6c 65 6e 33 30 28  nSep = strlen30(
11bb0 7a 53 65 70 29 3b 0a 20 20 20 20 6e 4e 75 6c 6c  zSep);.    nNull
11bc0 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 4e 75 6c   = strlen30(zNul
11bd0 6c 29 3b 0a 20 20 20 20 69 66 28 20 6e 53 65 70  l);.    if( nSep
11be0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  ==0 ){.      Tcl
11bf0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
11c00 74 65 72 70 2c 22 45 72 72 6f 72 3a 20 6e 6f 6e  terp,"Error: non
11c10 2d 6e 75 6c 6c 20 73 65 70 61 72 61 74 6f 72 20  -null separator 
11c20 72 65 71 75 69 72 65 64 20 66 6f 72 20 63 6f 70  required for cop
11c30 79 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  y",.            
11c40 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
11c50 2a 29 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75  *)0);.      retu
11c60 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
11c70 20 20 7d 0a 20 20 20 20 69 66 28 73 74 72 63 6d    }.    if(strcm
11c80 70 28 7a 43 6f 6e 66 6c 69 63 74 2c 20 22 72 6f  p(zConflict, "ro
11c90 6c 6c 62 61 63 6b 22 29 20 21 3d 20 30 20 26 26  llback") != 0 &&
11ca0 0a 20 20 20 20 20 20 20 73 74 72 63 6d 70 28 7a  .       strcmp(z
11cb0 43 6f 6e 66 6c 69 63 74 2c 20 22 61 62 6f 72 74  Conflict, "abort
11cc0 22 20 20 20 29 20 21 3d 20 30 20 26 26 0a 20 20  "   ) != 0 &&.  
11cd0 20 20 20 20 20 73 74 72 63 6d 70 28 7a 43 6f 6e       strcmp(zCon
11ce0 66 6c 69 63 74 2c 20 22 66 61 69 6c 22 20 20 20  flict, "fail"   
11cf0 20 29 20 21 3d 20 30 20 26 26 0a 20 20 20 20 20   ) != 0 &&.     
11d00 20 20 73 74 72 63 6d 70 28 7a 43 6f 6e 66 6c 69    strcmp(zConfli
11d10 63 74 2c 20 22 69 67 6e 6f 72 65 22 20 20 29 20  ct, "ignore"  ) 
11d20 21 3d 20 30 20 26 26 0a 20 20 20 20 20 20 20 73  != 0 &&.       s
11d30 74 72 63 6d 70 28 7a 43 6f 6e 66 6c 69 63 74 2c  trcmp(zConflict,
11d40 20 22 72 65 70 6c 61 63 65 22 20 29 20 21 3d 20   "replace" ) != 
11d50 30 20 29 20 7b 0a 20 20 20 20 20 20 54 63 6c 5f  0 ) {.      Tcl_
11d60 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
11d70 65 72 70 2c 20 22 45 72 72 6f 72 3a 20 5c 22 22  erp, "Error: \""
11d80 2c 20 7a 43 6f 6e 66 6c 69 63 74 2c 0a 20 20 20  , zConflict,.   
11d90 20 20 20 20 20 20 20 20 20 22 5c 22 2c 20 63 6f           "\", co
11da0 6e 66 6c 69 63 74 2d 61 6c 67 6f 72 69 74 68 6d  nflict-algorithm
11db0 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f 66 3a   must be one of:
11dc0 20 72 6f 6c 6c 62 61 63 6b 2c 20 22 0a 20 20 20   rollback, ".   
11dd0 20 20 20 20 20 20 20 20 20 22 61 62 6f 72 74 2c           "abort,
11de0 20 66 61 69 6c 2c 20 69 67 6e 6f 72 65 2c 20 6f   fail, ignore, o
11df0 72 20 72 65 70 6c 61 63 65 22 2c 20 28 63 68 61  r replace", (cha
11e00 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 72 65 74  r*)0);.      ret
11e10 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
11e20 20 20 20 7d 0a 20 20 20 20 7a 53 71 6c 20 3d 20     }.    zSql = 
11e30 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
11e40 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 27  "SELECT * FROM '
11e50 25 71 27 22 2c 20 7a 54 61 62 6c 65 29 3b 0a 20  %q'", zTable);. 
11e60 20 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29     if( zSql==0 )
11e70 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65  {.      Tcl_Appe
11e80 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
11e90 20 22 45 72 72 6f 72 3a 20 6e 6f 20 73 75 63 68   "Error: no such
11ea0 20 74 61 62 6c 65 3a 20 22 2c 20 7a 54 61 62 6c   table: ", zTabl
11eb0 65 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  e, (char*)0);.  
11ec0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
11ed0 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
11ee0 6e 42 79 74 65 20 3d 20 73 74 72 6c 65 6e 33 30  nByte = strlen30
11ef0 28 7a 53 71 6c 29 3b 0a 20 20 20 20 72 63 20 3d  (zSql);.    rc =
11f00 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
11f10 28 70 44 62 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20  (pDb->db, zSql, 
11f20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a  -1, &pStmt, 0);.
11f30 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
11f40 28 7a 53 71 6c 29 3b 0a 20 20 20 20 69 66 28 20  (zSql);.    if( 
11f50 72 63 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  rc ){.      Tcl_
11f60 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
11f70 65 72 70 2c 20 22 45 72 72 6f 72 3a 20 22 2c 20  erp, "Error: ", 
11f80 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70  sqlite3_errmsg(p
11f90 44 62 2d 3e 64 62 29 2c 20 28 63 68 61 72 2a 29  Db->db), (char*)
11fa0 30 29 3b 0a 20 20 20 20 20 20 6e 43 6f 6c 20 3d  0);.      nCol =
11fb0 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
11fc0 20 20 20 20 20 6e 43 6f 6c 20 3d 20 73 71 6c 69       nCol = sqli
11fd0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74  te3_column_count
11fe0 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 7d 0a 20  (pStmt);.    }. 
11ff0 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c     sqlite3_final
12000 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  ize(pStmt);.    
12010 69 66 28 20 6e 43 6f 6c 3d 3d 30 20 29 20 7b 0a  if( nCol==0 ) {.
12020 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
12030 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
12040 20 20 7a 53 71 6c 20 3d 20 6d 61 6c 6c 6f 63 28    zSql = malloc(
12050 20 6e 42 79 74 65 20 2b 20 35 30 20 2b 20 6e 43   nByte + 50 + nC
12060 6f 6c 2a 32 20 29 3b 0a 20 20 20 20 69 66 28 20  ol*2 );.    if( 
12070 7a 53 71 6c 3d 3d 30 20 29 20 7b 0a 20 20 20 20  zSql==0 ) {.    
12080 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
12090 6c 74 28 69 6e 74 65 72 70 2c 20 22 45 72 72 6f  lt(interp, "Erro
120a0 72 3a 20 63 61 6e 27 74 20 6d 61 6c 6c 6f 63 28  r: can't malloc(
120b0 29 22 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20  )", (char*)0);. 
120c0 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
120d0 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
120e0 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
120f0 66 28 6e 42 79 74 65 2b 35 30 2c 20 7a 53 71 6c  f(nByte+50, zSql
12100 2c 20 22 49 4e 53 45 52 54 20 4f 52 20 25 71 20  , "INSERT OR %q 
12110 49 4e 54 4f 20 27 25 71 27 20 56 41 4c 55 45 53  INTO '%q' VALUES
12120 28 3f 22 2c 0a 20 20 20 20 20 20 20 20 20 7a 43  (?",.         zC
12130 6f 6e 66 6c 69 63 74 2c 20 7a 54 61 62 6c 65 29  onflict, zTable)
12140 3b 0a 20 20 20 20 6a 20 3d 20 73 74 72 6c 65 6e  ;.    j = strlen
12150 33 30 28 7a 53 71 6c 29 3b 0a 20 20 20 20 66 6f  30(zSql);.    fo
12160 72 28 69 3d 31 3b 20 69 3c 6e 43 6f 6c 3b 20 69  r(i=1; i<nCol; i
12170 2b 2b 29 7b 0a 20 20 20 20 20 20 7a 53 71 6c 5b  ++){.      zSql[
12180 6a 2b 2b 5d 20 3d 20 27 2c 27 3b 0a 20 20 20 20  j++] = ',';.    
12190 20 20 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d 20 27 3f    zSql[j++] = '?
121a0 27 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 53 71  ';.    }.    zSq
121b0 6c 5b 6a 2b 2b 5d 20 3d 20 27 29 27 3b 0a 20 20  l[j++] = ')';.  
121c0 20 20 7a 53 71 6c 5b 6a 5d 20 3d 20 30 3b 0a 20    zSql[j] = 0;. 
121d0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
121e0 70 72 65 70 61 72 65 28 70 44 62 2d 3e 64 62 2c  prepare(pDb->db,
121f0 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d   zSql, -1, &pStm
12200 74 2c 20 30 29 3b 0a 20 20 20 20 66 72 65 65 28  t, 0);.    free(
12210 7a 53 71 6c 29 3b 0a 20 20 20 20 69 66 28 20 72  zSql);.    if( r
12220 63 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41  c ){.      Tcl_A
12230 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
12240 72 70 2c 20 22 45 72 72 6f 72 3a 20 22 2c 20 73  rp, "Error: ", s
12250 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44  qlite3_errmsg(pD
12260 62 2d 3e 64 62 29 2c 20 28 63 68 61 72 2a 29 30  b->db), (char*)0
12270 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
12280 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
12290 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
122a0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
122b0 20 20 20 20 69 6e 20 3d 20 66 6f 70 65 6e 28 7a      in = fopen(z
122c0 46 69 6c 65 2c 20 22 72 62 22 29 3b 0a 20 20 20  File, "rb");.   
122d0 20 69 66 28 20 69 6e 3d 3d 30 20 29 7b 0a 20 20   if( in==0 ){.  
122e0 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
122f0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 45 72  sult(interp, "Er
12300 72 6f 72 3a 20 63 61 6e 6e 6f 74 20 6f 70 65 6e  ror: cannot open
12310 20 66 69 6c 65 3a 20 22 2c 20 7a 46 69 6c 65 2c   file: ", zFile,
12320 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 71   NULL);.      sq
12330 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
12340 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 72 65 74  Stmt);.      ret
12350 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
12360 20 20 20 7d 0a 20 20 20 20 61 7a 43 6f 6c 20 3d     }.    azCol =
12370 20 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28   malloc( sizeof(
12380 61 7a 43 6f 6c 5b 30 5d 29 2a 28 6e 43 6f 6c 2b  azCol[0])*(nCol+
12390 31 29 20 29 3b 0a 20 20 20 20 69 66 28 20 61 7a  1) );.    if( az
123a0 43 6f 6c 3d 3d 30 20 29 20 7b 0a 20 20 20 20 20  Col==0 ) {.     
123b0 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
123c0 74 28 69 6e 74 65 72 70 2c 20 22 45 72 72 6f 72  t(interp, "Error
123d0 3a 20 63 61 6e 27 74 20 6d 61 6c 6c 6f 63 28 29  : can't malloc()
123e0 22 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  ", (char*)0);.  
123f0 20 20 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a      fclose(in);.
12400 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
12410 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
12420 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33 5f    (void)sqlite3_
12430 65 78 65 63 28 70 44 62 2d 3e 64 62 2c 20 22 42  exec(pDb->db, "B
12440 45 47 49 4e 22 2c 20 30 2c 20 30 2c 20 30 29 3b  EGIN", 0, 0, 0);
12450 0a 20 20 20 20 7a 43 6f 6d 6d 69 74 20 3d 20 22  .    zCommit = "
12460 43 4f 4d 4d 49 54 22 3b 0a 20 20 20 20 77 68 69  COMMIT";.    whi
12470 6c 65 28 20 28 7a 4c 69 6e 65 20 3d 20 6c 6f 63  le( (zLine = loc
12480 61 6c 5f 67 65 74 6c 69 6e 65 28 30 2c 20 69 6e  al_getline(0, in
12490 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 63  ))!=0 ){.      c
124a0 68 61 72 20 2a 7a 3b 0a 20 20 20 20 20 20 6c 69  har *z;.      li
124b0 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 61 7a  neno++;.      az
124c0 43 6f 6c 5b 30 5d 20 3d 20 7a 4c 69 6e 65 3b 0a  Col[0] = zLine;.
124d0 20 20 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 7a        for(i=0, z
124e0 3d 7a 4c 69 6e 65 3b 20 2a 7a 3b 20 7a 2b 2b 29  =zLine; *z; z++)
124f0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 2a 7a  {.        if( *z
12500 3d 3d 7a 53 65 70 5b 30 5d 20 26 26 20 73 74 72  ==zSep[0] && str
12510 6e 63 6d 70 28 7a 2c 20 7a 53 65 70 2c 20 6e 53  ncmp(z, zSep, nS
12520 65 70 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ep)==0 ){.      
12530 20 20 20 20 2a 7a 20 3d 20 30 3b 0a 20 20 20 20      *z = 0;.    
12540 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20        i++;.     
12550 20 20 20 20 20 69 66 28 20 69 3c 6e 43 6f 6c 20       if( i<nCol 
12560 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  ){.            a
12570 7a 43 6f 6c 5b 69 5d 20 3d 20 26 7a 5b 6e 53 65  zCol[i] = &z[nSe
12580 70 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  p];.            
12590 7a 20 2b 3d 20 6e 53 65 70 2d 31 3b 0a 20 20 20  z += nSep-1;.   
125a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
125b0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
125c0 20 69 66 28 20 69 2b 31 21 3d 6e 43 6f 6c 20 29   if( i+1!=nCol )
125d0 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  {.        char *
125e0 7a 45 72 72 3b 0a 20 20 20 20 20 20 20 20 69 6e  zErr;.        in
125f0 74 20 6e 45 72 72 20 3d 20 73 74 72 6c 65 6e 33  t nErr = strlen3
12600 30 28 7a 46 69 6c 65 29 20 2b 20 32 30 30 3b 0a  0(zFile) + 200;.
12610 20 20 20 20 20 20 20 20 7a 45 72 72 20 3d 20 6d          zErr = m
12620 61 6c 6c 6f 63 28 6e 45 72 72 29 3b 0a 20 20 20  alloc(nErr);.   
12630 20 20 20 20 20 69 66 28 20 7a 45 72 72 20 29 7b       if( zErr ){
12640 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
12650 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 45 72 72  e3_snprintf(nErr
12660 2c 20 7a 45 72 72 2c 0a 20 20 20 20 20 20 20 20  , zErr,.        
12670 20 20 20 20 20 22 45 72 72 6f 72 3a 20 25 73 20       "Error: %s 
12680 6c 69 6e 65 20 25 64 3a 20 65 78 70 65 63 74 65  line %d: expecte
12690 64 20 25 64 20 63 6f 6c 75 6d 6e 73 20 6f 66 20  d %d columns of 
126a0 64 61 74 61 20 62 75 74 20 66 6f 75 6e 64 20 25  data but found %
126b0 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  d",.            
126c0 20 7a 46 69 6c 65 2c 20 6c 69 6e 65 6e 6f 2c 20   zFile, lineno, 
126d0 6e 43 6f 6c 2c 20 69 2b 31 29 3b 0a 20 20 20 20  nCol, i+1);.    
126e0 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
126f0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a  Result(interp, z
12700 45 72 72 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  Err, (char*)0);.
12710 20 20 20 20 20 20 20 20 20 20 66 72 65 65 28 7a            free(z
12720 45 72 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Err);.        }.
12730 20 20 20 20 20 20 20 20 7a 43 6f 6d 6d 69 74 20          zCommit 
12740 3d 20 22 52 4f 4c 4c 42 41 43 4b 22 3b 0a 20 20  = "ROLLBACK";.  
12750 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
12760 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69     }.      for(i
12770 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29  =0; i<nCol; i++)
12780 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 63 68 65  {.        /* che
12790 63 6b 20 66 6f 72 20 6e 75 6c 6c 20 64 61 74 61  ck for null data
127a0 2c 20 69 66 20 73 6f 2c 20 62 69 6e 64 20 61 73  , if so, bind as
127b0 20 6e 75 6c 6c 20 2a 2f 0a 20 20 20 20 20 20 20   null */.       
127c0 20 69 66 28 20 28 6e 4e 75 6c 6c 3e 30 20 26 26   if( (nNull>0 &&
127d0 20 73 74 72 63 6d 70 28 61 7a 43 6f 6c 5b 69 5d   strcmp(azCol[i]
127e0 2c 20 7a 4e 75 6c 6c 29 3d 3d 30 29 0a 20 20 20  , zNull)==0).   
127f0 20 20 20 20 20 20 20 7c 7c 20 73 74 72 6c 65 6e         || strlen
12800 33 30 28 61 7a 43 6f 6c 5b 69 5d 29 3d 3d 30 0a  30(azCol[i])==0.
12810 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
12820 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e       sqlite3_bin
12830 64 5f 6e 75 6c 6c 28 70 53 74 6d 74 2c 20 69 2b  d_null(pStmt, i+
12840 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  1);.        }els
12850 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  e{.          sql
12860 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70  ite3_bind_text(p
12870 53 74 6d 74 2c 20 69 2b 31 2c 20 61 7a 43 6f 6c  Stmt, i+1, azCol
12880 5b 69 5d 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f  [i], -1, SQLITE_
12890 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 20  STATIC);.       
128a0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
128b0 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53   sqlite3_step(pS
128c0 74 6d 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  tmt);.      rc =
128d0 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70   sqlite3_reset(p
128e0 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 66 72 65  Stmt);.      fre
128f0 65 28 7a 4c 69 6e 65 29 3b 0a 20 20 20 20 20 20  e(zLine);.      
12900 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
12910 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c  K ){.        Tcl
12920 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
12930 74 65 72 70 2c 22 45 72 72 6f 72 3a 20 22 2c 20  terp,"Error: ", 
12940 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70  sqlite3_errmsg(p
12950 44 62 2d 3e 64 62 29 2c 20 28 63 68 61 72 2a 29  Db->db), (char*)
12960 30 29 3b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6d  0);.        zCom
12970 6d 69 74 20 3d 20 22 52 4f 4c 4c 42 41 43 4b 22  mit = "ROLLBACK"
12980 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
12990 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
129a0 20 20 20 66 72 65 65 28 61 7a 43 6f 6c 29 3b 0a     free(azCol);.
129b0 20 20 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a      fclose(in);.
129c0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61      sqlite3_fina
129d0 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20  lize(pStmt);.   
129e0 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33 5f 65   (void)sqlite3_e
129f0 78 65 63 28 70 44 62 2d 3e 64 62 2c 20 7a 43 6f  xec(pDb->db, zCo
12a00 6d 6d 69 74 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  mmit, 0, 0, 0);.
12a10 0a 20 20 20 20 69 66 28 20 7a 43 6f 6d 6d 69 74  .    if( zCommit
12a20 5b 30 5d 20 3d 3d 20 27 43 27 20 29 7b 0a 20 20  [0] == 'C' ){.  
12a30 20 20 20 20 2f 2a 20 73 75 63 63 65 73 73 2c 20      /* success, 
12a40 73 65 74 20 72 65 73 75 6c 74 20 61 73 20 6e 75  set result as nu
12a50 6d 62 65 72 20 6f 66 20 6c 69 6e 65 73 20 70 72  mber of lines pr
12a60 6f 63 65 73 73 65 64 20 2a 2f 0a 20 20 20 20 20  ocessed */.     
12a70 20 70 52 65 73 75 6c 74 20 3d 20 54 63 6c 5f 47   pResult = Tcl_G
12a80 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
12a90 72 70 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 53  rp);.      Tcl_S
12aa0 65 74 49 6e 74 4f 62 6a 28 70 52 65 73 75 6c 74  etIntObj(pResult
12ab0 2c 20 6c 69 6e 65 6e 6f 29 3b 0a 20 20 20 20 20  , lineno);.     
12ac0 20 72 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20   rc = TCL_OK;.  
12ad0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
12ae0 2a 20 66 61 69 6c 75 72 65 2c 20 61 70 70 65 6e  * failure, appen
12af0 64 20 6c 69 6e 65 6e 6f 20 77 68 65 72 65 20 66  d lineno where f
12b00 61 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20 73  ailed */.      s
12b10 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
12b20 73 69 7a 65 6f 66 28 7a 4c 69 6e 65 4e 75 6d 29  sizeof(zLineNum)
12b30 2c 20 7a 4c 69 6e 65 4e 75 6d 2c 22 25 64 22 2c  , zLineNum,"%d",
12b40 6c 69 6e 65 6e 6f 29 3b 0a 20 20 20 20 20 20 54  lineno);.      T
12b50 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
12b60 69 6e 74 65 72 70 2c 22 2c 20 66 61 69 6c 65 64  interp,", failed
12b70 20 77 68 69 6c 65 20 70 72 6f 63 65 73 73 69 6e   while processin
12b80 67 20 6c 69 6e 65 3a 20 22 2c 7a 4c 69 6e 65 4e  g line: ",zLineN
12b90 75 6d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  um,.            
12ba0 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
12bb0 2a 29 30 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  *)0);.      rc =
12bc0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
12bd0 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  }.    break;.  }
12be0 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 24  ..  /*.  **    $
12bf0 64 62 20 65 6e 61 62 6c 65 5f 6c 6f 61 64 5f 65  db enable_load_e
12c00 78 74 65 6e 73 69 6f 6e 20 42 4f 4f 4c 45 41 4e  xtension BOOLEAN
12c10 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 75 72 6e 20  .  **.  ** Turn 
12c20 74 68 65 20 65 78 74 65 6e 73 69 6f 6e 20 6c 6f  the extension lo
12c30 61 64 69 6e 67 20 66 65 61 74 75 72 65 20 6f 6e  ading feature on
12c40 20 6f 72 20 6f 66 66 2e 20 20 49 74 20 69 66 20   or off.  It if 
12c50 6f 66 66 20 62 79 0a 20 20 2a 2a 20 64 65 66 61  off by.  ** defa
12c60 75 6c 74 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  ult..  */.  case
12c70 20 44 42 5f 45 4e 41 42 4c 45 5f 4c 4f 41 44 5f   DB_ENABLE_LOAD_
12c80 45 58 54 45 4e 53 49 4f 4e 3a 20 7b 0a 23 69 66  EXTENSION: {.#if
12c90 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
12ca0 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a  _LOAD_EXTENSION.
12cb0 20 20 20 20 69 6e 74 20 6f 6e 6f 66 66 3b 0a 20      int onoff;. 
12cc0 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29     if( objc!=3 )
12cd0 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e  {.      Tcl_Wron
12ce0 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
12cf0 20 32 2c 20 6f 62 6a 76 2c 20 22 42 4f 4f 4c 45   2, objv, "BOOLE
12d00 41 4e 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  AN");.      retu
12d10 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
12d20 20 20 7d 0a 20 20 20 20 69 66 28 20 54 63 6c 5f    }.    if( Tcl_
12d30 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62  GetBooleanFromOb
12d40 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32  j(interp, objv[2
12d50 5d 2c 20 26 6f 6e 6f 66 66 29 20 29 7b 0a 20 20  ], &onoff) ){.  
12d60 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
12d70 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
12d80 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 6c  sqlite3_enable_l
12d90 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e 28 70 44  oad_extension(pD
12da0 62 2d 3e 64 62 2c 20 6f 6e 6f 66 66 29 3b 0a 20  b->db, onoff);. 
12db0 20 20 20 62 72 65 61 6b 3b 0a 23 65 6c 73 65 0a     break;.#else.
12dc0 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
12dd0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 65 78  sult(interp, "ex
12de0 74 65 6e 73 69 6f 6e 20 6c 6f 61 64 69 6e 67 20  tension loading 
12df0 69 73 20 74 75 72 6e 65 64 20 6f 66 66 20 61 74  is turned off at
12e00 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 22 2c 0a   compile-time",.
12e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12e20 20 20 20 20 20 28 63 68 61 72 2a 29 30 29 3b 0a       (char*)0);.
12e30 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
12e40 52 52 4f 52 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  RROR;.#endif.  }
12e50 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 24  ..  /*.  **    $
12e60 64 62 20 65 72 72 6f 72 63 6f 64 65 0a 20 20 2a  db errorcode.  *
12e70 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 74 68  *.  ** Return th
12e80 65 20 6e 75 6d 65 72 69 63 20 65 72 72 6f 72 20  e numeric error 
12e90 63 6f 64 65 20 74 68 61 74 20 77 61 73 20 72 65  code that was re
12ea0 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 6d 6f  turned by the mo
12eb0 73 74 20 72 65 63 65 6e 74 0a 20 20 2a 2a 20 63  st recent.  ** c
12ec0 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 65  all to sqlite3_e
12ed0 78 65 63 28 29 2e 0a 20 20 2a 2f 0a 20 20 63 61  xec()..  */.  ca
12ee0 73 65 20 44 42 5f 45 52 52 4f 52 43 4f 44 45 3a  se DB_ERRORCODE:
12ef0 20 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62   {.    Tcl_SetOb
12f00 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
12f10 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 71  Tcl_NewIntObj(sq
12f20 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28 70 44  lite3_errcode(pD
12f30 62 2d 3e 64 62 29 29 29 3b 0a 20 20 20 20 62 72  b->db)));.    br
12f40 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  eak;.  }..  /*. 
12f50 20 2a 2a 20 20 20 20 24 64 62 20 65 78 69 73 74   **    $db exist
12f60 73 20 24 73 71 6c 0a 20 20 2a 2a 20 20 20 20 24  s $sql.  **    $
12f70 64 62 20 6f 6e 65 63 6f 6c 75 6d 6e 20 24 73 71  db onecolumn $sq
12f80 6c 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  l.  **.  ** The 
12f90 6f 6e 65 63 6f 6c 75 6d 6e 20 6d 65 74 68 6f 64  onecolumn method
12fa0 20 69 73 20 74 68 65 20 65 71 75 69 76 61 6c 65   is the equivale
12fb0 6e 74 20 6f 66 3a 0a 20 20 2a 2a 20 20 20 20 20  nt of:.  **     
12fc0 6c 69 6e 64 65 78 20 5b 24 64 62 20 65 76 61 6c  lindex [$db eval
12fd0 20 24 73 71 6c 5d 20 30 0a 20 20 2a 2f 0a 20 20   $sql] 0.  */.  
12fe0 63 61 73 65 20 44 42 5f 45 58 49 53 54 53 3a 0a  case DB_EXISTS:.
12ff0 20 20 63 61 73 65 20 44 42 5f 4f 4e 45 43 4f 4c    case DB_ONECOL
13000 55 4d 4e 3a 20 7b 0a 20 20 20 20 54 63 6c 5f 4f  UMN: {.    Tcl_O
13010 62 6a 20 2a 70 52 65 73 75 6c 74 20 3d 20 30 3b  bj *pResult = 0;
13020 0a 20 20 20 20 44 62 45 76 61 6c 43 6f 6e 74 65  .    DbEvalConte
13030 78 74 20 73 45 76 61 6c 3b 0a 20 20 20 20 69 66  xt sEval;.    if
13040 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20  ( objc!=3 ){.   
13050 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
13060 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
13070 62 6a 76 2c 20 22 53 51 4c 22 29 3b 0a 20 20 20  bjv, "SQL");.   
13080 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
13090 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ROR;.    }..    
130a0 64 62 45 76 61 6c 49 6e 69 74 28 26 73 45 76 61  dbEvalInit(&sEva
130b0 6c 2c 20 70 44 62 2c 20 6f 62 6a 76 5b 32 5d 2c  l, pDb, objv[2],
130c0 20 30 29 3b 0a 20 20 20 20 72 63 20 3d 20 64 62   0);.    rc = db
130d0 45 76 61 6c 53 74 65 70 28 26 73 45 76 61 6c 29  EvalStep(&sEval)
130e0 3b 0a 20 20 20 20 69 66 28 20 63 68 6f 69 63 65  ;.    if( choice
130f0 3d 3d 44 42 5f 4f 4e 45 43 4f 4c 55 4d 4e 20 29  ==DB_ONECOLUMN )
13100 7b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  {.      if( rc==
13110 54 43 4c 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  TCL_OK ){.      
13120 20 20 70 52 65 73 75 6c 74 20 3d 20 64 62 45 76    pResult = dbEv
13130 61 6c 43 6f 6c 75 6d 6e 56 61 6c 75 65 28 26 73  alColumnValue(&s
13140 45 76 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20  Eval, 0);.      
13150 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 54 43  }else if( rc==TC
13160 4c 5f 42 52 45 41 4b 20 29 7b 0a 20 20 20 20 20  L_BREAK ){.     
13170 20 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73 75     Tcl_ResetResu
13180 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  lt(interp);.    
13190 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66    }.    }else if
131a0 28 20 72 63 3d 3d 54 43 4c 5f 42 52 45 41 4b 20  ( rc==TCL_BREAK 
131b0 7c 7c 20 72 63 3d 3d 54 43 4c 5f 4f 4b 20 29 7b  || rc==TCL_OK ){
131c0 0a 20 20 20 20 20 20 70 52 65 73 75 6c 74 20 3d  .      pResult =
131d0 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f   Tcl_NewBooleanO
131e0 62 6a 28 72 63 3d 3d 54 43 4c 5f 4f 4b 29 3b 0a  bj(rc==TCL_OK);.
131f0 20 20 20 20 7d 0a 20 20 20 20 64 62 45 76 61 6c      }.    dbEval
13200 46 69 6e 61 6c 69 7a 65 28 26 73 45 76 61 6c 29  Finalize(&sEval)
13210 3b 0a 20 20 20 20 69 66 28 20 70 52 65 73 75 6c  ;.    if( pResul
13220 74 20 29 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65  t ) Tcl_SetObjRe
13230 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 52 65  sult(interp, pRe
13240 73 75 6c 74 29 3b 0a 0a 20 20 20 20 69 66 28 20  sult);..    if( 
13250 72 63 3d 3d 54 43 4c 5f 42 52 45 41 4b 20 29 7b  rc==TCL_BREAK ){
13260 0a 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f  .      rc = TCL_
13270 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 72  OK;.    }.    br
13280 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  eak;.  }..  /*. 
13290 20 2a 2a 20 20 20 20 24 64 62 20 65 76 61 6c 20   **    $db eval 
132a0 24 73 71 6c 20 3f 61 72 72 61 79 3f 20 3f 7b 20  $sql ?array? ?{ 
132b0 20 2e 2e 2e 63 6f 64 65 2e 2e 2e 20 7d 3f 0a 20   ...code... }?. 
132c0 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 53 51 4c   **.  ** The SQL
132d0 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 24 73   statement in $s
132e0 71 6c 20 69 73 20 65 76 61 6c 75 61 74 65 64 2e  ql is evaluated.
132f0 20 20 46 6f 72 20 65 61 63 68 20 72 6f 77 2c 20    For each row, 
13300 74 68 65 20 76 61 6c 75 65 73 20 61 72 65 0a 20  the values are. 
13310 20 2a 2a 20 70 6c 61 63 65 64 20 69 6e 20 65 6c   ** placed in el
13320 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 61 72  ements of the ar
13330 72 61 79 20 6e 61 6d 65 64 20 22 61 72 72 61 79  ray named "array
13340 22 20 61 6e 64 20 2e 2e 2e 63 6f 64 65 2e 2e 2e  " and ...code...
13350 20 69 73 20 65 78 65 63 75 74 65 64 2e 0a 20 20   is executed..  
13360 2a 2a 20 49 66 20 22 61 72 72 61 79 22 20 61 6e  ** If "array" an
13370 64 20 22 63 6f 64 65 22 20 61 72 65 20 6f 6d 69  d "code" are omi
13380 74 74 65 64 2c 20 74 68 65 6e 20 6e 6f 20 63 61  tted, then no ca
13390 6c 6c 62 61 63 6b 20 69 73 20 65 76 65 72 79 20  llback is every 
133a0 69 6e 76 6f 6b 65 64 2e 0a 20 20 2a 2a 20 49 66  invoked..  ** If
133b0 20 22 61 72 72 61 79 22 20 69 73 20 61 6e 20 65   "array" is an e
133c0 6d 70 74 79 20 73 74 72 69 6e 67 2c 20 74 68 65  mpty string, the
133d0 6e 20 74 68 65 20 76 61 6c 75 65 73 20 61 72 65  n the values are
133e0 20 70 6c 61 63 65 64 20 69 6e 20 76 61 72 69 61   placed in varia
133f0 62 6c 65 73 0a 20 20 2a 2a 20 74 68 61 74 20 68  bles.  ** that h
13400 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e 61 6d  ave the same nam
13410 65 20 61 73 20 74 68 65 20 66 69 65 6c 64 73 20  e as the fields 
13420 65 78 74 72 61 63 74 65 64 20 62 79 20 74 68 65  extracted by the
13430 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 63   query..  */.  c
13440 61 73 65 20 44 42 5f 45 56 41 4c 3a 20 7b 0a 20  ase DB_EVAL: {. 
13450 20 20 20 69 66 28 20 6f 62 6a 63 3c 33 20 7c 7c     if( objc<3 ||
13460 20 6f 62 6a 63 3e 35 20 29 7b 0a 20 20 20 20 20   objc>5 ){.     
13470 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
13480 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a  s(interp, 2, obj
13490 76 2c 20 22 53 51 4c 20 3f 41 52 52 41 59 2d 4e  v, "SQL ?ARRAY-N
134a0 41 4d 45 3f 20 3f 53 43 52 49 50 54 3f 22 29 3b  AME? ?SCRIPT?");
134b0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
134c0 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a  L_ERROR;.    }..
134d0 20 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d 33 20      if( objc==3 
134e0 29 7b 0a 20 20 20 20 20 20 44 62 45 76 61 6c 43  ){.      DbEvalC
134f0 6f 6e 74 65 78 74 20 73 45 76 61 6c 3b 0a 20 20  ontext sEval;.  
13500 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65      Tcl_Obj *pRe
13510 74 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a 28 29  t = Tcl_NewObj()
13520 3b 0a 20 20 20 20 20 20 54 63 6c 5f 49 6e 63 72  ;.      Tcl_Incr
13530 52 65 66 43 6f 75 6e 74 28 70 52 65 74 29 3b 0a  RefCount(pRet);.
13540 20 20 20 20 20 20 64 62 45 76 61 6c 49 6e 69 74        dbEvalInit
13550 28 26 73 45 76 61 6c 2c 20 70 44 62 2c 20 6f 62  (&sEval, pDb, ob
13560 6a 76 5b 32 5d 2c 20 30 29 3b 0a 20 20 20 20 20  jv[2], 0);.     
13570 20 77 68 69 6c 65 28 20 54 43 4c 5f 4f 4b 3d 3d   while( TCL_OK==
13580 28 72 63 20 3d 20 64 62 45 76 61 6c 53 74 65 70  (rc = dbEvalStep
13590 28 26 73 45 76 61 6c 29 29 20 29 7b 0a 20 20 20  (&sEval)) ){.   
135a0 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
135b0 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20      int nCol;.  
135c0 20 20 20 20 20 20 64 62 45 76 61 6c 52 6f 77 49        dbEvalRowI
135d0 6e 66 6f 28 26 73 45 76 61 6c 2c 20 26 6e 43 6f  nfo(&sEval, &nCo
135e0 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 66  l, 0);.        f
135f0 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20  or(i=0; i<nCol; 
13600 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
13610 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
13620 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
13630 20 70 52 65 74 2c 20 64 62 45 76 61 6c 43 6f 6c   pRet, dbEvalCol
13640 75 6d 6e 56 61 6c 75 65 28 26 73 45 76 61 6c 2c  umnValue(&sEval,
13650 20 69 29 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a   i));.        }.
13660 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64 62        }.      db
13670 45 76 61 6c 46 69 6e 61 6c 69 7a 65 28 26 73 45  EvalFinalize(&sE
13680 76 61 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20  val);.      if( 
13690 72 63 3d 3d 54 43 4c 5f 42 52 45 41 4b 20 29 7b  rc==TCL_BREAK ){
136a0 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 53 65 74  .        Tcl_Set
136b0 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
136c0 2c 20 70 52 65 74 29 3b 0a 20 20 20 20 20 20 20  , pRet);.       
136d0 20 72 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20   rc = TCL_OK;.  
136e0 20 20 20 20 7d 0a 20 20 20 20 20 20 54 63 6c 5f      }.      Tcl_
136f0 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 52 65  DecrRefCount(pRe
13700 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  t);.    }else{. 
13710 20 20 20 20 20 43 6c 69 65 6e 74 44 61 74 61 20       ClientData 
13720 63 64 32 5b 32 5d 3b 0a 20 20 20 20 20 20 44 62  cd2[2];.      Db
13730 45 76 61 6c 43 6f 6e 74 65 78 74 20 2a 70 3b 0a  EvalContext *p;.
13740 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70        Tcl_Obj *p
13750 41 72 72 61 79 20 3d 20 30 3b 0a 20 20 20 20 20  Array = 0;.     
13760 20 54 63 6c 5f 4f 62 6a 20 2a 70 53 63 72 69 70   Tcl_Obj *pScrip
13770 74 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 6f 62  t;..      if( ob
13780 6a 63 3d 3d 35 20 26 26 20 2a 28 63 68 61 72 20  jc==5 && *(char 
13790 2a 29 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  *)Tcl_GetString(
137a0 6f 62 6a 76 5b 33 5d 29 20 29 7b 0a 20 20 20 20  objv[3]) ){.    
137b0 20 20 20 20 70 41 72 72 61 79 20 3d 20 6f 62 6a      pArray = obj
137c0 76 5b 33 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  v[3];.      }.  
137d0 20 20 20 20 70 53 63 72 69 70 74 20 3d 20 6f 62      pScript = ob
137e0 6a 76 5b 6f 62 6a 63 2d 31 5d 3b 0a 20 20 20 20  jv[objc-1];.    
137f0 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
13800 6e 74 28 70 53 63 72 69 70 74 29 3b 0a 0a 20 20  nt(pScript);..  
13810 20 20 20 20 70 20 3d 20 28 44 62 45 76 61 6c 43      p = (DbEvalC
13820 6f 6e 74 65 78 74 20 2a 29 54 63 6c 5f 41 6c 6c  ontext *)Tcl_All
13830 6f 63 28 73 69 7a 65 6f 66 28 44 62 45 76 61 6c  oc(sizeof(DbEval
13840 43 6f 6e 74 65 78 74 29 29 3b 0a 20 20 20 20 20  Context));.     
13850 20 64 62 45 76 61 6c 49 6e 69 74 28 70 2c 20 70   dbEvalInit(p, p
13860 44 62 2c 20 6f 62 6a 76 5b 32 5d 2c 20 70 41 72  Db, objv[2], pAr
13870 72 61 79 29 3b 0a 0a 20 20 20 20 20 20 63 64 32  ray);..      cd2
13880 5b 30 5d 20 3d 20 28 76 6f 69 64 20 2a 29 70 3b  [0] = (void *)p;
13890 0a 20 20 20 20 20 20 63 64 32 5b 31 5d 20 3d 20  .      cd2[1] = 
138a0 28 76 6f 69 64 20 2a 29 70 53 63 72 69 70 74 3b  (void *)pScript;
138b0 0a 20 20 20 20 20 20 72 63 20 3d 20 44 62 45 76  .      rc = DbEv
138c0 61 6c 4e 65 78 74 43 6d 64 28 63 64 32 2c 20 69  alNextCmd(cd2, i
138d0 6e 74 65 72 70 2c 20 54 43 4c 5f 4f 4b 29 3b 0a  nterp, TCL_OK);.
138e0 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b      }.    break;
138f0 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
13900 20 20 20 20 24 64 62 20 66 75 6e 63 74 69 6f 6e      $db function
13910 20 4e 41 4d 45 20 5b 2d 61 72 67 63 6f 75 6e 74   NAME [-argcount
13920 20 4e 5d 20 5b 2d 64 65 74 65 72 6d 69 6e 69 73   N] [-determinis
13930 74 69 63 5d 20 53 43 52 49 50 54 0a 20 20 2a 2a  tic] SCRIPT.  **
13940 0a 20 20 2a 2a 20 43 72 65 61 74 65 20 61 20 6e  .  ** Create a n
13950 65 77 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20  ew SQL function 
13960 63 61 6c 6c 65 64 20 4e 41 4d 45 2e 20 20 57 68  called NAME.  Wh
13970 65 6e 65 76 65 72 20 74 68 61 74 20 66 75 6e 63  enever that func
13980 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 63 61 6c  tion is.  ** cal
13990 6c 65 64 2c 20 69 6e 76 6f 6b 65 20 53 43 52 49  led, invoke SCRI
139a0 50 54 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74  PT to evaluate t
139b0 68 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a  he function..  *
139c0 2f 0a 20 20 63 61 73 65 20 44 42 5f 46 55 4e 43  /.  case DB_FUNC
139d0 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 69 6e 74 20  TION: {.    int 
139e0 66 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 55  flags = SQLITE_U
139f0 54 46 38 3b 0a 20 20 20 20 53 71 6c 46 75 6e 63  TF8;.    SqlFunc
13a00 20 2a 70 46 75 6e 63 3b 0a 20 20 20 20 54 63 6c   *pFunc;.    Tcl
13a10 5f 4f 62 6a 20 2a 70 53 63 72 69 70 74 3b 0a 20  _Obj *pScript;. 
13a20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a     char *zName;.
13a30 20 20 20 20 69 6e 74 20 6e 41 72 67 20 3d 20 2d      int nArg = -
13a40 31 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  1;.    int i;.  
13a50 20 20 69 66 28 20 6f 62 6a 63 3c 34 20 29 7b 0a    if( objc<4 ){.
13a60 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
13a70 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
13a80 2c 20 6f 62 6a 76 2c 20 22 4e 41 4d 45 20 3f 53  , objv, "NAME ?S
13a90 57 49 54 43 48 45 53 3f 20 53 43 52 49 50 54 22  WITCHES? SCRIPT"
13aa0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
13ab0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
13ac0 0a 20 20 20 20 66 6f 72 28 69 3d 33 3b 20 69 3c  .    for(i=3; i<
13ad0 28 6f 62 6a 63 2d 31 29 3b 20 69 2b 2b 29 7b 0a  (objc-1); i++){.
13ae0 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
13af0 20 2a 7a 20 3d 20 54 63 6c 5f 47 65 74 53 74 72   *z = Tcl_GetStr
13b00 69 6e 67 28 6f 62 6a 76 5b 69 5d 29 3b 0a 20 20  ing(objv[i]);.  
13b10 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 74 72 6c      int n = strl
13b20 65 6e 33 30 28 7a 29 3b 0a 20 20 20 20 20 20 69  en30(z);.      i
13b30 66 28 20 6e 3e 32 20 26 26 20 73 74 72 6e 63 6d  f( n>2 && strncm
13b40 70 28 7a 2c 20 22 2d 61 72 67 63 6f 75 6e 74 22  p(z, "-argcount"
13b50 2c 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ,n)==0 ){.      
13b60 20 20 69 66 28 20 69 3d 3d 28 6f 62 6a 63 2d 32    if( i==(objc-2
13b70 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54  ) ){.          T
13b80 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
13b90 69 6e 74 65 72 70 2c 20 22 6f 70 74 69 6f 6e 20  interp, "option 
13ba0 72 65 71 75 69 72 65 73 20 61 6e 20 61 72 67 75  requires an argu
13bb0 6d 65 6e 74 3a 20 22 2c 20 7a 2c 20 30 29 3b 0a  ment: ", z, 0);.
13bc0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
13bd0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
13be0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
13bf0 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  ( Tcl_GetIntFrom
13c00 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
13c10 5b 69 2b 31 5d 2c 20 26 6e 41 72 67 29 20 29 20  [i+1], &nArg) ) 
13c20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
13c30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 41  ;.        if( nA
13c40 72 67 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  rg<0 ){.        
13c50 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
13c60 6c 74 28 69 6e 74 65 72 70 2c 20 22 6e 75 6d 62  lt(interp, "numb
13c70 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
13c80 6d 75 73 74 20 62 65 20 6e 6f 6e 2d 6e 65 67 61  must be non-nega
13c90 74 69 76 65 22 2c 0a 20 20 20 20 20 20 20 20 20  tive",.         
13ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13cb0 20 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20    (char*)0);.   
13cc0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43         return TC
13cd0 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20  L_ERROR;.       
13ce0 20 7d 0a 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a   }.        i++;.
13cf0 20 20 20 20 20 20 7d 65 6c 73 65 0a 20 20 20 20        }else.    
13d00 20 20 69 66 28 20 6e 3e 32 20 26 26 20 73 74 72    if( n>2 && str
13d10 6e 63 6d 70 28 7a 2c 20 22 2d 64 65 74 65 72 6d  ncmp(z, "-determ
13d20 69 6e 69 73 74 69 63 22 2c 6e 29 3d 3d 30 20 29  inistic",n)==0 )
13d30 7b 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73 20  {.        flags 
13d40 7c 3d 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d  |= SQLITE_DETERM
13d50 49 4e 49 53 54 49 43 3b 0a 20 20 20 20 20 20 7d  INISTIC;.      }
13d60 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 54 63  else{.        Tc
13d70 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
13d80 6e 74 65 72 70 2c 20 22 62 61 64 20 6f 70 74 69  nterp, "bad opti
13d90 6f 6e 20 5c 22 22 2c 20 7a 2c 0a 20 20 20 20 20  on \"", z,.     
13da0 20 20 20 20 20 20 20 22 5c 22 3a 20 6d 75 73 74         "\": must
13db0 20 62 65 20 2d 61 72 67 63 6f 75 6e 74 20 6f 72   be -argcount or
13dc0 20 2d 64 65 74 65 72 6d 69 6e 69 73 74 69 63 22   -deterministic"
13dd0 2c 20 30 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  , 0.        );. 
13de0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43         return TC
13df0 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d  L_ERROR;.      }
13e00 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 53 63 72  .    }..    pScr
13e10 69 70 74 20 3d 20 6f 62 6a 76 5b 6f 62 6a 63 2d  ipt = objv[objc-
13e20 31 5d 3b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20  1];.    zName = 
13e30 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
13e40 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30 29  mObj(objv[2], 0)
13e50 3b 0a 20 20 20 20 70 46 75 6e 63 20 3d 20 66 69  ;.    pFunc = fi
13e60 6e 64 53 71 6c 46 75 6e 63 28 70 44 62 2c 20 7a  ndSqlFunc(pDb, z
13e70 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 70  Name);.    if( p
13e80 46 75 6e 63 3d 3d 30 20 29 20 72 65 74 75 72 6e  Func==0 ) return
13e90 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
13ea0 69 66 28 20 70 46 75 6e 63 2d 3e 70 53 63 72 69  if( pFunc->pScri
13eb0 70 74 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  pt ){.      Tcl_
13ec0 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 46 75  DecrRefCount(pFu
13ed0 6e 63 2d 3e 70 53 63 72 69 70 74 29 3b 0a 20 20  nc->pScript);.  
13ee0 20 20 7d 0a 20 20 20 20 70 46 75 6e 63 2d 3e 70    }.    pFunc->p
13ef0 53 63 72 69 70 74 20 3d 20 70 53 63 72 69 70 74  Script = pScript
13f00 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65  ;.    Tcl_IncrRe
13f10 66 43 6f 75 6e 74 28 70 53 63 72 69 70 74 29 3b  fCount(pScript);
13f20 0a 20 20 20 20 70 46 75 6e 63 2d 3e 75 73 65 45  .    pFunc->useE
13f30 76 61 6c 4f 62 6a 76 20 3d 20 73 61 66 65 54 6f  valObjv = safeTo
13f40 55 73 65 45 76 61 6c 4f 62 6a 76 28 69 6e 74 65  UseEvalObjv(inte
13f50 72 70 2c 20 70 53 63 72 69 70 74 29 3b 0a 20 20  rp, pScript);.  
13f60 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63    rc = sqlite3_c
13f70 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 70  reate_function(p
13f80 44 62 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20 6e  Db->db, zName, n
13f90 41 72 67 2c 20 66 6c 61 67 73 2c 0a 20 20 20 20  Arg, flags,.    
13fa0 20 20 20 20 70 46 75 6e 63 2c 20 74 63 6c 53 71      pFunc, tclSq
13fb0 6c 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20  lFunc, 0, 0);.  
13fc0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
13fd0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
13fe0 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  = TCL_ERROR;.   
13ff0 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74     Tcl_SetResult
14000 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a  (interp, (char *
14010 29 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28  )sqlite3_errmsg(
14020 70 44 62 2d 3e 64 62 29 2c 20 54 43 4c 5f 56 4f  pDb->db), TCL_VO
14030 4c 41 54 49 4c 45 29 3b 0a 20 20 20 20 7d 0a 20  LATILE);.    }. 
14040 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
14050 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62   /*.  **     $db
14060 20 69 6e 63 72 62 6c 6f 62 20 3f 2d 72 65 61 64   incrblob ?-read
14070 6f 6e 6c 79 3f 20 3f 44 42 3f 20 54 41 42 4c 45  only? ?DB? TABLE
14080 20 43 4f 4c 55 4d 4e 20 52 4f 57 49 44 0a 20 20   COLUMN ROWID.  
14090 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 49 4e 43  */.  case DB_INC
140a0 52 42 4c 4f 42 3a 20 7b 0a 23 69 66 64 65 66 20  RBLOB: {.#ifdef 
140b0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52  SQLITE_OMIT_INCR
140c0 42 4c 4f 42 0a 20 20 20 20 54 63 6c 5f 41 70 70  BLOB.    Tcl_App
140d0 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
140e0 2c 20 22 69 6e 63 72 62 6c 6f 62 20 6e 6f 74 20  , "incrblob not 
140f0 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 74 68 69  available in thi
14100 73 20 62 75 69 6c 64 22 2c 20 28 63 68 61 72 2a  s build", (char*
14110 29 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  )0);.    return 
14120 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65  TCL_ERROR;.#else
14130 0a 20 20 20 20 69 6e 74 20 69 73 52 65 61 64 6f  .    int isReado
14140 6e 6c 79 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e  nly = 0;.    con
14150 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 22  st char *zDb = "
14160 6d 61 69 6e 22 3b 0a 20 20 20 20 63 6f 6e 73 74  main";.    const
14170 20 63 68 61 72 20 2a 7a 54 61 62 6c 65 3b 0a 20   char *zTable;. 
14180 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
14190 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 54 63 6c 5f  Column;.    Tcl_
141a0 57 69 64 65 49 6e 74 20 69 52 6f 77 3b 0a 0a 20  WideInt iRow;.. 
141b0 20 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20     /* Check for 
141c0 74 68 65 20 2d 72 65 61 64 6f 6e 6c 79 20 6f 70  the -readonly op
141d0 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 66 28 20  tion */.    if( 
141e0 6f 62 6a 63 3e 33 20 26 26 20 73 74 72 63 6d 70  objc>3 && strcmp
141f0 28 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f  (Tcl_GetString(o
14200 62 6a 76 5b 32 5d 29 2c 20 22 2d 72 65 61 64 6f  bjv[2]), "-reado
14210 6e 6c 79 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  nly")==0 ){.    
14220 20 20 69 73 52 65 61 64 6f 6e 6c 79 20 3d 20 31    isReadonly = 1
14230 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
14240 20 6f 62 6a 63 21 3d 28 35 2b 69 73 52 65 61 64   objc!=(5+isRead
14250 6f 6e 6c 79 29 20 26 26 20 6f 62 6a 63 21 3d 28  only) && objc!=(
14260 36 2b 69 73 52 65 61 64 6f 6e 6c 79 29 20 29 7b  6+isReadonly) ){
14270 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  .      Tcl_Wrong
14280 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
14290 32 2c 20 6f 62 6a 76 2c 20 22 3f 2d 72 65 61 64  2, objv, "?-read
142a0 6f 6e 6c 79 3f 20 3f 44 42 3f 20 54 41 42 4c 45  only? ?DB? TABLE
142b0 20 43 4f 4c 55 4d 4e 20 52 4f 57 49 44 22 29 3b   COLUMN ROWID");
142c0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
142d0 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a  L_ERROR;.    }..
142e0 20 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d 28 36      if( objc==(6
142f0 2b 69 73 52 65 61 64 6f 6e 6c 79 29 20 29 7b 0a  +isReadonly) ){.
14300 20 20 20 20 20 20 7a 44 62 20 3d 20 54 63 6c 5f        zDb = Tcl_
14310 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32  GetString(objv[2
14320 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 54  ]);.    }.    zT
14330 61 62 6c 65 20 3d 20 54 63 6c 5f 47 65 74 53 74  able = Tcl_GetSt
14340 72 69 6e 67 28 6f 62 6a 76 5b 6f 62 6a 63 2d 33  ring(objv[objc-3
14350 5d 29 3b 0a 20 20 20 20 7a 43 6f 6c 75 6d 6e 20  ]);.    zColumn 
14360 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  = Tcl_GetString(
14370 6f 62 6a 76 5b 6f 62 6a 63 2d 32 5d 29 3b 0a 20  objv[objc-2]);. 
14380 20 20 20 72 63 20 3d 20 54 63 6c 5f 47 65 74 57     rc = Tcl_GetW
14390 69 64 65 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  ideIntFromObj(in
143a0 74 65 72 70 2c 20 6f 62 6a 76 5b 6f 62 6a 63 2d  terp, objv[objc-
143b0 31 5d 2c 20 26 69 52 6f 77 29 3b 0a 0a 20 20 20  1], &iRow);..   
143c0 20 69 66 28 20 72 63 3d 3d 54 43 4c 5f 4f 4b 20   if( rc==TCL_OK 
143d0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 63 72  ){.      rc = cr
143e0 65 61 74 65 49 6e 63 72 62 6c 6f 62 43 68 61 6e  eateIncrblobChan
143f0 6e 65 6c 28 0a 20 20 20 20 20 20 20 20 20 20 69  nel(.          i
14400 6e 74 65 72 70 2c 20 70 44 62 2c 20 7a 44 62 2c  nterp, pDb, zDb,
14410 20 7a 54 61 62 6c 65 2c 20 7a 43 6f 6c 75 6d 6e   zTable, zColumn
14420 2c 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  , (sqlite3_int64
14430 29 69 52 6f 77 2c 20 69 73 52 65 61 64 6f 6e 6c  )iRow, isReadonl
14440 79 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d  y.      );.    }
14450 0a 23 65 6e 64 69 66 0a 20 20 20 20 62 72 65 61  .#endif.    brea
14460 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  k;.  }..  /*.  *
14470 2a 20 20 20 20 20 24 64 62 20 69 6e 74 65 72 72  *     $db interr
14480 75 70 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e  upt.  **.  ** In
14490 74 65 72 72 75 70 74 20 74 68 65 20 65 78 65 63  terrupt the exec
144a0 75 74 69 6f 6e 20 6f 66 20 74 68 65 20 69 6e 6e  ution of the inn
144b0 65 72 2d 6d 6f 73 74 20 53 51 4c 20 69 6e 74 65  er-most SQL inte
144c0 72 70 72 65 74 65 72 2e 20 20 54 68 69 73 0a 20  rpreter.  This. 
144d0 20 2a 2a 20 63 61 75 73 65 73 20 74 68 65 20 53   ** causes the S
144e0 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20  QL statement to 
144f0 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20  return an error 
14500 6f 66 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52  of SQLITE_INTERR
14510 55 50 54 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  UPT..  */.  case
14520 20 44 42 5f 49 4e 54 45 52 52 55 50 54 3a 20 7b   DB_INTERRUPT: {
14530 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  .    sqlite3_int
14540 65 72 72 75 70 74 28 70 44 62 2d 3e 64 62 29 3b  errupt(pDb->db);
14550 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
14560 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24  .  /*.  **     $
14570 64 62 20 6e 75 6c 6c 76 61 6c 75 65 20 3f 53 54  db nullvalue ?ST
14580 52 49 4e 47 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20  RING?.  **.  ** 
14590 43 68 61 6e 67 65 20 74 65 78 74 20 75 73 65 64  Change text used
145a0 20 77 68 65 6e 20 61 20 4e 55 4c 4c 20 63 6f 6d   when a NULL com
145b0 65 73 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65  es back from the
145c0 20 64 61 74 61 62 61 73 65 2e 20 49 66 20 3f 53   database. If ?S
145d0 54 52 49 4e 47 3f 0a 20 20 2a 2a 20 69 73 20 6e  TRING?.  ** is n
145e0 6f 74 20 70 72 65 73 65 6e 74 2c 20 74 68 65 6e  ot present, then
145f0 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 74 72   the current str
14600 69 6e 67 20 75 73 65 64 20 66 6f 72 20 4e 55 4c  ing used for NUL
14610 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 20  L is returned.. 
14620 20 2a 2a 20 49 66 20 53 54 52 49 4e 47 20 69 73   ** If STRING is
14630 20 70 72 65 73 65 6e 74 2c 20 74 68 65 6e 20 53   present, then S
14640 54 52 49 4e 47 20 69 73 20 72 65 74 75 72 6e 65  TRING is returne
14650 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2f 0a 20 20 63  d..  **.  */.  c
14660 61 73 65 20 44 42 5f 4e 55 4c 4c 56 41 4c 55 45  ase DB_NULLVALUE
14670 3a 20 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63  : {.    if( objc
14680 21 3d 32 20 26 26 20 6f 62 6a 63 21 3d 33 20 29  !=2 && objc!=3 )
14690 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e  {.      Tcl_Wron
146a0 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
146b0 20 32 2c 20 6f 62 6a 76 2c 20 22 4e 55 4c 4c 56   2, objv, "NULLV
146c0 41 4c 55 45 22 29 3b 0a 20 20 20 20 20 20 72 65  ALUE");.      re
146d0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
146e0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 62      }.    if( ob
146f0 6a 63 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20 69  jc==3 ){.      i
14700 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20 63 68  nt len;.      ch
14710 61 72 20 2a 7a 4e 75 6c 6c 20 3d 20 54 63 6c 5f  ar *zNull = Tcl_
14720 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
14730 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b  (objv[2], &len);
14740 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e  .      if( pDb->
14750 7a 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20  zNull ){.       
14760 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a   Tcl_Free(pDb->z
14770 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Null);.      }. 
14780 20 20 20 20 20 69 66 28 20 7a 4e 75 6c 6c 20 26       if( zNull &
14790 26 20 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20  & len>0 ){.     
147a0 20 20 20 70 44 62 2d 3e 7a 4e 75 6c 6c 20 3d 20     pDb->zNull = 
147b0 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b  Tcl_Alloc( len +
147c0 20 31 20 29 3b 0a 20 20 20 20 20 20 20 20 6d 65   1 );.        me
147d0 6d 63 70 79 28 70 44 62 2d 3e 7a 4e 75 6c 6c 2c  mcpy(pDb->zNull,
147e0 20 7a 4e 75 6c 6c 2c 20 6c 65 6e 29 3b 0a 20 20   zNull, len);.  
147f0 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e 75 6c 6c        pDb->zNull
14800 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a 20 20  [len] = '\0';.  
14810 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
14820 20 20 20 70 44 62 2d 3e 7a 4e 75 6c 6c 20 3d 20     pDb->zNull = 
14830 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
14840 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  .    Tcl_SetObjR
14850 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
14860 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70  l_NewStringObj(p
14870 44 62 2d 3e 7a 4e 75 6c 6c 2c 20 2d 31 29 29 3b  Db->zNull, -1));
14880 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
14890 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24  .  /*.  **     $
148a0 64 62 20 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72  db last_insert_r
148b0 6f 77 69 64 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52  owid.  **.  ** R
148c0 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72  eturn an integer
148d0 20 77 68 69 63 68 20 69 73 20 74 68 65 20 52 4f   which is the RO
148e0 57 49 44 20 66 6f 72 20 74 68 65 20 6d 6f 73 74  WID for the most
148f0 20 72 65 63 65 6e 74 20 69 6e 73 65 72 74 2e 0a   recent insert..
14900 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 4c    */.  case DB_L
14910 41 53 54 5f 49 4e 53 45 52 54 5f 52 4f 57 49 44  AST_INSERT_ROWID
14920 3a 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20  : {.    Tcl_Obj 
14930 2a 70 52 65 73 75 6c 74 3b 0a 20 20 20 20 54 63  *pResult;.    Tc
14940 6c 5f 57 69 64 65 49 6e 74 20 72 6f 77 69 64 3b  l_WideInt rowid;
14950 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 32  .    if( objc!=2
14960 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72   ){.      Tcl_Wr
14970 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
14980 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 22 29 3b  p, 2, objv, "");
14990 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
149a0 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
149b0 20 20 20 72 6f 77 69 64 20 3d 20 73 71 6c 69 74     rowid = sqlit
149c0 65 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72  e3_last_insert_r
149d0 6f 77 69 64 28 70 44 62 2d 3e 64 62 29 3b 0a 20  owid(pDb->db);. 
149e0 20 20 20 70 52 65 73 75 6c 74 20 3d 20 54 63 6c     pResult = Tcl
149f0 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _GetObjResult(in
14a00 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f 53  terp);.    Tcl_S
14a10 65 74 57 69 64 65 49 6e 74 4f 62 6a 28 70 52 65  etWideIntObj(pRe
14a20 73 75 6c 74 2c 20 72 6f 77 69 64 29 3b 0a 20 20  sult, rowid);.  
14a30 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
14a40 2f 2a 0a 20 20 2a 2a 20 54 68 65 20 44 42 5f 4f  /*.  ** The DB_O
14a50 4e 45 43 4f 4c 55 4d 4e 20 6d 65 74 68 6f 64 20  NECOLUMN method 
14a60 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 74  is implemented t
14a70 6f 67 65 74 68 65 72 20 77 69 74 68 20 44 42 5f  ogether with DB_
14a80 45 58 49 53 54 53 2e 0a 20 20 2a 2f 0a 0a 20 20  EXISTS..  */..  
14a90 2f 2a 20 20 20 20 24 64 62 20 70 72 6f 67 72 65  /*    $db progre
14aa0 73 73 20 3f 4e 20 43 41 4c 4c 42 41 43 4b 3f 0a  ss ?N CALLBACK?.
14ab0 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 76 6f 6b 65    **.  ** Invoke
14ac0 20 74 68 65 20 67 69 76 65 6e 20 63 61 6c 6c 62   the given callb
14ad0 61 63 6b 20 65 76 65 72 79 20 4e 20 76 69 72 74  ack every N virt
14ae0 75 61 6c 20 6d 61 63 68 69 6e 65 20 6f 70 63 6f  ual machine opco
14af0 64 65 73 20 77 68 69 6c 65 20 65 78 65 63 75 74  des while execut
14b00 69 6e 67 0a 20 20 2a 2a 20 71 75 65 72 69 65 73  ing.  ** queries
14b10 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  ..  */.  case DB
14b20 5f 50 52 4f 47 52 45 53 53 3a 20 7b 0a 20 20 20  _PROGRESS: {.   
14b30 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a   if( objc==2 ){.
14b40 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a        if( pDb->z
14b50 50 72 6f 67 72 65 73 73 20 29 7b 0a 20 20 20 20  Progress ){.    
14b60 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
14b70 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 44 62  sult(interp, pDb
14b80 2d 3e 7a 50 72 6f 67 72 65 73 73 2c 20 28 63 68  ->zProgress, (ch
14b90 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 7d 0a  ar*)0);.      }.
14ba0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 62      }else if( ob
14bb0 6a 63 3d 3d 34 20 29 7b 0a 20 20 20 20 20 20 63  jc==4 ){.      c
14bc0 68 61 72 20 2a 7a 50 72 6f 67 72 65 73 73 3b 0a  har *zProgress;.
14bd0 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20        int len;. 
14be0 20 20 20 20 20 69 6e 74 20 4e 3b 0a 20 20 20 20       int N;.    
14bf0 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63    if( TCL_OK!=Tc
14c00 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
14c10 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c  interp, objv[2],
14c20 20 26 4e 29 20 29 7b 0a 20 20 20 20 20 20 20 20   &N) ){.        
14c30 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
14c40 3b 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20  ;.      };.     
14c50 20 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f 67 72   if( pDb->zProgr
14c60 65 73 73 20 29 7b 0a 20 20 20 20 20 20 20 20 54  ess ){.        T
14c70 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 50 72  cl_Free(pDb->zPr
14c80 6f 67 72 65 73 73 29 3b 0a 20 20 20 20 20 20 7d  ogress);.      }
14c90 0a 20 20 20 20 20 20 7a 50 72 6f 67 72 65 73 73  .      zProgress
14ca0 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
14cb0 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d 2c  FromObj(objv[3],
14cc0 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69 66   &len);.      if
14cd0 28 20 7a 50 72 6f 67 72 65 73 73 20 26 26 20 6c  ( zProgress && l
14ce0 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  en>0 ){.        
14cf0 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 20 3d  pDb->zProgress =
14d00 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20   Tcl_Alloc( len 
14d10 2b 20 31 20 29 3b 0a 20 20 20 20 20 20 20 20 6d  + 1 );.        m
14d20 65 6d 63 70 79 28 70 44 62 2d 3e 7a 50 72 6f 67  emcpy(pDb->zProg
14d30 72 65 73 73 2c 20 7a 50 72 6f 67 72 65 73 73 2c  ress, zProgress,
14d40 20 6c 65 6e 2b 31 29 3b 0a 20 20 20 20 20 20 7d   len+1);.      }
14d50 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 44  else{.        pD
14d60 62 2d 3e 7a 50 72 6f 67 72 65 73 73 20 3d 20 30  b->zProgress = 0
14d70 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65  ;.      }.#ifnde
14d80 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 52  f SQLITE_OMIT_PR
14d90 4f 47 52 45 53 53 5f 43 41 4c 4c 42 41 43 4b 0a  OGRESS_CALLBACK.
14da0 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a        if( pDb->z
14db0 50 72 6f 67 72 65 73 73 20 29 7b 0a 20 20 20 20  Progress ){.    
14dc0 20 20 20 20 70 44 62 2d 3e 69 6e 74 65 72 70 20      pDb->interp 
14dd0 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 20 20  = interp;.      
14de0 20 20 73 71 6c 69 74 65 33 5f 70 72 6f 67 72 65    sqlite3_progre
14df0 73 73 5f 68 61 6e 64 6c 65 72 28 70 44 62 2d 3e  ss_handler(pDb->
14e00 64 62 2c 20 4e 2c 20 44 62 50 72 6f 67 72 65 73  db, N, DbProgres
14e10 73 48 61 6e 64 6c 65 72 2c 20 70 44 62 29 3b 0a  sHandler, pDb);.
14e20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
14e30 20 20 20 20 20 73 71 6c 69 74 65 33 5f 70 72 6f       sqlite3_pro
14e40 67 72 65 73 73 5f 68 61 6e 64 6c 65 72 28 70 44  gress_handler(pD
14e50 62 2d 3e 64 62 2c 20 30 2c 20 30 2c 20 30 29 3b  b->db, 0, 0, 0);
14e60 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
14e70 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
14e80 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
14e90 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a  s(interp, 2, obj
14ea0 76 2c 20 22 4e 20 43 41 4c 4c 42 41 43 4b 22 29  v, "N CALLBACK")
14eb0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
14ec0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
14ed0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
14ee0 20 20 2f 2a 20 20 20 20 24 64 62 20 70 72 6f 66    /*    $db prof
14ef0 69 6c 65 20 3f 43 41 4c 4c 42 41 43 4b 3f 0a 20  ile ?CALLBACK?. 
14f00 20 2a 2a 0a 20 20 2a 2a 20 4d 61 6b 65 20 61 72   **.  ** Make ar
14f10 72 61 6e 67 65 6d 65 6e 74 73 20 74 6f 20 69 6e  rangements to in
14f20 76 6f 6b 65 20 74 68 65 20 43 41 4c 4c 42 41 43  voke the CALLBAC
14f30 4b 20 72 6f 75 74 69 6e 65 20 61 66 74 65 72 20  K routine after 
14f40 65 61 63 68 20 53 51 4c 20 73 74 61 74 65 6d 65  each SQL stateme
14f50 6e 74 0a 20 20 2a 2a 20 74 68 61 74 20 68 61 73  nt.  ** that has
14f60 20 72 75 6e 2e 20 20 54 68 65 20 74 65 78 74 20   run.  The text 
14f70 6f 66 20 74 68 65 20 53 51 4c 20 61 6e 64 20 74  of the SQL and t
14f80 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 65 6c 61  he amount of ela
14f90 70 73 65 20 74 69 6d 65 20 61 72 65 0a 20 20 2a  pse time are.  *
14fa0 2a 20 61 70 70 65 6e 64 65 64 20 74 6f 20 43 41  * appended to CA
14fb0 4c 4c 42 41 43 4b 20 62 65 66 6f 72 65 20 74 68  LLBACK before th
14fc0 65 20 73 63 72 69 70 74 20 69 73 20 72 75 6e 2e  e script is run.
14fd0 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f  .  */.  case DB_
14fe0 50 52 4f 46 49 4c 45 3a 20 7b 0a 20 20 20 20 69  PROFILE: {.    i
14ff0 66 28 20 6f 62 6a 63 3e 33 20 29 7b 0a 20 20 20  f( objc>3 ){.   
15000 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
15010 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
15020 62 6a 76 2c 20 22 3f 43 41 4c 4c 42 41 43 4b 3f  bjv, "?CALLBACK?
15030 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
15040 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
15050 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d  }else if( objc==
15060 32 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  2 ){.      if( p
15070 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 20 29 7b 0a  Db->zProfile ){.
15080 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65          Tcl_Appe
15090 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
150a0 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 2c 20   pDb->zProfile, 
150b0 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20  (char*)0);.     
150c0 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
150d0 20 20 20 20 63 68 61 72 20 2a 7a 50 72 6f 66 69      char *zProfi
150e0 6c 65 3b 0a 20 20 20 20 20 20 69 6e 74 20 6c 65  le;.      int le
150f0 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62  n;.      if( pDb
15100 2d 3e 7a 50 72 6f 66 69 6c 65 20 29 7b 0a 20 20  ->zProfile ){.  
15110 20 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70        Tcl_Free(p
15120 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 29 3b 0a 20  Db->zProfile);. 
15130 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 50 72       }.      zPr
15140 6f 66 69 6c 65 20 3d 20 54 63 6c 5f 47 65 74 53  ofile = Tcl_GetS
15150 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
15160 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20 20  v[2], &len);.   
15170 20 20 20 69 66 28 20 7a 50 72 6f 66 69 6c 65 20     if( zProfile 
15180 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20  && len>0 ){.    
15190 20 20 20 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c      pDb->zProfil
151a0 65 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c  e = Tcl_Alloc( l
151b0 65 6e 20 2b 20 31 20 29 3b 0a 20 20 20 20 20 20  en + 1 );.      
151c0 20 20 6d 65 6d 63 70 79 28 70 44 62 2d 3e 7a 50    memcpy(pDb->zP
151d0 72 6f 66 69 6c 65 2c 20 7a 50 72 6f 66 69 6c 65  rofile, zProfile
151e0 2c 20 6c 65 6e 2b 31 29 3b 0a 20 20 20 20 20 20  , len+1);.      
151f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
15200 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 20 3d 20 30  Db->zProfile = 0
15210 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 20 21 64  ;.      }.#if !d
15220 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
15230 49 54 5f 54 52 41 43 45 29 20 26 26 20 21 64 65  IT_TRACE) && !de
15240 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
15250 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54  T_FLOATING_POINT
15260 29 20 26 26 20 5c 0a 20 20 20 20 21 64 65 66 69  ) && \.    !defi
15270 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
15280 44 45 50 52 45 43 41 54 45 44 29 0a 20 20 20 20  DEPRECATED).    
15290 20 20 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f 66    if( pDb->zProf
152a0 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ile ){.        p
152b0 44 62 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74  Db->interp = int
152c0 65 72 70 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  erp;.        sql
152d0 69 74 65 33 5f 70 72 6f 66 69 6c 65 28 70 44 62  ite3_profile(pDb
152e0 2d 3e 64 62 2c 20 44 62 50 72 6f 66 69 6c 65 48  ->db, DbProfileH
152f0 61 6e 64 6c 65 72 2c 20 70 44 62 29 3b 0a 20 20  andler, pDb);.  
15300 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
15310 20 20 20 73 71 6c 69 74 65 33 5f 70 72 6f 66 69     sqlite3_profi
15320 6c 65 28 70 44 62 2d 3e 64 62 2c 20 30 2c 20 30  le(pDb->db, 0, 0
15330 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
15340 66 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61  f.    }.    brea
15350 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  k;.  }..  /*.  *
15360 2a 20 20 20 20 20 24 64 62 20 72 65 6b 65 79 20  *     $db rekey 
15370 4b 45 59 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 68  KEY.  **.  ** Ch
15380 61 6e 67 65 20 74 68 65 20 65 6e 63 72 79 70 74  ange the encrypt
15390 69 6f 6e 20 6b 65 79 20 6f 6e 20 74 68 65 20 63  ion key on the c
153a0 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e 20 64 61  urrently open da
153b0 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 63  tabase..  */.  c
153c0 61 73 65 20 44 42 5f 52 45 4b 45 59 3a 20 7b 0a  ase DB_REKEY: {.
153d0 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
153e0 54 45 5f 48 41 53 5f 43 4f 44 45 43 29 20 26 26  TE_HAS_CODEC) &&
153f0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
15400 5f 4f 4d 49 54 5f 43 4f 44 45 43 5f 46 52 4f 4d  _OMIT_CODEC_FROM
15410 5f 54 43 4c 29 0a 20 20 20 20 69 6e 74 20 6e 4b  _TCL).    int nK
15420 65 79 3b 0a 20 20 20 20 76 6f 69 64 20 2a 70 4b  ey;.    void *pK
15430 65 79 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69  ey;.#endif.    i
15440 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20  f( objc!=3 ){.  
15450 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
15460 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20  Args(interp, 2, 
15470 6f 62 6a 76 2c 20 22 4b 45 59 22 29 3b 0a 20 20  objv, "KEY");.  
15480 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
15490 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 23 69 66 20  RROR;.    }.#if 
154a0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 48  defined(SQLITE_H
154b0 41 53 5f 43 4f 44 45 43 29 20 26 26 20 21 64 65  AS_CODEC) && !de
154c0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
154d0 54 5f 43 4f 44 45 43 5f 46 52 4f 4d 5f 54 43 4c  T_CODEC_FROM_TCL
154e0 29 0a 20 20 20 20 70 4b 65 79 20 3d 20 54 63 6c  ).    pKey = Tcl
154f0 5f 47 65 74 42 79 74 65 41 72 72 61 79 46 72 6f  _GetByteArrayFro
15500 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6e  mObj(objv[2], &n
15510 4b 65 79 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  Key);.    rc = s
15520 71 6c 69 74 65 33 5f 72 65 6b 65 79 28 70 44 62  qlite3_rekey(pDb
15530 2d 3e 64 62 2c 20 70 4b 65 79 2c 20 6e 4b 65 79  ->db, pKey, nKey
15540 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  );.    if( rc ){
15550 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  .      Tcl_Appen
15560 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
15570 73 71 6c 69 74 65 33 5f 65 72 72 73 74 72 28 72  sqlite3_errstr(r
15580 63 29 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20  c), (char*)0);. 
15590 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45 52       rc = TCL_ER
155a0 52 4f 52 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  ROR;.    }.#endi
155b0 66 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  f.    break;.  }
155c0 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 72 65  ..  /*    $db re
155d0 73 74 6f 72 65 20 3f 44 41 54 41 42 41 53 45 3f  store ?DATABASE?
155e0 20 46 49 4c 45 4e 41 4d 45 0a 20 20 2a 2a 0a 20   FILENAME.  **. 
155f0 20 2a 2a 20 4f 70 65 6e 20 61 20 64 61 74 61 62   ** Open a datab
15600 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 64 20 46  ase file named F
15610 49 4c 45 4e 41 4d 45 2e 20 20 54 72 61 6e 73 66  ILENAME.  Transf
15620 65 72 20 74 68 65 20 63 6f 6e 74 65 6e 74 0a 20  er the content. 
15630 20 2a 2a 20 6f 66 20 46 49 4c 45 4e 41 4d 45 20   ** of FILENAME 
15640 69 6e 74 6f 20 74 68 65 20 6c 6f 63 61 6c 20 64  into the local d
15650 61 74 61 62 61 73 65 20 44 41 54 41 42 41 53 45  atabase DATABASE
15660 20 28 64 65 66 61 75 6c 74 3a 20 22 6d 61 69 6e   (default: "main
15670 22 29 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  ")..  */.  case 
15680 44 42 5f 52 45 53 54 4f 52 45 3a 20 7b 0a 20 20  DB_RESTORE: {.  
15690 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
156a0 72 63 46 69 6c 65 3b 0a 20 20 20 20 63 6f 6e 73  rcFile;.    cons
156b0 74 20 63 68 61 72 20 2a 7a 44 65 73 74 44 62 3b  t char *zDestDb;
156c0 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 70 53  .    sqlite3 *pS
156d0 72 63 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  rc;.    sqlite3_
156e0 62 61 63 6b 75 70 20 2a 70 42 61 63 6b 75 70 3b  backup *pBackup;
156f0 0a 20 20 20 20 69 6e 74 20 6e 54 69 6d 65 6f 75  .    int nTimeou
15700 74 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20  t = 0;..    if( 
15710 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20 20 20 20 20  objc==3 ){.     
15720 20 7a 44 65 73 74 44 62 20 3d 20 22 6d 61 69 6e   zDestDb = "main
15730 22 3b 0a 20 20 20 20 20 20 7a 53 72 63 46 69 6c  ";.      zSrcFil
15740 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  e = Tcl_GetStrin
15750 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 20 20  g(objv[2]);.    
15760 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d  }else if( objc==
15770 34 20 29 7b 0a 20 20 20 20 20 20 7a 44 65 73 74  4 ){.      zDest
15780 44 62 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  Db = Tcl_GetStri
15790 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 20  ng(objv[2]);.   
157a0 20 20 20 7a 53 72 63 46 69 6c 65 20 3d 20 54 63     zSrcFile = Tc
157b0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
157c0 5b 33 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  [3]);.    }else{
157d0 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  .      Tcl_Wrong
157e0 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
157f0 32 2c 20 6f 62 6a 76 2c 20 22 3f 44 41 54 41 42  2, objv, "?DATAB
15800 41 53 45 3f 20 46 49 4c 45 4e 41 4d 45 22 29 3b  ASE? FILENAME");
15810 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
15820 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
15830 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
15840 6f 70 65 6e 5f 76 32 28 7a 53 72 63 46 69 6c 65  open_v2(zSrcFile
15850 2c 20 26 70 53 72 63 2c 0a 20 20 20 20 20 20 20  , &pSrc,.       
15860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15870 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45    SQLITE_OPEN_RE
15880 41 44 4f 4e 4c 59 20 7c 20 70 44 62 2d 3e 6f 70  ADONLY | pDb->op
15890 65 6e 46 6c 61 67 73 2c 20 30 29 3b 0a 20 20 20  enFlags, 0);.   
158a0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
158b0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  OK ){.      Tcl_
158c0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
158d0 65 72 70 2c 20 22 63 61 6e 6e 6f 74 20 6f 70 65  erp, "cannot ope
158e0 6e 20 73 6f 75 72 63 65 20 64 61 74 61 62 61 73  n source databas
158f0 65 3a 20 22 2c 0a 20 20 20 20 20 20 20 20 20 20  e: ",.          
15900 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
15910 70 53 72 63 29 2c 20 28 63 68 61 72 2a 29 30 29  pSrc), (char*)0)
15920 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
15930 63 6c 6f 73 65 28 70 53 72 63 29 3b 0a 20 20 20  close(pSrc);.   
15940 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
15950 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ROR;.    }.    p
15960 42 61 63 6b 75 70 20 3d 20 73 71 6c 69 74 65 33  Backup = sqlite3
15970 5f 62 61 63 6b 75 70 5f 69 6e 69 74 28 70 44 62  _backup_init(pDb
15980 2d 3e 64 62 2c 20 7a 44 65 73 74 44 62 2c 20 70  ->db, zDestDb, p
15990 53 72 63 2c 20 22 6d 61 69 6e 22 29 3b 0a 20 20  Src, "main");.  
159a0 20 20 69 66 28 20 70 42 61 63 6b 75 70 3d 3d 30    if( pBackup==0
159b0 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70   ){.      Tcl_Ap
159c0 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
159d0 70 2c 20 22 72 65 73 74 6f 72 65 20 66 61 69 6c  p, "restore fail
159e0 65 64 3a 20 22 2c 0a 20 20 20 20 20 20 20 20 20  ed: ",.         
159f0 20 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67    sqlite3_errmsg
15a00 28 70 44 62 2d 3e 64 62 29 2c 20 28 63 68 61 72  (pDb->db), (char
15a10 2a 29 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  *)0);.      sqli
15a20 74 65 33 5f 63 6c 6f 73 65 28 70 53 72 63 29 3b  te3_close(pSrc);
15a30 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
15a40 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
15a50 20 20 20 77 68 69 6c 65 28 20 28 72 63 20 3d 20     while( (rc = 
15a60 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f 73  sqlite3_backup_s
15a70 74 65 70 28 70 42 61 63 6b 75 70 2c 31 30 30 29  tep(pBackup,100)
15a80 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20  )==SQLITE_OK.   
15a90 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 72 63             || rc
15aa0 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b  ==SQLITE_BUSY ){
15ab0 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
15ac0 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20  QLITE_BUSY ){.  
15ad0 20 20 20 20 20 20 69 66 28 20 6e 54 69 6d 65 6f        if( nTimeo
15ae0 75 74 2b 2b 20 3e 3d 20 33 20 29 20 62 72 65 61  ut++ >= 3 ) brea
15af0 6b 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  k;.        sqlit
15b00 65 33 5f 73 6c 65 65 70 28 31 30 30 29 3b 0a 20  e3_sleep(100);. 
15b10 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
15b20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f   sqlite3_backup_
15b30 66 69 6e 69 73 68 28 70 42 61 63 6b 75 70 29 3b  finish(pBackup);
15b40 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
15b50 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20  ITE_DONE ){.    
15b60 20 20 72 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20    rc = TCL_OK;. 
15b70 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d     }else if( rc=
15b80 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 7c 7c 20  =SQLITE_BUSY || 
15b90 72 63 3d 3d 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  rc==SQLITE_LOCKE
15ba0 44 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41  D ){.      Tcl_A
15bb0 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
15bc0 72 70 2c 20 22 72 65 73 74 6f 72 65 20 66 61 69  rp, "restore fai
15bd0 6c 65 64 3a 20 73 6f 75 72 63 65 20 64 61 74 61  led: source data
15be0 62 61 73 65 20 62 75 73 79 22 2c 0a 20 20 20 20  base busy",.    
15bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15c00 20 20 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20     (char*)0);.  
15c10 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45 52 52      rc = TCL_ERR
15c20 4f 52 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  OR;.    }else{. 
15c30 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
15c40 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 72  esult(interp, "r
15c50 65 73 74 6f 72 65 20 66 61 69 6c 65 64 3a 20 22  estore failed: "
15c60 2c 0a 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  ,.           sql
15c70 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d  ite3_errmsg(pDb-
15c80 3e 64 62 29 2c 20 28 63 68 61 72 2a 29 30 29 3b  >db), (char*)0);
15c90 0a 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f  .      rc = TCL_
15ca0 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
15cb0 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70   sqlite3_close(p
15cc0 53 72 63 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b  Src);.    break;
15cd0 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
15ce0 20 20 20 20 24 64 62 20 73 74 61 74 75 73 20 28      $db status (
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 0a 20 20 2a 2a 0a 20 20 2a 2a 20 44  dex).  **.  ** D
15d10 69 73 70 6c 61 79 20 53 51 4c 49 54 45 5f 53 54  isplay SQLITE_ST
15d20 4d 54 53 54 41 54 55 53 5f 46 55 4c 4c 53 43 41  MTSTATUS_FULLSCA
15d30 4e 5f 53 54 45 50 20 6f 72 0a 20 20 2a 2a 20 53  N_STEP or.  ** S
15d40 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53  QLITE_STMTSTATUS
15d50 5f 53 4f 52 54 20 66 6f 72 20 74 68 65 20 6d 6f  _SORT for the mo
15d60 73 74 20 72 65 63 65 6e 74 20 65 76 61 6c 2e 0a  st recent eval..
15d70 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 53    */.  case DB_S
15d80 54 41 54 55 53 3a 20 7b 0a 20 20 20 20 69 6e 74  TATUS: {.    int
15d90 20 76 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   v;.    const ch
15da0 61 72 20 2a 7a 4f 70 3b 0a 20 20 20 20 69 66 28  ar *zOp;.    if(
15db0 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20   objc!=3 ){.    
15dc0 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
15dd0 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62  gs(interp, 2, ob
15de0 6a 76 2c 20 22 28 73 74 65 70 7c 73 6f 72 74 7c  jv, "(step|sort|
15df0 61 75 74 6f 69 6e 64 65 78 29 22 29 3b 0a 20 20  autoindex)");.  
15e00 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
15e10 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
15e20 7a 4f 70 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  zOp = Tcl_GetStr
15e30 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20  ing(objv[2]);.  
15e40 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4f 70    if( strcmp(zOp
15e50 2c 20 22 73 74 65 70 22 29 3d 3d 30 20 29 7b 0a  , "step")==0 ){.
15e60 20 20 20 20 20 20 76 20 3d 20 70 44 62 2d 3e 6e        v = pDb->n
15e70 53 74 65 70 3b 0a 20 20 20 20 7d 65 6c 73 65 20  Step;.    }else 
15e80 69 66 28 20 73 74 72 63 6d 70 28 7a 4f 70 2c 20  if( strcmp(zOp, 
15e90 22 73 6f 72 74 22 29 3d 3d 30 20 29 7b 0a 20 20  "sort")==0 ){.  
15ea0 20 20 20 20 76 20 3d 20 70 44 62 2d 3e 6e 53 6f      v = pDb->nSo
15eb0 72 74 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  rt;.    }else if
15ec0 28 20 73 74 72 63 6d 70 28 7a 4f 70 2c 20 22 61  ( strcmp(zOp, "a
15ed0 75 74 6f 69 6e 64 65 78 22 29 3d 3d 30 20 29 7b  utoindex")==0 ){
15ee0 0a 20 20 20 20 20 20 76 20 3d 20 70 44 62 2d 3e  .      v = pDb->
15ef0 6e 49 6e 64 65 78 3b 0a 20 20 20 20 7d 65 6c 73  nIndex;.    }els
15f00 65 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70  e{.      Tcl_App
15f10 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
15f20 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 62  ,.            "b
15f30 61 64 20 61 72 67 75 6d 65 6e 74 3a 20 73 68 6f  ad argument: sho
15f40 75 6c 64 20 62 65 20 61 75 74 6f 69 6e 64 65 78  uld be autoindex
15f50 2c 20 73 74 65 70 2c 20 6f 72 20 73 6f 72 74 22  , step, or sort"
15f60 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 63  ,.            (c
15f70 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 72  har*)0);.      r
15f80 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
15f90 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 53  .    }.    Tcl_S
15fa0 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
15fb0 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  rp, Tcl_NewIntOb
15fc0 6a 28 76 29 29 3b 0a 20 20 20 20 62 72 65 61 6b  j(v));.    break
15fd0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ;.  }..  /*.  **
15fe0 20 20 20 20 20 24 64 62 20 74 69 6d 65 6f 75 74       $db timeout
15ff0 20 4d 49 4c 4c 45 53 45 43 4f 4e 44 53 0a 20 20   MILLESECONDS.  
16000 2a 2a 0a 20 20 2a 2a 20 44 65 6c 61 79 20 66 6f  **.  ** Delay fo
16010 72 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  r the number of 
16020 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 73 70 65  milliseconds spe
16030 63 69 66 69 65 64 20 77 68 65 6e 20 61 20 66 69  cified when a fi
16040 6c 65 20 69 73 20 6c 6f 63 6b 65 64 2e 0a 20 20  le is locked..  
16050 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 54 49 4d  */.  case DB_TIM
16060 45 4f 55 54 3a 20 7b 0a 20 20 20 20 69 6e 74 20  EOUT: {.    int 
16070 6d 73 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63  ms;.    if( objc
16080 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  !=3 ){.      Tcl
16090 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
160a0 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22  terp, 2, objv, "
160b0 4d 49 4c 4c 49 53 45 43 4f 4e 44 53 22 29 3b 0a  MILLISECONDS");.
160c0 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
160d0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
160e0 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
160f0 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
16100 6f 62 6a 76 5b 32 5d 2c 20 26 6d 73 29 20 29 20  objv[2], &ms) ) 
16110 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
16120 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 75  ;.    sqlite3_bu
16130 73 79 5f 74 69 6d 65 6f 75 74 28 70 44 62 2d 3e  sy_timeout(pDb->
16140 64 62 2c 20 6d 73 29 3b 0a 20 20 20 20 62 72 65  db, ms);.    bre
16150 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  ak;.  }..  /*.  
16160 2a 2a 20 20 20 20 20 24 64 62 20 74 6f 74 61 6c  **     $db total
16170 5f 63 68 61 6e 67 65 73 0a 20 20 2a 2a 0a 20 20  _changes.  **.  
16180 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
16190 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61  mber of rows tha
161a0 74 20 77 65 72 65 20 6d 6f 64 69 66 69 65 64 2c  t were modified,
161b0 20 69 6e 73 65 72 74 65 64 2c 20 6f 72 20 64 65   inserted, or de
161c0 6c 65 74 65 64 0a 20 20 2a 2a 20 73 69 6e 63 65  leted.  ** since
161d0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
161e0 6e 64 6c 65 20 77 61 73 20 63 72 65 61 74 65 64  ndle was created
161f0 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  ..  */.  case DB
16200 5f 54 4f 54 41 4c 5f 43 48 41 4e 47 45 53 3a 20  _TOTAL_CHANGES: 
16210 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  {.    Tcl_Obj *p
16220 52 65 73 75 6c 74 3b 0a 20 20 20 20 69 66 28 20  Result;.    if( 
16230 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 20  objc!=2 ){.     
16240 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
16250 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a  s(interp, 2, obj
16260 76 2c 20 22 22 29 3b 0a 20 20 20 20 20 20 72 65  v, "");.      re
16270 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
16280 20 20 20 20 7d 0a 20 20 20 20 70 52 65 73 75 6c      }.    pResul
16290 74 20 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65  t = Tcl_GetObjRe
162a0 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  sult(interp);.  
162b0 20 20 54 63 6c 5f 53 65 74 49 6e 74 4f 62 6a 28    Tcl_SetIntObj(
162c0 70 52 65 73 75 6c 74 2c 20 73 71 6c 69 74 65 33  pResult, sqlite3
162d0 5f 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73 28 70  _total_changes(p
162e0 44 62 2d 3e 64 62 29 29 3b 0a 20 20 20 20 62 72  Db->db));.    br
162f0 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20  eak;.  }..  /*  
16300 20 20 24 64 62 20 74 72 61 63 65 20 3f 43 41 4c    $db trace ?CAL
16310 4c 42 41 43 4b 3f 0a 20 20 2a 2a 0a 20 20 2a 2a  LBACK?.  **.  **
16320 20 4d 61 6b 65 20 61 72 72 61 6e 67 65 6d 65 6e   Make arrangemen
16330 74 73 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65  ts to invoke the
16340 20 43 41 4c 4c 42 41 43 4b 20 72 6f 75 74 69 6e   CALLBACK routin
16350 65 20 66 6f 72 20 65 61 63 68 20 53 51 4c 20 73  e for each SQL s
16360 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 68  tatement.  ** th
16370 61 74 20 69 73 20 65 78 65 63 75 74 65 64 2e 20  at is executed. 
16380 20 54 68 65 20 74 65 78 74 20 6f 66 20 74 68 65   The text of the
16390 20 53 51 4c 20 69 73 20 61 70 70 65 6e 64 65 64   SQL is appended
163a0 20 74 6f 20 43 41 4c 4c 42 41 43 4b 20 62 65 66   to CALLBACK bef
163b0 6f 72 65 0a 20 20 2a 2a 20 69 74 20 69 73 20 65  ore.  ** it is e
163c0 78 65 63 75 74 65 64 2e 0a 20 20 2a 2f 0a 20 20  xecuted..  */.  
163d0 63 61 73 65 20 44 42 5f 54 52 41 43 45 3a 20 7b  case DB_TRACE: {
163e0 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 33 20  .    if( objc>3 
163f0 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f  ){.      Tcl_Wro
16400 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
16410 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 43 41 4c  , 2, objv, "?CAL
16420 4c 42 41 43 4b 3f 22 29 3b 0a 20 20 20 20 20 20  LBACK?");.      
16430 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
16440 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
16450 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20 20  objc==2 ){.     
16460 20 69 66 28 20 70 44 62 2d 3e 7a 54 72 61 63 65   if( pDb->zTrace
16470 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f   ){.        Tcl_
16480 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
16490 65 72 70 2c 20 70 44 62 2d 3e 7a 54 72 61 63 65  erp, pDb->zTrace
164a0 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20  , (char*)0);.   
164b0 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
164c0 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 72 61        char *zTra
164d0 63 65 3b 0a 20 20 20 20 20 20 69 6e 74 20 6c 65  ce;.      int le
164e0 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62  n;.      if( pDb
164f0 2d 3e 7a 54 72 61 63 65 20 29 7b 0a 20 20 20 20  ->zTrace ){.    
16500 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62      Tcl_Free(pDb
16510 2d 3e 7a 54 72 61 63 65 29 3b 0a 20 20 20 20 20  ->zTrace);.     
16520 20 7d 0a 20 20 20 20 20 20 7a 54 72 61 63 65 20   }.      zTrace 
16530 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  = Tcl_GetStringF
16540 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20  romObj(objv[2], 
16550 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28  &len);.      if(
16560 20 7a 54 72 61 63 65 20 26 26 20 6c 65 6e 3e 30   zTrace && len>0
16570 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d   ){.        pDb-
16580 3e 7a 54 72 61 63 65 20 3d 20 54 63 6c 5f 41 6c  >zTrace = Tcl_Al
16590 6c 6f 63 28 20 6c 65 6e 20 2b 20 31 20 29 3b 0a  loc( len + 1 );.
165a0 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70          memcpy(p
165b0 44 62 2d 3e 7a 54 72 61 63 65 2c 20 7a 54 72 61  Db->zTrace, zTra
165c0 63 65 2c 20 6c 65 6e 2b 31 29 3b 0a 20 20 20 20  ce, len+1);.    
165d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
165e0 20 70 44 62 2d 3e 7a 54 72 61 63 65 20 3d 20 30   pDb->zTrace = 0
165f0 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 20 21 64  ;.      }.#if !d
16600 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
16610 49 54 5f 54 52 41 43 45 29 20 26 26 20 21 64 65  IT_TRACE) && !de
16620 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
16630 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54  T_FLOATING_POINT
16640 29 20 26 26 20 5c 0a 20 20 20 20 21 64 65 66 69  ) && \.    !defi
16650 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
16660 44 45 50 52 45 43 41 54 45 44 29 0a 20 20 20 20  DEPRECATED).    
16670 20 20 69 66 28 20 70 44 62 2d 3e 7a 54 72 61 63    if( pDb->zTrac
16680 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62  e ){.        pDb
16690 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72  ->interp = inter
166a0 70 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  p;.        sqlit
166b0 65 33 5f 74 72 61 63 65 28 70 44 62 2d 3e 64 62  e3_trace(pDb->db
166c0 2c 20 44 62 54 72 61 63 65 48 61 6e 64 6c 65 72  , DbTraceHandler
166d0 2c 20 70 44 62 29 3b 0a 20 20 20 20 20 20 7d 65  , pDb);.      }e
166e0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
166f0 69 74 65 33 5f 74 72 61 63 65 28 70 44 62 2d 3e  ite3_trace(pDb->
16700 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  db, 0, 0);.     
16710 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a   }.#endif.    }.
16720 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
16730 20 20 2f 2a 20 20 20 20 24 64 62 20 74 72 61 63    /*    $db trac
16740 65 5f 76 32 20 3f 43 41 4c 4c 42 41 43 4b 3f 20  e_v2 ?CALLBACK? 
16750 3f 4d 41 53 4b 3f 0a 20 20 2a 2a 0a 20 20 2a 2a  ?MASK?.  **.  **
16760 20 4d 61 6b 65 20 61 72 72 61 6e 67 65 6d 65 6e   Make arrangemen
16770 74 73 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65  ts to invoke the
16780 20 43 41 4c 4c 42 41 43 4b 20 72 6f 75 74 69 6e   CALLBACK routin
16790 65 20 66 6f 72 20 65 61 63 68 20 74 72 61 63 65  e for each trace
167a0 20 65 76 65 6e 74 0a 20 20 2a 2a 20 6d 61 74 63   event.  ** matc
167b0 68 69 6e 67 20 74 68 65 20 6d 61 73 6b 20 74 68  hing the mask th
167c0 61 74 20 69 73 20 67 65 6e 65 72 61 74 65 64 2e  at is generated.
167d0 20 20 54 68 65 20 70 61 72 61 6d 65 74 65 72 73    The parameters
167e0 20 61 72 65 20 61 70 70 65 6e 64 65 64 20 74 6f   are appended to
167f0 0a 20 20 2a 2a 20 43 41 4c 4c 42 41 43 4b 20 62  .  ** CALLBACK b
16800 65 66 6f 72 65 20 69 74 20 69 73 20 65 78 65 63  efore it is exec
16810 75 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 63 61 73  uted..  */.  cas
16820 65 20 44 42 5f 54 52 41 43 45 5f 56 32 3a 20 7b  e DB_TRACE_V2: {
16830 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 34 20  .    if( objc>4 
16840 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f  ){.      Tcl_Wro
16850 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
16860 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 43 41 4c  , 2, objv, "?CAL
16870 4c 42 41 43 4b 3f 20 3f 4d 41 53 4b 3f 22 29 3b  LBACK? ?MASK?");
16880 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
16890 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c  L_ERROR;.    }el
168a0 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29  se if( objc==2 )
168b0 7b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d  {.      if( pDb-
168c0 3e 7a 54 72 61 63 65 56 32 20 29 7b 0a 20 20 20  >zTraceV2 ){.   
168d0 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
168e0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 44  esult(interp, pD
168f0 62 2d 3e 7a 54 72 61 63 65 56 32 2c 20 28 63 68  b->zTraceV2, (ch
16900 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 7d 0a  ar*)0);.      }.
16910 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
16920 20 63 68 61 72 20 2a 7a 54 72 61 63 65 56 32 3b   char *zTraceV2;
16930 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a  .      int len;.
16940 20 20 20 20 20 20 54 63 6c 5f 57 69 64 65 49 6e        Tcl_WideIn
16950 74 20 77 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 20  t wMask = 0;.   
16960 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d 34 20 29     if( objc==4 )
16970 7b 0a 20 20 20 20 20 20 20 20 73 74 61 74 69 63  {.        static
16980 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 54 54 59   const char *TTY
16990 50 45 5f 73 74 72 73 5b 5d 20 3d 20 7b 0a 20 20  PE_strs[] = {.  
169a0 20 20 20 20 20 20 20 20 22 73 74 61 74 65 6d 65          "stateme
169b0 6e 74 22 2c 20 22 70 72 6f 66 69 6c 65 22 2c 20  nt", "profile", 
169c0 22 72 6f 77 22 2c 20 22 63 6c 6f 73 65 22 2c 20  "row", "close", 
169d0 30 0a 20 20 20 20 20 20 20 20 7d 3b 0a 20 20 20  0.        };.   
169e0 20 20 20 20 20 65 6e 75 6d 20 54 54 59 50 45 5f       enum TTYPE_
169f0 65 6e 75 6d 20 7b 0a 20 20 20 20 20 20 20 20 20  enum {.         
16a00 20 54 54 59 50 45 5f 53 54 4d 54 2c 20 54 54 59   TTYPE_STMT, TTY
16a10 50 45 5f 50 52 4f 46 49 4c 45 2c 20 54 54 59 50  PE_PROFILE, TTYP
16a20 45 5f 52 4f 57 2c 20 54 54 59 50 45 5f 43 4c 4f  E_ROW, TTYPE_CLO
16a30 53 45 0a 20 20 20 20 20 20 20 20 7d 3b 0a 20 20  SE.        };.  
16a40 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
16a50 20 20 20 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21       if( TCL_OK!
16a60 3d 54 63 6c 5f 4c 69 73 74 4f 62 6a 4c 65 6e 67  =Tcl_ListObjLeng
16a70 74 68 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  th(interp, objv[
16a80 33 5d 2c 20 26 6c 65 6e 29 20 29 7b 0a 20 20 20  3], &len) ){.   
16a90 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43         return TC
16aa0 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20  L_ERROR;.       
16ab0 20 7d 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69   }.        for(i
16ac0 3d 30 3b 20 69 3c 6c 65 6e 3b 20 69 2b 2b 29 7b  =0; i<len; i++){
16ad0 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 4f  .          Tcl_O
16ae0 62 6a 20 2a 70 4f 62 6a 3b 0a 20 20 20 20 20 20  bj *pObj;.      
16af0 20 20 20 20 69 6e 74 20 74 74 79 70 65 3b 0a 20      int ttype;. 
16b00 20 20 20 20 20 20 20 20 20 69 66 28 20 54 43 4c           if( TCL
16b10 5f 4f 4b 21 3d 54 63 6c 5f 4c 69 73 74 4f 62 6a  _OK!=Tcl_ListObj
16b20 49 6e 64 65 78 28 69 6e 74 65 72 70 2c 20 6f 62  Index(interp, ob
16b30 6a 76 5b 33 5d 2c 20 69 2c 20 26 70 4f 62 6a 29  jv[3], i, &pObj)
16b40 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
16b50 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
16b60 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
16b70 20 20 20 20 20 20 20 20 69 66 28 20 54 63 6c 5f          if( Tcl_
16b80 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28  GetIndexFromObj(
16b90 69 6e 74 65 72 70 2c 20 70 4f 62 6a 2c 20 54 54  interp, pObj, TT
16ba0 59 50 45 5f 73 74 72 73 2c 20 22 74 72 61 63 65  YPE_strs, "trace
16bb0 20 74 79 70 65 22 2c 0a 20 20 20 20 20 20 20 20   type",.        
16bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16bd0 20 20 20 20 20 20 20 20 20 20 30 2c 20 26 74 74            0, &tt
16be0 79 70 65 29 21 3d 54 43 4c 5f 4f 4b 20 29 7b 0a  ype)!=TCL_OK ){.
16bf0 20 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f              Tcl_
16c00 57 69 64 65 49 6e 74 20 77 54 79 70 65 3b 0a 20  WideInt wType;. 
16c10 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 4f             Tcl_O
16c20 62 6a 20 2a 70 45 72 72 6f 72 20 3d 20 54 63 6c  bj *pError = Tcl
16c30 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 54 63  _DuplicateObj(Tc
16c40 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_GetObjResult(i
16c50 6e 74 65 72 70 29 29 3b 0a 20 20 20 20 20 20 20  nterp));.       
16c60 20 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66       Tcl_IncrRef
16c70 43 6f 75 6e 74 28 70 45 72 72 6f 72 29 3b 0a 20  Count(pError);. 
16c80 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 54             if( T
16c90 43 4c 5f 4f 4b 3d 3d 54 63 6c 5f 47 65 74 57 69  CL_OK==Tcl_GetWi
16ca0 64 65 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  deIntFromObj(int
16cb0 65 72 70 2c 20 70 4f 62 6a 2c 20 26 77 54 79 70  erp, pObj, &wTyp
16cc0 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  e) ){.          
16cd0 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
16ce0 6f 75 6e 74 28 70 45 72 72 6f 72 29 3b 0a 20 20  ount(pError);.  
16cf0 20 20 20 20 20 20 20 20 20 20 20 20 77 4d 61 73              wMas
16d00 6b 20 7c 3d 20 77 54 79 70 65 3b 0a 20 20 20 20  k |= wType;.    
16d10 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
16d20 20 20 20 20 20 20 20 20 20 20 20 20 20 54 63 6c               Tcl
16d30 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
16d40 74 65 72 70 2c 20 70 45 72 72 6f 72 29 3b 0a 20  terp, pError);. 
16d50 20 20 20 20 20 20 20 20 20 20 20 20 20 54 63 6c               Tcl
16d60 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 45  _DecrRefCount(pE
16d70 72 72 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 20  rror);.         
16d80 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
16d90 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 20  ERROR;.         
16da0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
16db0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
16dc0 20 20 73 77 69 74 63 68 28 20 28 65 6e 75 6d 20    switch( (enum 
16dd0 54 54 59 50 45 5f 65 6e 75 6d 29 74 74 79 70 65  TTYPE_enum)ttype
16de0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
16df0 20 20 63 61 73 65 20 54 54 59 50 45 5f 53 54 4d    case TTYPE_STM
16e00 54 3a 20 20 20 20 77 4d 61 73 6b 20 7c 3d 20 53  T:    wMask |= S
16e10 51 4c 49 54 45 5f 54 52 41 43 45 5f 53 54 4d 54  QLITE_TRACE_STMT
16e20 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ;    break;.    
16e30 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20 54            case T
16e40 54 59 50 45 5f 50 52 4f 46 49 4c 45 3a 20 77 4d  TYPE_PROFILE: wM
16e50 61 73 6b 20 7c 3d 20 53 51 4c 49 54 45 5f 54 52  ask |= SQLITE_TR
16e60 41 43 45 5f 50 52 4f 46 49 4c 45 3b 20 62 72 65  ACE_PROFILE; bre
16e70 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
16e80 20 20 63 61 73 65 20 54 54 59 50 45 5f 52 4f 57    case TTYPE_ROW
16e90 3a 20 20 20 20 20 77 4d 61 73 6b 20 7c 3d 20 53  :     wMask |= S
16ea0 51 4c 49 54 45 5f 54 52 41 43 45 5f 52 4f 57 3b  QLITE_TRACE_ROW;
16eb0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
16ec0 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20 54            case T
16ed0 54 59 50 45 5f 43 4c 4f 53 45 3a 20 20 20 77 4d  TYPE_CLOSE:   wM
16ee0 61 73 6b 20 7c 3d 20 53 51 4c 49 54 45 5f 54 52  ask |= SQLITE_TR
16ef0 41 43 45 5f 43 4c 4f 53 45 3b 20 20 20 62 72 65  ACE_CLOSE;   bre
16f00 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
16f10 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
16f20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
16f30 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 77 4d 61  lse{.        wMa
16f40 73 6b 20 3d 20 53 51 4c 49 54 45 5f 54 52 41 43  sk = SQLITE_TRAC
16f50 45 5f 53 54 4d 54 3b 20 2f 2a 20 75 73 65 20 74  E_STMT; /* use t
16f60 68 65 20 22 6c 65 67 61 63 79 22 20 64 65 66 61  he "legacy" defa
16f70 75 6c 74 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20  ult */.      }. 
16f80 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 54       if( pDb->zT
16f90 72 61 63 65 56 32 20 29 7b 0a 20 20 20 20 20 20  raceV2 ){.      
16fa0 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e    Tcl_Free(pDb->
16fb0 7a 54 72 61 63 65 56 32 29 3b 0a 20 20 20 20 20  zTraceV2);.     
16fc0 20 7d 0a 20 20 20 20 20 20 7a 54 72 61 63 65 56   }.      zTraceV
16fd0 32 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  2 = Tcl_GetStrin
16fe0 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d  gFromObj(objv[2]
16ff0 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69  , &len);.      i
17000 66 28 20 7a 54 72 61 63 65 56 32 20 26 26 20 6c  f( zTraceV2 && l
17010 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  en>0 ){.        
17020 70 44 62 2d 3e 7a 54 72 61 63 65 56 32 20 3d 20  pDb->zTraceV2 = 
17030 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b  Tcl_Alloc( len +
17040 20 31 20 29 3b 0a 20 20 20 20 20 20 20 20 6d 65   1 );.        me
17050 6d 63 70 79 28 70 44 62 2d 3e 7a 54 72 61 63 65  mcpy(pDb->zTrace
17060 56 32 2c 20 7a 54 72 61 63 65 56 32 2c 20 6c 65  V2, zTraceV2, le
17070 6e 2b 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  n+1);.      }els
17080 65 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e  e{.        pDb->
17090 7a 54 72 61 63 65 56 32 20 3d 20 30 3b 0a 20 20  zTraceV2 = 0;.  
170a0 20 20 20 20 7d 0a 23 69 66 20 21 64 65 66 69 6e      }.#if !defin
170b0 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ed(SQLITE_OMIT_T
170c0 52 41 43 45 29 20 26 26 20 21 64 65 66 69 6e 65  RACE) && !define
170d0 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c  d(SQLITE_OMIT_FL
170e0 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 29 0a 20 20  OATING_POINT).  
170f0 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 54 72      if( pDb->zTr
17100 61 63 65 56 32 20 29 7b 0a 20 20 20 20 20 20 20  aceV2 ){.       
17110 20 70 44 62 2d 3e 69 6e 74 65 72 70 20 3d 20 69   pDb->interp = i
17120 6e 74 65 72 70 3b 0a 20 20 20 20 20 20 20 20 73  nterp;.        s
17130 71 6c 69 74 65 33 5f 74 72 61 63 65 5f 76 32 28  qlite3_trace_v2(
17140 70 44 62 2d 3e 64 62 2c 20 28 75 6e 73 69 67 6e  pDb->db, (unsign
17150 65 64 29 77 4d 61 73 6b 2c 20 44 62 54 72 61 63  ed)wMask, DbTrac
17160 65 56 32 48 61 6e 64 6c 65 72 2c 20 70 44 62 29  eV2Handler, pDb)
17170 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
17180 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 74         sqlite3_t
17190 72 61 63 65 5f 76 32 28 70 44 62 2d 3e 64 62 2c  race_v2(pDb->db,
171a0 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20   0, 0, 0);.     
171b0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a   }.#endif.    }.
171c0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
171d0 20 20 2f 2a 20 20 20 20 24 64 62 20 74 72 61 6e    /*    $db tran
171e0 73 61 63 74 69 6f 6e 20 5b 2d 64 65 66 65 72 72  saction [-deferr
171f0 65 64 7c 2d 69 6d 6d 65 64 69 61 74 65 7c 2d 65  ed|-immediate|-e
17200 78 63 6c 75 73 69 76 65 5d 20 53 43 52 49 50 54  xclusive] SCRIPT
17210 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 74 61 72 74  .  **.  ** Start
17220 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69   a new transacti
17230 6f 6e 20 28 69 66 20 77 65 20 61 72 65 20 6e 6f  on (if we are no
17240 74 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  t already in the
17250 20 6d 69 64 73 74 20 6f 66 20 61 0a 20 20 2a 2a   midst of a.  **
17260 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 20 61 6e   transaction) an
17270 64 20 65 78 65 63 75 74 65 20 74 68 65 20 54 43  d execute the TC
17280 4c 20 73 63 72 69 70 74 20 53 43 52 49 50 54 2e  L script SCRIPT.
17290 20 20 41 66 74 65 72 20 53 43 52 49 50 54 0a 20    After SCRIPT. 
172a0 20 2a 2a 20 63 6f 6d 70 6c 65 74 65 73 2c 20 65   ** completes, e
172b0 69 74 68 65 72 20 63 6f 6d 6d 69 74 20 74 68 65  ither commit the
172c0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 72 20   transaction or 
172d0 72 6f 6c 6c 20 69 74 20 62 61 63 6b 20 69 66 20  roll it back if 
172e0 53 43 52 49 50 54 0a 20 20 2a 2a 20 74 68 72 6f  SCRIPT.  ** thro
172f0 77 73 20 61 6e 20 65 78 63 65 70 74 69 6f 6e 2e  ws an exception.
17300 20 20 4f 72 20 69 66 20 6e 6f 20 6e 65 77 20 74    Or if no new t
17310 72 61 6e 73 61 74 69 6f 6e 20 77 61 73 20 73 74  ransation was st
17320 61 72 74 65 64 2c 20 64 6f 20 6e 6f 74 68 69 6e  arted, do nothin
17330 67 2e 0a 20 20 2a 2a 20 70 61 73 73 20 74 68 65  g..  ** pass the
17340 20 65 78 63 65 70 74 69 6f 6e 20 6f 6e 20 75 70   exception on up
17350 20 74 68 65 20 73 74 61 63 6b 2e 0a 20 20 2a 2a   the stack..  **
17360 0a 20 20 2a 2a 20 54 68 69 73 20 63 6f 6d 6d 61  .  ** This comma
17370 6e 64 20 77 61 73 20 69 6e 73 70 69 72 65 64 20  nd was inspired 
17380 62 79 20 44 61 76 65 20 54 68 6f 6d 61 73 27 73  by Dave Thomas's
17390 20 74 61 6c 6b 20 6f 6e 20 52 75 62 79 20 61 74   talk on Ruby at
173a0 20 74 68 65 0a 20 20 2a 2a 20 32 30 30 35 20 4f   the.  ** 2005 O
173b0 27 52 65 69 6c 6c 79 20 4f 70 65 6e 20 53 6f 75  'Reilly Open Sou
173c0 72 63 65 20 43 6f 6e 76 65 6e 74 69 6f 6e 20 28  rce Convention (
173d0 4f 53 43 4f 4e 29 2e 0a 20 20 2a 2f 0a 20 20 63  OSCON)..  */.  c
173e0 61 73 65 20 44 42 5f 54 52 41 4e 53 41 43 54 49  ase DB_TRANSACTI
173f0 4f 4e 3a 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62  ON: {.    Tcl_Ob
17400 6a 20 2a 70 53 63 72 69 70 74 3b 0a 20 20 20 20  j *pScript;.    
17410 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 42 65 67  const char *zBeg
17420 69 6e 20 3d 20 22 53 41 56 45 50 4f 49 4e 54 20  in = "SAVEPOINT 
17430 5f 74 63 6c 5f 74 72 61 6e 73 61 63 74 69 6f 6e  _tcl_transaction
17440 22 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21  ";.    if( objc!
17450 3d 33 20 26 26 20 6f 62 6a 63 21 3d 34 20 29 7b  =3 && objc!=4 ){
17460 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  .      Tcl_Wrong
17470 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
17480 32 2c 20 6f 62 6a 76 2c 20 22 5b 54 59 50 45 5d  2, objv, "[TYPE]
17490 20 53 43 52 49 50 54 22 29 3b 0a 20 20 20 20 20   SCRIPT");.     
174a0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
174b0 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  R;.    }..    if
174c0 28 20 70 44 62 2d 3e 6e 54 72 61 6e 73 61 63 74  ( pDb->nTransact
174d0 69 6f 6e 3d 3d 30 20 26 26 20 6f 62 6a 63 3d 3d  ion==0 && objc==
174e0 34 20 29 7b 0a 20 20 20 20 20 20 73 74 61 74 69  4 ){.      stati
174f0 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 54 54  c const char *TT
17500 59 50 45 5f 73 74 72 73 5b 5d 20 3d 20 7b 0a 20  YPE_strs[] = {. 
17510 20 20 20 20 20 20 20 22 64 65 66 65 72 72 65 64         "deferred
17520 22 2c 20 20 20 22 65 78 63 6c 75 73 69 76 65 22  ",   "exclusive"
17530 2c 20 20 22 69 6d 6d 65 64 69 61 74 65 22 2c 20  ,  "immediate", 
17540 30 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20  0.      };.     
17550 20 65 6e 75 6d 20 54 54 59 50 45 5f 65 6e 75 6d   enum TTYPE_enum
17560 20 7b 0a 20 20 20 20 20 20 20 20 54 54 59 50 45   {.        TTYPE
17570 5f 44 45 46 45 52 52 45 44 2c 20 54 54 59 50 45  _DEFERRED, TTYPE
17580 5f 45 58 43 4c 55 53 49 56 45 2c 20 54 54 59 50  _EXCLUSIVE, TTYP
17590 45 5f 49 4d 4d 45 44 49 41 54 45 0a 20 20 20 20  E_IMMEDIATE.    
175a0 20 20 7d 3b 0a 20 20 20 20 20 20 69 6e 74 20 74    };.      int t
175b0 74 79 70 65 3b 0a 20 20 20 20 20 20 69 66 28 20  type;.      if( 
175c0 54 63 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d  Tcl_GetIndexFrom
175d0 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
175e0 5b 32 5d 2c 20 54 54 59 50 45 5f 73 74 72 73 2c  [2], TTYPE_strs,
175f0 20 22 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 79   "transaction ty
17600 70 65 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  pe",.           
17610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17620 20 20 20 30 2c 20 26 74 74 79 70 65 29 20 29 7b     0, &ttype) ){
17630 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
17640 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  TCL_ERROR;.     
17650 20 7d 0a 20 20 20 20 20 20 73 77 69 74 63 68 28   }.      switch(
17660 20 28 65 6e 75 6d 20 54 54 59 50 45 5f 65 6e 75   (enum TTYPE_enu
17670 6d 29 74 74 79 70 65 20 29 7b 0a 20 20 20 20 20  m)ttype ){.     
17680 20 20 20 63 61 73 65 20 54 54 59 50 45 5f 44 45     case TTYPE_DE
17690 46 45 52 52 45 44 3a 20 20 20 20 2f 2a 20 6e 6f  FERRED:    /* no
176a0 2d 6f 70 20 2a 2f 3b 20 20 20 20 20 20 20 20 20  -op */;         
176b0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
176c0 20 20 20 20 20 20 20 63 61 73 65 20 54 54 59 50         case TTYP
176d0 45 5f 45 58 43 4c 55 53 49 56 45 3a 20 20 20 7a  E_EXCLUSIVE:   z
176e0 42 65 67 69 6e 20 3d 20 22 42 45 47 49 4e 20 45  Begin = "BEGIN E
176f0 58 43 4c 55 53 49 56 45 22 3b 20 20 62 72 65 61  XCLUSIVE";  brea
17700 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  k;.        case 
17710 54 54 59 50 45 5f 49 4d 4d 45 44 49 41 54 45 3a  TTYPE_IMMEDIATE:
17720 20 20 20 7a 42 65 67 69 6e 20 3d 20 22 42 45 47     zBegin = "BEG
17730 49 4e 20 49 4d 4d 45 44 49 41 54 45 22 3b 20 20  IN IMMEDIATE";  
17740 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
17750 20 20 20 7d 0a 20 20 20 20 70 53 63 72 69 70 74     }.    pScript
17760 20 3d 20 6f 62 6a 76 5b 6f 62 6a 63 2d 31 5d 3b   = objv[objc-1];
17770 0a 0a 20 20 20 20 2f 2a 20 52 75 6e 20 74 68 65  ..    /* Run the
17780 20 53 51 4c 69 74 65 20 42 45 47 49 4e 20 63 6f   SQLite BEGIN co
17790 6d 6d 61 6e 64 20 74 6f 20 6f 70 65 6e 20 61 20  mmand to open a 
177a0 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 72 20 73  transaction or s
177b0 61 76 65 70 6f 69 6e 74 2e 20 2a 2f 0a 20 20 20  avepoint. */.   
177c0 20 70 44 62 2d 3e 64 69 73 61 62 6c 65 41 75 74   pDb->disableAut
177d0 68 2b 2b 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  h++;.    rc = sq
177e0 6c 69 74 65 33 5f 65 78 65 63 28 70 44 62 2d 3e  lite3_exec(pDb->
177f0 64 62 2c 20 7a 42 65 67 69 6e 2c 20 30 2c 20 30  db, zBegin, 0, 0
17800 2c 20 30 29 3b 0a 20 20 20 20 70 44 62 2d 3e 64  , 0);.    pDb->d
17810 69 73 61 62 6c 65 41 75 74 68 2d 2d 3b 0a 20 20  isableAuth--;.  
17820 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
17830 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  _OK ){.      Tcl
17840 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
17850 74 65 72 70 2c 20 73 71 6c 69 74 65 33 5f 65 72  terp, sqlite3_er
17860 72 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c 20 28  rmsg(pDb->db), (
17870 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20  char*)0);.      
17880 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
17890 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 44 62 2d  ;.    }.    pDb-
178a0 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2b 2b 3b  >nTransaction++;
178b0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 75 73 69 6e  ..    /* If usin
178c0 67 20 4e 52 45 2c 20 73 63 68 65 64 75 6c 65 20  g NRE, schedule 
178d0 61 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20 69 6e  a callback to in
178e0 76 6f 6b 65 20 74 68 65 20 73 63 72 69 70 74 20  voke the script 
178f0 70 53 63 72 69 70 74 2c 20 74 68 65 6e 0a 20 20  pScript, then.  
17900 20 20 2a 2a 20 61 20 73 65 63 6f 6e 64 20 63 61    ** a second ca
17910 6c 6c 62 61 63 6b 20 74 6f 20 63 6f 6d 6d 69 74  llback to commit
17920 20 28 6f 72 20 72 6f 6c 6c 62 61 63 6b 29 20 74   (or rollback) t
17930 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  he transaction o
17940 72 20 73 61 76 65 70 6f 69 6e 74 0a 20 20 20 20  r savepoint.    
17950 2a 2a 20 6f 70 65 6e 65 64 20 61 62 6f 76 65 2e  ** opened above.
17960 20 49 66 20 6e 6f 74 20 75 73 69 6e 67 20 4e 52   If not using NR
17970 45 2c 20 65 76 61 6c 75 61 74 65 20 74 68 65 20  E, evaluate the 
17980 73 63 72 69 70 74 20 64 69 72 65 63 74 6c 79 2c  script directly,
17990 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 63 61 6c   then.    ** cal
179a0 6c 20 66 75 6e 63 74 69 6f 6e 20 44 62 54 72 61  l function DbTra
179b0 6e 73 50 6f 73 74 43 6d 64 28 29 20 74 6f 20 63  nsPostCmd() to c
179c0 6f 6d 6d 69 74 20 28 6f 72 20 72 6f 6c 6c 62 61  ommit (or rollba
179d0 63 6b 29 20 74 68 65 20 74 72 61 6e 73 61 63 74  ck) the transact
179e0 69 6f 6e 0a 20 20 20 20 2a 2a 20 6f 72 20 73 61  ion.    ** or sa
179f0 76 65 70 6f 69 6e 74 2e 20 20 2a 2f 0a 20 20 20  vepoint.  */.   
17a00 20 69 66 28 20 44 62 55 73 65 4e 72 65 28 29 20   if( DbUseNre() 
17a10 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 4e 52 41  ){.      Tcl_NRA
17a20 64 64 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72  ddCallback(inter
17a30 70 2c 20 44 62 54 72 61 6e 73 50 6f 73 74 43 6d  p, DbTransPostCm
17a40 64 2c 20 63 64 2c 20 30 2c 20 30 2c 20 30 29 3b  d, cd, 0, 0, 0);
17a50 0a 20 20 20 20 20 20 28 76 6f 69 64 29 54 63 6c  .      (void)Tcl
17a60 5f 4e 52 45 76 61 6c 4f 62 6a 28 69 6e 74 65 72  _NREvalObj(inter
17a70 70 2c 20 70 53 63 72 69 70 74 2c 20 30 29 3b 0a  p, pScript, 0);.
17a80 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
17a90 20 72 63 20 3d 20 44 62 54 72 61 6e 73 50 6f 73   rc = DbTransPos
17aa0 74 43 6d 64 28 26 63 64 2c 20 69 6e 74 65 72 70  tCmd(&cd, interp
17ab0 2c 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28  , Tcl_EvalObjEx(
17ac0 69 6e 74 65 72 70 2c 20 70 53 63 72 69 70 74 2c  interp, pScript,
17ad0 20 30 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20   0));.    }.    
17ae0 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
17af0 0a 20 20 2a 2a 20 20 20 20 24 64 62 20 75 6e 6c  .  **    $db unl
17b00 6f 63 6b 5f 6e 6f 74 69 66 79 20 3f 73 63 72 69  ock_notify ?scri
17b10 70 74 3f 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  pt?.  */.  case 
17b20 44 42 5f 55 4e 4c 4f 43 4b 5f 4e 4f 54 49 46 59  DB_UNLOCK_NOTIFY
17b30 3a 20 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  : {.#ifndef SQLI
17b40 54 45 5f 45 4e 41 42 4c 45 5f 55 4e 4c 4f 43 4b  TE_ENABLE_UNLOCK
17b50 5f 4e 4f 54 49 46 59 0a 20 20 20 20 54 63 6c 5f  _NOTIFY.    Tcl_
17b60 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
17b70 65 72 70 2c 20 22 75 6e 6c 6f 63 6b 5f 6e 6f 74  erp, "unlock_not
17b80 69 66 79 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c  ify not availabl
17b90 65 20 69 6e 20 74 68 69 73 20 62 75 69 6c 64 22  e in this build"
17ba0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
17bb0 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 30 29         (char*)0)
17bc0 3b 0a 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45  ;.    rc = TCL_E
17bd0 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 20 20 20 20  RROR;.#else.    
17be0 69 66 28 20 6f 62 6a 63 21 3d 32 20 26 26 20 6f  if( objc!=2 && o
17bf0 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20  bjc!=3 ){.      
17c00 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
17c10 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76  (interp, 2, objv
17c20 2c 20 22 3f 53 43 52 49 50 54 3f 22 29 3b 0a 20  , "?SCRIPT?");. 
17c30 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45 52       rc = TCL_ER
17c40 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ROR;.    }else{.
17c50 20 20 20 20 20 20 76 6f 69 64 20 28 2a 78 4e 6f        void (*xNo
17c60 74 69 66 79 29 28 76 6f 69 64 20 2a 2a 2c 20 69  tify)(void **, i
17c70 6e 74 29 20 3d 20 30 3b 0a 20 20 20 20 20 20 76  nt) = 0;.      v
17c80 6f 69 64 20 2a 70 4e 6f 74 69 66 79 41 72 67 20  oid *pNotifyArg 
17c90 3d 20 30 3b 0a 0a 20 20 20 20 20 20 69 66 28 20  = 0;..      if( 
17ca0 70 44 62 2d 3e 70 55 6e 6c 6f 63 6b 4e 6f 74 69  pDb->pUnlockNoti
17cb0 66 79 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63  fy ){.        Tc
17cc0 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70  l_DecrRefCount(p
17cd0 44 62 2d 3e 70 55 6e 6c 6f 63 6b 4e 6f 74 69 66  Db->pUnlockNotif
17ce0 79 29 3b 0a 20 20 20 20 20 20 20 20 70 44 62 2d  y);.        pDb-
17cf0 3e 70 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 20 3d  >pUnlockNotify =
17d00 20 30 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20   0;.      }..   
17d10 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d 33 20 29     if( objc==3 )
17d20 7b 0a 20 20 20 20 20 20 20 20 78 4e 6f 74 69 66  {.        xNotif
17d30 79 20 3d 20 44 62 55 6e 6c 6f 63 6b 4e 6f 74 69  y = DbUnlockNoti
17d40 66 79 3b 0a 20 20 20 20 20 20 20 20 70 4e 6f 74  fy;.        pNot
17d50 69 66 79 41 72 67 20 3d 20 28 76 6f 69 64 20 2a  ifyArg = (void *
17d60 29 70 44 62 3b 0a 20 20 20 20 20 20 20 20 70 44  )pDb;.        pD
17d70 62 2d 3e 70 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79  b->pUnlockNotify
17d80 20 3d 20 6f 62 6a 76 5b 32 5d 3b 0a 20 20 20 20   = objv[2];.    
17d90 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43      Tcl_IncrRefC
17da0 6f 75 6e 74 28 70 44 62 2d 3e 70 55 6e 6c 6f 63  ount(pDb->pUnloc
17db0 6b 4e 6f 74 69 66 79 29 3b 0a 20 20 20 20 20 20  kNotify);.      
17dc0 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  }..      if( sql
17dd0 69 74 65 33 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74 69  ite3_unlock_noti
17de0 66 79 28 70 44 62 2d 3e 64 62 2c 20 78 4e 6f 74  fy(pDb->db, xNot
17df0 69 66 79 2c 20 70 4e 6f 74 69 66 79 41 72 67 29  ify, pNotifyArg)
17e00 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f   ){.        Tcl_
17e10 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
17e20 65 72 70 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  erp, sqlite3_err
17e30 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c 20 28 63  msg(pDb->db), (c
17e40 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 20  har*)0);.       
17e50 20 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b   rc = TCL_ERROR;
17e60 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
17e70 65 6e 64 69 66 0a 20 20 20 20 62 72 65 61 6b 3b  endif.    break;
17e80 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
17e90 20 20 20 24 64 62 20 70 72 65 75 70 64 61 74 65     $db preupdate
17ea0 5f 68 6f 6f 6b 20 63 6f 75 6e 74 0a 20 20 2a 2a  _hook count.  **
17eb0 20 20 20 20 24 64 62 20 70 72 65 75 70 64 61 74      $db preupdat
17ec0 65 5f 68 6f 6f 6b 20 68 6f 6f 6b 20 3f 53 43 52  e_hook hook ?SCR
17ed0 49 50 54 3f 0a 20 20 2a 2a 20 20 20 20 24 64 62  IPT?.  **    $db
17ee0 20 70 72 65 75 70 64 61 74 65 5f 68 6f 6f 6b 20   preupdate_hook 
17ef0 6e 65 77 20 49 4e 44 45 58 0a 20 20 2a 2a 20 20  new INDEX.  **  
17f00 20 20 24 64 62 20 70 72 65 75 70 64 61 74 65 5f    $db preupdate_
17f10 68 6f 6f 6b 20 6f 6c 64 20 49 4e 44 45 58 0a 20  hook old INDEX. 
17f20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 50 52   */.  case DB_PR
17f30 45 55 50 44 41 54 45 3a 20 7b 0a 23 69 66 6e 64  EUPDATE: {.#ifnd
17f40 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
17f50 5f 50 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b 0a  _PREUPDATE_HOOK.
17f60 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
17f70 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 70 72  sult(interp, "pr
17f80 65 75 70 64 61 74 65 5f 68 6f 6f 6b 20 77 61 73  eupdate_hook was
17f90 20 6f 6d 69 74 74 65 64 20 61 74 20 63 6f 6d 70   omitted at comp
17fa0 69 6c 65 2d 74 69 6d 65 22 29 3b 0a 20 20 20 20  ile-time");.    
17fb0 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  rc = TCL_ERROR;.
17fc0 23 65 6c 73 65 0a 20 20 20 20 73 74 61 74 69 63  #else.    static
17fd0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 53   const char *azS
17fe0 75 62 5b 5d 20 3d 20 7b 22 63 6f 75 6e 74 22 2c  ub[] = {"count",
17ff0 20 22 64 65 70 74 68 22 2c 20 22 68 6f 6f 6b 22   "depth", "hook"
18000 2c 20 22 6e 65 77 22 2c 20 22 6f 6c 64 22 2c 20  , "new", "old", 
18010 30 7d 3b 0a 20 20 20 20 65 6e 75 6d 20 44 62 50  0};.    enum DbP
18020 72 65 75 70 64 61 74 65 53 75 62 43 6d 64 20 7b  reupdateSubCmd {
18030 0a 20 20 20 20 20 20 50 52 45 5f 43 4f 55 4e 54  .      PRE_COUNT
18040 2c 20 50 52 45 5f 44 45 50 54 48 2c 20 50 52 45  , PRE_DEPTH, PRE
18050 5f 48 4f 4f 4b 2c 20 50 52 45 5f 4e 45 57 2c 20  _HOOK, PRE_NEW, 
18060 50 52 45 5f 4f 4c 44 0a 20 20 20 20 7d 3b 0a 20  PRE_OLD.    };. 
18070 20 20 20 69 6e 74 20 69 53 75 62 3b 0a 0a 20 20     int iSub;..  
18080 20 20 69 66 28 20 6f 62 6a 63 3c 33 20 29 7b 0a    if( objc<3 ){.
18090 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
180a0 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
180b0 2c 20 6f 62 6a 76 2c 20 22 53 55 42 2d 43 4f 4d  , objv, "SUB-COM
180c0 4d 41 4e 44 20 3f 41 52 47 53 3f 22 29 3b 0a 20  MAND ?ARGS?");. 
180d0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 54 63 6c     }.    if( Tcl
180e0 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a  _GetIndexFromObj
180f0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d  (interp, objv[2]
18100 2c 20 61 7a 53 75 62 2c 20 22 73 75 62 2d 63 6f  , azSub, "sub-co
18110 6d 6d 61 6e 64 22 2c 20 30 2c 20 26 69 53 75 62  mmand", 0, &iSub
18120 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
18130 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
18140 20 7d 0a 0a 20 20 20 20 73 77 69 74 63 68 28 20   }..    switch( 
18150 28 65 6e 75 6d 20 44 62 50 72 65 75 70 64 61 74  (enum DbPreupdat
18160 65 53 75 62 43 6d 64 29 69 53 75 62 20 29 7b 0a  eSubCmd)iSub ){.
18170 20 20 20 20 20 20 63 61 73 65 20 50 52 45 5f 43        case PRE_C
18180 4f 55 4e 54 3a 20 7b 0a 20 20 20 20 20 20 20 20  OUNT: {.        
18190 69 6e 74 20 6e 43 6f 6c 20 3d 20 73 71 6c 69 74  int nCol = sqlit
181a0 65 33 5f 70 72 65 75 70 64 61 74 65 5f 63 6f 75  e3_preupdate_cou
181b0 6e 74 28 70 44 62 2d 3e 64 62 29 3b 0a 20 20 20  nt(pDb->db);.   
181c0 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52       Tcl_SetObjR
181d0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
181e0 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 6e 43 6f 6c  l_NewIntObj(nCol
181f0 29 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  ));.        brea
18200 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  k;.      }..    
18210 20 20 63 61 73 65 20 50 52 45 5f 48 4f 4f 4b 3a    case PRE_HOOK:
18220 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6f   {.        if( o
18230 62 6a 63 3e 34 20 29 7b 0a 20 20 20 20 20 20 20  bjc>4 ){.       
18240 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
18250 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
18260 62 6a 76 2c 20 22 68 6f 6f 6b 20 3f 53 43 52 49  bjv, "hook ?SCRI
18270 50 54 3f 22 29 3b 0a 20 20 20 20 20 20 20 20 20  PT?");.         
18280 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
18290 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  R;.        }.   
182a0 20 20 20 20 20 44 62 48 6f 6f 6b 43 6d 64 28 69       DbHookCmd(i
182b0 6e 74 65 72 70 2c 20 70 44 62 2c 20 28 6f 62 6a  nterp, pDb, (obj
182c0 63 3d 3d 34 20 3f 20 6f 62 6a 76 5b 33 5d 20 3a  c==4 ? objv[3] :
182d0 20 30 29 2c 20 26 70 44 62 2d 3e 70 50 72 65 55   0), &pDb->pPreU
182e0 70 64 61 74 65 48 6f 6f 6b 29 3b 0a 20 20 20 20  pdateHook);.    
182f0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
18300 20 7d 0a 0a 20 20 20 20 20 20 63 61 73 65 20 50   }..      case P
18310 52 45 5f 44 45 50 54 48 3a 20 7b 0a 20 20 20 20  RE_DEPTH: {.    
18320 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65      Tcl_Obj *pRe
18330 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6f  t;.        if( o
18340 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20  bjc!=3 ){.      
18350 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
18360 41 72 67 73 28 69 6e 74 65 72 70 2c 20 33 2c 20  Args(interp, 3, 
18370 6f 62 6a 76 2c 20 22 22 29 3b 0a 20 20 20 20 20  objv, "");.     
18380 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
18390 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d  ERROR;.        }
183a0 0a 20 20 20 20 20 20 20 20 70 52 65 74 20 3d 20  .        pRet = 
183b0 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 71  Tcl_NewIntObj(sq
183c0 6c 69 74 65 33 5f 70 72 65 75 70 64 61 74 65 5f  lite3_preupdate_
183d0 64 65 70 74 68 28 70 44 62 2d 3e 64 62 29 29 3b  depth(pDb->db));
183e0 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 53 65 74  .        Tcl_Set
183f0 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
18400 2c 20 70 52 65 74 29 3b 0a 20 20 20 20 20 20 20  , pRet);.       
18410 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
18420 0a 20 20 20 20 20 20 63 61 73 65 20 50 52 45 5f  .      case PRE_
18430 4e 45 57 3a 0a 20 20 20 20 20 20 63 61 73 65 20  NEW:.      case 
18440 50 52 45 5f 4f 4c 44 3a 20 7b 0a 20 20 20 20 20  PRE_OLD: {.     
18450 20 20 20 69 6e 74 20 69 49 64 78 3b 0a 20 20 20     int iIdx;.   
18460 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c       sqlite3_val
18470 75 65 20 2a 70 56 61 6c 75 65 3b 0a 20 20 20 20  ue *pValue;.    
18480 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20      if( objc!=4 
18490 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c  ){.          Tcl
184a0 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
184b0 74 65 72 70 2c 20 33 2c 20 6f 62 6a 76 2c 20 22  terp, 3, objv, "
184c0 49 4e 44 45 58 22 29 3b 0a 20 20 20 20 20 20 20  INDEX");.       
184d0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
184e0 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ROR;.        }. 
184f0 20 20 20 20 20 20 20 69 66 28 20 54 63 6c 5f 47         if( Tcl_G
18500 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
18510 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 69  erp, objv[3], &i
18520 49 64 78 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Idx) ){.        
18530 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
18540 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  OR;.        }.. 
18550 20 20 20 20 20 20 20 69 66 28 20 69 53 75 62 3d         if( iSub=
18560 3d 50 52 45 5f 4f 4c 44 20 29 7b 0a 20 20 20 20  =PRE_OLD ){.    
18570 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
18580 65 33 5f 70 72 65 75 70 64 61 74 65 5f 6f 6c 64  e3_preupdate_old
18590 28 70 44 62 2d 3e 64 62 2c 20 69 49 64 78 2c 20  (pDb->db, iIdx, 
185a0 26 70 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20  &pValue);.      
185b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
185c0 20 20 20 61 73 73 65 72 74 28 20 69 53 75 62 3d     assert( iSub=
185d0 3d 50 52 45 5f 4e 45 57 20 29 3b 0a 20 20 20 20  =PRE_NEW );.    
185e0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
185f0 65 33 5f 70 72 65 75 70 64 61 74 65 5f 6e 65 77  e3_preupdate_new
18600 28 70 44 62 2d 3e 64 62 2c 20 69 49 64 78 2c 20  (pDb->db, iIdx, 
18610 26 70 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20  &pValue);.      
18620 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 66 28    }..        if(
18630 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
18640 7b 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f  {.          Tcl_
18650 4f 62 6a 20 2a 70 4f 62 6a 3b 0a 20 20 20 20 20  Obj *pObj;.     
18660 20 20 20 20 20 70 4f 62 6a 20 3d 20 54 63 6c 5f       pObj = Tcl_
18670 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 28 63 68  NewStringObj((ch
18680 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  ar*)sqlite3_valu
18690 65 5f 74 65 78 74 28 70 56 61 6c 75 65 29 2c 20  e_text(pValue), 
186a0 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 54  -1);.          T
186b0 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
186c0 69 6e 74 65 72 70 2c 20 70 4f 62 6a 29 3b 0a 20  interp, pObj);. 
186d0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
186e0 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65          Tcl_Appe
186f0 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
18700 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
18710 70 44 62 2d 3e 64 62 29 2c 20 30 29 3b 0a 20 20  pDb->db), 0);.  
18720 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54          return T
18730 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  CL_ERROR;.      
18740 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
18750 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
18760 54 45 5f 45 4e 41 42 4c 45 5f 50 52 45 55 50 44  TE_ENABLE_PREUPD
18770 41 54 45 5f 48 4f 4f 4b 20 2a 2f 0a 20 20 20 20  ATE_HOOK */.    
18780 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
18790 0a 20 20 2a 2a 20 20 20 20 24 64 62 20 77 61 6c  .  **    $db wal
187a0 5f 68 6f 6f 6b 20 3f 73 63 72 69 70 74 3f 0a 20  _hook ?script?. 
187b0 20 2a 2a 20 20 20 20 24 64 62 20 75 70 64 61 74   **    $db updat
187c0 65 5f 68 6f 6f 6b 20 3f 73 63 72 69 70 74 3f 0a  e_hook ?script?.
187d0 20 20 2a 2a 20 20 20 20 24 64 62 20 72 6f 6c 6c    **    $db roll
187e0 62 61 63 6b 5f 68 6f 6f 6b 20 3f 73 63 72 69 70  back_hook ?scrip
187f0 74 3f 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  t?.  */.  case D
18800 42 5f 57 41 4c 5f 48 4f 4f 4b 3a 0a 20 20 63 61  B_WAL_HOOK:.  ca
18810 73 65 20 44 42 5f 55 50 44 41 54 45 5f 48 4f 4f  se DB_UPDATE_HOO
18820 4b 3a 0a 20 20 63 61 73 65 20 44 42 5f 52 4f 4c  K:.  case DB_ROL
18830 4c 42 41 43 4b 5f 48 4f 4f 4b 3a 20 7b 0a 20 20  LBACK_HOOK: {.  
18840 20 20 2f 2a 20 73 65 74 20 70 70 48 6f 6f 6b 20    /* set ppHook 
18850 74 6f 20 70 6f 69 6e 74 20 61 74 20 70 55 70 64  to point at pUpd
18860 61 74 65 48 6f 6f 6b 20 6f 72 20 70 52 6f 6c 6c  ateHook or pRoll
18870 62 61 63 6b 48 6f 6f 6b 2c 20 64 65 70 65 6e 64  backHook, depend
18880 69 6e 67 20 6f 6e 0a 20 20 20 20 2a 2a 20 77 68  ing on.    ** wh
18890 65 74 68 65 72 20 5b 24 64 62 20 75 70 64 61 74  ether [$db updat
188a0 65 5f 68 6f 6f 6b 5d 20 6f 72 20 5b 24 64 62 20  e_hook] or [$db 
188b0 72 6f 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 5d 20 77  rollback_hook] w
188c0 61 73 20 69 6e 76 6f 6b 65 64 2e 0a 20 20 20 20  as invoked..    
188d0 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a  */.    Tcl_Obj *
188e0 2a 70 70 48 6f 6f 6b 20 3d 20 30 3b 0a 20 20 20  *ppHook = 0;.   
188f0 20 69 66 28 20 63 68 6f 69 63 65 3d 3d 44 42 5f   if( choice==DB_
18900 57 41 4c 5f 48 4f 4f 4b 20 29 20 70 70 48 6f 6f  WAL_HOOK ) ppHoo
18910 6b 20 3d 20 26 70 44 62 2d 3e 70 57 61 6c 48 6f  k = &pDb->pWalHo
18920 6f 6b 3b 0a 20 20 20 20 69 66 28 20 63 68 6f 69  ok;.    if( choi
18930 63 65 3d 3d 44 42 5f 55 50 44 41 54 45 5f 48 4f  ce==DB_UPDATE_HO
18940 4f 4b 20 29 20 70 70 48 6f 6f 6b 20 3d 20 26 70  OK ) ppHook = &p
18950 44 62 2d 3e 70 55 70 64 61 74 65 48 6f 6f 6b 3b  Db->pUpdateHook;
18960 0a 20 20 20 20 69 66 28 20 63 68 6f 69 63 65 3d  .    if( choice=
18970 3d 44 42 5f 52 4f 4c 4c 42 41 43 4b 5f 48 4f 4f  =DB_ROLLBACK_HOO
18980 4b 20 29 20 70 70 48 6f 6f 6b 20 3d 20 26 70 44  K ) ppHook = &pD
18990 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b  b->pRollbackHook
189a0 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 33  ;.    if( objc>3
189b0 20 29 7b 0a 20 20 20 20 20 20 20 54 63 6c 5f 57   ){.       Tcl_W
189c0 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
189d0 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 53  rp, 2, objv, "?S
189e0 43 52 49 50 54 3f 22 29 3b 0a 20 20 20 20 20 20  CRIPT?");.      
189f0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
18a00 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 44 62  R;.    }..    Db
18a10 48 6f 6f 6b 43 6d 64 28 69 6e 74 65 72 70 2c 20  HookCmd(interp, 
18a20 70 44 62 2c 20 28 6f 62 6a 63 3d 3d 33 20 3f 20  pDb, (objc==3 ? 
18a30 6f 62 6a 76 5b 32 5d 20 3a 20 30 29 2c 20 70 70  objv[2] : 0), pp
18a40 48 6f 6f 6b 29 3b 0a 20 20 20 20 62 72 65 61 6b  Hook);.    break
18a50 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24  ;.  }..  /*    $
18a60 64 62 20 76 65 72 73 69 6f 6e 0a 20 20 2a 2a 0a  db version.  **.
18a70 20 20 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20    ** Return the 
18a80 76 65 72 73 69 6f 6e 20 73 74 72 69 6e 67 20 66  version string f
18a90 6f 72 20 74 68 69 73 20 64 61 74 61 62 61 73 65  or this database
18aa0 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  ..  */.  case DB
18ab0 5f 56 45 52 53 49 4f 4e 3a 20 7b 0a 20 20 20 20  _VERSION: {.    
18ac0 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
18ad0 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 73 71  terp, (char *)sq
18ae0 6c 69 74 65 33 5f 6c 69 62 76 65 72 73 69 6f 6e  lite3_libversion
18af0 28 29 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b  (), TCL_STATIC);
18b00 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
18b10 0a 0a 20 20 7d 20 2f 2a 20 45 6e 64 20 6f 66 20  ..  } /* End of 
18b20 74 68 65 20 53 57 49 54 43 48 20 73 74 61 74 65  the SWITCH state
18b30 6d 65 6e 74 20 2a 2f 0a 20 20 72 65 74 75 72 6e  ment */.  return
18b40 20 72 63 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49   rc;.}..#if SQLI
18b50 54 45 5f 54 43 4c 5f 4e 52 45 0a 2f 2a 0a 2a 2a  TE_TCL_NRE./*.**
18b60 20 41 64 61 70 74 6f 72 20 74 68 61 74 20 70 72   Adaptor that pr
18b70 6f 76 69 64 65 73 20 61 6e 20 6f 62 6a 43 6d 64  ovides an objCmd
18b80 20 69 6e 74 65 72 66 61 63 65 20 74 6f 20 74 68   interface to th
18b90 65 20 4e 52 45 2d 65 6e 61 62 6c 65 64 0a 2a 2a  e NRE-enabled.**
18ba0 20 69 6e 74 65 72 66 61 63 65 20 69 6d 70 6c 65   interface imple
18bb0 6d 65 6e 74 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  mentation..*/.st
18bc0 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
18bd0 54 43 4c 41 50 49 20 44 62 4f 62 6a 43 6d 64 41  TCLAPI DbObjCmdA
18be0 64 61 70 74 6f 72 28 0a 20 20 76 6f 69 64 20 2a  daptor(.  void *
18bf0 63 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  cd,.  Tcl_Interp
18c00 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
18c10 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
18c20 2a 63 6f 6e 73 74 2a 6f 62 6a 76 0a 29 7b 0a 20  *const*objv.){. 
18c30 20 72 65 74 75 72 6e 20 54 63 6c 5f 4e 52 43 61   return Tcl_NRCa
18c40 6c 6c 4f 62 6a 50 72 6f 63 28 69 6e 74 65 72 70  llObjProc(interp
18c50 2c 20 44 62 4f 62 6a 43 6d 64 2c 20 63 64 2c 20  , DbObjCmd, cd, 
18c60 6f 62 6a 63 2c 20 6f 62 6a 76 29 3b 0a 7d 0a 23  objc, objv);.}.#
18c70 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
18c80 54 43 4c 5f 4e 52 45 20 2a 2f 0a 0a 2f 2a 0a 2a  TCL_NRE */../*.*
18c90 2a 20 20 20 73 71 6c 69 74 65 33 20 44 42 4e 41  *   sqlite3 DBNA
18ca0 4d 45 20 46 49 4c 45 4e 41 4d 45 20 3f 2d 76 66  ME FILENAME ?-vf
18cb0 73 20 56 46 53 4e 41 4d 45 3f 20 3f 2d 6b 65 79  s VFSNAME? ?-key
18cc0 20 4b 45 59 3f 20 3f 2d 72 65 61 64 6f 6e 6c 79   KEY? ?-readonly
18cd0 20 42 4f 4f 4c 45 41 4e 3f 0a 2a 2a 20 20 20 20   BOOLEAN?.**    
18ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18cf0 20 20 20 20 20 20 20 3f 2d 63 72 65 61 74 65 20         ?-create 
18d00 42 4f 4f 4c 45 41 4e 3f 20 3f 2d 6e 6f 6d 75 74  BOOLEAN? ?-nomut
18d10 65 78 20 42 4f 4f 4c 45 41 4e 3f 0a 2a 2a 0a 2a  ex BOOLEAN?.**.*
18d20 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 6d 61  * This is the ma
18d30 69 6e 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 2e 20  in Tcl command. 
18d40 20 57 68 65 6e 20 74 68 65 20 22 73 71 6c 69 74   When the "sqlit
18d50 65 22 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 20 69  e" Tcl command i
18d60 73 0a 2a 2a 20 69 6e 76 6f 6b 65 64 2c 20 74 68  s.** invoked, th
18d70 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73 20  is routine runs 
18d80 74 6f 20 70 72 6f 63 65 73 73 20 74 68 61 74 20  to process that 
18d90 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 54  command..**.** T
18da0 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
18db0 74 2c 20 44 42 4e 41 4d 45 2c 20 69 73 20 61 6e  t, DBNAME, is an
18dc0 20 61 72 62 69 74 72 61 72 79 20 6e 61 6d 65 20   arbitrary name 
18dd0 66 6f 72 20 61 20 6e 65 77 0a 2a 2a 20 64 61 74  for a new.** dat
18de0 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
18df0 2e 20 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20  .  This command 
18e00 63 72 65 61 74 65 73 20 61 20 6e 65 77 20 63 6f  creates a new co
18e10 6d 6d 61 6e 64 20 6e 61 6d 65 64 0a 2a 2a 20 44  mmand named.** D
18e20 42 4e 41 4d 45 20 74 68 61 74 20 69 73 20 75 73  BNAME that is us
18e30 65 64 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 74 68  ed to control th
18e40 61 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 20  at connection.  
18e50 54 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  The database.** 
18e60 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 64 65  connection is de
18e70 6c 65 74 65 64 20 77 68 65 6e 20 74 68 65 20 44  leted when the D
18e80 42 4e 41 4d 45 20 63 6f 6d 6d 61 6e 64 20 69 73  BNAME command is
18e90 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20   deleted..**.** 
18ea0 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  The second argum
18eb0 65 6e 74 20 69 73 20 74 68 65 20 6e 61 6d 65 20  ent is the name 
18ec0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
18ed0 66 69 6c 65 2e 0a 2a 2a 0a 2a 2f 0a 73 74 61 74  file..**.*/.stat
18ee0 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43  ic int SQLITE_TC
18ef0 4c 41 50 49 20 44 62 4d 61 69 6e 28 0a 20 20 76  LAPI DbMain(.  v
18f00 6f 69 64 20 2a 63 64 2c 0a 20 20 54 63 6c 5f 49  oid *cd,.  Tcl_I
18f10 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
18f20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
18f30 5f 4f 62 6a 20 2a 63 6f 6e 73 74 2a 6f 62 6a 76  _Obj *const*objv
18f40 0a 29 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a  .){.  SqliteDb *
18f50 70 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  p;.  const char 
18f60 2a 7a 41 72 67 3b 0a 20 20 63 68 61 72 20 2a 7a  *zArg;.  char *z
18f70 45 72 72 4d 73 67 3b 0a 20 20 69 6e 74 20 69 3b  ErrMsg;.  int i;
18f80 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
18f90 46 69 6c 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68  File;.  const ch
18fa0 61 72 20 2a 7a 56 66 73 20 3d 20 30 3b 0a 20 20  ar *zVfs = 0;.  
18fb0 69 6e 74 20 66 6c 61 67 73 3b 0a 20 20 54 63 6c  int flags;.  Tcl
18fc0 5f 44 53 74 72 69 6e 67 20 74 72 61 6e 73 6c 61  _DString transla
18fd0 74 65 64 46 69 6c 65 6e 61 6d 65 3b 0a 23 69 66  tedFilename;.#if
18fe0 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
18ff0 48 41 53 5f 43 4f 44 45 43 29 20 26 26 20 21 64  HAS_CODEC) && !d
19000 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
19010 49 54 5f 43 4f 44 45 43 5f 46 52 4f 4d 5f 54 43  IT_CODEC_FROM_TC
19020 4c 29 0a 20 20 76 6f 69 64 20 2a 70 4b 65 79 20  L).  void *pKey 
19030 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 4b 65 79 20  = 0;.  int nKey 
19040 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 69 6e  = 0;.#endif.  in
19050 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 49 6e 20 6e  t rc;..  /* In n
19060 6f 72 6d 61 6c 20 75 73 65 2c 20 65 61 63 68 20  ormal use, each 
19070 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
19080 72 75 6e 73 20 69 6e 20 61 20 73 69 6e 67 6c 65  runs in a single
19090 20 74 68 72 65 61 64 2e 20 20 53 6f 0a 20 20 2a   thread.  So.  *
190a0 2a 20 62 79 20 64 65 66 61 75 6c 74 2c 20 77 65  * by default, we
190b0 20 63 61 6e 20 74 75 72 6e 20 6f 66 20 6d 75 74   can turn of mut
190c0 65 78 69 6e 67 20 6f 6e 20 53 51 4c 69 74 65 20  exing on SQLite 
190d0 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
190e0 69 6f 6e 73 2e 0a 20 20 2a 2a 20 48 6f 77 65 76  ions..  ** Howev
190f0 65 72 2c 20 66 6f 72 20 74 65 73 74 69 6e 67 20  er, for testing 
19100 70 75 72 70 6f 73 65 73 20 69 74 20 69 73 20 75  purposes it is u
19110 73 65 66 75 6c 20 74 6f 20 68 61 76 65 20 6d 75  seful to have mu
19120 74 65 78 65 73 20 74 75 72 6e 65 64 0a 20 20 2a  texes turned.  *
19130 2a 20 6f 6e 2e 20 20 53 6f 2c 20 62 79 20 64 65  * on.  So, by de
19140 66 61 75 6c 74 2c 20 6d 75 74 65 78 65 73 20 64  fault, mutexes d
19150 65 66 61 75 6c 74 20 6f 66 66 2e 20 20 42 75 74  efault off.  But
19160 20 69 66 20 63 6f 6d 70 69 6c 65 64 20 77 69 74   if compiled wit
19170 68 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 54 43  h.  ** SQLITE_TC
19180 4c 5f 44 45 46 41 55 4c 54 5f 46 55 4c 4c 4d 55  L_DEFAULT_FULLMU
19190 54 45 58 20 74 68 65 6e 20 6d 75 74 65 78 65 73  TEX then mutexes
191a0 20 64 65 66 61 75 6c 74 20 6f 6e 2e 0a 20 20 2a   default on..  *
191b0 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
191c0 54 43 4c 5f 44 45 46 41 55 4c 54 5f 46 55 4c 4c  TCL_DEFAULT_FULL
191d0 4d 55 54 45 58 0a 20 20 66 6c 61 67 73 20 3d 20  MUTEX.  flags = 
191e0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
191f0 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f  WRITE | SQLITE_O
19200 50 45 4e 5f 43 52 45 41 54 45 20 7c 20 53 51 4c  PEN_CREATE | SQL
19210 49 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54  ITE_OPEN_FULLMUT
19220 45 58 3b 0a 23 65 6c 73 65 0a 20 20 66 6c 61 67  EX;.#else.  flag
19230 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s = SQLITE_OPEN_
19240 52 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49  READWRITE | SQLI
19250 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c  TE_OPEN_CREATE |
19260 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d   SQLITE_OPEN_NOM
19270 55 54 45 58 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  UTEX;.#endif..  
19280 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20  if( objc==2 ){. 
19290 20 20 20 7a 41 72 67 20 3d 20 54 63 6c 5f 47 65     zArg = Tcl_Ge
192a0 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
192b0 62 6a 76 5b 31 5d 2c 20 30 29 3b 0a 20 20 20 20  bjv[1], 0);.    
192c0 69 66 28 20 73 74 72 63 6d 70 28 7a 41 72 67 2c  if( strcmp(zArg,
192d0 22 2d 76 65 72 73 69 6f 6e 22 29 3d 3d 30 20 29  "-version")==0 )
192e0 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65  {.      Tcl_Appe
192f0 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
19300 73 71 6c 69 74 65 33 5f 6c 69 62 76 65 72 73 69  sqlite3_libversi
19310 6f 6e 28 29 2c 20 28 63 68 61 72 2a 29 30 29 3b  on(), (char*)0);
19320 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
19330 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  L_OK;.    }.    
19340 69 66 28 20 73 74 72 63 6d 70 28 7a 41 72 67 2c  if( strcmp(zArg,
19350 22 2d 73 6f 75 72 63 65 69 64 22 29 3d 3d 30 20  "-sourceid")==0 
19360 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70  ){.      Tcl_App
19370 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
19380 2c 73 71 6c 69 74 65 33 5f 73 6f 75 72 63 65 69  ,sqlite3_sourcei
19390 64 28 29 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  d(), (char*)0);.
193a0 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
193b0 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  _OK;.    }.    i
193c0 66 28 20 73 74 72 63 6d 70 28 7a 41 72 67 2c 22  f( strcmp(zArg,"
193d0 2d 68 61 73 2d 63 6f 64 65 63 22 29 3d 3d 30 20  -has-codec")==0 
193e0 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  ){.#if defined(S
193f0 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 29  QLITE_HAS_CODEC)
19400 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
19410 49 54 45 5f 4f 4d 49 54 5f 43 4f 44 45 43 5f 46  ITE_OMIT_CODEC_F
19420 52 4f 4d 5f 54 43 4c 29 0a 20 20 20 20 20 20 54  ROM_TCL).      T
19430 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
19440 69 6e 74 65 72 70 2c 22 31 22 2c 28 63 68 61 72  interp,"1",(char
19450 2a 29 30 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20  *)0);.#else.    
19460 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
19470 6c 74 28 69 6e 74 65 72 70 2c 22 30 22 2c 28 63  lt(interp,"0",(c
19480 68 61 72 2a 29 30 29 3b 0a 23 65 6e 64 69 66 0a  har*)0);.#endif.
19490 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
194a0 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  _OK;.    }.  }. 
194b0 20 66 6f 72 28 69 3d 33 3b 20 69 2b 31 3c 6f 62   for(i=3; i+1<ob
194c0 6a 63 3b 20 69 2b 3d 32 29 7b 0a 20 20 20 20 7a  jc; i+=2){.    z
194d0 41 72 67 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  Arg = Tcl_GetStr
194e0 69 6e 67 28 6f 62 6a 76 5b 69 5d 29 3b 0a 20 20  ing(objv[i]);.  
194f0 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 41 72    if( strcmp(zAr
19500 67 2c 22 2d 6b 65 79 22 29 3d 3d 30 20 29 7b 0a  g,"-key")==0 ){.
19510 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
19520 54 45 5f 48 41 53 5f 43 4f 44 45 43 29 20 26 26  TE_HAS_CODEC) &&
19530 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
19540 5f 4f 4d 49 54 5f 43 4f 44 45 43 5f 46 52 4f 4d  _OMIT_CODEC_FROM
19550 5f 54 43 4c 29 0a 20 20 20 20 20 20 70 4b 65 79  _TCL).      pKey
19560 20 3d 20 54 63 6c 5f 47 65 74 42 79 74 65 41 72   = Tcl_GetByteAr
19570 72 61 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  rayFromObj(objv[
19580 69 2b 31 5d 2c 20 26 6e 4b 65 79 29 3b 0a 23 65  i+1], &nKey);.#e
19590 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 20 69  ndif.    }else i
195a0 66 28 20 73 74 72 63 6d 70 28 7a 41 72 67 2c 20  f( strcmp(zArg, 
195b0 22 2d 76 66 73 22 29 3d 3d 30 20 29 7b 0a 20 20  "-vfs")==0 ){.  
195c0 20 20 20 20 7a 56 66 73 20 3d 20 54 63 6c 5f 47      zVfs = Tcl_G
195d0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 69 2b  etString(objv[i+
195e0 31 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  1]);.    }else i
195f0 66 28 20 73 74 72 63 6d 70 28 7a 41 72 67 2c 20  f( strcmp(zArg, 
19600 22 2d 72 65 61 64 6f 6e 6c 79 22 29 3d 3d 30 20  "-readonly")==0 
19610 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 62 3b 0a  ){.      int b;.
19620 20 20 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65        if( Tcl_Ge
19630 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28  tBooleanFromObj(
19640 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 69 2b 31  interp, objv[i+1
19650 5d 2c 20 26 62 29 20 29 20 72 65 74 75 72 6e 20  ], &b) ) return 
19660 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  TCL_ERROR;.     
19670 20 69 66 28 20 62 20 29 7b 0a 20 20 20 20 20 20   if( b ){.      
19680 20 20 66 6c 61 67 73 20 26 3d 20 7e 28 53 51 4c    flags &= ~(SQL
19690 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
196a0 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43  TE|SQLITE_OPEN_C
196b0 52 45 41 54 45 29 3b 0a 20 20 20 20 20 20 20 20  REATE);.        
196c0 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  flags |= SQLITE_
196d0 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  OPEN_READONLY;. 
196e0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
196f0 20 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 53 51      flags &= ~SQ
19700 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
19710 4c 59 3b 0a 20 20 20 20 20 20 20 20 66 6c 61 67  LY;.        flag
19720 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e  s |= SQLITE_OPEN
19730 5f 52 45 41 44 57 52 49 54 45 3b 0a 20 20 20 20  _READWRITE;.    
19740 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66    }.    }else if
19750 28 20 73 74 72 63 6d 70 28 7a 41 72 67 2c 20 22  ( strcmp(zArg, "
19760 2d 63 72 65 61 74 65 22 29 3d 3d 30 20 29 7b 0a  -create")==0 ){.
19770 20 20 20 20 20 20 69 6e 74 20 62 3b 0a 20 20 20        int b;.   
19780 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 42 6f     if( Tcl_GetBo
19790 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74  oleanFromObj(int
197a0 65 72 70 2c 20 6f 62 6a 76 5b 69 2b 31 5d 2c 20  erp, objv[i+1], 
197b0 26 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  &b) ) return TCL
197c0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 69 66  _ERROR;.      if
197d0 28 20 62 20 26 26 20 28 66 6c 61 67 73 20 26 20  ( b && (flags & 
197e0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
197f0 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ONLY)==0 ){.    
19800 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c      flags |= SQL
19810 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 3b  ITE_OPEN_CREATE;
19820 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
19830 20 20 20 20 20 20 66 6c 61 67 73 20 26 3d 20 7e        flags &= ~
19840 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
19850 54 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  TE;.      }.    
19860 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
19870 28 7a 41 72 67 2c 20 22 2d 6e 6f 6d 75 74 65 78  (zArg, "-nomutex
19880 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ")==0 ){.      i
19890 6e 74 20 62 3b 0a 20 20 20 20 20 20 69 66 28 20  nt b;.      if( 
198a0 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72  Tcl_GetBooleanFr
198b0 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
198c0 6a 76 5b 69 2b 31 5d 2c 20 26 62 29 20 29 20 72  jv[i+1], &b) ) r
198d0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
198e0 0a 20 20 20 20 20 20 69 66 28 20 62 20 29 7b 0a  .      if( b ){.
198f0 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d          flags |=
19900 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d   SQLITE_OPEN_NOM
19910 55 54 45 58 3b 0a 20 20 20 20 20 20 20 20 66 6c  UTEX;.        fl
19920 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 4f  ags &= ~SQLITE_O
19930 50 45 4e 5f 46 55 4c 4c 4d 55 54 45 58 3b 0a 20  PEN_FULLMUTEX;. 
19940 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
19950 20 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 53 51      flags &= ~SQ
19960 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45  LITE_OPEN_NOMUTE
19970 58 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  X;.      }.    }
19980 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
19990 7a 41 72 67 2c 20 22 2d 66 75 6c 6c 6d 75 74 65  zArg, "-fullmute
199a0 78 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  x")==0 ){.      
199b0 69 6e 74 20 62 3b 0a 20 20 20 20 20 20 69 66 28  int b;.      if(
199c0 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46   Tcl_GetBooleanF
199d0 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
199e0 62 6a 76 5b 69 2b 31 5d 2c 20 26 62 29 20 29 20  bjv[i+1], &b) ) 
199f0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
19a00 3b 0a 20 20 20 20 20 20 69 66 28 20 62 20 29 7b  ;.      if( b ){
19a10 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c  .        flags |
19a20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55  = SQLITE_OPEN_FU
19a30 4c 4c 4d 55 54 45 58 3b 0a 20 20 20 20 20 20 20  LLMUTEX;.       
19a40 20 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54   flags &= ~SQLIT
19a50 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58 3b 0a  E_OPEN_NOMUTEX;.
19a60 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
19a70 20 20 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 53       flags &= ~S
19a80 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d  QLITE_OPEN_FULLM
19a90 55 54 45 58 3b 0a 20 20 20 20 20 20 7d 0a 20 20  UTEX;.      }.  
19aa0 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
19ab0 6d 70 28 7a 41 72 67 2c 20 22 2d 75 72 69 22 29  mp(zArg, "-uri")
19ac0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ==0 ){.      int
19ad0 20 62 3b 0a 20 20 20 20 20 20 69 66 28 20 54 63   b;.      if( Tc
19ae0 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d  l_GetBooleanFrom
19af0 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
19b00 5b 69 2b 31 5d 2c 20 26 62 29 20 29 20 72 65 74  [i+1], &b) ) ret
19b10 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
19b20 20 20 20 20 20 69 66 28 20 62 20 29 7b 0a 20 20       if( b ){.  
19b30 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 53        flags |= S
19b40 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 3b 0a  QLITE_OPEN_URI;.
19b50 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
19b60 20 20 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 53       flags &= ~S
19b70 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 3b 0a  QLITE_OPEN_URI;.
19b80 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
19b90 65 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70  e{.      Tcl_App
19ba0 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
19bb0 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6f 70 74 69 6f  , "unknown optio
19bc0 6e 3a 20 22 2c 20 7a 41 72 67 2c 20 28 63 68 61  n: ", zArg, (cha
19bd0 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 72 65 74  r*)0);.      ret
19be0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
19bf0 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6f     }.  }.  if( o
19c00 62 6a 63 3c 33 20 7c 7c 20 28 6f 62 6a 63 26 31  bjc<3 || (objc&1
19c10 29 21 3d 31 20 29 7b 0a 20 20 20 20 54 63 6c 5f  )!=1 ){.    Tcl_
19c20 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
19c30 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 0a 20 20  erp, 1, objv,.  
19c40 20 20 20 20 22 48 41 4e 44 4c 45 20 46 49 4c 45      "HANDLE FILE
19c50 4e 41 4d 45 20 3f 2d 76 66 73 20 56 46 53 4e 41  NAME ?-vfs VFSNA
19c60 4d 45 3f 20 3f 2d 72 65 61 64 6f 6e 6c 79 20 42  ME? ?-readonly B
19c70 4f 4f 4c 45 41 4e 3f 20 3f 2d 63 72 65 61 74 65  OOLEAN? ?-create
19c80 20 42 4f 4f 4c 45 41 4e 3f 22 0a 20 20 20 20 20   BOOLEAN?".     
19c90 20 22 20 3f 2d 6e 6f 6d 75 74 65 78 20 42 4f 4f   " ?-nomutex BOO
19ca0 4c 45 41 4e 3f 20 3f 2d 66 75 6c 6c 6d 75 74 65  LEAN? ?-fullmute
19cb0 78 20 42 4f 4f 4c 45 41 4e 3f 20 3f 2d 75 72 69  x BOOLEAN? ?-uri
19cc0 20 42 4f 4f 4c 45 41 4e 3f 22 0a 23 69 66 20 64   BOOLEAN?".#if d
19cd0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 48 41  efined(SQLITE_HA
19ce0 53 5f 43 4f 44 45 43 29 20 26 26 20 21 64 65 66  S_CODEC) && !def
19cf0 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
19d00 5f 43 4f 44 45 43 5f 46 52 4f 4d 5f 54 43 4c 29  _CODEC_FROM_TCL)
19d10 0a 20 20 20 20 20 20 22 20 3f 2d 6b 65 79 20 43  .      " ?-key C
19d20 4f 44 45 43 4b 45 59 3f 22 0a 23 65 6e 64 69 66  ODECKEY?".#endif
19d30 0a 20 20 20 20 29 3b 0a 20 20 20 20 72 65 74 75  .    );.    retu
19d40 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
19d50 7d 0a 20 20 7a 45 72 72 4d 73 67 20 3d 20 30 3b  }.  zErrMsg = 0;
19d60 0a 20 20 70 20 3d 20 28 53 71 6c 69 74 65 44 62  .  p = (SqliteDb
19d70 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28 20 73 69 7a  *)Tcl_Alloc( siz
19d80 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69 66 28  eof(*p) );.  if(
19d90 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 54 63 6c   p==0 ){.    Tcl
19da0 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
19db0 70 2c 20 28 63 68 61 72 20 2a 29 22 6d 61 6c 6c  p, (char *)"mall
19dc0 6f 63 20 66 61 69 6c 65 64 22 2c 20 54 43 4c 5f  oc failed", TCL_
19dd0 53 54 41 54 49 43 29 3b 0a 20 20 20 20 72 65 74  STATIC);.    ret
19de0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
19df0 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30   }.  memset(p, 0
19e00 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20  , sizeof(*p));. 
19e10 20 7a 46 69 6c 65 20 3d 20 54 63 6c 5f 47 65 74   zFile = Tcl_Get
19e20 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
19e30 6a 76 5b 32 5d 2c 20 30 29 3b 0a 20 20 7a 46 69  jv[2], 0);.  zFi
19e40 6c 65 20 3d 20 54 63 6c 5f 54 72 61 6e 73 6c 61  le = Tcl_Transla
19e50 74 65 46 69 6c 65 4e 61 6d 65 28 69 6e 74 65 72  teFileName(inter
19e60 70 2c 20 7a 46 69 6c 65 2c 20 26 74 72 61 6e 73  p, zFile, &trans
19e70 6c 61 74 65 64 46 69 6c 65 6e 61 6d 65 29 3b 0a  latedFilename);.
19e80 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 6f    rc = sqlite3_o
19e90 70 65 6e 5f 76 32 28 7a 46 69 6c 65 2c 20 26 70  pen_v2(zFile, &p
19ea0 2d 3e 64 62 2c 20 66 6c 61 67 73 2c 20 7a 56 66  ->db, flags, zVf
19eb0 73 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e  s);.  Tcl_DStrin
19ec0 67 46 72 65 65 28 26 74 72 61 6e 73 6c 61 74 65  gFree(&translate
19ed0 64 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66  dFilename);.  if
19ee0 28 20 70 2d 3e 64 62 20 29 7b 0a 20 20 20 20 69  ( p->db ){.    i
19ef0 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71  f( SQLITE_OK!=sq
19f00 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28 70 2d  lite3_errcode(p-
19f10 3e 64 62 29 20 29 7b 0a 20 20 20 20 20 20 7a 45  >db) ){.      zE
19f20 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f  rrMsg = sqlite3_
19f30 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20 73 71  mprintf("%s", sq
19f40 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e  lite3_errmsg(p->
19f50 64 62 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  db));.      sqli
19f60 74 65 33 5f 63 6c 6f 73 65 28 70 2d 3e 64 62 29  te3_close(p->db)
19f70 3b 0a 20 20 20 20 20 20 70 2d 3e 64 62 20 3d 20  ;.      p->db = 
19f80 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  0;.    }.  }else
19f90 7b 0a 20 20 20 20 7a 45 72 72 4d 73 67 20 3d 20  {.    zErrMsg = 
19fa0 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
19fb0 22 25 73 22 2c 20 73 71 6c 69 74 65 33 5f 65 72  "%s", sqlite3_er
19fc0 72 73 74 72 28 72 63 29 29 3b 0a 20 20 7d 0a 23  rstr(rc));.  }.#
19fd0 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
19fe0 45 5f 48 41 53 5f 43 4f 44 45 43 29 20 26 26 20  E_HAS_CODEC) && 
19ff0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
1a000 4f 4d 49 54 5f 43 4f 44 45 43 5f 46 52 4f 4d 5f  OMIT_CODEC_FROM_
1a010 54 43 4c 29 0a 20 20 69 66 28 20 70 2d 3e 64 62  TCL).  if( p->db
1a020 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
1a030 6b 65 79 28 70 2d 3e 64 62 2c 20 70 4b 65 79 2c  key(p->db, pKey,
1a040 20 6e 4b 65 79 29 3b 0a 20 20 7d 0a 23 65 6e 64   nKey);.  }.#end
1a050 69 66 0a 20 20 69 66 28 20 70 2d 3e 64 62 3d 3d  if.  if( p->db==
1a060 30 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74  0 ){.    Tcl_Set
1a070 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a  Result(interp, z
1a080 45 72 72 4d 73 67 2c 20 54 43 4c 5f 56 4f 4c 41  ErrMsg, TCL_VOLA
1a090 54 49 4c 45 29 3b 0a 20 20 20 20 54 63 6c 5f 46  TILE);.    Tcl_F
1a0a0 72 65 65 28 28 63 68 61 72 2a 29 70 29 3b 0a 20  ree((char*)p);. 
1a0b0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
1a0c0 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 72 65  zErrMsg);.    re
1a0d0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1a0e0 20 20 7d 0a 20 20 70 2d 3e 6d 61 78 53 74 6d 74    }.  p->maxStmt
1a0f0 20 3d 20 4e 55 4d 5f 50 52 45 50 41 52 45 44 5f   = NUM_PREPARED_
1a100 53 54 4d 54 53 3b 0a 20 20 70 2d 3e 6f 70 65 6e  STMTS;.  p->open
1a110 46 6c 61 67 73 20 3d 20 66 6c 61 67 73 20 26 20  Flags = flags & 
1a120 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 3b  SQLITE_OPEN_URI;
1a130 0a 20 20 70 2d 3e 69 6e 74 65 72 70 20 3d 20 69  .  p->interp = i
1a140 6e 74 65 72 70 3b 0a 20 20 7a 41 72 67 20 3d 20  nterp;.  zArg = 
1a150 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
1a160 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 30 29  mObj(objv[1], 0)
1a170 3b 0a 20 20 69 66 28 20 44 62 55 73 65 4e 72 65  ;.  if( DbUseNre
1a180 28 29 20 29 7b 0a 20 20 20 20 54 63 6c 5f 4e 52  () ){.    Tcl_NR
1a190 43 72 65 61 74 65 43 6f 6d 6d 61 6e 64 28 69 6e  CreateCommand(in
1a1a0 74 65 72 70 2c 20 7a 41 72 67 2c 20 44 62 4f 62  terp, zArg, DbOb
1a1b0 6a 43 6d 64 41 64 61 70 74 6f 72 2c 20 44 62 4f  jCmdAdaptor, DbO
1a1c0 62 6a 43 6d 64 2c 0a 20 20 20 20 20 20 20 20 20  bjCmd,.         
1a1d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
1a1e0 63 68 61 72 2a 29 70 2c 20 44 62 44 65 6c 65 74  char*)p, DbDelet
1a1f0 65 43 6d 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  eCmd);.  }else{.
1a200 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62      Tcl_CreateOb
1a210 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c  jCommand(interp,
1a220 20 7a 41 72 67 2c 20 44 62 4f 62 6a 43 6d 64 2c   zArg, DbObjCmd,
1a230 20 28 63 68 61 72 2a 29 70 2c 20 44 62 44 65 6c   (char*)p, DbDel
1a240 65 74 65 43 6d 64 29 3b 0a 20 20 7d 0a 20 20 72  eteCmd);.  }.  r
1a250 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
1a260 0a 2f 2a 0a 2a 2a 20 50 72 6f 76 69 64 65 20 61  ./*.** Provide a
1a270 20 64 75 6d 6d 79 20 54 63 6c 5f 49 6e 69 74 53   dummy Tcl_InitS
1a280 74 75 62 73 20 69 66 20 77 65 20 61 72 65 20 75  tubs if we are u
1a290 73 69 6e 67 20 74 68 69 73 20 61 73 20 61 20 73  sing this as a s
1a2a0 74 61 74 69 63 0a 2a 2a 20 6c 69 62 72 61 72 79  tatic.** library
1a2b0 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 55 53 45  ..*/.#ifndef USE
1a2c0 5f 54 43 4c 5f 53 54 55 42 53 0a 23 20 75 6e 64  _TCL_STUBS.# und
1a2d0 65 66 20 20 54 63 6c 5f 49 6e 69 74 53 74 75 62  ef  Tcl_InitStub
1a2e0 73 0a 23 20 64 65 66 69 6e 65 20 54 63 6c 5f 49  s.# define Tcl_I
1a2f0 6e 69 74 53 74 75 62 73 28 61 2c 62 2c 63 29 20  nitStubs(a,b,c) 
1a300 54 43 4c 5f 56 45 52 53 49 4f 4e 0a 23 65 6e 64  TCL_VERSION.#end
1a310 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73  if../*.** Make s
1a320 75 72 65 20 77 65 20 68 61 76 65 20 61 20 50 41  ure we have a PA
1a330 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e 20 6d 61  CKAGE_VERSION ma
1a340 63 72 6f 20 64 65 66 69 6e 65 64 2e 20 20 54 68  cro defined.  Th
1a350 69 73 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 64 65  is will be.** de
1a360 66 69 6e 65 64 20 61 75 74 6f 6d 61 74 69 63 61  fined automatica
1a370 6c 6c 79 20 62 79 20 74 68 65 20 54 45 41 20 6d  lly by the TEA m
1a380 61 6b 65 66 69 6c 65 2e 20 20 42 75 74 20 6f 74  akefile.  But ot
1a390 68 65 72 20 6d 61 6b 65 66 69 6c 65 73 0a 2a 2a  her makefiles.**
1a3a0 20 64 6f 20 6e 6f 74 20 64 65 66 69 6e 65 20 69   do not define i
1a3b0 74 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 50 41  t..*/.#ifndef PA
1a3c0 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e 0a 23 20  CKAGE_VERSION.# 
1a3d0 64 65 66 69 6e 65 20 50 41 43 4b 41 47 45 5f 56  define PACKAGE_V
1a3e0 45 52 53 49 4f 4e 20 53 51 4c 49 54 45 5f 56 45  ERSION SQLITE_VE
1a3f0 52 53 49 4f 4e 0a 23 65 6e 64 69 66 0a 0a 2f 2a  RSION.#endif../*
1a400 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74  .** Initialize t
1a410 68 69 73 20 6d 6f 64 75 6c 65 2e 0a 2a 2a 0a 2a  his module..**.*
1a420 2a 20 54 68 69 73 20 54 63 6c 20 6d 6f 64 75 6c  * This Tcl modul
1a430 65 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 6c 79 20  e contains only 
1a440 61 20 73 69 6e 67 6c 65 20 6e 65 77 20 54 63 6c  a single new Tcl
1a450 20 63 6f 6d 6d 61 6e 64 20 6e 61 6d 65 64 20 22   command named "
1a460 73 71 6c 69 74 65 22 2e 0a 2a 2a 20 28 48 65 6e  sqlite"..** (Hen
1a470 63 65 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e  ce there is no n
1a480 61 6d 65 73 70 61 63 65 2e 20 20 54 68 65 72 65  amespace.  There
1a490 20 69 73 20 6e 6f 20 70 6f 69 6e 74 20 69 6e 20   is no point in 
1a4a0 75 73 69 6e 67 20 61 20 6e 61 6d 65 73 70 61 63  using a namespac
1a4b0 65 0a 2a 2a 20 69 66 20 74 68 65 20 65 78 74 65  e.** if the exte
1a4c0 6e 73 69 6f 6e 20 6f 6e 6c 79 20 73 75 70 70 6c  nsion only suppl
1a4d0 69 65 73 20 6f 6e 65 20 6e 65 77 20 6e 61 6d 65  ies one new name
1a4e0 21 29 20 20 54 68 65 20 22 73 71 6c 69 74 65 22  !)  The "sqlite"
1a4f0 20 63 6f 6d 6d 61 6e 64 20 69 73 0a 2a 2a 20 75   command is.** u
1a500 73 65 64 20 74 6f 20 6f 70 65 6e 20 61 20 6e 65  sed to open a ne
1a510 77 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73  w SQLite databas
1a520 65 2e 20 20 53 65 65 20 74 68 65 20 44 62 4d 61  e.  See the DbMa
1a530 69 6e 28 29 20 72 6f 75 74 69 6e 65 20 61 62 6f  in() routine abo
1a540 76 65 0a 2a 2a 20 66 6f 72 20 61 64 64 69 74 69  ve.** for additi
1a550 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
1a560 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 58 54 45  ..**.** The EXTE
1a570 52 4e 20 6d 61 63 72 6f 73 20 61 72 65 20 72 65  RN macros are re
1a580 71 75 69 72 65 64 20 62 79 20 54 43 4c 20 69 6e  quired by TCL in
1a590 20 6f 72 64 65 72 20 74 6f 20 77 6f 72 6b 20 6f   order to work o
1a5a0 6e 20 77 69 6e 64 6f 77 73 2e 0a 2a 2f 0a 45 58  n windows..*/.EX
1a5b0 54 45 52 4e 20 69 6e 74 20 53 71 6c 69 74 65 33  TERN int Sqlite3
1a5c0 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
1a5d0 20 2a 69 6e 74 65 72 70 29 7b 0a 20 20 69 6e 74   *interp){.  int
1a5e0 20 72 63 20 3d 20 54 63 6c 5f 49 6e 69 74 53 74   rc = Tcl_InitSt
1a5f0 75 62 73 28 69 6e 74 65 72 70 2c 20 22 38 2e 34  ubs(interp, "8.4
1a600 22 2c 20 30 29 20 3f 20 54 43 4c 5f 4f 4b 20 3a  ", 0) ? TCL_OK :
1a610 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
1a620 28 20 72 63 3d 3d 54 43 4c 5f 4f 4b 20 29 7b 0a  ( rc==TCL_OK ){.
1a630 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62      Tcl_CreateOb
1a640 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c  jCommand(interp,
1a650 20 22 73 71 6c 69 74 65 33 22 2c 20 28 54 63 6c   "sqlite3", (Tcl
1a660 5f 4f 62 6a 43 6d 64 50 72 6f 63 2a 29 44 62 4d  _ObjCmdProc*)DbM
1a670 61 69 6e 2c 20 30 2c 20 30 29 3b 0a 23 69 66 6e  ain, 0, 0);.#ifn
1a680 64 65 66 20 53 51 4c 49 54 45 5f 33 5f 53 55 46  def SQLITE_3_SUF
1a690 46 49 58 5f 4f 4e 4c 59 0a 20 20 20 20 2f 2a 20  FIX_ONLY.    /* 
1a6a0 54 68 65 20 22 73 71 6c 69 74 65 22 20 61 6c 69  The "sqlite" ali
1a6b0 61 73 20 69 73 20 75 6e 64 6f 63 75 6d 65 6e 74  as is undocument
1a6c0 65 64 2e 20 20 49 74 20 69 73 20 68 65 72 65 20  ed.  It is here 
1a6d0 6f 6e 6c 79 20 74 6f 20 73 75 70 70 6f 72 74 0a  only to support.
1a6e0 20 20 20 20 2a 2a 20 6c 65 67 61 63 79 20 73 63      ** legacy sc
1a6f0 72 69 70 74 73 2e 20 20 41 6c 6c 20 6e 65 77 20  ripts.  All new 
1a700 73 63 72 69 70 74 73 20 73 68 6f 75 6c 64 20 75  scripts should u
1a710 73 65 20 6f 6e 6c 79 20 74 68 65 20 22 73 71 6c  se only the "sql
1a720 69 74 65 33 22 0a 20 20 20 20 2a 2a 20 63 6f 6d  ite3".    ** com
1a730 6d 61 6e 64 2e 20 2a 2f 0a 20 20 20 20 54 63 6c  mand. */.    Tcl
1a740 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e  _CreateObjComman
1a750 64 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74  d(interp, "sqlit
1a760 65 22 2c 20 28 54 63 6c 5f 4f 62 6a 43 6d 64 50  e", (Tcl_ObjCmdP
1a770 72 6f 63 2a 29 44 62 4d 61 69 6e 2c 20 30 2c 20  roc*)DbMain, 0, 
1a780 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 72  0);.#endif.    r
1a790 63 20 3d 20 54 63 6c 5f 50 6b 67 50 72 6f 76 69  c = Tcl_PkgProvi
1a7a0 64 65 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69  de(interp, "sqli
1a7b0 74 65 33 22 2c 20 50 41 43 4b 41 47 45 5f 56 45  te3", PACKAGE_VE
1a7c0 52 53 49 4f 4e 29 3b 0a 20 20 7d 0a 20 20 72 65  RSION);.  }.  re
1a7d0 74 75 72 6e 20 72 63 3b 0a 7d 0a 45 58 54 45 52  turn rc;.}.EXTER
1a7e0 4e 20 69 6e 74 20 54 63 6c 73 71 6c 69 74 65 33  N int Tclsqlite3
1a7f0 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
1a800 20 2a 69 6e 74 65 72 70 29 7b 20 72 65 74 75 72   *interp){ retur
1a810 6e 20 53 71 6c 69 74 65 33 5f 49 6e 69 74 28 69  n Sqlite3_Init(i
1a820 6e 74 65 72 70 29 3b 20 7d 0a 45 58 54 45 52 4e  nterp); }.EXTERN
1a830 20 69 6e 74 20 53 71 6c 69 74 65 33 5f 55 6e 6c   int Sqlite3_Unl
1a840 6f 61 64 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a  oad(Tcl_Interp *
1a850 69 6e 74 65 72 70 2c 20 69 6e 74 20 66 6c 61 67  interp, int flag
1a860 73 29 7b 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  s){ return TCL_O
1a870 4b 3b 20 7d 0a 45 58 54 45 52 4e 20 69 6e 74 20  K; }.EXTERN int 
1a880 54 63 6c 73 71 6c 69 74 65 33 5f 55 6e 6c 6f 61  Tclsqlite3_Unloa
1a890 64 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  d(Tcl_Interp *in
1a8a0 74 65 72 70 2c 20 69 6e 74 20 66 6c 61 67 73 29  terp, int flags)
1a8b0 7b 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b  { return TCL_OK;
1a8c0 20 7d 0a 0a 2f 2a 20 42 65 63 61 75 73 65 20 69   }../* Because i
1a8d0 74 20 61 63 63 65 73 73 65 73 20 74 68 65 20 66  t accesses the f
1a8e0 69 6c 65 2d 73 79 73 74 65 6d 20 61 6e 64 20 75  ile-system and u
1a8f0 73 65 73 20 70 65 72 73 69 73 74 65 6e 74 20 73  ses persistent s
1a900 74 61 74 65 2c 20 53 51 4c 69 74 65 0a 2a 2a 20  tate, SQLite.** 
1a910 69 73 20 6e 6f 74 20 63 6f 6e 73 69 64 65 72 65  is not considere
1a920 64 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f  d appropriate fo
1a930 72 20 73 61 66 65 20 69 6e 74 65 72 70 72 65 74  r safe interpret
1a940 65 72 73 2e 20 20 48 65 6e 63 65 2c 20 77 65 20  ers.  Hence, we 
1a950 63 61 75 73 65 0a 2a 2a 20 74 68 65 20 5f 53 61  cause.** the _Sa
1a960 66 65 49 6e 69 74 28 29 20 69 6e 74 65 72 66 61  feInit() interfa
1a970 63 65 73 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ces return TCL_E
1a980 52 52 4f 52 2e 0a 2a 2f 0a 45 58 54 45 52 4e 20  RROR..*/.EXTERN 
1a990 69 6e 74 20 53 71 6c 69 74 65 33 5f 53 61 66 65  int Sqlite3_Safe
1a9a0 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20  Init(Tcl_Interp 
1a9b0 2a 69 6e 74 65 72 70 29 7b 20 72 65 74 75 72 6e  *interp){ return
1a9c0 20 54 43 4c 5f 45 52 52 4f 52 3b 20 7d 0a 45 58   TCL_ERROR; }.EX
1a9d0 54 45 52 4e 20 69 6e 74 20 53 71 6c 69 74 65 33  TERN int Sqlite3
1a9e0 5f 53 61 66 65 55 6e 6c 6f 61 64 28 54 63 6c 5f  _SafeUnload(Tcl_
1a9f0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
1aa00 69 6e 74 20 66 6c 61 67 73 29 7b 72 65 74 75 72  int flags){retur
1aa10 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 7d 0a 0a 0a  n TCL_ERROR;}...
1aa20 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1aa30 33 5f 53 55 46 46 49 58 5f 4f 4e 4c 59 0a 69 6e  3_SUFFIX_ONLY.in
1aa40 74 20 53 71 6c 69 74 65 5f 49 6e 69 74 28 54 63  t Sqlite_Init(Tc
1aa50 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
1aa60 29 7b 20 72 65 74 75 72 6e 20 53 71 6c 69 74 65  ){ return Sqlite
1aa70 33 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 20  3_Init(interp); 
1aa80 7d 0a 69 6e 74 20 54 63 6c 73 71 6c 69 74 65 5f  }.int Tclsqlite_
1aa90 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20  Init(Tcl_Interp 
1aaa0 2a 69 6e 74 65 72 70 29 7b 20 72 65 74 75 72 6e  *interp){ return
1aab0 20 53 71 6c 69 74 65 33 5f 49 6e 69 74 28 69 6e   Sqlite3_Init(in
1aac0 74 65 72 70 29 3b 20 7d 0a 69 6e 74 20 53 71 6c  terp); }.int Sql
1aad0 69 74 65 5f 55 6e 6c 6f 61 64 28 54 63 6c 5f 49  ite_Unload(Tcl_I
1aae0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69  nterp *interp, i
1aaf0 6e 74 20 66 6c 61 67 73 29 7b 20 72 65 74 75 72  nt flags){ retur
1ab00 6e 20 54 43 4c 5f 4f 4b 3b 20 7d 0a 69 6e 74 20  n TCL_OK; }.int 
1ab10 54 63 6c 73 71 6c 69 74 65 5f 55 6e 6c 6f 61 64  Tclsqlite_Unload
1ab20 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74  (Tcl_Interp *int
1ab30 65 72 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b  erp, int flags){
1ab40 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20   return TCL_OK; 
1ab50 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66  }.#endif..#ifdef
1ab60 20 54 43 4c 53 48 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a   TCLSH./********
1ab70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ab80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ab90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1aba0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1abb0 2a 2a 2a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 66 20  *****.** All of 
1abc0 74 68 65 20 63 6f 64 65 20 74 68 61 74 20 66 6f  the code that fo
1abd0 6c 6c 6f 77 73 20 69 73 20 75 73 65 64 20 74 6f  llows is used to
1abe0 20 62 75 69 6c 64 20 73 74 61 6e 64 61 6c 6f 6e   build standalon
1abf0 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
1ac00 72 73 0a 2a 2a 20 74 68 61 74 20 61 72 65 20 73  rs.** that are s
1ac10 74 61 74 69 63 61 6c 6c 79 20 6c 69 6e 6b 65 64  tatically linked
1ac20 20 77 69 74 68 20 53 51 4c 69 74 65 2e 20 20 45   with SQLite.  E
1ac30 6e 61 62 6c 65 20 74 68 65 73 65 20 62 79 20 63  nable these by c
1ac40 6f 6d 70 69 6c 69 6e 67 0a 2a 2a 20 77 69 74 68  ompiling.** with
1ac50 20 2d 44 54 43 4c 53 48 3d 6e 20 77 68 65 72 65   -DTCLSH=n where
1ac60 20 6e 20 63 61 6e 20 62 65 20 31 20 6f 72 20 32   n can be 1 or 2
1ac70 2e 20 20 41 6e 20 6e 20 6f 66 20 31 20 67 65 6e  .  An n of 1 gen
1ac80 65 72 61 74 65 73 20 61 20 73 74 61 6e 64 61 72  erates a standar
1ac90 64 0a 2a 2a 20 74 63 6c 73 68 20 62 75 74 20 77  d.** tclsh but w
1aca0 69 74 68 20 53 51 4c 69 74 65 20 62 75 69 6c 74  ith SQLite built
1acb0 20 69 6e 2e 20 20 41 6e 20 6e 20 6f 66 20 32 20   in.  An n of 2 
1acc0 67 65 6e 65 72 61 74 65 73 20 74 68 65 20 53 51  generates the SQ
1acd0 4c 69 74 65 20 73 70 61 63 65 0a 2a 2a 20 61 6e  Lite space.** an
1ace0 61 6c 79 73 69 73 20 70 72 6f 67 72 61 6d 2e 0a  alysis program..
1acf0 2a 2f 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  */..#if defined(
1ad00 53 51 4c 49 54 45 5f 54 45 53 54 29 20 7c 7c 20  SQLITE_TEST) || 
1ad10 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
1ad20 43 4c 4d 44 35 29 0a 2f 2a 0a 20 2a 20 54 68 69  CLMD5)./*. * Thi
1ad30 73 20 63 6f 64 65 20 69 6d 70 6c 65 6d 65 6e 74  s code implement
1ad40 73 20 74 68 65 20 4d 44 35 20 6d 65 73 73 61 67  s the MD5 messag
1ad50 65 2d 64 69 67 65 73 74 20 61 6c 67 6f 72 69 74  e-digest algorit
1ad60 68 6d 2e 0a 20 2a 20 54 68 65 20 61 6c 67 6f 72  hm.. * The algor
1ad70 69 74 68 6d 20 69 73 20 64 75 65 20 74 6f 20 52  ithm is due to R
1ad80 6f 6e 20 52 69 76 65 73 74 2e 20 20 54 68 69 73  on Rivest.  This
1ad90 20 63 6f 64 65 20 77 61 73 0a 20 2a 20 77 72 69   code was. * wri
1ada0 74 74 65 6e 20 62 79 20 43 6f 6c 69 6e 20 50 6c  tten by Colin Pl
1adb0 75 6d 62 20 69 6e 20 31 39 39 33 2c 20 6e 6f 20  umb in 1993, no 
1adc0 63 6f 70 79 72 69 67 68 74 20 69 73 20 63 6c 61  copyright is cla
1add0 69 6d 65 64 2e 0a 20 2a 20 54 68 69 73 20 63 6f  imed.. * This co
1ade0 64 65 20 69 73 20 69 6e 20 74 68 65 20 70 75 62  de is in the pub
1adf0 6c 69 63 20 64 6f 6d 61 69 6e 3b 20 64 6f 20 77  lic domain; do w
1ae00 69 74 68 20 69 74 20 77 68 61 74 20 79 6f 75 20  ith it what you 
1ae10 77 69 73 68 2e 0a 20 2a 0a 20 2a 20 45 71 75 69  wish.. *. * Equi
1ae20 76 61 6c 65 6e 74 20 63 6f 64 65 20 69 73 20 61  valent code is a
1ae30 76 61 69 6c 61 62 6c 65 20 66 72 6f 6d 20 52 53  vailable from RS
1ae40 41 20 44 61 74 61 20 53 65 63 75 72 69 74 79 2c  A Data Security,
1ae50 20 49 6e 63 2e 0a 20 2a 20 54 68 69 73 20 63 6f   Inc.. * This co
1ae60 64 65 20 68 61 73 20 62 65 65 6e 20 74 65 73 74  de has been test
1ae70 65 64 20 61 67 61 69 6e 73 74 20 74 68 61 74 2c  ed against that,
1ae80 20 61 6e 64 20 69 73 20 65 71 75 69 76 61 6c 65   and is equivale
1ae90 6e 74 2c 0a 20 2a 20 65 78 63 65 70 74 20 74 68  nt,. * except th
1aea0 61 74 20 79 6f 75 20 64 6f 6e 27 74 20 6e 65 65  at you don't nee
1aeb0 64 20 74 6f 20 69 6e 63 6c 75 64 65 20 74 77 6f  d to include two
1aec0 20 70 61 67 65 73 20 6f 66 20 6c 65 67 61 6c 65   pages of legale
1aed0 73 65 0a 20 2a 20 77 69 74 68 20 65 76 65 72 79  se. * with every
1aee0 20 63 6f 70 79 2e 0a 20 2a 0a 20 2a 20 54 6f 20   copy.. *. * To 
1aef0 63 6f 6d 70 75 74 65 20 74 68 65 20 6d 65 73 73  compute the mess
1af00 61 67 65 20 64 69 67 65 73 74 20 6f 66 20 61 20  age digest of a 
1af10 63 68 75 6e 6b 20 6f 66 20 62 79 74 65 73 2c 20  chunk of bytes, 
1af20 64 65 63 6c 61 72 65 20 61 6e 0a 20 2a 20 4d 44  declare an. * MD
1af30 35 43 6f 6e 74 65 78 74 20 73 74 72 75 63 74 75  5Context structu
1af40 72 65 2c 20 70 61 73 73 20 69 74 20 74 6f 20 4d  re, pass it to M
1af50 44 35 49 6e 69 74 2c 20 63 61 6c 6c 20 4d 44 35  D5Init, call MD5
1af60 55 70 64 61 74 65 20 61 73 0a 20 2a 20 6e 65 65  Update as. * nee
1af70 64 65 64 20 6f 6e 20 62 75 66 66 65 72 73 20 66  ded on buffers f
1af80 75 6c 6c 20 6f 66 20 62 79 74 65 73 2c 20 61 6e  ull of bytes, an
1af90 64 20 74 68 65 6e 20 63 61 6c 6c 20 4d 44 35 46  d then call MD5F
1afa0 69 6e 61 6c 2c 20 77 68 69 63 68 0a 20 2a 20 77  inal, which. * w
1afb0 69 6c 6c 20 66 69 6c 6c 20 61 20 73 75 70 70 6c  ill fill a suppl
1afc0 69 65 64 20 31 36 2d 62 79 74 65 20 61 72 72 61  ied 16-byte arra
1afd0 79 20 77 69 74 68 20 74 68 65 20 64 69 67 65 73  y with the diges
1afe0 74 2e 0a 20 2a 2f 0a 0a 2f 2a 0a 20 2a 20 49 66  t.. */../*. * If
1aff0 20 63 6f 6d 70 69 6c 65 64 20 6f 6e 20 61 20 6d   compiled on a m
1b000 61 63 68 69 6e 65 20 74 68 61 74 20 64 6f 65 73  achine that does
1b010 6e 27 74 20 68 61 76 65 20 61 20 33 32 2d 62 69  n't have a 32-bi
1b020 74 20 69 6e 74 65 67 65 72 2c 0a 20 2a 20 79 6f  t integer,. * yo
1b030 75 20 6a 75 73 74 20 73 65 74 20 22 75 69 6e 74  u just set "uint
1b040 33 32 22 20 74 6f 20 74 68 65 20 61 70 70 72 6f  32" to the appro
1b050 70 72 69 61 74 65 20 64 61 74 61 74 79 70 65 20  priate datatype 
1b060 66 6f 72 20 61 6e 0a 20 2a 20 75 6e 73 69 67 6e  for an. * unsign
1b070 65 64 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65  ed 32-bit intege
1b080 72 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a  r.  For example:
1b090 0a 20 2a 0a 20 2a 20 20 20 20 20 20 20 63 63 20  . *. *       cc 
1b0a0 2d 44 75 69 6e 74 33 32 3d 27 75 6e 73 69 67 6e  -Duint32='unsign
1b0b0 65 64 20 6c 6f 6e 67 27 20 6d 64 35 2e 63 0a 20  ed long' md5.c. 
1b0c0 2a 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 75 69  *. */.#ifndef ui
1b0d0 6e 74 33 32 0a 23 20 20 64 65 66 69 6e 65 20 75  nt32.#  define u
1b0e0 69 6e 74 33 32 20 75 6e 73 69 67 6e 65 64 20 69  int32 unsigned i
1b0f0 6e 74 0a 23 65 6e 64 69 66 0a 0a 73 74 72 75 63  nt.#endif..struc
1b100 74 20 4d 44 35 43 6f 6e 74 65 78 74 20 7b 0a 20  t MD5Context {. 
1b110 20 69 6e 74 20 69 73 49 6e 69 74 3b 0a 20 20 75   int isInit;.  u
1b120 69 6e 74 33 32 20 62 75 66 5b 34 5d 3b 0a 20 20  int32 buf[4];.  
1b130 75 69 6e 74 33 32 20 62 69 74 73 5b 32 5d 3b 0a  uint32 bits[2];.
1b140 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
1b150 69 6e 5b 36 34 5d 3b 0a 7d 3b 0a 74 79 70 65 64  in[64];.};.typed
1b160 65 66 20 73 74 72 75 63 74 20 4d 44 35 43 6f 6e  ef struct MD5Con
1b170 74 65 78 74 20 4d 44 35 43 6f 6e 74 65 78 74 3b  text MD5Context;
1b180 0a 0a 2f 2a 0a 20 2a 20 4e 6f 74 65 3a 20 74 68  ../*. * Note: th
1b190 69 73 20 63 6f 64 65 20 69 73 20 68 61 72 6d 6c  is code is harml
1b1a0 65 73 73 20 6f 6e 20 6c 69 74 74 6c 65 2d 65 6e  ess on little-en
1b1b0 64 69 61 6e 20 6d 61 63 68 69 6e 65 73 2e 0a 20  dian machines.. 
1b1c0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62  */.static void b
1b1d0 79 74 65 52 65 76 65 72 73 65 20 28 75 6e 73 69  yteReverse (unsi
1b1e0 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66 2c 20  gned char *buf, 
1b1f0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 73 29 7b  unsigned longs){
1b200 0a 20 20 20 20 20 20 20 20 75 69 6e 74 33 32 20  .        uint32 
1b210 74 3b 0a 20 20 20 20 20 20 20 20 64 6f 20 7b 0a  t;.        do {.
1b220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b230 74 20 3d 20 28 75 69 6e 74 33 32 29 28 28 75 6e  t = (uint32)((un
1b240 73 69 67 6e 65 64 29 62 75 66 5b 33 5d 3c 3c 38  signed)buf[3]<<8
1b250 20 7c 20 62 75 66 5b 32 5d 29 20 3c 3c 20 31 36   | buf[2]) << 16
1b260 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   |.             
1b270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
1b280 28 75 6e 73 69 67 6e 65 64 29 62 75 66 5b 31 5d  (unsigned)buf[1]
1b290 3c 3c 38 20 7c 20 62 75 66 5b 30 5d 29 3b 0a 20  <<8 | buf[0]);. 
1b2a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
1b2b0 28 75 69 6e 74 33 32 20 2a 29 62 75 66 20 3d 20  (uint32 *)buf = 
1b2c0 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t;.             
1b2d0 20 20 20 62 75 66 20 2b 3d 20 34 3b 0a 20 20 20     buf += 4;.   
1b2e0 20 20 20 20 20 7d 20 77 68 69 6c 65 20 28 2d 2d       } while (--
1b2f0 6c 6f 6e 67 73 29 3b 0a 7d 0a 2f 2a 20 54 68 65  longs);.}./* The
1b300 20 66 6f 75 72 20 63 6f 72 65 20 66 75 6e 63 74   four core funct
1b310 69 6f 6e 73 20 2d 20 46 31 20 69 73 20 6f 70 74  ions - F1 is opt
1b320 69 6d 69 7a 65 64 20 73 6f 6d 65 77 68 61 74 20  imized somewhat 
1b330 2a 2f 0a 0a 2f 2a 20 23 64 65 66 69 6e 65 20 46  */../* #define F
1b340 31 28 78 2c 20 79 2c 20 7a 29 20 28 78 20 26 20  1(x, y, z) (x & 
1b350 79 20 7c 20 7e 78 20 26 20 7a 29 20 2a 2f 0a 23  y | ~x & z) */.#
1b360 64 65 66 69 6e 65 20 46 31 28 78 2c 20 79 2c 20  define F1(x, y, 
1b370 7a 29 20 28 7a 20 5e 20 28 78 20 26 20 28 79 20  z) (z ^ (x & (y 
1b380 5e 20 7a 29 29 29 0a 23 64 65 66 69 6e 65 20 46  ^ z))).#define F
1b390 32 28 78 2c 20 79 2c 20 7a 29 20 46 31 28 7a 2c  2(x, y, z) F1(z,
1b3a0 20 78 2c 20 79 29 0a 23 64 65 66 69 6e 65 20 46   x, y).#define F
1b3b0 33 28 78 2c 20 79 2c 20 7a 29 20 28 78 20 5e 20  3(x, y, z) (x ^ 
1b3c0 79 20 5e 20 7a 29 0a 23 64 65 66 69 6e 65 20 46  y ^ z).#define F
1b3d0 34 28 78 2c 20 79 2c 20 7a 29 20 28 79 20 5e 20  4(x, y, z) (y ^ 
1b3e0 28 78 20 7c 20 7e 7a 29 29 0a 0a 2f 2a 20 54 68  (x | ~z))../* Th
1b3f0 69 73 20 69 73 20 74 68 65 20 63 65 6e 74 72 61  is is the centra
1b400 6c 20 73 74 65 70 20 69 6e 20 74 68 65 20 4d 44  l step in the MD
1b410 35 20 61 6c 67 6f 72 69 74 68 6d 2e 20 2a 2f 0a  5 algorithm. */.
1b420 23 64 65 66 69 6e 65 20 4d 44 35 53 54 45 50 28  #define MD5STEP(
1b430 66 2c 20 77 2c 20 78 2c 20 79 2c 20 7a 2c 20 64  f, w, x, y, z, d
1b440 61 74 61 2c 20 73 29 20 5c 0a 20 20 20 20 20 20  ata, s) \.      
1b450 20 20 28 20 77 20 2b 3d 20 66 28 78 2c 20 79 2c    ( w += f(x, y,
1b460 20 7a 29 20 2b 20 64 61 74 61 2c 20 20 77 20 3d   z) + data,  w =
1b470 20 77 3c 3c 73 20 7c 20 77 3e 3e 28 33 32 2d 73   w<<s | w>>(32-s
1b480 29 2c 20 20 77 20 2b 3d 20 78 20 29 0a 0a 2f 2a  ),  w += x )../*
1b490 0a 20 2a 20 54 68 65 20 63 6f 72 65 20 6f 66 20  . * The core of 
1b4a0 74 68 65 20 4d 44 35 20 61 6c 67 6f 72 69 74 68  the MD5 algorith
1b4b0 6d 2c 20 74 68 69 73 20 61 6c 74 65 72 73 20 61  m, this alters a
1b4c0 6e 20 65 78 69 73 74 69 6e 67 20 4d 44 35 20 68  n existing MD5 h
1b4d0 61 73 68 20 74 6f 0a 20 2a 20 72 65 66 6c 65 63  ash to. * reflec
1b4e0 74 20 74 68 65 20 61 64 64 69 74 69 6f 6e 20 6f  t the addition o
1b4f0 66 20 31 36 20 6c 6f 6e 67 77 6f 72 64 73 20 6f  f 16 longwords o
1b500 66 20 6e 65 77 20 64 61 74 61 2e 20 20 4d 44 35  f new data.  MD5
1b510 55 70 64 61 74 65 20 62 6c 6f 63 6b 73 0a 20 2a  Update blocks. *
1b520 20 74 68 65 20 64 61 74 61 20 61 6e 64 20 63 6f   the data and co
1b530 6e 76 65 72 74 73 20 62 79 74 65 73 20 69 6e 74  nverts bytes int
1b540 6f 20 6c 6f 6e 67 77 6f 72 64 73 20 66 6f 72 20  o longwords for 
1b550 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 20 2a  this routine.. *
1b560 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 4d 44  /.static void MD
1b570 35 54 72 61 6e 73 66 6f 72 6d 28 75 69 6e 74 33  5Transform(uint3
1b580 32 20 62 75 66 5b 34 5d 2c 20 63 6f 6e 73 74 20  2 buf[4], const 
1b590 75 69 6e 74 33 32 20 69 6e 5b 31 36 5d 29 7b 0a  uint32 in[16]){.
1b5a0 20 20 20 20 20 20 20 20 72 65 67 69 73 74 65 72          register
1b5b0 20 75 69 6e 74 33 32 20 61 2c 20 62 2c 20 63 2c   uint32 a, b, c,
1b5c0 20 64 3b 0a 0a 20 20 20 20 20 20 20 20 61 20 3d   d;..        a =
1b5d0 20 62 75 66 5b 30 5d 3b 0a 20 20 20 20 20 20 20   buf[0];.       
1b5e0 20 62 20 3d 20 62 75 66 5b 31 5d 3b 0a 20 20 20   b = buf[1];.   
1b5f0 20 20 20 20 20 63 20 3d 20 62 75 66 5b 32 5d 3b       c = buf[2];
1b600 0a 20 20 20 20 20 20 20 20 64 20 3d 20 62 75 66  .        d = buf
1b610 5b 33 5d 3b 0a 0a 20 20 20 20 20 20 20 20 4d 44  [3];..        MD
1b620 35 53 54 45 50 28 46 31 2c 20 61 2c 20 62 2c 20  5STEP(F1, a, b, 
1b630 63 2c 20 64 2c 20 69 6e 5b 20 30 5d 2b 30 78 64  c, d, in[ 0]+0xd
1b640 37 36 61 61 34 37 38 2c 20 20 37 29 3b 0a 20 20  76aa478,  7);.  
1b650 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 31        MD5STEP(F1
1b660 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e  , d, a, b, c, in
1b670 5b 20 31 5d 2b 30 78 65 38 63 37 62 37 35 36 2c  [ 1]+0xe8c7b756,
1b680 20 31 32 29 3b 0a 20 20 20 20 20 20 20 20 4d 44   12);.        MD
1b690 35 53 54 45 50 28 46 31 2c 20 63 2c 20 64 2c 20  5STEP(F1, c, d, 
1b6a0 61 2c 20 62 2c 20 69 6e 5b 20 32 5d 2b 30 78 32  a, b, in[ 2]+0x2
1b6b0 34 32 30 37 30 64 62 2c 20 31 37 29 3b 0a 20 20  42070db, 17);.  
1b6c0 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 31        MD5STEP(F1
1b6d0 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e  , b, c, d, a, in
1b6e0 5b 20 33 5d 2b 30 78 63 31 62 64 63 65 65 65 2c  [ 3]+0xc1bdceee,
1b6f0 20 32 32 29 3b 0a 20 20 20 20 20 20 20 20 4d 44   22);.        MD
1b700 35 53 54 45 50 28 46 31 2c 20 61 2c 20 62 2c 20  5STEP(F1, a, b, 
1b710 63 2c 20 64 2c 20 69 6e 5b 20 34 5d 2b 30 78 66  c, d, in[ 4]+0xf
1b720 35 37 63 30 66 61 66 2c 20 20 37 29 3b 0a 20 20  57c0faf,  7);.  
1b730 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 31        MD5STEP(F1
1b740 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e  , d, a, b, c, in
1b750 5b 20 35 5d 2b 30 78 34 37 38 37 63 36 32 61 2c  [ 5]+0x4787c62a,
1b760 20 31 32 29 3b 0a 20 20 20 20 20 20 20 20 4d 44   12);.        MD
1b770 35 53 54 45 50 28 46 31 2c 20 63 2c 20 64 2c 20  5STEP(F1, c, d, 
1b780 61 2c 20 62 2c 20 69 6e 5b 20 36 5d 2b 30 78 61  a, b, in[ 6]+0xa
1b790 38 33 30 34 36 31 33 2c 20 31 37 29 3b 0a 20 20  8304613, 17);.  
1b7a0 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 31        MD5STEP(F1
1b7b0 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e  , b, c, d, a, in
1b7c0 5b 20 37 5d 2b 30 78 66 64 34 36 39 35 30 31 2c  [ 7]+0xfd469501,
1b7d0 20 32 32 29 3b 0a 20 20 20 20 20 20 20 20 4d 44   22);.        MD
1b7e0 35 53 54 45 50 28 46 31 2c 20 61 2c 20 62 2c 20  5STEP(F1, a, b, 
1b7f0 63 2c 20 64 2c 20 69 6e 5b 20 38 5d 2b 30 78 36  c, d, in[ 8]+0x6
1b800 39 38 30 39 38 64 38 2c 20 20 37 29 3b 0a 20 20  98098d8,  7);.  
1b810 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 31        MD5STEP(F1
1b820 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e  , d, a, b, c, in
1b830 5b 20 39 5d 2b 30 78 38 62 34 34 66 37 61 66 2c  [ 9]+0x8b44f7af,
1b840 20 31 32 29 3b 0a 20 20 20 20 20 20 20 20 4d 44   12);.        MD
1b850 35 53 54 45 50 28 46 31 2c 20 63 2c 20 64 2c 20  5STEP(F1, c, d, 
1b860 61 2c 20 62 2c 20 69 6e 5b 31 30 5d 2b 30 78 66  a, b, in[10]+0xf
1b870 66 66 66 35 62 62 31 2c 20 31 37 29 3b 0a 20 20  fff5bb1, 17);.  
1b880 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 31        MD5STEP(F1
1b890 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e  , b, c, d, a, in
1b8a0 5b 31 31 5d 2b 30 78 38 39 35 63 64 37 62 65 2c  [11]+0x895cd7be,
1b8b0 20 32 32 29 3b 0a 20 20 20 20 20 20 20 20 4d 44   22);.        MD
1b8c0 35 53 54 45 50 28 46 31 2c 20 61 2c 20 62 2c 20  5STEP(F1, a, b, 
1b8d0 63 2c 20 64 2c 20 69 6e 5b 31 32 5d 2b 30 78 36  c, d, in[12]+0x6
1b8e0 62 39 30 31 31 32 32 2c 20 20 37 29 3b 0a 20 20  b901122,  7);.  
1b8f0 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 31        MD5STEP(F1
1b900 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e  , d, a, b, c, in
1b910 5b 31 33 5d 2b 30 78 66 64 39 38 37 31 39 33 2c  [13]+0xfd987193,
1b920 20 31 32 29 3b 0a 20 20 20 20 20 20 20 20 4d 44   12);.        MD
1b930 35 53 54 45 50 28 46 31 2c 20 63 2c 20 64 2c 20  5STEP(F1, c, d, 
1b940 61 2c 20 62 2c 20 69 6e 5b 31 34 5d 2b 30 78 61  a, b, in[14]+0xa
1b950 36 37 39 34 33 38 65 2c 20 31 37 29 3b 0a 20 20  679438e, 17);.  
1b960 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 31        MD5STEP(F1
1b970 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e  , b, c, d, a, in
1b980 5b 31 35 5d 2b 30 78 34 39 62 34 30 38 32 31 2c  [15]+0x49b40821,
1b990 20 32 32 29 3b 0a 0a 20 20 20 20 20 20 20 20 4d   22);..        M
1b9a0 44 35 53 54 45 50 28 46 32 2c 20 61 2c 20 62 2c  D5STEP(F2, a, b,
1b9b0 20 63 2c 20 64 2c 20 69 6e 5b 20 31 5d 2b 30 78   c, d, in[ 1]+0x
1b9c0 66 36 31 65 32 35 36 32 2c 20 20 35 29 3b 0a 20  f61e2562,  5);. 
1b9d0 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
1b9e0 32 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69  2, d, a, b, c, i
1b9f0 6e 5b 20 36 5d 2b 30 78 63 30 34 30 62 33 34 30  n[ 6]+0xc040b340
1ba00 2c 20 20 39 29 3b 0a 20 20 20 20 20 20 20 20 4d  ,  9);.        M
1ba10 44 35 53 54 45 50 28 46 32 2c 20 63 2c 20 64 2c  D5STEP(F2, c, d,
1ba20 20 61 2c 20 62 2c 20 69 6e 5b 31 31 5d 2b 30 78   a, b, in[11]+0x
1ba30 32 36 35 65 35 61 35 31 2c 20 31 34 29 3b 0a 20  265e5a51, 14);. 
1ba40 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
1ba50 32 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69  2, b, c, d, a, i
1ba60 6e 5b 20 30 5d 2b 30 78 65 39 62 36 63 37 61 61  n[ 0]+0xe9b6c7aa
1ba70 2c 20 32 30 29 3b 0a 20 20 20 20 20 20 20 20 4d  , 20);.        M
1ba80 44 35 53 54 45 50 28 46 32 2c 20 61 2c 20 62 2c  D5STEP(F2, a, b,
1ba90 20 63 2c 20 64 2c 20 69 6e 5b 20 35 5d 2b 30 78   c, d, in[ 5]+0x
1baa0 64 36 32 66 31 30 35 64 2c 20 20 35 29 3b 0a 20  d62f105d,  5);. 
1bab0 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
1bac0 32 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69  2, d, a, b, c, i
1bad0 6e 5b 31 30 5d 2b 30 78 30 32 34 34 31 34 35 33  n[10]+0x02441453
1bae0 2c 20 20 39 29 3b 0a 20 20 20 20 20 20 20 20 4d  ,  9);.        M
1baf0 44 35 53 54 45 50 28 46 32 2c 20 63 2c 20 64 2c  D5STEP(F2, c, d,
1bb00 20 61 2c 20 62 2c 20 69 6e 5b 31 35 5d 2b 30 78   a, b, in[15]+0x
1bb10 64 38 61 31 65 36 38 31 2c 20 31 34 29 3b 0a 20  d8a1e681, 14);. 
1bb20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
1bb30 32 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69  2, b, c, d, a, i
1bb40 6e 5b 20 34 5d 2b 30 78 65 37 64 33 66 62 63 38  n[ 4]+0xe7d3fbc8
1bb50 2c 20 32 30 29 3b 0a 20 20 20 20 20 20 20 20 4d  , 20);.        M
1bb60 44 35 53 54 45 50 28 46 32 2c 20 61 2c 20 62 2c  D5STEP(F2, a, b,
1bb70 20 63 2c 20 64 2c 20 69 6e 5b 20 39 5d 2b 30 78   c, d, in[ 9]+0x
1bb80 32 31 65 31 63 64 65 36 2c 20 20 35 29 3b 0a 20  21e1cde6,  5);. 
1bb90 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
1bba0 32 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69  2, d, a, b, c, i
1bbb0 6e 5b 31 34 5d 2b 30 78 63 33 33 37 30 37 64 36  n[14]+0xc33707d6
1bbc0 2c 20 20 39 29 3b 0a 20 20 20 20 20 20 20 20 4d  ,  9);.        M
1bbd0 44 35 53 54 45 50 28 46 32 2c 20 63 2c 20 64 2c  D5STEP(F2, c, d,
1bbe0 20 61 2c 20 62 2c 20 69 6e 5b 20 33 5d 2b 30 78   a, b, in[ 3]+0x
1bbf0 66 34 64 35 30 64 38 37 2c 20 31 34 29 3b 0a 20  f4d50d87, 14);. 
1bc00 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
1bc10 32 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69  2, b, c, d, a, i
1bc20 6e 5b 20 38 5d 2b 30 78 34 35 35 61 31 34 65 64  n[ 8]+0x455a14ed
1bc30 2c 20 32 30 29 3b 0a 20 20 20 20 20 20 20 20 4d  , 20);.        M
1bc40 44 35 53 54 45 50 28 46 32 2c 20 61 2c 20 62 2c  D5STEP(F2, a, b,
1bc50 20 63 2c 20 64 2c 20 69 6e 5b 31 33 5d 2b 30 78   c, d, in[13]+0x
1bc60 61 39 65 33 65 39 30 35 2c 20 20 35 29 3b 0a 20  a9e3e905,  5);. 
1bc70 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
1bc80 32 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69  2, d, a, b, c, i
1bc90 6e 5b 20 32 5d 2b 30 78 66 63 65 66 61 33 66 38  n[ 2]+0xfcefa3f8
1bca0 2c 20 20 39 29 3b 0a 20 20 20 20 20 20 20 20 4d  ,  9);.        M
1bcb0 44 35 53 54 45 50 28 46 32 2c 20 63 2c 20 64 2c  D5STEP(F2, c, d,
1bcc0 20 61 2c 20 62 2c 20 69 6e 5b 20 37 5d 2b 30 78   a, b, in[ 7]+0x
1bcd0 36 37 36 66 30 32 64 39 2c 20 31 34 29 3b 0a 20  676f02d9, 14);. 
1bce0 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
1bcf0 32 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69  2, b, c, d, a, i
1bd00 6e 5b 31 32 5d 2b 30 78 38 64 32 61 34 63 38 61  n[12]+0x8d2a4c8a
1bd10 2c 20 32 30 29 3b 0a 0a 20 20 20 20 20 20 20 20  , 20);..        
1bd20 4d 44 35 53 54 45 50 28 46 33 2c 20 61 2c 20 62  MD5STEP(F3, a, b
1bd30 2c 20 63 2c 20 64 2c 20 69 6e 5b 20 35 5d 2b 30  , c, d, in[ 5]+0
1bd40 78 66 66 66 61 33 39 34 32 2c 20 20 34 29 3b 0a  xfffa3942,  4);.
1bd50 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28          MD5STEP(
1bd60 46 33 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20  F3, d, a, b, c, 
1bd70 69 6e 5b 20 38 5d 2b 30 78 38 37 37 31 66 36 38  in[ 8]+0x8771f68
1bd80 31 2c 20 31 31 29 3b 0a 20 20 20 20 20 20 20 20  1, 11);.        
1bd90 4d 44 35 53 54 45 50 28 46 33 2c 20 63 2c 20 64  MD5STEP(F3, c, d
1bda0 2c 20 61 2c 20 62 2c 20 69 6e 5b 31 31 5d 2b 30  , a, b, in[11]+0
1bdb0 78 36 64 39 64 36 31 32 32 2c 20 31 36 29 3b 0a  x6d9d6122, 16);.
1bdc0 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28          MD5STEP(
1bdd0 46 33 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20  F3, b, c, d, a, 
1bde0 69 6e 5b 31 34 5d 2b 30 78 66 64 65 35 33 38 30  in[14]+0xfde5380
1bdf0 63 2c 20 32 33 29 3b 0a 20 20 20 20 20 20 20 20  c, 23);.        
1be00 4d 44 35 53 54 45 50 28 46 33 2c 20 61 2c 20 62  MD5STEP(F3, a, b
1be10 2c 20 63 2c 20 64 2c 20 69 6e 5b 20 31 5d 2b 30  , c, d, in[ 1]+0
1be20 78 61 34 62 65 65 61 34 34 2c 20 20 34 29 3b 0a  xa4beea44,  4);.
1be30 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28          MD5STEP(
1be40 46 33 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20  F3, d, a, b, c, 
1be50 69 6e 5b 20 34 5d 2b 30 78 34 62 64 65 63 66 61  in[ 4]+0x4bdecfa
1be60 39 2c 20 31 31 29 3b 0a 20 20 20 20 20 20 20 20  9, 11);.        
1be70 4d 44 35 53 54 45 50 28 46 33 2c 20 63 2c 20 64  MD5STEP(F3, c, d
1be80 2c 20 61 2c 20 62 2c 20 69 6e 5b 20 37 5d 2b 30  , a, b, in[ 7]+0
1be90 78 66 36 62 62 34 62 36 30 2c 20 31 36 29 3b 0a  xf6bb4b60, 16);.
1bea0 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28          MD5STEP(
1beb0 46 33 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20  F3, b, c, d, a, 
1bec0 69 6e 5b 31 30 5d 2b 30 78 62 65 62 66 62 63 37  in[10]+0xbebfbc7
1bed0 30 2c 20 32 33 29 3b 0a 20 20 20 20 20 20 20 20  0, 23);.        
1bee0 4d 44 35 53 54 45 50 28 46 33 2c 20 61 2c 20 62  MD5STEP(F3, a, b
1bef0 2c 20 63 2c 20 64 2c 20 69 6e 5b 31 33 5d 2b 30  , c, d, in[13]+0
1bf00 78 32 38 39 62 37 65 63 36 2c 20 20 34 29 3b 0a  x289b7ec6,  4);.
1bf10 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28          MD5STEP(
1bf20 46 33 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20  F3, d, a, b, c, 
1bf30 69 6e 5b 20 30 5d 2b 30 78 65 61 61 31 32 37 66  in[ 0]+0xeaa127f
1bf40 61 2c 20 31 31 29 3b 0a 20 20 20 20 20 20 20 20  a, 11);.        
1bf50 4d 44 35 53 54 45 50 28 46 33 2c 20 63 2c 20 64  MD5STEP(F3, c, d
1bf60 2c 20 61 2c 20 62 2c 20 69 6e 5b 20 33 5d 2b 30  , a, b, in[ 3]+0
1bf70 78 64 34 65 66 33 30 38 35 2c 20 31 36 29 3b 0a  xd4ef3085, 16);.
1bf80 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28          MD5STEP(
1bf90 46 33 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20  F3, b, c, d, a, 
1bfa0 69 6e 5b 20 36 5d 2b 30 78 30 34 38 38 31 64 30  in[ 6]+0x04881d0
1bfb0 35 2c 20 32 33 29 3b 0a 20 20 20 20 20 20 20 20  5, 23);.        
1bfc0 4d 44 35 53 54 45 50 28 46 33 2c 20 61 2c 20 62  MD5STEP(F3, a, b
1bfd0 2c 20 63 2c 20 64 2c 20 69 6e 5b 20 39 5d 2b 30  , c, d, in[ 9]+0
1bfe0 78 64 39 64 34 64 30 33 39 2c 20 20 34 29 3b 0a  xd9d4d039,  4);.
1bff0 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28          MD5STEP(
1c000 46 33 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20  F3, d, a, b, c, 
1c010 69 6e 5b 31 32 5d 2b 30 78 65 36 64 62 39 39 65  in[12]+0xe6db99e
1c020 35 2c 20 31 31 29 3b 0a 20 20 20 20 20 20 20 20  5, 11);.        
1c030 4d 44 35 53 54 45 50 28 46 33 2c 20 63 2c 20 64  MD5STEP(F3, c, d
1c040 2c 20 61 2c 20 62 2c 20 69 6e 5b 31 35 5d 2b 30  , a, b, in[15]+0
1c050 78 31 66 61 32 37 63 66 38 2c 20 31 36 29 3b 0a  x1fa27cf8, 16);.
1c060 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28          MD5STEP(
1c070 46 33 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20  F3, b, c, d, a, 
1c080 69 6e 5b 20 32 5d 2b 30 78 63 34 61 63 35 36 36  in[ 2]+0xc4ac566
1c090 35 2c 20 32 33 29 3b 0a 0a 20 20 20 20 20 20 20  5, 23);..       
1c0a0 20 4d 44 35 53 54 45 50 28 46 34 2c 20 61 2c 20   MD5STEP(F4, a, 
1c0b0 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 20 30 5d 2b  b, c, d, in[ 0]+
1c0c0 30 78 66 34 32 39 32 32 34 34 2c 20 20 36 29 3b  0xf4292244,  6);
1c0d0 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50  .        MD5STEP
1c0e0 28 46 34 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c  (F4, d, a, b, c,
1c0f0 20 69 6e 5b 20 37 5d 2b 30 78 34 33 32 61 66 66   in[ 7]+0x432aff
1c100 39 37 2c 20 31 30 29 3b 0a 20 20 20 20 20 20 20  97, 10);.       
1c110 20 4d 44 35 53 54 45 50 28 46 34 2c 20 63 2c 20   MD5STEP(F4, c, 
1c120 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 31 34 5d 2b  d, a, b, in[14]+
1c130 30 78 61 62 39 34 32 33 61 37 2c 20 31 35 29 3b  0xab9423a7, 15);
1c140 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50  .        MD5STEP
1c150 28 46 34 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c  (F4, b, c, d, a,
1c160 20 69 6e 5b 20 35 5d 2b 30 78 66 63 39 33 61 30   in[ 5]+0xfc93a0
1c170 33 39 2c 20 32 31 29 3b 0a 20 20 20 20 20 20 20  39, 21);.       
1c180 20 4d 44 35 53 54 45 50 28 46 34 2c 20 61 2c 20   MD5STEP(F4, a, 
1c190 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 31 32 5d 2b  b, c, d, in[12]+
1c1a0 30 78 36 35 35 62 35 39 63 33 2c 20 20 36 29 3b  0x655b59c3,  6);
1c1b0 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50  .        MD5STEP
1c1c0 28 46 34 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c  (F4, d, a, b, c,
1c1d0 20 69 6e 5b 20 33 5d 2b 30 78 38 66 30 63 63 63   in[ 3]+0x8f0ccc
1c1e0 39 32 2c 20 31 30 29 3b 0a 20 20 20 20 20 20 20  92, 10);.       
1c1f0 20 4d 44 35 53 54 45 50 28 46 34 2c 20 63 2c 20   MD5STEP(F4, c, 
1c200 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 31 30 5d 2b  d, a, b, in[10]+
1c210 30 78 66 66 65 66 66 34 37 64 2c 20 31 35 29 3b  0xffeff47d, 15);
1c220 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50  .        MD5STEP
1c230 28 46 34 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c  (F4, b, c, d, a,
1c240 20 69 6e 5b 20 31 5d 2b 30 78 38 35 38 34 35 64   in[ 1]+0x85845d
1c250 64 31 2c 20 32 31 29 3b 0a 20 20 20 20 20 20 20  d1, 21);.       
1c260 20 4d 44 35 53 54 45 50 28 46 34 2c 20 61 2c 20   MD5STEP(F4, a, 
1c270 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 20 38 5d 2b  b, c, d, in[ 8]+
1c280 30 78 36 66 61 38 37 65 34 66 2c 20 20 36 29 3b  0x6fa87e4f,  6);
1c290 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50  .        MD5STEP
1c2a0 28 46 34 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c  (F4, d, a, b, c,
1c2b0 20 69 6e 5b 31 35 5d 2b 30 78 66 65 32 63 65 36   in[15]+0xfe2ce6
1c2c0 65 30 2c 20 31 30 29 3b 0a 20 20 20 20 20 20 20  e0, 10);.       
1c2d0 20 4d 44 35 53 54 45 50 28 46 34 2c 20 63 2c 20   MD5STEP(F4, c, 
1c2e0 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 20 36 5d 2b  d, a, b, in[ 6]+
1c2f0 30 78 61 33 30 31 34 33 31 34 2c 20 31 35 29 3b  0xa3014314, 15);
1c300 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50  .        MD5STEP
1c310 28 46 34 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c  (F4, b, c, d, a,
1c320 20 69 6e 5b 31 33 5d 2b 30 78 34 65 30 38 31 31   in[13]+0x4e0811
1c330 61 31 2c 20 32 31 29 3b 0a 20 20 20 20 20 20 20  a1, 21);.       
1c340 20 4d 44 35 53 54 45 50 28 46 34 2c 20 61 2c 20   MD5STEP(F4, a, 
1c350 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 20 34 5d 2b  b, c, d, in[ 4]+
1c360 30 78 66 37 35 33 37 65 38 32 2c 20 20 36 29 3b  0xf7537e82,  6);
1c370 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50  .        MD5STEP
1c380 28 46 34 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c  (F4, d, a, b, c,
1c390 20 69 6e 5b 31 31 5d 2b 30 78 62 64 33 61 66 32   in[11]+0xbd3af2
1c3a0 33 35 2c 20 31 30 29 3b 0a 20 20 20 20 20 20 20  35, 10);.       
1c3b0 20 4d 44 35 53 54 45 50 28 46 34 2c 20 63 2c 20   MD5STEP(F4, c, 
1c3c0 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 20 32 5d 2b  d, a, b, in[ 2]+
1c3d0 30 78 32 61 64 37 64 32 62 62 2c 20 31 35 29 3b  0x2ad7d2bb, 15);
1c3e0 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50  .        MD5STEP
1c3f0 28 46 34 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c  (F4, b, c, d, a,
1c400 20 69 6e 5b 20 39 5d 2b 30 78 65 62 38 36 64 33   in[ 9]+0xeb86d3
1c410 39 31 2c 20 32 31 29 3b 0a 0a 20 20 20 20 20 20  91, 21);..      
1c420 20 20 62 75 66 5b 30 5d 20 2b 3d 20 61 3b 0a 20    buf[0] += a;. 
1c430 20 20 20 20 20 20 20 62 75 66 5b 31 5d 20 2b 3d         buf[1] +=
1c440 20 62 3b 0a 20 20 20 20 20 20 20 20 62 75 66 5b   b;.        buf[
1c450 32 5d 20 2b 3d 20 63 3b 0a 20 20 20 20 20 20 20  2] += c;.       
1c460 20 62 75 66 5b 33 5d 20 2b 3d 20 64 3b 0a 7d 0a   buf[3] += d;.}.
1c470 0a 2f 2a 0a 20 2a 20 53 74 61 72 74 20 4d 44 35  ./*. * Start MD5
1c480 20 61 63 63 75 6d 75 6c 61 74 69 6f 6e 2e 20 20   accumulation.  
1c490 53 65 74 20 62 69 74 20 63 6f 75 6e 74 20 74 6f  Set bit count to
1c4a0 20 30 20 61 6e 64 20 62 75 66 66 65 72 20 74 6f   0 and buffer to
1c4b0 20 6d 79 73 74 65 72 69 6f 75 73 0a 20 2a 20 69   mysterious. * i
1c4c0 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 63 6f  nitialization co
1c4d0 6e 73 74 61 6e 74 73 2e 0a 20 2a 2f 0a 73 74 61  nstants.. */.sta
1c4e0 74 69 63 20 76 6f 69 64 20 4d 44 35 49 6e 69 74  tic void MD5Init
1c4f0 28 4d 44 35 43 6f 6e 74 65 78 74 20 2a 63 74 78  (MD5Context *ctx
1c500 29 7b 0a 20 20 20 20 20 20 20 20 63 74 78 2d 3e  ){.        ctx->
1c510 69 73 49 6e 69 74 20 3d 20 31 3b 0a 20 20 20 20  isInit = 1;.    
1c520 20 20 20 20 63 74 78 2d 3e 62 75 66 5b 30 5d 20      ctx->buf[0] 
1c530 3d 20 30 78 36 37 34 35 32 33 30 31 3b 0a 20 20  = 0x67452301;.  
1c540 20 20 20 20 20 20 63 74 78 2d 3e 62 75 66 5b 31        ctx->buf[1
1c550 5d 20 3d 20 30 78 65 66 63 64 61 62 38 39 3b 0a  ] = 0xefcdab89;.
1c560 20 20 20 20 20 20 20 20 63 74 78 2d 3e 62 75 66          ctx->buf
1c570 5b 32 5d 20 3d 20 30 78 39 38 62 61 64 63 66 65  [2] = 0x98badcfe
1c580 3b 0a 20 20 20 20 20 20 20 20 63 74 78 2d 3e 62  ;.        ctx->b
1c590 75 66 5b 33 5d 20 3d 20 30 78 31 30 33 32 35 34  uf[3] = 0x103254
1c5a0 37 36 3b 0a 20 20 20 20 20 20 20 20 63 74 78 2d  76;.        ctx-
1c5b0 3e 62 69 74 73 5b 30 5d 20 3d 20 30 3b 0a 20 20  >bits[0] = 0;.  
1c5c0 20 20 20 20 20 20 63 74 78 2d 3e 62 69 74 73 5b        ctx->bits[
1c5d0 31 5d 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 20 2a  1] = 0;.}../*. *
1c5e0 20 55 70 64 61 74 65 20 63 6f 6e 74 65 78 74 20   Update context 
1c5f0 74 6f 20 72 65 66 6c 65 63 74 20 74 68 65 20 63  to reflect the c
1c600 6f 6e 63 61 74 65 6e 61 74 69 6f 6e 20 6f 66 20  oncatenation of 
1c610 61 6e 6f 74 68 65 72 20 62 75 66 66 65 72 20 66  another buffer f
1c620 75 6c 6c 0a 20 2a 20 6f 66 20 62 79 74 65 73 2e  ull. * of bytes.
1c630 0a 20 2a 2f 0a 73 74 61 74 69 63 0a 76 6f 69 64  . */.static.void
1c640 20 4d 44 35 55 70 64 61 74 65 28 4d 44 35 43 6f   MD5Update(MD5Co
1c650 6e 74 65 78 74 20 2a 63 74 78 2c 20 63 6f 6e 73  ntext *ctx, cons
1c660 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
1c670 2a 62 75 66 2c 20 75 6e 73 69 67 6e 65 64 20 69  *buf, unsigned i
1c680 6e 74 20 6c 65 6e 29 7b 0a 20 20 20 20 20 20 20  nt len){.       
1c690 20 75 69 6e 74 33 32 20 74 3b 0a 0a 20 20 20 20   uint32 t;..    
1c6a0 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 62 69      /* Update bi
1c6b0 74 63 6f 75 6e 74 20 2a 2f 0a 0a 20 20 20 20 20  tcount */..     
1c6c0 20 20 20 74 20 3d 20 63 74 78 2d 3e 62 69 74 73     t = ctx->bits
1c6d0 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 20  [0];.        if 
1c6e0 28 28 63 74 78 2d 3e 62 69 74 73 5b 30 5d 20 3d  ((ctx->bits[0] =
1c6f0 20 74 20 2b 20 28 28 75 69 6e 74 33 32 29 6c 65   t + ((uint32)le
1c700 6e 20 3c 3c 20 33 29 29 20 3c 20 74 29 0a 20 20  n << 3)) < t).  
1c710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 74                ct
1c720 78 2d 3e 62 69 74 73 5b 31 5d 2b 2b 3b 20 2f 2a  x->bits[1]++; /*
1c730 20 43 61 72 72 79 20 66 72 6f 6d 20 6c 6f 77 20   Carry from low 
1c740 74 6f 20 68 69 67 68 20 2a 2f 0a 20 20 20 20 20  to high */.     
1c750 20 20 20 63 74 78 2d 3e 62 69 74 73 5b 31 5d 20     ctx->bits[1] 
1c760 2b 3d 20 6c 65 6e 20 3e 3e 20 32 39 3b 0a 0a 20  += len >> 29;.. 
1c770 20 20 20 20 20 20 20 74 20 3d 20 28 74 20 3e 3e         t = (t >>
1c780 20 33 29 20 26 20 30 78 33 66 3b 20 20 20 20 2f   3) & 0x3f;    /
1c790 2a 20 42 79 74 65 73 20 61 6c 72 65 61 64 79 20  * Bytes already 
1c7a0 69 6e 20 73 68 73 49 6e 66 6f 2d 3e 64 61 74 61  in shsInfo->data
1c7b0 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20   */..        /* 
1c7c0 48 61 6e 64 6c 65 20 61 6e 79 20 6c 65 61 64 69  Handle any leadi
1c7d0 6e 67 20 6f 64 64 2d 73 69 7a 65 64 20 63 68 75  ng odd-sized chu
1c7e0 6e 6b 73 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20  nks */..        
1c7f0 69 66 20 28 20 74 20 29 20 7b 0a 20 20 20 20 20  if ( t ) {.     
1c800 20 20 20 20 20 20 20 20 20 20 20 75 6e 73 69 67             unsig
1c810 6e 65 64 20 63 68 61 72 20 2a 70 20 3d 20 28 75  ned char *p = (u
1c820 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 63  nsigned char *)c
1c830 74 78 2d 3e 69 6e 20 2b 20 74 3b 0a 0a 20 20 20  tx->in + t;..   
1c840 20 20 20 20 20 20 20 20 20 20 20 20 20 74 20 3d               t =
1c850 20 36 34 2d 74 3b 0a 20 20 20 20 20 20 20 20 20   64-t;.         
1c860 20 20 20 20 20 20 20 69 66 20 28 6c 65 6e 20 3c         if (len <
1c870 20 74 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20   t) {.          
1c880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 65                me
1c890 6d 63 70 79 28 70 2c 20 62 75 66 2c 20 6c 65 6e  mcpy(p, buf, len
1c8a0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
1c8b0 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
1c8c0 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n;.             
1c8d0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
1c8e0 20 20 20 20 20 6d 65 6d 63 70 79 28 70 2c 20 62       memcpy(p, b
1c8f0 75 66 2c 20 74 29 3b 0a 20 20 20 20 20 20 20 20  uf, t);.        
1c900 20 20 20 20 20 20 20 20 62 79 74 65 52 65 76 65          byteReve
1c910 72 73 65 28 63 74 78 2d 3e 69 6e 2c 20 31 36 29  rse(ctx->in, 16)
1c920 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1c930 20 20 4d 44 35 54 72 61 6e 73 66 6f 72 6d 28 63    MD5Transform(c
1c940 74 78 2d 3e 62 75 66 2c 20 28 75 69 6e 74 33 32  tx->buf, (uint32
1c950 20 2a 29 63 74 78 2d 3e 69 6e 29 3b 0a 20 20 20   *)ctx->in);.   
1c960 20 20 20 20 20 20 20 20 20 20 20 20 20 62 75 66               buf
1c970 20 2b 3d 20 74 3b 0a 20 20 20 20 20 20 20 20 20   += t;.         
1c980 20 20 20 20 20 20 20 6c 65 6e 20 2d 3d 20 74 3b         len -= t;
1c990 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
1c9a0 20 20 20 20 2f 2a 20 50 72 6f 63 65 73 73 20 64      /* Process d
1c9b0 61 74 61 20 69 6e 20 36 34 2d 62 79 74 65 20 63  ata in 64-byte c
1c9c0 68 75 6e 6b 73 20 2a 2f 0a 0a 20 20 20 20 20 20  hunks */..      
1c9d0 20 20 77 68 69 6c 65 20 28 6c 65 6e 20 3e 3d 20    while (len >= 
1c9e0 36 34 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  64) {.          
1c9f0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 63 74 78        memcpy(ctx
1ca00 2d 3e 69 6e 2c 20 62 75 66 2c 20 36 34 29 3b 0a  ->in, buf, 64);.
1ca10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ca20 62 79 74 65 52 65 76 65 72 73 65 28 63 74 78 2d  byteReverse(ctx-
1ca30 3e 69 6e 2c 20 31 36 29 3b 0a 20 20 20 20 20 20  >in, 16);.      
1ca40 20 20 20 20 20 20 20 20 20 20 4d 44 35 54 72 61            MD5Tra
1ca50 6e 73 66 6f 72 6d 28 63 74 78 2d 3e 62 75 66 2c  nsform(ctx->buf,
1ca60 20 28 75 69 6e 74 33 32 20 2a 29 63 74 78 2d 3e   (uint32 *)ctx->
1ca70 69 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  in);.           
1ca80 20 20 20 20 20 62 75 66 20 2b 3d 20 36 34 3b 0a       buf += 64;.
1ca90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1caa0 6c 65 6e 20 2d 3d 20 36 34 3b 0a 20 20 20 20 20  len -= 64;.     
1cab0 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a     }..        /*
1cac0 20 48 61 6e 64 6c 65 20 61 6e 79 20 72 65 6d 61   Handle any rema
1cad0 69 6e 69 6e 67 20 62 79 74 65 73 20 6f 66 20 64  ining bytes of d
1cae0 61 74 61 2e 20 2a 2f 0a 0a 20 20 20 20 20 20 20  ata. */..       
1caf0 20 6d 65 6d 63 70 79 28 63 74 78 2d 3e 69 6e 2c   memcpy(ctx->in,
1cb00 20 62 75 66 2c 20 6c 65 6e 29 3b 0a 7d 0a 0a 2f   buf, len);.}../
1cb10 2a 0a 20 2a 20 46 69 6e 61 6c 20 77 72 61 70 75  *. * Final wrapu
1cb20 70 20 2d 20 70 61 64 20 74 6f 20 36 34 2d 62 79  p - pad to 64-by
1cb30 74 65 20 62 6f 75 6e 64 61 72 79 20 77 69 74 68  te boundary with
1cb40 20 74 68 65 20 62 69 74 20 70 61 74 74 65 72 6e   the bit pattern
1cb50 0a 20 2a 20 31 20 30 2a 20 28 36 34 2d 62 69 74  . * 1 0* (64-bit
1cb60 20 63 6f 75 6e 74 20 6f 66 20 62 69 74 73 20 70   count of bits p
1cb70 72 6f 63 65 73 73 65 64 2c 20 4d 53 42 2d 66 69  rocessed, MSB-fi
1cb80 72 73 74 29 0a 20 2a 2f 0a 73 74 61 74 69 63 20  rst). */.static 
1cb90 76 6f 69 64 20 4d 44 35 46 69 6e 61 6c 28 75 6e  void MD5Final(un
1cba0 73 69 67 6e 65 64 20 63 68 61 72 20 64 69 67 65  signed char dige
1cbb0 73 74 5b 31 36 5d 2c 20 4d 44 35 43 6f 6e 74 65  st[16], MD5Conte
1cbc0 78 74 20 2a 63 74 78 29 7b 0a 20 20 20 20 20 20  xt *ctx){.      
1cbd0 20 20 75 6e 73 69 67 6e 65 64 20 63 6f 75 6e 74    unsigned count
1cbe0 3b 0a 20 20 20 20 20 20 20 20 75 6e 73 69 67 6e  ;.        unsign
1cbf0 65 64 20 63 68 61 72 20 2a 70 3b 0a 0a 20 20 20  ed char *p;..   
1cc00 20 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20       /* Compute 
1cc10 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
1cc20 6d 6f 64 20 36 34 20 2a 2f 0a 20 20 20 20 20 20  mod 64 */.      
1cc30 20 20 63 6f 75 6e 74 20 3d 20 28 63 74 78 2d 3e    count = (ctx->
1cc40 62 69 74 73 5b 30 5d 20 3e 3e 20 33 29 20 26 20  bits[0] >> 3) & 
1cc50 30 78 33 46 3b 0a 0a 20 20 20 20 20 20 20 20 2f  0x3F;..        /
1cc60 2a 20 53 65 74 20 74 68 65 20 66 69 72 73 74 20  * Set the first 
1cc70 63 68 61 72 20 6f 66 20 70 61 64 64 69 6e 67 20  char of padding 
1cc80 74 6f 20 30 78 38 30 2e 20 20 54 68 69 73 20 69  to 0x80.  This i
1cc90 73 20 73 61 66 65 20 73 69 6e 63 65 20 74 68 65  s safe since the
1cca0 72 65 20 69 73 0a 20 20 20 20 20 20 20 20 20 20  re is.          
1ccb0 20 61 6c 77 61 79 73 20 61 74 20 6c 65 61 73 74   always at least
1ccc0 20 6f 6e 65 20 62 79 74 65 20 66 72 65 65 20 2a   one byte free *
1ccd0 2f 0a 20 20 20 20 20 20 20 20 70 20 3d 20 63 74  /.        p = ct
1cce0 78 2d 3e 69 6e 20 2b 20 63 6f 75 6e 74 3b 0a 20  x->in + count;. 
1ccf0 20 20 20 20 20 20 20 2a 70 2b 2b 20 3d 20 30 78         *p++ = 0x
1cd00 38 30 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20  80;..        /* 
1cd10 42 79 74 65 73 20 6f 66 20 70 61 64 64 69 6e 67  Bytes of padding
1cd20 20 6e 65 65 64 65 64 20 74 6f 20 6d 61 6b 65 20   needed to make 
1cd30 36 34 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20  64 bytes */.    
1cd40 20 20 20 20 63 6f 75 6e 74 20 3d 20 36 34 20 2d      count = 64 -
1cd50 20 31 20 2d 20 63 6f 75 6e 74 3b 0a 0a 20 20 20   1 - count;..   
1cd60 20 20 20 20 20 2f 2a 20 50 61 64 20 6f 75 74 20       /* Pad out 
1cd70 74 6f 20 35 36 20 6d 6f 64 20 36 34 20 2a 2f 0a  to 56 mod 64 */.
1cd80 20 20 20 20 20 20 20 20 69 66 20 28 63 6f 75 6e          if (coun
1cd90 74 20 3c 20 38 29 20 7b 0a 20 20 20 20 20 20 20  t < 8) {.       
1cda0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 77 6f 20           /* Two 
1cdb0 6c 6f 74 73 20 6f 66 20 70 61 64 64 69 6e 67 3a  lots of padding:
1cdc0 20 20 50 61 64 20 74 68 65 20 66 69 72 73 74 20    Pad the first 
1cdd0 62 6c 6f 63 6b 20 74 6f 20 36 34 20 62 79 74 65  block to 64 byte
1cde0 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  s */.           
1cdf0 20 20 20 20 20 6d 65 6d 73 65 74 28 70 2c 20 30       memset(p, 0
1ce00 2c 20 63 6f 75 6e 74 29 3b 0a 20 20 20 20 20 20  , count);.      
1ce10 20 20 20 20 20 20 20 20 20 20 62 79 74 65 52 65            byteRe
1ce20 76 65 72 73 65 28 63 74 78 2d 3e 69 6e 2c 20 31  verse(ctx->in, 1
1ce30 36 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  6);.            
1ce40 20 20 20 20 4d 44 35 54 72 61 6e 73 66 6f 72 6d      MD5Transform
1ce50 28 63 74 78 2d 3e 62 75 66 2c 20 28 75 69 6e 74  (ctx->buf, (uint
1ce60 33 32 20 2a 29 63 74 78 2d 3e 69 6e 29 3b 0a 0a  32 *)ctx->in);..
1ce70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ce80 2f 2a 20 4e 6f 77 20 66 69 6c 6c 20 74 68 65 20  /* Now fill the 
1ce90 6e 65 78 74 20 62 6c 6f 63 6b 20 77 69 74 68 20  next block with 
1cea0 35 36 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20  56 bytes */.    
1ceb0 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 73              mems
1cec0 65 74 28 63 74 78 2d 3e 69 6e 2c 20 30 2c 20 35  et(ctx->in, 0, 5
1ced0 36 29 3b 0a 20 20 20 20 20 20 20 20 7d 20 65 6c  6);.        } el
1cee0 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  se {.           
1cef0 20 20 20 20 20 2f 2a 20 50 61 64 20 62 6c 6f 63       /* Pad bloc
1cf00 6b 20 74 6f 20 35 36 20 62 79 74 65 73 20 2a 2f  k to 56 bytes */
1cf10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1cf20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 63 6f   memset(p, 0, co
1cf30 75 6e 74 2d 38 29 3b 0a 20 20 20 20 20 20 20 20  unt-8);.        
1cf40 7d 0a 20 20 20 20 20 20 20 20 62 79 74 65 52 65  }.        byteRe
1cf50 76 65 72 73 65 28 63 74 78 2d 3e 69 6e 2c 20 31  verse(ctx->in, 1
1cf60 34 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20  4);..        /* 
1cf70 41 70 70 65 6e 64 20 6c 65 6e 67 74 68 20 69 6e  Append length in
1cf80 20 62 69 74 73 20 61 6e 64 20 74 72 61 6e 73 66   bits and transf
1cf90 6f 72 6d 20 2a 2f 0a 20 20 20 20 20 20 20 20 6d  orm */.        m
1cfa0 65 6d 63 70 79 28 63 74 78 2d 3e 69 6e 20 2b 20  emcpy(ctx->in + 
1cfb0 31 34 2a 34 2c 20 63 74 78 2d 3e 62 69 74 73 2c  14*4, ctx->bits,
1cfc0 20 38 29 3b 0a 0a 20 20 20 20 20 20 20 20 4d 44   8);..        MD
1cfd0 35 54 72 61 6e 73 66 6f 72 6d 28 63 74 78 2d 3e  5Transform(ctx->
1cfe0 62 75 66 2c 20 28 75 69 6e 74 33 32 20 2a 29 63  buf, (uint32 *)c
1cff0 74 78 2d 3e 69 6e 29 3b 0a 20 20 20 20 20 20 20  tx->in);.       
1d000 20 62 79 74 65 52 65 76 65 72 73 65 28 28 75 6e   byteReverse((un
1d010 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 63 74  signed char *)ct
1d020 78 2d 3e 62 75 66 2c 20 34 29 3b 0a 20 20 20 20  x->buf, 4);.    
1d030 20 20 20 20 6d 65 6d 63 70 79 28 64 69 67 65 73      memcpy(diges
1d040 74 2c 20 63 74 78 2d 3e 62 75 66 2c 20 31 36 29  t, ctx->buf, 16)
1d050 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65  ;.}../*.** Conve
1d060 72 74 20 61 20 31 32 38 2d 62 69 74 20 4d 44 35  rt a 128-bit MD5
1d070 20 64 69 67 65 73 74 20 69 6e 74 6f 20 61 20 33   digest into a 3
1d080 32 2d 64 69 67 69 74 20 62 61 73 65 2d 31 36 20  2-digit base-16 
1d090 6e 75 6d 62 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  number..*/.stati
1d0a0 63 20 76 6f 69 64 20 4d 44 35 44 69 67 65 73 74  c void MD5Digest
1d0b0 54 6f 42 61 73 65 31 36 28 75 6e 73 69 67 6e 65  ToBase16(unsigne
1d0c0 64 20 63 68 61 72 20 2a 64 69 67 65 73 74 2c 20  d char *digest, 
1d0d0 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 73  char *zBuf){.  s
1d0e0 74 61 74 69 63 20 63 68 61 72 20 63 6f 6e 73 74  tatic char const
1d0f0 20 7a 45 6e 63 6f 64 65 5b 5d 20 3d 20 22 30 31   zEncode[] = "01
1d100 32 33 34 35 36 37 38 39 61 62 63 64 65 66 22 3b  23456789abcdef";
1d110 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 0a 20 20  .  int i, j;..  
1d120 66 6f 72 28 6a 3d 69 3d 30 3b 20 69 3c 31 36 3b  for(j=i=0; i<16;
1d130 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 61   i++){.    int a
1d140 20 3d 20 64 69 67 65 73 74 5b 69 5d 3b 0a 20 20   = digest[i];.  
1d150 20 20 7a 42 75 66 5b 6a 2b 2b 5d 20 3d 20 7a 45    zBuf[j++] = zE
1d160 6e 63 6f 64 65 5b 28 61 3e 3e 34 29 26 30 78 66  ncode[(a>>4)&0xf
1d170 5d 3b 0a 20 20 20 20 7a 42 75 66 5b 6a 2b 2b 5d  ];.    zBuf[j++]
1d180 20 3d 20 7a 45 6e 63 6f 64 65 5b 61 20 26 20 30   = zEncode[a & 0
1d190 78 66 5d 3b 0a 20 20 7d 0a 20 20 7a 42 75 66 5b  xf];.  }.  zBuf[
1d1a0 6a 5d 20 3d 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  j] = 0;.}.../*.*
1d1b0 2a 20 43 6f 6e 76 65 72 74 20 61 20 31 32 38 2d  * Convert a 128-
1d1c0 62 69 74 20 4d 44 35 20 64 69 67 65 73 74 20 69  bit MD5 digest i
1d1d0 6e 74 6f 20 73 65 71 75 65 6e 63 79 20 6f 66 20  nto sequency of 
1d1e0 65 69 67 68 74 20 35 2d 64 69 67 69 74 20 69 6e  eight 5-digit in
1d1f0 74 65 67 65 72 73 0a 2a 2a 20 65 61 63 68 20 72  tegers.** each r
1d200 65 70 72 65 73 65 6e 74 69 6e 67 20 31 36 20 62  epresenting 16 b
1d210 69 74 73 20 6f 66 20 74 68 65 20 64 69 67 65 73  its of the diges
1d220 74 20 61 6e 64 20 73 65 70 61 72 61 74 65 64 20  t and separated 
1d230 66 72 6f 6d 20 65 61 63 68 0a 2a 2a 20 6f 74 68  from each.** oth
1d240 65 72 20 62 79 20 61 20 22 2d 22 20 63 68 61 72  er by a "-" char
1d250 61 63 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  acter..*/.static
1d260 20 76 6f 69 64 20 4d 44 35 44 69 67 65 73 74 54   void MD5DigestT
1d270 6f 42 61 73 65 31 30 78 38 28 75 6e 73 69 67 6e  oBase10x8(unsign
1d280 65 64 20 63 68 61 72 20 64 69 67 65 73 74 5b 31  ed char digest[1
1d290 36 5d 2c 20 63 68 61 72 20 7a 44 69 67 65 73 74  6], char zDigest
1d2a0 5b 35 30 5d 29 7b 0a 20 20 69 6e 74 20 69 2c 20  [50]){.  int i, 
1d2b0 6a 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e  j;.  unsigned in
1d2c0 74 20 78 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30  t x;.  for(i=j=0
1d2d0 3b 20 69 3c 31 36 3b 20 69 2b 3d 32 29 7b 0a 20  ; i<16; i+=2){. 
1d2e0 20 20 20 78 20 3d 20 64 69 67 65 73 74 5b 69 5d     x = digest[i]
1d2f0 2a 32 35 36 20 2b 20 64 69 67 65 73 74 5b 69 2b  *256 + digest[i+
1d300 31 5d 3b 0a 20 20 20 20 69 66 28 20 69 3e 30 20  1];.    if( i>0 
1d310 29 20 7a 44 69 67 65 73 74 5b 6a 2b 2b 5d 20 3d  ) zDigest[j++] =
1d320 20 27 2d 27 3b 0a 20 20 20 20 73 71 6c 69 74 65   '-';.    sqlite
1d330 33 5f 73 6e 70 72 69 6e 74 66 28 35 30 2d 6a 2c  3_snprintf(50-j,
1d340 20 26 7a 44 69 67 65 73 74 5b 6a 5d 2c 20 22 25   &zDigest[j], "%
1d350 30 35 75 22 2c 20 78 29 3b 0a 20 20 20 20 6a 20  05u", x);.    j 
1d360 2b 3d 20 35 3b 0a 20 20 7d 0a 20 20 7a 44 69 67  += 5;.  }.  zDig
1d370 65 73 74 5b 6a 5d 20 3d 20 30 3b 0a 7d 0a 0a 2f  est[j] = 0;.}../
1d380 2a 0a 2a 2a 20 41 20 54 43 4c 20 63 6f 6d 6d 61  *.** A TCL comma
1d390 6e 64 20 66 6f 72 20 6d 64 35 2e 20 20 54 68 65  nd for md5.  The
1d3a0 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65   argument is the
1d3b0 20 74 65 78 74 20 74 6f 20 62 65 20 68 61 73 68   text to be hash
1d3c0 65 64 2e 20 20 54 68 65 0a 2a 2a 20 52 65 73 75  ed.  The.** Resu
1d3d0 6c 74 20 69 73 20 74 68 65 20 68 61 73 68 20 69  lt is the hash i
1d3e0 6e 20 62 61 73 65 36 34 2e 0a 2a 2f 0a 73 74 61  n base64..*/.sta
1d3f0 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54  tic int SQLITE_T
1d400 43 4c 41 50 49 20 6d 64 35 5f 63 6d 64 28 0a 20  CLAPI md5_cmd(. 
1d410 20 76 6f 69 64 2a 63 64 2c 0a 20 20 54 63 6c 5f   void*cd,.  Tcl_
1d420 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
1d430 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 63 6f    int argc,.  co
1d440 6e 73 74 20 63 68 61 72 20 2a 2a 61 72 67 76 0a  nst char **argv.
1d450 29 7b 0a 20 20 4d 44 35 43 6f 6e 74 65 78 74 20  ){.  MD5Context 
1d460 63 74 78 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  ctx;.  unsigned 
1d470 63 68 61 72 20 64 69 67 65 73 74 5b 31 36 5d 3b  char digest[16];
1d480 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 35 30 5d  .  char zBuf[50]
1d490 3b 0a 20 20 76 6f 69 64 20 28 2a 63 6f 6e 76 65  ;.  void (*conve
1d4a0 72 74 65 72 29 28 75 6e 73 69 67 6e 65 64 20 63  rter)(unsigned c
1d4b0 68 61 72 2a 2c 20 63 68 61 72 2a 29 3b 0a 0a 20  har*, char*);.. 
1d4c0 20 69 66 28 20 61 72 67 63 21 3d 32 20 29 7b 0a   if( argc!=2 ){.
1d4d0 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
1d4e0 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 77 72 6f  sult(interp,"wro
1d4f0 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
1d500 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30  d be \"", argv[0
1d510 5d 2c 0a 20 20 20 20 20 20 20 20 22 20 54 45 58  ],.        " TEX
1d520 54 5c 22 22 2c 20 28 63 68 61 72 2a 29 30 29 3b  T\"", (char*)0);
1d530 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
1d540 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 4d 44 35  ERROR;.  }.  MD5
1d550 49 6e 69 74 28 26 63 74 78 29 3b 0a 20 20 4d 44  Init(&ctx);.  MD
1d560 35 55 70 64 61 74 65 28 26 63 74 78 2c 20 28 75  5Update(&ctx, (u
1d570 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 61 72  nsigned char*)ar
1d580 67 76 5b 31 5d 2c 20 28 75 6e 73 69 67 6e 65 64  gv[1], (unsigned
1d590 29 73 74 72 6c 65 6e 28 61 72 67 76 5b 31 5d 29  )strlen(argv[1])
1d5a0 29 3b 0a 20 20 4d 44 35 46 69 6e 61 6c 28 64 69  );.  MD5Final(di
1d5b0 67 65 73 74 2c 20 26 63 74 78 29 3b 0a 20 20 63  gest, &ctx);.  c
1d5c0 6f 6e 76 65 72 74 65 72 20 3d 20 28 76 6f 69 64  onverter = (void
1d5d0 28 2a 29 28 75 6e 73 69 67 6e 65 64 20 63 68 61  (*)(unsigned cha
1d5e0 72 2a 2c 63 68 61 72 2a 29 29 63 64 3b 0a 20 20  r*,char*))cd;.  
1d5f0 63 6f 6e 76 65 72 74 65 72 28 64 69 67 65 73 74  converter(digest
1d600 2c 20 7a 42 75 66 29 3b 0a 20 20 54 63 6c 5f 41  , zBuf);.  Tcl_A
1d610 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
1d620 72 70 2c 20 7a 42 75 66 2c 20 28 63 68 61 72 2a  rp, zBuf, (char*
1d630 29 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  )0);.  return TC
1d640 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  L_OK;.}../*.** A
1d650 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20 74 6f 20   TCL command to 
1d660 74 61 6b 65 20 74 68 65 20 6d 64 35 20 68 61 73  take the md5 has
1d670 68 20 6f 66 20 61 20 66 69 6c 65 2e 20 20 54 68  h of a file.  Th
1d680 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68  e argument is th
1d690 65 0a 2a 2a 20 6e 61 6d 65 20 6f 66 20 74 68 65  e.** name of the
1d6a0 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   file..*/.static
1d6b0 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41   int SQLITE_TCLA
1d6c0 50 49 20 6d 64 35 66 69 6c 65 5f 63 6d 64 28 0a  PI md5file_cmd(.
1d6d0 20 20 76 6f 69 64 2a 63 64 2c 0a 20 20 54 63 6c    void*cd,.  Tcl
1d6e0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
1d6f0 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 63  .  int argc,.  c
1d700 6f 6e 73 74 20 63 68 61 72 20 2a 2a 61 72 67 76  onst char **argv
1d710 0a 29 7b 0a 20 20 46 49 4c 45 20 2a 69 6e 3b 0a  .){.  FILE *in;.
1d720 20 20 4d 44 35 43 6f 6e 74 65 78 74 20 63 74 78    MD5Context ctx
1d730 3b 0a 20 20 76 6f 69 64 20 28 2a 63 6f 6e 76 65  ;.  void (*conve
1d740 72 74 65 72 29 28 75 6e 73 69 67 6e 65 64 20 63  rter)(unsigned c
1d750 68 61 72 2a 2c 20 63 68 61 72 2a 29 3b 0a 20 20  har*, char*);.  
1d760 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 64 69  unsigned char di
1d770 67 65 73 74 5b 31 36 5d 3b 0a 20 20 63 68 61 72  gest[16];.  char
1d780 20 7a 42 75 66 5b 31 30 32 34 30 5d 3b 0a 0a 20   zBuf[10240];.. 
1d790 20 69 66 28 20 61 72 67 63 21 3d 32 20 29 7b 0a   if( argc!=2 ){.
1d7a0 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
1d7b0 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 77 72 6f  sult(interp,"wro
1d7c0 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
1d7d0 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30  d be \"", argv[0
1d7e0 5d 2c 0a 20 20 20 20 20 20 20 20 22 20 46 49 4c  ],.        " FIL
1d7f0 45 4e 41 4d 45 5c 22 22 2c 20 28 63 68 61 72 2a  ENAME\"", (char*
1d800 29 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  )0);.    return 
1d810 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
1d820 20 69 6e 20 3d 20 66 6f 70 65 6e 28 61 72 67 76   in = fopen(argv
1d830 5b 31 5d 2c 22 72 62 22 29 3b 0a 20 20 69 66 28  [1],"rb");.  if(
1d840 20 69 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 54 63   in==0 ){.    Tc
1d850 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
1d860 6e 74 65 72 70 2c 22 75 6e 61 62 6c 65 20 74 6f  nterp,"unable to
1d870 20 6f 70 65 6e 20 66 69 6c 65 20 5c 22 22 2c 20   open file \"", 
1d880 61 72 67 76 5b 31 5d 2c 0a 20 20 20 20 20 20 20  argv[1],.       
1d890 20 20 22 5c 22 20 66 6f 72 20 72 65 61 64 69 6e    "\" for readin
1d8a0 67 22 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20  g", (char*)0);. 
1d8b0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
1d8c0 52 4f 52 3b 0a 20 20 7d 0a 20 20 4d 44 35 49 6e  ROR;.  }.  MD5In
1d8d0 69 74 28 26 63 74 78 29 3b 0a 20 20 66 6f 72 28  it(&ctx);.  for(
1d8e0 3b 3b 29 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a  ;;){.    int n;.
1d8f0 20 20 20 20 6e 20 3d 20 28 69 6e 74 29 66 72 65      n = (int)fre
1d900 61 64 28 7a 42 75 66 2c 20 31 2c 20 73 69 7a 65  ad(zBuf, 1, size
1d910 6f 66 28 7a 42 75 66 29 2c 20 69 6e 29 3b 0a 20  of(zBuf), in);. 
1d920 20 20 20 69 66 28 20 6e 3c 3d 30 20 29 20 62 72     if( n<=0 ) br
1d930 65 61 6b 3b 0a 20 20 20 20 4d 44 35 55 70 64 61  eak;.    MD5Upda
1d940 74 65 28 26 63 74 78 2c 20 28 75 6e 73 69 67 6e  te(&ctx, (unsign
1d950 65 64 20 63 68 61 72 2a 29 7a 42 75 66 2c 20 28  ed char*)zBuf, (
1d960 75 6e 73 69 67 6e 65 64 29 6e 29 3b 0a 20 20 7d  unsigned)n);.  }
1d970 0a 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20  .  fclose(in);. 
1d980 20 4d 44 35 46 69 6e 61 6c 28 64 69 67 65 73 74   MD5Final(digest
1d990 2c 20 26 63 74 78 29 3b 0a 20 20 63 6f 6e 76 65  , &ctx);.  conve
1d9a0 72 74 65 72 20 3d 20 28 76 6f 69 64 28 2a 29 28  rter = (void(*)(
1d9b0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 2c 63  unsigned char*,c
1d9c0 68 61 72 2a 29 29 63 64 3b 0a 20 20 63 6f 6e 76  har*))cd;.  conv
1d9d0 65 72 74 65 72 28 64 69 67 65 73 74 2c 20 7a 42  erter(digest, zB
1d9e0 75 66 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e  uf);.  Tcl_Appen
1d9f0 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
1da00 7a 42 75 66 2c 20 28 63 68 61 72 2a 29 30 29 3b  zBuf, (char*)0);
1da10 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
1da20 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73  ;.}../*.** Regis
1da30 74 65 72 20 74 68 65 20 66 6f 75 72 20 6e 65 77  ter the four new
1da40 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 73 20 66 6f   TCL commands fo
1da50 72 20 67 65 6e 65 72 61 74 69 6e 67 20 4d 44 35  r generating MD5
1da60 20 63 68 65 63 6b 73 75 6d 73 0a 2a 2a 20 77 69   checksums.** wi
1da70 74 68 20 74 68 65 20 54 43 4c 20 69 6e 74 65 72  th the TCL inter
1da80 70 72 65 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 4d  preter..*/.int M
1da90 64 35 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  d5_Init(Tcl_Inte
1daa0 72 70 20 2a 69 6e 74 65 72 70 29 7b 0a 20 20 54  rp *interp){.  T
1dab0 63 6c 5f 43 72 65 61 74 65 43 6f 6d 6d 61 6e 64  cl_CreateCommand
1dac0 28 69 6e 74 65 72 70 2c 20 22 6d 64 35 22 2c 20  (interp, "md5", 
1dad0 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 6d 64  (Tcl_CmdProc*)md
1dae0 35 5f 63 6d 64 2c 0a 20 20 20 20 20 20 20 20 20  5_cmd,.         
1daf0 20 20 20 20 20 20 20 20 20 20 20 4d 44 35 44 69             MD5Di
1db00 67 65 73 74 54 6f 42 61 73 65 31 36 2c 20 30 29  gestToBase16, 0)
1db10 3b 0a 20 20 54 63 6c 5f 43 72 65 61 74 65 43 6f  ;.  Tcl_CreateCo
1db20 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 6d  mmand(interp, "m
1db30 64 35 2d 31 30 78 38 22 2c 20 28 54 63 6c 5f 43  d5-10x8", (Tcl_C
1db40 6d 64 50 72 6f 63 2a 29 6d 64 35 5f 63 6d 64 2c  mdProc*)md5_cmd,
1db50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1db60 20 20 20 20 20 4d 44 35 44 69 67 65 73 74 54 6f       MD5DigestTo
1db70 42 61 73 65 31 30 78 38 2c 20 30 29 3b 0a 20 20  Base10x8, 0);.  
1db80 54 63 6c 5f 43 72 65 61 74 65 43 6f 6d 6d 61 6e  Tcl_CreateComman
1db90 64 28 69 6e 74 65 72 70 2c 20 22 6d 64 35 66 69  d(interp, "md5fi
1dba0 6c 65 22 2c 20 28 54 63 6c 5f 43 6d 64 50 72 6f  le", (Tcl_CmdPro
1dbb0 63 2a 29 6d 64 35 66 69 6c 65 5f 63 6d 64 2c 0a  c*)md5file_cmd,.
1dbc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dbd0 20 20 20 20 4d 44 35 44 69 67 65 73 74 54 6f 42      MD5DigestToB
1dbe0 61 73 65 31 36 2c 20 30 29 3b 0a 20 20 54 63 6c  ase16, 0);.  Tcl
1dbf0 5f 43 72 65 61 74 65 43 6f 6d 6d 61 6e 64 28 69  _CreateCommand(i
1dc00 6e 74 65 72 70 2c 20 22 6d 64 35 66 69 6c 65 2d  nterp, "md5file-
1dc10 31 30 78 38 22 2c 20 28 54 63 6c 5f 43 6d 64 50  10x8", (Tcl_CmdP
1dc20 72 6f 63 2a 29 6d 64 35 66 69 6c 65 5f 63 6d 64  roc*)md5file_cmd
1dc30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1dc40 20 20 20 20 20 20 4d 44 35 44 69 67 65 73 74 54        MD5DigestT
1dc50 6f 42 61 73 65 31 30 78 38 2c 20 30 29 3b 0a 20  oBase10x8, 0);. 
1dc60 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
1dc70 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69  }.#endif /* defi
1dc80 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29  ned(SQLITE_TEST)
1dc90 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49   || defined(SQLI
1dca0 54 45 5f 54 43 4c 4d 44 35 29 20 2a 2f 0a 0a 23  TE_TCLMD5) */..#
1dcb0 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
1dcc0 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 44 75  E_TEST)./*.** Du
1dcd0 72 69 6e 67 20 74 65 73 74 69 6e 67 2c 20 74 68  ring testing, th
1dce0 65 20 73 70 65 63 69 61 6c 20 6d 64 35 73 75 6d  e special md5sum
1dcf0 28 29 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  () aggregate fun
1dd00 63 74 69 6f 6e 20 69 73 20 61 76 61 69 6c 61 62  ction is availab
1dd10 6c 65 2e 0a 2a 2a 20 69 6e 73 69 64 65 20 53 51  le..** inside SQ
1dd20 4c 69 74 65 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  Lite.  The follo
1dd30 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 69 6d  wing routines im
1dd40 70 6c 65 6d 65 6e 74 20 74 68 61 74 20 66 75 6e  plement that fun
1dd50 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
1dd60 20 76 6f 69 64 20 6d 64 35 73 74 65 70 28 73 71   void md5step(sq
1dd70 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
1dd80 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63  ontext, int argc
1dd90 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  , sqlite3_value 
1dda0 2a 2a 61 72 67 76 29 7b 0a 20 20 4d 44 35 43 6f  **argv){.  MD5Co
1ddb0 6e 74 65 78 74 20 2a 70 3b 0a 20 20 69 6e 74 20  ntext *p;.  int 
1ddc0 69 3b 0a 20 20 69 66 28 20 61 72 67 63 3c 31 20  i;.  if( argc<1 
1ddd0 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 20 3d 20  ) return;.  p = 
1dde0 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74  sqlite3_aggregat
1ddf0 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e 74 65 78  e_context(contex
1de00 74 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a  t, sizeof(*p));.
1de10 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
1de20 75 72 6e 3b 0a 20 20 69 66 28 20 21 70 2d 3e 69  urn;.  if( !p->i
1de30 73 49 6e 69 74 20 29 7b 0a 20 20 20 20 4d 44 35  sInit ){.    MD5
1de40 49 6e 69 74 28 70 29 3b 0a 20 20 7d 0a 20 20 66  Init(p);.  }.  f
1de50 6f 72 28 69 3d 30 3b 20 69 3c 61 72 67 63 3b 20  or(i=0; i<argc; 
1de60 69 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  i++){.    const 
1de70 63 68 61 72 20 2a 7a 44 61 74 61 20 3d 20 28 63  char *zData = (c
1de80 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  har*)sqlite3_val
1de90 75 65 5f 74 65 78 74 28 61 72 67 76 5b 69 5d 29  ue_text(argv[i])
1dea0 3b 0a 20 20 20 20 69 66 28 20 7a 44 61 74 61 20  ;.    if( zData 
1deb0 29 7b 0a 20 20 20 20 20 20 4d 44 35 55 70 64 61  ){.      MD5Upda
1dec0 74 65 28 70 2c 20 28 75 6e 73 69 67 6e 65 64 20  te(p, (unsigned 
1ded0 63 68 61 72 2a 29 7a 44 61 74 61 2c 20 28 69 6e  char*)zData, (in
1dee0 74 29 73 74 72 6c 65 6e 28 7a 44 61 74 61 29 29  t)strlen(zData))
1def0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74  ;.    }.  }.}.st
1df00 61 74 69 63 20 76 6f 69 64 20 6d 64 35 66 69 6e  atic void md5fin
1df10 61 6c 69 7a 65 28 73 71 6c 69 74 65 33 5f 63 6f  alize(sqlite3_co
1df20 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 29 7b  ntext *context){
1df30 0a 20 20 4d 44 35 43 6f 6e 74 65 78 74 20 2a 70  .  MD5Context *p
1df40 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
1df50 72 20 64 69 67 65 73 74 5b 31 36 5d 3b 0a 20 20  r digest[16];.  
1df60 63 68 61 72 20 7a 42 75 66 5b 33 33 5d 3b 0a 20  char zBuf[33];. 
1df70 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 61 67 67   p = sqlite3_agg
1df80 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 63  regate_context(c
1df90 6f 6e 74 65 78 74 2c 20 73 69 7a 65 6f 66 28 2a  ontext, sizeof(*
1dfa0 70 29 29 3b 0a 20 20 4d 44 35 46 69 6e 61 6c 28  p));.  MD5Final(
1dfb0 64 69 67 65 73 74 2c 70 29 3b 0a 20 20 4d 44 35  digest,p);.  MD5
1dfc0 44 69 67 65 73 74 54 6f 42 61 73 65 31 36 28 64  DigestToBase16(d
1dfd0 69 67 65 73 74 2c 20 7a 42 75 66 29 3b 0a 20 20  igest, zBuf);.  
1dfe0 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74  sqlite3_result_t
1dff0 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 7a 42 75  ext(context, zBu
1e000 66 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52  f, -1, SQLITE_TR
1e010 41 4e 53 49 45 4e 54 29 3b 0a 7d 0a 69 6e 74 20  ANSIENT);.}.int 
1e020 4d 64 35 5f 52 65 67 69 73 74 65 72 28 0a 20 20  Md5_Register(.  
1e030 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 63  sqlite3 *db,.  c
1e040 68 61 72 20 2a 2a 70 7a 45 72 72 4d 73 67 2c 0a  har **pzErrMsg,.
1e050 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f    const sqlite3_
1e060 61 70 69 5f 72 6f 75 74 69 6e 65 73 20 2a 70 54  api_routines *pT
1e070 68 75 6e 6b 0a 29 7b 0a 20 20 69 6e 74 20 72 63  hunk.){.  int rc
1e080 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74   = sqlite3_creat
1e090 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22  e_function(db, "
1e0a0 6d 64 35 73 75 6d 22 2c 20 2d 31 2c 20 53 51 4c  md5sum", -1, SQL
1e0b0 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 30 2c 0a  ITE_UTF8, 0, 0,.
1e0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e0d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e0e0 20 6d 64 35 73 74 65 70 2c 20 6d 64 35 66 69 6e   md5step, md5fin
1e0f0 61 6c 69 7a 65 29 3b 0a 20 20 73 71 6c 69 74 65  alize);.  sqlite
1e100 33 5f 6f 76 65 72 6c 6f 61 64 5f 66 75 6e 63 74  3_overload_funct
1e110 69 6f 6e 28 64 62 2c 20 22 6d 64 35 73 75 6d 22  ion(db, "md5sum"
1e120 2c 20 2d 31 29 3b 20 20 2f 2a 20 54 6f 20 65 78  , -1);  /* To ex
1e130 65 72 63 69 73 65 20 74 68 69 73 20 41 50 49 20  ercise this API 
1e140 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  */.  return rc;.
1e150 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69  }.#endif /* defi
1e160 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29  ned(SQLITE_TEST)
1e170 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74   */.../*.** If t
1e180 68 65 20 6d 61 63 72 6f 20 54 43 4c 53 48 20 69  he macro TCLSH i
1e190 73 20 6f 6e 65 2c 20 74 68 65 6e 20 70 75 74 20  s one, then put 
1e1a0 69 6e 20 63 6f 64 65 20 74 68 69 73 20 66 6f 72  in code this for
1e1b0 20 74 68 65 0a 2a 2a 20 22 6d 61 69 6e 22 20 72   the.** "main" r
1e1c0 6f 75 74 69 6e 65 20 74 68 61 74 20 77 69 6c 6c  outine that will
1e1d0 20 69 6e 69 74 69 61 6c 69 7a 65 20 54 63 6c 20   initialize Tcl 
1e1e0 61 6e 64 20 74 61 6b 65 20 69 6e 70 75 74 20 66  and take input f
1e1f0 72 6f 6d 0a 2a 2a 20 73 74 61 6e 64 61 72 64 20  rom.** standard 
1e200 69 6e 70 75 74 2c 20 6f 72 20 69 66 20 61 20 66  input, or if a f
1e210 69 6c 65 20 69 73 20 6e 61 6d 65 64 20 6f 6e 20  ile is named on 
1e220 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65  the command line
1e230 0a 2a 2a 20 74 68 65 20 54 43 4c 20 69 6e 74 65  .** the TCL inte
1e240 72 70 72 65 74 65 72 20 72 65 61 64 73 20 61 6e  rpreter reads an
1e250 64 20 65 76 61 6c 75 61 74 65 73 20 74 68 61 74  d evaluates that
1e260 20 66 69 6c 65 2e 0a 2a 2f 0a 23 69 66 20 54 43   file..*/.#if TC
1e270 4c 53 48 3d 3d 31 0a 73 74 61 74 69 63 20 63 6f  LSH==1.static co
1e280 6e 73 74 20 63 68 61 72 20 2a 74 63 6c 73 68 5f  nst char *tclsh_
1e290 6d 61 69 6e 5f 6c 6f 6f 70 28 76 6f 69 64 29 7b  main_loop(void){
1e2a0 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
1e2b0 63 68 61 72 20 7a 4d 61 69 6e 6c 6f 6f 70 5b 5d  char zMainloop[]
1e2c0 20 3d 0a 20 20 20 20 22 73 65 74 20 6c 69 6e 65   =.    "set line
1e2d0 20 7b 7d 5c 6e 22 0a 20 20 20 20 22 77 68 69 6c   {}\n".    "whil
1e2e0 65 20 7b 21 5b 65 6f 66 20 73 74 64 69 6e 5d 7d  e {![eof stdin]}
1e2f0 20 7b 5c 6e 22 0a 20 20 20 20 20 20 22 69 66 20   {\n".      "if 
1e300 7b 24 6c 69 6e 65 21 3d 5c 22 5c 22 7d 20 7b 5c  {$line!=\"\"} {\
1e310 6e 22 0a 20 20 20 20 20 20 20 20 22 70 75 74 73  n".        "puts
1e320 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20 5c 22 3e 20   -nonewline \"> 
1e330 5c 22 5c 6e 22 0a 20 20 20 20 20 20 22 7d 20 65  \"\n".      "} e
1e340 6c 73 65 20 7b 5c 6e 22 0a 20 20 20 20 20 20 20  lse {\n".       
1e350 20 22 70 75 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e   "puts -nonewlin
1e360 65 20 5c 22 25 20 5c 22 5c 6e 22 0a 20 20 20 20  e \"% \"\n".    
1e370 20 20 22 7d 5c 6e 22 0a 20 20 20 20 20 20 22 66    "}\n".      "f
1e380 6c 75 73 68 20 73 74 64 6f 75 74 5c 6e 22 0a 20  lush stdout\n". 
1e390 20 20 20 20 20 22 61 70 70 65 6e 64 20 6c 69 6e       "append lin
1e3a0 65 20 5b 67 65 74 73 20 73 74 64 69 6e 5d 5c 6e  e [gets stdin]\n
1e3b0 22 0a 20 20 20 20 20 20 22 69 66 20 7b 5b 69 6e  ".      "if {[in
1e3c0 66 6f 20 63 6f 6d 70 6c 65 74 65 20 24 6c 69 6e  fo complete $lin
1e3d0 65 5d 7d 20 7b 5c 6e 22 0a 20 20 20 20 20 20 20  e]} {\n".       
1e3e0 20 22 69 66 20 7b 5b 63 61 74 63 68 20 7b 75 70   "if {[catch {up
1e3f0 6c 65 76 65 6c 20 23 30 20 24 6c 69 6e 65 7d 20  level #0 $line} 
1e400 72 65 73 75 6c 74 5d 7d 20 7b 5c 6e 22 0a 20 20  result]} {\n".  
1e410 20 20 20 20 20 20 20 20 22 70 75 74 73 20 73 74          "puts st
1e420 64 65 72 72 20 5c 22 45 72 72 6f 72 3a 20 24 72  derr \"Error: $r
1e430 65 73 75 6c 74 5c 22 5c 6e 22 0a 20 20 20 20 20  esult\"\n".     
1e440 20 20 20 22 7d 20 65 6c 73 65 69 66 20 7b 24 72     "} elseif {$r
1e450 65 73 75 6c 74 21 3d 5c 22 5c 22 7d 20 7b 5c 6e  esult!=\"\"} {\n
1e460 22 0a 20 20 20 20 20 20 20 20 20 20 22 70 75 74  ".          "put
1e470 73 20 24 72 65 73 75 6c 74 5c 6e 22 0a 20 20 20  s $result\n".   
1e480 20 20 20 20 20 22 7d 5c 6e 22 0a 20 20 20 20 20       "}\n".     
1e490 20 20 20 22 73 65 74 20 6c 69 6e 65 20 7b 7d 5c     "set line {}\
1e4a0 6e 22 0a 20 20 20 20 20 20 22 7d 20 65 6c 73 65  n".      "} else
1e4b0 20 7b 5c 6e 22 0a 20 20 20 20 20 20 20 20 22 61   {\n".        "a
1e4c0 70 70 65 6e 64 20 6c 69 6e 65 20 5c 5c 6e 5c 6e  ppend line \\n\n
1e4d0 22 0a 20 20 20 20 20 20 22 7d 5c 6e 22 0a 20 20  ".      "}\n".  
1e4e0 20 20 22 7d 5c 6e 22 0a 20 20 3b 0a 20 20 72 65    "}\n".  ;.  re
1e4f0 74 75 72 6e 20 7a 4d 61 69 6e 6c 6f 6f 70 3b 0a  turn zMainloop;.
1e500 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 54 43 4c  }.#endif.#if TCL
1e510 53 48 3d 3d 32 0a 73 74 61 74 69 63 20 63 6f 6e  SH==2.static con
1e520 73 74 20 63 68 61 72 20 2a 74 63 6c 73 68 5f 6d  st char *tclsh_m
1e530 61 69 6e 5f 6c 6f 6f 70 28 76 6f 69 64 29 3b 0a  ain_loop(void);.
1e540 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53  #endif..#ifdef S
1e550 51 4c 49 54 45 5f 54 45 53 54 0a 73 74 61 74 69  QLITE_TEST.stati
1e560 63 20 76 6f 69 64 20 69 6e 69 74 5f 61 6c 6c 28  c void init_all(
1e570 54 63 6c 5f 49 6e 74 65 72 70 20 2a 29 3b 0a 73  Tcl_Interp *);.s
1e580 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
1e590 5f 54 43 4c 41 50 49 20 69 6e 69 74 5f 61 6c 6c  _TCLAPI init_all
1e5a0 5f 63 6d 64 28 0a 20 20 43 6c 69 65 6e 74 44 61  _cmd(.  ClientDa
1e5b0 74 61 20 63 64 2c 0a 20 20 54 63 6c 5f 49 6e 74  ta cd,.  Tcl_Int
1e5c0 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
1e5d0 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
1e5e0 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
1e5f0 0a 29 7b 0a 0a 20 20 54 63 6c 5f 49 6e 74 65 72  .){..  Tcl_Inter
1e600 70 20 2a 73 6c 61 76 65 3b 0a 20 20 69 66 28 20  p *slave;.  if( 
1e610 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  objc!=2 ){.    T
1e620 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
1e630 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
1e640 20 22 53 4c 41 56 45 22 29 3b 0a 20 20 20 20 72   "SLAVE");.    r
1e650 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1e660 0a 20 20 7d 0a 0a 20 20 73 6c 61 76 65 20 3d 20  .  }..  slave = 
1e670 54 63 6c 5f 47 65 74 53 6c 61 76 65 28 69 6e 74  Tcl_GetSlave(int
1e680 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
1e690 6e 67 28 6f 62 6a 76 5b 31 5d 29 29 3b 0a 20 20  ng(objv[1]));.  
1e6a0 69 66 28 20 21 73 6c 61 76 65 20 29 7b 0a 20 20  if( !slave ){.  
1e6b0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
1e6c0 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 6e 69 74 5f  OR;.  }..  init_
1e6d0 61 6c 6c 28 73 6c 61 76 65 29 3b 0a 20 20 72 65  all(slave);.  re
1e6e0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
1e6f0 2f 2a 0a 2a 2a 20 54 63 6c 63 6d 64 3a 20 64 62  /*.** Tclcmd: db
1e700 5f 75 73 65 5f 6c 65 67 61 63 79 5f 70 72 65 70  _use_legacy_prep
1e710 61 72 65 20 44 42 20 42 4f 4f 4c 45 41 4e 0a 2a  are DB BOOLEAN.*
1e720 2a 0a 2a 2a 20 20 20 54 68 65 20 66 69 72 73 74  *.**   The first
1e730 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69   argument to thi
1e740 73 20 63 6f 6d 6d 61 6e 64 20 6d 75 73 74 20 62  s command must b
1e750 65 20 61 20 64 61 74 61 62 61 73 65 20 63 6f 6d  e a database com
1e760 6d 61 6e 64 20 63 72 65 61 74 65 64 20 62 79 0a  mand created by.
1e770 2a 2a 20 20 20 5b 73 71 6c 69 74 65 33 5d 2e 20  **   [sqlite3]. 
1e780 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  If the second ar
1e790 67 75 6d 65 6e 74 20 69 73 20 74 72 75 65 2c 20  gument is true, 
1e7a0 74 68 65 6e 20 74 68 65 20 68 61 6e 64 6c 65 20  then the handle 
1e7b0 69 73 20 63 6f 6e 66 69 67 75 72 65 64 0a 2a 2a  is configured.**
1e7c0 20 20 20 74 6f 20 75 73 65 20 74 68 65 20 73 71     to use the sq
1e7d0 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
1e7e0 28 29 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 70  () function to p
1e7f0 72 65 70 61 72 65 20 73 74 61 74 65 6d 65 6e 74  repare statement
1e800 73 2e 20 49 66 20 69 74 0a 2a 2a 20 20 20 69 73  s. If it.**   is
1e810 20 66 61 6c 73 65 2c 20 73 71 6c 69 74 65 33 5f   false, sqlite3_
1e820 70 72 65 70 61 72 65 28 29 2e 0a 2a 2f 0a 73 74  prepare()..*/.st
1e830 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
1e840 54 43 4c 41 50 49 20 64 62 5f 75 73 65 5f 6c 65  TCLAPI db_use_le
1e850 67 61 63 79 5f 70 72 65 70 61 72 65 5f 63 6d 64  gacy_prepare_cmd
1e860 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63  (.  ClientData c
1e870 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  d,.  Tcl_Interp 
1e880 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
1e890 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
1e8a0 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
1e8b0 20 20 54 63 6c 5f 43 6d 64 49 6e 66 6f 20 63 6d    Tcl_CmdInfo cm
1e8c0 64 49 6e 66 6f 3b 0a 20 20 53 71 6c 69 74 65 44  dInfo;.  SqliteD
1e8d0 62 20 2a 70 44 62 3b 0a 20 20 69 6e 74 20 62 50  b *pDb;.  int bP
1e8e0 72 65 70 61 72 65 3b 0a 0a 20 20 69 66 28 20 6f  repare;..  if( o
1e8f0 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  bjc!=3 ){.    Tc
1e900 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
1e910 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
1e920 22 44 42 20 42 4f 4f 4c 45 41 4e 22 29 3b 0a 20  "DB BOOLEAN");. 
1e930 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
1e940 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ROR;.  }..  if( 
1e950 21 54 63 6c 5f 47 65 74 43 6f 6d 6d 61 6e 64 49  !Tcl_GetCommandI
1e960 6e 66 6f 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  nfo(interp, Tcl_
1e970 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
1e980 5d 29 2c 20 26 63 6d 64 49 6e 66 6f 29 20 29 7b  ]), &cmdInfo) ){
1e990 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
1e9a0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 6e  esult(interp, "n
1e9b0 6f 20 73 75 63 68 20 64 62 3a 20 22 2c 20 54 63  o such db: ", Tc
1e9c0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
1e9d0 5b 31 5d 29 2c 20 28 63 68 61 72 2a 29 30 29 3b  [1]), (char*)0);
1e9e0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
1e9f0 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 44 62  ERROR;.  }.  pDb
1ea00 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 63 6d   = (SqliteDb*)cm
1ea10 64 49 6e 66 6f 2e 6f 62 6a 43 6c 69 65 6e 74 44  dInfo.objClientD
1ea20 61 74 61 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47  ata;.  if( Tcl_G
1ea30 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a  etBooleanFromObj
1ea40 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d  (interp, objv[2]
1ea50 2c 20 26 62 50 72 65 70 61 72 65 29 20 29 7b 0a  , &bPrepare) ){.
1ea60 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
1ea70 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 70 44 62  RROR;.  }..  pDb
1ea80 2d 3e 62 4c 65 67 61 63 79 50 72 65 70 61 72 65  ->bLegacyPrepare
1ea90 20 3d 20 62 50 72 65 70 61 72 65 3b 0a 0a 20 20   = bPrepare;..  
1eaa0 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28  Tcl_ResetResult(
1eab0 69 6e 74 65 72 70 29 3b 0a 20 20 72 65 74 75 72  interp);.  retur
1eac0 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
1ead0 2a 2a 20 54 63 6c 63 6d 64 3a 20 64 62 5f 6c 61  ** Tclcmd: db_la
1eae0 73 74 5f 73 74 6d 74 5f 70 74 72 20 44 42 0a 2a  st_stmt_ptr DB.*
1eaf0 2a 0a 2a 2a 20 20 20 49 66 20 74 68 65 20 73 74  *.**   If the st
1eb00 61 74 65 6d 65 6e 74 20 63 61 63 68 65 20 61 73  atement cache as
1eb10 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 64 61  sociated with da
1eb20 74 61 62 61 73 65 20 44 42 20 69 73 20 6e 6f 74  tabase DB is not
1eb30 20 65 6d 70 74 79 2c 0a 2a 2a 20 20 20 72 65 74   empty,.**   ret
1eb40 75 72 6e 20 74 68 65 20 74 65 78 74 20 72 65 70  urn the text rep
1eb50 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  resentation of t
1eb60 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
1eb70 20 75 73 65 64 20 73 74 61 74 65 6d 65 6e 74 0a   used statement.
1eb80 2a 2a 20 20 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a  **   handle..*/.
1eb90 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54  static int SQLIT
1eba0 45 5f 54 43 4c 41 50 49 20 64 62 5f 6c 61 73 74  E_TCLAPI db_last
1ebb0 5f 73 74 6d 74 5f 70 74 72 28 0a 20 20 43 6c 69  _stmt_ptr(.  Cli
1ebc0 65 6e 74 44 61 74 61 20 63 64 2c 0a 20 20 54 63  entData cd,.  Tc
1ebd0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
1ebe0 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
1ebf0 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
1ec00 62 6a 76 5b 5d 0a 29 7b 0a 20 20 65 78 74 65 72  bjv[].){.  exter
1ec10 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 54 65 73  n int sqlite3Tes
1ec20 74 4d 61 6b 65 50 6f 69 6e 74 65 72 53 74 72 28  tMakePointerStr(
1ec30 54 63 6c 5f 49 6e 74 65 72 70 2a 2c 20 63 68 61  Tcl_Interp*, cha
1ec40 72 2a 2c 20 76 6f 69 64 2a 29 3b 0a 20 20 54 63  r*, void*);.  Tc
1ec50 6c 5f 43 6d 64 49 6e 66 6f 20 63 6d 64 49 6e 66  l_CmdInfo cmdInf
1ec60 6f 3b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70  o;.  SqliteDb *p
1ec70 44 62 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  Db;.  sqlite3_st
1ec80 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20  mt *pStmt = 0;. 
1ec90 20 63 68 61 72 20 7a 42 75 66 5b 31 30 30 5d 3b   char zBuf[100];
1eca0 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20  ..  if( objc!=2 
1ecb0 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
1ecc0 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
1ecd0 31 2c 20 6f 62 6a 76 2c 20 22 44 42 22 29 3b 0a  1, objv, "DB");.
1ece0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
1ecf0 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  RROR;.  }..  if(
1ed00 20 21 54 63 6c 5f 47 65 74 43 6f 6d 6d 61 6e 64   !Tcl_GetCommand
1ed10 49 6e 66 6f 28 69 6e 74 65 72 70 2c 20 54 63 6c  Info(interp, Tcl
1ed20 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
1ed30 31 5d 29 2c 20 26 63 6d 64 49 6e 66 6f 29 20 29  1]), &cmdInfo) )
1ed40 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
1ed50 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
1ed60 6e 6f 20 73 75 63 68 20 64 62 3a 20 22 2c 20 54  no such db: ", T
1ed70 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
1ed80 76 5b 31 5d 29 2c 20 28 63 68 61 72 2a 29 30 29  v[1]), (char*)0)
1ed90 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
1eda0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 44  _ERROR;.  }.  pD
1edb0 62 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 63  b = (SqliteDb*)c
1edc0 6d 64 49 6e 66 6f 2e 6f 62 6a 43 6c 69 65 6e 74  mdInfo.objClient
1edd0 44 61 74 61 3b 0a 0a 20 20 69 66 28 20 70 44 62  Data;..  if( pDb
1ede0 2d 3e 73 74 6d 74 4c 69 73 74 20 29 20 70 53 74  ->stmtList ) pSt
1edf0 6d 74 20 3d 20 70 44 62 2d 3e 73 74 6d 74 4c 69  mt = pDb->stmtLi
1ee00 73 74 2d 3e 70 53 74 6d 74 3b 0a 20 20 69 66 28  st->pStmt;.  if(
1ee10 20 73 71 6c 69 74 65 33 54 65 73 74 4d 61 6b 65   sqlite3TestMake
1ee20 50 6f 69 6e 74 65 72 53 74 72 28 69 6e 74 65 72  PointerStr(inter
1ee30 70 2c 20 7a 42 75 66 2c 20 70 53 74 6d 74 29 20  p, zBuf, pStmt) 
1ee40 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  ){.    return TC
1ee50 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 54  L_ERROR;.  }.  T
1ee60 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
1ee70 65 72 70 2c 20 7a 42 75 66 2c 20 54 43 4c 5f 56  erp, zBuf, TCL_V
1ee80 4f 4c 41 54 49 4c 45 29 3b 0a 0a 20 20 72 65 74  OLATILE);..  ret
1ee90 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65  urn TCL_OK;.}.#e
1eea0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 54  ndif /* SQLITE_T
1eeb0 45 53 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f  EST */../*.** Co
1eec0 6e 66 69 67 75 72 65 20 74 68 65 20 69 6e 74 65  nfigure the inte
1eed0 72 70 72 65 74 65 72 20 70 61 73 73 65 64 20 61  rpreter passed a
1eee0 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  s the first argu
1eef0 6d 65 6e 74 20 74 6f 20 68 61 76 65 20 61 63 63  ment to have acc
1ef00 65 73 73 0a 2a 2a 20 74 6f 20 74 68 65 20 63 6f  ess.** to the co
1ef10 6d 6d 61 6e 64 73 20 61 6e 64 20 6c 69 6e 6b 65  mmands and linke
1ef20 64 20 76 61 72 69 61 62 6c 65 73 20 74 68 61 74  d variables that
1ef30 20 6d 61 6b 65 20 75 70 3a 0a 2a 2a 0a 2a 2a 20   make up:.**.** 
1ef40 20 20 2a 20 74 68 65 20 5b 73 71 6c 69 74 65 33    * the [sqlite3
1ef50 5d 20 65 78 74 65 6e 73 69 6f 6e 20 69 74 73 65  ] extension itse
1ef60 6c 66 2c 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66  lf,.**.**   * If
1ef70 20 53 51 4c 49 54 45 5f 54 43 4c 4d 44 35 20 6f   SQLITE_TCLMD5 o
1ef80 72 20 53 51 4c 49 54 45 5f 54 45 53 54 20 69 73  r SQLITE_TEST is
1ef90 20 64 65 66 69 6e 65 64 2c 20 74 68 65 20 4d 64   defined, the Md
1efa0 35 20 63 6f 6d 6d 61 6e 64 73 2c 20 61 6e 64 0a  5 commands, and.
1efb0 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 53 51 4c  **.**   * If SQL
1efc0 49 54 45 5f 54 45 53 54 20 69 73 20 73 65 74 2c  ITE_TEST is set,
1efd0 20 74 68 65 20 76 61 72 69 6f 75 73 20 74 65 73   the various tes
1efe0 74 20 69 6e 74 65 72 66 61 63 65 73 20 75 73 65  t interfaces use
1eff0 64 20 62 79 20 74 68 65 20 54 63 6c 0a 2a 2a 20  d by the Tcl.** 
1f000 20 20 20 20 74 65 73 74 20 73 75 69 74 65 2e 0a      test suite..
1f010 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69  */.static void i
1f020 6e 69 74 5f 61 6c 6c 28 54 63 6c 5f 49 6e 74 65  nit_all(Tcl_Inte
1f030 72 70 20 2a 69 6e 74 65 72 70 29 7b 0a 20 20 53  rp *interp){.  S
1f040 71 6c 69 74 65 33 5f 49 6e 69 74 28 69 6e 74 65  qlite3_Init(inte
1f050 72 70 29 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65  rp);..#if define
1f060 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 20 7c  d(SQLITE_TEST) |
1f070 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  | defined(SQLITE
1f080 5f 54 43 4c 4d 44 35 29 0a 20 20 4d 64 35 5f 49  _TCLMD5).  Md5_I
1f090 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 23 65 6e  nit(interp);.#en
1f0a0 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
1f0b0 54 45 5f 54 45 53 54 0a 20 20 7b 0a 20 20 20 20  TE_TEST.  {.    
1f0c0 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74  extern int Sqlit
1f0d0 65 63 6f 6e 66 69 67 5f 49 6e 69 74 28 54 63 6c  econfig_Init(Tcl
1f0e0 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65  _Interp*);.    e
1f0f0 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65  xtern int Sqlite
1f100 74 65 73 74 31 5f 49 6e 69 74 28 54 63 6c 5f 49  test1_Init(Tcl_I
1f110 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74  nterp*);.    ext
1f120 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65  ern int Sqlitete
1f130 73 74 32 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74  st2_Init(Tcl_Int
1f140 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72  erp*);.    exter
1f150 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74  n int Sqlitetest
1f160 33 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  3_Init(Tcl_Inter
1f170 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20  p*);.    extern 
1f180 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 34 5f  int Sqlitetest4_
1f190 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a  Init(Tcl_Interp*
1f1a0 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e  );.    extern in
1f1b0 74 20 53 71 6c 69 74 65 74 65 73 74 35 5f 49 6e  t Sqlitetest5_In
1f1c0 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b  it(Tcl_Interp*);
1f1d0 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20  .    extern int 
1f1e0 53 71 6c 69 74 65 74 65 73 74 36 5f 49 6e 69 74  Sqlitetest6_Init
1f1f0 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20  (Tcl_Interp*);. 
1f200 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71     extern int Sq
1f210 6c 69 74 65 74 65 73 74 37 5f 49 6e 69 74 28 54  litetest7_Init(T
1f220 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20  cl_Interp*);.   
1f230 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69   extern int Sqli
1f240 74 65 74 65 73 74 38 5f 49 6e 69 74 28 54 63 6c  tetest8_Init(Tcl
1f250 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65  _Interp*);.    e
1f260 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65  xtern int Sqlite
1f270 74 65 73 74 39 5f 49 6e 69 74 28 54 63 6c 5f 49  test9_Init(Tcl_I
1f280 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74  nterp*);.    ext
1f290 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65  ern int Sqlitete
1f2a0 73 74 61 73 79 6e 63 5f 49 6e 69 74 28 54 63 6c  stasync_Init(Tcl
1f2b0 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65  _Interp*);.    e
1f2c0 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65  xtern int Sqlite
1f2d0 74 65 73 74 5f 61 75 74 6f 65 78 74 5f 49 6e 69  test_autoext_Ini
1f2e0 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a  t(Tcl_Interp*);.
1f2f0 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53      extern int S
1f300 71 6c 69 74 65 74 65 73 74 5f 62 6c 6f 62 5f 49  qlitetest_blob_I
1f310 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29  nit(Tcl_Interp*)
1f320 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74  ;.    extern int
1f330 20 53 71 6c 69 74 65 74 65 73 74 5f 64 65 6d 6f   Sqlitetest_demo
1f340 76 66 73 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74  vfs_Init(Tcl_Int
1f350 65 72 70 20 2a 29 3b 0a 20 20 20 20 65 78 74 65  erp *);.    exte
1f360 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73  rn int Sqlitetes
1f370 74 5f 66 75 6e 63 5f 49 6e 69 74 28 54 63 6c 5f  t_func_Init(Tcl_
1f380 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78  Interp*);.    ex
1f390 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74  tern int Sqlitet
1f3a0 65 73 74 5f 68 65 78 69 6f 5f 49 6e 69 74 28 54  est_hexio_Init(T
1f3b0 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20  cl_Interp*);.   
1f3c0 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69   extern int Sqli
1f3d0 74 65 74 65 73 74 5f 69 6e 69 74 5f 49 6e 69 74  tetest_init_Init
1f3e0 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20  (Tcl_Interp*);. 
1f3f0 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71     extern int Sq
1f400 6c 69 74 65 74 65 73 74 5f 6d 61 6c 6c 6f 63 5f  litetest_malloc_
1f410 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a  Init(Tcl_Interp*
1f420 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e  );.    extern in
1f430 74 20 53 71 6c 69 74 65 74 65 73 74 5f 6d 75 74  t Sqlitetest_mut
1f440 65 78 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  ex_Init(Tcl_Inte
1f450 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e  rp*);.    extern
1f460 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 73   int Sqlitetests
1f470 63 68 65 6d 61 5f 49 6e 69 74 28 54 63 6c 5f 49  chema_Init(Tcl_I
1f480 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74  nterp*);.    ext
1f490 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65  ern int Sqlitete
1f4a0 73 74 73 73 65 5f 49 6e 69 74 28 54 63 6c 5f 49  stsse_Init(Tcl_I
1f4b0 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74  nterp*);.    ext
1f4c0 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65  ern int Sqlitete
1f4d0 73 74 74 63 6c 76 61 72 5f 49 6e 69 74 28 54 63  sttclvar_Init(Tc
1f4e0 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20  l_Interp*);.    
1f4f0 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74  extern int Sqlit
1f500 65 74 65 73 74 66 73 5f 49 6e 69 74 28 54 63 6c  etestfs_Init(Tcl
1f510 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65  _Interp*);.    e
1f520 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65  xtern int Sqlite
1f530 74 65 73 74 54 68 72 65 61 64 5f 49 6e 69 74 28  testThread_Init(
1f540 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20  Tcl_Interp*);.  
1f550 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c    extern int Sql
1f560 69 74 65 74 65 73 74 4f 6e 65 66 69 6c 65 5f 49  itetestOnefile_I
1f570 6e 69 74 28 29 3b 0a 20 20 20 20 65 78 74 65 72  nit();.    exter
1f580 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74  n int Sqlitetest
1f590 4f 73 69 6e 73 74 5f 49 6e 69 74 28 54 63 6c 5f  Osinst_Init(Tcl_
1f5a0 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78  Interp*);.    ex
1f5b0 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74  tern int Sqlitet
1f5c0 65 73 74 62 61 63 6b 75 70 5f 49 6e 69 74 28 54  estbackup_Init(T
1f5d0 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20  cl_Interp*);.   
1f5e0 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69   extern int Sqli
1f5f0 74 65 74 65 73 74 69 6e 74 61 72 72 61 79 5f 49  tetestintarray_I
1f600 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29  nit(Tcl_Interp*)
1f610 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74  ;.    extern int
1f620 20 53 71 6c 69 74 65 74 65 73 74 76 66 73 5f 49   Sqlitetestvfs_I
1f630 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a  nit(Tcl_Interp *
1f640 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e  );.    extern in
1f650 74 20 53 71 6c 69 74 65 74 65 73 74 72 74 72 65  t Sqlitetestrtre
1f660 65 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  e_Init(Tcl_Inter
1f670 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20  p*);.    extern 
1f680 69 6e 74 20 53 71 6c 69 74 65 71 75 6f 74 61 5f  int Sqlitequota_
1f690 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a  Init(Tcl_Interp*
1f6a0 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e  );.    extern in
1f6b0 74 20 53 71 6c 69 74 65 6d 75 6c 74 69 70 6c 65  t Sqlitemultiple
1f6c0 78 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  x_Init(Tcl_Inter
1f6d0 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20  p*);.    extern 
1f6e0 69 6e 74 20 53 71 6c 69 74 65 53 75 70 65 72 6c  int SqliteSuperl
1f6f0 6f 63 6b 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74  ock_Init(Tcl_Int
1f700 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72  erp*);.    exter
1f710 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74  n int Sqlitetest
1f720 53 79 73 63 61 6c 6c 5f 49 6e 69 74 28 54 63 6c  Syscall_Init(Tcl
1f730 5f 49 6e 74 65 72 70 2a 29 3b 0a 23 69 66 20 64  _Interp*);.#if d
1f740 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
1f750 41 42 4c 45 5f 53 45 53 53 49 4f 4e 29 20 26 26  ABLE_SESSION) &&
1f760 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
1f770 45 4e 41 42 4c 45 5f 50 52 45 55 50 44 41 54 45  ENABLE_PREUPDATE
1f780 5f 48 4f 4f 4b 29 0a 20 20 20 20 65 78 74 65 72  _HOOK).    exter
1f790 6e 20 69 6e 74 20 54 65 73 74 53 65 73 73 69 6f  n int TestSessio
1f7a0 6e 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  n_Init(Tcl_Inter
1f7b0 70 2a 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  p*);.#endif.    
1f7c0 65 78 74 65 72 6e 20 69 6e 74 20 46 74 73 35 74  extern int Fts5t
1f7d0 63 6c 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  cl_Init(Tcl_Inte
1f7e0 72 70 20 2a 29 3b 0a 20 20 20 20 65 78 74 65 72  rp *);.    exter
1f7f0 6e 20 69 6e 74 20 53 71 6c 69 74 65 52 62 75 5f  n int SqliteRbu_
1f800 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a  Init(Tcl_Interp*
1f810 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e  );.    extern in
1f820 74 20 53 71 6c 69 74 65 74 65 73 74 74 63 6c 5f  t Sqlitetesttcl_
1f830 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a  Init(Tcl_Interp*
1f840 29 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  );.#if defined(S
1f850 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53  QLITE_ENABLE_FTS
1f860 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  3) || defined(SQ
1f870 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 34  LITE_ENABLE_FTS4
1f880 29 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74  ).    extern int
1f890 20 53 71 6c 69 74 65 74 65 73 74 66 74 73 33 5f   Sqlitetestfts3_
1f8a0 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20  Init(Tcl_Interp 
1f8b0 2a 69 6e 74 65 72 70 29 3b 0a 23 65 6e 64 69 66  *interp);.#endif
1f8c0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
1f8d0 45 4e 41 42 4c 45 5f 5a 49 50 56 46 53 0a 20 20  ENABLE_ZIPVFS.  
1f8e0 20 20 65 78 74 65 72 6e 20 69 6e 74 20 5a 69 70    extern int Zip
1f8f0 76 66 73 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74  vfs_Init(Tcl_Int
1f900 65 72 70 2a 29 3b 0a 20 20 20 20 5a 69 70 76 66  erp*);.    Zipvf
1f910 73 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a  s_Init(interp);.
1f920 23 65 6e 64 69 66 0a 0a 20 20 20 20 53 71 6c 69  #endif..    Sqli
1f930 74 65 63 6f 6e 66 69 67 5f 49 6e 69 74 28 69 6e  teconfig_Init(in
1f940 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74  terp);.    Sqlit
1f950 65 74 65 73 74 31 5f 49 6e 69 74 28 69 6e 74 65  etest1_Init(inte
1f960 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74  rp);.    Sqlitet
1f970 65 73 74 32 5f 49 6e 69 74 28 69 6e 74 65 72 70  est2_Init(interp
1f980 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73  );.    Sqlitetes
1f990 74 33 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b  t3_Init(interp);
1f9a0 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 34  .    Sqlitetest4
1f9b0 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20  _Init(interp);. 
1f9c0 20 20 20 53 71 6c 69 74 65 74 65 73 74 35 5f 49     Sqlitetest5_I
1f9d0 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20  nit(interp);.   
1f9e0 20 53 71 6c 69 74 65 74 65 73 74 36 5f 49 6e 69   Sqlitetest6_Ini
1f9f0 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53  t(interp);.    S
1fa00 71 6c 69 74 65 74 65 73 74 37 5f 49 6e 69 74 28  qlitetest7_Init(
1fa10 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c  interp);.    Sql
1fa20 69 74 65 74 65 73 74 38 5f 49 6e 69 74 28 69 6e  itetest8_Init(in
1fa30 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74  terp);.    Sqlit
1fa40 65 74 65 73 74 39 5f 49 6e 69 74 28 69 6e 74 65  etest9_Init(inte
1fa50 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74  rp);.    Sqlitet
1fa60 65 73 74 61 73 79 6e 63 5f 49 6e 69 74 28 69 6e  estasync_Init(in
1fa70 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74  terp);.    Sqlit
1fa80 65 74 65 73 74 5f 61 75 74 6f 65 78 74 5f 49 6e  etest_autoext_In
1fa90 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  it(interp);.    
1faa0 53 71 6c 69 74 65 74 65 73 74 5f 62 6c 6f 62 5f  Sqlitetest_blob_
1fab0 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  Init(interp);.  
1fac0 20 20 53 71 6c 69 74 65 74 65 73 74 5f 64 65 6d    Sqlitetest_dem
1fad0 6f 76 66 73 5f 49 6e 69 74 28 69 6e 74 65 72 70  ovfs_Init(interp
1fae0 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73  );.    Sqlitetes
1faf0 74 5f 66 75 6e 63 5f 49 6e 69 74 28 69 6e 74 65  t_func_Init(inte
1fb00 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74  rp);.    Sqlitet
1fb10 65 73 74 5f 68 65 78 69 6f 5f 49 6e 69 74 28 69  est_hexio_Init(i
1fb20 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69  nterp);.    Sqli
1fb30 74 65 74 65 73 74 5f 69 6e 69 74 5f 49 6e 69 74  tetest_init_Init
1fb40 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71  (interp);.    Sq
1fb50 6c 69 74 65 74 65 73 74 5f 6d 61 6c 6c 6f 63 5f  litetest_malloc_
1fb60 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  Init(interp);.  
1fb70 20 20 53 71 6c 69 74 65 74 65 73 74 5f 6d 75 74    Sqlitetest_mut
1fb80 65 78 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b  ex_Init(interp);
1fb90 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 73  .    Sqlitetests
1fba0 63 68 65 6d 61 5f 49 6e 69 74 28 69 6e 74 65 72  chema_Init(inter
1fbb0 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65  p);.    Sqlitete
1fbc0 73 74 74 63 6c 76 61 72 5f 49 6e 69 74 28 69 6e  sttclvar_Init(in
1fbd0 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74  terp);.    Sqlit
1fbe0 65 74 65 73 74 66 73 5f 49 6e 69 74 28 69 6e 74  etestfs_Init(int
1fbf0 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65  erp);.    Sqlite
1fc00 74 65 73 74 54 68 72 65 61 64 5f 49 6e 69 74 28  testThread_Init(
1fc10 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c  interp);.    Sql
1fc20 69 74 65 74 65 73 74 4f 6e 65 66 69 6c 65 5f 49  itetestOnefile_I
1fc30 6e 69 74 28 29 3b 0a 20 20 20 20 53 71 6c 69 74  nit();.    Sqlit
1fc40 65 74 65 73 74 4f 73 69 6e 73 74 5f 49 6e 69 74  etestOsinst_Init
1fc50 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71  (interp);.    Sq
1fc60 6c 69 74 65 74 65 73 74 62 61 63 6b 75 70 5f 49  litetestbackup_I
1fc70 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20  nit(interp);.   
1fc80 20 53 71 6c 69 74 65 74 65 73 74 69 6e 74 61 72   Sqlitetestintar
1fc90 72 61 79 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  ray_Init(interp)
1fca0 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74  ;.    Sqlitetest
1fcb0 76 66 73 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  vfs_Init(interp)
1fcc0 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74  ;.    Sqlitetest
1fcd0 72 74 72 65 65 5f 49 6e 69 74 28 69 6e 74 65 72  rtree_Init(inter
1fce0 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 71 75  p);.    Sqlitequ
1fcf0 6f 74 61 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  ota_Init(interp)
1fd00 3b 0a 20 20 20 20 53 71 6c 69 74 65 6d 75 6c 74  ;.    Sqlitemult
1fd10 69 70 6c 65 78 5f 49 6e 69 74 28 69 6e 74 65 72  iplex_Init(inter
1fd20 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 53 75  p);.    SqliteSu
1fd30 70 65 72 6c 6f 63 6b 5f 49 6e 69 74 28 69 6e 74  perlock_Init(int
1fd40 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65  erp);.    Sqlite
1fd50 74 65 73 74 53 79 73 63 61 6c 6c 5f 49 6e 69 74  testSyscall_Init
1fd60 28 69 6e 74 65 72 70 29 3b 0a 23 69 66 20 64 65  (interp);.#if de
1fd70 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
1fd80 42 4c 45 5f 53 45 53 53 49 4f 4e 29 20 26 26 20  BLE_SESSION) && 
1fd90 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
1fda0 4e 41 42 4c 45 5f 50 52 45 55 50 44 41 54 45 5f  NABLE_PREUPDATE_
1fdb0 48 4f 4f 4b 29 0a 20 20 20 20 54 65 73 74 53 65  HOOK).    TestSe
1fdc0 73 73 69 6f 6e 5f 49 6e 69 74 28 69 6e 74 65 72  ssion_Init(inter
1fdd0 70 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 46  p);.#endif.    F
1fde0 74 73 35 74 63 6c 5f 49 6e 69 74 28 69 6e 74 65  ts5tcl_Init(inte
1fdf0 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 52  rp);.    SqliteR
1fe00 62 75 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b  bu_Init(interp);
1fe10 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 74  .    Sqlitetestt
1fe20 63 6c 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b  cl_Init(interp);
1fe30 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ..#if defined(SQ
1fe40 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 33  LITE_ENABLE_FTS3
1fe50 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c  ) || defined(SQL
1fe60 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 34 29  ITE_ENABLE_FTS4)
1fe70 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 66  .    Sqlitetestf
1fe80 74 73 33 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  ts3_Init(interp)
1fe90 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 54 63  ;.#endif..    Tc
1fea0 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61  l_CreateObjComma
1feb0 6e 64 28 0a 20 20 20 20 20 20 20 20 69 6e 74 65  nd(.        inte
1fec0 72 70 2c 20 22 6c 6f 61 64 5f 74 65 73 74 66 69  rp, "load_testfi
1fed0 78 74 75 72 65 5f 65 78 74 65 6e 73 69 6f 6e 73  xture_extensions
1fee0 22 2c 20 69 6e 69 74 5f 61 6c 6c 5f 63 6d 64 2c  ", init_all_cmd,
1fef0 20 30 2c 20 30 0a 20 20 20 20 29 3b 0a 20 20 20   0, 0.    );.   
1ff00 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f   Tcl_CreateObjCo
1ff10 6d 6d 61 6e 64 28 0a 20 20 20 20 20 20 20 20 69  mmand(.        i
1ff20 6e 74 65 72 70 2c 20 22 64 62 5f 75 73 65 5f 6c  nterp, "db_use_l
1ff30 65 67 61 63 79 5f 70 72 65 70 61 72 65 22 2c 20  egacy_prepare", 
1ff40 64 62 5f 75 73 65 5f 6c 65 67 61 63 79 5f 70 72  db_use_legacy_pr
1ff50 65 70 61 72 65 5f 63 6d 64 2c 20 30 2c 20 30 0a  epare_cmd, 0, 0.
1ff60 20 20 20 20 29 3b 0a 20 20 20 20 54 63 6c 5f 43      );.    Tcl_C
1ff70 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28  reateObjCommand(
1ff80 0a 20 20 20 20 20 20 20 20 69 6e 74 65 72 70 2c  .        interp,
1ff90 20 22 64 62 5f 6c 61 73 74 5f 73 74 6d 74 5f 70   "db_last_stmt_p
1ffa0 74 72 22 2c 20 64 62 5f 6c 61 73 74 5f 73 74 6d  tr", db_last_stm
1ffb0 74 5f 70 74 72 2c 20 30 2c 20 30 0a 20 20 20 20  t_ptr, 0, 0.    
1ffc0 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  );..#ifdef SQLIT
1ffd0 45 5f 53 53 45 0a 20 20 20 20 53 71 6c 69 74 65  E_SSE.    Sqlite
1ffe0 74 65 73 74 73 73 65 5f 49 6e 69 74 28 69 6e 74  testsse_Init(int
1fff0 65 72 70 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  erp);.#endif.  }
20000 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 20 4e 65  .#endif.}../* Ne
20010 65 64 65 64 20 66 6f 72 20 74 68 65 20 73 65 74  eded for the set
20020 72 6c 69 6d 69 74 28 29 20 73 79 73 74 65 6d 20  rlimit() system 
20030 63 61 6c 6c 20 6f 6e 20 75 6e 69 78 20 2a 2f 0a  call on unix */.
20040 23 69 66 20 64 65 66 69 6e 65 64 28 75 6e 69 78  #if defined(unix
20050 29 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f  ).#include <sys/
20060 72 65 73 6f 75 72 63 65 2e 68 3e 0a 23 65 6e 64  resource.h>.#end
20070 69 66 0a 0a 23 64 65 66 69 6e 65 20 54 43 4c 53  if..#define TCLS
20080 48 5f 4d 41 49 4e 20 6d 61 69 6e 20 20 20 2f 2a  H_MAIN main   /*
20090 20 4e 65 65 64 65 64 20 74 6f 20 66 61 6b 65 20   Needed to fake 
200a0 6f 75 74 20 6d 6b 74 63 6c 61 70 70 20 2a 2f 0a  out mktclapp */.
200b0 69 6e 74 20 53 51 4c 49 54 45 5f 43 44 45 43 4c  int SQLITE_CDECL
200c0 20 54 43 4c 53 48 5f 4d 41 49 4e 28 69 6e 74 20   TCLSH_MAIN(int 
200d0 61 72 67 63 2c 20 63 68 61 72 20 2a 2a 61 72 67  argc, char **arg
200e0 76 29 7b 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  v){.  Tcl_Interp
200f0 20 2a 69 6e 74 65 72 70 3b 0a 0a 23 69 66 20 21   *interp;..#if !
20100 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 5f 57  defined(_WIN32_W
20110 43 45 29 0a 20 20 69 66 28 20 67 65 74 65 6e 76  CE).  if( getenv
20120 28 22 42 52 45 41 4b 22 29 20 29 7b 0a 20 20 20  ("BREAK") ){.   
20130 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
20140 0a 20 20 20 20 20 20 20 20 22 61 74 74 61 63 68  .        "attach
20150 20 64 65 62 75 67 67 65 72 20 74 6f 20 70 72 6f   debugger to pro
20160 63 65 73 73 20 25 64 20 61 6e 64 20 70 72 65 73  cess %d and pres
20170 73 20 61 6e 79 20 6b 65 79 20 74 6f 20 63 6f 6e  s any key to con
20180 74 69 6e 75 65 2e 5c 6e 22 2c 0a 20 20 20 20 20  tinue.\n",.     
20190 20 20 20 47 45 54 50 49 44 28 29 29 3b 0a 20 20     GETPID());.  
201a0 20 20 66 67 65 74 63 28 73 74 64 69 6e 29 3b 0a    fgetc(stdin);.
201b0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
201c0 20 53 69 6e 63 65 20 74 68 65 20 70 72 69 6d 61   Since the prima
201d0 72 79 20 75 73 65 20 63 61 73 65 20 66 6f 72 20  ry use case for 
201e0 74 68 69 73 20 62 69 6e 61 72 79 20 69 73 20 74  this binary is t
201f0 65 73 74 69 6e 67 20 6f 66 20 53 51 4c 69 74 65  esting of SQLite
20200 2c 0a 20 20 2a 2a 20 62 65 20 73 75 72 65 20 74  ,.  ** be sure t
20210 6f 20 67 65 6e 65 72 61 74 65 20 63 6f 72 65 20  o generate core 
20220 66 69 6c 65 73 20 69 66 20 77 65 20 63 72 61 73  files if we cras
20230 68 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64  h */.#if defined
20240 28 53 51 4c 49 54 45 5f 54 45 53 54 29 20 26 26  (SQLITE_TEST) &&
20250 20 64 65 66 69 6e 65 64 28 75 6e 69 78 29 0a 20   defined(unix). 
20260 20 7b 20 73 74 72 75 63 74 20 72 6c 69 6d 69 74   { struct rlimit
20270 20 78 3b 0a 20 20 20 20 67 65 74 72 6c 69 6d 69   x;.    getrlimi
20280 74 28 52 4c 49 4d 49 54 5f 43 4f 52 45 2c 20 26  t(RLIMIT_CORE, &
20290 78 29 3b 0a 20 20 20 20 78 2e 72 6c 69 6d 5f 63  x);.    x.rlim_c
202a0 75 72 20 3d 20 78 2e 72 6c 69 6d 5f 6d 61 78 3b  ur = x.rlim_max;
202b0 0a 20 20 20 20 73 65 74 72 6c 69 6d 69 74 28 52  .    setrlimit(R
202c0 4c 49 4d 49 54 5f 43 4f 52 45 2c 20 26 78 29 3b  LIMIT_CORE, &x);
202d0 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  .  }.#endif /* S
202e0 51 4c 49 54 45 5f 54 45 53 54 20 26 26 20 75 6e  QLITE_TEST && un
202f0 69 78 20 2a 2f 0a 0a 0a 20 20 2f 2a 20 43 61 6c  ix */...  /* Cal
20300 6c 20 73 71 6c 69 74 65 33 5f 73 68 75 74 64 6f  l sqlite3_shutdo
20310 77 6e 28 29 20 6f 6e 63 65 20 62 65 66 6f 72 65  wn() once before
20320 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 20   doing anything 
20330 65 6c 73 65 2e 20 54 68 69 73 20 69 73 20 74 6f  else. This is to
20340 0a 20 20 2a 2a 20 74 65 73 74 20 74 68 61 74 20  .  ** test that 
20350 73 71 6c 69 74 65 33 5f 73 68 75 74 64 6f 77 6e  sqlite3_shutdown
20360 28 29 20 63 61 6e 20 62 65 20 73 61 66 65 6c 79  () can be safely
20370 20 63 61 6c 6c 65 64 20 62 79 20 61 20 70 72 6f   called by a pro
20380 63 65 73 73 20 62 65 66 6f 72 65 0a 20 20 2a 2a  cess before.  **
20390 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c   sqlite3_initial
203a0 69 7a 65 28 29 20 69 73 2e 20 2a 2f 0a 20 20 73  ize() is. */.  s
203b0 71 6c 69 74 65 33 5f 73 68 75 74 64 6f 77 6e 28  qlite3_shutdown(
203c0 29 3b 0a 0a 20 20 54 63 6c 5f 46 69 6e 64 45 78  );..  Tcl_FindEx
203d0 65 63 75 74 61 62 6c 65 28 61 72 67 76 5b 30 5d  ecutable(argv[0]
203e0 29 3b 0a 20 20 54 63 6c 5f 53 65 74 53 79 73 74  );.  Tcl_SetSyst
203f0 65 6d 45 6e 63 6f 64 69 6e 67 28 4e 55 4c 4c 2c  emEncoding(NULL,
20400 20 22 75 74 66 2d 38 22 29 3b 0a 20 20 69 6e 74   "utf-8");.  int
20410 65 72 70 20 3d 20 54 63 6c 5f 43 72 65 61 74 65  erp = Tcl_Create
20420 49 6e 74 65 72 70 28 29 3b 0a 0a 23 69 66 20 54  Interp();..#if T
20430 43 4c 53 48 3d 3d 32 0a 20 20 73 71 6c 69 74 65  CLSH==2.  sqlite
20440 33 5f 63 6f 6e 66 69 67 28 53 51 4c 49 54 45 5f  3_config(SQLITE_
20450 43 4f 4e 46 49 47 5f 53 49 4e 47 4c 45 54 48 52  CONFIG_SINGLETHR
20460 45 41 44 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  EAD);.#endif..  
20470 69 6e 69 74 5f 61 6c 6c 28 69 6e 74 65 72 70 29  init_all(interp)
20480 3b 0a 20 20 69 66 28 20 61 72 67 63 3e 3d 32 20  ;.  if( argc>=2 
20490 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
204a0 20 20 63 68 61 72 20 7a 41 72 67 63 5b 33 32 5d    char zArgc[32]
204b0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  ;.    sqlite3_sn
204c0 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 41  printf(sizeof(zA
204d0 72 67 63 29 2c 20 7a 41 72 67 63 2c 20 22 25 64  rgc), zArgc, "%d
204e0 22 2c 20 61 72 67 63 2d 28 33 2d 54 43 4c 53 48  ", argc-(3-TCLSH
204f0 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 56  ));.    Tcl_SetV
20500 61 72 28 69 6e 74 65 72 70 2c 22 61 72 67 63 22  ar(interp,"argc"
20510 2c 20 7a 41 72 67 63 2c 20 54 43 4c 5f 47 4c 4f  , zArgc, TCL_GLO
20520 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 20 20 20 20 54  BAL_ONLY);.    T
20530 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70  cl_SetVar(interp
20540 2c 22 61 72 67 76 30 22 2c 61 72 67 76 5b 31 5d  ,"argv0",argv[1]
20550 2c 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59  ,TCL_GLOBAL_ONLY
20560 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 56 61  );.    Tcl_SetVa
20570 72 28 69 6e 74 65 72 70 2c 22 61 72 67 76 22 2c  r(interp,"argv",
20580 20 22 22 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f   "", TCL_GLOBAL_
20590 4f 4e 4c 59 29 3b 0a 20 20 20 20 66 6f 72 28 69  ONLY);.    for(i
205a0 3d 33 2d 54 43 4c 53 48 3b 20 69 3c 61 72 67 63  =3-TCLSH; i<argc
205b0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 54 63  ; i++){.      Tc
205c0 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c  l_SetVar(interp,
205d0 20 22 61 72 67 76 22 2c 20 61 72 67 76 5b 69 5d   "argv", argv[i]
205e0 2c 0a 20 20 20 20 20 20 20 20 20 20 54 43 4c 5f  ,.          TCL_
205f0 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 20 7c 20 54 43  GLOBAL_ONLY | TC
20600 4c 5f 4c 49 53 54 5f 45 4c 45 4d 45 4e 54 20 7c  L_LIST_ELEMENT |
20610 20 54 43 4c 5f 41 50 50 45 4e 44 5f 56 41 4c 55   TCL_APPEND_VALU
20620 45 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  E);.    }.    if
20630 28 20 54 43 4c 53 48 3d 3d 31 20 26 26 20 54 63  ( TCLSH==1 && Tc
20640 6c 5f 45 76 61 6c 46 69 6c 65 28 69 6e 74 65 72  l_EvalFile(inter
20650 70 2c 20 61 72 67 76 5b 31 5d 29 21 3d 54 43 4c  p, argv[1])!=TCL
20660 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e  _OK ){.      con
20670 73 74 20 63 68 61 72 20 2a 7a 49 6e 66 6f 20 3d  st char *zInfo =
20680 20 54 63 6c 5f 47 65 74 56 61 72 28 69 6e 74 65   Tcl_GetVar(inte
20690 72 70 2c 20 22 65 72 72 6f 72 49 6e 66 6f 22 2c  rp, "errorInfo",
206a0 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59   TCL_GLOBAL_ONLY
206b0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 49 6e  );.      if( zIn
206c0 66 6f 3d 3d 30 20 29 20 7a 49 6e 66 6f 20 3d 20  fo==0 ) zInfo = 
206d0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73  Tcl_GetStringRes
206e0 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20  ult(interp);.   
206f0 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
20700 72 2c 22 25 73 3a 20 25 73 5c 6e 22 2c 20 2a 61  r,"%s: %s\n", *a
20710 72 67 76 2c 20 7a 49 6e 66 6f 29 3b 0a 20 20 20  rgv, zInfo);.   
20720 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
20730 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 54 43 4c   }.  }.  if( TCL
20740 53 48 3d 3d 32 20 7c 7c 20 61 72 67 63 3c 3d 31  SH==2 || argc<=1
20750 20 29 7b 0a 20 20 20 20 54 63 6c 5f 47 6c 6f 62   ){.    Tcl_Glob
20760 61 6c 45 76 61 6c 28 69 6e 74 65 72 70 2c 20 74  alEval(interp, t
20770 63 6c 73 68 5f 6d 61 69 6e 5f 6c 6f 6f 70 28 29  clsh_main_loop()
20780 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
20790 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 54  0;.}.#endif /* T
207a0 43 4c 53 48 20 2a 2f 0a                          CLSH */.