/ Hex Artifact Content
Login

Artifact c2390f9f84b036b1a8fbbec84eac924f4094bbf055531e878cd0a987d5464754:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 41 20 54 43 4c 20  ******.** A TCL 
0180: 49 6e 74 65 72 66 61 63 65 20 74 6f 20 53 51 4c  Interface to SQL
0190: 69 74 65 2e 20 20 41 70 70 65 6e 64 20 74 68 69  ite.  Append thi
01a0: 73 20 66 69 6c 65 20 74 6f 20 73 71 6c 69 74 65  s file to sqlite
01b0: 33 2e 63 20 61 6e 64 0a 2a 2a 20 63 6f 6d 70 69  3.c and.** compi
01c0: 6c 65 20 74 68 65 20 77 68 6f 6c 65 20 74 68 69  le the whole thi
01d0: 6e 67 20 74 6f 20 62 75 69 6c 64 20 61 20 54 43  ng to build a TC
01e0: 4c 2d 65 6e 61 62 6c 65 64 20 76 65 72 73 69 6f  L-enabled versio
01f0: 6e 20 6f 66 20 53 51 4c 69 74 65 2e 0a 2a 2a 0a  n of SQLite..**.
0200: 2a 2a 20 43 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  ** Compile-time 
0210: 6f 70 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20  options:.**.**  
0220: 2d 44 54 43 4c 53 48 3d 31 20 20 20 20 20 20 20  -DTCLSH=1       
0230: 20 20 20 20 20 20 41 64 64 20 61 20 22 6d 61 69        Add a "mai
0240: 6e 28 29 22 20 72 6f 75 74 69 6e 65 20 74 68 61  n()" routine tha
0250: 74 20 77 6f 72 6b 73 20 61 73 20 61 20 74 63 6c  t works as a tcl
0260: 73 68 2e 0a 2a 2a 0a 2a 2a 20 20 2d 44 53 51 4c  sh..**.**  -DSQL
0270: 49 54 45 5f 54 43 4c 4d 44 35 20 20 20 20 20 20  ITE_TCLMD5      
0280: 20 57 68 65 6e 20 75 73 65 64 20 69 6e 20 63 6f   When used in co
0290: 6e 6a 75 63 74 69 6f 6e 20 77 69 74 68 20 2d 44  njuction with -D
02a0: 54 43 4c 53 48 3d 31 2c 20 61 64 64 0a 2a 2a 20  TCLSH=1, add.** 
02b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
02c0: 20 20 20 20 20 20 20 66 6f 75 72 20 6e 65 77 20         four new 
02d0: 63 6f 6d 6d 61 6e 64 73 20 74 6f 20 74 68 65 20  commands to the 
02e0: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
02f0: 66 6f 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  for.**          
0300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 67 65                ge
0310: 6e 65 72 61 74 69 6e 67 20 4d 44 35 20 63 68 65  nerating MD5 che
0320: 63 6b 73 75 6d 73 3a 20 20 6d 64 35 2c 20 6d 64  cksums:  md5, md
0330: 35 66 69 6c 65 2c 0a 2a 2a 20 20 20 20 20 20 20  5file,.**       
0340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0350: 20 6d 64 35 2d 31 30 78 38 2c 20 61 6e 64 20 6d   md5-10x8, and m
0360: 64 35 66 69 6c 65 2d 31 30 78 38 2e 0a 2a 2a 0a  d5file-10x8..**.
0370: 2a 2a 20 20 2d 44 53 51 4c 49 54 45 5f 54 45 53  **  -DSQLITE_TES
0380: 54 20 20 20 20 20 20 20 20 20 57 68 65 6e 20 75  T         When u
0390: 73 65 64 20 69 6e 20 63 6f 6e 6a 75 63 74 69 6f  sed in conjuctio
03a0: 6e 20 77 69 74 68 20 2d 44 54 43 4c 53 48 3d 31  n with -DTCLSH=1
03b0: 2c 20 61 64 64 0a 2a 2a 20 20 20 20 20 20 20 20  , add.**        
03c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
03d0: 68 75 6e 64 72 65 64 73 20 6f 66 20 6e 65 77 20  hundreds of new 
03e0: 63 6f 6d 6d 61 6e 64 73 20 75 73 65 64 20 66 6f  commands used fo
03f0: 72 20 74 65 73 74 69 6e 67 0a 2a 2a 20 20 20 20  r testing.**    
0400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0410: 20 20 20 20 53 51 4c 69 74 65 2e 20 20 54 68 69      SQLite.  Thi
0420: 73 20 6f 70 74 69 6f 6e 20 69 6d 70 6c 69 65 73  s option implies
0430: 20 2d 44 53 51 4c 49 54 45 5f 54 43 4c 4d 44 35   -DSQLITE_TCLMD5
0440: 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 72  ..*/../*.** If r
0450: 65 71 75 65 73 74 65 64 2c 20 69 6e 63 6c 75 64  equested, includ
0460: 65 20 74 68 65 20 53 51 4c 69 74 65 20 63 6f 6d  e the SQLite com
0470: 70 69 6c 65 72 20 6f 70 74 69 6f 6e 73 20 66 69  piler options fi
0480: 6c 65 20 66 6f 72 20 4d 53 56 43 2e 0a 2a 2f 0a  le for MSVC..*/.
0490: 23 69 66 20 64 65 66 69 6e 65 64 28 49 4e 43 4c  #if defined(INCL
04a0: 55 44 45 5f 4d 53 56 43 5f 48 29 0a 23 20 69 6e  UDE_MSVC_H).# in
04b0: 63 6c 75 64 65 20 22 6d 73 76 63 2e 68 22 0a 23  clude "msvc.h".#
04c0: 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69 6e  endif..#if defin
04d0: 65 64 28 49 4e 43 4c 55 44 45 5f 53 51 4c 49 54  ed(INCLUDE_SQLIT
04e0: 45 5f 54 43 4c 5f 48 29 0a 23 20 69 6e 63 6c 75  E_TCL_H).# inclu
04f0: 64 65 20 22 73 71 6c 69 74 65 5f 74 63 6c 2e 68  de "sqlite_tcl.h
0500: 22 0a 23 65 6c 73 65 0a 23 20 69 6e 63 6c 75 64  ".#else.# includ
0510: 65 20 22 74 63 6c 2e 68 22 0a 23 20 69 66 6e 64  e "tcl.h".# ifnd
0520: 65 66 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49  ef SQLITE_TCLAPI
0530: 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54  .#  define SQLIT
0540: 45 5f 54 43 4c 41 50 49 0a 23 20 65 6e 64 69 66  E_TCLAPI.# endif
0550: 0a 23 65 6e 64 69 66 0a 23 69 6e 63 6c 75 64 65  .#endif.#include
0560: 20 3c 65 72 72 6e 6f 2e 68 3e 0a 0a 2f 2a 0a 2a   <errno.h>../*.*
0570: 2a 20 53 6f 6d 65 20 61 64 64 69 74 69 6f 6e 61  * Some additiona
0580: 6c 20 69 6e 63 6c 75 64 65 20 66 69 6c 65 73 20  l include files 
0590: 61 72 65 20 6e 65 65 64 65 64 20 69 66 20 74 68  are needed if th
05a0: 69 73 20 66 69 6c 65 20 69 73 20 6e 6f 74 0a 2a  is file is not.*
05b0: 2a 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68  * appended to th
05c0: 65 20 61 6d 61 6c 67 61 6d 61 74 69 6f 6e 2e 0a  e amalgamation..
05d0: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
05e0: 45 5f 41 4d 41 4c 47 41 4d 41 54 49 4f 4e 0a 23  E_AMALGAMATION.#
05f0: 20 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65   include "sqlite
0600: 33 2e 68 22 0a 23 20 69 6e 63 6c 75 64 65 20 3c  3.h".# include <
0610: 73 74 64 6c 69 62 2e 68 3e 0a 23 20 69 6e 63 6c  stdlib.h>.# incl
0620: 75 64 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a 23  ude <string.h>.#
0630: 20 69 6e 63 6c 75 64 65 20 3c 61 73 73 65 72 74   include <assert
0640: 2e 68 3e 0a 20 20 74 79 70 65 64 65 66 20 75 6e  .h>.  typedef un
0650: 73 69 67 6e 65 64 20 63 68 61 72 20 75 38 3b 0a  signed char u8;.
0660: 23 65 6e 64 69 66 0a 23 69 6e 63 6c 75 64 65 20  #endif.#include 
0670: 3c 63 74 79 70 65 2e 68 3e 0a 0a 2f 2a 20 55 73  <ctype.h>../* Us
0680: 65 64 20 74 6f 20 67 65 74 20 74 68 65 20 63 75  ed to get the cu
0690: 72 72 65 6e 74 20 70 72 6f 63 65 73 73 20 49 44  rrent process ID
06a0: 20 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64   */.#if !defined
06b0: 28 5f 57 49 4e 33 32 29 0a 23 20 69 6e 63 6c 75  (_WIN32).# inclu
06c0: 64 65 20 3c 75 6e 69 73 74 64 2e 68 3e 0a 23 20  de <unistd.h>.# 
06d0: 64 65 66 69 6e 65 20 47 45 54 50 49 44 20 67 65  define GETPID ge
06e0: 74 70 69 64 0a 23 65 6c 69 66 20 21 64 65 66 69  tpid.#elif !defi
06f0: 6e 65 64 28 5f 57 49 4e 33 32 5f 57 43 45 29 0a  ned(_WIN32_WCE).
0700: 23 20 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  # ifndef SQLITE_
0710: 41 4d 41 4c 47 41 4d 41 54 49 4f 4e 0a 23 20 20  AMALGAMATION.#  
0720: 64 65 66 69 6e 65 20 57 49 4e 33 32 5f 4c 45 41  define WIN32_LEA
0730: 4e 5f 41 4e 44 5f 4d 45 41 4e 0a 23 20 20 69 6e  N_AND_MEAN.#  in
0740: 63 6c 75 64 65 20 3c 77 69 6e 64 6f 77 73 2e 68  clude <windows.h
0750: 3e 0a 23 20 65 6e 64 69 66 0a 23 20 64 65 66 69  >.# endif.# defi
0760: 6e 65 20 47 45 54 50 49 44 20 28 69 6e 74 29 47  ne GETPID (int)G
0770: 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73  etCurrentProcess
0780: 49 64 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a  Id.#endif../*. *
0790: 20 57 69 6e 64 6f 77 73 20 6e 65 65 64 73 20 74   Windows needs t
07a0: 6f 20 6b 6e 6f 77 20 77 68 69 63 68 20 73 79 6d  o know which sym
07b0: 62 6f 6c 73 20 74 6f 20 65 78 70 6f 72 74 2e 20  bols to export. 
07c0: 20 55 6e 69 78 20 64 6f 65 73 20 6e 6f 74 2e 0a   Unix does not..
07d0: 20 2a 20 42 55 49 4c 44 5f 73 71 6c 69 74 65 20   * BUILD_sqlite 
07e0: 73 68 6f 75 6c 64 20 62 65 20 75 6e 64 65 66 69  should be undefi
07f0: 6e 65 64 20 66 6f 72 20 55 6e 69 78 2e 0a 20 2a  ned for Unix.. *
0800: 2f 0a 23 69 66 64 65 66 20 42 55 49 4c 44 5f 73  /.#ifdef BUILD_s
0810: 71 6c 69 74 65 0a 23 75 6e 64 65 66 20 54 43 4c  qlite.#undef TCL
0820: 5f 53 54 4f 52 41 47 45 5f 43 4c 41 53 53 0a 23  _STORAGE_CLASS.#
0830: 64 65 66 69 6e 65 20 54 43 4c 5f 53 54 4f 52 41  define TCL_STORA
0840: 47 45 5f 43 4c 41 53 53 20 44 4c 4c 45 58 50 4f  GE_CLASS DLLEXPO
0850: 52 54 0a 23 65 6e 64 69 66 20 2f 2a 20 42 55 49  RT.#endif /* BUI
0860: 4c 44 5f 73 71 6c 69 74 65 20 2a 2f 0a 0a 23 64  LD_sqlite */..#d
0870: 65 66 69 6e 65 20 4e 55 4d 5f 50 52 45 50 41 52  efine NUM_PREPAR
0880: 45 44 5f 53 54 4d 54 53 20 31 30 0a 23 64 65 66  ED_STMTS 10.#def
0890: 69 6e 65 20 4d 41 58 5f 50 52 45 50 41 52 45 44  ine MAX_PREPARED
08a0: 5f 53 54 4d 54 53 20 31 30 30 0a 0a 2f 2a 20 46  _STMTS 100../* F
08b0: 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69  orward declarati
08c0: 6f 6e 20 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  on */.typedef st
08d0: 72 75 63 74 20 53 71 6c 69 74 65 44 62 20 53 71  ruct SqliteDb Sq
08e0: 6c 69 74 65 44 62 3b 0a 0a 2f 2a 0a 2a 2a 20 4e  liteDb;../*.** N
08f0: 65 77 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 73  ew SQL functions
0900: 20 63 61 6e 20 62 65 20 63 72 65 61 74 65 64 20   can be created 
0910: 61 73 20 54 43 4c 20 73 63 72 69 70 74 73 2e 20  as TCL scripts. 
0920: 20 45 61 63 68 20 73 75 63 68 20 66 75 6e 63 74   Each such funct
0930: 69 6f 6e 0a 2a 2a 20 69 73 20 64 65 73 63 72 69  ion.** is descri
0940: 62 65 64 20 62 79 20 61 6e 20 69 6e 73 74 61 6e  bed by an instan
0950: 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ce of the follow
0960: 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  ing structure..*
0970: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
0980: 20 53 71 6c 46 75 6e 63 20 53 71 6c 46 75 6e 63   SqlFunc SqlFunc
0990: 3b 0a 73 74 72 75 63 74 20 53 71 6c 46 75 6e 63  ;.struct SqlFunc
09a0: 20 7b 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20   {.  Tcl_Interp 
09b0: 2a 69 6e 74 65 72 70 3b 20 20 20 2f 2a 20 54 68  *interp;   /* Th
09c0: 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 20  e TCL interpret 
09d0: 74 6f 20 65 78 65 63 75 74 65 20 74 68 65 20 66  to execute the f
09e0: 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c  unction */.  Tcl
09f0: 5f 4f 62 6a 20 2a 70 53 63 72 69 70 74 3b 20 20  _Obj *pScript;  
0a00: 20 20 20 2f 2a 20 54 68 65 20 54 63 6c 5f 4f 62     /* The Tcl_Ob
0a10: 6a 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  j representation
0a20: 20 6f 66 20 74 68 65 20 73 63 72 69 70 74 20 2a   of the script *
0a30: 2f 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44  /.  SqliteDb *pD
0a40: 62 3b 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74  b;        /* Dat
0a50: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
0a60: 20 74 68 61 74 20 6f 77 6e 73 20 74 68 69 73 20   that owns this 
0a70: 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  function */.  in
0a80: 74 20 75 73 65 45 76 61 6c 4f 62 6a 76 3b 20 20  t useEvalObjv;  
0a90: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 69      /* True if i
0aa0: 74 20 69 73 20 73 61 66 65 20 74 6f 20 75 73 65  t is safe to use
0ab0: 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 76 20 2a 2f   Tcl_EvalObjv */
0ac0: 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20  .  char *zName; 
0ad0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
0ae0: 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   of this functio
0af0: 6e 20 2a 2f 0a 20 20 53 71 6c 46 75 6e 63 20 2a  n */.  SqlFunc *
0b00: 70 4e 65 78 74 3b 20 20 20 20 20 20 20 2f 2a 20  pNext;       /* 
0b10: 4e 65 78 74 20 66 75 6e 63 74 69 6f 6e 20 6f 6e  Next function on
0b20: 20 74 68 65 20 6c 69 73 74 20 6f 66 20 74 68 65   the list of the
0b30: 6d 20 61 6c 6c 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a  m all */.};../*.
0b40: 2a 2a 20 4e 65 77 20 63 6f 6c 6c 61 74 69 6f 6e  ** New collation
0b50: 20 73 65 71 75 65 6e 63 65 73 20 66 75 6e 63 74   sequences funct
0b60: 69 6f 6e 20 63 61 6e 20 62 65 20 63 72 65 61 74  ion can be creat
0b70: 65 64 20 61 73 20 54 43 4c 20 73 63 72 69 70 74  ed as TCL script
0b80: 73 2e 20 20 45 61 63 68 20 73 75 63 68 0a 2a 2a  s.  Each such.**
0b90: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 64 65 73   function is des
0ba0: 63 72 69 62 65 64 20 62 79 20 61 6e 20 69 6e 73  cribed by an ins
0bb0: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c  tance of the fol
0bc0: 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
0bd0: 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  ..*/.typedef str
0be0: 75 63 74 20 53 71 6c 43 6f 6c 6c 61 74 65 20 53  uct SqlCollate S
0bf0: 71 6c 43 6f 6c 6c 61 74 65 3b 0a 73 74 72 75 63  qlCollate;.struc
0c00: 74 20 53 71 6c 43 6f 6c 6c 61 74 65 20 7b 0a 20  t SqlCollate {. 
0c10: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
0c20: 65 72 70 3b 20 20 20 2f 2a 20 54 68 65 20 54 43  erp;   /* The TC
0c30: 4c 20 69 6e 74 65 72 70 72 65 74 20 74 6f 20 65  L interpret to e
0c40: 78 65 63 75 74 65 20 74 68 65 20 66 75 6e 63 74  xecute the funct
0c50: 69 6f 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ion */.  char *z
0c60: 53 63 72 69 70 74 3b 20 20 20 20 20 20 20 20 2f  Script;        /
0c70: 2a 20 54 68 65 20 73 63 72 69 70 74 20 74 6f 20  * The script to 
0c80: 62 65 20 72 75 6e 20 2a 2f 0a 20 20 53 71 6c 43  be run */.  SqlC
0c90: 6f 6c 6c 61 74 65 20 2a 70 4e 65 78 74 3b 20 20  ollate *pNext;  
0ca0: 20 20 2f 2a 20 4e 65 78 74 20 66 75 6e 63 74 69    /* Next functi
0cb0: 6f 6e 20 6f 6e 20 74 68 65 20 6c 69 73 74 20 6f  on on the list o
0cc0: 66 20 74 68 65 6d 20 61 6c 6c 20 2a 2f 0a 7d 3b  f them all */.};
0cd0: 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61 72 65 64  ../*.** Prepared
0ce0: 20 73 74 61 74 65 6d 65 6e 74 73 20 61 72 65 20   statements are 
0cf0: 63 61 63 68 65 64 20 66 6f 72 20 66 61 73 74 65  cached for faste
0d00: 72 20 65 78 65 63 75 74 69 6f 6e 2e 20 20 45 61  r execution.  Ea
0d10: 63 68 20 70 72 65 70 61 72 65 64 0a 2a 2a 20 73  ch prepared.** s
0d20: 74 61 74 65 6d 65 6e 74 20 69 73 20 64 65 73 63  tatement is desc
0d30: 72 69 62 65 64 20 62 79 20 61 6e 20 69 6e 73 74  ribed by an inst
0d40: 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ance of the foll
0d50: 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e  owing structure.
0d60: 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
0d70: 63 74 20 53 71 6c 50 72 65 70 61 72 65 64 53 74  ct SqlPreparedSt
0d80: 6d 74 20 53 71 6c 50 72 65 70 61 72 65 64 53 74  mt SqlPreparedSt
0d90: 6d 74 3b 0a 73 74 72 75 63 74 20 53 71 6c 50 72  mt;.struct SqlPr
0da0: 65 70 61 72 65 64 53 74 6d 74 20 7b 0a 20 20 53  eparedStmt {.  S
0db0: 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74 20 2a  qlPreparedStmt *
0dc0: 70 4e 65 78 74 3b 20 20 2f 2a 20 4e 65 78 74 20  pNext;  /* Next 
0dd0: 69 6e 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 2a  in linked list *
0de0: 2f 0a 20 20 53 71 6c 50 72 65 70 61 72 65 64 53  /.  SqlPreparedS
0df0: 74 6d 74 20 2a 70 50 72 65 76 3b 20 20 2f 2a 20  tmt *pPrev;  /* 
0e00: 50 72 65 76 69 6f 75 73 20 6f 6e 20 74 68 65 20  Previous on the 
0e10: 6c 69 73 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65  list */.  sqlite
0e20: 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 20 20  3_stmt *pStmt;  
0e30: 20 20 20 2f 2a 20 54 68 65 20 70 72 65 70 61 72     /* The prepar
0e40: 65 64 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  ed statement */.
0e50: 20 20 69 6e 74 20 6e 53 71 6c 3b 20 20 20 20 20    int nSql;     
0e60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 63 68             /* ch
0e70: 61 72 73 20 69 6e 20 7a 53 71 6c 5b 5d 20 2a 2f  ars in zSql[] */
0e80: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
0e90: 53 71 6c 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  Sql;        /* T
0ea0: 65 78 74 20 6f 66 20 74 68 65 20 53 51 4c 20 73  ext of the SQL s
0eb0: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e  tatement */.  in
0ec0: 74 20 6e 50 61 72 6d 3b 20 20 20 20 20 20 20 20  t nParm;        
0ed0: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
0ee0: 66 20 61 70 50 61 72 6d 20 61 72 72 61 79 20 2a  f apParm array *
0ef0: 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 61 70  /.  Tcl_Obj **ap
0f00: 50 61 72 6d 3b 20 20 20 20 20 20 20 20 2f 2a 20  Parm;        /* 
0f10: 41 72 72 61 79 20 6f 66 20 72 65 66 65 72 65 6e  Array of referen
0f20: 63 65 64 20 6f 62 6a 65 63 74 20 70 6f 69 6e 74  ced object point
0f30: 65 72 73 20 2a 2f 0a 7d 3b 0a 0a 74 79 70 65 64  ers */.};..typed
0f40: 65 66 20 73 74 72 75 63 74 20 49 6e 63 72 62 6c  ef struct Incrbl
0f50: 6f 62 43 68 61 6e 6e 65 6c 20 49 6e 63 72 62 6c  obChannel Incrbl
0f60: 6f 62 43 68 61 6e 6e 65 6c 3b 0a 0a 2f 2a 0a 2a  obChannel;../*.*
0f70: 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20 69  * There is one i
0f80: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20  nstance of this 
0f90: 73 74 72 75 63 74 75 72 65 20 66 6f 72 20 65 61  structure for ea
0fa0: 63 68 20 53 51 4c 69 74 65 20 64 61 74 61 62 61  ch SQLite databa
0fb0: 73 65 0a 2a 2a 20 74 68 61 74 20 68 61 73 20 62  se.** that has b
0fc0: 65 65 6e 20 6f 70 65 6e 65 64 20 62 79 20 74 68  een opened by th
0fd0: 65 20 53 51 4c 69 74 65 20 54 43 4c 20 69 6e 74  e SQLite TCL int
0fe0: 65 72 66 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  erface..**.** If
0ff0: 20 74 68 69 73 20 6d 6f 64 75 6c 65 20 69 73 20   this module is 
1000: 62 75 69 6c 74 20 77 69 74 68 20 53 51 4c 49 54  built with SQLIT
1010: 45 5f 54 45 53 54 20 64 65 66 69 6e 65 64 20 28  E_TEST defined (
1020: 74 6f 20 63 72 65 61 74 65 20 74 68 65 20 53 51  to create the SQ
1030: 4c 69 74 65 0a 2a 2a 20 74 65 73 74 66 69 78 74  Lite.** testfixt
1040: 75 72 65 20 65 78 65 63 75 74 61 62 6c 65 29 2c  ure executable),
1050: 20 74 68 65 6e 20 69 74 20 6d 61 79 20 62 65 20   then it may be 
1060: 63 6f 6e 66 69 67 75 72 65 64 20 74 6f 20 75 73  configured to us
1070: 65 20 65 69 74 68 65 72 0a 2a 2a 20 73 71 6c 69  e either.** sqli
1080: 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 29  te3_prepare_v2()
1090: 20 6f 72 20 73 71 6c 69 74 65 33 5f 70 72 65 70   or sqlite3_prep
10a0: 61 72 65 28 29 20 74 6f 20 70 72 65 70 61 72 65  are() to prepare
10b0: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 2e   SQL statements.
10c0: 0a 2a 2a 20 49 66 20 53 71 6c 69 74 65 44 62 2e  .** If SqliteDb.
10d0: 62 4c 65 67 61 63 79 50 72 65 70 61 72 65 20 69  bLegacyPrepare i
10e0: 73 20 74 72 75 65 2c 20 73 71 6c 69 74 65 33 5f  s true, sqlite3_
10f0: 70 72 65 70 61 72 65 28 29 20 69 73 20 75 73 65  prepare() is use
1100: 64 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 53 71 6c  d..*/.struct Sql
1110: 69 74 65 44 62 20 7b 0a 20 20 73 71 6c 69 74 65  iteDb {.  sqlite
1120: 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20  3 *db;          
1130: 20 20 20 20 20 2f 2a 20 54 68 65 20 22 72 65 61       /* The "rea
1140: 6c 22 20 64 61 74 61 62 61 73 65 20 73 74 72 75  l" database stru
1150: 63 74 75 72 65 2e 20 4d 55 53 54 20 42 45 20 46  cture. MUST BE F
1160: 49 52 53 54 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e  IRST */.  Tcl_In
1170: 74 65 72 70 20 2a 69 6e 74 65 72 70 3b 20 20 20  terp *interp;   
1180: 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 74 65       /* The inte
1190: 72 70 72 65 74 65 72 20 75 73 65 64 20 66 6f 72  rpreter used for
11a0: 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 2a   this database *
11b0: 2f 0a 20 20 63 68 61 72 20 2a 7a 42 75 73 79 3b  /.  char *zBusy;
11c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11d0: 2a 20 54 68 65 20 62 75 73 79 20 63 61 6c 6c 62  * The busy callb
11e0: 61 63 6b 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 20  ack routine */. 
11f0: 20 63 68 61 72 20 2a 7a 43 6f 6d 6d 69 74 3b 20   char *zCommit; 
1200: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1210: 68 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20 63  he commit hook c
1220: 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 20  allback routine 
1230: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 54 72 61 63  */.  char *zTrac
1240: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
1250: 2f 2a 20 54 68 65 20 74 72 61 63 65 20 63 61 6c  /* The trace cal
1260: 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 20 2a 2f  lback routine */
1270: 0a 20 20 63 68 61 72 20 2a 7a 54 72 61 63 65 56  .  char *zTraceV
1280: 32 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  2;            /*
1290: 20 54 68 65 20 74 72 61 63 65 5f 76 32 20 63 61   The trace_v2 ca
12a0: 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 20 2a  llback routine *
12b0: 2f 0a 20 20 63 68 61 72 20 2a 7a 50 72 6f 66 69  /.  char *zProfi
12c0: 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  le;            /
12d0: 2a 20 54 68 65 20 70 72 6f 66 69 6c 65 20 63 61  * The profile ca
12e0: 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 20 2a  llback routine *
12f0: 2f 0a 20 20 63 68 61 72 20 2a 7a 50 72 6f 67 72  /.  char *zProgr
1300: 65 73 73 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ess;           /
1310: 2a 20 54 68 65 20 70 72 6f 67 72 65 73 73 20 63  * The progress c
1320: 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 20  allback routine 
1330: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 41 75 74 68  */.  char *zAuth
1340: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1350: 2f 2a 20 54 68 65 20 61 75 74 68 6f 72 69 7a 61  /* The authoriza
1360: 74 69 6f 6e 20 63 61 6c 6c 62 61 63 6b 20 72 6f  tion callback ro
1370: 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 64  utine */.  int d
1380: 69 73 61 62 6c 65 41 75 74 68 3b 20 20 20 20 20  isableAuth;     
1390: 20 20 20 20 20 20 2f 2a 20 44 69 73 61 62 6c 65        /* Disable
13a0: 20 74 68 65 20 61 75 74 68 6f 72 69 7a 65 72 20   the authorizer 
13b0: 69 66 20 69 74 20 65 78 69 73 74 73 20 2a 2f 0a  if it exists */.
13c0: 20 20 63 68 61 72 20 2a 7a 4e 75 6c 6c 3b 20 20    char *zNull;  
13d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13e0: 54 65 78 74 20 74 6f 20 73 75 62 73 74 69 74 75  Text to substitu
13f0: 74 65 20 66 6f 72 20 61 6e 20 53 51 4c 20 4e 55  te for an SQL NU
1400: 4c 4c 20 76 61 6c 75 65 20 2a 2f 0a 20 20 53 71  LL value */.  Sq
1410: 6c 46 75 6e 63 20 2a 70 46 75 6e 63 3b 20 20 20  lFunc *pFunc;   
1420: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74           /* List
1430: 20 6f 66 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e   of SQL function
1440: 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  s */.  Tcl_Obj *
1450: 70 55 70 64 61 74 65 48 6f 6f 6b 3b 20 20 20 20  pUpdateHook;    
1460: 20 20 2f 2a 20 55 70 64 61 74 65 20 68 6f 6f 6b    /* Update hook
1470: 20 73 63 72 69 70 74 20 28 69 66 20 61 6e 79 29   script (if any)
1480: 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70   */.  Tcl_Obj *p
1490: 50 72 65 55 70 64 61 74 65 48 6f 6f 6b 3b 20 20  PreUpdateHook;  
14a0: 20 2f 2a 20 50 72 65 2d 75 70 64 61 74 65 20 68   /* Pre-update h
14b0: 6f 6f 6b 20 73 63 72 69 70 74 20 28 69 66 20 61  ook script (if a
14c0: 6e 79 29 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a  ny) */.  Tcl_Obj
14d0: 20 2a 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 3b   *pRollbackHook;
14e0: 20 20 20 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20      /* Rollback 
14f0: 68 6f 6f 6b 20 73 63 72 69 70 74 20 28 69 66 20  hook script (if 
1500: 61 6e 79 29 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62  any) */.  Tcl_Ob
1510: 6a 20 2a 70 57 61 6c 48 6f 6f 6b 3b 20 20 20 20  j *pWalHook;    
1520: 20 20 20 20 20 2f 2a 20 57 41 4c 20 68 6f 6f 6b       /* WAL hook
1530: 20 73 63 72 69 70 74 20 28 69 66 20 61 6e 79 29   script (if any)
1540: 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70   */.  Tcl_Obj *p
1550: 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 3b 20 20 20  UnlockNotify;   
1560: 20 2f 2a 20 55 6e 6c 6f 63 6b 20 6e 6f 74 69 66   /* Unlock notif
1570: 79 20 73 63 72 69 70 74 20 28 69 66 20 61 6e 79  y script (if any
1580: 29 20 2a 2f 0a 20 20 53 71 6c 43 6f 6c 6c 61 74  ) */.  SqlCollat
1590: 65 20 2a 70 43 6f 6c 6c 61 74 65 3b 20 20 20 20  e *pCollate;    
15a0: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 53 51 4c    /* List of SQL
15b0: 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e 63 74   collation funct
15c0: 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ions */.  int rc
15d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
15e0: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
15f0: 6f 64 65 20 6f 66 20 6d 6f 73 74 20 72 65 63 65  ode of most rece
1600: 6e 74 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28  nt sqlite3_exec(
1610: 29 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  ) */.  Tcl_Obj *
1620: 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64 3b 20  pCollateNeeded; 
1630: 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6f 6e 20 6e    /* Collation n
1640: 65 65 64 65 64 20 73 63 72 69 70 74 20 2a 2f 0a  eeded script */.
1650: 20 20 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d    SqlPreparedStm
1660: 74 20 2a 73 74 6d 74 4c 69 73 74 3b 20 2f 2a 20  t *stmtList; /* 
1670: 4c 69 73 74 20 6f 66 20 70 72 65 70 61 72 65 64  List of prepared
1680: 20 73 74 61 74 65 6d 65 6e 74 73 2a 2f 0a 20 20   statements*/.  
1690: 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74 20  SqlPreparedStmt 
16a0: 2a 73 74 6d 74 4c 61 73 74 3b 20 2f 2a 20 4c 61  *stmtLast; /* La
16b0: 73 74 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20  st statement in 
16c0: 74 68 65 20 6c 69 73 74 20 2a 2f 0a 20 20 69 6e  the list */.  in
16d0: 74 20 6d 61 78 53 74 6d 74 3b 20 20 20 20 20 20  t maxStmt;      
16e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
16f0: 6e 65 78 74 20 6d 61 78 69 6d 75 6d 20 6e 75 6d  next maximum num
1700: 62 65 72 20 6f 66 20 73 74 6d 74 4c 69 73 74 20  ber of stmtList 
1710: 2a 2f 0a 20 20 69 6e 74 20 6e 53 74 6d 74 3b 20  */.  int nStmt; 
1720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1730: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 74 61  /* Number of sta
1740: 74 65 6d 65 6e 74 73 20 69 6e 20 73 74 6d 74 4c  tements in stmtL
1750: 69 73 74 20 2a 2f 0a 20 20 49 6e 63 72 62 6c 6f  ist */.  Incrblo
1760: 62 43 68 61 6e 6e 65 6c 20 2a 70 49 6e 63 72 62  bChannel *pIncrb
1770: 6c 6f 62 3b 2f 2a 20 4c 69 6e 6b 65 64 20 6c 69  lob;/* Linked li
1780: 73 74 20 6f 66 20 6f 70 65 6e 20 69 6e 63 72 62  st of open incrb
1790: 6c 6f 62 20 63 68 61 6e 6e 65 6c 73 20 2a 2f 0a  lob channels */.
17a0: 20 20 69 6e 74 20 6e 53 74 65 70 2c 20 6e 53 6f    int nStep, nSo
17b0: 72 74 2c 20 6e 49 6e 64 65 78 3b 20 20 2f 2a 20  rt, nIndex;  /* 
17c0: 53 74 61 74 69 73 74 69 63 73 20 66 6f 72 20 6d  Statistics for m
17d0: 6f 73 74 20 72 65 63 65 6e 74 20 6f 70 65 72 61  ost recent opera
17e0: 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 56  tion */.  int nV
17f0: 4d 53 74 65 70 3b 20 20 20 20 20 20 20 20 20 20  MStep;          
1800: 20 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20       /* Another 
1810: 73 74 61 74 69 73 74 69 63 20 66 6f 72 20 6d 6f  statistic for mo
1820: 73 74 20 72 65 63 65 6e 74 20 6f 70 65 72 61 74  st recent operat
1830: 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 72  ion */.  int nTr
1840: 61 6e 73 61 63 74 69 6f 6e 3b 20 20 20 20 20 20  ansaction;      
1850: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1860: 20 6e 65 73 74 65 64 20 5b 74 72 61 6e 73 61 63   nested [transac
1870: 74 69 6f 6e 5d 20 6d 65 74 68 6f 64 73 20 2a 2f  tion] methods */
1880: 0a 20 20 69 6e 74 20 6f 70 65 6e 46 6c 61 67 73  .  int openFlags
1890: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
18a0: 20 46 6c 61 67 73 20 75 73 65 64 20 74 6f 20 6f   Flags used to o
18b0: 70 65 6e 2e 20 20 28 53 51 4c 49 54 45 5f 4f 50  pen.  (SQLITE_OP
18c0: 45 4e 5f 55 52 49 29 20 2a 2f 0a 23 69 66 64 65  EN_URI) */.#ifde
18d0: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
18e0: 69 6e 74 20 62 4c 65 67 61 63 79 50 72 65 70 61  int bLegacyPrepa
18f0: 72 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72  re;        /* Tr
1900: 75 65 20 74 6f 20 75 73 65 20 73 71 6c 69 74 65  ue to use sqlite
1910: 33 5f 70 72 65 70 61 72 65 28 29 20 2a 2f 0a 23  3_prepare() */.#
1920: 65 6e 64 69 66 0a 7d 3b 0a 0a 73 74 72 75 63 74  endif.};..struct
1930: 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c   IncrblobChannel
1940: 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f   {.  sqlite3_blo
1950: 62 20 2a 70 42 6c 6f 62 3b 20 20 20 20 20 20 2f  b *pBlob;      /
1960: 2a 20 73 71 6c 69 74 65 33 20 62 6c 6f 62 20 68  * sqlite3 blob h
1970: 61 6e 64 6c 65 20 2a 2f 0a 20 20 53 71 6c 69 74  andle */.  Sqlit
1980: 65 44 62 20 2a 70 44 62 3b 20 20 20 20 20 20 20  eDb *pDb;       
1990: 20 20 20 20 20 2f 2a 20 41 73 73 6f 63 69 61 74       /* Associat
19a0: 65 64 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  ed database conn
19b0: 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ection */.  int 
19c0: 69 53 65 65 6b 3b 20 20 20 20 20 20 20 20 20 20  iSeek;          
19d0: 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
19e0: 20 73 65 65 6b 20 6f 66 66 73 65 74 20 2a 2f 0a   seek offset */.
19f0: 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68    Tcl_Channel ch
1a00: 61 6e 6e 65 6c 3b 20 20 20 20 20 20 2f 2a 20 43  annel;      /* C
1a10: 68 61 6e 6e 65 6c 20 69 64 65 6e 74 69 66 69 65  hannel identifie
1a20: 72 20 2a 2f 0a 20 20 49 6e 63 72 62 6c 6f 62 43  r */.  IncrblobC
1a30: 68 61 6e 6e 65 6c 20 2a 70 4e 65 78 74 3b 20 20  hannel *pNext;  
1a40: 20 2f 2a 20 4c 69 6e 6b 65 64 20 6c 69 73 74 20   /* Linked list 
1a50: 6f 66 20 61 6c 6c 20 6f 70 65 6e 20 69 6e 63 72  of all open incr
1a60: 62 6c 6f 62 20 63 68 61 6e 6e 65 6c 73 20 2a 2f  blob channels */
1a70: 0a 20 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e  .  IncrblobChann
1a80: 65 6c 20 2a 70 50 72 65 76 3b 20 20 20 2f 2a 20  el *pPrev;   /* 
1a90: 4c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 61  Linked list of a
1aa0: 6c 6c 20 6f 70 65 6e 20 69 6e 63 72 62 6c 6f 62  ll open incrblob
1ab0: 20 63 68 61 6e 6e 65 6c 73 20 2a 2f 0a 7d 3b 0a   channels */.};.
1ac0: 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61  ./*.** Compute a
1ad0: 20 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 74   string length t
1ae0: 68 61 74 20 69 73 20 6c 69 6d 69 74 65 64 20 74  hat is limited t
1af0: 6f 20 77 68 61 74 20 63 61 6e 20 62 65 20 73 74  o what can be st
1b00: 6f 72 65 64 20 69 6e 0a 2a 2a 20 6c 6f 77 65 72  ored in.** lower
1b10: 20 33 30 20 62 69 74 73 20 6f 66 20 61 20 33 32   30 bits of a 32
1b20: 2d 62 69 74 20 73 69 67 6e 65 64 20 69 6e 74 65  -bit signed inte
1b30: 67 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ger..*/.static i
1b40: 6e 74 20 73 74 72 6c 65 6e 33 30 28 63 6f 6e 73  nt strlen30(cons
1b50: 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 63 6f  t char *z){.  co
1b60: 6e 73 74 20 63 68 61 72 20 2a 7a 32 20 3d 20 7a  nst char *z2 = z
1b70: 3b 0a 20 20 77 68 69 6c 65 28 20 2a 7a 32 20 29  ;.  while( *z2 )
1b80: 7b 20 7a 32 2b 2b 3b 20 7d 0a 20 20 72 65 74 75  { z2++; }.  retu
1b90: 72 6e 20 30 78 33 66 66 66 66 66 66 66 20 26 20  rn 0x3fffffff & 
1ba0: 28 69 6e 74 29 28 7a 32 20 2d 20 7a 29 3b 0a 7d  (int)(z2 - z);.}
1bb0: 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ...#ifndef SQLIT
1bc0: 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a  E_OMIT_INCRBLOB.
1bd0: 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20  /*.** Close all 
1be0: 69 6e 63 72 62 6c 6f 62 20 63 68 61 6e 6e 65 6c  incrblob channel
1bf0: 73 20 6f 70 65 6e 65 64 20 75 73 69 6e 67 20 64  s opened using d
1c00: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
1c10: 6f 6e 20 70 44 62 2e 0a 2a 2a 20 54 68 69 73 20  on pDb..** This 
1c20: 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 73  is called when s
1c30: 68 75 74 74 69 6e 67 20 64 6f 77 6e 20 74 68 65  hutting down the
1c40: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
1c50: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
1c60: 76 6f 69 64 20 63 6c 6f 73 65 49 6e 63 72 62 6c  void closeIncrbl
1c70: 6f 62 43 68 61 6e 6e 65 6c 73 28 53 71 6c 69 74  obChannels(Sqlit
1c80: 65 44 62 20 2a 70 44 62 29 7b 0a 20 20 49 6e 63  eDb *pDb){.  Inc
1c90: 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 70 3b  rblobChannel *p;
1ca0: 0a 20 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e  .  IncrblobChann
1cb0: 65 6c 20 2a 70 4e 65 78 74 3b 0a 0a 20 20 66 6f  el *pNext;..  fo
1cc0: 72 28 70 3d 70 44 62 2d 3e 70 49 6e 63 72 62 6c  r(p=pDb->pIncrbl
1cd0: 6f 62 3b 20 70 3b 20 70 3d 70 4e 65 78 74 29 7b  ob; p; p=pNext){
1ce0: 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 2d 3e  .    pNext = p->
1cf0: 70 4e 65 78 74 3b 0a 0a 20 20 20 20 2f 2a 20 4e  pNext;..    /* N
1d00: 6f 74 65 3a 20 43 61 6c 6c 69 6e 67 20 75 6e 72  ote: Calling unr
1d10: 65 67 69 73 74 65 72 20 68 65 72 65 20 63 61 6c  egister here cal
1d20: 6c 20 54 63 6c 5f 43 6c 6f 73 65 20 6f 6e 20 74  l Tcl_Close on t
1d30: 68 65 20 69 6e 63 72 62 6c 6f 62 20 63 68 61 6e  he incrblob chan
1d40: 6e 65 6c 2c 0a 20 20 20 20 2a 2a 20 77 68 69 63  nel,.    ** whic
1d50: 68 20 64 65 6c 65 74 65 73 20 74 68 65 20 49 6e  h deletes the In
1d60: 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 73 74  crblobChannel st
1d70: 72 75 63 74 75 72 65 20 61 74 20 2a 70 2e 20 53  ructure at *p. S
1d80: 6f 20 64 6f 20 6e 6f 74 0a 20 20 20 20 2a 2a 20  o do not.    ** 
1d90: 63 61 6c 6c 20 54 63 6c 5f 46 72 65 65 28 29 20  call Tcl_Free() 
1da0: 68 65 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  here..    */.   
1db0: 20 54 63 6c 5f 55 6e 72 65 67 69 73 74 65 72 43   Tcl_UnregisterC
1dc0: 68 61 6e 6e 65 6c 28 70 44 62 2d 3e 69 6e 74 65  hannel(pDb->inte
1dd0: 72 70 2c 20 70 2d 3e 63 68 61 6e 6e 65 6c 29 3b  rp, p->channel);
1de0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  .  }.}../*.** Cl
1df0: 6f 73 65 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74  ose an increment
1e00: 61 6c 20 62 6c 6f 62 20 63 68 61 6e 6e 65 6c 2e  al blob channel.
1e10: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53  .*/.static int S
1e20: 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 69 6e 63  QLITE_TCLAPI inc
1e30: 72 62 6c 6f 62 43 6c 6f 73 65 28 0a 20 20 43 6c  rblobClose(.  Cl
1e40: 69 65 6e 74 44 61 74 61 20 69 6e 73 74 61 6e 63  ientData instanc
1e50: 65 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  eData,.  Tcl_Int
1e60: 65 72 70 20 2a 69 6e 74 65 72 70 0a 29 7b 0a 20  erp *interp.){. 
1e70: 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c   IncrblobChannel
1e80: 20 2a 70 20 3d 20 28 49 6e 63 72 62 6c 6f 62 43   *p = (IncrblobC
1e90: 68 61 6e 6e 65 6c 20 2a 29 69 6e 73 74 61 6e 63  hannel *)instanc
1ea0: 65 44 61 74 61 3b 0a 20 20 69 6e 74 20 72 63 20  eData;.  int rc 
1eb0: 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 63  = sqlite3_blob_c
1ec0: 6c 6f 73 65 28 70 2d 3e 70 42 6c 6f 62 29 3b 0a  lose(p->pBlob);.
1ed0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
1ee0: 70 2d 3e 70 44 62 2d 3e 64 62 3b 0a 0a 20 20 2f  p->pDb->db;..  /
1ef0: 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 63 68 61  * Remove the cha
1f00: 6e 6e 65 6c 20 66 72 6f 6d 20 74 68 65 20 53 71  nnel from the Sq
1f10: 6c 69 74 65 44 62 2e 70 49 6e 63 72 62 6c 6f 62  liteDb.pIncrblob
1f20: 20 6c 69 73 74 2e 20 2a 2f 0a 20 20 69 66 28 20   list. */.  if( 
1f30: 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20  p->pNext ){.    
1f40: 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20  p->pNext->pPrev 
1f50: 3d 20 70 2d 3e 70 50 72 65 76 3b 0a 20 20 7d 0a  = p->pPrev;.  }.
1f60: 20 20 69 66 28 20 70 2d 3e 70 50 72 65 76 20 29    if( p->pPrev )
1f70: 7b 0a 20 20 20 20 70 2d 3e 70 50 72 65 76 2d 3e  {.    p->pPrev->
1f80: 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74  pNext = p->pNext
1f90: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70  ;.  }.  if( p->p
1fa0: 44 62 2d 3e 70 49 6e 63 72 62 6c 6f 62 3d 3d 70  Db->pIncrblob==p
1fb0: 20 29 7b 0a 20 20 20 20 70 2d 3e 70 44 62 2d 3e   ){.    p->pDb->
1fc0: 70 49 6e 63 72 62 6c 6f 62 20 3d 20 70 2d 3e 70  pIncrblob = p->p
1fd0: 4e 65 78 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  Next;.  }..  /* 
1fe0: 46 72 65 65 20 74 68 65 20 49 6e 63 72 62 6c 6f  Free the Incrblo
1ff0: 62 43 68 61 6e 6e 65 6c 20 73 74 72 75 63 74 75  bChannel structu
2000: 72 65 20 2a 2f 0a 20 20 54 63 6c 5f 46 72 65 65  re */.  Tcl_Free
2010: 28 28 63 68 61 72 20 2a 29 70 29 3b 0a 0a 20 20  ((char *)p);..  
2020: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2030: 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74  K ){.    Tcl_Set
2040: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28  Result(interp, (
2050: 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 65  char *)sqlite3_e
2060: 72 72 6d 73 67 28 64 62 29 2c 20 54 43 4c 5f 56  rrmsg(db), TCL_V
2070: 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 20 20 72 65  OLATILE);.    re
2080: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
2090: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c    }.  return TCL
20a0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  _OK;.}../*.** Re
20b0: 61 64 20 64 61 74 61 20 66 72 6f 6d 20 61 6e 20  ad data from an 
20c0: 69 6e 63 72 65 6d 65 6e 74 61 6c 20 62 6c 6f 62  incremental blob
20d0: 20 63 68 61 6e 6e 65 6c 2e 0a 2a 2f 0a 73 74 61   channel..*/.sta
20e0: 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54  tic int SQLITE_T
20f0: 43 4c 41 50 49 20 69 6e 63 72 62 6c 6f 62 49 6e  CLAPI incrblobIn
2100: 70 75 74 28 0a 20 20 43 6c 69 65 6e 74 44 61 74  put(.  ClientDat
2110: 61 20 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 0a  a instanceData,.
2120: 20 20 63 68 61 72 20 2a 62 75 66 2c 0a 20 20 69    char *buf,.  i
2130: 6e 74 20 62 75 66 53 69 7a 65 2c 0a 20 20 69 6e  nt bufSize,.  in
2140: 74 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 0a  t *errorCodePtr.
2150: 29 7b 0a 20 20 49 6e 63 72 62 6c 6f 62 43 68 61  ){.  IncrblobCha
2160: 6e 6e 65 6c 20 2a 70 20 3d 20 28 49 6e 63 72 62  nnel *p = (Incrb
2170: 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 29 69 6e 73  lobChannel *)ins
2180: 74 61 6e 63 65 44 61 74 61 3b 0a 20 20 69 6e 74  tanceData;.  int
2190: 20 6e 52 65 61 64 20 3d 20 62 75 66 53 69 7a 65   nRead = bufSize
21a0: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  ;         /* Num
21b0: 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20  ber of bytes to 
21c0: 72 65 61 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 42  read */.  int nB
21d0: 6c 6f 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  lob;            
21e0: 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20         /* Total 
21f0: 73 69 7a 65 20 6f 66 20 74 68 65 20 62 6c 6f 62  size of the blob
2200: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
2210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2220: 20 20 20 2f 2a 20 73 71 6c 69 74 65 20 65 72 72     /* sqlite err
2230: 6f 72 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 6e 42  or code */..  nB
2240: 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c  lob = sqlite3_bl
2250: 6f 62 5f 62 79 74 65 73 28 70 2d 3e 70 42 6c 6f  ob_bytes(p->pBlo
2260: 62 29 3b 0a 20 20 69 66 28 20 28 70 2d 3e 69 53  b);.  if( (p->iS
2270: 65 65 6b 2b 6e 52 65 61 64 29 3e 6e 42 6c 6f 62  eek+nRead)>nBlob
2280: 20 29 7b 0a 20 20 20 20 6e 52 65 61 64 20 3d 20   ){.    nRead = 
2290: 6e 42 6c 6f 62 2d 70 2d 3e 69 53 65 65 6b 3b 0a  nBlob-p->iSeek;.
22a0: 20 20 7d 0a 20 20 69 66 28 20 6e 52 65 61 64 3c    }.  if( nRead<
22b0: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
22c0: 20 30 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20   0;.  }..  rc = 
22d0: 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 72 65 61  sqlite3_blob_rea
22e0: 64 28 70 2d 3e 70 42 6c 6f 62 2c 20 28 76 6f 69  d(p->pBlob, (voi
22f0: 64 20 2a 29 62 75 66 2c 20 6e 52 65 61 64 2c 20  d *)buf, nRead, 
2300: 70 2d 3e 69 53 65 65 6b 29 3b 0a 20 20 69 66 28  p->iSeek);.  if(
2310: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2320: 7b 0a 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65  {.    *errorCode
2330: 50 74 72 20 3d 20 72 63 3b 0a 20 20 20 20 72 65  Ptr = rc;.    re
2340: 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20  turn -1;.  }..  
2350: 70 2d 3e 69 53 65 65 6b 20 2b 3d 20 6e 52 65 61  p->iSeek += nRea
2360: 64 3b 0a 20 20 72 65 74 75 72 6e 20 6e 52 65 61  d;.  return nRea
2370: 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  d;.}../*.** Writ
2380: 65 20 64 61 74 61 20 74 6f 20 61 6e 20 69 6e 63  e data to an inc
2390: 72 65 6d 65 6e 74 61 6c 20 62 6c 6f 62 20 63 68  remental blob ch
23a0: 61 6e 6e 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63  annel..*/.static
23b0: 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41   int SQLITE_TCLA
23c0: 50 49 20 69 6e 63 72 62 6c 6f 62 4f 75 74 70 75  PI incrblobOutpu
23d0: 74 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20  t(.  ClientData 
23e0: 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 0a 20 20  instanceData,.  
23f0: 43 4f 4e 53 54 20 63 68 61 72 20 2a 62 75 66 2c  CONST char *buf,
2400: 0a 20 20 69 6e 74 20 74 6f 57 72 69 74 65 2c 0a  .  int toWrite,.
2410: 20 20 69 6e 74 20 2a 65 72 72 6f 72 43 6f 64 65    int *errorCode
2420: 50 74 72 0a 29 7b 0a 20 20 49 6e 63 72 62 6c 6f  Ptr.){.  Incrblo
2430: 62 43 68 61 6e 6e 65 6c 20 2a 70 20 3d 20 28 49  bChannel *p = (I
2440: 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a  ncrblobChannel *
2450: 29 69 6e 73 74 61 6e 63 65 44 61 74 61 3b 0a 20  )instanceData;. 
2460: 20 69 6e 74 20 6e 57 72 69 74 65 20 3d 20 74 6f   int nWrite = to
2470: 57 72 69 74 65 3b 20 20 20 20 20 20 20 20 2f 2a  Write;        /*
2480: 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
2490: 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a 20 20 69   to write */.  i
24a0: 6e 74 20 6e 42 6c 6f 62 3b 20 20 20 20 20 20 20  nt nBlob;       
24b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
24c0: 6f 74 61 6c 20 73 69 7a 65 20 6f 66 20 74 68 65  otal size of the
24d0: 20 62 6c 6f 62 20 2a 2f 0a 20 20 69 6e 74 20 72   blob */.  int r
24e0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
24f0: 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74          /* sqlit
2500: 65 20 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a  e error code */.
2510: 0a 20 20 6e 42 6c 6f 62 20 3d 20 73 71 6c 69 74  .  nBlob = sqlit
2520: 65 33 5f 62 6c 6f 62 5f 62 79 74 65 73 28 70 2d  e3_blob_bytes(p-
2530: 3e 70 42 6c 6f 62 29 3b 0a 20 20 69 66 28 20 28  >pBlob);.  if( (
2540: 70 2d 3e 69 53 65 65 6b 2b 6e 57 72 69 74 65 29  p->iSeek+nWrite)
2550: 3e 6e 42 6c 6f 62 20 29 7b 0a 20 20 20 20 2a 65  >nBlob ){.    *e
2560: 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 49  rrorCodePtr = EI
2570: 4e 56 41 4c 3b 0a 20 20 20 20 72 65 74 75 72 6e  NVAL;.    return
2580: 20 2d 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e   -1;.  }.  if( n
2590: 57 72 69 74 65 3c 3d 30 20 29 7b 0a 20 20 20 20  Write<=0 ){.    
25a0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20  return 0;.  }.. 
25b0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c   rc = sqlite3_bl
25c0: 6f 62 5f 77 72 69 74 65 28 70 2d 3e 70 42 6c 6f  ob_write(p->pBlo
25d0: 62 2c 20 28 76 6f 69 64 20 2a 29 62 75 66 2c 20  b, (void *)buf, 
25e0: 6e 57 72 69 74 65 2c 20 70 2d 3e 69 53 65 65 6b  nWrite, p->iSeek
25f0: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
2600: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 65  ITE_OK ){.    *e
2610: 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 49  rrorCodePtr = EI
2620: 4f 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 2d 31  O;.    return -1
2630: 3b 0a 20 20 7d 0a 0a 20 20 70 2d 3e 69 53 65 65  ;.  }..  p->iSee
2640: 6b 20 2b 3d 20 6e 57 72 69 74 65 3b 0a 20 20 72  k += nWrite;.  r
2650: 65 74 75 72 6e 20 6e 57 72 69 74 65 3b 0a 7d 0a  eturn nWrite;.}.
2660: 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20 61 6e 20 69  ./*.** Seek an i
2670: 6e 63 72 65 6d 65 6e 74 61 6c 20 62 6c 6f 62 20  ncremental blob 
2680: 63 68 61 6e 6e 65 6c 2e 0a 2a 2f 0a 73 74 61 74  channel..*/.stat
2690: 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43  ic int SQLITE_TC
26a0: 4c 41 50 49 20 69 6e 63 72 62 6c 6f 62 53 65 65  LAPI incrblobSee
26b0: 6b 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20  k(.  ClientData 
26c0: 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 0a 20 20  instanceData,.  
26d0: 6c 6f 6e 67 20 6f 66 66 73 65 74 2c 0a 20 20 69  long offset,.  i
26e0: 6e 74 20 73 65 65 6b 4d 6f 64 65 2c 0a 20 20 69  nt seekMode,.  i
26f0: 6e 74 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72  nt *errorCodePtr
2700: 0a 29 7b 0a 20 20 49 6e 63 72 62 6c 6f 62 43 68  .){.  IncrblobCh
2710: 61 6e 6e 65 6c 20 2a 70 20 3d 20 28 49 6e 63 72  annel *p = (Incr
2720: 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 29 69 6e  blobChannel *)in
2730: 73 74 61 6e 63 65 44 61 74 61 3b 0a 0a 20 20 73  stanceData;..  s
2740: 77 69 74 63 68 28 20 73 65 65 6b 4d 6f 64 65 20  witch( seekMode 
2750: 29 7b 0a 20 20 20 20 63 61 73 65 20 53 45 45 4b  ){.    case SEEK
2760: 5f 53 45 54 3a 0a 20 20 20 20 20 20 70 2d 3e 69  _SET:.      p->i
2770: 53 65 65 6b 20 3d 20 6f 66 66 73 65 74 3b 0a 20  Seek = offset;. 
2780: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2790: 63 61 73 65 20 53 45 45 4b 5f 43 55 52 3a 0a 20  case SEEK_CUR:. 
27a0: 20 20 20 20 20 70 2d 3e 69 53 65 65 6b 20 2b 3d       p->iSeek +=
27b0: 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 62   offset;.      b
27c0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
27d0: 45 45 4b 5f 45 4e 44 3a 0a 20 20 20 20 20 20 70  EEK_END:.      p
27e0: 2d 3e 69 53 65 65 6b 20 3d 20 73 71 6c 69 74 65  ->iSeek = sqlite
27f0: 33 5f 62 6c 6f 62 5f 62 79 74 65 73 28 70 2d 3e  3_blob_bytes(p->
2800: 70 42 6c 6f 62 29 20 2b 20 6f 66 66 73 65 74 3b  pBlob) + offset;
2810: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20  .      break;.. 
2820: 20 20 20 64 65 66 61 75 6c 74 3a 20 61 73 73 65     default: asse
2830: 72 74 28 21 22 42 61 64 20 73 65 65 6b 4d 6f 64  rt(!"Bad seekMod
2840: 65 22 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  e");.  }..  retu
2850: 72 6e 20 70 2d 3e 69 53 65 65 6b 3b 0a 7d 0a 0a  rn p->iSeek;.}..
2860: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 53 51 4c  .static void SQL
2870: 49 54 45 5f 54 43 4c 41 50 49 20 69 6e 63 72 62  ITE_TCLAPI incrb
2880: 6c 6f 62 57 61 74 63 68 28 0a 20 20 43 6c 69 65  lobWatch(.  Clie
2890: 6e 74 44 61 74 61 20 69 6e 73 74 61 6e 63 65 44  ntData instanceD
28a0: 61 74 61 2c 0a 20 20 69 6e 74 20 6d 6f 64 65 0a  ata,.  int mode.
28b0: 29 7b 0a 20 20 2f 2a 20 4e 4f 2d 4f 50 20 2a 2f  ){.  /* NO-OP */
28c0: 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  .}.static int SQ
28d0: 4c 49 54 45 5f 54 43 4c 41 50 49 20 69 6e 63 72  LITE_TCLAPI incr
28e0: 62 6c 6f 62 48 61 6e 64 6c 65 28 0a 20 20 43 6c  blobHandle(.  Cl
28f0: 69 65 6e 74 44 61 74 61 20 69 6e 73 74 61 6e 63  ientData instanc
2900: 65 44 61 74 61 2c 0a 20 20 69 6e 74 20 64 69 72  eData,.  int dir
2910: 2c 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 2a  ,.  ClientData *
2920: 68 50 74 72 0a 29 7b 0a 20 20 72 65 74 75 72 6e  hPtr.){.  return
2930: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 73   TCL_ERROR;.}..s
2940: 74 61 74 69 63 20 54 63 6c 5f 43 68 61 6e 6e 65  tatic Tcl_Channe
2950: 6c 54 79 70 65 20 49 6e 63 72 62 6c 6f 62 43 68  lType IncrblobCh
2960: 61 6e 6e 65 6c 54 79 70 65 20 3d 20 7b 0a 20 20  annelType = {.  
2970: 22 69 6e 63 72 62 6c 6f 62 22 2c 20 20 20 20 20  "incrblob",     
2980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2990: 20 20 20 2f 2a 20 74 79 70 65 4e 61 6d 65 20 20     /* typeName  
29a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29b0: 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20             */.  
29c0: 54 43 4c 5f 43 48 41 4e 4e 45 4c 5f 56 45 52 53  TCL_CHANNEL_VERS
29d0: 49 4f 4e 5f 32 2c 20 20 20 20 20 20 20 20 20 20  ION_2,          
29e0: 20 20 20 2f 2a 20 76 65 72 73 69 6f 6e 20 20 20     /* version   
29f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a00: 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20             */.  
2a10: 69 6e 63 72 62 6c 6f 62 43 6c 6f 73 65 2c 20 20  incrblobClose,  
2a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a30: 20 20 20 2f 2a 20 63 6c 6f 73 65 50 72 6f 63 20     /* closeProc 
2a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a50: 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20             */.  
2a60: 69 6e 63 72 62 6c 6f 62 49 6e 70 75 74 2c 20 20  incrblobInput,  
2a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a80: 20 20 20 2f 2a 20 69 6e 70 75 74 50 72 6f 63 20     /* inputProc 
2a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aa0: 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20             */.  
2ab0: 69 6e 63 72 62 6c 6f 62 4f 75 74 70 75 74 2c 20  incrblobOutput, 
2ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ad0: 20 20 20 2f 2a 20 6f 75 74 70 75 74 50 72 6f 63     /* outputProc
2ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2af0: 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20             */.  
2b00: 69 6e 63 72 62 6c 6f 62 53 65 65 6b 2c 20 20 20  incrblobSeek,   
2b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b20: 20 20 20 2f 2a 20 73 65 65 6b 50 72 6f 63 20 20     /* seekProc  
2b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b40: 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20             */.  
2b50: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
2b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b70: 20 20 20 2f 2a 20 73 65 74 4f 70 74 69 6f 6e 50     /* setOptionP
2b80: 72 6f 63 20 20 20 20 20 20 20 20 20 20 20 20 20  roc             
2b90: 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20             */.  
2ba0: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
2bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bc0: 20 20 20 2f 2a 20 67 65 74 4f 70 74 69 6f 6e 50     /* getOptionP
2bd0: 72 6f 63 20 20 20 20 20 20 20 20 20 20 20 20 20  roc             
2be0: 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20             */.  
2bf0: 69 6e 63 72 62 6c 6f 62 57 61 74 63 68 2c 20 20  incrblobWatch,  
2c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c10: 20 20 20 2f 2a 20 77 61 74 63 68 50 72 6f 63 20     /* watchProc 
2c20: 28 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70  (this is a no-op
2c30: 29 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  )          */.  
2c40: 69 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 2c 20  incrblobHandle, 
2c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c60: 20 20 20 2f 2a 20 67 65 74 48 61 6e 64 6c 65 50     /* getHandleP
2c70: 72 6f 63 20 28 61 6c 77 61 79 73 20 72 65 74 75  roc (always retu
2c80: 72 6e 73 20 65 72 72 6f 72 29 20 2a 2f 0a 20 20  rns error) */.  
2c90: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
2ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cb0: 20 20 20 2f 2a 20 63 6c 6f 73 65 32 50 72 6f 63     /* close2Proc
2cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cd0: 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20             */.  
2ce0: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
2cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d00: 20 20 20 2f 2a 20 62 6c 6f 63 6b 4d 6f 64 65 50     /* blockModeP
2d10: 72 6f 63 20 20 20 20 20 20 20 20 20 20 20 20 20  roc             
2d20: 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20             */.  
2d30: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
2d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d50: 20 20 20 2f 2a 20 66 6c 75 73 68 50 72 6f 63 20     /* flushProc 
2d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d70: 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20             */.  
2d80: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
2d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2da0: 20 20 20 2f 2a 20 68 61 6e 64 6c 65 72 50 72 6f     /* handlerPro
2db0: 63 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c               
2dc0: 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20             */.  
2dd0: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
2de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2df0: 20 20 20 2f 2a 20 77 69 64 65 53 65 65 6b 50 72     /* wideSeekPr
2e00: 6f 63 20 20 20 20 20 20 20 20 20 20 20 20 20 20  oc              
2e10: 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 7d 3b             */.};
2e20: 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
2e30: 20 6e 65 77 20 69 6e 63 72 62 6c 6f 62 20 63 68   new incrblob ch
2e40: 61 6e 6e 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63  annel..*/.static
2e50: 20 69 6e 74 20 63 72 65 61 74 65 49 6e 63 72 62   int createIncrb
2e60: 6c 6f 62 43 68 61 6e 6e 65 6c 28 0a 20 20 54 63  lobChannel(.  Tc
2e70: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
2e80: 2c 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44  ,.  SqliteDb *pD
2e90: 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  b,.  const char 
2ea0: 2a 7a 44 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68  *zDb,.  const ch
2eb0: 61 72 20 2a 7a 54 61 62 6c 65 2c 0a 20 20 63 6f  ar *zTable,.  co
2ec0: 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 75 6d  nst char *zColum
2ed0: 6e 2c 0a 20 20 73 71 6c 69 74 65 5f 69 6e 74 36  n,.  sqlite_int6
2ee0: 34 20 69 52 6f 77 2c 0a 20 20 69 6e 74 20 69 73  4 iRow,.  int is
2ef0: 52 65 61 64 6f 6e 6c 79 0a 29 7b 0a 20 20 49 6e  Readonly.){.  In
2f00: 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 70  crblobChannel *p
2f10: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
2f20: 3d 20 70 44 62 2d 3e 64 62 3b 0a 20 20 73 71 6c  = pDb->db;.  sql
2f30: 69 74 65 33 5f 62 6c 6f 62 20 2a 70 42 6c 6f 62  ite3_blob *pBlob
2f40: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e  ;.  int rc;.  in
2f50: 74 20 66 6c 61 67 73 20 3d 20 54 43 4c 5f 52 45  t flags = TCL_RE
2f60: 41 44 41 42 4c 45 7c 28 69 73 52 65 61 64 6f 6e  ADABLE|(isReadon
2f70: 6c 79 20 3f 20 30 20 3a 20 54 43 4c 5f 57 52 49  ly ? 0 : TCL_WRI
2f80: 54 41 42 4c 45 29 3b 0a 0a 20 20 2f 2a 20 54 68  TABLE);..  /* Th
2f90: 69 73 20 76 61 72 69 61 62 6c 65 20 69 73 20 75  is variable is u
2fa0: 73 65 64 20 74 6f 20 6e 61 6d 65 20 74 68 65 20  sed to name the 
2fb0: 63 68 61 6e 6e 65 6c 73 3a 20 22 69 6e 63 72 62  channels: "incrb
2fc0: 6c 6f 62 5f 5b 69 6e 63 72 20 63 6f 75 6e 74 5d  lob_[incr count]
2fd0: 22 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 69 6e  " */.  static in
2fe0: 74 20 63 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 63  t count = 0;.  c
2ff0: 68 61 72 20 7a 43 68 61 6e 6e 65 6c 5b 36 34 5d  har zChannel[64]
3000: 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
3010: 33 5f 62 6c 6f 62 5f 6f 70 65 6e 28 64 62 2c 20  3_blob_open(db, 
3020: 7a 44 62 2c 20 7a 54 61 62 6c 65 2c 20 7a 43 6f  zDb, zTable, zCo
3030: 6c 75 6d 6e 2c 20 69 52 6f 77 2c 20 21 69 73 52  lumn, iRow, !isR
3040: 65 61 64 6f 6e 6c 79 2c 20 26 70 42 6c 6f 62 29  eadonly, &pBlob)
3050: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
3060: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c  TE_OK ){.    Tcl
3070: 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
3080: 70 2c 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74  p, (char *)sqlit
3090: 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64  e3_errmsg(pDb->d
30a0: 62 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45  b), TCL_VOLATILE
30b0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
30c0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
30d0: 70 20 3d 20 28 49 6e 63 72 62 6c 6f 62 43 68 61  p = (IncrblobCha
30e0: 6e 6e 65 6c 20 2a 29 54 63 6c 5f 41 6c 6c 6f 63  nnel *)Tcl_Alloc
30f0: 28 73 69 7a 65 6f 66 28 49 6e 63 72 62 6c 6f 62  (sizeof(Incrblob
3100: 43 68 61 6e 6e 65 6c 29 29 3b 0a 20 20 70 2d 3e  Channel));.  p->
3110: 69 53 65 65 6b 20 3d 20 30 3b 0a 20 20 70 2d 3e  iSeek = 0;.  p->
3120: 70 42 6c 6f 62 20 3d 20 70 42 6c 6f 62 3b 0a 0a  pBlob = pBlob;..
3130: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
3140: 74 66 28 73 69 7a 65 6f 66 28 7a 43 68 61 6e 6e  tf(sizeof(zChann
3150: 65 6c 29 2c 20 7a 43 68 61 6e 6e 65 6c 2c 20 22  el), zChannel, "
3160: 69 6e 63 72 62 6c 6f 62 5f 25 64 22 2c 20 2b 2b  incrblob_%d", ++
3170: 63 6f 75 6e 74 29 3b 0a 20 20 70 2d 3e 63 68 61  count);.  p->cha
3180: 6e 6e 65 6c 20 3d 20 54 63 6c 5f 43 72 65 61 74  nnel = Tcl_Creat
3190: 65 43 68 61 6e 6e 65 6c 28 26 49 6e 63 72 62 6c  eChannel(&Incrbl
31a0: 6f 62 43 68 61 6e 6e 65 6c 54 79 70 65 2c 20 7a  obChannelType, z
31b0: 43 68 61 6e 6e 65 6c 2c 20 70 2c 20 66 6c 61 67  Channel, p, flag
31c0: 73 29 3b 0a 20 20 54 63 6c 5f 52 65 67 69 73 74  s);.  Tcl_Regist
31d0: 65 72 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70  erChannel(interp
31e0: 2c 20 70 2d 3e 63 68 61 6e 6e 65 6c 29 3b 0a 0a  , p->channel);..
31f0: 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 6e 65    /* Link the ne
3200: 77 20 63 68 61 6e 6e 65 6c 20 69 6e 74 6f 20 74  w channel into t
3210: 68 65 20 53 71 6c 69 74 65 44 62 2e 70 49 6e 63  he SqliteDb.pInc
3220: 72 62 6c 6f 62 20 6c 69 73 74 2e 20 2a 2f 0a 20  rblob list. */. 
3230: 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 44 62 2d   p->pNext = pDb-
3240: 3e 70 49 6e 63 72 62 6c 6f 62 3b 0a 20 20 70 2d  >pIncrblob;.  p-
3250: 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 69 66  >pPrev = 0;.  if
3260: 28 20 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20  ( p->pNext ){.  
3270: 20 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65    p->pNext->pPre
3280: 76 20 3d 20 70 3b 0a 20 20 7d 0a 20 20 70 44 62  v = p;.  }.  pDb
3290: 2d 3e 70 49 6e 63 72 62 6c 6f 62 20 3d 20 70 3b  ->pIncrblob = p;
32a0: 0a 20 20 70 2d 3e 70 44 62 20 3d 20 70 44 62 3b  .  p->pDb = pDb;
32b0: 0a 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c  ..  Tcl_SetResul
32c0: 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20  t(interp, (char 
32d0: 2a 29 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c  *)Tcl_GetChannel
32e0: 4e 61 6d 65 28 70 2d 3e 63 68 61 6e 6e 65 6c 29  Name(p->channel)
32f0: 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b  , TCL_VOLATILE);
3300: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
3310: 3b 0a 7d 0a 23 65 6c 73 65 20 20 2f 2a 20 65 6c  ;.}.#else  /* el
3320: 73 65 20 63 6c 61 75 73 65 20 66 6f 72 20 22 23  se clause for "#
3330: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
3340: 49 54 5f 49 4e 43 52 42 4c 4f 42 22 20 2a 2f 0a  IT_INCRBLOB" */.
3350: 20 20 23 64 65 66 69 6e 65 20 63 6c 6f 73 65 49    #define closeI
3360: 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 73 28  ncrblobChannels(
3370: 70 44 62 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  pDb).#endif../*.
3380: 2a 2a 20 4c 6f 6f 6b 20 61 74 20 74 68 65 20 73  ** Look at the s
3390: 63 72 69 70 74 20 70 72 65 66 69 78 20 69 6e 20  cript prefix in 
33a0: 70 43 6d 64 2e 20 20 57 65 20 77 69 6c 6c 20 62  pCmd.  We will b
33b0: 65 20 65 78 65 63 75 74 69 6e 67 20 74 68 69 73  e executing this
33c0: 20 73 63 72 69 70 74 0a 2a 2a 20 61 66 74 65 72   script.** after
33d0: 20 66 69 72 73 74 20 61 70 70 65 6e 64 69 6e 67   first appending
33e0: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 61 72 67   one or more arg
33f0: 75 6d 65 6e 74 73 2e 20 20 54 68 69 73 20 72 6f  uments.  This ro
3400: 75 74 69 6e 65 20 61 6e 61 6c 79 7a 65 73 0a 2a  utine analyzes.*
3410: 2a 20 74 68 65 20 73 63 72 69 70 74 20 74 6f 20  * the script to 
3420: 73 65 65 20 69 66 20 69 74 20 69 73 20 73 61 66  see if it is saf
3430: 65 20 74 6f 20 75 73 65 20 54 63 6c 5f 45 76 61  e to use Tcl_Eva
3440: 6c 4f 62 6a 76 28 29 20 6f 6e 20 74 68 65 20 73  lObjv() on the s
3450: 63 72 69 70 74 0a 2a 2a 20 72 61 74 68 65 72 20  cript.** rather 
3460: 74 68 61 6e 20 74 68 65 20 6d 6f 72 65 20 67 65  than the more ge
3470: 6e 65 72 61 6c 20 54 63 6c 5f 45 76 61 6c 45 78  neral Tcl_EvalEx
3480: 28 29 2e 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a  ().  Tcl_EvalObj
3490: 76 28 29 20 69 73 20 6d 75 63 68 0a 2a 2a 20 66  v() is much.** f
34a0: 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 53 63 72  aster..**.** Scr
34b0: 69 70 74 73 20 74 68 61 74 20 61 72 65 20 73 61  ipts that are sa
34c0: 66 65 20 74 6f 20 75 73 65 20 77 69 74 68 20 54  fe to use with T
34d0: 63 6c 5f 45 76 61 6c 4f 62 6a 76 28 29 20 63 6f  cl_EvalObjv() co
34e0: 6e 73 69 73 74 73 20 6f 66 20 61 0a 2a 2a 20 63  nsists of a.** c
34f0: 6f 6d 6d 61 6e 64 20 6e 61 6d 65 20 66 6f 6c 6c  ommand name foll
3500: 6f 77 65 64 20 62 79 20 7a 65 72 6f 20 6f 72 20  owed by zero or 
3510: 6d 6f 72 65 20 61 72 67 75 6d 65 6e 74 73 20 77  more arguments w
3520: 69 74 68 20 6e 6f 20 5b 2e 2e 2e 5d 20 6f 72 20  ith no [...] or 
3530: 24 0a 2a 2a 20 6f 72 20 7b 2e 2e 2e 7d 20 6f 72  $.** or {...} or
3540: 20 3b 20 74 6f 20 62 65 20 73 65 65 6e 20 61 6e   ; to be seen an
3550: 79 77 68 65 72 65 2e 20 20 4d 6f 73 74 20 63 61  ywhere.  Most ca
3560: 6c 6c 62 61 63 6b 20 73 63 72 69 70 74 73 20 63  llback scripts c
3570: 6f 6e 73 69 73 74 0a 2a 2a 20 6f 66 20 6a 75 73  onsist.** of jus
3580: 74 20 61 20 73 69 6e 67 6c 65 20 70 72 6f 63 65  t a single proce
3590: 64 75 72 65 20 6e 61 6d 65 20 61 6e 64 20 74 68  dure name and th
35a0: 65 79 20 6d 65 65 74 20 74 68 69 73 20 72 65 71  ey meet this req
35b0: 75 69 72 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61  uirement..*/.sta
35c0: 74 69 63 20 69 6e 74 20 73 61 66 65 54 6f 55 73  tic int safeToUs
35d0: 65 45 76 61 6c 4f 62 6a 76 28 54 63 6c 5f 49 6e  eEvalObjv(Tcl_In
35e0: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 54 63  terp *interp, Tc
35f0: 6c 5f 4f 62 6a 20 2a 70 43 6d 64 29 7b 0a 20 20  l_Obj *pCmd){.  
3600: 2f 2a 20 57 65 20 63 6f 75 6c 64 20 74 72 79 20  /* We could try 
3610: 74 6f 20 64 6f 20 73 6f 6d 65 74 68 69 6e 67 20  to do something 
3620: 77 69 74 68 20 54 63 6c 5f 50 61 72 73 65 28 29  with Tcl_Parse()
3630: 2e 20 20 42 75 74 20 77 65 20 77 69 6c 6c 20 69  .  But we will i
3640: 6e 73 74 65 61 64 0a 20 20 2a 2a 20 6a 75 73 74  nstead.  ** just
3650: 20 64 6f 20 61 20 73 65 61 72 63 68 20 66 6f 72   do a search for
3660: 20 66 6f 72 62 69 64 64 65 6e 20 63 68 61 72 61   forbidden chara
3670: 63 74 65 72 73 2e 20 20 49 66 20 61 6e 79 20 6f  cters.  If any o
3680: 66 20 74 68 65 20 66 6f 72 62 69 64 64 65 6e 0a  f the forbidden.
3690: 20 20 2a 2a 20 63 68 61 72 61 63 74 65 72 73 20    ** characters 
36a0: 61 70 70 65 61 72 20 69 6e 20 70 43 6d 64 2c 20  appear in pCmd, 
36b0: 77 65 20 77 69 6c 6c 20 72 65 70 6f 72 74 20 74  we will report t
36c0: 68 65 20 73 74 72 69 6e 67 20 61 73 20 75 6e 73  he string as uns
36d0: 61 66 65 2e 0a 20 20 2a 2f 0a 20 20 63 6f 6e 73  afe..  */.  cons
36e0: 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 6e 74  t char *z;.  int
36f0: 20 6e 3b 0a 20 20 7a 20 3d 20 54 63 6c 5f 47 65   n;.  z = Tcl_Ge
3700: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 70  tStringFromObj(p
3710: 43 6d 64 2c 20 26 6e 29 3b 0a 20 20 77 68 69 6c  Cmd, &n);.  whil
3720: 65 28 20 6e 2d 2d 20 3e 20 30 20 29 7b 0a 20 20  e( n-- > 0 ){.  
3730: 20 20 69 6e 74 20 63 20 3d 20 2a 28 7a 2b 2b 29    int c = *(z++)
3740: 3b 0a 20 20 20 20 69 66 28 20 63 3d 3d 27 24 27  ;.    if( c=='$'
3750: 20 7c 7c 20 63 3d 3d 27 5b 27 20 7c 7c 20 63 3d   || c=='[' || c=
3760: 3d 27 3b 27 20 29 20 72 65 74 75 72 6e 20 30 3b  =';' ) return 0;
3770: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b  .  }.  return 1;
3780: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61  .}../*.** Find a
3790: 6e 20 53 71 6c 46 75 6e 63 20 73 74 72 75 63 74  n SqlFunc struct
37a0: 75 72 65 20 77 69 74 68 20 74 68 65 20 67 69 76  ure with the giv
37b0: 65 6e 20 6e 61 6d 65 2e 20 20 4f 72 20 63 72 65  en name.  Or cre
37c0: 61 74 65 20 61 20 6e 65 77 0a 2a 2a 20 6f 6e 65  ate a new.** one
37d0: 20 69 66 20 61 6e 20 65 78 69 73 74 69 6e 67 20   if an existing 
37e0: 6f 6e 65 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f  one cannot be fo
37f0: 75 6e 64 2e 20 20 52 65 74 75 72 6e 20 61 20 70  und.  Return a p
3800: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 0a 2a 2a  ointer to the.**
3810: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73   structure..*/.s
3820: 74 61 74 69 63 20 53 71 6c 46 75 6e 63 20 2a 66  tatic SqlFunc *f
3830: 69 6e 64 53 71 6c 46 75 6e 63 28 53 71 6c 69 74  indSqlFunc(Sqlit
3840: 65 44 62 20 2a 70 44 62 2c 20 63 6f 6e 73 74 20  eDb *pDb, const 
3850: 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20  char *zName){.  
3860: 53 71 6c 46 75 6e 63 20 2a 70 2c 20 2a 70 4e 65  SqlFunc *p, *pNe
3870: 77 3b 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 20 3d  w;.  int nName =
3880: 20 73 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29   strlen30(zName)
3890: 3b 0a 20 20 70 4e 65 77 20 3d 20 28 53 71 6c 46  ;.  pNew = (SqlF
38a0: 75 6e 63 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28 20  unc*)Tcl_Alloc( 
38b0: 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 2b 20  sizeof(*pNew) + 
38c0: 6e 4e 61 6d 65 20 2b 20 31 20 29 3b 0a 20 20 70  nName + 1 );.  p
38d0: 4e 65 77 2d 3e 7a 4e 61 6d 65 20 3d 20 28 63 68  New->zName = (ch
38e0: 61 72 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a 20 20  ar*)&pNew[1];.  
38f0: 6d 65 6d 63 70 79 28 70 4e 65 77 2d 3e 7a 4e 61  memcpy(pNew->zNa
3900: 6d 65 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65  me, zName, nName
3910: 2b 31 29 3b 0a 20 20 66 6f 72 28 70 3d 70 44 62  +1);.  for(p=pDb
3920: 2d 3e 70 46 75 6e 63 3b 20 70 3b 20 70 3d 70 2d  ->pFunc; p; p=p-
3930: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  >pNext){.    if(
3940: 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70   sqlite3_stricmp
3950: 28 70 2d 3e 7a 4e 61 6d 65 2c 20 70 4e 65 77 2d  (p->zName, pNew-
3960: 3e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20  >zName)==0 ){.  
3970: 20 20 20 20 54 63 6c 5f 46 72 65 65 28 28 63 68      Tcl_Free((ch
3980: 61 72 2a 29 70 4e 65 77 29 3b 0a 20 20 20 20 20  ar*)pNew);.     
3990: 20 72 65 74 75 72 6e 20 70 3b 0a 20 20 20 20 7d   return p;.    }
39a0: 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 69 6e 74  .  }.  pNew->int
39b0: 65 72 70 20 3d 20 70 44 62 2d 3e 69 6e 74 65 72  erp = pDb->inter
39c0: 70 3b 0a 20 20 70 4e 65 77 2d 3e 70 44 62 20 3d  p;.  pNew->pDb =
39d0: 20 70 44 62 3b 0a 20 20 70 4e 65 77 2d 3e 70 53   pDb;.  pNew->pS
39e0: 63 72 69 70 74 20 3d 20 30 3b 0a 20 20 70 4e 65  cript = 0;.  pNe
39f0: 77 2d 3e 70 4e 65 78 74 20 3d 20 70 44 62 2d 3e  w->pNext = pDb->
3a00: 70 46 75 6e 63 3b 0a 20 20 70 44 62 2d 3e 70 46  pFunc;.  pDb->pF
3a10: 75 6e 63 20 3d 20 70 4e 65 77 3b 0a 20 20 72 65  unc = pNew;.  re
3a20: 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a  turn pNew;.}../*
3a30: 0a 2a 2a 20 46 72 65 65 20 61 20 73 69 6e 67 6c  .** Free a singl
3a40: 65 20 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d  e SqlPreparedStm
3a50: 74 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61  t object..*/.sta
3a60: 74 69 63 20 76 6f 69 64 20 64 62 46 72 65 65 53  tic void dbFreeS
3a70: 74 6d 74 28 53 71 6c 50 72 65 70 61 72 65 64 53  tmt(SqlPreparedS
3a80: 74 6d 74 20 2a 70 53 74 6d 74 29 7b 0a 23 69 66  tmt *pStmt){.#if
3a90: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
3aa0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 71    if( sqlite3_sq
3ab0: 6c 28 70 53 74 6d 74 2d 3e 70 53 74 6d 74 29 3d  l(pStmt->pStmt)=
3ac0: 3d 30 20 29 7b 0a 20 20 20 20 54 63 6c 5f 46 72  =0 ){.    Tcl_Fr
3ad0: 65 65 28 28 63 68 61 72 20 2a 29 70 53 74 6d 74  ee((char *)pStmt
3ae0: 2d 3e 7a 53 71 6c 29 3b 0a 20 20 7d 0a 23 65 6e  ->zSql);.  }.#en
3af0: 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  dif.  sqlite3_fi
3b00: 6e 61 6c 69 7a 65 28 70 53 74 6d 74 2d 3e 70 53  nalize(pStmt->pS
3b10: 74 6d 74 29 3b 0a 20 20 54 63 6c 5f 46 72 65 65  tmt);.  Tcl_Free
3b20: 28 28 63 68 61 72 20 2a 29 70 53 74 6d 74 29 3b  ((char *)pStmt);
3b30: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 61 6c 69  .}../*.** Finali
3b40: 7a 65 20 61 6e 64 20 66 72 65 65 20 61 20 6c 69  ze and free a li
3b50: 73 74 20 6f 66 20 70 72 65 70 61 72 65 64 20 73  st of prepared s
3b60: 74 61 74 65 6d 65 6e 74 73 0a 2a 2f 0a 73 74 61  tatements.*/.sta
3b70: 74 69 63 20 76 6f 69 64 20 66 6c 75 73 68 53 74  tic void flushSt
3b80: 6d 74 43 61 63 68 65 28 53 71 6c 69 74 65 44 62  mtCache(SqliteDb
3b90: 20 2a 70 44 62 29 7b 0a 20 20 53 71 6c 50 72 65   *pDb){.  SqlPre
3ba0: 70 61 72 65 64 53 74 6d 74 20 2a 70 50 72 65 53  paredStmt *pPreS
3bb0: 74 6d 74 3b 0a 20 20 53 71 6c 50 72 65 70 61 72  tmt;.  SqlPrepar
3bc0: 65 64 53 74 6d 74 20 2a 70 4e 65 78 74 3b 0a 0a  edStmt *pNext;..
3bd0: 20 20 66 6f 72 28 70 50 72 65 53 74 6d 74 20 3d    for(pPreStmt =
3be0: 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74 3b 20   pDb->stmtList; 
3bf0: 70 50 72 65 53 74 6d 74 3b 20 70 50 72 65 53 74  pPreStmt; pPreSt
3c00: 6d 74 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70  mt=pNext){.    p
3c10: 4e 65 78 74 20 3d 20 70 50 72 65 53 74 6d 74 2d  Next = pPreStmt-
3c20: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 64 62 46 72  >pNext;.    dbFr
3c30: 65 65 53 74 6d 74 28 70 50 72 65 53 74 6d 74 29  eeStmt(pPreStmt)
3c40: 3b 0a 20 20 7d 0a 20 20 70 44 62 2d 3e 6e 53 74  ;.  }.  pDb->nSt
3c50: 6d 74 20 3d 20 30 3b 0a 20 20 70 44 62 2d 3e 73  mt = 0;.  pDb->s
3c60: 74 6d 74 4c 61 73 74 20 3d 20 30 3b 0a 20 20 70  tmtLast = 0;.  p
3c70: 44 62 2d 3e 73 74 6d 74 4c 69 73 74 20 3d 20 30  Db->stmtList = 0
3c80: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 43 4c 20 63  ;.}../*.** TCL c
3c90: 61 6c 6c 73 20 74 68 69 73 20 70 72 6f 63 65 64  alls this proced
3ca0: 75 72 65 20 77 68 65 6e 20 61 6e 20 73 71 6c 69  ure when an sqli
3cb0: 74 65 33 20 64 61 74 61 62 61 73 65 20 63 6f 6d  te3 database com
3cc0: 6d 61 6e 64 20 69 73 0a 2a 2a 20 64 65 6c 65 74  mand is.** delet
3cd0: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
3ce0: 69 64 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49  id SQLITE_TCLAPI
3cf0: 20 44 62 44 65 6c 65 74 65 43 6d 64 28 76 6f 69   DbDeleteCmd(voi
3d00: 64 20 2a 64 62 29 7b 0a 20 20 53 71 6c 69 74 65  d *db){.  Sqlite
3d10: 44 62 20 2a 70 44 62 20 3d 20 28 53 71 6c 69 74  Db *pDb = (Sqlit
3d20: 65 44 62 2a 29 64 62 3b 0a 20 20 66 6c 75 73 68  eDb*)db;.  flush
3d30: 53 74 6d 74 43 61 63 68 65 28 70 44 62 29 3b 0a  StmtCache(pDb);.
3d40: 20 20 63 6c 6f 73 65 49 6e 63 72 62 6c 6f 62 43    closeIncrblobC
3d50: 68 61 6e 6e 65 6c 73 28 70 44 62 29 3b 0a 20 20  hannels(pDb);.  
3d60: 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70 44  sqlite3_close(pD
3d70: 62 2d 3e 64 62 29 3b 0a 20 20 77 68 69 6c 65 28  b->db);.  while(
3d80: 20 70 44 62 2d 3e 70 46 75 6e 63 20 29 7b 0a 20   pDb->pFunc ){. 
3d90: 20 20 20 53 71 6c 46 75 6e 63 20 2a 70 46 75 6e     SqlFunc *pFun
3da0: 63 20 3d 20 70 44 62 2d 3e 70 46 75 6e 63 3b 0a  c = pDb->pFunc;.
3db0: 20 20 20 20 70 44 62 2d 3e 70 46 75 6e 63 20 3d      pDb->pFunc =
3dc0: 20 70 46 75 6e 63 2d 3e 70 4e 65 78 74 3b 0a 20   pFunc->pNext;. 
3dd0: 20 20 20 61 73 73 65 72 74 28 20 70 46 75 6e 63     assert( pFunc
3de0: 2d 3e 70 44 62 3d 3d 70 44 62 20 29 3b 0a 20 20  ->pDb==pDb );.  
3df0: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
3e00: 6e 74 28 70 46 75 6e 63 2d 3e 70 53 63 72 69 70  nt(pFunc->pScrip
3e10: 74 29 3b 0a 20 20 20 20 54 63 6c 5f 46 72 65 65  t);.    Tcl_Free
3e20: 28 28 63 68 61 72 2a 29 70 46 75 6e 63 29 3b 0a  ((char*)pFunc);.
3e30: 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 70 44 62    }.  while( pDb
3e40: 2d 3e 70 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20  ->pCollate ){.  
3e50: 20 20 53 71 6c 43 6f 6c 6c 61 74 65 20 2a 70 43    SqlCollate *pC
3e60: 6f 6c 6c 61 74 65 20 3d 20 70 44 62 2d 3e 70 43  ollate = pDb->pC
3e70: 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 70 44 62 2d  ollate;.    pDb-
3e80: 3e 70 43 6f 6c 6c 61 74 65 20 3d 20 70 43 6f 6c  >pCollate = pCol
3e90: 6c 61 74 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  late->pNext;.   
3ea0: 20 54 63 6c 5f 46 72 65 65 28 28 63 68 61 72 2a   Tcl_Free((char*
3eb0: 29 70 43 6f 6c 6c 61 74 65 29 3b 0a 20 20 7d 0a  )pCollate);.  }.
3ec0: 20 20 69 66 28 20 70 44 62 2d 3e 7a 42 75 73 79    if( pDb->zBusy
3ed0: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 46 72 65 65   ){.    Tcl_Free
3ee0: 28 70 44 62 2d 3e 7a 42 75 73 79 29 3b 0a 20 20  (pDb->zBusy);.  
3ef0: 7d 0a 20 20 69 66 28 20 70 44 62 2d 3e 7a 54 72  }.  if( pDb->zTr
3f00: 61 63 65 20 29 7b 0a 20 20 20 20 54 63 6c 5f 46  ace ){.    Tcl_F
3f10: 72 65 65 28 70 44 62 2d 3e 7a 54 72 61 63 65 29  ree(pDb->zTrace)
3f20: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 62 2d  ;.  }.  if( pDb-
3f30: 3e 7a 54 72 61 63 65 56 32 20 29 7b 0a 20 20 20  >zTraceV2 ){.   
3f40: 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a   Tcl_Free(pDb->z
3f50: 54 72 61 63 65 56 32 29 3b 0a 20 20 7d 0a 20 20  TraceV2);.  }.  
3f60: 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c  if( pDb->zProfil
3f70: 65 20 29 7b 0a 20 20 20 20 54 63 6c 5f 46 72 65  e ){.    Tcl_Fre
3f80: 65 28 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 29  e(pDb->zProfile)
3f90: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 62 2d  ;.  }.  if( pDb-
3fa0: 3e 7a 41 75 74 68 20 29 7b 0a 20 20 20 20 54 63  >zAuth ){.    Tc
3fb0: 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 41 75 74  l_Free(pDb->zAut
3fc0: 68 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44  h);.  }.  if( pD
3fd0: 62 2d 3e 7a 4e 75 6c 6c 20 29 7b 0a 20 20 20 20  b->zNull ){.    
3fe0: 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 4e  Tcl_Free(pDb->zN
3ff0: 75 6c 6c 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ull);.  }.  if( 
4000: 70 44 62 2d 3e 70 55 70 64 61 74 65 48 6f 6f 6b  pDb->pUpdateHook
4010: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72   ){.    Tcl_Decr
4020: 52 65 66 43 6f 75 6e 74 28 70 44 62 2d 3e 70 55  RefCount(pDb->pU
4030: 70 64 61 74 65 48 6f 6f 6b 29 3b 0a 20 20 7d 0a  pdateHook);.  }.
4040: 20 20 69 66 28 20 70 44 62 2d 3e 70 50 72 65 55    if( pDb->pPreU
4050: 70 64 61 74 65 48 6f 6f 6b 20 29 7b 0a 20 20 20  pdateHook ){.   
4060: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
4070: 74 28 70 44 62 2d 3e 70 50 72 65 55 70 64 61 74  t(pDb->pPreUpdat
4080: 65 48 6f 6f 6b 29 3b 0a 20 20 7d 0a 20 20 69 66  eHook);.  }.  if
4090: 28 20 70 44 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b  ( pDb->pRollback
40a0: 48 6f 6f 6b 20 29 7b 0a 20 20 20 20 54 63 6c 5f  Hook ){.    Tcl_
40b0: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 44 62  DecrRefCount(pDb
40c0: 2d 3e 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 29  ->pRollbackHook)
40d0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 62 2d  ;.  }.  if( pDb-
40e0: 3e 70 57 61 6c 48 6f 6f 6b 20 29 7b 0a 20 20 20  >pWalHook ){.   
40f0: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
4100: 74 28 70 44 62 2d 3e 70 57 61 6c 48 6f 6f 6b 29  t(pDb->pWalHook)
4110: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 62 2d  ;.  }.  if( pDb-
4120: 3e 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64 20  >pCollateNeeded 
4130: 29 7b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52  ){.    Tcl_DecrR
4140: 65 66 43 6f 75 6e 74 28 70 44 62 2d 3e 70 43 6f  efCount(pDb->pCo
4150: 6c 6c 61 74 65 4e 65 65 64 65 64 29 3b 0a 20 20  llateNeeded);.  
4160: 7d 0a 20 20 54 63 6c 5f 46 72 65 65 28 28 63 68  }.  Tcl_Free((ch
4170: 61 72 2a 29 70 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a  ar*)pDb);.}../*.
4180: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
4190: 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61  is called when a
41a0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
41b0: 73 20 6c 6f 63 6b 65 64 20 77 68 69 6c 65 20 74  s locked while t
41c0: 72 79 69 6e 67 0a 2a 2a 20 74 6f 20 65 78 65 63  rying.** to exec
41d0: 75 74 65 20 53 51 4c 2e 0a 2a 2f 0a 73 74 61 74  ute SQL..*/.stat
41e0: 69 63 20 69 6e 74 20 44 62 42 75 73 79 48 61 6e  ic int DbBusyHan
41f0: 64 6c 65 72 28 76 6f 69 64 20 2a 63 64 2c 20 69  dler(void *cd, i
4200: 6e 74 20 6e 54 72 69 65 73 29 7b 0a 20 20 53 71  nt nTries){.  Sq
4210: 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53  liteDb *pDb = (S
4220: 71 6c 69 74 65 44 62 2a 29 63 64 3b 0a 20 20 69  qliteDb*)cd;.  i
4230: 6e 74 20 72 63 3b 0a 20 20 63 68 61 72 20 7a 56  nt rc;.  char zV
4240: 61 6c 5b 33 30 5d 3b 0a 0a 20 20 73 71 6c 69 74  al[30];..  sqlit
4250: 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
4260: 6f 66 28 7a 56 61 6c 29 2c 20 7a 56 61 6c 2c 20  of(zVal), zVal, 
4270: 22 25 64 22 2c 20 6e 54 72 69 65 73 29 3b 0a 20  "%d", nTries);. 
4280: 20 72 63 20 3d 20 54 63 6c 5f 56 61 72 45 76 61   rc = Tcl_VarEva
4290: 6c 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20 70  l(pDb->interp, p
42a0: 44 62 2d 3e 7a 42 75 73 79 2c 20 22 20 22 2c 20  Db->zBusy, " ", 
42b0: 7a 56 61 6c 2c 20 28 63 68 61 72 2a 29 30 29 3b  zVal, (char*)0);
42c0: 0a 20 20 69 66 28 20 72 63 21 3d 54 43 4c 5f 4f  .  if( rc!=TCL_O
42d0: 4b 20 7c 7c 20 61 74 6f 69 28 54 63 6c 5f 47 65  K || atoi(Tcl_Ge
42e0: 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28 70 44  tStringResult(pD
42f0: 62 2d 3e 69 6e 74 65 72 70 29 29 20 29 7b 0a 20  b->interp)) ){. 
4300: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
4310: 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a  .  return 1;.}..
4320: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
4330: 4d 49 54 5f 50 52 4f 47 52 45 53 53 5f 43 41 4c  MIT_PROGRESS_CAL
4340: 4c 42 41 43 4b 0a 2f 2a 0a 2a 2a 20 54 68 69 73  LBACK./*.** This
4350: 20 72 6f 75 74 69 6e 65 20 69 73 20 69 6e 76 6f   routine is invo
4360: 6b 65 64 20 61 73 20 74 68 65 20 27 70 72 6f 67  ked as the 'prog
4370: 72 65 73 73 20 63 61 6c 6c 62 61 63 6b 27 20 66  ress callback' f
4380: 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  or the database.
4390: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 44  .*/.static int D
43a0: 62 50 72 6f 67 72 65 73 73 48 61 6e 64 6c 65 72  bProgressHandler
43b0: 28 76 6f 69 64 20 2a 63 64 29 7b 0a 20 20 53 71  (void *cd){.  Sq
43c0: 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53  liteDb *pDb = (S
43d0: 71 6c 69 74 65 44 62 2a 29 63 64 3b 0a 20 20 69  qliteDb*)cd;.  i
43e0: 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
43f0: 28 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73  ( pDb->zProgress
4400: 20 29 3b 0a 20 20 72 63 20 3d 20 54 63 6c 5f 45   );.  rc = Tcl_E
4410: 76 61 6c 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c  val(pDb->interp,
4420: 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 29   pDb->zProgress)
4430: 3b 0a 20 20 69 66 28 20 72 63 21 3d 54 43 4c 5f  ;.  if( rc!=TCL_
4440: 4f 4b 20 7c 7c 20 61 74 6f 69 28 54 63 6c 5f 47  OK || atoi(Tcl_G
4450: 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28 70  etStringResult(p
4460: 44 62 2d 3e 69 6e 74 65 72 70 29 29 20 29 7b 0a  Db->interp)) ){.
4470: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
4480: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
4490: 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66  #endif..#if !def
44a0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
44b0: 5f 54 52 41 43 45 29 20 26 26 20 21 64 65 66 69  _TRACE) && !defi
44c0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
44d0: 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 29 20  FLOATING_POINT) 
44e0: 26 26 20 5c 0a 20 20 20 20 21 64 65 66 69 6e 65  && \.    !define
44f0: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45  d(SQLITE_OMIT_DE
4500: 50 52 45 43 41 54 45 44 29 0a 2f 2a 0a 2a 2a 20  PRECATED)./*.** 
4510: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
4520: 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 53 51  called by the SQ
4530: 4c 69 74 65 20 74 72 61 63 65 20 68 61 6e 64 6c  Lite trace handl
4540: 65 72 20 77 68 65 6e 65 76 65 72 20 61 20 6e 65  er whenever a ne
4550: 77 0a 2a 2a 20 62 6c 6f 63 6b 20 6f 66 20 53 51  w.** block of SQ
4560: 4c 20 69 73 20 65 78 65 63 75 74 65 64 2e 20 20  L is executed.  
4570: 54 68 65 20 54 43 4c 20 73 63 72 69 70 74 20 69  The TCL script i
4580: 6e 20 70 44 62 2d 3e 7a 54 72 61 63 65 20 69 73  n pDb->zTrace is
4590: 20 65 78 65 63 75 74 65 64 2e 0a 2a 2f 0a 73 74   executed..*/.st
45a0: 61 74 69 63 20 76 6f 69 64 20 44 62 54 72 61 63  atic void DbTrac
45b0: 65 48 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a 63  eHandler(void *c
45c0: 64 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  d, const char *z
45d0: 53 71 6c 29 7b 0a 20 20 53 71 6c 69 74 65 44 62  Sql){.  SqliteDb
45e0: 20 2a 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44   *pDb = (SqliteD
45f0: 62 2a 29 63 64 3b 0a 20 20 54 63 6c 5f 44 53 74  b*)cd;.  Tcl_DSt
4600: 72 69 6e 67 20 73 74 72 3b 0a 0a 20 20 54 63 6c  ring str;..  Tcl
4610: 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 73 74  _DStringInit(&st
4620: 72 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e  r);.  Tcl_DStrin
4630: 67 41 70 70 65 6e 64 28 26 73 74 72 2c 20 70 44  gAppend(&str, pD
4640: 62 2d 3e 7a 54 72 61 63 65 2c 20 2d 31 29 3b 0a  b->zTrace, -1);.
4650: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70    Tcl_DStringApp
4660: 65 6e 64 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c  endElement(&str,
4670: 20 7a 53 71 6c 29 3b 0a 20 20 54 63 6c 5f 45 76   zSql);.  Tcl_Ev
4680: 61 6c 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20  al(pDb->interp, 
4690: 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65  Tcl_DStringValue
46a0: 28 26 73 74 72 29 29 3b 0a 20 20 54 63 6c 5f 44  (&str));.  Tcl_D
46b0: 53 74 72 69 6e 67 46 72 65 65 28 26 73 74 72 29  StringFree(&str)
46c0: 3b 0a 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73  ;.  Tcl_ResetRes
46d0: 75 6c 74 28 70 44 62 2d 3e 69 6e 74 65 72 70 29  ult(pDb->interp)
46e0: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  ;.}.#endif..#ifn
46f0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
4700: 54 52 41 43 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73  TRACE./*.** This
4710: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
4720: 65 64 20 62 79 20 74 68 65 20 53 51 4c 69 74 65  ed by the SQLite
4730: 20 74 72 61 63 65 5f 76 32 20 68 61 6e 64 6c 65   trace_v2 handle
4740: 72 20 77 68 65 6e 65 76 65 72 20 61 20 6e 65 77  r whenever a new
4750: 0a 2a 2a 20 73 75 70 70 6f 72 74 65 64 20 65 76  .** supported ev
4760: 65 6e 74 20 69 73 20 67 65 6e 65 72 61 74 65 64  ent is generated
4770: 2e 20 20 55 6e 73 75 70 70 6f 72 74 65 64 20 65  .  Unsupported e
4780: 76 65 6e 74 20 74 79 70 65 73 20 61 72 65 20 69  vent types are i
4790: 67 6e 6f 72 65 64 2e 0a 2a 2a 20 54 68 65 20 54  gnored..** The T
47a0: 43 4c 20 73 63 72 69 70 74 20 69 6e 20 70 44 62  CL script in pDb
47b0: 2d 3e 7a 54 72 61 63 65 56 32 20 69 73 20 65 78  ->zTraceV2 is ex
47c0: 65 63 75 74 65 64 2c 20 77 69 74 68 20 74 68 65  ecuted, with the
47d0: 20 61 72 67 75 6d 65 6e 74 73 20 66 6f 72 0a 2a   arguments for.*
47e0: 2a 20 74 68 65 20 65 76 65 6e 74 20 61 70 70 65  * the event appe
47f0: 6e 64 65 64 20 74 6f 20 69 74 20 28 61 73 20 6c  nded to it (as l
4800: 69 73 74 20 65 6c 65 6d 65 6e 74 73 29 2e 0a 2a  ist elements)..*
4810: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 44 62 54  /.static int DbT
4820: 72 61 63 65 56 32 48 61 6e 64 6c 65 72 28 0a 20  raceV2Handler(. 
4830: 20 75 6e 73 69 67 6e 65 64 20 74 79 70 65 2c 20   unsigned type, 
4840: 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 53 51  /* One of the SQ
4850: 4c 49 54 45 5f 54 52 41 43 45 5f 2a 20 65 76 65  LITE_TRACE_* eve
4860: 6e 74 20 74 79 70 65 73 2e 20 2a 2f 0a 20 20 76  nt types. */.  v
4870: 6f 69 64 20 2a 63 64 2c 20 20 20 20 20 20 2f 2a  oid *cd,      /*
4880: 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 63 6f   The original co
4890: 6e 74 65 78 74 20 64 61 74 61 20 70 6f 69 6e 74  ntext data point
48a0: 65 72 2e 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70  er. */.  void *p
48b0: 64 2c 20 20 20 20 20 20 2f 2a 20 50 72 69 6d 61  d,      /* Prima
48c0: 72 79 20 65 76 65 6e 74 20 64 61 74 61 2c 20 64  ry event data, d
48d0: 65 70 65 6e 64 73 20 6f 6e 20 65 76 65 6e 74 20  epends on event 
48e0: 74 79 70 65 2e 20 2a 2f 0a 20 20 76 6f 69 64 20  type. */.  void 
48f0: 2a 78 64 20 20 20 20 20 20 20 2f 2a 20 45 78 74  *xd       /* Ext
4900: 72 61 20 65 76 65 6e 74 20 64 61 74 61 2c 20 64  ra event data, d
4910: 65 70 65 6e 64 73 20 6f 6e 20 65 76 65 6e 74 20  epends on event 
4920: 74 79 70 65 2e 20 2a 2f 0a 29 7b 0a 20 20 53 71  type. */.){.  Sq
4930: 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53  liteDb *pDb = (S
4940: 71 6c 69 74 65 44 62 2a 29 63 64 3b 0a 20 20 54  qliteDb*)cd;.  T
4950: 63 6c 5f 4f 62 6a 20 2a 70 43 6d 64 3b 0a 0a 20  cl_Obj *pCmd;.. 
4960: 20 73 77 69 74 63 68 28 20 74 79 70 65 20 29 7b   switch( type ){
4970: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
4980: 5f 54 52 41 43 45 5f 53 54 4d 54 3a 20 7b 0a 20  _TRACE_STMT: {. 
4990: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d       sqlite3_stm
49a0: 74 20 2a 70 53 74 6d 74 20 3d 20 28 73 71 6c 69  t *pStmt = (sqli
49b0: 74 65 33 5f 73 74 6d 74 20 2a 29 70 64 3b 0a 20  te3_stmt *)pd;. 
49c0: 20 20 20 20 20 63 68 61 72 20 2a 7a 53 71 6c 20       char *zSql 
49d0: 3d 20 28 63 68 61 72 20 2a 29 78 64 3b 0a 0a 20  = (char *)xd;.. 
49e0: 20 20 20 20 20 70 43 6d 64 20 3d 20 54 63 6c 5f       pCmd = Tcl_
49f0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 44 62  NewStringObj(pDb
4a00: 2d 3e 7a 54 72 61 63 65 56 32 2c 20 2d 31 29 3b  ->zTraceV2, -1);
4a10: 0a 20 20 20 20 20 20 54 63 6c 5f 49 6e 63 72 52  .      Tcl_IncrR
4a20: 65 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20  efCount(pCmd);. 
4a30: 20 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a       Tcl_ListObj
4a40: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 70 44  AppendElement(pD
4a50: 62 2d 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c  b->interp, pCmd,
4a60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
4a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4a80: 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62  Tcl_NewWideIntOb
4a90: 6a 28 28 54 63 6c 5f 57 69 64 65 49 6e 74 29 70  j((Tcl_WideInt)p
4aa0: 53 74 6d 74 29 29 3b 0a 20 20 20 20 20 20 54 63  Stmt));.      Tc
4ab0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
4ac0: 6c 65 6d 65 6e 74 28 70 44 62 2d 3e 69 6e 74 65  lement(pDb->inte
4ad0: 72 70 2c 20 70 43 6d 64 2c 0a 20 20 20 20 20 20  rp, pCmd,.      
4ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4af0: 20 20 20 20 20 20 20 20 20 54 63 6c 5f 4e 65 77           Tcl_New
4b00: 53 74 72 69 6e 67 4f 62 6a 28 7a 53 71 6c 2c 20  StringObj(zSql, 
4b10: 2d 31 29 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f  -1));.      Tcl_
4b20: 45 76 61 6c 4f 62 6a 45 78 28 70 44 62 2d 3e 69  EvalObjEx(pDb->i
4b30: 6e 74 65 72 70 2c 20 70 43 6d 64 2c 20 54 43 4c  nterp, pCmd, TCL
4b40: 5f 45 56 41 4c 5f 44 49 52 45 43 54 29 3b 0a 20  _EVAL_DIRECT);. 
4b50: 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66       Tcl_DecrRef
4b60: 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20 20  Count(pCmd);.   
4b70: 20 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73 75     Tcl_ResetResu
4b80: 6c 74 28 70 44 62 2d 3e 69 6e 74 65 72 70 29 3b  lt(pDb->interp);
4b90: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
4ba0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
4bb0: 49 54 45 5f 54 52 41 43 45 5f 50 52 4f 46 49 4c  ITE_TRACE_PROFIL
4bc0: 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  E: {.      sqlit
4bd0: 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d  e3_stmt *pStmt =
4be0: 20 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a   (sqlite3_stmt *
4bf0: 29 70 64 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  )pd;.      sqlit
4c00: 65 33 5f 69 6e 74 36 34 20 6e 73 20 3d 20 28 73  e3_int64 ns = (s
4c10: 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 78 64 3b  qlite3_int64)xd;
4c20: 0a 0a 20 20 20 20 20 20 70 43 6d 64 20 3d 20 54  ..      pCmd = T
4c30: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
4c40: 70 44 62 2d 3e 7a 54 72 61 63 65 56 32 2c 20 2d  pDb->zTraceV2, -
4c50: 31 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 49 6e  1);.      Tcl_In
4c60: 63 72 52 65 66 43 6f 75 6e 74 28 70 43 6d 64 29  crRefCount(pCmd)
4c70: 3b 0a 20 20 20 20 20 20 54 63 6c 5f 4c 69 73 74  ;.      Tcl_List
4c80: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
4c90: 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20 70 43  (pDb->interp, pC
4ca0: 6d 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  md,.            
4cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4cc0: 20 20 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e     Tcl_NewWideIn
4cd0: 74 4f 62 6a 28 28 54 63 6c 5f 57 69 64 65 49 6e  tObj((Tcl_WideIn
4ce0: 74 29 70 53 74 6d 74 29 29 3b 0a 20 20 20 20 20  t)pStmt));.     
4cf0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
4d00: 6e 64 45 6c 65 6d 65 6e 74 28 70 44 62 2d 3e 69  ndElement(pDb->i
4d10: 6e 74 65 72 70 2c 20 70 43 6d 64 2c 0a 20 20 20  nterp, pCmd,.   
4d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4d30: 20 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f              Tcl_
4d40: 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 28 54  NewWideIntObj((T
4d50: 63 6c 5f 57 69 64 65 49 6e 74 29 6e 73 29 29 3b  cl_WideInt)ns));
4d60: 0a 20 20 20 20 20 20 54 63 6c 5f 45 76 61 6c 4f  .      Tcl_EvalO
4d70: 62 6a 45 78 28 70 44 62 2d 3e 69 6e 74 65 72 70  bjEx(pDb->interp
4d80: 2c 20 70 43 6d 64 2c 20 54 43 4c 5f 45 56 41 4c  , pCmd, TCL_EVAL
4d90: 5f 44 49 52 45 43 54 29 3b 0a 20 20 20 20 20 20  _DIRECT);.      
4da0: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
4db0: 28 70 43 6d 64 29 3b 0a 20 20 20 20 20 20 54 63  (pCmd);.      Tc
4dc0: 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28 70 44  l_ResetResult(pD
4dd0: 62 2d 3e 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  b->interp);.    
4de0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
4df0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
4e00: 52 41 43 45 5f 52 4f 57 3a 20 7b 0a 20 20 20 20  RACE_ROW: {.    
4e10: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
4e20: 70 53 74 6d 74 20 3d 20 28 73 71 6c 69 74 65 33  pStmt = (sqlite3
4e30: 5f 73 74 6d 74 20 2a 29 70 64 3b 0a 0a 20 20 20  _stmt *)pd;..   
4e40: 20 20 20 70 43 6d 64 20 3d 20 54 63 6c 5f 4e 65     pCmd = Tcl_Ne
4e50: 77 53 74 72 69 6e 67 4f 62 6a 28 70 44 62 2d 3e  wStringObj(pDb->
4e60: 7a 54 72 61 63 65 56 32 2c 20 2d 31 29 3b 0a 20  zTraceV2, -1);. 
4e70: 20 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66       Tcl_IncrRef
4e80: 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20 20  Count(pCmd);.   
4e90: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
4ea0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 70 44 62 2d  pendElement(pDb-
4eb0: 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c 0a 20  >interp, pCmd,. 
4ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54 63                Tc
4ee0: 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28  l_NewWideIntObj(
4ef0: 28 54 63 6c 5f 57 69 64 65 49 6e 74 29 70 53 74  (Tcl_WideInt)pSt
4f00: 6d 74 29 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f  mt));.      Tcl_
4f10: 45 76 61 6c 4f 62 6a 45 78 28 70 44 62 2d 3e 69  EvalObjEx(pDb->i
4f20: 6e 74 65 72 70 2c 20 70 43 6d 64 2c 20 54 43 4c  nterp, pCmd, TCL
4f30: 5f 45 56 41 4c 5f 44 49 52 45 43 54 29 3b 0a 20  _EVAL_DIRECT);. 
4f40: 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66       Tcl_DecrRef
4f50: 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20 20  Count(pCmd);.   
4f60: 20 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73 75     Tcl_ResetResu
4f70: 6c 74 28 70 44 62 2d 3e 69 6e 74 65 72 70 29 3b  lt(pDb->interp);
4f80: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
4f90: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
4fa0: 49 54 45 5f 54 52 41 43 45 5f 43 4c 4f 53 45 3a  ITE_TRACE_CLOSE:
4fb0: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
4fc0: 20 2a 64 62 20 3d 20 28 73 71 6c 69 74 65 33 20   *db = (sqlite3 
4fd0: 2a 29 70 64 3b 0a 0a 20 20 20 20 20 20 70 43 6d  *)pd;..      pCm
4fe0: 64 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  d = Tcl_NewStrin
4ff0: 67 4f 62 6a 28 70 44 62 2d 3e 7a 54 72 61 63 65  gObj(pDb->zTrace
5000: 56 32 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 54  V2, -1);.      T
5010: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
5020: 70 43 6d 64 29 3b 0a 20 20 20 20 20 20 54 63 6c  pCmd);.      Tcl
5030: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
5040: 65 6d 65 6e 74 28 70 44 62 2d 3e 69 6e 74 65 72  ement(pDb->inter
5050: 70 2c 20 70 43 6d 64 2c 0a 20 20 20 20 20 20 20  p, pCmd,.       
5060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5070: 20 20 20 20 20 20 20 20 54 63 6c 5f 4e 65 77 57          Tcl_NewW
5080: 69 64 65 49 6e 74 4f 62 6a 28 28 54 63 6c 5f 57  ideIntObj((Tcl_W
5090: 69 64 65 49 6e 74 29 64 62 29 29 3b 0a 20 20 20  ideInt)db));.   
50a0: 20 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78     Tcl_EvalObjEx
50b0: 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20 70 43  (pDb->interp, pC
50c0: 6d 64 2c 20 54 43 4c 5f 45 56 41 4c 5f 44 49 52  md, TCL_EVAL_DIR
50d0: 45 43 54 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f  ECT);.      Tcl_
50e0: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 43 6d  DecrRefCount(pCm
50f0: 64 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 52 65  d);.      Tcl_Re
5100: 73 65 74 52 65 73 75 6c 74 28 70 44 62 2d 3e 69  setResult(pDb->i
5110: 6e 74 65 72 70 29 3b 0a 20 20 20 20 20 20 62 72  nterp);.      br
5120: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
5130: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
5140: 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  K;.}.#endif..#if
5150: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
5160: 5f 4f 4d 49 54 5f 54 52 41 43 45 29 20 26 26 20  _OMIT_TRACE) && 
5170: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
5180: 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f  OMIT_FLOATING_PO
5190: 49 4e 54 29 20 26 26 20 5c 0a 20 20 20 20 21 64  INT) && \.    !d
51a0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
51b0: 49 54 5f 44 45 50 52 45 43 41 54 45 44 29 0a 2f  IT_DEPRECATED)./
51c0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
51d0: 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74  e is called by t
51e0: 68 65 20 53 51 4c 69 74 65 20 70 72 6f 66 69 6c  he SQLite profil
51f0: 65 20 68 61 6e 64 6c 65 72 20 61 66 74 65 72 20  e handler after 
5200: 61 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 53  a statement.** S
5210: 51 4c 20 68 61 73 20 65 78 65 63 75 74 65 64 2e  QL has executed.
5220: 20 20 54 68 65 20 54 43 4c 20 73 63 72 69 70 74    The TCL script
5230: 20 69 6e 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c   in pDb->zProfil
5240: 65 20 69 73 20 65 76 61 6c 75 61 74 65 64 2e 0a  e is evaluated..
5250: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 44  */.static void D
5260: 62 50 72 6f 66 69 6c 65 48 61 6e 64 6c 65 72 28  bProfileHandler(
5270: 76 6f 69 64 20 2a 63 64 2c 20 63 6f 6e 73 74 20  void *cd, const 
5280: 63 68 61 72 20 2a 7a 53 71 6c 2c 20 73 71 6c 69  char *zSql, sqli
5290: 74 65 5f 75 69 6e 74 36 34 20 74 6d 29 7b 0a 20  te_uint64 tm){. 
52a0: 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d   SqliteDb *pDb =
52b0: 20 28 53 71 6c 69 74 65 44 62 2a 29 63 64 3b 0a   (SqliteDb*)cd;.
52c0: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 73 74    Tcl_DString st
52d0: 72 3b 0a 20 20 63 68 61 72 20 7a 54 6d 5b 31 30  r;.  char zTm[10
52e0: 30 5d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73  0];..  sqlite3_s
52f0: 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a  nprintf(sizeof(z
5300: 54 6d 29 2d 31 2c 20 7a 54 6d 2c 20 22 25 6c 6c  Tm)-1, zTm, "%ll
5310: 64 22 2c 20 74 6d 29 3b 0a 20 20 54 63 6c 5f 44  d", tm);.  Tcl_D
5320: 53 74 72 69 6e 67 49 6e 69 74 28 26 73 74 72 29  StringInit(&str)
5330: 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41  ;.  Tcl_DStringA
5340: 70 70 65 6e 64 28 26 73 74 72 2c 20 70 44 62 2d  ppend(&str, pDb-
5350: 3e 7a 50 72 6f 66 69 6c 65 2c 20 2d 31 29 3b 0a  >zProfile, -1);.
5360: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70    Tcl_DStringApp
5370: 65 6e 64 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c  endElement(&str,
5380: 20 7a 53 71 6c 29 3b 0a 20 20 54 63 6c 5f 44 53   zSql);.  Tcl_DS
5390: 74 72 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65  tringAppendEleme
53a0: 6e 74 28 26 73 74 72 2c 20 7a 54 6d 29 3b 0a 20  nt(&str, zTm);. 
53b0: 20 54 63 6c 5f 45 76 61 6c 28 70 44 62 2d 3e 69   Tcl_Eval(pDb->i
53c0: 6e 74 65 72 70 2c 20 54 63 6c 5f 44 53 74 72 69  nterp, Tcl_DStri
53d0: 6e 67 56 61 6c 75 65 28 26 73 74 72 29 29 3b 0a  ngValue(&str));.
53e0: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65    Tcl_DStringFre
53f0: 65 28 26 73 74 72 29 3b 0a 20 20 54 63 6c 5f 52  e(&str);.  Tcl_R
5400: 65 73 65 74 52 65 73 75 6c 74 28 70 44 62 2d 3e  esetResult(pDb->
5410: 69 6e 74 65 72 70 29 3b 0a 7d 0a 23 65 6e 64 69  interp);.}.#endi
5420: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  f../*.** This ro
5430: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
5440: 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69  when a transacti
5450: 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2e  on is committed.
5460: 20 20 54 68 65 0a 2a 2a 20 54 43 4c 20 73 63 72    The.** TCL scr
5470: 69 70 74 20 69 6e 20 70 44 62 2d 3e 7a 43 6f 6d  ipt in pDb->zCom
5480: 6d 69 74 20 69 73 20 65 78 65 63 75 74 65 64 2e  mit is executed.
5490: 20 20 49 66 20 69 74 20 72 65 74 75 72 6e 73 20    If it returns 
54a0: 6e 6f 6e 2d 7a 65 72 6f 20 6f 72 0a 2a 2a 20 69  non-zero or.** i
54b0: 66 20 69 74 20 74 68 72 6f 77 73 20 61 6e 20 65  f it throws an e
54c0: 78 63 65 70 74 69 6f 6e 2c 20 74 68 65 20 74 72  xception, the tr
54d0: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c  ansaction is rol
54e0: 6c 65 64 20 62 61 63 6b 20 69 6e 73 74 65 61 64  led back instead
54f0: 0a 2a 2a 20 6f 66 20 62 65 69 6e 67 20 63 6f 6d  .** of being com
5500: 6d 69 74 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  mitted..*/.stati
5510: 63 20 69 6e 74 20 44 62 43 6f 6d 6d 69 74 48 61  c int DbCommitHa
5520: 6e 64 6c 65 72 28 76 6f 69 64 20 2a 63 64 29 7b  ndler(void *cd){
5530: 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62  .  SqliteDb *pDb
5540: 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 63 64   = (SqliteDb*)cd
5550: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 72  ;.  int rc;..  r
5560: 63 20 3d 20 54 63 6c 5f 45 76 61 6c 28 70 44 62  c = Tcl_Eval(pDb
5570: 2d 3e 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a  ->interp, pDb->z
5580: 43 6f 6d 6d 69 74 29 3b 0a 20 20 69 66 28 20 72  Commit);.  if( r
5590: 63 21 3d 54 43 4c 5f 4f 4b 20 7c 7c 20 61 74 6f  c!=TCL_OK || ato
55a0: 69 28 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52  i(Tcl_GetStringR
55b0: 65 73 75 6c 74 28 70 44 62 2d 3e 69 6e 74 65 72  esult(pDb->inter
55c0: 70 29 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  p)) ){.    retur
55d0: 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 1;.  }.  retur
55e0: 6e 20 30 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76  n 0;.}..static v
55f0: 6f 69 64 20 44 62 52 6f 6c 6c 62 61 63 6b 48 61  oid DbRollbackHa
5600: 6e 64 6c 65 72 28 76 6f 69 64 20 2a 63 6c 69 65  ndler(void *clie
5610: 6e 74 44 61 74 61 29 7b 0a 20 20 53 71 6c 69 74  ntData){.  Sqlit
5620: 65 44 62 20 2a 70 44 62 20 3d 20 28 53 71 6c 69  eDb *pDb = (Sqli
5630: 74 65 44 62 2a 29 63 6c 69 65 6e 74 44 61 74 61  teDb*)clientData
5640: 3b 0a 20 20 61 73 73 65 72 74 28 70 44 62 2d 3e  ;.  assert(pDb->
5650: 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 29 3b 0a  pRollbackHook);.
5660: 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63    if( TCL_OK!=Tc
5670: 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70 44 62 2d  l_EvalObjEx(pDb-
5680: 3e 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 70 52  >interp, pDb->pR
5690: 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 2c 20 30 29 20  ollbackHook, 0) 
56a0: 29 7b 0a 20 20 20 20 54 63 6c 5f 42 61 63 6b 67  ){.    Tcl_Backg
56b0: 72 6f 75 6e 64 45 72 72 6f 72 28 70 44 62 2d 3e  roundError(pDb->
56c0: 69 6e 74 65 72 70 29 3b 0a 20 20 7d 0a 7d 0a 0a  interp);.  }.}..
56d0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 70 72 6f 63 65  /*.** This proce
56e0: 64 75 72 65 20 68 61 6e 64 6c 65 73 20 77 61 6c  dure handles wal
56f0: 5f 68 6f 6f 6b 20 63 61 6c 6c 62 61 63 6b 73 2e  _hook callbacks.
5700: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 44  .*/.static int D
5710: 62 57 61 6c 48 61 6e 64 6c 65 72 28 0a 20 20 76  bWalHandler(.  v
5720: 6f 69 64 20 2a 63 6c 69 65 6e 74 44 61 74 61 2c  oid *clientData,
5730: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a  .  sqlite3 *db,.
5740: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
5750: 62 2c 0a 20 20 69 6e 74 20 6e 45 6e 74 72 79 0a  b,.  int nEntry.
5760: 29 7b 0a 20 20 69 6e 74 20 72 65 74 20 3d 20 53  ){.  int ret = S
5770: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 54 63 6c 5f  QLITE_OK;.  Tcl_
5780: 4f 62 6a 20 2a 70 3b 0a 20 20 53 71 6c 69 74 65  Obj *p;.  Sqlite
5790: 44 62 20 2a 70 44 62 20 3d 20 28 53 71 6c 69 74  Db *pDb = (Sqlit
57a0: 65 44 62 2a 29 63 6c 69 65 6e 74 44 61 74 61 3b  eDb*)clientData;
57b0: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
57c0: 6e 74 65 72 70 20 3d 20 70 44 62 2d 3e 69 6e 74  nterp = pDb->int
57d0: 65 72 70 3b 0a 20 20 61 73 73 65 72 74 28 70 44  erp;.  assert(pD
57e0: 62 2d 3e 70 57 61 6c 48 6f 6f 6b 29 3b 0a 0a 20  b->pWalHook);.. 
57f0: 20 61 73 73 65 72 74 28 20 64 62 3d 3d 70 44 62   assert( db==pDb
5800: 2d 3e 64 62 20 29 3b 0a 20 20 70 20 3d 20 54 63  ->db );.  p = Tc
5810: 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 70  l_DuplicateObj(p
5820: 44 62 2d 3e 70 57 61 6c 48 6f 6f 6b 29 3b 0a 20  Db->pWalHook);. 
5830: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
5840: 74 28 70 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74  t(p);.  Tcl_List
5850: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
5860: 28 69 6e 74 65 72 70 2c 20 70 2c 20 54 63 6c 5f  (interp, p, Tcl_
5870: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 44 62  NewStringObj(zDb
5880: 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69  , -1));.  Tcl_Li
5890: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
58a0: 6e 74 28 69 6e 74 65 72 70 2c 20 70 2c 20 54 63  nt(interp, p, Tc
58b0: 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 6e 45 6e 74  l_NewIntObj(nEnt
58c0: 72 79 29 29 3b 0a 20 20 69 66 28 20 54 43 4c 5f  ry));.  if( TCL_
58d0: 4f 4b 21 3d 54 63 6c 5f 45 76 61 6c 4f 62 6a 45  OK!=Tcl_EvalObjE
58e0: 78 28 69 6e 74 65 72 70 2c 20 70 2c 20 30 29 0a  x(interp, p, 0).
58f0: 20 20 20 7c 7c 20 54 43 4c 5f 4f 4b 21 3d 54 63     || TCL_OK!=Tc
5900: 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
5910: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 4f  interp, Tcl_GetO
5920: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29  bjResult(interp)
5930: 2c 20 26 72 65 74 29 0a 20 20 29 7b 0a 20 20 20  , &ret).  ){.   
5940: 20 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45   Tcl_BackgroundE
5950: 72 72 6f 72 28 69 6e 74 65 72 70 29 3b 0a 20 20  rror(interp);.  
5960: 7d 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43  }.  Tcl_DecrRefC
5970: 6f 75 6e 74 28 70 29 3b 0a 0a 20 20 72 65 74 75  ount(p);..  retu
5980: 72 6e 20 72 65 74 3b 0a 7d 0a 0a 23 69 66 20 64  rn ret;.}..#if d
5990: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45  efined(SQLITE_TE
59a0: 53 54 29 20 26 26 20 64 65 66 69 6e 65 64 28 53  ST) && defined(S
59b0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 55 4e 4c  QLITE_ENABLE_UNL
59c0: 4f 43 4b 5f 4e 4f 54 49 46 59 29 0a 73 74 61 74  OCK_NOTIFY).stat
59d0: 69 63 20 76 6f 69 64 20 73 65 74 54 65 73 74 55  ic void setTestU
59e0: 6e 6c 6f 63 6b 4e 6f 74 69 66 79 56 61 72 73 28  nlockNotifyVars(
59f0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
5a00: 72 70 2c 20 69 6e 74 20 69 41 72 67 2c 20 69 6e  rp, int iArg, in
5a10: 74 20 6e 41 72 67 29 7b 0a 20 20 63 68 61 72 20  t nArg){.  char 
5a20: 7a 42 75 66 5b 36 34 5d 3b 0a 20 20 73 71 6c 69  zBuf[64];.  sqli
5a30: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
5a40: 65 6f 66 28 7a 42 75 66 29 2c 20 7a 42 75 66 2c  eof(zBuf), zBuf,
5a50: 20 22 25 64 22 2c 20 69 41 72 67 29 3b 0a 20 20   "%d", iArg);.  
5a60: 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72  Tcl_SetVar(inter
5a70: 70 2c 20 22 73 71 6c 69 74 65 5f 75 6e 6c 6f 63  p, "sqlite_unloc
5a80: 6b 5f 6e 6f 74 69 66 79 5f 61 72 67 22 2c 20 7a  k_notify_arg", z
5a90: 42 75 66 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f  Buf, TCL_GLOBAL_
5aa0: 4f 4e 4c 59 29 3b 0a 20 20 73 71 6c 69 74 65 33  ONLY);.  sqlite3
5ab0: 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
5ac0: 28 7a 42 75 66 29 2c 20 7a 42 75 66 2c 20 22 25  (zBuf), zBuf, "%
5ad0: 64 22 2c 20 6e 41 72 67 29 3b 0a 20 20 54 63 6c  d", nArg);.  Tcl
5ae0: 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c 20  _SetVar(interp, 
5af0: 22 73 71 6c 69 74 65 5f 75 6e 6c 6f 63 6b 5f 6e  "sqlite_unlock_n
5b00: 6f 74 69 66 79 5f 61 72 67 63 6f 75 6e 74 22 2c  otify_argcount",
5b10: 20 7a 42 75 66 2c 20 54 43 4c 5f 47 4c 4f 42 41   zBuf, TCL_GLOBA
5b20: 4c 5f 4f 4e 4c 59 29 3b 0a 7d 0a 23 65 6c 73 65  L_ONLY);.}.#else
5b30: 0a 23 20 64 65 66 69 6e 65 20 73 65 74 54 65 73  .# define setTes
5b40: 74 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 56 61 72  tUnlockNotifyVar
5b50: 73 28 78 2c 79 2c 7a 29 0a 23 65 6e 64 69 66 0a  s(x,y,z).#endif.
5b60: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
5b70: 4e 41 42 4c 45 5f 55 4e 4c 4f 43 4b 5f 4e 4f 54  NABLE_UNLOCK_NOT
5b80: 49 46 59 0a 73 74 61 74 69 63 20 76 6f 69 64 20  IFY.static void 
5b90: 44 62 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 28 76  DbUnlockNotify(v
5ba0: 6f 69 64 20 2a 2a 61 70 41 72 67 2c 20 69 6e 74  oid **apArg, int
5bb0: 20 6e 41 72 67 29 7b 0a 20 20 69 6e 74 20 69 3b   nArg){.  int i;
5bc0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41  .  for(i=0; i<nA
5bd0: 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6f  rg; i++){.    co
5be0: 6e 73 74 20 69 6e 74 20 66 6c 61 67 73 20 3d 20  nst int flags = 
5bf0: 28 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c  (TCL_EVAL_GLOBAL
5c00: 7c 54 43 4c 5f 45 56 41 4c 5f 44 49 52 45 43 54  |TCL_EVAL_DIRECT
5c10: 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 44 62 20  );.    SqliteDb 
5c20: 2a 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62  *pDb = (SqliteDb
5c30: 20 2a 29 61 70 41 72 67 5b 69 5d 3b 0a 20 20 20   *)apArg[i];.   
5c40: 20 73 65 74 54 65 73 74 55 6e 6c 6f 63 6b 4e 6f   setTestUnlockNo
5c50: 74 69 66 79 56 61 72 73 28 70 44 62 2d 3e 69 6e  tifyVars(pDb->in
5c60: 74 65 72 70 2c 20 69 2c 20 6e 41 72 67 29 3b 0a  terp, i, nArg);.
5c70: 20 20 20 20 61 73 73 65 72 74 28 20 70 44 62 2d      assert( pDb-
5c80: 3e 70 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 29 3b  >pUnlockNotify);
5c90: 0a 20 20 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a  .    Tcl_EvalObj
5ca0: 45 78 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20  Ex(pDb->interp, 
5cb0: 70 44 62 2d 3e 70 55 6e 6c 6f 63 6b 4e 6f 74 69  pDb->pUnlockNoti
5cc0: 66 79 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20  fy, flags);.    
5cd0: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
5ce0: 28 70 44 62 2d 3e 70 55 6e 6c 6f 63 6b 4e 6f 74  (pDb->pUnlockNot
5cf0: 69 66 79 29 3b 0a 20 20 20 20 70 44 62 2d 3e 70  ify);.    pDb->p
5d00: 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 20 3d 20 30  UnlockNotify = 0
5d10: 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ;.  }.}.#endif..
5d20: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
5d30: 41 42 4c 45 5f 50 52 45 55 50 44 41 54 45 5f 48  ABLE_PREUPDATE_H
5d40: 4f 4f 4b 0a 2f 2a 0a 2a 2a 20 50 72 65 2d 75 70  OOK./*.** Pre-up
5d50: 64 61 74 65 20 68 6f 6f 6b 20 63 61 6c 6c 62 61  date hook callba
5d60: 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ck..*/.static vo
5d70: 69 64 20 44 62 50 72 65 55 70 64 61 74 65 48 61  id DbPreUpdateHa
5d80: 6e 64 6c 65 72 28 0a 20 20 76 6f 69 64 20 2a 70  ndler(.  void *p
5d90: 2c 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  ,.  sqlite3 *db,
5da0: 0a 20 20 69 6e 74 20 6f 70 2c 0a 20 20 63 6f 6e  .  int op,.  con
5db0: 73 74 20 63 68 61 72 20 2a 7a 44 62 2c 0a 20 20  st char *zDb,.  
5dc0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 62 6c  const char *zTbl
5dd0: 2c 0a 20 20 73 71 6c 69 74 65 5f 69 6e 74 36 34  ,.  sqlite_int64
5de0: 20 69 4b 65 79 31 2c 0a 20 20 73 71 6c 69 74 65   iKey1,.  sqlite
5df0: 5f 69 6e 74 36 34 20 69 4b 65 79 32 0a 29 7b 0a  _int64 iKey2.){.
5e00: 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20    SqliteDb *pDb 
5e10: 3d 20 28 53 71 6c 69 74 65 44 62 20 2a 29 70 3b  = (SqliteDb *)p;
5e20: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 43 6d 64  .  Tcl_Obj *pCmd
5e30: 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  ;.  static const
5e40: 20 63 68 61 72 20 2a 61 7a 53 74 72 5b 5d 20 3d   char *azStr[] =
5e50: 20 7b 22 44 45 4c 45 54 45 22 2c 20 22 49 4e 53   {"DELETE", "INS
5e60: 45 52 54 22 2c 20 22 55 50 44 41 54 45 22 7d 3b  ERT", "UPDATE"};
5e70: 0a 0a 20 20 61 73 73 65 72 74 28 20 28 53 51 4c  ..  assert( (SQL
5e80: 49 54 45 5f 44 45 4c 45 54 45 2d 31 29 2f 39 20  ITE_DELETE-1)/9 
5e90: 3d 3d 20 30 20 29 3b 0a 20 20 61 73 73 65 72 74  == 0 );.  assert
5ea0: 28 20 28 53 51 4c 49 54 45 5f 49 4e 53 45 52 54  ( (SQLITE_INSERT
5eb0: 2d 31 29 2f 39 20 3d 3d 20 31 20 29 3b 0a 20 20  -1)/9 == 1 );.  
5ec0: 61 73 73 65 72 74 28 20 28 53 51 4c 49 54 45 5f  assert( (SQLITE_
5ed0: 55 50 44 41 54 45 2d 31 29 2f 39 20 3d 3d 20 32  UPDATE-1)/9 == 2
5ee0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44   );.  assert( pD
5ef0: 62 2d 3e 70 50 72 65 55 70 64 61 74 65 48 6f 6f  b->pPreUpdateHoo
5f00: 6b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64  k );.  assert( d
5f10: 62 3d 3d 70 44 62 2d 3e 64 62 20 29 3b 0a 20 20  b==pDb->db );.  
5f20: 61 73 73 65 72 74 28 20 6f 70 3d 3d 53 51 4c 49  assert( op==SQLI
5f30: 54 45 5f 49 4e 53 45 52 54 20 7c 7c 20 6f 70 3d  TE_INSERT || op=
5f40: 3d 53 51 4c 49 54 45 5f 55 50 44 41 54 45 20 7c  =SQLITE_UPDATE |
5f50: 7c 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 44 45 4c  | op==SQLITE_DEL
5f60: 45 54 45 20 29 3b 0a 0a 20 20 70 43 6d 64 20 3d  ETE );..  pCmd =
5f70: 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62   Tcl_DuplicateOb
5f80: 6a 28 70 44 62 2d 3e 70 50 72 65 55 70 64 61 74  j(pDb->pPreUpdat
5f90: 65 48 6f 6f 6b 29 3b 0a 20 20 54 63 6c 5f 49 6e  eHook);.  Tcl_In
5fa0: 63 72 52 65 66 43 6f 75 6e 74 28 70 43 6d 64 29  crRefCount(pCmd)
5fb0: 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  ;.  Tcl_ListObjA
5fc0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20  ppendElement(0, 
5fd0: 70 43 6d 64 2c 20 54 63 6c 5f 4e 65 77 53 74 72  pCmd, Tcl_NewStr
5fe0: 69 6e 67 4f 62 6a 28 61 7a 53 74 72 5b 28 6f 70  ingObj(azStr[(op
5ff0: 2d 31 29 2f 39 5d 2c 20 2d 31 29 29 3b 0a 20 20  -1)/9], -1));.  
6000: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
6010: 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 43 6d 64  dElement(0, pCmd
6020: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
6030: 62 6a 28 7a 44 62 2c 20 2d 31 29 29 3b 0a 20 20  bj(zDb, -1));.  
6040: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
6050: 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 43 6d 64  dElement(0, pCmd
6060: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
6070: 62 6a 28 7a 54 62 6c 2c 20 2d 31 29 29 3b 0a 20  bj(zTbl, -1));. 
6080: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
6090: 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 43 6d  ndElement(0, pCm
60a0: 64 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e  d, Tcl_NewWideIn
60b0: 74 4f 62 6a 28 69 4b 65 79 31 29 29 3b 0a 20 20  tObj(iKey1));.  
60c0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
60d0: 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 43 6d 64  dElement(0, pCmd
60e0: 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74  , Tcl_NewWideInt
60f0: 4f 62 6a 28 69 4b 65 79 32 29 29 3b 0a 20 20 54  Obj(iKey2));.  T
6100: 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70 44 62  cl_EvalObjEx(pDb
6110: 2d 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c 20  ->interp, pCmd, 
6120: 54 43 4c 5f 45 56 41 4c 5f 44 49 52 45 43 54 29  TCL_EVAL_DIRECT)
6130: 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43  ;.  Tcl_DecrRefC
6140: 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 7d 0a 23 65  ount(pCmd);.}.#e
6150: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45  ndif /* SQLITE_E
6160: 4e 41 42 4c 45 5f 50 52 45 55 50 44 41 54 45 5f  NABLE_PREUPDATE_
6170: 48 4f 4f 4b 20 2a 2f 0a 0a 73 74 61 74 69 63 20  HOOK */..static 
6180: 76 6f 69 64 20 44 62 55 70 64 61 74 65 48 61 6e  void DbUpdateHan
6190: 64 6c 65 72 28 0a 20 20 76 6f 69 64 20 2a 70 2c  dler(.  void *p,
61a0: 0a 20 20 69 6e 74 20 6f 70 2c 0a 20 20 63 6f 6e  .  int op,.  con
61b0: 73 74 20 63 68 61 72 20 2a 7a 44 62 2c 0a 20 20  st char *zDb,.  
61c0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 62 6c  const char *zTbl
61d0: 2c 0a 20 20 73 71 6c 69 74 65 5f 69 6e 74 36 34  ,.  sqlite_int64
61e0: 20 72 6f 77 69 64 0a 29 7b 0a 20 20 53 71 6c 69   rowid.){.  Sqli
61f0: 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53 71 6c  teDb *pDb = (Sql
6200: 69 74 65 44 62 20 2a 29 70 3b 0a 20 20 54 63 6c  iteDb *)p;.  Tcl
6210: 5f 4f 62 6a 20 2a 70 43 6d 64 3b 0a 20 20 73 74  _Obj *pCmd;.  st
6220: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
6230: 2a 61 7a 53 74 72 5b 5d 20 3d 20 7b 22 44 45 4c  *azStr[] = {"DEL
6240: 45 54 45 22 2c 20 22 49 4e 53 45 52 54 22 2c 20  ETE", "INSERT", 
6250: 22 55 50 44 41 54 45 22 7d 3b 0a 0a 20 20 61 73  "UPDATE"};..  as
6260: 73 65 72 74 28 20 28 53 51 4c 49 54 45 5f 44 45  sert( (SQLITE_DE
6270: 4c 45 54 45 2d 31 29 2f 39 20 3d 3d 20 30 20 29  LETE-1)/9 == 0 )
6280: 3b 0a 20 20 61 73 73 65 72 74 28 20 28 53 51 4c  ;.  assert( (SQL
6290: 49 54 45 5f 49 4e 53 45 52 54 2d 31 29 2f 39 20  ITE_INSERT-1)/9 
62a0: 3d 3d 20 31 20 29 3b 0a 20 20 61 73 73 65 72 74  == 1 );.  assert
62b0: 28 20 28 53 51 4c 49 54 45 5f 55 50 44 41 54 45  ( (SQLITE_UPDATE
62c0: 2d 31 29 2f 39 20 3d 3d 20 32 20 29 3b 0a 0a 20  -1)/9 == 2 );.. 
62d0: 20 61 73 73 65 72 74 28 20 70 44 62 2d 3e 70 55   assert( pDb->pU
62e0: 70 64 61 74 65 48 6f 6f 6b 20 29 3b 0a 20 20 61  pdateHook );.  a
62f0: 73 73 65 72 74 28 20 6f 70 3d 3d 53 51 4c 49 54  ssert( op==SQLIT
6300: 45 5f 49 4e 53 45 52 54 20 7c 7c 20 6f 70 3d 3d  E_INSERT || op==
6310: 53 51 4c 49 54 45 5f 55 50 44 41 54 45 20 7c 7c  SQLITE_UPDATE ||
6320: 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 44 45 4c 45   op==SQLITE_DELE
6330: 54 45 20 29 3b 0a 0a 20 20 70 43 6d 64 20 3d 20  TE );..  pCmd = 
6340: 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a  Tcl_DuplicateObj
6350: 28 70 44 62 2d 3e 70 55 70 64 61 74 65 48 6f 6f  (pDb->pUpdateHoo
6360: 6b 29 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65  k);.  Tcl_IncrRe
6370: 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20  fCount(pCmd);.  
6380: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
6390: 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 43 6d 64  dElement(0, pCmd
63a0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
63b0: 62 6a 28 61 7a 53 74 72 5b 28 6f 70 2d 31 29 2f  bj(azStr[(op-1)/
63c0: 39 5d 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f  9], -1));.  Tcl_
63d0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
63e0: 6d 65 6e 74 28 30 2c 20 70 43 6d 64 2c 20 54 63  ment(0, pCmd, Tc
63f0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a  l_NewStringObj(z
6400: 44 62 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f  Db, -1));.  Tcl_
6410: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
6420: 6d 65 6e 74 28 30 2c 20 70 43 6d 64 2c 20 54 63  ment(0, pCmd, Tc
6430: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a  l_NewStringObj(z
6440: 54 62 6c 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c  Tbl, -1));.  Tcl
6450: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
6460: 65 6d 65 6e 74 28 30 2c 20 70 43 6d 64 2c 20 54  ement(0, pCmd, T
6470: 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a  cl_NewWideIntObj
6480: 28 72 6f 77 69 64 29 29 3b 0a 20 20 54 63 6c 5f  (rowid));.  Tcl_
6490: 45 76 61 6c 4f 62 6a 45 78 28 70 44 62 2d 3e 69  EvalObjEx(pDb->i
64a0: 6e 74 65 72 70 2c 20 70 43 6d 64 2c 20 54 43 4c  nterp, pCmd, TCL
64b0: 5f 45 56 41 4c 5f 44 49 52 45 43 54 29 3b 0a 20  _EVAL_DIRECT);. 
64c0: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
64d0: 74 28 70 43 6d 64 29 3b 0a 7d 0a 0a 73 74 61 74  t(pCmd);.}..stat
64e0: 69 63 20 76 6f 69 64 20 74 63 6c 43 6f 6c 6c 61  ic void tclColla
64f0: 74 65 4e 65 65 64 65 64 28 0a 20 20 76 6f 69 64  teNeeded(.  void
6500: 20 2a 70 43 74 78 2c 0a 20 20 73 71 6c 69 74 65   *pCtx,.  sqlite
6510: 33 20 2a 64 62 2c 0a 20 20 69 6e 74 20 65 6e 63  3 *db,.  int enc
6520: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
6530: 7a 4e 61 6d 65 0a 29 7b 0a 20 20 53 71 6c 69 74  zName.){.  Sqlit
6540: 65 44 62 20 2a 70 44 62 20 3d 20 28 53 71 6c 69  eDb *pDb = (Sqli
6550: 74 65 44 62 20 2a 29 70 43 74 78 3b 0a 20 20 54  teDb *)pCtx;.  T
6560: 63 6c 5f 4f 62 6a 20 2a 70 53 63 72 69 70 74 20  cl_Obj *pScript 
6570: 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f  = Tcl_DuplicateO
6580: 62 6a 28 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65  bj(pDb->pCollate
6590: 4e 65 65 64 65 64 29 3b 0a 20 20 54 63 6c 5f 49  Needed);.  Tcl_I
65a0: 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 53 63 72  ncrRefCount(pScr
65b0: 69 70 74 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74  ipt);.  Tcl_List
65c0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
65d0: 28 30 2c 20 70 53 63 72 69 70 74 2c 20 54 63 6c  (0, pScript, Tcl
65e0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 4e  _NewStringObj(zN
65f0: 61 6d 65 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c  ame, -1));.  Tcl
6600: 5f 45 76 61 6c 4f 62 6a 45 78 28 70 44 62 2d 3e  _EvalObjEx(pDb->
6610: 69 6e 74 65 72 70 2c 20 70 53 63 72 69 70 74 2c  interp, pScript,
6620: 20 30 29 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52   0);.  Tcl_DecrR
6630: 65 66 43 6f 75 6e 74 28 70 53 63 72 69 70 74 29  efCount(pScript)
6640: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
6650: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
6660: 64 20 74 6f 20 65 76 61 6c 75 61 74 65 20 61 6e  d to evaluate an
6670: 20 53 51 4c 20 63 6f 6c 6c 61 74 69 6f 6e 20 66   SQL collation f
6680: 75 6e 63 74 69 6f 6e 20 69 6d 70 6c 65 6d 65 6e  unction implemen
6690: 74 65 64 0a 2a 2a 20 75 73 69 6e 67 20 54 43 4c  ted.** using TCL
66a0: 20 73 63 72 69 70 74 2e 0a 2a 2f 0a 73 74 61 74   script..*/.stat
66b0: 69 63 20 69 6e 74 20 74 63 6c 53 71 6c 43 6f 6c  ic int tclSqlCol
66c0: 6c 61 74 65 28 0a 20 20 76 6f 69 64 20 2a 70 43  late(.  void *pC
66d0: 74 78 2c 0a 20 20 69 6e 74 20 6e 41 2c 0a 20 20  tx,.  int nA,.  
66e0: 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 41 2c 0a  const void *zA,.
66f0: 20 20 69 6e 74 20 6e 42 2c 0a 20 20 63 6f 6e 73    int nB,.  cons
6700: 74 20 76 6f 69 64 20 2a 7a 42 0a 29 7b 0a 20 20  t void *zB.){.  
6710: 53 71 6c 43 6f 6c 6c 61 74 65 20 2a 70 20 3d 20  SqlCollate *p = 
6720: 28 53 71 6c 43 6f 6c 6c 61 74 65 20 2a 29 70 43  (SqlCollate *)pC
6730: 74 78 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  tx;.  Tcl_Obj *p
6740: 43 6d 64 3b 0a 0a 20 20 70 43 6d 64 20 3d 20 54  Cmd;..  pCmd = T
6750: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
6760: 70 2d 3e 7a 53 63 72 69 70 74 2c 20 2d 31 29 3b  p->zScript, -1);
6770: 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f  .  Tcl_IncrRefCo
6780: 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20 54 63 6c  unt(pCmd);.  Tcl
6790: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
67a0: 65 6d 65 6e 74 28 70 2d 3e 69 6e 74 65 72 70 2c  ement(p->interp,
67b0: 20 70 43 6d 64 2c 20 54 63 6c 5f 4e 65 77 53 74   pCmd, Tcl_NewSt
67c0: 72 69 6e 67 4f 62 6a 28 7a 41 2c 20 6e 41 29 29  ringObj(zA, nA))
67d0: 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  ;.  Tcl_ListObjA
67e0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 70 2d 3e  ppendElement(p->
67f0: 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c 20 54 63  interp, pCmd, Tc
6800: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a  l_NewStringObj(z
6810: 42 2c 20 6e 42 29 29 3b 0a 20 20 54 63 6c 5f 45  B, nB));.  Tcl_E
6820: 76 61 6c 4f 62 6a 45 78 28 70 2d 3e 69 6e 74 65  valObjEx(p->inte
6830: 72 70 2c 20 70 43 6d 64 2c 20 54 43 4c 5f 45 56  rp, pCmd, TCL_EV
6840: 41 4c 5f 44 49 52 45 43 54 29 3b 0a 20 20 54 63  AL_DIRECT);.  Tc
6850: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70  l_DecrRefCount(p
6860: 43 6d 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 28  Cmd);.  return (
6870: 61 74 6f 69 28 54 63 6c 5f 47 65 74 53 74 72 69  atoi(Tcl_GetStri
6880: 6e 67 52 65 73 75 6c 74 28 70 2d 3e 69 6e 74 65  ngResult(p->inte
6890: 72 70 29 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rp)));.}../*.** 
68a0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
68b0: 63 61 6c 6c 65 64 20 74 6f 20 65 76 61 6c 75 61  called to evalua
68c0: 74 65 20 61 6e 20 53 51 4c 20 66 75 6e 63 74 69  te an SQL functi
68d0: 6f 6e 20 69 6d 70 6c 65 6d 65 6e 74 65 64 0a 2a  on implemented.*
68e0: 2a 20 75 73 69 6e 67 20 54 43 4c 20 73 63 72 69  * using TCL scri
68f0: 70 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  pt..*/.static vo
6900: 69 64 20 74 63 6c 53 71 6c 46 75 6e 63 28 73 71  id tclSqlFunc(sq
6910: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
6920: 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63  ontext, int argc
6930: 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a  , sqlite3_value*
6940: 2a 61 72 67 76 29 7b 0a 20 20 53 71 6c 46 75 6e  *argv){.  SqlFun
6950: 63 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 5f 75  c *p = sqlite3_u
6960: 73 65 72 5f 64 61 74 61 28 63 6f 6e 74 65 78 74  ser_data(context
6970: 29 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 43  );.  Tcl_Obj *pC
6980: 6d 64 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  md;.  int i;.  i
6990: 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 61 72  nt rc;..  if( ar
69a0: 67 63 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  gc==0 ){.    /* 
69b0: 49 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  If there are no 
69c0: 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 74 68 65  arguments to the
69d0: 20 66 75 6e 63 74 69 6f 6e 2c 20 63 61 6c 6c 20   function, call 
69e0: 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 20 6f 6e  Tcl_EvalObjEx on
69f0: 20 74 68 65 0a 20 20 20 20 2a 2a 20 73 63 72 69   the.    ** scri
6a00: 70 74 20 6f 62 6a 65 63 74 20 64 69 72 65 63 74  pt object direct
6a10: 6c 79 2e 20 20 54 68 69 73 20 61 6c 6c 6f 77 73  ly.  This allows
6a20: 20 74 68 65 20 54 43 4c 20 63 6f 6d 70 69 6c 65   the TCL compile
6a30: 72 20 74 6f 20 67 65 6e 65 72 61 74 65 0a 20 20  r to generate.  
6a40: 20 20 2a 2a 20 62 79 74 65 63 6f 64 65 20 66 6f    ** bytecode fo
6a50: 72 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6f 6e  r the command on
6a60: 20 74 68 65 20 66 69 72 73 74 20 69 6e 76 6f 63   the first invoc
6a70: 61 74 69 6f 6e 20 61 6e 64 20 74 68 75 73 20 6d  ation and thus m
6a80: 61 6b 65 0a 20 20 20 20 2a 2a 20 73 75 62 73 65  ake.    ** subse
6a90: 71 75 65 6e 74 20 69 6e 76 6f 63 61 74 69 6f 6e  quent invocation
6aa0: 73 20 6d 75 63 68 20 66 61 73 74 65 72 2e 20 2a  s much faster. *
6ab0: 2f 0a 20 20 20 20 70 43 6d 64 20 3d 20 70 2d 3e  /.    pCmd = p->
6ac0: 70 53 63 72 69 70 74 3b 0a 20 20 20 20 54 63 6c  pScript;.    Tcl
6ad0: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 43  _IncrRefCount(pC
6ae0: 6d 64 29 3b 0a 20 20 20 20 72 63 20 3d 20 54 63  md);.    rc = Tc
6af0: 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70 2d 3e 69  l_EvalObjEx(p->i
6b00: 6e 74 65 72 70 2c 20 70 43 6d 64 2c 20 30 29 3b  nterp, pCmd, 0);
6b10: 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66  .    Tcl_DecrRef
6b20: 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20 7d  Count(pCmd);.  }
6b30: 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20  else{.    /* If 
6b40: 74 68 65 72 65 20 61 72 65 20 61 72 67 75 6d 65  there are argume
6b50: 6e 74 73 20 74 6f 20 74 68 65 20 66 75 6e 63 74  nts to the funct
6b60: 69 6f 6e 2c 20 6d 61 6b 65 20 61 20 73 68 61 6c  ion, make a shal
6b70: 6c 6f 77 20 63 6f 70 79 20 6f 66 20 74 68 65 0a  low copy of the.
6b80: 20 20 20 20 2a 2a 20 73 63 72 69 70 74 20 6f 62      ** script ob
6b90: 6a 65 63 74 2c 20 6c 61 70 70 65 6e 64 20 74 68  ject, lappend th
6ba0: 65 20 61 72 67 75 6d 65 6e 74 73 2c 20 74 68 65  e arguments, the
6bb0: 6e 20 65 76 61 6c 75 61 74 65 20 74 68 65 20 63  n evaluate the c
6bc0: 6f 70 79 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  opy..    **.    
6bd0: 2a 2a 20 42 79 20 22 73 68 61 6c 6c 6f 77 22 20  ** By "shallow" 
6be0: 63 6f 70 79 2c 20 77 65 20 6d 65 61 6e 20 6f 6e  copy, we mean on
6bf0: 6c 79 20 74 68 65 20 6f 75 74 65 72 20 6c 69 73  ly the outer lis
6c00: 74 20 54 63 6c 5f 4f 62 6a 20 69 73 20 64 75 70  t Tcl_Obj is dup
6c10: 6c 69 63 61 74 65 64 2e 0a 20 20 20 20 2a 2a 20  licated..    ** 
6c20: 54 68 65 20 6e 65 77 20 54 63 6c 5f 4f 62 6a 20  The new Tcl_Obj 
6c30: 63 6f 6e 74 61 69 6e 73 20 70 6f 69 6e 74 65 72  contains pointer
6c40: 73 20 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61  s to the origina
6c50: 6c 20 6c 69 73 74 20 65 6c 65 6d 65 6e 74 73 2e  l list elements.
6c60: 0a 20 20 20 20 2a 2a 20 54 68 61 74 20 77 61 79  .    ** That way
6c70: 2c 20 77 68 65 6e 20 54 63 6c 5f 45 76 61 6c 4f  , when Tcl_EvalO
6c80: 62 6a 76 28 29 20 69 73 20 72 75 6e 20 61 6e 64  bjv() is run and
6c90: 20 73 68 69 6d 6d 65 72 73 20 74 68 65 20 66 69   shimmers the fi
6ca0: 72 73 74 20 65 6c 65 6d 65 6e 74 0a 20 20 20 20  rst element.    
6cb0: 2a 2a 20 6f 66 20 74 68 65 20 6c 69 73 74 20 74  ** of the list t
6cc0: 6f 20 74 63 6c 43 6d 64 4e 61 6d 65 54 79 70 65  o tclCmdNameType
6cd0: 2c 20 74 68 61 74 20 61 6c 74 65 72 6e 61 74 65  , that alternate
6ce0: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
6cf0: 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20 70  will.    ** be p
6d00: 72 65 73 65 72 76 65 64 20 61 6e 64 20 72 65 75  reserved and reu
6d10: 73 65 64 20 6f 6e 20 74 68 65 20 6e 65 78 74 20  sed on the next 
6d20: 69 6e 76 6f 63 61 74 69 6f 6e 2e 0a 20 20 20 20  invocation..    
6d30: 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a  */.    Tcl_Obj *
6d40: 2a 61 41 72 67 3b 0a 20 20 20 20 69 6e 74 20 6e  *aArg;.    int n
6d50: 41 72 67 3b 0a 20 20 20 20 69 66 28 20 54 63 6c  Arg;.    if( Tcl
6d60: 5f 4c 69 73 74 4f 62 6a 47 65 74 45 6c 65 6d 65  _ListObjGetEleme
6d70: 6e 74 73 28 70 2d 3e 69 6e 74 65 72 70 2c 20 70  nts(p->interp, p
6d80: 2d 3e 70 53 63 72 69 70 74 2c 20 26 6e 41 72 67  ->pScript, &nArg
6d90: 2c 20 26 61 41 72 67 29 20 29 7b 0a 20 20 20 20  , &aArg) ){.    
6da0: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
6db0: 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20  _error(context, 
6dc0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73  Tcl_GetStringRes
6dd0: 75 6c 74 28 70 2d 3e 69 6e 74 65 72 70 29 2c 20  ult(p->interp), 
6de0: 2d 31 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  -1);.      retur
6df0: 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 6d  n;.    }.    pCm
6e00: 64 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f  d = Tcl_NewListO
6e10: 62 6a 28 6e 41 72 67 2c 20 61 41 72 67 29 3b 0a  bj(nArg, aArg);.
6e20: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43      Tcl_IncrRefC
6e30: 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20 20 20  ount(pCmd);.    
6e40: 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 67 63 3b  for(i=0; i<argc;
6e50: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c   i++){.      sql
6e60: 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 49 6e 20  ite3_value *pIn 
6e70: 3d 20 61 72 67 76 5b 69 5d 3b 0a 20 20 20 20 20  = argv[i];.     
6e80: 20 54 63 6c 5f 4f 62 6a 20 2a 70 56 61 6c 3b 0a   Tcl_Obj *pVal;.
6e90: 0a 20 20 20 20 20 20 2f 2a 20 53 65 74 20 70 56  .      /* Set pV
6ea0: 61 6c 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68  al to contain th
6eb0: 65 20 69 27 74 68 20 63 6f 6c 75 6d 6e 20 6f 66  e i'th column of
6ec0: 20 74 68 69 73 20 72 6f 77 2e 20 2a 2f 0a 20 20   this row. */.  
6ed0: 20 20 20 20 73 77 69 74 63 68 28 20 73 71 6c 69      switch( sqli
6ee0: 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 70  te3_value_type(p
6ef0: 49 6e 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63  In) ){.        c
6f00: 61 73 65 20 53 51 4c 49 54 45 5f 42 4c 4f 42 3a  ase SQLITE_BLOB:
6f10: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74   {.          int
6f20: 20 62 79 74 65 73 20 3d 20 73 71 6c 69 74 65 33   bytes = sqlite3
6f30: 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 70 49 6e  _value_bytes(pIn
6f40: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 56 61  );.          pVa
6f50: 6c 20 3d 20 54 63 6c 5f 4e 65 77 42 79 74 65 41  l = Tcl_NewByteA
6f60: 72 72 61 79 4f 62 6a 28 73 71 6c 69 74 65 33 5f  rrayObj(sqlite3_
6f70: 76 61 6c 75 65 5f 62 6c 6f 62 28 70 49 6e 29 2c  value_blob(pIn),
6f80: 20 62 79 74 65 73 29 3b 0a 20 20 20 20 20 20 20   bytes);.       
6f90: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
6fa0: 20 20 7d 0a 20 20 20 20 20 20 20 20 63 61 73 65    }.        case
6fb0: 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3a   SQLITE_INTEGER:
6fc0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c   {.          sql
6fd0: 69 74 65 5f 69 6e 74 36 34 20 76 20 3d 20 73 71  ite_int64 v = sq
6fe0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36  lite3_value_int6
6ff0: 34 28 70 49 6e 29 3b 0a 20 20 20 20 20 20 20 20  4(pIn);.        
7000: 20 20 69 66 28 20 76 3e 3d 2d 32 31 34 37 34 38    if( v>=-214748
7010: 33 36 34 37 20 26 26 20 76 3c 3d 32 31 34 37 34  3647 && v<=21474
7020: 38 33 36 34 37 20 29 7b 0a 20 20 20 20 20 20 20  83647 ){.       
7030: 20 20 20 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f       pVal = Tcl_
7040: 4e 65 77 49 6e 74 4f 62 6a 28 28 69 6e 74 29 76  NewIntObj((int)v
7050: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  );.          }el
7060: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
7070: 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 57 69  pVal = Tcl_NewWi
7080: 64 65 49 6e 74 4f 62 6a 28 76 29 3b 0a 20 20 20  deIntObj(v);.   
7090: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
70a0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
70b0: 20 20 7d 0a 20 20 20 20 20 20 20 20 63 61 73 65    }.        case
70c0: 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54 3a 20 7b   SQLITE_FLOAT: {
70d0: 0a 20 20 20 20 20 20 20 20 20 20 64 6f 75 62 6c  .          doubl
70e0: 65 20 72 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  e r = sqlite3_va
70f0: 6c 75 65 5f 64 6f 75 62 6c 65 28 70 49 6e 29 3b  lue_double(pIn);
7100: 0a 20 20 20 20 20 20 20 20 20 20 70 56 61 6c 20  .          pVal 
7110: 3d 20 54 63 6c 5f 4e 65 77 44 6f 75 62 6c 65 4f  = Tcl_NewDoubleO
7120: 62 6a 28 72 29 3b 0a 20 20 20 20 20 20 20 20 20  bj(r);.         
7130: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
7140: 7d 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 53  }.        case S
7150: 51 4c 49 54 45 5f 4e 55 4c 4c 3a 20 7b 0a 20 20  QLITE_NULL: {.  
7160: 20 20 20 20 20 20 20 20 70 56 61 6c 20 3d 20 54          pVal = T
7170: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
7180: 70 2d 3e 70 44 62 2d 3e 7a 4e 75 6c 6c 2c 20 2d  p->pDb->zNull, -
7190: 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  1);.          br
71a0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
71b0: 20 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20         default: 
71c0: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
71d0: 62 79 74 65 73 20 3d 20 73 71 6c 69 74 65 33 5f  bytes = sqlite3_
71e0: 76 61 6c 75 65 5f 62 79 74 65 73 28 70 49 6e 29  value_bytes(pIn)
71f0: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 56 61 6c  ;.          pVal
7200: 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67   = Tcl_NewString
7210: 4f 62 6a 28 28 63 68 61 72 20 2a 29 73 71 6c 69  Obj((char *)sqli
7220: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 70  te3_value_text(p
7230: 49 6e 29 2c 20 62 79 74 65 73 29 3b 0a 20 20 20  In), bytes);.   
7240: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
7250: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
7260: 20 20 20 20 20 20 72 63 20 3d 20 54 63 6c 5f 4c        rc = Tcl_L
7270: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
7280: 65 6e 74 28 70 2d 3e 69 6e 74 65 72 70 2c 20 70  ent(p->interp, p
7290: 43 6d 64 2c 20 70 56 61 6c 29 3b 0a 20 20 20 20  Cmd, pVal);.    
72a0: 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
72b0: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
72c0: 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20 20 20  ount(pCmd);.    
72d0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
72e0: 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74  lt_error(context
72f0: 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52  , Tcl_GetStringR
7300: 65 73 75 6c 74 28 70 2d 3e 69 6e 74 65 72 70 29  esult(p->interp)
7310: 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 72  , -1);.        r
7320: 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  eturn;.      }. 
7330: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 70 2d     }.    if( !p-
7340: 3e 75 73 65 45 76 61 6c 4f 62 6a 76 20 29 7b 0a  >useEvalObjv ){.
7350: 20 20 20 20 20 20 2f 2a 20 54 63 6c 5f 45 76 61        /* Tcl_Eva
7360: 6c 4f 62 6a 45 78 28 29 20 77 69 6c 6c 20 61 75  lObjEx() will au
7370: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 61 6c 6c  tomatically call
7380: 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 76 28 29 20   Tcl_EvalObjv() 
7390: 69 66 20 70 43 6d 64 0a 20 20 20 20 20 20 2a 2a  if pCmd.      **
73a0: 20 69 73 20 61 20 6c 69 73 74 20 77 69 74 68 6f   is a list witho
73b0: 75 74 20 61 20 73 74 72 69 6e 67 20 72 65 70 72  ut a string repr
73c0: 65 73 65 6e 74 61 74 69 6f 6e 2e 20 20 54 6f 20  esentation.  To 
73d0: 70 72 65 76 65 6e 74 20 74 68 69 73 20 66 72 6f  prevent this fro
73e0: 6d 0a 20 20 20 20 20 20 2a 2a 20 68 61 70 70 65  m.      ** happe
73f0: 6e 69 6e 67 2c 20 6d 61 6b 65 20 73 75 72 65 20  ning, make sure 
7400: 70 43 6d 64 20 68 61 73 20 61 20 76 61 6c 69 64  pCmd has a valid
7410: 20 73 74 72 69 6e 67 20 72 65 70 72 65 73 65 6e   string represen
7420: 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  tation */.      
7430: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 70 43  Tcl_GetString(pC
7440: 6d 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  md);.    }.    r
7450: 63 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45  c = Tcl_EvalObjE
7460: 78 28 70 2d 3e 69 6e 74 65 72 70 2c 20 70 43 6d  x(p->interp, pCm
7470: 64 2c 20 54 43 4c 5f 45 56 41 4c 5f 44 49 52 45  d, TCL_EVAL_DIRE
7480: 43 54 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63  CT);.    Tcl_Dec
7490: 72 52 65 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b  rRefCount(pCmd);
74a0: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 20 26  .  }..  if( rc &
74b0: 26 20 72 63 21 3d 54 43 4c 5f 52 45 54 55 52 4e  & rc!=TCL_RETURN
74c0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
74d0: 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e  result_error(con
74e0: 74 65 78 74 2c 20 54 63 6c 5f 47 65 74 53 74 72  text, Tcl_GetStr
74f0: 69 6e 67 52 65 73 75 6c 74 28 70 2d 3e 69 6e 74  ingResult(p->int
7500: 65 72 70 29 2c 20 2d 31 29 3b 0a 20 20 7d 65 6c  erp), -1);.  }el
7510: 73 65 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20  se{.    Tcl_Obj 
7520: 2a 70 56 61 72 20 3d 20 54 63 6c 5f 47 65 74 4f  *pVar = Tcl_GetO
7530: 62 6a 52 65 73 75 6c 74 28 70 2d 3e 69 6e 74 65  bjResult(p->inte
7540: 72 70 29 3b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a  rp);.    int n;.
7550: 20 20 20 20 75 38 20 2a 64 61 74 61 3b 0a 20 20      u8 *data;.  
7560: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
7570: 79 70 65 20 3d 20 28 70 56 61 72 2d 3e 74 79 70  ype = (pVar->typ
7580: 65 50 74 72 20 3f 20 70 56 61 72 2d 3e 74 79 70  ePtr ? pVar->typ
7590: 65 50 74 72 2d 3e 6e 61 6d 65 20 3a 20 22 22 29  ePtr->name : "")
75a0: 3b 0a 20 20 20 20 63 68 61 72 20 63 20 3d 20 7a  ;.    char c = z
75b0: 54 79 70 65 5b 30 5d 3b 0a 20 20 20 20 69 66 28  Type[0];.    if(
75c0: 20 63 3d 3d 27 62 27 20 26 26 20 73 74 72 63 6d   c=='b' && strcm
75d0: 70 28 7a 54 79 70 65 2c 22 62 79 74 65 61 72 72  p(zType,"bytearr
75e0: 61 79 22 29 3d 3d 30 20 26 26 20 70 56 61 72 2d  ay")==0 && pVar-
75f0: 3e 62 79 74 65 73 3d 3d 30 20 29 7b 0a 20 20 20  >bytes==0 ){.   
7600: 20 20 20 2f 2a 20 4f 6e 6c 79 20 72 65 74 75 72     /* Only retur
7610: 6e 20 61 20 42 4c 4f 42 20 74 79 70 65 20 69 66  n a BLOB type if
7620: 20 74 68 65 20 54 63 6c 20 76 61 72 69 61 62 6c   the Tcl variabl
7630: 65 20 69 73 20 61 20 62 79 74 65 61 72 72 61 79  e is a bytearray
7640: 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 68 61   and.      ** ha
7650: 73 20 6e 6f 20 73 74 72 69 6e 67 20 72 65 70 72  s no string repr
7660: 65 73 65 6e 74 61 74 69 6f 6e 2e 20 2a 2f 0a 20  esentation. */. 
7670: 20 20 20 20 20 64 61 74 61 20 3d 20 54 63 6c 5f       data = Tcl_
7680: 47 65 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d  GetByteArrayFrom
7690: 4f 62 6a 28 70 56 61 72 2c 20 26 6e 29 3b 0a 20  Obj(pVar, &n);. 
76a0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
76b0: 75 6c 74 5f 62 6c 6f 62 28 63 6f 6e 74 65 78 74  ult_blob(context
76c0: 2c 20 64 61 74 61 2c 20 6e 2c 20 53 51 4c 49 54  , data, n, SQLIT
76d0: 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  E_TRANSIENT);.  
76e0: 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27    }else if( c=='
76f0: 62 27 20 26 26 20 73 74 72 63 6d 70 28 7a 54 79  b' && strcmp(zTy
7700: 70 65 2c 22 62 6f 6f 6c 65 61 6e 22 29 3d 3d 30  pe,"boolean")==0
7710: 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 47 65   ){.      Tcl_Ge
7720: 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 30 2c 20 70  tIntFromObj(0, p
7730: 56 61 72 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20  Var, &n);.      
7740: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69  sqlite3_result_i
7750: 6e 74 28 63 6f 6e 74 65 78 74 2c 20 6e 29 3b 0a  nt(context, n);.
7760: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d      }else if( c=
7770: 3d 27 64 27 20 26 26 20 73 74 72 63 6d 70 28 7a  ='d' && strcmp(z
7780: 54 79 70 65 2c 22 64 6f 75 62 6c 65 22 29 3d 3d  Type,"double")==
7790: 30 20 29 7b 0a 20 20 20 20 20 20 64 6f 75 62 6c  0 ){.      doubl
77a0: 65 20 72 3b 0a 20 20 20 20 20 20 54 63 6c 5f 47  e r;.      Tcl_G
77b0: 65 74 44 6f 75 62 6c 65 46 72 6f 6d 4f 62 6a 28  etDoubleFromObj(
77c0: 30 2c 20 70 56 61 72 2c 20 26 72 29 3b 0a 20 20  0, pVar, &r);.  
77d0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
77e0: 6c 74 5f 64 6f 75 62 6c 65 28 63 6f 6e 74 65 78  lt_double(contex
77f0: 74 2c 20 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65  t, r);.    }else
7800: 20 69 66 28 20 28 63 3d 3d 27 77 27 20 26 26 20   if( (c=='w' && 
7810: 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22 77 69  strcmp(zType,"wi
7820: 64 65 49 6e 74 22 29 3d 3d 30 29 20 7c 7c 0a 20  deInt")==0) ||. 
7830: 20 20 20 20 20 20 20 20 20 28 63 3d 3d 27 69 27           (c=='i'
7840: 20 26 26 20 73 74 72 63 6d 70 28 7a 54 79 70 65   && strcmp(zType
7850: 2c 22 69 6e 74 22 29 3d 3d 30 29 20 29 7b 0a 20  ,"int")==0) ){. 
7860: 20 20 20 20 20 54 63 6c 5f 57 69 64 65 49 6e 74       Tcl_WideInt
7870: 20 76 3b 0a 20 20 20 20 20 20 54 63 6c 5f 47 65   v;.      Tcl_Ge
7880: 74 57 69 64 65 49 6e 74 46 72 6f 6d 4f 62 6a 28  tWideIntFromObj(
7890: 30 2c 20 70 56 61 72 2c 20 26 76 29 3b 0a 20 20  0, pVar, &v);.  
78a0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
78b0: 6c 74 5f 69 6e 74 36 34 28 63 6f 6e 74 65 78 74  lt_int64(context
78c0: 2c 20 76 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , v);.    }else{
78d0: 0a 20 20 20 20 20 20 64 61 74 61 20 3d 20 28 75  .      data = (u
78e0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 54  nsigned char *)T
78f0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
7900: 4f 62 6a 28 70 56 61 72 2c 20 26 6e 29 3b 0a 20  Obj(pVar, &n);. 
7910: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
7920: 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74  ult_text(context
7930: 2c 20 28 63 68 61 72 20 2a 29 64 61 74 61 2c 20  , (char *)data, 
7940: 6e 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  n, SQLITE_TRANSI
7950: 45 4e 54 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ENT);.    }.  }.
7960: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
7970: 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41  E_OMIT_AUTHORIZA
7980: 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  TION./*.** This 
7990: 69 73 20 74 68 65 20 61 75 74 68 65 6e 74 69 63  is the authentic
79a0: 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 2e 20  ation function. 
79b0: 20 49 74 20 61 70 70 65 6e 64 73 20 74 68 65 20   It appends the 
79c0: 61 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 0a 2a  authentication.*
79d0: 2a 20 74 79 70 65 20 63 6f 64 65 20 61 6e 64 20  * type code and 
79e0: 74 68 65 20 74 77 6f 20 61 72 67 75 6d 65 6e 74  the two argument
79f0: 73 20 74 6f 20 7a 43 6d 64 5b 5d 20 74 68 65 6e  s to zCmd[] then
7a00: 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 72 65 73   invokes the res
7a10: 75 6c 74 0a 2a 2a 20 6f 6e 20 74 68 65 20 69 6e  ult.** on the in
7a20: 74 65 72 70 72 65 74 65 72 2e 20 20 54 68 65 20  terpreter.  The 
7a30: 72 65 70 6c 79 20 69 73 20 65 78 61 6d 69 6e 65  reply is examine
7a40: 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69  d to determine i
7a50: 66 20 74 68 65 0a 2a 2a 20 61 75 74 68 65 6e 74  f the.** authent
7a60: 69 63 61 74 69 6f 6e 20 66 61 69 6c 73 20 6f 72  ication fails or
7a70: 20 73 75 63 63 65 65 64 73 2e 0a 2a 2f 0a 73 74   succeeds..*/.st
7a80: 61 74 69 63 20 69 6e 74 20 61 75 74 68 5f 63 61  atic int auth_ca
7a90: 6c 6c 62 61 63 6b 28 0a 20 20 76 6f 69 64 20 2a  llback(.  void *
7aa0: 70 41 72 67 2c 0a 20 20 69 6e 74 20 63 6f 64 65  pArg,.  int code
7ab0: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
7ac0: 7a 41 72 67 31 2c 0a 20 20 63 6f 6e 73 74 20 63  zArg1,.  const c
7ad0: 68 61 72 20 2a 7a 41 72 67 32 2c 0a 20 20 63 6f  har *zArg2,.  co
7ae0: 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67 33 2c  nst char *zArg3,
7af0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
7b00: 41 72 67 34 0a 23 69 66 64 65 66 20 53 51 4c 49  Arg4.#ifdef SQLI
7b10: 54 45 5f 55 53 45 52 5f 41 55 54 48 45 4e 54 49  TE_USER_AUTHENTI
7b20: 43 41 54 49 4f 4e 0a 20 20 2c 63 6f 6e 73 74 20  CATION.  ,const 
7b30: 63 68 61 72 20 2a 7a 41 72 67 35 0a 23 65 6e 64  char *zArg5.#end
7b40: 69 66 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  if.){.  const ch
7b50: 61 72 20 2a 7a 43 6f 64 65 3b 0a 20 20 54 63 6c  ar *zCode;.  Tcl
7b60: 5f 44 53 74 72 69 6e 67 20 73 74 72 3b 0a 20 20  _DString str;.  
7b70: 69 6e 74 20 72 63 3b 0a 20 20 63 6f 6e 73 74 20  int rc;.  const 
7b80: 63 68 61 72 20 2a 7a 52 65 70 6c 79 3b 0a 20 20  char *zReply;.  
7b90: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
7ba0: 52 2d 33 38 35 39 30 2d 36 32 37 36 39 20 54 68  R-38590-62769 Th
7bb0: 65 20 66 69 72 73 74 20 70 61 72 61 6d 65 74 65  e first paramete
7bc0: 72 20 74 6f 20 74 68 65 20 61 75 74 68 6f 72 69  r to the authori
7bd0: 7a 65 72 0a 20 20 2a 2a 20 63 61 6c 6c 62 61 63  zer.  ** callbac
7be0: 6b 20 69 73 20 61 20 63 6f 70 79 20 6f 66 20 74  k is a copy of t
7bf0: 68 65 20 74 68 69 72 64 20 70 61 72 61 6d 65 74  he third paramet
7c00: 65 72 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 73  er to the.  ** s
7c10: 71 6c 69 74 65 33 5f 73 65 74 5f 61 75 74 68 6f  qlite3_set_autho
7c20: 72 69 7a 65 72 28 29 20 69 6e 74 65 72 66 61 63  rizer() interfac
7c30: 65 2e 0a 20 20 2a 2f 0a 20 20 53 71 6c 69 74 65  e..  */.  Sqlite
7c40: 44 62 20 2a 70 44 62 20 3d 20 28 53 71 6c 69 74  Db *pDb = (Sqlit
7c50: 65 44 62 2a 29 70 41 72 67 3b 0a 20 20 69 66 28  eDb*)pArg;.  if(
7c60: 20 70 44 62 2d 3e 64 69 73 61 62 6c 65 41 75 74   pDb->disableAut
7c70: 68 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  h ) return SQLIT
7c80: 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 45 56 49 44  E_OK;..  /* EVID
7c90: 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 36 35 31 38  ENCE-OF: R-56518
7ca0: 2d 34 34 33 31 30 20 54 68 65 20 73 65 63 6f 6e  -44310 The secon
7cb0: 64 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20 74  d parameter to t
7cc0: 68 65 20 63 61 6c 6c 62 61 63 6b 20 69 73 20 61  he callback is a
7cd0: 6e 0a 20 20 2a 2a 20 69 6e 74 65 67 65 72 20 61  n.  ** integer a
7ce0: 63 74 69 6f 6e 20 63 6f 64 65 20 74 68 61 74 20  ction code that 
7cf0: 73 70 65 63 69 66 69 65 73 20 74 68 65 20 70 61  specifies the pa
7d00: 72 74 69 63 75 6c 61 72 20 61 63 74 69 6f 6e 20  rticular action 
7d10: 74 6f 20 62 65 0a 20 20 2a 2a 20 61 75 74 68 6f  to be.  ** autho
7d20: 72 69 7a 65 64 2e 20 2a 2f 0a 20 20 73 77 69 74  rized. */.  swit
7d30: 63 68 28 20 63 6f 64 65 20 29 7b 0a 20 20 20 20  ch( code ){.    
7d40: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 50 59  case SQLITE_COPY
7d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3a 20                : 
7d60: 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43 4f  zCode="SQLITE_CO
7d70: 50 59 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  PY"; break;.    
7d80: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 52 45 41  case SQLITE_CREA
7d90: 54 45 5f 49 4e 44 45 58 20 20 20 20 20 20 3a 20  TE_INDEX      : 
7da0: 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43 52  zCode="SQLITE_CR
7db0: 45 41 54 45 5f 49 4e 44 45 58 22 3b 20 62 72 65  EATE_INDEX"; bre
7dc0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
7dd0: 49 54 45 5f 43 52 45 41 54 45 5f 54 41 42 4c 45  ITE_CREATE_TABLE
7de0: 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53        : zCode="S
7df0: 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 41 42  QLITE_CREATE_TAB
7e00: 4c 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  LE"; break;.    
7e10: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 52 45 41  case SQLITE_CREA
7e20: 54 45 5f 54 45 4d 50 5f 49 4e 44 45 58 20 3a 20  TE_TEMP_INDEX : 
7e30: 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43 52  zCode="SQLITE_CR
7e40: 45 41 54 45 5f 54 45 4d 50 5f 49 4e 44 45 58 22  EATE_TEMP_INDEX"
7e50: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
7e60: 65 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  e SQLITE_CREATE_
7e70: 54 45 4d 50 5f 54 41 42 4c 45 20 3a 20 7a 43 6f  TEMP_TABLE : zCo
7e80: 64 65 3d 22 53 51 4c 49 54 45 5f 43 52 45 41 54  de="SQLITE_CREAT
7e90: 45 5f 54 45 4d 50 5f 54 41 42 4c 45 22 3b 20 62  E_TEMP_TABLE"; b
7ea0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
7eb0: 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d  QLITE_CREATE_TEM
7ec0: 50 5f 54 52 49 47 47 45 52 3a 20 7a 43 6f 64 65  P_TRIGGER: zCode
7ed0: 3d 22 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  ="SQLITE_CREATE_
7ee0: 54 45 4d 50 5f 54 52 49 47 47 45 52 22 3b 20 62  TEMP_TRIGGER"; b
7ef0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
7f00: 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d  QLITE_CREATE_TEM
7f10: 50 5f 56 49 45 57 20 20 3a 20 7a 43 6f 64 65 3d  P_VIEW  : zCode=
7f20: 22 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54  "SQLITE_CREATE_T
7f30: 45 4d 50 5f 56 49 45 57 22 3b 20 62 72 65 61 6b  EMP_VIEW"; break
7f40: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
7f50: 45 5f 43 52 45 41 54 45 5f 54 52 49 47 47 45 52  E_CREATE_TRIGGER
7f60: 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c      : zCode="SQL
7f70: 49 54 45 5f 43 52 45 41 54 45 5f 54 52 49 47 47  ITE_CREATE_TRIGG
7f80: 45 52 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  ER"; break;.    
7f90: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 52 45 41  case SQLITE_CREA
7fa0: 54 45 5f 56 49 45 57 20 20 20 20 20 20 20 3a 20  TE_VIEW       : 
7fb0: 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43 52  zCode="SQLITE_CR
7fc0: 45 41 54 45 5f 56 49 45 57 22 3b 20 62 72 65 61  EATE_VIEW"; brea
7fd0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
7fe0: 54 45 5f 44 45 4c 45 54 45 20 20 20 20 20 20 20  TE_DELETE       
7ff0: 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51       : zCode="SQ
8000: 4c 49 54 45 5f 44 45 4c 45 54 45 22 3b 20 62 72  LITE_DELETE"; br
8010: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
8020: 4c 49 54 45 5f 44 52 4f 50 5f 49 4e 44 45 58 20  LITE_DROP_INDEX 
8030: 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22         : zCode="
8040: 53 51 4c 49 54 45 5f 44 52 4f 50 5f 49 4e 44 45  SQLITE_DROP_INDE
8050: 58 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  X"; break;.    c
8060: 61 73 65 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f  ase SQLITE_DROP_
8070: 54 41 42 4c 45 20 20 20 20 20 20 20 20 3a 20 7a  TABLE        : z
8080: 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f  Code="SQLITE_DRO
8090: 50 5f 54 41 42 4c 45 22 3b 20 62 72 65 61 6b 3b  P_TABLE"; break;
80a0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
80b0: 5f 44 52 4f 50 5f 54 45 4d 50 5f 49 4e 44 45 58  _DROP_TEMP_INDEX
80c0: 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49     : zCode="SQLI
80d0: 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 49 4e 44  TE_DROP_TEMP_IND
80e0: 45 58 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  EX"; break;.    
80f0: 63 61 73 65 20 53 51 4c 49 54 45 5f 44 52 4f 50  case SQLITE_DROP
8100: 5f 54 45 4d 50 5f 54 41 42 4c 45 20 20 20 3a 20  _TEMP_TABLE   : 
8110: 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44 52  zCode="SQLITE_DR
8120: 4f 50 5f 54 45 4d 50 5f 54 41 42 4c 45 22 3b 20  OP_TEMP_TABLE"; 
8130: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
8140: 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50  SQLITE_DROP_TEMP
8150: 5f 54 52 49 47 47 45 52 20 3a 20 7a 43 6f 64 65  _TRIGGER : zCode
8160: 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45  ="SQLITE_DROP_TE
8170: 4d 50 5f 54 52 49 47 47 45 52 22 3b 20 62 72 65  MP_TRIGGER"; bre
8180: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
8190: 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 56 49  ITE_DROP_TEMP_VI
81a0: 45 57 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53  EW    : zCode="S
81b0: 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f  QLITE_DROP_TEMP_
81c0: 56 49 45 57 22 3b 20 62 72 65 61 6b 3b 0a 20 20  VIEW"; break;.  
81d0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44 52    case SQLITE_DR
81e0: 4f 50 5f 54 52 49 47 47 45 52 20 20 20 20 20 20  OP_TRIGGER      
81f0: 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f  : zCode="SQLITE_
8200: 44 52 4f 50 5f 54 52 49 47 47 45 52 22 3b 20 62  DROP_TRIGGER"; b
8210: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
8220: 51 4c 49 54 45 5f 44 52 4f 50 5f 56 49 45 57 20  QLITE_DROP_VIEW 
8230: 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d          : zCode=
8240: 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56 49 45  "SQLITE_DROP_VIE
8250: 57 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  W"; break;.    c
8260: 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 53 45 52  ase SQLITE_INSER
8270: 54 20 20 20 20 20 20 20 20 20 20 20 20 3a 20 7a  T            : z
8280: 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 49 4e 53  Code="SQLITE_INS
8290: 45 52 54 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  ERT"; break;.   
82a0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 50 52 41   case SQLITE_PRA
82b0: 47 4d 41 20 20 20 20 20 20 20 20 20 20 20 20 3a  GMA            :
82c0: 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 50   zCode="SQLITE_P
82d0: 52 41 47 4d 41 22 3b 20 62 72 65 61 6b 3b 0a 20  RAGMA"; break;. 
82e0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 52     case SQLITE_R
82f0: 45 41 44 20 20 20 20 20 20 20 20 20 20 20 20 20  EAD             
8300: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
8310: 5f 52 45 41 44 22 3b 20 62 72 65 61 6b 3b 0a 20  _READ"; break;. 
8320: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 53     case SQLITE_S
8330: 45 4c 45 43 54 20 20 20 20 20 20 20 20 20 20 20  ELECT           
8340: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
8350: 5f 53 45 4c 45 43 54 22 3b 20 62 72 65 61 6b 3b  _SELECT"; break;
8360: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
8370: 5f 54 52 41 4e 53 41 43 54 49 4f 4e 20 20 20 20  _TRANSACTION    
8380: 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49     : zCode="SQLI
8390: 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 22 3b  TE_TRANSACTION";
83a0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
83b0: 20 53 51 4c 49 54 45 5f 55 50 44 41 54 45 20 20   SQLITE_UPDATE  
83c0: 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64            : zCod
83d0: 65 3d 22 53 51 4c 49 54 45 5f 55 50 44 41 54 45  e="SQLITE_UPDATE
83e0: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
83f0: 73 65 20 53 51 4c 49 54 45 5f 41 54 54 41 43 48  se SQLITE_ATTACH
8400: 20 20 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43              : zC
8410: 6f 64 65 3d 22 53 51 4c 49 54 45 5f 41 54 54 41  ode="SQLITE_ATTA
8420: 43 48 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  CH"; break;.    
8430: 63 61 73 65 20 53 51 4c 49 54 45 5f 44 45 54 41  case SQLITE_DETA
8440: 43 48 20 20 20 20 20 20 20 20 20 20 20 20 3a 20  CH            : 
8450: 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44 45  zCode="SQLITE_DE
8460: 54 41 43 48 22 3b 20 62 72 65 61 6b 3b 0a 20 20  TACH"; break;.  
8470: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 4c    case SQLITE_AL
8480: 54 45 52 5f 54 41 42 4c 45 20 20 20 20 20 20 20  TER_TABLE       
8490: 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f  : zCode="SQLITE_
84a0: 41 4c 54 45 52 5f 54 41 42 4c 45 22 3b 20 62 72  ALTER_TABLE"; br
84b0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
84c0: 4c 49 54 45 5f 52 45 49 4e 44 45 58 20 20 20 20  LITE_REINDEX    
84d0: 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22         : zCode="
84e0: 53 51 4c 49 54 45 5f 52 45 49 4e 44 45 58 22 3b  SQLITE_REINDEX";
84f0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
8500: 20 53 51 4c 49 54 45 5f 41 4e 41 4c 59 5a 45 20   SQLITE_ANALYZE 
8510: 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64            : zCod
8520: 65 3d 22 53 51 4c 49 54 45 5f 41 4e 41 4c 59 5a  e="SQLITE_ANALYZ
8530: 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  E"; break;.    c
8540: 61 73 65 20 53 51 4c 49 54 45 5f 43 52 45 41 54  ase SQLITE_CREAT
8550: 45 5f 56 54 41 42 4c 45 20 20 20 20 20 3a 20 7a  E_VTABLE     : z
8560: 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43 52 45  Code="SQLITE_CRE
8570: 41 54 45 5f 56 54 41 42 4c 45 22 3b 20 62 72 65  ATE_VTABLE"; bre
8580: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
8590: 49 54 45 5f 44 52 4f 50 5f 56 54 41 42 4c 45 20  ITE_DROP_VTABLE 
85a0: 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53        : zCode="S
85b0: 51 4c 49 54 45 5f 44 52 4f 50 5f 56 54 41 42 4c  QLITE_DROP_VTABL
85c0: 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  E"; break;.    c
85d0: 61 73 65 20 53 51 4c 49 54 45 5f 46 55 4e 43 54  ase SQLITE_FUNCT
85e0: 49 4f 4e 20 20 20 20 20 20 20 20 20 20 3a 20 7a  ION          : z
85f0: 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 46 55 4e  Code="SQLITE_FUN
8600: 43 54 49 4f 4e 22 3b 20 62 72 65 61 6b 3b 0a 20  CTION"; break;. 
8610: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 53     case SQLITE_S
8620: 41 56 45 50 4f 49 4e 54 20 20 20 20 20 20 20 20  AVEPOINT        
8630: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
8640: 5f 53 41 56 45 50 4f 49 4e 54 22 3b 20 62 72 65  _SAVEPOINT"; bre
8650: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
8660: 49 54 45 5f 52 45 43 55 52 53 49 56 45 20 20 20  ITE_RECURSIVE   
8670: 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53        : zCode="S
8680: 51 4c 49 54 45 5f 52 45 43 55 52 53 49 56 45 22  QLITE_RECURSIVE"
8690: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66  ; break;.    def
86a0: 61 75 6c 74 20 20 20 20 20 20 20 20 20 20 20 20  ault            
86b0: 20 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f             : zCo
86c0: 64 65 3d 22 3f 3f 3f 3f 22 3b 20 62 72 65 61 6b  de="????"; break
86d0: 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 44 53 74 72  ;.  }.  Tcl_DStr
86e0: 69 6e 67 49 6e 69 74 28 26 73 74 72 29 3b 0a 20  ingInit(&str);. 
86f0: 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65   Tcl_DStringAppe
8700: 6e 64 28 26 73 74 72 2c 20 70 44 62 2d 3e 7a 41  nd(&str, pDb->zA
8710: 75 74 68 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f  uth, -1);.  Tcl_
8720: 44 53 74 72 69 6e 67 41 70 70 65 6e 64 45 6c 65  DStringAppendEle
8730: 6d 65 6e 74 28 26 73 74 72 2c 20 7a 43 6f 64 65  ment(&str, zCode
8740: 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  );.  Tcl_DString
8750: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 26 73  AppendElement(&s
8760: 74 72 2c 20 7a 41 72 67 31 20 3f 20 7a 41 72 67  tr, zArg1 ? zArg
8770: 31 20 3a 20 22 22 29 3b 0a 20 20 54 63 6c 5f 44  1 : "");.  Tcl_D
8780: 53 74 72 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d  StringAppendElem
8790: 65 6e 74 28 26 73 74 72 2c 20 7a 41 72 67 32 20  ent(&str, zArg2 
87a0: 3f 20 7a 41 72 67 32 20 3a 20 22 22 29 3b 0a 20  ? zArg2 : "");. 
87b0: 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65   Tcl_DStringAppe
87c0: 6e 64 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c 20  ndElement(&str, 
87d0: 7a 41 72 67 33 20 3f 20 7a 41 72 67 33 20 3a 20  zArg3 ? zArg3 : 
87e0: 22 22 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69  "");.  Tcl_DStri
87f0: 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  ngAppendElement(
8800: 26 73 74 72 2c 20 7a 41 72 67 34 20 3f 20 7a 41  &str, zArg4 ? zA
8810: 72 67 34 20 3a 20 22 22 29 3b 0a 23 69 66 64 65  rg4 : "");.#ifde
8820: 66 20 53 51 4c 49 54 45 5f 55 53 45 52 5f 41 55  f SQLITE_USER_AU
8830: 54 48 45 4e 54 49 43 41 54 49 4f 4e 0a 20 20 54  THENTICATION.  T
8840: 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64  cl_DStringAppend
8850: 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c 20 7a 41  Element(&str, zA
8860: 72 67 35 20 3f 20 7a 41 72 67 35 20 3a 20 22 22  rg5 ? zArg5 : ""
8870: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 63 20 3d  );.#endif.  rc =
8880: 20 54 63 6c 5f 47 6c 6f 62 61 6c 45 76 61 6c 28   Tcl_GlobalEval(
8890: 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20 54 63 6c  pDb->interp, Tcl
88a0: 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 73  _DStringValue(&s
88b0: 74 72 29 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72  tr));.  Tcl_DStr
88c0: 69 6e 67 46 72 65 65 28 26 73 74 72 29 3b 0a 20  ingFree(&str);. 
88d0: 20 7a 52 65 70 6c 79 20 3d 20 72 63 3d 3d 54 43   zReply = rc==TC
88e0: 4c 5f 4f 4b 20 3f 20 54 63 6c 5f 47 65 74 53 74  L_OK ? Tcl_GetSt
88f0: 72 69 6e 67 52 65 73 75 6c 74 28 70 44 62 2d 3e  ringResult(pDb->
8900: 69 6e 74 65 72 70 29 20 3a 20 22 53 51 4c 49 54  interp) : "SQLIT
8910: 45 5f 44 45 4e 59 22 3b 0a 20 20 69 66 28 20 73  E_DENY";.  if( s
8920: 74 72 63 6d 70 28 7a 52 65 70 6c 79 2c 22 53 51  trcmp(zReply,"SQ
8930: 4c 49 54 45 5f 4f 4b 22 29 3d 3d 30 20 29 7b 0a  LITE_OK")==0 ){.
8940: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
8950: 4f 4b 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  OK;.  }else if( 
8960: 73 74 72 63 6d 70 28 7a 52 65 70 6c 79 2c 22 53  strcmp(zReply,"S
8970: 51 4c 49 54 45 5f 44 45 4e 59 22 29 3d 3d 30 20  QLITE_DENY")==0 
8980: 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
8990: 54 45 5f 44 45 4e 59 3b 0a 20 20 7d 65 6c 73 65  TE_DENY;.  }else
89a0: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 52 65 70   if( strcmp(zRep
89b0: 6c 79 2c 22 53 51 4c 49 54 45 5f 49 47 4e 4f 52  ly,"SQLITE_IGNOR
89c0: 45 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63  E")==0 ){.    rc
89d0: 20 3d 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45   = SQLITE_IGNORE
89e0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
89f0: 63 20 3d 20 39 39 39 3b 0a 20 20 7d 0a 20 20 72  c = 999;.  }.  r
8a00: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64  eturn rc;.}.#end
8a10: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
8a20: 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 20  T_AUTHORIZATION 
8a30: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  */../*.** This r
8a40: 6f 75 74 69 6e 65 20 72 65 61 64 73 20 61 20 6c  outine reads a l
8a50: 69 6e 65 20 6f 66 20 74 65 78 74 20 66 72 6f 6d  ine of text from
8a60: 20 46 49 4c 45 20 69 6e 2c 20 73 74 6f 72 65 73   FILE in, stores
8a70: 0a 2a 2a 20 74 68 65 20 74 65 78 74 20 69 6e 20  .** the text in 
8a80: 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20  memory obtained 
8a90: 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 20 61 6e  from malloc() an
8aa0: 64 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e  d returns a poin
8ab0: 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 74 65  ter.** to the te
8ac0: 78 74 2e 20 20 4e 55 4c 4c 20 69 73 20 72 65 74  xt.  NULL is ret
8ad0: 75 72 6e 65 64 20 61 74 20 65 6e 64 20 6f 66 20  urned at end of 
8ae0: 66 69 6c 65 2c 20 6f 72 20 69 66 20 6d 61 6c 6c  file, or if mall
8af0: 6f 63 28 29 0a 2a 2a 20 66 61 69 6c 73 2e 0a 2a  oc().** fails..*
8b00: 2a 0a 2a 2a 20 54 68 65 20 69 6e 74 65 72 66 61  *.** The interfa
8b10: 63 65 20 69 73 20 6c 69 6b 65 20 22 72 65 61 64  ce is like "read
8b20: 6c 69 6e 65 22 20 62 75 74 20 6e 6f 20 63 6f 6d  line" but no com
8b30: 6d 61 6e 64 2d 6c 69 6e 65 20 65 64 69 74 69 6e  mand-line editin
8b40: 67 0a 2a 2a 20 69 73 20 64 6f 6e 65 2e 0a 2a 2a  g.** is done..**
8b50: 0a 2a 2a 20 63 6f 70 69 65 64 20 66 72 6f 6d 20  .** copied from 
8b60: 73 68 65 6c 6c 2e 63 20 66 72 6f 6d 20 27 2e 69  shell.c from '.i
8b70: 6d 70 6f 72 74 27 20 63 6f 6d 6d 61 6e 64 0a 2a  mport' command.*
8b80: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 6c  /.static char *l
8b90: 6f 63 61 6c 5f 67 65 74 6c 69 6e 65 28 63 68 61  ocal_getline(cha
8ba0: 72 20 2a 7a 50 72 6f 6d 70 74 2c 20 46 49 4c 45  r *zPrompt, FILE
8bb0: 20 2a 69 6e 29 7b 0a 20 20 63 68 61 72 20 2a 7a   *in){.  char *z
8bc0: 4c 69 6e 65 3b 0a 20 20 69 6e 74 20 6e 4c 69 6e  Line;.  int nLin
8bd0: 65 3b 0a 20 20 69 6e 74 20 6e 3b 0a 0a 20 20 6e  e;.  int n;..  n
8be0: 4c 69 6e 65 20 3d 20 31 30 30 3b 0a 20 20 7a 4c  Line = 100;.  zL
8bf0: 69 6e 65 20 3d 20 6d 61 6c 6c 6f 63 28 20 6e 4c  ine = malloc( nL
8c00: 69 6e 65 20 29 3b 0a 20 20 69 66 28 20 7a 4c 69  ine );.  if( zLi
8c10: 6e 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ne==0 ) return 0
8c20: 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20 20 77 68 69  ;.  n = 0;.  whi
8c30: 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 69 66 28  le( 1 ){.    if(
8c40: 20 6e 2b 31 30 30 3e 6e 4c 69 6e 65 20 29 7b 0a   n+100>nLine ){.
8c50: 20 20 20 20 20 20 6e 4c 69 6e 65 20 3d 20 6e 4c        nLine = nL
8c60: 69 6e 65 2a 32 20 2b 20 31 30 30 3b 0a 20 20 20  ine*2 + 100;.   
8c70: 20 20 20 7a 4c 69 6e 65 20 3d 20 72 65 61 6c 6c     zLine = reall
8c80: 6f 63 28 7a 4c 69 6e 65 2c 20 6e 4c 69 6e 65 29  oc(zLine, nLine)
8c90: 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 4c 69 6e  ;.      if( zLin
8ca0: 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  e==0 ) return 0;
8cb0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 66  .    }.    if( f
8cc0: 67 65 74 73 28 26 7a 4c 69 6e 65 5b 6e 5d 2c 20  gets(&zLine[n], 
8cd0: 6e 4c 69 6e 65 20 2d 20 6e 2c 20 69 6e 29 3d 3d  nLine - n, in)==
8ce0: 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e  0 ){.      if( n
8cf0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66  ==0 ){.        f
8d00: 72 65 65 28 7a 4c 69 6e 65 29 3b 0a 20 20 20 20  ree(zLine);.    
8d10: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
8d20: 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 4c 69 6e      }.      zLin
8d30: 65 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  e[n] = 0;.      
8d40: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
8d50: 20 77 68 69 6c 65 28 20 7a 4c 69 6e 65 5b 6e 5d   while( zLine[n]
8d60: 20 29 7b 20 6e 2b 2b 3b 20 7d 0a 20 20 20 20 69   ){ n++; }.    i
8d70: 66 28 20 6e 3e 30 20 26 26 20 7a 4c 69 6e 65 5b  f( n>0 && zLine[
8d80: 6e 2d 31 5d 3d 3d 27 5c 6e 27 20 29 7b 0a 20 20  n-1]=='\n' ){.  
8d90: 20 20 20 20 6e 2d 2d 3b 0a 20 20 20 20 20 20 7a      n--;.      z
8da0: 4c 69 6e 65 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20  Line[n] = 0;.   
8db0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
8dc0: 20 20 7d 0a 20 20 7a 4c 69 6e 65 20 3d 20 72 65    }.  zLine = re
8dd0: 61 6c 6c 6f 63 28 20 7a 4c 69 6e 65 2c 20 6e 2b  alloc( zLine, n+
8de0: 31 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 4c  1 );.  return zL
8df0: 69 6e 65 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54  ine;.}.../*.** T
8e00: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
8e10: 70 61 72 74 20 6f 66 20 74 68 65 20 69 6d 70 6c  part of the impl
8e20: 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  ementation of th
8e30: 65 20 63 6f 6d 6d 61 6e 64 3a 0a 2a 2a 0a 2a 2a  e command:.**.**
8e40: 20 20 20 24 64 62 20 74 72 61 6e 73 61 63 74 69     $db transacti
8e50: 6f 6e 20 5b 2d 64 65 66 65 72 72 65 64 7c 2d 69  on [-deferred|-i
8e60: 6d 6d 65 64 69 61 74 65 7c 2d 65 78 63 6c 75 73  mmediate|-exclus
8e70: 69 76 65 5d 20 53 43 52 49 50 54 0a 2a 2a 0a 2a  ive] SCRIPT.**.*
8e80: 2a 20 49 74 20 69 73 20 69 6e 76 6f 6b 65 64 20  * It is invoked 
8e90: 61 66 74 65 72 20 65 76 61 6c 75 61 74 69 6e 67  after evaluating
8ea0: 20 74 68 65 20 73 63 72 69 70 74 20 53 43 52 49   the script SCRI
8eb0: 50 54 20 74 6f 20 63 6f 6d 6d 69 74 20 6f 72 20  PT to commit or 
8ec0: 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 74 68 65 20  rollback.** the 
8ed0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 72 20 73  transaction or s
8ee0: 61 76 65 70 6f 69 6e 74 20 6f 70 65 6e 65 64 20  avepoint opened 
8ef0: 62 79 20 74 68 65 20 5b 74 72 61 6e 73 61 63 74  by the [transact
8f00: 69 6f 6e 5d 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f  ion] command..*/
8f10: 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
8f20: 54 45 5f 54 43 4c 41 50 49 20 44 62 54 72 61 6e  TE_TCLAPI DbTran
8f30: 73 50 6f 73 74 43 6d 64 28 0a 20 20 43 6c 69 65  sPostCmd(.  Clie
8f40: 6e 74 44 61 74 61 20 64 61 74 61 5b 5d 2c 20 20  ntData data[],  
8f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8f60: 20 2f 2a 20 64 61 74 61 5b 30 5d 20 69 73 20 74   /* data[0] is t
8f70: 68 65 20 53 71 6c 69 74 65 33 44 62 2a 20 66 6f  he Sqlite3Db* fo
8f80: 72 20 24 64 62 20 2a 2f 0a 20 20 54 63 6c 5f 49  r $db */.  Tcl_I
8f90: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
8fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8fb0: 2f 2a 20 54 63 6c 20 69 6e 74 65 72 70 72 65 74  /* Tcl interpret
8fc0: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73 75  er */.  int resu
8fd0: 6c 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  lt              
8fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8ff0: 52 65 73 75 6c 74 20 6f 66 20 65 76 61 6c 75 61  Result of evalua
9000: 74 69 6e 67 20 53 43 52 49 50 54 20 2a 2f 0a 29  ting SCRIPT */.)
9010: 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  {.  static const
9020: 20 63 68 61 72 20 2a 63 6f 6e 73 74 20 61 7a 45   char *const azE
9030: 6e 64 5b 5d 20 3d 20 7b 0a 20 20 20 20 22 52 45  nd[] = {.    "RE
9040: 4c 45 41 53 45 20 5f 74 63 6c 5f 74 72 61 6e 73  LEASE _tcl_trans
9050: 61 63 74 69 6f 6e 22 2c 20 20 20 20 20 20 20 20  action",        
9060: 2f 2a 20 72 63 3d 3d 54 43 4c 5f 45 52 52 4f 52  /* rc==TCL_ERROR
9070: 2c 20 6e 54 72 61 6e 73 61 63 74 69 6f 6e 21 3d  , nTransaction!=
9080: 30 20 2a 2f 0a 20 20 20 20 22 43 4f 4d 4d 49 54  0 */.    "COMMIT
9090: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
90a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 72              /* r
90b0: 63 21 3d 54 43 4c 5f 45 52 52 4f 52 2c 20 6e 54  c!=TCL_ERROR, nT
90c0: 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 30 20 2a 2f  ransaction==0 */
90d0: 0a 20 20 20 20 22 52 4f 4c 4c 42 41 43 4b 20 54  .    "ROLLBACK T
90e0: 4f 20 5f 74 63 6c 5f 74 72 61 6e 73 61 63 74 69  O _tcl_transacti
90f0: 6f 6e 20 3b 20 52 45 4c 45 41 53 45 20 5f 74 63  on ; RELEASE _tc
9100: 6c 5f 74 72 61 6e 73 61 63 74 69 6f 6e 22 2c 0a  l_transaction",.
9110: 20 20 20 20 22 52 4f 4c 4c 42 41 43 4b 22 20 20      "ROLLBACK"  
9120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9130: 20 20 20 20 20 20 20 2f 2a 20 72 63 3d 3d 54 43         /* rc==TC
9140: 4c 5f 45 52 52 4f 52 2c 20 6e 54 72 61 6e 73 61  L_ERROR, nTransa
9150: 63 74 69 6f 6e 3d 3d 30 20 2a 2f 0a 20 20 7d 3b  ction==0 */.  };
9160: 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62  .  SqliteDb *pDb
9170: 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 64 61   = (SqliteDb*)da
9180: 74 61 5b 30 5d 3b 0a 20 20 69 6e 74 20 72 63 20  ta[0];.  int rc 
9190: 3d 20 72 65 73 75 6c 74 3b 0a 20 20 63 6f 6e 73  = result;.  cons
91a0: 74 20 63 68 61 72 20 2a 7a 45 6e 64 3b 0a 0a 20  t char *zEnd;.. 
91b0: 20 70 44 62 2d 3e 6e 54 72 61 6e 73 61 63 74 69   pDb->nTransacti
91c0: 6f 6e 2d 2d 3b 0a 20 20 7a 45 6e 64 20 3d 20 61  on--;.  zEnd = a
91d0: 7a 45 6e 64 5b 28 72 63 3d 3d 54 43 4c 5f 45 52  zEnd[(rc==TCL_ER
91e0: 52 4f 52 29 2a 32 20 2b 20 28 70 44 62 2d 3e 6e  ROR)*2 + (pDb->n
91f0: 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 30 29 5d  Transaction==0)]
9200: 3b 0a 0a 20 20 70 44 62 2d 3e 64 69 73 61 62 6c  ;..  pDb->disabl
9210: 65 41 75 74 68 2b 2b 3b 0a 20 20 69 66 28 20 73  eAuth++;.  if( s
9220: 71 6c 69 74 65 33 5f 65 78 65 63 28 70 44 62 2d  qlite3_exec(pDb-
9230: 3e 64 62 2c 20 7a 45 6e 64 2c 20 30 2c 20 30 2c  >db, zEnd, 0, 0,
9240: 20 30 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20   0) ){.      /* 
9250: 54 68 69 73 20 69 73 20 61 20 74 72 69 63 6b 79  This is a tricky
9260: 20 73 63 65 6e 61 72 69 6f 20 74 6f 20 68 61 6e   scenario to han
9270: 64 6c 65 2e 20 54 68 65 20 6d 6f 73 74 20 6c 69  dle. The most li
9280: 6b 65 6c 79 20 63 61 75 73 65 20 6f 66 20 61 6e  kely cause of an
9290: 0a 20 20 20 20 20 20 2a 2a 20 65 72 72 6f 72 20  .      ** error 
92a0: 69 73 20 74 68 61 74 20 74 68 65 20 65 78 65 63  is that the exec
92b0: 28 29 20 61 62 6f 76 65 20 77 61 73 20 61 6e 20  () above was an 
92c0: 61 74 74 65 6d 70 74 20 74 6f 20 63 6f 6d 6d 69  attempt to commi
92d0: 74 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 74  t the.      ** t
92e0: 6f 70 2d 6c 65 76 65 6c 20 74 72 61 6e 73 61 63  op-level transac
92f0: 74 69 6f 6e 20 74 68 61 74 20 72 65 74 75 72 6e  tion that return
9300: 65 64 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20  ed SQLITE_BUSY. 
9310: 4f 72 2c 20 6c 65 73 73 20 6c 69 6b 65 6c 79 2c  Or, less likely,
9320: 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 61  .      ** that a
9330: 6e 20 49 4f 2d 65 72 72 6f 72 20 68 61 73 20 6f  n IO-error has o
9340: 63 63 75 72 72 65 64 2e 20 49 6e 20 65 69 74 68  ccurred. In eith
9350: 65 72 20 63 61 73 65 2c 20 74 68 72 6f 77 20 61  er case, throw a
9360: 20 54 63 6c 20 65 78 63 65 70 74 69 6f 6e 0a 20   Tcl exception. 
9370: 20 20 20 20 20 2a 2a 20 61 6e 64 20 74 72 79 20       ** and try 
9380: 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20  to rollback the 
9390: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20  transaction..   
93a0: 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 42     **.      ** B
93b0: 75 74 20 69 74 20 63 6f 75 6c 64 20 61 6c 73 6f  ut it could also
93c0: 20 62 65 20 74 68 61 74 20 74 68 65 20 75 73 65   be that the use
93d0: 72 20 65 78 65 63 75 74 65 64 20 6f 6e 65 20 6f  r executed one o
93e0: 72 20 6d 6f 72 65 20 42 45 47 49 4e 2c 0a 20 20  r more BEGIN,.  
93f0: 20 20 20 20 2a 2a 20 43 4f 4d 4d 49 54 2c 20 53      ** COMMIT, S
9400: 41 56 45 50 4f 49 4e 54 2c 20 52 45 4c 45 41 53  AVEPOINT, RELEAS
9410: 45 20 6f 72 20 52 4f 4c 4c 42 41 43 4b 20 63 6f  E or ROLLBACK co
9420: 6d 6d 61 6e 64 73 20 74 68 61 74 20 61 72 65 20  mmands that are 
9430: 63 6f 6e 66 75 73 69 6e 67 0a 20 20 20 20 20 20  confusing.      
9440: 2a 2a 20 74 68 69 73 20 6d 65 74 68 6f 64 27 73  ** this method's
9450: 20 6c 6f 67 69 63 2e 20 4e 6f 74 20 63 6c 65 61   logic. Not clea
9460: 72 20 68 6f 77 20 74 68 69 73 20 77 6f 75 6c 64  r how this would
9470: 20 62 65 20 62 65 73 74 20 68 61 6e 64 6c 65 64   be best handled
9480: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 69  ..      */.    i
9490: 66 28 20 72 63 21 3d 54 43 4c 5f 45 52 52 4f 52  f( rc!=TCL_ERROR
94a0: 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70   ){.      Tcl_Ap
94b0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
94c0: 70 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  p, sqlite3_errms
94d0: 67 28 70 44 62 2d 3e 64 62 29 2c 20 28 63 68 61  g(pDb->db), (cha
94e0: 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 72 63 20  r*)0);.      rc 
94f0: 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  = TCL_ERROR;.   
9500: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 65   }.    sqlite3_e
9510: 78 65 63 28 70 44 62 2d 3e 64 62 2c 20 22 52 4f  xec(pDb->db, "RO
9520: 4c 4c 42 41 43 4b 22 2c 20 30 2c 20 30 2c 20 30  LLBACK", 0, 0, 0
9530: 29 3b 0a 20 20 7d 0a 20 20 70 44 62 2d 3e 64 69  );.  }.  pDb->di
9540: 73 61 62 6c 65 41 75 74 68 2d 2d 3b 0a 0a 20 20  sableAuth--;..  
9550: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
9560: 0a 2a 2a 20 55 6e 6c 65 73 73 20 53 51 4c 49 54  .** Unless SQLIT
9570: 45 5f 54 45 53 54 20 69 73 20 64 65 66 69 6e 65  E_TEST is define
9580: 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  d, this function
9590: 20 69 73 20 61 20 73 69 6d 70 6c 65 20 77 72 61   is a simple wra
95a0: 70 70 65 72 20 61 72 6f 75 6e 64 0a 2a 2a 20 73  pper around.** s
95b0: 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76  qlite3_prepare_v
95c0: 32 28 29 2e 20 49 66 20 53 51 4c 49 54 45 5f 54  2(). If SQLITE_T
95d0: 45 53 54 20 69 73 20 64 65 66 69 6e 65 64 2c 20  EST is defined, 
95e0: 74 68 65 6e 20 69 74 20 75 73 65 73 20 65 69 74  then it uses eit
95f0: 68 65 72 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 70  her.** sqlite3_p
9600: 72 65 70 61 72 65 5f 76 32 28 29 20 6f 72 20 6c  repare_v2() or l
9610: 65 67 61 63 79 20 69 6e 74 65 72 66 61 63 65 20  egacy interface 
9620: 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28  sqlite3_prepare(
9630: 29 2c 20 64 65 70 65 6e 64 69 6e 67 0a 2a 2a 20  ), depending.** 
9640: 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  on whether or no
9650: 74 20 74 68 65 20 5b 64 62 5f 75 73 65 5f 6c 65  t the [db_use_le
9660: 67 61 63 79 5f 70 72 65 70 61 72 65 5d 20 63 6f  gacy_prepare] co
9670: 6d 6d 61 6e 64 20 68 61 73 20 62 65 65 6e 20 75  mmand has been u
9680: 73 65 64 20 74 6f 0a 2a 2a 20 63 6f 6e 66 69 67  sed to.** config
9690: 75 72 65 20 74 68 65 20 63 6f 6e 6e 65 63 74 69  ure the connecti
96a0: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
96b0: 74 20 64 62 50 72 65 70 61 72 65 28 0a 20 20 53  t dbPrepare(.  S
96c0: 71 6c 69 74 65 44 62 20 2a 70 44 62 2c 20 20 20  qliteDb *pDb,   
96d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
96e0: 2a 20 44 61 74 61 62 61 73 65 20 6f 62 6a 65 63  * Database objec
96f0: 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  t */.  const cha
9700: 72 20 2a 7a 53 71 6c 2c 20 20 20 20 20 20 20 20  r *zSql,        
9710: 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 20 74 6f         /* SQL to
9720: 20 63 6f 6d 70 69 6c 65 20 2a 2f 0a 20 20 73 71   compile */.  sq
9730: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 2a 70 70 53  lite3_stmt **ppS
9740: 74 6d 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  tmt,          /*
9750: 20 4f 55 54 3a 20 50 72 65 70 61 72 65 64 20 73   OUT: Prepared s
9760: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 63 6f  tatement */.  co
9770: 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f 75 74  nst char **pzOut
9780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9790: 20 4f 55 54 3a 20 50 6f 69 6e 74 65 72 20 74 6f   OUT: Pointer to
97a0: 20 6e 65 78 74 20 53 51 4c 20 73 74 61 74 65 6d   next SQL statem
97b0: 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69  ent */.){.  unsi
97c0: 67 6e 65 64 20 69 6e 74 20 70 72 65 70 46 6c 61  gned int prepFla
97d0: 67 73 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53  gs = 0;.#ifdef S
97e0: 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 66 28  QLITE_TEST.  if(
97f0: 20 70 44 62 2d 3e 62 4c 65 67 61 63 79 50 72 65   pDb->bLegacyPre
9800: 70 61 72 65 20 29 7b 0a 20 20 20 20 72 65 74 75  pare ){.    retu
9810: 72 6e 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61  rn sqlite3_prepa
9820: 72 65 28 70 44 62 2d 3e 64 62 2c 20 7a 53 71 6c  re(pDb->db, zSql
9830: 2c 20 2d 31 2c 20 70 70 53 74 6d 74 2c 20 70 7a  , -1, ppStmt, pz
9840: 4f 75 74 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  Out);.  }.#endif
9850: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 73 74 61  .  /* If the sta
9860: 74 65 6d 65 6e 74 20 63 61 63 68 65 20 69 73 20  tement cache is 
9870: 6c 61 72 67 65 2c 20 75 73 65 20 74 68 65 20 53  large, use the S
9880: 51 4c 49 54 45 5f 50 52 45 50 41 52 45 5f 50 45  QLITE_PREPARE_PE
9890: 52 53 49 53 54 45 4e 54 0a 20 20 2a 2a 20 66 6c  RSISTENT.  ** fl
98a0: 61 67 73 2c 20 77 68 69 63 68 20 75 73 65 73 20  ags, which uses 
98b0: 6c 65 73 73 20 6c 6f 6f 6b 61 73 69 64 65 20 6d  less lookaside m
98c0: 65 6d 6f 72 79 2e 20 20 42 75 74 20 69 66 20 74  emory.  But if t
98d0: 68 65 20 63 61 63 68 65 20 69 73 20 73 6d 61 6c  he cache is smal
98e0: 6c 2c 0a 20 20 2a 2a 20 6f 6d 69 74 20 74 68 61  l,.  ** omit tha
98f0: 74 20 66 6c 61 67 20 74 6f 20 6d 61 6b 65 20 66  t flag to make f
9900: 75 6c 6c 20 75 73 65 20 6f 66 20 6c 6f 6f 6b 61  ull use of looka
9910: 73 69 64 65 20 2a 2f 0a 20 20 69 66 28 20 70 44  side */.  if( pD
9920: 62 2d 3e 6d 61 78 53 74 6d 74 3e 35 20 29 20 70  b->maxStmt>5 ) p
9930: 72 65 70 46 6c 61 67 73 20 3d 20 53 51 4c 49 54  repFlags = SQLIT
9940: 45 5f 50 52 45 50 41 52 45 5f 50 45 52 53 49 53  E_PREPARE_PERSIS
9950: 54 45 4e 54 3b 0a 0a 20 20 72 65 74 75 72 6e 20  TENT;..  return 
9960: 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
9970: 76 33 28 70 44 62 2d 3e 64 62 2c 20 7a 53 71 6c  v3(pDb->db, zSql
9980: 2c 20 2d 31 2c 20 70 72 65 70 46 6c 61 67 73 2c  , -1, prepFlags,
9990: 20 70 70 53 74 6d 74 2c 20 70 7a 4f 75 74 29 3b   ppStmt, pzOut);
99a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68  .}../*.** Search
99b0: 20 74 68 65 20 63 61 63 68 65 20 66 6f 72 20 61   the cache for a
99c0: 20 70 72 65 70 61 72 65 64 2d 73 74 61 74 65 6d   prepared-statem
99d0: 65 6e 74 20 6f 62 6a 65 63 74 20 74 68 61 74 20  ent object that 
99e0: 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 0a 2a  implements the.*
99f0: 2a 20 66 69 72 73 74 20 53 51 4c 20 73 74 61 74  * first SQL stat
9a00: 65 6d 65 6e 74 20 69 6e 20 74 68 65 20 62 75 66  ement in the buf
9a10: 66 65 72 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  fer pointed to b
9a20: 79 20 70 61 72 61 6d 65 74 65 72 20 7a 49 6e 2e  y parameter zIn.
9a30: 20 49 66 0a 2a 2a 20 6e 6f 20 73 75 63 68 20 70   If.** no such p
9a40: 72 65 70 61 72 65 64 2d 73 74 61 74 65 6d 65 6e  repared-statemen
9a50: 74 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 2c 20  t can be found, 
9a60: 61 6c 6c 6f 63 61 74 65 20 61 6e 64 20 70 72 65  allocate and pre
9a70: 70 61 72 65 20 61 20 6e 65 77 0a 2a 2a 20 6f 6e  pare a new.** on
9a80: 65 2e 20 49 6e 20 65 69 74 68 65 72 20 63 61 73  e. In either cas
9a90: 65 2c 20 62 69 6e 64 20 74 68 65 20 63 75 72 72  e, bind the curr
9aa0: 65 6e 74 20 76 61 6c 75 65 73 20 6f 66 20 74 68  ent values of th
9ab0: 65 20 72 65 6c 65 76 61 6e 74 20 54 63 6c 0a 2a  e relevant Tcl.*
9ac0: 2a 20 76 61 72 69 61 62 6c 65 73 20 74 6f 20 61  * variables to a
9ad0: 6e 79 20 24 76 61 72 2c 20 3a 76 61 72 20 6f 72  ny $var, :var or
9ae0: 20 40 76 61 72 20 76 61 72 69 61 62 6c 65 73 20   @var variables 
9af0: 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  in the statement
9b00: 2e 20 42 65 66 6f 72 65 0a 2a 2a 20 72 65 74 75  . Before.** retu
9b10: 72 6e 69 6e 67 2c 20 73 65 74 20 2a 70 70 50 72  rning, set *ppPr
9b20: 65 53 74 6d 74 20 74 6f 20 70 6f 69 6e 74 20 74  eStmt to point t
9b30: 6f 20 74 68 65 20 70 72 65 70 61 72 65 64 2d 73  o the prepared-s
9b40: 74 61 74 65 6d 65 6e 74 20 6f 62 6a 65 63 74 2e  tatement object.
9b50: 0a 2a 2a 0a 2a 2a 20 4f 75 74 70 75 74 20 70 61  .**.** Output pa
9b60: 72 61 6d 65 74 65 72 20 2a 70 7a 4f 75 74 20 69  rameter *pzOut i
9b70: 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  s set to point t
9b80: 6f 20 74 68 65 20 6e 65 78 74 20 53 51 4c 20 73  o the next SQL s
9b90: 74 61 74 65 6d 65 6e 74 20 69 6e 0a 2a 2a 20 62  tatement in.** b
9ba0: 75 66 66 65 72 20 7a 49 6e 2c 20 6f 72 20 74 6f  uffer zIn, or to
9bb0: 20 74 68 65 20 27 5c 30 27 20 62 79 74 65 20 61   the '\0' byte a
9bc0: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 7a 49 6e  t the end of zIn
9bd0: 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 0a   if there is no.
9be0: 2a 2a 20 6e 65 78 74 20 73 74 61 74 65 6d 65 6e  ** next statemen
9bf0: 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63  t..**.** If succ
9c00: 65 73 73 66 75 6c 2c 20 54 43 4c 5f 4f 4b 20 69  essful, TCL_OK i
9c10: 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
9c20: 72 77 69 73 65 2c 20 54 43 4c 5f 45 52 52 4f 52  rwise, TCL_ERROR
9c30: 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20   is returned.** 
9c40: 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  and an error mes
9c50: 73 61 67 65 20 6c 6f 61 64 65 64 20 69 6e 74 6f  sage loaded into
9c60: 20 69 6e 74 65 72 70 72 65 74 65 72 20 70 44 62   interpreter pDb
9c70: 2d 3e 69 6e 74 65 72 70 2e 0a 2a 2f 0a 73 74 61  ->interp..*/.sta
9c80: 74 69 63 20 69 6e 74 20 64 62 50 72 65 70 61 72  tic int dbPrepar
9c90: 65 41 6e 64 42 69 6e 64 28 0a 20 20 53 71 6c 69  eAndBind(.  Sqli
9ca0: 74 65 44 62 20 2a 70 44 62 2c 20 20 20 20 20 20  teDb *pDb,      
9cb0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
9cc0: 61 74 61 62 61 73 65 20 6f 62 6a 65 63 74 20 2a  atabase object *
9cd0: 2f 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a  /.  char const *
9ce0: 7a 49 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  zIn,            
9cf0: 20 20 20 20 2f 2a 20 53 51 4c 20 74 6f 20 63 6f      /* SQL to co
9d00: 6d 70 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20  mpile */.  char 
9d10: 63 6f 6e 73 74 20 2a 2a 70 7a 4f 75 74 2c 20 20  const **pzOut,  
9d20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
9d30: 54 3a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6e 65  T: Pointer to ne
9d40: 78 74 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  xt SQL statement
9d50: 20 2a 2f 0a 20 20 53 71 6c 50 72 65 70 61 72 65   */.  SqlPrepare
9d60: 64 53 74 6d 74 20 2a 2a 70 70 50 72 65 53 74 6d  dStmt **ppPreStm
9d70: 74 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4f 62  t     /* OUT: Ob
9d80: 6a 65 63 74 20 75 73 65 64 20 74 6f 20 63 61 63  ject used to cac
9d90: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  he statement */.
9da0: 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
9db0: 2a 7a 53 71 6c 20 3d 20 7a 49 6e 3b 20 20 20 20  *zSql = zIn;    
9dc0: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
9dd0: 74 6f 20 66 69 72 73 74 20 53 51 4c 20 73 74 61  to first SQL sta
9de0: 74 65 6d 65 6e 74 20 69 6e 20 7a 49 6e 20 2a 2f  tement in zIn */
9df0: 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
9e00: 2a 70 53 74 6d 74 20 3d 20 30 3b 20 20 20 20 20  *pStmt = 0;     
9e10: 20 20 20 2f 2a 20 50 72 65 70 61 72 65 64 20 73     /* Prepared s
9e20: 74 61 74 65 6d 65 6e 74 20 6f 62 6a 65 63 74 20  tatement object 
9e30: 2a 2f 0a 20 20 53 71 6c 50 72 65 70 61 72 65 64  */.  SqlPrepared
9e40: 53 74 6d 74 20 2a 70 50 72 65 53 74 6d 74 3b 20  Stmt *pPreStmt; 
9e50: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
9e60: 74 6f 20 63 61 63 68 65 64 20 73 74 61 74 65 6d  to cached statem
9e70: 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 71  ent */.  int nSq
9e80: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
9e90: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67           /* Leng
9ea0: 74 68 20 6f 66 20 7a 53 71 6c 20 69 6e 20 62 79  th of zSql in by
9eb0: 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 56 61  tes */.  int nVa
9ec0: 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  r = 0;          
9ed0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
9ee0: 65 72 20 6f 66 20 76 61 72 69 61 62 6c 65 73 20  er of variables 
9ef0: 69 6e 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  in statement */.
9f00: 20 20 69 6e 74 20 69 50 61 72 6d 20 3d 20 30 3b    int iParm = 0;
9f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9f20: 20 20 2f 2a 20 4e 65 78 74 20 66 72 65 65 20 65    /* Next free e
9f30: 6e 74 72 79 20 69 6e 20 61 70 50 61 72 6d 20 2a  ntry in apParm *
9f40: 2f 0a 20 20 63 68 61 72 20 63 3b 0a 20 20 69 6e  /.  char c;.  in
9f50: 74 20 69 3b 0a 20 20 54 63 6c 5f 49 6e 74 65 72  t i;.  Tcl_Inter
9f60: 70 20 2a 69 6e 74 65 72 70 20 3d 20 70 44 62 2d  p *interp = pDb-
9f70: 3e 69 6e 74 65 72 70 3b 0a 0a 20 20 2a 70 70 50  >interp;..  *ppP
9f80: 72 65 53 74 6d 74 20 3d 20 30 3b 0a 0a 20 20 2f  reStmt = 0;..  /
9f90: 2a 20 54 72 69 6d 20 73 70 61 63 65 73 20 66 72  * Trim spaces fr
9fa0: 6f 6d 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  om the start of 
9fb0: 7a 53 71 6c 20 61 6e 64 20 63 61 6c 63 75 6c 61  zSql and calcula
9fc0: 74 65 20 74 68 65 20 72 65 6d 61 69 6e 69 6e 67  te the remaining
9fd0: 20 6c 65 6e 67 74 68 2e 20 2a 2f 0a 20 20 77 68   length. */.  wh
9fe0: 69 6c 65 28 20 28 63 20 3d 20 7a 53 71 6c 5b 30  ile( (c = zSql[0
9ff0: 5d 29 3d 3d 27 20 27 20 7c 7c 20 63 3d 3d 27 5c  ])==' ' || c=='\
a000: 74 27 20 7c 7c 20 63 3d 3d 27 5c 72 27 20 7c 7c  t' || c=='\r' ||
a010: 20 63 3d 3d 27 5c 6e 27 20 29 7b 20 7a 53 71 6c   c=='\n' ){ zSql
a020: 2b 2b 3b 20 7d 0a 20 20 6e 53 71 6c 20 3d 20 73  ++; }.  nSql = s
a030: 74 72 6c 65 6e 33 30 28 7a 53 71 6c 29 3b 0a 0a  trlen30(zSql);..
a040: 20 20 66 6f 72 28 70 50 72 65 53 74 6d 74 20 3d    for(pPreStmt =
a050: 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74 3b 20   pDb->stmtList; 
a060: 70 50 72 65 53 74 6d 74 3b 20 70 50 72 65 53 74  pPreStmt; pPreSt
a070: 6d 74 3d 70 50 72 65 53 74 6d 74 2d 3e 70 4e 65  mt=pPreStmt->pNe
a080: 78 74 29 7b 0a 20 20 20 20 69 6e 74 20 6e 20 3d  xt){.    int n =
a090: 20 70 50 72 65 53 74 6d 74 2d 3e 6e 53 71 6c 3b   pPreStmt->nSql;
a0a0: 0a 20 20 20 20 69 66 28 20 6e 53 71 6c 3e 3d 6e  .    if( nSql>=n
a0b0: 0a 20 20 20 20 20 20 20 20 26 26 20 6d 65 6d 63  .        && memc
a0c0: 6d 70 28 70 50 72 65 53 74 6d 74 2d 3e 7a 53 71  mp(pPreStmt->zSq
a0d0: 6c 2c 20 7a 53 71 6c 2c 20 6e 29 3d 3d 30 0a 20  l, zSql, n)==0. 
a0e0: 20 20 20 20 20 20 20 26 26 20 28 7a 53 71 6c 5b         && (zSql[
a0f0: 6e 5d 3d 3d 30 20 7c 7c 20 7a 53 71 6c 5b 6e 2d  n]==0 || zSql[n-
a100: 31 5d 3d 3d 27 3b 27 29 0a 20 20 20 20 29 7b 0a  1]==';').    ){.
a110: 20 20 20 20 20 20 70 53 74 6d 74 20 3d 20 70 50        pStmt = pP
a120: 72 65 53 74 6d 74 2d 3e 70 53 74 6d 74 3b 0a 20  reStmt->pStmt;. 
a130: 20 20 20 20 20 2a 70 7a 4f 75 74 20 3d 20 26 7a       *pzOut = &z
a140: 53 71 6c 5b 70 50 72 65 53 74 6d 74 2d 3e 6e 53  Sql[pPreStmt->nS
a150: 71 6c 5d 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57  ql];..      /* W
a160: 68 65 6e 20 61 20 70 72 65 70 61 72 65 64 20 73  hen a prepared s
a170: 74 61 74 65 6d 65 6e 74 20 69 73 20 66 6f 75 6e  tatement is foun
a180: 64 2c 20 75 6e 6c 69 6e 6b 20 69 74 20 66 72 6f  d, unlink it fro
a190: 6d 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 63  m the.      ** c
a1a0: 61 63 68 65 20 6c 69 73 74 2e 20 20 49 74 20 77  ache list.  It w
a1b0: 69 6c 6c 20 6c 61 74 65 72 20 62 65 20 61 64 64  ill later be add
a1c0: 65 64 20 62 61 63 6b 20 74 6f 20 74 68 65 20 62  ed back to the b
a1d0: 65 67 69 6e 6e 69 6e 67 0a 20 20 20 20 20 20 2a  eginning.      *
a1e0: 2a 20 6f 66 20 74 68 65 20 63 61 63 68 65 20 6c  * of the cache l
a1f0: 69 73 74 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ist in order to 
a200: 69 6d 70 6c 65 6d 65 6e 74 20 4c 52 55 20 72 65  implement LRU re
a210: 70 6c 61 63 65 6d 65 6e 74 2e 0a 20 20 20 20 20  placement..     
a220: 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 50   */.      if( pP
a230: 72 65 53 74 6d 74 2d 3e 70 50 72 65 76 20 29 7b  reStmt->pPrev ){
a240: 0a 20 20 20 20 20 20 20 20 70 50 72 65 53 74 6d  .        pPreStm
a250: 74 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20  t->pPrev->pNext 
a260: 3d 20 70 50 72 65 53 74 6d 74 2d 3e 70 4e 65 78  = pPreStmt->pNex
a270: 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  t;.      }else{.
a280: 20 20 20 20 20 20 20 20 70 44 62 2d 3e 73 74 6d          pDb->stm
a290: 74 4c 69 73 74 20 3d 20 70 50 72 65 53 74 6d 74  tList = pPreStmt
a2a0: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d  ->pNext;.      }
a2b0: 0a 20 20 20 20 20 20 69 66 28 20 70 50 72 65 53  .      if( pPreS
a2c0: 74 6d 74 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20  tmt->pNext ){.  
a2d0: 20 20 20 20 20 20 70 50 72 65 53 74 6d 74 2d 3e        pPreStmt->
a2e0: 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70  pNext->pPrev = p
a2f0: 50 72 65 53 74 6d 74 2d 3e 70 50 72 65 76 3b 0a  PreStmt->pPrev;.
a300: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
a310: 20 20 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c 61       pDb->stmtLa
a320: 73 74 20 3d 20 70 50 72 65 53 74 6d 74 2d 3e 70  st = pPreStmt->p
a330: 50 72 65 76 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Prev;.      }.  
a340: 20 20 20 20 70 44 62 2d 3e 6e 53 74 6d 74 2d 2d      pDb->nStmt--
a350: 3b 0a 20 20 20 20 20 20 6e 56 61 72 20 3d 20 73  ;.      nVar = s
a360: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61  qlite3_bind_para
a370: 6d 65 74 65 72 5f 63 6f 75 6e 74 28 70 53 74 6d  meter_count(pStm
a380: 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  t);.      break;
a390: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
a3a0: 20 49 66 20 6e 6f 20 70 72 65 70 61 72 65 64 20   If no prepared 
a3b0: 73 74 61 74 65 6d 65 6e 74 20 77 61 73 20 66 6f  statement was fo
a3c0: 75 6e 64 2e 20 43 6f 6d 70 69 6c 65 20 74 68 65  und. Compile the
a3d0: 20 53 51 4c 20 74 65 78 74 2e 20 41 6c 73 6f 20   SQL text. Also 
a3e0: 61 6c 6c 6f 63 61 74 65 0a 20 20 2a 2a 20 61 20  allocate.  ** a 
a3f0: 6e 65 77 20 53 71 6c 50 72 65 70 61 72 65 64 53  new SqlPreparedS
a400: 74 6d 74 20 73 74 72 75 63 74 75 72 65 2e 20 20  tmt structure.  
a410: 2a 2f 0a 20 20 69 66 28 20 70 50 72 65 53 74 6d  */.  if( pPreStm
a420: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  t==0 ){.    int 
a430: 6e 42 79 74 65 3b 0a 0a 20 20 20 20 69 66 28 20  nByte;..    if( 
a440: 53 51 4c 49 54 45 5f 4f 4b 21 3d 64 62 50 72 65  SQLITE_OK!=dbPre
a450: 70 61 72 65 28 70 44 62 2c 20 7a 53 71 6c 2c 20  pare(pDb, zSql, 
a460: 26 70 53 74 6d 74 2c 20 70 7a 4f 75 74 29 20 29  &pStmt, pzOut) )
a470: 7b 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f  {.      Tcl_SetO
a480: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
a490: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
a4a0: 6a 28 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  j(sqlite3_errmsg
a4b0: 28 70 44 62 2d 3e 64 62 29 2c 20 2d 31 29 29 3b  (pDb->db), -1));
a4c0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
a4d0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
a4e0: 20 20 20 69 66 28 20 70 53 74 6d 74 3d 3d 30 20     if( pStmt==0 
a4f0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c  ){.      if( SQL
a500: 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 5f  ITE_OK!=sqlite3_
a510: 65 72 72 63 6f 64 65 28 70 44 62 2d 3e 64 62 29  errcode(pDb->db)
a520: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41   ){.        /* A
a530: 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 65 72   compile-time er
a540: 72 6f 72 20 69 6e 20 74 68 65 20 73 74 61 74 65  ror in the state
a550: 6d 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20  ment. */.       
a560: 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
a570: 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
a580: 77 53 74 72 69 6e 67 4f 62 6a 28 73 71 6c 69 74  wStringObj(sqlit
a590: 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64  e3_errmsg(pDb->d
a5a0: 62 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 20 20  b), -1));.      
a5b0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
a5c0: 4f 52 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  OR;.      }else{
a5d0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
a5e0: 73 74 61 74 65 6d 65 6e 74 20 77 61 73 20 61 20  statement was a 
a5f0: 6e 6f 2d 6f 70 2e 20 20 43 6f 6e 74 69 6e 75 65  no-op.  Continue
a600: 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73 74 61   to the next sta
a610: 74 65 6d 65 6e 74 0a 20 20 20 20 20 20 20 20 2a  tement.        *
a620: 2a 20 69 6e 20 74 68 65 20 53 51 4c 20 73 74 72  * in the SQL str
a630: 69 6e 67 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ing..        */.
a640: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54          return T
a650: 43 4c 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  CL_OK;.      }. 
a660: 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74     }..    assert
a670: 28 20 70 50 72 65 53 74 6d 74 3d 3d 30 20 29 3b  ( pPreStmt==0 );
a680: 0a 20 20 20 20 6e 56 61 72 20 3d 20 73 71 6c 69  .    nVar = sqli
a690: 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74  te3_bind_paramet
a6a0: 65 72 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29 3b  er_count(pStmt);
a6b0: 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 73 69 7a  .    nByte = siz
a6c0: 65 6f 66 28 53 71 6c 50 72 65 70 61 72 65 64 53  eof(SqlPreparedS
a6d0: 74 6d 74 29 20 2b 20 6e 56 61 72 2a 73 69 7a 65  tmt) + nVar*size
a6e0: 6f 66 28 54 63 6c 5f 4f 62 6a 20 2a 29 3b 0a 20  of(Tcl_Obj *);. 
a6f0: 20 20 20 70 50 72 65 53 74 6d 74 20 3d 20 28 53     pPreStmt = (S
a700: 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74 2a 29  qlPreparedStmt*)
a710: 54 63 6c 5f 41 6c 6c 6f 63 28 6e 42 79 74 65 29  Tcl_Alloc(nByte)
a720: 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 50 72  ;.    memset(pPr
a730: 65 53 74 6d 74 2c 20 30 2c 20 6e 42 79 74 65 29  eStmt, 0, nByte)
a740: 3b 0a 0a 20 20 20 20 70 50 72 65 53 74 6d 74 2d  ;..    pPreStmt-
a750: 3e 70 53 74 6d 74 20 3d 20 70 53 74 6d 74 3b 0a  >pStmt = pStmt;.
a760: 20 20 20 20 70 50 72 65 53 74 6d 74 2d 3e 6e 53      pPreStmt->nS
a770: 71 6c 20 3d 20 28 69 6e 74 29 28 2a 70 7a 4f 75  ql = (int)(*pzOu
a780: 74 20 2d 20 7a 53 71 6c 29 3b 0a 20 20 20 20 70  t - zSql);.    p
a790: 50 72 65 53 74 6d 74 2d 3e 7a 53 71 6c 20 3d 20  PreStmt->zSql = 
a7a0: 73 71 6c 69 74 65 33 5f 73 71 6c 28 70 53 74 6d  sqlite3_sql(pStm
a7b0: 74 29 3b 0a 20 20 20 20 70 50 72 65 53 74 6d 74  t);.    pPreStmt
a7c0: 2d 3e 61 70 50 61 72 6d 20 3d 20 28 54 63 6c 5f  ->apParm = (Tcl_
a7d0: 4f 62 6a 20 2a 2a 29 26 70 50 72 65 53 74 6d 74  Obj **)&pPreStmt
a7e0: 5b 31 5d 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  [1];.#ifdef SQLI
a7f0: 54 45 5f 54 45 53 54 0a 20 20 20 20 69 66 28 20  TE_TEST.    if( 
a800: 70 50 72 65 53 74 6d 74 2d 3e 7a 53 71 6c 3d 3d  pPreStmt->zSql==
a810: 30 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20  0 ){.      char 
a820: 2a 7a 43 6f 70 79 20 3d 20 54 63 6c 5f 41 6c 6c  *zCopy = Tcl_All
a830: 6f 63 28 70 50 72 65 53 74 6d 74 2d 3e 6e 53 71  oc(pPreStmt->nSq
a840: 6c 20 2b 20 31 29 3b 0a 20 20 20 20 20 20 6d 65  l + 1);.      me
a850: 6d 63 70 79 28 7a 43 6f 70 79 2c 20 7a 53 71 6c  mcpy(zCopy, zSql
a860: 2c 20 70 50 72 65 53 74 6d 74 2d 3e 6e 53 71 6c  , pPreStmt->nSql
a870: 29 3b 0a 20 20 20 20 20 20 7a 43 6f 70 79 5b 70  );.      zCopy[p
a880: 50 72 65 53 74 6d 74 2d 3e 6e 53 71 6c 5d 20 3d  PreStmt->nSql] =
a890: 20 27 5c 30 27 3b 0a 20 20 20 20 20 20 70 50 72   '\0';.      pPr
a8a0: 65 53 74 6d 74 2d 3e 7a 53 71 6c 20 3d 20 7a 43  eStmt->zSql = zC
a8b0: 6f 70 79 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  opy;.    }.#endi
a8c0: 66 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  f.  }.  assert( 
a8d0: 70 50 72 65 53 74 6d 74 20 29 3b 0a 20 20 61 73  pPreStmt );.  as
a8e0: 73 65 72 74 28 20 73 74 72 6c 65 6e 33 30 28 70  sert( strlen30(p
a8f0: 50 72 65 53 74 6d 74 2d 3e 7a 53 71 6c 29 3d 3d  PreStmt->zSql)==
a900: 70 50 72 65 53 74 6d 74 2d 3e 6e 53 71 6c 20 29  pPreStmt->nSql )
a910: 3b 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 6d  ;.  assert( 0==m
a920: 65 6d 63 6d 70 28 70 50 72 65 53 74 6d 74 2d 3e  emcmp(pPreStmt->
a930: 7a 53 71 6c 2c 20 7a 53 71 6c 2c 20 70 50 72 65  zSql, zSql, pPre
a940: 53 74 6d 74 2d 3e 6e 53 71 6c 29 20 29 3b 0a 0a  Stmt->nSql) );..
a950: 20 20 2f 2a 20 42 69 6e 64 20 76 61 6c 75 65 73    /* Bind values
a960: 20 74 6f 20 70 61 72 61 6d 65 74 65 72 73 20 74   to parameters t
a970: 68 61 74 20 62 65 67 69 6e 20 77 69 74 68 20 24  hat begin with $
a980: 20 6f 72 20 3a 20 2a 2f 0a 20 20 66 6f 72 28 69   or : */.  for(i
a990: 3d 31 3b 20 69 3c 3d 6e 56 61 72 3b 20 69 2b 2b  =1; i<=nVar; i++
a9a0: 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ){.    const cha
a9b0: 72 20 2a 7a 56 61 72 20 3d 20 73 71 6c 69 74 65  r *zVar = sqlite
a9c0: 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72  3_bind_parameter
a9d0: 5f 6e 61 6d 65 28 70 53 74 6d 74 2c 20 69 29 3b  _name(pStmt, i);
a9e0: 0a 20 20 20 20 69 66 28 20 7a 56 61 72 21 3d 30  .    if( zVar!=0
a9f0: 20 26 26 20 28 7a 56 61 72 5b 30 5d 3d 3d 27 24   && (zVar[0]=='$
aa00: 27 20 7c 7c 20 7a 56 61 72 5b 30 5d 3d 3d 27 3a  ' || zVar[0]==':
aa10: 27 20 7c 7c 20 7a 56 61 72 5b 30 5d 3d 3d 27 40  ' || zVar[0]=='@
aa20: 27 29 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  ') ){.      Tcl_
aa30: 4f 62 6a 20 2a 70 56 61 72 20 3d 20 54 63 6c 5f  Obj *pVar = Tcl_
aa40: 47 65 74 56 61 72 32 45 78 28 69 6e 74 65 72 70  GetVar2Ex(interp
aa50: 2c 20 26 7a 56 61 72 5b 31 5d 2c 20 30 2c 20 30  , &zVar[1], 0, 0
aa60: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 56 61  );.      if( pVa
aa70: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  r ){.        int
aa80: 20 6e 3b 0a 20 20 20 20 20 20 20 20 75 38 20 2a   n;.        u8 *
aa90: 64 61 74 61 3b 0a 20 20 20 20 20 20 20 20 63 6f  data;.        co
aaa0: 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 20  nst char *zType 
aab0: 3d 20 28 70 56 61 72 2d 3e 74 79 70 65 50 74 72  = (pVar->typePtr
aac0: 20 3f 20 70 56 61 72 2d 3e 74 79 70 65 50 74 72   ? pVar->typePtr
aad0: 2d 3e 6e 61 6d 65 20 3a 20 22 22 29 3b 0a 20 20  ->name : "");.  
aae0: 20 20 20 20 20 20 63 20 3d 20 7a 54 79 70 65 5b        c = zType[
aaf0: 30 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0];.        if( 
ab00: 7a 56 61 72 5b 30 5d 3d 3d 27 40 27 20 7c 7c 0a  zVar[0]=='@' ||.
ab10: 20 20 20 20 20 20 20 20 20 20 20 28 63 3d 3d 27             (c=='
ab20: 62 27 20 26 26 20 73 74 72 63 6d 70 28 7a 54 79  b' && strcmp(zTy
ab30: 70 65 2c 22 62 79 74 65 61 72 72 61 79 22 29 3d  pe,"bytearray")=
ab40: 3d 30 20 26 26 20 70 56 61 72 2d 3e 62 79 74 65  =0 && pVar->byte
ab50: 73 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20  s==0) ){.       
ab60: 20 20 20 2f 2a 20 4c 6f 61 64 20 61 20 42 4c 4f     /* Load a BLO
ab70: 42 20 74 79 70 65 20 69 66 20 74 68 65 20 54 63  B type if the Tc
ab80: 6c 20 76 61 72 69 61 62 6c 65 20 69 73 20 61 20  l variable is a 
ab90: 62 79 74 65 61 72 72 61 79 20 61 6e 64 0a 20 20  bytearray and.  
aba0: 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 68 61          ** it ha
abb0: 73 20 6e 6f 20 73 74 72 69 6e 67 20 72 65 70 72  s no string repr
abc0: 65 73 65 6e 74 61 74 69 6f 6e 20 6f 72 20 74 68  esentation or th
abd0: 65 20 68 6f 73 74 0a 20 20 20 20 20 20 20 20 20  e host.         
abe0: 20 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 6e 61   ** parameter na
abf0: 6d 65 20 62 65 67 69 6e 73 20 77 69 74 68 20 22  me begins with "
ac00: 40 22 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  @". */.         
ac10: 20 64 61 74 61 20 3d 20 54 63 6c 5f 47 65 74 42   data = Tcl_GetB
ac20: 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28  yteArrayFromObj(
ac30: 70 56 61 72 2c 20 26 6e 29 3b 0a 20 20 20 20 20  pVar, &n);.     
ac40: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e       sqlite3_bin
ac50: 64 5f 62 6c 6f 62 28 70 53 74 6d 74 2c 20 69 2c  d_blob(pStmt, i,
ac60: 20 64 61 74 61 2c 20 6e 2c 20 53 51 4c 49 54 45   data, n, SQLITE
ac70: 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20  _STATIC);.      
ac80: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43      Tcl_IncrRefC
ac90: 6f 75 6e 74 28 70 56 61 72 29 3b 0a 20 20 20 20  ount(pVar);.    
aca0: 20 20 20 20 20 20 70 50 72 65 53 74 6d 74 2d 3e        pPreStmt->
acb0: 61 70 50 61 72 6d 5b 69 50 61 72 6d 2b 2b 5d 20  apParm[iParm++] 
acc0: 3d 20 70 56 61 72 3b 0a 20 20 20 20 20 20 20 20  = pVar;.        
acd0: 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 62 27  }else if( c=='b'
ace0: 20 26 26 20 73 74 72 63 6d 70 28 7a 54 79 70 65   && strcmp(zType
acf0: 2c 22 62 6f 6f 6c 65 61 6e 22 29 3d 3d 30 20 29  ,"boolean")==0 )
ad00: 7b 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f  {.          Tcl_
ad10: 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
ad20: 74 65 72 70 2c 20 70 56 61 72 2c 20 26 6e 29 3b  terp, pVar, &n);
ad30: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
ad40: 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 53 74 6d  e3_bind_int(pStm
ad50: 74 2c 20 69 2c 20 6e 29 3b 0a 20 20 20 20 20 20  t, i, n);.      
ad60: 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27    }else if( c=='
ad70: 64 27 20 26 26 20 73 74 72 63 6d 70 28 7a 54 79  d' && strcmp(zTy
ad80: 70 65 2c 22 64 6f 75 62 6c 65 22 29 3d 3d 30 20  pe,"double")==0 
ad90: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 64 6f 75  ){.          dou
ada0: 62 6c 65 20 72 3b 0a 20 20 20 20 20 20 20 20 20  ble r;.         
adb0: 20 54 63 6c 5f 47 65 74 44 6f 75 62 6c 65 46 72   Tcl_GetDoubleFr
adc0: 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 70 56  omObj(interp, pV
add0: 61 72 2c 20 26 72 29 3b 0a 20 20 20 20 20 20 20  ar, &r);.       
ade0: 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
adf0: 64 6f 75 62 6c 65 28 70 53 74 6d 74 2c 20 69 2c  double(pStmt, i,
ae00: 20 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c   r);.        }el
ae10: 73 65 20 69 66 28 20 28 63 3d 3d 27 77 27 20 26  se if( (c=='w' &
ae20: 26 20 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22  & strcmp(zType,"
ae30: 77 69 64 65 49 6e 74 22 29 3d 3d 30 29 20 7c 7c  wideInt")==0) ||
ae40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28  .              (
ae50: 63 3d 3d 27 69 27 20 26 26 20 73 74 72 63 6d 70  c=='i' && strcmp
ae60: 28 7a 54 79 70 65 2c 22 69 6e 74 22 29 3d 3d 30  (zType,"int")==0
ae70: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54  ) ){.          T
ae80: 63 6c 5f 57 69 64 65 49 6e 74 20 76 3b 0a 20 20  cl_WideInt v;.  
ae90: 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 57          Tcl_GetW
aea0: 69 64 65 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  ideIntFromObj(in
aeb0: 74 65 72 70 2c 20 70 56 61 72 2c 20 26 76 29 3b  terp, pVar, &v);
aec0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
aed0: 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 53  e3_bind_int64(pS
aee0: 74 6d 74 2c 20 69 2c 20 76 29 3b 0a 20 20 20 20  tmt, i, v);.    
aef0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
af00: 20 20 20 20 20 64 61 74 61 20 3d 20 28 75 6e 73       data = (uns
af10: 69 67 6e 65 64 20 63 68 61 72 20 2a 29 54 63 6c  igned char *)Tcl
af20: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
af30: 6a 28 70 56 61 72 2c 20 26 6e 29 3b 0a 20 20 20  j(pVar, &n);.   
af40: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62         sqlite3_b
af50: 69 6e 64 5f 74 65 78 74 28 70 53 74 6d 74 2c 20  ind_text(pStmt, 
af60: 69 2c 20 28 63 68 61 72 20 2a 29 64 61 74 61 2c  i, (char *)data,
af70: 20 6e 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49   n, SQLITE_STATI
af80: 43 29 3b 0a 20 20 20 20 20 20 20 20 20 20 54 63  C);.          Tc
af90: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70  l_IncrRefCount(p
afa0: 56 61 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Var);.          
afb0: 70 50 72 65 53 74 6d 74 2d 3e 61 70 50 61 72 6d  pPreStmt->apParm
afc0: 5b 69 50 61 72 6d 2b 2b 5d 20 3d 20 70 56 61 72  [iParm++] = pVar
afd0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
afe0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
aff0: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75   sqlite3_bind_nu
b000: 6c 6c 28 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20  ll(pStmt, i);.  
b010: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
b020: 20 20 70 50 72 65 53 74 6d 74 2d 3e 6e 50 61 72    pPreStmt->nPar
b030: 6d 20 3d 20 69 50 61 72 6d 3b 0a 20 20 2a 70 70  m = iParm;.  *pp
b040: 50 72 65 53 74 6d 74 20 3d 20 70 50 72 65 53 74  PreStmt = pPreSt
b050: 6d 74 3b 0a 0a 20 20 72 65 74 75 72 6e 20 54 43  mt;..  return TC
b060: 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  L_OK;.}../*.** R
b070: 65 6c 65 61 73 65 20 61 20 73 74 61 74 65 6d 65  elease a stateme
b080: 6e 74 20 72 65 66 65 72 65 6e 63 65 20 6f 62 74  nt reference obt
b090: 61 69 6e 65 64 20 62 79 20 63 61 6c 6c 69 6e 67  ained by calling
b0a0: 20 64 62 50 72 65 70 61 72 65 41 6e 64 42 69 6e   dbPrepareAndBin
b0b0: 64 28 29 2e 0a 2a 2a 20 54 68 65 72 65 20 73 68  d()..** There sh
b0c0: 6f 75 6c 64 20 62 65 20 65 78 61 63 74 6c 79 20  ould be exactly 
b0d0: 6f 6e 65 20 63 61 6c 6c 20 74 6f 20 74 68 69 73  one call to this
b0e0: 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 65 61   function for ea
b0f0: 63 68 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20 64 62  ch call to.** db
b100: 50 72 65 70 61 72 65 41 6e 64 42 69 6e 64 28 29  PrepareAndBind()
b110: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64  ..**.** If the d
b120: 69 73 63 61 72 64 20 70 61 72 61 6d 65 74 65 72  iscard parameter
b130: 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
b140: 65 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  en the statement
b150: 20 69 73 20 64 65 6c 65 74 65 64 0a 2a 2a 20 69   is deleted.** i
b160: 6d 6d 65 64 69 61 74 65 6c 79 2e 20 4f 74 68 65  mmediately. Othe
b170: 72 77 69 73 65 20 69 74 20 69 73 20 61 64 64 65  rwise it is adde
b180: 64 20 74 6f 20 74 68 65 20 4c 52 55 20 6c 69 73  d to the LRU lis
b190: 74 20 61 6e 64 20 6d 61 79 20 62 65 20 72 65 74  t and may be ret
b1a0: 75 72 6e 65 64 0a 2a 2a 20 62 79 20 61 20 73 75  urned.** by a su
b1b0: 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 20 74 6f  bsequent call to
b1c0: 20 64 62 50 72 65 70 61 72 65 41 6e 64 42 69 6e   dbPrepareAndBin
b1d0: 64 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  d()..*/.static v
b1e0: 6f 69 64 20 64 62 52 65 6c 65 61 73 65 53 74 6d  oid dbReleaseStm
b1f0: 74 28 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70  t(.  SqliteDb *p
b200: 44 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Db,             
b210: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
b220: 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 53 71 6c   handle */.  Sql
b230: 50 72 65 70 61 72 65 64 53 74 6d 74 20 2a 70 50  PreparedStmt *pP
b240: 72 65 53 74 6d 74 2c 20 20 20 20 20 20 2f 2a 20  reStmt,      /* 
b250: 50 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  Prepared stateme
b260: 6e 74 20 68 61 6e 64 6c 65 20 74 6f 20 72 65 6c  nt handle to rel
b270: 65 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 64 69  ease */.  int di
b280: 73 63 61 72 64 20 20 20 20 20 20 20 20 20 20 20  scard           
b290: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
b2a0: 65 20 74 6f 20 64 65 6c 65 74 65 20 28 6e 6f 74  e to delete (not
b2b0: 20 63 61 63 68 65 29 20 74 68 65 20 70 50 72 65   cache) the pPre
b2c0: 53 74 6d 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  Stmt */.){.  int
b2d0: 20 69 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20 74   i;..  /* Free t
b2e0: 68 65 20 62 6f 75 6e 64 20 73 74 72 69 6e 67 20  he bound string 
b2f0: 61 6e 64 20 62 6c 6f 62 20 70 61 72 61 6d 65 74  and blob paramet
b300: 65 72 73 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ers */.  for(i=0
b310: 3b 20 69 3c 70 50 72 65 53 74 6d 74 2d 3e 6e 50  ; i<pPreStmt->nP
b320: 61 72 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 54  arm; i++){.    T
b330: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
b340: 70 50 72 65 53 74 6d 74 2d 3e 61 70 50 61 72 6d  pPreStmt->apParm
b350: 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 70 50 72 65  [i]);.  }.  pPre
b360: 53 74 6d 74 2d 3e 6e 50 61 72 6d 20 3d 20 30 3b  Stmt->nParm = 0;
b370: 0a 0a 20 20 69 66 28 20 70 44 62 2d 3e 6d 61 78  ..  if( pDb->max
b380: 53 74 6d 74 3c 3d 30 20 7c 7c 20 64 69 73 63 61  Stmt<=0 || disca
b390: 72 64 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  rd ){.    /* If 
b3a0: 74 68 65 20 63 61 63 68 65 20 69 73 20 74 75 72  the cache is tur
b3b0: 6e 65 64 20 6f 66 66 2c 20 64 65 61 6c 6c 6f 63  ned off, dealloc
b3c0: 61 74 65 64 20 74 68 65 20 73 74 61 74 65 6d 65  ated the stateme
b3d0: 6e 74 20 2a 2f 0a 20 20 20 20 64 62 46 72 65 65  nt */.    dbFree
b3e0: 53 74 6d 74 28 70 50 72 65 53 74 6d 74 29 3b 0a  Stmt(pPreStmt);.
b3f0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
b400: 41 64 64 20 74 68 65 20 70 72 65 70 61 72 65 64  Add the prepared
b410: 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 74 68   statement to th
b420: 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
b430: 68 65 20 63 61 63 68 65 20 6c 69 73 74 2e 20 2a  he cache list. *
b440: 2f 0a 20 20 20 20 70 50 72 65 53 74 6d 74 2d 3e  /.    pPreStmt->
b450: 70 4e 65 78 74 20 3d 20 70 44 62 2d 3e 73 74 6d  pNext = pDb->stm
b460: 74 4c 69 73 74 3b 0a 20 20 20 20 70 50 72 65 53  tList;.    pPreS
b470: 74 6d 74 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a  tmt->pPrev = 0;.
b480: 20 20 20 20 69 66 28 20 70 44 62 2d 3e 73 74 6d      if( pDb->stm
b490: 74 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 70 44  tList ){.     pD
b4a0: 62 2d 3e 73 74 6d 74 4c 69 73 74 2d 3e 70 50 72  b->stmtList->pPr
b4b0: 65 76 20 3d 20 70 50 72 65 53 74 6d 74 3b 0a 20  ev = pPreStmt;. 
b4c0: 20 20 20 7d 0a 20 20 20 20 70 44 62 2d 3e 73 74     }.    pDb->st
b4d0: 6d 74 4c 69 73 74 20 3d 20 70 50 72 65 53 74 6d  mtList = pPreStm
b4e0: 74 3b 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e  t;.    if( pDb->
b4f0: 73 74 6d 74 4c 61 73 74 3d 3d 30 20 29 7b 0a 20  stmtLast==0 ){. 
b500: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 44 62       assert( pDb
b510: 2d 3e 6e 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20  ->nStmt==0 );.  
b520: 20 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c 61 73      pDb->stmtLas
b530: 74 20 3d 20 70 50 72 65 53 74 6d 74 3b 0a 20 20  t = pPreStmt;.  
b540: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
b550: 73 73 65 72 74 28 20 70 44 62 2d 3e 6e 53 74 6d  ssert( pDb->nStm
b560: 74 3e 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20  t>0 );.    }.   
b570: 20 70 44 62 2d 3e 6e 53 74 6d 74 2b 2b 3b 0a 0a   pDb->nStmt++;..
b580: 20 20 20 20 2f 2a 20 49 66 20 77 65 20 68 61 76      /* If we hav
b590: 65 20 74 6f 6f 20 6d 61 6e 79 20 73 74 61 74 65  e too many state
b5a0: 6d 65 6e 74 20 69 6e 20 63 61 63 68 65 2c 20 72  ment in cache, r
b5b0: 65 6d 6f 76 65 20 74 68 65 20 73 75 72 70 6c 75  emove the surplu
b5c0: 73 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68  s from.    ** th
b5d0: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 63 61 63  e end of the cac
b5e0: 68 65 20 6c 69 73 74 2e 20 20 2a 2f 0a 20 20 20  he list.  */.   
b5f0: 20 77 68 69 6c 65 28 20 70 44 62 2d 3e 6e 53 74   while( pDb->nSt
b600: 6d 74 3e 70 44 62 2d 3e 6d 61 78 53 74 6d 74 20  mt>pDb->maxStmt 
b610: 29 7b 0a 20 20 20 20 20 20 53 71 6c 50 72 65 70  ){.      SqlPrep
b620: 61 72 65 64 53 74 6d 74 20 2a 70 4c 61 73 74 20  aredStmt *pLast 
b630: 3d 20 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74 3b  = pDb->stmtLast;
b640: 0a 20 20 20 20 20 20 70 44 62 2d 3e 73 74 6d 74  .      pDb->stmt
b650: 4c 61 73 74 20 3d 20 70 4c 61 73 74 2d 3e 70 50  Last = pLast->pP
b660: 72 65 76 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e  rev;.      pDb->
b670: 73 74 6d 74 4c 61 73 74 2d 3e 70 4e 65 78 74 20  stmtLast->pNext 
b680: 3d 20 30 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e  = 0;.      pDb->
b690: 6e 53 74 6d 74 2d 2d 3b 0a 20 20 20 20 20 20 64  nStmt--;.      d
b6a0: 62 46 72 65 65 53 74 6d 74 28 70 4c 61 73 74 29  bFreeStmt(pLast)
b6b0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
b6c0: 2a 0a 2a 2a 20 53 74 72 75 63 74 75 72 65 20 75  *.** Structure u
b6d0: 73 65 64 20 77 69 74 68 20 64 62 45 76 61 6c 58  sed with dbEvalX
b6e0: 58 58 28 29 20 66 75 6e 63 74 69 6f 6e 73 3a 0a  XX() functions:.
b6f0: 2a 2a 0a 2a 2a 20 20 20 64 62 45 76 61 6c 49 6e  **.**   dbEvalIn
b700: 69 74 28 29 0a 2a 2a 20 20 20 64 62 45 76 61 6c  it().**   dbEval
b710: 53 74 65 70 28 29 0a 2a 2a 20 20 20 64 62 45 76  Step().**   dbEv
b720: 61 6c 46 69 6e 61 6c 69 7a 65 28 29 0a 2a 2a 20  alFinalize().** 
b730: 20 20 64 62 45 76 61 6c 52 6f 77 49 6e 66 6f 28    dbEvalRowInfo(
b740: 29 0a 2a 2a 20 20 20 64 62 45 76 61 6c 43 6f 6c  ).**   dbEvalCol
b750: 75 6d 6e 56 61 6c 75 65 28 29 0a 2a 2f 0a 74 79  umnValue().*/.ty
b760: 70 65 64 65 66 20 73 74 72 75 63 74 20 44 62 45  pedef struct DbE
b770: 76 61 6c 43 6f 6e 74 65 78 74 20 44 62 45 76 61  valContext DbEva
b780: 6c 43 6f 6e 74 65 78 74 3b 0a 73 74 72 75 63 74  lContext;.struct
b790: 20 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 20 7b   DbEvalContext {
b7a0: 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62  .  SqliteDb *pDb
b7b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
b7c0: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68     /* Database h
b7d0: 61 6e 64 6c 65 20 2a 2f 0a 20 20 54 63 6c 5f 4f  andle */.  Tcl_O
b7e0: 62 6a 20 2a 70 53 71 6c 3b 20 20 20 20 20 20 20  bj *pSql;       
b7f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 62             /* Ob
b800: 6a 65 63 74 20 68 6f 6c 64 69 6e 67 20 73 74 72  ject holding str
b810: 69 6e 67 20 7a 53 71 6c 20 2a 2f 0a 20 20 63 6f  ing zSql */.  co
b820: 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 3b 20  nst char *zSql; 
b830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b840: 20 52 65 6d 61 69 6e 69 6e 67 20 53 51 4c 20 74   Remaining SQL t
b850: 6f 20 65 78 65 63 75 74 65 20 2a 2f 0a 20 20 53  o execute */.  S
b860: 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74 20 2a  qlPreparedStmt *
b870: 70 50 72 65 53 74 6d 74 3b 20 20 20 20 20 20 2f  pPreStmt;      /
b880: 2a 20 43 75 72 72 65 6e 74 20 73 74 61 74 65 6d  * Current statem
b890: 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f  ent */.  int nCo
b8a0: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
b8b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
b8c0: 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 72 65  er of columns re
b8d0: 74 75 72 6e 65 64 20 62 79 20 70 53 74 6d 74 20  turned by pStmt 
b8e0: 2a 2f 0a 20 20 69 6e 74 20 65 76 61 6c 46 6c 61  */.  int evalFla
b8f0: 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  gs;             
b900: 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 75 73       /* Flags us
b910: 65 64 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  ed */.  Tcl_Obj 
b920: 2a 70 41 72 72 61 79 3b 20 20 20 20 20 20 20 20  *pArray;        
b930: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
b940: 6f 66 20 61 72 72 61 79 20 76 61 72 69 61 62 6c  of array variabl
b950: 65 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  e */.  Tcl_Obj *
b960: 2a 61 70 43 6f 6c 4e 61 6d 65 3b 20 20 20 20 20  *apColName;     
b970: 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20         /* Array 
b980: 6f 66 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  of column names 
b990: 2a 2f 0a 7d 3b 0a 0a 23 64 65 66 69 6e 65 20 53  */.};..#define S
b9a0: 51 4c 49 54 45 5f 45 56 41 4c 5f 57 49 54 48 4f  QLITE_EVAL_WITHO
b9b0: 55 54 4e 55 4c 4c 53 20 20 30 78 30 30 30 30 31  UTNULLS  0x00001
b9c0: 20 20 2f 2a 20 55 6e 73 65 74 20 61 72 72 61 79    /* Unset array
b9d0: 28 2a 29 20 66 6f 72 20 4e 55 4c 4c 20 2a 2f 0a  (*) for NULL */.
b9e0: 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61  ./*.** Release a
b9f0: 6e 79 20 63 61 63 68 65 20 6f 66 20 63 6f 6c 75  ny cache of colu
ba00: 6d 6e 20 6e 61 6d 65 73 20 63 75 72 72 65 6e 74  mn names current
ba10: 6c 79 20 68 65 6c 64 20 61 73 20 70 61 72 74 20  ly held as part 
ba20: 6f 66 0a 2a 2a 20 74 68 65 20 44 62 45 76 61 6c  of.** the DbEval
ba30: 43 6f 6e 74 65 78 74 20 73 74 72 75 63 74 75 72  Context structur
ba40: 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  e passed as the 
ba50: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a  first argument..
ba60: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64  */.static void d
ba70: 62 52 65 6c 65 61 73 65 43 6f 6c 75 6d 6e 4e 61  bReleaseColumnNa
ba80: 6d 65 73 28 44 62 45 76 61 6c 43 6f 6e 74 65 78  mes(DbEvalContex
ba90: 74 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e  t *p){.  if( p->
baa0: 61 70 43 6f 6c 4e 61 6d 65 20 29 7b 0a 20 20 20  apColName ){.   
bab0: 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
bac0: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20  i=0; i<p->nCol; 
bad0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  i++){.      Tcl_
bae0: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 2d 3e  DecrRefCount(p->
baf0: 61 70 43 6f 6c 4e 61 6d 65 5b 69 5d 29 3b 0a 20  apColName[i]);. 
bb00: 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 46 72 65     }.    Tcl_Fre
bb10: 65 28 28 63 68 61 72 20 2a 29 70 2d 3e 61 70 43  e((char *)p->apC
bb20: 6f 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 70 2d 3e  olName);.    p->
bb30: 61 70 43 6f 6c 4e 61 6d 65 20 3d 20 30 3b 0a 20  apColName = 0;. 
bb40: 20 7d 0a 20 20 70 2d 3e 6e 43 6f 6c 20 3d 20 30   }.  p->nCol = 0
bb50: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69  ;.}../*.** Initi
bb60: 61 6c 69 7a 65 20 61 20 44 62 45 76 61 6c 43 6f  alize a DbEvalCo
bb70: 6e 74 65 78 74 20 73 74 72 75 63 74 75 72 65 2e  ntext structure.
bb80: 0a 2a 2a 0a 2a 2a 20 49 66 20 70 41 72 72 61 79  .**.** If pArray
bb90: 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68   is not NULL, th
bba0: 65 6e 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 74  en it contains t
bbb0: 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 54 63 6c  he name of a Tcl
bbc0: 20 61 72 72 61 79 0a 2a 2a 20 76 61 72 69 61 62   array.** variab
bbd0: 6c 65 2e 20 54 68 65 20 22 2a 22 20 6d 65 6d 62  le. The "*" memb
bbe0: 65 72 20 6f 66 20 74 68 69 73 20 61 72 72 61 79  er of this array
bbf0: 20 69 73 20 73 65 74 20 74 6f 20 61 20 6c 69 73   is set to a lis
bc00: 74 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 2a 2a 20  t containing.** 
bc10: 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 74 68 65  the names of the
bc20: 20 63 6f 6c 75 6d 6e 73 20 72 65 74 75 72 6e 65   columns returne
bc30: 64 20 62 79 20 74 68 65 20 73 74 61 74 65 6d 65  d by the stateme
bc40: 6e 74 20 61 73 20 70 61 72 74 20 6f 66 20 65 61  nt as part of ea
bc50: 63 68 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 64 62  ch.** call to db
bc60: 45 76 61 6c 53 74 65 70 28 29 2c 20 69 6e 20 6f  EvalStep(), in o
bc70: 72 64 65 72 20 66 72 6f 6d 20 6c 65 66 74 20 74  rder from left t
bc80: 6f 20 72 69 67 68 74 2e 20 65 2e 67 2e 20 69 66  o right. e.g. if
bc90: 20 74 68 65 20 6e 61 6d 65 73 0a 2a 2a 20 6f 66   the names.** of
bca0: 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 63 6f   the returned co
bcb0: 6c 75 6d 6e 73 20 61 72 65 20 61 2c 20 62 20 61  lumns are a, b a
bcc0: 6e 64 20 63 2c 20 69 74 20 64 6f 65 73 20 74 68  nd c, it does th
bcd0: 65 20 65 71 75 69 76 61 6c 65 6e 74 20 6f 66 20  e equivalent of 
bce0: 74 68 65 0a 2a 2a 20 74 63 6c 20 63 6f 6d 6d 61  the.** tcl comma
bcf0: 6e 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 73 65  nd:.**.**     se
bd00: 74 20 24 7b 70 41 72 72 61 79 7d 28 2a 29 20 7b  t ${pArray}(*) {
bd10: 61 20 62 20 63 7d 0a 2a 2f 0a 73 74 61 74 69 63  a b c}.*/.static
bd20: 20 76 6f 69 64 20 64 62 45 76 61 6c 49 6e 69 74   void dbEvalInit
bd30: 28 0a 20 20 44 62 45 76 61 6c 43 6f 6e 74 65 78  (.  DbEvalContex
bd40: 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
bd50: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
bd60: 6f 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 69  o structure to i
bd70: 6e 69 74 69 61 6c 69 7a 65 20 2a 2f 0a 20 20 53  nitialize */.  S
bd80: 71 6c 69 74 65 44 62 20 2a 70 44 62 2c 20 20 20  qliteDb *pDb,   
bd90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
bda0: 2a 20 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c  * Database handl
bdb0: 65 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  e */.  Tcl_Obj *
bdc0: 70 53 71 6c 2c 20 20 20 20 20 20 20 20 20 20 20  pSql,           
bdd0: 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63 74         /* Object
bde0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 53 51 4c 20   containing SQL 
bdf0: 73 63 72 69 70 74 20 2a 2f 0a 20 20 54 63 6c 5f  script */.  Tcl_
be00: 4f 62 6a 20 2a 70 41 72 72 61 79 2c 20 20 20 20  Obj *pArray,    
be10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
be20: 61 6d 65 20 6f 66 20 54 63 6c 20 61 72 72 61 79  ame of Tcl array
be30: 20 74 6f 20 73 65 74 20 28 2a 29 20 65 6c 65 6d   to set (*) elem
be40: 65 6e 74 20 6f 66 20 2a 2f 0a 20 20 69 6e 74 20  ent of */.  int 
be50: 65 76 61 6c 46 6c 61 67 73 20 20 20 20 20 20 20  evalFlags       
be60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
be70: 6c 61 67 73 20 63 6f 6e 74 72 6f 6c 6c 69 6e 67  lags controlling
be80: 20 65 76 61 6c 75 61 74 69 6f 6e 20 2a 2f 0a 29   evaluation */.)
be90: 7b 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c  {.  memset(p, 0,
bea0: 20 73 69 7a 65 6f 66 28 44 62 45 76 61 6c 43 6f   sizeof(DbEvalCo
beb0: 6e 74 65 78 74 29 29 3b 0a 20 20 70 2d 3e 70 44  ntext));.  p->pD
bec0: 62 20 3d 20 70 44 62 3b 0a 20 20 70 2d 3e 7a 53  b = pDb;.  p->zS
bed0: 71 6c 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  ql = Tcl_GetStri
bee0: 6e 67 28 70 53 71 6c 29 3b 0a 20 20 70 2d 3e 70  ng(pSql);.  p->p
bef0: 53 71 6c 20 3d 20 70 53 71 6c 3b 0a 20 20 54 63  Sql = pSql;.  Tc
bf00: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70  l_IncrRefCount(p
bf10: 53 71 6c 29 3b 0a 20 20 69 66 28 20 70 41 72 72  Sql);.  if( pArr
bf20: 61 79 20 29 7b 0a 20 20 20 20 70 2d 3e 70 41 72  ay ){.    p->pAr
bf30: 72 61 79 20 3d 20 70 41 72 72 61 79 3b 0a 20 20  ray = pArray;.  
bf40: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
bf50: 6e 74 28 70 41 72 72 61 79 29 3b 0a 20 20 7d 0a  nt(pArray);.  }.
bf60: 20 20 70 2d 3e 65 76 61 6c 46 6c 61 67 73 20 3d    p->evalFlags =
bf70: 20 65 76 61 6c 46 6c 61 67 73 3b 0a 7d 0a 0a 2f   evalFlags;.}../
bf80: 2a 0a 2a 2a 20 4f 62 74 61 69 6e 20 69 6e 66 6f  *.** Obtain info
bf90: 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68  rmation about th
bfa0: 65 20 72 6f 77 20 74 68 61 74 20 74 68 65 20 44  e row that the D
bfb0: 62 45 76 61 6c 43 6f 6e 74 65 78 74 20 70 61 73  bEvalContext pas
bfc0: 73 65 64 20 61 73 20 74 68 65 0a 2a 2a 20 66 69  sed as the.** fi
bfd0: 72 73 74 20 61 72 67 75 6d 65 6e 74 20 63 75 72  rst argument cur
bfe0: 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f  rently points to
bff0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
c000: 20 64 62 45 76 61 6c 52 6f 77 49 6e 66 6f 28 0a   dbEvalRowInfo(.
c010: 20 20 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 20    DbEvalContext 
c020: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
c030: 20 20 2f 2a 20 45 76 61 6c 75 61 74 69 6f 6e 20    /* Evaluation 
c040: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74  context */.  int
c050: 20 2a 70 6e 43 6f 6c 2c 20 20 20 20 20 20 20 20   *pnCol,        
c060: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c070: 4f 55 54 3a 20 4e 75 6d 62 65 72 20 6f 66 20 63  OUT: Number of c
c080: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20  olumn names */. 
c090: 20 54 63 6c 5f 4f 62 6a 20 2a 2a 2a 70 61 70 43   Tcl_Obj ***papC
c0a0: 6f 6c 4e 61 6d 65 20 20 20 20 20 20 20 20 20 20  olName          
c0b0: 20 2f 2a 20 4f 55 54 3a 20 41 72 72 61 79 20 6f   /* OUT: Array o
c0c0: 66 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a  f column names *
c0d0: 2f 0a 29 7b 0a 20 20 2f 2a 20 43 6f 6d 70 75 74  /.){.  /* Comput
c0e0: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a  e column names *
c0f0: 2f 0a 20 20 69 66 28 20 30 3d 3d 70 2d 3e 61 70  /.  if( 0==p->ap
c100: 43 6f 6c 4e 61 6d 65 20 29 7b 0a 20 20 20 20 73  ColName ){.    s
c110: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
c120: 6d 74 20 3d 20 70 2d 3e 70 50 72 65 53 74 6d 74  mt = p->pPreStmt
c130: 2d 3e 70 53 74 6d 74 3b 0a 20 20 20 20 69 6e 74  ->pStmt;.    int
c140: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
c150: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74             /* It
c160: 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c 65 20  erator variable 
c170: 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b  */.    int nCol;
c180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c190: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
c1a0: 66 20 63 6f 6c 75 6d 6e 73 20 72 65 74 75 72 6e  f columns return
c1b0: 65 64 20 62 79 20 70 53 74 6d 74 20 2a 2f 0a 20  ed by pStmt */. 
c1c0: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 61 70 43     Tcl_Obj **apC
c1d0: 6f 6c 4e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20  olName = 0;     
c1e0: 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 63 6f 6c   /* Array of col
c1f0: 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 0a 20 20  umn names */..  
c200: 20 20 70 2d 3e 6e 43 6f 6c 20 3d 20 6e 43 6f 6c    p->nCol = nCol
c210: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
c220: 6e 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29 3b 0a  n_count(pStmt);.
c230: 20 20 20 20 69 66 28 20 6e 43 6f 6c 3e 30 20 26      if( nCol>0 &
c240: 26 20 28 70 61 70 43 6f 6c 4e 61 6d 65 20 7c 7c  & (papColName ||
c250: 20 70 2d 3e 70 41 72 72 61 79 29 20 29 7b 0a 20   p->pArray) ){. 
c260: 20 20 20 20 20 61 70 43 6f 6c 4e 61 6d 65 20 3d       apColName =
c270: 20 28 54 63 6c 5f 4f 62 6a 2a 2a 29 54 63 6c 5f   (Tcl_Obj**)Tcl_
c280: 41 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 54 63  Alloc( sizeof(Tc
c290: 6c 5f 4f 62 6a 2a 29 2a 6e 43 6f 6c 20 29 3b 0a  l_Obj*)*nCol );.
c2a0: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
c2b0: 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nCol; i++){.   
c2c0: 20 20 20 20 20 61 70 43 6f 6c 4e 61 6d 65 5b 69       apColName[i
c2d0: 5d 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  ] = Tcl_NewStrin
c2e0: 67 4f 62 6a 28 73 71 6c 69 74 65 33 5f 63 6f 6c  gObj(sqlite3_col
c2f0: 75 6d 6e 5f 6e 61 6d 65 28 70 53 74 6d 74 2c 69  umn_name(pStmt,i
c300: 29 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 20 20  ), -1);.        
c310: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
c320: 28 61 70 43 6f 6c 4e 61 6d 65 5b 69 5d 29 3b 0a  (apColName[i]);.
c330: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d        }.      p-
c340: 3e 61 70 43 6f 6c 4e 61 6d 65 20 3d 20 61 70 43  >apColName = apC
c350: 6f 6c 4e 61 6d 65 3b 0a 20 20 20 20 7d 0a 0a 20  olName;.    }.. 
c360: 20 20 20 2f 2a 20 49 66 20 72 65 73 75 6c 74 73     /* If results
c370: 20 61 72 65 20 62 65 69 6e 67 20 73 74 6f 72 65   are being store
c380: 64 20 69 6e 20 61 6e 20 61 72 72 61 79 20 76 61  d in an array va
c390: 72 69 61 62 6c 65 2c 20 74 68 65 6e 20 63 72 65  riable, then cre
c3a0: 61 74 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 61  ate.    ** the a
c3b0: 72 72 61 79 28 2a 29 20 65 6e 74 72 79 20 66 6f  rray(*) entry fo
c3c0: 72 20 74 68 61 74 20 61 72 72 61 79 0a 20 20 20  r that array.   
c3d0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 70   */.    if( p->p
c3e0: 41 72 72 61 79 20 29 7b 0a 20 20 20 20 20 20 54  Array ){.      T
c3f0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
c400: 70 20 3d 20 70 2d 3e 70 44 62 2d 3e 69 6e 74 65  p = p->pDb->inte
c410: 72 70 3b 0a 20 20 20 20 20 20 54 63 6c 5f 4f 62  rp;.      Tcl_Ob
c420: 6a 20 2a 70 43 6f 6c 4c 69 73 74 20 3d 20 54 63  j *pColList = Tc
c430: 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20 20 20 20  l_NewObj();.    
c440: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 53 74 61 72    Tcl_Obj *pStar
c450: 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67   = Tcl_NewString
c460: 4f 62 6a 28 22 2a 22 2c 20 2d 31 29 3b 0a 0a 20  Obj("*", -1);.. 
c470: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
c480: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
c490: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
c4a0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
c4b0: 65 72 70 2c 20 70 43 6f 6c 4c 69 73 74 2c 20 61  erp, pColList, a
c4c0: 70 43 6f 6c 4e 61 6d 65 5b 69 5d 29 3b 0a 20 20  pColName[i]);.  
c4d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 54 63 6c 5f      }.      Tcl_
c4e0: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 53 74  IncrRefCount(pSt
c4f0: 61 72 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 4f  ar);.      Tcl_O
c500: 62 6a 53 65 74 56 61 72 32 28 69 6e 74 65 72 70  bjSetVar2(interp
c510: 2c 20 70 2d 3e 70 41 72 72 61 79 2c 20 70 53 74  , p->pArray, pSt
c520: 61 72 2c 20 70 43 6f 6c 4c 69 73 74 2c 20 30 29  ar, pColList, 0)
c530: 3b 0a 20 20 20 20 20 20 54 63 6c 5f 44 65 63 72  ;.      Tcl_Decr
c540: 52 65 66 43 6f 75 6e 74 28 70 53 74 61 72 29 3b  RefCount(pStar);
c550: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
c560: 28 20 70 61 70 43 6f 6c 4e 61 6d 65 20 29 7b 0a  ( papColName ){.
c570: 20 20 20 20 2a 70 61 70 43 6f 6c 4e 61 6d 65 20      *papColName 
c580: 3d 20 70 2d 3e 61 70 43 6f 6c 4e 61 6d 65 3b 0a  = p->apColName;.
c590: 20 20 7d 0a 20 20 69 66 28 20 70 6e 43 6f 6c 20    }.  if( pnCol 
c5a0: 29 7b 0a 20 20 20 20 2a 70 6e 43 6f 6c 20 3d 20  ){.    *pnCol = 
c5b0: 70 2d 3e 6e 43 6f 6c 3b 0a 20 20 7d 0a 7d 0a 0a  p->nCol;.  }.}..
c5c0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 6f 6e 65  /*.** Return one
c5d0: 20 6f 66 20 54 43 4c 5f 4f 4b 2c 20 54 43 4c 5f   of TCL_OK, TCL_
c5e0: 42 52 45 41 4b 20 6f 72 20 54 43 4c 5f 45 52 52  BREAK or TCL_ERR
c5f0: 4f 52 2e 20 49 66 20 54 43 4c 5f 45 52 52 4f 52  OR. If TCL_ERROR
c600: 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2c   is.** returned,
c610: 20 74 68 65 6e 20 61 6e 20 65 72 72 6f 72 20 6d   then an error m
c620: 65 73 73 61 67 65 20 69 73 20 73 74 6f 72 65 64  essage is stored
c630: 20 69 6e 20 74 68 65 20 69 6e 74 65 72 70 72 65   in the interpre
c640: 74 65 72 20 62 65 66 6f 72 65 0a 2a 2a 20 72 65  ter before.** re
c650: 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41  turning..**.** A
c660: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66   return value of
c670: 20 54 43 4c 5f 4f 4b 20 6d 65 61 6e 73 20 74 68   TCL_OK means th
c680: 65 72 65 20 69 73 20 61 20 72 6f 77 20 6f 66 20  ere is a row of 
c690: 64 61 74 61 20 61 76 61 69 6c 61 62 6c 65 2e 20  data available. 
c6a0: 54 68 65 0a 2a 2a 20 64 61 74 61 20 6d 61 79 20  The.** data may 
c6b0: 62 65 20 61 63 63 65 73 73 65 64 20 75 73 69 6e  be accessed usin
c6c0: 67 20 64 62 45 76 61 6c 52 6f 77 49 6e 66 6f 28  g dbEvalRowInfo(
c6d0: 29 20 61 6e 64 20 64 62 45 76 61 6c 43 6f 6c 75  ) and dbEvalColu
c6e0: 6d 6e 56 61 6c 75 65 28 29 2e 20 54 68 69 73 0a  mnValue(). This.
c6f0: 2a 2a 20 69 73 20 61 6e 61 6c 6f 67 6f 75 73 20  ** is analogous 
c700: 74 6f 20 61 20 72 65 74 75 72 6e 20 6f 66 20 53  to a return of S
c710: 51 4c 49 54 45 5f 52 4f 57 20 66 72 6f 6d 20 73  QLITE_ROW from s
c720: 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2e 20 49  qlite3_step(). I
c730: 66 20 54 43 4c 5f 42 52 45 41 4b 0a 2a 2a 20 69  f TCL_BREAK.** i
c740: 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65 6e  s returned, then
c750: 20 74 68 65 20 53 51 4c 20 73 63 72 69 70 74 20   the SQL script 
c760: 68 61 73 20 66 69 6e 69 73 68 65 64 20 65 78 65  has finished exe
c770: 63 75 74 69 6e 67 20 61 6e 64 20 74 68 65 72 65  cuting and there
c780: 20 61 72 65 0a 2a 2a 20 6e 6f 20 66 75 72 74 68   are.** no furth
c790: 65 72 20 72 6f 77 73 20 61 76 61 69 6c 61 62 6c  er rows availabl
c7a0: 65 2e 20 54 68 69 73 20 69 73 20 73 69 6d 69 6c  e. This is simil
c7b0: 61 72 20 74 6f 20 53 51 4c 49 54 45 5f 44 4f 4e  ar to SQLITE_DON
c7c0: 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  E..*/.static int
c7d0: 20 64 62 45 76 61 6c 53 74 65 70 28 44 62 45 76   dbEvalStep(DbEv
c7e0: 61 6c 43 6f 6e 74 65 78 74 20 2a 70 29 7b 0a 20  alContext *p){. 
c7f0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 72   const char *zPr
c800: 65 76 53 71 6c 20 3d 20 30 3b 20 20 20 20 20 20  evSql = 0;      
c810: 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 76 61 6c   /* Previous val
c820: 75 65 20 6f 66 20 70 2d 3e 7a 53 71 6c 20 2a 2f  ue of p->zSql */
c830: 0a 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 7a 53  ..  while( p->zS
c840: 71 6c 5b 30 5d 20 7c 7c 20 70 2d 3e 70 50 72 65  ql[0] || p->pPre
c850: 53 74 6d 74 20 29 7b 0a 20 20 20 20 69 6e 74 20  Stmt ){.    int 
c860: 72 63 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70  rc;.    if( p->p
c870: 50 72 65 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20  PreStmt==0 ){.  
c880: 20 20 20 20 7a 50 72 65 76 53 71 6c 20 3d 20 28      zPrevSql = (
c890: 70 2d 3e 7a 53 71 6c 3d 3d 7a 50 72 65 76 53 71  p->zSql==zPrevSq
c8a0: 6c 20 3f 20 30 20 3a 20 70 2d 3e 7a 53 71 6c 29  l ? 0 : p->zSql)
c8b0: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 64 62 50  ;.      rc = dbP
c8c0: 72 65 70 61 72 65 41 6e 64 42 69 6e 64 28 70 2d  repareAndBind(p-
c8d0: 3e 70 44 62 2c 20 70 2d 3e 7a 53 71 6c 2c 20 26  >pDb, p->zSql, &
c8e0: 70 2d 3e 7a 53 71 6c 2c 20 26 70 2d 3e 70 50 72  p->zSql, &p->pPr
c8f0: 65 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 69 66  eStmt);.      if
c900: 28 20 72 63 21 3d 54 43 4c 5f 4f 4b 20 29 20 72  ( rc!=TCL_OK ) r
c910: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 65  eturn rc;.    }e
c920: 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 72  lse{.      int r
c930: 63 73 3b 0a 20 20 20 20 20 20 53 71 6c 69 74 65  cs;.      Sqlite
c940: 44 62 20 2a 70 44 62 20 3d 20 70 2d 3e 70 44 62  Db *pDb = p->pDb
c950: 3b 0a 20 20 20 20 20 20 53 71 6c 50 72 65 70 61  ;.      SqlPrepa
c960: 72 65 64 53 74 6d 74 20 2a 70 50 72 65 53 74 6d  redStmt *pPreStm
c970: 74 20 3d 20 70 2d 3e 70 50 72 65 53 74 6d 74 3b  t = p->pPreStmt;
c980: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
c990: 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 70 50 72  tmt *pStmt = pPr
c9a0: 65 53 74 6d 74 2d 3e 70 53 74 6d 74 3b 0a 0a 20  eStmt->pStmt;.. 
c9b0: 20 20 20 20 20 72 63 73 20 3d 20 73 71 6c 69 74       rcs = sqlit
c9c0: 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3b 0a  e3_step(pStmt);.
c9d0: 20 20 20 20 20 20 69 66 28 20 72 63 73 3d 3d 53        if( rcs==S
c9e0: 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20  QLITE_ROW ){.   
c9f0: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
ca00: 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OK;.      }.    
ca10: 20 20 69 66 28 20 70 2d 3e 70 41 72 72 61 79 20    if( p->pArray 
ca20: 29 7b 0a 20 20 20 20 20 20 20 20 64 62 45 76 61  ){.        dbEva
ca30: 6c 52 6f 77 49 6e 66 6f 28 70 2c 20 30 2c 20 30  lRowInfo(p, 0, 0
ca40: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
ca50: 20 72 63 73 20 3d 20 73 71 6c 69 74 65 33 5f 72   rcs = sqlite3_r
ca60: 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 0a 20 20  eset(pStmt);..  
ca70: 20 20 20 20 70 44 62 2d 3e 6e 53 74 65 70 20 3d      pDb->nStep =
ca80: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74   sqlite3_stmt_st
ca90: 61 74 75 73 28 70 53 74 6d 74 2c 53 51 4c 49 54  atus(pStmt,SQLIT
caa0: 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 46 55 4c  E_STMTSTATUS_FUL
cab0: 4c 53 43 41 4e 5f 53 54 45 50 2c 31 29 3b 0a 20  LSCAN_STEP,1);. 
cac0: 20 20 20 20 20 70 44 62 2d 3e 6e 53 6f 72 74 20       pDb->nSort 
cad0: 3d 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73  = sqlite3_stmt_s
cae0: 74 61 74 75 73 28 70 53 74 6d 74 2c 53 51 4c 49  tatus(pStmt,SQLI
caf0: 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 53 4f  TE_STMTSTATUS_SO
cb00: 52 54 2c 31 29 3b 0a 20 20 20 20 20 20 70 44 62  RT,1);.      pDb
cb10: 2d 3e 6e 49 6e 64 65 78 20 3d 20 73 71 6c 69 74  ->nIndex = sqlit
cb20: 65 33 5f 73 74 6d 74 5f 73 74 61 74 75 73 28 70  e3_stmt_status(p
cb30: 53 74 6d 74 2c 53 51 4c 49 54 45 5f 53 54 4d 54  Stmt,SQLITE_STMT
cb40: 53 54 41 54 55 53 5f 41 55 54 4f 49 4e 44 45 58  STATUS_AUTOINDEX
cb50: 2c 31 29 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e  ,1);.      pDb->
cb60: 6e 56 4d 53 74 65 70 20 3d 20 73 71 6c 69 74 65  nVMStep = sqlite
cb70: 33 5f 73 74 6d 74 5f 73 74 61 74 75 73 28 70 53  3_stmt_status(pS
cb80: 74 6d 74 2c 53 51 4c 49 54 45 5f 53 54 4d 54 53  tmt,SQLITE_STMTS
cb90: 54 41 54 55 53 5f 56 4d 5f 53 54 45 50 2c 31 29  TATUS_VM_STEP,1)
cba0: 3b 0a 20 20 20 20 20 20 64 62 52 65 6c 65 61 73  ;.      dbReleas
cbb0: 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 29 3b  eColumnNames(p);
cbc0: 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 65 53 74  .      p->pPreSt
cbd0: 6d 74 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 69  mt = 0;..      i
cbe0: 66 28 20 72 63 73 21 3d 53 51 4c 49 54 45 5f 4f  f( rcs!=SQLITE_O
cbf0: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  K ){.        /* 
cc00: 49 66 20 61 20 72 75 6e 2d 74 69 6d 65 20 65 72  If a run-time er
cc10: 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 70 6f  ror occurs, repo
cc20: 72 74 20 74 68 65 20 65 72 72 6f 72 20 61 6e 64  rt the error and
cc30: 20 73 74 6f 70 20 72 65 61 64 69 6e 67 0a 20 20   stop reading.  
cc40: 20 20 20 20 20 20 2a 2a 20 74 68 65 20 53 51 4c        ** the SQL
cc50: 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 64 62  .  */.        db
cc60: 52 65 6c 65 61 73 65 53 74 6d 74 28 70 44 62 2c  ReleaseStmt(pDb,
cc70: 20 70 50 72 65 53 74 6d 74 2c 20 31 29 3b 0a 23   pPreStmt, 1);.#
cc80: 69 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  if SQLITE_TEST. 
cc90: 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 44         if( p->pD
cca0: 62 2d 3e 62 4c 65 67 61 63 79 50 72 65 70 61 72  b->bLegacyPrepar
ccb0: 65 20 26 26 20 72 63 73 3d 3d 53 51 4c 49 54 45  e && rcs==SQLITE
ccc0: 5f 53 43 48 45 4d 41 20 26 26 20 7a 50 72 65 76  _SCHEMA && zPrev
ccd0: 53 71 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Sql ){.         
cce0: 20 2f 2a 20 49 66 20 74 68 65 20 72 75 6e 74 69   /* If the runti
ccf0: 6d 65 20 65 72 72 6f 72 20 77 61 73 20 61 6e 20  me error was an 
cd00: 53 51 4c 49 54 45 5f 53 43 48 45 4d 41 2c 20 61  SQLITE_SCHEMA, a
cd10: 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  nd the database.
cd20: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 68 61 6e            ** han
cd30: 64 6c 65 20 69 73 20 63 6f 6e 66 69 67 75 72 65  dle is configure
cd40: 64 20 74 6f 20 75 73 65 20 74 68 65 20 6c 65 67  d to use the leg
cd50: 61 63 79 20 73 71 6c 69 74 65 33 5f 70 72 65 70  acy sqlite3_prep
cd60: 61 72 65 28 29 0a 20 20 20 20 20 20 20 20 20 20  are().          
cd70: 2a 2a 20 69 6e 74 65 72 66 61 63 65 2c 20 72 65  ** interface, re
cd80: 74 72 79 20 70 72 65 70 61 72 65 28 29 2f 73 74  try prepare()/st
cd90: 65 70 28 29 20 6f 6e 20 74 68 65 20 73 61 6d 65  ep() on the same
cda0: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a   SQL statement..
cdb0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69            ** Thi
cdc0: 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 6f  s only happens o
cdd0: 6e 63 65 2e 20 49 66 20 74 68 65 72 65 20 69 73  nce. If there is
cde0: 20 61 20 73 65 63 6f 6e 64 20 53 51 4c 49 54 45   a second SQLITE
cdf0: 5f 53 43 48 45 4d 41 0a 20 20 20 20 20 20 20 20  _SCHEMA.        
ce00: 20 20 2a 2a 20 65 72 72 6f 72 2c 20 74 68 65 20    ** error, the 
ce10: 65 72 72 6f 72 20 77 69 6c 6c 20 62 65 20 72 65  error will be re
ce20: 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61  turned to the ca
ce30: 6c 6c 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20  ller. */.       
ce40: 20 20 20 70 2d 3e 7a 53 71 6c 20 3d 20 7a 50 72     p->zSql = zPr
ce50: 65 76 53 71 6c 3b 0a 20 20 20 20 20 20 20 20 20  evSql;.         
ce60: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
ce70: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
ce80: 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65      Tcl_SetObjRe
ce90: 73 75 6c 74 28 70 44 62 2d 3e 69 6e 74 65 72 70  sult(pDb->interp
cea0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
ceb0: 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 4e             Tcl_N
cec0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 73 71 6c 69  ewStringObj(sqli
ced0: 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e  te3_errmsg(pDb->
cee0: 64 62 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 20  db), -1));.     
cef0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
cf00: 52 4f 52 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ROR;.      }else
cf10: 7b 0a 20 20 20 20 20 20 20 20 64 62 52 65 6c 65  {.        dbRele
cf20: 61 73 65 53 74 6d 74 28 70 44 62 2c 20 70 50 72  aseStmt(pDb, pPr
cf30: 65 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 20  eStmt, 0);.     
cf40: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
cf50: 2f 2a 20 46 69 6e 69 73 68 65 64 20 2a 2f 0a 20  /* Finished */. 
cf60: 20 72 65 74 75 72 6e 20 54 43 4c 5f 42 52 45 41   return TCL_BREA
cf70: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65  K;.}../*.** Free
cf80: 20 61 6c 6c 20 72 65 73 6f 75 72 63 65 73 20 63   all resources c
cf90: 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 20 62 79  urrently held by
cfa0: 20 74 68 65 20 44 62 45 76 61 6c 43 6f 6e 74 65   the DbEvalConte
cfb0: 78 74 20 73 74 72 75 63 74 75 72 65 20 70 61 73  xt structure pas
cfc0: 73 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 66 69  sed.** as the fi
cfd0: 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 54 68  rst argument. Th
cfe0: 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20 65 78  ere should be ex
cff0: 61 63 74 6c 79 20 6f 6e 65 20 63 61 6c 6c 20 74  actly one call t
d000: 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  o this function.
d010: 2a 2a 20 66 6f 72 20 65 61 63 68 20 63 61 6c 6c  ** for each call
d020: 20 74 6f 20 64 62 45 76 61 6c 49 6e 69 74 28 29   to dbEvalInit()
d030: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
d040: 20 64 62 45 76 61 6c 46 69 6e 61 6c 69 7a 65 28   dbEvalFinalize(
d050: 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 20 2a 70  DbEvalContext *p
d060: 29 7b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 65  ){.  if( p->pPre
d070: 53 74 6d 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  Stmt ){.    sqli
d080: 74 65 33 5f 72 65 73 65 74 28 70 2d 3e 70 50 72  te3_reset(p->pPr
d090: 65 53 74 6d 74 2d 3e 70 53 74 6d 74 29 3b 0a 20  eStmt->pStmt);. 
d0a0: 20 20 20 64 62 52 65 6c 65 61 73 65 53 74 6d 74     dbReleaseStmt
d0b0: 28 70 2d 3e 70 44 62 2c 20 70 2d 3e 70 50 72 65  (p->pDb, p->pPre
d0c0: 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 70 2d  Stmt, 0);.    p-
d0d0: 3e 70 50 72 65 53 74 6d 74 20 3d 20 30 3b 0a 20  >pPreStmt = 0;. 
d0e0: 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 41 72 72   }.  if( p->pArr
d0f0: 61 79 20 29 7b 0a 20 20 20 20 54 63 6c 5f 44 65  ay ){.    Tcl_De
d100: 63 72 52 65 66 43 6f 75 6e 74 28 70 2d 3e 70 41  crRefCount(p->pA
d110: 72 72 61 79 29 3b 0a 20 20 20 20 70 2d 3e 70 41  rray);.    p->pA
d120: 72 72 61 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  rray = 0;.  }.  
d130: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
d140: 28 70 2d 3e 70 53 71 6c 29 3b 0a 20 20 64 62 52  (p->pSql);.  dbR
d150: 65 6c 65 61 73 65 43 6f 6c 75 6d 6e 4e 61 6d 65  eleaseColumnName
d160: 73 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  s(p);.}../*.** R
d170: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
d180: 74 6f 20 61 20 54 63 6c 5f 4f 62 6a 20 73 74 72  to a Tcl_Obj str
d190: 75 63 74 75 72 65 20 77 69 74 68 20 72 65 66 2d  ucture with ref-
d1a0: 63 6f 75 6e 74 20 30 20 74 68 61 74 20 63 6f 6e  count 0 that con
d1b0: 74 61 69 6e 73 0a 2a 2a 20 74 68 65 20 76 61 6c  tains.** the val
d1c0: 75 65 20 66 6f 72 20 74 68 65 20 69 43 6f 6c 27  ue for the iCol'
d1d0: 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65  th column of the
d1e0: 20 72 6f 77 20 63 75 72 72 65 6e 74 6c 79 20 70   row currently p
d1f0: 6f 69 6e 74 65 64 20 74 6f 20 62 79 0a 2a 2a 20  ointed to by.** 
d200: 74 68 65 20 44 62 45 76 61 6c 43 6f 6e 74 65 78  the DbEvalContex
d210: 74 20 73 74 72 75 63 74 75 72 65 20 70 61 73 73  t structure pass
d220: 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ed as the first 
d230: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61  argument..*/.sta
d240: 74 69 63 20 54 63 6c 5f 4f 62 6a 20 2a 64 62 45  tic Tcl_Obj *dbE
d250: 76 61 6c 43 6f 6c 75 6d 6e 56 61 6c 75 65 28 44  valColumnValue(D
d260: 62 45 76 61 6c 43 6f 6e 74 65 78 74 20 2a 70 2c  bEvalContext *p,
d270: 20 69 6e 74 20 69 43 6f 6c 29 7b 0a 20 20 73 71   int iCol){.  sq
d280: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
d290: 74 20 3d 20 70 2d 3e 70 50 72 65 53 74 6d 74 2d  t = p->pPreStmt-
d2a0: 3e 70 53 74 6d 74 3b 0a 20 20 73 77 69 74 63 68  >pStmt;.  switch
d2b0: 28 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  ( sqlite3_column
d2c0: 5f 74 79 70 65 28 70 53 74 6d 74 2c 20 69 43 6f  _type(pStmt, iCo
d2d0: 6c 29 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53  l) ){.    case S
d2e0: 51 4c 49 54 45 5f 42 4c 4f 42 3a 20 7b 0a 20 20  QLITE_BLOB: {.  
d2f0: 20 20 20 20 69 6e 74 20 62 79 74 65 73 20 3d 20      int bytes = 
d300: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62  sqlite3_column_b
d310: 79 74 65 73 28 70 53 74 6d 74 2c 20 69 43 6f 6c  ytes(pStmt, iCol
d320: 29 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  );.      const c
d330: 68 61 72 20 2a 7a 42 6c 6f 62 20 3d 20 73 71 6c  har *zBlob = sql
d340: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62  ite3_column_blob
d350: 28 70 53 74 6d 74 2c 20 69 43 6f 6c 29 3b 0a 20  (pStmt, iCol);. 
d360: 20 20 20 20 20 69 66 28 20 21 7a 42 6c 6f 62 20       if( !zBlob 
d370: 29 20 62 79 74 65 73 20 3d 20 30 3b 0a 20 20 20  ) bytes = 0;.   
d380: 20 20 20 72 65 74 75 72 6e 20 54 63 6c 5f 4e 65     return Tcl_Ne
d390: 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 28 75  wByteArrayObj((u
d3a0: 38 2a 29 7a 42 6c 6f 62 2c 20 62 79 74 65 73 29  8*)zBlob, bytes)
d3b0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
d3c0: 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3a   SQLITE_INTEGER:
d3d0: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 5f   {.      sqlite_
d3e0: 69 6e 74 36 34 20 76 20 3d 20 73 71 6c 69 74 65  int64 v = sqlite
d3f0: 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70  3_column_int64(p
d400: 53 74 6d 74 2c 20 69 43 6f 6c 29 3b 0a 20 20 20  Stmt, iCol);.   
d410: 20 20 20 69 66 28 20 76 3e 3d 2d 32 31 34 37 34     if( v>=-21474
d420: 38 33 36 34 37 20 26 26 20 76 3c 3d 32 31 34 37  83647 && v<=2147
d430: 34 38 33 36 34 37 20 29 7b 0a 20 20 20 20 20 20  483647 ){.      
d440: 20 20 72 65 74 75 72 6e 20 54 63 6c 5f 4e 65 77    return Tcl_New
d450: 49 6e 74 4f 62 6a 28 28 69 6e 74 29 76 29 3b 0a  IntObj((int)v);.
d460: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
d470: 20 20 20 20 20 72 65 74 75 72 6e 20 54 63 6c 5f       return Tcl_
d480: 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 76 29  NewWideIntObj(v)
d490: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
d4a0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
d4b0: 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20 72  FLOAT: {.      r
d4c0: 65 74 75 72 6e 20 54 63 6c 5f 4e 65 77 44 6f 75  eturn Tcl_NewDou
d4d0: 62 6c 65 4f 62 6a 28 73 71 6c 69 74 65 33 5f 63  bleObj(sqlite3_c
d4e0: 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 28 70 53 74  olumn_double(pSt
d4f0: 6d 74 2c 20 69 43 6f 6c 29 29 3b 0a 20 20 20 20  mt, iCol));.    
d500: 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
d510: 45 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20  E_NULL: {.      
d520: 72 65 74 75 72 6e 20 54 63 6c 5f 4e 65 77 53 74  return Tcl_NewSt
d530: 72 69 6e 67 4f 62 6a 28 70 2d 3e 70 44 62 2d 3e  ringObj(p->pDb->
d540: 7a 4e 75 6c 6c 2c 20 2d 31 29 3b 0a 20 20 20 20  zNull, -1);.    
d550: 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
d560: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
d570: 28 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  ((char*)sqlite3_
d580: 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d  column_text(pStm
d590: 74 2c 20 69 43 6f 6c 29 2c 20 2d 31 29 3b 0a 7d  t, iCol), -1);.}
d5a0: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 75 73 69 6e 67  ../*.** If using
d5b0: 20 54 63 6c 20 76 65 72 73 69 6f 6e 20 38 2e 36   Tcl version 8.6
d5c0: 20 6f 72 20 67 72 65 61 74 65 72 2c 20 75 73 65   or greater, use
d5d0: 20 74 68 65 20 4e 52 20 66 75 6e 63 74 69 6f 6e   the NR function
d5e0: 73 20 74 6f 20 61 76 6f 69 64 0a 2a 2a 20 72 65  s to avoid.** re
d5f0: 63 75 72 73 69 76 65 20 65 76 61 6c 75 74 69 6f  cursive evalutio
d600: 6e 20 6f 66 20 73 63 72 69 70 74 73 20 62 79 20  n of scripts by 
d610: 74 68 65 20 5b 64 62 20 65 76 61 6c 5d 20 61 6e  the [db eval] an
d620: 64 20 5b 64 62 20 74 72 61 6e 73 5d 0a 2a 2a 20  d [db trans].** 
d630: 63 6f 6d 6d 61 6e 64 73 2e 20 45 76 65 6e 20 69  commands. Even i
d640: 66 20 74 68 65 20 68 65 61 64 65 72 73 20 75 73  f the headers us
d650: 65 64 20 77 68 69 6c 65 20 63 6f 6d 70 69 6c 69  ed while compili
d660: 6e 67 20 74 68 65 20 65 78 74 65 6e 73 69 6f 6e  ng the extension
d670: 0a 2a 2a 20 61 72 65 20 38 2e 36 20 6f 72 20 6e  .** are 8.6 or n
d680: 65 77 65 72 2c 20 74 68 65 20 63 6f 64 65 20 73  ewer, the code s
d690: 74 69 6c 6c 20 74 65 73 74 73 20 74 68 65 20 54  till tests the T
d6a0: 63 6c 20 76 65 72 73 69 6f 6e 20 61 74 20 72 75  cl version at ru
d6b0: 6e 74 69 6d 65 2e 0a 2a 2a 20 54 68 69 73 20 61  ntime..** This a
d6c0: 6c 6c 6f 77 73 20 73 74 75 62 73 2d 65 6e 61 62  llows stubs-enab
d6d0: 6c 65 64 20 62 75 69 6c 64 73 20 74 6f 20 62 65  led builds to be
d6e0: 20 75 73 65 64 20 77 69 74 68 20 6f 6c 64 65 72   used with older
d6f0: 20 54 63 6c 20 6c 69 62 72 61 72 69 65 73 2e 0a   Tcl libraries..
d700: 2a 2f 0a 23 69 66 20 54 43 4c 5f 4d 41 4a 4f 52  */.#if TCL_MAJOR
d710: 5f 56 45 52 53 49 4f 4e 3e 38 20 7c 7c 20 28 54  _VERSION>8 || (T
d720: 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f 4e  CL_MAJOR_VERSION
d730: 3d 3d 38 20 26 26 20 54 43 4c 5f 4d 49 4e 4f 52  ==8 && TCL_MINOR
d740: 5f 56 45 52 53 49 4f 4e 3e 3d 36 29 0a 23 20 64  _VERSION>=6).# d
d750: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 54 43 4c  efine SQLITE_TCL
d760: 5f 4e 52 45 20 31 0a 73 74 61 74 69 63 20 69 6e  _NRE 1.static in
d770: 74 20 44 62 55 73 65 4e 72 65 28 76 6f 69 64 29  t DbUseNre(void)
d780: 7b 0a 20 20 69 6e 74 20 6d 61 6a 6f 72 2c 20 6d  {.  int major, m
d790: 69 6e 6f 72 3b 0a 20 20 54 63 6c 5f 47 65 74 56  inor;.  Tcl_GetV
d7a0: 65 72 73 69 6f 6e 28 26 6d 61 6a 6f 72 2c 20 26  ersion(&major, &
d7b0: 6d 69 6e 6f 72 2c 20 30 2c 20 30 29 3b 0a 20 20  minor, 0, 0);.  
d7c0: 72 65 74 75 72 6e 28 20 28 6d 61 6a 6f 72 3d 3d  return( (major==
d7d0: 38 20 26 26 20 6d 69 6e 6f 72 3e 3d 36 29 20 7c  8 && minor>=6) |
d7e0: 7c 20 6d 61 6a 6f 72 3e 38 20 29 3b 0a 7d 0a 23  | major>8 );.}.#
d7f0: 65 6c 73 65 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 69  else./*.** Compi
d800: 6c 69 6e 67 20 75 73 69 6e 67 20 68 65 61 64 65  ling using heade
d810: 72 73 20 65 61 72 6c 69 65 72 20 74 68 61 6e 20  rs earlier than 
d820: 38 2e 36 2e 20 49 6e 20 74 68 69 73 20 63 61 73  8.6. In this cas
d830: 65 20 4e 52 20 63 61 6e 6e 6f 74 20 62 65 0a 2a  e NR cannot be.*
d840: 2a 20 75 73 65 64 2c 20 73 6f 20 44 62 55 73 65  * used, so DbUse
d850: 4e 72 65 28 29 20 74 6f 20 61 6c 77 61 79 73 20  Nre() to always 
d860: 72 65 74 75 72 6e 20 7a 65 72 6f 2e 20 41 64 64  return zero. Add
d870: 20 23 64 65 66 69 6e 65 73 20 66 6f 72 20 74 68   #defines for th
d880: 65 20 6f 74 68 65 72 0a 2a 2a 20 54 63 6c 5f 4e  e other.** Tcl_N
d890: 52 78 78 78 28 29 20 66 75 6e 63 74 69 6f 6e 73  Rxxx() functions
d8a0: 20 74 6f 20 70 72 65 76 65 6e 74 20 74 68 65 6d   to prevent them
d8b0: 20 66 72 6f 6d 20 63 61 75 73 69 6e 67 20 63 6f   from causing co
d8c0: 6d 70 69 6c 61 74 69 6f 6e 20 65 72 72 6f 72 73  mpilation errors
d8d0: 2c 0a 2a 2a 20 65 76 65 6e 20 74 68 6f 75 67 68  ,.** even though
d8e0: 20 74 68 65 20 6f 6e 6c 79 20 69 6e 76 6f 63 61   the only invoca
d8f0: 74 69 6f 6e 73 20 6f 66 20 74 68 65 6d 20 61 72  tions of them ar
d900: 65 20 77 69 74 68 69 6e 20 63 6f 6e 64 69 74 69  e within conditi
d910: 6f 6e 61 6c 20 62 6c 6f 63 6b 73 0a 2a 2a 20 6f  onal blocks.** o
d920: 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a  f the form:.**.*
d930: 2a 20 20 20 69 66 28 20 44 62 55 73 65 4e 72 65  *   if( DbUseNre
d940: 28 29 20 29 20 7b 20 2e 2e 2e 20 7d 0a 2a 2f 0a  () ) { ... }.*/.
d950: 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f  # define SQLITE_
d960: 54 43 4c 5f 4e 52 45 20 30 0a 23 20 64 65 66 69  TCL_NRE 0.# defi
d970: 6e 65 20 44 62 55 73 65 4e 72 65 28 29 20 30 0a  ne DbUseNre() 0.
d980: 23 20 64 65 66 69 6e 65 20 54 63 6c 5f 4e 52 41  # define Tcl_NRA
d990: 64 64 43 61 6c 6c 62 61 63 6b 28 61 2c 62 2c 63  ddCallback(a,b,c
d9a0: 2c 64 2c 65 2c 66 29 20 28 76 6f 69 64 29 30 0a  ,d,e,f) (void)0.
d9b0: 23 20 64 65 66 69 6e 65 20 54 63 6c 5f 4e 52 45  # define Tcl_NRE
d9c0: 76 61 6c 4f 62 6a 28 61 2c 62 2c 63 29 20 30 0a  valObj(a,b,c) 0.
d9d0: 23 20 64 65 66 69 6e 65 20 54 63 6c 5f 4e 52 43  # define Tcl_NRC
d9e0: 72 65 61 74 65 43 6f 6d 6d 61 6e 64 28 61 2c 62  reateCommand(a,b
d9f0: 2c 63 2c 64 2c 65 2c 66 29 20 28 76 6f 69 64 29  ,c,d,e,f) (void)
da00: 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  0.#endif../*.** 
da10: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
da20: 20 70 61 72 74 20 6f 66 20 74 68 65 20 69 6d 70   part of the imp
da30: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
da40: 68 65 20 63 6f 6d 6d 61 6e 64 3a 0a 2a 2a 0a 2a  he command:.**.*
da50: 2a 20 20 20 24 64 62 20 65 76 61 6c 20 53 51 4c  *   $db eval SQL
da60: 20 3f 41 52 52 41 59 4e 41 4d 45 3f 20 53 43 52   ?ARRAYNAME? SCR
da70: 49 50 54 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  IPT.*/.static in
da80: 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20  t SQLITE_TCLAPI 
da90: 44 62 45 76 61 6c 4e 65 78 74 43 6d 64 28 0a 20  DbEvalNextCmd(. 
daa0: 20 43 6c 69 65 6e 74 44 61 74 61 20 64 61 74 61   ClientData data
dab0: 5b 5d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  [],             
dac0: 20 20 20 20 20 20 2f 2a 20 64 61 74 61 5b 30 5d        /* data[0]
dad0: 20 69 73 20 74 68 65 20 28 44 62 45 76 61 6c 43   is the (DbEvalC
dae0: 6f 6e 74 65 78 74 2a 29 20 2a 2f 0a 20 20 54 63  ontext*) */.  Tc
daf0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
db00: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
db10: 20 20 20 2f 2a 20 54 63 6c 20 69 6e 74 65 72 70     /* Tcl interp
db20: 72 65 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72  reter */.  int r
db30: 65 73 75 6c 74 20 20 20 20 20 20 20 20 20 20 20  esult           
db40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db50: 2f 2a 20 52 65 73 75 6c 74 20 73 6f 20 66 61 72  /* Result so far
db60: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   */.){.  int rc 
db70: 3d 20 72 65 73 75 6c 74 3b 20 20 20 20 20 20 20  = result;       
db80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
db90: 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
dba0: 0a 20 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20  .  /* The first 
dbb0: 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 64  element of the d
dbc0: 61 74 61 5b 5d 20 61 72 72 61 79 20 69 73 20 61  ata[] array is a
dbd0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 44 62   pointer to a Db
dbe0: 45 76 61 6c 43 6f 6e 74 65 78 74 0a 20 20 2a 2a  EvalContext.  **
dbf0: 20 73 74 72 75 63 74 75 72 65 20 61 6c 6c 6f 63   structure alloc
dc00: 61 74 65 64 20 75 73 69 6e 67 20 54 63 6c 5f 41  ated using Tcl_A
dc10: 6c 6c 6f 63 28 29 2e 20 54 68 65 20 73 65 63 6f  lloc(). The seco
dc20: 6e 64 20 65 6c 65 6d 65 6e 74 20 6f 66 20 64 61  nd element of da
dc30: 74 61 5b 5d 0a 20 20 2a 2a 20 69 73 20 61 20 70  ta[].  ** is a p
dc40: 6f 69 6e 74 65 72 20 74 6f 20 61 20 54 63 6c 5f  ointer to a Tcl_
dc50: 4f 62 6a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  Obj containing t
dc60: 68 65 20 73 63 72 69 70 74 20 74 6f 20 72 75 6e  he script to run
dc70: 20 66 6f 72 20 65 61 63 68 20 72 6f 77 0a 20 20   for each row.  
dc80: 2a 2a 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  ** returned by t
dc90: 68 65 20 71 75 65 72 69 65 73 20 65 6e 63 61 70  he queries encap
dca0: 73 75 6c 61 74 65 64 20 69 6e 20 64 61 74 61 5b  sulated in data[
dcb0: 30 5d 2e 20 2a 2f 0a 20 20 44 62 45 76 61 6c 43  0]. */.  DbEvalC
dcc0: 6f 6e 74 65 78 74 20 2a 70 20 3d 20 28 44 62 45  ontext *p = (DbE
dcd0: 76 61 6c 43 6f 6e 74 65 78 74 20 2a 29 64 61 74  valContext *)dat
dce0: 61 5b 30 5d 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20  a[0];.  Tcl_Obj 
dcf0: 2a 70 53 63 72 69 70 74 20 3d 20 28 54 63 6c 5f  *pScript = (Tcl_
dd00: 4f 62 6a 20 2a 29 64 61 74 61 5b 31 5d 3b 0a 20  Obj *)data[1];. 
dd10: 20 54 63 6c 5f 4f 62 6a 20 2a 70 41 72 72 61 79   Tcl_Obj *pArray
dd20: 20 3d 20 70 2d 3e 70 41 72 72 61 79 3b 0a 0a 20   = p->pArray;.. 
dd30: 20 77 68 69 6c 65 28 20 28 72 63 3d 3d 54 43 4c   while( (rc==TCL
dd40: 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 54 43 4c 5f 43  _OK || rc==TCL_C
dd50: 4f 4e 54 49 4e 55 45 29 20 26 26 20 54 43 4c 5f  ONTINUE) && TCL_
dd60: 4f 4b 3d 3d 28 72 63 20 3d 20 64 62 45 76 61 6c  OK==(rc = dbEval
dd70: 53 74 65 70 28 70 29 29 20 29 7b 0a 20 20 20 20  Step(p)) ){.    
dd80: 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 6e  int i;.    int n
dd90: 43 6f 6c 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  Col;.    Tcl_Obj
dda0: 20 2a 2a 61 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20   **apColName;.  
ddb0: 20 20 64 62 45 76 61 6c 52 6f 77 49 6e 66 6f 28    dbEvalRowInfo(
ddc0: 70 2c 20 26 6e 43 6f 6c 2c 20 26 61 70 43 6f 6c  p, &nCol, &apCol
ddd0: 4e 61 6d 65 29 3b 0a 20 20 20 20 66 6f 72 28 69  Name);.    for(i
dde0: 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29  =0; i<nCol; i++)
ddf0: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 41 72 72  {.      if( pArr
de00: 61 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ay==0 ){.       
de10: 20 54 63 6c 5f 4f 62 6a 53 65 74 56 61 72 32 28   Tcl_ObjSetVar2(
de20: 69 6e 74 65 72 70 2c 20 61 70 43 6f 6c 4e 61 6d  interp, apColNam
de30: 65 5b 69 5d 2c 20 30 2c 20 64 62 45 76 61 6c 43  e[i], 0, dbEvalC
de40: 6f 6c 75 6d 6e 56 61 6c 75 65 28 70 2c 69 29 2c  olumnValue(p,i),
de50: 20 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   0);.      }else
de60: 20 69 66 28 20 28 70 2d 3e 65 76 61 6c 46 6c 61   if( (p->evalFla
de70: 67 73 20 26 20 53 51 4c 49 54 45 5f 45 56 41 4c  gs & SQLITE_EVAL
de80: 5f 57 49 54 48 4f 55 54 4e 55 4c 4c 53 29 21 3d  _WITHOUTNULLS)!=
de90: 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26  0.             &
dea0: 26 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  & sqlite3_column
deb0: 5f 74 79 70 65 28 70 2d 3e 70 50 72 65 53 74 6d  _type(p->pPreStm
dec0: 74 2d 3e 70 53 74 6d 74 2c 20 69 29 3d 3d 53 51  t->pStmt, i)==SQ
ded0: 4c 49 54 45 5f 4e 55 4c 4c 20 0a 20 20 20 20 20  LITE_NULL .     
dee0: 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f   ){.        Tcl_
def0: 55 6e 73 65 74 56 61 72 32 28 69 6e 74 65 72 70  UnsetVar2(interp
df00: 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
df10: 70 41 72 72 61 79 29 2c 20 0a 20 20 20 20 20 20  pArray), .      
df20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df30: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 61 70  Tcl_GetString(ap
df40: 43 6f 6c 4e 61 6d 65 5b 69 5d 29 2c 20 30 29 3b  ColName[i]), 0);
df50: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
df60: 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 53 65 74        Tcl_ObjSet
df70: 56 61 72 32 28 69 6e 74 65 72 70 2c 20 70 41 72  Var2(interp, pAr
df80: 72 61 79 2c 20 61 70 43 6f 6c 4e 61 6d 65 5b 69  ray, apColName[i
df90: 5d 2c 20 64 62 45 76 61 6c 43 6f 6c 75 6d 6e 56  ], dbEvalColumnV
dfa0: 61 6c 75 65 28 70 2c 69 29 2c 20 30 29 3b 0a 20  alue(p,i), 0);. 
dfb0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
dfc0: 20 20 2f 2a 20 54 68 65 20 72 65 71 75 69 72 65    /* The require
dfd0: 64 20 69 6e 74 65 72 70 72 65 74 65 72 20 76 61  d interpreter va
dfe0: 72 69 61 62 6c 65 73 20 61 72 65 20 6e 6f 77 20  riables are now 
dff0: 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 74  populated with t
e000: 68 65 20 64 61 74 61 0a 20 20 20 20 2a 2a 20 66  he data.    ** f
e010: 72 6f 6d 20 74 68 65 20 63 75 72 72 65 6e 74 20  rom the current 
e020: 72 6f 77 2e 20 49 66 20 75 73 69 6e 67 20 4e 52  row. If using NR
e030: 45 2c 20 73 63 68 65 64 75 6c 65 20 63 61 6c 6c  E, schedule call
e040: 62 61 63 6b 73 20 74 6f 20 65 76 61 6c 75 61 74  backs to evaluat
e050: 65 0a 20 20 20 20 2a 2a 20 73 63 72 69 70 74 20  e.    ** script 
e060: 70 53 63 72 69 70 74 2c 20 74 68 65 6e 20 74 6f  pScript, then to
e070: 20 69 6e 76 6f 6b 65 20 74 68 69 73 20 66 75 6e   invoke this fun
e080: 63 74 69 6f 6e 20 61 67 61 69 6e 20 74 6f 20 66  ction again to f
e090: 65 74 63 68 20 74 68 65 20 6e 65 78 74 0a 20 20  etch the next.  
e0a0: 20 20 2a 2a 20 72 6f 77 20 28 6f 72 20 63 6c 65    ** row (or cle
e0b0: 61 6e 20 75 70 20 69 66 20 74 68 65 72 65 20 69  an up if there i
e0c0: 73 20 6e 6f 20 6e 65 78 74 20 72 6f 77 20 6f 72  s no next row or
e0d0: 20 74 68 65 20 73 63 72 69 70 74 20 74 68 72 6f   the script thro
e0e0: 77 73 20 61 6e 0a 20 20 20 20 2a 2a 20 65 78 63  ws an.    ** exc
e0f0: 65 70 74 69 6f 6e 29 2e 20 41 66 74 65 72 20 73  eption). After s
e100: 63 68 65 64 75 6c 69 6e 67 20 74 68 65 20 63 61  cheduling the ca
e110: 6c 6c 62 61 63 6b 73 2c 20 72 65 74 75 72 6e 20  llbacks, return 
e120: 63 6f 6e 74 72 6f 6c 20 74 6f 20 74 68 65 0a 20  control to the. 
e130: 20 20 20 2a 2a 20 63 61 6c 6c 65 72 2e 0a 20 20     ** caller..  
e140: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 6e    **.    ** If n
e150: 6f 74 20 75 73 69 6e 67 20 4e 52 45 2c 20 65 76  ot using NRE, ev
e160: 61 6c 75 61 74 65 20 70 53 63 72 69 70 74 20 64  aluate pScript d
e170: 69 72 65 63 74 6c 79 20 61 6e 64 20 63 6f 6e 74  irectly and cont
e180: 69 6e 75 65 20 77 69 74 68 20 74 68 65 0a 20 20  inue with the.  
e190: 20 20 2a 2a 20 6e 65 78 74 20 69 74 65 72 61 74    ** next iterat
e1a0: 69 6f 6e 20 6f 66 20 74 68 69 73 20 77 68 69 6c  ion of this whil
e1b0: 65 28 2e 2e 2e 29 20 6c 6f 6f 70 2e 20 20 2a 2f  e(...) loop.  */
e1c0: 0a 20 20 20 20 69 66 28 20 44 62 55 73 65 4e 72  .    if( DbUseNr
e1d0: 65 28 29 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  e() ){.      Tcl
e1e0: 5f 4e 52 41 64 64 43 61 6c 6c 62 61 63 6b 28 69  _NRAddCallback(i
e1f0: 6e 74 65 72 70 2c 20 44 62 45 76 61 6c 4e 65 78  nterp, DbEvalNex
e200: 74 43 6d 64 2c 20 28 76 6f 69 64 2a 29 70 2c 20  tCmd, (void*)p, 
e210: 28 76 6f 69 64 2a 29 70 53 63 72 69 70 74 2c 20  (void*)pScript, 
e220: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 65 74  0, 0);.      ret
e230: 75 72 6e 20 54 63 6c 5f 4e 52 45 76 61 6c 4f 62  urn Tcl_NREvalOb
e240: 6a 28 69 6e 74 65 72 70 2c 20 70 53 63 72 69 70  j(interp, pScrip
e250: 74 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65  t, 0);.    }else
e260: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 54 63 6c  {.      rc = Tcl
e270: 5f 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72  _EvalObjEx(inter
e280: 70 2c 20 70 53 63 72 69 70 74 2c 20 30 29 3b 0a  p, pScript, 0);.
e290: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 54 63 6c      }.  }..  Tcl
e2a0: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 53  _DecrRefCount(pS
e2b0: 63 72 69 70 74 29 3b 0a 20 20 64 62 45 76 61 6c  cript);.  dbEval
e2c0: 46 69 6e 61 6c 69 7a 65 28 70 29 3b 0a 20 20 54  Finalize(p);.  T
e2d0: 63 6c 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29  cl_Free((char *)
e2e0: 70 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 54  p);..  if( rc==T
e2f0: 43 4c 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 54 43 4c  CL_OK || rc==TCL
e300: 5f 42 52 45 41 4b 20 29 7b 0a 20 20 20 20 54 63  _BREAK ){.    Tc
e310: 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e  l_ResetResult(in
e320: 74 65 72 70 29 3b 0a 20 20 20 20 72 63 20 3d 20  terp);.    rc = 
e330: 54 43 4c 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65  TCL_OK;.  }.  re
e340: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
e350: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
e360: 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20 69  is used by the i
e370: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 6f  mplementations o
e380: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
e390: 64 61 74 61 62 61 73 65 0a 2a 2a 20 68 61 6e 64  database.** hand
e3a0: 6c 65 20 73 75 62 2d 63 6f 6d 6d 61 6e 64 73 3a  le sub-commands:
e3b0: 0a 2a 2a 0a 2a 2a 20 20 20 24 64 62 20 75 70 64  .**.**   $db upd
e3c0: 61 74 65 5f 68 6f 6f 6b 20 3f 53 43 52 49 50 54  ate_hook ?SCRIPT
e3d0: 3f 0a 2a 2a 20 20 20 24 64 62 20 77 61 6c 5f 68  ?.**   $db wal_h
e3e0: 6f 6f 6b 20 3f 53 43 52 49 50 54 3f 0a 2a 2a 20  ook ?SCRIPT?.** 
e3f0: 20 20 24 64 62 20 63 6f 6d 6d 69 74 5f 68 6f 6f    $db commit_hoo
e400: 6b 20 3f 53 43 52 49 50 54 3f 0a 2a 2a 20 20 20  k ?SCRIPT?.**   
e410: 24 64 62 20 70 72 65 75 70 64 61 74 65 20 68 6f  $db preupdate ho
e420: 6f 6b 20 3f 53 43 52 49 50 54 3f 0a 2a 2f 0a 73  ok ?SCRIPT?.*/.s
e430: 74 61 74 69 63 20 76 6f 69 64 20 44 62 48 6f 6f  tatic void DbHoo
e440: 6b 43 6d 64 28 0a 20 20 54 63 6c 5f 49 6e 74 65  kCmd(.  Tcl_Inte
e450: 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 20  rp *interp,     
e460: 20 20 20 20 20 20 20 20 2f 2a 20 54 63 6c 20 69          /* Tcl i
e470: 6e 74 65 72 70 72 65 74 65 72 20 2a 2f 0a 20 20  nterpreter */.  
e480: 53 71 6c 69 74 65 44 62 20 2a 70 44 62 2c 20 20  SqliteDb *pDb,  
e490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e4a0: 2f 2a 20 44 61 74 61 62 61 73 65 20 68 61 6e 64  /* Database hand
e4b0: 6c 65 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  le */.  Tcl_Obj 
e4c0: 2a 70 41 72 67 2c 20 20 20 20 20 20 20 20 20 20  *pArg,          
e4d0: 20 20 20 20 20 20 20 20 2f 2a 20 53 43 52 49 50          /* SCRIP
e4e0: 54 20 61 72 67 75 6d 65 6e 74 20 28 6f 72 20 4e  T argument (or N
e4f0: 55 4c 4c 29 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62  ULL) */.  Tcl_Ob
e500: 6a 20 2a 2a 70 70 48 6f 6f 6b 20 20 20 20 20 20  j **ppHook      
e510: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
e520: 6e 74 65 72 20 74 6f 20 6d 65 6d 62 65 72 20 6f  nter to member o
e530: 66 20 53 71 6c 69 74 65 44 62 20 2a 2f 0a 29 7b  f SqliteDb */.){
e540: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
e550: 20 70 44 62 2d 3e 64 62 3b 0a 0a 20 20 69 66 28   pDb->db;..  if(
e560: 20 2a 70 70 48 6f 6f 6b 20 29 7b 0a 20 20 20 20   *ppHook ){.    
e570: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
e580: 28 69 6e 74 65 72 70 2c 20 2a 70 70 48 6f 6f 6b  (interp, *ppHook
e590: 29 3b 0a 20 20 20 20 69 66 28 20 70 41 72 67 20  );.    if( pArg 
e5a0: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 44 65 63  ){.      Tcl_Dec
e5b0: 72 52 65 66 43 6f 75 6e 74 28 2a 70 70 48 6f 6f  rRefCount(*ppHoo
e5c0: 6b 29 3b 0a 20 20 20 20 20 20 2a 70 70 48 6f 6f  k);.      *ppHoo
e5d0: 6b 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  k = 0;.    }.  }
e5e0: 0a 20 20 69 66 28 20 70 41 72 67 20 29 7b 0a 20  .  if( pArg ){. 
e5f0: 20 20 20 61 73 73 65 72 74 28 20 21 28 2a 70 70     assert( !(*pp
e600: 48 6f 6f 6b 29 20 29 3b 0a 20 20 20 20 69 66 28  Hook) );.    if(
e610: 20 54 63 6c 5f 47 65 74 43 68 61 72 4c 65 6e 67   Tcl_GetCharLeng
e620: 74 68 28 70 41 72 67 29 3e 30 20 29 7b 0a 20 20  th(pArg)>0 ){.  
e630: 20 20 20 20 2a 70 70 48 6f 6f 6b 20 3d 20 70 41      *ppHook = pA
e640: 72 67 3b 0a 20 20 20 20 20 20 54 63 6c 5f 49 6e  rg;.      Tcl_In
e650: 63 72 52 65 66 43 6f 75 6e 74 28 2a 70 70 48 6f  crRefCount(*ppHo
e660: 6f 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ok);.    }.  }..
e670: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
e680: 41 42 4c 45 5f 50 52 45 55 50 44 41 54 45 5f 48  ABLE_PREUPDATE_H
e690: 4f 4f 4b 0a 20 20 73 71 6c 69 74 65 33 5f 70 72  OOK.  sqlite3_pr
e6a0: 65 75 70 64 61 74 65 5f 68 6f 6f 6b 28 64 62 2c  eupdate_hook(db,
e6b0: 20 28 70 44 62 2d 3e 70 50 72 65 55 70 64 61 74   (pDb->pPreUpdat
e6c0: 65 48 6f 6f 6b 3f 44 62 50 72 65 55 70 64 61 74  eHook?DbPreUpdat
e6d0: 65 48 61 6e 64 6c 65 72 3a 30 29 2c 20 70 44 62  eHandler:0), pDb
e6e0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69  );.#endif.  sqli
e6f0: 74 65 33 5f 75 70 64 61 74 65 5f 68 6f 6f 6b 28  te3_update_hook(
e700: 64 62 2c 20 28 70 44 62 2d 3e 70 55 70 64 61 74  db, (pDb->pUpdat
e710: 65 48 6f 6f 6b 3f 44 62 55 70 64 61 74 65 48 61  eHook?DbUpdateHa
e720: 6e 64 6c 65 72 3a 30 29 2c 20 70 44 62 29 3b 0a  ndler:0), pDb);.
e730: 20 20 73 71 6c 69 74 65 33 5f 72 6f 6c 6c 62 61    sqlite3_rollba
e740: 63 6b 5f 68 6f 6f 6b 28 64 62 2c 20 28 70 44 62  ck_hook(db, (pDb
e750: 2d 3e 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 3f  ->pRollbackHook?
e760: 44 62 52 6f 6c 6c 62 61 63 6b 48 61 6e 64 6c 65  DbRollbackHandle
e770: 72 3a 30 29 2c 20 70 44 62 29 3b 0a 20 20 73 71  r:0), pDb);.  sq
e780: 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 64  lite3_wal_hook(d
e790: 62 2c 20 28 70 44 62 2d 3e 70 57 61 6c 48 6f 6f  b, (pDb->pWalHoo
e7a0: 6b 3f 44 62 57 61 6c 48 61 6e 64 6c 65 72 3a 30  k?DbWalHandler:0
e7b0: 29 2c 20 70 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ), pDb);.}../*.*
e7c0: 2a 20 54 68 65 20 22 73 71 6c 69 74 65 22 20 63  * The "sqlite" c
e7d0: 6f 6d 6d 61 6e 64 20 62 65 6c 6f 77 20 63 72 65  ommand below cre
e7e0: 61 74 65 73 20 61 20 6e 65 77 20 54 63 6c 20 63  ates a new Tcl c
e7f0: 6f 6d 6d 61 6e 64 20 66 6f 72 20 65 61 63 68 0a  ommand for each.
e800: 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 74  ** connection it
e810: 20 6f 70 65 6e 73 20 74 6f 20 61 6e 20 53 51 4c   opens to an SQL
e820: 69 74 65 20 64 61 74 61 62 61 73 65 2e 20 20 54  ite database.  T
e830: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 69  his routine is i
e840: 6e 76 6f 6b 65 64 0a 2a 2a 20 77 68 65 6e 65 76  nvoked.** whenev
e850: 65 72 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20  er one of those 
e860: 63 6f 6e 6e 65 63 74 69 6f 6e 2d 73 70 65 63 69  connection-speci
e870: 66 69 63 20 63 6f 6d 6d 61 6e 64 73 20 69 73 20  fic commands is 
e880: 65 78 65 63 75 74 65 64 0a 2a 2a 20 69 6e 20 54  executed.** in T
e890: 63 6c 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65  cl.  For example
e8a0: 2c 20 69 66 20 79 6f 75 20 72 75 6e 20 54 63 6c  , if you run Tcl
e8b0: 20 63 6f 64 65 20 6c 69 6b 65 20 74 68 69 73 3a   code like this:
e8c0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 73 71 6c  .**.**       sql
e8d0: 69 74 65 33 20 64 62 31 20 20 22 6d 79 5f 64 61  ite3 db1  "my_da
e8e0: 74 61 62 61 73 65 22 0a 2a 2a 20 20 20 20 20 20  tabase".**      
e8f0: 20 64 62 31 20 63 6c 6f 73 65 0a 2a 2a 0a 2a 2a   db1 close.**.**
e900: 20 54 68 65 20 66 69 72 73 74 20 63 6f 6d 6d 61   The first comma
e910: 6e 64 20 6f 70 65 6e 73 20 61 20 63 6f 6e 6e 65  nd opens a conne
e920: 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 22 6d 79  ction to the "my
e930: 5f 64 61 74 61 62 61 73 65 22 20 64 61 74 61 62  _database" datab
e940: 61 73 65 0a 2a 2a 20 61 6e 64 20 63 61 6c 6c 73  ase.** and calls
e950: 20 74 68 61 74 20 63 6f 6e 6e 65 63 74 69 6f 6e   that connection
e960: 20 22 64 62 31 22 2e 20 20 54 68 65 20 73 65 63   "db1".  The sec
e970: 6f 6e 64 20 63 6f 6d 6d 61 6e 64 20 63 61 75 73  ond command caus
e980: 65 73 20 74 68 69 73 0a 2a 2a 20 73 75 62 72 6f  es this.** subro
e990: 75 74 69 6e 65 20 74 6f 20 62 65 20 69 6e 76 6f  utine to be invo
e9a0: 6b 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ked..*/.static i
e9b0: 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49  nt SQLITE_TCLAPI
e9c0: 20 44 62 4f 62 6a 43 6d 64 28 0a 20 20 76 6f 69   DbObjCmd(.  voi
e9d0: 64 20 2a 63 64 2c 0a 20 20 54 63 6c 5f 49 6e 74  d *cd,.  Tcl_Int
e9e0: 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
e9f0: 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
ea00: 62 6a 20 2a 63 6f 6e 73 74 2a 6f 62 6a 76 0a 29  bj *const*objv.)
ea10: 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44  {.  SqliteDb *pD
ea20: 62 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 63  b = (SqliteDb*)c
ea30: 64 3b 0a 20 20 69 6e 74 20 63 68 6f 69 63 65 3b  d;.  int choice;
ea40: 0a 20 20 69 6e 74 20 72 63 20 3d 20 54 43 4c 5f  .  int rc = TCL_
ea50: 4f 4b 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  OK;.  static con
ea60: 73 74 20 63 68 61 72 20 2a 44 42 5f 73 74 72 73  st char *DB_strs
ea70: 5b 5d 20 3d 20 7b 0a 20 20 20 20 22 61 75 74 68  [] = {.    "auth
ea80: 6f 72 69 7a 65 72 22 2c 20 20 20 20 20 20 20 20  orizer",        
ea90: 20 22 62 61 63 6b 75 70 22 2c 20 20 20 20 20 20   "backup",      
eaa0: 20 20 20 20 20 20 22 62 75 73 79 22 2c 0a 20 20        "busy",.  
eab0: 20 20 22 63 61 63 68 65 22 2c 20 20 20 20 20 20    "cache",      
eac0: 20 20 20 20 20 20 20 20 22 63 68 61 6e 67 65 73          "changes
ead0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 22 63 6c  ",           "cl
eae0: 6f 73 65 22 2c 0a 20 20 20 20 22 63 6f 6c 6c 61  ose",.    "colla
eaf0: 74 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  te",            
eb00: 22 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65  "collation_neede
eb10: 64 22 2c 20 20 22 63 6f 6d 6d 69 74 5f 68 6f 6f  d",  "commit_hoo
eb20: 6b 22 2c 0a 20 20 20 20 22 63 6f 6d 70 6c 65 74  k",.    "complet
eb30: 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 22 63  e",           "c
eb40: 6f 70 79 22 2c 20 20 20 20 20 20 20 20 20 20 20  opy",           
eb50: 20 20 20 22 65 6e 61 62 6c 65 5f 6c 6f 61 64 5f     "enable_load_
eb60: 65 78 74 65 6e 73 69 6f 6e 22 2c 0a 20 20 20 20  extension",.    
eb70: 22 65 72 72 6f 72 63 6f 64 65 22 2c 20 20 20 20  "errorcode",    
eb80: 20 20 20 20 20 20 22 65 76 61 6c 22 2c 20 20 20        "eval",   
eb90: 20 20 20 20 20 20 20 20 20 20 20 22 65 78 69 73             "exis
eba0: 74 73 22 2c 0a 20 20 20 20 22 66 75 6e 63 74 69  ts",.    "functi
ebb0: 6f 6e 22 2c 20 20 20 20 20 20 20 20 20 20 20 22  on",           "
ebc0: 69 6e 63 72 62 6c 6f 62 22 2c 20 20 20 20 20 20  incrblob",      
ebd0: 20 20 20 20 22 69 6e 74 65 72 72 75 70 74 22 2c      "interrupt",
ebe0: 0a 20 20 20 20 22 6c 61 73 74 5f 69 6e 73 65 72  .    "last_inser
ebf0: 74 5f 72 6f 77 69 64 22 2c 20 20 22 6e 61 6d 65  t_rowid",  "name
ec00: 6c 69 73 74 22 2c 20 20 20 20 20 20 20 20 20 20  list",          
ec10: 22 6e 75 6c 6c 76 61 6c 75 65 22 2c 0a 20 20 20  "nullvalue",.   
ec20: 20 22 6f 6e 65 63 6f 6c 75 6d 6e 22 2c 20 20 20   "onecolumn",   
ec30: 20 20 20 20 20 20 20 22 70 72 65 75 70 64 61 74         "preupdat
ec40: 65 22 2c 20 20 20 20 20 20 20 20 20 22 70 72 6f  e",         "pro
ec50: 66 69 6c 65 22 2c 0a 20 20 20 20 22 70 72 6f 67  file",.    "prog
ec60: 72 65 73 73 22 2c 20 20 20 20 20 20 20 20 20 20  ress",          
ec70: 20 22 72 65 6b 65 79 22 2c 20 20 20 20 20 20 20   "rekey",       
ec80: 20 20 20 20 20 20 22 72 65 73 74 6f 72 65 22 2c        "restore",
ec90: 0a 20 20 20 20 22 72 6f 6c 6c 62 61 63 6b 5f 68  .    "rollback_h
eca0: 6f 6f 6b 22 2c 20 20 20 20 20 20 22 73 74 61 74  ook",      "stat
ecb0: 75 73 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  us",            
ecc0: 22 74 69 6d 65 6f 75 74 22 2c 0a 20 20 20 20 22  "timeout",.    "
ecd0: 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73 22 2c 20  total_changes", 
ece0: 20 20 20 20 20 22 74 72 61 63 65 22 2c 20 20 20       "trace",   
ecf0: 20 20 20 20 20 20 20 20 20 20 22 74 72 61 63 65            "trace
ed00: 5f 76 32 22 2c 0a 20 20 20 20 22 74 72 61 6e 73  _v2",.    "trans
ed10: 61 63 74 69 6f 6e 22 2c 20 20 20 20 20 20 20 20  action",        
ed20: 22 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79 22 2c  "unlock_notify",
ed30: 20 20 20 20 20 22 75 70 64 61 74 65 5f 68 6f 6f       "update_hoo
ed40: 6b 22 2c 0a 20 20 20 20 22 76 65 72 73 69 6f 6e  k",.    "version
ed50: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 22 77  ",            "w
ed60: 61 6c 5f 68 6f 6f 6b 22 2c 20 20 20 20 20 20 20  al_hook",       
ed70: 20 20 20 30 0a 20 20 7d 3b 0a 20 20 65 6e 75 6d     0.  };.  enum
ed80: 20 44 42 5f 65 6e 75 6d 20 7b 0a 20 20 20 20 44   DB_enum {.    D
ed90: 42 5f 41 55 54 48 4f 52 49 5a 45 52 2c 20 20 20  B_AUTHORIZER,   
eda0: 20 20 20 20 20 44 42 5f 42 41 43 4b 55 50 2c 20       DB_BACKUP, 
edb0: 20 20 20 20 20 20 20 20 20 20 44 42 5f 42 55 53            DB_BUS
edc0: 59 2c 0a 20 20 20 20 44 42 5f 43 41 43 48 45 2c  Y,.    DB_CACHE,
edd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 44 42 5f               DB_
ede0: 43 48 41 4e 47 45 53 2c 20 20 20 20 20 20 20 20  CHANGES,        
edf0: 20 20 44 42 5f 43 4c 4f 53 45 2c 0a 20 20 20 20    DB_CLOSE,.    
ee00: 44 42 5f 43 4f 4c 4c 41 54 45 2c 20 20 20 20 20  DB_COLLATE,     
ee10: 20 20 20 20 20 20 44 42 5f 43 4f 4c 4c 41 54 49        DB_COLLATI
ee20: 4f 4e 5f 4e 45 45 44 45 44 2c 20 44 42 5f 43 4f  ON_NEEDED, DB_CO
ee30: 4d 4d 49 54 5f 48 4f 4f 4b 2c 0a 20 20 20 20 44  MMIT_HOOK,.    D
ee40: 42 5f 43 4f 4d 50 4c 45 54 45 2c 20 20 20 20 20  B_COMPLETE,     
ee50: 20 20 20 20 20 44 42 5f 43 4f 50 59 2c 20 20 20       DB_COPY,   
ee60: 20 20 20 20 20 20 20 20 20 20 44 42 5f 45 4e 41            DB_ENA
ee70: 42 4c 45 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49  BLE_LOAD_EXTENSI
ee80: 4f 4e 2c 0a 20 20 20 20 44 42 5f 45 52 52 4f 52  ON,.    DB_ERROR
ee90: 43 4f 44 45 2c 20 20 20 20 20 20 20 20 20 44 42  CODE,         DB
eea0: 5f 45 56 41 4c 2c 20 20 20 20 20 20 20 20 20 20  _EVAL,          
eeb0: 20 20 20 44 42 5f 45 58 49 53 54 53 2c 0a 20 20     DB_EXISTS,.  
eec0: 20 20 44 42 5f 46 55 4e 43 54 49 4f 4e 2c 20 20    DB_FUNCTION,  
eed0: 20 20 20 20 20 20 20 20 44 42 5f 49 4e 43 52 42          DB_INCRB
eee0: 4c 4f 42 2c 20 20 20 20 20 20 20 20 20 44 42 5f  LOB,         DB_
eef0: 49 4e 54 45 52 52 55 50 54 2c 0a 20 20 20 20 44  INTERRUPT,.    D
ef00: 42 5f 4c 41 53 54 5f 49 4e 53 45 52 54 5f 52 4f  B_LAST_INSERT_RO
ef10: 57 49 44 2c 20 44 42 5f 4e 41 4d 45 4c 49 53 54  WID, DB_NAMELIST
ef20: 2c 20 20 20 20 20 20 20 20 20 44 42 5f 4e 55 4c  ,         DB_NUL
ef30: 4c 56 41 4c 55 45 2c 0a 20 20 20 20 44 42 5f 4f  LVALUE,.    DB_O
ef40: 4e 45 43 4f 4c 55 4d 4e 2c 20 20 20 20 20 20 20  NECOLUMN,       
ef50: 20 20 44 42 5f 50 52 45 55 50 44 41 54 45 2c 20    DB_PREUPDATE, 
ef60: 20 20 20 20 20 20 20 44 42 5f 50 52 4f 46 49 4c         DB_PROFIL
ef70: 45 2c 0a 20 20 20 20 44 42 5f 50 52 4f 47 52 45  E,.    DB_PROGRE
ef80: 53 53 2c 20 20 20 20 20 20 20 20 20 20 44 42 5f  SS,          DB_
ef90: 52 45 4b 45 59 2c 20 20 20 20 20 20 20 20 20 20  REKEY,          
efa0: 20 20 44 42 5f 52 45 53 54 4f 52 45 2c 0a 20 20    DB_RESTORE,.  
efb0: 20 20 44 42 5f 52 4f 4c 4c 42 41 43 4b 5f 48 4f    DB_ROLLBACK_HO
efc0: 4f 4b 2c 20 20 20 20 20 44 42 5f 53 54 41 54 55  OK,     DB_STATU
efd0: 53 2c 20 20 20 20 20 20 20 20 20 20 20 44 42 5f  S,           DB_
efe0: 54 49 4d 45 4f 55 54 2c 0a 20 20 20 20 44 42 5f  TIMEOUT,.    DB_
eff0: 54 4f 54 41 4c 5f 43 48 41 4e 47 45 53 2c 20 20  TOTAL_CHANGES,  
f000: 20 20 20 44 42 5f 54 52 41 43 45 2c 20 20 20 20     DB_TRACE,    
f010: 20 20 20 20 20 20 20 20 44 42 5f 54 52 41 43 45          DB_TRACE
f020: 5f 56 32 2c 0a 20 20 20 20 44 42 5f 54 52 41 4e  _V2,.    DB_TRAN
f030: 53 41 43 54 49 4f 4e 2c 20 20 20 20 20 20 20 44  SACTION,       D
f040: 42 5f 55 4e 4c 4f 43 4b 5f 4e 4f 54 49 46 59 2c  B_UNLOCK_NOTIFY,
f050: 20 20 20 20 44 42 5f 55 50 44 41 54 45 5f 48 4f      DB_UPDATE_HO
f060: 4f 4b 2c 0a 20 20 20 20 44 42 5f 56 45 52 53 49  OK,.    DB_VERSI
f070: 4f 4e 2c 20 20 20 20 20 20 20 20 20 20 20 44 42  ON,           DB
f080: 5f 57 41 4c 5f 48 4f 4f 4b 2c 20 20 20 20 20 20  _WAL_HOOK,      
f090: 20 20 20 0a 20 20 7d 3b 0a 20 20 2f 2a 20 64 6f     .  };.  /* do
f0a0: 6e 27 74 20 6c 65 61 76 65 20 74 72 61 69 6c 69  n't leave traili
f0b0: 6e 67 20 63 6f 6d 6d 61 73 20 6f 6e 20 44 42 5f  ng commas on DB_
f0c0: 65 6e 75 6d 2c 20 69 74 20 63 6f 6e 66 75 73 65  enum, it confuse
f0d0: 73 20 74 68 65 20 41 49 58 20 78 6c 63 20 63 6f  s the AIX xlc co
f0e0: 6d 70 69 6c 65 72 20 2a 2f 0a 0a 20 20 69 66 28  mpiler */..  if(
f0f0: 20 6f 62 6a 63 3c 32 20 29 7b 0a 20 20 20 20 54   objc<2 ){.    T
f100: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
f110: 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
f120: 20 22 53 55 42 43 4f 4d 4d 41 4e 44 20 2e 2e 2e   "SUBCOMMAND ...
f130: 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ");.    return T
f140: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
f150: 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 64 65 78  if( Tcl_GetIndex
f160: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
f170: 6f 62 6a 76 5b 31 5d 2c 20 44 42 5f 73 74 72 73  objv[1], DB_strs
f180: 2c 20 22 6f 70 74 69 6f 6e 22 2c 20 30 2c 20 26  , "option", 0, &
f190: 63 68 6f 69 63 65 29 20 29 7b 0a 20 20 20 20 72  choice) ){.    r
f1a0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
f1b0: 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63 68 28 20  .  }..  switch( 
f1c0: 28 65 6e 75 6d 20 44 42 5f 65 6e 75 6d 29 63 68  (enum DB_enum)ch
f1d0: 6f 69 63 65 20 29 7b 0a 0a 20 20 2f 2a 20 20 20  oice ){..  /*   
f1e0: 20 24 64 62 20 61 75 74 68 6f 72 69 7a 65 72 20   $db authorizer 
f1f0: 3f 43 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a 0a  ?CALLBACK?.  **.
f200: 20 20 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20    ** Invoke the 
f210: 67 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b 20 74  given callback t
f220: 6f 20 61 75 74 68 6f 72 69 7a 65 20 65 61 63 68  o authorize each
f230: 20 53 51 4c 20 6f 70 65 72 61 74 69 6f 6e 20 61   SQL operation a
f240: 73 20 69 74 20 69 73 0a 20 20 2a 2a 20 63 6f 6d  s it is.  ** com
f250: 70 69 6c 65 64 2e 20 20 35 20 61 72 67 75 6d 65  piled.  5 argume
f260: 6e 74 73 20 61 72 65 20 61 70 70 65 6e 64 65 64  nts are appended
f270: 20 74 6f 20 74 68 65 20 63 61 6c 6c 62 61 63 6b   to the callback
f280: 20 62 65 66 6f 72 65 20 69 74 20 69 73 0a 20 20   before it is.  
f290: 2a 2a 20 69 6e 76 6f 6b 65 64 3a 0a 20 20 2a 2a  ** invoked:.  **
f2a0: 0a 20 20 2a 2a 20 20 20 28 31 29 20 54 68 65 20  .  **   (1) The 
f2b0: 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 74 79  authorization ty
f2c0: 70 65 20 28 65 78 3a 20 53 51 4c 49 54 45 5f 43  pe (ex: SQLITE_C
f2d0: 52 45 41 54 45 5f 54 41 42 4c 45 2c 20 53 51 4c  REATE_TABLE, SQL
f2e0: 49 54 45 5f 49 4e 53 45 52 54 2c 20 2e 2e 2e 29  ITE_INSERT, ...)
f2f0: 0a 20 20 2a 2a 20 20 20 28 32 29 20 46 69 72 73  .  **   (2) Firs
f300: 74 20 64 65 73 63 72 69 70 74 69 76 65 20 6e 61  t descriptive na
f310: 6d 65 20 28 64 65 70 65 6e 64 73 20 6f 6e 20 61  me (depends on a
f320: 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 74 79 70  uthorization typ
f330: 65 29 0a 20 20 2a 2a 20 20 20 28 33 29 20 53 65  e).  **   (3) Se
f340: 63 6f 6e 64 20 64 65 73 63 72 69 70 74 69 76 65  cond descriptive
f350: 20 6e 61 6d 65 0a 20 20 2a 2a 20 20 20 28 34 29   name.  **   (4)
f360: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   Name of the dat
f370: 61 62 61 73 65 20 28 65 78 3a 20 22 6d 61 69 6e  abase (ex: "main
f380: 22 2c 20 22 74 65 6d 70 22 29 0a 20 20 2a 2a 20  ", "temp").  ** 
f390: 20 20 28 35 29 20 4e 61 6d 65 20 6f 66 20 74 72    (5) Name of tr
f3a0: 69 67 67 65 72 20 74 68 61 74 20 69 73 20 64 6f  igger that is do
f3b0: 69 6e 67 20 74 68 65 20 61 63 63 65 73 73 0a 20  ing the access. 
f3c0: 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 63 61 6c   **.  ** The cal
f3d0: 6c 62 61 63 6b 20 73 68 6f 75 6c 64 20 72 65 74  lback should ret
f3e0: 75 72 6e 20 6f 6e 20 6f 66 20 74 68 65 20 66 6f  urn on of the fo
f3f0: 6c 6c 6f 77 69 6e 67 20 73 74 72 69 6e 67 73 3a  llowing strings:
f400: 20 53 51 4c 49 54 45 5f 4f 4b 2c 0a 20 20 2a 2a   SQLITE_OK,.  **
f410: 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 2c 20   SQLITE_IGNORE, 
f420: 6f 72 20 53 51 4c 49 54 45 5f 44 45 4e 59 2e 20  or SQLITE_DENY. 
f430: 20 41 6e 79 20 6f 74 68 65 72 20 72 65 74 75 72   Any other retur
f440: 6e 20 76 61 6c 75 65 20 69 73 20 61 6e 20 65 72  n value is an er
f450: 72 6f 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  ror..  **.  ** I
f460: 66 20 74 68 69 73 20 6d 65 74 68 6f 64 20 69 73  f this method is
f470: 20 69 6e 76 6f 6b 65 64 20 77 69 74 68 20 6e 6f   invoked with no
f480: 20 61 72 67 75 6d 65 6e 74 73 2c 20 74 68 65 20   arguments, the 
f490: 63 75 72 72 65 6e 74 20 61 75 74 68 6f 72 69 7a  current authoriz
f4a0: 61 74 69 6f 6e 0a 20 20 2a 2a 20 63 61 6c 6c 62  ation.  ** callb
f4b0: 61 63 6b 20 73 74 72 69 6e 67 20 69 73 20 72 65  ack string is re
f4c0: 74 75 72 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 63  turned..  */.  c
f4d0: 61 73 65 20 44 42 5f 41 55 54 48 4f 52 49 5a 45  ase DB_AUTHORIZE
f4e0: 52 3a 20 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  R: {.#ifdef SQLI
f4f0: 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a  TE_OMIT_AUTHORIZ
f500: 41 54 49 4f 4e 0a 20 20 20 20 54 63 6c 5f 41 70  ATION.    Tcl_Ap
f510: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
f520: 70 2c 20 22 61 75 74 68 6f 72 69 7a 61 74 69 6f  p, "authorizatio
f530: 6e 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20  n not available 
f540: 69 6e 20 74 68 69 73 20 62 75 69 6c 64 22 2c 0a  in this build",.
f550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f560: 20 20 20 20 20 28 63 68 61 72 2a 29 30 29 3b 0a       (char*)0);.
f570: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
f580: 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 20 20 20 20  RROR;.#else.    
f590: 69 66 28 20 6f 62 6a 63 3e 33 20 29 7b 0a 20 20  if( objc>3 ){.  
f5a0: 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
f5b0: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20  Args(interp, 2, 
f5c0: 6f 62 6a 76 2c 20 22 3f 43 41 4c 4c 42 41 43 4b  objv, "?CALLBACK
f5d0: 3f 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ?");.      retur
f5e0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
f5f0: 20 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d   }else if( objc=
f600: 3d 32 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =2 ){.      if( 
f610: 70 44 62 2d 3e 7a 41 75 74 68 20 29 7b 0a 20 20  pDb->zAuth ){.  
f620: 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
f630: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70  Result(interp, p
f640: 44 62 2d 3e 7a 41 75 74 68 2c 20 28 63 68 61 72  Db->zAuth, (char
f650: 2a 29 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  *)0);.      }.  
f660: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63    }else{.      c
f670: 68 61 72 20 2a 7a 41 75 74 68 3b 0a 20 20 20 20  har *zAuth;.    
f680: 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20    int len;.     
f690: 20 69 66 28 20 70 44 62 2d 3e 7a 41 75 74 68 20   if( pDb->zAuth 
f6a0: 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 46  ){.        Tcl_F
f6b0: 72 65 65 28 70 44 62 2d 3e 7a 41 75 74 68 29 3b  ree(pDb->zAuth);
f6c0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a  .      }.      z
f6d0: 41 75 74 68 20 3d 20 54 63 6c 5f 47 65 74 53 74  Auth = Tcl_GetSt
f6e0: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
f6f0: 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20  [2], &len);.    
f700: 20 20 69 66 28 20 7a 41 75 74 68 20 26 26 20 6c    if( zAuth && l
f710: 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  en>0 ){.        
f720: 70 44 62 2d 3e 7a 41 75 74 68 20 3d 20 54 63 6c  pDb->zAuth = Tcl
f730: 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20 31 20  _Alloc( len + 1 
f740: 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  );.        memcp
f750: 79 28 70 44 62 2d 3e 7a 41 75 74 68 2c 20 7a 41  y(pDb->zAuth, zA
f760: 75 74 68 2c 20 6c 65 6e 2b 31 29 3b 0a 20 20 20  uth, len+1);.   
f770: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
f780: 20 20 70 44 62 2d 3e 7a 41 75 74 68 20 3d 20 30    pDb->zAuth = 0
f790: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
f7a0: 69 66 28 20 70 44 62 2d 3e 7a 41 75 74 68 20 29  if( pDb->zAuth )
f7b0: 7b 0a 20 20 20 20 20 20 20 20 74 79 70 65 64 65  {.        typede
f7c0: 66 20 69 6e 74 20 28 2a 73 71 6c 69 74 65 33 5f  f int (*sqlite3_
f7d0: 61 75 74 68 5f 63 62 29 28 0a 20 20 20 20 20 20  auth_cb)(.      
f7e0: 20 20 20 20 20 76 6f 69 64 2a 2c 69 6e 74 2c 63       void*,int,c
f7f0: 6f 6e 73 74 20 63 68 61 72 2a 2c 63 6f 6e 73 74  onst char*,const
f800: 20 63 68 61 72 2a 2c 0a 20 20 20 20 20 20 20 20   char*,.        
f810: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 2a 2c 63     const char*,c
f820: 6f 6e 73 74 20 63 68 61 72 2a 29 3b 0a 20 20 20  onst char*);.   
f830: 20 20 20 20 20 70 44 62 2d 3e 69 6e 74 65 72 70       pDb->interp
f840: 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 20   = interp;.     
f850: 20 20 20 73 71 6c 69 74 65 33 5f 73 65 74 5f 61     sqlite3_set_a
f860: 75 74 68 6f 72 69 7a 65 72 28 70 44 62 2d 3e 64  uthorizer(pDb->d
f870: 62 2c 28 73 71 6c 69 74 65 33 5f 61 75 74 68 5f  b,(sqlite3_auth_
f880: 63 62 29 61 75 74 68 5f 63 61 6c 6c 62 61 63 6b  cb)auth_callback
f890: 2c 70 44 62 29 3b 0a 20 20 20 20 20 20 7d 65 6c  ,pDb);.      }el
f8a0: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
f8b0: 74 65 33 5f 73 65 74 5f 61 75 74 68 6f 72 69 7a  te3_set_authoriz
f8c0: 65 72 28 70 44 62 2d 3e 64 62 2c 20 30 2c 20 30  er(pDb->db, 0, 0
f8d0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
f8e0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 62 72 65 61  .#endif.    brea
f8f0: 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20  k;.  }..  /*    
f900: 24 64 62 20 62 61 63 6b 75 70 20 3f 44 41 54 41  $db backup ?DATA
f910: 42 41 53 45 3f 20 46 49 4c 45 4e 41 4d 45 0a 20  BASE? FILENAME. 
f920: 20 2a 2a 0a 20 20 2a 2a 20 4f 70 65 6e 20 6f 72   **.  ** Open or
f930: 20 63 72 65 61 74 65 20 61 20 64 61 74 61 62 61   create a databa
f940: 73 65 20 66 69 6c 65 20 6e 61 6d 65 64 20 46 49  se file named FI
f950: 4c 45 4e 41 4d 45 2e 20 20 54 72 61 6e 73 66 65  LENAME.  Transfe
f960: 72 20 74 68 65 0a 20 20 2a 2a 20 63 6f 6e 74 65  r the.  ** conte
f970: 6e 74 20 6f 66 20 6c 6f 63 61 6c 20 64 61 74 61  nt of local data
f980: 62 61 73 65 20 44 41 54 41 42 41 53 45 20 28 64  base DATABASE (d
f990: 65 66 61 75 6c 74 3a 20 22 6d 61 69 6e 22 29 20  efault: "main") 
f9a0: 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 46 49  into the.  ** FI
f9b0: 4c 45 4e 41 4d 45 20 64 61 74 61 62 61 73 65 2e  LENAME database.
f9c0: 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f  .  */.  case DB_
f9d0: 42 41 43 4b 55 50 3a 20 7b 0a 20 20 20 20 63 6f  BACKUP: {.    co
f9e0: 6e 73 74 20 63 68 61 72 20 2a 7a 44 65 73 74 46  nst char *zDestF
f9f0: 69 6c 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ile;.    const c
fa00: 68 61 72 20 2a 7a 53 72 63 44 62 3b 0a 20 20 20  har *zSrcDb;.   
fa10: 20 73 71 6c 69 74 65 33 20 2a 70 44 65 73 74 3b   sqlite3 *pDest;
fa20: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 61 63  .    sqlite3_bac
fa30: 6b 75 70 20 2a 70 42 61 63 6b 75 70 3b 0a 0a 20  kup *pBackup;.. 
fa40: 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d 33 20 29     if( objc==3 )
fa50: 7b 0a 20 20 20 20 20 20 7a 53 72 63 44 62 20 3d  {.      zSrcDb =
fa60: 20 22 6d 61 69 6e 22 3b 0a 20 20 20 20 20 20 7a   "main";.      z
fa70: 44 65 73 74 46 69 6c 65 20 3d 20 54 63 6c 5f 47  DestFile = Tcl_G
fa80: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d  etString(objv[2]
fa90: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
faa0: 20 6f 62 6a 63 3d 3d 34 20 29 7b 0a 20 20 20 20   objc==4 ){.    
fab0: 20 20 7a 53 72 63 44 62 20 3d 20 54 63 6c 5f 47    zSrcDb = Tcl_G
fac0: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d  etString(objv[2]
fad0: 29 3b 0a 20 20 20 20 20 20 7a 44 65 73 74 46 69  );.      zDestFi
fae0: 6c 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  le = Tcl_GetStri
faf0: 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a 20 20 20  ng(objv[3]);.   
fb00: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 54 63   }else{.      Tc
fb10: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
fb20: 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
fb30: 22 3f 44 41 54 41 42 41 53 45 3f 20 46 49 4c 45  "?DATABASE? FILE
fb40: 4e 41 4d 45 22 29 3b 0a 20 20 20 20 20 20 72 65  NAME");.      re
fb50: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
fb60: 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73      }.    rc = s
fb70: 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 7a  qlite3_open_v2(z
fb80: 44 65 73 74 46 69 6c 65 2c 20 26 70 44 65 73 74  DestFile, &pDest
fb90: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
fba0: 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
fbb0: 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f  DWRITE | SQLITE_
fbc0: 4f 50 45 4e 5f 43 52 45 41 54 45 7c 20 70 44 62  OPEN_CREATE| pDb
fbd0: 2d 3e 6f 70 65 6e 46 6c 61 67 73 2c 20 30 29 3b  ->openFlags, 0);
fbe0: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
fbf0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
fc00: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
fc10: 28 69 6e 74 65 72 70 2c 20 22 63 61 6e 6e 6f 74  (interp, "cannot
fc20: 20 6f 70 65 6e 20 74 61 72 67 65 74 20 64 61 74   open target dat
fc30: 61 62 61 73 65 3a 20 22 2c 0a 20 20 20 20 20 20  abase: ",.      
fc40: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65 72 72       sqlite3_err
fc50: 6d 73 67 28 70 44 65 73 74 29 2c 20 28 63 68 61  msg(pDest), (cha
fc60: 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  r*)0);.      sql
fc70: 69 74 65 33 5f 63 6c 6f 73 65 28 70 44 65 73 74  ite3_close(pDest
fc80: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
fc90: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
fca0: 0a 20 20 20 20 70 42 61 63 6b 75 70 20 3d 20 73  .    pBackup = s
fcb0: 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f 69 6e  qlite3_backup_in
fcc0: 69 74 28 70 44 65 73 74 2c 20 22 6d 61 69 6e 22  it(pDest, "main"
fcd0: 2c 20 70 44 62 2d 3e 64 62 2c 20 7a 53 72 63 44  , pDb->db, zSrcD
fce0: 62 29 3b 0a 20 20 20 20 69 66 28 20 70 42 61 63  b);.    if( pBac
fcf0: 6b 75 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  kup==0 ){.      
fd00: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
fd10: 28 69 6e 74 65 72 70 2c 20 22 62 61 63 6b 75 70  (interp, "backup
fd20: 20 66 61 69 6c 65 64 3a 20 22 2c 0a 20 20 20 20   failed: ",.    
fd30: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65         sqlite3_e
fd40: 72 72 6d 73 67 28 70 44 65 73 74 29 2c 20 28 63  rrmsg(pDest), (c
fd50: 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 73  har*)0);.      s
fd60: 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70 44 65  qlite3_close(pDe
fd70: 73 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  st);.      retur
fd80: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
fd90: 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 20 28   }.    while(  (
fda0: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 61 63  rc = sqlite3_bac
fdb0: 6b 75 70 5f 73 74 65 70 28 70 42 61 63 6b 75 70  kup_step(pBackup
fdc0: 2c 31 30 30 29 29 3d 3d 53 51 4c 49 54 45 5f 4f  ,100))==SQLITE_O
fdd0: 4b 20 29 7b 7d 0a 20 20 20 20 73 71 6c 69 74 65  K ){}.    sqlite
fde0: 33 5f 62 61 63 6b 75 70 5f 66 69 6e 69 73 68 28  3_backup_finish(
fdf0: 70 42 61 63 6b 75 70 29 3b 0a 20 20 20 20 69 66  pBackup);.    if
fe00: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc==SQLITE_DON
fe10: 45 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  E ){.      rc = 
fe20: 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73  TCL_OK;.    }els
fe30: 65 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70  e{.      Tcl_App
fe40: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
fe50: 2c 20 22 62 61 63 6b 75 70 20 66 61 69 6c 65 64  , "backup failed
fe60: 3a 20 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  : ",.           
fe70: 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70  sqlite3_errmsg(p
fe80: 44 65 73 74 29 2c 20 28 63 68 61 72 2a 29 30 29  Dest), (char*)0)
fe90: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c  ;.      rc = TCL
fea0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
feb0: 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28    sqlite3_close(
fec0: 70 44 65 73 74 29 3b 0a 20 20 20 20 62 72 65 61  pDest);.    brea
fed0: 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20  k;.  }..  /*    
fee0: 24 64 62 20 62 75 73 79 20 3f 43 41 4c 4c 42 41  $db busy ?CALLBA
fef0: 43 4b 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e  CK?.  **.  ** In
ff00: 76 6f 6b 65 20 74 68 65 20 67 69 76 65 6e 20 63  voke the given c
ff10: 61 6c 6c 62 61 63 6b 20 69 66 20 61 6e 20 53 51  allback if an SQ
ff20: 4c 20 73 74 61 74 65 6d 65 6e 74 20 61 74 74 65  L statement atte
ff30: 6d 70 74 73 20 74 6f 20 6f 70 65 6e 0a 20 20 2a  mpts to open.  *
ff40: 2a 20 61 20 6c 6f 63 6b 65 64 20 64 61 74 61 62  * a locked datab
ff50: 61 73 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20  ase file..  */. 
ff60: 20 63 61 73 65 20 44 42 5f 42 55 53 59 3a 20 7b   case DB_BUSY: {
ff70: 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 33 20  .    if( objc>3 
ff80: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f  ){.      Tcl_Wro
ff90: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
ffa0: 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 43 41 4c 4c  , 2, objv, "CALL
ffb0: 42 41 43 4b 22 29 3b 0a 20 20 20 20 20 20 72 65  BACK");.      re
ffc0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
ffd0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 62      }else if( ob
ffe0: 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 69  jc==2 ){.      i
fff0: 66 28 20 70 44 62 2d 3e 7a 42 75 73 79 20 29 7b  f( pDb->zBusy ){
10000 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70  .        Tcl_App
10010 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
10020 2c 20 70 44 62 2d 3e 7a 42 75 73 79 2c 20 28 63  , pDb->zBusy, (c
10030 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 7d  har*)0);.      }
10040 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
10050 20 20 63 68 61 72 20 2a 7a 42 75 73 79 3b 0a 20    char *zBusy;. 
10060 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20       int len;.  
10070 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 42 75      if( pDb->zBu
10080 73 79 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63  sy ){.        Tc
10090 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 42 75 73  l_Free(pDb->zBus
100a0 79 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  y);.      }.    
100b0 20 20 7a 42 75 73 79 20 3d 20 54 63 6c 5f 47 65    zBusy = Tcl_Ge
100c0 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
100d0 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a 20  bjv[2], &len);. 
100e0 20 20 20 20 20 69 66 28 20 7a 42 75 73 79 20 26       if( zBusy &
100f0 26 20 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20  & len>0 ){.     
10100 20 20 20 70 44 62 2d 3e 7a 42 75 73 79 20 3d 20     pDb->zBusy = 
10110 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b  Tcl_Alloc( len +
10120 20 31 20 29 3b 0a 20 20 20 20 20 20 20 20 6d 65   1 );.        me
10130 6d 63 70 79 28 70 44 62 2d 3e 7a 42 75 73 79 2c  mcpy(pDb->zBusy,
10140 20 7a 42 75 73 79 2c 20 6c 65 6e 2b 31 29 3b 0a   zBusy, len+1);.
10150 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
10160 20 20 20 20 20 70 44 62 2d 3e 7a 42 75 73 79 20       pDb->zBusy 
10170 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
10180 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 42 75 73     if( pDb->zBus
10190 79 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62  y ){.        pDb
101a0 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72  ->interp = inter
101b0 70 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  p;.        sqlit
101c0 65 33 5f 62 75 73 79 5f 68 61 6e 64 6c 65 72 28  e3_busy_handler(
101d0 70 44 62 2d 3e 64 62 2c 20 44 62 42 75 73 79 48  pDb->db, DbBusyH
101e0 61 6e 64 6c 65 72 2c 20 70 44 62 29 3b 0a 20 20  andler, pDb);.  
101f0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
10200 20 20 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f     sqlite3_busy_
10210 68 61 6e 64 6c 65 72 28 70 44 62 2d 3e 64 62 2c  handler(pDb->db,
10220 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a   0, 0);.      }.
10230 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b      }.    break;
10240 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 20 24  .  }..  /*     $
10250 64 62 20 63 61 63 68 65 20 66 6c 75 73 68 0a 20  db cache flush. 
10260 20 2a 2a 20 20 20 20 20 24 64 62 20 63 61 63 68   **     $db cach
10270 65 20 73 69 7a 65 20 6e 0a 20 20 2a 2a 0a 20 20  e size n.  **.  
10280 2a 2a 20 46 6c 75 73 68 20 74 68 65 20 70 72 65  ** Flush the pre
10290 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20  pared statement 
102a0 63 61 63 68 65 2c 20 6f 72 20 73 65 74 20 74 68  cache, or set th
102b0 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  e maximum number
102c0 20 6f 66 0a 20 20 2a 2a 20 63 61 63 68 65 64 20   of.  ** cached 
102d0 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f  statements..  */
102e0 0a 20 20 63 61 73 65 20 44 42 5f 43 41 43 48 45  .  case DB_CACHE
102f0 3a 20 7b 0a 20 20 20 20 63 68 61 72 20 2a 73 75  : {.    char *su
10300 62 43 6d 64 3b 0a 20 20 20 20 69 6e 74 20 6e 3b  bCmd;.    int n;
10310 0a 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3c 3d  ..    if( objc<=
10320 32 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57  2 ){.      Tcl_W
10330 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
10340 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 61  rp, 1, objv, "ca
10350 63 68 65 20 6f 70 74 69 6f 6e 20 3f 61 72 67 3f  che option ?arg?
10360 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
10370 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
10380 7d 0a 20 20 20 20 73 75 62 43 6d 64 20 3d 20 54  }.    subCmd = T
10390 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
103a0 4f 62 6a 28 20 6f 62 6a 76 5b 32 5d 2c 20 30 20  Obj( objv[2], 0 
103b0 29 3b 0a 20 20 20 20 69 66 28 20 2a 73 75 62 43  );.    if( *subC
103c0 6d 64 3d 3d 27 66 27 20 26 26 20 73 74 72 63 6d  md=='f' && strcm
103d0 70 28 73 75 62 43 6d 64 2c 22 66 6c 75 73 68 22  p(subCmd,"flush"
103e0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  )==0 ){.      if
103f0 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20  ( objc!=3 ){.   
10400 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
10410 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
10420 20 6f 62 6a 76 2c 20 22 66 6c 75 73 68 22 29 3b   objv, "flush");
10430 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
10440 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  TCL_ERROR;.     
10450 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
10460 66 6c 75 73 68 53 74 6d 74 43 61 63 68 65 28 20  flushStmtCache( 
10470 70 44 62 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20  pDb );.      }. 
10480 20 20 20 7d 65 6c 73 65 20 69 66 28 20 2a 73 75     }else if( *su
10490 62 43 6d 64 3d 3d 27 73 27 20 26 26 20 73 74 72  bCmd=='s' && str
104a0 63 6d 70 28 73 75 62 43 6d 64 2c 22 73 69 7a 65  cmp(subCmd,"size
104b0 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ")==0 ){.      i
104c0 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20  f( objc!=4 ){.  
104d0 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
104e0 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
104f0 2c 20 6f 62 6a 76 2c 20 22 73 69 7a 65 20 6e 22  , objv, "size n"
10500 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
10510 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
10520 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
10530 20 20 69 66 28 20 54 43 4c 5f 45 52 52 4f 52 3d    if( TCL_ERROR=
10540 3d 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f  =Tcl_GetIntFromO
10550 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
10560 33 5d 2c 20 26 6e 29 20 29 7b 0a 20 20 20 20 20  3], &n) ){.     
10570 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
10580 65 73 75 6c 74 28 20 69 6e 74 65 72 70 2c 20 22  esult( interp, "
10590 63 61 6e 6e 6f 74 20 63 6f 6e 76 65 72 74 20 5c  cannot convert \
105a0 22 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  "",.            
105b0 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
105c0 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d 2c  FromObj(objv[3],
105d0 30 29 2c 20 22 5c 22 20 74 6f 20 69 6e 74 65 67  0), "\" to integ
105e0 65 72 22 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  er", (char*)0);.
105f0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
10600 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
10610 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
10620 20 20 20 20 20 69 66 28 20 6e 3c 30 20 29 7b 0a       if( n<0 ){.
10630 20 20 20 20 20 20 20 20 20 20 20 20 66 6c 75 73              flus
10640 68 53 74 6d 74 43 61 63 68 65 28 20 70 44 62 20  hStmtCache( pDb 
10650 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e  );.            n
10660 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
10670 7d 65 6c 73 65 20 69 66 28 20 6e 3e 4d 41 58 5f  }else if( n>MAX_
10680 50 52 45 50 41 52 45 44 5f 53 54 4d 54 53 20 29  PREPARED_STMTS )
10690 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 20  {.            n 
106a0 3d 20 4d 41 58 5f 50 52 45 50 41 52 45 44 5f 53  = MAX_PREPARED_S
106b0 54 4d 54 53 3b 0a 20 20 20 20 20 20 20 20 20 20  TMTS;.          
106c0 7d 0a 20 20 20 20 20 20 20 20 20 20 70 44 62 2d  }.          pDb-
106d0 3e 6d 61 78 53 74 6d 74 20 3d 20 6e 3b 0a 20 20  >maxStmt = n;.  
106e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
106f0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
10700 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
10710 74 28 20 69 6e 74 65 72 70 2c 20 22 62 61 64 20  t( interp, "bad 
10720 6f 70 74 69 6f 6e 20 5c 22 22 2c 0a 20 20 20 20  option \"",.    
10730 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
10740 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
10750 32 5d 2c 30 29 2c 20 22 5c 22 3a 20 6d 75 73 74  2],0), "\": must
10760 20 62 65 20 66 6c 75 73 68 20 6f 72 20 73 69 7a   be flush or siz
10770 65 22 2c 0a 20 20 20 20 20 20 20 20 20 20 28 63  e",.          (c
10780 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 72  har*)0);.      r
10790 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
107a0 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b  .    }.    break
107b0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 20  ;.  }..  /*     
107c0 24 64 62 20 63 68 61 6e 67 65 73 0a 20 20 2a 2a  $db changes.  **
107d0 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  .  ** Return the
107e0 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
107f0 74 68 61 74 20 77 65 72 65 20 6d 6f 64 69 66 69  that were modifi
10800 65 64 2c 20 69 6e 73 65 72 74 65 64 2c 20 6f 72  ed, inserted, or
10810 20 64 65 6c 65 74 65 64 20 62 79 0a 20 20 2a 2a   deleted by.  **
10820 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
10830 20 49 4e 53 45 52 54 2c 20 55 50 44 41 54 45 20   INSERT, UPDATE 
10840 6f 72 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d  or DELETE statem
10850 65 6e 74 2c 20 6e 6f 74 20 69 6e 63 6c 75 64 69  ent, not includi
10860 6e 67 0a 20 20 2a 2a 20 61 6e 79 20 63 68 61 6e  ng.  ** any chan
10870 67 65 73 20 6d 61 64 65 20 62 79 20 74 72 69 67  ges made by trig
10880 67 65 72 20 70 72 6f 67 72 61 6d 73 2e 0a 20 20  ger programs..  
10890 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 43 48 41  */.  case DB_CHA
108a0 4e 47 45 53 3a 20 7b 0a 20 20 20 20 54 63 6c 5f  NGES: {.    Tcl_
108b0 4f 62 6a 20 2a 70 52 65 73 75 6c 74 3b 0a 20 20  Obj *pResult;.  
108c0 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b    if( objc!=2 ){
108d0 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  .      Tcl_Wrong
108e0 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
108f0 32 2c 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 20 20  2, objv, "");.  
10900 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
10910 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
10920 70 52 65 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65  pResult = Tcl_Ge
10930 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
10940 70 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 49  p);.    Tcl_SetI
10950 6e 74 4f 62 6a 28 70 52 65 73 75 6c 74 2c 20 73  ntObj(pResult, s
10960 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 28 70  qlite3_changes(p
10970 44 62 2d 3e 64 62 29 29 3b 0a 20 20 20 20 62 72  Db->db));.    br
10980 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20  eak;.  }..  /*  
10990 20 20 24 64 62 20 63 6c 6f 73 65 0a 20 20 2a 2a    $db close.  **
109a0 0a 20 20 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74  .  ** Shutdown t
109b0 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2f  he database.  */
109c0 0a 20 20 63 61 73 65 20 44 42 5f 43 4c 4f 53 45  .  case DB_CLOSE
109d0 3a 20 7b 0a 20 20 20 20 54 63 6c 5f 44 65 6c 65  : {.    Tcl_Dele
109e0 74 65 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70  teCommand(interp
109f0 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  , Tcl_GetStringF
10a00 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20  romObj(objv[0], 
10a10 30 29 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a  0));.    break;.
10a20 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20    }..  /*.  **  
10a30 20 20 20 24 64 62 20 63 6f 6c 6c 61 74 65 20 4e     $db collate N
10a40 41 4d 45 20 53 43 52 49 50 54 0a 20 20 2a 2a 0a  AME SCRIPT.  **.
10a50 20 20 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65    ** Create a ne
10a60 77 20 53 51 4c 20 63 6f 6c 6c 61 74 69 6f 6e 20  w SQL collation 
10a70 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 20  function called 
10a80 4e 41 4d 45 2e 20 20 57 68 65 6e 65 76 65 72 0a  NAME.  Whenever.
10a90 20 20 2a 2a 20 74 68 61 74 20 66 75 6e 63 74 69    ** that functi
10aa0 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 6e  on is called, in
10ab0 76 6f 6b 65 20 53 43 52 49 50 54 20 74 6f 20 65  voke SCRIPT to e
10ac0 76 61 6c 75 61 74 65 20 74 68 65 20 66 75 6e 63  valuate the func
10ad0 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 63 61 73  tion..  */.  cas
10ae0 65 20 44 42 5f 43 4f 4c 4c 41 54 45 3a 20 7b 0a  e DB_COLLATE: {.
10af0 20 20 20 20 53 71 6c 43 6f 6c 6c 61 74 65 20 2a      SqlCollate *
10b00 70 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 63 68  pCollate;.    ch
10b10 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 63  ar *zName;.    c
10b20 68 61 72 20 2a 7a 53 63 72 69 70 74 3b 0a 20 20  har *zScript;.  
10b30 20 20 69 6e 74 20 6e 53 63 72 69 70 74 3b 0a 20    int nScript;. 
10b40 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29     if( objc!=4 )
10b50 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e  {.      Tcl_Wron
10b60 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
10b70 20 32 2c 20 6f 62 6a 76 2c 20 22 4e 41 4d 45 20   2, objv, "NAME 
10b80 53 43 52 49 50 54 22 29 3b 0a 20 20 20 20 20 20  SCRIPT");.      
10b90 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
10ba0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4e 61 6d  ;.    }.    zNam
10bb0 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  e = Tcl_GetStrin
10bc0 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d  gFromObj(objv[2]
10bd0 2c 20 30 29 3b 0a 20 20 20 20 7a 53 63 72 69 70  , 0);.    zScrip
10be0 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  t = Tcl_GetStrin
10bf0 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d  gFromObj(objv[3]
10c00 2c 20 26 6e 53 63 72 69 70 74 29 3b 0a 20 20 20  , &nScript);.   
10c10 20 70 43 6f 6c 6c 61 74 65 20 3d 20 28 53 71 6c   pCollate = (Sql
10c20 43 6f 6c 6c 61 74 65 2a 29 54 63 6c 5f 41 6c 6c  Collate*)Tcl_All
10c30 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 43 6f 6c  oc( sizeof(*pCol
10c40 6c 61 74 65 29 20 2b 20 6e 53 63 72 69 70 74 20  late) + nScript 
10c50 2b 20 31 20 29 3b 0a 20 20 20 20 69 66 28 20 70  + 1 );.    if( p
10c60 43 6f 6c 6c 61 74 65 3d 3d 30 20 29 20 72 65 74  Collate==0 ) ret
10c70 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
10c80 20 20 20 70 43 6f 6c 6c 61 74 65 2d 3e 69 6e 74     pCollate->int
10c90 65 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20  erp = interp;.  
10ca0 20 20 70 43 6f 6c 6c 61 74 65 2d 3e 70 4e 65 78    pCollate->pNex
10cb0 74 20 3d 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74  t = pDb->pCollat
10cc0 65 3b 0a 20 20 20 20 70 43 6f 6c 6c 61 74 65 2d  e;.    pCollate-
10cd0 3e 7a 53 63 72 69 70 74 20 3d 20 28 63 68 61 72  >zScript = (char
10ce0 2a 29 26 70 43 6f 6c 6c 61 74 65 5b 31 5d 3b 0a  *)&pCollate[1];.
10cf0 20 20 20 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74      pDb->pCollat
10d00 65 20 3d 20 70 43 6f 6c 6c 61 74 65 3b 0a 20 20  e = pCollate;.  
10d10 20 20 6d 65 6d 63 70 79 28 70 43 6f 6c 6c 61 74    memcpy(pCollat
10d20 65 2d 3e 7a 53 63 72 69 70 74 2c 20 7a 53 63 72  e->zScript, zScr
10d30 69 70 74 2c 20 6e 53 63 72 69 70 74 2b 31 29 3b  ipt, nScript+1);
10d40 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
10d50 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f  _create_collatio
10d60 6e 28 70 44 62 2d 3e 64 62 2c 20 7a 4e 61 6d 65  n(pDb->db, zName
10d70 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 0a 20  , SQLITE_UTF8,. 
10d80 20 20 20 20 20 20 20 70 43 6f 6c 6c 61 74 65 2c         pCollate,
10d90 20 74 63 6c 53 71 6c 43 6f 6c 6c 61 74 65 29 20   tclSqlCollate) 
10da0 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74  ){.      Tcl_Set
10db0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28  Result(interp, (
10dc0 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 65  char *)sqlite3_e
10dd0 72 72 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c 20  rrmsg(pDb->db), 
10de0 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20  TCL_VOLATILE);. 
10df0 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
10e00 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
10e10 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
10e20 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20 63  *.  **     $db c
10e30 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64 20  ollation_needed 
10e40 53 43 52 49 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a  SCRIPT.  **.  **
10e50 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 53 51   Create a new SQ
10e60 4c 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e 63  L collation func
10e70 74 69 6f 6e 20 63 61 6c 6c 65 64 20 4e 41 4d 45  tion called NAME
10e80 2e 20 20 57 68 65 6e 65 76 65 72 0a 20 20 2a 2a  .  Whenever.  **
10e90 20 74 68 61 74 20 66 75 6e 63 74 69 6f 6e 20 69   that function i
10ea0 73 20 63 61 6c 6c 65 64 2c 20 69 6e 76 6f 6b 65  s called, invoke
10eb0 20 53 43 52 49 50 54 20 74 6f 20 65 76 61 6c 75   SCRIPT to evalu
10ec0 61 74 65 20 74 68 65 20 66 75 6e 63 74 69 6f 6e  ate the function
10ed0 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  ..  */.  case DB
10ee0 5f 43 4f 4c 4c 41 54 49 4f 4e 5f 4e 45 45 44 45  _COLLATION_NEEDE
10ef0 44 3a 20 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a  D: {.    if( obj
10f00 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 54 63  c!=3 ){.      Tc
10f10 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
10f20 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
10f30 22 53 43 52 49 50 54 22 29 3b 0a 20 20 20 20 20  "SCRIPT");.     
10f40 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
10f50 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  R;.    }.    if(
10f60 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65   pDb->pCollateNe
10f70 65 64 65 64 20 29 7b 0a 20 20 20 20 20 20 54 63  eded ){.      Tc
10f80 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70  l_DecrRefCount(p
10f90 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65 65 64  Db->pCollateNeed
10fa0 65 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ed);.    }.    p
10fb0 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65 65 64  Db->pCollateNeed
10fc0 65 64 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61  ed = Tcl_Duplica
10fd0 74 65 4f 62 6a 28 6f 62 6a 76 5b 32 5d 29 3b 0a  teObj(objv[2]);.
10fe0 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43      Tcl_IncrRefC
10ff0 6f 75 6e 74 28 70 44 62 2d 3e 70 43 6f 6c 6c 61  ount(pDb->pColla
11000 74 65 4e 65 65 64 65 64 29 3b 0a 20 20 20 20 73  teNeeded);.    s
11010 71 6c 69 74 65 33 5f 63 6f 6c 6c 61 74 69 6f 6e  qlite3_collation
11020 5f 6e 65 65 64 65 64 28 70 44 62 2d 3e 64 62 2c  _needed(pDb->db,
11030 20 70 44 62 2c 20 74 63 6c 43 6f 6c 6c 61 74 65   pDb, tclCollate
11040 4e 65 65 64 65 64 29 3b 0a 20 20 20 20 62 72 65  Needed);.    bre
11050 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20  ak;.  }..  /*   
11060 20 24 64 62 20 63 6f 6d 6d 69 74 5f 68 6f 6f 6b   $db commit_hook
11070 20 3f 43 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a   ?CALLBACK?.  **
11080 0a 20 20 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65  .  ** Invoke the
11090 20 67 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b 20   given callback 
110a0 6a 75 73 74 20 62 65 66 6f 72 65 20 63 6f 6d 6d  just before comm
110b0 69 74 74 69 6e 67 20 65 76 65 72 79 20 53 51 4c  itting every SQL
110c0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20   transaction..  
110d0 2a 2a 20 49 66 20 74 68 65 20 63 61 6c 6c 62 61  ** If the callba
110e0 63 6b 20 74 68 72 6f 77 73 20 61 6e 20 65 78 63  ck throws an exc
110f0 65 70 74 69 6f 6e 20 6f 72 20 72 65 74 75 72 6e  eption or return
11100 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
11110 20 74 68 65 0a 20 20 2a 2a 20 74 72 61 6e 73 61   the.  ** transa
11120 63 74 69 6f 6e 20 69 73 20 61 62 6f 72 74 65 64  ction is aborted
11130 2e 20 20 49 66 20 43 41 4c 4c 42 41 43 4b 20 69  .  If CALLBACK i
11140 73 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e  s an empty strin
11150 67 2c 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 0a  g, the callback.
11160 20 20 2a 2a 20 69 73 20 64 69 73 61 62 6c 65 64    ** is disabled
11170 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  ..  */.  case DB
11180 5f 43 4f 4d 4d 49 54 5f 48 4f 4f 4b 3a 20 7b 0a  _COMMIT_HOOK: {.
11190 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 33 20 29      if( objc>3 )
111a0 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e  {.      Tcl_Wron
111b0 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
111c0 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 43 41 4c 4c   2, objv, "?CALL
111d0 42 41 43 4b 3f 22 29 3b 0a 20 20 20 20 20 20 72  BACK?");.      r
111e0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
111f0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f  .    }else if( o
11200 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20  bjc==2 ){.      
11210 69 66 28 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74  if( pDb->zCommit
11220 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f   ){.        Tcl_
11230 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
11240 65 72 70 2c 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69  erp, pDb->zCommi
11250 74 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  t, (char*)0);.  
11260 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
11270 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
11280 72 20 2a 7a 43 6f 6d 6d 69 74 3b 0a 20 20 20 20  r *zCommit;.    
11290 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20    int len;.     
112a0 20 69 66 28 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69   if( pDb->zCommi
112b0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c  t ){.        Tcl
112c0 5f 46 72 65 65 28 70 44 62 2d 3e 7a 43 6f 6d 6d  _Free(pDb->zComm
112d0 69 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  it);.      }.   
112e0 20 20 20 7a 43 6f 6d 6d 69 74 20 3d 20 54 63 6c     zCommit = Tcl
112f0 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
11300 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29  j(objv[2], &len)
11310 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 43 6f 6d  ;.      if( zCom
11320 6d 69 74 20 26 26 20 6c 65 6e 3e 30 20 29 7b 0a  mit && len>0 ){.
11330 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 43 6f          pDb->zCo
11340 6d 6d 69 74 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63  mmit = Tcl_Alloc
11350 28 20 6c 65 6e 20 2b 20 31 20 29 3b 0a 20 20 20  ( len + 1 );.   
11360 20 20 20 20 20 6d 65 6d 63 70 79 28 70 44 62 2d       memcpy(pDb-
11370 3e 7a 43 6f 6d 6d 69 74 2c 20 7a 43 6f 6d 6d 69  >zCommit, zCommi
11380 74 2c 20 6c 65 6e 2b 31 29 3b 0a 20 20 20 20 20  t, len+1);.     
11390 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
113a0 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 20 3d 20 30  pDb->zCommit = 0
113b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
113c0 69 66 28 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74  if( pDb->zCommit
113d0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d   ){.        pDb-
113e0 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70  >interp = interp
113f0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
11400 33 5f 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 28 70 44  3_commit_hook(pD
11410 62 2d 3e 64 62 2c 20 44 62 43 6f 6d 6d 69 74 48  b->db, DbCommitH
11420 61 6e 64 6c 65 72 2c 20 70 44 62 29 3b 0a 20 20  andler, pDb);.  
11430 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
11440 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6d 6d 69     sqlite3_commi
11450 74 5f 68 6f 6f 6b 28 70 44 62 2d 3e 64 62 2c 20  t_hook(pDb->db, 
11460 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  0, 0);.      }. 
11470 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a     }.    break;.
11480 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62    }..  /*    $db
11490 20 63 6f 6d 70 6c 65 74 65 20 53 51 4c 0a 20 20   complete SQL.  
114a0 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 54  **.  ** Return T
114b0 52 55 45 20 69 66 20 53 51 4c 20 69 73 20 61 20  RUE if SQL is a 
114c0 63 6f 6d 70 6c 65 74 65 20 53 51 4c 20 73 74 61  complete SQL sta
114d0 74 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 20  tement.  Return 
114e0 46 41 4c 53 45 20 69 66 0a 20 20 2a 2a 20 61 64  FALSE if.  ** ad
114f0 64 69 74 69 6f 6e 61 6c 20 6c 69 6e 65 73 20 6f  ditional lines o
11500 66 20 69 6e 70 75 74 20 61 72 65 20 6e 65 65 64  f input are need
11510 65 64 2e 20 20 54 68 69 73 20 69 73 20 73 69 6d  ed.  This is sim
11520 69 6c 61 72 20 74 6f 20 74 68 65 0a 20 20 2a 2a  ilar to the.  **
11530 20 62 75 69 6c 74 2d 69 6e 20 22 69 6e 66 6f 20   built-in "info 
11540 63 6f 6d 70 6c 65 74 65 22 20 63 6f 6d 6d 61 6e  complete" comman
11550 64 20 6f 66 20 54 63 6c 2e 0a 20 20 2a 2f 0a 20  d of Tcl..  */. 
11560 20 63 61 73 65 20 44 42 5f 43 4f 4d 50 4c 45 54   case DB_COMPLET
11570 45 3a 20 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  E: {.#ifndef SQL
11580 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4c 45 54  ITE_OMIT_COMPLET
11590 45 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  E.    Tcl_Obj *p
115a0 52 65 73 75 6c 74 3b 0a 20 20 20 20 69 6e 74 20  Result;.    int 
115b0 69 73 43 6f 6d 70 6c 65 74 65 3b 0a 20 20 20 20  isComplete;.    
115c0 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20  if( objc!=3 ){. 
115d0 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
115e0 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
115f0 20 6f 62 6a 76 2c 20 22 53 51 4c 22 29 3b 0a 20   objv, "SQL");. 
11600 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
11610 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
11620 20 69 73 43 6f 6d 70 6c 65 74 65 20 3d 20 73 71   isComplete = sq
11630 6c 69 74 65 33 5f 63 6f 6d 70 6c 65 74 65 28 20  lite3_complete( 
11640 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
11650 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30 29  mObj(objv[2], 0)
11660 20 29 3b 0a 20 20 20 20 70 52 65 73 75 6c 74 20   );.    pResult 
11670 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75  = Tcl_GetObjResu
11680 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  lt(interp);.    
11690 54 63 6c 5f 53 65 74 42 6f 6f 6c 65 61 6e 4f 62  Tcl_SetBooleanOb
116a0 6a 28 70 52 65 73 75 6c 74 2c 20 69 73 43 6f 6d  j(pResult, isCom
116b0 70 6c 65 74 65 29 3b 0a 23 65 6e 64 69 66 0a 20  plete);.#endif. 
116c0 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
116d0 20 2f 2a 20 20 20 20 24 64 62 20 63 6f 70 79 20   /*    $db copy 
116e0 63 6f 6e 66 6c 69 63 74 2d 61 6c 67 6f 72 69 74  conflict-algorit
116f0 68 6d 20 74 61 62 6c 65 20 66 69 6c 65 6e 61 6d  hm table filenam
11700 65 20 3f 53 45 50 41 52 41 54 4f 52 3f 20 3f 4e  e ?SEPARATOR? ?N
11710 55 4c 4c 49 4e 44 49 43 41 54 4f 52 3f 0a 20 20  ULLINDICATOR?.  
11720 2a 2a 0a 20 20 2a 2a 20 43 6f 70 79 20 64 61 74  **.  ** Copy dat
11730 61 20 69 6e 74 6f 20 74 61 62 6c 65 20 66 72 6f  a into table fro
11740 6d 20 66 69 6c 65 6e 61 6d 65 2c 20 6f 70 74 69  m filename, opti
11750 6f 6e 61 6c 6c 79 20 75 73 69 6e 67 20 53 45 50  onally using SEP
11760 41 52 41 54 4f 52 0a 20 20 2a 2a 20 61 73 20 63  ARATOR.  ** as c
11770 6f 6c 75 6d 6e 20 73 65 70 61 72 61 74 6f 72 73  olumn separators
11780 2e 20 20 49 66 20 61 20 63 6f 6c 75 6d 6e 20 63  .  If a column c
11790 6f 6e 74 61 69 6e 73 20 61 20 6e 75 6c 6c 20 73  ontains a null s
117a0 74 72 69 6e 67 2c 20 6f 72 20 74 68 65 0a 20 20  tring, or the.  
117b0 2a 2a 20 76 61 6c 75 65 20 6f 66 20 4e 55 4c 4c  ** value of NULL
117c0 49 4e 44 49 43 41 54 4f 52 2c 20 61 20 4e 55 4c  INDICATOR, a NUL
117d0 4c 20 69 73 20 69 6e 73 65 72 74 65 64 20 66 6f  L is inserted fo
117e0 72 20 74 68 65 20 63 6f 6c 75 6d 6e 2e 0a 20 20  r the column..  
117f0 2a 2a 20 63 6f 6e 66 6c 69 63 74 2d 61 6c 67 6f  ** conflict-algo
11800 72 69 74 68 6d 20 69 73 20 6f 6e 65 20 6f 66 20  rithm is one of 
11810 74 68 65 20 73 71 6c 69 74 65 20 63 6f 6e 66 6c  the sqlite confl
11820 69 63 74 20 61 6c 67 6f 72 69 74 68 6d 73 3a 0a  ict algorithms:.
11830 20 20 2a 2a 20 20 20 20 72 6f 6c 6c 62 61 63 6b    **    rollback
11840 2c 20 61 62 6f 72 74 2c 20 66 61 69 6c 2c 20 69  , abort, fail, i
11850 67 6e 6f 72 65 2c 20 72 65 70 6c 61 63 65 0a 20  gnore, replace. 
11860 20 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c 20   ** On success, 
11870 72 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  return the numbe
11880 72 20 6f 66 20 6c 69 6e 65 73 20 70 72 6f 63 65  r of lines proce
11890 73 73 65 64 2c 20 6e 6f 74 20 6e 65 63 65 73 73  ssed, not necess
118a0 61 72 69 6c 79 20 73 61 6d 65 0a 20 20 2a 2a 20  arily same.  ** 
118b0 61 73 20 27 64 62 20 63 68 61 6e 67 65 73 27 20  as 'db changes' 
118c0 64 75 65 20 74 6f 20 63 6f 6e 66 6c 69 63 74 2d  due to conflict-
118d0 61 6c 67 6f 72 69 74 68 6d 20 73 65 6c 65 63 74  algorithm select
118e0 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  ed..  **.  ** Th
118f0 69 73 20 63 6f 64 65 20 69 73 20 62 61 73 69 63  is code is basic
11900 61 6c 6c 79 20 61 6e 20 69 6d 70 6c 65 6d 65 6e  ally an implemen
11910 74 61 74 69 6f 6e 2f 65 6e 68 61 6e 63 65 6d 65  tation/enhanceme
11920 6e 74 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 73  nt of.  ** the s
11930 71 6c 69 74 65 33 20 73 68 65 6c 6c 2e 63 20 22  qlite3 shell.c "
11940 2e 69 6d 70 6f 72 74 22 20 63 6f 6d 6d 61 6e 64  .import" command
11950 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73  ..  **.  ** This
11960 20 63 6f 6d 6d 61 6e 64 20 75 73 61 67 65 20 69   command usage i
11970 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20  s equivalent to 
11980 74 68 65 20 73 71 6c 69 74 65 32 2e 78 20 43 4f  the sqlite2.x CO
11990 50 59 20 73 74 61 74 65 6d 65 6e 74 2c 0a 20 20  PY statement,.  
119a0 2a 2a 20 77 68 69 63 68 20 69 6d 70 6f 72 74 73  ** which imports
119b0 20 66 69 6c 65 20 64 61 74 61 20 69 6e 74 6f 20   file data into 
119c0 61 20 74 61 62 6c 65 20 75 73 69 6e 67 20 74 68  a table using th
119d0 65 20 50 6f 73 74 67 72 65 53 51 4c 20 43 4f 50  e PostgreSQL COP
119e0 59 20 66 69 6c 65 20 66 6f 72 6d 61 74 3a 0a 20  Y file format:. 
119f0 20 2a 2a 20 20 20 24 64 62 20 63 6f 70 79 20 24   **   $db copy $
11a00 63 6f 6e 66 6c 69 74 5f 61 6c 67 6f 20 24 74 61  conflit_algo $ta
11a10 62 6c 65 5f 6e 61 6d 65 20 24 66 69 6c 65 6e 61  ble_name $filena
11a20 6d 65 20 5c 74 20 5c 5c 4e 0a 20 20 2a 2f 0a 20  me \t \\N.  */. 
11a30 20 63 61 73 65 20 44 42 5f 43 4f 50 59 3a 20 7b   case DB_COPY: {
11a40 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 61 62 6c  .    char *zTabl
11a50 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
11a60 20 2f 2a 20 49 6e 73 65 72 74 20 64 61 74 61 20   /* Insert data 
11a70 69 6e 74 6f 20 74 68 69 73 20 74 61 62 6c 65 20  into this table 
11a80 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 46 69  */.    char *zFi
11a90 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  le;             
11aa0 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 66     /* The file f
11ab0 72 6f 6d 20 77 68 69 63 68 20 74 6f 20 65 78 74  rom which to ext
11ac0 72 61 63 74 20 64 61 74 61 20 2a 2f 0a 20 20 20  ract data */.   
11ad0 20 63 68 61 72 20 2a 7a 43 6f 6e 66 6c 69 63 74   char *zConflict
11ae0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
11af0 54 68 65 20 63 6f 6e 66 6c 69 63 74 20 61 6c 67  The conflict alg
11b00 6f 72 69 74 68 6d 20 74 6f 20 75 73 65 20 2a 2f  orithm to use */
11b10 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  .    sqlite3_stm
11b20 74 20 2a 70 53 74 6d 74 3b 20 20 20 20 20 20 20  t *pStmt;       
11b30 20 2f 2a 20 41 20 73 74 61 74 65 6d 65 6e 74 20   /* A statement 
11b40 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b  */.    int nCol;
11b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11b60 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
11b70 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 74  columns in the t
11b80 61 62 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20  able */.    int 
11b90 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20 20 20  nByte;          
11ba0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
11bb0 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 61 6e  r of bytes in an
11bc0 20 53 51 4c 20 73 74 72 69 6e 67 20 2a 2f 0a 20   SQL string */. 
11bd0 20 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20     int i, j;    
11be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11bf0 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20  * Loop counters 
11c00 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53 65 70 3b  */.    int nSep;
11c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11c20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
11c30 62 79 74 65 73 20 69 6e 20 7a 53 65 70 5b 5d 20  bytes in zSep[] 
11c40 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 4e 75 6c 6c  */.    int nNull
11c50 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
11c60 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
11c70 62 79 74 65 73 20 69 6e 20 7a 4e 75 6c 6c 5b 5d  bytes in zNull[]
11c80 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 53   */.    char *zS
11c90 71 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ql;             
11ca0 20 20 20 20 2f 2a 20 41 6e 20 53 51 4c 20 73 74      /* An SQL st
11cb0 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 63  atement */.    c
11cc0 68 61 72 20 2a 7a 4c 69 6e 65 3b 20 20 20 20 20  har *zLine;     
11cd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
11ce0 73 69 6e 67 6c 65 20 6c 69 6e 65 20 6f 66 20 69  single line of i
11cf0 6e 70 75 74 20 66 72 6f 6d 20 74 68 65 20 66 69  nput from the fi
11d00 6c 65 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a  le */.    char *
11d10 2a 61 7a 43 6f 6c 3b 20 20 20 20 20 20 20 20 20  *azCol;         
11d20 20 20 20 20 20 20 2f 2a 20 7a 4c 69 6e 65 5b 5d        /* zLine[]
11d30 20 62 72 6f 6b 65 6e 20 75 70 20 69 6e 74 6f 20   broken up into 
11d40 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 63  columns */.    c
11d50 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6d 6d  onst char *zComm
11d60 69 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 48 6f  it;        /* Ho
11d70 77 20 74 6f 20 63 6f 6d 6d 69 74 20 63 68 61 6e  w to commit chan
11d80 67 65 73 20 2a 2f 0a 20 20 20 20 46 49 4c 45 20  ges */.    FILE 
11d90 2a 69 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  *in;            
11da0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e         /* The in
11db0 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20  put file */.    
11dc0 69 6e 74 20 6c 69 6e 65 6e 6f 20 3d 20 30 3b 20  int lineno = 0; 
11dd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
11de0 69 6e 65 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e  ine number of in
11df0 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20  put file */.    
11e00 63 68 61 72 20 7a 4c 69 6e 65 4e 75 6d 5b 38 30  char zLineNum[80
11e10 5d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c  ];          /* L
11e20 69 6e 65 20 6e 75 6d 62 65 72 20 70 72 69 6e 74  ine number print
11e30 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 20 20 54   buffer */.    T
11e40 63 6c 5f 4f 62 6a 20 2a 70 52 65 73 75 6c 74 3b  cl_Obj *pResult;
11e50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 6e             /* in
11e60 74 65 72 70 20 72 65 73 75 6c 74 20 2a 2f 0a 0a  terp result */..
11e70 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
11e80 7a 53 65 70 3b 0a 20 20 20 20 63 6f 6e 73 74 20  zSep;.    const 
11e90 63 68 61 72 20 2a 7a 4e 75 6c 6c 3b 0a 20 20 20  char *zNull;.   
11ea0 20 69 66 28 20 6f 62 6a 63 3c 35 20 7c 7c 20 6f   if( objc<5 || o
11eb0 62 6a 63 3e 37 20 29 7b 0a 20 20 20 20 20 20 54  bjc>7 ){.      T
11ec0 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
11ed0 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c  interp, 2, objv,
11ee0 0a 20 20 20 20 20 20 20 20 20 22 43 4f 4e 46 4c  .         "CONFL
11ef0 49 43 54 2d 41 4c 47 4f 52 49 54 48 4d 20 54 41  ICT-ALGORITHM TA
11f00 42 4c 45 20 46 49 4c 45 4e 41 4d 45 20 3f 53 45  BLE FILENAME ?SE
11f10 50 41 52 41 54 4f 52 3f 20 3f 4e 55 4c 4c 49 4e  PARATOR? ?NULLIN
11f20 44 49 43 41 54 4f 52 3f 22 29 3b 0a 20 20 20 20  DICATOR?");.    
11f30 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
11f40 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  OR;.    }.    if
11f50 28 20 6f 62 6a 63 3e 3d 36 20 29 7b 0a 20 20 20  ( objc>=6 ){.   
11f60 20 20 20 7a 53 65 70 20 3d 20 54 63 6c 5f 47 65     zSep = Tcl_Ge
11f70 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
11f80 62 6a 76 5b 35 5d 2c 20 30 29 3b 0a 20 20 20 20  bjv[5], 0);.    
11f90 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 53 65  }else{.      zSe
11fa0 70 20 3d 20 22 5c 74 22 3b 0a 20 20 20 20 7d 0a  p = "\t";.    }.
11fb0 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 3d 37 20      if( objc>=7 
11fc0 29 7b 0a 20 20 20 20 20 20 7a 4e 75 6c 6c 20 3d  ){.      zNull =
11fd0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
11fe0 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 36 5d 2c 20 30  omObj(objv[6], 0
11ff0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
12000 20 20 20 20 7a 4e 75 6c 6c 20 3d 20 22 22 3b 0a      zNull = "";.
12010 20 20 20 20 7d 0a 20 20 20 20 7a 43 6f 6e 66 6c      }.    zConfl
12020 69 63 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  ict = Tcl_GetStr
12030 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
12040 32 5d 2c 20 30 29 3b 0a 20 20 20 20 7a 54 61 62  2], 0);.    zTab
12050 6c 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  le = Tcl_GetStri
12060 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33  ngFromObj(objv[3
12070 5d 2c 20 30 29 3b 0a 20 20 20 20 7a 46 69 6c 65  ], 0);.    zFile
12080 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
12090 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 34 5d 2c  FromObj(objv[4],
120a0 20 30 29 3b 0a 20 20 20 20 6e 53 65 70 20 3d 20   0);.    nSep = 
120b0 73 74 72 6c 65 6e 33 30 28 7a 53 65 70 29 3b 0a  strlen30(zSep);.
120c0 20 20 20 20 6e 4e 75 6c 6c 20 3d 20 73 74 72 6c      nNull = strl
120d0 65 6e 33 30 28 7a 4e 75 6c 6c 29 3b 0a 20 20 20  en30(zNull);.   
120e0 20 69 66 28 20 6e 53 65 70 3d 3d 30 20 29 7b 0a   if( nSep==0 ){.
120f0 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
12100 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 45  Result(interp,"E
12110 72 72 6f 72 3a 20 6e 6f 6e 2d 6e 75 6c 6c 20 73  rror: non-null s
12120 65 70 61 72 61 74 6f 72 20 72 65 71 75 69 72 65  eparator require
12130 64 20 66 6f 72 20 63 6f 70 79 22 2c 0a 20 20 20  d for copy",.   
12140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12150 20 20 20 20 28 63 68 61 72 2a 29 30 29 3b 0a 20      (char*)0);. 
12160 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
12170 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
12180 20 69 66 28 73 74 72 63 6d 70 28 7a 43 6f 6e 66   if(strcmp(zConf
12190 6c 69 63 74 2c 20 22 72 6f 6c 6c 62 61 63 6b 22  lict, "rollback"
121a0 29 20 21 3d 20 30 20 26 26 0a 20 20 20 20 20 20  ) != 0 &&.      
121b0 20 73 74 72 63 6d 70 28 7a 43 6f 6e 66 6c 69 63   strcmp(zConflic
121c0 74 2c 20 22 61 62 6f 72 74 22 20 20 20 29 20 21  t, "abort"   ) !
121d0 3d 20 30 20 26 26 0a 20 20 20 20 20 20 20 73 74  = 0 &&.       st
121e0 72 63 6d 70 28 7a 43 6f 6e 66 6c 69 63 74 2c 20  rcmp(zConflict, 
121f0 22 66 61 69 6c 22 20 20 20 20 29 20 21 3d 20 30  "fail"    ) != 0
12200 20 26 26 0a 20 20 20 20 20 20 20 73 74 72 63 6d   &&.       strcm
12210 70 28 7a 43 6f 6e 66 6c 69 63 74 2c 20 22 69 67  p(zConflict, "ig
12220 6e 6f 72 65 22 20 20 29 20 21 3d 20 30 20 26 26  nore"  ) != 0 &&
12230 0a 20 20 20 20 20 20 20 73 74 72 63 6d 70 28 7a  .       strcmp(z
12240 43 6f 6e 66 6c 69 63 74 2c 20 22 72 65 70 6c 61  Conflict, "repla
12250 63 65 22 20 29 20 21 3d 20 30 20 29 20 7b 0a 20  ce" ) != 0 ) {. 
12260 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
12270 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 45  esult(interp, "E
12280 72 72 6f 72 3a 20 5c 22 22 2c 20 7a 43 6f 6e 66  rror: \"", zConf
12290 6c 69 63 74 2c 0a 20 20 20 20 20 20 20 20 20 20  lict,.          
122a0 20 20 22 5c 22 2c 20 63 6f 6e 66 6c 69 63 74 2d    "\", conflict-
122b0 61 6c 67 6f 72 69 74 68 6d 20 6d 75 73 74 20 62  algorithm must b
122c0 65 20 6f 6e 65 20 6f 66 3a 20 72 6f 6c 6c 62 61  e one of: rollba
122d0 63 6b 2c 20 22 0a 20 20 20 20 20 20 20 20 20 20  ck, ".          
122e0 20 20 22 61 62 6f 72 74 2c 20 66 61 69 6c 2c 20    "abort, fail, 
122f0 69 67 6e 6f 72 65 2c 20 6f 72 20 72 65 70 6c 61  ignore, or repla
12300 63 65 22 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  ce", (char*)0);.
12310 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
12320 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
12330 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33    zSql = sqlite3
12340 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c 45 43 54  _mprintf("SELECT
12350 20 2a 20 46 52 4f 4d 20 27 25 71 27 22 2c 20 7a   * FROM '%q'", z
12360 54 61 62 6c 65 29 3b 0a 20 20 20 20 69 66 28 20  Table);.    if( 
12370 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20  zSql==0 ){.     
12380 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
12390 74 28 69 6e 74 65 72 70 2c 20 22 45 72 72 6f 72  t(interp, "Error
123a0 3a 20 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 3a  : no such table:
123b0 20 22 2c 20 7a 54 61 62 6c 65 2c 20 28 63 68 61   ", zTable, (cha
123c0 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 72 65 74  r*)0);.      ret
123d0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
123e0 20 20 20 7d 0a 20 20 20 20 6e 42 79 74 65 20 3d     }.    nByte =
123f0 20 73 74 72 6c 65 6e 33 30 28 7a 53 71 6c 29 3b   strlen30(zSql);
12400 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
12410 33 5f 70 72 65 70 61 72 65 28 70 44 62 2d 3e 64  3_prepare(pDb->d
12420 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53  b, zSql, -1, &pS
12430 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  tmt, 0);.    sql
12440 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b  ite3_free(zSql);
12450 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
12460 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
12470 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 45  esult(interp, "E
12480 72 72 6f 72 3a 20 22 2c 20 73 71 6c 69 74 65 33  rror: ", sqlite3
12490 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62 29  _errmsg(pDb->db)
124a0 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20  , (char*)0);.   
124b0 20 20 20 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20     nCol = 0;.   
124c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 43   }else{.      nC
124d0 6f 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  ol = sqlite3_col
124e0 75 6d 6e 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29  umn_count(pStmt)
124f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
12500 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
12510 6d 74 29 3b 0a 20 20 20 20 69 66 28 20 6e 43 6f  mt);.    if( nCo
12520 6c 3d 3d 30 20 29 20 7b 0a 20 20 20 20 20 20 72  l==0 ) {.      r
12530 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
12540 0a 20 20 20 20 7d 0a 20 20 20 20 7a 53 71 6c 20  .    }.    zSql 
12550 3d 20 6d 61 6c 6c 6f 63 28 20 6e 42 79 74 65 20  = malloc( nByte 
12560 2b 20 35 30 20 2b 20 6e 43 6f 6c 2a 32 20 29 3b  + 50 + nCol*2 );
12570 0a 20 20 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30  .    if( zSql==0
12580 20 29 20 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41   ) {.      Tcl_A
12590 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
125a0 72 70 2c 20 22 45 72 72 6f 72 3a 20 63 61 6e 27  rp, "Error: can'
125b0 74 20 6d 61 6c 6c 6f 63 28 29 22 2c 20 28 63 68  t malloc()", (ch
125c0 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 72 65  ar*)0);.      re
125d0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
125e0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
125f0 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 79 74 65  3_snprintf(nByte
12600 2b 35 30 2c 20 7a 53 71 6c 2c 20 22 49 4e 53 45  +50, zSql, "INSE
12610 52 54 20 4f 52 20 25 71 20 49 4e 54 4f 20 27 25  RT OR %q INTO '%
12620 71 27 20 56 41 4c 55 45 53 28 3f 22 2c 0a 20 20  q' VALUES(?",.  
12630 20 20 20 20 20 20 20 7a 43 6f 6e 66 6c 69 63 74         zConflict
12640 2c 20 7a 54 61 62 6c 65 29 3b 0a 20 20 20 20 6a  , zTable);.    j
12650 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 53 71 6c   = strlen30(zSql
12660 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20  );.    for(i=1; 
12670 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  i<nCol; i++){.  
12680 20 20 20 20 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d 20      zSql[j++] = 
12690 27 2c 27 3b 0a 20 20 20 20 20 20 7a 53 71 6c 5b  ',';.      zSql[
126a0 6a 2b 2b 5d 20 3d 20 27 3f 27 3b 0a 20 20 20 20  j++] = '?';.    
126b0 7d 0a 20 20 20 20 7a 53 71 6c 5b 6a 2b 2b 5d 20  }.    zSql[j++] 
126c0 3d 20 27 29 27 3b 0a 20 20 20 20 7a 53 71 6c 5b  = ')';.    zSql[
126d0 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d  j] = 0;.    rc =
126e0 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
126f0 28 70 44 62 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20  (pDb->db, zSql, 
12700 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a  -1, &pStmt, 0);.
12710 20 20 20 20 66 72 65 65 28 7a 53 71 6c 29 3b 0a      free(zSql);.
12720 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
12730 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
12740 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 45 72  sult(interp, "Er
12750 72 6f 72 3a 20 22 2c 20 73 71 6c 69 74 65 33 5f  ror: ", sqlite3_
12760 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c  errmsg(pDb->db),
12770 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20   (char*)0);.    
12780 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
12790 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20  ze(pStmt);.     
127a0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
127b0 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 6e 20  R;.    }.    in 
127c0 3d 20 66 6f 70 65 6e 28 7a 46 69 6c 65 2c 20 22  = fopen(zFile, "
127d0 72 62 22 29 3b 0a 20 20 20 20 69 66 28 20 69 6e  rb");.    if( in
127e0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  ==0 ){.      Tcl
127f0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
12800 74 65 72 70 2c 20 22 45 72 72 6f 72 3a 20 63 61  terp, "Error: ca
12810 6e 6e 6f 74 20 6f 70 65 6e 20 66 69 6c 65 3a 20  nnot open file: 
12820 22 2c 20 7a 46 69 6c 65 2c 20 28 63 68 61 72 2a  ", zFile, (char*
12830 29 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  )0);.      sqlit
12840 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
12850 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  t);.      return
12860 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
12870 7d 0a 20 20 20 20 61 7a 43 6f 6c 20 3d 20 6d 61  }.    azCol = ma
12880 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 61 7a 43  lloc( sizeof(azC
12890 6f 6c 5b 30 5d 29 2a 28 6e 43 6f 6c 2b 31 29 20  ol[0])*(nCol+1) 
128a0 29 3b 0a 20 20 20 20 69 66 28 20 61 7a 43 6f 6c  );.    if( azCol
128b0 3d 3d 30 20 29 20 7b 0a 20 20 20 20 20 20 54 63  ==0 ) {.      Tc
128c0 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
128d0 6e 74 65 72 70 2c 20 22 45 72 72 6f 72 3a 20 63  nterp, "Error: c
128e0 61 6e 27 74 20 6d 61 6c 6c 6f 63 28 29 22 2c 20  an't malloc()", 
128f0 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20  (char*)0);.     
12900 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 20   fclose(in);.   
12910 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
12920 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 28  ROR;.    }.    (
12930 76 6f 69 64 29 73 71 6c 69 74 65 33 5f 65 78 65  void)sqlite3_exe
12940 63 28 70 44 62 2d 3e 64 62 2c 20 22 42 45 47 49  c(pDb->db, "BEGI
12950 4e 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  N", 0, 0, 0);.  
12960 20 20 7a 43 6f 6d 6d 69 74 20 3d 20 22 43 4f 4d    zCommit = "COM
12970 4d 49 54 22 3b 0a 20 20 20 20 77 68 69 6c 65 28  MIT";.    while(
12980 20 28 7a 4c 69 6e 65 20 3d 20 6c 6f 63 61 6c 5f   (zLine = local_
12990 67 65 74 6c 69 6e 65 28 30 2c 20 69 6e 29 29 21  getline(0, in))!
129a0 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72  =0 ){.      char
129b0 20 2a 7a 3b 0a 20 20 20 20 20 20 6c 69 6e 65 6e   *z;.      linen
129c0 6f 2b 2b 3b 0a 20 20 20 20 20 20 61 7a 43 6f 6c  o++;.      azCol
129d0 5b 30 5d 20 3d 20 7a 4c 69 6e 65 3b 0a 20 20 20  [0] = zLine;.   
129e0 20 20 20 66 6f 72 28 69 3d 30 2c 20 7a 3d 7a 4c     for(i=0, z=zL
129f0 69 6e 65 3b 20 2a 7a 3b 20 7a 2b 2b 29 7b 0a 20  ine; *z; z++){. 
12a00 20 20 20 20 20 20 20 69 66 28 20 2a 7a 3d 3d 7a         if( *z==z
12a10 53 65 70 5b 30 5d 20 26 26 20 73 74 72 6e 63 6d  Sep[0] && strncm
12a20 70 28 7a 2c 20 7a 53 65 70 2c 20 6e 53 65 70 29  p(z, zSep, nSep)
12a30 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
12a40 20 2a 7a 20 3d 20 30 3b 0a 20 20 20 20 20 20 20   *z = 0;.       
12a50 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20 20     i++;.        
12a60 20 20 69 66 28 20 69 3c 6e 43 6f 6c 20 29 7b 0a    if( i<nCol ){.
12a70 20 20 20 20 20 20 20 20 20 20 20 20 61 7a 43 6f              azCo
12a80 6c 5b 69 5d 20 3d 20 26 7a 5b 6e 53 65 70 5d 3b  l[i] = &z[nSep];
12a90 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 20 2b  .            z +
12aa0 3d 20 6e 53 65 70 2d 31 3b 0a 20 20 20 20 20 20  = nSep-1;.      
12ab0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
12ac0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
12ad0 28 20 69 2b 31 21 3d 6e 43 6f 6c 20 29 7b 0a 20  ( i+1!=nCol ){. 
12ae0 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 45 72         char *zEr
12af0 72 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  r;.        int n
12b00 45 72 72 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a  Err = strlen30(z
12b10 46 69 6c 65 29 20 2b 20 32 30 30 3b 0a 20 20 20  File) + 200;.   
12b20 20 20 20 20 20 7a 45 72 72 20 3d 20 6d 61 6c 6c       zErr = mall
12b30 6f 63 28 6e 45 72 72 29 3b 0a 20 20 20 20 20 20  oc(nErr);.      
12b40 20 20 69 66 28 20 7a 45 72 72 20 29 7b 0a 20 20    if( zErr ){.  
12b50 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
12b60 73 6e 70 72 69 6e 74 66 28 6e 45 72 72 2c 20 7a  snprintf(nErr, z
12b70 45 72 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Err,.           
12b80 20 20 22 45 72 72 6f 72 3a 20 25 73 20 6c 69 6e    "Error: %s lin
12b90 65 20 25 64 3a 20 65 78 70 65 63 74 65 64 20 25  e %d: expected %
12ba0 64 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 64 61 74  d columns of dat
12bb0 61 20 62 75 74 20 66 6f 75 6e 64 20 25 64 22 2c  a but found %d",
12bc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 46  .             zF
12bd0 69 6c 65 2c 20 6c 69 6e 65 6e 6f 2c 20 6e 43 6f  ile, lineno, nCo
12be0 6c 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20 20 20  l, i+1);.       
12bf0 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
12c00 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 45 72 72  ult(interp, zErr
12c10 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20  , (char*)0);.   
12c20 20 20 20 20 20 20 20 66 72 65 65 28 7a 45 72 72         free(zErr
12c30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
12c40 20 20 20 20 20 7a 43 6f 6d 6d 69 74 20 3d 20 22       zCommit = "
12c50 52 4f 4c 4c 42 41 43 4b 22 3b 0a 20 20 20 20 20  ROLLBACK";.     
12c60 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
12c70 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  }.      for(i=0;
12c80 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20   i<nCol; i++){. 
12c90 20 20 20 20 20 20 20 2f 2a 20 63 68 65 63 6b 20         /* check 
12ca0 66 6f 72 20 6e 75 6c 6c 20 64 61 74 61 2c 20 69  for null data, i
12cb0 66 20 73 6f 2c 20 62 69 6e 64 20 61 73 20 6e 75  f so, bind as nu
12cc0 6c 6c 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66  ll */.        if
12cd0 28 20 28 6e 4e 75 6c 6c 3e 30 20 26 26 20 73 74  ( (nNull>0 && st
12ce0 72 63 6d 70 28 61 7a 43 6f 6c 5b 69 5d 2c 20 7a  rcmp(azCol[i], z
12cf0 4e 75 6c 6c 29 3d 3d 30 29 0a 20 20 20 20 20 20  Null)==0).      
12d00 20 20 20 20 7c 7c 20 73 74 72 6c 65 6e 33 30 28      || strlen30(
12d10 61 7a 43 6f 6c 5b 69 5d 29 3d 3d 30 0a 20 20 20  azCol[i])==0.   
12d20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
12d30 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e    sqlite3_bind_n
12d40 75 6c 6c 28 70 53 74 6d 74 2c 20 69 2b 31 29 3b  ull(pStmt, i+1);
12d50 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
12d60 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
12d70 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 53 74 6d  3_bind_text(pStm
12d80 74 2c 20 69 2b 31 2c 20 61 7a 43 6f 6c 5b 69 5d  t, i+1, azCol[i]
12d90 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54 41  , -1, SQLITE_STA
12da0 54 49 43 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  TIC);.        }.
12db0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
12dc0 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74  lite3_step(pStmt
12dd0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
12de0 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53 74 6d  lite3_reset(pStm
12df0 74 29 3b 0a 20 20 20 20 20 20 66 72 65 65 28 7a  t);.      free(z
12e00 4c 69 6e 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Line);.      if(
12e10 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
12e20 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70  {.        Tcl_Ap
12e30 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
12e40 70 2c 22 45 72 72 6f 72 3a 20 22 2c 20 73 71 6c  p,"Error: ", sql
12e50 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d  ite3_errmsg(pDb-
12e60 3e 64 62 29 2c 20 28 63 68 61 72 2a 29 30 29 3b  >db), (char*)0);
12e70 0a 20 20 20 20 20 20 20 20 7a 43 6f 6d 6d 69 74  .        zCommit
12e80 20 3d 20 22 52 4f 4c 4c 42 41 43 4b 22 3b 0a 20   = "ROLLBACK";. 
12e90 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
12ea0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
12eb0 66 72 65 65 28 61 7a 43 6f 6c 29 3b 0a 20 20 20  free(azCol);.   
12ec0 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 20   fclose(in);.   
12ed0 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
12ee0 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 28 76  e(pStmt);.    (v
12ef0 6f 69 64 29 73 71 6c 69 74 65 33 5f 65 78 65 63  oid)sqlite3_exec
12f00 28 70 44 62 2d 3e 64 62 2c 20 7a 43 6f 6d 6d 69  (pDb->db, zCommi
12f10 74 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 0a 20 20  t, 0, 0, 0);..  
12f20 20 20 69 66 28 20 7a 43 6f 6d 6d 69 74 5b 30 5d    if( zCommit[0]
12f30 20 3d 3d 20 27 43 27 20 29 7b 0a 20 20 20 20 20   == 'C' ){.     
12f40 20 2f 2a 20 73 75 63 63 65 73 73 2c 20 73 65 74   /* success, set
12f50 20 72 65 73 75 6c 74 20 61 73 20 6e 75 6d 62 65   result as numbe
12f60 72 20 6f 66 20 6c 69 6e 65 73 20 70 72 6f 63 65  r of lines proce
12f70 73 73 65 64 20 2a 2f 0a 20 20 20 20 20 20 70 52  ssed */.      pR
12f80 65 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65 74 4f  esult = Tcl_GetO
12f90 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29  bjResult(interp)
12fa0 3b 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74 49  ;.      Tcl_SetI
12fb0 6e 74 4f 62 6a 28 70 52 65 73 75 6c 74 2c 20 6c  ntObj(pResult, l
12fc0 69 6e 65 6e 6f 29 3b 0a 20 20 20 20 20 20 72 63  ineno);.      rc
12fd0 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d   = TCL_OK;.    }
12fe0 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 66  else{.      /* f
12ff0 61 69 6c 75 72 65 2c 20 61 70 70 65 6e 64 20 6c  ailure, append l
13000 69 6e 65 6e 6f 20 77 68 65 72 65 20 66 61 69 6c  ineno where fail
13010 65 64 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  ed */.      sqli
13020 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
13030 65 6f 66 28 7a 4c 69 6e 65 4e 75 6d 29 2c 20 7a  eof(zLineNum), z
13040 4c 69 6e 65 4e 75 6d 2c 22 25 64 22 2c 6c 69 6e  LineNum,"%d",lin
13050 65 6e 6f 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f  eno);.      Tcl_
13060 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
13070 65 72 70 2c 22 2c 20 66 61 69 6c 65 64 20 77 68  erp,", failed wh
13080 69 6c 65 20 70 72 6f 63 65 73 73 69 6e 67 20 6c  ile processing l
13090 69 6e 65 3a 20 22 2c 7a 4c 69 6e 65 4e 75 6d 2c  ine: ",zLineNum,
130a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
130b0 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 30          (char*)0
130c0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 54 43  );.      rc = TC
130d0 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
130e0 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
130f0 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 24 64 62 20   /*.  **    $db 
13100 65 6e 61 62 6c 65 5f 6c 6f 61 64 5f 65 78 74 65  enable_load_exte
13110 6e 73 69 6f 6e 20 42 4f 4f 4c 45 41 4e 0a 20 20  nsion BOOLEAN.  
13120 2a 2a 0a 20 20 2a 2a 20 54 75 72 6e 20 74 68 65  **.  ** Turn the
13130 20 65 78 74 65 6e 73 69 6f 6e 20 6c 6f 61 64 69   extension loadi
13140 6e 67 20 66 65 61 74 75 72 65 20 6f 6e 20 6f 72  ng feature on or
13150 20 6f 66 66 2e 20 20 49 74 20 69 66 20 6f 66 66   off.  It if off
13160 20 62 79 0a 20 20 2a 2a 20 64 65 66 61 75 6c 74   by.  ** default
13170 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  ..  */.  case DB
13180 5f 45 4e 41 42 4c 45 5f 4c 4f 41 44 5f 45 58 54  _ENABLE_LOAD_EXT
13190 45 4e 53 49 4f 4e 3a 20 7b 0a 23 69 66 6e 64 65  ENSION: {.#ifnde
131a0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f  f SQLITE_OMIT_LO
131b0 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 20 20 20  AD_EXTENSION.   
131c0 20 69 6e 74 20 6f 6e 6f 66 66 3b 0a 20 20 20 20   int onoff;.    
131d0 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20  if( objc!=3 ){. 
131e0 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
131f0 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
13200 20 6f 62 6a 76 2c 20 22 42 4f 4f 4c 45 41 4e 22   objv, "BOOLEAN"
13210 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
13220 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
13230 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74  .    if( Tcl_Get
13240 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69  BooleanFromObj(i
13250 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20  nterp, objv[2], 
13260 26 6f 6e 6f 66 66 29 20 29 7b 0a 20 20 20 20 20  &onoff) ){.     
13270 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
13280 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  R;.    }.    sql
13290 69 74 65 33 5f 65 6e 61 62 6c 65 5f 6c 6f 61 64  ite3_enable_load
132a0 5f 65 78 74 65 6e 73 69 6f 6e 28 70 44 62 2d 3e  _extension(pDb->
132b0 64 62 2c 20 6f 6e 6f 66 66 29 3b 0a 20 20 20 20  db, onoff);.    
132c0 62 72 65 61 6b 3b 0a 23 65 6c 73 65 0a 20 20 20  break;.#else.   
132d0 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
132e0 74 28 69 6e 74 65 72 70 2c 20 22 65 78 74 65 6e  t(interp, "exten
132f0 73 69 6f 6e 20 6c 6f 61 64 69 6e 67 20 69 73 20  sion loading is 
13300 74 75 72 6e 65 64 20 6f 66 66 20 61 74 20 63 6f  turned off at co
13310 6d 70 69 6c 65 2d 74 69 6d 65 22 2c 0a 20 20 20  mpile-time",.   
13320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13330 20 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20    (char*)0);.   
13340 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
13350 52 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20  R;.#endif.  }.. 
13360 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 24 64 62 20   /*.  **    $db 
13370 65 72 72 6f 72 63 6f 64 65 0a 20 20 2a 2a 0a 20  errorcode.  **. 
13380 20 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e   ** Return the n
13390 75 6d 65 72 69 63 20 65 72 72 6f 72 20 63 6f 64  umeric error cod
133a0 65 20 74 68 61 74 20 77 61 73 20 72 65 74 75 72  e that was retur
133b0 6e 65 64 20 62 79 20 74 68 65 20 6d 6f 73 74 20  ned by the most 
133c0 72 65 63 65 6e 74 0a 20 20 2a 2a 20 63 61 6c 6c  recent.  ** call
133d0 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 78 65 63   to sqlite3_exec
133e0 28 29 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  ()..  */.  case 
133f0 44 42 5f 45 52 52 4f 52 43 4f 44 45 3a 20 7b 0a  DB_ERRORCODE: {.
13400 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65      Tcl_SetObjRe
13410 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
13420 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74  _NewIntObj(sqlit
13430 65 33 5f 65 72 72 63 6f 64 65 28 70 44 62 2d 3e  e3_errcode(pDb->
13440 64 62 29 29 29 3b 0a 20 20 20 20 62 72 65 61 6b  db)));.    break
13450 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ;.  }..  /*.  **
13460 20 20 20 20 24 64 62 20 65 78 69 73 74 73 20 24      $db exists $
13470 73 71 6c 0a 20 20 2a 2a 20 20 20 20 24 64 62 20  sql.  **    $db 
13480 6f 6e 65 63 6f 6c 75 6d 6e 20 24 73 71 6c 0a 20  onecolumn $sql. 
13490 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6f 6e 65   **.  ** The one
134a0 63 6f 6c 75 6d 6e 20 6d 65 74 68 6f 64 20 69 73  column method is
134b0 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e 74 20   the equivalent 
134c0 6f 66 3a 0a 20 20 2a 2a 20 20 20 20 20 6c 69 6e  of:.  **     lin
134d0 64 65 78 20 5b 24 64 62 20 65 76 61 6c 20 24 73  dex [$db eval $s
134e0 71 6c 5d 20 30 0a 20 20 2a 2f 0a 20 20 63 61 73  ql] 0.  */.  cas
134f0 65 20 44 42 5f 45 58 49 53 54 53 3a 0a 20 20 63  e DB_EXISTS:.  c
13500 61 73 65 20 44 42 5f 4f 4e 45 43 4f 4c 55 4d 4e  ase DB_ONECOLUMN
13510 3a 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20  : {.    Tcl_Obj 
13520 2a 70 52 65 73 75 6c 74 20 3d 20 30 3b 0a 20 20  *pResult = 0;.  
13530 20 20 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 20    DbEvalContext 
13540 73 45 76 61 6c 3b 0a 20 20 20 20 69 66 28 20 6f  sEval;.    if( o
13550 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20  bjc!=3 ){.      
13560 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
13570 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76  (interp, 2, objv
13580 2c 20 22 53 51 4c 22 29 3b 0a 20 20 20 20 20 20  , "SQL");.      
13590 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
135a0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 62 45  ;.    }..    dbE
135b0 76 61 6c 49 6e 69 74 28 26 73 45 76 61 6c 2c 20  valInit(&sEval, 
135c0 70 44 62 2c 20 6f 62 6a 76 5b 32 5d 2c 20 30 2c  pDb, objv[2], 0,
135d0 20 30 29 3b 0a 20 20 20 20 72 63 20 3d 20 64 62   0);.    rc = db
135e0 45 76 61 6c 53 74 65 70 28 26 73 45 76 61 6c 29  EvalStep(&sEval)
135f0 3b 0a 20 20 20 20 69 66 28 20 63 68 6f 69 63 65  ;.    if( choice
13600 3d 3d 44 42 5f 4f 4e 45 43 4f 4c 55 4d 4e 20 29  ==DB_ONECOLUMN )
13610 7b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  {.      if( rc==
13620 54 43 4c 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  TCL_OK ){.      
13630 20 20 70 52 65 73 75 6c 74 20 3d 20 64 62 45 76    pResult = dbEv
13640 61 6c 43 6f 6c 75 6d 6e 56 61 6c 75 65 28 26 73  alColumnValue(&s
13650 45 76 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20  Eval, 0);.      
13660 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 54 43  }else if( rc==TC
13670 4c 5f 42 52 45 41 4b 20 29 7b 0a 20 20 20 20 20  L_BREAK ){.     
13680 20 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73 75     Tcl_ResetResu
13690 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  lt(interp);.    
136a0 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66    }.    }else if
136b0 28 20 72 63 3d 3d 54 43 4c 5f 42 52 45 41 4b 20  ( rc==TCL_BREAK 
136c0 7c 7c 20 72 63 3d 3d 54 43 4c 5f 4f 4b 20 29 7b  || rc==TCL_OK ){
136d0 0a 20 20 20 20 20 20 70 52 65 73 75 6c 74 20 3d  .      pResult =
136e0 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f   Tcl_NewBooleanO
136f0 62 6a 28 72 63 3d 3d 54 43 4c 5f 4f 4b 29 3b 0a  bj(rc==TCL_OK);.
13700 20 20 20 20 7d 0a 20 20 20 20 64 62 45 76 61 6c      }.    dbEval
13710 46 69 6e 61 6c 69 7a 65 28 26 73 45 76 61 6c 29  Finalize(&sEval)
13720 3b 0a 20 20 20 20 69 66 28 20 70 52 65 73 75 6c  ;.    if( pResul
13730 74 20 29 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65  t ) Tcl_SetObjRe
13740 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 52 65  sult(interp, pRe
13750 73 75 6c 74 29 3b 0a 0a 20 20 20 20 69 66 28 20  sult);..    if( 
13760 72 63 3d 3d 54 43 4c 5f 42 52 45 41 4b 20 29 7b  rc==TCL_BREAK ){
13770 0a 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f  .      rc = TCL_
13780 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 72  OK;.    }.    br
13790 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  eak;.  }..  /*. 
137a0 20 2a 2a 20 20 20 20 24 64 62 20 65 76 61 6c 20   **    $db eval 
137b0 3f 6f 70 74 69 6f 6e 73 3f 20 24 73 71 6c 20 3f  ?options? $sql ?
137c0 61 72 72 61 79 3f 20 3f 7b 20 20 2e 2e 2e 63 6f  array? ?{  ...co
137d0 64 65 2e 2e 2e 20 7d 3f 0a 20 20 2a 2a 0a 20 20  de... }?.  **.  
137e0 2a 2a 20 54 68 65 20 53 51 4c 20 73 74 61 74 65  ** The SQL state
137f0 6d 65 6e 74 20 69 6e 20 24 73 71 6c 20 69 73 20  ment in $sql is 
13800 65 76 61 6c 75 61 74 65 64 2e 20 20 46 6f 72 20  evaluated.  For 
13810 65 61 63 68 20 72 6f 77 2c 20 74 68 65 20 76 61  each row, the va
13820 6c 75 65 73 20 61 72 65 0a 20 20 2a 2a 20 70 6c  lues are.  ** pl
13830 61 63 65 64 20 69 6e 20 65 6c 65 6d 65 6e 74 73  aced in elements
13840 20 6f 66 20 74 68 65 20 61 72 72 61 79 20 6e 61   of the array na
13850 6d 65 64 20 22 61 72 72 61 79 22 20 61 6e 64 20  med "array" and 
13860 2e 2e 2e 63 6f 64 65 2e 2e 2e 20 69 73 20 65 78  ...code... is ex
13870 65 63 75 74 65 64 2e 0a 20 20 2a 2a 20 49 66 20  ecuted..  ** If 
13880 22 61 72 72 61 79 22 20 61 6e 64 20 22 63 6f 64  "array" and "cod
13890 65 22 20 61 72 65 20 6f 6d 69 74 74 65 64 2c 20  e" are omitted, 
138a0 74 68 65 6e 20 6e 6f 20 63 61 6c 6c 62 61 63 6b  then no callback
138b0 20 69 73 20 65 76 65 72 79 20 69 6e 76 6f 6b 65   is every invoke
138c0 64 2e 0a 20 20 2a 2a 20 49 66 20 22 61 72 72 61  d..  ** If "arra
138d0 79 22 20 69 73 20 61 6e 20 65 6d 70 74 79 20 73  y" is an empty s
138e0 74 72 69 6e 67 2c 20 74 68 65 6e 20 74 68 65 20  tring, then the 
138f0 76 61 6c 75 65 73 20 61 72 65 20 70 6c 61 63 65  values are place
13900 64 20 69 6e 20 76 61 72 69 61 62 6c 65 73 0a 20  d in variables. 
13910 20 2a 2a 20 74 68 61 74 20 68 61 76 65 20 74 68   ** that have th
13920 65 20 73 61 6d 65 20 6e 61 6d 65 20 61 73 20 74  e same name as t
13930 68 65 20 66 69 65 6c 64 73 20 65 78 74 72 61 63  he fields extrac
13940 74 65 64 20 62 79 20 74 68 65 20 71 75 65 72 79  ted by the query
13950 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  ..  */.  case DB
13960 5f 45 56 41 4c 3a 20 7b 0a 20 20 20 20 69 6e 74  _EVAL: {.    int
13970 20 65 76 61 6c 46 6c 61 67 73 20 3d 20 30 3b 0a   evalFlags = 0;.
13980 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
13990 7a 4f 70 74 3b 0a 20 20 20 20 77 68 69 6c 65 28  zOpt;.    while(
139a0 20 6f 62 6a 63 3e 33 20 26 26 20 28 7a 4f 70 74   objc>3 && (zOpt
139b0 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
139c0 28 6f 62 6a 76 5b 32 5d 29 29 21 3d 30 20 26 26  (objv[2]))!=0 &&
139d0 20 7a 4f 70 74 5b 30 5d 3d 3d 27 2d 27 20 29 7b   zOpt[0]=='-' ){
139e0 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d  .      if( strcm
139f0 70 28 7a 4f 70 74 2c 20 22 2d 77 69 74 68 6f 75  p(zOpt, "-withou
13a00 74 6e 75 6c 6c 73 22 29 3d 3d 30 20 29 7b 0a 20  tnulls")==0 ){. 
13a10 20 20 20 20 20 20 20 65 76 61 6c 46 6c 61 67 73         evalFlags
13a20 20 7c 3d 20 53 51 4c 49 54 45 5f 45 56 41 4c 5f   |= SQLITE_EVAL_
13a30 57 49 54 48 4f 55 54 4e 55 4c 4c 53 3b 0a 20 20  WITHOUTNULLS;.  
13a40 20 20 20 20 7d 0a 20 20 20 20 20 20 65 6c 73 65      }.      else
13a50 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70  {.        Tcl_Ap
13a60 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
13a70 70 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6f 70 74 69  p, "unknown opti
13a80 6f 6e 3a 20 5c 22 22 2c 20 7a 4f 70 74 2c 20 22  on: \"", zOpt, "
13a90 5c 22 22 2c 20 28 76 6f 69 64 2a 29 30 29 3b 0a  \"", (void*)0);.
13aa0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54          return T
13ab0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  CL_ERROR;.      
13ac0 7d 0a 20 20 20 20 20 20 6f 62 6a 63 2d 2d 3b 0a  }.      objc--;.
13ad0 20 20 20 20 20 20 6f 62 6a 76 2b 2b 3b 0a 20 20        objv++;.  
13ae0 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 62 6a 63    }.    if( objc
13af0 3c 33 20 7c 7c 20 6f 62 6a 63 3e 35 20 29 7b 0a  <3 || objc>5 ){.
13b00 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
13b10 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
13b20 2c 20 6f 62 6a 76 2c 20 0a 20 20 20 20 20 20 20  , objv, .       
13b30 20 20 20 22 3f 4f 50 54 49 4f 4e 53 3f 20 53 51     "?OPTIONS? SQ
13b40 4c 20 3f 41 52 52 41 59 2d 4e 41 4d 45 3f 20 3f  L ?ARRAY-NAME? ?
13b50 53 43 52 49 50 54 3f 22 29 3b 0a 20 20 20 20 20  SCRIPT?");.     
13b60 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
13b70 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  R;.    }..    if
13b80 28 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20 20 20  ( objc==3 ){.   
13b90 20 20 20 44 62 45 76 61 6c 43 6f 6e 74 65 78 74     DbEvalContext
13ba0 20 73 45 76 61 6c 3b 0a 20 20 20 20 20 20 54 63   sEval;.      Tc
13bb0 6c 5f 4f 62 6a 20 2a 70 52 65 74 20 3d 20 54 63  l_Obj *pRet = Tc
13bc0 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20 20 20 20  l_NewObj();.    
13bd0 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
13be0 6e 74 28 70 52 65 74 29 3b 0a 20 20 20 20 20 20  nt(pRet);.      
13bf0 64 62 45 76 61 6c 49 6e 69 74 28 26 73 45 76 61  dbEvalInit(&sEva
13c00 6c 2c 20 70 44 62 2c 20 6f 62 6a 76 5b 32 5d 2c  l, pDb, objv[2],
13c10 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 77 68   0, 0);.      wh
13c20 69 6c 65 28 20 54 43 4c 5f 4f 4b 3d 3d 28 72 63  ile( TCL_OK==(rc
13c30 20 3d 20 64 62 45 76 61 6c 53 74 65 70 28 26 73   = dbEvalStep(&s
13c40 45 76 61 6c 29 29 20 29 7b 0a 20 20 20 20 20 20  Eval)) ){.      
13c50 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20    int i;.       
13c60 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 20 20 20   int nCol;.     
13c70 20 20 20 64 62 45 76 61 6c 52 6f 77 49 6e 66 6f     dbEvalRowInfo
13c80 28 26 73 45 76 61 6c 2c 20 26 6e 43 6f 6c 2c 20  (&sEval, &nCol, 
13c90 30 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  0);.        for(
13ca0 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b  i=0; i<nCol; i++
13cb0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c  ){.          Tcl
13cc0 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
13cd0 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 52  ement(interp, pR
13ce0 65 74 2c 20 64 62 45 76 61 6c 43 6f 6c 75 6d 6e  et, dbEvalColumn
13cf0 56 61 6c 75 65 28 26 73 45 76 61 6c 2c 20 69 29  Value(&sEval, i)
13d00 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
13d10 20 20 20 7d 0a 20 20 20 20 20 20 64 62 45 76 61     }.      dbEva
13d20 6c 46 69 6e 61 6c 69 7a 65 28 26 73 45 76 61 6c  lFinalize(&sEval
13d30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
13d40 3d 54 43 4c 5f 42 52 45 41 4b 20 29 7b 0a 20 20  =TCL_BREAK ){.  
13d50 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a        Tcl_SetObj
13d60 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70  Result(interp, p
13d70 52 65 74 29 3b 0a 20 20 20 20 20 20 20 20 72 63  Ret);.        rc
13d80 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 20   = TCL_OK;.     
13d90 20 7d 0a 20 20 20 20 20 20 54 63 6c 5f 44 65 63   }.      Tcl_Dec
13da0 72 52 65 66 43 6f 75 6e 74 28 70 52 65 74 29 3b  rRefCount(pRet);
13db0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
13dc0 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 64 32    ClientData cd2
13dd0 5b 32 5d 3b 0a 20 20 20 20 20 20 44 62 45 76 61  [2];.      DbEva
13de0 6c 43 6f 6e 74 65 78 74 20 2a 70 3b 0a 20 20 20  lContext *p;.   
13df0 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 41 72 72     Tcl_Obj *pArr
13e00 61 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 54 63  ay = 0;.      Tc
13e10 6c 5f 4f 62 6a 20 2a 70 53 63 72 69 70 74 3b 0a  l_Obj *pScript;.
13e20 0a 20 20 20 20 20 20 69 66 28 20 6f 62 6a 63 3e  .      if( objc>
13e30 3d 35 20 26 26 20 2a 28 63 68 61 72 20 2a 29 54  =5 && *(char *)T
13e40 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
13e50 76 5b 33 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  v[3]) ){.       
13e60 20 70 41 72 72 61 79 20 3d 20 6f 62 6a 76 5b 33   pArray = objv[3
13e70 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  ];.      }.     
13e80 20 70 53 63 72 69 70 74 20 3d 20 6f 62 6a 76 5b   pScript = objv[
13e90 6f 62 6a 63 2d 31 5d 3b 0a 20 20 20 20 20 20 54  objc-1];.      T
13ea0 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
13eb0 70 53 63 72 69 70 74 29 3b 0a 0a 20 20 20 20 20  pScript);..     
13ec0 20 70 20 3d 20 28 44 62 45 76 61 6c 43 6f 6e 74   p = (DbEvalCont
13ed0 65 78 74 20 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28  ext *)Tcl_Alloc(
13ee0 73 69 7a 65 6f 66 28 44 62 45 76 61 6c 43 6f 6e  sizeof(DbEvalCon
13ef0 74 65 78 74 29 29 3b 0a 20 20 20 20 20 20 64 62  text));.      db
13f00 45 76 61 6c 49 6e 69 74 28 70 2c 20 70 44 62 2c  EvalInit(p, pDb,
13f10 20 6f 62 6a 76 5b 32 5d 2c 20 70 41 72 72 61 79   objv[2], pArray
13f20 2c 20 65 76 61 6c 46 6c 61 67 73 29 3b 0a 0a 20  , evalFlags);.. 
13f30 20 20 20 20 20 63 64 32 5b 30 5d 20 3d 20 28 76       cd2[0] = (v
13f40 6f 69 64 20 2a 29 70 3b 0a 20 20 20 20 20 20 63  oid *)p;.      c
13f50 64 32 5b 31 5d 20 3d 20 28 76 6f 69 64 20 2a 29  d2[1] = (void *)
13f60 70 53 63 72 69 70 74 3b 0a 20 20 20 20 20 20 72  pScript;.      r
13f70 63 20 3d 20 44 62 45 76 61 6c 4e 65 78 74 43 6d  c = DbEvalNextCm
13f80 64 28 63 64 32 2c 20 69 6e 74 65 72 70 2c 20 54  d(cd2, interp, T
13f90 43 4c 5f 4f 4b 29 3b 0a 20 20 20 20 7d 0a 20 20  CL_OK);.    }.  
13fa0 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
13fb0 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20  /*.  **     $db 
13fc0 66 75 6e 63 74 69 6f 6e 20 4e 41 4d 45 20 5b 2d  function NAME [-
13fd0 61 72 67 63 6f 75 6e 74 20 4e 5d 20 5b 2d 64 65  argcount N] [-de
13fe0 74 65 72 6d 69 6e 69 73 74 69 63 5d 20 53 43 52  terministic] SCR
13ff0 49 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 72  IPT.  **.  ** Cr
14000 65 61 74 65 20 61 20 6e 65 77 20 53 51 4c 20 66  eate a new SQL f
14010 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 20 4e  unction called N
14020 41 4d 45 2e 20 20 57 68 65 6e 65 76 65 72 20 74  AME.  Whenever t
14030 68 61 74 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a  hat function is.
14040 20 20 2a 2a 20 63 61 6c 6c 65 64 2c 20 69 6e 76    ** called, inv
14050 6f 6b 65 20 53 43 52 49 50 54 20 74 6f 20 65 76  oke SCRIPT to ev
14060 61 6c 75 61 74 65 20 74 68 65 20 66 75 6e 63 74  aluate the funct
14070 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  ion..  */.  case
14080 20 44 42 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a   DB_FUNCTION: {.
14090 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20      int flags = 
140a0 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20 20  SQLITE_UTF8;.   
140b0 20 53 71 6c 46 75 6e 63 20 2a 70 46 75 6e 63 3b   SqlFunc *pFunc;
140c0 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 53  .    Tcl_Obj *pS
140d0 63 72 69 70 74 3b 0a 20 20 20 20 63 68 61 72 20  cript;.    char 
140e0 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 6e 74 20  *zName;.    int 
140f0 6e 41 72 67 20 3d 20 2d 31 3b 0a 20 20 20 20 69  nArg = -1;.    i
14100 6e 74 20 69 3b 0a 20 20 20 20 69 66 28 20 6f 62  nt i;.    if( ob
14110 6a 63 3c 34 20 29 7b 0a 20 20 20 20 20 20 54 63  jc<4 ){.      Tc
14120 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
14130 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
14140 22 4e 41 4d 45 20 3f 53 57 49 54 43 48 45 53 3f  "NAME ?SWITCHES?
14150 20 53 43 52 49 50 54 22 29 3b 0a 20 20 20 20 20   SCRIPT");.     
14160 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
14170 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  R;.    }.    for
14180 28 69 3d 33 3b 20 69 3c 28 6f 62 6a 63 2d 31 29  (i=3; i<(objc-1)
14190 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 63 6f  ; i++){.      co
141a0 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 54 63  nst char *z = Tc
141b0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
141c0 5b 69 5d 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  [i]);.      int 
141d0 6e 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 29 3b  n = strlen30(z);
141e0 0a 20 20 20 20 20 20 69 66 28 20 6e 3e 32 20 26  .      if( n>2 &
141f0 26 20 73 74 72 6e 63 6d 70 28 7a 2c 20 22 2d 61  & strncmp(z, "-a
14200 72 67 63 6f 75 6e 74 22 2c 6e 29 3d 3d 30 20 29  rgcount",n)==0 )
14210 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 3d  {.        if( i=
14220 3d 28 6f 62 6a 63 2d 32 29 20 29 7b 0a 20 20 20  =(objc-2) ){.   
14230 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e         Tcl_Appen
14240 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
14250 22 6f 70 74 69 6f 6e 20 72 65 71 75 69 72 65 73  "option requires
14260 20 61 6e 20 61 72 67 75 6d 65 6e 74 3a 20 22 2c   an argument: ",
14270 20 7a 2c 28 63 68 61 72 2a 29 30 29 3b 0a 20 20   z,(char*)0);.  
14280 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54          return T
14290 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  CL_ERROR;.      
142a0 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
142b0 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
142c0 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 69  j(interp, objv[i
142d0 2b 31 5d 2c 20 26 6e 41 72 67 29 20 29 20 72 65  +1], &nArg) ) re
142e0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
142f0 20 20 20 20 20 20 20 20 69 66 28 20 6e 41 72 67          if( nArg
14300 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <0 ){.          
14310 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
14320 28 69 6e 74 65 72 70 2c 20 22 6e 75 6d 62 65 72  (interp, "number
14330 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 6d 75   of arguments mu
14340 73 74 20 62 65 20 6e 6f 6e 2d 6e 65 67 61 74 69  st be non-negati
14350 76 65 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ve",.           
14360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14370 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20  (char*)0);.     
14380 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
14390 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d  ERROR;.        }
143a0 0a 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20  .        i++;.  
143b0 20 20 20 20 7d 65 6c 73 65 0a 20 20 20 20 20 20      }else.      
143c0 69 66 28 20 6e 3e 32 20 26 26 20 73 74 72 6e 63  if( n>2 && strnc
143d0 6d 70 28 7a 2c 20 22 2d 64 65 74 65 72 6d 69 6e  mp(z, "-determin
143e0 69 73 74 69 63 22 2c 6e 29 3d 3d 30 20 29 7b 0a  istic",n)==0 ){.
143f0 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d          flags |=
14400 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e   SQLITE_DETERMIN
14410 49 53 54 49 43 3b 0a 20 20 20 20 20 20 7d 65 6c  ISTIC;.      }el
14420 73 65 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f  se{.        Tcl_
14430 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
14440 65 72 70 2c 20 22 62 61 64 20 6f 70 74 69 6f 6e  erp, "bad option
14450 20 5c 22 22 2c 20 7a 2c 0a 20 20 20 20 20 20 20   \"", z,.       
14460 20 20 20 20 20 22 5c 22 3a 20 6d 75 73 74 20 62       "\": must b
14470 65 20 2d 61 72 67 63 6f 75 6e 74 20 6f 72 20 2d  e -argcount or -
14480 64 65 74 65 72 6d 69 6e 69 73 74 69 63 22 2c 20  deterministic", 
14490 28 63 68 61 72 2a 29 30 0a 20 20 20 20 20 20 20  (char*)0.       
144a0 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75   );.        retu
144b0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
144c0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
144d0 20 70 53 63 72 69 70 74 20 3d 20 6f 62 6a 76 5b   pScript = objv[
144e0 6f 62 6a 63 2d 31 5d 3b 0a 20 20 20 20 7a 4e 61  objc-1];.    zNa
144f0 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  me = Tcl_GetStri
14500 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32  ngFromObj(objv[2
14510 5d 2c 20 30 29 3b 0a 20 20 20 20 70 46 75 6e 63  ], 0);.    pFunc
14520 20 3d 20 66 69 6e 64 53 71 6c 46 75 6e 63 28 70   = findSqlFunc(p
14530 44 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  Db, zName);.    
14540 69 66 28 20 70 46 75 6e 63 3d 3d 30 20 29 20 72  if( pFunc==0 ) r
14550 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
14560 0a 20 20 20 20 69 66 28 20 70 46 75 6e 63 2d 3e  .    if( pFunc->
14570 70 53 63 72 69 70 74 20 29 7b 0a 20 20 20 20 20  pScript ){.     
14580 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
14590 74 28 70 46 75 6e 63 2d 3e 70 53 63 72 69 70 74  t(pFunc->pScript
145a0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 46 75  );.    }.    pFu
145b0 6e 63 2d 3e 70 53 63 72 69 70 74 20 3d 20 70 53  nc->pScript = pS
145c0 63 72 69 70 74 3b 0a 20 20 20 20 54 63 6c 5f 49  cript;.    Tcl_I
145d0 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 53 63 72  ncrRefCount(pScr
145e0 69 70 74 29 3b 0a 20 20 20 20 70 46 75 6e 63 2d  ipt);.    pFunc-
145f0 3e 75 73 65 45 76 61 6c 4f 62 6a 76 20 3d 20 73  >useEvalObjv = s
14600 61 66 65 54 6f 55 73 65 45 76 61 6c 4f 62 6a 76  afeToUseEvalObjv
14610 28 69 6e 74 65 72 70 2c 20 70 53 63 72 69 70 74  (interp, pScript
14620 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
14630 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
14640 69 6f 6e 28 70 44 62 2d 3e 64 62 2c 20 7a 4e 61  ion(pDb->db, zNa
14650 6d 65 2c 20 6e 41 72 67 2c 20 66 6c 61 67 73 2c  me, nArg, flags,
14660 0a 20 20 20 20 20 20 20 20 70 46 75 6e 63 2c 20  .        pFunc, 
14670 74 63 6c 53 71 6c 46 75 6e 63 2c 20 30 2c 20 30  tclSqlFunc, 0, 0
14680 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
14690 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
146a0 20 20 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52    rc = TCL_ERROR
146b0 3b 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74 52  ;.      Tcl_SetR
146c0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63  esult(interp, (c
146d0 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 65 72  har *)sqlite3_er
146e0 72 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c 20 54  rmsg(pDb->db), T
146f0 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20  CL_VOLATILE);.  
14700 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20    }.    break;. 
14710 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20   }..  /*.  **   
14720 20 20 24 64 62 20 69 6e 63 72 62 6c 6f 62 20 3f    $db incrblob ?
14730 2d 72 65 61 64 6f 6e 6c 79 3f 20 3f 44 42 3f 20  -readonly? ?DB? 
14740 54 41 42 4c 45 20 43 4f 4c 55 4d 4e 20 52 4f 57  TABLE COLUMN ROW
14750 49 44 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  ID.  */.  case D
14760 42 5f 49 4e 43 52 42 4c 4f 42 3a 20 7b 0a 23 69  B_INCRBLOB: {.#i
14770 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
14780 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20 20 54 63  _INCRBLOB.    Tc
14790 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
147a0 6e 74 65 72 70 2c 20 22 69 6e 63 72 62 6c 6f 62  nterp, "incrblob
147b0 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 69   not available i
147c0 6e 20 74 68 69 73 20 62 75 69 6c 64 22 2c 20 28  n this build", (
147d0 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 72 65  char*)0);.    re
147e0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
147f0 23 65 6c 73 65 0a 20 20 20 20 69 6e 74 20 69 73  #else.    int is
14800 52 65 61 64 6f 6e 6c 79 20 3d 20 30 3b 0a 20 20  Readonly = 0;.  
14810 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
14820 62 20 3d 20 22 6d 61 69 6e 22 3b 0a 20 20 20 20  b = "main";.    
14830 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62  const char *zTab
14840 6c 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  le;.    const ch
14850 61 72 20 2a 7a 43 6f 6c 75 6d 6e 3b 0a 20 20 20  ar *zColumn;.   
14860 20 54 63 6c 5f 57 69 64 65 49 6e 74 20 69 52 6f   Tcl_WideInt iRo
14870 77 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b  w;..    /* Check
14880 20 66 6f 72 20 74 68 65 20 2d 72 65 61 64 6f 6e   for the -readon
14890 6c 79 20 6f 70 74 69 6f 6e 20 2a 2f 0a 20 20 20  ly option */.   
148a0 20 69 66 28 20 6f 62 6a 63 3e 33 20 26 26 20 73   if( objc>3 && s
148b0 74 72 63 6d 70 28 54 63 6c 5f 47 65 74 53 74 72  trcmp(Tcl_GetStr
148c0 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 2c 20 22 2d  ing(objv[2]), "-
148d0 72 65 61 64 6f 6e 6c 79 22 29 3d 3d 30 20 29 7b  readonly")==0 ){
148e0 0a 20 20 20 20 20 20 69 73 52 65 61 64 6f 6e 6c  .      isReadonl
148f0 79 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20  y = 1;.    }..  
14900 20 20 69 66 28 20 6f 62 6a 63 21 3d 28 35 2b 69    if( objc!=(5+i
14910 73 52 65 61 64 6f 6e 6c 79 29 20 26 26 20 6f 62  sReadonly) && ob
14920 6a 63 21 3d 28 36 2b 69 73 52 65 61 64 6f 6e 6c  jc!=(6+isReadonl
14930 79 29 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  y) ){.      Tcl_
14940 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
14950 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f  erp, 2, objv, "?
14960 2d 72 65 61 64 6f 6e 6c 79 3f 20 3f 44 42 3f 20  -readonly? ?DB? 
14970 54 41 42 4c 45 20 43 4f 4c 55 4d 4e 20 52 4f 57  TABLE COLUMN ROW
14980 49 44 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ID");.      retu
14990 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
149a0 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 6f 62 6a    }..    if( obj
149b0 63 3d 3d 28 36 2b 69 73 52 65 61 64 6f 6e 6c 79  c==(6+isReadonly
149c0 29 20 29 7b 0a 20 20 20 20 20 20 7a 44 62 20 3d  ) ){.      zDb =
149d0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
149e0 62 6a 76 5b 32 5d 29 3b 0a 20 20 20 20 7d 0a 20  bjv[2]);.    }. 
149f0 20 20 20 7a 54 61 62 6c 65 20 3d 20 54 63 6c 5f     zTable = Tcl_
14a00 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 6f  GetString(objv[o
14a10 62 6a 63 2d 33 5d 29 3b 0a 20 20 20 20 7a 43 6f  bjc-3]);.    zCo
14a20 6c 75 6d 6e 20 3d 20 54 63 6c 5f 47 65 74 53 74  lumn = Tcl_GetSt
14a30 72 69 6e 67 28 6f 62 6a 76 5b 6f 62 6a 63 2d 32  ring(objv[objc-2
14a40 5d 29 3b 0a 20 20 20 20 72 63 20 3d 20 54 63 6c  ]);.    rc = Tcl
14a50 5f 47 65 74 57 69 64 65 49 6e 74 46 72 6f 6d 4f  _GetWideIntFromO
14a60 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
14a70 6f 62 6a 63 2d 31 5d 2c 20 26 69 52 6f 77 29 3b  objc-1], &iRow);
14a80 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 54 43  ..    if( rc==TC
14a90 4c 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  L_OK ){.      rc
14aa0 20 3d 20 63 72 65 61 74 65 49 6e 63 72 62 6c 6f   = createIncrblo
14ab0 62 43 68 61 6e 6e 65 6c 28 0a 20 20 20 20 20 20  bChannel(.      
14ac0 20 20 20 20 69 6e 74 65 72 70 2c 20 70 44 62 2c      interp, pDb,
14ad0 20 7a 44 62 2c 20 7a 54 61 62 6c 65 2c 20 7a 43   zDb, zTable, zC
14ae0 6f 6c 75 6d 6e 2c 20 28 73 71 6c 69 74 65 33 5f  olumn, (sqlite3_
14af0 69 6e 74 36 34 29 69 52 6f 77 2c 20 69 73 52 65  int64)iRow, isRe
14b00 61 64 6f 6e 6c 79 0a 20 20 20 20 20 20 29 3b 0a  adonly.      );.
14b10 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
14b20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
14b30 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20 69  *.  **     $db i
14b40 6e 74 65 72 72 75 70 74 0a 20 20 2a 2a 0a 20 20  nterrupt.  **.  
14b50 2a 2a 20 49 6e 74 65 72 72 75 70 74 20 74 68 65  ** Interrupt the
14b60 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 74 68   execution of th
14b70 65 20 69 6e 6e 65 72 2d 6d 6f 73 74 20 53 51 4c  e inner-most SQL
14b80 20 69 6e 74 65 72 70 72 65 74 65 72 2e 20 20 54   interpreter.  T
14b90 68 69 73 0a 20 20 2a 2a 20 63 61 75 73 65 73 20  his.  ** causes 
14ba0 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  the SQL statemen
14bb0 74 20 74 6f 20 72 65 74 75 72 6e 20 61 6e 20 65  t to return an e
14bc0 72 72 6f 72 20 6f 66 20 53 51 4c 49 54 45 5f 49  rror of SQLITE_I
14bd0 4e 54 45 52 52 55 50 54 2e 0a 20 20 2a 2f 0a 20  NTERRUPT..  */. 
14be0 20 63 61 73 65 20 44 42 5f 49 4e 54 45 52 52 55   case DB_INTERRU
14bf0 50 54 3a 20 7b 0a 20 20 20 20 73 71 6c 69 74 65  PT: {.    sqlite
14c00 33 5f 69 6e 74 65 72 72 75 70 74 28 70 44 62 2d  3_interrupt(pDb-
14c10 3e 64 62 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b  >db);.    break;
14c20 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
14c30 20 20 20 20 24 64 62 20 6e 61 6d 65 6c 69 73 74      $db namelist
14c40 20 50 52 45 46 49 58 20 4d 41 53 4b 0a 20 20 2a   PREFIX MASK.  *
14c50 2f 0a 20 20 63 61 73 65 20 44 42 5f 4e 41 4d 45  /.  case DB_NAME
14c60 4c 49 53 54 3a 20 7b 0a 20 20 20 20 63 6f 6e 73  LIST: {.    cons
14c70 74 20 63 68 61 72 20 2a 7a 50 72 65 66 69 78 3b  t char *zPrefix;
14c80 0a 20 20 20 20 69 6e 74 20 6d 61 73 6b 3b 0a 20  .    int mask;. 
14c90 20 20 20 63 68 61 72 20 2a 2a 61 7a 4c 69 73 74     char **azList
14ca0 3b 0a 20 20 20 20 69 6e 74 20 6e 4c 69 73 74 2c  ;.    int nList,
14cb0 20 69 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63   i;.    if( objc
14cc0 21 3d 34 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  !=4 ){.      Tcl
14cd0 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
14ce0 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22  terp, 2, objv, "
14cf0 50 52 45 46 49 58 20 4d 41 53 4b 22 29 3b 0a 20  PREFIX MASK");. 
14d00 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
14d10 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
14d20 20 7a 50 72 65 66 69 78 20 3d 20 54 63 6c 5f 47   zPrefix = Tcl_G
14d30 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d  etString(objv[2]
14d40 29 3b 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 47  );.    if( Tcl_G
14d50 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
14d60 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 6d  erp, objv[3], &m
14d70 61 73 6b 29 20 29 20 72 65 74 75 72 6e 20 54 43  ask) ) return TC
14d80 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 61 7a 4c  L_ERROR;.    azL
14d90 69 73 74 20 3d 20 73 71 6c 69 74 65 33 5f 6e 61  ist = sqlite3_na
14da0 6d 65 6c 69 73 74 28 70 44 62 2d 3e 64 62 2c 20  melist(pDb->db, 
14db0 7a 50 72 65 66 69 78 2c 20 6d 61 73 6b 2c 20 26  zPrefix, mask, &
14dc0 6e 4c 69 73 74 29 3b 0a 20 20 20 20 69 66 28 20  nList);.    if( 
14dd0 61 7a 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20  azList ){.      
14de0 54 63 6c 5f 4f 62 6a 20 2a 70 4c 69 73 74 20 3d  Tcl_Obj *pList =
14df0 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28   Tcl_NewListObj(
14e00 6e 4c 69 73 74 2c 20 30 29 3b 0a 20 20 20 20 20  nList, 0);.     
14e10 20 66 6f 72 28 69 3d 30 3b 20 61 7a 4c 69 73 74   for(i=0; azList
14e20 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  [i]; i++){.     
14e30 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
14e40 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
14e50 72 70 2c 20 70 4c 69 73 74 2c 0a 20 20 20 20 20  rp, pList,.     
14e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14e70 20 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f              Tcl_
14e80 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 61 7a 4c  NewStringObj(azL
14e90 69 73 74 5b 69 5d 2c 2d 31 29 29 3b 0a 20 20 20  ist[i],-1));.   
14ea0 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
14eb0 74 28 20 69 3d 3d 6e 4c 69 73 74 20 29 3b 0a 20  t( i==nList );. 
14ec0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
14ed0 65 28 61 7a 4c 69 73 74 29 3b 0a 20 20 20 20 20  e(azList);.     
14ee0 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
14ef0 74 28 69 6e 74 65 72 70 2c 20 70 4c 69 73 74 29  t(interp, pList)
14f00 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61  ;.    }.    brea
14f10 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  k;.  }..  /*.  *
14f20 2a 20 20 20 20 20 24 64 62 20 6e 75 6c 6c 76 61  *     $db nullva
14f30 6c 75 65 20 3f 53 54 52 49 4e 47 3f 0a 20 20 2a  lue ?STRING?.  *
14f40 2a 0a 20 20 2a 2a 20 43 68 61 6e 67 65 20 74 65  *.  ** Change te
14f50 78 74 20 75 73 65 64 20 77 68 65 6e 20 61 20 4e  xt used when a N
14f60 55 4c 4c 20 63 6f 6d 65 73 20 62 61 63 6b 20 66  ULL comes back f
14f70 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
14f80 2e 20 49 66 20 3f 53 54 52 49 4e 47 3f 0a 20 20  . If ?STRING?.  
14f90 2a 2a 20 69 73 20 6e 6f 74 20 70 72 65 73 65 6e  ** is not presen
14fa0 74 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 72  t, then the curr
14fb0 65 6e 74 20 73 74 72 69 6e 67 20 75 73 65 64 20  ent string used 
14fc0 66 6f 72 20 4e 55 4c 4c 20 69 73 20 72 65 74 75  for NULL is retu
14fd0 72 6e 65 64 2e 0a 20 20 2a 2a 20 49 66 20 53 54  rned..  ** If ST
14fe0 52 49 4e 47 20 69 73 20 70 72 65 73 65 6e 74 2c  RING is present,
14ff0 20 74 68 65 6e 20 53 54 52 49 4e 47 20 69 73 20   then STRING is 
15000 72 65 74 75 72 6e 65 64 2e 0a 20 20 2a 2a 0a 20  returned..  **. 
15010 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 4e 55   */.  case DB_NU
15020 4c 4c 56 41 4c 55 45 3a 20 7b 0a 20 20 20 20 69  LLVALUE: {.    i
15030 66 28 20 6f 62 6a 63 21 3d 32 20 26 26 20 6f 62  f( objc!=2 && ob
15040 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 54  jc!=3 ){.      T
15050 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
15060 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c  interp, 2, objv,
15070 20 22 4e 55 4c 4c 56 41 4c 55 45 22 29 3b 0a 20   "NULLVALUE");. 
15080 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
15090 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
150a0 20 69 66 28 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a   if( objc==3 ){.
150b0 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20        int len;. 
150c0 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 75 6c 6c       char *zNull
150d0 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
150e0 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c  FromObj(objv[2],
150f0 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69 66   &len);.      if
15100 28 20 70 44 62 2d 3e 7a 4e 75 6c 6c 20 29 7b 0a  ( pDb->zNull ){.
15110 20 20 20 20 20 20 20 20 54 63 6c 5f 46 72 65 65          Tcl_Free
15120 28 70 44 62 2d 3e 7a 4e 75 6c 6c 29 3b 0a 20 20  (pDb->zNull);.  
15130 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
15140 7a 4e 75 6c 6c 20 26 26 20 6c 65 6e 3e 30 20 29  zNull && len>0 )
15150 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a  {.        pDb->z
15160 4e 75 6c 6c 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63  Null = Tcl_Alloc
15170 28 20 6c 65 6e 20 2b 20 31 20 29 3b 0a 20 20 20  ( len + 1 );.   
15180 20 20 20 20 20 6d 65 6d 63 70 79 28 70 44 62 2d       memcpy(pDb-
15190 3e 7a 4e 75 6c 6c 2c 20 7a 4e 75 6c 6c 2c 20 6c  >zNull, zNull, l
151a0 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 70 44 62  en);.        pDb
151b0 2d 3e 7a 4e 75 6c 6c 5b 6c 65 6e 5d 20 3d 20 27  ->zNull[len] = '
151c0 5c 30 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  \0';.      }else
151d0 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a  {.        pDb->z
151e0 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  Null = 0;.      
151f0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f  }.    }.    Tcl_
15200 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
15210 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  erp, Tcl_NewStri
15220 6e 67 4f 62 6a 28 70 44 62 2d 3e 7a 4e 75 6c 6c  ngObj(pDb->zNull
15230 2c 20 2d 31 29 29 3b 0a 20 20 20 20 62 72 65 61  , -1));.    brea
15240 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  k;.  }..  /*.  *
15250 2a 20 20 20 20 20 24 64 62 20 6c 61 73 74 5f 69  *     $db last_i
15260 6e 73 65 72 74 5f 72 6f 77 69 64 0a 20 20 2a 2a  nsert_rowid.  **
15270 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20  .  ** Return an 
15280 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73  integer which is
15290 20 74 68 65 20 52 4f 57 49 44 20 66 6f 72 20 74   the ROWID for t
152a0 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 69  he most recent i
152b0 6e 73 65 72 74 2e 0a 20 20 2a 2f 0a 20 20 63 61  nsert..  */.  ca
152c0 73 65 20 44 42 5f 4c 41 53 54 5f 49 4e 53 45 52  se DB_LAST_INSER
152d0 54 5f 52 4f 57 49 44 3a 20 7b 0a 20 20 20 20 54  T_ROWID: {.    T
152e0 63 6c 5f 4f 62 6a 20 2a 70 52 65 73 75 6c 74 3b  cl_Obj *pResult;
152f0 0a 20 20 20 20 54 63 6c 5f 57 69 64 65 49 6e 74  .    Tcl_WideInt
15300 20 72 6f 77 69 64 3b 0a 20 20 20 20 69 66 28 20   rowid;.    if( 
15310 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 20  objc!=2 ){.     
15320 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
15330 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a  s(interp, 2, obj
15340 76 2c 20 22 22 29 3b 0a 20 20 20 20 20 20 72 65  v, "");.      re
15350 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
15360 20 20 20 20 7d 0a 20 20 20 20 72 6f 77 69 64 20      }.    rowid 
15370 3d 20 73 71 6c 69 74 65 33 5f 6c 61 73 74 5f 69  = sqlite3_last_i
15380 6e 73 65 72 74 5f 72 6f 77 69 64 28 70 44 62 2d  nsert_rowid(pDb-
15390 3e 64 62 29 3b 0a 20 20 20 20 70 52 65 73 75 6c  >db);.    pResul
153a0 74 20 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65  t = Tcl_GetObjRe
153b0 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  sult(interp);.  
153c0 20 20 54 63 6c 5f 53 65 74 57 69 64 65 49 6e 74    Tcl_SetWideInt
153d0 4f 62 6a 28 70 52 65 73 75 6c 74 2c 20 72 6f 77  Obj(pResult, row
153e0 69 64 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a  id);.    break;.
153f0 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54    }..  /*.  ** T
15400 68 65 20 44 42 5f 4f 4e 45 43 4f 4c 55 4d 4e 20  he DB_ONECOLUMN 
15410 6d 65 74 68 6f 64 20 69 73 20 69 6d 70 6c 65 6d  method is implem
15420 65 6e 74 65 64 20 74 6f 67 65 74 68 65 72 20 77  ented together w
15430 69 74 68 20 44 42 5f 45 58 49 53 54 53 2e 0a 20  ith DB_EXISTS.. 
15440 20 2a 2f 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62   */..  /*    $db
15450 20 70 72 6f 67 72 65 73 73 20 3f 4e 20 43 41 4c   progress ?N CAL
15460 4c 42 41 43 4b 3f 0a 20 20 2a 2a 0a 20 20 2a 2a  LBACK?.  **.  **
15470 20 49 6e 76 6f 6b 65 20 74 68 65 20 67 69 76 65   Invoke the give
15480 6e 20 63 61 6c 6c 62 61 63 6b 20 65 76 65 72 79  n callback every
15490 20 4e 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69   N virtual machi
154a0 6e 65 20 6f 70 63 6f 64 65 73 20 77 68 69 6c 65  ne opcodes while
154b0 20 65 78 65 63 75 74 69 6e 67 0a 20 20 2a 2a 20   executing.  ** 
154c0 71 75 65 72 69 65 73 2e 0a 20 20 2a 2f 0a 20 20  queries..  */.  
154d0 63 61 73 65 20 44 42 5f 50 52 4f 47 52 45 53 53  case DB_PROGRESS
154e0 3a 20 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63  : {.    if( objc
154f0 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==2 ){.      if(
15500 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 20   pDb->zProgress 
15510 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41  ){.        Tcl_A
15520 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
15530 72 70 2c 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65  rp, pDb->zProgre
15540 73 73 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20  ss, (char*)0);. 
15550 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
15560 20 69 66 28 20 6f 62 6a 63 3d 3d 34 20 29 7b 0a   if( objc==4 ){.
15570 20 20 20 20 20 20 63 68 61 72 20 2a 7a 50 72 6f        char *zPro
15580 67 72 65 73 73 3b 0a 20 20 20 20 20 20 69 6e 74  gress;.      int
15590 20 6c 65 6e 3b 0a 20 20 20 20 20 20 69 6e 74 20   len;.      int 
155a0 4e 3b 0a 20 20 20 20 20 20 69 66 28 20 54 43 4c  N;.      if( TCL
155b0 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 49 6e 74 46  _OK!=Tcl_GetIntF
155c0 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
155d0 62 6a 76 5b 32 5d 2c 20 26 4e 29 20 29 7b 0a 20  bjv[2], &N) ){. 
155e0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43         return TC
155f0 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d  L_ERROR;.      }
15600 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d  ;.      if( pDb-
15610 3e 7a 50 72 6f 67 72 65 73 73 20 29 7b 0a 20 20  >zProgress ){.  
15620 20 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70        Tcl_Free(p
15630 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 29 3b 0a  Db->zProgress);.
15640 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 50        }.      zP
15650 72 6f 67 72 65 73 73 20 3d 20 54 63 6c 5f 47 65  rogress = Tcl_Ge
15660 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
15670 62 6a 76 5b 33 5d 2c 20 26 6c 65 6e 29 3b 0a 20  bjv[3], &len);. 
15680 20 20 20 20 20 69 66 28 20 7a 50 72 6f 67 72 65       if( zProgre
15690 73 73 20 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20  ss && len>0 ){. 
156a0 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 50 72 6f         pDb->zPro
156b0 67 72 65 73 73 20 3d 20 54 63 6c 5f 41 6c 6c 6f  gress = Tcl_Allo
156c0 63 28 20 6c 65 6e 20 2b 20 31 20 29 3b 0a 20 20  c( len + 1 );.  
156d0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 44 62        memcpy(pDb
156e0 2d 3e 7a 50 72 6f 67 72 65 73 73 2c 20 7a 50 72  ->zProgress, zPr
156f0 6f 67 72 65 73 73 2c 20 6c 65 6e 2b 31 29 3b 0a  ogress, len+1);.
15700 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
15710 20 20 20 20 20 70 44 62 2d 3e 7a 50 72 6f 67 72       pDb->zProgr
15720 65 73 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ess = 0;.      }
15730 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
15740 4f 4d 49 54 5f 50 52 4f 47 52 45 53 53 5f 43 41  OMIT_PROGRESS_CA
15750 4c 4c 42 41 43 4b 0a 20 20 20 20 20 20 69 66 28  LLBACK.      if(
15760 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 20   pDb->zProgress 
15770 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e  ){.        pDb->
15780 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b  interp = interp;
15790 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
157a0 5f 70 72 6f 67 72 65 73 73 5f 68 61 6e 64 6c 65  _progress_handle
157b0 72 28 70 44 62 2d 3e 64 62 2c 20 4e 2c 20 44 62  r(pDb->db, N, Db
157c0 50 72 6f 67 72 65 73 73 48 61 6e 64 6c 65 72 2c  ProgressHandler,
157d0 20 70 44 62 29 3b 0a 20 20 20 20 20 20 7d 65 6c   pDb);.      }el
157e0 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
157f0 74 65 33 5f 70 72 6f 67 72 65 73 73 5f 68 61 6e  te3_progress_han
15800 64 6c 65 72 28 70 44 62 2d 3e 64 62 2c 20 30 2c  dler(pDb->db, 0,
15810 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a   0, 0);.      }.
15820 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65  #endif.    }else
15830 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e  {.      Tcl_Wron
15840 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
15850 20 32 2c 20 6f 62 6a 76 2c 20 22 4e 20 43 41 4c   2, objv, "N CAL
15860 4c 42 41 43 4b 22 29 3b 0a 20 20 20 20 20 20 72  LBACK");.      r
15870 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
15880 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b  .    }.    break
15890 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24  ;.  }..  /*    $
158a0 64 62 20 70 72 6f 66 69 6c 65 20 3f 43 41 4c 4c  db profile ?CALL
158b0 42 41 43 4b 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20  BACK?.  **.  ** 
158c0 4d 61 6b 65 20 61 72 72 61 6e 67 65 6d 65 6e 74  Make arrangement
158d0 73 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20  s to invoke the 
158e0 43 41 4c 4c 42 41 43 4b 20 72 6f 75 74 69 6e 65  CALLBACK routine
158f0 20 61 66 74 65 72 20 65 61 63 68 20 53 51 4c 20   after each SQL 
15900 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74  statement.  ** t
15910 68 61 74 20 68 61 73 20 72 75 6e 2e 20 20 54 68  hat has run.  Th
15920 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 53 51  e text of the SQ
15930 4c 20 61 6e 64 20 74 68 65 20 61 6d 6f 75 6e 74  L and the amount
15940 20 6f 66 20 65 6c 61 70 73 65 20 74 69 6d 65 20   of elapse time 
15950 61 72 65 0a 20 20 2a 2a 20 61 70 70 65 6e 64 65  are.  ** appende
15960 64 20 74 6f 20 43 41 4c 4c 42 41 43 4b 20 62 65  d to CALLBACK be
15970 66 6f 72 65 20 74 68 65 20 73 63 72 69 70 74 20  fore the script 
15980 69 73 20 72 75 6e 2e 0a 20 20 2a 2f 0a 20 20 63  is run..  */.  c
15990 61 73 65 20 44 42 5f 50 52 4f 46 49 4c 45 3a 20  ase DB_PROFILE: 
159a0 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 33  {.    if( objc>3
159b0 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72   ){.      Tcl_Wr
159c0 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
159d0 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 43 41  p, 2, objv, "?CA
159e0 4c 4c 42 41 43 4b 3f 22 29 3b 0a 20 20 20 20 20  LLBACK?");.     
159f0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
15a00 52 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  R;.    }else if(
15a10 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20   objc==2 ){.    
15a20 20 20 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f 66    if( pDb->zProf
15a30 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 54  ile ){.        T
15a40 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
15a50 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a 50 72  interp, pDb->zPr
15a60 6f 66 69 6c 65 2c 20 28 63 68 61 72 2a 29 30 29  ofile, (char*)0)
15a70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
15a80 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20  lse{.      char 
15a90 2a 7a 50 72 6f 66 69 6c 65 3b 0a 20 20 20 20 20  *zProfile;.     
15aa0 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20   int len;.      
15ab0 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c  if( pDb->zProfil
15ac0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c  e ){.        Tcl
15ad0 5f 46 72 65 65 28 70 44 62 2d 3e 7a 50 72 6f 66  _Free(pDb->zProf
15ae0 69 6c 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ile);.      }.  
15af0 20 20 20 20 7a 50 72 6f 66 69 6c 65 20 3d 20 54      zProfile = T
15b00 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
15b10 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65  Obj(objv[2], &le
15b20 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 50  n);.      if( zP
15b30 72 6f 66 69 6c 65 20 26 26 20 6c 65 6e 3e 30 20  rofile && len>0 
15b40 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e  ){.        pDb->
15b50 7a 50 72 6f 66 69 6c 65 20 3d 20 54 63 6c 5f 41  zProfile = Tcl_A
15b60 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20 31 20 29 3b  lloc( len + 1 );
15b70 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
15b80 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 2c 20 7a  pDb->zProfile, z
15b90 50 72 6f 66 69 6c 65 2c 20 6c 65 6e 2b 31 29 3b  Profile, len+1);
15ba0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
15bb0 20 20 20 20 20 20 70 44 62 2d 3e 7a 50 72 6f 66        pDb->zProf
15bc0 69 6c 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ile = 0;.      }
15bd0 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
15be0 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 29  LITE_OMIT_TRACE)
15bf0 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
15c00 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e  ITE_OMIT_FLOATIN
15c10 47 5f 50 4f 49 4e 54 29 20 26 26 20 5c 0a 20 20  G_POINT) && \.  
15c20 20 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54    !defined(SQLIT
15c30 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41 54 45  E_OMIT_DEPRECATE
15c40 44 29 0a 20 20 20 20 20 20 69 66 28 20 70 44 62  D).      if( pDb
15c50 2d 3e 7a 50 72 6f 66 69 6c 65 20 29 7b 0a 20 20  ->zProfile ){.  
15c60 20 20 20 20 20 20 70 44 62 2d 3e 69 6e 74 65 72        pDb->inter
15c70 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20  p = interp;.    
15c80 20 20 20 20 73 71 6c 69 74 65 33 5f 70 72 6f 66      sqlite3_prof
15c90 69 6c 65 28 70 44 62 2d 3e 64 62 2c 20 44 62 50  ile(pDb->db, DbP
15ca0 72 6f 66 69 6c 65 48 61 6e 64 6c 65 72 2c 20 70  rofileHandler, p
15cb0 44 62 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  Db);.      }else
15cc0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
15cd0 33 5f 70 72 6f 66 69 6c 65 28 70 44 62 2d 3e 64  3_profile(pDb->d
15ce0 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  b, 0, 0);.      
15cf0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20  }.#endif.    }. 
15d00 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
15d10 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62   /*.  **     $db
15d20 20 72 65 6b 65 79 20 4b 45 59 0a 20 20 2a 2a 0a   rekey KEY.  **.
15d30 20 20 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20    ** Change the 
15d40 65 6e 63 72 79 70 74 69 6f 6e 20 6b 65 79 20 6f  encryption key o
15d50 6e 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79 20  n the currently 
15d60 6f 70 65 6e 20 64 61 74 61 62 61 73 65 2e 0a 20  open database.. 
15d70 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 52 45   */.  case DB_RE
15d80 4b 45 59 3a 20 7b 0a 23 69 66 20 64 65 66 69 6e  KEY: {.#if defin
15d90 65 64 28 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  ed(SQLITE_HAS_CO
15da0 44 45 43 29 20 26 26 20 21 64 65 66 69 6e 65 64  DEC) && !defined
15db0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 44  (SQLITE_OMIT_COD
15dc0 45 43 5f 46 52 4f 4d 5f 54 43 4c 29 0a 20 20 20  EC_FROM_TCL).   
15dd0 20 69 6e 74 20 6e 4b 65 79 3b 0a 20 20 20 20 76   int nKey;.    v
15de0 6f 69 64 20 2a 70 4b 65 79 3b 0a 23 65 6e 64 69  oid *pKey;.#endi
15df0 66 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d  f.    if( objc!=
15e00 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57  3 ){.      Tcl_W
15e10 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
15e20 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 4b 45  rp, 2, objv, "KE
15e30 59 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  Y");.      retur
15e40 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
15e50 20 7d 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53   }.#if defined(S
15e60 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 29  QLITE_HAS_CODEC)
15e70 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
15e80 49 54 45 5f 4f 4d 49 54 5f 43 4f 44 45 43 5f 46  ITE_OMIT_CODEC_F
15e90 52 4f 4d 5f 54 43 4c 29 0a 20 20 20 20 70 4b 65  ROM_TCL).    pKe
15ea0 79 20 3d 20 54 63 6c 5f 47 65 74 42 79 74 65 41  y = Tcl_GetByteA
15eb0 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  rrayFromObj(objv
15ec0 5b 32 5d 2c 20 26 6e 4b 65 79 29 3b 0a 20 20 20  [2], &nKey);.   
15ed0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65   rc = sqlite3_re
15ee0 6b 65 79 28 70 44 62 2d 3e 64 62 2c 20 70 4b 65  key(pDb->db, pKe
15ef0 79 2c 20 6e 4b 65 79 29 3b 0a 20 20 20 20 69 66  y, nKey);.    if
15f00 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 54 63  ( rc ){.      Tc
15f10 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
15f20 6e 74 65 72 70 2c 20 73 71 6c 69 74 65 33 5f 65  nterp, sqlite3_e
15f30 72 72 73 74 72 28 72 63 29 2c 20 28 63 68 61 72  rrstr(rc), (char
15f40 2a 29 30 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  *)0);.      rc =
15f50 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
15f60 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 62 72 65  }.#endif.    bre
15f70 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20  ak;.  }..  /*   
15f80 20 24 64 62 20 72 65 73 74 6f 72 65 20 3f 44 41   $db restore ?DA
15f90 54 41 42 41 53 45 3f 20 46 49 4c 45 4e 41 4d 45  TABASE? FILENAME
15fa0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 70 65 6e 20  .  **.  ** Open 
15fb0 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  a database file 
15fc0 6e 61 6d 65 64 20 46 49 4c 45 4e 41 4d 45 2e 20  named FILENAME. 
15fd0 20 54 72 61 6e 73 66 65 72 20 74 68 65 20 63 6f   Transfer the co
15fe0 6e 74 65 6e 74 0a 20 20 2a 2a 20 6f 66 20 46 49  ntent.  ** of FI
15ff0 4c 45 4e 41 4d 45 20 69 6e 74 6f 20 74 68 65 20  LENAME into the 
16000 6c 6f 63 61 6c 20 64 61 74 61 62 61 73 65 20 44  local database D
16010 41 54 41 42 41 53 45 20 28 64 65 66 61 75 6c 74  ATABASE (default
16020 3a 20 22 6d 61 69 6e 22 29 2e 0a 20 20 2a 2f 0a  : "main")..  */.
16030 20 20 63 61 73 65 20 44 42 5f 52 45 53 54 4f 52    case DB_RESTOR
16040 45 3a 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  E: {.    const c
16050 68 61 72 20 2a 7a 53 72 63 46 69 6c 65 3b 0a 20  har *zSrcFile;. 
16060 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
16070 44 65 73 74 44 62 3b 0a 20 20 20 20 73 71 6c 69  DestDb;.    sqli
16080 74 65 33 20 2a 70 53 72 63 3b 0a 20 20 20 20 73  te3 *pSrc;.    s
16090 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 2a 70  qlite3_backup *p
160a0 42 61 63 6b 75 70 3b 0a 20 20 20 20 69 6e 74 20  Backup;.    int 
160b0 6e 54 69 6d 65 6f 75 74 20 3d 20 30 3b 0a 0a 20  nTimeout = 0;.. 
160c0 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d 33 20 29     if( objc==3 )
160d0 7b 0a 20 20 20 20 20 20 7a 44 65 73 74 44 62 20  {.      zDestDb 
160e0 3d 20 22 6d 61 69 6e 22 3b 0a 20 20 20 20 20 20  = "main";.      
160f0 7a 53 72 63 46 69 6c 65 20 3d 20 54 63 6c 5f 47  zSrcFile = Tcl_G
16100 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d  etString(objv[2]
16110 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
16120 20 6f 62 6a 63 3d 3d 34 20 29 7b 0a 20 20 20 20   objc==4 ){.    
16130 20 20 7a 44 65 73 74 44 62 20 3d 20 54 63 6c 5f    zDestDb = Tcl_
16140 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32  GetString(objv[2
16150 5d 29 3b 0a 20 20 20 20 20 20 7a 53 72 63 46 69  ]);.      zSrcFi
16160 6c 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  le = Tcl_GetStri
16170 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a 20 20 20  ng(objv[3]);.   
16180 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 54 63   }else{.      Tc
16190 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
161a0 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
161b0 22 3f 44 41 54 41 42 41 53 45 3f 20 46 49 4c 45  "?DATABASE? FILE
161c0 4e 41 4d 45 22 29 3b 0a 20 20 20 20 20 20 72 65  NAME");.      re
161d0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
161e0 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73      }.    rc = s
161f0 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 7a  qlite3_open_v2(z
16200 53 72 63 46 69 6c 65 2c 20 26 70 53 72 63 2c 0a  SrcFile, &pSrc,.
16210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16220 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
16230 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 7c 20  OPEN_READONLY | 
16240 70 44 62 2d 3e 6f 70 65 6e 46 6c 61 67 73 2c 20  pDb->openFlags, 
16250 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  0);.    if( rc!=
16260 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
16270 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
16280 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 63 61 6e  ult(interp, "can
16290 6e 6f 74 20 6f 70 65 6e 20 73 6f 75 72 63 65 20  not open source 
162a0 64 61 74 61 62 61 73 65 3a 20 22 2c 0a 20 20 20  database: ",.   
162b0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
162c0 65 72 72 6d 73 67 28 70 53 72 63 29 2c 20 28 63  errmsg(pSrc), (c
162d0 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 73  har*)0);.      s
162e0 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70 53 72  qlite3_close(pSr
162f0 63 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  c);.      return
16300 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
16310 7d 0a 20 20 20 20 70 42 61 63 6b 75 70 20 3d 20  }.    pBackup = 
16320 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f 69  sqlite3_backup_i
16330 6e 69 74 28 70 44 62 2d 3e 64 62 2c 20 7a 44 65  nit(pDb->db, zDe
16340 73 74 44 62 2c 20 70 53 72 63 2c 20 22 6d 61 69  stDb, pSrc, "mai
16350 6e 22 29 3b 0a 20 20 20 20 69 66 28 20 70 42 61  n");.    if( pBa
16360 63 6b 75 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ckup==0 ){.     
16370 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
16380 74 28 69 6e 74 65 72 70 2c 20 22 72 65 73 74 6f  t(interp, "resto
16390 72 65 20 66 61 69 6c 65 64 3a 20 22 2c 0a 20 20  re failed: ",.  
163a0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
163b0 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62 29  _errmsg(pDb->db)
163c0 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20  , (char*)0);.   
163d0 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65     sqlite3_close
163e0 28 70 53 72 63 29 3b 0a 20 20 20 20 20 20 72 65  (pSrc);.      re
163f0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
16400 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c 65 28      }.    while(
16410 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62   (rc = sqlite3_b
16420 61 63 6b 75 70 5f 73 74 65 70 28 70 42 61 63 6b  ackup_step(pBack
16430 75 70 2c 31 30 30 29 29 3d 3d 53 51 4c 49 54 45  up,100))==SQLITE
16440 5f 4f 4b 0a 20 20 20 20 20 20 20 20 20 20 20 20  _OK.            
16450 20 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f    || rc==SQLITE_
16460 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20 69 66  BUSY ){.      if
16470 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53  ( rc==SQLITE_BUS
16480 59 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  Y ){.        if(
16490 20 6e 54 69 6d 65 6f 75 74 2b 2b 20 3e 3d 20 33   nTimeout++ >= 3
164a0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
164b0 20 20 73 71 6c 69 74 65 33 5f 73 6c 65 65 70 28    sqlite3_sleep(
164c0 31 30 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  100);.      }.  
164d0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
164e0 62 61 63 6b 75 70 5f 66 69 6e 69 73 68 28 70 42  backup_finish(pB
164f0 61 63 6b 75 70 29 3b 0a 20 20 20 20 69 66 28 20  ackup);.    if( 
16500 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc==SQLITE_DONE 
16510 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 54 43  ){.      rc = TC
16520 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 20  L_OK;.    }else 
16530 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42  if( rc==SQLITE_B
16540 55 53 59 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54  USY || rc==SQLIT
16550 45 5f 4c 4f 43 4b 45 44 20 29 7b 0a 20 20 20 20  E_LOCKED ){.    
16560 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
16570 6c 74 28 69 6e 74 65 72 70 2c 20 22 72 65 73 74  lt(interp, "rest
16580 6f 72 65 20 66 61 69 6c 65 64 3a 20 73 6f 75 72  ore failed: sour
16590 63 65 20 64 61 74 61 62 61 73 65 20 62 75 73 79  ce database busy
165a0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
165b0 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
165c0 29 30 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  )0);.      rc = 
165d0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
165e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 54 63 6c 5f  else{.      Tcl_
165f0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
16600 65 72 70 2c 20 22 72 65 73 74 6f 72 65 20 66 61  erp, "restore fa
16610 69 6c 65 64 3a 20 22 2c 0a 20 20 20 20 20 20 20  iled: ",.       
16620 20 20 20 20 73 71 6c 69 74 65 33 5f 65 72 72 6d      sqlite3_errm
16630 73 67 28 70 44 62 2d 3e 64 62 29 2c 20 28 63 68  sg(pDb->db), (ch
16640 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 72 63  ar*)0);.      rc
16650 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20   = TCL_ERROR;.  
16660 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
16670 63 6c 6f 73 65 28 70 53 72 63 29 3b 0a 20 20 20  close(pSrc);.   
16680 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
16690 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20 73  *.  **     $db s
166a0 74 61 74 75 73 20 28 73 74 65 70 7c 73 6f 72 74  tatus (step|sort
166b0 7c 61 75 74 6f 69 6e 64 65 78 7c 76 6d 73 74 65  |autoindex|vmste
166c0 70 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 44 69 73  p).  **.  ** Dis
166d0 70 6c 61 79 20 53 51 4c 49 54 45 5f 53 54 4d 54  play SQLITE_STMT
166e0 53 54 41 54 55 53 5f 46 55 4c 4c 53 43 41 4e 5f  STATUS_FULLSCAN_
166f0 53 54 45 50 20 6f 72 0a 20 20 2a 2a 20 53 51 4c  STEP or.  ** SQL
16700 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 53  ITE_STMTSTATUS_S
16710 4f 52 54 20 66 6f 72 20 74 68 65 20 6d 6f 73 74  ORT for the most
16720 20 72 65 63 65 6e 74 20 65 76 61 6c 2e 0a 20 20   recent eval..  
16730 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 53 54 41  */.  case DB_STA
16740 54 55 53 3a 20 7b 0a 20 20 20 20 69 6e 74 20 76  TUS: {.    int v
16750 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
16760 20 2a 7a 4f 70 3b 0a 20 20 20 20 69 66 28 20 6f   *zOp;.    if( o
16770 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20  bjc!=3 ){.      
16780 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
16790 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76  (interp, 2, objv
167a0 2c 20 22 28 73 74 65 70 7c 73 6f 72 74 7c 61 75  , "(step|sort|au
167b0 74 6f 69 6e 64 65 78 29 22 29 3b 0a 20 20 20 20  toindex)");.    
167c0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
167d0 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4f  OR;.    }.    zO
167e0 70 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  p = Tcl_GetStrin
167f0 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 20 20  g(objv[2]);.    
16800 69 66 28 20 73 74 72 63 6d 70 28 7a 4f 70 2c 20  if( strcmp(zOp, 
16810 22 73 74 65 70 22 29 3d 3d 30 20 29 7b 0a 20 20  "step")==0 ){.  
16820 20 20 20 20 76 20 3d 20 70 44 62 2d 3e 6e 53 74      v = pDb->nSt
16830 65 70 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  ep;.    }else if
16840 28 20 73 74 72 63 6d 70 28 7a 4f 70 2c 20 22 73  ( strcmp(zOp, "s
16850 6f 72 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ort")==0 ){.    
16860 20 20 76 20 3d 20 70 44 62 2d 3e 6e 53 6f 72 74    v = pDb->nSort
16870 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
16880 73 74 72 63 6d 70 28 7a 4f 70 2c 20 22 61 75 74  strcmp(zOp, "aut
16890 6f 69 6e 64 65 78 22 29 3d 3d 30 20 29 7b 0a 20  oindex")==0 ){. 
168a0 20 20 20 20 20 76 20 3d 20 70 44 62 2d 3e 6e 49       v = pDb->nI
168b0 6e 64 65 78 3b 0a 20 20 20 20 7d 65 6c 73 65 20  ndex;.    }else 
168c0 69 66 28 20 73 74 72 63 6d 70 28 7a 4f 70 2c 20  if( strcmp(zOp, 
168d0 22 76 6d 73 74 65 70 22 29 3d 3d 30 20 29 7b 0a  "vmstep")==0 ){.
168e0 20 20 20 20 20 20 76 20 3d 20 70 44 62 2d 3e 6e        v = pDb->n
168f0 56 4d 53 74 65 70 3b 0a 20 20 20 20 7d 65 6c 73  VMStep;.    }els
16900 65 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70  e{.      Tcl_App
16910 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
16920 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 62  ,.            "b
16930 61 64 20 61 72 67 75 6d 65 6e 74 3a 20 73 68 6f  ad argument: sho
16940 75 6c 64 20 62 65 20 61 75 74 6f 69 6e 64 65 78  uld be autoindex
16950 2c 20 73 74 65 70 2c 20 73 6f 72 74 20 6f 72 20  , step, sort or 
16960 76 6d 73 74 65 70 22 2c 0a 20 20 20 20 20 20 20  vmstep",.       
16970 20 20 20 20 20 28 63 68 61 72 2a 29 30 29 3b 0a       (char*)0);.
16980 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
16990 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
169a0 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
169b0 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
169c0 65 77 49 6e 74 4f 62 6a 28 76 29 29 3b 0a 20 20  ewIntObj(v));.  
169d0 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
169e0 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20  /*.  **     $db 
169f0 74 69 6d 65 6f 75 74 20 4d 49 4c 4c 45 53 45 43  timeout MILLESEC
16a00 4f 4e 44 53 0a 20 20 2a 2a 0a 20 20 2a 2a 20 44  ONDS.  **.  ** D
16a10 65 6c 61 79 20 66 6f 72 20 74 68 65 20 6e 75 6d  elay for the num
16a20 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f  ber of milliseco
16a30 6e 64 73 20 73 70 65 63 69 66 69 65 64 20 77 68  nds specified wh
16a40 65 6e 20 61 20 66 69 6c 65 20 69 73 20 6c 6f 63  en a file is loc
16a50 6b 65 64 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  ked..  */.  case
16a60 20 44 42 5f 54 49 4d 45 4f 55 54 3a 20 7b 0a 20   DB_TIMEOUT: {. 
16a70 20 20 20 69 6e 74 20 6d 73 3b 0a 20 20 20 20 69     int ms;.    i
16a80 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20  f( objc!=3 ){.  
16a90 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
16aa0 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20  Args(interp, 2, 
16ab0 6f 62 6a 76 2c 20 22 4d 49 4c 4c 49 53 45 43 4f  objv, "MILLISECO
16ac0 4e 44 53 22 29 3b 0a 20 20 20 20 20 20 72 65 74  NDS");.      ret
16ad0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
16ae0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 54 63 6c     }.    if( Tcl
16af0 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
16b00 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20  nterp, objv[2], 
16b10 26 6d 73 29 20 29 20 72 65 74 75 72 6e 20 54 43  &ms) ) return TC
16b20 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 73 71 6c  L_ERROR;.    sql
16b30 69 74 65 33 5f 62 75 73 79 5f 74 69 6d 65 6f 75  ite3_busy_timeou
16b40 74 28 70 44 62 2d 3e 64 62 2c 20 6d 73 29 3b 0a  t(pDb->db, ms);.
16b50 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
16b60 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64    /*.  **     $d
16b70 62 20 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73 0a  b total_changes.
16b80 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e    **.  ** Return
16b90 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
16ba0 6f 77 73 20 74 68 61 74 20 77 65 72 65 20 6d 6f  ows that were mo
16bb0 64 69 66 69 65 64 2c 20 69 6e 73 65 72 74 65 64  dified, inserted
16bc0 2c 20 6f 72 20 64 65 6c 65 74 65 64 0a 20 20 2a  , or deleted.  *
16bd0 2a 20 73 69 6e 63 65 20 74 68 65 20 64 61 74 61  * since the data
16be0 62 61 73 65 20 68 61 6e 64 6c 65 20 77 61 73 20  base handle was 
16bf0 63 72 65 61 74 65 64 2e 0a 20 20 2a 2f 0a 20 20  created..  */.  
16c00 63 61 73 65 20 44 42 5f 54 4f 54 41 4c 5f 43 48  case DB_TOTAL_CH
16c10 41 4e 47 45 53 3a 20 7b 0a 20 20 20 20 54 63 6c  ANGES: {.    Tcl
16c20 5f 4f 62 6a 20 2a 70 52 65 73 75 6c 74 3b 0a 20  _Obj *pResult;. 
16c30 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29     if( objc!=2 )
16c40 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e  {.      Tcl_Wron
16c50 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
16c60 20 32 2c 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 20   2, objv, "");. 
16c70 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
16c80 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
16c90 20 70 52 65 73 75 6c 74 20 3d 20 54 63 6c 5f 47   pResult = Tcl_G
16ca0 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
16cb0 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74  rp);.    Tcl_Set
16cc0 49 6e 74 4f 62 6a 28 70 52 65 73 75 6c 74 2c 20  IntObj(pResult, 
16cd0 73 71 6c 69 74 65 33 5f 74 6f 74 61 6c 5f 63 68  sqlite3_total_ch
16ce0 61 6e 67 65 73 28 70 44 62 2d 3e 64 62 29 29 3b  anges(pDb->db));
16cf0 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
16d00 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 74 72 61  .  /*    $db tra
16d10 63 65 20 3f 43 41 4c 4c 42 41 43 4b 3f 0a 20 20  ce ?CALLBACK?.  
16d20 2a 2a 0a 20 20 2a 2a 20 4d 61 6b 65 20 61 72 72  **.  ** Make arr
16d30 61 6e 67 65 6d 65 6e 74 73 20 74 6f 20 69 6e 76  angements to inv
16d40 6f 6b 65 20 74 68 65 20 43 41 4c 4c 42 41 43 4b  oke the CALLBACK
16d50 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 65 61 63   routine for eac
16d60 68 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 0a  h SQL statement.
16d70 20 20 2a 2a 20 74 68 61 74 20 69 73 20 65 78 65    ** that is exe
16d80 63 75 74 65 64 2e 20 20 54 68 65 20 74 65 78 74  cuted.  The text
16d90 20 6f 66 20 74 68 65 20 53 51 4c 20 69 73 20 61   of the SQL is a
16da0 70 70 65 6e 64 65 64 20 74 6f 20 43 41 4c 4c 42  ppended to CALLB
16db0 41 43 4b 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20  ACK before.  ** 
16dc0 69 74 20 69 73 20 65 78 65 63 75 74 65 64 2e 0a  it is executed..
16dd0 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 54    */.  case DB_T
16de0 52 41 43 45 3a 20 7b 0a 20 20 20 20 69 66 28 20  RACE: {.    if( 
16df0 6f 62 6a 63 3e 33 20 29 7b 0a 20 20 20 20 20 20  objc>3 ){.      
16e00 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
16e10 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76  (interp, 2, objv
16e20 2c 20 22 3f 43 41 4c 4c 42 41 43 4b 3f 22 29 3b  , "?CALLBACK?");
16e30 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
16e40 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c  L_ERROR;.    }el
16e50 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29  se if( objc==2 )
16e60 7b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d  {.      if( pDb-
16e70 3e 7a 54 72 61 63 65 20 29 7b 0a 20 20 20 20 20  >zTrace ){.     
16e80 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
16e90 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 44 62 2d  ult(interp, pDb-
16ea0 3e 7a 54 72 61 63 65 2c 20 28 63 68 61 72 2a 29  >zTrace, (char*)
16eb0 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
16ec0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61  }else{.      cha
16ed0 72 20 2a 7a 54 72 61 63 65 3b 0a 20 20 20 20 20  r *zTrace;.     
16ee0 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20   int len;.      
16ef0 69 66 28 20 70 44 62 2d 3e 7a 54 72 61 63 65 20  if( pDb->zTrace 
16f00 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 46  ){.        Tcl_F
16f10 72 65 65 28 70 44 62 2d 3e 7a 54 72 61 63 65 29  ree(pDb->zTrace)
16f20 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
16f30 7a 54 72 61 63 65 20 3d 20 54 63 6c 5f 47 65 74  zTrace = Tcl_Get
16f40 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
16f50 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20  jv[2], &len);.  
16f60 20 20 20 20 69 66 28 20 7a 54 72 61 63 65 20 26      if( zTrace &
16f70 26 20 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20  & len>0 ){.     
16f80 20 20 20 70 44 62 2d 3e 7a 54 72 61 63 65 20 3d     pDb->zTrace =
16f90 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20   Tcl_Alloc( len 
16fa0 2b 20 31 20 29 3b 0a 20 20 20 20 20 20 20 20 6d  + 1 );.        m
16fb0 65 6d 63 70 79 28 70 44 62 2d 3e 7a 54 72 61 63  emcpy(pDb->zTrac
16fc0 65 2c 20 7a 54 72 61 63 65 2c 20 6c 65 6e 2b 31  e, zTrace, len+1
16fd0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
16fe0 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 54 72          pDb->zTr
16ff0 61 63 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ace = 0;.      }
17000 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
17010 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 29  LITE_OMIT_TRACE)
17020 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
17030 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e  ITE_OMIT_FLOATIN
17040 47 5f 50 4f 49 4e 54 29 20 26 26 20 5c 0a 20 20  G_POINT) && \.  
17050 20 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54    !defined(SQLIT
17060 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41 54 45  E_OMIT_DEPRECATE
17070 44 29 0a 20 20 20 20 20 20 69 66 28 20 70 44 62  D).      if( pDb
17080 2d 3e 7a 54 72 61 63 65 20 29 7b 0a 20 20 20 20  ->zTrace ){.    
17090 20 20 20 20 70 44 62 2d 3e 69 6e 74 65 72 70 20      pDb->interp 
170a0 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 20 20  = interp;.      
170b0 20 20 73 71 6c 69 74 65 33 5f 74 72 61 63 65 28    sqlite3_trace(
170c0 70 44 62 2d 3e 64 62 2c 20 44 62 54 72 61 63 65  pDb->db, DbTrace
170d0 48 61 6e 64 6c 65 72 2c 20 70 44 62 29 3b 0a 20  Handler, pDb);. 
170e0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
170f0 20 20 20 20 73 71 6c 69 74 65 33 5f 74 72 61 63      sqlite3_trac
17100 65 28 70 44 62 2d 3e 64 62 2c 20 30 2c 20 30 29  e(pDb->db, 0, 0)
17110 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
17120 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b  .    }.    break
17130 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24  ;.  }..  /*    $
17140 64 62 20 74 72 61 63 65 5f 76 32 20 3f 43 41 4c  db trace_v2 ?CAL
17150 4c 42 41 43 4b 3f 20 3f 4d 41 53 4b 3f 0a 20 20  LBACK? ?MASK?.  
17160 2a 2a 0a 20 20 2a 2a 20 4d 61 6b 65 20 61 72 72  **.  ** Make arr
17170 61 6e 67 65 6d 65 6e 74 73 20 74 6f 20 69 6e 76  angements to inv
17180 6f 6b 65 20 74 68 65 20 43 41 4c 4c 42 41 43 4b  oke the CALLBACK
17190 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 65 61 63   routine for eac
171a0 68 20 74 72 61 63 65 20 65 76 65 6e 74 0a 20 20  h trace event.  
171b0 2a 2a 20 6d 61 74 63 68 69 6e 67 20 74 68 65 20  ** matching the 
171c0 6d 61 73 6b 20 74 68 61 74 20 69 73 20 67 65 6e  mask that is gen
171d0 65 72 61 74 65 64 2e 20 20 54 68 65 20 70 61 72  erated.  The par
171e0 61 6d 65 74 65 72 73 20 61 72 65 20 61 70 70 65  ameters are appe
171f0 6e 64 65 64 20 74 6f 0a 20 20 2a 2a 20 43 41 4c  nded to.  ** CAL
17200 4c 42 41 43 4b 20 62 65 66 6f 72 65 20 69 74 20  LBACK before it 
17210 69 73 20 65 78 65 63 75 74 65 64 2e 0a 20 20 2a  is executed..  *
17220 2f 0a 20 20 63 61 73 65 20 44 42 5f 54 52 41 43  /.  case DB_TRAC
17230 45 5f 56 32 3a 20 7b 0a 20 20 20 20 69 66 28 20  E_V2: {.    if( 
17240 6f 62 6a 63 3e 34 20 29 7b 0a 20 20 20 20 20 20  objc>4 ){.      
17250 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
17260 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76  (interp, 2, objv
17270 2c 20 22 3f 43 41 4c 4c 42 41 43 4b 3f 20 3f 4d  , "?CALLBACK? ?M
17280 41 53 4b 3f 22 29 3b 0a 20 20 20 20 20 20 72 65  ASK?");.      re
17290 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
172a0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 62      }else if( ob
172b0 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 69  jc==2 ){.      i
172c0 66 28 20 70 44 62 2d 3e 7a 54 72 61 63 65 56 32  f( pDb->zTraceV2
172d0 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f   ){.        Tcl_
172e0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
172f0 65 72 70 2c 20 70 44 62 2d 3e 7a 54 72 61 63 65  erp, pDb->zTrace
17300 56 32 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20  V2, (char*)0);. 
17310 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
17320 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54  {.      char *zT
17330 72 61 63 65 56 32 3b 0a 20 20 20 20 20 20 69 6e  raceV2;.      in
17340 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20 54 63 6c  t len;.      Tcl
17350 5f 57 69 64 65 49 6e 74 20 77 4d 61 73 6b 20 3d  _WideInt wMask =
17360 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 62   0;.      if( ob
17370 6a 63 3d 3d 34 20 29 7b 0a 20 20 20 20 20 20 20  jc==4 ){.       
17380 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68   static const ch
17390 61 72 20 2a 54 54 59 50 45 5f 73 74 72 73 5b 5d  ar *TTYPE_strs[]
173a0 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 20 20 22   = {.          "
173b0 73 74 61 74 65 6d 65 6e 74 22 2c 20 22 70 72 6f  statement", "pro
173c0 66 69 6c 65 22 2c 20 22 72 6f 77 22 2c 20 22 63  file", "row", "c
173d0 6c 6f 73 65 22 2c 20 30 0a 20 20 20 20 20 20 20  lose", 0.       
173e0 20 7d 3b 0a 20 20 20 20 20 20 20 20 65 6e 75 6d   };.        enum
173f0 20 54 54 59 50 45 5f 65 6e 75 6d 20 7b 0a 20 20   TTYPE_enum {.  
17400 20 20 20 20 20 20 20 20 54 54 59 50 45 5f 53 54          TTYPE_ST
17410 4d 54 2c 20 54 54 59 50 45 5f 50 52 4f 46 49 4c  MT, TTYPE_PROFIL
17420 45 2c 20 54 54 59 50 45 5f 52 4f 57 2c 20 54 54  E, TTYPE_ROW, TT
17430 59 50 45 5f 43 4c 4f 53 45 0a 20 20 20 20 20 20  YPE_CLOSE.      
17440 20 20 7d 3b 0a 20 20 20 20 20 20 20 20 69 6e 74    };.        int
17450 20 69 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   i;.        if( 
17460 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 4c 69 73 74  TCL_OK!=Tcl_List
17470 4f 62 6a 4c 65 6e 67 74 68 28 69 6e 74 65 72 70  ObjLength(interp
17480 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 6c 65 6e 29  , objv[3], &len)
17490 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
174a0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
174b0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
174c0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6e    for(i=0; i<len
174d0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
174e0 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 4f 62 6a 3b    Tcl_Obj *pObj;
174f0 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 74  .          int t
17500 74 79 70 65 3b 0a 20 20 20 20 20 20 20 20 20 20  type;.          
17510 69 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f  if( TCL_OK!=Tcl_
17520 4c 69 73 74 4f 62 6a 49 6e 64 65 78 28 69 6e 74  ListObjIndex(int
17530 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 69 2c  erp, objv[3], i,
17540 20 26 70 4f 62 6a 29 20 29 7b 0a 20 20 20 20 20   &pObj) ){.     
17550 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43         return TC
17560 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20  L_ERROR;.       
17570 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
17580 66 28 20 54 63 6c 5f 47 65 74 49 6e 64 65 78 46  f( Tcl_GetIndexF
17590 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 70  romObj(interp, p
175a0 4f 62 6a 2c 20 54 54 59 50 45 5f 73 74 72 73 2c  Obj, TTYPE_strs,
175b0 20 22 74 72 61 63 65 20 74 79 70 65 22 2c 0a 20   "trace type",. 
175c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
175d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
175e0 20 30 2c 20 26 74 74 79 70 65 29 21 3d 54 43 4c   0, &ttype)!=TCL
175f0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
17600 20 20 20 54 63 6c 5f 57 69 64 65 49 6e 74 20 77     Tcl_WideInt w
17610 54 79 70 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Type;.          
17620 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 45 72 72 6f    Tcl_Obj *pErro
17630 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74  r = Tcl_Duplicat
17640 65 4f 62 6a 28 54 63 6c 5f 47 65 74 4f 62 6a 52  eObj(Tcl_GetObjR
17650 65 73 75 6c 74 28 69 6e 74 65 72 70 29 29 3b 0a  esult(interp));.
17660 20 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f              Tcl_
17670 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 45 72  IncrRefCount(pEr
17680 72 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ror);.          
17690 20 20 69 66 28 20 54 43 4c 5f 4f 4b 3d 3d 54 63    if( TCL_OK==Tc
176a0 6c 5f 47 65 74 57 69 64 65 49 6e 74 46 72 6f 6d  l_GetWideIntFrom
176b0 4f 62 6a 28 69 6e 74 65 72 70 2c 20 70 4f 62 6a  Obj(interp, pObj
176c0 2c 20 26 77 54 79 70 65 29 20 29 7b 0a 20 20 20  , &wType) ){.   
176d0 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 44             Tcl_D
176e0 65 63 72 52 65 66 43 6f 75 6e 74 28 70 45 72 72  ecrRefCount(pErr
176f0 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  or);.           
17700 20 20 20 77 4d 61 73 6b 20 7c 3d 20 77 54 79 70     wMask |= wTyp
17710 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  e;.            }
17720 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
17730 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65      Tcl_SetObjRe
17740 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 45 72  sult(interp, pEr
17750 72 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ror);.          
17760 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
17770 6f 75 6e 74 28 70 45 72 72 6f 72 29 3b 0a 20 20  ount(pError);.  
17780 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
17790 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
177a0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
177b0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
177c0 20 20 20 20 20 20 20 20 20 73 77 69 74 63 68 28           switch(
177d0 20 28 65 6e 75 6d 20 54 54 59 50 45 5f 65 6e 75   (enum TTYPE_enu
177e0 6d 29 74 74 79 70 65 20 29 7b 0a 20 20 20 20 20  m)ttype ){.     
177f0 20 20 20 20 20 20 20 20 20 63 61 73 65 20 54 54           case TT
17800 59 50 45 5f 53 54 4d 54 3a 20 20 20 20 77 4d 61  YPE_STMT:    wMa
17810 73 6b 20 7c 3d 20 53 51 4c 49 54 45 5f 54 52 41  sk |= SQLITE_TRA
17820 43 45 5f 53 54 4d 54 3b 20 20 20 20 62 72 65 61  CE_STMT;    brea
17830 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  k;.             
17840 20 63 61 73 65 20 54 54 59 50 45 5f 50 52 4f 46   case TTYPE_PROF
17850 49 4c 45 3a 20 77 4d 61 73 6b 20 7c 3d 20 53 51  ILE: wMask |= SQ
17860 4c 49 54 45 5f 54 52 41 43 45 5f 50 52 4f 46 49  LITE_TRACE_PROFI
17870 4c 45 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  LE; break;.     
17880 20 20 20 20 20 20 20 20 20 63 61 73 65 20 54 54           case TT
17890 59 50 45 5f 52 4f 57 3a 20 20 20 20 20 77 4d 61  YPE_ROW:     wMa
178a0 73 6b 20 7c 3d 20 53 51 4c 49 54 45 5f 54 52 41  sk |= SQLITE_TRA
178b0 43 45 5f 52 4f 57 3b 20 20 20 20 20 62 72 65 61  CE_ROW;     brea
178c0 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  k;.             
178d0 20 63 61 73 65 20 54 54 59 50 45 5f 43 4c 4f 53   case TTYPE_CLOS
178e0 45 3a 20 20 20 77 4d 61 73 6b 20 7c 3d 20 53 51  E:   wMask |= SQ
178f0 4c 49 54 45 5f 54 52 41 43 45 5f 43 4c 4f 53 45  LITE_TRACE_CLOSE
17900 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ;   break;.     
17910 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
17920 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
17930 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
17940 20 20 20 20 77 4d 61 73 6b 20 3d 20 53 51 4c 49      wMask = SQLI
17950 54 45 5f 54 52 41 43 45 5f 53 54 4d 54 3b 20 2f  TE_TRACE_STMT; /
17960 2a 20 75 73 65 20 74 68 65 20 22 6c 65 67 61 63  * use the "legac
17970 79 22 20 64 65 66 61 75 6c 74 20 2a 2f 0a 20 20  y" default */.  
17980 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
17990 70 44 62 2d 3e 7a 54 72 61 63 65 56 32 20 29 7b  pDb->zTraceV2 ){
179a0 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 46 72 65  .        Tcl_Fre
179b0 65 28 70 44 62 2d 3e 7a 54 72 61 63 65 56 32 29  e(pDb->zTraceV2)
179c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
179d0 7a 54 72 61 63 65 56 32 20 3d 20 54 63 6c 5f 47  zTraceV2 = Tcl_G
179e0 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
179f0 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a  objv[2], &len);.
17a00 20 20 20 20 20 20 69 66 28 20 7a 54 72 61 63 65        if( zTrace
17a10 56 32 20 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20  V2 && len>0 ){. 
17a20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 54 72 61         pDb->zTra
17a30 63 65 56 32 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63  ceV2 = Tcl_Alloc
17a40 28 20 6c 65 6e 20 2b 20 31 20 29 3b 0a 20 20 20  ( len + 1 );.   
17a50 20 20 20 20 20 6d 65 6d 63 70 79 28 70 44 62 2d       memcpy(pDb-
17a60 3e 7a 54 72 61 63 65 56 32 2c 20 7a 54 72 61 63  >zTraceV2, zTrac
17a70 65 56 32 2c 20 6c 65 6e 2b 31 29 3b 0a 20 20 20  eV2, len+1);.   
17a80 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
17a90 20 20 70 44 62 2d 3e 7a 54 72 61 63 65 56 32 20    pDb->zTraceV2 
17aa0 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66  = 0;.      }.#if
17ab0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
17ac0 5f 4f 4d 49 54 5f 54 52 41 43 45 29 20 26 26 20  _OMIT_TRACE) && 
17ad0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
17ae0 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f  OMIT_FLOATING_PO
17af0 49 4e 54 29 0a 20 20 20 20 20 20 69 66 28 20 70  INT).      if( p
17b00 44 62 2d 3e 7a 54 72 61 63 65 56 32 20 29 7b 0a  Db->zTraceV2 ){.
17b10 20 20 20 20 20 20 20 20 70 44 62 2d 3e 69 6e 74          pDb->int
17b20 65 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20  erp = interp;.  
17b30 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 74 72        sqlite3_tr
17b40 61 63 65 5f 76 32 28 70 44 62 2d 3e 64 62 2c 20  ace_v2(pDb->db, 
17b50 28 75 6e 73 69 67 6e 65 64 29 77 4d 61 73 6b 2c  (unsigned)wMask,
17b60 20 44 62 54 72 61 63 65 56 32 48 61 6e 64 6c 65   DbTraceV2Handle
17b70 72 2c 20 70 44 62 29 3b 0a 20 20 20 20 20 20 7d  r, pDb);.      }
17b80 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
17b90 6c 69 74 65 33 5f 74 72 61 63 65 5f 76 32 28 70  lite3_trace_v2(p
17ba0 44 62 2d 3e 64 62 2c 20 30 2c 20 30 2c 20 30 29  Db->db, 0, 0, 0)
17bb0 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
17bc0 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b  .    }.    break
17bd0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24  ;.  }..  /*    $
17be0 64 62 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 5b  db transaction [
17bf0 2d 64 65 66 65 72 72 65 64 7c 2d 69 6d 6d 65 64  -deferred|-immed
17c00 69 61 74 65 7c 2d 65 78 63 6c 75 73 69 76 65 5d  iate|-exclusive]
17c10 20 53 43 52 49 50 54 0a 20 20 2a 2a 0a 20 20 2a   SCRIPT.  **.  *
17c20 2a 20 53 74 61 72 74 20 61 20 6e 65 77 20 74 72  * Start a new tr
17c30 61 6e 73 61 63 74 69 6f 6e 20 28 69 66 20 77 65  ansaction (if we
17c40 20 61 72 65 20 6e 6f 74 20 61 6c 72 65 61 64 79   are not already
17c50 20 69 6e 20 74 68 65 20 6d 69 64 73 74 20 6f 66   in the midst of
17c60 20 61 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74   a.  ** transact
17c70 69 6f 6e 29 20 61 6e 64 20 65 78 65 63 75 74 65  ion) and execute
17c80 20 74 68 65 20 54 43 4c 20 73 63 72 69 70 74 20   the TCL script 
17c90 53 43 52 49 50 54 2e 20 20 41 66 74 65 72 20 53  SCRIPT.  After S
17ca0 43 52 49 50 54 0a 20 20 2a 2a 20 63 6f 6d 70 6c  CRIPT.  ** compl
17cb0 65 74 65 73 2c 20 65 69 74 68 65 72 20 63 6f 6d  etes, either com
17cc0 6d 69 74 20 74 68 65 20 74 72 61 6e 73 61 63 74  mit the transact
17cd0 69 6f 6e 20 6f 72 20 72 6f 6c 6c 20 69 74 20 62  ion or roll it b
17ce0 61 63 6b 20 69 66 20 53 43 52 49 50 54 0a 20 20  ack if SCRIPT.  
17cf0 2a 2a 20 74 68 72 6f 77 73 20 61 6e 20 65 78 63  ** throws an exc
17d00 65 70 74 69 6f 6e 2e 20 20 4f 72 20 69 66 20 6e  eption.  Or if n
17d10 6f 20 6e 65 77 20 74 72 61 6e 73 61 74 69 6f 6e  o new transation
17d20 20 77 61 73 20 73 74 61 72 74 65 64 2c 20 64 6f   was started, do
17d30 20 6e 6f 74 68 69 6e 67 2e 0a 20 20 2a 2a 20 70   nothing..  ** p
17d40 61 73 73 20 74 68 65 20 65 78 63 65 70 74 69 6f  ass the exceptio
17d50 6e 20 6f 6e 20 75 70 20 74 68 65 20 73 74 61 63  n on up the stac
17d60 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69  k..  **.  ** Thi
17d70 73 20 63 6f 6d 6d 61 6e 64 20 77 61 73 20 69 6e  s command was in
17d80 73 70 69 72 65 64 20 62 79 20 44 61 76 65 20 54  spired by Dave T
17d90 68 6f 6d 61 73 27 73 20 74 61 6c 6b 20 6f 6e 20  homas's talk on 
17da0 52 75 62 79 20 61 74 20 74 68 65 0a 20 20 2a 2a  Ruby at the.  **
17db0 20 32 30 30 35 20 4f 27 52 65 69 6c 6c 79 20 4f   2005 O'Reilly O
17dc0 70 65 6e 20 53 6f 75 72 63 65 20 43 6f 6e 76 65  pen Source Conve
17dd0 6e 74 69 6f 6e 20 28 4f 53 43 4f 4e 29 2e 0a 20  ntion (OSCON).. 
17de0 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 54 52   */.  case DB_TR
17df0 41 4e 53 41 43 54 49 4f 4e 3a 20 7b 0a 20 20 20  ANSACTION: {.   
17e00 20 54 63 6c 5f 4f 62 6a 20 2a 70 53 63 72 69 70   Tcl_Obj *pScrip
17e10 74 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  t;.    const cha
17e20 72 20 2a 7a 42 65 67 69 6e 20 3d 20 22 53 41 56  r *zBegin = "SAV
17e30 45 50 4f 49 4e 54 20 5f 74 63 6c 5f 74 72 61 6e  EPOINT _tcl_tran
17e40 73 61 63 74 69 6f 6e 22 3b 0a 20 20 20 20 69 66  saction";.    if
17e50 28 20 6f 62 6a 63 21 3d 33 20 26 26 20 6f 62 6a  ( objc!=3 && obj
17e60 63 21 3d 34 20 29 7b 0a 20 20 20 20 20 20 54 63  c!=4 ){.      Tc
17e70 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
17e80 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
17e90 22 5b 54 59 50 45 5d 20 53 43 52 49 50 54 22 29  "[TYPE] SCRIPT")
17ea0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
17eb0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
17ec0 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e 6e 54  .    if( pDb->nT
17ed0 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 30 20 26 26  ransaction==0 &&
17ee0 20 6f 62 6a 63 3d 3d 34 20 29 7b 0a 20 20 20 20   objc==4 ){.    
17ef0 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63    static const c
17f00 68 61 72 20 2a 54 54 59 50 45 5f 73 74 72 73 5b  har *TTYPE_strs[
17f10 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 22 64  ] = {.        "d
17f20 65 66 65 72 72 65 64 22 2c 20 20 20 22 65 78 63  eferred",   "exc
17f30 6c 75 73 69 76 65 22 2c 20 20 22 69 6d 6d 65 64  lusive",  "immed
17f40 69 61 74 65 22 2c 20 30 0a 20 20 20 20 20 20 7d  iate", 0.      }
17f50 3b 0a 20 20 20 20 20 20 65 6e 75 6d 20 54 54 59  ;.      enum TTY
17f60 50 45 5f 65 6e 75 6d 20 7b 0a 20 20 20 20 20 20  PE_enum {.      
17f70 20 20 54 54 59 50 45 5f 44 45 46 45 52 52 45 44    TTYPE_DEFERRED
17f80 2c 20 54 54 59 50 45 5f 45 58 43 4c 55 53 49 56  , TTYPE_EXCLUSIV
17f90 45 2c 20 54 54 59 50 45 5f 49 4d 4d 45 44 49 41  E, TTYPE_IMMEDIA
17fa0 54 45 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20  TE.      };.    
17fb0 20 20 69 6e 74 20 74 74 79 70 65 3b 0a 20 20 20    int ttype;.   
17fc0 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e     if( Tcl_GetIn
17fd0 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  dexFromObj(inter
17fe0 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 54 54 59 50  p, objv[2], TTYP
17ff0 45 5f 73 74 72 73 2c 20 22 74 72 61 6e 73 61 63  E_strs, "transac
18000 74 69 6f 6e 20 74 79 70 65 22 2c 0a 20 20 20 20  tion type",.    
18010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18020 20 20 20 20 20 20 20 20 20 20 30 2c 20 26 74 74            0, &tt
18030 79 70 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ype) ){.        
18040 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
18050 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
18060 73 77 69 74 63 68 28 20 28 65 6e 75 6d 20 54 54  switch( (enum TT
18070 59 50 45 5f 65 6e 75 6d 29 74 74 79 70 65 20 29  YPE_enum)ttype )
18080 7b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 54  {.        case T
18090 54 59 50 45 5f 44 45 46 45 52 52 45 44 3a 20 20  TYPE_DEFERRED:  
180a0 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 3b 20 20    /* no-op */;  
180b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
180c0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61  reak;.        ca
180d0 73 65 20 54 54 59 50 45 5f 45 58 43 4c 55 53 49  se TTYPE_EXCLUSI
180e0 56 45 3a 20 20 20 7a 42 65 67 69 6e 20 3d 20 22  VE:   zBegin = "
180f0 42 45 47 49 4e 20 45 58 43 4c 55 53 49 56 45 22  BEGIN EXCLUSIVE"
18100 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  ;  break;.      
18110 20 20 63 61 73 65 20 54 54 59 50 45 5f 49 4d 4d    case TTYPE_IMM
18120 45 44 49 41 54 45 3a 20 20 20 7a 42 65 67 69 6e  EDIATE:   zBegin
18130 20 3d 20 22 42 45 47 49 4e 20 49 4d 4d 45 44 49   = "BEGIN IMMEDI
18140 41 54 45 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20  ATE";  break;.  
18150 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
18160 70 53 63 72 69 70 74 20 3d 20 6f 62 6a 76 5b 6f  pScript = objv[o
18170 62 6a 63 2d 31 5d 3b 0a 0a 20 20 20 20 2f 2a 20  bjc-1];..    /* 
18180 52 75 6e 20 74 68 65 20 53 51 4c 69 74 65 20 42  Run the SQLite B
18190 45 47 49 4e 20 63 6f 6d 6d 61 6e 64 20 74 6f 20  EGIN command to 
181a0 6f 70 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69  open a transacti
181b0 6f 6e 20 6f 72 20 73 61 76 65 70 6f 69 6e 74 2e  on or savepoint.
181c0 20 2a 2f 0a 20 20 20 20 70 44 62 2d 3e 64 69 73   */.    pDb->dis
181d0 61 62 6c 65 41 75 74 68 2b 2b 3b 0a 20 20 20 20  ableAuth++;.    
181e0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65  rc = sqlite3_exe
181f0 63 28 70 44 62 2d 3e 64 62 2c 20 7a 42 65 67 69  c(pDb->db, zBegi
18200 6e 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  n, 0, 0, 0);.   
18210 20 70 44 62 2d 3e 64 69 73 61 62 6c 65 41 75 74   pDb->disableAut
18220 68 2d 2d 3b 0a 20 20 20 20 69 66 28 20 72 63 21  h--;.    if( rc!
18230 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
18240 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
18250 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 73 71 6c  sult(interp, sql
18260 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d  ite3_errmsg(pDb-
18270 3e 64 62 29 2c 20 28 63 68 61 72 2a 29 30 29 3b  >db), (char*)0);
18280 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
18290 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
182a0 20 20 20 70 44 62 2d 3e 6e 54 72 61 6e 73 61 63     pDb->nTransac
182b0 74 69 6f 6e 2b 2b 3b 0a 0a 20 20 20 20 2f 2a 20  tion++;..    /* 
182c0 49 66 20 75 73 69 6e 67 20 4e 52 45 2c 20 73 63  If using NRE, sc
182d0 68 65 64 75 6c 65 20 61 20 63 61 6c 6c 62 61 63  hedule a callbac
182e0 6b 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20  k to invoke the 
182f0 73 63 72 69 70 74 20 70 53 63 72 69 70 74 2c 20  script pScript, 
18300 74 68 65 6e 0a 20 20 20 20 2a 2a 20 61 20 73 65  then.    ** a se
18310 63 6f 6e 64 20 63 61 6c 6c 62 61 63 6b 20 74 6f  cond callback to
18320 20 63 6f 6d 6d 69 74 20 28 6f 72 20 72 6f 6c 6c   commit (or roll
18330 62 61 63 6b 29 20 74 68 65 20 74 72 61 6e 73 61  back) the transa
18340 63 74 69 6f 6e 20 6f 72 20 73 61 76 65 70 6f 69  ction or savepoi
18350 6e 74 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 65 64  nt.    ** opened
18360 20 61 62 6f 76 65 2e 20 49 66 20 6e 6f 74 20 75   above. If not u
18370 73 69 6e 67 20 4e 52 45 2c 20 65 76 61 6c 75 61  sing NRE, evalua
18380 74 65 20 74 68 65 20 73 63 72 69 70 74 20 64 69  te the script di
18390 72 65 63 74 6c 79 2c 20 74 68 65 6e 0a 20 20 20  rectly, then.   
183a0 20 2a 2a 20 63 61 6c 6c 20 66 75 6e 63 74 69 6f   ** call functio
183b0 6e 20 44 62 54 72 61 6e 73 50 6f 73 74 43 6d 64  n DbTransPostCmd
183c0 28 29 20 74 6f 20 63 6f 6d 6d 69 74 20 28 6f 72  () to commit (or
183d0 20 72 6f 6c 6c 62 61 63 6b 29 20 74 68 65 20 74   rollback) the t
183e0 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 20 20 2a  ransaction.    *
183f0 2a 20 6f 72 20 73 61 76 65 70 6f 69 6e 74 2e 20  * or savepoint. 
18400 20 2a 2f 0a 20 20 20 20 69 66 28 20 44 62 55 73   */.    if( DbUs
18410 65 4e 72 65 28 29 20 29 7b 0a 20 20 20 20 20 20  eNre() ){.      
18420 54 63 6c 5f 4e 52 41 64 64 43 61 6c 6c 62 61 63  Tcl_NRAddCallbac
18430 6b 28 69 6e 74 65 72 70 2c 20 44 62 54 72 61 6e  k(interp, DbTran
18440 73 50 6f 73 74 43 6d 64 2c 20 63 64 2c 20 30 2c  sPostCmd, cd, 0,
18450 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 28 76   0, 0);.      (v
18460 6f 69 64 29 54 63 6c 5f 4e 52 45 76 61 6c 4f 62  oid)Tcl_NREvalOb
18470 6a 28 69 6e 74 65 72 70 2c 20 70 53 63 72 69 70  j(interp, pScrip
18480 74 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65  t, 0);.    }else
18490 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 44 62 54  {.      rc = DbT
184a0 72 61 6e 73 50 6f 73 74 43 6d 64 28 26 63 64 2c  ransPostCmd(&cd,
184b0 20 69 6e 74 65 72 70 2c 20 54 63 6c 5f 45 76 61   interp, Tcl_Eva
184c0 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c 20 70  lObjEx(interp, p
184d0 53 63 72 69 70 74 2c 20 30 29 29 3b 0a 20 20 20  Script, 0));.   
184e0 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20   }.    break;.  
184f0 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20  }..  /*.  **    
18500 24 64 62 20 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66  $db unlock_notif
18510 79 20 3f 73 63 72 69 70 74 3f 0a 20 20 2a 2f 0a  y ?script?.  */.
18520 20 20 63 61 73 65 20 44 42 5f 55 4e 4c 4f 43 4b    case DB_UNLOCK
18530 5f 4e 4f 54 49 46 59 3a 20 7b 0a 23 69 66 6e 64  _NOTIFY: {.#ifnd
18540 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
18550 5f 55 4e 4c 4f 43 4b 5f 4e 4f 54 49 46 59 0a 20  _UNLOCK_NOTIFY. 
18560 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
18570 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 6c  ult(interp, "unl
18580 6f 63 6b 5f 6e 6f 74 69 66 79 20 6e 6f 74 20 61  ock_notify not a
18590 76 61 69 6c 61 62 6c 65 20 69 6e 20 74 68 69 73  vailable in this
185a0 20 62 75 69 6c 64 22 2c 0a 20 20 20 20 20 20 20   build",.       
185b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
185c0 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 72 63 20  har*)0);.    rc 
185d0 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c  = TCL_ERROR;.#el
185e0 73 65 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21  se.    if( objc!
185f0 3d 32 20 26 26 20 6f 62 6a 63 21 3d 33 20 29 7b  =2 && objc!=3 ){
18600 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  .      Tcl_Wrong
18610 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
18620 32 2c 20 6f 62 6a 76 2c 20 22 3f 53 43 52 49 50  2, objv, "?SCRIP
18630 54 3f 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  T?");.      rc =
18640 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
18650 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 76 6f 69  }else{.      voi
18660 64 20 28 2a 78 4e 6f 74 69 66 79 29 28 76 6f 69  d (*xNotify)(voi
18670 64 20 2a 2a 2c 20 69 6e 74 29 20 3d 20 30 3b 0a  d **, int) = 0;.
18680 20 20 20 20 20 20 76 6f 69 64 20 2a 70 4e 6f 74        void *pNot
18690 69 66 79 41 72 67 20 3d 20 30 3b 0a 0a 20 20 20  ifyArg = 0;..   
186a0 20 20 20 69 66 28 20 70 44 62 2d 3e 70 55 6e 6c     if( pDb->pUnl
186b0 6f 63 6b 4e 6f 74 69 66 79 20 29 7b 0a 20 20 20  ockNotify ){.   
186c0 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66       Tcl_DecrRef
186d0 43 6f 75 6e 74 28 70 44 62 2d 3e 70 55 6e 6c 6f  Count(pDb->pUnlo
186e0 63 6b 4e 6f 74 69 66 79 29 3b 0a 20 20 20 20 20  ckNotify);.     
186f0 20 20 20 70 44 62 2d 3e 70 55 6e 6c 6f 63 6b 4e     pDb->pUnlockN
18700 6f 74 69 66 79 20 3d 20 30 3b 0a 20 20 20 20 20  otify = 0;.     
18710 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 6f 62   }..      if( ob
18720 6a 63 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20 20  jc==3 ){.       
18730 20 78 4e 6f 74 69 66 79 20 3d 20 44 62 55 6e 6c   xNotify = DbUnl
18740 6f 63 6b 4e 6f 74 69 66 79 3b 0a 20 20 20 20 20  ockNotify;.     
18750 20 20 20 70 4e 6f 74 69 66 79 41 72 67 20 3d 20     pNotifyArg = 
18760 28 76 6f 69 64 20 2a 29 70 44 62 3b 0a 20 20 20  (void *)pDb;.   
18770 20 20 20 20 20 70 44 62 2d 3e 70 55 6e 6c 6f 63       pDb->pUnloc
18780 6b 4e 6f 74 69 66 79 20 3d 20 6f 62 6a 76 5b 32  kNotify = objv[2
18790 5d 3b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 49  ];.        Tcl_I
187a0 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 44 62 2d  ncrRefCount(pDb-
187b0 3e 70 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 29 3b  >pUnlockNotify);
187c0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
187d0 69 66 28 20 73 71 6c 69 74 65 33 5f 75 6e 6c 6f  if( sqlite3_unlo
187e0 63 6b 5f 6e 6f 74 69 66 79 28 70 44 62 2d 3e 64  ck_notify(pDb->d
187f0 62 2c 20 78 4e 6f 74 69 66 79 2c 20 70 4e 6f 74  b, xNotify, pNot
18800 69 66 79 41 72 67 29 20 29 7b 0a 20 20 20 20 20  ifyArg) ){.     
18810 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
18820 75 6c 74 28 69 6e 74 65 72 70 2c 20 73 71 6c 69  ult(interp, sqli
18830 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e  te3_errmsg(pDb->
18840 64 62 29 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  db), (char*)0);.
18850 20 20 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c          rc = TCL
18860 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a  _ERROR;.      }.
18870 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
18880 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
18890 2a 0a 20 20 2a 2a 20 20 20 20 24 64 62 20 70 72  *.  **    $db pr
188a0 65 75 70 64 61 74 65 5f 68 6f 6f 6b 20 63 6f 75  eupdate_hook cou
188b0 6e 74 0a 20 20 2a 2a 20 20 20 20 24 64 62 20 70  nt.  **    $db p
188c0 72 65 75 70 64 61 74 65 5f 68 6f 6f 6b 20 68 6f  reupdate_hook ho
188d0 6f 6b 20 3f 53 43 52 49 50 54 3f 0a 20 20 2a 2a  ok ?SCRIPT?.  **
188e0 20 20 20 20 24 64 62 20 70 72 65 75 70 64 61 74      $db preupdat
188f0 65 5f 68 6f 6f 6b 20 6e 65 77 20 49 4e 44 45 58  e_hook new INDEX
18900 0a 20 20 2a 2a 20 20 20 20 24 64 62 20 70 72 65  .  **    $db pre
18910 75 70 64 61 74 65 5f 68 6f 6f 6b 20 6f 6c 64 20  update_hook old 
18920 49 4e 44 45 58 0a 20 20 2a 2f 0a 20 20 63 61 73  INDEX.  */.  cas
18930 65 20 44 42 5f 50 52 45 55 50 44 41 54 45 3a 20  e DB_PREUPDATE: 
18940 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
18950 5f 45 4e 41 42 4c 45 5f 50 52 45 55 50 44 41 54  _ENABLE_PREUPDAT
18960 45 5f 48 4f 4f 4b 0a 20 20 20 20 54 63 6c 5f 41  E_HOOK.    Tcl_A
18970 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
18980 72 70 2c 20 22 70 72 65 75 70 64 61 74 65 5f 68  rp, "preupdate_h
18990 6f 6f 6b 20 77 61 73 20 6f 6d 69 74 74 65 64 20  ook was omitted 
189a0 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 22  at compile-time"
189b0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
189c0 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 30          (char*)0
189d0 29 3b 0a 20 20 20 20 72 63 20 3d 20 54 43 4c 5f  );.    rc = TCL_
189e0 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 20 20 20  ERROR;.#else.   
189f0 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68   static const ch
18a00 61 72 20 2a 61 7a 53 75 62 5b 5d 20 3d 20 7b 22  ar *azSub[] = {"
18a10 63 6f 75 6e 74 22 2c 20 22 64 65 70 74 68 22 2c  count", "depth",
18a20 20 22 68 6f 6f 6b 22 2c 20 22 6e 65 77 22 2c 20   "hook", "new", 
18a30 22 6f 6c 64 22 2c 20 30 7d 3b 0a 20 20 20 20 65  "old", 0};.    e
18a40 6e 75 6d 20 44 62 50 72 65 75 70 64 61 74 65 53  num DbPreupdateS
18a50 75 62 43 6d 64 20 7b 0a 20 20 20 20 20 20 50 52  ubCmd {.      PR
18a60 45 5f 43 4f 55 4e 54 2c 20 50 52 45 5f 44 45 50  E_COUNT, PRE_DEP
18a70 54 48 2c 20 50 52 45 5f 48 4f 4f 4b 2c 20 50 52  TH, PRE_HOOK, PR
18a80 45 5f 4e 45 57 2c 20 50 52 45 5f 4f 4c 44 0a 20  E_NEW, PRE_OLD. 
18a90 20 20 20 7d 3b 0a 20 20 20 20 69 6e 74 20 69 53     };.    int iS
18aa0 75 62 3b 0a 0a 20 20 20 20 69 66 28 20 6f 62 6a  ub;..    if( obj
18ab0 63 3c 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  c<3 ){.      Tcl
18ac0 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
18ad0 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22  terp, 2, objv, "
18ae0 53 55 42 2d 43 4f 4d 4d 41 4e 44 20 3f 41 52 47  SUB-COMMAND ?ARG
18af0 53 3f 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  S?");.    }.    
18b00 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 64 65 78  if( Tcl_GetIndex
18b10 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
18b20 6f 62 6a 76 5b 32 5d 2c 20 61 7a 53 75 62 2c 20  objv[2], azSub, 
18b30 22 73 75 62 2d 63 6f 6d 6d 61 6e 64 22 2c 20 30  "sub-command", 0
18b40 2c 20 26 69 53 75 62 29 20 29 7b 0a 20 20 20 20  , &iSub) ){.    
18b50 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
18b60 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73  OR;.    }..    s
18b70 77 69 74 63 68 28 20 28 65 6e 75 6d 20 44 62 50  witch( (enum DbP
18b80 72 65 75 70 64 61 74 65 53 75 62 43 6d 64 29 69  reupdateSubCmd)i
18b90 53 75 62 20 29 7b 0a 20 20 20 20 20 20 63 61 73  Sub ){.      cas
18ba0 65 20 50 52 45 5f 43 4f 55 4e 54 3a 20 7b 0a 20  e PRE_COUNT: {. 
18bb0 20 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c 20         int nCol 
18bc0 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 75 70 64  = sqlite3_preupd
18bd0 61 74 65 5f 63 6f 75 6e 74 28 70 44 62 2d 3e 64  ate_count(pDb->d
18be0 62 29 3b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f  b);.        Tcl_
18bf0 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
18c00 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f  erp, Tcl_NewIntO
18c10 62 6a 28 6e 43 6f 6c 29 29 3b 0a 20 20 20 20 20  bj(nCol));.     
18c20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
18c30 7d 0a 0a 20 20 20 20 20 20 63 61 73 65 20 50 52  }..      case PR
18c40 45 5f 48 4f 4f 4b 3a 20 7b 0a 20 20 20 20 20 20  E_HOOK: {.      
18c50 20 20 69 66 28 20 6f 62 6a 63 3e 34 20 29 7b 0a    if( objc>4 ){.
18c60 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 57 72            Tcl_Wr
18c70 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
18c80 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 68 6f 6f  p, 2, objv, "hoo
18c90 6b 20 3f 53 43 52 49 50 54 3f 22 29 3b 0a 20 20  k ?SCRIPT?");.  
18ca0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54          return T
18cb0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  CL_ERROR;.      
18cc0 20 20 7d 0a 20 20 20 20 20 20 20 20 44 62 48 6f    }.        DbHo
18cd0 6f 6b 43 6d 64 28 69 6e 74 65 72 70 2c 20 70 44  okCmd(interp, pD
18ce0 62 2c 20 28 6f 62 6a 63 3d 3d 34 20 3f 20 6f 62  b, (objc==4 ? ob
18cf0 6a 76 5b 33 5d 20 3a 20 30 29 2c 20 26 70 44 62  jv[3] : 0), &pDb
18d00 2d 3e 70 50 72 65 55 70 64 61 74 65 48 6f 6f 6b  ->pPreUpdateHook
18d10 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
18d20 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
18d30 20 63 61 73 65 20 50 52 45 5f 44 45 50 54 48 3a   case PRE_DEPTH:
18d40 20 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 4f   {.        Tcl_O
18d50 62 6a 20 2a 70 52 65 74 3b 0a 20 20 20 20 20 20  bj *pRet;.      
18d60 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b    if( objc!=3 ){
18d70 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 57  .          Tcl_W
18d80 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
18d90 72 70 2c 20 33 2c 20 6f 62 6a 76 2c 20 22 22 29  rp, 3, objv, "")
18da0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
18db0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
18dc0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
18dd0 70 52 65 74 20 3d 20 54 63 6c 5f 4e 65 77 49 6e  pRet = Tcl_NewIn
18de0 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f 70 72 65  tObj(sqlite3_pre
18df0 75 70 64 61 74 65 5f 64 65 70 74 68 28 70 44 62  update_depth(pDb
18e00 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20 20 20 20  ->db));.        
18e10 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
18e20 28 69 6e 74 65 72 70 2c 20 70 52 65 74 29 3b 0a  (interp, pRet);.
18e30 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
18e40 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 63 61       }..      ca
18e50 73 65 20 50 52 45 5f 4e 45 57 3a 0a 20 20 20 20  se PRE_NEW:.    
18e60 20 20 63 61 73 65 20 50 52 45 5f 4f 4c 44 3a 20    case PRE_OLD: 
18e70 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 49  {.        int iI
18e80 64 78 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  dx;.        sqli
18e90 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 75  te3_value *pValu
18ea0 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6f  e;.        if( o
18eb0 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 20 20  bjc!=4 ){.      
18ec0 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
18ed0 41 72 67 73 28 69 6e 74 65 72 70 2c 20 33 2c 20  Args(interp, 3, 
18ee0 6f 62 6a 76 2c 20 22 49 4e 44 45 58 22 29 3b 0a  objv, "INDEX");.
18ef0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
18f00 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
18f10 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
18f20 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  ( Tcl_GetIntFrom
18f30 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
18f40 5b 33 5d 2c 20 26 69 49 64 78 29 20 29 7b 0a 20  [3], &iIdx) ){. 
18f50 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
18f60 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  TCL_ERROR;.     
18f70 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 66     }..        if
18f80 28 20 69 53 75 62 3d 3d 50 52 45 5f 4f 4c 44 20  ( iSub==PRE_OLD 
18f90 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
18fa0 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 75 70 64  = sqlite3_preupd
18fb0 61 74 65 5f 6f 6c 64 28 70 44 62 2d 3e 64 62 2c  ate_old(pDb->db,
18fc0 20 69 49 64 78 2c 20 26 70 56 61 6c 75 65 29 3b   iIdx, &pValue);
18fd0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
18fe0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
18ff0 28 20 69 53 75 62 3d 3d 50 52 45 5f 4e 45 57 20  ( iSub==PRE_NEW 
19000 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  );.          rc 
19010 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 75 70 64  = sqlite3_preupd
19020 61 74 65 5f 6e 65 77 28 70 44 62 2d 3e 64 62 2c  ate_new(pDb->db,
19030 20 69 49 64 78 2c 20 26 70 56 61 6c 75 65 29 3b   iIdx, &pValue);
19040 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
19050 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
19060 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
19070 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 4f 62 6a     Tcl_Obj *pObj
19080 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 62 6a  ;.          pObj
19090 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67   = Tcl_NewString
190a0 4f 62 6a 28 28 63 68 61 72 2a 29 73 71 6c 69 74  Obj((char*)sqlit
190b0 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 70 56  e3_value_text(pV
190c0 61 6c 75 65 29 2c 20 2d 31 29 3b 0a 20 20 20 20  alue), -1);.    
190d0 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a        Tcl_SetObj
190e0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70  Result(interp, p
190f0 4f 62 6a 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  Obj);.        }e
19100 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 54  lse{.          T
19110 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
19120 69 6e 74 65 72 70 2c 20 73 71 6c 69 74 65 33 5f  interp, sqlite3_
19130 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c  errmsg(pDb->db),
19140 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20   (char*)0);.    
19150 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
19160 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20  _ERROR;.        
19170 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
19180 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
19190 5f 45 4e 41 42 4c 45 5f 50 52 45 55 50 44 41 54  _ENABLE_PREUPDAT
191a0 45 5f 48 4f 4f 4b 20 2a 2f 0a 20 20 20 20 62 72  E_HOOK */.    br
191b0 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  eak;.  }..  /*. 
191c0 20 2a 2a 20 20 20 20 24 64 62 20 77 61 6c 5f 68   **    $db wal_h
191d0 6f 6f 6b 20 3f 73 63 72 69 70 74 3f 0a 20 20 2a  ook ?script?.  *
191e0 2a 20 20 20 20 24 64 62 20 75 70 64 61 74 65 5f  *    $db update_
191f0 68 6f 6f 6b 20 3f 73 63 72 69 70 74 3f 0a 20 20  hook ?script?.  
19200 2a 2a 20 20 20 20 24 64 62 20 72 6f 6c 6c 62 61  **    $db rollba
19210 63 6b 5f 68 6f 6f 6b 20 3f 73 63 72 69 70 74 3f  ck_hook ?script?
19220 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f  .  */.  case DB_
19230 57 41 4c 5f 48 4f 4f 4b 3a 0a 20 20 63 61 73 65  WAL_HOOK:.  case
19240 20 44 42 5f 55 50 44 41 54 45 5f 48 4f 4f 4b 3a   DB_UPDATE_HOOK:
19250 0a 20 20 63 61 73 65 20 44 42 5f 52 4f 4c 4c 42  .  case DB_ROLLB
19260 41 43 4b 5f 48 4f 4f 4b 3a 20 7b 0a 20 20 20 20  ACK_HOOK: {.    
19270 2f 2a 20 73 65 74 20 70 70 48 6f 6f 6b 20 74 6f  /* set ppHook to
19280 20 70 6f 69 6e 74 20 61 74 20 70 55 70 64 61 74   point at pUpdat
19290 65 48 6f 6f 6b 20 6f 72 20 70 52 6f 6c 6c 62 61  eHook or pRollba
192a0 63 6b 48 6f 6f 6b 2c 20 64 65 70 65 6e 64 69 6e  ckHook, dependin
192b0 67 20 6f 6e 0a 20 20 20 20 2a 2a 20 77 68 65 74  g on.    ** whet
192c0 68 65 72 20 5b 24 64 62 20 75 70 64 61 74 65 5f  her [$db update_
192d0 68 6f 6f 6b 5d 20 6f 72 20 5b 24 64 62 20 72 6f  hook] or [$db ro
192e0 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 5d 20 77 61 73  llback_hook] was
192f0 20 69 6e 76 6f 6b 65 64 2e 0a 20 20 20 20 2a 2f   invoked..    */
19300 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 70  .    Tcl_Obj **p
19310 70 48 6f 6f 6b 20 3d 20 30 3b 0a 20 20 20 20 69  pHook = 0;.    i
19320 66 28 20 63 68 6f 69 63 65 3d 3d 44 42 5f 57 41  f( choice==DB_WA
19330 4c 5f 48 4f 4f 4b 20 29 20 70 70 48 6f 6f 6b 20  L_HOOK ) ppHook 
19340 3d 20 26 70 44 62 2d 3e 70 57 61 6c 48 6f 6f 6b  = &pDb->pWalHook
19350 3b 0a 20 20 20 20 69 66 28 20 63 68 6f 69 63 65  ;.    if( choice
19360 3d 3d 44 42 5f 55 50 44 41 54 45 5f 48 4f 4f 4b  ==DB_UPDATE_HOOK
19370 20 29 20 70 70 48 6f 6f 6b 20 3d 20 26 70 44 62   ) ppHook = &pDb
19380 2d 3e 70 55 70 64 61 74 65 48 6f 6f 6b 3b 0a 20  ->pUpdateHook;. 
19390 20 20 20 69 66 28 20 63 68 6f 69 63 65 3d 3d 44     if( choice==D
193a0 42 5f 52 4f 4c 4c 42 41 43 4b 5f 48 4f 4f 4b 20  B_ROLLBACK_HOOK 
193b0 29 20 70 70 48 6f 6f 6b 20 3d 20 26 70 44 62 2d  ) ppHook = &pDb-
193c0 3e 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 3b 0a  >pRollbackHook;.
193d0 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 33 20 29      if( objc>3 )
193e0 7b 0a 20 20 20 20 20 20 20 54 63 6c 5f 57 72 6f  {.       Tcl_Wro
193f0 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
19400 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 53 43 52  , 2, objv, "?SCR
19410 49 50 54 3f 22 29 3b 0a 20 20 20 20 20 20 20 72  IPT?");.       r
19420 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
19430 0a 20 20 20 20 7d 0a 0a 20 20 20 20 44 62 48 6f  .    }..    DbHo
19440 6f 6b 43 6d 64 28 69 6e 74 65 72 70 2c 20 70 44  okCmd(interp, pD
19450 62 2c 20 28 6f 62 6a 63 3d 3d 33 20 3f 20 6f 62  b, (objc==3 ? ob
19460 6a 76 5b 32 5d 20 3a 20 30 29 2c 20 70 70 48 6f  jv[2] : 0), ppHo
19470 6f 6b 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a  ok);.    break;.
19480 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62    }..  /*    $db
19490 20 76 65 72 73 69 6f 6e 0a 20 20 2a 2a 0a 20 20   version.  **.  
194a0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76 65  ** Return the ve
194b0 72 73 69 6f 6e 20 73 74 72 69 6e 67 20 66 6f 72  rsion string for
194c0 20 74 68 69 73 20 64 61 74 61 62 61 73 65 2e 0a   this database..
194d0 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 56    */.  case DB_V
194e0 45 52 53 49 4f 4e 3a 20 7b 0a 20 20 20 20 54 63  ERSION: {.    Tc
194f0 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
19500 72 70 2c 20 28 63 68 61 72 20 2a 29 73 71 6c 69  rp, (char *)sqli
19510 74 65 33 5f 6c 69 62 76 65 72 73 69 6f 6e 28 29  te3_libversion()
19520 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20  , TCL_STATIC);. 
19530 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 0a     break;.  }...
19540 20 20 7d 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68    } /* End of th
19550 65 20 53 57 49 54 43 48 20 73 74 61 74 65 6d 65  e SWITCH stateme
19560 6e 74 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72  nt */.  return r
19570 63 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45  c;.}..#if SQLITE
19580 5f 54 43 4c 5f 4e 52 45 0a 2f 2a 0a 2a 2a 20 41  _TCL_NRE./*.** A
19590 64 61 70 74 6f 72 20 74 68 61 74 20 70 72 6f 76  daptor that prov
195a0 69 64 65 73 20 61 6e 20 6f 62 6a 43 6d 64 20 69  ides an objCmd i
195b0 6e 74 65 72 66 61 63 65 20 74 6f 20 74 68 65 20  nterface to the 
195c0 4e 52 45 2d 65 6e 61 62 6c 65 64 0a 2a 2a 20 69  NRE-enabled.** i
195d0 6e 74 65 72 66 61 63 65 20 69 6d 70 6c 65 6d 65  nterface impleme
195e0 6e 74 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  ntation..*/.stat
195f0 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43  ic int SQLITE_TC
19600 4c 41 50 49 20 44 62 4f 62 6a 43 6d 64 41 64 61  LAPI DbObjCmdAda
19610 70 74 6f 72 28 0a 20 20 76 6f 69 64 20 2a 63 64  ptor(.  void *cd
19620 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
19630 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
19640 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 63  jc,.  Tcl_Obj *c
19650 6f 6e 73 74 2a 6f 62 6a 76 0a 29 7b 0a 20 20 72  onst*objv.){.  r
19660 65 74 75 72 6e 20 54 63 6c 5f 4e 52 43 61 6c 6c  eturn Tcl_NRCall
19670 4f 62 6a 50 72 6f 63 28 69 6e 74 65 72 70 2c 20  ObjProc(interp, 
19680 44 62 4f 62 6a 43 6d 64 2c 20 63 64 2c 20 6f 62  DbObjCmd, cd, ob
19690 6a 63 2c 20 6f 62 6a 76 29 3b 0a 7d 0a 23 65 6e  jc, objv);.}.#en
196a0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 54 43  dif /* SQLITE_TC
196b0 4c 5f 4e 52 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  L_NRE */../*.** 
196c0 20 20 73 71 6c 69 74 65 33 20 44 42 4e 41 4d 45    sqlite3 DBNAME
196d0 20 46 49 4c 45 4e 41 4d 45 20 3f 2d 76 66 73 20   FILENAME ?-vfs 
196e0 56 46 53 4e 41 4d 45 3f 20 3f 2d 6b 65 79 20 4b  VFSNAME? ?-key K
196f0 45 59 3f 20 3f 2d 72 65 61 64 6f 6e 6c 79 20 42  EY? ?-readonly B
19700 4f 4f 4c 45 41 4e 3f 0a 2a 2a 20 20 20 20 20 20  OOLEAN?.**      
19710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19720 20 20 20 20 20 3f 2d 63 72 65 61 74 65 20 42 4f       ?-create BO
19730 4f 4c 45 41 4e 3f 20 3f 2d 6e 6f 6d 75 74 65 78  OLEAN? ?-nomutex
19740 20 42 4f 4f 4c 45 41 4e 3f 0a 2a 2a 0a 2a 2a 20   BOOLEAN?.**.** 
19750 54 68 69 73 20 69 73 20 74 68 65 20 6d 61 69 6e  This is the main
19760 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 2e 20 20 57   Tcl command.  W
19770 68 65 6e 20 74 68 65 20 22 73 71 6c 69 74 65 22  hen the "sqlite"
19780 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 20 69 73 0a   Tcl command is.
19790 2a 2a 20 69 6e 76 6f 6b 65 64 2c 20 74 68 69 73  ** invoked, this
197a0 20 72 6f 75 74 69 6e 65 20 72 75 6e 73 20 74 6f   routine runs to
197b0 20 70 72 6f 63 65 73 73 20 74 68 61 74 20 63 6f   process that co
197c0 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  mmand..**.** The
197d0 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2c   first argument,
197e0 20 44 42 4e 41 4d 45 2c 20 69 73 20 61 6e 20 61   DBNAME, is an a
197f0 72 62 69 74 72 61 72 79 20 6e 61 6d 65 20 66 6f  rbitrary name fo
19800 72 20 61 20 6e 65 77 0a 2a 2a 20 64 61 74 61 62  r a new.** datab
19810 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20  ase connection. 
19820 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20 63 72   This command cr
19830 65 61 74 65 73 20 61 20 6e 65 77 20 63 6f 6d 6d  eates a new comm
19840 61 6e 64 20 6e 61 6d 65 64 0a 2a 2a 20 44 42 4e  and named.** DBN
19850 41 4d 45 20 74 68 61 74 20 69 73 20 75 73 65 64  AME that is used
19860 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 74 68 61 74   to control that
19870 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 20 54 68   connection.  Th
19880 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f  e database.** co
19890 6e 6e 65 63 74 69 6f 6e 20 69 73 20 64 65 6c 65  nnection is dele
198a0 74 65 64 20 77 68 65 6e 20 74 68 65 20 44 42 4e  ted when the DBN
198b0 41 4d 45 20 63 6f 6d 6d 61 6e 64 20 69 73 20 64  AME command is d
198c0 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  eleted..**.** Th
198d0 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
198e0 74 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  t is the name of
198f0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
19900 6c 65 2e 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63  le..**.*/.static
19910 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41   int SQLITE_TCLA
19920 50 49 20 44 62 4d 61 69 6e 28 0a 20 20 76 6f 69  PI DbMain(.  voi
19930 64 20 2a 63 64 2c 0a 20 20 54 63 6c 5f 49 6e 74  d *cd,.  Tcl_Int
19940 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
19950 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
19960 62 6a 20 2a 63 6f 6e 73 74 2a 6f 62 6a 76 0a 29  bj *const*objv.)
19970 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 3b  {.  SqliteDb *p;
19980 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
19990 41 72 67 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72  Arg;.  char *zEr
199a0 72 4d 73 67 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  rMsg;.  int i;. 
199b0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
199c0 6c 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  le;.  const char
199d0 20 2a 7a 56 66 73 20 3d 20 30 3b 0a 20 20 69 6e   *zVfs = 0;.  in
199e0 74 20 66 6c 61 67 73 3b 0a 20 20 54 63 6c 5f 44  t flags;.  Tcl_D
199f0 53 74 72 69 6e 67 20 74 72 61 6e 73 6c 61 74 65  String translate
19a00 64 46 69 6c 65 6e 61 6d 65 3b 0a 23 69 66 20 64  dFilename;.#if d
19a10 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 48 41  efined(SQLITE_HA
19a20 53 5f 43 4f 44 45 43 29 20 26 26 20 21 64 65 66  S_CODEC) && !def
19a30 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
19a40 5f 43 4f 44 45 43 5f 46 52 4f 4d 5f 54 43 4c 29  _CODEC_FROM_TCL)
19a50 0a 20 20 76 6f 69 64 20 2a 70 4b 65 79 20 3d 20  .  void *pKey = 
19a60 30 3b 0a 20 20 69 6e 74 20 6e 4b 65 79 20 3d 20  0;.  int nKey = 
19a70 30 3b 0a 23 65 6e 64 69 66 0a 20 20 69 6e 74 20  0;.#endif.  int 
19a80 72 63 3b 0a 0a 20 20 2f 2a 20 49 6e 20 6e 6f 72  rc;..  /* In nor
19a90 6d 61 6c 20 75 73 65 2c 20 65 61 63 68 20 54 43  mal use, each TC
19aa0 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 72 75  L interpreter ru
19ab0 6e 73 20 69 6e 20 61 20 73 69 6e 67 6c 65 20 74  ns in a single t
19ac0 68 72 65 61 64 2e 20 20 53 6f 0a 20 20 2a 2a 20  hread.  So.  ** 
19ad0 62 79 20 64 65 66 61 75 6c 74 2c 20 77 65 20 63  by default, we c
19ae0 61 6e 20 74 75 72 6e 20 6f 66 20 6d 75 74 65 78  an turn of mutex
19af0 69 6e 67 20 6f 6e 20 53 51 4c 69 74 65 20 64 61  ing on SQLite da
19b00 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
19b10 6e 73 2e 0a 20 20 2a 2a 20 48 6f 77 65 76 65 72  ns..  ** However
19b20 2c 20 66 6f 72 20 74 65 73 74 69 6e 67 20 70 75  , for testing pu
19b30 72 70 6f 73 65 73 20 69 74 20 69 73 20 75 73 65  rposes it is use
19b40 66 75 6c 20 74 6f 20 68 61 76 65 20 6d 75 74 65  ful to have mute
19b50 78 65 73 20 74 75 72 6e 65 64 0a 20 20 2a 2a 20  xes turned.  ** 
19b60 6f 6e 2e 20 20 53 6f 2c 20 62 79 20 64 65 66 61  on.  So, by defa
19b70 75 6c 74 2c 20 6d 75 74 65 78 65 73 20 64 65 66  ult, mutexes def
19b80 61 75 6c 74 20 6f 66 66 2e 20 20 42 75 74 20 69  ault off.  But i
19b90 66 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 0a  f compiled with.
19ba0 20 20 2a 2a 20 53 51 4c 49 54 45 5f 54 43 4c 5f    ** SQLITE_TCL_
19bb0 44 45 46 41 55 4c 54 5f 46 55 4c 4c 4d 55 54 45  DEFAULT_FULLMUTE
19bc0 58 20 74 68 65 6e 20 6d 75 74 65 78 65 73 20 64  X then mutexes d
19bd0 65 66 61 75 6c 74 20 6f 6e 2e 0a 20 20 2a 2f 0a  efault on..  */.
19be0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 43  #ifdef SQLITE_TC
19bf0 4c 5f 44 45 46 41 55 4c 54 5f 46 55 4c 4c 4d 55  L_DEFAULT_FULLMU
19c00 54 45 58 0a 20 20 66 6c 61 67 73 20 3d 20 53 51  TEX.  flags = SQ
19c10 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
19c20 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45  ITE | SQLITE_OPE
19c30 4e 5f 43 52 45 41 54 45 20 7c 20 53 51 4c 49 54  N_CREATE | SQLIT
19c40 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54 45 58  E_OPEN_FULLMUTEX
19c50 3b 0a 23 65 6c 73 65 0a 20 20 66 6c 61 67 73 20  ;.#else.  flags 
19c60 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  = SQLITE_OPEN_RE
19c70 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45  ADWRITE | SQLITE
19c80 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c 20 53  _OPEN_CREATE | S
19c90 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54  QLITE_OPEN_NOMUT
19ca0 45 58 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66  EX;.#endif..  if
19cb0 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20  ( objc==2 ){.   
19cc0 20 7a 41 72 67 20 3d 20 54 63 6c 5f 47 65 74 53   zArg = Tcl_GetS
19cd0 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
19ce0 76 5b 31 5d 2c 20 30 29 3b 0a 20 20 20 20 69 66  v[1], 0);.    if
19cf0 28 20 73 74 72 63 6d 70 28 7a 41 72 67 2c 22 2d  ( strcmp(zArg,"-
19d00 76 65 72 73 69 6f 6e 22 29 3d 3d 30 20 29 7b 0a  version")==0 ){.
19d10 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
19d20 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 73 71  Result(interp,sq
19d30 6c 69 74 65 33 5f 6c 69 62 76 65 72 73 69 6f 6e  lite3_libversion
19d40 28 29 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20  (), (char*)0);. 
19d50 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
19d60 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  OK;.    }.    if
19d70 28 20 73 74 72 63 6d 70 28 7a 41 72 67 2c 22 2d  ( strcmp(zArg,"-
19d80 73 6f 75 72 63 65 69 64 22 29 3d 3d 30 20 29 7b  sourceid")==0 ){
19d90 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  .      Tcl_Appen
19da0 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 73  dResult(interp,s
19db0 71 6c 69 74 65 33 5f 73 6f 75 72 63 65 69 64 28  qlite3_sourceid(
19dc0 29 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  ), (char*)0);.  
19dd0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f      return TCL_O
19de0 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  K;.    }.    if(
19df0 20 73 74 72 63 6d 70 28 7a 41 72 67 2c 22 2d 68   strcmp(zArg,"-h
19e00 61 73 2d 63 6f 64 65 63 22 29 3d 3d 30 20 29 7b  as-codec")==0 ){
19e10 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
19e20 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 29 20 26  ITE_HAS_CODEC) &
19e30 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
19e40 45 5f 4f 4d 49 54 5f 43 4f 44 45 43 5f 46 52 4f  E_OMIT_CODEC_FRO
19e50 4d 5f 54 43 4c 29 0a 20 20 20 20 20 20 54 63 6c  M_TCL).      Tcl
19e60 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
19e70 74 65 72 70 2c 22 31 22 2c 28 63 68 61 72 2a 29  terp,"1",(char*)
19e80 30 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20  0);.#else.      
19e90 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
19ea0 28 69 6e 74 65 72 70 2c 22 30 22 2c 28 63 68 61  (interp,"0",(cha
19eb0 72 2a 29 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20  r*)0);.#endif.  
19ec0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f      return TCL_O
19ed0 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66  K;.    }.  }.  f
19ee0 6f 72 28 69 3d 33 3b 20 69 2b 31 3c 6f 62 6a 63  or(i=3; i+1<objc
19ef0 3b 20 69 2b 3d 32 29 7b 0a 20 20 20 20 7a 41 72  ; i+=2){.    zAr
19f00 67 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  g = Tcl_GetStrin
19f10 67 28 6f 62 6a 76 5b 69 5d 29 3b 0a 20 20 20 20  g(objv[i]);.    
19f20 69 66 28 20 73 74 72 63 6d 70 28 7a 41 72 67 2c  if( strcmp(zArg,
19f30 22 2d 6b 65 79 22 29 3d 3d 30 20 29 7b 0a 23 69  "-key")==0 ){.#i
19f40 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
19f50 5f 48 41 53 5f 43 4f 44 45 43 29 20 26 26 20 21  _HAS_CODEC) && !
19f60 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
19f70 4d 49 54 5f 43 4f 44 45 43 5f 46 52 4f 4d 5f 54  MIT_CODEC_FROM_T
19f80 43 4c 29 0a 20 20 20 20 20 20 70 4b 65 79 20 3d  CL).      pKey =
19f90 20 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61   Tcl_GetByteArra
19fa0 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 69 2b  yFromObj(objv[i+
19fb0 31 5d 2c 20 26 6e 4b 65 79 29 3b 0a 23 65 6e 64  1], &nKey);.#end
19fc0 69 66 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  if.    }else if(
19fd0 20 73 74 72 63 6d 70 28 7a 41 72 67 2c 20 22 2d   strcmp(zArg, "-
19fe0 76 66 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  vfs")==0 ){.    
19ff0 20 20 7a 56 66 73 20 3d 20 54 63 6c 5f 47 65 74    zVfs = Tcl_Get
1a000 53 74 72 69 6e 67 28 6f 62 6a 76 5b 69 2b 31 5d  String(objv[i+1]
1a010 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
1a020 20 73 74 72 63 6d 70 28 7a 41 72 67 2c 20 22 2d   strcmp(zArg, "-
1a030 72 65 61 64 6f 6e 6c 79 22 29 3d 3d 30 20 29 7b  readonly")==0 ){
1a040 0a 20 20 20 20 20 20 69 6e 74 20 62 3b 0a 20 20  .      int b;.  
1a050 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 42      if( Tcl_GetB
1a060 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e  ooleanFromObj(in
1a070 74 65 72 70 2c 20 6f 62 6a 76 5b 69 2b 31 5d 2c  terp, objv[i+1],
1a080 20 26 62 29 20 29 20 72 65 74 75 72 6e 20 54 43   &b) ) return TC
1a090 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 69  L_ERROR;.      i
1a0a0 66 28 20 62 20 29 7b 0a 20 20 20 20 20 20 20 20  f( b ){.        
1a0b0 66 6c 61 67 73 20 26 3d 20 7e 28 53 51 4c 49 54  flags &= ~(SQLIT
1a0c0 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
1a0d0 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45  |SQLITE_OPEN_CRE
1a0e0 41 54 45 29 3b 0a 20 20 20 20 20 20 20 20 66 6c  ATE);.        fl
1a0f0 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50  ags |= SQLITE_OP
1a100 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20  EN_READONLY;.   
1a110 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1a120 20 20 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49    flags &= ~SQLI
1a130 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
1a140 3b 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73 20  ;.        flags 
1a150 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  |= SQLITE_OPEN_R
1a160 45 41 44 57 52 49 54 45 3b 0a 20 20 20 20 20 20  EADWRITE;.      
1a170 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  }.    }else if( 
1a180 73 74 72 63 6d 70 28 7a 41 72 67 2c 20 22 2d 63  strcmp(zArg, "-c
1a190 72 65 61 74 65 22 29 3d 3d 30 20 29 7b 0a 20 20  reate")==0 ){.  
1a1a0 20 20 20 20 69 6e 74 20 62 3b 0a 20 20 20 20 20      int b;.     
1a1b0 20 69 66 28 20 54 63 6c 5f 47 65 74 42 6f 6f 6c   if( Tcl_GetBool
1a1c0 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  eanFromObj(inter
1a1d0 70 2c 20 6f 62 6a 76 5b 69 2b 31 5d 2c 20 26 62  p, objv[i+1], &b
1a1e0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
1a1f0 52 52 4f 52 3b 0a 20 20 20 20 20 20 69 66 28 20  RROR;.      if( 
1a200 62 20 26 26 20 28 66 6c 61 67 73 20 26 20 53 51  b && (flags & SQ
1a210 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
1a220 4c 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  LY)==0 ){.      
1a230 20 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54    flags |= SQLIT
1a240 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 3b 0a 20  E_OPEN_CREATE;. 
1a250 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1a260 20 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 53 51      flags &= ~SQ
1a270 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
1a280 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
1a290 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a  lse if( strcmp(z
1a2a0 41 72 67 2c 20 22 2d 6e 6f 6d 75 74 65 78 22 29  Arg, "-nomutex")
1a2b0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ==0 ){.      int
1a2c0 20 62 3b 0a 20 20 20 20 20 20 69 66 28 20 54 63   b;.      if( Tc
1a2d0 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d  l_GetBooleanFrom
1a2e0 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
1a2f0 5b 69 2b 31 5d 2c 20 26 62 29 20 29 20 72 65 74  [i+1], &b) ) ret
1a300 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1a310 20 20 20 20 20 69 66 28 20 62 20 29 7b 0a 20 20       if( b ){.  
1a320 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 53        flags |= S
1a330 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54  QLITE_OPEN_NOMUT
1a340 45 58 3b 0a 20 20 20 20 20 20 20 20 66 6c 61 67  EX;.        flag
1a350 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 4f 50 45  s &= ~SQLITE_OPE
1a360 4e 5f 46 55 4c 4c 4d 55 54 45 58 3b 0a 20 20 20  N_FULLMUTEX;.   
1a370 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1a380 20 20 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49    flags &= ~SQLI
1a390 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58 3b  TE_OPEN_NOMUTEX;
1a3a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
1a3b0 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 41  se if( strcmp(zA
1a3c0 72 67 2c 20 22 2d 66 75 6c 6c 6d 75 74 65 78 22  rg, "-fullmutex"
1a3d0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  )==0 ){.      in
1a3e0 74 20 62 3b 0a 20 20 20 20 20 20 69 66 28 20 54  t b;.      if( T
1a3f0 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f  cl_GetBooleanFro
1a400 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
1a410 76 5b 69 2b 31 5d 2c 20 26 62 29 20 29 20 72 65  v[i+1], &b) ) re
1a420 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1a430 20 20 20 20 20 20 69 66 28 20 62 20 29 7b 0a 20        if( b ){. 
1a440 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20         flags |= 
1a450 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c  SQLITE_OPEN_FULL
1a460 4d 55 54 45 58 3b 0a 20 20 20 20 20 20 20 20 66  MUTEX;.        f
1a470 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f  lags &= ~SQLITE_
1a480 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58 3b 0a 20 20  OPEN_NOMUTEX;.  
1a490 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1a4a0 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c     flags &= ~SQL
1a4b0 49 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54  ITE_OPEN_FULLMUT
1a4c0 45 58 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  EX;.      }.    
1a4d0 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
1a4e0 28 7a 41 72 67 2c 20 22 2d 75 72 69 22 29 3d 3d  (zArg, "-uri")==
1a4f0 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 62  0 ){.      int b
1a500 3b 0a 20 20 20 20 20 20 69 66 28 20 54 63 6c 5f  ;.      if( Tcl_
1a510 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62  GetBooleanFromOb
1a520 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 69  j(interp, objv[i
1a530 2b 31 5d 2c 20 26 62 29 20 29 20 72 65 74 75 72  +1], &b) ) retur
1a540 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
1a550 20 20 20 69 66 28 20 62 20 29 7b 0a 20 20 20 20     if( b ){.    
1a560 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c      flags |= SQL
1a570 49 54 45 5f 4f 50 45 4e 5f 55 52 49 3b 0a 20 20  ITE_OPEN_URI;.  
1a580 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1a590 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c     flags &= ~SQL
1a5a0 49 54 45 5f 4f 50 45 4e 5f 55 52 49 3b 0a 20 20  ITE_OPEN_URI;.  
1a5b0 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
1a5c0 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  .      Tcl_Appen
1a5d0 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
1a5e0 22 75 6e 6b 6e 6f 77 6e 20 6f 70 74 69 6f 6e 3a  "unknown option:
1a5f0 20 22 2c 20 7a 41 72 67 2c 20 28 63 68 61 72 2a   ", zArg, (char*
1a600 29 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  )0);.      retur
1a610 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
1a620 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6f 62 6a   }.  }.  if( obj
1a630 63 3c 33 20 7c 7c 20 28 6f 62 6a 63 26 31 29 21  c<3 || (objc&1)!
1a640 3d 31 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  =1 ){.    Tcl_Wr
1a650 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
1a660 70 2c 20 31 2c 20 6f 62 6a 76 2c 0a 20 20 20 20  p, 1, objv,.    
1a670 20 20 22 48 41 4e 44 4c 45 20 46 49 4c 45 4e 41    "HANDLE FILENA
1a680 4d 45 20 3f 2d 76 66 73 20 56 46 53 4e 41 4d 45  ME ?-vfs VFSNAME
1a690 3f 20 3f 2d 72 65 61 64 6f 6e 6c 79 20 42 4f 4f  ? ?-readonly BOO
1a6a0 4c 45 41 4e 3f 20 3f 2d 63 72 65 61 74 65 20 42  LEAN? ?-create B
1a6b0 4f 4f 4c 45 41 4e 3f 22 0a 20 20 20 20 20 20 22  OOLEAN?".      "
1a6c0 20 3f 2d 6e 6f 6d 75 74 65 78 20 42 4f 4f 4c 45   ?-nomutex BOOLE
1a6d0 41 4e 3f 20 3f 2d 66 75 6c 6c 6d 75 74 65 78 20  AN? ?-fullmutex 
1a6e0 42 4f 4f 4c 45 41 4e 3f 20 3f 2d 75 72 69 20 42  BOOLEAN? ?-uri B
1a6f0 4f 4f 4c 45 41 4e 3f 22 0a 23 69 66 20 64 65 66  OOLEAN?".#if def
1a700 69 6e 65 64 28 53 51 4c 49 54 45 5f 48 41 53 5f  ined(SQLITE_HAS_
1a710 43 4f 44 45 43 29 20 26 26 20 21 64 65 66 69 6e  CODEC) && !defin
1a720 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ed(SQLITE_OMIT_C
1a730 4f 44 45 43 5f 46 52 4f 4d 5f 54 43 4c 29 0a 20  ODEC_FROM_TCL). 
1a740 20 20 20 20 20 22 20 3f 2d 6b 65 79 20 43 4f 44       " ?-key COD
1a750 45 43 4b 45 59 3f 22 0a 23 65 6e 64 69 66 0a 20  ECKEY?".#endif. 
1a760 20 20 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e     );.    return
1a770 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
1a780 20 20 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20    zErrMsg = 0;. 
1a790 20 70 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29   p = (SqliteDb*)
1a7a0 54 63 6c 5f 41 6c 6c 6f 63 28 20 73 69 7a 65 6f  Tcl_Alloc( sizeo
1a7b0 66 28 2a 70 29 20 29 3b 0a 20 20 6d 65 6d 73 65  f(*p) );.  memse
1a7c0 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  t(p, 0, sizeof(*
1a7d0 70 29 29 3b 0a 20 20 7a 46 69 6c 65 20 3d 20 54  p));.  zFile = T
1a7e0 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
1a7f0 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30 29 3b  Obj(objv[2], 0);
1a800 0a 20 20 7a 46 69 6c 65 20 3d 20 54 63 6c 5f 54  .  zFile = Tcl_T
1a810 72 61 6e 73 6c 61 74 65 46 69 6c 65 4e 61 6d 65  ranslateFileName
1a820 28 69 6e 74 65 72 70 2c 20 7a 46 69 6c 65 2c 20  (interp, zFile, 
1a830 26 74 72 61 6e 73 6c 61 74 65 64 46 69 6c 65 6e  &translatedFilen
1a840 61 6d 65 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  ame);.  rc = sql
1a850 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 7a 46 69  ite3_open_v2(zFi
1a860 6c 65 2c 20 26 70 2d 3e 64 62 2c 20 66 6c 61 67  le, &p->db, flag
1a870 73 2c 20 7a 56 66 73 29 3b 0a 20 20 54 63 6c 5f  s, zVfs);.  Tcl_
1a880 44 53 74 72 69 6e 67 46 72 65 65 28 26 74 72 61  DStringFree(&tra
1a890 6e 73 6c 61 74 65 64 46 69 6c 65 6e 61 6d 65 29  nslatedFilename)
1a8a0 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 20 29 7b  ;.  if( p->db ){
1a8b0 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f  .    if( SQLITE_
1a8c0 4f 4b 21 3d 73 71 6c 69 74 65 33 5f 65 72 72 63  OK!=sqlite3_errc
1a8d0 6f 64 65 28 70 2d 3e 64 62 29 20 29 7b 0a 20 20  ode(p->db) ){.  
1a8e0 20 20 20 20 7a 45 72 72 4d 73 67 20 3d 20 73 71      zErrMsg = sq
1a8f0 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25  lite3_mprintf("%
1a900 73 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  s", sqlite3_errm
1a910 73 67 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20  sg(p->db));.    
1a920 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28    sqlite3_close(
1a930 70 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20 70 2d  p->db);.      p-
1a940 3e 64 62 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  >db = 0;.    }. 
1a950 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 45 72 72   }else{.    zErr
1a960 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Msg = sqlite3_mp
1a970 72 69 6e 74 66 28 22 25 73 22 2c 20 73 71 6c 69  rintf("%s", sqli
1a980 74 65 33 5f 65 72 72 73 74 72 28 72 63 29 29 3b  te3_errstr(rc));
1a990 0a 20 20 7d 0a 23 69 66 20 64 65 66 69 6e 65 64  .  }.#if defined
1a9a0 28 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45  (SQLITE_HAS_CODE
1a9b0 43 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  C) && !defined(S
1a9c0 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 44 45 43  QLITE_OMIT_CODEC
1a9d0 5f 46 52 4f 4d 5f 54 43 4c 29 0a 20 20 69 66 28  _FROM_TCL).  if(
1a9e0 20 70 2d 3e 64 62 20 29 7b 0a 20 20 20 20 73 71   p->db ){.    sq
1a9f0 6c 69 74 65 33 5f 6b 65 79 28 70 2d 3e 64 62 2c  lite3_key(p->db,
1aa00 20 70 4b 65 79 2c 20 6e 4b 65 79 29 3b 0a 20 20   pKey, nKey);.  
1aa10 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70  }.#endif.  if( p
1aa20 2d 3e 64 62 3d 3d 30 20 29 7b 0a 20 20 20 20 54  ->db==0 ){.    T
1aa30 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
1aa40 65 72 70 2c 20 7a 45 72 72 4d 73 67 2c 20 54 43  erp, zErrMsg, TC
1aa50 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 20  L_VOLATILE);.   
1aa60 20 54 63 6c 5f 46 72 65 65 28 28 63 68 61 72 2a   Tcl_Free((char*
1aa70 29 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  )p);.    sqlite3
1aa80 5f 66 72 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a  _free(zErrMsg);.
1aa90 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
1aaa0 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d  RROR;.  }.  p->m
1aab0 61 78 53 74 6d 74 20 3d 20 4e 55 4d 5f 50 52 45  axStmt = NUM_PRE
1aac0 50 41 52 45 44 5f 53 54 4d 54 53 3b 0a 20 20 70  PARED_STMTS;.  p
1aad0 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20 66 6c  ->openFlags = fl
1aae0 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
1aaf0 4e 5f 55 52 49 3b 0a 20 20 70 2d 3e 69 6e 74 65  N_URI;.  p->inte
1ab00 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 7a  rp = interp;.  z
1ab10 41 72 67 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  Arg = Tcl_GetStr
1ab20 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
1ab30 31 5d 2c 20 30 29 3b 0a 20 20 69 66 28 20 44 62  1], 0);.  if( Db
1ab40 55 73 65 4e 72 65 28 29 20 29 7b 0a 20 20 20 20  UseNre() ){.    
1ab50 54 63 6c 5f 4e 52 43 72 65 61 74 65 43 6f 6d 6d  Tcl_NRCreateComm
1ab60 61 6e 64 28 69 6e 74 65 72 70 2c 20 7a 41 72 67  and(interp, zArg
1ab70 2c 20 44 62 4f 62 6a 43 6d 64 41 64 61 70 74 6f  , DbObjCmdAdapto
1ab80 72 2c 20 44 62 4f 62 6a 43 6d 64 2c 0a 20 20 20  r, DbObjCmd,.   
1ab90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aba0 20 20 20 20 20 28 63 68 61 72 2a 29 70 2c 20 44       (char*)p, D
1abb0 62 44 65 6c 65 74 65 43 6d 64 29 3b 0a 20 20 7d  bDeleteCmd);.  }
1abc0 65 6c 73 65 7b 0a 20 20 20 20 54 63 6c 5f 43 72  else{.    Tcl_Cr
1abd0 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69  eateObjCommand(i
1abe0 6e 74 65 72 70 2c 20 7a 41 72 67 2c 20 44 62 4f  nterp, zArg, DbO
1abf0 62 6a 43 6d 64 2c 20 28 63 68 61 72 2a 29 70 2c  bjCmd, (char*)p,
1ac00 20 44 62 44 65 6c 65 74 65 43 6d 64 29 3b 0a 20   DbDeleteCmd);. 
1ac10 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f   }.  return TCL_
1ac20 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f  OK;.}../*.** Pro
1ac30 76 69 64 65 20 61 20 64 75 6d 6d 79 20 54 63 6c  vide a dummy Tcl
1ac40 5f 49 6e 69 74 53 74 75 62 73 20 69 66 20 77 65  _InitStubs if we
1ac50 20 61 72 65 20 75 73 69 6e 67 20 74 68 69 73 20   are using this 
1ac60 61 73 20 61 20 73 74 61 74 69 63 0a 2a 2a 20 6c  as a static.** l
1ac70 69 62 72 61 72 79 2e 0a 2a 2f 0a 23 69 66 6e 64  ibrary..*/.#ifnd
1ac80 65 66 20 55 53 45 5f 54 43 4c 5f 53 54 55 42 53  ef USE_TCL_STUBS
1ac90 0a 23 20 75 6e 64 65 66 20 20 54 63 6c 5f 49 6e  .# undef  Tcl_In
1aca0 69 74 53 74 75 62 73 0a 23 20 64 65 66 69 6e 65  itStubs.# define
1acb0 20 54 63 6c 5f 49 6e 69 74 53 74 75 62 73 28 61   Tcl_InitStubs(a
1acc0 2c 62 2c 63 29 20 54 43 4c 5f 56 45 52 53 49 4f  ,b,c) TCL_VERSIO
1acd0 4e 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  N.#endif../*.** 
1ace0 4d 61 6b 65 20 73 75 72 65 20 77 65 20 68 61 76  Make sure we hav
1acf0 65 20 61 20 50 41 43 4b 41 47 45 5f 56 45 52 53  e a PACKAGE_VERS
1ad00 49 4f 4e 20 6d 61 63 72 6f 20 64 65 66 69 6e 65  ION macro define
1ad10 64 2e 20 20 54 68 69 73 20 77 69 6c 6c 20 62 65  d.  This will be
1ad20 0a 2a 2a 20 64 65 66 69 6e 65 64 20 61 75 74 6f  .** defined auto
1ad30 6d 61 74 69 63 61 6c 6c 79 20 62 79 20 74 68 65  matically by the
1ad40 20 54 45 41 20 6d 61 6b 65 66 69 6c 65 2e 20 20   TEA makefile.  
1ad50 42 75 74 20 6f 74 68 65 72 20 6d 61 6b 65 66 69  But other makefi
1ad60 6c 65 73 0a 2a 2a 20 64 6f 20 6e 6f 74 20 64 65  les.** do not de
1ad70 66 69 6e 65 20 69 74 2e 0a 2a 2f 0a 23 69 66 6e  fine it..*/.#ifn
1ad80 64 65 66 20 50 41 43 4b 41 47 45 5f 56 45 52 53  def PACKAGE_VERS
1ad90 49 4f 4e 0a 23 20 64 65 66 69 6e 65 20 50 41 43  ION.# define PAC
1ada0 4b 41 47 45 5f 56 45 52 53 49 4f 4e 20 53 51 4c  KAGE_VERSION SQL
1adb0 49 54 45 5f 56 45 52 53 49 4f 4e 0a 23 65 6e 64  ITE_VERSION.#end
1adc0 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61  if../*.** Initia
1add0 6c 69 7a 65 20 74 68 69 73 20 6d 6f 64 75 6c 65  lize this module
1ade0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 54 63 6c  ..**.** This Tcl
1adf0 20 6d 6f 64 75 6c 65 20 63 6f 6e 74 61 69 6e 73   module contains
1ae00 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 6e   only a single n
1ae10 65 77 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 20 6e  ew Tcl command n
1ae20 61 6d 65 64 20 22 73 71 6c 69 74 65 22 2e 0a 2a  amed "sqlite"..*
1ae30 2a 20 28 48 65 6e 63 65 20 74 68 65 72 65 20 69  * (Hence there i
1ae40 73 20 6e 6f 20 6e 61 6d 65 73 70 61 63 65 2e 20  s no namespace. 
1ae50 20 54 68 65 72 65 20 69 73 20 6e 6f 20 70 6f 69   There is no poi
1ae60 6e 74 20 69 6e 20 75 73 69 6e 67 20 61 20 6e 61  nt in using a na
1ae70 6d 65 73 70 61 63 65 0a 2a 2a 20 69 66 20 74 68  mespace.** if th
1ae80 65 20 65 78 74 65 6e 73 69 6f 6e 20 6f 6e 6c 79  e extension only
1ae90 20 73 75 70 70 6c 69 65 73 20 6f 6e 65 20 6e 65   supplies one ne
1aea0 77 20 6e 61 6d 65 21 29 20 20 54 68 65 20 22 73  w name!)  The "s
1aeb0 71 6c 69 74 65 22 20 63 6f 6d 6d 61 6e 64 20 69  qlite" command i
1aec0 73 0a 2a 2a 20 75 73 65 64 20 74 6f 20 6f 70 65  s.** used to ope
1aed0 6e 20 61 20 6e 65 77 20 53 51 4c 69 74 65 20 64  n a new SQLite d
1aee0 61 74 61 62 61 73 65 2e 20 20 53 65 65 20 74 68  atabase.  See th
1aef0 65 20 44 62 4d 61 69 6e 28 29 20 72 6f 75 74 69  e DbMain() routi
1af00 6e 65 20 61 62 6f 76 65 0a 2a 2a 20 66 6f 72 20  ne above.** for 
1af10 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
1af20 6d 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  mation..**.** Th
1af30 65 20 45 58 54 45 52 4e 20 6d 61 63 72 6f 73 20  e EXTERN macros 
1af40 61 72 65 20 72 65 71 75 69 72 65 64 20 62 79 20  are required by 
1af50 54 43 4c 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  TCL in order to 
1af60 77 6f 72 6b 20 6f 6e 20 77 69 6e 64 6f 77 73 2e  work on windows.
1af70 0a 2a 2f 0a 45 58 54 45 52 4e 20 69 6e 74 20 53  .*/.EXTERN int S
1af80 71 6c 69 74 65 33 5f 49 6e 69 74 28 54 63 6c 5f  qlite3_Init(Tcl_
1af90 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b  Interp *interp){
1afa0 0a 20 20 69 6e 74 20 72 63 20 3d 20 54 63 6c 5f  .  int rc = Tcl_
1afb0 49 6e 69 74 53 74 75 62 73 28 69 6e 74 65 72 70  InitStubs(interp
1afc0 2c 20 22 38 2e 34 22 2c 20 30 29 20 3f 20 54 43  , "8.4", 0) ? TC
1afd0 4c 5f 4f 4b 20 3a 20 54 43 4c 5f 45 52 52 4f 52  L_OK : TCL_ERROR
1afe0 3b 0a 20 20 69 66 28 20 72 63 3d 3d 54 43 4c 5f  ;.  if( rc==TCL_
1aff0 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 43 72  OK ){.    Tcl_Cr
1b000 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69  eateObjCommand(i
1b010 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 33 22  nterp, "sqlite3"
1b020 2c 20 28 54 63 6c 5f 4f 62 6a 43 6d 64 50 72 6f  , (Tcl_ObjCmdPro
1b030 63 2a 29 44 62 4d 61 69 6e 2c 20 30 2c 20 30 29  c*)DbMain, 0, 0)
1b040 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
1b050 5f 33 5f 53 55 46 46 49 58 5f 4f 4e 4c 59 0a 20  _3_SUFFIX_ONLY. 
1b060 20 20 20 2f 2a 20 54 68 65 20 22 73 71 6c 69 74     /* The "sqlit
1b070 65 22 20 61 6c 69 61 73 20 69 73 20 75 6e 64 6f  e" alias is undo
1b080 63 75 6d 65 6e 74 65 64 2e 20 20 49 74 20 69 73  cumented.  It is
1b090 20 68 65 72 65 20 6f 6e 6c 79 20 74 6f 20 73 75   here only to su
1b0a0 70 70 6f 72 74 0a 20 20 20 20 2a 2a 20 6c 65 67  pport.    ** leg
1b0b0 61 63 79 20 73 63 72 69 70 74 73 2e 20 20 41 6c  acy scripts.  Al
1b0c0 6c 20 6e 65 77 20 73 63 72 69 70 74 73 20 73 68  l new scripts sh
1b0d0 6f 75 6c 64 20 75 73 65 20 6f 6e 6c 79 20 74 68  ould use only th
1b0e0 65 20 22 73 71 6c 69 74 65 33 22 0a 20 20 20 20  e "sqlite3".    
1b0f0 2a 2a 20 63 6f 6d 6d 61 6e 64 2e 20 2a 2f 0a 20  ** command. */. 
1b100 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a     Tcl_CreateObj
1b110 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20  Command(interp, 
1b120 22 73 71 6c 69 74 65 22 2c 20 28 54 63 6c 5f 4f  "sqlite", (Tcl_O
1b130 62 6a 43 6d 64 50 72 6f 63 2a 29 44 62 4d 61 69  bjCmdProc*)DbMai
1b140 6e 2c 20 30 2c 20 30 29 3b 0a 23 65 6e 64 69 66  n, 0, 0);.#endif
1b150 0a 20 20 20 20 72 63 20 3d 20 54 63 6c 5f 50 6b  .    rc = Tcl_Pk
1b160 67 50 72 6f 76 69 64 65 28 69 6e 74 65 72 70 2c  gProvide(interp,
1b170 20 22 73 71 6c 69 74 65 33 22 2c 20 50 41 43 4b   "sqlite3", PACK
1b180 41 47 45 5f 56 45 52 53 49 4f 4e 29 3b 0a 20 20  AGE_VERSION);.  
1b190 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
1b1a0 0a 45 58 54 45 52 4e 20 69 6e 74 20 54 63 6c 73  .EXTERN int Tcls
1b1b0 71 6c 69 74 65 33 5f 49 6e 69 74 28 54 63 6c 5f  qlite3_Init(Tcl_
1b1c0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b  Interp *interp){
1b1d0 20 72 65 74 75 72 6e 20 53 71 6c 69 74 65 33 5f   return Sqlite3_
1b1e0 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 20 7d 0a  Init(interp); }.
1b1f0 45 58 54 45 52 4e 20 69 6e 74 20 53 71 6c 69 74  EXTERN int Sqlit
1b200 65 33 5f 55 6e 6c 6f 61 64 28 54 63 6c 5f 49 6e  e3_Unload(Tcl_In
1b210 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e  terp *interp, in
1b220 74 20 66 6c 61 67 73 29 7b 20 72 65 74 75 72 6e  t flags){ return
1b230 20 54 43 4c 5f 4f 4b 3b 20 7d 0a 45 58 54 45 52   TCL_OK; }.EXTER
1b240 4e 20 69 6e 74 20 54 63 6c 73 71 6c 69 74 65 33  N int Tclsqlite3
1b250 5f 55 6e 6c 6f 61 64 28 54 63 6c 5f 49 6e 74 65  _Unload(Tcl_Inte
1b260 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20  rp *interp, int 
1b270 66 6c 61 67 73 29 7b 20 72 65 74 75 72 6e 20 54  flags){ return T
1b280 43 4c 5f 4f 4b 3b 20 7d 0a 0a 2f 2a 20 42 65 63  CL_OK; }../* Bec
1b290 61 75 73 65 20 69 74 20 61 63 63 65 73 73 65 73  ause it accesses
1b2a0 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
1b2b0 20 61 6e 64 20 75 73 65 73 20 70 65 72 73 69 73   and uses persis
1b2c0 74 65 6e 74 20 73 74 61 74 65 2c 20 53 51 4c 69  tent state, SQLi
1b2d0 74 65 0a 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6e  te.** is not con
1b2e0 73 69 64 65 72 65 64 20 61 70 70 72 6f 70 72 69  sidered appropri
1b2f0 61 74 65 20 66 6f 72 20 73 61 66 65 20 69 6e 74  ate for safe int
1b300 65 72 70 72 65 74 65 72 73 2e 20 20 48 65 6e 63  erpreters.  Henc
1b310 65 2c 20 77 65 20 63 61 75 73 65 0a 2a 2a 20 74  e, we cause.** t
1b320 68 65 20 5f 53 61 66 65 49 6e 69 74 28 29 20 69  he _SafeInit() i
1b330 6e 74 65 72 66 61 63 65 73 20 72 65 74 75 72 6e  nterfaces return
1b340 20 54 43 4c 5f 45 52 52 4f 52 2e 0a 2a 2f 0a 45   TCL_ERROR..*/.E
1b350 58 54 45 52 4e 20 69 6e 74 20 53 71 6c 69 74 65  XTERN int Sqlite
1b360 33 5f 53 61 66 65 49 6e 69 74 28 54 63 6c 5f 49  3_SafeInit(Tcl_I
1b370 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 20  nterp *interp){ 
1b380 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1b390 3b 20 7d 0a 45 58 54 45 52 4e 20 69 6e 74 20 53  ; }.EXTERN int S
1b3a0 71 6c 69 74 65 33 5f 53 61 66 65 55 6e 6c 6f 61  qlite3_SafeUnloa
1b3b0 64 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  d(Tcl_Interp *in
1b3c0 74 65 72 70 2c 20 69 6e 74 20 66 6c 61 67 73 29  terp, int flags)
1b3d0 7b 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  {return TCL_ERRO
1b3e0 52 3b 7d 0a 0a 0a 0a 23 69 66 6e 64 65 66 20 53  R;}....#ifndef S
1b3f0 51 4c 49 54 45 5f 33 5f 53 55 46 46 49 58 5f 4f  QLITE_3_SUFFIX_O
1b400 4e 4c 59 0a 69 6e 74 20 53 71 6c 69 74 65 5f 49  NLY.int Sqlite_I
1b410 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a  nit(Tcl_Interp *
1b420 69 6e 74 65 72 70 29 7b 20 72 65 74 75 72 6e 20  interp){ return 
1b430 53 71 6c 69 74 65 33 5f 49 6e 69 74 28 69 6e 74  Sqlite3_Init(int
1b440 65 72 70 29 3b 20 7d 0a 69 6e 74 20 54 63 6c 73  erp); }.int Tcls
1b450 71 6c 69 74 65 5f 49 6e 69 74 28 54 63 6c 5f 49  qlite_Init(Tcl_I
1b460 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 20  nterp *interp){ 
1b470 72 65 74 75 72 6e 20 53 71 6c 69 74 65 33 5f 49  return Sqlite3_I
1b480 6e 69 74 28 69 6e 74 65 72 70 29 3b 20 7d 0a 69  nit(interp); }.i
1b490 6e 74 20 53 71 6c 69 74 65 5f 55 6e 6c 6f 61 64  nt Sqlite_Unload
1b4a0 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74  (Tcl_Interp *int
1b4b0 65 72 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b  erp, int flags){
1b4c0 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20   return TCL_OK; 
1b4d0 7d 0a 69 6e 74 20 54 63 6c 73 71 6c 69 74 65 5f  }.int Tclsqlite_
1b4e0 55 6e 6c 6f 61 64 28 54 63 6c 5f 49 6e 74 65 72  Unload(Tcl_Inter
1b4f0 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 66  p *interp, int f
1b500 6c 61 67 73 29 7b 20 72 65 74 75 72 6e 20 54 43  lags){ return TC
1b510 4c 5f 4f 4b 3b 20 7d 0a 23 65 6e 64 69 66 0a 0a  L_OK; }.#endif..
1b520 23 69 66 64 65 66 20 54 43 4c 53 48 0a 2f 2a 2a  #ifdef TCLSH./**
1b530 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1b540 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1b550 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1b560 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1b570 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 41  ***********.** A
1b580 6c 6c 20 6f 66 20 74 68 65 20 63 6f 64 65 20 74  ll of the code t
1b590 68 61 74 20 66 6f 6c 6c 6f 77 73 20 69 73 20 75  hat follows is u
1b5a0 73 65 64 20 74 6f 20 62 75 69 6c 64 20 73 74 61  sed to build sta
1b5b0 6e 64 61 6c 6f 6e 65 20 54 43 4c 20 69 6e 74 65  ndalone TCL inte
1b5c0 72 70 72 65 74 65 72 73 0a 2a 2a 20 74 68 61 74  rpreters.** that
1b5d0 20 61 72 65 20 73 74 61 74 69 63 61 6c 6c 79 20   are statically 
1b5e0 6c 69 6e 6b 65 64 20 77 69 74 68 20 53 51 4c 69  linked with SQLi
1b5f0 74 65 2e 20 20 45 6e 61 62 6c 65 20 74 68 65 73  te.  Enable thes
1b600 65 20 62 79 20 63 6f 6d 70 69 6c 69 6e 67 0a 2a  e by compiling.*
1b610 2a 20 77 69 74 68 20 2d 44 54 43 4c 53 48 3d 6e  * with -DTCLSH=n
1b620 20 77 68 65 72 65 20 6e 20 63 61 6e 20 62 65 20   where n can be 
1b630 31 20 6f 72 20 32 2e 20 20 41 6e 20 6e 20 6f 66  1 or 2.  An n of
1b640 20 31 20 67 65 6e 65 72 61 74 65 73 20 61 20 73   1 generates a s
1b650 74 61 6e 64 61 72 64 0a 2a 2a 20 74 63 6c 73 68  tandard.** tclsh
1b660 20 62 75 74 20 77 69 74 68 20 53 51 4c 69 74 65   but with SQLite
1b670 20 62 75 69 6c 74 20 69 6e 2e 20 20 41 6e 20 6e   built in.  An n
1b680 20 6f 66 20 32 20 67 65 6e 65 72 61 74 65 73 20   of 2 generates 
1b690 74 68 65 20 53 51 4c 69 74 65 20 73 70 61 63 65  the SQLite space
1b6a0 0a 2a 2a 20 61 6e 61 6c 79 73 69 73 20 70 72 6f  .** analysis pro
1b6b0 67 72 61 6d 2e 0a 2a 2f 0a 0a 23 69 66 20 64 65  gram..*/..#if de
1b6c0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53  fined(SQLITE_TES
1b6d0 54 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  T) || defined(SQ
1b6e0 4c 49 54 45 5f 54 43 4c 4d 44 35 29 0a 2f 2a 0a  LITE_TCLMD5)./*.
1b6f0 20 2a 20 54 68 69 73 20 63 6f 64 65 20 69 6d 70   * This code imp
1b700 6c 65 6d 65 6e 74 73 20 74 68 65 20 4d 44 35 20  lements the MD5 
1b710 6d 65 73 73 61 67 65 2d 64 69 67 65 73 74 20 61  message-digest a
1b720 6c 67 6f 72 69 74 68 6d 2e 0a 20 2a 20 54 68 65  lgorithm.. * The
1b730 20 61 6c 67 6f 72 69 74 68 6d 20 69 73 20 64 75   algorithm is du
1b740 65 20 74 6f 20 52 6f 6e 20 52 69 76 65 73 74 2e  e to Ron Rivest.
1b750 20 20 54 68 69 73 20 63 6f 64 65 20 77 61 73 0a    This code was.
1b760 20 2a 20 77 72 69 74 74 65 6e 20 62 79 20 43 6f   * written by Co
1b770 6c 69 6e 20 50 6c 75 6d 62 20 69 6e 20 31 39 39  lin Plumb in 199
1b780 33 2c 20 6e 6f 20 63 6f 70 79 72 69 67 68 74 20  3, no copyright 
1b790 69 73 20 63 6c 61 69 6d 65 64 2e 0a 20 2a 20 54  is claimed.. * T
1b7a0 68 69 73 20 63 6f 64 65 20 69 73 20 69 6e 20 74  his code is in t
1b7b0 68 65 20 70 75 62 6c 69 63 20 64 6f 6d 61 69 6e  he public domain
1b7c0 3b 20 64 6f 20 77 69 74 68 20 69 74 20 77 68 61  ; do with it wha
1b7d0 74 20 79 6f 75 20 77 69 73 68 2e 0a 20 2a 0a 20  t you wish.. *. 
1b7e0 2a 20 45 71 75 69 76 61 6c 65 6e 74 20 63 6f 64  * Equivalent cod
1b7f0 65 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20 66  e is available f
1b800 72 6f 6d 20 52 53 41 20 44 61 74 61 20 53 65 63  rom RSA Data Sec
1b810 75 72 69 74 79 2c 20 49 6e 63 2e 0a 20 2a 20 54  urity, Inc.. * T
1b820 68 69 73 20 63 6f 64 65 20 68 61 73 20 62 65 65  his code has bee
1b830 6e 20 74 65 73 74 65 64 20 61 67 61 69 6e 73 74  n tested against
1b840 20 74 68 61 74 2c 20 61 6e 64 20 69 73 20 65 71   that, and is eq
1b850 75 69 76 61 6c 65 6e 74 2c 0a 20 2a 20 65 78 63  uivalent,. * exc
1b860 65 70 74 20 74 68 61 74 20 79 6f 75 20 64 6f 6e  ept that you don
1b870 27 74 20 6e 65 65 64 20 74 6f 20 69 6e 63 6c 75  't need to inclu
1b880 64 65 20 74 77 6f 20 70 61 67 65 73 20 6f 66 20  de two pages of 
1b890 6c 65 67 61 6c 65 73 65 0a 20 2a 20 77 69 74 68  legalese. * with
1b8a0 20 65 76 65 72 79 20 63 6f 70 79 2e 0a 20 2a 0a   every copy.. *.
1b8b0 20 2a 20 54 6f 20 63 6f 6d 70 75 74 65 20 74 68   * To compute th
1b8c0 65 20 6d 65 73 73 61 67 65 20 64 69 67 65 73 74  e message digest
1b8d0 20 6f 66 20 61 20 63 68 75 6e 6b 20 6f 66 20 62   of a chunk of b
1b8e0 79 74 65 73 2c 20 64 65 63 6c 61 72 65 20 61 6e  ytes, declare an
1b8f0 0a 20 2a 20 4d 44 35 43 6f 6e 74 65 78 74 20 73  . * MD5Context s
1b900 74 72 75 63 74 75 72 65 2c 20 70 61 73 73 20 69  tructure, pass i
1b910 74 20 74 6f 20 4d 44 35 49 6e 69 74 2c 20 63 61  t to MD5Init, ca
1b920 6c 6c 20 4d 44 35 55 70 64 61 74 65 20 61 73 0a  ll MD5Update as.
1b930 20 2a 20 6e 65 65 64 65 64 20 6f 6e 20 62 75 66   * needed on buf
1b940 66 65 72 73 20 66 75 6c 6c 20 6f 66 20 62 79 74  fers full of byt
1b950 65 73 2c 20 61 6e 64 20 74 68 65 6e 20 63 61 6c  es, and then cal
1b960 6c 20 4d 44 35 46 69 6e 61 6c 2c 20 77 68 69 63  l MD5Final, whic
1b970 68 0a 20 2a 20 77 69 6c 6c 20 66 69 6c 6c 20 61  h. * will fill a
1b980 20 73 75 70 70 6c 69 65 64 20 31 36 2d 62 79 74   supplied 16-byt
1b990 65 20 61 72 72 61 79 20 77 69 74 68 20 74 68 65  e array with the
1b9a0 20 64 69 67 65 73 74 2e 0a 20 2a 2f 0a 0a 2f 2a   digest.. */../*
1b9b0 0a 20 2a 20 49 66 20 63 6f 6d 70 69 6c 65 64 20  . * If compiled 
1b9c0 6f 6e 20 61 20 6d 61 63 68 69 6e 65 20 74 68 61  on a machine tha
1b9d0 74 20 64 6f 65 73 6e 27 74 20 68 61 76 65 20 61  t doesn't have a
1b9e0 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 2c   32-bit integer,
1b9f0 0a 20 2a 20 79 6f 75 20 6a 75 73 74 20 73 65 74  . * you just set
1ba00 20 22 75 69 6e 74 33 32 22 20 74 6f 20 74 68 65   "uint32" to the
1ba10 20 61 70 70 72 6f 70 72 69 61 74 65 20 64 61 74   appropriate dat
1ba20 61 74 79 70 65 20 66 6f 72 20 61 6e 0a 20 2a 20  atype for an. * 
1ba30 75 6e 73 69 67 6e 65 64 20 33 32 2d 62 69 74 20  unsigned 32-bit 
1ba40 69 6e 74 65 67 65 72 2e 20 20 46 6f 72 20 65 78  integer.  For ex
1ba50 61 6d 70 6c 65 3a 0a 20 2a 0a 20 2a 20 20 20 20  ample:. *. *    
1ba60 20 20 20 63 63 20 2d 44 75 69 6e 74 33 32 3d 27     cc -Duint32='
1ba70 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 27 20 6d  unsigned long' m
1ba80 64 35 2e 63 0a 20 2a 0a 20 2a 2f 0a 23 69 66 6e  d5.c. *. */.#ifn
1ba90 64 65 66 20 75 69 6e 74 33 32 0a 23 20 20 64 65  def uint32.#  de
1baa0 66 69 6e 65 20 75 69 6e 74 33 32 20 75 6e 73 69  fine uint32 unsi
1bab0 67 6e 65 64 20 69 6e 74 0a 23 65 6e 64 69 66 0a  gned int.#endif.
1bac0 0a 73 74 72 75 63 74 20 4d 44 35 43 6f 6e 74 65  .struct MD5Conte
1bad0 78 74 20 7b 0a 20 20 69 6e 74 20 69 73 49 6e 69  xt {.  int isIni
1bae0 74 3b 0a 20 20 75 69 6e 74 33 32 20 62 75 66 5b  t;.  uint32 buf[
1baf0 34 5d 3b 0a 20 20 75 69 6e 74 33 32 20 62 69 74  4];.  uint32 bit
1bb00 73 5b 32 5d 3b 0a 20 20 75 6e 73 69 67 6e 65 64  s[2];.  unsigned
1bb10 20 63 68 61 72 20 69 6e 5b 36 34 5d 3b 0a 7d 3b   char in[64];.};
1bb20 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
1bb30 4d 44 35 43 6f 6e 74 65 78 74 20 4d 44 35 43 6f  MD5Context MD5Co
1bb40 6e 74 65 78 74 3b 0a 0a 2f 2a 0a 20 2a 20 4e 6f  ntext;../*. * No
1bb50 74 65 3a 20 74 68 69 73 20 63 6f 64 65 20 69 73  te: this code is
1bb60 20 68 61 72 6d 6c 65 73 73 20 6f 6e 20 6c 69 74   harmless on lit
1bb70 74 6c 65 2d 65 6e 64 69 61 6e 20 6d 61 63 68 69  tle-endian machi
1bb80 6e 65 73 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20  nes.. */.static 
1bb90 76 6f 69 64 20 62 79 74 65 52 65 76 65 72 73 65  void byteReverse
1bba0 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20   (unsigned char 
1bbb0 2a 62 75 66 2c 20 75 6e 73 69 67 6e 65 64 20 6c  *buf, unsigned l
1bbc0 6f 6e 67 73 29 7b 0a 20 20 20 20 20 20 20 20 75  ongs){.        u
1bbd0 69 6e 74 33 32 20 74 3b 0a 20 20 20 20 20 20 20  int32 t;.       
1bbe0 20 64 6f 20 7b 0a 20 20 20 20 20 20 20 20 20 20   do {.          
1bbf0 20 20 20 20 20 20 74 20 3d 20 28 75 69 6e 74 33        t = (uint3
1bc00 32 29 28 28 75 6e 73 69 67 6e 65 64 29 62 75 66  2)((unsigned)buf
1bc10 5b 33 5d 3c 3c 38 20 7c 20 62 75 66 5b 32 5d 29  [3]<<8 | buf[2])
1bc20 20 3c 3c 20 31 36 20 7c 0a 20 20 20 20 20 20 20   << 16 |.       
1bc30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bc40 20 20 20 20 20 28 28 75 6e 73 69 67 6e 65 64 29       ((unsigned)
1bc50 62 75 66 5b 31 5d 3c 3c 38 20 7c 20 62 75 66 5b  buf[1]<<8 | buf[
1bc60 30 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  0]);.           
1bc70 20 20 20 20 20 2a 28 75 69 6e 74 33 32 20 2a 29       *(uint32 *)
1bc80 62 75 66 20 3d 20 74 3b 0a 20 20 20 20 20 20 20  buf = t;.       
1bc90 20 20 20 20 20 20 20 20 20 62 75 66 20 2b 3d 20           buf += 
1bca0 34 3b 0a 20 20 20 20 20 20 20 20 7d 20 77 68 69  4;.        } whi
1bcb0 6c 65 20 28 2d 2d 6c 6f 6e 67 73 29 3b 0a 7d 0a  le (--longs);.}.
1bcc0 2f 2a 20 54 68 65 20 66 6f 75 72 20 63 6f 72 65  /* The four core
1bcd0 20 66 75 6e 63 74 69 6f 6e 73 20 2d 20 46 31 20   functions - F1 
1bce0 69 73 20 6f 70 74 69 6d 69 7a 65 64 20 73 6f 6d  is optimized som
1bcf0 65 77 68 61 74 20 2a 2f 0a 0a 2f 2a 20 23 64 65  ewhat */../* #de
1bd00 66 69 6e 65 20 46 31 28 78 2c 20 79 2c 20 7a 29  fine F1(x, y, z)
1bd10 20 28 78 20 26 20 79 20 7c 20 7e 78 20 26 20 7a   (x & y | ~x & z
1bd20 29 20 2a 2f 0a 23 64 65 66 69 6e 65 20 46 31 28  ) */.#define F1(
1bd30 78 2c 20 79 2c 20 7a 29 20 28 7a 20 5e 20 28 78  x, y, z) (z ^ (x
1bd40 20 26 20 28 79 20 5e 20 7a 29 29 29 0a 23 64 65   & (y ^ z))).#de
1bd50 66 69 6e 65 20 46 32 28 78 2c 20 79 2c 20 7a 29  fine F2(x, y, z)
1bd60 20 46 31 28 7a 2c 20 78 2c 20 79 29 0a 23 64 65   F1(z, x, y).#de
1bd70 66 69 6e 65 20 46 33 28 78 2c 20 79 2c 20 7a 29  fine F3(x, y, z)
1bd80 20 28 78 20 5e 20 79 20 5e 20 7a 29 0a 23 64 65   (x ^ y ^ z).#de
1bd90 66 69 6e 65 20 46 34 28 78 2c 20 79 2c 20 7a 29  fine F4(x, y, z)
1bda0 20 28 79 20 5e 20 28 78 20 7c 20 7e 7a 29 29 0a   (y ^ (x | ~z)).
1bdb0 0a 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65 20  ./* This is the 
1bdc0 63 65 6e 74 72 61 6c 20 73 74 65 70 20 69 6e 20  central step in 
1bdd0 74 68 65 20 4d 44 35 20 61 6c 67 6f 72 69 74 68  the MD5 algorith
1bde0 6d 2e 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 44  m. */.#define MD
1bdf0 35 53 54 45 50 28 66 2c 20 77 2c 20 78 2c 20 79  5STEP(f, w, x, y
1be00 2c 20 7a 2c 20 64 61 74 61 2c 20 73 29 20 5c 0a  , z, data, s) \.
1be10 20 20 20 20 20 20 20 20 28 20 77 20 2b 3d 20 66          ( w += f
1be20 28 78 2c 20 79 2c 20 7a 29 20 2b 20 64 61 74 61  (x, y, z) + data
1be30 2c 20 20 77 20 3d 20 77 3c 3c 73 20 7c 20 77 3e  ,  w = w<<s | w>
1be40 3e 28 33 32 2d 73 29 2c 20 20 77 20 2b 3d 20 78  >(32-s),  w += x
1be50 20 29 0a 0a 2f 2a 0a 20 2a 20 54 68 65 20 63 6f   )../*. * The co
1be60 72 65 20 6f 66 20 74 68 65 20 4d 44 35 20 61 6c  re of the MD5 al
1be70 67 6f 72 69 74 68 6d 2c 20 74 68 69 73 20 61 6c  gorithm, this al
1be80 74 65 72 73 20 61 6e 20 65 78 69 73 74 69 6e 67  ters an existing
1be90 20 4d 44 35 20 68 61 73 68 20 74 6f 0a 20 2a 20   MD5 hash to. * 
1bea0 72 65 66 6c 65 63 74 20 74 68 65 20 61 64 64 69  reflect the addi
1beb0 74 69 6f 6e 20 6f 66 20 31 36 20 6c 6f 6e 67 77  tion of 16 longw
1bec0 6f 72 64 73 20 6f 66 20 6e 65 77 20 64 61 74 61  ords of new data
1bed0 2e 20 20 4d 44 35 55 70 64 61 74 65 20 62 6c 6f  .  MD5Update blo
1bee0 63 6b 73 0a 20 2a 20 74 68 65 20 64 61 74 61 20  cks. * the data 
1bef0 61 6e 64 20 63 6f 6e 76 65 72 74 73 20 62 79 74  and converts byt
1bf00 65 73 20 69 6e 74 6f 20 6c 6f 6e 67 77 6f 72 64  es into longword
1bf10 73 20 66 6f 72 20 74 68 69 73 20 72 6f 75 74 69  s for this routi
1bf20 6e 65 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20 76  ne.. */.static v
1bf30 6f 69 64 20 4d 44 35 54 72 61 6e 73 66 6f 72 6d  oid MD5Transform
1bf40 28 75 69 6e 74 33 32 20 62 75 66 5b 34 5d 2c 20  (uint32 buf[4], 
1bf50 63 6f 6e 73 74 20 75 69 6e 74 33 32 20 69 6e 5b  const uint32 in[
1bf60 31 36 5d 29 7b 0a 20 20 20 20 20 20 20 20 72 65  16]){.        re
1bf70 67 69 73 74 65 72 20 75 69 6e 74 33 32 20 61 2c  gister uint32 a,
1bf80 20 62 2c 20 63 2c 20 64 3b 0a 0a 20 20 20 20 20   b, c, d;..     
1bf90 20 20 20 61 20 3d 20 62 75 66 5b 30 5d 3b 0a 20     a = buf[0];. 
1bfa0 20 20 20 20 20 20 20 62 20 3d 20 62 75 66 5b 31         b = buf[1
1bfb0 5d 3b 0a 20 20 20 20 20 20 20 20 63 20 3d 20 62  ];.        c = b
1bfc0 75 66 5b 32 5d 3b 0a 20 20 20 20 20 20 20 20 64  uf[2];.        d
1bfd0 20 3d 20 62 75 66 5b 33 5d 3b 0a 0a 20 20 20 20   = buf[3];..    
1bfe0 20 20 20 20 4d 44 35 53 54 45 50 28 46 31 2c 20      MD5STEP(F1, 
1bff0 61 2c 20 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 20  a, b, c, d, in[ 
1c000 30 5d 2b 30 78 64 37 36 61 61 34 37 38 2c 20 20  0]+0xd76aa478,  
1c010 37 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53  7);.        MD5S
1c020 54 45 50 28 46 31 2c 20 64 2c 20 61 2c 20 62 2c  TEP(F1, d, a, b,
1c030 20 63 2c 20 69 6e 5b 20 31 5d 2b 30 78 65 38 63   c, in[ 1]+0xe8c
1c040 37 62 37 35 36 2c 20 31 32 29 3b 0a 20 20 20 20  7b756, 12);.    
1c050 20 20 20 20 4d 44 35 53 54 45 50 28 46 31 2c 20      MD5STEP(F1, 
1c060 63 2c 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 20  c, d, a, b, in[ 
1c070 32 5d 2b 30 78 32 34 32 30 37 30 64 62 2c 20 31  2]+0x242070db, 1
1c080 37 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53  7);.        MD5S
1c090 54 45 50 28 46 31 2c 20 62 2c 20 63 2c 20 64 2c  TEP(F1, b, c, d,
1c0a0 20 61 2c 20 69 6e 5b 20 33 5d 2b 30 78 63 31 62   a, in[ 3]+0xc1b
1c0b0 64 63 65 65 65 2c 20 32 32 29 3b 0a 20 20 20 20  dceee, 22);.    
1c0c0 20 20 20 20 4d 44 35 53 54 45 50 28 46 31 2c 20      MD5STEP(F1, 
1c0d0 61 2c 20 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 20  a, b, c, d, in[ 
1c0e0 34 5d 2b 30 78 66 35 37 63 30 66 61 66 2c 20 20  4]+0xf57c0faf,  
1c0f0 37 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53  7);.        MD5S
1c100 54 45 50 28 46 31 2c 20 64 2c 20 61 2c 20 62 2c  TEP(F1, d, a, b,
1c110 20 63 2c 20 69 6e 5b 20 35 5d 2b 30 78 34 37 38   c, in[ 5]+0x478
1c120 37 63 36 32 61 2c 20 31 32 29 3b 0a 20 20 20 20  7c62a, 12);.    
1c130 20 20 20 20 4d 44 35 53 54 45 50 28 46 31 2c 20      MD5STEP(F1, 
1c140 63 2c 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 20  c, d, a, b, in[ 
1c150 36 5d 2b 30 78 61 38 33 30 34 36 31 33 2c 20 31  6]+0xa8304613, 1
1c160 37 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53  7);.        MD5S
1c170 54 45 50 28 46 31 2c 20 62 2c 20 63 2c 20 64 2c  TEP(F1, b, c, d,
1c180 20 61 2c 20 69 6e 5b 20 37 5d 2b 30 78 66 64 34   a, in[ 7]+0xfd4
1c190 36 39 35 30 31 2c 20 32 32 29 3b 0a 20 20 20 20  69501, 22);.    
1c1a0 20 20 20 20 4d 44 35 53 54 45 50 28 46 31 2c 20      MD5STEP(F1, 
1c1b0 61 2c 20 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 20  a, b, c, d, in[ 
1c1c0 38 5d 2b 30 78 36 39 38 30 39 38 64 38 2c 20 20  8]+0x698098d8,  
1c1d0 37 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53  7);.        MD5S
1c1e0 54 45 50 28 46 31 2c 20 64 2c 20 61 2c 20 62 2c  TEP(F1, d, a, b,
1c1f0 20 63 2c 20 69 6e 5b 20 39 5d 2b 30 78 38 62 34   c, in[ 9]+0x8b4
1c200 34 66 37 61 66 2c 20 31 32 29 3b 0a 20 20 20 20  4f7af, 12);.    
1c210 20 20 20 20 4d 44 35 53 54 45 50 28 46 31 2c 20      MD5STEP(F1, 
1c220 63 2c 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 31  c, d, a, b, in[1
1c230 30 5d 2b 30 78 66 66 66 66 35 62 62 31 2c 20 31  0]+0xffff5bb1, 1
1c240 37 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53  7);.        MD5S
1c250 54 45 50 28 46 31 2c 20 62 2c 20 63 2c 20 64 2c  TEP(F1, b, c, d,
1c260 20 61 2c 20 69 6e 5b 31 31 5d 2b 30 78 38 39 35   a, in[11]+0x895
1c270 63 64 37 62 65 2c 20 32 32 29 3b 0a 20 20 20 20  cd7be, 22);.    
1c280 20 20 20 20 4d 44 35 53 54 45 50 28 46 31 2c 20      MD5STEP(F1, 
1c290 61 2c 20 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 31  a, b, c, d, in[1
1c2a0 32 5d 2b 30 78 36 62 39 30 31 31 32 32 2c 20 20  2]+0x6b901122,  
1c2b0 37 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53  7);.        MD5S
1c2c0 54 45 50 28 46 31 2c 20 64 2c 20 61 2c 20 62 2c  TEP(F1, d, a, b,
1c2d0 20 63 2c 20 69 6e 5b 31 33 5d 2b 30 78 66 64 39   c, in[13]+0xfd9
1c2e0 38 37 31 39 33 2c 20 31 32 29 3b 0a 20 20 20 20  87193, 12);.    
1c2f0 20 20 20 20 4d 44 35 53 54 45 50 28 46 31 2c 20      MD5STEP(F1, 
1c300 63 2c 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 31  c, d, a, b, in[1
1c310 34 5d 2b 30 78 61 36 37 39 34 33 38 65 2c 20 31  4]+0xa679438e, 1
1c320 37 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53  7);.        MD5S
1c330 54 45 50 28 46 31 2c 20 62 2c 20 63 2c 20 64 2c  TEP(F1, b, c, d,
1c340 20 61 2c 20 69 6e 5b 31 35 5d 2b 30 78 34 39 62   a, in[15]+0x49b
1c350 34 30 38 32 31 2c 20 32 32 29 3b 0a 0a 20 20 20  40821, 22);..   
1c360 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 32 2c       MD5STEP(F2,
1c370 20 61 2c 20 62 2c 20 63 2c 20 64 2c 20 69 6e 5b   a, b, c, d, in[
1c380 20 31 5d 2b 30 78 66 36 31 65 32 35 36 32 2c 20   1]+0xf61e2562, 
1c390 20 35 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35   5);.        MD5
1c3a0 53 54 45 50 28 46 32 2c 20 64 2c 20 61 2c 20 62  STEP(F2, d, a, b
1c3b0 2c 20 63 2c 20 69 6e 5b 20 36 5d 2b 30 78 63 30  , c, in[ 6]+0xc0
1c3c0 34 30 62 33 34 30 2c 20 20 39 29 3b 0a 20 20 20  40b340,  9);.   
1c3d0 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 32 2c       MD5STEP(F2,
1c3e0 20 63 2c 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b   c, d, a, b, in[
1c3f0 31 31 5d 2b 30 78 32 36 35 65 35 61 35 31 2c 20  11]+0x265e5a51, 
1c400 31 34 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35  14);.        MD5
1c410 53 54 45 50 28 46 32 2c 20 62 2c 20 63 2c 20 64  STEP(F2, b, c, d
1c420 2c 20 61 2c 20 69 6e 5b 20 30 5d 2b 30 78 65 39  , a, in[ 0]+0xe9
1c430 62 36 63 37 61 61 2c 20 32 30 29 3b 0a 20 20 20  b6c7aa, 20);.   
1c440 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 32 2c       MD5STEP(F2,
1c450 20 61 2c 20 62 2c 20 63 2c 20 64 2c 20 69 6e 5b   a, b, c, d, in[
1c460 20 35 5d 2b 30 78 64 36 32 66 31 30 35 64 2c 20   5]+0xd62f105d, 
1c470 20 35 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35   5);.        MD5
1c480 53 54 45 50 28 46 32 2c 20 64 2c 20 61 2c 20 62  STEP(F2, d, a, b
1c490 2c 20 63 2c 20 69 6e 5b 31 30 5d 2b 30 78 30 32  , c, in[10]+0x02
1c4a0 34 34 31 34 35 33 2c 20 20 39 29 3b 0a 20 20 20  441453,  9);.   
1c4b0 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 32 2c       MD5STEP(F2,
1c4c0 20 63 2c 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b   c, d, a, b, in[
1c4d0 31 35 5d 2b 30 78 64 38 61 31 65 36 38 31 2c 20  15]+0xd8a1e681, 
1c4e0 31 34 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35  14);.        MD5
1c4f0 53 54 45 50 28 46 32 2c 20 62 2c 20 63 2c 20 64  STEP(F2, b, c, d
1c500 2c 20 61 2c 20 69 6e 5b 20 34 5d 2b 30 78 65 37  , a, in[ 4]+0xe7
1c510 64 33 66 62 63 38 2c 20 32 30 29 3b 0a 20 20 20  d3fbc8, 20);.   
1c520 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 32 2c       MD5STEP(F2,
1c530 20 61 2c 20 62 2c 20 63 2c 20 64 2c 20 69 6e 5b   a, b, c, d, in[
1c540 20 39 5d 2b 30 78 32 31 65 31 63 64 65 36 2c 20   9]+0x21e1cde6, 
1c550 20 35 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35   5);.        MD5
1c560 53 54 45 50 28 46 32 2c 20 64 2c 20 61 2c 20 62  STEP(F2, d, a, b
1c570 2c 20 63 2c 20 69 6e 5b 31 34 5d 2b 30 78 63 33  , c, in[14]+0xc3
1c580 33 37 30 37 64 36 2c 20 20 39 29 3b 0a 20 20 20  3707d6,  9);.   
1c590 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 32 2c       MD5STEP(F2,
1c5a0 20 63 2c 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b   c, d, a, b, in[
1c5b0 20 33 5d 2b 30 78 66 34 64 35 30 64 38 37 2c 20   3]+0xf4d50d87, 
1c5c0 31 34 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35  14);.        MD5
1c5d0 53 54 45 50 28 46 32 2c 20 62 2c 20 63 2c 20 64  STEP(F2, b, c, d
1c5e0 2c 20 61 2c 20 69 6e 5b 20 38 5d 2b 30 78 34 35  , a, in[ 8]+0x45
1c5f0 35 61 31 34 65 64 2c 20 32 30 29 3b 0a 20 20 20  5a14ed, 20);.   
1c600 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 32 2c       MD5STEP(F2,
1c610 20 61 2c 20 62 2c 20 63 2c 20 64 2c 20 69 6e 5b   a, b, c, d, in[
1c620 31 33 5d 2b 30 78 61 39 65 33 65 39 30 35 2c 20  13]+0xa9e3e905, 
1c630 20 35 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35   5);.        MD5
1c640 53 54 45 50 28 46 32 2c 20 64 2c 20 61 2c 20 62  STEP(F2, d, a, b
1c650 2c 20 63 2c 20 69 6e 5b 20 32 5d 2b 30 78 66 63  , c, in[ 2]+0xfc
1c660 65 66 61 33 66 38 2c 20 20 39 29 3b 0a 20 20 20  efa3f8,  9);.   
1c670 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 32 2c       MD5STEP(F2,
1c680 20 63 2c 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b   c, d, a, b, in[
1c690 20 37 5d 2b 30 78 36 37 36 66 30 32 64 39 2c 20   7]+0x676f02d9, 
1c6a0 31 34 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35  14);.        MD5
1c6b0 53 54 45 50 28 46 32 2c 20 62 2c 20 63 2c 20 64  STEP(F2, b, c, d
1c6c0 2c 20 61 2c 20 69 6e 5b 31 32 5d 2b 30 78 38 64  , a, in[12]+0x8d
1c6d0 32 61 34 63 38 61 2c 20 32 30 29 3b 0a 0a 20 20  2a4c8a, 20);..  
1c6e0 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 33        MD5STEP(F3
1c6f0 2c 20 61 2c 20 62 2c 20 63 2c 20 64 2c 20 69 6e  , a, b, c, d, in
1c700 5b 20 35 5d 2b 30 78 66 66 66 61 33 39 34 32 2c  [ 5]+0xfffa3942,
1c710 20 20 34 29 3b 0a 20 20 20 20 20 20 20 20 4d 44    4);.        MD
1c720 35 53 54 45 50 28 46 33 2c 20 64 2c 20 61 2c 20  5STEP(F3, d, a, 
1c730 62 2c 20 63 2c 20 69 6e 5b 20 38 5d 2b 30 78 38  b, c, in[ 8]+0x8
1c740 37 37 31 66 36 38 31 2c 20 31 31 29 3b 0a 20 20  771f681, 11);.  
1c750 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 33        MD5STEP(F3
1c760 2c 20 63 2c 20 64 2c 20 61 2c 20 62 2c 20 69 6e  , c, d, a, b, in
1c770 5b 31 31 5d 2b 30 78 36 64 39 64 36 31 32 32 2c  [11]+0x6d9d6122,
1c780 20 31 36 29 3b 0a 20 20 20 20 20 20 20 20 4d 44   16);.        MD
1c790 35 53 54 45 50 28 46 33 2c 20 62 2c 20 63 2c 20  5STEP(F3, b, c, 
1c7a0 64 2c 20 61 2c 20 69 6e 5b 31 34 5d 2b 30 78 66  d, a, in[14]+0xf
1c7b0 64 65 35 33 38 30 63 2c 20 32 33 29 3b 0a 20 20  de5380c, 23);.  
1c7c0 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 33        MD5STEP(F3
1c7d0 2c 20 61 2c 20 62 2c 20 63 2c 20 64 2c 20 69 6e  , a, b, c, d, in
1c7e0 5b 20 31 5d 2b 30 78 61 34 62 65 65 61 34 34 2c  [ 1]+0xa4beea44,
1c7f0 20 20 34 29 3b 0a 20 20 20 20 20 20 20 20 4d 44    4);.        MD
1c800 35 53 54 45 50 28 46 33 2c 20 64 2c 20 61 2c 20  5STEP(F3, d, a, 
1c810 62 2c 20 63 2c 20 69 6e 5b 20 34 5d 2b 30 78 34  b, c, in[ 4]+0x4
1c820 62 64 65 63 66 61 39 2c 20 31 31 29 3b 0a 20 20  bdecfa9, 11);.  
1c830 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 33        MD5STEP(F3
1c840 2c 20 63 2c 20 64 2c 20 61 2c 20 62 2c 20 69 6e  , c, d, a, b, in
1c850 5b 20 37 5d 2b 30 78 66 36 62 62 34 62 36 30 2c  [ 7]+0xf6bb4b60,
1c860 20 31 36 29 3b 0a 20 20 20 20 20 20 20 20 4d 44   16);.        MD
1c870 35 53 54 45 50 28 46 33 2c 20 62 2c 20 63 2c 20  5STEP(F3, b, c, 
1c880 64 2c 20 61 2c 20 69 6e 5b 31 30 5d 2b 30 78 62  d, a, in[10]+0xb
1c890 65 62 66 62 63 37 30 2c 20 32 33 29 3b 0a 20 20  ebfbc70, 23);.  
1c8a0 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 33        MD5STEP(F3
1c8b0 2c 20 61 2c 20 62 2c 20 63 2c 20 64 2c 20 69 6e  , a, b, c, d, in
1c8c0 5b 31 33 5d 2b 30 78 32 38 39 62 37 65 63 36 2c  [13]+0x289b7ec6,
1c8d0 20 20 34 29 3b 0a 20 20 20 20 20 20 20 20 4d 44    4);.        MD
1c8e0 35 53 54 45 50 28 46 33 2c 20 64 2c 20 61 2c 20  5STEP(F3, d, a, 
1c8f0 62 2c 20 63 2c 20 69 6e 5b 20 30 5d 2b 30 78 65  b, c, in[ 0]+0xe
1c900 61 61 31 32 37 66 61 2c 20 31 31 29 3b 0a 20 20  aa127fa, 11);.  
1c910 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 33        MD5STEP(F3
1c920 2c 20 63 2c 20 64 2c 20 61 2c 20 62 2c 20 69 6e  , c, d, a, b, in
1c930 5b 20 33 5d 2b 30 78 64 34 65 66 33 30 38 35 2c  [ 3]+0xd4ef3085,
1c940 20 31 36 29 3b 0a 20 20 20 20 20 20 20 20 4d 44   16);.        MD
1c950 35 53 54 45 50 28 46 33 2c 20 62 2c 20 63 2c 20  5STEP(F3, b, c, 
1c960 64 2c 20 61 2c 20 69 6e 5b 20 36 5d 2b 30 78 30  d, a, in[ 6]+0x0
1c970 34 38 38 31 64 30 35 2c 20 32 33 29 3b 0a 20 20  4881d05, 23);.  
1c980 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 33        MD5STEP(F3
1c990 2c 20 61 2c 20 62 2c 20 63 2c 20 64 2c 20 69 6e  , a, b, c, d, in
1c9a0 5b 20 39 5d 2b 30 78 64 39 64 34 64 30 33 39 2c  [ 9]+0xd9d4d039,
1c9b0 20 20 34 29 3b 0a 20 20 20 20 20 20 20 20 4d 44    4);.        MD
1c9c0 35 53 54 45 50 28 46 33 2c 20 64 2c 20 61 2c 20  5STEP(F3, d, a, 
1c9d0 62 2c 20 63 2c 20 69 6e 5b 31 32 5d 2b 30 78 65  b, c, in[12]+0xe
1c9e0 36 64 62 39 39 65 35 2c 20 31 31 29 3b 0a 20 20  6db99e5, 11);.  
1c9f0 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 33        MD5STEP(F3
1ca00 2c 20 63 2c 20 64 2c 20 61 2c 20 62 2c 20 69 6e  , c, d, a, b, in
1ca10 5b 31 35 5d 2b 30 78 31 66 61 32 37 63 66 38 2c  [15]+0x1fa27cf8,
1ca20 20 31 36 29 3b 0a 20 20 20 20 20 20 20 20 4d 44   16);.        MD
1ca30 35 53 54 45 50 28 46 33 2c 20 62 2c 20 63 2c 20  5STEP(F3, b, c, 
1ca40 64 2c 20 61 2c 20 69 6e 5b 20 32 5d 2b 30 78 63  d, a, in[ 2]+0xc
1ca50 34 61 63 35 36 36 35 2c 20 32 33 29 3b 0a 0a 20  4ac5665, 23);.. 
1ca60 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
1ca70 34 2c 20 61 2c 20 62 2c 20 63 2c 20 64 2c 20 69  4, a, b, c, d, i
1ca80 6e 5b 20 30 5d 2b 30 78 66 34 32 39 32 32 34 34  n[ 0]+0xf4292244
1ca90 2c 20 20 36 29 3b 0a 20 20 20 20 20 20 20 20 4d  ,  6);.        M
1caa0 44 35 53 54 45 50 28 46 34 2c 20 64 2c 20 61 2c  D5STEP(F4, d, a,
1cab0 20 62 2c 20 63 2c 20 69 6e 5b 20 37 5d 2b 30 78   b, c, in[ 7]+0x
1cac0 34 33 32 61 66 66 39 37 2c 20 31 30 29 3b 0a 20  432aff97, 10);. 
1cad0 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
1cae0 34 2c 20 63 2c 20 64 2c 20 61 2c 20 62 2c 20 69  4, c, d, a, b, i
1caf0 6e 5b 31 34 5d 2b 30 78 61 62 39 34 32 33 61 37  n[14]+0xab9423a7
1cb00 2c 20 31 35 29 3b 0a 20 20 20 20 20 20 20 20 4d  , 15);.        M
1cb10 44 35 53 54 45 50 28 46 34 2c 20 62 2c 20 63 2c  D5STEP(F4, b, c,
1cb20 20 64 2c 20 61 2c 20 69 6e 5b 20 35 5d 2b 30 78   d, a, in[ 5]+0x
1cb30 66 63 39 33 61 30 33 39 2c 20 32 31 29 3b 0a 20  fc93a039, 21);. 
1cb40 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
1cb50 34 2c 20 61 2c 20 62 2c 20 63 2c 20 64 2c 20 69  4, a, b, c, d, i
1cb60 6e 5b 31 32 5d 2b 30 78 36 35 35 62 35 39 63 33  n[12]+0x655b59c3
1cb70 2c 20 20 36 29 3b 0a 20 20 20 20 20 20 20 20 4d  ,  6);.        M
1cb80 44 35 53 54 45 50 28 46 34 2c 20 64 2c 20 61 2c  D5STEP(F4, d, a,
1cb90 20 62 2c 20 63 2c 20 69 6e 5b 20 33 5d 2b 30 78   b, c, in[ 3]+0x
1cba0 38 66 30 63 63 63 39 32 2c 20 31 30 29 3b 0a 20  8f0ccc92, 10);. 
1cbb0 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
1cbc0 34 2c 20 63 2c 20 64 2c 20 61 2c 20 62 2c 20 69  4, c, d, a, b, i
1cbd0 6e 5b 31 30 5d 2b 30 78 66 66 65 66 66 34 37 64  n[10]+0xffeff47d
1cbe0 2c 20 31 35 29 3b 0a 20 20 20 20 20 20 20 20 4d  , 15);.        M
1cbf0 44 35 53 54 45 50 28 46 34 2c 20 62 2c 20 63 2c  D5STEP(F4, b, c,
1cc00 20 64 2c 20 61 2c 20 69 6e 5b 20 31 5d 2b 30 78   d, a, in[ 1]+0x
1cc10 38 35 38 34 35 64 64 31 2c 20 32 31 29 3b 0a 20  85845dd1, 21);. 
1cc20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
1cc30 34 2c 20 61 2c 20 62 2c 20 63 2c 20 64 2c 20 69  4, a, b, c, d, i
1cc40 6e 5b 20 38 5d 2b 30 78 36 66 61 38 37 65 34 66  n[ 8]+0x6fa87e4f
1cc50 2c 20 20 36 29 3b 0a 20 20 20 20 20 20 20 20 4d  ,  6);.        M
1cc60 44 35 53 54 45 50 28 46 34 2c 20 64 2c 20 61 2c  D5STEP(F4, d, a,
1cc70 20 62 2c 20 63 2c 20 69 6e 5b 31 35 5d 2b 30 78   b, c, in[15]+0x
1cc80 66 65 32 63 65 36 65 30 2c 20 31 30 29 3b 0a 20  fe2ce6e0, 10);. 
1cc90 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
1cca0 34 2c 20 63 2c 20 64 2c 20 61 2c 20 62 2c 20 69  4, c, d, a, b, i
1ccb0 6e 5b 20 36 5d 2b 30 78 61 33 30 31 34 33 31 34  n[ 6]+0xa3014314
1ccc0 2c 20 31 35 29 3b 0a 20 20 20 20 20 20 20 20 4d  , 15);.        M
1ccd0 44 35 53 54 45 50 28 46 34 2c 20 62 2c 20 63 2c  D5STEP(F4, b, c,
1cce0 20 64 2c 20 61 2c 20 69 6e 5b 31 33 5d 2b 30 78   d, a, in[13]+0x
1ccf0 34 65 30 38 31 31 61 31 2c 20 32 31 29 3b 0a 20  4e0811a1, 21);. 
1cd00 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
1cd10 34 2c 20 61 2c 20 62 2c 20 63 2c 20 64 2c 20 69  4, a, b, c, d, i
1cd20 6e 5b 20 34 5d 2b 30 78 66 37 35 33 37 65 38 32  n[ 4]+0xf7537e82
1cd30 2c 20 20 36 29 3b 0a 20 20 20 20 20 20 20 20 4d  ,  6);.        M
1cd40 44 35 53 54 45 50 28 46 34 2c 20 64 2c 20 61 2c  D5STEP(F4, d, a,
1cd50 20 62 2c 20 63 2c 20 69 6e 5b 31 31 5d 2b 30 78   b, c, in[11]+0x
1cd60 62 64 33 61 66 32 33 35 2c 20 31 30 29 3b 0a 20  bd3af235, 10);. 
1cd70 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
1cd80 34 2c 20 63 2c 20 64 2c 20 61 2c 20 62 2c 20 69  4, c, d, a, b, i
1cd90 6e 5b 20 32 5d 2b 30 78 32 61 64 37 64 32 62 62  n[ 2]+0x2ad7d2bb
1cda0 2c 20 31 35 29 3b 0a 20 20 20 20 20 20 20 20 4d  , 15);.        M
1cdb0 44 35 53 54 45 50 28 46 34 2c 20 62 2c 20 63 2c  D5STEP(F4, b, c,
1cdc0 20 64 2c 20 61 2c 20 69 6e 5b 20 39 5d 2b 30 78   d, a, in[ 9]+0x
1cdd0 65 62 38 36 64 33 39 31 2c 20 32 31 29 3b 0a 0a  eb86d391, 21);..
1cde0 20 20 20 20 20 20 20 20 62 75 66 5b 30 5d 20 2b          buf[0] +
1cdf0 3d 20 61 3b 0a 20 20 20 20 20 20 20 20 62 75 66  = a;.        buf
1ce00 5b 31 5d 20 2b 3d 20 62 3b 0a 20 20 20 20 20 20  [1] += b;.      
1ce10 20 20 62 75 66 5b 32 5d 20 2b 3d 20 63 3b 0a 20    buf[2] += c;. 
1ce20 20 20 20 20 20 20 20 62 75 66 5b 33 5d 20 2b 3d         buf[3] +=
1ce30 20 64 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 74 61   d;.}../*. * Sta
1ce40 72 74 20 4d 44 35 20 61 63 63 75 6d 75 6c 61 74  rt MD5 accumulat
1ce50 69 6f 6e 2e 20 20 53 65 74 20 62 69 74 20 63 6f  ion.  Set bit co
1ce60 75 6e 74 20 74 6f 20 30 20 61 6e 64 20 62 75 66  unt to 0 and buf
1ce70 66 65 72 20 74 6f 20 6d 79 73 74 65 72 69 6f 75  fer to mysteriou
1ce80 73 0a 20 2a 20 69 6e 69 74 69 61 6c 69 7a 61 74  s. * initializat
1ce90 69 6f 6e 20 63 6f 6e 73 74 61 6e 74 73 2e 0a 20  ion constants.. 
1cea0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 4d  */.static void M
1ceb0 44 35 49 6e 69 74 28 4d 44 35 43 6f 6e 74 65 78  D5Init(MD5Contex
1cec0 74 20 2a 63 74 78 29 7b 0a 20 20 20 20 20 20 20  t *ctx){.       
1ced0 20 63 74 78 2d 3e 69 73 49 6e 69 74 20 3d 20 31   ctx->isInit = 1
1cee0 3b 0a 20 20 20 20 20 20 20 20 63 74 78 2d 3e 62  ;.        ctx->b
1cef0 75 66 5b 30 5d 20 3d 20 30 78 36 37 34 35 32 33  uf[0] = 0x674523
1cf00 30 31 3b 0a 20 20 20 20 20 20 20 20 63 74 78 2d  01;.        ctx-
1cf10 3e 62 75 66 5b 31 5d 20 3d 20 30 78 65 66 63 64  >buf[1] = 0xefcd
1cf20 61 62 38 39 3b 0a 20 20 20 20 20 20 20 20 63 74  ab89;.        ct
1cf30 78 2d 3e 62 75 66 5b 32 5d 20 3d 20 30 78 39 38  x->buf[2] = 0x98
1cf40 62 61 64 63 66 65 3b 0a 20 20 20 20 20 20 20 20  badcfe;.        
1cf50 63 74 78 2d 3e 62 75 66 5b 33 5d 20 3d 20 30 78  ctx->buf[3] = 0x
1cf60 31 30 33 32 35 34 37 36 3b 0a 20 20 20 20 20 20  10325476;.      
1cf70 20 20 63 74 78 2d 3e 62 69 74 73 5b 30 5d 20 3d    ctx->bits[0] =
1cf80 20 30 3b 0a 20 20 20 20 20 20 20 20 63 74 78 2d   0;.        ctx-
1cf90 3e 62 69 74 73 5b 31 5d 20 3d 20 30 3b 0a 7d 0a  >bits[1] = 0;.}.
1cfa0 0a 2f 2a 0a 20 2a 20 55 70 64 61 74 65 20 63 6f  ./*. * Update co
1cfb0 6e 74 65 78 74 20 74 6f 20 72 65 66 6c 65 63 74  ntext to reflect
1cfc0 20 74 68 65 20 63 6f 6e 63 61 74 65 6e 61 74 69   the concatenati
1cfd0 6f 6e 20 6f 66 20 61 6e 6f 74 68 65 72 20 62 75  on of another bu
1cfe0 66 66 65 72 20 66 75 6c 6c 0a 20 2a 20 6f 66 20  ffer full. * of 
1cff0 62 79 74 65 73 2e 0a 20 2a 2f 0a 73 74 61 74 69  bytes.. */.stati
1d000 63 0a 76 6f 69 64 20 4d 44 35 55 70 64 61 74 65  c.void MD5Update
1d010 28 4d 44 35 43 6f 6e 74 65 78 74 20 2a 63 74 78  (MD5Context *ctx
1d020 2c 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64  , const unsigned
1d030 20 63 68 61 72 20 2a 62 75 66 2c 20 75 6e 73 69   char *buf, unsi
1d040 67 6e 65 64 20 69 6e 74 20 6c 65 6e 29 7b 0a 20  gned int len){. 
1d050 20 20 20 20 20 20 20 75 69 6e 74 33 32 20 74 3b         uint32 t;
1d060 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 55 70 64  ..        /* Upd
1d070 61 74 65 20 62 69 74 63 6f 75 6e 74 20 2a 2f 0a  ate bitcount */.
1d080 0a 20 20 20 20 20 20 20 20 74 20 3d 20 63 74 78  .        t = ctx
1d090 2d 3e 62 69 74 73 5b 30 5d 3b 0a 20 20 20 20 20  ->bits[0];.     
1d0a0 20 20 20 69 66 20 28 28 63 74 78 2d 3e 62 69 74     if ((ctx->bit
1d0b0 73 5b 30 5d 20 3d 20 74 20 2b 20 28 28 75 69 6e  s[0] = t + ((uin
1d0c0 74 33 32 29 6c 65 6e 20 3c 3c 20 33 29 29 20 3c  t32)len << 3)) <
1d0d0 20 74 29 0a 20 20 20 20 20 20 20 20 20 20 20 20   t).            
1d0e0 20 20 20 20 63 74 78 2d 3e 62 69 74 73 5b 31 5d      ctx->bits[1]
1d0f0 2b 2b 3b 20 2f 2a 20 43 61 72 72 79 20 66 72 6f  ++; /* Carry fro
1d100 6d 20 6c 6f 77 20 74 6f 20 68 69 67 68 20 2a 2f  m low to high */
1d110 0a 20 20 20 20 20 20 20 20 63 74 78 2d 3e 62 69  .        ctx->bi
1d120 74 73 5b 31 5d 20 2b 3d 20 6c 65 6e 20 3e 3e 20  ts[1] += len >> 
1d130 32 39 3b 0a 0a 20 20 20 20 20 20 20 20 74 20 3d  29;..        t =
1d140 20 28 74 20 3e 3e 20 33 29 20 26 20 30 78 33 66   (t >> 3) & 0x3f
1d150 3b 20 20 20 20 2f 2a 20 42 79 74 65 73 20 61 6c  ;    /* Bytes al
1d160 72 65 61 64 79 20 69 6e 20 73 68 73 49 6e 66 6f  ready in shsInfo
1d170 2d 3e 64 61 74 61 20 2a 2f 0a 0a 20 20 20 20 20  ->data */..     
1d180 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 61 6e 79     /* Handle any
1d190 20 6c 65 61 64 69 6e 67 20 6f 64 64 2d 73 69 7a   leading odd-siz
1d1a0 65 64 20 63 68 75 6e 6b 73 20 2a 2f 0a 0a 20 20  ed chunks */..  
1d1b0 20 20 20 20 20 20 69 66 20 28 20 74 20 29 20 7b        if ( t ) {
1d1c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1d1d0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
1d1e0 70 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68  p = (unsigned ch
1d1f0 61 72 20 2a 29 63 74 78 2d 3e 69 6e 20 2b 20 74  ar *)ctx->in + t
1d200 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ;..             
1d210 20 20 20 74 20 3d 20 36 34 2d 74 3b 0a 20 20 20     t = 64-t;.   
1d220 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
1d230 28 6c 65 6e 20 3c 20 74 29 20 7b 0a 20 20 20 20  (len < t) {.    
1d240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d250 20 20 20 20 6d 65 6d 63 70 79 28 70 2c 20 62 75      memcpy(p, bu
1d260 66 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 20 20 20  f, len);.       
1d270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d280 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20   return;.       
1d290 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1d2a0 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70             memcp
1d2b0 79 28 70 2c 20 62 75 66 2c 20 74 29 3b 0a 20 20  y(p, buf, t);.  
1d2c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 79                by
1d2d0 74 65 52 65 76 65 72 73 65 28 63 74 78 2d 3e 69  teReverse(ctx->i
1d2e0 6e 2c 20 31 36 29 3b 0a 20 20 20 20 20 20 20 20  n, 16);.        
1d2f0 20 20 20 20 20 20 20 20 4d 44 35 54 72 61 6e 73          MD5Trans
1d300 66 6f 72 6d 28 63 74 78 2d 3e 62 75 66 2c 20 28  form(ctx->buf, (
1d310 75 69 6e 74 33 32 20 2a 29 63 74 78 2d 3e 69 6e  uint32 *)ctx->in
1d320 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
1d330 20 20 20 62 75 66 20 2b 3d 20 74 3b 0a 20 20 20     buf += t;.   
1d340 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 65 6e               len
1d350 20 2d 3d 20 74 3b 0a 20 20 20 20 20 20 20 20 7d   -= t;.        }
1d360 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 50 72 6f  ..        /* Pro
1d370 63 65 73 73 20 64 61 74 61 20 69 6e 20 36 34 2d  cess data in 64-
1d380 62 79 74 65 20 63 68 75 6e 6b 73 20 2a 2f 0a 0a  byte chunks */..
1d390 20 20 20 20 20 20 20 20 77 68 69 6c 65 20 28 6c          while (l
1d3a0 65 6e 20 3e 3d 20 36 34 29 20 7b 0a 20 20 20 20  en >= 64) {.    
1d3b0 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63              memc
1d3c0 70 79 28 63 74 78 2d 3e 69 6e 2c 20 62 75 66 2c  py(ctx->in, buf,
1d3d0 20 36 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20   64);.          
1d3e0 20 20 20 20 20 20 62 79 74 65 52 65 76 65 72 73        byteRevers
1d3f0 65 28 63 74 78 2d 3e 69 6e 2c 20 31 36 29 3b 0a  e(ctx->in, 16);.
1d400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d410 4d 44 35 54 72 61 6e 73 66 6f 72 6d 28 63 74 78  MD5Transform(ctx
1d420 2d 3e 62 75 66 2c 20 28 75 69 6e 74 33 32 20 2a  ->buf, (uint32 *
1d430 29 63 74 78 2d 3e 69 6e 29 3b 0a 20 20 20 20 20  )ctx->in);.     
1d440 20 20 20 20 20 20 20 20 20 20 20 62 75 66 20 2b             buf +
1d450 3d 20 36 34 3b 0a 20 20 20 20 20 20 20 20 20 20  = 64;.          
1d460 20 20 20 20 20 20 6c 65 6e 20 2d 3d 20 36 34 3b        len -= 64;
1d470 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
1d480 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 61 6e      /* Handle an
1d490 79 20 72 65 6d 61 69 6e 69 6e 67 20 62 79 74 65  y remaining byte
1d4a0 73 20 6f 66 20 64 61 74 61 2e 20 2a 2f 0a 0a 20  s of data. */.. 
1d4b0 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 63 74         memcpy(ct
1d4c0 78 2d 3e 69 6e 2c 20 62 75 66 2c 20 6c 65 6e 29  x->in, buf, len)
1d4d0 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 46 69 6e 61 6c  ;.}../*. * Final
1d4e0 20 77 72 61 70 75 70 20 2d 20 70 61 64 20 74 6f   wrapup - pad to
1d4f0 20 36 34 2d 62 79 74 65 20 62 6f 75 6e 64 61 72   64-byte boundar
1d500 79 20 77 69 74 68 20 74 68 65 20 62 69 74 20 70  y with the bit p
1d510 61 74 74 65 72 6e 0a 20 2a 20 31 20 30 2a 20 28  attern. * 1 0* (
1d520 36 34 2d 62 69 74 20 63 6f 75 6e 74 20 6f 66 20  64-bit count of 
1d530 62 69 74 73 20 70 72 6f 63 65 73 73 65 64 2c 20  bits processed, 
1d540 4d 53 42 2d 66 69 72 73 74 29 0a 20 2a 2f 0a 73  MSB-first). */.s
1d550 74 61 74 69 63 20 76 6f 69 64 20 4d 44 35 46 69  tatic void MD5Fi
1d560 6e 61 6c 28 75 6e 73 69 67 6e 65 64 20 63 68 61  nal(unsigned cha
1d570 72 20 64 69 67 65 73 74 5b 31 36 5d 2c 20 4d 44  r digest[16], MD
1d580 35 43 6f 6e 74 65 78 74 20 2a 63 74 78 29 7b 0a  5Context *ctx){.
1d590 20 20 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64          unsigned
1d5a0 20 63 6f 75 6e 74 3b 0a 20 20 20 20 20 20 20 20   count;.        
1d5b0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
1d5c0 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  ;..        /* Co
1d5d0 6d 70 75 74 65 20 6e 75 6d 62 65 72 20 6f 66 20  mpute number of 
1d5e0 62 79 74 65 73 20 6d 6f 64 20 36 34 20 2a 2f 0a  bytes mod 64 */.
1d5f0 20 20 20 20 20 20 20 20 63 6f 75 6e 74 20 3d 20          count = 
1d600 28 63 74 78 2d 3e 62 69 74 73 5b 30 5d 20 3e 3e  (ctx->bits[0] >>
1d610 20 33 29 20 26 20 30 78 33 46 3b 0a 0a 20 20 20   3) & 0x3F;..   
1d620 20 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20       /* Set the 
1d630 66 69 72 73 74 20 63 68 61 72 20 6f 66 20 70 61  first char of pa
1d640 64 64 69 6e 67 20 74 6f 20 30 78 38 30 2e 20 20  dding to 0x80.  
1d650 54 68 69 73 20 69 73 20 73 61 66 65 20 73 69 6e  This is safe sin
1d660 63 65 20 74 68 65 72 65 20 69 73 0a 20 20 20 20  ce there is.    
1d670 20 20 20 20 20 20 20 61 6c 77 61 79 73 20 61 74         always at
1d680 20 6c 65 61 73 74 20 6f 6e 65 20 62 79 74 65 20   least one byte 
1d690 66 72 65 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  free */.        
1d6a0 70 20 3d 20 63 74 78 2d 3e 69 6e 20 2b 20 63 6f  p = ctx->in + co
1d6b0 75 6e 74 3b 0a 20 20 20 20 20 20 20 20 2a 70 2b  unt;.        *p+
1d6c0 2b 20 3d 20 30 78 38 30 3b 0a 0a 20 20 20 20 20  + = 0x80;..     
1d6d0 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 70     /* Bytes of p
1d6e0 61 64 64 69 6e 67 20 6e 65 65 64 65 64 20 74 6f  adding needed to
1d6f0 20 6d 61 6b 65 20 36 34 20 62 79 74 65 73 20 2a   make 64 bytes *
1d700 2f 0a 20 20 20 20 20 20 20 20 63 6f 75 6e 74 20  /.        count 
1d710 3d 20 36 34 20 2d 20 31 20 2d 20 63 6f 75 6e 74  = 64 - 1 - count
1d720 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ;..        /* Pa
1d730 64 20 6f 75 74 20 74 6f 20 35 36 20 6d 6f 64 20  d out to 56 mod 
1d740 36 34 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66  64 */.        if
1d750 20 28 63 6f 75 6e 74 20 3c 20 38 29 20 7b 0a 20   (count < 8) {. 
1d760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1d770 2a 20 54 77 6f 20 6c 6f 74 73 20 6f 66 20 70 61  * Two lots of pa
1d780 64 64 69 6e 67 3a 20 20 50 61 64 20 74 68 65 20  dding:  Pad the 
1d790 66 69 72 73 74 20 62 6c 6f 63 6b 20 74 6f 20 36  first block to 6
1d7a0 34 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 20  4 bytes */.     
1d7b0 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 73 65             memse
1d7c0 74 28 70 2c 20 30 2c 20 63 6f 75 6e 74 29 3b 0a  t(p, 0, count);.
1d7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d7e0 62 79 74 65 52 65 76 65 72 73 65 28 63 74 78 2d  byteReverse(ctx-
1d7f0 3e 69 6e 2c 20 31 36 29 3b 0a 20 20 20 20 20 20  >in, 16);.      
1d800 20 20 20 20 20 20 20 20 20 20 4d 44 35 54 72 61            MD5Tra
1d810 6e 73 66 6f 72 6d 28 63 74 78 2d 3e 62 75 66 2c  nsform(ctx->buf,
1d820 20 28 75 69 6e 74 33 32 20 2a 29 63 74 78 2d 3e   (uint32 *)ctx->
1d830 69 6e 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20  in);..          
1d840 20 20 20 20 20 20 2f 2a 20 4e 6f 77 20 66 69 6c        /* Now fil
1d850 6c 20 74 68 65 20 6e 65 78 74 20 62 6c 6f 63 6b  l the next block
1d860 20 77 69 74 68 20 35 36 20 62 79 74 65 73 20 2a   with 56 bytes *
1d870 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
1d880 20 20 6d 65 6d 73 65 74 28 63 74 78 2d 3e 69 6e    memset(ctx->in
1d890 2c 20 30 2c 20 35 36 29 3b 0a 20 20 20 20 20 20  , 0, 56);.      
1d8a0 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
1d8b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
1d8c0 64 20 62 6c 6f 63 6b 20 74 6f 20 35 36 20 62 79  d block to 56 by
1d8d0 74 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  tes */.         
1d8e0 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 2c         memset(p,
1d8f0 20 30 2c 20 63 6f 75 6e 74 2d 38 29 3b 0a 20 20   0, count-8);.  
1d900 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1d910 62 79 74 65 52 65 76 65 72 73 65 28 63 74 78 2d  byteReverse(ctx-
1d920 3e 69 6e 2c 20 31 34 29 3b 0a 0a 20 20 20 20 20  >in, 14);..     
1d930 20 20 20 2f 2a 20 41 70 70 65 6e 64 20 6c 65 6e     /* Append len
1d940 67 74 68 20 69 6e 20 62 69 74 73 20 61 6e 64 20  gth in bits and 
1d950 74 72 61 6e 73 66 6f 72 6d 20 2a 2f 0a 20 20 20  transform */.   
1d960 20 20 20 20 20 6d 65 6d 63 70 79 28 63 74 78 2d       memcpy(ctx-
1d970 3e 69 6e 20 2b 20 31 34 2a 34 2c 20 63 74 78 2d  >in + 14*4, ctx-
1d980 3e 62 69 74 73 2c 20 38 29 3b 0a 0a 20 20 20 20  >bits, 8);..    
1d990 20 20 20 20 4d 44 35 54 72 61 6e 73 66 6f 72 6d      MD5Transform
1d9a0 28 63 74 78 2d 3e 62 75 66 2c 20 28 75 69 6e 74  (ctx->buf, (uint
1d9b0 33 32 20 2a 29 63 74 78 2d 3e 69 6e 29 3b 0a 20  32 *)ctx->in);. 
1d9c0 20 20 20 20 20 20 20 62 79 74 65 52 65 76 65 72         byteRever
1d9d0 73 65 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61  se((unsigned cha
1d9e0 72 20 2a 29 63 74 78 2d 3e 62 75 66 2c 20 34 29  r *)ctx->buf, 4)
1d9f0 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  ;.        memcpy
1da00 28 64 69 67 65 73 74 2c 20 63 74 78 2d 3e 62 75  (digest, ctx->bu
1da10 66 2c 20 31 36 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  f, 16);.}../*.**
1da20 20 43 6f 6e 76 65 72 74 20 61 20 31 32 38 2d 62   Convert a 128-b
1da30 69 74 20 4d 44 35 20 64 69 67 65 73 74 20 69 6e  it MD5 digest in
1da40 74 6f 20 61 20 33 32 2d 64 69 67 69 74 20 62 61  to a 32-digit ba
1da50 73 65 2d 31 36 20 6e 75 6d 62 65 72 2e 0a 2a 2f  se-16 number..*/
1da60 0a 73 74 61 74 69 63 20 76 6f 69 64 20 4d 44 35  .static void MD5
1da70 44 69 67 65 73 74 54 6f 42 61 73 65 31 36 28 75  DigestToBase16(u
1da80 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 69  nsigned char *di
1da90 67 65 73 74 2c 20 63 68 61 72 20 2a 7a 42 75 66  gest, char *zBuf
1daa0 29 7b 0a 20 20 73 74 61 74 69 63 20 63 68 61 72  ){.  static char
1dab0 20 63 6f 6e 73 74 20 7a 45 6e 63 6f 64 65 5b 5d   const zEncode[]
1dac0 20 3d 20 22 30 31 32 33 34 35 36 37 38 39 61 62   = "0123456789ab
1dad0 63 64 65 66 22 3b 0a 20 20 69 6e 74 20 69 2c 20  cdef";.  int i, 
1dae0 6a 3b 0a 0a 20 20 66 6f 72 28 6a 3d 69 3d 30 3b  j;..  for(j=i=0;
1daf0 20 69 3c 31 36 3b 20 69 2b 2b 29 7b 0a 20 20 20   i<16; i++){.   
1db00 20 69 6e 74 20 61 20 3d 20 64 69 67 65 73 74 5b   int a = digest[
1db10 69 5d 3b 0a 20 20 20 20 7a 42 75 66 5b 6a 2b 2b  i];.    zBuf[j++
1db20 5d 20 3d 20 7a 45 6e 63 6f 64 65 5b 28 61 3e 3e  ] = zEncode[(a>>
1db30 34 29 26 30 78 66 5d 3b 0a 20 20 20 20 7a 42 75  4)&0xf];.    zBu
1db40 66 5b 6a 2b 2b 5d 20 3d 20 7a 45 6e 63 6f 64 65  f[j++] = zEncode
1db50 5b 61 20 26 20 30 78 66 5d 3b 0a 20 20 7d 0a 20  [a & 0xf];.  }. 
1db60 20 7a 42 75 66 5b 6a 5d 20 3d 20 30 3b 0a 7d 0a   zBuf[j] = 0;.}.
1db70 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20  ../*.** Convert 
1db80 61 20 31 32 38 2d 62 69 74 20 4d 44 35 20 64 69  a 128-bit MD5 di
1db90 67 65 73 74 20 69 6e 74 6f 20 73 65 71 75 65 6e  gest into sequen
1dba0 63 79 20 6f 66 20 65 69 67 68 74 20 35 2d 64 69  cy of eight 5-di
1dbb0 67 69 74 20 69 6e 74 65 67 65 72 73 0a 2a 2a 20  git integers.** 
1dbc0 65 61 63 68 20 72 65 70 72 65 73 65 6e 74 69 6e  each representin
1dbd0 67 20 31 36 20 62 69 74 73 20 6f 66 20 74 68 65  g 16 bits of the
1dbe0 20 64 69 67 65 73 74 20 61 6e 64 20 73 65 70 61   digest and sepa
1dbf0 72 61 74 65 64 20 66 72 6f 6d 20 65 61 63 68 0a  rated from each.
1dc00 2a 2a 20 6f 74 68 65 72 20 62 79 20 61 20 22 2d  ** other by a "-
1dc10 22 20 63 68 61 72 61 63 74 65 72 2e 0a 2a 2f 0a  " character..*/.
1dc20 73 74 61 74 69 63 20 76 6f 69 64 20 4d 44 35 44  static void MD5D
1dc30 69 67 65 73 74 54 6f 42 61 73 65 31 30 78 38 28  igestToBase10x8(
1dc40 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 64 69  unsigned char di
1dc50 67 65 73 74 5b 31 36 5d 2c 20 63 68 61 72 20 7a  gest[16], char z
1dc60 44 69 67 65 73 74 5b 35 30 5d 29 7b 0a 20 20 69  Digest[50]){.  i
1dc70 6e 74 20 69 2c 20 6a 3b 0a 20 20 75 6e 73 69 67  nt i, j;.  unsig
1dc80 6e 65 64 20 69 6e 74 20 78 3b 0a 20 20 66 6f 72  ned int x;.  for
1dc90 28 69 3d 6a 3d 30 3b 20 69 3c 31 36 3b 20 69 2b  (i=j=0; i<16; i+
1dca0 3d 32 29 7b 0a 20 20 20 20 78 20 3d 20 64 69 67  =2){.    x = dig
1dcb0 65 73 74 5b 69 5d 2a 32 35 36 20 2b 20 64 69 67  est[i]*256 + dig
1dcc0 65 73 74 5b 69 2b 31 5d 3b 0a 20 20 20 20 69 66  est[i+1];.    if
1dcd0 28 20 69 3e 30 20 29 20 7a 44 69 67 65 73 74 5b  ( i>0 ) zDigest[
1dce0 6a 2b 2b 5d 20 3d 20 27 2d 27 3b 0a 20 20 20 20  j++] = '-';.    
1dcf0 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
1dd00 28 35 30 2d 6a 2c 20 26 7a 44 69 67 65 73 74 5b  (50-j, &zDigest[
1dd10 6a 5d 2c 20 22 25 30 35 75 22 2c 20 78 29 3b 0a  j], "%05u", x);.
1dd20 20 20 20 20 6a 20 2b 3d 20 35 3b 0a 20 20 7d 0a      j += 5;.  }.
1dd30 20 20 7a 44 69 67 65 73 74 5b 6a 5d 20 3d 20 30    zDigest[j] = 0
1dd40 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 54 43 4c  ;.}../*.** A TCL
1dd50 20 63 6f 6d 6d 61 6e 64 20 66 6f 72 20 6d 64 35   command for md5
1dd60 2e 20 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20  .  The argument 
1dd70 69 73 20 74 68 65 20 74 65 78 74 20 74 6f 20 62  is the text to b
1dd80 65 20 68 61 73 68 65 64 2e 20 20 54 68 65 0a 2a  e hashed.  The.*
1dd90 2a 20 52 65 73 75 6c 74 20 69 73 20 74 68 65 20  * Result is the 
1dda0 68 61 73 68 20 69 6e 20 62 61 73 65 36 34 2e 0a  hash in base64..
1ddb0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
1ddc0 4c 49 54 45 5f 54 43 4c 41 50 49 20 6d 64 35 5f  LITE_TCLAPI md5_
1ddd0 63 6d 64 28 0a 20 20 76 6f 69 64 2a 63 64 2c 0a  cmd(.  void*cd,.
1dde0 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
1ddf0 74 65 72 70 2c 0a 20 20 69 6e 74 20 61 72 67 63  terp,.  int argc
1de00 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
1de10 2a 61 72 67 76 0a 29 7b 0a 20 20 4d 44 35 43 6f  *argv.){.  MD5Co
1de20 6e 74 65 78 74 20 63 74 78 3b 0a 20 20 75 6e 73  ntext ctx;.  uns
1de30 69 67 6e 65 64 20 63 68 61 72 20 64 69 67 65 73  igned char diges
1de40 74 5b 31 36 5d 3b 0a 20 20 63 68 61 72 20 7a 42  t[16];.  char zB
1de50 75 66 5b 35 30 5d 3b 0a 20 20 76 6f 69 64 20 28  uf[50];.  void (
1de60 2a 63 6f 6e 76 65 72 74 65 72 29 28 75 6e 73 69  *converter)(unsi
1de70 67 6e 65 64 20 63 68 61 72 2a 2c 20 63 68 61 72  gned char*, char
1de80 2a 29 3b 0a 0a 20 20 69 66 28 20 61 72 67 63 21  *);..  if( argc!
1de90 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =2 ){.    Tcl_Ap
1dea0 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
1deb0 70 2c 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  p,"wrong # args:
1dec0 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
1ded0 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20  argv[0],.       
1dee0 20 22 20 54 45 58 54 5c 22 22 2c 20 28 63 68 61   " TEXT\"", (cha
1def0 72 2a 29 30 29 3b 0a 20 20 20 20 72 65 74 75 72  r*)0);.    retur
1df00 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
1df10 0a 20 20 4d 44 35 49 6e 69 74 28 26 63 74 78 29  .  MD5Init(&ctx)
1df20 3b 0a 20 20 4d 44 35 55 70 64 61 74 65 28 26 63  ;.  MD5Update(&c
1df30 74 78 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68  tx, (unsigned ch
1df40 61 72 2a 29 61 72 67 76 5b 31 5d 2c 20 28 75 6e  ar*)argv[1], (un
1df50 73 69 67 6e 65 64 29 73 74 72 6c 65 6e 28 61 72  signed)strlen(ar
1df60 67 76 5b 31 5d 29 29 3b 0a 20 20 4d 44 35 46 69  gv[1]));.  MD5Fi
1df70 6e 61 6c 28 64 69 67 65 73 74 2c 20 26 63 74 78  nal(digest, &ctx
1df80 29 3b 0a 20 20 63 6f 6e 76 65 72 74 65 72 20 3d  );.  converter =
1df90 20 28 76 6f 69 64 28 2a 29 28 75 6e 73 69 67 6e   (void(*)(unsign
1dfa0 65 64 20 63 68 61 72 2a 2c 63 68 61 72 2a 29 29  ed char*,char*))
1dfb0 63 64 3b 0a 20 20 63 6f 6e 76 65 72 74 65 72 28  cd;.  converter(
1dfc0 64 69 67 65 73 74 2c 20 7a 42 75 66 29 3b 0a 20  digest, zBuf);. 
1dfd0 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
1dfe0 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20  t(interp, zBuf, 
1dff0 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 72 65 74  (char*)0);.  ret
1e000 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
1e010 2a 0a 2a 2a 20 41 20 54 43 4c 20 63 6f 6d 6d 61  *.** A TCL comma
1e020 6e 64 20 74 6f 20 74 61 6b 65 20 74 68 65 20 6d  nd to take the m
1e030 64 35 20 68 61 73 68 20 6f 66 20 61 20 66 69 6c  d5 hash of a fil
1e040 65 2e 20 20 54 68 65 20 61 72 67 75 6d 65 6e 74  e.  The argument
1e050 20 69 73 20 74 68 65 0a 2a 2a 20 6e 61 6d 65 20   is the.** name 
1e060 6f 66 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2f 0a  of the file..*/.
1e070 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54  static int SQLIT
1e080 45 5f 54 43 4c 41 50 49 20 6d 64 35 66 69 6c 65  E_TCLAPI md5file
1e090 5f 63 6d 64 28 0a 20 20 76 6f 69 64 2a 63 64 2c  _cmd(.  void*cd,
1e0a0 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
1e0b0 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 61 72 67  nterp,.  int arg
1e0c0 63 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  c,.  const char 
1e0d0 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 46 49 4c 45  **argv.){.  FILE
1e0e0 20 2a 69 6e 3b 0a 20 20 4d 44 35 43 6f 6e 74 65   *in;.  MD5Conte
1e0f0 78 74 20 63 74 78 3b 0a 20 20 76 6f 69 64 20 28  xt ctx;.  void (
1e100 2a 63 6f 6e 76 65 72 74 65 72 29 28 75 6e 73 69  *converter)(unsi
1e110 67 6e 65 64 20 63 68 61 72 2a 2c 20 63 68 61 72  gned char*, char
1e120 2a 29 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  *);.  unsigned c
1e130 68 61 72 20 64 69 67 65 73 74 5b 31 36 5d 3b 0a  har digest[16];.
1e140 20 20 63 68 61 72 20 7a 42 75 66 5b 31 30 32 34    char zBuf[1024
1e150 30 5d 3b 0a 0a 20 20 69 66 28 20 61 72 67 63 21  0];..  if( argc!
1e160 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =2 ){.    Tcl_Ap
1e170 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
1e180 70 2c 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  p,"wrong # args:
1e190 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
1e1a0 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20  argv[0],.       
1e1b0 20 22 20 46 49 4c 45 4e 41 4d 45 5c 22 22 2c 20   " FILENAME\"", 
1e1c0 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 72  (char*)0);.    r
1e1d0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1e1e0 0a 20 20 7d 0a 20 20 69 6e 20 3d 20 66 6f 70 65  .  }.  in = fope
1e1f0 6e 28 61 72 67 76 5b 31 5d 2c 22 72 62 22 29 3b  n(argv[1],"rb");
1e200 0a 20 20 69 66 28 20 69 6e 3d 3d 30 20 29 7b 0a  .  if( in==0 ){.
1e210 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
1e220 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 75 6e 61  sult(interp,"una
1e230 62 6c 65 20 74 6f 20 6f 70 65 6e 20 66 69 6c 65  ble to open file
1e240 20 5c 22 22 2c 20 61 72 67 76 5b 31 5d 2c 0a 20   \"", argv[1],. 
1e250 20 20 20 20 20 20 20 20 22 5c 22 20 66 6f 72 20          "\" for 
1e260 72 65 61 64 69 6e 67 22 2c 20 28 63 68 61 72 2a  reading", (char*
1e270 29 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  )0);.    return 
1e280 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
1e290 20 4d 44 35 49 6e 69 74 28 26 63 74 78 29 3b 0a   MD5Init(&ctx);.
1e2a0 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 69    for(;;){.    i
1e2b0 6e 74 20 6e 3b 0a 20 20 20 20 6e 20 3d 20 28 69  nt n;.    n = (i
1e2c0 6e 74 29 66 72 65 61 64 28 7a 42 75 66 2c 20 31  nt)fread(zBuf, 1
1e2d0 2c 20 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c 20  , sizeof(zBuf), 
1e2e0 69 6e 29 3b 0a 20 20 20 20 69 66 28 20 6e 3c 3d  in);.    if( n<=
1e2f0 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 4d  0 ) break;.    M
1e300 44 35 55 70 64 61 74 65 28 26 63 74 78 2c 20 28  D5Update(&ctx, (
1e310 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 7a  unsigned char*)z
1e320 42 75 66 2c 20 28 75 6e 73 69 67 6e 65 64 29 6e  Buf, (unsigned)n
1e330 29 3b 0a 20 20 7d 0a 20 20 66 63 6c 6f 73 65 28  );.  }.  fclose(
1e340 69 6e 29 3b 0a 20 20 4d 44 35 46 69 6e 61 6c 28  in);.  MD5Final(
1e350 64 69 67 65 73 74 2c 20 26 63 74 78 29 3b 0a 20  digest, &ctx);. 
1e360 20 63 6f 6e 76 65 72 74 65 72 20 3d 20 28 76 6f   converter = (vo
1e370 69 64 28 2a 29 28 75 6e 73 69 67 6e 65 64 20 63  id(*)(unsigned c
1e380 68 61 72 2a 2c 63 68 61 72 2a 29 29 63 64 3b 0a  har*,char*))cd;.
1e390 20 20 63 6f 6e 76 65 72 74 65 72 28 64 69 67 65    converter(dige
1e3a0 73 74 2c 20 7a 42 75 66 29 3b 0a 20 20 54 63 6c  st, zBuf);.  Tcl
1e3b0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
1e3c0 74 65 72 70 2c 20 7a 42 75 66 2c 20 28 63 68 61  terp, zBuf, (cha
1e3d0 72 2a 29 30 29 3b 0a 20 20 72 65 74 75 72 6e 20  r*)0);.  return 
1e3e0 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
1e3f0 20 52 65 67 69 73 74 65 72 20 74 68 65 20 66 6f   Register the fo
1e400 75 72 20 6e 65 77 20 54 43 4c 20 63 6f 6d 6d 61  ur new TCL comma
1e410 6e 64 73 20 66 6f 72 20 67 65 6e 65 72 61 74 69  nds for generati
1e420 6e 67 20 4d 44 35 20 63 68 65 63 6b 73 75 6d 73  ng MD5 checksums
1e430 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 54 43 4c  .** with the TCL
1e440 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0a 2a 2f   interpreter..*/
1e450 0a 69 6e 74 20 4d 64 35 5f 49 6e 69 74 28 54 63  .int Md5_Init(Tc
1e460 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
1e470 29 7b 0a 20 20 54 63 6c 5f 43 72 65 61 74 65 43  ){.  Tcl_CreateC
1e480 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22  ommand(interp, "
1e490 6d 64 35 22 2c 20 28 54 63 6c 5f 43 6d 64 50 72  md5", (Tcl_CmdPr
1e4a0 6f 63 2a 29 6d 64 35 5f 63 6d 64 2c 0a 20 20 20  oc*)md5_cmd,.   
1e4b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e4c0 20 4d 44 35 44 69 67 65 73 74 54 6f 42 61 73 65   MD5DigestToBase
1e4d0 31 36 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 43 72  16, 0);.  Tcl_Cr
1e4e0 65 61 74 65 43 6f 6d 6d 61 6e 64 28 69 6e 74 65  eateCommand(inte
1e4f0 72 70 2c 20 22 6d 64 35 2d 31 30 78 38 22 2c 20  rp, "md5-10x8", 
1e500 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 6d 64  (Tcl_CmdProc*)md
1e510 35 5f 63 6d 64 2c 0a 20 20 20 20 20 20 20 20 20  5_cmd,.         
1e520 20 20 20 20 20 20 20 20 20 20 20 4d 44 35 44 69             MD5Di
1e530 67 65 73 74 54 6f 42 61 73 65 31 30 78 38 2c 20  gestToBase10x8, 
1e540 30 29 3b 0a 20 20 54 63 6c 5f 43 72 65 61 74 65  0);.  Tcl_Create
1e550 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20  Command(interp, 
1e560 22 6d 64 35 66 69 6c 65 22 2c 20 28 54 63 6c 5f  "md5file", (Tcl_
1e570 43 6d 64 50 72 6f 63 2a 29 6d 64 35 66 69 6c 65  CmdProc*)md5file
1e580 5f 63 6d 64 2c 0a 20 20 20 20 20 20 20 20 20 20  _cmd,.          
1e590 20 20 20 20 20 20 20 20 20 20 4d 44 35 44 69 67            MD5Dig
1e5a0 65 73 74 54 6f 42 61 73 65 31 36 2c 20 30 29 3b  estToBase16, 0);
1e5b0 0a 20 20 54 63 6c 5f 43 72 65 61 74 65 43 6f 6d  .  Tcl_CreateCom
1e5c0 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 6d 64  mand(interp, "md
1e5d0 35 66 69 6c 65 2d 31 30 78 38 22 2c 20 28 54 63  5file-10x8", (Tc
1e5e0 6c 5f 43 6d 64 50 72 6f 63 2a 29 6d 64 35 66 69  l_CmdProc*)md5fi
1e5f0 6c 65 5f 63 6d 64 2c 0a 20 20 20 20 20 20 20 20  le_cmd,.        
1e600 20 20 20 20 20 20 20 20 20 20 20 20 4d 44 35 44              MD5D
1e610 69 67 65 73 74 54 6f 42 61 73 65 31 30 78 38 2c  igestToBase10x8,
1e620 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43   0);.  return TC
1e630 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  L_OK;.}.#endif /
1e640 2a 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  * defined(SQLITE
1e650 5f 54 45 53 54 29 20 7c 7c 20 64 65 66 69 6e 65  _TEST) || define
1e660 64 28 53 51 4c 49 54 45 5f 54 43 4c 4d 44 35 29  d(SQLITE_TCLMD5)
1e670 20 2a 2f 0a 0a 23 69 66 20 64 65 66 69 6e 65 64   */..#if defined
1e680 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 2f 2a  (SQLITE_TEST)./*
1e690 0a 2a 2a 20 44 75 72 69 6e 67 20 74 65 73 74 69  .** During testi
1e6a0 6e 67 2c 20 74 68 65 20 73 70 65 63 69 61 6c 20  ng, the special 
1e6b0 6d 64 35 73 75 6d 28 29 20 61 67 67 72 65 67 61  md5sum() aggrega
1e6c0 74 65 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  te function is a
1e6d0 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 20 69 6e 73  vailable..** ins
1e6e0 69 64 65 20 53 51 4c 69 74 65 2e 20 20 54 68 65  ide SQLite.  The
1e6f0 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69   following routi
1e700 6e 65 73 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68  nes implement th
1e710 61 74 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  at function..*/.
1e720 73 74 61 74 69 63 20 76 6f 69 64 20 6d 64 35 73  static void md5s
1e730 74 65 70 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  tep(sqlite3_cont
1e740 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 69 6e  ext *context, in
1e750 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f  t argc, sqlite3_
1e760 76 61 6c 75 65 20 2a 2a 61 72 67 76 29 7b 0a 20  value **argv){. 
1e770 20 4d 44 35 43 6f 6e 74 65 78 74 20 2a 70 3b 0a   MD5Context *p;.
1e780 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 61    int i;.  if( a
1e790 72 67 63 3c 31 20 29 20 72 65 74 75 72 6e 3b 0a  rgc<1 ) return;.
1e7a0 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 61 67    p = sqlite3_ag
1e7b0 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28  gregate_context(
1e7c0 63 6f 6e 74 65 78 74 2c 20 73 69 7a 65 6f 66 28  context, sizeof(
1e7d0 2a 70 29 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30  *p));.  if( p==0
1e7e0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
1e7f0 20 21 70 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20   !p->isInit ){. 
1e800 20 20 20 4d 44 35 49 6e 69 74 28 70 29 3b 0a 20     MD5Init(p);. 
1e810 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c   }.  for(i=0; i<
1e820 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  argc; i++){.    
1e830 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 61 74  const char *zDat
1e840 61 20 3d 20 28 63 68 61 72 2a 29 73 71 6c 69 74  a = (char*)sqlit
1e850 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
1e860 67 76 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28 20  gv[i]);.    if( 
1e870 7a 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 4d  zData ){.      M
1e880 44 35 55 70 64 61 74 65 28 70 2c 20 28 75 6e 73  D5Update(p, (uns
1e890 69 67 6e 65 64 20 63 68 61 72 2a 29 7a 44 61 74  igned char*)zDat
1e8a0 61 2c 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a  a, (int)strlen(z
1e8b0 44 61 74 61 29 29 3b 0a 20 20 20 20 7d 0a 20 20  Data));.    }.  
1e8c0 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  }.}.static void 
1e8d0 6d 64 35 66 69 6e 61 6c 69 7a 65 28 73 71 6c 69  md5finalize(sqli
1e8e0 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e  te3_context *con
1e8f0 74 65 78 74 29 7b 0a 20 20 4d 44 35 43 6f 6e 74  text){.  MD5Cont
1e900 65 78 74 20 2a 70 3b 0a 20 20 75 6e 73 69 67 6e  ext *p;.  unsign
1e910 65 64 20 63 68 61 72 20 64 69 67 65 73 74 5b 31  ed char digest[1
1e920 36 5d 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b  6];.  char zBuf[
1e930 33 33 5d 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74  33];.  p = sqlit
1e940 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e  e3_aggregate_con
1e950 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 73 69  text(context, si
1e960 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 4d 44 35  zeof(*p));.  MD5
1e970 46 69 6e 61 6c 28 64 69 67 65 73 74 2c 70 29 3b  Final(digest,p);
1e980 0a 20 20 4d 44 35 44 69 67 65 73 74 54 6f 42 61  .  MD5DigestToBa
1e990 73 65 31 36 28 64 69 67 65 73 74 2c 20 7a 42 75  se16(digest, zBu
1e9a0 66 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65  f);.  sqlite3_re
1e9b0 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78  sult_text(contex
1e9c0 74 2c 20 7a 42 75 66 2c 20 2d 31 2c 20 53 51 4c  t, zBuf, -1, SQL
1e9d0 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
1e9e0 7d 0a 69 6e 74 20 4d 64 35 5f 52 65 67 69 73 74  }.int Md5_Regist
1e9f0 65 72 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  er(.  sqlite3 *d
1ea00 62 2c 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45 72  b,.  char **pzEr
1ea10 72 4d 73 67 2c 0a 20 20 63 6f 6e 73 74 20 73 71  rMsg,.  const sq
1ea20 6c 69 74 65 33 5f 61 70 69 5f 72 6f 75 74 69 6e  lite3_api_routin
1ea30 65 73 20 2a 70 54 68 75 6e 6b 0a 29 7b 0a 20 20  es *pThunk.){.  
1ea40 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33  int rc = sqlite3
1ea50 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
1ea60 28 64 62 2c 20 22 6d 64 35 73 75 6d 22 2c 20 2d  (db, "md5sum", -
1ea70 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  1, SQLITE_UTF8, 
1ea80 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  0, 0,.          
1ea90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eaa0 20 20 20 20 20 20 20 6d 64 35 73 74 65 70 2c 20         md5step, 
1eab0 6d 64 35 66 69 6e 61 6c 69 7a 65 29 3b 0a 20 20  md5finalize);.  
1eac0 73 71 6c 69 74 65 33 5f 6f 76 65 72 6c 6f 61 64  sqlite3_overload
1ead0 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 6d  _function(db, "m
1eae0 64 35 73 75 6d 22 2c 20 2d 31 29 3b 20 20 2f 2a  d5sum", -1);  /*
1eaf0 20 54 6f 20 65 78 65 72 63 69 73 65 20 74 68 69   To exercise thi
1eb00 73 20 41 50 49 20 2a 2f 0a 20 20 72 65 74 75 72  s API */.  retur
1eb10 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  n rc;.}.#endif /
1eb20 2a 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  * defined(SQLITE
1eb30 5f 54 45 53 54 29 20 2a 2f 0a 0a 0a 2f 2a 0a 2a  _TEST) */.../*.*
1eb40 2a 20 49 66 20 74 68 65 20 6d 61 63 72 6f 20 54  * If the macro T
1eb50 43 4c 53 48 20 69 73 20 6f 6e 65 2c 20 74 68 65  CLSH is one, the
1eb60 6e 20 70 75 74 20 69 6e 20 63 6f 64 65 20 74 68  n put in code th
1eb70 69 73 20 66 6f 72 20 74 68 65 0a 2a 2a 20 22 6d  is for the.** "m
1eb80 61 69 6e 22 20 72 6f 75 74 69 6e 65 20 74 68 61  ain" routine tha
1eb90 74 20 77 69 6c 6c 20 69 6e 69 74 69 61 6c 69 7a  t will initializ
1eba0 65 20 54 63 6c 20 61 6e 64 20 74 61 6b 65 20 69  e Tcl and take i
1ebb0 6e 70 75 74 20 66 72 6f 6d 0a 2a 2a 20 73 74 61  nput from.** sta
1ebc0 6e 64 61 72 64 20 69 6e 70 75 74 2c 20 6f 72 20  ndard input, or 
1ebd0 69 66 20 61 20 66 69 6c 65 20 69 73 20 6e 61 6d  if a file is nam
1ebe0 65 64 20 6f 6e 20 74 68 65 20 63 6f 6d 6d 61 6e  ed on the comman
1ebf0 64 20 6c 69 6e 65 0a 2a 2a 20 74 68 65 20 54 43  d line.** the TC
1ec00 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 72 65  L interpreter re
1ec10 61 64 73 20 61 6e 64 20 65 76 61 6c 75 61 74 65  ads and evaluate
1ec20 73 20 74 68 61 74 20 66 69 6c 65 2e 0a 2a 2f 0a  s that file..*/.
1ec30 23 69 66 20 54 43 4c 53 48 3d 3d 31 0a 73 74 61  #if TCLSH==1.sta
1ec40 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
1ec50 74 63 6c 73 68 5f 6d 61 69 6e 5f 6c 6f 6f 70 28  tclsh_main_loop(
1ec60 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63 20  void){.  static 
1ec70 63 6f 6e 73 74 20 63 68 61 72 20 7a 4d 61 69 6e  const char zMain
1ec80 6c 6f 6f 70 5b 5d 20 3d 0a 20 20 20 20 22 73 65  loop[] =.    "se
1ec90 74 20 6c 69 6e 65 20 7b 7d 5c 6e 22 0a 20 20 20  t line {}\n".   
1eca0 20 22 77 68 69 6c 65 20 7b 21 5b 65 6f 66 20 73   "while {![eof s
1ecb0 74 64 69 6e 5d 7d 20 7b 5c 6e 22 0a 20 20 20 20  tdin]} {\n".    
1ecc0 20 20 22 69 66 20 7b 24 6c 69 6e 65 21 3d 5c 22    "if {$line!=\"
1ecd0 5c 22 7d 20 7b 5c 6e 22 0a 20 20 20 20 20 20 20  \"} {\n".       
1ece0 20 22 70 75 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e   "puts -nonewlin
1ecf0 65 20 5c 22 3e 20 5c 22 5c 6e 22 0a 20 20 20 20  e \"> \"\n".    
1ed00 20 20 22 7d 20 65 6c 73 65 20 7b 5c 6e 22 0a 20    "} else {\n". 
1ed10 20 20 20 20 20 20 20 22 70 75 74 73 20 2d 6e 6f         "puts -no
1ed20 6e 65 77 6c 69 6e 65 20 5c 22 25 20 5c 22 5c 6e  newline \"% \"\n
1ed30 22 0a 20 20 20 20 20 20 22 7d 5c 6e 22 0a 20 20  ".      "}\n".  
1ed40 20 20 20 20 22 66 6c 75 73 68 20 73 74 64 6f 75      "flush stdou
1ed50 74 5c 6e 22 0a 20 20 20 20 20 20 22 61 70 70 65  t\n".      "appe
1ed60 6e 64 20 6c 69 6e 65 20 5b 67 65 74 73 20 73 74  nd line [gets st
1ed70 64 69 6e 5d 5c 6e 22 0a 20 20 20 20 20 20 22 69  din]\n".      "i
1ed80 66 20 7b 5b 69 6e 66 6f 20 63 6f 6d 70 6c 65 74  f {[info complet
1ed90 65 20 24 6c 69 6e 65 5d 7d 20 7b 5c 6e 22 0a 20  e $line]} {\n". 
1eda0 20 20 20 20 20 20 20 22 69 66 20 7b 5b 63 61 74         "if {[cat
1edb0 63 68 20 7b 75 70 6c 65 76 65 6c 20 23 30 20 24  ch {uplevel #0 $
1edc0 6c 69 6e 65 7d 20 72 65 73 75 6c 74 5d 7d 20 7b  line} result]} {
1edd0 5c 6e 22 0a 20 20 20 20 20 20 20 20 20 20 22 70  \n".          "p
1ede0 75 74 73 20 73 74 64 65 72 72 20 5c 22 45 72 72  uts stderr \"Err
1edf0 6f 72 3a 20 24 72 65 73 75 6c 74 5c 22 5c 6e 22  or: $result\"\n"
1ee00 0a 20 20 20 20 20 20 20 20 22 7d 20 65 6c 73 65  .        "} else
1ee10 69 66 20 7b 24 72 65 73 75 6c 74 21 3d 5c 22 5c  if {$result!=\"\
1ee20 22 7d 20 7b 5c 6e 22 0a 20 20 20 20 20 20 20 20  "} {\n".        
1ee30 20 20 22 70 75 74 73 20 24 72 65 73 75 6c 74 5c    "puts $result\
1ee40 6e 22 0a 20 20 20 20 20 20 20 20 22 7d 5c 6e 22  n".        "}\n"
1ee50 0a 20 20 20 20 20 20 20 20 22 73 65 74 20 6c 69  .        "set li
1ee60 6e 65 20 7b 7d 5c 6e 22 0a 20 20 20 20 20 20 22  ne {}\n".      "
1ee70 7d 20 65 6c 73 65 20 7b 5c 6e 22 0a 20 20 20 20  } else {\n".    
1ee80 20 20 20 20 22 61 70 70 65 6e 64 20 6c 69 6e 65      "append line
1ee90 20 5c 5c 6e 5c 6e 22 0a 20 20 20 20 20 20 22 7d   \\n\n".      "}
1eea0 5c 6e 22 0a 20 20 20 20 22 7d 5c 6e 22 0a 20 20  \n".    "}\n".  
1eeb0 3b 0a 20 20 72 65 74 75 72 6e 20 7a 4d 61 69 6e  ;.  return zMain
1eec0 6c 6f 6f 70 3b 0a 7d 0a 23 65 6e 64 69 66 0a 23  loop;.}.#endif.#
1eed0 69 66 20 54 43 4c 53 48 3d 3d 32 0a 73 74 61 74  if TCLSH==2.stat
1eee0 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 74  ic const char *t
1eef0 63 6c 73 68 5f 6d 61 69 6e 5f 6c 6f 6f 70 28 76  clsh_main_loop(v
1ef00 6f 69 64 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69  oid);.#endif..#i
1ef10 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
1ef20 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e 69  .static void ini
1ef30 74 5f 61 6c 6c 28 54 63 6c 5f 49 6e 74 65 72 70  t_all(Tcl_Interp
1ef40 20 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20   *);.static int 
1ef50 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 69 6e  SQLITE_TCLAPI in
1ef60 69 74 5f 61 6c 6c 5f 63 6d 64 28 0a 20 20 43 6c  it_all_cmd(.  Cl
1ef70 69 65 6e 74 44 61 74 61 20 63 64 2c 0a 20 20 54  ientData cd,.  T
1ef80 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
1ef90 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
1efa0 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
1efb0 6f 62 6a 76 5b 5d 0a 29 7b 0a 0a 20 20 54 63 6c  objv[].){..  Tcl
1efc0 5f 49 6e 74 65 72 70 20 2a 73 6c 61 76 65 3b 0a  _Interp *slave;.
1efd0 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b    if( objc!=2 ){
1efe0 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  .    Tcl_WrongNu
1eff0 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
1f000 20 6f 62 6a 76 2c 20 22 53 4c 41 56 45 22 29 3b   objv, "SLAVE");
1f010 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
1f020 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 73 6c  ERROR;.  }..  sl
1f030 61 76 65 20 3d 20 54 63 6c 5f 47 65 74 53 6c 61  ave = Tcl_GetSla
1f040 76 65 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  ve(interp, Tcl_G
1f050 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
1f060 29 29 3b 0a 20 20 69 66 28 20 21 73 6c 61 76 65  ));.  if( !slave
1f070 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54   ){.    return T
1f080 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
1f090 20 69 6e 69 74 5f 61 6c 6c 28 73 6c 61 76 65 29   init_all(slave)
1f0a0 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
1f0b0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 63 6c 63  K;.}../*.** Tclc
1f0c0 6d 64 3a 20 64 62 5f 75 73 65 5f 6c 65 67 61 63  md: db_use_legac
1f0d0 79 5f 70 72 65 70 61 72 65 20 44 42 20 42 4f 4f  y_prepare DB BOO
1f0e0 4c 45 41 4e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65  LEAN.**.**   The
1f0f0 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
1f100 74 6f 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  to this command 
1f110 6d 75 73 74 20 62 65 20 61 20 64 61 74 61 62 61  must be a databa
1f120 73 65 20 63 6f 6d 6d 61 6e 64 20 63 72 65 61 74  se command creat
1f130 65 64 20 62 79 0a 2a 2a 20 20 20 5b 73 71 6c 69  ed by.**   [sqli
1f140 74 65 33 5d 2e 20 49 66 20 74 68 65 20 73 65 63  te3]. If the sec
1f150 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ond argument is 
1f160 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20 68  true, then the h
1f170 61 6e 64 6c 65 20 69 73 20 63 6f 6e 66 69 67 75  andle is configu
1f180 72 65 64 0a 2a 2a 20 20 20 74 6f 20 75 73 65 20  red.**   to use 
1f190 74 68 65 20 73 71 6c 69 74 65 33 5f 70 72 65 70  the sqlite3_prep
1f1a0 61 72 65 5f 76 32 28 29 20 66 75 6e 63 74 69 6f  are_v2() functio
1f1b0 6e 20 74 6f 20 70 72 65 70 61 72 65 20 73 74 61  n to prepare sta
1f1c0 74 65 6d 65 6e 74 73 2e 20 49 66 20 69 74 0a 2a  tements. If it.*
1f1d0 2a 20 20 20 69 73 20 66 61 6c 73 65 2c 20 73 71  *   is false, sq
1f1e0 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28 29 2e  lite3_prepare().
1f1f0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53  .*/.static int S
1f200 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 64 62 5f  QLITE_TCLAPI db_
1f210 75 73 65 5f 6c 65 67 61 63 79 5f 70 72 65 70 61  use_legacy_prepa
1f220 72 65 5f 63 6d 64 28 0a 20 20 43 6c 69 65 6e 74  re_cmd(.  Client
1f230 44 61 74 61 20 63 64 2c 0a 20 20 54 63 6c 5f 49  Data cd,.  Tcl_I
1f240 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
1f250 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
1f260 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
1f270 5b 5d 0a 29 7b 0a 20 20 54 63 6c 5f 43 6d 64 49  [].){.  Tcl_CmdI
1f280 6e 66 6f 20 63 6d 64 49 6e 66 6f 3b 0a 20 20 53  nfo cmdInfo;.  S
1f290 71 6c 69 74 65 44 62 20 2a 70 44 62 3b 0a 20 20  qliteDb *pDb;.  
1f2a0 69 6e 74 20 62 50 72 65 70 61 72 65 3b 0a 0a 20  int bPrepare;.. 
1f2b0 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a   if( objc!=3 ){.
1f2c0 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
1f2d0 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
1f2e0 6f 62 6a 76 2c 20 22 44 42 20 42 4f 4f 4c 45 41  objv, "DB BOOLEA
1f2f0 4e 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  N");.    return 
1f300 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
1f310 20 20 69 66 28 20 21 54 63 6c 5f 47 65 74 43 6f    if( !Tcl_GetCo
1f320 6d 6d 61 6e 64 49 6e 66 6f 28 69 6e 74 65 72 70  mmandInfo(interp
1f330 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
1f340 6f 62 6a 76 5b 31 5d 29 2c 20 26 63 6d 64 49 6e  objv[1]), &cmdIn
1f350 66 6f 29 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  fo) ){.    Tcl_A
1f360 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
1f370 72 70 2c 20 22 6e 6f 20 73 75 63 68 20 64 62 3a  rp, "no such db:
1f380 20 22 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e   ", Tcl_GetStrin
1f390 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 28 63 68 61  g(objv[1]), (cha
1f3a0 72 2a 29 30 29 3b 0a 20 20 20 20 72 65 74 75 72  r*)0);.    retur
1f3b0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
1f3c0 0a 20 20 70 44 62 20 3d 20 28 53 71 6c 69 74 65  .  pDb = (Sqlite
1f3d0 44 62 2a 29 63 6d 64 49 6e 66 6f 2e 6f 62 6a 43  Db*)cmdInfo.objC
1f3e0 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20 69 66 28  lientData;.  if(
1f3f0 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46   Tcl_GetBooleanF
1f400 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
1f410 62 6a 76 5b 32 5d 2c 20 26 62 50 72 65 70 61 72  bjv[2], &bPrepar
1f420 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  e) ){.    return
1f430 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
1f440 0a 20 20 70 44 62 2d 3e 62 4c 65 67 61 63 79 50  .  pDb->bLegacyP
1f450 72 65 70 61 72 65 20 3d 20 62 50 72 65 70 61 72  repare = bPrepar
1f460 65 3b 0a 0a 20 20 54 63 6c 5f 52 65 73 65 74 52  e;..  Tcl_ResetR
1f470 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20  esult(interp);. 
1f480 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
1f490 7d 0a 0a 2f 2a 0a 2a 2a 20 54 63 6c 63 6d 64 3a  }../*.** Tclcmd:
1f4a0 20 64 62 5f 6c 61 73 74 5f 73 74 6d 74 5f 70 74   db_last_stmt_pt
1f4b0 72 20 44 42 0a 2a 2a 0a 2a 2a 20 20 20 49 66 20  r DB.**.**   If 
1f4c0 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 63 61  the statement ca
1f4d0 63 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 77  che associated w
1f4e0 69 74 68 20 64 61 74 61 62 61 73 65 20 44 42 20  ith database DB 
1f4f0 69 73 20 6e 6f 74 20 65 6d 70 74 79 2c 0a 2a 2a  is not empty,.**
1f500 20 20 20 72 65 74 75 72 6e 20 74 68 65 20 74 65     return the te
1f510 78 74 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  xt representatio
1f520 6e 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65  n of the most re
1f530 63 65 6e 74 6c 79 20 75 73 65 64 20 73 74 61 74  cently used stat
1f540 65 6d 65 6e 74 0a 2a 2a 20 20 20 68 61 6e 64 6c  ement.**   handl
1f550 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1f560 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 64   SQLITE_TCLAPI d
1f570 62 5f 6c 61 73 74 5f 73 74 6d 74 5f 70 74 72 28  b_last_stmt_ptr(
1f580 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 64  .  ClientData cd
1f590 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
1f5a0 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
1f5b0 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
1f5c0 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
1f5d0 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69   extern int sqli
1f5e0 74 65 33 54 65 73 74 4d 61 6b 65 50 6f 69 6e 74  te3TestMakePoint
1f5f0 65 72 53 74 72 28 54 63 6c 5f 49 6e 74 65 72 70  erStr(Tcl_Interp
1f600 2a 2c 20 63 68 61 72 2a 2c 20 76 6f 69 64 2a 29  *, char*, void*)
1f610 3b 0a 20 20 54 63 6c 5f 43 6d 64 49 6e 66 6f 20  ;.  Tcl_CmdInfo 
1f620 63 6d 64 49 6e 66 6f 3b 0a 20 20 53 71 6c 69 74  cmdInfo;.  Sqlit
1f630 65 44 62 20 2a 70 44 62 3b 0a 20 20 73 71 6c 69  eDb *pDb;.  sqli
1f640 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20  te3_stmt *pStmt 
1f650 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a 42 75 66  = 0;.  char zBuf
1f660 5b 31 30 30 5d 3b 0a 0a 20 20 69 66 28 20 6f 62  [100];..  if( ob
1f670 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=2 ){.    Tcl
1f680 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
1f690 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
1f6a0 44 42 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  DB");.    return
1f6b0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
1f6c0 0a 20 20 69 66 28 20 21 54 63 6c 5f 47 65 74 43  .  if( !Tcl_GetC
1f6d0 6f 6d 6d 61 6e 64 49 6e 66 6f 28 69 6e 74 65 72  ommandInfo(inter
1f6e0 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
1f6f0 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 63 6d 64 49  (objv[1]), &cmdI
1f700 6e 66 6f 29 20 29 7b 0a 20 20 20 20 54 63 6c 5f  nfo) ){.    Tcl_
1f710 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
1f720 65 72 70 2c 20 22 6e 6f 20 73 75 63 68 20 64 62  erp, "no such db
1f730 3a 20 22 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  : ", Tcl_GetStri
1f740 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 28 63 68  ng(objv[1]), (ch
1f750 61 72 2a 29 30 29 3b 0a 20 20 20 20 72 65 74 75  ar*)0);.    retu
1f760 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1f770 7d 0a 20 20 70 44 62 20 3d 20 28 53 71 6c 69 74  }.  pDb = (Sqlit
1f780 65 44 62 2a 29 63 6d 64 49 6e 66 6f 2e 6f 62 6a  eDb*)cmdInfo.obj
1f790 43 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20 20 69  ClientData;..  i
1f7a0 66 28 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74  f( pDb->stmtList
1f7b0 20 29 20 70 53 74 6d 74 20 3d 20 70 44 62 2d 3e   ) pStmt = pDb->
1f7c0 73 74 6d 74 4c 69 73 74 2d 3e 70 53 74 6d 74 3b  stmtList->pStmt;
1f7d0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65  .  if( sqlite3Te
1f7e0 73 74 4d 61 6b 65 50 6f 69 6e 74 65 72 53 74 72  stMakePointerStr
1f7f0 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 70  (interp, zBuf, p
1f800 53 74 6d 74 29 20 29 7b 0a 20 20 20 20 72 65 74  Stmt) ){.    ret
1f810 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1f820 20 7d 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75   }.  Tcl_SetResu
1f830 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c  lt(interp, zBuf,
1f840 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a   TCL_VOLATILE);.
1f850 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
1f860 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
1f870 4c 49 54 45 5f 54 45 53 54 20 2a 2f 0a 0a 2f 2a  LITE_TEST */../*
1f880 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 65 20 74 68  .** Configure th
1f890 65 20 69 6e 74 65 72 70 72 65 74 65 72 20 70 61  e interpreter pa
1f8a0 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73  ssed as the firs
1f8b0 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 68 61  t argument to ha
1f8c0 76 65 20 61 63 63 65 73 73 0a 2a 2a 20 74 6f 20  ve access.** to 
1f8d0 74 68 65 20 63 6f 6d 6d 61 6e 64 73 20 61 6e 64  the commands and
1f8e0 20 6c 69 6e 6b 65 64 20 76 61 72 69 61 62 6c 65   linked variable
1f8f0 73 20 74 68 61 74 20 6d 61 6b 65 20 75 70 3a 0a  s that make up:.
1f900 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 20 5b 73  **.**   * the [s
1f910 71 6c 69 74 65 33 5d 20 65 78 74 65 6e 73 69 6f  qlite3] extensio
1f920 6e 20 69 74 73 65 6c 66 2c 0a 2a 2a 0a 2a 2a 20  n itself,.**.** 
1f930 20 20 2a 20 49 66 20 53 51 4c 49 54 45 5f 54 43    * If SQLITE_TC
1f940 4c 4d 44 35 20 6f 72 20 53 51 4c 49 54 45 5f 54  LMD5 or SQLITE_T
1f950 45 53 54 20 69 73 20 64 65 66 69 6e 65 64 2c 20  EST is defined, 
1f960 74 68 65 20 4d 64 35 20 63 6f 6d 6d 61 6e 64 73  the Md5 commands
1f970 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  , and.**.**   * 
1f980 49 66 20 53 51 4c 49 54 45 5f 54 45 53 54 20 69  If SQLITE_TEST i
1f990 73 20 73 65 74 2c 20 74 68 65 20 76 61 72 69 6f  s set, the vario
1f9a0 75 73 20 74 65 73 74 20 69 6e 74 65 72 66 61 63  us test interfac
1f9b0 65 73 20 75 73 65 64 20 62 79 20 74 68 65 20 54  es used by the T
1f9c0 63 6c 0a 2a 2a 20 20 20 20 20 74 65 73 74 20 73  cl.**     test s
1f9d0 75 69 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  uite..*/.static 
1f9e0 76 6f 69 64 20 69 6e 69 74 5f 61 6c 6c 28 54 63  void init_all(Tc
1f9f0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
1fa00 29 7b 0a 20 20 53 71 6c 69 74 65 33 5f 49 6e 69  ){.  Sqlite3_Ini
1fa10 74 28 69 6e 74 65 72 70 29 3b 0a 0a 23 69 66 20  t(interp);..#if 
1fa20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
1fa30 45 53 54 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  EST) || defined(
1fa40 53 51 4c 49 54 45 5f 54 43 4c 4d 44 35 29 0a 20  SQLITE_TCLMD5). 
1fa50 20 4d 64 35 5f 49 6e 69 74 28 69 6e 74 65 72 70   Md5_Init(interp
1fa60 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65  );.#endif..#ifde
1fa70 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
1fa80 7b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74  {.    extern int
1fa90 20 53 71 6c 69 74 65 63 6f 6e 66 69 67 5f 49 6e   Sqliteconfig_In
1faa0 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b  it(Tcl_Interp*);
1fab0 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20  .    extern int 
1fac0 53 71 6c 69 74 65 74 65 73 74 31 5f 49 6e 69 74  Sqlitetest1_Init
1fad0 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20  (Tcl_Interp*);. 
1fae0 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71     extern int Sq
1faf0 6c 69 74 65 74 65 73 74 32 5f 49 6e 69 74 28 54  litetest2_Init(T
1fb00 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20  cl_Interp*);.   
1fb10 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69   extern int Sqli
1fb20 74 65 74 65 73 74 33 5f 49 6e 69 74 28 54 63 6c  tetest3_Init(Tcl
1fb30 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65  _Interp*);.    e
1fb40 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65  xtern int Sqlite
1fb50 74 65 73 74 34 5f 49 6e 69 74 28 54 63 6c 5f 49  test4_Init(Tcl_I
1fb60 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74  nterp*);.    ext
1fb70 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65  ern int Sqlitete
1fb80 73 74 35 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74  st5_Init(Tcl_Int
1fb90 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72  erp*);.    exter
1fba0 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74  n int Sqlitetest
1fbb0 36 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  6_Init(Tcl_Inter
1fbc0 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20  p*);.    extern 
1fbd0 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 37 5f  int Sqlitetest7_
1fbe0 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a  Init(Tcl_Interp*
1fbf0 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e  );.    extern in
1fc00 74 20 53 71 6c 69 74 65 74 65 73 74 38 5f 49 6e  t Sqlitetest8_In
1fc10 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b  it(Tcl_Interp*);
1fc20 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20  .    extern int 
1fc30 53 71 6c 69 74 65 74 65 73 74 39 5f 49 6e 69 74  Sqlitetest9_Init
1fc40 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20  (Tcl_Interp*);. 
1fc50 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71     extern int Sq
1fc60 6c 69 74 65 74 65 73 74 61 73 79 6e 63 5f 49 6e  litetestasync_In
1fc70 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b  it(Tcl_Interp*);
1fc80 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20  .    extern int 
1fc90 53 71 6c 69 74 65 74 65 73 74 5f 61 75 74 6f 65  Sqlitetest_autoe
1fca0 78 74 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  xt_Init(Tcl_Inte
1fcb0 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e  rp*);.    extern
1fcc0 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 5f   int Sqlitetest_
1fcd0 62 6c 6f 62 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  blob_Init(Tcl_In
1fce0 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65  terp*);.    exte
1fcf0 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73  rn int Sqlitetes
1fd00 74 5f 64 65 6d 6f 76 66 73 5f 49 6e 69 74 28 54  t_demovfs_Init(T
1fd10 63 6c 5f 49 6e 74 65 72 70 20 2a 29 3b 0a 20 20  cl_Interp *);.  
1fd20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c    extern int Sql
1fd30 69 74 65 74 65 73 74 5f 66 75 6e 63 5f 49 6e 69  itetest_func_Ini
1fd40 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a  t(Tcl_Interp*);.
1fd50 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53      extern int S
1fd60 71 6c 69 74 65 74 65 73 74 5f 68 65 78 69 6f 5f  qlitetest_hexio_
1fd70 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a  Init(Tcl_Interp*
1fd80 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e  );.    extern in
1fd90 74 20 53 71 6c 69 74 65 74 65 73 74 5f 69 6e 69  t Sqlitetest_ini
1fda0 74 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  t_Init(Tcl_Inter
1fdb0 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20  p*);.    extern 
1fdc0 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 5f 6d  int Sqlitetest_m
1fdd0 61 6c 6c 6f 63 5f 49 6e 69 74 28 54 63 6c 5f 49  alloc_Init(Tcl_I
1fde0 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74  nterp*);.    ext
1fdf0 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65  ern int Sqlitete
1fe00 73 74 5f 6d 75 74 65 78 5f 49 6e 69 74 28 54 63  st_mutex_Init(Tc
1fe10 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20  l_Interp*);.    
1fe20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74  extern int Sqlit
1fe30 65 74 65 73 74 73 63 68 65 6d 61 5f 49 6e 69 74  etestschema_Init
1fe40 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20  (Tcl_Interp*);. 
1fe50 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71     extern int Sq
1fe60 6c 69 74 65 74 65 73 74 73 73 65 5f 49 6e 69 74  litetestsse_Init
1fe70 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20  (Tcl_Interp*);. 
1fe80 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71     extern int Sq
1fe90 6c 69 74 65 74 65 73 74 74 63 6c 76 61 72 5f 49  litetesttclvar_I
1fea0 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29  nit(Tcl_Interp*)
1feb0 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74  ;.    extern int
1fec0 20 53 71 6c 69 74 65 74 65 73 74 66 73 5f 49 6e   Sqlitetestfs_In
1fed0 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b  it(Tcl_Interp*);
1fee0 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20  .    extern int 
1fef0 53 71 6c 69 74 65 74 65 73 74 54 68 72 65 61 64  SqlitetestThread
1ff00 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
1ff10 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69  *);.    extern i
1ff20 6e 74 20 53 71 6c 69 74 65 74 65 73 74 4f 6e 65  nt SqlitetestOne
1ff30 66 69 6c 65 5f 49 6e 69 74 28 29 3b 0a 20 20 20  file_Init();.   
1ff40 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69   extern int Sqli
1ff50 74 65 74 65 73 74 4f 73 69 6e 73 74 5f 49 6e 69  tetestOsinst_Ini
1ff60 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a  t(Tcl_Interp*);.
1ff70 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53      extern int S
1ff80 71 6c 69 74 65 74 65 73 74 62 61 63 6b 75 70 5f  qlitetestbackup_
1ff90 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a  Init(Tcl_Interp*
1ffa0 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e  );.    extern in
1ffb0 74 20 53 71 6c 69 74 65 74 65 73 74 69 6e 74 61  t Sqlitetestinta
1ffc0 72 72 61 79 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  rray_Init(Tcl_In
1ffd0 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65  terp*);.    exte
1ffe0 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73  rn int Sqlitetes
1fff0 74 76 66 73 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  tvfs_Init(Tcl_In
20000 74 65 72 70 20 2a 29 3b 0a 20 20 20 20 65 78 74  terp *);.    ext
20010 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65  ern int Sqlitete
20020 73 74 72 74 72 65 65 5f 49 6e 69 74 28 54 63 6c  strtree_Init(Tcl
20030 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65  _Interp*);.    e
20040 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65  xtern int Sqlite
20050 71 75 6f 74 61 5f 49 6e 69 74 28 54 63 6c 5f 49  quota_Init(Tcl_I
20060 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74  nterp*);.    ext
20070 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 6d 75  ern int Sqlitemu
20080 6c 74 69 70 6c 65 78 5f 49 6e 69 74 28 54 63 6c  ltiplex_Init(Tcl
20090 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65  _Interp*);.    e
200a0 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65  xtern int Sqlite
200b0 53 75 70 65 72 6c 6f 63 6b 5f 49 6e 69 74 28 54  Superlock_Init(T
200c0 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20  cl_Interp*);.   
200d0 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69   extern int Sqli
200e0 74 65 74 65 73 74 53 79 73 63 61 6c 6c 5f 49 6e  tetestSyscall_In
200f0 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b  it(Tcl_Interp*);
20100 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
20110 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45 53 53 49  ITE_ENABLE_SESSI
20120 4f 4e 29 20 26 26 20 64 65 66 69 6e 65 64 28 53  ON) && defined(S
20130 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52 45  QLITE_ENABLE_PRE
20140 55 50 44 41 54 45 5f 48 4f 4f 4b 29 0a 20 20 20  UPDATE_HOOK).   
20150 20 65 78 74 65 72 6e 20 69 6e 74 20 54 65 73 74   extern int Test
20160 53 65 73 73 69 6f 6e 5f 49 6e 69 74 28 54 63 6c  Session_Init(Tcl
20170 5f 49 6e 74 65 72 70 2a 29 3b 0a 23 65 6e 64 69  _Interp*);.#endi
20180 66 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74  f.    extern int
20190 20 46 74 73 35 74 63 6c 5f 49 6e 69 74 28 54 63   Fts5tcl_Init(Tc
201a0 6c 5f 49 6e 74 65 72 70 20 2a 29 3b 0a 20 20 20  l_Interp *);.   
201b0 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69   extern int Sqli
201c0 74 65 52 62 75 5f 49 6e 69 74 28 54 63 6c 5f 49  teRbu_Init(Tcl_I
201d0 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74  nterp*);.    ext
201e0 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65  ern int Sqlitete
201f0 73 74 74 63 6c 5f 49 6e 69 74 28 54 63 6c 5f 49  sttcl_Init(Tcl_I
20200 6e 74 65 72 70 2a 29 3b 0a 23 69 66 20 64 65 66  nterp*);.#if def
20210 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
20220 4c 45 5f 46 54 53 33 29 20 7c 7c 20 64 65 66 69  LE_FTS3) || defi
20230 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
20240 45 5f 46 54 53 34 29 0a 20 20 20 20 65 78 74 65  E_FTS4).    exte
20250 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73  rn int Sqlitetes
20260 74 66 74 73 33 5f 49 6e 69 74 28 54 63 6c 5f 49  tfts3_Init(Tcl_I
20270 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 3b 0a  nterp *interp);.
20280 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53  #endif..#ifdef S
20290 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 5a 49 50  QLITE_ENABLE_ZIP
202a0 56 46 53 0a 20 20 20 20 65 78 74 65 72 6e 20 69  VFS.    extern i
202b0 6e 74 20 5a 69 70 76 66 73 5f 49 6e 69 74 28 54  nt Zipvfs_Init(T
202c0 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20  cl_Interp*);.   
202d0 20 5a 69 70 76 66 73 5f 49 6e 69 74 28 69 6e 74   Zipvfs_Init(int
202e0 65 72 70 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  erp);.#endif..  
202f0 20 20 53 71 6c 69 74 65 63 6f 6e 66 69 67 5f 49    Sqliteconfig_I
20300 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20  nit(interp);.   
20310 20 53 71 6c 69 74 65 74 65 73 74 31 5f 49 6e 69   Sqlitetest1_Ini
20320 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53  t(interp);.    S
20330 71 6c 69 74 65 74 65 73 74 32 5f 49 6e 69 74 28  qlitetest2_Init(
20340 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c  interp);.    Sql
20350 69 74 65 74 65 73 74 33 5f 49 6e 69 74 28 69 6e  itetest3_Init(in
20360 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74  terp);.    Sqlit
20370 65 74 65 73 74 34 5f 49 6e 69 74 28 69 6e 74 65  etest4_Init(inte
20380 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74  rp);.    Sqlitet
20390 65 73 74 35 5f 49 6e 69 74 28 69 6e 74 65 72 70  est5_Init(interp
203a0 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73  );.    Sqlitetes
203b0 74 36 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b  t6_Init(interp);
203c0 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 37  .    Sqlitetest7
203d0 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20  _Init(interp);. 
203e0 20 20 20 53 71 6c 69 74 65 74 65 73 74 38 5f 49     Sqlitetest8_I
203f0 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20  nit(interp);.   
20400 20 53 71 6c 69 74 65 74 65 73 74 39 5f 49 6e 69   Sqlitetest9_Ini
20410 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53  t(interp);.    S
20420 71 6c 69 74 65 74 65 73 74 61 73 79 6e 63 5f 49  qlitetestasync_I
20430 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20  nit(interp);.   
20440 20 53 71 6c 69 74 65 74 65 73 74 5f 61 75 74 6f   Sqlitetest_auto
20450 65 78 74 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  ext_Init(interp)
20460 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74  ;.    Sqlitetest
20470 5f 62 6c 6f 62 5f 49 6e 69 74 28 69 6e 74 65 72  _blob_Init(inter
20480 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65  p);.    Sqlitete
20490 73 74 5f 64 65 6d 6f 76 66 73 5f 49 6e 69 74 28  st_demovfs_Init(
204a0 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c  interp);.    Sql
204b0 69 74 65 74 65 73 74 5f 66 75 6e 63 5f 49 6e 69  itetest_func_Ini
204c0 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53  t(interp);.    S
204d0 71 6c 69 74 65 74 65 73 74 5f 68 65 78 69 6f 5f  qlitetest_hexio_
204e0 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  Init(interp);.  
204f0 20 20 53 71 6c 69 74 65 74 65 73 74 5f 69 6e 69    Sqlitetest_ini
20500 74 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a  t_Init(interp);.
20510 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 5f 6d      Sqlitetest_m
20520 61 6c 6c 6f 63 5f 49 6e 69 74 28 69 6e 74 65 72  alloc_Init(inter
20530 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65  p);.    Sqlitete
20540 73 74 5f 6d 75 74 65 78 5f 49 6e 69 74 28 69 6e  st_mutex_Init(in
20550 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74  terp);.    Sqlit
20560 65 74 65 73 74 73 63 68 65 6d 61 5f 49 6e 69 74  etestschema_Init
20570 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71  (interp);.    Sq
20580 6c 69 74 65 74 65 73 74 74 63 6c 76 61 72 5f 49  litetesttclvar_I
20590 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20  nit(interp);.   
205a0 20 53 71 6c 69 74 65 74 65 73 74 66 73 5f 49 6e   Sqlitetestfs_In
205b0 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  it(interp);.    
205c0 53 71 6c 69 74 65 74 65 73 74 54 68 72 65 61 64  SqlitetestThread
205d0 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20  _Init(interp);. 
205e0 20 20 20 53 71 6c 69 74 65 74 65 73 74 4f 6e 65     SqlitetestOne
205f0 66 69 6c 65 5f 49 6e 69 74 28 29 3b 0a 20 20 20  file_Init();.   
20600 20 53 71 6c 69 74 65 74 65 73 74 4f 73 69 6e 73   SqlitetestOsins
20610 74 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a  t_Init(interp);.
20620 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 62 61      Sqlitetestba
20630 63 6b 75 70 5f 49 6e 69 74 28 69 6e 74 65 72 70  ckup_Init(interp
20640 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73  );.    Sqlitetes
20650 74 69 6e 74 61 72 72 61 79 5f 49 6e 69 74 28 69  tintarray_Init(i
20660 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69  nterp);.    Sqli
20670 74 65 74 65 73 74 76 66 73 5f 49 6e 69 74 28 69  tetestvfs_Init(i
20680 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69  nterp);.    Sqli
20690 74 65 74 65 73 74 72 74 72 65 65 5f 49 6e 69 74  tetestrtree_Init
206a0 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71  (interp);.    Sq
206b0 6c 69 74 65 71 75 6f 74 61 5f 49 6e 69 74 28 69  litequota_Init(i
206c0 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69  nterp);.    Sqli
206d0 74 65 6d 75 6c 74 69 70 6c 65 78 5f 49 6e 69 74  temultiplex_Init
206e0 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71  (interp);.    Sq
206f0 6c 69 74 65 53 75 70 65 72 6c 6f 63 6b 5f 49 6e  liteSuperlock_In
20700 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  it(interp);.    
20710 53 71 6c 69 74 65 74 65 73 74 53 79 73 63 61 6c  SqlitetestSyscal
20720 6c 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a  l_Init(interp);.
20730 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
20740 54 45 5f 45 4e 41 42 4c 45 5f 53 45 53 53 49 4f  TE_ENABLE_SESSIO
20750 4e 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  N) && defined(SQ
20760 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52 45 55  LITE_ENABLE_PREU
20770 50 44 41 54 45 5f 48 4f 4f 4b 29 0a 20 20 20 20  PDATE_HOOK).    
20780 54 65 73 74 53 65 73 73 69 6f 6e 5f 49 6e 69 74  TestSession_Init
20790 28 69 6e 74 65 72 70 29 3b 0a 23 65 6e 64 69 66  (interp);.#endif
207a0 0a 20 20 20 20 46 74 73 35 74 63 6c 5f 49 6e 69  .    Fts5tcl_Ini
207b0 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53  t(interp);.    S
207c0 71 6c 69 74 65 52 62 75 5f 49 6e 69 74 28 69 6e  qliteRbu_Init(in
207d0 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74  terp);.    Sqlit
207e0 65 74 65 73 74 74 63 6c 5f 49 6e 69 74 28 69 6e  etesttcl_Init(in
207f0 74 65 72 70 29 3b 0a 0a 23 69 66 20 64 65 66 69  terp);..#if defi
20800 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
20810 45 5f 46 54 53 33 29 20 7c 7c 20 64 65 66 69 6e  E_FTS3) || defin
20820 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
20830 5f 46 54 53 34 29 0a 20 20 20 20 53 71 6c 69 74  _FTS4).    Sqlit
20840 65 74 65 73 74 66 74 73 33 5f 49 6e 69 74 28 69  etestfts3_Init(i
20850 6e 74 65 72 70 29 3b 0a 23 65 6e 64 69 66 0a 0a  nterp);.#endif..
20860 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62      Tcl_CreateOb
20870 6a 43 6f 6d 6d 61 6e 64 28 0a 20 20 20 20 20 20  jCommand(.      
20880 20 20 69 6e 74 65 72 70 2c 20 22 6c 6f 61 64 5f    interp, "load_
20890 74 65 73 74 66 69 78 74 75 72 65 5f 65 78 74 65  testfixture_exte
208a0 6e 73 69 6f 6e 73 22 2c 20 69 6e 69 74 5f 61 6c  nsions", init_al
208b0 6c 5f 63 6d 64 2c 20 30 2c 20 30 0a 20 20 20 20  l_cmd, 0, 0.    
208c0 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74  );.    Tcl_Creat
208d0 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 0a 20 20 20  eObjCommand(.   
208e0 20 20 20 20 20 69 6e 74 65 72 70 2c 20 22 64 62       interp, "db
208f0 5f 75 73 65 5f 6c 65 67 61 63 79 5f 70 72 65 70  _use_legacy_prep
20900 61 72 65 22 2c 20 64 62 5f 75 73 65 5f 6c 65 67  are", db_use_leg
20910 61 63 79 5f 70 72 65 70 61 72 65 5f 63 6d 64 2c  acy_prepare_cmd,
20920 20 30 2c 20 30 0a 20 20 20 20 29 3b 0a 20 20 20   0, 0.    );.   
20930 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f   Tcl_CreateObjCo
20940 6d 6d 61 6e 64 28 0a 20 20 20 20 20 20 20 20 69  mmand(.        i
20950 6e 74 65 72 70 2c 20 22 64 62 5f 6c 61 73 74 5f  nterp, "db_last_
20960 73 74 6d 74 5f 70 74 72 22 2c 20 64 62 5f 6c 61  stmt_ptr", db_la
20970 73 74 5f 73 74 6d 74 5f 70 74 72 2c 20 30 2c 20  st_stmt_ptr, 0, 
20980 30 0a 20 20 20 20 29 3b 0a 0a 23 69 66 64 65 66  0.    );..#ifdef
20990 20 53 51 4c 49 54 45 5f 53 53 45 0a 20 20 20 20   SQLITE_SSE.    
209a0 53 71 6c 69 74 65 74 65 73 74 73 73 65 5f 49 6e  Sqlitetestsse_In
209b0 69 74 28 69 6e 74 65 72 70 29 3b 0a 23 65 6e 64  it(interp);.#end
209c0 69 66 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a  if.  }.#endif.}.
209d0 0a 2f 2a 20 4e 65 65 64 65 64 20 66 6f 72 20 74  ./* Needed for t
209e0 68 65 20 73 65 74 72 6c 69 6d 69 74 28 29 20 73  he setrlimit() s
209f0 79 73 74 65 6d 20 63 61 6c 6c 20 6f 6e 20 75 6e  ystem call on un
20a00 69 78 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65  ix */.#if define
20a10 64 28 75 6e 69 78 29 0a 23 69 6e 63 6c 75 64 65  d(unix).#include
20a20 20 3c 73 79 73 2f 72 65 73 6f 75 72 63 65 2e 68   <sys/resource.h
20a30 3e 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  >.#endif..#defin
20a40 65 20 54 43 4c 53 48 5f 4d 41 49 4e 20 6d 61 69  e TCLSH_MAIN mai
20a50 6e 20 20 20 2f 2a 20 4e 65 65 64 65 64 20 74 6f  n   /* Needed to
20a60 20 66 61 6b 65 20 6f 75 74 20 6d 6b 74 63 6c 61   fake out mktcla
20a70 70 70 20 2a 2f 0a 69 6e 74 20 53 51 4c 49 54 45  pp */.int SQLITE
20a80 5f 43 44 45 43 4c 20 54 43 4c 53 48 5f 4d 41 49  _CDECL TCLSH_MAI
20a90 4e 28 69 6e 74 20 61 72 67 63 2c 20 63 68 61 72  N(int argc, char
20aa0 20 2a 2a 61 72 67 76 29 7b 0a 20 20 54 63 6c 5f   **argv){.  Tcl_
20ab0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 3b 0a  Interp *interp;.
20ac0 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 5f 57  .#if !defined(_W
20ad0 49 4e 33 32 5f 57 43 45 29 0a 20 20 69 66 28 20  IN32_WCE).  if( 
20ae0 67 65 74 65 6e 76 28 22 42 52 45 41 4b 22 29 20  getenv("BREAK") 
20af0 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73  ){.    fprintf(s
20b00 74 64 65 72 72 2c 0a 20 20 20 20 20 20 20 20 22  tderr,.        "
20b10 61 74 74 61 63 68 20 64 65 62 75 67 67 65 72 20  attach debugger 
20b20 74 6f 20 70 72 6f 63 65 73 73 20 25 64 20 61 6e  to process %d an
20b30 64 20 70 72 65 73 73 20 61 6e 79 20 6b 65 79 20  d press any key 
20b40 74 6f 20 63 6f 6e 74 69 6e 75 65 2e 5c 6e 22 2c  to continue.\n",
20b50 0a 20 20 20 20 20 20 20 20 47 45 54 50 49 44 28  .        GETPID(
20b60 29 29 3b 0a 20 20 20 20 66 67 65 74 63 28 73 74  ));.    fgetc(st
20b70 64 69 6e 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  din);.  }.#endif
20b80 0a 0a 20 20 2f 2a 20 53 69 6e 63 65 20 74 68 65  ..  /* Since the
20b90 20 70 72 69 6d 61 72 79 20 75 73 65 20 63 61 73   primary use cas
20ba0 65 20 66 6f 72 20 74 68 69 73 20 62 69 6e 61 72  e for this binar
20bb0 79 20 69 73 20 74 65 73 74 69 6e 67 20 6f 66 20  y is testing of 
20bc0 53 51 4c 69 74 65 2c 0a 20 20 2a 2a 20 62 65 20  SQLite,.  ** be 
20bd0 73 75 72 65 20 74 6f 20 67 65 6e 65 72 61 74 65  sure to generate
20be0 20 63 6f 72 65 20 66 69 6c 65 73 20 69 66 20 77   core files if w
20bf0 65 20 63 72 61 73 68 20 2a 2f 0a 23 69 66 20 64  e crash */.#if d
20c00 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45  efined(SQLITE_TE
20c10 53 54 29 20 26 26 20 64 65 66 69 6e 65 64 28 75  ST) && defined(u
20c20 6e 69 78 29 0a 20 20 7b 20 73 74 72 75 63 74 20  nix).  { struct 
20c30 72 6c 69 6d 69 74 20 78 3b 0a 20 20 20 20 67 65  rlimit x;.    ge
20c40 74 72 6c 69 6d 69 74 28 52 4c 49 4d 49 54 5f 43  trlimit(RLIMIT_C
20c50 4f 52 45 2c 20 26 78 29 3b 0a 20 20 20 20 78 2e  ORE, &x);.    x.
20c60 72 6c 69 6d 5f 63 75 72 20 3d 20 78 2e 72 6c 69  rlim_cur = x.rli
20c70 6d 5f 6d 61 78 3b 0a 20 20 20 20 73 65 74 72 6c  m_max;.    setrl
20c80 69 6d 69 74 28 52 4c 49 4d 49 54 5f 43 4f 52 45  imit(RLIMIT_CORE
20c90 2c 20 26 78 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  , &x);.  }.#endi
20ca0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 54 45 53 54  f /* SQLITE_TEST
20cb0 20 26 26 20 75 6e 69 78 20 2a 2f 0a 0a 0a 20 20   && unix */...  
20cc0 2f 2a 20 43 61 6c 6c 20 73 71 6c 69 74 65 33 5f  /* Call sqlite3_
20cd0 73 68 75 74 64 6f 77 6e 28 29 20 6f 6e 63 65 20  shutdown() once 
20ce0 62 65 66 6f 72 65 20 64 6f 69 6e 67 20 61 6e 79  before doing any
20cf0 74 68 69 6e 67 20 65 6c 73 65 2e 20 54 68 69 73  thing else. This
20d00 20 69 73 20 74 6f 0a 20 20 2a 2a 20 74 65 73 74   is to.  ** test
20d10 20 74 68 61 74 20 73 71 6c 69 74 65 33 5f 73 68   that sqlite3_sh
20d20 75 74 64 6f 77 6e 28 29 20 63 61 6e 20 62 65 20  utdown() can be 
20d30 73 61 66 65 6c 79 20 63 61 6c 6c 65 64 20 62 79  safely called by
20d40 20 61 20 70 72 6f 63 65 73 73 20 62 65 66 6f 72   a process befor
20d50 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 69  e.  ** sqlite3_i
20d60 6e 69 74 69 61 6c 69 7a 65 28 29 20 69 73 2e 20  nitialize() is. 
20d70 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 68 75  */.  sqlite3_shu
20d80 74 64 6f 77 6e 28 29 3b 0a 0a 20 20 54 63 6c 5f  tdown();..  Tcl_
20d90 46 69 6e 64 45 78 65 63 75 74 61 62 6c 65 28 61  FindExecutable(a
20da0 72 67 76 5b 30 5d 29 3b 0a 20 20 54 63 6c 5f 53  rgv[0]);.  Tcl_S
20db0 65 74 53 79 73 74 65 6d 45 6e 63 6f 64 69 6e 67  etSystemEncoding
20dc0 28 4e 55 4c 4c 2c 20 22 75 74 66 2d 38 22 29 3b  (NULL, "utf-8");
20dd0 0a 20 20 69 6e 74 65 72 70 20 3d 20 54 63 6c 5f  .  interp = Tcl_
20de0 43 72 65 61 74 65 49 6e 74 65 72 70 28 29 3b 0a  CreateInterp();.
20df0 0a 23 69 66 20 54 43 4c 53 48 3d 3d 32 0a 20 20  .#if TCLSH==2.  
20e00 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 53  sqlite3_config(S
20e10 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53 49 4e  QLITE_CONFIG_SIN
20e20 47 4c 45 54 48 52 45 41 44 29 3b 0a 23 65 6e 64  GLETHREAD);.#end
20e30 69 66 0a 0a 20 20 69 6e 69 74 5f 61 6c 6c 28 69  if..  init_all(i
20e40 6e 74 65 72 70 29 3b 0a 20 20 69 66 28 20 61 72  nterp);.  if( ar
20e50 67 63 3e 3d 32 20 29 7b 0a 20 20 20 20 69 6e 74  gc>=2 ){.    int
20e60 20 69 3b 0a 20 20 20 20 63 68 61 72 20 7a 41 72   i;.    char zAr
20e70 67 63 5b 33 32 5d 3b 0a 20 20 20 20 73 71 6c 69  gc[32];.    sqli
20e80 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
20e90 65 6f 66 28 7a 41 72 67 63 29 2c 20 7a 41 72 67  eof(zArgc), zArg
20ea0 63 2c 20 22 25 64 22 2c 20 61 72 67 63 2d 28 33  c, "%d", argc-(3
20eb0 2d 54 43 4c 53 48 29 29 3b 0a 20 20 20 20 54 63  -TCLSH));.    Tc
20ec0 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c  l_SetVar(interp,
20ed0 22 61 72 67 63 22 2c 20 7a 41 72 67 63 2c 20 54  "argc", zArgc, T
20ee0 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b  CL_GLOBAL_ONLY);
20ef0 0a 20 20 20 20 54 63 6c 5f 53 65 74 56 61 72 28  .    Tcl_SetVar(
20f00 69 6e 74 65 72 70 2c 22 61 72 67 76 30 22 2c 61  interp,"argv0",a
20f10 72 67 76 5b 31 5d 2c 54 43 4c 5f 47 4c 4f 42 41  rgv[1],TCL_GLOBA
20f20 4c 5f 4f 4e 4c 59 29 3b 0a 20 20 20 20 54 63 6c  L_ONLY);.    Tcl
20f30 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c 22  _SetVar(interp,"
20f40 61 72 67 76 22 2c 20 22 22 2c 20 54 43 4c 5f 47  argv", "", TCL_G
20f50 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 20 20 20  LOBAL_ONLY);.   
20f60 20 66 6f 72 28 69 3d 33 2d 54 43 4c 53 48 3b 20   for(i=3-TCLSH; 
20f70 69 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20  i<argc; i++){.  
20f80 20 20 20 20 54 63 6c 5f 53 65 74 56 61 72 28 69      Tcl_SetVar(i
20f90 6e 74 65 72 70 2c 20 22 61 72 67 76 22 2c 20 61  nterp, "argv", a
20fa0 72 67 76 5b 69 5d 2c 0a 20 20 20 20 20 20 20 20  rgv[i],.        
20fb0 20 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c    TCL_GLOBAL_ONL
20fc0 59 20 7c 20 54 43 4c 5f 4c 49 53 54 5f 45 4c 45  Y | TCL_LIST_ELE
20fd0 4d 45 4e 54 20 7c 20 54 43 4c 5f 41 50 50 45 4e  MENT | TCL_APPEN
20fe0 44 5f 56 41 4c 55 45 29 3b 0a 20 20 20 20 7d 0a  D_VALUE);.    }.
20ff0 20 20 20 20 69 66 28 20 54 43 4c 53 48 3d 3d 31      if( TCLSH==1
21000 20 26 26 20 54 63 6c 5f 45 76 61 6c 46 69 6c 65   && Tcl_EvalFile
21010 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d  (interp, argv[1]
21020 29 21 3d 54 43 4c 5f 4f 4b 20 29 7b 0a 20 20 20  )!=TCL_OK ){.   
21030 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
21040 49 6e 66 6f 20 3d 20 54 63 6c 5f 47 65 74 56 61  Info = Tcl_GetVa
21050 72 28 69 6e 74 65 72 70 2c 20 22 65 72 72 6f 72  r(interp, "error
21060 49 6e 66 6f 22 2c 20 54 43 4c 5f 47 4c 4f 42 41  Info", TCL_GLOBA
21070 4c 5f 4f 4e 4c 59 29 3b 0a 20 20 20 20 20 20 69  L_ONLY);.      i
21080 66 28 20 7a 49 6e 66 6f 3d 3d 30 20 29 20 7a 49  f( zInfo==0 ) zI
21090 6e 66 6f 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  nfo = Tcl_GetStr
210a0 69 6e 67 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ingResult(interp
210b0 29 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  );.      fprintf
210c0 28 73 74 64 65 72 72 2c 22 25 73 3a 20 25 73 5c  (stderr,"%s: %s\
210d0 6e 22 2c 20 2a 61 72 67 76 2c 20 7a 49 6e 66 6f  n", *argv, zInfo
210e0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
210f0 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  1;.    }.  }.  i
21100 66 28 20 54 43 4c 53 48 3d 3d 32 20 7c 7c 20 61  f( TCLSH==2 || a
21110 72 67 63 3c 3d 31 20 29 7b 0a 20 20 20 20 54 63  rgc<=1 ){.    Tc
21120 6c 5f 47 6c 6f 62 61 6c 45 76 61 6c 28 69 6e 74  l_GlobalEval(int
21130 65 72 70 2c 20 74 63 6c 73 68 5f 6d 61 69 6e 5f  erp, tclsh_main_
21140 6c 6f 6f 70 28 29 29 3b 0a 20 20 7d 0a 20 20 72  loop());.  }.  r
21150 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69  eturn 0;.}.#endi
21160 66 20 2f 2a 20 54 43 4c 53 48 20 2a 2f 0a        f /* TCLSH */.