/ Hex Artifact Content
Login

Artifact b1565eb727ec7121b59287fed77fc378118bfb69:


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 23 69 6e 63 6c 75 64 65 20 22 74  ..*/.#include "t
0450: 63 6c 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c  cl.h".#include <
0460: 65 72 72 6e 6f 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20  errno.h>../*.** 
0470: 53 6f 6d 65 20 61 64 64 69 74 69 6f 6e 61 6c 20  Some additional 
0480: 69 6e 63 6c 75 64 65 20 66 69 6c 65 73 20 61 72  include files ar
0490: 65 20 6e 65 65 64 65 64 20 69 66 20 74 68 69 73  e needed if this
04a0: 20 66 69 6c 65 20 69 73 20 6e 6f 74 0a 2a 2a 20   file is not.** 
04b0: 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20  appended to the 
04c0: 61 6d 61 6c 67 61 6d 61 74 69 6f 6e 2e 0a 2a 2f  amalgamation..*/
04d0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
04e0: 41 4d 41 4c 47 41 4d 41 54 49 4f 4e 0a 23 20 69  AMALGAMATION.# i
04f0: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 33 2e  nclude "sqlite3.
0500: 68 22 0a 23 20 69 6e 63 6c 75 64 65 20 3c 73 74  h".# include <st
0510: 64 6c 69 62 2e 68 3e 0a 23 20 69 6e 63 6c 75 64  dlib.h>.# includ
0520: 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a 23 20 69  e <string.h>.# i
0530: 6e 63 6c 75 64 65 20 3c 61 73 73 65 72 74 2e 68  nclude <assert.h
0540: 3e 0a 20 20 74 79 70 65 64 65 66 20 75 6e 73 69  >.  typedef unsi
0550: 67 6e 65 64 20 63 68 61 72 20 75 38 3b 0a 23 65  gned char u8;.#e
0560: 6e 64 69 66 0a 23 69 6e 63 6c 75 64 65 20 3c 63  ndif.#include <c
0570: 74 79 70 65 2e 68 3e 0a 0a 2f 2a 0a 20 2a 20 57  type.h>../*. * W
0580: 69 6e 64 6f 77 73 20 6e 65 65 64 73 20 74 6f 20  indows needs to 
0590: 6b 6e 6f 77 20 77 68 69 63 68 20 73 79 6d 62 6f  know which symbo
05a0: 6c 73 20 74 6f 20 65 78 70 6f 72 74 2e 20 20 55  ls to export.  U
05b0: 6e 69 78 20 64 6f 65 73 20 6e 6f 74 2e 0a 20 2a  nix does not.. *
05c0: 20 42 55 49 4c 44 5f 73 71 6c 69 74 65 20 73 68   BUILD_sqlite sh
05d0: 6f 75 6c 64 20 62 65 20 75 6e 64 65 66 69 6e 65  ould be undefine
05e0: 64 20 66 6f 72 20 55 6e 69 78 2e 0a 20 2a 2f 0a  d for Unix.. */.
05f0: 23 69 66 64 65 66 20 42 55 49 4c 44 5f 73 71 6c  #ifdef BUILD_sql
0600: 69 74 65 0a 23 75 6e 64 65 66 20 54 43 4c 5f 53  ite.#undef TCL_S
0610: 54 4f 52 41 47 45 5f 43 4c 41 53 53 0a 23 64 65  TORAGE_CLASS.#de
0620: 66 69 6e 65 20 54 43 4c 5f 53 54 4f 52 41 47 45  fine TCL_STORAGE
0630: 5f 43 4c 41 53 53 20 44 4c 4c 45 58 50 4f 52 54  _CLASS DLLEXPORT
0640: 0a 23 65 6e 64 69 66 20 2f 2a 20 42 55 49 4c 44  .#endif /* BUILD
0650: 5f 73 71 6c 69 74 65 20 2a 2f 0a 0a 23 64 65 66  _sqlite */..#def
0660: 69 6e 65 20 4e 55 4d 5f 50 52 45 50 41 52 45 44  ine NUM_PREPARED
0670: 5f 53 54 4d 54 53 20 31 30 0a 23 64 65 66 69 6e  _STMTS 10.#defin
0680: 65 20 4d 41 58 5f 50 52 45 50 41 52 45 44 5f 53  e MAX_PREPARED_S
0690: 54 4d 54 53 20 31 30 30 0a 0a 2f 2a 0a 2a 2a 20  TMTS 100../*.** 
06a0: 49 66 20 54 43 4c 20 75 73 65 73 20 55 54 46 2d  If TCL uses UTF-
06b0: 38 20 61 6e 64 20 53 51 4c 69 74 65 20 69 73 20  8 and SQLite is 
06c0: 63 6f 6e 66 69 67 75 72 65 64 20 74 6f 20 75 73  configured to us
06d0: 65 20 69 73 6f 38 38 35 39 2c 20 74 68 65 6e 20  e iso8859, then 
06e0: 77 65 0a 2a 2a 20 68 61 76 65 20 74 6f 20 64 6f  we.** have to do
06f0: 20 61 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20 77   a translation w
0700: 68 65 6e 20 67 6f 69 6e 67 20 62 65 74 77 65 65  hen going betwee
0710: 6e 20 74 68 65 20 74 77 6f 2e 20 20 53 65 74 20  n the two.  Set 
0720: 74 68 65 20 0a 2a 2a 20 55 54 46 5f 54 52 41 4e  the .** UTF_TRAN
0730: 53 4c 41 54 49 4f 4e 5f 4e 45 45 44 45 44 20 6d  SLATION_NEEDED m
0740: 61 63 72 6f 20 74 6f 20 69 6e 64 69 63 61 74 65  acro to indicate
0750: 20 74 68 61 74 20 77 65 20 6e 65 65 64 20 74 6f   that we need to
0760: 20 64 6f 0a 2a 2a 20 74 68 69 73 20 74 72 61 6e   do.** this tran
0770: 73 6c 61 74 69 6f 6e 2e 20 20 0a 2a 2f 0a 23 69  slation.  .*/.#i
0780: 66 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 55 54  f defined(TCL_UT
0790: 46 5f 4d 41 58 29 20 26 26 20 21 64 65 66 69 6e  F_MAX) && !defin
07a0: 65 64 28 53 51 4c 49 54 45 5f 55 54 46 38 29 0a  ed(SQLITE_UTF8).
07b0: 23 20 64 65 66 69 6e 65 20 55 54 46 5f 54 52 41  # define UTF_TRA
07c0: 4e 53 4c 41 54 49 4f 4e 5f 4e 45 45 44 45 44 20  NSLATION_NEEDED 
07d0: 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  1.#endif../*.** 
07e0: 4e 65 77 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e  New SQL function
07f0: 73 20 63 61 6e 20 62 65 20 63 72 65 61 74 65 64  s can be created
0800: 20 61 73 20 54 43 4c 20 73 63 72 69 70 74 73 2e   as TCL scripts.
0810: 20 20 45 61 63 68 20 73 75 63 68 20 66 75 6e 63    Each such func
0820: 74 69 6f 6e 0a 2a 2a 20 69 73 20 64 65 73 63 72  tion.** is descr
0830: 69 62 65 64 20 62 79 20 61 6e 20 69 6e 73 74 61  ibed by an insta
0840: 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
0850: 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 0a  wing structure..
0860: 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
0870: 74 20 53 71 6c 46 75 6e 63 20 53 71 6c 46 75 6e  t SqlFunc SqlFun
0880: 63 3b 0a 73 74 72 75 63 74 20 53 71 6c 46 75 6e  c;.struct SqlFun
0890: 63 20 7b 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  c {.  Tcl_Interp
08a0: 20 2a 69 6e 74 65 72 70 3b 20 20 20 2f 2a 20 54   *interp;   /* T
08b0: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
08c0: 20 74 6f 20 65 78 65 63 75 74 65 20 74 68 65 20   to execute the 
08d0: 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63  function */.  Tc
08e0: 6c 5f 4f 62 6a 20 2a 70 53 63 72 69 70 74 3b 20  l_Obj *pScript; 
08f0: 20 20 20 20 2f 2a 20 54 68 65 20 54 63 6c 5f 4f      /* The Tcl_O
0900: 62 6a 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  bj representatio
0910: 6e 20 6f 66 20 74 68 65 20 73 63 72 69 70 74 20  n of the script 
0920: 2a 2f 0a 20 20 69 6e 74 20 75 73 65 45 76 61 6c  */.  int useEval
0930: 4f 62 6a 76 3b 20 20 20 20 20 20 2f 2a 20 54 72  Objv;      /* Tr
0940: 75 65 20 69 66 20 69 74 20 69 73 20 73 61 66 65  ue if it is safe
0950: 20 74 6f 20 75 73 65 20 54 63 6c 5f 45 76 61 6c   to use Tcl_Eval
0960: 4f 62 6a 76 20 2a 2f 0a 20 20 63 68 61 72 20 2a  Objv */.  char *
0970: 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  zName;          
0980: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 69 73 20  /* Name of this 
0990: 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 53 71  function */.  Sq
09a0: 6c 46 75 6e 63 20 2a 70 4e 65 78 74 3b 20 20 20  lFunc *pNext;   
09b0: 20 20 20 20 2f 2a 20 4e 65 78 74 20 66 75 6e 63      /* Next func
09c0: 74 69 6f 6e 20 6f 6e 20 74 68 65 20 6c 69 73 74  tion on the list
09d0: 20 6f 66 20 74 68 65 6d 20 61 6c 6c 20 2a 2f 0a   of them all */.
09e0: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4e 65 77 20 63 6f  };../*.** New co
09f0: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
0a00: 73 20 66 75 6e 63 74 69 6f 6e 20 63 61 6e 20 62  s function can b
0a10: 65 20 63 72 65 61 74 65 64 20 61 73 20 54 43 4c  e created as TCL
0a20: 20 73 63 72 69 70 74 73 2e 20 20 45 61 63 68 20   scripts.  Each 
0a30: 73 75 63 68 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  such.** function
0a40: 20 69 73 20 64 65 73 63 72 69 62 65 64 20 62 79   is described by
0a50: 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   an instance of 
0a60: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
0a70: 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 74 79 70 65  ructure..*/.type
0a80: 64 65 66 20 73 74 72 75 63 74 20 53 71 6c 43 6f  def struct SqlCo
0a90: 6c 6c 61 74 65 20 53 71 6c 43 6f 6c 6c 61 74 65  llate SqlCollate
0aa0: 3b 0a 73 74 72 75 63 74 20 53 71 6c 43 6f 6c 6c  ;.struct SqlColl
0ab0: 61 74 65 20 7b 0a 20 20 54 63 6c 5f 49 6e 74 65  ate {.  Tcl_Inte
0ac0: 72 70 20 2a 69 6e 74 65 72 70 3b 20 20 20 2f 2a  rp *interp;   /*
0ad0: 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
0ae0: 65 74 20 74 6f 20 65 78 65 63 75 74 65 20 74 68  et to execute th
0af0: 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  e function */.  
0b00: 63 68 61 72 20 2a 7a 53 63 72 69 70 74 3b 20 20  char *zScript;  
0b10: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 63 72        /* The scr
0b20: 69 70 74 20 74 6f 20 62 65 20 72 75 6e 20 2a 2f  ipt to be run */
0b30: 0a 20 20 53 71 6c 43 6f 6c 6c 61 74 65 20 2a 70  .  SqlCollate *p
0b40: 4e 65 78 74 3b 20 20 20 20 2f 2a 20 4e 65 78 74  Next;    /* Next
0b50: 20 66 75 6e 63 74 69 6f 6e 20 6f 6e 20 74 68 65   function on the
0b60: 20 6c 69 73 74 20 6f 66 20 74 68 65 6d 20 61 6c   list of them al
0b70: 6c 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 50  l */.};../*.** P
0b80: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
0b90: 74 73 20 61 72 65 20 63 61 63 68 65 64 20 66 6f  ts are cached fo
0ba0: 72 20 66 61 73 74 65 72 20 65 78 65 63 75 74 69  r faster executi
0bb0: 6f 6e 2e 20 20 45 61 63 68 20 70 72 65 70 61 72  on.  Each prepar
0bc0: 65 64 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20  ed.** statement 
0bd0: 69 73 20 64 65 73 63 72 69 62 65 64 20 62 79 20  is described by 
0be0: 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  an instance of t
0bf0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  he following str
0c00: 75 63 74 75 72 65 2e 0a 2a 2f 0a 74 79 70 65 64  ucture..*/.typed
0c10: 65 66 20 73 74 72 75 63 74 20 53 71 6c 50 72 65  ef struct SqlPre
0c20: 70 61 72 65 64 53 74 6d 74 20 53 71 6c 50 72 65  paredStmt SqlPre
0c30: 70 61 72 65 64 53 74 6d 74 3b 0a 73 74 72 75 63  paredStmt;.struc
0c40: 74 20 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d  t SqlPreparedStm
0c50: 74 20 7b 0a 20 20 53 71 6c 50 72 65 70 61 72 65  t {.  SqlPrepare
0c60: 64 53 74 6d 74 20 2a 70 4e 65 78 74 3b 20 20 2f  dStmt *pNext;  /
0c70: 2a 20 4e 65 78 74 20 69 6e 20 6c 69 6e 6b 65 64  * Next in linked
0c80: 20 6c 69 73 74 20 2a 2f 0a 20 20 53 71 6c 50 72   list */.  SqlPr
0c90: 65 70 61 72 65 64 53 74 6d 74 20 2a 70 50 72 65  eparedStmt *pPre
0ca0: 76 3b 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20  v;  /* Previous 
0cb0: 6f 6e 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a 20  on the list */. 
0cc0: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
0cd0: 53 74 6d 74 3b 20 20 20 20 20 2f 2a 20 54 68 65  Stmt;     /* The
0ce0: 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
0cf0: 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 71  ent */.  int nSq
0d00: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
0d10: 20 20 2f 2a 20 63 68 61 72 73 20 69 6e 20 7a 53    /* chars in zS
0d20: 71 6c 5b 5d 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ql[] */.  const 
0d30: 63 68 61 72 20 2a 7a 53 71 6c 3b 20 20 20 20 20  char *zSql;     
0d40: 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 74 68     /* Text of th
0d50: 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  e SQL statement 
0d60: 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 72 6d 3b 20  */.  int nParm; 
0d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
0d80: 20 53 69 7a 65 20 6f 66 20 61 70 50 61 72 6d 20   Size of apParm 
0d90: 61 72 72 61 79 20 2a 2f 0a 20 20 54 63 6c 5f 4f  array */.  Tcl_O
0da0: 62 6a 20 2a 2a 61 70 50 61 72 6d 3b 20 20 20 20  bj **apParm;    
0db0: 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
0dc0: 72 65 66 65 72 65 6e 63 65 64 20 6f 62 6a 65 63  referenced objec
0dd0: 74 20 70 6f 69 6e 74 65 72 73 20 2a 2f 0a 7d 3b  t pointers */.};
0de0: 0a 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  ..typedef struct
0df0: 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c   IncrblobChannel
0e00: 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c   IncrblobChannel
0e10: 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 72 65 20 69  ;../*.** There i
0e20: 73 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f  s one instance o
0e30: 66 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  f this structure
0e40: 20 66 6f 72 20 65 61 63 68 20 53 51 4c 69 74 65   for each SQLite
0e50: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 74 68 61   database.** tha
0e60: 74 20 68 61 73 20 62 65 65 6e 20 6f 70 65 6e 65  t has been opene
0e70: 64 20 62 79 20 74 68 65 20 53 51 4c 69 74 65 20  d by the SQLite 
0e80: 54 43 4c 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a  TCL interface..*
0e90: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
0ea0: 20 53 71 6c 69 74 65 44 62 20 53 71 6c 69 74 65   SqliteDb Sqlite
0eb0: 44 62 3b 0a 73 74 72 75 63 74 20 53 71 6c 69 74  Db;.struct Sqlit
0ec0: 65 44 62 20 7b 0a 20 20 73 71 6c 69 74 65 33 20  eDb {.  sqlite3 
0ed0: 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  *db;            
0ee0: 20 20 20 2f 2a 20 54 68 65 20 22 72 65 61 6c 22     /* The "real"
0ef0: 20 64 61 74 61 62 61 73 65 20 73 74 72 75 63 74   database struct
0f00: 75 72 65 2e 20 4d 55 53 54 20 42 45 20 46 49 52  ure. MUST BE FIR
0f10: 53 54 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65  ST */.  Tcl_Inte
0f20: 72 70 20 2a 69 6e 74 65 72 70 3b 20 20 20 20 20  rp *interp;     
0f30: 20 20 20 2f 2a 20 54 68 65 20 69 6e 74 65 72 70     /* The interp
0f40: 72 65 74 65 72 20 75 73 65 64 20 66 6f 72 20 74  reter used for t
0f50: 68 69 73 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  his database */.
0f60: 20 20 63 68 61 72 20 2a 7a 42 75 73 79 3b 20 20    char *zBusy;  
0f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
0f80: 54 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63  The busy callbac
0f90: 6b 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 63  k routine */.  c
0fa0: 68 61 72 20 2a 7a 43 6f 6d 6d 69 74 3b 20 20 20  har *zCommit;   
0fb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
0fc0: 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20 63 61 6c   commit hook cal
0fd0: 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 20 2a 2f  lback routine */
0fe0: 0a 20 20 63 68 61 72 20 2a 7a 54 72 61 63 65 3b  .  char *zTrace;
0ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1000: 20 54 68 65 20 74 72 61 63 65 20 63 61 6c 6c 62   The trace callb
1010: 61 63 6b 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 20  ack routine */. 
1020: 20 63 68 61 72 20 2a 7a 50 72 6f 66 69 6c 65 3b   char *zProfile;
1030: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1040: 68 65 20 70 72 6f 66 69 6c 65 20 63 61 6c 6c 62  he profile callb
1050: 61 63 6b 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 20  ack routine */. 
1060: 20 63 68 61 72 20 2a 7a 50 72 6f 67 72 65 73 73   char *zProgress
1070: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ;           /* T
1080: 68 65 20 70 72 6f 67 72 65 73 73 20 63 61 6c 6c  he progress call
1090: 62 61 63 6b 20 72 6f 75 74 69 6e 65 20 2a 2f 0a  back routine */.
10a0: 20 20 63 68 61 72 20 2a 7a 41 75 74 68 3b 20 20    char *zAuth;  
10b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10c0: 54 68 65 20 61 75 74 68 6f 72 69 7a 61 74 69 6f  The authorizatio
10d0: 6e 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69  n callback routi
10e0: 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 64 69 73 61  ne */.  int disa
10f0: 62 6c 65 41 75 74 68 3b 20 20 20 20 20 20 20 20  bleAuth;        
1100: 20 20 20 2f 2a 20 44 69 73 61 62 6c 65 20 74 68     /* Disable th
1110: 65 20 61 75 74 68 6f 72 69 7a 65 72 20 69 66 20  e authorizer if 
1120: 69 74 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 63  it exists */.  c
1130: 68 61 72 20 2a 7a 4e 75 6c 6c 3b 20 20 20 20 20  har *zNull;     
1140: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78            /* Tex
1150: 74 20 74 6f 20 73 75 62 73 74 69 74 75 74 65 20  t to substitute 
1160: 66 6f 72 20 61 6e 20 53 51 4c 20 4e 55 4c 4c 20  for an SQL NULL 
1170: 76 61 6c 75 65 20 2a 2f 0a 20 20 53 71 6c 46 75  value */.  SqlFu
1180: 6e 63 20 2a 70 46 75 6e 63 3b 20 20 20 20 20 20  nc *pFunc;      
1190: 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
11a0: 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 73 20 2a   SQL functions *
11b0: 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 55 70  /.  Tcl_Obj *pUp
11c0: 64 61 74 65 48 6f 6f 6b 3b 20 20 20 20 20 20 2f  dateHook;      /
11d0: 2a 20 55 70 64 61 74 65 20 68 6f 6f 6b 20 73 63  * Update hook sc
11e0: 72 69 70 74 20 28 69 66 20 61 6e 79 29 20 2a 2f  ript (if any) */
11f0: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 6f 6c  .  Tcl_Obj *pRol
1200: 6c 62 61 63 6b 48 6f 6f 6b 3b 20 20 20 20 2f 2a  lbackHook;    /*
1210: 20 52 6f 6c 6c 62 61 63 6b 20 68 6f 6f 6b 20 73   Rollback hook s
1220: 63 72 69 70 74 20 28 69 66 20 61 6e 79 29 20 2a  cript (if any) *
1230: 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 57 61  /.  Tcl_Obj *pWa
1240: 6c 48 6f 6f 6b 3b 20 20 20 20 20 20 20 20 20 2f  lHook;         /
1250: 2a 20 57 41 4c 20 68 6f 6f 6b 20 73 63 72 69 70  * WAL hook scrip
1260: 74 20 28 69 66 20 61 6e 79 29 20 2a 2f 0a 20 20  t (if any) */.  
1270: 54 63 6c 5f 4f 62 6a 20 2a 70 55 6e 6c 6f 63 6b  Tcl_Obj *pUnlock
1280: 4e 6f 74 69 66 79 3b 20 20 20 20 2f 2a 20 55 6e  Notify;    /* Un
1290: 6c 6f 63 6b 20 6e 6f 74 69 66 79 20 73 63 72 69  lock notify scri
12a0: 70 74 20 28 69 66 20 61 6e 79 29 20 2a 2f 0a 20  pt (if any) */. 
12b0: 20 53 71 6c 43 6f 6c 6c 61 74 65 20 2a 70 43 6f   SqlCollate *pCo
12c0: 6c 6c 61 74 65 3b 20 20 20 20 20 20 2f 2a 20 4c  llate;      /* L
12d0: 69 73 74 20 6f 66 20 53 51 4c 20 63 6f 6c 6c 61  ist of SQL colla
12e0: 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 73 20 2a  tion functions *
12f0: 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
1300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1310: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 6f 66  * Return code of
1320: 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 73 71 6c   most recent sql
1330: 69 74 65 33 5f 65 78 65 63 28 29 20 2a 2f 0a 20  ite3_exec() */. 
1340: 20 54 63 6c 5f 4f 62 6a 20 2a 70 43 6f 6c 6c 61   Tcl_Obj *pColla
1350: 74 65 4e 65 65 64 65 64 3b 20 20 20 2f 2a 20 43  teNeeded;   /* C
1360: 6f 6c 6c 61 74 69 6f 6e 20 6e 65 65 64 65 64 20  ollation needed 
1370: 73 63 72 69 70 74 20 2a 2f 0a 20 20 53 71 6c 50  script */.  SqlP
1380: 72 65 70 61 72 65 64 53 74 6d 74 20 2a 73 74 6d  reparedStmt *stm
1390: 74 4c 69 73 74 3b 20 2f 2a 20 4c 69 73 74 20 6f  tList; /* List o
13a0: 66 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  f prepared state
13b0: 6d 65 6e 74 73 2a 2f 0a 20 20 53 71 6c 50 72 65  ments*/.  SqlPre
13c0: 70 61 72 65 64 53 74 6d 74 20 2a 73 74 6d 74 4c  paredStmt *stmtL
13d0: 61 73 74 3b 20 2f 2a 20 4c 61 73 74 20 73 74 61  ast; /* Last sta
13e0: 74 65 6d 65 6e 74 20 69 6e 20 74 68 65 20 6c 69  tement in the li
13f0: 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6d 61 78 53  st */.  int maxS
1400: 74 6d 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  tmt;            
1410: 20 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 6d     /* The next m
1420: 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  aximum number of
1430: 20 73 74 6d 74 4c 69 73 74 20 2a 2f 0a 20 20 69   stmtList */.  i
1440: 6e 74 20 6e 53 74 6d 74 3b 20 20 20 20 20 20 20  nt nStmt;       
1450: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1460: 62 65 72 20 6f 66 20 73 74 61 74 65 6d 65 6e 74  ber of statement
1470: 73 20 69 6e 20 73 74 6d 74 4c 69 73 74 20 2a 2f  s in stmtList */
1480: 0a 20 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e  .  IncrblobChann
1490: 65 6c 20 2a 70 49 6e 63 72 62 6c 6f 62 3b 2f 2a  el *pIncrblob;/*
14a0: 20 4c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20   Linked list of 
14b0: 6f 70 65 6e 20 69 6e 63 72 62 6c 6f 62 20 63 68  open incrblob ch
14c0: 61 6e 6e 65 6c 73 20 2a 2f 0a 20 20 69 6e 74 20  annels */.  int 
14d0: 6e 53 74 65 70 2c 20 6e 53 6f 72 74 2c 20 6e 49  nStep, nSort, nI
14e0: 6e 64 65 78 3b 20 20 2f 2a 20 53 74 61 74 69 73  ndex;  /* Statis
14f0: 74 69 63 73 20 66 6f 72 20 6d 6f 73 74 20 72 65  tics for most re
1500: 63 65 6e 74 20 6f 70 65 72 61 74 69 6f 6e 20 2a  cent operation *
1510: 2f 0a 20 20 69 6e 74 20 6e 54 72 61 6e 73 61 63  /.  int nTransac
1520: 74 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 2f  tion;          /
1530: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6e 65 73 74  * Number of nest
1540: 65 64 20 5b 74 72 61 6e 73 61 63 74 69 6f 6e 5d  ed [transaction]
1550: 20 6d 65 74 68 6f 64 73 20 2a 2f 0a 7d 3b 0a 0a   methods */.};..
1560: 73 74 72 75 63 74 20 49 6e 63 72 62 6c 6f 62 43  struct IncrblobC
1570: 68 61 6e 6e 65 6c 20 7b 0a 20 20 73 71 6c 69 74  hannel {.  sqlit
1580: 65 33 5f 62 6c 6f 62 20 2a 70 42 6c 6f 62 3b 20  e3_blob *pBlob; 
1590: 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 20       /* sqlite3 
15a0: 62 6c 6f 62 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  blob handle */. 
15b0: 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 3b 20   SqliteDb *pDb; 
15c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73             /* As
15d0: 73 6f 63 69 61 74 65 64 20 64 61 74 61 62 61 73  sociated databas
15e0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
15f0: 20 20 69 6e 74 20 69 53 65 65 6b 3b 20 20 20 20    int iSeek;    
1600: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
1610: 75 72 72 65 6e 74 20 73 65 65 6b 20 6f 66 66 73  urrent seek offs
1620: 65 74 20 2a 2f 0a 20 20 54 63 6c 5f 43 68 61 6e  et */.  Tcl_Chan
1630: 6e 65 6c 20 63 68 61 6e 6e 65 6c 3b 20 20 20 20  nel channel;    
1640: 20 20 2f 2a 20 43 68 61 6e 6e 65 6c 20 69 64 65    /* Channel ide
1650: 6e 74 69 66 69 65 72 20 2a 2f 0a 20 20 49 6e 63  ntifier */.  Inc
1660: 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 70 4e  rblobChannel *pN
1670: 65 78 74 3b 20 20 20 2f 2a 20 4c 69 6e 6b 65 64  ext;   /* Linked
1680: 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 6f 70 65   list of all ope
1690: 6e 20 69 6e 63 72 62 6c 6f 62 20 63 68 61 6e 6e  n incrblob chann
16a0: 65 6c 73 20 2a 2f 0a 20 20 49 6e 63 72 62 6c 6f  els */.  Incrblo
16b0: 62 43 68 61 6e 6e 65 6c 20 2a 70 50 72 65 76 3b  bChannel *pPrev;
16c0: 20 20 20 2f 2a 20 4c 69 6e 6b 65 64 20 6c 69 73     /* Linked lis
16d0: 74 20 6f 66 20 61 6c 6c 20 6f 70 65 6e 20 69 6e  t of all open in
16e0: 63 72 62 6c 6f 62 20 63 68 61 6e 6e 65 6c 73 20  crblob channels 
16f0: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  */.};../*.** Com
1700: 70 75 74 65 20 61 20 73 74 72 69 6e 67 20 6c 65  pute a string le
1710: 6e 67 74 68 20 74 68 61 74 20 69 73 20 6c 69 6d  ngth that is lim
1720: 69 74 65 64 20 74 6f 20 77 68 61 74 20 63 61 6e  ited to what can
1730: 20 62 65 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a   be stored in.**
1740: 20 6c 6f 77 65 72 20 33 30 20 62 69 74 73 20 6f   lower 30 bits o
1750: 66 20 61 20 33 32 2d 62 69 74 20 73 69 67 6e 65  f a 32-bit signe
1760: 64 20 69 6e 74 65 67 65 72 2e 0a 2a 2f 0a 73 74  d integer..*/.st
1770: 61 74 69 63 20 69 6e 74 20 73 74 72 6c 65 6e 33  atic int strlen3
1780: 30 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29  0(const char *z)
1790: 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
17a0: 7a 32 20 3d 20 7a 3b 0a 20 20 77 68 69 6c 65 28  z2 = z;.  while(
17b0: 20 2a 7a 32 20 29 7b 20 7a 32 2b 2b 3b 20 7d 0a   *z2 ){ z2++; }.
17c0: 20 20 72 65 74 75 72 6e 20 30 78 33 66 66 66 66    return 0x3ffff
17d0: 66 66 66 20 26 20 28 69 6e 74 29 28 7a 32 20 2d  fff & (int)(z2 -
17e0: 20 7a 29 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66   z);.}...#ifndef
17f0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43   SQLITE_OMIT_INC
1800: 52 42 4c 4f 42 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  RBLOB./*.** Clos
1810: 65 20 61 6c 6c 20 69 6e 63 72 62 6c 6f 62 20 63  e all incrblob c
1820: 68 61 6e 6e 65 6c 73 20 6f 70 65 6e 65 64 20 75  hannels opened u
1830: 73 69 6e 67 20 64 61 74 61 62 61 73 65 20 63 6f  sing database co
1840: 6e 6e 65 63 74 69 6f 6e 20 70 44 62 2e 0a 2a 2a  nnection pDb..**
1850: 20 54 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20   This is called 
1860: 77 68 65 6e 20 73 68 75 74 74 69 6e 67 20 64 6f  when shutting do
1870: 77 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  wn the database 
1880: 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  connection..*/.s
1890: 74 61 74 69 63 20 76 6f 69 64 20 63 6c 6f 73 65  tatic void close
18a0: 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 73  IncrblobChannels
18b0: 28 53 71 6c 69 74 65 44 62 20 2a 70 44 62 29 7b  (SqliteDb *pDb){
18c0: 0a 20 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e  .  IncrblobChann
18d0: 65 6c 20 2a 70 3b 0a 20 20 49 6e 63 72 62 6c 6f  el *p;.  Incrblo
18e0: 62 43 68 61 6e 6e 65 6c 20 2a 70 4e 65 78 74 3b  bChannel *pNext;
18f0: 0a 0a 20 20 66 6f 72 28 70 3d 70 44 62 2d 3e 70  ..  for(p=pDb->p
1900: 49 6e 63 72 62 6c 6f 62 3b 20 70 3b 20 70 3d 70  Incrblob; p; p=p
1910: 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74  Next){.    pNext
1920: 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 0a 20 20   = p->pNext;..  
1930: 20 20 2f 2a 20 4e 6f 74 65 3a 20 43 61 6c 6c 69    /* Note: Calli
1940: 6e 67 20 75 6e 72 65 67 69 73 74 65 72 20 68 65  ng unregister he
1950: 72 65 20 63 61 6c 6c 20 54 63 6c 5f 43 6c 6f 73  re call Tcl_Clos
1960: 65 20 6f 6e 20 74 68 65 20 69 6e 63 72 62 6c 6f  e on the incrblo
1970: 62 20 63 68 61 6e 6e 65 6c 2c 20 0a 20 20 20 20  b channel, .    
1980: 2a 2a 20 77 68 69 63 68 20 64 65 6c 65 74 65 73  ** which deletes
1990: 20 74 68 65 20 49 6e 63 72 62 6c 6f 62 43 68 61   the IncrblobCha
19a0: 6e 6e 65 6c 20 73 74 72 75 63 74 75 72 65 20 61  nnel structure a
19b0: 74 20 2a 70 2e 20 53 6f 20 64 6f 20 6e 6f 74 0a  t *p. So do not.
19c0: 20 20 20 20 2a 2a 20 63 61 6c 6c 20 54 63 6c 5f      ** call Tcl_
19d0: 46 72 65 65 28 29 20 68 65 72 65 2e 0a 20 20 20  Free() here..   
19e0: 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 55 6e 72 65   */.    Tcl_Unre
19f0: 67 69 73 74 65 72 43 68 61 6e 6e 65 6c 28 70 44  gisterChannel(pD
1a00: 62 2d 3e 69 6e 74 65 72 70 2c 20 70 2d 3e 63 68  b->interp, p->ch
1a10: 61 6e 6e 65 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  annel);.  }.}../
1a20: 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 69 6e  *.** Close an in
1a30: 63 72 65 6d 65 6e 74 61 6c 20 62 6c 6f 62 20 63  cremental blob c
1a40: 68 61 6e 6e 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69  hannel..*/.stati
1a50: 63 20 69 6e 74 20 69 6e 63 72 62 6c 6f 62 43 6c  c int incrblobCl
1a60: 6f 73 65 28 43 6c 69 65 6e 74 44 61 74 61 20 69  ose(ClientData i
1a70: 6e 73 74 61 6e 63 65 44 61 74 61 2c 20 54 63 6c  nstanceData, Tcl
1a80: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29  _Interp *interp)
1a90: 7b 0a 20 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e  {.  IncrblobChan
1aa0: 6e 65 6c 20 2a 70 20 3d 20 28 49 6e 63 72 62 6c  nel *p = (Incrbl
1ab0: 6f 62 43 68 61 6e 6e 65 6c 20 2a 29 69 6e 73 74  obChannel *)inst
1ac0: 61 6e 63 65 44 61 74 61 3b 0a 20 20 69 6e 74 20  anceData;.  int 
1ad0: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f  rc = sqlite3_blo
1ae0: 62 5f 63 6c 6f 73 65 28 70 2d 3e 70 42 6c 6f 62  b_close(p->pBlob
1af0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  );.  sqlite3 *db
1b00: 20 3d 20 70 2d 3e 70 44 62 2d 3e 64 62 3b 0a 0a   = p->pDb->db;..
1b10: 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20    /* Remove the 
1b20: 63 68 61 6e 6e 65 6c 20 66 72 6f 6d 20 74 68 65  channel from the
1b30: 20 53 71 6c 69 74 65 44 62 2e 70 49 6e 63 72 62   SqliteDb.pIncrb
1b40: 6c 6f 62 20 6c 69 73 74 2e 20 2a 2f 0a 20 20 69  lob list. */.  i
1b50: 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20  f( p->pNext ){. 
1b60: 20 20 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72     p->pNext->pPr
1b70: 65 76 20 3d 20 70 2d 3e 70 50 72 65 76 3b 0a 20  ev = p->pPrev;. 
1b80: 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 65   }.  if( p->pPre
1b90: 76 20 29 7b 0a 20 20 20 20 70 2d 3e 70 50 72 65  v ){.    p->pPre
1ba0: 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e  v->pNext = p->pN
1bb0: 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ext;.  }.  if( p
1bc0: 2d 3e 70 44 62 2d 3e 70 49 6e 63 72 62 6c 6f 62  ->pDb->pIncrblob
1bd0: 3d 3d 70 20 29 7b 0a 20 20 20 20 70 2d 3e 70 44  ==p ){.    p->pD
1be0: 62 2d 3e 70 49 6e 63 72 62 6c 6f 62 20 3d 20 70  b->pIncrblob = p
1bf0: 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 0a 20 20  ->pNext;.  }..  
1c00: 2f 2a 20 46 72 65 65 20 74 68 65 20 49 6e 63 72  /* Free the Incr
1c10: 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 73 74 72 75  blobChannel stru
1c20: 63 74 75 72 65 20 2a 2f 0a 20 20 54 63 6c 5f 46  cture */.  Tcl_F
1c30: 72 65 65 28 28 63 68 61 72 20 2a 29 70 29 3b 0a  ree((char *)p);.
1c40: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
1c50: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f  E_OK ){.    Tcl_
1c60: 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
1c70: 2c 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  , (char *)sqlite
1c80: 33 5f 65 72 72 6d 73 67 28 64 62 29 2c 20 54 43  3_errmsg(db), TC
1c90: 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 20  L_VOLATILE);.   
1ca0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1cb0: 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  R;.  }.  return 
1cc0: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
1cd0: 20 52 65 61 64 20 64 61 74 61 20 66 72 6f 6d 20   Read data from 
1ce0: 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 62  an incremental b
1cf0: 6c 6f 62 20 63 68 61 6e 6e 65 6c 2e 0a 2a 2f 0a  lob channel..*/.
1d00: 73 74 61 74 69 63 20 69 6e 74 20 69 6e 63 72 62  static int incrb
1d10: 6c 6f 62 49 6e 70 75 74 28 0a 20 20 43 6c 69 65  lobInput(.  Clie
1d20: 6e 74 44 61 74 61 20 69 6e 73 74 61 6e 63 65 44  ntData instanceD
1d30: 61 74 61 2c 20 0a 20 20 63 68 61 72 20 2a 62 75  ata, .  char *bu
1d40: 66 2c 20 0a 20 20 69 6e 74 20 62 75 66 53 69 7a  f, .  int bufSiz
1d50: 65 2c 0a 20 20 69 6e 74 20 2a 65 72 72 6f 72 43  e,.  int *errorC
1d60: 6f 64 65 50 74 72 0a 29 7b 0a 20 20 49 6e 63 72  odePtr.){.  Incr
1d70: 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 70 20 3d  blobChannel *p =
1d80: 20 28 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65   (IncrblobChanne
1d90: 6c 20 2a 29 69 6e 73 74 61 6e 63 65 44 61 74 61  l *)instanceData
1da0: 3b 0a 20 20 69 6e 74 20 6e 52 65 61 64 20 3d 20  ;.  int nRead = 
1db0: 62 75 66 53 69 7a 65 3b 20 20 20 20 20 20 20 20  bufSize;        
1dc0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
1dd0: 74 65 73 20 74 6f 20 72 65 61 64 20 2a 2f 0a 20  tes to read */. 
1de0: 20 69 6e 74 20 6e 42 6c 6f 62 3b 20 20 20 20 20   int nBlob;     
1df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e00: 20 54 6f 74 61 6c 20 73 69 7a 65 20 6f 66 20 74   Total size of t
1e10: 68 65 20 62 6c 6f 62 20 2a 2f 0a 20 20 69 6e 74  he blob */.  int
1e20: 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
1e30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c            /* sql
1e40: 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 2a  ite error code *
1e50: 2f 0a 0a 20 20 6e 42 6c 6f 62 20 3d 20 73 71 6c  /..  nBlob = sql
1e60: 69 74 65 33 5f 62 6c 6f 62 5f 62 79 74 65 73 28  ite3_blob_bytes(
1e70: 70 2d 3e 70 42 6c 6f 62 29 3b 0a 20 20 69 66 28  p->pBlob);.  if(
1e80: 20 28 70 2d 3e 69 53 65 65 6b 2b 6e 52 65 61 64   (p->iSeek+nRead
1e90: 29 3e 6e 42 6c 6f 62 20 29 7b 0a 20 20 20 20 6e  )>nBlob ){.    n
1ea0: 52 65 61 64 20 3d 20 6e 42 6c 6f 62 2d 70 2d 3e  Read = nBlob-p->
1eb0: 69 53 65 65 6b 3b 0a 20 20 7d 0a 20 20 69 66 28  iSeek;.  }.  if(
1ec0: 20 6e 52 65 61 64 3c 3d 30 20 29 7b 0a 20 20 20   nRead<=0 ){.   
1ed0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a   return 0;.  }..
1ee0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62    rc = sqlite3_b
1ef0: 6c 6f 62 5f 72 65 61 64 28 70 2d 3e 70 42 6c 6f  lob_read(p->pBlo
1f00: 62 2c 20 28 76 6f 69 64 20 2a 29 62 75 66 2c 20  b, (void *)buf, 
1f10: 6e 52 65 61 64 2c 20 70 2d 3e 69 53 65 65 6b 29  nRead, p->iSeek)
1f20: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
1f30: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 65 72  TE_OK ){.    *er
1f40: 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 72 63 3b  rorCodePtr = rc;
1f50: 0a 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a  .    return -1;.
1f60: 20 20 7d 0a 0a 20 20 70 2d 3e 69 53 65 65 6b 20    }..  p->iSeek 
1f70: 2b 3d 20 6e 52 65 61 64 3b 0a 20 20 72 65 74 75  += nRead;.  retu
1f80: 72 6e 20 6e 52 65 61 64 3b 0a 7d 0a 0a 2f 2a 0a  rn nRead;.}../*.
1f90: 2a 2a 20 57 72 69 74 65 20 64 61 74 61 20 74 6f  ** Write data to
1fa0: 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20   an incremental 
1fb0: 62 6c 6f 62 20 63 68 61 6e 6e 65 6c 2e 0a 2a 2f  blob channel..*/
1fc0: 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 63 72  .static int incr
1fd0: 62 6c 6f 62 4f 75 74 70 75 74 28 0a 20 20 43 6c  blobOutput(.  Cl
1fe0: 69 65 6e 74 44 61 74 61 20 69 6e 73 74 61 6e 63  ientData instanc
1ff0: 65 44 61 74 61 2c 20 0a 20 20 43 4f 4e 53 54 20  eData, .  CONST 
2000: 63 68 61 72 20 2a 62 75 66 2c 20 0a 20 20 69 6e  char *buf, .  in
2010: 74 20 74 6f 57 72 69 74 65 2c 0a 20 20 69 6e 74  t toWrite,.  int
2020: 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 0a 29   *errorCodePtr.)
2030: 7b 0a 20 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e  {.  IncrblobChan
2040: 6e 65 6c 20 2a 70 20 3d 20 28 49 6e 63 72 62 6c  nel *p = (Incrbl
2050: 6f 62 43 68 61 6e 6e 65 6c 20 2a 29 69 6e 73 74  obChannel *)inst
2060: 61 6e 63 65 44 61 74 61 3b 0a 20 20 69 6e 74 20  anceData;.  int 
2070: 6e 57 72 69 74 65 20 3d 20 74 6f 57 72 69 74 65  nWrite = toWrite
2080: 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62  ;        /* Numb
2090: 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 77  er of bytes to w
20a0: 72 69 74 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 42  rite */.  int nB
20b0: 6c 6f 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  lob;            
20c0: 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20         /* Total 
20d0: 73 69 7a 65 20 6f 66 20 74 68 65 20 62 6c 6f 62  size of the blob
20e0: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
20f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2100: 20 20 20 2f 2a 20 73 71 6c 69 74 65 20 65 72 72     /* sqlite err
2110: 6f 72 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 6e 42  or code */..  nB
2120: 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c  lob = sqlite3_bl
2130: 6f 62 5f 62 79 74 65 73 28 70 2d 3e 70 42 6c 6f  ob_bytes(p->pBlo
2140: 62 29 3b 0a 20 20 69 66 28 20 28 70 2d 3e 69 53  b);.  if( (p->iS
2150: 65 65 6b 2b 6e 57 72 69 74 65 29 3e 6e 42 6c 6f  eek+nWrite)>nBlo
2160: 62 20 29 7b 0a 20 20 20 20 2a 65 72 72 6f 72 43  b ){.    *errorC
2170: 6f 64 65 50 74 72 20 3d 20 45 49 4e 56 41 4c 3b  odePtr = EINVAL;
2180: 0a 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a  .    return -1;.
2190: 20 20 7d 0a 20 20 69 66 28 20 6e 57 72 69 74 65    }.  if( nWrite
21a0: 3c 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  <=0 ){.    retur
21b0: 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d  n 0;.  }..  rc =
21c0: 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 77 72   sqlite3_blob_wr
21d0: 69 74 65 28 70 2d 3e 70 42 6c 6f 62 2c 20 28 76  ite(p->pBlob, (v
21e0: 6f 69 64 20 2a 29 62 75 66 2c 20 6e 57 72 69 74  oid *)buf, nWrit
21f0: 65 2c 20 70 2d 3e 69 53 65 65 6b 29 3b 0a 20 20  e, p->iSeek);.  
2200: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2210: 4b 20 29 7b 0a 20 20 20 20 2a 65 72 72 6f 72 43  K ){.    *errorC
2220: 6f 64 65 50 74 72 20 3d 20 45 49 4f 3b 0a 20 20  odePtr = EIO;.  
2230: 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d    return -1;.  }
2240: 0a 0a 20 20 70 2d 3e 69 53 65 65 6b 20 2b 3d 20  ..  p->iSeek += 
2250: 6e 57 72 69 74 65 3b 0a 20 20 72 65 74 75 72 6e  nWrite;.  return
2260: 20 6e 57 72 69 74 65 3b 0a 7d 0a 0a 2f 2a 0a 2a   nWrite;.}../*.*
2270: 2a 20 53 65 65 6b 20 61 6e 20 69 6e 63 72 65 6d  * Seek an increm
2280: 65 6e 74 61 6c 20 62 6c 6f 62 20 63 68 61 6e 6e  ental blob chann
2290: 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  el..*/.static in
22a0: 74 20 69 6e 63 72 62 6c 6f 62 53 65 65 6b 28 0a  t incrblobSeek(.
22b0: 20 20 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73    ClientData ins
22c0: 74 61 6e 63 65 44 61 74 61 2c 20 0a 20 20 6c 6f  tanceData, .  lo
22d0: 6e 67 20 6f 66 66 73 65 74 2c 0a 20 20 69 6e 74  ng offset,.  int
22e0: 20 73 65 65 6b 4d 6f 64 65 2c 0a 20 20 69 6e 74   seekMode,.  int
22f0: 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 0a 29   *errorCodePtr.)
2300: 7b 0a 20 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e  {.  IncrblobChan
2310: 6e 65 6c 20 2a 70 20 3d 20 28 49 6e 63 72 62 6c  nel *p = (Incrbl
2320: 6f 62 43 68 61 6e 6e 65 6c 20 2a 29 69 6e 73 74  obChannel *)inst
2330: 61 6e 63 65 44 61 74 61 3b 0a 0a 20 20 73 77 69  anceData;..  swi
2340: 74 63 68 28 20 73 65 65 6b 4d 6f 64 65 20 29 7b  tch( seekMode ){
2350: 0a 20 20 20 20 63 61 73 65 20 53 45 45 4b 5f 53  .    case SEEK_S
2360: 45 54 3a 0a 20 20 20 20 20 20 70 2d 3e 69 53 65  ET:.      p->iSe
2370: 65 6b 20 3d 20 6f 66 66 73 65 74 3b 0a 20 20 20  ek = offset;.   
2380: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
2390: 73 65 20 53 45 45 4b 5f 43 55 52 3a 0a 20 20 20  se SEEK_CUR:.   
23a0: 20 20 20 70 2d 3e 69 53 65 65 6b 20 2b 3d 20 6f     p->iSeek += o
23b0: 66 66 73 65 74 3b 0a 20 20 20 20 20 20 62 72 65  ffset;.      bre
23c0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 45 45  ak;.    case SEE
23d0: 4b 5f 45 4e 44 3a 0a 20 20 20 20 20 20 70 2d 3e  K_END:.      p->
23e0: 69 53 65 65 6b 20 3d 20 73 71 6c 69 74 65 33 5f  iSeek = sqlite3_
23f0: 62 6c 6f 62 5f 62 79 74 65 73 28 70 2d 3e 70 42  blob_bytes(p->pB
2400: 6c 6f 62 29 20 2b 20 6f 66 66 73 65 74 3b 0a 20  lob) + offset;. 
2410: 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20       break;..   
2420: 20 64 65 66 61 75 6c 74 3a 20 61 73 73 65 72 74   default: assert
2430: 28 21 22 42 61 64 20 73 65 65 6b 4d 6f 64 65 22  (!"Bad seekMode"
2440: 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
2450: 20 70 2d 3e 69 53 65 65 6b 3b 0a 7d 0a 0a 0a 73   p->iSeek;.}...s
2460: 74 61 74 69 63 20 76 6f 69 64 20 69 6e 63 72 62  tatic void incrb
2470: 6c 6f 62 57 61 74 63 68 28 43 6c 69 65 6e 74 44  lobWatch(ClientD
2480: 61 74 61 20 69 6e 73 74 61 6e 63 65 44 61 74 61  ata instanceData
2490: 2c 20 69 6e 74 20 6d 6f 64 65 29 7b 20 0a 20 20  , int mode){ .  
24a0: 2f 2a 20 4e 4f 2d 4f 50 20 2a 2f 20 0a 7d 0a 73  /* NO-OP */ .}.s
24b0: 74 61 74 69 63 20 69 6e 74 20 69 6e 63 72 62 6c  tatic int incrbl
24c0: 6f 62 48 61 6e 64 6c 65 28 43 6c 69 65 6e 74 44  obHandle(ClientD
24d0: 61 74 61 20 69 6e 73 74 61 6e 63 65 44 61 74 61  ata instanceData
24e0: 2c 20 69 6e 74 20 64 69 72 2c 20 43 6c 69 65 6e  , int dir, Clien
24f0: 74 44 61 74 61 20 2a 68 50 74 72 29 7b 0a 20 20  tData *hPtr){.  
2500: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
2510: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 54 63 6c 5f  ;.}..static Tcl_
2520: 43 68 61 6e 6e 65 6c 54 79 70 65 20 49 6e 63 72  ChannelType Incr
2530: 62 6c 6f 62 43 68 61 6e 6e 65 6c 54 79 70 65 20  blobChannelType 
2540: 3d 20 7b 0a 20 20 22 69 6e 63 72 62 6c 6f 62 22  = {.  "incrblob"
2550: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2560: 20 20 20 20 20 20 20 20 20 2f 2a 20 74 79 70 65           /* type
2570: 4e 61 6d 65 20 20 20 20 20 20 20 20 20 20 20 20  Name            
2580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2590: 20 2a 2f 0a 20 20 54 43 4c 5f 43 48 41 4e 4e 45   */.  TCL_CHANNE
25a0: 4c 5f 56 45 52 53 49 4f 4e 5f 32 2c 20 20 20 20  L_VERSION_2,    
25b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 76 65 72 73           /* vers
25c0: 69 6f 6e 20 20 20 20 20 20 20 20 20 20 20 20 20  ion             
25d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25e0: 20 2a 2f 0a 20 20 69 6e 63 72 62 6c 6f 62 43 6c   */.  incrblobCl
25f0: 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ose,            
2600: 20 20 20 20 20 20 20 20 20 2f 2a 20 63 6c 6f 73           /* clos
2610: 65 50 72 6f 63 20 20 20 20 20 20 20 20 20 20 20  eProc           
2620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2630: 20 2a 2f 0a 20 20 69 6e 63 72 62 6c 6f 62 49 6e   */.  incrblobIn
2640: 70 75 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  put,            
2650: 20 20 20 20 20 20 20 20 20 2f 2a 20 69 6e 70 75           /* inpu
2660: 74 50 72 6f 63 20 20 20 20 20 20 20 20 20 20 20  tProc           
2670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2680: 20 2a 2f 0a 20 20 69 6e 63 72 62 6c 6f 62 4f 75   */.  incrblobOu
2690: 74 70 75 74 2c 20 20 20 20 20 20 20 20 20 20 20  tput,           
26a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 75 74 70           /* outp
26b0: 75 74 50 72 6f 63 20 20 20 20 20 20 20 20 20 20  utProc          
26c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26d0: 20 2a 2f 0a 20 20 69 6e 63 72 62 6c 6f 62 53 65   */.  incrblobSe
26e0: 65 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ek,             
26f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 73 65 65 6b           /* seek
2700: 50 72 6f 63 20 20 20 20 20 20 20 20 20 20 20 20  Proc            
2710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2720: 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20   */.  0,        
2730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2740: 20 20 20 20 20 20 20 20 20 2f 2a 20 73 65 74 4f           /* setO
2750: 70 74 69 6f 6e 50 72 6f 63 20 20 20 20 20 20 20  ptionProc       
2760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2770: 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20   */.  0,        
2780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2790: 20 20 20 20 20 20 20 20 20 2f 2a 20 67 65 74 4f           /* getO
27a0: 70 74 69 6f 6e 50 72 6f 63 20 20 20 20 20 20 20  ptionProc       
27b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27c0: 20 2a 2f 0a 20 20 69 6e 63 72 62 6c 6f 62 57 61   */.  incrblobWa
27d0: 74 63 68 2c 20 20 20 20 20 20 20 20 20 20 20 20  tch,            
27e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 77 61 74 63           /* watc
27f0: 68 50 72 6f 63 20 28 74 68 69 73 20 69 73 20 61  hProc (this is a
2800: 20 6e 6f 2d 6f 70 29 20 20 20 20 20 20 20 20 20   no-op)         
2810: 20 2a 2f 0a 20 20 69 6e 63 72 62 6c 6f 62 48 61   */.  incrblobHa
2820: 6e 64 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20  ndle,           
2830: 20 20 20 20 20 20 20 20 20 2f 2a 20 67 65 74 48           /* getH
2840: 61 6e 64 6c 65 50 72 6f 63 20 28 61 6c 77 61 79  andleProc (alway
2850: 73 20 72 65 74 75 72 6e 73 20 65 72 72 6f 72 29  s returns error)
2860: 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20   */.  0,        
2870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2880: 20 20 20 20 20 20 20 20 20 2f 2a 20 63 6c 6f 73           /* clos
2890: 65 32 50 72 6f 63 20 20 20 20 20 20 20 20 20 20  e2Proc          
28a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b0: 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20   */.  0,        
28c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 62 6c 6f 63           /* bloc
28e0: 6b 4d 6f 64 65 50 72 6f 63 20 20 20 20 20 20 20  kModeProc       
28f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2900: 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20   */.  0,        
2910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2920: 20 20 20 20 20 20 20 20 20 2f 2a 20 66 6c 75 73           /* flus
2930: 68 50 72 6f 63 20 20 20 20 20 20 20 20 20 20 20  hProc           
2940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2950: 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20   */.  0,        
2960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2970: 20 20 20 20 20 20 20 20 20 2f 2a 20 68 61 6e 64           /* hand
2980: 6c 65 72 50 72 6f 63 20 20 20 20 20 20 20 20 20  lerProc         
2990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29a0: 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20   */.  0,        
29b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 77 69 64 65           /* wide
29d0: 53 65 65 6b 50 72 6f 63 20 20 20 20 20 20 20 20  SeekProc        
29e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29f0: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 72   */.};../*.** Cr
2a00: 65 61 74 65 20 61 20 6e 65 77 20 69 6e 63 72 62  eate a new incrb
2a10: 6c 6f 62 20 63 68 61 6e 6e 65 6c 2e 0a 2a 2f 0a  lob channel..*/.
2a20: 73 74 61 74 69 63 20 69 6e 74 20 63 72 65 61 74  static int creat
2a30: 65 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c  eIncrblobChannel
2a40: 28 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  (.  Tcl_Interp *
2a50: 69 6e 74 65 72 70 2c 20 0a 20 20 53 71 6c 69 74  interp, .  Sqlit
2a60: 65 44 62 20 2a 70 44 62 2c 20 0a 20 20 63 6f 6e  eDb *pDb, .  con
2a70: 73 74 20 63 68 61 72 20 2a 7a 44 62 2c 0a 20 20  st char *zDb,.  
2a80: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62  const char *zTab
2a90: 6c 65 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61  le, .  const cha
2aa0: 72 20 2a 7a 43 6f 6c 75 6d 6e 2c 20 0a 20 20 73  r *zColumn, .  s
2ab0: 71 6c 69 74 65 5f 69 6e 74 36 34 20 69 52 6f 77  qlite_int64 iRow
2ac0: 2c 0a 20 20 69 6e 74 20 69 73 52 65 61 64 6f 6e  ,.  int isReadon
2ad0: 6c 79 0a 29 7b 0a 20 20 49 6e 63 72 62 6c 6f 62  ly.){.  Incrblob
2ae0: 43 68 61 6e 6e 65 6c 20 2a 70 3b 0a 20 20 73 71  Channel *p;.  sq
2af0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 44 62 2d  lite3 *db = pDb-
2b00: 3e 64 62 3b 0a 20 20 73 71 6c 69 74 65 33 5f 62  >db;.  sqlite3_b
2b10: 6c 6f 62 20 2a 70 42 6c 6f 62 3b 0a 20 20 69 6e  lob *pBlob;.  in
2b20: 74 20 72 63 3b 0a 20 20 69 6e 74 20 66 6c 61 67  t rc;.  int flag
2b30: 73 20 3d 20 54 43 4c 5f 52 45 41 44 41 42 4c 45  s = TCL_READABLE
2b40: 7c 28 69 73 52 65 61 64 6f 6e 6c 79 20 3f 20 30  |(isReadonly ? 0
2b50: 20 3a 20 54 43 4c 5f 57 52 49 54 41 42 4c 45 29   : TCL_WRITABLE)
2b60: 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 76 61 72  ;..  /* This var
2b70: 69 61 62 6c 65 20 69 73 20 75 73 65 64 20 74 6f  iable is used to
2b80: 20 6e 61 6d 65 20 74 68 65 20 63 68 61 6e 6e 65   name the channe
2b90: 6c 73 3a 20 22 69 6e 63 72 62 6c 6f 62 5f 5b 69  ls: "incrblob_[i
2ba0: 6e 63 72 20 63 6f 75 6e 74 5d 22 20 2a 2f 0a 20  ncr count]" */. 
2bb0: 20 73 74 61 74 69 63 20 69 6e 74 20 63 6f 75 6e   static int coun
2bc0: 74 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a 43  t = 0;.  char zC
2bd0: 68 61 6e 6e 65 6c 5b 36 34 5d 3b 0a 0a 20 20 72  hannel[64];..  r
2be0: 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62  c = sqlite3_blob
2bf0: 5f 6f 70 65 6e 28 64 62 2c 20 7a 44 62 2c 20 7a  _open(db, zDb, z
2c00: 54 61 62 6c 65 2c 20 7a 43 6f 6c 75 6d 6e 2c 20  Table, zColumn, 
2c10: 69 52 6f 77 2c 20 21 69 73 52 65 61 64 6f 6e 6c  iRow, !isReadonl
2c20: 79 2c 20 26 70 42 6c 6f 62 29 3b 0a 20 20 69 66  y, &pBlob);.  if
2c30: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2c40: 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65  ){.    Tcl_SetRe
2c50: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68  sult(interp, (ch
2c60: 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 65 72 72  ar *)sqlite3_err
2c70: 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c 20 54 43  msg(pDb->db), TC
2c80: 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 20  L_VOLATILE);.   
2c90: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
2ca0: 52 3b 0a 20 20 7d 0a 0a 20 20 70 20 3d 20 28 49  R;.  }..  p = (I
2cb0: 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a  ncrblobChannel *
2cc0: 29 54 63 6c 5f 41 6c 6c 6f 63 28 73 69 7a 65 6f  )Tcl_Alloc(sizeo
2cd0: 66 28 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65  f(IncrblobChanne
2ce0: 6c 29 29 3b 0a 20 20 70 2d 3e 69 53 65 65 6b 20  l));.  p->iSeek 
2cf0: 3d 20 30 3b 0a 20 20 70 2d 3e 70 42 6c 6f 62 20  = 0;.  p->pBlob 
2d00: 3d 20 70 42 6c 6f 62 3b 0a 0a 20 20 73 71 6c 69  = pBlob;..  sqli
2d10: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
2d20: 65 6f 66 28 7a 43 68 61 6e 6e 65 6c 29 2c 20 7a  eof(zChannel), z
2d30: 43 68 61 6e 6e 65 6c 2c 20 22 69 6e 63 72 62 6c  Channel, "incrbl
2d40: 6f 62 5f 25 64 22 2c 20 2b 2b 63 6f 75 6e 74 29  ob_%d", ++count)
2d50: 3b 0a 20 20 70 2d 3e 63 68 61 6e 6e 65 6c 20 3d  ;.  p->channel =
2d60: 20 54 63 6c 5f 43 72 65 61 74 65 43 68 61 6e 6e   Tcl_CreateChann
2d70: 65 6c 28 26 49 6e 63 72 62 6c 6f 62 43 68 61 6e  el(&IncrblobChan
2d80: 6e 65 6c 54 79 70 65 2c 20 7a 43 68 61 6e 6e 65  nelType, zChanne
2d90: 6c 2c 20 70 2c 20 66 6c 61 67 73 29 3b 0a 20 20  l, p, flags);.  
2da0: 54 63 6c 5f 52 65 67 69 73 74 65 72 43 68 61 6e  Tcl_RegisterChan
2db0: 6e 65 6c 28 69 6e 74 65 72 70 2c 20 70 2d 3e 63  nel(interp, p->c
2dc0: 68 61 6e 6e 65 6c 29 3b 0a 0a 20 20 2f 2a 20 4c  hannel);..  /* L
2dd0: 69 6e 6b 20 74 68 65 20 6e 65 77 20 63 68 61 6e  ink the new chan
2de0: 6e 65 6c 20 69 6e 74 6f 20 74 68 65 20 53 71 6c  nel into the Sql
2df0: 69 74 65 44 62 2e 70 49 6e 63 72 62 6c 6f 62 20  iteDb.pIncrblob 
2e00: 6c 69 73 74 2e 20 2a 2f 0a 20 20 70 2d 3e 70 4e  list. */.  p->pN
2e10: 65 78 74 20 3d 20 70 44 62 2d 3e 70 49 6e 63 72  ext = pDb->pIncr
2e20: 62 6c 6f 62 3b 0a 20 20 70 2d 3e 70 50 72 65 76  blob;.  p->pPrev
2e30: 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 70   = 0;.  if( p->p
2e40: 4e 65 78 74 20 29 7b 0a 20 20 20 20 70 2d 3e 70  Next ){.    p->p
2e50: 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 3b  Next->pPrev = p;
2e60: 0a 20 20 7d 0a 20 20 70 44 62 2d 3e 70 49 6e 63  .  }.  pDb->pInc
2e70: 72 62 6c 6f 62 20 3d 20 70 3b 0a 20 20 70 2d 3e  rblob = p;.  p->
2e80: 70 44 62 20 3d 20 70 44 62 3b 0a 0a 20 20 54 63  pDb = pDb;..  Tc
2e90: 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
2ea0: 72 70 2c 20 28 63 68 61 72 20 2a 29 54 63 6c 5f  rp, (char *)Tcl_
2eb0: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 70  GetChannelName(p
2ec0: 2d 3e 63 68 61 6e 6e 65 6c 29 2c 20 54 43 4c 5f  ->channel), TCL_
2ed0: 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 72 65 74  VOLATILE);.  ret
2ee0: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65  urn TCL_OK;.}.#e
2ef0: 6c 73 65 20 20 2f 2a 20 65 6c 73 65 20 63 6c 61  lse  /* else cla
2f00: 75 73 65 20 66 6f 72 20 22 23 69 66 6e 64 65 66  use for "#ifndef
2f10: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43   SQLITE_OMIT_INC
2f20: 52 42 4c 4f 42 22 20 2a 2f 0a 20 20 23 64 65 66  RBLOB" */.  #def
2f30: 69 6e 65 20 63 6c 6f 73 65 49 6e 63 72 62 6c 6f  ine closeIncrblo
2f40: 62 43 68 61 6e 6e 65 6c 73 28 70 44 62 29 0a 23  bChannels(pDb).#
2f50: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 6f  endif../*.** Loo
2f60: 6b 20 61 74 20 74 68 65 20 73 63 72 69 70 74 20  k at the script 
2f70: 70 72 65 66 69 78 20 69 6e 20 70 43 6d 64 2e 20  prefix in pCmd. 
2f80: 20 57 65 20 77 69 6c 6c 20 62 65 20 65 78 65 63   We will be exec
2f90: 75 74 69 6e 67 20 74 68 69 73 20 73 63 72 69 70  uting this scrip
2fa0: 74 0a 2a 2a 20 61 66 74 65 72 20 66 69 72 73 74  t.** after first
2fb0: 20 61 70 70 65 6e 64 69 6e 67 20 6f 6e 65 20 6f   appending one o
2fc0: 72 20 6d 6f 72 65 20 61 72 67 75 6d 65 6e 74 73  r more arguments
2fd0: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
2fe0: 61 6e 61 6c 79 7a 65 73 0a 2a 2a 20 74 68 65 20  analyzes.** the 
2ff0: 73 63 72 69 70 74 20 74 6f 20 73 65 65 20 69 66  script to see if
3000: 20 69 74 20 69 73 20 73 61 66 65 20 74 6f 20 75   it is safe to u
3010: 73 65 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 76 28  se Tcl_EvalObjv(
3020: 29 20 6f 6e 20 74 68 65 20 73 63 72 69 70 74 0a  ) on the script.
3030: 2a 2a 20 72 61 74 68 65 72 20 74 68 61 6e 20 74  ** rather than t
3040: 68 65 20 6d 6f 72 65 20 67 65 6e 65 72 61 6c 20  he more general 
3050: 54 63 6c 5f 45 76 61 6c 45 78 28 29 2e 20 20 54  Tcl_EvalEx().  T
3060: 63 6c 5f 45 76 61 6c 4f 62 6a 76 28 29 20 69 73  cl_EvalObjv() is
3070: 20 6d 75 63 68 0a 2a 2a 20 66 61 73 74 65 72 2e   much.** faster.
3080: 0a 2a 2a 0a 2a 2a 20 53 63 72 69 70 74 73 20 74  .**.** Scripts t
3090: 68 61 74 20 61 72 65 20 73 61 66 65 20 74 6f 20  hat are safe to 
30a0: 75 73 65 20 77 69 74 68 20 54 63 6c 5f 45 76 61  use with Tcl_Eva
30b0: 6c 4f 62 6a 76 28 29 20 63 6f 6e 73 69 73 74 73  lObjv() consists
30c0: 20 6f 66 20 61 0a 2a 2a 20 63 6f 6d 6d 61 6e 64   of a.** command
30d0: 20 6e 61 6d 65 20 66 6f 6c 6c 6f 77 65 64 20 62   name followed b
30e0: 79 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 61  y zero or more a
30f0: 72 67 75 6d 65 6e 74 73 20 77 69 74 68 20 6e 6f  rguments with no
3100: 20 5b 2e 2e 2e 5d 20 6f 72 20 24 0a 2a 2a 20 6f   [...] or $.** o
3110: 72 20 7b 2e 2e 2e 7d 20 6f 72 20 3b 20 74 6f 20  r {...} or ; to 
3120: 62 65 20 73 65 65 6e 20 61 6e 79 77 68 65 72 65  be seen anywhere
3130: 2e 20 20 4d 6f 73 74 20 63 61 6c 6c 62 61 63 6b  .  Most callback
3140: 20 73 63 72 69 70 74 73 20 63 6f 6e 73 69 73 74   scripts consist
3150: 0a 2a 2a 20 6f 66 20 6a 75 73 74 20 61 20 73 69  .** of just a si
3160: 6e 67 6c 65 20 70 72 6f 63 65 64 75 72 65 20 6e  ngle procedure n
3170: 61 6d 65 20 61 6e 64 20 74 68 65 79 20 6d 65 65  ame and they mee
3180: 74 20 74 68 69 73 20 72 65 71 75 69 72 65 6d 65  t this requireme
3190: 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nt..*/.static in
31a0: 74 20 73 61 66 65 54 6f 55 73 65 45 76 61 6c 4f  t safeToUseEvalO
31b0: 62 6a 76 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a  bjv(Tcl_Interp *
31c0: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4f 62 6a 20  interp, Tcl_Obj 
31d0: 2a 70 43 6d 64 29 7b 0a 20 20 2f 2a 20 57 65 20  *pCmd){.  /* We 
31e0: 63 6f 75 6c 64 20 74 72 79 20 74 6f 20 64 6f 20  could try to do 
31f0: 73 6f 6d 65 74 68 69 6e 67 20 77 69 74 68 20 54  something with T
3200: 63 6c 5f 50 61 72 73 65 28 29 2e 20 20 42 75 74  cl_Parse().  But
3210: 20 77 65 20 77 69 6c 6c 20 69 6e 73 74 65 61 64   we will instead
3220: 0a 20 20 2a 2a 20 6a 75 73 74 20 64 6f 20 61 20  .  ** just do a 
3230: 73 65 61 72 63 68 20 66 6f 72 20 66 6f 72 62 69  search for forbi
3240: 64 64 65 6e 20 63 68 61 72 61 63 74 65 72 73 2e  dden characters.
3250: 20 20 49 66 20 61 6e 79 20 6f 66 20 74 68 65 20    If any of the 
3260: 66 6f 72 62 69 64 64 65 6e 0a 20 20 2a 2a 20 63  forbidden.  ** c
3270: 68 61 72 61 63 74 65 72 73 20 61 70 70 65 61 72  haracters appear
3280: 20 69 6e 20 70 43 6d 64 2c 20 77 65 20 77 69 6c   in pCmd, we wil
3290: 6c 20 72 65 70 6f 72 74 20 74 68 65 20 73 74 72  l report the str
32a0: 69 6e 67 20 61 73 20 75 6e 73 61 66 65 2e 0a 20  ing as unsafe.. 
32b0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
32c0: 20 2a 7a 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20   *z;.  int n;.  
32d0: 7a 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  z = Tcl_GetStrin
32e0: 67 46 72 6f 6d 4f 62 6a 28 70 43 6d 64 2c 20 26  gFromObj(pCmd, &
32f0: 6e 29 3b 0a 20 20 77 68 69 6c 65 28 20 6e 2d 2d  n);.  while( n--
3300: 20 3e 20 30 20 29 7b 0a 20 20 20 20 69 6e 74 20   > 0 ){.    int 
3310: 63 20 3d 20 2a 28 7a 2b 2b 29 3b 0a 20 20 20 20  c = *(z++);.    
3320: 69 66 28 20 63 3d 3d 27 24 27 20 7c 7c 20 63 3d  if( c=='$' || c=
3330: 3d 27 5b 27 20 7c 7c 20 63 3d 3d 27 3b 27 20 29  ='[' || c==';' )
3340: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
3350: 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a   return 1;.}../*
3360: 0a 2a 2a 20 46 69 6e 64 20 61 6e 20 53 71 6c 46  .** Find an SqlF
3370: 75 6e 63 20 73 74 72 75 63 74 75 72 65 20 77 69  unc structure wi
3380: 74 68 20 74 68 65 20 67 69 76 65 6e 20 6e 61 6d  th the given nam
3390: 65 2e 20 20 4f 72 20 63 72 65 61 74 65 20 61 20  e.  Or create a 
33a0: 6e 65 77 0a 2a 2a 20 6f 6e 65 20 69 66 20 61 6e  new.** one if an
33b0: 20 65 78 69 73 74 69 6e 67 20 6f 6e 65 20 63 61   existing one ca
33c0: 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e 20 20  nnot be found.  
33d0: 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
33e0: 20 74 6f 20 74 68 65 0a 2a 2a 20 73 74 72 75 63   to the.** struc
33f0: 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ture..*/.static 
3400: 53 71 6c 46 75 6e 63 20 2a 66 69 6e 64 53 71 6c  SqlFunc *findSql
3410: 46 75 6e 63 28 53 71 6c 69 74 65 44 62 20 2a 70  Func(SqliteDb *p
3420: 44 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  Db, const char *
3430: 7a 4e 61 6d 65 29 7b 0a 20 20 53 71 6c 46 75 6e  zName){.  SqlFun
3440: 63 20 2a 70 2c 20 2a 70 4e 65 77 3b 0a 20 20 69  c *p, *pNew;.  i
3450: 6e 74 20 69 3b 0a 20 20 70 4e 65 77 20 3d 20 28  nt i;.  pNew = (
3460: 53 71 6c 46 75 6e 63 2a 29 54 63 6c 5f 41 6c 6c  SqlFunc*)Tcl_All
3470: 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77  oc( sizeof(*pNew
3480: 29 20 2b 20 73 74 72 6c 65 6e 33 30 28 7a 4e 61  ) + strlen30(zNa
3490: 6d 65 29 20 2b 20 31 20 29 3b 0a 20 20 70 4e 65  me) + 1 );.  pNe
34a0: 77 2d 3e 7a 4e 61 6d 65 20 3d 20 28 63 68 61 72  w->zName = (char
34b0: 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a 20 20 66 6f  *)&pNew[1];.  fo
34c0: 72 28 69 3d 30 3b 20 7a 4e 61 6d 65 5b 69 5d 3b  r(i=0; zName[i];
34d0: 20 69 2b 2b 29 7b 20 70 4e 65 77 2d 3e 7a 4e 61   i++){ pNew->zNa
34e0: 6d 65 5b 69 5d 20 3d 20 74 6f 6c 6f 77 65 72 28  me[i] = tolower(
34f0: 7a 4e 61 6d 65 5b 69 5d 29 3b 20 7d 0a 20 20 70  zName[i]); }.  p
3500: 4e 65 77 2d 3e 7a 4e 61 6d 65 5b 69 5d 20 3d 20  New->zName[i] = 
3510: 30 3b 0a 20 20 66 6f 72 28 70 3d 70 44 62 2d 3e  0;.  for(p=pDb->
3520: 70 46 75 6e 63 3b 20 70 3b 20 70 3d 70 2d 3e 70  pFunc; p; p=p->p
3530: 4e 65 78 74 29 7b 20 0a 20 20 20 20 69 66 28 20  Next){ .    if( 
3540: 73 74 72 63 6d 70 28 70 2d 3e 7a 4e 61 6d 65 2c  strcmp(p->zName,
3550: 20 70 4e 65 77 2d 3e 7a 4e 61 6d 65 29 3d 3d 30   pNew->zName)==0
3560: 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 46 72   ){.      Tcl_Fr
3570: 65 65 28 28 63 68 61 72 2a 29 70 4e 65 77 29 3b  ee((char*)pNew);
3580: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 3b  .      return p;
3590: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 4e 65  .    }.  }.  pNe
35a0: 77 2d 3e 69 6e 74 65 72 70 20 3d 20 70 44 62 2d  w->interp = pDb-
35b0: 3e 69 6e 74 65 72 70 3b 0a 20 20 70 4e 65 77 2d  >interp;.  pNew-
35c0: 3e 70 53 63 72 69 70 74 20 3d 20 30 3b 0a 20 20  >pScript = 0;.  
35d0: 70 4e 65 77 2d 3e 70 4e 65 78 74 20 3d 20 70 44  pNew->pNext = pD
35e0: 62 2d 3e 70 46 75 6e 63 3b 0a 20 20 70 44 62 2d  b->pFunc;.  pDb-
35f0: 3e 70 46 75 6e 63 20 3d 20 70 4e 65 77 3b 0a 20  >pFunc = pNew;. 
3600: 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a   return pNew;.}.
3610: 0a 2f 2a 0a 2a 2a 20 46 69 6e 61 6c 69 7a 65 20  ./*.** Finalize 
3620: 61 6e 64 20 66 72 65 65 20 61 20 6c 69 73 74 20  and free a list 
3630: 6f 66 20 70 72 65 70 61 72 65 64 20 73 74 61 74  of prepared stat
3640: 65 6d 65 6e 74 73 0a 2a 2f 0a 73 74 61 74 69 63  ements.*/.static
3650: 20 76 6f 69 64 20 66 6c 75 73 68 53 74 6d 74 43   void flushStmtC
3660: 61 63 68 65 28 20 53 71 6c 69 74 65 44 62 20 2a  ache( SqliteDb *
3670: 70 44 62 20 29 7b 0a 20 20 53 71 6c 50 72 65 70  pDb ){.  SqlPrep
3680: 61 72 65 64 53 74 6d 74 20 2a 70 50 72 65 53 74  aredStmt *pPreSt
3690: 6d 74 3b 0a 0a 20 20 77 68 69 6c 65 28 20 20 70  mt;..  while(  p
36a0: 44 62 2d 3e 73 74 6d 74 4c 69 73 74 20 29 7b 0a  Db->stmtList ){.
36b0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61      sqlite3_fina
36c0: 6c 69 7a 65 28 20 70 44 62 2d 3e 73 74 6d 74 4c  lize( pDb->stmtL
36d0: 69 73 74 2d 3e 70 53 74 6d 74 20 29 3b 0a 20 20  ist->pStmt );.  
36e0: 20 20 70 50 72 65 53 74 6d 74 20 3d 20 70 44 62    pPreStmt = pDb
36f0: 2d 3e 73 74 6d 74 4c 69 73 74 3b 0a 20 20 20 20  ->stmtList;.    
3700: 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74 20 3d 20  pDb->stmtList = 
3710: 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74 2d 3e 70  pDb->stmtList->p
3720: 4e 65 78 74 3b 0a 20 20 20 20 54 63 6c 5f 46 72  Next;.    Tcl_Fr
3730: 65 65 28 20 28 63 68 61 72 2a 29 70 50 72 65 53  ee( (char*)pPreS
3740: 74 6d 74 20 29 3b 0a 20 20 7d 0a 20 20 70 44 62  tmt );.  }.  pDb
3750: 2d 3e 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 70  ->nStmt = 0;.  p
3760: 44 62 2d 3e 73 74 6d 74 4c 61 73 74 20 3d 20 30  Db->stmtLast = 0
3770: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 43 4c 20 63  ;.}../*.** TCL c
3780: 61 6c 6c 73 20 74 68 69 73 20 70 72 6f 63 65 64  alls this proced
3790: 75 72 65 20 77 68 65 6e 20 61 6e 20 73 71 6c 69  ure when an sqli
37a0: 74 65 33 20 64 61 74 61 62 61 73 65 20 63 6f 6d  te3 database com
37b0: 6d 61 6e 64 20 69 73 0a 2a 2a 20 64 65 6c 65 74  mand is.** delet
37c0: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
37d0: 69 64 20 44 62 44 65 6c 65 74 65 43 6d 64 28 76  id DbDeleteCmd(v
37e0: 6f 69 64 20 2a 64 62 29 7b 0a 20 20 53 71 6c 69  oid *db){.  Sqli
37f0: 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53 71 6c  teDb *pDb = (Sql
3800: 69 74 65 44 62 2a 29 64 62 3b 0a 20 20 66 6c 75  iteDb*)db;.  flu
3810: 73 68 53 74 6d 74 43 61 63 68 65 28 70 44 62 29  shStmtCache(pDb)
3820: 3b 0a 20 20 63 6c 6f 73 65 49 6e 63 72 62 6c 6f  ;.  closeIncrblo
3830: 62 43 68 61 6e 6e 65 6c 73 28 70 44 62 29 3b 0a  bChannels(pDb);.
3840: 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28    sqlite3_close(
3850: 70 44 62 2d 3e 64 62 29 3b 0a 20 20 77 68 69 6c  pDb->db);.  whil
3860: 65 28 20 70 44 62 2d 3e 70 46 75 6e 63 20 29 7b  e( pDb->pFunc ){
3870: 0a 20 20 20 20 53 71 6c 46 75 6e 63 20 2a 70 46  .    SqlFunc *pF
3880: 75 6e 63 20 3d 20 70 44 62 2d 3e 70 46 75 6e 63  unc = pDb->pFunc
3890: 3b 0a 20 20 20 20 70 44 62 2d 3e 70 46 75 6e 63  ;.    pDb->pFunc
38a0: 20 3d 20 70 46 75 6e 63 2d 3e 70 4e 65 78 74 3b   = pFunc->pNext;
38b0: 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66  .    Tcl_DecrRef
38c0: 43 6f 75 6e 74 28 70 46 75 6e 63 2d 3e 70 53 63  Count(pFunc->pSc
38d0: 72 69 70 74 29 3b 0a 20 20 20 20 54 63 6c 5f 46  ript);.    Tcl_F
38e0: 72 65 65 28 28 63 68 61 72 2a 29 70 46 75 6e 63  ree((char*)pFunc
38f0: 29 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20  );.  }.  while( 
3900: 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 20 29 7b  pDb->pCollate ){
3910: 0a 20 20 20 20 53 71 6c 43 6f 6c 6c 61 74 65 20  .    SqlCollate 
3920: 2a 70 43 6f 6c 6c 61 74 65 20 3d 20 70 44 62 2d  *pCollate = pDb-
3930: 3e 70 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 70  >pCollate;.    p
3940: 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 20 3d 20 70  Db->pCollate = p
3950: 43 6f 6c 6c 61 74 65 2d 3e 70 4e 65 78 74 3b 0a  Collate->pNext;.
3960: 20 20 20 20 54 63 6c 5f 46 72 65 65 28 28 63 68      Tcl_Free((ch
3970: 61 72 2a 29 70 43 6f 6c 6c 61 74 65 29 3b 0a 20  ar*)pCollate);. 
3980: 20 7d 0a 20 20 69 66 28 20 70 44 62 2d 3e 7a 42   }.  if( pDb->zB
3990: 75 73 79 20 29 7b 0a 20 20 20 20 54 63 6c 5f 46  usy ){.    Tcl_F
39a0: 72 65 65 28 70 44 62 2d 3e 7a 42 75 73 79 29 3b  ree(pDb->zBusy);
39b0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 62 2d 3e  .  }.  if( pDb->
39c0: 7a 54 72 61 63 65 20 29 7b 0a 20 20 20 20 54 63  zTrace ){.    Tc
39d0: 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 54 72 61  l_Free(pDb->zTra
39e0: 63 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ce);.  }.  if( p
39f0: 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 20 29 7b 0a  Db->zProfile ){.
3a00: 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62      Tcl_Free(pDb
3a10: 2d 3e 7a 50 72 6f 66 69 6c 65 29 3b 0a 20 20 7d  ->zProfile);.  }
3a20: 0a 20 20 69 66 28 20 70 44 62 2d 3e 7a 41 75 74  .  if( pDb->zAut
3a30: 68 20 29 7b 0a 20 20 20 20 54 63 6c 5f 46 72 65  h ){.    Tcl_Fre
3a40: 65 28 70 44 62 2d 3e 7a 41 75 74 68 29 3b 0a 20  e(pDb->zAuth);. 
3a50: 20 7d 0a 20 20 69 66 28 20 70 44 62 2d 3e 7a 4e   }.  if( pDb->zN
3a60: 75 6c 6c 20 29 7b 0a 20 20 20 20 54 63 6c 5f 46  ull ){.    Tcl_F
3a70: 72 65 65 28 70 44 62 2d 3e 7a 4e 75 6c 6c 29 3b  ree(pDb->zNull);
3a80: 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 62 2d 3e  .  }.  if( pDb->
3a90: 70 55 70 64 61 74 65 48 6f 6f 6b 20 29 7b 0a 20  pUpdateHook ){. 
3aa0: 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f     Tcl_DecrRefCo
3ab0: 75 6e 74 28 70 44 62 2d 3e 70 55 70 64 61 74 65  unt(pDb->pUpdate
3ac0: 48 6f 6f 6b 29 3b 0a 20 20 7d 0a 20 20 69 66 28  Hook);.  }.  if(
3ad0: 20 70 44 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 48   pDb->pRollbackH
3ae0: 6f 6f 6b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 44  ook ){.    Tcl_D
3af0: 65 63 72 52 65 66 43 6f 75 6e 74 28 70 44 62 2d  ecrRefCount(pDb-
3b00: 3e 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 29 3b  >pRollbackHook);
3b10: 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 62 2d 3e  .  }.  if( pDb->
3b20: 70 57 61 6c 48 6f 6f 6b 20 29 7b 0a 20 20 20 20  pWalHook ){.    
3b30: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
3b40: 28 70 44 62 2d 3e 70 57 61 6c 48 6f 6f 6b 29 3b  (pDb->pWalHook);
3b50: 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 62 2d 3e  .  }.  if( pDb->
3b60: 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64 20 29  pCollateNeeded )
3b70: 7b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65  {.    Tcl_DecrRe
3b80: 66 43 6f 75 6e 74 28 70 44 62 2d 3e 70 43 6f 6c  fCount(pDb->pCol
3b90: 6c 61 74 65 4e 65 65 64 65 64 29 3b 0a 20 20 7d  lateNeeded);.  }
3ba0: 0a 20 20 54 63 6c 5f 46 72 65 65 28 28 63 68 61  .  Tcl_Free((cha
3bb0: 72 2a 29 70 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  r*)pDb);.}../*.*
3bc0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
3bd0: 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20  s called when a 
3be0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
3bf0: 20 6c 6f 63 6b 65 64 20 77 68 69 6c 65 20 74 72   locked while tr
3c00: 79 69 6e 67 0a 2a 2a 20 74 6f 20 65 78 65 63 75  ying.** to execu
3c10: 74 65 20 53 51 4c 2e 0a 2a 2f 0a 73 74 61 74 69  te SQL..*/.stati
3c20: 63 20 69 6e 74 20 44 62 42 75 73 79 48 61 6e 64  c int DbBusyHand
3c30: 6c 65 72 28 76 6f 69 64 20 2a 63 64 2c 20 69 6e  ler(void *cd, in
3c40: 74 20 6e 54 72 69 65 73 29 7b 0a 20 20 53 71 6c  t nTries){.  Sql
3c50: 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53 71  iteDb *pDb = (Sq
3c60: 6c 69 74 65 44 62 2a 29 63 64 3b 0a 20 20 69 6e  liteDb*)cd;.  in
3c70: 74 20 72 63 3b 0a 20 20 63 68 61 72 20 7a 56 61  t rc;.  char zVa
3c80: 6c 5b 33 30 5d 3b 0a 0a 20 20 73 71 6c 69 74 65  l[30];..  sqlite
3c90: 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
3ca0: 66 28 7a 56 61 6c 29 2c 20 7a 56 61 6c 2c 20 22  f(zVal), zVal, "
3cb0: 25 64 22 2c 20 6e 54 72 69 65 73 29 3b 0a 20 20  %d", nTries);.  
3cc0: 72 63 20 3d 20 54 63 6c 5f 56 61 72 45 76 61 6c  rc = Tcl_VarEval
3cd0: 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20 70 44  (pDb->interp, pD
3ce0: 62 2d 3e 7a 42 75 73 79 2c 20 22 20 22 2c 20 7a  b->zBusy, " ", z
3cf0: 56 61 6c 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  Val, (char*)0);.
3d00: 20 20 69 66 28 20 72 63 21 3d 54 43 4c 5f 4f 4b    if( rc!=TCL_OK
3d10: 20 7c 7c 20 61 74 6f 69 28 54 63 6c 5f 47 65 74   || atoi(Tcl_Get
3d20: 53 74 72 69 6e 67 52 65 73 75 6c 74 28 70 44 62  StringResult(pDb
3d30: 2d 3e 69 6e 74 65 72 70 29 29 20 29 7b 0a 20 20  ->interp)) ){.  
3d40: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
3d50: 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 23    return 1;.}..#
3d60: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
3d70: 49 54 5f 50 52 4f 47 52 45 53 53 5f 43 41 4c 4c  IT_PROGRESS_CALL
3d80: 42 41 43 4b 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  BACK./*.** This 
3d90: 72 6f 75 74 69 6e 65 20 69 73 20 69 6e 76 6f 6b  routine is invok
3da0: 65 64 20 61 73 20 74 68 65 20 27 70 72 6f 67 72  ed as the 'progr
3db0: 65 73 73 20 63 61 6c 6c 62 61 63 6b 27 20 66 6f  ess callback' fo
3dc0: 72 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  r the database..
3dd0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 44 62  */.static int Db
3de0: 50 72 6f 67 72 65 73 73 48 61 6e 64 6c 65 72 28  ProgressHandler(
3df0: 76 6f 69 64 20 2a 63 64 29 7b 0a 20 20 53 71 6c  void *cd){.  Sql
3e00: 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53 71  iteDb *pDb = (Sq
3e10: 6c 69 74 65 44 62 2a 29 63 64 3b 0a 20 20 69 6e  liteDb*)cd;.  in
3e20: 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
3e30: 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 20   pDb->zProgress 
3e40: 29 3b 0a 20 20 72 63 20 3d 20 54 63 6c 5f 45 76  );.  rc = Tcl_Ev
3e50: 61 6c 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20  al(pDb->interp, 
3e60: 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 29 3b  pDb->zProgress);
3e70: 0a 20 20 69 66 28 20 72 63 21 3d 54 43 4c 5f 4f  .  if( rc!=TCL_O
3e80: 4b 20 7c 7c 20 61 74 6f 69 28 54 63 6c 5f 47 65  K || atoi(Tcl_Ge
3e90: 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28 70 44  tStringResult(pD
3ea0: 62 2d 3e 69 6e 74 65 72 70 29 29 20 29 7b 0a 20  b->interp)) ){. 
3eb0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
3ec0: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23  .  return 0;.}.#
3ed0: 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
3ee0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45  QLITE_OMIT_TRACE
3ef0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
3f00: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79  ine is called by
3f10: 20 74 68 65 20 53 51 4c 69 74 65 20 74 72 61 63   the SQLite trac
3f20: 65 20 68 61 6e 64 6c 65 72 20 77 68 65 6e 65 76  e handler whenev
3f30: 65 72 20 61 20 6e 65 77 0a 2a 2a 20 62 6c 6f 63  er a new.** bloc
3f40: 6b 20 6f 66 20 53 51 4c 20 69 73 20 65 78 65 63  k of SQL is exec
3f50: 75 74 65 64 2e 20 20 54 68 65 20 54 43 4c 20 73  uted.  The TCL s
3f60: 63 72 69 70 74 20 69 6e 20 70 44 62 2d 3e 7a 54  cript in pDb->zT
3f70: 72 61 63 65 20 69 73 20 65 78 65 63 75 74 65 64  race is executed
3f80: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
3f90: 20 44 62 54 72 61 63 65 48 61 6e 64 6c 65 72 28   DbTraceHandler(
3fa0: 76 6f 69 64 20 2a 63 64 2c 20 63 6f 6e 73 74 20  void *cd, const 
3fb0: 63 68 61 72 20 2a 7a 53 71 6c 29 7b 0a 20 20 53  char *zSql){.  S
3fc0: 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28  qliteDb *pDb = (
3fd0: 53 71 6c 69 74 65 44 62 2a 29 63 64 3b 0a 20 20  SqliteDb*)cd;.  
3fe0: 54 63 6c 5f 44 53 74 72 69 6e 67 20 73 74 72 3b  Tcl_DString str;
3ff0: 0a 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49  ..  Tcl_DStringI
4000: 6e 69 74 28 26 73 74 72 29 3b 0a 20 20 54 63 6c  nit(&str);.  Tcl
4010: 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64 28 26  _DStringAppend(&
4020: 73 74 72 2c 20 70 44 62 2d 3e 7a 54 72 61 63 65  str, pDb->zTrace
4030: 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 44 53 74  , -1);.  Tcl_DSt
4040: 72 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e  ringAppendElemen
4050: 74 28 26 73 74 72 2c 20 7a 53 71 6c 29 3b 0a 20  t(&str, zSql);. 
4060: 20 54 63 6c 5f 45 76 61 6c 28 70 44 62 2d 3e 69   Tcl_Eval(pDb->i
4070: 6e 74 65 72 70 2c 20 54 63 6c 5f 44 53 74 72 69  nterp, Tcl_DStri
4080: 6e 67 56 61 6c 75 65 28 26 73 74 72 29 29 3b 0a  ngValue(&str));.
4090: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65    Tcl_DStringFre
40a0: 65 28 26 73 74 72 29 3b 0a 20 20 54 63 6c 5f 52  e(&str);.  Tcl_R
40b0: 65 73 65 74 52 65 73 75 6c 74 28 70 44 62 2d 3e  esetResult(pDb->
40c0: 69 6e 74 65 72 70 29 3b 0a 7d 0a 23 65 6e 64 69  interp);.}.#endi
40d0: 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  f..#ifndef SQLIT
40e0: 45 5f 4f 4d 49 54 5f 54 52 41 43 45 0a 2f 2a 0a  E_OMIT_TRACE./*.
40f0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
4100: 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65  is called by the
4110: 20 53 51 4c 69 74 65 20 70 72 6f 66 69 6c 65 20   SQLite profile 
4120: 68 61 6e 64 6c 65 72 20 61 66 74 65 72 20 61 20  handler after a 
4130: 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 53 51 4c  statement.** SQL
4140: 20 68 61 73 20 65 78 65 63 75 74 65 64 2e 20 20   has executed.  
4150: 54 68 65 20 54 43 4c 20 73 63 72 69 70 74 20 69  The TCL script i
4160: 6e 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 20  n pDb->zProfile 
4170: 69 73 20 65 76 61 6c 75 61 74 65 64 2e 0a 2a 2f  is evaluated..*/
4180: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 44 62 50  .static void DbP
4190: 72 6f 66 69 6c 65 48 61 6e 64 6c 65 72 28 76 6f  rofileHandler(vo
41a0: 69 64 20 2a 63 64 2c 20 63 6f 6e 73 74 20 63 68  id *cd, const ch
41b0: 61 72 20 2a 7a 53 71 6c 2c 20 73 71 6c 69 74 65  ar *zSql, sqlite
41c0: 5f 75 69 6e 74 36 34 20 74 6d 29 7b 0a 20 20 53  _uint64 tm){.  S
41d0: 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28  qliteDb *pDb = (
41e0: 53 71 6c 69 74 65 44 62 2a 29 63 64 3b 0a 20 20  SqliteDb*)cd;.  
41f0: 54 63 6c 5f 44 53 74 72 69 6e 67 20 73 74 72 3b  Tcl_DString str;
4200: 0a 20 20 63 68 61 72 20 7a 54 6d 5b 31 30 30 5d  .  char zTm[100]
4210: 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  ;..  sqlite3_snp
4220: 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 54 6d  rintf(sizeof(zTm
4230: 29 2d 31 2c 20 7a 54 6d 2c 20 22 25 6c 6c 64 22  )-1, zTm, "%lld"
4240: 2c 20 74 6d 29 3b 0a 20 20 54 63 6c 5f 44 53 74  , tm);.  Tcl_DSt
4250: 72 69 6e 67 49 6e 69 74 28 26 73 74 72 29 3b 0a  ringInit(&str);.
4260: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70    Tcl_DStringApp
4270: 65 6e 64 28 26 73 74 72 2c 20 70 44 62 2d 3e 7a  end(&str, pDb->z
4280: 50 72 6f 66 69 6c 65 2c 20 2d 31 29 3b 0a 20 20  Profile, -1);.  
4290: 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e  Tcl_DStringAppen
42a0: 64 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c 20 7a  dElement(&str, z
42b0: 53 71 6c 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72  Sql);.  Tcl_DStr
42c0: 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ingAppendElement
42d0: 28 26 73 74 72 2c 20 7a 54 6d 29 3b 0a 20 20 54  (&str, zTm);.  T
42e0: 63 6c 5f 45 76 61 6c 28 70 44 62 2d 3e 69 6e 74  cl_Eval(pDb->int
42f0: 65 72 70 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67  erp, Tcl_DString
4300: 56 61 6c 75 65 28 26 73 74 72 29 29 3b 0a 20 20  Value(&str));.  
4310: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28  Tcl_DStringFree(
4320: 26 73 74 72 29 3b 0a 20 20 54 63 6c 5f 52 65 73  &str);.  Tcl_Res
4330: 65 74 52 65 73 75 6c 74 28 70 44 62 2d 3e 69 6e  etResult(pDb->in
4340: 74 65 72 70 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  terp);.}.#endif.
4350: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
4360: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ine is called wh
4370: 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  en a transaction
4380: 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2e 20 20   is committed.  
4390: 54 68 65 0a 2a 2a 20 54 43 4c 20 73 63 72 69 70  The.** TCL scrip
43a0: 74 20 69 6e 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69  t in pDb->zCommi
43b0: 74 20 69 73 20 65 78 65 63 75 74 65 64 2e 20 20  t is executed.  
43c0: 49 66 20 69 74 20 72 65 74 75 72 6e 73 20 6e 6f  If it returns no
43d0: 6e 2d 7a 65 72 6f 20 6f 72 0a 2a 2a 20 69 66 20  n-zero or.** if 
43e0: 69 74 20 74 68 72 6f 77 73 20 61 6e 20 65 78 63  it throws an exc
43f0: 65 70 74 69 6f 6e 2c 20 74 68 65 20 74 72 61 6e  eption, the tran
4400: 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65  saction is rolle
4410: 64 20 62 61 63 6b 20 69 6e 73 74 65 61 64 0a 2a  d back instead.*
4420: 2a 20 6f 66 20 62 65 69 6e 67 20 63 6f 6d 6d 69  * of being commi
4430: 74 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tted..*/.static 
4440: 69 6e 74 20 44 62 43 6f 6d 6d 69 74 48 61 6e 64  int DbCommitHand
4450: 6c 65 72 28 76 6f 69 64 20 2a 63 64 29 7b 0a 20  ler(void *cd){. 
4460: 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d   SqliteDb *pDb =
4470: 20 28 53 71 6c 69 74 65 44 62 2a 29 63 64 3b 0a   (SqliteDb*)cd;.
4480: 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 72 63 20    int rc;..  rc 
4490: 3d 20 54 63 6c 5f 45 76 61 6c 28 70 44 62 2d 3e  = Tcl_Eval(pDb->
44a0: 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a 43 6f  interp, pDb->zCo
44b0: 6d 6d 69 74 29 3b 0a 20 20 69 66 28 20 72 63 21  mmit);.  if( rc!
44c0: 3d 54 43 4c 5f 4f 4b 20 7c 7c 20 61 74 6f 69 28  =TCL_OK || atoi(
44d0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73  Tcl_GetStringRes
44e0: 75 6c 74 28 70 44 62 2d 3e 69 6e 74 65 72 70 29  ult(pDb->interp)
44f0: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
4500: 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
4510: 30 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69  0;.}..static voi
4520: 64 20 44 62 52 6f 6c 6c 62 61 63 6b 48 61 6e 64  d DbRollbackHand
4530: 6c 65 72 28 76 6f 69 64 20 2a 63 6c 69 65 6e 74  ler(void *client
4540: 44 61 74 61 29 7b 0a 20 20 53 71 6c 69 74 65 44  Data){.  SqliteD
4550: 62 20 2a 70 44 62 20 3d 20 28 53 71 6c 69 74 65  b *pDb = (Sqlite
4560: 44 62 2a 29 63 6c 69 65 6e 74 44 61 74 61 3b 0a  Db*)clientData;.
4570: 20 20 61 73 73 65 72 74 28 70 44 62 2d 3e 70 52    assert(pDb->pR
4580: 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 29 3b 0a 20 20  ollbackHook);.  
4590: 69 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f  if( TCL_OK!=Tcl_
45a0: 45 76 61 6c 4f 62 6a 45 78 28 70 44 62 2d 3e 69  EvalObjEx(pDb->i
45b0: 6e 74 65 72 70 2c 20 70 44 62 2d 3e 70 52 6f 6c  nterp, pDb->pRol
45c0: 6c 62 61 63 6b 48 6f 6f 6b 2c 20 30 29 20 29 7b  lbackHook, 0) ){
45d0: 0a 20 20 20 20 54 63 6c 5f 42 61 63 6b 67 72 6f  .    Tcl_Backgro
45e0: 75 6e 64 45 72 72 6f 72 28 70 44 62 2d 3e 69 6e  undError(pDb->in
45f0: 74 65 72 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  terp);.  }.}../*
4600: 0a 2a 2a 20 54 68 69 73 20 70 72 6f 63 65 64 75  .** This procedu
4610: 72 65 20 68 61 6e 64 6c 65 73 20 77 61 6c 5f 68  re handles wal_h
4620: 6f 6f 6b 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 2a  ook callbacks..*
4630: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 44 62 57  /.static int DbW
4640: 61 6c 48 61 6e 64 6c 65 72 28 0a 20 20 76 6f 69  alHandler(.  voi
4650: 64 20 2a 63 6c 69 65 6e 74 44 61 74 61 2c 20 0a  d *clientData, .
4660: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a    sqlite3 *db, .
4670: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
4680: 62 2c 20 0a 20 20 69 6e 74 20 6e 45 6e 74 72 79  b, .  int nEntry
4690: 0a 29 7b 0a 20 20 69 6e 74 20 72 65 74 20 3d 20  .){.  int ret = 
46a0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 54 63 6c  SQLITE_OK;.  Tcl
46b0: 5f 4f 62 6a 20 2a 70 3b 0a 20 20 53 71 6c 69 74  _Obj *p;.  Sqlit
46c0: 65 44 62 20 2a 70 44 62 20 3d 20 28 53 71 6c 69  eDb *pDb = (Sqli
46d0: 74 65 44 62 2a 29 63 6c 69 65 6e 74 44 61 74 61  teDb*)clientData
46e0: 3b 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ;.  Tcl_Interp *
46f0: 69 6e 74 65 72 70 20 3d 20 70 44 62 2d 3e 69 6e  interp = pDb->in
4700: 74 65 72 70 3b 0a 20 20 61 73 73 65 72 74 28 70  terp;.  assert(p
4710: 44 62 2d 3e 70 57 61 6c 48 6f 6f 6b 29 3b 0a 0a  Db->pWalHook);..
4720: 20 20 70 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63    p = Tcl_Duplic
4730: 61 74 65 4f 62 6a 28 70 44 62 2d 3e 70 57 61 6c  ateObj(pDb->pWal
4740: 48 6f 6f 6b 29 3b 0a 20 20 54 63 6c 5f 49 6e 63  Hook);.  Tcl_Inc
4750: 72 52 65 66 43 6f 75 6e 74 28 70 29 3b 0a 20 20  rRefCount(p);.  
4760: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
4770: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
4780: 20 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e   p, Tcl_NewStrin
4790: 67 4f 62 6a 28 7a 44 62 2c 20 2d 31 29 29 3b 0a  gObj(zDb, -1));.
47a0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
47b0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
47c0: 70 2c 20 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74  p, p, Tcl_NewInt
47d0: 4f 62 6a 28 6e 45 6e 74 72 79 29 29 3b 0a 20 20  Obj(nEntry));.  
47e0: 69 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f  if( TCL_OK!=Tcl_
47f0: 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70  EvalObjEx(interp
4800: 2c 20 70 2c 20 30 29 20 0a 20 20 20 7c 7c 20 54  , p, 0) .   || T
4810: 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 49 6e  CL_OK!=Tcl_GetIn
4820: 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
4830: 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c   Tcl_GetObjResul
4840: 74 28 69 6e 74 65 72 70 29 2c 20 26 72 65 74 29  t(interp), &ret)
4850: 0a 20 20 29 7b 0a 20 20 20 20 54 63 6c 5f 42 61  .  ){.    Tcl_Ba
4860: 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72 28 69 6e  ckgroundError(in
4870: 74 65 72 70 29 3b 0a 20 20 7d 0a 20 20 54 63 6c  terp);.  }.  Tcl
4880: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 29  _DecrRefCount(p)
4890: 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 65 74 3b  ;..  return ret;
48a0: 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .}..#if defined(
48b0: 53 51 4c 49 54 45 5f 54 45 53 54 29 20 26 26 20  SQLITE_TEST) && 
48c0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
48d0: 4e 41 42 4c 45 5f 55 4e 4c 4f 43 4b 5f 4e 4f 54  NABLE_UNLOCK_NOT
48e0: 49 46 59 29 0a 73 74 61 74 69 63 20 76 6f 69 64  IFY).static void
48f0: 20 73 65 74 54 65 73 74 55 6e 6c 6f 63 6b 4e 6f   setTestUnlockNo
4900: 74 69 66 79 56 61 72 73 28 54 63 6c 5f 49 6e 74  tifyVars(Tcl_Int
4910: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74  erp *interp, int
4920: 20 69 41 72 67 2c 20 69 6e 74 20 6e 41 72 67 29   iArg, int nArg)
4930: 7b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 36 34  {.  char zBuf[64
4940: 5d 3b 0a 20 20 73 70 72 69 6e 74 66 28 7a 42 75  ];.  sprintf(zBu
4950: 66 2c 20 22 25 64 22 2c 20 69 41 72 67 29 3b 0a  f, "%d", iArg);.
4960: 20 20 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74    Tcl_SetVar(int
4970: 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 75 6e 6c  erp, "sqlite_unl
4980: 6f 63 6b 5f 6e 6f 74 69 66 79 5f 61 72 67 22 2c  ock_notify_arg",
4990: 20 7a 42 75 66 2c 20 54 43 4c 5f 47 4c 4f 42 41   zBuf, TCL_GLOBA
49a0: 4c 5f 4f 4e 4c 59 29 3b 0a 20 20 73 70 72 69 6e  L_ONLY);.  sprin
49b0: 74 66 28 7a 42 75 66 2c 20 22 25 64 22 2c 20 6e  tf(zBuf, "%d", n
49c0: 41 72 67 29 3b 0a 20 20 54 63 6c 5f 53 65 74 56  Arg);.  Tcl_SetV
49d0: 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69  ar(interp, "sqli
49e0: 74 65 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79  te_unlock_notify
49f0: 5f 61 72 67 63 6f 75 6e 74 22 2c 20 7a 42 75 66  _argcount", zBuf
4a00: 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c  , TCL_GLOBAL_ONL
4a10: 59 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65  Y);.}.#else.# de
4a20: 66 69 6e 65 20 73 65 74 54 65 73 74 55 6e 6c 6f  fine setTestUnlo
4a30: 63 6b 4e 6f 74 69 66 79 56 61 72 73 28 78 2c 79  ckNotifyVars(x,y
4a40: 2c 7a 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64  ,z).#endif..#ifd
4a50: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
4a60: 5f 55 4e 4c 4f 43 4b 5f 4e 4f 54 49 46 59 0a 73  _UNLOCK_NOTIFY.s
4a70: 74 61 74 69 63 20 76 6f 69 64 20 44 62 55 6e 6c  tatic void DbUnl
4a80: 6f 63 6b 4e 6f 74 69 66 79 28 76 6f 69 64 20 2a  ockNotify(void *
4a90: 2a 61 70 41 72 67 2c 20 69 6e 74 20 6e 41 72 67  *apArg, int nArg
4aa0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  ){.  int i;.  fo
4ab0: 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69  r(i=0; i<nArg; i
4ac0: 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69  ++){.    const i
4ad0: 6e 74 20 66 6c 61 67 73 20 3d 20 28 54 43 4c 5f  nt flags = (TCL_
4ae0: 45 56 41 4c 5f 47 4c 4f 42 41 4c 7c 54 43 4c 5f  EVAL_GLOBAL|TCL_
4af0: 45 56 41 4c 5f 44 49 52 45 43 54 29 3b 0a 20 20  EVAL_DIRECT);.  
4b00: 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20    SqliteDb *pDb 
4b10: 3d 20 28 53 71 6c 69 74 65 44 62 20 2a 29 61 70  = (SqliteDb *)ap
4b20: 41 72 67 5b 69 5d 3b 0a 20 20 20 20 73 65 74 54  Arg[i];.    setT
4b30: 65 73 74 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 56  estUnlockNotifyV
4b40: 61 72 73 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c  ars(pDb->interp,
4b50: 20 69 2c 20 6e 41 72 67 29 3b 0a 20 20 20 20 61   i, nArg);.    a
4b60: 73 73 65 72 74 28 20 70 44 62 2d 3e 70 55 6e 6c  ssert( pDb->pUnl
4b70: 6f 63 6b 4e 6f 74 69 66 79 29 3b 0a 20 20 20 20  ockNotify);.    
4b80: 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70 44  Tcl_EvalObjEx(pD
4b90: 62 2d 3e 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e  b->interp, pDb->
4ba0: 70 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 2c 20 66  pUnlockNotify, f
4bb0: 6c 61 67 73 29 3b 0a 20 20 20 20 54 63 6c 5f 44  lags);.    Tcl_D
4bc0: 65 63 72 52 65 66 43 6f 75 6e 74 28 70 44 62 2d  ecrRefCount(pDb-
4bd0: 3e 70 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 29 3b  >pUnlockNotify);
4be0: 0a 20 20 20 20 70 44 62 2d 3e 70 55 6e 6c 6f 63  .    pDb->pUnloc
4bf0: 6b 4e 6f 74 69 66 79 20 3d 20 30 3b 0a 20 20 7d  kNotify = 0;.  }
4c00: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 73 74 61 74 69  .}.#endif..stati
4c10: 63 20 76 6f 69 64 20 44 62 55 70 64 61 74 65 48  c void DbUpdateH
4c20: 61 6e 64 6c 65 72 28 0a 20 20 76 6f 69 64 20 2a  andler(.  void *
4c30: 70 2c 20 0a 20 20 69 6e 74 20 6f 70 2c 0a 20 20  p, .  int op,.  
4c40: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 2c  const char *zDb,
4c50: 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a   .  const char *
4c60: 7a 54 62 6c 2c 20 0a 20 20 73 71 6c 69 74 65 5f  zTbl, .  sqlite_
4c70: 69 6e 74 36 34 20 72 6f 77 69 64 0a 29 7b 0a 20  int64 rowid.){. 
4c80: 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d   SqliteDb *pDb =
4c90: 20 28 53 71 6c 69 74 65 44 62 20 2a 29 70 3b 0a   (SqliteDb *)p;.
4ca0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 43 6d 64 3b    Tcl_Obj *pCmd;
4cb0: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 44 62 2d  ..  assert( pDb-
4cc0: 3e 70 55 70 64 61 74 65 48 6f 6f 6b 20 29 3b 0a  >pUpdateHook );.
4cd0: 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 53 51    assert( op==SQ
4ce0: 4c 49 54 45 5f 49 4e 53 45 52 54 20 7c 7c 20 6f  LITE_INSERT || o
4cf0: 70 3d 3d 53 51 4c 49 54 45 5f 55 50 44 41 54 45  p==SQLITE_UPDATE
4d00: 20 7c 7c 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 44   || op==SQLITE_D
4d10: 45 4c 45 54 45 20 29 3b 0a 0a 20 20 70 43 6d 64  ELETE );..  pCmd
4d20: 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65   = Tcl_Duplicate
4d30: 4f 62 6a 28 70 44 62 2d 3e 70 55 70 64 61 74 65  Obj(pDb->pUpdate
4d40: 48 6f 6f 6b 29 3b 0a 20 20 54 63 6c 5f 49 6e 63  Hook);.  Tcl_Inc
4d50: 72 52 65 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b  rRefCount(pCmd);
4d60: 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  .  Tcl_ListObjAp
4d70: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70  pendElement(0, p
4d80: 43 6d 64 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Cmd, Tcl_NewStri
4d90: 6e 67 4f 62 6a 28 0a 20 20 20 20 28 20 28 6f 70  ngObj(.    ( (op
4da0: 3d 3d 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 29  ==SQLITE_INSERT)
4db0: 3f 22 49 4e 53 45 52 54 22 3a 28 6f 70 3d 3d 53  ?"INSERT":(op==S
4dc0: 51 4c 49 54 45 5f 55 50 44 41 54 45 29 3f 22 55  QLITE_UPDATE)?"U
4dd0: 50 44 41 54 45 22 3a 22 44 45 4c 45 54 45 22 29  PDATE":"DELETE")
4de0: 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69  , -1));.  Tcl_Li
4df0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
4e00: 6e 74 28 30 2c 20 70 43 6d 64 2c 20 54 63 6c 5f  nt(0, pCmd, Tcl_
4e10: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 44 62  NewStringObj(zDb
4e20: 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69  , -1));.  Tcl_Li
4e30: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
4e40: 6e 74 28 30 2c 20 70 43 6d 64 2c 20 54 63 6c 5f  nt(0, pCmd, Tcl_
4e50: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 54 62  NewStringObj(zTb
4e60: 6c 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c  l, -1));.  Tcl_L
4e70: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
4e80: 65 6e 74 28 30 2c 20 70 43 6d 64 2c 20 54 63 6c  ent(0, pCmd, Tcl
4e90: 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 72  _NewWideIntObj(r
4ea0: 6f 77 69 64 29 29 3b 0a 20 20 54 63 6c 5f 45 76  owid));.  Tcl_Ev
4eb0: 61 6c 4f 62 6a 45 78 28 70 44 62 2d 3e 69 6e 74  alObjEx(pDb->int
4ec0: 65 72 70 2c 20 70 43 6d 64 2c 20 54 43 4c 5f 45  erp, pCmd, TCL_E
4ed0: 56 41 4c 5f 44 49 52 45 43 54 29 3b 0a 7d 0a 0a  VAL_DIRECT);.}..
4ee0: 73 74 61 74 69 63 20 76 6f 69 64 20 74 63 6c 43  static void tclC
4ef0: 6f 6c 6c 61 74 65 4e 65 65 64 65 64 28 0a 20 20  ollateNeeded(.  
4f00: 76 6f 69 64 20 2a 70 43 74 78 2c 0a 20 20 73 71  void *pCtx,.  sq
4f10: 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 69 6e 74  lite3 *db,.  int
4f20: 20 65 6e 63 2c 0a 20 20 63 6f 6e 73 74 20 63 68   enc,.  const ch
4f30: 61 72 20 2a 7a 4e 61 6d 65 0a 29 7b 0a 20 20 53  ar *zName.){.  S
4f40: 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28  qliteDb *pDb = (
4f50: 53 71 6c 69 74 65 44 62 20 2a 29 70 43 74 78 3b  SqliteDb *)pCtx;
4f60: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 53 63 72  .  Tcl_Obj *pScr
4f70: 69 70 74 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63  ipt = Tcl_Duplic
4f80: 61 74 65 4f 62 6a 28 70 44 62 2d 3e 70 43 6f 6c  ateObj(pDb->pCol
4f90: 6c 61 74 65 4e 65 65 64 65 64 29 3b 0a 20 20 54  lateNeeded);.  T
4fa0: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
4fb0: 70 53 63 72 69 70 74 29 3b 0a 20 20 54 63 6c 5f  pScript);.  Tcl_
4fc0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
4fd0: 6d 65 6e 74 28 30 2c 20 70 53 63 72 69 70 74 2c  ment(0, pScript,
4fe0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
4ff0: 6a 28 7a 4e 61 6d 65 2c 20 2d 31 29 29 3b 0a 20  j(zName, -1));. 
5000: 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70   Tcl_EvalObjEx(p
5010: 44 62 2d 3e 69 6e 74 65 72 70 2c 20 70 53 63 72  Db->interp, pScr
5020: 69 70 74 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 44  ipt, 0);.  Tcl_D
5030: 65 63 72 52 65 66 43 6f 75 6e 74 28 70 53 63 72  ecrRefCount(pScr
5040: 69 70 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ipt);.}../*.** T
5050: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
5060: 61 6c 6c 65 64 20 74 6f 20 65 76 61 6c 75 61 74  alled to evaluat
5070: 65 20 61 6e 20 53 51 4c 20 63 6f 6c 6c 61 74 69  e an SQL collati
5080: 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 69 6d 70 6c  on function impl
5090: 65 6d 65 6e 74 65 64 0a 2a 2a 20 75 73 69 6e 67  emented.** using
50a0: 20 54 43 4c 20 73 63 72 69 70 74 2e 0a 2a 2f 0a   TCL script..*/.
50b0: 73 74 61 74 69 63 20 69 6e 74 20 74 63 6c 53 71  static int tclSq
50c0: 6c 43 6f 6c 6c 61 74 65 28 0a 20 20 76 6f 69 64  lCollate(.  void
50d0: 20 2a 70 43 74 78 2c 0a 20 20 69 6e 74 20 6e 41   *pCtx,.  int nA
50e0: 2c 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  ,.  const void *
50f0: 7a 41 2c 0a 20 20 69 6e 74 20 6e 42 2c 0a 20 20  zA,.  int nB,.  
5100: 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 42 0a 29  const void *zB.)
5110: 7b 0a 20 20 53 71 6c 43 6f 6c 6c 61 74 65 20 2a  {.  SqlCollate *
5120: 70 20 3d 20 28 53 71 6c 43 6f 6c 6c 61 74 65 20  p = (SqlCollate 
5130: 2a 29 70 43 74 78 3b 0a 20 20 54 63 6c 5f 4f 62  *)pCtx;.  Tcl_Ob
5140: 6a 20 2a 70 43 6d 64 3b 0a 0a 20 20 70 43 6d 64  j *pCmd;..  pCmd
5150: 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67   = Tcl_NewString
5160: 4f 62 6a 28 70 2d 3e 7a 53 63 72 69 70 74 2c 20  Obj(p->zScript, 
5170: 2d 31 29 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52  -1);.  Tcl_IncrR
5180: 65 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20  efCount(pCmd);. 
5190: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
51a0: 6e 64 45 6c 65 6d 65 6e 74 28 70 2d 3e 69 6e 74  ndElement(p->int
51b0: 65 72 70 2c 20 70 43 6d 64 2c 20 54 63 6c 5f 4e  erp, pCmd, Tcl_N
51c0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 41 2c 20  ewStringObj(zA, 
51d0: 6e 41 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74  nA));.  Tcl_List
51e0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
51f0: 28 70 2d 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64  (p->interp, pCmd
5200: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
5210: 62 6a 28 7a 42 2c 20 6e 42 29 29 3b 0a 20 20 54  bj(zB, nB));.  T
5220: 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70 2d 3e  cl_EvalObjEx(p->
5230: 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c 20 54 43  interp, pCmd, TC
5240: 4c 5f 45 56 41 4c 5f 44 49 52 45 43 54 29 3b 0a  L_EVAL_DIRECT);.
5250: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
5260: 6e 74 28 70 43 6d 64 29 3b 0a 20 20 72 65 74 75  nt(pCmd);.  retu
5270: 72 6e 20 28 61 74 6f 69 28 54 63 6c 5f 47 65 74  rn (atoi(Tcl_Get
5280: 53 74 72 69 6e 67 52 65 73 75 6c 74 28 70 2d 3e  StringResult(p->
5290: 69 6e 74 65 72 70 29 29 29 3b 0a 7d 0a 0a 2f 2a  interp)));.}../*
52a0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
52b0: 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 65 76   is called to ev
52c0: 61 6c 75 61 74 65 20 61 6e 20 53 51 4c 20 66 75  aluate an SQL fu
52d0: 6e 63 74 69 6f 6e 20 69 6d 70 6c 65 6d 65 6e 74  nction implement
52e0: 65 64 0a 2a 2a 20 75 73 69 6e 67 20 54 43 4c 20  ed.** using TCL 
52f0: 73 63 72 69 70 74 2e 0a 2a 2f 0a 73 74 61 74 69  script..*/.stati
5300: 63 20 76 6f 69 64 20 74 63 6c 53 71 6c 46 75 6e  c void tclSqlFun
5310: 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  c(sqlite3_contex
5320: 74 20 2a 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20  t *context, int 
5330: 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61  argc, sqlite3_va
5340: 6c 75 65 2a 2a 61 72 67 76 29 7b 0a 20 20 53 71  lue**argv){.  Sq
5350: 6c 46 75 6e 63 20 2a 70 20 3d 20 73 71 6c 69 74  lFunc *p = sqlit
5360: 65 33 5f 75 73 65 72 5f 64 61 74 61 28 63 6f 6e  e3_user_data(con
5370: 74 65 78 74 29 3b 0a 20 20 54 63 6c 5f 4f 62 6a  text);.  Tcl_Obj
5380: 20 2a 70 43 6d 64 3b 0a 20 20 69 6e 74 20 69 3b   *pCmd;.  int i;
5390: 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66  .  int rc;..  if
53a0: 28 20 61 72 67 63 3d 3d 30 20 29 7b 0a 20 20 20  ( argc==0 ){.   
53b0: 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65   /* If there are
53c0: 20 6e 6f 20 61 72 67 75 6d 65 6e 74 73 20 74 6f   no arguments to
53d0: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 2c 20 63   the function, c
53e0: 61 6c 6c 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45  all Tcl_EvalObjE
53f0: 78 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20  x on the.    ** 
5400: 73 63 72 69 70 74 20 6f 62 6a 65 63 74 20 64 69  script object di
5410: 72 65 63 74 6c 79 2e 20 20 54 68 69 73 20 61 6c  rectly.  This al
5420: 6c 6f 77 73 20 74 68 65 20 54 43 4c 20 63 6f 6d  lows the TCL com
5430: 70 69 6c 65 72 20 74 6f 20 67 65 6e 65 72 61 74  piler to generat
5440: 65 0a 20 20 20 20 2a 2a 20 62 79 74 65 63 6f 64  e.    ** bytecod
5450: 65 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d 61 6e  e for the comman
5460: 64 20 6f 6e 20 74 68 65 20 66 69 72 73 74 20 69  d on the first i
5470: 6e 76 6f 63 61 74 69 6f 6e 20 61 6e 64 20 74 68  nvocation and th
5480: 75 73 20 6d 61 6b 65 0a 20 20 20 20 2a 2a 20 73  us make.    ** s
5490: 75 62 73 65 71 75 65 6e 74 20 69 6e 76 6f 63 61  ubsequent invoca
54a0: 74 69 6f 6e 73 20 6d 75 63 68 20 66 61 73 74 65  tions much faste
54b0: 72 2e 20 2a 2f 0a 20 20 20 20 70 43 6d 64 20 3d  r. */.    pCmd =
54c0: 20 70 2d 3e 70 53 63 72 69 70 74 3b 0a 20 20 20   p->pScript;.   
54d0: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
54e0: 74 28 70 43 6d 64 29 3b 0a 20 20 20 20 72 63 20  t(pCmd);.    rc 
54f0: 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28  = Tcl_EvalObjEx(
5500: 70 2d 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c  p->interp, pCmd,
5510: 20 30 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63   0);.    Tcl_Dec
5520: 72 52 65 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b  rRefCount(pCmd);
5530: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
5540: 20 49 66 20 74 68 65 72 65 20 61 72 65 20 61 72   If there are ar
5550: 67 75 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 66  guments to the f
5560: 75 6e 63 74 69 6f 6e 2c 20 6d 61 6b 65 20 61 20  unction, make a 
5570: 73 68 61 6c 6c 6f 77 20 63 6f 70 79 20 6f 66 20  shallow copy of 
5580: 74 68 65 0a 20 20 20 20 2a 2a 20 73 63 72 69 70  the.    ** scrip
5590: 74 20 6f 62 6a 65 63 74 2c 20 6c 61 70 70 65 6e  t object, lappen
55a0: 64 20 74 68 65 20 61 72 67 75 6d 65 6e 74 73 2c  d the arguments,
55b0: 20 74 68 65 6e 20 65 76 61 6c 75 61 74 65 20 74   then evaluate t
55c0: 68 65 20 63 6f 70 79 2e 0a 20 20 20 20 2a 2a 0a  he copy..    **.
55d0: 20 20 20 20 2a 2a 20 42 79 20 22 73 68 61 6c 6c      ** By "shall
55e0: 6f 77 22 20 63 6f 70 79 2c 20 77 65 20 6d 65 61  ow" copy, we mea
55f0: 6e 20 61 20 6f 6e 6c 79 20 74 68 65 20 6f 75 74  n a only the out
5600: 65 72 20 6c 69 73 74 20 54 63 6c 5f 4f 62 6a 20  er list Tcl_Obj 
5610: 69 73 20 64 75 70 6c 69 63 61 74 65 64 2e 0a 20  is duplicated.. 
5620: 20 20 20 2a 2a 20 54 68 65 20 6e 65 77 20 54 63     ** The new Tc
5630: 6c 5f 4f 62 6a 20 63 6f 6e 74 61 69 6e 73 20 70  l_Obj contains p
5640: 6f 69 6e 74 65 72 73 20 74 6f 20 74 68 65 20 6f  ointers to the o
5650: 72 69 67 69 6e 61 6c 20 6c 69 73 74 20 65 6c 65  riginal list ele
5660: 6d 65 6e 74 73 2e 20 0a 20 20 20 20 2a 2a 20 54  ments. .    ** T
5670: 68 61 74 20 77 61 79 2c 20 77 68 65 6e 20 54 63  hat way, when Tc
5680: 6c 5f 45 76 61 6c 4f 62 6a 76 28 29 20 69 73 20  l_EvalObjv() is 
5690: 72 75 6e 20 61 6e 64 20 73 68 69 6d 6d 65 72 73  run and shimmers
56a0: 20 74 68 65 20 66 69 72 73 74 20 65 6c 65 6d 65   the first eleme
56b0: 6e 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  nt.    ** of the
56c0: 20 6c 69 73 74 20 74 6f 20 74 63 6c 43 6d 64 4e   list to tclCmdN
56d0: 61 6d 65 54 79 70 65 2c 20 74 68 61 74 20 61 6c  ameType, that al
56e0: 74 65 72 6e 61 74 65 20 72 65 70 72 65 73 65 6e  ternate represen
56f0: 74 61 74 69 6f 6e 20 77 69 6c 6c 0a 20 20 20 20  tation will.    
5700: 2a 2a 20 62 65 20 70 72 65 73 65 72 76 65 64 20  ** be preserved 
5710: 61 6e 64 20 72 65 75 73 65 64 20 6f 6e 20 74 68  and reused on th
5720: 65 20 6e 65 78 74 20 69 6e 76 6f 63 61 74 69 6f  e next invocatio
5730: 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 54 63  n..    */.    Tc
5740: 6c 5f 4f 62 6a 20 2a 2a 61 41 72 67 3b 0a 20 20  l_Obj **aArg;.  
5750: 20 20 69 6e 74 20 6e 41 72 67 3b 0a 20 20 20 20    int nArg;.    
5760: 69 66 28 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 47  if( Tcl_ListObjG
5770: 65 74 45 6c 65 6d 65 6e 74 73 28 70 2d 3e 69 6e  etElements(p->in
5780: 74 65 72 70 2c 20 70 2d 3e 70 53 63 72 69 70 74  terp, p->pScript
5790: 2c 20 26 6e 41 72 67 2c 20 26 61 41 72 67 29 20  , &nArg, &aArg) 
57a0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
57b0: 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f  _result_error(co
57c0: 6e 74 65 78 74 2c 20 54 63 6c 5f 47 65 74 53 74  ntext, Tcl_GetSt
57d0: 72 69 6e 67 52 65 73 75 6c 74 28 70 2d 3e 69 6e  ringResult(p->in
57e0: 74 65 72 70 29 2c 20 2d 31 29 3b 20 0a 20 20 20  terp), -1); .   
57f0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
5800: 20 20 20 20 20 0a 20 20 20 20 70 43 6d 64 20 3d       .    pCmd =
5810: 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28   Tcl_NewListObj(
5820: 6e 41 72 67 2c 20 61 41 72 67 29 3b 0a 20 20 20  nArg, aArg);.   
5830: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
5840: 74 28 70 43 6d 64 29 3b 0a 20 20 20 20 66 6f 72  t(pCmd);.    for
5850: 28 69 3d 30 3b 20 69 3c 61 72 67 63 3b 20 69 2b  (i=0; i<argc; i+
5860: 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
5870: 33 5f 76 61 6c 75 65 20 2a 70 49 6e 20 3d 20 61  3_value *pIn = a
5880: 72 67 76 5b 69 5d 3b 0a 20 20 20 20 20 20 54 63  rgv[i];.      Tc
5890: 6c 5f 4f 62 6a 20 2a 70 56 61 6c 3b 0a 20 20 20  l_Obj *pVal;.   
58a0: 20 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20           .      
58b0: 2f 2a 20 53 65 74 20 70 56 61 6c 20 74 6f 20 63  /* Set pVal to c
58c0: 6f 6e 74 61 69 6e 20 74 68 65 20 69 27 74 68 20  ontain the i'th 
58d0: 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 69 73 20 72  column of this r
58e0: 6f 77 2e 20 2a 2f 0a 20 20 20 20 20 20 73 77 69  ow. */.      swi
58f0: 74 63 68 28 20 73 71 6c 69 74 65 33 5f 76 61 6c  tch( sqlite3_val
5900: 75 65 5f 74 79 70 65 28 70 49 6e 29 20 29 7b 0a  ue_type(pIn) ){.
5910: 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c          case SQL
5920: 49 54 45 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20  ITE_BLOB: {.    
5930: 20 20 20 20 20 20 69 6e 74 20 62 79 74 65 73 20        int bytes 
5940: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
5950: 62 79 74 65 73 28 70 49 6e 29 3b 0a 20 20 20 20  bytes(pIn);.    
5960: 20 20 20 20 20 20 70 56 61 6c 20 3d 20 54 63 6c        pVal = Tcl
5970: 5f 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a  _NewByteArrayObj
5980: 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62  (sqlite3_value_b
5990: 6c 6f 62 28 70 49 6e 29 2c 20 62 79 74 65 73 29  lob(pIn), bytes)
59a0: 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
59b0: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
59c0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
59d0: 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20  _INTEGER: {.    
59e0: 20 20 20 20 20 20 73 71 6c 69 74 65 5f 69 6e 74        sqlite_int
59f0: 36 34 20 76 20 3d 20 73 71 6c 69 74 65 33 5f 76  64 v = sqlite3_v
5a00: 61 6c 75 65 5f 69 6e 74 36 34 28 70 49 6e 29 3b  alue_int64(pIn);
5a10: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 76  .          if( v
5a20: 3e 3d 2d 32 31 34 37 34 38 33 36 34 37 20 26 26  >=-2147483647 &&
5a30: 20 76 3c 3d 32 31 34 37 34 38 33 36 34 37 20 29   v<=2147483647 )
5a40: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 56  {.            pV
5a50: 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 49 6e 74 4f  al = Tcl_NewIntO
5a60: 62 6a 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20  bj(v);.         
5a70: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
5a80: 20 20 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e      pVal = Tcl_N
5a90: 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 76 29 3b  ewWideIntObj(v);
5aa0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
5ab0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
5ac0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
5ad0: 63 61 73 65 20 53 51 4c 49 54 45 5f 46 4c 4f 41  case SQLITE_FLOA
5ae0: 54 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 64  T: {.          d
5af0: 6f 75 62 6c 65 20 72 20 3d 20 73 71 6c 69 74 65  ouble r = sqlite
5b00: 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65 28 70  3_value_double(p
5b10: 49 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  In);.          p
5b20: 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 44 6f 75  Val = Tcl_NewDou
5b30: 62 6c 65 4f 62 6a 28 72 29 3b 0a 20 20 20 20 20  bleObj(r);.     
5b40: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
5b50: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63 61      }.        ca
5b60: 73 65 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 3a 20  se SQLITE_NULL: 
5b70: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 56 61 6c  {.          pVal
5b80: 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67   = Tcl_NewString
5b90: 4f 62 6a 28 22 22 2c 20 30 29 3b 0a 20 20 20 20  Obj("", 0);.    
5ba0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
5bb0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 64       }.        d
5bc0: 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
5bd0: 20 20 20 20 69 6e 74 20 62 79 74 65 73 20 3d 20      int bytes = 
5be0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79  sqlite3_value_by
5bf0: 74 65 73 28 70 49 6e 29 3b 0a 20 20 20 20 20 20  tes(pIn);.      
5c00: 20 20 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e      pVal = Tcl_N
5c10: 65 77 53 74 72 69 6e 67 4f 62 6a 28 28 63 68 61  ewStringObj((cha
5c20: 72 20 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  r *)sqlite3_valu
5c30: 65 5f 74 65 78 74 28 70 49 6e 29 2c 20 62 79 74  e_text(pIn), byt
5c40: 65 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62  es);.          b
5c50: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
5c60: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63        }.      rc
5c70: 20 3d 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70   = Tcl_ListObjAp
5c80: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 70 2d 3e 69  pendElement(p->i
5c90: 6e 74 65 72 70 2c 20 70 43 6d 64 2c 20 70 56 61  nterp, pCmd, pVa
5ca0: 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  l);.      if( rc
5cb0: 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f   ){.        Tcl_
5cc0: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 43 6d  DecrRefCount(pCm
5cd0: 64 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  d);.        sqli
5ce0: 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72  te3_result_error
5cf0: 28 63 6f 6e 74 65 78 74 2c 20 54 63 6c 5f 47 65  (context, Tcl_Ge
5d00: 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28 70 2d  tStringResult(p-
5d10: 3e 69 6e 74 65 72 70 29 2c 20 2d 31 29 3b 20 0a  >interp), -1); .
5d20: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a          return;.
5d30: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
5d40: 20 20 69 66 28 20 21 70 2d 3e 75 73 65 45 76 61    if( !p->useEva
5d50: 6c 4f 62 6a 76 20 29 7b 0a 20 20 20 20 20 20 2f  lObjv ){.      /
5d60: 2a 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28  * Tcl_EvalObjEx(
5d70: 29 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69 63  ) will automatic
5d80: 61 6c 6c 79 20 63 61 6c 6c 20 54 63 6c 5f 45 76  ally call Tcl_Ev
5d90: 61 6c 4f 62 6a 76 28 29 20 69 66 20 70 43 6d 64  alObjv() if pCmd
5da0: 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 61 20 6c  .      ** is a l
5db0: 69 73 74 20 77 69 74 68 6f 75 74 20 61 20 73 74  ist without a st
5dc0: 72 69 6e 67 20 72 65 70 72 65 73 65 6e 74 61 74  ring representat
5dd0: 69 6f 6e 2e 20 20 54 6f 20 70 72 65 76 65 6e 74  ion.  To prevent
5de0: 20 74 68 69 73 20 66 72 6f 6d 0a 20 20 20 20 20   this from.     
5df0: 20 2a 2a 20 68 61 70 70 65 6e 69 6e 67 2c 20 6d   ** happening, m
5e00: 61 6b 65 20 73 75 72 65 20 70 43 6d 64 20 68 61  ake sure pCmd ha
5e10: 73 20 61 20 76 61 6c 69 64 20 73 74 72 69 6e 67  s a valid string
5e20: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
5e30: 2a 2f 0a 20 20 20 20 20 20 54 63 6c 5f 47 65 74  */.      Tcl_Get
5e40: 53 74 72 69 6e 67 28 70 43 6d 64 29 3b 0a 20 20  String(pCmd);.  
5e50: 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 54 63 6c    }.    rc = Tcl
5e60: 5f 45 76 61 6c 4f 62 6a 45 78 28 70 2d 3e 69 6e  _EvalObjEx(p->in
5e70: 74 65 72 70 2c 20 70 43 6d 64 2c 20 54 43 4c 5f  terp, pCmd, TCL_
5e80: 45 56 41 4c 5f 44 49 52 45 43 54 29 3b 0a 20 20  EVAL_DIRECT);.  
5e90: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
5ea0: 6e 74 28 70 43 6d 64 29 3b 0a 20 20 7d 0a 0a 20  nt(pCmd);.  }.. 
5eb0: 20 69 66 28 20 72 63 20 26 26 20 72 63 21 3d 54   if( rc && rc!=T
5ec0: 43 4c 5f 52 45 54 55 52 4e 20 29 7b 0a 20 20 20  CL_RETURN ){.   
5ed0: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
5ee0: 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20 54  error(context, T
5ef0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75  cl_GetStringResu
5f00: 6c 74 28 70 2d 3e 69 6e 74 65 72 70 29 2c 20 2d  lt(p->interp), -
5f10: 31 29 3b 20 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  1); .  }else{.  
5f20: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 56 61 72 20    Tcl_Obj *pVar 
5f30: 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75  = Tcl_GetObjResu
5f40: 6c 74 28 70 2d 3e 69 6e 74 65 72 70 29 3b 0a 20  lt(p->interp);. 
5f50: 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 75 38     int n;.    u8
5f60: 20 2a 64 61 74 61 3b 0a 20 20 20 20 63 6f 6e 73   *data;.    cons
5f70: 74 20 63 68 61 72 20 2a 7a 54 79 70 65 20 3d 20  t char *zType = 
5f80: 28 70 56 61 72 2d 3e 74 79 70 65 50 74 72 20 3f  (pVar->typePtr ?
5f90: 20 70 56 61 72 2d 3e 74 79 70 65 50 74 72 2d 3e   pVar->typePtr->
5fa0: 6e 61 6d 65 20 3a 20 22 22 29 3b 0a 20 20 20 20  name : "");.    
5fb0: 63 68 61 72 20 63 20 3d 20 7a 54 79 70 65 5b 30  char c = zType[0
5fc0: 5d 3b 0a 20 20 20 20 69 66 28 20 63 3d 3d 27 62  ];.    if( c=='b
5fd0: 27 20 26 26 20 73 74 72 63 6d 70 28 7a 54 79 70  ' && strcmp(zTyp
5fe0: 65 2c 22 62 79 74 65 61 72 72 61 79 22 29 3d 3d  e,"bytearray")==
5ff0: 30 20 26 26 20 70 56 61 72 2d 3e 62 79 74 65 73  0 && pVar->bytes
6000: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ==0 ){.      /* 
6010: 4f 6e 6c 79 20 72 65 74 75 72 6e 20 61 20 42 4c  Only return a BL
6020: 4f 42 20 74 79 70 65 20 69 66 20 74 68 65 20 54  OB type if the T
6030: 63 6c 20 76 61 72 69 61 62 6c 65 20 69 73 20 61  cl variable is a
6040: 20 62 79 74 65 61 72 72 61 79 20 61 6e 64 0a 20   bytearray and. 
6050: 20 20 20 20 20 2a 2a 20 68 61 73 20 6e 6f 20 73       ** has no s
6060: 74 72 69 6e 67 20 72 65 70 72 65 73 65 6e 74 61  tring representa
6070: 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 64  tion. */.      d
6080: 61 74 61 20 3d 20 54 63 6c 5f 47 65 74 42 79 74  ata = Tcl_GetByt
6090: 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 70 56  eArrayFromObj(pV
60a0: 61 72 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 73  ar, &n);.      s
60b0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 62 6c  qlite3_result_bl
60c0: 6f 62 28 63 6f 6e 74 65 78 74 2c 20 64 61 74 61  ob(context, data
60d0: 2c 20 6e 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  , n, SQLITE_TRAN
60e0: 53 49 45 4e 54 29 3b 0a 20 20 20 20 7d 65 6c 73  SIENT);.    }els
60f0: 65 20 69 66 28 20 63 3d 3d 27 62 27 20 26 26 20  e if( c=='b' && 
6100: 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22 62 6f  strcmp(zType,"bo
6110: 6f 6c 65 61 6e 22 29 3d 3d 30 20 29 7b 0a 20 20  olean")==0 ){.  
6120: 20 20 20 20 54 63 6c 5f 47 65 74 49 6e 74 46 72      Tcl_GetIntFr
6130: 6f 6d 4f 62 6a 28 30 2c 20 70 56 61 72 2c 20 26  omObj(0, pVar, &
6140: 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  n);.      sqlite
6150: 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e  3_result_int(con
6160: 74 65 78 74 2c 20 6e 29 3b 0a 20 20 20 20 7d 65  text, n);.    }e
6170: 6c 73 65 20 69 66 28 20 63 3d 3d 27 64 27 20 26  lse if( c=='d' &
6180: 26 20 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22  & strcmp(zType,"
6190: 64 6f 75 62 6c 65 22 29 3d 3d 30 20 29 7b 0a 20  double")==0 ){. 
61a0: 20 20 20 20 20 64 6f 75 62 6c 65 20 72 3b 0a 20       double r;. 
61b0: 20 20 20 20 20 54 63 6c 5f 47 65 74 44 6f 75 62       Tcl_GetDoub
61c0: 6c 65 46 72 6f 6d 4f 62 6a 28 30 2c 20 70 56 61  leFromObj(0, pVa
61d0: 72 2c 20 26 72 29 3b 0a 20 20 20 20 20 20 73 71  r, &r);.      sq
61e0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 64 6f 75  lite3_result_dou
61f0: 62 6c 65 28 63 6f 6e 74 65 78 74 2c 20 72 29 3b  ble(context, r);
6200: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28  .    }else if( (
6210: 63 3d 3d 27 77 27 20 26 26 20 73 74 72 63 6d 70  c=='w' && strcmp
6220: 28 7a 54 79 70 65 2c 22 77 69 64 65 49 6e 74 22  (zType,"wideInt"
6230: 29 3d 3d 30 29 20 7c 7c 0a 20 20 20 20 20 20 20  )==0) ||.       
6240: 20 20 20 28 63 3d 3d 27 69 27 20 26 26 20 73 74     (c=='i' && st
6250: 72 63 6d 70 28 7a 54 79 70 65 2c 22 69 6e 74 22  rcmp(zType,"int"
6260: 29 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 54  )==0) ){.      T
6270: 63 6c 5f 57 69 64 65 49 6e 74 20 76 3b 0a 20 20  cl_WideInt v;.  
6280: 20 20 20 20 54 63 6c 5f 47 65 74 57 69 64 65 49      Tcl_GetWideI
6290: 6e 74 46 72 6f 6d 4f 62 6a 28 30 2c 20 70 56 61  ntFromObj(0, pVa
62a0: 72 2c 20 26 76 29 3b 0a 20 20 20 20 20 20 73 71  r, &v);.      sq
62b0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74  lite3_result_int
62c0: 36 34 28 63 6f 6e 74 65 78 74 2c 20 76 29 3b 0a  64(context, v);.
62d0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
62e0: 20 64 61 74 61 20 3d 20 28 75 6e 73 69 67 6e 65   data = (unsigne
62f0: 64 20 63 68 61 72 20 2a 29 54 63 6c 5f 47 65 74  d char *)Tcl_Get
6300: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 70 56  StringFromObj(pV
6310: 61 72 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 73  ar, &n);.      s
6320: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65  qlite3_result_te
6330: 78 74 28 63 6f 6e 74 65 78 74 2c 20 28 63 68 61  xt(context, (cha
6340: 72 20 2a 29 64 61 74 61 2c 20 6e 2c 20 53 51 4c  r *)data, n, SQL
6350: 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
6360: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 69 66      }.  }.}..#if
6370: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
6380: 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 2f  _AUTHORIZATION./
6390: 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65  *.** This is the
63a0: 20 61 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 20   authentication 
63b0: 66 75 6e 63 74 69 6f 6e 2e 20 20 49 74 20 61 70  function.  It ap
63c0: 70 65 6e 64 73 20 74 68 65 20 61 75 74 68 65 6e  pends the authen
63d0: 74 69 63 61 74 69 6f 6e 0a 2a 2a 20 74 79 70 65  tication.** type
63e0: 20 63 6f 64 65 20 61 6e 64 20 74 68 65 20 74 77   code and the tw
63f0: 6f 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 7a  o arguments to z
6400: 43 6d 64 5b 5d 20 74 68 65 6e 20 69 6e 76 6f 6b  Cmd[] then invok
6410: 65 73 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a  es the result.**
6420: 20 6f 6e 20 74 68 65 20 69 6e 74 65 72 70 72 65   on the interpre
6430: 74 65 72 2e 20 20 54 68 65 20 72 65 70 6c 79 20  ter.  The reply 
6440: 69 73 20 65 78 61 6d 69 6e 65 64 20 74 6f 20 64  is examined to d
6450: 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65 0a  etermine if the.
6460: 2a 2a 20 61 75 74 68 65 6e 74 69 63 61 74 69 6f  ** authenticatio
6470: 6e 20 66 61 69 6c 73 20 6f 72 20 73 75 63 63 65  n fails or succe
6480: 65 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  eds..*/.static i
6490: 6e 74 20 61 75 74 68 5f 63 61 6c 6c 62 61 63 6b  nt auth_callback
64a0: 28 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 2c 0a  (.  void *pArg,.
64b0: 20 20 69 6e 74 20 63 6f 64 65 2c 0a 20 20 63 6f    int code,.  co
64c0: 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67 31 2c  nst char *zArg1,
64d0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
64e0: 41 72 67 32 2c 0a 20 20 63 6f 6e 73 74 20 63 68  Arg2,.  const ch
64f0: 61 72 20 2a 7a 41 72 67 33 2c 0a 20 20 63 6f 6e  ar *zArg3,.  con
6500: 73 74 20 63 68 61 72 20 2a 7a 41 72 67 34 0a 29  st char *zArg4.)
6510: 7b 0a 20 20 63 68 61 72 20 2a 7a 43 6f 64 65 3b  {.  char *zCode;
6520: 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 73  .  Tcl_DString s
6530: 74 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  tr;.  int rc;.  
6540: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52 65 70  const char *zRep
6550: 6c 79 3b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a  ly;.  SqliteDb *
6560: 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62 2a  pDb = (SqliteDb*
6570: 29 70 41 72 67 3b 0a 20 20 69 66 28 20 70 44 62  )pArg;.  if( pDb
6580: 2d 3e 64 69 73 61 62 6c 65 41 75 74 68 20 29 20  ->disableAuth ) 
6590: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
65a0: 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 63 6f 64  ;..  switch( cod
65b0: 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51  e ){.    case SQ
65c0: 4c 49 54 45 5f 43 4f 50 59 20 20 20 20 20 20 20  LITE_COPY       
65d0: 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22         : zCode="
65e0: 53 51 4c 49 54 45 5f 43 4f 50 59 22 3b 20 62 72  SQLITE_COPY"; br
65f0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
6600: 4c 49 54 45 5f 43 52 45 41 54 45 5f 49 4e 44 45  LITE_CREATE_INDE
6610: 58 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22  X      : zCode="
6620: 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 49 4e  SQLITE_CREATE_IN
6630: 44 45 58 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  DEX"; break;.   
6640: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 52 45   case SQLITE_CRE
6650: 41 54 45 5f 54 41 42 4c 45 20 20 20 20 20 20 3a  ATE_TABLE      :
6660: 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43   zCode="SQLITE_C
6670: 52 45 41 54 45 5f 54 41 42 4c 45 22 3b 20 62 72  REATE_TABLE"; br
6680: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
6690: 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50  LITE_CREATE_TEMP
66a0: 5f 49 4e 44 45 58 20 3a 20 7a 43 6f 64 65 3d 22  _INDEX : zCode="
66b0: 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45  SQLITE_CREATE_TE
66c0: 4d 50 5f 49 4e 44 45 58 22 3b 20 62 72 65 61 6b  MP_INDEX"; break
66d0: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
66e0: 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 54 41  E_CREATE_TEMP_TA
66f0: 42 4c 45 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c  BLE : zCode="SQL
6700: 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f  ITE_CREATE_TEMP_
6710: 54 41 42 4c 45 22 3b 20 62 72 65 61 6b 3b 0a 20  TABLE"; break;. 
6720: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
6730: 52 45 41 54 45 5f 54 45 4d 50 5f 54 52 49 47 47  REATE_TEMP_TRIGG
6740: 45 52 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54  ER: zCode="SQLIT
6750: 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 54 52  E_CREATE_TEMP_TR
6760: 49 47 47 45 52 22 3b 20 62 72 65 61 6b 3b 0a 20  IGGER"; break;. 
6770: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
6780: 52 45 41 54 45 5f 54 45 4d 50 5f 56 49 45 57 20  REATE_TEMP_VIEW 
6790: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
67a0: 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 56 49 45  _CREATE_TEMP_VIE
67b0: 57 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  W"; break;.    c
67c0: 61 73 65 20 53 51 4c 49 54 45 5f 43 52 45 41 54  ase SQLITE_CREAT
67d0: 45 5f 54 52 49 47 47 45 52 20 20 20 20 3a 20 7a  E_TRIGGER    : z
67e0: 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43 52 45  Code="SQLITE_CRE
67f0: 41 54 45 5f 54 52 49 47 47 45 52 22 3b 20 62 72  ATE_TRIGGER"; br
6800: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
6810: 4c 49 54 45 5f 43 52 45 41 54 45 5f 56 49 45 57  LITE_CREATE_VIEW
6820: 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22         : zCode="
6830: 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 56 49  SQLITE_CREATE_VI
6840: 45 57 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  EW"; break;.    
6850: 63 61 73 65 20 53 51 4c 49 54 45 5f 44 45 4c 45  case SQLITE_DELE
6860: 54 45 20 20 20 20 20 20 20 20 20 20 20 20 3a 20  TE            : 
6870: 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44 45  zCode="SQLITE_DE
6880: 4c 45 54 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20  LETE"; break;.  
6890: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44 52    case SQLITE_DR
68a0: 4f 50 5f 49 4e 44 45 58 20 20 20 20 20 20 20 20  OP_INDEX        
68b0: 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f  : zCode="SQLITE_
68c0: 44 52 4f 50 5f 49 4e 44 45 58 22 3b 20 62 72 65  DROP_INDEX"; bre
68d0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
68e0: 49 54 45 5f 44 52 4f 50 5f 54 41 42 4c 45 20 20  ITE_DROP_TABLE  
68f0: 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53        : zCode="S
6900: 51 4c 49 54 45 5f 44 52 4f 50 5f 54 41 42 4c 45  QLITE_DROP_TABLE
6910: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
6920: 73 65 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54  se SQLITE_DROP_T
6930: 45 4d 50 5f 49 4e 44 45 58 20 20 20 3a 20 7a 43  EMP_INDEX   : zC
6940: 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50  ode="SQLITE_DROP
6950: 5f 54 45 4d 50 5f 49 4e 44 45 58 22 3b 20 62 72  _TEMP_INDEX"; br
6960: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
6970: 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 54  LITE_DROP_TEMP_T
6980: 41 42 4c 45 20 20 20 3a 20 7a 43 6f 64 65 3d 22  ABLE   : zCode="
6990: 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50  SQLITE_DROP_TEMP
69a0: 5f 54 41 42 4c 45 22 3b 20 62 72 65 61 6b 3b 0a  _TABLE"; break;.
69b0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
69c0: 44 52 4f 50 5f 54 45 4d 50 5f 54 52 49 47 47 45  DROP_TEMP_TRIGGE
69d0: 52 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54  R : zCode="SQLIT
69e0: 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 54 52 49 47  E_DROP_TEMP_TRIG
69f0: 47 45 52 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  GER"; break;.   
6a00: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44 52 4f   case SQLITE_DRO
6a10: 50 5f 54 45 4d 50 5f 56 49 45 57 20 20 20 20 3a  P_TEMP_VIEW    :
6a20: 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44   zCode="SQLITE_D
6a30: 52 4f 50 5f 54 45 4d 50 5f 56 49 45 57 22 3b 20  ROP_TEMP_VIEW"; 
6a40: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
6a50: 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 52 49 47  SQLITE_DROP_TRIG
6a60: 47 45 52 20 20 20 20 20 20 3a 20 7a 43 6f 64 65  GER      : zCode
6a70: 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 52  ="SQLITE_DROP_TR
6a80: 49 47 47 45 52 22 3b 20 62 72 65 61 6b 3b 0a 20  IGGER"; break;. 
6a90: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44     case SQLITE_D
6aa0: 52 4f 50 5f 56 49 45 57 20 20 20 20 20 20 20 20  ROP_VIEW        
6ab0: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
6ac0: 5f 44 52 4f 50 5f 56 49 45 57 22 3b 20 62 72 65  _DROP_VIEW"; bre
6ad0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
6ae0: 49 54 45 5f 49 4e 53 45 52 54 20 20 20 20 20 20  ITE_INSERT      
6af0: 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53        : zCode="S
6b00: 51 4c 49 54 45 5f 49 4e 53 45 52 54 22 3b 20 62  QLITE_INSERT"; b
6b10: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
6b20: 51 4c 49 54 45 5f 50 52 41 47 4d 41 20 20 20 20  QLITE_PRAGMA    
6b30: 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d          : zCode=
6b40: 22 53 51 4c 49 54 45 5f 50 52 41 47 4d 41 22 3b  "SQLITE_PRAGMA";
6b50: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
6b60: 20 53 51 4c 49 54 45 5f 52 45 41 44 20 20 20 20   SQLITE_READ    
6b70: 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64            : zCod
6b80: 65 3d 22 53 51 4c 49 54 45 5f 52 45 41 44 22 3b  e="SQLITE_READ";
6b90: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
6ba0: 20 53 51 4c 49 54 45 5f 53 45 4c 45 43 54 20 20   SQLITE_SELECT  
6bb0: 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64            : zCod
6bc0: 65 3d 22 53 51 4c 49 54 45 5f 53 45 4c 45 43 54  e="SQLITE_SELECT
6bd0: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
6be0: 73 65 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 41  se SQLITE_TRANSA
6bf0: 43 54 49 4f 4e 20 20 20 20 20 20 20 3a 20 7a 43  CTION       : zC
6c00: 6f 64 65 3d 22 53 51 4c 49 54 45 5f 54 52 41 4e  ode="SQLITE_TRAN
6c10: 53 41 43 54 49 4f 4e 22 3b 20 62 72 65 61 6b 3b  SACTION"; break;
6c20: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
6c30: 5f 55 50 44 41 54 45 20 20 20 20 20 20 20 20 20  _UPDATE         
6c40: 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49     : zCode="SQLI
6c50: 54 45 5f 55 50 44 41 54 45 22 3b 20 62 72 65 61  TE_UPDATE"; brea
6c60: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
6c70: 54 45 5f 41 54 54 41 43 48 20 20 20 20 20 20 20  TE_ATTACH       
6c80: 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51       : zCode="SQ
6c90: 4c 49 54 45 5f 41 54 54 41 43 48 22 3b 20 62 72  LITE_ATTACH"; br
6ca0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
6cb0: 4c 49 54 45 5f 44 45 54 41 43 48 20 20 20 20 20  LITE_DETACH     
6cc0: 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22         : zCode="
6cd0: 53 51 4c 49 54 45 5f 44 45 54 41 43 48 22 3b 20  SQLITE_DETACH"; 
6ce0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
6cf0: 53 51 4c 49 54 45 5f 41 4c 54 45 52 5f 54 41 42  SQLITE_ALTER_TAB
6d00: 4c 45 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65  LE       : zCode
6d10: 3d 22 53 51 4c 49 54 45 5f 41 4c 54 45 52 5f 54  ="SQLITE_ALTER_T
6d20: 41 42 4c 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20  ABLE"; break;.  
6d30: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 52 45    case SQLITE_RE
6d40: 49 4e 44 45 58 20 20 20 20 20 20 20 20 20 20 20  INDEX           
6d50: 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f  : zCode="SQLITE_
6d60: 52 45 49 4e 44 45 58 22 3b 20 62 72 65 61 6b 3b  REINDEX"; break;
6d70: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
6d80: 5f 41 4e 41 4c 59 5a 45 20 20 20 20 20 20 20 20  _ANALYZE        
6d90: 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49     : zCode="SQLI
6da0: 54 45 5f 41 4e 41 4c 59 5a 45 22 3b 20 62 72 65  TE_ANALYZE"; bre
6db0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
6dc0: 49 54 45 5f 43 52 45 41 54 45 5f 56 54 41 42 4c  ITE_CREATE_VTABL
6dd0: 45 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53  E     : zCode="S
6de0: 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 56 54 41  QLITE_CREATE_VTA
6df0: 42 4c 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  BLE"; break;.   
6e00: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44 52 4f   case SQLITE_DRO
6e10: 50 5f 56 54 41 42 4c 45 20 20 20 20 20 20 20 3a  P_VTABLE       :
6e20: 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44   zCode="SQLITE_D
6e30: 52 4f 50 5f 56 54 41 42 4c 45 22 3b 20 62 72 65  ROP_VTABLE"; bre
6e40: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
6e50: 49 54 45 5f 46 55 4e 43 54 49 4f 4e 20 20 20 20  ITE_FUNCTION    
6e60: 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53        : zCode="S
6e70: 51 4c 49 54 45 5f 46 55 4e 43 54 49 4f 4e 22 3b  QLITE_FUNCTION";
6e80: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
6e90: 20 53 51 4c 49 54 45 5f 53 41 56 45 50 4f 49 4e   SQLITE_SAVEPOIN
6ea0: 54 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64  T         : zCod
6eb0: 65 3d 22 53 51 4c 49 54 45 5f 53 41 56 45 50 4f  e="SQLITE_SAVEPO
6ec0: 49 4e 54 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  INT"; break;.   
6ed0: 20 64 65 66 61 75 6c 74 20 20 20 20 20 20 20 20   default        
6ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3a                 :
6ef0: 20 7a 43 6f 64 65 3d 22 3f 3f 3f 3f 22 3b 20 62   zCode="????"; b
6f00: 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f  reak;.  }.  Tcl_
6f10: 44 53 74 72 69 6e 67 49 6e 69 74 28 26 73 74 72  DStringInit(&str
6f20: 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  );.  Tcl_DString
6f30: 41 70 70 65 6e 64 28 26 73 74 72 2c 20 70 44 62  Append(&str, pDb
6f40: 2d 3e 7a 41 75 74 68 2c 20 2d 31 29 3b 0a 20 20  ->zAuth, -1);.  
6f50: 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e  Tcl_DStringAppen
6f60: 64 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c 20 7a  dElement(&str, z
6f70: 43 6f 64 65 29 3b 0a 20 20 54 63 6c 5f 44 53 74  Code);.  Tcl_DSt
6f80: 72 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e  ringAppendElemen
6f90: 74 28 26 73 74 72 2c 20 7a 41 72 67 31 20 3f 20  t(&str, zArg1 ? 
6fa0: 7a 41 72 67 31 20 3a 20 22 22 29 3b 0a 20 20 54  zArg1 : "");.  T
6fb0: 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64  cl_DStringAppend
6fc0: 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c 20 7a 41  Element(&str, zA
6fd0: 72 67 32 20 3f 20 7a 41 72 67 32 20 3a 20 22 22  rg2 ? zArg2 : ""
6fe0: 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  );.  Tcl_DString
6ff0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 26 73  AppendElement(&s
7000: 74 72 2c 20 7a 41 72 67 33 20 3f 20 7a 41 72 67  tr, zArg3 ? zArg
7010: 33 20 3a 20 22 22 29 3b 0a 20 20 54 63 6c 5f 44  3 : "");.  Tcl_D
7020: 53 74 72 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d  StringAppendElem
7030: 65 6e 74 28 26 73 74 72 2c 20 7a 41 72 67 34 20  ent(&str, zArg4 
7040: 3f 20 7a 41 72 67 34 20 3a 20 22 22 29 3b 0a 20  ? zArg4 : "");. 
7050: 20 72 63 20 3d 20 54 63 6c 5f 47 6c 6f 62 61 6c   rc = Tcl_Global
7060: 45 76 61 6c 28 70 44 62 2d 3e 69 6e 74 65 72 70  Eval(pDb->interp
7070: 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c  , Tcl_DStringVal
7080: 75 65 28 26 73 74 72 29 29 3b 0a 20 20 54 63 6c  ue(&str));.  Tcl
7090: 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 73 74  _DStringFree(&st
70a0: 72 29 3b 0a 20 20 7a 52 65 70 6c 79 20 3d 20 54  r);.  zReply = T
70b0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75  cl_GetStringResu
70c0: 6c 74 28 70 44 62 2d 3e 69 6e 74 65 72 70 29 3b  lt(pDb->interp);
70d0: 0a 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 52  .  if( strcmp(zR
70e0: 65 70 6c 79 2c 22 53 51 4c 49 54 45 5f 4f 4b 22  eply,"SQLITE_OK"
70f0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  )==0 ){.    rc =
7100: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65   SQLITE_OK;.  }e
7110: 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a  lse if( strcmp(z
7120: 52 65 70 6c 79 2c 22 53 51 4c 49 54 45 5f 44 45  Reply,"SQLITE_DE
7130: 4e 59 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72  NY")==0 ){.    r
7140: 63 20 3d 20 53 51 4c 49 54 45 5f 44 45 4e 59 3b  c = SQLITE_DENY;
7150: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72  .  }else if( str
7160: 63 6d 70 28 7a 52 65 70 6c 79 2c 22 53 51 4c 49  cmp(zReply,"SQLI
7170: 54 45 5f 49 47 4e 4f 52 45 22 29 3d 3d 30 20 29  TE_IGNORE")==0 )
7180: 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
7190: 45 5f 49 47 4e 4f 52 45 3b 0a 20 20 7d 65 6c 73  E_IGNORE;.  }els
71a0: 65 7b 0a 20 20 20 20 72 63 20 3d 20 39 39 39 3b  e{.    rc = 999;
71b0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
71c0: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
71d0: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52  LITE_OMIT_AUTHOR
71e0: 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 2f 2a 0a 2a  IZATION */../*.*
71f0: 2a 20 7a 54 65 78 74 20 69 73 20 61 20 70 6f 69  * zText is a poi
7200: 6e 74 65 72 20 74 6f 20 74 65 78 74 20 6f 62 74  nter to text obt
7210: 61 69 6e 65 64 20 76 69 61 20 61 6e 20 73 71 6c  ained via an sql
7220: 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74  ite3_result_text
7230: 28 29 0a 2a 2a 20 6f 72 20 73 69 6d 69 6c 61 72  ().** or similar
7240: 20 69 6e 74 65 72 66 61 63 65 2e 20 54 68 69 73   interface. This
7250: 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
7260: 20 61 20 54 63 6c 20 73 74 72 69 6e 67 20 6f 62   a Tcl string ob
7270: 6a 65 63 74 2c 20 0a 2a 2a 20 72 65 66 65 72 65  ject, .** refere
7280: 6e 63 65 20 63 6f 75 6e 74 20 73 65 74 20 74 6f  nce count set to
7290: 20 30 2c 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74   0, containing t
72a0: 68 65 20 74 65 78 74 2e 20 49 66 20 61 20 74 72  he text. If a tr
72b0: 61 6e 73 6c 61 74 69 6f 6e 0a 2a 2a 20 62 65 74  anslation.** bet
72c0: 77 65 65 6e 20 69 73 6f 38 38 35 39 20 61 6e 64  ween iso8859 and
72d0: 20 55 54 46 2d 38 20 69 73 20 72 65 71 75 69 72   UTF-8 is requir
72e0: 65 64 2c 20 69 74 20 69 73 20 70 72 65 66 6f 72  ed, it is prefor
72f0: 6d 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 54  med..*/.static T
7300: 63 6c 5f 4f 62 6a 20 2a 64 62 54 65 78 74 54 6f  cl_Obj *dbTextTo
7310: 4f 62 6a 28 63 68 61 72 20 63 6f 6e 73 74 20 2a  Obj(char const *
7320: 7a 54 65 78 74 29 7b 0a 20 20 54 63 6c 5f 4f 62  zText){.  Tcl_Ob
7330: 6a 20 2a 70 56 61 6c 3b 0a 23 69 66 64 65 66 20  j *pVal;.#ifdef 
7340: 55 54 46 5f 54 52 41 4e 53 4c 41 54 49 4f 4e 5f  UTF_TRANSLATION_
7350: 4e 45 45 44 45 44 0a 20 20 54 63 6c 5f 44 53 74  NEEDED.  Tcl_DSt
7360: 72 69 6e 67 20 64 43 6f 6c 3b 0a 20 20 54 63 6c  ring dCol;.  Tcl
7370: 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 64 43  _DStringInit(&dC
7380: 6f 6c 29 3b 0a 20 20 54 63 6c 5f 45 78 74 65 72  ol);.  Tcl_Exter
7390: 6e 61 6c 54 6f 55 74 66 44 53 74 72 69 6e 67 28  nalToUtfDString(
73a0: 4e 55 4c 4c 2c 20 7a 54 65 78 74 2c 20 2d 31 2c  NULL, zText, -1,
73b0: 20 26 64 43 6f 6c 29 3b 0a 20 20 70 56 61 6c 20   &dCol);.  pVal 
73c0: 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  = Tcl_NewStringO
73d0: 62 6a 28 54 63 6c 5f 44 53 74 72 69 6e 67 56 61  bj(Tcl_DStringVa
73e0: 6c 75 65 28 26 64 43 6f 6c 29 2c 20 2d 31 29 3b  lue(&dCol), -1);
73f0: 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72  .  Tcl_DStringFr
7400: 65 65 28 26 64 43 6f 6c 29 3b 0a 23 65 6c 73 65  ee(&dCol);.#else
7410: 0a 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65  .  pVal = Tcl_Ne
7420: 77 53 74 72 69 6e 67 4f 62 6a 28 7a 54 65 78 74  wStringObj(zText
7430: 2c 20 2d 31 29 3b 0a 23 65 6e 64 69 66 0a 20 20  , -1);.#endif.  
7440: 72 65 74 75 72 6e 20 70 56 61 6c 3b 0a 7d 0a 0a  return pVal;.}..
7450: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
7460: 6e 65 20 72 65 61 64 73 20 61 20 6c 69 6e 65 20  ne reads a line 
7470: 6f 66 20 74 65 78 74 20 66 72 6f 6d 20 46 49 4c  of text from FIL
7480: 45 20 69 6e 2c 20 73 74 6f 72 65 73 0a 2a 2a 20  E in, stores.** 
7490: 74 68 65 20 74 65 78 74 20 69 6e 20 6d 65 6d 6f  the text in memo
74a0: 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ry obtained from
74b0: 20 6d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 72 65   malloc() and re
74c0: 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 0a  turns a pointer.
74d0: 2a 2a 20 74 6f 20 74 68 65 20 74 65 78 74 2e 20  ** to the text. 
74e0: 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65   NULL is returne
74f0: 64 20 61 74 20 65 6e 64 20 6f 66 20 66 69 6c 65  d at end of file
7500: 2c 20 6f 72 20 69 66 20 6d 61 6c 6c 6f 63 28 29  , or if malloc()
7510: 0a 2a 2a 20 66 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a  .** fails..**.**
7520: 20 54 68 65 20 69 6e 74 65 72 66 61 63 65 20 69   The interface i
7530: 73 20 6c 69 6b 65 20 22 72 65 61 64 6c 69 6e 65  s like "readline
7540: 22 20 62 75 74 20 6e 6f 20 63 6f 6d 6d 61 6e 64  " but no command
7550: 2d 6c 69 6e 65 20 65 64 69 74 69 6e 67 0a 2a 2a  -line editing.**
7560: 20 69 73 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20   is done..**.** 
7570: 63 6f 70 69 65 64 20 66 72 6f 6d 20 73 68 65 6c  copied from shel
7580: 6c 2e 63 20 66 72 6f 6d 20 27 2e 69 6d 70 6f 72  l.c from '.impor
7590: 74 27 20 63 6f 6d 6d 61 6e 64 0a 2a 2f 0a 73 74  t' command.*/.st
75a0: 61 74 69 63 20 63 68 61 72 20 2a 6c 6f 63 61 6c  atic char *local
75b0: 5f 67 65 74 6c 69 6e 65 28 63 68 61 72 20 2a 7a  _getline(char *z
75c0: 50 72 6f 6d 70 74 2c 20 46 49 4c 45 20 2a 69 6e  Prompt, FILE *in
75d0: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4c 69 6e 65  ){.  char *zLine
75e0: 3b 0a 20 20 69 6e 74 20 6e 4c 69 6e 65 3b 0a 20  ;.  int nLine;. 
75f0: 20 69 6e 74 20 6e 3b 0a 20 20 69 6e 74 20 65 6f   int n;.  int eo
7600: 6c 3b 0a 0a 20 20 6e 4c 69 6e 65 20 3d 20 31 30  l;..  nLine = 10
7610: 30 3b 0a 20 20 7a 4c 69 6e 65 20 3d 20 6d 61 6c  0;.  zLine = mal
7620: 6c 6f 63 28 20 6e 4c 69 6e 65 20 29 3b 0a 20 20  loc( nLine );.  
7630: 69 66 28 20 7a 4c 69 6e 65 3d 3d 30 20 29 20 72  if( zLine==0 ) r
7640: 65 74 75 72 6e 20 30 3b 0a 20 20 6e 20 3d 20 30  eturn 0;.  n = 0
7650: 3b 0a 20 20 65 6f 6c 20 3d 20 30 3b 0a 20 20 77  ;.  eol = 0;.  w
7660: 68 69 6c 65 28 20 21 65 6f 6c 20 29 7b 0a 20 20  hile( !eol ){.  
7670: 20 20 69 66 28 20 6e 2b 31 30 30 3e 6e 4c 69 6e    if( n+100>nLin
7680: 65 20 29 7b 0a 20 20 20 20 20 20 6e 4c 69 6e 65  e ){.      nLine
7690: 20 3d 20 6e 4c 69 6e 65 2a 32 20 2b 20 31 30 30   = nLine*2 + 100
76a0: 3b 0a 20 20 20 20 20 20 7a 4c 69 6e 65 20 3d 20  ;.      zLine = 
76b0: 72 65 61 6c 6c 6f 63 28 7a 4c 69 6e 65 2c 20 6e  realloc(zLine, n
76c0: 4c 69 6e 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Line);.      if(
76d0: 20 7a 4c 69 6e 65 3d 3d 30 20 29 20 72 65 74 75   zLine==0 ) retu
76e0: 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 0;.    }.    
76f0: 69 66 28 20 66 67 65 74 73 28 26 7a 4c 69 6e 65  if( fgets(&zLine
7700: 5b 6e 5d 2c 20 6e 4c 69 6e 65 20 2d 20 6e 2c 20  [n], nLine - n, 
7710: 69 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  in)==0 ){.      
7720: 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  if( n==0 ){.    
7730: 20 20 20 20 66 72 65 65 28 7a 4c 69 6e 65 29 3b      free(zLine);
7740: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
7750: 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
7760: 20 7a 4c 69 6e 65 5b 6e 5d 20 3d 20 30 3b 0a 20   zLine[n] = 0;. 
7770: 20 20 20 20 20 65 6f 6c 20 3d 20 31 3b 0a 20 20       eol = 1;.  
7780: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
7790: 0a 20 20 20 20 77 68 69 6c 65 28 20 7a 4c 69 6e  .    while( zLin
77a0: 65 5b 6e 5d 20 29 7b 20 6e 2b 2b 3b 20 7d 0a 20  e[n] ){ n++; }. 
77b0: 20 20 20 69 66 28 20 6e 3e 30 20 26 26 20 7a 4c     if( n>0 && zL
77c0: 69 6e 65 5b 6e 2d 31 5d 3d 3d 27 5c 6e 27 20 29  ine[n-1]=='\n' )
77d0: 7b 0a 20 20 20 20 20 20 6e 2d 2d 3b 0a 20 20 20  {.      n--;.   
77e0: 20 20 20 7a 4c 69 6e 65 5b 6e 5d 20 3d 20 30 3b     zLine[n] = 0;
77f0: 0a 20 20 20 20 20 20 65 6f 6c 20 3d 20 31 3b 0a  .      eol = 1;.
7800: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 7a 4c 69 6e      }.  }.  zLin
7810: 65 20 3d 20 72 65 61 6c 6c 6f 63 28 20 7a 4c 69  e = realloc( zLi
7820: 6e 65 2c 20 6e 2b 31 20 29 3b 0a 20 20 72 65 74  ne, n+1 );.  ret
7830: 75 72 6e 20 7a 4c 69 6e 65 3b 0a 7d 0a 0a 0a 2f  urn zLine;.}.../
7840: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
7850: 6f 6e 20 69 73 20 70 61 72 74 20 6f 66 20 74 68  on is part of th
7860: 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
7870: 20 6f 66 20 74 68 65 20 63 6f 6d 6d 61 6e 64 3a   of the command:
7880: 0a 2a 2a 0a 2a 2a 20 20 20 24 64 62 20 74 72 61  .**.**   $db tra
7890: 6e 73 61 63 74 69 6f 6e 20 5b 2d 64 65 66 65 72  nsaction [-defer
78a0: 72 65 64 7c 2d 69 6d 6d 65 64 69 61 74 65 7c 2d  red|-immediate|-
78b0: 65 78 63 6c 75 73 69 76 65 5d 20 53 43 52 49 50  exclusive] SCRIP
78c0: 54 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 69 6e  T.**.** It is in
78d0: 76 6f 6b 65 64 20 61 66 74 65 72 20 65 76 61 6c  voked after eval
78e0: 75 61 74 69 6e 67 20 74 68 65 20 73 63 72 69 70  uating the scrip
78f0: 74 20 53 43 52 49 50 54 20 74 6f 20 63 6f 6d 6d  t SCRIPT to comm
7900: 69 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 0a 2a  it or rollback.*
7910: 2a 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  * the transactio
7920: 6e 20 6f 72 20 73 61 76 65 70 6f 69 6e 74 20 6f  n or savepoint o
7930: 70 65 6e 65 64 20 62 79 20 74 68 65 20 5b 74 72  pened by the [tr
7940: 61 6e 73 61 63 74 69 6f 6e 5d 20 63 6f 6d 6d 61  ansaction] comma
7950: 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nd..*/.static in
7960: 74 20 44 62 54 72 61 6e 73 50 6f 73 74 43 6d 64  t DbTransPostCmd
7970: 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 64  (.  ClientData d
7980: 61 74 61 5b 5d 2c 20 20 20 20 20 20 20 20 20 20  ata[],          
7990: 20 20 20 20 20 20 20 20 20 2f 2a 20 64 61 74 61           /* data
79a0: 5b 30 5d 20 69 73 20 74 68 65 20 53 71 6c 69 74  [0] is the Sqlit
79b0: 65 33 44 62 2a 20 66 6f 72 20 24 64 62 20 2a 2f  e3Db* for $db */
79c0: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
79d0: 6e 74 65 72 70 2c 20 20 20 20 20 20 20 20 20 20  nterp,          
79e0: 20 20 20 20 20 20 20 20 2f 2a 20 54 63 6c 20 69          /* Tcl i
79f0: 6e 74 65 72 70 72 65 74 65 72 20 2a 2f 0a 20 20  nterpreter */.  
7a00: 69 6e 74 20 72 65 73 75 6c 74 20 20 20 20 20 20  int result      
7a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7a20: 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 6f       /* Result o
7a30: 66 20 65 76 61 6c 75 61 74 69 6e 67 20 53 43 52  f evaluating SCR
7a40: 49 50 54 20 2a 2f 0a 29 7b 0a 20 20 73 74 61 74  IPT */.){.  stat
7a50: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61  ic const char *a
7a60: 7a 45 6e 64 5b 5d 20 3d 20 7b 0a 20 20 20 20 22  zEnd[] = {.    "
7a70: 52 45 4c 45 41 53 45 20 5f 74 63 6c 5f 74 72 61  RELEASE _tcl_tra
7a80: 6e 73 61 63 74 69 6f 6e 22 2c 20 20 20 20 20 20  nsaction",      
7a90: 20 20 2f 2a 20 72 63 3d 3d 54 43 4c 5f 45 52 52    /* rc==TCL_ERR
7aa0: 4f 52 2c 20 6e 54 72 61 6e 73 61 63 74 69 6f 6e  OR, nTransaction
7ab0: 21 3d 30 20 2a 2f 0a 20 20 20 20 22 43 4f 4d 4d  !=0 */.    "COMM
7ac0: 49 54 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  IT",            
7ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7ae0: 20 72 63 21 3d 54 43 4c 5f 45 52 52 4f 52 2c 20   rc!=TCL_ERROR, 
7af0: 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 30 20  nTransaction==0 
7b00: 2a 2f 0a 20 20 20 20 22 52 4f 4c 4c 42 41 43 4b  */.    "ROLLBACK
7b10: 20 54 4f 20 5f 74 63 6c 5f 74 72 61 6e 73 61 63   TO _tcl_transac
7b20: 74 69 6f 6e 20 3b 20 52 45 4c 45 41 53 45 20 5f  tion ; RELEASE _
7b30: 74 63 6c 5f 74 72 61 6e 73 61 63 74 69 6f 6e 22  tcl_transaction"
7b40: 2c 0a 20 20 20 20 22 52 4f 4c 4c 42 41 43 4b 22  ,.    "ROLLBACK"
7b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7b60: 20 20 20 20 20 20 20 20 20 2f 2a 20 72 63 3d 3d           /* rc==
7b70: 54 43 4c 5f 45 52 52 4f 52 2c 20 6e 54 72 61 6e  TCL_ERROR, nTran
7b80: 73 61 63 74 69 6f 6e 3d 3d 30 20 2a 2f 0a 20 20  saction==0 */.  
7b90: 7d 3b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70  };.  SqliteDb *p
7ba0: 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29  Db = (SqliteDb*)
7bb0: 64 61 74 61 5b 30 5d 3b 0a 20 20 69 6e 74 20 72  data[0];.  int r
7bc0: 63 20 3d 20 72 65 73 75 6c 74 3b 0a 20 20 63 6f  c = result;.  co
7bd0: 6e 73 74 20 63 68 61 72 20 2a 7a 45 6e 64 3b 0a  nst char *zEnd;.
7be0: 0a 20 20 70 44 62 2d 3e 6e 54 72 61 6e 73 61 63  .  pDb->nTransac
7bf0: 74 69 6f 6e 2d 2d 3b 0a 20 20 7a 45 6e 64 20 3d  tion--;.  zEnd =
7c00: 20 61 7a 45 6e 64 5b 28 72 63 3d 3d 54 43 4c 5f   azEnd[(rc==TCL_
7c10: 45 52 52 4f 52 29 2a 32 20 2b 20 28 70 44 62 2d  ERROR)*2 + (pDb-
7c20: 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 30  >nTransaction==0
7c30: 29 5d 3b 0a 0a 20 20 70 44 62 2d 3e 64 69 73 61  )];..  pDb->disa
7c40: 62 6c 65 41 75 74 68 2b 2b 3b 0a 20 20 69 66 28  bleAuth++;.  if(
7c50: 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 44   sqlite3_exec(pD
7c60: 62 2d 3e 64 62 2c 20 7a 45 6e 64 2c 20 30 2c 20  b->db, zEnd, 0, 
7c70: 30 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 2f  0, 0) ){.      /
7c80: 2a 20 54 68 69 73 20 69 73 20 61 20 74 72 69 63  * This is a tric
7c90: 6b 79 20 73 63 65 6e 61 72 69 6f 20 74 6f 20 68  ky scenario to h
7ca0: 61 6e 64 6c 65 2e 20 54 68 65 20 6d 6f 73 74 20  andle. The most 
7cb0: 6c 69 6b 65 6c 79 20 63 61 75 73 65 20 6f 66 20  likely cause of 
7cc0: 61 6e 0a 20 20 20 20 20 20 2a 2a 20 65 72 72 6f  an.      ** erro
7cd0: 72 20 69 73 20 74 68 61 74 20 74 68 65 20 65 78  r is that the ex
7ce0: 65 63 28 29 20 61 62 6f 76 65 20 77 61 73 20 61  ec() above was a
7cf0: 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 63 6f 6d  n attempt to com
7d00: 6d 69 74 20 74 68 65 20 0a 20 20 20 20 20 20 2a  mit the .      *
7d10: 2a 20 74 6f 70 2d 6c 65 76 65 6c 20 74 72 61 6e  * top-level tran
7d20: 73 61 63 74 69 6f 6e 20 74 68 61 74 20 72 65 74  saction that ret
7d30: 75 72 6e 65 64 20 53 51 4c 49 54 45 5f 42 55 53  urned SQLITE_BUS
7d40: 59 2e 20 4f 72 2c 20 6c 65 73 73 20 6c 69 6b 65  Y. Or, less like
7d50: 6c 79 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 61  ly,.      ** tha
7d60: 74 20 61 6e 20 49 4f 2d 65 72 72 6f 72 20 68 61  t an IO-error ha
7d70: 73 20 6f 63 63 75 72 65 64 2e 20 49 6e 20 65 69  s occured. In ei
7d80: 74 68 65 72 20 63 61 73 65 2c 20 74 68 72 6f 77  ther case, throw
7d90: 20 61 20 54 63 6c 20 65 78 63 65 70 74 69 6f 6e   a Tcl exception
7da0: 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 74 72  .      ** and tr
7db0: 79 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68  y to rollback th
7dc0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20  e transaction.. 
7dd0: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
7de0: 20 42 75 74 20 69 74 20 63 6f 75 6c 64 20 61 6c   But it could al
7df0: 73 6f 20 62 65 20 74 68 61 74 20 74 68 65 20 75  so be that the u
7e00: 73 65 72 20 65 78 65 63 75 74 65 64 20 6f 6e 65  ser executed one
7e10: 20 6f 72 20 6d 6f 72 65 20 42 45 47 49 4e 2c 20   or more BEGIN, 
7e20: 0a 20 20 20 20 20 20 2a 2a 20 43 4f 4d 4d 49 54  .      ** COMMIT
7e30: 2c 20 53 41 56 45 50 4f 49 4e 54 2c 20 52 45 4c  , SAVEPOINT, REL
7e40: 45 41 53 45 20 6f 72 20 52 4f 4c 4c 42 41 43 4b  EASE or ROLLBACK
7e50: 20 63 6f 6d 6d 61 6e 64 73 20 74 68 61 74 20 61   commands that a
7e60: 72 65 20 63 6f 6e 66 75 73 69 6e 67 0a 20 20 20  re confusing.   
7e70: 20 20 20 2a 2a 20 74 68 69 73 20 6d 65 74 68 6f     ** this metho
7e80: 64 27 73 20 6c 6f 67 69 63 2e 20 4e 6f 74 20 63  d's logic. Not c
7e90: 6c 65 61 72 20 68 6f 77 20 74 68 69 73 20 77 6f  lear how this wo
7ea0: 75 6c 64 20 62 65 20 62 65 73 74 20 68 61 6e 64  uld be best hand
7eb0: 6c 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  led..      */.  
7ec0: 20 20 69 66 28 20 72 63 21 3d 54 43 4c 5f 45 52    if( rc!=TCL_ER
7ed0: 52 4f 52 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  ROR ){.      Tcl
7ee0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
7ef0: 74 65 72 70 2c 20 73 71 6c 69 74 65 33 5f 65 72  terp, sqlite3_er
7f00: 72 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c 20 30  rmsg(pDb->db), 0
7f10: 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 54 43  );.      rc = TC
7f20: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
7f30: 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28     sqlite3_exec(
7f40: 70 44 62 2d 3e 64 62 2c 20 22 52 4f 4c 4c 42 41  pDb->db, "ROLLBA
7f50: 43 4b 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  CK", 0, 0, 0);. 
7f60: 20 7d 0a 20 20 70 44 62 2d 3e 64 69 73 61 62 6c   }.  pDb->disabl
7f70: 65 41 75 74 68 2d 2d 3b 0a 0a 20 20 72 65 74 75  eAuth--;..  retu
7f80: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
7f90: 53 65 61 72 63 68 20 74 68 65 20 63 61 63 68 65  Search the cache
7fa0: 20 66 6f 72 20 61 20 70 72 65 70 61 72 65 64 2d   for a prepared-
7fb0: 73 74 61 74 65 6d 65 6e 74 20 6f 62 6a 65 63 74  statement object
7fc0: 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73   that implements
7fd0: 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 53 51   the.** first SQ
7fe0: 4c 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 74  L statement in t
7ff0: 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65  he buffer pointe
8000: 64 20 74 6f 20 62 79 20 70 61 72 61 6d 65 74 65  d to by paramete
8010: 72 20 7a 49 6e 2e 20 49 66 0a 2a 2a 20 6e 6f 20  r zIn. If.** no 
8020: 73 75 63 68 20 70 72 65 70 61 72 65 64 2d 73 74  such prepared-st
8030: 61 74 65 6d 65 6e 74 20 63 61 6e 20 62 65 20 66  atement can be f
8040: 6f 75 6e 64 2c 20 61 6c 6c 6f 63 61 74 65 20 61  ound, allocate a
8050: 6e 64 20 70 72 65 70 61 72 65 20 61 20 6e 65 77  nd prepare a new
8060: 0a 2a 2a 20 6f 6e 65 2e 20 49 6e 20 65 69 74 68  .** one. In eith
8070: 65 72 20 63 61 73 65 2c 20 62 69 6e 64 20 74 68  er case, bind th
8080: 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 73  e current values
8090: 20 6f 66 20 74 68 65 20 72 65 6c 65 76 61 6e 74   of the relevant
80a0: 20 54 63 6c 0a 2a 2a 20 76 61 72 69 61 62 6c 65   Tcl.** variable
80b0: 73 20 74 6f 20 61 6e 79 20 24 76 61 72 2c 20 3a  s to any $var, :
80c0: 76 61 72 20 6f 72 20 40 76 61 72 20 76 61 72 69  var or @var vari
80d0: 61 62 6c 65 73 20 69 6e 20 74 68 65 20 73 74 61  ables in the sta
80e0: 74 65 6d 65 6e 74 2e 20 42 65 66 6f 72 65 0a 2a  tement. Before.*
80f0: 2a 20 72 65 74 75 72 6e 69 6e 67 2c 20 73 65 74  * returning, set
8100: 20 2a 70 70 50 72 65 53 74 6d 74 20 74 6f 20 70   *ppPreStmt to p
8110: 6f 69 6e 74 20 74 6f 20 74 68 65 20 70 72 65 70  oint to the prep
8120: 61 72 65 64 2d 73 74 61 74 65 6d 65 6e 74 20 6f  ared-statement o
8130: 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 4f 75 74  bject..**.** Out
8140: 70 75 74 20 70 61 72 61 6d 65 74 65 72 20 2a 70  put parameter *p
8150: 7a 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 70  zOut is set to p
8160: 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e 65 78 74  oint to the next
8170: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 69   SQL statement i
8180: 6e 0a 2a 2a 20 62 75 66 66 65 72 20 7a 49 6e 2c  n.** buffer zIn,
8190: 20 6f 72 20 74 6f 20 74 68 65 20 27 5c 30 27 20   or to the '\0' 
81a0: 62 79 74 65 20 61 74 20 74 68 65 20 65 6e 64 20  byte at the end 
81b0: 6f 66 20 7a 49 6e 20 69 66 20 74 68 65 72 65 20  of zIn if there 
81c0: 69 73 20 6e 6f 0a 2a 2a 20 6e 65 78 74 20 73 74  is no.** next st
81d0: 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49  atement..**.** I
81e0: 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 54 43  f successful, TC
81f0: 4c 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  L_OK is returned
8200: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 54 43 4c  . Otherwise, TCL
8210: 5f 45 52 52 4f 52 20 69 73 20 72 65 74 75 72 6e  _ERROR is return
8220: 65 64 0a 2a 2a 20 61 6e 64 20 61 6e 20 65 72 72  ed.** and an err
8230: 6f 72 20 6d 65 73 73 61 67 65 20 6c 6f 61 64 65  or message loade
8240: 64 20 69 6e 74 6f 20 69 6e 74 65 72 70 72 65 74  d into interpret
8250: 65 72 20 70 44 62 2d 3e 69 6e 74 65 72 70 2e 0a  er pDb->interp..
8260: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 62  */.static int db
8270: 50 72 65 70 61 72 65 41 6e 64 42 69 6e 64 28 0a  PrepareAndBind(.
8280: 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 2c    SqliteDb *pDb,
8290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
82a0: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6f 62    /* Database ob
82b0: 6a 65 63 74 20 2a 2f 0a 20 20 63 68 61 72 20 63  ject */.  char c
82c0: 6f 6e 73 74 20 2a 7a 49 6e 2c 20 20 20 20 20 20  onst *zIn,      
82d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c            /* SQL
82e0: 20 74 6f 20 63 6f 6d 70 69 6c 65 20 2a 2f 0a 20   to compile */. 
82f0: 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 2a 70 7a   char const **pz
8300: 4f 75 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  Out,            
8310: 20 2f 2a 20 4f 55 54 3a 20 50 6f 69 6e 74 65 72   /* OUT: Pointer
8320: 20 74 6f 20 6e 65 78 74 20 53 51 4c 20 73 74 61   to next SQL sta
8330: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 53 71 6c 50  tement */.  SqlP
8340: 72 65 70 61 72 65 64 53 74 6d 74 20 2a 2a 70 70  reparedStmt **pp
8350: 50 72 65 53 74 6d 74 20 20 20 20 20 2f 2a 20 4f  PreStmt     /* O
8360: 55 54 3a 20 4f 62 6a 65 63 74 20 75 73 65 64 20  UT: Object used 
8370: 74 6f 20 63 61 63 68 65 20 73 74 61 74 65 6d 65  to cache stateme
8380: 6e 74 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74  nt */.){.  const
8390: 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20 7a 49   char *zSql = zI
83a0: 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f  n;         /* Po
83b0: 69 6e 74 65 72 20 74 6f 20 66 69 72 73 74 20 53  inter to first S
83c0: 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20  QL statement in 
83d0: 7a 49 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  zIn */.  sqlite3
83e0: 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 20 20 20  _stmt *pStmt;   
83f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 70           /* Prep
8400: 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 6f  ared statement o
8410: 62 6a 65 63 74 20 2a 2f 0a 20 20 53 71 6c 50 72  bject */.  SqlPr
8420: 65 70 61 72 65 64 53 74 6d 74 20 2a 70 50 72 65  eparedStmt *pPre
8430: 53 74 6d 74 3b 20 20 20 20 20 20 2f 2a 20 50 6f  Stmt;      /* Po
8440: 69 6e 74 65 72 20 74 6f 20 63 61 63 68 65 64 20  inter to cached 
8450: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69  statement */.  i
8460: 6e 74 20 6e 53 71 6c 3b 20 20 20 20 20 20 20 20  nt nSql;        
8470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8480: 2a 20 4c 65 6e 67 74 68 20 6f 66 20 7a 53 71 6c  * Length of zSql
8490: 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 69   in bytes */.  i
84a0: 6e 74 20 6e 56 61 72 3b 20 20 20 20 20 20 20 20  nt nVar;        
84b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
84c0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 76 61 72 69  * Number of vari
84d0: 61 62 6c 65 73 20 69 6e 20 73 74 61 74 65 6d 65  ables in stateme
84e0: 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72  nt */.  int iPar
84f0: 6d 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  m = 0;          
8500: 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20          /* Next 
8510: 66 72 65 65 20 65 6e 74 72 79 20 69 6e 20 61 70  free entry in ap
8520: 50 61 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  Parm */.  int i;
8530: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
8540: 6e 74 65 72 70 20 3d 20 70 44 62 2d 3e 69 6e 74  nterp = pDb->int
8550: 65 72 70 3b 0a 0a 20 20 2a 70 70 50 72 65 53 74  erp;..  *ppPreSt
8560: 6d 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 54 72  mt = 0;..  /* Tr
8570: 69 6d 20 73 70 61 63 65 73 20 66 72 6f 6d 20 74  im spaces from t
8580: 68 65 20 73 74 61 72 74 20 6f 66 20 7a 53 71 6c  he start of zSql
8590: 20 61 6e 64 20 63 61 6c 63 75 6c 61 74 65 20 74   and calculate t
85a0: 68 65 20 72 65 6d 61 69 6e 69 6e 67 20 6c 65 6e  he remaining len
85b0: 67 74 68 2e 20 2a 2f 0a 20 20 77 68 69 6c 65 28  gth. */.  while(
85c0: 20 69 73 73 70 61 63 65 28 7a 53 71 6c 5b 30 5d   isspace(zSql[0]
85d0: 29 20 29 7b 20 7a 53 71 6c 2b 2b 3b 20 7d 0a 20  ) ){ zSql++; }. 
85e0: 20 6e 53 71 6c 20 3d 20 73 74 72 6c 65 6e 33 30   nSql = strlen30
85f0: 28 7a 53 71 6c 29 3b 0a 0a 20 20 66 6f 72 28 70  (zSql);..  for(p
8600: 50 72 65 53 74 6d 74 20 3d 20 70 44 62 2d 3e 73  PreStmt = pDb->s
8610: 74 6d 74 4c 69 73 74 3b 20 70 50 72 65 53 74 6d  tmtList; pPreStm
8620: 74 3b 20 70 50 72 65 53 74 6d 74 3d 70 50 72 65  t; pPreStmt=pPre
8630: 53 74 6d 74 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  Stmt->pNext){.  
8640: 20 20 69 6e 74 20 6e 20 3d 20 70 50 72 65 53 74    int n = pPreSt
8650: 6d 74 2d 3e 6e 53 71 6c 3b 0a 20 20 20 20 69 66  mt->nSql;.    if
8660: 28 20 6e 53 71 6c 3e 3d 6e 20 0a 20 20 20 20 20  ( nSql>=n .     
8670: 20 20 20 26 26 20 6d 65 6d 63 6d 70 28 70 50 72     && memcmp(pPr
8680: 65 53 74 6d 74 2d 3e 7a 53 71 6c 2c 20 7a 53 71  eStmt->zSql, zSq
8690: 6c 2c 20 6e 29 3d 3d 30 0a 20 20 20 20 20 20 20  l, n)==0.       
86a0: 20 26 26 20 28 7a 53 71 6c 5b 6e 5d 3d 3d 30 20   && (zSql[n]==0 
86b0: 7c 7c 20 7a 53 71 6c 5b 6e 2d 31 5d 3d 3d 27 3b  || zSql[n-1]==';
86c0: 27 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  ').    ){.      
86d0: 70 53 74 6d 74 20 3d 20 70 50 72 65 53 74 6d 74  pStmt = pPreStmt
86e0: 2d 3e 70 53 74 6d 74 3b 0a 20 20 20 20 20 20 2a  ->pStmt;.      *
86f0: 70 7a 4f 75 74 20 3d 20 26 7a 53 71 6c 5b 70 50  pzOut = &zSql[pP
8700: 72 65 53 74 6d 74 2d 3e 6e 53 71 6c 5d 3b 0a 0a  reStmt->nSql];..
8710: 20 20 20 20 20 20 2f 2a 20 57 68 65 6e 20 61 20        /* When a 
8720: 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
8730: 6e 74 20 69 73 20 66 6f 75 6e 64 2c 20 75 6e 6c  nt is found, unl
8740: 69 6e 6b 20 69 74 20 66 72 6f 6d 20 74 68 65 0a  ink it from the.
8750: 20 20 20 20 20 20 2a 2a 20 63 61 63 68 65 20 6c        ** cache l
8760: 69 73 74 2e 20 20 49 74 20 77 69 6c 6c 20 6c 61  ist.  It will la
8770: 74 65 72 20 62 65 20 61 64 64 65 64 20 62 61 63  ter be added bac
8780: 6b 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69  k to the beginni
8790: 6e 67 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74  ng.      ** of t
87a0: 68 65 20 63 61 63 68 65 20 6c 69 73 74 20 69 6e  he cache list in
87b0: 20 6f 72 64 65 72 20 74 6f 20 69 6d 70 6c 65 6d   order to implem
87c0: 65 6e 74 20 4c 52 55 20 72 65 70 6c 61 63 65 6d  ent LRU replacem
87d0: 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ent..      */.  
87e0: 20 20 20 20 69 66 28 20 70 50 72 65 53 74 6d 74      if( pPreStmt
87f0: 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20 20  ->pPrev ){.     
8800: 20 20 20 70 50 72 65 53 74 6d 74 2d 3e 70 50 72     pPreStmt->pPr
8810: 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 50 72 65  ev->pNext = pPre
8820: 53 74 6d 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  Stmt->pNext;.   
8830: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
8840: 20 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74 20    pDb->stmtList 
8850: 3d 20 70 50 72 65 53 74 6d 74 2d 3e 70 4e 65 78  = pPreStmt->pNex
8860: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
8870: 20 69 66 28 20 70 50 72 65 53 74 6d 74 2d 3e 70   if( pPreStmt->p
8880: 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Next ){.        
8890: 70 50 72 65 53 74 6d 74 2d 3e 70 4e 65 78 74 2d  pPreStmt->pNext-
88a0: 3e 70 50 72 65 76 20 3d 20 70 50 72 65 53 74 6d  >pPrev = pPreStm
88b0: 74 2d 3e 70 50 72 65 76 3b 0a 20 20 20 20 20 20  t->pPrev;.      
88c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
88d0: 44 62 2d 3e 73 74 6d 74 4c 61 73 74 20 3d 20 70  Db->stmtLast = p
88e0: 50 72 65 53 74 6d 74 2d 3e 70 50 72 65 76 3b 0a  PreStmt->pPrev;.
88f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 44        }.      pD
8900: 62 2d 3e 6e 53 74 6d 74 2d 2d 3b 0a 20 20 20 20  b->nStmt--;.    
8910: 20 20 6e 56 61 72 20 3d 20 73 71 6c 69 74 65 33    nVar = sqlite3
8920: 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f  _bind_parameter_
8930: 63 6f 75 6e 74 28 70 53 74 6d 74 29 3b 0a 20 20  count(pStmt);.  
8940: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
8950: 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 49 66 20  .  }.  .  /* If 
8960: 6e 6f 20 70 72 65 70 61 72 65 64 20 73 74 61 74  no prepared stat
8970: 65 6d 65 6e 74 20 77 61 73 20 66 6f 75 6e 64 2e  ement was found.
8980: 20 43 6f 6d 70 69 6c 65 20 74 68 65 20 53 51 4c   Compile the SQL
8990: 20 74 65 78 74 2e 20 41 6c 73 6f 20 61 6c 6c 6f   text. Also allo
89a0: 63 61 74 65 0a 20 20 2a 2a 20 61 20 6e 65 77 20  cate.  ** a new 
89b0: 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74 20  SqlPreparedStmt 
89c0: 73 74 72 75 63 74 75 72 65 2e 20 20 2a 2f 0a 20  structure.  */. 
89d0: 20 69 66 28 20 70 50 72 65 53 74 6d 74 3d 3d 30   if( pPreStmt==0
89e0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 42 79 74   ){.    int nByt
89f0: 65 3b 0a 0a 20 20 20 20 69 66 28 20 53 51 4c 49  e;..    if( SQLI
8a00: 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 5f 70  TE_OK!=sqlite3_p
8a10: 72 65 70 61 72 65 5f 76 32 28 70 44 62 2d 3e 64  repare_v2(pDb->d
8a20: 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53  b, zSql, -1, &pS
8a30: 74 6d 74 2c 20 70 7a 4f 75 74 29 20 29 7b 0a 20  tmt, pzOut) ){. 
8a40: 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52       Tcl_SetObjR
8a50: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 64 62  esult(interp, db
8a60: 54 65 78 74 54 6f 4f 62 6a 28 73 71 6c 69 74 65  TextToObj(sqlite
8a70: 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62  3_errmsg(pDb->db
8a80: 29 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  )));.      retur
8a90: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
8aa0: 20 7d 0a 20 20 20 20 69 66 28 20 70 53 74 6d 74   }.    if( pStmt
8ab0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==0 ){.      if(
8ac0: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69   SQLITE_OK!=sqli
8ad0: 74 65 33 5f 65 72 72 63 6f 64 65 28 70 44 62 2d  te3_errcode(pDb-
8ae0: 3e 64 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20  >db) ){.        
8af0: 2f 2a 20 41 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  /* A compile-tim
8b00: 65 20 65 72 72 6f 72 20 69 6e 20 74 68 65 20 73  e error in the s
8b10: 74 61 74 65 6d 65 6e 74 2e 20 2a 2f 0a 20 20 20  tatement. */.   
8b20: 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52       Tcl_SetObjR
8b30: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 64 62  esult(interp, db
8b40: 54 65 78 74 54 6f 4f 62 6a 28 73 71 6c 69 74 65  TextToObj(sqlite
8b50: 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62  3_errmsg(pDb->db
8b60: 29 29 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  )));.        ret
8b70: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
8b80: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
8b90: 20 20 20 20 2f 2a 20 54 68 65 20 73 74 61 74 65      /* The state
8ba0: 6d 65 6e 74 20 77 61 73 20 61 20 6e 6f 2d 6f 70  ment was a no-op
8bb0: 2e 20 20 43 6f 6e 74 69 6e 75 65 20 74 6f 20 74  .  Continue to t
8bc0: 68 65 20 6e 65 78 74 20 73 74 61 74 65 6d 65 6e  he next statemen
8bd0: 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20  t.        ** in 
8be0: 74 68 65 20 53 51 4c 20 73 74 72 69 6e 67 2e 0a  the SQL string..
8bf0: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
8c00: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b     return TCL_OK
8c10: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
8c20: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 72  .    assert( pPr
8c30: 65 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20  eStmt==0 );.    
8c40: 6e 56 61 72 20 3d 20 73 71 6c 69 74 65 33 5f 62  nVar = sqlite3_b
8c50: 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 63 6f  ind_parameter_co
8c60: 75 6e 74 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  unt(pStmt);.    
8c70: 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 53  nByte = sizeof(S
8c80: 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74 29 20  qlPreparedStmt) 
8c90: 2b 20 6e 56 61 72 2a 73 69 7a 65 6f 66 28 54 63  + nVar*sizeof(Tc
8ca0: 6c 5f 4f 62 6a 20 2a 29 3b 0a 20 20 20 20 70 50  l_Obj *);.    pP
8cb0: 72 65 53 74 6d 74 20 3d 20 28 53 71 6c 50 72 65  reStmt = (SqlPre
8cc0: 70 61 72 65 64 53 74 6d 74 2a 29 54 63 6c 5f 41  paredStmt*)Tcl_A
8cd0: 6c 6c 6f 63 28 6e 42 79 74 65 29 3b 0a 20 20 20  lloc(nByte);.   
8ce0: 20 6d 65 6d 73 65 74 28 70 50 72 65 53 74 6d 74   memset(pPreStmt
8cf0: 2c 20 30 2c 20 6e 42 79 74 65 29 3b 0a 0a 20 20  , 0, nByte);..  
8d00: 20 20 70 50 72 65 53 74 6d 74 2d 3e 70 53 74 6d    pPreStmt->pStm
8d10: 74 20 3d 20 70 53 74 6d 74 3b 0a 20 20 20 20 70  t = pStmt;.    p
8d20: 50 72 65 53 74 6d 74 2d 3e 6e 53 71 6c 20 3d 20  PreStmt->nSql = 
8d30: 28 2a 70 7a 4f 75 74 20 2d 20 7a 53 71 6c 29 3b  (*pzOut - zSql);
8d40: 0a 20 20 20 20 70 50 72 65 53 74 6d 74 2d 3e 7a  .    pPreStmt->z
8d50: 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 73 71  Sql = sqlite3_sq
8d60: 6c 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 70 50  l(pStmt);.    pP
8d70: 72 65 53 74 6d 74 2d 3e 61 70 50 61 72 6d 20 3d  reStmt->apParm =
8d80: 20 28 54 63 6c 5f 4f 62 6a 20 2a 2a 29 26 70 50   (Tcl_Obj **)&pP
8d90: 72 65 53 74 6d 74 5b 31 5d 3b 0a 20 20 7d 0a 20  reStmt[1];.  }. 
8da0: 20 61 73 73 65 72 74 28 20 70 50 72 65 53 74 6d   assert( pPreStm
8db0: 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  t );.  assert( s
8dc0: 74 72 6c 65 6e 33 30 28 70 50 72 65 53 74 6d 74  trlen30(pPreStmt
8dd0: 2d 3e 7a 53 71 6c 29 3d 3d 70 50 72 65 53 74 6d  ->zSql)==pPreStm
8de0: 74 2d 3e 6e 53 71 6c 20 29 3b 0a 20 20 61 73 73  t->nSql );.  ass
8df0: 65 72 74 28 20 30 3d 3d 6d 65 6d 63 6d 70 28 70  ert( 0==memcmp(p
8e00: 50 72 65 53 74 6d 74 2d 3e 7a 53 71 6c 2c 20 7a  PreStmt->zSql, z
8e10: 53 71 6c 2c 20 70 50 72 65 53 74 6d 74 2d 3e 6e  Sql, pPreStmt->n
8e20: 53 71 6c 29 20 29 3b 0a 0a 20 20 2f 2a 20 42 69  Sql) );..  /* Bi
8e30: 6e 64 20 76 61 6c 75 65 73 20 74 6f 20 70 61 72  nd values to par
8e40: 61 6d 65 74 65 72 73 20 74 68 61 74 20 62 65 67  ameters that beg
8e50: 69 6e 20 77 69 74 68 20 24 20 6f 72 20 3a 20 2a  in with $ or : *
8e60: 2f 20 20 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69  /  .  for(i=1; i
8e70: 3c 3d 6e 56 61 72 3b 20 69 2b 2b 29 7b 0a 20 20  <=nVar; i++){.  
8e80: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56    const char *zV
8e90: 61 72 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e  ar = sqlite3_bin
8ea0: 64 5f 70 61 72 61 6d 65 74 65 72 5f 6e 61 6d 65  d_parameter_name
8eb0: 28 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20  (pStmt, i);.    
8ec0: 69 66 28 20 7a 56 61 72 21 3d 30 20 26 26 20 28  if( zVar!=0 && (
8ed0: 7a 56 61 72 5b 30 5d 3d 3d 27 24 27 20 7c 7c 20  zVar[0]=='$' || 
8ee0: 7a 56 61 72 5b 30 5d 3d 3d 27 3a 27 20 7c 7c 20  zVar[0]==':' || 
8ef0: 7a 56 61 72 5b 30 5d 3d 3d 27 40 27 29 20 29 7b  zVar[0]=='@') ){
8f00: 0a 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a  .      Tcl_Obj *
8f10: 70 56 61 72 20 3d 20 54 63 6c 5f 47 65 74 56 61  pVar = Tcl_GetVa
8f20: 72 32 45 78 28 69 6e 74 65 72 70 2c 20 26 7a 56  r2Ex(interp, &zV
8f30: 61 72 5b 31 5d 2c 20 30 2c 20 30 29 3b 0a 20 20  ar[1], 0, 0);.  
8f40: 20 20 20 20 69 66 28 20 70 56 61 72 20 29 7b 0a      if( pVar ){.
8f50: 20 20 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20          int n;. 
8f60: 20 20 20 20 20 20 20 75 38 20 2a 64 61 74 61 3b         u8 *data;
8f70: 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63  .        const c
8f80: 68 61 72 20 2a 7a 54 79 70 65 20 3d 20 28 70 56  har *zType = (pV
8f90: 61 72 2d 3e 74 79 70 65 50 74 72 20 3f 20 70 56  ar->typePtr ? pV
8fa0: 61 72 2d 3e 74 79 70 65 50 74 72 2d 3e 6e 61 6d  ar->typePtr->nam
8fb0: 65 20 3a 20 22 22 29 3b 0a 20 20 20 20 20 20 20  e : "");.       
8fc0: 20 63 68 61 72 20 63 20 3d 20 7a 54 79 70 65 5b   char c = zType[
8fd0: 30 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0];.        if( 
8fe0: 7a 56 61 72 5b 30 5d 3d 3d 27 40 27 20 7c 7c 0a  zVar[0]=='@' ||.
8ff0: 20 20 20 20 20 20 20 20 20 20 20 28 63 3d 3d 27             (c=='
9000: 62 27 20 26 26 20 73 74 72 63 6d 70 28 7a 54 79  b' && strcmp(zTy
9010: 70 65 2c 22 62 79 74 65 61 72 72 61 79 22 29 3d  pe,"bytearray")=
9020: 3d 30 20 26 26 20 70 56 61 72 2d 3e 62 79 74 65  =0 && pVar->byte
9030: 73 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20  s==0) ){.       
9040: 20 20 20 2f 2a 20 4c 6f 61 64 20 61 20 42 4c 4f     /* Load a BLO
9050: 42 20 74 79 70 65 20 69 66 20 74 68 65 20 54 63  B type if the Tc
9060: 6c 20 76 61 72 69 61 62 6c 65 20 69 73 20 61 20  l variable is a 
9070: 62 79 74 65 61 72 72 61 79 20 61 6e 64 0a 20 20  bytearray and.  
9080: 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 68 61          ** it ha
9090: 73 20 6e 6f 20 73 74 72 69 6e 67 20 72 65 70 72  s no string repr
90a0: 65 73 65 6e 74 61 74 69 6f 6e 20 6f 72 20 74 68  esentation or th
90b0: 65 20 68 6f 73 74 0a 20 20 20 20 20 20 20 20 20  e host.         
90c0: 20 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 6e 61   ** parameter na
90d0: 6d 65 20 62 65 67 69 6e 73 20 77 69 74 68 20 22  me begins with "
90e0: 40 22 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  @". */.         
90f0: 20 64 61 74 61 20 3d 20 54 63 6c 5f 47 65 74 42   data = Tcl_GetB
9100: 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28  yteArrayFromObj(
9110: 70 56 61 72 2c 20 26 6e 29 3b 0a 20 20 20 20 20  pVar, &n);.     
9120: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e       sqlite3_bin
9130: 64 5f 62 6c 6f 62 28 70 53 74 6d 74 2c 20 69 2c  d_blob(pStmt, i,
9140: 20 64 61 74 61 2c 20 6e 2c 20 53 51 4c 49 54 45   data, n, SQLITE
9150: 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20  _STATIC);.      
9160: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43      Tcl_IncrRefC
9170: 6f 75 6e 74 28 70 56 61 72 29 3b 0a 20 20 20 20  ount(pVar);.    
9180: 20 20 20 20 20 20 70 50 72 65 53 74 6d 74 2d 3e        pPreStmt->
9190: 61 70 50 61 72 6d 5b 69 50 61 72 6d 2b 2b 5d 20  apParm[iParm++] 
91a0: 3d 20 70 56 61 72 3b 0a 20 20 20 20 20 20 20 20  = pVar;.        
91b0: 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 62 27  }else if( c=='b'
91c0: 20 26 26 20 73 74 72 63 6d 70 28 7a 54 79 70 65   && strcmp(zType
91d0: 2c 22 62 6f 6f 6c 65 61 6e 22 29 3d 3d 30 20 29  ,"boolean")==0 )
91e0: 7b 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f  {.          Tcl_
91f0: 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
9200: 74 65 72 70 2c 20 70 56 61 72 2c 20 26 6e 29 3b  terp, pVar, &n);
9210: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
9220: 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 53 74 6d  e3_bind_int(pStm
9230: 74 2c 20 69 2c 20 6e 29 3b 0a 20 20 20 20 20 20  t, i, n);.      
9240: 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27    }else if( c=='
9250: 64 27 20 26 26 20 73 74 72 63 6d 70 28 7a 54 79  d' && strcmp(zTy
9260: 70 65 2c 22 64 6f 75 62 6c 65 22 29 3d 3d 30 20  pe,"double")==0 
9270: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 64 6f 75  ){.          dou
9280: 62 6c 65 20 72 3b 0a 20 20 20 20 20 20 20 20 20  ble r;.         
9290: 20 54 63 6c 5f 47 65 74 44 6f 75 62 6c 65 46 72   Tcl_GetDoubleFr
92a0: 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 70 56  omObj(interp, pV
92b0: 61 72 2c 20 26 72 29 3b 0a 20 20 20 20 20 20 20  ar, &r);.       
92c0: 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
92d0: 64 6f 75 62 6c 65 28 70 53 74 6d 74 2c 20 69 2c  double(pStmt, i,
92e0: 20 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c   r);.        }el
92f0: 73 65 20 69 66 28 20 28 63 3d 3d 27 77 27 20 26  se if( (c=='w' &
9300: 26 20 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22  & strcmp(zType,"
9310: 77 69 64 65 49 6e 74 22 29 3d 3d 30 29 20 7c 7c  wideInt")==0) ||
9320: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28  .              (
9330: 63 3d 3d 27 69 27 20 26 26 20 73 74 72 63 6d 70  c=='i' && strcmp
9340: 28 7a 54 79 70 65 2c 22 69 6e 74 22 29 3d 3d 30  (zType,"int")==0
9350: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54  ) ){.          T
9360: 63 6c 5f 57 69 64 65 49 6e 74 20 76 3b 0a 20 20  cl_WideInt v;.  
9370: 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 57          Tcl_GetW
9380: 69 64 65 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  ideIntFromObj(in
9390: 74 65 72 70 2c 20 70 56 61 72 2c 20 26 76 29 3b  terp, pVar, &v);
93a0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
93b0: 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 53  e3_bind_int64(pS
93c0: 74 6d 74 2c 20 69 2c 20 76 29 3b 0a 20 20 20 20  tmt, i, v);.    
93d0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
93e0: 20 20 20 20 20 64 61 74 61 20 3d 20 28 75 6e 73       data = (uns
93f0: 69 67 6e 65 64 20 63 68 61 72 20 2a 29 54 63 6c  igned char *)Tcl
9400: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
9410: 6a 28 70 56 61 72 2c 20 26 6e 29 3b 0a 20 20 20  j(pVar, &n);.   
9420: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62         sqlite3_b
9430: 69 6e 64 5f 74 65 78 74 28 70 53 74 6d 74 2c 20  ind_text(pStmt, 
9440: 69 2c 20 28 63 68 61 72 20 2a 29 64 61 74 61 2c  i, (char *)data,
9450: 20 6e 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49   n, SQLITE_STATI
9460: 43 29 3b 0a 20 20 20 20 20 20 20 20 20 20 54 63  C);.          Tc
9470: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70  l_IncrRefCount(p
9480: 56 61 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Var);.          
9490: 70 50 72 65 53 74 6d 74 2d 3e 61 70 50 61 72 6d  pPreStmt->apParm
94a0: 5b 69 50 61 72 6d 2b 2b 5d 20 3d 20 70 56 61 72  [iParm++] = pVar
94b0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
94c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
94d0: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75   sqlite3_bind_nu
94e0: 6c 6c 28 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20  ll(pStmt, i);.  
94f0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
9500: 20 20 70 50 72 65 53 74 6d 74 2d 3e 6e 50 61 72    pPreStmt->nPar
9510: 6d 20 3d 20 69 50 61 72 6d 3b 0a 20 20 2a 70 70  m = iParm;.  *pp
9520: 50 72 65 53 74 6d 74 20 3d 20 70 50 72 65 53 74  PreStmt = pPreSt
9530: 6d 74 3b 0a 0a 20 20 72 65 74 75 72 6e 20 54 43  mt;..  return TC
9540: 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  L_OK;.}.../*.** 
9550: 52 65 6c 65 61 73 65 20 61 20 73 74 61 74 65 6d  Release a statem
9560: 65 6e 74 20 72 65 66 65 72 65 6e 63 65 20 6f 62  ent reference ob
9570: 74 61 69 6e 65 64 20 62 79 20 63 61 6c 6c 69 6e  tained by callin
9580: 67 20 64 62 50 72 65 70 61 72 65 41 6e 64 42 69  g dbPrepareAndBi
9590: 6e 64 28 29 2e 0a 2a 2a 20 54 68 65 72 65 20 73  nd()..** There s
95a0: 68 6f 75 6c 64 20 62 65 20 65 78 61 63 74 6c 79  hould be exactly
95b0: 20 6f 6e 65 20 63 61 6c 6c 20 74 6f 20 74 68 69   one call to thi
95c0: 73 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 65  s function for e
95d0: 61 63 68 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20 64  ach call to.** d
95e0: 62 50 72 65 70 61 72 65 41 6e 64 42 69 6e 64 28  bPrepareAndBind(
95f0: 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  )..**.** If the 
9600: 64 69 73 63 61 72 64 20 70 61 72 61 6d 65 74 65  discard paramete
9610: 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  r is non-zero, t
9620: 68 65 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e  hen the statemen
9630: 74 20 69 73 20 64 65 6c 65 74 65 64 0a 2a 2a 20  t is deleted.** 
9640: 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20 4f 74 68  immediately. Oth
9650: 65 72 77 69 73 65 20 69 74 20 69 73 20 61 64 64  erwise it is add
9660: 65 64 20 74 6f 20 74 68 65 20 4c 52 55 20 6c 69  ed to the LRU li
9670: 73 74 20 61 6e 64 20 6d 61 79 20 62 65 20 72 65  st and may be re
9680: 74 75 72 6e 65 64 0a 2a 2a 20 62 79 20 61 20 73  turned.** by a s
9690: 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 20 74  ubsequent call t
96a0: 6f 20 64 62 50 72 65 70 61 72 65 41 6e 64 42 69  o dbPrepareAndBi
96b0: 6e 64 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  nd()..*/.static 
96c0: 76 6f 69 64 20 64 62 52 65 6c 65 61 73 65 53 74  void dbReleaseSt
96d0: 6d 74 28 0a 20 20 53 71 6c 69 74 65 44 62 20 2a  mt(.  SqliteDb *
96e0: 70 44 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  pDb,            
96f0: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
9700: 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 53 71  e handle */.  Sq
9710: 6c 50 72 65 70 61 72 65 64 53 74 6d 74 20 2a 70  lPreparedStmt *p
9720: 50 72 65 53 74 6d 74 2c 20 20 20 20 20 20 2f 2a  PreStmt,      /*
9730: 20 50 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   Prepared statem
9740: 65 6e 74 20 68 61 6e 64 6c 65 20 74 6f 20 72 65  ent handle to re
9750: 6c 65 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 64  lease */.  int d
9760: 69 73 63 61 72 64 20 20 20 20 20 20 20 20 20 20  iscard          
9770: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
9780: 75 65 20 74 6f 20 64 65 6c 65 74 65 20 28 6e 6f  ue to delete (no
9790: 74 20 63 61 63 68 65 29 20 74 68 65 20 70 50 72  t cache) the pPr
97a0: 65 53 74 6d 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e  eStmt */.){.  in
97b0: 74 20 69 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20  t i;..  /* Free 
97c0: 74 68 65 20 62 6f 75 6e 64 20 73 74 72 69 6e 67  the bound string
97d0: 20 61 6e 64 20 62 6c 6f 62 20 70 61 72 61 6d 65   and blob parame
97e0: 74 65 72 73 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  ters */.  for(i=
97f0: 30 3b 20 69 3c 70 50 72 65 53 74 6d 74 2d 3e 6e  0; i<pPreStmt->n
9800: 50 61 72 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Parm; i++){.    
9810: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
9820: 28 70 50 72 65 53 74 6d 74 2d 3e 61 70 50 61 72  (pPreStmt->apPar
9830: 6d 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 70 50 72  m[i]);.  }.  pPr
9840: 65 53 74 6d 74 2d 3e 6e 50 61 72 6d 20 3d 20 30  eStmt->nParm = 0
9850: 3b 0a 0a 20 20 69 66 28 20 70 44 62 2d 3e 6d 61  ;..  if( pDb->ma
9860: 78 53 74 6d 74 3c 3d 30 20 7c 7c 20 64 69 73 63  xStmt<=0 || disc
9870: 61 72 64 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  ard ){.    /* If
9880: 20 74 68 65 20 63 61 63 68 65 20 69 73 20 74 75   the cache is tu
9890: 72 6e 65 64 20 6f 66 66 2c 20 64 65 61 6c 6c 6f  rned off, deallo
98a0: 63 61 74 65 64 20 74 68 65 20 73 74 61 74 65 6d  cated the statem
98b0: 65 6e 74 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  ent */.    sqlit
98c0: 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 50 72 65  e3_finalize(pPre
98d0: 53 74 6d 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20  Stmt->pStmt);.  
98e0: 20 20 54 63 6c 5f 46 72 65 65 28 28 63 68 61 72    Tcl_Free((char
98f0: 20 2a 29 70 50 72 65 53 74 6d 74 29 3b 0a 20 20   *)pPreStmt);.  
9900: 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 41 64  }else{.    /* Ad
9910: 64 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73  d the prepared s
9920: 74 61 74 65 6d 65 6e 74 20 74 6f 20 74 68 65 20  tatement to the 
9930: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
9940: 20 63 61 63 68 65 20 6c 69 73 74 2e 20 2a 2f 0a   cache list. */.
9950: 20 20 20 20 70 50 72 65 53 74 6d 74 2d 3e 70 4e      pPreStmt->pN
9960: 65 78 74 20 3d 20 70 44 62 2d 3e 73 74 6d 74 4c  ext = pDb->stmtL
9970: 69 73 74 3b 0a 20 20 20 20 70 50 72 65 53 74 6d  ist;.    pPreStm
9980: 74 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20  t->pPrev = 0;.  
9990: 20 20 69 66 28 20 70 44 62 2d 3e 73 74 6d 74 4c    if( pDb->stmtL
99a0: 69 73 74 20 29 7b 0a 20 20 20 20 20 70 44 62 2d  ist ){.     pDb-
99b0: 3e 73 74 6d 74 4c 69 73 74 2d 3e 70 50 72 65 76  >stmtList->pPrev
99c0: 20 3d 20 70 50 72 65 53 74 6d 74 3b 0a 20 20 20   = pPreStmt;.   
99d0: 20 7d 0a 20 20 20 20 70 44 62 2d 3e 73 74 6d 74   }.    pDb->stmt
99e0: 4c 69 73 74 20 3d 20 70 50 72 65 53 74 6d 74 3b  List = pPreStmt;
99f0: 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e 73 74  .    if( pDb->st
9a00: 6d 74 4c 61 73 74 3d 3d 30 20 29 7b 0a 20 20 20  mtLast==0 ){.   
9a10: 20 20 20 61 73 73 65 72 74 28 20 70 44 62 2d 3e     assert( pDb->
9a20: 6e 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20  nStmt==0 );.    
9a30: 20 20 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74 20    pDb->stmtLast 
9a40: 3d 20 70 50 72 65 53 74 6d 74 3b 0a 20 20 20 20  = pPreStmt;.    
9a50: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
9a60: 65 72 74 28 20 70 44 62 2d 3e 6e 53 74 6d 74 3e  ert( pDb->nStmt>
9a70: 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  0 );.    }.    p
9a80: 44 62 2d 3e 6e 53 74 6d 74 2b 2b 3b 0a 20 20 20  Db->nStmt++;.   
9a90: 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20 68 61  .    /* If we ha
9aa0: 76 65 20 74 6f 6f 20 6d 61 6e 79 20 73 74 61 74  ve too many stat
9ab0: 65 6d 65 6e 74 20 69 6e 20 63 61 63 68 65 2c 20  ement in cache, 
9ac0: 72 65 6d 6f 76 65 20 74 68 65 20 73 75 72 70 6c  remove the surpl
9ad0: 75 73 20 66 72 6f 6d 20 0a 20 20 20 20 2a 2a 20  us from .    ** 
9ae0: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 63  the end of the c
9af0: 61 63 68 65 20 6c 69 73 74 2e 20 20 2a 2f 0a 20  ache list.  */. 
9b00: 20 20 20 77 68 69 6c 65 28 20 70 44 62 2d 3e 6e     while( pDb->n
9b10: 53 74 6d 74 3e 70 44 62 2d 3e 6d 61 78 53 74 6d  Stmt>pDb->maxStm
9b20: 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  t ){.      sqlit
9b30: 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 44 62 2d  e3_finalize(pDb-
9b40: 3e 73 74 6d 74 4c 61 73 74 2d 3e 70 53 74 6d 74  >stmtLast->pStmt
9b50: 29 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e 73 74  );.      pDb->st
9b60: 6d 74 4c 61 73 74 20 3d 20 70 44 62 2d 3e 73 74  mtLast = pDb->st
9b70: 6d 74 4c 61 73 74 2d 3e 70 50 72 65 76 3b 0a 20  mtLast->pPrev;. 
9b80: 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28 28 63       Tcl_Free((c
9b90: 68 61 72 2a 29 70 44 62 2d 3e 73 74 6d 74 4c 61  har*)pDb->stmtLa
9ba0: 73 74 2d 3e 70 4e 65 78 74 29 3b 0a 20 20 20 20  st->pNext);.    
9bb0: 20 20 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74 2d    pDb->stmtLast-
9bc0: 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20  >pNext = 0;.    
9bd0: 20 20 70 44 62 2d 3e 6e 53 74 6d 74 2d 2d 3b 0a    pDb->nStmt--;.
9be0: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
9bf0: 2a 2a 20 53 74 72 75 63 74 75 72 65 20 75 73 65  ** Structure use
9c00: 64 20 77 69 74 68 20 64 62 45 76 61 6c 58 58 58  d with dbEvalXXX
9c10: 28 29 20 66 75 6e 63 74 69 6f 6e 73 3a 0a 2a 2a  () functions:.**
9c20: 0a 2a 2a 20 20 20 64 62 45 76 61 6c 49 6e 69 74  .**   dbEvalInit
9c30: 28 29 0a 2a 2a 20 20 20 64 62 45 76 61 6c 53 74  ().**   dbEvalSt
9c40: 65 70 28 29 0a 2a 2a 20 20 20 64 62 45 76 61 6c  ep().**   dbEval
9c50: 46 69 6e 61 6c 69 7a 65 28 29 0a 2a 2a 20 20 20  Finalize().**   
9c60: 64 62 45 76 61 6c 52 6f 77 49 6e 66 6f 28 29 0a  dbEvalRowInfo().
9c70: 2a 2a 20 20 20 64 62 45 76 61 6c 43 6f 6c 75 6d  **   dbEvalColum
9c80: 6e 56 61 6c 75 65 28 29 0a 2a 2f 0a 74 79 70 65  nValue().*/.type
9c90: 64 65 66 20 73 74 72 75 63 74 20 44 62 45 76 61  def struct DbEva
9ca0: 6c 43 6f 6e 74 65 78 74 20 44 62 45 76 61 6c 43  lContext DbEvalC
9cb0: 6f 6e 74 65 78 74 3b 0a 73 74 72 75 63 74 20 44  ontext;.struct D
9cc0: 62 45 76 61 6c 43 6f 6e 74 65 78 74 20 7b 0a 20  bEvalContext {. 
9cd0: 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 3b 20   SqliteDb *pDb; 
9ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9cf0: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 61 6e   /* Database han
9d00: 64 6c 65 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a  dle */.  Tcl_Obj
9d10: 20 2a 70 53 71 6c 3b 20 20 20 20 20 20 20 20 20   *pSql;         
9d20: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a 65           /* Obje
9d30: 63 74 20 68 6f 6c 64 69 6e 67 20 73 74 72 69 6e  ct holding strin
9d40: 67 20 7a 53 71 6c 20 2a 2f 0a 20 20 63 6f 6e 73  g zSql */.  cons
9d50: 74 20 63 68 61 72 20 2a 7a 53 71 6c 3b 20 20 20  t char *zSql;   
9d60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
9d70: 65 6d 61 69 6e 69 6e 67 20 53 51 4c 20 74 6f 20  emaining SQL to 
9d80: 65 78 65 63 75 74 65 20 2a 2f 0a 20 20 53 71 6c  execute */.  Sql
9d90: 50 72 65 70 61 72 65 64 53 74 6d 74 20 2a 70 50  PreparedStmt *pP
9da0: 72 65 53 74 6d 74 3b 20 20 20 20 20 20 2f 2a 20  reStmt;      /* 
9db0: 43 75 72 72 65 6e 74 20 73 74 61 74 65 6d 65 6e  Current statemen
9dc0: 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b  t */.  int nCol;
9dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9de0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
9df0: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 72 65 74 75   of columns retu
9e00: 72 6e 65 64 20 62 79 20 70 53 74 6d 74 20 2a 2f  rned by pStmt */
9e10: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 41 72 72  .  Tcl_Obj *pArr
9e20: 61 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ay;             
9e30: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 61 72     /* Name of ar
9e40: 72 61 79 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a  ray variable */.
9e50: 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 61 70 43 6f    Tcl_Obj **apCo
9e60: 6c 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  lName;          
9e70: 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 63 6f    /* Array of co
9e80: 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 7d 3b  lumn names */.};
9e90: 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20  ../*.** Release 
9ea0: 61 6e 79 20 63 61 63 68 65 20 6f 66 20 63 6f 6c  any cache of col
9eb0: 75 6d 6e 20 6e 61 6d 65 73 20 63 75 72 72 65 6e  umn names curren
9ec0: 74 6c 79 20 68 65 6c 64 20 61 73 20 70 61 72 74  tly held as part
9ed0: 20 6f 66 0a 2a 2a 20 74 68 65 20 44 62 45 76 61   of.** the DbEva
9ee0: 6c 43 6f 6e 74 65 78 74 20 73 74 72 75 63 74 75  lContext structu
9ef0: 72 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  re passed as the
9f00: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e   first argument.
9f10: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
9f20: 64 62 52 65 6c 65 61 73 65 43 6f 6c 75 6d 6e 4e  dbReleaseColumnN
9f30: 61 6d 65 73 28 44 62 45 76 61 6c 43 6f 6e 74 65  ames(DbEvalConte
9f40: 78 74 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d  xt *p){.  if( p-
9f50: 3e 61 70 43 6f 6c 4e 61 6d 65 20 29 7b 0a 20 20  >apColName ){.  
9f60: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72    int i;.    for
9f70: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b  (i=0; i<p->nCol;
9f80: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 54 63 6c   i++){.      Tcl
9f90: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 2d  _DecrRefCount(p-
9fa0: 3e 61 70 43 6f 6c 4e 61 6d 65 5b 69 5d 29 3b 0a  >apColName[i]);.
9fb0: 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 46 72      }.    Tcl_Fr
9fc0: 65 65 28 28 63 68 61 72 20 2a 29 70 2d 3e 61 70  ee((char *)p->ap
9fd0: 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 70 2d  ColName);.    p-
9fe0: 3e 61 70 43 6f 6c 4e 61 6d 65 20 3d 20 30 3b 0a  >apColName = 0;.
9ff0: 20 20 7d 0a 20 20 70 2d 3e 6e 43 6f 6c 20 3d 20    }.  p->nCol = 
a000: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74  0;.}../*.** Init
a010: 69 61 6c 69 7a 65 20 61 20 44 62 45 76 61 6c 43  ialize a DbEvalC
a020: 6f 6e 74 65 78 74 20 73 74 72 75 63 74 75 72 65  ontext structure
a030: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 41 72 72 61  ..**.** If pArra
a040: 79 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74  y is not NULL, t
a050: 68 65 6e 20 69 74 20 63 6f 6e 74 61 69 6e 73 20  hen it contains 
a060: 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 54 63  the name of a Tc
a070: 6c 20 61 72 72 61 79 0a 2a 2a 20 76 61 72 69 61  l array.** varia
a080: 62 6c 65 2e 20 54 68 65 20 22 2a 22 20 6d 65 6d  ble. The "*" mem
a090: 62 65 72 20 6f 66 20 74 68 69 73 20 61 72 72 61  ber of this arra
a0a0: 79 20 69 73 20 73 65 74 20 74 6f 20 61 20 6c 69  y is set to a li
a0b0: 73 74 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 2a 2a  st containing.**
a0c0: 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 74 68   the names of th
a0d0: 65 20 63 6f 6c 75 6d 6e 73 20 72 65 74 75 72 6e  e columns return
a0e0: 65 64 20 62 79 20 74 68 65 20 73 74 61 74 65 6d  ed by the statem
a0f0: 65 6e 74 20 61 73 20 70 61 72 74 20 6f 66 20 65  ent as part of e
a100: 61 63 68 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 64  ach.** call to d
a110: 62 45 76 61 6c 53 74 65 70 28 29 2c 20 69 6e 20  bEvalStep(), in 
a120: 6f 72 64 65 72 20 66 72 6f 6d 20 6c 65 66 74 20  order from left 
a130: 74 6f 20 72 69 67 68 74 2e 20 65 2e 67 2e 20 69  to right. e.g. i
a140: 66 20 74 68 65 20 6e 61 6d 65 73 20 0a 2a 2a 20  f the names .** 
a150: 6f 66 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  of the returned 
a160: 63 6f 6c 75 6d 6e 73 20 61 72 65 20 61 2c 20 62  columns are a, b
a170: 20 61 6e 64 20 63 2c 20 69 74 20 64 6f 65 73 20   and c, it does 
a180: 74 68 65 20 65 71 75 69 76 61 6c 65 6e 74 20 6f  the equivalent o
a190: 66 20 74 68 65 20 0a 2a 2a 20 74 63 6c 20 63 6f  f the .** tcl co
a1a0: 6d 6d 61 6e 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  mmand:.**.**    
a1b0: 20 73 65 74 20 24 7b 70 41 72 72 61 79 7d 28 2a   set ${pArray}(*
a1c0: 29 20 7b 61 20 62 20 63 7d 0a 2a 2f 0a 73 74 61  ) {a b c}.*/.sta
a1d0: 74 69 63 20 76 6f 69 64 20 64 62 45 76 61 6c 49  tic void dbEvalI
a1e0: 6e 69 74 28 0a 20 20 44 62 45 76 61 6c 43 6f 6e  nit(.  DbEvalCon
a1f0: 74 65 78 74 20 2a 70 2c 20 20 20 20 20 20 20 20  text *p,        
a200: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
a210: 72 20 74 6f 20 73 74 72 75 63 74 75 72 65 20 74  r to structure t
a220: 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 2a 2f 0a  o initialize */.
a230: 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 2c    SqliteDb *pDb,
a240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a250: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 61    /* Database ha
a260: 6e 64 6c 65 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62  ndle */.  Tcl_Ob
a270: 6a 20 2a 70 53 71 6c 2c 20 20 20 20 20 20 20 20  j *pSql,        
a280: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a            /* Obj
a290: 65 63 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 53  ect containing S
a2a0: 51 4c 20 73 63 72 69 70 74 20 2a 2f 0a 20 20 54  QL script */.  T
a2b0: 63 6c 5f 4f 62 6a 20 2a 70 41 72 72 61 79 20 20  cl_Obj *pArray  
a2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a2d0: 2a 20 4e 61 6d 65 20 6f 66 20 54 63 6c 20 61 72  * Name of Tcl ar
a2e0: 72 61 79 20 74 6f 20 73 65 74 20 28 2a 29 20 65  ray to set (*) e
a2f0: 6c 65 6d 65 6e 74 20 6f 66 20 2a 2f 0a 29 7b 0a  lement of */.){.
a300: 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 73    memset(p, 0, s
a310: 69 7a 65 6f 66 28 44 62 45 76 61 6c 43 6f 6e 74  izeof(DbEvalCont
a320: 65 78 74 29 29 3b 0a 20 20 70 2d 3e 70 44 62 20  ext));.  p->pDb 
a330: 3d 20 70 44 62 3b 0a 20 20 70 2d 3e 7a 53 71 6c  = pDb;.  p->zSql
a340: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
a350: 28 70 53 71 6c 29 3b 0a 20 20 70 2d 3e 70 53 71  (pSql);.  p->pSq
a360: 6c 20 3d 20 70 53 71 6c 3b 0a 20 20 54 63 6c 5f  l = pSql;.  Tcl_
a370: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 53 71  IncrRefCount(pSq
a380: 6c 29 3b 0a 20 20 69 66 28 20 70 41 72 72 61 79  l);.  if( pArray
a390: 20 29 7b 0a 20 20 20 20 70 2d 3e 70 41 72 72 61   ){.    p->pArra
a3a0: 79 20 3d 20 70 41 72 72 61 79 3b 0a 20 20 20 20  y = pArray;.    
a3b0: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
a3c0: 28 70 41 72 72 61 79 29 3b 0a 20 20 7d 0a 7d 0a  (pArray);.  }.}.
a3d0: 0a 2f 2a 0a 2a 2a 20 4f 62 74 61 69 6e 20 69 6e  ./*.** Obtain in
a3e0: 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
a3f0: 74 68 65 20 72 6f 77 20 74 68 61 74 20 74 68 65  the row that the
a400: 20 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 20 70   DbEvalContext p
a410: 61 73 73 65 64 20 61 73 20 74 68 65 0a 2a 2a 20  assed as the.** 
a420: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 63  first argument c
a430: 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20  urrently points 
a440: 74 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  to..*/.static vo
a450: 69 64 20 64 62 45 76 61 6c 52 6f 77 49 6e 66 6f  id dbEvalRowInfo
a460: 28 0a 20 20 44 62 45 76 61 6c 43 6f 6e 74 65 78  (.  DbEvalContex
a470: 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
a480: 20 20 20 20 2f 2a 20 45 76 61 6c 75 61 74 69 6f      /* Evaluatio
a490: 6e 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69  n context */.  i
a4a0: 6e 74 20 2a 70 6e 43 6f 6c 2c 20 20 20 20 20 20  nt *pnCol,      
a4b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a4c0: 2a 20 4f 55 54 3a 20 4e 75 6d 62 65 72 20 6f 66  * OUT: Number of
a4d0: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f   column names */
a4e0: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 2a 70 61  .  Tcl_Obj ***pa
a4f0: 70 43 6f 6c 4e 61 6d 65 20 20 20 20 20 20 20 20  pColName        
a500: 20 20 20 2f 2a 20 4f 55 54 3a 20 41 72 72 61 79     /* OUT: Array
a510: 20 6f 66 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73   of column names
a520: 20 2a 2f 0a 29 7b 0a 20 20 2f 2a 20 43 6f 6d 70   */.){.  /* Comp
a530: 75 74 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  ute column names
a540: 20 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 70 2d 3e   */.  if( 0==p->
a550: 61 70 43 6f 6c 4e 61 6d 65 20 29 7b 0a 20 20 20  apColName ){.   
a560: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
a570: 53 74 6d 74 20 3d 20 70 2d 3e 70 50 72 65 53 74  Stmt = p->pPreSt
a580: 6d 74 2d 3e 70 53 74 6d 74 3b 0a 20 20 20 20 69  mt->pStmt;.    i
a590: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
a5a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a5b0: 49 74 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c  Iterator variabl
a5c0: 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 43 6f  e */.    int nCo
a5d0: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
a5e0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
a5f0: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 72 65 74 75   of columns retu
a600: 72 6e 65 64 20 62 79 20 70 53 74 6d 74 20 2a 2f  rned by pStmt */
a610: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 61  .    Tcl_Obj **a
a620: 70 43 6f 6c 4e 61 6d 65 20 3d 20 30 3b 20 20 20  pColName = 0;   
a630: 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 63     /* Array of c
a640: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 0a  olumn names */..
a650: 20 20 20 20 70 2d 3e 6e 43 6f 6c 20 3d 20 6e 43      p->nCol = nC
a660: 6f 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  ol = sqlite3_col
a670: 75 6d 6e 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29  umn_count(pStmt)
a680: 3b 0a 20 20 20 20 69 66 28 20 6e 43 6f 6c 3e 30  ;.    if( nCol>0
a690: 20 26 26 20 28 70 61 70 43 6f 6c 4e 61 6d 65 20   && (papColName 
a6a0: 7c 7c 20 70 2d 3e 70 41 72 72 61 79 29 20 29 7b  || p->pArray) ){
a6b0: 0a 20 20 20 20 20 20 61 70 43 6f 6c 4e 61 6d 65  .      apColName
a6c0: 20 3d 20 28 54 63 6c 5f 4f 62 6a 2a 2a 29 54 63   = (Tcl_Obj**)Tc
a6d0: 6c 5f 41 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  l_Alloc( sizeof(
a6e0: 54 63 6c 5f 4f 62 6a 2a 29 2a 6e 43 6f 6c 20 29  Tcl_Obj*)*nCol )
a6f0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
a700: 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20   i<nCol; i++){. 
a710: 20 20 20 20 20 20 20 61 70 43 6f 6c 4e 61 6d 65         apColName
a720: 5b 69 5d 20 3d 20 64 62 54 65 78 74 54 6f 4f 62  [i] = dbTextToOb
a730: 6a 28 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  j(sqlite3_column
a740: 5f 6e 61 6d 65 28 70 53 74 6d 74 2c 69 29 29 3b  _name(pStmt,i));
a750: 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 49 6e 63  .        Tcl_Inc
a760: 72 52 65 66 43 6f 75 6e 74 28 61 70 43 6f 6c 4e  rRefCount(apColN
a770: 61 6d 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d  ame[i]);.      }
a780: 0a 20 20 20 20 20 20 70 2d 3e 61 70 43 6f 6c 4e  .      p->apColN
a790: 61 6d 65 20 3d 20 61 70 43 6f 6c 4e 61 6d 65 3b  ame = apColName;
a7a0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
a7b0: 66 20 72 65 73 75 6c 74 73 20 61 72 65 20 62 65  f results are be
a7c0: 69 6e 67 20 73 74 6f 72 65 64 20 69 6e 20 61 6e  ing stored in an
a7d0: 20 61 72 72 61 79 20 76 61 72 69 61 62 6c 65 2c   array variable,
a7e0: 20 74 68 65 6e 20 63 72 65 61 74 65 0a 20 20 20   then create.   
a7f0: 20 2a 2a 20 74 68 65 20 61 72 72 61 79 28 2a 29   ** the array(*)
a800: 20 65 6e 74 72 79 20 66 6f 72 20 74 68 61 74 20   entry for that 
a810: 61 72 72 61 79 0a 20 20 20 20 2a 2f 0a 20 20 20  array.    */.   
a820: 20 69 66 28 20 70 2d 3e 70 41 72 72 61 79 20 29   if( p->pArray )
a830: 7b 0a 20 20 20 20 20 20 54 63 6c 5f 49 6e 74 65  {.      Tcl_Inte
a840: 72 70 20 2a 69 6e 74 65 72 70 20 3d 20 70 2d 3e  rp *interp = p->
a850: 70 44 62 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20  pDb->interp;.   
a860: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 43 6f 6c     Tcl_Obj *pCol
a870: 4c 69 73 74 20 3d 20 54 63 6c 5f 4e 65 77 4f 62  List = Tcl_NewOb
a880: 6a 28 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 4f  j();.      Tcl_O
a890: 62 6a 20 2a 70 53 74 61 72 20 3d 20 54 63 6c 5f  bj *pStar = Tcl_
a8a0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 2a 22  NewStringObj("*"
a8b0: 2c 20 2d 31 29 3b 0a 0a 20 20 20 20 20 20 66 6f  , -1);..      fo
a8c0: 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69  r(i=0; i<nCol; i
a8d0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c  ++){.        Tcl
a8e0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
a8f0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 43  ement(interp, pC
a900: 6f 6c 4c 69 73 74 2c 20 61 70 43 6f 6c 4e 61 6d  olList, apColNam
a910: 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  e[i]);.      }. 
a920: 20 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66       Tcl_IncrRef
a930: 43 6f 75 6e 74 28 70 53 74 61 72 29 3b 0a 20 20  Count(pStar);.  
a940: 20 20 20 20 54 63 6c 5f 4f 62 6a 53 65 74 56 61      Tcl_ObjSetVa
a950: 72 32 28 69 6e 74 65 72 70 2c 20 70 2d 3e 70 41  r2(interp, p->pA
a960: 72 72 61 79 2c 20 70 53 74 61 72 2c 20 70 43 6f  rray, pStar, pCo
a970: 6c 4c 69 73 74 2c 20 30 29 3b 0a 20 20 20 20 20  lList, 0);.     
a980: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
a990: 74 28 70 53 74 61 72 29 3b 0a 20 20 20 20 7d 0a  t(pStar);.    }.
a9a0: 20 20 7d 0a 0a 20 20 69 66 28 20 70 61 70 43 6f    }..  if( papCo
a9b0: 6c 4e 61 6d 65 20 29 7b 0a 20 20 20 20 2a 70 61  lName ){.    *pa
a9c0: 70 43 6f 6c 4e 61 6d 65 20 3d 20 70 2d 3e 61 70  pColName = p->ap
a9d0: 43 6f 6c 4e 61 6d 65 3b 0a 20 20 7d 0a 20 20 69  ColName;.  }.  i
a9e0: 66 28 20 70 6e 43 6f 6c 20 29 7b 0a 20 20 20 20  f( pnCol ){.    
a9f0: 2a 70 6e 43 6f 6c 20 3d 20 70 2d 3e 6e 43 6f 6c  *pnCol = p->nCol
aa00: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
aa10: 65 74 75 72 6e 20 6f 6e 65 20 6f 66 20 54 43 4c  eturn one of TCL
aa20: 5f 4f 4b 2c 20 54 43 4c 5f 42 52 45 41 4b 20 6f  _OK, TCL_BREAK o
aa30: 72 20 54 43 4c 5f 45 52 52 4f 52 2e 20 49 66 20  r TCL_ERROR. If 
aa40: 54 43 4c 5f 45 52 52 4f 52 20 69 73 0a 2a 2a 20  TCL_ERROR is.** 
aa50: 72 65 74 75 72 6e 65 64 2c 20 74 68 65 6e 20 61  returned, then a
aa60: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
aa70: 69 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  is stored in the
aa80: 20 69 6e 74 65 72 70 72 65 74 65 72 20 62 65 66   interpreter bef
aa90: 6f 72 65 0a 2a 2a 20 72 65 74 75 72 6e 69 6e 67  ore.** returning
aaa0: 2e 0a 2a 2a 0a 2a 2a 20 41 20 72 65 74 75 72 6e  ..**.** A return
aab0: 20 76 61 6c 75 65 20 6f 66 20 54 43 4c 5f 4f 4b   value of TCL_OK
aac0: 20 6d 65 61 6e 73 20 74 68 65 72 65 20 69 73 20   means there is 
aad0: 61 20 72 6f 77 20 6f 66 20 64 61 74 61 20 61 76  a row of data av
aae0: 61 69 6c 61 62 6c 65 2e 20 54 68 65 0a 2a 2a 20  ailable. The.** 
aaf0: 64 61 74 61 20 6d 61 79 20 62 65 20 61 63 63 65  data may be acce
ab00: 73 73 65 64 20 75 73 69 6e 67 20 64 62 45 76 61  ssed using dbEva
ab10: 6c 52 6f 77 49 6e 66 6f 28 29 20 61 6e 64 20 64  lRowInfo() and d
ab20: 62 45 76 61 6c 43 6f 6c 75 6d 6e 56 61 6c 75 65  bEvalColumnValue
ab30: 28 29 2e 20 54 68 69 73 0a 2a 2a 20 69 73 20 61  (). This.** is a
ab40: 6e 61 6c 6f 67 6f 75 73 20 74 6f 20 61 20 72 65  nalogous to a re
ab50: 74 75 72 6e 20 6f 66 20 53 51 4c 49 54 45 5f 52  turn of SQLITE_R
ab60: 4f 57 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f  OW from sqlite3_
ab70: 73 74 65 70 28 29 2e 20 49 66 20 54 43 4c 5f 42  step(). If TCL_B
ab80: 52 45 41 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72  REAK.** is retur
ab90: 6e 65 64 2c 20 74 68 65 6e 20 74 68 65 20 53 51  ned, then the SQ
aba0: 4c 20 73 63 72 69 70 74 20 68 61 73 20 66 69 6e  L script has fin
abb0: 69 73 68 65 64 20 65 78 65 63 75 74 69 6e 67 20  ished executing 
abc0: 61 6e 64 20 74 68 65 72 65 20 61 72 65 0a 2a 2a  and there are.**
abd0: 20 6e 6f 20 66 75 72 74 68 65 72 20 72 6f 77 73   no further rows
abe0: 20 61 76 61 69 6c 61 62 6c 65 2e 20 54 68 69 73   available. This
abf0: 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 53   is similar to S
ac00: 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 2a 2f 0a 73  QLITE_DONE..*/.s
ac10: 74 61 74 69 63 20 69 6e 74 20 64 62 45 76 61 6c  tatic int dbEval
ac20: 53 74 65 70 28 44 62 45 76 61 6c 43 6f 6e 74 65  Step(DbEvalConte
ac30: 78 74 20 2a 70 29 7b 0a 20 20 77 68 69 6c 65 28  xt *p){.  while(
ac40: 20 70 2d 3e 7a 53 71 6c 5b 30 5d 20 7c 7c 20 70   p->zSql[0] || p
ac50: 2d 3e 70 50 72 65 53 74 6d 74 20 29 7b 0a 20 20  ->pPreStmt ){.  
ac60: 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 69 66    int rc;.    if
ac70: 28 20 70 2d 3e 70 50 72 65 53 74 6d 74 3d 3d 30  ( p->pPreStmt==0
ac80: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 64   ){.      rc = d
ac90: 62 50 72 65 70 61 72 65 41 6e 64 42 69 6e 64 28  bPrepareAndBind(
aca0: 70 2d 3e 70 44 62 2c 20 70 2d 3e 7a 53 71 6c 2c  p->pDb, p->zSql,
acb0: 20 26 70 2d 3e 7a 53 71 6c 2c 20 26 70 2d 3e 70   &p->zSql, &p->p
acc0: 50 72 65 53 74 6d 74 29 3b 0a 20 20 20 20 20 20  PreStmt);.      
acd0: 69 66 28 20 72 63 21 3d 54 43 4c 5f 4f 4b 20 29  if( rc!=TCL_OK )
ace0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
acf0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
ad00: 20 72 63 73 3b 0a 20 20 20 20 20 20 53 71 6c 69   rcs;.      Sqli
ad10: 74 65 44 62 20 2a 70 44 62 20 3d 20 70 2d 3e 70  teDb *pDb = p->p
ad20: 44 62 3b 0a 20 20 20 20 20 20 53 71 6c 50 72 65  Db;.      SqlPre
ad30: 70 61 72 65 64 53 74 6d 74 20 2a 70 50 72 65 53  paredStmt *pPreS
ad40: 74 6d 74 20 3d 20 70 2d 3e 70 50 72 65 53 74 6d  tmt = p->pPreStm
ad50: 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  t;.      sqlite3
ad60: 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 70  _stmt *pStmt = p
ad70: 50 72 65 53 74 6d 74 2d 3e 70 53 74 6d 74 3b 0a  PreStmt->pStmt;.
ad80: 0a 20 20 20 20 20 20 72 63 73 20 3d 20 73 71 6c  .      rcs = sql
ad90: 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29  ite3_step(pStmt)
ada0: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 73 3d  ;.      if( rcs=
adb0: 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20  =SQLITE_ROW ){. 
adc0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43         return TC
add0: 4c 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  L_OK;.      }.  
ade0: 20 20 20 20 69 66 28 20 70 2d 3e 70 41 72 72 61      if( p->pArra
adf0: 79 20 29 7b 0a 20 20 20 20 20 20 20 20 64 62 45  y ){.        dbE
ae00: 76 61 6c 52 6f 77 49 6e 66 6f 28 70 2c 20 30 2c  valRowInfo(p, 0,
ae10: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
ae20: 20 20 20 72 63 73 20 3d 20 73 71 6c 69 74 65 33     rcs = sqlite3
ae30: 5f 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 0a  _reset(pStmt);..
ae40: 20 20 20 20 20 20 70 44 62 2d 3e 6e 53 74 65 70        pDb->nStep
ae50: 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f   = sqlite3_stmt_
ae60: 73 74 61 74 75 73 28 70 53 74 6d 74 2c 53 51 4c  status(pStmt,SQL
ae70: 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 46  ITE_STMTSTATUS_F
ae80: 55 4c 4c 53 43 41 4e 5f 53 54 45 50 2c 31 29 3b  ULLSCAN_STEP,1);
ae90: 0a 20 20 20 20 20 20 70 44 62 2d 3e 6e 53 6f 72  .      pDb->nSor
aea0: 74 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  t = sqlite3_stmt
aeb0: 5f 73 74 61 74 75 73 28 70 53 74 6d 74 2c 53 51  _status(pStmt,SQ
aec0: 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f  LITE_STMTSTATUS_
aed0: 53 4f 52 54 2c 31 29 3b 0a 20 20 20 20 20 20 70  SORT,1);.      p
aee0: 44 62 2d 3e 6e 49 6e 64 65 78 20 3d 20 73 71 6c  Db->nIndex = sql
aef0: 69 74 65 33 5f 73 74 6d 74 5f 73 74 61 74 75 73  ite3_stmt_status
af00: 28 70 53 74 6d 74 2c 53 51 4c 49 54 45 5f 53 54  (pStmt,SQLITE_ST
af10: 4d 54 53 54 41 54 55 53 5f 41 55 54 4f 49 4e 44  MTSTATUS_AUTOIND
af20: 45 58 2c 31 29 3b 0a 20 20 20 20 20 20 64 62 52  EX,1);.      dbR
af30: 65 6c 65 61 73 65 43 6f 6c 75 6d 6e 4e 61 6d 65  eleaseColumnName
af40: 73 28 70 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70  s(p);.      p->p
af50: 50 72 65 53 74 6d 74 20 3d 20 30 3b 0a 0a 20 20  PreStmt = 0;..  
af60: 20 20 20 20 69 66 28 20 72 63 73 21 3d 53 51 4c      if( rcs!=SQL
af70: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
af80: 20 20 2f 2a 20 49 66 20 61 20 72 75 6e 2d 74 69    /* If a run-ti
af90: 6d 65 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  me error occurs,
afa0: 20 72 65 70 6f 72 74 20 74 68 65 20 65 72 72 6f   report the erro
afb0: 72 20 61 6e 64 20 73 74 6f 70 20 72 65 61 64 69  r and stop readi
afc0: 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  ng.        ** th
afd0: 65 20 53 51 4c 2e 20 20 2a 2f 0a 20 20 20 20 20  e SQL.  */.     
afe0: 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73     Tcl_SetObjRes
aff0: 75 6c 74 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c  ult(pDb->interp,
b000: 20 64 62 54 65 78 74 54 6f 4f 62 6a 28 73 71 6c   dbTextToObj(sql
b010: 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d  ite3_errmsg(pDb-
b020: 3e 64 62 29 29 29 3b 0a 20 20 20 20 20 20 20 20  >db)));.        
b030: 64 62 52 65 6c 65 61 73 65 53 74 6d 74 28 70 44  dbReleaseStmt(pD
b040: 62 2c 20 70 50 72 65 53 74 6d 74 2c 20 31 29 3b  b, pPreStmt, 1);
b050: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
b060: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  TCL_ERROR;.     
b070: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
b080: 64 62 52 65 6c 65 61 73 65 53 74 6d 74 28 70 44  dbReleaseStmt(pD
b090: 62 2c 20 70 50 72 65 53 74 6d 74 2c 20 30 29 3b  b, pPreStmt, 0);
b0a0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
b0b0: 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 69 73 68 65   }..  /* Finishe
b0c0: 64 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 54 43  d */.  return TC
b0d0: 4c 5f 42 52 45 41 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  L_BREAK;.}../*.*
b0e0: 2a 20 46 72 65 65 20 61 6c 6c 20 72 65 73 6f 75  * Free all resou
b0f0: 72 63 65 73 20 63 75 72 72 65 6e 74 6c 79 20 68  rces currently h
b100: 65 6c 64 20 62 79 20 74 68 65 20 44 62 45 76 61  eld by the DbEva
b110: 6c 43 6f 6e 74 65 78 74 20 73 74 72 75 63 74 75  lContext structu
b120: 72 65 20 70 61 73 73 65 64 0a 2a 2a 20 61 73 20  re passed.** as 
b130: 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
b140: 6e 74 2e 20 54 68 65 72 65 20 73 68 6f 75 6c 64  nt. There should
b150: 20 62 65 20 65 78 61 63 74 6c 79 20 6f 6e 65 20   be exactly one 
b160: 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 66 75 6e  call to this fun
b170: 63 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 65 61 63  ction.** for eac
b180: 68 20 63 61 6c 6c 20 74 6f 20 64 62 45 76 61 6c  h call to dbEval
b190: 49 6e 69 74 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  Init()..*/.stati
b1a0: 63 20 76 6f 69 64 20 64 62 45 76 61 6c 46 69 6e  c void dbEvalFin
b1b0: 61 6c 69 7a 65 28 44 62 45 76 61 6c 43 6f 6e 74  alize(DbEvalCont
b1c0: 65 78 74 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  ext *p){.  if( p
b1d0: 2d 3e 70 50 72 65 53 74 6d 74 20 29 7b 0a 20 20  ->pPreStmt ){.  
b1e0: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28    sqlite3_reset(
b1f0: 70 2d 3e 70 50 72 65 53 74 6d 74 2d 3e 70 53 74  p->pPreStmt->pSt
b200: 6d 74 29 3b 0a 20 20 20 20 64 62 52 65 6c 65 61  mt);.    dbRelea
b210: 73 65 53 74 6d 74 28 70 2d 3e 70 44 62 2c 20 70  seStmt(p->pDb, p
b220: 2d 3e 70 50 72 65 53 74 6d 74 2c 20 30 29 3b 0a  ->pPreStmt, 0);.
b230: 20 20 20 20 70 2d 3e 70 50 72 65 53 74 6d 74 20      p->pPreStmt 
b240: 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  = 0;.  }.  if( p
b250: 2d 3e 70 41 72 72 61 79 20 29 7b 0a 20 20 20 20  ->pArray ){.    
b260: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
b270: 28 70 2d 3e 70 41 72 72 61 79 29 3b 0a 20 20 20  (p->pArray);.   
b280: 20 70 2d 3e 70 41 72 72 61 79 20 3d 20 30 3b 0a   p->pArray = 0;.
b290: 20 20 7d 0a 20 20 54 63 6c 5f 44 65 63 72 52 65    }.  Tcl_DecrRe
b2a0: 66 43 6f 75 6e 74 28 70 2d 3e 70 53 71 6c 29 3b  fCount(p->pSql);
b2b0: 0a 20 20 64 62 52 65 6c 65 61 73 65 43 6f 6c 75  .  dbReleaseColu
b2c0: 6d 6e 4e 61 6d 65 73 28 70 29 3b 0a 7d 0a 0a 2f  mnNames(p);.}../
b2d0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  *.** Return a po
b2e0: 69 6e 74 65 72 20 74 6f 20 61 20 54 63 6c 5f 4f  inter to a Tcl_O
b2f0: 62 6a 20 73 74 72 75 63 74 75 72 65 20 77 69 74  bj structure wit
b300: 68 20 72 65 66 2d 63 6f 75 6e 74 20 30 20 74 68  h ref-count 0 th
b310: 61 74 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 74  at contains.** t
b320: 68 65 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65  he value for the
b330: 20 69 43 6f 6c 27 74 68 20 63 6f 6c 75 6d 6e 20   iCol'th column 
b340: 6f 66 20 74 68 65 20 72 6f 77 20 63 75 72 72 65  of the row curre
b350: 6e 74 6c 79 20 70 6f 69 6e 74 65 64 20 74 6f 20  ntly pointed to 
b360: 62 79 0a 2a 2a 20 74 68 65 20 44 62 45 76 61 6c  by.** the DbEval
b370: 43 6f 6e 74 65 78 74 20 73 74 72 75 63 74 75 72  Context structur
b380: 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  e passed as the 
b390: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a  first argument..
b3a0: 2a 2f 0a 73 74 61 74 69 63 20 54 63 6c 5f 4f 62  */.static Tcl_Ob
b3b0: 6a 20 2a 64 62 45 76 61 6c 43 6f 6c 75 6d 6e 56  j *dbEvalColumnV
b3c0: 61 6c 75 65 28 44 62 45 76 61 6c 43 6f 6e 74 65  alue(DbEvalConte
b3d0: 78 74 20 2a 70 2c 20 69 6e 74 20 69 43 6f 6c 29  xt *p, int iCol)
b3e0: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  {.  sqlite3_stmt
b3f0: 20 2a 70 53 74 6d 74 20 3d 20 70 2d 3e 70 50 72   *pStmt = p->pPr
b400: 65 53 74 6d 74 2d 3e 70 53 74 6d 74 3b 0a 20 20  eStmt->pStmt;.  
b410: 73 77 69 74 63 68 28 20 73 71 6c 69 74 65 33 5f  switch( sqlite3_
b420: 63 6f 6c 75 6d 6e 5f 74 79 70 65 28 70 53 74 6d  column_type(pStm
b430: 74 2c 20 69 43 6f 6c 29 20 29 7b 0a 20 20 20 20  t, iCol) ){.    
b440: 63 61 73 65 20 53 51 4c 49 54 45 5f 42 4c 4f 42  case SQLITE_BLOB
b450: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 62 79  : {.      int by
b460: 74 65 73 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  tes = sqlite3_co
b470: 6c 75 6d 6e 5f 62 79 74 65 73 28 70 53 74 6d 74  lumn_bytes(pStmt
b480: 2c 20 69 43 6f 6c 29 3b 0a 20 20 20 20 20 20 63  , iCol);.      c
b490: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 42 6c 6f 62  onst char *zBlob
b4a0: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
b4b0: 6e 5f 62 6c 6f 62 28 70 53 74 6d 74 2c 20 69 43  n_blob(pStmt, iC
b4c0: 6f 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  ol);.      if( !
b4d0: 7a 42 6c 6f 62 20 29 20 62 79 74 65 73 20 3d 20  zBlob ) bytes = 
b4e0: 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  0;.      return 
b4f0: 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79  Tcl_NewByteArray
b500: 4f 62 6a 28 28 75 38 2a 29 7a 42 6c 6f 62 2c 20  Obj((u8*)zBlob, 
b510: 62 79 74 65 73 29 3b 0a 20 20 20 20 7d 0a 20 20  bytes);.    }.  
b520: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e    case SQLITE_IN
b530: 54 45 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 73  TEGER: {.      s
b540: 71 6c 69 74 65 5f 69 6e 74 36 34 20 76 20 3d 20  qlite_int64 v = 
b550: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
b560: 6e 74 36 34 28 70 53 74 6d 74 2c 20 69 43 6f 6c  nt64(pStmt, iCol
b570: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 76 3e 3d  );.      if( v>=
b580: 2d 32 31 34 37 34 38 33 36 34 37 20 26 26 20 76  -2147483647 && v
b590: 3c 3d 32 31 34 37 34 38 33 36 34 37 20 29 7b 0a  <=2147483647 ){.
b5a0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54          return T
b5b0: 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 76 29 3b  cl_NewIntObj(v);
b5c0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
b5d0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 63 6c        return Tcl
b5e0: 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 76  _NewWideIntObj(v
b5f0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
b600: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
b610: 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20  _FLOAT: {.      
b620: 72 65 74 75 72 6e 20 54 63 6c 5f 4e 65 77 44 6f  return Tcl_NewDo
b630: 75 62 6c 65 4f 62 6a 28 73 71 6c 69 74 65 33 5f  ubleObj(sqlite3_
b640: 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 28 70 53  column_double(pS
b650: 74 6d 74 2c 20 69 43 6f 6c 29 29 3b 0a 20 20 20  tmt, iCol));.   
b660: 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
b670: 54 45 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20  TE_NULL: {.     
b680: 20 72 65 74 75 72 6e 20 64 62 54 65 78 74 54 6f   return dbTextTo
b690: 4f 62 6a 28 70 2d 3e 70 44 62 2d 3e 7a 4e 75 6c  Obj(p->pDb->zNul
b6a0: 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  l);.    }.  }.. 
b6b0: 20 72 65 74 75 72 6e 20 64 62 54 65 78 74 54 6f   return dbTextTo
b6c0: 4f 62 6a 28 28 63 68 61 72 20 2a 29 73 71 6c 69  Obj((char *)sqli
b6d0: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
b6e0: 70 53 74 6d 74 2c 20 69 43 6f 6c 29 29 3b 0a 7d  pStmt, iCol));.}
b6f0: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 75 73 69 6e 67  ../*.** If using
b700: 20 54 63 6c 20 76 65 72 73 69 6f 6e 20 38 2e 36   Tcl version 8.6
b710: 20 6f 72 20 67 72 65 61 74 65 72 2c 20 75 73 65   or greater, use
b720: 20 74 68 65 20 4e 52 20 66 75 6e 63 74 69 6f 6e   the NR function
b730: 73 20 74 6f 20 61 76 6f 69 64 0a 2a 2a 20 72 65  s to avoid.** re
b740: 63 75 72 73 69 76 65 20 65 76 61 6c 75 74 69 6f  cursive evalutio
b750: 6e 20 6f 66 20 73 63 72 69 70 74 73 20 62 79 20  n of scripts by 
b760: 74 68 65 20 5b 64 62 20 65 76 61 6c 5d 20 61 6e  the [db eval] an
b770: 64 20 5b 64 62 20 74 72 61 6e 73 5d 0a 2a 2a 20  d [db trans].** 
b780: 63 6f 6d 6d 61 6e 64 73 2e 20 45 76 65 6e 20 69  commands. Even i
b790: 66 20 74 68 65 20 68 65 61 64 65 72 73 20 75 73  f the headers us
b7a0: 65 64 20 77 68 69 6c 65 20 63 6f 6d 70 69 6c 69  ed while compili
b7b0: 6e 67 20 74 68 65 20 65 78 74 65 6e 73 69 6f 6e  ng the extension
b7c0: 0a 2a 2a 20 61 72 65 20 38 2e 36 20 6f 72 20 6e  .** are 8.6 or n
b7d0: 65 77 65 72 2c 20 74 68 65 20 63 6f 64 65 20 73  ewer, the code s
b7e0: 74 69 6c 6c 20 74 65 73 74 73 20 74 68 65 20 54  till tests the T
b7f0: 63 6c 20 76 65 72 73 69 6f 6e 20 61 74 20 72 75  cl version at ru
b800: 6e 74 69 6d 65 2e 0a 2a 2a 20 54 68 69 73 20 61  ntime..** This a
b810: 6c 6c 6f 77 73 20 73 74 75 62 73 2d 65 6e 61 62  llows stubs-enab
b820: 6c 65 64 20 62 75 69 6c 64 73 20 74 6f 20 62 65  led builds to be
b830: 20 75 73 65 64 20 77 69 74 68 20 6f 6c 64 65 72   used with older
b840: 20 54 63 6c 20 6c 69 62 72 61 72 69 65 73 2e 0a   Tcl libraries..
b850: 2a 2f 0a 23 69 66 20 54 43 4c 5f 4d 41 4a 4f 52  */.#if TCL_MAJOR
b860: 5f 56 45 52 53 49 4f 4e 3e 38 20 7c 7c 20 28 54  _VERSION>8 || (T
b870: 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f 4e  CL_MAJOR_VERSION
b880: 3d 3d 38 20 26 26 20 54 43 4c 5f 4d 49 4e 4f 52  ==8 && TCL_MINOR
b890: 5f 56 45 52 53 49 4f 4e 3e 3d 36 29 0a 23 20 64  _VERSION>=6).# d
b8a0: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 54 43 4c  efine SQLITE_TCL
b8b0: 5f 4e 52 45 20 31 0a 73 74 61 74 69 63 20 69 6e  _NRE 1.static in
b8c0: 74 20 44 62 55 73 65 4e 72 65 28 76 6f 69 64 29  t DbUseNre(void)
b8d0: 7b 0a 20 20 69 6e 74 20 6d 61 6a 6f 72 2c 20 6d  {.  int major, m
b8e0: 69 6e 6f 72 3b 0a 20 20 54 63 6c 5f 47 65 74 56  inor;.  Tcl_GetV
b8f0: 65 72 73 69 6f 6e 28 26 6d 61 6a 6f 72 2c 20 26  ersion(&major, &
b900: 6d 69 6e 6f 72 2c 20 30 2c 20 30 29 3b 0a 20 20  minor, 0, 0);.  
b910: 72 65 74 75 72 6e 28 20 28 6d 61 6a 6f 72 3d 3d  return( (major==
b920: 38 20 26 26 20 6d 69 6e 6f 72 3e 3d 36 29 20 7c  8 && minor>=6) |
b930: 7c 20 6d 61 6a 6f 72 3e 38 20 29 3b 0a 7d 0a 23  | major>8 );.}.#
b940: 65 6c 73 65 0a 2f 2a 20 0a 2a 2a 20 43 6f 6d 70  else./* .** Comp
b950: 69 6c 69 6e 67 20 75 73 69 6e 67 20 68 65 61 64  iling using head
b960: 65 72 73 20 65 61 72 6c 69 65 72 20 74 68 61 6e  ers earlier than
b970: 20 38 2e 36 2e 20 49 6e 20 74 68 69 73 20 63 61   8.6. In this ca
b980: 73 65 20 4e 52 20 63 61 6e 6e 6f 74 20 62 65 0a  se NR cannot be.
b990: 2a 2a 20 75 73 65 64 2c 20 73 6f 20 44 62 55 73  ** used, so DbUs
b9a0: 65 4e 72 65 28 29 20 74 6f 20 61 6c 77 61 79 73  eNre() to always
b9b0: 20 72 65 74 75 72 6e 20 7a 65 72 6f 2e 20 41 64   return zero. Ad
b9c0: 64 20 23 64 65 66 69 6e 65 73 20 66 6f 72 20 74  d #defines for t
b9d0: 68 65 20 6f 74 68 65 72 0a 2a 2a 20 54 63 6c 5f  he other.** Tcl_
b9e0: 4e 52 78 78 78 28 29 20 66 75 6e 63 74 69 6f 6e  NRxxx() function
b9f0: 73 20 74 6f 20 70 72 65 76 65 6e 74 20 74 68 65  s to prevent the
ba00: 6d 20 66 72 6f 6d 20 63 61 75 73 69 6e 67 20 63  m from causing c
ba10: 6f 6d 70 69 6c 61 74 69 6f 6e 20 65 72 72 6f 72  ompilation error
ba20: 73 2c 0a 2a 2a 20 65 76 65 6e 20 74 68 6f 75 67  s,.** even thoug
ba30: 68 20 74 68 65 20 6f 6e 6c 79 20 69 6e 76 6f 63  h the only invoc
ba40: 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 6d 20 61  ations of them a
ba50: 72 65 20 77 69 74 68 69 6e 20 63 6f 6e 64 69 74  re within condit
ba60: 69 6f 6e 61 6c 20 62 6c 6f 63 6b 73 20 0a 2a 2a  ional blocks .**
ba70: 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a   of the form:.**
ba80: 0a 2a 2a 20 20 20 69 66 28 20 44 62 55 73 65 4e  .**   if( DbUseN
ba90: 72 65 28 29 20 29 20 7b 20 2e 2e 2e 20 7d 0a 2a  re() ) { ... }.*
baa0: 2f 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54  /.# define SQLIT
bab0: 45 5f 54 43 4c 5f 4e 52 45 20 30 0a 23 20 64 65  E_TCL_NRE 0.# de
bac0: 66 69 6e 65 20 44 62 55 73 65 4e 72 65 28 29 20  fine DbUseNre() 
bad0: 30 0a 23 20 64 65 66 69 6e 65 20 54 63 6c 5f 4e  0.# define Tcl_N
bae0: 52 41 64 64 43 61 6c 6c 62 61 63 6b 28 61 2c 62  RAddCallback(a,b
baf0: 2c 63 2c 64 2c 65 2c 66 29 20 30 0a 23 20 64 65  ,c,d,e,f) 0.# de
bb00: 66 69 6e 65 20 54 63 6c 5f 4e 52 45 76 61 6c 4f  fine Tcl_NREvalO
bb10: 62 6a 28 61 2c 62 2c 63 29 20 30 0a 23 20 64 65  bj(a,b,c) 0.# de
bb20: 66 69 6e 65 20 54 63 6c 5f 4e 52 43 72 65 61 74  fine Tcl_NRCreat
bb30: 65 43 6f 6d 6d 61 6e 64 28 61 2c 62 2c 63 2c 64  eCommand(a,b,c,d
bb40: 2c 65 2c 66 29 20 30 0a 23 65 6e 64 69 66 0a 0a  ,e,f) 0.#endif..
bb50: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
bb60: 69 6f 6e 20 69 73 20 70 61 72 74 20 6f 66 20 74  ion is part of t
bb70: 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
bb80: 6e 20 6f 66 20 74 68 65 20 63 6f 6d 6d 61 6e 64  n of the command
bb90: 3a 0a 2a 2a 0a 2a 2a 20 20 20 24 64 62 20 65 76  :.**.**   $db ev
bba0: 61 6c 20 53 51 4c 20 3f 41 52 52 41 59 4e 41 4d  al SQL ?ARRAYNAM
bbb0: 45 3f 20 53 43 52 49 50 54 0a 2a 2f 0a 73 74 61  E? SCRIPT.*/.sta
bbc0: 74 69 63 20 69 6e 74 20 44 62 45 76 61 6c 4e 65  tic int DbEvalNe
bbd0: 78 74 43 6d 64 28 0a 20 20 43 6c 69 65 6e 74 44  xtCmd(.  ClientD
bbe0: 61 74 61 20 64 61 74 61 5b 5d 2c 20 20 20 20 20  ata data[],     
bbf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
bc00: 20 64 61 74 61 5b 30 5d 20 69 73 20 74 68 65 20   data[0] is the 
bc10: 28 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 2a 29  (DbEvalContext*)
bc20: 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70   */.  Tcl_Interp
bc30: 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 20 20 20   *interp,       
bc40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 63             /* Tc
bc50: 6c 20 69 6e 74 65 72 70 72 65 74 65 72 20 2a 2f  l interpreter */
bc60: 0a 20 20 69 6e 74 20 72 65 73 75 6c 74 20 20 20  .  int result   
bc70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bc80: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
bc90: 74 20 73 6f 20 66 61 72 20 2a 2f 0a 29 7b 0a 20  t so far */.){. 
bca0: 20 69 6e 74 20 72 63 20 3d 20 72 65 73 75 6c 74   int rc = result
bcb0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
bcc0: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
bcd0: 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68  code */..  /* Th
bce0: 65 20 66 69 72 73 74 20 65 6c 65 6d 65 6e 74 20  e first element 
bcf0: 6f 66 20 74 68 65 20 64 61 74 61 5b 5d 20 61 72  of the data[] ar
bd00: 72 61 79 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ray is a pointer
bd10: 20 74 6f 20 61 20 44 62 45 76 61 6c 43 6f 6e 74   to a DbEvalCont
bd20: 65 78 74 0a 20 20 2a 2a 20 73 74 72 75 63 74 75  ext.  ** structu
bd30: 72 65 20 61 6c 6c 6f 63 61 74 65 64 20 75 73 69  re allocated usi
bd40: 6e 67 20 54 63 6c 5f 41 6c 6c 6f 63 28 29 2e 20  ng Tcl_Alloc(). 
bd50: 54 68 65 20 73 65 63 6f 6e 64 20 65 6c 65 6d 65  The second eleme
bd60: 6e 74 20 6f 66 20 64 61 74 61 5b 5d 0a 20 20 2a  nt of data[].  *
bd70: 2a 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  * is a pointer t
bd80: 6f 20 61 20 54 63 6c 5f 4f 62 6a 20 63 6f 6e 74  o a Tcl_Obj cont
bd90: 61 69 6e 69 6e 67 20 74 68 65 20 73 63 72 69 70  aining the scrip
bda0: 74 20 74 6f 20 72 75 6e 20 66 6f 72 20 65 61 63  t to run for eac
bdb0: 68 20 72 6f 77 0a 20 20 2a 2a 20 72 65 74 75 72  h row.  ** retur
bdc0: 6e 65 64 20 62 79 20 74 68 65 20 71 75 65 72 69  ned by the queri
bdd0: 65 73 20 65 6e 63 61 70 73 75 6c 61 74 65 64 20  es encapsulated 
bde0: 69 6e 20 64 61 74 61 5b 30 5d 2e 20 2a 2f 0a 20  in data[0]. */. 
bdf0: 20 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 20 2a   DbEvalContext *
be00: 70 20 3d 20 28 44 62 45 76 61 6c 43 6f 6e 74 65  p = (DbEvalConte
be10: 78 74 20 2a 29 64 61 74 61 5b 30 5d 3b 0a 20 20  xt *)data[0];.  
be20: 54 63 6c 5f 4f 62 6a 20 2a 70 53 63 72 69 70 74  Tcl_Obj *pScript
be30: 20 3d 20 28 54 63 6c 5f 4f 62 6a 20 2a 29 64 61   = (Tcl_Obj *)da
be40: 74 61 5b 31 5d 3b 0a 20 20 54 63 6c 5f 4f 62 6a  ta[1];.  Tcl_Obj
be50: 20 2a 70 41 72 72 61 79 20 3d 20 70 2d 3e 70 41   *pArray = p->pA
be60: 72 72 61 79 3b 0a 0a 20 20 77 68 69 6c 65 28 20  rray;..  while( 
be70: 28 72 63 3d 3d 54 43 4c 5f 4f 4b 20 7c 7c 20 72  (rc==TCL_OK || r
be80: 63 3d 3d 54 43 4c 5f 43 4f 4e 54 49 4e 55 45 29  c==TCL_CONTINUE)
be90: 20 26 26 20 54 43 4c 5f 4f 4b 3d 3d 28 72 63 20   && TCL_OK==(rc 
bea0: 3d 20 64 62 45 76 61 6c 53 74 65 70 28 70 29 29  = dbEvalStep(p))
beb0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
bec0: 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 20     int nCol;.   
bed0: 20 54 63 6c 5f 4f 62 6a 20 2a 2a 61 70 43 6f 6c   Tcl_Obj **apCol
bee0: 4e 61 6d 65 3b 0a 20 20 20 20 64 62 45 76 61 6c  Name;.    dbEval
bef0: 52 6f 77 49 6e 66 6f 28 70 2c 20 26 6e 43 6f 6c  RowInfo(p, &nCol
bf00: 2c 20 26 61 70 43 6f 6c 4e 61 6d 65 29 3b 0a 20  , &apColName);. 
bf10: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
bf20: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
bf30: 54 63 6c 5f 4f 62 6a 20 2a 70 56 61 6c 20 3d 20  Tcl_Obj *pVal = 
bf40: 64 62 45 76 61 6c 43 6f 6c 75 6d 6e 56 61 6c 75  dbEvalColumnValu
bf50: 65 28 70 2c 20 69 29 3b 0a 20 20 20 20 20 20 69  e(p, i);.      i
bf60: 66 28 20 70 41 72 72 61 79 3d 3d 30 20 29 7b 0a  f( pArray==0 ){.
bf70: 20 20 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 53          Tcl_ObjS
bf80: 65 74 56 61 72 32 28 69 6e 74 65 72 70 2c 20 61  etVar2(interp, a
bf90: 70 43 6f 6c 4e 61 6d 65 5b 69 5d 2c 20 30 2c 20  pColName[i], 0, 
bfa0: 70 56 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20  pVal, 0);.      
bfb0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 54  }else{.        T
bfc0: 63 6c 5f 4f 62 6a 53 65 74 56 61 72 32 28 69 6e  cl_ObjSetVar2(in
bfd0: 74 65 72 70 2c 20 70 41 72 72 61 79 2c 20 61 70  terp, pArray, ap
bfe0: 43 6f 6c 4e 61 6d 65 5b 69 5d 2c 20 70 56 61 6c  ColName[i], pVal
bff0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
c000: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20    }..    /* The 
c010: 72 65 71 75 69 72 65 64 20 69 6e 74 65 72 70 72  required interpr
c020: 65 74 65 72 20 76 61 72 69 61 62 6c 65 73 20 61  eter variables a
c030: 72 65 20 6e 6f 77 20 70 6f 70 75 6c 61 74 65 64  re now populated
c040: 20 77 69 74 68 20 74 68 65 20 64 61 74 61 20 0a   with the data .
c050: 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20      ** from the 
c060: 63 75 72 72 65 6e 74 20 72 6f 77 2e 20 49 66 20  current row. If 
c070: 75 73 69 6e 67 20 4e 52 45 2c 20 73 63 68 65 64  using NRE, sched
c080: 75 6c 65 20 63 61 6c 6c 62 61 63 6b 73 20 74 6f  ule callbacks to
c090: 20 65 76 61 6c 75 61 74 65 0a 20 20 20 20 2a 2a   evaluate.    **
c0a0: 20 73 63 72 69 70 74 20 70 53 63 72 69 70 74 2c   script pScript,
c0b0: 20 74 68 65 6e 20 74 6f 20 69 6e 76 6f 6b 65 20   then to invoke 
c0c0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 67  this function ag
c0d0: 61 69 6e 20 74 6f 20 66 65 74 63 68 20 74 68 65  ain to fetch the
c0e0: 20 6e 65 78 74 0a 20 20 20 20 2a 2a 20 72 6f 77   next.    ** row
c0f0: 20 28 6f 72 20 63 6c 65 61 6e 20 75 70 20 69 66   (or clean up if
c100: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 78   there is no nex
c110: 74 20 72 6f 77 20 6f 72 20 74 68 65 20 73 63 72  t row or the scr
c120: 69 70 74 20 74 68 72 6f 77 73 20 61 6e 0a 20 20  ipt throws an.  
c130: 20 20 2a 2a 20 65 78 63 65 70 74 69 6f 6e 29 2e    ** exception).
c140: 20 41 66 74 65 72 20 73 63 68 65 64 75 6c 69 6e   After schedulin
c150: 67 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 73 2c  g the callbacks,
c160: 20 72 65 74 75 72 6e 20 63 6f 6e 74 72 6f 6c 20   return control 
c170: 74 6f 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 63  to the .    ** c
c180: 61 6c 6c 65 72 2e 0a 20 20 20 20 2a 2a 0a 20 20  aller..    **.  
c190: 20 20 2a 2a 20 49 66 20 6e 6f 74 20 75 73 69 6e    ** If not usin
c1a0: 67 20 4e 52 45 2c 20 65 76 61 6c 75 61 74 65 20  g NRE, evaluate 
c1b0: 70 53 63 72 69 70 74 20 64 69 72 65 63 74 6c 79  pScript directly
c1c0: 20 61 6e 64 20 63 6f 6e 74 69 6e 75 65 20 77 69   and continue wi
c1d0: 74 68 20 74 68 65 0a 20 20 20 20 2a 2a 20 6e 65  th the.    ** ne
c1e0: 78 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20  xt iteration of 
c1f0: 74 68 69 73 20 77 68 69 6c 65 28 2e 2e 2e 29 20  this while(...) 
c200: 6c 6f 6f 70 2e 20 20 2a 2f 0a 20 20 20 20 69 66  loop.  */.    if
c210: 28 20 44 62 55 73 65 4e 72 65 28 29 20 29 7b 0a  ( DbUseNre() ){.
c220: 20 20 20 20 20 20 54 63 6c 5f 4e 52 41 64 64 43        Tcl_NRAddC
c230: 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c 20  allback(interp, 
c240: 44 62 45 76 61 6c 4e 65 78 74 43 6d 64 2c 20 28  DbEvalNextCmd, (
c250: 76 6f 69 64 2a 29 70 2c 20 28 76 6f 69 64 2a 29  void*)p, (void*)
c260: 70 53 63 72 69 70 74 2c 20 30 2c 20 30 29 3b 0a  pScript, 0, 0);.
c270: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 63 6c        return Tcl
c280: 5f 4e 52 45 76 61 6c 4f 62 6a 28 69 6e 74 65 72  _NREvalObj(inter
c290: 70 2c 20 70 53 63 72 69 70 74 2c 20 30 29 3b 0a  p, pScript, 0);.
c2a0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
c2b0: 20 72 63 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62   rc = Tcl_EvalOb
c2c0: 6a 45 78 28 69 6e 74 65 72 70 2c 20 70 53 63 72  jEx(interp, pScr
c2d0: 69 70 74 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  ipt, 0);.    }. 
c2e0: 20 7d 0a 0a 20 20 54 63 6c 5f 44 65 63 72 52 65   }..  Tcl_DecrRe
c2f0: 66 43 6f 75 6e 74 28 70 53 63 72 69 70 74 29 3b  fCount(pScript);
c300: 0a 20 20 64 62 45 76 61 6c 46 69 6e 61 6c 69 7a  .  dbEvalFinaliz
c310: 65 28 70 29 3b 0a 20 20 54 63 6c 5f 46 72 65 65  e(p);.  Tcl_Free
c320: 28 28 63 68 61 72 20 2a 29 70 29 3b 0a 0a 20 20  ((char *)p);..  
c330: 69 66 28 20 72 63 3d 3d 54 43 4c 5f 4f 4b 20 7c  if( rc==TCL_OK |
c340: 7c 20 72 63 3d 3d 54 43 4c 5f 42 52 45 41 4b 20  | rc==TCL_BREAK 
c350: 29 7b 0a 20 20 20 20 54 63 6c 5f 52 65 73 65 74  ){.    Tcl_Reset
c360: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a  Result(interp);.
c370: 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 4f 4b 3b      rc = TCL_OK;
c380: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
c390: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 22  ;.}../*.** The "
c3a0: 73 71 6c 69 74 65 22 20 63 6f 6d 6d 61 6e 64 20  sqlite" command 
c3b0: 62 65 6c 6f 77 20 63 72 65 61 74 65 73 20 61 20  below creates a 
c3c0: 6e 65 77 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 20  new Tcl command 
c3d0: 66 6f 72 20 65 61 63 68 0a 2a 2a 20 63 6f 6e 6e  for each.** conn
c3e0: 65 63 74 69 6f 6e 20 69 74 20 6f 70 65 6e 73 20  ection it opens 
c3f0: 74 6f 20 61 6e 20 53 51 4c 69 74 65 20 64 61 74  to an SQLite dat
c400: 61 62 61 73 65 2e 20 20 54 68 69 73 20 72 6f 75  abase.  This rou
c410: 74 69 6e 65 20 69 73 20 69 6e 76 6f 6b 65 64 0a  tine is invoked.
c420: 2a 2a 20 77 68 65 6e 65 76 65 72 20 6f 6e 65 20  ** whenever one 
c430: 6f 66 20 74 68 6f 73 65 20 63 6f 6e 6e 65 63 74  of those connect
c440: 69 6f 6e 2d 73 70 65 63 69 66 69 63 20 63 6f 6d  ion-specific com
c450: 6d 61 6e 64 73 20 69 73 20 65 78 65 63 75 74 65  mands is execute
c460: 64 0a 2a 2a 20 69 6e 20 54 63 6c 2e 20 20 46 6f  d.** in Tcl.  Fo
c470: 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 79 6f  r example, if yo
c480: 75 20 72 75 6e 20 54 63 6c 20 63 6f 64 65 20 6c  u run Tcl code l
c490: 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20  ike this:.**.** 
c4a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 64 62        sqlite3 db
c4b0: 31 20 20 22 6d 79 5f 64 61 74 61 62 61 73 65 22  1  "my_database"
c4c0: 0a 2a 2a 20 20 20 20 20 20 20 64 62 31 20 63 6c  .**       db1 cl
c4d0: 6f 73 65 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69  ose.**.** The fi
c4e0: 72 73 74 20 63 6f 6d 6d 61 6e 64 20 6f 70 65 6e  rst command open
c4f0: 73 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74  s a connection t
c500: 6f 20 74 68 65 20 22 6d 79 5f 64 61 74 61 62 61  o the "my_databa
c510: 73 65 22 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  se" database.** 
c520: 61 6e 64 20 63 61 6c 6c 73 20 74 68 61 74 20 63  and calls that c
c530: 6f 6e 6e 65 63 74 69 6f 6e 20 22 64 62 31 22 2e  onnection "db1".
c540: 20 20 54 68 65 20 73 65 63 6f 6e 64 20 63 6f 6d    The second com
c550: 6d 61 6e 64 20 63 61 75 73 65 73 20 74 68 69 73  mand causes this
c560: 0a 2a 2a 20 73 75 62 72 6f 75 74 69 6e 65 20 74  .** subroutine t
c570: 6f 20 62 65 20 69 6e 76 6f 6b 65 64 2e 0a 2a 2f  o be invoked..*/
c580: 0a 73 74 61 74 69 63 20 69 6e 74 20 44 62 4f 62  .static int DbOb
c590: 6a 43 6d 64 28 76 6f 69 64 20 2a 63 64 2c 20 54  jCmd(void *cd, T
c5a0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
c5b0: 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 54 63 6c 5f  p, int objc,Tcl_
c5c0: 4f 62 6a 20 2a 63 6f 6e 73 74 2a 6f 62 6a 76 29  Obj *const*objv)
c5d0: 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44  {.  SqliteDb *pD
c5e0: 62 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 63  b = (SqliteDb*)c
c5f0: 64 3b 0a 20 20 69 6e 74 20 63 68 6f 69 63 65 3b  d;.  int choice;
c600: 0a 20 20 69 6e 74 20 72 63 20 3d 20 54 43 4c 5f  .  int rc = TCL_
c610: 4f 4b 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  OK;.  static con
c620: 73 74 20 63 68 61 72 20 2a 44 42 5f 73 74 72 73  st char *DB_strs
c630: 5b 5d 20 3d 20 7b 0a 20 20 20 20 22 61 75 74 68  [] = {.    "auth
c640: 6f 72 69 7a 65 72 22 2c 20 20 20 20 20 20 20 20  orizer",        
c650: 20 22 62 61 63 6b 75 70 22 2c 20 20 20 20 20 20   "backup",      
c660: 20 20 20 20 20 20 22 62 75 73 79 22 2c 0a 20 20        "busy",.  
c670: 20 20 22 63 61 63 68 65 22 2c 20 20 20 20 20 20    "cache",      
c680: 20 20 20 20 20 20 20 20 22 63 68 61 6e 67 65 73          "changes
c690: 22 2c 20 20 20 20 20 20 20 20 20 20 20 22 63 6c  ",           "cl
c6a0: 6f 73 65 22 2c 0a 20 20 20 20 22 63 6f 6c 6c 61  ose",.    "colla
c6b0: 74 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  te",            
c6c0: 22 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65  "collation_neede
c6d0: 64 22 2c 20 20 22 63 6f 6d 6d 69 74 5f 68 6f 6f  d",  "commit_hoo
c6e0: 6b 22 2c 0a 20 20 20 20 22 63 6f 6d 70 6c 65 74  k",.    "complet
c6f0: 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 22 63  e",           "c
c700: 6f 70 79 22 2c 20 20 20 20 20 20 20 20 20 20 20  opy",           
c710: 20 20 20 22 65 6e 61 62 6c 65 5f 6c 6f 61 64 5f     "enable_load_
c720: 65 78 74 65 6e 73 69 6f 6e 22 2c 0a 20 20 20 20  extension",.    
c730: 22 65 72 72 6f 72 63 6f 64 65 22 2c 20 20 20 20  "errorcode",    
c740: 20 20 20 20 20 20 22 65 76 61 6c 22 2c 20 20 20        "eval",   
c750: 20 20 20 20 20 20 20 20 20 20 20 22 65 78 69 73             "exis
c760: 74 73 22 2c 0a 20 20 20 20 22 66 75 6e 63 74 69  ts",.    "functi
c770: 6f 6e 22 2c 20 20 20 20 20 20 20 20 20 20 20 22  on",           "
c780: 69 6e 63 72 62 6c 6f 62 22 2c 20 20 20 20 20 20  incrblob",      
c790: 20 20 20 20 22 69 6e 74 65 72 72 75 70 74 22 2c      "interrupt",
c7a0: 0a 20 20 20 20 22 6c 61 73 74 5f 69 6e 73 65 72  .    "last_inser
c7b0: 74 5f 72 6f 77 69 64 22 2c 20 20 22 6e 75 6c 6c  t_rowid",  "null
c7c0: 76 61 6c 75 65 22 2c 20 20 20 20 20 20 20 20 20  value",         
c7d0: 22 6f 6e 65 63 6f 6c 75 6d 6e 22 2c 0a 20 20 20  "onecolumn",.   
c7e0: 20 22 70 72 6f 66 69 6c 65 22 2c 20 20 20 20 20   "profile",     
c7f0: 20 20 20 20 20 20 20 22 70 72 6f 67 72 65 73 73         "progress
c800: 22 2c 20 20 20 20 20 20 20 20 20 20 22 72 65 6b  ",          "rek
c810: 65 79 22 2c 0a 20 20 20 20 22 72 65 73 74 6f 72  ey",.    "restor
c820: 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 22  e",            "
c830: 72 6f 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 22 2c 20  rollback_hook", 
c840: 20 20 20 20 22 73 74 61 74 75 73 22 2c 0a 20 20      "status",.  
c850: 20 20 22 74 69 6d 65 6f 75 74 22 2c 20 20 20 20    "timeout",    
c860: 20 20 20 20 20 20 20 20 22 74 6f 74 61 6c 5f 63          "total_c
c870: 68 61 6e 67 65 73 22 2c 20 20 20 20 20 22 74 72  hanges",     "tr
c880: 61 63 65 22 2c 0a 20 20 20 20 22 74 72 61 6e 73  ace",.    "trans
c890: 61 63 74 69 6f 6e 22 2c 20 20 20 20 20 20 20 20  action",        
c8a0: 22 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79 22 2c  "unlock_notify",
c8b0: 20 20 20 20 20 22 75 70 64 61 74 65 5f 68 6f 6f       "update_hoo
c8c0: 6b 22 2c 0a 20 20 20 20 22 76 65 72 73 69 6f 6e  k",.    "version
c8d0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 22 77  ",            "w
c8e0: 61 6c 5f 68 6f 6f 6b 22 2c 20 20 20 20 20 20 20  al_hook",       
c8f0: 20 20 20 30 0a 20 20 7d 3b 0a 20 20 65 6e 75 6d     0.  };.  enum
c900: 20 44 42 5f 65 6e 75 6d 20 7b 0a 20 20 20 20 44   DB_enum {.    D
c910: 42 5f 41 55 54 48 4f 52 49 5a 45 52 2c 20 20 20  B_AUTHORIZER,   
c920: 20 20 20 20 20 44 42 5f 42 41 43 4b 55 50 2c 20       DB_BACKUP, 
c930: 20 20 20 20 20 20 20 20 20 20 44 42 5f 42 55 53            DB_BUS
c940: 59 2c 0a 20 20 20 20 44 42 5f 43 41 43 48 45 2c  Y,.    DB_CACHE,
c950: 20 20 20 20 20 20 20 20 20 20 20 20 20 44 42 5f               DB_
c960: 43 48 41 4e 47 45 53 2c 20 20 20 20 20 20 20 20  CHANGES,        
c970: 20 20 44 42 5f 43 4c 4f 53 45 2c 0a 20 20 20 20    DB_CLOSE,.    
c980: 44 42 5f 43 4f 4c 4c 41 54 45 2c 20 20 20 20 20  DB_COLLATE,     
c990: 20 20 20 20 20 20 44 42 5f 43 4f 4c 4c 41 54 49        DB_COLLATI
c9a0: 4f 4e 5f 4e 45 45 44 45 44 2c 20 44 42 5f 43 4f  ON_NEEDED, DB_CO
c9b0: 4d 4d 49 54 5f 48 4f 4f 4b 2c 0a 20 20 20 20 44  MMIT_HOOK,.    D
c9c0: 42 5f 43 4f 4d 50 4c 45 54 45 2c 20 20 20 20 20  B_COMPLETE,     
c9d0: 20 20 20 20 20 44 42 5f 43 4f 50 59 2c 20 20 20       DB_COPY,   
c9e0: 20 20 20 20 20 20 20 20 20 20 44 42 5f 45 4e 41            DB_ENA
c9f0: 42 4c 45 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49  BLE_LOAD_EXTENSI
ca00: 4f 4e 2c 0a 20 20 20 20 44 42 5f 45 52 52 4f 52  ON,.    DB_ERROR
ca10: 43 4f 44 45 2c 20 20 20 20 20 20 20 20 20 44 42  CODE,         DB
ca20: 5f 45 56 41 4c 2c 20 20 20 20 20 20 20 20 20 20  _EVAL,          
ca30: 20 20 20 44 42 5f 45 58 49 53 54 53 2c 0a 20 20     DB_EXISTS,.  
ca40: 20 20 44 42 5f 46 55 4e 43 54 49 4f 4e 2c 20 20    DB_FUNCTION,  
ca50: 20 20 20 20 20 20 20 20 44 42 5f 49 4e 43 52 42          DB_INCRB
ca60: 4c 4f 42 2c 20 20 20 20 20 20 20 20 20 44 42 5f  LOB,         DB_
ca70: 49 4e 54 45 52 52 55 50 54 2c 0a 20 20 20 20 44  INTERRUPT,.    D
ca80: 42 5f 4c 41 53 54 5f 49 4e 53 45 52 54 5f 52 4f  B_LAST_INSERT_RO
ca90: 57 49 44 2c 20 44 42 5f 4e 55 4c 4c 56 41 4c 55  WID, DB_NULLVALU
caa0: 45 2c 20 20 20 20 20 20 20 20 44 42 5f 4f 4e 45  E,        DB_ONE
cab0: 43 4f 4c 55 4d 4e 2c 0a 20 20 20 20 44 42 5f 50  COLUMN,.    DB_P
cac0: 52 4f 46 49 4c 45 2c 20 20 20 20 20 20 20 20 20  ROFILE,         
cad0: 20 20 44 42 5f 50 52 4f 47 52 45 53 53 2c 20 20    DB_PROGRESS,  
cae0: 20 20 20 20 20 20 20 44 42 5f 52 45 4b 45 59 2c         DB_REKEY,
caf0: 0a 20 20 20 20 44 42 5f 52 45 53 54 4f 52 45 2c  .    DB_RESTORE,
cb00: 20 20 20 20 20 20 20 20 20 20 20 44 42 5f 52 4f             DB_RO
cb10: 4c 4c 42 41 43 4b 5f 48 4f 4f 4b 2c 20 20 20 20  LLBACK_HOOK,    
cb20: 44 42 5f 53 54 41 54 55 53 2c 0a 20 20 20 20 44  DB_STATUS,.    D
cb30: 42 5f 54 49 4d 45 4f 55 54 2c 20 20 20 20 20 20  B_TIMEOUT,      
cb40: 20 20 20 20 20 44 42 5f 54 4f 54 41 4c 5f 43 48       DB_TOTAL_CH
cb50: 41 4e 47 45 53 2c 20 20 20 20 44 42 5f 54 52 41  ANGES,    DB_TRA
cb60: 43 45 2c 0a 20 20 20 20 44 42 5f 54 52 41 4e 53  CE,.    DB_TRANS
cb70: 41 43 54 49 4f 4e 2c 20 20 20 20 20 20 20 44 42  ACTION,       DB
cb80: 5f 55 4e 4c 4f 43 4b 5f 4e 4f 54 49 46 59 2c 20  _UNLOCK_NOTIFY, 
cb90: 20 20 20 44 42 5f 55 50 44 41 54 45 5f 48 4f 4f     DB_UPDATE_HOO
cba0: 4b 2c 0a 20 20 20 20 44 42 5f 56 45 52 53 49 4f  K,.    DB_VERSIO
cbb0: 4e 2c 20 20 20 20 20 20 20 20 20 20 20 44 42 5f  N,           DB_
cbc0: 57 41 4c 5f 48 4f 4f 4b 0a 20 20 7d 3b 0a 20 20  WAL_HOOK.  };.  
cbd0: 2f 2a 20 64 6f 6e 27 74 20 6c 65 61 76 65 20 74  /* don't leave t
cbe0: 72 61 69 6c 69 6e 67 20 63 6f 6d 6d 61 73 20 6f  railing commas o
cbf0: 6e 20 44 42 5f 65 6e 75 6d 2c 20 69 74 20 63 6f  n DB_enum, it co
cc00: 6e 66 75 73 65 73 20 74 68 65 20 41 49 58 20 78  nfuses the AIX x
cc10: 6c 63 20 63 6f 6d 70 69 6c 65 72 20 2a 2f 0a 0a  lc compiler */..
cc20: 20 20 69 66 28 20 6f 62 6a 63 3c 32 20 29 7b 0a    if( objc<2 ){.
cc30: 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
cc40: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
cc50: 6f 62 6a 76 2c 20 22 53 55 42 43 4f 4d 4d 41 4e  objv, "SUBCOMMAN
cc60: 44 20 2e 2e 2e 22 29 3b 0a 20 20 20 20 72 65 74  D ...");.    ret
cc70: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
cc80: 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74   }.  if( Tcl_Get
cc90: 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74  IndexFromObj(int
cca0: 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 44 42  erp, objv[1], DB
ccb0: 5f 73 74 72 73 2c 20 22 6f 70 74 69 6f 6e 22 2c  _strs, "option",
ccc0: 20 30 2c 20 26 63 68 6f 69 63 65 29 20 29 7b 0a   0, &choice) ){.
ccd0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
cce0: 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 73 77 69  RROR;.  }..  swi
ccf0: 74 63 68 28 20 28 65 6e 75 6d 20 44 42 5f 65 6e  tch( (enum DB_en
cd00: 75 6d 29 63 68 6f 69 63 65 20 29 7b 0a 0a 20 20  um)choice ){..  
cd10: 2f 2a 20 20 20 20 24 64 62 20 61 75 74 68 6f 72  /*    $db author
cd20: 69 7a 65 72 20 3f 43 41 4c 4c 42 41 43 4b 3f 0a  izer ?CALLBACK?.
cd30: 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 76 6f 6b 65    **.  ** Invoke
cd40: 20 74 68 65 20 67 69 76 65 6e 20 63 61 6c 6c 62   the given callb
cd50: 61 63 6b 20 74 6f 20 61 75 74 68 6f 72 69 7a 65  ack to authorize
cd60: 20 65 61 63 68 20 53 51 4c 20 6f 70 65 72 61 74   each SQL operat
cd70: 69 6f 6e 20 61 73 20 69 74 20 69 73 0a 20 20 2a  ion as it is.  *
cd80: 2a 20 63 6f 6d 70 69 6c 65 64 2e 20 20 35 20 61  * compiled.  5 a
cd90: 72 67 75 6d 65 6e 74 73 20 61 72 65 20 61 70 70  rguments are app
cda0: 65 6e 64 65 64 20 74 6f 20 74 68 65 20 63 61 6c  ended to the cal
cdb0: 6c 62 61 63 6b 20 62 65 66 6f 72 65 20 69 74 20  lback before it 
cdc0: 69 73 0a 20 20 2a 2a 20 69 6e 76 6f 6b 65 64 3a  is.  ** invoked:
cdd0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 28 31 29  .  **.  **   (1)
cde0: 20 54 68 65 20 61 75 74 68 6f 72 69 7a 61 74 69   The authorizati
cdf0: 6f 6e 20 74 79 70 65 20 28 65 78 3a 20 53 51 4c  on type (ex: SQL
ce00: 49 54 45 5f 43 52 45 41 54 45 5f 54 41 42 4c 45  ITE_CREATE_TABLE
ce10: 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c  , SQLITE_INSERT,
ce20: 20 2e 2e 2e 29 0a 20 20 2a 2a 20 20 20 28 32 29   ...).  **   (2)
ce30: 20 46 69 72 73 74 20 64 65 73 63 72 69 70 74 69   First descripti
ce40: 76 65 20 6e 61 6d 65 20 28 64 65 70 65 6e 64 73  ve name (depends
ce50: 20 6f 6e 20 61 75 74 68 6f 72 69 7a 61 74 69 6f   on authorizatio
ce60: 6e 20 74 79 70 65 29 0a 20 20 2a 2a 20 20 20 28  n type).  **   (
ce70: 33 29 20 53 65 63 6f 6e 64 20 64 65 73 63 72 69  3) Second descri
ce80: 70 74 69 76 65 20 6e 61 6d 65 0a 20 20 2a 2a 20  ptive name.  ** 
ce90: 20 20 28 34 29 20 4e 61 6d 65 20 6f 66 20 74 68    (4) Name of th
cea0: 65 20 64 61 74 61 62 61 73 65 20 28 65 78 3a 20  e database (ex: 
ceb0: 22 6d 61 69 6e 22 2c 20 22 74 65 6d 70 22 29 0a  "main", "temp").
cec0: 20 20 2a 2a 20 20 20 28 35 29 20 4e 61 6d 65 20    **   (5) Name 
ced0: 6f 66 20 74 72 69 67 67 65 72 20 74 68 61 74 20  of trigger that 
cee0: 69 73 20 64 6f 69 6e 67 20 74 68 65 20 61 63 63  is doing the acc
cef0: 65 73 73 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  ess.  **.  ** Th
cf00: 65 20 63 61 6c 6c 62 61 63 6b 20 73 68 6f 75 6c  e callback shoul
cf10: 64 20 72 65 74 75 72 6e 20 6f 6e 20 6f 66 20 74  d return on of t
cf20: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  he following str
cf30: 69 6e 67 73 3a 20 53 51 4c 49 54 45 5f 4f 4b 2c  ings: SQLITE_OK,
cf40: 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 49 47 4e  .  ** SQLITE_IGN
cf50: 4f 52 45 2c 20 6f 72 20 53 51 4c 49 54 45 5f 44  ORE, or SQLITE_D
cf60: 45 4e 59 2e 20 20 41 6e 79 20 6f 74 68 65 72 20  ENY.  Any other 
cf70: 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20  return value is 
cf80: 61 6e 20 65 72 72 6f 72 2e 0a 20 20 2a 2a 0a 20  an error..  **. 
cf90: 20 2a 2a 20 49 66 20 74 68 69 73 20 6d 65 74 68   ** If this meth
cfa0: 6f 64 20 69 73 20 69 6e 76 6f 6b 65 64 20 77 69  od is invoked wi
cfb0: 74 68 20 6e 6f 20 61 72 67 75 6d 65 6e 74 73 2c  th no arguments,
cfc0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 61 75 74   the current aut
cfd0: 68 6f 72 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a 20  horization.  ** 
cfe0: 63 61 6c 6c 62 61 63 6b 20 73 74 72 69 6e 67 20  callback string 
cff0: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 20 20 2a  is returned..  *
d000: 2f 0a 20 20 63 61 73 65 20 44 42 5f 41 55 54 48  /.  case DB_AUTH
d010: 4f 52 49 5a 45 52 3a 20 7b 0a 23 69 66 64 65 66  ORIZER: {.#ifdef
d020: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
d030: 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 20 20 54  HORIZATION.    T
d040: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
d050: 69 6e 74 65 72 70 2c 20 22 61 75 74 68 6f 72 69  interp, "authori
d060: 7a 61 74 69 6f 6e 20 6e 6f 74 20 61 76 61 69 6c  zation not avail
d070: 61 62 6c 65 20 69 6e 20 74 68 69 73 20 62 75 69  able in this bui
d080: 6c 64 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  ld", 0);.    ret
d090: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23  urn TCL_ERROR;.#
d0a0: 65 6c 73 65 0a 20 20 20 20 69 66 28 20 6f 62 6a  else.    if( obj
d0b0: 63 3e 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  c>3 ){.      Tcl
d0c0: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
d0d0: 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22  terp, 2, objv, "
d0e0: 3f 43 41 4c 4c 42 41 43 4b 3f 22 29 3b 0a 20 20  ?CALLBACK?");.  
d0f0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
d100: 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73 65 20  RROR;.    }else 
d110: 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20  if( objc==2 ){. 
d120: 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 41       if( pDb->zA
d130: 75 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20 54  uth ){.        T
d140: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
d150: 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a 41 75  interp, pDb->zAu
d160: 74 68 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  th, 0);.      }.
d170: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
d180: 20 63 68 61 72 20 2a 7a 41 75 74 68 3b 0a 20 20   char *zAuth;.  
d190: 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20      int len;.   
d1a0: 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 41 75 74     if( pDb->zAut
d1b0: 68 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c  h ){.        Tcl
d1c0: 5f 46 72 65 65 28 70 44 62 2d 3e 7a 41 75 74 68  _Free(pDb->zAuth
d1d0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
d1e0: 20 7a 41 75 74 68 20 3d 20 54 63 6c 5f 47 65 74   zAuth = Tcl_Get
d1f0: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
d200: 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20  jv[2], &len);.  
d210: 20 20 20 20 69 66 28 20 7a 41 75 74 68 20 26 26      if( zAuth &&
d220: 20 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20   len>0 ){.      
d230: 20 20 70 44 62 2d 3e 7a 41 75 74 68 20 3d 20 54    pDb->zAuth = T
d240: 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20  cl_Alloc( len + 
d250: 31 20 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  1 );.        mem
d260: 63 70 79 28 70 44 62 2d 3e 7a 41 75 74 68 2c 20  cpy(pDb->zAuth, 
d270: 7a 41 75 74 68 2c 20 6c 65 6e 2b 31 29 3b 0a 20  zAuth, len+1);. 
d280: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
d290: 20 20 20 20 70 44 62 2d 3e 7a 41 75 74 68 20 3d      pDb->zAuth =
d2a0: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
d2b0: 20 20 69 66 28 20 70 44 62 2d 3e 7a 41 75 74 68    if( pDb->zAuth
d2c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d   ){.        pDb-
d2d0: 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70  >interp = interp
d2e0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
d2f0: 33 5f 73 65 74 5f 61 75 74 68 6f 72 69 7a 65 72  3_set_authorizer
d300: 28 70 44 62 2d 3e 64 62 2c 20 61 75 74 68 5f 63  (pDb->db, auth_c
d310: 61 6c 6c 62 61 63 6b 2c 20 70 44 62 29 3b 0a 20  allback, pDb);. 
d320: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
d330: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 65 74 5f      sqlite3_set_
d340: 61 75 74 68 6f 72 69 7a 65 72 28 70 44 62 2d 3e  authorizer(pDb->
d350: 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  db, 0, 0);.     
d360: 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a   }.    }.#endif.
d370: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
d380: 20 20 2f 2a 20 20 20 20 24 64 62 20 62 61 63 6b    /*    $db back
d390: 75 70 20 3f 44 41 54 41 42 41 53 45 3f 20 46 49  up ?DATABASE? FI
d3a0: 4c 45 4e 41 4d 45 0a 20 20 2a 2a 0a 20 20 2a 2a  LENAME.  **.  **
d3b0: 20 4f 70 65 6e 20 6f 72 20 63 72 65 61 74 65 20   Open or create 
d3c0: 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  a database file 
d3d0: 6e 61 6d 65 64 20 46 49 4c 45 4e 41 4d 45 2e 20  named FILENAME. 
d3e0: 20 54 72 61 6e 73 66 65 72 20 74 68 65 0a 20 20   Transfer the.  
d3f0: 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20 6c 6f  ** content of lo
d400: 63 61 6c 20 64 61 74 61 62 61 73 65 20 44 41 54  cal database DAT
d410: 41 42 41 53 45 20 28 64 65 66 61 75 6c 74 3a 20  ABASE (default: 
d420: 22 6d 61 69 6e 22 29 20 69 6e 74 6f 20 74 68 65  "main") into the
d430: 0a 20 20 2a 2a 20 46 49 4c 45 4e 41 4d 45 20 64  .  ** FILENAME d
d440: 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20  atabase..  */.  
d450: 63 61 73 65 20 44 42 5f 42 41 43 4b 55 50 3a 20  case DB_BACKUP: 
d460: 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
d470: 20 2a 7a 44 65 73 74 46 69 6c 65 3b 0a 20 20 20   *zDestFile;.   
d480: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 72   const char *zSr
d490: 63 44 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  cDb;.    sqlite3
d4a0: 20 2a 70 44 65 73 74 3b 0a 20 20 20 20 73 71 6c   *pDest;.    sql
d4b0: 69 74 65 33 5f 62 61 63 6b 75 70 20 2a 70 42 61  ite3_backup *pBa
d4c0: 63 6b 75 70 3b 0a 0a 20 20 20 20 69 66 28 20 6f  ckup;..    if( o
d4d0: 62 6a 63 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20  bjc==3 ){.      
d4e0: 7a 53 72 63 44 62 20 3d 20 22 6d 61 69 6e 22 3b  zSrcDb = "main";
d4f0: 0a 20 20 20 20 20 20 7a 44 65 73 74 46 69 6c 65  .      zDestFile
d500: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
d510: 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 20 20 7d  (objv[2]);.    }
d520: 65 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d 34  else if( objc==4
d530: 20 29 7b 0a 20 20 20 20 20 20 7a 53 72 63 44 62   ){.      zSrcDb
d540: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
d550: 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 20 20 20  (objv[2]);.     
d560: 20 7a 44 65 73 74 46 69 6c 65 20 3d 20 54 63 6c   zDestFile = Tcl
d570: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
d580: 33 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  3]);.    }else{.
d590: 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
d5a0: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
d5b0: 2c 20 6f 62 6a 76 2c 20 22 3f 44 41 54 41 42 41  , objv, "?DATABA
d5c0: 53 45 3f 20 46 49 4c 45 4e 41 4d 45 22 29 3b 0a  SE? FILENAME");.
d5d0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
d5e0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
d5f0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 6f    rc = sqlite3_o
d600: 70 65 6e 28 7a 44 65 73 74 46 69 6c 65 2c 20 26  pen(zDestFile, &
d610: 70 44 65 73 74 29 3b 0a 20 20 20 20 69 66 28 20  pDest);.    if( 
d620: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
d630: 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  .      Tcl_Appen
d640: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
d650: 22 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 74 61 72  "cannot open tar
d660: 67 65 74 20 64 61 74 61 62 61 73 65 3a 20 22 2c  get database: ",
d670: 0a 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  .           sqli
d680: 74 65 33 5f 65 72 72 6d 73 67 28 70 44 65 73 74  te3_errmsg(pDest
d690: 29 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  ), (char*)0);.  
d6a0: 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73      sqlite3_clos
d6b0: 65 28 70 44 65 73 74 29 3b 0a 20 20 20 20 20 20  e(pDest);.      
d6c0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
d6d0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 61 63  ;.    }.    pBac
d6e0: 6b 75 70 20 3d 20 73 71 6c 69 74 65 33 5f 62 61  kup = sqlite3_ba
d6f0: 63 6b 75 70 5f 69 6e 69 74 28 70 44 65 73 74 2c  ckup_init(pDest,
d700: 20 22 6d 61 69 6e 22 2c 20 70 44 62 2d 3e 64 62   "main", pDb->db
d710: 2c 20 7a 53 72 63 44 62 29 3b 0a 20 20 20 20 69  , zSrcDb);.    i
d720: 66 28 20 70 42 61 63 6b 75 70 3d 3d 30 20 29 7b  f( pBackup==0 ){
d730: 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  .      Tcl_Appen
d740: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
d750: 22 62 61 63 6b 75 70 20 66 61 69 6c 65 64 3a 20  "backup failed: 
d760: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 73 71  ",.           sq
d770: 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44 65  lite3_errmsg(pDe
d780: 73 74 29 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  st), (char*)0);.
d790: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c        sqlite3_cl
d7a0: 6f 73 65 28 70 44 65 73 74 29 3b 0a 20 20 20 20  ose(pDest);.    
d7b0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
d7c0: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 68  OR;.    }.    wh
d7d0: 69 6c 65 28 20 20 28 72 63 20 3d 20 73 71 6c 69  ile(  (rc = sqli
d7e0: 74 65 33 5f 62 61 63 6b 75 70 5f 73 74 65 70 28  te3_backup_step(
d7f0: 70 42 61 63 6b 75 70 2c 31 30 30 29 29 3d 3d 53  pBackup,100))==S
d800: 51 4c 49 54 45 5f 4f 4b 20 29 7b 7d 0a 20 20 20  QLITE_OK ){}.   
d810: 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f   sqlite3_backup_
d820: 66 69 6e 69 73 68 28 70 42 61 63 6b 75 70 29 3b  finish(pBackup);
d830: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
d840: 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20  ITE_DONE ){.    
d850: 20 20 72 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20    rc = TCL_OK;. 
d860: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
d870: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
d880: 28 69 6e 74 65 72 70 2c 20 22 62 61 63 6b 75 70  (interp, "backup
d890: 20 66 61 69 6c 65 64 3a 20 22 2c 0a 20 20 20 20   failed: ",.    
d8a0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65         sqlite3_e
d8b0: 72 72 6d 73 67 28 70 44 65 73 74 29 2c 20 28 63  rrmsg(pDest), (c
d8c0: 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 72  har*)0);.      r
d8d0: 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  c = TCL_ERROR;. 
d8e0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
d8f0: 5f 63 6c 6f 73 65 28 70 44 65 73 74 29 3b 0a 20  _close(pDest);. 
d900: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
d910: 20 2f 2a 20 20 20 20 24 64 62 20 62 75 73 79 20   /*    $db busy 
d920: 3f 43 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a 0a  ?CALLBACK?.  **.
d930: 20 20 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20    ** Invoke the 
d940: 67 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b 20 69  given callback i
d950: 66 20 61 6e 20 53 51 4c 20 73 74 61 74 65 6d 65  f an SQL stateme
d960: 6e 74 20 61 74 74 65 6d 70 74 73 20 74 6f 20 6f  nt attempts to o
d970: 70 65 6e 0a 20 20 2a 2a 20 61 20 6c 6f 63 6b 65  pen.  ** a locke
d980: 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  d database file.
d990: 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f  .  */.  case DB_
d9a0: 42 55 53 59 3a 20 7b 0a 20 20 20 20 69 66 28 20  BUSY: {.    if( 
d9b0: 6f 62 6a 63 3e 33 20 29 7b 0a 20 20 20 20 20 20  objc>3 ){.      
d9c0: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
d9d0: 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76  (interp, 2, objv
d9e0: 2c 20 22 43 41 4c 4c 42 41 43 4b 22 29 3b 0a 20  , "CALLBACK");. 
d9f0: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
da00: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73 65  ERROR;.    }else
da10: 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a   if( objc==2 ){.
da20: 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a        if( pDb->z
da30: 42 75 73 79 20 29 7b 0a 20 20 20 20 20 20 20 20  Busy ){.        
da40: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
da50: 28 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a 42  (interp, pDb->zB
da60: 75 73 79 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  usy, 0);.      }
da70: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
da80: 20 20 63 68 61 72 20 2a 7a 42 75 73 79 3b 0a 20    char *zBusy;. 
da90: 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20       int len;.  
daa0: 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 42 75      if( pDb->zBu
dab0: 73 79 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63  sy ){.        Tc
dac0: 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 42 75 73  l_Free(pDb->zBus
dad0: 79 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  y);.      }.    
dae0: 20 20 7a 42 75 73 79 20 3d 20 54 63 6c 5f 47 65    zBusy = Tcl_Ge
daf0: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
db00: 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a 20  bjv[2], &len);. 
db10: 20 20 20 20 20 69 66 28 20 7a 42 75 73 79 20 26       if( zBusy &
db20: 26 20 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20  & len>0 ){.     
db30: 20 20 20 70 44 62 2d 3e 7a 42 75 73 79 20 3d 20     pDb->zBusy = 
db40: 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b  Tcl_Alloc( len +
db50: 20 31 20 29 3b 0a 20 20 20 20 20 20 20 20 6d 65   1 );.        me
db60: 6d 63 70 79 28 70 44 62 2d 3e 7a 42 75 73 79 2c  mcpy(pDb->zBusy,
db70: 20 7a 42 75 73 79 2c 20 6c 65 6e 2b 31 29 3b 0a   zBusy, len+1);.
db80: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
db90: 20 20 20 20 20 70 44 62 2d 3e 7a 42 75 73 79 20       pDb->zBusy 
dba0: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
dbb0: 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 42 75 73     if( pDb->zBus
dbc0: 79 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62  y ){.        pDb
dbd0: 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72  ->interp = inter
dbe0: 70 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  p;.        sqlit
dbf0: 65 33 5f 62 75 73 79 5f 68 61 6e 64 6c 65 72 28  e3_busy_handler(
dc00: 70 44 62 2d 3e 64 62 2c 20 44 62 42 75 73 79 48  pDb->db, DbBusyH
dc10: 61 6e 64 6c 65 72 2c 20 70 44 62 29 3b 0a 20 20  andler, pDb);.  
dc20: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
dc30: 20 20 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f     sqlite3_busy_
dc40: 68 61 6e 64 6c 65 72 28 70 44 62 2d 3e 64 62 2c  handler(pDb->db,
dc50: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a   0, 0);.      }.
dc60: 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b      }.    break;
dc70: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 20 24  .  }..  /*     $
dc80: 64 62 20 63 61 63 68 65 20 66 6c 75 73 68 0a 20  db cache flush. 
dc90: 20 2a 2a 20 20 20 20 20 24 64 62 20 63 61 63 68   **     $db cach
dca0: 65 20 73 69 7a 65 20 6e 0a 20 20 2a 2a 0a 20 20  e size n.  **.  
dcb0: 2a 2a 20 46 6c 75 73 68 20 74 68 65 20 70 72 65  ** Flush the pre
dcc0: 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20  pared statement 
dcd0: 63 61 63 68 65 2c 20 6f 72 20 73 65 74 20 74 68  cache, or set th
dce0: 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  e maximum number
dcf0: 20 6f 66 0a 20 20 2a 2a 20 63 61 63 68 65 64 20   of.  ** cached 
dd00: 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f  statements..  */
dd10: 0a 20 20 63 61 73 65 20 44 42 5f 43 41 43 48 45  .  case DB_CACHE
dd20: 3a 20 7b 0a 20 20 20 20 63 68 61 72 20 2a 73 75  : {.    char *su
dd30: 62 43 6d 64 3b 0a 20 20 20 20 69 6e 74 20 6e 3b  bCmd;.    int n;
dd40: 0a 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3c 3d  ..    if( objc<=
dd50: 32 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57  2 ){.      Tcl_W
dd60: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
dd70: 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 61  rp, 1, objv, "ca
dd80: 63 68 65 20 6f 70 74 69 6f 6e 20 3f 61 72 67 3f  che option ?arg?
dd90: 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
dda0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
ddb0: 7d 0a 20 20 20 20 73 75 62 43 6d 64 20 3d 20 54  }.    subCmd = T
ddc0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
ddd0: 4f 62 6a 28 20 6f 62 6a 76 5b 32 5d 2c 20 30 20  Obj( objv[2], 0 
dde0: 29 3b 0a 20 20 20 20 69 66 28 20 2a 73 75 62 43  );.    if( *subC
ddf0: 6d 64 3d 3d 27 66 27 20 26 26 20 73 74 72 63 6d  md=='f' && strcm
de00: 70 28 73 75 62 43 6d 64 2c 22 66 6c 75 73 68 22  p(subCmd,"flush"
de10: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  )==0 ){.      if
de20: 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20  ( objc!=3 ){.   
de30: 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
de40: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
de50: 20 6f 62 6a 76 2c 20 22 66 6c 75 73 68 22 29 3b   objv, "flush");
de60: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
de70: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  TCL_ERROR;.     
de80: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
de90: 66 6c 75 73 68 53 74 6d 74 43 61 63 68 65 28 20  flushStmtCache( 
dea0: 70 44 62 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20  pDb );.      }. 
deb0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 2a 73 75     }else if( *su
dec0: 62 43 6d 64 3d 3d 27 73 27 20 26 26 20 73 74 72  bCmd=='s' && str
ded0: 63 6d 70 28 73 75 62 43 6d 64 2c 22 73 69 7a 65  cmp(subCmd,"size
dee0: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ")==0 ){.      i
def0: 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20  f( objc!=4 ){.  
df00: 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
df10: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
df20: 2c 20 6f 62 6a 76 2c 20 22 73 69 7a 65 20 6e 22  , objv, "size n"
df30: 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
df40: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
df50: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
df60: 20 20 69 66 28 20 54 43 4c 5f 45 52 52 4f 52 3d    if( TCL_ERROR=
df70: 3d 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f  =Tcl_GetIntFromO
df80: 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
df90: 33 5d 2c 20 26 6e 29 20 29 7b 0a 20 20 20 20 20  3], &n) ){.     
dfa0: 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
dfb0: 65 73 75 6c 74 28 20 69 6e 74 65 72 70 2c 20 22  esult( interp, "
dfc0: 63 61 6e 6e 6f 74 20 63 6f 6e 76 65 72 74 20 5c  cannot convert \
dfd0: 22 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  "", .           
dfe0: 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
dff0: 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d  gFromObj(objv[3]
e000: 2c 30 29 2c 20 22 5c 22 20 74 6f 20 69 6e 74 65  ,0), "\" to inte
e010: 67 65 72 22 2c 20 30 29 3b 0a 20 20 20 20 20 20  ger", 0);.      
e020: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
e030: 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d 65  RROR;.        }e
e040: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69  lse{.          i
e050: 66 28 20 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20  f( n<0 ){.      
e060: 20 20 20 20 20 20 66 6c 75 73 68 53 74 6d 74 43        flushStmtC
e070: 61 63 68 65 28 20 70 44 62 20 29 3b 0a 20 20 20  ache( pDb );.   
e080: 20 20 20 20 20 20 20 20 20 6e 20 3d 20 30 3b 0a           n = 0;.
e090: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20            }else 
e0a0: 69 66 28 20 6e 3e 4d 41 58 5f 50 52 45 50 41 52  if( n>MAX_PREPAR
e0b0: 45 44 5f 53 54 4d 54 53 20 29 7b 0a 20 20 20 20  ED_STMTS ){.    
e0c0: 20 20 20 20 20 20 20 20 6e 20 3d 20 4d 41 58 5f          n = MAX_
e0d0: 50 52 45 50 41 52 45 44 5f 53 54 4d 54 53 3b 0a  PREPARED_STMTS;.
e0e0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
e0f0: 20 20 20 20 20 20 70 44 62 2d 3e 6d 61 78 53 74        pDb->maxSt
e100: 6d 74 20 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20  mt = n;.        
e110: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  }.      }.    }e
e120: 6c 73 65 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41  lse{.      Tcl_A
e130: 70 70 65 6e 64 52 65 73 75 6c 74 28 20 69 6e 74  ppendResult( int
e140: 65 72 70 2c 20 22 62 61 64 20 6f 70 74 69 6f 6e  erp, "bad option
e150: 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 20 20   \"", .         
e160: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
e170: 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 30 29  omObj(objv[2],0)
e180: 2c 20 22 5c 22 3a 20 6d 75 73 74 20 62 65 20 66  , "\": must be f
e190: 6c 75 73 68 20 6f 72 20 73 69 7a 65 22 2c 20 30  lush or size", 0
e1a0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
e1b0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
e1c0: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
e1d0: 0a 20 20 2f 2a 20 20 20 20 20 24 64 62 20 63 68  .  /*     $db ch
e1e0: 61 6e 67 65 73 0a 20 20 2a 2a 0a 20 20 2a 2a 20  anges.  **.  ** 
e1f0: 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
e200: 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77  r of rows that w
e210: 65 72 65 20 6d 6f 64 69 66 69 65 64 2c 20 69 6e  ere modified, in
e220: 73 65 72 74 65 64 2c 20 6f 72 20 64 65 6c 65 74  serted, or delet
e230: 65 64 20 62 79 0a 20 20 2a 2a 20 74 68 65 20 6d  ed by.  ** the m
e240: 6f 73 74 20 72 65 63 65 6e 74 20 49 4e 53 45 52  ost recent INSER
e250: 54 2c 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c  T, UPDATE or DEL
e260: 45 54 45 20 73 74 61 74 65 6d 65 6e 74 2c 20 6e  ETE statement, n
e270: 6f 74 20 69 6e 63 6c 75 64 69 6e 67 20 0a 20 20  ot including .  
e280: 2a 2a 20 61 6e 79 20 63 68 61 6e 67 65 73 20 6d  ** any changes m
e290: 61 64 65 20 62 79 20 74 72 69 67 67 65 72 20 70  ade by trigger p
e2a0: 72 6f 67 72 61 6d 73 2e 0a 20 20 2a 2f 0a 20 20  rograms..  */.  
e2b0: 63 61 73 65 20 44 42 5f 43 48 41 4e 47 45 53 3a  case DB_CHANGES:
e2c0: 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a   {.    Tcl_Obj *
e2d0: 70 52 65 73 75 6c 74 3b 0a 20 20 20 20 69 66 28  pResult;.    if(
e2e0: 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20   objc!=2 ){.    
e2f0: 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
e300: 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62  gs(interp, 2, ob
e310: 6a 76 2c 20 22 22 29 3b 0a 20 20 20 20 20 20 72  jv, "");.      r
e320: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
e330: 0a 20 20 20 20 7d 0a 20 20 20 20 70 52 65 73 75  .    }.    pResu
e340: 6c 74 20 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52  lt = Tcl_GetObjR
e350: 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20  esult(interp);. 
e360: 20 20 20 54 63 6c 5f 53 65 74 49 6e 74 4f 62 6a     Tcl_SetIntObj
e370: 28 70 52 65 73 75 6c 74 2c 20 73 71 6c 69 74 65  (pResult, sqlite
e380: 33 5f 63 68 61 6e 67 65 73 28 70 44 62 2d 3e 64  3_changes(pDb->d
e390: 62 29 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a  b));.    break;.
e3a0: 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62    }..  /*    $db
e3b0: 20 63 6c 6f 73 65 0a 20 20 2a 2a 0a 20 20 2a 2a   close.  **.  **
e3c0: 20 53 68 75 74 64 6f 77 6e 20 74 68 65 20 64 61   Shutdown the da
e3d0: 74 61 62 61 73 65 0a 20 20 2a 2f 0a 20 20 63 61  tabase.  */.  ca
e3e0: 73 65 20 44 42 5f 43 4c 4f 53 45 3a 20 7b 0a 20  se DB_CLOSE: {. 
e3f0: 20 20 20 54 63 6c 5f 44 65 6c 65 74 65 43 6f 6d     Tcl_DeleteCom
e400: 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 54 63 6c  mand(interp, Tcl
e410: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
e420: 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 29 3b 0a  j(objv[0], 0));.
e430: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
e440: 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64    /*.  **     $d
e450: 62 20 63 6f 6c 6c 61 74 65 20 4e 41 4d 45 20 53  b collate NAME S
e460: 43 52 49 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20  CRIPT.  **.  ** 
e470: 43 72 65 61 74 65 20 61 20 6e 65 77 20 53 51 4c  Create a new SQL
e480: 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e 63 74   collation funct
e490: 69 6f 6e 20 63 61 6c 6c 65 64 20 4e 41 4d 45 2e  ion called NAME.
e4a0: 20 20 57 68 65 6e 65 76 65 72 0a 20 20 2a 2a 20    Whenever.  ** 
e4b0: 74 68 61 74 20 66 75 6e 63 74 69 6f 6e 20 69 73  that function is
e4c0: 20 63 61 6c 6c 65 64 2c 20 69 6e 76 6f 6b 65 20   called, invoke 
e4d0: 53 43 52 49 50 54 20 74 6f 20 65 76 61 6c 75 61  SCRIPT to evalua
e4e0: 74 65 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 2e  te the function.
e4f0: 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f  .  */.  case DB_
e500: 43 4f 4c 4c 41 54 45 3a 20 7b 0a 20 20 20 20 53  COLLATE: {.    S
e510: 71 6c 43 6f 6c 6c 61 74 65 20 2a 70 43 6f 6c 6c  qlCollate *pColl
e520: 61 74 65 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  ate;.    char *z
e530: 4e 61 6d 65 3b 0a 20 20 20 20 63 68 61 72 20 2a  Name;.    char *
e540: 7a 53 63 72 69 70 74 3b 0a 20 20 20 20 69 6e 74  zScript;.    int
e550: 20 6e 53 63 72 69 70 74 3b 0a 20 20 20 20 69 66   nScript;.    if
e560: 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20  ( objc!=4 ){.   
e570: 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
e580: 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
e590: 62 6a 76 2c 20 22 4e 41 4d 45 20 53 43 52 49 50  bjv, "NAME SCRIP
e5a0: 54 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  T");.      retur
e5b0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
e5c0: 20 7d 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 54   }.    zName = T
e5d0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
e5e0: 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30 29 3b  Obj(objv[2], 0);
e5f0: 0a 20 20 20 20 7a 53 63 72 69 70 74 20 3d 20 54  .    zScript = T
e600: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
e610: 4f 62 6a 28 6f 62 6a 76 5b 33 5d 2c 20 26 6e 53  Obj(objv[3], &nS
e620: 63 72 69 70 74 29 3b 0a 20 20 20 20 70 43 6f 6c  cript);.    pCol
e630: 6c 61 74 65 20 3d 20 28 53 71 6c 43 6f 6c 6c 61  late = (SqlColla
e640: 74 65 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28 20 73  te*)Tcl_Alloc( s
e650: 69 7a 65 6f 66 28 2a 70 43 6f 6c 6c 61 74 65 29  izeof(*pCollate)
e660: 20 2b 20 6e 53 63 72 69 70 74 20 2b 20 31 20 29   + nScript + 1 )
e670: 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 61  ;.    if( pColla
e680: 74 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 54  te==0 ) return T
e690: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 70 43  CL_ERROR;.    pC
e6a0: 6f 6c 6c 61 74 65 2d 3e 69 6e 74 65 72 70 20 3d  ollate->interp =
e6b0: 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 70 43 6f   interp;.    pCo
e6c0: 6c 6c 61 74 65 2d 3e 70 4e 65 78 74 20 3d 20 70  llate->pNext = p
e6d0: 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 3b 0a 20 20  Db->pCollate;.  
e6e0: 20 20 70 43 6f 6c 6c 61 74 65 2d 3e 7a 53 63 72    pCollate->zScr
e6f0: 69 70 74 20 3d 20 28 63 68 61 72 2a 29 26 70 43  ipt = (char*)&pC
e700: 6f 6c 6c 61 74 65 5b 31 5d 3b 0a 20 20 20 20 70  ollate[1];.    p
e710: 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 20 3d 20 70  Db->pCollate = p
e720: 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 6d 65 6d  Collate;.    mem
e730: 63 70 79 28 70 43 6f 6c 6c 61 74 65 2d 3e 7a 53  cpy(pCollate->zS
e740: 63 72 69 70 74 2c 20 7a 53 63 72 69 70 74 2c 20  cript, zScript, 
e750: 6e 53 63 72 69 70 74 2b 31 29 3b 0a 20 20 20 20  nScript+1);.    
e760: 69 66 28 20 73 71 6c 69 74 65 33 5f 63 72 65 61  if( sqlite3_crea
e770: 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 70 44 62  te_collation(pDb
e780: 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20 53 51 4c  ->db, zName, SQL
e790: 49 54 45 5f 55 54 46 38 2c 20 0a 20 20 20 20 20  ITE_UTF8, .     
e7a0: 20 20 20 70 43 6f 6c 6c 61 74 65 2c 20 74 63 6c     pCollate, tcl
e7b0: 53 71 6c 43 6f 6c 6c 61 74 65 29 20 29 7b 0a 20  SqlCollate) ){. 
e7c0: 20 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75       Tcl_SetResu
e7d0: 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72  lt(interp, (char
e7e0: 20 2a 29 73 71 6c 69 74 65 33 5f 65 72 72 6d 73   *)sqlite3_errms
e7f0: 67 28 70 44 62 2d 3e 64 62 29 2c 20 54 43 4c 5f  g(pDb->db), TCL_
e800: 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 20 20 20  VOLATILE);.     
e810: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
e820: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65  R;.    }.    bre
e830: 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  ak;.  }..  /*.  
e840: 2a 2a 20 20 20 20 20 24 64 62 20 63 6f 6c 6c 61  **     $db colla
e850: 74 69 6f 6e 5f 6e 65 65 64 65 64 20 53 43 52 49  tion_needed SCRI
e860: 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 72 65  PT.  **.  ** Cre
e870: 61 74 65 20 61 20 6e 65 77 20 53 51 4c 20 63 6f  ate a new SQL co
e880: 6c 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e  llation function
e890: 20 63 61 6c 6c 65 64 20 4e 41 4d 45 2e 20 20 57   called NAME.  W
e8a0: 68 65 6e 65 76 65 72 0a 20 20 2a 2a 20 74 68 61  henever.  ** tha
e8b0: 74 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  t function is ca
e8c0: 6c 6c 65 64 2c 20 69 6e 76 6f 6b 65 20 53 43 52  lled, invoke SCR
e8d0: 49 50 54 20 74 6f 20 65 76 61 6c 75 61 74 65 20  IPT to evaluate 
e8e0: 74 68 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20  the function..  
e8f0: 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 43 4f 4c  */.  case DB_COL
e900: 4c 41 54 49 4f 4e 5f 4e 45 45 44 45 44 3a 20 7b  LATION_NEEDED: {
e910: 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 33  .    if( objc!=3
e920: 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72   ){.      Tcl_Wr
e930: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
e940: 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 53 43 52  p, 2, objv, "SCR
e950: 49 50 54 22 29 3b 0a 20 20 20 20 20 20 72 65 74  IPT");.      ret
e960: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
e970: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 44 62     }.    if( pDb
e980: 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64  ->pCollateNeeded
e990: 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 44 65   ){.      Tcl_De
e9a0: 63 72 52 65 66 43 6f 75 6e 74 28 70 44 62 2d 3e  crRefCount(pDb->
e9b0: 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64 29 3b  pCollateNeeded);
e9c0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 44 62 2d 3e  .    }.    pDb->
e9d0: 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64 20 3d  pCollateNeeded =
e9e0: 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62   Tcl_DuplicateOb
e9f0: 6a 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 20 20  j(objv[2]);.    
ea00: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
ea10: 28 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65  (pDb->pCollateNe
ea20: 65 64 65 64 29 3b 0a 20 20 20 20 73 71 6c 69 74  eded);.    sqlit
ea30: 65 33 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65  e3_collation_nee
ea40: 64 65 64 28 70 44 62 2d 3e 64 62 2c 20 70 44 62  ded(pDb->db, pDb
ea50: 2c 20 74 63 6c 43 6f 6c 6c 61 74 65 4e 65 65 64  , tclCollateNeed
ea60: 65 64 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a  ed);.    break;.
ea70: 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62    }..  /*    $db
ea80: 20 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 20 3f 43 41   commit_hook ?CA
ea90: 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a 0a 20 20 2a  LLBACK?.  **.  *
eaa0: 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 67 69 76  * Invoke the giv
eab0: 65 6e 20 63 61 6c 6c 62 61 63 6b 20 6a 75 73 74  en callback just
eac0: 20 62 65 66 6f 72 65 20 63 6f 6d 6d 69 74 74 69   before committi
ead0: 6e 67 20 65 76 65 72 79 20 53 51 4c 20 74 72 61  ng every SQL tra
eae0: 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 49  nsaction..  ** I
eaf0: 66 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 74  f the callback t
eb00: 68 72 6f 77 73 20 61 6e 20 65 78 63 65 70 74 69  hrows an excepti
eb10: 6f 6e 20 6f 72 20 72 65 74 75 72 6e 73 20 6e 6f  on or returns no
eb20: 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  n-zero, then the
eb30: 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  .  ** transactio
eb40: 6e 20 69 73 20 61 62 6f 72 74 65 64 2e 20 20 49  n is aborted.  I
eb50: 66 20 43 41 4c 4c 42 41 43 4b 20 69 73 20 61 6e  f CALLBACK is an
eb60: 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2c 20 74   empty string, t
eb70: 68 65 20 63 61 6c 6c 62 61 63 6b 0a 20 20 2a 2a  he callback.  **
eb80: 20 69 73 20 64 69 73 61 62 6c 65 64 2e 0a 20 20   is disabled..  
eb90: 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 43 4f 4d  */.  case DB_COM
eba0: 4d 49 54 5f 48 4f 4f 4b 3a 20 7b 0a 20 20 20 20  MIT_HOOK: {.    
ebb0: 69 66 28 20 6f 62 6a 63 3e 33 20 29 7b 0a 20 20  if( objc>3 ){.  
ebc0: 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
ebd0: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20  Args(interp, 2, 
ebe0: 6f 62 6a 76 2c 20 22 3f 43 41 4c 4c 42 41 43 4b  objv, "?CALLBACK
ebf0: 3f 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ?");.      retur
ec00: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
ec10: 20 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d   }else if( objc=
ec20: 3d 32 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =2 ){.      if( 
ec30: 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 20 29 7b 0a  pDb->zCommit ){.
ec40: 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65          Tcl_Appe
ec50: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
ec60: 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 2c 20 30   pDb->zCommit, 0
ec70: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
ec80: 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72  else{.      char
ec90: 20 2a 7a 43 6f 6d 6d 69 74 3b 0a 20 20 20 20 20   *zCommit;.     
eca0: 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20   int len;.      
ecb0: 69 66 28 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74  if( pDb->zCommit
ecc0: 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f   ){.        Tcl_
ecd0: 46 72 65 65 28 70 44 62 2d 3e 7a 43 6f 6d 6d 69  Free(pDb->zCommi
ece0: 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
ecf0: 20 20 7a 43 6f 6d 6d 69 74 20 3d 20 54 63 6c 5f    zCommit = Tcl_
ed00: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
ed10: 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b  (objv[2], &len);
ed20: 0a 20 20 20 20 20 20 69 66 28 20 7a 43 6f 6d 6d  .      if( zComm
ed30: 69 74 20 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20  it && len>0 ){. 
ed40: 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 43 6f 6d         pDb->zCom
ed50: 6d 69 74 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28  mit = Tcl_Alloc(
ed60: 20 6c 65 6e 20 2b 20 31 20 29 3b 0a 20 20 20 20   len + 1 );.    
ed70: 20 20 20 20 6d 65 6d 63 70 79 28 70 44 62 2d 3e      memcpy(pDb->
ed80: 7a 43 6f 6d 6d 69 74 2c 20 7a 43 6f 6d 6d 69 74  zCommit, zCommit
ed90: 2c 20 6c 65 6e 2b 31 29 3b 0a 20 20 20 20 20 20  , len+1);.      
eda0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
edb0: 44 62 2d 3e 7a 43 6f 6d 6d 69 74 20 3d 20 30 3b  Db->zCommit = 0;
edc0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
edd0: 66 28 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 20  f( pDb->zCommit 
ede0: 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e  ){.        pDb->
edf0: 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b  interp = interp;
ee00: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
ee10: 5f 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 28 70 44 62  _commit_hook(pDb
ee20: 2d 3e 64 62 2c 20 44 62 43 6f 6d 6d 69 74 48 61  ->db, DbCommitHa
ee30: 6e 64 6c 65 72 2c 20 70 44 62 29 3b 0a 20 20 20  ndler, pDb);.   
ee40: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
ee50: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6d 6d 69 74    sqlite3_commit
ee60: 5f 68 6f 6f 6b 28 70 44 62 2d 3e 64 62 2c 20 30  _hook(pDb->db, 0
ee70: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
ee80: 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20    }.    break;. 
ee90: 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20   }..  /*    $db 
eea0: 63 6f 6d 70 6c 65 74 65 20 53 51 4c 0a 20 20 2a  complete SQL.  *
eeb0: 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 54 52  *.  ** Return TR
eec0: 55 45 20 69 66 20 53 51 4c 20 69 73 20 61 20 63  UE if SQL is a c
eed0: 6f 6d 70 6c 65 74 65 20 53 51 4c 20 73 74 61 74  omplete SQL stat
eee0: 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 20 46  ement.  Return F
eef0: 41 4c 53 45 20 69 66 0a 20 20 2a 2a 20 61 64 64  ALSE if.  ** add
ef00: 69 74 69 6f 6e 61 6c 20 6c 69 6e 65 73 20 6f 66  itional lines of
ef10: 20 69 6e 70 75 74 20 61 72 65 20 6e 65 65 64 65   input are neede
ef20: 64 2e 20 20 54 68 69 73 20 69 73 20 73 69 6d 69  d.  This is simi
ef30: 6c 61 72 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20  lar to the.  ** 
ef40: 62 75 69 6c 74 2d 69 6e 20 22 69 6e 66 6f 20 63  built-in "info c
ef50: 6f 6d 70 6c 65 74 65 22 20 63 6f 6d 6d 61 6e 64  omplete" command
ef60: 20 6f 66 20 54 63 6c 2e 0a 20 20 2a 2f 0a 20 20   of Tcl..  */.  
ef70: 63 61 73 65 20 44 42 5f 43 4f 4d 50 4c 45 54 45  case DB_COMPLETE
ef80: 3a 20 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  : {.#ifndef SQLI
ef90: 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4c 45 54 45  TE_OMIT_COMPLETE
efa0: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52  .    Tcl_Obj *pR
efb0: 65 73 75 6c 74 3b 0a 20 20 20 20 69 6e 74 20 69  esult;.    int i
efc0: 73 43 6f 6d 70 6c 65 74 65 3b 0a 20 20 20 20 69  sComplete;.    i
efd0: 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20  f( objc!=3 ){.  
efe0: 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
eff0: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20  Args(interp, 2, 
f000: 6f 62 6a 76 2c 20 22 53 51 4c 22 29 3b 0a 20 20  objv, "SQL");.  
f010: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
f020: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
f030: 69 73 43 6f 6d 70 6c 65 74 65 20 3d 20 73 71 6c  isComplete = sql
f040: 69 74 65 33 5f 63 6f 6d 70 6c 65 74 65 28 20 54  ite3_complete( T
f050: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
f060: 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30 29 20  Obj(objv[2], 0) 
f070: 29 3b 0a 20 20 20 20 70 52 65 73 75 6c 74 20 3d  );.    pResult =
f080: 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c   Tcl_GetObjResul
f090: 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54  t(interp);.    T
f0a0: 63 6c 5f 53 65 74 42 6f 6f 6c 65 61 6e 4f 62 6a  cl_SetBooleanObj
f0b0: 28 70 52 65 73 75 6c 74 2c 20 69 73 43 6f 6d 70  (pResult, isComp
f0c0: 6c 65 74 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20  lete);.#endif.  
f0d0: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
f0e0: 2f 2a 20 20 20 20 24 64 62 20 63 6f 70 79 20 63  /*    $db copy c
f0f0: 6f 6e 66 6c 69 63 74 2d 61 6c 67 6f 72 69 74 68  onflict-algorith
f100: 6d 20 74 61 62 6c 65 20 66 69 6c 65 6e 61 6d 65  m table filename
f110: 20 3f 53 45 50 41 52 41 54 4f 52 3f 20 3f 4e 55   ?SEPARATOR? ?NU
f120: 4c 4c 49 4e 44 49 43 41 54 4f 52 3f 0a 20 20 2a  LLINDICATOR?.  *
f130: 2a 0a 20 20 2a 2a 20 43 6f 70 79 20 64 61 74 61  *.  ** Copy data
f140: 20 69 6e 74 6f 20 74 61 62 6c 65 20 66 72 6f 6d   into table from
f150: 20 66 69 6c 65 6e 61 6d 65 2c 20 6f 70 74 69 6f   filename, optio
f160: 6e 61 6c 6c 79 20 75 73 69 6e 67 20 53 45 50 41  nally using SEPA
f170: 52 41 54 4f 52 0a 20 20 2a 2a 20 61 73 20 63 6f  RATOR.  ** as co
f180: 6c 75 6d 6e 20 73 65 70 61 72 61 74 6f 72 73 2e  lumn separators.
f190: 20 20 49 66 20 61 20 63 6f 6c 75 6d 6e 20 63 6f    If a column co
f1a0: 6e 74 61 69 6e 73 20 61 20 6e 75 6c 6c 20 73 74  ntains a null st
f1b0: 72 69 6e 67 2c 20 6f 72 20 74 68 65 0a 20 20 2a  ring, or the.  *
f1c0: 2a 20 76 61 6c 75 65 20 6f 66 20 4e 55 4c 4c 49  * value of NULLI
f1d0: 4e 44 49 43 41 54 4f 52 2c 20 61 20 4e 55 4c 4c  NDICATOR, a NULL
f1e0: 20 69 73 20 69 6e 73 65 72 74 65 64 20 66 6f 72   is inserted for
f1f0: 20 74 68 65 20 63 6f 6c 75 6d 6e 2e 0a 20 20 2a   the column..  *
f200: 2a 20 63 6f 6e 66 6c 69 63 74 2d 61 6c 67 6f 72  * conflict-algor
f210: 69 74 68 6d 20 69 73 20 6f 6e 65 20 6f 66 20 74  ithm is one of t
f220: 68 65 20 73 71 6c 69 74 65 20 63 6f 6e 66 6c 69  he sqlite confli
f230: 63 74 20 61 6c 67 6f 72 69 74 68 6d 73 3a 0a 20  ct algorithms:. 
f240: 20 2a 2a 20 20 20 20 72 6f 6c 6c 62 61 63 6b 2c   **    rollback,
f250: 20 61 62 6f 72 74 2c 20 66 61 69 6c 2c 20 69 67   abort, fail, ig
f260: 6e 6f 72 65 2c 20 72 65 70 6c 61 63 65 0a 20 20  nore, replace.  
f270: 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c 20 72  ** On success, r
f280: 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
f290: 20 6f 66 20 6c 69 6e 65 73 20 70 72 6f 63 65 73   of lines proces
f2a0: 73 65 64 2c 20 6e 6f 74 20 6e 65 63 65 73 73 61  sed, not necessa
f2b0: 72 69 6c 79 20 73 61 6d 65 0a 20 20 2a 2a 20 61  rily same.  ** a
f2c0: 73 20 27 64 62 20 63 68 61 6e 67 65 73 27 20 64  s 'db changes' d
f2d0: 75 65 20 74 6f 20 63 6f 6e 66 6c 69 63 74 2d 61  ue to conflict-a
f2e0: 6c 67 6f 72 69 74 68 6d 20 73 65 6c 65 63 74 65  lgorithm selecte
f2f0: 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69  d..  **.  ** Thi
f300: 73 20 63 6f 64 65 20 69 73 20 62 61 73 69 63 61  s code is basica
f310: 6c 6c 79 20 61 6e 20 69 6d 70 6c 65 6d 65 6e 74  lly an implement
f320: 61 74 69 6f 6e 2f 65 6e 68 61 6e 63 65 6d 65 6e  ation/enhancemen
f330: 74 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 73 71  t of.  ** the sq
f340: 6c 69 74 65 33 20 73 68 65 6c 6c 2e 63 20 22 2e  lite3 shell.c ".
f350: 69 6d 70 6f 72 74 22 20 63 6f 6d 6d 61 6e 64 2e  import" command.
f360: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20  .  **.  ** This 
f370: 63 6f 6d 6d 61 6e 64 20 75 73 61 67 65 20 69 73  command usage is
f380: 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 74   equivalent to t
f390: 68 65 20 73 71 6c 69 74 65 32 2e 78 20 43 4f 50  he sqlite2.x COP
f3a0: 59 20 73 74 61 74 65 6d 65 6e 74 2c 0a 20 20 2a  Y statement,.  *
f3b0: 2a 20 77 68 69 63 68 20 69 6d 70 6f 72 74 73 20  * which imports 
f3c0: 66 69 6c 65 20 64 61 74 61 20 69 6e 74 6f 20 61  file data into a
f3d0: 20 74 61 62 6c 65 20 75 73 69 6e 67 20 74 68 65   table using the
f3e0: 20 50 6f 73 74 67 72 65 53 51 4c 20 43 4f 50 59   PostgreSQL COPY
f3f0: 20 66 69 6c 65 20 66 6f 72 6d 61 74 3a 0a 20 20   file format:.  
f400: 2a 2a 20 20 20 24 64 62 20 63 6f 70 79 20 24 63  **   $db copy $c
f410: 6f 6e 66 6c 69 74 5f 61 6c 67 6f 20 24 74 61 62  onflit_algo $tab
f420: 6c 65 5f 6e 61 6d 65 20 24 66 69 6c 65 6e 61 6d  le_name $filenam
f430: 65 20 5c 74 20 5c 5c 4e 0a 20 20 2a 2f 0a 20 20  e \t \\N.  */.  
f440: 63 61 73 65 20 44 42 5f 43 4f 50 59 3a 20 7b 0a  case DB_COPY: {.
f450: 20 20 20 20 63 68 61 72 20 2a 7a 54 61 62 6c 65      char *zTable
f460: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
f470: 2f 2a 20 49 6e 73 65 72 74 20 64 61 74 61 20 69  /* Insert data i
f480: 6e 74 6f 20 74 68 69 73 20 74 61 62 6c 65 20 2a  nto this table *
f490: 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 46 69 6c  /.    char *zFil
f4a0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
f4b0: 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 66 72    /* The file fr
f4c0: 6f 6d 20 77 68 69 63 68 20 74 6f 20 65 78 74 72  om which to extr
f4d0: 61 63 74 20 64 61 74 61 20 2a 2f 0a 20 20 20 20  act data */.    
f4e0: 63 68 61 72 20 2a 7a 43 6f 6e 66 6c 69 63 74 3b  char *zConflict;
f4f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
f500: 68 65 20 63 6f 6e 66 6c 69 63 74 20 61 6c 67 6f  he conflict algo
f510: 72 69 74 68 6d 20 74 6f 20 75 73 65 20 2a 2f 0a  rithm to use */.
f520: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74      sqlite3_stmt
f530: 20 2a 70 53 74 6d 74 3b 20 20 20 20 20 20 20 20   *pStmt;        
f540: 2f 2a 20 41 20 73 74 61 74 65 6d 65 6e 74 20 2a  /* A statement *
f550: 2f 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 20  /.    int nCol; 
f560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f570: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
f580: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 74 61  olumns in the ta
f590: 62 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  ble */.    int n
f5a0: 42 79 74 65 3b 20 20 20 20 20 20 20 20 20 20 20  Byte;           
f5b0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
f5c0: 20 6f 66 20 62 79 74 65 73 20 69 6e 20 61 6e 20   of bytes in an 
f5d0: 53 51 4c 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20  SQL string */.  
f5e0: 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20    int i, j;     
f5f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f600: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a   Loop counters *
f610: 2f 0a 20 20 20 20 69 6e 74 20 6e 53 65 70 3b 20  /.    int nSep; 
f620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f630: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
f640: 79 74 65 73 20 69 6e 20 7a 53 65 70 5b 5d 20 2a  ytes in zSep[] *
f650: 2f 0a 20 20 20 20 69 6e 74 20 6e 4e 75 6c 6c 3b  /.    int nNull;
f660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f670: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
f680: 79 74 65 73 20 69 6e 20 7a 4e 75 6c 6c 5b 5d 20  ytes in zNull[] 
f690: 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 71  */.    char *zSq
f6a0: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
f6b0: 20 20 20 2f 2a 20 41 6e 20 53 51 4c 20 73 74 61     /* An SQL sta
f6c0: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 63 68  tement */.    ch
f6d0: 61 72 20 2a 7a 4c 69 6e 65 3b 20 20 20 20 20 20  ar *zLine;      
f6e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73            /* A s
f6f0: 69 6e 67 6c 65 20 6c 69 6e 65 20 6f 66 20 69 6e  ingle line of in
f700: 70 75 74 20 66 72 6f 6d 20 74 68 65 20 66 69 6c  put from the fil
f710: 65 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 2a  e */.    char **
f720: 61 7a 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20  azCol;          
f730: 20 20 20 20 20 2f 2a 20 7a 4c 69 6e 65 5b 5d 20       /* zLine[] 
f740: 62 72 6f 6b 65 6e 20 75 70 20 69 6e 74 6f 20 63  broken up into c
f750: 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 63 68  olumns */.    ch
f760: 61 72 20 2a 7a 43 6f 6d 6d 69 74 3b 20 20 20 20  ar *zCommit;    
f770: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f 77            /* How
f780: 20 74 6f 20 63 6f 6d 6d 69 74 20 63 68 61 6e 67   to commit chang
f790: 65 73 20 2a 2f 0a 20 20 20 20 46 49 4c 45 20 2a  es */.    FILE *
f7a0: 69 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  in;             
f7b0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 70        /* The inp
f7c0: 75 74 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 69  ut file */.    i
f7d0: 6e 74 20 6c 69 6e 65 6e 6f 20 3d 20 30 3b 20 20  nt lineno = 0;  
f7e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69             /* Li
f7f0: 6e 65 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 70  ne number of inp
f800: 75 74 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 63  ut file */.    c
f810: 68 61 72 20 7a 4c 69 6e 65 4e 75 6d 5b 38 30 5d  har zLineNum[80]
f820: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69  ;          /* Li
f830: 6e 65 20 6e 75 6d 62 65 72 20 70 72 69 6e 74 20  ne number print 
f840: 62 75 66 66 65 72 20 2a 2f 0a 20 20 20 20 54 63  buffer */.    Tc
f850: 6c 5f 4f 62 6a 20 2a 70 52 65 73 75 6c 74 3b 20  l_Obj *pResult; 
f860: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 6e 74            /* int
f870: 65 72 70 20 72 65 73 75 6c 74 20 2a 2f 0a 0a 20  erp result */.. 
f880: 20 20 20 63 68 61 72 20 2a 7a 53 65 70 3b 0a 20     char *zSep;. 
f890: 20 20 20 63 68 61 72 20 2a 7a 4e 75 6c 6c 3b 0a     char *zNull;.
f8a0: 20 20 20 20 69 66 28 20 6f 62 6a 63 3c 35 20 7c      if( objc<5 |
f8b0: 7c 20 6f 62 6a 63 3e 37 20 29 7b 0a 20 20 20 20  | objc>7 ){.    
f8c0: 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
f8d0: 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62  gs(interp, 2, ob
f8e0: 6a 76 2c 20 0a 20 20 20 20 20 20 20 20 20 22 43  jv, .         "C
f8f0: 4f 4e 46 4c 49 43 54 2d 41 4c 47 4f 52 49 54 48  ONFLICT-ALGORITH
f900: 4d 20 54 41 42 4c 45 20 46 49 4c 45 4e 41 4d 45  M TABLE FILENAME
f910: 20 3f 53 45 50 41 52 41 54 4f 52 3f 20 3f 4e 55   ?SEPARATOR? ?NU
f920: 4c 4c 49 4e 44 49 43 41 54 4f 52 3f 22 29 3b 0a  LLINDICATOR?");.
f930: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
f940: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
f950: 20 20 69 66 28 20 6f 62 6a 63 3e 3d 36 20 29 7b    if( objc>=6 ){
f960: 0a 20 20 20 20 20 20 7a 53 65 70 20 3d 20 54 63  .      zSep = Tc
f970: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
f980: 62 6a 28 6f 62 6a 76 5b 35 5d 2c 20 30 29 3b 0a  bj(objv[5], 0);.
f990: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
f9a0: 20 7a 53 65 70 20 3d 20 22 5c 74 22 3b 0a 20 20   zSep = "\t";.  
f9b0: 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 62 6a 63    }.    if( objc
f9c0: 3e 3d 37 20 29 7b 0a 20 20 20 20 20 20 7a 4e 75  >=7 ){.      zNu
f9d0: 6c 6c 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  ll = Tcl_GetStri
f9e0: 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 36  ngFromObj(objv[6
f9f0: 5d 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65  ], 0);.    }else
fa00: 7b 0a 20 20 20 20 20 20 7a 4e 75 6c 6c 20 3d 20  {.      zNull = 
fa10: 22 22 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 43  "";.    }.    zC
fa20: 6f 6e 66 6c 69 63 74 20 3d 20 54 63 6c 5f 47 65  onflict = Tcl_Ge
fa30: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
fa40: 62 6a 76 5b 32 5d 2c 20 30 29 3b 0a 20 20 20 20  bjv[2], 0);.    
fa50: 7a 54 61 62 6c 65 20 3d 20 54 63 6c 5f 47 65 74  zTable = Tcl_Get
fa60: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
fa70: 6a 76 5b 33 5d 2c 20 30 29 3b 0a 20 20 20 20 7a  jv[3], 0);.    z
fa80: 46 69 6c 65 20 3d 20 54 63 6c 5f 47 65 74 53 74  File = Tcl_GetSt
fa90: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
faa0: 5b 34 5d 2c 20 30 29 3b 0a 20 20 20 20 6e 53 65  [4], 0);.    nSe
fab0: 70 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 53 65  p = strlen30(zSe
fac0: 70 29 3b 0a 20 20 20 20 6e 4e 75 6c 6c 20 3d 20  p);.    nNull = 
fad0: 73 74 72 6c 65 6e 33 30 28 7a 4e 75 6c 6c 29 3b  strlen30(zNull);
fae0: 0a 20 20 20 20 69 66 28 20 6e 53 65 70 3d 3d 30  .    if( nSep==0
faf0: 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70   ){.      Tcl_Ap
fb00: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
fb10: 70 2c 22 45 72 72 6f 72 3a 20 6e 6f 6e 2d 6e 75  p,"Error: non-nu
fb20: 6c 6c 20 73 65 70 61 72 61 74 6f 72 20 72 65 71  ll separator req
fb30: 75 69 72 65 64 20 66 6f 72 20 63 6f 70 79 22 2c  uired for copy",
fb40: 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  0);.      return
fb50: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
fb60: 7d 0a 20 20 20 20 69 66 28 73 74 72 63 6d 70 28  }.    if(strcmp(
fb70: 7a 43 6f 6e 66 6c 69 63 74 2c 20 22 72 6f 6c 6c  zConflict, "roll
fb80: 62 61 63 6b 22 29 20 21 3d 20 30 20 26 26 0a 20  back") != 0 &&. 
fb90: 20 20 20 20 20 20 73 74 72 63 6d 70 28 7a 43 6f        strcmp(zCo
fba0: 6e 66 6c 69 63 74 2c 20 22 61 62 6f 72 74 22 20  nflict, "abort" 
fbb0: 20 20 29 20 21 3d 20 30 20 26 26 0a 20 20 20 20    ) != 0 &&.    
fbc0: 20 20 20 73 74 72 63 6d 70 28 7a 43 6f 6e 66 6c     strcmp(zConfl
fbd0: 69 63 74 2c 20 22 66 61 69 6c 22 20 20 20 20 29  ict, "fail"    )
fbe0: 20 21 3d 20 30 20 26 26 0a 20 20 20 20 20 20 20   != 0 &&.       
fbf0: 73 74 72 63 6d 70 28 7a 43 6f 6e 66 6c 69 63 74  strcmp(zConflict
fc00: 2c 20 22 69 67 6e 6f 72 65 22 20 20 29 20 21 3d  , "ignore"  ) !=
fc10: 20 30 20 26 26 0a 20 20 20 20 20 20 20 73 74 72   0 &&.       str
fc20: 63 6d 70 28 7a 43 6f 6e 66 6c 69 63 74 2c 20 22  cmp(zConflict, "
fc30: 72 65 70 6c 61 63 65 22 20 29 20 21 3d 20 30 20  replace" ) != 0 
fc40: 29 20 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70  ) {.      Tcl_Ap
fc50: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
fc60: 70 2c 20 22 45 72 72 6f 72 3a 20 5c 22 22 2c 20  p, "Error: \"", 
fc70: 7a 43 6f 6e 66 6c 69 63 74 2c 20 0a 20 20 20 20  zConflict, .    
fc80: 20 20 20 20 20 20 20 20 22 5c 22 2c 20 63 6f 6e          "\", con
fc90: 66 6c 69 63 74 2d 61 6c 67 6f 72 69 74 68 6d 20  flict-algorithm 
fca0: 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f 66 3a 20  must be one of: 
fcb0: 72 6f 6c 6c 62 61 63 6b 2c 20 22 0a 20 20 20 20  rollback, ".    
fcc0: 20 20 20 20 20 20 20 20 22 61 62 6f 72 74 2c 20          "abort, 
fcd0: 66 61 69 6c 2c 20 69 67 6e 6f 72 65 2c 20 6f 72  fail, ignore, or
fce0: 20 72 65 70 6c 61 63 65 22 2c 20 30 29 3b 0a 20   replace", 0);. 
fcf0: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
fd00: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
fd10: 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f   zSql = sqlite3_
fd20: 6d 70 72 69 6e 74 66 28 22 53 45 4c 45 43 54 20  mprintf("SELECT 
fd30: 2a 20 46 52 4f 4d 20 27 25 71 27 22 2c 20 7a 54  * FROM '%q'", zT
fd40: 61 62 6c 65 29 3b 0a 20 20 20 20 69 66 28 20 7a  able);.    if( z
fd50: 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Sql==0 ){.      
fd60: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
fd70: 28 69 6e 74 65 72 70 2c 20 22 45 72 72 6f 72 3a  (interp, "Error:
fd80: 20 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 3a 20   no such table: 
fd90: 22 2c 20 7a 54 61 62 6c 65 2c 20 30 29 3b 0a 20  ", zTable, 0);. 
fda0: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
fdb0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
fdc0: 20 6e 42 79 74 65 20 3d 20 73 74 72 6c 65 6e 33   nByte = strlen3
fdd0: 30 28 7a 53 71 6c 29 3b 0a 20 20 20 20 72 63 20  0(zSql);.    rc 
fde0: 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  = sqlite3_prepar
fdf0: 65 28 70 44 62 2d 3e 64 62 2c 20 7a 53 71 6c 2c  e(pDb->db, zSql,
fe00: 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b   -1, &pStmt, 0);
fe10: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
fe20: 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 69 66 28  e(zSql);.    if(
fe30: 20 72 63 20 29 7b 0a 20 20 20 20 20 20 54 63 6c   rc ){.      Tcl
fe40: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
fe50: 74 65 72 70 2c 20 22 45 72 72 6f 72 3a 20 22 2c  terp, "Error: ",
fe60: 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
fe70: 70 44 62 2d 3e 64 62 29 2c 20 30 29 3b 0a 20 20  pDb->db), 0);.  
fe80: 20 20 20 20 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20      nCol = 0;.  
fe90: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e    }else{.      n
fea0: 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  Col = sqlite3_co
feb0: 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70 53 74 6d 74  lumn_count(pStmt
fec0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
fed0: 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53  ite3_finalize(pS
fee0: 74 6d 74 29 3b 0a 20 20 20 20 69 66 28 20 6e 43  tmt);.    if( nC
fef0: 6f 6c 3d 3d 30 20 29 20 7b 0a 20 20 20 20 20 20  ol==0 ) {.      
ff00: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
ff10: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 53 71 6c  ;.    }.    zSql
ff20: 20 3d 20 6d 61 6c 6c 6f 63 28 20 6e 42 79 74 65   = malloc( nByte
ff30: 20 2b 20 35 30 20 2b 20 6e 43 6f 6c 2a 32 20 29   + 50 + nCol*2 )
ff40: 3b 0a 20 20 20 20 69 66 28 20 7a 53 71 6c 3d 3d  ;.    if( zSql==
ff50: 30 20 29 20 7b 0a 20 20 20 20 20 20 54 63 6c 5f  0 ) {.      Tcl_
ff60: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
ff70: 65 72 70 2c 20 22 45 72 72 6f 72 3a 20 63 61 6e  erp, "Error: can
ff80: 27 74 20 6d 61 6c 6c 6f 63 28 29 22 2c 20 30 29  't malloc()", 0)
ff90: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
ffa0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
ffb0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
ffc0: 69 6e 74 66 28 6e 42 79 74 65 2b 35 30 2c 20 7a  intf(nByte+50, z
ffd0: 53 71 6c 2c 20 22 49 4e 53 45 52 54 20 4f 52 20  Sql, "INSERT OR 
ffe0: 25 71 20 49 4e 54 4f 20 27 25 71 27 20 56 41 4c  %q INTO '%q' VAL
fff0: 55 45 53 28 3f 22 2c 0a 20 20 20 20 20 20 20 20  UES(?",.        
10000 20 7a 43 6f 6e 66 6c 69 63 74 2c 20 7a 54 61 62   zConflict, zTab
10010 6c 65 29 3b 0a 20 20 20 20 6a 20 3d 20 73 74 72  le);.    j = str
10020 6c 65 6e 33 30 28 7a 53 71 6c 29 3b 0a 20 20 20  len30(zSql);.   
10030 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 43 6f 6c   for(i=1; i<nCol
10040 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 7a 53  ; i++){.      zS
10050 71 6c 5b 6a 2b 2b 5d 20 3d 20 27 2c 27 3b 0a 20  ql[j++] = ',';. 
10060 20 20 20 20 20 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d       zSql[j++] =
10070 20 27 3f 27 3b 0a 20 20 20 20 7d 0a 20 20 20 20   '?';.    }.    
10080 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d 20 27 29 27 3b  zSql[j++] = ')';
10090 0a 20 20 20 20 7a 53 71 6c 5b 6a 5d 20 3d 20 30  .    zSql[j] = 0
100a0 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
100b0 65 33 5f 70 72 65 70 61 72 65 28 70 44 62 2d 3e  e3_prepare(pDb->
100c0 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70  db, zSql, -1, &p
100d0 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 66 72  Stmt, 0);.    fr
100e0 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 69 66  ee(zSql);.    if
100f0 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 54 63  ( rc ){.      Tc
10100 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
10110 6e 74 65 72 70 2c 20 22 45 72 72 6f 72 3a 20 22  nterp, "Error: "
10120 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  , sqlite3_errmsg
10130 28 70 44 62 2d 3e 64 62 29 2c 20 30 29 3b 0a 20  (pDb->db), 0);. 
10140 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e       sqlite3_fin
10150 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20  alize(pStmt);.  
10160 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
10170 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
10180 69 6e 20 3d 20 66 6f 70 65 6e 28 7a 46 69 6c 65  in = fopen(zFile
10190 2c 20 22 72 62 22 29 3b 0a 20 20 20 20 69 66 28  , "rb");.    if(
101a0 20 69 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20   in==0 ){.      
101b0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
101c0 28 69 6e 74 65 72 70 2c 20 22 45 72 72 6f 72 3a  (interp, "Error:
101d0 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 66 69 6c   cannot open fil
101e0 65 3a 20 22 2c 20 7a 46 69 6c 65 2c 20 4e 55 4c  e: ", zFile, NUL
101f0 4c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  L);.      sqlite
10200 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
10210 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
10220 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
10230 0a 20 20 20 20 61 7a 43 6f 6c 20 3d 20 6d 61 6c  .    azCol = mal
10240 6c 6f 63 28 20 73 69 7a 65 6f 66 28 61 7a 43 6f  loc( sizeof(azCo
10250 6c 5b 30 5d 29 2a 28 6e 43 6f 6c 2b 31 29 20 29  l[0])*(nCol+1) )
10260 3b 0a 20 20 20 20 69 66 28 20 61 7a 43 6f 6c 3d  ;.    if( azCol=
10270 3d 30 20 29 20 7b 0a 20 20 20 20 20 20 54 63 6c  =0 ) {.      Tcl
10280 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
10290 74 65 72 70 2c 20 22 45 72 72 6f 72 3a 20 63 61  terp, "Error: ca
102a0 6e 27 74 20 6d 61 6c 6c 6f 63 28 29 22 2c 20 30  n't malloc()", 0
102b0 29 3b 0a 20 20 20 20 20 20 66 63 6c 6f 73 65 28  );.      fclose(
102c0 69 6e 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  in);.      retur
102d0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
102e0 20 7d 0a 20 20 20 20 28 76 6f 69 64 29 73 71 6c   }.    (void)sql
102f0 69 74 65 33 5f 65 78 65 63 28 70 44 62 2d 3e 64  ite3_exec(pDb->d
10300 62 2c 20 22 42 45 47 49 4e 22 2c 20 30 2c 20 30  b, "BEGIN", 0, 0
10310 2c 20 30 29 3b 0a 20 20 20 20 7a 43 6f 6d 6d 69  , 0);.    zCommi
10320 74 20 3d 20 22 43 4f 4d 4d 49 54 22 3b 0a 20 20  t = "COMMIT";.  
10330 20 20 77 68 69 6c 65 28 20 28 7a 4c 69 6e 65 20    while( (zLine 
10340 3d 20 6c 6f 63 61 6c 5f 67 65 74 6c 69 6e 65 28  = local_getline(
10350 30 2c 20 69 6e 29 29 21 3d 30 20 29 7b 0a 20 20  0, in))!=0 ){.  
10360 20 20 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20      char *z;.   
10370 20 20 20 69 20 3d 20 30 3b 0a 20 20 20 20 20 20     i = 0;.      
10380 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20  lineno++;.      
10390 61 7a 43 6f 6c 5b 30 5d 20 3d 20 7a 4c 69 6e 65  azCol[0] = zLine
103a0 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 2c  ;.      for(i=0,
103b0 20 7a 3d 7a 4c 69 6e 65 3b 20 2a 7a 3b 20 7a 2b   z=zLine; *z; z+
103c0 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
103d0 2a 7a 3d 3d 7a 53 65 70 5b 30 5d 20 26 26 20 73  *z==zSep[0] && s
103e0 74 72 6e 63 6d 70 28 7a 2c 20 7a 53 65 70 2c 20  trncmp(z, zSep, 
103f0 6e 53 65 70 29 3d 3d 30 20 29 7b 0a 20 20 20 20  nSep)==0 ){.    
10400 20 20 20 20 20 20 2a 7a 20 3d 20 30 3b 0a 20 20        *z = 0;.  
10410 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20          i++;.   
10420 20 20 20 20 20 20 20 69 66 28 20 69 3c 6e 43 6f         if( i<nCo
10430 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  l ){.           
10440 20 61 7a 43 6f 6c 5b 69 5d 20 3d 20 26 7a 5b 6e   azCol[i] = &z[n
10450 53 65 70 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  Sep];.          
10460 20 20 7a 20 2b 3d 20 6e 53 65 70 2d 31 3b 0a 20    z += nSep-1;. 
10470 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
10480 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
10490 20 20 20 69 66 28 20 69 2b 31 21 3d 6e 43 6f 6c     if( i+1!=nCol
104a0 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72   ){.        char
104b0 20 2a 7a 45 72 72 3b 0a 20 20 20 20 20 20 20 20   *zErr;.        
104c0 69 6e 74 20 6e 45 72 72 20 3d 20 73 74 72 6c 65  int nErr = strle
104d0 6e 33 30 28 7a 46 69 6c 65 29 20 2b 20 32 30 30  n30(zFile) + 200
104e0 3b 0a 20 20 20 20 20 20 20 20 7a 45 72 72 20 3d  ;.        zErr =
104f0 20 6d 61 6c 6c 6f 63 28 6e 45 72 72 29 3b 0a 20   malloc(nErr);. 
10500 20 20 20 20 20 20 20 69 66 28 20 7a 45 72 72 20         if( zErr 
10510 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
10520 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 45  ite3_snprintf(nE
10530 72 72 2c 20 7a 45 72 72 2c 0a 20 20 20 20 20 20  rr, zErr,.      
10540 20 20 20 20 20 20 20 22 45 72 72 6f 72 3a 20 25         "Error: %
10550 73 20 6c 69 6e 65 20 25 64 3a 20 65 78 70 65 63  s line %d: expec
10560 74 65 64 20 25 64 20 63 6f 6c 75 6d 6e 73 20 6f  ted %d columns o
10570 66 20 64 61 74 61 20 62 75 74 20 66 6f 75 6e 64  f data but found
10580 20 25 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20   %d",.          
10590 20 20 20 7a 46 69 6c 65 2c 20 6c 69 6e 65 6e 6f     zFile, lineno
105a0 2c 20 6e 43 6f 6c 2c 20 69 2b 31 29 3b 0a 20 20  , nCol, i+1);.  
105b0 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65          Tcl_Appe
105c0 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
105d0 20 7a 45 72 72 2c 20 30 29 3b 0a 20 20 20 20 20   zErr, 0);.     
105e0 20 20 20 20 20 66 72 65 65 28 7a 45 72 72 29 3b       free(zErr);
105f0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
10600 20 20 20 7a 43 6f 6d 6d 69 74 20 3d 20 22 52 4f     zCommit = "RO
10610 4c 4c 42 41 43 4b 22 3b 0a 20 20 20 20 20 20 20  LLBACK";.       
10620 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
10630 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
10640 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nCol; i++){.   
10650 20 20 20 20 20 2f 2a 20 63 68 65 63 6b 20 66 6f       /* check fo
10660 72 20 6e 75 6c 6c 20 64 61 74 61 2c 20 69 66 20  r null data, if 
10670 73 6f 2c 20 62 69 6e 64 20 61 73 20 6e 75 6c 6c  so, bind as null
10680 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
10690 28 6e 4e 75 6c 6c 3e 30 20 26 26 20 73 74 72 63  (nNull>0 && strc
106a0 6d 70 28 61 7a 43 6f 6c 5b 69 5d 2c 20 7a 4e 75  mp(azCol[i], zNu
106b0 6c 6c 29 3d 3d 30 29 0a 20 20 20 20 20 20 20 20  ll)==0).        
106c0 20 20 7c 7c 20 73 74 72 6c 65 6e 33 30 28 61 7a    || strlen30(az
106d0 43 6f 6c 5b 69 5d 29 3d 3d 30 20 0a 20 20 20 20  Col[i])==0 .    
106e0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
106f0 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75   sqlite3_bind_nu
10700 6c 6c 28 70 53 74 6d 74 2c 20 69 2b 31 29 3b 0a  ll(pStmt, i+1);.
10710 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
10720 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
10730 5f 62 69 6e 64 5f 74 65 78 74 28 70 53 74 6d 74  _bind_text(pStmt
10740 2c 20 69 2b 31 2c 20 61 7a 43 6f 6c 5b 69 5d 2c  , i+1, azCol[i],
10750 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54 41 54   -1, SQLITE_STAT
10760 49 43 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  IC);.        }. 
10770 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
10780 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29  ite3_step(pStmt)
10790 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
107a0 69 74 65 33 5f 72 65 73 65 74 28 70 53 74 6d 74  ite3_reset(pStmt
107b0 29 3b 0a 20 20 20 20 20 20 66 72 65 65 28 7a 4c  );.      free(zL
107c0 69 6e 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ine);.      if( 
107d0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
107e0 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70  .        Tcl_App
107f0 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
10800 2c 22 45 72 72 6f 72 3a 20 22 2c 20 73 71 6c 69  ,"Error: ", sqli
10810 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e  te3_errmsg(pDb->
10820 64 62 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  db), 0);.       
10830 20 7a 43 6f 6d 6d 69 74 20 3d 20 22 52 4f 4c 4c   zCommit = "ROLL
10840 42 41 43 4b 22 3b 0a 20 20 20 20 20 20 20 20 62  BACK";.        b
10850 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
10860 20 20 7d 0a 20 20 20 20 66 72 65 65 28 61 7a 43    }.    free(azC
10870 6f 6c 29 3b 0a 20 20 20 20 66 63 6c 6f 73 65 28  ol);.    fclose(
10880 69 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  in);.    sqlite3
10890 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
108a0 3b 0a 20 20 20 20 28 76 6f 69 64 29 73 71 6c 69  ;.    (void)sqli
108b0 74 65 33 5f 65 78 65 63 28 70 44 62 2d 3e 64 62  te3_exec(pDb->db
108c0 2c 20 7a 43 6f 6d 6d 69 74 2c 20 30 2c 20 30 2c  , zCommit, 0, 0,
108d0 20 30 29 3b 0a 0a 20 20 20 20 69 66 28 20 7a 43   0);..    if( zC
108e0 6f 6d 6d 69 74 5b 30 5d 20 3d 3d 20 27 43 27 20  ommit[0] == 'C' 
108f0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 73 75 63 63  ){.      /* succ
10900 65 73 73 2c 20 73 65 74 20 72 65 73 75 6c 74 20  ess, set result 
10910 61 73 20 6e 75 6d 62 65 72 20 6f 66 20 6c 69 6e  as number of lin
10920 65 73 20 70 72 6f 63 65 73 73 65 64 20 2a 2f 0a  es processed */.
10930 20 20 20 20 20 20 70 52 65 73 75 6c 74 20 3d 20        pResult = 
10940 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_GetObjResult
10950 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 20 20  (interp);.      
10960 54 63 6c 5f 53 65 74 49 6e 74 4f 62 6a 28 70 52  Tcl_SetIntObj(pR
10970 65 73 75 6c 74 2c 20 6c 69 6e 65 6e 6f 29 3b 0a  esult, lineno);.
10980 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 4f        rc = TCL_O
10990 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  K;.    }else{.  
109a0 20 20 20 20 2f 2a 20 66 61 69 6c 75 72 65 2c 20      /* failure, 
109b0 61 70 70 65 6e 64 20 6c 69 6e 65 6e 6f 20 77 68  append lineno wh
109c0 65 72 65 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20  ere failed */.  
109d0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
109e0 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 4c 69 6e  intf(sizeof(zLin
109f0 65 4e 75 6d 29 2c 20 7a 4c 69 6e 65 4e 75 6d 2c  eNum), zLineNum,
10a00 22 25 64 22 2c 6c 69 6e 65 6e 6f 29 3b 0a 20 20  "%d",lineno);.  
10a10 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
10a20 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 2c 20 66  sult(interp,", f
10a30 61 69 6c 65 64 20 77 68 69 6c 65 20 70 72 6f 63  ailed while proc
10a40 65 73 73 69 6e 67 20 6c 69 6e 65 3a 20 22 2c 7a  essing line: ",z
10a50 4c 69 6e 65 4e 75 6d 2c 30 29 3b 0a 20 20 20 20  LineNum,0);.    
10a60 20 20 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52    rc = TCL_ERROR
10a70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61  ;.    }.    brea
10a80 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  k;.  }..  /*.  *
10a90 2a 20 20 20 20 24 64 62 20 65 6e 61 62 6c 65 5f  *    $db enable_
10aa0 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e 20 42  load_extension B
10ab0 4f 4f 4c 45 41 4e 0a 20 20 2a 2a 0a 20 20 2a 2a  OOLEAN.  **.  **
10ac0 20 54 75 72 6e 20 74 68 65 20 65 78 74 65 6e 73   Turn the extens
10ad0 69 6f 6e 20 6c 6f 61 64 69 6e 67 20 66 65 61 74  ion loading feat
10ae0 75 72 65 20 6f 6e 20 6f 72 20 6f 66 66 2e 20 20  ure on or off.  
10af0 49 74 20 69 66 20 6f 66 66 20 62 79 0a 20 20 2a  It if off by.  *
10b00 2a 20 64 65 66 61 75 6c 74 2e 0a 20 20 2a 2f 0a  * default..  */.
10b10 20 20 63 61 73 65 20 44 42 5f 45 4e 41 42 4c 45    case DB_ENABLE
10b20 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 3a  _LOAD_EXTENSION:
10b30 20 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   {.#ifndef SQLIT
10b40 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45  E_OMIT_LOAD_EXTE
10b50 4e 53 49 4f 4e 0a 20 20 20 20 69 6e 74 20 6f 6e  NSION.    int on
10b60 6f 66 66 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a  off;.    if( obj
10b70 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 54 63  c!=3 ){.      Tc
10b80 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
10b90 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
10ba0 22 42 4f 4f 4c 45 41 4e 22 29 3b 0a 20 20 20 20  "BOOLEAN");.    
10bb0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
10bc0 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  OR;.    }.    if
10bd0 28 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e  ( Tcl_GetBoolean
10be0 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
10bf0 6f 62 6a 76 5b 32 5d 2c 20 26 6f 6e 6f 66 66 29  objv[2], &onoff)
10c00 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
10c10 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
10c20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 65 6e  }.    sqlite3_en
10c30 61 62 6c 65 5f 6c 6f 61 64 5f 65 78 74 65 6e 73  able_load_extens
10c40 69 6f 6e 28 70 44 62 2d 3e 64 62 2c 20 6f 6e 6f  ion(pDb->db, ono
10c50 66 66 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a  ff);.    break;.
10c60 23 65 6c 73 65 0a 20 20 20 20 54 63 6c 5f 41 70  #else.    Tcl_Ap
10c70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
10c80 70 2c 20 22 65 78 74 65 6e 73 69 6f 6e 20 6c 6f  p, "extension lo
10c90 61 64 69 6e 67 20 69 73 20 74 75 72 6e 65 64 20  ading is turned 
10ca0 6f 66 66 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74  off at compile-t
10cb0 69 6d 65 22 2c 0a 20 20 20 20 20 20 20 20 20 20  ime",.          
10cc0 20 20 20 20 20 20 20 20 20 20 20 30 29 3b 0a 20             0);. 
10cd0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
10ce0 52 4f 52 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a  ROR;.#endif.  }.
10cf0 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 24 64  .  /*.  **    $d
10d00 62 20 65 72 72 6f 72 63 6f 64 65 0a 20 20 2a 2a  b errorcode.  **
10d10 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  .  ** Return the
10d20 20 6e 75 6d 65 72 69 63 20 65 72 72 6f 72 20 63   numeric error c
10d30 6f 64 65 20 74 68 61 74 20 77 61 73 20 72 65 74  ode that was ret
10d40 75 72 6e 65 64 20 62 79 20 74 68 65 20 6d 6f 73  urned by the mos
10d50 74 20 72 65 63 65 6e 74 0a 20 20 2a 2a 20 63 61  t recent.  ** ca
10d60 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 78  ll to sqlite3_ex
10d70 65 63 28 29 2e 0a 20 20 2a 2f 0a 20 20 63 61 73  ec()..  */.  cas
10d80 65 20 44 42 5f 45 52 52 4f 52 43 4f 44 45 3a 20  e DB_ERRORCODE: 
10d90 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a  {.    Tcl_SetObj
10da0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
10db0 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 71 6c  cl_NewIntObj(sql
10dc0 69 74 65 33 5f 65 72 72 63 6f 64 65 28 70 44 62  ite3_errcode(pDb
10dd0 2d 3e 64 62 29 29 29 3b 0a 20 20 20 20 62 72 65  ->db)));.    bre
10de0 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  ak;.  }..  /*.  
10df0 2a 2a 20 20 20 20 24 64 62 20 65 78 69 73 74 73  **    $db exists
10e00 20 24 73 71 6c 0a 20 20 2a 2a 20 20 20 20 24 64   $sql.  **    $d
10e10 62 20 6f 6e 65 63 6f 6c 75 6d 6e 20 24 73 71 6c  b onecolumn $sql
10e20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6f  .  **.  ** The o
10e30 6e 65 63 6f 6c 75 6d 6e 20 6d 65 74 68 6f 64 20  necolumn method 
10e40 69 73 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e  is the equivalen
10e50 74 20 6f 66 3a 0a 20 20 2a 2a 20 20 20 20 20 6c  t of:.  **     l
10e60 69 6e 64 65 78 20 5b 24 64 62 20 65 76 61 6c 20  index [$db eval 
10e70 24 73 71 6c 5d 20 30 0a 20 20 2a 2f 0a 20 20 63  $sql] 0.  */.  c
10e80 61 73 65 20 44 42 5f 45 58 49 53 54 53 3a 20 0a  ase DB_EXISTS: .
10e90 20 20 63 61 73 65 20 44 42 5f 4f 4e 45 43 4f 4c    case DB_ONECOL
10ea0 55 4d 4e 3a 20 7b 0a 20 20 20 20 44 62 45 76 61  UMN: {.    DbEva
10eb0 6c 43 6f 6e 74 65 78 74 20 73 45 76 61 6c 3b 0a  lContext sEval;.
10ec0 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20      if( objc!=3 
10ed0 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f  ){.      Tcl_Wro
10ee0 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
10ef0 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 53 51 4c 22  , 2, objv, "SQL"
10f00 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
10f10 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
10f20 0a 0a 20 20 20 20 64 62 45 76 61 6c 49 6e 69 74  ..    dbEvalInit
10f30 28 26 73 45 76 61 6c 2c 20 70 44 62 2c 20 6f 62  (&sEval, pDb, ob
10f40 6a 76 5b 32 5d 2c 20 30 29 3b 0a 20 20 20 20 72  jv[2], 0);.    r
10f50 63 20 3d 20 64 62 45 76 61 6c 53 74 65 70 28 26  c = dbEvalStep(&
10f60 73 45 76 61 6c 29 3b 0a 20 20 20 20 69 66 28 20  sEval);.    if( 
10f70 63 68 6f 69 63 65 3d 3d 44 42 5f 4f 4e 45 43 4f  choice==DB_ONECO
10f80 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 69 66  LUMN ){.      if
10f90 28 20 72 63 3d 3d 54 43 4c 5f 4f 4b 20 29 7b 0a  ( rc==TCL_OK ){.
10fa0 20 20 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f          Tcl_SetO
10fb0 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
10fc0 20 64 62 45 76 61 6c 43 6f 6c 75 6d 6e 56 61 6c   dbEvalColumnVal
10fd0 75 65 28 26 73 45 76 61 6c 2c 20 30 29 29 3b 0a  ue(&sEval, 0));.
10fe0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
10ff0 65 20 69 66 28 20 72 63 3d 3d 54 43 4c 5f 42 52  e if( rc==TCL_BR
11000 45 41 4b 20 7c 7c 20 72 63 3d 3d 54 43 4c 5f 4f  EAK || rc==TCL_O
11010 4b 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 53  K ){.      Tcl_S
11020 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
11030 72 70 2c 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65  rp, Tcl_NewBoole
11040 61 6e 4f 62 6a 28 72 63 3d 3d 54 43 4c 5f 4f 4b  anObj(rc==TCL_OK
11050 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 62  ));.    }.    db
11060 45 76 61 6c 46 69 6e 61 6c 69 7a 65 28 26 73 45  EvalFinalize(&sE
11070 76 61 6c 29 3b 0a 0a 20 20 20 20 69 66 28 20 72  val);..    if( r
11080 63 3d 3d 54 43 4c 5f 42 52 45 41 4b 20 29 7b 0a  c==TCL_BREAK ){.
11090 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 4f        rc = TCL_O
110a0 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65  K;.    }.    bre
110b0 61 6b 3b 0a 20 20 7d 0a 20 20 20 0a 20 20 2f 2a  ak;.  }.   .  /*
110c0 0a 20 20 2a 2a 20 20 20 20 24 64 62 20 65 76 61  .  **    $db eva
110d0 6c 20 24 73 71 6c 20 3f 61 72 72 61 79 3f 20 3f  l $sql ?array? ?
110e0 7b 20 20 2e 2e 2e 63 6f 64 65 2e 2e 2e 20 7d 3f  {  ...code... }?
110f0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 53  .  **.  ** The S
11100 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20  QL statement in 
11110 24 73 71 6c 20 69 73 20 65 76 61 6c 75 61 74 65  $sql is evaluate
11120 64 2e 20 20 46 6f 72 20 65 61 63 68 20 72 6f 77  d.  For each row
11130 2c 20 74 68 65 20 76 61 6c 75 65 73 20 61 72 65  , the values are
11140 0a 20 20 2a 2a 20 70 6c 61 63 65 64 20 69 6e 20  .  ** placed in 
11150 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20  elements of the 
11160 61 72 72 61 79 20 6e 61 6d 65 64 20 22 61 72 72  array named "arr
11170 61 79 22 20 61 6e 64 20 2e 2e 2e 63 6f 64 65 2e  ay" and ...code.
11180 2e 2e 20 69 73 20 65 78 65 63 75 74 65 64 2e 0a  .. is executed..
11190 20 20 2a 2a 20 49 66 20 22 61 72 72 61 79 22 20    ** If "array" 
111a0 61 6e 64 20 22 63 6f 64 65 22 20 61 72 65 20 6f  and "code" are o
111b0 6d 69 74 74 65 64 2c 20 74 68 65 6e 20 6e 6f 20  mitted, then no 
111c0 63 61 6c 6c 62 61 63 6b 20 69 73 20 65 76 65 72  callback is ever
111d0 79 20 69 6e 76 6f 6b 65 64 2e 0a 20 20 2a 2a 20  y invoked..  ** 
111e0 49 66 20 22 61 72 72 61 79 22 20 69 73 20 61 6e  If "array" is an
111f0 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2c 20 74   empty string, t
11200 68 65 6e 20 74 68 65 20 76 61 6c 75 65 73 20 61  hen the values a
11210 72 65 20 70 6c 61 63 65 64 20 69 6e 20 76 61 72  re placed in var
11220 69 61 62 6c 65 73 0a 20 20 2a 2a 20 74 68 61 74  iables.  ** that
11230 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e   have the same n
11240 61 6d 65 20 61 73 20 74 68 65 20 66 69 65 6c 64  ame as the field
11250 73 20 65 78 74 72 61 63 74 65 64 20 62 79 20 74  s extracted by t
11260 68 65 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20  he query..  */. 
11270 20 63 61 73 65 20 44 42 5f 45 56 41 4c 3a 20 7b   case DB_EVAL: {
11280 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3c 33 20  .    if( objc<3 
11290 7c 7c 20 6f 62 6a 63 3e 35 20 29 7b 0a 20 20 20  || objc>5 ){.   
112a0 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
112b0 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
112c0 62 6a 76 2c 20 22 53 51 4c 20 3f 41 52 52 41 59  bjv, "SQL ?ARRAY
112d0 2d 4e 41 4d 45 3f 20 3f 53 43 52 49 50 54 3f 22  -NAME? ?SCRIPT?"
112e0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
112f0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
11300 0a 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d  ..    if( objc==
11310 33 20 29 7b 0a 20 20 20 20 20 20 44 62 45 76 61  3 ){.      DbEva
11320 6c 43 6f 6e 74 65 78 74 20 73 45 76 61 6c 3b 0a  lContext sEval;.
11330 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70        Tcl_Obj *p
11340 52 65 74 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a  Ret = Tcl_NewObj
11350 28 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 49 6e  ();.      Tcl_In
11360 63 72 52 65 66 43 6f 75 6e 74 28 70 52 65 74 29  crRefCount(pRet)
11370 3b 0a 20 20 20 20 20 20 64 62 45 76 61 6c 49 6e  ;.      dbEvalIn
11380 69 74 28 26 73 45 76 61 6c 2c 20 70 44 62 2c 20  it(&sEval, pDb, 
11390 6f 62 6a 76 5b 32 5d 2c 20 30 29 3b 0a 20 20 20  objv[2], 0);.   
113a0 20 20 20 77 68 69 6c 65 28 20 54 43 4c 5f 4f 4b     while( TCL_OK
113b0 3d 3d 28 72 63 20 3d 20 64 62 45 76 61 6c 53 74  ==(rc = dbEvalSt
113c0 65 70 28 26 73 45 76 61 6c 29 29 20 29 7b 0a 20  ep(&sEval)) ){. 
113d0 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20         int i;.  
113e0 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a        int nCol;.
113f0 20 20 20 20 20 20 20 20 64 62 45 76 61 6c 52 6f          dbEvalRo
11400 77 49 6e 66 6f 28 26 73 45 76 61 6c 2c 20 26 6e  wInfo(&sEval, &n
11410 43 6f 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  Col, 0);.       
11420 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c   for(i=0; i<nCol
11430 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
11440 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
11450 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
11460 70 2c 20 70 52 65 74 2c 20 64 62 45 76 61 6c 43  p, pRet, dbEvalC
11470 6f 6c 75 6d 6e 56 61 6c 75 65 28 26 73 45 76 61  olumnValue(&sEva
11480 6c 2c 20 69 29 29 3b 0a 20 20 20 20 20 20 20 20  l, i));.        
11490 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
114a0 64 62 45 76 61 6c 46 69 6e 61 6c 69 7a 65 28 26  dbEvalFinalize(&
114b0 73 45 76 61 6c 29 3b 0a 20 20 20 20 20 20 69 66  sEval);.      if
114c0 28 20 72 63 3d 3d 54 43 4c 5f 42 52 45 41 4b 20  ( rc==TCL_BREAK 
114d0 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 53  ){.        Tcl_S
114e0 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
114f0 72 70 2c 20 70 52 65 74 29 3b 0a 20 20 20 20 20  rp, pRet);.     
11500 20 20 20 72 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a     rc = TCL_OK;.
11510 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 54 63        }.      Tc
11520 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70  l_DecrRefCount(p
11530 52 65 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Ret);.    }else{
11540 0a 20 20 20 20 20 20 43 6c 69 65 6e 74 44 61 74  .      ClientDat
11550 61 20 63 64 5b 32 5d 3b 0a 20 20 20 20 20 20 44  a cd[2];.      D
11560 62 45 76 61 6c 43 6f 6e 74 65 78 74 20 2a 70 3b  bEvalContext *p;
11570 0a 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a  .      Tcl_Obj *
11580 70 41 72 72 61 79 20 3d 20 30 3b 0a 20 20 20 20  pArray = 0;.    
11590 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 53 63 72 69    Tcl_Obj *pScri
115a0 70 74 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 6f  pt;..      if( o
115b0 62 6a 63 3d 3d 35 20 26 26 20 2a 28 63 68 61 72  bjc==5 && *(char
115c0 20 2a 29 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   *)Tcl_GetString
115d0 28 6f 62 6a 76 5b 33 5d 29 20 29 7b 0a 20 20 20  (objv[3]) ){.   
115e0 20 20 20 20 20 70 41 72 72 61 79 20 3d 20 6f 62       pArray = ob
115f0 6a 76 5b 33 5d 3b 0a 20 20 20 20 20 20 7d 0a 20  jv[3];.      }. 
11600 20 20 20 20 20 70 53 63 72 69 70 74 20 3d 20 6f       pScript = o
11610 62 6a 76 5b 6f 62 6a 63 2d 31 5d 3b 0a 20 20 20  bjv[objc-1];.   
11620 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f     Tcl_IncrRefCo
11630 75 6e 74 28 70 53 63 72 69 70 74 29 3b 0a 20 20  unt(pScript);.  
11640 20 20 20 20 0a 20 20 20 20 20 20 70 20 3d 20 28      .      p = (
11650 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 20 2a 29  DbEvalContext *)
11660 54 63 6c 5f 41 6c 6c 6f 63 28 73 69 7a 65 6f 66  Tcl_Alloc(sizeof
11670 28 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 29 29  (DbEvalContext))
11680 3b 0a 20 20 20 20 20 20 64 62 45 76 61 6c 49 6e  ;.      dbEvalIn
11690 69 74 28 70 2c 20 70 44 62 2c 20 6f 62 6a 76 5b  it(p, pDb, objv[
116a0 32 5d 2c 20 70 41 72 72 61 79 29 3b 0a 0a 20 20  2], pArray);..  
116b0 20 20 20 20 63 64 5b 30 5d 20 3d 20 28 76 6f 69      cd[0] = (voi
116c0 64 20 2a 29 70 3b 0a 20 20 20 20 20 20 63 64 5b  d *)p;.      cd[
116d0 31 5d 20 3d 20 28 76 6f 69 64 20 2a 29 70 53 63  1] = (void *)pSc
116e0 72 69 70 74 3b 0a 20 20 20 20 20 20 72 63 20 3d  ript;.      rc =
116f0 20 44 62 45 76 61 6c 4e 65 78 74 43 6d 64 28 63   DbEvalNextCmd(c
11700 64 2c 20 69 6e 74 65 72 70 2c 20 54 43 4c 5f 4f  d, interp, TCL_O
11710 4b 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 72  K);.    }.    br
11720 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  eak;.  }..  /*. 
11730 20 2a 2a 20 20 20 20 20 24 64 62 20 66 75 6e 63   **     $db func
11740 74 69 6f 6e 20 4e 41 4d 45 20 5b 2d 61 72 67 63  tion NAME [-argc
11750 6f 75 6e 74 20 4e 5d 20 53 43 52 49 50 54 0a 20  ount N] SCRIPT. 
11760 20 2a 2a 0a 20 20 2a 2a 20 43 72 65 61 74 65 20   **.  ** Create 
11770 61 20 6e 65 77 20 53 51 4c 20 66 75 6e 63 74 69  a new SQL functi
11780 6f 6e 20 63 61 6c 6c 65 64 20 4e 41 4d 45 2e 20  on called NAME. 
11790 20 57 68 65 6e 65 76 65 72 20 74 68 61 74 20 66   Whenever that f
117a0 75 6e 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20  unction is.  ** 
117b0 63 61 6c 6c 65 64 2c 20 69 6e 76 6f 6b 65 20 53  called, invoke S
117c0 43 52 49 50 54 20 74 6f 20 65 76 61 6c 75 61 74  CRIPT to evaluat
117d0 65 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 2e 0a  e the function..
117e0 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 46    */.  case DB_F
117f0 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 53  UNCTION: {.    S
11800 71 6c 46 75 6e 63 20 2a 70 46 75 6e 63 3b 0a 20  qlFunc *pFunc;. 
11810 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 53 63 72     Tcl_Obj *pScr
11820 69 70 74 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  ipt;.    char *z
11830 4e 61 6d 65 3b 0a 20 20 20 20 69 6e 74 20 6e 41  Name;.    int nA
11840 72 67 20 3d 20 2d 31 3b 0a 20 20 20 20 69 66 28  rg = -1;.    if(
11850 20 6f 62 6a 63 3d 3d 36 20 29 7b 0a 20 20 20 20   objc==6 ){.    
11860 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20    const char *z 
11870 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  = Tcl_GetString(
11880 6f 62 6a 76 5b 33 5d 29 3b 0a 20 20 20 20 20 20  objv[3]);.      
11890 69 6e 74 20 6e 20 3d 20 73 74 72 6c 65 6e 33 30  int n = strlen30
118a0 28 7a 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  (z);.      if( n
118b0 3e 32 20 26 26 20 73 74 72 6e 63 6d 70 28 7a 2c  >2 && strncmp(z,
118c0 20 22 2d 61 72 67 63 6f 75 6e 74 22 2c 6e 29 3d   "-argcount",n)=
118d0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  =0 ){.        if
118e0 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  ( Tcl_GetIntFrom
118f0 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
11900 5b 34 5d 2c 20 26 6e 41 72 67 29 20 29 20 72 65  [4], &nArg) ) re
11910 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
11920 20 20 20 20 20 20 20 20 69 66 28 20 6e 41 72 67          if( nArg
11930 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <0 ){.          
11940 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
11950 28 69 6e 74 65 72 70 2c 20 22 6e 75 6d 62 65 72  (interp, "number
11960 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 6d 75   of arguments mu
11970 73 74 20 62 65 20 6e 6f 6e 2d 6e 65 67 61 74 69  st be non-negati
11980 76 65 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ve",.           
11990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
119a0 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20  (char*)0);.     
119b0 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
119c0 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d  ERROR;.        }
119d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
119e0 53 63 72 69 70 74 20 3d 20 6f 62 6a 76 5b 35 5d  Script = objv[5]
119f0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
11a00 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 20  objc!=4 ){.     
11a10 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
11a20 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a  s(interp, 2, obj
11a30 76 2c 20 22 4e 41 4d 45 20 5b 2d 61 72 67 63 6f  v, "NAME [-argco
11a40 75 6e 74 20 4e 5d 20 53 43 52 49 50 54 22 29 3b  unt N] SCRIPT");
11a50 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
11a60 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c  L_ERROR;.    }el
11a70 73 65 7b 0a 20 20 20 20 20 20 70 53 63 72 69 70  se{.      pScrip
11a80 74 20 3d 20 6f 62 6a 76 5b 33 5d 3b 0a 20 20 20  t = objv[3];.   
11a90 20 7d 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 54   }.    zName = T
11aa0 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
11ab0 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30 29 3b  Obj(objv[2], 0);
11ac0 0a 20 20 20 20 70 46 75 6e 63 20 3d 20 66 69 6e  .    pFunc = fin
11ad0 64 53 71 6c 46 75 6e 63 28 70 44 62 2c 20 7a 4e  dSqlFunc(pDb, zN
11ae0 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 70 46  ame);.    if( pF
11af0 75 6e 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  unc==0 ) return 
11b00 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 69  TCL_ERROR;.    i
11b10 66 28 20 70 46 75 6e 63 2d 3e 70 53 63 72 69 70  f( pFunc->pScrip
11b20 74 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 44  t ){.      Tcl_D
11b30 65 63 72 52 65 66 43 6f 75 6e 74 28 70 46 75 6e  ecrRefCount(pFun
11b40 63 2d 3e 70 53 63 72 69 70 74 29 3b 0a 20 20 20  c->pScript);.   
11b50 20 7d 0a 20 20 20 20 70 46 75 6e 63 2d 3e 70 53   }.    pFunc->pS
11b60 63 72 69 70 74 20 3d 20 70 53 63 72 69 70 74 3b  cript = pScript;
11b70 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66  .    Tcl_IncrRef
11b80 43 6f 75 6e 74 28 70 53 63 72 69 70 74 29 3b 0a  Count(pScript);.
11b90 20 20 20 20 70 46 75 6e 63 2d 3e 75 73 65 45 76      pFunc->useEv
11ba0 61 6c 4f 62 6a 76 20 3d 20 73 61 66 65 54 6f 55  alObjv = safeToU
11bb0 73 65 45 76 61 6c 4f 62 6a 76 28 69 6e 74 65 72  seEvalObjv(inter
11bc0 70 2c 20 70 53 63 72 69 70 74 29 3b 0a 20 20 20  p, pScript);.   
11bd0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72   rc = sqlite3_cr
11be0 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 70 44  eate_function(pD
11bf0 62 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20 6e 41  b->db, zName, nA
11c00 72 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  rg, SQLITE_UTF8,
11c10 0a 20 20 20 20 20 20 20 20 70 46 75 6e 63 2c 20  .        pFunc, 
11c20 74 63 6c 53 71 6c 46 75 6e 63 2c 20 30 2c 20 30  tclSqlFunc, 0, 0
11c30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
11c40 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
11c50 20 20 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52    rc = TCL_ERROR
11c60 3b 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74 52  ;.      Tcl_SetR
11c70 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63  esult(interp, (c
11c80 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 65 72  har *)sqlite3_er
11c90 72 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c 20 54  rmsg(pDb->db), T
11ca0 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20  CL_VOLATILE);.  
11cb0 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20    }.    break;. 
11cc0 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20   }..  /*.  **   
11cd0 20 20 24 64 62 20 69 6e 63 72 62 6c 6f 62 20 3f    $db incrblob ?
11ce0 2d 72 65 61 64 6f 6e 6c 79 3f 20 3f 44 42 3f 20  -readonly? ?DB? 
11cf0 54 41 42 4c 45 20 43 4f 4c 55 4d 4e 20 52 4f 57  TABLE COLUMN ROW
11d00 49 44 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  ID.  */.  case D
11d10 42 5f 49 4e 43 52 42 4c 4f 42 3a 20 7b 0a 23 69  B_INCRBLOB: {.#i
11d20 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
11d30 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20 20 54 63  _INCRBLOB.    Tc
11d40 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
11d50 6e 74 65 72 70 2c 20 22 69 6e 63 72 62 6c 6f 62  nterp, "incrblob
11d60 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 69   not available i
11d70 6e 20 74 68 69 73 20 62 75 69 6c 64 22 2c 20 30  n this build", 0
11d80 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
11d90 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 20  L_ERROR;.#else. 
11da0 20 20 20 69 6e 74 20 69 73 52 65 61 64 6f 6e 6c     int isReadonl
11db0 79 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74  y = 0;.    const
11dc0 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 22 6d 61   char *zDb = "ma
11dd0 69 6e 22 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  in";.    const c
11de0 68 61 72 20 2a 7a 54 61 62 6c 65 3b 0a 20 20 20  har *zTable;.   
11df0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f   const char *zCo
11e00 6c 75 6d 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65  lumn;.    sqlite
11e10 5f 69 6e 74 36 34 20 69 52 6f 77 3b 0a 0a 20 20  _int64 iRow;..  
11e20 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 74    /* Check for t
11e30 68 65 20 2d 72 65 61 64 6f 6e 6c 79 20 6f 70 74  he -readonly opt
11e40 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f  ion */.    if( o
11e50 62 6a 63 3e 33 20 26 26 20 73 74 72 63 6d 70 28  bjc>3 && strcmp(
11e60 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
11e70 6a 76 5b 32 5d 29 2c 20 22 2d 72 65 61 64 6f 6e  jv[2]), "-readon
11e80 6c 79 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ly")==0 ){.     
11e90 20 69 73 52 65 61 64 6f 6e 6c 79 20 3d 20 31 3b   isReadonly = 1;
11ea0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
11eb0 6f 62 6a 63 21 3d 28 35 2b 69 73 52 65 61 64 6f  objc!=(5+isReado
11ec0 6e 6c 79 29 20 26 26 20 6f 62 6a 63 21 3d 28 36  nly) && objc!=(6
11ed0 2b 69 73 52 65 61 64 6f 6e 6c 79 29 20 29 7b 0a  +isReadonly) ){.
11ee0 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
11ef0 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
11f00 2c 20 6f 62 6a 76 2c 20 22 3f 2d 72 65 61 64 6f  , objv, "?-reado
11f10 6e 6c 79 3f 20 3f 44 42 3f 20 54 41 42 4c 45 20  nly? ?DB? TABLE 
11f20 43 4f 4c 55 4d 4e 20 52 4f 57 49 44 22 29 3b 0a  COLUMN ROWID");.
11f30 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
11f40 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
11f50 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d 28 36 2b     if( objc==(6+
11f60 69 73 52 65 61 64 6f 6e 6c 79 29 20 29 7b 0a 20  isReadonly) ){. 
11f70 20 20 20 20 20 7a 44 62 20 3d 20 54 63 6c 5f 47       zDb = Tcl_G
11f80 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d  etString(objv[2]
11f90 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 54 61  );.    }.    zTa
11fa0 62 6c 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  ble = Tcl_GetStr
11fb0 69 6e 67 28 6f 62 6a 76 5b 6f 62 6a 63 2d 33 5d  ing(objv[objc-3]
11fc0 29 3b 0a 20 20 20 20 7a 43 6f 6c 75 6d 6e 20 3d  );.    zColumn =
11fd0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
11fe0 62 6a 76 5b 6f 62 6a 63 2d 32 5d 29 3b 0a 20 20  bjv[objc-2]);.  
11ff0 20 20 72 63 20 3d 20 54 63 6c 5f 47 65 74 57 69    rc = Tcl_GetWi
12000 64 65 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  deIntFromObj(int
12010 65 72 70 2c 20 6f 62 6a 76 5b 6f 62 6a 63 2d 31  erp, objv[objc-1
12020 5d 2c 20 26 69 52 6f 77 29 3b 0a 0a 20 20 20 20  ], &iRow);..    
12030 69 66 28 20 72 63 3d 3d 54 43 4c 5f 4f 4b 20 29  if( rc==TCL_OK )
12040 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 63 72 65  {.      rc = cre
12050 61 74 65 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e  ateIncrblobChann
12060 65 6c 28 0a 20 20 20 20 20 20 20 20 20 20 69 6e  el(.          in
12070 74 65 72 70 2c 20 70 44 62 2c 20 7a 44 62 2c 20  terp, pDb, zDb, 
12080 7a 54 61 62 6c 65 2c 20 7a 43 6f 6c 75 6d 6e 2c  zTable, zColumn,
12090 20 69 52 6f 77 2c 20 69 73 52 65 61 64 6f 6e 6c   iRow, isReadonl
120a0 79 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d  y.      );.    }
120b0 0a 23 65 6e 64 69 66 0a 20 20 20 20 62 72 65 61  .#endif.    brea
120c0 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  k;.  }..  /*.  *
120d0 2a 20 20 20 20 20 24 64 62 20 69 6e 74 65 72 72  *     $db interr
120e0 75 70 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e  upt.  **.  ** In
120f0 74 65 72 72 75 70 74 20 74 68 65 20 65 78 65 63  terrupt the exec
12100 75 74 69 6f 6e 20 6f 66 20 74 68 65 20 69 6e 6e  ution of the inn
12110 65 72 2d 6d 6f 73 74 20 53 51 4c 20 69 6e 74 65  er-most SQL inte
12120 72 70 72 65 74 65 72 2e 20 20 54 68 69 73 0a 20  rpreter.  This. 
12130 20 2a 2a 20 63 61 75 73 65 73 20 74 68 65 20 53   ** causes the S
12140 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20  QL statement to 
12150 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20  return an error 
12160 6f 66 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52  of SQLITE_INTERR
12170 55 50 54 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  UPT..  */.  case
12180 20 44 42 5f 49 4e 54 45 52 52 55 50 54 3a 20 7b   DB_INTERRUPT: {
12190 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  .    sqlite3_int
121a0 65 72 72 75 70 74 28 70 44 62 2d 3e 64 62 29 3b  errupt(pDb->db);
121b0 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
121c0 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24  .  /*.  **     $
121d0 64 62 20 6e 75 6c 6c 76 61 6c 75 65 20 3f 53 54  db nullvalue ?ST
121e0 52 49 4e 47 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20  RING?.  **.  ** 
121f0 43 68 61 6e 67 65 20 74 65 78 74 20 75 73 65 64  Change text used
12200 20 77 68 65 6e 20 61 20 4e 55 4c 4c 20 63 6f 6d   when a NULL com
12210 65 73 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65  es back from the
12220 20 64 61 74 61 62 61 73 65 2e 20 49 66 20 3f 53   database. If ?S
12230 54 52 49 4e 47 3f 0a 20 20 2a 2a 20 69 73 20 6e  TRING?.  ** is n
12240 6f 74 20 70 72 65 73 65 6e 74 2c 20 74 68 65 6e  ot present, then
12250 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 74 72   the current str
12260 69 6e 67 20 75 73 65 64 20 66 6f 72 20 4e 55 4c  ing used for NUL
12270 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 20  L is returned.. 
12280 20 2a 2a 20 49 66 20 53 54 52 49 4e 47 20 69 73   ** If STRING is
12290 20 70 72 65 73 65 6e 74 2c 20 74 68 65 6e 20 53   present, then S
122a0 54 52 49 4e 47 20 69 73 20 72 65 74 75 72 6e 65  TRING is returne
122b0 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2f 0a 20 20 63  d..  **.  */.  c
122c0 61 73 65 20 44 42 5f 4e 55 4c 4c 56 41 4c 55 45  ase DB_NULLVALUE
122d0 3a 20 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63  : {.    if( objc
122e0 21 3d 32 20 26 26 20 6f 62 6a 63 21 3d 33 20 29  !=2 && objc!=3 )
122f0 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e  {.      Tcl_Wron
12300 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
12310 20 32 2c 20 6f 62 6a 76 2c 20 22 4e 55 4c 4c 56   2, objv, "NULLV
12320 41 4c 55 45 22 29 3b 0a 20 20 20 20 20 20 72 65  ALUE");.      re
12330 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
12340 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 62      }.    if( ob
12350 6a 63 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20 69  jc==3 ){.      i
12360 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20 63 68  nt len;.      ch
12370 61 72 20 2a 7a 4e 75 6c 6c 20 3d 20 54 63 6c 5f  ar *zNull = Tcl_
12380 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
12390 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b  (objv[2], &len);
123a0 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e  .      if( pDb->
123b0 7a 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20  zNull ){.       
123c0 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a   Tcl_Free(pDb->z
123d0 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Null);.      }. 
123e0 20 20 20 20 20 69 66 28 20 7a 4e 75 6c 6c 20 26       if( zNull &
123f0 26 20 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20  & len>0 ){.     
12400 20 20 20 70 44 62 2d 3e 7a 4e 75 6c 6c 20 3d 20     pDb->zNull = 
12410 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b  Tcl_Alloc( len +
12420 20 31 20 29 3b 0a 20 20 20 20 20 20 20 20 73 74   1 );.        st
12430 72 6e 63 70 79 28 70 44 62 2d 3e 7a 4e 75 6c 6c  rncpy(pDb->zNull
12440 2c 20 7a 4e 75 6c 6c 2c 20 6c 65 6e 29 3b 0a 20  , zNull, len);. 
12450 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e 75 6c         pDb->zNul
12460 6c 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a 20  l[len] = '\0';. 
12470 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
12480 20 20 20 20 70 44 62 2d 3e 7a 4e 75 6c 6c 20 3d      pDb->zNull =
12490 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
124a0 7d 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a  }.    Tcl_SetObj
124b0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 64  Result(interp, d
124c0 62 54 65 78 74 54 6f 4f 62 6a 28 70 44 62 2d 3e  bTextToObj(pDb->
124d0 7a 4e 75 6c 6c 29 29 3b 0a 20 20 20 20 62 72 65  zNull));.    bre
124e0 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  ak;.  }..  /*.  
124f0 2a 2a 20 20 20 20 20 24 64 62 20 6c 61 73 74 5f  **     $db last_
12500 69 6e 73 65 72 74 5f 72 6f 77 69 64 20 0a 20 20  insert_rowid .  
12510 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 61  **.  ** Return a
12520 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20  n integer which 
12530 69 73 20 74 68 65 20 52 4f 57 49 44 20 66 6f 72  is the ROWID for
12540 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
12550 20 69 6e 73 65 72 74 2e 0a 20 20 2a 2f 0a 20 20   insert..  */.  
12560 63 61 73 65 20 44 42 5f 4c 41 53 54 5f 49 4e 53  case DB_LAST_INS
12570 45 52 54 5f 52 4f 57 49 44 3a 20 7b 0a 20 20 20  ERT_ROWID: {.   
12580 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 73 75 6c   Tcl_Obj *pResul
12590 74 3b 0a 20 20 20 20 54 63 6c 5f 57 69 64 65 49  t;.    Tcl_WideI
125a0 6e 74 20 72 6f 77 69 64 3b 0a 20 20 20 20 69 66  nt rowid;.    if
125b0 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20  ( objc!=2 ){.   
125c0 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
125d0 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
125e0 62 6a 76 2c 20 22 22 29 3b 0a 20 20 20 20 20 20  bjv, "");.      
125f0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
12600 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 6f 77 69  ;.    }.    rowi
12610 64 20 3d 20 73 71 6c 69 74 65 33 5f 6c 61 73 74  d = sqlite3_last
12620 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 28 70 44  _insert_rowid(pD
12630 62 2d 3e 64 62 29 3b 0a 20 20 20 20 70 52 65 73  b->db);.    pRes
12640 75 6c 74 20 3d 20 54 63 6c 5f 47 65 74 4f 62 6a  ult = Tcl_GetObj
12650 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a  Result(interp);.
12660 20 20 20 20 54 63 6c 5f 53 65 74 57 69 64 65 49      Tcl_SetWideI
12670 6e 74 4f 62 6a 28 70 52 65 73 75 6c 74 2c 20 72  ntObj(pResult, r
12680 6f 77 69 64 29 3b 0a 20 20 20 20 62 72 65 61 6b  owid);.    break
12690 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ;.  }..  /*.  **
126a0 20 54 68 65 20 44 42 5f 4f 4e 45 43 4f 4c 55 4d   The DB_ONECOLUM
126b0 4e 20 6d 65 74 68 6f 64 20 69 73 20 69 6d 70 6c  N method is impl
126c0 65 6d 65 6e 74 65 64 20 74 6f 67 65 74 68 65 72  emented together
126d0 20 77 69 74 68 20 44 42 5f 45 58 49 53 54 53 2e   with DB_EXISTS.
126e0 0a 20 20 2a 2f 0a 0a 20 20 2f 2a 20 20 20 20 24  .  */..  /*    $
126f0 64 62 20 70 72 6f 67 72 65 73 73 20 3f 4e 20 43  db progress ?N C
12700 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a 20 0a 20  ALLBACK?.  ** . 
12710 20 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 67   ** Invoke the g
12720 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b 20 65 76  iven callback ev
12730 65 72 79 20 4e 20 76 69 72 74 75 61 6c 20 6d 61  ery N virtual ma
12740 63 68 69 6e 65 20 6f 70 63 6f 64 65 73 20 77 68  chine opcodes wh
12750 69 6c 65 20 65 78 65 63 75 74 69 6e 67 0a 20 20  ile executing.  
12760 2a 2a 20 71 75 65 72 69 65 73 2e 0a 20 20 2a 2f  ** queries..  */
12770 0a 20 20 63 61 73 65 20 44 42 5f 50 52 4f 47 52  .  case DB_PROGR
12780 45 53 53 3a 20 7b 0a 20 20 20 20 69 66 28 20 6f  ESS: {.    if( o
12790 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20  bjc==2 ){.      
127a0 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65  if( pDb->zProgre
127b0 73 73 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63  ss ){.        Tc
127c0 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
127d0 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a 50 72 6f  nterp, pDb->zPro
127e0 67 72 65 73 73 2c 20 30 29 3b 0a 20 20 20 20 20  gress, 0);.     
127f0 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28   }.    }else if(
12800 20 6f 62 6a 63 3d 3d 34 20 29 7b 0a 20 20 20 20   objc==4 ){.    
12810 20 20 63 68 61 72 20 2a 7a 50 72 6f 67 72 65 73    char *zProgres
12820 73 3b 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e  s;.      int len
12830 3b 0a 20 20 20 20 20 20 69 6e 74 20 4e 3b 0a 20  ;.      int N;. 
12840 20 20 20 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21       if( TCL_OK!
12850 3d 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f  =Tcl_GetIntFromO
12860 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
12870 32 5d 2c 20 26 4e 29 20 29 7b 0a 20 20 20 20 20  2], &N) ){.     
12880 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
12890 52 4f 52 3b 0a 20 20 20 20 20 20 7d 3b 0a 20 20  ROR;.      };.  
128a0 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 50 72      if( pDb->zPr
128b0 6f 67 72 65 73 73 20 29 7b 0a 20 20 20 20 20 20  ogress ){.      
128c0 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e    Tcl_Free(pDb->
128d0 7a 50 72 6f 67 72 65 73 73 29 3b 0a 20 20 20 20  zProgress);.    
128e0 20 20 7d 0a 20 20 20 20 20 20 7a 50 72 6f 67 72    }.      zProgr
128f0 65 73 73 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  ess = Tcl_GetStr
12900 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
12910 33 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20  3], &len);.     
12920 20 69 66 28 20 7a 50 72 6f 67 72 65 73 73 20 26   if( zProgress &
12930 26 20 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20  & len>0 ){.     
12940 20 20 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73     pDb->zProgres
12950 73 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c  s = Tcl_Alloc( l
12960 65 6e 20 2b 20 31 20 29 3b 0a 20 20 20 20 20 20  en + 1 );.      
12970 20 20 6d 65 6d 63 70 79 28 70 44 62 2d 3e 7a 50    memcpy(pDb->zP
12980 72 6f 67 72 65 73 73 2c 20 7a 50 72 6f 67 72 65  rogress, zProgre
12990 73 73 2c 20 6c 65 6e 2b 31 29 3b 0a 20 20 20 20  ss, len+1);.    
129a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
129b0 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 20   pDb->zProgress 
129c0 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66  = 0;.      }.#if
129d0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
129e0 5f 50 52 4f 47 52 45 53 53 5f 43 41 4c 4c 42 41  _PROGRESS_CALLBA
129f0 43 4b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62  CK.      if( pDb
12a00 2d 3e 7a 50 72 6f 67 72 65 73 73 20 29 7b 0a 20  ->zProgress ){. 
12a10 20 20 20 20 20 20 20 70 44 62 2d 3e 69 6e 74 65         pDb->inte
12a20 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20  rp = interp;.   
12a30 20 20 20 20 20 73 71 6c 69 74 65 33 5f 70 72 6f       sqlite3_pro
12a40 67 72 65 73 73 5f 68 61 6e 64 6c 65 72 28 70 44  gress_handler(pD
12a50 62 2d 3e 64 62 2c 20 4e 2c 20 44 62 50 72 6f 67  b->db, N, DbProg
12a60 72 65 73 73 48 61 6e 64 6c 65 72 2c 20 70 44 62  ressHandler, pDb
12a70 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
12a80 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
12a90 70 72 6f 67 72 65 73 73 5f 68 61 6e 64 6c 65 72  progress_handler
12aa0 28 70 44 62 2d 3e 64 62 2c 20 30 2c 20 30 2c 20  (pDb->db, 0, 0, 
12ab0 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  0);.      }.#end
12ac0 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  if.    }else{.  
12ad0 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
12ae0 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20  Args(interp, 2, 
12af0 6f 62 6a 76 2c 20 22 4e 20 43 41 4c 4c 42 41 43  objv, "N CALLBAC
12b00 4b 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  K");.      retur
12b10 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
12b20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20   }.    break;.  
12b30 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 70  }..  /*    $db p
12b40 72 6f 66 69 6c 65 20 3f 43 41 4c 4c 42 41 43 4b  rofile ?CALLBACK
12b50 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 61 6b 65  ?.  **.  ** Make
12b60 20 61 72 72 61 6e 67 65 6d 65 6e 74 73 20 74 6f   arrangements to
12b70 20 69 6e 76 6f 6b 65 20 74 68 65 20 43 41 4c 4c   invoke the CALL
12b80 42 41 43 4b 20 72 6f 75 74 69 6e 65 20 61 66 74  BACK routine aft
12b90 65 72 20 65 61 63 68 20 53 51 4c 20 73 74 61 74  er each SQL stat
12ba0 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 68 61 74 20  ement.  ** that 
12bb0 68 61 73 20 72 75 6e 2e 20 20 54 68 65 20 74 65  has run.  The te
12bc0 78 74 20 6f 66 20 74 68 65 20 53 51 4c 20 61 6e  xt of the SQL an
12bd0 64 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20  d the amount of 
12be0 65 6c 61 70 73 65 20 74 69 6d 65 20 61 72 65 0a  elapse time are.
12bf0 20 20 2a 2a 20 61 70 70 65 6e 64 65 64 20 74 6f    ** appended to
12c00 20 43 41 4c 4c 42 41 43 4b 20 62 65 66 6f 72 65   CALLBACK before
12c10 20 74 68 65 20 73 63 72 69 70 74 20 69 73 20 72   the script is r
12c20 75 6e 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  un..  */.  case 
12c30 44 42 5f 50 52 4f 46 49 4c 45 3a 20 7b 0a 20 20  DB_PROFILE: {.  
12c40 20 20 69 66 28 20 6f 62 6a 63 3e 33 20 29 7b 0a    if( objc>3 ){.
12c50 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
12c60 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
12c70 2c 20 6f 62 6a 76 2c 20 22 3f 43 41 4c 4c 42 41  , objv, "?CALLBA
12c80 43 4b 3f 22 29 3b 0a 20 20 20 20 20 20 72 65 74  CK?");.      ret
12c90 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
12ca0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a     }else if( obj
12cb0 63 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 69 66  c==2 ){.      if
12cc0 28 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 20  ( pDb->zProfile 
12cd0 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41  ){.        Tcl_A
12ce0 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
12cf0 72 70 2c 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c  rp, pDb->zProfil
12d00 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  e, 0);.      }. 
12d10 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
12d20 63 68 61 72 20 2a 7a 50 72 6f 66 69 6c 65 3b 0a  char *zProfile;.
12d30 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20        int len;. 
12d40 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 50       if( pDb->zP
12d50 72 6f 66 69 6c 65 20 29 7b 0a 20 20 20 20 20 20  rofile ){.      
12d60 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e    Tcl_Free(pDb->
12d70 7a 50 72 6f 66 69 6c 65 29 3b 0a 20 20 20 20 20  zProfile);.     
12d80 20 7d 0a 20 20 20 20 20 20 7a 50 72 6f 66 69 6c   }.      zProfil
12d90 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  e = Tcl_GetStrin
12da0 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d  gFromObj(objv[2]
12db0 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69  , &len);.      i
12dc0 66 28 20 7a 50 72 6f 66 69 6c 65 20 26 26 20 6c  f( zProfile && l
12dd0 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  en>0 ){.        
12de0 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 20 3d 20  pDb->zProfile = 
12df0 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b  Tcl_Alloc( len +
12e00 20 31 20 29 3b 0a 20 20 20 20 20 20 20 20 6d 65   1 );.        me
12e10 6d 63 70 79 28 70 44 62 2d 3e 7a 50 72 6f 66 69  mcpy(pDb->zProfi
12e20 6c 65 2c 20 7a 50 72 6f 66 69 6c 65 2c 20 6c 65  le, zProfile, le
12e30 6e 2b 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  n+1);.      }els
12e40 65 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e  e{.        pDb->
12e50 7a 50 72 6f 66 69 6c 65 20 3d 20 30 3b 0a 20 20  zProfile = 0;.  
12e60 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
12e70 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 0a  LITE_OMIT_TRACE.
12e80 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a        if( pDb->z
12e90 50 72 6f 66 69 6c 65 20 29 7b 0a 20 20 20 20 20  Profile ){.     
12ea0 20 20 20 70 44 62 2d 3e 69 6e 74 65 72 70 20 3d     pDb->interp =
12eb0 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 20 20 20   interp;.       
12ec0 20 73 71 6c 69 74 65 33 5f 70 72 6f 66 69 6c 65   sqlite3_profile
12ed0 28 70 44 62 2d 3e 64 62 2c 20 44 62 50 72 6f 66  (pDb->db, DbProf
12ee0 69 6c 65 48 61 6e 64 6c 65 72 2c 20 70 44 62 29  ileHandler, pDb)
12ef0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
12f00 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 70         sqlite3_p
12f10 72 6f 66 69 6c 65 28 70 44 62 2d 3e 64 62 2c 20  rofile(pDb->db, 
12f20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23  0, 0);.      }.#
12f30 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20  endif.    }.    
12f40 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
12f50 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20 72 65  .  **     $db re
12f60 6b 65 79 20 4b 45 59 0a 20 20 2a 2a 0a 20 20 2a  key KEY.  **.  *
12f70 2a 20 43 68 61 6e 67 65 20 74 68 65 20 65 6e 63  * Change the enc
12f80 72 79 70 74 69 6f 6e 20 6b 65 79 20 6f 6e 20 74  ryption key on t
12f90 68 65 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65  he currently ope
12fa0 6e 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f  n database..  */
12fb0 0a 20 20 63 61 73 65 20 44 42 5f 52 45 4b 45 59  .  case DB_REKEY
12fc0 3a 20 7b 0a 20 20 20 20 69 6e 74 20 6e 4b 65 79  : {.    int nKey
12fd0 3b 0a 20 20 20 20 76 6f 69 64 20 2a 70 4b 65 79  ;.    void *pKey
12fe0 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d  ;.    if( objc!=
12ff0 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57  3 ){.      Tcl_W
13000 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
13010 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 4b 45  rp, 2, objv, "KE
13020 59 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  Y");.      retur
13030 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
13040 20 7d 0a 20 20 20 20 70 4b 65 79 20 3d 20 54 63   }.    pKey = Tc
13050 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79 46 72  l_GetByteArrayFr
13060 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26  omObj(objv[2], &
13070 6e 4b 65 79 29 3b 0a 23 69 66 64 65 66 20 53 51  nKey);.#ifdef SQ
13080 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20  LITE_HAS_CODEC. 
13090 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
130a0 72 65 6b 65 79 28 70 44 62 2d 3e 64 62 2c 20 70  rekey(pDb->db, p
130b0 4b 65 79 2c 20 6e 4b 65 79 29 3b 0a 20 20 20 20  Key, nKey);.    
130c0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
130d0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
130e0 28 69 6e 74 65 72 70 2c 20 73 71 6c 69 74 65 33  (interp, sqlite3
130f0 45 72 72 53 74 72 28 72 63 29 2c 20 30 29 3b 0a  ErrStr(rc), 0);.
13100 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45        rc = TCL_E
13110 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  RROR;.    }.#end
13120 69 66 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  if.    break;.  
13130 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 72  }..  /*    $db r
13140 65 73 74 6f 72 65 20 3f 44 41 54 41 42 41 53 45  estore ?DATABASE
13150 3f 20 46 49 4c 45 4e 41 4d 45 0a 20 20 2a 2a 0a  ? FILENAME.  **.
13160 20 20 2a 2a 20 4f 70 65 6e 20 61 20 64 61 74 61    ** Open a data
13170 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 64 20  base file named 
13180 46 49 4c 45 4e 41 4d 45 2e 20 20 54 72 61 6e 73  FILENAME.  Trans
13190 66 65 72 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  fer the content 
131a0 0a 20 20 2a 2a 20 6f 66 20 46 49 4c 45 4e 41 4d  .  ** of FILENAM
131b0 45 20 69 6e 74 6f 20 74 68 65 20 6c 6f 63 61 6c  E into the local
131c0 20 64 61 74 61 62 61 73 65 20 44 41 54 41 42 41   database DATABA
131d0 53 45 20 28 64 65 66 61 75 6c 74 3a 20 22 6d 61  SE (default: "ma
131e0 69 6e 22 29 2e 0a 20 20 2a 2f 0a 20 20 63 61 73  in")..  */.  cas
131f0 65 20 44 42 5f 52 45 53 54 4f 52 45 3a 20 7b 0a  e DB_RESTORE: {.
13200 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
13210 7a 53 72 63 46 69 6c 65 3b 0a 20 20 20 20 63 6f  zSrcFile;.    co
13220 6e 73 74 20 63 68 61 72 20 2a 7a 44 65 73 74 44  nst char *zDestD
13230 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a  b;.    sqlite3 *
13240 70 53 72 63 3b 0a 20 20 20 20 73 71 6c 69 74 65  pSrc;.    sqlite
13250 33 5f 62 61 63 6b 75 70 20 2a 70 42 61 63 6b 75  3_backup *pBacku
13260 70 3b 0a 20 20 20 20 69 6e 74 20 6e 54 69 6d 65  p;.    int nTime
13270 6f 75 74 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66  out = 0;..    if
13280 28 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20 20 20  ( objc==3 ){.   
13290 20 20 20 7a 44 65 73 74 44 62 20 3d 20 22 6d 61     zDestDb = "ma
132a0 69 6e 22 3b 0a 20 20 20 20 20 20 7a 53 72 63 46  in";.      zSrcF
132b0 69 6c 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  ile = Tcl_GetStr
132c0 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20  ing(objv[2]);.  
132d0 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a 63    }else if( objc
132e0 3d 3d 34 20 29 7b 0a 20 20 20 20 20 20 7a 44 65  ==4 ){.      zDe
132f0 73 74 44 62 20 3d 20 54 63 6c 5f 47 65 74 53 74  stDb = Tcl_GetSt
13300 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20  ring(objv[2]);. 
13310 20 20 20 20 20 7a 53 72 63 46 69 6c 65 20 3d 20       zSrcFile = 
13320 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
13330 6a 76 5b 33 5d 29 3b 0a 20 20 20 20 7d 65 6c 73  jv[3]);.    }els
13340 65 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f  e{.      Tcl_Wro
13350 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
13360 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 44 41 54  , 2, objv, "?DAT
13370 41 42 41 53 45 3f 20 46 49 4c 45 4e 41 4d 45 22  ABASE? FILENAME"
13380 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
13390 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
133a0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
133b0 33 5f 6f 70 65 6e 5f 76 32 28 7a 53 72 63 46 69  3_open_v2(zSrcFi
133c0 6c 65 2c 20 26 70 53 72 63 2c 20 53 51 4c 49 54  le, &pSrc, SQLIT
133d0 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 2c  E_OPEN_READONLY,
133e0 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21   0);.    if( rc!
133f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
13400 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
13410 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 63 61  sult(interp, "ca
13420 6e 6e 6f 74 20 6f 70 65 6e 20 73 6f 75 72 63 65  nnot open source
13430 20 64 61 74 61 62 61 73 65 3a 20 22 2c 0a 20 20   database: ",.  
13440 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
13450 5f 65 72 72 6d 73 67 28 70 53 72 63 29 2c 20 28  _errmsg(pSrc), (
13460 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20  char*)0);.      
13470 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70 53  sqlite3_close(pS
13480 72 63 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  rc);.      retur
13490 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
134a0 20 7d 0a 20 20 20 20 70 42 61 63 6b 75 70 20 3d   }.    pBackup =
134b0 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f   sqlite3_backup_
134c0 69 6e 69 74 28 70 44 62 2d 3e 64 62 2c 20 7a 44  init(pDb->db, zD
134d0 65 73 74 44 62 2c 20 70 53 72 63 2c 20 22 6d 61  estDb, pSrc, "ma
134e0 69 6e 22 29 3b 0a 20 20 20 20 69 66 28 20 70 42  in");.    if( pB
134f0 61 63 6b 75 70 3d 3d 30 20 29 7b 0a 20 20 20 20  ackup==0 ){.    
13500 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
13510 6c 74 28 69 6e 74 65 72 70 2c 20 22 72 65 73 74  lt(interp, "rest
13520 6f 72 65 20 66 61 69 6c 65 64 3a 20 22 2c 0a 20  ore failed: ",. 
13530 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
13540 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62  3_errmsg(pDb->db
13550 29 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  ), (char*)0);.  
13560 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73      sqlite3_clos
13570 65 28 70 53 72 63 29 3b 0a 20 20 20 20 20 20 72  e(pSrc);.      r
13580 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
13590 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c 65  .    }.    while
135a0 28 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  ( (rc = sqlite3_
135b0 62 61 63 6b 75 70 5f 73 74 65 70 28 70 42 61 63  backup_step(pBac
135c0 6b 75 70 2c 31 30 30 29 29 3d 3d 53 51 4c 49 54  kup,100))==SQLIT
135d0 45 5f 4f 4b 0a 20 20 20 20 20 20 20 20 20 20 20  E_OK.           
135e0 20 20 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45     || rc==SQLITE
135f0 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20 69  _BUSY ){.      i
13600 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55  f( rc==SQLITE_BU
13610 53 59 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  SY ){.        if
13620 28 20 6e 54 69 6d 65 6f 75 74 2b 2b 20 3e 3d 20  ( nTimeout++ >= 
13630 33 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  3 ) break;.     
13640 20 20 20 73 71 6c 69 74 65 33 5f 73 6c 65 65 70     sqlite3_sleep
13650 28 31 30 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  (100);.      }. 
13660 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
13670 5f 62 61 63 6b 75 70 5f 66 69 6e 69 73 68 28 70  _backup_finish(p
13680 42 61 63 6b 75 70 29 3b 0a 20 20 20 20 69 66 28  Backup);.    if(
13690 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc==SQLITE_DONE
136a0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 54   ){.      rc = T
136b0 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65  CL_OK;.    }else
136c0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
136d0 42 55 53 59 20 7c 7c 20 72 63 3d 3d 53 51 4c 49  BUSY || rc==SQLI
136e0 54 45 5f 4c 4f 43 4b 45 44 20 29 7b 0a 20 20 20  TE_LOCKED ){.   
136f0 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
13700 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 72 65 73  ult(interp, "res
13710 74 6f 72 65 20 66 61 69 6c 65 64 3a 20 73 6f 75  tore failed: sou
13720 72 63 65 20 64 61 74 61 62 61 73 65 20 62 75 73  rce database bus
13730 79 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  y",.            
13740 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
13750 2a 29 30 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  *)0);.      rc =
13760 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
13770 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 54 63 6c  }else{.      Tcl
13780 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
13790 74 65 72 70 2c 20 22 72 65 73 74 6f 72 65 20 66  terp, "restore f
137a0 61 69 6c 65 64 3a 20 22 2c 0a 20 20 20 20 20 20  ailed: ",.      
137b0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65 72 72       sqlite3_err
137c0 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c 20 28 63  msg(pDb->db), (c
137d0 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 72  har*)0);.      r
137e0 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  c = TCL_ERROR;. 
137f0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
13800 5f 63 6c 6f 73 65 28 70 53 72 63 29 3b 0a 20 20  _close(pSrc);.  
13810 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
13820 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20  /*.  **     $db 
13830 73 74 61 74 75 73 20 28 73 74 65 70 7c 73 6f 72  status (step|sor
13840 74 7c 61 75 74 6f 69 6e 64 65 78 29 0a 20 20 2a  t|autoindex).  *
13850 2a 0a 20 20 2a 2a 20 44 69 73 70 6c 61 79 20 53  *.  ** Display S
13860 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53  QLITE_STMTSTATUS
13870 5f 46 55 4c 4c 53 43 41 4e 5f 53 54 45 50 20 6f  _FULLSCAN_STEP o
13880 72 20 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 53  r .  ** SQLITE_S
13890 54 4d 54 53 54 41 54 55 53 5f 53 4f 52 54 20 66  TMTSTATUS_SORT f
138a0 6f 72 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  or the most rece
138b0 6e 74 20 65 76 61 6c 2e 0a 20 20 2a 2f 0a 20 20  nt eval..  */.  
138c0 63 61 73 65 20 44 42 5f 53 54 41 54 55 53 3a 20  case DB_STATUS: 
138d0 7b 0a 20 20 20 20 69 6e 74 20 76 3b 0a 20 20 20  {.    int v;.   
138e0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70   const char *zOp
138f0 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d  ;.    if( objc!=
13900 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57  3 ){.      Tcl_W
13910 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
13920 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 28 73  rp, 2, objv, "(s
13930 74 65 70 7c 73 6f 72 74 7c 61 75 74 6f 69 6e 64  tep|sort|autoind
13940 65 78 29 22 29 3b 0a 20 20 20 20 20 20 72 65 74  ex)");.      ret
13950 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
13960 20 20 20 7d 0a 20 20 20 20 7a 4f 70 20 3d 20 54     }.    zOp = T
13970 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
13980 76 5b 32 5d 29 3b 0a 20 20 20 20 69 66 28 20 73  v[2]);.    if( s
13990 74 72 63 6d 70 28 7a 4f 70 2c 20 22 73 74 65 70  trcmp(zOp, "step
139a0 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 76  ")==0 ){.      v
139b0 20 3d 20 70 44 62 2d 3e 6e 53 74 65 70 3b 0a 20   = pDb->nStep;. 
139c0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
139d0 63 6d 70 28 7a 4f 70 2c 20 22 73 6f 72 74 22 29  cmp(zOp, "sort")
139e0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 76 20 3d  ==0 ){.      v =
139f0 20 70 44 62 2d 3e 6e 53 6f 72 74 3b 0a 20 20 20   pDb->nSort;.   
13a00 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
13a10 70 28 7a 4f 70 2c 20 22 61 75 74 6f 69 6e 64 65  p(zOp, "autoinde
13a20 78 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  x")==0 ){.      
13a30 76 20 3d 20 70 44 62 2d 3e 6e 49 6e 64 65 78 3b  v = pDb->nIndex;
13a40 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
13a50 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
13a60 6c 74 28 69 6e 74 65 72 70 2c 20 0a 20 20 20 20  lt(interp, .    
13a70 20 20 20 20 20 20 20 20 22 62 61 64 20 61 72 67          "bad arg
13a80 75 6d 65 6e 74 3a 20 73 68 6f 75 6c 64 20 62 65  ument: should be
13a90 20 61 75 74 6f 69 6e 64 65 78 2c 20 73 74 65 70   autoindex, step
13aa0 2c 20 6f 72 20 73 6f 72 74 22 2c 20 0a 20 20 20  , or sort", .   
13ab0 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29           (char*)
13ac0 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  0);.      return
13ad0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
13ae0 7d 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a  }.    Tcl_SetObj
13af0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
13b00 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 76 29 29  cl_NewIntObj(v))
13b10 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  ;.    break;.  }
13b20 0a 20 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20  .  .  /*.  **   
13b30 20 20 24 64 62 20 74 69 6d 65 6f 75 74 20 4d 49    $db timeout MI
13b40 4c 4c 45 53 45 43 4f 4e 44 53 0a 20 20 2a 2a 0a  LLESECONDS.  **.
13b50 20 20 2a 2a 20 44 65 6c 61 79 20 66 6f 72 20 74    ** Delay for t
13b60 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c  he number of mil
13b70 6c 69 73 65 63 6f 6e 64 73 20 73 70 65 63 69 66  liseconds specif
13b80 69 65 64 20 77 68 65 6e 20 61 20 66 69 6c 65 20  ied when a file 
13b90 69 73 20 6c 6f 63 6b 65 64 2e 0a 20 20 2a 2f 0a  is locked..  */.
13ba0 20 20 63 61 73 65 20 44 42 5f 54 49 4d 45 4f 55    case DB_TIMEOU
13bb0 54 3a 20 7b 0a 20 20 20 20 69 6e 74 20 6d 73 3b  T: {.    int ms;
13bc0 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 33  .    if( objc!=3
13bd0 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72   ){.      Tcl_Wr
13be0 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
13bf0 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 4d 49 4c  p, 2, objv, "MIL
13c00 4c 49 53 45 43 4f 4e 44 53 22 29 3b 0a 20 20 20  LISECONDS");.   
13c10 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
13c20 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ROR;.    }.    i
13c30 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  f( Tcl_GetIntFro
13c40 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
13c50 76 5b 32 5d 2c 20 26 6d 73 29 20 29 20 72 65 74  v[2], &ms) ) ret
13c60 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
13c70 20 20 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f     sqlite3_busy_
13c80 74 69 6d 65 6f 75 74 28 70 44 62 2d 3e 64 62 2c  timeout(pDb->db,
13c90 20 6d 73 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b   ms);.    break;
13ca0 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 0a 20 20 2a  .  }.  .  /*.  *
13cb0 2a 20 20 20 20 20 24 64 62 20 74 6f 74 61 6c 5f  *     $db total_
13cc0 63 68 61 6e 67 65 73 0a 20 20 2a 2a 0a 20 20 2a  changes.  **.  *
13cd0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
13ce0 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74  ber of rows that
13cf0 20 77 65 72 65 20 6d 6f 64 69 66 69 65 64 2c 20   were modified, 
13d00 69 6e 73 65 72 74 65 64 2c 20 6f 72 20 64 65 6c  inserted, or del
13d10 65 74 65 64 20 0a 20 20 2a 2a 20 73 69 6e 63 65  eted .  ** since
13d20 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
13d30 6e 64 6c 65 20 77 61 73 20 63 72 65 61 74 65 64  ndle was created
13d40 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  ..  */.  case DB
13d50 5f 54 4f 54 41 4c 5f 43 48 41 4e 47 45 53 3a 20  _TOTAL_CHANGES: 
13d60 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  {.    Tcl_Obj *p
13d70 52 65 73 75 6c 74 3b 0a 20 20 20 20 69 66 28 20  Result;.    if( 
13d80 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 20  objc!=2 ){.     
13d90 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
13da0 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a  s(interp, 2, obj
13db0 76 2c 20 22 22 29 3b 0a 20 20 20 20 20 20 72 65  v, "");.      re
13dc0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
13dd0 20 20 20 20 7d 0a 20 20 20 20 70 52 65 73 75 6c      }.    pResul
13de0 74 20 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65  t = Tcl_GetObjRe
13df0 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  sult(interp);.  
13e00 20 20 54 63 6c 5f 53 65 74 49 6e 74 4f 62 6a 28    Tcl_SetIntObj(
13e10 70 52 65 73 75 6c 74 2c 20 73 71 6c 69 74 65 33  pResult, sqlite3
13e20 5f 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73 28 70  _total_changes(p
13e30 44 62 2d 3e 64 62 29 29 3b 0a 20 20 20 20 62 72  Db->db));.    br
13e40 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20  eak;.  }..  /*  
13e50 20 20 24 64 62 20 74 72 61 63 65 20 3f 43 41 4c    $db trace ?CAL
13e60 4c 42 41 43 4b 3f 0a 20 20 2a 2a 0a 20 20 2a 2a  LBACK?.  **.  **
13e70 20 4d 61 6b 65 20 61 72 72 61 6e 67 65 6d 65 6e   Make arrangemen
13e80 74 73 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65  ts to invoke the
13e90 20 43 41 4c 4c 42 41 43 4b 20 72 6f 75 74 69 6e   CALLBACK routin
13ea0 65 20 66 6f 72 20 65 61 63 68 20 53 51 4c 20 73  e for each SQL s
13eb0 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 68  tatement.  ** th
13ec0 61 74 20 69 73 20 65 78 65 63 75 74 65 64 2e 20  at is executed. 
13ed0 20 54 68 65 20 74 65 78 74 20 6f 66 20 74 68 65   The text of the
13ee0 20 53 51 4c 20 69 73 20 61 70 70 65 6e 64 65 64   SQL is appended
13ef0 20 74 6f 20 43 41 4c 4c 42 41 43 4b 20 62 65 66   to CALLBACK bef
13f00 6f 72 65 0a 20 20 2a 2a 20 69 74 20 69 73 20 65  ore.  ** it is e
13f10 78 65 63 75 74 65 64 2e 0a 20 20 2a 2f 0a 20 20  xecuted..  */.  
13f20 63 61 73 65 20 44 42 5f 54 52 41 43 45 3a 20 7b  case DB_TRACE: {
13f30 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 33 20  .    if( objc>3 
13f40 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f  ){.      Tcl_Wro
13f50 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
13f60 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 43 41 4c  , 2, objv, "?CAL
13f70 4c 42 41 43 4b 3f 22 29 3b 0a 20 20 20 20 20 20  LBACK?");.      
13f80 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
13f90 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
13fa0 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20 20  objc==2 ){.     
13fb0 20 69 66 28 20 70 44 62 2d 3e 7a 54 72 61 63 65   if( pDb->zTrace
13fc0 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f   ){.        Tcl_
13fd0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
13fe0 65 72 70 2c 20 70 44 62 2d 3e 7a 54 72 61 63 65  erp, pDb->zTrace
13ff0 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
14000 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63    }else{.      c
14010 68 61 72 20 2a 7a 54 72 61 63 65 3b 0a 20 20 20  har *zTrace;.   
14020 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20     int len;.    
14030 20 20 69 66 28 20 70 44 62 2d 3e 7a 54 72 61 63    if( pDb->zTrac
14040 65 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c  e ){.        Tcl
14050 5f 46 72 65 65 28 70 44 62 2d 3e 7a 54 72 61 63  _Free(pDb->zTrac
14060 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
14070 20 20 7a 54 72 61 63 65 20 3d 20 54 63 6c 5f 47    zTrace = Tcl_G
14080 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
14090 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a  objv[2], &len);.
140a0 20 20 20 20 20 20 69 66 28 20 7a 54 72 61 63 65        if( zTrace
140b0 20 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20 20 20   && len>0 ){.   
140c0 20 20 20 20 20 70 44 62 2d 3e 7a 54 72 61 63 65       pDb->zTrace
140d0 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65   = Tcl_Alloc( le
140e0 6e 20 2b 20 31 20 29 3b 0a 20 20 20 20 20 20 20  n + 1 );.       
140f0 20 6d 65 6d 63 70 79 28 70 44 62 2d 3e 7a 54 72   memcpy(pDb->zTr
14100 61 63 65 2c 20 7a 54 72 61 63 65 2c 20 6c 65 6e  ace, zTrace, len
14110 2b 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  +1);.      }else
14120 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a  {.        pDb->z
14130 54 72 61 63 65 20 3d 20 30 3b 0a 20 20 20 20 20  Trace = 0;.     
14140 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
14150 45 5f 4f 4d 49 54 5f 54 52 41 43 45 0a 20 20 20  E_OMIT_TRACE.   
14160 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 54 72 61     if( pDb->zTra
14170 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44  ce ){.        pD
14180 62 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65  b->interp = inte
14190 72 70 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  rp;.        sqli
141a0 74 65 33 5f 74 72 61 63 65 28 70 44 62 2d 3e 64  te3_trace(pDb->d
141b0 62 2c 20 44 62 54 72 61 63 65 48 61 6e 64 6c 65  b, DbTraceHandle
141c0 72 2c 20 70 44 62 29 3b 0a 20 20 20 20 20 20 7d  r, pDb);.      }
141d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
141e0 6c 69 74 65 33 5f 74 72 61 63 65 28 70 44 62 2d  lite3_trace(pDb-
141f0 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  >db, 0, 0);.    
14200 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d    }.#endif.    }
14210 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
14220 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 74 72 61  .  /*    $db tra
14230 6e 73 61 63 74 69 6f 6e 20 5b 2d 64 65 66 65 72  nsaction [-defer
14240 72 65 64 7c 2d 69 6d 6d 65 64 69 61 74 65 7c 2d  red|-immediate|-
14250 65 78 63 6c 75 73 69 76 65 5d 20 53 43 52 49 50  exclusive] SCRIP
14260 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 74 61 72  T.  **.  ** Star
14270 74 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74  t a new transact
14280 69 6f 6e 20 28 69 66 20 77 65 20 61 72 65 20 6e  ion (if we are n
14290 6f 74 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68  ot already in th
142a0 65 20 6d 69 64 73 74 20 6f 66 20 61 0a 20 20 2a  e midst of a.  *
142b0 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 20 61  * transaction) a
142c0 6e 64 20 65 78 65 63 75 74 65 20 74 68 65 20 54  nd execute the T
142d0 43 4c 20 73 63 72 69 70 74 20 53 43 52 49 50 54  CL script SCRIPT
142e0 2e 20 20 41 66 74 65 72 20 53 43 52 49 50 54 0a  .  After SCRIPT.
142f0 20 20 2a 2a 20 63 6f 6d 70 6c 65 74 65 73 2c 20    ** completes, 
14300 65 69 74 68 65 72 20 63 6f 6d 6d 69 74 20 74 68  either commit th
14310 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 72  e transaction or
14320 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 20 69 66   roll it back if
14330 20 53 43 52 49 50 54 0a 20 20 2a 2a 20 74 68 72   SCRIPT.  ** thr
14340 6f 77 73 20 61 6e 20 65 78 63 65 70 74 69 6f 6e  ows an exception
14350 2e 20 20 4f 72 20 69 66 20 6e 6f 20 6e 65 77 20  .  Or if no new 
14360 74 72 61 6e 73 61 74 69 6f 6e 20 77 61 73 20 73  transation was s
14370 74 61 72 74 65 64 2c 20 64 6f 20 6e 6f 74 68 69  tarted, do nothi
14380 6e 67 2e 0a 20 20 2a 2a 20 70 61 73 73 20 74 68  ng..  ** pass th
14390 65 20 65 78 63 65 70 74 69 6f 6e 20 6f 6e 20 75  e exception on u
143a0 70 20 74 68 65 20 73 74 61 63 6b 2e 0a 20 20 2a  p the stack..  *
143b0 2a 0a 20 20 2a 2a 20 54 68 69 73 20 63 6f 6d 6d  *.  ** This comm
143c0 61 6e 64 20 77 61 73 20 69 6e 73 70 69 72 65 64  and was inspired
143d0 20 62 79 20 44 61 76 65 20 54 68 6f 6d 61 73 27   by Dave Thomas'
143e0 73 20 74 61 6c 6b 20 6f 6e 20 52 75 62 79 20 61  s talk on Ruby a
143f0 74 20 74 68 65 0a 20 20 2a 2a 20 32 30 30 35 20  t the.  ** 2005 
14400 4f 27 52 65 69 6c 6c 79 20 4f 70 65 6e 20 53 6f  O'Reilly Open So
14410 75 72 63 65 20 43 6f 6e 76 65 6e 74 69 6f 6e 20  urce Convention 
14420 28 4f 53 43 4f 4e 29 2e 0a 20 20 2a 2f 0a 20 20  (OSCON)..  */.  
14430 63 61 73 65 20 44 42 5f 54 52 41 4e 53 41 43 54  case DB_TRANSACT
14440 49 4f 4e 3a 20 7b 0a 20 20 20 20 54 63 6c 5f 4f  ION: {.    Tcl_O
14450 62 6a 20 2a 70 53 63 72 69 70 74 3b 0a 20 20 20  bj *pScript;.   
14460 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 42 65   const char *zBe
14470 67 69 6e 20 3d 20 22 53 41 56 45 50 4f 49 4e 54  gin = "SAVEPOINT
14480 20 5f 74 63 6c 5f 74 72 61 6e 73 61 63 74 69 6f   _tcl_transactio
14490 6e 22 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63  n";.    if( objc
144a0 21 3d 33 20 26 26 20 6f 62 6a 63 21 3d 34 20 29  !=3 && objc!=4 )
144b0 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e  {.      Tcl_Wron
144c0 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
144d0 20 32 2c 20 6f 62 6a 76 2c 20 22 5b 54 59 50 45   2, objv, "[TYPE
144e0 5d 20 53 43 52 49 50 54 22 29 3b 0a 20 20 20 20  ] SCRIPT");.    
144f0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
14500 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  OR;.    }..    i
14510 66 28 20 70 44 62 2d 3e 6e 54 72 61 6e 73 61 63  f( pDb->nTransac
14520 74 69 6f 6e 3d 3d 30 20 26 26 20 6f 62 6a 63 3d  tion==0 && objc=
14530 3d 34 20 29 7b 0a 20 20 20 20 20 20 73 74 61 74  =4 ){.      stat
14540 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 54  ic const char *T
14550 54 59 50 45 5f 73 74 72 73 5b 5d 20 3d 20 7b 0a  TYPE_strs[] = {.
14560 20 20 20 20 20 20 20 20 22 64 65 66 65 72 72 65          "deferre
14570 64 22 2c 20 20 20 22 65 78 63 6c 75 73 69 76 65  d",   "exclusive
14580 22 2c 20 20 22 69 6d 6d 65 64 69 61 74 65 22 2c  ",  "immediate",
14590 20 30 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20   0.      };.    
145a0 20 20 65 6e 75 6d 20 54 54 59 50 45 5f 65 6e 75    enum TTYPE_enu
145b0 6d 20 7b 0a 20 20 20 20 20 20 20 20 54 54 59 50  m {.        TTYP
145c0 45 5f 44 45 46 45 52 52 45 44 2c 20 54 54 59 50  E_DEFERRED, TTYP
145d0 45 5f 45 58 43 4c 55 53 49 56 45 2c 20 54 54 59  E_EXCLUSIVE, TTY
145e0 50 45 5f 49 4d 4d 45 44 49 41 54 45 0a 20 20 20  PE_IMMEDIATE.   
145f0 20 20 20 7d 3b 0a 20 20 20 20 20 20 69 6e 74 20     };.      int 
14600 74 74 79 70 65 3b 0a 20 20 20 20 20 20 69 66 28  ttype;.      if(
14610 20 54 63 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f   Tcl_GetIndexFro
14620 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
14630 76 5b 32 5d 2c 20 54 54 59 50 45 5f 73 74 72 73  v[2], TTYPE_strs
14640 2c 20 22 74 72 61 6e 73 61 63 74 69 6f 6e 20 74  , "transaction t
14650 79 70 65 22 2c 0a 20 20 20 20 20 20 20 20 20 20  ype",.          
14660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14670 20 20 20 20 30 2c 20 26 74 74 79 70 65 29 20 29      0, &ttype) )
14680 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
14690 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
146a0 20 20 7d 0a 20 20 20 20 20 20 73 77 69 74 63 68    }.      switch
146b0 28 20 28 65 6e 75 6d 20 54 54 59 50 45 5f 65 6e  ( (enum TTYPE_en
146c0 75 6d 29 74 74 79 70 65 20 29 7b 0a 20 20 20 20  um)ttype ){.    
146d0 20 20 20 20 63 61 73 65 20 54 54 59 50 45 5f 44      case TTYPE_D
146e0 45 46 45 52 52 45 44 3a 20 20 20 20 2f 2a 20 6e  EFERRED:    /* n
146f0 6f 2d 6f 70 20 2a 2f 3b 20 20 20 20 20 20 20 20  o-op */;        
14700 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
14710 20 20 20 20 20 20 20 20 63 61 73 65 20 54 54 59          case TTY
14720 50 45 5f 45 58 43 4c 55 53 49 56 45 3a 20 20 20  PE_EXCLUSIVE:   
14730 7a 42 65 67 69 6e 20 3d 20 22 42 45 47 49 4e 20  zBegin = "BEGIN 
14740 45 58 43 4c 55 53 49 56 45 22 3b 20 20 62 72 65  EXCLUSIVE";  bre
14750 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65  ak;.        case
14760 20 54 54 59 50 45 5f 49 4d 4d 45 44 49 41 54 45   TTYPE_IMMEDIATE
14770 3a 20 20 20 7a 42 65 67 69 6e 20 3d 20 22 42 45  :   zBegin = "BE
14780 47 49 4e 20 49 4d 4d 45 44 49 41 54 45 22 3b 20  GIN IMMEDIATE"; 
14790 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
147a0 20 20 20 20 7d 0a 20 20 20 20 70 53 63 72 69 70      }.    pScrip
147b0 74 20 3d 20 6f 62 6a 76 5b 6f 62 6a 63 2d 31 5d  t = objv[objc-1]
147c0 3b 0a 0a 20 20 20 20 2f 2a 20 52 75 6e 20 74 68  ;..    /* Run th
147d0 65 20 53 51 4c 69 74 65 20 42 45 47 49 4e 20 63  e SQLite BEGIN c
147e0 6f 6d 6d 61 6e 64 20 74 6f 20 6f 70 65 6e 20 61  ommand to open a
147f0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 72 20   transaction or 
14800 73 61 76 65 70 6f 69 6e 74 2e 20 2a 2f 0a 20 20  savepoint. */.  
14810 20 20 70 44 62 2d 3e 64 69 73 61 62 6c 65 41 75    pDb->disableAu
14820 74 68 2b 2b 3b 0a 20 20 20 20 72 63 20 3d 20 73  th++;.    rc = s
14830 71 6c 69 74 65 33 5f 65 78 65 63 28 70 44 62 2d  qlite3_exec(pDb-
14840 3e 64 62 2c 20 7a 42 65 67 69 6e 2c 20 30 2c 20  >db, zBegin, 0, 
14850 30 2c 20 30 29 3b 0a 20 20 20 20 70 44 62 2d 3e  0, 0);.    pDb->
14860 64 69 73 61 62 6c 65 41 75 74 68 2d 2d 3b 0a 20  disableAuth--;. 
14870 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
14880 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 54 63  E_OK ){.      Tc
14890 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
148a0 6e 74 65 72 70 2c 20 73 71 6c 69 74 65 33 5f 65  nterp, sqlite3_e
148b0 72 72 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c 20  rrmsg(pDb->db), 
148c0 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  0);.      return
148d0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
148e0 7d 0a 20 20 20 20 70 44 62 2d 3e 6e 54 72 61 6e  }.    pDb->nTran
148f0 73 61 63 74 69 6f 6e 2b 2b 3b 0a 0a 20 20 20 20  saction++;..    
14900 2f 2a 20 49 66 20 75 73 69 6e 67 20 4e 52 45 2c  /* If using NRE,
14910 20 73 63 68 65 64 75 6c 65 20 61 20 63 61 6c 6c   schedule a call
14920 62 61 63 6b 20 74 6f 20 69 6e 76 6f 6b 65 20 74  back to invoke t
14930 68 65 20 73 63 72 69 70 74 20 70 53 63 72 69 70  he script pScrip
14940 74 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 61  t, then.    ** a
14950 20 73 65 63 6f 6e 64 20 63 61 6c 6c 62 61 63 6b   second callback
14960 20 74 6f 20 63 6f 6d 6d 69 74 20 28 6f 72 20 72   to commit (or r
14970 6f 6c 6c 62 61 63 6b 29 20 74 68 65 20 74 72 61  ollback) the tra
14980 6e 73 61 63 74 69 6f 6e 20 6f 72 20 73 61 76 65  nsaction or save
14990 70 6f 69 6e 74 0a 20 20 20 20 2a 2a 20 6f 70 65  point.    ** ope
149a0 6e 65 64 20 61 62 6f 76 65 2e 20 49 66 20 6e 6f  ned above. If no
149b0 74 20 75 73 69 6e 67 20 4e 52 45 2c 20 65 76 61  t using NRE, eva
149c0 6c 75 61 74 65 20 74 68 65 20 73 63 72 69 70 74  luate the script
149d0 20 64 69 72 65 63 74 6c 79 2c 20 74 68 65 6e 0a   directly, then.
149e0 20 20 20 20 2a 2a 20 63 61 6c 6c 20 66 75 6e 63      ** call func
149f0 74 69 6f 6e 20 44 62 54 72 61 6e 73 50 6f 73 74  tion DbTransPost
14a00 43 6d 64 28 29 20 74 6f 20 63 6f 6d 6d 69 74 20  Cmd() to commit 
14a10 28 6f 72 20 72 6f 6c 6c 62 61 63 6b 29 20 74 68  (or rollback) th
14a20 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20  e transaction . 
14a30 20 20 20 2a 2a 20 6f 72 20 73 61 76 65 70 6f 69     ** or savepoi
14a40 6e 74 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  nt.  */.    if( 
14a50 44 62 55 73 65 4e 72 65 28 29 20 29 7b 0a 20 20  DbUseNre() ){.  
14a60 20 20 20 20 54 63 6c 5f 4e 52 41 64 64 43 61 6c      Tcl_NRAddCal
14a70 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 44 62  lback(interp, Db
14a80 54 72 61 6e 73 50 6f 73 74 43 6d 64 2c 20 63 64  TransPostCmd, cd
14a90 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
14aa0 20 20 54 63 6c 5f 4e 52 45 76 61 6c 4f 62 6a 28    Tcl_NREvalObj(
14ab0 69 6e 74 65 72 70 2c 20 70 53 63 72 69 70 74 2c  interp, pScript,
14ac0 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   0);.    }else{.
14ad0 20 20 20 20 20 20 72 63 20 3d 20 44 62 54 72 61        rc = DbTra
14ae0 6e 73 50 6f 73 74 43 6d 64 28 26 63 64 2c 20 69  nsPostCmd(&cd, i
14af0 6e 74 65 72 70 2c 20 54 63 6c 5f 45 76 61 6c 4f  nterp, Tcl_EvalO
14b00 62 6a 45 78 28 69 6e 74 65 72 70 2c 20 70 53 63  bjEx(interp, pSc
14b10 72 69 70 74 2c 20 30 29 29 3b 0a 20 20 20 20 7d  ript, 0));.    }
14b20 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
14b30 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 24 64  .  /*.  **    $d
14b40 62 20 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79 20  b unlock_notify 
14b50 3f 73 63 72 69 70 74 3f 0a 20 20 2a 2f 0a 20 20  ?script?.  */.  
14b60 63 61 73 65 20 44 42 5f 55 4e 4c 4f 43 4b 5f 4e  case DB_UNLOCK_N
14b70 4f 54 49 46 59 3a 20 7b 0a 23 69 66 6e 64 65 66  OTIFY: {.#ifndef
14b80 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 55   SQLITE_ENABLE_U
14b90 4e 4c 4f 43 4b 5f 4e 4f 54 49 46 59 0a 20 20 20  NLOCK_NOTIFY.   
14ba0 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
14bb0 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 6c 6f 63  t(interp, "unloc
14bc0 6b 5f 6e 6f 74 69 66 79 20 6e 6f 74 20 61 76 61  k_notify not ava
14bd0 69 6c 61 62 6c 65 20 69 6e 20 74 68 69 73 20 62  ilable in this b
14be0 75 69 6c 64 22 2c 20 30 29 3b 0a 20 20 20 20 72  uild", 0);.    r
14bf0 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23  c = TCL_ERROR;.#
14c00 65 6c 73 65 0a 20 20 20 20 69 66 28 20 6f 62 6a  else.    if( obj
14c10 63 21 3d 32 20 26 26 20 6f 62 6a 63 21 3d 33 20  c!=2 && objc!=3 
14c20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f  ){.      Tcl_Wro
14c30 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
14c40 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 53 43 52  , 2, objv, "?SCR
14c50 49 50 54 3f 22 29 3b 0a 20 20 20 20 20 20 72 63  IPT?");.      rc
14c60 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20   = TCL_ERROR;.  
14c70 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 76    }else{.      v
14c80 6f 69 64 20 28 2a 78 4e 6f 74 69 66 79 29 28 76  oid (*xNotify)(v
14c90 6f 69 64 20 2a 2a 2c 20 69 6e 74 29 20 3d 20 30  oid **, int) = 0
14ca0 3b 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70 4e  ;.      void *pN
14cb0 6f 74 69 66 79 41 72 67 20 3d 20 30 3b 0a 0a 20  otifyArg = 0;.. 
14cc0 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 55       if( pDb->pU
14cd0 6e 6c 6f 63 6b 4e 6f 74 69 66 79 20 29 7b 0a 20  nlockNotify ){. 
14ce0 20 20 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52         Tcl_DecrR
14cf0 65 66 43 6f 75 6e 74 28 70 44 62 2d 3e 70 55 6e  efCount(pDb->pUn
14d00 6c 6f 63 6b 4e 6f 74 69 66 79 29 3b 0a 20 20 20  lockNotify);.   
14d10 20 20 20 20 20 70 44 62 2d 3e 70 55 6e 6c 6f 63       pDb->pUnloc
14d20 6b 4e 6f 74 69 66 79 20 3d 20 30 3b 0a 20 20 20  kNotify = 0;.   
14d30 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 69 66     }.  .      if
14d40 28 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20 20 20  ( objc==3 ){.   
14d50 20 20 20 20 20 78 4e 6f 74 69 66 79 20 3d 20 44       xNotify = D
14d60 62 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 3b 0a 20  bUnlockNotify;. 
14d70 20 20 20 20 20 20 20 70 4e 6f 74 69 66 79 41 72         pNotifyAr
14d80 67 20 3d 20 28 76 6f 69 64 20 2a 29 70 44 62 3b  g = (void *)pDb;
14d90 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 70 55  .        pDb->pU
14da0 6e 6c 6f 63 6b 4e 6f 74 69 66 79 20 3d 20 6f 62  nlockNotify = ob
14db0 6a 76 5b 32 5d 3b 0a 20 20 20 20 20 20 20 20 54  jv[2];.        T
14dc0 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
14dd0 70 44 62 2d 3e 70 55 6e 6c 6f 63 6b 4e 6f 74 69  pDb->pUnlockNoti
14de0 66 79 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 0a  fy);.      }.  .
14df0 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
14e00 33 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79 28  3_unlock_notify(
14e10 70 44 62 2d 3e 64 62 2c 20 78 4e 6f 74 69 66 79  pDb->db, xNotify
14e20 2c 20 70 4e 6f 74 69 66 79 41 72 67 29 20 29 7b  , pNotifyArg) ){
14e30 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70  .        Tcl_App
14e40 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
14e50 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  , sqlite3_errmsg
14e60 28 70 44 62 2d 3e 64 62 29 2c 20 30 29 3b 0a 20  (pDb->db), 0);. 
14e70 20 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f         rc = TCL_
14e80 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20  ERROR;.      }. 
14e90 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
14ea0 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
14eb0 0a 20 20 2a 2a 20 20 20 20 24 64 62 20 77 61 6c  .  **    $db wal
14ec0 5f 68 6f 6f 6b 20 3f 73 63 72 69 70 74 3f 0a 20  _hook ?script?. 
14ed0 20 2a 2a 20 20 20 20 24 64 62 20 75 70 64 61 74   **    $db updat
14ee0 65 5f 68 6f 6f 6b 20 3f 73 63 72 69 70 74 3f 0a  e_hook ?script?.
14ef0 20 20 2a 2a 20 20 20 20 24 64 62 20 72 6f 6c 6c    **    $db roll
14f00 62 61 63 6b 5f 68 6f 6f 6b 20 3f 73 63 72 69 70  back_hook ?scrip
14f10 74 3f 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  t?.  */.  case D
14f20 42 5f 57 41 4c 5f 48 4f 4f 4b 3a 20 0a 20 20 63  B_WAL_HOOK: .  c
14f30 61 73 65 20 44 42 5f 55 50 44 41 54 45 5f 48 4f  ase DB_UPDATE_HO
14f40 4f 4b 3a 20 0a 20 20 63 61 73 65 20 44 42 5f 52  OK: .  case DB_R
14f50 4f 4c 4c 42 41 43 4b 5f 48 4f 4f 4b 3a 20 7b 0a  OLLBACK_HOOK: {.
14f60 0a 20 20 20 20 2f 2a 20 73 65 74 20 70 70 48 6f  .    /* set ppHo
14f70 6f 6b 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 70  ok to point at p
14f80 55 70 64 61 74 65 48 6f 6f 6b 20 6f 72 20 70 52  UpdateHook or pR
14f90 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 2c 20 64 65 70  ollbackHook, dep
14fa0 65 6e 64 69 6e 67 20 6f 6e 20 0a 20 20 20 20 2a  ending on .    *
14fb0 2a 20 77 68 65 74 68 65 72 20 5b 24 64 62 20 75  * whether [$db u
14fc0 70 64 61 74 65 5f 68 6f 6f 6b 5d 20 6f 72 20 5b  pdate_hook] or [
14fd0 24 64 62 20 72 6f 6c 6c 62 61 63 6b 5f 68 6f 6f  $db rollback_hoo
14fe0 6b 5d 20 77 61 73 20 69 6e 76 6f 6b 65 64 2e 0a  k] was invoked..
14ff0 20 20 20 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f      */.    Tcl_O
15000 62 6a 20 2a 2a 70 70 48 6f 6f 6b 3b 20 0a 20 20  bj **ppHook; .  
15010 20 20 69 66 28 20 63 68 6f 69 63 65 3d 3d 44 42    if( choice==DB
15020 5f 55 50 44 41 54 45 5f 48 4f 4f 4b 20 29 7b 0a  _UPDATE_HOOK ){.
15030 20 20 20 20 20 20 70 70 48 6f 6f 6b 20 3d 20 26        ppHook = &
15040 70 44 62 2d 3e 70 55 70 64 61 74 65 48 6f 6f 6b  pDb->pUpdateHook
15050 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
15060 63 68 6f 69 63 65 3d 3d 44 42 5f 57 41 4c 5f 48  choice==DB_WAL_H
15070 4f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 70 48  OOK ){.      ppH
15080 6f 6f 6b 20 3d 20 26 70 44 62 2d 3e 70 57 61 6c  ook = &pDb->pWal
15090 48 6f 6f 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Hook;.    }else{
150a0 0a 20 20 20 20 20 20 70 70 48 6f 6f 6b 20 3d 20  .      ppHook = 
150b0 26 70 44 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 48  &pDb->pRollbackH
150c0 6f 6f 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ook;.    }..    
150d0 69 66 28 20 6f 62 6a 63 21 3d 32 20 26 26 20 6f  if( objc!=2 && o
150e0 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20  bjc!=3 ){.      
150f0 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
15100 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a  s(interp, 2, obj
15110 76 2c 20 22 3f 53 43 52 49 50 54 3f 22 29 3b 0a  v, "?SCRIPT?");.
15120 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43         return TC
15130 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
15140 20 20 20 69 66 28 20 2a 70 70 48 6f 6f 6b 20 29     if( *ppHook )
15150 7b 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f  {.      Tcl_SetO
15160 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
15170 20 2a 70 70 48 6f 6f 6b 29 3b 0a 20 20 20 20 20   *ppHook);.     
15180 20 69 66 28 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a   if( objc==3 ){.
15190 20 20 20 20 20 20 20 20 54 63 6c 5f 44 65 63 72          Tcl_Decr
151a0 52 65 66 43 6f 75 6e 74 28 2a 70 70 48 6f 6f 6b  RefCount(*ppHook
151b0 29 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 48 6f  );.        *ppHo
151c0 6f 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  ok = 0;.      }.
151d0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 62      }.    if( ob
151e0 6a 63 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20 61  jc==3 ){.      a
151f0 73 73 65 72 74 28 20 21 28 2a 70 70 48 6f 6f 6b  ssert( !(*ppHook
15200 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 54  ) );.      if( T
15210 63 6c 5f 47 65 74 43 68 61 72 4c 65 6e 67 74 68  cl_GetCharLength
15220 28 6f 62 6a 76 5b 32 5d 29 3e 30 20 29 7b 0a 20  (objv[2])>0 ){. 
15230 20 20 20 20 20 20 20 2a 70 70 48 6f 6f 6b 20 3d         *ppHook =
15240 20 6f 62 6a 76 5b 32 5d 3b 0a 20 20 20 20 20 20   objv[2];.      
15250 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
15260 6e 74 28 2a 70 70 48 6f 6f 6b 29 3b 0a 20 20 20  nt(*ppHook);.   
15270 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
15280 73 71 6c 69 74 65 33 5f 75 70 64 61 74 65 5f 68  sqlite3_update_h
15290 6f 6f 6b 28 70 44 62 2d 3e 64 62 2c 20 28 70 44  ook(pDb->db, (pD
152a0 62 2d 3e 70 55 70 64 61 74 65 48 6f 6f 6b 3f 44  b->pUpdateHook?D
152b0 62 55 70 64 61 74 65 48 61 6e 64 6c 65 72 3a 30  bUpdateHandler:0
152c0 29 2c 20 70 44 62 29 3b 0a 20 20 20 20 73 71 6c  ), pDb);.    sql
152d0 69 74 65 33 5f 72 6f 6c 6c 62 61 63 6b 5f 68 6f  ite3_rollback_ho
152e0 6f 6b 28 70 44 62 2d 3e 64 62 2c 28 70 44 62 2d  ok(pDb->db,(pDb-
152f0 3e 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 3f 44  >pRollbackHook?D
15300 62 52 6f 6c 6c 62 61 63 6b 48 61 6e 64 6c 65 72  bRollbackHandler
15310 3a 30 29 2c 70 44 62 29 3b 0a 20 20 20 20 73 71  :0),pDb);.    sq
15320 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 70  lite3_wal_hook(p
15330 44 62 2d 3e 64 62 2c 28 70 44 62 2d 3e 70 57 61  Db->db,(pDb->pWa
15340 6c 48 6f 6f 6b 3f 44 62 57 61 6c 48 61 6e 64 6c  lHook?DbWalHandl
15350 65 72 3a 30 29 2c 70 44 62 29 3b 0a 0a 20 20 20  er:0),pDb);..   
15360 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
15370 2a 20 20 20 20 24 64 62 20 76 65 72 73 69 6f 6e  *    $db version
15380 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72  .  **.  ** Retur
15390 6e 20 74 68 65 20 76 65 72 73 69 6f 6e 20 73 74  n the version st
153a0 72 69 6e 67 20 66 6f 72 20 74 68 69 73 20 64 61  ring for this da
153b0 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 63  tabase..  */.  c
153c0 61 73 65 20 44 42 5f 56 45 52 53 49 4f 4e 3a 20  ase DB_VERSION: 
153d0 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73  {.    Tcl_SetRes
153e0 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61  ult(interp, (cha
153f0 72 20 2a 29 73 71 6c 69 74 65 33 5f 6c 69 62 76  r *)sqlite3_libv
15400 65 72 73 69 6f 6e 28 29 2c 20 54 43 4c 5f 53 54  ersion(), TCL_ST
15410 41 54 49 43 29 3b 0a 20 20 20 20 62 72 65 61 6b  ATIC);.    break
15420 3b 0a 20 20 7d 0a 0a 0a 20 20 7d 20 2f 2a 20 45  ;.  }...  } /* E
15430 6e 64 20 6f 66 20 74 68 65 20 53 57 49 54 43 48  nd of the SWITCH
15440 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
15450 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69  return rc;.}..#i
15460 66 20 53 51 4c 49 54 45 5f 54 43 4c 5f 4e 52 45  f SQLITE_TCL_NRE
15470 0a 2f 2a 0a 2a 2a 20 41 64 61 70 74 6f 72 20 74  ./*.** Adaptor t
15480 68 61 74 20 70 72 6f 76 69 64 65 73 20 61 6e 20  hat provides an 
15490 6f 62 6a 43 6d 64 20 69 6e 74 65 72 66 61 63 65  objCmd interface
154a0 20 74 6f 20 74 68 65 20 4e 52 45 2d 65 6e 61 62   to the NRE-enab
154b0 6c 65 64 0a 2a 2a 20 69 6e 74 65 72 66 61 63 65  led.** interface
154c0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e   implementation.
154d0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 44  .*/.static int D
154e0 62 4f 62 6a 43 6d 64 41 64 61 70 74 6f 72 28 0a  bObjCmdAdaptor(.
154f0 20 20 76 6f 69 64 20 2a 63 64 2c 0a 20 20 54 63    void *cd,.  Tc
15500 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
15510 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
15520 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 2a 6f  Tcl_Obj *const*o
15530 62 6a 76 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20  bjv.){.  return 
15540 54 63 6c 5f 4e 52 43 61 6c 6c 4f 62 6a 50 72 6f  Tcl_NRCallObjPro
15550 63 28 69 6e 74 65 72 70 2c 20 44 62 4f 62 6a 43  c(interp, DbObjC
15560 6d 64 2c 20 63 64 2c 20 6f 62 6a 63 2c 20 6f 62  md, cd, objc, ob
15570 6a 76 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  jv);.}.#endif /*
15580 20 53 51 4c 49 54 45 5f 54 43 4c 5f 4e 52 45 20   SQLITE_TCL_NRE 
15590 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 20 20 73 71 6c 69  */../*.**   sqli
155a0 74 65 33 20 44 42 4e 41 4d 45 20 46 49 4c 45 4e  te3 DBNAME FILEN
155b0 41 4d 45 20 3f 2d 76 66 73 20 56 46 53 4e 41 4d  AME ?-vfs VFSNAM
155c0 45 3f 20 3f 2d 6b 65 79 20 4b 45 59 3f 20 3f 2d  E? ?-key KEY? ?-
155d0 72 65 61 64 6f 6e 6c 79 20 42 4f 4f 4c 45 41 4e  readonly BOOLEAN
155e0 3f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  ?.**            
155f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3f                 ?
15600 2d 63 72 65 61 74 65 20 42 4f 4f 4c 45 41 4e 3f  -create BOOLEAN?
15610 20 3f 2d 6e 6f 6d 75 74 65 78 20 42 4f 4f 4c 45   ?-nomutex BOOLE
15620 41 4e 3f 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  AN?.**.** This i
15630 73 20 74 68 65 20 6d 61 69 6e 20 54 63 6c 20 63  s the main Tcl c
15640 6f 6d 6d 61 6e 64 2e 20 20 57 68 65 6e 20 74 68  ommand.  When th
15650 65 20 22 73 71 6c 69 74 65 22 20 54 63 6c 20 63  e "sqlite" Tcl c
15660 6f 6d 6d 61 6e 64 20 69 73 0a 2a 2a 20 69 6e 76  ommand is.** inv
15670 6f 6b 65 64 2c 20 74 68 69 73 20 72 6f 75 74 69  oked, this routi
15680 6e 65 20 72 75 6e 73 20 74 6f 20 70 72 6f 63 65  ne runs to proce
15690 73 73 20 74 68 61 74 20 63 6f 6d 6d 61 6e 64 2e  ss that command.
156a0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  .**.** The first
156b0 20 61 72 67 75 6d 65 6e 74 2c 20 44 42 4e 41 4d   argument, DBNAM
156c0 45 2c 20 69 73 20 61 6e 20 61 72 62 69 74 72 61  E, is an arbitra
156d0 72 79 20 6e 61 6d 65 20 66 6f 72 20 61 20 6e 65  ry name for a ne
156e0 77 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f  w.** database co
156f0 6e 6e 65 63 74 69 6f 6e 2e 20 20 54 68 69 73 20  nnection.  This 
15700 63 6f 6d 6d 61 6e 64 20 63 72 65 61 74 65 73 20  command creates 
15710 61 20 6e 65 77 20 63 6f 6d 6d 61 6e 64 20 6e 61  a new command na
15720 6d 65 64 0a 2a 2a 20 44 42 4e 41 4d 45 20 74 68  med.** DBNAME th
15730 61 74 20 69 73 20 75 73 65 64 20 74 6f 20 63 6f  at is used to co
15740 6e 74 72 6f 6c 20 74 68 61 74 20 63 6f 6e 6e 65  ntrol that conne
15750 63 74 69 6f 6e 2e 20 20 54 68 65 20 64 61 74 61  ction.  The data
15760 62 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69  base.** connecti
15770 6f 6e 20 69 73 20 64 65 6c 65 74 65 64 20 77 68  on is deleted wh
15780 65 6e 20 74 68 65 20 44 42 4e 41 4d 45 20 63 6f  en the DBNAME co
15790 6d 6d 61 6e 64 20 69 73 20 64 65 6c 65 74 65 64  mmand is deleted
157a0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f  ..**.** The seco
157b0 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74  nd argument is t
157c0 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64  he name of the d
157d0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
157e0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 44  .*/.static int D
157f0 62 4d 61 69 6e 28 76 6f 69 64 20 2a 63 64 2c 20  bMain(void *cd, 
15800 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
15810 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 54 63 6c  rp, int objc,Tcl
15820 5f 4f 62 6a 20 2a 63 6f 6e 73 74 2a 6f 62 6a 76  _Obj *const*objv
15830 29 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70  ){.  SqliteDb *p
15840 3b 0a 20 20 76 6f 69 64 20 2a 70 4b 65 79 20 3d  ;.  void *pKey =
15850 20 30 3b 0a 20 20 69 6e 74 20 6e 4b 65 79 20 3d   0;.  int nKey =
15860 20 30 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   0;.  const char
15870 20 2a 7a 41 72 67 3b 0a 20 20 63 68 61 72 20 2a   *zArg;.  char *
15880 7a 45 72 72 4d 73 67 3b 0a 20 20 69 6e 74 20 69  zErrMsg;.  int i
15890 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
158a0 7a 46 69 6c 65 3b 0a 20 20 63 6f 6e 73 74 20 63  zFile;.  const c
158b0 68 61 72 20 2a 7a 56 66 73 20 3d 20 30 3b 0a 20  har *zVfs = 0;. 
158c0 20 69 6e 74 20 66 6c 61 67 73 3b 0a 20 20 54 63   int flags;.  Tc
158d0 6c 5f 44 53 74 72 69 6e 67 20 74 72 61 6e 73 6c  l_DString transl
158e0 61 74 65 64 46 69 6c 65 6e 61 6d 65 3b 0a 0a 20  atedFilename;.. 
158f0 20 2f 2a 20 49 6e 20 6e 6f 72 6d 61 6c 20 75 73   /* In normal us
15900 65 2c 20 65 61 63 68 20 54 43 4c 20 69 6e 74 65  e, each TCL inte
15910 72 70 72 65 74 65 72 20 72 75 6e 73 20 69 6e 20  rpreter runs in 
15920 61 20 73 69 6e 67 6c 65 20 74 68 72 65 61 64 2e  a single thread.
15930 20 20 53 6f 0a 20 20 2a 2a 20 62 79 20 64 65 66    So.  ** by def
15940 61 75 6c 74 2c 20 77 65 20 63 61 6e 20 74 75 72  ault, we can tur
15950 6e 20 6f 66 20 6d 75 74 65 78 69 6e 67 20 6f 6e  n of mutexing on
15960 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73 65   SQLite database
15970 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 0a 20 20   connections..  
15980 2a 2a 20 48 6f 77 65 76 65 72 2c 20 66 6f 72 20  ** However, for 
15990 74 65 73 74 69 6e 67 20 70 75 72 70 6f 73 65 73  testing purposes
159a0 20 69 74 20 69 73 20 75 73 65 66 75 6c 20 74 6f   it is useful to
159b0 20 68 61 76 65 20 6d 75 74 65 78 65 73 20 74 75   have mutexes tu
159c0 72 6e 65 64 0a 20 20 2a 2a 20 6f 6e 2e 20 20 53  rned.  ** on.  S
159d0 6f 2c 20 62 79 20 64 65 66 61 75 6c 74 2c 20 6d  o, by default, m
159e0 75 74 65 78 65 73 20 64 65 66 61 75 6c 74 20 6f  utexes default o
159f0 66 66 2e 20 20 42 75 74 20 69 66 20 63 6f 6d 70  ff.  But if comp
15a00 69 6c 65 64 20 77 69 74 68 0a 20 20 2a 2a 20 53  iled with.  ** S
15a10 51 4c 49 54 45 5f 54 43 4c 5f 44 45 46 41 55 4c  QLITE_TCL_DEFAUL
15a20 54 5f 46 55 4c 4c 4d 55 54 45 58 20 74 68 65 6e  T_FULLMUTEX then
15a30 20 6d 75 74 65 78 65 73 20 64 65 66 61 75 6c 74   mutexes default
15a40 20 6f 6e 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66   on..  */.#ifdef
15a50 20 53 51 4c 49 54 45 5f 54 43 4c 5f 44 45 46 41   SQLITE_TCL_DEFA
15a60 55 4c 54 5f 46 55 4c 4c 4d 55 54 45 58 0a 20 20  ULT_FULLMUTEX.  
15a70 66 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f  flags = SQLITE_O
15a80 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20  PEN_READWRITE | 
15a90 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
15aa0 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  TE | SQLITE_OPEN
15ab0 5f 46 55 4c 4c 4d 55 54 45 58 3b 0a 23 65 6c 73  _FULLMUTEX;.#els
15ac0 65 0a 20 20 66 6c 61 67 73 20 3d 20 53 51 4c 49  e.  flags = SQLI
15ad0 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
15ae0 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  E | SQLITE_OPEN_
15af0 43 52 45 41 54 45 20 7c 20 53 51 4c 49 54 45 5f  CREATE | SQLITE_
15b00 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58 3b 0a 23 65  OPEN_NOMUTEX;.#e
15b10 6e 64 69 66 0a 0a 20 20 69 66 28 20 6f 62 6a 63  ndif..  if( objc
15b20 3d 3d 32 20 29 7b 0a 20 20 20 20 7a 41 72 67 20  ==2 ){.    zArg 
15b30 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  = Tcl_GetStringF
15b40 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20  romObj(objv[1], 
15b50 30 29 3b 0a 20 20 20 20 69 66 28 20 73 74 72 63  0);.    if( strc
15b60 6d 70 28 7a 41 72 67 2c 22 2d 76 65 72 73 69 6f  mp(zArg,"-versio
15b70 6e 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  n")==0 ){.      
15b80 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
15b90 28 69 6e 74 65 72 70 2c 73 71 6c 69 74 65 33 5f  (interp,sqlite3_
15ba0 76 65 72 73 69 6f 6e 2c 30 29 3b 0a 20 20 20 20  version,0);.    
15bb0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
15bc0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
15bd0 74 72 63 6d 70 28 7a 41 72 67 2c 22 2d 68 61 73  trcmp(zArg,"-has
15be0 2d 63 6f 64 65 63 22 29 3d 3d 30 20 29 7b 0a 23  -codec")==0 ){.#
15bf0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53  ifdef SQLITE_HAS
15c00 5f 43 4f 44 45 43 0a 20 20 20 20 20 20 54 63 6c  _CODEC.      Tcl
15c10 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
15c20 74 65 72 70 2c 22 31 22 2c 30 29 3b 0a 23 65 6c  terp,"1",0);.#el
15c30 73 65 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70  se.      Tcl_App
15c40 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
15c50 2c 22 30 22 2c 30 29 3b 0a 23 65 6e 64 69 66 0a  ,"0",0);.#endif.
15c60 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
15c70 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  _OK;.    }.  }. 
15c80 20 66 6f 72 28 69 3d 33 3b 20 69 2b 31 3c 6f 62   for(i=3; i+1<ob
15c90 6a 63 3b 20 69 2b 3d 32 29 7b 0a 20 20 20 20 7a  jc; i+=2){.    z
15ca0 41 72 67 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  Arg = Tcl_GetStr
15cb0 69 6e 67 28 6f 62 6a 76 5b 69 5d 29 3b 0a 20 20  ing(objv[i]);.  
15cc0 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 41 72    if( strcmp(zAr
15cd0 67 2c 22 2d 6b 65 79 22 29 3d 3d 30 20 29 7b 0a  g,"-key")==0 ){.
15ce0 20 20 20 20 20 20 70 4b 65 79 20 3d 20 54 63 6c        pKey = Tcl
15cf0 5f 47 65 74 42 79 74 65 41 72 72 61 79 46 72 6f  _GetByteArrayFro
15d00 6d 4f 62 6a 28 6f 62 6a 76 5b 69 2b 31 5d 2c 20  mObj(objv[i+1], 
15d10 26 6e 4b 65 79 29 3b 0a 20 20 20 20 7d 65 6c 73  &nKey);.    }els
15d20 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 41 72  e if( strcmp(zAr
15d30 67 2c 20 22 2d 76 66 73 22 29 3d 3d 30 20 29 7b  g, "-vfs")==0 ){
15d40 0a 20 20 20 20 20 20 7a 56 66 73 20 3d 20 54 63  .      zVfs = Tc
15d50 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
15d60 5b 69 2b 31 5d 29 3b 0a 20 20 20 20 7d 65 6c 73  [i+1]);.    }els
15d70 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 41 72  e if( strcmp(zAr
15d80 67 2c 20 22 2d 72 65 61 64 6f 6e 6c 79 22 29 3d  g, "-readonly")=
15d90 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =0 ){.      int 
15da0 62 3b 0a 20 20 20 20 20 20 69 66 28 20 54 63 6c  b;.      if( Tcl
15db0 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f  _GetBooleanFromO
15dc0 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
15dd0 69 2b 31 5d 2c 20 26 62 29 20 29 20 72 65 74 75  i+1], &b) ) retu
15de0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
15df0 20 20 20 20 69 66 28 20 62 20 29 7b 0a 20 20 20      if( b ){.   
15e00 20 20 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 28       flags &= ~(
15e10 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
15e20 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45  WRITE|SQLITE_OPE
15e30 4e 5f 43 52 45 41 54 45 29 3b 0a 20 20 20 20 20  N_CREATE);.     
15e40 20 20 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49     flags |= SQLI
15e50 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
15e60 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
15e70 20 20 20 20 20 20 20 66 6c 61 67 73 20 26 3d 20         flags &= 
15e80 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41  ~SQLITE_OPEN_REA
15e90 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 20 20 66  DONLY;.        f
15ea0 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f  lags |= SQLITE_O
15eb0 50 45 4e 5f 52 45 41 44 57 52 49 54 45 3b 0a 20  PEN_READWRITE;. 
15ec0 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
15ed0 20 69 66 28 20 73 74 72 63 6d 70 28 7a 41 72 67   if( strcmp(zArg
15ee0 2c 20 22 2d 63 72 65 61 74 65 22 29 3d 3d 30 20  , "-create")==0 
15ef0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 62 3b 0a  ){.      int b;.
15f00 20 20 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65        if( Tcl_Ge
15f10 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28  tBooleanFromObj(
15f20 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 69 2b 31  interp, objv[i+1
15f30 5d 2c 20 26 62 29 20 29 20 72 65 74 75 72 6e 20  ], &b) ) return 
15f40 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  TCL_ERROR;.     
15f50 20 69 66 28 20 62 20 26 26 20 28 66 6c 61 67 73   if( b && (flags
15f60 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52   & SQLITE_OPEN_R
15f70 45 41 44 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a 20  EADONLY)==0 ){. 
15f80 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20         flags |= 
15f90 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
15fa0 54 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  TE;.      }else{
15fb0 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 26  .        flags &
15fc0 3d 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43  = ~SQLITE_OPEN_C
15fd0 52 45 41 54 45 3b 0a 20 20 20 20 20 20 7d 0a 20  REATE;.      }. 
15fe0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
15ff0 63 6d 70 28 7a 41 72 67 2c 20 22 2d 6e 6f 6d 75  cmp(zArg, "-nomu
16000 74 65 78 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  tex")==0 ){.    
16010 20 20 69 6e 74 20 62 3b 0a 20 20 20 20 20 20 69    int b;.      i
16020 66 28 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61  f( Tcl_GetBoolea
16030 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  nFromObj(interp,
16040 20 6f 62 6a 76 5b 69 2b 31 5d 2c 20 26 62 29 20   objv[i+1], &b) 
16050 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
16060 4f 52 3b 0a 20 20 20 20 20 20 69 66 28 20 62 20  OR;.      if( b 
16070 29 7b 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73  ){.        flags
16080 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   |= SQLITE_OPEN_
16090 4e 4f 4d 55 54 45 58 3b 0a 20 20 20 20 20 20 20  NOMUTEX;.       
160a0 20 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54   flags &= ~SQLIT
160b0 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54 45 58  E_OPEN_FULLMUTEX
160c0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
160d0 20 20 20 20 20 20 20 66 6c 61 67 73 20 26 3d 20         flags &= 
160e0 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d  ~SQLITE_OPEN_NOM
160f0 55 54 45 58 3b 0a 20 20 20 20 20 20 7d 0a 20 20  UTEX;.      }.  
16100 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
16110 70 28 7a 41 72 67 2c 20 22 2d 66 75 6c 6c 6d 75  p(zArg, "-fullmu
16120 74 65 78 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  tex")==0 ){.    
16130 20 20 69 6e 74 20 62 3b 0a 20 20 20 20 20 20 69    int b;.      i
16140 66 28 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61  f( Tcl_GetBoolea
16150 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  nFromObj(interp,
16160 20 6f 62 6a 76 5b 69 2b 31 5d 2c 20 26 62 29 20   objv[i+1], &b) 
16170 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
16180 4f 52 3b 0a 20 20 20 20 20 20 69 66 28 20 62 20  OR;.      if( b 
16190 29 7b 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73  ){.        flags
161a0 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   |= SQLITE_OPEN_
161b0 46 55 4c 4c 4d 55 54 45 58 3b 0a 20 20 20 20 20  FULLMUTEX;.     
161c0 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c     flags &= ~SQL
161d0 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58  ITE_OPEN_NOMUTEX
161e0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
161f0 20 20 20 20 20 20 20 66 6c 61 67 73 20 26 3d 20         flags &= 
16200 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55 4c  ~SQLITE_OPEN_FUL
16210 4c 4d 55 54 45 58 3b 0a 20 20 20 20 20 20 7d 0a  LMUTEX;.      }.
16220 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
16230 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
16240 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 6b 6e 6f  t(interp, "unkno
16250 77 6e 20 6f 70 74 69 6f 6e 3a 20 22 2c 20 7a 41  wn option: ", zA
16260 72 67 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20  rg, (char*)0);. 
16270 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
16280 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 7d  ERROR;.    }.  }
16290 0a 20 20 69 66 28 20 6f 62 6a 63 3c 33 20 7c 7c  .  if( objc<3 ||
162a0 20 28 6f 62 6a 63 26 31 29 21 3d 31 20 29 7b 0a   (objc&1)!=1 ){.
162b0 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
162c0 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
162d0 6f 62 6a 76 2c 20 0a 20 20 20 20 20 20 22 48 41  objv, .      "HA
162e0 4e 44 4c 45 20 46 49 4c 45 4e 41 4d 45 20 3f 2d  NDLE FILENAME ?-
162f0 76 66 73 20 56 46 53 4e 41 4d 45 3f 20 3f 2d 72  vfs VFSNAME? ?-r
16300 65 61 64 6f 6e 6c 79 20 42 4f 4f 4c 45 41 4e 3f  eadonly BOOLEAN?
16310 20 3f 2d 63 72 65 61 74 65 20 42 4f 4f 4c 45 41   ?-create BOOLEA
16320 4e 3f 22 0a 20 20 20 20 20 20 22 20 3f 2d 6e 6f  N?".      " ?-no
16330 6d 75 74 65 78 20 42 4f 4f 4c 45 41 4e 3f 20 3f  mutex BOOLEAN? ?
16340 2d 66 75 6c 6c 6d 75 74 65 78 20 42 4f 4f 4c 45  -fullmutex BOOLE
16350 41 4e 3f 22 0a 23 69 66 64 65 66 20 53 51 4c 49  AN?".#ifdef SQLI
16360 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 20  TE_HAS_CODEC.   
16370 20 20 20 22 20 3f 2d 6b 65 79 20 43 4f 44 45 43     " ?-key CODEC
16380 4b 45 59 3f 22 0a 23 65 6e 64 69 66 0a 20 20 20  KEY?".#endif.   
16390 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54   );.    return T
163a0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
163b0 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 70  zErrMsg = 0;.  p
163c0 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 54 63   = (SqliteDb*)Tc
163d0 6c 5f 41 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  l_Alloc( sizeof(
163e0 2a 70 29 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d  *p) );.  if( p==
163f0 30 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74  0 ){.    Tcl_Set
16400 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
16410 6d 61 6c 6c 6f 63 20 66 61 69 6c 65 64 22 2c 20  malloc failed", 
16420 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 20  TCL_STATIC);.   
16430 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
16440 52 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28  R;.  }.  memset(
16450 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 29  p, 0, sizeof(*p)
16460 29 3b 0a 20 20 7a 46 69 6c 65 20 3d 20 54 63 6c  );.  zFile = Tcl
16470 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
16480 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30 29 3b 0a 20  j(objv[2], 0);. 
16490 20 7a 46 69 6c 65 20 3d 20 54 63 6c 5f 54 72 61   zFile = Tcl_Tra
164a0 6e 73 6c 61 74 65 46 69 6c 65 4e 61 6d 65 28 69  nslateFileName(i
164b0 6e 74 65 72 70 2c 20 7a 46 69 6c 65 2c 20 26 74  nterp, zFile, &t
164c0 72 61 6e 73 6c 61 74 65 64 46 69 6c 65 6e 61 6d  ranslatedFilenam
164d0 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6f 70  e);.  sqlite3_op
164e0 65 6e 5f 76 32 28 7a 46 69 6c 65 2c 20 26 70 2d  en_v2(zFile, &p-
164f0 3e 64 62 2c 20 66 6c 61 67 73 2c 20 7a 56 66 73  >db, flags, zVfs
16500 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  );.  Tcl_DString
16510 46 72 65 65 28 26 74 72 61 6e 73 6c 61 74 65 64  Free(&translated
16520 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28  Filename);.  if(
16530 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69   SQLITE_OK!=sqli
16540 74 65 33 5f 65 72 72 63 6f 64 65 28 70 2d 3e 64  te3_errcode(p->d
16550 62 29 20 29 7b 0a 20 20 20 20 7a 45 72 72 4d 73  b) ){.    zErrMs
16560 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  g = sqlite3_mpri
16570 6e 74 66 28 22 25 73 22 2c 20 73 71 6c 69 74 65  ntf("%s", sqlite
16580 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62 29 29  3_errmsg(p->db))
16590 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c  ;.    sqlite3_cl
165a0 6f 73 65 28 70 2d 3e 64 62 29 3b 0a 20 20 20 20  ose(p->db);.    
165b0 70 2d 3e 64 62 20 3d 20 30 3b 0a 20 20 7d 0a 23  p->db = 0;.  }.#
165c0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53  ifdef SQLITE_HAS
165d0 5f 43 4f 44 45 43 0a 20 20 69 66 28 20 70 2d 3e  _CODEC.  if( p->
165e0 64 62 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  db ){.    sqlite
165f0 33 5f 6b 65 79 28 70 2d 3e 64 62 2c 20 70 4b 65  3_key(p->db, pKe
16600 79 2c 20 6e 4b 65 79 29 3b 0a 20 20 7d 0a 23 65  y, nKey);.  }.#e
16610 6e 64 69 66 0a 20 20 69 66 28 20 70 2d 3e 64 62  ndif.  if( p->db
16620 3d 3d 30 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53  ==0 ){.    Tcl_S
16630 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
16640 20 7a 45 72 72 4d 73 67 2c 20 54 43 4c 5f 56 4f   zErrMsg, TCL_VO
16650 4c 41 54 49 4c 45 29 3b 0a 20 20 20 20 54 63 6c  LATILE);.    Tcl
16660 5f 46 72 65 65 28 28 63 68 61 72 2a 29 70 29 3b  _Free((char*)p);
16670 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
16680 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20  e(zErrMsg);.    
16690 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
166a0 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d 61 78 53 74  ;.  }.  p->maxSt
166b0 6d 74 20 3d 20 4e 55 4d 5f 50 52 45 50 41 52 45  mt = NUM_PREPARE
166c0 44 5f 53 54 4d 54 53 3b 0a 20 20 70 2d 3e 69 6e  D_STMTS;.  p->in
166d0 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20  terp = interp;. 
166e0 20 7a 41 72 67 20 3d 20 54 63 6c 5f 47 65 74 53   zArg = Tcl_GetS
166f0 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
16700 76 5b 31 5d 2c 20 30 29 3b 0a 20 20 69 66 28 20  v[1], 0);.  if( 
16710 44 62 55 73 65 4e 72 65 28 29 20 29 7b 0a 20 20  DbUseNre() ){.  
16720 20 20 54 63 6c 5f 4e 52 43 72 65 61 74 65 43 6f    Tcl_NRCreateCo
16730 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 7a 41  mmand(interp, zA
16740 72 67 2c 20 44 62 4f 62 6a 43 6d 64 41 64 61 70  rg, DbObjCmdAdap
16750 74 6f 72 2c 20 44 62 4f 62 6a 43 6d 64 2c 0a 20  tor, DbObjCmd,. 
16760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16770 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 2c         (char*)p,
16780 20 44 62 44 65 6c 65 74 65 43 6d 64 29 3b 0a 20   DbDeleteCmd);. 
16790 20 7d 65 6c 73 65 7b 0a 20 20 20 20 54 63 6c 5f   }else{.    Tcl_
167a0 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64  CreateObjCommand
167b0 28 69 6e 74 65 72 70 2c 20 7a 41 72 67 2c 20 44  (interp, zArg, D
167c0 62 4f 62 6a 43 6d 64 2c 20 28 63 68 61 72 2a 29  bObjCmd, (char*)
167d0 70 2c 20 44 62 44 65 6c 65 74 65 43 6d 64 29 3b  p, DbDeleteCmd);
167e0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43  .  }.  return TC
167f0 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  L_OK;.}../*.** P
16800 72 6f 76 69 64 65 20 61 20 64 75 6d 6d 79 20 54  rovide a dummy T
16810 63 6c 5f 49 6e 69 74 53 74 75 62 73 20 69 66 20  cl_InitStubs if 
16820 77 65 20 61 72 65 20 75 73 69 6e 67 20 74 68 69  we are using thi
16830 73 20 61 73 20 61 20 73 74 61 74 69 63 0a 2a 2a  s as a static.**
16840 20 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 23 69 66   library..*/.#if
16850 6e 64 65 66 20 55 53 45 5f 54 43 4c 5f 53 54 55  ndef USE_TCL_STU
16860 42 53 0a 23 20 75 6e 64 65 66 20 20 54 63 6c 5f  BS.# undef  Tcl_
16870 49 6e 69 74 53 74 75 62 73 0a 23 20 64 65 66 69  InitStubs.# defi
16880 6e 65 20 54 63 6c 5f 49 6e 69 74 53 74 75 62 73  ne Tcl_InitStubs
16890 28 61 2c 62 2c 63 29 0a 23 65 6e 64 69 66 0a 0a  (a,b,c).#endif..
168a0 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20  /*.** Make sure 
168b0 77 65 20 68 61 76 65 20 61 20 50 41 43 4b 41 47  we have a PACKAG
168c0 45 5f 56 45 52 53 49 4f 4e 20 6d 61 63 72 6f 20  E_VERSION macro 
168d0 64 65 66 69 6e 65 64 2e 20 20 54 68 69 73 20 77  defined.  This w
168e0 69 6c 6c 20 62 65 0a 2a 2a 20 64 65 66 69 6e 65  ill be.** define
168f0 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  d automatically 
16900 62 79 20 74 68 65 20 54 45 41 20 6d 61 6b 65 66  by the TEA makef
16910 69 6c 65 2e 20 20 42 75 74 20 6f 74 68 65 72 20  ile.  But other 
16920 6d 61 6b 65 66 69 6c 65 73 0a 2a 2a 20 64 6f 20  makefiles.** do 
16930 6e 6f 74 20 64 65 66 69 6e 65 20 69 74 2e 0a 2a  not define it..*
16940 2f 0a 23 69 66 6e 64 65 66 20 50 41 43 4b 41 47  /.#ifndef PACKAG
16950 45 5f 56 45 52 53 49 4f 4e 0a 23 20 64 65 66 69  E_VERSION.# defi
16960 6e 65 20 50 41 43 4b 41 47 45 5f 56 45 52 53 49  ne PACKAGE_VERSI
16970 4f 4e 20 53 51 4c 49 54 45 5f 56 45 52 53 49 4f  ON SQLITE_VERSIO
16980 4e 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  N.#endif../*.** 
16990 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 69 73 20  Initialize this 
169a0 6d 6f 64 75 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  module..**.** Th
169b0 69 73 20 54 63 6c 20 6d 6f 64 75 6c 65 20 63 6f  is Tcl module co
169c0 6e 74 61 69 6e 73 20 6f 6e 6c 79 20 61 20 73 69  ntains only a si
169d0 6e 67 6c 65 20 6e 65 77 20 54 63 6c 20 63 6f 6d  ngle new Tcl com
169e0 6d 61 6e 64 20 6e 61 6d 65 64 20 22 73 71 6c 69  mand named "sqli
169f0 74 65 22 2e 0a 2a 2a 20 28 48 65 6e 63 65 20 74  te"..** (Hence t
16a00 68 65 72 65 20 69 73 20 6e 6f 20 6e 61 6d 65 73  here is no names
16a10 70 61 63 65 2e 20 20 54 68 65 72 65 20 69 73 20  pace.  There is 
16a20 6e 6f 20 70 6f 69 6e 74 20 69 6e 20 75 73 69 6e  no point in usin
16a30 67 20 61 20 6e 61 6d 65 73 70 61 63 65 0a 2a 2a  g a namespace.**
16a40 20 69 66 20 74 68 65 20 65 78 74 65 6e 73 69 6f   if the extensio
16a50 6e 20 6f 6e 6c 79 20 73 75 70 70 6c 69 65 73 20  n only supplies 
16a60 6f 6e 65 20 6e 65 77 20 6e 61 6d 65 21 29 20 20  one new name!)  
16a70 54 68 65 20 22 73 71 6c 69 74 65 22 20 63 6f 6d  The "sqlite" com
16a80 6d 61 6e 64 20 69 73 0a 2a 2a 20 75 73 65 64 20  mand is.** used 
16a90 74 6f 20 6f 70 65 6e 20 61 20 6e 65 77 20 53 51  to open a new SQ
16aa0 4c 69 74 65 20 64 61 74 61 62 61 73 65 2e 20 20  Lite database.  
16ab0 53 65 65 20 74 68 65 20 44 62 4d 61 69 6e 28 29  See the DbMain()
16ac0 20 72 6f 75 74 69 6e 65 20 61 62 6f 76 65 0a 2a   routine above.*
16ad0 2a 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c  * for additional
16ae0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2a   information..**
16af0 0a 2a 2a 20 54 68 65 20 45 58 54 45 52 4e 20 6d  .** The EXTERN m
16b00 61 63 72 6f 73 20 61 72 65 20 72 65 71 75 69 72  acros are requir
16b10 65 64 20 62 79 20 54 43 4c 20 69 6e 20 6f 72 64  ed by TCL in ord
16b20 65 72 20 74 6f 20 77 6f 72 6b 20 6f 6e 20 77 69  er to work on wi
16b30 6e 64 6f 77 73 2e 0a 2a 2f 0a 45 58 54 45 52 4e  ndows..*/.EXTERN
16b40 20 69 6e 74 20 53 71 6c 69 74 65 33 5f 49 6e 69   int Sqlite3_Ini
16b50 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  t(Tcl_Interp *in
16b60 74 65 72 70 29 7b 0a 20 20 54 63 6c 5f 49 6e 69  terp){.  Tcl_Ini
16b70 74 53 74 75 62 73 28 69 6e 74 65 72 70 2c 20 22  tStubs(interp, "
16b80 38 2e 34 22 2c 20 30 29 3b 0a 20 20 54 63 6c 5f  8.4", 0);.  Tcl_
16b90 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64  CreateObjCommand
16ba0 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65  (interp, "sqlite
16bb0 33 22 2c 20 28 54 63 6c 5f 4f 62 6a 43 6d 64 50  3", (Tcl_ObjCmdP
16bc0 72 6f 63 2a 29 44 62 4d 61 69 6e 2c 20 30 2c 20  roc*)DbMain, 0, 
16bd0 30 29 3b 0a 20 20 54 63 6c 5f 50 6b 67 50 72 6f  0);.  Tcl_PkgPro
16be0 76 69 64 65 28 69 6e 74 65 72 70 2c 20 22 73 71  vide(interp, "sq
16bf0 6c 69 74 65 33 22 2c 20 50 41 43 4b 41 47 45 5f  lite3", PACKAGE_
16c00 56 45 52 53 49 4f 4e 29 3b 0a 0a 23 69 66 6e 64  VERSION);..#ifnd
16c10 65 66 20 53 51 4c 49 54 45 5f 33 5f 53 55 46 46  ef SQLITE_3_SUFF
16c20 49 58 5f 4f 4e 4c 59 0a 20 20 2f 2a 20 54 68 65  IX_ONLY.  /* The
16c30 20 22 73 71 6c 69 74 65 22 20 61 6c 69 61 73 20   "sqlite" alias 
16c40 69 73 20 75 6e 64 6f 63 75 6d 65 6e 74 65 64 2e  is undocumented.
16c50 20 20 49 74 20 69 73 20 68 65 72 65 20 6f 6e 6c    It is here onl
16c60 79 20 74 6f 20 73 75 70 70 6f 72 74 0a 20 20 2a  y to support.  *
16c70 2a 20 6c 65 67 61 63 79 20 73 63 72 69 70 74 73  * legacy scripts
16c80 2e 20 20 41 6c 6c 20 6e 65 77 20 73 63 72 69 70  .  All new scrip
16c90 74 73 20 73 68 6f 75 6c 64 20 75 73 65 20 6f 6e  ts should use on
16ca0 6c 79 20 74 68 65 20 22 73 71 6c 69 74 65 33 22  ly the "sqlite3"
16cb0 0a 20 20 2a 2a 20 63 6f 6d 6d 61 6e 64 2e 0a 20  .  ** command.. 
16cc0 20 2a 2f 0a 20 20 54 63 6c 5f 43 72 65 61 74 65   */.  Tcl_Create
16cd0 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72  ObjCommand(inter
16ce0 70 2c 20 22 73 71 6c 69 74 65 22 2c 20 28 54 63  p, "sqlite", (Tc
16cf0 6c 5f 4f 62 6a 43 6d 64 50 72 6f 63 2a 29 44 62  l_ObjCmdProc*)Db
16d00 4d 61 69 6e 2c 20 30 2c 20 30 29 3b 0a 23 65 6e  Main, 0, 0);.#en
16d10 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 54 43  dif..  return TC
16d20 4c 5f 4f 4b 3b 0a 7d 0a 45 58 54 45 52 4e 20 69  L_OK;.}.EXTERN i
16d30 6e 74 20 54 63 6c 73 71 6c 69 74 65 33 5f 49 6e  nt Tclsqlite3_In
16d40 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  it(Tcl_Interp *i
16d50 6e 74 65 72 70 29 7b 20 72 65 74 75 72 6e 20 53  nterp){ return S
16d60 71 6c 69 74 65 33 5f 49 6e 69 74 28 69 6e 74 65  qlite3_Init(inte
16d70 72 70 29 3b 20 7d 0a 45 58 54 45 52 4e 20 69 6e  rp); }.EXTERN in
16d80 74 20 53 71 6c 69 74 65 33 5f 53 61 66 65 49 6e  t Sqlite3_SafeIn
16d90 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  it(Tcl_Interp *i
16da0 6e 74 65 72 70 29 7b 20 72 65 74 75 72 6e 20 54  nterp){ return T
16db0 43 4c 5f 4f 4b 3b 20 7d 0a 45 58 54 45 52 4e 20  CL_OK; }.EXTERN 
16dc0 69 6e 74 20 54 63 6c 73 71 6c 69 74 65 33 5f 53  int Tclsqlite3_S
16dd0 61 66 65 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  afeInit(Tcl_Inte
16de0 72 70 20 2a 69 6e 74 65 72 70 29 7b 20 72 65 74  rp *interp){ ret
16df0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 7d 0a 45 58  urn TCL_OK; }.EX
16e00 54 45 52 4e 20 69 6e 74 20 53 71 6c 69 74 65 33  TERN int Sqlite3
16e10 5f 55 6e 6c 6f 61 64 28 54 63 6c 5f 49 6e 74 65  _Unload(Tcl_Inte
16e20 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20  rp *interp, int 
16e30 66 6c 61 67 73 29 7b 20 72 65 74 75 72 6e 20 54  flags){ return T
16e40 43 4c 5f 4f 4b 3b 20 7d 0a 45 58 54 45 52 4e 20  CL_OK; }.EXTERN 
16e50 69 6e 74 20 54 63 6c 73 71 6c 69 74 65 33 5f 55  int Tclsqlite3_U
16e60 6e 6c 6f 61 64 28 54 63 6c 5f 49 6e 74 65 72 70  nload(Tcl_Interp
16e70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 66 6c   *interp, int fl
16e80 61 67 73 29 7b 20 72 65 74 75 72 6e 20 54 43 4c  ags){ return TCL
16e90 5f 4f 4b 3b 20 7d 0a 45 58 54 45 52 4e 20 69 6e  _OK; }.EXTERN in
16ea0 74 20 53 71 6c 69 74 65 33 5f 53 61 66 65 55 6e  t Sqlite3_SafeUn
16eb0 6c 6f 61 64 28 54 63 6c 5f 49 6e 74 65 72 70 20  load(Tcl_Interp 
16ec0 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 66 6c 61  *interp, int fla
16ed0 67 73 29 7b 20 72 65 74 75 72 6e 20 54 43 4c 5f  gs){ return TCL_
16ee0 4f 4b 3b 20 7d 0a 45 58 54 45 52 4e 20 69 6e 74  OK; }.EXTERN int
16ef0 20 54 63 6c 73 71 6c 69 74 65 33 5f 53 61 66 65   Tclsqlite3_Safe
16f00 55 6e 6c 6f 61 64 28 54 63 6c 5f 49 6e 74 65 72  Unload(Tcl_Inter
16f10 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 66  p *interp, int f
16f20 6c 61 67 73 29 7b 20 72 65 74 75 72 6e 20 54 43  lags){ return TC
16f30 4c 5f 4f 4b 3b 7d 0a 0a 0a 23 69 66 6e 64 65 66  L_OK;}...#ifndef
16f40 20 53 51 4c 49 54 45 5f 33 5f 53 55 46 46 49 58   SQLITE_3_SUFFIX
16f50 5f 4f 4e 4c 59 0a 69 6e 74 20 53 71 6c 69 74 65  _ONLY.int Sqlite
16f60 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
16f70 20 2a 69 6e 74 65 72 70 29 7b 20 72 65 74 75 72   *interp){ retur
16f80 6e 20 53 71 6c 69 74 65 33 5f 49 6e 69 74 28 69  n Sqlite3_Init(i
16f90 6e 74 65 72 70 29 3b 20 7d 0a 69 6e 74 20 54 63  nterp); }.int Tc
16fa0 6c 73 71 6c 69 74 65 5f 49 6e 69 74 28 54 63 6c  lsqlite_Init(Tcl
16fb0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29  _Interp *interp)
16fc0 7b 20 72 65 74 75 72 6e 20 53 71 6c 69 74 65 33  { return Sqlite3
16fd0 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 20 7d  _Init(interp); }
16fe0 0a 69 6e 74 20 53 71 6c 69 74 65 5f 53 61 66 65  .int Sqlite_Safe
16ff0 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20  Init(Tcl_Interp 
17000 2a 69 6e 74 65 72 70 29 7b 20 72 65 74 75 72 6e  *interp){ return
17010 20 54 43 4c 5f 4f 4b 3b 20 7d 0a 69 6e 74 20 54   TCL_OK; }.int T
17020 63 6c 73 71 6c 69 74 65 5f 53 61 66 65 49 6e 69  clsqlite_SafeIni
17030 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  t(Tcl_Interp *in
17040 74 65 72 70 29 7b 20 72 65 74 75 72 6e 20 54 43  terp){ return TC
17050 4c 5f 4f 4b 3b 20 7d 0a 69 6e 74 20 53 71 6c 69  L_OK; }.int Sqli
17060 74 65 5f 55 6e 6c 6f 61 64 28 54 63 6c 5f 49 6e  te_Unload(Tcl_In
17070 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e  terp *interp, in
17080 74 20 66 6c 61 67 73 29 7b 20 72 65 74 75 72 6e  t flags){ return
17090 20 54 43 4c 5f 4f 4b 3b 20 7d 0a 69 6e 74 20 54   TCL_OK; }.int T
170a0 63 6c 73 71 6c 69 74 65 5f 55 6e 6c 6f 61 64 28  clsqlite_Unload(
170b0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
170c0 72 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 20  rp, int flags){ 
170d0 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 7d  return TCL_OK; }
170e0 0a 69 6e 74 20 53 71 6c 69 74 65 5f 53 61 66 65  .int Sqlite_Safe
170f0 55 6e 6c 6f 61 64 28 54 63 6c 5f 49 6e 74 65 72  Unload(Tcl_Inter
17100 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 66  p *interp, int f
17110 6c 61 67 73 29 7b 20 72 65 74 75 72 6e 20 54 43  lags){ return TC
17120 4c 5f 4f 4b 3b 20 7d 0a 69 6e 74 20 54 63 6c 73  L_OK; }.int Tcls
17130 71 6c 69 74 65 5f 53 61 66 65 55 6e 6c 6f 61 64  qlite_SafeUnload
17140 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74  (Tcl_Interp *int
17150 65 72 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b  erp, int flags){
17160 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 7d   return TCL_OK;}
17170 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20  .#endif..#ifdef 
17180 54 43 4c 53 48 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  TCLSH./*********
17190 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
171a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
171b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
171c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
171d0 2a 2a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 66 20 74  ****.** All of t
171e0 68 65 20 63 6f 64 65 20 74 68 61 74 20 66 6f 6c  he code that fol
171f0 6c 6f 77 73 20 69 73 20 75 73 65 64 20 74 6f 20  lows is used to 
17200 62 75 69 6c 64 20 73 74 61 6e 64 61 6c 6f 6e 65  build standalone
17210 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
17220 73 0a 2a 2a 20 74 68 61 74 20 61 72 65 20 73 74  s.** that are st
17230 61 74 69 63 61 6c 6c 79 20 6c 69 6e 6b 65 64 20  atically linked 
17240 77 69 74 68 20 53 51 4c 69 74 65 2e 20 20 45 6e  with SQLite.  En
17250 61 62 6c 65 20 74 68 65 73 65 20 62 79 20 63 6f  able these by co
17260 6d 70 69 6c 69 6e 67 0a 2a 2a 20 77 69 74 68 20  mpiling.** with 
17270 2d 44 54 43 4c 53 48 3d 6e 20 77 68 65 72 65 20  -DTCLSH=n where 
17280 6e 20 63 61 6e 20 62 65 20 31 20 6f 72 20 32 2e  n can be 1 or 2.
17290 20 20 41 6e 20 6e 20 6f 66 20 31 20 67 65 6e 65    An n of 1 gene
172a0 72 61 74 65 73 20 61 20 73 74 61 6e 64 61 72 64  rates a standard
172b0 0a 2a 2a 20 74 63 6c 73 68 20 62 75 74 20 77 69  .** tclsh but wi
172c0 74 68 20 53 51 4c 69 74 65 20 62 75 69 6c 74 20  th SQLite built 
172d0 69 6e 2e 20 20 41 6e 20 6e 20 6f 66 20 32 20 67  in.  An n of 2 g
172e0 65 6e 65 72 61 74 65 73 20 74 68 65 20 53 51 4c  enerates the SQL
172f0 69 74 65 20 73 70 61 63 65 0a 2a 2a 20 61 6e 61  ite space.** ana
17300 6c 79 73 69 73 20 70 72 6f 67 72 61 6d 2e 0a 2a  lysis program..*
17310 2f 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  /..#if defined(S
17320 51 4c 49 54 45 5f 54 45 53 54 29 20 7c 7c 20 64  QLITE_TEST) || d
17330 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 43  efined(SQLITE_TC
17340 4c 4d 44 35 29 0a 2f 2a 0a 20 2a 20 54 68 69 73  LMD5)./*. * This
17350 20 63 6f 64 65 20 69 6d 70 6c 65 6d 65 6e 74 73   code implements
17360 20 74 68 65 20 4d 44 35 20 6d 65 73 73 61 67 65   the MD5 message
17370 2d 64 69 67 65 73 74 20 61 6c 67 6f 72 69 74 68  -digest algorith
17380 6d 2e 0a 20 2a 20 54 68 65 20 61 6c 67 6f 72 69  m.. * The algori
17390 74 68 6d 20 69 73 20 64 75 65 20 74 6f 20 52 6f  thm is due to Ro
173a0 6e 20 52 69 76 65 73 74 2e 20 20 54 68 69 73 20  n Rivest.  This 
173b0 63 6f 64 65 20 77 61 73 0a 20 2a 20 77 72 69 74  code was. * writ
173c0 74 65 6e 20 62 79 20 43 6f 6c 69 6e 20 50 6c 75  ten by Colin Plu
173d0 6d 62 20 69 6e 20 31 39 39 33 2c 20 6e 6f 20 63  mb in 1993, no c
173e0 6f 70 79 72 69 67 68 74 20 69 73 20 63 6c 61 69  opyright is clai
173f0 6d 65 64 2e 0a 20 2a 20 54 68 69 73 20 63 6f 64  med.. * This cod
17400 65 20 69 73 20 69 6e 20 74 68 65 20 70 75 62 6c  e is in the publ
17410 69 63 20 64 6f 6d 61 69 6e 3b 20 64 6f 20 77 69  ic domain; do wi
17420 74 68 20 69 74 20 77 68 61 74 20 79 6f 75 20 77  th it what you w
17430 69 73 68 2e 0a 20 2a 0a 20 2a 20 45 71 75 69 76  ish.. *. * Equiv
17440 61 6c 65 6e 74 20 63 6f 64 65 20 69 73 20 61 76  alent code is av
17450 61 69 6c 61 62 6c 65 20 66 72 6f 6d 20 52 53 41  ailable from RSA
17460 20 44 61 74 61 20 53 65 63 75 72 69 74 79 2c 20   Data Security, 
17470 49 6e 63 2e 0a 20 2a 20 54 68 69 73 20 63 6f 64  Inc.. * This cod
17480 65 20 68 61 73 20 62 65 65 6e 20 74 65 73 74 65  e has been teste
17490 64 20 61 67 61 69 6e 73 74 20 74 68 61 74 2c 20  d against that, 
174a0 61 6e 64 20 69 73 20 65 71 75 69 76 61 6c 65 6e  and is equivalen
174b0 74 2c 0a 20 2a 20 65 78 63 65 70 74 20 74 68 61  t,. * except tha
174c0 74 20 79 6f 75 20 64 6f 6e 27 74 20 6e 65 65 64  t you don't need
174d0 20 74 6f 20 69 6e 63 6c 75 64 65 20 74 77 6f 20   to include two 
174e0 70 61 67 65 73 20 6f 66 20 6c 65 67 61 6c 65 73  pages of legales
174f0 65 0a 20 2a 20 77 69 74 68 20 65 76 65 72 79 20  e. * with every 
17500 63 6f 70 79 2e 0a 20 2a 0a 20 2a 20 54 6f 20 63  copy.. *. * To c
17510 6f 6d 70 75 74 65 20 74 68 65 20 6d 65 73 73 61  ompute the messa
17520 67 65 20 64 69 67 65 73 74 20 6f 66 20 61 20 63  ge digest of a c
17530 68 75 6e 6b 20 6f 66 20 62 79 74 65 73 2c 20 64  hunk of bytes, d
17540 65 63 6c 61 72 65 20 61 6e 0a 20 2a 20 4d 44 35  eclare an. * MD5
17550 43 6f 6e 74 65 78 74 20 73 74 72 75 63 74 75 72  Context structur
17560 65 2c 20 70 61 73 73 20 69 74 20 74 6f 20 4d 44  e, pass it to MD
17570 35 49 6e 69 74 2c 20 63 61 6c 6c 20 4d 44 35 55  5Init, call MD5U
17580 70 64 61 74 65 20 61 73 0a 20 2a 20 6e 65 65 64  pdate as. * need
17590 65 64 20 6f 6e 20 62 75 66 66 65 72 73 20 66 75  ed on buffers fu
175a0 6c 6c 20 6f 66 20 62 79 74 65 73 2c 20 61 6e 64  ll of bytes, and
175b0 20 74 68 65 6e 20 63 61 6c 6c 20 4d 44 35 46 69   then call MD5Fi
175c0 6e 61 6c 2c 20 77 68 69 63 68 0a 20 2a 20 77 69  nal, which. * wi
175d0 6c 6c 20 66 69 6c 6c 20 61 20 73 75 70 70 6c 69  ll fill a suppli
175e0 65 64 20 31 36 2d 62 79 74 65 20 61 72 72 61 79  ed 16-byte array
175f0 20 77 69 74 68 20 74 68 65 20 64 69 67 65 73 74   with the digest
17600 2e 0a 20 2a 2f 0a 0a 2f 2a 0a 20 2a 20 49 66 20  .. */../*. * If 
17610 63 6f 6d 70 69 6c 65 64 20 6f 6e 20 61 20 6d 61  compiled on a ma
17620 63 68 69 6e 65 20 74 68 61 74 20 64 6f 65 73 6e  chine that doesn
17630 27 74 20 68 61 76 65 20 61 20 33 32 2d 62 69 74  't have a 32-bit
17640 20 69 6e 74 65 67 65 72 2c 0a 20 2a 20 79 6f 75   integer,. * you
17650 20 6a 75 73 74 20 73 65 74 20 22 75 69 6e 74 33   just set "uint3
17660 32 22 20 74 6f 20 74 68 65 20 61 70 70 72 6f 70  2" to the approp
17670 72 69 61 74 65 20 64 61 74 61 74 79 70 65 20 66  riate datatype f
17680 6f 72 20 61 6e 0a 20 2a 20 75 6e 73 69 67 6e 65  or an. * unsigne
17690 64 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72  d 32-bit integer
176a0 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a  .  For example:.
176b0 20 2a 0a 20 2a 20 20 20 20 20 20 20 63 63 20 2d   *. *       cc -
176c0 44 75 69 6e 74 33 32 3d 27 75 6e 73 69 67 6e 65  Duint32='unsigne
176d0 64 20 6c 6f 6e 67 27 20 6d 64 35 2e 63 0a 20 2a  d long' md5.c. *
176e0 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 75 69 6e  . */.#ifndef uin
176f0 74 33 32 0a 23 20 20 64 65 66 69 6e 65 20 75 69  t32.#  define ui
17700 6e 74 33 32 20 75 6e 73 69 67 6e 65 64 20 69 6e  nt32 unsigned in
17710 74 0a 23 65 6e 64 69 66 0a 0a 73 74 72 75 63 74  t.#endif..struct
17720 20 4d 44 35 43 6f 6e 74 65 78 74 20 7b 0a 20 20   MD5Context {.  
17730 69 6e 74 20 69 73 49 6e 69 74 3b 0a 20 20 75 69  int isInit;.  ui
17740 6e 74 33 32 20 62 75 66 5b 34 5d 3b 0a 20 20 75  nt32 buf[4];.  u
17750 69 6e 74 33 32 20 62 69 74 73 5b 32 5d 3b 0a 20  int32 bits[2];. 
17760 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 69   unsigned char i
17770 6e 5b 36 34 5d 3b 0a 7d 3b 0a 74 79 70 65 64 65  n[64];.};.typede
17780 66 20 73 74 72 75 63 74 20 4d 44 35 43 6f 6e 74  f struct MD5Cont
17790 65 78 74 20 4d 44 35 43 6f 6e 74 65 78 74 3b 0a  ext MD5Context;.
177a0 0a 2f 2a 0a 20 2a 20 4e 6f 74 65 3a 20 74 68 69  ./*. * Note: thi
177b0 73 20 63 6f 64 65 20 69 73 20 68 61 72 6d 6c 65  s code is harmle
177c0 73 73 20 6f 6e 20 6c 69 74 74 6c 65 2d 65 6e 64  ss on little-end
177d0 69 61 6e 20 6d 61 63 68 69 6e 65 73 2e 0a 20 2a  ian machines.. *
177e0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 79  /.static void by
177f0 74 65 52 65 76 65 72 73 65 20 28 75 6e 73 69 67  teReverse (unsig
17800 6e 65 64 20 63 68 61 72 20 2a 62 75 66 2c 20 75  ned char *buf, u
17810 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 73 29 7b 0a  nsigned longs){.
17820 20 20 20 20 20 20 20 20 75 69 6e 74 33 32 20 74          uint32 t
17830 3b 0a 20 20 20 20 20 20 20 20 64 6f 20 7b 0a 20  ;.        do {. 
17840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
17850 20 3d 20 28 75 69 6e 74 33 32 29 28 28 75 6e 73   = (uint32)((uns
17860 69 67 6e 65 64 29 62 75 66 5b 33 5d 3c 3c 38 20  igned)buf[3]<<8 
17870 7c 20 62 75 66 5b 32 5d 29 20 3c 3c 20 31 36 20  | buf[2]) << 16 
17880 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  |.              
17890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 28                ((
178a0 75 6e 73 69 67 6e 65 64 29 62 75 66 5b 31 5d 3c  unsigned)buf[1]<
178b0 3c 38 20 7c 20 62 75 66 5b 30 5d 29 3b 0a 20 20  <8 | buf[0]);.  
178c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 28                *(
178d0 75 69 6e 74 33 32 20 2a 29 62 75 66 20 3d 20 74  uint32 *)buf = t
178e0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
178f0 20 20 62 75 66 20 2b 3d 20 34 3b 0a 20 20 20 20    buf += 4;.    
17900 20 20 20 20 7d 20 77 68 69 6c 65 20 28 2d 2d 6c      } while (--l
17910 6f 6e 67 73 29 3b 0a 7d 0a 2f 2a 20 54 68 65 20  ongs);.}./* The 
17920 66 6f 75 72 20 63 6f 72 65 20 66 75 6e 63 74 69  four core functi
17930 6f 6e 73 20 2d 20 46 31 20 69 73 20 6f 70 74 69  ons - F1 is opti
17940 6d 69 7a 65 64 20 73 6f 6d 65 77 68 61 74 20 2a  mized somewhat *
17950 2f 0a 0a 2f 2a 20 23 64 65 66 69 6e 65 20 46 31  /../* #define F1
17960 28 78 2c 20 79 2c 20 7a 29 20 28 78 20 26 20 79  (x, y, z) (x & y
17970 20 7c 20 7e 78 20 26 20 7a 29 20 2a 2f 0a 23 64   | ~x & z) */.#d
17980 65 66 69 6e 65 20 46 31 28 78 2c 20 79 2c 20 7a  efine F1(x, y, z
17990 29 20 28 7a 20 5e 20 28 78 20 26 20 28 79 20 5e  ) (z ^ (x & (y ^
179a0 20 7a 29 29 29 0a 23 64 65 66 69 6e 65 20 46 32   z))).#define F2
179b0 28 78 2c 20 79 2c 20 7a 29 20 46 31 28 7a 2c 20  (x, y, z) F1(z, 
179c0 78 2c 20 79 29 0a 23 64 65 66 69 6e 65 20 46 33  x, y).#define F3
179d0 28 78 2c 20 79 2c 20 7a 29 20 28 78 20 5e 20 79  (x, y, z) (x ^ y
179e0 20 5e 20 7a 29 0a 23 64 65 66 69 6e 65 20 46 34   ^ z).#define F4
179f0 28 78 2c 20 79 2c 20 7a 29 20 28 79 20 5e 20 28  (x, y, z) (y ^ (
17a00 78 20 7c 20 7e 7a 29 29 0a 0a 2f 2a 20 54 68 69  x | ~z))../* Thi
17a10 73 20 69 73 20 74 68 65 20 63 65 6e 74 72 61 6c  s is the central
17a20 20 73 74 65 70 20 69 6e 20 74 68 65 20 4d 44 35   step in the MD5
17a30 20 61 6c 67 6f 72 69 74 68 6d 2e 20 2a 2f 0a 23   algorithm. */.#
17a40 64 65 66 69 6e 65 20 4d 44 35 53 54 45 50 28 66  define MD5STEP(f
17a50 2c 20 77 2c 20 78 2c 20 79 2c 20 7a 2c 20 64 61  , w, x, y, z, da
17a60 74 61 2c 20 73 29 20 5c 0a 20 20 20 20 20 20 20  ta, s) \.       
17a70 20 28 20 77 20 2b 3d 20 66 28 78 2c 20 79 2c 20   ( w += f(x, y, 
17a80 7a 29 20 2b 20 64 61 74 61 2c 20 20 77 20 3d 20  z) + data,  w = 
17a90 77 3c 3c 73 20 7c 20 77 3e 3e 28 33 32 2d 73 29  w<<s | w>>(32-s)
17aa0 2c 20 20 77 20 2b 3d 20 78 20 29 0a 0a 2f 2a 0a  ,  w += x )../*.
17ab0 20 2a 20 54 68 65 20 63 6f 72 65 20 6f 66 20 74   * The core of t
17ac0 68 65 20 4d 44 35 20 61 6c 67 6f 72 69 74 68 6d  he MD5 algorithm
17ad0 2c 20 74 68 69 73 20 61 6c 74 65 72 73 20 61 6e  , this alters an
17ae0 20 65 78 69 73 74 69 6e 67 20 4d 44 35 20 68 61   existing MD5 ha
17af0 73 68 20 74 6f 0a 20 2a 20 72 65 66 6c 65 63 74  sh to. * reflect
17b00 20 74 68 65 20 61 64 64 69 74 69 6f 6e 20 6f 66   the addition of
17b10 20 31 36 20 6c 6f 6e 67 77 6f 72 64 73 20 6f 66   16 longwords of
17b20 20 6e 65 77 20 64 61 74 61 2e 20 20 4d 44 35 55   new data.  MD5U
17b30 70 64 61 74 65 20 62 6c 6f 63 6b 73 0a 20 2a 20  pdate blocks. * 
17b40 74 68 65 20 64 61 74 61 20 61 6e 64 20 63 6f 6e  the data and con
17b50 76 65 72 74 73 20 62 79 74 65 73 20 69 6e 74 6f  verts bytes into
17b60 20 6c 6f 6e 67 77 6f 72 64 73 20 66 6f 72 20 74   longwords for t
17b70 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 20 2a 2f  his routine.. */
17b80 0a 73 74 61 74 69 63 20 76 6f 69 64 20 4d 44 35  .static void MD5
17b90 54 72 61 6e 73 66 6f 72 6d 28 75 69 6e 74 33 32  Transform(uint32
17ba0 20 62 75 66 5b 34 5d 2c 20 63 6f 6e 73 74 20 75   buf[4], const u
17bb0 69 6e 74 33 32 20 69 6e 5b 31 36 5d 29 7b 0a 20  int32 in[16]){. 
17bc0 20 20 20 20 20 20 20 72 65 67 69 73 74 65 72 20         register 
17bd0 75 69 6e 74 33 32 20 61 2c 20 62 2c 20 63 2c 20  uint32 a, b, c, 
17be0 64 3b 0a 0a 20 20 20 20 20 20 20 20 61 20 3d 20  d;..        a = 
17bf0 62 75 66 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20  buf[0];.        
17c00 62 20 3d 20 62 75 66 5b 31 5d 3b 0a 20 20 20 20  b = buf[1];.    
17c10 20 20 20 20 63 20 3d 20 62 75 66 5b 32 5d 3b 0a      c = buf[2];.
17c20 20 20 20 20 20 20 20 20 64 20 3d 20 62 75 66 5b          d = buf[
17c30 33 5d 3b 0a 0a 20 20 20 20 20 20 20 20 4d 44 35  3];..        MD5
17c40 53 54 45 50 28 46 31 2c 20 61 2c 20 62 2c 20 63  STEP(F1, a, b, c
17c50 2c 20 64 2c 20 69 6e 5b 20 30 5d 2b 30 78 64 37  , d, in[ 0]+0xd7
17c60 36 61 61 34 37 38 2c 20 20 37 29 3b 0a 20 20 20  6aa478,  7);.   
17c70 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 31 2c       MD5STEP(F1,
17c80 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e 5b   d, a, b, c, in[
17c90 20 31 5d 2b 30 78 65 38 63 37 62 37 35 36 2c 20   1]+0xe8c7b756, 
17ca0 31 32 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35  12);.        MD5
17cb0 53 54 45 50 28 46 31 2c 20 63 2c 20 64 2c 20 61  STEP(F1, c, d, a
17cc0 2c 20 62 2c 20 69 6e 5b 20 32 5d 2b 30 78 32 34  , b, in[ 2]+0x24
17cd0 32 30 37 30 64 62 2c 20 31 37 29 3b 0a 20 20 20  2070db, 17);.   
17ce0 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 31 2c       MD5STEP(F1,
17cf0 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e 5b   b, c, d, a, in[
17d00 20 33 5d 2b 30 78 63 31 62 64 63 65 65 65 2c 20   3]+0xc1bdceee, 
17d10 32 32 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35  22);.        MD5
17d20 53 54 45 50 28 46 31 2c 20 61 2c 20 62 2c 20 63  STEP(F1, a, b, c
17d30 2c 20 64 2c 20 69 6e 5b 20 34 5d 2b 30 78 66 35  , d, in[ 4]+0xf5
17d40 37 63 30 66 61 66 2c 20 20 37 29 3b 0a 20 20 20  7c0faf,  7);.   
17d50 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 31 2c       MD5STEP(F1,
17d60 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e 5b   d, a, b, c, in[
17d70 20 35 5d 2b 30 78 34 37 38 37 63 36 32 61 2c 20   5]+0x4787c62a, 
17d80 31 32 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35  12);.        MD5
17d90 53 54 45 50 28 46 31 2c 20 63 2c 20 64 2c 20 61  STEP(F1, c, d, a
17da0 2c 20 62 2c 20 69 6e 5b 20 36 5d 2b 30 78 61 38  , b, in[ 6]+0xa8
17db0 33 30 34 36 31 33 2c 20 31 37 29 3b 0a 20 20 20  304613, 17);.   
17dc0 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 31 2c       MD5STEP(F1,
17dd0 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e 5b   b, c, d, a, in[
17de0 20 37 5d 2b 30 78 66 64 34 36 39 35 30 31 2c 20   7]+0xfd469501, 
17df0 32 32 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35  22);.        MD5
17e00 53 54 45 50 28 46 31 2c 20 61 2c 20 62 2c 20 63  STEP(F1, a, b, c
17e10 2c 20 64 2c 20 69 6e 5b 20 38 5d 2b 30 78 36 39  , d, in[ 8]+0x69
17e20 38 30 39 38 64 38 2c 20 20 37 29 3b 0a 20 20 20  8098d8,  7);.   
17e30 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 31 2c       MD5STEP(F1,
17e40 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e 5b   d, a, b, c, in[
17e50 20 39 5d 2b 30 78 38 62 34 34 66 37 61 66 2c 20   9]+0x8b44f7af, 
17e60 31 32 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35  12);.        MD5
17e70 53 54 45 50 28 46 31 2c 20 63 2c 20 64 2c 20 61  STEP(F1, c, d, a
17e80 2c 20 62 2c 20 69 6e 5b 31 30 5d 2b 30 78 66 66  , b, in[10]+0xff
17e90 66 66 35 62 62 31 2c 20 31 37 29 3b 0a 20 20 20  ff5bb1, 17);.   
17ea0 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 31 2c       MD5STEP(F1,
17eb0 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e 5b   b, c, d, a, in[
17ec0 31 31 5d 2b 30 78 38 39 35 63 64 37 62 65 2c 20  11]+0x895cd7be, 
17ed0 32 32 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35  22);.        MD5
17ee0 53 54 45 50 28 46 31 2c 20 61 2c 20 62 2c 20 63  STEP(F1, a, b, c
17ef0 2c 20 64 2c 20 69 6e 5b 31 32 5d 2b 30 78 36 62  , d, in[12]+0x6b
17f00 39 30 31 31 32 32 2c 20 20 37 29 3b 0a 20 20 20  901122,  7);.   
17f10 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 31 2c       MD5STEP(F1,
17f20 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e 5b   d, a, b, c, in[
17f30 31 33 5d 2b 30 78 66 64 39 38 37 31 39 33 2c 20  13]+0xfd987193, 
17f40 31 32 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35  12);.        MD5
17f50 53 54 45 50 28 46 31 2c 20 63 2c 20 64 2c 20 61  STEP(F1, c, d, a
17f60 2c 20 62 2c 20 69 6e 5b 31 34 5d 2b 30 78 61 36  , b, in[14]+0xa6
17f70 37 39 34 33 38 65 2c 20 31 37 29 3b 0a 20 20 20  79438e, 17);.   
17f80 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 31 2c       MD5STEP(F1,
17f90 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e 5b   b, c, d, a, in[
17fa0 31 35 5d 2b 30 78 34 39 62 34 30 38 32 31 2c 20  15]+0x49b40821, 
17fb0 32 32 29 3b 0a 0a 20 20 20 20 20 20 20 20 4d 44  22);..        MD
17fc0 35 53 54 45 50 28 46 32 2c 20 61 2c 20 62 2c 20  5STEP(F2, a, b, 
17fd0 63 2c 20 64 2c 20 69 6e 5b 20 31 5d 2b 30 78 66  c, d, in[ 1]+0xf
17fe0 36 31 65 32 35 36 32 2c 20 20 35 29 3b 0a 20 20  61e2562,  5);.  
17ff0 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 32        MD5STEP(F2
18000 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e  , d, a, b, c, in
18010 5b 20 36 5d 2b 30 78 63 30 34 30 62 33 34 30 2c  [ 6]+0xc040b340,
18020 20 20 39 29 3b 0a 20 20 20 20 20 20 20 20 4d 44    9);.        MD
18030 35 53 54 45 50 28 46 32 2c 20 63 2c 20 64 2c 20  5STEP(F2, c, d, 
18040 61 2c 20 62 2c 20 69 6e 5b 31 31 5d 2b 30 78 32  a, b, in[11]+0x2
18050 36 35 65 35 61 35 31 2c 20 31 34 29 3b 0a 20 20  65e5a51, 14);.  
18060 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 32        MD5STEP(F2
18070 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e  , b, c, d, a, in
18080 5b 20 30 5d 2b 30 78 65 39 62 36 63 37 61 61 2c  [ 0]+0xe9b6c7aa,
18090 20 32 30 29 3b 0a 20 20 20 20 20 20 20 20 4d 44   20);.        MD
180a0 35 53 54 45 50 28 46 32 2c 20 61 2c 20 62 2c 20  5STEP(F2, a, b, 
180b0 63 2c 20 64 2c 20 69 6e 5b 20 35 5d 2b 30 78 64  c, d, in[ 5]+0xd
180c0 36 32 66 31 30 35 64 2c 20 20 35 29 3b 0a 20 20  62f105d,  5);.  
180d0 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 32        MD5STEP(F2
180e0 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e  , d, a, b, c, in
180f0 5b 31 30 5d 2b 30 78 30 32 34 34 31 34 35 33 2c  [10]+0x02441453,
18100 20 20 39 29 3b 0a 20 20 20 20 20 20 20 20 4d 44    9);.        MD
18110 35 53 54 45 50 28 46 32 2c 20 63 2c 20 64 2c 20  5STEP(F2, c, d, 
18120 61 2c 20 62 2c 20 69 6e 5b 31 35 5d 2b 30 78 64  a, b, in[15]+0xd
18130 38 61 31 65 36 38 31 2c 20 31 34 29 3b 0a 20 20  8a1e681, 14);.  
18140 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 32        MD5STEP(F2
18150 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e  , b, c, d, a, in
18160 5b 20 34 5d 2b 30 78 65 37 64 33 66 62 63 38 2c  [ 4]+0xe7d3fbc8,
18170 20 32 30 29 3b 0a 20 20 20 20 20 20 20 20 4d 44   20);.        MD
18180 35 53 54 45 50 28 46 32 2c 20 61 2c 20 62 2c 20  5STEP(F2, a, b, 
18190 63 2c 20 64 2c 20 69 6e 5b 20 39 5d 2b 30 78 32  c, d, in[ 9]+0x2
181a0 31 65 31 63 64 65 36 2c 20 20 35 29 3b 0a 20 20  1e1cde6,  5);.  
181b0 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 32        MD5STEP(F2
181c0 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e  , d, a, b, c, in
181d0 5b 31 34 5d 2b 30 78 63 33 33 37 30 37 64 36 2c  [14]+0xc33707d6,
181e0 20 20 39 29 3b 0a 20 20 20 20 20 20 20 20 4d 44    9);.        MD
181f0 35 53 54 45 50 28 46 32 2c 20 63 2c 20 64 2c 20  5STEP(F2, c, d, 
18200 61 2c 20 62 2c 20 69 6e 5b 20 33 5d 2b 30 78 66  a, b, in[ 3]+0xf
18210 34 64 35 30 64 38 37 2c 20 31 34 29 3b 0a 20 20  4d50d87, 14);.  
18220 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 32        MD5STEP(F2
18230 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e  , b, c, d, a, in
18240 5b 20 38 5d 2b 30 78 34 35 35 61 31 34 65 64 2c  [ 8]+0x455a14ed,
18250 20 32 30 29 3b 0a 20 20 20 20 20 20 20 20 4d 44   20);.        MD
18260 35 53 54 45 50 28 46 32 2c 20 61 2c 20 62 2c 20  5STEP(F2, a, b, 
18270 63 2c 20 64 2c 20 69 6e 5b 31 33 5d 2b 30 78 61  c, d, in[13]+0xa
18280 39 65 33 65 39 30 35 2c 20 20 35 29 3b 0a 20 20  9e3e905,  5);.  
18290 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 32        MD5STEP(F2
182a0 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e  , d, a, b, c, in
182b0 5b 20 32 5d 2b 30 78 66 63 65 66 61 33 66 38 2c  [ 2]+0xfcefa3f8,
182c0 20 20 39 29 3b 0a 20 20 20 20 20 20 20 20 4d 44    9);.        MD
182d0 35 53 54 45 50 28 46 32 2c 20 63 2c 20 64 2c 20  5STEP(F2, c, d, 
182e0 61 2c 20 62 2c 20 69 6e 5b 20 37 5d 2b 30 78 36  a, b, in[ 7]+0x6
182f0 37 36 66 30 32 64 39 2c 20 31 34 29 3b 0a 20 20  76f02d9, 14);.  
18300 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 32        MD5STEP(F2
18310 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e  , b, c, d, a, in
18320 5b 31 32 5d 2b 30 78 38 64 32 61 34 63 38 61 2c  [12]+0x8d2a4c8a,
18330 20 32 30 29 3b 0a 0a 20 20 20 20 20 20 20 20 4d   20);..        M
18340 44 35 53 54 45 50 28 46 33 2c 20 61 2c 20 62 2c  D5STEP(F3, a, b,
18350 20 63 2c 20 64 2c 20 69 6e 5b 20 35 5d 2b 30 78   c, d, in[ 5]+0x
18360 66 66 66 61 33 39 34 32 2c 20 20 34 29 3b 0a 20  fffa3942,  4);. 
18370 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
18380 33 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69  3, d, a, b, c, i
18390 6e 5b 20 38 5d 2b 30 78 38 37 37 31 66 36 38 31  n[ 8]+0x8771f681
183a0 2c 20 31 31 29 3b 0a 20 20 20 20 20 20 20 20 4d  , 11);.        M
183b0 44 35 53 54 45 50 28 46 33 2c 20 63 2c 20 64 2c  D5STEP(F3, c, d,
183c0 20 61 2c 20 62 2c 20 69 6e 5b 31 31 5d 2b 30 78   a, b, in[11]+0x
183d0 36 64 39 64 36 31 32 32 2c 20 31 36 29 3b 0a 20  6d9d6122, 16);. 
183e0 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
183f0 33 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69  3, b, c, d, a, i
18400 6e 5b 31 34 5d 2b 30 78 66 64 65 35 33 38 30 63  n[14]+0xfde5380c
18410 2c 20 32 33 29 3b 0a 20 20 20 20 20 20 20 20 4d  , 23);.        M
18420 44 35 53 54 45 50 28 46 33 2c 20 61 2c 20 62 2c  D5STEP(F3, a, b,
18430 20 63 2c 20 64 2c 20 69 6e 5b 20 31 5d 2b 30 78   c, d, in[ 1]+0x
18440 61 34 62 65 65 61 34 34 2c 20 20 34 29 3b 0a 20  a4beea44,  4);. 
18450 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
18460 33 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69  3, d, a, b, c, i
18470 6e 5b 20 34 5d 2b 30 78 34 62 64 65 63 66 61 39  n[ 4]+0x4bdecfa9
18480 2c 20 31 31 29 3b 0a 20 20 20 20 20 20 20 20 4d  , 11);.        M
18490 44 35 53 54 45 50 28 46 33 2c 20 63 2c 20 64 2c  D5STEP(F3, c, d,
184a0 20 61 2c 20 62 2c 20 69 6e 5b 20 37 5d 2b 30 78   a, b, in[ 7]+0x
184b0 66 36 62 62 34 62 36 30 2c 20 31 36 29 3b 0a 20  f6bb4b60, 16);. 
184c0 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
184d0 33 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69  3, b, c, d, a, i
184e0 6e 5b 31 30 5d 2b 30 78 62 65 62 66 62 63 37 30  n[10]+0xbebfbc70
184f0 2c 20 32 33 29 3b 0a 20 20 20 20 20 20 20 20 4d  , 23);.        M
18500 44 35 53 54 45 50 28 46 33 2c 20 61 2c 20 62 2c  D5STEP(F3, a, b,
18510 20 63 2c 20 64 2c 20 69 6e 5b 31 33 5d 2b 30 78   c, d, in[13]+0x
18520 32 38 39 62 37 65 63 36 2c 20 20 34 29 3b 0a 20  289b7ec6,  4);. 
18530 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
18540 33 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69  3, d, a, b, c, i
18550 6e 5b 20 30 5d 2b 30 78 65 61 61 31 32 37 66 61  n[ 0]+0xeaa127fa
18560 2c 20 31 31 29 3b 0a 20 20 20 20 20 20 20 20 4d  , 11);.        M
18570 44 35 53 54 45 50 28 46 33 2c 20 63 2c 20 64 2c  D5STEP(F3, c, d,
18580 20 61 2c 20 62 2c 20 69 6e 5b 20 33 5d 2b 30 78   a, b, in[ 3]+0x
18590 64 34 65 66 33 30 38 35 2c 20 31 36 29 3b 0a 20  d4ef3085, 16);. 
185a0 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
185b0 33 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69  3, b, c, d, a, i
185c0 6e 5b 20 36 5d 2b 30 78 30 34 38 38 31 64 30 35  n[ 6]+0x04881d05
185d0 2c 20 32 33 29 3b 0a 20 20 20 20 20 20 20 20 4d  , 23);.        M
185e0 44 35 53 54 45 50 28 46 33 2c 20 61 2c 20 62 2c  D5STEP(F3, a, b,
185f0 20 63 2c 20 64 2c 20 69 6e 5b 20 39 5d 2b 30 78   c, d, in[ 9]+0x
18600 64 39 64 34 64 30 33 39 2c 20 20 34 29 3b 0a 20  d9d4d039,  4);. 
18610 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
18620 33 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69  3, d, a, b, c, i
18630 6e 5b 31 32 5d 2b 30 78 65 36 64 62 39 39 65 35  n[12]+0xe6db99e5
18640 2c 20 31 31 29 3b 0a 20 20 20 20 20 20 20 20 4d  , 11);.        M
18650 44 35 53 54 45 50 28 46 33 2c 20 63 2c 20 64 2c  D5STEP(F3, c, d,
18660 20 61 2c 20 62 2c 20 69 6e 5b 31 35 5d 2b 30 78   a, b, in[15]+0x
18670 31 66 61 32 37 63 66 38 2c 20 31 36 29 3b 0a 20  1fa27cf8, 16);. 
18680 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
18690 33 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69  3, b, c, d, a, i
186a0 6e 5b 20 32 5d 2b 30 78 63 34 61 63 35 36 36 35  n[ 2]+0xc4ac5665
186b0 2c 20 32 33 29 3b 0a 0a 20 20 20 20 20 20 20 20  , 23);..        
186c0 4d 44 35 53 54 45 50 28 46 34 2c 20 61 2c 20 62  MD5STEP(F4, a, b
186d0 2c 20 63 2c 20 64 2c 20 69 6e 5b 20 30 5d 2b 30  , c, d, in[ 0]+0
186e0 78 66 34 32 39 32 32 34 34 2c 20 20 36 29 3b 0a  xf4292244,  6);.
186f0 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28          MD5STEP(
18700 46 34 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20  F4, d, a, b, c, 
18710 69 6e 5b 20 37 5d 2b 30 78 34 33 32 61 66 66 39  in[ 7]+0x432aff9
18720 37 2c 20 31 30 29 3b 0a 20 20 20 20 20 20 20 20  7, 10);.        
18730 4d 44 35 53 54 45 50 28 46 34 2c 20 63 2c 20 64  MD5STEP(F4, c, d
18740 2c 20 61 2c 20 62 2c 20 69 6e 5b 31 34 5d 2b 30  , a, b, in[14]+0
18750 78 61 62 39 34 32 33 61 37 2c 20 31 35 29 3b 0a  xab9423a7, 15);.
18760 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28          MD5STEP(
18770 46 34 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20  F4, b, c, d, a, 
18780 69 6e 5b 20 35 5d 2b 30 78 66 63 39 33 61 30 33  in[ 5]+0xfc93a03
18790 39 2c 20 32 31 29 3b 0a 20 20 20 20 20 20 20 20  9, 21);.        
187a0 4d 44 35 53 54 45 50 28 46 34 2c 20 61 2c 20 62  MD5STEP(F4, a, b
187b0 2c 20 63 2c 20 64 2c 20 69 6e 5b 31 32 5d 2b 30  , c, d, in[12]+0
187c0 78 36 35 35 62 35 39 63 33 2c 20 20 36 29 3b 0a  x655b59c3,  6);.
187d0 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28          MD5STEP(
187e0 46 34 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20  F4, d, a, b, c, 
187f0 69 6e 5b 20 33 5d 2b 30 78 38 66 30 63 63 63 39  in[ 3]+0x8f0ccc9
18800 32 2c 20 31 30 29 3b 0a 20 20 20 20 20 20 20 20  2, 10);.        
18810 4d 44 35 53 54 45 50 28 46 34 2c 20 63 2c 20 64  MD5STEP(F4, c, d
18820 2c 20 61 2c 20 62 2c 20 69 6e 5b 31 30 5d 2b 30  , a, b, in[10]+0
18830 78 66 66 65 66 66 34 37 64 2c 20 31 35 29 3b 0a  xffeff47d, 15);.
18840 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28          MD5STEP(
18850 46 34 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20  F4, b, c, d, a, 
18860 69 6e 5b 20 31 5d 2b 30 78 38 35 38 34 35 64 64  in[ 1]+0x85845dd
18870 31 2c 20 32 31 29 3b 0a 20 20 20 20 20 20 20 20  1, 21);.        
18880 4d 44 35 53 54 45 50 28 46 34 2c 20 61 2c 20 62  MD5STEP(F4, a, b
18890 2c 20 63 2c 20 64 2c 20 69 6e 5b 20 38 5d 2b 30  , c, d, in[ 8]+0
188a0 78 36 66 61 38 37 65 34 66 2c 20 20 36 29 3b 0a  x6fa87e4f,  6);.
188b0 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28          MD5STEP(
188c0 46 34 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20  F4, d, a, b, c, 
188d0 69 6e 5b 31 35 5d 2b 30 78 66 65 32 63 65 36 65  in[15]+0xfe2ce6e
188e0 30 2c 20 31 30 29 3b 0a 20 20 20 20 20 20 20 20  0, 10);.        
188f0 4d 44 35 53 54 45 50 28 46 34 2c 20 63 2c 20 64  MD5STEP(F4, c, d
18900 2c 20 61 2c 20 62 2c 20 69 6e 5b 20 36 5d 2b 30  , a, b, in[ 6]+0
18910 78 61 33 30 31 34 33 31 34 2c 20 31 35 29 3b 0a  xa3014314, 15);.
18920 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28          MD5STEP(
18930 46 34 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20  F4, b, c, d, a, 
18940 69 6e 5b 31 33 5d 2b 30 78 34 65 30 38 31 31 61  in[13]+0x4e0811a
18950 31 2c 20 32 31 29 3b 0a 20 20 20 20 20 20 20 20  1, 21);.        
18960 4d 44 35 53 54 45 50 28 46 34 2c 20 61 2c 20 62  MD5STEP(F4, a, b
18970 2c 20 63 2c 20 64 2c 20 69 6e 5b 20 34 5d 2b 30  , c, d, in[ 4]+0
18980 78 66 37 35 33 37 65 38 32 2c 20 20 36 29 3b 0a  xf7537e82,  6);.
18990 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28          MD5STEP(
189a0 46 34 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20  F4, d, a, b, c, 
189b0 69 6e 5b 31 31 5d 2b 30 78 62 64 33 61 66 32 33  in[11]+0xbd3af23
189c0 35 2c 20 31 30 29 3b 0a 20 20 20 20 20 20 20 20  5, 10);.        
189d0 4d 44 35 53 54 45 50 28 46 34 2c 20 63 2c 20 64  MD5STEP(F4, c, d
189e0 2c 20 61 2c 20 62 2c 20 69 6e 5b 20 32 5d 2b 30  , a, b, in[ 2]+0
189f0 78 32 61 64 37 64 32 62 62 2c 20 31 35 29 3b 0a  x2ad7d2bb, 15);.
18a00 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28          MD5STEP(
18a10 46 34 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20  F4, b, c, d, a, 
18a20 69 6e 5b 20 39 5d 2b 30 78 65 62 38 36 64 33 39  in[ 9]+0xeb86d39
18a30 31 2c 20 32 31 29 3b 0a 0a 20 20 20 20 20 20 20  1, 21);..       
18a40 20 62 75 66 5b 30 5d 20 2b 3d 20 61 3b 0a 20 20   buf[0] += a;.  
18a50 20 20 20 20 20 20 62 75 66 5b 31 5d 20 2b 3d 20        buf[1] += 
18a60 62 3b 0a 20 20 20 20 20 20 20 20 62 75 66 5b 32  b;.        buf[2
18a70 5d 20 2b 3d 20 63 3b 0a 20 20 20 20 20 20 20 20  ] += c;.        
18a80 62 75 66 5b 33 5d 20 2b 3d 20 64 3b 0a 7d 0a 0a  buf[3] += d;.}..
18a90 2f 2a 0a 20 2a 20 53 74 61 72 74 20 4d 44 35 20  /*. * Start MD5 
18aa0 61 63 63 75 6d 75 6c 61 74 69 6f 6e 2e 20 20 53  accumulation.  S
18ab0 65 74 20 62 69 74 20 63 6f 75 6e 74 20 74 6f 20  et bit count to 
18ac0 30 20 61 6e 64 20 62 75 66 66 65 72 20 74 6f 20  0 and buffer to 
18ad0 6d 79 73 74 65 72 69 6f 75 73 0a 20 2a 20 69 6e  mysterious. * in
18ae0 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 63 6f 6e  itialization con
18af0 73 74 61 6e 74 73 2e 0a 20 2a 2f 0a 73 74 61 74  stants.. */.stat
18b00 69 63 20 76 6f 69 64 20 4d 44 35 49 6e 69 74 28  ic void MD5Init(
18b10 4d 44 35 43 6f 6e 74 65 78 74 20 2a 63 74 78 29  MD5Context *ctx)
18b20 7b 0a 20 20 20 20 20 20 20 20 63 74 78 2d 3e 69  {.        ctx->i
18b30 73 49 6e 69 74 20 3d 20 31 3b 0a 20 20 20 20 20  sInit = 1;.     
18b40 20 20 20 63 74 78 2d 3e 62 75 66 5b 30 5d 20 3d     ctx->buf[0] =
18b50 20 30 78 36 37 34 35 32 33 30 31 3b 0a 20 20 20   0x67452301;.   
18b60 20 20 20 20 20 63 74 78 2d 3e 62 75 66 5b 31 5d       ctx->buf[1]
18b70 20 3d 20 30 78 65 66 63 64 61 62 38 39 3b 0a 20   = 0xefcdab89;. 
18b80 20 20 20 20 20 20 20 63 74 78 2d 3e 62 75 66 5b         ctx->buf[
18b90 32 5d 20 3d 20 30 78 39 38 62 61 64 63 66 65 3b  2] = 0x98badcfe;
18ba0 0a 20 20 20 20 20 20 20 20 63 74 78 2d 3e 62 75  .        ctx->bu
18bb0 66 5b 33 5d 20 3d 20 30 78 31 30 33 32 35 34 37  f[3] = 0x1032547
18bc0 36 3b 0a 20 20 20 20 20 20 20 20 63 74 78 2d 3e  6;.        ctx->
18bd0 62 69 74 73 5b 30 5d 20 3d 20 30 3b 0a 20 20 20  bits[0] = 0;.   
18be0 20 20 20 20 20 63 74 78 2d 3e 62 69 74 73 5b 31       ctx->bits[1
18bf0 5d 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20  ] = 0;.}../*. * 
18c00 55 70 64 61 74 65 20 63 6f 6e 74 65 78 74 20 74  Update context t
18c10 6f 20 72 65 66 6c 65 63 74 20 74 68 65 20 63 6f  o reflect the co
18c20 6e 63 61 74 65 6e 61 74 69 6f 6e 20 6f 66 20 61  ncatenation of a
18c30 6e 6f 74 68 65 72 20 62 75 66 66 65 72 20 66 75  nother buffer fu
18c40 6c 6c 0a 20 2a 20 6f 66 20 62 79 74 65 73 2e 0a  ll. * of bytes..
18c50 20 2a 2f 0a 73 74 61 74 69 63 20 0a 76 6f 69 64   */.static .void
18c60 20 4d 44 35 55 70 64 61 74 65 28 4d 44 35 43 6f   MD5Update(MD5Co
18c70 6e 74 65 78 74 20 2a 63 74 78 2c 20 63 6f 6e 73  ntext *ctx, cons
18c80 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
18c90 2a 62 75 66 2c 20 75 6e 73 69 67 6e 65 64 20 69  *buf, unsigned i
18ca0 6e 74 20 6c 65 6e 29 7b 0a 20 20 20 20 20 20 20  nt len){.       
18cb0 20 75 69 6e 74 33 32 20 74 3b 0a 0a 20 20 20 20   uint32 t;..    
18cc0 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 62 69      /* Update bi
18cd0 74 63 6f 75 6e 74 20 2a 2f 0a 0a 20 20 20 20 20  tcount */..     
18ce0 20 20 20 74 20 3d 20 63 74 78 2d 3e 62 69 74 73     t = ctx->bits
18cf0 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 20  [0];.        if 
18d00 28 28 63 74 78 2d 3e 62 69 74 73 5b 30 5d 20 3d  ((ctx->bits[0] =
18d10 20 74 20 2b 20 28 28 75 69 6e 74 33 32 29 6c 65   t + ((uint32)le
18d20 6e 20 3c 3c 20 33 29 29 20 3c 20 74 29 0a 20 20  n << 3)) < t).  
18d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 74                ct
18d40 78 2d 3e 62 69 74 73 5b 31 5d 2b 2b 3b 20 2f 2a  x->bits[1]++; /*
18d50 20 43 61 72 72 79 20 66 72 6f 6d 20 6c 6f 77 20   Carry from low 
18d60 74 6f 20 68 69 67 68 20 2a 2f 0a 20 20 20 20 20  to high */.     
18d70 20 20 20 63 74 78 2d 3e 62 69 74 73 5b 31 5d 20     ctx->bits[1] 
18d80 2b 3d 20 6c 65 6e 20 3e 3e 20 32 39 3b 0a 0a 20  += len >> 29;.. 
18d90 20 20 20 20 20 20 20 74 20 3d 20 28 74 20 3e 3e         t = (t >>
18da0 20 33 29 20 26 20 30 78 33 66 3b 20 20 20 20 2f   3) & 0x3f;    /
18db0 2a 20 42 79 74 65 73 20 61 6c 72 65 61 64 79 20  * Bytes already 
18dc0 69 6e 20 73 68 73 49 6e 66 6f 2d 3e 64 61 74 61  in shsInfo->data
18dd0 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20   */..        /* 
18de0 48 61 6e 64 6c 65 20 61 6e 79 20 6c 65 61 64 69  Handle any leadi
18df0 6e 67 20 6f 64 64 2d 73 69 7a 65 64 20 63 68 75  ng odd-sized chu
18e00 6e 6b 73 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20  nks */..        
18e10 69 66 20 28 20 74 20 29 20 7b 0a 20 20 20 20 20  if ( t ) {.     
18e20 20 20 20 20 20 20 20 20 20 20 20 75 6e 73 69 67             unsig
18e30 6e 65 64 20 63 68 61 72 20 2a 70 20 3d 20 28 75  ned char *p = (u
18e40 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 63  nsigned char *)c
18e50 74 78 2d 3e 69 6e 20 2b 20 74 3b 0a 0a 20 20 20  tx->in + t;..   
18e60 20 20 20 20 20 20 20 20 20 20 20 20 20 74 20 3d               t =
18e70 20 36 34 2d 74 3b 0a 20 20 20 20 20 20 20 20 20   64-t;.         
18e80 20 20 20 20 20 20 20 69 66 20 28 6c 65 6e 20 3c         if (len <
18e90 20 74 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20   t) {.          
18ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 65                me
18eb0 6d 63 70 79 28 70 2c 20 62 75 66 2c 20 6c 65 6e  mcpy(p, buf, len
18ec0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
18ed0 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
18ee0 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n;.             
18ef0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
18f00 20 20 20 20 20 6d 65 6d 63 70 79 28 70 2c 20 62       memcpy(p, b
18f10 75 66 2c 20 74 29 3b 0a 20 20 20 20 20 20 20 20  uf, t);.        
18f20 20 20 20 20 20 20 20 20 62 79 74 65 52 65 76 65          byteReve
18f30 72 73 65 28 63 74 78 2d 3e 69 6e 2c 20 31 36 29  rse(ctx->in, 16)
18f40 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
18f50 20 20 4d 44 35 54 72 61 6e 73 66 6f 72 6d 28 63    MD5Transform(c
18f60 74 78 2d 3e 62 75 66 2c 20 28 75 69 6e 74 33 32  tx->buf, (uint32
18f70 20 2a 29 63 74 78 2d 3e 69 6e 29 3b 0a 20 20 20   *)ctx->in);.   
18f80 20 20 20 20 20 20 20 20 20 20 20 20 20 62 75 66               buf
18f90 20 2b 3d 20 74 3b 0a 20 20 20 20 20 20 20 20 20   += t;.         
18fa0 20 20 20 20 20 20 20 6c 65 6e 20 2d 3d 20 74 3b         len -= t;
18fb0 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
18fc0 20 20 20 20 2f 2a 20 50 72 6f 63 65 73 73 20 64      /* Process d
18fd0 61 74 61 20 69 6e 20 36 34 2d 62 79 74 65 20 63  ata in 64-byte c
18fe0 68 75 6e 6b 73 20 2a 2f 0a 0a 20 20 20 20 20 20  hunks */..      
18ff0 20 20 77 68 69 6c 65 20 28 6c 65 6e 20 3e 3d 20    while (len >= 
19000 36 34 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  64) {.          
19010 20 20 20 20 20 20 6d 65 6d 63 70 79 28 63 74 78        memcpy(ctx
19020 2d 3e 69 6e 2c 20 62 75 66 2c 20 36 34 29 3b 0a  ->in, buf, 64);.
19030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19040 62 79 74 65 52 65 76 65 72 73 65 28 63 74 78 2d  byteReverse(ctx-
19050 3e 69 6e 2c 20 31 36 29 3b 0a 20 20 20 20 20 20  >in, 16);.      
19060 20 20 20 20 20 20 20 20 20 20 4d 44 35 54 72 61            MD5Tra
19070 6e 73 66 6f 72 6d 28 63 74 78 2d 3e 62 75 66 2c  nsform(ctx->buf,
19080 20 28 75 69 6e 74 33 32 20 2a 29 63 74 78 2d 3e   (uint32 *)ctx->
19090 69 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  in);.           
190a0 20 20 20 20 20 62 75 66 20 2b 3d 20 36 34 3b 0a       buf += 64;.
190b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
190c0 6c 65 6e 20 2d 3d 20 36 34 3b 0a 20 20 20 20 20  len -= 64;.     
190d0 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a     }..        /*
190e0 20 48 61 6e 64 6c 65 20 61 6e 79 20 72 65 6d 61   Handle any rema
190f0 69 6e 69 6e 67 20 62 79 74 65 73 20 6f 66 20 64  ining bytes of d
19100 61 74 61 2e 20 2a 2f 0a 0a 20 20 20 20 20 20 20  ata. */..       
19110 20 6d 65 6d 63 70 79 28 63 74 78 2d 3e 69 6e 2c   memcpy(ctx->in,
19120 20 62 75 66 2c 20 6c 65 6e 29 3b 0a 7d 0a 0a 2f   buf, len);.}../
19130 2a 0a 20 2a 20 46 69 6e 61 6c 20 77 72 61 70 75  *. * Final wrapu
19140 70 20 2d 20 70 61 64 20 74 6f 20 36 34 2d 62 79  p - pad to 64-by
19150 74 65 20 62 6f 75 6e 64 61 72 79 20 77 69 74 68  te boundary with
19160 20 74 68 65 20 62 69 74 20 70 61 74 74 65 72 6e   the bit pattern
19170 20 0a 20 2a 20 31 20 30 2a 20 28 36 34 2d 62 69   . * 1 0* (64-bi
19180 74 20 63 6f 75 6e 74 20 6f 66 20 62 69 74 73 20  t count of bits 
19190 70 72 6f 63 65 73 73 65 64 2c 20 4d 53 42 2d 66  processed, MSB-f
191a0 69 72 73 74 29 0a 20 2a 2f 0a 73 74 61 74 69 63  irst). */.static
191b0 20 76 6f 69 64 20 4d 44 35 46 69 6e 61 6c 28 75   void MD5Final(u
191c0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 64 69 67  nsigned char dig
191d0 65 73 74 5b 31 36 5d 2c 20 4d 44 35 43 6f 6e 74  est[16], MD5Cont
191e0 65 78 74 20 2a 63 74 78 29 7b 0a 20 20 20 20 20  ext *ctx){.     
191f0 20 20 20 75 6e 73 69 67 6e 65 64 20 63 6f 75 6e     unsigned coun
19200 74 3b 0a 20 20 20 20 20 20 20 20 75 6e 73 69 67  t;.        unsig
19210 6e 65 64 20 63 68 61 72 20 2a 70 3b 0a 0a 20 20  ned char *p;..  
19220 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65        /* Compute
19230 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
19240 20 6d 6f 64 20 36 34 20 2a 2f 0a 20 20 20 20 20   mod 64 */.     
19250 20 20 20 63 6f 75 6e 74 20 3d 20 28 63 74 78 2d     count = (ctx-
19260 3e 62 69 74 73 5b 30 5d 20 3e 3e 20 33 29 20 26  >bits[0] >> 3) &
19270 20 30 78 33 46 3b 0a 0a 20 20 20 20 20 20 20 20   0x3F;..        
19280 2f 2a 20 53 65 74 20 74 68 65 20 66 69 72 73 74  /* Set the first
19290 20 63 68 61 72 20 6f 66 20 70 61 64 64 69 6e 67   char of padding
192a0 20 74 6f 20 30 78 38 30 2e 20 20 54 68 69 73 20   to 0x80.  This 
192b0 69 73 20 73 61 66 65 20 73 69 6e 63 65 20 74 68  is safe since th
192c0 65 72 65 20 69 73 0a 20 20 20 20 20 20 20 20 20  ere is.         
192d0 20 20 61 6c 77 61 79 73 20 61 74 20 6c 65 61 73    always at leas
192e0 74 20 6f 6e 65 20 62 79 74 65 20 66 72 65 65 20  t one byte free 
192f0 2a 2f 0a 20 20 20 20 20 20 20 20 70 20 3d 20 63  */.        p = c
19300 74 78 2d 3e 69 6e 20 2b 20 63 6f 75 6e 74 3b 0a  tx->in + count;.
19310 20 20 20 20 20 20 20 20 2a 70 2b 2b 20 3d 20 30          *p++ = 0
19320 78 38 30 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a  x80;..        /*
19330 20 42 79 74 65 73 20 6f 66 20 70 61 64 64 69 6e   Bytes of paddin
19340 67 20 6e 65 65 64 65 64 20 74 6f 20 6d 61 6b 65  g needed to make
19350 20 36 34 20 62 79 74 65 73 20 2a 2f 0a 20 20 20   64 bytes */.   
19360 20 20 20 20 20 63 6f 75 6e 74 20 3d 20 36 34 20       count = 64 
19370 2d 20 31 20 2d 20 63 6f 75 6e 74 3b 0a 0a 20 20  - 1 - count;..  
19380 20 20 20 20 20 20 2f 2a 20 50 61 64 20 6f 75 74        /* Pad out
19390 20 74 6f 20 35 36 20 6d 6f 64 20 36 34 20 2a 2f   to 56 mod 64 */
193a0 0a 20 20 20 20 20 20 20 20 69 66 20 28 63 6f 75  .        if (cou
193b0 6e 74 20 3c 20 38 29 20 7b 0a 20 20 20 20 20 20  nt < 8) {.      
193c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 77 6f            /* Two
193d0 20 6c 6f 74 73 20 6f 66 20 70 61 64 64 69 6e 67   lots of padding
193e0 3a 20 20 50 61 64 20 74 68 65 20 66 69 72 73 74  :  Pad the first
193f0 20 62 6c 6f 63 6b 20 74 6f 20 36 34 20 62 79 74   block to 64 byt
19400 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  es */.          
19410 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 2c 20        memset(p, 
19420 30 2c 20 63 6f 75 6e 74 29 3b 0a 20 20 20 20 20  0, count);.     
19430 20 20 20 20 20 20 20 20 20 20 20 62 79 74 65 52             byteR
19440 65 76 65 72 73 65 28 63 74 78 2d 3e 69 6e 2c 20  everse(ctx->in, 
19450 31 36 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  16);.           
19460 20 20 20 20 20 4d 44 35 54 72 61 6e 73 66 6f 72       MD5Transfor
19470 6d 28 63 74 78 2d 3e 62 75 66 2c 20 28 75 69 6e  m(ctx->buf, (uin
19480 74 33 32 20 2a 29 63 74 78 2d 3e 69 6e 29 3b 0a  t32 *)ctx->in);.
19490 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
194a0 20 2f 2a 20 4e 6f 77 20 66 69 6c 6c 20 74 68 65   /* Now fill the
194b0 20 6e 65 78 74 20 62 6c 6f 63 6b 20 77 69 74 68   next block with
194c0 20 35 36 20 62 79 74 65 73 20 2a 2f 0a 20 20 20   56 bytes */.   
194d0 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d               mem
194e0 73 65 74 28 63 74 78 2d 3e 69 6e 2c 20 30 2c 20  set(ctx->in, 0, 
194f0 35 36 29 3b 0a 20 20 20 20 20 20 20 20 7d 20 65  56);.        } e
19500 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20  lse {.          
19510 20 20 20 20 20 20 2f 2a 20 50 61 64 20 62 6c 6f        /* Pad blo
19520 63 6b 20 74 6f 20 35 36 20 62 79 74 65 73 20 2a  ck to 56 bytes *
19530 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
19540 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 63    memset(p, 0, c
19550 6f 75 6e 74 2d 38 29 3b 0a 20 20 20 20 20 20 20  ount-8);.       
19560 20 7d 0a 20 20 20 20 20 20 20 20 62 79 74 65 52   }.        byteR
19570 65 76 65 72 73 65 28 63 74 78 2d 3e 69 6e 2c 20  everse(ctx->in, 
19580 31 34 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a  14);..        /*
19590 20 41 70 70 65 6e 64 20 6c 65 6e 67 74 68 20 69   Append length i
195a0 6e 20 62 69 74 73 20 61 6e 64 20 74 72 61 6e 73  n bits and trans
195b0 66 6f 72 6d 20 2a 2f 0a 20 20 20 20 20 20 20 20  form */.        
195c0 28 28 75 69 6e 74 33 32 20 2a 29 63 74 78 2d 3e  ((uint32 *)ctx->
195d0 69 6e 29 5b 20 31 34 20 5d 20 3d 20 63 74 78 2d  in)[ 14 ] = ctx-
195e0 3e 62 69 74 73 5b 30 5d 3b 0a 20 20 20 20 20 20  >bits[0];.      
195f0 20 20 28 28 75 69 6e 74 33 32 20 2a 29 63 74 78    ((uint32 *)ctx
19600 2d 3e 69 6e 29 5b 20 31 35 20 5d 20 3d 20 63 74  ->in)[ 15 ] = ct
19610 78 2d 3e 62 69 74 73 5b 31 5d 3b 0a 0a 20 20 20  x->bits[1];..   
19620 20 20 20 20 20 4d 44 35 54 72 61 6e 73 66 6f 72       MD5Transfor
19630 6d 28 63 74 78 2d 3e 62 75 66 2c 20 28 75 69 6e  m(ctx->buf, (uin
19640 74 33 32 20 2a 29 63 74 78 2d 3e 69 6e 29 3b 0a  t32 *)ctx->in);.
19650 20 20 20 20 20 20 20 20 62 79 74 65 52 65 76 65          byteReve
19660 72 73 65 28 28 75 6e 73 69 67 6e 65 64 20 63 68  rse((unsigned ch
19670 61 72 20 2a 29 63 74 78 2d 3e 62 75 66 2c 20 34  ar *)ctx->buf, 4
19680 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  );.        memcp
19690 79 28 64 69 67 65 73 74 2c 20 63 74 78 2d 3e 62  y(digest, ctx->b
196a0 75 66 2c 20 31 36 29 3b 0a 20 20 20 20 20 20 20  uf, 16);.       
196b0 20 6d 65 6d 73 65 74 28 63 74 78 2c 20 30 2c 20   memset(ctx, 0, 
196c0 73 69 7a 65 6f 66 28 63 74 78 29 29 3b 20 20 20  sizeof(ctx));   
196d0 20 2f 2a 20 49 6e 20 63 61 73 65 20 69 74 20 69   /* In case it i
196e0 73 20 73 65 6e 73 69 74 69 76 65 20 2a 2f 0a 7d  s sensitive */.}
196f0 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20  ../*.** Convert 
19700 61 20 31 32 38 2d 62 69 74 20 4d 44 35 20 64 69  a 128-bit MD5 di
19710 67 65 73 74 20 69 6e 74 6f 20 61 20 33 32 2d 64  gest into a 32-d
19720 69 67 69 74 20 62 61 73 65 2d 31 36 20 6e 75 6d  igit base-16 num
19730 62 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ber..*/.static v
19740 6f 69 64 20 4d 44 35 44 69 67 65 73 74 54 6f 42  oid MD5DigestToB
19750 61 73 65 31 36 28 75 6e 73 69 67 6e 65 64 20 63  ase16(unsigned c
19760 68 61 72 20 2a 64 69 67 65 73 74 2c 20 63 68 61  har *digest, cha
19770 72 20 2a 7a 42 75 66 29 7b 0a 20 20 73 74 61 74  r *zBuf){.  stat
19780 69 63 20 63 68 61 72 20 63 6f 6e 73 74 20 7a 45  ic char const zE
19790 6e 63 6f 64 65 5b 5d 20 3d 20 22 30 31 32 33 34  ncode[] = "01234
197a0 35 36 37 38 39 61 62 63 64 65 66 22 3b 0a 20 20  56789abcdef";.  
197b0 69 6e 74 20 69 2c 20 6a 3b 0a 0a 20 20 66 6f 72  int i, j;..  for
197c0 28 6a 3d 69 3d 30 3b 20 69 3c 31 36 3b 20 69 2b  (j=i=0; i<16; i+
197d0 2b 29 7b 0a 20 20 20 20 69 6e 74 20 61 20 3d 20  +){.    int a = 
197e0 64 69 67 65 73 74 5b 69 5d 3b 0a 20 20 20 20 7a  digest[i];.    z
197f0 42 75 66 5b 6a 2b 2b 5d 20 3d 20 7a 45 6e 63 6f  Buf[j++] = zEnco
19800 64 65 5b 28 61 3e 3e 34 29 26 30 78 66 5d 3b 0a  de[(a>>4)&0xf];.
19810 20 20 20 20 7a 42 75 66 5b 6a 2b 2b 5d 20 3d 20      zBuf[j++] = 
19820 7a 45 6e 63 6f 64 65 5b 61 20 26 20 30 78 66 5d  zEncode[a & 0xf]
19830 3b 0a 20 20 7d 0a 20 20 7a 42 75 66 5b 6a 5d 20  ;.  }.  zBuf[j] 
19840 3d 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43  = 0;.}.../*.** C
19850 6f 6e 76 65 72 74 20 61 20 31 32 38 2d 62 69 74  onvert a 128-bit
19860 20 4d 44 35 20 64 69 67 65 73 74 20 69 6e 74 6f   MD5 digest into
19870 20 73 65 71 75 65 6e 63 79 20 6f 66 20 65 69 67   sequency of eig
19880 68 74 20 35 2d 64 69 67 69 74 20 69 6e 74 65 67  ht 5-digit integ
19890 65 72 73 0a 2a 2a 20 65 61 63 68 20 72 65 70 72  ers.** each repr
198a0 65 73 65 6e 74 69 6e 67 20 31 36 20 62 69 74 73  esenting 16 bits
198b0 20 6f 66 20 74 68 65 20 64 69 67 65 73 74 20 61   of the digest a
198c0 6e 64 20 73 65 70 61 72 61 74 65 64 20 66 72 6f  nd separated fro
198d0 6d 20 65 61 63 68 0a 2a 2a 20 6f 74 68 65 72 20  m each.** other 
198e0 62 79 20 61 20 22 2d 22 20 63 68 61 72 61 63 74  by a "-" charact
198f0 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  er..*/.static vo
19900 69 64 20 4d 44 35 44 69 67 65 73 74 54 6f 42 61  id MD5DigestToBa
19910 73 65 31 30 78 38 28 75 6e 73 69 67 6e 65 64 20  se10x8(unsigned 
19920 63 68 61 72 20 64 69 67 65 73 74 5b 31 36 5d 2c  char digest[16],
19930 20 63 68 61 72 20 7a 44 69 67 65 73 74 5b 35 30   char zDigest[50
19940 5d 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  ]){.  int i, j;.
19950 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 78    unsigned int x
19960 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 69  ;.  for(i=j=0; i
19970 3c 31 36 3b 20 69 2b 3d 32 29 7b 0a 20 20 20 20  <16; i+=2){.    
19980 78 20 3d 20 64 69 67 65 73 74 5b 69 5d 2a 32 35  x = digest[i]*25
19990 36 20 2b 20 64 69 67 65 73 74 5b 69 2b 31 5d 3b  6 + digest[i+1];
199a0 0a 20 20 20 20 69 66 28 20 69 3e 30 20 29 20 7a  .    if( i>0 ) z
199b0 44 69 67 65 73 74 5b 6a 2b 2b 5d 20 3d 20 27 2d  Digest[j++] = '-
199c0 27 3b 0a 20 20 20 20 73 70 72 69 6e 74 66 28 26  ';.    sprintf(&
199d0 7a 44 69 67 65 73 74 5b 6a 5d 2c 20 22 25 30 35  zDigest[j], "%05
199e0 75 22 2c 20 78 29 3b 0a 20 20 20 20 6a 20 2b 3d  u", x);.    j +=
199f0 20 35 3b 0a 20 20 7d 0a 20 20 7a 44 69 67 65 73   5;.  }.  zDiges
19a00 74 5b 6a 5d 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  t[j] = 0;.}../*.
19a10 2a 2a 20 41 20 54 43 4c 20 63 6f 6d 6d 61 6e 64  ** A TCL command
19a20 20 66 6f 72 20 6d 64 35 2e 20 20 54 68 65 20 61   for md5.  The a
19a30 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 74  rgument is the t
19a40 65 78 74 20 74 6f 20 62 65 20 68 61 73 68 65 64  ext to be hashed
19a50 2e 20 20 54 68 65 0a 2a 2a 20 52 65 73 75 6c 74  .  The.** Result
19a60 20 69 73 20 74 68 65 20 68 61 73 68 20 69 6e 20   is the hash in 
19a70 62 61 73 65 36 34 2e 20 20 0a 2a 2f 0a 73 74 61  base64.  .*/.sta
19a80 74 69 63 20 69 6e 74 20 6d 64 35 5f 63 6d 64 28  tic int md5_cmd(
19a90 76 6f 69 64 2a 63 64 2c 20 54 63 6c 5f 49 6e 74  void*cd, Tcl_Int
19aa0 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74  erp *interp, int
19ab0 20 61 72 67 63 2c 20 63 6f 6e 73 74 20 63 68 61   argc, const cha
19ac0 72 20 2a 2a 61 72 67 76 29 7b 0a 20 20 4d 44 35  r **argv){.  MD5
19ad0 43 6f 6e 74 65 78 74 20 63 74 78 3b 0a 20 20 75  Context ctx;.  u
19ae0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 64 69 67  nsigned char dig
19af0 65 73 74 5b 31 36 5d 3b 0a 20 20 63 68 61 72 20  est[16];.  char 
19b00 7a 42 75 66 5b 35 30 5d 3b 0a 20 20 76 6f 69 64  zBuf[50];.  void
19b10 20 28 2a 63 6f 6e 76 65 72 74 65 72 29 28 75 6e   (*converter)(un
19b20 73 69 67 6e 65 64 20 63 68 61 72 2a 2c 20 63 68  signed char*, ch
19b30 61 72 2a 29 3b 0a 0a 20 20 69 66 28 20 61 72 67  ar*);..  if( arg
19b40 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=2 ){.    Tcl_
19b50 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
19b60 65 72 70 2c 22 77 72 6f 6e 67 20 23 20 61 72 67  erp,"wrong # arg
19b70 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
19b80 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20  , argv[0], .    
19b90 20 20 20 20 22 20 54 45 58 54 5c 22 22 2c 20 30      " TEXT\"", 0
19ba0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
19bb0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 4d  L_ERROR;.  }.  M
19bc0 44 35 49 6e 69 74 28 26 63 74 78 29 3b 0a 20 20  D5Init(&ctx);.  
19bd0 4d 44 35 55 70 64 61 74 65 28 26 63 74 78 2c 20  MD5Update(&ctx, 
19be0 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29  (unsigned char*)
19bf0 61 72 67 76 5b 31 5d 2c 20 28 75 6e 73 69 67 6e  argv[1], (unsign
19c00 65 64 29 73 74 72 6c 65 6e 28 61 72 67 76 5b 31  ed)strlen(argv[1
19c10 5d 29 29 3b 0a 20 20 4d 44 35 46 69 6e 61 6c 28  ]));.  MD5Final(
19c20 64 69 67 65 73 74 2c 20 26 63 74 78 29 3b 0a 20  digest, &ctx);. 
19c30 20 63 6f 6e 76 65 72 74 65 72 20 3d 20 28 76 6f   converter = (vo
19c40 69 64 28 2a 29 28 75 6e 73 69 67 6e 65 64 20 63  id(*)(unsigned c
19c50 68 61 72 2a 2c 63 68 61 72 2a 29 29 63 64 3b 0a  har*,char*))cd;.
19c60 20 20 63 6f 6e 76 65 72 74 65 72 28 64 69 67 65    converter(dige
19c70 73 74 2c 20 7a 42 75 66 29 3b 0a 20 20 54 63 6c  st, zBuf);.  Tcl
19c80 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
19c90 74 65 72 70 2c 20 7a 42 75 66 2c 20 28 63 68 61  terp, zBuf, (cha
19ca0 72 2a 29 30 29 3b 0a 20 20 72 65 74 75 72 6e 20  r*)0);.  return 
19cb0 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
19cc0 20 41 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20 74   A TCL command t
19cd0 6f 20 74 61 6b 65 20 74 68 65 20 6d 64 35 20 68  o take the md5 h
19ce0 61 73 68 20 6f 66 20 61 20 66 69 6c 65 2e 20 20  ash of a file.  
19cf0 54 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20  The argument is 
19d00 74 68 65 0a 2a 2a 20 6e 61 6d 65 20 6f 66 20 74  the.** name of t
19d10 68 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74  he file..*/.stat
19d20 69 63 20 69 6e 74 20 6d 64 35 66 69 6c 65 5f 63  ic int md5file_c
19d30 6d 64 28 76 6f 69 64 2a 63 64 2c 20 54 63 6c 5f  md(void*cd, Tcl_
19d40 49 6e 74 65 72 70 2a 69 6e 74 65 72 70 2c 20 69  Interp*interp, i
19d50 6e 74 20 61 72 67 63 2c 20 63 6f 6e 73 74 20 63  nt argc, const c
19d60 68 61 72 20 2a 2a 61 72 67 76 29 7b 0a 20 20 46  har **argv){.  F
19d70 49 4c 45 20 2a 69 6e 3b 0a 20 20 4d 44 35 43 6f  ILE *in;.  MD5Co
19d80 6e 74 65 78 74 20 63 74 78 3b 0a 20 20 76 6f 69  ntext ctx;.  voi
19d90 64 20 28 2a 63 6f 6e 76 65 72 74 65 72 29 28 75  d (*converter)(u
19da0 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 2c 20 63  nsigned char*, c
19db0 68 61 72 2a 29 3b 0a 20 20 75 6e 73 69 67 6e 65  har*);.  unsigne
19dc0 64 20 63 68 61 72 20 64 69 67 65 73 74 5b 31 36  d char digest[16
19dd0 5d 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 31  ];.  char zBuf[1
19de0 30 32 34 30 5d 3b 0a 0a 20 20 69 66 28 20 61 72  0240];..  if( ar
19df0 67 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  gc!=2 ){.    Tcl
19e00 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
19e10 74 65 72 70 2c 22 77 72 6f 6e 67 20 23 20 61 72  terp,"wrong # ar
19e20 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
19e30 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20  ", argv[0], .   
19e40 20 20 20 20 20 22 20 46 49 4c 45 4e 41 4d 45 5c       " FILENAME\
19e50 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  "", 0);.    retu
19e60 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
19e70 7d 0a 20 20 69 6e 20 3d 20 66 6f 70 65 6e 28 61  }.  in = fopen(a
19e80 72 67 76 5b 31 5d 2c 22 72 62 22 29 3b 0a 20 20  rgv[1],"rb");.  
19e90 69 66 28 20 69 6e 3d 3d 30 20 29 7b 0a 20 20 20  if( in==0 ){.   
19ea0 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
19eb0 74 28 69 6e 74 65 72 70 2c 22 75 6e 61 62 6c 65  t(interp,"unable
19ec0 20 74 6f 20 6f 70 65 6e 20 66 69 6c 65 20 5c 22   to open file \"
19ed0 22 2c 20 61 72 67 76 5b 31 5d 2c 20 0a 20 20 20  ", argv[1], .   
19ee0 20 20 20 20 20 20 22 5c 22 20 66 6f 72 20 72 65        "\" for re
19ef0 61 64 69 6e 67 22 2c 20 30 29 3b 0a 20 20 20 20  ading", 0);.    
19f00 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
19f10 3b 0a 20 20 7d 0a 20 20 4d 44 35 49 6e 69 74 28  ;.  }.  MD5Init(
19f20 26 63 74 78 29 3b 0a 20 20 66 6f 72 28 3b 3b 29  &ctx);.  for(;;)
19f30 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20  {.    int n;.   
19f40 20 6e 20 3d 20 66 72 65 61 64 28 7a 42 75 66 2c   n = fread(zBuf,
19f50 20 31 2c 20 73 69 7a 65 6f 66 28 7a 42 75 66 29   1, sizeof(zBuf)
19f60 2c 20 69 6e 29 3b 0a 20 20 20 20 69 66 28 20 6e  , in);.    if( n
19f70 3c 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  <=0 ) break;.   
19f80 20 4d 44 35 55 70 64 61 74 65 28 26 63 74 78 2c   MD5Update(&ctx,
19f90 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a   (unsigned char*
19fa0 29 7a 42 75 66 2c 20 28 75 6e 73 69 67 6e 65 64  )zBuf, (unsigned
19fb0 29 6e 29 3b 0a 20 20 7d 0a 20 20 66 63 6c 6f 73  )n);.  }.  fclos
19fc0 65 28 69 6e 29 3b 0a 20 20 4d 44 35 46 69 6e 61  e(in);.  MD5Fina
19fd0 6c 28 64 69 67 65 73 74 2c 20 26 63 74 78 29 3b  l(digest, &ctx);
19fe0 0a 20 20 63 6f 6e 76 65 72 74 65 72 20 3d 20 28  .  converter = (
19ff0 76 6f 69 64 28 2a 29 28 75 6e 73 69 67 6e 65 64  void(*)(unsigned
1a000 20 63 68 61 72 2a 2c 63 68 61 72 2a 29 29 63 64   char*,char*))cd
1a010 3b 0a 20 20 63 6f 6e 76 65 72 74 65 72 28 64 69  ;.  converter(di
1a020 67 65 73 74 2c 20 7a 42 75 66 29 3b 0a 20 20 54  gest, zBuf);.  T
1a030 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
1a040 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 28 63  interp, zBuf, (c
1a050 68 61 72 2a 29 30 29 3b 0a 20 20 72 65 74 75 72  har*)0);.  retur
1a060 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
1a070 2a 2a 20 52 65 67 69 73 74 65 72 20 74 68 65 20  ** Register the 
1a080 66 6f 75 72 20 6e 65 77 20 54 43 4c 20 63 6f 6d  four new TCL com
1a090 6d 61 6e 64 73 20 66 6f 72 20 67 65 6e 65 72 61  mands for genera
1a0a0 74 69 6e 67 20 4d 44 35 20 63 68 65 63 6b 73 75  ting MD5 checksu
1a0b0 6d 73 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 54  ms.** with the T
1a0c0 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0a  CL interpreter..
1a0d0 2a 2f 0a 69 6e 74 20 4d 64 35 5f 49 6e 69 74 28  */.int Md5_Init(
1a0e0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
1a0f0 72 70 29 7b 0a 20 20 54 63 6c 5f 43 72 65 61 74  rp){.  Tcl_Creat
1a100 65 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c  eCommand(interp,
1a110 20 22 6d 64 35 22 2c 20 28 54 63 6c 5f 43 6d 64   "md5", (Tcl_Cmd
1a120 50 72 6f 63 2a 29 6d 64 35 5f 63 6d 64 2c 0a 20  Proc*)md5_cmd,. 
1a130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a140 20 20 20 4d 44 35 44 69 67 65 73 74 54 6f 42 61     MD5DigestToBa
1a150 73 65 31 36 2c 20 30 29 3b 0a 20 20 54 63 6c 5f  se16, 0);.  Tcl_
1a160 43 72 65 61 74 65 43 6f 6d 6d 61 6e 64 28 69 6e  CreateCommand(in
1a170 74 65 72 70 2c 20 22 6d 64 35 2d 31 30 78 38 22  terp, "md5-10x8"
1a180 2c 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29  , (Tcl_CmdProc*)
1a190 6d 64 35 5f 63 6d 64 2c 0a 20 20 20 20 20 20 20  md5_cmd,.       
1a1a0 20 20 20 20 20 20 20 20 20 20 20 20 20 4d 44 35               MD5
1a1b0 44 69 67 65 73 74 54 6f 42 61 73 65 31 30 78 38  DigestToBase10x8
1a1c0 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 43 72 65 61  , 0);.  Tcl_Crea
1a1d0 74 65 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70  teCommand(interp
1a1e0 2c 20 22 6d 64 35 66 69 6c 65 22 2c 20 28 54 63  , "md5file", (Tc
1a1f0 6c 5f 43 6d 64 50 72 6f 63 2a 29 6d 64 35 66 69  l_CmdProc*)md5fi
1a200 6c 65 5f 63 6d 64 2c 0a 20 20 20 20 20 20 20 20  le_cmd,.        
1a210 20 20 20 20 20 20 20 20 20 20 20 20 4d 44 35 44              MD5D
1a220 69 67 65 73 74 54 6f 42 61 73 65 31 36 2c 20 30  igestToBase16, 0
1a230 29 3b 0a 20 20 54 63 6c 5f 43 72 65 61 74 65 43  );.  Tcl_CreateC
1a240 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22  ommand(interp, "
1a250 6d 64 35 66 69 6c 65 2d 31 30 78 38 22 2c 20 28  md5file-10x8", (
1a260 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 6d 64 35  Tcl_CmdProc*)md5
1a270 66 69 6c 65 5f 63 6d 64 2c 0a 20 20 20 20 20 20  file_cmd,.      
1a280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4d 44                MD
1a290 35 44 69 67 65 73 74 54 6f 42 61 73 65 31 30 78  5DigestToBase10x
1a2a0 38 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20  8, 0);.  return 
1a2b0 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  TCL_OK;.}.#endif
1a2c0 20 2f 2a 20 64 65 66 69 6e 65 64 28 53 51 4c 49   /* defined(SQLI
1a2d0 54 45 5f 54 45 53 54 29 20 7c 7c 20 64 65 66 69  TE_TEST) || defi
1a2e0 6e 65 64 28 53 51 4c 49 54 45 5f 54 43 4c 4d 44  ned(SQLITE_TCLMD
1a2f0 35 29 20 2a 2f 0a 0a 23 69 66 20 64 65 66 69 6e  5) */..#if defin
1a300 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a  ed(SQLITE_TEST).
1a310 2f 2a 0a 2a 2a 20 44 75 72 69 6e 67 20 74 65 73  /*.** During tes
1a320 74 69 6e 67 2c 20 74 68 65 20 73 70 65 63 69 61  ting, the specia
1a330 6c 20 6d 64 35 73 75 6d 28 29 20 61 67 67 72 65  l md5sum() aggre
1a340 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 69 73  gate function is
1a350 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 20 69   available..** i
1a360 6e 73 69 64 65 20 53 51 4c 69 74 65 2e 20 20 54  nside SQLite.  T
1a370 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75  he following rou
1a380 74 69 6e 65 73 20 69 6d 70 6c 65 6d 65 6e 74 20  tines implement 
1a390 74 68 61 74 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  that function..*
1a3a0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d 64  /.static void md
1a3b0 35 73 74 65 70 28 73 71 6c 69 74 65 33 5f 63 6f  5step(sqlite3_co
1a3c0 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20  ntext *context, 
1a3d0 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65  int argc, sqlite
1a3e0 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 29 7b  3_value **argv){
1a3f0 0a 20 20 4d 44 35 43 6f 6e 74 65 78 74 20 2a 70  .  MD5Context *p
1a400 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  ;.  int i;.  if(
1a410 20 61 72 67 63 3c 31 20 29 20 72 65 74 75 72 6e   argc<1 ) return
1a420 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f  ;.  p = sqlite3_
1a430 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78  aggregate_contex
1a440 74 28 63 6f 6e 74 65 78 74 2c 20 73 69 7a 65 6f  t(context, sizeo
1a450 66 28 2a 70 29 29 3b 0a 20 20 69 66 28 20 70 3d  f(*p));.  if( p=
1a460 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
1a470 66 28 20 21 70 2d 3e 69 73 49 6e 69 74 20 29 7b  f( !p->isInit ){
1a480 0a 20 20 20 20 4d 44 35 49 6e 69 74 28 70 29 3b  .    MD5Init(p);
1a490 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20  .  }.  for(i=0; 
1a4a0 69 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20  i<argc; i++){.  
1a4b0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
1a4c0 61 74 61 20 3d 20 28 63 68 61 72 2a 29 73 71 6c  ata = (char*)sql
1a4d0 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
1a4e0 61 72 67 76 5b 69 5d 29 3b 0a 20 20 20 20 69 66  argv[i]);.    if
1a4f0 28 20 7a 44 61 74 61 20 29 7b 0a 20 20 20 20 20  ( zData ){.     
1a500 20 4d 44 35 55 70 64 61 74 65 28 70 2c 20 28 75   MD5Update(p, (u
1a510 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 7a 44  nsigned char*)zD
1a520 61 74 61 2c 20 73 74 72 6c 65 6e 28 7a 44 61 74  ata, strlen(zDat
1a530 61 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  a));.    }.  }.}
1a540 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d 64 35  .static void md5
1a550 66 69 6e 61 6c 69 7a 65 28 73 71 6c 69 74 65 33  finalize(sqlite3
1a560 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  _context *contex
1a570 74 29 7b 0a 20 20 4d 44 35 43 6f 6e 74 65 78 74  t){.  MD5Context
1a580 20 2a 70 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20   *p;.  unsigned 
1a590 63 68 61 72 20 64 69 67 65 73 74 5b 31 36 5d 3b  char digest[16];
1a5a0 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 33 33 5d  .  char zBuf[33]
1a5b0 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f  ;.  p = sqlite3_
1a5c0 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78  aggregate_contex
1a5d0 74 28 63 6f 6e 74 65 78 74 2c 20 73 69 7a 65 6f  t(context, sizeo
1a5e0 66 28 2a 70 29 29 3b 0a 20 20 4d 44 35 46 69 6e  f(*p));.  MD5Fin
1a5f0 61 6c 28 64 69 67 65 73 74 2c 70 29 3b 0a 20 20  al(digest,p);.  
1a600 4d 44 35 44 69 67 65 73 74 54 6f 42 61 73 65 31  MD5DigestToBase1
1a610 36 28 64 69 67 65 73 74 2c 20 7a 42 75 66 29 3b  6(digest, zBuf);
1a620 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
1a630 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20  t_text(context, 
1a640 7a 42 75 66 2c 20 2d 31 2c 20 53 51 4c 49 54 45  zBuf, -1, SQLITE
1a650 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 7d 0a 69  _TRANSIENT);.}.i
1a660 6e 74 20 4d 64 35 5f 52 65 67 69 73 74 65 72 28  nt Md5_Register(
1a670 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
1a680 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33  int rc = sqlite3
1a690 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
1a6a0 28 64 62 2c 20 22 6d 64 35 73 75 6d 22 2c 20 2d  (db, "md5sum", -
1a6b0 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  1, SQLITE_UTF8, 
1a6c0 30 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20  0, 0, .         
1a6d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a6e0 20 20 20 20 20 20 20 20 6d 64 35 73 74 65 70 2c          md5step,
1a6f0 20 6d 64 35 66 69 6e 61 6c 69 7a 65 29 3b 0a 20   md5finalize);. 
1a700 20 73 71 6c 69 74 65 33 5f 6f 76 65 72 6c 6f 61   sqlite3_overloa
1a710 64 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22  d_function(db, "
1a720 6d 64 35 73 75 6d 22 2c 20 2d 31 29 3b 20 20 2f  md5sum", -1);  /
1a730 2a 20 54 6f 20 65 78 65 72 63 69 73 65 20 74 68  * To exercise th
1a740 69 73 20 41 50 49 20 2a 2f 0a 20 20 72 65 74 75  is API */.  retu
1a750 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20  rn rc;.}.#endif 
1a760 2f 2a 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  /* defined(SQLIT
1a770 45 5f 54 45 53 54 29 20 2a 2f 0a 0a 0a 2f 2a 0a  E_TEST) */.../*.
1a780 2a 2a 20 49 66 20 74 68 65 20 6d 61 63 72 6f 20  ** If the macro 
1a790 54 43 4c 53 48 20 69 73 20 6f 6e 65 2c 20 74 68  TCLSH is one, th
1a7a0 65 6e 20 70 75 74 20 69 6e 20 63 6f 64 65 20 74  en put in code t
1a7b0 68 69 73 20 66 6f 72 20 74 68 65 0a 2a 2a 20 22  his for the.** "
1a7c0 6d 61 69 6e 22 20 72 6f 75 74 69 6e 65 20 74 68  main" routine th
1a7d0 61 74 20 77 69 6c 6c 20 69 6e 69 74 69 61 6c 69  at will initiali
1a7e0 7a 65 20 54 63 6c 20 61 6e 64 20 74 61 6b 65 20  ze Tcl and take 
1a7f0 69 6e 70 75 74 20 66 72 6f 6d 0a 2a 2a 20 73 74  input from.** st
1a800 61 6e 64 61 72 64 20 69 6e 70 75 74 2c 20 6f 72  andard input, or
1a810 20 69 66 20 61 20 66 69 6c 65 20 69 73 20 6e 61   if a file is na
1a820 6d 65 64 20 6f 6e 20 74 68 65 20 63 6f 6d 6d 61  med on the comma
1a830 6e 64 20 6c 69 6e 65 0a 2a 2a 20 74 68 65 20 54  nd line.** the T
1a840 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 72  CL interpreter r
1a850 65 61 64 73 20 61 6e 64 20 65 76 61 6c 75 61 74  eads and evaluat
1a860 65 73 20 74 68 61 74 20 66 69 6c 65 2e 0a 2a 2f  es that file..*/
1a870 0a 23 69 66 20 54 43 4c 53 48 3d 3d 31 0a 73 74  .#if TCLSH==1.st
1a880 61 74 69 63 20 63 68 61 72 20 7a 4d 61 69 6e 6c  atic char zMainl
1a890 6f 6f 70 5b 5d 20 3d 0a 20 20 22 73 65 74 20 6c  oop[] =.  "set l
1a8a0 69 6e 65 20 7b 7d 5c 6e 22 0a 20 20 22 77 68 69  ine {}\n".  "whi
1a8b0 6c 65 20 7b 21 5b 65 6f 66 20 73 74 64 69 6e 5d  le {![eof stdin]
1a8c0 7d 20 7b 5c 6e 22 0a 20 20 20 20 22 69 66 20 7b  } {\n".    "if {
1a8d0 24 6c 69 6e 65 21 3d 5c 22 5c 22 7d 20 7b 5c 6e  $line!=\"\"} {\n
1a8e0 22 0a 20 20 20 20 20 20 22 70 75 74 73 20 2d 6e  ".      "puts -n
1a8f0 6f 6e 65 77 6c 69 6e 65 20 5c 22 3e 20 5c 22 5c  onewline \"> \"\
1a900 6e 22 0a 20 20 20 20 22 7d 20 65 6c 73 65 20 7b  n".    "} else {
1a910 5c 6e 22 0a 20 20 20 20 20 20 22 70 75 74 73 20  \n".      "puts 
1a920 2d 6e 6f 6e 65 77 6c 69 6e 65 20 5c 22 25 20 5c  -nonewline \"% \
1a930 22 5c 6e 22 0a 20 20 20 20 22 7d 5c 6e 22 0a 20  "\n".    "}\n". 
1a940 20 20 20 22 66 6c 75 73 68 20 73 74 64 6f 75 74     "flush stdout
1a950 5c 6e 22 0a 20 20 20 20 22 61 70 70 65 6e 64 20  \n".    "append 
1a960 6c 69 6e 65 20 5b 67 65 74 73 20 73 74 64 69 6e  line [gets stdin
1a970 5d 5c 6e 22 0a 20 20 20 20 22 69 66 20 7b 5b 69  ]\n".    "if {[i
1a980 6e 66 6f 20 63 6f 6d 70 6c 65 74 65 20 24 6c 69  nfo complete $li
1a990 6e 65 5d 7d 20 7b 5c 6e 22 0a 20 20 20 20 20 20  ne]} {\n".      
1a9a0 22 69 66 20 7b 5b 63 61 74 63 68 20 7b 75 70 6c  "if {[catch {upl
1a9b0 65 76 65 6c 20 23 30 20 24 6c 69 6e 65 7d 20 72  evel #0 $line} r
1a9c0 65 73 75 6c 74 5d 7d 20 7b 5c 6e 22 0a 20 20 20  esult]} {\n".   
1a9d0 20 20 20 20 20 22 70 75 74 73 20 73 74 64 65 72       "puts stder
1a9e0 72 20 5c 22 45 72 72 6f 72 3a 20 24 72 65 73 75  r \"Error: $resu
1a9f0 6c 74 5c 22 5c 6e 22 0a 20 20 20 20 20 20 22 7d  lt\"\n".      "}
1aa00 20 65 6c 73 65 69 66 20 7b 24 72 65 73 75 6c 74   elseif {$result
1aa10 21 3d 5c 22 5c 22 7d 20 7b 5c 6e 22 0a 20 20 20  !=\"\"} {\n".   
1aa20 20 20 20 20 20 22 70 75 74 73 20 24 72 65 73 75       "puts $resu
1aa30 6c 74 5c 6e 22 0a 20 20 20 20 20 20 22 7d 5c 6e  lt\n".      "}\n
1aa40 22 0a 20 20 20 20 20 20 22 73 65 74 20 6c 69 6e  ".      "set lin
1aa50 65 20 7b 7d 5c 6e 22 0a 20 20 20 20 22 7d 20 65  e {}\n".    "} e
1aa60 6c 73 65 20 7b 5c 6e 22 0a 20 20 20 20 20 20 22  lse {\n".      "
1aa70 61 70 70 65 6e 64 20 6c 69 6e 65 20 5c 5c 6e 5c  append line \\n\
1aa80 6e 22 0a 20 20 20 20 22 7d 5c 6e 22 0a 20 20 22  n".    "}\n".  "
1aa90 7d 5c 6e 22 0a 3b 0a 23 65 6e 64 69 66 0a 23 69  }\n".;.#endif.#i
1aaa0 66 20 54 43 4c 53 48 3d 3d 32 0a 73 74 61 74 69  f TCLSH==2.stati
1aab0 63 20 63 68 61 72 20 7a 4d 61 69 6e 6c 6f 6f 70  c char zMainloop
1aac0 5b 5d 20 3d 20 0a 23 69 6e 63 6c 75 64 65 20 22  [] = .#include "
1aad0 73 70 61 63 65 61 6e 61 6c 5f 74 63 6c 2e 68 22  spaceanal_tcl.h"
1aae0 0a 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65  .;.#endif..#ifde
1aaf0 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 73 74  f SQLITE_TEST.st
1ab00 61 74 69 63 20 76 6f 69 64 20 69 6e 69 74 5f 61  atic void init_a
1ab10 6c 6c 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 29  ll(Tcl_Interp *)
1ab20 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 69  ;.static int ini
1ab30 74 5f 61 6c 6c 5f 63 6d 64 28 0a 20 20 43 6c 69  t_all_cmd(.  Cli
1ab40 65 6e 74 44 61 74 61 20 63 64 2c 0a 20 20 54 63  entData cd,.  Tc
1ab50 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
1ab60 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
1ab70 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
1ab80 62 6a 76 5b 5d 0a 29 7b 0a 0a 20 20 54 63 6c 5f  bjv[].){..  Tcl_
1ab90 49 6e 74 65 72 70 20 2a 73 6c 61 76 65 3b 0a 20  Interp *slave;. 
1aba0 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a   if( objc!=2 ){.
1abb0 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
1abc0 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
1abd0 6f 62 6a 76 2c 20 22 53 4c 41 56 45 22 29 3b 0a  objv, "SLAVE");.
1abe0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
1abf0 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 73 6c 61  RROR;.  }..  sla
1ac00 76 65 20 3d 20 54 63 6c 5f 47 65 74 53 6c 61 76  ve = Tcl_GetSlav
1ac10 65 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  e(interp, Tcl_Ge
1ac20 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
1ac30 29 3b 0a 20 20 69 66 28 20 21 73 6c 61 76 65 20  );.  if( !slave 
1ac40 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  ){.    return TC
1ac50 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
1ac60 69 6e 69 74 5f 61 6c 6c 28 73 6c 61 76 65 29 3b  init_all(slave);
1ac70 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
1ac80 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
1ac90 2a 20 43 6f 6e 66 69 67 75 72 65 20 74 68 65 20  * Configure the 
1aca0 69 6e 74 65 72 70 72 65 74 65 72 20 70 61 73 73  interpreter pass
1acb0 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ed as the first 
1acc0 61 72 67 75 6d 65 6e 74 20 74 6f 20 68 61 76 65  argument to have
1acd0 20 61 63 63 65 73 73 0a 2a 2a 20 74 6f 20 74 68   access.** to th
1ace0 65 20 63 6f 6d 6d 61 6e 64 73 20 61 6e 64 20 6c  e commands and l
1acf0 69 6e 6b 65 64 20 76 61 72 69 61 62 6c 65 73 20  inked variables 
1ad00 74 68 61 74 20 6d 61 6b 65 20 75 70 3a 0a 2a 2a  that make up:.**
1ad10 0a 2a 2a 20 20 20 2a 20 74 68 65 20 5b 73 71 6c  .**   * the [sql
1ad20 69 74 65 33 5d 20 65 78 74 65 6e 73 69 6f 6e 20  ite3] extension 
1ad30 69 74 73 65 6c 66 2c 20 0a 2a 2a 0a 2a 2a 20 20  itself, .**.**  
1ad40 20 2a 20 49 66 20 53 51 4c 49 54 45 5f 54 43 4c   * If SQLITE_TCL
1ad50 4d 44 35 20 6f 72 20 53 51 4c 49 54 45 5f 54 45  MD5 or SQLITE_TE
1ad60 53 54 20 69 73 20 64 65 66 69 6e 65 64 2c 20 74  ST is defined, t
1ad70 68 65 20 4d 64 35 20 63 6f 6d 6d 61 6e 64 73 2c  he Md5 commands,
1ad80 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49   and.**.**   * I
1ad90 66 20 53 51 4c 49 54 45 5f 54 45 53 54 20 69 73  f SQLITE_TEST is
1ada0 20 73 65 74 2c 20 74 68 65 20 76 61 72 69 6f 75   set, the variou
1adb0 73 20 74 65 73 74 20 69 6e 74 65 72 66 61 63 65  s test interface
1adc0 73 20 75 73 65 64 20 62 79 20 74 68 65 20 54 63  s used by the Tc
1add0 6c 0a 2a 2a 20 20 20 20 20 74 65 73 74 20 73 75  l.**     test su
1ade0 69 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ite..*/.static v
1adf0 6f 69 64 20 69 6e 69 74 5f 61 6c 6c 28 54 63 6c  oid init_all(Tcl
1ae00 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29  _Interp *interp)
1ae10 7b 0a 20 20 53 71 6c 69 74 65 33 5f 49 6e 69 74  {.  Sqlite3_Init
1ae20 28 69 6e 74 65 72 70 29 3b 0a 0a 23 69 66 20 64  (interp);..#if d
1ae30 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45  efined(SQLITE_TE
1ae40 53 54 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53  ST) || defined(S
1ae50 51 4c 49 54 45 5f 54 43 4c 4d 44 35 29 0a 20 20  QLITE_TCLMD5).  
1ae60 4d 64 35 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  Md5_Init(interp)
1ae70 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66  ;.#endif..#ifdef
1ae80 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 7b   SQLITE_TEST.  {
1ae90 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20  .    extern int 
1aea0 53 71 6c 69 74 65 63 6f 6e 66 69 67 5f 49 6e 69  Sqliteconfig_Ini
1aeb0 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a  t(Tcl_Interp*);.
1aec0 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53      extern int S
1aed0 71 6c 69 74 65 74 65 73 74 31 5f 49 6e 69 74 28  qlitetest1_Init(
1aee0 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20  Tcl_Interp*);.  
1aef0 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c    extern int Sql
1af00 69 74 65 74 65 73 74 32 5f 49 6e 69 74 28 54 63  itetest2_Init(Tc
1af10 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20  l_Interp*);.    
1af20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74  extern int Sqlit
1af30 65 74 65 73 74 33 5f 49 6e 69 74 28 54 63 6c 5f  etest3_Init(Tcl_
1af40 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78  Interp*);.    ex
1af50 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74  tern int Sqlitet
1af60 65 73 74 34 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  est4_Init(Tcl_In
1af70 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65  terp*);.    exte
1af80 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73  rn int Sqlitetes
1af90 74 35 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  t5_Init(Tcl_Inte
1afa0 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e  rp*);.    extern
1afb0 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 36   int Sqlitetest6
1afc0 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
1afd0 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69  *);.    extern i
1afe0 6e 74 20 53 71 6c 69 74 65 74 65 73 74 37 5f 49  nt Sqlitetest7_I
1aff0 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29  nit(Tcl_Interp*)
1b000 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74  ;.    extern int
1b010 20 53 71 6c 69 74 65 74 65 73 74 38 5f 49 6e 69   Sqlitetest8_Ini
1b020 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a  t(Tcl_Interp*);.
1b030 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53      extern int S
1b040 71 6c 69 74 65 74 65 73 74 39 5f 49 6e 69 74 28  qlitetest9_Init(
1b050 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20  Tcl_Interp*);.  
1b060 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c    extern int Sql
1b070 69 74 65 74 65 73 74 61 73 79 6e 63 5f 49 6e 69  itetestasync_Ini
1b080 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a  t(Tcl_Interp*);.
1b090 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53      extern int S
1b0a0 71 6c 69 74 65 74 65 73 74 5f 61 75 74 6f 65 78  qlitetest_autoex
1b0b0 74 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  t_Init(Tcl_Inter
1b0c0 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20  p*);.    extern 
1b0d0 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 5f 64  int Sqlitetest_d
1b0e0 65 6d 6f 76 66 73 5f 49 6e 69 74 28 54 63 6c 5f  emovfs_Init(Tcl_
1b0f0 49 6e 74 65 72 70 20 2a 29 3b 0a 20 20 20 20 65  Interp *);.    e
1b100 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65  xtern int Sqlite
1b110 74 65 73 74 5f 66 75 6e 63 5f 49 6e 69 74 28 54  test_func_Init(T
1b120 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20  cl_Interp*);.   
1b130 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69   extern int Sqli
1b140 74 65 74 65 73 74 5f 68 65 78 69 6f 5f 49 6e 69  tetest_hexio_Ini
1b150 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a  t(Tcl_Interp*);.
1b160 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53      extern int S
1b170 71 6c 69 74 65 74 65 73 74 5f 69 6e 69 74 5f 49  qlitetest_init_I
1b180 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29  nit(Tcl_Interp*)
1b190 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74  ;.    extern int
1b1a0 20 53 71 6c 69 74 65 74 65 73 74 5f 6d 61 6c 6c   Sqlitetest_mall
1b1b0 6f 63 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  oc_Init(Tcl_Inte
1b1c0 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e  rp*);.    extern
1b1d0 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 5f   int Sqlitetest_
1b1e0 6d 75 74 65 78 5f 49 6e 69 74 28 54 63 6c 5f 49  mutex_Init(Tcl_I
1b1f0 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74  nterp*);.    ext
1b200 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65  ern int Sqlitete
1b210 73 74 73 63 68 65 6d 61 5f 49 6e 69 74 28 54 63  stschema_Init(Tc
1b220 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20  l_Interp*);.    
1b230 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74  extern int Sqlit
1b240 65 74 65 73 74 73 73 65 5f 49 6e 69 74 28 54 63  etestsse_Init(Tc
1b250 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20  l_Interp*);.    
1b260 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74  extern int Sqlit
1b270 65 74 65 73 74 74 63 6c 76 61 72 5f 49 6e 69 74  etesttclvar_Init
1b280 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20  (Tcl_Interp*);. 
1b290 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71     extern int Sq
1b2a0 6c 69 74 65 74 65 73 74 54 68 72 65 61 64 5f 49  litetestThread_I
1b2b0 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29  nit(Tcl_Interp*)
1b2c0 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74  ;.    extern int
1b2d0 20 53 71 6c 69 74 65 74 65 73 74 4f 6e 65 66 69   SqlitetestOnefi
1b2e0 6c 65 5f 49 6e 69 74 28 29 3b 0a 20 20 20 20 65  le_Init();.    e
1b2f0 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65  xtern int Sqlite
1b300 74 65 73 74 4f 73 69 6e 73 74 5f 49 6e 69 74 28  testOsinst_Init(
1b310 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20  Tcl_Interp*);.  
1b320 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c    extern int Sql
1b330 69 74 65 74 65 73 74 62 61 63 6b 75 70 5f 49 6e  itetestbackup_In
1b340 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b  it(Tcl_Interp*);
1b350 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20  .    extern int 
1b360 53 71 6c 69 74 65 74 65 73 74 69 6e 74 61 72 72  Sqlitetestintarr
1b370 61 79 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  ay_Init(Tcl_Inte
1b380 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e  rp*);.    extern
1b390 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 76   int Sqlitetestv
1b3a0 66 73 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  fs_Init(Tcl_Inte
1b3b0 72 70 20 2a 29 3b 0a 20 20 20 20 65 78 74 65 72  rp *);.    exter
1b3c0 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74  n int Sqlitetest
1b3d0 53 74 61 74 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  Stat_Init(Tcl_In
1b3e0 74 65 72 70 2a 29 3b 0a 0a 20 20 20 20 53 71 6c  terp*);..    Sql
1b3f0 69 74 65 63 6f 6e 66 69 67 5f 49 6e 69 74 28 69  iteconfig_Init(i
1b400 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69  nterp);.    Sqli
1b410 74 65 74 65 73 74 31 5f 49 6e 69 74 28 69 6e 74  tetest1_Init(int
1b420 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65  erp);.    Sqlite
1b430 74 65 73 74 32 5f 49 6e 69 74 28 69 6e 74 65 72  test2_Init(inter
1b440 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65  p);.    Sqlitete
1b450 73 74 33 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  st3_Init(interp)
1b460 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74  ;.    Sqlitetest
1b470 34 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a  4_Init(interp);.
1b480 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 35 5f      Sqlitetest5_
1b490 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  Init(interp);.  
1b4a0 20 20 53 71 6c 69 74 65 74 65 73 74 36 5f 49 6e    Sqlitetest6_In
1b4b0 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  it(interp);.    
1b4c0 53 71 6c 69 74 65 74 65 73 74 37 5f 49 6e 69 74  Sqlitetest7_Init
1b4d0 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71  (interp);.    Sq
1b4e0 6c 69 74 65 74 65 73 74 38 5f 49 6e 69 74 28 69  litetest8_Init(i
1b4f0 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69  nterp);.    Sqli
1b500 74 65 74 65 73 74 39 5f 49 6e 69 74 28 69 6e 74  tetest9_Init(int
1b510 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65  erp);.    Sqlite
1b520 74 65 73 74 61 73 79 6e 63 5f 49 6e 69 74 28 69  testasync_Init(i
1b530 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69  nterp);.    Sqli
1b540 74 65 74 65 73 74 5f 61 75 74 6f 65 78 74 5f 49  tetest_autoext_I
1b550 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20  nit(interp);.   
1b560 20 53 71 6c 69 74 65 74 65 73 74 5f 64 65 6d 6f   Sqlitetest_demo
1b570 76 66 73 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  vfs_Init(interp)
1b580 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74  ;.    Sqlitetest
1b590 5f 66 75 6e 63 5f 49 6e 69 74 28 69 6e 74 65 72  _func_Init(inter
1b5a0 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65  p);.    Sqlitete
1b5b0 73 74 5f 68 65 78 69 6f 5f 49 6e 69 74 28 69 6e  st_hexio_Init(in
1b5c0 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74  terp);.    Sqlit
1b5d0 65 74 65 73 74 5f 69 6e 69 74 5f 49 6e 69 74 28  etest_init_Init(
1b5e0 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c  interp);.    Sql
1b5f0 69 74 65 74 65 73 74 5f 6d 61 6c 6c 6f 63 5f 49  itetest_malloc_I
1b600 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20  nit(interp);.   
1b610 20 53 71 6c 69 74 65 74 65 73 74 5f 6d 75 74 65   Sqlitetest_mute
1b620 78 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a  x_Init(interp);.
1b630 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 73 63      Sqlitetestsc
1b640 68 65 6d 61 5f 49 6e 69 74 28 69 6e 74 65 72 70  hema_Init(interp
1b650 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73  );.    Sqlitetes
1b660 74 74 63 6c 76 61 72 5f 49 6e 69 74 28 69 6e 74  ttclvar_Init(int
1b670 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65  erp);.    Sqlite
1b680 74 65 73 74 54 68 72 65 61 64 5f 49 6e 69 74 28  testThread_Init(
1b690 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c  interp);.    Sql
1b6a0 69 74 65 74 65 73 74 4f 6e 65 66 69 6c 65 5f 49  itetestOnefile_I
1b6b0 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20  nit(interp);.   
1b6c0 20 53 71 6c 69 74 65 74 65 73 74 4f 73 69 6e 73   SqlitetestOsins
1b6d0 74 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a  t_Init(interp);.
1b6e0 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 62 61      Sqlitetestba
1b6f0 63 6b 75 70 5f 49 6e 69 74 28 69 6e 74 65 72 70  ckup_Init(interp
1b700 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73  );.    Sqlitetes
1b710 74 69 6e 74 61 72 72 61 79 5f 49 6e 69 74 28 69  tintarray_Init(i
1b720 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69  nterp);.    Sqli
1b730 74 65 74 65 73 74 76 66 73 5f 49 6e 69 74 28 69  tetestvfs_Init(i
1b740 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69  nterp);.    Sqli
1b750 74 65 74 65 73 74 53 74 61 74 5f 49 6e 69 74 28  tetestStat_Init(
1b760 69 6e 74 65 72 70 29 3b 0a 0a 20 20 20 20 54 63  interp);..    Tc
1b770 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61  l_CreateObjComma
1b780 6e 64 28 69 6e 74 65 72 70 2c 22 6c 6f 61 64 5f  nd(interp,"load_
1b790 74 65 73 74 66 69 78 74 75 72 65 5f 65 78 74 65  testfixture_exte
1b7a0 6e 73 69 6f 6e 73 22 2c 69 6e 69 74 5f 61 6c 6c  nsions",init_all
1b7b0 5f 63 6d 64 2c 30 2c 30 29 3b 0a 0a 23 69 66 64  _cmd,0,0);..#ifd
1b7c0 65 66 20 53 51 4c 49 54 45 5f 53 53 45 0a 20 20  ef SQLITE_SSE.  
1b7d0 20 20 53 71 6c 69 74 65 74 65 73 74 73 73 65 5f    Sqlitetestsse_
1b7e0 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 23 65  Init(interp);.#e
1b7f0 6e 64 69 66 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ndif.  }.#endif.
1b800 7d 0a 0a 23 64 65 66 69 6e 65 20 54 43 4c 53 48  }..#define TCLSH
1b810 5f 4d 41 49 4e 20 6d 61 69 6e 20 20 20 2f 2a 20  _MAIN main   /* 
1b820 4e 65 65 64 65 64 20 74 6f 20 66 61 6b 65 20 6f  Needed to fake o
1b830 75 74 20 6d 6b 74 63 6c 61 70 70 20 2a 2f 0a 69  ut mktclapp */.i
1b840 6e 74 20 54 43 4c 53 48 5f 4d 41 49 4e 28 69 6e  nt TCLSH_MAIN(in
1b850 74 20 61 72 67 63 2c 20 63 68 61 72 20 2a 2a 61  t argc, char **a
1b860 72 67 76 29 7b 0a 20 20 54 63 6c 5f 49 6e 74 65  rgv){.  Tcl_Inte
1b870 72 70 20 2a 69 6e 74 65 72 70 3b 0a 20 20 0a 20  rp *interp;.  . 
1b880 20 2f 2a 20 43 61 6c 6c 20 73 71 6c 69 74 65 33   /* Call sqlite3
1b890 5f 73 68 75 74 64 6f 77 6e 28 29 20 6f 6e 63 65  _shutdown() once
1b8a0 20 62 65 66 6f 72 65 20 64 6f 69 6e 67 20 61 6e   before doing an
1b8b0 79 74 68 69 6e 67 20 65 6c 73 65 2e 20 54 68 69  ything else. Thi
1b8c0 73 20 69 73 20 74 6f 0a 20 20 2a 2a 20 74 65 73  s is to.  ** tes
1b8d0 74 20 74 68 61 74 20 73 71 6c 69 74 65 33 5f 73  t that sqlite3_s
1b8e0 68 75 74 64 6f 77 6e 28 29 20 63 61 6e 20 62 65  hutdown() can be
1b8f0 20 73 61 66 65 6c 79 20 63 61 6c 6c 65 64 20 62   safely called b
1b900 79 20 61 20 70 72 6f 63 65 73 73 20 62 65 66 6f  y a process befo
1b910 72 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f  re.  ** sqlite3_
1b920 69 6e 69 74 69 61 6c 69 7a 65 28 29 20 69 73 2e  initialize() is.
1b930 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 68   */.  sqlite3_sh
1b940 75 74 64 6f 77 6e 28 29 3b 0a 0a 23 69 66 20 54  utdown();..#if T
1b950 43 4c 53 48 3d 3d 32 0a 20 20 73 71 6c 69 74 65  CLSH==2.  sqlite
1b960 33 5f 63 6f 6e 66 69 67 28 53 51 4c 49 54 45 5f  3_config(SQLITE_
1b970 43 4f 4e 46 49 47 5f 53 49 4e 47 4c 45 54 48 52  CONFIG_SINGLETHR
1b980 45 41 44 29 3b 0a 23 65 6e 64 69 66 0a 20 20 54  EAD);.#endif.  T
1b990 63 6c 5f 46 69 6e 64 45 78 65 63 75 74 61 62 6c  cl_FindExecutabl
1b9a0 65 28 61 72 67 76 5b 30 5d 29 3b 0a 0a 20 20 69  e(argv[0]);..  i
1b9b0 6e 74 65 72 70 20 3d 20 54 63 6c 5f 43 72 65 61  nterp = Tcl_Crea
1b9c0 74 65 49 6e 74 65 72 70 28 29 3b 0a 20 20 69 6e  teInterp();.  in
1b9d0 69 74 5f 61 6c 6c 28 69 6e 74 65 72 70 29 3b 0a  it_all(interp);.
1b9e0 20 20 69 66 28 20 61 72 67 63 3e 3d 32 20 29 7b    if( argc>=2 ){
1b9f0 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
1ba00 63 68 61 72 20 7a 41 72 67 63 5b 33 32 5d 3b 0a  char zArgc[32];.
1ba10 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
1ba20 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 41 72 67  intf(sizeof(zArg
1ba30 63 29 2c 20 7a 41 72 67 63 2c 20 22 25 64 22 2c  c), zArgc, "%d",
1ba40 20 61 72 67 63 2d 28 33 2d 54 43 4c 53 48 29 29   argc-(3-TCLSH))
1ba50 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 56 61 72  ;.    Tcl_SetVar
1ba60 28 69 6e 74 65 72 70 2c 22 61 72 67 63 22 2c 20  (interp,"argc", 
1ba70 7a 41 72 67 63 2c 20 54 43 4c 5f 47 4c 4f 42 41  zArgc, TCL_GLOBA
1ba80 4c 5f 4f 4e 4c 59 29 3b 0a 20 20 20 20 54 63 6c  L_ONLY);.    Tcl
1ba90 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c 22  _SetVar(interp,"
1baa0 61 72 67 76 30 22 2c 61 72 67 76 5b 31 5d 2c 54  argv0",argv[1],T
1bab0 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b  CL_GLOBAL_ONLY);
1bac0 0a 20 20 20 20 54 63 6c 5f 53 65 74 56 61 72 28  .    Tcl_SetVar(
1bad0 69 6e 74 65 72 70 2c 22 61 72 67 76 22 2c 20 22  interp,"argv", "
1bae0 22 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e  ", TCL_GLOBAL_ON
1baf0 4c 59 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 33  LY);.    for(i=3
1bb00 2d 54 43 4c 53 48 3b 20 69 3c 61 72 67 63 3b 20  -TCLSH; i<argc; 
1bb10 69 2b 2b 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  i++){.      Tcl_
1bb20 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c 20 22  SetVar(interp, "
1bb30 61 72 67 76 22 2c 20 61 72 67 76 5b 69 5d 2c 0a  argv", argv[i],.
1bb40 20 20 20 20 20 20 20 20 20 20 54 43 4c 5f 47 4c            TCL_GL
1bb50 4f 42 41 4c 5f 4f 4e 4c 59 20 7c 20 54 43 4c 5f  OBAL_ONLY | TCL_
1bb60 4c 49 53 54 5f 45 4c 45 4d 45 4e 54 20 7c 20 54  LIST_ELEMENT | T
1bb70 43 4c 5f 41 50 50 45 4e 44 5f 56 41 4c 55 45 29  CL_APPEND_VALUE)
1bb80 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1bb90 54 43 4c 53 48 3d 3d 31 20 26 26 20 54 63 6c 5f  TCLSH==1 && Tcl_
1bba0 45 76 61 6c 46 69 6c 65 28 69 6e 74 65 72 70 2c  EvalFile(interp,
1bbb0 20 61 72 67 76 5b 31 5d 29 21 3d 54 43 4c 5f 4f   argv[1])!=TCL_O
1bbc0 4b 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  K ){.      const
1bbd0 20 63 68 61 72 20 2a 7a 49 6e 66 6f 20 3d 20 54   char *zInfo = T
1bbe0 63 6c 5f 47 65 74 56 61 72 28 69 6e 74 65 72 70  cl_GetVar(interp
1bbf0 2c 20 22 65 72 72 6f 72 49 6e 66 6f 22 2c 20 54  , "errorInfo", T
1bc00 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b  CL_GLOBAL_ONLY);
1bc10 0a 20 20 20 20 20 20 69 66 28 20 7a 49 6e 66 6f  .      if( zInfo
1bc20 3d 3d 30 20 29 20 7a 49 6e 66 6f 20 3d 20 54 63  ==0 ) zInfo = Tc
1bc30 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c  l_GetStringResul
1bc40 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 20  t(interp);.     
1bc50 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
1bc60 22 25 73 3a 20 25 73 5c 6e 22 2c 20 2a 61 72 67  "%s: %s\n", *arg
1bc70 76 2c 20 7a 49 6e 66 6f 29 3b 0a 20 20 20 20 20  v, zInfo);.     
1bc80 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
1bc90 0a 20 20 7d 0a 20 20 69 66 28 20 54 43 4c 53 48  .  }.  if( TCLSH
1bca0 3d 3d 32 20 7c 7c 20 61 72 67 63 3c 3d 31 20 29  ==2 || argc<=1 )
1bcb0 7b 0a 20 20 20 20 54 63 6c 5f 47 6c 6f 62 61 6c  {.    Tcl_Global
1bcc0 45 76 61 6c 28 69 6e 74 65 72 70 2c 20 7a 4d 61  Eval(interp, zMa
1bcd0 69 6e 6c 6f 6f 70 29 3b 0a 20 20 7d 0a 20 20 72  inloop);.  }.  r
1bce0 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69  eturn 0;.}.#endi
1bcf0 66 20 2f 2a 20 54 43 4c 53 48 20 2a 2f 0a        f /* TCLSH */.