/ Hex Artifact Content
Login

Artifact 4de81521174fedacd8393ea7b70b730ce17f8eae:


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 4c 6f  /.  Tcl_Obj *pLo
1240: 67 48 6f 6f 6b 3b 20 20 20 20 20 20 20 20 20 2f  gHook;         /
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 4c 6f 67 48 6f 6f 6b 20 29 7b 0a 20 20 20 20  pLogHook ){.    
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 4c 6f 67 48 6f 6f 6b 29 3b  (pDb->pLogHook);
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 73 74  terp);.  }.}..st
4600: 61 74 69 63 20 69 6e 74 20 44 62 4c 6f 67 48 61  atic int DbLogHa
4610: 6e 64 6c 65 72 28 0a 20 20 76 6f 69 64 20 2a 63  ndler(.  void *c
4620: 6c 69 65 6e 74 44 61 74 61 2c 20 0a 20 20 73 71  lientData, .  sq
4630: 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20 20 63 6f  lite3 *db, .  co
4640: 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 2c 20 0a  nst char *zDb, .
4650: 20 20 69 6e 74 20 6e 45 6e 74 72 79 0a 29 7b 0a    int nEntry.){.
4660: 20 20 69 6e 74 20 72 65 74 20 3d 20 30 3b 0a 20    int ret = 0;. 
4670: 20 54 63 6c 5f 4f 62 6a 20 2a 70 3b 0a 20 20 53   Tcl_Obj *p;.  S
4680: 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28  qliteDb *pDb = (
4690: 53 71 6c 69 74 65 44 62 2a 29 63 6c 69 65 6e 74  SqliteDb*)client
46a0: 44 61 74 61 3b 0a 20 20 54 63 6c 5f 49 6e 74 65  Data;.  Tcl_Inte
46b0: 72 70 20 2a 69 6e 74 65 72 70 20 3d 20 70 44 62  rp *interp = pDb
46c0: 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 61 73 73 65  ->interp;.  asse
46d0: 72 74 28 70 44 62 2d 3e 70 4c 6f 67 48 6f 6f 6b  rt(pDb->pLogHook
46e0: 29 3b 0a 0a 20 20 70 20 3d 20 54 63 6c 5f 44 75  );..  p = Tcl_Du
46f0: 70 6c 69 63 61 74 65 4f 62 6a 28 70 44 62 2d 3e  plicateObj(pDb->
4700: 70 4c 6f 67 48 6f 6f 6b 29 3b 0a 20 20 54 63 6c  pLogHook);.  Tcl
4710: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 29  _IncrRefCount(p)
4720: 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  ;.  Tcl_ListObjA
4730: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
4740: 65 72 70 2c 20 70 2c 20 54 63 6c 5f 4e 65 77 53  erp, p, Tcl_NewS
4750: 74 72 69 6e 67 4f 62 6a 28 7a 44 62 2c 20 2d 31  tringObj(zDb, -1
4760: 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ));.  Tcl_ListOb
4770: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
4780: 6e 74 65 72 70 2c 20 70 2c 20 54 63 6c 5f 4e 65  nterp, p, Tcl_Ne
4790: 77 49 6e 74 4f 62 6a 28 6e 45 6e 74 72 79 29 29  wIntObj(nEntry))
47a0: 3b 0a 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d  ;.  if( TCL_OK!=
47b0: 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69 6e  Tcl_EvalObjEx(in
47c0: 74 65 72 70 2c 20 70 2c 20 30 29 20 0a 20 20 20  terp, p, 0) .   
47d0: 7c 7c 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47  || TCL_OK!=Tcl_G
47e0: 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
47f0: 65 72 70 2c 20 54 63 6c 5f 47 65 74 4f 62 6a 52  erp, Tcl_GetObjR
4800: 65 73 75 6c 74 28 69 6e 74 65 72 70 29 2c 20 26  esult(interp), &
4810: 72 65 74 29 0a 20 20 29 7b 0a 20 20 20 20 54 63  ret).  ){.    Tc
4820: 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f  l_BackgroundErro
4830: 72 28 69 6e 74 65 72 70 29 3b 0a 20 20 7d 0a 20  r(interp);.  }. 
4840: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
4850: 74 28 70 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  t(p);..  return 
4860: 72 65 74 3b 0a 7d 0a 0a 23 69 66 20 64 65 66 69  ret;.}..#if defi
4870: 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29  ned(SQLITE_TEST)
4880: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
4890: 54 45 5f 45 4e 41 42 4c 45 5f 55 4e 4c 4f 43 4b  TE_ENABLE_UNLOCK
48a0: 5f 4e 4f 54 49 46 59 29 0a 73 74 61 74 69 63 20  _NOTIFY).static 
48b0: 76 6f 69 64 20 73 65 74 54 65 73 74 55 6e 6c 6f  void setTestUnlo
48c0: 63 6b 4e 6f 74 69 66 79 56 61 72 73 28 54 63 6c  ckNotifyVars(Tcl
48d0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
48e0: 20 69 6e 74 20 69 41 72 67 2c 20 69 6e 74 20 6e   int iArg, int n
48f0: 41 72 67 29 7b 0a 20 20 63 68 61 72 20 7a 42 75  Arg){.  char zBu
4900: 66 5b 36 34 5d 3b 0a 20 20 73 70 72 69 6e 74 66  f[64];.  sprintf
4910: 28 7a 42 75 66 2c 20 22 25 64 22 2c 20 69 41 72  (zBuf, "%d", iAr
4920: 67 29 3b 0a 20 20 54 63 6c 5f 53 65 74 56 61 72  g);.  Tcl_SetVar
4930: 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65  (interp, "sqlite
4940: 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79 5f 61  _unlock_notify_a
4950: 72 67 22 2c 20 7a 42 75 66 2c 20 54 43 4c 5f 47  rg", zBuf, TCL_G
4960: 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 20 20 73  LOBAL_ONLY);.  s
4970: 70 72 69 6e 74 66 28 7a 42 75 66 2c 20 22 25 64  printf(zBuf, "%d
4980: 22 2c 20 6e 41 72 67 29 3b 0a 20 20 54 63 6c 5f  ", nArg);.  Tcl_
4990: 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c 20 22  SetVar(interp, "
49a0: 73 71 6c 69 74 65 5f 75 6e 6c 6f 63 6b 5f 6e 6f  sqlite_unlock_no
49b0: 74 69 66 79 5f 61 72 67 63 6f 75 6e 74 22 2c 20  tify_argcount", 
49c0: 7a 42 75 66 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c  zBuf, TCL_GLOBAL
49d0: 5f 4f 4e 4c 59 29 3b 0a 7d 0a 23 65 6c 73 65 0a  _ONLY);.}.#else.
49e0: 23 20 64 65 66 69 6e 65 20 73 65 74 54 65 73 74  # define setTest
49f0: 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 56 61 72 73  UnlockNotifyVars
4a00: 28 78 2c 79 2c 7a 29 0a 23 65 6e 64 69 66 0a 0a  (x,y,z).#endif..
4a10: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
4a20: 41 42 4c 45 5f 55 4e 4c 4f 43 4b 5f 4e 4f 54 49  ABLE_UNLOCK_NOTI
4a30: 46 59 0a 73 74 61 74 69 63 20 76 6f 69 64 20 44  FY.static void D
4a40: 62 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 28 76 6f  bUnlockNotify(vo
4a50: 69 64 20 2a 2a 61 70 41 72 67 2c 20 69 6e 74 20  id **apArg, int 
4a60: 6e 41 72 67 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  nArg){.  int i;.
4a70: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72    for(i=0; i<nAr
4a80: 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e  g; i++){.    con
4a90: 73 74 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 28  st int flags = (
4aa0: 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 7c  TCL_EVAL_GLOBAL|
4ab0: 54 43 4c 5f 45 56 41 4c 5f 44 49 52 45 43 54 29  TCL_EVAL_DIRECT)
4ac0: 3b 0a 20 20 20 20 53 71 6c 69 74 65 44 62 20 2a  ;.    SqliteDb *
4ad0: 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62 20  pDb = (SqliteDb 
4ae0: 2a 29 61 70 41 72 67 5b 69 5d 3b 0a 20 20 20 20  *)apArg[i];.    
4af0: 73 65 74 54 65 73 74 55 6e 6c 6f 63 6b 4e 6f 74  setTestUnlockNot
4b00: 69 66 79 56 61 72 73 28 70 44 62 2d 3e 69 6e 74  ifyVars(pDb->int
4b10: 65 72 70 2c 20 69 2c 20 6e 41 72 67 29 3b 0a 20  erp, i, nArg);. 
4b20: 20 20 20 61 73 73 65 72 74 28 20 70 44 62 2d 3e     assert( pDb->
4b30: 70 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 29 3b 0a  pUnlockNotify);.
4b40: 20 20 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45      Tcl_EvalObjE
4b50: 78 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20 70  x(pDb->interp, p
4b60: 44 62 2d 3e 70 55 6e 6c 6f 63 6b 4e 6f 74 69 66  Db->pUnlockNotif
4b70: 79 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 54  y, flags);.    T
4b80: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
4b90: 70 44 62 2d 3e 70 55 6e 6c 6f 63 6b 4e 6f 74 69  pDb->pUnlockNoti
4ba0: 66 79 29 3b 0a 20 20 20 20 70 44 62 2d 3e 70 55  fy);.    pDb->pU
4bb0: 6e 6c 6f 63 6b 4e 6f 74 69 66 79 20 3d 20 30 3b  nlockNotify = 0;
4bc0: 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 73  .  }.}.#endif..s
4bd0: 74 61 74 69 63 20 76 6f 69 64 20 44 62 55 70 64  tatic void DbUpd
4be0: 61 74 65 48 61 6e 64 6c 65 72 28 0a 20 20 76 6f  ateHandler(.  vo
4bf0: 69 64 20 2a 70 2c 20 0a 20 20 69 6e 74 20 6f 70  id *p, .  int op
4c00: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
4c10: 7a 44 62 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68  zDb, .  const ch
4c20: 61 72 20 2a 7a 54 62 6c 2c 20 0a 20 20 73 71 6c  ar *zTbl, .  sql
4c30: 69 74 65 5f 69 6e 74 36 34 20 72 6f 77 69 64 0a  ite_int64 rowid.
4c40: 29 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70  ){.  SqliteDb *p
4c50: 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62 20 2a  Db = (SqliteDb *
4c60: 29 70 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  )p;.  Tcl_Obj *p
4c70: 43 6d 64 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  Cmd;..  assert( 
4c80: 70 44 62 2d 3e 70 55 70 64 61 74 65 48 6f 6f 6b  pDb->pUpdateHook
4c90: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70   );.  assert( op
4ca0: 3d 3d 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 20  ==SQLITE_INSERT 
4cb0: 7c 7c 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 55 50  || op==SQLITE_UP
4cc0: 44 41 54 45 20 7c 7c 20 6f 70 3d 3d 53 51 4c 49  DATE || op==SQLI
4cd0: 54 45 5f 44 45 4c 45 54 45 20 29 3b 0a 0a 20 20  TE_DELETE );..  
4ce0: 70 43 6d 64 20 3d 20 54 63 6c 5f 44 75 70 6c 69  pCmd = Tcl_Dupli
4cf0: 63 61 74 65 4f 62 6a 28 70 44 62 2d 3e 70 55 70  cateObj(pDb->pUp
4d00: 64 61 74 65 48 6f 6f 6b 29 3b 0a 20 20 54 63 6c  dateHook);.  Tcl
4d10: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 43  _IncrRefCount(pC
4d20: 6d 64 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f  md);.  Tcl_ListO
4d30: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
4d40: 30 2c 20 70 43 6d 64 2c 20 54 63 6c 5f 4e 65 77  0, pCmd, Tcl_New
4d50: 53 74 72 69 6e 67 4f 62 6a 28 0a 20 20 20 20 28  StringObj(.    (
4d60: 20 28 6f 70 3d 3d 53 51 4c 49 54 45 5f 49 4e 53   (op==SQLITE_INS
4d70: 45 52 54 29 3f 22 49 4e 53 45 52 54 22 3a 28 6f  ERT)?"INSERT":(o
4d80: 70 3d 3d 53 51 4c 49 54 45 5f 55 50 44 41 54 45  p==SQLITE_UPDATE
4d90: 29 3f 22 55 50 44 41 54 45 22 3a 22 44 45 4c 45  )?"UPDATE":"DELE
4da0: 54 45 22 29 2c 20 2d 31 29 29 3b 0a 20 20 54 63  TE"), -1));.  Tc
4db0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
4dc0: 6c 65 6d 65 6e 74 28 30 2c 20 70 43 6d 64 2c 20  lement(0, pCmd, 
4dd0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
4de0: 28 7a 44 62 2c 20 2d 31 29 29 3b 0a 20 20 54 63  (zDb, -1));.  Tc
4df0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
4e00: 6c 65 6d 65 6e 74 28 30 2c 20 70 43 6d 64 2c 20  lement(0, pCmd, 
4e10: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
4e20: 28 7a 54 62 6c 2c 20 2d 31 29 29 3b 0a 20 20 54  (zTbl, -1));.  T
4e30: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
4e40: 45 6c 65 6d 65 6e 74 28 30 2c 20 70 43 6d 64 2c  Element(0, pCmd,
4e50: 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f   Tcl_NewWideIntO
4e60: 62 6a 28 72 6f 77 69 64 29 29 3b 0a 20 20 54 63  bj(rowid));.  Tc
4e70: 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70 44 62 2d  l_EvalObjEx(pDb-
4e80: 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c 20 54  >interp, pCmd, T
4e90: 43 4c 5f 45 56 41 4c 5f 44 49 52 45 43 54 29 3b  CL_EVAL_DIRECT);
4ea0: 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
4eb0: 74 63 6c 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64  tclCollateNeeded
4ec0: 28 0a 20 20 76 6f 69 64 20 2a 70 43 74 78 2c 0a  (.  void *pCtx,.
4ed0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20    sqlite3 *db,. 
4ee0: 20 69 6e 74 20 65 6e 63 2c 0a 20 20 63 6f 6e 73   int enc,.  cons
4ef0: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 0a 29 7b  t char *zName.){
4f00: 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62  .  SqliteDb *pDb
4f10: 20 3d 20 28 53 71 6c 69 74 65 44 62 20 2a 29 70   = (SqliteDb *)p
4f20: 43 74 78 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  Ctx;.  Tcl_Obj *
4f30: 70 53 63 72 69 70 74 20 3d 20 54 63 6c 5f 44 75  pScript = Tcl_Du
4f40: 70 6c 69 63 61 74 65 4f 62 6a 28 70 44 62 2d 3e  plicateObj(pDb->
4f50: 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64 29 3b  pCollateNeeded);
4f60: 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f  .  Tcl_IncrRefCo
4f70: 75 6e 74 28 70 53 63 72 69 70 74 29 3b 0a 20 20  unt(pScript);.  
4f80: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
4f90: 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 53 63 72  dElement(0, pScr
4fa0: 69 70 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  ipt, Tcl_NewStri
4fb0: 6e 67 4f 62 6a 28 7a 4e 61 6d 65 2c 20 2d 31 29  ngObj(zName, -1)
4fc0: 29 3b 0a 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a  );.  Tcl_EvalObj
4fd0: 45 78 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20  Ex(pDb->interp, 
4fe0: 70 53 63 72 69 70 74 2c 20 30 29 3b 0a 20 20 54  pScript, 0);.  T
4ff0: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
5000: 70 53 63 72 69 70 74 29 3b 0a 7d 0a 0a 2f 2a 0a  pScript);.}../*.
5010: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
5020: 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 65 76 61  is called to eva
5030: 6c 75 61 74 65 20 61 6e 20 53 51 4c 20 63 6f 6c  luate an SQL col
5040: 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20  lation function 
5050: 69 6d 70 6c 65 6d 65 6e 74 65 64 0a 2a 2a 20 75  implemented.** u
5060: 73 69 6e 67 20 54 43 4c 20 73 63 72 69 70 74 2e  sing TCL script.
5070: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
5080: 63 6c 53 71 6c 43 6f 6c 6c 61 74 65 28 0a 20 20  clSqlCollate(.  
5090: 76 6f 69 64 20 2a 70 43 74 78 2c 0a 20 20 69 6e  void *pCtx,.  in
50a0: 74 20 6e 41 2c 0a 20 20 63 6f 6e 73 74 20 76 6f  t nA,.  const vo
50b0: 69 64 20 2a 7a 41 2c 0a 20 20 69 6e 74 20 6e 42  id *zA,.  int nB
50c0: 2c 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  ,.  const void *
50d0: 7a 42 0a 29 7b 0a 20 20 53 71 6c 43 6f 6c 6c 61  zB.){.  SqlColla
50e0: 74 65 20 2a 70 20 3d 20 28 53 71 6c 43 6f 6c 6c  te *p = (SqlColl
50f0: 61 74 65 20 2a 29 70 43 74 78 3b 0a 20 20 54 63  ate *)pCtx;.  Tc
5100: 6c 5f 4f 62 6a 20 2a 70 43 6d 64 3b 0a 0a 20 20  l_Obj *pCmd;..  
5110: 70 43 6d 64 20 3d 20 54 63 6c 5f 4e 65 77 53 74  pCmd = Tcl_NewSt
5120: 72 69 6e 67 4f 62 6a 28 70 2d 3e 7a 53 63 72 69  ringObj(p->zScri
5130: 70 74 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 49  pt, -1);.  Tcl_I
5140: 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 43 6d 64  ncrRefCount(pCmd
5150: 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  );.  Tcl_ListObj
5160: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 70 2d  AppendElement(p-
5170: 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c 20 54  >interp, pCmd, T
5180: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
5190: 7a 41 2c 20 6e 41 29 29 3b 0a 20 20 54 63 6c 5f  zA, nA));.  Tcl_
51a0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
51b0: 6d 65 6e 74 28 70 2d 3e 69 6e 74 65 72 70 2c 20  ment(p->interp, 
51c0: 70 43 6d 64 2c 20 54 63 6c 5f 4e 65 77 53 74 72  pCmd, Tcl_NewStr
51d0: 69 6e 67 4f 62 6a 28 7a 42 2c 20 6e 42 29 29 3b  ingObj(zB, nB));
51e0: 0a 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78  .  Tcl_EvalObjEx
51f0: 28 70 2d 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64  (p->interp, pCmd
5200: 2c 20 54 43 4c 5f 45 56 41 4c 5f 44 49 52 45 43  , TCL_EVAL_DIREC
5210: 54 29 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52 65  T);.  Tcl_DecrRe
5220: 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20  fCount(pCmd);.  
5230: 72 65 74 75 72 6e 20 28 61 74 6f 69 28 54 63 6c  return (atoi(Tcl
5240: 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74  _GetStringResult
5250: 28 70 2d 3e 69 6e 74 65 72 70 29 29 29 3b 0a 7d  (p->interp)));.}
5260: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
5270: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74  tine is called t
5280: 6f 20 65 76 61 6c 75 61 74 65 20 61 6e 20 53 51  o evaluate an SQ
5290: 4c 20 66 75 6e 63 74 69 6f 6e 20 69 6d 70 6c 65  L function imple
52a0: 6d 65 6e 74 65 64 0a 2a 2a 20 75 73 69 6e 67 20  mented.** using 
52b0: 54 43 4c 20 73 63 72 69 70 74 2e 0a 2a 2f 0a 73  TCL script..*/.s
52c0: 74 61 74 69 63 20 76 6f 69 64 20 74 63 6c 53 71  tatic void tclSq
52d0: 6c 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f  lFunc(sqlite3_co
52e0: 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20  ntext *context, 
52f0: 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65  int argc, sqlite
5300: 33 5f 76 61 6c 75 65 2a 2a 61 72 67 76 29 7b 0a  3_value**argv){.
5310: 20 20 53 71 6c 46 75 6e 63 20 2a 70 20 3d 20 73    SqlFunc *p = s
5320: 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61  qlite3_user_data
5330: 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 54 63 6c  (context);.  Tcl
5340: 5f 4f 62 6a 20 2a 70 43 6d 64 3b 0a 20 20 69 6e  _Obj *pCmd;.  in
5350: 74 20 69 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  t i;.  int rc;..
5360: 20 20 69 66 28 20 61 72 67 63 3d 3d 30 20 29 7b    if( argc==0 ){
5370: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
5380: 20 61 72 65 20 6e 6f 20 61 72 67 75 6d 65 6e 74   are no argument
5390: 73 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f  s to the functio
53a0: 6e 2c 20 63 61 6c 6c 20 54 63 6c 5f 45 76 61 6c  n, call Tcl_Eval
53b0: 4f 62 6a 45 78 20 6f 6e 20 74 68 65 0a 20 20 20  ObjEx on the.   
53c0: 20 2a 2a 20 73 63 72 69 70 74 20 6f 62 6a 65 63   ** script objec
53d0: 74 20 64 69 72 65 63 74 6c 79 2e 20 20 54 68 69  t directly.  Thi
53e0: 73 20 61 6c 6c 6f 77 73 20 74 68 65 20 54 43 4c  s allows the TCL
53f0: 20 63 6f 6d 70 69 6c 65 72 20 74 6f 20 67 65 6e   compiler to gen
5400: 65 72 61 74 65 0a 20 20 20 20 2a 2a 20 62 79 74  erate.    ** byt
5410: 65 63 6f 64 65 20 66 6f 72 20 74 68 65 20 63 6f  ecode for the co
5420: 6d 6d 61 6e 64 20 6f 6e 20 74 68 65 20 66 69 72  mmand on the fir
5430: 73 74 20 69 6e 76 6f 63 61 74 69 6f 6e 20 61 6e  st invocation an
5440: 64 20 74 68 75 73 20 6d 61 6b 65 0a 20 20 20 20  d thus make.    
5450: 2a 2a 20 73 75 62 73 65 71 75 65 6e 74 20 69 6e  ** subsequent in
5460: 76 6f 63 61 74 69 6f 6e 73 20 6d 75 63 68 20 66  vocations much f
5470: 61 73 74 65 72 2e 20 2a 2f 0a 20 20 20 20 70 43  aster. */.    pC
5480: 6d 64 20 3d 20 70 2d 3e 70 53 63 72 69 70 74 3b  md = p->pScript;
5490: 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66  .    Tcl_IncrRef
54a0: 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20 20  Count(pCmd);.   
54b0: 20 72 63 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62   rc = Tcl_EvalOb
54c0: 6a 45 78 28 70 2d 3e 69 6e 74 65 72 70 2c 20 70  jEx(p->interp, p
54d0: 43 6d 64 2c 20 30 29 3b 0a 20 20 20 20 54 63 6c  Cmd, 0);.    Tcl
54e0: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 43  _DecrRefCount(pC
54f0: 6d 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  md);.  }else{.  
5500: 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72    /* If there ar
5510: 65 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 74  e arguments to t
5520: 68 65 20 66 75 6e 63 74 69 6f 6e 2c 20 6d 61 6b  he function, mak
5530: 65 20 61 20 73 68 61 6c 6c 6f 77 20 63 6f 70 79  e a shallow copy
5540: 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 73   of the.    ** s
5550: 63 72 69 70 74 20 6f 62 6a 65 63 74 2c 20 6c 61  cript object, la
5560: 70 70 65 6e 64 20 74 68 65 20 61 72 67 75 6d 65  ppend the argume
5570: 6e 74 73 2c 20 74 68 65 6e 20 65 76 61 6c 75 61  nts, then evalua
5580: 74 65 20 74 68 65 20 63 6f 70 79 2e 0a 20 20 20  te the copy..   
5590: 20 2a 2a 0a 20 20 20 20 2a 2a 20 42 79 20 22 73   **.    ** By "s
55a0: 68 61 6c 6c 6f 77 22 20 63 6f 70 79 2c 20 77 65  hallow" copy, we
55b0: 20 6d 65 61 6e 20 61 20 6f 6e 6c 79 20 74 68 65   mean a only the
55c0: 20 6f 75 74 65 72 20 6c 69 73 74 20 54 63 6c 5f   outer list Tcl_
55d0: 4f 62 6a 20 69 73 20 64 75 70 6c 69 63 61 74 65  Obj is duplicate
55e0: 64 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 6e 65  d..    ** The ne
55f0: 77 20 54 63 6c 5f 4f 62 6a 20 63 6f 6e 74 61 69  w Tcl_Obj contai
5600: 6e 73 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 74  ns pointers to t
5610: 68 65 20 6f 72 69 67 69 6e 61 6c 20 6c 69 73 74  he original list
5620: 20 65 6c 65 6d 65 6e 74 73 2e 20 0a 20 20 20 20   elements. .    
5630: 2a 2a 20 54 68 61 74 20 77 61 79 2c 20 77 68 65  ** That way, whe
5640: 6e 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 76 28 29  n Tcl_EvalObjv()
5650: 20 69 73 20 72 75 6e 20 61 6e 64 20 73 68 69 6d   is run and shim
5660: 6d 65 72 73 20 74 68 65 20 66 69 72 73 74 20 65  mers the first e
5670: 6c 65 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 6f 66  lement.    ** of
5680: 20 74 68 65 20 6c 69 73 74 20 74 6f 20 74 63 6c   the list to tcl
5690: 43 6d 64 4e 61 6d 65 54 79 70 65 2c 20 74 68 61  CmdNameType, tha
56a0: 74 20 61 6c 74 65 72 6e 61 74 65 20 72 65 70 72  t alternate repr
56b0: 65 73 65 6e 74 61 74 69 6f 6e 20 77 69 6c 6c 0a  esentation will.
56c0: 20 20 20 20 2a 2a 20 62 65 20 70 72 65 73 65 72      ** be preser
56d0: 76 65 64 20 61 6e 64 20 72 65 75 73 65 64 20 6f  ved and reused o
56e0: 6e 20 74 68 65 20 6e 65 78 74 20 69 6e 76 6f 63  n the next invoc
56f0: 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  ation..    */.  
5700: 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 61 41 72 67    Tcl_Obj **aArg
5710: 3b 0a 20 20 20 20 69 6e 74 20 6e 41 72 67 3b 0a  ;.    int nArg;.
5720: 20 20 20 20 69 66 28 20 54 63 6c 5f 4c 69 73 74      if( Tcl_List
5730: 4f 62 6a 47 65 74 45 6c 65 6d 65 6e 74 73 28 70  ObjGetElements(p
5740: 2d 3e 69 6e 74 65 72 70 2c 20 70 2d 3e 70 53 63  ->interp, p->pSc
5750: 72 69 70 74 2c 20 26 6e 41 72 67 2c 20 26 61 41  ript, &nArg, &aA
5760: 72 67 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  rg) ){.      sql
5770: 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f  ite3_result_erro
5780: 72 28 63 6f 6e 74 65 78 74 2c 20 54 63 6c 5f 47  r(context, Tcl_G
5790: 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28 70  etStringResult(p
57a0: 2d 3e 69 6e 74 65 72 70 29 2c 20 2d 31 29 3b 20  ->interp), -1); 
57b0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
57c0: 20 20 20 7d 20 20 20 20 20 0a 20 20 20 20 70 43     }     .    pC
57d0: 6d 64 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74  md = Tcl_NewList
57e0: 4f 62 6a 28 6e 41 72 67 2c 20 61 41 72 67 29 3b  Obj(nArg, aArg);
57f0: 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66  .    Tcl_IncrRef
5800: 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20 20  Count(pCmd);.   
5810: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 67 63   for(i=0; i<argc
5820: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71  ; i++){.      sq
5830: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 49 6e  lite3_value *pIn
5840: 20 3d 20 61 72 67 76 5b 69 5d 3b 0a 20 20 20 20   = argv[i];.    
5850: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 56 61 6c 3b    Tcl_Obj *pVal;
5860: 0a 20 20 20 20 20 20 20 20 20 20 20 20 0a 20 20  .            .  
5870: 20 20 20 20 2f 2a 20 53 65 74 20 70 56 61 6c 20      /* Set pVal 
5880: 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 69  to contain the i
5890: 27 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  'th column of th
58a0: 69 73 20 72 6f 77 2e 20 2a 2f 0a 20 20 20 20 20  is row. */.     
58b0: 20 73 77 69 74 63 68 28 20 73 71 6c 69 74 65 33   switch( sqlite3
58c0: 5f 76 61 6c 75 65 5f 74 79 70 65 28 70 49 6e 29  _value_type(pIn)
58d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 61 73 65   ){.        case
58e0: 20 53 51 4c 49 54 45 5f 42 4c 4f 42 3a 20 7b 0a   SQLITE_BLOB: {.
58f0: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 62 79            int by
5900: 74 65 73 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  tes = sqlite3_va
5910: 6c 75 65 5f 62 79 74 65 73 28 70 49 6e 29 3b 0a  lue_bytes(pIn);.
5920: 20 20 20 20 20 20 20 20 20 20 70 56 61 6c 20 3d            pVal =
5930: 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61   Tcl_NewByteArra
5940: 79 4f 62 6a 28 73 71 6c 69 74 65 33 5f 76 61 6c  yObj(sqlite3_val
5950: 75 65 5f 62 6c 6f 62 28 70 49 6e 29 2c 20 62 79  ue_blob(pIn), by
5960: 74 65 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20  tes);.          
5970: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
5980: 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51  .        case SQ
5990: 4c 49 54 45 5f 49 4e 54 45 47 45 52 3a 20 7b 0a  LITE_INTEGER: {.
59a0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
59b0: 5f 69 6e 74 36 34 20 76 20 3d 20 73 71 6c 69 74  _int64 v = sqlit
59c0: 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28 70  e3_value_int64(p
59d0: 49 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  In);.          i
59e0: 66 28 20 76 3e 3d 2d 32 31 34 37 34 38 33 36 34  f( v>=-214748364
59f0: 37 20 26 26 20 76 3c 3d 32 31 34 37 34 38 33 36  7 && v<=21474836
5a00: 34 37 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  47 ){.          
5a10: 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77    pVal = Tcl_New
5a20: 49 6e 74 4f 62 6a 28 76 29 3b 0a 20 20 20 20 20  IntObj(v);.     
5a30: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
5a40: 20 20 20 20 20 20 20 20 70 56 61 6c 20 3d 20 54          pVal = T
5a50: 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a  cl_NewWideIntObj
5a60: 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  (v);.          }
5a70: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
5a80: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
5a90: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
5aa0: 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20 20  FLOAT: {.       
5ab0: 20 20 20 64 6f 75 62 6c 65 20 72 20 3d 20 73 71     double r = sq
5ac0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62  lite3_value_doub
5ad0: 6c 65 28 70 49 6e 29 3b 0a 20 20 20 20 20 20 20  le(pIn);.       
5ae0: 20 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65     pVal = Tcl_Ne
5af0: 77 44 6f 75 62 6c 65 4f 62 6a 28 72 29 3b 0a 20  wDoubleObj(r);. 
5b00: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
5b10: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
5b20: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 55    case SQLITE_NU
5b30: 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20  LL: {.          
5b40: 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 53 74  pVal = Tcl_NewSt
5b50: 72 69 6e 67 4f 62 6a 28 22 22 2c 20 30 29 3b 0a  ringObj("", 0);.
5b60: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
5b70: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
5b80: 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
5b90: 20 20 20 20 20 20 20 20 69 6e 74 20 62 79 74 65          int byte
5ba0: 73 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  s = sqlite3_valu
5bb0: 65 5f 62 79 74 65 73 28 70 49 6e 29 3b 0a 20 20  e_bytes(pIn);.  
5bc0: 20 20 20 20 20 20 20 20 70 56 61 6c 20 3d 20 54          pVal = T
5bd0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
5be0: 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f  (char *)sqlite3_
5bf0: 76 61 6c 75 65 5f 74 65 78 74 28 70 49 6e 29 2c  value_text(pIn),
5c00: 20 62 79 74 65 73 29 3b 0a 20 20 20 20 20 20 20   bytes);.       
5c10: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
5c20: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
5c30: 20 20 72 63 20 3d 20 54 63 6c 5f 4c 69 73 74 4f    rc = Tcl_ListO
5c40: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
5c50: 70 2d 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c  p->interp, pCmd,
5c60: 20 70 56 61 6c 29 3b 0a 20 20 20 20 20 20 69 66   pVal);.      if
5c70: 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
5c80: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
5c90: 28 70 43 6d 64 29 3b 0a 20 20 20 20 20 20 20 20  (pCmd);.        
5ca0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
5cb0: 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20 54 63  rror(context, Tc
5cc0: 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c  l_GetStringResul
5cd0: 74 28 70 2d 3e 69 6e 74 65 72 70 29 2c 20 2d 31  t(p->interp), -1
5ce0: 29 3b 20 0a 20 20 20 20 20 20 20 20 72 65 74 75  ); .        retu
5cf0: 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rn;.      }.    
5d00: 7d 0a 20 20 20 20 69 66 28 20 21 70 2d 3e 75 73  }.    if( !p->us
5d10: 65 45 76 61 6c 4f 62 6a 76 20 29 7b 0a 20 20 20  eEvalObjv ){.   
5d20: 20 20 20 2f 2a 20 54 63 6c 5f 45 76 61 6c 4f 62     /* Tcl_EvalOb
5d30: 6a 45 78 28 29 20 77 69 6c 6c 20 61 75 74 6f 6d  jEx() will autom
5d40: 61 74 69 63 61 6c 6c 79 20 63 61 6c 6c 20 54 63  atically call Tc
5d50: 6c 5f 45 76 61 6c 4f 62 6a 76 28 29 20 69 66 20  l_EvalObjv() if 
5d60: 70 43 6d 64 0a 20 20 20 20 20 20 2a 2a 20 69 73  pCmd.      ** is
5d70: 20 61 20 6c 69 73 74 20 77 69 74 68 6f 75 74 20   a list without 
5d80: 61 20 73 74 72 69 6e 67 20 72 65 70 72 65 73 65  a string represe
5d90: 6e 74 61 74 69 6f 6e 2e 20 20 54 6f 20 70 72 65  ntation.  To pre
5da0: 76 65 6e 74 20 74 68 69 73 20 66 72 6f 6d 0a 20  vent this from. 
5db0: 20 20 20 20 20 2a 2a 20 68 61 70 70 65 6e 69 6e       ** happenin
5dc0: 67 2c 20 6d 61 6b 65 20 73 75 72 65 20 70 43 6d  g, make sure pCm
5dd0: 64 20 68 61 73 20 61 20 76 61 6c 69 64 20 73 74  d has a valid st
5de0: 72 69 6e 67 20 72 65 70 72 65 73 65 6e 74 61 74  ring representat
5df0: 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 54 63 6c  ion */.      Tcl
5e00: 5f 47 65 74 53 74 72 69 6e 67 28 70 43 6d 64 29  _GetString(pCmd)
5e10: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
5e20: 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70   Tcl_EvalObjEx(p
5e30: 2d 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c 20  ->interp, pCmd, 
5e40: 54 43 4c 5f 45 56 41 4c 5f 44 49 52 45 43 54 29  TCL_EVAL_DIRECT)
5e50: 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65  ;.    Tcl_DecrRe
5e60: 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20  fCount(pCmd);.  
5e70: 7d 0a 0a 20 20 69 66 28 20 72 63 20 26 26 20 72  }..  if( rc && r
5e80: 63 21 3d 54 43 4c 5f 52 45 54 55 52 4e 20 29 7b  c!=TCL_RETURN ){
5e90: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
5ea0: 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78  ult_error(contex
5eb0: 74 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  t, Tcl_GetString
5ec0: 52 65 73 75 6c 74 28 70 2d 3e 69 6e 74 65 72 70  Result(p->interp
5ed0: 29 2c 20 2d 31 29 3b 20 0a 20 20 7d 65 6c 73 65  ), -1); .  }else
5ee0: 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  {.    Tcl_Obj *p
5ef0: 56 61 72 20 3d 20 54 63 6c 5f 47 65 74 4f 62 6a  Var = Tcl_GetObj
5f00: 52 65 73 75 6c 74 28 70 2d 3e 69 6e 74 65 72 70  Result(p->interp
5f10: 29 3b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20  );.    int n;.  
5f20: 20 20 75 38 20 2a 64 61 74 61 3b 0a 20 20 20 20    u8 *data;.    
5f30: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70  const char *zTyp
5f40: 65 20 3d 20 28 70 56 61 72 2d 3e 74 79 70 65 50  e = (pVar->typeP
5f50: 74 72 20 3f 20 70 56 61 72 2d 3e 74 79 70 65 50  tr ? pVar->typeP
5f60: 74 72 2d 3e 6e 61 6d 65 20 3a 20 22 22 29 3b 0a  tr->name : "");.
5f70: 20 20 20 20 63 68 61 72 20 63 20 3d 20 7a 54 79      char c = zTy
5f80: 70 65 5b 30 5d 3b 0a 20 20 20 20 69 66 28 20 63  pe[0];.    if( c
5f90: 3d 3d 27 62 27 20 26 26 20 73 74 72 63 6d 70 28  =='b' && strcmp(
5fa0: 7a 54 79 70 65 2c 22 62 79 74 65 61 72 72 61 79  zType,"bytearray
5fb0: 22 29 3d 3d 30 20 26 26 20 70 56 61 72 2d 3e 62  ")==0 && pVar->b
5fc0: 79 74 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ytes==0 ){.     
5fd0: 20 2f 2a 20 4f 6e 6c 79 20 72 65 74 75 72 6e 20   /* Only return 
5fe0: 61 20 42 4c 4f 42 20 74 79 70 65 20 69 66 20 74  a BLOB type if t
5ff0: 68 65 20 54 63 6c 20 76 61 72 69 61 62 6c 65 20  he Tcl variable 
6000: 69 73 20 61 20 62 79 74 65 61 72 72 61 79 20 61  is a bytearray a
6010: 6e 64 0a 20 20 20 20 20 20 2a 2a 20 68 61 73 20  nd.      ** has 
6020: 6e 6f 20 73 74 72 69 6e 67 20 72 65 70 72 65 73  no string repres
6030: 65 6e 74 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20  entation. */.   
6040: 20 20 20 64 61 74 61 20 3d 20 54 63 6c 5f 47 65     data = Tcl_Ge
6050: 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62  tByteArrayFromOb
6060: 6a 28 70 56 61 72 2c 20 26 6e 29 3b 0a 20 20 20  j(pVar, &n);.   
6070: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
6080: 74 5f 62 6c 6f 62 28 63 6f 6e 74 65 78 74 2c 20  t_blob(context, 
6090: 64 61 74 61 2c 20 6e 2c 20 53 51 4c 49 54 45 5f  data, n, SQLITE_
60a0: 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20  TRANSIENT);.    
60b0: 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 62 27  }else if( c=='b'
60c0: 20 26 26 20 73 74 72 63 6d 70 28 7a 54 79 70 65   && strcmp(zType
60d0: 2c 22 62 6f 6f 6c 65 61 6e 22 29 3d 3d 30 20 29  ,"boolean")==0 )
60e0: 7b 0a 20 20 20 20 20 20 54 63 6c 5f 47 65 74 49  {.      Tcl_GetI
60f0: 6e 74 46 72 6f 6d 4f 62 6a 28 30 2c 20 70 56 61  ntFromObj(0, pVa
6100: 72 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 73 71  r, &n);.      sq
6110: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74  lite3_result_int
6120: 28 63 6f 6e 74 65 78 74 2c 20 6e 29 3b 0a 20 20  (context, n);.  
6130: 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27    }else if( c=='
6140: 64 27 20 26 26 20 73 74 72 63 6d 70 28 7a 54 79  d' && strcmp(zTy
6150: 70 65 2c 22 64 6f 75 62 6c 65 22 29 3d 3d 30 20  pe,"double")==0 
6160: 29 7b 0a 20 20 20 20 20 20 64 6f 75 62 6c 65 20  ){.      double 
6170: 72 3b 0a 20 20 20 20 20 20 54 63 6c 5f 47 65 74  r;.      Tcl_Get
6180: 44 6f 75 62 6c 65 46 72 6f 6d 4f 62 6a 28 30 2c  DoubleFromObj(0,
6190: 20 70 56 61 72 2c 20 26 72 29 3b 0a 20 20 20 20   pVar, &r);.    
61a0: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
61b0: 5f 64 6f 75 62 6c 65 28 63 6f 6e 74 65 78 74 2c  _double(context,
61c0: 20 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69   r);.    }else i
61d0: 66 28 20 28 63 3d 3d 27 77 27 20 26 26 20 73 74  f( (c=='w' && st
61e0: 72 63 6d 70 28 7a 54 79 70 65 2c 22 77 69 64 65  rcmp(zType,"wide
61f0: 49 6e 74 22 29 3d 3d 30 29 20 7c 7c 0a 20 20 20  Int")==0) ||.   
6200: 20 20 20 20 20 20 20 28 63 3d 3d 27 69 27 20 26         (c=='i' &
6210: 26 20 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22  & strcmp(zType,"
6220: 69 6e 74 22 29 3d 3d 30 29 20 29 7b 0a 20 20 20  int")==0) ){.   
6230: 20 20 20 54 63 6c 5f 57 69 64 65 49 6e 74 20 76     Tcl_WideInt v
6240: 3b 0a 20 20 20 20 20 20 54 63 6c 5f 47 65 74 57  ;.      Tcl_GetW
6250: 69 64 65 49 6e 74 46 72 6f 6d 4f 62 6a 28 30 2c  ideIntFromObj(0,
6260: 20 70 56 61 72 2c 20 26 76 29 3b 0a 20 20 20 20   pVar, &v);.    
6270: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
6280: 5f 69 6e 74 36 34 28 63 6f 6e 74 65 78 74 2c 20  _int64(context, 
6290: 76 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  v);.    }else{. 
62a0: 20 20 20 20 20 64 61 74 61 20 3d 20 28 75 6e 73       data = (uns
62b0: 69 67 6e 65 64 20 63 68 61 72 20 2a 29 54 63 6c  igned char *)Tcl
62c0: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
62d0: 6a 28 70 56 61 72 2c 20 26 6e 29 3b 0a 20 20 20  j(pVar, &n);.   
62e0: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
62f0: 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20  t_text(context, 
6300: 28 63 68 61 72 20 2a 29 64 61 74 61 2c 20 6e 2c  (char *)data, n,
6310: 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
6320: 54 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  T);.    }.  }.}.
6330: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
6340: 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49  OMIT_AUTHORIZATI
6350: 4f 4e 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73  ON./*.** This is
6360: 20 74 68 65 20 61 75 74 68 65 6e 74 69 63 61 74   the authenticat
6370: 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 2e 20 20 49  ion function.  I
6380: 74 20 61 70 70 65 6e 64 73 20 74 68 65 20 61 75  t appends the au
6390: 74 68 65 6e 74 69 63 61 74 69 6f 6e 0a 2a 2a 20  thentication.** 
63a0: 74 79 70 65 20 63 6f 64 65 20 61 6e 64 20 74 68  type code and th
63b0: 65 20 74 77 6f 20 61 72 67 75 6d 65 6e 74 73 20  e two arguments 
63c0: 74 6f 20 7a 43 6d 64 5b 5d 20 74 68 65 6e 20 69  to zCmd[] then i
63d0: 6e 76 6f 6b 65 73 20 74 68 65 20 72 65 73 75 6c  nvokes the resul
63e0: 74 0a 2a 2a 20 6f 6e 20 74 68 65 20 69 6e 74 65  t.** on the inte
63f0: 72 70 72 65 74 65 72 2e 20 20 54 68 65 20 72 65  rpreter.  The re
6400: 70 6c 79 20 69 73 20 65 78 61 6d 69 6e 65 64 20  ply is examined 
6410: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20  to determine if 
6420: 74 68 65 0a 2a 2a 20 61 75 74 68 65 6e 74 69 63  the.** authentic
6430: 61 74 69 6f 6e 20 66 61 69 6c 73 20 6f 72 20 73  ation fails or s
6440: 75 63 63 65 65 64 73 2e 0a 2a 2f 0a 73 74 61 74  ucceeds..*/.stat
6450: 69 63 20 69 6e 74 20 61 75 74 68 5f 63 61 6c 6c  ic int auth_call
6460: 62 61 63 6b 28 0a 20 20 76 6f 69 64 20 2a 70 41  back(.  void *pA
6470: 72 67 2c 0a 20 20 69 6e 74 20 63 6f 64 65 2c 0a  rg,.  int code,.
6480: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41    const char *zA
6490: 72 67 31 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  rg1,.  const cha
64a0: 72 20 2a 7a 41 72 67 32 2c 0a 20 20 63 6f 6e 73  r *zArg2,.  cons
64b0: 74 20 63 68 61 72 20 2a 7a 41 72 67 33 2c 0a 20  t char *zArg3,. 
64c0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72   const char *zAr
64d0: 67 34 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 43  g4.){.  char *zC
64e0: 6f 64 65 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69  ode;.  Tcl_DStri
64f0: 6e 67 20 73 74 72 3b 0a 20 20 69 6e 74 20 72 63  ng str;.  int rc
6500: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
6510: 7a 52 65 70 6c 79 3b 0a 20 20 53 71 6c 69 74 65  zReply;.  Sqlite
6520: 44 62 20 2a 70 44 62 20 3d 20 28 53 71 6c 69 74  Db *pDb = (Sqlit
6530: 65 44 62 2a 29 70 41 72 67 3b 0a 20 20 69 66 28  eDb*)pArg;.  if(
6540: 20 70 44 62 2d 3e 64 69 73 61 62 6c 65 41 75 74   pDb->disableAut
6550: 68 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  h ) return SQLIT
6560: 45 5f 4f 4b 3b 0a 0a 20 20 73 77 69 74 63 68 28  E_OK;..  switch(
6570: 20 63 6f 64 65 20 29 7b 0a 20 20 20 20 63 61 73   code ){.    cas
6580: 65 20 53 51 4c 49 54 45 5f 43 4f 50 59 20 20 20  e SQLITE_COPY   
6590: 20 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f             : zCo
65a0: 64 65 3d 22 53 51 4c 49 54 45 5f 43 4f 50 59 22  de="SQLITE_COPY"
65b0: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
65c0: 65 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  e SQLITE_CREATE_
65d0: 49 4e 44 45 58 20 20 20 20 20 20 3a 20 7a 43 6f  INDEX      : zCo
65e0: 64 65 3d 22 53 51 4c 49 54 45 5f 43 52 45 41 54  de="SQLITE_CREAT
65f0: 45 5f 49 4e 44 45 58 22 3b 20 62 72 65 61 6b 3b  E_INDEX"; break;
6600: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
6610: 5f 43 52 45 41 54 45 5f 54 41 42 4c 45 20 20 20  _CREATE_TABLE   
6620: 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49     : zCode="SQLI
6630: 54 45 5f 43 52 45 41 54 45 5f 54 41 42 4c 45 22  TE_CREATE_TABLE"
6640: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
6650: 65 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  e SQLITE_CREATE_
6660: 54 45 4d 50 5f 49 4e 44 45 58 20 3a 20 7a 43 6f  TEMP_INDEX : zCo
6670: 64 65 3d 22 53 51 4c 49 54 45 5f 43 52 45 41 54  de="SQLITE_CREAT
6680: 45 5f 54 45 4d 50 5f 49 4e 44 45 58 22 3b 20 62  E_TEMP_INDEX"; b
6690: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
66a0: 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d  QLITE_CREATE_TEM
66b0: 50 5f 54 41 42 4c 45 20 3a 20 7a 43 6f 64 65 3d  P_TABLE : zCode=
66c0: 22 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54  "SQLITE_CREATE_T
66d0: 45 4d 50 5f 54 41 42 4c 45 22 3b 20 62 72 65 61  EMP_TABLE"; brea
66e0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
66f0: 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 54  TE_CREATE_TEMP_T
6700: 52 49 47 47 45 52 3a 20 7a 43 6f 64 65 3d 22 53  RIGGER: zCode="S
6710: 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d  QLITE_CREATE_TEM
6720: 50 5f 54 52 49 47 47 45 52 22 3b 20 62 72 65 61  P_TRIGGER"; brea
6730: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
6740: 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 56  TE_CREATE_TEMP_V
6750: 49 45 57 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51  IEW  : zCode="SQ
6760: 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50  LITE_CREATE_TEMP
6770: 5f 56 49 45 57 22 3b 20 62 72 65 61 6b 3b 0a 20  _VIEW"; break;. 
6780: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
6790: 52 45 41 54 45 5f 54 52 49 47 47 45 52 20 20 20  REATE_TRIGGER   
67a0: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
67b0: 5f 43 52 45 41 54 45 5f 54 52 49 47 47 45 52 22  _CREATE_TRIGGER"
67c0: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
67d0: 65 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  e SQLITE_CREATE_
67e0: 56 49 45 57 20 20 20 20 20 20 20 3a 20 7a 43 6f  VIEW       : zCo
67f0: 64 65 3d 22 53 51 4c 49 54 45 5f 43 52 45 41 54  de="SQLITE_CREAT
6800: 45 5f 56 49 45 57 22 3b 20 62 72 65 61 6b 3b 0a  E_VIEW"; break;.
6810: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
6820: 44 45 4c 45 54 45 20 20 20 20 20 20 20 20 20 20  DELETE          
6830: 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54    : zCode="SQLIT
6840: 45 5f 44 45 4c 45 54 45 22 3b 20 62 72 65 61 6b  E_DELETE"; break
6850: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
6860: 45 5f 44 52 4f 50 5f 49 4e 44 45 58 20 20 20 20  E_DROP_INDEX    
6870: 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c      : zCode="SQL
6880: 49 54 45 5f 44 52 4f 50 5f 49 4e 44 45 58 22 3b  ITE_DROP_INDEX";
6890: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
68a0: 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 41 42   SQLITE_DROP_TAB
68b0: 4c 45 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64  LE        : zCod
68c0: 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54  e="SQLITE_DROP_T
68d0: 41 42 4c 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20  ABLE"; break;.  
68e0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44 52    case SQLITE_DR
68f0: 4f 50 5f 54 45 4d 50 5f 49 4e 44 45 58 20 20 20  OP_TEMP_INDEX   
6900: 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f  : zCode="SQLITE_
6910: 44 52 4f 50 5f 54 45 4d 50 5f 49 4e 44 45 58 22  DROP_TEMP_INDEX"
6920: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
6930: 65 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45  e SQLITE_DROP_TE
6940: 4d 50 5f 54 41 42 4c 45 20 20 20 3a 20 7a 43 6f  MP_TABLE   : zCo
6950: 64 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f  de="SQLITE_DROP_
6960: 54 45 4d 50 5f 54 41 42 4c 45 22 3b 20 62 72 65  TEMP_TABLE"; bre
6970: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
6980: 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 54 52  ITE_DROP_TEMP_TR
6990: 49 47 47 45 52 20 3a 20 7a 43 6f 64 65 3d 22 53  IGGER : zCode="S
69a0: 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f  QLITE_DROP_TEMP_
69b0: 54 52 49 47 47 45 52 22 3b 20 62 72 65 61 6b 3b  TRIGGER"; break;
69c0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
69d0: 5f 44 52 4f 50 5f 54 45 4d 50 5f 56 49 45 57 20  _DROP_TEMP_VIEW 
69e0: 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49     : zCode="SQLI
69f0: 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 56 49 45  TE_DROP_TEMP_VIE
6a00: 57 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  W"; break;.    c
6a10: 61 73 65 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f  ase SQLITE_DROP_
6a20: 54 52 49 47 47 45 52 20 20 20 20 20 20 3a 20 7a  TRIGGER      : z
6a30: 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f  Code="SQLITE_DRO
6a40: 50 5f 54 52 49 47 47 45 52 22 3b 20 62 72 65 61  P_TRIGGER"; brea
6a50: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
6a60: 54 45 5f 44 52 4f 50 5f 56 49 45 57 20 20 20 20  TE_DROP_VIEW    
6a70: 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51       : zCode="SQ
6a80: 4c 49 54 45 5f 44 52 4f 50 5f 56 49 45 57 22 3b  LITE_DROP_VIEW";
6a90: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
6aa0: 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 20 20   SQLITE_INSERT  
6ab0: 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64            : zCod
6ac0: 65 3d 22 53 51 4c 49 54 45 5f 49 4e 53 45 52 54  e="SQLITE_INSERT
6ad0: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
6ae0: 73 65 20 53 51 4c 49 54 45 5f 50 52 41 47 4d 41  se SQLITE_PRAGMA
6af0: 20 20 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43              : zC
6b00: 6f 64 65 3d 22 53 51 4c 49 54 45 5f 50 52 41 47  ode="SQLITE_PRAG
6b10: 4d 41 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  MA"; break;.    
6b20: 63 61 73 65 20 53 51 4c 49 54 45 5f 52 45 41 44  case SQLITE_READ
6b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3a 20                : 
6b40: 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 52 45  zCode="SQLITE_RE
6b50: 41 44 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  AD"; break;.    
6b60: 63 61 73 65 20 53 51 4c 49 54 45 5f 53 45 4c 45  case SQLITE_SELE
6b70: 43 54 20 20 20 20 20 20 20 20 20 20 20 20 3a 20  CT            : 
6b80: 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 53 45  zCode="SQLITE_SE
6b90: 4c 45 43 54 22 3b 20 62 72 65 61 6b 3b 0a 20 20  LECT"; break;.  
6ba0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 52    case SQLITE_TR
6bb0: 41 4e 53 41 43 54 49 4f 4e 20 20 20 20 20 20 20  ANSACTION       
6bc0: 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f  : zCode="SQLITE_
6bd0: 54 52 41 4e 53 41 43 54 49 4f 4e 22 3b 20 62 72  TRANSACTION"; br
6be0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
6bf0: 4c 49 54 45 5f 55 50 44 41 54 45 20 20 20 20 20  LITE_UPDATE     
6c00: 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22         : zCode="
6c10: 53 51 4c 49 54 45 5f 55 50 44 41 54 45 22 3b 20  SQLITE_UPDATE"; 
6c20: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
6c30: 53 51 4c 49 54 45 5f 41 54 54 41 43 48 20 20 20  SQLITE_ATTACH   
6c40: 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65           : zCode
6c50: 3d 22 53 51 4c 49 54 45 5f 41 54 54 41 43 48 22  ="SQLITE_ATTACH"
6c60: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
6c70: 65 20 53 51 4c 49 54 45 5f 44 45 54 41 43 48 20  e SQLITE_DETACH 
6c80: 20 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f             : zCo
6c90: 64 65 3d 22 53 51 4c 49 54 45 5f 44 45 54 41 43  de="SQLITE_DETAC
6ca0: 48 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  H"; break;.    c
6cb0: 61 73 65 20 53 51 4c 49 54 45 5f 41 4c 54 45 52  ase SQLITE_ALTER
6cc0: 5f 54 41 42 4c 45 20 20 20 20 20 20 20 3a 20 7a  _TABLE       : z
6cd0: 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 41 4c 54  Code="SQLITE_ALT
6ce0: 45 52 5f 54 41 42 4c 45 22 3b 20 62 72 65 61 6b  ER_TABLE"; break
6cf0: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
6d00: 45 5f 52 45 49 4e 44 45 58 20 20 20 20 20 20 20  E_REINDEX       
6d10: 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c      : zCode="SQL
6d20: 49 54 45 5f 52 45 49 4e 44 45 58 22 3b 20 62 72  ITE_REINDEX"; br
6d30: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
6d40: 4c 49 54 45 5f 41 4e 41 4c 59 5a 45 20 20 20 20  LITE_ANALYZE    
6d50: 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22         : zCode="
6d60: 53 51 4c 49 54 45 5f 41 4e 41 4c 59 5a 45 22 3b  SQLITE_ANALYZE";
6d70: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
6d80: 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 56   SQLITE_CREATE_V
6d90: 54 41 42 4c 45 20 20 20 20 20 3a 20 7a 43 6f 64  TABLE     : zCod
6da0: 65 3d 22 53 51 4c 49 54 45 5f 43 52 45 41 54 45  e="SQLITE_CREATE
6db0: 5f 56 54 41 42 4c 45 22 3b 20 62 72 65 61 6b 3b  _VTABLE"; break;
6dc0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
6dd0: 5f 44 52 4f 50 5f 56 54 41 42 4c 45 20 20 20 20  _DROP_VTABLE    
6de0: 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49     : zCode="SQLI
6df0: 54 45 5f 44 52 4f 50 5f 56 54 41 42 4c 45 22 3b  TE_DROP_VTABLE";
6e00: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
6e10: 20 53 51 4c 49 54 45 5f 46 55 4e 43 54 49 4f 4e   SQLITE_FUNCTION
6e20: 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64            : zCod
6e30: 65 3d 22 53 51 4c 49 54 45 5f 46 55 4e 43 54 49  e="SQLITE_FUNCTI
6e40: 4f 4e 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  ON"; break;.    
6e50: 63 61 73 65 20 53 51 4c 49 54 45 5f 53 41 56 45  case SQLITE_SAVE
6e60: 50 4f 49 4e 54 20 20 20 20 20 20 20 20 20 3a 20  POINT         : 
6e70: 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 53 41  zCode="SQLITE_SA
6e80: 56 45 50 4f 49 4e 54 22 3b 20 62 72 65 61 6b 3b  VEPOINT"; break;
6e90: 0a 20 20 20 20 64 65 66 61 75 6c 74 20 20 20 20  .    default    
6ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6eb0: 20 20 20 3a 20 7a 43 6f 64 65 3d 22 3f 3f 3f 3f     : zCode="????
6ec0: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20  "; break;.  }.  
6ed0: 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28  Tcl_DStringInit(
6ee0: 26 73 74 72 29 3b 0a 20 20 54 63 6c 5f 44 53 74  &str);.  Tcl_DSt
6ef0: 72 69 6e 67 41 70 70 65 6e 64 28 26 73 74 72 2c  ringAppend(&str,
6f00: 20 70 44 62 2d 3e 7a 41 75 74 68 2c 20 2d 31 29   pDb->zAuth, -1)
6f10: 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41  ;.  Tcl_DStringA
6f20: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 26 73 74  ppendElement(&st
6f30: 72 2c 20 7a 43 6f 64 65 29 3b 0a 20 20 54 63 6c  r, zCode);.  Tcl
6f40: 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64 45 6c  _DStringAppendEl
6f50: 65 6d 65 6e 74 28 26 73 74 72 2c 20 7a 41 72 67  ement(&str, zArg
6f60: 31 20 3f 20 7a 41 72 67 31 20 3a 20 22 22 29 3b  1 ? zArg1 : "");
6f70: 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70  .  Tcl_DStringAp
6f80: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 26 73 74 72  pendElement(&str
6f90: 2c 20 7a 41 72 67 32 20 3f 20 7a 41 72 67 32 20  , zArg2 ? zArg2 
6fa0: 3a 20 22 22 29 3b 0a 20 20 54 63 6c 5f 44 53 74  : "");.  Tcl_DSt
6fb0: 72 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e  ringAppendElemen
6fc0: 74 28 26 73 74 72 2c 20 7a 41 72 67 33 20 3f 20  t(&str, zArg3 ? 
6fd0: 7a 41 72 67 33 20 3a 20 22 22 29 3b 0a 20 20 54  zArg3 : "");.  T
6fe0: 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64  cl_DStringAppend
6ff0: 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c 20 7a 41  Element(&str, zA
7000: 72 67 34 20 3f 20 7a 41 72 67 34 20 3a 20 22 22  rg4 ? zArg4 : ""
7010: 29 3b 0a 20 20 72 63 20 3d 20 54 63 6c 5f 47 6c  );.  rc = Tcl_Gl
7020: 6f 62 61 6c 45 76 61 6c 28 70 44 62 2d 3e 69 6e  obalEval(pDb->in
7030: 74 65 72 70 2c 20 54 63 6c 5f 44 53 74 72 69 6e  terp, Tcl_DStrin
7040: 67 56 61 6c 75 65 28 26 73 74 72 29 29 3b 0a 20  gValue(&str));. 
7050: 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65   Tcl_DStringFree
7060: 28 26 73 74 72 29 3b 0a 20 20 7a 52 65 70 6c 79  (&str);.  zReply
7070: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
7080: 52 65 73 75 6c 74 28 70 44 62 2d 3e 69 6e 74 65  Result(pDb->inte
7090: 72 70 29 3b 0a 20 20 69 66 28 20 73 74 72 63 6d  rp);.  if( strcm
70a0: 70 28 7a 52 65 70 6c 79 2c 22 53 51 4c 49 54 45  p(zReply,"SQLITE
70b0: 5f 4f 4b 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  _OK")==0 ){.    
70c0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
70d0: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
70e0: 6d 70 28 7a 52 65 70 6c 79 2c 22 53 51 4c 49 54  mp(zReply,"SQLIT
70f0: 45 5f 44 45 4e 59 22 29 3d 3d 30 20 29 7b 0a 20  E_DENY")==0 ){. 
7100: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44     rc = SQLITE_D
7110: 45 4e 59 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ENY;.  }else if(
7120: 20 73 74 72 63 6d 70 28 7a 52 65 70 6c 79 2c 22   strcmp(zReply,"
7130: 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 22 29 3d  SQLITE_IGNORE")=
7140: 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  =0 ){.    rc = S
7150: 51 4c 49 54 45 5f 49 47 4e 4f 52 45 3b 0a 20 20  QLITE_IGNORE;.  
7160: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
7170: 39 39 39 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  999;.  }.  retur
7180: 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  n rc;.}.#endif /
7190: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  * SQLITE_OMIT_AU
71a0: 54 48 4f 52 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a  THORIZATION */..
71b0: 2f 2a 0a 2a 2a 20 7a 54 65 78 74 20 69 73 20 61  /*.** zText is a
71c0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 65 78 74   pointer to text
71d0: 20 6f 62 74 61 69 6e 65 64 20 76 69 61 20 61 6e   obtained via an
71e0: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
71f0: 74 65 78 74 28 29 0a 2a 2a 20 6f 72 20 73 69 6d  text().** or sim
7200: 69 6c 61 72 20 69 6e 74 65 72 66 61 63 65 2e 20  ilar interface. 
7210: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  This routine ret
7220: 75 72 6e 73 20 61 20 54 63 6c 20 73 74 72 69 6e  urns a Tcl strin
7230: 67 20 6f 62 6a 65 63 74 2c 20 0a 2a 2a 20 72 65  g object, .** re
7240: 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 73 65  ference count se
7250: 74 20 74 6f 20 30 2c 20 63 6f 6e 74 61 69 6e 69  t to 0, containi
7260: 6e 67 20 74 68 65 20 74 65 78 74 2e 20 49 66 20  ng the text. If 
7270: 61 20 74 72 61 6e 73 6c 61 74 69 6f 6e 0a 2a 2a  a translation.**
7280: 20 62 65 74 77 65 65 6e 20 69 73 6f 38 38 35 39   between iso8859
7290: 20 61 6e 64 20 55 54 46 2d 38 20 69 73 20 72 65   and UTF-8 is re
72a0: 71 75 69 72 65 64 2c 20 69 74 20 69 73 20 70 72  quired, it is pr
72b0: 65 66 6f 72 6d 65 64 2e 0a 2a 2f 0a 73 74 61 74  eformed..*/.stat
72c0: 69 63 20 54 63 6c 5f 4f 62 6a 20 2a 64 62 54 65  ic Tcl_Obj *dbTe
72d0: 78 74 54 6f 4f 62 6a 28 63 68 61 72 20 63 6f 6e  xtToObj(char con
72e0: 73 74 20 2a 7a 54 65 78 74 29 7b 0a 20 20 54 63  st *zText){.  Tc
72f0: 6c 5f 4f 62 6a 20 2a 70 56 61 6c 3b 0a 23 69 66  l_Obj *pVal;.#if
7300: 64 65 66 20 55 54 46 5f 54 52 41 4e 53 4c 41 54  def UTF_TRANSLAT
7310: 49 4f 4e 5f 4e 45 45 44 45 44 0a 20 20 54 63 6c  ION_NEEDED.  Tcl
7320: 5f 44 53 74 72 69 6e 67 20 64 43 6f 6c 3b 0a 20  _DString dCol;. 
7330: 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74   Tcl_DStringInit
7340: 28 26 64 43 6f 6c 29 3b 0a 20 20 54 63 6c 5f 45  (&dCol);.  Tcl_E
7350: 78 74 65 72 6e 61 6c 54 6f 55 74 66 44 53 74 72  xternalToUtfDStr
7360: 69 6e 67 28 4e 55 4c 4c 2c 20 7a 54 65 78 74 2c  ing(NULL, zText,
7370: 20 2d 31 2c 20 26 64 43 6f 6c 29 3b 0a 20 20 70   -1, &dCol);.  p
7380: 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72  Val = Tcl_NewStr
7390: 69 6e 67 4f 62 6a 28 54 63 6c 5f 44 53 74 72 69  ingObj(Tcl_DStri
73a0: 6e 67 56 61 6c 75 65 28 26 64 43 6f 6c 29 2c 20  ngValue(&dCol), 
73b0: 2d 31 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69  -1);.  Tcl_DStri
73c0: 6e 67 46 72 65 65 28 26 64 43 6f 6c 29 3b 0a 23  ngFree(&dCol);.#
73d0: 65 6c 73 65 0a 20 20 70 56 61 6c 20 3d 20 54 63  else.  pVal = Tc
73e0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a  l_NewStringObj(z
73f0: 54 65 78 74 2c 20 2d 31 29 3b 0a 23 65 6e 64 69  Text, -1);.#endi
7400: 66 0a 20 20 72 65 74 75 72 6e 20 70 56 61 6c 3b  f.  return pVal;
7410: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
7420: 6f 75 74 69 6e 65 20 72 65 61 64 73 20 61 20 6c  outine reads a l
7430: 69 6e 65 20 6f 66 20 74 65 78 74 20 66 72 6f 6d  ine of text from
7440: 20 46 49 4c 45 20 69 6e 2c 20 73 74 6f 72 65 73   FILE in, stores
7450: 0a 2a 2a 20 74 68 65 20 74 65 78 74 20 69 6e 20  .** the text in 
7460: 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20  memory obtained 
7470: 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 20 61 6e  from malloc() an
7480: 64 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e  d returns a poin
7490: 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 74 65  ter.** to the te
74a0: 78 74 2e 20 20 4e 55 4c 4c 20 69 73 20 72 65 74  xt.  NULL is ret
74b0: 75 72 6e 65 64 20 61 74 20 65 6e 64 20 6f 66 20  urned at end of 
74c0: 66 69 6c 65 2c 20 6f 72 20 69 66 20 6d 61 6c 6c  file, or if mall
74d0: 6f 63 28 29 0a 2a 2a 20 66 61 69 6c 73 2e 0a 2a  oc().** fails..*
74e0: 2a 0a 2a 2a 20 54 68 65 20 69 6e 74 65 72 66 61  *.** The interfa
74f0: 63 65 20 69 73 20 6c 69 6b 65 20 22 72 65 61 64  ce is like "read
7500: 6c 69 6e 65 22 20 62 75 74 20 6e 6f 20 63 6f 6d  line" but no com
7510: 6d 61 6e 64 2d 6c 69 6e 65 20 65 64 69 74 69 6e  mand-line editin
7520: 67 0a 2a 2a 20 69 73 20 64 6f 6e 65 2e 0a 2a 2a  g.** is done..**
7530: 0a 2a 2a 20 63 6f 70 69 65 64 20 66 72 6f 6d 20  .** copied from 
7540: 73 68 65 6c 6c 2e 63 20 66 72 6f 6d 20 27 2e 69  shell.c from '.i
7550: 6d 70 6f 72 74 27 20 63 6f 6d 6d 61 6e 64 0a 2a  mport' command.*
7560: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 6c  /.static char *l
7570: 6f 63 61 6c 5f 67 65 74 6c 69 6e 65 28 63 68 61  ocal_getline(cha
7580: 72 20 2a 7a 50 72 6f 6d 70 74 2c 20 46 49 4c 45  r *zPrompt, FILE
7590: 20 2a 69 6e 29 7b 0a 20 20 63 68 61 72 20 2a 7a   *in){.  char *z
75a0: 4c 69 6e 65 3b 0a 20 20 69 6e 74 20 6e 4c 69 6e  Line;.  int nLin
75b0: 65 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 69 6e  e;.  int n;.  in
75c0: 74 20 65 6f 6c 3b 0a 0a 20 20 6e 4c 69 6e 65 20  t eol;..  nLine 
75d0: 3d 20 31 30 30 3b 0a 20 20 7a 4c 69 6e 65 20 3d  = 100;.  zLine =
75e0: 20 6d 61 6c 6c 6f 63 28 20 6e 4c 69 6e 65 20 29   malloc( nLine )
75f0: 3b 0a 20 20 69 66 28 20 7a 4c 69 6e 65 3d 3d 30  ;.  if( zLine==0
7600: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e   ) return 0;.  n
7610: 20 3d 20 30 3b 0a 20 20 65 6f 6c 20 3d 20 30 3b   = 0;.  eol = 0;
7620: 0a 20 20 77 68 69 6c 65 28 20 21 65 6f 6c 20 29  .  while( !eol )
7630: 7b 0a 20 20 20 20 69 66 28 20 6e 2b 31 30 30 3e  {.    if( n+100>
7640: 6e 4c 69 6e 65 20 29 7b 0a 20 20 20 20 20 20 6e  nLine ){.      n
7650: 4c 69 6e 65 20 3d 20 6e 4c 69 6e 65 2a 32 20 2b  Line = nLine*2 +
7660: 20 31 30 30 3b 0a 20 20 20 20 20 20 7a 4c 69 6e   100;.      zLin
7670: 65 20 3d 20 72 65 61 6c 6c 6f 63 28 7a 4c 69 6e  e = realloc(zLin
7680: 65 2c 20 6e 4c 69 6e 65 29 3b 0a 20 20 20 20 20  e, nLine);.     
7690: 20 69 66 28 20 7a 4c 69 6e 65 3d 3d 30 20 29 20   if( zLine==0 ) 
76a0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
76b0: 20 20 20 20 69 66 28 20 66 67 65 74 73 28 26 7a      if( fgets(&z
76c0: 4c 69 6e 65 5b 6e 5d 2c 20 6e 4c 69 6e 65 20 2d  Line[n], nLine -
76d0: 20 6e 2c 20 69 6e 29 3d 3d 30 20 29 7b 0a 20 20   n, in)==0 ){.  
76e0: 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a      if( n==0 ){.
76f0: 20 20 20 20 20 20 20 20 66 72 65 65 28 7a 4c 69          free(zLi
7700: 6e 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  ne);.        ret
7710: 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 0;.      }. 
7720: 20 20 20 20 20 7a 4c 69 6e 65 5b 6e 5d 20 3d 20       zLine[n] = 
7730: 30 3b 0a 20 20 20 20 20 20 65 6f 6c 20 3d 20 31  0;.      eol = 1
7740: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
7750: 20 20 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20     }.    while( 
7760: 7a 4c 69 6e 65 5b 6e 5d 20 29 7b 20 6e 2b 2b 3b  zLine[n] ){ n++;
7770: 20 7d 0a 20 20 20 20 69 66 28 20 6e 3e 30 20 26   }.    if( n>0 &
7780: 26 20 7a 4c 69 6e 65 5b 6e 2d 31 5d 3d 3d 27 5c  & zLine[n-1]=='\
7790: 6e 27 20 29 7b 0a 20 20 20 20 20 20 6e 2d 2d 3b  n' ){.      n--;
77a0: 0a 20 20 20 20 20 20 7a 4c 69 6e 65 5b 6e 5d 20  .      zLine[n] 
77b0: 3d 20 30 3b 0a 20 20 20 20 20 20 65 6f 6c 20 3d  = 0;.      eol =
77c0: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   1;.    }.  }.  
77d0: 7a 4c 69 6e 65 20 3d 20 72 65 61 6c 6c 6f 63 28  zLine = realloc(
77e0: 20 7a 4c 69 6e 65 2c 20 6e 2b 31 20 29 3b 0a 20   zLine, n+1 );. 
77f0: 20 72 65 74 75 72 6e 20 7a 4c 69 6e 65 3b 0a 7d   return zLine;.}
7800: 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  .../*.** This fu
7810: 6e 63 74 69 6f 6e 20 69 73 20 70 61 72 74 20 6f  nction is part o
7820: 66 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  f the implementa
7830: 74 69 6f 6e 20 6f 66 20 74 68 65 20 63 6f 6d 6d  tion of the comm
7840: 61 6e 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 24 64 62  and:.**.**   $db
7850: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 5b 2d 64   transaction [-d
7860: 65 66 65 72 72 65 64 7c 2d 69 6d 6d 65 64 69 61  eferred|-immedia
7870: 74 65 7c 2d 65 78 63 6c 75 73 69 76 65 5d 20 53  te|-exclusive] S
7880: 43 52 49 50 54 0a 2a 2a 0a 2a 2a 20 49 74 20 69  CRIPT.**.** It i
7890: 73 20 69 6e 76 6f 6b 65 64 20 61 66 74 65 72 20  s invoked after 
78a0: 65 76 61 6c 75 61 74 69 6e 67 20 74 68 65 20 73  evaluating the s
78b0: 63 72 69 70 74 20 53 43 52 49 50 54 20 74 6f 20  cript SCRIPT to 
78c0: 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61  commit or rollba
78d0: 63 6b 0a 2a 2a 20 74 68 65 20 74 72 61 6e 73 61  ck.** the transa
78e0: 63 74 69 6f 6e 20 6f 72 20 73 61 76 65 70 6f 69  ction or savepoi
78f0: 6e 74 20 6f 70 65 6e 65 64 20 62 79 20 74 68 65  nt opened by the
7900: 20 5b 74 72 61 6e 73 61 63 74 69 6f 6e 5d 20 63   [transaction] c
7910: 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69  ommand..*/.stati
7920: 63 20 69 6e 74 20 44 62 54 72 61 6e 73 50 6f 73  c int DbTransPos
7930: 74 43 6d 64 28 0a 20 20 43 6c 69 65 6e 74 44 61  tCmd(.  ClientDa
7940: 74 61 20 64 61 74 61 5b 5d 2c 20 20 20 20 20 20  ta data[],      
7950: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7960: 64 61 74 61 5b 30 5d 20 69 73 20 74 68 65 20 53  data[0] is the S
7970: 71 6c 69 74 65 33 44 62 2a 20 66 6f 72 20 24 64  qlite3Db* for $d
7980: 62 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72  b */.  Tcl_Inter
7990: 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 20 20  p *interp,      
79a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
79b0: 63 6c 20 69 6e 74 65 72 70 72 65 74 65 72 20 2a  cl interpreter *
79c0: 2f 0a 20 20 69 6e 74 20 72 65 73 75 6c 74 20 20  /.  int result  
79d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
79e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
79f0: 6c 74 20 6f 66 20 65 76 61 6c 75 61 74 69 6e 67  lt of evaluating
7a00: 20 53 43 52 49 50 54 20 2a 2f 0a 29 7b 0a 20 20   SCRIPT */.){.  
7a10: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
7a20: 72 20 2a 61 7a 45 6e 64 5b 5d 20 3d 20 7b 0a 20  r *azEnd[] = {. 
7a30: 20 20 20 22 52 45 4c 45 41 53 45 20 5f 74 63 6c     "RELEASE _tcl
7a40: 5f 74 72 61 6e 73 61 63 74 69 6f 6e 22 2c 20 20  _transaction",  
7a50: 20 20 20 20 20 20 2f 2a 20 72 63 3d 3d 54 43 4c        /* rc==TCL
7a60: 5f 45 52 52 4f 52 2c 20 6e 54 72 61 6e 73 61 63  _ERROR, nTransac
7a70: 74 69 6f 6e 21 3d 30 20 2a 2f 0a 20 20 20 20 22  tion!=0 */.    "
7a80: 43 4f 4d 4d 49 54 22 2c 20 20 20 20 20 20 20 20  COMMIT",        
7a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7aa0: 20 20 2f 2a 20 72 63 21 3d 54 43 4c 5f 45 52 52    /* rc!=TCL_ERR
7ab0: 4f 52 2c 20 6e 54 72 61 6e 73 61 63 74 69 6f 6e  OR, nTransaction
7ac0: 3d 3d 30 20 2a 2f 0a 20 20 20 20 22 52 4f 4c 4c  ==0 */.    "ROLL
7ad0: 42 41 43 4b 20 54 4f 20 5f 74 63 6c 5f 74 72 61  BACK TO _tcl_tra
7ae0: 6e 73 61 63 74 69 6f 6e 20 3b 20 52 45 4c 45 41  nsaction ; RELEA
7af0: 53 45 20 5f 74 63 6c 5f 74 72 61 6e 73 61 63 74  SE _tcl_transact
7b00: 69 6f 6e 22 2c 0a 20 20 20 20 22 52 4f 4c 4c 42  ion",.    "ROLLB
7b10: 41 43 4b 22 20 20 20 20 20 20 20 20 20 20 20 20  ACK"            
7b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7b30: 72 63 3d 3d 54 43 4c 5f 45 52 52 4f 52 2c 20 6e  rc==TCL_ERROR, n
7b40: 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 30 20 2a  Transaction==0 *
7b50: 2f 0a 20 20 7d 3b 0a 20 20 53 71 6c 69 74 65 44  /.  };.  SqliteD
7b60: 62 20 2a 70 44 62 20 3d 20 28 53 71 6c 69 74 65  b *pDb = (Sqlite
7b70: 44 62 2a 29 64 61 74 61 5b 30 5d 3b 0a 20 20 69  Db*)data[0];.  i
7b80: 6e 74 20 72 63 20 3d 20 72 65 73 75 6c 74 3b 0a  nt rc = result;.
7b90: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45    const char *zE
7ba0: 6e 64 3b 0a 0a 20 20 70 44 62 2d 3e 6e 54 72 61  nd;..  pDb->nTra
7bb0: 6e 73 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20 7a 45  nsaction--;.  zE
7bc0: 6e 64 20 3d 20 61 7a 45 6e 64 5b 28 72 63 3d 3d  nd = azEnd[(rc==
7bd0: 54 43 4c 5f 45 52 52 4f 52 29 2a 32 20 2b 20 28  TCL_ERROR)*2 + (
7be0: 70 44 62 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f  pDb->nTransactio
7bf0: 6e 3d 3d 30 29 5d 3b 0a 0a 20 20 70 44 62 2d 3e  n==0)];..  pDb->
7c00: 64 69 73 61 62 6c 65 41 75 74 68 2b 2b 3b 0a 20  disableAuth++;. 
7c10: 20 69 66 28 20 73 71 6c 69 74 65 33 5f 65 78 65   if( sqlite3_exe
7c20: 63 28 70 44 62 2d 3e 64 62 2c 20 7a 45 6e 64 2c  c(pDb->db, zEnd,
7c30: 20 30 2c 20 30 2c 20 30 29 20 29 7b 0a 20 20 20   0, 0, 0) ){.   
7c40: 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 61 20     /* This is a 
7c50: 74 72 69 63 6b 79 20 73 63 65 6e 61 72 69 6f 20  tricky scenario 
7c60: 74 6f 20 68 61 6e 64 6c 65 2e 20 54 68 65 20 6d  to handle. The m
7c70: 6f 73 74 20 6c 69 6b 65 6c 79 20 63 61 75 73 65  ost likely cause
7c80: 20 6f 66 20 61 6e 0a 20 20 20 20 20 20 2a 2a 20   of an.      ** 
7c90: 65 72 72 6f 72 20 69 73 20 74 68 61 74 20 74 68  error is that th
7ca0: 65 20 65 78 65 63 28 29 20 61 62 6f 76 65 20 77  e exec() above w
7cb0: 61 73 20 61 6e 20 61 74 74 65 6d 70 74 20 74 6f  as an attempt to
7cc0: 20 63 6f 6d 6d 69 74 20 74 68 65 20 0a 20 20 20   commit the .   
7cd0: 20 20 20 2a 2a 20 74 6f 70 2d 6c 65 76 65 6c 20     ** top-level 
7ce0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 61 74  transaction that
7cf0: 20 72 65 74 75 72 6e 65 64 20 53 51 4c 49 54 45   returned SQLITE
7d00: 5f 42 55 53 59 2e 20 4f 72 2c 20 6c 65 73 73 20  _BUSY. Or, less 
7d10: 6c 69 6b 65 6c 79 2c 0a 20 20 20 20 20 20 2a 2a  likely,.      **
7d20: 20 74 68 61 74 20 61 6e 20 49 4f 2d 65 72 72 6f   that an IO-erro
7d30: 72 20 68 61 73 20 6f 63 63 75 72 65 64 2e 20 49  r has occured. I
7d40: 6e 20 65 69 74 68 65 72 20 63 61 73 65 2c 20 74  n either case, t
7d50: 68 72 6f 77 20 61 20 54 63 6c 20 65 78 63 65 70  hrow a Tcl excep
7d60: 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 61 6e  tion.      ** an
7d70: 64 20 74 72 79 20 74 6f 20 72 6f 6c 6c 62 61 63  d try to rollbac
7d80: 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  k the transactio
7d90: 6e 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  n..      **.    
7da0: 20 20 2a 2a 20 42 75 74 20 69 74 20 63 6f 75 6c    ** But it coul
7db0: 64 20 61 6c 73 6f 20 62 65 20 74 68 61 74 20 74  d also be that t
7dc0: 68 65 20 75 73 65 72 20 65 78 65 63 75 74 65 64  he user executed
7dd0: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 42 45 47   one or more BEG
7de0: 49 4e 2c 20 0a 20 20 20 20 20 20 2a 2a 20 43 4f  IN, .      ** CO
7df0: 4d 4d 49 54 2c 20 53 41 56 45 50 4f 49 4e 54 2c  MMIT, SAVEPOINT,
7e00: 20 52 45 4c 45 41 53 45 20 6f 72 20 52 4f 4c 4c   RELEASE or ROLL
7e10: 42 41 43 4b 20 63 6f 6d 6d 61 6e 64 73 20 74 68  BACK commands th
7e20: 61 74 20 61 72 65 20 63 6f 6e 66 75 73 69 6e 67  at are confusing
7e30: 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 6d  .      ** this m
7e40: 65 74 68 6f 64 27 73 20 6c 6f 67 69 63 2e 20 4e  ethod's logic. N
7e50: 6f 74 20 63 6c 65 61 72 20 68 6f 77 20 74 68 69  ot clear how thi
7e60: 73 20 77 6f 75 6c 64 20 62 65 20 62 65 73 74 20  s would be best 
7e70: 68 61 6e 64 6c 65 64 2e 0a 20 20 20 20 20 20 2a  handled..      *
7e80: 2f 0a 20 20 20 20 69 66 28 20 72 63 21 3d 54 43  /.    if( rc!=TC
7e90: 4c 5f 45 52 52 4f 52 20 29 7b 0a 20 20 20 20 20  L_ERROR ){.     
7ea0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
7eb0: 74 28 69 6e 74 65 72 70 2c 20 73 71 6c 69 74 65  t(interp, sqlite
7ec0: 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62  3_errmsg(pDb->db
7ed0: 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 63 20  ), 0);.      rc 
7ee0: 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  = TCL_ERROR;.   
7ef0: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 65   }.    sqlite3_e
7f00: 78 65 63 28 70 44 62 2d 3e 64 62 2c 20 22 52 4f  xec(pDb->db, "RO
7f10: 4c 4c 42 41 43 4b 22 2c 20 30 2c 20 30 2c 20 30  LLBACK", 0, 0, 0
7f20: 29 3b 0a 20 20 7d 0a 20 20 70 44 62 2d 3e 64 69  );.  }.  pDb->di
7f30: 73 61 62 6c 65 41 75 74 68 2d 2d 3b 0a 0a 20 20  sableAuth--;..  
7f40: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
7f50: 0a 2a 2a 20 53 65 61 72 63 68 20 74 68 65 20 63  .** Search the c
7f60: 61 63 68 65 20 66 6f 72 20 61 20 70 72 65 70 61  ache for a prepa
7f70: 72 65 64 2d 73 74 61 74 65 6d 65 6e 74 20 6f 62  red-statement ob
7f80: 6a 65 63 74 20 74 68 61 74 20 69 6d 70 6c 65 6d  ject that implem
7f90: 65 6e 74 73 20 74 68 65 0a 2a 2a 20 66 69 72 73  ents the.** firs
7fa0: 74 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  t SQL statement 
7fb0: 69 6e 20 74 68 65 20 62 75 66 66 65 72 20 70 6f  in the buffer po
7fc0: 69 6e 74 65 64 20 74 6f 20 62 79 20 70 61 72 61  inted to by para
7fd0: 6d 65 74 65 72 20 7a 49 6e 2e 20 49 66 0a 2a 2a  meter zIn. If.**
7fe0: 20 6e 6f 20 73 75 63 68 20 70 72 65 70 61 72 65   no such prepare
7ff0: 64 2d 73 74 61 74 65 6d 65 6e 74 20 63 61 6e 20  d-statement can 
8000: 62 65 20 66 6f 75 6e 64 2c 20 61 6c 6c 6f 63 61  be found, alloca
8010: 74 65 20 61 6e 64 20 70 72 65 70 61 72 65 20 61  te and prepare a
8020: 20 6e 65 77 0a 2a 2a 20 6f 6e 65 2e 20 49 6e 20   new.** one. In 
8030: 65 69 74 68 65 72 20 63 61 73 65 2c 20 62 69 6e  either case, bin
8040: 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61  d the current va
8050: 6c 75 65 73 20 6f 66 20 74 68 65 20 72 65 6c 65  lues of the rele
8060: 76 61 6e 74 20 54 63 6c 0a 2a 2a 20 76 61 72 69  vant Tcl.** vari
8070: 61 62 6c 65 73 20 74 6f 20 61 6e 79 20 24 76 61  ables to any $va
8080: 72 2c 20 3a 76 61 72 20 6f 72 20 40 76 61 72 20  r, :var or @var 
8090: 76 61 72 69 61 62 6c 65 73 20 69 6e 20 74 68 65  variables in the
80a0: 20 73 74 61 74 65 6d 65 6e 74 2e 20 42 65 66 6f   statement. Befo
80b0: 72 65 0a 2a 2a 20 72 65 74 75 72 6e 69 6e 67 2c  re.** returning,
80c0: 20 73 65 74 20 2a 70 70 50 72 65 53 74 6d 74 20   set *ppPreStmt 
80d0: 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  to point to the 
80e0: 70 72 65 70 61 72 65 64 2d 73 74 61 74 65 6d 65  prepared-stateme
80f0: 6e 74 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a  nt object..**.**
8100: 20 4f 75 74 70 75 74 20 70 61 72 61 6d 65 74 65   Output paramete
8110: 72 20 2a 70 7a 4f 75 74 20 69 73 20 73 65 74 20  r *pzOut is set 
8120: 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  to point to the 
8130: 6e 65 78 74 20 53 51 4c 20 73 74 61 74 65 6d 65  next SQL stateme
8140: 6e 74 20 69 6e 0a 2a 2a 20 62 75 66 66 65 72 20  nt in.** buffer 
8150: 7a 49 6e 2c 20 6f 72 20 74 6f 20 74 68 65 20 27  zIn, or to the '
8160: 5c 30 27 20 62 79 74 65 20 61 74 20 74 68 65 20  \0' byte at the 
8170: 65 6e 64 20 6f 66 20 7a 49 6e 20 69 66 20 74 68  end of zIn if th
8180: 65 72 65 20 69 73 20 6e 6f 0a 2a 2a 20 6e 65 78  ere is no.** nex
8190: 74 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a  t statement..**.
81a0: 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  ** If successful
81b0: 2c 20 54 43 4c 5f 4f 4b 20 69 73 20 72 65 74 75  , TCL_OK is retu
81c0: 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c  rned. Otherwise,
81d0: 20 54 43 4c 5f 45 52 52 4f 52 20 69 73 20 72 65   TCL_ERROR is re
81e0: 74 75 72 6e 65 64 0a 2a 2a 20 61 6e 64 20 61 6e  turned.** and an
81f0: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 6c   error message l
8200: 6f 61 64 65 64 20 69 6e 74 6f 20 69 6e 74 65 72  oaded into inter
8210: 70 72 65 74 65 72 20 70 44 62 2d 3e 69 6e 74 65  preter pDb->inte
8220: 72 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  rp..*/.static in
8230: 74 20 64 62 50 72 65 70 61 72 65 41 6e 64 42 69  t dbPrepareAndBi
8240: 6e 64 28 0a 20 20 53 71 6c 69 74 65 44 62 20 2a  nd(.  SqliteDb *
8250: 70 44 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  pDb,            
8260: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
8270: 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 68  e object */.  ch
8280: 61 72 20 63 6f 6e 73 74 20 2a 7a 49 6e 2c 20 20  ar const *zIn,  
8290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
82a0: 20 53 51 4c 20 74 6f 20 63 6f 6d 70 69 6c 65 20   SQL to compile 
82b0: 2a 2f 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20  */.  char const 
82c0: 2a 2a 70 7a 4f 75 74 2c 20 20 20 20 20 20 20 20  **pzOut,        
82d0: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 50 6f 69       /* OUT: Poi
82e0: 6e 74 65 72 20 74 6f 20 6e 65 78 74 20 53 51 4c  nter to next SQL
82f0: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
8300: 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74 20  SqlPreparedStmt 
8310: 2a 2a 70 70 50 72 65 53 74 6d 74 20 20 20 20 20  **ppPreStmt     
8320: 2f 2a 20 4f 55 54 3a 20 4f 62 6a 65 63 74 20 75  /* OUT: Object u
8330: 73 65 64 20 74 6f 20 63 61 63 68 65 20 73 74 61  sed to cache sta
8340: 74 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 63  tement */.){.  c
8350: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 20  onst char *zSql 
8360: 3d 20 7a 49 6e 3b 20 20 20 20 20 20 20 20 20 2f  = zIn;         /
8370: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 66 69 72  * Pointer to fir
8380: 73 74 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  st SQL statement
8390: 20 69 6e 20 7a 49 6e 20 2a 2f 0a 20 20 73 71 6c   in zIn */.  sql
83a0: 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
83b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
83c0: 50 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  Prepared stateme
83d0: 6e 74 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 53  nt object */.  S
83e0: 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74 20 2a  qlPreparedStmt *
83f0: 70 50 72 65 53 74 6d 74 3b 20 20 20 20 20 20 2f  pPreStmt;      /
8400: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 63 61 63  * Pointer to cac
8410: 68 65 64 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  hed statement */
8420: 0a 20 20 69 6e 74 20 6e 53 71 6c 3b 20 20 20 20  .  int nSql;    
8430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8440: 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20     /* Length of 
8450: 7a 53 71 6c 20 69 6e 20 62 79 74 65 73 20 2a 2f  zSql in bytes */
8460: 0a 20 20 69 6e 74 20 6e 56 61 72 3b 20 20 20 20  .  int nVar;    
8470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8480: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
8490: 76 61 72 69 61 62 6c 65 73 20 69 6e 20 73 74 61  variables in sta
84a0: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  tement */.  int 
84b0: 69 50 61 72 6d 20 3d 20 30 3b 20 20 20 20 20 20  iParm = 0;      
84c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
84d0: 65 78 74 20 66 72 65 65 20 65 6e 74 72 79 20 69  ext free entry i
84e0: 6e 20 61 70 50 61 72 6d 20 2a 2f 0a 20 20 69 6e  n apParm */.  in
84f0: 74 20 69 3b 0a 20 20 54 63 6c 5f 49 6e 74 65 72  t i;.  Tcl_Inter
8500: 70 20 2a 69 6e 74 65 72 70 20 3d 20 70 44 62 2d  p *interp = pDb-
8510: 3e 69 6e 74 65 72 70 3b 0a 0a 20 20 2a 70 70 50  >interp;..  *ppP
8520: 72 65 53 74 6d 74 20 3d 20 30 3b 0a 0a 20 20 2f  reStmt = 0;..  /
8530: 2a 20 54 72 69 6d 20 73 70 61 63 65 73 20 66 72  * Trim spaces fr
8540: 6f 6d 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  om the start of 
8550: 7a 53 71 6c 20 61 6e 64 20 63 61 6c 63 75 6c 61  zSql and calcula
8560: 74 65 20 74 68 65 20 72 65 6d 61 69 6e 69 6e 67  te the remaining
8570: 20 6c 65 6e 67 74 68 2e 20 2a 2f 0a 20 20 77 68   length. */.  wh
8580: 69 6c 65 28 20 69 73 73 70 61 63 65 28 7a 53 71  ile( isspace(zSq
8590: 6c 5b 30 5d 29 20 29 7b 20 7a 53 71 6c 2b 2b 3b  l[0]) ){ zSql++;
85a0: 20 7d 0a 20 20 6e 53 71 6c 20 3d 20 73 74 72 6c   }.  nSql = strl
85b0: 65 6e 33 30 28 7a 53 71 6c 29 3b 0a 0a 20 20 66  en30(zSql);..  f
85c0: 6f 72 28 70 50 72 65 53 74 6d 74 20 3d 20 70 44  or(pPreStmt = pD
85d0: 62 2d 3e 73 74 6d 74 4c 69 73 74 3b 20 70 50 72  b->stmtList; pPr
85e0: 65 53 74 6d 74 3b 20 70 50 72 65 53 74 6d 74 3d  eStmt; pPreStmt=
85f0: 70 50 72 65 53 74 6d 74 2d 3e 70 4e 65 78 74 29  pPreStmt->pNext)
8600: 7b 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 50  {.    int n = pP
8610: 72 65 53 74 6d 74 2d 3e 6e 53 71 6c 3b 0a 20 20  reStmt->nSql;.  
8620: 20 20 69 66 28 20 6e 53 71 6c 3e 3d 6e 20 0a 20    if( nSql>=n . 
8630: 20 20 20 20 20 20 20 26 26 20 6d 65 6d 63 6d 70         && memcmp
8640: 28 70 50 72 65 53 74 6d 74 2d 3e 7a 53 71 6c 2c  (pPreStmt->zSql,
8650: 20 7a 53 71 6c 2c 20 6e 29 3d 3d 30 0a 20 20 20   zSql, n)==0.   
8660: 20 20 20 20 20 26 26 20 28 7a 53 71 6c 5b 6e 5d       && (zSql[n]
8670: 3d 3d 30 20 7c 7c 20 7a 53 71 6c 5b 6e 2d 31 5d  ==0 || zSql[n-1]
8680: 3d 3d 27 3b 27 29 0a 20 20 20 20 29 7b 0a 20 20  ==';').    ){.  
8690: 20 20 20 20 70 53 74 6d 74 20 3d 20 70 50 72 65      pStmt = pPre
86a0: 53 74 6d 74 2d 3e 70 53 74 6d 74 3b 0a 20 20 20  Stmt->pStmt;.   
86b0: 20 20 20 2a 70 7a 4f 75 74 20 3d 20 26 7a 53 71     *pzOut = &zSq
86c0: 6c 5b 70 50 72 65 53 74 6d 74 2d 3e 6e 53 71 6c  l[pPreStmt->nSql
86d0: 5d 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57 68 65  ];..      /* Whe
86e0: 6e 20 61 20 70 72 65 70 61 72 65 64 20 73 74 61  n a prepared sta
86f0: 74 65 6d 65 6e 74 20 69 73 20 66 6f 75 6e 64 2c  tement is found,
8700: 20 75 6e 6c 69 6e 6b 20 69 74 20 66 72 6f 6d 20   unlink it from 
8710: 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 63 61 63  the.      ** cac
8720: 68 65 20 6c 69 73 74 2e 20 20 49 74 20 77 69 6c  he list.  It wil
8730: 6c 20 6c 61 74 65 72 20 62 65 20 61 64 64 65 64  l later be added
8740: 20 62 61 63 6b 20 74 6f 20 74 68 65 20 62 65 67   back to the beg
8750: 69 6e 6e 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20  inning.      ** 
8760: 6f 66 20 74 68 65 20 63 61 63 68 65 20 6c 69 73  of the cache lis
8770: 74 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6d  t in order to im
8780: 70 6c 65 6d 65 6e 74 20 4c 52 55 20 72 65 70 6c  plement LRU repl
8790: 61 63 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20 2a  acement..      *
87a0: 2f 0a 20 20 20 20 20 20 69 66 28 20 70 50 72 65  /.      if( pPre
87b0: 53 74 6d 74 2d 3e 70 50 72 65 76 20 29 7b 0a 20  Stmt->pPrev ){. 
87c0: 20 20 20 20 20 20 20 70 50 72 65 53 74 6d 74 2d         pPreStmt-
87d0: 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20  >pPrev->pNext = 
87e0: 70 50 72 65 53 74 6d 74 2d 3e 70 4e 65 78 74 3b  pPreStmt->pNext;
87f0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
8800: 20 20 20 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c        pDb->stmtL
8810: 69 73 74 20 3d 20 70 50 72 65 53 74 6d 74 2d 3e  ist = pPreStmt->
8820: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20  pNext;.      }. 
8830: 20 20 20 20 20 69 66 28 20 70 50 72 65 53 74 6d       if( pPreStm
8840: 74 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20  t->pNext ){.    
8850: 20 20 20 20 70 50 72 65 53 74 6d 74 2d 3e 70 4e      pPreStmt->pN
8860: 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 50 72  ext->pPrev = pPr
8870: 65 53 74 6d 74 2d 3e 70 50 72 65 76 3b 0a 20 20  eStmt->pPrev;.  
8880: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
8890: 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74     pDb->stmtLast
88a0: 20 3d 20 70 50 72 65 53 74 6d 74 2d 3e 70 50 72   = pPreStmt->pPr
88b0: 65 76 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ev;.      }.    
88c0: 20 20 70 44 62 2d 3e 6e 53 74 6d 74 2d 2d 3b 0a    pDb->nStmt--;.
88d0: 20 20 20 20 20 20 6e 56 61 72 20 3d 20 73 71 6c        nVar = sql
88e0: 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65  ite3_bind_parame
88f0: 74 65 72 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29  ter_count(pStmt)
8900: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
8910: 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a     }.  }.  .  /*
8920: 20 49 66 20 6e 6f 20 70 72 65 70 61 72 65 64 20   If no prepared 
8930: 73 74 61 74 65 6d 65 6e 74 20 77 61 73 20 66 6f  statement was fo
8940: 75 6e 64 2e 20 43 6f 6d 70 69 6c 65 20 74 68 65  und. Compile the
8950: 20 53 51 4c 20 74 65 78 74 2e 20 41 6c 73 6f 20   SQL text. Also 
8960: 61 6c 6c 6f 63 61 74 65 0a 20 20 2a 2a 20 61 20  allocate.  ** a 
8970: 6e 65 77 20 53 71 6c 50 72 65 70 61 72 65 64 53  new SqlPreparedS
8980: 74 6d 74 20 73 74 72 75 63 74 75 72 65 2e 20 20  tmt structure.  
8990: 2a 2f 0a 20 20 69 66 28 20 70 50 72 65 53 74 6d  */.  if( pPreStm
89a0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  t==0 ){.    int 
89b0: 6e 42 79 74 65 3b 0a 0a 20 20 20 20 69 66 28 20  nByte;..    if( 
89c0: 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74  SQLITE_OK!=sqlit
89d0: 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70 44  e3_prepare_v2(pD
89e0: 62 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c  b->db, zSql, -1,
89f0: 20 26 70 53 74 6d 74 2c 20 70 7a 4f 75 74 29 20   &pStmt, pzOut) 
8a00: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74  ){.      Tcl_Set
8a10: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
8a20: 2c 20 64 62 54 65 78 74 54 6f 4f 62 6a 28 73 71  , dbTextToObj(sq
8a30: 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62  lite3_errmsg(pDb
8a40: 2d 3e 64 62 29 29 29 3b 0a 20 20 20 20 20 20 72  ->db)));.      r
8a50: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
8a60: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
8a70: 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Stmt==0 ){.     
8a80: 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
8a90: 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28  sqlite3_errcode(
8aa0: 70 44 62 2d 3e 64 62 29 20 29 7b 0a 20 20 20 20  pDb->db) ){.    
8ab0: 20 20 20 20 2f 2a 20 41 20 63 6f 6d 70 69 6c 65      /* A compile
8ac0: 2d 74 69 6d 65 20 65 72 72 6f 72 20 69 6e 20 74  -time error in t
8ad0: 68 65 20 73 74 61 74 65 6d 65 6e 74 2e 20 2a 2f  he statement. */
8ae0: 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 53 65 74  .        Tcl_Set
8af0: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
8b00: 2c 20 64 62 54 65 78 74 54 6f 4f 62 6a 28 73 71  , dbTextToObj(sq
8b10: 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62  lite3_errmsg(pDb
8b20: 2d 3e 64 62 29 29 29 3b 0a 20 20 20 20 20 20 20  ->db)));.       
8b30: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
8b40: 52 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  R;.      }else{.
8b50: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73          /* The s
8b60: 74 61 74 65 6d 65 6e 74 20 77 61 73 20 61 20 6e  tatement was a n
8b70: 6f 2d 6f 70 2e 20 20 43 6f 6e 74 69 6e 75 65 20  o-op.  Continue 
8b80: 74 6f 20 74 68 65 20 6e 65 78 74 20 73 74 61 74  to the next stat
8b90: 65 6d 65 6e 74 0a 20 20 20 20 20 20 20 20 2a 2a  ement.        **
8ba0: 20 69 6e 20 74 68 65 20 53 51 4c 20 73 74 72 69   in the SQL stri
8bb0: 6e 67 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ng..        */. 
8bc0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43         return TC
8bd0: 4c 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  L_OK;.      }.  
8be0: 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28    }..    assert(
8bf0: 20 70 50 72 65 53 74 6d 74 3d 3d 30 20 29 3b 0a   pPreStmt==0 );.
8c00: 20 20 20 20 6e 56 61 72 20 3d 20 73 71 6c 69 74      nVar = sqlit
8c10: 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65  e3_bind_paramete
8c20: 72 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29 3b 0a  r_count(pStmt);.
8c30: 20 20 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65      nByte = size
8c40: 6f 66 28 53 71 6c 50 72 65 70 61 72 65 64 53 74  of(SqlPreparedSt
8c50: 6d 74 29 20 2b 20 6e 56 61 72 2a 73 69 7a 65 6f  mt) + nVar*sizeo
8c60: 66 28 54 63 6c 5f 4f 62 6a 20 2a 29 3b 0a 20 20  f(Tcl_Obj *);.  
8c70: 20 20 70 50 72 65 53 74 6d 74 20 3d 20 28 53 71    pPreStmt = (Sq
8c80: 6c 50 72 65 70 61 72 65 64 53 74 6d 74 2a 29 54  lPreparedStmt*)T
8c90: 63 6c 5f 41 6c 6c 6f 63 28 6e 42 79 74 65 29 3b  cl_Alloc(nByte);
8ca0: 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 50 72 65  .    memset(pPre
8cb0: 53 74 6d 74 2c 20 30 2c 20 6e 42 79 74 65 29 3b  Stmt, 0, nByte);
8cc0: 0a 0a 20 20 20 20 70 50 72 65 53 74 6d 74 2d 3e  ..    pPreStmt->
8cd0: 70 53 74 6d 74 20 3d 20 70 53 74 6d 74 3b 0a 20  pStmt = pStmt;. 
8ce0: 20 20 20 70 50 72 65 53 74 6d 74 2d 3e 6e 53 71     pPreStmt->nSq
8cf0: 6c 20 3d 20 28 2a 70 7a 4f 75 74 20 2d 20 7a 53  l = (*pzOut - zS
8d00: 71 6c 29 3b 0a 20 20 20 20 70 50 72 65 53 74 6d  ql);.    pPreStm
8d10: 74 2d 3e 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65  t->zSql = sqlite
8d20: 33 5f 73 71 6c 28 70 53 74 6d 74 29 3b 0a 20 20  3_sql(pStmt);.  
8d30: 20 20 70 50 72 65 53 74 6d 74 2d 3e 61 70 50 61    pPreStmt->apPa
8d40: 72 6d 20 3d 20 28 54 63 6c 5f 4f 62 6a 20 2a 2a  rm = (Tcl_Obj **
8d50: 29 26 70 50 72 65 53 74 6d 74 5b 31 5d 3b 0a 20  )&pPreStmt[1];. 
8d60: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 72   }.  assert( pPr
8d70: 65 53 74 6d 74 20 29 3b 0a 20 20 61 73 73 65 72  eStmt );.  asser
8d80: 74 28 20 73 74 72 6c 65 6e 33 30 28 70 50 72 65  t( strlen30(pPre
8d90: 53 74 6d 74 2d 3e 7a 53 71 6c 29 3d 3d 70 50 72  Stmt->zSql)==pPr
8da0: 65 53 74 6d 74 2d 3e 6e 53 71 6c 20 29 3b 0a 20  eStmt->nSql );. 
8db0: 20 61 73 73 65 72 74 28 20 30 3d 3d 6d 65 6d 63   assert( 0==memc
8dc0: 6d 70 28 70 50 72 65 53 74 6d 74 2d 3e 7a 53 71  mp(pPreStmt->zSq
8dd0: 6c 2c 20 7a 53 71 6c 2c 20 70 50 72 65 53 74 6d  l, zSql, pPreStm
8de0: 74 2d 3e 6e 53 71 6c 29 20 29 3b 0a 0a 20 20 2f  t->nSql) );..  /
8df0: 2a 20 42 69 6e 64 20 76 61 6c 75 65 73 20 74 6f  * Bind values to
8e00: 20 70 61 72 61 6d 65 74 65 72 73 20 74 68 61 74   parameters that
8e10: 20 62 65 67 69 6e 20 77 69 74 68 20 24 20 6f 72   begin with $ or
8e20: 20 3a 20 2a 2f 20 20 0a 20 20 66 6f 72 28 69 3d   : */  .  for(i=
8e30: 31 3b 20 69 3c 3d 6e 56 61 72 3b 20 69 2b 2b 29  1; i<=nVar; i++)
8e40: 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
8e50: 20 2a 7a 56 61 72 20 3d 20 73 71 6c 69 74 65 33   *zVar = sqlite3
8e60: 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f  _bind_parameter_
8e70: 6e 61 6d 65 28 70 53 74 6d 74 2c 20 69 29 3b 0a  name(pStmt, i);.
8e80: 20 20 20 20 69 66 28 20 7a 56 61 72 21 3d 30 20      if( zVar!=0 
8e90: 26 26 20 28 7a 56 61 72 5b 30 5d 3d 3d 27 24 27  && (zVar[0]=='$'
8ea0: 20 7c 7c 20 7a 56 61 72 5b 30 5d 3d 3d 27 3a 27   || zVar[0]==':'
8eb0: 20 7c 7c 20 7a 56 61 72 5b 30 5d 3d 3d 27 40 27   || zVar[0]=='@'
8ec0: 29 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 4f  ) ){.      Tcl_O
8ed0: 62 6a 20 2a 70 56 61 72 20 3d 20 54 63 6c 5f 47  bj *pVar = Tcl_G
8ee0: 65 74 56 61 72 32 45 78 28 69 6e 74 65 72 70 2c  etVar2Ex(interp,
8ef0: 20 26 7a 56 61 72 5b 31 5d 2c 20 30 2c 20 30 29   &zVar[1], 0, 0)
8f00: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 56 61 72  ;.      if( pVar
8f10: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
8f20: 6e 3b 0a 20 20 20 20 20 20 20 20 75 38 20 2a 64  n;.        u8 *d
8f30: 61 74 61 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e  ata;.        con
8f40: 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 20 3d  st char *zType =
8f50: 20 28 70 56 61 72 2d 3e 74 79 70 65 50 74 72 20   (pVar->typePtr 
8f60: 3f 20 70 56 61 72 2d 3e 74 79 70 65 50 74 72 2d  ? pVar->typePtr-
8f70: 3e 6e 61 6d 65 20 3a 20 22 22 29 3b 0a 20 20 20  >name : "");.   
8f80: 20 20 20 20 20 63 68 61 72 20 63 20 3d 20 7a 54       char c = zT
8f90: 79 70 65 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20  ype[0];.        
8fa0: 69 66 28 20 7a 56 61 72 5b 30 5d 3d 3d 27 40 27  if( zVar[0]=='@'
8fb0: 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20 28   ||.           (
8fc0: 63 3d 3d 27 62 27 20 26 26 20 73 74 72 63 6d 70  c=='b' && strcmp
8fd0: 28 7a 54 79 70 65 2c 22 62 79 74 65 61 72 72 61  (zType,"bytearra
8fe0: 79 22 29 3d 3d 30 20 26 26 20 70 56 61 72 2d 3e  y")==0 && pVar->
8ff0: 62 79 74 65 73 3d 3d 30 29 20 29 7b 0a 20 20 20  bytes==0) ){.   
9000: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 61 64 20 61         /* Load a
9010: 20 42 4c 4f 42 20 74 79 70 65 20 69 66 20 74 68   BLOB type if th
9020: 65 20 54 63 6c 20 76 61 72 69 61 62 6c 65 20 69  e Tcl variable i
9030: 73 20 61 20 62 79 74 65 61 72 72 61 79 20 61 6e  s a bytearray an
9040: 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69  d.          ** i
9050: 74 20 68 61 73 20 6e 6f 20 73 74 72 69 6e 67 20  t has no string 
9060: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f  representation o
9070: 72 20 74 68 65 20 68 6f 73 74 0a 20 20 20 20 20  r the host.     
9080: 20 20 20 20 20 2a 2a 20 70 61 72 61 6d 65 74 65       ** paramete
9090: 72 20 6e 61 6d 65 20 62 65 67 69 6e 73 20 77 69  r name begins wi
90a0: 74 68 20 22 40 22 2e 20 2a 2f 0a 20 20 20 20 20  th "@". */.     
90b0: 20 20 20 20 20 64 61 74 61 20 3d 20 54 63 6c 5f       data = Tcl_
90c0: 47 65 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d  GetByteArrayFrom
90d0: 4f 62 6a 28 70 56 61 72 2c 20 26 6e 29 3b 0a 20  Obj(pVar, &n);. 
90e0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
90f0: 5f 62 69 6e 64 5f 62 6c 6f 62 28 70 53 74 6d 74  _bind_blob(pStmt
9100: 2c 20 69 2c 20 64 61 74 61 2c 20 6e 2c 20 53 51  , i, data, n, SQ
9110: 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20  LITE_STATIC);.  
9120: 20 20 20 20 20 20 20 20 54 63 6c 5f 49 6e 63 72          Tcl_Incr
9130: 52 65 66 43 6f 75 6e 74 28 70 56 61 72 29 3b 0a  RefCount(pVar);.
9140: 20 20 20 20 20 20 20 20 20 20 70 50 72 65 53 74            pPreSt
9150: 6d 74 2d 3e 61 70 50 61 72 6d 5b 69 50 61 72 6d  mt->apParm[iParm
9160: 2b 2b 5d 20 3d 20 70 56 61 72 3b 0a 20 20 20 20  ++] = pVar;.    
9170: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d      }else if( c=
9180: 3d 27 62 27 20 26 26 20 73 74 72 63 6d 70 28 7a  ='b' && strcmp(z
9190: 54 79 70 65 2c 22 62 6f 6f 6c 65 61 6e 22 29 3d  Type,"boolean")=
91a0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
91b0: 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
91c0: 6a 28 69 6e 74 65 72 70 2c 20 70 56 61 72 2c 20  j(interp, pVar, 
91d0: 26 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  &n);.          s
91e0: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28  qlite3_bind_int(
91f0: 70 53 74 6d 74 2c 20 69 2c 20 6e 29 3b 0a 20 20  pStmt, i, n);.  
9200: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
9210: 63 3d 3d 27 64 27 20 26 26 20 73 74 72 63 6d 70  c=='d' && strcmp
9220: 28 7a 54 79 70 65 2c 22 64 6f 75 62 6c 65 22 29  (zType,"double")
9230: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
9240: 20 64 6f 75 62 6c 65 20 72 3b 0a 20 20 20 20 20   double r;.     
9250: 20 20 20 20 20 54 63 6c 5f 47 65 74 44 6f 75 62       Tcl_GetDoub
9260: 6c 65 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  leFromObj(interp
9270: 2c 20 70 56 61 72 2c 20 26 72 29 3b 0a 20 20 20  , pVar, &r);.   
9280: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62         sqlite3_b
9290: 69 6e 64 5f 64 6f 75 62 6c 65 28 70 53 74 6d 74  ind_double(pStmt
92a0: 2c 20 69 2c 20 72 29 3b 0a 20 20 20 20 20 20 20  , i, r);.       
92b0: 20 7d 65 6c 73 65 20 69 66 28 20 28 63 3d 3d 27   }else if( (c=='
92c0: 77 27 20 26 26 20 73 74 72 63 6d 70 28 7a 54 79  w' && strcmp(zTy
92d0: 70 65 2c 22 77 69 64 65 49 6e 74 22 29 3d 3d 30  pe,"wideInt")==0
92e0: 29 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20  ) ||.           
92f0: 20 20 20 28 63 3d 3d 27 69 27 20 26 26 20 73 74     (c=='i' && st
9300: 72 63 6d 70 28 7a 54 79 70 65 2c 22 69 6e 74 22  rcmp(zType,"int"
9310: 29 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20  )==0) ){.       
9320: 20 20 20 54 63 6c 5f 57 69 64 65 49 6e 74 20 76     Tcl_WideInt v
9330: 3b 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f  ;.          Tcl_
9340: 47 65 74 57 69 64 65 49 6e 74 46 72 6f 6d 4f 62  GetWideIntFromOb
9350: 6a 28 69 6e 74 65 72 70 2c 20 70 56 61 72 2c 20  j(interp, pVar, 
9360: 26 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  &v);.          s
9370: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36  qlite3_bind_int6
9380: 34 28 70 53 74 6d 74 2c 20 69 2c 20 76 29 3b 0a  4(pStmt, i, v);.
9390: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
93a0: 20 20 20 20 20 20 20 20 20 64 61 74 61 20 3d 20           data = 
93b0: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  (unsigned char *
93c0: 29 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72  )Tcl_GetStringFr
93d0: 6f 6d 4f 62 6a 28 70 56 61 72 2c 20 26 6e 29 3b  omObj(pVar, &n);
93e0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
93f0: 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 53 74  e3_bind_text(pSt
9400: 6d 74 2c 20 69 2c 20 28 63 68 61 72 20 2a 29 64  mt, i, (char *)d
9410: 61 74 61 2c 20 6e 2c 20 53 51 4c 49 54 45 5f 53  ata, n, SQLITE_S
9420: 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 20 20  TATIC);.        
9430: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
9440: 6e 74 28 70 56 61 72 29 3b 0a 20 20 20 20 20 20  nt(pVar);.      
9450: 20 20 20 20 70 50 72 65 53 74 6d 74 2d 3e 61 70      pPreStmt->ap
9460: 50 61 72 6d 5b 69 50 61 72 6d 2b 2b 5d 20 3d 20  Parm[iParm++] = 
9470: 70 56 61 72 3b 0a 20 20 20 20 20 20 20 20 7d 0a  pVar;.        }.
9480: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
9490: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e       sqlite3_bin
94a0: 64 5f 6e 75 6c 6c 28 70 53 74 6d 74 2c 20 69 29  d_null(pStmt, i)
94b0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
94c0: 20 20 7d 0a 20 20 70 50 72 65 53 74 6d 74 2d 3e    }.  pPreStmt->
94d0: 6e 50 61 72 6d 20 3d 20 69 50 61 72 6d 3b 0a 20  nParm = iParm;. 
94e0: 20 2a 70 70 50 72 65 53 74 6d 74 20 3d 20 70 50   *ppPreStmt = pP
94f0: 72 65 53 74 6d 74 3b 0a 0a 20 20 72 65 74 75 72  reStmt;..  retur
9500: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a  n TCL_OK;.}.../*
9510: 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 73 74  .** Release a st
9520: 61 74 65 6d 65 6e 74 20 72 65 66 65 72 65 6e 63  atement referenc
9530: 65 20 6f 62 74 61 69 6e 65 64 20 62 79 20 63 61  e obtained by ca
9540: 6c 6c 69 6e 67 20 64 62 50 72 65 70 61 72 65 41  lling dbPrepareA
9550: 6e 64 42 69 6e 64 28 29 2e 0a 2a 2a 20 54 68 65  ndBind()..** The
9560: 72 65 20 73 68 6f 75 6c 64 20 62 65 20 65 78 61  re should be exa
9570: 63 74 6c 79 20 6f 6e 65 20 63 61 6c 6c 20 74 6f  ctly one call to
9580: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 66   this function f
9590: 6f 72 20 65 61 63 68 20 63 61 6c 6c 20 74 6f 0a  or each call to.
95a0: 2a 2a 20 64 62 50 72 65 70 61 72 65 41 6e 64 42  ** dbPrepareAndB
95b0: 69 6e 64 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ind()..**.** If 
95c0: 74 68 65 20 64 69 73 63 61 72 64 20 70 61 72 61  the discard para
95d0: 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72  meter is non-zer
95e0: 6f 2c 20 74 68 65 6e 20 74 68 65 20 73 74 61 74  o, then the stat
95f0: 65 6d 65 6e 74 20 69 73 20 64 65 6c 65 74 65 64  ement is deleted
9600: 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e  .** immediately.
9610: 20 4f 74 68 65 72 77 69 73 65 20 69 74 20 69 73   Otherwise it is
9620: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 4c 52   added to the LR
9630: 55 20 6c 69 73 74 20 61 6e 64 20 6d 61 79 20 62  U list and may b
9640: 65 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 62 79  e returned.** by
9650: 20 61 20 73 75 62 73 65 71 75 65 6e 74 20 63 61   a subsequent ca
9660: 6c 6c 20 74 6f 20 64 62 50 72 65 70 61 72 65 41  ll to dbPrepareA
9670: 6e 64 42 69 6e 64 28 29 2e 0a 2a 2f 0a 73 74 61  ndBind()..*/.sta
9680: 74 69 63 20 76 6f 69 64 20 64 62 52 65 6c 65 61  tic void dbRelea
9690: 73 65 53 74 6d 74 28 0a 20 20 53 71 6c 69 74 65  seStmt(.  Sqlite
96a0: 44 62 20 2a 70 44 62 2c 20 20 20 20 20 20 20 20  Db *pDb,        
96b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
96c0: 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a  abase handle */.
96d0: 20 20 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d    SqlPreparedStm
96e0: 74 20 2a 70 50 72 65 53 74 6d 74 2c 20 20 20 20  t *pPreStmt,    
96f0: 20 20 2f 2a 20 50 72 65 70 61 72 65 64 20 73 74    /* Prepared st
9700: 61 74 65 6d 65 6e 74 20 68 61 6e 64 6c 65 20 74  atement handle t
9710: 6f 20 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 69  o release */.  i
9720: 6e 74 20 64 69 73 63 61 72 64 20 20 20 20 20 20  nt discard      
9730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9740: 2a 20 54 72 75 65 20 74 6f 20 64 65 6c 65 74 65  * True to delete
9750: 20 28 6e 6f 74 20 63 61 63 68 65 29 20 74 68 65   (not cache) the
9760: 20 70 50 72 65 53 74 6d 74 20 2a 2f 0a 29 7b 0a   pPreStmt */.){.
9770: 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 46    int i;..  /* F
9780: 72 65 65 20 74 68 65 20 62 6f 75 6e 64 20 73 74  ree the bound st
9790: 72 69 6e 67 20 61 6e 64 20 62 6c 6f 62 20 70 61  ring and blob pa
97a0: 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20 66 6f  rameters */.  fo
97b0: 72 28 69 3d 30 3b 20 69 3c 70 50 72 65 53 74 6d  r(i=0; i<pPreStm
97c0: 74 2d 3e 6e 50 61 72 6d 3b 20 69 2b 2b 29 7b 0a  t->nParm; i++){.
97d0: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
97e0: 6f 75 6e 74 28 70 50 72 65 53 74 6d 74 2d 3e 61  ount(pPreStmt->a
97f0: 70 50 61 72 6d 5b 69 5d 29 3b 0a 20 20 7d 0a 20  pParm[i]);.  }. 
9800: 20 70 50 72 65 53 74 6d 74 2d 3e 6e 50 61 72 6d   pPreStmt->nParm
9810: 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70 44 62   = 0;..  if( pDb
9820: 2d 3e 6d 61 78 53 74 6d 74 3c 3d 30 20 7c 7c 20  ->maxStmt<=0 || 
9830: 64 69 73 63 61 72 64 20 29 7b 0a 20 20 20 20 2f  discard ){.    /
9840: 2a 20 49 66 20 74 68 65 20 63 61 63 68 65 20 69  * If the cache i
9850: 73 20 74 75 72 6e 65 64 20 6f 66 66 2c 20 64 65  s turned off, de
9860: 61 6c 6c 6f 63 61 74 65 64 20 74 68 65 20 73 74  allocated the st
9870: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 73  atement */.    s
9880: 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
9890: 70 50 72 65 53 74 6d 74 2d 3e 70 53 74 6d 74 29  pPreStmt->pStmt)
98a0: 3b 0a 20 20 20 20 54 63 6c 5f 46 72 65 65 28 28  ;.    Tcl_Free((
98b0: 63 68 61 72 20 2a 29 70 50 72 65 53 74 6d 74 29  char *)pPreStmt)
98c0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
98d0: 2a 20 41 64 64 20 74 68 65 20 70 72 65 70 61 72  * Add the prepar
98e0: 65 64 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20  ed statement to 
98f0: 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
9900: 20 74 68 65 20 63 61 63 68 65 20 6c 69 73 74 2e   the cache list.
9910: 20 2a 2f 0a 20 20 20 20 70 50 72 65 53 74 6d 74   */.    pPreStmt
9920: 2d 3e 70 4e 65 78 74 20 3d 20 70 44 62 2d 3e 73  ->pNext = pDb->s
9930: 74 6d 74 4c 69 73 74 3b 0a 20 20 20 20 70 50 72  tmtList;.    pPr
9940: 65 53 74 6d 74 2d 3e 70 50 72 65 76 20 3d 20 30  eStmt->pPrev = 0
9950: 3b 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e 73  ;.    if( pDb->s
9960: 74 6d 74 4c 69 73 74 20 29 7b 0a 20 20 20 20 20  tmtList ){.     
9970: 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74 2d 3e 70  pDb->stmtList->p
9980: 50 72 65 76 20 3d 20 70 50 72 65 53 74 6d 74 3b  Prev = pPreStmt;
9990: 0a 20 20 20 20 7d 0a 20 20 20 20 70 44 62 2d 3e  .    }.    pDb->
99a0: 73 74 6d 74 4c 69 73 74 20 3d 20 70 50 72 65 53  stmtList = pPreS
99b0: 74 6d 74 3b 0a 20 20 20 20 69 66 28 20 70 44 62  tmt;.    if( pDb
99c0: 2d 3e 73 74 6d 74 4c 61 73 74 3d 3d 30 20 29 7b  ->stmtLast==0 ){
99d0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
99e0: 44 62 2d 3e 6e 53 74 6d 74 3d 3d 30 20 29 3b 0a  Db->nStmt==0 );.
99f0: 20 20 20 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c        pDb->stmtL
9a00: 61 73 74 20 3d 20 70 50 72 65 53 74 6d 74 3b 0a  ast = pPreStmt;.
9a10: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
9a20: 20 61 73 73 65 72 74 28 20 70 44 62 2d 3e 6e 53   assert( pDb->nS
9a30: 74 6d 74 3e 30 20 29 3b 0a 20 20 20 20 7d 0a 20  tmt>0 );.    }. 
9a40: 20 20 20 70 44 62 2d 3e 6e 53 74 6d 74 2b 2b 3b     pDb->nStmt++;
9a50: 0a 20 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 77  .   .    /* If w
9a60: 65 20 68 61 76 65 20 74 6f 6f 20 6d 61 6e 79 20  e have too many 
9a70: 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 63 61 63  statement in cac
9a80: 68 65 2c 20 72 65 6d 6f 76 65 20 74 68 65 20 73  he, remove the s
9a90: 75 72 70 6c 75 73 20 66 72 6f 6d 20 0a 20 20 20  urplus from .   
9aa0: 20 2a 2a 20 74 68 65 20 65 6e 64 20 6f 66 20 74   ** the end of t
9ab0: 68 65 20 63 61 63 68 65 20 6c 69 73 74 2e 20 20  he cache list.  
9ac0: 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28 20 70 44  */.    while( pD
9ad0: 62 2d 3e 6e 53 74 6d 74 3e 70 44 62 2d 3e 6d 61  b->nStmt>pDb->ma
9ae0: 78 53 74 6d 74 20 29 7b 0a 20 20 20 20 20 20 73  xStmt ){.      s
9af0: 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
9b00: 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74 2d 3e 70  pDb->stmtLast->p
9b10: 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 70 44 62  Stmt);.      pDb
9b20: 2d 3e 73 74 6d 74 4c 61 73 74 20 3d 20 70 44 62  ->stmtLast = pDb
9b30: 2d 3e 73 74 6d 74 4c 61 73 74 2d 3e 70 50 72 65  ->stmtLast->pPre
9b40: 76 3b 0a 20 20 20 20 20 20 54 63 6c 5f 46 72 65  v;.      Tcl_Fre
9b50: 65 28 28 63 68 61 72 2a 29 70 44 62 2d 3e 73 74  e((char*)pDb->st
9b60: 6d 74 4c 61 73 74 2d 3e 70 4e 65 78 74 29 3b 0a  mtLast->pNext);.
9b70: 20 20 20 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c        pDb->stmtL
9b80: 61 73 74 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a  ast->pNext = 0;.
9b90: 20 20 20 20 20 20 70 44 62 2d 3e 6e 53 74 6d 74        pDb->nStmt
9ba0: 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  --;.    }.  }.}.
9bb0: 0a 2f 2a 0a 2a 2a 20 53 74 72 75 63 74 75 72 65  ./*.** Structure
9bc0: 20 75 73 65 64 20 77 69 74 68 20 64 62 45 76 61   used with dbEva
9bd0: 6c 58 58 58 28 29 20 66 75 6e 63 74 69 6f 6e 73  lXXX() functions
9be0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 64 62 45 76 61 6c  :.**.**   dbEval
9bf0: 49 6e 69 74 28 29 0a 2a 2a 20 20 20 64 62 45 76  Init().**   dbEv
9c00: 61 6c 53 74 65 70 28 29 0a 2a 2a 20 20 20 64 62  alStep().**   db
9c10: 45 76 61 6c 46 69 6e 61 6c 69 7a 65 28 29 0a 2a  EvalFinalize().*
9c20: 2a 20 20 20 64 62 45 76 61 6c 52 6f 77 49 6e 66  *   dbEvalRowInf
9c30: 6f 28 29 0a 2a 2a 20 20 20 64 62 45 76 61 6c 43  o().**   dbEvalC
9c40: 6f 6c 75 6d 6e 56 61 6c 75 65 28 29 0a 2a 2f 0a  olumnValue().*/.
9c50: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 44  typedef struct D
9c60: 62 45 76 61 6c 43 6f 6e 74 65 78 74 20 44 62 45  bEvalContext DbE
9c70: 76 61 6c 43 6f 6e 74 65 78 74 3b 0a 73 74 72 75  valContext;.stru
9c80: 63 74 20 44 62 45 76 61 6c 43 6f 6e 74 65 78 74  ct DbEvalContext
9c90: 20 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70   {.  SqliteDb *p
9ca0: 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Db;             
9cb0: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
9cc0: 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 54 63 6c   handle */.  Tcl
9cd0: 5f 4f 62 6a 20 2a 70 53 71 6c 3b 20 20 20 20 20  _Obj *pSql;     
9ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9cf0: 4f 62 6a 65 63 74 20 68 6f 6c 64 69 6e 67 20 73  Object holding s
9d00: 74 72 69 6e 67 20 7a 53 71 6c 20 2a 2f 0a 20 20  tring zSql */.  
9d10: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c  const char *zSql
9d20: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
9d30: 2f 2a 20 52 65 6d 61 69 6e 69 6e 67 20 53 51 4c  /* Remaining SQL
9d40: 20 74 6f 20 65 78 65 63 75 74 65 20 2a 2f 0a 20   to execute */. 
9d50: 20 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74   SqlPreparedStmt
9d60: 20 2a 70 50 72 65 53 74 6d 74 3b 20 20 20 20 20   *pPreStmt;     
9d70: 20 2f 2a 20 43 75 72 72 65 6e 74 20 73 74 61 74   /* Current stat
9d80: 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6e  ement */.  int n
9d90: 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Col;            
9da0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
9db0: 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
9dc0: 72 65 74 75 72 6e 65 64 20 62 79 20 70 53 74 6d  returned by pStm
9dd0: 74 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  t */.  Tcl_Obj *
9de0: 70 41 72 72 61 79 3b 20 20 20 20 20 20 20 20 20  pArray;         
9df0: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
9e00: 66 20 61 72 72 61 79 20 76 61 72 69 61 62 6c 65  f array variable
9e10: 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a   */.  Tcl_Obj **
9e20: 61 70 43 6f 6c 4e 61 6d 65 3b 20 20 20 20 20 20  apColName;      
9e30: 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f        /* Array o
9e40: 66 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a  f column names *
9e50: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65  /.};../*.** Rele
9e60: 61 73 65 20 61 6e 79 20 63 61 63 68 65 20 6f 66  ase any cache of
9e70: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 63 75   column names cu
9e80: 72 72 65 6e 74 6c 79 20 68 65 6c 64 20 61 73 20  rrently held as 
9e90: 70 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20 44  part of.** the D
9ea0: 62 45 76 61 6c 43 6f 6e 74 65 78 74 20 73 74 72  bEvalContext str
9eb0: 75 63 74 75 72 65 20 70 61 73 73 65 64 20 61 73  ucture passed as
9ec0: 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
9ed0: 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ent..*/.static v
9ee0: 6f 69 64 20 64 62 52 65 6c 65 61 73 65 43 6f 6c  oid dbReleaseCol
9ef0: 75 6d 6e 4e 61 6d 65 73 28 44 62 45 76 61 6c 43  umnNames(DbEvalC
9f00: 6f 6e 74 65 78 74 20 2a 70 29 7b 0a 20 20 69 66  ontext *p){.  if
9f10: 28 20 70 2d 3e 61 70 43 6f 6c 4e 61 6d 65 20 29  ( p->apColName )
9f20: 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
9f30: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
9f40: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
9f50: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
9f60: 74 28 70 2d 3e 61 70 43 6f 6c 4e 61 6d 65 5b 69  t(p->apColName[i
9f70: 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63  ]);.    }.    Tc
9f80: 6c 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 70  l_Free((char *)p
9f90: 2d 3e 61 70 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20  ->apColName);.  
9fa0: 20 20 70 2d 3e 61 70 43 6f 6c 4e 61 6d 65 20 3d    p->apColName =
9fb0: 20 30 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6e 43 6f   0;.  }.  p->nCo
9fc0: 6c 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  l = 0;.}../*.** 
9fd0: 49 6e 69 74 69 61 6c 69 7a 65 20 61 20 44 62 45  Initialize a DbE
9fe0: 76 61 6c 43 6f 6e 74 65 78 74 20 73 74 72 75 63  valContext struc
9ff0: 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  ture..**.** If p
a000: 41 72 72 61 79 20 69 73 20 6e 6f 74 20 4e 55 4c  Array is not NUL
a010: 4c 2c 20 74 68 65 6e 20 69 74 20 63 6f 6e 74 61  L, then it conta
a020: 69 6e 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ins the name of 
a030: 61 20 54 63 6c 20 61 72 72 61 79 0a 2a 2a 20 76  a Tcl array.** v
a040: 61 72 69 61 62 6c 65 2e 20 54 68 65 20 22 2a 22  ariable. The "*"
a050: 20 6d 65 6d 62 65 72 20 6f 66 20 74 68 69 73 20   member of this 
a060: 61 72 72 61 79 20 69 73 20 73 65 74 20 74 6f 20  array is set to 
a070: 61 20 6c 69 73 74 20 63 6f 6e 74 61 69 6e 69 6e  a list containin
a080: 67 0a 2a 2a 20 74 68 65 20 6e 61 6d 65 73 20 6f  g.** the names o
a090: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 72 65  f the columns re
a0a0: 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 73 74  turned by the st
a0b0: 61 74 65 6d 65 6e 74 20 61 73 20 70 61 72 74 20  atement as part 
a0c0: 6f 66 20 65 61 63 68 0a 2a 2a 20 63 61 6c 6c 20  of each.** call 
a0d0: 74 6f 20 64 62 45 76 61 6c 53 74 65 70 28 29 2c  to dbEvalStep(),
a0e0: 20 69 6e 20 6f 72 64 65 72 20 66 72 6f 6d 20 6c   in order from l
a0f0: 65 66 74 20 74 6f 20 72 69 67 68 74 2e 20 65 2e  eft to right. e.
a100: 67 2e 20 69 66 20 74 68 65 20 6e 61 6d 65 73 20  g. if the names 
a110: 0a 2a 2a 20 6f 66 20 74 68 65 20 72 65 74 75 72  .** of the retur
a120: 6e 65 64 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20  ned columns are 
a130: 61 2c 20 62 20 61 6e 64 20 63 2c 20 69 74 20 64  a, b and c, it d
a140: 6f 65 73 20 74 68 65 20 65 71 75 69 76 61 6c 65  oes the equivale
a150: 6e 74 20 6f 66 20 74 68 65 20 0a 2a 2a 20 74 63  nt of the .** tc
a160: 6c 20 63 6f 6d 6d 61 6e 64 3a 0a 2a 2a 0a 2a 2a  l command:.**.**
a170: 20 20 20 20 20 73 65 74 20 24 7b 70 41 72 72 61       set ${pArra
a180: 79 7d 28 2a 29 20 7b 61 20 62 20 63 7d 0a 2a 2f  y}(*) {a b c}.*/
a190: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 62 45  .static void dbE
a1a0: 76 61 6c 49 6e 69 74 28 0a 20 20 44 62 45 76 61  valInit(.  DbEva
a1b0: 6c 43 6f 6e 74 65 78 74 20 2a 70 2c 20 20 20 20  lContext *p,    
a1c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
a1d0: 69 6e 74 65 72 20 74 6f 20 73 74 72 75 63 74 75  inter to structu
a1e0: 72 65 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65  re to initialize
a1f0: 20 2a 2f 0a 20 20 53 71 6c 69 74 65 44 62 20 2a   */.  SqliteDb *
a200: 70 44 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  pDb,            
a210: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
a220: 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 54 63  e handle */.  Tc
a230: 6c 5f 4f 62 6a 20 2a 70 53 71 6c 2c 20 20 20 20  l_Obj *pSql,    
a240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a250: 20 4f 62 6a 65 63 74 20 63 6f 6e 74 61 69 6e 69   Object containi
a260: 6e 67 20 53 51 4c 20 73 63 72 69 70 74 20 2a 2f  ng SQL script */
a270: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 41 72 72  .  Tcl_Obj *pArr
a280: 61 79 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ay              
a290: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 54 63     /* Name of Tc
a2a0: 6c 20 61 72 72 61 79 20 74 6f 20 73 65 74 20 28  l array to set (
a2b0: 2a 29 20 65 6c 65 6d 65 6e 74 20 6f 66 20 2a 2f  *) element of */
a2c0: 0a 29 7b 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20  .){.  memset(p, 
a2d0: 30 2c 20 73 69 7a 65 6f 66 28 44 62 45 76 61 6c  0, sizeof(DbEval
a2e0: 43 6f 6e 74 65 78 74 29 29 3b 0a 20 20 70 2d 3e  Context));.  p->
a2f0: 70 44 62 20 3d 20 70 44 62 3b 0a 20 20 70 2d 3e  pDb = pDb;.  p->
a300: 7a 53 71 6c 20 3d 20 54 63 6c 5f 47 65 74 53 74  zSql = Tcl_GetSt
a310: 72 69 6e 67 28 70 53 71 6c 29 3b 0a 20 20 70 2d  ring(pSql);.  p-
a320: 3e 70 53 71 6c 20 3d 20 70 53 71 6c 3b 0a 20 20  >pSql = pSql;.  
a330: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
a340: 28 70 53 71 6c 29 3b 0a 20 20 69 66 28 20 70 41  (pSql);.  if( pA
a350: 72 72 61 79 20 29 7b 0a 20 20 20 20 70 2d 3e 70  rray ){.    p->p
a360: 41 72 72 61 79 20 3d 20 70 41 72 72 61 79 3b 0a  Array = pArray;.
a370: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43      Tcl_IncrRefC
a380: 6f 75 6e 74 28 70 41 72 72 61 79 29 3b 0a 20 20  ount(pArray);.  
a390: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 62 74 61 69  }.}../*.** Obtai
a3a0: 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  n information ab
a3b0: 6f 75 74 20 74 68 65 20 72 6f 77 20 74 68 61 74  out the row that
a3c0: 20 74 68 65 20 44 62 45 76 61 6c 43 6f 6e 74 65   the DbEvalConte
a3d0: 78 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65  xt passed as the
a3e0: 0a 2a 2a 20 66 69 72 73 74 20 61 72 67 75 6d 65  .** first argume
a3f0: 6e 74 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  nt currently poi
a400: 6e 74 73 20 74 6f 2e 0a 2a 2f 0a 73 74 61 74 69  nts to..*/.stati
a410: 63 20 76 6f 69 64 20 64 62 45 76 61 6c 52 6f 77  c void dbEvalRow
a420: 49 6e 66 6f 28 0a 20 20 44 62 45 76 61 6c 43 6f  Info(.  DbEvalCo
a430: 6e 74 65 78 74 20 2a 70 2c 20 20 20 20 20 20 20  ntext *p,       
a440: 20 20 20 20 20 20 20 20 2f 2a 20 45 76 61 6c 75          /* Evalu
a450: 61 74 69 6f 6e 20 63 6f 6e 74 65 78 74 20 2a 2f  ation context */
a460: 0a 20 20 69 6e 74 20 2a 70 6e 43 6f 6c 2c 20 20  .  int *pnCol,  
a470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a480: 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 75 6d 62 65     /* OUT: Numbe
a490: 72 20 6f 66 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  r of column name
a4a0: 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  s */.  Tcl_Obj *
a4b0: 2a 2a 70 61 70 43 6f 6c 4e 61 6d 65 20 20 20 20  **papColName    
a4c0: 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 41         /* OUT: A
a4d0: 72 72 61 79 20 6f 66 20 63 6f 6c 75 6d 6e 20 6e  rray of column n
a4e0: 61 6d 65 73 20 2a 2f 0a 29 7b 0a 20 20 2f 2a 20  ames */.){.  /* 
a4f0: 43 6f 6d 70 75 74 65 20 63 6f 6c 75 6d 6e 20 6e  Compute column n
a500: 61 6d 65 73 20 2a 2f 0a 20 20 69 66 28 20 30 3d  ames */.  if( 0=
a510: 3d 70 2d 3e 61 70 43 6f 6c 4e 61 6d 65 20 29 7b  =p->apColName ){
a520: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  .    sqlite3_stm
a530: 74 20 2a 70 53 74 6d 74 20 3d 20 70 2d 3e 70 50  t *pStmt = p->pP
a540: 72 65 53 74 6d 74 2d 3e 70 53 74 6d 74 3b 0a 20  reStmt->pStmt;. 
a550: 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20     int i;       
a560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a570: 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72   /* Iterator var
a580: 69 61 62 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74  iable */.    int
a590: 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20   nCol;          
a5a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
a5b0: 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
a5c0: 72 65 74 75 72 6e 65 64 20 62 79 20 70 53 74 6d  returned by pStm
a5d0: 74 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  t */.    Tcl_Obj
a5e0: 20 2a 2a 61 70 43 6f 6c 4e 61 6d 65 20 3d 20 30   **apColName = 0
a5f0: 3b 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20  ;      /* Array 
a600: 6f 66 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  of column names 
a610: 2a 2f 0a 0a 20 20 20 20 70 2d 3e 6e 43 6f 6c 20  */..    p->nCol 
a620: 3d 20 6e 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33  = nCol = sqlite3
a630: 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70 53  _column_count(pS
a640: 74 6d 74 29 3b 0a 20 20 20 20 69 66 28 20 6e 43  tmt);.    if( nC
a650: 6f 6c 3e 30 20 26 26 20 28 70 61 70 43 6f 6c 4e  ol>0 && (papColN
a660: 61 6d 65 20 7c 7c 20 70 2d 3e 70 41 72 72 61 79  ame || p->pArray
a670: 29 20 29 7b 0a 20 20 20 20 20 20 61 70 43 6f 6c  ) ){.      apCol
a680: 4e 61 6d 65 20 3d 20 28 54 63 6c 5f 4f 62 6a 2a  Name = (Tcl_Obj*
a690: 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28 20 73 69 7a  *)Tcl_Alloc( siz
a6a0: 65 6f 66 28 54 63 6c 5f 4f 62 6a 2a 29 2a 6e 43  eof(Tcl_Obj*)*nC
a6b0: 6f 6c 20 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  ol );.      for(
a6c0: 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b  i=0; i<nCol; i++
a6d0: 29 7b 0a 20 20 20 20 20 20 20 20 61 70 43 6f 6c  ){.        apCol
a6e0: 4e 61 6d 65 5b 69 5d 20 3d 20 64 62 54 65 78 74  Name[i] = dbText
a6f0: 54 6f 4f 62 6a 28 73 71 6c 69 74 65 33 5f 63 6f  ToObj(sqlite3_co
a700: 6c 75 6d 6e 5f 6e 61 6d 65 28 70 53 74 6d 74 2c  lumn_name(pStmt,
a710: 69 29 29 3b 0a 20 20 20 20 20 20 20 20 54 63 6c  i));.        Tcl
a720: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 61 70  _IncrRefCount(ap
a730: 43 6f 6c 4e 61 6d 65 5b 69 5d 29 3b 0a 20 20 20  ColName[i]);.   
a740: 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 61 70     }.      p->ap
a750: 43 6f 6c 4e 61 6d 65 20 3d 20 61 70 43 6f 6c 4e  ColName = apColN
a760: 61 6d 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ame;.    }..    
a770: 2f 2a 20 49 66 20 72 65 73 75 6c 74 73 20 61 72  /* If results ar
a780: 65 20 62 65 69 6e 67 20 73 74 6f 72 65 64 20 69  e being stored i
a790: 6e 20 61 6e 20 61 72 72 61 79 20 76 61 72 69 61  n an array varia
a7a0: 62 6c 65 2c 20 74 68 65 6e 20 63 72 65 61 74 65  ble, then create
a7b0: 0a 20 20 20 20 2a 2a 20 74 68 65 20 61 72 72 61  .    ** the arra
a7c0: 79 28 2a 29 20 65 6e 74 72 79 20 66 6f 72 20 74  y(*) entry for t
a7d0: 68 61 74 20 61 72 72 61 79 0a 20 20 20 20 2a 2f  hat array.    */
a7e0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 41 72 72  .    if( p->pArr
a7f0: 61 79 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  ay ){.      Tcl_
a800: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 20 3d  Interp *interp =
a810: 20 70 2d 3e 70 44 62 2d 3e 69 6e 74 65 72 70 3b   p->pDb->interp;
a820: 0a 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a  .      Tcl_Obj *
a830: 70 43 6f 6c 4c 69 73 74 20 3d 20 54 63 6c 5f 4e  pColList = Tcl_N
a840: 65 77 4f 62 6a 28 29 3b 0a 20 20 20 20 20 20 54  ewObj();.      T
a850: 63 6c 5f 4f 62 6a 20 2a 70 53 74 61 72 20 3d 20  cl_Obj *pStar = 
a860: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
a870: 28 22 2a 22 2c 20 2d 31 29 3b 0a 0a 20 20 20 20  ("*", -1);..    
a880: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f    for(i=0; i<nCo
a890: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; i++){.       
a8a0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
a8b0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
a8c0: 2c 20 70 43 6f 6c 4c 69 73 74 2c 20 61 70 43 6f  , pColList, apCo
a8d0: 6c 4e 61 6d 65 5b 69 5d 29 3b 0a 20 20 20 20 20  lName[i]);.     
a8e0: 20 7d 0a 20 20 20 20 20 20 54 63 6c 5f 49 6e 63   }.      Tcl_Inc
a8f0: 72 52 65 66 43 6f 75 6e 74 28 70 53 74 61 72 29  rRefCount(pStar)
a900: 3b 0a 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 53  ;.      Tcl_ObjS
a910: 65 74 56 61 72 32 28 69 6e 74 65 72 70 2c 20 70  etVar2(interp, p
a920: 2d 3e 70 41 72 72 61 79 2c 20 70 53 74 61 72 2c  ->pArray, pStar,
a930: 20 70 43 6f 6c 4c 69 73 74 2c 20 30 29 3b 0a 20   pColList, 0);. 
a940: 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66       Tcl_DecrRef
a950: 43 6f 75 6e 74 28 70 53 74 61 72 29 3b 0a 20 20  Count(pStar);.  
a960: 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70    }.  }..  if( p
a970: 61 70 43 6f 6c 4e 61 6d 65 20 29 7b 0a 20 20 20  apColName ){.   
a980: 20 2a 70 61 70 43 6f 6c 4e 61 6d 65 20 3d 20 70   *papColName = p
a990: 2d 3e 61 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20 7d  ->apColName;.  }
a9a0: 0a 20 20 69 66 28 20 70 6e 43 6f 6c 20 29 7b 0a  .  if( pnCol ){.
a9b0: 20 20 20 20 2a 70 6e 43 6f 6c 20 3d 20 70 2d 3e      *pnCol = p->
a9c0: 6e 43 6f 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  nCol;.  }.}../*.
a9d0: 2a 2a 20 52 65 74 75 72 6e 20 6f 6e 65 20 6f 66  ** Return one of
a9e0: 20 54 43 4c 5f 4f 4b 2c 20 54 43 4c 5f 42 52 45   TCL_OK, TCL_BRE
a9f0: 41 4b 20 6f 72 20 54 43 4c 5f 45 52 52 4f 52 2e  AK or TCL_ERROR.
aa00: 20 49 66 20 54 43 4c 5f 45 52 52 4f 52 20 69 73   If TCL_ERROR is
aa10: 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2c 20 74 68  .** returned, th
aa20: 65 6e 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  en an error mess
aa30: 61 67 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e  age is stored in
aa40: 20 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 72   the interpreter
aa50: 20 62 65 66 6f 72 65 0a 2a 2a 20 72 65 74 75 72   before.** retur
aa60: 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41 20 72 65  ning..**.** A re
aa70: 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 54 43  turn value of TC
aa80: 4c 5f 4f 4b 20 6d 65 61 6e 73 20 74 68 65 72 65  L_OK means there
aa90: 20 69 73 20 61 20 72 6f 77 20 6f 66 20 64 61 74   is a row of dat
aaa0: 61 20 61 76 61 69 6c 61 62 6c 65 2e 20 54 68 65  a available. The
aab0: 0a 2a 2a 20 64 61 74 61 20 6d 61 79 20 62 65 20  .** data may be 
aac0: 61 63 63 65 73 73 65 64 20 75 73 69 6e 67 20 64  accessed using d
aad0: 62 45 76 61 6c 52 6f 77 49 6e 66 6f 28 29 20 61  bEvalRowInfo() a
aae0: 6e 64 20 64 62 45 76 61 6c 43 6f 6c 75 6d 6e 56  nd dbEvalColumnV
aaf0: 61 6c 75 65 28 29 2e 20 54 68 69 73 0a 2a 2a 20  alue(). This.** 
ab00: 69 73 20 61 6e 61 6c 6f 67 6f 75 73 20 74 6f 20  is analogous to 
ab10: 61 20 72 65 74 75 72 6e 20 6f 66 20 53 51 4c 49  a return of SQLI
ab20: 54 45 5f 52 4f 57 20 66 72 6f 6d 20 73 71 6c 69  TE_ROW from sqli
ab30: 74 65 33 5f 73 74 65 70 28 29 2e 20 49 66 20 54  te3_step(). If T
ab40: 43 4c 5f 42 52 45 41 4b 0a 2a 2a 20 69 73 20 72  CL_BREAK.** is r
ab50: 65 74 75 72 6e 65 64 2c 20 74 68 65 6e 20 74 68  eturned, then th
ab60: 65 20 53 51 4c 20 73 63 72 69 70 74 20 68 61 73  e SQL script has
ab70: 20 66 69 6e 69 73 68 65 64 20 65 78 65 63 75 74   finished execut
ab80: 69 6e 67 20 61 6e 64 20 74 68 65 72 65 20 61 72  ing and there ar
ab90: 65 0a 2a 2a 20 6e 6f 20 66 75 72 74 68 65 72 20  e.** no further 
aba0: 72 6f 77 73 20 61 76 61 69 6c 61 62 6c 65 2e 20  rows available. 
abb0: 54 68 69 73 20 69 73 20 73 69 6d 69 6c 61 72 20  This is similar 
abc0: 74 6f 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a  to SQLITE_DONE..
abd0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 62  */.static int db
abe0: 45 76 61 6c 53 74 65 70 28 44 62 45 76 61 6c 43  EvalStep(DbEvalC
abf0: 6f 6e 74 65 78 74 20 2a 70 29 7b 0a 20 20 77 68  ontext *p){.  wh
ac00: 69 6c 65 28 20 70 2d 3e 7a 53 71 6c 5b 30 5d 20  ile( p->zSql[0] 
ac10: 7c 7c 20 70 2d 3e 70 50 72 65 53 74 6d 74 20 29  || p->pPreStmt )
ac20: 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20  {.    int rc;.  
ac30: 20 20 69 66 28 20 70 2d 3e 70 50 72 65 53 74 6d    if( p->pPreStm
ac40: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  t==0 ){.      rc
ac50: 20 3d 20 64 62 50 72 65 70 61 72 65 41 6e 64 42   = dbPrepareAndB
ac60: 69 6e 64 28 70 2d 3e 70 44 62 2c 20 70 2d 3e 7a  ind(p->pDb, p->z
ac70: 53 71 6c 2c 20 26 70 2d 3e 7a 53 71 6c 2c 20 26  Sql, &p->zSql, &
ac80: 70 2d 3e 70 50 72 65 53 74 6d 74 29 3b 0a 20 20  p->pPreStmt);.  
ac90: 20 20 20 20 69 66 28 20 72 63 21 3d 54 43 4c 5f      if( rc!=TCL_
aca0: 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
acb0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
acc0: 20 69 6e 74 20 72 63 73 3b 0a 20 20 20 20 20 20   int rcs;.      
acd0: 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20  SqliteDb *pDb = 
ace0: 70 2d 3e 70 44 62 3b 0a 20 20 20 20 20 20 53 71  p->pDb;.      Sq
acf0: 6c 50 72 65 70 61 72 65 64 53 74 6d 74 20 2a 70  lPreparedStmt *p
ad00: 50 72 65 53 74 6d 74 20 3d 20 70 2d 3e 70 50 72  PreStmt = p->pPr
ad10: 65 53 74 6d 74 3b 0a 20 20 20 20 20 20 73 71 6c  eStmt;.      sql
ad20: 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
ad30: 20 3d 20 70 50 72 65 53 74 6d 74 2d 3e 70 53 74   = pPreStmt->pSt
ad40: 6d 74 3b 0a 0a 20 20 20 20 20 20 72 63 73 20 3d  mt;..      rcs =
ad50: 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53   sqlite3_step(pS
ad60: 74 6d 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  tmt);.      if( 
ad70: 72 63 73 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20  rcs==SQLITE_ROW 
ad80: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
ad90: 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 20 20  n TCL_OK;.      
ada0: 7d 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70  }.      if( p->p
adb0: 41 72 72 61 79 20 29 7b 0a 20 20 20 20 20 20 20  Array ){.       
adc0: 20 64 62 45 76 61 6c 52 6f 77 49 6e 66 6f 28 70   dbEvalRowInfo(p
add0: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  , 0, 0);.      }
ade0: 0a 20 20 20 20 20 20 72 63 73 20 3d 20 73 71 6c  .      rcs = sql
adf0: 69 74 65 33 5f 72 65 73 65 74 28 70 53 74 6d 74  ite3_reset(pStmt
ae00: 29 3b 0a 0a 20 20 20 20 20 20 70 44 62 2d 3e 6e  );..      pDb->n
ae10: 53 74 65 70 20 3d 20 73 71 6c 69 74 65 33 5f 73  Step = sqlite3_s
ae20: 74 6d 74 5f 73 74 61 74 75 73 28 70 53 74 6d 74  tmt_status(pStmt
ae30: 2c 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54  ,SQLITE_STMTSTAT
ae40: 55 53 5f 46 55 4c 4c 53 43 41 4e 5f 53 54 45 50  US_FULLSCAN_STEP
ae50: 2c 31 29 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e  ,1);.      pDb->
ae60: 6e 53 6f 72 74 20 3d 20 73 71 6c 69 74 65 33 5f  nSort = sqlite3_
ae70: 73 74 6d 74 5f 73 74 61 74 75 73 28 70 53 74 6d  stmt_status(pStm
ae80: 74 2c 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41  t,SQLITE_STMTSTA
ae90: 54 55 53 5f 53 4f 52 54 2c 31 29 3b 0a 20 20 20  TUS_SORT,1);.   
aea0: 20 20 20 70 44 62 2d 3e 6e 49 6e 64 65 78 20 3d     pDb->nIndex =
aeb0: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74   sqlite3_stmt_st
aec0: 61 74 75 73 28 70 53 74 6d 74 2c 53 51 4c 49 54  atus(pStmt,SQLIT
aed0: 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 41 55 54  E_STMTSTATUS_AUT
aee0: 4f 49 4e 44 45 58 2c 31 29 3b 0a 20 20 20 20 20  OINDEX,1);.     
aef0: 20 64 62 52 65 6c 65 61 73 65 43 6f 6c 75 6d 6e   dbReleaseColumn
af00: 4e 61 6d 65 73 28 70 29 3b 0a 20 20 20 20 20 20  Names(p);.      
af10: 70 2d 3e 70 50 72 65 53 74 6d 74 20 3d 20 30 3b  p->pPreStmt = 0;
af20: 0a 0a 20 20 20 20 20 20 69 66 28 20 72 63 73 21  ..      if( rcs!
af30: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
af40: 20 20 20 20 20 20 2f 2a 20 49 66 20 61 20 72 75        /* If a ru
af50: 6e 2d 74 69 6d 65 20 65 72 72 6f 72 20 6f 63 63  n-time error occ
af60: 75 72 73 2c 20 72 65 70 6f 72 74 20 74 68 65 20  urs, report the 
af70: 65 72 72 6f 72 20 61 6e 64 20 73 74 6f 70 20 72  error and stop r
af80: 65 61 64 69 6e 67 0a 20 20 20 20 20 20 20 20 2a  eading.        *
af90: 2a 20 74 68 65 20 53 51 4c 2e 20 20 2a 2f 0a 20  * the SQL.  */. 
afa0: 20 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62         Tcl_SetOb
afb0: 6a 52 65 73 75 6c 74 28 70 44 62 2d 3e 69 6e 74  jResult(pDb->int
afc0: 65 72 70 2c 20 64 62 54 65 78 74 54 6f 4f 62 6a  erp, dbTextToObj
afd0: 28 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28  (sqlite3_errmsg(
afe0: 70 44 62 2d 3e 64 62 29 29 29 3b 0a 20 20 20 20  pDb->db)));.    
aff0: 20 20 20 20 64 62 52 65 6c 65 61 73 65 53 74 6d      dbReleaseStm
b000: 74 28 70 44 62 2c 20 70 50 72 65 53 74 6d 74 2c  t(pDb, pPreStmt,
b010: 20 31 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74   1);.        ret
b020: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
b030: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
b040: 20 20 20 20 64 62 52 65 6c 65 61 73 65 53 74 6d      dbReleaseStm
b050: 74 28 70 44 62 2c 20 70 50 72 65 53 74 6d 74 2c  t(pDb, pPreStmt,
b060: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
b070: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e   }.  }..  /* Fin
b080: 69 73 68 65 64 20 2a 2f 0a 20 20 72 65 74 75 72  ished */.  retur
b090: 6e 20 54 43 4c 5f 42 52 45 41 4b 3b 0a 7d 0a 0a  n TCL_BREAK;.}..
b0a0: 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20 72  /*.** Free all r
b0b0: 65 73 6f 75 72 63 65 73 20 63 75 72 72 65 6e 74  esources current
b0c0: 6c 79 20 68 65 6c 64 20 62 79 20 74 68 65 20 44  ly held by the D
b0d0: 62 45 76 61 6c 43 6f 6e 74 65 78 74 20 73 74 72  bEvalContext str
b0e0: 75 63 74 75 72 65 20 70 61 73 73 65 64 0a 2a 2a  ucture passed.**
b0f0: 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
b100: 67 75 6d 65 6e 74 2e 20 54 68 65 72 65 20 73 68  gument. There sh
b110: 6f 75 6c 64 20 62 65 20 65 78 61 63 74 6c 79 20  ould be exactly 
b120: 6f 6e 65 20 63 61 6c 6c 20 74 6f 20 74 68 69 73  one call to this
b130: 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 66 6f 72   function.** for
b140: 20 65 61 63 68 20 63 61 6c 6c 20 74 6f 20 64 62   each call to db
b150: 45 76 61 6c 49 6e 69 74 28 29 2e 0a 2a 2f 0a 73  EvalInit()..*/.s
b160: 74 61 74 69 63 20 76 6f 69 64 20 64 62 45 76 61  tatic void dbEva
b170: 6c 46 69 6e 61 6c 69 7a 65 28 44 62 45 76 61 6c  lFinalize(DbEval
b180: 43 6f 6e 74 65 78 74 20 2a 70 29 7b 0a 20 20 69  Context *p){.  i
b190: 66 28 20 70 2d 3e 70 50 72 65 53 74 6d 74 20 29  f( p->pPreStmt )
b1a0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  {.    sqlite3_re
b1b0: 73 65 74 28 70 2d 3e 70 50 72 65 53 74 6d 74 2d  set(p->pPreStmt-
b1c0: 3e 70 53 74 6d 74 29 3b 0a 20 20 20 20 64 62 52  >pStmt);.    dbR
b1d0: 65 6c 65 61 73 65 53 74 6d 74 28 70 2d 3e 70 44  eleaseStmt(p->pD
b1e0: 62 2c 20 70 2d 3e 70 50 72 65 53 74 6d 74 2c 20  b, p->pPreStmt, 
b1f0: 30 29 3b 0a 20 20 20 20 70 2d 3e 70 50 72 65 53  0);.    p->pPreS
b200: 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69  tmt = 0;.  }.  i
b210: 66 28 20 70 2d 3e 70 41 72 72 61 79 20 29 7b 0a  f( p->pArray ){.
b220: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
b230: 6f 75 6e 74 28 70 2d 3e 70 41 72 72 61 79 29 3b  ount(p->pArray);
b240: 0a 20 20 20 20 70 2d 3e 70 41 72 72 61 79 20 3d  .    p->pArray =
b250: 20 30 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 44 65   0;.  }.  Tcl_De
b260: 63 72 52 65 66 43 6f 75 6e 74 28 70 2d 3e 70 53  crRefCount(p->pS
b270: 71 6c 29 3b 0a 20 20 64 62 52 65 6c 65 61 73 65  ql);.  dbRelease
b280: 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 29 3b 0a  ColumnNames(p);.
b290: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
b2a0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 54  a pointer to a T
b2b0: 63 6c 5f 4f 62 6a 20 73 74 72 75 63 74 75 72 65  cl_Obj structure
b2c0: 20 77 69 74 68 20 72 65 66 2d 63 6f 75 6e 74 20   with ref-count 
b2d0: 30 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 0a  0 that contains.
b2e0: 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 66 6f 72  ** the value for
b2f0: 20 74 68 65 20 69 43 6f 6c 27 74 68 20 63 6f 6c   the iCol'th col
b300: 75 6d 6e 20 6f 66 20 74 68 65 20 72 6f 77 20 63  umn of the row c
b310: 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 65 64  urrently pointed
b320: 20 74 6f 20 62 79 0a 2a 2a 20 74 68 65 20 44 62   to by.** the Db
b330: 45 76 61 6c 43 6f 6e 74 65 78 74 20 73 74 72 75  EvalContext stru
b340: 63 74 75 72 65 20 70 61 73 73 65 64 20 61 73 20  cture passed as 
b350: 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
b360: 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 54 63  nt..*/.static Tc
b370: 6c 5f 4f 62 6a 20 2a 64 62 45 76 61 6c 43 6f 6c  l_Obj *dbEvalCol
b380: 75 6d 6e 56 61 6c 75 65 28 44 62 45 76 61 6c 43  umnValue(DbEvalC
b390: 6f 6e 74 65 78 74 20 2a 70 2c 20 69 6e 74 20 69  ontext *p, int i
b3a0: 43 6f 6c 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  Col){.  sqlite3_
b3b0: 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 70 2d  stmt *pStmt = p-
b3c0: 3e 70 50 72 65 53 74 6d 74 2d 3e 70 53 74 6d 74  >pPreStmt->pStmt
b3d0: 3b 0a 20 20 73 77 69 74 63 68 28 20 73 71 6c 69  ;.  switch( sqli
b3e0: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 28  te3_column_type(
b3f0: 70 53 74 6d 74 2c 20 69 43 6f 6c 29 20 29 7b 0a  pStmt, iCol) ){.
b400: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
b410: 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20 69 6e  BLOB: {.      in
b420: 74 20 62 79 74 65 73 20 3d 20 73 71 6c 69 74 65  t bytes = sqlite
b430: 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70  3_column_bytes(p
b440: 53 74 6d 74 2c 20 69 43 6f 6c 29 3b 0a 20 20 20  Stmt, iCol);.   
b450: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
b460: 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f 63  Blob = sqlite3_c
b470: 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70 53 74 6d 74  olumn_blob(pStmt
b480: 2c 20 69 43 6f 6c 29 3b 0a 20 20 20 20 20 20 69  , iCol);.      i
b490: 66 28 20 21 7a 42 6c 6f 62 20 29 20 62 79 74 65  f( !zBlob ) byte
b4a0: 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74  s = 0;.      ret
b4b0: 75 72 6e 20 54 63 6c 5f 4e 65 77 42 79 74 65 41  urn Tcl_NewByteA
b4c0: 72 72 61 79 4f 62 6a 28 28 75 38 2a 29 7a 42 6c  rrayObj((u8*)zBl
b4d0: 6f 62 2c 20 62 79 74 65 73 29 3b 0a 20 20 20 20  ob, bytes);.    
b4e0: 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
b4f0: 45 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20  E_INTEGER: {.   
b500: 20 20 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20     sqlite_int64 
b510: 76 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  v = sqlite3_colu
b520: 6d 6e 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20  mn_int64(pStmt, 
b530: 69 43 6f 6c 29 3b 0a 20 20 20 20 20 20 69 66 28  iCol);.      if(
b540: 20 76 3e 3d 2d 32 31 34 37 34 38 33 36 34 37 20   v>=-2147483647 
b550: 26 26 20 76 3c 3d 32 31 34 37 34 38 33 36 34 37  && v<=2147483647
b560: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
b570: 72 6e 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  rn Tcl_NewIntObj
b580: 28 76 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  (v);.      }else
b590: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
b5a0: 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f   Tcl_NewWideIntO
b5b0: 62 6a 28 76 29 3b 0a 20 20 20 20 20 20 7d 0a 20  bj(v);.      }. 
b5c0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
b5d0: 4c 49 54 45 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20  LITE_FLOAT: {.  
b5e0: 20 20 20 20 72 65 74 75 72 6e 20 54 63 6c 5f 4e      return Tcl_N
b5f0: 65 77 44 6f 75 62 6c 65 4f 62 6a 28 73 71 6c 69  ewDoubleObj(sqli
b600: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c  te3_column_doubl
b610: 65 28 70 53 74 6d 74 2c 20 69 43 6f 6c 29 29 3b  e(pStmt, iCol));
b620: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
b630: 53 51 4c 49 54 45 5f 4e 55 4c 4c 3a 20 7b 0a 20  SQLITE_NULL: {. 
b640: 20 20 20 20 20 72 65 74 75 72 6e 20 64 62 54 65       return dbTe
b650: 78 74 54 6f 4f 62 6a 28 70 2d 3e 70 44 62 2d 3e  xtToObj(p->pDb->
b660: 7a 4e 75 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20  zNull);.    }.  
b670: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 64 62 54 65  }..  return dbTe
b680: 78 74 54 6f 4f 62 6a 28 28 63 68 61 72 20 2a 29  xtToObj((char *)
b690: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
b6a0: 65 78 74 28 70 53 74 6d 74 2c 20 69 43 6f 6c 29  ext(pStmt, iCol)
b6b0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 75  );.}../*.** If u
b6c0: 73 69 6e 67 20 54 63 6c 20 76 65 72 73 69 6f 6e  sing Tcl version
b6d0: 20 38 2e 36 20 6f 72 20 67 72 65 61 74 65 72 2c   8.6 or greater,
b6e0: 20 75 73 65 20 74 68 65 20 4e 52 20 66 75 6e 63   use the NR func
b6f0: 74 69 6f 6e 73 20 74 6f 20 61 76 6f 69 64 0a 2a  tions to avoid.*
b700: 2a 20 72 65 63 75 72 73 69 76 65 20 65 76 61 6c  * recursive eval
b710: 75 74 69 6f 6e 20 6f 66 20 73 63 72 69 70 74 73  ution of scripts
b720: 20 62 79 20 74 68 65 20 5b 64 62 20 65 76 61 6c   by the [db eval
b730: 5d 20 61 6e 64 20 5b 64 62 20 74 72 61 6e 73 5d  ] and [db trans]
b740: 0a 2a 2a 20 63 6f 6d 6d 61 6e 64 73 2e 20 45 76  .** commands. Ev
b750: 65 6e 20 69 66 20 74 68 65 20 68 65 61 64 65 72  en if the header
b760: 73 20 75 73 65 64 20 77 68 69 6c 65 20 63 6f 6d  s used while com
b770: 70 69 6c 69 6e 67 20 74 68 65 20 65 78 74 65 6e  piling the exten
b780: 73 69 6f 6e 0a 2a 2a 20 61 72 65 20 38 2e 36 20  sion.** are 8.6 
b790: 6f 72 20 6e 65 77 65 72 2c 20 74 68 65 20 63 6f  or newer, the co
b7a0: 64 65 20 73 74 69 6c 6c 20 74 65 73 74 73 20 74  de still tests t
b7b0: 68 65 20 54 63 6c 20 76 65 72 73 69 6f 6e 20 61  he Tcl version a
b7c0: 74 20 72 75 6e 74 69 6d 65 2e 0a 2a 2a 20 54 68  t runtime..** Th
b7d0: 69 73 20 61 6c 6c 6f 77 73 20 73 74 75 62 73 2d  is allows stubs-
b7e0: 65 6e 61 62 6c 65 64 20 62 75 69 6c 64 73 20 74  enabled builds t
b7f0: 6f 20 62 65 20 75 73 65 64 20 77 69 74 68 20 6f  o be used with o
b800: 6c 64 65 72 20 54 63 6c 20 6c 69 62 72 61 72 69  lder Tcl librari
b810: 65 73 2e 0a 2a 2f 0a 23 69 66 20 54 43 4c 5f 4d  es..*/.#if TCL_M
b820: 41 4a 4f 52 5f 56 45 52 53 49 4f 4e 3e 38 20 7c  AJOR_VERSION>8 |
b830: 7c 20 28 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52  | (TCL_MAJOR_VER
b840: 53 49 4f 4e 3d 3d 38 20 26 26 20 54 43 4c 5f 4d  SION==8 && TCL_M
b850: 49 4e 4f 52 5f 56 45 52 53 49 4f 4e 3e 3d 36 29  INOR_VERSION>=6)
b860: 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45  .# define SQLITE
b870: 5f 54 43 4c 5f 4e 52 45 20 31 0a 73 74 61 74 69  _TCL_NRE 1.stati
b880: 63 20 69 6e 74 20 44 62 55 73 65 4e 72 65 28 76  c int DbUseNre(v
b890: 6f 69 64 29 7b 0a 20 20 69 6e 74 20 6d 61 6a 6f  oid){.  int majo
b8a0: 72 2c 20 6d 69 6e 6f 72 3b 0a 20 20 54 63 6c 5f  r, minor;.  Tcl_
b8b0: 47 65 74 56 65 72 73 69 6f 6e 28 26 6d 61 6a 6f  GetVersion(&majo
b8c0: 72 2c 20 26 6d 69 6e 6f 72 2c 20 30 2c 20 30 29  r, &minor, 0, 0)
b8d0: 3b 0a 20 20 72 65 74 75 72 6e 28 20 28 6d 61 6a  ;.  return( (maj
b8e0: 6f 72 3d 3d 38 20 26 26 20 6d 69 6e 6f 72 3e 3d  or==8 && minor>=
b8f0: 36 29 20 7c 7c 20 6d 61 6a 6f 72 3e 38 20 29 3b  6) || major>8 );
b900: 0a 7d 0a 23 65 6c 73 65 0a 2f 2a 20 0a 2a 2a 20  .}.#else./* .** 
b910: 43 6f 6d 70 69 6c 69 6e 67 20 75 73 69 6e 67 20  Compiling using 
b920: 68 65 61 64 65 72 73 20 65 61 72 6c 69 65 72 20  headers earlier 
b930: 74 68 61 6e 20 38 2e 36 2e 20 49 6e 20 74 68 69  than 8.6. In thi
b940: 73 20 63 61 73 65 20 4e 52 20 63 61 6e 6e 6f 74  s case NR cannot
b950: 20 62 65 0a 2a 2a 20 75 73 65 64 2c 20 73 6f 20   be.** used, so 
b960: 44 62 55 73 65 4e 72 65 28 29 20 74 6f 20 61 6c  DbUseNre() to al
b970: 77 61 79 73 20 72 65 74 75 72 6e 20 7a 65 72 6f  ways return zero
b980: 2e 20 41 64 64 20 23 64 65 66 69 6e 65 73 20 66  . Add #defines f
b990: 6f 72 20 74 68 65 20 6f 74 68 65 72 0a 2a 2a 20  or the other.** 
b9a0: 54 63 6c 5f 4e 52 78 78 78 28 29 20 66 75 6e 63  Tcl_NRxxx() func
b9b0: 74 69 6f 6e 73 20 74 6f 20 70 72 65 76 65 6e 74  tions to prevent
b9c0: 20 74 68 65 6d 20 66 72 6f 6d 20 63 61 75 73 69   them from causi
b9d0: 6e 67 20 63 6f 6d 70 69 6c 61 74 69 6f 6e 20 65  ng compilation e
b9e0: 72 72 6f 72 73 2c 0a 2a 2a 20 65 76 65 6e 20 74  rrors,.** even t
b9f0: 68 6f 75 67 68 20 74 68 65 20 6f 6e 6c 79 20 69  hough the only i
ba00: 6e 76 6f 63 61 74 69 6f 6e 73 20 6f 66 20 74 68  nvocations of th
ba10: 65 6d 20 61 72 65 20 77 69 74 68 69 6e 20 63 6f  em are within co
ba20: 6e 64 69 74 69 6f 6e 61 6c 20 62 6c 6f 63 6b 73  nditional blocks
ba30: 20 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 72 6d   .** of the form
ba40: 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 44 62  :.**.**   if( Db
ba50: 55 73 65 4e 72 65 28 29 20 29 20 7b 20 2e 2e 2e  UseNre() ) { ...
ba60: 20 7d 0a 2a 2f 0a 23 20 64 65 66 69 6e 65 20 53   }.*/.# define S
ba70: 51 4c 49 54 45 5f 54 43 4c 5f 4e 52 45 20 30 0a  QLITE_TCL_NRE 0.
ba80: 23 20 64 65 66 69 6e 65 20 44 62 55 73 65 4e 72  # define DbUseNr
ba90: 65 28 29 20 30 0a 23 20 64 65 66 69 6e 65 20 54  e() 0.# define T
baa0: 63 6c 5f 4e 52 41 64 64 43 61 6c 6c 62 61 63 6b  cl_NRAddCallback
bab0: 28 61 2c 62 2c 63 2c 64 2c 65 2c 66 29 20 30 0a  (a,b,c,d,e,f) 0.
bac0: 23 20 64 65 66 69 6e 65 20 54 63 6c 5f 4e 52 45  # define Tcl_NRE
bad0: 76 61 6c 4f 62 6a 28 61 2c 62 2c 63 29 20 30 0a  valObj(a,b,c) 0.
bae0: 23 20 64 65 66 69 6e 65 20 54 63 6c 5f 4e 52 43  # define Tcl_NRC
baf0: 72 65 61 74 65 43 6f 6d 6d 61 6e 64 28 61 2c 62  reateCommand(a,b
bb00: 2c 63 2c 64 2c 65 2c 66 29 20 30 0a 23 65 6e 64  ,c,d,e,f) 0.#end
bb10: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  if../*.** This f
bb20: 75 6e 63 74 69 6f 6e 20 69 73 20 70 61 72 74 20  unction is part 
bb30: 6f 66 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74  of the implement
bb40: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 63 6f 6d  ation of the com
bb50: 6d 61 6e 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 24 64  mand:.**.**   $d
bb60: 62 20 65 76 61 6c 20 53 51 4c 20 3f 41 52 52 41  b eval SQL ?ARRA
bb70: 59 4e 41 4d 45 3f 20 53 43 52 49 50 54 0a 2a 2f  YNAME? SCRIPT.*/
bb80: 0a 73 74 61 74 69 63 20 69 6e 74 20 44 62 45 76  .static int DbEv
bb90: 61 6c 4e 65 78 74 43 6d 64 28 0a 20 20 43 6c 69  alNextCmd(.  Cli
bba0: 65 6e 74 44 61 74 61 20 64 61 74 61 5b 5d 2c 20  entData data[], 
bbb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bbc0: 20 20 2f 2a 20 64 61 74 61 5b 30 5d 20 69 73 20    /* data[0] is 
bbd0: 74 68 65 20 28 44 62 45 76 61 6c 43 6f 6e 74 65  the (DbEvalConte
bbe0: 78 74 2a 29 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e  xt*) */.  Tcl_In
bbf0: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
bc00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
bc10: 2a 20 54 63 6c 20 69 6e 74 65 72 70 72 65 74 65  * Tcl interprete
bc20: 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73 75 6c  r */.  int resul
bc30: 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
bc40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
bc50: 65 73 75 6c 74 20 73 6f 20 66 61 72 20 2a 2f 0a  esult so far */.
bc60: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 72 65  ){.  int rc = re
bc70: 73 75 6c 74 3b 20 20 20 20 20 20 20 20 20 20 20  sult;           
bc80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
bc90: 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f  urn code */..  /
bca0: 2a 20 54 68 65 20 66 69 72 73 74 20 65 6c 65 6d  * The first elem
bcb0: 65 6e 74 20 6f 66 20 74 68 65 20 64 61 74 61 5b  ent of the data[
bcc0: 5d 20 61 72 72 61 79 20 69 73 20 61 20 70 6f 69  ] array is a poi
bcd0: 6e 74 65 72 20 74 6f 20 61 20 44 62 45 76 61 6c  nter to a DbEval
bce0: 43 6f 6e 74 65 78 74 0a 20 20 2a 2a 20 73 74 72  Context.  ** str
bcf0: 75 63 74 75 72 65 20 61 6c 6c 6f 63 61 74 65 64  ucture allocated
bd00: 20 75 73 69 6e 67 20 54 63 6c 5f 41 6c 6c 6f 63   using Tcl_Alloc
bd10: 28 29 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 65  (). The second e
bd20: 6c 65 6d 65 6e 74 20 6f 66 20 64 61 74 61 5b 5d  lement of data[]
bd30: 0a 20 20 2a 2a 20 69 73 20 61 20 70 6f 69 6e 74  .  ** is a point
bd40: 65 72 20 74 6f 20 61 20 54 63 6c 5f 4f 62 6a 20  er to a Tcl_Obj 
bd50: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 73  containing the s
bd60: 63 72 69 70 74 20 74 6f 20 72 75 6e 20 66 6f 72  cript to run for
bd70: 20 65 61 63 68 20 72 6f 77 0a 20 20 2a 2a 20 72   each row.  ** r
bd80: 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 71  eturned by the q
bd90: 75 65 72 69 65 73 20 65 6e 63 61 70 73 75 6c 61  ueries encapsula
bda0: 74 65 64 20 69 6e 20 64 61 74 61 5b 30 5d 2e 20  ted in data[0]. 
bdb0: 2a 2f 0a 20 20 44 62 45 76 61 6c 43 6f 6e 74 65  */.  DbEvalConte
bdc0: 78 74 20 2a 70 20 3d 20 28 44 62 45 76 61 6c 43  xt *p = (DbEvalC
bdd0: 6f 6e 74 65 78 74 20 2a 29 64 61 74 61 5b 30 5d  ontext *)data[0]
bde0: 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 53 63  ;.  Tcl_Obj *pSc
bdf0: 72 69 70 74 20 3d 20 28 54 63 6c 5f 4f 62 6a 20  ript = (Tcl_Obj 
be00: 2a 29 64 61 74 61 5b 31 5d 3b 0a 20 20 54 63 6c  *)data[1];.  Tcl
be10: 5f 4f 62 6a 20 2a 70 41 72 72 61 79 20 3d 20 70  _Obj *pArray = p
be20: 2d 3e 70 41 72 72 61 79 3b 0a 0a 20 20 77 68 69  ->pArray;..  whi
be30: 6c 65 28 20 28 72 63 3d 3d 54 43 4c 5f 4f 4b 20  le( (rc==TCL_OK 
be40: 7c 7c 20 72 63 3d 3d 54 43 4c 5f 43 4f 4e 54 49  || rc==TCL_CONTI
be50: 4e 55 45 29 20 26 26 20 54 43 4c 5f 4f 4b 3d 3d  NUE) && TCL_OK==
be60: 28 72 63 20 3d 20 64 62 45 76 61 6c 53 74 65 70  (rc = dbEvalStep
be70: 28 70 29 29 20 29 7b 0a 20 20 20 20 69 6e 74 20  (p)) ){.    int 
be80: 69 3b 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b  i;.    int nCol;
be90: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 61  .    Tcl_Obj **a
bea0: 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20 20 20 64 62  pColName;.    db
beb0: 45 76 61 6c 52 6f 77 49 6e 66 6f 28 70 2c 20 26  EvalRowInfo(p, &
bec0: 6e 43 6f 6c 2c 20 26 61 70 43 6f 6c 4e 61 6d 65  nCol, &apColName
bed0: 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
bee0: 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  i<nCol; i++){.  
bef0: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 56 61      Tcl_Obj *pVa
bf00: 6c 20 3d 20 64 62 45 76 61 6c 43 6f 6c 75 6d 6e  l = dbEvalColumn
bf10: 56 61 6c 75 65 28 70 2c 20 69 29 3b 0a 20 20 20  Value(p, i);.   
bf20: 20 20 20 69 66 28 20 70 41 72 72 61 79 3d 3d 30     if( pArray==0
bf30: 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f   ){.        Tcl_
bf40: 4f 62 6a 53 65 74 56 61 72 32 28 69 6e 74 65 72  ObjSetVar2(inter
bf50: 70 2c 20 61 70 43 6f 6c 4e 61 6d 65 5b 69 5d 2c  p, apColName[i],
bf60: 20 30 2c 20 70 56 61 6c 2c 20 30 29 3b 0a 20 20   0, pVal, 0);.  
bf70: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
bf80: 20 20 20 54 63 6c 5f 4f 62 6a 53 65 74 56 61 72     Tcl_ObjSetVar
bf90: 32 28 69 6e 74 65 72 70 2c 20 70 41 72 72 61 79  2(interp, pArray
bfa0: 2c 20 61 70 43 6f 6c 4e 61 6d 65 5b 69 5d 2c 20  , apColName[i], 
bfb0: 70 56 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20  pVal, 0);.      
bfc0: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
bfd0: 54 68 65 20 72 65 71 75 69 72 65 64 20 69 6e 74  The required int
bfe0: 65 72 70 72 65 74 65 72 20 76 61 72 69 61 62 6c  erpreter variabl
bff0: 65 73 20 61 72 65 20 6e 6f 77 20 70 6f 70 75 6c  es are now popul
c000: 61 74 65 64 20 77 69 74 68 20 74 68 65 20 64 61  ated with the da
c010: 74 61 20 0a 20 20 20 20 2a 2a 20 66 72 6f 6d 20  ta .    ** from 
c020: 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 2e  the current row.
c030: 20 49 66 20 75 73 69 6e 67 20 4e 52 45 2c 20 73   If using NRE, s
c040: 63 68 65 64 75 6c 65 20 63 61 6c 6c 62 61 63 6b  chedule callback
c050: 73 20 74 6f 20 65 76 61 6c 75 61 74 65 0a 20 20  s to evaluate.  
c060: 20 20 2a 2a 20 73 63 72 69 70 74 20 70 53 63 72    ** script pScr
c070: 69 70 74 2c 20 74 68 65 6e 20 74 6f 20 69 6e 76  ipt, then to inv
c080: 6f 6b 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f  oke this functio
c090: 6e 20 61 67 61 69 6e 20 74 6f 20 66 65 74 63 68  n again to fetch
c0a0: 20 74 68 65 20 6e 65 78 74 0a 20 20 20 20 2a 2a   the next.    **
c0b0: 20 72 6f 77 20 28 6f 72 20 63 6c 65 61 6e 20 75   row (or clean u
c0c0: 70 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f  p if there is no
c0d0: 20 6e 65 78 74 20 72 6f 77 20 6f 72 20 74 68 65   next row or the
c0e0: 20 73 63 72 69 70 74 20 74 68 72 6f 77 73 20 61   script throws a
c0f0: 6e 0a 20 20 20 20 2a 2a 20 65 78 63 65 70 74 69  n.    ** excepti
c100: 6f 6e 29 2e 20 41 66 74 65 72 20 73 63 68 65 64  on). After sched
c110: 75 6c 69 6e 67 20 74 68 65 20 63 61 6c 6c 62 61  uling the callba
c120: 63 6b 73 2c 20 72 65 74 75 72 6e 20 63 6f 6e 74  cks, return cont
c130: 72 6f 6c 20 74 6f 20 74 68 65 20 0a 20 20 20 20  rol to the .    
c140: 2a 2a 20 63 61 6c 6c 65 72 2e 0a 20 20 20 20 2a  ** caller..    *
c150: 2a 0a 20 20 20 20 2a 2a 20 49 66 20 6e 6f 74 20  *.    ** If not 
c160: 75 73 69 6e 67 20 4e 52 45 2c 20 65 76 61 6c 75  using NRE, evalu
c170: 61 74 65 20 70 53 63 72 69 70 74 20 64 69 72 65  ate pScript dire
c180: 63 74 6c 79 20 61 6e 64 20 63 6f 6e 74 69 6e 75  ctly and continu
c190: 65 20 77 69 74 68 20 74 68 65 0a 20 20 20 20 2a  e with the.    *
c1a0: 2a 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f 6e  * next iteration
c1b0: 20 6f 66 20 74 68 69 73 20 77 68 69 6c 65 28 2e   of this while(.
c1c0: 2e 2e 29 20 6c 6f 6f 70 2e 20 20 2a 2f 0a 20 20  ..) loop.  */.  
c1d0: 20 20 69 66 28 20 44 62 55 73 65 4e 72 65 28 29    if( DbUseNre()
c1e0: 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 4e 52   ){.      Tcl_NR
c1f0: 41 64 64 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65  AddCallback(inte
c200: 72 70 2c 20 44 62 45 76 61 6c 4e 65 78 74 43 6d  rp, DbEvalNextCm
c210: 64 2c 20 28 76 6f 69 64 2a 29 70 2c 20 28 76 6f  d, (void*)p, (vo
c220: 69 64 2a 29 70 53 63 72 69 70 74 2c 20 30 2c 20  id*)pScript, 0, 
c230: 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  0);.      return
c240: 20 54 63 6c 5f 4e 52 45 76 61 6c 4f 62 6a 28 69   Tcl_NREvalObj(i
c250: 6e 74 65 72 70 2c 20 70 53 63 72 69 70 74 2c 20  nterp, pScript, 
c260: 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  0);.    }else{. 
c270: 20 20 20 20 20 72 63 20 3d 20 54 63 6c 5f 45 76       rc = Tcl_Ev
c280: 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c 20  alObjEx(interp, 
c290: 70 53 63 72 69 70 74 2c 20 30 29 3b 0a 20 20 20  pScript, 0);.   
c2a0: 20 7d 0a 20 20 7d 0a 0a 20 20 54 63 6c 5f 44 65   }.  }..  Tcl_De
c2b0: 63 72 52 65 66 43 6f 75 6e 74 28 70 53 63 72 69  crRefCount(pScri
c2c0: 70 74 29 3b 0a 20 20 64 62 45 76 61 6c 46 69 6e  pt);.  dbEvalFin
c2d0: 61 6c 69 7a 65 28 70 29 3b 0a 20 20 54 63 6c 5f  alize(p);.  Tcl_
c2e0: 46 72 65 65 28 28 63 68 61 72 20 2a 29 70 29 3b  Free((char *)p);
c2f0: 0a 0a 20 20 69 66 28 20 72 63 3d 3d 54 43 4c 5f  ..  if( rc==TCL_
c300: 4f 4b 20 7c 7c 20 72 63 3d 3d 54 43 4c 5f 42 52  OK || rc==TCL_BR
c310: 45 41 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 52  EAK ){.    Tcl_R
c320: 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  esetResult(inter
c330: 70 29 3b 0a 20 20 20 20 72 63 20 3d 20 54 43 4c  p);.    rc = TCL
c340: 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  _OK;.  }.  retur
c350: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
c360: 68 65 20 22 73 71 6c 69 74 65 22 20 63 6f 6d 6d  he "sqlite" comm
c370: 61 6e 64 20 62 65 6c 6f 77 20 63 72 65 61 74 65  and below create
c380: 73 20 61 20 6e 65 77 20 54 63 6c 20 63 6f 6d 6d  s a new Tcl comm
c390: 61 6e 64 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20  and for each.** 
c3a0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 74 20 6f 70  connection it op
c3b0: 65 6e 73 20 74 6f 20 61 6e 20 53 51 4c 69 74 65  ens to an SQLite
c3c0: 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 69 73   database.  This
c3d0: 20 72 6f 75 74 69 6e 65 20 69 73 20 69 6e 76 6f   routine is invo
c3e0: 6b 65 64 0a 2a 2a 20 77 68 65 6e 65 76 65 72 20  ked.** whenever 
c3f0: 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20 63 6f 6e  one of those con
c400: 6e 65 63 74 69 6f 6e 2d 73 70 65 63 69 66 69 63  nection-specific
c410: 20 63 6f 6d 6d 61 6e 64 73 20 69 73 20 65 78 65   commands is exe
c420: 63 75 74 65 64 0a 2a 2a 20 69 6e 20 54 63 6c 2e  cuted.** in Tcl.
c430: 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69    For example, i
c440: 66 20 79 6f 75 20 72 75 6e 20 54 63 6c 20 63 6f  f you run Tcl co
c450: 64 65 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a  de like this:.**
c460: 0a 2a 2a 20 20 20 20 20 20 20 73 71 6c 69 74 65  .**       sqlite
c470: 33 20 64 62 31 20 20 22 6d 79 5f 64 61 74 61 62  3 db1  "my_datab
c480: 61 73 65 22 0a 2a 2a 20 20 20 20 20 20 20 64 62  ase".**       db
c490: 31 20 63 6c 6f 73 65 0a 2a 2a 0a 2a 2a 20 54 68  1 close.**.** Th
c4a0: 65 20 66 69 72 73 74 20 63 6f 6d 6d 61 6e 64 20  e first command 
c4b0: 6f 70 65 6e 73 20 61 20 63 6f 6e 6e 65 63 74 69  opens a connecti
c4c0: 6f 6e 20 74 6f 20 74 68 65 20 22 6d 79 5f 64 61  on to the "my_da
c4d0: 74 61 62 61 73 65 22 20 64 61 74 61 62 61 73 65  tabase" database
c4e0: 0a 2a 2a 20 61 6e 64 20 63 61 6c 6c 73 20 74 68  .** and calls th
c4f0: 61 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 22 64  at connection "d
c500: 62 31 22 2e 20 20 54 68 65 20 73 65 63 6f 6e 64  b1".  The second
c510: 20 63 6f 6d 6d 61 6e 64 20 63 61 75 73 65 73 20   command causes 
c520: 74 68 69 73 0a 2a 2a 20 73 75 62 72 6f 75 74 69  this.** subrouti
c530: 6e 65 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64  ne to be invoked
c540: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
c550: 44 62 4f 62 6a 43 6d 64 28 76 6f 69 64 20 2a 63  DbObjCmd(void *c
c560: 64 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  d, Tcl_Interp *i
c570: 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c  nterp, int objc,
c580: 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 2a 6f  Tcl_Obj *const*o
c590: 62 6a 76 29 7b 0a 20 20 53 71 6c 69 74 65 44 62  bjv){.  SqliteDb
c5a0: 20 2a 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44   *pDb = (SqliteD
c5b0: 62 2a 29 63 64 3b 0a 20 20 69 6e 74 20 63 68 6f  b*)cd;.  int cho
c5c0: 69 63 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ice;.  int rc = 
c5d0: 54 43 4c 5f 4f 4b 3b 0a 20 20 73 74 61 74 69 63  TCL_OK;.  static
c5e0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 44 42 5f   const char *DB_
c5f0: 73 74 72 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 22  strs[] = {.    "
c600: 61 75 74 68 6f 72 69 7a 65 72 22 2c 20 20 20 20  authorizer",    
c610: 20 20 20 20 20 22 62 61 63 6b 75 70 22 2c 20 20       "backup",  
c620: 20 20 20 20 20 20 20 20 20 20 22 62 75 73 79 22            "busy"
c630: 2c 0a 20 20 20 20 22 63 61 63 68 65 22 2c 20 20  ,.    "cache",  
c640: 20 20 20 20 20 20 20 20 20 20 20 20 22 63 68 61              "cha
c650: 6e 67 65 73 22 2c 20 20 20 20 20 20 20 20 20 20  nges",          
c660: 20 22 63 6c 6f 73 65 22 2c 0a 20 20 20 20 22 63   "close",.    "c
c670: 6f 6c 6c 61 74 65 22 2c 20 20 20 20 20 20 20 20  ollate",        
c680: 20 20 20 20 22 63 6f 6c 6c 61 74 69 6f 6e 5f 6e      "collation_n
c690: 65 65 64 65 64 22 2c 20 20 22 63 6f 6d 6d 69 74  eeded",  "commit
c6a0: 5f 68 6f 6f 6b 22 2c 0a 20 20 20 20 22 63 6f 6d  _hook",.    "com
c6b0: 70 6c 65 74 65 22 2c 20 20 20 20 20 20 20 20 20  plete",         
c6c0: 20 20 22 63 6f 70 79 22 2c 20 20 20 20 20 20 20    "copy",       
c6d0: 20 20 20 20 20 20 20 22 65 6e 61 62 6c 65 5f 6c         "enable_l
c6e0: 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e 22 2c 0a  oad_extension",.
c6f0: 20 20 20 20 22 65 72 72 6f 72 63 6f 64 65 22 2c      "errorcode",
c700: 20 20 20 20 20 20 20 20 20 20 22 65 76 61 6c 22            "eval"
c710: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  ,              "
c720: 65 78 69 73 74 73 22 2c 0a 20 20 20 20 22 66 75  exists",.    "fu
c730: 6e 63 74 69 6f 6e 22 2c 20 20 20 20 20 20 20 20  nction",        
c740: 20 20 20 22 69 6e 63 72 62 6c 6f 62 22 2c 20 20     "incrblob",  
c750: 20 20 20 20 20 20 20 20 22 69 6e 74 65 72 72 75          "interru
c760: 70 74 22 2c 0a 20 20 20 20 22 6c 61 73 74 5f 69  pt",.    "last_i
c770: 6e 73 65 72 74 5f 72 6f 77 69 64 22 2c 20 20 22  nsert_rowid",  "
c780: 6e 75 6c 6c 76 61 6c 75 65 22 2c 20 20 20 20 20  nullvalue",     
c790: 20 20 20 20 22 6f 6e 65 63 6f 6c 75 6d 6e 22 2c      "onecolumn",
c7a0: 0a 20 20 20 20 22 70 72 6f 66 69 6c 65 22 2c 20  .    "profile", 
c7b0: 20 20 20 20 20 20 20 20 20 20 20 22 70 72 6f 67             "prog
c7c0: 72 65 73 73 22 2c 20 20 20 20 20 20 20 20 20 20  ress",          
c7d0: 22 72 65 6b 65 79 22 2c 0a 20 20 20 20 22 72 65  "rekey",.    "re
c7e0: 73 74 6f 72 65 22 2c 20 20 20 20 20 20 20 20 20  store",         
c7f0: 20 20 20 22 72 6f 6c 6c 62 61 63 6b 5f 68 6f 6f     "rollback_hoo
c800: 6b 22 2c 20 20 20 20 20 22 73 74 61 74 75 73 22  k",     "status"
c810: 2c 0a 20 20 20 20 22 74 69 6d 65 6f 75 74 22 2c  ,.    "timeout",
c820: 20 20 20 20 20 20 20 20 20 20 20 20 22 74 6f 74              "tot
c830: 61 6c 5f 63 68 61 6e 67 65 73 22 2c 20 20 20 20  al_changes",    
c840: 20 22 74 72 61 63 65 22 2c 0a 20 20 20 20 22 74   "trace",.    "t
c850: 72 61 6e 73 61 63 74 69 6f 6e 22 2c 20 20 20 20  ransaction",    
c860: 20 20 20 20 22 75 6e 6c 6f 63 6b 5f 6e 6f 74 69      "unlock_noti
c870: 66 79 22 2c 20 20 20 20 20 22 75 70 64 61 74 65  fy",     "update
c880: 5f 68 6f 6f 6b 22 2c 0a 20 20 20 20 22 76 65 72  _hook",.    "ver
c890: 73 69 6f 6e 22 2c 20 20 20 20 20 20 20 20 20 20  sion",          
c8a0: 20 20 22 77 61 6c 5f 68 6f 6f 6b 22 2c 20 20 20    "wal_hook",   
c8b0: 20 20 20 20 20 20 20 30 0a 20 20 7d 3b 0a 20 20         0.  };.  
c8c0: 65 6e 75 6d 20 44 42 5f 65 6e 75 6d 20 7b 0a 20  enum DB_enum {. 
c8d0: 20 20 20 44 42 5f 41 55 54 48 4f 52 49 5a 45 52     DB_AUTHORIZER
c8e0: 2c 20 20 20 20 20 20 20 20 44 42 5f 42 41 43 4b  ,        DB_BACK
c8f0: 55 50 2c 20 20 20 20 20 20 20 20 20 20 20 44 42  UP,           DB
c900: 5f 42 55 53 59 2c 0a 20 20 20 20 44 42 5f 43 41  _BUSY,.    DB_CA
c910: 43 48 45 2c 20 20 20 20 20 20 20 20 20 20 20 20  CHE,            
c920: 20 44 42 5f 43 48 41 4e 47 45 53 2c 20 20 20 20   DB_CHANGES,    
c930: 20 20 20 20 20 20 44 42 5f 43 4c 4f 53 45 2c 0a        DB_CLOSE,.
c940: 20 20 20 20 44 42 5f 43 4f 4c 4c 41 54 45 2c 20      DB_COLLATE, 
c950: 20 20 20 20 20 20 20 20 20 20 44 42 5f 43 4f 4c            DB_COL
c960: 4c 41 54 49 4f 4e 5f 4e 45 45 44 45 44 2c 20 44  LATION_NEEDED, D
c970: 42 5f 43 4f 4d 4d 49 54 5f 48 4f 4f 4b 2c 0a 20  B_COMMIT_HOOK,. 
c980: 20 20 20 44 42 5f 43 4f 4d 50 4c 45 54 45 2c 20     DB_COMPLETE, 
c990: 20 20 20 20 20 20 20 20 20 44 42 5f 43 4f 50 59           DB_COPY
c9a0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 44 42  ,             DB
c9b0: 5f 45 4e 41 42 4c 45 5f 4c 4f 41 44 5f 45 58 54  _ENABLE_LOAD_EXT
c9c0: 45 4e 53 49 4f 4e 2c 0a 20 20 20 20 44 42 5f 45  ENSION,.    DB_E
c9d0: 52 52 4f 52 43 4f 44 45 2c 20 20 20 20 20 20 20  RRORCODE,       
c9e0: 20 20 44 42 5f 45 56 41 4c 2c 20 20 20 20 20 20    DB_EVAL,      
c9f0: 20 20 20 20 20 20 20 44 42 5f 45 58 49 53 54 53         DB_EXISTS
ca00: 2c 0a 20 20 20 20 44 42 5f 46 55 4e 43 54 49 4f  ,.    DB_FUNCTIO
ca10: 4e 2c 20 20 20 20 20 20 20 20 20 20 44 42 5f 49  N,          DB_I
ca20: 4e 43 52 42 4c 4f 42 2c 20 20 20 20 20 20 20 20  NCRBLOB,        
ca30: 20 44 42 5f 49 4e 54 45 52 52 55 50 54 2c 0a 20   DB_INTERRUPT,. 
ca40: 20 20 20 44 42 5f 4c 41 53 54 5f 49 4e 53 45 52     DB_LAST_INSER
ca50: 54 5f 52 4f 57 49 44 2c 20 44 42 5f 4e 55 4c 4c  T_ROWID, DB_NULL
ca60: 56 41 4c 55 45 2c 20 20 20 20 20 20 20 20 44 42  VALUE,        DB
ca70: 5f 4f 4e 45 43 4f 4c 55 4d 4e 2c 0a 20 20 20 20  _ONECOLUMN,.    
ca80: 44 42 5f 50 52 4f 46 49 4c 45 2c 20 20 20 20 20  DB_PROFILE,     
ca90: 20 20 20 20 20 20 44 42 5f 50 52 4f 47 52 45 53        DB_PROGRES
caa0: 53 2c 20 20 20 20 20 20 20 20 20 44 42 5f 52 45  S,         DB_RE
cab0: 4b 45 59 2c 0a 20 20 20 20 44 42 5f 52 45 53 54  KEY,.    DB_REST
cac0: 4f 52 45 2c 20 20 20 20 20 20 20 20 20 20 20 44  ORE,           D
cad0: 42 5f 52 4f 4c 4c 42 41 43 4b 5f 48 4f 4f 4b 2c  B_ROLLBACK_HOOK,
cae0: 20 20 20 20 44 42 5f 53 54 41 54 55 53 2c 0a 20      DB_STATUS,. 
caf0: 20 20 20 44 42 5f 54 49 4d 45 4f 55 54 2c 20 20     DB_TIMEOUT,  
cb00: 20 20 20 20 20 20 20 20 20 44 42 5f 54 4f 54 41           DB_TOTA
cb10: 4c 5f 43 48 41 4e 47 45 53 2c 20 20 20 20 44 42  L_CHANGES,    DB
cb20: 5f 54 52 41 43 45 2c 0a 20 20 20 20 44 42 5f 54  _TRACE,.    DB_T
cb30: 52 41 4e 53 41 43 54 49 4f 4e 2c 20 20 20 20 20  RANSACTION,     
cb40: 20 20 44 42 5f 55 4e 4c 4f 43 4b 5f 4e 4f 54 49    DB_UNLOCK_NOTI
cb50: 46 59 2c 20 20 20 20 44 42 5f 55 50 44 41 54 45  FY,    DB_UPDATE
cb60: 5f 48 4f 4f 4b 2c 0a 20 20 20 20 44 42 5f 56 45  _HOOK,.    DB_VE
cb70: 52 53 49 4f 4e 2c 20 20 20 20 20 20 20 20 20 20  RSION,          
cb80: 20 44 42 5f 57 41 4c 5f 48 4f 4f 4b 0a 20 20 7d   DB_WAL_HOOK.  }
cb90: 3b 0a 20 20 2f 2a 20 64 6f 6e 27 74 20 6c 65 61  ;.  /* don't lea
cba0: 76 65 20 74 72 61 69 6c 69 6e 67 20 63 6f 6d 6d  ve trailing comm
cbb0: 61 73 20 6f 6e 20 44 42 5f 65 6e 75 6d 2c 20 69  as on DB_enum, i
cbc0: 74 20 63 6f 6e 66 75 73 65 73 20 74 68 65 20 41  t confuses the A
cbd0: 49 58 20 78 6c 63 20 63 6f 6d 70 69 6c 65 72 20  IX xlc compiler 
cbe0: 2a 2f 0a 0a 20 20 69 66 28 20 6f 62 6a 63 3c 32  */..  if( objc<2
cbf0: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
cc00: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
cc10: 20 31 2c 20 6f 62 6a 76 2c 20 22 53 55 42 43 4f   1, objv, "SUBCO
cc20: 4d 4d 41 4e 44 20 2e 2e 2e 22 29 3b 0a 20 20 20  MMAND ...");.   
cc30: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
cc40: 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54 63 6c  R;.  }.  if( Tcl
cc50: 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a  _GetIndexFromObj
cc60: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d  (interp, objv[1]
cc70: 2c 20 44 42 5f 73 74 72 73 2c 20 22 6f 70 74 69  , DB_strs, "opti
cc80: 6f 6e 22 2c 20 30 2c 20 26 63 68 6f 69 63 65 29  on", 0, &choice)
cc90: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54   ){.    return T
cca0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
ccb0: 20 73 77 69 74 63 68 28 20 28 65 6e 75 6d 20 44   switch( (enum D
ccc0: 42 5f 65 6e 75 6d 29 63 68 6f 69 63 65 20 29 7b  B_enum)choice ){
ccd0: 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 61 75  ..  /*    $db au
cce0: 74 68 6f 72 69 7a 65 72 20 3f 43 41 4c 4c 42 41  thorizer ?CALLBA
ccf0: 43 4b 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e  CK?.  **.  ** In
cd00: 76 6f 6b 65 20 74 68 65 20 67 69 76 65 6e 20 63  voke the given c
cd10: 61 6c 6c 62 61 63 6b 20 74 6f 20 61 75 74 68 6f  allback to autho
cd20: 72 69 7a 65 20 65 61 63 68 20 53 51 4c 20 6f 70  rize each SQL op
cd30: 65 72 61 74 69 6f 6e 20 61 73 20 69 74 20 69 73  eration as it is
cd40: 0a 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 64 2e 20  .  ** compiled. 
cd50: 20 35 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65   5 arguments are
cd60: 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65   appended to the
cd70: 20 63 61 6c 6c 62 61 63 6b 20 62 65 66 6f 72 65   callback before
cd80: 20 69 74 20 69 73 0a 20 20 2a 2a 20 69 6e 76 6f   it is.  ** invo
cd90: 6b 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  ked:.  **.  **  
cda0: 20 28 31 29 20 54 68 65 20 61 75 74 68 6f 72 69   (1) The authori
cdb0: 7a 61 74 69 6f 6e 20 74 79 70 65 20 28 65 78 3a  zation type (ex:
cdc0: 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54   SQLITE_CREATE_T
cdd0: 41 42 4c 45 2c 20 53 51 4c 49 54 45 5f 49 4e 53  ABLE, SQLITE_INS
cde0: 45 52 54 2c 20 2e 2e 2e 29 0a 20 20 2a 2a 20 20  ERT, ...).  **  
cdf0: 20 28 32 29 20 46 69 72 73 74 20 64 65 73 63 72   (2) First descr
ce00: 69 70 74 69 76 65 20 6e 61 6d 65 20 28 64 65 70  iptive name (dep
ce10: 65 6e 64 73 20 6f 6e 20 61 75 74 68 6f 72 69 7a  ends on authoriz
ce20: 61 74 69 6f 6e 20 74 79 70 65 29 0a 20 20 2a 2a  ation type).  **
ce30: 20 20 20 28 33 29 20 53 65 63 6f 6e 64 20 64 65     (3) Second de
ce40: 73 63 72 69 70 74 69 76 65 20 6e 61 6d 65 0a 20  scriptive name. 
ce50: 20 2a 2a 20 20 20 28 34 29 20 4e 61 6d 65 20 6f   **   (4) Name o
ce60: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 28  f the database (
ce70: 65 78 3a 20 22 6d 61 69 6e 22 2c 20 22 74 65 6d  ex: "main", "tem
ce80: 70 22 29 0a 20 20 2a 2a 20 20 20 28 35 29 20 4e  p").  **   (5) N
ce90: 61 6d 65 20 6f 66 20 74 72 69 67 67 65 72 20 74  ame of trigger t
cea0: 68 61 74 20 69 73 20 64 6f 69 6e 67 20 74 68 65  hat is doing the
ceb0: 20 61 63 63 65 73 73 0a 20 20 2a 2a 0a 20 20 2a   access.  **.  *
cec0: 2a 20 54 68 65 20 63 61 6c 6c 62 61 63 6b 20 73  * The callback s
ced0: 68 6f 75 6c 64 20 72 65 74 75 72 6e 20 6f 6e 20  hould return on 
cee0: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
cef0: 20 73 74 72 69 6e 67 73 3a 20 53 51 4c 49 54 45   strings: SQLITE
cf00: 5f 4f 4b 2c 0a 20 20 2a 2a 20 53 51 4c 49 54 45  _OK,.  ** SQLITE
cf10: 5f 49 47 4e 4f 52 45 2c 20 6f 72 20 53 51 4c 49  _IGNORE, or SQLI
cf20: 54 45 5f 44 45 4e 59 2e 20 20 41 6e 79 20 6f 74  TE_DENY.  Any ot
cf30: 68 65 72 20 72 65 74 75 72 6e 20 76 61 6c 75 65  her return value
cf40: 20 69 73 20 61 6e 20 65 72 72 6f 72 2e 0a 20 20   is an error..  
cf50: 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69 73 20  **.  ** If this 
cf60: 6d 65 74 68 6f 64 20 69 73 20 69 6e 76 6f 6b 65  method is invoke
cf70: 64 20 77 69 74 68 20 6e 6f 20 61 72 67 75 6d 65  d with no argume
cf80: 6e 74 73 2c 20 74 68 65 20 63 75 72 72 65 6e 74  nts, the current
cf90: 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 0a 20   authorization. 
cfa0: 20 2a 2a 20 63 61 6c 6c 62 61 63 6b 20 73 74 72   ** callback str
cfb0: 69 6e 67 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ing is returned.
cfc0: 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f  .  */.  case DB_
cfd0: 41 55 54 48 4f 52 49 5a 45 52 3a 20 7b 0a 23 69  AUTHORIZER: {.#i
cfe0: 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
cff0: 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20  _AUTHORIZATION. 
d000: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
d010: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 61 75 74  ult(interp, "aut
d020: 68 6f 72 69 7a 61 74 69 6f 6e 20 6e 6f 74 20 61  horization not a
d030: 76 61 69 6c 61 62 6c 65 20 69 6e 20 74 68 69 73  vailable in this
d040: 20 62 75 69 6c 64 22 2c 20 30 29 3b 0a 20 20 20   build", 0);.   
d050: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
d060: 52 3b 0a 23 65 6c 73 65 0a 20 20 20 20 69 66 28  R;.#else.    if(
d070: 20 6f 62 6a 63 3e 33 20 29 7b 0a 20 20 20 20 20   objc>3 ){.     
d080: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
d090: 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a  s(interp, 2, obj
d0a0: 76 2c 20 22 3f 43 41 4c 4c 42 41 43 4b 3f 22 29  v, "?CALLBACK?")
d0b0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
d0c0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65  CL_ERROR;.    }e
d0d0: 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20  lse if( objc==2 
d0e0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62  ){.      if( pDb
d0f0: 2d 3e 7a 41 75 74 68 20 29 7b 0a 20 20 20 20 20  ->zAuth ){.     
d100: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
d110: 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 44 62 2d  ult(interp, pDb-
d120: 3e 7a 41 75 74 68 2c 20 30 29 3b 0a 20 20 20 20  >zAuth, 0);.    
d130: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
d140: 20 20 20 20 20 63 68 61 72 20 2a 7a 41 75 74 68       char *zAuth
d150: 3b 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b  ;.      int len;
d160: 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e  .      if( pDb->
d170: 7a 41 75 74 68 20 29 7b 0a 20 20 20 20 20 20 20  zAuth ){.       
d180: 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a   Tcl_Free(pDb->z
d190: 41 75 74 68 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Auth);.      }. 
d1a0: 20 20 20 20 20 7a 41 75 74 68 20 3d 20 54 63 6c       zAuth = Tcl
d1b0: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
d1c0: 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29  j(objv[2], &len)
d1d0: 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 41 75 74  ;.      if( zAut
d1e0: 68 20 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20 20  h && len>0 ){.  
d1f0: 20 20 20 20 20 20 70 44 62 2d 3e 7a 41 75 74 68        pDb->zAuth
d200: 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65   = Tcl_Alloc( le
d210: 6e 20 2b 20 31 20 29 3b 0a 20 20 20 20 20 20 20  n + 1 );.       
d220: 20 6d 65 6d 63 70 79 28 70 44 62 2d 3e 7a 41 75   memcpy(pDb->zAu
d230: 74 68 2c 20 7a 41 75 74 68 2c 20 6c 65 6e 2b 31  th, zAuth, len+1
d240: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
d250: 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 41 75          pDb->zAu
d260: 74 68 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  th = 0;.      }.
d270: 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a        if( pDb->z
d280: 41 75 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20  Auth ){.        
d290: 70 44 62 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e  pDb->interp = in
d2a0: 74 65 72 70 3b 0a 20 20 20 20 20 20 20 20 73 71  terp;.        sq
d2b0: 6c 69 74 65 33 5f 73 65 74 5f 61 75 74 68 6f 72  lite3_set_author
d2c0: 69 7a 65 72 28 70 44 62 2d 3e 64 62 2c 20 61 75  izer(pDb->db, au
d2d0: 74 68 5f 63 61 6c 6c 62 61 63 6b 2c 20 70 44 62  th_callback, pDb
d2e0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
d2f0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
d300: 73 65 74 5f 61 75 74 68 6f 72 69 7a 65 72 28 70  set_authorizer(p
d310: 44 62 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20  Db->db, 0, 0);. 
d320: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e       }.    }.#en
d330: 64 69 66 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20  dif.    break;. 
d340: 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20   }..  /*    $db 
d350: 62 61 63 6b 75 70 20 3f 44 41 54 41 42 41 53 45  backup ?DATABASE
d360: 3f 20 46 49 4c 45 4e 41 4d 45 0a 20 20 2a 2a 0a  ? FILENAME.  **.
d370: 20 20 2a 2a 20 4f 70 65 6e 20 6f 72 20 63 72 65    ** Open or cre
d380: 61 74 65 20 61 20 64 61 74 61 62 61 73 65 20 66  ate a database f
d390: 69 6c 65 20 6e 61 6d 65 64 20 46 49 4c 45 4e 41  ile named FILENA
d3a0: 4d 45 2e 20 20 54 72 61 6e 73 66 65 72 20 74 68  ME.  Transfer th
d3b0: 65 0a 20 20 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f  e.  ** content o
d3c0: 66 20 6c 6f 63 61 6c 20 64 61 74 61 62 61 73 65  f local database
d3d0: 20 44 41 54 41 42 41 53 45 20 28 64 65 66 61 75   DATABASE (defau
d3e0: 6c 74 3a 20 22 6d 61 69 6e 22 29 20 69 6e 74 6f  lt: "main") into
d3f0: 20 74 68 65 0a 20 20 2a 2a 20 46 49 4c 45 4e 41   the.  ** FILENA
d400: 4d 45 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a  ME database..  *
d410: 2f 0a 20 20 63 61 73 65 20 44 42 5f 42 41 43 4b  /.  case DB_BACK
d420: 55 50 3a 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20  UP: {.    const 
d430: 63 68 61 72 20 2a 7a 44 65 73 74 46 69 6c 65 3b  char *zDestFile;
d440: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
d450: 2a 7a 53 72 63 44 62 3b 0a 20 20 20 20 73 71 6c  *zSrcDb;.    sql
d460: 69 74 65 33 20 2a 70 44 65 73 74 3b 0a 20 20 20  ite3 *pDest;.   
d470: 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20   sqlite3_backup 
d480: 2a 70 42 61 63 6b 75 70 3b 0a 0a 20 20 20 20 69  *pBackup;..    i
d490: 66 28 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20 20  f( objc==3 ){.  
d4a0: 20 20 20 20 7a 53 72 63 44 62 20 3d 20 22 6d 61      zSrcDb = "ma
d4b0: 69 6e 22 3b 0a 20 20 20 20 20 20 7a 44 65 73 74  in";.      zDest
d4c0: 46 69 6c 65 20 3d 20 54 63 6c 5f 47 65 74 53 74  File = Tcl_GetSt
d4d0: 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20  ring(objv[2]);. 
d4e0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a     }else if( obj
d4f0: 63 3d 3d 34 20 29 7b 0a 20 20 20 20 20 20 7a 53  c==4 ){.      zS
d500: 72 63 44 62 20 3d 20 54 63 6c 5f 47 65 74 53 74  rcDb = Tcl_GetSt
d510: 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20  ring(objv[2]);. 
d520: 20 20 20 20 20 7a 44 65 73 74 46 69 6c 65 20 3d       zDestFile =
d530: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
d540: 62 6a 76 5b 33 5d 29 3b 0a 20 20 20 20 7d 65 6c  bjv[3]);.    }el
d550: 73 65 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72  se{.      Tcl_Wr
d560: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
d570: 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 44 41  p, 2, objv, "?DA
d580: 54 41 42 41 53 45 3f 20 46 49 4c 45 4e 41 4d 45  TABASE? FILENAME
d590: 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
d5a0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
d5b0: 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  }.    rc = sqlit
d5c0: 65 33 5f 6f 70 65 6e 28 7a 44 65 73 74 46 69 6c  e3_open(zDestFil
d5d0: 65 2c 20 26 70 44 65 73 74 29 3b 0a 20 20 20 20  e, &pDest);.    
d5e0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
d5f0: 4b 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41  K ){.      Tcl_A
d600: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
d610: 72 70 2c 20 22 63 61 6e 6e 6f 74 20 6f 70 65 6e  rp, "cannot open
d620: 20 74 61 72 67 65 74 20 64 61 74 61 62 61 73 65   target database
d630: 3a 20 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  : ",.           
d640: 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70  sqlite3_errmsg(p
d650: 44 65 73 74 29 2c 20 28 63 68 61 72 2a 29 30 29  Dest), (char*)0)
d660: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
d670: 63 6c 6f 73 65 28 70 44 65 73 74 29 3b 0a 20 20  close(pDest);.  
d680: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
d690: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
d6a0: 70 42 61 63 6b 75 70 20 3d 20 73 71 6c 69 74 65  pBackup = sqlite
d6b0: 33 5f 62 61 63 6b 75 70 5f 69 6e 69 74 28 70 44  3_backup_init(pD
d6c0: 65 73 74 2c 20 22 6d 61 69 6e 22 2c 20 70 44 62  est, "main", pDb
d6d0: 2d 3e 64 62 2c 20 7a 53 72 63 44 62 29 3b 0a 20  ->db, zSrcDb);. 
d6e0: 20 20 20 69 66 28 20 70 42 61 63 6b 75 70 3d 3d     if( pBackup==
d6f0: 30 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41  0 ){.      Tcl_A
d700: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
d710: 72 70 2c 20 22 62 61 63 6b 75 70 20 66 61 69 6c  rp, "backup fail
d720: 65 64 3a 20 22 2c 0a 20 20 20 20 20 20 20 20 20  ed: ",.         
d730: 20 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67    sqlite3_errmsg
d740: 28 70 44 65 73 74 29 2c 20 28 63 68 61 72 2a 29  (pDest), (char*)
d750: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
d760: 33 5f 63 6c 6f 73 65 28 70 44 65 73 74 29 3b 0a  3_close(pDest);.
d770: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
d780: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
d790: 20 20 77 68 69 6c 65 28 20 20 28 72 63 20 3d 20    while(  (rc = 
d7a0: 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f 73  sqlite3_backup_s
d7b0: 74 65 70 28 70 42 61 63 6b 75 70 2c 31 30 30 29  tep(pBackup,100)
d7c0: 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 7d  )==SQLITE_OK ){}
d7d0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 61 63  .    sqlite3_bac
d7e0: 6b 75 70 5f 66 69 6e 69 73 68 28 70 42 61 63 6b  kup_finish(pBack
d7f0: 75 70 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  up);.    if( rc=
d800: 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a  =SQLITE_DONE ){.
d810: 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 4f        rc = TCL_O
d820: 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  K;.    }else{.  
d830: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
d840: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 61  sult(interp, "ba
d850: 63 6b 75 70 20 66 61 69 6c 65 64 3a 20 22 2c 0a  ckup failed: ",.
d860: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
d870: 65 33 5f 65 72 72 6d 73 67 28 70 44 65 73 74 29  e3_errmsg(pDest)
d880: 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20  , (char*)0);.   
d890: 20 20 20 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f     rc = TCL_ERRO
d8a0: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  R;.    }.    sql
d8b0: 69 74 65 33 5f 63 6c 6f 73 65 28 70 44 65 73 74  ite3_close(pDest
d8c0: 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  );.    break;.  
d8d0: 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 62  }..  /*    $db b
d8e0: 75 73 79 20 3f 43 41 4c 4c 42 41 43 4b 3f 0a 20  usy ?CALLBACK?. 
d8f0: 20 2a 2a 0a 20 20 2a 2a 20 49 6e 76 6f 6b 65 20   **.  ** Invoke 
d900: 74 68 65 20 67 69 76 65 6e 20 63 61 6c 6c 62 61  the given callba
d910: 63 6b 20 69 66 20 61 6e 20 53 51 4c 20 73 74 61  ck if an SQL sta
d920: 74 65 6d 65 6e 74 20 61 74 74 65 6d 70 74 73 20  tement attempts 
d930: 74 6f 20 6f 70 65 6e 0a 20 20 2a 2a 20 61 20 6c  to open.  ** a l
d940: 6f 63 6b 65 64 20 64 61 74 61 62 61 73 65 20 66  ocked database f
d950: 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  ile..  */.  case
d960: 20 44 42 5f 42 55 53 59 3a 20 7b 0a 20 20 20 20   DB_BUSY: {.    
d970: 69 66 28 20 6f 62 6a 63 3e 33 20 29 7b 0a 20 20  if( objc>3 ){.  
d980: 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
d990: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20  Args(interp, 2, 
d9a0: 6f 62 6a 76 2c 20 22 43 41 4c 4c 42 41 43 4b 22  objv, "CALLBACK"
d9b0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
d9c0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
d9d0: 65 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d 32  else if( objc==2
d9e0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 44   ){.      if( pD
d9f0: 62 2d 3e 7a 42 75 73 79 20 29 7b 0a 20 20 20 20  b->zBusy ){.    
da00: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
da10: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 44 62  sult(interp, pDb
da20: 2d 3e 7a 42 75 73 79 2c 20 30 29 3b 0a 20 20 20  ->zBusy, 0);.   
da30: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
da40: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 42 75 73        char *zBus
da50: 79 3b 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e  y;.      int len
da60: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d  ;.      if( pDb-
da70: 3e 7a 42 75 73 79 20 29 7b 0a 20 20 20 20 20 20  >zBusy ){.      
da80: 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e    Tcl_Free(pDb->
da90: 7a 42 75 73 79 29 3b 0a 20 20 20 20 20 20 7d 0a  zBusy);.      }.
daa0: 20 20 20 20 20 20 7a 42 75 73 79 20 3d 20 54 63        zBusy = Tc
dab0: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
dac0: 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e  bj(objv[2], &len
dad0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 42 75  );.      if( zBu
dae0: 73 79 20 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20  sy && len>0 ){. 
daf0: 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 42 75 73         pDb->zBus
db00: 79 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c  y = Tcl_Alloc( l
db10: 65 6e 20 2b 20 31 20 29 3b 0a 20 20 20 20 20 20  en + 1 );.      
db20: 20 20 6d 65 6d 63 70 79 28 70 44 62 2d 3e 7a 42    memcpy(pDb->zB
db30: 75 73 79 2c 20 7a 42 75 73 79 2c 20 6c 65 6e 2b  usy, zBusy, len+
db40: 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  1);.      }else{
db50: 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 42  .        pDb->zB
db60: 75 73 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  usy = 0;.      }
db70: 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e  .      if( pDb->
db80: 7a 42 75 73 79 20 29 7b 0a 20 20 20 20 20 20 20  zBusy ){.       
db90: 20 70 44 62 2d 3e 69 6e 74 65 72 70 20 3d 20 69   pDb->interp = i
dba0: 6e 74 65 72 70 3b 0a 20 20 20 20 20 20 20 20 73  nterp;.        s
dbb0: 71 6c 69 74 65 33 5f 62 75 73 79 5f 68 61 6e 64  qlite3_busy_hand
dbc0: 6c 65 72 28 70 44 62 2d 3e 64 62 2c 20 44 62 42  ler(pDb->db, DbB
dbd0: 75 73 79 48 61 6e 64 6c 65 72 2c 20 70 44 62 29  usyHandler, pDb)
dbe0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
dbf0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62         sqlite3_b
dc00: 75 73 79 5f 68 61 6e 64 6c 65 72 28 70 44 62 2d  usy_handler(pDb-
dc10: 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  >db, 0, 0);.    
dc20: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 62 72    }.    }.    br
dc30: 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20  eak;.  }..  /*  
dc40: 20 20 20 24 64 62 20 63 61 63 68 65 20 66 6c 75     $db cache flu
dc50: 73 68 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20  sh.  **     $db 
dc60: 63 61 63 68 65 20 73 69 7a 65 20 6e 0a 20 20 2a  cache size n.  *
dc70: 2a 0a 20 20 2a 2a 20 46 6c 75 73 68 20 74 68 65  *.  ** Flush the
dc80: 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
dc90: 65 6e 74 20 63 61 63 68 65 2c 20 6f 72 20 73 65  ent cache, or se
dca0: 74 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75  t the maximum nu
dcb0: 6d 62 65 72 20 6f 66 0a 20 20 2a 2a 20 63 61 63  mber of.  ** cac
dcc0: 68 65 64 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a  hed statements..
dcd0: 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 43    */.  case DB_C
dce0: 41 43 48 45 3a 20 7b 0a 20 20 20 20 63 68 61 72  ACHE: {.    char
dcf0: 20 2a 73 75 62 43 6d 64 3b 0a 20 20 20 20 69 6e   *subCmd;.    in
dd00: 74 20 6e 3b 0a 0a 20 20 20 20 69 66 28 20 6f 62  t n;..    if( ob
dd10: 6a 63 3c 3d 32 20 29 7b 0a 20 20 20 20 20 20 54  jc<=2 ){.      T
dd20: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
dd30: 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
dd40: 20 22 63 61 63 68 65 20 6f 70 74 69 6f 6e 20 3f   "cache option ?
dd50: 61 72 67 3f 22 29 3b 0a 20 20 20 20 20 20 72 65  arg?");.      re
dd60: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
dd70: 20 20 20 20 7d 0a 20 20 20 20 73 75 62 43 6d 64      }.    subCmd
dd80: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
dd90: 46 72 6f 6d 4f 62 6a 28 20 6f 62 6a 76 5b 32 5d  FromObj( objv[2]
dda0: 2c 20 30 20 29 3b 0a 20 20 20 20 69 66 28 20 2a  , 0 );.    if( *
ddb0: 73 75 62 43 6d 64 3d 3d 27 66 27 20 26 26 20 73  subCmd=='f' && s
ddc0: 74 72 63 6d 70 28 73 75 62 43 6d 64 2c 22 66 6c  trcmp(subCmd,"fl
ddd0: 75 73 68 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ush")==0 ){.    
dde0: 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b    if( objc!=3 ){
ddf0: 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 57 72 6f  .        Tcl_Wro
de00: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
de10: 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 66 6c 75 73  , 2, objv, "flus
de20: 68 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  h");.        ret
de30: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
de40: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
de50: 20 20 20 20 66 6c 75 73 68 53 74 6d 74 43 61 63      flushStmtCac
de60: 68 65 28 20 70 44 62 20 29 3b 0a 20 20 20 20 20  he( pDb );.     
de70: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28   }.    }else if(
de80: 20 2a 73 75 62 43 6d 64 3d 3d 27 73 27 20 26 26   *subCmd=='s' &&
de90: 20 73 74 72 63 6d 70 28 73 75 62 43 6d 64 2c 22   strcmp(subCmd,"
dea0: 73 69 7a 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20  size")==0 ){.   
deb0: 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29     if( objc!=4 )
dec0: 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 57 72  {.        Tcl_Wr
ded0: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
dee0: 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 73 69 7a  p, 2, objv, "siz
def0: 65 20 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 72  e n");.        r
df00: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
df10: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
df20: 20 20 20 20 20 20 69 66 28 20 54 43 4c 5f 45 52        if( TCL_ER
df30: 52 4f 52 3d 3d 54 63 6c 5f 47 65 74 49 6e 74 46  ROR==Tcl_GetIntF
df40: 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
df50: 62 6a 76 5b 33 5d 2c 20 26 6e 29 20 29 7b 0a 20  bjv[3], &n) ){. 
df60: 20 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70           Tcl_App
df70: 65 6e 64 52 65 73 75 6c 74 28 20 69 6e 74 65 72  endResult( inter
df80: 70 2c 20 22 63 61 6e 6e 6f 74 20 63 6f 6e 76 65  p, "cannot conve
df90: 72 74 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20  rt \"", .       
dfa0: 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53          Tcl_GetS
dfb0: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
dfc0: 76 5b 33 5d 2c 30 29 2c 20 22 5c 22 20 74 6f 20  v[3],0), "\" to 
dfd0: 69 6e 74 65 67 65 72 22 2c 20 30 29 3b 0a 20 20  integer", 0);.  
dfe0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54          return T
dff0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  CL_ERROR;.      
e000: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
e010: 20 20 20 69 66 28 20 6e 3c 30 20 29 7b 0a 20 20     if( n<0 ){.  
e020: 20 20 20 20 20 20 20 20 20 20 66 6c 75 73 68 53            flushS
e030: 74 6d 74 43 61 63 68 65 28 20 70 44 62 20 29 3b  tmtCache( pDb );
e040: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 20 3d  .            n =
e050: 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65   0;.          }e
e060: 6c 73 65 20 69 66 28 20 6e 3e 4d 41 58 5f 50 52  lse if( n>MAX_PR
e070: 45 50 41 52 45 44 5f 53 54 4d 54 53 20 29 7b 0a  EPARED_STMTS ){.
e080: 20 20 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20              n = 
e090: 4d 41 58 5f 50 52 45 50 41 52 45 44 5f 53 54 4d  MAX_PREPARED_STM
e0a0: 54 53 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  TS;.          }.
e0b0: 20 20 20 20 20 20 20 20 20 20 70 44 62 2d 3e 6d            pDb->m
e0c0: 61 78 53 74 6d 74 20 3d 20 6e 3b 0a 20 20 20 20  axStmt = n;.    
e0d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
e0e0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 54    }else{.      T
e0f0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
e100: 20 69 6e 74 65 72 70 2c 20 22 62 61 64 20 6f 70   interp, "bad op
e110: 74 69 6f 6e 20 5c 22 22 2c 20 0a 20 20 20 20 20  tion \"", .     
e120: 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
e130: 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32  ngFromObj(objv[2
e140: 5d 2c 30 29 2c 20 22 5c 22 3a 20 6d 75 73 74 20  ],0), "\": must 
e150: 62 65 20 66 6c 75 73 68 20 6f 72 20 73 69 7a 65  be flush or size
e160: 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 65 74  ", 0);.      ret
e170: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
e180: 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a     }.    break;.
e190: 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 20 24 64    }..  /*     $d
e1a0: 62 20 63 68 61 6e 67 65 73 0a 20 20 2a 2a 0a 20  b changes.  **. 
e1b0: 20 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e   ** Return the n
e1c0: 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68  umber of rows th
e1d0: 61 74 20 77 65 72 65 20 6d 6f 64 69 66 69 65 64  at were modified
e1e0: 2c 20 69 6e 73 65 72 74 65 64 2c 20 6f 72 20 64  , inserted, or d
e1f0: 65 6c 65 74 65 64 20 62 79 0a 20 20 2a 2a 20 74  eleted by.  ** t
e200: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 49  he most recent I
e210: 4e 53 45 52 54 2c 20 55 50 44 41 54 45 20 6f 72  NSERT, UPDATE or
e220: 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e   DELETE statemen
e230: 74 2c 20 6e 6f 74 20 69 6e 63 6c 75 64 69 6e 67  t, not including
e240: 20 0a 20 20 2a 2a 20 61 6e 79 20 63 68 61 6e 67   .  ** any chang
e250: 65 73 20 6d 61 64 65 20 62 79 20 74 72 69 67 67  es made by trigg
e260: 65 72 20 70 72 6f 67 72 61 6d 73 2e 0a 20 20 2a  er programs..  *
e270: 2f 0a 20 20 63 61 73 65 20 44 42 5f 43 48 41 4e  /.  case DB_CHAN
e280: 47 45 53 3a 20 7b 0a 20 20 20 20 54 63 6c 5f 4f  GES: {.    Tcl_O
e290: 62 6a 20 2a 70 52 65 73 75 6c 74 3b 0a 20 20 20  bj *pResult;.   
e2a0: 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a   if( objc!=2 ){.
e2b0: 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
e2c0: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
e2d0: 2c 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 20 20 20  , objv, "");.   
e2e0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
e2f0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ROR;.    }.    p
e300: 52 65 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65 74  Result = Tcl_Get
e310: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
e320: 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 49 6e  );.    Tcl_SetIn
e330: 74 4f 62 6a 28 70 52 65 73 75 6c 74 2c 20 73 71  tObj(pResult, sq
e340: 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 28 70 44  lite3_changes(pD
e350: 62 2d 3e 64 62 29 29 3b 0a 20 20 20 20 62 72 65  b->db));.    bre
e360: 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20  ak;.  }..  /*   
e370: 20 24 64 62 20 63 6c 6f 73 65 0a 20 20 2a 2a 0a   $db close.  **.
e380: 20 20 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74 68    ** Shutdown th
e390: 65 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2f 0a  e database.  */.
e3a0: 20 20 63 61 73 65 20 44 42 5f 43 4c 4f 53 45 3a    case DB_CLOSE:
e3b0: 20 7b 0a 20 20 20 20 54 63 6c 5f 44 65 6c 65 74   {.    Tcl_Delet
e3c0: 65 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c  eCommand(interp,
e3d0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
e3e0: 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30  omObj(objv[0], 0
e3f0: 29 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20  ));.    break;. 
e400: 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20   }..  /*.  **   
e410: 20 20 24 64 62 20 63 6f 6c 6c 61 74 65 20 4e 41    $db collate NA
e420: 4d 45 20 53 43 52 49 50 54 0a 20 20 2a 2a 0a 20  ME SCRIPT.  **. 
e430: 20 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77   ** Create a new
e440: 20 53 51 4c 20 63 6f 6c 6c 61 74 69 6f 6e 20 66   SQL collation f
e450: 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 20 4e  unction called N
e460: 41 4d 45 2e 20 20 57 68 65 6e 65 76 65 72 0a 20  AME.  Whenever. 
e470: 20 2a 2a 20 74 68 61 74 20 66 75 6e 63 74 69 6f   ** that functio
e480: 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 6e 76  n is called, inv
e490: 6f 6b 65 20 53 43 52 49 50 54 20 74 6f 20 65 76  oke SCRIPT to ev
e4a0: 61 6c 75 61 74 65 20 74 68 65 20 66 75 6e 63 74  aluate the funct
e4b0: 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  ion..  */.  case
e4c0: 20 44 42 5f 43 4f 4c 4c 41 54 45 3a 20 7b 0a 20   DB_COLLATE: {. 
e4d0: 20 20 20 53 71 6c 43 6f 6c 6c 61 74 65 20 2a 70     SqlCollate *p
e4e0: 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 63 68 61  Collate;.    cha
e4f0: 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 63 68  r *zName;.    ch
e500: 61 72 20 2a 7a 53 63 72 69 70 74 3b 0a 20 20 20  ar *zScript;.   
e510: 20 69 6e 74 20 6e 53 63 72 69 70 74 3b 0a 20 20   int nScript;.  
e520: 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b    if( objc!=4 ){
e530: 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  .      Tcl_Wrong
e540: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
e550: 32 2c 20 6f 62 6a 76 2c 20 22 4e 41 4d 45 20 53  2, objv, "NAME S
e560: 43 52 49 50 54 22 29 3b 0a 20 20 20 20 20 20 72  CRIPT");.      r
e570: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
e580: 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4e 61 6d 65  .    }.    zName
e590: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
e5a0: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c  FromObj(objv[2],
e5b0: 20 30 29 3b 0a 20 20 20 20 7a 53 63 72 69 70 74   0);.    zScript
e5c0: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
e5d0: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d 2c  FromObj(objv[3],
e5e0: 20 26 6e 53 63 72 69 70 74 29 3b 0a 20 20 20 20   &nScript);.    
e5f0: 70 43 6f 6c 6c 61 74 65 20 3d 20 28 53 71 6c 43  pCollate = (SqlC
e600: 6f 6c 6c 61 74 65 2a 29 54 63 6c 5f 41 6c 6c 6f  ollate*)Tcl_Allo
e610: 63 28 20 73 69 7a 65 6f 66 28 2a 70 43 6f 6c 6c  c( sizeof(*pColl
e620: 61 74 65 29 20 2b 20 6e 53 63 72 69 70 74 20 2b  ate) + nScript +
e630: 20 31 20 29 3b 0a 20 20 20 20 69 66 28 20 70 43   1 );.    if( pC
e640: 6f 6c 6c 61 74 65 3d 3d 30 20 29 20 72 65 74 75  ollate==0 ) retu
e650: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
e660: 20 20 70 43 6f 6c 6c 61 74 65 2d 3e 69 6e 74 65    pCollate->inte
e670: 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20  rp = interp;.   
e680: 20 70 43 6f 6c 6c 61 74 65 2d 3e 70 4e 65 78 74   pCollate->pNext
e690: 20 3d 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65   = pDb->pCollate
e6a0: 3b 0a 20 20 20 20 70 43 6f 6c 6c 61 74 65 2d 3e  ;.    pCollate->
e6b0: 7a 53 63 72 69 70 74 20 3d 20 28 63 68 61 72 2a  zScript = (char*
e6c0: 29 26 70 43 6f 6c 6c 61 74 65 5b 31 5d 3b 0a 20  )&pCollate[1];. 
e6d0: 20 20 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65     pDb->pCollate
e6e0: 20 3d 20 70 43 6f 6c 6c 61 74 65 3b 0a 20 20 20   = pCollate;.   
e6f0: 20 6d 65 6d 63 70 79 28 70 43 6f 6c 6c 61 74 65   memcpy(pCollate
e700: 2d 3e 7a 53 63 72 69 70 74 2c 20 7a 53 63 72 69  ->zScript, zScri
e710: 70 74 2c 20 6e 53 63 72 69 70 74 2b 31 29 3b 0a  pt, nScript+1);.
e720: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f      if( sqlite3_
e730: 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e  create_collation
e740: 28 70 44 62 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c  (pDb->db, zName,
e750: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 0a 20   SQLITE_UTF8, . 
e760: 20 20 20 20 20 20 20 70 43 6f 6c 6c 61 74 65 2c         pCollate,
e770: 20 74 63 6c 53 71 6c 43 6f 6c 6c 61 74 65 29 20   tclSqlCollate) 
e780: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74  ){.      Tcl_Set
e790: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28  Result(interp, (
e7a0: 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 65  char *)sqlite3_e
e7b0: 72 72 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c 20  rrmsg(pDb->db), 
e7c0: 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20  TCL_VOLATILE);. 
e7d0: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
e7e0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
e7f0: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
e800: 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20 63  *.  **     $db c
e810: 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64 20  ollation_needed 
e820: 53 43 52 49 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a  SCRIPT.  **.  **
e830: 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 53 51   Create a new SQ
e840: 4c 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e 63  L collation func
e850: 74 69 6f 6e 20 63 61 6c 6c 65 64 20 4e 41 4d 45  tion called NAME
e860: 2e 20 20 57 68 65 6e 65 76 65 72 0a 20 20 2a 2a  .  Whenever.  **
e870: 20 74 68 61 74 20 66 75 6e 63 74 69 6f 6e 20 69   that function i
e880: 73 20 63 61 6c 6c 65 64 2c 20 69 6e 76 6f 6b 65  s called, invoke
e890: 20 53 43 52 49 50 54 20 74 6f 20 65 76 61 6c 75   SCRIPT to evalu
e8a0: 61 74 65 20 74 68 65 20 66 75 6e 63 74 69 6f 6e  ate the function
e8b0: 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  ..  */.  case DB
e8c0: 5f 43 4f 4c 4c 41 54 49 4f 4e 5f 4e 45 45 44 45  _COLLATION_NEEDE
e8d0: 44 3a 20 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a  D: {.    if( obj
e8e0: 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 54 63  c!=3 ){.      Tc
e8f0: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
e900: 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
e910: 22 53 43 52 49 50 54 22 29 3b 0a 20 20 20 20 20  "SCRIPT");.     
e920: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
e930: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  R;.    }.    if(
e940: 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65   pDb->pCollateNe
e950: 65 64 65 64 20 29 7b 0a 20 20 20 20 20 20 54 63  eded ){.      Tc
e960: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70  l_DecrRefCount(p
e970: 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65 65 64  Db->pCollateNeed
e980: 65 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ed);.    }.    p
e990: 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65 65 64  Db->pCollateNeed
e9a0: 65 64 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61  ed = Tcl_Duplica
e9b0: 74 65 4f 62 6a 28 6f 62 6a 76 5b 32 5d 29 3b 0a  teObj(objv[2]);.
e9c0: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43      Tcl_IncrRefC
e9d0: 6f 75 6e 74 28 70 44 62 2d 3e 70 43 6f 6c 6c 61  ount(pDb->pColla
e9e0: 74 65 4e 65 65 64 65 64 29 3b 0a 20 20 20 20 73  teNeeded);.    s
e9f0: 71 6c 69 74 65 33 5f 63 6f 6c 6c 61 74 69 6f 6e  qlite3_collation
ea00: 5f 6e 65 65 64 65 64 28 70 44 62 2d 3e 64 62 2c  _needed(pDb->db,
ea10: 20 70 44 62 2c 20 74 63 6c 43 6f 6c 6c 61 74 65   pDb, tclCollate
ea20: 4e 65 65 64 65 64 29 3b 0a 20 20 20 20 62 72 65  Needed);.    bre
ea30: 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20  ak;.  }..  /*   
ea40: 20 24 64 62 20 63 6f 6d 6d 69 74 5f 68 6f 6f 6b   $db commit_hook
ea50: 20 3f 43 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a   ?CALLBACK?.  **
ea60: 0a 20 20 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65  .  ** Invoke the
ea70: 20 67 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b 20   given callback 
ea80: 6a 75 73 74 20 62 65 66 6f 72 65 20 63 6f 6d 6d  just before comm
ea90: 69 74 74 69 6e 67 20 65 76 65 72 79 20 53 51 4c  itting every SQL
eaa0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20   transaction..  
eab0: 2a 2a 20 49 66 20 74 68 65 20 63 61 6c 6c 62 61  ** If the callba
eac0: 63 6b 20 74 68 72 6f 77 73 20 61 6e 20 65 78 63  ck throws an exc
ead0: 65 70 74 69 6f 6e 20 6f 72 20 72 65 74 75 72 6e  eption or return
eae0: 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
eaf0: 20 74 68 65 0a 20 20 2a 2a 20 74 72 61 6e 73 61   the.  ** transa
eb00: 63 74 69 6f 6e 20 69 73 20 61 62 6f 72 74 65 64  ction is aborted
eb10: 2e 20 20 49 66 20 43 41 4c 4c 42 41 43 4b 20 69  .  If CALLBACK i
eb20: 73 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e  s an empty strin
eb30: 67 2c 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 0a  g, the callback.
eb40: 20 20 2a 2a 20 69 73 20 64 69 73 61 62 6c 65 64    ** is disabled
eb50: 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  ..  */.  case DB
eb60: 5f 43 4f 4d 4d 49 54 5f 48 4f 4f 4b 3a 20 7b 0a  _COMMIT_HOOK: {.
eb70: 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 33 20 29      if( objc>3 )
eb80: 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e  {.      Tcl_Wron
eb90: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
eba0: 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 43 41 4c 4c   2, objv, "?CALL
ebb0: 42 41 43 4b 3f 22 29 3b 0a 20 20 20 20 20 20 72  BACK?");.      r
ebc0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
ebd0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f  .    }else if( o
ebe0: 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20  bjc==2 ){.      
ebf0: 69 66 28 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74  if( pDb->zCommit
ec00: 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f   ){.        Tcl_
ec10: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
ec20: 65 72 70 2c 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69  erp, pDb->zCommi
ec30: 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  t, 0);.      }. 
ec40: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
ec50: 63 68 61 72 20 2a 7a 43 6f 6d 6d 69 74 3b 0a 20  char *zCommit;. 
ec60: 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20       int len;.  
ec70: 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 43 6f      if( pDb->zCo
ec80: 6d 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20  mmit ){.        
ec90: 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 43  Tcl_Free(pDb->zC
eca0: 6f 6d 6d 69 74 29 3b 0a 20 20 20 20 20 20 7d 0a  ommit);.      }.
ecb0: 20 20 20 20 20 20 7a 43 6f 6d 6d 69 74 20 3d 20        zCommit = 
ecc0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
ecd0: 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c  mObj(objv[2], &l
ece0: 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  en);.      if( z
ecf0: 43 6f 6d 6d 69 74 20 26 26 20 6c 65 6e 3e 30 20  Commit && len>0 
ed00: 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e  ){.        pDb->
ed10: 7a 43 6f 6d 6d 69 74 20 3d 20 54 63 6c 5f 41 6c  zCommit = Tcl_Al
ed20: 6c 6f 63 28 20 6c 65 6e 20 2b 20 31 20 29 3b 0a  loc( len + 1 );.
ed30: 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70          memcpy(p
ed40: 44 62 2d 3e 7a 43 6f 6d 6d 69 74 2c 20 7a 43 6f  Db->zCommit, zCo
ed50: 6d 6d 69 74 2c 20 6c 65 6e 2b 31 29 3b 0a 20 20  mmit, len+1);.  
ed60: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
ed70: 20 20 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 20     pDb->zCommit 
ed80: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
ed90: 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 43 6f 6d     if( pDb->zCom
eda0: 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70  mit ){.        p
edb0: 44 62 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74  Db->interp = int
edc0: 65 72 70 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  erp;.        sql
edd0: 69 74 65 33 5f 63 6f 6d 6d 69 74 5f 68 6f 6f 6b  ite3_commit_hook
ede0: 28 70 44 62 2d 3e 64 62 2c 20 44 62 43 6f 6d 6d  (pDb->db, DbComm
edf0: 69 74 48 61 6e 64 6c 65 72 2c 20 70 44 62 29 3b  itHandler, pDb);
ee00: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
ee10: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f        sqlite3_co
ee20: 6d 6d 69 74 5f 68 6f 6f 6b 28 70 44 62 2d 3e 64  mmit_hook(pDb->d
ee30: 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  b, 0, 0);.      
ee40: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61  }.    }.    brea
ee50: 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20  k;.  }..  /*    
ee60: 24 64 62 20 63 6f 6d 70 6c 65 74 65 20 53 51 4c  $db complete SQL
ee70: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72  .  **.  ** Retur
ee80: 6e 20 54 52 55 45 20 69 66 20 53 51 4c 20 69 73  n TRUE if SQL is
ee90: 20 61 20 63 6f 6d 70 6c 65 74 65 20 53 51 4c 20   a complete SQL 
eea0: 73 74 61 74 65 6d 65 6e 74 2e 20 20 52 65 74 75  statement.  Retu
eeb0: 72 6e 20 46 41 4c 53 45 20 69 66 0a 20 20 2a 2a  rn FALSE if.  **
eec0: 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 69 6e 65   additional line
eed0: 73 20 6f 66 20 69 6e 70 75 74 20 61 72 65 20 6e  s of input are n
eee0: 65 65 64 65 64 2e 20 20 54 68 69 73 20 69 73 20  eeded.  This is 
eef0: 73 69 6d 69 6c 61 72 20 74 6f 20 74 68 65 0a 20  similar to the. 
ef00: 20 2a 2a 20 62 75 69 6c 74 2d 69 6e 20 22 69 6e   ** built-in "in
ef10: 66 6f 20 63 6f 6d 70 6c 65 74 65 22 20 63 6f 6d  fo complete" com
ef20: 6d 61 6e 64 20 6f 66 20 54 63 6c 2e 0a 20 20 2a  mand of Tcl..  *
ef30: 2f 0a 20 20 63 61 73 65 20 44 42 5f 43 4f 4d 50  /.  case DB_COMP
ef40: 4c 45 54 45 3a 20 7b 0a 23 69 66 6e 64 65 66 20  LETE: {.#ifndef 
ef50: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50  SQLITE_OMIT_COMP
ef60: 4c 45 54 45 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  LETE.    Tcl_Obj
ef70: 20 2a 70 52 65 73 75 6c 74 3b 0a 20 20 20 20 69   *pResult;.    i
ef80: 6e 74 20 69 73 43 6f 6d 70 6c 65 74 65 3b 0a 20  nt isComplete;. 
ef90: 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29     if( objc!=3 )
efa0: 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e  {.      Tcl_Wron
efb0: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
efc0: 20 32 2c 20 6f 62 6a 76 2c 20 22 53 51 4c 22 29   2, objv, "SQL")
efd0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
efe0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
eff0: 20 20 20 20 69 73 43 6f 6d 70 6c 65 74 65 20 3d      isComplete =
f000: 20 73 71 6c 69 74 65 33 5f 63 6f 6d 70 6c 65 74   sqlite3_complet
f010: 65 28 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  e( Tcl_GetString
f020: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c  FromObj(objv[2],
f030: 20 30 29 20 29 3b 0a 20 20 20 20 70 52 65 73 75   0) );.    pResu
f040: 6c 74 20 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52  lt = Tcl_GetObjR
f050: 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20  esult(interp);. 
f060: 20 20 20 54 63 6c 5f 53 65 74 42 6f 6f 6c 65 61     Tcl_SetBoolea
f070: 6e 4f 62 6a 28 70 52 65 73 75 6c 74 2c 20 69 73  nObj(pResult, is
f080: 43 6f 6d 70 6c 65 74 65 29 3b 0a 23 65 6e 64 69  Complete);.#endi
f090: 66 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  f.    break;.  }
f0a0: 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 63 6f  ..  /*    $db co
f0b0: 70 79 20 63 6f 6e 66 6c 69 63 74 2d 61 6c 67 6f  py conflict-algo
f0c0: 72 69 74 68 6d 20 74 61 62 6c 65 20 66 69 6c 65  rithm table file
f0d0: 6e 61 6d 65 20 3f 53 45 50 41 52 41 54 4f 52 3f  name ?SEPARATOR?
f0e0: 20 3f 4e 55 4c 4c 49 4e 44 49 43 41 54 4f 52 3f   ?NULLINDICATOR?
f0f0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 6f 70 79 20  .  **.  ** Copy 
f100: 64 61 74 61 20 69 6e 74 6f 20 74 61 62 6c 65 20  data into table 
f110: 66 72 6f 6d 20 66 69 6c 65 6e 61 6d 65 2c 20 6f  from filename, o
f120: 70 74 69 6f 6e 61 6c 6c 79 20 75 73 69 6e 67 20  ptionally using 
f130: 53 45 50 41 52 41 54 4f 52 0a 20 20 2a 2a 20 61  SEPARATOR.  ** a
f140: 73 20 63 6f 6c 75 6d 6e 20 73 65 70 61 72 61 74  s column separat
f150: 6f 72 73 2e 20 20 49 66 20 61 20 63 6f 6c 75 6d  ors.  If a colum
f160: 6e 20 63 6f 6e 74 61 69 6e 73 20 61 20 6e 75 6c  n contains a nul
f170: 6c 20 73 74 72 69 6e 67 2c 20 6f 72 20 74 68 65  l string, or the
f180: 0a 20 20 2a 2a 20 76 61 6c 75 65 20 6f 66 20 4e  .  ** value of N
f190: 55 4c 4c 49 4e 44 49 43 41 54 4f 52 2c 20 61 20  ULLINDICATOR, a 
f1a0: 4e 55 4c 4c 20 69 73 20 69 6e 73 65 72 74 65 64  NULL is inserted
f1b0: 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 2e   for the column.
f1c0: 0a 20 20 2a 2a 20 63 6f 6e 66 6c 69 63 74 2d 61  .  ** conflict-a
f1d0: 6c 67 6f 72 69 74 68 6d 20 69 73 20 6f 6e 65 20  lgorithm is one 
f1e0: 6f 66 20 74 68 65 20 73 71 6c 69 74 65 20 63 6f  of the sqlite co
f1f0: 6e 66 6c 69 63 74 20 61 6c 67 6f 72 69 74 68 6d  nflict algorithm
f200: 73 3a 0a 20 20 2a 2a 20 20 20 20 72 6f 6c 6c 62  s:.  **    rollb
f210: 61 63 6b 2c 20 61 62 6f 72 74 2c 20 66 61 69 6c  ack, abort, fail
f220: 2c 20 69 67 6e 6f 72 65 2c 20 72 65 70 6c 61 63  , ignore, replac
f230: 65 0a 20 20 2a 2a 20 4f 6e 20 73 75 63 63 65 73  e.  ** On succes
f240: 73 2c 20 72 65 74 75 72 6e 20 74 68 65 20 6e 75  s, return the nu
f250: 6d 62 65 72 20 6f 66 20 6c 69 6e 65 73 20 70 72  mber of lines pr
f260: 6f 63 65 73 73 65 64 2c 20 6e 6f 74 20 6e 65 63  ocessed, not nec
f270: 65 73 73 61 72 69 6c 79 20 73 61 6d 65 0a 20 20  essarily same.  
f280: 2a 2a 20 61 73 20 27 64 62 20 63 68 61 6e 67 65  ** as 'db change
f290: 73 27 20 64 75 65 20 74 6f 20 63 6f 6e 66 6c 69  s' due to confli
f2a0: 63 74 2d 61 6c 67 6f 72 69 74 68 6d 20 73 65 6c  ct-algorithm sel
f2b0: 65 63 74 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  ected..  **.  **
f2c0: 20 54 68 69 73 20 63 6f 64 65 20 69 73 20 62 61   This code is ba
f2d0: 73 69 63 61 6c 6c 79 20 61 6e 20 69 6d 70 6c 65  sically an imple
f2e0: 6d 65 6e 74 61 74 69 6f 6e 2f 65 6e 68 61 6e 63  mentation/enhanc
f2f0: 65 6d 65 6e 74 20 6f 66 0a 20 20 2a 2a 20 74 68  ement of.  ** th
f300: 65 20 73 71 6c 69 74 65 33 20 73 68 65 6c 6c 2e  e sqlite3 shell.
f310: 63 20 22 2e 69 6d 70 6f 72 74 22 20 63 6f 6d 6d  c ".import" comm
f320: 61 6e 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  and..  **.  ** T
f330: 68 69 73 20 63 6f 6d 6d 61 6e 64 20 75 73 61 67  his command usag
f340: 65 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20  e is equivalent 
f350: 74 6f 20 74 68 65 20 73 71 6c 69 74 65 32 2e 78  to the sqlite2.x
f360: 20 43 4f 50 59 20 73 74 61 74 65 6d 65 6e 74 2c   COPY statement,
f370: 0a 20 20 2a 2a 20 77 68 69 63 68 20 69 6d 70 6f  .  ** which impo
f380: 72 74 73 20 66 69 6c 65 20 64 61 74 61 20 69 6e  rts file data in
f390: 74 6f 20 61 20 74 61 62 6c 65 20 75 73 69 6e 67  to a table using
f3a0: 20 74 68 65 20 50 6f 73 74 67 72 65 53 51 4c 20   the PostgreSQL 
f3b0: 43 4f 50 59 20 66 69 6c 65 20 66 6f 72 6d 61 74  COPY file format
f3c0: 3a 0a 20 20 2a 2a 20 20 20 24 64 62 20 63 6f 70  :.  **   $db cop
f3d0: 79 20 24 63 6f 6e 66 6c 69 74 5f 61 6c 67 6f 20  y $conflit_algo 
f3e0: 24 74 61 62 6c 65 5f 6e 61 6d 65 20 24 66 69 6c  $table_name $fil
f3f0: 65 6e 61 6d 65 20 5c 74 20 5c 5c 4e 0a 20 20 2a  ename \t \\N.  *
f400: 2f 0a 20 20 63 61 73 65 20 44 42 5f 43 4f 50 59  /.  case DB_COPY
f410: 3a 20 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 54  : {.    char *zT
f420: 61 62 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20  able;           
f430: 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 64 61      /* Insert da
f440: 74 61 20 69 6e 74 6f 20 74 68 69 73 20 74 61 62  ta into this tab
f450: 6c 65 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a  le */.    char *
f460: 7a 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20  zFile;          
f470: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c        /* The fil
f480: 65 20 66 72 6f 6d 20 77 68 69 63 68 20 74 6f 20  e from which to 
f490: 65 78 74 72 61 63 74 20 64 61 74 61 20 2a 2f 0a  extract data */.
f4a0: 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6e 66 6c      char *zConfl
f4b0: 69 63 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ict;            
f4c0: 2f 2a 20 54 68 65 20 63 6f 6e 66 6c 69 63 74 20  /* The conflict 
f4d0: 61 6c 67 6f 72 69 74 68 6d 20 74 6f 20 75 73 65  algorithm to use
f4e0: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   */.    sqlite3_
f4f0: 73 74 6d 74 20 2a 70 53 74 6d 74 3b 20 20 20 20  stmt *pStmt;    
f500: 20 20 20 20 2f 2a 20 41 20 73 74 61 74 65 6d 65      /* A stateme
f510: 6e 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 43  nt */.    int nC
f520: 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ol;             
f530: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
f540: 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  of columns in th
f550: 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 69  e table */.    i
f560: 6e 74 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20  nt nByte;       
f570: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
f580: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
f590: 20 61 6e 20 53 51 4c 20 73 74 72 69 6e 67 20 2a   an SQL string *
f5a0: 2f 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 20  /.    int i, j; 
f5b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f5c0: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
f5d0: 72 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53  rs */.    int nS
f5e0: 65 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ep;             
f5f0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
f600: 6f 66 20 62 79 74 65 73 20 69 6e 20 7a 53 65 70  of bytes in zSep
f610: 5b 5d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 4e  [] */.    int nN
f620: 75 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  ull;            
f630: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
f640: 6f 66 20 62 79 74 65 73 20 69 6e 20 7a 4e 75 6c  of bytes in zNul
f650: 6c 5b 5d 20 2a 2f 0a 20 20 20 20 63 68 61 72 20  l[] */.    char 
f660: 2a 7a 53 71 6c 3b 20 20 20 20 20 20 20 20 20 20  *zSql;          
f670: 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 53 51 4c         /* An SQL
f680: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
f690: 20 20 63 68 61 72 20 2a 7a 4c 69 6e 65 3b 20 20    char *zLine;  
f6a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f6b0: 20 41 20 73 69 6e 67 6c 65 20 6c 69 6e 65 20 6f   A single line o
f6c0: 66 20 69 6e 70 75 74 20 66 72 6f 6d 20 74 68 65  f input from the
f6d0: 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 63 68 61   file */.    cha
f6e0: 72 20 2a 2a 61 7a 43 6f 6c 3b 20 20 20 20 20 20  r **azCol;      
f6f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 4c 69 6e           /* zLin
f700: 65 5b 5d 20 62 72 6f 6b 65 6e 20 75 70 20 69 6e  e[] broken up in
f710: 74 6f 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20  to columns */.  
f720: 20 20 63 68 61 72 20 2a 7a 43 6f 6d 6d 69 74 3b    char *zCommit;
f730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f740: 20 48 6f 77 20 74 6f 20 63 6f 6d 6d 69 74 20 63   How to commit c
f750: 68 61 6e 67 65 73 20 2a 2f 0a 20 20 20 20 46 49  hanges */.    FI
f760: 4c 45 20 2a 69 6e 3b 20 20 20 20 20 20 20 20 20  LE *in;         
f770: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
f780: 20 69 6e 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20   input file */. 
f790: 20 20 20 69 6e 74 20 6c 69 6e 65 6e 6f 20 3d 20     int lineno = 
f7a0: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
f7b0: 2a 20 4c 69 6e 65 20 6e 75 6d 62 65 72 20 6f 66  * Line number of
f7c0: 20 69 6e 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20   input file */. 
f7d0: 20 20 20 63 68 61 72 20 7a 4c 69 6e 65 4e 75 6d     char zLineNum
f7e0: 5b 38 30 5d 3b 20 20 20 20 20 20 20 20 20 20 2f  [80];          /
f7f0: 2a 20 4c 69 6e 65 20 6e 75 6d 62 65 72 20 70 72  * Line number pr
f800: 69 6e 74 20 62 75 66 66 65 72 20 2a 2f 0a 20 20  int buffer */.  
f810: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 73 75    Tcl_Obj *pResu
f820: 6c 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  lt;           /*
f830: 20 69 6e 74 65 72 70 20 72 65 73 75 6c 74 20 2a   interp result *
f840: 2f 0a 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 65  /..    char *zSe
f850: 70 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4e 75  p;.    char *zNu
f860: 6c 6c 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63  ll;.    if( objc
f870: 3c 35 20 7c 7c 20 6f 62 6a 63 3e 37 20 29 7b 0a  <5 || objc>7 ){.
f880: 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
f890: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
f8a0: 2c 20 6f 62 6a 76 2c 20 0a 20 20 20 20 20 20 20  , objv, .       
f8b0: 20 20 22 43 4f 4e 46 4c 49 43 54 2d 41 4c 47 4f    "CONFLICT-ALGO
f8c0: 52 49 54 48 4d 20 54 41 42 4c 45 20 46 49 4c 45  RITHM TABLE FILE
f8d0: 4e 41 4d 45 20 3f 53 45 50 41 52 41 54 4f 52 3f  NAME ?SEPARATOR?
f8e0: 20 3f 4e 55 4c 4c 49 4e 44 49 43 41 54 4f 52 3f   ?NULLINDICATOR?
f8f0: 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
f900: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
f910: 7d 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 3d  }.    if( objc>=
f920: 36 20 29 7b 0a 20 20 20 20 20 20 7a 53 65 70 20  6 ){.      zSep 
f930: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  = Tcl_GetStringF
f940: 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 35 5d 2c 20  romObj(objv[5], 
f950: 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  0);.    }else{. 
f960: 20 20 20 20 20 7a 53 65 70 20 3d 20 22 5c 74 22       zSep = "\t"
f970: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
f980: 6f 62 6a 63 3e 3d 37 20 29 7b 0a 20 20 20 20 20  objc>=7 ){.     
f990: 20 7a 4e 75 6c 6c 20 3d 20 54 63 6c 5f 47 65 74   zNull = Tcl_Get
f9a0: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
f9b0: 6a 76 5b 36 5d 2c 20 30 29 3b 0a 20 20 20 20 7d  jv[6], 0);.    }
f9c0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 4e 75 6c  else{.      zNul
f9d0: 6c 20 3d 20 22 22 3b 0a 20 20 20 20 7d 0a 20 20  l = "";.    }.  
f9e0: 20 20 7a 43 6f 6e 66 6c 69 63 74 20 3d 20 54 63    zConflict = Tc
f9f0: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
fa00: 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30 29 3b 0a  bj(objv[2], 0);.
fa10: 20 20 20 20 7a 54 61 62 6c 65 20 3d 20 54 63 6c      zTable = Tcl
fa20: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
fa30: 6a 28 6f 62 6a 76 5b 33 5d 2c 20 30 29 3b 0a 20  j(objv[3], 0);. 
fa40: 20 20 20 7a 46 69 6c 65 20 3d 20 54 63 6c 5f 47     zFile = Tcl_G
fa50: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
fa60: 6f 62 6a 76 5b 34 5d 2c 20 30 29 3b 0a 20 20 20  objv[4], 0);.   
fa70: 20 6e 53 65 70 20 3d 20 73 74 72 6c 65 6e 33 30   nSep = strlen30
fa80: 28 7a 53 65 70 29 3b 0a 20 20 20 20 6e 4e 75 6c  (zSep);.    nNul
fa90: 6c 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 4e 75  l = strlen30(zNu
faa0: 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 6e 53 65  ll);.    if( nSe
fab0: 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 54 63  p==0 ){.      Tc
fac0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
fad0: 6e 74 65 72 70 2c 22 45 72 72 6f 72 3a 20 6e 6f  nterp,"Error: no
fae0: 6e 2d 6e 75 6c 6c 20 73 65 70 61 72 61 74 6f 72  n-null separator
faf0: 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 63 6f   required for co
fb00: 70 79 22 2c 30 29 3b 0a 20 20 20 20 20 20 72 65  py",0);.      re
fb10: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
fb20: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 73 74 72      }.    if(str
fb30: 63 6d 70 28 7a 43 6f 6e 66 6c 69 63 74 2c 20 22  cmp(zConflict, "
fb40: 72 6f 6c 6c 62 61 63 6b 22 29 20 21 3d 20 30 20  rollback") != 0 
fb50: 26 26 0a 20 20 20 20 20 20 20 73 74 72 63 6d 70  &&.       strcmp
fb60: 28 7a 43 6f 6e 66 6c 69 63 74 2c 20 22 61 62 6f  (zConflict, "abo
fb70: 72 74 22 20 20 20 29 20 21 3d 20 30 20 26 26 0a  rt"   ) != 0 &&.
fb80: 20 20 20 20 20 20 20 73 74 72 63 6d 70 28 7a 43         strcmp(zC
fb90: 6f 6e 66 6c 69 63 74 2c 20 22 66 61 69 6c 22 20  onflict, "fail" 
fba0: 20 20 20 29 20 21 3d 20 30 20 26 26 0a 20 20 20     ) != 0 &&.   
fbb0: 20 20 20 20 73 74 72 63 6d 70 28 7a 43 6f 6e 66      strcmp(zConf
fbc0: 6c 69 63 74 2c 20 22 69 67 6e 6f 72 65 22 20 20  lict, "ignore"  
fbd0: 29 20 21 3d 20 30 20 26 26 0a 20 20 20 20 20 20  ) != 0 &&.      
fbe0: 20 73 74 72 63 6d 70 28 7a 43 6f 6e 66 6c 69 63   strcmp(zConflic
fbf0: 74 2c 20 22 72 65 70 6c 61 63 65 22 20 29 20 21  t, "replace" ) !
fc00: 3d 20 30 20 29 20 7b 0a 20 20 20 20 20 20 54 63  = 0 ) {.      Tc
fc10: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
fc20: 6e 74 65 72 70 2c 20 22 45 72 72 6f 72 3a 20 5c  nterp, "Error: \
fc30: 22 22 2c 20 7a 43 6f 6e 66 6c 69 63 74 2c 20 0a  "", zConflict, .
fc40: 20 20 20 20 20 20 20 20 20 20 20 20 22 5c 22 2c              "\",
fc50: 20 63 6f 6e 66 6c 69 63 74 2d 61 6c 67 6f 72 69   conflict-algori
fc60: 74 68 6d 20 6d 75 73 74 20 62 65 20 6f 6e 65 20  thm must be one 
fc70: 6f 66 3a 20 72 6f 6c 6c 62 61 63 6b 2c 20 22 0a  of: rollback, ".
fc80: 20 20 20 20 20 20 20 20 20 20 20 20 22 61 62 6f              "abo
fc90: 72 74 2c 20 66 61 69 6c 2c 20 69 67 6e 6f 72 65  rt, fail, ignore
fca0: 2c 20 6f 72 20 72 65 70 6c 61 63 65 22 2c 20 30  , or replace", 0
fcb0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
fcc0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
fcd0: 0a 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69  .    zSql = sqli
fce0: 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c  te3_mprintf("SEL
fcf0: 45 43 54 20 2a 20 46 52 4f 4d 20 27 25 71 27 22  ECT * FROM '%q'"
fd00: 2c 20 7a 54 61 62 6c 65 29 3b 0a 20 20 20 20 69  , zTable);.    i
fd10: 66 28 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20  f( zSql==0 ){.  
fd20: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
fd30: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 45 72  sult(interp, "Er
fd40: 72 6f 72 3a 20 6e 6f 20 73 75 63 68 20 74 61 62  ror: no such tab
fd50: 6c 65 3a 20 22 2c 20 7a 54 61 62 6c 65 2c 20 30  le: ", zTable, 0
fd60: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
fd70: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
fd80: 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 73 74 72  .    nByte = str
fd90: 6c 65 6e 33 30 28 7a 53 71 6c 29 3b 0a 20 20 20  len30(zSql);.   
fda0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72   rc = sqlite3_pr
fdb0: 65 70 61 72 65 28 70 44 62 2d 3e 64 62 2c 20 7a  epare(pDb->db, z
fdc0: 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c  Sql, -1, &pStmt,
fdd0: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
fde0: 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20  _free(zSql);.   
fdf0: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
fe00: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
fe10: 74 28 69 6e 74 65 72 70 2c 20 22 45 72 72 6f 72  t(interp, "Error
fe20: 3a 20 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  : ", sqlite3_err
fe30: 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c 20 30 29  msg(pDb->db), 0)
fe40: 3b 0a 20 20 20 20 20 20 6e 43 6f 6c 20 3d 20 30  ;.      nCol = 0
fe50: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
fe60: 20 20 20 6e 43 6f 6c 20 3d 20 73 71 6c 69 74 65     nCol = sqlite
fe70: 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70  3_column_count(p
fe80: 53 74 6d 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Stmt);.    }.   
fe90: 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
fea0: 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 69 66  e(pStmt);.    if
feb0: 28 20 6e 43 6f 6c 3d 3d 30 20 29 20 7b 0a 20 20  ( nCol==0 ) {.  
fec0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
fed0: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
fee0: 7a 53 71 6c 20 3d 20 6d 61 6c 6c 6f 63 28 20 6e  zSql = malloc( n
fef0: 42 79 74 65 20 2b 20 35 30 20 2b 20 6e 43 6f 6c  Byte + 50 + nCol
ff00: 2a 32 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 53  *2 );.    if( zS
ff10: 71 6c 3d 3d 30 20 29 20 7b 0a 20 20 20 20 20 20  ql==0 ) {.      
ff20: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
ff30: 28 69 6e 74 65 72 70 2c 20 22 45 72 72 6f 72 3a  (interp, "Error:
ff40: 20 63 61 6e 27 74 20 6d 61 6c 6c 6f 63 28 29 22   can't malloc()"
ff50: 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75  , 0);.      retu
ff60: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
ff70: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
ff80: 73 6e 70 72 69 6e 74 66 28 6e 42 79 74 65 2b 35  snprintf(nByte+5
ff90: 30 2c 20 7a 53 71 6c 2c 20 22 49 4e 53 45 52 54  0, zSql, "INSERT
ffa0: 20 4f 52 20 25 71 20 49 4e 54 4f 20 27 25 71 27   OR %q INTO '%q'
ffb0: 20 56 41 4c 55 45 53 28 3f 22 2c 0a 20 20 20 20   VALUES(?",.    
ffc0: 20 20 20 20 20 7a 43 6f 6e 66 6c 69 63 74 2c 20       zConflict, 
ffd0: 7a 54 61 62 6c 65 29 3b 0a 20 20 20 20 6a 20 3d  zTable);.    j =
ffe0: 20 73 74 72 6c 65 6e 33 30 28 7a 53 71 6c 29 3b   strlen30(zSql);
fff0: 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c  .    for(i=1; i<
10000 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
10010 20 20 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d 20 27 2c    zSql[j++] = ',
10020 27 3b 0a 20 20 20 20 20 20 7a 53 71 6c 5b 6a 2b  ';.      zSql[j+
10030 2b 5d 20 3d 20 27 3f 27 3b 0a 20 20 20 20 7d 0a  +] = '?';.    }.
10040 20 20 20 20 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d 20      zSql[j++] = 
10050 27 29 27 3b 0a 20 20 20 20 7a 53 71 6c 5b 6a 5d  ')';.    zSql[j]
10060 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 73   = 0;.    rc = s
10070 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28 70  qlite3_prepare(p
10080 44 62 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31  Db->db, zSql, -1
10090 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20  , &pStmt, 0);.  
100a0 20 20 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20    free(zSql);.  
100b0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
100c0 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
100d0 6c 74 28 69 6e 74 65 72 70 2c 20 22 45 72 72 6f  lt(interp, "Erro
100e0 72 3a 20 22 2c 20 73 71 6c 69 74 65 33 5f 65 72  r: ", sqlite3_er
100f0 72 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c 20 30  rmsg(pDb->db), 0
10100 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
10110 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
10120 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
10130 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
10140 20 20 20 20 69 6e 20 3d 20 66 6f 70 65 6e 28 7a      in = fopen(z
10150 46 69 6c 65 2c 20 22 72 62 22 29 3b 0a 20 20 20  File, "rb");.   
10160 20 69 66 28 20 69 6e 3d 3d 30 20 29 7b 0a 20 20   if( in==0 ){.  
10170 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
10180 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 45 72  sult(interp, "Er
10190 72 6f 72 3a 20 63 61 6e 6e 6f 74 20 6f 70 65 6e  ror: cannot open
101a0 20 66 69 6c 65 3a 20 22 2c 20 7a 46 69 6c 65 2c   file: ", zFile,
101b0 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 71   NULL);.      sq
101c0 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
101d0 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 72 65 74  Stmt);.      ret
101e0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
101f0 20 20 20 7d 0a 20 20 20 20 61 7a 43 6f 6c 20 3d     }.    azCol =
10200 20 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28   malloc( sizeof(
10210 61 7a 43 6f 6c 5b 30 5d 29 2a 28 6e 43 6f 6c 2b  azCol[0])*(nCol+
10220 31 29 20 29 3b 0a 20 20 20 20 69 66 28 20 61 7a  1) );.    if( az
10230 43 6f 6c 3d 3d 30 20 29 20 7b 0a 20 20 20 20 20  Col==0 ) {.     
10240 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
10250 74 28 69 6e 74 65 72 70 2c 20 22 45 72 72 6f 72  t(interp, "Error
10260 3a 20 63 61 6e 27 74 20 6d 61 6c 6c 6f 63 28 29  : can't malloc()
10270 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 66 63 6c  ", 0);.      fcl
10280 6f 73 65 28 69 6e 29 3b 0a 20 20 20 20 20 20 72  ose(in);.      r
10290 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
102a0 0a 20 20 20 20 7d 0a 20 20 20 20 28 76 6f 69 64  .    }.    (void
102b0 29 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 44  )sqlite3_exec(pD
102c0 62 2d 3e 64 62 2c 20 22 42 45 47 49 4e 22 2c 20  b->db, "BEGIN", 
102d0 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7a 43  0, 0, 0);.    zC
102e0 6f 6d 6d 69 74 20 3d 20 22 43 4f 4d 4d 49 54 22  ommit = "COMMIT"
102f0 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 7a 4c  ;.    while( (zL
10300 69 6e 65 20 3d 20 6c 6f 63 61 6c 5f 67 65 74 6c  ine = local_getl
10310 69 6e 65 28 30 2c 20 69 6e 29 29 21 3d 30 20 29  ine(0, in))!=0 )
10320 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 3b  {.      char *z;
10330 0a 20 20 20 20 20 20 69 20 3d 20 30 3b 0a 20 20  .      i = 0;.  
10340 20 20 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20      lineno++;.  
10350 20 20 20 20 61 7a 43 6f 6c 5b 30 5d 20 3d 20 7a      azCol[0] = z
10360 4c 69 6e 65 3b 0a 20 20 20 20 20 20 66 6f 72 28  Line;.      for(
10370 69 3d 30 2c 20 7a 3d 7a 4c 69 6e 65 3b 20 2a 7a  i=0, z=zLine; *z
10380 3b 20 7a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; z++){.        
10390 69 66 28 20 2a 7a 3d 3d 7a 53 65 70 5b 30 5d 20  if( *z==zSep[0] 
103a0 26 26 20 73 74 72 6e 63 6d 70 28 7a 2c 20 7a 53  && strncmp(z, zS
103b0 65 70 2c 20 6e 53 65 70 29 3d 3d 30 20 29 7b 0a  ep, nSep)==0 ){.
103c0 20 20 20 20 20 20 20 20 20 20 2a 7a 20 3d 20 30            *z = 0
103d0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 2b 2b 3b  ;.          i++;
103e0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
103f0 3c 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20  <nCol ){.       
10400 20 20 20 20 20 61 7a 43 6f 6c 5b 69 5d 20 3d 20       azCol[i] = 
10410 26 7a 5b 6e 53 65 70 5d 3b 0a 20 20 20 20 20 20  &z[nSep];.      
10420 20 20 20 20 20 20 7a 20 2b 3d 20 6e 53 65 70 2d        z += nSep-
10430 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  1;.          }. 
10440 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
10450 0a 20 20 20 20 20 20 69 66 28 20 69 2b 31 21 3d  .      if( i+1!=
10460 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  nCol ){.        
10470 63 68 61 72 20 2a 7a 45 72 72 3b 0a 20 20 20 20  char *zErr;.    
10480 20 20 20 20 69 6e 74 20 6e 45 72 72 20 3d 20 73      int nErr = s
10490 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 29 20 2b  trlen30(zFile) +
104a0 20 32 30 30 3b 0a 20 20 20 20 20 20 20 20 7a 45   200;.        zE
104b0 72 72 20 3d 20 6d 61 6c 6c 6f 63 28 6e 45 72 72  rr = malloc(nErr
104c0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a  );.        if( z
104d0 45 72 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Err ){.         
104e0 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
104f0 66 28 6e 45 72 72 2c 20 7a 45 72 72 2c 0a 20 20  f(nErr, zErr,.  
10500 20 20 20 20 20 20 20 20 20 20 20 22 45 72 72 6f             "Erro
10510 72 3a 20 25 73 20 6c 69 6e 65 20 25 64 3a 20 65  r: %s line %d: e
10520 78 70 65 63 74 65 64 20 25 64 20 63 6f 6c 75 6d  xpected %d colum
10530 6e 73 20 6f 66 20 64 61 74 61 20 62 75 74 20 66  ns of data but f
10540 6f 75 6e 64 20 25 64 22 2c 0a 20 20 20 20 20 20  ound %d",.      
10550 20 20 20 20 20 20 20 7a 46 69 6c 65 2c 20 6c 69         zFile, li
10560 6e 65 6e 6f 2c 20 6e 43 6f 6c 2c 20 69 2b 31 29  neno, nCol, i+1)
10570 3b 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f  ;.          Tcl_
10580 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
10590 65 72 70 2c 20 7a 45 72 72 2c 20 30 29 3b 0a 20  erp, zErr, 0);. 
105a0 20 20 20 20 20 20 20 20 20 66 72 65 65 28 7a 45           free(zE
105b0 72 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  rr);.        }. 
105c0 20 20 20 20 20 20 20 7a 43 6f 6d 6d 69 74 20 3d         zCommit =
105d0 20 22 52 4f 4c 4c 42 41 43 4b 22 3b 0a 20 20 20   "ROLLBACK";.   
105e0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
105f0 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d    }.      for(i=
10600 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  0; i<nCol; i++){
10610 0a 20 20 20 20 20 20 20 20 2f 2a 20 63 68 65 63  .        /* chec
10620 6b 20 66 6f 72 20 6e 75 6c 6c 20 64 61 74 61 2c  k for null data,
10630 20 69 66 20 73 6f 2c 20 62 69 6e 64 20 61 73 20   if so, bind as 
10640 6e 75 6c 6c 20 2a 2f 0a 20 20 20 20 20 20 20 20  null */.        
10650 69 66 28 20 28 6e 4e 75 6c 6c 3e 30 20 26 26 20  if( (nNull>0 && 
10660 73 74 72 63 6d 70 28 61 7a 43 6f 6c 5b 69 5d 2c  strcmp(azCol[i],
10670 20 7a 4e 75 6c 6c 29 3d 3d 30 29 0a 20 20 20 20   zNull)==0).    
10680 20 20 20 20 20 20 7c 7c 20 73 74 72 6c 65 6e 33        || strlen3
10690 30 28 61 7a 43 6f 6c 5b 69 5d 29 3d 3d 30 20 0a  0(azCol[i])==0 .
106a0 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
106b0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e       sqlite3_bin
106c0 64 5f 6e 75 6c 6c 28 70 53 74 6d 74 2c 20 69 2b  d_null(pStmt, i+
106d0 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  1);.        }els
106e0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  e{.          sql
106f0 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70  ite3_bind_text(p
10700 53 74 6d 74 2c 20 69 2b 31 2c 20 61 7a 43 6f 6c  Stmt, i+1, azCol
10710 5b 69 5d 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f  [i], -1, SQLITE_
10720 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 20  STATIC);.       
10730 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
10740 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53   sqlite3_step(pS
10750 74 6d 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  tmt);.      rc =
10760 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70   sqlite3_reset(p
10770 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 66 72 65  Stmt);.      fre
10780 65 28 7a 4c 69 6e 65 29 3b 0a 20 20 20 20 20 20  e(zLine);.      
10790 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
107a0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c  K ){.        Tcl
107b0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
107c0 74 65 72 70 2c 22 45 72 72 6f 72 3a 20 22 2c 20  terp,"Error: ", 
107d0 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70  sqlite3_errmsg(p
107e0 44 62 2d 3e 64 62 29 2c 20 30 29 3b 0a 20 20 20  Db->db), 0);.   
107f0 20 20 20 20 20 7a 43 6f 6d 6d 69 74 20 3d 20 22       zCommit = "
10800 52 4f 4c 4c 42 41 43 4b 22 3b 0a 20 20 20 20 20  ROLLBACK";.     
10810 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
10820 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65  }.    }.    free
10830 28 61 7a 43 6f 6c 29 3b 0a 20 20 20 20 66 63 6c  (azCol);.    fcl
10840 6f 73 65 28 69 6e 29 3b 0a 20 20 20 20 73 71 6c  ose(in);.    sql
10850 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53  ite3_finalize(pS
10860 74 6d 74 29 3b 0a 20 20 20 20 28 76 6f 69 64 29  tmt);.    (void)
10870 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 44 62  sqlite3_exec(pDb
10880 2d 3e 64 62 2c 20 7a 43 6f 6d 6d 69 74 2c 20 30  ->db, zCommit, 0
10890 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 20 20 69 66  , 0, 0);..    if
108a0 28 20 7a 43 6f 6d 6d 69 74 5b 30 5d 20 3d 3d 20  ( zCommit[0] == 
108b0 27 43 27 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  'C' ){.      /* 
108c0 73 75 63 63 65 73 73 2c 20 73 65 74 20 72 65 73  success, set res
108d0 75 6c 74 20 61 73 20 6e 75 6d 62 65 72 20 6f 66  ult as number of
108e0 20 6c 69 6e 65 73 20 70 72 6f 63 65 73 73 65 64   lines processed
108f0 20 2a 2f 0a 20 20 20 20 20 20 70 52 65 73 75 6c   */.      pResul
10900 74 20 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65  t = Tcl_GetObjRe
10910 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  sult(interp);.  
10920 20 20 20 20 54 63 6c 5f 53 65 74 49 6e 74 4f 62      Tcl_SetIntOb
10930 6a 28 70 52 65 73 75 6c 74 2c 20 6c 69 6e 65 6e  j(pResult, linen
10940 6f 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 54  o);.      rc = T
10950 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65  CL_OK;.    }else
10960 7b 0a 20 20 20 20 20 20 2f 2a 20 66 61 69 6c 75  {.      /* failu
10970 72 65 2c 20 61 70 70 65 6e 64 20 6c 69 6e 65 6e  re, append linen
10980 6f 20 77 68 65 72 65 20 66 61 69 6c 65 64 20 2a  o where failed *
10990 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  /.      sqlite3_
109a0 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
109b0 7a 4c 69 6e 65 4e 75 6d 29 2c 20 7a 4c 69 6e 65  zLineNum), zLine
109c0 4e 75 6d 2c 22 25 64 22 2c 6c 69 6e 65 6e 6f 29  Num,"%d",lineno)
109d0 3b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65  ;.      Tcl_Appe
109e0 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
109f0 22 2c 20 66 61 69 6c 65 64 20 77 68 69 6c 65 20  ", failed while 
10a00 70 72 6f 63 65 73 73 69 6e 67 20 6c 69 6e 65 3a  processing line:
10a10 20 22 2c 7a 4c 69 6e 65 4e 75 6d 2c 30 29 3b 0a   ",zLineNum,0);.
10a20 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45        rc = TCL_E
10a30 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
10a40 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
10a50 0a 20 20 2a 2a 20 20 20 20 24 64 62 20 65 6e 61  .  **    $db ena
10a60 62 6c 65 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69  ble_load_extensi
10a70 6f 6e 20 42 4f 4f 4c 45 41 4e 0a 20 20 2a 2a 0a  on BOOLEAN.  **.
10a80 20 20 2a 2a 20 54 75 72 6e 20 74 68 65 20 65 78    ** Turn the ex
10a90 74 65 6e 73 69 6f 6e 20 6c 6f 61 64 69 6e 67 20  tension loading 
10aa0 66 65 61 74 75 72 65 20 6f 6e 20 6f 72 20 6f 66  feature on or of
10ab0 66 2e 20 20 49 74 20 69 66 20 6f 66 66 20 62 79  f.  It if off by
10ac0 0a 20 20 2a 2a 20 64 65 66 61 75 6c 74 2e 0a 20  .  ** default.. 
10ad0 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 45 4e   */.  case DB_EN
10ae0 41 42 4c 45 5f 4c 4f 41 44 5f 45 58 54 45 4e 53  ABLE_LOAD_EXTENS
10af0 49 4f 4e 3a 20 7b 0a 23 69 66 6e 64 65 66 20 53  ION: {.#ifndef S
10b00 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f  QLITE_OMIT_LOAD_
10b10 45 58 54 45 4e 53 49 4f 4e 0a 20 20 20 20 69 6e  EXTENSION.    in
10b20 74 20 6f 6e 6f 66 66 3b 0a 20 20 20 20 69 66 28  t onoff;.    if(
10b30 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20   objc!=3 ){.    
10b40 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
10b50 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62  gs(interp, 2, ob
10b60 6a 76 2c 20 22 42 4f 4f 4c 45 41 4e 22 29 3b 0a  jv, "BOOLEAN");.
10b70 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
10b80 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
10b90 20 20 69 66 28 20 54 63 6c 5f 47 65 74 42 6f 6f    if( Tcl_GetBoo
10ba0 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  leanFromObj(inte
10bb0 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 6f 6e  rp, objv[2], &on
10bc0 6f 66 66 29 20 29 7b 0a 20 20 20 20 20 20 72 65  off) ){.      re
10bd0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
10be0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
10bf0 33 5f 65 6e 61 62 6c 65 5f 6c 6f 61 64 5f 65 78  3_enable_load_ex
10c00 74 65 6e 73 69 6f 6e 28 70 44 62 2d 3e 64 62 2c  tension(pDb->db,
10c10 20 6f 6e 6f 66 66 29 3b 0a 20 20 20 20 62 72 65   onoff);.    bre
10c20 61 6b 3b 0a 23 65 6c 73 65 0a 20 20 20 20 54 63  ak;.#else.    Tc
10c30 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
10c40 6e 74 65 72 70 2c 20 22 65 78 74 65 6e 73 69 6f  nterp, "extensio
10c50 6e 20 6c 6f 61 64 69 6e 67 20 69 73 20 74 75 72  n loading is tur
10c60 6e 65 64 20 6f 66 66 20 61 74 20 63 6f 6d 70 69  ned off at compi
10c70 6c 65 2d 74 69 6d 65 22 2c 0a 20 20 20 20 20 20  le-time",.      
10c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
10c90 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
10ca0 4c 5f 45 52 52 4f 52 3b 0a 23 65 6e 64 69 66 0a  L_ERROR;.#endif.
10cb0 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20    }..  /*.  **  
10cc0 20 20 24 64 62 20 65 72 72 6f 72 63 6f 64 65 0a    $db errorcode.
10cd0 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e    **.  ** Return
10ce0 20 74 68 65 20 6e 75 6d 65 72 69 63 20 65 72 72   the numeric err
10cf0 6f 72 20 63 6f 64 65 20 74 68 61 74 20 77 61 73  or code that was
10d00 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65   returned by the
10d10 20 6d 6f 73 74 20 72 65 63 65 6e 74 0a 20 20 2a   most recent.  *
10d20 2a 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  * call to sqlite
10d30 33 5f 65 78 65 63 28 29 2e 0a 20 20 2a 2f 0a 20  3_exec()..  */. 
10d40 20 63 61 73 65 20 44 42 5f 45 52 52 4f 52 43 4f   case DB_ERRORCO
10d50 44 45 3a 20 7b 0a 20 20 20 20 54 63 6c 5f 53 65  DE: {.    Tcl_Se
10d60 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
10d70 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  p, Tcl_NewIntObj
10d80 28 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65  (sqlite3_errcode
10d90 28 70 44 62 2d 3e 64 62 29 29 29 3b 0a 20 20 20  (pDb->db)));.   
10da0 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
10db0 2a 0a 20 20 2a 2a 20 20 20 20 24 64 62 20 65 78  *.  **    $db ex
10dc0 69 73 74 73 20 24 73 71 6c 0a 20 20 2a 2a 20 20  ists $sql.  **  
10dd0 20 20 24 64 62 20 6f 6e 65 63 6f 6c 75 6d 6e 20    $db onecolumn 
10de0 24 73 71 6c 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  $sql.  **.  ** T
10df0 68 65 20 6f 6e 65 63 6f 6c 75 6d 6e 20 6d 65 74  he onecolumn met
10e00 68 6f 64 20 69 73 20 74 68 65 20 65 71 75 69 76  hod is the equiv
10e10 61 6c 65 6e 74 20 6f 66 3a 0a 20 20 2a 2a 20 20  alent of:.  **  
10e20 20 20 20 6c 69 6e 64 65 78 20 5b 24 64 62 20 65     lindex [$db e
10e30 76 61 6c 20 24 73 71 6c 5d 20 30 0a 20 20 2a 2f  val $sql] 0.  */
10e40 0a 20 20 63 61 73 65 20 44 42 5f 45 58 49 53 54  .  case DB_EXIST
10e50 53 3a 20 0a 20 20 63 61 73 65 20 44 42 5f 4f 4e  S: .  case DB_ON
10e60 45 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 44  ECOLUMN: {.    D
10e70 62 45 76 61 6c 43 6f 6e 74 65 78 74 20 73 45 76  bEvalContext sEv
10e80 61 6c 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63  al;.    if( objc
10e90 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  !=3 ){.      Tcl
10ea0 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
10eb0 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22  terp, 2, objv, "
10ec0 53 51 4c 22 29 3b 0a 20 20 20 20 20 20 72 65 74  SQL");.      ret
10ed0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
10ee0 20 20 20 7d 0a 0a 20 20 20 20 64 62 45 76 61 6c     }..    dbEval
10ef0 49 6e 69 74 28 26 73 45 76 61 6c 2c 20 70 44 62  Init(&sEval, pDb
10f00 2c 20 6f 62 6a 76 5b 32 5d 2c 20 30 29 3b 0a 20  , objv[2], 0);. 
10f10 20 20 20 72 63 20 3d 20 64 62 45 76 61 6c 53 74     rc = dbEvalSt
10f20 65 70 28 26 73 45 76 61 6c 29 3b 0a 20 20 20 20  ep(&sEval);.    
10f30 69 66 28 20 63 68 6f 69 63 65 3d 3d 44 42 5f 4f  if( choice==DB_O
10f40 4e 45 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20  NECOLUMN ){.    
10f50 20 20 69 66 28 20 72 63 3d 3d 54 43 4c 5f 4f 4b    if( rc==TCL_OK
10f60 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f   ){.        Tcl_
10f70 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
10f80 65 72 70 2c 20 64 62 45 76 61 6c 43 6f 6c 75 6d  erp, dbEvalColum
10f90 6e 56 61 6c 75 65 28 26 73 45 76 61 6c 2c 20 30  nValue(&sEval, 0
10fa0 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
10fb0 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 54 43  }else if( rc==TC
10fc0 4c 5f 42 52 45 41 4b 20 7c 7c 20 72 63 3d 3d 54  L_BREAK || rc==T
10fd0 43 4c 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 54  CL_OK ){.      T
10fe0 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
10ff0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 42  interp, Tcl_NewB
11000 6f 6f 6c 65 61 6e 4f 62 6a 28 72 63 3d 3d 54 43  ooleanObj(rc==TC
11010 4c 5f 4f 4b 29 29 3b 0a 20 20 20 20 7d 0a 20 20  L_OK));.    }.  
11020 20 20 64 62 45 76 61 6c 46 69 6e 61 6c 69 7a 65    dbEvalFinalize
11030 28 26 73 45 76 61 6c 29 3b 0a 0a 20 20 20 20 69  (&sEval);..    i
11040 66 28 20 72 63 3d 3d 54 43 4c 5f 42 52 45 41 4b  f( rc==TCL_BREAK
11050 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 54   ){.      rc = T
11060 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  CL_OK;.    }.   
11070 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 20 0a   break;.  }.   .
11080 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 24 64 62    /*.  **    $db
11090 20 65 76 61 6c 20 24 73 71 6c 20 3f 61 72 72 61   eval $sql ?arra
110a0 79 3f 20 3f 7b 20 20 2e 2e 2e 63 6f 64 65 2e 2e  y? ?{  ...code..
110b0 2e 20 7d 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  . }?.  **.  ** T
110c0 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  he SQL statement
110d0 20 69 6e 20 24 73 71 6c 20 69 73 20 65 76 61 6c   in $sql is eval
110e0 75 61 74 65 64 2e 20 20 46 6f 72 20 65 61 63 68  uated.  For each
110f0 20 72 6f 77 2c 20 74 68 65 20 76 61 6c 75 65 73   row, the values
11100 20 61 72 65 0a 20 20 2a 2a 20 70 6c 61 63 65 64   are.  ** placed
11110 20 69 6e 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20   in elements of 
11120 74 68 65 20 61 72 72 61 79 20 6e 61 6d 65 64 20  the array named 
11130 22 61 72 72 61 79 22 20 61 6e 64 20 2e 2e 2e 63  "array" and ...c
11140 6f 64 65 2e 2e 2e 20 69 73 20 65 78 65 63 75 74  ode... is execut
11150 65 64 2e 0a 20 20 2a 2a 20 49 66 20 22 61 72 72  ed..  ** If "arr
11160 61 79 22 20 61 6e 64 20 22 63 6f 64 65 22 20 61  ay" and "code" a
11170 72 65 20 6f 6d 69 74 74 65 64 2c 20 74 68 65 6e  re omitted, then
11180 20 6e 6f 20 63 61 6c 6c 62 61 63 6b 20 69 73 20   no callback is 
11190 65 76 65 72 79 20 69 6e 76 6f 6b 65 64 2e 0a 20  every invoked.. 
111a0 20 2a 2a 20 49 66 20 22 61 72 72 61 79 22 20 69   ** If "array" i
111b0 73 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e  s an empty strin
111c0 67 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75  g, then the valu
111d0 65 73 20 61 72 65 20 70 6c 61 63 65 64 20 69 6e  es are placed in
111e0 20 76 61 72 69 61 62 6c 65 73 0a 20 20 2a 2a 20   variables.  ** 
111f0 74 68 61 74 20 68 61 76 65 20 74 68 65 20 73 61  that have the sa
11200 6d 65 20 6e 61 6d 65 20 61 73 20 74 68 65 20 66  me name as the f
11210 69 65 6c 64 73 20 65 78 74 72 61 63 74 65 64 20  ields extracted 
11220 62 79 20 74 68 65 20 71 75 65 72 79 2e 0a 20 20  by the query..  
11230 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 45 56 41  */.  case DB_EVA
11240 4c 3a 20 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a  L: {.    if( obj
11250 63 3c 33 20 7c 7c 20 6f 62 6a 63 3e 35 20 29 7b  c<3 || objc>5 ){
11260 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  .      Tcl_Wrong
11270 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
11280 32 2c 20 6f 62 6a 76 2c 20 22 53 51 4c 20 3f 41  2, objv, "SQL ?A
11290 52 52 41 59 2d 4e 41 4d 45 3f 20 3f 53 43 52 49  RRAY-NAME? ?SCRI
112a0 50 54 3f 22 29 3b 0a 20 20 20 20 20 20 72 65 74  PT?");.      ret
112b0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
112c0 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 6f 62     }..    if( ob
112d0 6a 63 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20 44  jc==3 ){.      D
112e0 62 45 76 61 6c 43 6f 6e 74 65 78 74 20 73 45 76  bEvalContext sEv
112f0 61 6c 3b 0a 20 20 20 20 20 20 54 63 6c 5f 4f 62  al;.      Tcl_Ob
11300 6a 20 2a 70 52 65 74 20 3d 20 54 63 6c 5f 4e 65  j *pRet = Tcl_Ne
11310 77 4f 62 6a 28 29 3b 0a 20 20 20 20 20 20 54 63  wObj();.      Tc
11320 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70  l_IncrRefCount(p
11330 52 65 74 29 3b 0a 20 20 20 20 20 20 64 62 45 76  Ret);.      dbEv
11340 61 6c 49 6e 69 74 28 26 73 45 76 61 6c 2c 20 70  alInit(&sEval, p
11350 44 62 2c 20 6f 62 6a 76 5b 32 5d 2c 20 30 29 3b  Db, objv[2], 0);
11360 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 54 43  .      while( TC
11370 4c 5f 4f 4b 3d 3d 28 72 63 20 3d 20 64 62 45 76  L_OK==(rc = dbEv
11380 61 6c 53 74 65 70 28 26 73 45 76 61 6c 29 29 20  alStep(&sEval)) 
11390 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  ){.        int i
113a0 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43  ;.        int nC
113b0 6f 6c 3b 0a 20 20 20 20 20 20 20 20 64 62 45 76  ol;.        dbEv
113c0 61 6c 52 6f 77 49 6e 66 6f 28 26 73 45 76 61 6c  alRowInfo(&sEval
113d0 2c 20 26 6e 43 6f 6c 2c 20 30 29 3b 0a 20 20 20  , &nCol, 0);.   
113e0 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
113f0 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
11400 20 20 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62        Tcl_ListOb
11410 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
11420 6e 74 65 72 70 2c 20 70 52 65 74 2c 20 64 62 45  nterp, pRet, dbE
11430 76 61 6c 43 6f 6c 75 6d 6e 56 61 6c 75 65 28 26  valColumnValue(&
11440 73 45 76 61 6c 2c 20 69 29 29 3b 0a 20 20 20 20  sEval, i));.    
11450 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
11460 20 20 20 20 64 62 45 76 61 6c 46 69 6e 61 6c 69      dbEvalFinali
11470 7a 65 28 26 73 45 76 61 6c 29 3b 0a 20 20 20 20  ze(&sEval);.    
11480 20 20 69 66 28 20 72 63 3d 3d 54 43 4c 5f 42 52    if( rc==TCL_BR
11490 45 41 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 54  EAK ){.        T
114a0 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
114b0 69 6e 74 65 72 70 2c 20 70 52 65 74 29 3b 0a 20  interp, pRet);. 
114c0 20 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f         rc = TCL_
114d0 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OK;.      }.    
114e0 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
114f0 6e 74 28 70 52 65 74 29 3b 0a 20 20 20 20 7d 65  nt(pRet);.    }e
11500 6c 73 65 7b 0a 20 20 20 20 20 20 43 6c 69 65 6e  lse{.      Clien
11510 74 44 61 74 61 20 63 64 5b 32 5d 3b 0a 20 20 20  tData cd[2];.   
11520 20 20 20 44 62 45 76 61 6c 43 6f 6e 74 65 78 74     DbEvalContext
11530 20 2a 70 3b 0a 20 20 20 20 20 20 54 63 6c 5f 4f   *p;.      Tcl_O
11540 62 6a 20 2a 70 41 72 72 61 79 20 3d 20 30 3b 0a  bj *pArray = 0;.
11550 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70        Tcl_Obj *p
11560 53 63 72 69 70 74 3b 0a 0a 20 20 20 20 20 20 69  Script;..      i
11570 66 28 20 6f 62 6a 63 3d 3d 35 20 26 26 20 2a 28  f( objc==5 && *(
11580 63 68 61 72 20 2a 29 54 63 6c 5f 47 65 74 53 74  char *)Tcl_GetSt
11590 72 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 20 29 7b  ring(objv[3]) ){
115a0 0a 20 20 20 20 20 20 20 20 70 41 72 72 61 79 20  .        pArray 
115b0 3d 20 6f 62 6a 76 5b 33 5d 3b 0a 20 20 20 20 20  = objv[3];.     
115c0 20 7d 0a 20 20 20 20 20 20 70 53 63 72 69 70 74   }.      pScript
115d0 20 3d 20 6f 62 6a 76 5b 6f 62 6a 63 2d 31 5d 3b   = objv[objc-1];
115e0 0a 20 20 20 20 20 20 54 63 6c 5f 49 6e 63 72 52  .      Tcl_IncrR
115f0 65 66 43 6f 75 6e 74 28 70 53 63 72 69 70 74 29  efCount(pScript)
11600 3b 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20 70  ;.      .      p
11610 20 3d 20 28 44 62 45 76 61 6c 43 6f 6e 74 65 78   = (DbEvalContex
11620 74 20 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28 73 69  t *)Tcl_Alloc(si
11630 7a 65 6f 66 28 44 62 45 76 61 6c 43 6f 6e 74 65  zeof(DbEvalConte
11640 78 74 29 29 3b 0a 20 20 20 20 20 20 64 62 45 76  xt));.      dbEv
11650 61 6c 49 6e 69 74 28 70 2c 20 70 44 62 2c 20 6f  alInit(p, pDb, o
11660 62 6a 76 5b 32 5d 2c 20 70 41 72 72 61 79 29 3b  bjv[2], pArray);
11670 0a 0a 20 20 20 20 20 20 63 64 5b 30 5d 20 3d 20  ..      cd[0] = 
11680 28 76 6f 69 64 20 2a 29 70 3b 0a 20 20 20 20 20  (void *)p;.     
11690 20 63 64 5b 31 5d 20 3d 20 28 76 6f 69 64 20 2a   cd[1] = (void *
116a0 29 70 53 63 72 69 70 74 3b 0a 20 20 20 20 20 20  )pScript;.      
116b0 72 63 20 3d 20 44 62 45 76 61 6c 4e 65 78 74 43  rc = DbEvalNextC
116c0 6d 64 28 63 64 2c 20 69 6e 74 65 72 70 2c 20 54  md(cd, interp, T
116d0 43 4c 5f 4f 4b 29 3b 0a 20 20 20 20 7d 0a 20 20  CL_OK);.    }.  
116e0 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
116f0 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20  /*.  **     $db 
11700 66 75 6e 63 74 69 6f 6e 20 4e 41 4d 45 20 5b 2d  function NAME [-
11710 61 72 67 63 6f 75 6e 74 20 4e 5d 20 53 43 52 49  argcount N] SCRI
11720 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 72 65  PT.  **.  ** Cre
11730 61 74 65 20 61 20 6e 65 77 20 53 51 4c 20 66 75  ate a new SQL fu
11740 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 20 4e 41  nction called NA
11750 4d 45 2e 20 20 57 68 65 6e 65 76 65 72 20 74 68  ME.  Whenever th
11760 61 74 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a 20  at function is. 
11770 20 2a 2a 20 63 61 6c 6c 65 64 2c 20 69 6e 76 6f   ** called, invo
11780 6b 65 20 53 43 52 49 50 54 20 74 6f 20 65 76 61  ke SCRIPT to eva
11790 6c 75 61 74 65 20 74 68 65 20 66 75 6e 63 74 69  luate the functi
117a0 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  on..  */.  case 
117b0 44 42 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20  DB_FUNCTION: {. 
117c0 20 20 20 53 71 6c 46 75 6e 63 20 2a 70 46 75 6e     SqlFunc *pFun
117d0 63 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a  c;.    Tcl_Obj *
117e0 70 53 63 72 69 70 74 3b 0a 20 20 20 20 63 68 61  pScript;.    cha
117f0 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 6e  r *zName;.    in
11800 74 20 6e 41 72 67 20 3d 20 2d 31 3b 0a 20 20 20  t nArg = -1;.   
11810 20 69 66 28 20 6f 62 6a 63 3d 3d 36 20 29 7b 0a   if( objc==6 ){.
11820 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
11830 20 2a 7a 20 3d 20 54 63 6c 5f 47 65 74 53 74 72   *z = Tcl_GetStr
11840 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a 20 20  ing(objv[3]);.  
11850 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 74 72 6c      int n = strl
11860 65 6e 33 30 28 7a 29 3b 0a 20 20 20 20 20 20 69  en30(z);.      i
11870 66 28 20 6e 3e 32 20 26 26 20 73 74 72 6e 63 6d  f( n>2 && strncm
11880 70 28 7a 2c 20 22 2d 61 72 67 63 6f 75 6e 74 22  p(z, "-argcount"
11890 2c 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ,n)==0 ){.      
118a0 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
118b0 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
118c0 6f 62 6a 76 5b 34 5d 2c 20 26 6e 41 72 67 29 20  objv[4], &nArg) 
118d0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
118e0 4f 52 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  OR;.        if( 
118f0 6e 41 72 67 3c 30 20 29 7b 0a 20 20 20 20 20 20  nArg<0 ){.      
11900 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
11910 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 6e 75  sult(interp, "nu
11920 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
11930 73 20 6d 75 73 74 20 62 65 20 6e 6f 6e 2d 6e 65  s must be non-ne
11940 67 61 74 69 76 65 22 2c 0a 20 20 20 20 20 20 20  gative",.       
11950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11960 20 20 20 20 28 63 68 61 72 2a 29 30 29 3b 0a 20      (char*)0);. 
11970 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
11980 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  TCL_ERROR;.     
11990 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
119a0 20 20 20 70 53 63 72 69 70 74 20 3d 20 6f 62 6a     pScript = obj
119b0 76 5b 35 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 20  v[5];.    }else 
119c0 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20  if( objc!=4 ){. 
119d0 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
119e0 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
119f0 20 6f 62 6a 76 2c 20 22 4e 41 4d 45 20 5b 2d 61   objv, "NAME [-a
11a00 72 67 63 6f 75 6e 74 20 4e 5d 20 53 43 52 49 50  rgcount N] SCRIP
11a10 54 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  T");.      retur
11a20 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
11a30 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 53   }else{.      pS
11a40 63 72 69 70 74 20 3d 20 6f 62 6a 76 5b 33 5d 3b  cript = objv[3];
11a50 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4e 61 6d 65  .    }.    zName
11a60 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
11a70 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c  FromObj(objv[2],
11a80 20 30 29 3b 0a 20 20 20 20 70 46 75 6e 63 20 3d   0);.    pFunc =
11a90 20 66 69 6e 64 53 71 6c 46 75 6e 63 28 70 44 62   findSqlFunc(pDb
11aa0 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66  , zName);.    if
11ab0 28 20 70 46 75 6e 63 3d 3d 30 20 29 20 72 65 74  ( pFunc==0 ) ret
11ac0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
11ad0 20 20 20 69 66 28 20 70 46 75 6e 63 2d 3e 70 53     if( pFunc->pS
11ae0 63 72 69 70 74 20 29 7b 0a 20 20 20 20 20 20 54  cript ){.      T
11af0 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
11b00 70 46 75 6e 63 2d 3e 70 53 63 72 69 70 74 29 3b  pFunc->pScript);
11b10 0a 20 20 20 20 7d 0a 20 20 20 20 70 46 75 6e 63  .    }.    pFunc
11b20 2d 3e 70 53 63 72 69 70 74 20 3d 20 70 53 63 72  ->pScript = pScr
11b30 69 70 74 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 63  ipt;.    Tcl_Inc
11b40 72 52 65 66 43 6f 75 6e 74 28 70 53 63 72 69 70  rRefCount(pScrip
11b50 74 29 3b 0a 20 20 20 20 70 46 75 6e 63 2d 3e 75  t);.    pFunc->u
11b60 73 65 45 76 61 6c 4f 62 6a 76 20 3d 20 73 61 66  seEvalObjv = saf
11b70 65 54 6f 55 73 65 45 76 61 6c 4f 62 6a 76 28 69  eToUseEvalObjv(i
11b80 6e 74 65 72 70 2c 20 70 53 63 72 69 70 74 29 3b  nterp, pScript);
11b90 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
11ba0 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
11bb0 6e 28 70 44 62 2d 3e 64 62 2c 20 7a 4e 61 6d 65  n(pDb->db, zName
11bc0 2c 20 6e 41 72 67 2c 20 53 51 4c 49 54 45 5f 55  , nArg, SQLITE_U
11bd0 54 46 38 2c 0a 20 20 20 20 20 20 20 20 70 46 75  TF8,.        pFu
11be0 6e 63 2c 20 74 63 6c 53 71 6c 46 75 6e 63 2c 20  nc, tclSqlFunc, 
11bf0 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  0, 0);.    if( r
11c00 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
11c10 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45        rc = TCL_E
11c20 52 52 4f 52 3b 0a 20 20 20 20 20 20 54 63 6c 5f  RROR;.      Tcl_
11c30 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
11c40 2c 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  , (char *)sqlite
11c50 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62  3_errmsg(pDb->db
11c60 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29  ), TCL_VOLATILE)
11c70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61  ;.    }.    brea
11c80 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  k;.  }..  /*.  *
11c90 2a 20 20 20 20 20 24 64 62 20 69 6e 63 72 62 6c  *     $db incrbl
11ca0 6f 62 20 3f 2d 72 65 61 64 6f 6e 6c 79 3f 20 3f  ob ?-readonly? ?
11cb0 44 42 3f 20 54 41 42 4c 45 20 43 4f 4c 55 4d 4e  DB? TABLE COLUMN
11cc0 20 52 4f 57 49 44 0a 20 20 2a 2f 0a 20 20 63 61   ROWID.  */.  ca
11cd0 73 65 20 44 42 5f 49 4e 43 52 42 4c 4f 42 3a 20  se DB_INCRBLOB: 
11ce0 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
11cf0 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20  OMIT_INCRBLOB.  
11d00 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
11d10 6c 74 28 69 6e 74 65 72 70 2c 20 22 69 6e 63 72  lt(interp, "incr
11d20 62 6c 6f 62 20 6e 6f 74 20 61 76 61 69 6c 61 62  blob not availab
11d30 6c 65 20 69 6e 20 74 68 69 73 20 62 75 69 6c 64  le in this build
11d40 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
11d50 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c  n TCL_ERROR;.#el
11d60 73 65 0a 20 20 20 20 69 6e 74 20 69 73 52 65 61  se.    int isRea
11d70 64 6f 6e 6c 79 20 3d 20 30 3b 0a 20 20 20 20 63  donly = 0;.    c
11d80 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d  onst char *zDb =
11d90 20 22 6d 61 69 6e 22 3b 0a 20 20 20 20 63 6f 6e   "main";.    con
11da0 73 74 20 63 68 61 72 20 2a 7a 54 61 62 6c 65 3b  st char *zTable;
11db0 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
11dc0 2a 7a 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 73 71  *zColumn;.    sq
11dd0 6c 69 74 65 5f 69 6e 74 36 34 20 69 52 6f 77 3b  lite_int64 iRow;
11de0 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 66  ..    /* Check f
11df0 6f 72 20 74 68 65 20 2d 72 65 61 64 6f 6e 6c 79  or the -readonly
11e00 20 6f 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 69   option */.    i
11e10 66 28 20 6f 62 6a 63 3e 33 20 26 26 20 73 74 72  f( objc>3 && str
11e20 63 6d 70 28 54 63 6c 5f 47 65 74 53 74 72 69 6e  cmp(Tcl_GetStrin
11e30 67 28 6f 62 6a 76 5b 32 5d 29 2c 20 22 2d 72 65  g(objv[2]), "-re
11e40 61 64 6f 6e 6c 79 22 29 3d 3d 30 20 29 7b 0a 20  adonly")==0 ){. 
11e50 20 20 20 20 20 69 73 52 65 61 64 6f 6e 6c 79 20       isReadonly 
11e60 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  = 1;.    }..    
11e70 69 66 28 20 6f 62 6a 63 21 3d 28 35 2b 69 73 52  if( objc!=(5+isR
11e80 65 61 64 6f 6e 6c 79 29 20 26 26 20 6f 62 6a 63  eadonly) && objc
11e90 21 3d 28 36 2b 69 73 52 65 61 64 6f 6e 6c 79 29  !=(6+isReadonly)
11ea0 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72   ){.      Tcl_Wr
11eb0 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
11ec0 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 2d 72  p, 2, objv, "?-r
11ed0 65 61 64 6f 6e 6c 79 3f 20 3f 44 42 3f 20 54 41  eadonly? ?DB? TA
11ee0 42 4c 45 20 43 4f 4c 55 4d 4e 20 52 4f 57 49 44  BLE COLUMN ROWID
11ef0 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
11f00 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
11f10 7d 0a 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3d  }..    if( objc=
11f20 3d 28 36 2b 69 73 52 65 61 64 6f 6e 6c 79 29 20  =(6+isReadonly) 
11f30 29 7b 0a 20 20 20 20 20 20 7a 44 62 20 3d 20 54  ){.      zDb = T
11f40 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
11f50 76 5b 32 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20  v[2]);.    }.   
11f60 20 7a 54 61 62 6c 65 20 3d 20 54 63 6c 5f 47 65   zTable = Tcl_Ge
11f70 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 6f 62 6a  tString(objv[obj
11f80 63 2d 33 5d 29 3b 0a 20 20 20 20 7a 43 6f 6c 75  c-3]);.    zColu
11f90 6d 6e 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  mn = Tcl_GetStri
11fa0 6e 67 28 6f 62 6a 76 5b 6f 62 6a 63 2d 32 5d 29  ng(objv[objc-2])
11fb0 3b 0a 20 20 20 20 72 63 20 3d 20 54 63 6c 5f 47  ;.    rc = Tcl_G
11fc0 65 74 57 69 64 65 49 6e 74 46 72 6f 6d 4f 62 6a  etWideIntFromObj
11fd0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 6f 62  (interp, objv[ob
11fe0 6a 63 2d 31 5d 2c 20 26 69 52 6f 77 29 3b 0a 0a  jc-1], &iRow);..
11ff0 20 20 20 20 69 66 28 20 72 63 3d 3d 54 43 4c 5f      if( rc==TCL_
12000 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
12010 20 63 72 65 61 74 65 49 6e 63 72 62 6c 6f 62 43   createIncrblobC
12020 68 61 6e 6e 65 6c 28 0a 20 20 20 20 20 20 20 20  hannel(.        
12030 20 20 69 6e 74 65 72 70 2c 20 70 44 62 2c 20 7a    interp, pDb, z
12040 44 62 2c 20 7a 54 61 62 6c 65 2c 20 7a 43 6f 6c  Db, zTable, zCol
12050 75 6d 6e 2c 20 69 52 6f 77 2c 20 69 73 52 65 61  umn, iRow, isRea
12060 64 6f 6e 6c 79 0a 20 20 20 20 20 20 29 3b 0a 20  donly.      );. 
12070 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
12080 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
12090 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20 69 6e  .  **     $db in
120a0 74 65 72 72 75 70 74 0a 20 20 2a 2a 0a 20 20 2a  terrupt.  **.  *
120b0 2a 20 49 6e 74 65 72 72 75 70 74 20 74 68 65 20  * Interrupt the 
120c0 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 74 68 65  execution of the
120d0 20 69 6e 6e 65 72 2d 6d 6f 73 74 20 53 51 4c 20   inner-most SQL 
120e0 69 6e 74 65 72 70 72 65 74 65 72 2e 20 20 54 68  interpreter.  Th
120f0 69 73 0a 20 20 2a 2a 20 63 61 75 73 65 73 20 74  is.  ** causes t
12100 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  he SQL statement
12110 20 74 6f 20 72 65 74 75 72 6e 20 61 6e 20 65 72   to return an er
12120 72 6f 72 20 6f 66 20 53 51 4c 49 54 45 5f 49 4e  ror of SQLITE_IN
12130 54 45 52 52 55 50 54 2e 0a 20 20 2a 2f 0a 20 20  TERRUPT..  */.  
12140 63 61 73 65 20 44 42 5f 49 4e 54 45 52 52 55 50  case DB_INTERRUP
12150 54 3a 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  T: {.    sqlite3
12160 5f 69 6e 74 65 72 72 75 70 74 28 70 44 62 2d 3e  _interrupt(pDb->
12170 64 62 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a  db);.    break;.
12180 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20    }..  /*.  **  
12190 20 20 20 24 64 62 20 6e 75 6c 6c 76 61 6c 75 65     $db nullvalue
121a0 20 3f 53 54 52 49 4e 47 3f 0a 20 20 2a 2a 0a 20   ?STRING?.  **. 
121b0 20 2a 2a 20 43 68 61 6e 67 65 20 74 65 78 74 20   ** Change text 
121c0 75 73 65 64 20 77 68 65 6e 20 61 20 4e 55 4c 4c  used when a NULL
121d0 20 63 6f 6d 65 73 20 62 61 63 6b 20 66 72 6f 6d   comes back from
121e0 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 49   the database. I
121f0 66 20 3f 53 54 52 49 4e 47 3f 0a 20 20 2a 2a 20  f ?STRING?.  ** 
12200 69 73 20 6e 6f 74 20 70 72 65 73 65 6e 74 2c 20  is not present, 
12210 74 68 65 6e 20 74 68 65 20 63 75 72 72 65 6e 74  then the current
12220 20 73 74 72 69 6e 67 20 75 73 65 64 20 66 6f 72   string used for
12230 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65   NULL is returne
12240 64 2e 0a 20 20 2a 2a 20 49 66 20 53 54 52 49 4e  d..  ** If STRIN
12250 47 20 69 73 20 70 72 65 73 65 6e 74 2c 20 74 68  G is present, th
12260 65 6e 20 53 54 52 49 4e 47 20 69 73 20 72 65 74  en STRING is ret
12270 75 72 6e 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2f  urned..  **.  */
12280 0a 20 20 63 61 73 65 20 44 42 5f 4e 55 4c 4c 56  .  case DB_NULLV
12290 41 4c 55 45 3a 20 7b 0a 20 20 20 20 69 66 28 20  ALUE: {.    if( 
122a0 6f 62 6a 63 21 3d 32 20 26 26 20 6f 62 6a 63 21  objc!=2 && objc!
122b0 3d 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  =3 ){.      Tcl_
122c0 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
122d0 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 4e  erp, 2, objv, "N
122e0 55 4c 4c 56 41 4c 55 45 22 29 3b 0a 20 20 20 20  ULLVALUE");.    
122f0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
12300 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  OR;.    }.    if
12310 28 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20 20 20  ( objc==3 ){.   
12320 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20     int len;.    
12330 20 20 63 68 61 72 20 2a 7a 4e 75 6c 6c 20 3d 20    char *zNull = 
12340 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
12350 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c  mObj(objv[2], &l
12360 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  en);.      if( p
12370 44 62 2d 3e 7a 4e 75 6c 6c 20 29 7b 0a 20 20 20  Db->zNull ){.   
12380 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44       Tcl_Free(pD
12390 62 2d 3e 7a 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  b->zNull);.     
123a0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 4e 75   }.      if( zNu
123b0 6c 6c 20 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20  ll && len>0 ){. 
123c0 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e 75 6c         pDb->zNul
123d0 6c 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c  l = Tcl_Alloc( l
123e0 65 6e 20 2b 20 31 20 29 3b 0a 20 20 20 20 20 20  en + 1 );.      
123f0 20 20 73 74 72 6e 63 70 79 28 70 44 62 2d 3e 7a    strncpy(pDb->z
12400 4e 75 6c 6c 2c 20 7a 4e 75 6c 6c 2c 20 6c 65 6e  Null, zNull, len
12410 29 3b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e  );.        pDb->
12420 7a 4e 75 6c 6c 5b 6c 65 6e 5d 20 3d 20 27 5c 30  zNull[len] = '\0
12430 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  ';.      }else{.
12440 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e 75          pDb->zNu
12450 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  ll = 0;.      }.
12460 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 53 65      }.    Tcl_Se
12470 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
12480 70 2c 20 64 62 54 65 78 74 54 6f 4f 62 6a 28 70  p, dbTextToObj(p
12490 44 62 2d 3e 7a 4e 75 6c 6c 29 29 3b 0a 20 20 20  Db->zNull));.   
124a0 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
124b0 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20 6c  *.  **     $db l
124c0 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64  ast_insert_rowid
124d0 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75   .  **.  ** Retu
124e0 72 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 77 68  rn an integer wh
124f0 69 63 68 20 69 73 20 74 68 65 20 52 4f 57 49 44  ich is the ROWID
12500 20 66 6f 72 20 74 68 65 20 6d 6f 73 74 20 72 65   for the most re
12510 63 65 6e 74 20 69 6e 73 65 72 74 2e 0a 20 20 2a  cent insert..  *
12520 2f 0a 20 20 63 61 73 65 20 44 42 5f 4c 41 53 54  /.  case DB_LAST
12530 5f 49 4e 53 45 52 54 5f 52 4f 57 49 44 3a 20 7b  _INSERT_ROWID: {
12540 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52  .    Tcl_Obj *pR
12550 65 73 75 6c 74 3b 0a 20 20 20 20 54 63 6c 5f 57  esult;.    Tcl_W
12560 69 64 65 49 6e 74 20 72 6f 77 69 64 3b 0a 20 20  ideInt rowid;.  
12570 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b    if( objc!=2 ){
12580 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  .      Tcl_Wrong
12590 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
125a0 32 2c 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 20 20  2, objv, "");.  
125b0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
125c0 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
125d0 72 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33 5f  rowid = sqlite3_
125e0 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69  last_insert_rowi
125f0 64 28 70 44 62 2d 3e 64 62 29 3b 0a 20 20 20 20  d(pDb->db);.    
12600 70 52 65 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65  pResult = Tcl_Ge
12610 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
12620 70 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 57  p);.    Tcl_SetW
12630 69 64 65 49 6e 74 4f 62 6a 28 70 52 65 73 75 6c  ideIntObj(pResul
12640 74 2c 20 72 6f 77 69 64 29 3b 0a 20 20 20 20 62  t, rowid);.    b
12650 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a  reak;.  }..  /*.
12660 20 20 2a 2a 20 54 68 65 20 44 42 5f 4f 4e 45 43    ** The DB_ONEC
12670 4f 4c 55 4d 4e 20 6d 65 74 68 6f 64 20 69 73 20  OLUMN method is 
12680 69 6d 70 6c 65 6d 65 6e 74 65 64 20 74 6f 67 65  implemented toge
12690 74 68 65 72 20 77 69 74 68 20 44 42 5f 45 58 49  ther with DB_EXI
126a0 53 54 53 2e 0a 20 20 2a 2f 0a 0a 20 20 2f 2a 20  STS..  */..  /* 
126b0 20 20 20 24 64 62 20 70 72 6f 67 72 65 73 73 20     $db progress 
126c0 3f 4e 20 43 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a  ?N CALLBACK?.  *
126d0 2a 20 0a 20 20 2a 2a 20 49 6e 76 6f 6b 65 20 74  * .  ** Invoke t
126e0 68 65 20 67 69 76 65 6e 20 63 61 6c 6c 62 61 63  he given callbac
126f0 6b 20 65 76 65 72 79 20 4e 20 76 69 72 74 75 61  k every N virtua
12700 6c 20 6d 61 63 68 69 6e 65 20 6f 70 63 6f 64 65  l machine opcode
12710 73 20 77 68 69 6c 65 20 65 78 65 63 75 74 69 6e  s while executin
12720 67 0a 20 20 2a 2a 20 71 75 65 72 69 65 73 2e 0a  g.  ** queries..
12730 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 50    */.  case DB_P
12740 52 4f 47 52 45 53 53 3a 20 7b 0a 20 20 20 20 69  ROGRESS: {.    i
12750 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20  f( objc==2 ){.  
12760 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 50 72      if( pDb->zPr
12770 6f 67 72 65 73 73 20 29 7b 0a 20 20 20 20 20 20  ogress ){.      
12780 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
12790 6c 74 28 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e  lt(interp, pDb->
127a0 7a 50 72 6f 67 72 65 73 73 2c 20 30 29 3b 0a 20  zProgress, 0);. 
127b0 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
127c0 20 69 66 28 20 6f 62 6a 63 3d 3d 34 20 29 7b 0a   if( objc==4 ){.
127d0 20 20 20 20 20 20 63 68 61 72 20 2a 7a 50 72 6f        char *zPro
127e0 67 72 65 73 73 3b 0a 20 20 20 20 20 20 69 6e 74  gress;.      int
127f0 20 6c 65 6e 3b 0a 20 20 20 20 20 20 69 6e 74 20   len;.      int 
12800 4e 3b 0a 20 20 20 20 20 20 69 66 28 20 54 43 4c  N;.      if( TCL
12810 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 49 6e 74 46  _OK!=Tcl_GetIntF
12820 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
12830 62 6a 76 5b 32 5d 2c 20 26 4e 29 20 29 7b 0a 20  bjv[2], &N) ){. 
12840 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43         return TC
12850 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d  L_ERROR;.      }
12860 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d  ;.      if( pDb-
12870 3e 7a 50 72 6f 67 72 65 73 73 20 29 7b 0a 20 20  >zProgress ){.  
12880 20 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70        Tcl_Free(p
12890 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 29 3b 0a  Db->zProgress);.
128a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 50        }.      zP
128b0 72 6f 67 72 65 73 73 20 3d 20 54 63 6c 5f 47 65  rogress = Tcl_Ge
128c0 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
128d0 62 6a 76 5b 33 5d 2c 20 26 6c 65 6e 29 3b 0a 20  bjv[3], &len);. 
128e0 20 20 20 20 20 69 66 28 20 7a 50 72 6f 67 72 65       if( zProgre
128f0 73 73 20 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20  ss && len>0 ){. 
12900 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 50 72 6f         pDb->zPro
12910 67 72 65 73 73 20 3d 20 54 63 6c 5f 41 6c 6c 6f  gress = Tcl_Allo
12920 63 28 20 6c 65 6e 20 2b 20 31 20 29 3b 0a 20 20  c( len + 1 );.  
12930 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 44 62        memcpy(pDb
12940 2d 3e 7a 50 72 6f 67 72 65 73 73 2c 20 7a 50 72  ->zProgress, zPr
12950 6f 67 72 65 73 73 2c 20 6c 65 6e 2b 31 29 3b 0a  ogress, len+1);.
12960 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
12970 20 20 20 20 20 70 44 62 2d 3e 7a 50 72 6f 67 72       pDb->zProgr
12980 65 73 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ess = 0;.      }
12990 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
129a0 4f 4d 49 54 5f 50 52 4f 47 52 45 53 53 5f 43 41  OMIT_PROGRESS_CA
129b0 4c 4c 42 41 43 4b 0a 20 20 20 20 20 20 69 66 28  LLBACK.      if(
129c0 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 20   pDb->zProgress 
129d0 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e  ){.        pDb->
129e0 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b  interp = interp;
129f0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
12a00 5f 70 72 6f 67 72 65 73 73 5f 68 61 6e 64 6c 65  _progress_handle
12a10 72 28 70 44 62 2d 3e 64 62 2c 20 4e 2c 20 44 62  r(pDb->db, N, Db
12a20 50 72 6f 67 72 65 73 73 48 61 6e 64 6c 65 72 2c  ProgressHandler,
12a30 20 70 44 62 29 3b 0a 20 20 20 20 20 20 7d 65 6c   pDb);.      }el
12a40 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
12a50 74 65 33 5f 70 72 6f 67 72 65 73 73 5f 68 61 6e  te3_progress_han
12a60 64 6c 65 72 28 70 44 62 2d 3e 64 62 2c 20 30 2c  dler(pDb->db, 0,
12a70 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a   0, 0);.      }.
12a80 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65  #endif.    }else
12a90 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e  {.      Tcl_Wron
12aa0 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
12ab0 20 32 2c 20 6f 62 6a 76 2c 20 22 4e 20 43 41 4c   2, objv, "N CAL
12ac0 4c 42 41 43 4b 22 29 3b 0a 20 20 20 20 20 20 72  LBACK");.      r
12ad0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
12ae0 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b  .    }.    break
12af0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24  ;.  }..  /*    $
12b00 64 62 20 70 72 6f 66 69 6c 65 20 3f 43 41 4c 4c  db profile ?CALL
12b10 42 41 43 4b 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20  BACK?.  **.  ** 
12b20 4d 61 6b 65 20 61 72 72 61 6e 67 65 6d 65 6e 74  Make arrangement
12b30 73 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20  s to invoke the 
12b40 43 41 4c 4c 42 41 43 4b 20 72 6f 75 74 69 6e 65  CALLBACK routine
12b50 20 61 66 74 65 72 20 65 61 63 68 20 53 51 4c 20   after each SQL 
12b60 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74  statement.  ** t
12b70 68 61 74 20 68 61 73 20 72 75 6e 2e 20 20 54 68  hat has run.  Th
12b80 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 53 51  e text of the SQ
12b90 4c 20 61 6e 64 20 74 68 65 20 61 6d 6f 75 6e 74  L and the amount
12ba0 20 6f 66 20 65 6c 61 70 73 65 20 74 69 6d 65 20   of elapse time 
12bb0 61 72 65 0a 20 20 2a 2a 20 61 70 70 65 6e 64 65  are.  ** appende
12bc0 64 20 74 6f 20 43 41 4c 4c 42 41 43 4b 20 62 65  d to CALLBACK be
12bd0 66 6f 72 65 20 74 68 65 20 73 63 72 69 70 74 20  fore the script 
12be0 69 73 20 72 75 6e 2e 0a 20 20 2a 2f 0a 20 20 63  is run..  */.  c
12bf0 61 73 65 20 44 42 5f 50 52 4f 46 49 4c 45 3a 20  ase DB_PROFILE: 
12c00 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 33  {.    if( objc>3
12c10 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72   ){.      Tcl_Wr
12c20 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
12c30 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 43 41  p, 2, objv, "?CA
12c40 4c 4c 42 41 43 4b 3f 22 29 3b 0a 20 20 20 20 20  LLBACK?");.     
12c50 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
12c60 52 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  R;.    }else if(
12c70 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20   objc==2 ){.    
12c80 20 20 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f 66    if( pDb->zProf
12c90 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 54  ile ){.        T
12ca0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
12cb0 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a 50 72  interp, pDb->zPr
12cc0 6f 66 69 6c 65 2c 20 30 29 3b 0a 20 20 20 20 20  ofile, 0);.     
12cd0 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
12ce0 20 20 20 20 63 68 61 72 20 2a 7a 50 72 6f 66 69      char *zProfi
12cf0 6c 65 3b 0a 20 20 20 20 20 20 69 6e 74 20 6c 65  le;.      int le
12d00 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62  n;.      if( pDb
12d10 2d 3e 7a 50 72 6f 66 69 6c 65 20 29 7b 0a 20 20  ->zProfile ){.  
12d20 20 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70        Tcl_Free(p
12d30 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 29 3b 0a 20  Db->zProfile);. 
12d40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 50 72       }.      zPr
12d50 6f 66 69 6c 65 20 3d 20 54 63 6c 5f 47 65 74 53  ofile = Tcl_GetS
12d60 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
12d70 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20 20  v[2], &len);.   
12d80 20 20 20 69 66 28 20 7a 50 72 6f 66 69 6c 65 20     if( zProfile 
12d90 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20  && len>0 ){.    
12da0 20 20 20 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c      pDb->zProfil
12db0 65 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c  e = Tcl_Alloc( l
12dc0 65 6e 20 2b 20 31 20 29 3b 0a 20 20 20 20 20 20  en + 1 );.      
12dd0 20 20 6d 65 6d 63 70 79 28 70 44 62 2d 3e 7a 50    memcpy(pDb->zP
12de0 72 6f 66 69 6c 65 2c 20 7a 50 72 6f 66 69 6c 65  rofile, zProfile
12df0 2c 20 6c 65 6e 2b 31 29 3b 0a 20 20 20 20 20 20  , len+1);.      
12e00 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
12e10 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 20 3d 20 30  Db->zProfile = 0
12e20 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65  ;.      }.#ifnde
12e30 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  f SQLITE_OMIT_TR
12e40 41 43 45 0a 20 20 20 20 20 20 69 66 28 20 70 44  ACE.      if( pD
12e50 62 2d 3e 7a 50 72 6f 66 69 6c 65 20 29 7b 0a 20  b->zProfile ){. 
12e60 20 20 20 20 20 20 20 70 44 62 2d 3e 69 6e 74 65         pDb->inte
12e70 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20  rp = interp;.   
12e80 20 20 20 20 20 73 71 6c 69 74 65 33 5f 70 72 6f       sqlite3_pro
12e90 66 69 6c 65 28 70 44 62 2d 3e 64 62 2c 20 44 62  file(pDb->db, Db
12ea0 50 72 6f 66 69 6c 65 48 61 6e 64 6c 65 72 2c 20  ProfileHandler, 
12eb0 70 44 62 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  pDb);.      }els
12ec0 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
12ed0 65 33 5f 70 72 6f 66 69 6c 65 28 70 44 62 2d 3e  e3_profile(pDb->
12ee0 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  db, 0, 0);.     
12ef0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a   }.#endif.    }.
12f00 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
12f10 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64    /*.  **     $d
12f20 62 20 72 65 6b 65 79 20 4b 45 59 0a 20 20 2a 2a  b rekey KEY.  **
12f30 0a 20 20 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  .  ** Change the
12f40 20 65 6e 63 72 79 70 74 69 6f 6e 20 6b 65 79 20   encryption key 
12f50 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79  on the currently
12f60 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 2e 0a   open database..
12f70 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 52    */.  case DB_R
12f80 45 4b 45 59 3a 20 7b 0a 20 20 20 20 69 6e 74 20  EKEY: {.    int 
12f90 6e 4b 65 79 3b 0a 20 20 20 20 76 6f 69 64 20 2a  nKey;.    void *
12fa0 70 4b 65 79 3b 0a 20 20 20 20 69 66 28 20 6f 62  pKey;.    if( ob
12fb0 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 54  jc!=3 ){.      T
12fc0 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
12fd0 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c  interp, 2, objv,
12fe0 20 22 4b 45 59 22 29 3b 0a 20 20 20 20 20 20 72   "KEY");.      r
12ff0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
13000 0a 20 20 20 20 7d 0a 20 20 20 20 70 4b 65 79 20  .    }.    pKey 
13010 3d 20 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72  = Tcl_GetByteArr
13020 61 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32  ayFromObj(objv[2
13030 5d 2c 20 26 6e 4b 65 79 29 3b 0a 23 69 66 64 65  ], &nKey);.#ifde
13040 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
13050 45 43 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  EC.    rc = sqli
13060 74 65 33 5f 72 65 6b 65 79 28 70 44 62 2d 3e 64  te3_rekey(pDb->d
13070 62 2c 20 70 4b 65 79 2c 20 6e 4b 65 79 29 3b 0a  b, pKey, nKey);.
13080 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
13090 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
130a0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 73 71 6c  sult(interp, sql
130b0 69 74 65 33 45 72 72 53 74 72 28 72 63 29 2c 20  ite3ErrStr(rc), 
130c0 30 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 54  0);.      rc = T
130d0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
130e0 23 65 6e 64 69 66 0a 20 20 20 20 62 72 65 61 6b  #endif.    break
130f0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24  ;.  }..  /*    $
13100 64 62 20 72 65 73 74 6f 72 65 20 3f 44 41 54 41  db restore ?DATA
13110 42 41 53 45 3f 20 46 49 4c 45 4e 41 4d 45 0a 20  BASE? FILENAME. 
13120 20 2a 2a 0a 20 20 2a 2a 20 4f 70 65 6e 20 61 20   **.  ** Open a 
13130 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61  database file na
13140 6d 65 64 20 46 49 4c 45 4e 41 4d 45 2e 20 20 54  med FILENAME.  T
13150 72 61 6e 73 66 65 72 20 74 68 65 20 63 6f 6e 74  ransfer the cont
13160 65 6e 74 20 0a 20 20 2a 2a 20 6f 66 20 46 49 4c  ent .  ** of FIL
13170 45 4e 41 4d 45 20 69 6e 74 6f 20 74 68 65 20 6c  ENAME into the l
13180 6f 63 61 6c 20 64 61 74 61 62 61 73 65 20 44 41  ocal database DA
13190 54 41 42 41 53 45 20 28 64 65 66 61 75 6c 74 3a  TABASE (default:
131a0 20 22 6d 61 69 6e 22 29 2e 0a 20 20 2a 2f 0a 20   "main")..  */. 
131b0 20 63 61 73 65 20 44 42 5f 52 45 53 54 4f 52 45   case DB_RESTORE
131c0 3a 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  : {.    const ch
131d0 61 72 20 2a 7a 53 72 63 46 69 6c 65 3b 0a 20 20  ar *zSrcFile;.  
131e0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
131f0 65 73 74 44 62 3b 0a 20 20 20 20 73 71 6c 69 74  estDb;.    sqlit
13200 65 33 20 2a 70 53 72 63 3b 0a 20 20 20 20 73 71  e3 *pSrc;.    sq
13210 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 2a 70 42  lite3_backup *pB
13220 61 63 6b 75 70 3b 0a 20 20 20 20 69 6e 74 20 6e  ackup;.    int n
13230 54 69 6d 65 6f 75 74 20 3d 20 30 3b 0a 0a 20 20  Timeout = 0;..  
13240 20 20 69 66 28 20 6f 62 6a 63 3d 3d 33 20 29 7b    if( objc==3 ){
13250 0a 20 20 20 20 20 20 7a 44 65 73 74 44 62 20 3d  .      zDestDb =
13260 20 22 6d 61 69 6e 22 3b 0a 20 20 20 20 20 20 7a   "main";.      z
13270 53 72 63 46 69 6c 65 20 3d 20 54 63 6c 5f 47 65  SrcFile = Tcl_Ge
13280 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29  tString(objv[2])
13290 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
132a0 6f 62 6a 63 3d 3d 34 20 29 7b 0a 20 20 20 20 20  objc==4 ){.     
132b0 20 7a 44 65 73 74 44 62 20 3d 20 54 63 6c 5f 47   zDestDb = Tcl_G
132c0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d  etString(objv[2]
132d0 29 3b 0a 20 20 20 20 20 20 7a 53 72 63 46 69 6c  );.      zSrcFil
132e0 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  e = Tcl_GetStrin
132f0 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a 20 20 20 20  g(objv[3]);.    
13300 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 54 63 6c  }else{.      Tcl
13310 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
13320 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22  terp, 2, objv, "
13330 3f 44 41 54 41 42 41 53 45 3f 20 46 49 4c 45 4e  ?DATABASE? FILEN
13340 41 4d 45 22 29 3b 0a 20 20 20 20 20 20 72 65 74  AME");.      ret
13350 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
13360 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71     }.    rc = sq
13370 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 7a 53  lite3_open_v2(zS
13380 72 63 46 69 6c 65 2c 20 26 70 53 72 63 2c 20 53  rcFile, &pSrc, S
13390 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
133a0 4e 4c 59 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  NLY, 0);.    if(
133b0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
133c0 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65  {.      Tcl_Appe
133d0 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
133e0 20 22 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 73 6f   "cannot open so
133f0 75 72 63 65 20 64 61 74 61 62 61 73 65 3a 20 22  urce database: "
13400 2c 0a 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  ,.           sql
13410 69 74 65 33 5f 65 72 72 6d 73 67 28 70 53 72 63  ite3_errmsg(pSrc
13420 29 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  ), (char*)0);.  
13430 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73      sqlite3_clos
13440 65 28 70 53 72 63 29 3b 0a 20 20 20 20 20 20 72  e(pSrc);.      r
13450 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
13460 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 61 63 6b  .    }.    pBack
13470 75 70 20 3d 20 73 71 6c 69 74 65 33 5f 62 61 63  up = sqlite3_bac
13480 6b 75 70 5f 69 6e 69 74 28 70 44 62 2d 3e 64 62  kup_init(pDb->db
13490 2c 20 7a 44 65 73 74 44 62 2c 20 70 53 72 63 2c  , zDestDb, pSrc,
134a0 20 22 6d 61 69 6e 22 29 3b 0a 20 20 20 20 69 66   "main");.    if
134b0 28 20 70 42 61 63 6b 75 70 3d 3d 30 20 29 7b 0a  ( pBackup==0 ){.
134c0 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
134d0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
134e0 72 65 73 74 6f 72 65 20 66 61 69 6c 65 64 3a 20  restore failed: 
134f0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 73 71  ",.           sq
13500 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62  lite3_errmsg(pDb
13510 2d 3e 64 62 29 2c 20 28 63 68 61 72 2a 29 30 29  ->db), (char*)0)
13520 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
13530 63 6c 6f 73 65 28 70 53 72 63 29 3b 0a 20 20 20  close(pSrc);.   
13540 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
13550 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77  ROR;.    }.    w
13560 68 69 6c 65 28 20 28 72 63 20 3d 20 73 71 6c 69  hile( (rc = sqli
13570 74 65 33 5f 62 61 63 6b 75 70 5f 73 74 65 70 28  te3_backup_step(
13580 70 42 61 63 6b 75 70 2c 31 30 30 29 29 3d 3d 53  pBackup,100))==S
13590 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 20 20 20 20  QLITE_OK.       
135a0 20 20 20 20 20 20 20 7c 7c 20 72 63 3d 3d 53 51         || rc==SQ
135b0 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20  LITE_BUSY ){.   
135c0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
135d0 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20  E_BUSY ){.      
135e0 20 20 69 66 28 20 6e 54 69 6d 65 6f 75 74 2b 2b    if( nTimeout++
135f0 20 3e 3d 20 33 20 29 20 62 72 65 61 6b 3b 0a 20   >= 3 ) break;. 
13600 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
13610 6c 65 65 70 28 31 30 30 29 3b 0a 20 20 20 20 20  leep(100);.     
13620 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
13630 69 74 65 33 5f 62 61 63 6b 75 70 5f 66 69 6e 69  ite3_backup_fini
13640 73 68 28 70 42 61 63 6b 75 70 29 3b 0a 20 20 20  sh(pBackup);.   
13650 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
13660 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 72 63  DONE ){.      rc
13670 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d   = TCL_OK;.    }
13680 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c  else if( rc==SQL
13690 49 54 45 5f 42 55 53 59 20 7c 7c 20 72 63 3d 3d  ITE_BUSY || rc==
136a0 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 29 7b  SQLITE_LOCKED ){
136b0 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  .      Tcl_Appen
136c0 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
136d0 22 72 65 73 74 6f 72 65 20 66 61 69 6c 65 64 3a  "restore failed:
136e0 20 73 6f 75 72 63 65 20 64 61 74 61 62 61 73 65   source database
136f0 20 62 75 73 79 22 2c 0a 20 20 20 20 20 20 20 20   busy",.        
13700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
13710 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20  char*)0);.      
13720 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  rc = TCL_ERROR;.
13730 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
13740 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
13750 74 28 69 6e 74 65 72 70 2c 20 22 72 65 73 74 6f  t(interp, "resto
13760 72 65 20 66 61 69 6c 65 64 3a 20 22 2c 0a 20 20  re failed: ",.  
13770 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
13780 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62 29  _errmsg(pDb->db)
13790 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20  , (char*)0);.   
137a0 20 20 20 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f     rc = TCL_ERRO
137b0 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  R;.    }.    sql
137c0 69 74 65 33 5f 63 6c 6f 73 65 28 70 53 72 63 29  ite3_close(pSrc)
137d0 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  ;.    break;.  }
137e0 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20  ..  /*.  **     
137f0 24 64 62 20 73 74 61 74 75 73 20 28 73 74 65 70  $db status (step
13800 7c 73 6f 72 74 7c 61 75 74 6f 69 6e 64 65 78 29  |sort|autoindex)
13810 0a 20 20 2a 2a 0a 20 20 2a 2a 20 44 69 73 70 6c  .  **.  ** Displ
13820 61 79 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54  ay SQLITE_STMTST
13830 41 54 55 53 5f 46 55 4c 4c 53 43 41 4e 5f 53 54  ATUS_FULLSCAN_ST
13840 45 50 20 6f 72 20 0a 20 20 2a 2a 20 53 51 4c 49  EP or .  ** SQLI
13850 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 53 4f  TE_STMTSTATUS_SO
13860 52 54 20 66 6f 72 20 74 68 65 20 6d 6f 73 74 20  RT for the most 
13870 72 65 63 65 6e 74 20 65 76 61 6c 2e 0a 20 20 2a  recent eval..  *
13880 2f 0a 20 20 63 61 73 65 20 44 42 5f 53 54 41 54  /.  case DB_STAT
13890 55 53 3a 20 7b 0a 20 20 20 20 69 6e 74 20 76 3b  US: {.    int v;
138a0 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
138b0 2a 7a 4f 70 3b 0a 20 20 20 20 69 66 28 20 6f 62  *zOp;.    if( ob
138c0 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 54  jc!=3 ){.      T
138d0 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
138e0 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c  interp, 2, objv,
138f0 20 22 28 73 74 65 70 7c 73 6f 72 74 29 22 29 3b   "(step|sort)");
13900 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
13910 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
13920 20 20 20 7a 4f 70 20 3d 20 54 63 6c 5f 47 65 74     zOp = Tcl_Get
13930 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b  String(objv[2]);
13940 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28  .    if( strcmp(
13950 7a 4f 70 2c 20 22 73 74 65 70 22 29 3d 3d 30 20  zOp, "step")==0 
13960 29 7b 0a 20 20 20 20 20 20 76 20 3d 20 70 44 62  ){.      v = pDb
13970 2d 3e 6e 53 74 65 70 3b 0a 20 20 20 20 7d 65 6c  ->nStep;.    }el
13980 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4f  se if( strcmp(zO
13990 70 2c 20 22 73 6f 72 74 22 29 3d 3d 30 20 29 7b  p, "sort")==0 ){
139a0 0a 20 20 20 20 20 20 76 20 3d 20 70 44 62 2d 3e  .      v = pDb->
139b0 6e 53 6f 72 74 3b 0a 20 20 20 20 7d 65 6c 73 65  nSort;.    }else
139c0 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4f 70 2c   if( strcmp(zOp,
139d0 20 22 61 75 74 6f 69 6e 64 65 78 22 29 3d 3d 30   "autoindex")==0
139e0 20 29 7b 0a 20 20 20 20 20 20 76 20 3d 20 70 44   ){.      v = pD
139f0 62 2d 3e 6e 49 6e 64 65 78 3b 0a 20 20 20 20 7d  b->nIndex;.    }
13a00 65 6c 73 65 7b 0a 20 20 20 20 20 20 54 63 6c 5f  else{.      Tcl_
13a10 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
13a20 65 72 70 2c 20 0a 20 20 20 20 20 20 20 20 20 20  erp, .          
13a30 20 20 22 62 61 64 20 61 72 67 75 6d 65 6e 74 3a    "bad argument:
13a40 20 73 68 6f 75 6c 64 20 62 65 20 61 75 74 6f 69   should be autoi
13a50 6e 64 65 78 2c 20 73 74 65 70 2c 20 6f 72 20 73  ndex, step, or s
13a60 6f 72 74 22 2c 20 0a 20 20 20 20 20 20 20 20 20  ort", .         
13a70 20 20 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20     (char*)0);.  
13a80 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
13a90 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
13aa0 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
13ab0 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
13ac0 49 6e 74 4f 62 6a 28 76 29 29 3b 0a 20 20 20 20  IntObj(v));.    
13ad0 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 0a 20 20  break;.  }.  .  
13ae0 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20  /*.  **     $db 
13af0 74 69 6d 65 6f 75 74 20 4d 49 4c 4c 45 53 45 43  timeout MILLESEC
13b00 4f 4e 44 53 0a 20 20 2a 2a 0a 20 20 2a 2a 20 44  ONDS.  **.  ** D
13b10 65 6c 61 79 20 66 6f 72 20 74 68 65 20 6e 75 6d  elay for the num
13b20 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f  ber of milliseco
13b30 6e 64 73 20 73 70 65 63 69 66 69 65 64 20 77 68  nds specified wh
13b40 65 6e 20 61 20 66 69 6c 65 20 69 73 20 6c 6f 63  en a file is loc
13b50 6b 65 64 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  ked..  */.  case
13b60 20 44 42 5f 54 49 4d 45 4f 55 54 3a 20 7b 0a 20   DB_TIMEOUT: {. 
13b70 20 20 20 69 6e 74 20 6d 73 3b 0a 20 20 20 20 69     int ms;.    i
13b80 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20  f( objc!=3 ){.  
13b90 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
13ba0 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20  Args(interp, 2, 
13bb0 6f 62 6a 76 2c 20 22 4d 49 4c 4c 49 53 45 43 4f  objv, "MILLISECO
13bc0 4e 44 53 22 29 3b 0a 20 20 20 20 20 20 72 65 74  NDS");.      ret
13bd0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
13be0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 54 63 6c     }.    if( Tcl
13bf0 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
13c00 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20  nterp, objv[2], 
13c10 26 6d 73 29 20 29 20 72 65 74 75 72 6e 20 54 43  &ms) ) return TC
13c20 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 73 71 6c  L_ERROR;.    sql
13c30 69 74 65 33 5f 62 75 73 79 5f 74 69 6d 65 6f 75  ite3_busy_timeou
13c40 74 28 70 44 62 2d 3e 64 62 2c 20 6d 73 29 3b 0a  t(pDb->db, ms);.
13c50 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20      break;.  }. 
13c60 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20   .  /*.  **     
13c70 24 64 62 20 74 6f 74 61 6c 5f 63 68 61 6e 67 65  $db total_change
13c80 73 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75  s.  **.  ** Retu
13c90 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
13ca0 20 72 6f 77 73 20 74 68 61 74 20 77 65 72 65 20   rows that were 
13cb0 6d 6f 64 69 66 69 65 64 2c 20 69 6e 73 65 72 74  modified, insert
13cc0 65 64 2c 20 6f 72 20 64 65 6c 65 74 65 64 20 0a  ed, or deleted .
13cd0 20 20 2a 2a 20 73 69 6e 63 65 20 74 68 65 20 64    ** since the d
13ce0 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 77  atabase handle w
13cf0 61 73 20 63 72 65 61 74 65 64 2e 0a 20 20 2a 2f  as created..  */
13d00 0a 20 20 63 61 73 65 20 44 42 5f 54 4f 54 41 4c  .  case DB_TOTAL
13d10 5f 43 48 41 4e 47 45 53 3a 20 7b 0a 20 20 20 20  _CHANGES: {.    
13d20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 73 75 6c 74  Tcl_Obj *pResult
13d30 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d  ;.    if( objc!=
13d40 32 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57  2 ){.      Tcl_W
13d50 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
13d60 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 22 29  rp, 2, objv, "")
13d70 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
13d80 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
13d90 20 20 20 20 70 52 65 73 75 6c 74 20 3d 20 54 63      pResult = Tc
13da0 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_GetObjResult(i
13db0 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f  nterp);.    Tcl_
13dc0 53 65 74 49 6e 74 4f 62 6a 28 70 52 65 73 75 6c  SetIntObj(pResul
13dd0 74 2c 20 73 71 6c 69 74 65 33 5f 74 6f 74 61 6c  t, sqlite3_total
13de0 5f 63 68 61 6e 67 65 73 28 70 44 62 2d 3e 64 62  _changes(pDb->db
13df0 29 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20  ));.    break;. 
13e00 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20   }..  /*    $db 
13e10 74 72 61 63 65 20 3f 43 41 4c 4c 42 41 43 4b 3f  trace ?CALLBACK?
13e20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 61 6b 65 20  .  **.  ** Make 
13e30 61 72 72 61 6e 67 65 6d 65 6e 74 73 20 74 6f 20  arrangements to 
13e40 69 6e 76 6f 6b 65 20 74 68 65 20 43 41 4c 4c 42  invoke the CALLB
13e50 41 43 4b 20 72 6f 75 74 69 6e 65 20 66 6f 72 20  ACK routine for 
13e60 65 61 63 68 20 53 51 4c 20 73 74 61 74 65 6d 65  each SQL stateme
13e70 6e 74 0a 20 20 2a 2a 20 74 68 61 74 20 69 73 20  nt.  ** that is 
13e80 65 78 65 63 75 74 65 64 2e 20 20 54 68 65 20 74  executed.  The t
13e90 65 78 74 20 6f 66 20 74 68 65 20 53 51 4c 20 69  ext of the SQL i
13ea0 73 20 61 70 70 65 6e 64 65 64 20 74 6f 20 43 41  s appended to CA
13eb0 4c 4c 42 41 43 4b 20 62 65 66 6f 72 65 0a 20 20  LLBACK before.  
13ec0 2a 2a 20 69 74 20 69 73 20 65 78 65 63 75 74 65  ** it is execute
13ed0 64 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  d..  */.  case D
13ee0 42 5f 54 52 41 43 45 3a 20 7b 0a 20 20 20 20 69  B_TRACE: {.    i
13ef0 66 28 20 6f 62 6a 63 3e 33 20 29 7b 0a 20 20 20  f( objc>3 ){.   
13f00 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
13f10 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
13f20 62 6a 76 2c 20 22 3f 43 41 4c 4c 42 41 43 4b 3f  bjv, "?CALLBACK?
13f30 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
13f40 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
13f50 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d  }else if( objc==
13f60 32 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  2 ){.      if( p
13f70 44 62 2d 3e 7a 54 72 61 63 65 20 29 7b 0a 20 20  Db->zTrace ){.  
13f80 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
13f90 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70  Result(interp, p
13fa0 44 62 2d 3e 7a 54 72 61 63 65 2c 20 30 29 3b 0a  Db->zTrace, 0);.
13fb0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
13fc0 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  e{.      char *z
13fd0 54 72 61 63 65 3b 0a 20 20 20 20 20 20 69 6e 74  Trace;.      int
13fe0 20 6c 65 6e 3b 0a 20 20 20 20 20 20 69 66 28 20   len;.      if( 
13ff0 70 44 62 2d 3e 7a 54 72 61 63 65 20 29 7b 0a 20  pDb->zTrace ){. 
14000 20 20 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28         Tcl_Free(
14010 70 44 62 2d 3e 7a 54 72 61 63 65 29 3b 0a 20 20  pDb->zTrace);.  
14020 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 54 72 61      }.      zTra
14030 63 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  ce = Tcl_GetStri
14040 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32  ngFromObj(objv[2
14050 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20  ], &len);.      
14060 69 66 28 20 7a 54 72 61 63 65 20 26 26 20 6c 65  if( zTrace && le
14070 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  n>0 ){.        p
14080 44 62 2d 3e 7a 54 72 61 63 65 20 3d 20 54 63 6c  Db->zTrace = Tcl
14090 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20 31 20  _Alloc( len + 1 
140a0 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  );.        memcp
140b0 79 28 70 44 62 2d 3e 7a 54 72 61 63 65 2c 20 7a  y(pDb->zTrace, z
140c0 54 72 61 63 65 2c 20 6c 65 6e 2b 31 29 3b 0a 20  Trace, len+1);. 
140d0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
140e0 20 20 20 20 70 44 62 2d 3e 7a 54 72 61 63 65 20      pDb->zTrace 
140f0 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66  = 0;.      }.#if
14100 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
14110 5f 54 52 41 43 45 0a 20 20 20 20 20 20 69 66 28  _TRACE.      if(
14120 20 70 44 62 2d 3e 7a 54 72 61 63 65 20 29 7b 0a   pDb->zTrace ){.
14130 20 20 20 20 20 20 20 20 70 44 62 2d 3e 69 6e 74          pDb->int
14140 65 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20  erp = interp;.  
14150 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 74 72        sqlite3_tr
14160 61 63 65 28 70 44 62 2d 3e 64 62 2c 20 44 62 54  ace(pDb->db, DbT
14170 72 61 63 65 48 61 6e 64 6c 65 72 2c 20 70 44 62  raceHandler, pDb
14180 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
14190 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
141a0 74 72 61 63 65 28 70 44 62 2d 3e 64 62 2c 20 30  trace(pDb->db, 0
141b0 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65  , 0);.      }.#e
141c0 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 62  ndif.    }.    b
141d0 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  reak;.  }..  /* 
141e0 20 20 20 24 64 62 20 74 72 61 6e 73 61 63 74 69     $db transacti
141f0 6f 6e 20 5b 2d 64 65 66 65 72 72 65 64 7c 2d 69  on [-deferred|-i
14200 6d 6d 65 64 69 61 74 65 7c 2d 65 78 63 6c 75 73  mmediate|-exclus
14210 69 76 65 5d 20 53 43 52 49 50 54 0a 20 20 2a 2a  ive] SCRIPT.  **
14220 0a 20 20 2a 2a 20 53 74 61 72 74 20 61 20 6e 65  .  ** Start a ne
14230 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 28 69  w transaction (i
14240 66 20 77 65 20 61 72 65 20 6e 6f 74 20 61 6c 72  f we are not alr
14250 65 61 64 79 20 69 6e 20 74 68 65 20 6d 69 64 73  eady in the mids
14260 74 20 6f 66 20 61 0a 20 20 2a 2a 20 74 72 61 6e  t of a.  ** tran
14270 73 61 63 74 69 6f 6e 29 20 61 6e 64 20 65 78 65  saction) and exe
14280 63 75 74 65 20 74 68 65 20 54 43 4c 20 73 63 72  cute the TCL scr
14290 69 70 74 20 53 43 52 49 50 54 2e 20 20 41 66 74  ipt SCRIPT.  Aft
142a0 65 72 20 53 43 52 49 50 54 0a 20 20 2a 2a 20 63  er SCRIPT.  ** c
142b0 6f 6d 70 6c 65 74 65 73 2c 20 65 69 74 68 65 72  ompletes, either
142c0 20 63 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e   commit the tran
142d0 73 61 63 74 69 6f 6e 20 6f 72 20 72 6f 6c 6c 20  saction or roll 
142e0 69 74 20 62 61 63 6b 20 69 66 20 53 43 52 49 50  it back if SCRIP
142f0 54 0a 20 20 2a 2a 20 74 68 72 6f 77 73 20 61 6e  T.  ** throws an
14300 20 65 78 63 65 70 74 69 6f 6e 2e 20 20 4f 72 20   exception.  Or 
14310 69 66 20 6e 6f 20 6e 65 77 20 74 72 61 6e 73 61  if no new transa
14320 74 69 6f 6e 20 77 61 73 20 73 74 61 72 74 65 64  tion was started
14330 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 0a 20 20  , do nothing..  
14340 2a 2a 20 70 61 73 73 20 74 68 65 20 65 78 63 65  ** pass the exce
14350 70 74 69 6f 6e 20 6f 6e 20 75 70 20 74 68 65 20  ption on up the 
14360 73 74 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  stack..  **.  **
14370 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20 77 61   This command wa
14380 73 20 69 6e 73 70 69 72 65 64 20 62 79 20 44 61  s inspired by Da
14390 76 65 20 54 68 6f 6d 61 73 27 73 20 74 61 6c 6b  ve Thomas's talk
143a0 20 6f 6e 20 52 75 62 79 20 61 74 20 74 68 65 0a   on Ruby at the.
143b0 20 20 2a 2a 20 32 30 30 35 20 4f 27 52 65 69 6c    ** 2005 O'Reil
143c0 6c 79 20 4f 70 65 6e 20 53 6f 75 72 63 65 20 43  ly Open Source C
143d0 6f 6e 76 65 6e 74 69 6f 6e 20 28 4f 53 43 4f 4e  onvention (OSCON
143e0 29 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  )..  */.  case D
143f0 42 5f 54 52 41 4e 53 41 43 54 49 4f 4e 3a 20 7b  B_TRANSACTION: {
14400 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 53  .    Tcl_Obj *pS
14410 63 72 69 70 74 3b 0a 20 20 20 20 63 6f 6e 73 74  cript;.    const
14420 20 63 68 61 72 20 2a 7a 42 65 67 69 6e 20 3d 20   char *zBegin = 
14430 22 53 41 56 45 50 4f 49 4e 54 20 5f 74 63 6c 5f  "SAVEPOINT _tcl_
14440 74 72 61 6e 73 61 63 74 69 6f 6e 22 3b 0a 20 20  transaction";.  
14450 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 26 26    if( objc!=3 &&
14460 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20   objc!=4 ){.    
14470 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
14480 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62  gs(interp, 2, ob
14490 6a 76 2c 20 22 5b 54 59 50 45 5d 20 53 43 52 49  jv, "[TYPE] SCRI
144a0 50 54 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  PT");.      retu
144b0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
144c0 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 44 62    }..    if( pDb
144d0 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  ->nTransaction==
144e0 30 20 26 26 20 6f 62 6a 63 3d 3d 34 20 29 7b 0a  0 && objc==4 ){.
144f0 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e        static con
14500 73 74 20 63 68 61 72 20 2a 54 54 59 50 45 5f 73  st char *TTYPE_s
14510 74 72 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20  trs[] = {.      
14520 20 20 22 64 65 66 65 72 72 65 64 22 2c 20 20 20    "deferred",   
14530 22 65 78 63 6c 75 73 69 76 65 22 2c 20 20 22 69  "exclusive",  "i
14540 6d 6d 65 64 69 61 74 65 22 2c 20 30 0a 20 20 20  mmediate", 0.   
14550 20 20 20 7d 3b 0a 20 20 20 20 20 20 65 6e 75 6d     };.      enum
14560 20 54 54 59 50 45 5f 65 6e 75 6d 20 7b 0a 20 20   TTYPE_enum {.  
14570 20 20 20 20 20 20 54 54 59 50 45 5f 44 45 46 45        TTYPE_DEFE
14580 52 52 45 44 2c 20 54 54 59 50 45 5f 45 58 43 4c  RRED, TTYPE_EXCL
14590 55 53 49 56 45 2c 20 54 54 59 50 45 5f 49 4d 4d  USIVE, TTYPE_IMM
145a0 45 44 49 41 54 45 0a 20 20 20 20 20 20 7d 3b 0a  EDIATE.      };.
145b0 20 20 20 20 20 20 69 6e 74 20 74 74 79 70 65 3b        int ttype;
145c0 0a 20 20 20 20 20 20 69 66 28 20 54 63 6c 5f 47  .      if( Tcl_G
145d0 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69  etIndexFromObj(i
145e0 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20  nterp, objv[2], 
145f0 54 54 59 50 45 5f 73 74 72 73 2c 20 22 74 72 61  TTYPE_strs, "tra
14600 6e 73 61 63 74 69 6f 6e 20 74 79 70 65 22 2c 0a  nsaction type",.
14610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c                0,
14630 20 26 74 74 79 70 65 29 20 29 7b 0a 20 20 20 20   &ttype) ){.    
14640 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
14650 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20  RROR;.      }.  
14660 20 20 20 20 73 77 69 74 63 68 28 20 28 65 6e 75      switch( (enu
14670 6d 20 54 54 59 50 45 5f 65 6e 75 6d 29 74 74 79  m TTYPE_enum)tty
14680 70 65 20 29 7b 0a 20 20 20 20 20 20 20 20 63 61  pe ){.        ca
14690 73 65 20 54 54 59 50 45 5f 44 45 46 45 52 52 45  se TTYPE_DEFERRE
146a0 44 3a 20 20 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a  D:    /* no-op *
146b0 2f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /;              
146c0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
146d0 20 20 63 61 73 65 20 54 54 59 50 45 5f 45 58 43    case TTYPE_EXC
146e0 4c 55 53 49 56 45 3a 20 20 20 7a 42 65 67 69 6e  LUSIVE:   zBegin
146f0 20 3d 20 22 42 45 47 49 4e 20 45 58 43 4c 55 53   = "BEGIN EXCLUS
14700 49 56 45 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20  IVE";  break;.  
14710 20 20 20 20 20 20 63 61 73 65 20 54 54 59 50 45        case TTYPE
14720 5f 49 4d 4d 45 44 49 41 54 45 3a 20 20 20 7a 42  _IMMEDIATE:   zB
14730 65 67 69 6e 20 3d 20 22 42 45 47 49 4e 20 49 4d  egin = "BEGIN IM
14740 4d 45 44 49 41 54 45 22 3b 20 20 62 72 65 61 6b  MEDIATE";  break
14750 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
14760 20 20 20 20 70 53 63 72 69 70 74 20 3d 20 6f 62      pScript = ob
14770 6a 76 5b 6f 62 6a 63 2d 31 5d 3b 0a 0a 20 20 20  jv[objc-1];..   
14780 20 2f 2a 20 52 75 6e 20 74 68 65 20 53 51 4c 69   /* Run the SQLi
14790 74 65 20 42 45 47 49 4e 20 63 6f 6d 6d 61 6e 64  te BEGIN command
147a0 20 74 6f 20 6f 70 65 6e 20 61 20 74 72 61 6e 73   to open a trans
147b0 61 63 74 69 6f 6e 20 6f 72 20 73 61 76 65 70 6f  action or savepo
147c0 69 6e 74 2e 20 2a 2f 0a 20 20 20 20 70 44 62 2d  int. */.    pDb-
147d0 3e 64 69 73 61 62 6c 65 41 75 74 68 2b 2b 3b 0a  >disableAuth++;.
147e0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
147f0 5f 65 78 65 63 28 70 44 62 2d 3e 64 62 2c 20 7a  _exec(pDb->db, z
14800 42 65 67 69 6e 2c 20 30 2c 20 30 2c 20 30 29 3b  Begin, 0, 0, 0);
14810 0a 20 20 20 20 70 44 62 2d 3e 64 69 73 61 62 6c  .    pDb->disabl
14820 65 41 75 74 68 2d 2d 3b 0a 20 20 20 20 69 66 28  eAuth--;.    if(
14830 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
14840 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65  {.      Tcl_Appe
14850 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
14860 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
14870 70 44 62 2d 3e 64 62 29 2c 20 30 29 3b 0a 20 20  pDb->db), 0);.  
14880 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
14890 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
148a0 70 44 62 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f  pDb->nTransactio
148b0 6e 2b 2b 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  n++;..    /* If 
148c0 75 73 69 6e 67 20 4e 52 45 2c 20 73 63 68 65 64  using NRE, sched
148d0 75 6c 65 20 61 20 63 61 6c 6c 62 61 63 6b 20 74  ule a callback t
148e0 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20 73 63 72  o invoke the scr
148f0 69 70 74 20 70 53 63 72 69 70 74 2c 20 74 68 65  ipt pScript, the
14900 6e 0a 20 20 20 20 2a 2a 20 61 20 73 65 63 6f 6e  n.    ** a secon
14910 64 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20 63 6f  d callback to co
14920 6d 6d 69 74 20 28 6f 72 20 72 6f 6c 6c 62 61 63  mmit (or rollbac
14930 6b 29 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  k) the transacti
14940 6f 6e 20 6f 72 20 73 61 76 65 70 6f 69 6e 74 0a  on or savepoint.
14950 20 20 20 20 2a 2a 20 6f 70 65 6e 65 64 20 61 62      ** opened ab
14960 6f 76 65 2e 20 49 66 20 6e 6f 74 20 75 73 69 6e  ove. If not usin
14970 67 20 4e 52 45 2c 20 65 76 61 6c 75 61 74 65 20  g NRE, evaluate 
14980 74 68 65 20 73 63 72 69 70 74 20 64 69 72 65 63  the script direc
14990 74 6c 79 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a  tly, then.    **
149a0 20 63 61 6c 6c 20 66 75 6e 63 74 69 6f 6e 20 44   call function D
149b0 62 54 72 61 6e 73 50 6f 73 74 43 6d 64 28 29 20  bTransPostCmd() 
149c0 74 6f 20 63 6f 6d 6d 69 74 20 28 6f 72 20 72 6f  to commit (or ro
149d0 6c 6c 62 61 63 6b 29 20 74 68 65 20 74 72 61 6e  llback) the tran
149e0 73 61 63 74 69 6f 6e 20 0a 20 20 20 20 2a 2a 20  saction .    ** 
149f0 6f 72 20 73 61 76 65 70 6f 69 6e 74 2e 20 20 2a  or savepoint.  *
14a00 2f 0a 20 20 20 20 69 66 28 20 44 62 55 73 65 4e  /.    if( DbUseN
14a10 72 65 28 29 20 29 7b 0a 20 20 20 20 20 20 54 63  re() ){.      Tc
14a20 6c 5f 4e 52 41 64 64 43 61 6c 6c 62 61 63 6b 28  l_NRAddCallback(
14a30 69 6e 74 65 72 70 2c 20 44 62 54 72 61 6e 73 50  interp, DbTransP
14a40 6f 73 74 43 6d 64 2c 20 63 64 2c 20 30 2c 20 30  ostCmd, cd, 0, 0
14a50 2c 20 30 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f  , 0);.      Tcl_
14a60 4e 52 45 76 61 6c 4f 62 6a 28 69 6e 74 65 72 70  NREvalObj(interp
14a70 2c 20 70 53 63 72 69 70 74 2c 20 30 29 3b 0a 20  , pScript, 0);. 
14a80 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
14a90 72 63 20 3d 20 44 62 54 72 61 6e 73 50 6f 73 74  rc = DbTransPost
14aa0 43 6d 64 28 26 63 64 2c 20 69 6e 74 65 72 70 2c  Cmd(&cd, interp,
14ab0 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69   Tcl_EvalObjEx(i
14ac0 6e 74 65 72 70 2c 20 70 53 63 72 69 70 74 2c 20  nterp, pScript, 
14ad0 30 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62  0));.    }.    b
14ae0 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a  reak;.  }..  /*.
14af0 20 20 2a 2a 20 20 20 20 24 64 62 20 75 6e 6c 6f    **    $db unlo
14b00 63 6b 5f 6e 6f 74 69 66 79 20 3f 73 63 72 69 70  ck_notify ?scrip
14b10 74 3f 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  t?.  */.  case D
14b20 42 5f 55 4e 4c 4f 43 4b 5f 4e 4f 54 49 46 59 3a  B_UNLOCK_NOTIFY:
14b30 20 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   {.#ifndef SQLIT
14b40 45 5f 45 4e 41 42 4c 45 5f 55 4e 4c 4f 43 4b 5f  E_ENABLE_UNLOCK_
14b50 4e 4f 54 49 46 59 0a 20 20 20 20 54 63 6c 5f 41  NOTIFY.    Tcl_A
14b60 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
14b70 72 70 2c 20 22 75 6e 6c 6f 63 6b 5f 6e 6f 74 69  rp, "unlock_noti
14b80 66 79 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65  fy not available
14b90 20 69 6e 20 74 68 69 73 20 62 75 69 6c 64 22 2c   in this build",
14ba0 20 30 29 3b 0a 20 20 20 20 72 63 20 3d 20 54 43   0);.    rc = TC
14bb0 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 20  L_ERROR;.#else. 
14bc0 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 26     if( objc!=2 &
14bd0 26 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20  & objc!=3 ){.   
14be0 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
14bf0 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
14c00 62 6a 76 2c 20 22 3f 53 43 52 49 50 54 3f 22 29  bjv, "?SCRIPT?")
14c10 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c  ;.      rc = TCL
14c20 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73  _ERROR;.    }els
14c30 65 7b 0a 20 20 20 20 20 20 76 6f 69 64 20 28 2a  e{.      void (*
14c40 78 4e 6f 74 69 66 79 29 28 76 6f 69 64 20 2a 2a  xNotify)(void **
14c50 2c 20 69 6e 74 29 20 3d 20 30 3b 0a 20 20 20 20  , int) = 0;.    
14c60 20 20 76 6f 69 64 20 2a 70 4e 6f 74 69 66 79 41    void *pNotifyA
14c70 72 67 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 69  rg = 0;..      i
14c80 66 28 20 70 44 62 2d 3e 70 55 6e 6c 6f 63 6b 4e  f( pDb->pUnlockN
14c90 6f 74 69 66 79 20 29 7b 0a 20 20 20 20 20 20 20  otify ){.       
14ca0 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
14cb0 74 28 70 44 62 2d 3e 70 55 6e 6c 6f 63 6b 4e 6f  t(pDb->pUnlockNo
14cc0 74 69 66 79 29 3b 0a 20 20 20 20 20 20 20 20 70  tify);.        p
14cd0 44 62 2d 3e 70 55 6e 6c 6f 63 6b 4e 6f 74 69 66  Db->pUnlockNotif
14ce0 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  y = 0;.      }. 
14cf0 20 0a 20 20 20 20 20 20 69 66 28 20 6f 62 6a 63   .      if( objc
14d00 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20 20 20 78  ==3 ){.        x
14d10 4e 6f 74 69 66 79 20 3d 20 44 62 55 6e 6c 6f 63  Notify = DbUnloc
14d20 6b 4e 6f 74 69 66 79 3b 0a 20 20 20 20 20 20 20  kNotify;.       
14d30 20 70 4e 6f 74 69 66 79 41 72 67 20 3d 20 28 76   pNotifyArg = (v
14d40 6f 69 64 20 2a 29 70 44 62 3b 0a 20 20 20 20 20  oid *)pDb;.     
14d50 20 20 20 70 44 62 2d 3e 70 55 6e 6c 6f 63 6b 4e     pDb->pUnlockN
14d60 6f 74 69 66 79 20 3d 20 6f 62 6a 76 5b 32 5d 3b  otify = objv[2];
14d70 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 49 6e 63  .        Tcl_Inc
14d80 72 52 65 66 43 6f 75 6e 74 28 70 44 62 2d 3e 70  rRefCount(pDb->p
14d90 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 29 3b 0a 20  UnlockNotify);. 
14da0 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20       }.  .      
14db0 69 66 28 20 73 71 6c 69 74 65 33 5f 75 6e 6c 6f  if( sqlite3_unlo
14dc0 63 6b 5f 6e 6f 74 69 66 79 28 70 44 62 2d 3e 64  ck_notify(pDb->d
14dd0 62 2c 20 78 4e 6f 74 69 66 79 2c 20 70 4e 6f 74  b, xNotify, pNot
14de0 69 66 79 41 72 67 29 20 29 7b 0a 20 20 20 20 20  ifyArg) ){.     
14df0 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
14e00 75 6c 74 28 69 6e 74 65 72 70 2c 20 73 71 6c 69  ult(interp, sqli
14e10 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e  te3_errmsg(pDb->
14e20 64 62 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  db), 0);.       
14e30 20 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b   rc = TCL_ERROR;
14e40 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
14e50 65 6e 64 69 66 0a 20 20 20 20 62 72 65 61 6b 3b  endif.    break;
14e60 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
14e70 20 20 20 24 64 62 20 77 61 6c 5f 68 6f 6f 6b 20     $db wal_hook 
14e80 3f 73 63 72 69 70 74 3f 0a 20 20 2a 2a 20 20 20  ?script?.  **   
14e90 20 24 64 62 20 75 70 64 61 74 65 5f 68 6f 6f 6b   $db update_hook
14ea0 20 3f 73 63 72 69 70 74 3f 0a 20 20 2a 2a 20 20   ?script?.  **  
14eb0 20 20 24 64 62 20 72 6f 6c 6c 62 61 63 6b 5f 68    $db rollback_h
14ec0 6f 6f 6b 20 3f 73 63 72 69 70 74 3f 0a 20 20 2a  ook ?script?.  *
14ed0 2f 0a 20 20 63 61 73 65 20 44 42 5f 57 41 4c 5f  /.  case DB_WAL_
14ee0 48 4f 4f 4b 3a 20 0a 20 20 63 61 73 65 20 44 42  HOOK: .  case DB
14ef0 5f 55 50 44 41 54 45 5f 48 4f 4f 4b 3a 20 0a 20  _UPDATE_HOOK: . 
14f00 20 63 61 73 65 20 44 42 5f 52 4f 4c 4c 42 41 43   case DB_ROLLBAC
14f10 4b 5f 48 4f 4f 4b 3a 20 7b 0a 0a 20 20 20 20 2f  K_HOOK: {..    /
14f20 2a 20 73 65 74 20 70 70 48 6f 6f 6b 20 74 6f 20  * set ppHook to 
14f30 70 6f 69 6e 74 20 61 74 20 70 55 70 64 61 74 65  point at pUpdate
14f40 48 6f 6f 6b 20 6f 72 20 70 52 6f 6c 6c 62 61 63  Hook or pRollbac
14f50 6b 48 6f 6f 6b 2c 20 64 65 70 65 6e 64 69 6e 67  kHook, depending
14f60 20 6f 6e 20 0a 20 20 20 20 2a 2a 20 77 68 65 74   on .    ** whet
14f70 68 65 72 20 5b 24 64 62 20 75 70 64 61 74 65 5f  her [$db update_
14f80 68 6f 6f 6b 5d 20 6f 72 20 5b 24 64 62 20 72 6f  hook] or [$db ro
14f90 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 5d 20 77 61 73  llback_hook] was
14fa0 20 69 6e 76 6f 6b 65 64 2e 0a 20 20 20 20 2a 2f   invoked..    */
14fb0 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 70  .    Tcl_Obj **p
14fc0 70 48 6f 6f 6b 3b 20 0a 20 20 20 20 69 66 28 20  pHook; .    if( 
14fd0 63 68 6f 69 63 65 3d 3d 44 42 5f 55 50 44 41 54  choice==DB_UPDAT
14fe0 45 5f 48 4f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  E_HOOK ){.      
14ff0 70 70 48 6f 6f 6b 20 3d 20 26 70 44 62 2d 3e 70  ppHook = &pDb->p
15000 55 70 64 61 74 65 48 6f 6f 6b 3b 0a 20 20 20 20  UpdateHook;.    
15010 7d 65 6c 73 65 20 69 66 28 20 63 68 6f 69 63 65  }else if( choice
15020 3d 3d 44 42 5f 57 41 4c 5f 48 4f 4f 4b 20 29 7b  ==DB_WAL_HOOK ){
15030 0a 20 20 20 20 20 20 70 70 48 6f 6f 6b 20 3d 20  .      ppHook = 
15040 26 70 44 62 2d 3e 70 4c 6f 67 48 6f 6f 6b 3b 0a  &pDb->pLogHook;.
15050 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
15060 20 70 70 48 6f 6f 6b 20 3d 20 26 70 44 62 2d 3e   ppHook = &pDb->
15070 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 3b 0a 20  pRollbackHook;. 
15080 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 6f 62     }..    if( ob
15090 6a 63 21 3d 32 20 26 26 20 6f 62 6a 63 21 3d 33  jc!=2 && objc!=3
150a0 20 29 7b 0a 20 20 20 20 20 20 20 54 63 6c 5f 57   ){.       Tcl_W
150b0 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
150c0 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 53  rp, 2, objv, "?S
150d0 43 52 49 50 54 3f 22 29 3b 0a 20 20 20 20 20 20  CRIPT?");.      
150e0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
150f0 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  R;.    }.    if(
15100 20 2a 70 70 48 6f 6f 6b 20 29 7b 0a 20 20 20 20   *ppHook ){.    
15110 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
15120 6c 74 28 69 6e 74 65 72 70 2c 20 2a 70 70 48 6f  lt(interp, *ppHo
15130 6f 6b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6f  ok);.      if( o
15140 62 6a 63 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20  bjc==3 ){.      
15150 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
15160 6e 74 28 2a 70 70 48 6f 6f 6b 29 3b 0a 20 20 20  nt(*ppHook);.   
15170 20 20 20 20 20 2a 70 70 48 6f 6f 6b 20 3d 20 30       *ppHook = 0
15180 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
15190 20 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d 33 20      if( objc==3 
151a0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
151b0 20 21 28 2a 70 70 48 6f 6f 6b 29 20 29 3b 0a 20   !(*ppHook) );. 
151c0 20 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74       if( Tcl_Get
151d0 43 68 61 72 4c 65 6e 67 74 68 28 6f 62 6a 76 5b  CharLength(objv[
151e0 32 5d 29 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  2])>0 ){.       
151f0 20 2a 70 70 48 6f 6f 6b 20 3d 20 6f 62 6a 76 5b   *ppHook = objv[
15200 32 5d 3b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f  2];.        Tcl_
15210 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 2a 70 70  IncrRefCount(*pp
15220 48 6f 6f 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Hook);.      }. 
15230 20 20 20 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65     }..    sqlite
15240 33 5f 75 70 64 61 74 65 5f 68 6f 6f 6b 28 70 44  3_update_hook(pD
15250 62 2d 3e 64 62 2c 20 28 70 44 62 2d 3e 70 55 70  b->db, (pDb->pUp
15260 64 61 74 65 48 6f 6f 6b 3f 44 62 55 70 64 61 74  dateHook?DbUpdat
15270 65 48 61 6e 64 6c 65 72 3a 30 29 2c 20 70 44 62  eHandler:0), pDb
15280 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  );.    sqlite3_r
15290 6f 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 28 70 44 62  ollback_hook(pDb
152a0 2d 3e 64 62 2c 28 70 44 62 2d 3e 70 52 6f 6c 6c  ->db,(pDb->pRoll
152b0 62 61 63 6b 48 6f 6f 6b 3f 44 62 52 6f 6c 6c 62  backHook?DbRollb
152c0 61 63 6b 48 61 6e 64 6c 65 72 3a 30 29 2c 70 44  ackHandler:0),pD
152d0 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  b);.    sqlite3_
152e0 77 61 6c 5f 68 6f 6f 6b 28 70 44 62 2d 3e 64 62  wal_hook(pDb->db
152f0 2c 28 70 44 62 2d 3e 70 4c 6f 67 48 6f 6f 6b 3f  ,(pDb->pLogHook?
15300 44 62 4c 6f 67 48 61 6e 64 6c 65 72 3a 30 29 2c  DbLogHandler:0),
15310 70 44 62 29 3b 0a 0a 20 20 20 20 62 72 65 61 6b  pDb);..    break
15320 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24  ;.  }..  /*    $
15330 64 62 20 76 65 72 73 69 6f 6e 0a 20 20 2a 2a 0a  db version.  **.
15340 20 20 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20    ** Return the 
15350 76 65 72 73 69 6f 6e 20 73 74 72 69 6e 67 20 66  version string f
15360 6f 72 20 74 68 69 73 20 64 61 74 61 62 61 73 65  or this database
15370 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  ..  */.  case DB
15380 5f 56 45 52 53 49 4f 4e 3a 20 7b 0a 20 20 20 20  _VERSION: {.    
15390 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
153a0 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 73 71  terp, (char *)sq
153b0 6c 69 74 65 33 5f 6c 69 62 76 65 72 73 69 6f 6e  lite3_libversion
153c0 28 29 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b  (), TCL_STATIC);
153d0 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
153e0 0a 0a 20 20 7d 20 2f 2a 20 45 6e 64 20 6f 66 20  ..  } /* End of 
153f0 74 68 65 20 53 57 49 54 43 48 20 73 74 61 74 65  the SWITCH state
15400 6d 65 6e 74 20 2a 2f 0a 20 20 72 65 74 75 72 6e  ment */.  return
15410 20 72 63 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49   rc;.}..#if SQLI
15420 54 45 5f 54 43 4c 5f 4e 52 45 0a 2f 2a 0a 2a 2a  TE_TCL_NRE./*.**
15430 20 41 64 61 70 74 6f 72 20 74 68 61 74 20 70 72   Adaptor that pr
15440 6f 76 69 64 65 73 20 61 6e 20 6f 62 6a 43 6d 64  ovides an objCmd
15450 20 69 6e 74 65 72 66 61 63 65 20 74 6f 20 74 68   interface to th
15460 65 20 4e 52 45 2d 65 6e 61 62 6c 65 64 0a 2a 2a  e NRE-enabled.**
15470 20 69 6e 74 65 72 66 61 63 65 20 69 6d 70 6c 65   interface imple
15480 6d 65 6e 74 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  mentation..*/.st
15490 61 74 69 63 20 69 6e 74 20 44 62 4f 62 6a 43 6d  atic int DbObjCm
154a0 64 41 64 61 70 74 6f 72 28 0a 20 20 76 6f 69 64  dAdaptor(.  void
154b0 20 2a 63 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65   *cd,.  Tcl_Inte
154c0 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
154d0 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
154e0 6a 20 2a 63 6f 6e 73 74 2a 6f 62 6a 76 0a 29 7b  j *const*objv.){
154f0 0a 20 20 72 65 74 75 72 6e 20 54 63 6c 5f 4e 52  .  return Tcl_NR
15500 43 61 6c 6c 4f 62 6a 50 72 6f 63 28 69 6e 74 65  CallObjProc(inte
15510 72 70 2c 20 44 62 4f 62 6a 43 6d 64 2c 20 63 64  rp, DbObjCmd, cd
15520 2c 20 6f 62 6a 63 2c 20 6f 62 6a 76 29 3b 0a 7d  , objc, objv);.}
15530 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
15540 45 5f 54 43 4c 5f 4e 52 45 20 2a 2f 0a 0a 2f 2a  E_TCL_NRE */../*
15550 0a 2a 2a 20 20 20 73 71 6c 69 74 65 33 20 44 42  .**   sqlite3 DB
15560 4e 41 4d 45 20 46 49 4c 45 4e 41 4d 45 20 3f 2d  NAME FILENAME ?-
15570 76 66 73 20 56 46 53 4e 41 4d 45 3f 20 3f 2d 6b  vfs VFSNAME? ?-k
15580 65 79 20 4b 45 59 3f 20 3f 2d 72 65 61 64 6f 6e  ey KEY? ?-readon
15590 6c 79 20 42 4f 4f 4c 45 41 4e 3f 0a 2a 2a 20 20  ly BOOLEAN?.**  
155a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
155b0 20 20 20 20 20 20 20 20 20 3f 2d 63 72 65 61 74           ?-creat
155c0 65 20 42 4f 4f 4c 45 41 4e 3f 20 3f 2d 6e 6f 6d  e BOOLEAN? ?-nom
155d0 75 74 65 78 20 42 4f 4f 4c 45 41 4e 3f 0a 2a 2a  utex BOOLEAN?.**
155e0 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20  .** This is the 
155f0 6d 61 69 6e 20 54 63 6c 20 63 6f 6d 6d 61 6e 64  main Tcl command
15600 2e 20 20 57 68 65 6e 20 74 68 65 20 22 73 71 6c  .  When the "sql
15610 69 74 65 22 20 54 63 6c 20 63 6f 6d 6d 61 6e 64  ite" Tcl command
15620 20 69 73 0a 2a 2a 20 69 6e 76 6f 6b 65 64 2c 20   is.** invoked, 
15630 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e  this routine run
15640 73 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 61  s to process tha
15650 74 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a  t command..**.**
15660 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   The first argum
15670 65 6e 74 2c 20 44 42 4e 41 4d 45 2c 20 69 73 20  ent, DBNAME, is 
15680 61 6e 20 61 72 62 69 74 72 61 72 79 20 6e 61 6d  an arbitrary nam
15690 65 20 66 6f 72 20 61 20 6e 65 77 0a 2a 2a 20 64  e for a new.** d
156a0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
156b0 6f 6e 2e 20 20 54 68 69 73 20 63 6f 6d 6d 61 6e  on.  This comman
156c0 64 20 63 72 65 61 74 65 73 20 61 20 6e 65 77 20  d creates a new 
156d0 63 6f 6d 6d 61 6e 64 20 6e 61 6d 65 64 0a 2a 2a  command named.**
156e0 20 44 42 4e 41 4d 45 20 74 68 61 74 20 69 73 20   DBNAME that is 
156f0 75 73 65 64 20 74 6f 20 63 6f 6e 74 72 6f 6c 20  used to control 
15700 74 68 61 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  that connection.
15710 20 20 54 68 65 20 64 61 74 61 62 61 73 65 0a 2a    The database.*
15720 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20  * connection is 
15730 64 65 6c 65 74 65 64 20 77 68 65 6e 20 74 68 65  deleted when the
15740 20 44 42 4e 41 4d 45 20 63 6f 6d 6d 61 6e 64 20   DBNAME command 
15750 69 73 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a  is deleted..**.*
15760 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67  * The second arg
15770 75 6d 65 6e 74 20 69 73 20 74 68 65 20 6e 61 6d  ument is the nam
15780 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
15790 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2f 0a 73 74  e file..**.*/.st
157a0 61 74 69 63 20 69 6e 74 20 44 62 4d 61 69 6e 28  atic int DbMain(
157b0 76 6f 69 64 20 2a 63 64 2c 20 54 63 6c 5f 49 6e  void *cd, Tcl_In
157c0 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e  terp *interp, in
157d0 74 20 6f 62 6a 63 2c 54 63 6c 5f 4f 62 6a 20 2a  t objc,Tcl_Obj *
157e0 63 6f 6e 73 74 2a 6f 62 6a 76 29 7b 0a 20 20 53  const*objv){.  S
157f0 71 6c 69 74 65 44 62 20 2a 70 3b 0a 20 20 76 6f  qliteDb *p;.  vo
15800 69 64 20 2a 70 4b 65 79 20 3d 20 30 3b 0a 20 20  id *pKey = 0;.  
15810 69 6e 74 20 6e 4b 65 79 20 3d 20 30 3b 0a 20 20  int nKey = 0;.  
15820 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67  const char *zArg
15830 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73  ;.  char *zErrMs
15840 67 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f  g;.  int i;.  co
15850 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 3b  nst char *zFile;
15860 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
15870 56 66 73 20 3d 20 30 3b 0a 20 20 69 6e 74 20 66  Vfs = 0;.  int f
15880 6c 61 67 73 3b 0a 20 20 54 63 6c 5f 44 53 74 72  lags;.  Tcl_DStr
15890 69 6e 67 20 74 72 61 6e 73 6c 61 74 65 64 46 69  ing translatedFi
158a0 6c 65 6e 61 6d 65 3b 0a 0a 20 20 2f 2a 20 49 6e  lename;..  /* In
158b0 20 6e 6f 72 6d 61 6c 20 75 73 65 2c 20 65 61 63   normal use, eac
158c0 68 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  h TCL interprete
158d0 72 20 72 75 6e 73 20 69 6e 20 61 20 73 69 6e 67  r runs in a sing
158e0 6c 65 20 74 68 72 65 61 64 2e 20 20 53 6f 0a 20  le thread.  So. 
158f0 20 2a 2a 20 62 79 20 64 65 66 61 75 6c 74 2c 20   ** by default, 
15900 77 65 20 63 61 6e 20 74 75 72 6e 20 6f 66 20 6d  we can turn of m
15910 75 74 65 78 69 6e 67 20 6f 6e 20 53 51 4c 69 74  utexing on SQLit
15920 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
15930 63 74 69 6f 6e 73 2e 0a 20 20 2a 2a 20 48 6f 77  ctions..  ** How
15940 65 76 65 72 2c 20 66 6f 72 20 74 65 73 74 69 6e  ever, for testin
15950 67 20 70 75 72 70 6f 73 65 73 20 69 74 20 69 73  g purposes it is
15960 20 75 73 65 66 75 6c 20 74 6f 20 68 61 76 65 20   useful to have 
15970 6d 75 74 65 78 65 73 20 74 75 72 6e 65 64 0a 20  mutexes turned. 
15980 20 2a 2a 20 6f 6e 2e 20 20 53 6f 2c 20 62 79 20   ** on.  So, by 
15990 64 65 66 61 75 6c 74 2c 20 6d 75 74 65 78 65 73  default, mutexes
159a0 20 64 65 66 61 75 6c 74 20 6f 66 66 2e 20 20 42   default off.  B
159b0 75 74 20 69 66 20 63 6f 6d 70 69 6c 65 64 20 77  ut if compiled w
159c0 69 74 68 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f  ith.  ** SQLITE_
159d0 54 43 4c 5f 44 45 46 41 55 4c 54 5f 46 55 4c 4c  TCL_DEFAULT_FULL
159e0 4d 55 54 45 58 20 74 68 65 6e 20 6d 75 74 65 78  MUTEX then mutex
159f0 65 73 20 64 65 66 61 75 6c 74 20 6f 6e 2e 0a 20  es default on.. 
15a00 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
15a10 45 5f 54 43 4c 5f 44 45 46 41 55 4c 54 5f 46 55  E_TCL_DEFAULT_FU
15a20 4c 4c 4d 55 54 45 58 0a 20 20 66 6c 61 67 73 20  LLMUTEX.  flags 
15a30 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  = SQLITE_OPEN_RE
15a40 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45  ADWRITE | SQLITE
15a50 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c 20 53  _OPEN_CREATE | S
15a60 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d  QLITE_OPEN_FULLM
15a70 55 54 45 58 3b 0a 23 65 6c 73 65 0a 20 20 66 6c  UTEX;.#else.  fl
15a80 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45  ags = SQLITE_OPE
15a90 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53 51  N_READWRITE | SQ
15aa0 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
15ab0 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e   | SQLITE_OPEN_N
15ac0 4f 4d 55 54 45 58 3b 0a 23 65 6e 64 69 66 0a 0a  OMUTEX;.#endif..
15ad0 20 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b    if( objc==2 ){
15ae0 0a 20 20 20 20 7a 41 72 67 20 3d 20 54 63 6c 5f  .    zArg = Tcl_
15af0 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
15b00 28 6f 62 6a 76 5b 31 5d 2c 20 30 29 3b 0a 20 20  (objv[1], 0);.  
15b10 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 41 72    if( strcmp(zAr
15b20 67 2c 22 2d 76 65 72 73 69 6f 6e 22 29 3d 3d 30  g,"-version")==0
15b30 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70   ){.      Tcl_Ap
15b40 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
15b50 70 2c 73 71 6c 69 74 65 33 5f 76 65 72 73 69 6f  p,sqlite3_versio
15b60 6e 2c 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75  n,0);.      retu
15b70 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d  rn TCL_OK;.    }
15b80 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28  .    if( strcmp(
15b90 7a 41 72 67 2c 22 2d 68 61 73 2d 63 6f 64 65 63  zArg,"-has-codec
15ba0 22 29 3d 3d 30 20 29 7b 0a 23 69 66 64 65 66 20  ")==0 ){.#ifdef 
15bb0 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43  SQLITE_HAS_CODEC
15bc0 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  .      Tcl_Appen
15bd0 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22  dResult(interp,"
15be0 31 22 2c 30 29 3b 0a 23 65 6c 73 65 0a 20 20 20  1",0);.#else.   
15bf0 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
15c00 75 6c 74 28 69 6e 74 65 72 70 2c 22 30 22 2c 30  ult(interp,"0",0
15c10 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  );.#endif.      
15c20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20  return TCL_OK;. 
15c30 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69     }.  }.  for(i
15c40 3d 33 3b 20 69 2b 31 3c 6f 62 6a 63 3b 20 69 2b  =3; i+1<objc; i+
15c50 3d 32 29 7b 0a 20 20 20 20 7a 41 72 67 20 3d 20  =2){.    zArg = 
15c60 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
15c70 6a 76 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28 20  jv[i]);.    if( 
15c80 73 74 72 63 6d 70 28 7a 41 72 67 2c 22 2d 6b 65  strcmp(zArg,"-ke
15c90 79 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  y")==0 ){.      
15ca0 70 4b 65 79 20 3d 20 54 63 6c 5f 47 65 74 42 79  pKey = Tcl_GetBy
15cb0 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6f  teArrayFromObj(o
15cc0 62 6a 76 5b 69 2b 31 5d 2c 20 26 6e 4b 65 79 29  bjv[i+1], &nKey)
15cd0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
15ce0 73 74 72 63 6d 70 28 7a 41 72 67 2c 20 22 2d 76  strcmp(zArg, "-v
15cf0 66 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  fs")==0 ){.     
15d00 20 69 2b 2b 3b 0a 20 20 20 20 20 20 7a 56 66 73   i++;.      zVfs
15d10 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
15d20 28 6f 62 6a 76 5b 69 5d 29 3b 0a 20 20 20 20 7d  (objv[i]);.    }
15d30 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
15d40 7a 41 72 67 2c 20 22 2d 72 65 61 64 6f 6e 6c 79  zArg, "-readonly
15d50 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ")==0 ){.      i
15d60 6e 74 20 62 3b 0a 20 20 20 20 20 20 69 66 28 20  nt b;.      if( 
15d70 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72  Tcl_GetBooleanFr
15d80 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
15d90 6a 76 5b 69 2b 31 5d 2c 20 26 62 29 20 29 20 72  jv[i+1], &b) ) r
15da0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
15db0 0a 20 20 20 20 20 20 69 66 28 20 62 20 29 7b 0a  .      if( b ){.
15dc0 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 26 3d          flags &=
15dd0 20 7e 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52   ~(SQLITE_OPEN_R
15de0 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f  EADWRITE|SQLITE_
15df0 4f 50 45 4e 5f 43 52 45 41 54 45 29 3b 0a 20 20  OPEN_CREATE);.  
15e00 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 53        flags |= S
15e10 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
15e20 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  NLY;.      }else
15e30 7b 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73 20  {.        flags 
15e40 26 3d 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  &= ~SQLITE_OPEN_
15e50 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20  READONLY;.      
15e60 20 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54    flags |= SQLIT
15e70 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
15e80 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
15e90 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a  lse if( strcmp(z
15ea0 41 72 67 2c 20 22 2d 63 72 65 61 74 65 22 29 3d  Arg, "-create")=
15eb0 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =0 ){.      int 
15ec0 62 3b 0a 20 20 20 20 20 20 69 66 28 20 54 63 6c  b;.      if( Tcl
15ed0 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f  _GetBooleanFromO
15ee0 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
15ef0 69 2b 31 5d 2c 20 26 62 29 20 29 20 72 65 74 75  i+1], &b) ) retu
15f00 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
15f10 20 20 20 20 69 66 28 20 62 20 26 26 20 28 66 6c      if( b && (fl
15f20 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
15f30 4e 5f 52 45 41 44 4f 4e 4c 59 29 3d 3d 30 20 29  N_READONLY)==0 )
15f40 7b 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73 20  {.        flags 
15f50 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43  |= SQLITE_OPEN_C
15f60 52 45 41 54 45 3b 0a 20 20 20 20 20 20 7d 65 6c  REATE;.      }el
15f70 73 65 7b 0a 20 20 20 20 20 20 20 20 66 6c 61 67  se{.        flag
15f80 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 4f 50 45  s &= ~SQLITE_OPE
15f90 4e 5f 43 52 45 41 54 45 3b 0a 20 20 20 20 20 20  N_CREATE;.      
15fa0 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  }.    }else if( 
15fb0 73 74 72 63 6d 70 28 7a 41 72 67 2c 20 22 2d 6e  strcmp(zArg, "-n
15fc0 6f 6d 75 74 65 78 22 29 3d 3d 30 20 29 7b 0a 20  omutex")==0 ){. 
15fd0 20 20 20 20 20 69 6e 74 20 62 3b 0a 20 20 20 20       int b;.    
15fe0 20 20 69 66 28 20 54 63 6c 5f 47 65 74 42 6f 6f    if( Tcl_GetBoo
15ff0 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  leanFromObj(inte
16000 72 70 2c 20 6f 62 6a 76 5b 69 2b 31 5d 2c 20 26  rp, objv[i+1], &
16010 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
16020 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 69 66 28  ERROR;.      if(
16030 20 62 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6c   b ){.        fl
16040 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50  ags |= SQLITE_OP
16050 45 4e 5f 4e 4f 4d 55 54 45 58 3b 0a 20 20 20 20  EN_NOMUTEX;.    
16060 20 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 53 51      flags &= ~SQ
16070 4c 49 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55  LITE_OPEN_FULLMU
16080 54 45 58 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  TEX;.      }else
16090 7b 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73 20  {.        flags 
160a0 26 3d 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  &= ~SQLITE_OPEN_
160b0 4e 4f 4d 55 54 45 58 3b 0a 20 20 20 20 20 20 7d  NOMUTEX;.      }
160c0 0a 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74  .   }else if( st
160d0 72 63 6d 70 28 7a 41 72 67 2c 20 22 2d 66 75 6c  rcmp(zArg, "-ful
160e0 6c 6d 75 74 65 78 22 29 3d 3d 30 20 29 7b 0a 20  lmutex")==0 ){. 
160f0 20 20 20 20 20 69 6e 74 20 62 3b 0a 20 20 20 20       int b;.    
16100 20 20 69 66 28 20 54 63 6c 5f 47 65 74 42 6f 6f    if( Tcl_GetBoo
16110 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  leanFromObj(inte
16120 72 70 2c 20 6f 62 6a 76 5b 69 2b 31 5d 2c 20 26  rp, objv[i+1], &
16130 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
16140 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 69 66 28  ERROR;.      if(
16150 20 62 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6c   b ){.        fl
16160 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50  ags |= SQLITE_OP
16170 45 4e 5f 46 55 4c 4c 4d 55 54 45 58 3b 0a 20 20  EN_FULLMUTEX;.  
16180 20 20 20 20 20 20 66 6c 61 67 73 20 26 3d 20 7e        flags &= ~
16190 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55  SQLITE_OPEN_NOMU
161a0 54 45 58 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  TEX;.      }else
161b0 7b 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73 20  {.        flags 
161c0 26 3d 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  &= ~SQLITE_OPEN_
161d0 46 55 4c 4c 4d 55 54 45 58 3b 0a 20 20 20 20 20  FULLMUTEX;.     
161e0 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
161f0 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
16200 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e  sult(interp, "un
16210 6b 6e 6f 77 6e 20 6f 70 74 69 6f 6e 3a 20 22 2c  known option: ",
16220 20 7a 41 72 67 2c 20 28 63 68 61 72 2a 29 30 29   zArg, (char*)0)
16230 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
16240 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
16250 20 20 7d 0a 20 20 69 66 28 20 6f 62 6a 63 3c 33    }.  if( objc<3
16260 20 7c 7c 20 28 6f 62 6a 63 26 31 29 21 3d 31 20   || (objc&1)!=1 
16270 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
16280 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
16290 31 2c 20 6f 62 6a 76 2c 20 0a 20 20 20 20 20 20  1, objv, .      
162a0 22 48 41 4e 44 4c 45 20 46 49 4c 45 4e 41 4d 45  "HANDLE FILENAME
162b0 20 3f 2d 76 66 73 20 56 46 53 4e 41 4d 45 3f 20   ?-vfs VFSNAME? 
162c0 3f 2d 72 65 61 64 6f 6e 6c 79 20 42 4f 4f 4c 45  ?-readonly BOOLE
162d0 41 4e 3f 20 3f 2d 63 72 65 61 74 65 20 42 4f 4f  AN? ?-create BOO
162e0 4c 45 41 4e 3f 22 0a 20 20 20 20 20 20 22 20 3f  LEAN?".      " ?
162f0 2d 6e 6f 6d 75 74 65 78 20 42 4f 4f 4c 45 41 4e  -nomutex BOOLEAN
16300 3f 20 3f 2d 66 75 6c 6c 6d 75 74 65 78 20 42 4f  ? ?-fullmutex BO
16310 4f 4c 45 41 4e 3f 22 0a 23 69 66 64 65 66 20 53  OLEAN?".#ifdef S
16320 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a  QLITE_HAS_CODEC.
16330 20 20 20 20 20 20 22 20 3f 2d 6b 65 79 20 43 4f        " ?-key CO
16340 44 45 43 4b 45 59 3f 22 0a 23 65 6e 64 69 66 0a  DECKEY?".#endif.
16350 20 20 20 20 29 3b 0a 20 20 20 20 72 65 74 75 72      );.    retur
16360 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
16370 0a 20 20 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a  .  zErrMsg = 0;.
16380 20 20 70 20 3d 20 28 53 71 6c 69 74 65 44 62 2a    p = (SqliteDb*
16390 29 54 63 6c 5f 41 6c 6c 6f 63 28 20 73 69 7a 65  )Tcl_Alloc( size
163a0 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69 66 28 20  of(*p) );.  if( 
163b0 70 3d 3d 30 20 29 7b 0a 20 20 20 20 54 63 6c 5f  p==0 ){.    Tcl_
163c0 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
163d0 2c 20 22 6d 61 6c 6c 6f 63 20 66 61 69 6c 65 64  , "malloc failed
163e0 22 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a  ", TCL_STATIC);.
163f0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
16400 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73  RROR;.  }.  mems
16410 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28  et(p, 0, sizeof(
16420 2a 70 29 29 3b 0a 20 20 7a 46 69 6c 65 20 3d 20  *p));.  zFile = 
16430 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
16440 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30 29  mObj(objv[2], 0)
16450 3b 0a 20 20 7a 46 69 6c 65 20 3d 20 54 63 6c 5f  ;.  zFile = Tcl_
16460 54 72 61 6e 73 6c 61 74 65 46 69 6c 65 4e 61 6d  TranslateFileNam
16470 65 28 69 6e 74 65 72 70 2c 20 7a 46 69 6c 65 2c  e(interp, zFile,
16480 20 26 74 72 61 6e 73 6c 61 74 65 64 46 69 6c 65   &translatedFile
16490 6e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  name);.  sqlite3
164a0 5f 6f 70 65 6e 5f 76 32 28 7a 46 69 6c 65 2c 20  _open_v2(zFile, 
164b0 26 70 2d 3e 64 62 2c 20 66 6c 61 67 73 2c 20 7a  &p->db, flags, z
164c0 56 66 73 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72  Vfs);.  Tcl_DStr
164d0 69 6e 67 46 72 65 65 28 26 74 72 61 6e 73 6c 61  ingFree(&transla
164e0 74 65 64 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  tedFilename);.  
164f0 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73  if( SQLITE_OK!=s
16500 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28 70  qlite3_errcode(p
16510 2d 3e 64 62 29 20 29 7b 0a 20 20 20 20 7a 45 72  ->db) ){.    zEr
16520 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d  rMsg = sqlite3_m
16530 70 72 69 6e 74 66 28 22 25 73 22 2c 20 73 71 6c  printf("%s", sql
16540 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64  ite3_errmsg(p->d
16550 62 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  b));.    sqlite3
16560 5f 63 6c 6f 73 65 28 70 2d 3e 64 62 29 3b 0a 20  _close(p->db);. 
16570 20 20 20 70 2d 3e 64 62 20 3d 20 30 3b 0a 20 20     p->db = 0;.  
16580 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
16590 48 41 53 5f 43 4f 44 45 43 0a 20 20 69 66 28 20  HAS_CODEC.  if( 
165a0 70 2d 3e 64 62 20 29 7b 0a 20 20 20 20 73 71 6c  p->db ){.    sql
165b0 69 74 65 33 5f 6b 65 79 28 70 2d 3e 64 62 2c 20  ite3_key(p->db, 
165c0 70 4b 65 79 2c 20 6e 4b 65 79 29 3b 0a 20 20 7d  pKey, nKey);.  }
165d0 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 2d  .#endif.  if( p-
165e0 3e 64 62 3d 3d 30 20 29 7b 0a 20 20 20 20 54 63  >db==0 ){.    Tc
165f0 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
16600 72 70 2c 20 7a 45 72 72 4d 73 67 2c 20 54 43 4c  rp, zErrMsg, TCL
16610 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 20 20  _VOLATILE);.    
16620 54 63 6c 5f 46 72 65 65 28 28 63 68 61 72 2a 29  Tcl_Free((char*)
16630 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  p);.    sqlite3_
16640 66 72 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20  free(zErrMsg);. 
16650 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
16660 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d 61  ROR;.  }.  p->ma
16670 78 53 74 6d 74 20 3d 20 4e 55 4d 5f 50 52 45 50  xStmt = NUM_PREP
16680 41 52 45 44 5f 53 54 4d 54 53 3b 0a 20 20 70 2d  ARED_STMTS;.  p-
16690 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70  >interp = interp
166a0 3b 0a 20 20 7a 41 72 67 20 3d 20 54 63 6c 5f 47  ;.  zArg = Tcl_G
166b0 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
166c0 6f 62 6a 76 5b 31 5d 2c 20 30 29 3b 0a 20 20 69  objv[1], 0);.  i
166d0 66 28 20 44 62 55 73 65 4e 72 65 28 29 20 29 7b  f( DbUseNre() ){
166e0 0a 20 20 20 20 54 63 6c 5f 4e 52 43 72 65 61 74  .    Tcl_NRCreat
166f0 65 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c  eCommand(interp,
16700 20 7a 41 72 67 2c 20 44 62 4f 62 6a 43 6d 64 41   zArg, DbObjCmdA
16710 64 61 70 74 6f 72 2c 20 44 62 4f 62 6a 43 6d 64  daptor, DbObjCmd
16720 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
16730 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
16740 29 70 2c 20 44 62 44 65 6c 65 74 65 43 6d 64 29  )p, DbDeleteCmd)
16750 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 54  ;.  }else{.    T
16760 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d  cl_CreateObjComm
16770 61 6e 64 28 69 6e 74 65 72 70 2c 20 7a 41 72 67  and(interp, zArg
16780 2c 20 44 62 4f 62 6a 43 6d 64 2c 20 28 63 68 61  , DbObjCmd, (cha
16790 72 2a 29 70 2c 20 44 62 44 65 6c 65 74 65 43 6d  r*)p, DbDeleteCm
167a0 64 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  d);.  }.  return
167b0 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
167c0 2a 20 50 72 6f 76 69 64 65 20 61 20 64 75 6d 6d  * Provide a dumm
167d0 79 20 54 63 6c 5f 49 6e 69 74 53 74 75 62 73 20  y Tcl_InitStubs 
167e0 69 66 20 77 65 20 61 72 65 20 75 73 69 6e 67 20  if we are using 
167f0 74 68 69 73 20 61 73 20 61 20 73 74 61 74 69 63  this as a static
16800 0a 2a 2a 20 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a  .** library..*/.
16810 23 69 66 6e 64 65 66 20 55 53 45 5f 54 43 4c 5f  #ifndef USE_TCL_
16820 53 54 55 42 53 0a 23 20 75 6e 64 65 66 20 20 54  STUBS.# undef  T
16830 63 6c 5f 49 6e 69 74 53 74 75 62 73 0a 23 20 64  cl_InitStubs.# d
16840 65 66 69 6e 65 20 54 63 6c 5f 49 6e 69 74 53 74  efine Tcl_InitSt
16850 75 62 73 28 61 2c 62 2c 63 29 0a 23 65 6e 64 69  ubs(a,b,c).#endi
16860 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75  f../*.** Make su
16870 72 65 20 77 65 20 68 61 76 65 20 61 20 50 41 43  re we have a PAC
16880 4b 41 47 45 5f 56 45 52 53 49 4f 4e 20 6d 61 63  KAGE_VERSION mac
16890 72 6f 20 64 65 66 69 6e 65 64 2e 20 20 54 68 69  ro defined.  Thi
168a0 73 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 64 65 66  s will be.** def
168b0 69 6e 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c  ined automatical
168c0 6c 79 20 62 79 20 74 68 65 20 54 45 41 20 6d 61  ly by the TEA ma
168d0 6b 65 66 69 6c 65 2e 20 20 42 75 74 20 6f 74 68  kefile.  But oth
168e0 65 72 20 6d 61 6b 65 66 69 6c 65 73 0a 2a 2a 20  er makefiles.** 
168f0 64 6f 20 6e 6f 74 20 64 65 66 69 6e 65 20 69 74  do not define it
16900 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 50 41 43  ..*/.#ifndef PAC
16910 4b 41 47 45 5f 56 45 52 53 49 4f 4e 0a 23 20 64  KAGE_VERSION.# d
16920 65 66 69 6e 65 20 50 41 43 4b 41 47 45 5f 56 45  efine PACKAGE_VE
16930 52 53 49 4f 4e 20 53 51 4c 49 54 45 5f 56 45 52  RSION SQLITE_VER
16940 53 49 4f 4e 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  SION.#endif../*.
16950 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  ** Initialize th
16960 69 73 20 6d 6f 64 75 6c 65 2e 0a 2a 2a 0a 2a 2a  is module..**.**
16970 20 54 68 69 73 20 54 63 6c 20 6d 6f 64 75 6c 65   This Tcl module
16980 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 6c 79 20 61   contains only a
16990 20 73 69 6e 67 6c 65 20 6e 65 77 20 54 63 6c 20   single new Tcl 
169a0 63 6f 6d 6d 61 6e 64 20 6e 61 6d 65 64 20 22 73  command named "s
169b0 71 6c 69 74 65 22 2e 0a 2a 2a 20 28 48 65 6e 63  qlite"..** (Henc
169c0 65 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 61  e there is no na
169d0 6d 65 73 70 61 63 65 2e 20 20 54 68 65 72 65 20  mespace.  There 
169e0 69 73 20 6e 6f 20 70 6f 69 6e 74 20 69 6e 20 75  is no point in u
169f0 73 69 6e 67 20 61 20 6e 61 6d 65 73 70 61 63 65  sing a namespace
16a00 0a 2a 2a 20 69 66 20 74 68 65 20 65 78 74 65 6e  .** if the exten
16a10 73 69 6f 6e 20 6f 6e 6c 79 20 73 75 70 70 6c 69  sion only suppli
16a20 65 73 20 6f 6e 65 20 6e 65 77 20 6e 61 6d 65 21  es one new name!
16a30 29 20 20 54 68 65 20 22 73 71 6c 69 74 65 22 20  )  The "sqlite" 
16a40 63 6f 6d 6d 61 6e 64 20 69 73 0a 2a 2a 20 75 73  command is.** us
16a50 65 64 20 74 6f 20 6f 70 65 6e 20 61 20 6e 65 77  ed to open a new
16a60 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73 65   SQLite database
16a70 2e 20 20 53 65 65 20 74 68 65 20 44 62 4d 61 69  .  See the DbMai
16a80 6e 28 29 20 72 6f 75 74 69 6e 65 20 61 62 6f 76  n() routine abov
16a90 65 0a 2a 2a 20 66 6f 72 20 61 64 64 69 74 69 6f  e.** for additio
16aa0 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  nal information.
16ab0 0a 2a 2f 0a 45 58 54 45 52 4e 20 69 6e 74 20 53  .*/.EXTERN int S
16ac0 71 6c 69 74 65 33 5f 49 6e 69 74 28 54 63 6c 5f  qlite3_Init(Tcl_
16ad0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b  Interp *interp){
16ae0 0a 20 20 54 63 6c 5f 49 6e 69 74 53 74 75 62 73  .  Tcl_InitStubs
16af0 28 69 6e 74 65 72 70 2c 20 22 38 2e 34 22 2c 20  (interp, "8.4", 
16b00 30 29 3b 0a 20 20 54 63 6c 5f 43 72 65 61 74 65  0);.  Tcl_Create
16b10 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72  ObjCommand(inter
16b20 70 2c 20 22 73 71 6c 69 74 65 33 22 2c 20 28 54  p, "sqlite3", (T
16b30 63 6c 5f 4f 62 6a 43 6d 64 50 72 6f 63 2a 29 44  cl_ObjCmdProc*)D
16b40 62 4d 61 69 6e 2c 20 30 2c 20 30 29 3b 0a 20 20  bMain, 0, 0);.  
16b50 54 63 6c 5f 50 6b 67 50 72 6f 76 69 64 65 28 69  Tcl_PkgProvide(i
16b60 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 33 22  nterp, "sqlite3"
16b70 2c 20 50 41 43 4b 41 47 45 5f 56 45 52 53 49 4f  , PACKAGE_VERSIO
16b80 4e 29 3b 0a 20 20 54 63 6c 5f 43 72 65 61 74 65  N);.  Tcl_Create
16b90 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72  ObjCommand(inter
16ba0 70 2c 20 22 73 71 6c 69 74 65 22 2c 20 28 54 63  p, "sqlite", (Tc
16bb0 6c 5f 4f 62 6a 43 6d 64 50 72 6f 63 2a 29 44 62  l_ObjCmdProc*)Db
16bc0 4d 61 69 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 54  Main, 0, 0);.  T
16bd0 63 6c 5f 50 6b 67 50 72 6f 76 69 64 65 28 69 6e  cl_PkgProvide(in
16be0 74 65 72 70 2c 20 22 73 71 6c 69 74 65 22 2c 20  terp, "sqlite", 
16bf0 50 41 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e 29  PACKAGE_VERSION)
16c00 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
16c10 4b 3b 0a 7d 0a 45 58 54 45 52 4e 20 69 6e 74 20  K;.}.EXTERN int 
16c20 54 63 6c 73 71 6c 69 74 65 33 5f 49 6e 69 74 28  Tclsqlite3_Init(
16c30 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
16c40 72 70 29 7b 20 72 65 74 75 72 6e 20 53 71 6c 69  rp){ return Sqli
16c50 74 65 33 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  te3_Init(interp)
16c60 3b 20 7d 0a 45 58 54 45 52 4e 20 69 6e 74 20 53  ; }.EXTERN int S
16c70 71 6c 69 74 65 33 5f 53 61 66 65 49 6e 69 74 28  qlite3_SafeInit(
16c80 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
16c90 72 70 29 7b 20 72 65 74 75 72 6e 20 54 43 4c 5f  rp){ return TCL_
16ca0 4f 4b 3b 20 7d 0a 45 58 54 45 52 4e 20 69 6e 74  OK; }.EXTERN int
16cb0 20 54 63 6c 73 71 6c 69 74 65 33 5f 53 61 66 65   Tclsqlite3_Safe
16cc0 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20  Init(Tcl_Interp 
16cd0 2a 69 6e 74 65 72 70 29 7b 20 72 65 74 75 72 6e  *interp){ return
16ce0 20 54 43 4c 5f 4f 4b 3b 20 7d 0a 45 58 54 45 52   TCL_OK; }.EXTER
16cf0 4e 20 69 6e 74 20 53 71 6c 69 74 65 33 5f 55 6e  N int Sqlite3_Un
16d00 6c 6f 61 64 28 54 63 6c 5f 49 6e 74 65 72 70 20  load(Tcl_Interp 
16d10 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 66 6c 61  *interp, int fla
16d20 67 73 29 7b 20 72 65 74 75 72 6e 20 54 43 4c 5f  gs){ return TCL_
16d30 4f 4b 3b 20 7d 0a 45 58 54 45 52 4e 20 69 6e 74  OK; }.EXTERN int
16d40 20 54 63 6c 73 71 6c 69 74 65 33 5f 55 6e 6c 6f   Tclsqlite3_Unlo
16d50 61 64 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  ad(Tcl_Interp *i
16d60 6e 74 65 72 70 2c 20 69 6e 74 20 66 6c 61 67 73  nterp, int flags
16d70 29 7b 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  ){ return TCL_OK
16d80 3b 20 7d 0a 45 58 54 45 52 4e 20 69 6e 74 20 53  ; }.EXTERN int S
16d90 71 6c 69 74 65 33 5f 53 61 66 65 55 6e 6c 6f 61  qlite3_SafeUnloa
16da0 64 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  d(Tcl_Interp *in
16db0 74 65 72 70 2c 20 69 6e 74 20 66 6c 61 67 73 29  terp, int flags)
16dc0 7b 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b  { return TCL_OK;
16dd0 20 7d 0a 45 58 54 45 52 4e 20 69 6e 74 20 54 63   }.EXTERN int Tc
16de0 6c 73 71 6c 69 74 65 33 5f 53 61 66 65 55 6e 6c  lsqlite3_SafeUnl
16df0 6f 61 64 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a  oad(Tcl_Interp *
16e00 69 6e 74 65 72 70 2c 20 69 6e 74 20 66 6c 61 67  interp, int flag
16e10 73 29 7b 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  s){ return TCL_O
16e20 4b 3b 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51  K;}...#ifndef SQ
16e30 4c 49 54 45 5f 33 5f 53 55 46 46 49 58 5f 4f 4e  LITE_3_SUFFIX_ON
16e40 4c 59 0a 45 58 54 45 52 4e 20 69 6e 74 20 53 71  LY.EXTERN int Sq
16e50 6c 69 74 65 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  lite_Init(Tcl_In
16e60 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 20 72  terp *interp){ r
16e70 65 74 75 72 6e 20 53 71 6c 69 74 65 33 5f 49 6e  eturn Sqlite3_In
16e80 69 74 28 69 6e 74 65 72 70 29 3b 20 7d 0a 45 58  it(interp); }.EX
16e90 54 45 52 4e 20 69 6e 74 20 54 63 6c 73 71 6c 69  TERN int Tclsqli
16ea0 74 65 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  te_Init(Tcl_Inte
16eb0 72 70 20 2a 69 6e 74 65 72 70 29 7b 20 72 65 74  rp *interp){ ret
16ec0 75 72 6e 20 53 71 6c 69 74 65 33 5f 49 6e 69 74  urn Sqlite3_Init
16ed0 28 69 6e 74 65 72 70 29 3b 20 7d 0a 45 58 54 45  (interp); }.EXTE
16ee0 52 4e 20 69 6e 74 20 53 71 6c 69 74 65 5f 53 61  RN int Sqlite_Sa
16ef0 66 65 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  feInit(Tcl_Inter
16f00 70 20 2a 69 6e 74 65 72 70 29 7b 20 72 65 74 75  p *interp){ retu
16f10 72 6e 20 54 43 4c 5f 4f 4b 3b 20 7d 0a 45 58 54  rn TCL_OK; }.EXT
16f20 45 52 4e 20 69 6e 74 20 54 63 6c 73 71 6c 69 74  ERN int Tclsqlit
16f30 65 5f 53 61 66 65 49 6e 69 74 28 54 63 6c 5f 49  e_SafeInit(Tcl_I
16f40 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 20  nterp *interp){ 
16f50 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 7d  return TCL_OK; }
16f60 0a 45 58 54 45 52 4e 20 69 6e 74 20 53 71 6c 69  .EXTERN int Sqli
16f70 74 65 5f 55 6e 6c 6f 61 64 28 54 63 6c 5f 49 6e  te_Unload(Tcl_In
16f80 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e  terp *interp, in
16f90 74 20 66 6c 61 67 73 29 7b 20 72 65 74 75 72 6e  t flags){ return
16fa0 20 54 43 4c 5f 4f 4b 3b 20 7d 0a 45 58 54 45 52   TCL_OK; }.EXTER
16fb0 4e 20 69 6e 74 20 54 63 6c 73 71 6c 69 74 65 5f  N int Tclsqlite_
16fc0 55 6e 6c 6f 61 64 28 54 63 6c 5f 49 6e 74 65 72  Unload(Tcl_Inter
16fd0 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 66  p *interp, int f
16fe0 6c 61 67 73 29 7b 20 72 65 74 75 72 6e 20 54 43  lags){ return TC
16ff0 4c 5f 4f 4b 3b 20 7d 0a 45 58 54 45 52 4e 20 69  L_OK; }.EXTERN i
17000 6e 74 20 53 71 6c 69 74 65 5f 53 61 66 65 55 6e  nt Sqlite_SafeUn
17010 6c 6f 61 64 28 54 63 6c 5f 49 6e 74 65 72 70 20  load(Tcl_Interp 
17020 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 66 6c 61  *interp, int fla
17030 67 73 29 7b 20 72 65 74 75 72 6e 20 54 43 4c 5f  gs){ return TCL_
17040 4f 4b 3b 20 7d 0a 45 58 54 45 52 4e 20 69 6e 74  OK; }.EXTERN int
17050 20 54 63 6c 73 71 6c 69 74 65 5f 53 61 66 65 55   Tclsqlite_SafeU
17060 6e 6c 6f 61 64 28 54 63 6c 5f 49 6e 74 65 72 70  nload(Tcl_Interp
17070 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 66 6c   *interp, int fl
17080 61 67 73 29 7b 20 72 65 74 75 72 6e 20 54 43 4c  ags){ return TCL
17090 5f 4f 4b 3b 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  _OK;}.#endif..#i
170a0 66 64 65 66 20 54 43 4c 53 48 0a 2f 2a 2a 2a 2a  fdef TCLSH./****
170b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
170c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
170d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
170e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
170f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 41 6c 6c  *********.** All
17100 20 6f 66 20 74 68 65 20 63 6f 64 65 20 74 68 61   of the code tha
17110 74 20 66 6f 6c 6c 6f 77 73 20 69 73 20 75 73 65  t follows is use
17120 64 20 74 6f 20 62 75 69 6c 64 20 73 74 61 6e 64  d to build stand
17130 61 6c 6f 6e 65 20 54 43 4c 20 69 6e 74 65 72 70  alone TCL interp
17140 72 65 74 65 72 73 0a 2a 2a 20 74 68 61 74 20 61  reters.** that a
17150 72 65 20 73 74 61 74 69 63 61 6c 6c 79 20 6c 69  re statically li
17160 6e 6b 65 64 20 77 69 74 68 20 53 51 4c 69 74 65  nked with SQLite
17170 2e 20 20 45 6e 61 62 6c 65 20 74 68 65 73 65 20  .  Enable these 
17180 62 79 20 63 6f 6d 70 69 6c 69 6e 67 0a 2a 2a 20  by compiling.** 
17190 77 69 74 68 20 2d 44 54 43 4c 53 48 3d 6e 20 77  with -DTCLSH=n w
171a0 68 65 72 65 20 6e 20 63 61 6e 20 62 65 20 31 20  here n can be 1 
171b0 6f 72 20 32 2e 20 20 41 6e 20 6e 20 6f 66 20 31  or 2.  An n of 1
171c0 20 67 65 6e 65 72 61 74 65 73 20 61 20 73 74 61   generates a sta
171d0 6e 64 61 72 64 0a 2a 2a 20 74 63 6c 73 68 20 62  ndard.** tclsh b
171e0 75 74 20 77 69 74 68 20 53 51 4c 69 74 65 20 62  ut with SQLite b
171f0 75 69 6c 74 20 69 6e 2e 20 20 41 6e 20 6e 20 6f  uilt in.  An n o
17200 66 20 32 20 67 65 6e 65 72 61 74 65 73 20 74 68  f 2 generates th
17210 65 20 53 51 4c 69 74 65 20 73 70 61 63 65 0a 2a  e SQLite space.*
17220 2a 20 61 6e 61 6c 79 73 69 73 20 70 72 6f 67 72  * analysis progr
17230 61 6d 2e 0a 2a 2f 0a 0a 23 69 66 20 64 65 66 69  am..*/..#if defi
17240 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29  ned(SQLITE_TEST)
17250 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49   || defined(SQLI
17260 54 45 5f 54 43 4c 4d 44 35 29 0a 2f 2a 0a 20 2a  TE_TCLMD5)./*. *
17270 20 54 68 69 73 20 63 6f 64 65 20 69 6d 70 6c 65   This code imple
17280 6d 65 6e 74 73 20 74 68 65 20 4d 44 35 20 6d 65  ments the MD5 me
17290 73 73 61 67 65 2d 64 69 67 65 73 74 20 61 6c 67  ssage-digest alg
172a0 6f 72 69 74 68 6d 2e 0a 20 2a 20 54 68 65 20 61  orithm.. * The a
172b0 6c 67 6f 72 69 74 68 6d 20 69 73 20 64 75 65 20  lgorithm is due 
172c0 74 6f 20 52 6f 6e 20 52 69 76 65 73 74 2e 20 20  to Ron Rivest.  
172d0 54 68 69 73 20 63 6f 64 65 20 77 61 73 0a 20 2a  This code was. *
172e0 20 77 72 69 74 74 65 6e 20 62 79 20 43 6f 6c 69   written by Coli
172f0 6e 20 50 6c 75 6d 62 20 69 6e 20 31 39 39 33 2c  n Plumb in 1993,
17300 20 6e 6f 20 63 6f 70 79 72 69 67 68 74 20 69 73   no copyright is
17310 20 63 6c 61 69 6d 65 64 2e 0a 20 2a 20 54 68 69   claimed.. * Thi
17320 73 20 63 6f 64 65 20 69 73 20 69 6e 20 74 68 65  s code is in the
17330 20 70 75 62 6c 69 63 20 64 6f 6d 61 69 6e 3b 20   public domain; 
17340 64 6f 20 77 69 74 68 20 69 74 20 77 68 61 74 20  do with it what 
17350 79 6f 75 20 77 69 73 68 2e 0a 20 2a 0a 20 2a 20  you wish.. *. * 
17360 45 71 75 69 76 61 6c 65 6e 74 20 63 6f 64 65 20  Equivalent code 
17370 69 73 20 61 76 61 69 6c 61 62 6c 65 20 66 72 6f  is available fro
17380 6d 20 52 53 41 20 44 61 74 61 20 53 65 63 75 72  m RSA Data Secur
17390 69 74 79 2c 20 49 6e 63 2e 0a 20 2a 20 54 68 69  ity, Inc.. * Thi
173a0 73 20 63 6f 64 65 20 68 61 73 20 62 65 65 6e 20  s code has been 
173b0 74 65 73 74 65 64 20 61 67 61 69 6e 73 74 20 74  tested against t
173c0 68 61 74 2c 20 61 6e 64 20 69 73 20 65 71 75 69  hat, and is equi
173d0 76 61 6c 65 6e 74 2c 0a 20 2a 20 65 78 63 65 70  valent,. * excep
173e0 74 20 74 68 61 74 20 79 6f 75 20 64 6f 6e 27 74  t that you don't
173f0 20 6e 65 65 64 20 74 6f 20 69 6e 63 6c 75 64 65   need to include
17400 20 74 77 6f 20 70 61 67 65 73 20 6f 66 20 6c 65   two pages of le
17410 67 61 6c 65 73 65 0a 20 2a 20 77 69 74 68 20 65  galese. * with e
17420 76 65 72 79 20 63 6f 70 79 2e 0a 20 2a 0a 20 2a  very copy.. *. *
17430 20 54 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20   To compute the 
17440 6d 65 73 73 61 67 65 20 64 69 67 65 73 74 20 6f  message digest o
17450 66 20 61 20 63 68 75 6e 6b 20 6f 66 20 62 79 74  f a chunk of byt
17460 65 73 2c 20 64 65 63 6c 61 72 65 20 61 6e 0a 20  es, declare an. 
17470 2a 20 4d 44 35 43 6f 6e 74 65 78 74 20 73 74 72  * MD5Context str
17480 75 63 74 75 72 65 2c 20 70 61 73 73 20 69 74 20  ucture, pass it 
17490 74 6f 20 4d 44 35 49 6e 69 74 2c 20 63 61 6c 6c  to MD5Init, call
174a0 20 4d 44 35 55 70 64 61 74 65 20 61 73 0a 20 2a   MD5Update as. *
174b0 20 6e 65 65 64 65 64 20 6f 6e 20 62 75 66 66 65   needed on buffe
174c0 72 73 20 66 75 6c 6c 20 6f 66 20 62 79 74 65 73  rs full of bytes
174d0 2c 20 61 6e 64 20 74 68 65 6e 20 63 61 6c 6c 20  , and then call 
174e0 4d 44 35 46 69 6e 61 6c 2c 20 77 68 69 63 68 0a  MD5Final, which.
174f0 20 2a 20 77 69 6c 6c 20 66 69 6c 6c 20 61 20 73   * will fill a s
17500 75 70 70 6c 69 65 64 20 31 36 2d 62 79 74 65 20  upplied 16-byte 
17510 61 72 72 61 79 20 77 69 74 68 20 74 68 65 20 64  array with the d
17520 69 67 65 73 74 2e 0a 20 2a 2f 0a 0a 2f 2a 0a 20  igest.. */../*. 
17530 2a 20 49 66 20 63 6f 6d 70 69 6c 65 64 20 6f 6e  * If compiled on
17540 20 61 20 6d 61 63 68 69 6e 65 20 74 68 61 74 20   a machine that 
17550 64 6f 65 73 6e 27 74 20 68 61 76 65 20 61 20 33  doesn't have a 3
17560 32 2d 62 69 74 20 69 6e 74 65 67 65 72 2c 0a 20  2-bit integer,. 
17570 2a 20 79 6f 75 20 6a 75 73 74 20 73 65 74 20 22  * you just set "
17580 75 69 6e 74 33 32 22 20 74 6f 20 74 68 65 20 61  uint32" to the a
17590 70 70 72 6f 70 72 69 61 74 65 20 64 61 74 61 74  ppropriate datat
175a0 79 70 65 20 66 6f 72 20 61 6e 0a 20 2a 20 75 6e  ype for an. * un
175b0 73 69 67 6e 65 64 20 33 32 2d 62 69 74 20 69 6e  signed 32-bit in
175c0 74 65 67 65 72 2e 20 20 46 6f 72 20 65 78 61 6d  teger.  For exam
175d0 70 6c 65 3a 0a 20 2a 0a 20 2a 20 20 20 20 20 20  ple:. *. *      
175e0 20 63 63 20 2d 44 75 69 6e 74 33 32 3d 27 75 6e   cc -Duint32='un
175f0 73 69 67 6e 65 64 20 6c 6f 6e 67 27 20 6d 64 35  signed long' md5
17600 2e 63 0a 20 2a 0a 20 2a 2f 0a 23 69 66 6e 64 65  .c. *. */.#ifnde
17610 66 20 75 69 6e 74 33 32 0a 23 20 20 64 65 66 69  f uint32.#  defi
17620 6e 65 20 75 69 6e 74 33 32 20 75 6e 73 69 67 6e  ne uint32 unsign
17630 65 64 20 69 6e 74 0a 23 65 6e 64 69 66 0a 0a 73  ed int.#endif..s
17640 74 72 75 63 74 20 4d 44 35 43 6f 6e 74 65 78 74  truct MD5Context
17650 20 7b 0a 20 20 69 6e 74 20 69 73 49 6e 69 74 3b   {.  int isInit;
17660 0a 20 20 75 69 6e 74 33 32 20 62 75 66 5b 34 5d  .  uint32 buf[4]
17670 3b 0a 20 20 75 69 6e 74 33 32 20 62 69 74 73 5b  ;.  uint32 bits[
17680 32 5d 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  2];.  unsigned c
17690 68 61 72 20 69 6e 5b 36 34 5d 3b 0a 7d 3b 0a 74  har in[64];.};.t
176a0 79 70 65 64 65 66 20 73 74 72 75 63 74 20 4d 44  ypedef struct MD
176b0 35 43 6f 6e 74 65 78 74 20 4d 44 35 43 6f 6e 74  5Context MD5Cont
176c0 65 78 74 3b 0a 0a 2f 2a 0a 20 2a 20 4e 6f 74 65  ext;../*. * Note
176d0 3a 20 74 68 69 73 20 63 6f 64 65 20 69 73 20 68  : this code is h
176e0 61 72 6d 6c 65 73 73 20 6f 6e 20 6c 69 74 74 6c  armless on littl
176f0 65 2d 65 6e 64 69 61 6e 20 6d 61 63 68 69 6e 65  e-endian machine
17700 73 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f  s.. */.static vo
17710 69 64 20 62 79 74 65 52 65 76 65 72 73 65 20 28  id byteReverse (
17720 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62  unsigned char *b
17730 75 66 2c 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  uf, unsigned lon
17740 67 73 29 7b 0a 20 20 20 20 20 20 20 20 75 69 6e  gs){.        uin
17750 74 33 32 20 74 3b 0a 20 20 20 20 20 20 20 20 64  t32 t;.        d
17760 6f 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  o {.            
17770 20 20 20 20 74 20 3d 20 28 75 69 6e 74 33 32 29      t = (uint32)
17780 28 28 75 6e 73 69 67 6e 65 64 29 62 75 66 5b 33  ((unsigned)buf[3
17790 5d 3c 3c 38 20 7c 20 62 75 66 5b 32 5d 29 20 3c  ]<<8 | buf[2]) <
177a0 3c 20 31 36 20 7c 0a 20 20 20 20 20 20 20 20 20  < 16 |.         
177b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
177c0 20 20 20 28 28 75 6e 73 69 67 6e 65 64 29 62 75     ((unsigned)bu
177d0 66 5b 31 5d 3c 3c 38 20 7c 20 62 75 66 5b 30 5d  f[1]<<8 | buf[0]
177e0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
177f0 20 20 20 2a 28 75 69 6e 74 33 32 20 2a 29 62 75     *(uint32 *)bu
17800 66 20 3d 20 74 3b 0a 20 20 20 20 20 20 20 20 20  f = t;.         
17810 20 20 20 20 20 20 20 62 75 66 20 2b 3d 20 34 3b         buf += 4;
17820 0a 20 20 20 20 20 20 20 20 7d 20 77 68 69 6c 65  .        } while
17830 20 28 2d 2d 6c 6f 6e 67 73 29 3b 0a 7d 0a 2f 2a   (--longs);.}./*
17840 20 54 68 65 20 66 6f 75 72 20 63 6f 72 65 20 66   The four core f
17850 75 6e 63 74 69 6f 6e 73 20 2d 20 46 31 20 69 73  unctions - F1 is
17860 20 6f 70 74 69 6d 69 7a 65 64 20 73 6f 6d 65 77   optimized somew
17870 68 61 74 20 2a 2f 0a 0a 2f 2a 20 23 64 65 66 69  hat */../* #defi
17880 6e 65 20 46 31 28 78 2c 20 79 2c 20 7a 29 20 28  ne F1(x, y, z) (
17890 78 20 26 20 79 20 7c 20 7e 78 20 26 20 7a 29 20  x & y | ~x & z) 
178a0 2a 2f 0a 23 64 65 66 69 6e 65 20 46 31 28 78 2c  */.#define F1(x,
178b0 20 79 2c 20 7a 29 20 28 7a 20 5e 20 28 78 20 26   y, z) (z ^ (x &
178c0 20 28 79 20 5e 20 7a 29 29 29 0a 23 64 65 66 69   (y ^ z))).#defi
178d0 6e 65 20 46 32 28 78 2c 20 79 2c 20 7a 29 20 46  ne F2(x, y, z) F
178e0 31 28 7a 2c 20 78 2c 20 79 29 0a 23 64 65 66 69  1(z, x, y).#defi
178f0 6e 65 20 46 33 28 78 2c 20 79 2c 20 7a 29 20 28  ne F3(x, y, z) (
17900 78 20 5e 20 79 20 5e 20 7a 29 0a 23 64 65 66 69  x ^ y ^ z).#defi
17910 6e 65 20 46 34 28 78 2c 20 79 2c 20 7a 29 20 28  ne F4(x, y, z) (
17920 79 20 5e 20 28 78 20 7c 20 7e 7a 29 29 0a 0a 2f  y ^ (x | ~z))../
17930 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 63 65  * This is the ce
17940 6e 74 72 61 6c 20 73 74 65 70 20 69 6e 20 74 68  ntral step in th
17950 65 20 4d 44 35 20 61 6c 67 6f 72 69 74 68 6d 2e  e MD5 algorithm.
17960 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 44 35 53   */.#define MD5S
17970 54 45 50 28 66 2c 20 77 2c 20 78 2c 20 79 2c 20  TEP(f, w, x, y, 
17980 7a 2c 20 64 61 74 61 2c 20 73 29 20 5c 0a 20 20  z, data, s) \.  
17990 20 20 20 20 20 20 28 20 77 20 2b 3d 20 66 28 78        ( w += f(x
179a0 2c 20 79 2c 20 7a 29 20 2b 20 64 61 74 61 2c 20  , y, z) + data, 
179b0 20 77 20 3d 20 77 3c 3c 73 20 7c 20 77 3e 3e 28   w = w<<s | w>>(
179c0 33 32 2d 73 29 2c 20 20 77 20 2b 3d 20 78 20 29  32-s),  w += x )
179d0 0a 0a 2f 2a 0a 20 2a 20 54 68 65 20 63 6f 72 65  ../*. * The core
179e0 20 6f 66 20 74 68 65 20 4d 44 35 20 61 6c 67 6f   of the MD5 algo
179f0 72 69 74 68 6d 2c 20 74 68 69 73 20 61 6c 74 65  rithm, this alte
17a00 72 73 20 61 6e 20 65 78 69 73 74 69 6e 67 20 4d  rs an existing M
17a10 44 35 20 68 61 73 68 20 74 6f 0a 20 2a 20 72 65  D5 hash to. * re
17a20 66 6c 65 63 74 20 74 68 65 20 61 64 64 69 74 69  flect the additi
17a30 6f 6e 20 6f 66 20 31 36 20 6c 6f 6e 67 77 6f 72  on of 16 longwor
17a40 64 73 20 6f 66 20 6e 65 77 20 64 61 74 61 2e 20  ds of new data. 
17a50 20 4d 44 35 55 70 64 61 74 65 20 62 6c 6f 63 6b   MD5Update block
17a60 73 0a 20 2a 20 74 68 65 20 64 61 74 61 20 61 6e  s. * the data an
17a70 64 20 63 6f 6e 76 65 72 74 73 20 62 79 74 65 73  d converts bytes
17a80 20 69 6e 74 6f 20 6c 6f 6e 67 77 6f 72 64 73 20   into longwords 
17a90 66 6f 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65  for this routine
17aa0 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  .. */.static voi
17ab0 64 20 4d 44 35 54 72 61 6e 73 66 6f 72 6d 28 75  d MD5Transform(u
17ac0 69 6e 74 33 32 20 62 75 66 5b 34 5d 2c 20 63 6f  int32 buf[4], co
17ad0 6e 73 74 20 75 69 6e 74 33 32 20 69 6e 5b 31 36  nst uint32 in[16
17ae0 5d 29 7b 0a 20 20 20 20 20 20 20 20 72 65 67 69  ]){.        regi
17af0 73 74 65 72 20 75 69 6e 74 33 32 20 61 2c 20 62  ster uint32 a, b
17b00 2c 20 63 2c 20 64 3b 0a 0a 20 20 20 20 20 20 20  , c, d;..       
17b10 20 61 20 3d 20 62 75 66 5b 30 5d 3b 0a 20 20 20   a = buf[0];.   
17b20 20 20 20 20 20 62 20 3d 20 62 75 66 5b 31 5d 3b       b = buf[1];
17b30 0a 20 20 20 20 20 20 20 20 63 20 3d 20 62 75 66  .        c = buf
17b40 5b 32 5d 3b 0a 20 20 20 20 20 20 20 20 64 20 3d  [2];.        d =
17b50 20 62 75 66 5b 33 5d 3b 0a 0a 20 20 20 20 20 20   buf[3];..      
17b60 20 20 4d 44 35 53 54 45 50 28 46 31 2c 20 61 2c    MD5STEP(F1, a,
17b70 20 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 20 30 5d   b, c, d, in[ 0]
17b80 2b 30 78 64 37 36 61 61 34 37 38 2c 20 20 37 29  +0xd76aa478,  7)
17b90 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45  ;.        MD5STE
17ba0 50 28 46 31 2c 20 64 2c 20 61 2c 20 62 2c 20 63  P(F1, d, a, b, c
17bb0 2c 20 69 6e 5b 20 31 5d 2b 30 78 65 38 63 37 62  , in[ 1]+0xe8c7b
17bc0 37 35 36 2c 20 31 32 29 3b 0a 20 20 20 20 20 20  756, 12);.      
17bd0 20 20 4d 44 35 53 54 45 50 28 46 31 2c 20 63 2c    MD5STEP(F1, c,
17be0 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 20 32 5d   d, a, b, in[ 2]
17bf0 2b 30 78 32 34 32 30 37 30 64 62 2c 20 31 37 29  +0x242070db, 17)
17c00 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45  ;.        MD5STE
17c10 50 28 46 31 2c 20 62 2c 20 63 2c 20 64 2c 20 61  P(F1, b, c, d, a
17c20 2c 20 69 6e 5b 20 33 5d 2b 30 78 63 31 62 64 63  , in[ 3]+0xc1bdc
17c30 65 65 65 2c 20 32 32 29 3b 0a 20 20 20 20 20 20  eee, 22);.      
17c40 20 20 4d 44 35 53 54 45 50 28 46 31 2c 20 61 2c    MD5STEP(F1, a,
17c50 20 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 20 34 5d   b, c, d, in[ 4]
17c60 2b 30 78 66 35 37 63 30 66 61 66 2c 20 20 37 29  +0xf57c0faf,  7)
17c70 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45  ;.        MD5STE
17c80 50 28 46 31 2c 20 64 2c 20 61 2c 20 62 2c 20 63  P(F1, d, a, b, c
17c90 2c 20 69 6e 5b 20 35 5d 2b 30 78 34 37 38 37 63  , in[ 5]+0x4787c
17ca0 36 32 61 2c 20 31 32 29 3b 0a 20 20 20 20 20 20  62a, 12);.      
17cb0 20 20 4d 44 35 53 54 45 50 28 46 31 2c 20 63 2c    MD5STEP(F1, c,
17cc0 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 20 36 5d   d, a, b, in[ 6]
17cd0 2b 30 78 61 38 33 30 34 36 31 33 2c 20 31 37 29  +0xa8304613, 17)
17ce0 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45  ;.        MD5STE
17cf0 50 28 46 31 2c 20 62 2c 20 63 2c 20 64 2c 20 61  P(F1, b, c, d, a
17d00 2c 20 69 6e 5b 20 37 5d 2b 30 78 66 64 34 36 39  , in[ 7]+0xfd469
17d10 35 30 31 2c 20 32 32 29 3b 0a 20 20 20 20 20 20  501, 22);.      
17d20 20 20 4d 44 35 53 54 45 50 28 46 31 2c 20 61 2c    MD5STEP(F1, a,
17d30 20 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 20 38 5d   b, c, d, in[ 8]
17d40 2b 30 78 36 39 38 30 39 38 64 38 2c 20 20 37 29  +0x698098d8,  7)
17d50 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45  ;.        MD5STE
17d60 50 28 46 31 2c 20 64 2c 20 61 2c 20 62 2c 20 63  P(F1, d, a, b, c
17d70 2c 20 69 6e 5b 20 39 5d 2b 30 78 38 62 34 34 66  , in[ 9]+0x8b44f
17d80 37 61 66 2c 20 31 32 29 3b 0a 20 20 20 20 20 20  7af, 12);.      
17d90 20 20 4d 44 35 53 54 45 50 28 46 31 2c 20 63 2c    MD5STEP(F1, c,
17da0 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 31 30 5d   d, a, b, in[10]
17db0 2b 30 78 66 66 66 66 35 62 62 31 2c 20 31 37 29  +0xffff5bb1, 17)
17dc0 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45  ;.        MD5STE
17dd0 50 28 46 31 2c 20 62 2c 20 63 2c 20 64 2c 20 61  P(F1, b, c, d, a
17de0 2c 20 69 6e 5b 31 31 5d 2b 30 78 38 39 35 63 64  , in[11]+0x895cd
17df0 37 62 65 2c 20 32 32 29 3b 0a 20 20 20 20 20 20  7be, 22);.      
17e00 20 20 4d 44 35 53 54 45 50 28 46 31 2c 20 61 2c    MD5STEP(F1, a,
17e10 20 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 31 32 5d   b, c, d, in[12]
17e20 2b 30 78 36 62 39 30 31 31 32 32 2c 20 20 37 29  +0x6b901122,  7)
17e30 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45  ;.        MD5STE
17e40 50 28 46 31 2c 20 64 2c 20 61 2c 20 62 2c 20 63  P(F1, d, a, b, c
17e50 2c 20 69 6e 5b 31 33 5d 2b 30 78 66 64 39 38 37  , in[13]+0xfd987
17e60 31 39 33 2c 20 31 32 29 3b 0a 20 20 20 20 20 20  193, 12);.      
17e70 20 20 4d 44 35 53 54 45 50 28 46 31 2c 20 63 2c    MD5STEP(F1, c,
17e80 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 31 34 5d   d, a, b, in[14]
17e90 2b 30 78 61 36 37 39 34 33 38 65 2c 20 31 37 29  +0xa679438e, 17)
17ea0 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45  ;.        MD5STE
17eb0 50 28 46 31 2c 20 62 2c 20 63 2c 20 64 2c 20 61  P(F1, b, c, d, a
17ec0 2c 20 69 6e 5b 31 35 5d 2b 30 78 34 39 62 34 30  , in[15]+0x49b40
17ed0 38 32 31 2c 20 32 32 29 3b 0a 0a 20 20 20 20 20  821, 22);..     
17ee0 20 20 20 4d 44 35 53 54 45 50 28 46 32 2c 20 61     MD5STEP(F2, a
17ef0 2c 20 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 20 31  , b, c, d, in[ 1
17f00 5d 2b 30 78 66 36 31 65 32 35 36 32 2c 20 20 35  ]+0xf61e2562,  5
17f10 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54  );.        MD5ST
17f20 45 50 28 46 32 2c 20 64 2c 20 61 2c 20 62 2c 20  EP(F2, d, a, b, 
17f30 63 2c 20 69 6e 5b 20 36 5d 2b 30 78 63 30 34 30  c, in[ 6]+0xc040
17f40 62 33 34 30 2c 20 20 39 29 3b 0a 20 20 20 20 20  b340,  9);.     
17f50 20 20 20 4d 44 35 53 54 45 50 28 46 32 2c 20 63     MD5STEP(F2, c
17f60 2c 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 31 31  , d, a, b, in[11
17f70 5d 2b 30 78 32 36 35 65 35 61 35 31 2c 20 31 34  ]+0x265e5a51, 14
17f80 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54  );.        MD5ST
17f90 45 50 28 46 32 2c 20 62 2c 20 63 2c 20 64 2c 20  EP(F2, b, c, d, 
17fa0 61 2c 20 69 6e 5b 20 30 5d 2b 30 78 65 39 62 36  a, in[ 0]+0xe9b6
17fb0 63 37 61 61 2c 20 32 30 29 3b 0a 20 20 20 20 20  c7aa, 20);.     
17fc0 20 20 20 4d 44 35 53 54 45 50 28 46 32 2c 20 61     MD5STEP(F2, a
17fd0 2c 20 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 20 35  , b, c, d, in[ 5
17fe0 5d 2b 30 78 64 36 32 66 31 30 35 64 2c 20 20 35  ]+0xd62f105d,  5
17ff0 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54  );.        MD5ST
18000 45 50 28 46 32 2c 20 64 2c 20 61 2c 20 62 2c 20  EP(F2, d, a, b, 
18010 63 2c 20 69 6e 5b 31 30 5d 2b 30 78 30 32 34 34  c, in[10]+0x0244
18020 31 34 35 33 2c 20 20 39 29 3b 0a 20 20 20 20 20  1453,  9);.     
18030 20 20 20 4d 44 35 53 54 45 50 28 46 32 2c 20 63     MD5STEP(F2, c
18040 2c 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 31 35  , d, a, b, in[15
18050 5d 2b 30 78 64 38 61 31 65 36 38 31 2c 20 31 34  ]+0xd8a1e681, 14
18060 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54  );.        MD5ST
18070 45 50 28 46 32 2c 20 62 2c 20 63 2c 20 64 2c 20  EP(F2, b, c, d, 
18080 61 2c 20 69 6e 5b 20 34 5d 2b 30 78 65 37 64 33  a, in[ 4]+0xe7d3
18090 66 62 63 38 2c 20 32 30 29 3b 0a 20 20 20 20 20  fbc8, 20);.     
180a0 20 20 20 4d 44 35 53 54 45 50 28 46 32 2c 20 61     MD5STEP(F2, a
180b0 2c 20 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 20 39  , b, c, d, in[ 9
180c0 5d 2b 30 78 32 31 65 31 63 64 65 36 2c 20 20 35  ]+0x21e1cde6,  5
180d0 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54  );.        MD5ST
180e0 45 50 28 46 32 2c 20 64 2c 20 61 2c 20 62 2c 20  EP(F2, d, a, b, 
180f0 63 2c 20 69 6e 5b 31 34 5d 2b 30 78 63 33 33 37  c, in[14]+0xc337
18100 30 37 64 36 2c 20 20 39 29 3b 0a 20 20 20 20 20  07d6,  9);.     
18110 20 20 20 4d 44 35 53 54 45 50 28 46 32 2c 20 63     MD5STEP(F2, c
18120 2c 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 20 33  , d, a, b, in[ 3
18130 5d 2b 30 78 66 34 64 35 30 64 38 37 2c 20 31 34  ]+0xf4d50d87, 14
18140 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54  );.        MD5ST
18150 45 50 28 46 32 2c 20 62 2c 20 63 2c 20 64 2c 20  EP(F2, b, c, d, 
18160 61 2c 20 69 6e 5b 20 38 5d 2b 30 78 34 35 35 61  a, in[ 8]+0x455a
18170 31 34 65 64 2c 20 32 30 29 3b 0a 20 20 20 20 20  14ed, 20);.     
18180 20 20 20 4d 44 35 53 54 45 50 28 46 32 2c 20 61     MD5STEP(F2, a
18190 2c 20 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 31 33  , b, c, d, in[13
181a0 5d 2b 30 78 61 39 65 33 65 39 30 35 2c 20 20 35  ]+0xa9e3e905,  5
181b0 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54  );.        MD5ST
181c0 45 50 28 46 32 2c 20 64 2c 20 61 2c 20 62 2c 20  EP(F2, d, a, b, 
181d0 63 2c 20 69 6e 5b 20 32 5d 2b 30 78 66 63 65 66  c, in[ 2]+0xfcef
181e0 61 33 66 38 2c 20 20 39 29 3b 0a 20 20 20 20 20  a3f8,  9);.     
181f0 20 20 20 4d 44 35 53 54 45 50 28 46 32 2c 20 63     MD5STEP(F2, c
18200 2c 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 20 37  , d, a, b, in[ 7
18210 5d 2b 30 78 36 37 36 66 30 32 64 39 2c 20 31 34  ]+0x676f02d9, 14
18220 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54  );.        MD5ST
18230 45 50 28 46 32 2c 20 62 2c 20 63 2c 20 64 2c 20  EP(F2, b, c, d, 
18240 61 2c 20 69 6e 5b 31 32 5d 2b 30 78 38 64 32 61  a, in[12]+0x8d2a
18250 34 63 38 61 2c 20 32 30 29 3b 0a 0a 20 20 20 20  4c8a, 20);..    
18260 20 20 20 20 4d 44 35 53 54 45 50 28 46 33 2c 20      MD5STEP(F3, 
18270 61 2c 20 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 20  a, b, c, d, in[ 
18280 35 5d 2b 30 78 66 66 66 61 33 39 34 32 2c 20 20  5]+0xfffa3942,  
18290 34 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53  4);.        MD5S
182a0 54 45 50 28 46 33 2c 20 64 2c 20 61 2c 20 62 2c  TEP(F3, d, a, b,
182b0 20 63 2c 20 69 6e 5b 20 38 5d 2b 30 78 38 37 37   c, in[ 8]+0x877
182c0 31 66 36 38 31 2c 20 31 31 29 3b 0a 20 20 20 20  1f681, 11);.    
182d0 20 20 20 20 4d 44 35 53 54 45 50 28 46 33 2c 20      MD5STEP(F3, 
182e0 63 2c 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 31  c, d, a, b, in[1
182f0 31 5d 2b 30 78 36 64 39 64 36 31 32 32 2c 20 31  1]+0x6d9d6122, 1
18300 36 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53  6);.        MD5S
18310 54 45 50 28 46 33 2c 20 62 2c 20 63 2c 20 64 2c  TEP(F3, b, c, d,
18320 20 61 2c 20 69 6e 5b 31 34 5d 2b 30 78 66 64 65   a, in[14]+0xfde
18330 35 33 38 30 63 2c 20 32 33 29 3b 0a 20 20 20 20  5380c, 23);.    
18340 20 20 20 20 4d 44 35 53 54 45 50 28 46 33 2c 20      MD5STEP(F3, 
18350 61 2c 20 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 20  a, b, c, d, in[ 
18360 31 5d 2b 30 78 61 34 62 65 65 61 34 34 2c 20 20  1]+0xa4beea44,  
18370 34 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53  4);.        MD5S
18380 54 45 50 28 46 33 2c 20 64 2c 20 61 2c 20 62 2c  TEP(F3, d, a, b,
18390 20 63 2c 20 69 6e 5b 20 34 5d 2b 30 78 34 62 64   c, in[ 4]+0x4bd
183a0 65 63 66 61 39 2c 20 31 31 29 3b 0a 20 20 20 20  ecfa9, 11);.    
183b0 20 20 20 20 4d 44 35 53 54 45 50 28 46 33 2c 20      MD5STEP(F3, 
183c0 63 2c 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 20  c, d, a, b, in[ 
183d0 37 5d 2b 30 78 66 36 62 62 34 62 36 30 2c 20 31  7]+0xf6bb4b60, 1
183e0 36 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53  6);.        MD5S
183f0 54 45 50 28 46 33 2c 20 62 2c 20 63 2c 20 64 2c  TEP(F3, b, c, d,
18400 20 61 2c 20 69 6e 5b 31 30 5d 2b 30 78 62 65 62   a, in[10]+0xbeb
18410 66 62 63 37 30 2c 20 32 33 29 3b 0a 20 20 20 20  fbc70, 23);.    
18420 20 20 20 20 4d 44 35 53 54 45 50 28 46 33 2c 20      MD5STEP(F3, 
18430 61 2c 20 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 31  a, b, c, d, in[1
18440 33 5d 2b 30 78 32 38 39 62 37 65 63 36 2c 20 20  3]+0x289b7ec6,  
18450 34 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53  4);.        MD5S
18460 54 45 50 28 46 33 2c 20 64 2c 20 61 2c 20 62 2c  TEP(F3, d, a, b,
18470 20 63 2c 20 69 6e 5b 20 30 5d 2b 30 78 65 61 61   c, in[ 0]+0xeaa
18480 31 32 37 66 61 2c 20 31 31 29 3b 0a 20 20 20 20  127fa, 11);.    
18490 20 20 20 20 4d 44 35 53 54 45 50 28 46 33 2c 20      MD5STEP(F3, 
184a0 63 2c 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 20  c, d, a, b, in[ 
184b0 33 5d 2b 30 78 64 34 65 66 33 30 38 35 2c 20 31  3]+0xd4ef3085, 1
184c0 36 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53  6);.        MD5S
184d0 54 45 50 28 46 33 2c 20 62 2c 20 63 2c 20 64 2c  TEP(F3, b, c, d,
184e0 20 61 2c 20 69 6e 5b 20 36 5d 2b 30 78 30 34 38   a, in[ 6]+0x048
184f0 38 31 64 30 35 2c 20 32 33 29 3b 0a 20 20 20 20  81d05, 23);.    
18500 20 20 20 20 4d 44 35 53 54 45 50 28 46 33 2c 20      MD5STEP(F3, 
18510 61 2c 20 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 20  a, b, c, d, in[ 
18520 39 5d 2b 30 78 64 39 64 34 64 30 33 39 2c 20 20  9]+0xd9d4d039,  
18530 34 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53  4);.        MD5S
18540 54 45 50 28 46 33 2c 20 64 2c 20 61 2c 20 62 2c  TEP(F3, d, a, b,
18550 20 63 2c 20 69 6e 5b 31 32 5d 2b 30 78 65 36 64   c, in[12]+0xe6d
18560 62 39 39 65 35 2c 20 31 31 29 3b 0a 20 20 20 20  b99e5, 11);.    
18570 20 20 20 20 4d 44 35 53 54 45 50 28 46 33 2c 20      MD5STEP(F3, 
18580 63 2c 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 31  c, d, a, b, in[1
18590 35 5d 2b 30 78 31 66 61 32 37 63 66 38 2c 20 31  5]+0x1fa27cf8, 1
185a0 36 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53  6);.        MD5S
185b0 54 45 50 28 46 33 2c 20 62 2c 20 63 2c 20 64 2c  TEP(F3, b, c, d,
185c0 20 61 2c 20 69 6e 5b 20 32 5d 2b 30 78 63 34 61   a, in[ 2]+0xc4a
185d0 63 35 36 36 35 2c 20 32 33 29 3b 0a 0a 20 20 20  c5665, 23);..   
185e0 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 34 2c       MD5STEP(F4,
185f0 20 61 2c 20 62 2c 20 63 2c 20 64 2c 20 69 6e 5b   a, b, c, d, in[
18600 20 30 5d 2b 30 78 66 34 32 39 32 32 34 34 2c 20   0]+0xf4292244, 
18610 20 36 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35   6);.        MD5
18620 53 54 45 50 28 46 34 2c 20 64 2c 20 61 2c 20 62  STEP(F4, d, a, b
18630 2c 20 63 2c 20 69 6e 5b 20 37 5d 2b 30 78 34 33  , c, in[ 7]+0x43
18640 32 61 66 66 39 37 2c 20 31 30 29 3b 0a 20 20 20  2aff97, 10);.   
18650 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 34 2c       MD5STEP(F4,
18660 20 63 2c 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b   c, d, a, b, in[
18670 31 34 5d 2b 30 78 61 62 39 34 32 33 61 37 2c 20  14]+0xab9423a7, 
18680 31 35 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35  15);.        MD5
18690 53 54 45 50 28 46 34 2c 20 62 2c 20 63 2c 20 64  STEP(F4, b, c, d
186a0 2c 20 61 2c 20 69 6e 5b 20 35 5d 2b 30 78 66 63  , a, in[ 5]+0xfc
186b0 39 33 61 30 33 39 2c 20 32 31 29 3b 0a 20 20 20  93a039, 21);.   
186c0 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 34 2c       MD5STEP(F4,
186d0 20 61 2c 20 62 2c 20 63 2c 20 64 2c 20 69 6e 5b   a, b, c, d, in[
186e0 31 32 5d 2b 30 78 36 35 35 62 35 39 63 33 2c 20  12]+0x655b59c3, 
186f0 20 36 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35   6);.        MD5
18700 53 54 45 50 28 46 34 2c 20 64 2c 20 61 2c 20 62  STEP(F4, d, a, b
18710 2c 20 63 2c 20 69 6e 5b 20 33 5d 2b 30 78 38 66  , c, in[ 3]+0x8f
18720 30 63 63 63 39 32 2c 20 31 30 29 3b 0a 20 20 20  0ccc92, 10);.   
18730 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 34 2c       MD5STEP(F4,
18740 20 63 2c 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b   c, d, a, b, in[
18750 31 30 5d 2b 30 78 66 66 65 66 66 34 37 64 2c 20  10]+0xffeff47d, 
18760 31 35 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35  15);.        MD5
18770 53 54 45 50 28 46 34 2c 20 62 2c 20 63 2c 20 64  STEP(F4, b, c, d
18780 2c 20 61 2c 20 69 6e 5b 20 31 5d 2b 30 78 38 35  , a, in[ 1]+0x85
18790 38 34 35 64 64 31 2c 20 32 31 29 3b 0a 20 20 20  845dd1, 21);.   
187a0 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 34 2c       MD5STEP(F4,
187b0 20 61 2c 20 62 2c 20 63 2c 20 64 2c 20 69 6e 5b   a, b, c, d, in[
187c0 20 38 5d 2b 30 78 36 66 61 38 37 65 34 66 2c 20   8]+0x6fa87e4f, 
187d0 20 36 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35   6);.        MD5
187e0 53 54 45 50 28 46 34 2c 20 64 2c 20 61 2c 20 62  STEP(F4, d, a, b
187f0 2c 20 63 2c 20 69 6e 5b 31 35 5d 2b 30 78 66 65  , c, in[15]+0xfe
18800 32 63 65 36 65 30 2c 20 31 30 29 3b 0a 20 20 20  2ce6e0, 10);.   
18810 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 34 2c       MD5STEP(F4,
18820 20 63 2c 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b   c, d, a, b, in[
18830 20 36 5d 2b 30 78 61 33 30 31 34 33 31 34 2c 20   6]+0xa3014314, 
18840 31 35 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35  15);.        MD5
18850 53 54 45 50 28 46 34 2c 20 62 2c 20 63 2c 20 64  STEP(F4, b, c, d
18860 2c 20 61 2c 20 69 6e 5b 31 33 5d 2b 30 78 34 65  , a, in[13]+0x4e
18870 30 38 31 31 61 31 2c 20 32 31 29 3b 0a 20 20 20  0811a1, 21);.   
18880 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 34 2c       MD5STEP(F4,
18890 20 61 2c 20 62 2c 20 63 2c 20 64 2c 20 69 6e 5b   a, b, c, d, in[
188a0 20 34 5d 2b 30 78 66 37 35 33 37 65 38 32 2c 20   4]+0xf7537e82, 
188b0 20 36 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35   6);.        MD5
188c0 53 54 45 50 28 46 34 2c 20 64 2c 20 61 2c 20 62  STEP(F4, d, a, b
188d0 2c 20 63 2c 20 69 6e 5b 31 31 5d 2b 30 78 62 64  , c, in[11]+0xbd
188e0 33 61 66 32 33 35 2c 20 31 30 29 3b 0a 20 20 20  3af235, 10);.   
188f0 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 34 2c       MD5STEP(F4,
18900 20 63 2c 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b   c, d, a, b, in[
18910 20 32 5d 2b 30 78 32 61 64 37 64 32 62 62 2c 20   2]+0x2ad7d2bb, 
18920 31 35 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35  15);.        MD5
18930 53 54 45 50 28 46 34 2c 20 62 2c 20 63 2c 20 64  STEP(F4, b, c, d
18940 2c 20 61 2c 20 69 6e 5b 20 39 5d 2b 30 78 65 62  , a, in[ 9]+0xeb
18950 38 36 64 33 39 31 2c 20 32 31 29 3b 0a 0a 20 20  86d391, 21);..  
18960 20 20 20 20 20 20 62 75 66 5b 30 5d 20 2b 3d 20        buf[0] += 
18970 61 3b 0a 20 20 20 20 20 20 20 20 62 75 66 5b 31  a;.        buf[1
18980 5d 20 2b 3d 20 62 3b 0a 20 20 20 20 20 20 20 20  ] += b;.        
18990 62 75 66 5b 32 5d 20 2b 3d 20 63 3b 0a 20 20 20  buf[2] += c;.   
189a0 20 20 20 20 20 62 75 66 5b 33 5d 20 2b 3d 20 64       buf[3] += d
189b0 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 74 61 72 74  ;.}../*. * Start
189c0 20 4d 44 35 20 61 63 63 75 6d 75 6c 61 74 69 6f   MD5 accumulatio
189d0 6e 2e 20 20 53 65 74 20 62 69 74 20 63 6f 75 6e  n.  Set bit coun
189e0 74 20 74 6f 20 30 20 61 6e 64 20 62 75 66 66 65  t to 0 and buffe
189f0 72 20 74 6f 20 6d 79 73 74 65 72 69 6f 75 73 0a  r to mysterious.
18a00 20 2a 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f   * initializatio
18a10 6e 20 63 6f 6e 73 74 61 6e 74 73 2e 0a 20 2a 2f  n constants.. */
18a20 0a 73 74 61 74 69 63 20 76 6f 69 64 20 4d 44 35  .static void MD5
18a30 49 6e 69 74 28 4d 44 35 43 6f 6e 74 65 78 74 20  Init(MD5Context 
18a40 2a 63 74 78 29 7b 0a 20 20 20 20 20 20 20 20 63  *ctx){.        c
18a50 74 78 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a  tx->isInit = 1;.
18a60 20 20 20 20 20 20 20 20 63 74 78 2d 3e 62 75 66          ctx->buf
18a70 5b 30 5d 20 3d 20 30 78 36 37 34 35 32 33 30 31  [0] = 0x67452301
18a80 3b 0a 20 20 20 20 20 20 20 20 63 74 78 2d 3e 62  ;.        ctx->b
18a90 75 66 5b 31 5d 20 3d 20 30 78 65 66 63 64 61 62  uf[1] = 0xefcdab
18aa0 38 39 3b 0a 20 20 20 20 20 20 20 20 63 74 78 2d  89;.        ctx-
18ab0 3e 62 75 66 5b 32 5d 20 3d 20 30 78 39 38 62 61  >buf[2] = 0x98ba
18ac0 64 63 66 65 3b 0a 20 20 20 20 20 20 20 20 63 74  dcfe;.        ct
18ad0 78 2d 3e 62 75 66 5b 33 5d 20 3d 20 30 78 31 30  x->buf[3] = 0x10
18ae0 33 32 35 34 37 36 3b 0a 20 20 20 20 20 20 20 20  325476;.        
18af0 63 74 78 2d 3e 62 69 74 73 5b 30 5d 20 3d 20 30  ctx->bits[0] = 0
18b00 3b 0a 20 20 20 20 20 20 20 20 63 74 78 2d 3e 62  ;.        ctx->b
18b10 69 74 73 5b 31 5d 20 3d 20 30 3b 0a 7d 0a 0a 2f  its[1] = 0;.}../
18b20 2a 0a 20 2a 20 55 70 64 61 74 65 20 63 6f 6e 74  *. * Update cont
18b30 65 78 74 20 74 6f 20 72 65 66 6c 65 63 74 20 74  ext to reflect t
18b40 68 65 20 63 6f 6e 63 61 74 65 6e 61 74 69 6f 6e  he concatenation
18b50 20 6f 66 20 61 6e 6f 74 68 65 72 20 62 75 66 66   of another buff
18b60 65 72 20 66 75 6c 6c 0a 20 2a 20 6f 66 20 62 79  er full. * of by
18b70 74 65 73 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20  tes.. */.static 
18b80 0a 76 6f 69 64 20 4d 44 35 55 70 64 61 74 65 28  .void MD5Update(
18b90 4d 44 35 43 6f 6e 74 65 78 74 20 2a 63 74 78 2c  MD5Context *ctx,
18ba0 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
18bb0 63 68 61 72 20 2a 62 75 66 2c 20 75 6e 73 69 67  char *buf, unsig
18bc0 6e 65 64 20 69 6e 74 20 6c 65 6e 29 7b 0a 20 20  ned int len){.  
18bd0 20 20 20 20 20 20 75 69 6e 74 33 32 20 74 3b 0a        uint32 t;.
18be0 0a 20 20 20 20 20 20 20 20 2f 2a 20 55 70 64 61  .        /* Upda
18bf0 74 65 20 62 69 74 63 6f 75 6e 74 20 2a 2f 0a 0a  te bitcount */..
18c00 20 20 20 20 20 20 20 20 74 20 3d 20 63 74 78 2d          t = ctx-
18c10 3e 62 69 74 73 5b 30 5d 3b 0a 20 20 20 20 20 20  >bits[0];.      
18c20 20 20 69 66 20 28 28 63 74 78 2d 3e 62 69 74 73    if ((ctx->bits
18c30 5b 30 5d 20 3d 20 74 20 2b 20 28 28 75 69 6e 74  [0] = t + ((uint
18c40 33 32 29 6c 65 6e 20 3c 3c 20 33 29 29 20 3c 20  32)len << 3)) < 
18c50 74 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t).             
18c60 20 20 20 63 74 78 2d 3e 62 69 74 73 5b 31 5d 2b     ctx->bits[1]+
18c70 2b 3b 20 2f 2a 20 43 61 72 72 79 20 66 72 6f 6d  +; /* Carry from
18c80 20 6c 6f 77 20 74 6f 20 68 69 67 68 20 2a 2f 0a   low to high */.
18c90 20 20 20 20 20 20 20 20 63 74 78 2d 3e 62 69 74          ctx->bit
18ca0 73 5b 31 5d 20 2b 3d 20 6c 65 6e 20 3e 3e 20 32  s[1] += len >> 2
18cb0 39 3b 0a 0a 20 20 20 20 20 20 20 20 74 20 3d 20  9;..        t = 
18cc0 28 74 20 3e 3e 20 33 29 20 26 20 30 78 33 66 3b  (t >> 3) & 0x3f;
18cd0 20 20 20 20 2f 2a 20 42 79 74 65 73 20 61 6c 72      /* Bytes alr
18ce0 65 61 64 79 20 69 6e 20 73 68 73 49 6e 66 6f 2d  eady in shsInfo-
18cf0 3e 64 61 74 61 20 2a 2f 0a 0a 20 20 20 20 20 20  >data */..      
18d00 20 20 2f 2a 20 48 61 6e 64 6c 65 20 61 6e 79 20    /* Handle any 
18d10 6c 65 61 64 69 6e 67 20 6f 64 64 2d 73 69 7a 65  leading odd-size
18d20 64 20 63 68 75 6e 6b 73 20 2a 2f 0a 0a 20 20 20  d chunks */..   
18d30 20 20 20 20 20 69 66 20 28 20 74 20 29 20 7b 0a       if ( t ) {.
18d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18d50 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
18d60 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61   = (unsigned cha
18d70 72 20 2a 29 63 74 78 2d 3e 69 6e 20 2b 20 74 3b  r *)ctx->in + t;
18d80 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
18d90 20 20 74 20 3d 20 36 34 2d 74 3b 0a 20 20 20 20    t = 64-t;.    
18da0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28              if (
18db0 6c 65 6e 20 3c 20 74 29 20 7b 0a 20 20 20 20 20  len < t) {.     
18dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18dd0 20 20 20 6d 65 6d 63 70 79 28 70 2c 20 62 75 66     memcpy(p, buf
18de0 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 20 20 20 20  , len);.        
18df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18e00 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20  return;.        
18e10 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
18e20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
18e30 28 70 2c 20 62 75 66 2c 20 74 29 3b 0a 20 20 20  (p, buf, t);.   
18e40 20 20 20 20 20 20 20 20 20 20 20 20 20 62 79 74               byt
18e50 65 52 65 76 65 72 73 65 28 63 74 78 2d 3e 69 6e  eReverse(ctx->in
18e60 2c 20 31 36 29 3b 0a 20 20 20 20 20 20 20 20 20  , 16);.         
18e70 20 20 20 20 20 20 20 4d 44 35 54 72 61 6e 73 66         MD5Transf
18e80 6f 72 6d 28 63 74 78 2d 3e 62 75 66 2c 20 28 75  orm(ctx->buf, (u
18e90 69 6e 74 33 32 20 2a 29 63 74 78 2d 3e 69 6e 29  int32 *)ctx->in)
18ea0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
18eb0 20 20 62 75 66 20 2b 3d 20 74 3b 0a 20 20 20 20    buf += t;.    
18ec0 20 20 20 20 20 20 20 20 20 20 20 20 6c 65 6e 20              len 
18ed0 2d 3d 20 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  -= t;.        }.
18ee0 0a 20 20 20 20 20 20 20 20 2f 2a 20 50 72 6f 63  .        /* Proc
18ef0 65 73 73 20 64 61 74 61 20 69 6e 20 36 34 2d 62  ess data in 64-b
18f00 79 74 65 20 63 68 75 6e 6b 73 20 2a 2f 0a 0a 20  yte chunks */.. 
18f10 20 20 20 20 20 20 20 77 68 69 6c 65 20 28 6c 65         while (le
18f20 6e 20 3e 3d 20 36 34 29 20 7b 0a 20 20 20 20 20  n >= 64) {.     
18f30 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70             memcp
18f40 79 28 63 74 78 2d 3e 69 6e 2c 20 62 75 66 2c 20  y(ctx->in, buf, 
18f50 36 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  64);.           
18f60 20 20 20 20 20 62 79 74 65 52 65 76 65 72 73 65       byteReverse
18f70 28 63 74 78 2d 3e 69 6e 2c 20 31 36 29 3b 0a 20  (ctx->in, 16);. 
18f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4d                 M
18f90 44 35 54 72 61 6e 73 66 6f 72 6d 28 63 74 78 2d  D5Transform(ctx-
18fa0 3e 62 75 66 2c 20 28 75 69 6e 74 33 32 20 2a 29  >buf, (uint32 *)
18fb0 63 74 78 2d 3e 69 6e 29 3b 0a 20 20 20 20 20 20  ctx->in);.      
18fc0 20 20 20 20 20 20 20 20 20 20 62 75 66 20 2b 3d            buf +=
18fd0 20 36 34 3b 0a 20 20 20 20 20 20 20 20 20 20 20   64;.           
18fe0 20 20 20 20 20 6c 65 6e 20 2d 3d 20 36 34 3b 0a       len -= 64;.
18ff0 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
19000 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 61 6e 79     /* Handle any
19010 20 72 65 6d 61 69 6e 69 6e 67 20 62 79 74 65 73   remaining bytes
19020 20 6f 66 20 64 61 74 61 2e 20 2a 2f 0a 0a 20 20   of data. */..  
19030 20 20 20 20 20 20 6d 65 6d 63 70 79 28 63 74 78        memcpy(ctx
19040 2d 3e 69 6e 2c 20 62 75 66 2c 20 6c 65 6e 29 3b  ->in, buf, len);
19050 0a 7d 0a 0a 2f 2a 0a 20 2a 20 46 69 6e 61 6c 20  .}../*. * Final 
19060 77 72 61 70 75 70 20 2d 20 70 61 64 20 74 6f 20  wrapup - pad to 
19070 36 34 2d 62 79 74 65 20 62 6f 75 6e 64 61 72 79  64-byte boundary
19080 20 77 69 74 68 20 74 68 65 20 62 69 74 20 70 61   with the bit pa
19090 74 74 65 72 6e 20 0a 20 2a 20 31 20 30 2a 20 28  ttern . * 1 0* (
190a0 36 34 2d 62 69 74 20 63 6f 75 6e 74 20 6f 66 20  64-bit count of 
190b0 62 69 74 73 20 70 72 6f 63 65 73 73 65 64 2c 20  bits processed, 
190c0 4d 53 42 2d 66 69 72 73 74 29 0a 20 2a 2f 0a 73  MSB-first). */.s
190d0 74 61 74 69 63 20 76 6f 69 64 20 4d 44 35 46 69  tatic void MD5Fi
190e0 6e 61 6c 28 75 6e 73 69 67 6e 65 64 20 63 68 61  nal(unsigned cha
190f0 72 20 64 69 67 65 73 74 5b 31 36 5d 2c 20 4d 44  r digest[16], MD
19100 35 43 6f 6e 74 65 78 74 20 2a 63 74 78 29 7b 0a  5Context *ctx){.
19110 20 20 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64          unsigned
19120 20 63 6f 75 6e 74 3b 0a 20 20 20 20 20 20 20 20   count;.        
19130 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
19140 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  ;..        /* Co
19150 6d 70 75 74 65 20 6e 75 6d 62 65 72 20 6f 66 20  mpute number of 
19160 62 79 74 65 73 20 6d 6f 64 20 36 34 20 2a 2f 0a  bytes mod 64 */.
19170 20 20 20 20 20 20 20 20 63 6f 75 6e 74 20 3d 20          count = 
19180 28 63 74 78 2d 3e 62 69 74 73 5b 30 5d 20 3e 3e  (ctx->bits[0] >>
19190 20 33 29 20 26 20 30 78 33 46 3b 0a 0a 20 20 20   3) & 0x3F;..   
191a0 20 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20       /* Set the 
191b0 66 69 72 73 74 20 63 68 61 72 20 6f 66 20 70 61  first char of pa
191c0 64 64 69 6e 67 20 74 6f 20 30 78 38 30 2e 20 20  dding to 0x80.  
191d0 54 68 69 73 20 69 73 20 73 61 66 65 20 73 69 6e  This is safe sin
191e0 63 65 20 74 68 65 72 65 20 69 73 0a 20 20 20 20  ce there is.    
191f0 20 20 20 20 20 20 20 61 6c 77 61 79 73 20 61 74         always at
19200 20 6c 65 61 73 74 20 6f 6e 65 20 62 79 74 65 20   least one byte 
19210 66 72 65 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  free */.        
19220 70 20 3d 20 63 74 78 2d 3e 69 6e 20 2b 20 63 6f  p = ctx->in + co
19230 75 6e 74 3b 0a 20 20 20 20 20 20 20 20 2a 70 2b  unt;.        *p+
19240 2b 20 3d 20 30 78 38 30 3b 0a 0a 20 20 20 20 20  + = 0x80;..     
19250 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 70     /* Bytes of p
19260 61 64 64 69 6e 67 20 6e 65 65 64 65 64 20 74 6f  adding needed to
19270 20 6d 61 6b 65 20 36 34 20 62 79 74 65 73 20 2a   make 64 bytes *
19280 2f 0a 20 20 20 20 20 20 20 20 63 6f 75 6e 74 20  /.        count 
19290 3d 20 36 34 20 2d 20 31 20 2d 20 63 6f 75 6e 74  = 64 - 1 - count
192a0 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ;..        /* Pa
192b0 64 20 6f 75 74 20 74 6f 20 35 36 20 6d 6f 64 20  d out to 56 mod 
192c0 36 34 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66  64 */.        if
192d0 20 28 63 6f 75 6e 74 20 3c 20 38 29 20 7b 0a 20   (count < 8) {. 
192e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
192f0 2a 20 54 77 6f 20 6c 6f 74 73 20 6f 66 20 70 61  * Two lots of pa
19300 64 64 69 6e 67 3a 20 20 50 61 64 20 74 68 65 20  dding:  Pad the 
19310 66 69 72 73 74 20 62 6c 6f 63 6b 20 74 6f 20 36  first block to 6
19320 34 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 20  4 bytes */.     
19330 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 73 65             memse
19340 74 28 70 2c 20 30 2c 20 63 6f 75 6e 74 29 3b 0a  t(p, 0, count);.
19350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19360 62 79 74 65 52 65 76 65 72 73 65 28 63 74 78 2d  byteReverse(ctx-
19370 3e 69 6e 2c 20 31 36 29 3b 0a 20 20 20 20 20 20  >in, 16);.      
19380 20 20 20 20 20 20 20 20 20 20 4d 44 35 54 72 61            MD5Tra
19390 6e 73 66 6f 72 6d 28 63 74 78 2d 3e 62 75 66 2c  nsform(ctx->buf,
193a0 20 28 75 69 6e 74 33 32 20 2a 29 63 74 78 2d 3e   (uint32 *)ctx->
193b0 69 6e 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20  in);..          
193c0 20 20 20 20 20 20 2f 2a 20 4e 6f 77 20 66 69 6c        /* Now fil
193d0 6c 20 74 68 65 20 6e 65 78 74 20 62 6c 6f 63 6b  l the next block
193e0 20 77 69 74 68 20 35 36 20 62 79 74 65 73 20 2a   with 56 bytes *
193f0 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
19400 20 20 6d 65 6d 73 65 74 28 63 74 78 2d 3e 69 6e    memset(ctx->in
19410 2c 20 30 2c 20 35 36 29 3b 0a 20 20 20 20 20 20  , 0, 56);.      
19420 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
19430 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
19440 64 20 62 6c 6f 63 6b 20 74 6f 20 35 36 20 62 79  d block to 56 by
19450 74 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  tes */.         
19460 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 2c         memset(p,
19470 20 30 2c 20 63 6f 75 6e 74 2d 38 29 3b 0a 20 20   0, count-8);.  
19480 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
19490 62 79 74 65 52 65 76 65 72 73 65 28 63 74 78 2d  byteReverse(ctx-
194a0 3e 69 6e 2c 20 31 34 29 3b 0a 0a 20 20 20 20 20  >in, 14);..     
194b0 20 20 20 2f 2a 20 41 70 70 65 6e 64 20 6c 65 6e     /* Append len
194c0 67 74 68 20 69 6e 20 62 69 74 73 20 61 6e 64 20  gth in bits and 
194d0 74 72 61 6e 73 66 6f 72 6d 20 2a 2f 0a 20 20 20  transform */.   
194e0 20 20 20 20 20 28 28 75 69 6e 74 33 32 20 2a 29       ((uint32 *)
194f0 63 74 78 2d 3e 69 6e 29 5b 20 31 34 20 5d 20 3d  ctx->in)[ 14 ] =
19500 20 63 74 78 2d 3e 62 69 74 73 5b 30 5d 3b 0a 20   ctx->bits[0];. 
19510 20 20 20 20 20 20 20 28 28 75 69 6e 74 33 32 20         ((uint32 
19520 2a 29 63 74 78 2d 3e 69 6e 29 5b 20 31 35 20 5d  *)ctx->in)[ 15 ]
19530 20 3d 20 63 74 78 2d 3e 62 69 74 73 5b 31 5d 3b   = ctx->bits[1];
19540 0a 0a 20 20 20 20 20 20 20 20 4d 44 35 54 72 61  ..        MD5Tra
19550 6e 73 66 6f 72 6d 28 63 74 78 2d 3e 62 75 66 2c  nsform(ctx->buf,
19560 20 28 75 69 6e 74 33 32 20 2a 29 63 74 78 2d 3e   (uint32 *)ctx->
19570 69 6e 29 3b 0a 20 20 20 20 20 20 20 20 62 79 74  in);.        byt
19580 65 52 65 76 65 72 73 65 28 28 75 6e 73 69 67 6e  eReverse((unsign
19590 65 64 20 63 68 61 72 20 2a 29 63 74 78 2d 3e 62  ed char *)ctx->b
195a0 75 66 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20  uf, 4);.        
195b0 6d 65 6d 63 70 79 28 64 69 67 65 73 74 2c 20 63  memcpy(digest, c
195c0 74 78 2d 3e 62 75 66 2c 20 31 36 29 3b 0a 20 20  tx->buf, 16);.  
195d0 20 20 20 20 20 20 6d 65 6d 73 65 74 28 63 74 78        memset(ctx
195e0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 63 74 78 29  , 0, sizeof(ctx)
195f0 29 3b 20 20 20 20 2f 2a 20 49 6e 20 63 61 73 65  );    /* In case
19600 20 69 74 20 69 73 20 73 65 6e 73 69 74 69 76 65   it is sensitive
19610 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e   */.}../*.** Con
19620 76 65 72 74 20 61 20 31 32 38 2d 62 69 74 20 4d  vert a 128-bit M
19630 44 35 20 64 69 67 65 73 74 20 69 6e 74 6f 20 61  D5 digest into a
19640 20 33 32 2d 64 69 67 69 74 20 62 61 73 65 2d 31   32-digit base-1
19650 36 20 6e 75 6d 62 65 72 2e 0a 2a 2f 0a 73 74 61  6 number..*/.sta
19660 74 69 63 20 76 6f 69 64 20 4d 44 35 44 69 67 65  tic void MD5Dige
19670 73 74 54 6f 42 61 73 65 31 36 28 75 6e 73 69 67  stToBase16(unsig
19680 6e 65 64 20 63 68 61 72 20 2a 64 69 67 65 73 74  ned char *digest
19690 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20  , char *zBuf){. 
196a0 20 73 74 61 74 69 63 20 63 68 61 72 20 63 6f 6e   static char con
196b0 73 74 20 7a 45 6e 63 6f 64 65 5b 5d 20 3d 20 22  st zEncode[] = "
196c0 30 31 32 33 34 35 36 37 38 39 61 62 63 64 65 66  0123456789abcdef
196d0 22 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 0a  ";.  int i, j;..
196e0 20 20 66 6f 72 28 6a 3d 69 3d 30 3b 20 69 3c 31    for(j=i=0; i<1
196f0 36 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  6; i++){.    int
19700 20 61 20 3d 20 64 69 67 65 73 74 5b 69 5d 3b 0a   a = digest[i];.
19710 20 20 20 20 7a 42 75 66 5b 6a 2b 2b 5d 20 3d 20      zBuf[j++] = 
19720 7a 45 6e 63 6f 64 65 5b 28 61 3e 3e 34 29 26 30  zEncode[(a>>4)&0
19730 78 66 5d 3b 0a 20 20 20 20 7a 42 75 66 5b 6a 2b  xf];.    zBuf[j+
19740 2b 5d 20 3d 20 7a 45 6e 63 6f 64 65 5b 61 20 26  +] = zEncode[a &
19750 20 30 78 66 5d 3b 0a 20 20 7d 0a 20 20 7a 42 75   0xf];.  }.  zBu
19760 66 5b 6a 5d 20 3d 20 30 3b 0a 7d 0a 0a 0a 2f 2a  f[j] = 0;.}.../*
19770 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 31 32  .** Convert a 12
19780 38 2d 62 69 74 20 4d 44 35 20 64 69 67 65 73 74  8-bit MD5 digest
19790 20 69 6e 74 6f 20 73 65 71 75 65 6e 63 79 20 6f   into sequency o
197a0 66 20 65 69 67 68 74 20 35 2d 64 69 67 69 74 20  f eight 5-digit 
197b0 69 6e 74 65 67 65 72 73 0a 2a 2a 20 65 61 63 68  integers.** each
197c0 20 72 65 70 72 65 73 65 6e 74 69 6e 67 20 31 36   representing 16
197d0 20 62 69 74 73 20 6f 66 20 74 68 65 20 64 69 67   bits of the dig
197e0 65 73 74 20 61 6e 64 20 73 65 70 61 72 61 74 65  est and separate
197f0 64 20 66 72 6f 6d 20 65 61 63 68 0a 2a 2a 20 6f  d from each.** o
19800 74 68 65 72 20 62 79 20 61 20 22 2d 22 20 63 68  ther by a "-" ch
19810 61 72 61 63 74 65 72 2e 0a 2a 2f 0a 73 74 61 74  aracter..*/.stat
19820 69 63 20 76 6f 69 64 20 4d 44 35 44 69 67 65 73  ic void MD5Diges
19830 74 54 6f 42 61 73 65 31 30 78 38 28 75 6e 73 69  tToBase10x8(unsi
19840 67 6e 65 64 20 63 68 61 72 20 64 69 67 65 73 74  gned char digest
19850 5b 31 36 5d 2c 20 63 68 61 72 20 7a 44 69 67 65  [16], char zDige
19860 73 74 5b 35 30 5d 29 7b 0a 20 20 69 6e 74 20 69  st[50]){.  int i
19870 2c 20 6a 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  , j;.  unsigned 
19880 69 6e 74 20 78 3b 0a 20 20 66 6f 72 28 69 3d 6a  int x;.  for(i=j
19890 3d 30 3b 20 69 3c 31 36 3b 20 69 2b 3d 32 29 7b  =0; i<16; i+=2){
198a0 0a 20 20 20 20 78 20 3d 20 64 69 67 65 73 74 5b  .    x = digest[
198b0 69 5d 2a 32 35 36 20 2b 20 64 69 67 65 73 74 5b  i]*256 + digest[
198c0 69 2b 31 5d 3b 0a 20 20 20 20 69 66 28 20 69 3e  i+1];.    if( i>
198d0 30 20 29 20 7a 44 69 67 65 73 74 5b 6a 2b 2b 5d  0 ) zDigest[j++]
198e0 20 3d 20 27 2d 27 3b 0a 20 20 20 20 73 70 72 69   = '-';.    spri
198f0 6e 74 66 28 26 7a 44 69 67 65 73 74 5b 6a 5d 2c  ntf(&zDigest[j],
19900 20 22 25 30 35 75 22 2c 20 78 29 3b 0a 20 20 20   "%05u", x);.   
19910 20 6a 20 2b 3d 20 35 3b 0a 20 20 7d 0a 20 20 7a   j += 5;.  }.  z
19920 44 69 67 65 73 74 5b 6a 5d 20 3d 20 30 3b 0a 7d  Digest[j] = 0;.}
19930 0a 0a 2f 2a 0a 2a 2a 20 41 20 54 43 4c 20 63 6f  ../*.** A TCL co
19940 6d 6d 61 6e 64 20 66 6f 72 20 6d 64 35 2e 20 20  mmand for md5.  
19950 54 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20  The argument is 
19960 74 68 65 20 74 65 78 74 20 74 6f 20 62 65 20 68  the text to be h
19970 61 73 68 65 64 2e 20 20 54 68 65 0a 2a 2a 20 52  ashed.  The.** R
19980 65 73 75 6c 74 20 69 73 20 74 68 65 20 68 61 73  esult is the has
19990 68 20 69 6e 20 62 61 73 65 36 34 2e 20 20 0a 2a  h in base64.  .*
199a0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 64 35  /.static int md5
199b0 5f 63 6d 64 28 76 6f 69 64 2a 63 64 2c 20 54 63  _cmd(void*cd, Tc
199c0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
199d0 2c 20 69 6e 74 20 61 72 67 63 2c 20 63 6f 6e 73  , int argc, cons
199e0 74 20 63 68 61 72 20 2a 2a 61 72 67 76 29 7b 0a  t char **argv){.
199f0 20 20 4d 44 35 43 6f 6e 74 65 78 74 20 63 74 78    MD5Context ctx
19a00 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
19a10 72 20 64 69 67 65 73 74 5b 31 36 5d 3b 0a 20 20  r digest[16];.  
19a20 63 68 61 72 20 7a 42 75 66 5b 35 30 5d 3b 0a 20  char zBuf[50];. 
19a30 20 76 6f 69 64 20 28 2a 63 6f 6e 76 65 72 74 65   void (*converte
19a40 72 29 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  r)(unsigned char
19a50 2a 2c 20 63 68 61 72 2a 29 3b 0a 0a 20 20 69 66  *, char*);..  if
19a60 28 20 61 72 67 63 21 3d 32 20 29 7b 0a 20 20 20  ( argc!=2 ){.   
19a70 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
19a80 74 28 69 6e 74 65 72 70 2c 22 77 72 6f 6e 67 20  t(interp,"wrong 
19a90 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
19aa0 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20  e \"", argv[0], 
19ab0 0a 20 20 20 20 20 20 20 20 22 20 54 45 58 54 5c  .        " TEXT\
19ac0 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  "", 0);.    retu
19ad0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
19ae0 7d 0a 20 20 4d 44 35 49 6e 69 74 28 26 63 74 78  }.  MD5Init(&ctx
19af0 29 3b 0a 20 20 4d 44 35 55 70 64 61 74 65 28 26  );.  MD5Update(&
19b00 63 74 78 2c 20 28 75 6e 73 69 67 6e 65 64 20 63  ctx, (unsigned c
19b10 68 61 72 2a 29 61 72 67 76 5b 31 5d 2c 20 28 75  har*)argv[1], (u
19b20 6e 73 69 67 6e 65 64 29 73 74 72 6c 65 6e 28 61  nsigned)strlen(a
19b30 72 67 76 5b 31 5d 29 29 3b 0a 20 20 4d 44 35 46  rgv[1]));.  MD5F
19b40 69 6e 61 6c 28 64 69 67 65 73 74 2c 20 26 63 74  inal(digest, &ct
19b50 78 29 3b 0a 20 20 63 6f 6e 76 65 72 74 65 72 20  x);.  converter 
19b60 3d 20 28 76 6f 69 64 28 2a 29 28 75 6e 73 69 67  = (void(*)(unsig
19b70 6e 65 64 20 63 68 61 72 2a 2c 63 68 61 72 2a 29  ned char*,char*)
19b80 29 63 64 3b 0a 20 20 63 6f 6e 76 65 72 74 65 72  )cd;.  converter
19b90 28 64 69 67 65 73 74 2c 20 7a 42 75 66 29 3b 0a  (digest, zBuf);.
19ba0 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
19bb0 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c  lt(interp, zBuf,
19bc0 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 72 65   (char*)0);.  re
19bd0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
19be0 2f 2a 0a 2a 2a 20 41 20 54 43 4c 20 63 6f 6d 6d  /*.** A TCL comm
19bf0 61 6e 64 20 74 6f 20 74 61 6b 65 20 74 68 65 20  and to take the 
19c00 6d 64 35 20 68 61 73 68 20 6f 66 20 61 20 66 69  md5 hash of a fi
19c10 6c 65 2e 20 20 54 68 65 20 61 72 67 75 6d 65 6e  le.  The argumen
19c20 74 20 69 73 20 74 68 65 0a 2a 2a 20 6e 61 6d 65  t is the.** name
19c30 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2f   of the file..*/
19c40 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 64 35 66  .static int md5f
19c50 69 6c 65 5f 63 6d 64 28 76 6f 69 64 2a 63 64 2c  ile_cmd(void*cd,
19c60 20 54 63 6c 5f 49 6e 74 65 72 70 2a 69 6e 74 65   Tcl_Interp*inte
19c70 72 70 2c 20 69 6e 74 20 61 72 67 63 2c 20 63 6f  rp, int argc, co
19c80 6e 73 74 20 63 68 61 72 20 2a 2a 61 72 67 76 29  nst char **argv)
19c90 7b 0a 20 20 46 49 4c 45 20 2a 69 6e 3b 0a 20 20  {.  FILE *in;.  
19ca0 4d 44 35 43 6f 6e 74 65 78 74 20 63 74 78 3b 0a  MD5Context ctx;.
19cb0 20 20 76 6f 69 64 20 28 2a 63 6f 6e 76 65 72 74    void (*convert
19cc0 65 72 29 28 75 6e 73 69 67 6e 65 64 20 63 68 61  er)(unsigned cha
19cd0 72 2a 2c 20 63 68 61 72 2a 29 3b 0a 20 20 75 6e  r*, char*);.  un
19ce0 73 69 67 6e 65 64 20 63 68 61 72 20 64 69 67 65  signed char dige
19cf0 73 74 5b 31 36 5d 3b 0a 20 20 63 68 61 72 20 7a  st[16];.  char z
19d00 42 75 66 5b 31 30 32 34 30 5d 3b 0a 0a 20 20 69  Buf[10240];..  i
19d10 66 28 20 61 72 67 63 21 3d 32 20 29 7b 0a 20 20  f( argc!=2 ){.  
19d20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
19d30 6c 74 28 69 6e 74 65 72 70 2c 22 77 72 6f 6e 67  lt(interp,"wrong
19d40 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
19d50 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c  be \"", argv[0],
19d60 20 0a 20 20 20 20 20 20 20 20 22 20 46 49 4c 45   .        " FILE
19d70 4e 41 4d 45 5c 22 22 2c 20 30 29 3b 0a 20 20 20  NAME\"", 0);.   
19d80 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
19d90 52 3b 0a 20 20 7d 0a 20 20 69 6e 20 3d 20 66 6f  R;.  }.  in = fo
19da0 70 65 6e 28 61 72 67 76 5b 31 5d 2c 22 72 62 22  pen(argv[1],"rb"
19db0 29 3b 0a 20 20 69 66 28 20 69 6e 3d 3d 30 20 29  );.  if( in==0 )
19dc0 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
19dd0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 75  Result(interp,"u
19de0 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 66 69  nable to open fi
19df0 6c 65 20 5c 22 22 2c 20 61 72 67 76 5b 31 5d 2c  le \"", argv[1],
19e00 20 0a 20 20 20 20 20 20 20 20 20 22 5c 22 20 66   .         "\" f
19e10 6f 72 20 72 65 61 64 69 6e 67 22 2c 20 30 29 3b  or reading", 0);
19e20 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
19e30 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 4d 44 35  ERROR;.  }.  MD5
19e40 49 6e 69 74 28 26 63 74 78 29 3b 0a 20 20 66 6f  Init(&ctx);.  fo
19e50 72 28 3b 3b 29 7b 0a 20 20 20 20 69 6e 74 20 6e  r(;;){.    int n
19e60 3b 0a 20 20 20 20 6e 20 3d 20 66 72 65 61 64 28  ;.    n = fread(
19e70 7a 42 75 66 2c 20 31 2c 20 73 69 7a 65 6f 66 28  zBuf, 1, sizeof(
19e80 7a 42 75 66 29 2c 20 69 6e 29 3b 0a 20 20 20 20  zBuf), in);.    
19e90 69 66 28 20 6e 3c 3d 30 20 29 20 62 72 65 61 6b  if( n<=0 ) break
19ea0 3b 0a 20 20 20 20 4d 44 35 55 70 64 61 74 65 28  ;.    MD5Update(
19eb0 26 63 74 78 2c 20 28 75 6e 73 69 67 6e 65 64 20  &ctx, (unsigned 
19ec0 63 68 61 72 2a 29 7a 42 75 66 2c 20 28 75 6e 73  char*)zBuf, (uns
19ed0 69 67 6e 65 64 29 6e 29 3b 0a 20 20 7d 0a 20 20  igned)n);.  }.  
19ee0 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 4d 44  fclose(in);.  MD
19ef0 35 46 69 6e 61 6c 28 64 69 67 65 73 74 2c 20 26  5Final(digest, &
19f00 63 74 78 29 3b 0a 20 20 63 6f 6e 76 65 72 74 65  ctx);.  converte
19f10 72 20 3d 20 28 76 6f 69 64 28 2a 29 28 75 6e 73  r = (void(*)(uns
19f20 69 67 6e 65 64 20 63 68 61 72 2a 2c 63 68 61 72  igned char*,char
19f30 2a 29 29 63 64 3b 0a 20 20 63 6f 6e 76 65 72 74  *))cd;.  convert
19f40 65 72 28 64 69 67 65 73 74 2c 20 7a 42 75 66 29  er(digest, zBuf)
19f50 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65  ;.  Tcl_AppendRe
19f60 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75  sult(interp, zBu
19f70 66 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  f, (char*)0);.  
19f80 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
19f90 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72  ../*.** Register
19fa0 20 74 68 65 20 66 6f 75 72 20 6e 65 77 20 54 43   the four new TC
19fb0 4c 20 63 6f 6d 6d 61 6e 64 73 20 66 6f 72 20 67  L commands for g
19fc0 65 6e 65 72 61 74 69 6e 67 20 4d 44 35 20 63 68  enerating MD5 ch
19fd0 65 63 6b 73 75 6d 73 0a 2a 2a 20 77 69 74 68 20  ecksums.** with 
19fe0 74 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  the TCL interpre
19ff0 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 4d 64 35 5f  ter..*/.int Md5_
1a000 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20  Init(Tcl_Interp 
1a010 2a 69 6e 74 65 72 70 29 7b 0a 20 20 54 63 6c 5f  *interp){.  Tcl_
1a020 43 72 65 61 74 65 43 6f 6d 6d 61 6e 64 28 69 6e  CreateCommand(in
1a030 74 65 72 70 2c 20 22 6d 64 35 22 2c 20 28 54 63  terp, "md5", (Tc
1a040 6c 5f 43 6d 64 50 72 6f 63 2a 29 6d 64 35 5f 63  l_CmdProc*)md5_c
1a050 6d 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  md,.            
1a060 20 20 20 20 20 20 20 20 4d 44 35 44 69 67 65 73          MD5Diges
1a070 74 54 6f 42 61 73 65 31 36 2c 20 30 29 3b 0a 20  tToBase16, 0);. 
1a080 20 54 63 6c 5f 43 72 65 61 74 65 43 6f 6d 6d 61   Tcl_CreateComma
1a090 6e 64 28 69 6e 74 65 72 70 2c 20 22 6d 64 35 2d  nd(interp, "md5-
1a0a0 31 30 78 38 22 2c 20 28 54 63 6c 5f 43 6d 64 50  10x8", (Tcl_CmdP
1a0b0 72 6f 63 2a 29 6d 64 35 5f 63 6d 64 2c 0a 20 20  roc*)md5_cmd,.  
1a0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a0d0 20 20 4d 44 35 44 69 67 65 73 74 54 6f 42 61 73    MD5DigestToBas
1a0e0 65 31 30 78 38 2c 20 30 29 3b 0a 20 20 54 63 6c  e10x8, 0);.  Tcl
1a0f0 5f 43 72 65 61 74 65 43 6f 6d 6d 61 6e 64 28 69  _CreateCommand(i
1a100 6e 74 65 72 70 2c 20 22 6d 64 35 66 69 6c 65 22  nterp, "md5file"
1a110 2c 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29  , (Tcl_CmdProc*)
1a120 6d 64 35 66 69 6c 65 5f 63 6d 64 2c 0a 20 20 20  md5file_cmd,.   
1a130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a140 20 4d 44 35 44 69 67 65 73 74 54 6f 42 61 73 65   MD5DigestToBase
1a150 31 36 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 43 72  16, 0);.  Tcl_Cr
1a160 65 61 74 65 43 6f 6d 6d 61 6e 64 28 69 6e 74 65  eateCommand(inte
1a170 72 70 2c 20 22 6d 64 35 66 69 6c 65 2d 31 30 78  rp, "md5file-10x
1a180 38 22 2c 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63  8", (Tcl_CmdProc
1a190 2a 29 6d 64 35 66 69 6c 65 5f 63 6d 64 2c 0a 20  *)md5file_cmd,. 
1a1a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a1b0 20 20 20 4d 44 35 44 69 67 65 73 74 54 6f 42 61     MD5DigestToBa
1a1c0 73 65 31 30 78 38 2c 20 30 29 3b 0a 20 20 72 65  se10x8, 0);.  re
1a1d0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23  turn TCL_OK;.}.#
1a1e0 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64  endif /* defined
1a1f0 28 53 51 4c 49 54 45 5f 54 45 53 54 29 20 7c 7c  (SQLITE_TEST) ||
1a200 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
1a210 54 43 4c 4d 44 35 29 20 2a 2f 0a 0a 23 69 66 20  TCLMD5) */..#if 
1a220 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
1a230 45 53 54 29 0a 2f 2a 0a 2a 2a 20 44 75 72 69 6e  EST)./*.** Durin
1a240 67 20 74 65 73 74 69 6e 67 2c 20 74 68 65 20 73  g testing, the s
1a250 70 65 63 69 61 6c 20 6d 64 35 73 75 6d 28 29 20  pecial md5sum() 
1a260 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
1a270 6f 6e 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e  on is available.
1a280 0a 2a 2a 20 69 6e 73 69 64 65 20 53 51 4c 69 74  .** inside SQLit
1a290 65 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  e.  The followin
1a2a0 67 20 72 6f 75 74 69 6e 65 73 20 69 6d 70 6c 65  g routines imple
1a2b0 6d 65 6e 74 20 74 68 61 74 20 66 75 6e 63 74 69  ment that functi
1a2c0 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  on..*/.static vo
1a2d0 69 64 20 6d 64 35 73 74 65 70 28 73 71 6c 69 74  id md5step(sqlit
1a2e0 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  e3_context *cont
1a2f0 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73  ext, int argc, s
1a300 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
1a310 72 67 76 29 7b 0a 20 20 4d 44 35 43 6f 6e 74 65  rgv){.  MD5Conte
1a320 78 74 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a  xt *p;.  int i;.
1a330 20 20 69 66 28 20 61 72 67 63 3c 31 20 29 20 72    if( argc<1 ) r
1a340 65 74 75 72 6e 3b 0a 20 20 70 20 3d 20 73 71 6c  eturn;.  p = sql
1a350 69 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63  ite3_aggregate_c
1a360 6f 6e 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20  ontext(context, 
1a370 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69  sizeof(*p));.  i
1a380 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
1a390 3b 0a 20 20 69 66 28 20 21 70 2d 3e 69 73 49 6e  ;.  if( !p->isIn
1a3a0 69 74 20 29 7b 0a 20 20 20 20 4d 44 35 49 6e 69  it ){.    MD5Ini
1a3b0 74 28 70 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  t(p);.  }.  for(
1a3c0 69 3d 30 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b  i=0; i<argc; i++
1a3d0 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ){.    const cha
1a3e0 72 20 2a 7a 44 61 74 61 20 3d 20 28 63 68 61 72  r *zData = (char
1a3f0 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  *)sqlite3_value_
1a400 74 65 78 74 28 61 72 67 76 5b 69 5d 29 3b 0a 20  text(argv[i]);. 
1a410 20 20 20 69 66 28 20 7a 44 61 74 61 20 29 7b 0a     if( zData ){.
1a420 20 20 20 20 20 20 4d 44 35 55 70 64 61 74 65 28        MD5Update(
1a430 70 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61  p, (unsigned cha
1a440 72 2a 29 7a 44 61 74 61 2c 20 73 74 72 6c 65 6e  r*)zData, strlen
1a450 28 7a 44 61 74 61 29 29 3b 0a 20 20 20 20 7d 0a  (zData));.    }.
1a460 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69    }.}.static voi
1a470 64 20 6d 64 35 66 69 6e 61 6c 69 7a 65 28 73 71  d md5finalize(sq
1a480 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
1a490 6f 6e 74 65 78 74 29 7b 0a 20 20 4d 44 35 43 6f  ontext){.  MD5Co
1a4a0 6e 74 65 78 74 20 2a 70 3b 0a 20 20 75 6e 73 69  ntext *p;.  unsi
1a4b0 67 6e 65 64 20 63 68 61 72 20 64 69 67 65 73 74  gned char digest
1a4c0 5b 31 36 5d 3b 0a 20 20 63 68 61 72 20 7a 42 75  [16];.  char zBu
1a4d0 66 5b 33 33 5d 3b 0a 20 20 70 20 3d 20 73 71 6c  f[33];.  p = sql
1a4e0 69 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63  ite3_aggregate_c
1a4f0 6f 6e 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20  ontext(context, 
1a500 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 4d  sizeof(*p));.  M
1a510 44 35 46 69 6e 61 6c 28 64 69 67 65 73 74 2c 70  D5Final(digest,p
1a520 29 3b 0a 20 20 4d 44 35 44 69 67 65 73 74 54 6f  );.  MD5DigestTo
1a530 42 61 73 65 31 36 28 64 69 67 65 73 74 2c 20 7a  Base16(digest, z
1a540 42 75 66 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  Buf);.  sqlite3_
1a550 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74  result_text(cont
1a560 65 78 74 2c 20 7a 42 75 66 2c 20 2d 31 2c 20 53  ext, zBuf, -1, S
1a570 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
1a580 3b 0a 7d 0a 69 6e 74 20 4d 64 35 5f 52 65 67 69  ;.}.int Md5_Regi
1a590 73 74 65 72 28 73 71 6c 69 74 65 33 20 2a 64 62  ster(sqlite3 *db
1a5a0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71  ){.  int rc = sq
1a5b0 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
1a5c0 63 74 69 6f 6e 28 64 62 2c 20 22 6d 64 35 73 75  ction(db, "md5su
1a5d0 6d 22 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55  m", -1, SQLITE_U
1a5e0 54 46 38 2c 20 30 2c 20 30 2c 20 0a 20 20 20 20  TF8, 0, 0, .    
1a5f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a600 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 64 35               md5
1a610 73 74 65 70 2c 20 6d 64 35 66 69 6e 61 6c 69 7a  step, md5finaliz
1a620 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6f 76  e);.  sqlite3_ov
1a630 65 72 6c 6f 61 64 5f 66 75 6e 63 74 69 6f 6e 28  erload_function(
1a640 64 62 2c 20 22 6d 64 35 73 75 6d 22 2c 20 2d 31  db, "md5sum", -1
1a650 29 3b 20 20 2f 2a 20 54 6f 20 65 78 65 72 63 69  );  /* To exerci
1a660 73 65 20 74 68 69 73 20 41 50 49 20 2a 2f 0a 20  se this API */. 
1a670 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65   return rc;.}.#e
1a680 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28  ndif /* defined(
1a690 53 51 4c 49 54 45 5f 54 45 53 54 29 20 2a 2f 0a  SQLITE_TEST) */.
1a6a0 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6d  ../*.** If the m
1a6b0 61 63 72 6f 20 54 43 4c 53 48 20 69 73 20 6f 6e  acro TCLSH is on
1a6c0 65 2c 20 74 68 65 6e 20 70 75 74 20 69 6e 20 63  e, then put in c
1a6d0 6f 64 65 20 74 68 69 73 20 66 6f 72 20 74 68 65  ode this for the
1a6e0 0a 2a 2a 20 22 6d 61 69 6e 22 20 72 6f 75 74 69  .** "main" routi
1a6f0 6e 65 20 74 68 61 74 20 77 69 6c 6c 20 69 6e 69  ne that will ini
1a700 74 69 61 6c 69 7a 65 20 54 63 6c 20 61 6e 64 20  tialize Tcl and 
1a710 74 61 6b 65 20 69 6e 70 75 74 20 66 72 6f 6d 0a  take input from.
1a720 2a 2a 20 73 74 61 6e 64 61 72 64 20 69 6e 70 75  ** standard inpu
1a730 74 2c 20 6f 72 20 69 66 20 61 20 66 69 6c 65 20  t, or if a file 
1a740 69 73 20 6e 61 6d 65 64 20 6f 6e 20 74 68 65 20  is named on the 
1a750 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 0a 2a 2a 20  command line.** 
1a760 74 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  the TCL interpre
1a770 74 65 72 20 72 65 61 64 73 20 61 6e 64 20 65 76  ter reads and ev
1a780 61 6c 75 61 74 65 73 20 74 68 61 74 20 66 69 6c  aluates that fil
1a790 65 2e 0a 2a 2f 0a 23 69 66 20 54 43 4c 53 48 3d  e..*/.#if TCLSH=
1a7a0 3d 31 0a 73 74 61 74 69 63 20 63 68 61 72 20 7a  =1.static char z
1a7b0 4d 61 69 6e 6c 6f 6f 70 5b 5d 20 3d 0a 20 20 22  Mainloop[] =.  "
1a7c0 73 65 74 20 6c 69 6e 65 20 7b 7d 5c 6e 22 0a 20  set line {}\n". 
1a7d0 20 22 77 68 69 6c 65 20 7b 21 5b 65 6f 66 20 73   "while {![eof s
1a7e0 74 64 69 6e 5d 7d 20 7b 5c 6e 22 0a 20 20 20 20  tdin]} {\n".    
1a7f0 22 69 66 20 7b 24 6c 69 6e 65 21 3d 5c 22 5c 22  "if {$line!=\"\"
1a800 7d 20 7b 5c 6e 22 0a 20 20 20 20 20 20 22 70 75  } {\n".      "pu
1a810 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20 5c 22  ts -nonewline \"
1a820 3e 20 5c 22 5c 6e 22 0a 20 20 20 20 22 7d 20 65  > \"\n".    "} e
1a830 6c 73 65 20 7b 5c 6e 22 0a 20 20 20 20 20 20 22  lse {\n".      "
1a840 70 75 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20  puts -nonewline 
1a850 5c 22 25 20 5c 22 5c 6e 22 0a 20 20 20 20 22 7d  \"% \"\n".    "}
1a860 5c 6e 22 0a 20 20 20 20 22 66 6c 75 73 68 20 73  \n".    "flush s
1a870 74 64 6f 75 74 5c 6e 22 0a 20 20 20 20 22 61 70  tdout\n".    "ap
1a880 70 65 6e 64 20 6c 69 6e 65 20 5b 67 65 74 73 20  pend line [gets 
1a890 73 74 64 69 6e 5d 5c 6e 22 0a 20 20 20 20 22 69  stdin]\n".    "i
1a8a0 66 20 7b 5b 69 6e 66 6f 20 63 6f 6d 70 6c 65 74  f {[info complet
1a8b0 65 20 24 6c 69 6e 65 5d 7d 20 7b 5c 6e 22 0a 20  e $line]} {\n". 
1a8c0 20 20 20 20 20 22 69 66 20 7b 5b 63 61 74 63 68       "if {[catch
1a8d0 20 7b 75 70 6c 65 76 65 6c 20 23 30 20 24 6c 69   {uplevel #0 $li
1a8e0 6e 65 7d 20 72 65 73 75 6c 74 5d 7d 20 7b 5c 6e  ne} result]} {\n
1a8f0 22 0a 20 20 20 20 20 20 20 20 22 70 75 74 73 20  ".        "puts 
1a900 73 74 64 65 72 72 20 5c 22 45 72 72 6f 72 3a 20  stderr \"Error: 
1a910 24 72 65 73 75 6c 74 5c 22 5c 6e 22 0a 20 20 20  $result\"\n".   
1a920 20 20 20 22 7d 20 65 6c 73 65 69 66 20 7b 24 72     "} elseif {$r
1a930 65 73 75 6c 74 21 3d 5c 22 5c 22 7d 20 7b 5c 6e  esult!=\"\"} {\n
1a940 22 0a 20 20 20 20 20 20 20 20 22 70 75 74 73 20  ".        "puts 
1a950 24 72 65 73 75 6c 74 5c 6e 22 0a 20 20 20 20 20  $result\n".     
1a960 20 22 7d 5c 6e 22 0a 20 20 20 20 20 20 22 73 65   "}\n".      "se
1a970 74 20 6c 69 6e 65 20 7b 7d 5c 6e 22 0a 20 20 20  t line {}\n".   
1a980 20 22 7d 20 65 6c 73 65 20 7b 5c 6e 22 0a 20 20   "} else {\n".  
1a990 20 20 20 20 22 61 70 70 65 6e 64 20 6c 69 6e 65      "append line
1a9a0 20 5c 5c 6e 5c 6e 22 0a 20 20 20 20 22 7d 5c 6e   \\n\n".    "}\n
1a9b0 22 0a 20 20 22 7d 5c 6e 22 0a 3b 0a 23 65 6e 64  ".  "}\n".;.#end
1a9c0 69 66 0a 0a 23 64 65 66 69 6e 65 20 54 43 4c 53  if..#define TCLS
1a9d0 48 5f 4d 41 49 4e 20 6d 61 69 6e 20 20 20 2f 2a  H_MAIN main   /*
1a9e0 20 4e 65 65 64 65 64 20 74 6f 20 66 61 6b 65 20   Needed to fake 
1a9f0 6f 75 74 20 6d 6b 74 63 6c 61 70 70 20 2a 2f 0a  out mktclapp */.
1aa00 69 6e 74 20 54 43 4c 53 48 5f 4d 41 49 4e 28 69  int TCLSH_MAIN(i
1aa10 6e 74 20 61 72 67 63 2c 20 63 68 61 72 20 2a 2a  nt argc, char **
1aa20 61 72 67 76 29 7b 0a 20 20 54 63 6c 5f 49 6e 74  argv){.  Tcl_Int
1aa30 65 72 70 20 2a 69 6e 74 65 72 70 3b 0a 20 20 0a  erp *interp;.  .
1aa40 20 20 2f 2a 20 43 61 6c 6c 20 73 71 6c 69 74 65    /* Call sqlite
1aa50 33 5f 73 68 75 74 64 6f 77 6e 28 29 20 6f 6e 63  3_shutdown() onc
1aa60 65 20 62 65 66 6f 72 65 20 64 6f 69 6e 67 20 61  e before doing a
1aa70 6e 79 74 68 69 6e 67 20 65 6c 73 65 2e 20 54 68  nything else. Th
1aa80 69 73 20 69 73 20 74 6f 0a 20 20 2a 2a 20 74 65  is is to.  ** te
1aa90 73 74 20 74 68 61 74 20 73 71 6c 69 74 65 33 5f  st that sqlite3_
1aaa0 73 68 75 74 64 6f 77 6e 28 29 20 63 61 6e 20 62  shutdown() can b
1aab0 65 20 73 61 66 65 6c 79 20 63 61 6c 6c 65 64 20  e safely called 
1aac0 62 79 20 61 20 70 72 6f 63 65 73 73 20 62 65 66  by a process bef
1aad0 6f 72 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33  ore.  ** sqlite3
1aae0 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 20 69 73  _initialize() is
1aaf0 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73  . */.  sqlite3_s
1ab00 68 75 74 64 6f 77 6e 28 29 3b 0a 0a 20 20 54 63  hutdown();..  Tc
1ab10 6c 5f 46 69 6e 64 45 78 65 63 75 74 61 62 6c 65  l_FindExecutable
1ab20 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 69 6e 74  (argv[0]);.  int
1ab30 65 72 70 20 3d 20 54 63 6c 5f 43 72 65 61 74 65  erp = Tcl_Create
1ab40 49 6e 74 65 72 70 28 29 3b 0a 20 20 53 71 6c 69  Interp();.  Sqli
1ab50 74 65 33 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  te3_Init(interp)
1ab60 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ;.#if defined(SQ
1ab70 4c 49 54 45 5f 54 45 53 54 29 20 7c 7c 20 64 65  LITE_TEST) || de
1ab80 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 43 4c  fined(SQLITE_TCL
1ab90 4d 44 35 29 0a 20 20 4d 64 35 5f 49 6e 69 74 28  MD5).  Md5_Init(
1aba0 69 6e 74 65 72 70 29 3b 0a 23 65 6e 64 69 66 0a  interp);.#endif.
1abb0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
1abc0 53 54 0a 20 20 7b 0a 20 20 20 20 65 78 74 65 72  ST.  {.    exter
1abd0 6e 20 69 6e 74 20 53 71 6c 69 74 65 63 6f 6e 66  n int Sqliteconf
1abe0 69 67 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  ig_Init(Tcl_Inte
1abf0 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e  rp*);.    extern
1ac00 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 31   int Sqlitetest1
1ac10 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
1ac20 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69  *);.    extern i
1ac30 6e 74 20 53 71 6c 69 74 65 74 65 73 74 32 5f 49  nt Sqlitetest2_I
1ac40 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29  nit(Tcl_Interp*)
1ac50 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74  ;.    extern int
1ac60 20 53 71 6c 69 74 65 74 65 73 74 33 5f 49 6e 69   Sqlitetest3_Ini
1ac70 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a  t(Tcl_Interp*);.
1ac80 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53      extern int S
1ac90 71 6c 69 74 65 74 65 73 74 34 5f 49 6e 69 74 28  qlitetest4_Init(
1aca0 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20  Tcl_Interp*);.  
1acb0 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c    extern int Sql
1acc0 69 74 65 74 65 73 74 35 5f 49 6e 69 74 28 54 63  itetest5_Init(Tc
1acd0 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20  l_Interp*);.    
1ace0 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74  extern int Sqlit
1acf0 65 74 65 73 74 36 5f 49 6e 69 74 28 54 63 6c 5f  etest6_Init(Tcl_
1ad00 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78  Interp*);.    ex
1ad10 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74  tern int Sqlitet
1ad20 65 73 74 37 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  est7_Init(Tcl_In
1ad30 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65  terp*);.    exte
1ad40 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73  rn int Sqlitetes
1ad50 74 38 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  t8_Init(Tcl_Inte
1ad60 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e  rp*);.    extern
1ad70 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 39   int Sqlitetest9
1ad80 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
1ad90 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69  *);.    extern i
1ada0 6e 74 20 53 71 6c 69 74 65 74 65 73 74 61 73 79  nt Sqlitetestasy
1adb0 6e 63 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  nc_Init(Tcl_Inte
1adc0 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e  rp*);.    extern
1add0 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 5f   int Sqlitetest_
1ade0 61 75 74 6f 65 78 74 5f 49 6e 69 74 28 54 63 6c  autoext_Init(Tcl
1adf0 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65  _Interp*);.    e
1ae00 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65  xtern int Sqlite
1ae10 74 65 73 74 5f 64 65 6d 6f 76 66 73 5f 49 6e 69  test_demovfs_Ini
1ae20 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 29 3b  t(Tcl_Interp *);
1ae30 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20  .    extern int 
1ae40 53 71 6c 69 74 65 74 65 73 74 5f 66 75 6e 63 5f  Sqlitetest_func_
1ae50 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a  Init(Tcl_Interp*
1ae60 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e  );.    extern in
1ae70 74 20 53 71 6c 69 74 65 74 65 73 74 5f 68 65 78  t Sqlitetest_hex
1ae80 69 6f 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  io_Init(Tcl_Inte
1ae90 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e  rp*);.    extern
1aea0 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 5f   int Sqlitetest_
1aeb0 69 6e 69 74 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  init_Init(Tcl_In
1aec0 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65  terp*);.    exte
1aed0 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73  rn int Sqlitetes
1aee0 74 5f 6d 61 6c 6c 6f 63 5f 49 6e 69 74 28 54 63  t_malloc_Init(Tc
1aef0 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20  l_Interp*);.    
1af00 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74  extern int Sqlit
1af10 65 74 65 73 74 5f 6d 75 74 65 78 5f 49 6e 69 74  etest_mutex_Init
1af20 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20  (Tcl_Interp*);. 
1af30 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71     extern int Sq
1af40 6c 69 74 65 74 65 73 74 73 63 68 65 6d 61 5f 49  litetestschema_I
1af50 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29  nit(Tcl_Interp*)
1af60 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74  ;.    extern int
1af70 20 53 71 6c 69 74 65 74 65 73 74 73 73 65 5f 49   Sqlitetestsse_I
1af80 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29  nit(Tcl_Interp*)
1af90 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74  ;.    extern int
1afa0 20 53 71 6c 69 74 65 74 65 73 74 74 63 6c 76 61   Sqlitetesttclva
1afb0 72 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  r_Init(Tcl_Inter
1afc0 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20  p*);.    extern 
1afd0 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 54 68  int SqlitetestTh
1afe0 72 65 61 64 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  read_Init(Tcl_In
1aff0 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65  terp*);.    exte
1b000 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73  rn int Sqlitetes
1b010 74 4f 6e 65 66 69 6c 65 5f 49 6e 69 74 28 29 3b  tOnefile_Init();
1b020 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20  .    extern int 
1b030 53 71 6c 69 74 65 74 65 73 74 4f 73 69 6e 73 74  SqlitetestOsinst
1b040 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
1b050 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69  *);.    extern i
1b060 6e 74 20 53 71 6c 69 74 65 74 65 73 74 62 61 63  nt Sqlitetestbac
1b070 6b 75 70 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74  kup_Init(Tcl_Int
1b080 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72  erp*);.    exter
1b090 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74  n int Sqlitetest
1b0a0 69 6e 74 61 72 72 61 79 5f 49 6e 69 74 28 54 63  intarray_Init(Tc
1b0b0 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 0a 20 20 20  l_Interp*);..   
1b0c0 20 53 71 6c 69 74 65 63 6f 6e 66 69 67 5f 49 6e   Sqliteconfig_In
1b0d0 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  it(interp);.    
1b0e0 53 71 6c 69 74 65 74 65 73 74 31 5f 49 6e 69 74  Sqlitetest1_Init
1b0f0 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71  (interp);.    Sq
1b100 6c 69 74 65 74 65 73 74 32 5f 49 6e 69 74 28 69  litetest2_Init(i
1b110 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69  nterp);.    Sqli
1b120 74 65 74 65 73 74 33 5f 49 6e 69 74 28 69 6e 74  tetest3_Init(int
1b130 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65  erp);.    Sqlite
1b140 74 65 73 74 34 5f 49 6e 69 74 28 69 6e 74 65 72  test4_Init(inter
1b150 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65  p);.    Sqlitete
1b160 73 74 35 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  st5_Init(interp)
1b170 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74  ;.    Sqlitetest
1b180 36 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a  6_Init(interp);.
1b190 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 37 5f      Sqlitetest7_
1b1a0 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  Init(interp);.  
1b1b0 20 20 53 71 6c 69 74 65 74 65 73 74 38 5f 49 6e    Sqlitetest8_In
1b1c0 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  it(interp);.    
1b1d0 53 71 6c 69 74 65 74 65 73 74 39 5f 49 6e 69 74  Sqlitetest9_Init
1b1e0 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71  (interp);.    Sq
1b1f0 6c 69 74 65 74 65 73 74 61 73 79 6e 63 5f 49 6e  litetestasync_In
1b200 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  it(interp);.    
1b210 53 71 6c 69 74 65 74 65 73 74 5f 61 75 74 6f 65  Sqlitetest_autoe
1b220 78 74 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b  xt_Init(interp);
1b230 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 5f  .    Sqlitetest_
1b240 64 65 6d 6f 76 66 73 5f 49 6e 69 74 28 69 6e 74  demovfs_Init(int
1b250 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65  erp);.    Sqlite
1b260 74 65 73 74 5f 66 75 6e 63 5f 49 6e 69 74 28 69  test_func_Init(i
1b270 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69  nterp);.    Sqli
1b280 74 65 74 65 73 74 5f 68 65 78 69 6f 5f 49 6e 69  tetest_hexio_Ini
1b290 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53  t(interp);.    S
1b2a0 71 6c 69 74 65 74 65 73 74 5f 69 6e 69 74 5f 49  qlitetest_init_I
1b2b0 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20  nit(interp);.   
1b2c0 20 53 71 6c 69 74 65 74 65 73 74 5f 6d 61 6c 6c   Sqlitetest_mall
1b2d0 6f 63 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b  oc_Init(interp);
1b2e0 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 5f  .    Sqlitetest_
1b2f0 6d 75 74 65 78 5f 49 6e 69 74 28 69 6e 74 65 72  mutex_Init(inter
1b300 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65  p);.    Sqlitete
1b310 73 74 73 63 68 65 6d 61 5f 49 6e 69 74 28 69 6e  stschema_Init(in
1b320 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74  terp);.    Sqlit
1b330 65 74 65 73 74 74 63 6c 76 61 72 5f 49 6e 69 74  etesttclvar_Init
1b340 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71  (interp);.    Sq
1b350 6c 69 74 65 74 65 73 74 54 68 72 65 61 64 5f 49  litetestThread_I
1b360 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20  nit(interp);.   
1b370 20 53 71 6c 69 74 65 74 65 73 74 4f 6e 65 66 69   SqlitetestOnefi
1b380 6c 65 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b  le_Init(interp);
1b390 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 4f  .    SqlitetestO
1b3a0 73 69 6e 73 74 5f 49 6e 69 74 28 69 6e 74 65 72  sinst_Init(inter
1b3b0 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65  p);.    Sqlitete
1b3c0 73 74 62 61 63 6b 75 70 5f 49 6e 69 74 28 69 6e  stbackup_Init(in
1b3d0 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74  terp);.    Sqlit
1b3e0 65 74 65 73 74 69 6e 74 61 72 72 61 79 5f 49 6e  etestintarray_In
1b3f0 69 74 28 69 6e 74 65 72 70 29 3b 0a 0a 23 69 66  it(interp);..#if
1b400 64 65 66 20 53 51 4c 49 54 45 5f 53 53 45 0a 20  def SQLITE_SSE. 
1b410 20 20 20 53 71 6c 69 74 65 74 65 73 74 73 73 65     Sqlitetestsse
1b420 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 23  _Init(interp);.#
1b430 65 6e 64 69 66 0a 20 20 7d 0a 23 65 6e 64 69 66  endif.  }.#endif
1b440 0a 20 20 69 66 28 20 61 72 67 63 3e 3d 32 20 29  .  if( argc>=2 )
1b450 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
1b460 20 63 68 61 72 20 7a 41 72 67 63 5b 33 32 5d 3b   char zArgc[32];
1b470 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
1b480 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 41 72  rintf(sizeof(zAr
1b490 67 63 29 2c 20 7a 41 72 67 63 2c 20 22 25 64 22  gc), zArgc, "%d"
1b4a0 2c 20 61 72 67 63 2d 28 33 2d 54 43 4c 53 48 29  , argc-(3-TCLSH)
1b4b0 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 56 61  );.    Tcl_SetVa
1b4c0 72 28 69 6e 74 65 72 70 2c 22 61 72 67 63 22 2c  r(interp,"argc",
1b4d0 20 7a 41 72 67 63 2c 20 54 43 4c 5f 47 4c 4f 42   zArgc, TCL_GLOB
1b4e0 41 4c 5f 4f 4e 4c 59 29 3b 0a 20 20 20 20 54 63  AL_ONLY);.    Tc
1b4f0 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c  l_SetVar(interp,
1b500 22 61 72 67 76 30 22 2c 61 72 67 76 5b 31 5d 2c  "argv0",argv[1],
1b510 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29  TCL_GLOBAL_ONLY)
1b520 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 56 61 72  ;.    Tcl_SetVar
1b530 28 69 6e 74 65 72 70 2c 22 61 72 67 76 22 2c 20  (interp,"argv", 
1b540 22 22 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f  "", TCL_GLOBAL_O
1b550 4e 4c 59 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  NLY);.    for(i=
1b560 33 2d 54 43 4c 53 48 3b 20 69 3c 61 72 67 63 3b  3-TCLSH; i<argc;
1b570 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 54 63 6c   i++){.      Tcl
1b580 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c 20  _SetVar(interp, 
1b590 22 61 72 67 76 22 2c 20 61 72 67 76 5b 69 5d 2c  "argv", argv[i],
1b5a0 0a 20 20 20 20 20 20 20 20 20 20 54 43 4c 5f 47  .          TCL_G
1b5b0 4c 4f 42 41 4c 5f 4f 4e 4c 59 20 7c 20 54 43 4c  LOBAL_ONLY | TCL
1b5c0 5f 4c 49 53 54 5f 45 4c 45 4d 45 4e 54 20 7c 20  _LIST_ELEMENT | 
1b5d0 54 43 4c 5f 41 50 50 45 4e 44 5f 56 41 4c 55 45  TCL_APPEND_VALUE
1b5e0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
1b5f0 20 54 63 6c 5f 45 76 61 6c 46 69 6c 65 28 69 6e   Tcl_EvalFile(in
1b600 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 29 21 3d  terp, argv[1])!=
1b610 54 43 4c 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  TCL_OK ){.      
1b620 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e 66  const char *zInf
1b630 6f 20 3d 20 54 63 6c 5f 47 65 74 56 61 72 28 69  o = Tcl_GetVar(i
1b640 6e 74 65 72 70 2c 20 22 65 72 72 6f 72 49 6e 66  nterp, "errorInf
1b650 6f 22 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f  o", TCL_GLOBAL_O
1b660 4e 4c 59 29 3b 0a 20 20 20 20 20 20 69 66 28 20  NLY);.      if( 
1b670 7a 49 6e 66 6f 3d 3d 30 20 29 20 7a 49 6e 66 6f  zInfo==0 ) zInfo
1b680 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
1b690 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a  Result(interp);.
1b6a0 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74        fprintf(st
1b6b0 64 65 72 72 2c 22 25 73 3a 20 25 73 5c 6e 22 2c  derr,"%s: %s\n",
1b6c0 20 2a 61 72 67 76 2c 20 7a 49 6e 66 6f 29 3b 0a   *argv, zInfo);.
1b6d0 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
1b6e0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
1b6f0 61 72 67 63 3c 3d 31 20 29 7b 0a 20 20 20 20 54  argc<=1 ){.    T
1b700 63 6c 5f 47 6c 6f 62 61 6c 45 76 61 6c 28 69 6e  cl_GlobalEval(in
1b710 74 65 72 70 2c 20 7a 4d 61 69 6e 6c 6f 6f 70 29  terp, zMainloop)
1b720 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
1b730 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 54 43  ;.}.#endif /* TC
1b740 4c 53 48 20 2a 2f 0a                             LSH */.