/ Hex Artifact Content
Login

Artifact 520e124994e68fd8804ade95b5d3e2e791d0958d:


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 50 72 65  .  Tcl_Obj *pPre
1200: 55 70 64 61 74 65 48 6f 6f 6b 3b 20 20 20 2f 2a  UpdateHook;   /*
1210: 20 50 72 65 2d 75 70 64 61 74 65 20 68 6f 6f 6b   Pre-update hook
1220: 20 73 63 72 69 70 74 20 28 69 66 20 61 6e 79 29   script (if any)
1230: 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70   */.  Tcl_Obj *p
1240: 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 3b 20 20 20  RollbackHook;   
1250: 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20 68 6f 6f   /* Rollback hoo
1260: 6b 20 73 63 72 69 70 74 20 28 69 66 20 61 6e 79  k script (if any
1270: 29 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  ) */.  Tcl_Obj *
1280: 70 57 61 6c 48 6f 6f 6b 3b 20 20 20 20 20 20 20  pWalHook;       
1290: 20 20 2f 2a 20 57 41 4c 20 68 6f 6f 6b 20 73 63    /* WAL hook sc
12a0: 72 69 70 74 20 28 69 66 20 61 6e 79 29 20 2a 2f  ript (if any) */
12b0: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 55 6e 6c  .  Tcl_Obj *pUnl
12c0: 6f 63 6b 4e 6f 74 69 66 79 3b 20 20 20 20 2f 2a  ockNotify;    /*
12d0: 20 55 6e 6c 6f 63 6b 20 6e 6f 74 69 66 79 20 73   Unlock notify s
12e0: 63 72 69 70 74 20 28 69 66 20 61 6e 79 29 20 2a  cript (if any) *
12f0: 2f 0a 20 20 53 71 6c 43 6f 6c 6c 61 74 65 20 2a  /.  SqlCollate *
1300: 70 43 6f 6c 6c 61 74 65 3b 20 20 20 20 20 20 2f  pCollate;      /
1310: 2a 20 4c 69 73 74 20 6f 66 20 53 51 4c 20 63 6f  * List of SQL co
1320: 6c 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e  llation function
1330: 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  s */.  int rc;  
1340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1350: 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
1360: 20 6f 66 20 6d 6f 73 74 20 72 65 63 65 6e 74 20   of most recent 
1370: 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29 20 2a  sqlite3_exec() *
1380: 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 43 6f  /.  Tcl_Obj *pCo
1390: 6c 6c 61 74 65 4e 65 65 64 65 64 3b 20 20 20 2f  llateNeeded;   /
13a0: 2a 20 43 6f 6c 6c 61 74 69 6f 6e 20 6e 65 65 64  * Collation need
13b0: 65 64 20 73 63 72 69 70 74 20 2a 2f 0a 20 20 53  ed script */.  S
13c0: 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74 20 2a  qlPreparedStmt *
13d0: 73 74 6d 74 4c 69 73 74 3b 20 2f 2a 20 4c 69 73  stmtList; /* Lis
13e0: 74 20 6f 66 20 70 72 65 70 61 72 65 64 20 73 74  t of prepared st
13f0: 61 74 65 6d 65 6e 74 73 2a 2f 0a 20 20 53 71 6c  atements*/.  Sql
1400: 50 72 65 70 61 72 65 64 53 74 6d 74 20 2a 73 74  PreparedStmt *st
1410: 6d 74 4c 61 73 74 3b 20 2f 2a 20 4c 61 73 74 20  mtLast; /* Last 
1420: 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 74 68 65  statement in the
1430: 20 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6d   list */.  int m
1440: 61 78 53 74 6d 74 3b 20 20 20 20 20 20 20 20 20  axStmt;         
1450: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 78        /* The nex
1460: 74 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  t maximum number
1470: 20 6f 66 20 73 74 6d 74 4c 69 73 74 20 2a 2f 0a   of stmtList */.
1480: 20 20 69 6e 74 20 6e 53 74 6d 74 3b 20 20 20 20    int nStmt;    
1490: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14a0: 4e 75 6d 62 65 72 20 6f 66 20 73 74 61 74 65 6d  Number of statem
14b0: 65 6e 74 73 20 69 6e 20 73 74 6d 74 4c 69 73 74  ents in stmtList
14c0: 20 2a 2f 0a 20 20 49 6e 63 72 62 6c 6f 62 43 68   */.  IncrblobCh
14d0: 61 6e 6e 65 6c 20 2a 70 49 6e 63 72 62 6c 6f 62  annel *pIncrblob
14e0: 3b 2f 2a 20 4c 69 6e 6b 65 64 20 6c 69 73 74 20  ;/* Linked list 
14f0: 6f 66 20 6f 70 65 6e 20 69 6e 63 72 62 6c 6f 62  of open incrblob
1500: 20 63 68 61 6e 6e 65 6c 73 20 2a 2f 0a 20 20 69   channels */.  i
1510: 6e 74 20 6e 53 74 65 70 2c 20 6e 53 6f 72 74 2c  nt nStep, nSort,
1520: 20 6e 49 6e 64 65 78 3b 20 20 2f 2a 20 53 74 61   nIndex;  /* Sta
1530: 74 69 73 74 69 63 73 20 66 6f 72 20 6d 6f 73 74  tistics for most
1540: 20 72 65 63 65 6e 74 20 6f 70 65 72 61 74 69 6f   recent operatio
1550: 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 72 61 6e  n */.  int nTran
1560: 73 61 63 74 69 6f 6e 3b 20 20 20 20 20 20 20 20  saction;        
1570: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6e    /* Number of n
1580: 65 73 74 65 64 20 5b 74 72 61 6e 73 61 63 74 69  ested [transacti
1590: 6f 6e 5d 20 6d 65 74 68 6f 64 73 20 2a 2f 0a 7d  on] methods */.}
15a0: 3b 0a 0a 73 74 72 75 63 74 20 49 6e 63 72 62 6c  ;..struct Incrbl
15b0: 6f 62 43 68 61 6e 6e 65 6c 20 7b 0a 20 20 73 71  obChannel {.  sq
15c0: 6c 69 74 65 33 5f 62 6c 6f 62 20 2a 70 42 6c 6f  lite3_blob *pBlo
15d0: 62 3b 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74  b;      /* sqlit
15e0: 65 33 20 62 6c 6f 62 20 68 61 6e 64 6c 65 20 2a  e3 blob handle *
15f0: 2f 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44  /.  SqliteDb *pD
1600: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  b;            /*
1610: 20 41 73 73 6f 63 69 61 74 65 64 20 64 61 74 61   Associated data
1620: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
1630: 2a 2f 0a 20 20 69 6e 74 20 69 53 65 65 6b 3b 20  */.  int iSeek; 
1640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1650: 2a 20 43 75 72 72 65 6e 74 20 73 65 65 6b 20 6f  * Current seek o
1660: 66 66 73 65 74 20 2a 2f 0a 20 20 54 63 6c 5f 43  ffset */.  Tcl_C
1670: 68 61 6e 6e 65 6c 20 63 68 61 6e 6e 65 6c 3b 20  hannel channel; 
1680: 20 20 20 20 20 2f 2a 20 43 68 61 6e 6e 65 6c 20       /* Channel 
1690: 69 64 65 6e 74 69 66 69 65 72 20 2a 2f 0a 20 20  identifier */.  
16a0: 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20  IncrblobChannel 
16b0: 2a 70 4e 65 78 74 3b 20 20 20 2f 2a 20 4c 69 6e  *pNext;   /* Lin
16c0: 6b 65 64 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20  ked list of all 
16d0: 6f 70 65 6e 20 69 6e 63 72 62 6c 6f 62 20 63 68  open incrblob ch
16e0: 61 6e 6e 65 6c 73 20 2a 2f 0a 20 20 49 6e 63 72  annels */.  Incr
16f0: 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 70 50 72  blobChannel *pPr
1700: 65 76 3b 20 20 20 2f 2a 20 4c 69 6e 6b 65 64 20  ev;   /* Linked 
1710: 6c 69 73 74 20 6f 66 20 61 6c 6c 20 6f 70 65 6e  list of all open
1720: 20 69 6e 63 72 62 6c 6f 62 20 63 68 61 6e 6e 65   incrblob channe
1730: 6c 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  ls */.};../*.** 
1740: 43 6f 6d 70 75 74 65 20 61 20 73 74 72 69 6e 67  Compute a string
1750: 20 6c 65 6e 67 74 68 20 74 68 61 74 20 69 73 20   length that is 
1760: 6c 69 6d 69 74 65 64 20 74 6f 20 77 68 61 74 20  limited to what 
1770: 63 61 6e 20 62 65 20 73 74 6f 72 65 64 20 69 6e  can be stored in
1780: 0a 2a 2a 20 6c 6f 77 65 72 20 33 30 20 62 69 74  .** lower 30 bit
1790: 73 20 6f 66 20 61 20 33 32 2d 62 69 74 20 73 69  s of a 32-bit si
17a0: 67 6e 65 64 20 69 6e 74 65 67 65 72 2e 0a 2a 2f  gned integer..*/
17b0: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 74 72 6c  .static int strl
17c0: 65 6e 33 30 28 63 6f 6e 73 74 20 63 68 61 72 20  en30(const char 
17d0: 2a 7a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  *z){.  const cha
17e0: 72 20 2a 7a 32 20 3d 20 7a 3b 0a 20 20 77 68 69  r *z2 = z;.  whi
17f0: 6c 65 28 20 2a 7a 32 20 29 7b 20 7a 32 2b 2b 3b  le( *z2 ){ z2++;
1800: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 78 33 66   }.  return 0x3f
1810: 66 66 66 66 66 66 20 26 20 28 69 6e 74 29 28 7a  ffffff & (int)(z
1820: 32 20 2d 20 7a 29 3b 0a 7d 0a 0a 0a 23 69 66 6e  2 - z);.}...#ifn
1830: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1840: 49 4e 43 52 42 4c 4f 42 0a 2f 2a 0a 2a 2a 20 43  INCRBLOB./*.** C
1850: 6c 6f 73 65 20 61 6c 6c 20 69 6e 63 72 62 6c 6f  lose all incrblo
1860: 62 20 63 68 61 6e 6e 65 6c 73 20 6f 70 65 6e 65  b channels opene
1870: 64 20 75 73 69 6e 67 20 64 61 74 61 62 61 73 65  d using database
1880: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 44 62 2e   connection pDb.
1890: 0a 2a 2a 20 54 68 69 73 20 69 73 20 63 61 6c 6c  .** This is call
18a0: 65 64 20 77 68 65 6e 20 73 68 75 74 74 69 6e 67  ed when shutting
18b0: 20 64 6f 77 6e 20 74 68 65 20 64 61 74 61 62 61   down the databa
18c0: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a  se connection..*
18d0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6c  /.static void cl
18e0: 6f 73 65 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e  oseIncrblobChann
18f0: 65 6c 73 28 53 71 6c 69 74 65 44 62 20 2a 70 44  els(SqliteDb *pD
1900: 62 29 7b 0a 20 20 49 6e 63 72 62 6c 6f 62 43 68  b){.  IncrblobCh
1910: 61 6e 6e 65 6c 20 2a 70 3b 0a 20 20 49 6e 63 72  annel *p;.  Incr
1920: 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 70 4e 65  blobChannel *pNe
1930: 78 74 3b 0a 0a 20 20 66 6f 72 28 70 3d 70 44 62  xt;..  for(p=pDb
1940: 2d 3e 70 49 6e 63 72 62 6c 6f 62 3b 20 70 3b 20  ->pIncrblob; p; 
1950: 70 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e  p=pNext){.    pN
1960: 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a  ext = p->pNext;.
1970: 0a 20 20 20 20 2f 2a 20 4e 6f 74 65 3a 20 43 61  .    /* Note: Ca
1980: 6c 6c 69 6e 67 20 75 6e 72 65 67 69 73 74 65 72  lling unregister
1990: 20 68 65 72 65 20 63 61 6c 6c 20 54 63 6c 5f 43   here call Tcl_C
19a0: 6c 6f 73 65 20 6f 6e 20 74 68 65 20 69 6e 63 72  lose on the incr
19b0: 62 6c 6f 62 20 63 68 61 6e 6e 65 6c 2c 20 0a 20  blob channel, . 
19c0: 20 20 20 2a 2a 20 77 68 69 63 68 20 64 65 6c 65     ** which dele
19d0: 74 65 73 20 74 68 65 20 49 6e 63 72 62 6c 6f 62  tes the Incrblob
19e0: 43 68 61 6e 6e 65 6c 20 73 74 72 75 63 74 75 72  Channel structur
19f0: 65 20 61 74 20 2a 70 2e 20 53 6f 20 64 6f 20 6e  e at *p. So do n
1a00: 6f 74 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 54  ot.    ** call T
1a10: 63 6c 5f 46 72 65 65 28 29 20 68 65 72 65 2e 0a  cl_Free() here..
1a20: 20 20 20 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 55      */.    Tcl_U
1a30: 6e 72 65 67 69 73 74 65 72 43 68 61 6e 6e 65 6c  nregisterChannel
1a40: 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20 70 2d  (pDb->interp, p-
1a50: 3e 63 68 61 6e 6e 65 6c 29 3b 0a 20 20 7d 0a 7d  >channel);.  }.}
1a60: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e  ../*.** Close an
1a70: 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 62 6c 6f   incremental blo
1a80: 62 20 63 68 61 6e 6e 65 6c 2e 0a 2a 2f 0a 73 74  b channel..*/.st
1a90: 61 74 69 63 20 69 6e 74 20 69 6e 63 72 62 6c 6f  atic int incrblo
1aa0: 62 43 6c 6f 73 65 28 43 6c 69 65 6e 74 44 61 74  bClose(ClientDat
1ab0: 61 20 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 20  a instanceData, 
1ac0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
1ad0: 72 70 29 7b 0a 20 20 49 6e 63 72 62 6c 6f 62 43  rp){.  IncrblobC
1ae0: 68 61 6e 6e 65 6c 20 2a 70 20 3d 20 28 49 6e 63  hannel *p = (Inc
1af0: 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 29 69  rblobChannel *)i
1b00: 6e 73 74 61 6e 63 65 44 61 74 61 3b 0a 20 20 69  nstanceData;.  i
1b10: 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  nt rc = sqlite3_
1b20: 62 6c 6f 62 5f 63 6c 6f 73 65 28 70 2d 3e 70 42  blob_close(p->pB
1b30: 6c 6f 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 20  lob);.  sqlite3 
1b40: 2a 64 62 20 3d 20 70 2d 3e 70 44 62 2d 3e 64 62  *db = p->pDb->db
1b50: 3b 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74  ;..  /* Remove t
1b60: 68 65 20 63 68 61 6e 6e 65 6c 20 66 72 6f 6d 20  he channel from 
1b70: 74 68 65 20 53 71 6c 69 74 65 44 62 2e 70 49 6e  the SqliteDb.pIn
1b80: 63 72 62 6c 6f 62 20 6c 69 73 74 2e 20 2a 2f 0a  crblob list. */.
1b90: 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29    if( p->pNext )
1ba0: 7b 0a 20 20 20 20 70 2d 3e 70 4e 65 78 74 2d 3e  {.    p->pNext->
1bb0: 70 50 72 65 76 20 3d 20 70 2d 3e 70 50 72 65 76  pPrev = p->pPrev
1bc0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70  ;.  }.  if( p->p
1bd0: 50 72 65 76 20 29 7b 0a 20 20 20 20 70 2d 3e 70  Prev ){.    p->p
1be0: 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d  Prev->pNext = p-
1bf0: 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66  >pNext;.  }.  if
1c00: 28 20 70 2d 3e 70 44 62 2d 3e 70 49 6e 63 72 62  ( p->pDb->pIncrb
1c10: 6c 6f 62 3d 3d 70 20 29 7b 0a 20 20 20 20 70 2d  lob==p ){.    p-
1c20: 3e 70 44 62 2d 3e 70 49 6e 63 72 62 6c 6f 62 20  >pDb->pIncrblob 
1c30: 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a  = p->pNext;.  }.
1c40: 0a 20 20 2f 2a 20 46 72 65 65 20 74 68 65 20 49  .  /* Free the I
1c50: 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 73  ncrblobChannel s
1c60: 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 54 63  tructure */.  Tc
1c70: 6c 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 70  l_Free((char *)p
1c80: 29 3b 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51  );..  if( rc!=SQ
1c90: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54  LITE_OK ){.    T
1ca0: 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
1cb0: 65 72 70 2c 20 28 63 68 61 72 20 2a 29 73 71 6c  erp, (char *)sql
1cc0: 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29 2c  ite3_errmsg(db),
1cd0: 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a   TCL_VOLATILE);.
1ce0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
1cf0: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75  RROR;.  }.  retu
1d00: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
1d10: 0a 2a 2a 20 52 65 61 64 20 64 61 74 61 20 66 72  .** Read data fr
1d20: 6f 6d 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61  om an incrementa
1d30: 6c 20 62 6c 6f 62 20 63 68 61 6e 6e 65 6c 2e 0a  l blob channel..
1d40: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e  */.static int in
1d50: 63 72 62 6c 6f 62 49 6e 70 75 74 28 0a 20 20 43  crblobInput(.  C
1d60: 6c 69 65 6e 74 44 61 74 61 20 69 6e 73 74 61 6e  lientData instan
1d70: 63 65 44 61 74 61 2c 20 0a 20 20 63 68 61 72 20  ceData, .  char 
1d80: 2a 62 75 66 2c 20 0a 20 20 69 6e 74 20 62 75 66  *buf, .  int buf
1d90: 53 69 7a 65 2c 0a 20 20 69 6e 74 20 2a 65 72 72  Size,.  int *err
1da0: 6f 72 43 6f 64 65 50 74 72 0a 29 7b 0a 20 20 49  orCodePtr.){.  I
1db0: 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a  ncrblobChannel *
1dc0: 70 20 3d 20 28 49 6e 63 72 62 6c 6f 62 43 68 61  p = (IncrblobCha
1dd0: 6e 6e 65 6c 20 2a 29 69 6e 73 74 61 6e 63 65 44  nnel *)instanceD
1de0: 61 74 61 3b 0a 20 20 69 6e 74 20 6e 52 65 61 64  ata;.  int nRead
1df0: 20 3d 20 62 75 66 53 69 7a 65 3b 20 20 20 20 20   = bufSize;     
1e00: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1e10: 20 62 79 74 65 73 20 74 6f 20 72 65 61 64 20 2a   bytes to read *
1e20: 2f 0a 20 20 69 6e 74 20 6e 42 6c 6f 62 3b 20 20  /.  int nBlob;  
1e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e40: 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20 6f   /* Total size o
1e50: 66 20 74 68 65 20 62 6c 6f 62 20 2a 2f 0a 20 20  f the blob */.  
1e60: 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
1e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e80: 73 71 6c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  sqlite error cod
1e90: 65 20 2a 2f 0a 0a 20 20 6e 42 6c 6f 62 20 3d 20  e */..  nBlob = 
1ea0: 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 62 79 74  sqlite3_blob_byt
1eb0: 65 73 28 70 2d 3e 70 42 6c 6f 62 29 3b 0a 20 20  es(p->pBlob);.  
1ec0: 69 66 28 20 28 70 2d 3e 69 53 65 65 6b 2b 6e 52  if( (p->iSeek+nR
1ed0: 65 61 64 29 3e 6e 42 6c 6f 62 20 29 7b 0a 20 20  ead)>nBlob ){.  
1ee0: 20 20 6e 52 65 61 64 20 3d 20 6e 42 6c 6f 62 2d    nRead = nBlob-
1ef0: 70 2d 3e 69 53 65 65 6b 3b 0a 20 20 7d 0a 20 20  p->iSeek;.  }.  
1f00: 69 66 28 20 6e 52 65 61 64 3c 3d 30 20 29 7b 0a  if( nRead<=0 ){.
1f10: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
1f20: 7d 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  }..  rc = sqlite
1f30: 33 5f 62 6c 6f 62 5f 72 65 61 64 28 70 2d 3e 70  3_blob_read(p->p
1f40: 42 6c 6f 62 2c 20 28 76 6f 69 64 20 2a 29 62 75  Blob, (void *)bu
1f50: 66 2c 20 6e 52 65 61 64 2c 20 70 2d 3e 69 53 65  f, nRead, p->iSe
1f60: 65 6b 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ek);.  if( rc!=S
1f70: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1f80: 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20  *errorCodePtr = 
1f90: 72 63 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 2d  rc;.    return -
1fa0: 31 3b 0a 20 20 7d 0a 0a 20 20 70 2d 3e 69 53 65  1;.  }..  p->iSe
1fb0: 65 6b 20 2b 3d 20 6e 52 65 61 64 3b 0a 20 20 72  ek += nRead;.  r
1fc0: 65 74 75 72 6e 20 6e 52 65 61 64 3b 0a 7d 0a 0a  eturn nRead;.}..
1fd0: 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 64 61 74 61  /*.** Write data
1fe0: 20 74 6f 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74   to an increment
1ff0: 61 6c 20 62 6c 6f 62 20 63 68 61 6e 6e 65 6c 2e  al blob channel.
2000: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69  .*/.static int i
2010: 6e 63 72 62 6c 6f 62 4f 75 74 70 75 74 28 0a 20  ncrblobOutput(. 
2020: 20 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73 74   ClientData inst
2030: 61 6e 63 65 44 61 74 61 2c 20 0a 20 20 43 4f 4e  anceData, .  CON
2040: 53 54 20 63 68 61 72 20 2a 62 75 66 2c 20 0a 20  ST char *buf, . 
2050: 20 69 6e 74 20 74 6f 57 72 69 74 65 2c 0a 20 20   int toWrite,.  
2060: 69 6e 74 20 2a 65 72 72 6f 72 43 6f 64 65 50 74  int *errorCodePt
2070: 72 0a 29 7b 0a 20 20 49 6e 63 72 62 6c 6f 62 43  r.){.  IncrblobC
2080: 68 61 6e 6e 65 6c 20 2a 70 20 3d 20 28 49 6e 63  hannel *p = (Inc
2090: 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 29 69  rblobChannel *)i
20a0: 6e 73 74 61 6e 63 65 44 61 74 61 3b 0a 20 20 69  nstanceData;.  i
20b0: 6e 74 20 6e 57 72 69 74 65 20 3d 20 74 6f 57 72  nt nWrite = toWr
20c0: 69 74 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e  ite;        /* N
20d0: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74  umber of bytes t
20e0: 6f 20 77 72 69 74 65 20 2a 2f 0a 20 20 69 6e 74  o write */.  int
20f0: 20 6e 42 6c 6f 62 3b 20 20 20 20 20 20 20 20 20   nBlob;         
2100: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74            /* Tot
2110: 61 6c 20 73 69 7a 65 20 6f 66 20 74 68 65 20 62  al size of the b
2120: 6c 6f 62 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  lob */.  int rc;
2130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2140: 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 20        /* sqlite 
2150: 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 0a 20  error code */.. 
2160: 20 6e 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33   nBlob = sqlite3
2170: 5f 62 6c 6f 62 5f 62 79 74 65 73 28 70 2d 3e 70  _blob_bytes(p->p
2180: 42 6c 6f 62 29 3b 0a 20 20 69 66 28 20 28 70 2d  Blob);.  if( (p-
2190: 3e 69 53 65 65 6b 2b 6e 57 72 69 74 65 29 3e 6e  >iSeek+nWrite)>n
21a0: 42 6c 6f 62 20 29 7b 0a 20 20 20 20 2a 65 72 72  Blob ){.    *err
21b0: 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 49 4e 56  orCodePtr = EINV
21c0: 41 4c 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 2d  AL;.    return -
21d0: 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 57 72  1;.  }.  if( nWr
21e0: 69 74 65 3c 3d 30 20 29 7b 0a 20 20 20 20 72 65  ite<=0 ){.    re
21f0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 72  turn 0;.  }..  r
2200: 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62  c = sqlite3_blob
2210: 5f 77 72 69 74 65 28 70 2d 3e 70 42 6c 6f 62 2c  _write(p->pBlob,
2220: 20 28 76 6f 69 64 20 2a 29 62 75 66 2c 20 6e 57   (void *)buf, nW
2230: 72 69 74 65 2c 20 70 2d 3e 69 53 65 65 6b 29 3b  rite, p->iSeek);
2240: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
2250: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 65 72 72  E_OK ){.    *err
2260: 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 49 4f 3b  orCodePtr = EIO;
2270: 0a 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a  .    return -1;.
2280: 20 20 7d 0a 0a 20 20 70 2d 3e 69 53 65 65 6b 20    }..  p->iSeek 
2290: 2b 3d 20 6e 57 72 69 74 65 3b 0a 20 20 72 65 74  += nWrite;.  ret
22a0: 75 72 6e 20 6e 57 72 69 74 65 3b 0a 7d 0a 0a 2f  urn nWrite;.}../
22b0: 2a 0a 2a 2a 20 53 65 65 6b 20 61 6e 20 69 6e 63  *.** Seek an inc
22c0: 72 65 6d 65 6e 74 61 6c 20 62 6c 6f 62 20 63 68  remental blob ch
22d0: 61 6e 6e 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63  annel..*/.static
22e0: 20 69 6e 74 20 69 6e 63 72 62 6c 6f 62 53 65 65   int incrblobSee
22f0: 6b 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20  k(.  ClientData 
2300: 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 20 0a 20  instanceData, . 
2310: 20 6c 6f 6e 67 20 6f 66 66 73 65 74 2c 0a 20 20   long offset,.  
2320: 69 6e 74 20 73 65 65 6b 4d 6f 64 65 2c 0a 20 20  int seekMode,.  
2330: 69 6e 74 20 2a 65 72 72 6f 72 43 6f 64 65 50 74  int *errorCodePt
2340: 72 0a 29 7b 0a 20 20 49 6e 63 72 62 6c 6f 62 43  r.){.  IncrblobC
2350: 68 61 6e 6e 65 6c 20 2a 70 20 3d 20 28 49 6e 63  hannel *p = (Inc
2360: 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 29 69  rblobChannel *)i
2370: 6e 73 74 61 6e 63 65 44 61 74 61 3b 0a 0a 20 20  nstanceData;..  
2380: 73 77 69 74 63 68 28 20 73 65 65 6b 4d 6f 64 65  switch( seekMode
2390: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 45 45   ){.    case SEE
23a0: 4b 5f 53 45 54 3a 0a 20 20 20 20 20 20 70 2d 3e  K_SET:.      p->
23b0: 69 53 65 65 6b 20 3d 20 6f 66 66 73 65 74 3b 0a  iSeek = offset;.
23c0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
23d0: 20 63 61 73 65 20 53 45 45 4b 5f 43 55 52 3a 0a   case SEEK_CUR:.
23e0: 20 20 20 20 20 20 70 2d 3e 69 53 65 65 6b 20 2b        p->iSeek +
23f0: 3d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  = offset;.      
2400: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
2410: 53 45 45 4b 5f 45 4e 44 3a 0a 20 20 20 20 20 20  SEEK_END:.      
2420: 70 2d 3e 69 53 65 65 6b 20 3d 20 73 71 6c 69 74  p->iSeek = sqlit
2430: 65 33 5f 62 6c 6f 62 5f 62 79 74 65 73 28 70 2d  e3_blob_bytes(p-
2440: 3e 70 42 6c 6f 62 29 20 2b 20 6f 66 66 73 65 74  >pBlob) + offset
2450: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a  ;.      break;..
2460: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 61 73 73      default: ass
2470: 65 72 74 28 21 22 42 61 64 20 73 65 65 6b 4d 6f  ert(!"Bad seekMo
2480: 64 65 22 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  de");.  }..  ret
2490: 75 72 6e 20 70 2d 3e 69 53 65 65 6b 3b 0a 7d 0a  urn p->iSeek;.}.
24a0: 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e  ..static void in
24b0: 63 72 62 6c 6f 62 57 61 74 63 68 28 43 6c 69 65  crblobWatch(Clie
24c0: 6e 74 44 61 74 61 20 69 6e 73 74 61 6e 63 65 44  ntData instanceD
24d0: 61 74 61 2c 20 69 6e 74 20 6d 6f 64 65 29 7b 20  ata, int mode){ 
24e0: 0a 20 20 2f 2a 20 4e 4f 2d 4f 50 20 2a 2f 20 0a  .  /* NO-OP */ .
24f0: 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 63  }.static int inc
2500: 72 62 6c 6f 62 48 61 6e 64 6c 65 28 43 6c 69 65  rblobHandle(Clie
2510: 6e 74 44 61 74 61 20 69 6e 73 74 61 6e 63 65 44  ntData instanceD
2520: 61 74 61 2c 20 69 6e 74 20 64 69 72 2c 20 43 6c  ata, int dir, Cl
2530: 69 65 6e 74 44 61 74 61 20 2a 68 50 74 72 29 7b  ientData *hPtr){
2540: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  .  return TCL_ER
2550: 52 4f 52 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 54  ROR;.}..static T
2560: 63 6c 5f 43 68 61 6e 6e 65 6c 54 79 70 65 20 49  cl_ChannelType I
2570: 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 54 79  ncrblobChannelTy
2580: 70 65 20 3d 20 7b 0a 20 20 22 69 6e 63 72 62 6c  pe = {.  "incrbl
2590: 6f 62 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ob",            
25a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74              /* t
25b0: 79 70 65 4e 61 6d 65 20 20 20 20 20 20 20 20 20  ypeName         
25c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25d0: 20 20 20 20 2a 2f 0a 20 20 54 43 4c 5f 43 48 41      */.  TCL_CHA
25e0: 4e 4e 45 4c 5f 56 45 52 53 49 4f 4e 5f 32 2c 20  NNEL_VERSION_2, 
25f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 76              /* v
2600: 65 72 73 69 6f 6e 20 20 20 20 20 20 20 20 20 20  ersion          
2610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2620: 20 20 20 20 2a 2f 0a 20 20 69 6e 63 72 62 6c 6f      */.  incrblo
2630: 62 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20  bClose,         
2640: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 63              /* c
2650: 6c 6f 73 65 50 72 6f 63 20 20 20 20 20 20 20 20  loseProc        
2660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2670: 20 20 20 20 2a 2f 0a 20 20 69 6e 63 72 62 6c 6f      */.  incrblo
2680: 62 49 6e 70 75 74 2c 20 20 20 20 20 20 20 20 20  bInput,         
2690: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69              /* i
26a0: 6e 70 75 74 50 72 6f 63 20 20 20 20 20 20 20 20  nputProc        
26b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26c0: 20 20 20 20 2a 2f 0a 20 20 69 6e 63 72 62 6c 6f      */.  incrblo
26d0: 62 4f 75 74 70 75 74 2c 20 20 20 20 20 20 20 20  bOutput,        
26e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6f              /* o
26f0: 75 74 70 75 74 50 72 6f 63 20 20 20 20 20 20 20  utputProc       
2700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2710: 20 20 20 20 2a 2f 0a 20 20 69 6e 63 72 62 6c 6f      */.  incrblo
2720: 62 53 65 65 6b 2c 20 20 20 20 20 20 20 20 20 20  bSeek,          
2730: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
2740: 65 65 6b 50 72 6f 63 20 20 20 20 20 20 20 20 20  eekProc         
2750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2760: 20 20 20 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20      */.  0,     
2770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2780: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
2790: 65 74 4f 70 74 69 6f 6e 50 72 6f 63 20 20 20 20  etOptionProc    
27a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27b0: 20 20 20 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20      */.  0,     
27c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 67              /* g
27e0: 65 74 4f 70 74 69 6f 6e 50 72 6f 63 20 20 20 20  etOptionProc    
27f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2800: 20 20 20 20 2a 2f 0a 20 20 69 6e 63 72 62 6c 6f      */.  incrblo
2810: 62 57 61 74 63 68 2c 20 20 20 20 20 20 20 20 20  bWatch,         
2820: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 77              /* w
2830: 61 74 63 68 50 72 6f 63 20 28 74 68 69 73 20 69  atchProc (this i
2840: 73 20 61 20 6e 6f 2d 6f 70 29 20 20 20 20 20 20  s a no-op)      
2850: 20 20 20 20 2a 2f 0a 20 20 69 6e 63 72 62 6c 6f      */.  incrblo
2860: 62 48 61 6e 64 6c 65 2c 20 20 20 20 20 20 20 20  bHandle,        
2870: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 67              /* g
2880: 65 74 48 61 6e 64 6c 65 50 72 6f 63 20 28 61 6c  etHandleProc (al
2890: 77 61 79 73 20 72 65 74 75 72 6e 73 20 65 72 72  ways returns err
28a0: 6f 72 29 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20  or) */.  0,     
28b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 63              /* c
28d0: 6c 6f 73 65 32 50 72 6f 63 20 20 20 20 20 20 20  lose2Proc       
28e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28f0: 20 20 20 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20      */.  0,     
2900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2910: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 62              /* b
2920: 6c 6f 63 6b 4d 6f 64 65 50 72 6f 63 20 20 20 20  lockModeProc    
2930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2940: 20 20 20 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20      */.  0,     
2950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2960: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66              /* f
2970: 6c 75 73 68 50 72 6f 63 20 20 20 20 20 20 20 20  lushProc        
2980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2990: 20 20 20 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20      */.  0,     
29a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 68              /* h
29c0: 61 6e 64 6c 65 72 50 72 6f 63 20 20 20 20 20 20  andlerProc      
29d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29e0: 20 20 20 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20      */.  0,     
29f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 77              /* w
2a10: 69 64 65 53 65 65 6b 50 72 6f 63 20 20 20 20 20  ideSeekProc     
2a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a30: 20 20 20 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a      */.};../*.**
2a40: 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 69 6e   Create a new in
2a50: 63 72 62 6c 6f 62 20 63 68 61 6e 6e 65 6c 2e 0a  crblob channel..
2a60: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 72  */.static int cr
2a70: 65 61 74 65 49 6e 63 72 62 6c 6f 62 43 68 61 6e  eateIncrblobChan
2a80: 6e 65 6c 28 0a 20 20 54 63 6c 5f 49 6e 74 65 72  nel(.  Tcl_Inter
2a90: 70 20 2a 69 6e 74 65 72 70 2c 20 0a 20 20 53 71  p *interp, .  Sq
2aa0: 6c 69 74 65 44 62 20 2a 70 44 62 2c 20 0a 20 20  liteDb *pDb, .  
2ab0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 2c  const char *zDb,
2ac0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
2ad0: 54 61 62 6c 65 2c 20 0a 20 20 63 6f 6e 73 74 20  Table, .  const 
2ae0: 63 68 61 72 20 2a 7a 43 6f 6c 75 6d 6e 2c 20 0a  char *zColumn, .
2af0: 20 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 69    sqlite_int64 i
2b00: 52 6f 77 2c 0a 20 20 69 6e 74 20 69 73 52 65 61  Row,.  int isRea
2b10: 64 6f 6e 6c 79 0a 29 7b 0a 20 20 49 6e 63 72 62  donly.){.  Incrb
2b20: 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 70 3b 0a 20  lobChannel *p;. 
2b30: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
2b40: 44 62 2d 3e 64 62 3b 0a 20 20 73 71 6c 69 74 65  Db->db;.  sqlite
2b50: 33 5f 62 6c 6f 62 20 2a 70 42 6c 6f 62 3b 0a 20  3_blob *pBlob;. 
2b60: 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 66   int rc;.  int f
2b70: 6c 61 67 73 20 3d 20 54 43 4c 5f 52 45 41 44 41  lags = TCL_READA
2b80: 42 4c 45 7c 28 69 73 52 65 61 64 6f 6e 6c 79 20  BLE|(isReadonly 
2b90: 3f 20 30 20 3a 20 54 43 4c 5f 57 52 49 54 41 42  ? 0 : TCL_WRITAB
2ba0: 4c 45 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20  LE);..  /* This 
2bb0: 76 61 72 69 61 62 6c 65 20 69 73 20 75 73 65 64  variable is used
2bc0: 20 74 6f 20 6e 61 6d 65 20 74 68 65 20 63 68 61   to name the cha
2bd0: 6e 6e 65 6c 73 3a 20 22 69 6e 63 72 62 6c 6f 62  nnels: "incrblob
2be0: 5f 5b 69 6e 63 72 20 63 6f 75 6e 74 5d 22 20 2a  _[incr count]" *
2bf0: 2f 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 63  /.  static int c
2c00: 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 63 68 61 72  ount = 0;.  char
2c10: 20 7a 43 68 61 6e 6e 65 6c 5b 36 34 5d 3b 0a 0a   zChannel[64];..
2c20: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62    rc = sqlite3_b
2c30: 6c 6f 62 5f 6f 70 65 6e 28 64 62 2c 20 7a 44 62  lob_open(db, zDb
2c40: 2c 20 7a 54 61 62 6c 65 2c 20 7a 43 6f 6c 75 6d  , zTable, zColum
2c50: 6e 2c 20 69 52 6f 77 2c 20 21 69 73 52 65 61 64  n, iRow, !isRead
2c60: 6f 6e 6c 79 2c 20 26 70 42 6c 6f 62 29 3b 0a 20  only, &pBlob);. 
2c70: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2c80: 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65  OK ){.    Tcl_Se
2c90: 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  tResult(interp, 
2ca0: 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f  (char *)sqlite3_
2cb0: 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c  errmsg(pDb->db),
2cc0: 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a   TCL_VOLATILE);.
2cd0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
2ce0: 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 70 20 3d  RROR;.  }..  p =
2cf0: 20 28 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65   (IncrblobChanne
2d00: 6c 20 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28 73 69  l *)Tcl_Alloc(si
2d10: 7a 65 6f 66 28 49 6e 63 72 62 6c 6f 62 43 68 61  zeof(IncrblobCha
2d20: 6e 6e 65 6c 29 29 3b 0a 20 20 70 2d 3e 69 53 65  nnel));.  p->iSe
2d30: 65 6b 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 42 6c  ek = 0;.  p->pBl
2d40: 6f 62 20 3d 20 70 42 6c 6f 62 3b 0a 0a 20 20 73  ob = pBlob;..  s
2d50: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
2d60: 73 69 7a 65 6f 66 28 7a 43 68 61 6e 6e 65 6c 29  sizeof(zChannel)
2d70: 2c 20 7a 43 68 61 6e 6e 65 6c 2c 20 22 69 6e 63  , zChannel, "inc
2d80: 72 62 6c 6f 62 5f 25 64 22 2c 20 2b 2b 63 6f 75  rblob_%d", ++cou
2d90: 6e 74 29 3b 0a 20 20 70 2d 3e 63 68 61 6e 6e 65  nt);.  p->channe
2da0: 6c 20 3d 20 54 63 6c 5f 43 72 65 61 74 65 43 68  l = Tcl_CreateCh
2db0: 61 6e 6e 65 6c 28 26 49 6e 63 72 62 6c 6f 62 43  annel(&IncrblobC
2dc0: 68 61 6e 6e 65 6c 54 79 70 65 2c 20 7a 43 68 61  hannelType, zCha
2dd0: 6e 6e 65 6c 2c 20 70 2c 20 66 6c 61 67 73 29 3b  nnel, p, flags);
2de0: 0a 20 20 54 63 6c 5f 52 65 67 69 73 74 65 72 43  .  Tcl_RegisterC
2df0: 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 70  hannel(interp, p
2e00: 2d 3e 63 68 61 6e 6e 65 6c 29 3b 0a 0a 20 20 2f  ->channel);..  /
2e10: 2a 20 4c 69 6e 6b 20 74 68 65 20 6e 65 77 20 63  * Link the new c
2e20: 68 61 6e 6e 65 6c 20 69 6e 74 6f 20 74 68 65 20  hannel into the 
2e30: 53 71 6c 69 74 65 44 62 2e 70 49 6e 63 72 62 6c  SqliteDb.pIncrbl
2e40: 6f 62 20 6c 69 73 74 2e 20 2a 2f 0a 20 20 70 2d  ob list. */.  p-
2e50: 3e 70 4e 65 78 74 20 3d 20 70 44 62 2d 3e 70 49  >pNext = pDb->pI
2e60: 6e 63 72 62 6c 6f 62 3b 0a 20 20 70 2d 3e 70 50  ncrblob;.  p->pP
2e70: 72 65 76 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  rev = 0;.  if( p
2e80: 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 70  ->pNext ){.    p
2e90: 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d  ->pNext->pPrev =
2ea0: 20 70 3b 0a 20 20 7d 0a 20 20 70 44 62 2d 3e 70   p;.  }.  pDb->p
2eb0: 49 6e 63 72 62 6c 6f 62 20 3d 20 70 3b 0a 20 20  Incrblob = p;.  
2ec0: 70 2d 3e 70 44 62 20 3d 20 70 44 62 3b 0a 0a 20  p->pDb = pDb;.. 
2ed0: 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
2ee0: 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 54  nterp, (char *)T
2ef0: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d  cl_GetChannelNam
2f00: 65 28 70 2d 3e 63 68 61 6e 6e 65 6c 29 2c 20 54  e(p->channel), T
2f10: 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20  CL_VOLATILE);.  
2f20: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
2f30: 0a 23 65 6c 73 65 20 20 2f 2a 20 65 6c 73 65 20  .#else  /* else 
2f40: 63 6c 61 75 73 65 20 66 6f 72 20 22 23 69 66 6e  clause for "#ifn
2f50: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2f60: 49 4e 43 52 42 4c 4f 42 22 20 2a 2f 0a 20 20 23  INCRBLOB" */.  #
2f70: 64 65 66 69 6e 65 20 63 6c 6f 73 65 49 6e 63 72  define closeIncr
2f80: 62 6c 6f 62 43 68 61 6e 6e 65 6c 73 28 70 44 62  blobChannels(pDb
2f90: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
2fa0: 4c 6f 6f 6b 20 61 74 20 74 68 65 20 73 63 72 69  Look at the scri
2fb0: 70 74 20 70 72 65 66 69 78 20 69 6e 20 70 43 6d  pt prefix in pCm
2fc0: 64 2e 20 20 57 65 20 77 69 6c 6c 20 62 65 20 65  d.  We will be e
2fd0: 78 65 63 75 74 69 6e 67 20 74 68 69 73 20 73 63  xecuting this sc
2fe0: 72 69 70 74 0a 2a 2a 20 61 66 74 65 72 20 66 69  ript.** after fi
2ff0: 72 73 74 20 61 70 70 65 6e 64 69 6e 67 20 6f 6e  rst appending on
3000: 65 20 6f 72 20 6d 6f 72 65 20 61 72 67 75 6d 65  e or more argume
3010: 6e 74 73 2e 20 20 54 68 69 73 20 72 6f 75 74 69  nts.  This routi
3020: 6e 65 20 61 6e 61 6c 79 7a 65 73 0a 2a 2a 20 74  ne analyzes.** t
3030: 68 65 20 73 63 72 69 70 74 20 74 6f 20 73 65 65  he script to see
3040: 20 69 66 20 69 74 20 69 73 20 73 61 66 65 20 74   if it is safe t
3050: 6f 20 75 73 65 20 54 63 6c 5f 45 76 61 6c 4f 62  o use Tcl_EvalOb
3060: 6a 76 28 29 20 6f 6e 20 74 68 65 20 73 63 72 69  jv() on the scri
3070: 70 74 0a 2a 2a 20 72 61 74 68 65 72 20 74 68 61  pt.** rather tha
3080: 6e 20 74 68 65 20 6d 6f 72 65 20 67 65 6e 65 72  n the more gener
3090: 61 6c 20 54 63 6c 5f 45 76 61 6c 45 78 28 29 2e  al Tcl_EvalEx().
30a0: 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 76 28 29    Tcl_EvalObjv()
30b0: 20 69 73 20 6d 75 63 68 0a 2a 2a 20 66 61 73 74   is much.** fast
30c0: 65 72 2e 0a 2a 2a 0a 2a 2a 20 53 63 72 69 70 74  er..**.** Script
30d0: 73 20 74 68 61 74 20 61 72 65 20 73 61 66 65 20  s that are safe 
30e0: 74 6f 20 75 73 65 20 77 69 74 68 20 54 63 6c 5f  to use with Tcl_
30f0: 45 76 61 6c 4f 62 6a 76 28 29 20 63 6f 6e 73 69  EvalObjv() consi
3100: 73 74 73 20 6f 66 20 61 0a 2a 2a 20 63 6f 6d 6d  sts of a.** comm
3110: 61 6e 64 20 6e 61 6d 65 20 66 6f 6c 6c 6f 77 65  and name followe
3120: 64 20 62 79 20 7a 65 72 6f 20 6f 72 20 6d 6f 72  d by zero or mor
3130: 65 20 61 72 67 75 6d 65 6e 74 73 20 77 69 74 68  e arguments with
3140: 20 6e 6f 20 5b 2e 2e 2e 5d 20 6f 72 20 24 0a 2a   no [...] or $.*
3150: 2a 20 6f 72 20 7b 2e 2e 2e 7d 20 6f 72 20 3b 20  * or {...} or ; 
3160: 74 6f 20 62 65 20 73 65 65 6e 20 61 6e 79 77 68  to be seen anywh
3170: 65 72 65 2e 20 20 4d 6f 73 74 20 63 61 6c 6c 62  ere.  Most callb
3180: 61 63 6b 20 73 63 72 69 70 74 73 20 63 6f 6e 73  ack scripts cons
3190: 69 73 74 0a 2a 2a 20 6f 66 20 6a 75 73 74 20 61  ist.** of just a
31a0: 20 73 69 6e 67 6c 65 20 70 72 6f 63 65 64 75 72   single procedur
31b0: 65 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 79 20  e name and they 
31c0: 6d 65 65 74 20 74 68 69 73 20 72 65 71 75 69 72  meet this requir
31d0: 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ement..*/.static
31e0: 20 69 6e 74 20 73 61 66 65 54 6f 55 73 65 45 76   int safeToUseEv
31f0: 61 6c 4f 62 6a 76 28 54 63 6c 5f 49 6e 74 65 72  alObjv(Tcl_Inter
3200: 70 20 2a 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4f  p *interp, Tcl_O
3210: 62 6a 20 2a 70 43 6d 64 29 7b 0a 20 20 2f 2a 20  bj *pCmd){.  /* 
3220: 57 65 20 63 6f 75 6c 64 20 74 72 79 20 74 6f 20  We could try to 
3230: 64 6f 20 73 6f 6d 65 74 68 69 6e 67 20 77 69 74  do something wit
3240: 68 20 54 63 6c 5f 50 61 72 73 65 28 29 2e 20 20  h Tcl_Parse().  
3250: 42 75 74 20 77 65 20 77 69 6c 6c 20 69 6e 73 74  But we will inst
3260: 65 61 64 0a 20 20 2a 2a 20 6a 75 73 74 20 64 6f  ead.  ** just do
3270: 20 61 20 73 65 61 72 63 68 20 66 6f 72 20 66 6f   a search for fo
3280: 72 62 69 64 64 65 6e 20 63 68 61 72 61 63 74 65  rbidden characte
3290: 72 73 2e 20 20 49 66 20 61 6e 79 20 6f 66 20 74  rs.  If any of t
32a0: 68 65 20 66 6f 72 62 69 64 64 65 6e 0a 20 20 2a  he forbidden.  *
32b0: 2a 20 63 68 61 72 61 63 74 65 72 73 20 61 70 70  * characters app
32c0: 65 61 72 20 69 6e 20 70 43 6d 64 2c 20 77 65 20  ear in pCmd, we 
32d0: 77 69 6c 6c 20 72 65 70 6f 72 74 20 74 68 65 20  will report the 
32e0: 73 74 72 69 6e 67 20 61 73 20 75 6e 73 61 66 65  string as unsafe
32f0: 2e 0a 20 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ..  */.  const c
3300: 68 61 72 20 2a 7a 3b 0a 20 20 69 6e 74 20 6e 3b  har *z;.  int n;
3310: 0a 20 20 7a 20 3d 20 54 63 6c 5f 47 65 74 53 74  .  z = Tcl_GetSt
3320: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 70 43 6d 64  ringFromObj(pCmd
3330: 2c 20 26 6e 29 3b 0a 20 20 77 68 69 6c 65 28 20  , &n);.  while( 
3340: 6e 2d 2d 20 3e 20 30 20 29 7b 0a 20 20 20 20 69  n-- > 0 ){.    i
3350: 6e 74 20 63 20 3d 20 2a 28 7a 2b 2b 29 3b 0a 20  nt c = *(z++);. 
3360: 20 20 20 69 66 28 20 63 3d 3d 27 24 27 20 7c 7c     if( c=='$' ||
3370: 20 63 3d 3d 27 5b 27 20 7c 7c 20 63 3d 3d 27 3b   c=='[' || c==';
3380: 27 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ' ) return 0;.  
3390: 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  }.  return 1;.}.
33a0: 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61 6e 20 53  ./*.** Find an S
33b0: 71 6c 46 75 6e 63 20 73 74 72 75 63 74 75 72 65  qlFunc structure
33c0: 20 77 69 74 68 20 74 68 65 20 67 69 76 65 6e 20   with the given 
33d0: 6e 61 6d 65 2e 20 20 4f 72 20 63 72 65 61 74 65  name.  Or create
33e0: 20 61 20 6e 65 77 0a 2a 2a 20 6f 6e 65 20 69 66   a new.** one if
33f0: 20 61 6e 20 65 78 69 73 74 69 6e 67 20 6f 6e 65   an existing one
3400: 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64   cannot be found
3410: 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  .  Return a poin
3420: 74 65 72 20 74 6f 20 74 68 65 0a 2a 2a 20 73 74  ter to the.** st
3430: 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74  ructure..*/.stat
3440: 69 63 20 53 71 6c 46 75 6e 63 20 2a 66 69 6e 64  ic SqlFunc *find
3450: 53 71 6c 46 75 6e 63 28 53 71 6c 69 74 65 44 62  SqlFunc(SqliteDb
3460: 20 2a 70 44 62 2c 20 63 6f 6e 73 74 20 63 68 61   *pDb, const cha
3470: 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 53 71 6c  r *zName){.  Sql
3480: 46 75 6e 63 20 2a 70 2c 20 2a 70 4e 65 77 3b 0a  Func *p, *pNew;.
3490: 20 20 69 6e 74 20 69 3b 0a 20 20 70 4e 65 77 20    int i;.  pNew 
34a0: 3d 20 28 53 71 6c 46 75 6e 63 2a 29 54 63 6c 5f  = (SqlFunc*)Tcl_
34b0: 41 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70  Alloc( sizeof(*p
34c0: 4e 65 77 29 20 2b 20 73 74 72 6c 65 6e 33 30 28  New) + strlen30(
34d0: 7a 4e 61 6d 65 29 20 2b 20 31 20 29 3b 0a 20 20  zName) + 1 );.  
34e0: 70 4e 65 77 2d 3e 7a 4e 61 6d 65 20 3d 20 28 63  pNew->zName = (c
34f0: 68 61 72 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a 20  har*)&pNew[1];. 
3500: 20 66 6f 72 28 69 3d 30 3b 20 7a 4e 61 6d 65 5b   for(i=0; zName[
3510: 69 5d 3b 20 69 2b 2b 29 7b 20 70 4e 65 77 2d 3e  i]; i++){ pNew->
3520: 7a 4e 61 6d 65 5b 69 5d 20 3d 20 74 6f 6c 6f 77  zName[i] = tolow
3530: 65 72 28 7a 4e 61 6d 65 5b 69 5d 29 3b 20 7d 0a  er(zName[i]); }.
3540: 20 20 70 4e 65 77 2d 3e 7a 4e 61 6d 65 5b 69 5d    pNew->zName[i]
3550: 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 3d 70 44   = 0;.  for(p=pD
3560: 62 2d 3e 70 46 75 6e 63 3b 20 70 3b 20 70 3d 70  b->pFunc; p; p=p
3570: 2d 3e 70 4e 65 78 74 29 7b 20 0a 20 20 20 20 69  ->pNext){ .    i
3580: 66 28 20 73 74 72 63 6d 70 28 70 2d 3e 7a 4e 61  f( strcmp(p->zNa
3590: 6d 65 2c 20 70 4e 65 77 2d 3e 7a 4e 61 6d 65 29  me, pNew->zName)
35a0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  ==0 ){.      Tcl
35b0: 5f 46 72 65 65 28 28 63 68 61 72 2a 29 70 4e 65  _Free((char*)pNe
35c0: 77 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  w);.      return
35d0: 20 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   p;.    }.  }.  
35e0: 70 4e 65 77 2d 3e 69 6e 74 65 72 70 20 3d 20 70  pNew->interp = p
35f0: 44 62 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 70 4e  Db->interp;.  pN
3600: 65 77 2d 3e 70 53 63 72 69 70 74 20 3d 20 30 3b  ew->pScript = 0;
3610: 0a 20 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20 3d  .  pNew->pNext =
3620: 20 70 44 62 2d 3e 70 46 75 6e 63 3b 0a 20 20 70   pDb->pFunc;.  p
3630: 44 62 2d 3e 70 46 75 6e 63 20 3d 20 70 4e 65 77  Db->pFunc = pNew
3640: 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b  ;.  return pNew;
3650: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 61 6c 69  .}../*.** Finali
3660: 7a 65 20 61 6e 64 20 66 72 65 65 20 61 20 6c 69  ze and free a li
3670: 73 74 20 6f 66 20 70 72 65 70 61 72 65 64 20 73  st of prepared s
3680: 74 61 74 65 6d 65 6e 74 73 0a 2a 2f 0a 73 74 61  tatements.*/.sta
3690: 74 69 63 20 76 6f 69 64 20 66 6c 75 73 68 53 74  tic void flushSt
36a0: 6d 74 43 61 63 68 65 28 20 53 71 6c 69 74 65 44  mtCache( SqliteD
36b0: 62 20 2a 70 44 62 20 29 7b 0a 20 20 53 71 6c 50  b *pDb ){.  SqlP
36c0: 72 65 70 61 72 65 64 53 74 6d 74 20 2a 70 50 72  reparedStmt *pPr
36d0: 65 53 74 6d 74 3b 0a 0a 20 20 77 68 69 6c 65 28  eStmt;..  while(
36e0: 20 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74 20    pDb->stmtList 
36f0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
3700: 69 6e 61 6c 69 7a 65 28 20 70 44 62 2d 3e 73 74  inalize( pDb->st
3710: 6d 74 4c 69 73 74 2d 3e 70 53 74 6d 74 20 29 3b  mtList->pStmt );
3720: 0a 20 20 20 20 70 50 72 65 53 74 6d 74 20 3d 20  .    pPreStmt = 
3730: 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74 3b 0a 20  pDb->stmtList;. 
3740: 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74     pDb->stmtList
3750: 20 3d 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74   = pDb->stmtList
3760: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 54 63 6c  ->pNext;.    Tcl
3770: 5f 46 72 65 65 28 20 28 63 68 61 72 2a 29 70 50  _Free( (char*)pP
3780: 72 65 53 74 6d 74 20 29 3b 0a 20 20 7d 0a 20 20  reStmt );.  }.  
3790: 70 44 62 2d 3e 6e 53 74 6d 74 20 3d 20 30 3b 0a  pDb->nStmt = 0;.
37a0: 20 20 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74 20    pDb->stmtLast 
37b0: 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 43  = 0;.}../*.** TC
37c0: 4c 20 63 61 6c 6c 73 20 74 68 69 73 20 70 72 6f  L calls this pro
37d0: 63 65 64 75 72 65 20 77 68 65 6e 20 61 6e 20 73  cedure when an s
37e0: 71 6c 69 74 65 33 20 64 61 74 61 62 61 73 65 20  qlite3 database 
37f0: 63 6f 6d 6d 61 6e 64 20 69 73 0a 2a 2a 20 64 65  command is.** de
3800: 6c 65 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  leted..*/.static
3810: 20 76 6f 69 64 20 44 62 44 65 6c 65 74 65 43 6d   void DbDeleteCm
3820: 64 28 76 6f 69 64 20 2a 64 62 29 7b 0a 20 20 53  d(void *db){.  S
3830: 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28  qliteDb *pDb = (
3840: 53 71 6c 69 74 65 44 62 2a 29 64 62 3b 0a 20 20  SqliteDb*)db;.  
3850: 66 6c 75 73 68 53 74 6d 74 43 61 63 68 65 28 70  flushStmtCache(p
3860: 44 62 29 3b 0a 20 20 63 6c 6f 73 65 49 6e 63 72  Db);.  closeIncr
3870: 62 6c 6f 62 43 68 61 6e 6e 65 6c 73 28 70 44 62  blobChannels(pDb
3880: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f  );.  sqlite3_clo
3890: 73 65 28 70 44 62 2d 3e 64 62 29 3b 0a 20 20 77  se(pDb->db);.  w
38a0: 68 69 6c 65 28 20 70 44 62 2d 3e 70 46 75 6e 63  hile( pDb->pFunc
38b0: 20 29 7b 0a 20 20 20 20 53 71 6c 46 75 6e 63 20   ){.    SqlFunc 
38c0: 2a 70 46 75 6e 63 20 3d 20 70 44 62 2d 3e 70 46  *pFunc = pDb->pF
38d0: 75 6e 63 3b 0a 20 20 20 20 70 44 62 2d 3e 70 46  unc;.    pDb->pF
38e0: 75 6e 63 20 3d 20 70 46 75 6e 63 2d 3e 70 4e 65  unc = pFunc->pNe
38f0: 78 74 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72  xt;.    Tcl_Decr
3900: 52 65 66 43 6f 75 6e 74 28 70 46 75 6e 63 2d 3e  RefCount(pFunc->
3910: 70 53 63 72 69 70 74 29 3b 0a 20 20 20 20 54 63  pScript);.    Tc
3920: 6c 5f 46 72 65 65 28 28 63 68 61 72 2a 29 70 46  l_Free((char*)pF
3930: 75 6e 63 29 3b 0a 20 20 7d 0a 20 20 77 68 69 6c  unc);.  }.  whil
3940: 65 28 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65  e( pDb->pCollate
3950: 20 29 7b 0a 20 20 20 20 53 71 6c 43 6f 6c 6c 61   ){.    SqlColla
3960: 74 65 20 2a 70 43 6f 6c 6c 61 74 65 20 3d 20 70  te *pCollate = p
3970: 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 3b 0a 20 20  Db->pCollate;.  
3980: 20 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 20    pDb->pCollate 
3990: 3d 20 70 43 6f 6c 6c 61 74 65 2d 3e 70 4e 65 78  = pCollate->pNex
39a0: 74 3b 0a 20 20 20 20 54 63 6c 5f 46 72 65 65 28  t;.    Tcl_Free(
39b0: 28 63 68 61 72 2a 29 70 43 6f 6c 6c 61 74 65 29  (char*)pCollate)
39c0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 62 2d  ;.  }.  if( pDb-
39d0: 3e 7a 42 75 73 79 20 29 7b 0a 20 20 20 20 54 63  >zBusy ){.    Tc
39e0: 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 42 75 73  l_Free(pDb->zBus
39f0: 79 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44  y);.  }.  if( pD
3a00: 62 2d 3e 7a 54 72 61 63 65 20 29 7b 0a 20 20 20  b->zTrace ){.   
3a10: 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a   Tcl_Free(pDb->z
3a20: 54 72 61 63 65 29 3b 0a 20 20 7d 0a 20 20 69 66  Trace);.  }.  if
3a30: 28 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 20  ( pDb->zProfile 
3a40: 29 7b 0a 20 20 20 20 54 63 6c 5f 46 72 65 65 28  ){.    Tcl_Free(
3a50: 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 29 3b 0a  pDb->zProfile);.
3a60: 20 20 7d 0a 20 20 69 66 28 20 70 44 62 2d 3e 7a    }.  if( pDb->z
3a70: 41 75 74 68 20 29 7b 0a 20 20 20 20 54 63 6c 5f  Auth ){.    Tcl_
3a80: 46 72 65 65 28 70 44 62 2d 3e 7a 41 75 74 68 29  Free(pDb->zAuth)
3a90: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 62 2d  ;.  }.  if( pDb-
3aa0: 3e 7a 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 54 63  >zNull ){.    Tc
3ab0: 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 4e 75 6c  l_Free(pDb->zNul
3ac0: 6c 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44  l);.  }.  if( pD
3ad0: 62 2d 3e 70 55 70 64 61 74 65 48 6f 6f 6b 20 29  b->pUpdateHook )
3ae0: 7b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65  {.    Tcl_DecrRe
3af0: 66 43 6f 75 6e 74 28 70 44 62 2d 3e 70 55 70 64  fCount(pDb->pUpd
3b00: 61 74 65 48 6f 6f 6b 29 3b 0a 20 20 7d 0a 20 20  ateHook);.  }.  
3b10: 69 66 28 20 70 44 62 2d 3e 70 50 72 65 55 70 64  if( pDb->pPreUpd
3b20: 61 74 65 48 6f 6f 6b 20 29 7b 0a 20 20 20 20 54  ateHook ){.    T
3b30: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
3b40: 70 44 62 2d 3e 70 50 72 65 55 70 64 61 74 65 48  pDb->pPreUpdateH
3b50: 6f 6f 6b 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ook);.  }.  if( 
3b60: 70 44 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 48 6f  pDb->pRollbackHo
3b70: 6f 6b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 44 65  ok ){.    Tcl_De
3b80: 63 72 52 65 66 43 6f 75 6e 74 28 70 44 62 2d 3e  crRefCount(pDb->
3b90: 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 29 3b 0a  pRollbackHook);.
3ba0: 20 20 7d 0a 20 20 69 66 28 20 70 44 62 2d 3e 70    }.  if( pDb->p
3bb0: 57 61 6c 48 6f 6f 6b 20 29 7b 0a 20 20 20 20 54  WalHook ){.    T
3bc0: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
3bd0: 70 44 62 2d 3e 70 57 61 6c 48 6f 6f 6b 29 3b 0a  pDb->pWalHook);.
3be0: 20 20 7d 0a 20 20 69 66 28 20 70 44 62 2d 3e 70    }.  if( pDb->p
3bf0: 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64 20 29 7b  CollateNeeded ){
3c00: 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66  .    Tcl_DecrRef
3c10: 43 6f 75 6e 74 28 70 44 62 2d 3e 70 43 6f 6c 6c  Count(pDb->pColl
3c20: 61 74 65 4e 65 65 64 65 64 29 3b 0a 20 20 7d 0a  ateNeeded);.  }.
3c30: 20 20 54 63 6c 5f 46 72 65 65 28 28 63 68 61 72    Tcl_Free((char
3c40: 2a 29 70 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  *)pDb);.}../*.**
3c50: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
3c60: 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 64   called when a d
3c70: 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
3c80: 6c 6f 63 6b 65 64 20 77 68 69 6c 65 20 74 72 79  locked while try
3c90: 69 6e 67 0a 2a 2a 20 74 6f 20 65 78 65 63 75 74  ing.** to execut
3ca0: 65 20 53 51 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63  e SQL..*/.static
3cb0: 20 69 6e 74 20 44 62 42 75 73 79 48 61 6e 64 6c   int DbBusyHandl
3cc0: 65 72 28 76 6f 69 64 20 2a 63 64 2c 20 69 6e 74  er(void *cd, int
3cd0: 20 6e 54 72 69 65 73 29 7b 0a 20 20 53 71 6c 69   nTries){.  Sqli
3ce0: 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53 71 6c  teDb *pDb = (Sql
3cf0: 69 74 65 44 62 2a 29 63 64 3b 0a 20 20 69 6e 74  iteDb*)cd;.  int
3d00: 20 72 63 3b 0a 20 20 63 68 61 72 20 7a 56 61 6c   rc;.  char zVal
3d10: 5b 33 30 5d 3b 0a 0a 20 20 73 71 6c 69 74 65 33  [30];..  sqlite3
3d20: 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
3d30: 28 7a 56 61 6c 29 2c 20 7a 56 61 6c 2c 20 22 25  (zVal), zVal, "%
3d40: 64 22 2c 20 6e 54 72 69 65 73 29 3b 0a 20 20 72  d", nTries);.  r
3d50: 63 20 3d 20 54 63 6c 5f 56 61 72 45 76 61 6c 28  c = Tcl_VarEval(
3d60: 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20 70 44 62  pDb->interp, pDb
3d70: 2d 3e 7a 42 75 73 79 2c 20 22 20 22 2c 20 7a 56  ->zBusy, " ", zV
3d80: 61 6c 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20  al, (char*)0);. 
3d90: 20 69 66 28 20 72 63 21 3d 54 43 4c 5f 4f 4b 20   if( rc!=TCL_OK 
3da0: 7c 7c 20 61 74 6f 69 28 54 63 6c 5f 47 65 74 53  || atoi(Tcl_GetS
3db0: 74 72 69 6e 67 52 65 73 75 6c 74 28 70 44 62 2d  tringResult(pDb-
3dc0: 3e 69 6e 74 65 72 70 29 29 20 29 7b 0a 20 20 20  >interp)) ){.   
3dd0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
3de0: 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 23 69   return 1;.}..#i
3df0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
3e00: 54 5f 50 52 4f 47 52 45 53 53 5f 43 41 4c 4c 42  T_PROGRESS_CALLB
3e10: 41 43 4b 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  ACK./*.** This r
3e20: 6f 75 74 69 6e 65 20 69 73 20 69 6e 76 6f 6b 65  outine is invoke
3e30: 64 20 61 73 20 74 68 65 20 27 70 72 6f 67 72 65  d as the 'progre
3e40: 73 73 20 63 61 6c 6c 62 61 63 6b 27 20 66 6f 72  ss callback' for
3e50: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a   the database..*
3e60: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 44 62 50  /.static int DbP
3e70: 72 6f 67 72 65 73 73 48 61 6e 64 6c 65 72 28 76  rogressHandler(v
3e80: 6f 69 64 20 2a 63 64 29 7b 0a 20 20 53 71 6c 69  oid *cd){.  Sqli
3e90: 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53 71 6c  teDb *pDb = (Sql
3ea0: 69 74 65 44 62 2a 29 63 64 3b 0a 20 20 69 6e 74  iteDb*)cd;.  int
3eb0: 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
3ec0: 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 20 29  pDb->zProgress )
3ed0: 3b 0a 20 20 72 63 20 3d 20 54 63 6c 5f 45 76 61  ;.  rc = Tcl_Eva
3ee0: 6c 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20 70  l(pDb->interp, p
3ef0: 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 29 3b 0a  Db->zProgress);.
3f00: 20 20 69 66 28 20 72 63 21 3d 54 43 4c 5f 4f 4b    if( rc!=TCL_OK
3f10: 20 7c 7c 20 61 74 6f 69 28 54 63 6c 5f 47 65 74   || atoi(Tcl_Get
3f20: 53 74 72 69 6e 67 52 65 73 75 6c 74 28 70 44 62  StringResult(pDb
3f30: 2d 3e 69 6e 74 65 72 70 29 29 20 29 7b 0a 20 20  ->interp)) ){.  
3f40: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
3f50: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65    return 0;.}.#e
3f60: 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
3f70: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 0a  LITE_OMIT_TRACE.
3f80: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
3f90: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20  ne is called by 
3fa0: 74 68 65 20 53 51 4c 69 74 65 20 74 72 61 63 65  the SQLite trace
3fb0: 20 68 61 6e 64 6c 65 72 20 77 68 65 6e 65 76 65   handler wheneve
3fc0: 72 20 61 20 6e 65 77 0a 2a 2a 20 62 6c 6f 63 6b  r a new.** block
3fd0: 20 6f 66 20 53 51 4c 20 69 73 20 65 78 65 63 75   of SQL is execu
3fe0: 74 65 64 2e 20 20 54 68 65 20 54 43 4c 20 73 63  ted.  The TCL sc
3ff0: 72 69 70 74 20 69 6e 20 70 44 62 2d 3e 7a 54 72  ript in pDb->zTr
4000: 61 63 65 20 69 73 20 65 78 65 63 75 74 65 64 2e  ace is executed.
4010: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
4020: 44 62 54 72 61 63 65 48 61 6e 64 6c 65 72 28 76  DbTraceHandler(v
4030: 6f 69 64 20 2a 63 64 2c 20 63 6f 6e 73 74 20 63  oid *cd, const c
4040: 68 61 72 20 2a 7a 53 71 6c 29 7b 0a 20 20 53 71  har *zSql){.  Sq
4050: 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53  liteDb *pDb = (S
4060: 71 6c 69 74 65 44 62 2a 29 63 64 3b 0a 20 20 54  qliteDb*)cd;.  T
4070: 63 6c 5f 44 53 74 72 69 6e 67 20 73 74 72 3b 0a  cl_DString str;.
4080: 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e  .  Tcl_DStringIn
4090: 69 74 28 26 73 74 72 29 3b 0a 20 20 54 63 6c 5f  it(&str);.  Tcl_
40a0: 44 53 74 72 69 6e 67 41 70 70 65 6e 64 28 26 73  DStringAppend(&s
40b0: 74 72 2c 20 70 44 62 2d 3e 7a 54 72 61 63 65 2c  tr, pDb->zTrace,
40c0: 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72   -1);.  Tcl_DStr
40d0: 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ingAppendElement
40e0: 28 26 73 74 72 2c 20 7a 53 71 6c 29 3b 0a 20 20  (&str, zSql);.  
40f0: 54 63 6c 5f 45 76 61 6c 28 70 44 62 2d 3e 69 6e  Tcl_Eval(pDb->in
4100: 74 65 72 70 2c 20 54 63 6c 5f 44 53 74 72 69 6e  terp, Tcl_DStrin
4110: 67 56 61 6c 75 65 28 26 73 74 72 29 29 3b 0a 20  gValue(&str));. 
4120: 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65   Tcl_DStringFree
4130: 28 26 73 74 72 29 3b 0a 20 20 54 63 6c 5f 52 65  (&str);.  Tcl_Re
4140: 73 65 74 52 65 73 75 6c 74 28 70 44 62 2d 3e 69  setResult(pDb->i
4150: 6e 74 65 72 70 29 3b 0a 7d 0a 23 65 6e 64 69 66  nterp);.}.#endif
4160: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
4170: 5f 4f 4d 49 54 5f 54 52 41 43 45 0a 2f 2a 0a 2a  _OMIT_TRACE./*.*
4180: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
4190: 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20  s called by the 
41a0: 53 51 4c 69 74 65 20 70 72 6f 66 69 6c 65 20 68  SQLite profile h
41b0: 61 6e 64 6c 65 72 20 61 66 74 65 72 20 61 20 73  andler after a s
41c0: 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 53 51 4c 20  tatement.** SQL 
41d0: 68 61 73 20 65 78 65 63 75 74 65 64 2e 20 20 54  has executed.  T
41e0: 68 65 20 54 43 4c 20 73 63 72 69 70 74 20 69 6e  he TCL script in
41f0: 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 20 69   pDb->zProfile i
4200: 73 20 65 76 61 6c 75 61 74 65 64 2e 0a 2a 2f 0a  s evaluated..*/.
4210: 73 74 61 74 69 63 20 76 6f 69 64 20 44 62 50 72  static void DbPr
4220: 6f 66 69 6c 65 48 61 6e 64 6c 65 72 28 76 6f 69  ofileHandler(voi
4230: 64 20 2a 63 64 2c 20 63 6f 6e 73 74 20 63 68 61  d *cd, const cha
4240: 72 20 2a 7a 53 71 6c 2c 20 73 71 6c 69 74 65 5f  r *zSql, sqlite_
4250: 75 69 6e 74 36 34 20 74 6d 29 7b 0a 20 20 53 71  uint64 tm){.  Sq
4260: 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53  liteDb *pDb = (S
4270: 71 6c 69 74 65 44 62 2a 29 63 64 3b 0a 20 20 54  qliteDb*)cd;.  T
4280: 63 6c 5f 44 53 74 72 69 6e 67 20 73 74 72 3b 0a  cl_DString str;.
4290: 20 20 63 68 61 72 20 7a 54 6d 5b 31 30 30 5d 3b    char zTm[100];
42a0: 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72  ..  sqlite3_snpr
42b0: 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 54 6d 29  intf(sizeof(zTm)
42c0: 2d 31 2c 20 7a 54 6d 2c 20 22 25 6c 6c 64 22 2c  -1, zTm, "%lld",
42d0: 20 74 6d 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72   tm);.  Tcl_DStr
42e0: 69 6e 67 49 6e 69 74 28 26 73 74 72 29 3b 0a 20  ingInit(&str);. 
42f0: 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65   Tcl_DStringAppe
4300: 6e 64 28 26 73 74 72 2c 20 70 44 62 2d 3e 7a 50  nd(&str, pDb->zP
4310: 72 6f 66 69 6c 65 2c 20 2d 31 29 3b 0a 20 20 54  rofile, -1);.  T
4320: 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64  cl_DStringAppend
4330: 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c 20 7a 53  Element(&str, zS
4340: 71 6c 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69  ql);.  Tcl_DStri
4350: 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  ngAppendElement(
4360: 26 73 74 72 2c 20 7a 54 6d 29 3b 0a 20 20 54 63  &str, zTm);.  Tc
4370: 6c 5f 45 76 61 6c 28 70 44 62 2d 3e 69 6e 74 65  l_Eval(pDb->inte
4380: 72 70 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56  rp, Tcl_DStringV
4390: 61 6c 75 65 28 26 73 74 72 29 29 3b 0a 20 20 54  alue(&str));.  T
43a0: 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26  cl_DStringFree(&
43b0: 73 74 72 29 3b 0a 20 20 54 63 6c 5f 52 65 73 65  str);.  Tcl_Rese
43c0: 74 52 65 73 75 6c 74 28 70 44 62 2d 3e 69 6e 74  tResult(pDb->int
43d0: 65 72 70 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  erp);.}.#endif..
43e0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
43f0: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  ne is called whe
4400: 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  n a transaction 
4410: 69 73 20 63 6f 6d 6d 69 74 74 65 64 2e 20 20 54  is committed.  T
4420: 68 65 0a 2a 2a 20 54 43 4c 20 73 63 72 69 70 74  he.** TCL script
4430: 20 69 6e 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74   in pDb->zCommit
4440: 20 69 73 20 65 78 65 63 75 74 65 64 2e 20 20 49   is executed.  I
4450: 66 20 69 74 20 72 65 74 75 72 6e 73 20 6e 6f 6e  f it returns non
4460: 2d 7a 65 72 6f 20 6f 72 0a 2a 2a 20 69 66 20 69  -zero or.** if i
4470: 74 20 74 68 72 6f 77 73 20 61 6e 20 65 78 63 65  t throws an exce
4480: 70 74 69 6f 6e 2c 20 74 68 65 20 74 72 61 6e 73  ption, the trans
4490: 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64  action is rolled
44a0: 20 62 61 63 6b 20 69 6e 73 74 65 61 64 0a 2a 2a   back instead.**
44b0: 20 6f 66 20 62 65 69 6e 67 20 63 6f 6d 6d 69 74   of being commit
44c0: 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ted..*/.static i
44d0: 6e 74 20 44 62 43 6f 6d 6d 69 74 48 61 6e 64 6c  nt DbCommitHandl
44e0: 65 72 28 76 6f 69 64 20 2a 63 64 29 7b 0a 20 20  er(void *cd){.  
44f0: 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20  SqliteDb *pDb = 
4500: 28 53 71 6c 69 74 65 44 62 2a 29 63 64 3b 0a 20  (SqliteDb*)cd;. 
4510: 20 69 6e 74 20 72 63 3b 0a 0a 20 20 72 63 20 3d   int rc;..  rc =
4520: 20 54 63 6c 5f 45 76 61 6c 28 70 44 62 2d 3e 69   Tcl_Eval(pDb->i
4530: 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a 43 6f 6d  nterp, pDb->zCom
4540: 6d 69 74 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  mit);.  if( rc!=
4550: 54 43 4c 5f 4f 4b 20 7c 7c 20 61 74 6f 69 28 54  TCL_OK || atoi(T
4560: 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75  cl_GetStringResu
4570: 6c 74 28 70 44 62 2d 3e 69 6e 74 65 72 70 29 29  lt(pDb->interp))
4580: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31   ){.    return 1
4590: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
45a0: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  ;.}..static void
45b0: 20 44 62 52 6f 6c 6c 62 61 63 6b 48 61 6e 64 6c   DbRollbackHandl
45c0: 65 72 28 76 6f 69 64 20 2a 63 6c 69 65 6e 74 44  er(void *clientD
45d0: 61 74 61 29 7b 0a 20 20 53 71 6c 69 74 65 44 62  ata){.  SqliteDb
45e0: 20 2a 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44   *pDb = (SqliteD
45f0: 62 2a 29 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20  b*)clientData;. 
4600: 20 61 73 73 65 72 74 28 70 44 62 2d 3e 70 52 6f   assert(pDb->pRo
4610: 6c 6c 62 61 63 6b 48 6f 6f 6b 29 3b 0a 20 20 69  llbackHook);.  i
4620: 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 45  f( TCL_OK!=Tcl_E
4630: 76 61 6c 4f 62 6a 45 78 28 70 44 62 2d 3e 69 6e  valObjEx(pDb->in
4640: 74 65 72 70 2c 20 70 44 62 2d 3e 70 52 6f 6c 6c  terp, pDb->pRoll
4650: 62 61 63 6b 48 6f 6f 6b 2c 20 30 29 20 29 7b 0a  backHook, 0) ){.
4660: 20 20 20 20 54 63 6c 5f 42 61 63 6b 67 72 6f 75      Tcl_Backgrou
4670: 6e 64 45 72 72 6f 72 28 70 44 62 2d 3e 69 6e 74  ndError(pDb->int
4680: 65 72 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  erp);.  }.}../*.
4690: 2a 2a 20 54 68 69 73 20 70 72 6f 63 65 64 75 72  ** This procedur
46a0: 65 20 68 61 6e 64 6c 65 73 20 77 61 6c 5f 68 6f  e handles wal_ho
46b0: 6f 6b 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 2a 2f  ok callbacks..*/
46c0: 0a 73 74 61 74 69 63 20 69 6e 74 20 44 62 57 61  .static int DbWa
46d0: 6c 48 61 6e 64 6c 65 72 28 0a 20 20 76 6f 69 64  lHandler(.  void
46e0: 20 2a 63 6c 69 65 6e 74 44 61 74 61 2c 20 0a 20   *clientData, . 
46f0: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20   sqlite3 *db, . 
4700: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
4710: 2c 20 0a 20 20 69 6e 74 20 6e 45 6e 74 72 79 0a  , .  int nEntry.
4720: 29 7b 0a 20 20 69 6e 74 20 72 65 74 20 3d 20 53  ){.  int ret = S
4730: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 54 63 6c 5f  QLITE_OK;.  Tcl_
4740: 4f 62 6a 20 2a 70 3b 0a 20 20 53 71 6c 69 74 65  Obj *p;.  Sqlite
4750: 44 62 20 2a 70 44 62 20 3d 20 28 53 71 6c 69 74  Db *pDb = (Sqlit
4760: 65 44 62 2a 29 63 6c 69 65 6e 74 44 61 74 61 3b  eDb*)clientData;
4770: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
4780: 6e 74 65 72 70 20 3d 20 70 44 62 2d 3e 69 6e 74  nterp = pDb->int
4790: 65 72 70 3b 0a 20 20 61 73 73 65 72 74 28 70 44  erp;.  assert(pD
47a0: 62 2d 3e 70 57 61 6c 48 6f 6f 6b 29 3b 0a 0a 20  b->pWalHook);.. 
47b0: 20 70 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61   p = Tcl_Duplica
47c0: 74 65 4f 62 6a 28 70 44 62 2d 3e 70 57 61 6c 48  teObj(pDb->pWalH
47d0: 6f 6f 6b 29 3b 0a 20 20 54 63 6c 5f 49 6e 63 72  ook);.  Tcl_Incr
47e0: 52 65 66 43 6f 75 6e 74 28 70 29 3b 0a 20 20 54  RefCount(p);.  T
47f0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
4800: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
4810: 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  p, Tcl_NewString
4820: 4f 62 6a 28 7a 44 62 2c 20 2d 31 29 29 3b 0a 20  Obj(zDb, -1));. 
4830: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
4840: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
4850: 2c 20 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f  , p, Tcl_NewIntO
4860: 62 6a 28 6e 45 6e 74 72 79 29 29 3b 0a 20 20 69  bj(nEntry));.  i
4870: 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 45  f( TCL_OK!=Tcl_E
4880: 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c  valObjEx(interp,
4890: 20 70 2c 20 30 29 20 0a 20 20 20 7c 7c 20 54 43   p, 0) .   || TC
48a0: 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 49 6e 74  L_OK!=Tcl_GetInt
48b0: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
48c0: 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_GetObjResult
48d0: 28 69 6e 74 65 72 70 29 2c 20 26 72 65 74 29 0a  (interp), &ret).
48e0: 20 20 29 7b 0a 20 20 20 20 54 63 6c 5f 42 61 63    ){.    Tcl_Bac
48f0: 6b 67 72 6f 75 6e 64 45 72 72 6f 72 28 69 6e 74  kgroundError(int
4900: 65 72 70 29 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f  erp);.  }.  Tcl_
4910: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 29 3b  DecrRefCount(p);
4920: 0a 0a 20 20 72 65 74 75 72 6e 20 72 65 74 3b 0a  ..  return ret;.
4930: 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  }..#if defined(S
4940: 51 4c 49 54 45 5f 54 45 53 54 29 20 26 26 20 64  QLITE_TEST) && d
4950: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
4960: 41 42 4c 45 5f 55 4e 4c 4f 43 4b 5f 4e 4f 54 49  ABLE_UNLOCK_NOTI
4970: 46 59 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20  FY).static void 
4980: 73 65 74 54 65 73 74 55 6e 6c 6f 63 6b 4e 6f 74  setTestUnlockNot
4990: 69 66 79 56 61 72 73 28 54 63 6c 5f 49 6e 74 65  ifyVars(Tcl_Inte
49a0: 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20  rp *interp, int 
49b0: 69 41 72 67 2c 20 69 6e 74 20 6e 41 72 67 29 7b  iArg, int nArg){
49c0: 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 36 34 5d  .  char zBuf[64]
49d0: 3b 0a 20 20 73 70 72 69 6e 74 66 28 7a 42 75 66  ;.  sprintf(zBuf
49e0: 2c 20 22 25 64 22 2c 20 69 41 72 67 29 3b 0a 20  , "%d", iArg);. 
49f0: 20 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65   Tcl_SetVar(inte
4a00: 72 70 2c 20 22 73 71 6c 69 74 65 5f 75 6e 6c 6f  rp, "sqlite_unlo
4a10: 63 6b 5f 6e 6f 74 69 66 79 5f 61 72 67 22 2c 20  ck_notify_arg", 
4a20: 7a 42 75 66 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c  zBuf, TCL_GLOBAL
4a30: 5f 4f 4e 4c 59 29 3b 0a 20 20 73 70 72 69 6e 74  _ONLY);.  sprint
4a40: 66 28 7a 42 75 66 2c 20 22 25 64 22 2c 20 6e 41  f(zBuf, "%d", nA
4a50: 72 67 29 3b 0a 20 20 54 63 6c 5f 53 65 74 56 61  rg);.  Tcl_SetVa
4a60: 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74  r(interp, "sqlit
4a70: 65 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79 5f  e_unlock_notify_
4a80: 61 72 67 63 6f 75 6e 74 22 2c 20 7a 42 75 66 2c  argcount", zBuf,
4a90: 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59   TCL_GLOBAL_ONLY
4aa0: 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66  );.}.#else.# def
4ab0: 69 6e 65 20 73 65 74 54 65 73 74 55 6e 6c 6f 63  ine setTestUnloc
4ac0: 6b 4e 6f 74 69 66 79 56 61 72 73 28 78 2c 79 2c  kNotifyVars(x,y,
4ad0: 7a 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65  z).#endif..#ifde
4ae0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
4af0: 55 4e 4c 4f 43 4b 5f 4e 4f 54 49 46 59 0a 73 74  UNLOCK_NOTIFY.st
4b00: 61 74 69 63 20 76 6f 69 64 20 44 62 55 6e 6c 6f  atic void DbUnlo
4b10: 63 6b 4e 6f 74 69 66 79 28 76 6f 69 64 20 2a 2a  ckNotify(void **
4b20: 61 70 41 72 67 2c 20 69 6e 74 20 6e 41 72 67 29  apArg, int nArg)
4b30: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  {.  int i;.  for
4b40: 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b  (i=0; i<nArg; i+
4b50: 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e  +){.    const in
4b60: 74 20 66 6c 61 67 73 20 3d 20 28 54 43 4c 5f 45  t flags = (TCL_E
4b70: 56 41 4c 5f 47 4c 4f 42 41 4c 7c 54 43 4c 5f 45  VAL_GLOBAL|TCL_E
4b80: 56 41 4c 5f 44 49 52 45 43 54 29 3b 0a 20 20 20  VAL_DIRECT);.   
4b90: 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d   SqliteDb *pDb =
4ba0: 20 28 53 71 6c 69 74 65 44 62 20 2a 29 61 70 41   (SqliteDb *)apA
4bb0: 72 67 5b 69 5d 3b 0a 20 20 20 20 73 65 74 54 65  rg[i];.    setTe
4bc0: 73 74 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 56 61  stUnlockNotifyVa
4bd0: 72 73 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20  rs(pDb->interp, 
4be0: 69 2c 20 6e 41 72 67 29 3b 0a 20 20 20 20 61 73  i, nArg);.    as
4bf0: 73 65 72 74 28 20 70 44 62 2d 3e 70 55 6e 6c 6f  sert( pDb->pUnlo
4c00: 63 6b 4e 6f 74 69 66 79 29 3b 0a 20 20 20 20 54  ckNotify);.    T
4c10: 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70 44 62  cl_EvalObjEx(pDb
4c20: 2d 3e 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 70  ->interp, pDb->p
4c30: 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 2c 20 66 6c  UnlockNotify, fl
4c40: 61 67 73 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65  ags);.    Tcl_De
4c50: 63 72 52 65 66 43 6f 75 6e 74 28 70 44 62 2d 3e  crRefCount(pDb->
4c60: 70 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 29 3b 0a  pUnlockNotify);.
4c70: 20 20 20 20 70 44 62 2d 3e 70 55 6e 6c 6f 63 6b      pDb->pUnlock
4c80: 4e 6f 74 69 66 79 20 3d 20 30 3b 0a 20 20 7d 0a  Notify = 0;.  }.
4c90: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
4ca0: 50 72 65 2d 75 70 64 61 74 65 20 68 6f 6f 6b 20  Pre-update hook 
4cb0: 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61  callback..*/.sta
4cc0: 74 69 63 20 76 6f 69 64 20 44 62 50 72 65 55 70  tic void DbPreUp
4cd0: 64 61 74 65 48 61 6e 64 6c 65 72 28 0a 20 20 76  dateHandler(.  v
4ce0: 6f 69 64 20 2a 70 2c 20 0a 20 20 73 71 6c 69 74  oid *p, .  sqlit
4cf0: 65 33 20 2a 64 62 2c 0a 20 20 69 6e 74 20 6f 70  e3 *db,.  int op
4d00: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
4d10: 7a 44 62 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68  zDb, .  const ch
4d20: 61 72 20 2a 7a 54 62 6c 2c 20 0a 20 20 73 71 6c  ar *zTbl, .  sql
4d30: 69 74 65 5f 69 6e 74 36 34 20 69 4b 65 79 31 2c  ite_int64 iKey1,
4d40: 0a 20 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20  .  sqlite_int64 
4d50: 69 4b 65 79 32 0a 29 7b 0a 20 20 53 71 6c 69 74  iKey2.){.  Sqlit
4d60: 65 44 62 20 2a 70 44 62 20 3d 20 28 53 71 6c 69  eDb *pDb = (Sqli
4d70: 74 65 44 62 20 2a 29 70 3b 0a 20 20 54 63 6c 5f  teDb *)p;.  Tcl_
4d80: 4f 62 6a 20 2a 70 43 6d 64 3b 0a 20 20 73 74 61  Obj *pCmd;.  sta
4d90: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
4da0: 61 7a 53 74 72 5b 5d 20 3d 20 7b 22 44 45 4c 45  azStr[] = {"DELE
4db0: 54 45 22 2c 20 22 49 4e 53 45 52 54 22 2c 20 22  TE", "INSERT", "
4dc0: 55 50 44 41 54 45 22 7d 3b 0a 0a 20 20 61 73 73  UPDATE"};..  ass
4dd0: 65 72 74 28 20 28 53 51 4c 49 54 45 5f 44 45 4c  ert( (SQLITE_DEL
4de0: 45 54 45 2d 31 29 2f 39 20 3d 3d 20 30 20 29 3b  ETE-1)/9 == 0 );
4df0: 0a 20 20 61 73 73 65 72 74 28 20 28 53 51 4c 49  .  assert( (SQLI
4e00: 54 45 5f 49 4e 53 45 52 54 2d 31 29 2f 39 20 3d  TE_INSERT-1)/9 =
4e10: 3d 20 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  = 1 );.  assert(
4e20: 20 28 53 51 4c 49 54 45 5f 55 50 44 41 54 45 2d   (SQLITE_UPDATE-
4e30: 31 29 2f 39 20 3d 3d 20 32 20 29 3b 0a 20 20 61  1)/9 == 2 );.  a
4e40: 73 73 65 72 74 28 20 70 44 62 2d 3e 70 50 72 65  ssert( pDb->pPre
4e50: 55 70 64 61 74 65 48 6f 6f 6b 20 29 3b 0a 20 20  UpdateHook );.  
4e60: 61 73 73 65 72 74 28 20 64 62 3d 3d 70 44 62 2d  assert( db==pDb-
4e70: 3e 64 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28  >db );.  assert(
4e80: 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 49 4e 53 45   op==SQLITE_INSE
4e90: 52 54 20 7c 7c 20 6f 70 3d 3d 53 51 4c 49 54 45  RT || op==SQLITE
4ea0: 5f 55 50 44 41 54 45 20 7c 7c 20 6f 70 3d 3d 53  _UPDATE || op==S
4eb0: 51 4c 49 54 45 5f 44 45 4c 45 54 45 20 29 3b 0a  QLITE_DELETE );.
4ec0: 0a 20 20 70 43 6d 64 20 3d 20 54 63 6c 5f 44 75  .  pCmd = Tcl_Du
4ed0: 70 6c 69 63 61 74 65 4f 62 6a 28 70 44 62 2d 3e  plicateObj(pDb->
4ee0: 70 50 72 65 55 70 64 61 74 65 48 6f 6f 6b 29 3b  pPreUpdateHook);
4ef0: 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f  .  Tcl_IncrRefCo
4f00: 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20 54 63 6c  unt(pCmd);.  Tcl
4f10: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
4f20: 65 6d 65 6e 74 28 30 2c 20 70 43 6d 64 2c 20 54  ement(0, pCmd, T
4f30: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
4f40: 61 7a 53 74 72 5b 28 6f 70 2d 31 29 2f 39 5d 2c  azStr[(op-1)/9],
4f50: 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73   -1));.  Tcl_Lis
4f60: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
4f70: 74 28 30 2c 20 70 43 6d 64 2c 20 54 63 6c 5f 4e  t(0, pCmd, Tcl_N
4f80: 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 44 62 2c  ewStringObj(zDb,
4f90: 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73   -1));.  Tcl_Lis
4fa0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
4fb0: 74 28 30 2c 20 70 43 6d 64 2c 20 54 63 6c 5f 4e  t(0, pCmd, Tcl_N
4fc0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 54 62 6c  ewStringObj(zTbl
4fd0: 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69  , -1));.  Tcl_Li
4fe0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
4ff0: 6e 74 28 30 2c 20 70 43 6d 64 2c 20 54 63 6c 5f  nt(0, pCmd, Tcl_
5000: 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 69 4b  NewWideIntObj(iK
5010: 65 79 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73  ey1));.  Tcl_Lis
5020: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
5030: 74 28 30 2c 20 70 43 6d 64 2c 20 54 63 6c 5f 4e  t(0, pCmd, Tcl_N
5040: 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 69 4b 65  ewWideIntObj(iKe
5050: 79 32 29 29 3b 0a 20 20 54 63 6c 5f 45 76 61 6c  y2));.  Tcl_Eval
5060: 4f 62 6a 45 78 28 70 44 62 2d 3e 69 6e 74 65 72  ObjEx(pDb->inter
5070: 70 2c 20 70 43 6d 64 2c 20 54 43 4c 5f 45 56 41  p, pCmd, TCL_EVA
5080: 4c 5f 44 49 52 45 43 54 29 3b 0a 20 20 54 63 6c  L_DIRECT);.  Tcl
5090: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 43  _DecrRefCount(pC
50a0: 6d 64 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76  md);.}..static v
50b0: 6f 69 64 20 44 62 55 70 64 61 74 65 48 61 6e 64  oid DbUpdateHand
50c0: 6c 65 72 28 0a 20 20 76 6f 69 64 20 2a 70 2c 20  ler(.  void *p, 
50d0: 0a 20 20 69 6e 74 20 6f 70 2c 0a 20 20 63 6f 6e  .  int op,.  con
50e0: 73 74 20 63 68 61 72 20 2a 7a 44 62 2c 20 0a 20  st char *zDb, . 
50f0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 62   const char *zTb
5100: 6c 2c 20 0a 20 20 73 71 6c 69 74 65 5f 69 6e 74  l, .  sqlite_int
5110: 36 34 20 72 6f 77 69 64 0a 29 7b 0a 20 20 53 71  64 rowid.){.  Sq
5120: 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53  liteDb *pDb = (S
5130: 71 6c 69 74 65 44 62 20 2a 29 70 3b 0a 20 20 54  qliteDb *)p;.  T
5140: 63 6c 5f 4f 62 6a 20 2a 70 43 6d 64 3b 0a 20 20  cl_Obj *pCmd;.  
5150: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
5160: 72 20 2a 61 7a 53 74 72 5b 5d 20 3d 20 7b 22 44  r *azStr[] = {"D
5170: 45 4c 45 54 45 22 2c 20 22 49 4e 53 45 52 54 22  ELETE", "INSERT"
5180: 2c 20 22 55 50 44 41 54 45 22 7d 3b 0a 0a 20 20  , "UPDATE"};..  
5190: 61 73 73 65 72 74 28 20 28 53 51 4c 49 54 45 5f  assert( (SQLITE_
51a0: 44 45 4c 45 54 45 2d 31 29 2f 39 20 3d 3d 20 30  DELETE-1)/9 == 0
51b0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 53   );.  assert( (S
51c0: 51 4c 49 54 45 5f 49 4e 53 45 52 54 2d 31 29 2f  QLITE_INSERT-1)/
51d0: 39 20 3d 3d 20 31 20 29 3b 0a 20 20 61 73 73 65  9 == 1 );.  asse
51e0: 72 74 28 20 28 53 51 4c 49 54 45 5f 55 50 44 41  rt( (SQLITE_UPDA
51f0: 54 45 2d 31 29 2f 39 20 3d 3d 20 32 20 29 3b 0a  TE-1)/9 == 2 );.
5200: 0a 20 20 61 73 73 65 72 74 28 20 70 44 62 2d 3e  .  assert( pDb->
5210: 70 55 70 64 61 74 65 48 6f 6f 6b 20 29 3b 0a 20  pUpdateHook );. 
5220: 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 53 51 4c   assert( op==SQL
5230: 49 54 45 5f 49 4e 53 45 52 54 20 7c 7c 20 6f 70  ITE_INSERT || op
5240: 3d 3d 53 51 4c 49 54 45 5f 55 50 44 41 54 45 20  ==SQLITE_UPDATE 
5250: 7c 7c 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 44 45  || op==SQLITE_DE
5260: 4c 45 54 45 20 29 3b 0a 0a 20 20 70 43 6d 64 20  LETE );..  pCmd 
5270: 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f  = Tcl_DuplicateO
5280: 62 6a 28 70 44 62 2d 3e 70 55 70 64 61 74 65 48  bj(pDb->pUpdateH
5290: 6f 6f 6b 29 3b 0a 20 20 54 63 6c 5f 49 6e 63 72  ook);.  Tcl_Incr
52a0: 52 65 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a  RefCount(pCmd);.
52b0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
52c0: 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 43  endElement(0, pC
52d0: 6d 64 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  md, Tcl_NewStrin
52e0: 67 4f 62 6a 28 61 7a 53 74 72 5b 28 6f 70 2d 31  gObj(azStr[(op-1
52f0: 29 2f 39 5d 2c 20 2d 31 29 29 3b 0a 20 20 54 63  )/9], -1));.  Tc
5300: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
5310: 6c 65 6d 65 6e 74 28 30 2c 20 70 43 6d 64 2c 20  lement(0, pCmd, 
5320: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
5330: 28 7a 44 62 2c 20 2d 31 29 29 3b 0a 20 20 54 63  (zDb, -1));.  Tc
5340: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
5350: 6c 65 6d 65 6e 74 28 30 2c 20 70 43 6d 64 2c 20  lement(0, pCmd, 
5360: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
5370: 28 7a 54 62 6c 2c 20 2d 31 29 29 3b 0a 20 20 54  (zTbl, -1));.  T
5380: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
5390: 45 6c 65 6d 65 6e 74 28 30 2c 20 70 43 6d 64 2c  Element(0, pCmd,
53a0: 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f   Tcl_NewWideIntO
53b0: 62 6a 28 72 6f 77 69 64 29 29 3b 0a 20 20 54 63  bj(rowid));.  Tc
53c0: 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70 44 62 2d  l_EvalObjEx(pDb-
53d0: 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c 20 54  >interp, pCmd, T
53e0: 43 4c 5f 45 56 41 4c 5f 44 49 52 45 43 54 29 3b  CL_EVAL_DIRECT);
53f0: 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f  .  Tcl_DecrRefCo
5400: 75 6e 74 28 70 43 6d 64 29 3b 0a 7d 0a 0a 73 74  unt(pCmd);.}..st
5410: 61 74 69 63 20 76 6f 69 64 20 74 63 6c 43 6f 6c  atic void tclCol
5420: 6c 61 74 65 4e 65 65 64 65 64 28 0a 20 20 76 6f  lateNeeded(.  vo
5430: 69 64 20 2a 70 43 74 78 2c 0a 20 20 73 71 6c 69  id *pCtx,.  sqli
5440: 74 65 33 20 2a 64 62 2c 0a 20 20 69 6e 74 20 65  te3 *db,.  int e
5450: 6e 63 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  nc,.  const char
5460: 20 2a 7a 4e 61 6d 65 0a 29 7b 0a 20 20 53 71 6c   *zName.){.  Sql
5470: 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53 71  iteDb *pDb = (Sq
5480: 6c 69 74 65 44 62 20 2a 29 70 43 74 78 3b 0a 20  liteDb *)pCtx;. 
5490: 20 54 63 6c 5f 4f 62 6a 20 2a 70 53 63 72 69 70   Tcl_Obj *pScrip
54a0: 74 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74  t = Tcl_Duplicat
54b0: 65 4f 62 6a 28 70 44 62 2d 3e 70 43 6f 6c 6c 61  eObj(pDb->pColla
54c0: 74 65 4e 65 65 64 65 64 29 3b 0a 20 20 54 63 6c  teNeeded);.  Tcl
54d0: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 53  _IncrRefCount(pS
54e0: 63 72 69 70 74 29 3b 0a 20 20 54 63 6c 5f 4c 69  cript);.  Tcl_Li
54f0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
5500: 6e 74 28 30 2c 20 70 53 63 72 69 70 74 2c 20 54  nt(0, pScript, T
5510: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
5520: 7a 4e 61 6d 65 2c 20 2d 31 29 29 3b 0a 20 20 54  zName, -1));.  T
5530: 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70 44 62  cl_EvalObjEx(pDb
5540: 2d 3e 69 6e 74 65 72 70 2c 20 70 53 63 72 69 70  ->interp, pScrip
5550: 74 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 44 65 63  t, 0);.  Tcl_Dec
5560: 72 52 65 66 43 6f 75 6e 74 28 70 53 63 72 69 70  rRefCount(pScrip
5570: 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  t);.}../*.** Thi
5580: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
5590: 6c 65 64 20 74 6f 20 65 76 61 6c 75 61 74 65 20  led to evaluate 
55a0: 61 6e 20 53 51 4c 20 63 6f 6c 6c 61 74 69 6f 6e  an SQL collation
55b0: 20 66 75 6e 63 74 69 6f 6e 20 69 6d 70 6c 65 6d   function implem
55c0: 65 6e 74 65 64 0a 2a 2a 20 75 73 69 6e 67 20 54  ented.** using T
55d0: 43 4c 20 73 63 72 69 70 74 2e 0a 2a 2f 0a 73 74  CL script..*/.st
55e0: 61 74 69 63 20 69 6e 74 20 74 63 6c 53 71 6c 43  atic int tclSqlC
55f0: 6f 6c 6c 61 74 65 28 0a 20 20 76 6f 69 64 20 2a  ollate(.  void *
5600: 70 43 74 78 2c 0a 20 20 69 6e 74 20 6e 41 2c 0a  pCtx,.  int nA,.
5610: 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 41    const void *zA
5620: 2c 0a 20 20 69 6e 74 20 6e 42 2c 0a 20 20 63 6f  ,.  int nB,.  co
5630: 6e 73 74 20 76 6f 69 64 20 2a 7a 42 0a 29 7b 0a  nst void *zB.){.
5640: 20 20 53 71 6c 43 6f 6c 6c 61 74 65 20 2a 70 20    SqlCollate *p 
5650: 3d 20 28 53 71 6c 43 6f 6c 6c 61 74 65 20 2a 29  = (SqlCollate *)
5660: 70 43 74 78 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20  pCtx;.  Tcl_Obj 
5670: 2a 70 43 6d 64 3b 0a 0a 20 20 70 43 6d 64 20 3d  *pCmd;..  pCmd =
5680: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
5690: 6a 28 70 2d 3e 7a 53 63 72 69 70 74 2c 20 2d 31  j(p->zScript, -1
56a0: 29 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65 66  );.  Tcl_IncrRef
56b0: 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20 54  Count(pCmd);.  T
56c0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
56d0: 45 6c 65 6d 65 6e 74 28 70 2d 3e 69 6e 74 65 72  Element(p->inter
56e0: 70 2c 20 70 43 6d 64 2c 20 54 63 6c 5f 4e 65 77  p, pCmd, Tcl_New
56f0: 53 74 72 69 6e 67 4f 62 6a 28 7a 41 2c 20 6e 41  StringObj(zA, nA
5700: 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ));.  Tcl_ListOb
5710: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 70  jAppendElement(p
5720: 2d 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c 20  ->interp, pCmd, 
5730: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
5740: 28 7a 42 2c 20 6e 42 29 29 3b 0a 20 20 54 63 6c  (zB, nB));.  Tcl
5750: 5f 45 76 61 6c 4f 62 6a 45 78 28 70 2d 3e 69 6e  _EvalObjEx(p->in
5760: 74 65 72 70 2c 20 70 43 6d 64 2c 20 54 43 4c 5f  terp, pCmd, TCL_
5770: 45 56 41 4c 5f 44 49 52 45 43 54 29 3b 0a 20 20  EVAL_DIRECT);.  
5780: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
5790: 28 70 43 6d 64 29 3b 0a 20 20 72 65 74 75 72 6e  (pCmd);.  return
57a0: 20 28 61 74 6f 69 28 54 63 6c 5f 47 65 74 53 74   (atoi(Tcl_GetSt
57b0: 72 69 6e 67 52 65 73 75 6c 74 28 70 2d 3e 69 6e  ringResult(p->in
57c0: 74 65 72 70 29 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  terp)));.}../*.*
57d0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
57e0: 73 20 63 61 6c 6c 65 64 20 74 6f 20 65 76 61 6c  s called to eval
57f0: 75 61 74 65 20 61 6e 20 53 51 4c 20 66 75 6e 63  uate an SQL func
5800: 74 69 6f 6e 20 69 6d 70 6c 65 6d 65 6e 74 65 64  tion implemented
5810: 0a 2a 2a 20 75 73 69 6e 67 20 54 43 4c 20 73 63  .** using TCL sc
5820: 72 69 70 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ript..*/.static 
5830: 76 6f 69 64 20 74 63 6c 53 71 6c 46 75 6e 63 28  void tclSqlFunc(
5840: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
5850: 2a 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72  *context, int ar
5860: 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  gc, sqlite3_valu
5870: 65 2a 2a 61 72 67 76 29 7b 0a 20 20 53 71 6c 46  e**argv){.  SqlF
5880: 75 6e 63 20 2a 70 20 3d 20 73 71 6c 69 74 65 33  unc *p = sqlite3
5890: 5f 75 73 65 72 5f 64 61 74 61 28 63 6f 6e 74 65  _user_data(conte
58a0: 78 74 29 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  xt);.  Tcl_Obj *
58b0: 70 43 6d 64 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  pCmd;.  int i;. 
58c0: 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20   int rc;..  if( 
58d0: 61 72 67 63 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  argc==0 ){.    /
58e0: 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6e  * If there are n
58f0: 6f 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 74  o arguments to t
5900: 68 65 20 66 75 6e 63 74 69 6f 6e 2c 20 63 61 6c  he function, cal
5910: 6c 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 20  l Tcl_EvalObjEx 
5920: 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 73 63  on the.    ** sc
5930: 72 69 70 74 20 6f 62 6a 65 63 74 20 64 69 72 65  ript object dire
5940: 63 74 6c 79 2e 20 20 54 68 69 73 20 61 6c 6c 6f  ctly.  This allo
5950: 77 73 20 74 68 65 20 54 43 4c 20 63 6f 6d 70 69  ws the TCL compi
5960: 6c 65 72 20 74 6f 20 67 65 6e 65 72 61 74 65 0a  ler to generate.
5970: 20 20 20 20 2a 2a 20 62 79 74 65 63 6f 64 65 20      ** bytecode 
5980: 66 6f 72 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20  for the command 
5990: 6f 6e 20 74 68 65 20 66 69 72 73 74 20 69 6e 76  on the first inv
59a0: 6f 63 61 74 69 6f 6e 20 61 6e 64 20 74 68 75 73  ocation and thus
59b0: 20 6d 61 6b 65 0a 20 20 20 20 2a 2a 20 73 75 62   make.    ** sub
59c0: 73 65 71 75 65 6e 74 20 69 6e 76 6f 63 61 74 69  sequent invocati
59d0: 6f 6e 73 20 6d 75 63 68 20 66 61 73 74 65 72 2e  ons much faster.
59e0: 20 2a 2f 0a 20 20 20 20 70 43 6d 64 20 3d 20 70   */.    pCmd = p
59f0: 2d 3e 70 53 63 72 69 70 74 3b 0a 20 20 20 20 54  ->pScript;.    T
5a00: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
5a10: 70 43 6d 64 29 3b 0a 20 20 20 20 72 63 20 3d 20  pCmd);.    rc = 
5a20: 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70 2d  Tcl_EvalObjEx(p-
5a30: 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c 20 30  >interp, pCmd, 0
5a40: 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52  );.    Tcl_DecrR
5a50: 65 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20  efCount(pCmd);. 
5a60: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49   }else{.    /* I
5a70: 66 20 74 68 65 72 65 20 61 72 65 20 61 72 67 75  f there are argu
5a80: 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 66 75 6e  ments to the fun
5a90: 63 74 69 6f 6e 2c 20 6d 61 6b 65 20 61 20 73 68  ction, make a sh
5aa0: 61 6c 6c 6f 77 20 63 6f 70 79 20 6f 66 20 74 68  allow copy of th
5ab0: 65 0a 20 20 20 20 2a 2a 20 73 63 72 69 70 74 20  e.    ** script 
5ac0: 6f 62 6a 65 63 74 2c 20 6c 61 70 70 65 6e 64 20  object, lappend 
5ad0: 74 68 65 20 61 72 67 75 6d 65 6e 74 73 2c 20 74  the arguments, t
5ae0: 68 65 6e 20 65 76 61 6c 75 61 74 65 20 74 68 65  hen evaluate the
5af0: 20 63 6f 70 79 2e 0a 20 20 20 20 2a 2a 0a 20 20   copy..    **.  
5b00: 20 20 2a 2a 20 42 79 20 22 73 68 61 6c 6c 6f 77    ** By "shallow
5b10: 22 20 63 6f 70 79 2c 20 77 65 20 6d 65 61 6e 20  " copy, we mean 
5b20: 61 20 6f 6e 6c 79 20 74 68 65 20 6f 75 74 65 72  a only the outer
5b30: 20 6c 69 73 74 20 54 63 6c 5f 4f 62 6a 20 69 73   list Tcl_Obj is
5b40: 20 64 75 70 6c 69 63 61 74 65 64 2e 0a 20 20 20   duplicated..   
5b50: 20 2a 2a 20 54 68 65 20 6e 65 77 20 54 63 6c 5f   ** The new Tcl_
5b60: 4f 62 6a 20 63 6f 6e 74 61 69 6e 73 20 70 6f 69  Obj contains poi
5b70: 6e 74 65 72 73 20 74 6f 20 74 68 65 20 6f 72 69  nters to the ori
5b80: 67 69 6e 61 6c 20 6c 69 73 74 20 65 6c 65 6d 65  ginal list eleme
5b90: 6e 74 73 2e 20 0a 20 20 20 20 2a 2a 20 54 68 61  nts. .    ** Tha
5ba0: 74 20 77 61 79 2c 20 77 68 65 6e 20 54 63 6c 5f  t way, when Tcl_
5bb0: 45 76 61 6c 4f 62 6a 76 28 29 20 69 73 20 72 75  EvalObjv() is ru
5bc0: 6e 20 61 6e 64 20 73 68 69 6d 6d 65 72 73 20 74  n and shimmers t
5bd0: 68 65 20 66 69 72 73 74 20 65 6c 65 6d 65 6e 74  he first element
5be0: 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 6c  .    ** of the l
5bf0: 69 73 74 20 74 6f 20 74 63 6c 43 6d 64 4e 61 6d  ist to tclCmdNam
5c00: 65 54 79 70 65 2c 20 74 68 61 74 20 61 6c 74 65  eType, that alte
5c10: 72 6e 61 74 65 20 72 65 70 72 65 73 65 6e 74 61  rnate representa
5c20: 74 69 6f 6e 20 77 69 6c 6c 0a 20 20 20 20 2a 2a  tion will.    **
5c30: 20 62 65 20 70 72 65 73 65 72 76 65 64 20 61 6e   be preserved an
5c40: 64 20 72 65 75 73 65 64 20 6f 6e 20 74 68 65 20  d reused on the 
5c50: 6e 65 78 74 20 69 6e 76 6f 63 61 74 69 6f 6e 2e  next invocation.
5c60: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 54 63 6c 5f  .    */.    Tcl_
5c70: 4f 62 6a 20 2a 2a 61 41 72 67 3b 0a 20 20 20 20  Obj **aArg;.    
5c80: 69 6e 74 20 6e 41 72 67 3b 0a 20 20 20 20 69 66  int nArg;.    if
5c90: 28 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 47 65 74  ( Tcl_ListObjGet
5ca0: 45 6c 65 6d 65 6e 74 73 28 70 2d 3e 69 6e 74 65  Elements(p->inte
5cb0: 72 70 2c 20 70 2d 3e 70 53 63 72 69 70 74 2c 20  rp, p->pScript, 
5cc0: 26 6e 41 72 67 2c 20 26 61 41 72 67 29 20 29 7b  &nArg, &aArg) ){
5cd0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
5ce0: 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74  esult_error(cont
5cf0: 65 78 74 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  ext, Tcl_GetStri
5d00: 6e 67 52 65 73 75 6c 74 28 70 2d 3e 69 6e 74 65  ngResult(p->inte
5d10: 72 70 29 2c 20 2d 31 29 3b 20 0a 20 20 20 20 20  rp), -1); .     
5d20: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 20 20   return;.    }  
5d30: 20 20 20 0a 20 20 20 20 70 43 6d 64 20 3d 20 54     .    pCmd = T
5d40: 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 6e 41  cl_NewListObj(nA
5d50: 72 67 2c 20 61 41 72 67 29 3b 0a 20 20 20 20 54  rg, aArg);.    T
5d60: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
5d70: 70 43 6d 64 29 3b 0a 20 20 20 20 66 6f 72 28 69  pCmd);.    for(i
5d80: 3d 30 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b 29  =0; i<argc; i++)
5d90: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
5da0: 76 61 6c 75 65 20 2a 70 49 6e 20 3d 20 61 72 67  value *pIn = arg
5db0: 76 5b 69 5d 3b 0a 20 20 20 20 20 20 54 63 6c 5f  v[i];.      Tcl_
5dc0: 4f 62 6a 20 2a 70 56 61 6c 3b 0a 20 20 20 20 20  Obj *pVal;.     
5dd0: 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 2f 2a         .      /*
5de0: 20 53 65 74 20 70 56 61 6c 20 74 6f 20 63 6f 6e   Set pVal to con
5df0: 74 61 69 6e 20 74 68 65 20 69 27 74 68 20 63 6f  tain the i'th co
5e00: 6c 75 6d 6e 20 6f 66 20 74 68 69 73 20 72 6f 77  lumn of this row
5e10: 2e 20 2a 2f 0a 20 20 20 20 20 20 73 77 69 74 63  . */.      switc
5e20: 68 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  h( sqlite3_value
5e30: 5f 74 79 70 65 28 70 49 6e 29 20 29 7b 0a 20 20  _type(pIn) ){.  
5e40: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
5e50: 45 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20  E_BLOB: {.      
5e60: 20 20 20 20 69 6e 74 20 62 79 74 65 73 20 3d 20      int bytes = 
5e70: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79  sqlite3_value_by
5e80: 74 65 73 28 70 49 6e 29 3b 0a 20 20 20 20 20 20  tes(pIn);.      
5e90: 20 20 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e      pVal = Tcl_N
5ea0: 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 73  ewByteArrayObj(s
5eb0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f  qlite3_value_blo
5ec0: 62 28 70 49 6e 29 2c 20 62 79 74 65 73 29 3b 0a  b(pIn), bytes);.
5ed0: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
5ee0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
5ef0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
5f00: 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20 20 20  NTEGER: {.      
5f10: 20 20 20 20 73 71 6c 69 74 65 5f 69 6e 74 36 34      sqlite_int64
5f20: 20 76 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c   v = sqlite3_val
5f30: 75 65 5f 69 6e 74 36 34 28 70 49 6e 29 3b 0a 20  ue_int64(pIn);. 
5f40: 20 20 20 20 20 20 20 20 20 69 66 28 20 76 3e 3d           if( v>=
5f50: 2d 32 31 34 37 34 38 33 36 34 37 20 26 26 20 76  -2147483647 && v
5f60: 3c 3d 32 31 34 37 34 38 33 36 34 37 20 29 7b 0a  <=2147483647 ){.
5f70: 20 20 20 20 20 20 20 20 20 20 20 20 70 56 61 6c              pVal
5f80: 20 3d 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a   = Tcl_NewIntObj
5f90: 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  (v);.          }
5fa0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
5fb0: 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77    pVal = Tcl_New
5fc0: 57 69 64 65 49 6e 74 4f 62 6a 28 76 29 3b 0a 20  WideIntObj(v);. 
5fd0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
5fe0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
5ff0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63 61      }.        ca
6000: 73 65 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54 3a  se SQLITE_FLOAT:
6010: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 64 6f 75   {.          dou
6020: 62 6c 65 20 72 20 3d 20 73 71 6c 69 74 65 33 5f  ble r = sqlite3_
6030: 76 61 6c 75 65 5f 64 6f 75 62 6c 65 28 70 49 6e  value_double(pIn
6040: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 56 61  );.          pVa
6050: 6c 20 3d 20 54 63 6c 5f 4e 65 77 44 6f 75 62 6c  l = Tcl_NewDoubl
6060: 65 4f 62 6a 28 72 29 3b 0a 20 20 20 20 20 20 20  eObj(r);.       
6070: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
6080: 20 20 7d 0a 20 20 20 20 20 20 20 20 63 61 73 65    }.        case
6090: 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 3a 20 7b 0a   SQLITE_NULL: {.
60a0: 20 20 20 20 20 20 20 20 20 20 70 56 61 6c 20 3d            pVal =
60b0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
60c0: 6a 28 22 22 2c 20 30 29 3b 0a 20 20 20 20 20 20  j("", 0);.      
60d0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
60e0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 64 65 66     }.        def
60f0: 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 20 20  ault: {.        
6100: 20 20 69 6e 74 20 62 79 74 65 73 20 3d 20 73 71    int bytes = sq
6110: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65  lite3_value_byte
6120: 73 28 70 49 6e 29 3b 0a 20 20 20 20 20 20 20 20  s(pIn);.        
6130: 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77    pVal = Tcl_New
6140: 53 74 72 69 6e 67 4f 62 6a 28 28 63 68 61 72 20  StringObj((char 
6150: 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  *)sqlite3_value_
6160: 74 65 78 74 28 70 49 6e 29 2c 20 62 79 74 65 73  text(pIn), bytes
6170: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  );.          bre
6180: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
6190: 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d      }.      rc =
61a0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
61b0: 6e 64 45 6c 65 6d 65 6e 74 28 70 2d 3e 69 6e 74  ndElement(p->int
61c0: 65 72 70 2c 20 70 43 6d 64 2c 20 70 56 61 6c 29  erp, pCmd, pVal)
61d0: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
61e0: 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 44 65  {.        Tcl_De
61f0: 63 72 52 65 66 43 6f 75 6e 74 28 70 43 6d 64 29  crRefCount(pCmd)
6200: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
6210: 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63  3_result_error(c
6220: 6f 6e 74 65 78 74 2c 20 54 63 6c 5f 47 65 74 53  ontext, Tcl_GetS
6230: 74 72 69 6e 67 52 65 73 75 6c 74 28 70 2d 3e 69  tringResult(p->i
6240: 6e 74 65 72 70 29 2c 20 2d 31 29 3b 20 0a 20 20  nterp), -1); .  
6250: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
6260: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
6270: 69 66 28 20 21 70 2d 3e 75 73 65 45 76 61 6c 4f  if( !p->useEvalO
6280: 62 6a 76 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  bjv ){.      /* 
6290: 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 29 20  Tcl_EvalObjEx() 
62a0: 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c  will automatical
62b0: 6c 79 20 63 61 6c 6c 20 54 63 6c 5f 45 76 61 6c  ly call Tcl_Eval
62c0: 4f 62 6a 76 28 29 20 69 66 20 70 43 6d 64 0a 20  Objv() if pCmd. 
62d0: 20 20 20 20 20 2a 2a 20 69 73 20 61 20 6c 69 73       ** is a lis
62e0: 74 20 77 69 74 68 6f 75 74 20 61 20 73 74 72 69  t without a stri
62f0: 6e 67 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  ng representatio
6300: 6e 2e 20 20 54 6f 20 70 72 65 76 65 6e 74 20 74  n.  To prevent t
6310: 68 69 73 20 66 72 6f 6d 0a 20 20 20 20 20 20 2a  his from.      *
6320: 2a 20 68 61 70 70 65 6e 69 6e 67 2c 20 6d 61 6b  * happening, mak
6330: 65 20 73 75 72 65 20 70 43 6d 64 20 68 61 73 20  e sure pCmd has 
6340: 61 20 76 61 6c 69 64 20 73 74 72 69 6e 67 20 72  a valid string r
6350: 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 2a 2f  epresentation */
6360: 0a 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74  .      Tcl_GetSt
6370: 72 69 6e 67 28 70 43 6d 64 29 3b 0a 20 20 20 20  ring(pCmd);.    
6380: 7d 0a 20 20 20 20 72 63 20 3d 20 54 63 6c 5f 45  }.    rc = Tcl_E
6390: 76 61 6c 4f 62 6a 45 78 28 70 2d 3e 69 6e 74 65  valObjEx(p->inte
63a0: 72 70 2c 20 70 43 6d 64 2c 20 54 43 4c 5f 45 56  rp, pCmd, TCL_EV
63b0: 41 4c 5f 44 49 52 45 43 54 29 3b 0a 20 20 20 20  AL_DIRECT);.    
63c0: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
63d0: 28 70 43 6d 64 29 3b 0a 20 20 7d 0a 0a 20 20 69  (pCmd);.  }..  i
63e0: 66 28 20 72 63 20 26 26 20 72 63 21 3d 54 43 4c  f( rc && rc!=TCL
63f0: 5f 52 45 54 55 52 4e 20 29 7b 0a 20 20 20 20 73  _RETURN ){.    s
6400: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72  qlite3_result_er
6410: 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20 54 63 6c  ror(context, Tcl
6420: 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74  _GetStringResult
6430: 28 70 2d 3e 69 6e 74 65 72 70 29 2c 20 2d 31 29  (p->interp), -1)
6440: 3b 20 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  ; .  }else{.    
6450: 54 63 6c 5f 4f 62 6a 20 2a 70 56 61 72 20 3d 20  Tcl_Obj *pVar = 
6460: 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_GetObjResult
6470: 28 70 2d 3e 69 6e 74 65 72 70 29 3b 0a 20 20 20  (p->interp);.   
6480: 20 69 6e 74 20 6e 3b 0a 20 20 20 20 75 38 20 2a   int n;.    u8 *
6490: 64 61 74 61 3b 0a 20 20 20 20 63 6f 6e 73 74 20  data;.    const 
64a0: 63 68 61 72 20 2a 7a 54 79 70 65 20 3d 20 28 70  char *zType = (p
64b0: 56 61 72 2d 3e 74 79 70 65 50 74 72 20 3f 20 70  Var->typePtr ? p
64c0: 56 61 72 2d 3e 74 79 70 65 50 74 72 2d 3e 6e 61  Var->typePtr->na
64d0: 6d 65 20 3a 20 22 22 29 3b 0a 20 20 20 20 63 68  me : "");.    ch
64e0: 61 72 20 63 20 3d 20 7a 54 79 70 65 5b 30 5d 3b  ar c = zType[0];
64f0: 0a 20 20 20 20 69 66 28 20 63 3d 3d 27 62 27 20  .    if( c=='b' 
6500: 26 26 20 73 74 72 63 6d 70 28 7a 54 79 70 65 2c  && strcmp(zType,
6510: 22 62 79 74 65 61 72 72 61 79 22 29 3d 3d 30 20  "bytearray")==0 
6520: 26 26 20 70 56 61 72 2d 3e 62 79 74 65 73 3d 3d  && pVar->bytes==
6530: 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 6e  0 ){.      /* On
6540: 6c 79 20 72 65 74 75 72 6e 20 61 20 42 4c 4f 42  ly return a BLOB
6550: 20 74 79 70 65 20 69 66 20 74 68 65 20 54 63 6c   type if the Tcl
6560: 20 76 61 72 69 61 62 6c 65 20 69 73 20 61 20 62   variable is a b
6570: 79 74 65 61 72 72 61 79 20 61 6e 64 0a 20 20 20  ytearray and.   
6580: 20 20 20 2a 2a 20 68 61 73 20 6e 6f 20 73 74 72     ** has no str
6590: 69 6e 67 20 72 65 70 72 65 73 65 6e 74 61 74 69  ing representati
65a0: 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 64 61 74  on. */.      dat
65b0: 61 20 3d 20 54 63 6c 5f 47 65 74 42 79 74 65 41  a = Tcl_GetByteA
65c0: 72 72 61 79 46 72 6f 6d 4f 62 6a 28 70 56 61 72  rrayFromObj(pVar
65d0: 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c  , &n);.      sql
65e0: 69 74 65 33 5f 72 65 73 75 6c 74 5f 62 6c 6f 62  ite3_result_blob
65f0: 28 63 6f 6e 74 65 78 74 2c 20 64 61 74 61 2c 20  (context, data, 
6600: 6e 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  n, SQLITE_TRANSI
6610: 45 4e 54 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  ENT);.    }else 
6620: 69 66 28 20 63 3d 3d 27 62 27 20 26 26 20 73 74  if( c=='b' && st
6630: 72 63 6d 70 28 7a 54 79 70 65 2c 22 62 6f 6f 6c  rcmp(zType,"bool
6640: 65 61 6e 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ean")==0 ){.    
6650: 20 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d    Tcl_GetIntFrom
6660: 4f 62 6a 28 30 2c 20 70 56 61 72 2c 20 26 6e 29  Obj(0, pVar, &n)
6670: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
6680: 72 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e 74 65  result_int(conte
6690: 78 74 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73  xt, n);.    }els
66a0: 65 20 69 66 28 20 63 3d 3d 27 64 27 20 26 26 20  e if( c=='d' && 
66b0: 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22 64 6f  strcmp(zType,"do
66c0: 75 62 6c 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20  uble")==0 ){.   
66d0: 20 20 20 64 6f 75 62 6c 65 20 72 3b 0a 20 20 20     double r;.   
66e0: 20 20 20 54 63 6c 5f 47 65 74 44 6f 75 62 6c 65     Tcl_GetDouble
66f0: 46 72 6f 6d 4f 62 6a 28 30 2c 20 70 56 61 72 2c  FromObj(0, pVar,
6700: 20 26 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   &r);.      sqli
6710: 74 65 33 5f 72 65 73 75 6c 74 5f 64 6f 75 62 6c  te3_result_doubl
6720: 65 28 63 6f 6e 74 65 78 74 2c 20 72 29 3b 0a 20  e(context, r);. 
6730: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 63 3d     }else if( (c=
6740: 3d 27 77 27 20 26 26 20 73 74 72 63 6d 70 28 7a  ='w' && strcmp(z
6750: 54 79 70 65 2c 22 77 69 64 65 49 6e 74 22 29 3d  Type,"wideInt")=
6760: 3d 30 29 20 7c 7c 0a 20 20 20 20 20 20 20 20 20  =0) ||.         
6770: 20 28 63 3d 3d 27 69 27 20 26 26 20 73 74 72 63   (c=='i' && strc
6780: 6d 70 28 7a 54 79 70 65 2c 22 69 6e 74 22 29 3d  mp(zType,"int")=
6790: 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  =0) ){.      Tcl
67a0: 5f 57 69 64 65 49 6e 74 20 76 3b 0a 20 20 20 20  _WideInt v;.    
67b0: 20 20 54 63 6c 5f 47 65 74 57 69 64 65 49 6e 74    Tcl_GetWideInt
67c0: 46 72 6f 6d 4f 62 6a 28 30 2c 20 70 56 61 72 2c  FromObj(0, pVar,
67d0: 20 26 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   &v);.      sqli
67e0: 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34  te3_result_int64
67f0: 28 63 6f 6e 74 65 78 74 2c 20 76 29 3b 0a 20 20  (context, v);.  
6800: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 64    }else{.      d
6810: 61 74 61 20 3d 20 28 75 6e 73 69 67 6e 65 64 20  ata = (unsigned 
6820: 63 68 61 72 20 2a 29 54 63 6c 5f 47 65 74 53 74  char *)Tcl_GetSt
6830: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 70 56 61 72  ringFromObj(pVar
6840: 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c  , &n);.      sql
6850: 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74  ite3_result_text
6860: 28 63 6f 6e 74 65 78 74 2c 20 28 63 68 61 72 20  (context, (char 
6870: 2a 29 64 61 74 61 2c 20 6e 2c 20 53 51 4c 49 54  *)data, n, SQLIT
6880: 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  E_TRANSIENT);.  
6890: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64    }.  }.}..#ifnd
68a0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
68b0: 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 2f 2a 0a  UTHORIZATION./*.
68c0: 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 61  ** This is the a
68d0: 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 20 66 75  uthentication fu
68e0: 6e 63 74 69 6f 6e 2e 20 20 49 74 20 61 70 70 65  nction.  It appe
68f0: 6e 64 73 20 74 68 65 20 61 75 74 68 65 6e 74 69  nds the authenti
6900: 63 61 74 69 6f 6e 0a 2a 2a 20 74 79 70 65 20 63  cation.** type c
6910: 6f 64 65 20 61 6e 64 20 74 68 65 20 74 77 6f 20  ode and the two 
6920: 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 7a 43 6d  arguments to zCm
6930: 64 5b 5d 20 74 68 65 6e 20 69 6e 76 6f 6b 65 73  d[] then invokes
6940: 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 6f   the result.** o
6950: 6e 20 74 68 65 20 69 6e 74 65 72 70 72 65 74 65  n the interprete
6960: 72 2e 20 20 54 68 65 20 72 65 70 6c 79 20 69 73  r.  The reply is
6970: 20 65 78 61 6d 69 6e 65 64 20 74 6f 20 64 65 74   examined to det
6980: 65 72 6d 69 6e 65 20 69 66 20 74 68 65 0a 2a 2a  ermine if the.**
6990: 20 61 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 20   authentication 
69a0: 66 61 69 6c 73 20 6f 72 20 73 75 63 63 65 65 64  fails or succeed
69b0: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
69c0: 20 61 75 74 68 5f 63 61 6c 6c 62 61 63 6b 28 0a   auth_callback(.
69d0: 20 20 76 6f 69 64 20 2a 70 41 72 67 2c 0a 20 20    void *pArg,.  
69e0: 69 6e 74 20 63 6f 64 65 2c 0a 20 20 63 6f 6e 73  int code,.  cons
69f0: 74 20 63 68 61 72 20 2a 7a 41 72 67 31 2c 0a 20  t char *zArg1,. 
6a00: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72   const char *zAr
6a10: 67 32 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  g2,.  const char
6a20: 20 2a 7a 41 72 67 33 2c 0a 20 20 63 6f 6e 73 74   *zArg3,.  const
6a30: 20 63 68 61 72 20 2a 7a 41 72 67 34 0a 29 7b 0a   char *zArg4.){.
6a40: 20 20 63 68 61 72 20 2a 7a 43 6f 64 65 3b 0a 20    char *zCode;. 
6a50: 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 73 74 72   Tcl_DString str
6a60: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 6f  ;.  int rc;.  co
6a70: 6e 73 74 20 63 68 61 72 20 2a 7a 52 65 70 6c 79  nst char *zReply
6a80: 3b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44  ;.  SqliteDb *pD
6a90: 62 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 70  b = (SqliteDb*)p
6aa0: 41 72 67 3b 0a 20 20 69 66 28 20 70 44 62 2d 3e  Arg;.  if( pDb->
6ab0: 64 69 73 61 62 6c 65 41 75 74 68 20 29 20 72 65  disableAuth ) re
6ac0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
6ad0: 0a 20 20 73 77 69 74 63 68 28 20 63 6f 64 65 20  .  switch( code 
6ae0: 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  ){.    case SQLI
6af0: 54 45 5f 43 4f 50 59 20 20 20 20 20 20 20 20 20  TE_COPY         
6b00: 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51       : zCode="SQ
6b10: 4c 49 54 45 5f 43 4f 50 59 22 3b 20 62 72 65 61  LITE_COPY"; brea
6b20: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
6b30: 54 45 5f 43 52 45 41 54 45 5f 49 4e 44 45 58 20  TE_CREATE_INDEX 
6b40: 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51       : zCode="SQ
6b50: 4c 49 54 45 5f 43 52 45 41 54 45 5f 49 4e 44 45  LITE_CREATE_INDE
6b60: 58 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  X"; break;.    c
6b70: 61 73 65 20 53 51 4c 49 54 45 5f 43 52 45 41 54  ase SQLITE_CREAT
6b80: 45 5f 54 41 42 4c 45 20 20 20 20 20 20 3a 20 7a  E_TABLE      : z
6b90: 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43 52 45  Code="SQLITE_CRE
6ba0: 41 54 45 5f 54 41 42 4c 45 22 3b 20 62 72 65 61  ATE_TABLE"; brea
6bb0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
6bc0: 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 49  TE_CREATE_TEMP_I
6bd0: 4e 44 45 58 20 3a 20 7a 43 6f 64 65 3d 22 53 51  NDEX : zCode="SQ
6be0: 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50  LITE_CREATE_TEMP
6bf0: 5f 49 4e 44 45 58 22 3b 20 62 72 65 61 6b 3b 0a  _INDEX"; break;.
6c00: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
6c10: 43 52 45 41 54 45 5f 54 45 4d 50 5f 54 41 42 4c  CREATE_TEMP_TABL
6c20: 45 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54  E : zCode="SQLIT
6c30: 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 54 41  E_CREATE_TEMP_TA
6c40: 42 4c 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  BLE"; break;.   
6c50: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 52 45   case SQLITE_CRE
6c60: 41 54 45 5f 54 45 4d 50 5f 54 52 49 47 47 45 52  ATE_TEMP_TRIGGER
6c70: 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f  : zCode="SQLITE_
6c80: 43 52 45 41 54 45 5f 54 45 4d 50 5f 54 52 49 47  CREATE_TEMP_TRIG
6c90: 47 45 52 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  GER"; break;.   
6ca0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 52 45   case SQLITE_CRE
6cb0: 41 54 45 5f 54 45 4d 50 5f 56 49 45 57 20 20 3a  ATE_TEMP_VIEW  :
6cc0: 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43   zCode="SQLITE_C
6cd0: 52 45 41 54 45 5f 54 45 4d 50 5f 56 49 45 57 22  REATE_TEMP_VIEW"
6ce0: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
6cf0: 65 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  e SQLITE_CREATE_
6d00: 54 52 49 47 47 45 52 20 20 20 20 3a 20 7a 43 6f  TRIGGER    : zCo
6d10: 64 65 3d 22 53 51 4c 49 54 45 5f 43 52 45 41 54  de="SQLITE_CREAT
6d20: 45 5f 54 52 49 47 47 45 52 22 3b 20 62 72 65 61  E_TRIGGER"; brea
6d30: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
6d40: 54 45 5f 43 52 45 41 54 45 5f 56 49 45 57 20 20  TE_CREATE_VIEW  
6d50: 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51       : zCode="SQ
6d60: 4c 49 54 45 5f 43 52 45 41 54 45 5f 56 49 45 57  LITE_CREATE_VIEW
6d70: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
6d80: 73 65 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45  se SQLITE_DELETE
6d90: 20 20 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43              : zC
6da0: 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44 45 4c 45  ode="SQLITE_DELE
6db0: 54 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  TE"; break;.    
6dc0: 63 61 73 65 20 53 51 4c 49 54 45 5f 44 52 4f 50  case SQLITE_DROP
6dd0: 5f 49 4e 44 45 58 20 20 20 20 20 20 20 20 3a 20  _INDEX        : 
6de0: 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44 52  zCode="SQLITE_DR
6df0: 4f 50 5f 49 4e 44 45 58 22 3b 20 62 72 65 61 6b  OP_INDEX"; break
6e00: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
6e10: 45 5f 44 52 4f 50 5f 54 41 42 4c 45 20 20 20 20  E_DROP_TABLE    
6e20: 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c      : zCode="SQL
6e30: 49 54 45 5f 44 52 4f 50 5f 54 41 42 4c 45 22 3b  ITE_DROP_TABLE";
6e40: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
6e50: 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d   SQLITE_DROP_TEM
6e60: 50 5f 49 4e 44 45 58 20 20 20 3a 20 7a 43 6f 64  P_INDEX   : zCod
6e70: 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54  e="SQLITE_DROP_T
6e80: 45 4d 50 5f 49 4e 44 45 58 22 3b 20 62 72 65 61  EMP_INDEX"; brea
6e90: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
6ea0: 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 54 41 42  TE_DROP_TEMP_TAB
6eb0: 4c 45 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51  LE   : zCode="SQ
6ec0: 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 54  LITE_DROP_TEMP_T
6ed0: 41 42 4c 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20  ABLE"; break;.  
6ee0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44 52    case SQLITE_DR
6ef0: 4f 50 5f 54 45 4d 50 5f 54 52 49 47 47 45 52 20  OP_TEMP_TRIGGER 
6f00: 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f  : zCode="SQLITE_
6f10: 44 52 4f 50 5f 54 45 4d 50 5f 54 52 49 47 47 45  DROP_TEMP_TRIGGE
6f20: 52 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  R"; break;.    c
6f30: 61 73 65 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f  ase SQLITE_DROP_
6f40: 54 45 4d 50 5f 56 49 45 57 20 20 20 20 3a 20 7a  TEMP_VIEW    : z
6f50: 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f  Code="SQLITE_DRO
6f60: 50 5f 54 45 4d 50 5f 56 49 45 57 22 3b 20 62 72  P_TEMP_VIEW"; br
6f70: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
6f80: 4c 49 54 45 5f 44 52 4f 50 5f 54 52 49 47 47 45  LITE_DROP_TRIGGE
6f90: 52 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22  R      : zCode="
6fa0: 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 52 49 47  SQLITE_DROP_TRIG
6fb0: 47 45 52 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  GER"; break;.   
6fc0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44 52 4f   case SQLITE_DRO
6fd0: 50 5f 56 49 45 57 20 20 20 20 20 20 20 20 20 3a  P_VIEW         :
6fe0: 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44   zCode="SQLITE_D
6ff0: 52 4f 50 5f 56 49 45 57 22 3b 20 62 72 65 61 6b  ROP_VIEW"; break
7000: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
7010: 45 5f 49 4e 53 45 52 54 20 20 20 20 20 20 20 20  E_INSERT        
7020: 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c      : zCode="SQL
7030: 49 54 45 5f 49 4e 53 45 52 54 22 3b 20 62 72 65  ITE_INSERT"; bre
7040: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
7050: 49 54 45 5f 50 52 41 47 4d 41 20 20 20 20 20 20  ITE_PRAGMA      
7060: 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53        : zCode="S
7070: 51 4c 49 54 45 5f 50 52 41 47 4d 41 22 3b 20 62  QLITE_PRAGMA"; b
7080: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
7090: 51 4c 49 54 45 5f 52 45 41 44 20 20 20 20 20 20  QLITE_READ      
70a0: 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d          : zCode=
70b0: 22 53 51 4c 49 54 45 5f 52 45 41 44 22 3b 20 62  "SQLITE_READ"; b
70c0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
70d0: 51 4c 49 54 45 5f 53 45 4c 45 43 54 20 20 20 20  QLITE_SELECT    
70e0: 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d          : zCode=
70f0: 22 53 51 4c 49 54 45 5f 53 45 4c 45 43 54 22 3b  "SQLITE_SELECT";
7100: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
7110: 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 41 43 54   SQLITE_TRANSACT
7120: 49 4f 4e 20 20 20 20 20 20 20 3a 20 7a 43 6f 64  ION       : zCod
7130: 65 3d 22 53 51 4c 49 54 45 5f 54 52 41 4e 53 41  e="SQLITE_TRANSA
7140: 43 54 49 4f 4e 22 3b 20 62 72 65 61 6b 3b 0a 20  CTION"; break;. 
7150: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 55     case SQLITE_U
7160: 50 44 41 54 45 20 20 20 20 20 20 20 20 20 20 20  PDATE           
7170: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
7180: 5f 55 50 44 41 54 45 22 3b 20 62 72 65 61 6b 3b  _UPDATE"; break;
7190: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
71a0: 5f 41 54 54 41 43 48 20 20 20 20 20 20 20 20 20  _ATTACH         
71b0: 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49     : zCode="SQLI
71c0: 54 45 5f 41 54 54 41 43 48 22 3b 20 62 72 65 61  TE_ATTACH"; brea
71d0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
71e0: 54 45 5f 44 45 54 41 43 48 20 20 20 20 20 20 20  TE_DETACH       
71f0: 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51       : zCode="SQ
7200: 4c 49 54 45 5f 44 45 54 41 43 48 22 3b 20 62 72  LITE_DETACH"; br
7210: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
7220: 4c 49 54 45 5f 41 4c 54 45 52 5f 54 41 42 4c 45  LITE_ALTER_TABLE
7230: 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22         : zCode="
7240: 53 51 4c 49 54 45 5f 41 4c 54 45 52 5f 54 41 42  SQLITE_ALTER_TAB
7250: 4c 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  LE"; break;.    
7260: 63 61 73 65 20 53 51 4c 49 54 45 5f 52 45 49 4e  case SQLITE_REIN
7270: 44 45 58 20 20 20 20 20 20 20 20 20 20 20 3a 20  DEX           : 
7280: 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 52 45  zCode="SQLITE_RE
7290: 49 4e 44 45 58 22 3b 20 62 72 65 61 6b 3b 0a 20  INDEX"; break;. 
72a0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41     case SQLITE_A
72b0: 4e 41 4c 59 5a 45 20 20 20 20 20 20 20 20 20 20  NALYZE          
72c0: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
72d0: 5f 41 4e 41 4c 59 5a 45 22 3b 20 62 72 65 61 6b  _ANALYZE"; break
72e0: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
72f0: 45 5f 43 52 45 41 54 45 5f 56 54 41 42 4c 45 20  E_CREATE_VTABLE 
7300: 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c      : zCode="SQL
7310: 49 54 45 5f 43 52 45 41 54 45 5f 56 54 41 42 4c  ITE_CREATE_VTABL
7320: 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  E"; break;.    c
7330: 61 73 65 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f  ase SQLITE_DROP_
7340: 56 54 41 42 4c 45 20 20 20 20 20 20 20 3a 20 7a  VTABLE       : z
7350: 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f  Code="SQLITE_DRO
7360: 50 5f 56 54 41 42 4c 45 22 3b 20 62 72 65 61 6b  P_VTABLE"; break
7370: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
7380: 45 5f 46 55 4e 43 54 49 4f 4e 20 20 20 20 20 20  E_FUNCTION      
7390: 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c      : zCode="SQL
73a0: 49 54 45 5f 46 55 4e 43 54 49 4f 4e 22 3b 20 62  ITE_FUNCTION"; b
73b0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
73c0: 51 4c 49 54 45 5f 53 41 56 45 50 4f 49 4e 54 20  QLITE_SAVEPOINT 
73d0: 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d          : zCode=
73e0: 22 53 51 4c 49 54 45 5f 53 41 56 45 50 4f 49 4e  "SQLITE_SAVEPOIN
73f0: 54 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 64  T"; break;.    d
7400: 65 66 61 75 6c 74 20 20 20 20 20 20 20 20 20 20  efault          
7410: 20 20 20 20 20 20 20 20 20 20 20 20 20 3a 20 7a               : z
7420: 43 6f 64 65 3d 22 3f 3f 3f 3f 22 3b 20 62 72 65  Code="????"; bre
7430: 61 6b 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 44 53  ak;.  }.  Tcl_DS
7440: 74 72 69 6e 67 49 6e 69 74 28 26 73 74 72 29 3b  tringInit(&str);
7450: 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70  .  Tcl_DStringAp
7460: 70 65 6e 64 28 26 73 74 72 2c 20 70 44 62 2d 3e  pend(&str, pDb->
7470: 7a 41 75 74 68 2c 20 2d 31 29 3b 0a 20 20 54 63  zAuth, -1);.  Tc
7480: 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64 45  l_DStringAppendE
7490: 6c 65 6d 65 6e 74 28 26 73 74 72 2c 20 7a 43 6f  lement(&str, zCo
74a0: 64 65 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69  de);.  Tcl_DStri
74b0: 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  ngAppendElement(
74c0: 26 73 74 72 2c 20 7a 41 72 67 31 20 3f 20 7a 41  &str, zArg1 ? zA
74d0: 72 67 31 20 3a 20 22 22 29 3b 0a 20 20 54 63 6c  rg1 : "");.  Tcl
74e0: 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64 45 6c  _DStringAppendEl
74f0: 65 6d 65 6e 74 28 26 73 74 72 2c 20 7a 41 72 67  ement(&str, zArg
7500: 32 20 3f 20 7a 41 72 67 32 20 3a 20 22 22 29 3b  2 ? zArg2 : "");
7510: 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70  .  Tcl_DStringAp
7520: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 26 73 74 72  pendElement(&str
7530: 2c 20 7a 41 72 67 33 20 3f 20 7a 41 72 67 33 20  , zArg3 ? zArg3 
7540: 3a 20 22 22 29 3b 0a 20 20 54 63 6c 5f 44 53 74  : "");.  Tcl_DSt
7550: 72 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e  ringAppendElemen
7560: 74 28 26 73 74 72 2c 20 7a 41 72 67 34 20 3f 20  t(&str, zArg4 ? 
7570: 7a 41 72 67 34 20 3a 20 22 22 29 3b 0a 20 20 72  zArg4 : "");.  r
7580: 63 20 3d 20 54 63 6c 5f 47 6c 6f 62 61 6c 45 76  c = Tcl_GlobalEv
7590: 61 6c 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20  al(pDb->interp, 
75a0: 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65  Tcl_DStringValue
75b0: 28 26 73 74 72 29 29 3b 0a 20 20 54 63 6c 5f 44  (&str));.  Tcl_D
75c0: 53 74 72 69 6e 67 46 72 65 65 28 26 73 74 72 29  StringFree(&str)
75d0: 3b 0a 20 20 7a 52 65 70 6c 79 20 3d 20 54 63 6c  ;.  zReply = Tcl
75e0: 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74  _GetStringResult
75f0: 28 70 44 62 2d 3e 69 6e 74 65 72 70 29 3b 0a 20  (pDb->interp);. 
7600: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 52 65 70   if( strcmp(zRep
7610: 6c 79 2c 22 53 51 4c 49 54 45 5f 4f 4b 22 29 3d  ly,"SQLITE_OK")=
7620: 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  =0 ){.    rc = S
7630: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73  QLITE_OK;.  }els
7640: 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 52 65  e if( strcmp(zRe
7650: 70 6c 79 2c 22 53 51 4c 49 54 45 5f 44 45 4e 59  ply,"SQLITE_DENY
7660: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  ")==0 ){.    rc 
7670: 3d 20 53 51 4c 49 54 45 5f 44 45 4e 59 3b 0a 20  = SQLITE_DENY;. 
7680: 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
7690: 70 28 7a 52 65 70 6c 79 2c 22 53 51 4c 49 54 45  p(zReply,"SQLITE
76a0: 5f 49 47 4e 4f 52 45 22 29 3d 3d 30 20 29 7b 0a  _IGNORE")==0 ){.
76b0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
76c0: 49 47 4e 4f 52 45 3b 0a 20 20 7d 65 6c 73 65 7b  IGNORE;.  }else{
76d0: 0a 20 20 20 20 72 63 20 3d 20 39 39 39 3b 0a 20  .    rc = 999;. 
76e0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
76f0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
7700: 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a  TE_OMIT_AUTHORIZ
7710: 41 54 49 4f 4e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  ATION */../*.** 
7720: 7a 54 65 78 74 20 69 73 20 61 20 70 6f 69 6e 74  zText is a point
7730: 65 72 20 74 6f 20 74 65 78 74 20 6f 62 74 61 69  er to text obtai
7740: 6e 65 64 20 76 69 61 20 61 6e 20 73 71 6c 69 74  ned via an sqlit
7750: 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 29  e3_result_text()
7760: 0a 2a 2a 20 6f 72 20 73 69 6d 69 6c 61 72 20 69  .** or similar i
7770: 6e 74 65 72 66 61 63 65 2e 20 54 68 69 73 20 72  nterface. This r
7780: 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 61  outine returns a
7790: 20 54 63 6c 20 73 74 72 69 6e 67 20 6f 62 6a 65   Tcl string obje
77a0: 63 74 2c 20 0a 2a 2a 20 72 65 66 65 72 65 6e 63  ct, .** referenc
77b0: 65 20 63 6f 75 6e 74 20 73 65 74 20 74 6f 20 30  e count set to 0
77c0: 2c 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  , containing the
77d0: 20 74 65 78 74 2e 20 49 66 20 61 20 74 72 61 6e   text. If a tran
77e0: 73 6c 61 74 69 6f 6e 0a 2a 2a 20 62 65 74 77 65  slation.** betwe
77f0: 65 6e 20 69 73 6f 38 38 35 39 20 61 6e 64 20 55  en iso8859 and U
7800: 54 46 2d 38 20 69 73 20 72 65 71 75 69 72 65 64  TF-8 is required
7810: 2c 20 69 74 20 69 73 20 70 72 65 66 6f 72 6d 65  , it is preforme
7820: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 54 63 6c  d..*/.static Tcl
7830: 5f 4f 62 6a 20 2a 64 62 54 65 78 74 54 6f 4f 62  _Obj *dbTextToOb
7840: 6a 28 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 54  j(char const *zT
7850: 65 78 74 29 7b 0a 20 20 54 63 6c 5f 4f 62 6a 20  ext){.  Tcl_Obj 
7860: 2a 70 56 61 6c 3b 0a 23 69 66 64 65 66 20 55 54  *pVal;.#ifdef UT
7870: 46 5f 54 52 41 4e 53 4c 41 54 49 4f 4e 5f 4e 45  F_TRANSLATION_NE
7880: 45 44 45 44 0a 20 20 54 63 6c 5f 44 53 74 72 69  EDED.  Tcl_DStri
7890: 6e 67 20 64 43 6f 6c 3b 0a 20 20 54 63 6c 5f 44  ng dCol;.  Tcl_D
78a0: 53 74 72 69 6e 67 49 6e 69 74 28 26 64 43 6f 6c  StringInit(&dCol
78b0: 29 3b 0a 20 20 54 63 6c 5f 45 78 74 65 72 6e 61  );.  Tcl_Externa
78c0: 6c 54 6f 55 74 66 44 53 74 72 69 6e 67 28 4e 55  lToUtfDString(NU
78d0: 4c 4c 2c 20 7a 54 65 78 74 2c 20 2d 31 2c 20 26  LL, zText, -1, &
78e0: 64 43 6f 6c 29 3b 0a 20 20 70 56 61 6c 20 3d 20  dCol);.  pVal = 
78f0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
7900: 28 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75  (Tcl_DStringValu
7910: 65 28 26 64 43 6f 6c 29 2c 20 2d 31 29 3b 0a 20  e(&dCol), -1);. 
7920: 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65   Tcl_DStringFree
7930: 28 26 64 43 6f 6c 29 3b 0a 23 65 6c 73 65 0a 20  (&dCol);.#else. 
7940: 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 53   pVal = Tcl_NewS
7950: 74 72 69 6e 67 4f 62 6a 28 7a 54 65 78 74 2c 20  tringObj(zText, 
7960: 2d 31 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65  -1);.#endif.  re
7970: 74 75 72 6e 20 70 56 61 6c 3b 0a 7d 0a 0a 2f 2a  turn pVal;.}../*
7980: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
7990: 20 72 65 61 64 73 20 61 20 6c 69 6e 65 20 6f 66   reads a line of
79a0: 20 74 65 78 74 20 66 72 6f 6d 20 46 49 4c 45 20   text from FILE 
79b0: 69 6e 2c 20 73 74 6f 72 65 73 0a 2a 2a 20 74 68  in, stores.** th
79c0: 65 20 74 65 78 74 20 69 6e 20 6d 65 6d 6f 72 79  e text in memory
79d0: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d   obtained from m
79e0: 61 6c 6c 6f 63 28 29 20 61 6e 64 20 72 65 74 75  alloc() and retu
79f0: 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a  rns a pointer.**
7a00: 20 74 6f 20 74 68 65 20 74 65 78 74 2e 20 20 4e   to the text.  N
7a10: 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20  ULL is returned 
7a20: 61 74 20 65 6e 64 20 6f 66 20 66 69 6c 65 2c 20  at end of file, 
7a30: 6f 72 20 69 66 20 6d 61 6c 6c 6f 63 28 29 0a 2a  or if malloc().*
7a40: 2a 20 66 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 54  * fails..**.** T
7a50: 68 65 20 69 6e 74 65 72 66 61 63 65 20 69 73 20  he interface is 
7a60: 6c 69 6b 65 20 22 72 65 61 64 6c 69 6e 65 22 20  like "readline" 
7a70: 62 75 74 20 6e 6f 20 63 6f 6d 6d 61 6e 64 2d 6c  but no command-l
7a80: 69 6e 65 20 65 64 69 74 69 6e 67 0a 2a 2a 20 69  ine editing.** i
7a90: 73 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 63 6f  s done..**.** co
7aa0: 70 69 65 64 20 66 72 6f 6d 20 73 68 65 6c 6c 2e  pied from shell.
7ab0: 63 20 66 72 6f 6d 20 27 2e 69 6d 70 6f 72 74 27  c from '.import'
7ac0: 20 63 6f 6d 6d 61 6e 64 0a 2a 2f 0a 73 74 61 74   command.*/.stat
7ad0: 69 63 20 63 68 61 72 20 2a 6c 6f 63 61 6c 5f 67  ic char *local_g
7ae0: 65 74 6c 69 6e 65 28 63 68 61 72 20 2a 7a 50 72  etline(char *zPr
7af0: 6f 6d 70 74 2c 20 46 49 4c 45 20 2a 69 6e 29 7b  ompt, FILE *in){
7b00: 0a 20 20 63 68 61 72 20 2a 7a 4c 69 6e 65 3b 0a  .  char *zLine;.
7b10: 20 20 69 6e 74 20 6e 4c 69 6e 65 3b 0a 20 20 69    int nLine;.  i
7b20: 6e 74 20 6e 3b 0a 20 20 69 6e 74 20 65 6f 6c 3b  nt n;.  int eol;
7b30: 0a 0a 20 20 6e 4c 69 6e 65 20 3d 20 31 30 30 3b  ..  nLine = 100;
7b40: 0a 20 20 7a 4c 69 6e 65 20 3d 20 6d 61 6c 6c 6f  .  zLine = mallo
7b50: 63 28 20 6e 4c 69 6e 65 20 29 3b 0a 20 20 69 66  c( nLine );.  if
7b60: 28 20 7a 4c 69 6e 65 3d 3d 30 20 29 20 72 65 74  ( zLine==0 ) ret
7b70: 75 72 6e 20 30 3b 0a 20 20 6e 20 3d 20 30 3b 0a  urn 0;.  n = 0;.
7b80: 20 20 65 6f 6c 20 3d 20 30 3b 0a 20 20 77 68 69    eol = 0;.  whi
7b90: 6c 65 28 20 21 65 6f 6c 20 29 7b 0a 20 20 20 20  le( !eol ){.    
7ba0: 69 66 28 20 6e 2b 31 30 30 3e 6e 4c 69 6e 65 20  if( n+100>nLine 
7bb0: 29 7b 0a 20 20 20 20 20 20 6e 4c 69 6e 65 20 3d  ){.      nLine =
7bc0: 20 6e 4c 69 6e 65 2a 32 20 2b 20 31 30 30 3b 0a   nLine*2 + 100;.
7bd0: 20 20 20 20 20 20 7a 4c 69 6e 65 20 3d 20 72 65        zLine = re
7be0: 61 6c 6c 6f 63 28 7a 4c 69 6e 65 2c 20 6e 4c 69  alloc(zLine, nLi
7bf0: 6e 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  ne);.      if( z
7c00: 4c 69 6e 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  Line==0 ) return
7c10: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   0;.    }.    if
7c20: 28 20 66 67 65 74 73 28 26 7a 4c 69 6e 65 5b 6e  ( fgets(&zLine[n
7c30: 5d 2c 20 6e 4c 69 6e 65 20 2d 20 6e 2c 20 69 6e  ], nLine - n, in
7c40: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  )==0 ){.      if
7c50: 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( n==0 ){.      
7c60: 20 20 66 72 65 65 28 7a 4c 69 6e 65 29 3b 0a 20    free(zLine);. 
7c70: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b         return 0;
7c80: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a  .      }.      z
7c90: 4c 69 6e 65 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20  Line[n] = 0;.   
7ca0: 20 20 20 65 6f 6c 20 3d 20 31 3b 0a 20 20 20 20     eol = 1;.    
7cb0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
7cc0: 20 20 20 77 68 69 6c 65 28 20 7a 4c 69 6e 65 5b     while( zLine[
7cd0: 6e 5d 20 29 7b 20 6e 2b 2b 3b 20 7d 0a 20 20 20  n] ){ n++; }.   
7ce0: 20 69 66 28 20 6e 3e 30 20 26 26 20 7a 4c 69 6e   if( n>0 && zLin
7cf0: 65 5b 6e 2d 31 5d 3d 3d 27 5c 6e 27 20 29 7b 0a  e[n-1]=='\n' ){.
7d00: 20 20 20 20 20 20 6e 2d 2d 3b 0a 20 20 20 20 20        n--;.     
7d10: 20 7a 4c 69 6e 65 5b 6e 5d 20 3d 20 30 3b 0a 20   zLine[n] = 0;. 
7d20: 20 20 20 20 20 65 6f 6c 20 3d 20 31 3b 0a 20 20       eol = 1;.  
7d30: 20 20 7d 0a 20 20 7d 0a 20 20 7a 4c 69 6e 65 20    }.  }.  zLine 
7d40: 3d 20 72 65 61 6c 6c 6f 63 28 20 7a 4c 69 6e 65  = realloc( zLine
7d50: 2c 20 6e 2b 31 20 29 3b 0a 20 20 72 65 74 75 72  , n+1 );.  retur
7d60: 6e 20 7a 4c 69 6e 65 3b 0a 7d 0a 0a 0a 2f 2a 0a  n zLine;.}.../*.
7d70: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
7d80: 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   is part of the 
7d90: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
7da0: 66 20 74 68 65 20 63 6f 6d 6d 61 6e 64 3a 0a 2a  f the command:.*
7db0: 2a 0a 2a 2a 20 20 20 24 64 62 20 74 72 61 6e 73  *.**   $db trans
7dc0: 61 63 74 69 6f 6e 20 5b 2d 64 65 66 65 72 72 65  action [-deferre
7dd0: 64 7c 2d 69 6d 6d 65 64 69 61 74 65 7c 2d 65 78  d|-immediate|-ex
7de0: 63 6c 75 73 69 76 65 5d 20 53 43 52 49 50 54 0a  clusive] SCRIPT.
7df0: 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 69 6e 76 6f  **.** It is invo
7e00: 6b 65 64 20 61 66 74 65 72 20 65 76 61 6c 75 61  ked after evalua
7e10: 74 69 6e 67 20 74 68 65 20 73 63 72 69 70 74 20  ting the script 
7e20: 53 43 52 49 50 54 20 74 6f 20 63 6f 6d 6d 69 74  SCRIPT to commit
7e30: 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20   or rollback.** 
7e40: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
7e50: 6f 72 20 73 61 76 65 70 6f 69 6e 74 20 6f 70 65  or savepoint ope
7e60: 6e 65 64 20 62 79 20 74 68 65 20 5b 74 72 61 6e  ned by the [tran
7e70: 73 61 63 74 69 6f 6e 5d 20 63 6f 6d 6d 61 6e 64  saction] command
7e80: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
7e90: 44 62 54 72 61 6e 73 50 6f 73 74 43 6d 64 28 0a  DbTransPostCmd(.
7ea0: 20 20 43 6c 69 65 6e 74 44 61 74 61 20 64 61 74    ClientData dat
7eb0: 61 5b 5d 2c 20 20 20 20 20 20 20 20 20 20 20 20  a[],            
7ec0: 20 20 20 20 20 20 20 2f 2a 20 64 61 74 61 5b 30         /* data[0
7ed0: 5d 20 69 73 20 74 68 65 20 53 71 6c 69 74 65 33  ] is the Sqlite3
7ee0: 44 62 2a 20 66 6f 72 20 24 64 62 20 2a 2f 0a 20  Db* for $db */. 
7ef0: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
7f00: 65 72 70 2c 20 20 20 20 20 20 20 20 20 20 20 20  erp,            
7f10: 20 20 20 20 20 20 2f 2a 20 54 63 6c 20 69 6e 74        /* Tcl int
7f20: 65 72 70 72 65 74 65 72 20 2a 2f 0a 20 20 69 6e  erpreter */.  in
7f30: 74 20 72 65 73 75 6c 74 20 20 20 20 20 20 20 20  t result        
7f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f50: 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 6f 66 20     /* Result of 
7f60: 65 76 61 6c 75 61 74 69 6e 67 20 53 43 52 49 50  evaluating SCRIP
7f70: 54 20 2a 2f 0a 29 7b 0a 20 20 73 74 61 74 69 63  T */.){.  static
7f80: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 45   const char *azE
7f90: 6e 64 5b 5d 20 3d 20 7b 0a 20 20 20 20 22 52 45  nd[] = {.    "RE
7fa0: 4c 45 41 53 45 20 5f 74 63 6c 5f 74 72 61 6e 73  LEASE _tcl_trans
7fb0: 61 63 74 69 6f 6e 22 2c 20 20 20 20 20 20 20 20  action",        
7fc0: 2f 2a 20 72 63 3d 3d 54 43 4c 5f 45 52 52 4f 52  /* rc==TCL_ERROR
7fd0: 2c 20 6e 54 72 61 6e 73 61 63 74 69 6f 6e 21 3d  , nTransaction!=
7fe0: 30 20 2a 2f 0a 20 20 20 20 22 43 4f 4d 4d 49 54  0 */.    "COMMIT
7ff0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
8000: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 72              /* r
8010: 63 21 3d 54 43 4c 5f 45 52 52 4f 52 2c 20 6e 54  c!=TCL_ERROR, nT
8020: 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 30 20 2a 2f  ransaction==0 */
8030: 0a 20 20 20 20 22 52 4f 4c 4c 42 41 43 4b 20 54  .    "ROLLBACK T
8040: 4f 20 5f 74 63 6c 5f 74 72 61 6e 73 61 63 74 69  O _tcl_transacti
8050: 6f 6e 20 3b 20 52 45 4c 45 41 53 45 20 5f 74 63  on ; RELEASE _tc
8060: 6c 5f 74 72 61 6e 73 61 63 74 69 6f 6e 22 2c 0a  l_transaction",.
8070: 20 20 20 20 22 52 4f 4c 4c 42 41 43 4b 22 20 20      "ROLLBACK"  
8080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8090: 20 20 20 20 20 20 20 2f 2a 20 72 63 3d 3d 54 43         /* rc==TC
80a0: 4c 5f 45 52 52 4f 52 2c 20 6e 54 72 61 6e 73 61  L_ERROR, nTransa
80b0: 63 74 69 6f 6e 3d 3d 30 20 2a 2f 0a 20 20 7d 3b  ction==0 */.  };
80c0: 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62  .  SqliteDb *pDb
80d0: 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 64 61   = (SqliteDb*)da
80e0: 74 61 5b 30 5d 3b 0a 20 20 69 6e 74 20 72 63 20  ta[0];.  int rc 
80f0: 3d 20 72 65 73 75 6c 74 3b 0a 20 20 63 6f 6e 73  = result;.  cons
8100: 74 20 63 68 61 72 20 2a 7a 45 6e 64 3b 0a 0a 20  t char *zEnd;.. 
8110: 20 70 44 62 2d 3e 6e 54 72 61 6e 73 61 63 74 69   pDb->nTransacti
8120: 6f 6e 2d 2d 3b 0a 20 20 7a 45 6e 64 20 3d 20 61  on--;.  zEnd = a
8130: 7a 45 6e 64 5b 28 72 63 3d 3d 54 43 4c 5f 45 52  zEnd[(rc==TCL_ER
8140: 52 4f 52 29 2a 32 20 2b 20 28 70 44 62 2d 3e 6e  ROR)*2 + (pDb->n
8150: 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 30 29 5d  Transaction==0)]
8160: 3b 0a 0a 20 20 70 44 62 2d 3e 64 69 73 61 62 6c  ;..  pDb->disabl
8170: 65 41 75 74 68 2b 2b 3b 0a 20 20 69 66 28 20 73  eAuth++;.  if( s
8180: 71 6c 69 74 65 33 5f 65 78 65 63 28 70 44 62 2d  qlite3_exec(pDb-
8190: 3e 64 62 2c 20 7a 45 6e 64 2c 20 30 2c 20 30 2c  >db, zEnd, 0, 0,
81a0: 20 30 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20   0) ){.      /* 
81b0: 54 68 69 73 20 69 73 20 61 20 74 72 69 63 6b 79  This is a tricky
81c0: 20 73 63 65 6e 61 72 69 6f 20 74 6f 20 68 61 6e   scenario to han
81d0: 64 6c 65 2e 20 54 68 65 20 6d 6f 73 74 20 6c 69  dle. The most li
81e0: 6b 65 6c 79 20 63 61 75 73 65 20 6f 66 20 61 6e  kely cause of an
81f0: 0a 20 20 20 20 20 20 2a 2a 20 65 72 72 6f 72 20  .      ** error 
8200: 69 73 20 74 68 61 74 20 74 68 65 20 65 78 65 63  is that the exec
8210: 28 29 20 61 62 6f 76 65 20 77 61 73 20 61 6e 20  () above was an 
8220: 61 74 74 65 6d 70 74 20 74 6f 20 63 6f 6d 6d 69  attempt to commi
8230: 74 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20  t the .      ** 
8240: 74 6f 70 2d 6c 65 76 65 6c 20 74 72 61 6e 73 61  top-level transa
8250: 63 74 69 6f 6e 20 74 68 61 74 20 72 65 74 75 72  ction that retur
8260: 6e 65 64 20 53 51 4c 49 54 45 5f 42 55 53 59 2e  ned SQLITE_BUSY.
8270: 20 4f 72 2c 20 6c 65 73 73 20 6c 69 6b 65 6c 79   Or, less likely
8280: 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20  ,.      ** that 
8290: 61 6e 20 49 4f 2d 65 72 72 6f 72 20 68 61 73 20  an IO-error has 
82a0: 6f 63 63 75 72 65 64 2e 20 49 6e 20 65 69 74 68  occured. In eith
82b0: 65 72 20 63 61 73 65 2c 20 74 68 72 6f 77 20 61  er case, throw a
82c0: 20 54 63 6c 20 65 78 63 65 70 74 69 6f 6e 0a 20   Tcl exception. 
82d0: 20 20 20 20 20 2a 2a 20 61 6e 64 20 74 72 79 20       ** and try 
82e0: 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20  to rollback the 
82f0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20  transaction..   
8300: 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 42     **.      ** B
8310: 75 74 20 69 74 20 63 6f 75 6c 64 20 61 6c 73 6f  ut it could also
8320: 20 62 65 20 74 68 61 74 20 74 68 65 20 75 73 65   be that the use
8330: 72 20 65 78 65 63 75 74 65 64 20 6f 6e 65 20 6f  r executed one o
8340: 72 20 6d 6f 72 65 20 42 45 47 49 4e 2c 20 0a 20  r more BEGIN, . 
8350: 20 20 20 20 20 2a 2a 20 43 4f 4d 4d 49 54 2c 20       ** COMMIT, 
8360: 53 41 56 45 50 4f 49 4e 54 2c 20 52 45 4c 45 41  SAVEPOINT, RELEA
8370: 53 45 20 6f 72 20 52 4f 4c 4c 42 41 43 4b 20 63  SE or ROLLBACK c
8380: 6f 6d 6d 61 6e 64 73 20 74 68 61 74 20 61 72 65  ommands that are
8390: 20 63 6f 6e 66 75 73 69 6e 67 0a 20 20 20 20 20   confusing.     
83a0: 20 2a 2a 20 74 68 69 73 20 6d 65 74 68 6f 64 27   ** this method'
83b0: 73 20 6c 6f 67 69 63 2e 20 4e 6f 74 20 63 6c 65  s logic. Not cle
83c0: 61 72 20 68 6f 77 20 74 68 69 73 20 77 6f 75 6c  ar how this woul
83d0: 64 20 62 65 20 62 65 73 74 20 68 61 6e 64 6c 65  d be best handle
83e0: 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  d..      */.    
83f0: 69 66 28 20 72 63 21 3d 54 43 4c 5f 45 52 52 4f  if( rc!=TCL_ERRO
8400: 52 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41  R ){.      Tcl_A
8410: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
8420: 72 70 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  rp, sqlite3_errm
8430: 73 67 28 70 44 62 2d 3e 64 62 29 2c 20 30 29 3b  sg(pDb->db), 0);
8440: 0a 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f  .      rc = TCL_
8450: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
8460: 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 44   sqlite3_exec(pD
8470: 62 2d 3e 64 62 2c 20 22 52 4f 4c 4c 42 41 43 4b  b->db, "ROLLBACK
8480: 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 7d  ", 0, 0, 0);.  }
8490: 0a 20 20 70 44 62 2d 3e 64 69 73 61 62 6c 65 41  .  pDb->disableA
84a0: 75 74 68 2d 2d 3b 0a 0a 20 20 72 65 74 75 72 6e  uth--;..  return
84b0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65   rc;.}../*.** Se
84c0: 61 72 63 68 20 74 68 65 20 63 61 63 68 65 20 66  arch the cache f
84d0: 6f 72 20 61 20 70 72 65 70 61 72 65 64 2d 73 74  or a prepared-st
84e0: 61 74 65 6d 65 6e 74 20 6f 62 6a 65 63 74 20 74  atement object t
84f0: 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74  hat implements t
8500: 68 65 0a 2a 2a 20 66 69 72 73 74 20 53 51 4c 20  he.** first SQL 
8510: 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 74 68 65  statement in the
8520: 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20   buffer pointed 
8530: 74 6f 20 62 79 20 70 61 72 61 6d 65 74 65 72 20  to by parameter 
8540: 7a 49 6e 2e 20 49 66 0a 2a 2a 20 6e 6f 20 73 75  zIn. If.** no su
8550: 63 68 20 70 72 65 70 61 72 65 64 2d 73 74 61 74  ch prepared-stat
8560: 65 6d 65 6e 74 20 63 61 6e 20 62 65 20 66 6f 75  ement can be fou
8570: 6e 64 2c 20 61 6c 6c 6f 63 61 74 65 20 61 6e 64  nd, allocate and
8580: 20 70 72 65 70 61 72 65 20 61 20 6e 65 77 0a 2a   prepare a new.*
8590: 2a 20 6f 6e 65 2e 20 49 6e 20 65 69 74 68 65 72  * one. In either
85a0: 20 63 61 73 65 2c 20 62 69 6e 64 20 74 68 65 20   case, bind the 
85b0: 63 75 72 72 65 6e 74 20 76 61 6c 75 65 73 20 6f  current values o
85c0: 66 20 74 68 65 20 72 65 6c 65 76 61 6e 74 20 54  f the relevant T
85d0: 63 6c 0a 2a 2a 20 76 61 72 69 61 62 6c 65 73 20  cl.** variables 
85e0: 74 6f 20 61 6e 79 20 24 76 61 72 2c 20 3a 76 61  to any $var, :va
85f0: 72 20 6f 72 20 40 76 61 72 20 76 61 72 69 61 62  r or @var variab
8600: 6c 65 73 20 69 6e 20 74 68 65 20 73 74 61 74 65  les in the state
8610: 6d 65 6e 74 2e 20 42 65 66 6f 72 65 0a 2a 2a 20  ment. Before.** 
8620: 72 65 74 75 72 6e 69 6e 67 2c 20 73 65 74 20 2a  returning, set *
8630: 70 70 50 72 65 53 74 6d 74 20 74 6f 20 70 6f 69  ppPreStmt to poi
8640: 6e 74 20 74 6f 20 74 68 65 20 70 72 65 70 61 72  nt to the prepar
8650: 65 64 2d 73 74 61 74 65 6d 65 6e 74 20 6f 62 6a  ed-statement obj
8660: 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 4f 75 74 70 75  ect..**.** Outpu
8670: 74 20 70 61 72 61 6d 65 74 65 72 20 2a 70 7a 4f  t parameter *pzO
8680: 75 74 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69  ut is set to poi
8690: 6e 74 20 74 6f 20 74 68 65 20 6e 65 78 74 20 53  nt to the next S
86a0: 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 0a  QL statement in.
86b0: 2a 2a 20 62 75 66 66 65 72 20 7a 49 6e 2c 20 6f  ** buffer zIn, o
86c0: 72 20 74 6f 20 74 68 65 20 27 5c 30 27 20 62 79  r to the '\0' by
86d0: 74 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  te at the end of
86e0: 20 7a 49 6e 20 69 66 20 74 68 65 72 65 20 69 73   zIn if there is
86f0: 20 6e 6f 0a 2a 2a 20 6e 65 78 74 20 73 74 61 74   no.** next stat
8700: 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ement..**.** If 
8710: 73 75 63 63 65 73 73 66 75 6c 2c 20 54 43 4c 5f  successful, TCL_
8720: 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  OK is returned. 
8730: 4f 74 68 65 72 77 69 73 65 2c 20 54 43 4c 5f 45  Otherwise, TCL_E
8740: 52 52 4f 52 20 69 73 20 72 65 74 75 72 6e 65 64  RROR is returned
8750: 0a 2a 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f 72  .** and an error
8760: 20 6d 65 73 73 61 67 65 20 6c 6f 61 64 65 64 20   message loaded 
8770: 69 6e 74 6f 20 69 6e 74 65 72 70 72 65 74 65 72  into interpreter
8780: 20 70 44 62 2d 3e 69 6e 74 65 72 70 2e 0a 2a 2f   pDb->interp..*/
8790: 0a 73 74 61 74 69 63 20 69 6e 74 20 64 62 50 72  .static int dbPr
87a0: 65 70 61 72 65 41 6e 64 42 69 6e 64 28 0a 20 20  epareAndBind(.  
87b0: 53 71 6c 69 74 65 44 62 20 2a 70 44 62 2c 20 20  SqliteDb *pDb,  
87c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
87d0: 2f 2a 20 44 61 74 61 62 61 73 65 20 6f 62 6a 65  /* Database obje
87e0: 63 74 20 2a 2f 0a 20 20 63 68 61 72 20 63 6f 6e  ct */.  char con
87f0: 73 74 20 2a 7a 49 6e 2c 20 20 20 20 20 20 20 20  st *zIn,        
8800: 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 20 74          /* SQL t
8810: 6f 20 63 6f 6d 70 69 6c 65 20 2a 2f 0a 20 20 63  o compile */.  c
8820: 68 61 72 20 63 6f 6e 73 74 20 2a 2a 70 7a 4f 75  har const **pzOu
8830: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  t,             /
8840: 2a 20 4f 55 54 3a 20 50 6f 69 6e 74 65 72 20 74  * OUT: Pointer t
8850: 6f 20 6e 65 78 74 20 53 51 4c 20 73 74 61 74 65  o next SQL state
8860: 6d 65 6e 74 20 2a 2f 0a 20 20 53 71 6c 50 72 65  ment */.  SqlPre
8870: 70 61 72 65 64 53 74 6d 74 20 2a 2a 70 70 50 72  paredStmt **ppPr
8880: 65 53 74 6d 74 20 20 20 20 20 2f 2a 20 4f 55 54  eStmt     /* OUT
8890: 3a 20 4f 62 6a 65 63 74 20 75 73 65 64 20 74 6f  : Object used to
88a0: 20 63 61 63 68 65 20 73 74 61 74 65 6d 65 6e 74   cache statement
88b0: 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63   */.){.  const c
88c0: 68 61 72 20 2a 7a 53 71 6c 20 3d 20 7a 49 6e 3b  har *zSql = zIn;
88d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
88e0: 74 65 72 20 74 6f 20 66 69 72 73 74 20 53 51 4c  ter to first SQL
88f0: 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 7a 49   statement in zI
8900: 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73  n */.  sqlite3_s
8910: 74 6d 74 20 2a 70 53 74 6d 74 3b 20 20 20 20 20  tmt *pStmt;     
8920: 20 20 20 20 20 20 20 2f 2a 20 50 72 65 70 61 72         /* Prepar
8930: 65 64 20 73 74 61 74 65 6d 65 6e 74 20 6f 62 6a  ed statement obj
8940: 65 63 74 20 2a 2f 0a 20 20 53 71 6c 50 72 65 70  ect */.  SqlPrep
8950: 61 72 65 64 53 74 6d 74 20 2a 70 50 72 65 53 74  aredStmt *pPreSt
8960: 6d 74 3b 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e  mt;      /* Poin
8970: 74 65 72 20 74 6f 20 63 61 63 68 65 64 20 73 74  ter to cached st
8980: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  atement */.  int
8990: 20 6e 53 71 6c 3b 20 20 20 20 20 20 20 20 20 20   nSql;          
89a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
89b0: 4c 65 6e 67 74 68 20 6f 66 20 7a 53 71 6c 20 69  Length of zSql i
89c0: 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74  n bytes */.  int
89d0: 20 6e 56 61 72 3b 20 20 20 20 20 20 20 20 20 20   nVar;          
89e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
89f0: 4e 75 6d 62 65 72 20 6f 66 20 76 61 72 69 61 62  Number of variab
8a00: 6c 65 73 20 69 6e 20 73 74 61 74 65 6d 65 6e 74  les in statement
8a10: 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 6d 20   */.  int iParm 
8a20: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
8a30: 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 66 72        /* Next fr
8a40: 65 65 20 65 6e 74 72 79 20 69 6e 20 61 70 50 61  ee entry in apPa
8a50: 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 0a 20  rm */.  int i;. 
8a60: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
8a70: 65 72 70 20 3d 20 70 44 62 2d 3e 69 6e 74 65 72  erp = pDb->inter
8a80: 70 3b 0a 0a 20 20 2a 70 70 50 72 65 53 74 6d 74  p;..  *ppPreStmt
8a90: 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 54 72 69 6d   = 0;..  /* Trim
8aa0: 20 73 70 61 63 65 73 20 66 72 6f 6d 20 74 68 65   spaces from the
8ab0: 20 73 74 61 72 74 20 6f 66 20 7a 53 71 6c 20 61   start of zSql a
8ac0: 6e 64 20 63 61 6c 63 75 6c 61 74 65 20 74 68 65  nd calculate the
8ad0: 20 72 65 6d 61 69 6e 69 6e 67 20 6c 65 6e 67 74   remaining lengt
8ae0: 68 2e 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 69  h. */.  while( i
8af0: 73 73 70 61 63 65 28 7a 53 71 6c 5b 30 5d 29 20  sspace(zSql[0]) 
8b00: 29 7b 20 7a 53 71 6c 2b 2b 3b 20 7d 0a 20 20 6e  ){ zSql++; }.  n
8b10: 53 71 6c 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a  Sql = strlen30(z
8b20: 53 71 6c 29 3b 0a 0a 20 20 66 6f 72 28 70 50 72  Sql);..  for(pPr
8b30: 65 53 74 6d 74 20 3d 20 70 44 62 2d 3e 73 74 6d  eStmt = pDb->stm
8b40: 74 4c 69 73 74 3b 20 70 50 72 65 53 74 6d 74 3b  tList; pPreStmt;
8b50: 20 70 50 72 65 53 74 6d 74 3d 70 50 72 65 53 74   pPreStmt=pPreSt
8b60: 6d 74 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  mt->pNext){.    
8b70: 69 6e 74 20 6e 20 3d 20 70 50 72 65 53 74 6d 74  int n = pPreStmt
8b80: 2d 3e 6e 53 71 6c 3b 0a 20 20 20 20 69 66 28 20  ->nSql;.    if( 
8b90: 6e 53 71 6c 3e 3d 6e 20 0a 20 20 20 20 20 20 20  nSql>=n .       
8ba0: 20 26 26 20 6d 65 6d 63 6d 70 28 70 50 72 65 53   && memcmp(pPreS
8bb0: 74 6d 74 2d 3e 7a 53 71 6c 2c 20 7a 53 71 6c 2c  tmt->zSql, zSql,
8bc0: 20 6e 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 26   n)==0.        &
8bd0: 26 20 28 7a 53 71 6c 5b 6e 5d 3d 3d 30 20 7c 7c  & (zSql[n]==0 ||
8be0: 20 7a 53 71 6c 5b 6e 2d 31 5d 3d 3d 27 3b 27 29   zSql[n-1]==';')
8bf0: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 70 53  .    ){.      pS
8c00: 74 6d 74 20 3d 20 70 50 72 65 53 74 6d 74 2d 3e  tmt = pPreStmt->
8c10: 70 53 74 6d 74 3b 0a 20 20 20 20 20 20 2a 70 7a  pStmt;.      *pz
8c20: 4f 75 74 20 3d 20 26 7a 53 71 6c 5b 70 50 72 65  Out = &zSql[pPre
8c30: 53 74 6d 74 2d 3e 6e 53 71 6c 5d 3b 0a 0a 20 20  Stmt->nSql];..  
8c40: 20 20 20 20 2f 2a 20 57 68 65 6e 20 61 20 70 72      /* When a pr
8c50: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
8c60: 20 69 73 20 66 6f 75 6e 64 2c 20 75 6e 6c 69 6e   is found, unlin
8c70: 6b 20 69 74 20 66 72 6f 6d 20 74 68 65 0a 20 20  k it from the.  
8c80: 20 20 20 20 2a 2a 20 63 61 63 68 65 20 6c 69 73      ** cache lis
8c90: 74 2e 20 20 49 74 20 77 69 6c 6c 20 6c 61 74 65  t.  It will late
8ca0: 72 20 62 65 20 61 64 64 65 64 20 62 61 63 6b 20  r be added back 
8cb0: 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  to the beginning
8cc0: 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  .      ** of the
8cd0: 20 63 61 63 68 65 20 6c 69 73 74 20 69 6e 20 6f   cache list in o
8ce0: 72 64 65 72 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  rder to implemen
8cf0: 74 20 4c 52 55 20 72 65 70 6c 61 63 65 6d 65 6e  t LRU replacemen
8d00: 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  t..      */.    
8d10: 20 20 69 66 28 20 70 50 72 65 53 74 6d 74 2d 3e    if( pPreStmt->
8d20: 70 50 72 65 76 20 29 7b 0a 20 20 20 20 20 20 20  pPrev ){.       
8d30: 20 70 50 72 65 53 74 6d 74 2d 3e 70 50 72 65 76   pPreStmt->pPrev
8d40: 2d 3e 70 4e 65 78 74 20 3d 20 70 50 72 65 53 74  ->pNext = pPreSt
8d50: 6d 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  mt->pNext;.     
8d60: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
8d70: 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74 20 3d 20  pDb->stmtList = 
8d80: 70 50 72 65 53 74 6d 74 2d 3e 70 4e 65 78 74 3b  pPreStmt->pNext;
8d90: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
8da0: 66 28 20 70 50 72 65 53 74 6d 74 2d 3e 70 4e 65  f( pPreStmt->pNe
8db0: 78 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50  xt ){.        pP
8dc0: 72 65 53 74 6d 74 2d 3e 70 4e 65 78 74 2d 3e 70  reStmt->pNext->p
8dd0: 50 72 65 76 20 3d 20 70 50 72 65 53 74 6d 74 2d  Prev = pPreStmt-
8de0: 3e 70 50 72 65 76 3b 0a 20 20 20 20 20 20 7d 65  >pPrev;.      }e
8df0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 44 62  lse{.        pDb
8e00: 2d 3e 73 74 6d 74 4c 61 73 74 20 3d 20 70 50 72  ->stmtLast = pPr
8e10: 65 53 74 6d 74 2d 3e 70 50 72 65 76 3b 0a 20 20  eStmt->pPrev;.  
8e20: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 44 62 2d      }.      pDb-
8e30: 3e 6e 53 74 6d 74 2d 2d 3b 0a 20 20 20 20 20 20  >nStmt--;.      
8e40: 6e 56 61 72 20 3d 20 73 71 6c 69 74 65 33 5f 62  nVar = sqlite3_b
8e50: 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 63 6f  ind_parameter_co
8e60: 75 6e 74 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  unt(pStmt);.    
8e70: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
8e80: 20 7d 0a 20 20 0a 20 20 2f 2a 20 49 66 20 6e 6f   }.  .  /* If no
8e90: 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
8ea0: 65 6e 74 20 77 61 73 20 66 6f 75 6e 64 2e 20 43  ent was found. C
8eb0: 6f 6d 70 69 6c 65 20 74 68 65 20 53 51 4c 20 74  ompile the SQL t
8ec0: 65 78 74 2e 20 41 6c 73 6f 20 61 6c 6c 6f 63 61  ext. Also alloca
8ed0: 74 65 0a 20 20 2a 2a 20 61 20 6e 65 77 20 53 71  te.  ** a new Sq
8ee0: 6c 50 72 65 70 61 72 65 64 53 74 6d 74 20 73 74  lPreparedStmt st
8ef0: 72 75 63 74 75 72 65 2e 20 20 2a 2f 0a 20 20 69  ructure.  */.  i
8f00: 66 28 20 70 50 72 65 53 74 6d 74 3d 3d 30 20 29  f( pPreStmt==0 )
8f10: 7b 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65 3b  {.    int nByte;
8f20: 0a 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45  ..    if( SQLITE
8f30: 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 5f 70 72 65  _OK!=sqlite3_pre
8f40: 70 61 72 65 5f 76 32 28 70 44 62 2d 3e 64 62 2c  pare_v2(pDb->db,
8f50: 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d   zSql, -1, &pStm
8f60: 74 2c 20 70 7a 4f 75 74 29 20 29 7b 0a 20 20 20  t, pzOut) ){.   
8f70: 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73     Tcl_SetObjRes
8f80: 75 6c 74 28 69 6e 74 65 72 70 2c 20 64 62 54 65  ult(interp, dbTe
8f90: 78 74 54 6f 4f 62 6a 28 73 71 6c 69 74 65 33 5f  xtToObj(sqlite3_
8fa0: 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62 29 29  errmsg(pDb->db))
8fb0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
8fc0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
8fd0: 0a 20 20 20 20 69 66 28 20 70 53 74 6d 74 3d 3d  .    if( pStmt==
8fe0: 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 53  0 ){.      if( S
8ff0: 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65  QLITE_OK!=sqlite
9000: 33 5f 65 72 72 63 6f 64 65 28 70 44 62 2d 3e 64  3_errcode(pDb->d
9010: 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  b) ){.        /*
9020: 20 41 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20   A compile-time 
9030: 65 72 72 6f 72 20 69 6e 20 74 68 65 20 73 74 61  error in the sta
9040: 74 65 6d 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 20  tement. */.     
9050: 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73     Tcl_SetObjRes
9060: 75 6c 74 28 69 6e 74 65 72 70 2c 20 64 62 54 65  ult(interp, dbTe
9070: 78 74 54 6f 4f 62 6a 28 73 71 6c 69 74 65 33 5f  xtToObj(sqlite3_
9080: 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62 29 29  errmsg(pDb->db))
9090: 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
90a0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
90b0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
90c0: 20 20 2f 2a 20 54 68 65 20 73 74 61 74 65 6d 65    /* The stateme
90d0: 6e 74 20 77 61 73 20 61 20 6e 6f 2d 6f 70 2e 20  nt was a no-op. 
90e0: 20 43 6f 6e 74 69 6e 75 65 20 74 6f 20 74 68 65   Continue to the
90f0: 20 6e 65 78 74 20 73 74 61 74 65 6d 65 6e 74 0a   next statement.
9100: 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68          ** in th
9110: 65 20 53 51 4c 20 73 74 72 69 6e 67 2e 0a 20 20  e SQL string..  
9120: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
9130: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
9140: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
9150: 20 20 20 61 73 73 65 72 74 28 20 70 50 72 65 53     assert( pPreS
9160: 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20 6e 56  tmt==0 );.    nV
9170: 61 72 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e  ar = sqlite3_bin
9180: 64 5f 70 61 72 61 6d 65 74 65 72 5f 63 6f 75 6e  d_parameter_coun
9190: 74 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 6e 42  t(pStmt);.    nB
91a0: 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 53 71 6c  yte = sizeof(Sql
91b0: 50 72 65 70 61 72 65 64 53 74 6d 74 29 20 2b 20  PreparedStmt) + 
91c0: 6e 56 61 72 2a 73 69 7a 65 6f 66 28 54 63 6c 5f  nVar*sizeof(Tcl_
91d0: 4f 62 6a 20 2a 29 3b 0a 20 20 20 20 70 50 72 65  Obj *);.    pPre
91e0: 53 74 6d 74 20 3d 20 28 53 71 6c 50 72 65 70 61  Stmt = (SqlPrepa
91f0: 72 65 64 53 74 6d 74 2a 29 54 63 6c 5f 41 6c 6c  redStmt*)Tcl_All
9200: 6f 63 28 6e 42 79 74 65 29 3b 0a 20 20 20 20 6d  oc(nByte);.    m
9210: 65 6d 73 65 74 28 70 50 72 65 53 74 6d 74 2c 20  emset(pPreStmt, 
9220: 30 2c 20 6e 42 79 74 65 29 3b 0a 0a 20 20 20 20  0, nByte);..    
9230: 70 50 72 65 53 74 6d 74 2d 3e 70 53 74 6d 74 20  pPreStmt->pStmt 
9240: 3d 20 70 53 74 6d 74 3b 0a 20 20 20 20 70 50 72  = pStmt;.    pPr
9250: 65 53 74 6d 74 2d 3e 6e 53 71 6c 20 3d 20 28 2a  eStmt->nSql = (*
9260: 70 7a 4f 75 74 20 2d 20 7a 53 71 6c 29 3b 0a 20  pzOut - zSql);. 
9270: 20 20 20 70 50 72 65 53 74 6d 74 2d 3e 7a 53 71     pPreStmt->zSq
9280: 6c 20 3d 20 73 71 6c 69 74 65 33 5f 73 71 6c 28  l = sqlite3_sql(
9290: 70 53 74 6d 74 29 3b 0a 20 20 20 20 70 50 72 65  pStmt);.    pPre
92a0: 53 74 6d 74 2d 3e 61 70 50 61 72 6d 20 3d 20 28  Stmt->apParm = (
92b0: 54 63 6c 5f 4f 62 6a 20 2a 2a 29 26 70 50 72 65  Tcl_Obj **)&pPre
92c0: 53 74 6d 74 5b 31 5d 3b 0a 20 20 7d 0a 20 20 61  Stmt[1];.  }.  a
92d0: 73 73 65 72 74 28 20 70 50 72 65 53 74 6d 74 20  ssert( pPreStmt 
92e0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 74 72  );.  assert( str
92f0: 6c 65 6e 33 30 28 70 50 72 65 53 74 6d 74 2d 3e  len30(pPreStmt->
9300: 7a 53 71 6c 29 3d 3d 70 50 72 65 53 74 6d 74 2d  zSql)==pPreStmt-
9310: 3e 6e 53 71 6c 20 29 3b 0a 20 20 61 73 73 65 72  >nSql );.  asser
9320: 74 28 20 30 3d 3d 6d 65 6d 63 6d 70 28 70 50 72  t( 0==memcmp(pPr
9330: 65 53 74 6d 74 2d 3e 7a 53 71 6c 2c 20 7a 53 71  eStmt->zSql, zSq
9340: 6c 2c 20 70 50 72 65 53 74 6d 74 2d 3e 6e 53 71  l, pPreStmt->nSq
9350: 6c 29 20 29 3b 0a 0a 20 20 2f 2a 20 42 69 6e 64  l) );..  /* Bind
9360: 20 76 61 6c 75 65 73 20 74 6f 20 70 61 72 61 6d   values to param
9370: 65 74 65 72 73 20 74 68 61 74 20 62 65 67 69 6e  eters that begin
9380: 20 77 69 74 68 20 24 20 6f 72 20 3a 20 2a 2f 20   with $ or : */ 
9390: 20 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d   .  for(i=1; i<=
93a0: 6e 56 61 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nVar; i++){.    
93b0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 61 72  const char *zVar
93c0: 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f   = sqlite3_bind_
93d0: 70 61 72 61 6d 65 74 65 72 5f 6e 61 6d 65 28 70  parameter_name(p
93e0: 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 69 66  Stmt, i);.    if
93f0: 28 20 7a 56 61 72 21 3d 30 20 26 26 20 28 7a 56  ( zVar!=0 && (zV
9400: 61 72 5b 30 5d 3d 3d 27 24 27 20 7c 7c 20 7a 56  ar[0]=='$' || zV
9410: 61 72 5b 30 5d 3d 3d 27 3a 27 20 7c 7c 20 7a 56  ar[0]==':' || zV
9420: 61 72 5b 30 5d 3d 3d 27 40 27 29 20 29 7b 0a 20  ar[0]=='@') ){. 
9430: 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 56       Tcl_Obj *pV
9440: 61 72 20 3d 20 54 63 6c 5f 47 65 74 56 61 72 32  ar = Tcl_GetVar2
9450: 45 78 28 69 6e 74 65 72 70 2c 20 26 7a 56 61 72  Ex(interp, &zVar
9460: 5b 31 5d 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  [1], 0, 0);.    
9470: 20 20 69 66 28 20 70 56 61 72 20 29 7b 0a 20 20    if( pVar ){.  
9480: 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20        int n;.   
9490: 20 20 20 20 20 75 38 20 2a 64 61 74 61 3b 0a 20       u8 *data;. 
94a0: 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
94b0: 72 20 2a 7a 54 79 70 65 20 3d 20 28 70 56 61 72  r *zType = (pVar
94c0: 2d 3e 74 79 70 65 50 74 72 20 3f 20 70 56 61 72  ->typePtr ? pVar
94d0: 2d 3e 74 79 70 65 50 74 72 2d 3e 6e 61 6d 65 20  ->typePtr->name 
94e0: 3a 20 22 22 29 3b 0a 20 20 20 20 20 20 20 20 63  : "");.        c
94f0: 68 61 72 20 63 20 3d 20 7a 54 79 70 65 5b 30 5d  har c = zType[0]
9500: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 56  ;.        if( zV
9510: 61 72 5b 30 5d 3d 3d 27 40 27 20 7c 7c 0a 20 20  ar[0]=='@' ||.  
9520: 20 20 20 20 20 20 20 20 20 28 63 3d 3d 27 62 27           (c=='b'
9530: 20 26 26 20 73 74 72 63 6d 70 28 7a 54 79 70 65   && strcmp(zType
9540: 2c 22 62 79 74 65 61 72 72 61 79 22 29 3d 3d 30  ,"bytearray")==0
9550: 20 26 26 20 70 56 61 72 2d 3e 62 79 74 65 73 3d   && pVar->bytes=
9560: 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  =0) ){.         
9570: 20 2f 2a 20 4c 6f 61 64 20 61 20 42 4c 4f 42 20   /* Load a BLOB 
9580: 74 79 70 65 20 69 66 20 74 68 65 20 54 63 6c 20  type if the Tcl 
9590: 76 61 72 69 61 62 6c 65 20 69 73 20 61 20 62 79  variable is a by
95a0: 74 65 61 72 72 61 79 20 61 6e 64 0a 20 20 20 20  tearray and.    
95b0: 20 20 20 20 20 20 2a 2a 20 69 74 20 68 61 73 20        ** it has 
95c0: 6e 6f 20 73 74 72 69 6e 67 20 72 65 70 72 65 73  no string repres
95d0: 65 6e 74 61 74 69 6f 6e 20 6f 72 20 74 68 65 20  entation or the 
95e0: 68 6f 73 74 0a 20 20 20 20 20 20 20 20 20 20 2a  host.          *
95f0: 2a 20 70 61 72 61 6d 65 74 65 72 20 6e 61 6d 65  * parameter name
9600: 20 62 65 67 69 6e 73 20 77 69 74 68 20 22 40 22   begins with "@"
9610: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 64  . */.          d
9620: 61 74 61 20 3d 20 54 63 6c 5f 47 65 74 42 79 74  ata = Tcl_GetByt
9630: 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 70 56  eArrayFromObj(pV
9640: 61 72 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 20  ar, &n);.       
9650: 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
9660: 62 6c 6f 62 28 70 53 74 6d 74 2c 20 69 2c 20 64  blob(pStmt, i, d
9670: 61 74 61 2c 20 6e 2c 20 53 51 4c 49 54 45 5f 53  ata, n, SQLITE_S
9680: 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 20 20  TATIC);.        
9690: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
96a0: 6e 74 28 70 56 61 72 29 3b 0a 20 20 20 20 20 20  nt(pVar);.      
96b0: 20 20 20 20 70 50 72 65 53 74 6d 74 2d 3e 61 70      pPreStmt->ap
96c0: 50 61 72 6d 5b 69 50 61 72 6d 2b 2b 5d 20 3d 20  Parm[iParm++] = 
96d0: 70 56 61 72 3b 0a 20 20 20 20 20 20 20 20 7d 65  pVar;.        }e
96e0: 6c 73 65 20 69 66 28 20 63 3d 3d 27 62 27 20 26  lse if( c=='b' &
96f0: 26 20 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22  & strcmp(zType,"
9700: 62 6f 6f 6c 65 61 6e 22 29 3d 3d 30 20 29 7b 0a  boolean")==0 ){.
9710: 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65            Tcl_Ge
9720: 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
9730: 72 70 2c 20 70 56 61 72 2c 20 26 6e 29 3b 0a 20  rp, pVar, &n);. 
9740: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
9750: 5f 62 69 6e 64 5f 69 6e 74 28 70 53 74 6d 74 2c  _bind_int(pStmt,
9760: 20 69 2c 20 6e 29 3b 0a 20 20 20 20 20 20 20 20   i, n);.        
9770: 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 64 27  }else if( c=='d'
9780: 20 26 26 20 73 74 72 63 6d 70 28 7a 54 79 70 65   && strcmp(zType
9790: 2c 22 64 6f 75 62 6c 65 22 29 3d 3d 30 20 29 7b  ,"double")==0 ){
97a0: 0a 20 20 20 20 20 20 20 20 20 20 64 6f 75 62 6c  .          doubl
97b0: 65 20 72 3b 0a 20 20 20 20 20 20 20 20 20 20 54  e r;.          T
97c0: 63 6c 5f 47 65 74 44 6f 75 62 6c 65 46 72 6f 6d  cl_GetDoubleFrom
97d0: 4f 62 6a 28 69 6e 74 65 72 70 2c 20 70 56 61 72  Obj(interp, pVar
97e0: 2c 20 26 72 29 3b 0a 20 20 20 20 20 20 20 20 20  , &r);.         
97f0: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 64 6f   sqlite3_bind_do
9800: 75 62 6c 65 28 70 53 74 6d 74 2c 20 69 2c 20 72  uble(pStmt, i, r
9810: 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
9820: 20 69 66 28 20 28 63 3d 3d 27 77 27 20 26 26 20   if( (c=='w' && 
9830: 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22 77 69  strcmp(zType,"wi
9840: 64 65 49 6e 74 22 29 3d 3d 30 29 20 7c 7c 0a 20  deInt")==0) ||. 
9850: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 3d               (c=
9860: 3d 27 69 27 20 26 26 20 73 74 72 63 6d 70 28 7a  ='i' && strcmp(z
9870: 54 79 70 65 2c 22 69 6e 74 22 29 3d 3d 30 29 20  Type,"int")==0) 
9880: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c  ){.          Tcl
9890: 5f 57 69 64 65 49 6e 74 20 76 3b 0a 20 20 20 20  _WideInt v;.    
98a0: 20 20 20 20 20 20 54 63 6c 5f 47 65 74 57 69 64        Tcl_GetWid
98b0: 65 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  eIntFromObj(inte
98c0: 72 70 2c 20 70 56 61 72 2c 20 26 76 29 3b 0a 20  rp, pVar, &v);. 
98d0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
98e0: 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 53 74 6d  _bind_int64(pStm
98f0: 74 2c 20 69 2c 20 76 29 3b 0a 20 20 20 20 20 20  t, i, v);.      
9900: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
9910: 20 20 20 64 61 74 61 20 3d 20 28 75 6e 73 69 67     data = (unsig
9920: 6e 65 64 20 63 68 61 72 20 2a 29 54 63 6c 5f 47  ned char *)Tcl_G
9930: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
9940: 70 56 61 72 2c 20 26 6e 29 3b 0a 20 20 20 20 20  pVar, &n);.     
9950: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e       sqlite3_bin
9960: 64 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 69 2c  d_text(pStmt, i,
9970: 20 28 63 68 61 72 20 2a 29 64 61 74 61 2c 20 6e   (char *)data, n
9980: 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
9990: 3b 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f  ;.          Tcl_
99a0: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 56 61  IncrRefCount(pVa
99b0: 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50  r);.          pP
99c0: 72 65 53 74 6d 74 2d 3e 61 70 50 61 72 6d 5b 69  reStmt->apParm[i
99d0: 50 61 72 6d 2b 2b 5d 20 3d 20 70 56 61 72 3b 0a  Parm++] = pVar;.
99e0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
99f0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
9a00: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c  qlite3_bind_null
9a10: 28 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20  (pStmt, i);.    
9a20: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
9a30: 70 50 72 65 53 74 6d 74 2d 3e 6e 50 61 72 6d 20  pPreStmt->nParm 
9a40: 3d 20 69 50 61 72 6d 3b 0a 20 20 2a 70 70 50 72  = iParm;.  *ppPr
9a50: 65 53 74 6d 74 20 3d 20 70 50 72 65 53 74 6d 74  eStmt = pPreStmt
9a60: 3b 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  ;..  return TCL_
9a70: 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65  OK;.}.../*.** Re
9a80: 6c 65 61 73 65 20 61 20 73 74 61 74 65 6d 65 6e  lease a statemen
9a90: 74 20 72 65 66 65 72 65 6e 63 65 20 6f 62 74 61  t reference obta
9aa0: 69 6e 65 64 20 62 79 20 63 61 6c 6c 69 6e 67 20  ined by calling 
9ab0: 64 62 50 72 65 70 61 72 65 41 6e 64 42 69 6e 64  dbPrepareAndBind
9ac0: 28 29 2e 0a 2a 2a 20 54 68 65 72 65 20 73 68 6f  ()..** There sho
9ad0: 75 6c 64 20 62 65 20 65 78 61 63 74 6c 79 20 6f  uld be exactly o
9ae0: 6e 65 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20  ne call to this 
9af0: 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 65 61 63  function for eac
9b00: 68 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20 64 62 50  h call to.** dbP
9b10: 72 65 70 61 72 65 41 6e 64 42 69 6e 64 28 29 2e  repareAndBind().
9b20: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 69  .**.** If the di
9b30: 73 63 61 72 64 20 70 61 72 61 6d 65 74 65 72 20  scard parameter 
9b40: 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
9b50: 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  n the statement 
9b60: 69 73 20 64 65 6c 65 74 65 64 0a 2a 2a 20 69 6d  is deleted.** im
9b70: 6d 65 64 69 61 74 65 6c 79 2e 20 4f 74 68 65 72  mediately. Other
9b80: 77 69 73 65 20 69 74 20 69 73 20 61 64 64 65 64  wise it is added
9b90: 20 74 6f 20 74 68 65 20 4c 52 55 20 6c 69 73 74   to the LRU list
9ba0: 20 61 6e 64 20 6d 61 79 20 62 65 20 72 65 74 75   and may be retu
9bb0: 72 6e 65 64 0a 2a 2a 20 62 79 20 61 20 73 75 62  rned.** by a sub
9bc0: 73 65 71 75 65 6e 74 20 63 61 6c 6c 20 74 6f 20  sequent call to 
9bd0: 64 62 50 72 65 70 61 72 65 41 6e 64 42 69 6e 64  dbPrepareAndBind
9be0: 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ()..*/.static vo
9bf0: 69 64 20 64 62 52 65 6c 65 61 73 65 53 74 6d 74  id dbReleaseStmt
9c00: 28 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44  (.  SqliteDb *pD
9c10: 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
9c20: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
9c30: 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 53 71 6c 50  handle */.  SqlP
9c40: 72 65 70 61 72 65 64 53 74 6d 74 20 2a 70 50 72  reparedStmt *pPr
9c50: 65 53 74 6d 74 2c 20 20 20 20 20 20 2f 2a 20 50  eStmt,      /* P
9c60: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
9c70: 74 20 68 61 6e 64 6c 65 20 74 6f 20 72 65 6c 65  t handle to rele
9c80: 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 64 69 73  ase */.  int dis
9c90: 63 61 72 64 20 20 20 20 20 20 20 20 20 20 20 20  card            
9ca0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
9cb0: 20 74 6f 20 64 65 6c 65 74 65 20 28 6e 6f 74 20   to delete (not 
9cc0: 63 61 63 68 65 29 20 74 68 65 20 70 50 72 65 53  cache) the pPreS
9cd0: 74 6d 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  tmt */.){.  int 
9ce0: 69 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20 74 68  i;..  /* Free th
9cf0: 65 20 62 6f 75 6e 64 20 73 74 72 69 6e 67 20 61  e bound string a
9d00: 6e 64 20 62 6c 6f 62 20 70 61 72 61 6d 65 74 65  nd blob paramete
9d10: 72 73 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  rs */.  for(i=0;
9d20: 20 69 3c 70 50 72 65 53 74 6d 74 2d 3e 6e 50 61   i<pPreStmt->nPa
9d30: 72 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 54 63  rm; i++){.    Tc
9d40: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70  l_DecrRefCount(p
9d50: 50 72 65 53 74 6d 74 2d 3e 61 70 50 61 72 6d 5b  PreStmt->apParm[
9d60: 69 5d 29 3b 0a 20 20 7d 0a 20 20 70 50 72 65 53  i]);.  }.  pPreS
9d70: 74 6d 74 2d 3e 6e 50 61 72 6d 20 3d 20 30 3b 0a  tmt->nParm = 0;.
9d80: 0a 20 20 69 66 28 20 70 44 62 2d 3e 6d 61 78 53  .  if( pDb->maxS
9d90: 74 6d 74 3c 3d 30 20 7c 7c 20 64 69 73 63 61 72  tmt<=0 || discar
9da0: 64 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  d ){.    /* If t
9db0: 68 65 20 63 61 63 68 65 20 69 73 20 74 75 72 6e  he cache is turn
9dc0: 65 64 20 6f 66 66 2c 20 64 65 61 6c 6c 6f 63 61  ed off, dealloca
9dd0: 74 65 64 20 74 68 65 20 73 74 61 74 65 6d 65 6e  ted the statemen
9de0: 74 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  t */.    sqlite3
9df0: 5f 66 69 6e 61 6c 69 7a 65 28 70 50 72 65 53 74  _finalize(pPreSt
9e00: 6d 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 20 20  mt->pStmt);.    
9e10: 54 63 6c 5f 46 72 65 65 28 28 63 68 61 72 20 2a  Tcl_Free((char *
9e20: 29 70 50 72 65 53 74 6d 74 29 3b 0a 20 20 7d 65  )pPreStmt);.  }e
9e30: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 41 64 64 20  lse{.    /* Add 
9e40: 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61  the prepared sta
9e50: 74 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 62 65  tement to the be
9e60: 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 63  ginning of the c
9e70: 61 63 68 65 20 6c 69 73 74 2e 20 2a 2f 0a 20 20  ache list. */.  
9e80: 20 20 70 50 72 65 53 74 6d 74 2d 3e 70 4e 65 78    pPreStmt->pNex
9e90: 74 20 3d 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73  t = pDb->stmtLis
9ea0: 74 3b 0a 20 20 20 20 70 50 72 65 53 74 6d 74 2d  t;.    pPreStmt-
9eb0: 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 20 20  >pPrev = 0;.    
9ec0: 69 66 28 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73  if( pDb->stmtLis
9ed0: 74 20 29 7b 0a 20 20 20 20 20 70 44 62 2d 3e 73  t ){.     pDb->s
9ee0: 74 6d 74 4c 69 73 74 2d 3e 70 50 72 65 76 20 3d  tmtList->pPrev =
9ef0: 20 70 50 72 65 53 74 6d 74 3b 0a 20 20 20 20 7d   pPreStmt;.    }
9f00: 0a 20 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c 69  .    pDb->stmtLi
9f10: 73 74 20 3d 20 70 50 72 65 53 74 6d 74 3b 0a 20  st = pPreStmt;. 
9f20: 20 20 20 69 66 28 20 70 44 62 2d 3e 73 74 6d 74     if( pDb->stmt
9f30: 4c 61 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Last==0 ){.     
9f40: 20 61 73 73 65 72 74 28 20 70 44 62 2d 3e 6e 53   assert( pDb->nS
9f50: 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  tmt==0 );.      
9f60: 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74 20 3d 20  pDb->stmtLast = 
9f70: 70 50 72 65 53 74 6d 74 3b 0a 20 20 20 20 7d 65  pPreStmt;.    }e
9f80: 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
9f90: 74 28 20 70 44 62 2d 3e 6e 53 74 6d 74 3e 30 20  t( pDb->nStmt>0 
9fa0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 44 62  );.    }.    pDb
9fb0: 2d 3e 6e 53 74 6d 74 2b 2b 3b 0a 20 20 20 0a 20  ->nStmt++;.   . 
9fc0: 20 20 20 2f 2a 20 49 66 20 77 65 20 68 61 76 65     /* If we have
9fd0: 20 74 6f 6f 20 6d 61 6e 79 20 73 74 61 74 65 6d   too many statem
9fe0: 65 6e 74 20 69 6e 20 63 61 63 68 65 2c 20 72 65  ent in cache, re
9ff0: 6d 6f 76 65 20 74 68 65 20 73 75 72 70 6c 75 73  move the surplus
a000: 20 66 72 6f 6d 20 0a 20 20 20 20 2a 2a 20 74 68   from .    ** th
a010: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 63 61 63  e end of the cac
a020: 68 65 20 6c 69 73 74 2e 20 20 2a 2f 0a 20 20 20  he list.  */.   
a030: 20 77 68 69 6c 65 28 20 70 44 62 2d 3e 6e 53 74   while( pDb->nSt
a040: 6d 74 3e 70 44 62 2d 3e 6d 61 78 53 74 6d 74 20  mt>pDb->maxStmt 
a050: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
a060: 5f 66 69 6e 61 6c 69 7a 65 28 70 44 62 2d 3e 73  _finalize(pDb->s
a070: 74 6d 74 4c 61 73 74 2d 3e 70 53 74 6d 74 29 3b  tmtLast->pStmt);
a080: 0a 20 20 20 20 20 20 70 44 62 2d 3e 73 74 6d 74  .      pDb->stmt
a090: 4c 61 73 74 20 3d 20 70 44 62 2d 3e 73 74 6d 74  Last = pDb->stmt
a0a0: 4c 61 73 74 2d 3e 70 50 72 65 76 3b 0a 20 20 20  Last->pPrev;.   
a0b0: 20 20 20 54 63 6c 5f 46 72 65 65 28 28 63 68 61     Tcl_Free((cha
a0c0: 72 2a 29 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74  r*)pDb->stmtLast
a0d0: 2d 3e 70 4e 65 78 74 29 3b 0a 20 20 20 20 20 20  ->pNext);.      
a0e0: 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74 2d 3e 70  pDb->stmtLast->p
a0f0: 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Next = 0;.      
a100: 70 44 62 2d 3e 6e 53 74 6d 74 2d 2d 3b 0a 20 20  pDb->nStmt--;.  
a110: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
a120: 20 53 74 72 75 63 74 75 72 65 20 75 73 65 64 20   Structure used 
a130: 77 69 74 68 20 64 62 45 76 61 6c 58 58 58 28 29  with dbEvalXXX()
a140: 20 66 75 6e 63 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a   functions:.**.*
a150: 2a 20 20 20 64 62 45 76 61 6c 49 6e 69 74 28 29  *   dbEvalInit()
a160: 0a 2a 2a 20 20 20 64 62 45 76 61 6c 53 74 65 70  .**   dbEvalStep
a170: 28 29 0a 2a 2a 20 20 20 64 62 45 76 61 6c 46 69  ().**   dbEvalFi
a180: 6e 61 6c 69 7a 65 28 29 0a 2a 2a 20 20 20 64 62  nalize().**   db
a190: 45 76 61 6c 52 6f 77 49 6e 66 6f 28 29 0a 2a 2a  EvalRowInfo().**
a1a0: 20 20 20 64 62 45 76 61 6c 43 6f 6c 75 6d 6e 56     dbEvalColumnV
a1b0: 61 6c 75 65 28 29 0a 2a 2f 0a 74 79 70 65 64 65  alue().*/.typede
a1c0: 66 20 73 74 72 75 63 74 20 44 62 45 76 61 6c 43  f struct DbEvalC
a1d0: 6f 6e 74 65 78 74 20 44 62 45 76 61 6c 43 6f 6e  ontext DbEvalCon
a1e0: 74 65 78 74 3b 0a 73 74 72 75 63 74 20 44 62 45  text;.struct DbE
a1f0: 76 61 6c 43 6f 6e 74 65 78 74 20 7b 0a 20 20 53  valContext {.  S
a200: 71 6c 69 74 65 44 62 20 2a 70 44 62 3b 20 20 20  qliteDb *pDb;   
a210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a220: 2a 20 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c  * Database handl
a230: 65 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  e */.  Tcl_Obj *
a240: 70 53 71 6c 3b 20 20 20 20 20 20 20 20 20 20 20  pSql;           
a250: 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63 74         /* Object
a260: 20 68 6f 6c 64 69 6e 67 20 73 74 72 69 6e 67 20   holding string 
a270: 7a 53 71 6c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  zSql */.  const 
a280: 63 68 61 72 20 2a 7a 53 71 6c 3b 20 20 20 20 20  char *zSql;     
a290: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6d            /* Rem
a2a0: 61 69 6e 69 6e 67 20 53 51 4c 20 74 6f 20 65 78  aining SQL to ex
a2b0: 65 63 75 74 65 20 2a 2f 0a 20 20 53 71 6c 50 72  ecute */.  SqlPr
a2c0: 65 70 61 72 65 64 53 74 6d 74 20 2a 70 50 72 65  eparedStmt *pPre
a2d0: 53 74 6d 74 3b 20 20 20 20 20 20 2f 2a 20 43 75  Stmt;      /* Cu
a2e0: 72 72 65 6e 74 20 73 74 61 74 65 6d 65 6e 74 20  rrent statement 
a2f0: 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20  */.  int nCol;  
a300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a310: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
a320: 66 20 63 6f 6c 75 6d 6e 73 20 72 65 74 75 72 6e  f columns return
a330: 65 64 20 62 79 20 70 53 74 6d 74 20 2a 2f 0a 20  ed by pStmt */. 
a340: 20 54 63 6c 5f 4f 62 6a 20 2a 70 41 72 72 61 79   Tcl_Obj *pArray
a350: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
a360: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 61 72 72 61   /* Name of arra
a370: 79 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20  y variable */.  
a380: 54 63 6c 5f 4f 62 6a 20 2a 2a 61 70 43 6f 6c 4e  Tcl_Obj **apColN
a390: 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
a3a0: 2f 2a 20 41 72 72 61 79 20 6f 66 20 63 6f 6c 75  /* Array of colu
a3b0: 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 7d 3b 0a 0a  mn names */.};..
a3c0: 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 6e  /*.** Release an
a3d0: 79 20 63 61 63 68 65 20 6f 66 20 63 6f 6c 75 6d  y cache of colum
a3e0: 6e 20 6e 61 6d 65 73 20 63 75 72 72 65 6e 74 6c  n names currentl
a3f0: 79 20 68 65 6c 64 20 61 73 20 70 61 72 74 20 6f  y held as part o
a400: 66 0a 2a 2a 20 74 68 65 20 44 62 45 76 61 6c 43  f.** the DbEvalC
a410: 6f 6e 74 65 78 74 20 73 74 72 75 63 74 75 72 65  ontext structure
a420: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66   passed as the f
a430: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  irst argument..*
a440: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 62  /.static void db
a450: 52 65 6c 65 61 73 65 43 6f 6c 75 6d 6e 4e 61 6d  ReleaseColumnNam
a460: 65 73 28 44 62 45 76 61 6c 43 6f 6e 74 65 78 74  es(DbEvalContext
a470: 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 61   *p){.  if( p->a
a480: 70 43 6f 6c 4e 61 6d 65 20 29 7b 0a 20 20 20 20  pColName ){.    
a490: 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
a4a0: 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69  =0; i<p->nCol; i
a4b0: 2b 2b 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 44  ++){.      Tcl_D
a4c0: 65 63 72 52 65 66 43 6f 75 6e 74 28 70 2d 3e 61  ecrRefCount(p->a
a4d0: 70 43 6f 6c 4e 61 6d 65 5b 69 5d 29 3b 0a 20 20  pColName[i]);.  
a4e0: 20 20 7d 0a 20 20 20 20 54 63 6c 5f 46 72 65 65    }.    Tcl_Free
a4f0: 28 28 63 68 61 72 20 2a 29 70 2d 3e 61 70 43 6f  ((char *)p->apCo
a500: 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 70 2d 3e 61  lName);.    p->a
a510: 70 43 6f 6c 4e 61 6d 65 20 3d 20 30 3b 0a 20 20  pColName = 0;.  
a520: 7d 0a 20 20 70 2d 3e 6e 43 6f 6c 20 3d 20 30 3b  }.  p->nCol = 0;
a530: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61  .}../*.** Initia
a540: 6c 69 7a 65 20 61 20 44 62 45 76 61 6c 43 6f 6e  lize a DbEvalCon
a550: 74 65 78 74 20 73 74 72 75 63 74 75 72 65 2e 0a  text structure..
a560: 2a 2a 0a 2a 2a 20 49 66 20 70 41 72 72 61 79 20  **.** If pArray 
a570: 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65  is not NULL, the
a580: 6e 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  n it contains th
a590: 65 20 6e 61 6d 65 20 6f 66 20 61 20 54 63 6c 20  e name of a Tcl 
a5a0: 61 72 72 61 79 0a 2a 2a 20 76 61 72 69 61 62 6c  array.** variabl
a5b0: 65 2e 20 54 68 65 20 22 2a 22 20 6d 65 6d 62 65  e. The "*" membe
a5c0: 72 20 6f 66 20 74 68 69 73 20 61 72 72 61 79 20  r of this array 
a5d0: 69 73 20 73 65 74 20 74 6f 20 61 20 6c 69 73 74  is set to a list
a5e0: 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 2a 2a 20 74   containing.** t
a5f0: 68 65 20 6e 61 6d 65 73 20 6f 66 20 74 68 65 20  he names of the 
a600: 63 6f 6c 75 6d 6e 73 20 72 65 74 75 72 6e 65 64  columns returned
a610: 20 62 79 20 74 68 65 20 73 74 61 74 65 6d 65 6e   by the statemen
a620: 74 20 61 73 20 70 61 72 74 20 6f 66 20 65 61 63  t as part of eac
a630: 68 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 64 62 45  h.** call to dbE
a640: 76 61 6c 53 74 65 70 28 29 2c 20 69 6e 20 6f 72  valStep(), in or
a650: 64 65 72 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f  der from left to
a660: 20 72 69 67 68 74 2e 20 65 2e 67 2e 20 69 66 20   right. e.g. if 
a670: 74 68 65 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f 66  the names .** of
a680: 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 63 6f   the returned co
a690: 6c 75 6d 6e 73 20 61 72 65 20 61 2c 20 62 20 61  lumns are a, b a
a6a0: 6e 64 20 63 2c 20 69 74 20 64 6f 65 73 20 74 68  nd c, it does th
a6b0: 65 20 65 71 75 69 76 61 6c 65 6e 74 20 6f 66 20  e equivalent of 
a6c0: 74 68 65 20 0a 2a 2a 20 74 63 6c 20 63 6f 6d 6d  the .** tcl comm
a6d0: 61 6e 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 73  and:.**.**     s
a6e0: 65 74 20 24 7b 70 41 72 72 61 79 7d 28 2a 29 20  et ${pArray}(*) 
a6f0: 7b 61 20 62 20 63 7d 0a 2a 2f 0a 73 74 61 74 69  {a b c}.*/.stati
a700: 63 20 76 6f 69 64 20 64 62 45 76 61 6c 49 6e 69  c void dbEvalIni
a710: 74 28 0a 20 20 44 62 45 76 61 6c 43 6f 6e 74 65  t(.  DbEvalConte
a720: 78 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  xt *p,          
a730: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
a740: 74 6f 20 73 74 72 75 63 74 75 72 65 20 74 6f 20  to structure to 
a750: 69 6e 69 74 69 61 6c 69 7a 65 20 2a 2f 0a 20 20  initialize */.  
a760: 53 71 6c 69 74 65 44 62 20 2a 70 44 62 2c 20 20  SqliteDb *pDb,  
a770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a780: 2f 2a 20 44 61 74 61 62 61 73 65 20 68 61 6e 64  /* Database hand
a790: 6c 65 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  le */.  Tcl_Obj 
a7a0: 2a 70 53 71 6c 2c 20 20 20 20 20 20 20 20 20 20  *pSql,          
a7b0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63          /* Objec
a7c0: 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 53 51 4c  t containing SQL
a7d0: 20 73 63 72 69 70 74 20 2a 2f 0a 20 20 54 63 6c   script */.  Tcl
a7e0: 5f 4f 62 6a 20 2a 70 41 72 72 61 79 20 20 20 20  _Obj *pArray    
a7f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a800: 4e 61 6d 65 20 6f 66 20 54 63 6c 20 61 72 72 61  Name of Tcl arra
a810: 79 20 74 6f 20 73 65 74 20 28 2a 29 20 65 6c 65  y to set (*) ele
a820: 6d 65 6e 74 20 6f 66 20 2a 2f 0a 29 7b 0a 20 20  ment of */.){.  
a830: 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 73 69 7a  memset(p, 0, siz
a840: 65 6f 66 28 44 62 45 76 61 6c 43 6f 6e 74 65 78  eof(DbEvalContex
a850: 74 29 29 3b 0a 20 20 70 2d 3e 70 44 62 20 3d 20  t));.  p->pDb = 
a860: 70 44 62 3b 0a 20 20 70 2d 3e 7a 53 71 6c 20 3d  pDb;.  p->zSql =
a870: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 70   Tcl_GetString(p
a880: 53 71 6c 29 3b 0a 20 20 70 2d 3e 70 53 71 6c 20  Sql);.  p->pSql 
a890: 3d 20 70 53 71 6c 3b 0a 20 20 54 63 6c 5f 49 6e  = pSql;.  Tcl_In
a8a0: 63 72 52 65 66 43 6f 75 6e 74 28 70 53 71 6c 29  crRefCount(pSql)
a8b0: 3b 0a 20 20 69 66 28 20 70 41 72 72 61 79 20 29  ;.  if( pArray )
a8c0: 7b 0a 20 20 20 20 70 2d 3e 70 41 72 72 61 79 20  {.    p->pArray 
a8d0: 3d 20 70 41 72 72 61 79 3b 0a 20 20 20 20 54 63  = pArray;.    Tc
a8e0: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70  l_IncrRefCount(p
a8f0: 41 72 72 61 79 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  Array);.  }.}../
a900: 2a 0a 2a 2a 20 4f 62 74 61 69 6e 20 69 6e 66 6f  *.** Obtain info
a910: 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68  rmation about th
a920: 65 20 72 6f 77 20 74 68 61 74 20 74 68 65 20 44  e row that the D
a930: 62 45 76 61 6c 43 6f 6e 74 65 78 74 20 70 61 73  bEvalContext pas
a940: 73 65 64 20 61 73 20 74 68 65 0a 2a 2a 20 66 69  sed as the.** fi
a950: 72 73 74 20 61 72 67 75 6d 65 6e 74 20 63 75 72  rst argument cur
a960: 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f  rently points to
a970: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
a980: 20 64 62 45 76 61 6c 52 6f 77 49 6e 66 6f 28 0a   dbEvalRowInfo(.
a990: 20 20 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 20    DbEvalContext 
a9a0: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
a9b0: 20 20 2f 2a 20 45 76 61 6c 75 61 74 69 6f 6e 20    /* Evaluation 
a9c0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74  context */.  int
a9d0: 20 2a 70 6e 43 6f 6c 2c 20 20 20 20 20 20 20 20   *pnCol,        
a9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a9f0: 4f 55 54 3a 20 4e 75 6d 62 65 72 20 6f 66 20 63  OUT: Number of c
aa00: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20  olumn names */. 
aa10: 20 54 63 6c 5f 4f 62 6a 20 2a 2a 2a 70 61 70 43   Tcl_Obj ***papC
aa20: 6f 6c 4e 61 6d 65 20 20 20 20 20 20 20 20 20 20  olName          
aa30: 20 2f 2a 20 4f 55 54 3a 20 41 72 72 61 79 20 6f   /* OUT: Array o
aa40: 66 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a  f column names *
aa50: 2f 0a 29 7b 0a 20 20 2f 2a 20 43 6f 6d 70 75 74  /.){.  /* Comput
aa60: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a  e column names *
aa70: 2f 0a 20 20 69 66 28 20 30 3d 3d 70 2d 3e 61 70  /.  if( 0==p->ap
aa80: 43 6f 6c 4e 61 6d 65 20 29 7b 0a 20 20 20 20 73  ColName ){.    s
aa90: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
aaa0: 6d 74 20 3d 20 70 2d 3e 70 50 72 65 53 74 6d 74  mt = p->pPreStmt
aab0: 2d 3e 70 53 74 6d 74 3b 0a 20 20 20 20 69 6e 74  ->pStmt;.    int
aac0: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
aad0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74             /* It
aae0: 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c 65 20  erator variable 
aaf0: 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b  */.    int nCol;
ab00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ab10: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
ab20: 66 20 63 6f 6c 75 6d 6e 73 20 72 65 74 75 72 6e  f columns return
ab30: 65 64 20 62 79 20 70 53 74 6d 74 20 2a 2f 0a 20  ed by pStmt */. 
ab40: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 61 70 43     Tcl_Obj **apC
ab50: 6f 6c 4e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20  olName = 0;     
ab60: 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 63 6f 6c   /* Array of col
ab70: 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 0a 20 20  umn names */..  
ab80: 20 20 70 2d 3e 6e 43 6f 6c 20 3d 20 6e 43 6f 6c    p->nCol = nCol
ab90: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
aba0: 6e 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29 3b 0a  n_count(pStmt);.
abb0: 20 20 20 20 69 66 28 20 6e 43 6f 6c 3e 30 20 26      if( nCol>0 &
abc0: 26 20 28 70 61 70 43 6f 6c 4e 61 6d 65 20 7c 7c  & (papColName ||
abd0: 20 70 2d 3e 70 41 72 72 61 79 29 20 29 7b 0a 20   p->pArray) ){. 
abe0: 20 20 20 20 20 61 70 43 6f 6c 4e 61 6d 65 20 3d       apColName =
abf0: 20 28 54 63 6c 5f 4f 62 6a 2a 2a 29 54 63 6c 5f   (Tcl_Obj**)Tcl_
ac00: 41 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 54 63  Alloc( sizeof(Tc
ac10: 6c 5f 4f 62 6a 2a 29 2a 6e 43 6f 6c 20 29 3b 0a  l_Obj*)*nCol );.
ac20: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
ac30: 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nCol; i++){.   
ac40: 20 20 20 20 20 61 70 43 6f 6c 4e 61 6d 65 5b 69       apColName[i
ac50: 5d 20 3d 20 64 62 54 65 78 74 54 6f 4f 62 6a 28  ] = dbTextToObj(
ac60: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e  sqlite3_column_n
ac70: 61 6d 65 28 70 53 74 6d 74 2c 69 29 29 3b 0a 20  ame(pStmt,i));. 
ac80: 20 20 20 20 20 20 20 54 63 6c 5f 49 6e 63 72 52         Tcl_IncrR
ac90: 65 66 43 6f 75 6e 74 28 61 70 43 6f 6c 4e 61 6d  efCount(apColNam
aca0: 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  e[i]);.      }. 
acb0: 20 20 20 20 20 70 2d 3e 61 70 43 6f 6c 4e 61 6d       p->apColNam
acc0: 65 20 3d 20 61 70 43 6f 6c 4e 61 6d 65 3b 0a 20  e = apColName;. 
acd0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
ace0: 72 65 73 75 6c 74 73 20 61 72 65 20 62 65 69 6e  results are bein
acf0: 67 20 73 74 6f 72 65 64 20 69 6e 20 61 6e 20 61  g stored in an a
ad00: 72 72 61 79 20 76 61 72 69 61 62 6c 65 2c 20 74  rray variable, t
ad10: 68 65 6e 20 63 72 65 61 74 65 0a 20 20 20 20 2a  hen create.    *
ad20: 2a 20 74 68 65 20 61 72 72 61 79 28 2a 29 20 65  * the array(*) e
ad30: 6e 74 72 79 20 66 6f 72 20 74 68 61 74 20 61 72  ntry for that ar
ad40: 72 61 79 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ray.    */.    i
ad50: 66 28 20 70 2d 3e 70 41 72 72 61 79 20 29 7b 0a  f( p->pArray ){.
ad60: 20 20 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70        Tcl_Interp
ad70: 20 2a 69 6e 74 65 72 70 20 3d 20 70 2d 3e 70 44   *interp = p->pD
ad80: 62 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 20  b->interp;.     
ad90: 20 54 63 6c 5f 4f 62 6a 20 2a 70 43 6f 6c 4c 69   Tcl_Obj *pColLi
ada0: 73 74 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a 28  st = Tcl_NewObj(
adb0: 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a  );.      Tcl_Obj
adc0: 20 2a 70 53 74 61 72 20 3d 20 54 63 6c 5f 4e 65   *pStar = Tcl_Ne
add0: 77 53 74 72 69 6e 67 4f 62 6a 28 22 2a 22 2c 20  wStringObj("*", 
ade0: 2d 31 29 3b 0a 0a 20 20 20 20 20 20 66 6f 72 28  -1);..      for(
adf0: 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b  i=0; i<nCol; i++
ae00: 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 4c  ){.        Tcl_L
ae10: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
ae20: 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 43 6f 6c  ent(interp, pCol
ae30: 4c 69 73 74 2c 20 61 70 43 6f 6c 4e 61 6d 65 5b  List, apColName[
ae40: 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  i]);.      }.   
ae50: 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f     Tcl_IncrRefCo
ae60: 75 6e 74 28 70 53 74 61 72 29 3b 0a 20 20 20 20  unt(pStar);.    
ae70: 20 20 54 63 6c 5f 4f 62 6a 53 65 74 56 61 72 32    Tcl_ObjSetVar2
ae80: 28 69 6e 74 65 72 70 2c 20 70 2d 3e 70 41 72 72  (interp, p->pArr
ae90: 61 79 2c 20 70 53 74 61 72 2c 20 70 43 6f 6c 4c  ay, pStar, pColL
aea0: 69 73 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 54  ist, 0);.      T
aeb0: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
aec0: 70 53 74 61 72 29 3b 0a 20 20 20 20 7d 0a 20 20  pStar);.    }.  
aed0: 7d 0a 0a 20 20 69 66 28 20 70 61 70 43 6f 6c 4e  }..  if( papColN
aee0: 61 6d 65 20 29 7b 0a 20 20 20 20 2a 70 61 70 43  ame ){.    *papC
aef0: 6f 6c 4e 61 6d 65 20 3d 20 70 2d 3e 61 70 43 6f  olName = p->apCo
af00: 6c 4e 61 6d 65 3b 0a 20 20 7d 0a 20 20 69 66 28  lName;.  }.  if(
af10: 20 70 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 2a 70   pnCol ){.    *p
af20: 6e 43 6f 6c 20 3d 20 70 2d 3e 6e 43 6f 6c 3b 0a  nCol = p->nCol;.
af30: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74    }.}../*.** Ret
af40: 75 72 6e 20 6f 6e 65 20 6f 66 20 54 43 4c 5f 4f  urn one of TCL_O
af50: 4b 2c 20 54 43 4c 5f 42 52 45 41 4b 20 6f 72 20  K, TCL_BREAK or 
af60: 54 43 4c 5f 45 52 52 4f 52 2e 20 49 66 20 54 43  TCL_ERROR. If TC
af70: 4c 5f 45 52 52 4f 52 20 69 73 0a 2a 2a 20 72 65  L_ERROR is.** re
af80: 74 75 72 6e 65 64 2c 20 74 68 65 6e 20 61 6e 20  turned, then an 
af90: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73  error message is
afa0: 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 69   stored in the i
afb0: 6e 74 65 72 70 72 65 74 65 72 20 62 65 66 6f 72  nterpreter befor
afc0: 65 0a 2a 2a 20 72 65 74 75 72 6e 69 6e 67 2e 0a  e.** returning..
afd0: 2a 2a 0a 2a 2a 20 41 20 72 65 74 75 72 6e 20 76  **.** A return v
afe0: 61 6c 75 65 20 6f 66 20 54 43 4c 5f 4f 4b 20 6d  alue of TCL_OK m
aff0: 65 61 6e 73 20 74 68 65 72 65 20 69 73 20 61 20  eans there is a 
b000: 72 6f 77 20 6f 66 20 64 61 74 61 20 61 76 61 69  row of data avai
b010: 6c 61 62 6c 65 2e 20 54 68 65 0a 2a 2a 20 64 61  lable. The.** da
b020: 74 61 20 6d 61 79 20 62 65 20 61 63 63 65 73 73  ta may be access
b030: 65 64 20 75 73 69 6e 67 20 64 62 45 76 61 6c 52  ed using dbEvalR
b040: 6f 77 49 6e 66 6f 28 29 20 61 6e 64 20 64 62 45  owInfo() and dbE
b050: 76 61 6c 43 6f 6c 75 6d 6e 56 61 6c 75 65 28 29  valColumnValue()
b060: 2e 20 54 68 69 73 0a 2a 2a 20 69 73 20 61 6e 61  . This.** is ana
b070: 6c 6f 67 6f 75 73 20 74 6f 20 61 20 72 65 74 75  logous to a retu
b080: 72 6e 20 6f 66 20 53 51 4c 49 54 45 5f 52 4f 57  rn of SQLITE_ROW
b090: 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 73 74   from sqlite3_st
b0a0: 65 70 28 29 2e 20 49 66 20 54 43 4c 5f 42 52 45  ep(). If TCL_BRE
b0b0: 41 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65  AK.** is returne
b0c0: 64 2c 20 74 68 65 6e 20 74 68 65 20 53 51 4c 20  d, then the SQL 
b0d0: 73 63 72 69 70 74 20 68 61 73 20 66 69 6e 69 73  script has finis
b0e0: 68 65 64 20 65 78 65 63 75 74 69 6e 67 20 61 6e  hed executing an
b0f0: 64 20 74 68 65 72 65 20 61 72 65 0a 2a 2a 20 6e  d there are.** n
b100: 6f 20 66 75 72 74 68 65 72 20 72 6f 77 73 20 61  o further rows a
b110: 76 61 69 6c 61 62 6c 65 2e 20 54 68 69 73 20 69  vailable. This i
b120: 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 53 51 4c  s similar to SQL
b130: 49 54 45 5f 44 4f 4e 45 2e 0a 2a 2f 0a 73 74 61  ITE_DONE..*/.sta
b140: 74 69 63 20 69 6e 74 20 64 62 45 76 61 6c 53 74  tic int dbEvalSt
b150: 65 70 28 44 62 45 76 61 6c 43 6f 6e 74 65 78 74  ep(DbEvalContext
b160: 20 2a 70 29 7b 0a 20 20 77 68 69 6c 65 28 20 70   *p){.  while( p
b170: 2d 3e 7a 53 71 6c 5b 30 5d 20 7c 7c 20 70 2d 3e  ->zSql[0] || p->
b180: 70 50 72 65 53 74 6d 74 20 29 7b 0a 20 20 20 20  pPreStmt ){.    
b190: 69 6e 74 20 72 63 3b 0a 20 20 20 20 69 66 28 20  int rc;.    if( 
b1a0: 70 2d 3e 70 50 72 65 53 74 6d 74 3d 3d 30 20 29  p->pPreStmt==0 )
b1b0: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 64 62 50  {.      rc = dbP
b1c0: 72 65 70 61 72 65 41 6e 64 42 69 6e 64 28 70 2d  repareAndBind(p-
b1d0: 3e 70 44 62 2c 20 70 2d 3e 7a 53 71 6c 2c 20 26  >pDb, p->zSql, &
b1e0: 70 2d 3e 7a 53 71 6c 2c 20 26 70 2d 3e 70 50 72  p->zSql, &p->pPr
b1f0: 65 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 69 66  eStmt);.      if
b200: 28 20 72 63 21 3d 54 43 4c 5f 4f 4b 20 29 20 72  ( rc!=TCL_OK ) r
b210: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 65  eturn rc;.    }e
b220: 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 72  lse{.      int r
b230: 63 73 3b 0a 20 20 20 20 20 20 53 71 6c 69 74 65  cs;.      Sqlite
b240: 44 62 20 2a 70 44 62 20 3d 20 70 2d 3e 70 44 62  Db *pDb = p->pDb
b250: 3b 0a 20 20 20 20 20 20 53 71 6c 50 72 65 70 61  ;.      SqlPrepa
b260: 72 65 64 53 74 6d 74 20 2a 70 50 72 65 53 74 6d  redStmt *pPreStm
b270: 74 20 3d 20 70 2d 3e 70 50 72 65 53 74 6d 74 3b  t = p->pPreStmt;
b280: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
b290: 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 70 50 72  tmt *pStmt = pPr
b2a0: 65 53 74 6d 74 2d 3e 70 53 74 6d 74 3b 0a 0a 20  eStmt->pStmt;.. 
b2b0: 20 20 20 20 20 72 63 73 20 3d 20 73 71 6c 69 74       rcs = sqlit
b2c0: 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3b 0a  e3_step(pStmt);.
b2d0: 20 20 20 20 20 20 69 66 28 20 72 63 73 3d 3d 53        if( rcs==S
b2e0: 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20  QLITE_ROW ){.   
b2f0: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
b300: 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OK;.      }.    
b310: 20 20 69 66 28 20 70 2d 3e 70 41 72 72 61 79 20    if( p->pArray 
b320: 29 7b 0a 20 20 20 20 20 20 20 20 64 62 45 76 61  ){.        dbEva
b330: 6c 52 6f 77 49 6e 66 6f 28 70 2c 20 30 2c 20 30  lRowInfo(p, 0, 0
b340: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
b350: 20 72 63 73 20 3d 20 73 71 6c 69 74 65 33 5f 72   rcs = sqlite3_r
b360: 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 0a 20 20  eset(pStmt);..  
b370: 20 20 20 20 70 44 62 2d 3e 6e 53 74 65 70 20 3d      pDb->nStep =
b380: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74   sqlite3_stmt_st
b390: 61 74 75 73 28 70 53 74 6d 74 2c 53 51 4c 49 54  atus(pStmt,SQLIT
b3a0: 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 46 55 4c  E_STMTSTATUS_FUL
b3b0: 4c 53 43 41 4e 5f 53 54 45 50 2c 31 29 3b 0a 20  LSCAN_STEP,1);. 
b3c0: 20 20 20 20 20 70 44 62 2d 3e 6e 53 6f 72 74 20       pDb->nSort 
b3d0: 3d 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73  = sqlite3_stmt_s
b3e0: 74 61 74 75 73 28 70 53 74 6d 74 2c 53 51 4c 49  tatus(pStmt,SQLI
b3f0: 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 53 4f  TE_STMTSTATUS_SO
b400: 52 54 2c 31 29 3b 0a 20 20 20 20 20 20 70 44 62  RT,1);.      pDb
b410: 2d 3e 6e 49 6e 64 65 78 20 3d 20 73 71 6c 69 74  ->nIndex = sqlit
b420: 65 33 5f 73 74 6d 74 5f 73 74 61 74 75 73 28 70  e3_stmt_status(p
b430: 53 74 6d 74 2c 53 51 4c 49 54 45 5f 53 54 4d 54  Stmt,SQLITE_STMT
b440: 53 54 41 54 55 53 5f 41 55 54 4f 49 4e 44 45 58  STATUS_AUTOINDEX
b450: 2c 31 29 3b 0a 20 20 20 20 20 20 64 62 52 65 6c  ,1);.      dbRel
b460: 65 61 73 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  easeColumnNames(
b470: 70 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72  p);.      p->pPr
b480: 65 53 74 6d 74 20 3d 20 30 3b 0a 0a 20 20 20 20  eStmt = 0;..    
b490: 20 20 69 66 28 20 72 63 73 21 3d 53 51 4c 49 54    if( rcs!=SQLIT
b4a0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
b4b0: 2f 2a 20 49 66 20 61 20 72 75 6e 2d 74 69 6d 65  /* If a run-time
b4c0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72   error occurs, r
b4d0: 65 70 6f 72 74 20 74 68 65 20 65 72 72 6f 72 20  eport the error 
b4e0: 61 6e 64 20 73 74 6f 70 20 72 65 61 64 69 6e 67  and stop reading
b4f0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
b500: 53 51 4c 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  SQL.  */.       
b510: 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
b520: 74 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20 64  t(pDb->interp, d
b530: 62 54 65 78 74 54 6f 4f 62 6a 28 73 71 6c 69 74  bTextToObj(sqlit
b540: 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64  e3_errmsg(pDb->d
b550: 62 29 29 29 3b 0a 20 20 20 20 20 20 20 20 64 62  b)));.        db
b560: 52 65 6c 65 61 73 65 53 74 6d 74 28 70 44 62 2c  ReleaseStmt(pDb,
b570: 20 70 50 72 65 53 74 6d 74 2c 20 31 29 3b 0a 20   pPreStmt, 1);. 
b580: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43         return TC
b590: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d  L_ERROR;.      }
b5a0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 64 62  else{.        db
b5b0: 52 65 6c 65 61 73 65 53 74 6d 74 28 70 44 62 2c  ReleaseStmt(pDb,
b5c0: 20 70 50 72 65 53 74 6d 74 2c 20 30 29 3b 0a 20   pPreStmt, 0);. 
b5d0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
b5e0: 0a 0a 20 20 2f 2a 20 46 69 6e 69 73 68 65 64 20  ..  /* Finished 
b5f0: 2a 2f 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  */.  return TCL_
b600: 42 52 45 41 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  BREAK;.}../*.** 
b610: 46 72 65 65 20 61 6c 6c 20 72 65 73 6f 75 72 63  Free all resourc
b620: 65 73 20 63 75 72 72 65 6e 74 6c 79 20 68 65 6c  es currently hel
b630: 64 20 62 79 20 74 68 65 20 44 62 45 76 61 6c 43  d by the DbEvalC
b640: 6f 6e 74 65 78 74 20 73 74 72 75 63 74 75 72 65  ontext structure
b650: 20 70 61 73 73 65 64 0a 2a 2a 20 61 73 20 74 68   passed.** as th
b660: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
b670: 2e 20 54 68 65 72 65 20 73 68 6f 75 6c 64 20 62  . There should b
b680: 65 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 63 61  e exactly one ca
b690: 6c 6c 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  ll to this funct
b6a0: 69 6f 6e 0a 2a 2a 20 66 6f 72 20 65 61 63 68 20  ion.** for each 
b6b0: 63 61 6c 6c 20 74 6f 20 64 62 45 76 61 6c 49 6e  call to dbEvalIn
b6c0: 69 74 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  it()..*/.static 
b6d0: 76 6f 69 64 20 64 62 45 76 61 6c 46 69 6e 61 6c  void dbEvalFinal
b6e0: 69 7a 65 28 44 62 45 76 61 6c 43 6f 6e 74 65 78  ize(DbEvalContex
b6f0: 74 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e  t *p){.  if( p->
b700: 70 50 72 65 53 74 6d 74 20 29 7b 0a 20 20 20 20  pPreStmt ){.    
b710: 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 2d  sqlite3_reset(p-
b720: 3e 70 50 72 65 53 74 6d 74 2d 3e 70 53 74 6d 74  >pPreStmt->pStmt
b730: 29 3b 0a 20 20 20 20 64 62 52 65 6c 65 61 73 65  );.    dbRelease
b740: 53 74 6d 74 28 70 2d 3e 70 44 62 2c 20 70 2d 3e  Stmt(p->pDb, p->
b750: 70 50 72 65 53 74 6d 74 2c 20 30 29 3b 0a 20 20  pPreStmt, 0);.  
b760: 20 20 70 2d 3e 70 50 72 65 53 74 6d 74 20 3d 20    p->pPreStmt = 
b770: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  0;.  }.  if( p->
b780: 70 41 72 72 61 79 20 29 7b 0a 20 20 20 20 54 63  pArray ){.    Tc
b790: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70  l_DecrRefCount(p
b7a0: 2d 3e 70 41 72 72 61 79 29 3b 0a 20 20 20 20 70  ->pArray);.    p
b7b0: 2d 3e 70 41 72 72 61 79 20 3d 20 30 3b 0a 20 20  ->pArray = 0;.  
b7c0: 7d 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43  }.  Tcl_DecrRefC
b7d0: 6f 75 6e 74 28 70 2d 3e 70 53 71 6c 29 3b 0a 20  ount(p->pSql);. 
b7e0: 20 64 62 52 65 6c 65 61 73 65 43 6f 6c 75 6d 6e   dbReleaseColumn
b7f0: 4e 61 6d 65 73 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a  Names(p);.}../*.
b800: 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
b810: 74 65 72 20 74 6f 20 61 20 54 63 6c 5f 4f 62 6a  ter to a Tcl_Obj
b820: 20 73 74 72 75 63 74 75 72 65 20 77 69 74 68 20   structure with 
b830: 72 65 66 2d 63 6f 75 6e 74 20 30 20 74 68 61 74  ref-count 0 that
b840: 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 74 68 65   contains.** the
b850: 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 69   value for the i
b860: 43 6f 6c 27 74 68 20 63 6f 6c 75 6d 6e 20 6f 66  Col'th column of
b870: 20 74 68 65 20 72 6f 77 20 63 75 72 72 65 6e 74   the row current
b880: 6c 79 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  ly pointed to by
b890: 0a 2a 2a 20 74 68 65 20 44 62 45 76 61 6c 43 6f  .** the DbEvalCo
b8a0: 6e 74 65 78 74 20 73 74 72 75 63 74 75 72 65 20  ntext structure 
b8b0: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69  passed as the fi
b8c0: 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  rst argument..*/
b8d0: 0a 73 74 61 74 69 63 20 54 63 6c 5f 4f 62 6a 20  .static Tcl_Obj 
b8e0: 2a 64 62 45 76 61 6c 43 6f 6c 75 6d 6e 56 61 6c  *dbEvalColumnVal
b8f0: 75 65 28 44 62 45 76 61 6c 43 6f 6e 74 65 78 74  ue(DbEvalContext
b900: 20 2a 70 2c 20 69 6e 74 20 69 43 6f 6c 29 7b 0a   *p, int iCol){.
b910: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
b920: 70 53 74 6d 74 20 3d 20 70 2d 3e 70 50 72 65 53  pStmt = p->pPreS
b930: 74 6d 74 2d 3e 70 53 74 6d 74 3b 0a 20 20 73 77  tmt->pStmt;.  sw
b940: 69 74 63 68 28 20 73 71 6c 69 74 65 33 5f 63 6f  itch( sqlite3_co
b950: 6c 75 6d 6e 5f 74 79 70 65 28 70 53 74 6d 74 2c  lumn_type(pStmt,
b960: 20 69 43 6f 6c 29 20 29 7b 0a 20 20 20 20 63 61   iCol) ){.    ca
b970: 73 65 20 53 51 4c 49 54 45 5f 42 4c 4f 42 3a 20  se SQLITE_BLOB: 
b980: 7b 0a 20 20 20 20 20 20 69 6e 74 20 62 79 74 65  {.      int byte
b990: 73 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  s = sqlite3_colu
b9a0: 6d 6e 5f 62 79 74 65 73 28 70 53 74 6d 74 2c 20  mn_bytes(pStmt, 
b9b0: 69 43 6f 6c 29 3b 0a 20 20 20 20 20 20 63 6f 6e  iCol);.      con
b9c0: 73 74 20 63 68 61 72 20 2a 7a 42 6c 6f 62 20 3d  st char *zBlob =
b9d0: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
b9e0: 62 6c 6f 62 28 70 53 74 6d 74 2c 20 69 43 6f 6c  blob(pStmt, iCol
b9f0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 7a 42  );.      if( !zB
ba00: 6c 6f 62 20 29 20 62 79 74 65 73 20 3d 20 30 3b  lob ) bytes = 0;
ba10: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 63  .      return Tc
ba20: 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62  l_NewByteArrayOb
ba30: 6a 28 28 75 38 2a 29 7a 42 6c 6f 62 2c 20 62 79  j((u8*)zBlob, by
ba40: 74 65 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  tes);.    }.    
ba50: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 54 45  case SQLITE_INTE
ba60: 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  GER: {.      sql
ba70: 69 74 65 5f 69 6e 74 36 34 20 76 20 3d 20 73 71  ite_int64 v = sq
ba80: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
ba90: 36 34 28 70 53 74 6d 74 2c 20 69 43 6f 6c 29 3b  64(pStmt, iCol);
baa0: 0a 20 20 20 20 20 20 69 66 28 20 76 3e 3d 2d 32  .      if( v>=-2
bab0: 31 34 37 34 38 33 36 34 37 20 26 26 20 76 3c 3d  147483647 && v<=
bac0: 32 31 34 37 34 38 33 36 34 37 20 29 7b 0a 20 20  2147483647 ){.  
bad0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 63 6c        return Tcl
bae0: 5f 4e 65 77 49 6e 74 4f 62 6a 28 76 29 3b 0a 20  _NewIntObj(v);. 
baf0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
bb00: 20 20 20 20 72 65 74 75 72 6e 20 54 63 6c 5f 4e      return Tcl_N
bb10: 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 76 29 3b  ewWideIntObj(v);
bb20: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
bb30: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
bb40: 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20 72 65  LOAT: {.      re
bb50: 74 75 72 6e 20 54 63 6c 5f 4e 65 77 44 6f 75 62  turn Tcl_NewDoub
bb60: 6c 65 4f 62 6a 28 73 71 6c 69 74 65 33 5f 63 6f  leObj(sqlite3_co
bb70: 6c 75 6d 6e 5f 64 6f 75 62 6c 65 28 70 53 74 6d  lumn_double(pStm
bb80: 74 2c 20 69 43 6f 6c 29 29 3b 0a 20 20 20 20 7d  t, iCol));.    }
bb90: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
bba0: 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 72  _NULL: {.      r
bbb0: 65 74 75 72 6e 20 64 62 54 65 78 74 54 6f 4f 62  eturn dbTextToOb
bbc0: 6a 28 70 2d 3e 70 44 62 2d 3e 7a 4e 75 6c 6c 29  j(p->pDb->zNull)
bbd0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
bbe0: 65 74 75 72 6e 20 64 62 54 65 78 74 54 6f 4f 62  eturn dbTextToOb
bbf0: 6a 28 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  j((char *)sqlite
bc00: 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53  3_column_text(pS
bc10: 74 6d 74 2c 20 69 43 6f 6c 29 29 3b 0a 7d 0a 0a  tmt, iCol));.}..
bc20: 2f 2a 0a 2a 2a 20 49 66 20 75 73 69 6e 67 20 54  /*.** If using T
bc30: 63 6c 20 76 65 72 73 69 6f 6e 20 38 2e 36 20 6f  cl version 8.6 o
bc40: 72 20 67 72 65 61 74 65 72 2c 20 75 73 65 20 74  r greater, use t
bc50: 68 65 20 4e 52 20 66 75 6e 63 74 69 6f 6e 73 20  he NR functions 
bc60: 74 6f 20 61 76 6f 69 64 0a 2a 2a 20 72 65 63 75  to avoid.** recu
bc70: 72 73 69 76 65 20 65 76 61 6c 75 74 69 6f 6e 20  rsive evalution 
bc80: 6f 66 20 73 63 72 69 70 74 73 20 62 79 20 74 68  of scripts by th
bc90: 65 20 5b 64 62 20 65 76 61 6c 5d 20 61 6e 64 20  e [db eval] and 
bca0: 5b 64 62 20 74 72 61 6e 73 5d 0a 2a 2a 20 63 6f  [db trans].** co
bcb0: 6d 6d 61 6e 64 73 2e 20 45 76 65 6e 20 69 66 20  mmands. Even if 
bcc0: 74 68 65 20 68 65 61 64 65 72 73 20 75 73 65 64  the headers used
bcd0: 20 77 68 69 6c 65 20 63 6f 6d 70 69 6c 69 6e 67   while compiling
bce0: 20 74 68 65 20 65 78 74 65 6e 73 69 6f 6e 0a 2a   the extension.*
bcf0: 2a 20 61 72 65 20 38 2e 36 20 6f 72 20 6e 65 77  * are 8.6 or new
bd00: 65 72 2c 20 74 68 65 20 63 6f 64 65 20 73 74 69  er, the code sti
bd10: 6c 6c 20 74 65 73 74 73 20 74 68 65 20 54 63 6c  ll tests the Tcl
bd20: 20 76 65 72 73 69 6f 6e 20 61 74 20 72 75 6e 74   version at runt
bd30: 69 6d 65 2e 0a 2a 2a 20 54 68 69 73 20 61 6c 6c  ime..** This all
bd40: 6f 77 73 20 73 74 75 62 73 2d 65 6e 61 62 6c 65  ows stubs-enable
bd50: 64 20 62 75 69 6c 64 73 20 74 6f 20 62 65 20 75  d builds to be u
bd60: 73 65 64 20 77 69 74 68 20 6f 6c 64 65 72 20 54  sed with older T
bd70: 63 6c 20 6c 69 62 72 61 72 69 65 73 2e 0a 2a 2f  cl libraries..*/
bd80: 0a 23 69 66 20 54 43 4c 5f 4d 41 4a 4f 52 5f 56  .#if TCL_MAJOR_V
bd90: 45 52 53 49 4f 4e 3e 38 20 7c 7c 20 28 54 43 4c  ERSION>8 || (TCL
bda0: 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f 4e 3d 3d  _MAJOR_VERSION==
bdb0: 38 20 26 26 20 54 43 4c 5f 4d 49 4e 4f 52 5f 56  8 && TCL_MINOR_V
bdc0: 45 52 53 49 4f 4e 3e 3d 36 29 0a 23 20 64 65 66  ERSION>=6).# def
bdd0: 69 6e 65 20 53 51 4c 49 54 45 5f 54 43 4c 5f 4e  ine SQLITE_TCL_N
bde0: 52 45 20 31 0a 73 74 61 74 69 63 20 69 6e 74 20  RE 1.static int 
bdf0: 44 62 55 73 65 4e 72 65 28 76 6f 69 64 29 7b 0a  DbUseNre(void){.
be00: 20 20 69 6e 74 20 6d 61 6a 6f 72 2c 20 6d 69 6e    int major, min
be10: 6f 72 3b 0a 20 20 54 63 6c 5f 47 65 74 56 65 72  or;.  Tcl_GetVer
be20: 73 69 6f 6e 28 26 6d 61 6a 6f 72 2c 20 26 6d 69  sion(&major, &mi
be30: 6e 6f 72 2c 20 30 2c 20 30 29 3b 0a 20 20 72 65  nor, 0, 0);.  re
be40: 74 75 72 6e 28 20 28 6d 61 6a 6f 72 3d 3d 38 20  turn( (major==8 
be50: 26 26 20 6d 69 6e 6f 72 3e 3d 36 29 20 7c 7c 20  && minor>=6) || 
be60: 6d 61 6a 6f 72 3e 38 20 29 3b 0a 7d 0a 23 65 6c  major>8 );.}.#el
be70: 73 65 0a 2f 2a 20 0a 2a 2a 20 43 6f 6d 70 69 6c  se./* .** Compil
be80: 69 6e 67 20 75 73 69 6e 67 20 68 65 61 64 65 72  ing using header
be90: 73 20 65 61 72 6c 69 65 72 20 74 68 61 6e 20 38  s earlier than 8
bea0: 2e 36 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  .6. In this case
beb0: 20 4e 52 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a   NR cannot be.**
bec0: 20 75 73 65 64 2c 20 73 6f 20 44 62 55 73 65 4e   used, so DbUseN
bed0: 72 65 28 29 20 74 6f 20 61 6c 77 61 79 73 20 72  re() to always r
bee0: 65 74 75 72 6e 20 7a 65 72 6f 2e 20 41 64 64 20  eturn zero. Add 
bef0: 23 64 65 66 69 6e 65 73 20 66 6f 72 20 74 68 65  #defines for the
bf00: 20 6f 74 68 65 72 0a 2a 2a 20 54 63 6c 5f 4e 52   other.** Tcl_NR
bf10: 78 78 78 28 29 20 66 75 6e 63 74 69 6f 6e 73 20  xxx() functions 
bf20: 74 6f 20 70 72 65 76 65 6e 74 20 74 68 65 6d 20  to prevent them 
bf30: 66 72 6f 6d 20 63 61 75 73 69 6e 67 20 63 6f 6d  from causing com
bf40: 70 69 6c 61 74 69 6f 6e 20 65 72 72 6f 72 73 2c  pilation errors,
bf50: 0a 2a 2a 20 65 76 65 6e 20 74 68 6f 75 67 68 20  .** even though 
bf60: 74 68 65 20 6f 6e 6c 79 20 69 6e 76 6f 63 61 74  the only invocat
bf70: 69 6f 6e 73 20 6f 66 20 74 68 65 6d 20 61 72 65  ions of them are
bf80: 20 77 69 74 68 69 6e 20 63 6f 6e 64 69 74 69 6f   within conditio
bf90: 6e 61 6c 20 62 6c 6f 63 6b 73 20 0a 2a 2a 20 6f  nal blocks .** o
bfa0: 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a  f the form:.**.*
bfb0: 2a 20 20 20 69 66 28 20 44 62 55 73 65 4e 72 65  *   if( DbUseNre
bfc0: 28 29 20 29 20 7b 20 2e 2e 2e 20 7d 0a 2a 2f 0a  () ) { ... }.*/.
bfd0: 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f  # define SQLITE_
bfe0: 54 43 4c 5f 4e 52 45 20 30 0a 23 20 64 65 66 69  TCL_NRE 0.# defi
bff0: 6e 65 20 44 62 55 73 65 4e 72 65 28 29 20 30 0a  ne DbUseNre() 0.
c000: 23 20 64 65 66 69 6e 65 20 54 63 6c 5f 4e 52 41  # define Tcl_NRA
c010: 64 64 43 61 6c 6c 62 61 63 6b 28 61 2c 62 2c 63  ddCallback(a,b,c
c020: 2c 64 2c 65 2c 66 29 20 30 0a 23 20 64 65 66 69  ,d,e,f) 0.# defi
c030: 6e 65 20 54 63 6c 5f 4e 52 45 76 61 6c 4f 62 6a  ne Tcl_NREvalObj
c040: 28 61 2c 62 2c 63 29 20 30 0a 23 20 64 65 66 69  (a,b,c) 0.# defi
c050: 6e 65 20 54 63 6c 5f 4e 52 43 72 65 61 74 65 43  ne Tcl_NRCreateC
c060: 6f 6d 6d 61 6e 64 28 61 2c 62 2c 63 2c 64 2c 65  ommand(a,b,c,d,e
c070: 2c 66 29 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ,f) 0.#endif../*
c080: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
c090: 6e 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65  n is part of the
c0a0: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
c0b0: 6f 66 20 74 68 65 20 63 6f 6d 6d 61 6e 64 3a 0a  of the command:.
c0c0: 2a 2a 0a 2a 2a 20 20 20 24 64 62 20 65 76 61 6c  **.**   $db eval
c0d0: 20 53 51 4c 20 3f 41 52 52 41 59 4e 41 4d 45 3f   SQL ?ARRAYNAME?
c0e0: 20 53 43 52 49 50 54 0a 2a 2f 0a 73 74 61 74 69   SCRIPT.*/.stati
c0f0: 63 20 69 6e 74 20 44 62 45 76 61 6c 4e 65 78 74  c int DbEvalNext
c100: 43 6d 64 28 0a 20 20 43 6c 69 65 6e 74 44 61 74  Cmd(.  ClientDat
c110: 61 20 64 61 74 61 5b 5d 2c 20 20 20 20 20 20 20  a data[],       
c120: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64              /* d
c130: 61 74 61 5b 30 5d 20 69 73 20 74 68 65 20 28 44  ata[0] is the (D
c140: 62 45 76 61 6c 43 6f 6e 74 65 78 74 2a 29 20 2a  bEvalContext*) *
c150: 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  /.  Tcl_Interp *
c160: 69 6e 74 65 72 70 2c 20 20 20 20 20 20 20 20 20  interp,         
c170: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 63 6c 20           /* Tcl 
c180: 69 6e 74 65 72 70 72 65 74 65 72 20 2a 2f 0a 20  interpreter */. 
c190: 20 69 6e 74 20 72 65 73 75 6c 74 20 20 20 20 20   int result     
c1a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c1b0: 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
c1c0: 73 6f 20 66 61 72 20 2a 2f 0a 29 7b 0a 20 20 69  so far */.){.  i
c1d0: 6e 74 20 72 63 20 3d 20 72 65 73 75 6c 74 3b 20  nt rc = result; 
c1e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c1f0: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
c200: 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20  de */..  /* The 
c210: 66 69 72 73 74 20 65 6c 65 6d 65 6e 74 20 6f 66  first element of
c220: 20 74 68 65 20 64 61 74 61 5b 5d 20 61 72 72 61   the data[] arra
c230: 79 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  y is a pointer t
c240: 6f 20 61 20 44 62 45 76 61 6c 43 6f 6e 74 65 78  o a DbEvalContex
c250: 74 0a 20 20 2a 2a 20 73 74 72 75 63 74 75 72 65  t.  ** structure
c260: 20 61 6c 6c 6f 63 61 74 65 64 20 75 73 69 6e 67   allocated using
c270: 20 54 63 6c 5f 41 6c 6c 6f 63 28 29 2e 20 54 68   Tcl_Alloc(). Th
c280: 65 20 73 65 63 6f 6e 64 20 65 6c 65 6d 65 6e 74  e second element
c290: 20 6f 66 20 64 61 74 61 5b 5d 0a 20 20 2a 2a 20   of data[].  ** 
c2a0: 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
c2b0: 61 20 54 63 6c 5f 4f 62 6a 20 63 6f 6e 74 61 69  a Tcl_Obj contai
c2c0: 6e 69 6e 67 20 74 68 65 20 73 63 72 69 70 74 20  ning the script 
c2d0: 74 6f 20 72 75 6e 20 66 6f 72 20 65 61 63 68 20  to run for each 
c2e0: 72 6f 77 0a 20 20 2a 2a 20 72 65 74 75 72 6e 65  row.  ** returne
c2f0: 64 20 62 79 20 74 68 65 20 71 75 65 72 69 65 73  d by the queries
c300: 20 65 6e 63 61 70 73 75 6c 61 74 65 64 20 69 6e   encapsulated in
c310: 20 64 61 74 61 5b 30 5d 2e 20 2a 2f 0a 20 20 44   data[0]. */.  D
c320: 62 45 76 61 6c 43 6f 6e 74 65 78 74 20 2a 70 20  bEvalContext *p 
c330: 3d 20 28 44 62 45 76 61 6c 43 6f 6e 74 65 78 74  = (DbEvalContext
c340: 20 2a 29 64 61 74 61 5b 30 5d 3b 0a 20 20 54 63   *)data[0];.  Tc
c350: 6c 5f 4f 62 6a 20 2a 70 53 63 72 69 70 74 20 3d  l_Obj *pScript =
c360: 20 28 54 63 6c 5f 4f 62 6a 20 2a 29 64 61 74 61   (Tcl_Obj *)data
c370: 5b 31 5d 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  [1];.  Tcl_Obj *
c380: 70 41 72 72 61 79 20 3d 20 70 2d 3e 70 41 72 72  pArray = p->pArr
c390: 61 79 3b 0a 0a 20 20 77 68 69 6c 65 28 20 28 72  ay;..  while( (r
c3a0: 63 3d 3d 54 43 4c 5f 4f 4b 20 7c 7c 20 72 63 3d  c==TCL_OK || rc=
c3b0: 3d 54 43 4c 5f 43 4f 4e 54 49 4e 55 45 29 20 26  =TCL_CONTINUE) &
c3c0: 26 20 54 43 4c 5f 4f 4b 3d 3d 28 72 63 20 3d 20  & TCL_OK==(rc = 
c3d0: 64 62 45 76 61 6c 53 74 65 70 28 70 29 29 20 29  dbEvalStep(p)) )
c3e0: 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
c3f0: 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 20 20 54   int nCol;.    T
c400: 63 6c 5f 4f 62 6a 20 2a 2a 61 70 43 6f 6c 4e 61  cl_Obj **apColNa
c410: 6d 65 3b 0a 20 20 20 20 64 62 45 76 61 6c 52 6f  me;.    dbEvalRo
c420: 77 49 6e 66 6f 28 70 2c 20 26 6e 43 6f 6c 2c 20  wInfo(p, &nCol, 
c430: 26 61 70 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 20  &apColName);.   
c440: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c   for(i=0; i<nCol
c450: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 54 63  ; i++){.      Tc
c460: 6c 5f 4f 62 6a 20 2a 70 56 61 6c 20 3d 20 64 62  l_Obj *pVal = db
c470: 45 76 61 6c 43 6f 6c 75 6d 6e 56 61 6c 75 65 28  EvalColumnValue(
c480: 70 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28  p, i);.      if(
c490: 20 70 41 72 72 61 79 3d 3d 30 20 29 7b 0a 20 20   pArray==0 ){.  
c4a0: 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 53 65 74        Tcl_ObjSet
c4b0: 56 61 72 32 28 69 6e 74 65 72 70 2c 20 61 70 43  Var2(interp, apC
c4c0: 6f 6c 4e 61 6d 65 5b 69 5d 2c 20 30 2c 20 70 56  olName[i], 0, pV
c4d0: 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 65  al, 0);.      }e
c4e0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 54 63 6c  lse{.        Tcl
c4f0: 5f 4f 62 6a 53 65 74 56 61 72 32 28 69 6e 74 65  _ObjSetVar2(inte
c500: 72 70 2c 20 70 41 72 72 61 79 2c 20 61 70 43 6f  rp, pArray, apCo
c510: 6c 4e 61 6d 65 5b 69 5d 2c 20 70 56 61 6c 2c 20  lName[i], pVal, 
c520: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
c530: 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65  }..    /* The re
c540: 71 75 69 72 65 64 20 69 6e 74 65 72 70 72 65 74  quired interpret
c550: 65 72 20 76 61 72 69 61 62 6c 65 73 20 61 72 65  er variables are
c560: 20 6e 6f 77 20 70 6f 70 75 6c 61 74 65 64 20 77   now populated w
c570: 69 74 68 20 74 68 65 20 64 61 74 61 20 0a 20 20  ith the data .  
c580: 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 63 75    ** from the cu
c590: 72 72 65 6e 74 20 72 6f 77 2e 20 49 66 20 75 73  rrent row. If us
c5a0: 69 6e 67 20 4e 52 45 2c 20 73 63 68 65 64 75 6c  ing NRE, schedul
c5b0: 65 20 63 61 6c 6c 62 61 63 6b 73 20 74 6f 20 65  e callbacks to e
c5c0: 76 61 6c 75 61 74 65 0a 20 20 20 20 2a 2a 20 73  valuate.    ** s
c5d0: 63 72 69 70 74 20 70 53 63 72 69 70 74 2c 20 74  cript pScript, t
c5e0: 68 65 6e 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68  hen to invoke th
c5f0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 67 61 69  is function agai
c600: 6e 20 74 6f 20 66 65 74 63 68 20 74 68 65 20 6e  n to fetch the n
c610: 65 78 74 0a 20 20 20 20 2a 2a 20 72 6f 77 20 28  ext.    ** row (
c620: 6f 72 20 63 6c 65 61 6e 20 75 70 20 69 66 20 74  or clean up if t
c630: 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 78 74 20  here is no next 
c640: 72 6f 77 20 6f 72 20 74 68 65 20 73 63 72 69 70  row or the scrip
c650: 74 20 74 68 72 6f 77 73 20 61 6e 0a 20 20 20 20  t throws an.    
c660: 2a 2a 20 65 78 63 65 70 74 69 6f 6e 29 2e 20 41  ** exception). A
c670: 66 74 65 72 20 73 63 68 65 64 75 6c 69 6e 67 20  fter scheduling 
c680: 74 68 65 20 63 61 6c 6c 62 61 63 6b 73 2c 20 72  the callbacks, r
c690: 65 74 75 72 6e 20 63 6f 6e 74 72 6f 6c 20 74 6f  eturn control to
c6a0: 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 63 61 6c   the .    ** cal
c6b0: 6c 65 72 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ler..    **.    
c6c0: 2a 2a 20 49 66 20 6e 6f 74 20 75 73 69 6e 67 20  ** If not using 
c6d0: 4e 52 45 2c 20 65 76 61 6c 75 61 74 65 20 70 53  NRE, evaluate pS
c6e0: 63 72 69 70 74 20 64 69 72 65 63 74 6c 79 20 61  cript directly a
c6f0: 6e 64 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68  nd continue with
c700: 20 74 68 65 0a 20 20 20 20 2a 2a 20 6e 65 78 74   the.    ** next
c710: 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68   iteration of th
c720: 69 73 20 77 68 69 6c 65 28 2e 2e 2e 29 20 6c 6f  is while(...) lo
c730: 6f 70 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  op.  */.    if( 
c740: 44 62 55 73 65 4e 72 65 28 29 20 29 7b 0a 20 20  DbUseNre() ){.  
c750: 20 20 20 20 54 63 6c 5f 4e 52 41 64 64 43 61 6c      Tcl_NRAddCal
c760: 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 44 62  lback(interp, Db
c770: 45 76 61 6c 4e 65 78 74 43 6d 64 2c 20 28 76 6f  EvalNextCmd, (vo
c780: 69 64 2a 29 70 2c 20 28 76 6f 69 64 2a 29 70 53  id*)p, (void*)pS
c790: 63 72 69 70 74 2c 20 30 2c 20 30 29 3b 0a 20 20  cript, 0, 0);.  
c7a0: 20 20 20 20 72 65 74 75 72 6e 20 54 63 6c 5f 4e      return Tcl_N
c7b0: 52 45 76 61 6c 4f 62 6a 28 69 6e 74 65 72 70 2c  REvalObj(interp,
c7c0: 20 70 53 63 72 69 70 74 2c 20 30 29 3b 0a 20 20   pScript, 0);.  
c7d0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
c7e0: 63 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45  c = Tcl_EvalObjE
c7f0: 78 28 69 6e 74 65 72 70 2c 20 70 53 63 72 69 70  x(interp, pScrip
c800: 74 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  t, 0);.    }.  }
c810: 0a 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43  ..  Tcl_DecrRefC
c820: 6f 75 6e 74 28 70 53 63 72 69 70 74 29 3b 0a 20  ount(pScript);. 
c830: 20 64 62 45 76 61 6c 46 69 6e 61 6c 69 7a 65 28   dbEvalFinalize(
c840: 70 29 3b 0a 20 20 54 63 6c 5f 46 72 65 65 28 28  p);.  Tcl_Free((
c850: 63 68 61 72 20 2a 29 70 29 3b 0a 0a 20 20 69 66  char *)p);..  if
c860: 28 20 72 63 3d 3d 54 43 4c 5f 4f 4b 20 7c 7c 20  ( rc==TCL_OK || 
c870: 72 63 3d 3d 54 43 4c 5f 42 52 45 41 4b 20 29 7b  rc==TCL_BREAK ){
c880: 0a 20 20 20 20 54 63 6c 5f 52 65 73 65 74 52 65  .    Tcl_ResetRe
c890: 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  sult(interp);.  
c8a0: 20 20 72 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20    rc = TCL_OK;. 
c8b0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
c8c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
c8d0: 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 62  nction is used b
c8e0: 79 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  y the implementa
c8f0: 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 66 6f 6c  tions of the fol
c900: 6c 6f 77 69 6e 67 20 64 61 74 61 62 61 73 65 20  lowing database 
c910: 0a 2a 2a 20 68 61 6e 64 6c 65 20 73 75 62 2d 63  .** handle sub-c
c920: 6f 6d 6d 61 6e 64 73 3a 0a 2a 2a 0a 2a 2a 20 20  ommands:.**.**  
c930: 20 24 64 62 20 75 70 64 61 74 65 5f 68 6f 6f 6b   $db update_hook
c940: 20 3f 53 43 52 49 50 54 3f 0a 2a 2a 20 20 20 24   ?SCRIPT?.**   $
c950: 64 62 20 77 61 6c 5f 68 6f 6f 6b 20 3f 53 43 52  db wal_hook ?SCR
c960: 49 50 54 3f 0a 2a 2a 20 20 20 24 64 62 20 63 6f  IPT?.**   $db co
c970: 6d 6d 69 74 5f 68 6f 6f 6b 20 3f 53 43 52 49 50  mmit_hook ?SCRIP
c980: 54 3f 0a 2a 2a 20 20 20 24 64 62 20 70 72 65 75  T?.**   $db preu
c990: 70 64 61 74 65 20 68 6f 6f 6b 20 3f 53 43 52 49  pdate hook ?SCRI
c9a0: 50 54 3f 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  PT?.*/.static vo
c9b0: 69 64 20 44 62 48 6f 6f 6b 43 6d 64 28 0a 20 20  id DbHookCmd(.  
c9c0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
c9d0: 72 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  rp,             
c9e0: 2f 2a 20 54 63 6c 20 69 6e 74 65 72 70 72 65 74  /* Tcl interpret
c9f0: 65 72 20 2a 2f 0a 20 20 53 71 6c 69 74 65 44 62  er */.  SqliteDb
ca00: 20 2a 70 44 62 2c 20 20 20 20 20 20 20 20 20 20   *pDb,          
ca10: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
ca20: 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ase handle */.  
ca30: 54 63 6c 5f 4f 62 6a 20 2a 70 41 72 67 2c 20 20  Tcl_Obj *pArg,  
ca40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca50: 2f 2a 20 53 43 52 49 50 54 20 61 72 67 75 6d 65  /* SCRIPT argume
ca60: 6e 74 20 28 6f 72 20 4e 55 4c 4c 29 20 2a 2f 0a  nt (or NULL) */.
ca70: 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 70 70 48 6f    Tcl_Obj **ppHo
ca80: 6f 6b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ok              
ca90: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
caa0: 6d 65 6d 62 65 72 20 6f 66 20 53 71 6c 69 74 65  member of Sqlite
cab0: 44 62 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  Db */.){.  sqlit
cac0: 65 33 20 2a 64 62 20 3d 20 70 44 62 2d 3e 64 62  e3 *db = pDb->db
cad0: 3b 0a 0a 20 20 69 66 28 20 2a 70 70 48 6f 6f 6b  ;..  if( *ppHook
cae0: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f   ){.    Tcl_SetO
caf0: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
cb00: 20 2a 70 70 48 6f 6f 6b 29 3b 0a 20 20 20 20 69   *ppHook);.    i
cb10: 66 28 20 70 41 72 67 20 29 7b 0a 20 20 20 20 20  f( pArg ){.     
cb20: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
cb30: 74 28 2a 70 70 48 6f 6f 6b 29 3b 0a 20 20 20 20  t(*ppHook);.    
cb40: 20 20 2a 70 70 48 6f 6f 6b 20 3d 20 30 3b 0a 20    *ppHook = 0;. 
cb50: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
cb60: 41 72 67 20 29 7b 0a 20 20 20 20 61 73 73 65 72  Arg ){.    asser
cb70: 74 28 20 21 28 2a 70 70 48 6f 6f 6b 29 20 29 3b  t( !(*ppHook) );
cb80: 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74  .    if( Tcl_Get
cb90: 43 68 61 72 4c 65 6e 67 74 68 28 70 41 72 67 29  CharLength(pArg)
cba0: 3e 30 20 29 7b 0a 20 20 20 20 20 20 2a 70 70 48  >0 ){.      *ppH
cbb0: 6f 6f 6b 20 3d 20 70 41 72 67 3b 0a 20 20 20 20  ook = pArg;.    
cbc0: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
cbd0: 6e 74 28 2a 70 70 48 6f 6f 6b 29 3b 0a 20 20 20  nt(*ppHook);.   
cbe0: 20 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65   }.  }..  sqlite
cbf0: 33 5f 70 72 65 75 70 64 61 74 65 5f 68 6f 6f 6b  3_preupdate_hook
cc00: 28 64 62 2c 20 28 70 44 62 2d 3e 70 50 72 65 55  (db, (pDb->pPreU
cc10: 70 64 61 74 65 48 6f 6f 6b 3f 44 62 50 72 65 55  pdateHook?DbPreU
cc20: 70 64 61 74 65 48 61 6e 64 6c 65 72 3a 30 29 2c  pdateHandler:0),
cc30: 20 70 44 62 29 3b 0a 20 20 73 71 6c 69 74 65 33   pDb);.  sqlite3
cc40: 5f 75 70 64 61 74 65 5f 68 6f 6f 6b 28 64 62 2c  _update_hook(db,
cc50: 20 28 70 44 62 2d 3e 70 55 70 64 61 74 65 48 6f   (pDb->pUpdateHo
cc60: 6f 6b 3f 44 62 55 70 64 61 74 65 48 61 6e 64 6c  ok?DbUpdateHandl
cc70: 65 72 3a 30 29 2c 20 70 44 62 29 3b 0a 20 20 73  er:0), pDb);.  s
cc80: 71 6c 69 74 65 33 5f 72 6f 6c 6c 62 61 63 6b 5f  qlite3_rollback_
cc90: 68 6f 6f 6b 28 64 62 2c 20 28 70 44 62 2d 3e 70  hook(db, (pDb->p
cca0: 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 3f 44 62 52  RollbackHook?DbR
ccb0: 6f 6c 6c 62 61 63 6b 48 61 6e 64 6c 65 72 3a 30  ollbackHandler:0
ccc0: 29 2c 20 70 44 62 29 3b 0a 20 20 73 71 6c 69 74  ), pDb);.  sqlit
ccd0: 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 64 62 2c 20  e3_wal_hook(db, 
cce0: 28 70 44 62 2d 3e 70 57 61 6c 48 6f 6f 6b 3f 44  (pDb->pWalHook?D
ccf0: 62 57 61 6c 48 61 6e 64 6c 65 72 3a 30 29 2c 20  bWalHandler:0), 
cd00: 70 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  pDb);.}../*.** T
cd10: 68 65 20 22 73 71 6c 69 74 65 22 20 63 6f 6d 6d  he "sqlite" comm
cd20: 61 6e 64 20 62 65 6c 6f 77 20 63 72 65 61 74 65  and below create
cd30: 73 20 61 20 6e 65 77 20 54 63 6c 20 63 6f 6d 6d  s a new Tcl comm
cd40: 61 6e 64 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20  and for each.** 
cd50: 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 74 20 6f 70  connection it op
cd60: 65 6e 73 20 74 6f 20 61 6e 20 53 51 4c 69 74 65  ens to an SQLite
cd70: 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 69 73   database.  This
cd80: 20 72 6f 75 74 69 6e 65 20 69 73 20 69 6e 76 6f   routine is invo
cd90: 6b 65 64 0a 2a 2a 20 77 68 65 6e 65 76 65 72 20  ked.** whenever 
cda0: 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20 63 6f 6e  one of those con
cdb0: 6e 65 63 74 69 6f 6e 2d 73 70 65 63 69 66 69 63  nection-specific
cdc0: 20 63 6f 6d 6d 61 6e 64 73 20 69 73 20 65 78 65   commands is exe
cdd0: 63 75 74 65 64 0a 2a 2a 20 69 6e 20 54 63 6c 2e  cuted.** in Tcl.
cde0: 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69    For example, i
cdf0: 66 20 79 6f 75 20 72 75 6e 20 54 63 6c 20 63 6f  f you run Tcl co
ce00: 64 65 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a  de like this:.**
ce10: 0a 2a 2a 20 20 20 20 20 20 20 73 71 6c 69 74 65  .**       sqlite
ce20: 33 20 64 62 31 20 20 22 6d 79 5f 64 61 74 61 62  3 db1  "my_datab
ce30: 61 73 65 22 0a 2a 2a 20 20 20 20 20 20 20 64 62  ase".**       db
ce40: 31 20 63 6c 6f 73 65 0a 2a 2a 0a 2a 2a 20 54 68  1 close.**.** Th
ce50: 65 20 66 69 72 73 74 20 63 6f 6d 6d 61 6e 64 20  e first command 
ce60: 6f 70 65 6e 73 20 61 20 63 6f 6e 6e 65 63 74 69  opens a connecti
ce70: 6f 6e 20 74 6f 20 74 68 65 20 22 6d 79 5f 64 61  on to the "my_da
ce80: 74 61 62 61 73 65 22 20 64 61 74 61 62 61 73 65  tabase" database
ce90: 0a 2a 2a 20 61 6e 64 20 63 61 6c 6c 73 20 74 68  .** and calls th
cea0: 61 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 22 64  at connection "d
ceb0: 62 31 22 2e 20 20 54 68 65 20 73 65 63 6f 6e 64  b1".  The second
cec0: 20 63 6f 6d 6d 61 6e 64 20 63 61 75 73 65 73 20   command causes 
ced0: 74 68 69 73 0a 2a 2a 20 73 75 62 72 6f 75 74 69  this.** subrouti
cee0: 6e 65 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64  ne to be invoked
cef0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
cf00: 44 62 4f 62 6a 43 6d 64 28 76 6f 69 64 20 2a 63  DbObjCmd(void *c
cf10: 64 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  d, Tcl_Interp *i
cf20: 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c  nterp, int objc,
cf30: 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 2a 6f  Tcl_Obj *const*o
cf40: 62 6a 76 29 7b 0a 20 20 53 71 6c 69 74 65 44 62  bjv){.  SqliteDb
cf50: 20 2a 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44   *pDb = (SqliteD
cf60: 62 2a 29 63 64 3b 0a 20 20 69 6e 74 20 63 68 6f  b*)cd;.  int cho
cf70: 69 63 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ice;.  int rc = 
cf80: 54 43 4c 5f 4f 4b 3b 0a 20 20 73 74 61 74 69 63  TCL_OK;.  static
cf90: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 44 42 5f   const char *DB_
cfa0: 73 74 72 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 22  strs[] = {.    "
cfb0: 61 75 74 68 6f 72 69 7a 65 72 22 2c 20 20 20 20  authorizer",    
cfc0: 20 20 20 20 20 22 62 61 63 6b 75 70 22 2c 20 20       "backup",  
cfd0: 20 20 20 20 20 20 20 20 20 20 22 62 75 73 79 22            "busy"
cfe0: 2c 0a 20 20 20 20 22 63 61 63 68 65 22 2c 20 20  ,.    "cache",  
cff0: 20 20 20 20 20 20 20 20 20 20 20 20 22 63 68 61              "cha
d000: 6e 67 65 73 22 2c 20 20 20 20 20 20 20 20 20 20  nges",          
d010: 20 22 63 6c 6f 73 65 22 2c 0a 20 20 20 20 22 63   "close",.    "c
d020: 6f 6c 6c 61 74 65 22 2c 20 20 20 20 20 20 20 20  ollate",        
d030: 20 20 20 20 22 63 6f 6c 6c 61 74 69 6f 6e 5f 6e      "collation_n
d040: 65 65 64 65 64 22 2c 20 20 22 63 6f 6d 6d 69 74  eeded",  "commit
d050: 5f 68 6f 6f 6b 22 2c 0a 20 20 20 20 22 63 6f 6d  _hook",.    "com
d060: 70 6c 65 74 65 22 2c 20 20 20 20 20 20 20 20 20  plete",         
d070: 20 20 22 63 6f 70 79 22 2c 20 20 20 20 20 20 20    "copy",       
d080: 20 20 20 20 20 20 20 22 65 6e 61 62 6c 65 5f 6c         "enable_l
d090: 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e 22 2c 0a  oad_extension",.
d0a0: 20 20 20 20 22 65 72 72 6f 72 63 6f 64 65 22 2c      "errorcode",
d0b0: 20 20 20 20 20 20 20 20 20 20 22 65 76 61 6c 22            "eval"
d0c0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  ,              "
d0d0: 65 78 69 73 74 73 22 2c 0a 20 20 20 20 22 66 75  exists",.    "fu
d0e0: 6e 63 74 69 6f 6e 22 2c 20 20 20 20 20 20 20 20  nction",        
d0f0: 20 20 20 22 69 6e 63 72 62 6c 6f 62 22 2c 20 20     "incrblob",  
d100: 20 20 20 20 20 20 20 20 22 69 6e 74 65 72 72 75          "interru
d110: 70 74 22 2c 0a 20 20 20 20 22 6c 61 73 74 5f 69  pt",.    "last_i
d120: 6e 73 65 72 74 5f 72 6f 77 69 64 22 2c 20 20 22  nsert_rowid",  "
d130: 6e 75 6c 6c 76 61 6c 75 65 22 2c 20 20 20 20 20  nullvalue",     
d140: 20 20 20 20 22 6f 6e 65 63 6f 6c 75 6d 6e 22 2c      "onecolumn",
d150: 0a 20 20 20 20 22 70 72 65 75 70 64 61 74 65 22  .    "preupdate"
d160: 2c 20 20 20 20 20 20 20 20 20 20 22 70 72 6f 66  ,          "prof
d170: 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ile",           
d180: 22 70 72 6f 67 72 65 73 73 22 2c 0a 20 20 20 20  "progress",.    
d190: 22 72 65 6b 65 79 22 2c 20 20 20 20 20 20 20 20  "rekey",        
d1a0: 20 20 20 20 20 20 22 72 65 73 74 6f 72 65 22 2c        "restore",
d1b0: 20 20 20 20 20 20 20 20 20 20 20 22 72 6f 6c 6c             "roll
d1c0: 62 61 63 6b 5f 68 6f 6f 6b 22 2c 0a 20 20 20 20  back_hook",.    
d1d0: 22 73 74 61 74 75 73 22 2c 20 20 20 20 20 20 20  "status",       
d1e0: 20 20 20 20 20 20 22 74 69 6d 65 6f 75 74 22 2c        "timeout",
d1f0: 20 20 20 20 20 20 20 20 20 20 20 22 74 6f 74 61             "tota
d200: 6c 5f 63 68 61 6e 67 65 73 22 2c 0a 20 20 20 20  l_changes",.    
d210: 22 74 72 61 63 65 22 2c 20 20 20 20 20 20 20 20  "trace",        
d220: 20 20 20 20 20 20 22 74 72 61 6e 73 61 63 74 69        "transacti
d230: 6f 6e 22 2c 20 20 20 20 20 20 20 22 75 6e 6c 6f  on",       "unlo
d240: 63 6b 5f 6e 6f 74 69 66 79 22 2c 0a 20 20 20 20  ck_notify",.    
d250: 22 75 70 64 61 74 65 5f 68 6f 6f 6b 22 2c 20 20  "update_hook",  
d260: 20 20 20 20 20 20 22 76 65 72 73 69 6f 6e 22 2c        "version",
d270: 20 20 20 20 20 20 20 20 20 20 20 22 77 61 6c 5f             "wal_
d280: 68 6f 6f 6b 22 2c 0a 20 20 20 20 30 20 20 20 20  hook",.    0    
d290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d2a0: 0a 20 20 7d 3b 0a 20 20 65 6e 75 6d 20 44 42 5f  .  };.  enum DB_
d2b0: 65 6e 75 6d 20 7b 0a 20 20 20 20 44 42 5f 41 55  enum {.    DB_AU
d2c0: 54 48 4f 52 49 5a 45 52 2c 20 20 20 20 20 20 20  THORIZER,       
d2d0: 20 44 42 5f 42 41 43 4b 55 50 2c 20 20 20 20 20   DB_BACKUP,     
d2e0: 20 20 20 20 20 20 44 42 5f 42 55 53 59 2c 0a 20        DB_BUSY,. 
d2f0: 20 20 20 44 42 5f 43 41 43 48 45 2c 20 20 20 20     DB_CACHE,    
d300: 20 20 20 20 20 20 20 20 20 44 42 5f 43 48 41 4e           DB_CHAN
d310: 47 45 53 2c 20 20 20 20 20 20 20 20 20 20 44 42  GES,          DB
d320: 5f 43 4c 4f 53 45 2c 0a 20 20 20 20 44 42 5f 43  _CLOSE,.    DB_C
d330: 4f 4c 4c 41 54 45 2c 20 20 20 20 20 20 20 20 20  OLLATE,         
d340: 20 20 44 42 5f 43 4f 4c 4c 41 54 49 4f 4e 5f 4e    DB_COLLATION_N
d350: 45 45 44 45 44 2c 20 44 42 5f 43 4f 4d 4d 49 54  EEDED, DB_COMMIT
d360: 5f 48 4f 4f 4b 2c 0a 20 20 20 20 44 42 5f 43 4f  _HOOK,.    DB_CO
d370: 4d 50 4c 45 54 45 2c 20 20 20 20 20 20 20 20 20  MPLETE,         
d380: 20 44 42 5f 43 4f 50 59 2c 20 20 20 20 20 20 20   DB_COPY,       
d390: 20 20 20 20 20 20 44 42 5f 45 4e 41 42 4c 45 5f        DB_ENABLE_
d3a0: 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 2c 0a  LOAD_EXTENSION,.
d3b0: 20 20 20 20 44 42 5f 45 52 52 4f 52 43 4f 44 45      DB_ERRORCODE
d3c0: 2c 20 20 20 20 20 20 20 20 20 44 42 5f 45 56 41  ,         DB_EVA
d3d0: 4c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 44  L,             D
d3e0: 42 5f 45 58 49 53 54 53 2c 0a 20 20 20 20 44 42  B_EXISTS,.    DB
d3f0: 5f 46 55 4e 43 54 49 4f 4e 2c 20 20 20 20 20 20  _FUNCTION,      
d400: 20 20 20 20 44 42 5f 49 4e 43 52 42 4c 4f 42 2c      DB_INCRBLOB,
d410: 20 20 20 20 20 20 20 20 20 44 42 5f 49 4e 54 45           DB_INTE
d420: 52 52 55 50 54 2c 0a 20 20 20 20 44 42 5f 4c 41  RRUPT,.    DB_LA
d430: 53 54 5f 49 4e 53 45 52 54 5f 52 4f 57 49 44 2c  ST_INSERT_ROWID,
d440: 20 44 42 5f 4e 55 4c 4c 56 41 4c 55 45 2c 20 20   DB_NULLVALUE,  
d450: 20 20 20 20 20 20 44 42 5f 4f 4e 45 43 4f 4c 55        DB_ONECOLU
d460: 4d 4e 2c 0a 20 20 20 20 44 42 5f 50 52 45 55 50  MN,.    DB_PREUP
d470: 44 41 54 45 2c 20 20 20 20 20 20 20 20 20 44 42  DATE,         DB
d480: 5f 50 52 4f 46 49 4c 45 2c 20 20 20 20 20 20 20  _PROFILE,       
d490: 20 20 20 44 42 5f 50 52 4f 47 52 45 53 53 2c 0a     DB_PROGRESS,.
d4a0: 20 20 20 20 44 42 5f 52 45 4b 45 59 2c 20 20 20      DB_REKEY,   
d4b0: 20 20 20 20 20 20 20 20 20 20 44 42 5f 52 45 53            DB_RES
d4c0: 54 4f 52 45 2c 20 20 20 20 20 20 20 20 20 20 44  TORE,          D
d4d0: 42 5f 52 4f 4c 4c 42 41 43 4b 5f 48 4f 4f 4b 2c  B_ROLLBACK_HOOK,
d4e0: 0a 20 20 20 20 44 42 5f 53 54 41 54 55 53 2c 20  .    DB_STATUS, 
d4f0: 20 20 20 20 20 20 20 20 20 20 20 44 42 5f 54 49             DB_TI
d500: 4d 45 4f 55 54 2c 20 20 20 20 20 20 20 20 20 20  MEOUT,          
d510: 44 42 5f 54 4f 54 41 4c 5f 43 48 41 4e 47 45 53  DB_TOTAL_CHANGES
d520: 2c 0a 20 20 20 20 44 42 5f 54 52 41 43 45 2c 20  ,.    DB_TRACE, 
d530: 20 20 20 20 20 20 20 20 20 20 20 20 44 42 5f 54              DB_T
d540: 52 41 4e 53 41 43 54 49 4f 4e 2c 20 20 20 20 20  RANSACTION,     
d550: 20 44 42 5f 55 4e 4c 4f 43 4b 5f 4e 4f 54 49 46   DB_UNLOCK_NOTIF
d560: 59 2c 0a 20 20 20 20 44 42 5f 55 50 44 41 54 45  Y,.    DB_UPDATE
d570: 5f 48 4f 4f 4b 2c 20 20 20 20 20 20 20 44 42 5f  _HOOK,       DB_
d580: 56 45 52 53 49 4f 4e 2c 20 20 20 20 20 20 20 20  VERSION,        
d590: 20 20 44 42 5f 57 41 4c 5f 48 4f 4f 4b 2c 0a 20    DB_WAL_HOOK,. 
d5a0: 20 7d 3b 0a 20 20 2f 2a 20 64 6f 6e 27 74 20 6c   };.  /* don't l
d5b0: 65 61 76 65 20 74 72 61 69 6c 69 6e 67 20 63 6f  eave trailing co
d5c0: 6d 6d 61 73 20 6f 6e 20 44 42 5f 65 6e 75 6d 2c  mmas on DB_enum,
d5d0: 20 69 74 20 63 6f 6e 66 75 73 65 73 20 74 68 65   it confuses the
d5e0: 20 41 49 58 20 78 6c 63 20 63 6f 6d 70 69 6c 65   AIX xlc compile
d5f0: 72 20 2a 2f 0a 0a 20 20 69 66 28 20 6f 62 6a 63  r */..  if( objc
d600: 3c 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  <2 ){.    Tcl_Wr
d610: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
d620: 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53 55 42  p, 1, objv, "SUB
d630: 43 4f 4d 4d 41 4e 44 20 2e 2e 2e 22 29 3b 0a 20  COMMAND ...");. 
d640: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
d650: 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54  ROR;.  }.  if( T
d660: 63 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f  cl_GetIndexFromO
d670: 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
d680: 31 5d 2c 20 44 42 5f 73 74 72 73 2c 20 22 6f 70  1], DB_strs, "op
d690: 74 69 6f 6e 22 2c 20 30 2c 20 26 63 68 6f 69 63  tion", 0, &choic
d6a0: 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  e) ){.    return
d6b0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
d6c0: 0a 20 20 73 77 69 74 63 68 28 20 28 65 6e 75 6d  .  switch( (enum
d6d0: 20 44 42 5f 65 6e 75 6d 29 63 68 6f 69 63 65 20   DB_enum)choice 
d6e0: 29 7b 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20  ){..  /*    $db 
d6f0: 61 75 74 68 6f 72 69 7a 65 72 20 3f 43 41 4c 4c  authorizer ?CALL
d700: 42 41 43 4b 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20  BACK?.  **.  ** 
d710: 49 6e 76 6f 6b 65 20 74 68 65 20 67 69 76 65 6e  Invoke the given
d720: 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20 61 75 74   callback to aut
d730: 68 6f 72 69 7a 65 20 65 61 63 68 20 53 51 4c 20  horize each SQL 
d740: 6f 70 65 72 61 74 69 6f 6e 20 61 73 20 69 74 20  operation as it 
d750: 69 73 0a 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 64  is.  ** compiled
d760: 2e 20 20 35 20 61 72 67 75 6d 65 6e 74 73 20 61  .  5 arguments a
d770: 72 65 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74  re appended to t
d780: 68 65 20 63 61 6c 6c 62 61 63 6b 20 62 65 66 6f  he callback befo
d790: 72 65 20 69 74 20 69 73 0a 20 20 2a 2a 20 69 6e  re it is.  ** in
d7a0: 76 6f 6b 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  voked:.  **.  **
d7b0: 20 20 20 28 31 29 20 54 68 65 20 61 75 74 68 6f     (1) The autho
d7c0: 72 69 7a 61 74 69 6f 6e 20 74 79 70 65 20 28 65  rization type (e
d7d0: 78 3a 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45  x: SQLITE_CREATE
d7e0: 5f 54 41 42 4c 45 2c 20 53 51 4c 49 54 45 5f 49  _TABLE, SQLITE_I
d7f0: 4e 53 45 52 54 2c 20 2e 2e 2e 29 0a 20 20 2a 2a  NSERT, ...).  **
d800: 20 20 20 28 32 29 20 46 69 72 73 74 20 64 65 73     (2) First des
d810: 63 72 69 70 74 69 76 65 20 6e 61 6d 65 20 28 64  criptive name (d
d820: 65 70 65 6e 64 73 20 6f 6e 20 61 75 74 68 6f 72  epends on author
d830: 69 7a 61 74 69 6f 6e 20 74 79 70 65 29 0a 20 20  ization type).  
d840: 2a 2a 20 20 20 28 33 29 20 53 65 63 6f 6e 64 20  **   (3) Second 
d850: 64 65 73 63 72 69 70 74 69 76 65 20 6e 61 6d 65  descriptive name
d860: 0a 20 20 2a 2a 20 20 20 28 34 29 20 4e 61 6d 65  .  **   (4) Name
d870: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
d880: 20 28 65 78 3a 20 22 6d 61 69 6e 22 2c 20 22 74   (ex: "main", "t
d890: 65 6d 70 22 29 0a 20 20 2a 2a 20 20 20 28 35 29  emp").  **   (5)
d8a0: 20 4e 61 6d 65 20 6f 66 20 74 72 69 67 67 65 72   Name of trigger
d8b0: 20 74 68 61 74 20 69 73 20 64 6f 69 6e 67 20 74   that is doing t
d8c0: 68 65 20 61 63 63 65 73 73 0a 20 20 2a 2a 0a 20  he access.  **. 
d8d0: 20 2a 2a 20 54 68 65 20 63 61 6c 6c 62 61 63 6b   ** The callback
d8e0: 20 73 68 6f 75 6c 64 20 72 65 74 75 72 6e 20 6f   should return o
d8f0: 6e 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  n of the followi
d900: 6e 67 20 73 74 72 69 6e 67 73 3a 20 53 51 4c 49  ng strings: SQLI
d910: 54 45 5f 4f 4b 2c 0a 20 20 2a 2a 20 53 51 4c 49  TE_OK,.  ** SQLI
d920: 54 45 5f 49 47 4e 4f 52 45 2c 20 6f 72 20 53 51  TE_IGNORE, or SQ
d930: 4c 49 54 45 5f 44 45 4e 59 2e 20 20 41 6e 79 20  LITE_DENY.  Any 
d940: 6f 74 68 65 72 20 72 65 74 75 72 6e 20 76 61 6c  other return val
d950: 75 65 20 69 73 20 61 6e 20 65 72 72 6f 72 2e 0a  ue is an error..
d960: 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69    **.  ** If thi
d970: 73 20 6d 65 74 68 6f 64 20 69 73 20 69 6e 76 6f  s method is invo
d980: 6b 65 64 20 77 69 74 68 20 6e 6f 20 61 72 67 75  ked with no argu
d990: 6d 65 6e 74 73 2c 20 74 68 65 20 63 75 72 72 65  ments, the curre
d9a0: 6e 74 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e  nt authorization
d9b0: 0a 20 20 2a 2a 20 63 61 6c 6c 62 61 63 6b 20 73  .  ** callback s
d9c0: 74 72 69 6e 67 20 69 73 20 72 65 74 75 72 6e 65  tring is returne
d9d0: 64 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  d..  */.  case D
d9e0: 42 5f 41 55 54 48 4f 52 49 5a 45 52 3a 20 7b 0a  B_AUTHORIZER: {.
d9f0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
da00: 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e  IT_AUTHORIZATION
da10: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
da20: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 61  esult(interp, "a
da30: 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 6e 6f 74  uthorization not
da40: 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 74 68   available in th
da50: 69 73 20 62 75 69 6c 64 22 2c 20 30 29 3b 0a 20  is build", 0);. 
da60: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
da70: 52 4f 52 3b 0a 23 65 6c 73 65 0a 20 20 20 20 69  ROR;.#else.    i
da80: 66 28 20 6f 62 6a 63 3e 33 20 29 7b 0a 20 20 20  f( objc>3 ){.   
da90: 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
daa0: 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
dab0: 62 6a 76 2c 20 22 3f 43 41 4c 4c 42 41 43 4b 3f  bjv, "?CALLBACK?
dac0: 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
dad0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
dae0: 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d  }else if( objc==
daf0: 32 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  2 ){.      if( p
db00: 44 62 2d 3e 7a 41 75 74 68 20 29 7b 0a 20 20 20  Db->zAuth ){.   
db10: 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
db20: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 44  esult(interp, pD
db30: 62 2d 3e 7a 41 75 74 68 2c 20 30 29 3b 0a 20 20  b->zAuth, 0);.  
db40: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
db50: 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 41 75  .      char *zAu
db60: 74 68 3b 0a 20 20 20 20 20 20 69 6e 74 20 6c 65  th;.      int le
db70: 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62  n;.      if( pDb
db80: 2d 3e 7a 41 75 74 68 20 29 7b 0a 20 20 20 20 20  ->zAuth ){.     
db90: 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d     Tcl_Free(pDb-
dba0: 3e 7a 41 75 74 68 29 3b 0a 20 20 20 20 20 20 7d  >zAuth);.      }
dbb0: 0a 20 20 20 20 20 20 7a 41 75 74 68 20 3d 20 54  .      zAuth = T
dbc0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
dbd0: 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65  Obj(objv[2], &le
dbe0: 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 41  n);.      if( zA
dbf0: 75 74 68 20 26 26 20 6c 65 6e 3e 30 20 29 7b 0a  uth && len>0 ){.
dc00: 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 41 75          pDb->zAu
dc10: 74 68 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 20  th = Tcl_Alloc( 
dc20: 6c 65 6e 20 2b 20 31 20 29 3b 0a 20 20 20 20 20  len + 1 );.     
dc30: 20 20 20 6d 65 6d 63 70 79 28 70 44 62 2d 3e 7a     memcpy(pDb->z
dc40: 41 75 74 68 2c 20 7a 41 75 74 68 2c 20 6c 65 6e  Auth, zAuth, len
dc50: 2b 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  +1);.      }else
dc60: 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a  {.        pDb->z
dc70: 41 75 74 68 20 3d 20 30 3b 0a 20 20 20 20 20 20  Auth = 0;.      
dc80: 7d 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d  }.      if( pDb-
dc90: 3e 7a 41 75 74 68 20 29 7b 0a 20 20 20 20 20 20  >zAuth ){.      
dca0: 20 20 70 44 62 2d 3e 69 6e 74 65 72 70 20 3d 20    pDb->interp = 
dcb0: 69 6e 74 65 72 70 3b 0a 20 20 20 20 20 20 20 20  interp;.        
dcc0: 73 71 6c 69 74 65 33 5f 73 65 74 5f 61 75 74 68  sqlite3_set_auth
dcd0: 6f 72 69 7a 65 72 28 70 44 62 2d 3e 64 62 2c 20  orizer(pDb->db, 
dce0: 61 75 74 68 5f 63 61 6c 6c 62 61 63 6b 2c 20 70  auth_callback, p
dcf0: 44 62 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  Db);.      }else
dd00: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
dd10: 33 5f 73 65 74 5f 61 75 74 68 6f 72 69 7a 65 72  3_set_authorizer
dd20: 28 70 44 62 2d 3e 64 62 2c 20 30 2c 20 30 29 3b  (pDb->db, 0, 0);
dd30: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
dd40: 65 6e 64 69 66 0a 20 20 20 20 62 72 65 61 6b 3b  endif.    break;
dd50: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64  .  }..  /*    $d
dd60: 62 20 62 61 63 6b 75 70 20 3f 44 41 54 41 42 41  b backup ?DATABA
dd70: 53 45 3f 20 46 49 4c 45 4e 41 4d 45 0a 20 20 2a  SE? FILENAME.  *
dd80: 2a 0a 20 20 2a 2a 20 4f 70 65 6e 20 6f 72 20 63  *.  ** Open or c
dd90: 72 65 61 74 65 20 61 20 64 61 74 61 62 61 73 65  reate a database
dda0: 20 66 69 6c 65 20 6e 61 6d 65 64 20 46 49 4c 45   file named FILE
ddb0: 4e 41 4d 45 2e 20 20 54 72 61 6e 73 66 65 72 20  NAME.  Transfer 
ddc0: 74 68 65 0a 20 20 2a 2a 20 63 6f 6e 74 65 6e 74  the.  ** content
ddd0: 20 6f 66 20 6c 6f 63 61 6c 20 64 61 74 61 62 61   of local databa
dde0: 73 65 20 44 41 54 41 42 41 53 45 20 28 64 65 66  se DATABASE (def
ddf0: 61 75 6c 74 3a 20 22 6d 61 69 6e 22 29 20 69 6e  ault: "main") in
de00: 74 6f 20 74 68 65 0a 20 20 2a 2a 20 46 49 4c 45  to the.  ** FILE
de10: 4e 41 4d 45 20 64 61 74 61 62 61 73 65 2e 0a 20  NAME database.. 
de20: 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 42 41   */.  case DB_BA
de30: 43 4b 55 50 3a 20 7b 0a 20 20 20 20 63 6f 6e 73  CKUP: {.    cons
de40: 74 20 63 68 61 72 20 2a 7a 44 65 73 74 46 69 6c  t char *zDestFil
de50: 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  e;.    const cha
de60: 72 20 2a 7a 53 72 63 44 62 3b 0a 20 20 20 20 73  r *zSrcDb;.    s
de70: 71 6c 69 74 65 33 20 2a 70 44 65 73 74 3b 0a 20  qlite3 *pDest;. 
de80: 20 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75     sqlite3_backu
de90: 70 20 2a 70 42 61 63 6b 75 70 3b 0a 0a 20 20 20  p *pBackup;..   
dea0: 20 69 66 28 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a   if( objc==3 ){.
deb0: 20 20 20 20 20 20 7a 53 72 63 44 62 20 3d 20 22        zSrcDb = "
dec0: 6d 61 69 6e 22 3b 0a 20 20 20 20 20 20 7a 44 65  main";.      zDe
ded0: 73 74 46 69 6c 65 20 3d 20 54 63 6c 5f 47 65 74  stFile = Tcl_Get
dee0: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b  String(objv[2]);
def0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f  .    }else if( o
df00: 62 6a 63 3d 3d 34 20 29 7b 0a 20 20 20 20 20 20  bjc==4 ){.      
df10: 7a 53 72 63 44 62 20 3d 20 54 63 6c 5f 47 65 74  zSrcDb = Tcl_Get
df20: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b  String(objv[2]);
df30: 0a 20 20 20 20 20 20 7a 44 65 73 74 46 69 6c 65  .      zDestFile
df40: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
df50: 28 6f 62 6a 76 5b 33 5d 29 3b 0a 20 20 20 20 7d  (objv[3]);.    }
df60: 65 6c 73 65 7b 0a 20 20 20 20 20 20 54 63 6c 5f  else{.      Tcl_
df70: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
df80: 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f  erp, 2, objv, "?
df90: 44 41 54 41 42 41 53 45 3f 20 46 49 4c 45 4e 41  DATABASE? FILENA
dfa0: 4d 45 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ME");.      retu
dfb0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
dfc0: 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c    }.    rc = sql
dfd0: 69 74 65 33 5f 6f 70 65 6e 28 7a 44 65 73 74 46  ite3_open(zDestF
dfe0: 69 6c 65 2c 20 26 70 44 65 73 74 29 3b 0a 20 20  ile, &pDest);.  
dff0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
e000: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  _OK ){.      Tcl
e010: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
e020: 74 65 72 70 2c 20 22 63 61 6e 6e 6f 74 20 6f 70  terp, "cannot op
e030: 65 6e 20 74 61 72 67 65 74 20 64 61 74 61 62 61  en target databa
e040: 73 65 3a 20 22 2c 0a 20 20 20 20 20 20 20 20 20  se: ",.         
e050: 20 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67    sqlite3_errmsg
e060: 28 70 44 65 73 74 29 2c 20 28 63 68 61 72 2a 29  (pDest), (char*)
e070: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
e080: 33 5f 63 6c 6f 73 65 28 70 44 65 73 74 29 3b 0a  3_close(pDest);.
e090: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
e0a0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
e0b0: 20 20 70 42 61 63 6b 75 70 20 3d 20 73 71 6c 69    pBackup = sqli
e0c0: 74 65 33 5f 62 61 63 6b 75 70 5f 69 6e 69 74 28  te3_backup_init(
e0d0: 70 44 65 73 74 2c 20 22 6d 61 69 6e 22 2c 20 70  pDest, "main", p
e0e0: 44 62 2d 3e 64 62 2c 20 7a 53 72 63 44 62 29 3b  Db->db, zSrcDb);
e0f0: 0a 20 20 20 20 69 66 28 20 70 42 61 63 6b 75 70  .    if( pBackup
e100: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  ==0 ){.      Tcl
e110: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
e120: 74 65 72 70 2c 20 22 62 61 63 6b 75 70 20 66 61  terp, "backup fa
e130: 69 6c 65 64 3a 20 22 2c 0a 20 20 20 20 20 20 20  iled: ",.       
e140: 20 20 20 20 73 71 6c 69 74 65 33 5f 65 72 72 6d      sqlite3_errm
e150: 73 67 28 70 44 65 73 74 29 2c 20 28 63 68 61 72  sg(pDest), (char
e160: 2a 29 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  *)0);.      sqli
e170: 74 65 33 5f 63 6c 6f 73 65 28 70 44 65 73 74 29  te3_close(pDest)
e180: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
e190: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
e1a0: 20 20 20 20 77 68 69 6c 65 28 20 20 28 72 63 20      while(  (rc 
e1b0: 3d 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70  = sqlite3_backup
e1c0: 5f 73 74 65 70 28 70 42 61 63 6b 75 70 2c 31 30  _step(pBackup,10
e1d0: 30 29 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  0))==SQLITE_OK )
e1e0: 7b 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62  {}.    sqlite3_b
e1f0: 61 63 6b 75 70 5f 66 69 6e 69 73 68 28 70 42 61  ackup_finish(pBa
e200: 63 6b 75 70 29 3b 0a 20 20 20 20 69 66 28 20 72  ckup);.    if( r
e210: 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c==SQLITE_DONE )
e220: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c  {.      rc = TCL
e230: 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  _OK;.    }else{.
e240: 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
e250: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
e260: 62 61 63 6b 75 70 20 66 61 69 6c 65 64 3a 20 22  backup failed: "
e270: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  ,.           sql
e280: 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44 65 73  ite3_errmsg(pDes
e290: 74 29 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20  t), (char*)0);. 
e2a0: 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45 52       rc = TCL_ER
e2b0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ROR;.    }.    s
e2c0: 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70 44 65  qlite3_close(pDe
e2d0: 73 74 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a  st);.    break;.
e2e0: 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62    }..  /*    $db
e2f0: 20 62 75 73 79 20 3f 43 41 4c 4c 42 41 43 4b 3f   busy ?CALLBACK?
e300: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 76 6f 6b  .  **.  ** Invok
e310: 65 20 74 68 65 20 67 69 76 65 6e 20 63 61 6c 6c  e the given call
e320: 62 61 63 6b 20 69 66 20 61 6e 20 53 51 4c 20 73  back if an SQL s
e330: 74 61 74 65 6d 65 6e 74 20 61 74 74 65 6d 70 74  tatement attempt
e340: 73 20 74 6f 20 6f 70 65 6e 0a 20 20 2a 2a 20 61  s to open.  ** a
e350: 20 6c 6f 63 6b 65 64 20 64 61 74 61 62 61 73 65   locked database
e360: 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 63 61   file..  */.  ca
e370: 73 65 20 44 42 5f 42 55 53 59 3a 20 7b 0a 20 20  se DB_BUSY: {.  
e380: 20 20 69 66 28 20 6f 62 6a 63 3e 33 20 29 7b 0a    if( objc>3 ){.
e390: 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
e3a0: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
e3b0: 2c 20 6f 62 6a 76 2c 20 22 43 41 4c 4c 42 41 43  , objv, "CALLBAC
e3c0: 4b 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  K");.      retur
e3d0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
e3e0: 20 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d   }else if( objc=
e3f0: 3d 32 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =2 ){.      if( 
e400: 70 44 62 2d 3e 7a 42 75 73 79 20 29 7b 0a 20 20  pDb->zBusy ){.  
e410: 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
e420: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70  Result(interp, p
e430: 44 62 2d 3e 7a 42 75 73 79 2c 20 30 29 3b 0a 20  Db->zBusy, 0);. 
e440: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
e450: 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 42  {.      char *zB
e460: 75 73 79 3b 0a 20 20 20 20 20 20 69 6e 74 20 6c  usy;.      int l
e470: 65 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44  en;.      if( pD
e480: 62 2d 3e 7a 42 75 73 79 20 29 7b 0a 20 20 20 20  b->zBusy ){.    
e490: 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62      Tcl_Free(pDb
e4a0: 2d 3e 7a 42 75 73 79 29 3b 0a 20 20 20 20 20 20  ->zBusy);.      
e4b0: 7d 0a 20 20 20 20 20 20 7a 42 75 73 79 20 3d 20  }.      zBusy = 
e4c0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
e4d0: 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c  mObj(objv[2], &l
e4e0: 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  en);.      if( z
e4f0: 42 75 73 79 20 26 26 20 6c 65 6e 3e 30 20 29 7b  Busy && len>0 ){
e500: 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 42  .        pDb->zB
e510: 75 73 79 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28  usy = Tcl_Alloc(
e520: 20 6c 65 6e 20 2b 20 31 20 29 3b 0a 20 20 20 20   len + 1 );.    
e530: 20 20 20 20 6d 65 6d 63 70 79 28 70 44 62 2d 3e      memcpy(pDb->
e540: 7a 42 75 73 79 2c 20 7a 42 75 73 79 2c 20 6c 65  zBusy, zBusy, le
e550: 6e 2b 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  n+1);.      }els
e560: 65 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e  e{.        pDb->
e570: 7a 42 75 73 79 20 3d 20 30 3b 0a 20 20 20 20 20  zBusy = 0;.     
e580: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 44 62   }.      if( pDb
e590: 2d 3e 7a 42 75 73 79 20 29 7b 0a 20 20 20 20 20  ->zBusy ){.     
e5a0: 20 20 20 70 44 62 2d 3e 69 6e 74 65 72 70 20 3d     pDb->interp =
e5b0: 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 20 20 20   interp;.       
e5c0: 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 68 61   sqlite3_busy_ha
e5d0: 6e 64 6c 65 72 28 70 44 62 2d 3e 64 62 2c 20 44  ndler(pDb->db, D
e5e0: 62 42 75 73 79 48 61 6e 64 6c 65 72 2c 20 70 44  bBusyHandler, pD
e5f0: 62 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  b);.      }else{
e600: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
e610: 5f 62 75 73 79 5f 68 61 6e 64 6c 65 72 28 70 44  _busy_handler(pD
e620: 62 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20  b->db, 0, 0);.  
e630: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
e640: 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
e650: 20 20 20 20 20 24 64 62 20 63 61 63 68 65 20 66       $db cache f
e660: 6c 75 73 68 0a 20 20 2a 2a 20 20 20 20 20 24 64  lush.  **     $d
e670: 62 20 63 61 63 68 65 20 73 69 7a 65 20 6e 0a 20  b cache size n. 
e680: 20 2a 2a 0a 20 20 2a 2a 20 46 6c 75 73 68 20 74   **.  ** Flush t
e690: 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74  he prepared stat
e6a0: 65 6d 65 6e 74 20 63 61 63 68 65 2c 20 6f 72 20  ement cache, or 
e6b0: 73 65 74 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  set the maximum 
e6c0: 6e 75 6d 62 65 72 20 6f 66 0a 20 20 2a 2a 20 63  number of.  ** c
e6d0: 61 63 68 65 64 20 73 74 61 74 65 6d 65 6e 74 73  ached statements
e6e0: 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  ..  */.  case DB
e6f0: 5f 43 41 43 48 45 3a 20 7b 0a 20 20 20 20 63 68  _CACHE: {.    ch
e700: 61 72 20 2a 73 75 62 43 6d 64 3b 0a 20 20 20 20  ar *subCmd;.    
e710: 69 6e 74 20 6e 3b 0a 0a 20 20 20 20 69 66 28 20  int n;..    if( 
e720: 6f 62 6a 63 3c 3d 32 20 29 7b 0a 20 20 20 20 20  objc<=2 ){.     
e730: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
e740: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
e750: 76 2c 20 22 63 61 63 68 65 20 6f 70 74 69 6f 6e  v, "cache option
e760: 20 3f 61 72 67 3f 22 29 3b 0a 20 20 20 20 20 20   ?arg?");.      
e770: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
e780: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 75 62 43  ;.    }.    subC
e790: 6d 64 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  md = Tcl_GetStri
e7a0: 6e 67 46 72 6f 6d 4f 62 6a 28 20 6f 62 6a 76 5b  ngFromObj( objv[
e7b0: 32 5d 2c 20 30 20 29 3b 0a 20 20 20 20 69 66 28  2], 0 );.    if(
e7c0: 20 2a 73 75 62 43 6d 64 3d 3d 27 66 27 20 26 26   *subCmd=='f' &&
e7d0: 20 73 74 72 63 6d 70 28 73 75 62 43 6d 64 2c 22   strcmp(subCmd,"
e7e0: 66 6c 75 73 68 22 29 3d 3d 30 20 29 7b 0a 20 20  flush")==0 ){.  
e7f0: 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20      if( objc!=3 
e800: 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 57  ){.        Tcl_W
e810: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
e820: 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 66 6c  rp, 2, objv, "fl
e830: 75 73 68 22 29 3b 0a 20 20 20 20 20 20 20 20 72  ush");.        r
e840: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
e850: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
e860: 20 20 20 20 20 20 66 6c 75 73 68 53 74 6d 74 43        flushStmtC
e870: 61 63 68 65 28 20 70 44 62 20 29 3b 0a 20 20 20  ache( pDb );.   
e880: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69     }.    }else i
e890: 66 28 20 2a 73 75 62 43 6d 64 3d 3d 27 73 27 20  f( *subCmd=='s' 
e8a0: 26 26 20 73 74 72 63 6d 70 28 73 75 62 43 6d 64  && strcmp(subCmd
e8b0: 2c 22 73 69 7a 65 22 29 3d 3d 30 20 29 7b 0a 20  ,"size")==0 ){. 
e8c0: 20 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 34       if( objc!=4
e8d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f   ){.        Tcl_
e8e0: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
e8f0: 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 73  erp, 2, objv, "s
e900: 69 7a 65 20 6e 22 29 3b 0a 20 20 20 20 20 20 20  ize n");.       
e910: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
e920: 52 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  R;.      }else{.
e930: 20 20 20 20 20 20 20 20 69 66 28 20 54 43 4c 5f          if( TCL_
e940: 45 52 52 4f 52 3d 3d 54 63 6c 5f 47 65 74 49 6e  ERROR==Tcl_GetIn
e950: 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
e960: 20 6f 62 6a 76 5b 33 5d 2c 20 26 6e 29 20 29 7b   objv[3], &n) ){
e970: 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 41  .          Tcl_A
e980: 70 70 65 6e 64 52 65 73 75 6c 74 28 20 69 6e 74  ppendResult( int
e990: 65 72 70 2c 20 22 63 61 6e 6e 6f 74 20 63 6f 6e  erp, "cannot con
e9a0: 76 65 72 74 20 5c 22 22 2c 20 0a 20 20 20 20 20  vert \"", .     
e9b0: 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65            Tcl_Ge
e9c0: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
e9d0: 62 6a 76 5b 33 5d 2c 30 29 2c 20 22 5c 22 20 74  bjv[3],0), "\" t
e9e0: 6f 20 69 6e 74 65 67 65 72 22 2c 20 30 29 3b 0a  o integer", 0);.
e9f0: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
ea00: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
ea10: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
ea20: 20 20 20 20 20 69 66 28 20 6e 3c 30 20 29 7b 0a       if( n<0 ){.
ea30: 20 20 20 20 20 20 20 20 20 20 20 20 66 6c 75 73              flus
ea40: 68 53 74 6d 74 43 61 63 68 65 28 20 70 44 62 20  hStmtCache( pDb 
ea50: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e  );.            n
ea60: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
ea70: 7d 65 6c 73 65 20 69 66 28 20 6e 3e 4d 41 58 5f  }else if( n>MAX_
ea80: 50 52 45 50 41 52 45 44 5f 53 54 4d 54 53 20 29  PREPARED_STMTS )
ea90: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 20  {.            n 
eaa0: 3d 20 4d 41 58 5f 50 52 45 50 41 52 45 44 5f 53  = MAX_PREPARED_S
eab0: 54 4d 54 53 3b 0a 20 20 20 20 20 20 20 20 20 20  TMTS;.          
eac0: 7d 0a 20 20 20 20 20 20 20 20 20 20 70 44 62 2d  }.          pDb-
ead0: 3e 6d 61 78 53 74 6d 74 20 3d 20 6e 3b 0a 20 20  >maxStmt = n;.  
eae0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
eaf0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
eb00: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
eb10: 74 28 20 69 6e 74 65 72 70 2c 20 22 62 61 64 20  t( interp, "bad 
eb20: 6f 70 74 69 6f 6e 20 5c 22 22 2c 20 0a 20 20 20  option \"", .   
eb30: 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
eb40: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
eb50: 5b 32 5d 2c 30 29 2c 20 22 5c 22 3a 20 6d 75 73  [2],0), "\": mus
eb60: 74 20 62 65 20 66 6c 75 73 68 20 6f 72 20 73 69  t be flush or si
eb70: 7a 65 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 72  ze", 0);.      r
eb80: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
eb90: 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b  .    }.    break
eba0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 20  ;.  }..  /*     
ebb0: 24 64 62 20 63 68 61 6e 67 65 73 0a 20 20 2a 2a  $db changes.  **
ebc0: 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  .  ** Return the
ebd0: 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
ebe0: 74 68 61 74 20 77 65 72 65 20 6d 6f 64 69 66 69  that were modifi
ebf0: 65 64 2c 20 69 6e 73 65 72 74 65 64 2c 20 6f 72  ed, inserted, or
ec00: 20 64 65 6c 65 74 65 64 20 62 79 0a 20 20 2a 2a   deleted by.  **
ec10: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
ec20: 20 49 4e 53 45 52 54 2c 20 55 50 44 41 54 45 20   INSERT, UPDATE 
ec30: 6f 72 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d  or DELETE statem
ec40: 65 6e 74 2c 20 6e 6f 74 20 69 6e 63 6c 75 64 69  ent, not includi
ec50: 6e 67 20 0a 20 20 2a 2a 20 61 6e 79 20 63 68 61  ng .  ** any cha
ec60: 6e 67 65 73 20 6d 61 64 65 20 62 79 20 74 72 69  nges made by tri
ec70: 67 67 65 72 20 70 72 6f 67 72 61 6d 73 2e 0a 20  gger programs.. 
ec80: 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 43 48   */.  case DB_CH
ec90: 41 4e 47 45 53 3a 20 7b 0a 20 20 20 20 54 63 6c  ANGES: {.    Tcl
eca0: 5f 4f 62 6a 20 2a 70 52 65 73 75 6c 74 3b 0a 20  _Obj *pResult;. 
ecb0: 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29     if( objc!=2 )
ecc0: 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e  {.      Tcl_Wron
ecd0: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
ece0: 20 32 2c 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 20   2, objv, "");. 
ecf0: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
ed00: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
ed10: 20 70 52 65 73 75 6c 74 20 3d 20 54 63 6c 5f 47   pResult = Tcl_G
ed20: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
ed30: 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74  rp);.    Tcl_Set
ed40: 49 6e 74 4f 62 6a 28 70 52 65 73 75 6c 74 2c 20  IntObj(pResult, 
ed50: 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 28  sqlite3_changes(
ed60: 70 44 62 2d 3e 64 62 29 29 3b 0a 20 20 20 20 62  pDb->db));.    b
ed70: 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  reak;.  }..  /* 
ed80: 20 20 20 24 64 62 20 63 6c 6f 73 65 0a 20 20 2a     $db close.  *
ed90: 2a 0a 20 20 2a 2a 20 53 68 75 74 64 6f 77 6e 20  *.  ** Shutdown 
eda0: 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 2a  the database.  *
edb0: 2f 0a 20 20 63 61 73 65 20 44 42 5f 43 4c 4f 53  /.  case DB_CLOS
edc0: 45 3a 20 7b 0a 20 20 20 20 54 63 6c 5f 44 65 6c  E: {.    Tcl_Del
edd0: 65 74 65 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72  eteCommand(inter
ede0: 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
edf0: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c  FromObj(objv[0],
ee00: 20 30 29 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b   0));.    break;
ee10: 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
ee20: 20 20 20 20 24 64 62 20 63 6f 6c 6c 61 74 65 20      $db collate 
ee30: 4e 41 4d 45 20 53 43 52 49 50 54 0a 20 20 2a 2a  NAME SCRIPT.  **
ee40: 0a 20 20 2a 2a 20 43 72 65 61 74 65 20 61 20 6e  .  ** Create a n
ee50: 65 77 20 53 51 4c 20 63 6f 6c 6c 61 74 69 6f 6e  ew SQL collation
ee60: 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64   function called
ee70: 20 4e 41 4d 45 2e 20 20 57 68 65 6e 65 76 65 72   NAME.  Whenever
ee80: 0a 20 20 2a 2a 20 74 68 61 74 20 66 75 6e 63 74  .  ** that funct
ee90: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69  ion is called, i
eea0: 6e 76 6f 6b 65 20 53 43 52 49 50 54 20 74 6f 20  nvoke SCRIPT to 
eeb0: 65 76 61 6c 75 61 74 65 20 74 68 65 20 66 75 6e  evaluate the fun
eec0: 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 63 61  ction..  */.  ca
eed0: 73 65 20 44 42 5f 43 4f 4c 4c 41 54 45 3a 20 7b  se DB_COLLATE: {
eee0: 0a 20 20 20 20 53 71 6c 43 6f 6c 6c 61 74 65 20  .    SqlCollate 
eef0: 2a 70 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 63  *pCollate;.    c
ef00: 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20  har *zName;.    
ef10: 63 68 61 72 20 2a 7a 53 63 72 69 70 74 3b 0a 20  char *zScript;. 
ef20: 20 20 20 69 6e 74 20 6e 53 63 72 69 70 74 3b 0a     int nScript;.
ef30: 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20      if( objc!=4 
ef40: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f  ){.      Tcl_Wro
ef50: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
ef60: 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 4e 41 4d 45  , 2, objv, "NAME
ef70: 20 53 43 52 49 50 54 22 29 3b 0a 20 20 20 20 20   SCRIPT");.     
ef80: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
ef90: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4e 61  R;.    }.    zNa
efa0: 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  me = Tcl_GetStri
efb0: 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32  ngFromObj(objv[2
efc0: 5d 2c 20 30 29 3b 0a 20 20 20 20 7a 53 63 72 69  ], 0);.    zScri
efd0: 70 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  pt = Tcl_GetStri
efe0: 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33  ngFromObj(objv[3
eff0: 5d 2c 20 26 6e 53 63 72 69 70 74 29 3b 0a 20 20  ], &nScript);.  
f000: 20 20 70 43 6f 6c 6c 61 74 65 20 3d 20 28 53 71    pCollate = (Sq
f010: 6c 43 6f 6c 6c 61 74 65 2a 29 54 63 6c 5f 41 6c  lCollate*)Tcl_Al
f020: 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 43 6f  loc( sizeof(*pCo
f030: 6c 6c 61 74 65 29 20 2b 20 6e 53 63 72 69 70 74  llate) + nScript
f040: 20 2b 20 31 20 29 3b 0a 20 20 20 20 69 66 28 20   + 1 );.    if( 
f050: 70 43 6f 6c 6c 61 74 65 3d 3d 30 20 29 20 72 65  pCollate==0 ) re
f060: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
f070: 20 20 20 20 70 43 6f 6c 6c 61 74 65 2d 3e 69 6e      pCollate->in
f080: 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20  terp = interp;. 
f090: 20 20 20 70 43 6f 6c 6c 61 74 65 2d 3e 70 4e 65     pCollate->pNe
f0a0: 78 74 20 3d 20 70 44 62 2d 3e 70 43 6f 6c 6c 61  xt = pDb->pColla
f0b0: 74 65 3b 0a 20 20 20 20 70 43 6f 6c 6c 61 74 65  te;.    pCollate
f0c0: 2d 3e 7a 53 63 72 69 70 74 20 3d 20 28 63 68 61  ->zScript = (cha
f0d0: 72 2a 29 26 70 43 6f 6c 6c 61 74 65 5b 31 5d 3b  r*)&pCollate[1];
f0e0: 0a 20 20 20 20 70 44 62 2d 3e 70 43 6f 6c 6c 61  .    pDb->pColla
f0f0: 74 65 20 3d 20 70 43 6f 6c 6c 61 74 65 3b 0a 20  te = pCollate;. 
f100: 20 20 20 6d 65 6d 63 70 79 28 70 43 6f 6c 6c 61     memcpy(pColla
f110: 74 65 2d 3e 7a 53 63 72 69 70 74 2c 20 7a 53 63  te->zScript, zSc
f120: 72 69 70 74 2c 20 6e 53 63 72 69 70 74 2b 31 29  ript, nScript+1)
f130: 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
f140: 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69  3_create_collati
f150: 6f 6e 28 70 44 62 2d 3e 64 62 2c 20 7a 4e 61 6d  on(pDb->db, zNam
f160: 65 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  e, SQLITE_UTF8, 
f170: 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 61 74  .        pCollat
f180: 65 2c 20 74 63 6c 53 71 6c 43 6f 6c 6c 61 74 65  e, tclSqlCollate
f190: 29 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 53  ) ){.      Tcl_S
f1a0: 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
f1b0: 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33   (char *)sqlite3
f1c0: 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62 29  _errmsg(pDb->db)
f1d0: 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b  , TCL_VOLATILE);
f1e0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
f1f0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
f200: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
f210: 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62   /*.  **     $db
f220: 20 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65   collation_neede
f230: 64 20 53 43 52 49 50 54 0a 20 20 2a 2a 0a 20 20  d SCRIPT.  **.  
f240: 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  ** Create a new 
f250: 53 51 4c 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75  SQL collation fu
f260: 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 20 4e 41  nction called NA
f270: 4d 45 2e 20 20 57 68 65 6e 65 76 65 72 0a 20 20  ME.  Whenever.  
f280: 2a 2a 20 74 68 61 74 20 66 75 6e 63 74 69 6f 6e  ** that function
f290: 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 6e 76 6f   is called, invo
f2a0: 6b 65 20 53 43 52 49 50 54 20 74 6f 20 65 76 61  ke SCRIPT to eva
f2b0: 6c 75 61 74 65 20 74 68 65 20 66 75 6e 63 74 69  luate the functi
f2c0: 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  on..  */.  case 
f2d0: 44 42 5f 43 4f 4c 4c 41 54 49 4f 4e 5f 4e 45 45  DB_COLLATION_NEE
f2e0: 44 45 44 3a 20 7b 0a 20 20 20 20 69 66 28 20 6f  DED: {.    if( o
f2f0: 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20  bjc!=3 ){.      
f300: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
f310: 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76  (interp, 2, objv
f320: 2c 20 22 53 43 52 49 50 54 22 29 3b 0a 20 20 20  , "SCRIPT");.   
f330: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
f340: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ROR;.    }.    i
f350: 66 28 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65  f( pDb->pCollate
f360: 4e 65 65 64 65 64 20 29 7b 0a 20 20 20 20 20 20  Needed ){.      
f370: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
f380: 28 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65  (pDb->pCollateNe
f390: 65 64 65 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20  eded);.    }.   
f3a0: 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65   pDb->pCollateNe
f3b0: 65 64 65 64 20 3d 20 54 63 6c 5f 44 75 70 6c 69  eded = Tcl_Dupli
f3c0: 63 61 74 65 4f 62 6a 28 6f 62 6a 76 5b 32 5d 29  cateObj(objv[2])
f3d0: 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65  ;.    Tcl_IncrRe
f3e0: 66 43 6f 75 6e 74 28 70 44 62 2d 3e 70 43 6f 6c  fCount(pDb->pCol
f3f0: 6c 61 74 65 4e 65 65 64 65 64 29 3b 0a 20 20 20  lateNeeded);.   
f400: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 6c 61 74 69   sqlite3_collati
f410: 6f 6e 5f 6e 65 65 64 65 64 28 70 44 62 2d 3e 64  on_needed(pDb->d
f420: 62 2c 20 70 44 62 2c 20 74 63 6c 43 6f 6c 6c 61  b, pDb, tclColla
f430: 74 65 4e 65 65 64 65 64 29 3b 0a 20 20 20 20 62  teNeeded);.    b
f440: 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  reak;.  }..  /* 
f450: 20 20 20 24 64 62 20 63 6f 6d 6d 69 74 5f 68 6f     $db commit_ho
f460: 6f 6b 20 3f 43 41 4c 4c 42 41 43 4b 3f 0a 20 20  ok ?CALLBACK?.  
f470: 2a 2a 0a 20 20 2a 2a 20 49 6e 76 6f 6b 65 20 74  **.  ** Invoke t
f480: 68 65 20 67 69 76 65 6e 20 63 61 6c 6c 62 61 63  he given callbac
f490: 6b 20 6a 75 73 74 20 62 65 66 6f 72 65 20 63 6f  k just before co
f4a0: 6d 6d 69 74 74 69 6e 67 20 65 76 65 72 79 20 53  mmitting every S
f4b0: 51 4c 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  QL transaction..
f4c0: 20 20 2a 2a 20 49 66 20 74 68 65 20 63 61 6c 6c    ** If the call
f4d0: 62 61 63 6b 20 74 68 72 6f 77 73 20 61 6e 20 65  back throws an e
f4e0: 78 63 65 70 74 69 6f 6e 20 6f 72 20 72 65 74 75  xception or retu
f4f0: 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68  rns non-zero, th
f500: 65 6e 20 74 68 65 0a 20 20 2a 2a 20 74 72 61 6e  en the.  ** tran
f510: 73 61 63 74 69 6f 6e 20 69 73 20 61 62 6f 72 74  saction is abort
f520: 65 64 2e 20 20 49 66 20 43 41 4c 4c 42 41 43 4b  ed.  If CALLBACK
f530: 20 69 73 20 61 6e 20 65 6d 70 74 79 20 73 74 72   is an empty str
f540: 69 6e 67 2c 20 74 68 65 20 63 61 6c 6c 62 61 63  ing, the callbac
f550: 6b 0a 20 20 2a 2a 20 69 73 20 64 69 73 61 62 6c  k.  ** is disabl
f560: 65 64 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  ed..  */.  case 
f570: 44 42 5f 43 4f 4d 4d 49 54 5f 48 4f 4f 4b 3a 20  DB_COMMIT_HOOK: 
f580: 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 33  {.    if( objc>3
f590: 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72   ){.      Tcl_Wr
f5a0: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
f5b0: 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 43 41  p, 2, objv, "?CA
f5c0: 4c 4c 42 41 43 4b 3f 22 29 3b 0a 20 20 20 20 20  LLBACK?");.     
f5d0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
f5e0: 52 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  R;.    }else if(
f5f0: 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20   objc==2 ){.    
f600: 20 20 69 66 28 20 70 44 62 2d 3e 7a 43 6f 6d 6d    if( pDb->zComm
f610: 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63  it ){.        Tc
f620: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
f630: 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a 43 6f 6d  nterp, pDb->zCom
f640: 6d 69 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  mit, 0);.      }
f650: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
f660: 20 20 63 68 61 72 20 2a 7a 43 6f 6d 6d 69 74 3b    char *zCommit;
f670: 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a  .      int len;.
f680: 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a        if( pDb->z
f690: 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 20 20  Commit ){.      
f6a0: 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e    Tcl_Free(pDb->
f6b0: 7a 43 6f 6d 6d 69 74 29 3b 0a 20 20 20 20 20 20  zCommit);.      
f6c0: 7d 0a 20 20 20 20 20 20 7a 43 6f 6d 6d 69 74 20  }.      zCommit 
f6d0: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  = Tcl_GetStringF
f6e0: 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20  romObj(objv[2], 
f6f0: 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28  &len);.      if(
f700: 20 7a 43 6f 6d 6d 69 74 20 26 26 20 6c 65 6e 3e   zCommit && len>
f710: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62  0 ){.        pDb
f720: 2d 3e 7a 43 6f 6d 6d 69 74 20 3d 20 54 63 6c 5f  ->zCommit = Tcl_
f730: 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20 31 20 29  Alloc( len + 1 )
f740: 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  ;.        memcpy
f750: 28 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 2c 20 7a  (pDb->zCommit, z
f760: 43 6f 6d 6d 69 74 2c 20 6c 65 6e 2b 31 29 3b 0a  Commit, len+1);.
f770: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
f780: 20 20 20 20 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69       pDb->zCommi
f790: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  t = 0;.      }. 
f7a0: 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 43       if( pDb->zC
f7b0: 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20  ommit ){.       
f7c0: 20 70 44 62 2d 3e 69 6e 74 65 72 70 20 3d 20 69   pDb->interp = i
f7d0: 6e 74 65 72 70 3b 0a 20 20 20 20 20 20 20 20 73  nterp;.        s
f7e0: 71 6c 69 74 65 33 5f 63 6f 6d 6d 69 74 5f 68 6f  qlite3_commit_ho
f7f0: 6f 6b 28 70 44 62 2d 3e 64 62 2c 20 44 62 43 6f  ok(pDb->db, DbCo
f800: 6d 6d 69 74 48 61 6e 64 6c 65 72 2c 20 70 44 62  mmitHandler, pDb
f810: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
f820: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
f830: 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 28 70 44 62 2d  commit_hook(pDb-
f840: 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  >db, 0, 0);.    
f850: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 62 72    }.    }.    br
f860: 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20  eak;.  }..  /*  
f870: 20 20 24 64 62 20 63 6f 6d 70 6c 65 74 65 20 53    $db complete S
f880: 51 4c 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74  QL.  **.  ** Ret
f890: 75 72 6e 20 54 52 55 45 20 69 66 20 53 51 4c 20  urn TRUE if SQL 
f8a0: 69 73 20 61 20 63 6f 6d 70 6c 65 74 65 20 53 51  is a complete SQ
f8b0: 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 52 65  L statement.  Re
f8c0: 74 75 72 6e 20 46 41 4c 53 45 20 69 66 0a 20 20  turn FALSE if.  
f8d0: 2a 2a 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 69  ** additional li
f8e0: 6e 65 73 20 6f 66 20 69 6e 70 75 74 20 61 72 65  nes of input are
f8f0: 20 6e 65 65 64 65 64 2e 20 20 54 68 69 73 20 69   needed.  This i
f900: 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 74 68 65  s similar to the
f910: 0a 20 20 2a 2a 20 62 75 69 6c 74 2d 69 6e 20 22  .  ** built-in "
f920: 69 6e 66 6f 20 63 6f 6d 70 6c 65 74 65 22 20 63  info complete" c
f930: 6f 6d 6d 61 6e 64 20 6f 66 20 54 63 6c 2e 0a 20  ommand of Tcl.. 
f940: 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 43 4f   */.  case DB_CO
f950: 4d 50 4c 45 54 45 3a 20 7b 0a 23 69 66 6e 64 65  MPLETE: {.#ifnde
f960: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  f SQLITE_OMIT_CO
f970: 4d 50 4c 45 54 45 0a 20 20 20 20 54 63 6c 5f 4f  MPLETE.    Tcl_O
f980: 62 6a 20 2a 70 52 65 73 75 6c 74 3b 0a 20 20 20  bj *pResult;.   
f990: 20 69 6e 74 20 69 73 43 6f 6d 70 6c 65 74 65 3b   int isComplete;
f9a0: 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 33  .    if( objc!=3
f9b0: 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72   ){.      Tcl_Wr
f9c0: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
f9d0: 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 53 51 4c  p, 2, objv, "SQL
f9e0: 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
f9f0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
fa00: 7d 0a 20 20 20 20 69 73 43 6f 6d 70 6c 65 74 65  }.    isComplete
fa10: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6d 70 6c   = sqlite3_compl
fa20: 65 74 65 28 20 54 63 6c 5f 47 65 74 53 74 72 69  ete( Tcl_GetStri
fa30: 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32  ngFromObj(objv[2
fa40: 5d 2c 20 30 29 20 29 3b 0a 20 20 20 20 70 52 65  ], 0) );.    pRe
fa50: 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65 74 4f 62  sult = Tcl_GetOb
fa60: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b  jResult(interp);
fa70: 0a 20 20 20 20 54 63 6c 5f 53 65 74 42 6f 6f 6c  .    Tcl_SetBool
fa80: 65 61 6e 4f 62 6a 28 70 52 65 73 75 6c 74 2c 20  eanObj(pResult, 
fa90: 69 73 43 6f 6d 70 6c 65 74 65 29 3b 0a 23 65 6e  isComplete);.#en
faa0: 64 69 66 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20  dif.    break;. 
fab0: 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20   }..  /*    $db 
fac0: 63 6f 70 79 20 63 6f 6e 66 6c 69 63 74 2d 61 6c  copy conflict-al
fad0: 67 6f 72 69 74 68 6d 20 74 61 62 6c 65 20 66 69  gorithm table fi
fae0: 6c 65 6e 61 6d 65 20 3f 53 45 50 41 52 41 54 4f  lename ?SEPARATO
faf0: 52 3f 20 3f 4e 55 4c 4c 49 4e 44 49 43 41 54 4f  R? ?NULLINDICATO
fb00: 52 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 6f 70  R?.  **.  ** Cop
fb10: 79 20 64 61 74 61 20 69 6e 74 6f 20 74 61 62 6c  y data into tabl
fb20: 65 20 66 72 6f 6d 20 66 69 6c 65 6e 61 6d 65 2c  e from filename,
fb30: 20 6f 70 74 69 6f 6e 61 6c 6c 79 20 75 73 69 6e   optionally usin
fb40: 67 20 53 45 50 41 52 41 54 4f 52 0a 20 20 2a 2a  g SEPARATOR.  **
fb50: 20 61 73 20 63 6f 6c 75 6d 6e 20 73 65 70 61 72   as column separ
fb60: 61 74 6f 72 73 2e 20 20 49 66 20 61 20 63 6f 6c  ators.  If a col
fb70: 75 6d 6e 20 63 6f 6e 74 61 69 6e 73 20 61 20 6e  umn contains a n
fb80: 75 6c 6c 20 73 74 72 69 6e 67 2c 20 6f 72 20 74  ull string, or t
fb90: 68 65 0a 20 20 2a 2a 20 76 61 6c 75 65 20 6f 66  he.  ** value of
fba0: 20 4e 55 4c 4c 49 4e 44 49 43 41 54 4f 52 2c 20   NULLINDICATOR, 
fbb0: 61 20 4e 55 4c 4c 20 69 73 20 69 6e 73 65 72 74  a NULL is insert
fbc0: 65 64 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d  ed for the colum
fbd0: 6e 2e 0a 20 20 2a 2a 20 63 6f 6e 66 6c 69 63 74  n..  ** conflict
fbe0: 2d 61 6c 67 6f 72 69 74 68 6d 20 69 73 20 6f 6e  -algorithm is on
fbf0: 65 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 20  e of the sqlite 
fc00: 63 6f 6e 66 6c 69 63 74 20 61 6c 67 6f 72 69 74  conflict algorit
fc10: 68 6d 73 3a 0a 20 20 2a 2a 20 20 20 20 72 6f 6c  hms:.  **    rol
fc20: 6c 62 61 63 6b 2c 20 61 62 6f 72 74 2c 20 66 61  lback, abort, fa
fc30: 69 6c 2c 20 69 67 6e 6f 72 65 2c 20 72 65 70 6c  il, ignore, repl
fc40: 61 63 65 0a 20 20 2a 2a 20 4f 6e 20 73 75 63 63  ace.  ** On succ
fc50: 65 73 73 2c 20 72 65 74 75 72 6e 20 74 68 65 20  ess, return the 
fc60: 6e 75 6d 62 65 72 20 6f 66 20 6c 69 6e 65 73 20  number of lines 
fc70: 70 72 6f 63 65 73 73 65 64 2c 20 6e 6f 74 20 6e  processed, not n
fc80: 65 63 65 73 73 61 72 69 6c 79 20 73 61 6d 65 0a  ecessarily same.
fc90: 20 20 2a 2a 20 61 73 20 27 64 62 20 63 68 61 6e    ** as 'db chan
fca0: 67 65 73 27 20 64 75 65 20 74 6f 20 63 6f 6e 66  ges' due to conf
fcb0: 6c 69 63 74 2d 61 6c 67 6f 72 69 74 68 6d 20 73  lict-algorithm s
fcc0: 65 6c 65 63 74 65 64 2e 0a 20 20 2a 2a 0a 20 20  elected..  **.  
fcd0: 2a 2a 20 54 68 69 73 20 63 6f 64 65 20 69 73 20  ** This code is 
fce0: 62 61 73 69 63 61 6c 6c 79 20 61 6e 20 69 6d 70  basically an imp
fcf0: 6c 65 6d 65 6e 74 61 74 69 6f 6e 2f 65 6e 68 61  lementation/enha
fd00: 6e 63 65 6d 65 6e 74 20 6f 66 0a 20 20 2a 2a 20  ncement of.  ** 
fd10: 74 68 65 20 73 71 6c 69 74 65 33 20 73 68 65 6c  the sqlite3 shel
fd20: 6c 2e 63 20 22 2e 69 6d 70 6f 72 74 22 20 63 6f  l.c ".import" co
fd30: 6d 6d 61 6e 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  mmand..  **.  **
fd40: 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20 75 73   This command us
fd50: 61 67 65 20 69 73 20 65 71 75 69 76 61 6c 65 6e  age is equivalen
fd60: 74 20 74 6f 20 74 68 65 20 73 71 6c 69 74 65 32  t to the sqlite2
fd70: 2e 78 20 43 4f 50 59 20 73 74 61 74 65 6d 65 6e  .x COPY statemen
fd80: 74 2c 0a 20 20 2a 2a 20 77 68 69 63 68 20 69 6d  t,.  ** which im
fd90: 70 6f 72 74 73 20 66 69 6c 65 20 64 61 74 61 20  ports file data 
fda0: 69 6e 74 6f 20 61 20 74 61 62 6c 65 20 75 73 69  into a table usi
fdb0: 6e 67 20 74 68 65 20 50 6f 73 74 67 72 65 53 51  ng the PostgreSQ
fdc0: 4c 20 43 4f 50 59 20 66 69 6c 65 20 66 6f 72 6d  L COPY file form
fdd0: 61 74 3a 0a 20 20 2a 2a 20 20 20 24 64 62 20 63  at:.  **   $db c
fde0: 6f 70 79 20 24 63 6f 6e 66 6c 69 74 5f 61 6c 67  opy $conflit_alg
fdf0: 6f 20 24 74 61 62 6c 65 5f 6e 61 6d 65 20 24 66  o $table_name $f
fe00: 69 6c 65 6e 61 6d 65 20 5c 74 20 5c 5c 4e 0a 20  ilename \t \\N. 
fe10: 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 43 4f   */.  case DB_CO
fe20: 50 59 3a 20 7b 0a 20 20 20 20 63 68 61 72 20 2a  PY: {.    char *
fe30: 7a 54 61 62 6c 65 3b 20 20 20 20 20 20 20 20 20  zTable;         
fe40: 20 20 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20        /* Insert 
fe50: 64 61 74 61 20 69 6e 74 6f 20 74 68 69 73 20 74  data into this t
fe60: 61 62 6c 65 20 2a 2f 0a 20 20 20 20 63 68 61 72  able */.    char
fe70: 20 2a 7a 46 69 6c 65 3b 20 20 20 20 20 20 20 20   *zFile;        
fe80: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66          /* The f
fe90: 69 6c 65 20 66 72 6f 6d 20 77 68 69 63 68 20 74  ile from which t
fea0: 6f 20 65 78 74 72 61 63 74 20 64 61 74 61 20 2a  o extract data *
feb0: 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6e  /.    char *zCon
fec0: 66 6c 69 63 74 3b 20 20 20 20 20 20 20 20 20 20  flict;          
fed0: 20 20 2f 2a 20 54 68 65 20 63 6f 6e 66 6c 69 63    /* The conflic
fee0: 74 20 61 6c 67 6f 72 69 74 68 6d 20 74 6f 20 75  t algorithm to u
fef0: 73 65 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  se */.    sqlite
ff00: 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 20 20  3_stmt *pStmt;  
ff10: 20 20 20 20 20 20 2f 2a 20 41 20 73 74 61 74 65        /* A state
ff20: 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ment */.    int 
ff30: 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20  nCol;           
ff40: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
ff50: 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  r of columns in 
ff60: 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20  the table */.   
ff70: 20 69 6e 74 20 6e 42 79 74 65 3b 20 20 20 20 20   int nByte;     
ff80: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ff90: 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
ffa0: 69 6e 20 61 6e 20 53 51 4c 20 73 74 72 69 6e 67  in an SQL string
ffb0: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a   */.    int i, j
ffc0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
ffd0: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
ffe0: 74 65 72 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ters */.    int 
fff0: 6e 53 65 70 3b 20 20 20 20 20 20 20 20 20 20 20  nSep;           
10000 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
10010 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 7a 53  r of bytes in zS
10020 65 70 5b 5d 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ep[] */.    int 
10030 6e 4e 75 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  nNull;          
10040 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
10050 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 7a 4e  r of bytes in zN
10060 75 6c 6c 5b 5d 20 2a 2f 0a 20 20 20 20 63 68 61  ull[] */.    cha
10070 72 20 2a 7a 53 71 6c 3b 20 20 20 20 20 20 20 20  r *zSql;        
10080 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 53           /* An S
10090 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  QL statement */.
100a0 20 20 20 20 63 68 61 72 20 2a 7a 4c 69 6e 65 3b      char *zLine;
100b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
100c0 2f 2a 20 41 20 73 69 6e 67 6c 65 20 6c 69 6e 65  /* A single line
100d0 20 6f 66 20 69 6e 70 75 74 20 66 72 6f 6d 20 74   of input from t
100e0 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 63  he file */.    c
100f0 68 61 72 20 2a 2a 61 7a 43 6f 6c 3b 20 20 20 20  har **azCol;    
10100 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 4c             /* zL
10110 69 6e 65 5b 5d 20 62 72 6f 6b 65 6e 20 75 70 20  ine[] broken up 
10120 69 6e 74 6f 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a  into columns */.
10130 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6d 6d 69      char *zCommi
10140 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
10150 2f 2a 20 48 6f 77 20 74 6f 20 63 6f 6d 6d 69 74  /* How to commit
10160 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20 20 20   changes */.    
10170 46 49 4c 45 20 2a 69 6e 3b 20 20 20 20 20 20 20  FILE *in;       
10180 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
10190 68 65 20 69 6e 70 75 74 20 66 69 6c 65 20 2a 2f  he input file */
101a0 0a 20 20 20 20 69 6e 74 20 6c 69 6e 65 6e 6f 20  .    int lineno 
101b0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
101c0 20 2f 2a 20 4c 69 6e 65 20 6e 75 6d 62 65 72 20   /* Line number 
101d0 6f 66 20 69 6e 70 75 74 20 66 69 6c 65 20 2a 2f  of input file */
101e0 0a 20 20 20 20 63 68 61 72 20 7a 4c 69 6e 65 4e  .    char zLineN
101f0 75 6d 5b 38 30 5d 3b 20 20 20 20 20 20 20 20 20  um[80];         
10200 20 2f 2a 20 4c 69 6e 65 20 6e 75 6d 62 65 72 20   /* Line number 
10210 70 72 69 6e 74 20 62 75 66 66 65 72 20 2a 2f 0a  print buffer */.
10220 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65      Tcl_Obj *pRe
10230 73 75 6c 74 3b 20 20 20 20 20 20 20 20 20 20 20  sult;           
10240 2f 2a 20 69 6e 74 65 72 70 20 72 65 73 75 6c 74  /* interp result
10250 20 2a 2f 0a 0a 20 20 20 20 63 68 61 72 20 2a 7a   */..    char *z
10260 53 65 70 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  Sep;.    char *z
10270 4e 75 6c 6c 3b 0a 20 20 20 20 69 66 28 20 6f 62  Null;.    if( ob
10280 6a 63 3c 35 20 7c 7c 20 6f 62 6a 63 3e 37 20 29  jc<5 || objc>7 )
10290 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e  {.      Tcl_Wron
102a0 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
102b0 20 32 2c 20 6f 62 6a 76 2c 20 0a 20 20 20 20 20   2, objv, .     
102c0 20 20 20 20 22 43 4f 4e 46 4c 49 43 54 2d 41 4c      "CONFLICT-AL
102d0 47 4f 52 49 54 48 4d 20 54 41 42 4c 45 20 46 49  GORITHM TABLE FI
102e0 4c 45 4e 41 4d 45 20 3f 53 45 50 41 52 41 54 4f  LENAME ?SEPARATO
102f0 52 3f 20 3f 4e 55 4c 4c 49 4e 44 49 43 41 54 4f  R? ?NULLINDICATO
10300 52 3f 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  R?");.      retu
10310 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
10320 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 62 6a 63    }.    if( objc
10330 3e 3d 36 20 29 7b 0a 20 20 20 20 20 20 7a 53 65  >=6 ){.      zSe
10340 70 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  p = Tcl_GetStrin
10350 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 35 5d  gFromObj(objv[5]
10360 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , 0);.    }else{
10370 0a 20 20 20 20 20 20 7a 53 65 70 20 3d 20 22 5c  .      zSep = "\
10380 74 22 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  t";.    }.    if
10390 28 20 6f 62 6a 63 3e 3d 37 20 29 7b 0a 20 20 20  ( objc>=7 ){.   
103a0 20 20 20 7a 4e 75 6c 6c 20 3d 20 54 63 6c 5f 47     zNull = Tcl_G
103b0 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
103c0 6f 62 6a 76 5b 36 5d 2c 20 30 29 3b 0a 20 20 20  objv[6], 0);.   
103d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 4e   }else{.      zN
103e0 75 6c 6c 20 3d 20 22 22 3b 0a 20 20 20 20 7d 0a  ull = "";.    }.
103f0 20 20 20 20 7a 43 6f 6e 66 6c 69 63 74 20 3d 20      zConflict = 
10400 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
10410 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30 29  mObj(objv[2], 0)
10420 3b 0a 20 20 20 20 7a 54 61 62 6c 65 20 3d 20 54  ;.    zTable = T
10430 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
10440 4f 62 6a 28 6f 62 6a 76 5b 33 5d 2c 20 30 29 3b  Obj(objv[3], 0);
10450 0a 20 20 20 20 7a 46 69 6c 65 20 3d 20 54 63 6c  .    zFile = Tcl
10460 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
10470 6a 28 6f 62 6a 76 5b 34 5d 2c 20 30 29 3b 0a 20  j(objv[4], 0);. 
10480 20 20 20 6e 53 65 70 20 3d 20 73 74 72 6c 65 6e     nSep = strlen
10490 33 30 28 7a 53 65 70 29 3b 0a 20 20 20 20 6e 4e  30(zSep);.    nN
104a0 75 6c 6c 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a  ull = strlen30(z
104b0 4e 75 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 6e  Null);.    if( n
104c0 53 65 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Sep==0 ){.      
104d0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
104e0 28 69 6e 74 65 72 70 2c 22 45 72 72 6f 72 3a 20  (interp,"Error: 
104f0 6e 6f 6e 2d 6e 75 6c 6c 20 73 65 70 61 72 61 74  non-null separat
10500 6f 72 20 72 65 71 75 69 72 65 64 20 66 6f 72 20  or required for 
10510 63 6f 70 79 22 2c 30 29 3b 0a 20 20 20 20 20 20  copy",0);.      
10520 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
10530 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 73  ;.    }.    if(s
10540 74 72 63 6d 70 28 7a 43 6f 6e 66 6c 69 63 74 2c  trcmp(zConflict,
10550 20 22 72 6f 6c 6c 62 61 63 6b 22 29 20 21 3d 20   "rollback") != 
10560 30 20 26 26 0a 20 20 20 20 20 20 20 73 74 72 63  0 &&.       strc
10570 6d 70 28 7a 43 6f 6e 66 6c 69 63 74 2c 20 22 61  mp(zConflict, "a
10580 62 6f 72 74 22 20 20 20 29 20 21 3d 20 30 20 26  bort"   ) != 0 &
10590 26 0a 20 20 20 20 20 20 20 73 74 72 63 6d 70 28  &.       strcmp(
105a0 7a 43 6f 6e 66 6c 69 63 74 2c 20 22 66 61 69 6c  zConflict, "fail
105b0 22 20 20 20 20 29 20 21 3d 20 30 20 26 26 0a 20  "    ) != 0 &&. 
105c0 20 20 20 20 20 20 73 74 72 63 6d 70 28 7a 43 6f        strcmp(zCo
105d0 6e 66 6c 69 63 74 2c 20 22 69 67 6e 6f 72 65 22  nflict, "ignore"
105e0 20 20 29 20 21 3d 20 30 20 26 26 0a 20 20 20 20    ) != 0 &&.    
105f0 20 20 20 73 74 72 63 6d 70 28 7a 43 6f 6e 66 6c     strcmp(zConfl
10600 69 63 74 2c 20 22 72 65 70 6c 61 63 65 22 20 29  ict, "replace" )
10610 20 21 3d 20 30 20 29 20 7b 0a 20 20 20 20 20 20   != 0 ) {.      
10620 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
10630 28 69 6e 74 65 72 70 2c 20 22 45 72 72 6f 72 3a  (interp, "Error:
10640 20 5c 22 22 2c 20 7a 43 6f 6e 66 6c 69 63 74 2c   \"", zConflict,
10650 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 5c   .            "\
10660 22 2c 20 63 6f 6e 66 6c 69 63 74 2d 61 6c 67 6f  ", conflict-algo
10670 72 69 74 68 6d 20 6d 75 73 74 20 62 65 20 6f 6e  rithm must be on
10680 65 20 6f 66 3a 20 72 6f 6c 6c 62 61 63 6b 2c 20  e of: rollback, 
10690 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 61  ".            "a
106a0 62 6f 72 74 2c 20 66 61 69 6c 2c 20 69 67 6e 6f  bort, fail, igno
106b0 72 65 2c 20 6f 72 20 72 65 70 6c 61 63 65 22 2c  re, or replace",
106c0 20 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72   0);.      retur
106d0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
106e0 20 7d 0a 20 20 20 20 7a 53 71 6c 20 3d 20 73 71   }.    zSql = sq
106f0 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 53  lite3_mprintf("S
10700 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 27 25 71  ELECT * FROM '%q
10710 27 22 2c 20 7a 54 61 62 6c 65 29 3b 0a 20 20 20  '", zTable);.   
10720 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a   if( zSql==0 ){.
10730 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
10740 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
10750 45 72 72 6f 72 3a 20 6e 6f 20 73 75 63 68 20 74  Error: no such t
10760 61 62 6c 65 3a 20 22 2c 20 7a 54 61 62 6c 65 2c  able: ", zTable,
10770 20 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72   0);.      retur
10780 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
10790 20 7d 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 73   }.    nByte = s
107a0 74 72 6c 65 6e 33 30 28 7a 53 71 6c 29 3b 0a 20  trlen30(zSql);. 
107b0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
107c0 70 72 65 70 61 72 65 28 70 44 62 2d 3e 64 62 2c  prepare(pDb->db,
107d0 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d   zSql, -1, &pStm
107e0 74 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  t, 0);.    sqlit
107f0 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20  e3_free(zSql);. 
10800 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
10810 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
10820 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 45 72 72  ult(interp, "Err
10830 6f 72 3a 20 22 2c 20 73 71 6c 69 74 65 33 5f 65  or: ", sqlite3_e
10840 72 72 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c 20  rrmsg(pDb->db), 
10850 30 29 3b 0a 20 20 20 20 20 20 6e 43 6f 6c 20 3d  0);.      nCol =
10860 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
10870 20 20 20 20 20 6e 43 6f 6c 20 3d 20 73 71 6c 69       nCol = sqli
10880 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74  te3_column_count
10890 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 7d 0a 20  (pStmt);.    }. 
108a0 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c     sqlite3_final
108b0 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  ize(pStmt);.    
108c0 69 66 28 20 6e 43 6f 6c 3d 3d 30 20 29 20 7b 0a  if( nCol==0 ) {.
108d0 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
108e0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
108f0 20 20 7a 53 71 6c 20 3d 20 6d 61 6c 6c 6f 63 28    zSql = malloc(
10900 20 6e 42 79 74 65 20 2b 20 35 30 20 2b 20 6e 43   nByte + 50 + nC
10910 6f 6c 2a 32 20 29 3b 0a 20 20 20 20 69 66 28 20  ol*2 );.    if( 
10920 7a 53 71 6c 3d 3d 30 20 29 20 7b 0a 20 20 20 20  zSql==0 ) {.    
10930 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
10940 6c 74 28 69 6e 74 65 72 70 2c 20 22 45 72 72 6f  lt(interp, "Erro
10950 72 3a 20 63 61 6e 27 74 20 6d 61 6c 6c 6f 63 28  r: can't malloc(
10960 29 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 65  )", 0);.      re
10970 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
10980 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
10990 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 79 74 65  3_snprintf(nByte
109a0 2b 35 30 2c 20 7a 53 71 6c 2c 20 22 49 4e 53 45  +50, zSql, "INSE
109b0 52 54 20 4f 52 20 25 71 20 49 4e 54 4f 20 27 25  RT OR %q INTO '%
109c0 71 27 20 56 41 4c 55 45 53 28 3f 22 2c 0a 20 20  q' VALUES(?",.  
109d0 20 20 20 20 20 20 20 7a 43 6f 6e 66 6c 69 63 74         zConflict
109e0 2c 20 7a 54 61 62 6c 65 29 3b 0a 20 20 20 20 6a  , zTable);.    j
109f0 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 53 71 6c   = strlen30(zSql
10a00 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20  );.    for(i=1; 
10a10 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  i<nCol; i++){.  
10a20 20 20 20 20 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d 20      zSql[j++] = 
10a30 27 2c 27 3b 0a 20 20 20 20 20 20 7a 53 71 6c 5b  ',';.      zSql[
10a40 6a 2b 2b 5d 20 3d 20 27 3f 27 3b 0a 20 20 20 20  j++] = '?';.    
10a50 7d 0a 20 20 20 20 7a 53 71 6c 5b 6a 2b 2b 5d 20  }.    zSql[j++] 
10a60 3d 20 27 29 27 3b 0a 20 20 20 20 7a 53 71 6c 5b  = ')';.    zSql[
10a70 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d  j] = 0;.    rc =
10a80 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
10a90 28 70 44 62 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20  (pDb->db, zSql, 
10aa0 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a  -1, &pStmt, 0);.
10ab0 20 20 20 20 66 72 65 65 28 7a 53 71 6c 29 3b 0a      free(zSql);.
10ac0 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
10ad0 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
10ae0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 45 72  sult(interp, "Er
10af0 72 6f 72 3a 20 22 2c 20 73 71 6c 69 74 65 33 5f  ror: ", sqlite3_
10b00 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c  errmsg(pDb->db),
10b10 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
10b20 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
10b30 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  t);.      return
10b40 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
10b50 7d 0a 20 20 20 20 69 6e 20 3d 20 66 6f 70 65 6e  }.    in = fopen
10b60 28 7a 46 69 6c 65 2c 20 22 72 62 22 29 3b 0a 20  (zFile, "rb");. 
10b70 20 20 20 69 66 28 20 69 6e 3d 3d 30 20 29 7b 0a     if( in==0 ){.
10b80 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
10b90 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
10ba0 45 72 72 6f 72 3a 20 63 61 6e 6e 6f 74 20 6f 70  Error: cannot op
10bb0 65 6e 20 66 69 6c 65 3a 20 22 2c 20 7a 46 69 6c  en file: ", zFil
10bc0 65 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20  e, NULL);.      
10bd0 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
10be0 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 72  (pStmt);.      r
10bf0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
10c00 0a 20 20 20 20 7d 0a 20 20 20 20 61 7a 43 6f 6c  .    }.    azCol
10c10 20 3d 20 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f   = malloc( sizeo
10c20 66 28 61 7a 43 6f 6c 5b 30 5d 29 2a 28 6e 43 6f  f(azCol[0])*(nCo
10c30 6c 2b 31 29 20 29 3b 0a 20 20 20 20 69 66 28 20  l+1) );.    if( 
10c40 61 7a 43 6f 6c 3d 3d 30 20 29 20 7b 0a 20 20 20  azCol==0 ) {.   
10c50 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
10c60 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 45 72 72  ult(interp, "Err
10c70 6f 72 3a 20 63 61 6e 27 74 20 6d 61 6c 6c 6f 63  or: can't malloc
10c80 28 29 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 66  ()", 0);.      f
10c90 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 20 20 20  close(in);.     
10ca0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
10cb0 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 28 76 6f  R;.    }.    (vo
10cc0 69 64 29 73 71 6c 69 74 65 33 5f 65 78 65 63 28  id)sqlite3_exec(
10cd0 70 44 62 2d 3e 64 62 2c 20 22 42 45 47 49 4e 22  pDb->db, "BEGIN"
10ce0 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
10cf0 7a 43 6f 6d 6d 69 74 20 3d 20 22 43 4f 4d 4d 49  zCommit = "COMMI
10d00 54 22 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28  T";.    while( (
10d10 7a 4c 69 6e 65 20 3d 20 6c 6f 63 61 6c 5f 67 65  zLine = local_ge
10d20 74 6c 69 6e 65 28 30 2c 20 69 6e 29 29 21 3d 30  tline(0, in))!=0
10d30 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a   ){.      char *
10d40 7a 3b 0a 20 20 20 20 20 20 69 20 3d 20 30 3b 0a  z;.      i = 0;.
10d50 20 20 20 20 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a        lineno++;.
10d60 20 20 20 20 20 20 61 7a 43 6f 6c 5b 30 5d 20 3d        azCol[0] =
10d70 20 7a 4c 69 6e 65 3b 0a 20 20 20 20 20 20 66 6f   zLine;.      fo
10d80 72 28 69 3d 30 2c 20 7a 3d 7a 4c 69 6e 65 3b 20  r(i=0, z=zLine; 
10d90 2a 7a 3b 20 7a 2b 2b 29 7b 0a 20 20 20 20 20 20  *z; z++){.      
10da0 20 20 69 66 28 20 2a 7a 3d 3d 7a 53 65 70 5b 30    if( *z==zSep[0
10db0 5d 20 26 26 20 73 74 72 6e 63 6d 70 28 7a 2c 20  ] && strncmp(z, 
10dc0 7a 53 65 70 2c 20 6e 53 65 70 29 3d 3d 30 20 29  zSep, nSep)==0 )
10dd0 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 7a 20 3d  {.          *z =
10de0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69 2b   0;.          i+
10df0 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  +;.          if(
10e00 20 69 3c 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20   i<nCol ){.     
10e10 20 20 20 20 20 20 20 61 7a 43 6f 6c 5b 69 5d 20         azCol[i] 
10e20 3d 20 26 7a 5b 6e 53 65 70 5d 3b 0a 20 20 20 20  = &z[nSep];.    
10e30 20 20 20 20 20 20 20 20 7a 20 2b 3d 20 6e 53 65          z += nSe
10e40 70 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  p-1;.          }
10e50 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
10e60 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 2b 31   }.      if( i+1
10e70 21 3d 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20  !=nCol ){.      
10e80 20 20 63 68 61 72 20 2a 7a 45 72 72 3b 0a 20 20    char *zErr;.  
10e90 20 20 20 20 20 20 69 6e 74 20 6e 45 72 72 20 3d        int nErr =
10ea0 20 73 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 29   strlen30(zFile)
10eb0 20 2b 20 32 30 30 3b 0a 20 20 20 20 20 20 20 20   + 200;.        
10ec0 7a 45 72 72 20 3d 20 6d 61 6c 6c 6f 63 28 6e 45  zErr = malloc(nE
10ed0 72 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  rr);.        if(
10ee0 20 7a 45 72 72 20 29 7b 0a 20 20 20 20 20 20 20   zErr ){.       
10ef0 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
10f00 6e 74 66 28 6e 45 72 72 2c 20 7a 45 72 72 2c 0a  ntf(nErr, zErr,.
10f10 20 20 20 20 20 20 20 20 20 20 20 20 20 22 45 72               "Er
10f20 72 6f 72 3a 20 25 73 20 6c 69 6e 65 20 25 64 3a  ror: %s line %d:
10f30 20 65 78 70 65 63 74 65 64 20 25 64 20 63 6f 6c   expected %d col
10f40 75 6d 6e 73 20 6f 66 20 64 61 74 61 20 62 75 74  umns of data but
10f50 20 66 6f 75 6e 64 20 25 64 22 2c 0a 20 20 20 20   found %d",.    
10f60 20 20 20 20 20 20 20 20 20 7a 46 69 6c 65 2c 20           zFile, 
10f70 6c 69 6e 65 6e 6f 2c 20 6e 43 6f 6c 2c 20 69 2b  lineno, nCol, i+
10f80 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 54 63  1);.          Tc
10f90 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
10fa0 6e 74 65 72 70 2c 20 7a 45 72 72 2c 20 30 29 3b  nterp, zErr, 0);
10fb0 0a 20 20 20 20 20 20 20 20 20 20 66 72 65 65 28  .          free(
10fc0 7a 45 72 72 29 3b 0a 20 20 20 20 20 20 20 20 7d  zErr);.        }
10fd0 0a 20 20 20 20 20 20 20 20 7a 43 6f 6d 6d 69 74  .        zCommit
10fe0 20 3d 20 22 52 4f 4c 4c 42 41 43 4b 22 3b 0a 20   = "ROLLBACK";. 
10ff0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
11000 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28      }.      for(
11010 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b  i=0; i<nCol; i++
11020 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 63 68  ){.        /* ch
11030 65 63 6b 20 66 6f 72 20 6e 75 6c 6c 20 64 61 74  eck for null dat
11040 61 2c 20 69 66 20 73 6f 2c 20 62 69 6e 64 20 61  a, if so, bind a
11050 73 20 6e 75 6c 6c 20 2a 2f 0a 20 20 20 20 20 20  s null */.      
11060 20 20 69 66 28 20 28 6e 4e 75 6c 6c 3e 30 20 26    if( (nNull>0 &
11070 26 20 73 74 72 63 6d 70 28 61 7a 43 6f 6c 5b 69  & strcmp(azCol[i
11080 5d 2c 20 7a 4e 75 6c 6c 29 3d 3d 30 29 0a 20 20  ], zNull)==0).  
11090 20 20 20 20 20 20 20 20 7c 7c 20 73 74 72 6c 65          || strle
110a0 6e 33 30 28 61 7a 43 6f 6c 5b 69 5d 29 3d 3d 30  n30(azCol[i])==0
110b0 20 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20   .        ){.   
110c0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62         sqlite3_b
110d0 69 6e 64 5f 6e 75 6c 6c 28 70 53 74 6d 74 2c 20  ind_null(pStmt, 
110e0 69 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  i+1);.        }e
110f0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73  lse{.          s
11100 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74  qlite3_bind_text
11110 28 70 53 74 6d 74 2c 20 69 2b 31 2c 20 61 7a 43  (pStmt, i+1, azC
11120 6f 6c 5b 69 5d 2c 20 2d 31 2c 20 53 51 4c 49 54  ol[i], -1, SQLIT
11130 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20  E_STATIC);.     
11140 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
11150 20 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28     sqlite3_step(
11160 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 72 63  pStmt);.      rc
11170 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74   = sqlite3_reset
11180 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 66  (pStmt);.      f
11190 72 65 65 28 7a 4c 69 6e 65 29 3b 0a 20 20 20 20  ree(zLine);.    
111a0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
111b0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 54  _OK ){.        T
111c0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
111d0 69 6e 74 65 72 70 2c 22 45 72 72 6f 72 3a 20 22  interp,"Error: "
111e0 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  , sqlite3_errmsg
111f0 28 70 44 62 2d 3e 64 62 29 2c 20 30 29 3b 0a 20  (pDb->db), 0);. 
11200 20 20 20 20 20 20 20 7a 43 6f 6d 6d 69 74 20 3d         zCommit =
11210 20 22 52 4f 4c 4c 42 41 43 4b 22 3b 0a 20 20 20   "ROLLBACK";.   
11220 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
11230 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 72    }.    }.    fr
11240 65 65 28 61 7a 43 6f 6c 29 3b 0a 20 20 20 20 66  ee(azCol);.    f
11250 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 20 20 73  close(in);.    s
11260 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
11270 70 53 74 6d 74 29 3b 0a 20 20 20 20 28 76 6f 69  pStmt);.    (voi
11280 64 29 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70  d)sqlite3_exec(p
11290 44 62 2d 3e 64 62 2c 20 7a 43 6f 6d 6d 69 74 2c  Db->db, zCommit,
112a0 20 30 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 20 20   0, 0, 0);..    
112b0 69 66 28 20 7a 43 6f 6d 6d 69 74 5b 30 5d 20 3d  if( zCommit[0] =
112c0 3d 20 27 43 27 20 29 7b 0a 20 20 20 20 20 20 2f  = 'C' ){.      /
112d0 2a 20 73 75 63 63 65 73 73 2c 20 73 65 74 20 72  * success, set r
112e0 65 73 75 6c 74 20 61 73 20 6e 75 6d 62 65 72 20  esult as number 
112f0 6f 66 20 6c 69 6e 65 73 20 70 72 6f 63 65 73 73  of lines process
11300 65 64 20 2a 2f 0a 20 20 20 20 20 20 70 52 65 73  ed */.      pRes
11310 75 6c 74 20 3d 20 54 63 6c 5f 47 65 74 4f 62 6a  ult = Tcl_GetObj
11320 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a  Result(interp);.
11330 20 20 20 20 20 20 54 63 6c 5f 53 65 74 49 6e 74        Tcl_SetInt
11340 4f 62 6a 28 70 52 65 73 75 6c 74 2c 20 6c 69 6e  Obj(pResult, lin
11350 65 6e 6f 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  eno);.      rc =
11360 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c   TCL_OK;.    }el
11370 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 66 61 69  se{.      /* fai
11380 6c 75 72 65 2c 20 61 70 70 65 6e 64 20 6c 69 6e  lure, append lin
11390 65 6e 6f 20 77 68 65 72 65 20 66 61 69 6c 65 64  eno where failed
113a0 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
113b0 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
113c0 66 28 7a 4c 69 6e 65 4e 75 6d 29 2c 20 7a 4c 69  f(zLineNum), zLi
113d0 6e 65 4e 75 6d 2c 22 25 64 22 2c 6c 69 6e 65 6e  neNum,"%d",linen
113e0 6f 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70  o);.      Tcl_Ap
113f0 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
11400 70 2c 22 2c 20 66 61 69 6c 65 64 20 77 68 69 6c  p,", failed whil
11410 65 20 70 72 6f 63 65 73 73 69 6e 67 20 6c 69 6e  e processing lin
11420 65 3a 20 22 2c 7a 4c 69 6e 65 4e 75 6d 2c 30 29  e: ",zLineNum,0)
11430 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c  ;.      rc = TCL
11440 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
11450 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
11460 2f 2a 0a 20 20 2a 2a 20 20 20 20 24 64 62 20 65  /*.  **    $db e
11470 6e 61 62 6c 65 5f 6c 6f 61 64 5f 65 78 74 65 6e  nable_load_exten
11480 73 69 6f 6e 20 42 4f 4f 4c 45 41 4e 0a 20 20 2a  sion BOOLEAN.  *
11490 2a 0a 20 20 2a 2a 20 54 75 72 6e 20 74 68 65 20  *.  ** Turn the 
114a0 65 78 74 65 6e 73 69 6f 6e 20 6c 6f 61 64 69 6e  extension loadin
114b0 67 20 66 65 61 74 75 72 65 20 6f 6e 20 6f 72 20  g feature on or 
114c0 6f 66 66 2e 20 20 49 74 20 69 66 20 6f 66 66 20  off.  It if off 
114d0 62 79 0a 20 20 2a 2a 20 64 65 66 61 75 6c 74 2e  by.  ** default.
114e0 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f  .  */.  case DB_
114f0 45 4e 41 42 4c 45 5f 4c 4f 41 44 5f 45 58 54 45  ENABLE_LOAD_EXTE
11500 4e 53 49 4f 4e 3a 20 7b 0a 23 69 66 6e 64 65 66  NSION: {.#ifndef
11510 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41   SQLITE_OMIT_LOA
11520 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 20 20 20 20  D_EXTENSION.    
11530 69 6e 74 20 6f 6e 6f 66 66 3b 0a 20 20 20 20 69  int onoff;.    i
11540 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20  f( objc!=3 ){.  
11550 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
11560 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20  Args(interp, 2, 
11570 6f 62 6a 76 2c 20 22 42 4f 4f 4c 45 41 4e 22 29  objv, "BOOLEAN")
11580 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
11590 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
115a0 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 42      if( Tcl_GetB
115b0 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e  ooleanFromObj(in
115c0 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26  terp, objv[2], &
115d0 6f 6e 6f 66 66 29 20 29 7b 0a 20 20 20 20 20 20  onoff) ){.      
115e0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
115f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
11600 74 65 33 5f 65 6e 61 62 6c 65 5f 6c 6f 61 64 5f  te3_enable_load_
11610 65 78 74 65 6e 73 69 6f 6e 28 70 44 62 2d 3e 64  extension(pDb->d
11620 62 2c 20 6f 6e 6f 66 66 29 3b 0a 20 20 20 20 62  b, onoff);.    b
11630 72 65 61 6b 3b 0a 23 65 6c 73 65 0a 20 20 20 20  reak;.#else.    
11640 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
11650 28 69 6e 74 65 72 70 2c 20 22 65 78 74 65 6e 73  (interp, "extens
11660 69 6f 6e 20 6c 6f 61 64 69 6e 67 20 69 73 20 74  ion loading is t
11670 75 72 6e 65 64 20 6f 66 66 20 61 74 20 63 6f 6d  urned off at com
11680 70 69 6c 65 2d 74 69 6d 65 22 2c 0a 20 20 20 20  pile-time",.    
11690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
116a0 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
116b0 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6e 64 69  TCL_ERROR;.#endi
116c0 66 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  f.  }..  /*.  **
116d0 20 20 20 20 24 64 62 20 65 72 72 6f 72 63 6f 64      $db errorcod
116e0 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75  e.  **.  ** Retu
116f0 72 6e 20 74 68 65 20 6e 75 6d 65 72 69 63 20 65  rn the numeric e
11700 72 72 6f 72 20 63 6f 64 65 20 74 68 61 74 20 77  rror code that w
11710 61 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  as returned by t
11720 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 0a 20  he most recent. 
11730 20 2a 2a 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69   ** call to sqli
11740 74 65 33 5f 65 78 65 63 28 29 2e 0a 20 20 2a 2f  te3_exec()..  */
11750 0a 20 20 63 61 73 65 20 44 42 5f 45 52 52 4f 52  .  case DB_ERROR
11760 43 4f 44 45 3a 20 7b 0a 20 20 20 20 54 63 6c 5f  CODE: {.    Tcl_
11770 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
11780 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f  erp, Tcl_NewIntO
11790 62 6a 28 73 71 6c 69 74 65 33 5f 65 72 72 63 6f  bj(sqlite3_errco
117a0 64 65 28 70 44 62 2d 3e 64 62 29 29 29 3b 0a 20  de(pDb->db)));. 
117b0 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
117c0 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 24 64 62 20   /*.  **    $db 
117d0 65 78 69 73 74 73 20 24 73 71 6c 0a 20 20 2a 2a  exists $sql.  **
117e0 20 20 20 20 24 64 62 20 6f 6e 65 63 6f 6c 75 6d      $db onecolum
117f0 6e 20 24 73 71 6c 0a 20 20 2a 2a 0a 20 20 2a 2a  n $sql.  **.  **
11800 20 54 68 65 20 6f 6e 65 63 6f 6c 75 6d 6e 20 6d   The onecolumn m
11810 65 74 68 6f 64 20 69 73 20 74 68 65 20 65 71 75  ethod is the equ
11820 69 76 61 6c 65 6e 74 20 6f 66 3a 0a 20 20 2a 2a  ivalent of:.  **
11830 20 20 20 20 20 6c 69 6e 64 65 78 20 5b 24 64 62       lindex [$db
11840 20 65 76 61 6c 20 24 73 71 6c 5d 20 30 0a 20 20   eval $sql] 0.  
11850 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 45 58 49  */.  case DB_EXI
11860 53 54 53 3a 20 0a 20 20 63 61 73 65 20 44 42 5f  STS: .  case DB_
11870 4f 4e 45 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20  ONECOLUMN: {.   
11880 20 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 20 73   DbEvalContext s
11890 45 76 61 6c 3b 0a 20 20 20 20 69 66 28 20 6f 62  Eval;.    if( ob
118a0 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 54  jc!=3 ){.      T
118b0 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
118c0 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c  interp, 2, objv,
118d0 20 22 53 51 4c 22 29 3b 0a 20 20 20 20 20 20 72   "SQL");.      r
118e0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
118f0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 62 45 76  .    }..    dbEv
11900 61 6c 49 6e 69 74 28 26 73 45 76 61 6c 2c 20 70  alInit(&sEval, p
11910 44 62 2c 20 6f 62 6a 76 5b 32 5d 2c 20 30 29 3b  Db, objv[2], 0);
11920 0a 20 20 20 20 72 63 20 3d 20 64 62 45 76 61 6c  .    rc = dbEval
11930 53 74 65 70 28 26 73 45 76 61 6c 29 3b 0a 20 20  Step(&sEval);.  
11940 20 20 69 66 28 20 63 68 6f 69 63 65 3d 3d 44 42    if( choice==DB
11950 5f 4f 4e 45 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20  _ONECOLUMN ){.  
11960 20 20 20 20 69 66 28 20 72 63 3d 3d 54 43 4c 5f      if( rc==TCL_
11970 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63  OK ){.        Tc
11980 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
11990 6e 74 65 72 70 2c 20 64 62 45 76 61 6c 43 6f 6c  nterp, dbEvalCol
119a0 75 6d 6e 56 61 6c 75 65 28 26 73 45 76 61 6c 2c  umnValue(&sEval,
119b0 20 30 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20   0));.      }.  
119c0 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d    }else if( rc==
119d0 54 43 4c 5f 42 52 45 41 4b 20 7c 7c 20 72 63 3d  TCL_BREAK || rc=
119e0 3d 54 43 4c 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  =TCL_OK ){.     
119f0 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
11a00 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
11a10 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28 72 63 3d 3d  wBooleanObj(rc==
11a20 54 43 4c 5f 4f 4b 29 29 3b 0a 20 20 20 20 7d 0a  TCL_OK));.    }.
11a30 20 20 20 20 64 62 45 76 61 6c 46 69 6e 61 6c 69      dbEvalFinali
11a40 7a 65 28 26 73 45 76 61 6c 29 3b 0a 0a 20 20 20  ze(&sEval);..   
11a50 20 69 66 28 20 72 63 3d 3d 54 43 4c 5f 42 52 45   if( rc==TCL_BRE
11a60 41 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  AK ){.      rc =
11a70 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20   TCL_OK;.    }. 
11a80 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20     break;.  }.  
11a90 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 24   .  /*.  **    $
11aa0 64 62 20 65 76 61 6c 20 24 73 71 6c 20 3f 61 72  db eval $sql ?ar
11ab0 72 61 79 3f 20 3f 7b 20 20 2e 2e 2e 63 6f 64 65  ray? ?{  ...code
11ac0 2e 2e 2e 20 7d 3f 0a 20 20 2a 2a 0a 20 20 2a 2a  ... }?.  **.  **
11ad0 20 54 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65   The SQL stateme
11ae0 6e 74 20 69 6e 20 24 73 71 6c 20 69 73 20 65 76  nt in $sql is ev
11af0 61 6c 75 61 74 65 64 2e 20 20 46 6f 72 20 65 61  aluated.  For ea
11b00 63 68 20 72 6f 77 2c 20 74 68 65 20 76 61 6c 75  ch row, the valu
11b10 65 73 20 61 72 65 0a 20 20 2a 2a 20 70 6c 61 63  es are.  ** plac
11b20 65 64 20 69 6e 20 65 6c 65 6d 65 6e 74 73 20 6f  ed in elements o
11b30 66 20 74 68 65 20 61 72 72 61 79 20 6e 61 6d 65  f the array name
11b40 64 20 22 61 72 72 61 79 22 20 61 6e 64 20 2e 2e  d "array" and ..
11b50 2e 63 6f 64 65 2e 2e 2e 20 69 73 20 65 78 65 63  .code... is exec
11b60 75 74 65 64 2e 0a 20 20 2a 2a 20 49 66 20 22 61  uted..  ** If "a
11b70 72 72 61 79 22 20 61 6e 64 20 22 63 6f 64 65 22  rray" and "code"
11b80 20 61 72 65 20 6f 6d 69 74 74 65 64 2c 20 74 68   are omitted, th
11b90 65 6e 20 6e 6f 20 63 61 6c 6c 62 61 63 6b 20 69  en no callback i
11ba0 73 20 65 76 65 72 79 20 69 6e 76 6f 6b 65 64 2e  s every invoked.
11bb0 0a 20 20 2a 2a 20 49 66 20 22 61 72 72 61 79 22  .  ** If "array"
11bc0 20 69 73 20 61 6e 20 65 6d 70 74 79 20 73 74 72   is an empty str
11bd0 69 6e 67 2c 20 74 68 65 6e 20 74 68 65 20 76 61  ing, then the va
11be0 6c 75 65 73 20 61 72 65 20 70 6c 61 63 65 64 20  lues are placed 
11bf0 69 6e 20 76 61 72 69 61 62 6c 65 73 0a 20 20 2a  in variables.  *
11c00 2a 20 74 68 61 74 20 68 61 76 65 20 74 68 65 20  * that have the 
11c10 73 61 6d 65 20 6e 61 6d 65 20 61 73 20 74 68 65  same name as the
11c20 20 66 69 65 6c 64 73 20 65 78 74 72 61 63 74 65   fields extracte
11c30 64 20 62 79 20 74 68 65 20 71 75 65 72 79 2e 0a  d by the query..
11c40 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 45    */.  case DB_E
11c50 56 41 4c 3a 20 7b 0a 20 20 20 20 69 66 28 20 6f  VAL: {.    if( o
11c60 62 6a 63 3c 33 20 7c 7c 20 6f 62 6a 63 3e 35 20  bjc<3 || objc>5 
11c70 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f  ){.      Tcl_Wro
11c80 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
11c90 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 53 51 4c 20  , 2, objv, "SQL 
11ca0 3f 41 52 52 41 59 2d 4e 41 4d 45 3f 20 3f 53 43  ?ARRAY-NAME? ?SC
11cb0 52 49 50 54 3f 22 29 3b 0a 20 20 20 20 20 20 72  RIPT?");.      r
11cc0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
11cd0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
11ce0 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20 20 20 20 20  objc==3 ){.     
11cf0 20 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 20 73   DbEvalContext s
11d00 45 76 61 6c 3b 0a 20 20 20 20 20 20 54 63 6c 5f  Eval;.      Tcl_
11d10 4f 62 6a 20 2a 70 52 65 74 20 3d 20 54 63 6c 5f  Obj *pRet = Tcl_
11d20 4e 65 77 4f 62 6a 28 29 3b 0a 20 20 20 20 20 20  NewObj();.      
11d30 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
11d40 28 70 52 65 74 29 3b 0a 20 20 20 20 20 20 64 62  (pRet);.      db
11d50 45 76 61 6c 49 6e 69 74 28 26 73 45 76 61 6c 2c  EvalInit(&sEval,
11d60 20 70 44 62 2c 20 6f 62 6a 76 5b 32 5d 2c 20 30   pDb, objv[2], 0
11d70 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  );.      while( 
11d80 54 43 4c 5f 4f 4b 3d 3d 28 72 63 20 3d 20 64 62  TCL_OK==(rc = db
11d90 45 76 61 6c 53 74 65 70 28 26 73 45 76 61 6c 29  EvalStep(&sEval)
11da0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  ) ){.        int
11db0 20 69 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   i;.        int 
11dc0 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 64 62  nCol;.        db
11dd0 45 76 61 6c 52 6f 77 49 6e 66 6f 28 26 73 45 76  EvalRowInfo(&sEv
11de0 61 6c 2c 20 26 6e 43 6f 6c 2c 20 30 29 3b 0a 20  al, &nCol, 0);. 
11df0 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
11e00 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  i<nCol; i++){.  
11e10 20 20 20 20 20 20 20 20 54 63 6c 5f 4c 69 73 74          Tcl_List
11e20 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
11e30 28 69 6e 74 65 72 70 2c 20 70 52 65 74 2c 20 64  (interp, pRet, d
11e40 62 45 76 61 6c 43 6f 6c 75 6d 6e 56 61 6c 75 65  bEvalColumnValue
11e50 28 26 73 45 76 61 6c 2c 20 69 29 29 3b 0a 20 20  (&sEval, i));.  
11e60 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
11e70 20 20 20 20 20 20 64 62 45 76 61 6c 46 69 6e 61        dbEvalFina
11e80 6c 69 7a 65 28 26 73 45 76 61 6c 29 3b 0a 20 20  lize(&sEval);.  
11e90 20 20 20 20 69 66 28 20 72 63 3d 3d 54 43 4c 5f      if( rc==TCL_
11ea0 42 52 45 41 4b 20 29 7b 0a 20 20 20 20 20 20 20  BREAK ){.       
11eb0 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
11ec0 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74 29 3b  t(interp, pRet);
11ed0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 54 43  .        rc = TC
11ee0 4c 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  L_OK;.      }.  
11ef0 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
11f00 6f 75 6e 74 28 70 52 65 74 29 3b 0a 20 20 20 20  ount(pRet);.    
11f10 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 43 6c 69  }else{.      Cli
11f20 65 6e 74 44 61 74 61 20 63 64 5b 32 5d 3b 0a 20  entData cd[2];. 
11f30 20 20 20 20 20 44 62 45 76 61 6c 43 6f 6e 74 65       DbEvalConte
11f40 78 74 20 2a 70 3b 0a 20 20 20 20 20 20 54 63 6c  xt *p;.      Tcl
11f50 5f 4f 62 6a 20 2a 70 41 72 72 61 79 20 3d 20 30  _Obj *pArray = 0
11f60 3b 0a 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20  ;.      Tcl_Obj 
11f70 2a 70 53 63 72 69 70 74 3b 0a 0a 20 20 20 20 20  *pScript;..     
11f80 20 69 66 28 20 6f 62 6a 63 3d 3d 35 20 26 26 20   if( objc==5 && 
11f90 2a 28 63 68 61 72 20 2a 29 54 63 6c 5f 47 65 74  *(char *)Tcl_Get
11fa0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 20  String(objv[3]) 
11fb0 29 7b 0a 20 20 20 20 20 20 20 20 70 41 72 72 61  ){.        pArra
11fc0 79 20 3d 20 6f 62 6a 76 5b 33 5d 3b 0a 20 20 20  y = objv[3];.   
11fd0 20 20 20 7d 0a 20 20 20 20 20 20 70 53 63 72 69     }.      pScri
11fe0 70 74 20 3d 20 6f 62 6a 76 5b 6f 62 6a 63 2d 31  pt = objv[objc-1
11ff0 5d 3b 0a 20 20 20 20 20 20 54 63 6c 5f 49 6e 63  ];.      Tcl_Inc
12000 72 52 65 66 43 6f 75 6e 74 28 70 53 63 72 69 70  rRefCount(pScrip
12010 74 29 3b 0a 20 20 20 20 20 20 0a 20 20 20 20 20  t);.      .     
12020 20 70 20 3d 20 28 44 62 45 76 61 6c 43 6f 6e 74   p = (DbEvalCont
12030 65 78 74 20 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28  ext *)Tcl_Alloc(
12040 73 69 7a 65 6f 66 28 44 62 45 76 61 6c 43 6f 6e  sizeof(DbEvalCon
12050 74 65 78 74 29 29 3b 0a 20 20 20 20 20 20 64 62  text));.      db
12060 45 76 61 6c 49 6e 69 74 28 70 2c 20 70 44 62 2c  EvalInit(p, pDb,
12070 20 6f 62 6a 76 5b 32 5d 2c 20 70 41 72 72 61 79   objv[2], pArray
12080 29 3b 0a 0a 20 20 20 20 20 20 63 64 5b 30 5d 20  );..      cd[0] 
12090 3d 20 28 76 6f 69 64 20 2a 29 70 3b 0a 20 20 20  = (void *)p;.   
120a0 20 20 20 63 64 5b 31 5d 20 3d 20 28 76 6f 69 64     cd[1] = (void
120b0 20 2a 29 70 53 63 72 69 70 74 3b 0a 20 20 20 20   *)pScript;.    
120c0 20 20 72 63 20 3d 20 44 62 45 76 61 6c 4e 65 78    rc = DbEvalNex
120d0 74 43 6d 64 28 63 64 2c 20 69 6e 74 65 72 70 2c  tCmd(cd, interp,
120e0 20 54 43 4c 5f 4f 4b 29 3b 0a 20 20 20 20 7d 0a   TCL_OK);.    }.
120f0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
12100 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64    /*.  **     $d
12110 62 20 66 75 6e 63 74 69 6f 6e 20 4e 41 4d 45 20  b function NAME 
12120 5b 2d 61 72 67 63 6f 75 6e 74 20 4e 5d 20 53 43  [-argcount N] SC
12130 52 49 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43  RIPT.  **.  ** C
12140 72 65 61 74 65 20 61 20 6e 65 77 20 53 51 4c 20  reate a new SQL 
12150 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 20  function called 
12160 4e 41 4d 45 2e 20 20 57 68 65 6e 65 76 65 72 20  NAME.  Whenever 
12170 74 68 61 74 20 66 75 6e 63 74 69 6f 6e 20 69 73  that function is
12180 0a 20 20 2a 2a 20 63 61 6c 6c 65 64 2c 20 69 6e  .  ** called, in
12190 76 6f 6b 65 20 53 43 52 49 50 54 20 74 6f 20 65  voke SCRIPT to e
121a0 76 61 6c 75 61 74 65 20 74 68 65 20 66 75 6e 63  valuate the func
121b0 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 63 61 73  tion..  */.  cas
121c0 65 20 44 42 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b  e DB_FUNCTION: {
121d0 0a 20 20 20 20 53 71 6c 46 75 6e 63 20 2a 70 46  .    SqlFunc *pF
121e0 75 6e 63 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  unc;.    Tcl_Obj
121f0 20 2a 70 53 63 72 69 70 74 3b 0a 20 20 20 20 63   *pScript;.    c
12200 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20  har *zName;.    
12210 69 6e 74 20 6e 41 72 67 20 3d 20 2d 31 3b 0a 20  int nArg = -1;. 
12220 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d 36 20 29     if( objc==6 )
12230 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  {.      const ch
12240 61 72 20 2a 7a 20 3d 20 54 63 6c 5f 47 65 74 53  ar *z = Tcl_GetS
12250 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a  tring(objv[3]);.
12260 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 74        int n = st
12270 72 6c 65 6e 33 30 28 7a 29 3b 0a 20 20 20 20 20  rlen30(z);.     
12280 20 69 66 28 20 6e 3e 32 20 26 26 20 73 74 72 6e   if( n>2 && strn
12290 63 6d 70 28 7a 2c 20 22 2d 61 72 67 63 6f 75 6e  cmp(z, "-argcoun
122a0 74 22 2c 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  t",n)==0 ){.    
122b0 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49      if( Tcl_GetI
122c0 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
122d0 2c 20 6f 62 6a 76 5b 34 5d 2c 20 26 6e 41 72 67  , objv[4], &nArg
122e0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
122f0 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 69 66  RROR;.        if
12300 28 20 6e 41 72 67 3c 30 20 29 7b 0a 20 20 20 20  ( nArg<0 ){.    
12310 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
12320 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
12330 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  number of argume
12340 6e 74 73 20 6d 75 73 74 20 62 65 20 6e 6f 6e 2d  nts must be non-
12350 6e 65 67 61 74 69 76 65 22 2c 0a 20 20 20 20 20  negative",.     
12360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12370 20 20 20 20 20 20 28 63 68 61 72 2a 29 30 29 3b        (char*)0);
12380 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
12390 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
123a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
123b0 20 20 20 20 20 70 53 63 72 69 70 74 20 3d 20 6f       pScript = o
123c0 62 6a 76 5b 35 5d 3b 0a 20 20 20 20 7d 65 6c 73  bjv[5];.    }els
123d0 65 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b  e if( objc!=4 ){
123e0 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  .      Tcl_Wrong
123f0 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
12400 32 2c 20 6f 62 6a 76 2c 20 22 4e 41 4d 45 20 5b  2, objv, "NAME [
12410 2d 61 72 67 63 6f 75 6e 74 20 4e 5d 20 53 43 52  -argcount N] SCR
12420 49 50 54 22 29 3b 0a 20 20 20 20 20 20 72 65 74  IPT");.      ret
12430 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
12440 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
12450 70 53 63 72 69 70 74 20 3d 20 6f 62 6a 76 5b 33  pScript = objv[3
12460 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4e 61  ];.    }.    zNa
12470 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  me = Tcl_GetStri
12480 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32  ngFromObj(objv[2
12490 5d 2c 20 30 29 3b 0a 20 20 20 20 70 46 75 6e 63  ], 0);.    pFunc
124a0 20 3d 20 66 69 6e 64 53 71 6c 46 75 6e 63 28 70   = findSqlFunc(p
124b0 44 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  Db, zName);.    
124c0 69 66 28 20 70 46 75 6e 63 3d 3d 30 20 29 20 72  if( pFunc==0 ) r
124d0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
124e0 0a 20 20 20 20 69 66 28 20 70 46 75 6e 63 2d 3e  .    if( pFunc->
124f0 70 53 63 72 69 70 74 20 29 7b 0a 20 20 20 20 20  pScript ){.     
12500 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
12510 74 28 70 46 75 6e 63 2d 3e 70 53 63 72 69 70 74  t(pFunc->pScript
12520 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 46 75  );.    }.    pFu
12530 6e 63 2d 3e 70 53 63 72 69 70 74 20 3d 20 70 53  nc->pScript = pS
12540 63 72 69 70 74 3b 0a 20 20 20 20 54 63 6c 5f 49  cript;.    Tcl_I
12550 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 53 63 72  ncrRefCount(pScr
12560 69 70 74 29 3b 0a 20 20 20 20 70 46 75 6e 63 2d  ipt);.    pFunc-
12570 3e 75 73 65 45 76 61 6c 4f 62 6a 76 20 3d 20 73  >useEvalObjv = s
12580 61 66 65 54 6f 55 73 65 45 76 61 6c 4f 62 6a 76  afeToUseEvalObjv
12590 28 69 6e 74 65 72 70 2c 20 70 53 63 72 69 70 74  (interp, pScript
125a0 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
125b0 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
125c0 69 6f 6e 28 70 44 62 2d 3e 64 62 2c 20 7a 4e 61  ion(pDb->db, zNa
125d0 6d 65 2c 20 6e 41 72 67 2c 20 53 51 4c 49 54 45  me, nArg, SQLITE
125e0 5f 55 54 46 38 2c 0a 20 20 20 20 20 20 20 20 70  _UTF8,.        p
125f0 46 75 6e 63 2c 20 74 63 6c 53 71 6c 46 75 6e 63  Func, tclSqlFunc
12600 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  , 0, 0);.    if(
12610 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
12620 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c  {.      rc = TCL
12630 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 54 63  _ERROR;.      Tc
12640 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
12650 72 70 2c 20 28 63 68 61 72 20 2a 29 73 71 6c 69  rp, (char *)sqli
12660 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e  te3_errmsg(pDb->
12670 64 62 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c  db), TCL_VOLATIL
12680 45 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 72  E);.    }.    br
12690 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  eak;.  }..  /*. 
126a0 20 2a 2a 20 20 20 20 20 24 64 62 20 69 6e 63 72   **     $db incr
126b0 62 6c 6f 62 20 3f 2d 72 65 61 64 6f 6e 6c 79 3f  blob ?-readonly?
126c0 20 3f 44 42 3f 20 54 41 42 4c 45 20 43 4f 4c 55   ?DB? TABLE COLU
126d0 4d 4e 20 52 4f 57 49 44 0a 20 20 2a 2f 0a 20 20  MN ROWID.  */.  
126e0 63 61 73 65 20 44 42 5f 49 4e 43 52 42 4c 4f 42  case DB_INCRBLOB
126f0 3a 20 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  : {.#ifdef SQLIT
12700 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a  E_OMIT_INCRBLOB.
12710 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
12720 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 69 6e  sult(interp, "in
12730 63 72 62 6c 6f 62 20 6e 6f 74 20 61 76 61 69 6c  crblob not avail
12740 61 62 6c 65 20 69 6e 20 74 68 69 73 20 62 75 69  able in this bui
12750 6c 64 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  ld", 0);.    ret
12760 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23  urn TCL_ERROR;.#
12770 65 6c 73 65 0a 20 20 20 20 69 6e 74 20 69 73 52  else.    int isR
12780 65 61 64 6f 6e 6c 79 20 3d 20 30 3b 0a 20 20 20  eadonly = 0;.   
12790 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
127a0 20 3d 20 22 6d 61 69 6e 22 3b 0a 20 20 20 20 63   = "main";.    c
127b0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 6c  onst char *zTabl
127c0 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  e;.    const cha
127d0 72 20 2a 7a 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  r *zColumn;.    
127e0 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 69 52 6f  sqlite_int64 iRo
127f0 77 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b  w;..    /* Check
12800 20 66 6f 72 20 74 68 65 20 2d 72 65 61 64 6f 6e   for the -readon
12810 6c 79 20 6f 70 74 69 6f 6e 20 2a 2f 0a 20 20 20  ly option */.   
12820 20 69 66 28 20 6f 62 6a 63 3e 33 20 26 26 20 73   if( objc>3 && s
12830 74 72 63 6d 70 28 54 63 6c 5f 47 65 74 53 74 72  trcmp(Tcl_GetStr
12840 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 2c 20 22 2d  ing(objv[2]), "-
12850 72 65 61 64 6f 6e 6c 79 22 29 3d 3d 30 20 29 7b  readonly")==0 ){
12860 0a 20 20 20 20 20 20 69 73 52 65 61 64 6f 6e 6c  .      isReadonl
12870 79 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20  y = 1;.    }..  
12880 20 20 69 66 28 20 6f 62 6a 63 21 3d 28 35 2b 69    if( objc!=(5+i
12890 73 52 65 61 64 6f 6e 6c 79 29 20 26 26 20 6f 62  sReadonly) && ob
128a0 6a 63 21 3d 28 36 2b 69 73 52 65 61 64 6f 6e 6c  jc!=(6+isReadonl
128b0 79 29 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  y) ){.      Tcl_
128c0 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
128d0 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f  erp, 2, objv, "?
128e0 2d 72 65 61 64 6f 6e 6c 79 3f 20 3f 44 42 3f 20  -readonly? ?DB? 
128f0 54 41 42 4c 45 20 43 4f 4c 55 4d 4e 20 52 4f 57  TABLE COLUMN ROW
12900 49 44 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ID");.      retu
12910 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
12920 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 6f 62 6a    }..    if( obj
12930 63 3d 3d 28 36 2b 69 73 52 65 61 64 6f 6e 6c 79  c==(6+isReadonly
12940 29 20 29 7b 0a 20 20 20 20 20 20 7a 44 62 20 3d  ) ){.      zDb =
12950 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
12960 62 6a 76 5b 32 5d 29 3b 0a 20 20 20 20 7d 0a 20  bjv[2]);.    }. 
12970 20 20 20 7a 54 61 62 6c 65 20 3d 20 54 63 6c 5f     zTable = Tcl_
12980 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 6f  GetString(objv[o
12990 62 6a 63 2d 33 5d 29 3b 0a 20 20 20 20 7a 43 6f  bjc-3]);.    zCo
129a0 6c 75 6d 6e 20 3d 20 54 63 6c 5f 47 65 74 53 74  lumn = Tcl_GetSt
129b0 72 69 6e 67 28 6f 62 6a 76 5b 6f 62 6a 63 2d 32  ring(objv[objc-2
129c0 5d 29 3b 0a 20 20 20 20 72 63 20 3d 20 54 63 6c  ]);.    rc = Tcl
129d0 5f 47 65 74 57 69 64 65 49 6e 74 46 72 6f 6d 4f  _GetWideIntFromO
129e0 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
129f0 6f 62 6a 63 2d 31 5d 2c 20 26 69 52 6f 77 29 3b  objc-1], &iRow);
12a00 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 54 43  ..    if( rc==TC
12a10 4c 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  L_OK ){.      rc
12a20 20 3d 20 63 72 65 61 74 65 49 6e 63 72 62 6c 6f   = createIncrblo
12a30 62 43 68 61 6e 6e 65 6c 28 0a 20 20 20 20 20 20  bChannel(.      
12a40 20 20 20 20 69 6e 74 65 72 70 2c 20 70 44 62 2c      interp, pDb,
12a50 20 7a 44 62 2c 20 7a 54 61 62 6c 65 2c 20 7a 43   zDb, zTable, zC
12a60 6f 6c 75 6d 6e 2c 20 69 52 6f 77 2c 20 69 73 52  olumn, iRow, isR
12a70 65 61 64 6f 6e 6c 79 0a 20 20 20 20 20 20 29 3b  eadonly.      );
12a80 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
12a90 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
12aa0 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20  /*.  **     $db 
12ab0 69 6e 74 65 72 72 75 70 74 0a 20 20 2a 2a 0a 20  interrupt.  **. 
12ac0 20 2a 2a 20 49 6e 74 65 72 72 75 70 74 20 74 68   ** Interrupt th
12ad0 65 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 74  e execution of t
12ae0 68 65 20 69 6e 6e 65 72 2d 6d 6f 73 74 20 53 51  he inner-most SQ
12af0 4c 20 69 6e 74 65 72 70 72 65 74 65 72 2e 20 20  L interpreter.  
12b00 54 68 69 73 0a 20 20 2a 2a 20 63 61 75 73 65 73  This.  ** causes
12b10 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65   the SQL stateme
12b20 6e 74 20 74 6f 20 72 65 74 75 72 6e 20 61 6e 20  nt to return an 
12b30 65 72 72 6f 72 20 6f 66 20 53 51 4c 49 54 45 5f  error of SQLITE_
12b40 49 4e 54 45 52 52 55 50 54 2e 0a 20 20 2a 2f 0a  INTERRUPT..  */.
12b50 20 20 63 61 73 65 20 44 42 5f 49 4e 54 45 52 52    case DB_INTERR
12b60 55 50 54 3a 20 7b 0a 20 20 20 20 73 71 6c 69 74  UPT: {.    sqlit
12b70 65 33 5f 69 6e 74 65 72 72 75 70 74 28 70 44 62  e3_interrupt(pDb
12b80 2d 3e 64 62 29 3b 0a 20 20 20 20 62 72 65 61 6b  ->db);.    break
12b90 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ;.  }..  /*.  **
12ba0 20 20 20 20 20 24 64 62 20 6e 75 6c 6c 76 61 6c       $db nullval
12bb0 75 65 20 3f 53 54 52 49 4e 47 3f 0a 20 20 2a 2a  ue ?STRING?.  **
12bc0 0a 20 20 2a 2a 20 43 68 61 6e 67 65 20 74 65 78  .  ** Change tex
12bd0 74 20 75 73 65 64 20 77 68 65 6e 20 61 20 4e 55  t used when a NU
12be0 4c 4c 20 63 6f 6d 65 73 20 62 61 63 6b 20 66 72  LL comes back fr
12bf0 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  om the database.
12c00 20 49 66 20 3f 53 54 52 49 4e 47 3f 0a 20 20 2a   If ?STRING?.  *
12c10 2a 20 69 73 20 6e 6f 74 20 70 72 65 73 65 6e 74  * is not present
12c20 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 72 65  , then the curre
12c30 6e 74 20 73 74 72 69 6e 67 20 75 73 65 64 20 66  nt string used f
12c40 6f 72 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72  or NULL is retur
12c50 6e 65 64 2e 0a 20 20 2a 2a 20 49 66 20 53 54 52  ned..  ** If STR
12c60 49 4e 47 20 69 73 20 70 72 65 73 65 6e 74 2c 20  ING is present, 
12c70 74 68 65 6e 20 53 54 52 49 4e 47 20 69 73 20 72  then STRING is r
12c80 65 74 75 72 6e 65 64 2e 0a 20 20 2a 2a 0a 20 20  eturned..  **.  
12c90 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 4e 55 4c  */.  case DB_NUL
12ca0 4c 56 41 4c 55 45 3a 20 7b 0a 20 20 20 20 69 66  LVALUE: {.    if
12cb0 28 20 6f 62 6a 63 21 3d 32 20 26 26 20 6f 62 6a  ( objc!=2 && obj
12cc0 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 54 63  c!=3 ){.      Tc
12cd0 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
12ce0 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
12cf0 22 4e 55 4c 4c 56 41 4c 55 45 22 29 3b 0a 20 20  "NULLVALUE");.  
12d00 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
12d10 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
12d20 69 66 28 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20  if( objc==3 ){. 
12d30 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20       int len;.  
12d40 20 20 20 20 63 68 61 72 20 2a 7a 4e 75 6c 6c 20      char *zNull 
12d50 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  = Tcl_GetStringF
12d60 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20  romObj(objv[2], 
12d70 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28  &len);.      if(
12d80 20 70 44 62 2d 3e 7a 4e 75 6c 6c 20 29 7b 0a 20   pDb->zNull ){. 
12d90 20 20 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28         Tcl_Free(
12da0 70 44 62 2d 3e 7a 4e 75 6c 6c 29 3b 0a 20 20 20  pDb->zNull);.   
12db0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 7a     }.      if( z
12dc0 4e 75 6c 6c 20 26 26 20 6c 65 6e 3e 30 20 29 7b  Null && len>0 ){
12dd0 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e  .        pDb->zN
12de0 75 6c 6c 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28  ull = Tcl_Alloc(
12df0 20 6c 65 6e 20 2b 20 31 20 29 3b 0a 20 20 20 20   len + 1 );.    
12e00 20 20 20 20 73 74 72 6e 63 70 79 28 70 44 62 2d      strncpy(pDb-
12e10 3e 7a 4e 75 6c 6c 2c 20 7a 4e 75 6c 6c 2c 20 6c  >zNull, zNull, l
12e20 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 70 44 62  en);.        pDb
12e30 2d 3e 7a 4e 75 6c 6c 5b 6c 65 6e 5d 20 3d 20 27  ->zNull[len] = '
12e40 5c 30 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  \0';.      }else
12e50 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a  {.        pDb->z
12e60 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  Null = 0;.      
12e70 7d 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f  }.    }.    Tcl_
12e80 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
12e90 65 72 70 2c 20 64 62 54 65 78 74 54 6f 4f 62 6a  erp, dbTextToObj
12ea0 28 70 44 62 2d 3e 7a 4e 75 6c 6c 29 29 3b 0a 20  (pDb->zNull));. 
12eb0 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
12ec0 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62   /*.  **     $db
12ed0 20 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77   last_insert_row
12ee0 69 64 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65  id .  **.  ** Re
12ef0 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72 20  turn an integer 
12f00 77 68 69 63 68 20 69 73 20 74 68 65 20 52 4f 57  which is the ROW
12f10 49 44 20 66 6f 72 20 74 68 65 20 6d 6f 73 74 20  ID for the most 
12f20 72 65 63 65 6e 74 20 69 6e 73 65 72 74 2e 0a 20  recent insert.. 
12f30 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 4c 41   */.  case DB_LA
12f40 53 54 5f 49 4e 53 45 52 54 5f 52 4f 57 49 44 3a  ST_INSERT_ROWID:
12f50 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a   {.    Tcl_Obj *
12f60 70 52 65 73 75 6c 74 3b 0a 20 20 20 20 54 63 6c  pResult;.    Tcl
12f70 5f 57 69 64 65 49 6e 74 20 72 6f 77 69 64 3b 0a  _WideInt rowid;.
12f80 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20      if( objc!=2 
12f90 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f  ){.      Tcl_Wro
12fa0 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
12fb0 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 22 29 3b 0a  , 2, objv, "");.
12fc0 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
12fd0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
12fe0 20 20 72 6f 77 69 64 20 3d 20 73 71 6c 69 74 65    rowid = sqlite
12ff0 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f  3_last_insert_ro
13000 77 69 64 28 70 44 62 2d 3e 64 62 29 3b 0a 20 20  wid(pDb->db);.  
13010 20 20 70 52 65 73 75 6c 74 20 3d 20 54 63 6c 5f    pResult = Tcl_
13020 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  GetObjResult(int
13030 65 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65  erp);.    Tcl_Se
13040 74 57 69 64 65 49 6e 74 4f 62 6a 28 70 52 65 73  tWideIntObj(pRes
13050 75 6c 74 2c 20 72 6f 77 69 64 29 3b 0a 20 20 20  ult, rowid);.   
13060 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
13070 2a 0a 20 20 2a 2a 20 54 68 65 20 44 42 5f 4f 4e  *.  ** The DB_ON
13080 45 43 4f 4c 55 4d 4e 20 6d 65 74 68 6f 64 20 69  ECOLUMN method i
13090 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 74 6f  s implemented to
130a0 67 65 74 68 65 72 20 77 69 74 68 20 44 42 5f 45  gether with DB_E
130b0 58 49 53 54 53 2e 0a 20 20 2a 2f 0a 0a 20 20 2f  XISTS..  */..  /
130c0 2a 20 20 20 20 24 64 62 20 70 72 6f 67 72 65 73  *    $db progres
130d0 73 20 3f 4e 20 43 41 4c 4c 42 41 43 4b 3f 0a 20  s ?N CALLBACK?. 
130e0 20 2a 2a 20 0a 20 20 2a 2a 20 49 6e 76 6f 6b 65   ** .  ** Invoke
130f0 20 74 68 65 20 67 69 76 65 6e 20 63 61 6c 6c 62   the given callb
13100 61 63 6b 20 65 76 65 72 79 20 4e 20 76 69 72 74  ack every N virt
13110 75 61 6c 20 6d 61 63 68 69 6e 65 20 6f 70 63 6f  ual machine opco
13120 64 65 73 20 77 68 69 6c 65 20 65 78 65 63 75 74  des while execut
13130 69 6e 67 0a 20 20 2a 2a 20 71 75 65 72 69 65 73  ing.  ** queries
13140 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  ..  */.  case DB
13150 5f 50 52 4f 47 52 45 53 53 3a 20 7b 0a 20 20 20  _PROGRESS: {.   
13160 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a   if( objc==2 ){.
13170 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a        if( pDb->z
13180 50 72 6f 67 72 65 73 73 20 29 7b 0a 20 20 20 20  Progress ){.    
13190 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
131a0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 44 62  sult(interp, pDb
131b0 2d 3e 7a 50 72 6f 67 72 65 73 73 2c 20 30 29 3b  ->zProgress, 0);
131c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
131d0 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d 34 20 29  se if( objc==4 )
131e0 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 50  {.      char *zP
131f0 72 6f 67 72 65 73 73 3b 0a 20 20 20 20 20 20 69  rogress;.      i
13200 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20 69 6e  nt len;.      in
13210 74 20 4e 3b 0a 20 20 20 20 20 20 69 66 28 20 54  t N;.      if( T
13220 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 49 6e  CL_OK!=Tcl_GetIn
13230 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
13240 20 6f 62 6a 76 5b 32 5d 2c 20 26 4e 29 20 29 7b   objv[2], &N) ){
13250 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
13260 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  TCL_ERROR;.     
13270 20 7d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44   };.      if( pD
13280 62 2d 3e 7a 50 72 6f 67 72 65 73 73 20 29 7b 0a  b->zProgress ){.
13290 20 20 20 20 20 20 20 20 54 63 6c 5f 46 72 65 65          Tcl_Free
132a0 28 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 29  (pDb->zProgress)
132b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
132c0 7a 50 72 6f 67 72 65 73 73 20 3d 20 54 63 6c 5f  zProgress = Tcl_
132d0 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
132e0 28 6f 62 6a 76 5b 33 5d 2c 20 26 6c 65 6e 29 3b  (objv[3], &len);
132f0 0a 20 20 20 20 20 20 69 66 28 20 7a 50 72 6f 67  .      if( zProg
13300 72 65 73 73 20 26 26 20 6c 65 6e 3e 30 20 29 7b  ress && len>0 ){
13310 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 50  .        pDb->zP
13320 72 6f 67 72 65 73 73 20 3d 20 54 63 6c 5f 41 6c  rogress = Tcl_Al
13330 6c 6f 63 28 20 6c 65 6e 20 2b 20 31 20 29 3b 0a  loc( len + 1 );.
13340 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70          memcpy(p
13350 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 2c 20 7a  Db->zProgress, z
13360 50 72 6f 67 72 65 73 73 2c 20 6c 65 6e 2b 31 29  Progress, len+1)
13370 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
13380 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 50 72 6f         pDb->zPro
13390 67 72 65 73 73 20 3d 20 30 3b 0a 20 20 20 20 20  gress = 0;.     
133a0 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
133b0 45 5f 4f 4d 49 54 5f 50 52 4f 47 52 45 53 53 5f  E_OMIT_PROGRESS_
133c0 43 41 4c 4c 42 41 43 4b 0a 20 20 20 20 20 20 69  CALLBACK.      i
133d0 66 28 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73  f( pDb->zProgres
133e0 73 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62  s ){.        pDb
133f0 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72  ->interp = inter
13400 70 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  p;.        sqlit
13410 65 33 5f 70 72 6f 67 72 65 73 73 5f 68 61 6e 64  e3_progress_hand
13420 6c 65 72 28 70 44 62 2d 3e 64 62 2c 20 4e 2c 20  ler(pDb->db, N, 
13430 44 62 50 72 6f 67 72 65 73 73 48 61 6e 64 6c 65  DbProgressHandle
13440 72 2c 20 70 44 62 29 3b 0a 20 20 20 20 20 20 7d  r, pDb);.      }
13450 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
13460 6c 69 74 65 33 5f 70 72 6f 67 72 65 73 73 5f 68  lite3_progress_h
13470 61 6e 64 6c 65 72 28 70 44 62 2d 3e 64 62 2c 20  andler(pDb->db, 
13480 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  0, 0, 0);.      
13490 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c  }.#endif.    }el
134a0 73 65 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72  se{.      Tcl_Wr
134b0 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
134c0 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 4e 20 43  p, 2, objv, "N C
134d0 41 4c 4c 42 41 43 4b 22 29 3b 0a 20 20 20 20 20  ALLBACK");.     
134e0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
134f0 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65  R;.    }.    bre
13500 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20  ak;.  }..  /*   
13510 20 24 64 62 20 70 72 6f 66 69 6c 65 20 3f 43 41   $db profile ?CA
13520 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a 0a 20 20 2a  LLBACK?.  **.  *
13530 2a 20 4d 61 6b 65 20 61 72 72 61 6e 67 65 6d 65  * Make arrangeme
13540 6e 74 73 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68  nts to invoke th
13550 65 20 43 41 4c 4c 42 41 43 4b 20 72 6f 75 74 69  e CALLBACK routi
13560 6e 65 20 61 66 74 65 72 20 65 61 63 68 20 53 51  ne after each SQ
13570 4c 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a  L statement.  **
13580 20 74 68 61 74 20 68 61 73 20 72 75 6e 2e 20 20   that has run.  
13590 54 68 65 20 74 65 78 74 20 6f 66 20 74 68 65 20  The text of the 
135a0 53 51 4c 20 61 6e 64 20 74 68 65 20 61 6d 6f 75  SQL and the amou
135b0 6e 74 20 6f 66 20 65 6c 61 70 73 65 20 74 69 6d  nt of elapse tim
135c0 65 20 61 72 65 0a 20 20 2a 2a 20 61 70 70 65 6e  e are.  ** appen
135d0 64 65 64 20 74 6f 20 43 41 4c 4c 42 41 43 4b 20  ded to CALLBACK 
135e0 62 65 66 6f 72 65 20 74 68 65 20 73 63 72 69 70  before the scrip
135f0 74 20 69 73 20 72 75 6e 2e 0a 20 20 2a 2f 0a 20  t is run..  */. 
13600 20 63 61 73 65 20 44 42 5f 50 52 4f 46 49 4c 45   case DB_PROFILE
13610 3a 20 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63  : {.    if( objc
13620 3e 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  >3 ){.      Tcl_
13630 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
13640 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f  erp, 2, objv, "?
13650 43 41 4c 4c 42 41 43 4b 3f 22 29 3b 0a 20 20 20  CALLBACK?");.   
13660 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
13670 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  ROR;.    }else i
13680 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20  f( objc==2 ){.  
13690 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 50 72      if( pDb->zPr
136a0 6f 66 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 20  ofile ){.       
136b0 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
136c0 74 28 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a  t(interp, pDb->z
136d0 50 72 6f 66 69 6c 65 2c 20 30 29 3b 0a 20 20 20  Profile, 0);.   
136e0 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
136f0 20 20 20 20 20 20 63 68 61 72 20 2a 7a 50 72 6f        char *zPro
13700 66 69 6c 65 3b 0a 20 20 20 20 20 20 69 6e 74 20  file;.      int 
13710 6c 65 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 70  len;.      if( p
13720 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 20 29 7b 0a  Db->zProfile ){.
13730 20 20 20 20 20 20 20 20 54 63 6c 5f 46 72 65 65          Tcl_Free
13740 28 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 29 3b  (pDb->zProfile);
13750 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a  .      }.      z
13760 50 72 6f 66 69 6c 65 20 3d 20 54 63 6c 5f 47 65  Profile = Tcl_Ge
13770 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
13780 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a 20  bjv[2], &len);. 
13790 20 20 20 20 20 69 66 28 20 7a 50 72 6f 66 69 6c       if( zProfil
137a0 65 20 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20 20  e && len>0 ){.  
137b0 20 20 20 20 20 20 70 44 62 2d 3e 7a 50 72 6f 66        pDb->zProf
137c0 69 6c 65 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28  ile = Tcl_Alloc(
137d0 20 6c 65 6e 20 2b 20 31 20 29 3b 0a 20 20 20 20   len + 1 );.    
137e0 20 20 20 20 6d 65 6d 63 70 79 28 70 44 62 2d 3e      memcpy(pDb->
137f0 7a 50 72 6f 66 69 6c 65 2c 20 7a 50 72 6f 66 69  zProfile, zProfi
13800 6c 65 2c 20 6c 65 6e 2b 31 29 3b 0a 20 20 20 20  le, len+1);.    
13810 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
13820 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 20 3d   pDb->zProfile =
13830 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 20   0;.      }.#if 
13840 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
13850 4f 4d 49 54 5f 54 52 41 43 45 29 20 26 26 20 21  OMIT_TRACE) && !
13860 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
13870 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49  MIT_FLOATING_POI
13880 4e 54 29 0a 20 20 20 20 20 20 69 66 28 20 70 44  NT).      if( pD
13890 62 2d 3e 7a 50 72 6f 66 69 6c 65 20 29 7b 0a 20  b->zProfile ){. 
138a0 20 20 20 20 20 20 20 70 44 62 2d 3e 69 6e 74 65         pDb->inte
138b0 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20  rp = interp;.   
138c0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 70 72 6f       sqlite3_pro
138d0 66 69 6c 65 28 70 44 62 2d 3e 64 62 2c 20 44 62  file(pDb->db, Db
138e0 50 72 6f 66 69 6c 65 48 61 6e 64 6c 65 72 2c 20  ProfileHandler, 
138f0 70 44 62 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  pDb);.      }els
13900 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
13910 65 33 5f 70 72 6f 66 69 6c 65 28 70 44 62 2d 3e  e3_profile(pDb->
13920 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  db, 0, 0);.     
13930 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a   }.#endif.    }.
13940 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
13950 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64    /*.  **     $d
13960 62 20 72 65 6b 65 79 20 4b 45 59 0a 20 20 2a 2a  b rekey KEY.  **
13970 0a 20 20 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  .  ** Change the
13980 20 65 6e 63 72 79 70 74 69 6f 6e 20 6b 65 79 20   encryption key 
13990 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79  on the currently
139a0 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 2e 0a   open database..
139b0 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 52    */.  case DB_R
139c0 45 4b 45 59 3a 20 7b 0a 20 20 20 20 69 6e 74 20  EKEY: {.    int 
139d0 6e 4b 65 79 3b 0a 20 20 20 20 76 6f 69 64 20 2a  nKey;.    void *
139e0 70 4b 65 79 3b 0a 20 20 20 20 69 66 28 20 6f 62  pKey;.    if( ob
139f0 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 54  jc!=3 ){.      T
13a00 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
13a10 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c  interp, 2, objv,
13a20 20 22 4b 45 59 22 29 3b 0a 20 20 20 20 20 20 72   "KEY");.      r
13a30 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
13a40 0a 20 20 20 20 7d 0a 20 20 20 20 70 4b 65 79 20  .    }.    pKey 
13a50 3d 20 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72  = Tcl_GetByteArr
13a60 61 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32  ayFromObj(objv[2
13a70 5d 2c 20 26 6e 4b 65 79 29 3b 0a 23 69 66 64 65  ], &nKey);.#ifde
13a80 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
13a90 45 43 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  EC.    rc = sqli
13aa0 74 65 33 5f 72 65 6b 65 79 28 70 44 62 2d 3e 64  te3_rekey(pDb->d
13ab0 62 2c 20 70 4b 65 79 2c 20 6e 4b 65 79 29 3b 0a  b, pKey, nKey);.
13ac0 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
13ad0 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
13ae0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 73 71 6c  sult(interp, sql
13af0 69 74 65 33 45 72 72 53 74 72 28 72 63 29 2c 20  ite3ErrStr(rc), 
13b00 30 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 54  0);.      rc = T
13b10 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
13b20 23 65 6e 64 69 66 0a 20 20 20 20 62 72 65 61 6b  #endif.    break
13b30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24  ;.  }..  /*    $
13b40 64 62 20 72 65 73 74 6f 72 65 20 3f 44 41 54 41  db restore ?DATA
13b50 42 41 53 45 3f 20 46 49 4c 45 4e 41 4d 45 0a 20  BASE? FILENAME. 
13b60 20 2a 2a 0a 20 20 2a 2a 20 4f 70 65 6e 20 61 20   **.  ** Open a 
13b70 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61  database file na
13b80 6d 65 64 20 46 49 4c 45 4e 41 4d 45 2e 20 20 54  med FILENAME.  T
13b90 72 61 6e 73 66 65 72 20 74 68 65 20 63 6f 6e 74  ransfer the cont
13ba0 65 6e 74 20 0a 20 20 2a 2a 20 6f 66 20 46 49 4c  ent .  ** of FIL
13bb0 45 4e 41 4d 45 20 69 6e 74 6f 20 74 68 65 20 6c  ENAME into the l
13bc0 6f 63 61 6c 20 64 61 74 61 62 61 73 65 20 44 41  ocal database DA
13bd0 54 41 42 41 53 45 20 28 64 65 66 61 75 6c 74 3a  TABASE (default:
13be0 20 22 6d 61 69 6e 22 29 2e 0a 20 20 2a 2f 0a 20   "main")..  */. 
13bf0 20 63 61 73 65 20 44 42 5f 52 45 53 54 4f 52 45   case DB_RESTORE
13c00 3a 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  : {.    const ch
13c10 61 72 20 2a 7a 53 72 63 46 69 6c 65 3b 0a 20 20  ar *zSrcFile;.  
13c20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
13c30 65 73 74 44 62 3b 0a 20 20 20 20 73 71 6c 69 74  estDb;.    sqlit
13c40 65 33 20 2a 70 53 72 63 3b 0a 20 20 20 20 73 71  e3 *pSrc;.    sq
13c50 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 2a 70 42  lite3_backup *pB
13c60 61 63 6b 75 70 3b 0a 20 20 20 20 69 6e 74 20 6e  ackup;.    int n
13c70 54 69 6d 65 6f 75 74 20 3d 20 30 3b 0a 0a 20 20  Timeout = 0;..  
13c80 20 20 69 66 28 20 6f 62 6a 63 3d 3d 33 20 29 7b    if( objc==3 ){
13c90 0a 20 20 20 20 20 20 7a 44 65 73 74 44 62 20 3d  .      zDestDb =
13ca0 20 22 6d 61 69 6e 22 3b 0a 20 20 20 20 20 20 7a   "main";.      z
13cb0 53 72 63 46 69 6c 65 20 3d 20 54 63 6c 5f 47 65  SrcFile = Tcl_Ge
13cc0 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29  tString(objv[2])
13cd0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
13ce0 6f 62 6a 63 3d 3d 34 20 29 7b 0a 20 20 20 20 20  objc==4 ){.     
13cf0 20 7a 44 65 73 74 44 62 20 3d 20 54 63 6c 5f 47   zDestDb = Tcl_G
13d00 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d  etString(objv[2]
13d10 29 3b 0a 20 20 20 20 20 20 7a 53 72 63 46 69 6c  );.      zSrcFil
13d20 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  e = Tcl_GetStrin
13d30 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a 20 20 20 20  g(objv[3]);.    
13d40 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 54 63 6c  }else{.      Tcl
13d50 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
13d60 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22  terp, 2, objv, "
13d70 3f 44 41 54 41 42 41 53 45 3f 20 46 49 4c 45 4e  ?DATABASE? FILEN
13d80 41 4d 45 22 29 3b 0a 20 20 20 20 20 20 72 65 74  AME");.      ret
13d90 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
13da0 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71     }.    rc = sq
13db0 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 7a 53  lite3_open_v2(zS
13dc0 72 63 46 69 6c 65 2c 20 26 70 53 72 63 2c 20 53  rcFile, &pSrc, S
13dd0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
13de0 4e 4c 59 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  NLY, 0);.    if(
13df0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
13e00 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65  {.      Tcl_Appe
13e10 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
13e20 20 22 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 73 6f   "cannot open so
13e30 75 72 63 65 20 64 61 74 61 62 61 73 65 3a 20 22  urce database: "
13e40 2c 0a 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  ,.           sql
13e50 69 74 65 33 5f 65 72 72 6d 73 67 28 70 53 72 63  ite3_errmsg(pSrc
13e60 29 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  ), (char*)0);.  
13e70 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73      sqlite3_clos
13e80 65 28 70 53 72 63 29 3b 0a 20 20 20 20 20 20 72  e(pSrc);.      r
13e90 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
13ea0 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 61 63 6b  .    }.    pBack
13eb0 75 70 20 3d 20 73 71 6c 69 74 65 33 5f 62 61 63  up = sqlite3_bac
13ec0 6b 75 70 5f 69 6e 69 74 28 70 44 62 2d 3e 64 62  kup_init(pDb->db
13ed0 2c 20 7a 44 65 73 74 44 62 2c 20 70 53 72 63 2c  , zDestDb, pSrc,
13ee0 20 22 6d 61 69 6e 22 29 3b 0a 20 20 20 20 69 66   "main");.    if
13ef0 28 20 70 42 61 63 6b 75 70 3d 3d 30 20 29 7b 0a  ( pBackup==0 ){.
13f00 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
13f10 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
13f20 72 65 73 74 6f 72 65 20 66 61 69 6c 65 64 3a 20  restore failed: 
13f30 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 73 71  ",.           sq
13f40 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62  lite3_errmsg(pDb
13f50 2d 3e 64 62 29 2c 20 28 63 68 61 72 2a 29 30 29  ->db), (char*)0)
13f60 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
13f70 63 6c 6f 73 65 28 70 53 72 63 29 3b 0a 20 20 20  close(pSrc);.   
13f80 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
13f90 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77  ROR;.    }.    w
13fa0 68 69 6c 65 28 20 28 72 63 20 3d 20 73 71 6c 69  hile( (rc = sqli
13fb0 74 65 33 5f 62 61 63 6b 75 70 5f 73 74 65 70 28  te3_backup_step(
13fc0 70 42 61 63 6b 75 70 2c 31 30 30 29 29 3d 3d 53  pBackup,100))==S
13fd0 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 20 20 20 20  QLITE_OK.       
13fe0 20 20 20 20 20 20 20 7c 7c 20 72 63 3d 3d 53 51         || rc==SQ
13ff0 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20  LITE_BUSY ){.   
14000 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
14010 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20  E_BUSY ){.      
14020 20 20 69 66 28 20 6e 54 69 6d 65 6f 75 74 2b 2b    if( nTimeout++
14030 20 3e 3d 20 33 20 29 20 62 72 65 61 6b 3b 0a 20   >= 3 ) break;. 
14040 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
14050 6c 65 65 70 28 31 30 30 29 3b 0a 20 20 20 20 20  leep(100);.     
14060 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
14070 69 74 65 33 5f 62 61 63 6b 75 70 5f 66 69 6e 69  ite3_backup_fini
14080 73 68 28 70 42 61 63 6b 75 70 29 3b 0a 20 20 20  sh(pBackup);.   
14090 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
140a0 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 72 63  DONE ){.      rc
140b0 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d   = TCL_OK;.    }
140c0 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c  else if( rc==SQL
140d0 49 54 45 5f 42 55 53 59 20 7c 7c 20 72 63 3d 3d  ITE_BUSY || rc==
140e0 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 29 7b  SQLITE_LOCKED ){
140f0 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  .      Tcl_Appen
14100 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
14110 22 72 65 73 74 6f 72 65 20 66 61 69 6c 65 64 3a  "restore failed:
14120 20 73 6f 75 72 63 65 20 64 61 74 61 62 61 73 65   source database
14130 20 62 75 73 79 22 2c 0a 20 20 20 20 20 20 20 20   busy",.        
14140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
14150 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20  char*)0);.      
14160 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  rc = TCL_ERROR;.
14170 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
14180 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
14190 74 28 69 6e 74 65 72 70 2c 20 22 72 65 73 74 6f  t(interp, "resto
141a0 72 65 20 66 61 69 6c 65 64 3a 20 22 2c 0a 20 20  re failed: ",.  
141b0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
141c0 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62 29  _errmsg(pDb->db)
141d0 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20  , (char*)0);.   
141e0 20 20 20 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f     rc = TCL_ERRO
141f0 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  R;.    }.    sql
14200 69 74 65 33 5f 63 6c 6f 73 65 28 70 53 72 63 29  ite3_close(pSrc)
14210 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  ;.    break;.  }
14220 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20  ..  /*.  **     
14230 24 64 62 20 73 74 61 74 75 73 20 28 73 74 65 70  $db status (step
14240 7c 73 6f 72 74 7c 61 75 74 6f 69 6e 64 65 78 29  |sort|autoindex)
14250 0a 20 20 2a 2a 0a 20 20 2a 2a 20 44 69 73 70 6c  .  **.  ** Displ
14260 61 79 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54  ay SQLITE_STMTST
14270 41 54 55 53 5f 46 55 4c 4c 53 43 41 4e 5f 53 54  ATUS_FULLSCAN_ST
14280 45 50 20 6f 72 20 0a 20 20 2a 2a 20 53 51 4c 49  EP or .  ** SQLI
14290 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 53 4f  TE_STMTSTATUS_SO
142a0 52 54 20 66 6f 72 20 74 68 65 20 6d 6f 73 74 20  RT for the most 
142b0 72 65 63 65 6e 74 20 65 76 61 6c 2e 0a 20 20 2a  recent eval..  *
142c0 2f 0a 20 20 63 61 73 65 20 44 42 5f 53 54 41 54  /.  case DB_STAT
142d0 55 53 3a 20 7b 0a 20 20 20 20 69 6e 74 20 76 3b  US: {.    int v;
142e0 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
142f0 2a 7a 4f 70 3b 0a 20 20 20 20 69 66 28 20 6f 62  *zOp;.    if( ob
14300 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 54  jc!=3 ){.      T
14310 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
14320 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c  interp, 2, objv,
14330 20 22 28 73 74 65 70 7c 73 6f 72 74 7c 61 75 74   "(step|sort|aut
14340 6f 69 6e 64 65 78 29 22 29 3b 0a 20 20 20 20 20  oindex)");.     
14350 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
14360 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4f 70  R;.    }.    zOp
14370 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
14380 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 20 20 69  (objv[2]);.    i
14390 66 28 20 73 74 72 63 6d 70 28 7a 4f 70 2c 20 22  f( strcmp(zOp, "
143a0 73 74 65 70 22 29 3d 3d 30 20 29 7b 0a 20 20 20  step")==0 ){.   
143b0 20 20 20 76 20 3d 20 70 44 62 2d 3e 6e 53 74 65     v = pDb->nSte
143c0 70 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  p;.    }else if(
143d0 20 73 74 72 63 6d 70 28 7a 4f 70 2c 20 22 73 6f   strcmp(zOp, "so
143e0 72 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  rt")==0 ){.     
143f0 20 76 20 3d 20 70 44 62 2d 3e 6e 53 6f 72 74 3b   v = pDb->nSort;
14400 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73  .    }else if( s
14410 74 72 63 6d 70 28 7a 4f 70 2c 20 22 61 75 74 6f  trcmp(zOp, "auto
14420 69 6e 64 65 78 22 29 3d 3d 30 20 29 7b 0a 20 20  index")==0 ){.  
14430 20 20 20 20 76 20 3d 20 70 44 62 2d 3e 6e 49 6e      v = pDb->nIn
14440 64 65 78 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  dex;.    }else{.
14450 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
14460 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 0a  Result(interp, .
14470 20 20 20 20 20 20 20 20 20 20 20 20 22 62 61 64              "bad
14480 20 61 72 67 75 6d 65 6e 74 3a 20 73 68 6f 75 6c   argument: shoul
14490 64 20 62 65 20 61 75 74 6f 69 6e 64 65 78 2c 20  d be autoindex, 
144a0 73 74 65 70 2c 20 6f 72 20 73 6f 72 74 22 2c 20  step, or sort", 
144b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68  .            (ch
144c0 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 72 65  ar*)0);.      re
144d0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
144e0 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 53 65      }.    Tcl_Se
144f0 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
14500 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  p, Tcl_NewIntObj
14510 28 76 29 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b  (v));.    break;
14520 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 0a 20 20 2a  .  }.  .  /*.  *
14530 2a 20 20 20 20 20 24 64 62 20 74 69 6d 65 6f 75  *     $db timeou
14540 74 20 4d 49 4c 4c 45 53 45 43 4f 4e 44 53 0a 20  t MILLESECONDS. 
14550 20 2a 2a 0a 20 20 2a 2a 20 44 65 6c 61 79 20 66   **.  ** Delay f
14560 6f 72 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  or the number of
14570 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 73 70   milliseconds sp
14580 65 63 69 66 69 65 64 20 77 68 65 6e 20 61 20 66  ecified when a f
14590 69 6c 65 20 69 73 20 6c 6f 63 6b 65 64 2e 0a 20  ile is locked.. 
145a0 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 54 49   */.  case DB_TI
145b0 4d 45 4f 55 54 3a 20 7b 0a 20 20 20 20 69 6e 74  MEOUT: {.    int
145c0 20 6d 73 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a   ms;.    if( obj
145d0 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 54 63  c!=3 ){.      Tc
145e0 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
145f0 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
14600 22 4d 49 4c 4c 49 53 45 43 4f 4e 44 53 22 29 3b  "MILLISECONDS");
14610 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
14620 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
14630 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e     if( Tcl_GetIn
14640 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
14650 20 6f 62 6a 76 5b 32 5d 2c 20 26 6d 73 29 20 29   objv[2], &ms) )
14660 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
14670 52 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62  R;.    sqlite3_b
14680 75 73 79 5f 74 69 6d 65 6f 75 74 28 70 44 62 2d  usy_timeout(pDb-
14690 3e 64 62 2c 20 6d 73 29 3b 0a 20 20 20 20 62 72  >db, ms);.    br
146a0 65 61 6b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  eak;.  }.  .  /*
146b0 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20 74 6f  .  **     $db to
146c0 74 61 6c 5f 63 68 61 6e 67 65 73 0a 20 20 2a 2a  tal_changes.  **
146d0 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  .  ** Return the
146e0 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
146f0 74 68 61 74 20 77 65 72 65 20 6d 6f 64 69 66 69  that were modifi
14700 65 64 2c 20 69 6e 73 65 72 74 65 64 2c 20 6f 72  ed, inserted, or
14710 20 64 65 6c 65 74 65 64 20 0a 20 20 2a 2a 20 73   deleted .  ** s
14720 69 6e 63 65 20 74 68 65 20 64 61 74 61 62 61 73  ince the databas
14730 65 20 68 61 6e 64 6c 65 20 77 61 73 20 63 72 65  e handle was cre
14740 61 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 63 61 73  ated..  */.  cas
14750 65 20 44 42 5f 54 4f 54 41 4c 5f 43 48 41 4e 47  e DB_TOTAL_CHANG
14760 45 53 3a 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62  ES: {.    Tcl_Ob
14770 6a 20 2a 70 52 65 73 75 6c 74 3b 0a 20 20 20 20  j *pResult;.    
14780 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20  if( objc!=2 ){. 
14790 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
147a0 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
147b0 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 20 20 20 20   objv, "");.    
147c0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
147d0 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 52  OR;.    }.    pR
147e0 65 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65 74 4f  esult = Tcl_GetO
147f0 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29  bjResult(interp)
14800 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 49 6e 74  ;.    Tcl_SetInt
14810 4f 62 6a 28 70 52 65 73 75 6c 74 2c 20 73 71 6c  Obj(pResult, sql
14820 69 74 65 33 5f 74 6f 74 61 6c 5f 63 68 61 6e 67  ite3_total_chang
14830 65 73 28 70 44 62 2d 3e 64 62 29 29 3b 0a 20 20  es(pDb->db));.  
14840 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
14850 2f 2a 20 20 20 20 24 64 62 20 74 72 61 63 65 20  /*    $db trace 
14860 3f 43 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a 0a  ?CALLBACK?.  **.
14870 20 20 2a 2a 20 4d 61 6b 65 20 61 72 72 61 6e 67    ** Make arrang
14880 65 6d 65 6e 74 73 20 74 6f 20 69 6e 76 6f 6b 65  ements to invoke
14890 20 74 68 65 20 43 41 4c 4c 42 41 43 4b 20 72 6f   the CALLBACK ro
148a0 75 74 69 6e 65 20 66 6f 72 20 65 61 63 68 20 53  utine for each S
148b0 51 4c 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a  QL statement.  *
148c0 2a 20 74 68 61 74 20 69 73 20 65 78 65 63 75 74  * that is execut
148d0 65 64 2e 20 20 54 68 65 20 74 65 78 74 20 6f 66  ed.  The text of
148e0 20 74 68 65 20 53 51 4c 20 69 73 20 61 70 70 65   the SQL is appe
148f0 6e 64 65 64 20 74 6f 20 43 41 4c 4c 42 41 43 4b  nded to CALLBACK
14900 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20 69 74 20   before.  ** it 
14910 69 73 20 65 78 65 63 75 74 65 64 2e 0a 20 20 2a  is executed..  *
14920 2f 0a 20 20 63 61 73 65 20 44 42 5f 54 52 41 43  /.  case DB_TRAC
14930 45 3a 20 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a  E: {.    if( obj
14940 63 3e 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  c>3 ){.      Tcl
14950 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
14960 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22  terp, 2, objv, "
14970 3f 43 41 4c 4c 42 41 43 4b 3f 22 29 3b 0a 20 20  ?CALLBACK?");.  
14980 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
14990 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73 65 20  RROR;.    }else 
149a0 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20  if( objc==2 ){. 
149b0 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 54       if( pDb->zT
149c0 72 61 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20  race ){.        
149d0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
149e0 28 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a 54  (interp, pDb->zT
149f0 72 61 63 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  race, 0);.      
14a00 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
14a10 20 20 20 63 68 61 72 20 2a 7a 54 72 61 63 65 3b     char *zTrace;
14a20 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a  .      int len;.
14a30 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a        if( pDb->z
14a40 54 72 61 63 65 20 29 7b 0a 20 20 20 20 20 20 20  Trace ){.       
14a50 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a   Tcl_Free(pDb->z
14a60 54 72 61 63 65 29 3b 0a 20 20 20 20 20 20 7d 0a  Trace);.      }.
14a70 20 20 20 20 20 20 7a 54 72 61 63 65 20 3d 20 54        zTrace = T
14a80 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
14a90 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65  Obj(objv[2], &le
14aa0 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 54  n);.      if( zT
14ab0 72 61 63 65 20 26 26 20 6c 65 6e 3e 30 20 29 7b  race && len>0 ){
14ac0 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 54  .        pDb->zT
14ad0 72 61 63 65 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63  race = Tcl_Alloc
14ae0 28 20 6c 65 6e 20 2b 20 31 20 29 3b 0a 20 20 20  ( len + 1 );.   
14af0 20 20 20 20 20 6d 65 6d 63 70 79 28 70 44 62 2d       memcpy(pDb-
14b00 3e 7a 54 72 61 63 65 2c 20 7a 54 72 61 63 65 2c  >zTrace, zTrace,
14b10 20 6c 65 6e 2b 31 29 3b 0a 20 20 20 20 20 20 7d   len+1);.      }
14b20 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 44  else{.        pD
14b30 62 2d 3e 7a 54 72 61 63 65 20 3d 20 30 3b 0a 20  b->zTrace = 0;. 
14b40 20 20 20 20 20 7d 0a 23 69 66 20 21 64 65 66 69       }.#if !defi
14b50 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
14b60 54 52 41 43 45 29 20 26 26 20 21 64 65 66 69 6e  TRACE) && !defin
14b70 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ed(SQLITE_OMIT_F
14b80 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 29 0a 20  LOATING_POINT). 
14b90 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 54       if( pDb->zT
14ba0 72 61 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20  race ){.        
14bb0 70 44 62 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e  pDb->interp = in
14bc0 74 65 72 70 3b 0a 20 20 20 20 20 20 20 20 73 71  terp;.        sq
14bd0 6c 69 74 65 33 5f 74 72 61 63 65 28 70 44 62 2d  lite3_trace(pDb-
14be0 3e 64 62 2c 20 44 62 54 72 61 63 65 48 61 6e 64  >db, DbTraceHand
14bf0 6c 65 72 2c 20 70 44 62 29 3b 0a 20 20 20 20 20  ler, pDb);.     
14c00 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
14c10 73 71 6c 69 74 65 33 5f 74 72 61 63 65 28 70 44  sqlite3_trace(pD
14c20 62 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20  b->db, 0, 0);.  
14c30 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
14c40 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20   }.    break;.  
14c50 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 74  }..  /*    $db t
14c60 72 61 6e 73 61 63 74 69 6f 6e 20 5b 2d 64 65 66  ransaction [-def
14c70 65 72 72 65 64 7c 2d 69 6d 6d 65 64 69 61 74 65  erred|-immediate
14c80 7c 2d 65 78 63 6c 75 73 69 76 65 5d 20 53 43 52  |-exclusive] SCR
14c90 49 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 74  IPT.  **.  ** St
14ca0 61 72 74 20 61 20 6e 65 77 20 74 72 61 6e 73 61  art a new transa
14cb0 63 74 69 6f 6e 20 28 69 66 20 77 65 20 61 72 65  ction (if we are
14cc0 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 69 6e 20   not already in 
14cd0 74 68 65 20 6d 69 64 73 74 20 6f 66 20 61 0a 20  the midst of a. 
14ce0 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 29   ** transaction)
14cf0 20 61 6e 64 20 65 78 65 63 75 74 65 20 74 68 65   and execute the
14d00 20 54 43 4c 20 73 63 72 69 70 74 20 53 43 52 49   TCL script SCRI
14d10 50 54 2e 20 20 41 66 74 65 72 20 53 43 52 49 50  PT.  After SCRIP
14d20 54 0a 20 20 2a 2a 20 63 6f 6d 70 6c 65 74 65 73  T.  ** completes
14d30 2c 20 65 69 74 68 65 72 20 63 6f 6d 6d 69 74 20  , either commit 
14d40 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
14d50 6f 72 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 20  or roll it back 
14d60 69 66 20 53 43 52 49 50 54 0a 20 20 2a 2a 20 74  if SCRIPT.  ** t
14d70 68 72 6f 77 73 20 61 6e 20 65 78 63 65 70 74 69  hrows an excepti
14d80 6f 6e 2e 20 20 4f 72 20 69 66 20 6e 6f 20 6e 65  on.  Or if no ne
14d90 77 20 74 72 61 6e 73 61 74 69 6f 6e 20 77 61 73  w transation was
14da0 20 73 74 61 72 74 65 64 2c 20 64 6f 20 6e 6f 74   started, do not
14db0 68 69 6e 67 2e 0a 20 20 2a 2a 20 70 61 73 73 20  hing..  ** pass 
14dc0 74 68 65 20 65 78 63 65 70 74 69 6f 6e 20 6f 6e  the exception on
14dd0 20 75 70 20 74 68 65 20 73 74 61 63 6b 2e 0a 20   up the stack.. 
14de0 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 63 6f   **.  ** This co
14df0 6d 6d 61 6e 64 20 77 61 73 20 69 6e 73 70 69 72  mmand was inspir
14e00 65 64 20 62 79 20 44 61 76 65 20 54 68 6f 6d 61  ed by Dave Thoma
14e10 73 27 73 20 74 61 6c 6b 20 6f 6e 20 52 75 62 79  s's talk on Ruby
14e20 20 61 74 20 74 68 65 0a 20 20 2a 2a 20 32 30 30   at the.  ** 200
14e30 35 20 4f 27 52 65 69 6c 6c 79 20 4f 70 65 6e 20  5 O'Reilly Open 
14e40 53 6f 75 72 63 65 20 43 6f 6e 76 65 6e 74 69 6f  Source Conventio
14e50 6e 20 28 4f 53 43 4f 4e 29 2e 0a 20 20 2a 2f 0a  n (OSCON)..  */.
14e60 20 20 63 61 73 65 20 44 42 5f 54 52 41 4e 53 41    case DB_TRANSA
14e70 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 54 63 6c  CTION: {.    Tcl
14e80 5f 4f 62 6a 20 2a 70 53 63 72 69 70 74 3b 0a 20  _Obj *pScript;. 
14e90 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
14ea0 42 65 67 69 6e 20 3d 20 22 53 41 56 45 50 4f 49  Begin = "SAVEPOI
14eb0 4e 54 20 5f 74 63 6c 5f 74 72 61 6e 73 61 63 74  NT _tcl_transact
14ec0 69 6f 6e 22 3b 0a 20 20 20 20 69 66 28 20 6f 62  ion";.    if( ob
14ed0 6a 63 21 3d 33 20 26 26 20 6f 62 6a 63 21 3d 34  jc!=3 && objc!=4
14ee0 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72   ){.      Tcl_Wr
14ef0 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
14f00 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 5b 54 59  p, 2, objv, "[TY
14f10 50 45 5d 20 53 43 52 49 50 54 22 29 3b 0a 20 20  PE] SCRIPT");.  
14f20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
14f30 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  RROR;.    }..   
14f40 20 69 66 28 20 70 44 62 2d 3e 6e 54 72 61 6e 73   if( pDb->nTrans
14f50 61 63 74 69 6f 6e 3d 3d 30 20 26 26 20 6f 62 6a  action==0 && obj
14f60 63 3d 3d 34 20 29 7b 0a 20 20 20 20 20 20 73 74  c==4 ){.      st
14f70 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
14f80 2a 54 54 59 50 45 5f 73 74 72 73 5b 5d 20 3d 20  *TTYPE_strs[] = 
14f90 7b 0a 20 20 20 20 20 20 20 20 22 64 65 66 65 72  {.        "defer
14fa0 72 65 64 22 2c 20 20 20 22 65 78 63 6c 75 73 69  red",   "exclusi
14fb0 76 65 22 2c 20 20 22 69 6d 6d 65 64 69 61 74 65  ve",  "immediate
14fc0 22 2c 20 30 0a 20 20 20 20 20 20 7d 3b 0a 20 20  ", 0.      };.  
14fd0 20 20 20 20 65 6e 75 6d 20 54 54 59 50 45 5f 65      enum TTYPE_e
14fe0 6e 75 6d 20 7b 0a 20 20 20 20 20 20 20 20 54 54  num {.        TT
14ff0 59 50 45 5f 44 45 46 45 52 52 45 44 2c 20 54 54  YPE_DEFERRED, TT
15000 59 50 45 5f 45 58 43 4c 55 53 49 56 45 2c 20 54  YPE_EXCLUSIVE, T
15010 54 59 50 45 5f 49 4d 4d 45 44 49 41 54 45 0a 20  TYPE_IMMEDIATE. 
15020 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 69 6e       };.      in
15030 74 20 74 74 79 70 65 3b 0a 20 20 20 20 20 20 69  t ttype;.      i
15040 66 28 20 54 63 6c 5f 47 65 74 49 6e 64 65 78 46  f( Tcl_GetIndexF
15050 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
15060 62 6a 76 5b 32 5d 2c 20 54 54 59 50 45 5f 73 74  bjv[2], TTYPE_st
15070 72 73 2c 20 22 74 72 61 6e 73 61 63 74 69 6f 6e  rs, "transaction
15080 20 74 79 70 65 22 2c 0a 20 20 20 20 20 20 20 20   type",.        
15090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
150a0 20 20 20 20 20 20 30 2c 20 26 74 74 79 70 65 29        0, &ttype)
150b0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
150c0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
150d0 20 20 20 20 7d 0a 20 20 20 20 20 20 73 77 69 74      }.      swit
150e0 63 68 28 20 28 65 6e 75 6d 20 54 54 59 50 45 5f  ch( (enum TTYPE_
150f0 65 6e 75 6d 29 74 74 79 70 65 20 29 7b 0a 20 20  enum)ttype ){.  
15100 20 20 20 20 20 20 63 61 73 65 20 54 54 59 50 45        case TTYPE
15110 5f 44 45 46 45 52 52 45 44 3a 20 20 20 20 2f 2a  _DEFERRED:    /*
15120 20 6e 6f 2d 6f 70 20 2a 2f 3b 20 20 20 20 20 20   no-op */;      
15130 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
15140 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 54  ;.        case T
15150 54 59 50 45 5f 45 58 43 4c 55 53 49 56 45 3a 20  TYPE_EXCLUSIVE: 
15160 20 20 7a 42 65 67 69 6e 20 3d 20 22 42 45 47 49    zBegin = "BEGI
15170 4e 20 45 58 43 4c 55 53 49 56 45 22 3b 20 20 62  N EXCLUSIVE";  b
15180 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61  reak;.        ca
15190 73 65 20 54 54 59 50 45 5f 49 4d 4d 45 44 49 41  se TTYPE_IMMEDIA
151a0 54 45 3a 20 20 20 7a 42 65 67 69 6e 20 3d 20 22  TE:   zBegin = "
151b0 42 45 47 49 4e 20 49 4d 4d 45 44 49 41 54 45 22  BEGIN IMMEDIATE"
151c0 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  ;  break;.      
151d0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 63 72  }.    }.    pScr
151e0 69 70 74 20 3d 20 6f 62 6a 76 5b 6f 62 6a 63 2d  ipt = objv[objc-
151f0 31 5d 3b 0a 0a 20 20 20 20 2f 2a 20 52 75 6e 20  1];..    /* Run 
15200 74 68 65 20 53 51 4c 69 74 65 20 42 45 47 49 4e  the SQLite BEGIN
15210 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 6f 70 65 6e   command to open
15220 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f   a transaction o
15230 72 20 73 61 76 65 70 6f 69 6e 74 2e 20 2a 2f 0a  r savepoint. */.
15240 20 20 20 20 70 44 62 2d 3e 64 69 73 61 62 6c 65      pDb->disable
15250 41 75 74 68 2b 2b 3b 0a 20 20 20 20 72 63 20 3d  Auth++;.    rc =
15260 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 44   sqlite3_exec(pD
15270 62 2d 3e 64 62 2c 20 7a 42 65 67 69 6e 2c 20 30  b->db, zBegin, 0
15280 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 70 44 62  , 0, 0);.    pDb
15290 2d 3e 64 69 73 61 62 6c 65 41 75 74 68 2d 2d 3b  ->disableAuth--;
152a0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
152b0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
152c0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
152d0 28 69 6e 74 65 72 70 2c 20 73 71 6c 69 74 65 33  (interp, sqlite3
152e0 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62 29  _errmsg(pDb->db)
152f0 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75  , 0);.      retu
15300 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
15310 20 20 7d 0a 20 20 20 20 70 44 62 2d 3e 6e 54 72    }.    pDb->nTr
15320 61 6e 73 61 63 74 69 6f 6e 2b 2b 3b 0a 0a 20 20  ansaction++;..  
15330 20 20 2f 2a 20 49 66 20 75 73 69 6e 67 20 4e 52    /* If using NR
15340 45 2c 20 73 63 68 65 64 75 6c 65 20 61 20 63 61  E, schedule a ca
15350 6c 6c 62 61 63 6b 20 74 6f 20 69 6e 76 6f 6b 65  llback to invoke
15360 20 74 68 65 20 73 63 72 69 70 74 20 70 53 63 72   the script pScr
15370 69 70 74 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a  ipt, then.    **
15380 20 61 20 73 65 63 6f 6e 64 20 63 61 6c 6c 62 61   a second callba
15390 63 6b 20 74 6f 20 63 6f 6d 6d 69 74 20 28 6f 72  ck to commit (or
153a0 20 72 6f 6c 6c 62 61 63 6b 29 20 74 68 65 20 74   rollback) the t
153b0 72 61 6e 73 61 63 74 69 6f 6e 20 6f 72 20 73 61  ransaction or sa
153c0 76 65 70 6f 69 6e 74 0a 20 20 20 20 2a 2a 20 6f  vepoint.    ** o
153d0 70 65 6e 65 64 20 61 62 6f 76 65 2e 20 49 66 20  pened above. If 
153e0 6e 6f 74 20 75 73 69 6e 67 20 4e 52 45 2c 20 65  not using NRE, e
153f0 76 61 6c 75 61 74 65 20 74 68 65 20 73 63 72 69  valuate the scri
15400 70 74 20 64 69 72 65 63 74 6c 79 2c 20 74 68 65  pt directly, the
15410 6e 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 66 75  n.    ** call fu
15420 6e 63 74 69 6f 6e 20 44 62 54 72 61 6e 73 50 6f  nction DbTransPo
15430 73 74 43 6d 64 28 29 20 74 6f 20 63 6f 6d 6d 69  stCmd() to commi
15440 74 20 28 6f 72 20 72 6f 6c 6c 62 61 63 6b 29 20  t (or rollback) 
15450 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
15460 0a 20 20 20 20 2a 2a 20 6f 72 20 73 61 76 65 70  .    ** or savep
15470 6f 69 6e 74 2e 20 20 2a 2f 0a 20 20 20 20 69 66  oint.  */.    if
15480 28 20 44 62 55 73 65 4e 72 65 28 29 20 29 7b 0a  ( DbUseNre() ){.
15490 20 20 20 20 20 20 54 63 6c 5f 4e 52 41 64 64 43        Tcl_NRAddC
154a0 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c 20  allback(interp, 
154b0 44 62 54 72 61 6e 73 50 6f 73 74 43 6d 64 2c 20  DbTransPostCmd, 
154c0 63 64 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  cd, 0, 0, 0);.  
154d0 20 20 20 20 54 63 6c 5f 4e 52 45 76 61 6c 4f 62      Tcl_NREvalOb
154e0 6a 28 69 6e 74 65 72 70 2c 20 70 53 63 72 69 70  j(interp, pScrip
154f0 74 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65  t, 0);.    }else
15500 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 44 62 54  {.      rc = DbT
15510 72 61 6e 73 50 6f 73 74 43 6d 64 28 26 63 64 2c  ransPostCmd(&cd,
15520 20 69 6e 74 65 72 70 2c 20 54 63 6c 5f 45 76 61   interp, Tcl_Eva
15530 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c 20 70  lObjEx(interp, p
15540 53 63 72 69 70 74 2c 20 30 29 29 3b 0a 20 20 20  Script, 0));.   
15550 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20   }.    break;.  
15560 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20  }..  /*.  **    
15570 24 64 62 20 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66  $db unlock_notif
15580 79 20 3f 73 63 72 69 70 74 3f 0a 20 20 2a 2f 0a  y ?script?.  */.
15590 20 20 63 61 73 65 20 44 42 5f 55 4e 4c 4f 43 4b    case DB_UNLOCK
155a0 5f 4e 4f 54 49 46 59 3a 20 7b 0a 23 69 66 6e 64  _NOTIFY: {.#ifnd
155b0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
155c0 5f 55 4e 4c 4f 43 4b 5f 4e 4f 54 49 46 59 0a 20  _UNLOCK_NOTIFY. 
155d0 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
155e0 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 6c  ult(interp, "unl
155f0 6f 63 6b 5f 6e 6f 74 69 66 79 20 6e 6f 74 20 61  ock_notify not a
15600 76 61 69 6c 61 62 6c 65 20 69 6e 20 74 68 69 73  vailable in this
15610 20 62 75 69 6c 64 22 2c 20 30 29 3b 0a 20 20 20   build", 0);.   
15620 20 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b   rc = TCL_ERROR;
15630 0a 23 65 6c 73 65 0a 20 20 20 20 69 66 28 20 6f  .#else.    if( o
15640 62 6a 63 21 3d 32 20 26 26 20 6f 62 6a 63 21 3d  bjc!=2 && objc!=
15650 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57  3 ){.      Tcl_W
15660 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
15670 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 53  rp, 2, objv, "?S
15680 43 52 49 50 54 3f 22 29 3b 0a 20 20 20 20 20 20  CRIPT?");.      
15690 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  rc = TCL_ERROR;.
156a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
156b0 20 76 6f 69 64 20 28 2a 78 4e 6f 74 69 66 79 29   void (*xNotify)
156c0 28 76 6f 69 64 20 2a 2a 2c 20 69 6e 74 29 20 3d  (void **, int) =
156d0 20 30 3b 0a 20 20 20 20 20 20 76 6f 69 64 20 2a   0;.      void *
156e0 70 4e 6f 74 69 66 79 41 72 67 20 3d 20 30 3b 0a  pNotifyArg = 0;.
156f0 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e  .      if( pDb->
15700 70 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 20 29 7b  pUnlockNotify ){
15710 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 44 65 63  .        Tcl_Dec
15720 72 52 65 66 43 6f 75 6e 74 28 70 44 62 2d 3e 70  rRefCount(pDb->p
15730 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 29 3b 0a 20  UnlockNotify);. 
15740 20 20 20 20 20 20 20 70 44 62 2d 3e 70 55 6e 6c         pDb->pUnl
15750 6f 63 6b 4e 6f 74 69 66 79 20 3d 20 30 3b 0a 20  ockNotify = 0;. 
15760 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20       }.  .      
15770 69 66 28 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20  if( objc==3 ){. 
15780 20 20 20 20 20 20 20 78 4e 6f 74 69 66 79 20 3d         xNotify =
15790 20 44 62 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 3b   DbUnlockNotify;
157a0 0a 20 20 20 20 20 20 20 20 70 4e 6f 74 69 66 79  .        pNotify
157b0 41 72 67 20 3d 20 28 76 6f 69 64 20 2a 29 70 44  Arg = (void *)pD
157c0 62 3b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e  b;.        pDb->
157d0 70 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 20 3d 20  pUnlockNotify = 
157e0 6f 62 6a 76 5b 32 5d 3b 0a 20 20 20 20 20 20 20  objv[2];.       
157f0 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
15800 74 28 70 44 62 2d 3e 70 55 6e 6c 6f 63 6b 4e 6f  t(pDb->pUnlockNo
15810 74 69 66 79 29 3b 0a 20 20 20 20 20 20 7d 0a 20  tify);.      }. 
15820 20 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69   .      if( sqli
15830 74 65 33 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66  te3_unlock_notif
15840 79 28 70 44 62 2d 3e 64 62 2c 20 78 4e 6f 74 69  y(pDb->db, xNoti
15850 66 79 2c 20 70 4e 6f 74 69 66 79 41 72 67 29 20  fy, pNotifyArg) 
15860 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41  ){.        Tcl_A
15870 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
15880 72 70 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  rp, sqlite3_errm
15890 73 67 28 70 44 62 2d 3e 64 62 29 2c 20 30 29 3b  sg(pDb->db), 0);
158a0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 54 43  .        rc = TC
158b0 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d  L_ERROR;.      }
158c0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
158d0 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
158e0 2f 2a 0a 20 20 2a 2a 20 20 20 20 24 64 62 20 70  /*.  **    $db p
158f0 72 65 75 70 64 61 74 65 5f 68 6f 6f 6b 20 63 6f  reupdate_hook co
15900 75 6e 74 0a 20 20 2a 2a 20 20 20 20 24 64 62 20  unt.  **    $db 
15910 70 72 65 75 70 64 61 74 65 5f 68 6f 6f 6b 20 68  preupdate_hook h
15920 6f 6f 6b 20 3f 53 43 52 49 50 54 3f 0a 20 20 2a  ook ?SCRIPT?.  *
15930 2a 20 20 20 20 24 64 62 20 70 72 65 75 70 64 61  *    $db preupda
15940 74 65 5f 68 6f 6f 6b 20 6e 65 77 20 49 4e 44 45  te_hook new INDE
15950 58 0a 20 20 2a 2a 20 20 20 20 24 64 62 20 70 72  X.  **    $db pr
15960 65 75 70 64 61 74 65 5f 68 6f 6f 6b 20 6f 6c 64  eupdate_hook old
15970 20 49 4e 44 45 58 0a 20 20 2a 2f 0a 20 20 63 61   INDEX.  */.  ca
15980 73 65 20 44 42 5f 50 52 45 55 50 44 41 54 45 3a  se DB_PREUPDATE:
15990 20 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f   {.    static co
159a0 6e 73 74 20 63 68 61 72 20 2a 61 7a 53 75 62 5b  nst char *azSub[
159b0 5d 20 3d 20 7b 22 63 6f 75 6e 74 22 2c 20 22 68  ] = {"count", "h
159c0 6f 6f 6b 22 2c 20 22 6e 65 77 22 2c 20 22 6f 6c  ook", "new", "ol
159d0 64 22 2c 20 30 7d 3b 0a 20 20 20 20 65 6e 75 6d  d", 0};.    enum
159e0 20 44 62 50 72 65 75 70 64 61 74 65 53 75 62 43   DbPreupdateSubC
159f0 6d 64 20 7b 0a 20 20 20 20 20 20 50 52 45 5f 43  md {.      PRE_C
15a00 4f 55 4e 54 2c 20 50 52 45 5f 48 4f 4f 4b 2c 20  OUNT, PRE_HOOK, 
15a10 50 52 45 5f 4e 45 57 2c 20 50 52 45 5f 4f 4c 44  PRE_NEW, PRE_OLD
15a20 0a 20 20 20 20 7d 3b 0a 20 20 20 20 69 6e 74 20  .    };.    int 
15a30 69 53 75 62 3b 0a 0a 20 20 20 20 69 66 28 20 6f  iSub;..    if( o
15a40 62 6a 63 3c 33 20 29 7b 0a 20 20 20 20 20 20 54  bjc<3 ){.      T
15a50 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
15a60 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c  interp, 2, objv,
15a70 20 22 53 55 42 2d 43 4f 4d 4d 41 4e 44 20 3f 41   "SUB-COMMAND ?A
15a80 52 47 53 3f 22 29 3b 0a 20 20 20 20 7d 0a 20 20  RGS?");.    }.  
15a90 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 64    if( Tcl_GetInd
15aa0 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  exFromObj(interp
15ab0 2c 20 6f 62 6a 76 5b 32 5d 2c 20 61 7a 53 75 62  , objv[2], azSub
15ac0 2c 20 22 73 75 62 2d 63 6f 6d 6d 61 6e 64 22 2c  , "sub-command",
15ad0 20 30 2c 20 26 69 53 75 62 29 20 29 7b 0a 20 20   0, &iSub) ){.  
15ae0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
15af0 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  RROR;.    }..   
15b00 20 73 77 69 74 63 68 28 20 28 65 6e 75 6d 20 44   switch( (enum D
15b10 62 50 72 65 75 70 64 61 74 65 53 75 62 43 6d 64  bPreupdateSubCmd
15b20 29 69 53 75 62 20 29 7b 0a 20 20 20 20 20 20 63  )iSub ){.      c
15b30 61 73 65 20 50 52 45 5f 43 4f 55 4e 54 3a 20 7b  ase PRE_COUNT: {
15b40 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43 6f  .        int nCo
15b50 6c 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 75  l = sqlite3_preu
15b60 70 64 61 74 65 5f 63 6f 75 6e 74 28 70 44 62 2d  pdate_count(pDb-
15b70 3e 64 62 29 3b 0a 20 20 20 20 20 20 20 20 54 63  >db);.        Tc
15b80 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
15b90 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e  nterp, Tcl_NewIn
15ba0 74 4f 62 6a 28 6e 43 6f 6c 29 29 3b 0a 20 20 20  tObj(nCol));.   
15bb0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
15bc0 20 20 7d 0a 0a 20 20 20 20 20 20 63 61 73 65 20    }..      case 
15bd0 50 52 45 5f 48 4f 4f 4b 3a 20 7b 0a 20 20 20 20  PRE_HOOK: {.    
15be0 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 34 20 29      if( objc>4 )
15bf0 7b 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f  {.          Tcl_
15c00 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
15c10 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 68  erp, 2, objv, "h
15c20 6f 6f 6b 20 3f 53 43 52 49 50 54 3f 22 29 3b 0a  ook ?SCRIPT?");.
15c30 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
15c40 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
15c50 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 44 62      }.        Db
15c60 48 6f 6f 6b 43 6d 64 28 69 6e 74 65 72 70 2c 20  HookCmd(interp, 
15c70 70 44 62 2c 20 28 6f 62 6a 63 3d 3d 34 20 3f 20  pDb, (objc==4 ? 
15c80 6f 62 6a 76 5b 33 5d 20 3a 20 30 29 2c 20 26 70  objv[3] : 0), &p
15c90 44 62 2d 3e 70 50 72 65 55 70 64 61 74 65 48 6f  Db->pPreUpdateHo
15ca0 6f 6b 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  ok);.        bre
15cb0 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ak;.      }..   
15cc0 20 20 20 63 61 73 65 20 50 52 45 5f 4e 45 57 3a     case PRE_NEW:
15cd0 0a 20 20 20 20 20 20 63 61 73 65 20 50 52 45 5f  .      case PRE_
15ce0 4f 4c 44 3a 20 7b 0a 20 20 20 20 20 20 20 20 69  OLD: {.        i
15cf0 6e 74 20 69 49 64 78 3b 0a 20 20 20 20 20 20 20  nt iIdx;.       
15d00 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
15d10 70 56 61 6c 75 65 3b 0a 20 20 20 20 20 20 20 20  pValue;.        
15d20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20  if( objc!=4 ){. 
15d30 20 20 20 20 20 20 20 20 20 54 63 6c 5f 57 72 6f           Tcl_Wro
15d40 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
15d50 2c 20 33 2c 20 6f 62 6a 76 2c 20 22 49 4e 44 45  , 3, objv, "INDE
15d60 58 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  X");.          r
15d70 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
15d80 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
15d90 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e     if( Tcl_GetIn
15da0 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
15db0 20 6f 62 6a 76 5b 33 5d 2c 20 26 69 49 64 78 29   objv[3], &iIdx)
15dc0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
15dd0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
15de0 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
15df0 20 20 20 69 66 28 20 69 53 75 62 3d 3d 50 52 45     if( iSub==PRE
15e00 5f 4f 4c 44 20 29 7b 0a 20 20 20 20 20 20 20 20  _OLD ){.        
15e10 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70    rc = sqlite3_p
15e20 72 65 75 70 64 61 74 65 5f 6f 6c 64 28 70 44 62  reupdate_old(pDb
15e30 2d 3e 64 62 2c 20 69 49 64 78 2c 20 26 70 56 61  ->db, iIdx, &pVa
15e40 6c 75 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  lue);.        }e
15e50 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61  lse{.          a
15e60 73 73 65 72 74 28 20 69 53 75 62 3d 3d 50 52 45  ssert( iSub==PRE
15e70 5f 4e 45 57 20 29 3b 0a 20 20 20 20 20 20 20 20  _NEW );.        
15e80 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70    rc = sqlite3_p
15e90 72 65 75 70 64 61 74 65 5f 6e 65 77 28 70 44 62  reupdate_new(pDb
15ea0 2d 3e 64 62 2c 20 69 49 64 78 2c 20 26 70 56 61  ->db, iIdx, &pVa
15eb0 6c 75 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  lue);.        }.
15ec0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
15ed0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
15ee0 20 20 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20          Tcl_Obj 
15ef0 2a 70 4f 62 6a 3b 0a 20 20 20 20 20 20 20 20 20  *pObj;.         
15f00 20 70 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 53   pObj = Tcl_NewS
15f10 74 72 69 6e 67 4f 62 6a 28 28 63 68 61 72 2a 29  tringObj((char*)
15f20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
15f30 78 74 28 70 56 61 6c 75 65 29 2c 20 2d 31 29 3b  xt(pValue), -1);
15f40 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 53  .          Tcl_S
15f50 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
15f60 72 70 2c 20 70 4f 62 6a 29 3b 0a 20 20 20 20 20  rp, pObj);.     
15f70 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
15f80 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
15f90 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 73 71 6c  sult(interp, sql
15fa0 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d  ite3_errmsg(pDb-
15fb0 3e 64 62 29 2c 20 30 29 3b 0a 20 20 20 20 20 20  >db), 0);.      
15fc0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
15fd0 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a  RROR;.        }.
15fe0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
15ff0 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
16000 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 24 64 62 20   /*.  **    $db 
16010 77 61 6c 5f 68 6f 6f 6b 20 3f 73 63 72 69 70 74  wal_hook ?script
16020 3f 0a 20 20 2a 2a 20 20 20 20 24 64 62 20 75 70  ?.  **    $db up
16030 64 61 74 65 5f 68 6f 6f 6b 20 3f 73 63 72 69 70  date_hook ?scrip
16040 74 3f 0a 20 20 2a 2a 20 20 20 20 24 64 62 20 72  t?.  **    $db r
16050 6f 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 20 3f 73 63  ollback_hook ?sc
16060 72 69 70 74 3f 0a 20 20 2a 2f 0a 20 20 63 61 73  ript?.  */.  cas
16070 65 20 44 42 5f 57 41 4c 5f 48 4f 4f 4b 3a 20 0a  e DB_WAL_HOOK: .
16080 20 20 63 61 73 65 20 44 42 5f 55 50 44 41 54 45    case DB_UPDATE
16090 5f 48 4f 4f 4b 3a 20 0a 20 20 63 61 73 65 20 44  _HOOK: .  case D
160a0 42 5f 52 4f 4c 4c 42 41 43 4b 5f 48 4f 4f 4b 3a  B_ROLLBACK_HOOK:
160b0 20 7b 0a 20 20 20 20 2f 2a 20 73 65 74 20 70 70   {.    /* set pp
160c0 48 6f 6f 6b 20 74 6f 20 70 6f 69 6e 74 20 61 74  Hook to point at
160d0 20 70 55 70 64 61 74 65 48 6f 6f 6b 20 6f 72 20   pUpdateHook or 
160e0 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 2c 20 64  pRollbackHook, d
160f0 65 70 65 6e 64 69 6e 67 20 6f 6e 20 0a 20 20 20  epending on .   
16100 20 2a 2a 20 77 68 65 74 68 65 72 20 5b 24 64 62   ** whether [$db
16110 20 75 70 64 61 74 65 5f 68 6f 6f 6b 5d 20 6f 72   update_hook] or
16120 20 5b 24 64 62 20 72 6f 6c 6c 62 61 63 6b 5f 68   [$db rollback_h
16130 6f 6f 6b 5d 20 77 61 73 20 69 6e 76 6f 6b 65 64  ook] was invoked
16140 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 54 63 6c  ..    */.    Tcl
16150 5f 4f 62 6a 20 2a 2a 70 70 48 6f 6f 6b 3b 20 0a  _Obj **ppHook; .
16160 20 20 20 20 69 66 28 20 63 68 6f 69 63 65 3d 3d      if( choice==
16170 44 42 5f 57 41 4c 5f 48 4f 4f 4b 20 29 20 70 70  DB_WAL_HOOK ) pp
16180 48 6f 6f 6b 20 3d 20 26 70 44 62 2d 3e 70 57 61  Hook = &pDb->pWa
16190 6c 48 6f 6f 6b 3b 0a 20 20 20 20 69 66 28 20 63  lHook;.    if( c
161a0 68 6f 69 63 65 3d 3d 44 42 5f 55 50 44 41 54 45  hoice==DB_UPDATE
161b0 5f 48 4f 4f 4b 20 29 20 70 70 48 6f 6f 6b 20 3d  _HOOK ) ppHook =
161c0 20 26 70 44 62 2d 3e 70 55 70 64 61 74 65 48 6f   &pDb->pUpdateHo
161d0 6f 6b 3b 0a 20 20 20 20 69 66 28 20 63 68 6f 69  ok;.    if( choi
161e0 63 65 3d 3d 44 42 5f 52 4f 4c 4c 42 41 43 4b 5f  ce==DB_ROLLBACK_
161f0 48 4f 4f 4b 20 29 20 70 70 48 6f 6f 6b 20 3d 20  HOOK ) ppHook = 
16200 26 70 44 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 48  &pDb->pRollbackH
16210 6f 6f 6b 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a  ook;.    if( obj
16220 63 3e 33 20 29 7b 0a 20 20 20 20 20 20 20 54 63  c>3 ){.       Tc
16230 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
16240 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
16250 22 3f 53 43 52 49 50 54 3f 22 29 3b 0a 20 20 20  "?SCRIPT?");.   
16260 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
16270 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  RROR;.    }..   
16280 20 44 62 48 6f 6f 6b 43 6d 64 28 69 6e 74 65 72   DbHookCmd(inter
16290 70 2c 20 70 44 62 2c 20 28 6f 62 6a 63 3d 3d 33  p, pDb, (objc==3
162a0 20 3f 20 6f 62 6a 76 5b 32 5d 20 3a 20 30 29 2c   ? objv[2] : 0),
162b0 20 70 70 48 6f 6f 6b 29 3b 0a 20 20 20 20 62 72   ppHook);.    br
162c0 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20  eak;.  }..  /*  
162d0 20 20 24 64 62 20 76 65 72 73 69 6f 6e 0a 20 20    $db version.  
162e0 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 74  **.  ** Return t
162f0 68 65 20 76 65 72 73 69 6f 6e 20 73 74 72 69 6e  he version strin
16300 67 20 66 6f 72 20 74 68 69 73 20 64 61 74 61 62  g for this datab
16310 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  ase..  */.  case
16320 20 44 42 5f 56 45 52 53 49 4f 4e 3a 20 7b 0a 20   DB_VERSION: {. 
16330 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74     Tcl_SetResult
16340 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a  (interp, (char *
16350 29 73 71 6c 69 74 65 33 5f 6c 69 62 76 65 72 73  )sqlite3_libvers
16360 69 6f 6e 28 29 2c 20 54 43 4c 5f 53 54 41 54 49  ion(), TCL_STATI
16370 43 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20  C);.    break;. 
16380 20 7d 0a 0a 0a 20 20 7d 20 2f 2a 20 45 6e 64 20   }...  } /* End 
16390 6f 66 20 74 68 65 20 53 57 49 54 43 48 20 73 74  of the SWITCH st
163a0 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 72 65 74  atement */.  ret
163b0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 20 53  urn rc;.}..#if S
163c0 51 4c 49 54 45 5f 54 43 4c 5f 4e 52 45 0a 2f 2a  QLITE_TCL_NRE./*
163d0 0a 2a 2a 20 41 64 61 70 74 6f 72 20 74 68 61 74  .** Adaptor that
163e0 20 70 72 6f 76 69 64 65 73 20 61 6e 20 6f 62 6a   provides an obj
163f0 43 6d 64 20 69 6e 74 65 72 66 61 63 65 20 74 6f  Cmd interface to
16400 20 74 68 65 20 4e 52 45 2d 65 6e 61 62 6c 65 64   the NRE-enabled
16410 0a 2a 2a 20 69 6e 74 65 72 66 61 63 65 20 69 6d  .** interface im
16420 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 0a 2a 2f  plementation..*/
16430 0a 73 74 61 74 69 63 20 69 6e 74 20 44 62 4f 62  .static int DbOb
16440 6a 43 6d 64 41 64 61 70 74 6f 72 28 0a 20 20 76  jCmdAdaptor(.  v
16450 6f 69 64 20 2a 63 64 2c 0a 20 20 54 63 6c 5f 49  oid *cd,.  Tcl_I
16460 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
16470 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
16480 5f 4f 62 6a 20 2a 63 6f 6e 73 74 2a 6f 62 6a 76  _Obj *const*objv
16490 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 54 63 6c  .){.  return Tcl
164a0 5f 4e 52 43 61 6c 6c 4f 62 6a 50 72 6f 63 28 69  _NRCallObjProc(i
164b0 6e 74 65 72 70 2c 20 44 62 4f 62 6a 43 6d 64 2c  nterp, DbObjCmd,
164c0 20 63 64 2c 20 6f 62 6a 63 2c 20 6f 62 6a 76 29   cd, objc, objv)
164d0 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
164e0 4c 49 54 45 5f 54 43 4c 5f 4e 52 45 20 2a 2f 0a  LITE_TCL_NRE */.
164f0 0a 2f 2a 0a 2a 2a 20 20 20 73 71 6c 69 74 65 33  ./*.**   sqlite3
16500 20 44 42 4e 41 4d 45 20 46 49 4c 45 4e 41 4d 45   DBNAME FILENAME
16510 20 3f 2d 76 66 73 20 56 46 53 4e 41 4d 45 3f 20   ?-vfs VFSNAME? 
16520 3f 2d 6b 65 79 20 4b 45 59 3f 20 3f 2d 72 65 61  ?-key KEY? ?-rea
16530 64 6f 6e 6c 79 20 42 4f 4f 4c 45 41 4e 3f 0a 2a  donly BOOLEAN?.*
16540 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
16550 20 20 20 20 20 20 20 20 20 20 20 20 3f 2d 63 72              ?-cr
16560 65 61 74 65 20 42 4f 4f 4c 45 41 4e 3f 20 3f 2d  eate BOOLEAN? ?-
16570 6e 6f 6d 75 74 65 78 20 42 4f 4f 4c 45 41 4e 3f  nomutex BOOLEAN?
16580 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74  .**.** This is t
16590 68 65 20 6d 61 69 6e 20 54 63 6c 20 63 6f 6d 6d  he main Tcl comm
165a0 61 6e 64 2e 20 20 57 68 65 6e 20 74 68 65 20 22  and.  When the "
165b0 73 71 6c 69 74 65 22 20 54 63 6c 20 63 6f 6d 6d  sqlite" Tcl comm
165c0 61 6e 64 20 69 73 0a 2a 2a 20 69 6e 76 6f 6b 65  and is.** invoke
165d0 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  d, this routine 
165e0 72 75 6e 73 20 74 6f 20 70 72 6f 63 65 73 73 20  runs to process 
165f0 74 68 61 74 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a  that command..**
16600 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 61 72  .** The first ar
16610 67 75 6d 65 6e 74 2c 20 44 42 4e 41 4d 45 2c 20  gument, DBNAME, 
16620 69 73 20 61 6e 20 61 72 62 69 74 72 61 72 79 20  is an arbitrary 
16630 6e 61 6d 65 20 66 6f 72 20 61 20 6e 65 77 0a 2a  name for a new.*
16640 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * database conne
16650 63 74 69 6f 6e 2e 20 20 54 68 69 73 20 63 6f 6d  ction.  This com
16660 6d 61 6e 64 20 63 72 65 61 74 65 73 20 61 20 6e  mand creates a n
16670 65 77 20 63 6f 6d 6d 61 6e 64 20 6e 61 6d 65 64  ew command named
16680 0a 2a 2a 20 44 42 4e 41 4d 45 20 74 68 61 74 20  .** DBNAME that 
16690 69 73 20 75 73 65 64 20 74 6f 20 63 6f 6e 74 72  is used to contr
166a0 6f 6c 20 74 68 61 74 20 63 6f 6e 6e 65 63 74 69  ol that connecti
166b0 6f 6e 2e 20 20 54 68 65 20 64 61 74 61 62 61 73  on.  The databas
166c0 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  e.** connection 
166d0 69 73 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20  is deleted when 
166e0 74 68 65 20 44 42 4e 41 4d 45 20 63 6f 6d 6d 61  the DBNAME comma
166f0 6e 64 20 69 73 20 64 65 6c 65 74 65 64 2e 0a 2a  nd is deleted..*
16700 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20  *.** The second 
16710 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20  argument is the 
16720 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  name of the data
16730 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2f  base file..**.*/
16740 0a 73 74 61 74 69 63 20 69 6e 74 20 44 62 4d 61  .static int DbMa
16750 69 6e 28 76 6f 69 64 20 2a 63 64 2c 20 54 63 6c  in(void *cd, Tcl
16760 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
16770 20 69 6e 74 20 6f 62 6a 63 2c 54 63 6c 5f 4f 62   int objc,Tcl_Ob
16780 6a 20 2a 63 6f 6e 73 74 2a 6f 62 6a 76 29 7b 0a  j *const*objv){.
16790 20 20 53 71 6c 69 74 65 44 62 20 2a 70 3b 0a 20    SqliteDb *p;. 
167a0 20 76 6f 69 64 20 2a 70 4b 65 79 20 3d 20 30 3b   void *pKey = 0;
167b0 0a 20 20 69 6e 74 20 6e 4b 65 79 20 3d 20 30 3b  .  int nKey = 0;
167c0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
167d0 41 72 67 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72  Arg;.  char *zEr
167e0 72 4d 73 67 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  rMsg;.  int i;. 
167f0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
16800 6c 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  le;.  const char
16810 20 2a 7a 56 66 73 20 3d 20 30 3b 0a 20 20 69 6e   *zVfs = 0;.  in
16820 74 20 66 6c 61 67 73 3b 0a 20 20 54 63 6c 5f 44  t flags;.  Tcl_D
16830 53 74 72 69 6e 67 20 74 72 61 6e 73 6c 61 74 65  String translate
16840 64 46 69 6c 65 6e 61 6d 65 3b 0a 0a 20 20 2f 2a  dFilename;..  /*
16850 20 49 6e 20 6e 6f 72 6d 61 6c 20 75 73 65 2c 20   In normal use, 
16860 65 61 63 68 20 54 43 4c 20 69 6e 74 65 72 70 72  each TCL interpr
16870 65 74 65 72 20 72 75 6e 73 20 69 6e 20 61 20 73  eter runs in a s
16880 69 6e 67 6c 65 20 74 68 72 65 61 64 2e 20 20 53  ingle thread.  S
16890 6f 0a 20 20 2a 2a 20 62 79 20 64 65 66 61 75 6c  o.  ** by defaul
168a0 74 2c 20 77 65 20 63 61 6e 20 74 75 72 6e 20 6f  t, we can turn o
168b0 66 20 6d 75 74 65 78 69 6e 67 20 6f 6e 20 53 51  f mutexing on SQ
168c0 4c 69 74 65 20 64 61 74 61 62 61 73 65 20 63 6f  Lite database co
168d0 6e 6e 65 63 74 69 6f 6e 73 2e 0a 20 20 2a 2a 20  nnections..  ** 
168e0 48 6f 77 65 76 65 72 2c 20 66 6f 72 20 74 65 73  However, for tes
168f0 74 69 6e 67 20 70 75 72 70 6f 73 65 73 20 69 74  ting purposes it
16900 20 69 73 20 75 73 65 66 75 6c 20 74 6f 20 68 61   is useful to ha
16910 76 65 20 6d 75 74 65 78 65 73 20 74 75 72 6e 65  ve mutexes turne
16920 64 0a 20 20 2a 2a 20 6f 6e 2e 20 20 53 6f 2c 20  d.  ** on.  So, 
16930 62 79 20 64 65 66 61 75 6c 74 2c 20 6d 75 74 65  by default, mute
16940 78 65 73 20 64 65 66 61 75 6c 74 20 6f 66 66 2e  xes default off.
16950 20 20 42 75 74 20 69 66 20 63 6f 6d 70 69 6c 65    But if compile
16960 64 20 77 69 74 68 0a 20 20 2a 2a 20 53 51 4c 49  d with.  ** SQLI
16970 54 45 5f 54 43 4c 5f 44 45 46 41 55 4c 54 5f 46  TE_TCL_DEFAULT_F
16980 55 4c 4c 4d 55 54 45 58 20 74 68 65 6e 20 6d 75  ULLMUTEX then mu
16990 74 65 78 65 73 20 64 65 66 61 75 6c 74 20 6f 6e  texes default on
169a0 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  ..  */.#ifdef SQ
169b0 4c 49 54 45 5f 54 43 4c 5f 44 45 46 41 55 4c 54  LITE_TCL_DEFAULT
169c0 5f 46 55 4c 4c 4d 55 54 45 58 0a 20 20 66 6c 61  _FULLMUTEX.  fla
169d0 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs = SQLITE_OPEN
169e0 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c  _READWRITE | SQL
169f0 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20  ITE_OPEN_CREATE 
16a00 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55  | SQLITE_OPEN_FU
16a10 4c 4c 4d 55 54 45 58 3b 0a 23 65 6c 73 65 0a 20  LLMUTEX;.#else. 
16a20 20 66 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f   flags = SQLITE_
16a30 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c  OPEN_READWRITE |
16a40 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45   SQLITE_OPEN_CRE
16a50 41 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45  ATE | SQLITE_OPE
16a60 4e 5f 4e 4f 4d 55 54 45 58 3b 0a 23 65 6e 64 69  N_NOMUTEX;.#endi
16a70 66 0a 0a 20 20 69 66 28 20 6f 62 6a 63 3d 3d 32  f..  if( objc==2
16a80 20 29 7b 0a 20 20 20 20 7a 41 72 67 20 3d 20 54   ){.    zArg = T
16a90 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
16aa0 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 30 29 3b  Obj(objv[1], 0);
16ab0 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28  .    if( strcmp(
16ac0 7a 41 72 67 2c 22 2d 76 65 72 73 69 6f 6e 22 29  zArg,"-version")
16ad0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  ==0 ){.      Tcl
16ae0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
16af0 74 65 72 70 2c 73 71 6c 69 74 65 33 5f 76 65 72  terp,sqlite3_ver
16b00 73 69 6f 6e 2c 30 29 3b 0a 20 20 20 20 20 20 72  sion,0);.      r
16b10 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20  eturn TCL_OK;.  
16b20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 74 72 63    }.    if( strc
16b30 6d 70 28 7a 41 72 67 2c 22 2d 68 61 73 2d 63 6f  mp(zArg,"-has-co
16b40 64 65 63 22 29 3d 3d 30 20 29 7b 0a 23 69 66 64  dec")==0 ){.#ifd
16b50 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  ef SQLITE_HAS_CO
16b60 44 45 43 0a 20 20 20 20 20 20 54 63 6c 5f 41 70  DEC.      Tcl_Ap
16b70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
16b80 70 2c 22 31 22 2c 30 29 3b 0a 23 65 6c 73 65 0a  p,"1",0);.#else.
16b90 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
16ba0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 30  Result(interp,"0
16bb0 22 2c 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  ",0);.#endif.   
16bc0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b     return TCL_OK
16bd0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f  ;.    }.  }.  fo
16be0 72 28 69 3d 33 3b 20 69 2b 31 3c 6f 62 6a 63 3b  r(i=3; i+1<objc;
16bf0 20 69 2b 3d 32 29 7b 0a 20 20 20 20 7a 41 72 67   i+=2){.    zArg
16c00 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
16c10 28 6f 62 6a 76 5b 69 5d 29 3b 0a 20 20 20 20 69  (objv[i]);.    i
16c20 66 28 20 73 74 72 63 6d 70 28 7a 41 72 67 2c 22  f( strcmp(zArg,"
16c30 2d 6b 65 79 22 29 3d 3d 30 20 29 7b 0a 20 20 20  -key")==0 ){.   
16c40 20 20 20 70 4b 65 79 20 3d 20 54 63 6c 5f 47 65     pKey = Tcl_Ge
16c50 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62  tByteArrayFromOb
16c60 6a 28 6f 62 6a 76 5b 69 2b 31 5d 2c 20 26 6e 4b  j(objv[i+1], &nK
16c70 65 79 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  ey);.    }else i
16c80 66 28 20 73 74 72 63 6d 70 28 7a 41 72 67 2c 20  f( strcmp(zArg, 
16c90 22 2d 76 66 73 22 29 3d 3d 30 20 29 7b 0a 20 20  "-vfs")==0 ){.  
16ca0 20 20 20 20 7a 56 66 73 20 3d 20 54 63 6c 5f 47      zVfs = Tcl_G
16cb0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 69 2b  etString(objv[i+
16cc0 31 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  1]);.    }else i
16cd0 66 28 20 73 74 72 63 6d 70 28 7a 41 72 67 2c 20  f( strcmp(zArg, 
16ce0 22 2d 72 65 61 64 6f 6e 6c 79 22 29 3d 3d 30 20  "-readonly")==0 
16cf0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 62 3b 0a  ){.      int b;.
16d00 20 20 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65        if( Tcl_Ge
16d10 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28  tBooleanFromObj(
16d20 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 69 2b 31  interp, objv[i+1
16d30 5d 2c 20 26 62 29 20 29 20 72 65 74 75 72 6e 20  ], &b) ) return 
16d40 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  TCL_ERROR;.     
16d50 20 69 66 28 20 62 20 29 7b 0a 20 20 20 20 20 20   if( b ){.      
16d60 20 20 66 6c 61 67 73 20 26 3d 20 7e 28 53 51 4c    flags &= ~(SQL
16d70 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
16d80 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43  TE|SQLITE_OPEN_C
16d90 52 45 41 54 45 29 3b 0a 20 20 20 20 20 20 20 20  REATE);.        
16da0 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  flags |= SQLITE_
16db0 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  OPEN_READONLY;. 
16dc0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
16dd0 20 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 53 51      flags &= ~SQ
16de0 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
16df0 4c 59 3b 0a 20 20 20 20 20 20 20 20 66 6c 61 67  LY;.        flag
16e00 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e  s |= SQLITE_OPEN
16e10 5f 52 45 41 44 57 52 49 54 45 3b 0a 20 20 20 20  _READWRITE;.    
16e20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66    }.    }else if
16e30 28 20 73 74 72 63 6d 70 28 7a 41 72 67 2c 20 22  ( strcmp(zArg, "
16e40 2d 63 72 65 61 74 65 22 29 3d 3d 30 20 29 7b 0a  -create")==0 ){.
16e50 20 20 20 20 20 20 69 6e 74 20 62 3b 0a 20 20 20        int b;.   
16e60 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 42 6f     if( Tcl_GetBo
16e70 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74  oleanFromObj(int
16e80 65 72 70 2c 20 6f 62 6a 76 5b 69 2b 31 5d 2c 20  erp, objv[i+1], 
16e90 26 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  &b) ) return TCL
16ea0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 69 66  _ERROR;.      if
16eb0 28 20 62 20 26 26 20 28 66 6c 61 67 73 20 26 20  ( b && (flags & 
16ec0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
16ed0 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ONLY)==0 ){.    
16ee0 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c      flags |= SQL
16ef0 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 3b  ITE_OPEN_CREATE;
16f00 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
16f10 20 20 20 20 20 20 66 6c 61 67 73 20 26 3d 20 7e        flags &= ~
16f20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
16f30 54 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  TE;.      }.    
16f40 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
16f50 28 7a 41 72 67 2c 20 22 2d 6e 6f 6d 75 74 65 78  (zArg, "-nomutex
16f60 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ")==0 ){.      i
16f70 6e 74 20 62 3b 0a 20 20 20 20 20 20 69 66 28 20  nt b;.      if( 
16f80 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72  Tcl_GetBooleanFr
16f90 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
16fa0 6a 76 5b 69 2b 31 5d 2c 20 26 62 29 20 29 20 72  jv[i+1], &b) ) r
16fb0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
16fc0 0a 20 20 20 20 20 20 69 66 28 20 62 20 29 7b 0a  .      if( b ){.
16fd0 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d          flags |=
16fe0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d   SQLITE_OPEN_NOM
16ff0 55 54 45 58 3b 0a 20 20 20 20 20 20 20 20 66 6c  UTEX;.        fl
17000 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 4f  ags &= ~SQLITE_O
17010 50 45 4e 5f 46 55 4c 4c 4d 55 54 45 58 3b 0a 20  PEN_FULLMUTEX;. 
17020 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
17030 20 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 53 51      flags &= ~SQ
17040 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45  LITE_OPEN_NOMUTE
17050 58 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 7d 65  X;.      }.   }e
17060 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a  lse if( strcmp(z
17070 41 72 67 2c 20 22 2d 66 75 6c 6c 6d 75 74 65 78  Arg, "-fullmutex
17080 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ")==0 ){.      i
17090 6e 74 20 62 3b 0a 20 20 20 20 20 20 69 66 28 20  nt b;.      if( 
170a0 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72  Tcl_GetBooleanFr
170b0 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
170c0 6a 76 5b 69 2b 31 5d 2c 20 26 62 29 20 29 20 72  jv[i+1], &b) ) r
170d0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
170e0 0a 20 20 20 20 20 20 69 66 28 20 62 20 29 7b 0a  .      if( b ){.
170f0 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d          flags |=
17100 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55 4c   SQLITE_OPEN_FUL
17110 4c 4d 55 54 45 58 3b 0a 20 20 20 20 20 20 20 20  LMUTEX;.        
17120 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45  flags &= ~SQLITE
17130 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58 3b 0a 20  _OPEN_NOMUTEX;. 
17140 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
17150 20 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 53 51      flags &= ~SQ
17160 4c 49 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55  LITE_OPEN_FULLMU
17170 54 45 58 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  TEX;.      }.   
17180 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 54 63   }else{.      Tc
17190 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
171a0 6e 74 65 72 70 2c 20 22 75 6e 6b 6e 6f 77 6e 20  nterp, "unknown 
171b0 6f 70 74 69 6f 6e 3a 20 22 2c 20 7a 41 72 67 2c  option: ", zArg,
171c0 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20   (char*)0);.    
171d0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
171e0 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  OR;.    }.  }.  
171f0 69 66 28 20 6f 62 6a 63 3c 33 20 7c 7c 20 28 6f  if( objc<3 || (o
17200 62 6a 63 26 31 29 21 3d 31 20 29 7b 0a 20 20 20  bjc&1)!=1 ){.   
17210 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
17220 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
17230 76 2c 20 0a 20 20 20 20 20 20 22 48 41 4e 44 4c  v, .      "HANDL
17240 45 20 46 49 4c 45 4e 41 4d 45 20 3f 2d 76 66 73  E FILENAME ?-vfs
17250 20 56 46 53 4e 41 4d 45 3f 20 3f 2d 72 65 61 64   VFSNAME? ?-read
17260 6f 6e 6c 79 20 42 4f 4f 4c 45 41 4e 3f 20 3f 2d  only BOOLEAN? ?-
17270 63 72 65 61 74 65 20 42 4f 4f 4c 45 41 4e 3f 22  create BOOLEAN?"
17280 0a 20 20 20 20 20 20 22 20 3f 2d 6e 6f 6d 75 74  .      " ?-nomut
17290 65 78 20 42 4f 4f 4c 45 41 4e 3f 20 3f 2d 66 75  ex BOOLEAN? ?-fu
172a0 6c 6c 6d 75 74 65 78 20 42 4f 4f 4c 45 41 4e 3f  llmutex BOOLEAN?
172b0 22 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ".#ifdef SQLITE_
172c0 48 41 53 5f 43 4f 44 45 43 0a 20 20 20 20 20 20  HAS_CODEC.      
172d0 22 20 3f 2d 6b 65 79 20 43 4f 44 45 43 4b 45 59  " ?-key CODECKEY
172e0 3f 22 0a 23 65 6e 64 69 66 0a 20 20 20 20 29 3b  ?".#endif.    );
172f0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
17300 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 45 72  ERROR;.  }.  zEr
17310 72 4d 73 67 20 3d 20 30 3b 0a 20 20 70 20 3d 20  rMsg = 0;.  p = 
17320 28 53 71 6c 69 74 65 44 62 2a 29 54 63 6c 5f 41  (SqliteDb*)Tcl_A
17330 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 29  lloc( sizeof(*p)
17340 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29   );.  if( p==0 )
17350 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73  {.    Tcl_SetRes
17360 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 6d 61 6c  ult(interp, "mal
17370 6c 6f 63 20 66 61 69 6c 65 64 22 2c 20 54 43 4c  loc failed", TCL
17380 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 72 65  _STATIC);.    re
17390 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
173a0 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20    }.  memset(p, 
173b0 30 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a  0, sizeof(*p));.
173c0 20 20 7a 46 69 6c 65 20 3d 20 54 63 6c 5f 47 65    zFile = Tcl_Ge
173d0 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
173e0 62 6a 76 5b 32 5d 2c 20 30 29 3b 0a 20 20 7a 46  bjv[2], 0);.  zF
173f0 69 6c 65 20 3d 20 54 63 6c 5f 54 72 61 6e 73 6c  ile = Tcl_Transl
17400 61 74 65 46 69 6c 65 4e 61 6d 65 28 69 6e 74 65  ateFileName(inte
17410 72 70 2c 20 7a 46 69 6c 65 2c 20 26 74 72 61 6e  rp, zFile, &tran
17420 73 6c 61 74 65 64 46 69 6c 65 6e 61 6d 65 29 3b  slatedFilename);
17430 0a 20 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f  .  sqlite3_open_
17440 76 32 28 7a 46 69 6c 65 2c 20 26 70 2d 3e 64 62  v2(zFile, &p->db
17450 2c 20 66 6c 61 67 73 2c 20 7a 56 66 73 29 3b 0a  , flags, zVfs);.
17460 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65    Tcl_DStringFre
17470 65 28 26 74 72 61 6e 73 6c 61 74 65 64 46 69 6c  e(&translatedFil
17480 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20 53 51  ename);.  if( SQ
17490 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33  LITE_OK!=sqlite3
174a0 5f 65 72 72 63 6f 64 65 28 70 2d 3e 64 62 29 20  _errcode(p->db) 
174b0 29 7b 0a 20 20 20 20 7a 45 72 72 4d 73 67 20 3d  ){.    zErrMsg =
174c0 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
174d0 28 22 25 73 22 2c 20 73 71 6c 69 74 65 33 5f 65  ("%s", sqlite3_e
174e0 72 72 6d 73 67 28 70 2d 3e 64 62 29 29 3b 0a 20  rrmsg(p->db));. 
174f0 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65     sqlite3_close
17500 28 70 2d 3e 64 62 29 3b 0a 20 20 20 20 70 2d 3e  (p->db);.    p->
17510 64 62 20 3d 20 30 3b 0a 20 20 7d 0a 23 69 66 64  db = 0;.  }.#ifd
17520 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  ef SQLITE_HAS_CO
17530 44 45 43 0a 20 20 69 66 28 20 70 2d 3e 64 62 20  DEC.  if( p->db 
17540 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6b  ){.    sqlite3_k
17550 65 79 28 70 2d 3e 64 62 2c 20 70 4b 65 79 2c 20  ey(p->db, pKey, 
17560 6e 4b 65 79 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  nKey);.  }.#endi
17570 66 0a 20 20 69 66 28 20 70 2d 3e 64 62 3d 3d 30  f.  if( p->db==0
17580 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52   ){.    Tcl_SetR
17590 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 45  esult(interp, zE
175a0 72 72 4d 73 67 2c 20 54 43 4c 5f 56 4f 4c 41 54  rrMsg, TCL_VOLAT
175b0 49 4c 45 29 3b 0a 20 20 20 20 54 63 6c 5f 46 72  ILE);.    Tcl_Fr
175c0 65 65 28 28 63 68 61 72 2a 29 70 29 3b 0a 20 20  ee((char*)p);.  
175d0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
175e0 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 72 65 74  ErrMsg);.    ret
175f0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
17600 20 7d 0a 20 20 70 2d 3e 6d 61 78 53 74 6d 74 20   }.  p->maxStmt 
17610 3d 20 4e 55 4d 5f 50 52 45 50 41 52 45 44 5f 53  = NUM_PREPARED_S
17620 54 4d 54 53 3b 0a 20 20 70 2d 3e 69 6e 74 65 72  TMTS;.  p->inter
17630 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 7a 41  p = interp;.  zA
17640 72 67 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  rg = Tcl_GetStri
17650 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31  ngFromObj(objv[1
17660 5d 2c 20 30 29 3b 0a 20 20 69 66 28 20 44 62 55  ], 0);.  if( DbU
17670 73 65 4e 72 65 28 29 20 29 7b 0a 20 20 20 20 54  seNre() ){.    T
17680 63 6c 5f 4e 52 43 72 65 61 74 65 43 6f 6d 6d 61  cl_NRCreateComma
17690 6e 64 28 69 6e 74 65 72 70 2c 20 7a 41 72 67 2c  nd(interp, zArg,
176a0 20 44 62 4f 62 6a 43 6d 64 41 64 61 70 74 6f 72   DbObjCmdAdaptor
176b0 2c 20 44 62 4f 62 6a 43 6d 64 2c 0a 20 20 20 20  , DbObjCmd,.    
176c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
176d0 20 20 20 20 28 63 68 61 72 2a 29 70 2c 20 44 62      (char*)p, Db
176e0 44 65 6c 65 74 65 43 6d 64 29 3b 0a 20 20 7d 65  DeleteCmd);.  }e
176f0 6c 73 65 7b 0a 20 20 20 20 54 63 6c 5f 43 72 65  lse{.    Tcl_Cre
17700 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e  ateObjCommand(in
17710 74 65 72 70 2c 20 7a 41 72 67 2c 20 44 62 4f 62  terp, zArg, DbOb
17720 6a 43 6d 64 2c 20 28 63 68 61 72 2a 29 70 2c 20  jCmd, (char*)p, 
17730 44 62 44 65 6c 65 74 65 43 6d 64 29 3b 0a 20 20  DbDeleteCmd);.  
17740 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  }.  return TCL_O
17750 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 76  K;.}../*.** Prov
17760 69 64 65 20 61 20 64 75 6d 6d 79 20 54 63 6c 5f  ide a dummy Tcl_
17770 49 6e 69 74 53 74 75 62 73 20 69 66 20 77 65 20  InitStubs if we 
17780 61 72 65 20 75 73 69 6e 67 20 74 68 69 73 20 61  are using this a
17790 73 20 61 20 73 74 61 74 69 63 0a 2a 2a 20 6c 69  s a static.** li
177a0 62 72 61 72 79 2e 0a 2a 2f 0a 23 69 66 6e 64 65  brary..*/.#ifnde
177b0 66 20 55 53 45 5f 54 43 4c 5f 53 54 55 42 53 0a  f USE_TCL_STUBS.
177c0 23 20 75 6e 64 65 66 20 20 54 63 6c 5f 49 6e 69  # undef  Tcl_Ini
177d0 74 53 74 75 62 73 0a 23 20 64 65 66 69 6e 65 20  tStubs.# define 
177e0 54 63 6c 5f 49 6e 69 74 53 74 75 62 73 28 61 2c  Tcl_InitStubs(a,
177f0 62 2c 63 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  b,c).#endif../*.
17800 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 77 65 20  ** Make sure we 
17810 68 61 76 65 20 61 20 50 41 43 4b 41 47 45 5f 56  have a PACKAGE_V
17820 45 52 53 49 4f 4e 20 6d 61 63 72 6f 20 64 65 66  ERSION macro def
17830 69 6e 65 64 2e 20 20 54 68 69 73 20 77 69 6c 6c  ined.  This will
17840 20 62 65 0a 2a 2a 20 64 65 66 69 6e 65 64 20 61   be.** defined a
17850 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 62 79 20  utomatically by 
17860 74 68 65 20 54 45 41 20 6d 61 6b 65 66 69 6c 65  the TEA makefile
17870 2e 20 20 42 75 74 20 6f 74 68 65 72 20 6d 61 6b  .  But other mak
17880 65 66 69 6c 65 73 0a 2a 2a 20 64 6f 20 6e 6f 74  efiles.** do not
17890 20 64 65 66 69 6e 65 20 69 74 2e 0a 2a 2f 0a 23   define it..*/.#
178a0 69 66 6e 64 65 66 20 50 41 43 4b 41 47 45 5f 56  ifndef PACKAGE_V
178b0 45 52 53 49 4f 4e 0a 23 20 64 65 66 69 6e 65 20  ERSION.# define 
178c0 50 41 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e 20  PACKAGE_VERSION 
178d0 53 51 4c 49 54 45 5f 56 45 52 53 49 4f 4e 0a 23  SQLITE_VERSION.#
178e0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69  endif../*.** Ini
178f0 74 69 61 6c 69 7a 65 20 74 68 69 73 20 6d 6f 64  tialize this mod
17900 75 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ule..**.** This 
17910 54 63 6c 20 6d 6f 64 75 6c 65 20 63 6f 6e 74 61  Tcl module conta
17920 69 6e 73 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c  ins only a singl
17930 65 20 6e 65 77 20 54 63 6c 20 63 6f 6d 6d 61 6e  e new Tcl comman
17940 64 20 6e 61 6d 65 64 20 22 73 71 6c 69 74 65 22  d named "sqlite"
17950 2e 0a 2a 2a 20 28 48 65 6e 63 65 20 74 68 65 72  ..** (Hence ther
17960 65 20 69 73 20 6e 6f 20 6e 61 6d 65 73 70 61 63  e is no namespac
17970 65 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20  e.  There is no 
17980 70 6f 69 6e 74 20 69 6e 20 75 73 69 6e 67 20 61  point in using a
17990 20 6e 61 6d 65 73 70 61 63 65 0a 2a 2a 20 69 66   namespace.** if
179a0 20 74 68 65 20 65 78 74 65 6e 73 69 6f 6e 20 6f   the extension o
179b0 6e 6c 79 20 73 75 70 70 6c 69 65 73 20 6f 6e 65  nly supplies one
179c0 20 6e 65 77 20 6e 61 6d 65 21 29 20 20 54 68 65   new name!)  The
179d0 20 22 73 71 6c 69 74 65 22 20 63 6f 6d 6d 61 6e   "sqlite" comman
179e0 64 20 69 73 0a 2a 2a 20 75 73 65 64 20 74 6f 20  d is.** used to 
179f0 6f 70 65 6e 20 61 20 6e 65 77 20 53 51 4c 69 74  open a new SQLit
17a00 65 20 64 61 74 61 62 61 73 65 2e 20 20 53 65 65  e database.  See
17a10 20 74 68 65 20 44 62 4d 61 69 6e 28 29 20 72 6f   the DbMain() ro
17a20 75 74 69 6e 65 20 61 62 6f 76 65 0a 2a 2a 20 66  utine above.** f
17a30 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  or additional in
17a40 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  formation..**.**
17a50 20 54 68 65 20 45 58 54 45 52 4e 20 6d 61 63 72   The EXTERN macr
17a60 6f 73 20 61 72 65 20 72 65 71 75 69 72 65 64 20  os are required 
17a70 62 79 20 54 43 4c 20 69 6e 20 6f 72 64 65 72 20  by TCL in order 
17a80 74 6f 20 77 6f 72 6b 20 6f 6e 20 77 69 6e 64 6f  to work on windo
17a90 77 73 2e 0a 2a 2f 0a 45 58 54 45 52 4e 20 69 6e  ws..*/.EXTERN in
17aa0 74 20 53 71 6c 69 74 65 33 5f 49 6e 69 74 28 54  t Sqlite3_Init(T
17ab0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
17ac0 70 29 7b 0a 20 20 54 63 6c 5f 49 6e 69 74 53 74  p){.  Tcl_InitSt
17ad0 75 62 73 28 69 6e 74 65 72 70 2c 20 22 38 2e 34  ubs(interp, "8.4
17ae0 22 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 43 72 65  ", 0);.  Tcl_Cre
17af0 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e  ateObjCommand(in
17b00 74 65 72 70 2c 20 22 73 71 6c 69 74 65 33 22 2c  terp, "sqlite3",
17b10 20 28 54 63 6c 5f 4f 62 6a 43 6d 64 50 72 6f 63   (Tcl_ObjCmdProc
17b20 2a 29 44 62 4d 61 69 6e 2c 20 30 2c 20 30 29 3b  *)DbMain, 0, 0);
17b30 0a 20 20 54 63 6c 5f 50 6b 67 50 72 6f 76 69 64  .  Tcl_PkgProvid
17b40 65 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74  e(interp, "sqlit
17b50 65 33 22 2c 20 50 41 43 4b 41 47 45 5f 56 45 52  e3", PACKAGE_VER
17b60 53 49 4f 4e 29 3b 0a 0a 23 69 66 6e 64 65 66 20  SION);..#ifndef 
17b70 53 51 4c 49 54 45 5f 33 5f 53 55 46 46 49 58 5f  SQLITE_3_SUFFIX_
17b80 4f 4e 4c 59 0a 20 20 2f 2a 20 54 68 65 20 22 73  ONLY.  /* The "s
17b90 71 6c 69 74 65 22 20 61 6c 69 61 73 20 69 73 20  qlite" alias is 
17ba0 75 6e 64 6f 63 75 6d 65 6e 74 65 64 2e 20 20 49  undocumented.  I
17bb0 74 20 69 73 20 68 65 72 65 20 6f 6e 6c 79 20 74  t is here only t
17bc0 6f 20 73 75 70 70 6f 72 74 0a 20 20 2a 2a 20 6c  o support.  ** l
17bd0 65 67 61 63 79 20 73 63 72 69 70 74 73 2e 20 20  egacy scripts.  
17be0 41 6c 6c 20 6e 65 77 20 73 63 72 69 70 74 73 20  All new scripts 
17bf0 73 68 6f 75 6c 64 20 75 73 65 20 6f 6e 6c 79 20  should use only 
17c00 74 68 65 20 22 73 71 6c 69 74 65 33 22 0a 20 20  the "sqlite3".  
17c10 2a 2a 20 63 6f 6d 6d 61 6e 64 2e 0a 20 20 2a 2f  ** command..  */
17c20 0a 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a  .  Tcl_CreateObj
17c30 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20  Command(interp, 
17c40 22 73 71 6c 69 74 65 22 2c 20 28 54 63 6c 5f 4f  "sqlite", (Tcl_O
17c50 62 6a 43 6d 64 50 72 6f 63 2a 29 44 62 4d 61 69  bjCmdProc*)DbMai
17c60 6e 2c 20 30 2c 20 30 29 3b 0a 23 65 6e 64 69 66  n, 0, 0);.#endif
17c70 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ..  return TCL_O
17c80 4b 3b 0a 7d 0a 45 58 54 45 52 4e 20 69 6e 74 20  K;.}.EXTERN int 
17c90 54 63 6c 73 71 6c 69 74 65 33 5f 49 6e 69 74 28  Tclsqlite3_Init(
17ca0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
17cb0 72 70 29 7b 20 72 65 74 75 72 6e 20 53 71 6c 69  rp){ return Sqli
17cc0 74 65 33 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  te3_Init(interp)
17cd0 3b 20 7d 0a 45 58 54 45 52 4e 20 69 6e 74 20 53  ; }.EXTERN int S
17ce0 71 6c 69 74 65 33 5f 53 61 66 65 49 6e 69 74 28  qlite3_SafeInit(
17cf0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
17d00 72 70 29 7b 20 72 65 74 75 72 6e 20 54 43 4c 5f  rp){ return TCL_
17d10 4f 4b 3b 20 7d 0a 45 58 54 45 52 4e 20 69 6e 74  OK; }.EXTERN int
17d20 20 54 63 6c 73 71 6c 69 74 65 33 5f 53 61 66 65   Tclsqlite3_Safe
17d30 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20  Init(Tcl_Interp 
17d40 2a 69 6e 74 65 72 70 29 7b 20 72 65 74 75 72 6e  *interp){ return
17d50 20 54 43 4c 5f 4f 4b 3b 20 7d 0a 45 58 54 45 52   TCL_OK; }.EXTER
17d60 4e 20 69 6e 74 20 53 71 6c 69 74 65 33 5f 55 6e  N int Sqlite3_Un
17d70 6c 6f 61 64 28 54 63 6c 5f 49 6e 74 65 72 70 20  load(Tcl_Interp 
17d80 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 66 6c 61  *interp, int fla
17d90 67 73 29 7b 20 72 65 74 75 72 6e 20 54 43 4c 5f  gs){ return TCL_
17da0 4f 4b 3b 20 7d 0a 45 58 54 45 52 4e 20 69 6e 74  OK; }.EXTERN int
17db0 20 54 63 6c 73 71 6c 69 74 65 33 5f 55 6e 6c 6f   Tclsqlite3_Unlo
17dc0 61 64 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  ad(Tcl_Interp *i
17dd0 6e 74 65 72 70 2c 20 69 6e 74 20 66 6c 61 67 73  nterp, int flags
17de0 29 7b 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  ){ return TCL_OK
17df0 3b 20 7d 0a 45 58 54 45 52 4e 20 69 6e 74 20 53  ; }.EXTERN int S
17e00 71 6c 69 74 65 33 5f 53 61 66 65 55 6e 6c 6f 61  qlite3_SafeUnloa
17e10 64 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  d(Tcl_Interp *in
17e20 74 65 72 70 2c 20 69 6e 74 20 66 6c 61 67 73 29  terp, int flags)
17e30 7b 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b  { return TCL_OK;
17e40 20 7d 0a 45 58 54 45 52 4e 20 69 6e 74 20 54 63   }.EXTERN int Tc
17e50 6c 73 71 6c 69 74 65 33 5f 53 61 66 65 55 6e 6c  lsqlite3_SafeUnl
17e60 6f 61 64 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a  oad(Tcl_Interp *
17e70 69 6e 74 65 72 70 2c 20 69 6e 74 20 66 6c 61 67  interp, int flag
17e80 73 29 7b 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  s){ return TCL_O
17e90 4b 3b 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51  K;}...#ifndef SQ
17ea0 4c 49 54 45 5f 33 5f 53 55 46 46 49 58 5f 4f 4e  LITE_3_SUFFIX_ON
17eb0 4c 59 0a 69 6e 74 20 53 71 6c 69 74 65 5f 49 6e  LY.int Sqlite_In
17ec0 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  it(Tcl_Interp *i
17ed0 6e 74 65 72 70 29 7b 20 72 65 74 75 72 6e 20 53  nterp){ return S
17ee0 71 6c 69 74 65 33 5f 49 6e 69 74 28 69 6e 74 65  qlite3_Init(inte
17ef0 72 70 29 3b 20 7d 0a 69 6e 74 20 54 63 6c 73 71  rp); }.int Tclsq
17f00 6c 69 74 65 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  lite_Init(Tcl_In
17f10 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 20 72  terp *interp){ r
17f20 65 74 75 72 6e 20 53 71 6c 69 74 65 33 5f 49 6e  eturn Sqlite3_In
17f30 69 74 28 69 6e 74 65 72 70 29 3b 20 7d 0a 69 6e  it(interp); }.in
17f40 74 20 53 71 6c 69 74 65 5f 53 61 66 65 49 6e 69  t Sqlite_SafeIni
17f50 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  t(Tcl_Interp *in
17f60 74 65 72 70 29 7b 20 72 65 74 75 72 6e 20 54 43  terp){ return TC
17f70 4c 5f 4f 4b 3b 20 7d 0a 69 6e 74 20 54 63 6c 73  L_OK; }.int Tcls
17f80 71 6c 69 74 65 5f 53 61 66 65 49 6e 69 74 28 54  qlite_SafeInit(T
17f90 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
17fa0 70 29 7b 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  p){ return TCL_O
17fb0 4b 3b 20 7d 0a 69 6e 74 20 53 71 6c 69 74 65 5f  K; }.int Sqlite_
17fc0 55 6e 6c 6f 61 64 28 54 63 6c 5f 49 6e 74 65 72  Unload(Tcl_Inter
17fd0 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 66  p *interp, int f
17fe0 6c 61 67 73 29 7b 20 72 65 74 75 72 6e 20 54 43  lags){ return TC
17ff0 4c 5f 4f 4b 3b 20 7d 0a 69 6e 74 20 54 63 6c 73  L_OK; }.int Tcls
18000 71 6c 69 74 65 5f 55 6e 6c 6f 61 64 28 54 63 6c  qlite_Unload(Tcl
18010 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
18020 20 69 6e 74 20 66 6c 61 67 73 29 7b 20 72 65 74   int flags){ ret
18030 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 7d 0a 69 6e  urn TCL_OK; }.in
18040 74 20 53 71 6c 69 74 65 5f 53 61 66 65 55 6e 6c  t Sqlite_SafeUnl
18050 6f 61 64 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a  oad(Tcl_Interp *
18060 69 6e 74 65 72 70 2c 20 69 6e 74 20 66 6c 61 67  interp, int flag
18070 73 29 7b 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  s){ return TCL_O
18080 4b 3b 20 7d 0a 69 6e 74 20 54 63 6c 73 71 6c 69  K; }.int Tclsqli
18090 74 65 5f 53 61 66 65 55 6e 6c 6f 61 64 28 54 63  te_SafeUnload(Tc
180a0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
180b0 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 20 72 65  , int flags){ re
180c0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 7d 0a 23 65  turn TCL_OK;}.#e
180d0 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 54 43 4c  ndif..#ifdef TCL
180e0 53 48 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  SH./************
180f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18100 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18110 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18120 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18130 2a 0a 2a 2a 20 41 6c 6c 20 6f 66 20 74 68 65 20  *.** All of the 
18140 63 6f 64 65 20 74 68 61 74 20 66 6f 6c 6c 6f 77  code that follow
18150 73 20 69 73 20 75 73 65 64 20 74 6f 20 62 75 69  s is used to bui
18160 6c 64 20 73 74 61 6e 64 61 6c 6f 6e 65 20 54 43  ld standalone TC
18170 4c 20 69 6e 74 65 72 70 72 65 74 65 72 73 0a 2a  L interpreters.*
18180 2a 20 74 68 61 74 20 61 72 65 20 73 74 61 74 69  * that are stati
18190 63 61 6c 6c 79 20 6c 69 6e 6b 65 64 20 77 69 74  cally linked wit
181a0 68 20 53 51 4c 69 74 65 2e 20 20 45 6e 61 62 6c  h SQLite.  Enabl
181b0 65 20 74 68 65 73 65 20 62 79 20 63 6f 6d 70 69  e these by compi
181c0 6c 69 6e 67 0a 2a 2a 20 77 69 74 68 20 2d 44 54  ling.** with -DT
181d0 43 4c 53 48 3d 6e 20 77 68 65 72 65 20 6e 20 63  CLSH=n where n c
181e0 61 6e 20 62 65 20 31 20 6f 72 20 32 2e 20 20 41  an be 1 or 2.  A
181f0 6e 20 6e 20 6f 66 20 31 20 67 65 6e 65 72 61 74  n n of 1 generat
18200 65 73 20 61 20 73 74 61 6e 64 61 72 64 0a 2a 2a  es a standard.**
18210 20 74 63 6c 73 68 20 62 75 74 20 77 69 74 68 20   tclsh but with 
18220 53 51 4c 69 74 65 20 62 75 69 6c 74 20 69 6e 2e  SQLite built in.
18230 20 20 41 6e 20 6e 20 6f 66 20 32 20 67 65 6e 65    An n of 2 gene
18240 72 61 74 65 73 20 74 68 65 20 53 51 4c 69 74 65  rates the SQLite
18250 20 73 70 61 63 65 0a 2a 2a 20 61 6e 61 6c 79 73   space.** analys
18260 69 73 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 0a  is program..*/..
18270 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
18280 54 45 5f 54 45 53 54 29 20 7c 7c 20 64 65 66 69  TE_TEST) || defi
18290 6e 65 64 28 53 51 4c 49 54 45 5f 54 43 4c 4d 44  ned(SQLITE_TCLMD
182a0 35 29 0a 2f 2a 0a 20 2a 20 54 68 69 73 20 63 6f  5)./*. * This co
182b0 64 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68  de implements th
182c0 65 20 4d 44 35 20 6d 65 73 73 61 67 65 2d 64 69  e MD5 message-di
182d0 67 65 73 74 20 61 6c 67 6f 72 69 74 68 6d 2e 0a  gest algorithm..
182e0 20 2a 20 54 68 65 20 61 6c 67 6f 72 69 74 68 6d   * The algorithm
182f0 20 69 73 20 64 75 65 20 74 6f 20 52 6f 6e 20 52   is due to Ron R
18300 69 76 65 73 74 2e 20 20 54 68 69 73 20 63 6f 64  ivest.  This cod
18310 65 20 77 61 73 0a 20 2a 20 77 72 69 74 74 65 6e  e was. * written
18320 20 62 79 20 43 6f 6c 69 6e 20 50 6c 75 6d 62 20   by Colin Plumb 
18330 69 6e 20 31 39 39 33 2c 20 6e 6f 20 63 6f 70 79  in 1993, no copy
18340 72 69 67 68 74 20 69 73 20 63 6c 61 69 6d 65 64  right is claimed
18350 2e 0a 20 2a 20 54 68 69 73 20 63 6f 64 65 20 69  .. * This code i
18360 73 20 69 6e 20 74 68 65 20 70 75 62 6c 69 63 20  s in the public 
18370 64 6f 6d 61 69 6e 3b 20 64 6f 20 77 69 74 68 20  domain; do with 
18380 69 74 20 77 68 61 74 20 79 6f 75 20 77 69 73 68  it what you wish
18390 2e 0a 20 2a 0a 20 2a 20 45 71 75 69 76 61 6c 65  .. *. * Equivale
183a0 6e 74 20 63 6f 64 65 20 69 73 20 61 76 61 69 6c  nt code is avail
183b0 61 62 6c 65 20 66 72 6f 6d 20 52 53 41 20 44 61  able from RSA Da
183c0 74 61 20 53 65 63 75 72 69 74 79 2c 20 49 6e 63  ta Security, Inc
183d0 2e 0a 20 2a 20 54 68 69 73 20 63 6f 64 65 20 68  .. * This code h
183e0 61 73 20 62 65 65 6e 20 74 65 73 74 65 64 20 61  as been tested a
183f0 67 61 69 6e 73 74 20 74 68 61 74 2c 20 61 6e 64  gainst that, and
18400 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 2c 0a   is equivalent,.
18410 20 2a 20 65 78 63 65 70 74 20 74 68 61 74 20 79   * except that y
18420 6f 75 20 64 6f 6e 27 74 20 6e 65 65 64 20 74 6f  ou don't need to
18430 20 69 6e 63 6c 75 64 65 20 74 77 6f 20 70 61 67   include two pag
18440 65 73 20 6f 66 20 6c 65 67 61 6c 65 73 65 0a 20  es of legalese. 
18450 2a 20 77 69 74 68 20 65 76 65 72 79 20 63 6f 70  * with every cop
18460 79 2e 0a 20 2a 0a 20 2a 20 54 6f 20 63 6f 6d 70  y.. *. * To comp
18470 75 74 65 20 74 68 65 20 6d 65 73 73 61 67 65 20  ute the message 
18480 64 69 67 65 73 74 20 6f 66 20 61 20 63 68 75 6e  digest of a chun
18490 6b 20 6f 66 20 62 79 74 65 73 2c 20 64 65 63 6c  k of bytes, decl
184a0 61 72 65 20 61 6e 0a 20 2a 20 4d 44 35 43 6f 6e  are an. * MD5Con
184b0 74 65 78 74 20 73 74 72 75 63 74 75 72 65 2c 20  text structure, 
184c0 70 61 73 73 20 69 74 20 74 6f 20 4d 44 35 49 6e  pass it to MD5In
184d0 69 74 2c 20 63 61 6c 6c 20 4d 44 35 55 70 64 61  it, call MD5Upda
184e0 74 65 20 61 73 0a 20 2a 20 6e 65 65 64 65 64 20  te as. * needed 
184f0 6f 6e 20 62 75 66 66 65 72 73 20 66 75 6c 6c 20  on buffers full 
18500 6f 66 20 62 79 74 65 73 2c 20 61 6e 64 20 74 68  of bytes, and th
18510 65 6e 20 63 61 6c 6c 20 4d 44 35 46 69 6e 61 6c  en call MD5Final
18520 2c 20 77 68 69 63 68 0a 20 2a 20 77 69 6c 6c 20  , which. * will 
18530 66 69 6c 6c 20 61 20 73 75 70 70 6c 69 65 64 20  fill a supplied 
18540 31 36 2d 62 79 74 65 20 61 72 72 61 79 20 77 69  16-byte array wi
18550 74 68 20 74 68 65 20 64 69 67 65 73 74 2e 0a 20  th the digest.. 
18560 2a 2f 0a 0a 2f 2a 0a 20 2a 20 49 66 20 63 6f 6d  */../*. * If com
18570 70 69 6c 65 64 20 6f 6e 20 61 20 6d 61 63 68 69  piled on a machi
18580 6e 65 20 74 68 61 74 20 64 6f 65 73 6e 27 74 20  ne that doesn't 
18590 68 61 76 65 20 61 20 33 32 2d 62 69 74 20 69 6e  have a 32-bit in
185a0 74 65 67 65 72 2c 0a 20 2a 20 79 6f 75 20 6a 75  teger,. * you ju
185b0 73 74 20 73 65 74 20 22 75 69 6e 74 33 32 22 20  st set "uint32" 
185c0 74 6f 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  to the appropria
185d0 74 65 20 64 61 74 61 74 79 70 65 20 66 6f 72 20  te datatype for 
185e0 61 6e 0a 20 2a 20 75 6e 73 69 67 6e 65 64 20 33  an. * unsigned 3
185f0 32 2d 62 69 74 20 69 6e 74 65 67 65 72 2e 20 20  2-bit integer.  
18600 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 20 2a 0a  For example:. *.
18610 20 2a 20 20 20 20 20 20 20 63 63 20 2d 44 75 69   *       cc -Dui
18620 6e 74 33 32 3d 27 75 6e 73 69 67 6e 65 64 20 6c  nt32='unsigned l
18630 6f 6e 67 27 20 6d 64 35 2e 63 0a 20 2a 0a 20 2a  ong' md5.c. *. *
18640 2f 0a 23 69 66 6e 64 65 66 20 75 69 6e 74 33 32  /.#ifndef uint32
18650 0a 23 20 20 64 65 66 69 6e 65 20 75 69 6e 74 33  .#  define uint3
18660 32 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 0a 23  2 unsigned int.#
18670 65 6e 64 69 66 0a 0a 73 74 72 75 63 74 20 4d 44  endif..struct MD
18680 35 43 6f 6e 74 65 78 74 20 7b 0a 20 20 69 6e 74  5Context {.  int
18690 20 69 73 49 6e 69 74 3b 0a 20 20 75 69 6e 74 33   isInit;.  uint3
186a0 32 20 62 75 66 5b 34 5d 3b 0a 20 20 75 69 6e 74  2 buf[4];.  uint
186b0 33 32 20 62 69 74 73 5b 32 5d 3b 0a 20 20 75 6e  32 bits[2];.  un
186c0 73 69 67 6e 65 64 20 63 68 61 72 20 69 6e 5b 36  signed char in[6
186d0 34 5d 3b 0a 7d 3b 0a 74 79 70 65 64 65 66 20 73  4];.};.typedef s
186e0 74 72 75 63 74 20 4d 44 35 43 6f 6e 74 65 78 74  truct MD5Context
186f0 20 4d 44 35 43 6f 6e 74 65 78 74 3b 0a 0a 2f 2a   MD5Context;../*
18700 0a 20 2a 20 4e 6f 74 65 3a 20 74 68 69 73 20 63  . * Note: this c
18710 6f 64 65 20 69 73 20 68 61 72 6d 6c 65 73 73 20  ode is harmless 
18720 6f 6e 20 6c 69 74 74 6c 65 2d 65 6e 64 69 61 6e  on little-endian
18730 20 6d 61 63 68 69 6e 65 73 2e 0a 20 2a 2f 0a 73   machines.. */.s
18740 74 61 74 69 63 20 76 6f 69 64 20 62 79 74 65 52  tatic void byteR
18750 65 76 65 72 73 65 20 28 75 6e 73 69 67 6e 65 64  everse (unsigned
18760 20 63 68 61 72 20 2a 62 75 66 2c 20 75 6e 73 69   char *buf, unsi
18770 67 6e 65 64 20 6c 6f 6e 67 73 29 7b 0a 20 20 20  gned longs){.   
18780 20 20 20 20 20 75 69 6e 74 33 32 20 74 3b 0a 20       uint32 t;. 
18790 20 20 20 20 20 20 20 64 6f 20 7b 0a 20 20 20 20         do {.    
187a0 20 20 20 20 20 20 20 20 20 20 20 20 74 20 3d 20              t = 
187b0 28 75 69 6e 74 33 32 29 28 28 75 6e 73 69 67 6e  (uint32)((unsign
187c0 65 64 29 62 75 66 5b 33 5d 3c 3c 38 20 7c 20 62  ed)buf[3]<<8 | b
187d0 75 66 5b 32 5d 29 20 3c 3c 20 31 36 20 7c 0a 20  uf[2]) << 16 |. 
187e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
187f0 20 20 20 20 20 20 20 20 20 20 20 28 28 75 6e 73             ((uns
18800 69 67 6e 65 64 29 62 75 66 5b 31 5d 3c 3c 38 20  igned)buf[1]<<8 
18810 7c 20 62 75 66 5b 30 5d 29 3b 0a 20 20 20 20 20  | buf[0]);.     
18820 20 20 20 20 20 20 20 20 20 20 20 2a 28 75 69 6e             *(uin
18830 74 33 32 20 2a 29 62 75 66 20 3d 20 74 3b 0a 20  t32 *)buf = t;. 
18840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
18850 75 66 20 2b 3d 20 34 3b 0a 20 20 20 20 20 20 20  uf += 4;.       
18860 20 7d 20 77 68 69 6c 65 20 28 2d 2d 6c 6f 6e 67   } while (--long
18870 73 29 3b 0a 7d 0a 2f 2a 20 54 68 65 20 66 6f 75  s);.}./* The fou
18880 72 20 63 6f 72 65 20 66 75 6e 63 74 69 6f 6e 73  r core functions
18890 20 2d 20 46 31 20 69 73 20 6f 70 74 69 6d 69 7a   - F1 is optimiz
188a0 65 64 20 73 6f 6d 65 77 68 61 74 20 2a 2f 0a 0a  ed somewhat */..
188b0 2f 2a 20 23 64 65 66 69 6e 65 20 46 31 28 78 2c  /* #define F1(x,
188c0 20 79 2c 20 7a 29 20 28 78 20 26 20 79 20 7c 20   y, z) (x & y | 
188d0 7e 78 20 26 20 7a 29 20 2a 2f 0a 23 64 65 66 69  ~x & z) */.#defi
188e0 6e 65 20 46 31 28 78 2c 20 79 2c 20 7a 29 20 28  ne F1(x, y, z) (
188f0 7a 20 5e 20 28 78 20 26 20 28 79 20 5e 20 7a 29  z ^ (x & (y ^ z)
18900 29 29 0a 23 64 65 66 69 6e 65 20 46 32 28 78 2c  )).#define F2(x,
18910 20 79 2c 20 7a 29 20 46 31 28 7a 2c 20 78 2c 20   y, z) F1(z, x, 
18920 79 29 0a 23 64 65 66 69 6e 65 20 46 33 28 78 2c  y).#define F3(x,
18930 20 79 2c 20 7a 29 20 28 78 20 5e 20 79 20 5e 20   y, z) (x ^ y ^ 
18940 7a 29 0a 23 64 65 66 69 6e 65 20 46 34 28 78 2c  z).#define F4(x,
18950 20 79 2c 20 7a 29 20 28 79 20 5e 20 28 78 20 7c   y, z) (y ^ (x |
18960 20 7e 7a 29 29 0a 0a 2f 2a 20 54 68 69 73 20 69   ~z))../* This i
18970 73 20 74 68 65 20 63 65 6e 74 72 61 6c 20 73 74  s the central st
18980 65 70 20 69 6e 20 74 68 65 20 4d 44 35 20 61 6c  ep in the MD5 al
18990 67 6f 72 69 74 68 6d 2e 20 2a 2f 0a 23 64 65 66  gorithm. */.#def
189a0 69 6e 65 20 4d 44 35 53 54 45 50 28 66 2c 20 77  ine MD5STEP(f, w
189b0 2c 20 78 2c 20 79 2c 20 7a 2c 20 64 61 74 61 2c  , x, y, z, data,
189c0 20 73 29 20 5c 0a 20 20 20 20 20 20 20 20 28 20   s) \.        ( 
189d0 77 20 2b 3d 20 66 28 78 2c 20 79 2c 20 7a 29 20  w += f(x, y, z) 
189e0 2b 20 64 61 74 61 2c 20 20 77 20 3d 20 77 3c 3c  + data,  w = w<<
189f0 73 20 7c 20 77 3e 3e 28 33 32 2d 73 29 2c 20 20  s | w>>(32-s),  
18a00 77 20 2b 3d 20 78 20 29 0a 0a 2f 2a 0a 20 2a 20  w += x )../*. * 
18a10 54 68 65 20 63 6f 72 65 20 6f 66 20 74 68 65 20  The core of the 
18a20 4d 44 35 20 61 6c 67 6f 72 69 74 68 6d 2c 20 74  MD5 algorithm, t
18a30 68 69 73 20 61 6c 74 65 72 73 20 61 6e 20 65 78  his alters an ex
18a40 69 73 74 69 6e 67 20 4d 44 35 20 68 61 73 68 20  isting MD5 hash 
18a50 74 6f 0a 20 2a 20 72 65 66 6c 65 63 74 20 74 68  to. * reflect th
18a60 65 20 61 64 64 69 74 69 6f 6e 20 6f 66 20 31 36  e addition of 16
18a70 20 6c 6f 6e 67 77 6f 72 64 73 20 6f 66 20 6e 65   longwords of ne
18a80 77 20 64 61 74 61 2e 20 20 4d 44 35 55 70 64 61  w data.  MD5Upda
18a90 74 65 20 62 6c 6f 63 6b 73 0a 20 2a 20 74 68 65  te blocks. * the
18aa0 20 64 61 74 61 20 61 6e 64 20 63 6f 6e 76 65 72   data and conver
18ab0 74 73 20 62 79 74 65 73 20 69 6e 74 6f 20 6c 6f  ts bytes into lo
18ac0 6e 67 77 6f 72 64 73 20 66 6f 72 20 74 68 69 73  ngwords for this
18ad0 20 72 6f 75 74 69 6e 65 2e 0a 20 2a 2f 0a 73 74   routine.. */.st
18ae0 61 74 69 63 20 76 6f 69 64 20 4d 44 35 54 72 61  atic void MD5Tra
18af0 6e 73 66 6f 72 6d 28 75 69 6e 74 33 32 20 62 75  nsform(uint32 bu
18b00 66 5b 34 5d 2c 20 63 6f 6e 73 74 20 75 69 6e 74  f[4], const uint
18b10 33 32 20 69 6e 5b 31 36 5d 29 7b 0a 20 20 20 20  32 in[16]){.    
18b20 20 20 20 20 72 65 67 69 73 74 65 72 20 75 69 6e      register uin
18b30 74 33 32 20 61 2c 20 62 2c 20 63 2c 20 64 3b 0a  t32 a, b, c, d;.
18b40 0a 20 20 20 20 20 20 20 20 61 20 3d 20 62 75 66  .        a = buf
18b50 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20 62 20 3d  [0];.        b =
18b60 20 62 75 66 5b 31 5d 3b 0a 20 20 20 20 20 20 20   buf[1];.       
18b70 20 63 20 3d 20 62 75 66 5b 32 5d 3b 0a 20 20 20   c = buf[2];.   
18b80 20 20 20 20 20 64 20 3d 20 62 75 66 5b 33 5d 3b       d = buf[3];
18b90 0a 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45  ..        MD5STE
18ba0 50 28 46 31 2c 20 61 2c 20 62 2c 20 63 2c 20 64  P(F1, a, b, c, d
18bb0 2c 20 69 6e 5b 20 30 5d 2b 30 78 64 37 36 61 61  , in[ 0]+0xd76aa
18bc0 34 37 38 2c 20 20 37 29 3b 0a 20 20 20 20 20 20  478,  7);.      
18bd0 20 20 4d 44 35 53 54 45 50 28 46 31 2c 20 64 2c    MD5STEP(F1, d,
18be0 20 61 2c 20 62 2c 20 63 2c 20 69 6e 5b 20 31 5d   a, b, c, in[ 1]
18bf0 2b 30 78 65 38 63 37 62 37 35 36 2c 20 31 32 29  +0xe8c7b756, 12)
18c00 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45  ;.        MD5STE
18c10 50 28 46 31 2c 20 63 2c 20 64 2c 20 61 2c 20 62  P(F1, c, d, a, b
18c20 2c 20 69 6e 5b 20 32 5d 2b 30 78 32 34 32 30 37  , in[ 2]+0x24207
18c30 30 64 62 2c 20 31 37 29 3b 0a 20 20 20 20 20 20  0db, 17);.      
18c40 20 20 4d 44 35 53 54 45 50 28 46 31 2c 20 62 2c    MD5STEP(F1, b,
18c50 20 63 2c 20 64 2c 20 61 2c 20 69 6e 5b 20 33 5d   c, d, a, in[ 3]
18c60 2b 30 78 63 31 62 64 63 65 65 65 2c 20 32 32 29  +0xc1bdceee, 22)
18c70 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45  ;.        MD5STE
18c80 50 28 46 31 2c 20 61 2c 20 62 2c 20 63 2c 20 64  P(F1, a, b, c, d
18c90 2c 20 69 6e 5b 20 34 5d 2b 30 78 66 35 37 63 30  , in[ 4]+0xf57c0
18ca0 66 61 66 2c 20 20 37 29 3b 0a 20 20 20 20 20 20  faf,  7);.      
18cb0 20 20 4d 44 35 53 54 45 50 28 46 31 2c 20 64 2c    MD5STEP(F1, d,
18cc0 20 61 2c 20 62 2c 20 63 2c 20 69 6e 5b 20 35 5d   a, b, c, in[ 5]
18cd0 2b 30 78 34 37 38 37 63 36 32 61 2c 20 31 32 29  +0x4787c62a, 12)
18ce0 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45  ;.        MD5STE
18cf0 50 28 46 31 2c 20 63 2c 20 64 2c 20 61 2c 20 62  P(F1, c, d, a, b
18d00 2c 20 69 6e 5b 20 36 5d 2b 30 78 61 38 33 30 34  , in[ 6]+0xa8304
18d10 36 31 33 2c 20 31 37 29 3b 0a 20 20 20 20 20 20  613, 17);.      
18d20 20 20 4d 44 35 53 54 45 50 28 46 31 2c 20 62 2c    MD5STEP(F1, b,
18d30 20 63 2c 20 64 2c 20 61 2c 20 69 6e 5b 20 37 5d   c, d, a, in[ 7]
18d40 2b 30 78 66 64 34 36 39 35 30 31 2c 20 32 32 29  +0xfd469501, 22)
18d50 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45  ;.        MD5STE
18d60 50 28 46 31 2c 20 61 2c 20 62 2c 20 63 2c 20 64  P(F1, a, b, c, d
18d70 2c 20 69 6e 5b 20 38 5d 2b 30 78 36 39 38 30 39  , in[ 8]+0x69809
18d80 38 64 38 2c 20 20 37 29 3b 0a 20 20 20 20 20 20  8d8,  7);.      
18d90 20 20 4d 44 35 53 54 45 50 28 46 31 2c 20 64 2c    MD5STEP(F1, d,
18da0 20 61 2c 20 62 2c 20 63 2c 20 69 6e 5b 20 39 5d   a, b, c, in[ 9]
18db0 2b 30 78 38 62 34 34 66 37 61 66 2c 20 31 32 29  +0x8b44f7af, 12)
18dc0 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45  ;.        MD5STE
18dd0 50 28 46 31 2c 20 63 2c 20 64 2c 20 61 2c 20 62  P(F1, c, d, a, b
18de0 2c 20 69 6e 5b 31 30 5d 2b 30 78 66 66 66 66 35  , in[10]+0xffff5
18df0 62 62 31 2c 20 31 37 29 3b 0a 20 20 20 20 20 20  bb1, 17);.      
18e00 20 20 4d 44 35 53 54 45 50 28 46 31 2c 20 62 2c    MD5STEP(F1, b,
18e10 20 63 2c 20 64 2c 20 61 2c 20 69 6e 5b 31 31 5d   c, d, a, in[11]
18e20 2b 30 78 38 39 35 63 64 37 62 65 2c 20 32 32 29  +0x895cd7be, 22)
18e30 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45  ;.        MD5STE
18e40 50 28 46 31 2c 20 61 2c 20 62 2c 20 63 2c 20 64  P(F1, a, b, c, d
18e50 2c 20 69 6e 5b 31 32 5d 2b 30 78 36 62 39 30 31  , in[12]+0x6b901
18e60 31 32 32 2c 20 20 37 29 3b 0a 20 20 20 20 20 20  122,  7);.      
18e70 20 20 4d 44 35 53 54 45 50 28 46 31 2c 20 64 2c    MD5STEP(F1, d,
18e80 20 61 2c 20 62 2c 20 63 2c 20 69 6e 5b 31 33 5d   a, b, c, in[13]
18e90 2b 30 78 66 64 39 38 37 31 39 33 2c 20 31 32 29  +0xfd987193, 12)
18ea0 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45  ;.        MD5STE
18eb0 50 28 46 31 2c 20 63 2c 20 64 2c 20 61 2c 20 62  P(F1, c, d, a, b
18ec0 2c 20 69 6e 5b 31 34 5d 2b 30 78 61 36 37 39 34  , in[14]+0xa6794
18ed0 33 38 65 2c 20 31 37 29 3b 0a 20 20 20 20 20 20  38e, 17);.      
18ee0 20 20 4d 44 35 53 54 45 50 28 46 31 2c 20 62 2c    MD5STEP(F1, b,
18ef0 20 63 2c 20 64 2c 20 61 2c 20 69 6e 5b 31 35 5d   c, d, a, in[15]
18f00 2b 30 78 34 39 62 34 30 38 32 31 2c 20 32 32 29  +0x49b40821, 22)
18f10 3b 0a 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54  ;..        MD5ST
18f20 45 50 28 46 32 2c 20 61 2c 20 62 2c 20 63 2c 20  EP(F2, a, b, c, 
18f30 64 2c 20 69 6e 5b 20 31 5d 2b 30 78 66 36 31 65  d, in[ 1]+0xf61e
18f40 32 35 36 32 2c 20 20 35 29 3b 0a 20 20 20 20 20  2562,  5);.     
18f50 20 20 20 4d 44 35 53 54 45 50 28 46 32 2c 20 64     MD5STEP(F2, d
18f60 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e 5b 20 36  , a, b, c, in[ 6
18f70 5d 2b 30 78 63 30 34 30 62 33 34 30 2c 20 20 39  ]+0xc040b340,  9
18f80 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54  );.        MD5ST
18f90 45 50 28 46 32 2c 20 63 2c 20 64 2c 20 61 2c 20  EP(F2, c, d, a, 
18fa0 62 2c 20 69 6e 5b 31 31 5d 2b 30 78 32 36 35 65  b, in[11]+0x265e
18fb0 35 61 35 31 2c 20 31 34 29 3b 0a 20 20 20 20 20  5a51, 14);.     
18fc0 20 20 20 4d 44 35 53 54 45 50 28 46 32 2c 20 62     MD5STEP(F2, b
18fd0 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e 5b 20 30  , c, d, a, in[ 0
18fe0 5d 2b 30 78 65 39 62 36 63 37 61 61 2c 20 32 30  ]+0xe9b6c7aa, 20
18ff0 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54  );.        MD5ST
19000 45 50 28 46 32 2c 20 61 2c 20 62 2c 20 63 2c 20  EP(F2, a, b, c, 
19010 64 2c 20 69 6e 5b 20 35 5d 2b 30 78 64 36 32 66  d, in[ 5]+0xd62f
19020 31 30 35 64 2c 20 20 35 29 3b 0a 20 20 20 20 20  105d,  5);.     
19030 20 20 20 4d 44 35 53 54 45 50 28 46 32 2c 20 64     MD5STEP(F2, d
19040 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e 5b 31 30  , a, b, c, in[10
19050 5d 2b 30 78 30 32 34 34 31 34 35 33 2c 20 20 39  ]+0x02441453,  9
19060 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54  );.        MD5ST
19070 45 50 28 46 32 2c 20 63 2c 20 64 2c 20 61 2c 20  EP(F2, c, d, a, 
19080 62 2c 20 69 6e 5b 31 35 5d 2b 30 78 64 38 61 31  b, in[15]+0xd8a1
19090 65 36 38 31 2c 20 31 34 29 3b 0a 20 20 20 20 20  e681, 14);.     
190a0 20 20 20 4d 44 35 53 54 45 50 28 46 32 2c 20 62     MD5STEP(F2, b
190b0 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e 5b 20 34  , c, d, a, in[ 4
190c0 5d 2b 30 78 65 37 64 33 66 62 63 38 2c 20 32 30  ]+0xe7d3fbc8, 20
190d0 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54  );.        MD5ST
190e0 45 50 28 46 32 2c 20 61 2c 20 62 2c 20 63 2c 20  EP(F2, a, b, c, 
190f0 64 2c 20 69 6e 5b 20 39 5d 2b 30 78 32 31 65 31  d, in[ 9]+0x21e1
19100 63 64 65 36 2c 20 20 35 29 3b 0a 20 20 20 20 20  cde6,  5);.     
19110 20 20 20 4d 44 35 53 54 45 50 28 46 32 2c 20 64     MD5STEP(F2, d
19120 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e 5b 31 34  , a, b, c, in[14
19130 5d 2b 30 78 63 33 33 37 30 37 64 36 2c 20 20 39  ]+0xc33707d6,  9
19140 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54  );.        MD5ST
19150 45 50 28 46 32 2c 20 63 2c 20 64 2c 20 61 2c 20  EP(F2, c, d, a, 
19160 62 2c 20 69 6e 5b 20 33 5d 2b 30 78 66 34 64 35  b, in[ 3]+0xf4d5
19170 30 64 38 37 2c 20 31 34 29 3b 0a 20 20 20 20 20  0d87, 14);.     
19180 20 20 20 4d 44 35 53 54 45 50 28 46 32 2c 20 62     MD5STEP(F2, b
19190 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e 5b 20 38  , c, d, a, in[ 8
191a0 5d 2b 30 78 34 35 35 61 31 34 65 64 2c 20 32 30  ]+0x455a14ed, 20
191b0 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54  );.        MD5ST
191c0 45 50 28 46 32 2c 20 61 2c 20 62 2c 20 63 2c 20  EP(F2, a, b, c, 
191d0 64 2c 20 69 6e 5b 31 33 5d 2b 30 78 61 39 65 33  d, in[13]+0xa9e3
191e0 65 39 30 35 2c 20 20 35 29 3b 0a 20 20 20 20 20  e905,  5);.     
191f0 20 20 20 4d 44 35 53 54 45 50 28 46 32 2c 20 64     MD5STEP(F2, d
19200 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e 5b 20 32  , a, b, c, in[ 2
19210 5d 2b 30 78 66 63 65 66 61 33 66 38 2c 20 20 39  ]+0xfcefa3f8,  9
19220 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54  );.        MD5ST
19230 45 50 28 46 32 2c 20 63 2c 20 64 2c 20 61 2c 20  EP(F2, c, d, a, 
19240 62 2c 20 69 6e 5b 20 37 5d 2b 30 78 36 37 36 66  b, in[ 7]+0x676f
19250 30 32 64 39 2c 20 31 34 29 3b 0a 20 20 20 20 20  02d9, 14);.     
19260 20 20 20 4d 44 35 53 54 45 50 28 46 32 2c 20 62     MD5STEP(F2, b
19270 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e 5b 31 32  , c, d, a, in[12
19280 5d 2b 30 78 38 64 32 61 34 63 38 61 2c 20 32 30  ]+0x8d2a4c8a, 20
19290 29 3b 0a 0a 20 20 20 20 20 20 20 20 4d 44 35 53  );..        MD5S
192a0 54 45 50 28 46 33 2c 20 61 2c 20 62 2c 20 63 2c  TEP(F3, a, b, c,
192b0 20 64 2c 20 69 6e 5b 20 35 5d 2b 30 78 66 66 66   d, in[ 5]+0xfff
192c0 61 33 39 34 32 2c 20 20 34 29 3b 0a 20 20 20 20  a3942,  4);.    
192d0 20 20 20 20 4d 44 35 53 54 45 50 28 46 33 2c 20      MD5STEP(F3, 
192e0 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e 5b 20  d, a, b, c, in[ 
192f0 38 5d 2b 30 78 38 37 37 31 66 36 38 31 2c 20 31  8]+0x8771f681, 1
19300 31 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53  1);.        MD5S
19310 54 45 50 28 46 33 2c 20 63 2c 20 64 2c 20 61 2c  TEP(F3, c, d, a,
19320 20 62 2c 20 69 6e 5b 31 31 5d 2b 30 78 36 64 39   b, in[11]+0x6d9
19330 64 36 31 32 32 2c 20 31 36 29 3b 0a 20 20 20 20  d6122, 16);.    
19340 20 20 20 20 4d 44 35 53 54 45 50 28 46 33 2c 20      MD5STEP(F3, 
19350 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e 5b 31  b, c, d, a, in[1
19360 34 5d 2b 30 78 66 64 65 35 33 38 30 63 2c 20 32  4]+0xfde5380c, 2
19370 33 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53  3);.        MD5S
19380 54 45 50 28 46 33 2c 20 61 2c 20 62 2c 20 63 2c  TEP(F3, a, b, c,
19390 20 64 2c 20 69 6e 5b 20 31 5d 2b 30 78 61 34 62   d, in[ 1]+0xa4b
193a0 65 65 61 34 34 2c 20 20 34 29 3b 0a 20 20 20 20  eea44,  4);.    
193b0 20 20 20 20 4d 44 35 53 54 45 50 28 46 33 2c 20      MD5STEP(F3, 
193c0 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e 5b 20  d, a, b, c, in[ 
193d0 34 5d 2b 30 78 34 62 64 65 63 66 61 39 2c 20 31  4]+0x4bdecfa9, 1
193e0 31 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53  1);.        MD5S
193f0 54 45 50 28 46 33 2c 20 63 2c 20 64 2c 20 61 2c  TEP(F3, c, d, a,
19400 20 62 2c 20 69 6e 5b 20 37 5d 2b 30 78 66 36 62   b, in[ 7]+0xf6b
19410 62 34 62 36 30 2c 20 31 36 29 3b 0a 20 20 20 20  b4b60, 16);.    
19420 20 20 20 20 4d 44 35 53 54 45 50 28 46 33 2c 20      MD5STEP(F3, 
19430 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e 5b 31  b, c, d, a, in[1
19440 30 5d 2b 30 78 62 65 62 66 62 63 37 30 2c 20 32  0]+0xbebfbc70, 2
19450 33 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53  3);.        MD5S
19460 54 45 50 28 46 33 2c 20 61 2c 20 62 2c 20 63 2c  TEP(F3, a, b, c,
19470 20 64 2c 20 69 6e 5b 31 33 5d 2b 30 78 32 38 39   d, in[13]+0x289
19480 62 37 65 63 36 2c 20 20 34 29 3b 0a 20 20 20 20  b7ec6,  4);.    
19490 20 20 20 20 4d 44 35 53 54 45 50 28 46 33 2c 20      MD5STEP(F3, 
194a0 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e 5b 20  d, a, b, c, in[ 
194b0 30 5d 2b 30 78 65 61 61 31 32 37 66 61 2c 20 31  0]+0xeaa127fa, 1
194c0 31 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53  1);.        MD5S
194d0 54 45 50 28 46 33 2c 20 63 2c 20 64 2c 20 61 2c  TEP(F3, c, d, a,
194e0 20 62 2c 20 69 6e 5b 20 33 5d 2b 30 78 64 34 65   b, in[ 3]+0xd4e
194f0 66 33 30 38 35 2c 20 31 36 29 3b 0a 20 20 20 20  f3085, 16);.    
19500 20 20 20 20 4d 44 35 53 54 45 50 28 46 33 2c 20      MD5STEP(F3, 
19510 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e 5b 20  b, c, d, a, in[ 
19520 36 5d 2b 30 78 30 34 38 38 31 64 30 35 2c 20 32  6]+0x04881d05, 2
19530 33 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53  3);.        MD5S
19540 54 45 50 28 46 33 2c 20 61 2c 20 62 2c 20 63 2c  TEP(F3, a, b, c,
19550 20 64 2c 20 69 6e 5b 20 39 5d 2b 30 78 64 39 64   d, in[ 9]+0xd9d
19560 34 64 30 33 39 2c 20 20 34 29 3b 0a 20 20 20 20  4d039,  4);.    
19570 20 20 20 20 4d 44 35 53 54 45 50 28 46 33 2c 20      MD5STEP(F3, 
19580 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e 5b 31  d, a, b, c, in[1
19590 32 5d 2b 30 78 65 36 64 62 39 39 65 35 2c 20 31  2]+0xe6db99e5, 1
195a0 31 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53  1);.        MD5S
195b0 54 45 50 28 46 33 2c 20 63 2c 20 64 2c 20 61 2c  TEP(F3, c, d, a,
195c0 20 62 2c 20 69 6e 5b 31 35 5d 2b 30 78 31 66 61   b, in[15]+0x1fa
195d0 32 37 63 66 38 2c 20 31 36 29 3b 0a 20 20 20 20  27cf8, 16);.    
195e0 20 20 20 20 4d 44 35 53 54 45 50 28 46 33 2c 20      MD5STEP(F3, 
195f0 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e 5b 20  b, c, d, a, in[ 
19600 32 5d 2b 30 78 63 34 61 63 35 36 36 35 2c 20 32  2]+0xc4ac5665, 2
19610 33 29 3b 0a 0a 20 20 20 20 20 20 20 20 4d 44 35  3);..        MD5
19620 53 54 45 50 28 46 34 2c 20 61 2c 20 62 2c 20 63  STEP(F4, a, b, c
19630 2c 20 64 2c 20 69 6e 5b 20 30 5d 2b 30 78 66 34  , d, in[ 0]+0xf4
19640 32 39 32 32 34 34 2c 20 20 36 29 3b 0a 20 20 20  292244,  6);.   
19650 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 34 2c       MD5STEP(F4,
19660 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e 5b   d, a, b, c, in[
19670 20 37 5d 2b 30 78 34 33 32 61 66 66 39 37 2c 20   7]+0x432aff97, 
19680 31 30 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35  10);.        MD5
19690 53 54 45 50 28 46 34 2c 20 63 2c 20 64 2c 20 61  STEP(F4, c, d, a
196a0 2c 20 62 2c 20 69 6e 5b 31 34 5d 2b 30 78 61 62  , b, in[14]+0xab
196b0 39 34 32 33 61 37 2c 20 31 35 29 3b 0a 20 20 20  9423a7, 15);.   
196c0 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 34 2c       MD5STEP(F4,
196d0 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e 5b   b, c, d, a, in[
196e0 20 35 5d 2b 30 78 66 63 39 33 61 30 33 39 2c 20   5]+0xfc93a039, 
196f0 32 31 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35  21);.        MD5
19700 53 54 45 50 28 46 34 2c 20 61 2c 20 62 2c 20 63  STEP(F4, a, b, c
19710 2c 20 64 2c 20 69 6e 5b 31 32 5d 2b 30 78 36 35  , d, in[12]+0x65
19720 35 62 35 39 63 33 2c 20 20 36 29 3b 0a 20 20 20  5b59c3,  6);.   
19730 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 34 2c       MD5STEP(F4,
19740 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e 5b   d, a, b, c, in[
19750 20 33 5d 2b 30 78 38 66 30 63 63 63 39 32 2c 20   3]+0x8f0ccc92, 
19760 31 30 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35  10);.        MD5
19770 53 54 45 50 28 46 34 2c 20 63 2c 20 64 2c 20 61  STEP(F4, c, d, a
19780 2c 20 62 2c 20 69 6e 5b 31 30 5d 2b 30 78 66 66  , b, in[10]+0xff
19790 65 66 66 34 37 64 2c 20 31 35 29 3b 0a 20 20 20  eff47d, 15);.   
197a0 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 34 2c       MD5STEP(F4,
197b0 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e 5b   b, c, d, a, in[
197c0 20 31 5d 2b 30 78 38 35 38 34 35 64 64 31 2c 20   1]+0x85845dd1, 
197d0 32 31 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35  21);.        MD5
197e0 53 54 45 50 28 46 34 2c 20 61 2c 20 62 2c 20 63  STEP(F4, a, b, c
197f0 2c 20 64 2c 20 69 6e 5b 20 38 5d 2b 30 78 36 66  , d, in[ 8]+0x6f
19800 61 38 37 65 34 66 2c 20 20 36 29 3b 0a 20 20 20  a87e4f,  6);.   
19810 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 34 2c       MD5STEP(F4,
19820 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e 5b   d, a, b, c, in[
19830 31 35 5d 2b 30 78 66 65 32 63 65 36 65 30 2c 20  15]+0xfe2ce6e0, 
19840 31 30 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35  10);.        MD5
19850 53 54 45 50 28 46 34 2c 20 63 2c 20 64 2c 20 61  STEP(F4, c, d, a
19860 2c 20 62 2c 20 69 6e 5b 20 36 5d 2b 30 78 61 33  , b, in[ 6]+0xa3
19870 30 31 34 33 31 34 2c 20 31 35 29 3b 0a 20 20 20  014314, 15);.   
19880 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 34 2c       MD5STEP(F4,
19890 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e 5b   b, c, d, a, in[
198a0 31 33 5d 2b 30 78 34 65 30 38 31 31 61 31 2c 20  13]+0x4e0811a1, 
198b0 32 31 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35  21);.        MD5
198c0 53 54 45 50 28 46 34 2c 20 61 2c 20 62 2c 20 63  STEP(F4, a, b, c
198d0 2c 20 64 2c 20 69 6e 5b 20 34 5d 2b 30 78 66 37  , d, in[ 4]+0xf7
198e0 35 33 37 65 38 32 2c 20 20 36 29 3b 0a 20 20 20  537e82,  6);.   
198f0 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 34 2c       MD5STEP(F4,
19900 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e 5b   d, a, b, c, in[
19910 31 31 5d 2b 30 78 62 64 33 61 66 32 33 35 2c 20  11]+0xbd3af235, 
19920 31 30 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35  10);.        MD5
19930 53 54 45 50 28 46 34 2c 20 63 2c 20 64 2c 20 61  STEP(F4, c, d, a
19940 2c 20 62 2c 20 69 6e 5b 20 32 5d 2b 30 78 32 61  , b, in[ 2]+0x2a
19950 64 37 64 32 62 62 2c 20 31 35 29 3b 0a 20 20 20  d7d2bb, 15);.   
19960 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 34 2c       MD5STEP(F4,
19970 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e 5b   b, c, d, a, in[
19980 20 39 5d 2b 30 78 65 62 38 36 64 33 39 31 2c 20   9]+0xeb86d391, 
19990 32 31 29 3b 0a 0a 20 20 20 20 20 20 20 20 62 75  21);..        bu
199a0 66 5b 30 5d 20 2b 3d 20 61 3b 0a 20 20 20 20 20  f[0] += a;.     
199b0 20 20 20 62 75 66 5b 31 5d 20 2b 3d 20 62 3b 0a     buf[1] += b;.
199c0 20 20 20 20 20 20 20 20 62 75 66 5b 32 5d 20 2b          buf[2] +
199d0 3d 20 63 3b 0a 20 20 20 20 20 20 20 20 62 75 66  = c;.        buf
199e0 5b 33 5d 20 2b 3d 20 64 3b 0a 7d 0a 0a 2f 2a 0a  [3] += d;.}../*.
199f0 20 2a 20 53 74 61 72 74 20 4d 44 35 20 61 63 63   * Start MD5 acc
19a00 75 6d 75 6c 61 74 69 6f 6e 2e 20 20 53 65 74 20  umulation.  Set 
19a10 62 69 74 20 63 6f 75 6e 74 20 74 6f 20 30 20 61  bit count to 0 a
19a20 6e 64 20 62 75 66 66 65 72 20 74 6f 20 6d 79 73  nd buffer to mys
19a30 74 65 72 69 6f 75 73 0a 20 2a 20 69 6e 69 74 69  terious. * initi
19a40 61 6c 69 7a 61 74 69 6f 6e 20 63 6f 6e 73 74 61  alization consta
19a50 6e 74 73 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20  nts.. */.static 
19a60 76 6f 69 64 20 4d 44 35 49 6e 69 74 28 4d 44 35  void MD5Init(MD5
19a70 43 6f 6e 74 65 78 74 20 2a 63 74 78 29 7b 0a 20  Context *ctx){. 
19a80 20 20 20 20 20 20 20 63 74 78 2d 3e 69 73 49 6e         ctx->isIn
19a90 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  it = 1;.        
19aa0 63 74 78 2d 3e 62 75 66 5b 30 5d 20 3d 20 30 78  ctx->buf[0] = 0x
19ab0 36 37 34 35 32 33 30 31 3b 0a 20 20 20 20 20 20  67452301;.      
19ac0 20 20 63 74 78 2d 3e 62 75 66 5b 31 5d 20 3d 20    ctx->buf[1] = 
19ad0 30 78 65 66 63 64 61 62 38 39 3b 0a 20 20 20 20  0xefcdab89;.    
19ae0 20 20 20 20 63 74 78 2d 3e 62 75 66 5b 32 5d 20      ctx->buf[2] 
19af0 3d 20 30 78 39 38 62 61 64 63 66 65 3b 0a 20 20  = 0x98badcfe;.  
19b00 20 20 20 20 20 20 63 74 78 2d 3e 62 75 66 5b 33        ctx->buf[3
19b10 5d 20 3d 20 30 78 31 30 33 32 35 34 37 36 3b 0a  ] = 0x10325476;.
19b20 20 20 20 20 20 20 20 20 63 74 78 2d 3e 62 69 74          ctx->bit
19b30 73 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  s[0] = 0;.      
19b40 20 20 63 74 78 2d 3e 62 69 74 73 5b 31 5d 20 3d    ctx->bits[1] =
19b50 20 30 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 55 70 64   0;.}../*. * Upd
19b60 61 74 65 20 63 6f 6e 74 65 78 74 20 74 6f 20 72  ate context to r
19b70 65 66 6c 65 63 74 20 74 68 65 20 63 6f 6e 63 61  eflect the conca
19b80 74 65 6e 61 74 69 6f 6e 20 6f 66 20 61 6e 6f 74  tenation of anot
19b90 68 65 72 20 62 75 66 66 65 72 20 66 75 6c 6c 0a  her buffer full.
19ba0 20 2a 20 6f 66 20 62 79 74 65 73 2e 0a 20 2a 2f   * of bytes.. */
19bb0 0a 73 74 61 74 69 63 20 0a 76 6f 69 64 20 4d 44  .static .void MD
19bc0 35 55 70 64 61 74 65 28 4d 44 35 43 6f 6e 74 65  5Update(MD5Conte
19bd0 78 74 20 2a 63 74 78 2c 20 63 6f 6e 73 74 20 75  xt *ctx, const u
19be0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75  nsigned char *bu
19bf0 66 2c 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  f, unsigned int 
19c00 6c 65 6e 29 7b 0a 20 20 20 20 20 20 20 20 75 69  len){.        ui
19c10 6e 74 33 32 20 74 3b 0a 0a 20 20 20 20 20 20 20  nt32 t;..       
19c20 20 2f 2a 20 55 70 64 61 74 65 20 62 69 74 63 6f   /* Update bitco
19c30 75 6e 74 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20  unt */..        
19c40 74 20 3d 20 63 74 78 2d 3e 62 69 74 73 5b 30 5d  t = ctx->bits[0]
19c50 3b 0a 20 20 20 20 20 20 20 20 69 66 20 28 28 63  ;.        if ((c
19c60 74 78 2d 3e 62 69 74 73 5b 30 5d 20 3d 20 74 20  tx->bits[0] = t 
19c70 2b 20 28 28 75 69 6e 74 33 32 29 6c 65 6e 20 3c  + ((uint32)len <
19c80 3c 20 33 29 29 20 3c 20 74 29 0a 20 20 20 20 20  < 3)) < t).     
19c90 20 20 20 20 20 20 20 20 20 20 20 63 74 78 2d 3e             ctx->
19ca0 62 69 74 73 5b 31 5d 2b 2b 3b 20 2f 2a 20 43 61  bits[1]++; /* Ca
19cb0 72 72 79 20 66 72 6f 6d 20 6c 6f 77 20 74 6f 20  rry from low to 
19cc0 68 69 67 68 20 2a 2f 0a 20 20 20 20 20 20 20 20  high */.        
19cd0 63 74 78 2d 3e 62 69 74 73 5b 31 5d 20 2b 3d 20  ctx->bits[1] += 
19ce0 6c 65 6e 20 3e 3e 20 32 39 3b 0a 0a 20 20 20 20  len >> 29;..    
19cf0 20 20 20 20 74 20 3d 20 28 74 20 3e 3e 20 33 29      t = (t >> 3)
19d00 20 26 20 30 78 33 66 3b 20 20 20 20 2f 2a 20 42   & 0x3f;    /* B
19d10 79 74 65 73 20 61 6c 72 65 61 64 79 20 69 6e 20  ytes already in 
19d20 73 68 73 49 6e 66 6f 2d 3e 64 61 74 61 20 2a 2f  shsInfo->data */
19d30 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e  ..        /* Han
19d40 64 6c 65 20 61 6e 79 20 6c 65 61 64 69 6e 67 20  dle any leading 
19d50 6f 64 64 2d 73 69 7a 65 64 20 63 68 75 6e 6b 73  odd-sized chunks
19d60 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 69 66 20   */..        if 
19d70 28 20 74 20 29 20 7b 0a 20 20 20 20 20 20 20 20  ( t ) {.        
19d80 20 20 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64          unsigned
19d90 20 63 68 61 72 20 2a 70 20 3d 20 28 75 6e 73 69   char *p = (unsi
19da0 67 6e 65 64 20 63 68 61 72 20 2a 29 63 74 78 2d  gned char *)ctx-
19db0 3e 69 6e 20 2b 20 74 3b 0a 0a 20 20 20 20 20 20  >in + t;..      
19dc0 20 20 20 20 20 20 20 20 20 20 74 20 3d 20 36 34            t = 64
19dd0 2d 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  -t;.            
19de0 20 20 20 20 69 66 20 28 6c 65 6e 20 3c 20 74 29      if (len < t)
19df0 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
19e00 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70             memcp
19e10 79 28 70 2c 20 62 75 66 2c 20 6c 65 6e 29 3b 0a  y(p, buf, len);.
19e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19e30 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a          return;.
19e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19e50 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
19e60 20 20 6d 65 6d 63 70 79 28 70 2c 20 62 75 66 2c    memcpy(p, buf,
19e70 20 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   t);.           
19e80 20 20 20 20 20 62 79 74 65 52 65 76 65 72 73 65       byteReverse
19e90 28 63 74 78 2d 3e 69 6e 2c 20 31 36 29 3b 0a 20  (ctx->in, 16);. 
19ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4d                 M
19eb0 44 35 54 72 61 6e 73 66 6f 72 6d 28 63 74 78 2d  D5Transform(ctx-
19ec0 3e 62 75 66 2c 20 28 75 69 6e 74 33 32 20 2a 29  >buf, (uint32 *)
19ed0 63 74 78 2d 3e 69 6e 29 3b 0a 20 20 20 20 20 20  ctx->in);.      
19ee0 20 20 20 20 20 20 20 20 20 20 62 75 66 20 2b 3d            buf +=
19ef0 20 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   t;.            
19f00 20 20 20 20 6c 65 6e 20 2d 3d 20 74 3b 0a 20 20      len -= t;.  
19f10 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
19f20 20 2f 2a 20 50 72 6f 63 65 73 73 20 64 61 74 61   /* Process data
19f30 20 69 6e 20 36 34 2d 62 79 74 65 20 63 68 75 6e   in 64-byte chun
19f40 6b 73 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 77  ks */..        w
19f50 68 69 6c 65 20 28 6c 65 6e 20 3e 3d 20 36 34 29  hile (len >= 64)
19f60 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
19f70 20 20 20 6d 65 6d 63 70 79 28 63 74 78 2d 3e 69     memcpy(ctx->i
19f80 6e 2c 20 62 75 66 2c 20 36 34 29 3b 0a 20 20 20  n, buf, 64);.   
19f90 20 20 20 20 20 20 20 20 20 20 20 20 20 62 79 74               byt
19fa0 65 52 65 76 65 72 73 65 28 63 74 78 2d 3e 69 6e  eReverse(ctx->in
19fb0 2c 20 31 36 29 3b 0a 20 20 20 20 20 20 20 20 20  , 16);.         
19fc0 20 20 20 20 20 20 20 4d 44 35 54 72 61 6e 73 66         MD5Transf
19fd0 6f 72 6d 28 63 74 78 2d 3e 62 75 66 2c 20 28 75  orm(ctx->buf, (u
19fe0 69 6e 74 33 32 20 2a 29 63 74 78 2d 3e 69 6e 29  int32 *)ctx->in)
19ff0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1a000 20 20 62 75 66 20 2b 3d 20 36 34 3b 0a 20 20 20    buf += 64;.   
1a010 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 65 6e               len
1a020 20 2d 3d 20 36 34 3b 0a 20 20 20 20 20 20 20 20   -= 64;.        
1a030 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 48 61  }..        /* Ha
1a040 6e 64 6c 65 20 61 6e 79 20 72 65 6d 61 69 6e 69  ndle any remaini
1a050 6e 67 20 62 79 74 65 73 20 6f 66 20 64 61 74 61  ng bytes of data
1a060 2e 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 6d 65  . */..        me
1a070 6d 63 70 79 28 63 74 78 2d 3e 69 6e 2c 20 62 75  mcpy(ctx->in, bu
1a080 66 2c 20 6c 65 6e 29 3b 0a 7d 0a 0a 2f 2a 0a 20  f, len);.}../*. 
1a090 2a 20 46 69 6e 61 6c 20 77 72 61 70 75 70 20 2d  * Final wrapup -
1a0a0 20 70 61 64 20 74 6f 20 36 34 2d 62 79 74 65 20   pad to 64-byte 
1a0b0 62 6f 75 6e 64 61 72 79 20 77 69 74 68 20 74 68  boundary with th
1a0c0 65 20 62 69 74 20 70 61 74 74 65 72 6e 20 0a 20  e bit pattern . 
1a0d0 2a 20 31 20 30 2a 20 28 36 34 2d 62 69 74 20 63  * 1 0* (64-bit c
1a0e0 6f 75 6e 74 20 6f 66 20 62 69 74 73 20 70 72 6f  ount of bits pro
1a0f0 63 65 73 73 65 64 2c 20 4d 53 42 2d 66 69 72 73  cessed, MSB-firs
1a100 74 29 0a 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f  t). */.static vo
1a110 69 64 20 4d 44 35 46 69 6e 61 6c 28 75 6e 73 69  id MD5Final(unsi
1a120 67 6e 65 64 20 63 68 61 72 20 64 69 67 65 73 74  gned char digest
1a130 5b 31 36 5d 2c 20 4d 44 35 43 6f 6e 74 65 78 74  [16], MD5Context
1a140 20 2a 63 74 78 29 7b 0a 20 20 20 20 20 20 20 20   *ctx){.        
1a150 75 6e 73 69 67 6e 65 64 20 63 6f 75 6e 74 3b 0a  unsigned count;.
1a160 20 20 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64          unsigned
1a170 20 63 68 61 72 20 2a 70 3b 0a 0a 20 20 20 20 20   char *p;..     
1a180 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 6e 75     /* Compute nu
1a190 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6d 6f  mber of bytes mo
1a1a0 64 20 36 34 20 2a 2f 0a 20 20 20 20 20 20 20 20  d 64 */.        
1a1b0 63 6f 75 6e 74 20 3d 20 28 63 74 78 2d 3e 62 69  count = (ctx->bi
1a1c0 74 73 5b 30 5d 20 3e 3e 20 33 29 20 26 20 30 78  ts[0] >> 3) & 0x
1a1d0 33 46 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20  3F;..        /* 
1a1e0 53 65 74 20 74 68 65 20 66 69 72 73 74 20 63 68  Set the first ch
1a1f0 61 72 20 6f 66 20 70 61 64 64 69 6e 67 20 74 6f  ar of padding to
1a200 20 30 78 38 30 2e 20 20 54 68 69 73 20 69 73 20   0x80.  This is 
1a210 73 61 66 65 20 73 69 6e 63 65 20 74 68 65 72 65  safe since there
1a220 20 69 73 0a 20 20 20 20 20 20 20 20 20 20 20 61   is.           a
1a230 6c 77 61 79 73 20 61 74 20 6c 65 61 73 74 20 6f  lways at least o
1a240 6e 65 20 62 79 74 65 20 66 72 65 65 20 2a 2f 0a  ne byte free */.
1a250 20 20 20 20 20 20 20 20 70 20 3d 20 63 74 78 2d          p = ctx-
1a260 3e 69 6e 20 2b 20 63 6f 75 6e 74 3b 0a 20 20 20  >in + count;.   
1a270 20 20 20 20 20 2a 70 2b 2b 20 3d 20 30 78 38 30       *p++ = 0x80
1a280 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 42 79  ;..        /* By
1a290 74 65 73 20 6f 66 20 70 61 64 64 69 6e 67 20 6e  tes of padding n
1a2a0 65 65 64 65 64 20 74 6f 20 6d 61 6b 65 20 36 34  eeded to make 64
1a2b0 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 20 20   bytes */.      
1a2c0 20 20 63 6f 75 6e 74 20 3d 20 36 34 20 2d 20 31    count = 64 - 1
1a2d0 20 2d 20 63 6f 75 6e 74 3b 0a 0a 20 20 20 20 20   - count;..     
1a2e0 20 20 20 2f 2a 20 50 61 64 20 6f 75 74 20 74 6f     /* Pad out to
1a2f0 20 35 36 20 6d 6f 64 20 36 34 20 2a 2f 0a 20 20   56 mod 64 */.  
1a300 20 20 20 20 20 20 69 66 20 28 63 6f 75 6e 74 20        if (count 
1a310 3c 20 38 29 20 7b 0a 20 20 20 20 20 20 20 20 20  < 8) {.         
1a320 20 20 20 20 20 20 20 2f 2a 20 54 77 6f 20 6c 6f         /* Two lo
1a330 74 73 20 6f 66 20 70 61 64 64 69 6e 67 3a 20 20  ts of padding:  
1a340 50 61 64 20 74 68 65 20 66 69 72 73 74 20 62 6c  Pad the first bl
1a350 6f 63 6b 20 74 6f 20 36 34 20 62 79 74 65 73 20  ock to 64 bytes 
1a360 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
1a370 20 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20     memset(p, 0, 
1a380 63 6f 75 6e 74 29 3b 0a 20 20 20 20 20 20 20 20  count);.        
1a390 20 20 20 20 20 20 20 20 62 79 74 65 52 65 76 65          byteReve
1a3a0 72 73 65 28 63 74 78 2d 3e 69 6e 2c 20 31 36 29  rse(ctx->in, 16)
1a3b0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1a3c0 20 20 4d 44 35 54 72 61 6e 73 66 6f 72 6d 28 63    MD5Transform(c
1a3d0 74 78 2d 3e 62 75 66 2c 20 28 75 69 6e 74 33 32  tx->buf, (uint32
1a3e0 20 2a 29 63 74 78 2d 3e 69 6e 29 3b 0a 0a 20 20   *)ctx->in);..  
1a3f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a400 20 4e 6f 77 20 66 69 6c 6c 20 74 68 65 20 6e 65   Now fill the ne
1a410 78 74 20 62 6c 6f 63 6b 20 77 69 74 68 20 35 36  xt block with 56
1a420 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 20 20   bytes */.      
1a430 20 20 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74            memset
1a440 28 63 74 78 2d 3e 69 6e 2c 20 30 2c 20 35 36 29  (ctx->in, 0, 56)
1a450 3b 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65  ;.        } else
1a460 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
1a470 20 20 20 2f 2a 20 50 61 64 20 62 6c 6f 63 6b 20     /* Pad block 
1a480 74 6f 20 35 36 20 62 79 74 65 73 20 2a 2f 0a 20  to 56 bytes */. 
1a490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d                 m
1a4a0 65 6d 73 65 74 28 70 2c 20 30 2c 20 63 6f 75 6e  emset(p, 0, coun
1a4b0 74 2d 38 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  t-8);.        }.
1a4c0 20 20 20 20 20 20 20 20 62 79 74 65 52 65 76 65          byteReve
1a4d0 72 73 65 28 63 74 78 2d 3e 69 6e 2c 20 31 34 29  rse(ctx->in, 14)
1a4e0 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 70  ;..        /* Ap
1a4f0 70 65 6e 64 20 6c 65 6e 67 74 68 20 69 6e 20 62  pend length in b
1a500 69 74 73 20 61 6e 64 20 74 72 61 6e 73 66 6f 72  its and transfor
1a510 6d 20 2a 2f 0a 20 20 20 20 20 20 20 20 28 28 75  m */.        ((u
1a520 69 6e 74 33 32 20 2a 29 63 74 78 2d 3e 69 6e 29  int32 *)ctx->in)
1a530 5b 20 31 34 20 5d 20 3d 20 63 74 78 2d 3e 62 69  [ 14 ] = ctx->bi
1a540 74 73 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20 28  ts[0];.        (
1a550 28 75 69 6e 74 33 32 20 2a 29 63 74 78 2d 3e 69  (uint32 *)ctx->i
1a560 6e 29 5b 20 31 35 20 5d 20 3d 20 63 74 78 2d 3e  n)[ 15 ] = ctx->
1a570 62 69 74 73 5b 31 5d 3b 0a 0a 20 20 20 20 20 20  bits[1];..      
1a580 20 20 4d 44 35 54 72 61 6e 73 66 6f 72 6d 28 63    MD5Transform(c
1a590 74 78 2d 3e 62 75 66 2c 20 28 75 69 6e 74 33 32  tx->buf, (uint32
1a5a0 20 2a 29 63 74 78 2d 3e 69 6e 29 3b 0a 20 20 20   *)ctx->in);.   
1a5b0 20 20 20 20 20 62 79 74 65 52 65 76 65 72 73 65       byteReverse
1a5c0 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  ((unsigned char 
1a5d0 2a 29 63 74 78 2d 3e 62 75 66 2c 20 34 29 3b 0a  *)ctx->buf, 4);.
1a5e0 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 64          memcpy(d
1a5f0 69 67 65 73 74 2c 20 63 74 78 2d 3e 62 75 66 2c  igest, ctx->buf,
1a600 20 31 36 29 3b 0a 20 20 20 20 20 20 20 20 6d 65   16);.        me
1a610 6d 73 65 74 28 63 74 78 2c 20 30 2c 20 73 69 7a  mset(ctx, 0, siz
1a620 65 6f 66 28 63 74 78 29 29 3b 20 20 20 20 2f 2a  eof(ctx));    /*
1a630 20 49 6e 20 63 61 73 65 20 69 74 20 69 73 20 73   In case it is s
1a640 65 6e 73 69 74 69 76 65 20 2a 2f 0a 7d 0a 0a 2f  ensitive */.}../
1a650 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 31  *.** Convert a 1
1a660 32 38 2d 62 69 74 20 4d 44 35 20 64 69 67 65 73  28-bit MD5 diges
1a670 74 20 69 6e 74 6f 20 61 20 33 32 2d 64 69 67 69  t into a 32-digi
1a680 74 20 62 61 73 65 2d 31 36 20 6e 75 6d 62 65 72  t base-16 number
1a690 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1a6a0 20 4d 44 35 44 69 67 65 73 74 54 6f 42 61 73 65   MD5DigestToBase
1a6b0 31 36 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  16(unsigned char
1a6c0 20 2a 64 69 67 65 73 74 2c 20 63 68 61 72 20 2a   *digest, char *
1a6d0 7a 42 75 66 29 7b 0a 20 20 73 74 61 74 69 63 20  zBuf){.  static 
1a6e0 63 68 61 72 20 63 6f 6e 73 74 20 7a 45 6e 63 6f  char const zEnco
1a6f0 64 65 5b 5d 20 3d 20 22 30 31 32 33 34 35 36 37  de[] = "01234567
1a700 38 39 61 62 63 64 65 66 22 3b 0a 20 20 69 6e 74  89abcdef";.  int
1a710 20 69 2c 20 6a 3b 0a 0a 20 20 66 6f 72 28 6a 3d   i, j;..  for(j=
1a720 69 3d 30 3b 20 69 3c 31 36 3b 20 69 2b 2b 29 7b  i=0; i<16; i++){
1a730 0a 20 20 20 20 69 6e 74 20 61 20 3d 20 64 69 67  .    int a = dig
1a740 65 73 74 5b 69 5d 3b 0a 20 20 20 20 7a 42 75 66  est[i];.    zBuf
1a750 5b 6a 2b 2b 5d 20 3d 20 7a 45 6e 63 6f 64 65 5b  [j++] = zEncode[
1a760 28 61 3e 3e 34 29 26 30 78 66 5d 3b 0a 20 20 20  (a>>4)&0xf];.   
1a770 20 7a 42 75 66 5b 6a 2b 2b 5d 20 3d 20 7a 45 6e   zBuf[j++] = zEn
1a780 63 6f 64 65 5b 61 20 26 20 30 78 66 5d 3b 0a 20  code[a & 0xf];. 
1a790 20 7d 0a 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 30   }.  zBuf[j] = 0
1a7a0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76  ;.}.../*.** Conv
1a7b0 65 72 74 20 61 20 31 32 38 2d 62 69 74 20 4d 44  ert a 128-bit MD
1a7c0 35 20 64 69 67 65 73 74 20 69 6e 74 6f 20 73 65  5 digest into se
1a7d0 71 75 65 6e 63 79 20 6f 66 20 65 69 67 68 74 20  quency of eight 
1a7e0 35 2d 64 69 67 69 74 20 69 6e 74 65 67 65 72 73  5-digit integers
1a7f0 0a 2a 2a 20 65 61 63 68 20 72 65 70 72 65 73 65  .** each represe
1a800 6e 74 69 6e 67 20 31 36 20 62 69 74 73 20 6f 66  nting 16 bits of
1a810 20 74 68 65 20 64 69 67 65 73 74 20 61 6e 64 20   the digest and 
1a820 73 65 70 61 72 61 74 65 64 20 66 72 6f 6d 20 65  separated from e
1a830 61 63 68 0a 2a 2a 20 6f 74 68 65 72 20 62 79 20  ach.** other by 
1a840 61 20 22 2d 22 20 63 68 61 72 61 63 74 65 72 2e  a "-" character.
1a850 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1a860 4d 44 35 44 69 67 65 73 74 54 6f 42 61 73 65 31  MD5DigestToBase1
1a870 30 78 38 28 75 6e 73 69 67 6e 65 64 20 63 68 61  0x8(unsigned cha
1a880 72 20 64 69 67 65 73 74 5b 31 36 5d 2c 20 63 68  r digest[16], ch
1a890 61 72 20 7a 44 69 67 65 73 74 5b 35 30 5d 29 7b  ar zDigest[50]){
1a8a0 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 75  .  int i, j;.  u
1a8b0 6e 73 69 67 6e 65 64 20 69 6e 74 20 78 3b 0a 20  nsigned int x;. 
1a8c0 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 31 36   for(i=j=0; i<16
1a8d0 3b 20 69 2b 3d 32 29 7b 0a 20 20 20 20 78 20 3d  ; i+=2){.    x =
1a8e0 20 64 69 67 65 73 74 5b 69 5d 2a 32 35 36 20 2b   digest[i]*256 +
1a8f0 20 64 69 67 65 73 74 5b 69 2b 31 5d 3b 0a 20 20   digest[i+1];.  
1a900 20 20 69 66 28 20 69 3e 30 20 29 20 7a 44 69 67    if( i>0 ) zDig
1a910 65 73 74 5b 6a 2b 2b 5d 20 3d 20 27 2d 27 3b 0a  est[j++] = '-';.
1a920 20 20 20 20 73 70 72 69 6e 74 66 28 26 7a 44 69      sprintf(&zDi
1a930 67 65 73 74 5b 6a 5d 2c 20 22 25 30 35 75 22 2c  gest[j], "%05u",
1a940 20 78 29 3b 0a 20 20 20 20 6a 20 2b 3d 20 35 3b   x);.    j += 5;
1a950 0a 20 20 7d 0a 20 20 7a 44 69 67 65 73 74 5b 6a  .  }.  zDigest[j
1a960 5d 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ] = 0;.}../*.** 
1a970 41 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20 66 6f  A TCL command fo
1a980 72 20 6d 64 35 2e 20 20 54 68 65 20 61 72 67 75  r md5.  The argu
1a990 6d 65 6e 74 20 69 73 20 74 68 65 20 74 65 78 74  ment is the text
1a9a0 20 74 6f 20 62 65 20 68 61 73 68 65 64 2e 20 20   to be hashed.  
1a9b0 54 68 65 0a 2a 2a 20 52 65 73 75 6c 74 20 69 73  The.** Result is
1a9c0 20 74 68 65 20 68 61 73 68 20 69 6e 20 62 61 73   the hash in bas
1a9d0 65 36 34 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63  e64.  .*/.static
1a9e0 20 69 6e 74 20 6d 64 35 5f 63 6d 64 28 76 6f 69   int md5_cmd(voi
1a9f0 64 2a 63 64 2c 20 54 63 6c 5f 49 6e 74 65 72 70  d*cd, Tcl_Interp
1aa00 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 61 72   *interp, int ar
1aa10 67 63 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  gc, const char *
1aa20 2a 61 72 67 76 29 7b 0a 20 20 4d 44 35 43 6f 6e  *argv){.  MD5Con
1aa30 74 65 78 74 20 63 74 78 3b 0a 20 20 75 6e 73 69  text ctx;.  unsi
1aa40 67 6e 65 64 20 63 68 61 72 20 64 69 67 65 73 74  gned char digest
1aa50 5b 31 36 5d 3b 0a 20 20 63 68 61 72 20 7a 42 75  [16];.  char zBu
1aa60 66 5b 35 30 5d 3b 0a 20 20 76 6f 69 64 20 28 2a  f[50];.  void (*
1aa70 63 6f 6e 76 65 72 74 65 72 29 28 75 6e 73 69 67  converter)(unsig
1aa80 6e 65 64 20 63 68 61 72 2a 2c 20 63 68 61 72 2a  ned char*, char*
1aa90 29 3b 0a 0a 20 20 69 66 28 20 61 72 67 63 21 3d  );..  if( argc!=
1aaa0 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  2 ){.    Tcl_App
1aab0 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
1aac0 2c 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20  ,"wrong # args: 
1aad0 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61  should be \"", a
1aae0 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20  rgv[0], .       
1aaf0 20 22 20 54 45 58 54 5c 22 22 2c 20 30 29 3b 0a   " TEXT\"", 0);.
1ab00 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
1ab10 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 4d 44 35 49  RROR;.  }.  MD5I
1ab20 6e 69 74 28 26 63 74 78 29 3b 0a 20 20 4d 44 35  nit(&ctx);.  MD5
1ab30 55 70 64 61 74 65 28 26 63 74 78 2c 20 28 75 6e  Update(&ctx, (un
1ab40 73 69 67 6e 65 64 20 63 68 61 72 2a 29 61 72 67  signed char*)arg
1ab50 76 5b 31 5d 2c 20 28 75 6e 73 69 67 6e 65 64 29  v[1], (unsigned)
1ab60 73 74 72 6c 65 6e 28 61 72 67 76 5b 31 5d 29 29  strlen(argv[1]))
1ab70 3b 0a 20 20 4d 44 35 46 69 6e 61 6c 28 64 69 67  ;.  MD5Final(dig
1ab80 65 73 74 2c 20 26 63 74 78 29 3b 0a 20 20 63 6f  est, &ctx);.  co
1ab90 6e 76 65 72 74 65 72 20 3d 20 28 76 6f 69 64 28  nverter = (void(
1aba0 2a 29 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  *)(unsigned char
1abb0 2a 2c 63 68 61 72 2a 29 29 63 64 3b 0a 20 20 63  *,char*))cd;.  c
1abc0 6f 6e 76 65 72 74 65 72 28 64 69 67 65 73 74 2c  onverter(digest,
1abd0 20 7a 42 75 66 29 3b 0a 20 20 54 63 6c 5f 41 70   zBuf);.  Tcl_Ap
1abe0 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
1abf0 70 2c 20 7a 42 75 66 2c 20 28 63 68 61 72 2a 29  p, zBuf, (char*)
1ac00 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  0);.  return TCL
1ac10 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20  _OK;.}../*.** A 
1ac20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 74  TCL command to t
1ac30 61 6b 65 20 74 68 65 20 6d 64 35 20 68 61 73 68  ake the md5 hash
1ac40 20 6f 66 20 61 20 66 69 6c 65 2e 20 20 54 68 65   of a file.  The
1ac50 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65   argument is the
1ac60 0a 2a 2a 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  .** name of the 
1ac70 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
1ac80 69 6e 74 20 6d 64 35 66 69 6c 65 5f 63 6d 64 28  int md5file_cmd(
1ac90 76 6f 69 64 2a 63 64 2c 20 54 63 6c 5f 49 6e 74  void*cd, Tcl_Int
1aca0 65 72 70 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20  erp*interp, int 
1acb0 61 72 67 63 2c 20 63 6f 6e 73 74 20 63 68 61 72  argc, const char
1acc0 20 2a 2a 61 72 67 76 29 7b 0a 20 20 46 49 4c 45   **argv){.  FILE
1acd0 20 2a 69 6e 3b 0a 20 20 4d 44 35 43 6f 6e 74 65   *in;.  MD5Conte
1ace0 78 74 20 63 74 78 3b 0a 20 20 76 6f 69 64 20 28  xt ctx;.  void (
1acf0 2a 63 6f 6e 76 65 72 74 65 72 29 28 75 6e 73 69  *converter)(unsi
1ad00 67 6e 65 64 20 63 68 61 72 2a 2c 20 63 68 61 72  gned char*, char
1ad10 2a 29 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  *);.  unsigned c
1ad20 68 61 72 20 64 69 67 65 73 74 5b 31 36 5d 3b 0a  har digest[16];.
1ad30 20 20 63 68 61 72 20 7a 42 75 66 5b 31 30 32 34    char zBuf[1024
1ad40 30 5d 3b 0a 0a 20 20 69 66 28 20 61 72 67 63 21  0];..  if( argc!
1ad50 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =2 ){.    Tcl_Ap
1ad60 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
1ad70 70 2c 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  p,"wrong # args:
1ad80 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
1ad90 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20  argv[0], .      
1ada0 20 20 22 20 46 49 4c 45 4e 41 4d 45 5c 22 22 2c    " FILENAME\"",
1adb0 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
1adc0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
1add0 20 69 6e 20 3d 20 66 6f 70 65 6e 28 61 72 67 76   in = fopen(argv
1ade0 5b 31 5d 2c 22 72 62 22 29 3b 0a 20 20 69 66 28  [1],"rb");.  if(
1adf0 20 69 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 54 63   in==0 ){.    Tc
1ae00 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
1ae10 6e 74 65 72 70 2c 22 75 6e 61 62 6c 65 20 74 6f  nterp,"unable to
1ae20 20 6f 70 65 6e 20 66 69 6c 65 20 5c 22 22 2c 20   open file \"", 
1ae30 61 72 67 76 5b 31 5d 2c 20 0a 20 20 20 20 20 20  argv[1], .      
1ae40 20 20 20 22 5c 22 20 66 6f 72 20 72 65 61 64 69     "\" for readi
1ae50 6e 67 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  ng", 0);.    ret
1ae60 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1ae70 20 7d 0a 20 20 4d 44 35 49 6e 69 74 28 26 63 74   }.  MD5Init(&ct
1ae80 78 29 3b 0a 20 20 66 6f 72 28 3b 3b 29 7b 0a 20  x);.  for(;;){. 
1ae90 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 6e 20     int n;.    n 
1aea0 3d 20 66 72 65 61 64 28 7a 42 75 66 2c 20 31 2c  = fread(zBuf, 1,
1aeb0 20 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c 20 69   sizeof(zBuf), i
1aec0 6e 29 3b 0a 20 20 20 20 69 66 28 20 6e 3c 3d 30  n);.    if( n<=0
1aed0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 4d 44   ) break;.    MD
1aee0 35 55 70 64 61 74 65 28 26 63 74 78 2c 20 28 75  5Update(&ctx, (u
1aef0 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 7a 42  nsigned char*)zB
1af00 75 66 2c 20 28 75 6e 73 69 67 6e 65 64 29 6e 29  uf, (unsigned)n)
1af10 3b 0a 20 20 7d 0a 20 20 66 63 6c 6f 73 65 28 69  ;.  }.  fclose(i
1af20 6e 29 3b 0a 20 20 4d 44 35 46 69 6e 61 6c 28 64  n);.  MD5Final(d
1af30 69 67 65 73 74 2c 20 26 63 74 78 29 3b 0a 20 20  igest, &ctx);.  
1af40 63 6f 6e 76 65 72 74 65 72 20 3d 20 28 76 6f 69  converter = (voi
1af50 64 28 2a 29 28 75 6e 73 69 67 6e 65 64 20 63 68  d(*)(unsigned ch
1af60 61 72 2a 2c 63 68 61 72 2a 29 29 63 64 3b 0a 20  ar*,char*))cd;. 
1af70 20 63 6f 6e 76 65 72 74 65 72 28 64 69 67 65 73   converter(diges
1af80 74 2c 20 7a 42 75 66 29 3b 0a 20 20 54 63 6c 5f  t, zBuf);.  Tcl_
1af90 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
1afa0 65 72 70 2c 20 7a 42 75 66 2c 20 28 63 68 61 72  erp, zBuf, (char
1afb0 2a 29 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  *)0);.  return T
1afc0 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
1afd0 52 65 67 69 73 74 65 72 20 74 68 65 20 66 6f 75  Register the fou
1afe0 72 20 6e 65 77 20 54 43 4c 20 63 6f 6d 6d 61 6e  r new TCL comman
1aff0 64 73 20 66 6f 72 20 67 65 6e 65 72 61 74 69 6e  ds for generatin
1b000 67 20 4d 44 35 20 63 68 65 63 6b 73 75 6d 73 0a  g MD5 checksums.
1b010 2a 2a 20 77 69 74 68 20 74 68 65 20 54 43 4c 20  ** with the TCL 
1b020 69 6e 74 65 72 70 72 65 74 65 72 2e 0a 2a 2f 0a  interpreter..*/.
1b030 69 6e 74 20 4d 64 35 5f 49 6e 69 74 28 54 63 6c  int Md5_Init(Tcl
1b040 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29  _Interp *interp)
1b050 7b 0a 20 20 54 63 6c 5f 43 72 65 61 74 65 43 6f  {.  Tcl_CreateCo
1b060 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 6d  mmand(interp, "m
1b070 64 35 22 2c 20 28 54 63 6c 5f 43 6d 64 50 72 6f  d5", (Tcl_CmdPro
1b080 63 2a 29 6d 64 35 5f 63 6d 64 2c 0a 20 20 20 20  c*)md5_cmd,.    
1b090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b0a0 4d 44 35 44 69 67 65 73 74 54 6f 42 61 73 65 31  MD5DigestToBase1
1b0b0 36 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 43 72 65  6, 0);.  Tcl_Cre
1b0c0 61 74 65 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72  ateCommand(inter
1b0d0 70 2c 20 22 6d 64 35 2d 31 30 78 38 22 2c 20 28  p, "md5-10x8", (
1b0e0 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 6d 64 35  Tcl_CmdProc*)md5
1b0f0 5f 63 6d 64 2c 0a 20 20 20 20 20 20 20 20 20 20  _cmd,.          
1b100 20 20 20 20 20 20 20 20 20 20 4d 44 35 44 69 67            MD5Dig
1b110 65 73 74 54 6f 42 61 73 65 31 30 78 38 2c 20 30  estToBase10x8, 0
1b120 29 3b 0a 20 20 54 63 6c 5f 43 72 65 61 74 65 43  );.  Tcl_CreateC
1b130 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22  ommand(interp, "
1b140 6d 64 35 66 69 6c 65 22 2c 20 28 54 63 6c 5f 43  md5file", (Tcl_C
1b150 6d 64 50 72 6f 63 2a 29 6d 64 35 66 69 6c 65 5f  mdProc*)md5file_
1b160 63 6d 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20  cmd,.           
1b170 20 20 20 20 20 20 20 20 20 4d 44 35 44 69 67 65           MD5Dige
1b180 73 74 54 6f 42 61 73 65 31 36 2c 20 30 29 3b 0a  stToBase16, 0);.
1b190 20 20 54 63 6c 5f 43 72 65 61 74 65 43 6f 6d 6d    Tcl_CreateComm
1b1a0 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 6d 64 35  and(interp, "md5
1b1b0 66 69 6c 65 2d 31 30 78 38 22 2c 20 28 54 63 6c  file-10x8", (Tcl
1b1c0 5f 43 6d 64 50 72 6f 63 2a 29 6d 64 35 66 69 6c  _CmdProc*)md5fil
1b1d0 65 5f 63 6d 64 2c 0a 20 20 20 20 20 20 20 20 20  e_cmd,.         
1b1e0 20 20 20 20 20 20 20 20 20 20 20 4d 44 35 44 69             MD5Di
1b1f0 67 65 73 74 54 6f 42 61 73 65 31 30 78 38 2c 20  gestToBase10x8, 
1b200 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  0);.  return TCL
1b210 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  _OK;.}.#endif /*
1b220 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
1b230 54 45 53 54 29 20 7c 7c 20 64 65 66 69 6e 65 64  TEST) || defined
1b240 28 53 51 4c 49 54 45 5f 54 43 4c 4d 44 35 29 20  (SQLITE_TCLMD5) 
1b250 2a 2f 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  */..#if defined(
1b260 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 2f 2a 0a  SQLITE_TEST)./*.
1b270 2a 2a 20 44 75 72 69 6e 67 20 74 65 73 74 69 6e  ** During testin
1b280 67 2c 20 74 68 65 20 73 70 65 63 69 61 6c 20 6d  g, the special m
1b290 64 35 73 75 6d 28 29 20 61 67 67 72 65 67 61 74  d5sum() aggregat
1b2a0 65 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 76  e function is av
1b2b0 61 69 6c 61 62 6c 65 2e 0a 2a 2a 20 69 6e 73 69  ailable..** insi
1b2c0 64 65 20 53 51 4c 69 74 65 2e 20 20 54 68 65 20  de SQLite.  The 
1b2d0 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e  following routin
1b2e0 65 73 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 61  es implement tha
1b2f0 74 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  t function..*/.s
1b300 74 61 74 69 63 20 76 6f 69 64 20 6d 64 35 73 74  tatic void md5st
1b310 65 70 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  ep(sqlite3_conte
1b320 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 69 6e 74  xt *context, int
1b330 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76   argc, sqlite3_v
1b340 61 6c 75 65 20 2a 2a 61 72 67 76 29 7b 0a 20 20  alue **argv){.  
1b350 4d 44 35 43 6f 6e 74 65 78 74 20 2a 70 3b 0a 20  MD5Context *p;. 
1b360 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 61 72   int i;.  if( ar
1b370 67 63 3c 31 20 29 20 72 65 74 75 72 6e 3b 0a 20  gc<1 ) return;. 
1b380 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 61 67 67   p = sqlite3_agg
1b390 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 63  regate_context(c
1b3a0 6f 6e 74 65 78 74 2c 20 73 69 7a 65 6f 66 28 2a  ontext, sizeof(*
1b3b0 70 29 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  p));.  if( p==0 
1b3c0 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
1b3d0 21 70 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20  !p->isInit ){.  
1b3e0 20 20 4d 44 35 49 6e 69 74 28 70 29 3b 0a 20 20    MD5Init(p);.  
1b3f0 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61  }.  for(i=0; i<a
1b400 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63  rgc; i++){.    c
1b410 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 61 74 61  onst char *zData
1b420 20 3d 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65   = (char*)sqlite
1b430 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
1b440 76 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28 20 7a  v[i]);.    if( z
1b450 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 4d 44  Data ){.      MD
1b460 35 55 70 64 61 74 65 28 70 2c 20 28 75 6e 73 69  5Update(p, (unsi
1b470 67 6e 65 64 20 63 68 61 72 2a 29 7a 44 61 74 61  gned char*)zData
1b480 2c 20 73 74 72 6c 65 6e 28 7a 44 61 74 61 29 29  , strlen(zData))
1b490 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74  ;.    }.  }.}.st
1b4a0 61 74 69 63 20 76 6f 69 64 20 6d 64 35 66 69 6e  atic void md5fin
1b4b0 61 6c 69 7a 65 28 73 71 6c 69 74 65 33 5f 63 6f  alize(sqlite3_co
1b4c0 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 29 7b  ntext *context){
1b4d0 0a 20 20 4d 44 35 43 6f 6e 74 65 78 74 20 2a 70  .  MD5Context *p
1b4e0 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
1b4f0 72 20 64 69 67 65 73 74 5b 31 36 5d 3b 0a 20 20  r digest[16];.  
1b500 63 68 61 72 20 7a 42 75 66 5b 33 33 5d 3b 0a 20  char zBuf[33];. 
1b510 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 61 67 67   p = sqlite3_agg
1b520 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 63  regate_context(c
1b530 6f 6e 74 65 78 74 2c 20 73 69 7a 65 6f 66 28 2a  ontext, sizeof(*
1b540 70 29 29 3b 0a 20 20 4d 44 35 46 69 6e 61 6c 28  p));.  MD5Final(
1b550 64 69 67 65 73 74 2c 70 29 3b 0a 20 20 4d 44 35  digest,p);.  MD5
1b560 44 69 67 65 73 74 54 6f 42 61 73 65 31 36 28 64  DigestToBase16(d
1b570 69 67 65 73 74 2c 20 7a 42 75 66 29 3b 0a 20 20  igest, zBuf);.  
1b580 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74  sqlite3_result_t
1b590 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 7a 42 75  ext(context, zBu
1b5a0 66 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52  f, -1, SQLITE_TR
1b5b0 41 4e 53 49 45 4e 54 29 3b 0a 7d 0a 69 6e 74 20  ANSIENT);.}.int 
1b5c0 4d 64 35 5f 52 65 67 69 73 74 65 72 28 73 71 6c  Md5_Register(sql
1b5d0 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74  ite3 *db){.  int
1b5e0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72   rc = sqlite3_cr
1b5f0 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62  eate_function(db
1b600 2c 20 22 6d 64 35 73 75 6d 22 2c 20 2d 31 2c 20  , "md5sum", -1, 
1b610 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20  SQLITE_UTF8, 0, 
1b620 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  0, .            
1b630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b640 20 20 20 20 20 6d 64 35 73 74 65 70 2c 20 6d 64       md5step, md
1b650 35 66 69 6e 61 6c 69 7a 65 29 3b 0a 20 20 73 71  5finalize);.  sq
1b660 6c 69 74 65 33 5f 6f 76 65 72 6c 6f 61 64 5f 66  lite3_overload_f
1b670 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 6d 64 35  unction(db, "md5
1b680 73 75 6d 22 2c 20 2d 31 29 3b 20 20 2f 2a 20 54  sum", -1);  /* T
1b690 6f 20 65 78 65 72 63 69 73 65 20 74 68 69 73 20  o exercise this 
1b6a0 41 50 49 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  API */.  return 
1b6b0 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  rc;.}.#endif /* 
1b6c0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
1b6d0 45 53 54 29 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20  EST) */.../*.** 
1b6e0 49 66 20 74 68 65 20 6d 61 63 72 6f 20 54 43 4c  If the macro TCL
1b6f0 53 48 20 69 73 20 6f 6e 65 2c 20 74 68 65 6e 20  SH is one, then 
1b700 70 75 74 20 69 6e 20 63 6f 64 65 20 74 68 69 73  put in code this
1b710 20 66 6f 72 20 74 68 65 0a 2a 2a 20 22 6d 61 69   for the.** "mai
1b720 6e 22 20 72 6f 75 74 69 6e 65 20 74 68 61 74 20  n" routine that 
1b730 77 69 6c 6c 20 69 6e 69 74 69 61 6c 69 7a 65 20  will initialize 
1b740 54 63 6c 20 61 6e 64 20 74 61 6b 65 20 69 6e 70  Tcl and take inp
1b750 75 74 20 66 72 6f 6d 0a 2a 2a 20 73 74 61 6e 64  ut from.** stand
1b760 61 72 64 20 69 6e 70 75 74 2c 20 6f 72 20 69 66  ard input, or if
1b770 20 61 20 66 69 6c 65 20 69 73 20 6e 61 6d 65 64   a file is named
1b780 20 6f 6e 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20   on the command 
1b790 6c 69 6e 65 0a 2a 2a 20 74 68 65 20 54 43 4c 20  line.** the TCL 
1b7a0 69 6e 74 65 72 70 72 65 74 65 72 20 72 65 61 64  interpreter read
1b7b0 73 20 61 6e 64 20 65 76 61 6c 75 61 74 65 73 20  s and evaluates 
1b7c0 74 68 61 74 20 66 69 6c 65 2e 0a 2a 2f 0a 23 69  that file..*/.#i
1b7d0 66 20 54 43 4c 53 48 3d 3d 31 0a 73 74 61 74 69  f TCLSH==1.stati
1b7e0 63 20 63 68 61 72 20 7a 4d 61 69 6e 6c 6f 6f 70  c char zMainloop
1b7f0 5b 5d 20 3d 0a 20 20 22 73 65 74 20 6c 69 6e 65  [] =.  "set line
1b800 20 7b 7d 5c 6e 22 0a 20 20 22 77 68 69 6c 65 20   {}\n".  "while 
1b810 7b 21 5b 65 6f 66 20 73 74 64 69 6e 5d 7d 20 7b  {![eof stdin]} {
1b820 5c 6e 22 0a 20 20 20 20 22 69 66 20 7b 24 6c 69  \n".    "if {$li
1b830 6e 65 21 3d 5c 22 5c 22 7d 20 7b 5c 6e 22 0a 20  ne!=\"\"} {\n". 
1b840 20 20 20 20 20 22 70 75 74 73 20 2d 6e 6f 6e 65       "puts -none
1b850 77 6c 69 6e 65 20 5c 22 3e 20 5c 22 5c 6e 22 0a  wline \"> \"\n".
1b860 20 20 20 20 22 7d 20 65 6c 73 65 20 7b 5c 6e 22      "} else {\n"
1b870 0a 20 20 20 20 20 20 22 70 75 74 73 20 2d 6e 6f  .      "puts -no
1b880 6e 65 77 6c 69 6e 65 20 5c 22 25 20 5c 22 5c 6e  newline \"% \"\n
1b890 22 0a 20 20 20 20 22 7d 5c 6e 22 0a 20 20 20 20  ".    "}\n".    
1b8a0 22 66 6c 75 73 68 20 73 74 64 6f 75 74 5c 6e 22  "flush stdout\n"
1b8b0 0a 20 20 20 20 22 61 70 70 65 6e 64 20 6c 69 6e  .    "append lin
1b8c0 65 20 5b 67 65 74 73 20 73 74 64 69 6e 5d 5c 6e  e [gets stdin]\n
1b8d0 22 0a 20 20 20 20 22 69 66 20 7b 5b 69 6e 66 6f  ".    "if {[info
1b8e0 20 63 6f 6d 70 6c 65 74 65 20 24 6c 69 6e 65 5d   complete $line]
1b8f0 7d 20 7b 5c 6e 22 0a 20 20 20 20 20 20 22 69 66  } {\n".      "if
1b900 20 7b 5b 63 61 74 63 68 20 7b 75 70 6c 65 76 65   {[catch {upleve
1b910 6c 20 23 30 20 24 6c 69 6e 65 7d 20 72 65 73 75  l #0 $line} resu
1b920 6c 74 5d 7d 20 7b 5c 6e 22 0a 20 20 20 20 20 20  lt]} {\n".      
1b930 20 20 22 70 75 74 73 20 73 74 64 65 72 72 20 5c    "puts stderr \
1b940 22 45 72 72 6f 72 3a 20 24 72 65 73 75 6c 74 5c  "Error: $result\
1b950 22 5c 6e 22 0a 20 20 20 20 20 20 22 7d 20 65 6c  "\n".      "} el
1b960 73 65 69 66 20 7b 24 72 65 73 75 6c 74 21 3d 5c  seif {$result!=\
1b970 22 5c 22 7d 20 7b 5c 6e 22 0a 20 20 20 20 20 20  "\"} {\n".      
1b980 20 20 22 70 75 74 73 20 24 72 65 73 75 6c 74 5c    "puts $result\
1b990 6e 22 0a 20 20 20 20 20 20 22 7d 5c 6e 22 0a 20  n".      "}\n". 
1b9a0 20 20 20 20 20 22 73 65 74 20 6c 69 6e 65 20 7b       "set line {
1b9b0 7d 5c 6e 22 0a 20 20 20 20 22 7d 20 65 6c 73 65  }\n".    "} else
1b9c0 20 7b 5c 6e 22 0a 20 20 20 20 20 20 22 61 70 70   {\n".      "app
1b9d0 65 6e 64 20 6c 69 6e 65 20 5c 5c 6e 5c 6e 22 0a  end line \\n\n".
1b9e0 20 20 20 20 22 7d 5c 6e 22 0a 20 20 22 7d 5c 6e      "}\n".  "}\n
1b9f0 22 0a 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 54  ".;.#endif.#if T
1ba00 43 4c 53 48 3d 3d 32 0a 73 74 61 74 69 63 20 63  CLSH==2.static c
1ba10 68 61 72 20 7a 4d 61 69 6e 6c 6f 6f 70 5b 5d 20  har zMainloop[] 
1ba20 3d 20 0a 23 69 6e 63 6c 75 64 65 20 22 73 70 61  = .#include "spa
1ba30 63 65 61 6e 61 6c 5f 74 63 6c 2e 68 22 0a 3b 0a  ceanal_tcl.h".;.
1ba40 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53  #endif..#ifdef S
1ba50 51 4c 49 54 45 5f 54 45 53 54 0a 73 74 61 74 69  QLITE_TEST.stati
1ba60 63 20 76 6f 69 64 20 69 6e 69 74 5f 61 6c 6c 28  c void init_all(
1ba70 54 63 6c 5f 49 6e 74 65 72 70 20 2a 29 3b 0a 73  Tcl_Interp *);.s
1ba80 74 61 74 69 63 20 69 6e 74 20 69 6e 69 74 5f 61  tatic int init_a
1ba90 6c 6c 5f 63 6d 64 28 0a 20 20 43 6c 69 65 6e 74  ll_cmd(.  Client
1baa0 44 61 74 61 20 63 64 2c 0a 20 20 54 63 6c 5f 49  Data cd,.  Tcl_I
1bab0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
1bac0 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
1bad0 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
1bae0 5b 5d 0a 29 7b 0a 0a 20 20 54 63 6c 5f 49 6e 74  [].){..  Tcl_Int
1baf0 65 72 70 20 2a 73 6c 61 76 65 3b 0a 20 20 69 66  erp *slave;.  if
1bb00 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20  ( objc!=2 ){.   
1bb10 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
1bb20 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
1bb30 76 2c 20 22 53 4c 41 56 45 22 29 3b 0a 20 20 20  v, "SLAVE");.   
1bb40 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1bb50 52 3b 0a 20 20 7d 0a 0a 20 20 73 6c 61 76 65 20  R;.  }..  slave 
1bb60 3d 20 54 63 6c 5f 47 65 74 53 6c 61 76 65 28 69  = Tcl_GetSlave(i
1bb70 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
1bb80 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 29 3b 0a  ring(objv[1]));.
1bb90 20 20 69 66 28 20 21 73 6c 61 76 65 20 29 7b 0a    if( !slave ){.
1bba0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
1bbb0 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 6e 69  RROR;.  }..  ini
1bbc0 74 5f 61 6c 6c 28 73 6c 61 76 65 29 3b 0a 20 20  t_all(slave);.  
1bbd0 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
1bbe0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43  .#endif../*.** C
1bbf0 6f 6e 66 69 67 75 72 65 20 74 68 65 20 69 6e 74  onfigure the int
1bc00 65 72 70 72 65 74 65 72 20 70 61 73 73 65 64 20  erpreter passed 
1bc10 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67  as the first arg
1bc20 75 6d 65 6e 74 20 74 6f 20 68 61 76 65 20 61 63  ument to have ac
1bc30 63 65 73 73 0a 2a 2a 20 74 6f 20 74 68 65 20 63  cess.** to the c
1bc40 6f 6d 6d 61 6e 64 73 20 61 6e 64 20 6c 69 6e 6b  ommands and link
1bc50 65 64 20 76 61 72 69 61 62 6c 65 73 20 74 68 61  ed variables tha
1bc60 74 20 6d 61 6b 65 20 75 70 3a 0a 2a 2a 0a 2a 2a  t make up:.**.**
1bc70 20 20 20 2a 20 74 68 65 20 5b 73 71 6c 69 74 65     * the [sqlite
1bc80 33 5d 20 65 78 74 65 6e 73 69 6f 6e 20 69 74 73  3] extension its
1bc90 65 6c 66 2c 20 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  elf, .**.**   * 
1bca0 49 66 20 53 51 4c 49 54 45 5f 54 43 4c 4d 44 35  If SQLITE_TCLMD5
1bcb0 20 6f 72 20 53 51 4c 49 54 45 5f 54 45 53 54 20   or SQLITE_TEST 
1bcc0 69 73 20 64 65 66 69 6e 65 64 2c 20 74 68 65 20  is defined, the 
1bcd0 4d 64 35 20 63 6f 6d 6d 61 6e 64 73 2c 20 61 6e  Md5 commands, an
1bce0 64 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 53  d.**.**   * If S
1bcf0 51 4c 49 54 45 5f 54 45 53 54 20 69 73 20 73 65  QLITE_TEST is se
1bd00 74 2c 20 74 68 65 20 76 61 72 69 6f 75 73 20 74  t, the various t
1bd10 65 73 74 20 69 6e 74 65 72 66 61 63 65 73 20 75  est interfaces u
1bd20 73 65 64 20 62 79 20 74 68 65 20 54 63 6c 0a 2a  sed by the Tcl.*
1bd30 2a 20 20 20 20 20 74 65 73 74 20 73 75 69 74 65  *     test suite
1bd40 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1bd50 20 69 6e 69 74 5f 61 6c 6c 28 54 63 6c 5f 49 6e   init_all(Tcl_In
1bd60 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 0a 20  terp *interp){. 
1bd70 20 53 71 6c 69 74 65 33 5f 49 6e 69 74 28 69 6e   Sqlite3_Init(in
1bd80 74 65 72 70 29 3b 0a 0a 23 69 66 20 64 65 66 69  terp);..#if defi
1bd90 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29  ned(SQLITE_TEST)
1bda0 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49   || defined(SQLI
1bdb0 54 45 5f 54 43 4c 4d 44 35 29 0a 20 20 4d 64 35  TE_TCLMD5).  Md5
1bdc0 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 23  _Init(interp);.#
1bdd0 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51  endif..#ifdef SQ
1bde0 4c 49 54 45 5f 54 45 53 54 0a 20 20 7b 0a 20 20  LITE_TEST.  {.  
1bdf0 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c    extern int Sql
1be00 69 74 65 63 6f 6e 66 69 67 5f 49 6e 69 74 28 54  iteconfig_Init(T
1be10 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20  cl_Interp*);.   
1be20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69   extern int Sqli
1be30 74 65 74 65 73 74 31 5f 49 6e 69 74 28 54 63 6c  tetest1_Init(Tcl
1be40 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65  _Interp*);.    e
1be50 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65  xtern int Sqlite
1be60 74 65 73 74 32 5f 49 6e 69 74 28 54 63 6c 5f 49  test2_Init(Tcl_I
1be70 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74  nterp*);.    ext
1be80 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65  ern int Sqlitete
1be90 73 74 33 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74  st3_Init(Tcl_Int
1bea0 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72  erp*);.    exter
1beb0 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74  n int Sqlitetest
1bec0 34 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  4_Init(Tcl_Inter
1bed0 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20  p*);.    extern 
1bee0 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 35 5f  int Sqlitetest5_
1bef0 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a  Init(Tcl_Interp*
1bf00 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e  );.    extern in
1bf10 74 20 53 71 6c 69 74 65 74 65 73 74 36 5f 49 6e  t Sqlitetest6_In
1bf20 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b  it(Tcl_Interp*);
1bf30 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20  .    extern int 
1bf40 53 71 6c 69 74 65 74 65 73 74 37 5f 49 6e 69 74  Sqlitetest7_Init
1bf50 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20  (Tcl_Interp*);. 
1bf60 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71     extern int Sq
1bf70 6c 69 74 65 74 65 73 74 38 5f 49 6e 69 74 28 54  litetest8_Init(T
1bf80 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20  cl_Interp*);.   
1bf90 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69   extern int Sqli
1bfa0 74 65 74 65 73 74 39 5f 49 6e 69 74 28 54 63 6c  tetest9_Init(Tcl
1bfb0 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65  _Interp*);.    e
1bfc0 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65  xtern int Sqlite
1bfd0 74 65 73 74 61 73 79 6e 63 5f 49 6e 69 74 28 54  testasync_Init(T
1bfe0 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20  cl_Interp*);.   
1bff0 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69   extern int Sqli
1c000 74 65 74 65 73 74 5f 61 75 74 6f 65 78 74 5f 49  tetest_autoext_I
1c010 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29  nit(Tcl_Interp*)
1c020 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74  ;.    extern int
1c030 20 53 71 6c 69 74 65 74 65 73 74 5f 64 65 6d 6f   Sqlitetest_demo
1c040 76 66 73 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74  vfs_Init(Tcl_Int
1c050 65 72 70 20 2a 29 3b 0a 20 20 20 20 65 78 74 65  erp *);.    exte
1c060 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73  rn int Sqlitetes
1c070 74 5f 66 75 6e 63 5f 49 6e 69 74 28 54 63 6c 5f  t_func_Init(Tcl_
1c080 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78  Interp*);.    ex
1c090 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74  tern int Sqlitet
1c0a0 65 73 74 5f 68 65 78 69 6f 5f 49 6e 69 74 28 54  est_hexio_Init(T
1c0b0 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20  cl_Interp*);.   
1c0c0 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69   extern int Sqli
1c0d0 74 65 74 65 73 74 5f 69 6e 69 74 5f 49 6e 69 74  tetest_init_Init
1c0e0 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20  (Tcl_Interp*);. 
1c0f0 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71     extern int Sq
1c100 6c 69 74 65 74 65 73 74 5f 6d 61 6c 6c 6f 63 5f  litetest_malloc_
1c110 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a  Init(Tcl_Interp*
1c120 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e  );.    extern in
1c130 74 20 53 71 6c 69 74 65 74 65 73 74 5f 6d 75 74  t Sqlitetest_mut
1c140 65 78 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  ex_Init(Tcl_Inte
1c150 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e  rp*);.    extern
1c160 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 73   int Sqlitetests
1c170 63 68 65 6d 61 5f 49 6e 69 74 28 54 63 6c 5f 49  chema_Init(Tcl_I
1c180 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74  nterp*);.    ext
1c190 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65  ern int Sqlitete
1c1a0 73 74 73 73 65 5f 49 6e 69 74 28 54 63 6c 5f 49  stsse_Init(Tcl_I
1c1b0 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74  nterp*);.    ext
1c1c0 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65  ern int Sqlitete
1c1d0 73 74 74 63 6c 76 61 72 5f 49 6e 69 74 28 54 63  sttclvar_Init(Tc
1c1e0 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20  l_Interp*);.    
1c1f0 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74  extern int Sqlit
1c200 65 74 65 73 74 54 68 72 65 61 64 5f 49 6e 69 74  etestThread_Init
1c210 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20  (Tcl_Interp*);. 
1c220 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71     extern int Sq
1c230 6c 69 74 65 74 65 73 74 4f 6e 65 66 69 6c 65 5f  litetestOnefile_
1c240 49 6e 69 74 28 29 3b 0a 20 20 20 20 65 78 74 65  Init();.    exte
1c250 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73  rn int Sqlitetes
1c260 74 4f 73 69 6e 73 74 5f 49 6e 69 74 28 54 63 6c  tOsinst_Init(Tcl
1c270 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65  _Interp*);.    e
1c280 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65  xtern int Sqlite
1c290 74 65 73 74 62 61 63 6b 75 70 5f 49 6e 69 74 28  testbackup_Init(
1c2a0 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20  Tcl_Interp*);.  
1c2b0 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c    extern int Sql
1c2c0 69 74 65 74 65 73 74 69 6e 74 61 72 72 61 79 5f  itetestintarray_
1c2d0 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a  Init(Tcl_Interp*
1c2e0 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e  );.    extern in
1c2f0 74 20 53 71 6c 69 74 65 74 65 73 74 76 66 73 5f  t Sqlitetestvfs_
1c300 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20  Init(Tcl_Interp 
1c310 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69  *);.    extern i
1c320 6e 74 20 53 71 6c 69 74 65 74 65 73 74 53 74 61  nt SqlitetestSta
1c330 74 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  t_Init(Tcl_Inter
1c340 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20  p*);.    extern 
1c350 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 72 74  int Sqlitetestrt
1c360 72 65 65 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74  ree_Init(Tcl_Int
1c370 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72  erp*);.    exter
1c380 6e 20 69 6e 74 20 53 71 6c 69 74 65 71 75 6f 74  n int Sqlitequot
1c390 61 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  a_Init(Tcl_Inter
1c3a0 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20  p*);.    extern 
1c3b0 69 6e 74 20 53 71 6c 69 74 65 6d 75 6c 74 69 70  int Sqlitemultip
1c3c0 6c 65 78 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74  lex_Init(Tcl_Int
1c3d0 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72  erp*);.    exter
1c3e0 6e 20 69 6e 74 20 53 71 6c 69 74 65 53 75 70 65  n int SqliteSupe
1c3f0 72 6c 6f 63 6b 5f 49 6e 69 74 28 54 63 6c 5f 49  rlock_Init(Tcl_I
1c400 6e 74 65 72 70 2a 29 3b 0a 23 69 66 64 65 66 20  nterp*);.#ifdef 
1c410 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45  SQLITE_ENABLE_SE
1c420 53 53 49 4f 4e 0a 20 20 20 20 65 78 74 65 72 6e  SSION.    extern
1c430 20 69 6e 74 20 54 65 73 74 53 65 73 73 69 6f 6e   int TestSession
1c440 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
1c450 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64  *);.#endif..#ifd
1c460 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
1c470 5f 5a 49 50 56 46 53 0a 20 20 20 20 65 78 74 65  _ZIPVFS.    exte
1c480 72 6e 20 69 6e 74 20 5a 69 70 76 66 73 5f 49 6e  rn int Zipvfs_In
1c490 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b  it(Tcl_Interp*);
1c4a0 0a 20 20 20 20 5a 69 70 76 66 73 5f 49 6e 69 74  .    Zipvfs_Init
1c4b0 28 69 6e 74 65 72 70 29 3b 0a 23 65 6e 64 69 66  (interp);.#endif
1c4c0 0a 0a 20 20 20 20 53 71 6c 69 74 65 63 6f 6e 66  ..    Sqliteconf
1c4d0 69 67 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b  ig_Init(interp);
1c4e0 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 31  .    Sqlitetest1
1c4f0 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20  _Init(interp);. 
1c500 20 20 20 53 71 6c 69 74 65 74 65 73 74 32 5f 49     Sqlitetest2_I
1c510 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20  nit(interp);.   
1c520 20 53 71 6c 69 74 65 74 65 73 74 33 5f 49 6e 69   Sqlitetest3_Ini
1c530 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53  t(interp);.    S
1c540 71 6c 69 74 65 74 65 73 74 34 5f 49 6e 69 74 28  qlitetest4_Init(
1c550 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c  interp);.    Sql
1c560 69 74 65 74 65 73 74 35 5f 49 6e 69 74 28 69 6e  itetest5_Init(in
1c570 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74  terp);.    Sqlit
1c580 65 74 65 73 74 36 5f 49 6e 69 74 28 69 6e 74 65  etest6_Init(inte
1c590 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74  rp);.    Sqlitet
1c5a0 65 73 74 37 5f 49 6e 69 74 28 69 6e 74 65 72 70  est7_Init(interp
1c5b0 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73  );.    Sqlitetes
1c5c0 74 38 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b  t8_Init(interp);
1c5d0 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 39  .    Sqlitetest9
1c5e0 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20  _Init(interp);. 
1c5f0 20 20 20 53 71 6c 69 74 65 74 65 73 74 61 73 79     Sqlitetestasy
1c600 6e 63 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b  nc_Init(interp);
1c610 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 5f  .    Sqlitetest_
1c620 61 75 74 6f 65 78 74 5f 49 6e 69 74 28 69 6e 74  autoext_Init(int
1c630 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65  erp);.    Sqlite
1c640 74 65 73 74 5f 64 65 6d 6f 76 66 73 5f 49 6e 69  test_demovfs_Ini
1c650 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53  t(interp);.    S
1c660 71 6c 69 74 65 74 65 73 74 5f 66 75 6e 63 5f 49  qlitetest_func_I
1c670 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20  nit(interp);.   
1c680 20 53 71 6c 69 74 65 74 65 73 74 5f 68 65 78 69   Sqlitetest_hexi
1c690 6f 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a  o_Init(interp);.
1c6a0 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 5f 69      Sqlitetest_i
1c6b0 6e 69 74 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  nit_Init(interp)
1c6c0 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74  ;.    Sqlitetest
1c6d0 5f 6d 61 6c 6c 6f 63 5f 49 6e 69 74 28 69 6e 74  _malloc_Init(int
1c6e0 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65  erp);.    Sqlite
1c6f0 74 65 73 74 5f 6d 75 74 65 78 5f 49 6e 69 74 28  test_mutex_Init(
1c700 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c  interp);.    Sql
1c710 69 74 65 74 65 73 74 73 63 68 65 6d 61 5f 49 6e  itetestschema_In
1c720 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  it(interp);.    
1c730 53 71 6c 69 74 65 74 65 73 74 74 63 6c 76 61 72  Sqlitetesttclvar
1c740 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20  _Init(interp);. 
1c750 20 20 20 53 71 6c 69 74 65 74 65 73 74 54 68 72     SqlitetestThr
1c760 65 61 64 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  ead_Init(interp)
1c770 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74  ;.    Sqlitetest
1c780 4f 6e 65 66 69 6c 65 5f 49 6e 69 74 28 69 6e 74  Onefile_Init(int
1c790 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65  erp);.    Sqlite
1c7a0 74 65 73 74 4f 73 69 6e 73 74 5f 49 6e 69 74 28  testOsinst_Init(
1c7b0 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c  interp);.    Sql
1c7c0 69 74 65 74 65 73 74 62 61 63 6b 75 70 5f 49 6e  itetestbackup_In
1c7d0 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  it(interp);.    
1c7e0 53 71 6c 69 74 65 74 65 73 74 69 6e 74 61 72 72  Sqlitetestintarr
1c7f0 61 79 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b  ay_Init(interp);
1c800 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 76  .    Sqlitetestv
1c810 66 73 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b  fs_Init(interp);
1c820 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 53  .    SqlitetestS
1c830 74 61 74 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  tat_Init(interp)
1c840 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74  ;.    Sqlitetest
1c850 72 74 72 65 65 5f 49 6e 69 74 28 69 6e 74 65 72  rtree_Init(inter
1c860 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 71 75  p);.    Sqlitequ
1c870 6f 74 61 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  ota_Init(interp)
1c880 3b 0a 20 20 20 20 53 71 6c 69 74 65 6d 75 6c 74  ;.    Sqlitemult
1c890 69 70 6c 65 78 5f 49 6e 69 74 28 69 6e 74 65 72  iplex_Init(inter
1c8a0 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 53 75  p);.    SqliteSu
1c8b0 70 65 72 6c 6f 63 6b 5f 49 6e 69 74 28 69 6e 74  perlock_Init(int
1c8c0 65 72 70 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  erp);.#ifdef SQL
1c8d0 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45 53 53 49  ITE_ENABLE_SESSI
1c8e0 4f 4e 0a 20 20 20 20 54 65 73 74 53 65 73 73 69  ON.    TestSessi
1c8f0 6f 6e 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b  on_Init(interp);
1c900 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 54 63 6c  .#endif..    Tcl
1c910 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e  _CreateObjComman
1c920 64 28 69 6e 74 65 72 70 2c 22 6c 6f 61 64 5f 74  d(interp,"load_t
1c930 65 73 74 66 69 78 74 75 72 65 5f 65 78 74 65 6e  estfixture_exten
1c940 73 69 6f 6e 73 22 2c 69 6e 69 74 5f 61 6c 6c 5f  sions",init_all_
1c950 63 6d 64 2c 30 2c 30 29 3b 0a 0a 23 69 66 64 65  cmd,0,0);..#ifde
1c960 66 20 53 51 4c 49 54 45 5f 53 53 45 0a 20 20 20  f SQLITE_SSE.   
1c970 20 53 71 6c 69 74 65 74 65 73 74 73 73 65 5f 49   Sqlitetestsse_I
1c980 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 23 65 6e  nit(interp);.#en
1c990 64 69 66 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d  dif.  }.#endif.}
1c9a0 0a 0a 23 64 65 66 69 6e 65 20 54 43 4c 53 48 5f  ..#define TCLSH_
1c9b0 4d 41 49 4e 20 6d 61 69 6e 20 20 20 2f 2a 20 4e  MAIN main   /* N
1c9c0 65 65 64 65 64 20 74 6f 20 66 61 6b 65 20 6f 75  eeded to fake ou
1c9d0 74 20 6d 6b 74 63 6c 61 70 70 20 2a 2f 0a 69 6e  t mktclapp */.in
1c9e0 74 20 54 43 4c 53 48 5f 4d 41 49 4e 28 69 6e 74  t TCLSH_MAIN(int
1c9f0 20 61 72 67 63 2c 20 63 68 61 72 20 2a 2a 61 72   argc, char **ar
1ca00 67 76 29 7b 0a 20 20 54 63 6c 5f 49 6e 74 65 72  gv){.  Tcl_Inter
1ca10 70 20 2a 69 6e 74 65 72 70 3b 0a 20 20 0a 20 20  p *interp;.  .  
1ca20 2f 2a 20 43 61 6c 6c 20 73 71 6c 69 74 65 33 5f  /* Call sqlite3_
1ca30 73 68 75 74 64 6f 77 6e 28 29 20 6f 6e 63 65 20  shutdown() once 
1ca40 62 65 66 6f 72 65 20 64 6f 69 6e 67 20 61 6e 79  before doing any
1ca50 74 68 69 6e 67 20 65 6c 73 65 2e 20 54 68 69 73  thing else. This
1ca60 20 69 73 20 74 6f 0a 20 20 2a 2a 20 74 65 73 74   is to.  ** test
1ca70 20 74 68 61 74 20 73 71 6c 69 74 65 33 5f 73 68   that sqlite3_sh
1ca80 75 74 64 6f 77 6e 28 29 20 63 61 6e 20 62 65 20  utdown() can be 
1ca90 73 61 66 65 6c 79 20 63 61 6c 6c 65 64 20 62 79  safely called by
1caa0 20 61 20 70 72 6f 63 65 73 73 20 62 65 66 6f 72   a process befor
1cab0 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 69  e.  ** sqlite3_i
1cac0 6e 69 74 69 61 6c 69 7a 65 28 29 20 69 73 2e 20  nitialize() is. 
1cad0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 68 75  */.  sqlite3_shu
1cae0 74 64 6f 77 6e 28 29 3b 0a 0a 23 69 66 20 54 43  tdown();..#if TC
1caf0 4c 53 48 3d 3d 32 0a 20 20 73 71 6c 69 74 65 33  LSH==2.  sqlite3
1cb00 5f 63 6f 6e 66 69 67 28 53 51 4c 49 54 45 5f 43  _config(SQLITE_C
1cb10 4f 4e 46 49 47 5f 53 49 4e 47 4c 45 54 48 52 45  ONFIG_SINGLETHRE
1cb20 41 44 29 3b 0a 23 65 6e 64 69 66 0a 20 20 54 63  AD);.#endif.  Tc
1cb30 6c 5f 46 69 6e 64 45 78 65 63 75 74 61 62 6c 65  l_FindExecutable
1cb40 28 61 72 67 76 5b 30 5d 29 3b 0a 0a 20 20 69 6e  (argv[0]);..  in
1cb50 74 65 72 70 20 3d 20 54 63 6c 5f 43 72 65 61 74  terp = Tcl_Creat
1cb60 65 49 6e 74 65 72 70 28 29 3b 0a 20 20 69 6e 69  eInterp();.  ini
1cb70 74 5f 61 6c 6c 28 69 6e 74 65 72 70 29 3b 0a 20  t_all(interp);. 
1cb80 20 69 66 28 20 61 72 67 63 3e 3d 32 20 29 7b 0a   if( argc>=2 ){.
1cb90 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 63      int i;.    c
1cba0 68 61 72 20 7a 41 72 67 63 5b 33 32 5d 3b 0a 20  har zArgc[32];. 
1cbb0 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
1cbc0 6e 74 66 28 73 69 7a 65 6f 66 28 7a 41 72 67 63  ntf(sizeof(zArgc
1cbd0 29 2c 20 7a 41 72 67 63 2c 20 22 25 64 22 2c 20  ), zArgc, "%d", 
1cbe0 61 72 67 63 2d 28 33 2d 54 43 4c 53 48 29 29 3b  argc-(3-TCLSH));
1cbf0 0a 20 20 20 20 54 63 6c 5f 53 65 74 56 61 72 28  .    Tcl_SetVar(
1cc00 69 6e 74 65 72 70 2c 22 61 72 67 63 22 2c 20 7a  interp,"argc", z
1cc10 41 72 67 63 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c  Argc, TCL_GLOBAL
1cc20 5f 4f 4e 4c 59 29 3b 0a 20 20 20 20 54 63 6c 5f  _ONLY);.    Tcl_
1cc30 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c 22 61  SetVar(interp,"a
1cc40 72 67 76 30 22 2c 61 72 67 76 5b 31 5d 2c 54 43  rgv0",argv[1],TC
1cc50 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a  L_GLOBAL_ONLY);.
1cc60 20 20 20 20 54 63 6c 5f 53 65 74 56 61 72 28 69      Tcl_SetVar(i
1cc70 6e 74 65 72 70 2c 22 61 72 67 76 22 2c 20 22 22  nterp,"argv", ""
1cc80 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c  , TCL_GLOBAL_ONL
1cc90 59 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 33 2d  Y);.    for(i=3-
1cca0 54 43 4c 53 48 3b 20 69 3c 61 72 67 63 3b 20 69  TCLSH; i<argc; i
1ccb0 2b 2b 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 53  ++){.      Tcl_S
1ccc0 65 74 56 61 72 28 69 6e 74 65 72 70 2c 20 22 61  etVar(interp, "a
1ccd0 72 67 76 22 2c 20 61 72 67 76 5b 69 5d 2c 0a 20  rgv", argv[i],. 
1cce0 20 20 20 20 20 20 20 20 20 54 43 4c 5f 47 4c 4f           TCL_GLO
1ccf0 42 41 4c 5f 4f 4e 4c 59 20 7c 20 54 43 4c 5f 4c  BAL_ONLY | TCL_L
1cd00 49 53 54 5f 45 4c 45 4d 45 4e 54 20 7c 20 54 43  IST_ELEMENT | TC
1cd10 4c 5f 41 50 50 45 4e 44 5f 56 41 4c 55 45 29 3b  L_APPEND_VALUE);
1cd20 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 54  .    }.    if( T
1cd30 43 4c 53 48 3d 3d 31 20 26 26 20 54 63 6c 5f 45  CLSH==1 && Tcl_E
1cd40 76 61 6c 46 69 6c 65 28 69 6e 74 65 72 70 2c 20  valFile(interp, 
1cd50 61 72 67 76 5b 31 5d 29 21 3d 54 43 4c 5f 4f 4b  argv[1])!=TCL_OK
1cd60 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   ){.      const 
1cd70 63 68 61 72 20 2a 7a 49 6e 66 6f 20 3d 20 54 63  char *zInfo = Tc
1cd80 6c 5f 47 65 74 56 61 72 28 69 6e 74 65 72 70 2c  l_GetVar(interp,
1cd90 20 22 65 72 72 6f 72 49 6e 66 6f 22 2c 20 54 43   "errorInfo", TC
1cda0 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a  L_GLOBAL_ONLY);.
1cdb0 20 20 20 20 20 20 69 66 28 20 7a 49 6e 66 6f 3d        if( zInfo=
1cdc0 3d 30 20 29 20 7a 49 6e 66 6f 20 3d 20 54 63 6c  =0 ) zInfo = Tcl
1cdd0 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74  _GetStringResult
1cde0 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 20 20  (interp);.      
1cdf0 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22  fprintf(stderr,"
1ce00 25 73 3a 20 25 73 5c 6e 22 2c 20 2a 61 72 67 76  %s: %s\n", *argv
1ce10 2c 20 7a 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  , zInfo);.      
1ce20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
1ce30 20 20 7d 0a 20 20 69 66 28 20 54 43 4c 53 48 3d    }.  if( TCLSH=
1ce40 3d 32 20 7c 7c 20 61 72 67 63 3c 3d 31 20 29 7b  =2 || argc<=1 ){
1ce50 0a 20 20 20 20 54 63 6c 5f 47 6c 6f 62 61 6c 45  .    Tcl_GlobalE
1ce60 76 61 6c 28 69 6e 74 65 72 70 2c 20 7a 4d 61 69  val(interp, zMai
1ce70 6e 6c 6f 6f 70 29 3b 0a 20 20 7d 0a 20 20 72 65  nloop);.  }.  re
1ce80 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66  turn 0;.}.#endif
1ce90 20 2f 2a 20 54 43 4c 53 48 20 2a 2f 0a            /* TCLSH */.