/ Hex Artifact Content
Login

Artifact 78713534e628ea92b032bfa20ea8a1afc6cdb124:


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 64  ] = {"count", "d
159c0 65 70 74 68 22 2c 20 22 68 6f 6f 6b 22 2c 20 22  epth", "hook", "
159d0 6e 65 77 22 2c 20 22 6f 6c 64 22 2c 20 30 7d 3b  new", "old", 0};
159e0 0a 20 20 20 20 65 6e 75 6d 20 44 62 50 72 65 75  .    enum DbPreu
159f0 70 64 61 74 65 53 75 62 43 6d 64 20 7b 0a 20 20  pdateSubCmd {.  
15a00 20 20 20 20 50 52 45 5f 43 4f 55 4e 54 2c 20 50      PRE_COUNT, P
15a10 52 45 5f 44 45 50 54 48 2c 20 50 52 45 5f 48 4f  RE_DEPTH, PRE_HO
15a20 4f 4b 2c 20 50 52 45 5f 4e 45 57 2c 20 50 52 45  OK, PRE_NEW, PRE
15a30 5f 4f 4c 44 0a 20 20 20 20 7d 3b 0a 20 20 20 20  _OLD.    };.    
15a40 69 6e 74 20 69 53 75 62 3b 0a 0a 20 20 20 20 69  int iSub;..    i
15a50 66 28 20 6f 62 6a 63 3c 33 20 29 7b 0a 20 20 20  f( objc<3 ){.   
15a60 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
15a70 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
15a80 62 6a 76 2c 20 22 53 55 42 2d 43 4f 4d 4d 41 4e  bjv, "SUB-COMMAN
15a90 44 20 3f 41 52 47 53 3f 22 29 3b 0a 20 20 20 20  D ?ARGS?");.    
15aa0 7d 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65  }.    if( Tcl_Ge
15ab0 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e  tIndexFromObj(in
15ac0 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 61  terp, objv[2], a
15ad0 7a 53 75 62 2c 20 22 73 75 62 2d 63 6f 6d 6d 61  zSub, "sub-comma
15ae0 6e 64 22 2c 20 30 2c 20 26 69 53 75 62 29 20 29  nd", 0, &iSub) )
15af0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  {.      return T
15b00 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
15b10 0a 20 20 20 20 73 77 69 74 63 68 28 20 28 65 6e  .    switch( (en
15b20 75 6d 20 44 62 50 72 65 75 70 64 61 74 65 53 75  um DbPreupdateSu
15b30 62 43 6d 64 29 69 53 75 62 20 29 7b 0a 20 20 20  bCmd)iSub ){.   
15b40 20 20 20 63 61 73 65 20 50 52 45 5f 43 4f 55 4e     case PRE_COUN
15b50 54 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  T: {.        int
15b60 20 6e 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 5f   nCol = sqlite3_
15b70 70 72 65 75 70 64 61 74 65 5f 63 6f 75 6e 74 28  preupdate_count(
15b80 70 44 62 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20  pDb->db);.      
15b90 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
15ba0 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
15bb0 65 77 49 6e 74 4f 62 6a 28 6e 43 6f 6c 29 29 3b  ewIntObj(nCol));
15bc0 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
15bd0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 63        }..      c
15be0 61 73 65 20 50 52 45 5f 48 4f 4f 4b 3a 20 7b 0a  ase PRE_HOOK: {.
15bf0 20 20 20 20 20 20 20 20 69 66 28 20 6f 62 6a 63          if( objc
15c00 3e 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >4 ){.          
15c10 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
15c20 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76  (interp, 2, objv
15c30 2c 20 22 68 6f 6f 6b 20 3f 53 43 52 49 50 54 3f  , "hook ?SCRIPT?
15c40 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  ");.          re
15c50 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
15c60 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
15c70 20 20 44 62 48 6f 6f 6b 43 6d 64 28 69 6e 74 65    DbHookCmd(inte
15c80 72 70 2c 20 70 44 62 2c 20 28 6f 62 6a 63 3d 3d  rp, pDb, (objc==
15c90 34 20 3f 20 6f 62 6a 76 5b 33 5d 20 3a 20 30 29  4 ? objv[3] : 0)
15ca0 2c 20 26 70 44 62 2d 3e 70 50 72 65 55 70 64 61  , &pDb->pPreUpda
15cb0 74 65 48 6f 6f 6b 29 3b 0a 20 20 20 20 20 20 20  teHook);.       
15cc0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
15cd0 0a 20 20 20 20 20 20 63 61 73 65 20 50 52 45 5f  .      case PRE_
15ce0 44 45 50 54 48 3a 20 7b 0a 20 20 20 20 20 20 20  DEPTH: {.       
15cf0 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 74 3b 0a   Tcl_Obj *pRet;.
15d00 20 20 20 20 20 20 20 20 69 66 28 20 6f 62 6a 63          if( objc
15d10 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=3 ){.         
15d20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
15d30 73 28 69 6e 74 65 72 70 2c 20 33 2c 20 6f 62 6a  s(interp, 3, obj
15d40 76 2c 20 22 22 29 3b 0a 20 20 20 20 20 20 20 20  v, "");.        
15d50 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
15d60 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  OR;.        }.  
15d70 20 20 20 20 20 20 70 52 65 74 20 3d 20 54 63 6c        pRet = Tcl
15d80 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74  _NewIntObj(sqlit
15d90 65 33 5f 70 72 65 75 70 64 61 74 65 5f 64 65 70  e3_preupdate_dep
15da0 74 68 28 70 44 62 2d 3e 64 62 29 29 3b 0a 20 20  th(pDb->db));.  
15db0 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a        Tcl_SetObj
15dc0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70  Result(interp, p
15dd0 52 65 74 29 3b 0a 20 20 20 20 20 20 20 20 62 72  Ret);.        br
15de0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  eak;.      }..  
15df0 20 20 20 20 63 61 73 65 20 50 52 45 5f 4e 45 57      case PRE_NEW
15e00 3a 0a 20 20 20 20 20 20 63 61 73 65 20 50 52 45  :.      case PRE
15e10 5f 4f 4c 44 3a 20 7b 0a 20 20 20 20 20 20 20 20  _OLD: {.        
15e20 69 6e 74 20 69 49 64 78 3b 0a 20 20 20 20 20 20  int iIdx;.      
15e30 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
15e40 2a 70 56 61 6c 75 65 3b 0a 20 20 20 20 20 20 20  *pValue;.       
15e50 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a   if( objc!=4 ){.
15e60 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 57 72            Tcl_Wr
15e70 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
15e80 70 2c 20 33 2c 20 6f 62 6a 76 2c 20 22 49 4e 44  p, 3, objv, "IND
15e90 45 58 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20  EX");.          
15ea0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
15eb0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
15ec0 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49      if( Tcl_GetI
15ed0 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
15ee0 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 69 49 64 78  , objv[3], &iIdx
15ef0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  ) ){.          r
15f00 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
15f10 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
15f20 20 20 20 20 69 66 28 20 69 53 75 62 3d 3d 50 52      if( iSub==PR
15f30 45 5f 4f 4c 44 20 29 7b 0a 20 20 20 20 20 20 20  E_OLD ){.       
15f40 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
15f50 70 72 65 75 70 64 61 74 65 5f 6f 6c 64 28 70 44  preupdate_old(pD
15f60 62 2d 3e 64 62 2c 20 69 49 64 78 2c 20 26 70 56  b->db, iIdx, &pV
15f70 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  alue);.        }
15f80 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
15f90 61 73 73 65 72 74 28 20 69 53 75 62 3d 3d 50 52  assert( iSub==PR
15fa0 45 5f 4e 45 57 20 29 3b 0a 20 20 20 20 20 20 20  E_NEW );.       
15fb0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
15fc0 70 72 65 75 70 64 61 74 65 5f 6e 65 77 28 70 44  preupdate_new(pD
15fd0 62 2d 3e 64 62 2c 20 69 49 64 78 2c 20 26 70 56  b->db, iIdx, &pV
15fe0 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  alue);.        }
15ff0 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ..        if( rc
16000 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
16010 20 20 20 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a           Tcl_Obj
16020 20 2a 70 4f 62 6a 3b 0a 20 20 20 20 20 20 20 20   *pObj;.        
16030 20 20 70 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65 77    pObj = Tcl_New
16040 53 74 72 69 6e 67 4f 62 6a 28 28 63 68 61 72 2a  StringObj((char*
16050 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
16060 65 78 74 28 70 56 61 6c 75 65 29 2c 20 2d 31 29  ext(pValue), -1)
16070 3b 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f  ;.          Tcl_
16080 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
16090 65 72 70 2c 20 70 4f 62 6a 29 3b 0a 20 20 20 20  erp, pObj);.    
160a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
160b0 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
160c0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 73 71  esult(interp, sq
160d0 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62  lite3_errmsg(pDb
160e0 2d 3e 64 62 29 2c 20 30 29 3b 0a 20 20 20 20 20  ->db), 0);.     
160f0 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
16100 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d  ERROR;.        }
16110 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
16120 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
16130 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 24 64 62    /*.  **    $db
16140 20 77 61 6c 5f 68 6f 6f 6b 20 3f 73 63 72 69 70   wal_hook ?scrip
16150 74 3f 0a 20 20 2a 2a 20 20 20 20 24 64 62 20 75  t?.  **    $db u
16160 70 64 61 74 65 5f 68 6f 6f 6b 20 3f 73 63 72 69  pdate_hook ?scri
16170 70 74 3f 0a 20 20 2a 2a 20 20 20 20 24 64 62 20  pt?.  **    $db 
16180 72 6f 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 20 3f 73  rollback_hook ?s
16190 63 72 69 70 74 3f 0a 20 20 2a 2f 0a 20 20 63 61  cript?.  */.  ca
161a0 73 65 20 44 42 5f 57 41 4c 5f 48 4f 4f 4b 3a 20  se DB_WAL_HOOK: 
161b0 0a 20 20 63 61 73 65 20 44 42 5f 55 50 44 41 54  .  case DB_UPDAT
161c0 45 5f 48 4f 4f 4b 3a 20 0a 20 20 63 61 73 65 20  E_HOOK: .  case 
161d0 44 42 5f 52 4f 4c 4c 42 41 43 4b 5f 48 4f 4f 4b  DB_ROLLBACK_HOOK
161e0 3a 20 7b 0a 20 20 20 20 2f 2a 20 73 65 74 20 70  : {.    /* set p
161f0 70 48 6f 6f 6b 20 74 6f 20 70 6f 69 6e 74 20 61  pHook to point a
16200 74 20 70 55 70 64 61 74 65 48 6f 6f 6b 20 6f 72  t pUpdateHook or
16210 20 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 2c 20   pRollbackHook, 
16220 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 0a 20 20  depending on .  
16230 20 20 2a 2a 20 77 68 65 74 68 65 72 20 5b 24 64    ** whether [$d
16240 62 20 75 70 64 61 74 65 5f 68 6f 6f 6b 5d 20 6f  b update_hook] o
16250 72 20 5b 24 64 62 20 72 6f 6c 6c 62 61 63 6b 5f  r [$db rollback_
16260 68 6f 6f 6b 5d 20 77 61 73 20 69 6e 76 6f 6b 65  hook] was invoke
16270 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 54 63  d..    */.    Tc
16280 6c 5f 4f 62 6a 20 2a 2a 70 70 48 6f 6f 6b 3b 20  l_Obj **ppHook; 
16290 0a 20 20 20 20 69 66 28 20 63 68 6f 69 63 65 3d  .    if( choice=
162a0 3d 44 42 5f 57 41 4c 5f 48 4f 4f 4b 20 29 20 70  =DB_WAL_HOOK ) p
162b0 70 48 6f 6f 6b 20 3d 20 26 70 44 62 2d 3e 70 57  pHook = &pDb->pW
162c0 61 6c 48 6f 6f 6b 3b 0a 20 20 20 20 69 66 28 20  alHook;.    if( 
162d0 63 68 6f 69 63 65 3d 3d 44 42 5f 55 50 44 41 54  choice==DB_UPDAT
162e0 45 5f 48 4f 4f 4b 20 29 20 70 70 48 6f 6f 6b 20  E_HOOK ) ppHook 
162f0 3d 20 26 70 44 62 2d 3e 70 55 70 64 61 74 65 48  = &pDb->pUpdateH
16300 6f 6f 6b 3b 0a 20 20 20 20 69 66 28 20 63 68 6f  ook;.    if( cho
16310 69 63 65 3d 3d 44 42 5f 52 4f 4c 4c 42 41 43 4b  ice==DB_ROLLBACK
16320 5f 48 4f 4f 4b 20 29 20 70 70 48 6f 6f 6b 20 3d  _HOOK ) ppHook =
16330 20 26 70 44 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b   &pDb->pRollback
16340 48 6f 6f 6b 3b 0a 20 20 20 20 69 66 28 20 6f 62  Hook;.    if( ob
16350 6a 63 3e 33 20 29 7b 0a 20 20 20 20 20 20 20 54  jc>3 ){.       T
16360 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
16370 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c  interp, 2, objv,
16380 20 22 3f 53 43 52 49 50 54 3f 22 29 3b 0a 20 20   "?SCRIPT?");.  
16390 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
163a0 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20  ERROR;.    }..  
163b0 20 20 44 62 48 6f 6f 6b 43 6d 64 28 69 6e 74 65    DbHookCmd(inte
163c0 72 70 2c 20 70 44 62 2c 20 28 6f 62 6a 63 3d 3d  rp, pDb, (objc==
163d0 33 20 3f 20 6f 62 6a 76 5b 32 5d 20 3a 20 30 29  3 ? objv[2] : 0)
163e0 2c 20 70 70 48 6f 6f 6b 29 3b 0a 20 20 20 20 62  , ppHook);.    b
163f0 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  reak;.  }..  /* 
16400 20 20 20 24 64 62 20 76 65 72 73 69 6f 6e 0a 20     $db version. 
16410 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20   **.  ** Return 
16420 74 68 65 20 76 65 72 73 69 6f 6e 20 73 74 72 69  the version stri
16430 6e 67 20 66 6f 72 20 74 68 69 73 20 64 61 74 61  ng for this data
16440 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 63 61 73  base..  */.  cas
16450 65 20 44 42 5f 56 45 52 53 49 4f 4e 3a 20 7b 0a  e DB_VERSION: {.
16460 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c      Tcl_SetResul
16470 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20  t(interp, (char 
16480 2a 29 73 71 6c 69 74 65 33 5f 6c 69 62 76 65 72  *)sqlite3_libver
16490 73 69 6f 6e 28 29 2c 20 54 43 4c 5f 53 54 41 54  sion(), TCL_STAT
164a0 49 43 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a  IC);.    break;.
164b0 20 20 7d 0a 0a 0a 20 20 7d 20 2f 2a 20 45 6e 64    }...  } /* End
164c0 20 6f 66 20 74 68 65 20 53 57 49 54 43 48 20 73   of the SWITCH s
164d0 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 72 65  tatement */.  re
164e0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 20  turn rc;.}..#if 
164f0 53 51 4c 49 54 45 5f 54 43 4c 5f 4e 52 45 0a 2f  SQLITE_TCL_NRE./
16500 2a 0a 2a 2a 20 41 64 61 70 74 6f 72 20 74 68 61  *.** Adaptor tha
16510 74 20 70 72 6f 76 69 64 65 73 20 61 6e 20 6f 62  t provides an ob
16520 6a 43 6d 64 20 69 6e 74 65 72 66 61 63 65 20 74  jCmd interface t
16530 6f 20 74 68 65 20 4e 52 45 2d 65 6e 61 62 6c 65  o the NRE-enable
16540 64 0a 2a 2a 20 69 6e 74 65 72 66 61 63 65 20 69  d.** interface i
16550 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 0a 2a  mplementation..*
16560 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 44 62 4f  /.static int DbO
16570 62 6a 43 6d 64 41 64 61 70 74 6f 72 28 0a 20 20  bjCmdAdaptor(.  
16580 76 6f 69 64 20 2a 63 64 2c 0a 20 20 54 63 6c 5f  void *cd,.  Tcl_
16590 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
165a0 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
165b0 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 2a 6f 62 6a  l_Obj *const*obj
165c0 76 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 54 63  v.){.  return Tc
165d0 6c 5f 4e 52 43 61 6c 6c 4f 62 6a 50 72 6f 63 28  l_NRCallObjProc(
165e0 69 6e 74 65 72 70 2c 20 44 62 4f 62 6a 43 6d 64  interp, DbObjCmd
165f0 2c 20 63 64 2c 20 6f 62 6a 63 2c 20 6f 62 6a 76  , cd, objc, objv
16600 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  );.}.#endif /* S
16610 51 4c 49 54 45 5f 54 43 4c 5f 4e 52 45 20 2a 2f  QLITE_TCL_NRE */
16620 0a 0a 2f 2a 0a 2a 2a 20 20 20 73 71 6c 69 74 65  ../*.**   sqlite
16630 33 20 44 42 4e 41 4d 45 20 46 49 4c 45 4e 41 4d  3 DBNAME FILENAM
16640 45 20 3f 2d 76 66 73 20 56 46 53 4e 41 4d 45 3f  E ?-vfs VFSNAME?
16650 20 3f 2d 6b 65 79 20 4b 45 59 3f 20 3f 2d 72 65   ?-key KEY? ?-re
16660 61 64 6f 6e 6c 79 20 42 4f 4f 4c 45 41 4e 3f 0a  adonly BOOLEAN?.
16670 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
16680 20 20 20 20 20 20 20 20 20 20 20 20 20 3f 2d 63               ?-c
16690 72 65 61 74 65 20 42 4f 4f 4c 45 41 4e 3f 20 3f  reate BOOLEAN? ?
166a0 2d 6e 6f 6d 75 74 65 78 20 42 4f 4f 4c 45 41 4e  -nomutex BOOLEAN
166b0 3f 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ?.**.** This is 
166c0 74 68 65 20 6d 61 69 6e 20 54 63 6c 20 63 6f 6d  the main Tcl com
166d0 6d 61 6e 64 2e 20 20 57 68 65 6e 20 74 68 65 20  mand.  When the 
166e0 22 73 71 6c 69 74 65 22 20 54 63 6c 20 63 6f 6d  "sqlite" Tcl com
166f0 6d 61 6e 64 20 69 73 0a 2a 2a 20 69 6e 76 6f 6b  mand is.** invok
16700 65 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ed, this routine
16710 20 72 75 6e 73 20 74 6f 20 70 72 6f 63 65 73 73   runs to process
16720 20 74 68 61 74 20 63 6f 6d 6d 61 6e 64 2e 0a 2a   that command..*
16730 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 61  *.** The first a
16740 72 67 75 6d 65 6e 74 2c 20 44 42 4e 41 4d 45 2c  rgument, DBNAME,
16750 20 69 73 20 61 6e 20 61 72 62 69 74 72 61 72 79   is an arbitrary
16760 20 6e 61 6d 65 20 66 6f 72 20 61 20 6e 65 77 0a   name for a new.
16770 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  ** database conn
16780 65 63 74 69 6f 6e 2e 20 20 54 68 69 73 20 63 6f  ection.  This co
16790 6d 6d 61 6e 64 20 63 72 65 61 74 65 73 20 61 20  mmand creates a 
167a0 6e 65 77 20 63 6f 6d 6d 61 6e 64 20 6e 61 6d 65  new command name
167b0 64 0a 2a 2a 20 44 42 4e 41 4d 45 20 74 68 61 74  d.** DBNAME that
167c0 20 69 73 20 75 73 65 64 20 74 6f 20 63 6f 6e 74   is used to cont
167d0 72 6f 6c 20 74 68 61 74 20 63 6f 6e 6e 65 63 74  rol that connect
167e0 69 6f 6e 2e 20 20 54 68 65 20 64 61 74 61 62 61  ion.  The databa
167f0 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e  se.** connection
16800 20 69 73 20 64 65 6c 65 74 65 64 20 77 68 65 6e   is deleted when
16810 20 74 68 65 20 44 42 4e 41 4d 45 20 63 6f 6d 6d   the DBNAME comm
16820 61 6e 64 20 69 73 20 64 65 6c 65 74 65 64 2e 0a  and is deleted..
16830 2a 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64  **.** The second
16840 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65   argument is the
16850 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   name of the dat
16860 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  abase file..**.*
16870 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 44 62 4d  /.static int DbM
16880 61 69 6e 28 76 6f 69 64 20 2a 63 64 2c 20 54 63  ain(void *cd, Tc
16890 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
168a0 2c 20 69 6e 74 20 6f 62 6a 63 2c 54 63 6c 5f 4f  , int objc,Tcl_O
168b0 62 6a 20 2a 63 6f 6e 73 74 2a 6f 62 6a 76 29 7b  bj *const*objv){
168c0 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 3b 0a  .  SqliteDb *p;.
168d0 20 20 76 6f 69 64 20 2a 70 4b 65 79 20 3d 20 30    void *pKey = 0
168e0 3b 0a 20 20 69 6e 74 20 6e 4b 65 79 20 3d 20 30  ;.  int nKey = 0
168f0 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
16900 7a 41 72 67 3b 0a 20 20 63 68 61 72 20 2a 7a 45  zArg;.  char *zE
16910 72 72 4d 73 67 3b 0a 20 20 69 6e 74 20 69 3b 0a  rrMsg;.  int i;.
16920 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
16930 69 6c 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  ile;.  const cha
16940 72 20 2a 7a 56 66 73 20 3d 20 30 3b 0a 20 20 69  r *zVfs = 0;.  i
16950 6e 74 20 66 6c 61 67 73 3b 0a 20 20 54 63 6c 5f  nt flags;.  Tcl_
16960 44 53 74 72 69 6e 67 20 74 72 61 6e 73 6c 61 74  DString translat
16970 65 64 46 69 6c 65 6e 61 6d 65 3b 0a 0a 20 20 2f  edFilename;..  /
16980 2a 20 49 6e 20 6e 6f 72 6d 61 6c 20 75 73 65 2c  * In normal use,
16990 20 65 61 63 68 20 54 43 4c 20 69 6e 74 65 72 70   each TCL interp
169a0 72 65 74 65 72 20 72 75 6e 73 20 69 6e 20 61 20  reter runs in a 
169b0 73 69 6e 67 6c 65 20 74 68 72 65 61 64 2e 20 20  single thread.  
169c0 53 6f 0a 20 20 2a 2a 20 62 79 20 64 65 66 61 75  So.  ** by defau
169d0 6c 74 2c 20 77 65 20 63 61 6e 20 74 75 72 6e 20  lt, we can turn 
169e0 6f 66 20 6d 75 74 65 78 69 6e 67 20 6f 6e 20 53  of mutexing on S
169f0 51 4c 69 74 65 20 64 61 74 61 62 61 73 65 20 63  QLite database c
16a00 6f 6e 6e 65 63 74 69 6f 6e 73 2e 0a 20 20 2a 2a  onnections..  **
16a10 20 48 6f 77 65 76 65 72 2c 20 66 6f 72 20 74 65   However, for te
16a20 73 74 69 6e 67 20 70 75 72 70 6f 73 65 73 20 69  sting purposes i
16a30 74 20 69 73 20 75 73 65 66 75 6c 20 74 6f 20 68  t is useful to h
16a40 61 76 65 20 6d 75 74 65 78 65 73 20 74 75 72 6e  ave mutexes turn
16a50 65 64 0a 20 20 2a 2a 20 6f 6e 2e 20 20 53 6f 2c  ed.  ** on.  So,
16a60 20 62 79 20 64 65 66 61 75 6c 74 2c 20 6d 75 74   by default, mut
16a70 65 78 65 73 20 64 65 66 61 75 6c 74 20 6f 66 66  exes default off
16a80 2e 20 20 42 75 74 20 69 66 20 63 6f 6d 70 69 6c  .  But if compil
16a90 65 64 20 77 69 74 68 0a 20 20 2a 2a 20 53 51 4c  ed with.  ** SQL
16aa0 49 54 45 5f 54 43 4c 5f 44 45 46 41 55 4c 54 5f  ITE_TCL_DEFAULT_
16ab0 46 55 4c 4c 4d 55 54 45 58 20 74 68 65 6e 20 6d  FULLMUTEX then m
16ac0 75 74 65 78 65 73 20 64 65 66 61 75 6c 74 20 6f  utexes default o
16ad0 6e 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53  n..  */.#ifdef S
16ae0 51 4c 49 54 45 5f 54 43 4c 5f 44 45 46 41 55 4c  QLITE_TCL_DEFAUL
16af0 54 5f 46 55 4c 4c 4d 55 54 45 58 0a 20 20 66 6c  T_FULLMUTEX.  fl
16b00 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45  ags = SQLITE_OPE
16b10 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53 51  N_READWRITE | SQ
16b20 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
16b30 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46   | SQLITE_OPEN_F
16b40 55 4c 4c 4d 55 54 45 58 3b 0a 23 65 6c 73 65 0a  ULLMUTEX;.#else.
16b50 20 20 66 6c 61 67 73 20 3d 20 53 51 4c 49 54 45    flags = SQLITE
16b60 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20  _OPEN_READWRITE 
16b70 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  | SQLITE_OPEN_CR
16b80 45 41 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50  EATE | SQLITE_OP
16b90 45 4e 5f 4e 4f 4d 55 54 45 58 3b 0a 23 65 6e 64  EN_NOMUTEX;.#end
16ba0 69 66 0a 0a 20 20 69 66 28 20 6f 62 6a 63 3d 3d  if..  if( objc==
16bb0 32 20 29 7b 0a 20 20 20 20 7a 41 72 67 20 3d 20  2 ){.    zArg = 
16bc0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
16bd0 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 30 29  mObj(objv[1], 0)
16be0 3b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70  ;.    if( strcmp
16bf0 28 7a 41 72 67 2c 22 2d 76 65 72 73 69 6f 6e 22  (zArg,"-version"
16c00 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 54 63  )==0 ){.      Tc
16c10 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
16c20 6e 74 65 72 70 2c 73 71 6c 69 74 65 33 5f 76 65  nterp,sqlite3_ve
16c30 72 73 69 6f 6e 2c 30 29 3b 0a 20 20 20 20 20 20  rsion,0);.      
16c40 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20  return TCL_OK;. 
16c50 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 74 72     }.    if( str
16c60 63 6d 70 28 7a 41 72 67 2c 22 2d 68 61 73 2d 63  cmp(zArg,"-has-c
16c70 6f 64 65 63 22 29 3d 3d 30 20 29 7b 0a 23 69 66  odec")==0 ){.#if
16c80 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43  def SQLITE_HAS_C
16c90 4f 44 45 43 0a 20 20 20 20 20 20 54 63 6c 5f 41  ODEC.      Tcl_A
16ca0 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
16cb0 72 70 2c 22 31 22 2c 30 29 3b 0a 23 65 6c 73 65  rp,"1",0);.#else
16cc0 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  .      Tcl_Appen
16cd0 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22  dResult(interp,"
16ce0 30 22 2c 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20  0",0);.#endif.  
16cf0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f      return TCL_O
16d00 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66  K;.    }.  }.  f
16d10 6f 72 28 69 3d 33 3b 20 69 2b 31 3c 6f 62 6a 63  or(i=3; i+1<objc
16d20 3b 20 69 2b 3d 32 29 7b 0a 20 20 20 20 7a 41 72  ; i+=2){.    zAr
16d30 67 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  g = Tcl_GetStrin
16d40 67 28 6f 62 6a 76 5b 69 5d 29 3b 0a 20 20 20 20  g(objv[i]);.    
16d50 69 66 28 20 73 74 72 63 6d 70 28 7a 41 72 67 2c  if( strcmp(zArg,
16d60 22 2d 6b 65 79 22 29 3d 3d 30 20 29 7b 0a 20 20  "-key")==0 ){.  
16d70 20 20 20 20 70 4b 65 79 20 3d 20 54 63 6c 5f 47      pKey = Tcl_G
16d80 65 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d 4f  etByteArrayFromO
16d90 62 6a 28 6f 62 6a 76 5b 69 2b 31 5d 2c 20 26 6e  bj(objv[i+1], &n
16da0 4b 65 79 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  Key);.    }else 
16db0 69 66 28 20 73 74 72 63 6d 70 28 7a 41 72 67 2c  if( strcmp(zArg,
16dc0 20 22 2d 76 66 73 22 29 3d 3d 30 20 29 7b 0a 20   "-vfs")==0 ){. 
16dd0 20 20 20 20 20 7a 56 66 73 20 3d 20 54 63 6c 5f       zVfs = Tcl_
16de0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 69  GetString(objv[i
16df0 2b 31 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  +1]);.    }else 
16e00 69 66 28 20 73 74 72 63 6d 70 28 7a 41 72 67 2c  if( strcmp(zArg,
16e10 20 22 2d 72 65 61 64 6f 6e 6c 79 22 29 3d 3d 30   "-readonly")==0
16e20 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 62 3b   ){.      int b;
16e30 0a 20 20 20 20 20 20 69 66 28 20 54 63 6c 5f 47  .      if( Tcl_G
16e40 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a  etBooleanFromObj
16e50 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 69 2b  (interp, objv[i+
16e60 31 5d 2c 20 26 62 29 20 29 20 72 65 74 75 72 6e  1], &b) ) return
16e70 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
16e80 20 20 69 66 28 20 62 20 29 7b 0a 20 20 20 20 20    if( b ){.     
16e90 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 28 53 51     flags &= ~(SQ
16ea0 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
16eb0 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ITE|SQLITE_OPEN_
16ec0 43 52 45 41 54 45 29 3b 0a 20 20 20 20 20 20 20  CREATE);.       
16ed0 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45   flags |= SQLITE
16ee0 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a  _OPEN_READONLY;.
16ef0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
16f00 20 20 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 53       flags &= ~S
16f10 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
16f20 4e 4c 59 3b 0a 20 20 20 20 20 20 20 20 66 6c 61  NLY;.        fla
16f30 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45  gs |= SQLITE_OPE
16f40 4e 5f 52 45 41 44 57 52 49 54 45 3b 0a 20 20 20  N_READWRITE;.   
16f50 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69     }.    }else i
16f60 66 28 20 73 74 72 63 6d 70 28 7a 41 72 67 2c 20  f( strcmp(zArg, 
16f70 22 2d 63 72 65 61 74 65 22 29 3d 3d 30 20 29 7b  "-create")==0 ){
16f80 0a 20 20 20 20 20 20 69 6e 74 20 62 3b 0a 20 20  .      int b;.  
16f90 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 42      if( Tcl_GetB
16fa0 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e  ooleanFromObj(in
16fb0 74 65 72 70 2c 20 6f 62 6a 76 5b 69 2b 31 5d 2c  terp, objv[i+1],
16fc0 20 26 62 29 20 29 20 72 65 74 75 72 6e 20 54 43   &b) ) return TC
16fd0 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 69  L_ERROR;.      i
16fe0 66 28 20 62 20 26 26 20 28 66 6c 61 67 73 20 26  f( b && (flags &
16ff0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
17000 44 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a 20 20 20  DONLY)==0 ){.   
17010 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 53 51       flags |= SQ
17020 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
17030 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
17040 20 20 20 20 20 20 20 66 6c 61 67 73 20 26 3d 20         flags &= 
17050 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45  ~SQLITE_OPEN_CRE
17060 41 54 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ATE;.      }.   
17070 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
17080 70 28 7a 41 72 67 2c 20 22 2d 6e 6f 6d 75 74 65  p(zArg, "-nomute
17090 78 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  x")==0 ){.      
170a0 69 6e 74 20 62 3b 0a 20 20 20 20 20 20 69 66 28  int b;.      if(
170b0 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46   Tcl_GetBooleanF
170c0 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
170d0 62 6a 76 5b 69 2b 31 5d 2c 20 26 62 29 20 29 20  bjv[i+1], &b) ) 
170e0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
170f0 3b 0a 20 20 20 20 20 20 69 66 28 20 62 20 29 7b  ;.      if( b ){
17100 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c  .        flags |
17110 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f  = SQLITE_OPEN_NO
17120 4d 55 54 45 58 3b 0a 20 20 20 20 20 20 20 20 66  MUTEX;.        f
17130 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f  lags &= ~SQLITE_
17140 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54 45 58 3b 0a  OPEN_FULLMUTEX;.
17150 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
17160 20 20 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 53       flags &= ~S
17170 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54  QLITE_OPEN_NOMUT
17180 45 58 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 7d  EX;.      }.   }
17190 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
171a0 7a 41 72 67 2c 20 22 2d 66 75 6c 6c 6d 75 74 65  zArg, "-fullmute
171b0 78 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  x")==0 ){.      
171c0 69 6e 74 20 62 3b 0a 20 20 20 20 20 20 69 66 28  int b;.      if(
171d0 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46   Tcl_GetBooleanF
171e0 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
171f0 62 6a 76 5b 69 2b 31 5d 2c 20 26 62 29 20 29 20  bjv[i+1], &b) ) 
17200 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
17210 3b 0a 20 20 20 20 20 20 69 66 28 20 62 20 29 7b  ;.      if( b ){
17220 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c  .        flags |
17230 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55  = SQLITE_OPEN_FU
17240 4c 4c 4d 55 54 45 58 3b 0a 20 20 20 20 20 20 20  LLMUTEX;.       
17250 20 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54   flags &= ~SQLIT
17260 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58 3b 0a  E_OPEN_NOMUTEX;.
17270 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
17280 20 20 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 53       flags &= ~S
17290 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d  QLITE_OPEN_FULLM
172a0 55 54 45 58 3b 0a 20 20 20 20 20 20 7d 0a 20 20  UTEX;.      }.  
172b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 54    }else{.      T
172c0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
172d0 69 6e 74 65 72 70 2c 20 22 75 6e 6b 6e 6f 77 6e  interp, "unknown
172e0 20 6f 70 74 69 6f 6e 3a 20 22 2c 20 7a 41 72 67   option: ", zArg
172f0 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20  , (char*)0);.   
17300 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
17310 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ROR;.    }.  }. 
17320 20 69 66 28 20 6f 62 6a 63 3c 33 20 7c 7c 20 28   if( objc<3 || (
17330 6f 62 6a 63 26 31 29 21 3d 31 20 29 7b 0a 20 20  objc&1)!=1 ){.  
17340 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
17350 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
17360 6a 76 2c 20 0a 20 20 20 20 20 20 22 48 41 4e 44  jv, .      "HAND
17370 4c 45 20 46 49 4c 45 4e 41 4d 45 20 3f 2d 76 66  LE FILENAME ?-vf
17380 73 20 56 46 53 4e 41 4d 45 3f 20 3f 2d 72 65 61  s VFSNAME? ?-rea
17390 64 6f 6e 6c 79 20 42 4f 4f 4c 45 41 4e 3f 20 3f  donly BOOLEAN? ?
173a0 2d 63 72 65 61 74 65 20 42 4f 4f 4c 45 41 4e 3f  -create BOOLEAN?
173b0 22 0a 20 20 20 20 20 20 22 20 3f 2d 6e 6f 6d 75  ".      " ?-nomu
173c0 74 65 78 20 42 4f 4f 4c 45 41 4e 3f 20 3f 2d 66  tex BOOLEAN? ?-f
173d0 75 6c 6c 6d 75 74 65 78 20 42 4f 4f 4c 45 41 4e  ullmutex BOOLEAN
173e0 3f 22 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ?".#ifdef SQLITE
173f0 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 20 20 20  _HAS_CODEC.     
17400 20 22 20 3f 2d 6b 65 79 20 43 4f 44 45 43 4b 45   " ?-key CODECKE
17410 59 3f 22 0a 23 65 6e 64 69 66 0a 20 20 20 20 29  Y?".#endif.    )
17420 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
17430 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 45  _ERROR;.  }.  zE
17440 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 70 20 3d  rrMsg = 0;.  p =
17450 20 28 53 71 6c 69 74 65 44 62 2a 29 54 63 6c 5f   (SqliteDb*)Tcl_
17460 41 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70  Alloc( sizeof(*p
17470 29 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  ) );.  if( p==0 
17480 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65  ){.    Tcl_SetRe
17490 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 6d 61  sult(interp, "ma
174a0 6c 6c 6f 63 20 66 61 69 6c 65 64 22 2c 20 54 43  lloc failed", TC
174b0 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 72  L_STATIC);.    r
174c0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
174d0 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70 2c  .  }.  memset(p,
174e0 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b   0, sizeof(*p));
174f0 0a 20 20 7a 46 69 6c 65 20 3d 20 54 63 6c 5f 47  .  zFile = Tcl_G
17500 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
17510 6f 62 6a 76 5b 32 5d 2c 20 30 29 3b 0a 20 20 7a  objv[2], 0);.  z
17520 46 69 6c 65 20 3d 20 54 63 6c 5f 54 72 61 6e 73  File = Tcl_Trans
17530 6c 61 74 65 46 69 6c 65 4e 61 6d 65 28 69 6e 74  lateFileName(int
17540 65 72 70 2c 20 7a 46 69 6c 65 2c 20 26 74 72 61  erp, zFile, &tra
17550 6e 73 6c 61 74 65 64 46 69 6c 65 6e 61 6d 65 29  nslatedFilename)
17560 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  ;.  sqlite3_open
17570 5f 76 32 28 7a 46 69 6c 65 2c 20 26 70 2d 3e 64  _v2(zFile, &p->d
17580 62 2c 20 66 6c 61 67 73 2c 20 7a 56 66 73 29 3b  b, flags, zVfs);
17590 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72  .  Tcl_DStringFr
175a0 65 65 28 26 74 72 61 6e 73 6c 61 74 65 64 46 69  ee(&translatedFi
175b0 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20 53  lename);.  if( S
175c0 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65  QLITE_OK!=sqlite
175d0 33 5f 65 72 72 63 6f 64 65 28 70 2d 3e 64 62 29  3_errcode(p->db)
175e0 20 29 7b 0a 20 20 20 20 7a 45 72 72 4d 73 67 20   ){.    zErrMsg 
175f0 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
17600 66 28 22 25 73 22 2c 20 73 71 6c 69 74 65 33 5f  f("%s", sqlite3_
17610 65 72 72 6d 73 67 28 70 2d 3e 64 62 29 29 3b 0a  errmsg(p->db));.
17620 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73      sqlite3_clos
17630 65 28 70 2d 3e 64 62 29 3b 0a 20 20 20 20 70 2d  e(p->db);.    p-
17640 3e 64 62 20 3d 20 30 3b 0a 20 20 7d 0a 23 69 66  >db = 0;.  }.#if
17650 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43  def SQLITE_HAS_C
17660 4f 44 45 43 0a 20 20 69 66 28 20 70 2d 3e 64 62  ODEC.  if( p->db
17670 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
17680 6b 65 79 28 70 2d 3e 64 62 2c 20 70 4b 65 79 2c  key(p->db, pKey,
17690 20 6e 4b 65 79 29 3b 0a 20 20 7d 0a 23 65 6e 64   nKey);.  }.#end
176a0 69 66 0a 20 20 69 66 28 20 70 2d 3e 64 62 3d 3d  if.  if( p->db==
176b0 30 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74  0 ){.    Tcl_Set
176c0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a  Result(interp, z
176d0 45 72 72 4d 73 67 2c 20 54 43 4c 5f 56 4f 4c 41  ErrMsg, TCL_VOLA
176e0 54 49 4c 45 29 3b 0a 20 20 20 20 54 63 6c 5f 46  TILE);.    Tcl_F
176f0 72 65 65 28 28 63 68 61 72 2a 29 70 29 3b 0a 20  ree((char*)p);. 
17700 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
17710 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 72 65  zErrMsg);.    re
17720 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
17730 20 20 7d 0a 20 20 70 2d 3e 6d 61 78 53 74 6d 74    }.  p->maxStmt
17740 20 3d 20 4e 55 4d 5f 50 52 45 50 41 52 45 44 5f   = NUM_PREPARED_
17750 53 54 4d 54 53 3b 0a 20 20 70 2d 3e 69 6e 74 65  STMTS;.  p->inte
17760 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 7a  rp = interp;.  z
17770 41 72 67 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  Arg = Tcl_GetStr
17780 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
17790 31 5d 2c 20 30 29 3b 0a 20 20 69 66 28 20 44 62  1], 0);.  if( Db
177a0 55 73 65 4e 72 65 28 29 20 29 7b 0a 20 20 20 20  UseNre() ){.    
177b0 54 63 6c 5f 4e 52 43 72 65 61 74 65 43 6f 6d 6d  Tcl_NRCreateComm
177c0 61 6e 64 28 69 6e 74 65 72 70 2c 20 7a 41 72 67  and(interp, zArg
177d0 2c 20 44 62 4f 62 6a 43 6d 64 41 64 61 70 74 6f  , DbObjCmdAdapto
177e0 72 2c 20 44 62 4f 62 6a 43 6d 64 2c 0a 20 20 20  r, DbObjCmd,.   
177f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17800 20 20 20 20 20 28 63 68 61 72 2a 29 70 2c 20 44       (char*)p, D
17810 62 44 65 6c 65 74 65 43 6d 64 29 3b 0a 20 20 7d  bDeleteCmd);.  }
17820 65 6c 73 65 7b 0a 20 20 20 20 54 63 6c 5f 43 72  else{.    Tcl_Cr
17830 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69  eateObjCommand(i
17840 6e 74 65 72 70 2c 20 7a 41 72 67 2c 20 44 62 4f  nterp, zArg, DbO
17850 62 6a 43 6d 64 2c 20 28 63 68 61 72 2a 29 70 2c  bjCmd, (char*)p,
17860 20 44 62 44 65 6c 65 74 65 43 6d 64 29 3b 0a 20   DbDeleteCmd);. 
17870 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f   }.  return TCL_
17880 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f  OK;.}../*.** Pro
17890 76 69 64 65 20 61 20 64 75 6d 6d 79 20 54 63 6c  vide a dummy Tcl
178a0 5f 49 6e 69 74 53 74 75 62 73 20 69 66 20 77 65  _InitStubs if we
178b0 20 61 72 65 20 75 73 69 6e 67 20 74 68 69 73 20   are using this 
178c0 61 73 20 61 20 73 74 61 74 69 63 0a 2a 2a 20 6c  as a static.** l
178d0 69 62 72 61 72 79 2e 0a 2a 2f 0a 23 69 66 6e 64  ibrary..*/.#ifnd
178e0 65 66 20 55 53 45 5f 54 43 4c 5f 53 54 55 42 53  ef USE_TCL_STUBS
178f0 0a 23 20 75 6e 64 65 66 20 20 54 63 6c 5f 49 6e  .# undef  Tcl_In
17900 69 74 53 74 75 62 73 0a 23 20 64 65 66 69 6e 65  itStubs.# define
17910 20 54 63 6c 5f 49 6e 69 74 53 74 75 62 73 28 61   Tcl_InitStubs(a
17920 2c 62 2c 63 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ,b,c).#endif../*
17930 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 77 65  .** Make sure we
17940 20 68 61 76 65 20 61 20 50 41 43 4b 41 47 45 5f   have a PACKAGE_
17950 56 45 52 53 49 4f 4e 20 6d 61 63 72 6f 20 64 65  VERSION macro de
17960 66 69 6e 65 64 2e 20 20 54 68 69 73 20 77 69 6c  fined.  This wil
17970 6c 20 62 65 0a 2a 2a 20 64 65 66 69 6e 65 64 20  l be.** defined 
17980 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 62 79  automatically by
17990 20 74 68 65 20 54 45 41 20 6d 61 6b 65 66 69 6c   the TEA makefil
179a0 65 2e 20 20 42 75 74 20 6f 74 68 65 72 20 6d 61  e.  But other ma
179b0 6b 65 66 69 6c 65 73 0a 2a 2a 20 64 6f 20 6e 6f  kefiles.** do no
179c0 74 20 64 65 66 69 6e 65 20 69 74 2e 0a 2a 2f 0a  t define it..*/.
179d0 23 69 66 6e 64 65 66 20 50 41 43 4b 41 47 45 5f  #ifndef PACKAGE_
179e0 56 45 52 53 49 4f 4e 0a 23 20 64 65 66 69 6e 65  VERSION.# define
179f0 20 50 41 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e   PACKAGE_VERSION
17a00 20 53 51 4c 49 54 45 5f 56 45 52 53 49 4f 4e 0a   SQLITE_VERSION.
17a10 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e  #endif../*.** In
17a20 69 74 69 61 6c 69 7a 65 20 74 68 69 73 20 6d 6f  itialize this mo
17a30 64 75 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  dule..**.** This
17a40 20 54 63 6c 20 6d 6f 64 75 6c 65 20 63 6f 6e 74   Tcl module cont
17a50 61 69 6e 73 20 6f 6e 6c 79 20 61 20 73 69 6e 67  ains only a sing
17a60 6c 65 20 6e 65 77 20 54 63 6c 20 63 6f 6d 6d 61  le new Tcl comma
17a70 6e 64 20 6e 61 6d 65 64 20 22 73 71 6c 69 74 65  nd named "sqlite
17a80 22 2e 0a 2a 2a 20 28 48 65 6e 63 65 20 74 68 65  "..** (Hence the
17a90 72 65 20 69 73 20 6e 6f 20 6e 61 6d 65 73 70 61  re is no namespa
17aa0 63 65 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f  ce.  There is no
17ab0 20 70 6f 69 6e 74 20 69 6e 20 75 73 69 6e 67 20   point in using 
17ac0 61 20 6e 61 6d 65 73 70 61 63 65 0a 2a 2a 20 69  a namespace.** i
17ad0 66 20 74 68 65 20 65 78 74 65 6e 73 69 6f 6e 20  f the extension 
17ae0 6f 6e 6c 79 20 73 75 70 70 6c 69 65 73 20 6f 6e  only supplies on
17af0 65 20 6e 65 77 20 6e 61 6d 65 21 29 20 20 54 68  e new name!)  Th
17b00 65 20 22 73 71 6c 69 74 65 22 20 63 6f 6d 6d 61  e "sqlite" comma
17b10 6e 64 20 69 73 0a 2a 2a 20 75 73 65 64 20 74 6f  nd is.** used to
17b20 20 6f 70 65 6e 20 61 20 6e 65 77 20 53 51 4c 69   open a new SQLi
17b30 74 65 20 64 61 74 61 62 61 73 65 2e 20 20 53 65  te database.  Se
17b40 65 20 74 68 65 20 44 62 4d 61 69 6e 28 29 20 72  e the DbMain() r
17b50 6f 75 74 69 6e 65 20 61 62 6f 76 65 0a 2a 2a 20  outine above.** 
17b60 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  for additional i
17b70 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a  nformation..**.*
17b80 2a 20 54 68 65 20 45 58 54 45 52 4e 20 6d 61 63  * The EXTERN mac
17b90 72 6f 73 20 61 72 65 20 72 65 71 75 69 72 65 64  ros are required
17ba0 20 62 79 20 54 43 4c 20 69 6e 20 6f 72 64 65 72   by TCL in order
17bb0 20 74 6f 20 77 6f 72 6b 20 6f 6e 20 77 69 6e 64   to work on wind
17bc0 6f 77 73 2e 0a 2a 2f 0a 45 58 54 45 52 4e 20 69  ows..*/.EXTERN i
17bd0 6e 74 20 53 71 6c 69 74 65 33 5f 49 6e 69 74 28  nt Sqlite3_Init(
17be0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
17bf0 72 70 29 7b 0a 20 20 54 63 6c 5f 49 6e 69 74 53  rp){.  Tcl_InitS
17c00 74 75 62 73 28 69 6e 74 65 72 70 2c 20 22 38 2e  tubs(interp, "8.
17c10 34 22 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 43 72  4", 0);.  Tcl_Cr
17c20 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69  eateObjCommand(i
17c30 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 33 22  nterp, "sqlite3"
17c40 2c 20 28 54 63 6c 5f 4f 62 6a 43 6d 64 50 72 6f  , (Tcl_ObjCmdPro
17c50 63 2a 29 44 62 4d 61 69 6e 2c 20 30 2c 20 30 29  c*)DbMain, 0, 0)
17c60 3b 0a 20 20 54 63 6c 5f 50 6b 67 50 72 6f 76 69  ;.  Tcl_PkgProvi
17c70 64 65 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69  de(interp, "sqli
17c80 74 65 33 22 2c 20 50 41 43 4b 41 47 45 5f 56 45  te3", PACKAGE_VE
17c90 52 53 49 4f 4e 29 3b 0a 0a 23 69 66 6e 64 65 66  RSION);..#ifndef
17ca0 20 53 51 4c 49 54 45 5f 33 5f 53 55 46 46 49 58   SQLITE_3_SUFFIX
17cb0 5f 4f 4e 4c 59 0a 20 20 2f 2a 20 54 68 65 20 22  _ONLY.  /* The "
17cc0 73 71 6c 69 74 65 22 20 61 6c 69 61 73 20 69 73  sqlite" alias is
17cd0 20 75 6e 64 6f 63 75 6d 65 6e 74 65 64 2e 20 20   undocumented.  
17ce0 49 74 20 69 73 20 68 65 72 65 20 6f 6e 6c 79 20  It is here only 
17cf0 74 6f 20 73 75 70 70 6f 72 74 0a 20 20 2a 2a 20  to support.  ** 
17d00 6c 65 67 61 63 79 20 73 63 72 69 70 74 73 2e 20  legacy scripts. 
17d10 20 41 6c 6c 20 6e 65 77 20 73 63 72 69 70 74 73   All new scripts
17d20 20 73 68 6f 75 6c 64 20 75 73 65 20 6f 6e 6c 79   should use only
17d30 20 74 68 65 20 22 73 71 6c 69 74 65 33 22 0a 20   the "sqlite3". 
17d40 20 2a 2a 20 63 6f 6d 6d 61 6e 64 2e 0a 20 20 2a   ** command..  *
17d50 2f 0a 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62  /.  Tcl_CreateOb
17d60 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c  jCommand(interp,
17d70 20 22 73 71 6c 69 74 65 22 2c 20 28 54 63 6c 5f   "sqlite", (Tcl_
17d80 4f 62 6a 43 6d 64 50 72 6f 63 2a 29 44 62 4d 61  ObjCmdProc*)DbMa
17d90 69 6e 2c 20 30 2c 20 30 29 3b 0a 23 65 6e 64 69  in, 0, 0);.#endi
17da0 66 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  f..  return TCL_
17db0 4f 4b 3b 0a 7d 0a 45 58 54 45 52 4e 20 69 6e 74  OK;.}.EXTERN int
17dc0 20 54 63 6c 73 71 6c 69 74 65 33 5f 49 6e 69 74   Tclsqlite3_Init
17dd0 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74  (Tcl_Interp *int
17de0 65 72 70 29 7b 20 72 65 74 75 72 6e 20 53 71 6c  erp){ return Sql
17df0 69 74 65 33 5f 49 6e 69 74 28 69 6e 74 65 72 70  ite3_Init(interp
17e00 29 3b 20 7d 0a 45 58 54 45 52 4e 20 69 6e 74 20  ); }.EXTERN int 
17e10 53 71 6c 69 74 65 33 5f 53 61 66 65 49 6e 69 74  Sqlite3_SafeInit
17e20 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74  (Tcl_Interp *int
17e30 65 72 70 29 7b 20 72 65 74 75 72 6e 20 54 43 4c  erp){ return TCL
17e40 5f 4f 4b 3b 20 7d 0a 45 58 54 45 52 4e 20 69 6e  _OK; }.EXTERN in
17e50 74 20 54 63 6c 73 71 6c 69 74 65 33 5f 53 61 66  t Tclsqlite3_Saf
17e60 65 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  eInit(Tcl_Interp
17e70 20 2a 69 6e 74 65 72 70 29 7b 20 72 65 74 75 72   *interp){ retur
17e80 6e 20 54 43 4c 5f 4f 4b 3b 20 7d 0a 45 58 54 45  n TCL_OK; }.EXTE
17e90 52 4e 20 69 6e 74 20 53 71 6c 69 74 65 33 5f 55  RN int Sqlite3_U
17ea0 6e 6c 6f 61 64 28 54 63 6c 5f 49 6e 74 65 72 70  nload(Tcl_Interp
17eb0 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 66 6c   *interp, int fl
17ec0 61 67 73 29 7b 20 72 65 74 75 72 6e 20 54 43 4c  ags){ return TCL
17ed0 5f 4f 4b 3b 20 7d 0a 45 58 54 45 52 4e 20 69 6e  _OK; }.EXTERN in
17ee0 74 20 54 63 6c 73 71 6c 69 74 65 33 5f 55 6e 6c  t Tclsqlite3_Unl
17ef0 6f 61 64 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a  oad(Tcl_Interp *
17f00 69 6e 74 65 72 70 2c 20 69 6e 74 20 66 6c 61 67  interp, int flag
17f10 73 29 7b 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  s){ return TCL_O
17f20 4b 3b 20 7d 0a 45 58 54 45 52 4e 20 69 6e 74 20  K; }.EXTERN int 
17f30 53 71 6c 69 74 65 33 5f 53 61 66 65 55 6e 6c 6f  Sqlite3_SafeUnlo
17f40 61 64 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  ad(Tcl_Interp *i
17f50 6e 74 65 72 70 2c 20 69 6e 74 20 66 6c 61 67 73  nterp, int flags
17f60 29 7b 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  ){ return TCL_OK
17f70 3b 20 7d 0a 45 58 54 45 52 4e 20 69 6e 74 20 54  ; }.EXTERN int T
17f80 63 6c 73 71 6c 69 74 65 33 5f 53 61 66 65 55 6e  clsqlite3_SafeUn
17f90 6c 6f 61 64 28 54 63 6c 5f 49 6e 74 65 72 70 20  load(Tcl_Interp 
17fa0 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 66 6c 61  *interp, int fla
17fb0 67 73 29 7b 20 72 65 74 75 72 6e 20 54 43 4c 5f  gs){ return TCL_
17fc0 4f 4b 3b 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53  OK;}...#ifndef S
17fd0 51 4c 49 54 45 5f 33 5f 53 55 46 46 49 58 5f 4f  QLITE_3_SUFFIX_O
17fe0 4e 4c 59 0a 69 6e 74 20 53 71 6c 69 74 65 5f 49  NLY.int Sqlite_I
17ff0 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a  nit(Tcl_Interp *
18000 69 6e 74 65 72 70 29 7b 20 72 65 74 75 72 6e 20  interp){ return 
18010 53 71 6c 69 74 65 33 5f 49 6e 69 74 28 69 6e 74  Sqlite3_Init(int
18020 65 72 70 29 3b 20 7d 0a 69 6e 74 20 54 63 6c 73  erp); }.int Tcls
18030 71 6c 69 74 65 5f 49 6e 69 74 28 54 63 6c 5f 49  qlite_Init(Tcl_I
18040 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 20  nterp *interp){ 
18050 72 65 74 75 72 6e 20 53 71 6c 69 74 65 33 5f 49  return Sqlite3_I
18060 6e 69 74 28 69 6e 74 65 72 70 29 3b 20 7d 0a 69  nit(interp); }.i
18070 6e 74 20 53 71 6c 69 74 65 5f 53 61 66 65 49 6e  nt Sqlite_SafeIn
18080 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  it(Tcl_Interp *i
18090 6e 74 65 72 70 29 7b 20 72 65 74 75 72 6e 20 54  nterp){ return T
180a0 43 4c 5f 4f 4b 3b 20 7d 0a 69 6e 74 20 54 63 6c  CL_OK; }.int Tcl
180b0 73 71 6c 69 74 65 5f 53 61 66 65 49 6e 69 74 28  sqlite_SafeInit(
180c0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
180d0 72 70 29 7b 20 72 65 74 75 72 6e 20 54 43 4c 5f  rp){ return TCL_
180e0 4f 4b 3b 20 7d 0a 69 6e 74 20 53 71 6c 69 74 65  OK; }.int Sqlite
180f0 5f 55 6e 6c 6f 61 64 28 54 63 6c 5f 49 6e 74 65  _Unload(Tcl_Inte
18100 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20  rp *interp, int 
18110 66 6c 61 67 73 29 7b 20 72 65 74 75 72 6e 20 54  flags){ return T
18120 43 4c 5f 4f 4b 3b 20 7d 0a 69 6e 74 20 54 63 6c  CL_OK; }.int Tcl
18130 73 71 6c 69 74 65 5f 55 6e 6c 6f 61 64 28 54 63  sqlite_Unload(Tc
18140 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
18150 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 20 72 65  , int flags){ re
18160 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 7d 0a 69  turn TCL_OK; }.i
18170 6e 74 20 53 71 6c 69 74 65 5f 53 61 66 65 55 6e  nt Sqlite_SafeUn
18180 6c 6f 61 64 28 54 63 6c 5f 49 6e 74 65 72 70 20  load(Tcl_Interp 
18190 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 66 6c 61  *interp, int fla
181a0 67 73 29 7b 20 72 65 74 75 72 6e 20 54 43 4c 5f  gs){ return TCL_
181b0 4f 4b 3b 20 7d 0a 69 6e 74 20 54 63 6c 73 71 6c  OK; }.int Tclsql
181c0 69 74 65 5f 53 61 66 65 55 6e 6c 6f 61 64 28 54  ite_SafeUnload(T
181d0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
181e0 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 20 72  p, int flags){ r
181f0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 7d 0a 23  eturn TCL_OK;}.#
18200 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 54 43  endif..#ifdef TC
18210 4c 53 48 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  LSH./***********
18220 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18230 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18240 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18250 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18260 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 66 20 74 68 65  **.** All of the
18270 20 63 6f 64 65 20 74 68 61 74 20 66 6f 6c 6c 6f   code that follo
18280 77 73 20 69 73 20 75 73 65 64 20 74 6f 20 62 75  ws is used to bu
18290 69 6c 64 20 73 74 61 6e 64 61 6c 6f 6e 65 20 54  ild standalone T
182a0 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 73 0a  CL interpreters.
182b0 2a 2a 20 74 68 61 74 20 61 72 65 20 73 74 61 74  ** that are stat
182c0 69 63 61 6c 6c 79 20 6c 69 6e 6b 65 64 20 77 69  ically linked wi
182d0 74 68 20 53 51 4c 69 74 65 2e 20 20 45 6e 61 62  th SQLite.  Enab
182e0 6c 65 20 74 68 65 73 65 20 62 79 20 63 6f 6d 70  le these by comp
182f0 69 6c 69 6e 67 0a 2a 2a 20 77 69 74 68 20 2d 44  iling.** with -D
18300 54 43 4c 53 48 3d 6e 20 77 68 65 72 65 20 6e 20  TCLSH=n where n 
18310 63 61 6e 20 62 65 20 31 20 6f 72 20 32 2e 20 20  can be 1 or 2.  
18320 41 6e 20 6e 20 6f 66 20 31 20 67 65 6e 65 72 61  An n of 1 genera
18330 74 65 73 20 61 20 73 74 61 6e 64 61 72 64 0a 2a  tes a standard.*
18340 2a 20 74 63 6c 73 68 20 62 75 74 20 77 69 74 68  * tclsh but with
18350 20 53 51 4c 69 74 65 20 62 75 69 6c 74 20 69 6e   SQLite built in
18360 2e 20 20 41 6e 20 6e 20 6f 66 20 32 20 67 65 6e  .  An n of 2 gen
18370 65 72 61 74 65 73 20 74 68 65 20 53 51 4c 69 74  erates the SQLit
18380 65 20 73 70 61 63 65 0a 2a 2a 20 61 6e 61 6c 79  e space.** analy
18390 73 69 73 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a  sis program..*/.
183a0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
183b0 49 54 45 5f 54 45 53 54 29 20 7c 7c 20 64 65 66  ITE_TEST) || def
183c0 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 43 4c 4d  ined(SQLITE_TCLM
183d0 44 35 29 0a 2f 2a 0a 20 2a 20 54 68 69 73 20 63  D5)./*. * This c
183e0 6f 64 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74  ode implements t
183f0 68 65 20 4d 44 35 20 6d 65 73 73 61 67 65 2d 64  he MD5 message-d
18400 69 67 65 73 74 20 61 6c 67 6f 72 69 74 68 6d 2e  igest algorithm.
18410 0a 20 2a 20 54 68 65 20 61 6c 67 6f 72 69 74 68  . * The algorith
18420 6d 20 69 73 20 64 75 65 20 74 6f 20 52 6f 6e 20  m is due to Ron 
18430 52 69 76 65 73 74 2e 20 20 54 68 69 73 20 63 6f  Rivest.  This co
18440 64 65 20 77 61 73 0a 20 2a 20 77 72 69 74 74 65  de was. * writte
18450 6e 20 62 79 20 43 6f 6c 69 6e 20 50 6c 75 6d 62  n by Colin Plumb
18460 20 69 6e 20 31 39 39 33 2c 20 6e 6f 20 63 6f 70   in 1993, no cop
18470 79 72 69 67 68 74 20 69 73 20 63 6c 61 69 6d 65  yright is claime
18480 64 2e 0a 20 2a 20 54 68 69 73 20 63 6f 64 65 20  d.. * This code 
18490 69 73 20 69 6e 20 74 68 65 20 70 75 62 6c 69 63  is in the public
184a0 20 64 6f 6d 61 69 6e 3b 20 64 6f 20 77 69 74 68   domain; do with
184b0 20 69 74 20 77 68 61 74 20 79 6f 75 20 77 69 73   it what you wis
184c0 68 2e 0a 20 2a 0a 20 2a 20 45 71 75 69 76 61 6c  h.. *. * Equival
184d0 65 6e 74 20 63 6f 64 65 20 69 73 20 61 76 61 69  ent code is avai
184e0 6c 61 62 6c 65 20 66 72 6f 6d 20 52 53 41 20 44  lable from RSA D
184f0 61 74 61 20 53 65 63 75 72 69 74 79 2c 20 49 6e  ata Security, In
18500 63 2e 0a 20 2a 20 54 68 69 73 20 63 6f 64 65 20  c.. * This code 
18510 68 61 73 20 62 65 65 6e 20 74 65 73 74 65 64 20  has been tested 
18520 61 67 61 69 6e 73 74 20 74 68 61 74 2c 20 61 6e  against that, an
18530 64 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 2c  d is equivalent,
18540 0a 20 2a 20 65 78 63 65 70 74 20 74 68 61 74 20  . * except that 
18550 79 6f 75 20 64 6f 6e 27 74 20 6e 65 65 64 20 74  you don't need t
18560 6f 20 69 6e 63 6c 75 64 65 20 74 77 6f 20 70 61  o include two pa
18570 67 65 73 20 6f 66 20 6c 65 67 61 6c 65 73 65 0a  ges of legalese.
18580 20 2a 20 77 69 74 68 20 65 76 65 72 79 20 63 6f   * with every co
18590 70 79 2e 0a 20 2a 0a 20 2a 20 54 6f 20 63 6f 6d  py.. *. * To com
185a0 70 75 74 65 20 74 68 65 20 6d 65 73 73 61 67 65  pute the message
185b0 20 64 69 67 65 73 74 20 6f 66 20 61 20 63 68 75   digest of a chu
185c0 6e 6b 20 6f 66 20 62 79 74 65 73 2c 20 64 65 63  nk of bytes, dec
185d0 6c 61 72 65 20 61 6e 0a 20 2a 20 4d 44 35 43 6f  lare an. * MD5Co
185e0 6e 74 65 78 74 20 73 74 72 75 63 74 75 72 65 2c  ntext structure,
185f0 20 70 61 73 73 20 69 74 20 74 6f 20 4d 44 35 49   pass it to MD5I
18600 6e 69 74 2c 20 63 61 6c 6c 20 4d 44 35 55 70 64  nit, call MD5Upd
18610 61 74 65 20 61 73 0a 20 2a 20 6e 65 65 64 65 64  ate as. * needed
18620 20 6f 6e 20 62 75 66 66 65 72 73 20 66 75 6c 6c   on buffers full
18630 20 6f 66 20 62 79 74 65 73 2c 20 61 6e 64 20 74   of bytes, and t
18640 68 65 6e 20 63 61 6c 6c 20 4d 44 35 46 69 6e 61  hen call MD5Fina
18650 6c 2c 20 77 68 69 63 68 0a 20 2a 20 77 69 6c 6c  l, which. * will
18660 20 66 69 6c 6c 20 61 20 73 75 70 70 6c 69 65 64   fill a supplied
18670 20 31 36 2d 62 79 74 65 20 61 72 72 61 79 20 77   16-byte array w
18680 69 74 68 20 74 68 65 20 64 69 67 65 73 74 2e 0a  ith the digest..
18690 20 2a 2f 0a 0a 2f 2a 0a 20 2a 20 49 66 20 63 6f   */../*. * If co
186a0 6d 70 69 6c 65 64 20 6f 6e 20 61 20 6d 61 63 68  mpiled on a mach
186b0 69 6e 65 20 74 68 61 74 20 64 6f 65 73 6e 27 74  ine that doesn't
186c0 20 68 61 76 65 20 61 20 33 32 2d 62 69 74 20 69   have a 32-bit i
186d0 6e 74 65 67 65 72 2c 0a 20 2a 20 79 6f 75 20 6a  nteger,. * you j
186e0 75 73 74 20 73 65 74 20 22 75 69 6e 74 33 32 22  ust set "uint32"
186f0 20 74 6f 20 74 68 65 20 61 70 70 72 6f 70 72 69   to the appropri
18700 61 74 65 20 64 61 74 61 74 79 70 65 20 66 6f 72  ate datatype for
18710 20 61 6e 0a 20 2a 20 75 6e 73 69 67 6e 65 64 20   an. * unsigned 
18720 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 2e 20  32-bit integer. 
18730 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 20 2a   For example:. *
18740 0a 20 2a 20 20 20 20 20 20 20 63 63 20 2d 44 75  . *       cc -Du
18750 69 6e 74 33 32 3d 27 75 6e 73 69 67 6e 65 64 20  int32='unsigned 
18760 6c 6f 6e 67 27 20 6d 64 35 2e 63 0a 20 2a 0a 20  long' md5.c. *. 
18770 2a 2f 0a 23 69 66 6e 64 65 66 20 75 69 6e 74 33  */.#ifndef uint3
18780 32 0a 23 20 20 64 65 66 69 6e 65 20 75 69 6e 74  2.#  define uint
18790 33 32 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 0a  32 unsigned int.
187a0 23 65 6e 64 69 66 0a 0a 73 74 72 75 63 74 20 4d  #endif..struct M
187b0 44 35 43 6f 6e 74 65 78 74 20 7b 0a 20 20 69 6e  D5Context {.  in
187c0 74 20 69 73 49 6e 69 74 3b 0a 20 20 75 69 6e 74  t isInit;.  uint
187d0 33 32 20 62 75 66 5b 34 5d 3b 0a 20 20 75 69 6e  32 buf[4];.  uin
187e0 74 33 32 20 62 69 74 73 5b 32 5d 3b 0a 20 20 75  t32 bits[2];.  u
187f0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 69 6e 5b  nsigned char in[
18800 36 34 5d 3b 0a 7d 3b 0a 74 79 70 65 64 65 66 20  64];.};.typedef 
18810 73 74 72 75 63 74 20 4d 44 35 43 6f 6e 74 65 78  struct MD5Contex
18820 74 20 4d 44 35 43 6f 6e 74 65 78 74 3b 0a 0a 2f  t MD5Context;../
18830 2a 0a 20 2a 20 4e 6f 74 65 3a 20 74 68 69 73 20  *. * Note: this 
18840 63 6f 64 65 20 69 73 20 68 61 72 6d 6c 65 73 73  code is harmless
18850 20 6f 6e 20 6c 69 74 74 6c 65 2d 65 6e 64 69 61   on little-endia
18860 6e 20 6d 61 63 68 69 6e 65 73 2e 0a 20 2a 2f 0a  n machines.. */.
18870 73 74 61 74 69 63 20 76 6f 69 64 20 62 79 74 65  static void byte
18880 52 65 76 65 72 73 65 20 28 75 6e 73 69 67 6e 65  Reverse (unsigne
18890 64 20 63 68 61 72 20 2a 62 75 66 2c 20 75 6e 73  d char *buf, uns
188a0 69 67 6e 65 64 20 6c 6f 6e 67 73 29 7b 0a 20 20  igned longs){.  
188b0 20 20 20 20 20 20 75 69 6e 74 33 32 20 74 3b 0a        uint32 t;.
188c0 20 20 20 20 20 20 20 20 64 6f 20 7b 0a 20 20 20          do {.   
188d0 20 20 20 20 20 20 20 20 20 20 20 20 20 74 20 3d               t =
188e0 20 28 75 69 6e 74 33 32 29 28 28 75 6e 73 69 67   (uint32)((unsig
188f0 6e 65 64 29 62 75 66 5b 33 5d 3c 3c 38 20 7c 20  ned)buf[3]<<8 | 
18900 62 75 66 5b 32 5d 29 20 3c 3c 20 31 36 20 7c 0a  buf[2]) << 16 |.
18910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18920 20 20 20 20 20 20 20 20 20 20 20 20 28 28 75 6e              ((un
18930 73 69 67 6e 65 64 29 62 75 66 5b 31 5d 3c 3c 38  signed)buf[1]<<8
18940 20 7c 20 62 75 66 5b 30 5d 29 3b 0a 20 20 20 20   | buf[0]);.    
18950 20 20 20 20 20 20 20 20 20 20 20 20 2a 28 75 69              *(ui
18960 6e 74 33 32 20 2a 29 62 75 66 20 3d 20 74 3b 0a  nt32 *)buf = t;.
18970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18980 62 75 66 20 2b 3d 20 34 3b 0a 20 20 20 20 20 20  buf += 4;.      
18990 20 20 7d 20 77 68 69 6c 65 20 28 2d 2d 6c 6f 6e    } while (--lon
189a0 67 73 29 3b 0a 7d 0a 2f 2a 20 54 68 65 20 66 6f  gs);.}./* The fo
189b0 75 72 20 63 6f 72 65 20 66 75 6e 63 74 69 6f 6e  ur core function
189c0 73 20 2d 20 46 31 20 69 73 20 6f 70 74 69 6d 69  s - F1 is optimi
189d0 7a 65 64 20 73 6f 6d 65 77 68 61 74 20 2a 2f 0a  zed somewhat */.
189e0 0a 2f 2a 20 23 64 65 66 69 6e 65 20 46 31 28 78  ./* #define F1(x
189f0 2c 20 79 2c 20 7a 29 20 28 78 20 26 20 79 20 7c  , y, z) (x & y |
18a00 20 7e 78 20 26 20 7a 29 20 2a 2f 0a 23 64 65 66   ~x & z) */.#def
18a10 69 6e 65 20 46 31 28 78 2c 20 79 2c 20 7a 29 20  ine F1(x, y, z) 
18a20 28 7a 20 5e 20 28 78 20 26 20 28 79 20 5e 20 7a  (z ^ (x & (y ^ z
18a30 29 29 29 0a 23 64 65 66 69 6e 65 20 46 32 28 78  ))).#define F2(x
18a40 2c 20 79 2c 20 7a 29 20 46 31 28 7a 2c 20 78 2c  , y, z) F1(z, x,
18a50 20 79 29 0a 23 64 65 66 69 6e 65 20 46 33 28 78   y).#define F3(x
18a60 2c 20 79 2c 20 7a 29 20 28 78 20 5e 20 79 20 5e  , y, z) (x ^ y ^
18a70 20 7a 29 0a 23 64 65 66 69 6e 65 20 46 34 28 78   z).#define F4(x
18a80 2c 20 79 2c 20 7a 29 20 28 79 20 5e 20 28 78 20  , y, z) (y ^ (x 
18a90 7c 20 7e 7a 29 29 0a 0a 2f 2a 20 54 68 69 73 20  | ~z))../* This 
18aa0 69 73 20 74 68 65 20 63 65 6e 74 72 61 6c 20 73  is the central s
18ab0 74 65 70 20 69 6e 20 74 68 65 20 4d 44 35 20 61  tep in the MD5 a
18ac0 6c 67 6f 72 69 74 68 6d 2e 20 2a 2f 0a 23 64 65  lgorithm. */.#de
18ad0 66 69 6e 65 20 4d 44 35 53 54 45 50 28 66 2c 20  fine MD5STEP(f, 
18ae0 77 2c 20 78 2c 20 79 2c 20 7a 2c 20 64 61 74 61  w, x, y, z, data
18af0 2c 20 73 29 20 5c 0a 20 20 20 20 20 20 20 20 28  , s) \.        (
18b00 20 77 20 2b 3d 20 66 28 78 2c 20 79 2c 20 7a 29   w += f(x, y, z)
18b10 20 2b 20 64 61 74 61 2c 20 20 77 20 3d 20 77 3c   + data,  w = w<
18b20 3c 73 20 7c 20 77 3e 3e 28 33 32 2d 73 29 2c 20  <s | w>>(32-s), 
18b30 20 77 20 2b 3d 20 78 20 29 0a 0a 2f 2a 0a 20 2a   w += x )../*. *
18b40 20 54 68 65 20 63 6f 72 65 20 6f 66 20 74 68 65   The core of the
18b50 20 4d 44 35 20 61 6c 67 6f 72 69 74 68 6d 2c 20   MD5 algorithm, 
18b60 74 68 69 73 20 61 6c 74 65 72 73 20 61 6e 20 65  this alters an e
18b70 78 69 73 74 69 6e 67 20 4d 44 35 20 68 61 73 68  xisting MD5 hash
18b80 20 74 6f 0a 20 2a 20 72 65 66 6c 65 63 74 20 74   to. * reflect t
18b90 68 65 20 61 64 64 69 74 69 6f 6e 20 6f 66 20 31  he addition of 1
18ba0 36 20 6c 6f 6e 67 77 6f 72 64 73 20 6f 66 20 6e  6 longwords of n
18bb0 65 77 20 64 61 74 61 2e 20 20 4d 44 35 55 70 64  ew data.  MD5Upd
18bc0 61 74 65 20 62 6c 6f 63 6b 73 0a 20 2a 20 74 68  ate blocks. * th
18bd0 65 20 64 61 74 61 20 61 6e 64 20 63 6f 6e 76 65  e data and conve
18be0 72 74 73 20 62 79 74 65 73 20 69 6e 74 6f 20 6c  rts bytes into l
18bf0 6f 6e 67 77 6f 72 64 73 20 66 6f 72 20 74 68 69  ongwords for thi
18c00 73 20 72 6f 75 74 69 6e 65 2e 0a 20 2a 2f 0a 73  s routine.. */.s
18c10 74 61 74 69 63 20 76 6f 69 64 20 4d 44 35 54 72  tatic void MD5Tr
18c20 61 6e 73 66 6f 72 6d 28 75 69 6e 74 33 32 20 62  ansform(uint32 b
18c30 75 66 5b 34 5d 2c 20 63 6f 6e 73 74 20 75 69 6e  uf[4], const uin
18c40 74 33 32 20 69 6e 5b 31 36 5d 29 7b 0a 20 20 20  t32 in[16]){.   
18c50 20 20 20 20 20 72 65 67 69 73 74 65 72 20 75 69       register ui
18c60 6e 74 33 32 20 61 2c 20 62 2c 20 63 2c 20 64 3b  nt32 a, b, c, d;
18c70 0a 0a 20 20 20 20 20 20 20 20 61 20 3d 20 62 75  ..        a = bu
18c80 66 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20 62 20  f[0];.        b 
18c90 3d 20 62 75 66 5b 31 5d 3b 0a 20 20 20 20 20 20  = buf[1];.      
18ca0 20 20 63 20 3d 20 62 75 66 5b 32 5d 3b 0a 20 20    c = buf[2];.  
18cb0 20 20 20 20 20 20 64 20 3d 20 62 75 66 5b 33 5d        d = buf[3]
18cc0 3b 0a 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54  ;..        MD5ST
18cd0 45 50 28 46 31 2c 20 61 2c 20 62 2c 20 63 2c 20  EP(F1, a, b, c, 
18ce0 64 2c 20 69 6e 5b 20 30 5d 2b 30 78 64 37 36 61  d, in[ 0]+0xd76a
18cf0 61 34 37 38 2c 20 20 37 29 3b 0a 20 20 20 20 20  a478,  7);.     
18d00 20 20 20 4d 44 35 53 54 45 50 28 46 31 2c 20 64     MD5STEP(F1, d
18d10 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e 5b 20 31  , a, b, c, in[ 1
18d20 5d 2b 30 78 65 38 63 37 62 37 35 36 2c 20 31 32  ]+0xe8c7b756, 12
18d30 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54  );.        MD5ST
18d40 45 50 28 46 31 2c 20 63 2c 20 64 2c 20 61 2c 20  EP(F1, c, d, a, 
18d50 62 2c 20 69 6e 5b 20 32 5d 2b 30 78 32 34 32 30  b, in[ 2]+0x2420
18d60 37 30 64 62 2c 20 31 37 29 3b 0a 20 20 20 20 20  70db, 17);.     
18d70 20 20 20 4d 44 35 53 54 45 50 28 46 31 2c 20 62     MD5STEP(F1, b
18d80 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e 5b 20 33  , c, d, a, in[ 3
18d90 5d 2b 30 78 63 31 62 64 63 65 65 65 2c 20 32 32  ]+0xc1bdceee, 22
18da0 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54  );.        MD5ST
18db0 45 50 28 46 31 2c 20 61 2c 20 62 2c 20 63 2c 20  EP(F1, a, b, c, 
18dc0 64 2c 20 69 6e 5b 20 34 5d 2b 30 78 66 35 37 63  d, in[ 4]+0xf57c
18dd0 30 66 61 66 2c 20 20 37 29 3b 0a 20 20 20 20 20  0faf,  7);.     
18de0 20 20 20 4d 44 35 53 54 45 50 28 46 31 2c 20 64     MD5STEP(F1, d
18df0 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e 5b 20 35  , a, b, c, in[ 5
18e00 5d 2b 30 78 34 37 38 37 63 36 32 61 2c 20 31 32  ]+0x4787c62a, 12
18e10 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54  );.        MD5ST
18e20 45 50 28 46 31 2c 20 63 2c 20 64 2c 20 61 2c 20  EP(F1, c, d, a, 
18e30 62 2c 20 69 6e 5b 20 36 5d 2b 30 78 61 38 33 30  b, in[ 6]+0xa830
18e40 34 36 31 33 2c 20 31 37 29 3b 0a 20 20 20 20 20  4613, 17);.     
18e50 20 20 20 4d 44 35 53 54 45 50 28 46 31 2c 20 62     MD5STEP(F1, b
18e60 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e 5b 20 37  , c, d, a, in[ 7
18e70 5d 2b 30 78 66 64 34 36 39 35 30 31 2c 20 32 32  ]+0xfd469501, 22
18e80 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54  );.        MD5ST
18e90 45 50 28 46 31 2c 20 61 2c 20 62 2c 20 63 2c 20  EP(F1, a, b, c, 
18ea0 64 2c 20 69 6e 5b 20 38 5d 2b 30 78 36 39 38 30  d, in[ 8]+0x6980
18eb0 39 38 64 38 2c 20 20 37 29 3b 0a 20 20 20 20 20  98d8,  7);.     
18ec0 20 20 20 4d 44 35 53 54 45 50 28 46 31 2c 20 64     MD5STEP(F1, d
18ed0 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e 5b 20 39  , a, b, c, in[ 9
18ee0 5d 2b 30 78 38 62 34 34 66 37 61 66 2c 20 31 32  ]+0x8b44f7af, 12
18ef0 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54  );.        MD5ST
18f00 45 50 28 46 31 2c 20 63 2c 20 64 2c 20 61 2c 20  EP(F1, c, d, a, 
18f10 62 2c 20 69 6e 5b 31 30 5d 2b 30 78 66 66 66 66  b, in[10]+0xffff
18f20 35 62 62 31 2c 20 31 37 29 3b 0a 20 20 20 20 20  5bb1, 17);.     
18f30 20 20 20 4d 44 35 53 54 45 50 28 46 31 2c 20 62     MD5STEP(F1, b
18f40 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e 5b 31 31  , c, d, a, in[11
18f50 5d 2b 30 78 38 39 35 63 64 37 62 65 2c 20 32 32  ]+0x895cd7be, 22
18f60 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54  );.        MD5ST
18f70 45 50 28 46 31 2c 20 61 2c 20 62 2c 20 63 2c 20  EP(F1, a, b, c, 
18f80 64 2c 20 69 6e 5b 31 32 5d 2b 30 78 36 62 39 30  d, in[12]+0x6b90
18f90 31 31 32 32 2c 20 20 37 29 3b 0a 20 20 20 20 20  1122,  7);.     
18fa0 20 20 20 4d 44 35 53 54 45 50 28 46 31 2c 20 64     MD5STEP(F1, d
18fb0 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e 5b 31 33  , a, b, c, in[13
18fc0 5d 2b 30 78 66 64 39 38 37 31 39 33 2c 20 31 32  ]+0xfd987193, 12
18fd0 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54  );.        MD5ST
18fe0 45 50 28 46 31 2c 20 63 2c 20 64 2c 20 61 2c 20  EP(F1, c, d, a, 
18ff0 62 2c 20 69 6e 5b 31 34 5d 2b 30 78 61 36 37 39  b, in[14]+0xa679
19000 34 33 38 65 2c 20 31 37 29 3b 0a 20 20 20 20 20  438e, 17);.     
19010 20 20 20 4d 44 35 53 54 45 50 28 46 31 2c 20 62     MD5STEP(F1, b
19020 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e 5b 31 35  , c, d, a, in[15
19030 5d 2b 30 78 34 39 62 34 30 38 32 31 2c 20 32 32  ]+0x49b40821, 22
19040 29 3b 0a 0a 20 20 20 20 20 20 20 20 4d 44 35 53  );..        MD5S
19050 54 45 50 28 46 32 2c 20 61 2c 20 62 2c 20 63 2c  TEP(F2, a, b, c,
19060 20 64 2c 20 69 6e 5b 20 31 5d 2b 30 78 66 36 31   d, in[ 1]+0xf61
19070 65 32 35 36 32 2c 20 20 35 29 3b 0a 20 20 20 20  e2562,  5);.    
19080 20 20 20 20 4d 44 35 53 54 45 50 28 46 32 2c 20      MD5STEP(F2, 
19090 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e 5b 20  d, a, b, c, in[ 
190a0 36 5d 2b 30 78 63 30 34 30 62 33 34 30 2c 20 20  6]+0xc040b340,  
190b0 39 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53  9);.        MD5S
190c0 54 45 50 28 46 32 2c 20 63 2c 20 64 2c 20 61 2c  TEP(F2, c, d, a,
190d0 20 62 2c 20 69 6e 5b 31 31 5d 2b 30 78 32 36 35   b, in[11]+0x265
190e0 65 35 61 35 31 2c 20 31 34 29 3b 0a 20 20 20 20  e5a51, 14);.    
190f0 20 20 20 20 4d 44 35 53 54 45 50 28 46 32 2c 20      MD5STEP(F2, 
19100 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e 5b 20  b, c, d, a, in[ 
19110 30 5d 2b 30 78 65 39 62 36 63 37 61 61 2c 20 32  0]+0xe9b6c7aa, 2
19120 30 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53  0);.        MD5S
19130 54 45 50 28 46 32 2c 20 61 2c 20 62 2c 20 63 2c  TEP(F2, a, b, c,
19140 20 64 2c 20 69 6e 5b 20 35 5d 2b 30 78 64 36 32   d, in[ 5]+0xd62
19150 66 31 30 35 64 2c 20 20 35 29 3b 0a 20 20 20 20  f105d,  5);.    
19160 20 20 20 20 4d 44 35 53 54 45 50 28 46 32 2c 20      MD5STEP(F2, 
19170 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e 5b 31  d, a, b, c, in[1
19180 30 5d 2b 30 78 30 32 34 34 31 34 35 33 2c 20 20  0]+0x02441453,  
19190 39 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53  9);.        MD5S
191a0 54 45 50 28 46 32 2c 20 63 2c 20 64 2c 20 61 2c  TEP(F2, c, d, a,
191b0 20 62 2c 20 69 6e 5b 31 35 5d 2b 30 78 64 38 61   b, in[15]+0xd8a
191c0 31 65 36 38 31 2c 20 31 34 29 3b 0a 20 20 20 20  1e681, 14);.    
191d0 20 20 20 20 4d 44 35 53 54 45 50 28 46 32 2c 20      MD5STEP(F2, 
191e0 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e 5b 20  b, c, d, a, in[ 
191f0 34 5d 2b 30 78 65 37 64 33 66 62 63 38 2c 20 32  4]+0xe7d3fbc8, 2
19200 30 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53  0);.        MD5S
19210 54 45 50 28 46 32 2c 20 61 2c 20 62 2c 20 63 2c  TEP(F2, a, b, c,
19220 20 64 2c 20 69 6e 5b 20 39 5d 2b 30 78 32 31 65   d, in[ 9]+0x21e
19230 31 63 64 65 36 2c 20 20 35 29 3b 0a 20 20 20 20  1cde6,  5);.    
19240 20 20 20 20 4d 44 35 53 54 45 50 28 46 32 2c 20      MD5STEP(F2, 
19250 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e 5b 31  d, a, b, c, in[1
19260 34 5d 2b 30 78 63 33 33 37 30 37 64 36 2c 20 20  4]+0xc33707d6,  
19270 39 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53  9);.        MD5S
19280 54 45 50 28 46 32 2c 20 63 2c 20 64 2c 20 61 2c  TEP(F2, c, d, a,
19290 20 62 2c 20 69 6e 5b 20 33 5d 2b 30 78 66 34 64   b, in[ 3]+0xf4d
192a0 35 30 64 38 37 2c 20 31 34 29 3b 0a 20 20 20 20  50d87, 14);.    
192b0 20 20 20 20 4d 44 35 53 54 45 50 28 46 32 2c 20      MD5STEP(F2, 
192c0 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e 5b 20  b, c, d, a, in[ 
192d0 38 5d 2b 30 78 34 35 35 61 31 34 65 64 2c 20 32  8]+0x455a14ed, 2
192e0 30 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53  0);.        MD5S
192f0 54 45 50 28 46 32 2c 20 61 2c 20 62 2c 20 63 2c  TEP(F2, a, b, c,
19300 20 64 2c 20 69 6e 5b 31 33 5d 2b 30 78 61 39 65   d, in[13]+0xa9e
19310 33 65 39 30 35 2c 20 20 35 29 3b 0a 20 20 20 20  3e905,  5);.    
19320 20 20 20 20 4d 44 35 53 54 45 50 28 46 32 2c 20      MD5STEP(F2, 
19330 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e 5b 20  d, a, b, c, in[ 
19340 32 5d 2b 30 78 66 63 65 66 61 33 66 38 2c 20 20  2]+0xfcefa3f8,  
19350 39 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53  9);.        MD5S
19360 54 45 50 28 46 32 2c 20 63 2c 20 64 2c 20 61 2c  TEP(F2, c, d, a,
19370 20 62 2c 20 69 6e 5b 20 37 5d 2b 30 78 36 37 36   b, in[ 7]+0x676
19380 66 30 32 64 39 2c 20 31 34 29 3b 0a 20 20 20 20  f02d9, 14);.    
19390 20 20 20 20 4d 44 35 53 54 45 50 28 46 32 2c 20      MD5STEP(F2, 
193a0 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e 5b 31  b, c, d, a, in[1
193b0 32 5d 2b 30 78 38 64 32 61 34 63 38 61 2c 20 32  2]+0x8d2a4c8a, 2
193c0 30 29 3b 0a 0a 20 20 20 20 20 20 20 20 4d 44 35  0);..        MD5
193d0 53 54 45 50 28 46 33 2c 20 61 2c 20 62 2c 20 63  STEP(F3, a, b, c
193e0 2c 20 64 2c 20 69 6e 5b 20 35 5d 2b 30 78 66 66  , d, in[ 5]+0xff
193f0 66 61 33 39 34 32 2c 20 20 34 29 3b 0a 20 20 20  fa3942,  4);.   
19400 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 33 2c       MD5STEP(F3,
19410 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e 5b   d, a, b, c, in[
19420 20 38 5d 2b 30 78 38 37 37 31 66 36 38 31 2c 20   8]+0x8771f681, 
19430 31 31 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35  11);.        MD5
19440 53 54 45 50 28 46 33 2c 20 63 2c 20 64 2c 20 61  STEP(F3, c, d, a
19450 2c 20 62 2c 20 69 6e 5b 31 31 5d 2b 30 78 36 64  , b, in[11]+0x6d
19460 39 64 36 31 32 32 2c 20 31 36 29 3b 0a 20 20 20  9d6122, 16);.   
19470 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 33 2c       MD5STEP(F3,
19480 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e 5b   b, c, d, a, in[
19490 31 34 5d 2b 30 78 66 64 65 35 33 38 30 63 2c 20  14]+0xfde5380c, 
194a0 32 33 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35  23);.        MD5
194b0 53 54 45 50 28 46 33 2c 20 61 2c 20 62 2c 20 63  STEP(F3, a, b, c
194c0 2c 20 64 2c 20 69 6e 5b 20 31 5d 2b 30 78 61 34  , d, in[ 1]+0xa4
194d0 62 65 65 61 34 34 2c 20 20 34 29 3b 0a 20 20 20  beea44,  4);.   
194e0 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 33 2c       MD5STEP(F3,
194f0 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e 5b   d, a, b, c, in[
19500 20 34 5d 2b 30 78 34 62 64 65 63 66 61 39 2c 20   4]+0x4bdecfa9, 
19510 31 31 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35  11);.        MD5
19520 53 54 45 50 28 46 33 2c 20 63 2c 20 64 2c 20 61  STEP(F3, c, d, a
19530 2c 20 62 2c 20 69 6e 5b 20 37 5d 2b 30 78 66 36  , b, in[ 7]+0xf6
19540 62 62 34 62 36 30 2c 20 31 36 29 3b 0a 20 20 20  bb4b60, 16);.   
19550 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 33 2c       MD5STEP(F3,
19560 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e 5b   b, c, d, a, in[
19570 31 30 5d 2b 30 78 62 65 62 66 62 63 37 30 2c 20  10]+0xbebfbc70, 
19580 32 33 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35  23);.        MD5
19590 53 54 45 50 28 46 33 2c 20 61 2c 20 62 2c 20 63  STEP(F3, a, b, c
195a0 2c 20 64 2c 20 69 6e 5b 31 33 5d 2b 30 78 32 38  , d, in[13]+0x28
195b0 39 62 37 65 63 36 2c 20 20 34 29 3b 0a 20 20 20  9b7ec6,  4);.   
195c0 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 33 2c       MD5STEP(F3,
195d0 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e 5b   d, a, b, c, in[
195e0 20 30 5d 2b 30 78 65 61 61 31 32 37 66 61 2c 20   0]+0xeaa127fa, 
195f0 31 31 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35  11);.        MD5
19600 53 54 45 50 28 46 33 2c 20 63 2c 20 64 2c 20 61  STEP(F3, c, d, a
19610 2c 20 62 2c 20 69 6e 5b 20 33 5d 2b 30 78 64 34  , b, in[ 3]+0xd4
19620 65 66 33 30 38 35 2c 20 31 36 29 3b 0a 20 20 20  ef3085, 16);.   
19630 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 33 2c       MD5STEP(F3,
19640 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e 5b   b, c, d, a, in[
19650 20 36 5d 2b 30 78 30 34 38 38 31 64 30 35 2c 20   6]+0x04881d05, 
19660 32 33 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35  23);.        MD5
19670 53 54 45 50 28 46 33 2c 20 61 2c 20 62 2c 20 63  STEP(F3, a, b, c
19680 2c 20 64 2c 20 69 6e 5b 20 39 5d 2b 30 78 64 39  , d, in[ 9]+0xd9
19690 64 34 64 30 33 39 2c 20 20 34 29 3b 0a 20 20 20  d4d039,  4);.   
196a0 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 33 2c       MD5STEP(F3,
196b0 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e 5b   d, a, b, c, in[
196c0 31 32 5d 2b 30 78 65 36 64 62 39 39 65 35 2c 20  12]+0xe6db99e5, 
196d0 31 31 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35  11);.        MD5
196e0 53 54 45 50 28 46 33 2c 20 63 2c 20 64 2c 20 61  STEP(F3, c, d, a
196f0 2c 20 62 2c 20 69 6e 5b 31 35 5d 2b 30 78 31 66  , b, in[15]+0x1f
19700 61 32 37 63 66 38 2c 20 31 36 29 3b 0a 20 20 20  a27cf8, 16);.   
19710 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 33 2c       MD5STEP(F3,
19720 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e 5b   b, c, d, a, in[
19730 20 32 5d 2b 30 78 63 34 61 63 35 36 36 35 2c 20   2]+0xc4ac5665, 
19740 32 33 29 3b 0a 0a 20 20 20 20 20 20 20 20 4d 44  23);..        MD
19750 35 53 54 45 50 28 46 34 2c 20 61 2c 20 62 2c 20  5STEP(F4, a, b, 
19760 63 2c 20 64 2c 20 69 6e 5b 20 30 5d 2b 30 78 66  c, d, in[ 0]+0xf
19770 34 32 39 32 32 34 34 2c 20 20 36 29 3b 0a 20 20  4292244,  6);.  
19780 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 34        MD5STEP(F4
19790 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e  , d, a, b, c, in
197a0 5b 20 37 5d 2b 30 78 34 33 32 61 66 66 39 37 2c  [ 7]+0x432aff97,
197b0 20 31 30 29 3b 0a 20 20 20 20 20 20 20 20 4d 44   10);.        MD
197c0 35 53 54 45 50 28 46 34 2c 20 63 2c 20 64 2c 20  5STEP(F4, c, d, 
197d0 61 2c 20 62 2c 20 69 6e 5b 31 34 5d 2b 30 78 61  a, b, in[14]+0xa
197e0 62 39 34 32 33 61 37 2c 20 31 35 29 3b 0a 20 20  b9423a7, 15);.  
197f0 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 34        MD5STEP(F4
19800 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e  , b, c, d, a, in
19810 5b 20 35 5d 2b 30 78 66 63 39 33 61 30 33 39 2c  [ 5]+0xfc93a039,
19820 20 32 31 29 3b 0a 20 20 20 20 20 20 20 20 4d 44   21);.        MD
19830 35 53 54 45 50 28 46 34 2c 20 61 2c 20 62 2c 20  5STEP(F4, a, b, 
19840 63 2c 20 64 2c 20 69 6e 5b 31 32 5d 2b 30 78 36  c, d, in[12]+0x6
19850 35 35 62 35 39 63 33 2c 20 20 36 29 3b 0a 20 20  55b59c3,  6);.  
19860 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 34        MD5STEP(F4
19870 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e  , d, a, b, c, in
19880 5b 20 33 5d 2b 30 78 38 66 30 63 63 63 39 32 2c  [ 3]+0x8f0ccc92,
19890 20 31 30 29 3b 0a 20 20 20 20 20 20 20 20 4d 44   10);.        MD
198a0 35 53 54 45 50 28 46 34 2c 20 63 2c 20 64 2c 20  5STEP(F4, c, d, 
198b0 61 2c 20 62 2c 20 69 6e 5b 31 30 5d 2b 30 78 66  a, b, in[10]+0xf
198c0 66 65 66 66 34 37 64 2c 20 31 35 29 3b 0a 20 20  feff47d, 15);.  
198d0 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 34        MD5STEP(F4
198e0 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e  , b, c, d, a, in
198f0 5b 20 31 5d 2b 30 78 38 35 38 34 35 64 64 31 2c  [ 1]+0x85845dd1,
19900 20 32 31 29 3b 0a 20 20 20 20 20 20 20 20 4d 44   21);.        MD
19910 35 53 54 45 50 28 46 34 2c 20 61 2c 20 62 2c 20  5STEP(F4, a, b, 
19920 63 2c 20 64 2c 20 69 6e 5b 20 38 5d 2b 30 78 36  c, d, in[ 8]+0x6
19930 66 61 38 37 65 34 66 2c 20 20 36 29 3b 0a 20 20  fa87e4f,  6);.  
19940 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 34        MD5STEP(F4
19950 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e  , d, a, b, c, in
19960 5b 31 35 5d 2b 30 78 66 65 32 63 65 36 65 30 2c  [15]+0xfe2ce6e0,
19970 20 31 30 29 3b 0a 20 20 20 20 20 20 20 20 4d 44   10);.        MD
19980 35 53 54 45 50 28 46 34 2c 20 63 2c 20 64 2c 20  5STEP(F4, c, d, 
19990 61 2c 20 62 2c 20 69 6e 5b 20 36 5d 2b 30 78 61  a, b, in[ 6]+0xa
199a0 33 30 31 34 33 31 34 2c 20 31 35 29 3b 0a 20 20  3014314, 15);.  
199b0 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 34        MD5STEP(F4
199c0 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e  , b, c, d, a, in
199d0 5b 31 33 5d 2b 30 78 34 65 30 38 31 31 61 31 2c  [13]+0x4e0811a1,
199e0 20 32 31 29 3b 0a 20 20 20 20 20 20 20 20 4d 44   21);.        MD
199f0 35 53 54 45 50 28 46 34 2c 20 61 2c 20 62 2c 20  5STEP(F4, a, b, 
19a00 63 2c 20 64 2c 20 69 6e 5b 20 34 5d 2b 30 78 66  c, d, in[ 4]+0xf
19a10 37 35 33 37 65 38 32 2c 20 20 36 29 3b 0a 20 20  7537e82,  6);.  
19a20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 34        MD5STEP(F4
19a30 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e  , d, a, b, c, in
19a40 5b 31 31 5d 2b 30 78 62 64 33 61 66 32 33 35 2c  [11]+0xbd3af235,
19a50 20 31 30 29 3b 0a 20 20 20 20 20 20 20 20 4d 44   10);.        MD
19a60 35 53 54 45 50 28 46 34 2c 20 63 2c 20 64 2c 20  5STEP(F4, c, d, 
19a70 61 2c 20 62 2c 20 69 6e 5b 20 32 5d 2b 30 78 32  a, b, in[ 2]+0x2
19a80 61 64 37 64 32 62 62 2c 20 31 35 29 3b 0a 20 20  ad7d2bb, 15);.  
19a90 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 34        MD5STEP(F4
19aa0 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e  , b, c, d, a, in
19ab0 5b 20 39 5d 2b 30 78 65 62 38 36 64 33 39 31 2c  [ 9]+0xeb86d391,
19ac0 20 32 31 29 3b 0a 0a 20 20 20 20 20 20 20 20 62   21);..        b
19ad0 75 66 5b 30 5d 20 2b 3d 20 61 3b 0a 20 20 20 20  uf[0] += a;.    
19ae0 20 20 20 20 62 75 66 5b 31 5d 20 2b 3d 20 62 3b      buf[1] += b;
19af0 0a 20 20 20 20 20 20 20 20 62 75 66 5b 32 5d 20  .        buf[2] 
19b00 2b 3d 20 63 3b 0a 20 20 20 20 20 20 20 20 62 75  += c;.        bu
19b10 66 5b 33 5d 20 2b 3d 20 64 3b 0a 7d 0a 0a 2f 2a  f[3] += d;.}../*
19b20 0a 20 2a 20 53 74 61 72 74 20 4d 44 35 20 61 63  . * Start MD5 ac
19b30 63 75 6d 75 6c 61 74 69 6f 6e 2e 20 20 53 65 74  cumulation.  Set
19b40 20 62 69 74 20 63 6f 75 6e 74 20 74 6f 20 30 20   bit count to 0 
19b50 61 6e 64 20 62 75 66 66 65 72 20 74 6f 20 6d 79  and buffer to my
19b60 73 74 65 72 69 6f 75 73 0a 20 2a 20 69 6e 69 74  sterious. * init
19b70 69 61 6c 69 7a 61 74 69 6f 6e 20 63 6f 6e 73 74  ialization const
19b80 61 6e 74 73 2e 0a 20 2a 2f 0a 73 74 61 74 69 63  ants.. */.static
19b90 20 76 6f 69 64 20 4d 44 35 49 6e 69 74 28 4d 44   void MD5Init(MD
19ba0 35 43 6f 6e 74 65 78 74 20 2a 63 74 78 29 7b 0a  5Context *ctx){.
19bb0 20 20 20 20 20 20 20 20 63 74 78 2d 3e 69 73 49          ctx->isI
19bc0 6e 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  nit = 1;.       
19bd0 20 63 74 78 2d 3e 62 75 66 5b 30 5d 20 3d 20 30   ctx->buf[0] = 0
19be0 78 36 37 34 35 32 33 30 31 3b 0a 20 20 20 20 20  x67452301;.     
19bf0 20 20 20 63 74 78 2d 3e 62 75 66 5b 31 5d 20 3d     ctx->buf[1] =
19c00 20 30 78 65 66 63 64 61 62 38 39 3b 0a 20 20 20   0xefcdab89;.   
19c10 20 20 20 20 20 63 74 78 2d 3e 62 75 66 5b 32 5d       ctx->buf[2]
19c20 20 3d 20 30 78 39 38 62 61 64 63 66 65 3b 0a 20   = 0x98badcfe;. 
19c30 20 20 20 20 20 20 20 63 74 78 2d 3e 62 75 66 5b         ctx->buf[
19c40 33 5d 20 3d 20 30 78 31 30 33 32 35 34 37 36 3b  3] = 0x10325476;
19c50 0a 20 20 20 20 20 20 20 20 63 74 78 2d 3e 62 69  .        ctx->bi
19c60 74 73 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 20  ts[0] = 0;.     
19c70 20 20 20 63 74 78 2d 3e 62 69 74 73 5b 31 5d 20     ctx->bits[1] 
19c80 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 55 70  = 0;.}../*. * Up
19c90 64 61 74 65 20 63 6f 6e 74 65 78 74 20 74 6f 20  date context to 
19ca0 72 65 66 6c 65 63 74 20 74 68 65 20 63 6f 6e 63  reflect the conc
19cb0 61 74 65 6e 61 74 69 6f 6e 20 6f 66 20 61 6e 6f  atenation of ano
19cc0 74 68 65 72 20 62 75 66 66 65 72 20 66 75 6c 6c  ther buffer full
19cd0 0a 20 2a 20 6f 66 20 62 79 74 65 73 2e 0a 20 2a  . * of bytes.. *
19ce0 2f 0a 73 74 61 74 69 63 20 0a 76 6f 69 64 20 4d  /.static .void M
19cf0 44 35 55 70 64 61 74 65 28 4d 44 35 43 6f 6e 74  D5Update(MD5Cont
19d00 65 78 74 20 2a 63 74 78 2c 20 63 6f 6e 73 74 20  ext *ctx, const 
19d10 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62  unsigned char *b
19d20 75 66 2c 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  uf, unsigned int
19d30 20 6c 65 6e 29 7b 0a 20 20 20 20 20 20 20 20 75   len){.        u
19d40 69 6e 74 33 32 20 74 3b 0a 0a 20 20 20 20 20 20  int32 t;..      
19d50 20 20 2f 2a 20 55 70 64 61 74 65 20 62 69 74 63    /* Update bitc
19d60 6f 75 6e 74 20 2a 2f 0a 0a 20 20 20 20 20 20 20  ount */..       
19d70 20 74 20 3d 20 63 74 78 2d 3e 62 69 74 73 5b 30   t = ctx->bits[0
19d80 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 20 28 28  ];.        if ((
19d90 63 74 78 2d 3e 62 69 74 73 5b 30 5d 20 3d 20 74  ctx->bits[0] = t
19da0 20 2b 20 28 28 75 69 6e 74 33 32 29 6c 65 6e 20   + ((uint32)len 
19db0 3c 3c 20 33 29 29 20 3c 20 74 29 0a 20 20 20 20  << 3)) < t).    
19dc0 20 20 20 20 20 20 20 20 20 20 20 20 63 74 78 2d              ctx-
19dd0 3e 62 69 74 73 5b 31 5d 2b 2b 3b 20 2f 2a 20 43  >bits[1]++; /* C
19de0 61 72 72 79 20 66 72 6f 6d 20 6c 6f 77 20 74 6f  arry from low to
19df0 20 68 69 67 68 20 2a 2f 0a 20 20 20 20 20 20 20   high */.       
19e00 20 63 74 78 2d 3e 62 69 74 73 5b 31 5d 20 2b 3d   ctx->bits[1] +=
19e10 20 6c 65 6e 20 3e 3e 20 32 39 3b 0a 0a 20 20 20   len >> 29;..   
19e20 20 20 20 20 20 74 20 3d 20 28 74 20 3e 3e 20 33       t = (t >> 3
19e30 29 20 26 20 30 78 33 66 3b 20 20 20 20 2f 2a 20  ) & 0x3f;    /* 
19e40 42 79 74 65 73 20 61 6c 72 65 61 64 79 20 69 6e  Bytes already in
19e50 20 73 68 73 49 6e 66 6f 2d 3e 64 61 74 61 20 2a   shsInfo->data *
19e60 2f 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 48 61  /..        /* Ha
19e70 6e 64 6c 65 20 61 6e 79 20 6c 65 61 64 69 6e 67  ndle any leading
19e80 20 6f 64 64 2d 73 69 7a 65 64 20 63 68 75 6e 6b   odd-sized chunk
19e90 73 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 69 66  s */..        if
19ea0 20 28 20 74 20 29 20 7b 0a 20 20 20 20 20 20 20   ( t ) {.       
19eb0 20 20 20 20 20 20 20 20 20 75 6e 73 69 67 6e 65           unsigne
19ec0 64 20 63 68 61 72 20 2a 70 20 3d 20 28 75 6e 73  d char *p = (uns
19ed0 69 67 6e 65 64 20 63 68 61 72 20 2a 29 63 74 78  igned char *)ctx
19ee0 2d 3e 69 6e 20 2b 20 74 3b 0a 0a 20 20 20 20 20  ->in + t;..     
19ef0 20 20 20 20 20 20 20 20 20 20 20 74 20 3d 20 36             t = 6
19f00 34 2d 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20  4-t;.           
19f10 20 20 20 20 20 69 66 20 28 6c 65 6e 20 3c 20 74       if (len < t
19f20 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
19f30 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63              memc
19f40 70 79 28 70 2c 20 62 75 66 2c 20 6c 65 6e 29 3b  py(p, buf, len);
19f50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
19f60 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b           return;
19f70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
19f80 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
19f90 20 20 20 6d 65 6d 63 70 79 28 70 2c 20 62 75 66     memcpy(p, buf
19fa0 2c 20 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , t);.          
19fb0 20 20 20 20 20 20 62 79 74 65 52 65 76 65 72 73        byteRevers
19fc0 65 28 63 74 78 2d 3e 69 6e 2c 20 31 36 29 3b 0a  e(ctx->in, 16);.
19fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19fe0 4d 44 35 54 72 61 6e 73 66 6f 72 6d 28 63 74 78  MD5Transform(ctx
19ff0 2d 3e 62 75 66 2c 20 28 75 69 6e 74 33 32 20 2a  ->buf, (uint32 *
1a000 29 63 74 78 2d 3e 69 6e 29 3b 0a 20 20 20 20 20  )ctx->in);.     
1a010 20 20 20 20 20 20 20 20 20 20 20 62 75 66 20 2b             buf +
1a020 3d 20 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = t;.           
1a030 20 20 20 20 20 6c 65 6e 20 2d 3d 20 74 3b 0a 20       len -= t;. 
1a040 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
1a050 20 20 2f 2a 20 50 72 6f 63 65 73 73 20 64 61 74    /* Process dat
1a060 61 20 69 6e 20 36 34 2d 62 79 74 65 20 63 68 75  a in 64-byte chu
1a070 6e 6b 73 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20  nks */..        
1a080 77 68 69 6c 65 20 28 6c 65 6e 20 3e 3d 20 36 34  while (len >= 64
1a090 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
1a0a0 20 20 20 20 6d 65 6d 63 70 79 28 63 74 78 2d 3e      memcpy(ctx->
1a0b0 69 6e 2c 20 62 75 66 2c 20 36 34 29 3b 0a 20 20  in, buf, 64);.  
1a0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 79                by
1a0d0 74 65 52 65 76 65 72 73 65 28 63 74 78 2d 3e 69  teReverse(ctx->i
1a0e0 6e 2c 20 31 36 29 3b 0a 20 20 20 20 20 20 20 20  n, 16);.        
1a0f0 20 20 20 20 20 20 20 20 4d 44 35 54 72 61 6e 73          MD5Trans
1a100 66 6f 72 6d 28 63 74 78 2d 3e 62 75 66 2c 20 28  form(ctx->buf, (
1a110 75 69 6e 74 33 32 20 2a 29 63 74 78 2d 3e 69 6e  uint32 *)ctx->in
1a120 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
1a130 20 20 20 62 75 66 20 2b 3d 20 36 34 3b 0a 20 20     buf += 64;.  
1a140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 65                le
1a150 6e 20 2d 3d 20 36 34 3b 0a 20 20 20 20 20 20 20  n -= 64;.       
1a160 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 48   }..        /* H
1a170 61 6e 64 6c 65 20 61 6e 79 20 72 65 6d 61 69 6e  andle any remain
1a180 69 6e 67 20 62 79 74 65 73 20 6f 66 20 64 61 74  ing bytes of dat
1a190 61 2e 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 6d  a. */..        m
1a1a0 65 6d 63 70 79 28 63 74 78 2d 3e 69 6e 2c 20 62  emcpy(ctx->in, b
1a1b0 75 66 2c 20 6c 65 6e 29 3b 0a 7d 0a 0a 2f 2a 0a  uf, len);.}../*.
1a1c0 20 2a 20 46 69 6e 61 6c 20 77 72 61 70 75 70 20   * Final wrapup 
1a1d0 2d 20 70 61 64 20 74 6f 20 36 34 2d 62 79 74 65  - pad to 64-byte
1a1e0 20 62 6f 75 6e 64 61 72 79 20 77 69 74 68 20 74   boundary with t
1a1f0 68 65 20 62 69 74 20 70 61 74 74 65 72 6e 20 0a  he bit pattern .
1a200 20 2a 20 31 20 30 2a 20 28 36 34 2d 62 69 74 20   * 1 0* (64-bit 
1a210 63 6f 75 6e 74 20 6f 66 20 62 69 74 73 20 70 72  count of bits pr
1a220 6f 63 65 73 73 65 64 2c 20 4d 53 42 2d 66 69 72  ocessed, MSB-fir
1a230 73 74 29 0a 20 2a 2f 0a 73 74 61 74 69 63 20 76  st). */.static v
1a240 6f 69 64 20 4d 44 35 46 69 6e 61 6c 28 75 6e 73  oid MD5Final(uns
1a250 69 67 6e 65 64 20 63 68 61 72 20 64 69 67 65 73  igned char diges
1a260 74 5b 31 36 5d 2c 20 4d 44 35 43 6f 6e 74 65 78  t[16], MD5Contex
1a270 74 20 2a 63 74 78 29 7b 0a 20 20 20 20 20 20 20  t *ctx){.       
1a280 20 75 6e 73 69 67 6e 65 64 20 63 6f 75 6e 74 3b   unsigned count;
1a290 0a 20 20 20 20 20 20 20 20 75 6e 73 69 67 6e 65  .        unsigne
1a2a0 64 20 63 68 61 72 20 2a 70 3b 0a 0a 20 20 20 20  d char *p;..    
1a2b0 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 6e      /* Compute n
1a2c0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6d  umber of bytes m
1a2d0 6f 64 20 36 34 20 2a 2f 0a 20 20 20 20 20 20 20  od 64 */.       
1a2e0 20 63 6f 75 6e 74 20 3d 20 28 63 74 78 2d 3e 62   count = (ctx->b
1a2f0 69 74 73 5b 30 5d 20 3e 3e 20 33 29 20 26 20 30  its[0] >> 3) & 0
1a300 78 33 46 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a  x3F;..        /*
1a310 20 53 65 74 20 74 68 65 20 66 69 72 73 74 20 63   Set the first c
1a320 68 61 72 20 6f 66 20 70 61 64 64 69 6e 67 20 74  har of padding t
1a330 6f 20 30 78 38 30 2e 20 20 54 68 69 73 20 69 73  o 0x80.  This is
1a340 20 73 61 66 65 20 73 69 6e 63 65 20 74 68 65 72   safe since ther
1a350 65 20 69 73 0a 20 20 20 20 20 20 20 20 20 20 20  e is.           
1a360 61 6c 77 61 79 73 20 61 74 20 6c 65 61 73 74 20  always at least 
1a370 6f 6e 65 20 62 79 74 65 20 66 72 65 65 20 2a 2f  one byte free */
1a380 0a 20 20 20 20 20 20 20 20 70 20 3d 20 63 74 78  .        p = ctx
1a390 2d 3e 69 6e 20 2b 20 63 6f 75 6e 74 3b 0a 20 20  ->in + count;.  
1a3a0 20 20 20 20 20 20 2a 70 2b 2b 20 3d 20 30 78 38        *p++ = 0x8
1a3b0 30 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 42  0;..        /* B
1a3c0 79 74 65 73 20 6f 66 20 70 61 64 64 69 6e 67 20  ytes of padding 
1a3d0 6e 65 65 64 65 64 20 74 6f 20 6d 61 6b 65 20 36  needed to make 6
1a3e0 34 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 20  4 bytes */.     
1a3f0 20 20 20 63 6f 75 6e 74 20 3d 20 36 34 20 2d 20     count = 64 - 
1a400 31 20 2d 20 63 6f 75 6e 74 3b 0a 0a 20 20 20 20  1 - count;..    
1a410 20 20 20 20 2f 2a 20 50 61 64 20 6f 75 74 20 74      /* Pad out t
1a420 6f 20 35 36 20 6d 6f 64 20 36 34 20 2a 2f 0a 20  o 56 mod 64 */. 
1a430 20 20 20 20 20 20 20 69 66 20 28 63 6f 75 6e 74         if (count
1a440 20 3c 20 38 29 20 7b 0a 20 20 20 20 20 20 20 20   < 8) {.        
1a450 20 20 20 20 20 20 20 20 2f 2a 20 54 77 6f 20 6c          /* Two l
1a460 6f 74 73 20 6f 66 20 70 61 64 64 69 6e 67 3a 20  ots of padding: 
1a470 20 50 61 64 20 74 68 65 20 66 69 72 73 74 20 62   Pad the first b
1a480 6c 6f 63 6b 20 74 6f 20 36 34 20 62 79 74 65 73  lock to 64 bytes
1a490 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
1a4a0 20 20 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c      memset(p, 0,
1a4b0 20 63 6f 75 6e 74 29 3b 0a 20 20 20 20 20 20 20   count);.       
1a4c0 20 20 20 20 20 20 20 20 20 62 79 74 65 52 65 76           byteRev
1a4d0 65 72 73 65 28 63 74 78 2d 3e 69 6e 2c 20 31 36  erse(ctx->in, 16
1a4e0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
1a4f0 20 20 20 4d 44 35 54 72 61 6e 73 66 6f 72 6d 28     MD5Transform(
1a500 63 74 78 2d 3e 62 75 66 2c 20 28 75 69 6e 74 33  ctx->buf, (uint3
1a510 32 20 2a 29 63 74 78 2d 3e 69 6e 29 3b 0a 0a 20  2 *)ctx->in);.. 
1a520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1a530 2a 20 4e 6f 77 20 66 69 6c 6c 20 74 68 65 20 6e  * Now fill the n
1a540 65 78 74 20 62 6c 6f 63 6b 20 77 69 74 68 20 35  ext block with 5
1a550 36 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 20  6 bytes */.     
1a560 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 73 65             memse
1a570 74 28 63 74 78 2d 3e 69 6e 2c 20 30 2c 20 35 36  t(ctx->in, 0, 56
1a580 29 3b 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73  );.        } els
1a590 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e {.            
1a5a0 20 20 20 20 2f 2a 20 50 61 64 20 62 6c 6f 63 6b      /* Pad block
1a5b0 20 74 6f 20 35 36 20 62 79 74 65 73 20 2a 2f 0a   to 56 bytes */.
1a5c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a5d0 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 63 6f 75  memset(p, 0, cou
1a5e0 6e 74 2d 38 29 3b 0a 20 20 20 20 20 20 20 20 7d  nt-8);.        }
1a5f0 0a 20 20 20 20 20 20 20 20 62 79 74 65 52 65 76  .        byteRev
1a600 65 72 73 65 28 63 74 78 2d 3e 69 6e 2c 20 31 34  erse(ctx->in, 14
1a610 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 41  );..        /* A
1a620 70 70 65 6e 64 20 6c 65 6e 67 74 68 20 69 6e 20  ppend length in 
1a630 62 69 74 73 20 61 6e 64 20 74 72 61 6e 73 66 6f  bits and transfo
1a640 72 6d 20 2a 2f 0a 20 20 20 20 20 20 20 20 28 28  rm */.        ((
1a650 75 69 6e 74 33 32 20 2a 29 63 74 78 2d 3e 69 6e  uint32 *)ctx->in
1a660 29 5b 20 31 34 20 5d 20 3d 20 63 74 78 2d 3e 62  )[ 14 ] = ctx->b
1a670 69 74 73 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20  its[0];.        
1a680 28 28 75 69 6e 74 33 32 20 2a 29 63 74 78 2d 3e  ((uint32 *)ctx->
1a690 69 6e 29 5b 20 31 35 20 5d 20 3d 20 63 74 78 2d  in)[ 15 ] = ctx-
1a6a0 3e 62 69 74 73 5b 31 5d 3b 0a 0a 20 20 20 20 20  >bits[1];..     
1a6b0 20 20 20 4d 44 35 54 72 61 6e 73 66 6f 72 6d 28     MD5Transform(
1a6c0 63 74 78 2d 3e 62 75 66 2c 20 28 75 69 6e 74 33  ctx->buf, (uint3
1a6d0 32 20 2a 29 63 74 78 2d 3e 69 6e 29 3b 0a 20 20  2 *)ctx->in);.  
1a6e0 20 20 20 20 20 20 62 79 74 65 52 65 76 65 72 73        byteRevers
1a6f0 65 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  e((unsigned char
1a700 20 2a 29 63 74 78 2d 3e 62 75 66 2c 20 34 29 3b   *)ctx->buf, 4);
1a710 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
1a720 64 69 67 65 73 74 2c 20 63 74 78 2d 3e 62 75 66  digest, ctx->buf
1a730 2c 20 31 36 29 3b 0a 20 20 20 20 20 20 20 20 6d  , 16);.        m
1a740 65 6d 73 65 74 28 63 74 78 2c 20 30 2c 20 73 69  emset(ctx, 0, si
1a750 7a 65 6f 66 28 63 74 78 29 29 3b 20 20 20 20 2f  zeof(ctx));    /
1a760 2a 20 49 6e 20 63 61 73 65 20 69 74 20 69 73 20  * In case it is 
1a770 73 65 6e 73 69 74 69 76 65 20 2a 2f 0a 7d 0a 0a  sensitive */.}..
1a780 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20  /*.** Convert a 
1a790 31 32 38 2d 62 69 74 20 4d 44 35 20 64 69 67 65  128-bit MD5 dige
1a7a0 73 74 20 69 6e 74 6f 20 61 20 33 32 2d 64 69 67  st into a 32-dig
1a7b0 69 74 20 62 61 73 65 2d 31 36 20 6e 75 6d 62 65  it base-16 numbe
1a7c0 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  r..*/.static voi
1a7d0 64 20 4d 44 35 44 69 67 65 73 74 54 6f 42 61 73  d MD5DigestToBas
1a7e0 65 31 36 28 75 6e 73 69 67 6e 65 64 20 63 68 61  e16(unsigned cha
1a7f0 72 20 2a 64 69 67 65 73 74 2c 20 63 68 61 72 20  r *digest, char 
1a800 2a 7a 42 75 66 29 7b 0a 20 20 73 74 61 74 69 63  *zBuf){.  static
1a810 20 63 68 61 72 20 63 6f 6e 73 74 20 7a 45 6e 63   char const zEnc
1a820 6f 64 65 5b 5d 20 3d 20 22 30 31 32 33 34 35 36  ode[] = "0123456
1a830 37 38 39 61 62 63 64 65 66 22 3b 0a 20 20 69 6e  789abcdef";.  in
1a840 74 20 69 2c 20 6a 3b 0a 0a 20 20 66 6f 72 28 6a  t i, j;..  for(j
1a850 3d 69 3d 30 3b 20 69 3c 31 36 3b 20 69 2b 2b 29  =i=0; i<16; i++)
1a860 7b 0a 20 20 20 20 69 6e 74 20 61 20 3d 20 64 69  {.    int a = di
1a870 67 65 73 74 5b 69 5d 3b 0a 20 20 20 20 7a 42 75  gest[i];.    zBu
1a880 66 5b 6a 2b 2b 5d 20 3d 20 7a 45 6e 63 6f 64 65  f[j++] = zEncode
1a890 5b 28 61 3e 3e 34 29 26 30 78 66 5d 3b 0a 20 20  [(a>>4)&0xf];.  
1a8a0 20 20 7a 42 75 66 5b 6a 2b 2b 5d 20 3d 20 7a 45    zBuf[j++] = zE
1a8b0 6e 63 6f 64 65 5b 61 20 26 20 30 78 66 5d 3b 0a  ncode[a & 0xf];.
1a8c0 20 20 7d 0a 20 20 7a 42 75 66 5b 6a 5d 20 3d 20    }.  zBuf[j] = 
1a8d0 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  0;.}.../*.** Con
1a8e0 76 65 72 74 20 61 20 31 32 38 2d 62 69 74 20 4d  vert a 128-bit M
1a8f0 44 35 20 64 69 67 65 73 74 20 69 6e 74 6f 20 73  D5 digest into s
1a900 65 71 75 65 6e 63 79 20 6f 66 20 65 69 67 68 74  equency of eight
1a910 20 35 2d 64 69 67 69 74 20 69 6e 74 65 67 65 72   5-digit integer
1a920 73 0a 2a 2a 20 65 61 63 68 20 72 65 70 72 65 73  s.** each repres
1a930 65 6e 74 69 6e 67 20 31 36 20 62 69 74 73 20 6f  enting 16 bits o
1a940 66 20 74 68 65 20 64 69 67 65 73 74 20 61 6e 64  f the digest and
1a950 20 73 65 70 61 72 61 74 65 64 20 66 72 6f 6d 20   separated from 
1a960 65 61 63 68 0a 2a 2a 20 6f 74 68 65 72 20 62 79  each.** other by
1a970 20 61 20 22 2d 22 20 63 68 61 72 61 63 74 65 72   a "-" character
1a980 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1a990 20 4d 44 35 44 69 67 65 73 74 54 6f 42 61 73 65   MD5DigestToBase
1a9a0 31 30 78 38 28 75 6e 73 69 67 6e 65 64 20 63 68  10x8(unsigned ch
1a9b0 61 72 20 64 69 67 65 73 74 5b 31 36 5d 2c 20 63  ar digest[16], c
1a9c0 68 61 72 20 7a 44 69 67 65 73 74 5b 35 30 5d 29  har zDigest[50])
1a9d0 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20  {.  int i, j;.  
1a9e0 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 78 3b 0a  unsigned int x;.
1a9f0 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 31    for(i=j=0; i<1
1aa00 36 3b 20 69 2b 3d 32 29 7b 0a 20 20 20 20 78 20  6; i+=2){.    x 
1aa10 3d 20 64 69 67 65 73 74 5b 69 5d 2a 32 35 36 20  = digest[i]*256 
1aa20 2b 20 64 69 67 65 73 74 5b 69 2b 31 5d 3b 0a 20  + digest[i+1];. 
1aa30 20 20 20 69 66 28 20 69 3e 30 20 29 20 7a 44 69     if( i>0 ) zDi
1aa40 67 65 73 74 5b 6a 2b 2b 5d 20 3d 20 27 2d 27 3b  gest[j++] = '-';
1aa50 0a 20 20 20 20 73 70 72 69 6e 74 66 28 26 7a 44  .    sprintf(&zD
1aa60 69 67 65 73 74 5b 6a 5d 2c 20 22 25 30 35 75 22  igest[j], "%05u"
1aa70 2c 20 78 29 3b 0a 20 20 20 20 6a 20 2b 3d 20 35  , x);.    j += 5
1aa80 3b 0a 20 20 7d 0a 20 20 7a 44 69 67 65 73 74 5b  ;.  }.  zDigest[
1aa90 6a 5d 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  j] = 0;.}../*.**
1aaa0 20 41 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20 66   A TCL command f
1aab0 6f 72 20 6d 64 35 2e 20 20 54 68 65 20 61 72 67  or md5.  The arg
1aac0 75 6d 65 6e 74 20 69 73 20 74 68 65 20 74 65 78  ument is the tex
1aad0 74 20 74 6f 20 62 65 20 68 61 73 68 65 64 2e 20  t to be hashed. 
1aae0 20 54 68 65 0a 2a 2a 20 52 65 73 75 6c 74 20 69   The.** Result i
1aaf0 73 20 74 68 65 20 68 61 73 68 20 69 6e 20 62 61  s the hash in ba
1ab00 73 65 36 34 2e 20 20 0a 2a 2f 0a 73 74 61 74 69  se64.  .*/.stati
1ab10 63 20 69 6e 74 20 6d 64 35 5f 63 6d 64 28 76 6f  c int md5_cmd(vo
1ab20 69 64 2a 63 64 2c 20 54 63 6c 5f 49 6e 74 65 72  id*cd, Tcl_Inter
1ab30 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 61  p *interp, int a
1ab40 72 67 63 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  rgc, const char 
1ab50 2a 2a 61 72 67 76 29 7b 0a 20 20 4d 44 35 43 6f  **argv){.  MD5Co
1ab60 6e 74 65 78 74 20 63 74 78 3b 0a 20 20 75 6e 73  ntext ctx;.  uns
1ab70 69 67 6e 65 64 20 63 68 61 72 20 64 69 67 65 73  igned char diges
1ab80 74 5b 31 36 5d 3b 0a 20 20 63 68 61 72 20 7a 42  t[16];.  char zB
1ab90 75 66 5b 35 30 5d 3b 0a 20 20 76 6f 69 64 20 28  uf[50];.  void (
1aba0 2a 63 6f 6e 76 65 72 74 65 72 29 28 75 6e 73 69  *converter)(unsi
1abb0 67 6e 65 64 20 63 68 61 72 2a 2c 20 63 68 61 72  gned char*, char
1abc0 2a 29 3b 0a 0a 20 20 69 66 28 20 61 72 67 63 21  *);..  if( argc!
1abd0 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =2 ){.    Tcl_Ap
1abe0 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
1abf0 70 2c 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  p,"wrong # args:
1ac00 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
1ac10 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20  argv[0], .      
1ac20 20 20 22 20 54 45 58 54 5c 22 22 2c 20 30 29 3b    " TEXT\"", 0);
1ac30 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
1ac40 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 4d 44 35  ERROR;.  }.  MD5
1ac50 49 6e 69 74 28 26 63 74 78 29 3b 0a 20 20 4d 44  Init(&ctx);.  MD
1ac60 35 55 70 64 61 74 65 28 26 63 74 78 2c 20 28 75  5Update(&ctx, (u
1ac70 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 61 72  nsigned char*)ar
1ac80 67 76 5b 31 5d 2c 20 28 75 6e 73 69 67 6e 65 64  gv[1], (unsigned
1ac90 29 73 74 72 6c 65 6e 28 61 72 67 76 5b 31 5d 29  )strlen(argv[1])
1aca0 29 3b 0a 20 20 4d 44 35 46 69 6e 61 6c 28 64 69  );.  MD5Final(di
1acb0 67 65 73 74 2c 20 26 63 74 78 29 3b 0a 20 20 63  gest, &ctx);.  c
1acc0 6f 6e 76 65 72 74 65 72 20 3d 20 28 76 6f 69 64  onverter = (void
1acd0 28 2a 29 28 75 6e 73 69 67 6e 65 64 20 63 68 61  (*)(unsigned cha
1ace0 72 2a 2c 63 68 61 72 2a 29 29 63 64 3b 0a 20 20  r*,char*))cd;.  
1acf0 63 6f 6e 76 65 72 74 65 72 28 64 69 67 65 73 74  converter(digest
1ad00 2c 20 7a 42 75 66 29 3b 0a 20 20 54 63 6c 5f 41  , zBuf);.  Tcl_A
1ad10 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
1ad20 72 70 2c 20 7a 42 75 66 2c 20 28 63 68 61 72 2a  rp, zBuf, (char*
1ad30 29 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  )0);.  return TC
1ad40 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  L_OK;.}../*.** A
1ad50 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20 74 6f 20   TCL command to 
1ad60 74 61 6b 65 20 74 68 65 20 6d 64 35 20 68 61 73  take the md5 has
1ad70 68 20 6f 66 20 61 20 66 69 6c 65 2e 20 20 54 68  h of a file.  Th
1ad80 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68  e argument is th
1ad90 65 0a 2a 2a 20 6e 61 6d 65 20 6f 66 20 74 68 65  e.** name of the
1ada0 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   file..*/.static
1adb0 20 69 6e 74 20 6d 64 35 66 69 6c 65 5f 63 6d 64   int md5file_cmd
1adc0 28 76 6f 69 64 2a 63 64 2c 20 54 63 6c 5f 49 6e  (void*cd, Tcl_In
1add0 74 65 72 70 2a 69 6e 74 65 72 70 2c 20 69 6e 74  terp*interp, int
1ade0 20 61 72 67 63 2c 20 63 6f 6e 73 74 20 63 68 61   argc, const cha
1adf0 72 20 2a 2a 61 72 67 76 29 7b 0a 20 20 46 49 4c  r **argv){.  FIL
1ae00 45 20 2a 69 6e 3b 0a 20 20 4d 44 35 43 6f 6e 74  E *in;.  MD5Cont
1ae10 65 78 74 20 63 74 78 3b 0a 20 20 76 6f 69 64 20  ext ctx;.  void 
1ae20 28 2a 63 6f 6e 76 65 72 74 65 72 29 28 75 6e 73  (*converter)(uns
1ae30 69 67 6e 65 64 20 63 68 61 72 2a 2c 20 63 68 61  igned char*, cha
1ae40 72 2a 29 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  r*);.  unsigned 
1ae50 63 68 61 72 20 64 69 67 65 73 74 5b 31 36 5d 3b  char digest[16];
1ae60 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 31 30 32  .  char zBuf[102
1ae70 34 30 5d 3b 0a 0a 20 20 69 66 28 20 61 72 67 63  40];..  if( argc
1ae80 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=2 ){.    Tcl_A
1ae90 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
1aea0 72 70 2c 22 77 72 6f 6e 67 20 23 20 61 72 67 73  rp,"wrong # args
1aeb0 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
1aec0 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20   argv[0], .     
1aed0 20 20 20 22 20 46 49 4c 45 4e 41 4d 45 5c 22 22     " FILENAME\""
1aee0 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
1aef0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
1af00 20 20 69 6e 20 3d 20 66 6f 70 65 6e 28 61 72 67    in = fopen(arg
1af10 76 5b 31 5d 2c 22 72 62 22 29 3b 0a 20 20 69 66  v[1],"rb");.  if
1af20 28 20 69 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 54  ( in==0 ){.    T
1af30 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
1af40 69 6e 74 65 72 70 2c 22 75 6e 61 62 6c 65 20 74  interp,"unable t
1af50 6f 20 6f 70 65 6e 20 66 69 6c 65 20 5c 22 22 2c  o open file \"",
1af60 20 61 72 67 76 5b 31 5d 2c 20 0a 20 20 20 20 20   argv[1], .     
1af70 20 20 20 20 22 5c 22 20 66 6f 72 20 72 65 61 64      "\" for read
1af80 69 6e 67 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  ing", 0);.    re
1af90 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1afa0 20 20 7d 0a 20 20 4d 44 35 49 6e 69 74 28 26 63    }.  MD5Init(&c
1afb0 74 78 29 3b 0a 20 20 66 6f 72 28 3b 3b 29 7b 0a  tx);.  for(;;){.
1afc0 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 6e      int n;.    n
1afd0 20 3d 20 66 72 65 61 64 28 7a 42 75 66 2c 20 31   = fread(zBuf, 1
1afe0 2c 20 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c 20  , sizeof(zBuf), 
1aff0 69 6e 29 3b 0a 20 20 20 20 69 66 28 20 6e 3c 3d  in);.    if( n<=
1b000 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 4d  0 ) break;.    M
1b010 44 35 55 70 64 61 74 65 28 26 63 74 78 2c 20 28  D5Update(&ctx, (
1b020 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 7a  unsigned char*)z
1b030 42 75 66 2c 20 28 75 6e 73 69 67 6e 65 64 29 6e  Buf, (unsigned)n
1b040 29 3b 0a 20 20 7d 0a 20 20 66 63 6c 6f 73 65 28  );.  }.  fclose(
1b050 69 6e 29 3b 0a 20 20 4d 44 35 46 69 6e 61 6c 28  in);.  MD5Final(
1b060 64 69 67 65 73 74 2c 20 26 63 74 78 29 3b 0a 20  digest, &ctx);. 
1b070 20 63 6f 6e 76 65 72 74 65 72 20 3d 20 28 76 6f   converter = (vo
1b080 69 64 28 2a 29 28 75 6e 73 69 67 6e 65 64 20 63  id(*)(unsigned c
1b090 68 61 72 2a 2c 63 68 61 72 2a 29 29 63 64 3b 0a  har*,char*))cd;.
1b0a0 20 20 63 6f 6e 76 65 72 74 65 72 28 64 69 67 65    converter(dige
1b0b0 73 74 2c 20 7a 42 75 66 29 3b 0a 20 20 54 63 6c  st, zBuf);.  Tcl
1b0c0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
1b0d0 74 65 72 70 2c 20 7a 42 75 66 2c 20 28 63 68 61  terp, zBuf, (cha
1b0e0 72 2a 29 30 29 3b 0a 20 20 72 65 74 75 72 6e 20  r*)0);.  return 
1b0f0 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
1b100 20 52 65 67 69 73 74 65 72 20 74 68 65 20 66 6f   Register the fo
1b110 75 72 20 6e 65 77 20 54 43 4c 20 63 6f 6d 6d 61  ur new TCL comma
1b120 6e 64 73 20 66 6f 72 20 67 65 6e 65 72 61 74 69  nds for generati
1b130 6e 67 20 4d 44 35 20 63 68 65 63 6b 73 75 6d 73  ng MD5 checksums
1b140 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 54 43 4c  .** with the TCL
1b150 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0a 2a 2f   interpreter..*/
1b160 0a 69 6e 74 20 4d 64 35 5f 49 6e 69 74 28 54 63  .int Md5_Init(Tc
1b170 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
1b180 29 7b 0a 20 20 54 63 6c 5f 43 72 65 61 74 65 43  ){.  Tcl_CreateC
1b190 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22  ommand(interp, "
1b1a0 6d 64 35 22 2c 20 28 54 63 6c 5f 43 6d 64 50 72  md5", (Tcl_CmdPr
1b1b0 6f 63 2a 29 6d 64 35 5f 63 6d 64 2c 0a 20 20 20  oc*)md5_cmd,.   
1b1c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b1d0 20 4d 44 35 44 69 67 65 73 74 54 6f 42 61 73 65   MD5DigestToBase
1b1e0 31 36 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 43 72  16, 0);.  Tcl_Cr
1b1f0 65 61 74 65 43 6f 6d 6d 61 6e 64 28 69 6e 74 65  eateCommand(inte
1b200 72 70 2c 20 22 6d 64 35 2d 31 30 78 38 22 2c 20  rp, "md5-10x8", 
1b210 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 6d 64  (Tcl_CmdProc*)md
1b220 35 5f 63 6d 64 2c 0a 20 20 20 20 20 20 20 20 20  5_cmd,.         
1b230 20 20 20 20 20 20 20 20 20 20 20 4d 44 35 44 69             MD5Di
1b240 67 65 73 74 54 6f 42 61 73 65 31 30 78 38 2c 20  gestToBase10x8, 
1b250 30 29 3b 0a 20 20 54 63 6c 5f 43 72 65 61 74 65  0);.  Tcl_Create
1b260 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20  Command(interp, 
1b270 22 6d 64 35 66 69 6c 65 22 2c 20 28 54 63 6c 5f  "md5file", (Tcl_
1b280 43 6d 64 50 72 6f 63 2a 29 6d 64 35 66 69 6c 65  CmdProc*)md5file
1b290 5f 63 6d 64 2c 0a 20 20 20 20 20 20 20 20 20 20  _cmd,.          
1b2a0 20 20 20 20 20 20 20 20 20 20 4d 44 35 44 69 67            MD5Dig
1b2b0 65 73 74 54 6f 42 61 73 65 31 36 2c 20 30 29 3b  estToBase16, 0);
1b2c0 0a 20 20 54 63 6c 5f 43 72 65 61 74 65 43 6f 6d  .  Tcl_CreateCom
1b2d0 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 6d 64  mand(interp, "md
1b2e0 35 66 69 6c 65 2d 31 30 78 38 22 2c 20 28 54 63  5file-10x8", (Tc
1b2f0 6c 5f 43 6d 64 50 72 6f 63 2a 29 6d 64 35 66 69  l_CmdProc*)md5fi
1b300 6c 65 5f 63 6d 64 2c 0a 20 20 20 20 20 20 20 20  le_cmd,.        
1b310 20 20 20 20 20 20 20 20 20 20 20 20 4d 44 35 44              MD5D
1b320 69 67 65 73 74 54 6f 42 61 73 65 31 30 78 38 2c  igestToBase10x8,
1b330 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43   0);.  return TC
1b340 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  L_OK;.}.#endif /
1b350 2a 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  * defined(SQLITE
1b360 5f 54 45 53 54 29 20 7c 7c 20 64 65 66 69 6e 65  _TEST) || define
1b370 64 28 53 51 4c 49 54 45 5f 54 43 4c 4d 44 35 29  d(SQLITE_TCLMD5)
1b380 20 2a 2f 0a 0a 23 69 66 20 64 65 66 69 6e 65 64   */..#if defined
1b390 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 2f 2a  (SQLITE_TEST)./*
1b3a0 0a 2a 2a 20 44 75 72 69 6e 67 20 74 65 73 74 69  .** During testi
1b3b0 6e 67 2c 20 74 68 65 20 73 70 65 63 69 61 6c 20  ng, the special 
1b3c0 6d 64 35 73 75 6d 28 29 20 61 67 67 72 65 67 61  md5sum() aggrega
1b3d0 74 65 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  te function is a
1b3e0 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 20 69 6e 73  vailable..** ins
1b3f0 69 64 65 20 53 51 4c 69 74 65 2e 20 20 54 68 65  ide SQLite.  The
1b400 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69   following routi
1b410 6e 65 73 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68  nes implement th
1b420 61 74 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  at function..*/.
1b430 73 74 61 74 69 63 20 76 6f 69 64 20 6d 64 35 73  static void md5s
1b440 74 65 70 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  tep(sqlite3_cont
1b450 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 69 6e  ext *context, in
1b460 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f  t argc, sqlite3_
1b470 76 61 6c 75 65 20 2a 2a 61 72 67 76 29 7b 0a 20  value **argv){. 
1b480 20 4d 44 35 43 6f 6e 74 65 78 74 20 2a 70 3b 0a   MD5Context *p;.
1b490 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 61    int i;.  if( a
1b4a0 72 67 63 3c 31 20 29 20 72 65 74 75 72 6e 3b 0a  rgc<1 ) return;.
1b4b0 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 61 67    p = sqlite3_ag
1b4c0 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28  gregate_context(
1b4d0 63 6f 6e 74 65 78 74 2c 20 73 69 7a 65 6f 66 28  context, sizeof(
1b4e0 2a 70 29 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30  *p));.  if( p==0
1b4f0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
1b500 20 21 70 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20   !p->isInit ){. 
1b510 20 20 20 4d 44 35 49 6e 69 74 28 70 29 3b 0a 20     MD5Init(p);. 
1b520 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c   }.  for(i=0; i<
1b530 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  argc; i++){.    
1b540 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 61 74  const char *zDat
1b550 61 20 3d 20 28 63 68 61 72 2a 29 73 71 6c 69 74  a = (char*)sqlit
1b560 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
1b570 67 76 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28 20  gv[i]);.    if( 
1b580 7a 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 4d  zData ){.      M
1b590 44 35 55 70 64 61 74 65 28 70 2c 20 28 75 6e 73  D5Update(p, (uns
1b5a0 69 67 6e 65 64 20 63 68 61 72 2a 29 7a 44 61 74  igned char*)zDat
1b5b0 61 2c 20 73 74 72 6c 65 6e 28 7a 44 61 74 61 29  a, strlen(zData)
1b5c0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73  );.    }.  }.}.s
1b5d0 74 61 74 69 63 20 76 6f 69 64 20 6d 64 35 66 69  tatic void md5fi
1b5e0 6e 61 6c 69 7a 65 28 73 71 6c 69 74 65 33 5f 63  nalize(sqlite3_c
1b5f0 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 29  ontext *context)
1b600 7b 0a 20 20 4d 44 35 43 6f 6e 74 65 78 74 20 2a  {.  MD5Context *
1b610 70 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  p;.  unsigned ch
1b620 61 72 20 64 69 67 65 73 74 5b 31 36 5d 3b 0a 20  ar digest[16];. 
1b630 20 63 68 61 72 20 7a 42 75 66 5b 33 33 5d 3b 0a   char zBuf[33];.
1b640 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 61 67    p = sqlite3_ag
1b650 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28  gregate_context(
1b660 63 6f 6e 74 65 78 74 2c 20 73 69 7a 65 6f 66 28  context, sizeof(
1b670 2a 70 29 29 3b 0a 20 20 4d 44 35 46 69 6e 61 6c  *p));.  MD5Final
1b680 28 64 69 67 65 73 74 2c 70 29 3b 0a 20 20 4d 44  (digest,p);.  MD
1b690 35 44 69 67 65 73 74 54 6f 42 61 73 65 31 36 28  5DigestToBase16(
1b6a0 64 69 67 65 73 74 2c 20 7a 42 75 66 29 3b 0a 20  digest, zBuf);. 
1b6b0 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
1b6c0 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 7a 42  text(context, zB
1b6d0 75 66 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54  uf, -1, SQLITE_T
1b6e0 52 41 4e 53 49 45 4e 54 29 3b 0a 7d 0a 69 6e 74  RANSIENT);.}.int
1b6f0 20 4d 64 35 5f 52 65 67 69 73 74 65 72 28 73 71   Md5_Register(sq
1b700 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e  lite3 *db){.  in
1b710 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63  t rc = sqlite3_c
1b720 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64  reate_function(d
1b730 62 2c 20 22 6d 64 35 73 75 6d 22 2c 20 2d 31 2c  b, "md5sum", -1,
1b740 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c   SQLITE_UTF8, 0,
1b750 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20   0, .           
1b760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b770 20 20 20 20 20 20 6d 64 35 73 74 65 70 2c 20 6d        md5step, m
1b780 64 35 66 69 6e 61 6c 69 7a 65 29 3b 0a 20 20 73  d5finalize);.  s
1b790 71 6c 69 74 65 33 5f 6f 76 65 72 6c 6f 61 64 5f  qlite3_overload_
1b7a0 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 6d 64  function(db, "md
1b7b0 35 73 75 6d 22 2c 20 2d 31 29 3b 20 20 2f 2a 20  5sum", -1);  /* 
1b7c0 54 6f 20 65 78 65 72 63 69 73 65 20 74 68 69 73  To exercise this
1b7d0 20 41 50 49 20 2a 2f 0a 20 20 72 65 74 75 72 6e   API */.  return
1b7e0 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a   rc;.}.#endif /*
1b7f0 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
1b800 54 45 53 54 29 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a  TEST) */.../*.**
1b810 20 49 66 20 74 68 65 20 6d 61 63 72 6f 20 54 43   If the macro TC
1b820 4c 53 48 20 69 73 20 6f 6e 65 2c 20 74 68 65 6e  LSH is one, then
1b830 20 70 75 74 20 69 6e 20 63 6f 64 65 20 74 68 69   put in code thi
1b840 73 20 66 6f 72 20 74 68 65 0a 2a 2a 20 22 6d 61  s for the.** "ma
1b850 69 6e 22 20 72 6f 75 74 69 6e 65 20 74 68 61 74  in" routine that
1b860 20 77 69 6c 6c 20 69 6e 69 74 69 61 6c 69 7a 65   will initialize
1b870 20 54 63 6c 20 61 6e 64 20 74 61 6b 65 20 69 6e   Tcl and take in
1b880 70 75 74 20 66 72 6f 6d 0a 2a 2a 20 73 74 61 6e  put from.** stan
1b890 64 61 72 64 20 69 6e 70 75 74 2c 20 6f 72 20 69  dard input, or i
1b8a0 66 20 61 20 66 69 6c 65 20 69 73 20 6e 61 6d 65  f a file is name
1b8b0 64 20 6f 6e 20 74 68 65 20 63 6f 6d 6d 61 6e 64  d on the command
1b8c0 20 6c 69 6e 65 0a 2a 2a 20 74 68 65 20 54 43 4c   line.** the TCL
1b8d0 20 69 6e 74 65 72 70 72 65 74 65 72 20 72 65 61   interpreter rea
1b8e0 64 73 20 61 6e 64 20 65 76 61 6c 75 61 74 65 73  ds and evaluates
1b8f0 20 74 68 61 74 20 66 69 6c 65 2e 0a 2a 2f 0a 23   that file..*/.#
1b900 69 66 20 54 43 4c 53 48 3d 3d 31 0a 73 74 61 74  if TCLSH==1.stat
1b910 69 63 20 63 68 61 72 20 7a 4d 61 69 6e 6c 6f 6f  ic char zMainloo
1b920 70 5b 5d 20 3d 0a 20 20 22 73 65 74 20 6c 69 6e  p[] =.  "set lin
1b930 65 20 7b 7d 5c 6e 22 0a 20 20 22 77 68 69 6c 65  e {}\n".  "while
1b940 20 7b 21 5b 65 6f 66 20 73 74 64 69 6e 5d 7d 20   {![eof stdin]} 
1b950 7b 5c 6e 22 0a 20 20 20 20 22 69 66 20 7b 24 6c  {\n".    "if {$l
1b960 69 6e 65 21 3d 5c 22 5c 22 7d 20 7b 5c 6e 22 0a  ine!=\"\"} {\n".
1b970 20 20 20 20 20 20 22 70 75 74 73 20 2d 6e 6f 6e        "puts -non
1b980 65 77 6c 69 6e 65 20 5c 22 3e 20 5c 22 5c 6e 22  ewline \"> \"\n"
1b990 0a 20 20 20 20 22 7d 20 65 6c 73 65 20 7b 5c 6e  .    "} else {\n
1b9a0 22 0a 20 20 20 20 20 20 22 70 75 74 73 20 2d 6e  ".      "puts -n
1b9b0 6f 6e 65 77 6c 69 6e 65 20 5c 22 25 20 5c 22 5c  onewline \"% \"\
1b9c0 6e 22 0a 20 20 20 20 22 7d 5c 6e 22 0a 20 20 20  n".    "}\n".   
1b9d0 20 22 66 6c 75 73 68 20 73 74 64 6f 75 74 5c 6e   "flush stdout\n
1b9e0 22 0a 20 20 20 20 22 61 70 70 65 6e 64 20 6c 69  ".    "append li
1b9f0 6e 65 20 5b 67 65 74 73 20 73 74 64 69 6e 5d 5c  ne [gets stdin]\
1ba00 6e 22 0a 20 20 20 20 22 69 66 20 7b 5b 69 6e 66  n".    "if {[inf
1ba10 6f 20 63 6f 6d 70 6c 65 74 65 20 24 6c 69 6e 65  o complete $line
1ba20 5d 7d 20 7b 5c 6e 22 0a 20 20 20 20 20 20 22 69  ]} {\n".      "i
1ba30 66 20 7b 5b 63 61 74 63 68 20 7b 75 70 6c 65 76  f {[catch {uplev
1ba40 65 6c 20 23 30 20 24 6c 69 6e 65 7d 20 72 65 73  el #0 $line} res
1ba50 75 6c 74 5d 7d 20 7b 5c 6e 22 0a 20 20 20 20 20  ult]} {\n".     
1ba60 20 20 20 22 70 75 74 73 20 73 74 64 65 72 72 20     "puts stderr 
1ba70 5c 22 45 72 72 6f 72 3a 20 24 72 65 73 75 6c 74  \"Error: $result
1ba80 5c 22 5c 6e 22 0a 20 20 20 20 20 20 22 7d 20 65  \"\n".      "} e
1ba90 6c 73 65 69 66 20 7b 24 72 65 73 75 6c 74 21 3d  lseif {$result!=
1baa0 5c 22 5c 22 7d 20 7b 5c 6e 22 0a 20 20 20 20 20  \"\"} {\n".     
1bab0 20 20 20 22 70 75 74 73 20 24 72 65 73 75 6c 74     "puts $result
1bac0 5c 6e 22 0a 20 20 20 20 20 20 22 7d 5c 6e 22 0a  \n".      "}\n".
1bad0 20 20 20 20 20 20 22 73 65 74 20 6c 69 6e 65 20        "set line 
1bae0 7b 7d 5c 6e 22 0a 20 20 20 20 22 7d 20 65 6c 73  {}\n".    "} els
1baf0 65 20 7b 5c 6e 22 0a 20 20 20 20 20 20 22 61 70  e {\n".      "ap
1bb00 70 65 6e 64 20 6c 69 6e 65 20 5c 5c 6e 5c 6e 22  pend line \\n\n"
1bb10 0a 20 20 20 20 22 7d 5c 6e 22 0a 20 20 22 7d 5c  .    "}\n".  "}\
1bb20 6e 22 0a 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20  n".;.#endif.#if 
1bb30 54 43 4c 53 48 3d 3d 32 0a 73 74 61 74 69 63 20  TCLSH==2.static 
1bb40 63 68 61 72 20 7a 4d 61 69 6e 6c 6f 6f 70 5b 5d  char zMainloop[]
1bb50 20 3d 20 0a 23 69 6e 63 6c 75 64 65 20 22 73 70   = .#include "sp
1bb60 61 63 65 61 6e 61 6c 5f 74 63 6c 2e 68 22 0a 3b  aceanal_tcl.h".;
1bb70 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20  .#endif..#ifdef 
1bb80 53 51 4c 49 54 45 5f 54 45 53 54 0a 73 74 61 74  SQLITE_TEST.stat
1bb90 69 63 20 76 6f 69 64 20 69 6e 69 74 5f 61 6c 6c  ic void init_all
1bba0 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 29 3b 0a  (Tcl_Interp *);.
1bbb0 73 74 61 74 69 63 20 69 6e 74 20 69 6e 69 74 5f  static int init_
1bbc0 61 6c 6c 5f 63 6d 64 28 0a 20 20 43 6c 69 65 6e  all_cmd(.  Clien
1bbd0 74 44 61 74 61 20 63 64 2c 0a 20 20 54 63 6c 5f  tData cd,.  Tcl_
1bbe0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
1bbf0 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
1bc00 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
1bc10 76 5b 5d 0a 29 7b 0a 0a 20 20 54 63 6c 5f 49 6e  v[].){..  Tcl_In
1bc20 74 65 72 70 20 2a 73 6c 61 76 65 3b 0a 20 20 69  terp *slave;.  i
1bc30 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20  f( objc!=2 ){.  
1bc40 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
1bc50 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
1bc60 6a 76 2c 20 22 53 4c 41 56 45 22 29 3b 0a 20 20  jv, "SLAVE");.  
1bc70 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
1bc80 4f 52 3b 0a 20 20 7d 0a 0a 20 20 73 6c 61 76 65  OR;.  }..  slave
1bc90 20 3d 20 54 63 6c 5f 47 65 74 53 6c 61 76 65 28   = Tcl_GetSlave(
1bca0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
1bcb0 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 29 3b  tring(objv[1]));
1bcc0 0a 20 20 69 66 28 20 21 73 6c 61 76 65 20 29 7b  .  if( !slave ){
1bcd0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
1bce0 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 6e  ERROR;.  }..  in
1bcf0 69 74 5f 61 6c 6c 28 73 6c 61 76 65 29 3b 0a 20  it_all(slave);. 
1bd00 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
1bd10 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
1bd20 43 6f 6e 66 69 67 75 72 65 20 74 68 65 20 69 6e  Configure the in
1bd30 74 65 72 70 72 65 74 65 72 20 70 61 73 73 65 64  terpreter passed
1bd40 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
1bd50 67 75 6d 65 6e 74 20 74 6f 20 68 61 76 65 20 61  gument to have a
1bd60 63 63 65 73 73 0a 2a 2a 20 74 6f 20 74 68 65 20  ccess.** to the 
1bd70 63 6f 6d 6d 61 6e 64 73 20 61 6e 64 20 6c 69 6e  commands and lin
1bd80 6b 65 64 20 76 61 72 69 61 62 6c 65 73 20 74 68  ked variables th
1bd90 61 74 20 6d 61 6b 65 20 75 70 3a 0a 2a 2a 0a 2a  at make up:.**.*
1bda0 2a 20 20 20 2a 20 74 68 65 20 5b 73 71 6c 69 74  *   * the [sqlit
1bdb0 65 33 5d 20 65 78 74 65 6e 73 69 6f 6e 20 69 74  e3] extension it
1bdc0 73 65 6c 66 2c 20 0a 2a 2a 0a 2a 2a 20 20 20 2a  self, .**.**   *
1bdd0 20 49 66 20 53 51 4c 49 54 45 5f 54 43 4c 4d 44   If SQLITE_TCLMD
1bde0 35 20 6f 72 20 53 51 4c 49 54 45 5f 54 45 53 54  5 or SQLITE_TEST
1bdf0 20 69 73 20 64 65 66 69 6e 65 64 2c 20 74 68 65   is defined, the
1be00 20 4d 64 35 20 63 6f 6d 6d 61 6e 64 73 2c 20 61   Md5 commands, a
1be10 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20  nd.**.**   * If 
1be20 53 51 4c 49 54 45 5f 54 45 53 54 20 69 73 20 73  SQLITE_TEST is s
1be30 65 74 2c 20 74 68 65 20 76 61 72 69 6f 75 73 20  et, the various 
1be40 74 65 73 74 20 69 6e 74 65 72 66 61 63 65 73 20  test interfaces 
1be50 75 73 65 64 20 62 79 20 74 68 65 20 54 63 6c 0a  used by the Tcl.
1be60 2a 2a 20 20 20 20 20 74 65 73 74 20 73 75 69 74  **     test suit
1be70 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
1be80 64 20 69 6e 69 74 5f 61 6c 6c 28 54 63 6c 5f 49  d init_all(Tcl_I
1be90 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 0a  nterp *interp){.
1bea0 20 20 53 71 6c 69 74 65 33 5f 49 6e 69 74 28 69    Sqlite3_Init(i
1beb0 6e 74 65 72 70 29 3b 0a 0a 23 69 66 20 64 65 66  nterp);..#if def
1bec0 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54  ined(SQLITE_TEST
1bed0 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c  ) || defined(SQL
1bee0 49 54 45 5f 54 43 4c 4d 44 35 29 0a 20 20 4d 64  ITE_TCLMD5).  Md
1bef0 35 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a  5_Init(interp);.
1bf00 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53  #endif..#ifdef S
1bf10 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 7b 0a 20  QLITE_TEST.  {. 
1bf20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71     extern int Sq
1bf30 6c 69 74 65 63 6f 6e 66 69 67 5f 49 6e 69 74 28  liteconfig_Init(
1bf40 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20  Tcl_Interp*);.  
1bf50 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c    extern int Sql
1bf60 69 74 65 74 65 73 74 31 5f 49 6e 69 74 28 54 63  itetest1_Init(Tc
1bf70 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20  l_Interp*);.    
1bf80 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74  extern int Sqlit
1bf90 65 74 65 73 74 32 5f 49 6e 69 74 28 54 63 6c 5f  etest2_Init(Tcl_
1bfa0 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78  Interp*);.    ex
1bfb0 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74  tern int Sqlitet
1bfc0 65 73 74 33 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  est3_Init(Tcl_In
1bfd0 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65  terp*);.    exte
1bfe0 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73  rn int Sqlitetes
1bff0 74 34 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  t4_Init(Tcl_Inte
1c000 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e  rp*);.    extern
1c010 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 35   int Sqlitetest5
1c020 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
1c030 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69  *);.    extern i
1c040 6e 74 20 53 71 6c 69 74 65 74 65 73 74 36 5f 49  nt Sqlitetest6_I
1c050 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29  nit(Tcl_Interp*)
1c060 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74  ;.    extern int
1c070 20 53 71 6c 69 74 65 74 65 73 74 37 5f 49 6e 69   Sqlitetest7_Ini
1c080 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a  t(Tcl_Interp*);.
1c090 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53      extern int S
1c0a0 71 6c 69 74 65 74 65 73 74 38 5f 49 6e 69 74 28  qlitetest8_Init(
1c0b0 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20  Tcl_Interp*);.  
1c0c0 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c    extern int Sql
1c0d0 69 74 65 74 65 73 74 39 5f 49 6e 69 74 28 54 63  itetest9_Init(Tc
1c0e0 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20  l_Interp*);.    
1c0f0 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74  extern int Sqlit
1c100 65 74 65 73 74 61 73 79 6e 63 5f 49 6e 69 74 28  etestasync_Init(
1c110 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20  Tcl_Interp*);.  
1c120 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c    extern int Sql
1c130 69 74 65 74 65 73 74 5f 61 75 74 6f 65 78 74 5f  itetest_autoext_
1c140 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a  Init(Tcl_Interp*
1c150 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e  );.    extern in
1c160 74 20 53 71 6c 69 74 65 74 65 73 74 5f 64 65 6d  t Sqlitetest_dem
1c170 6f 76 66 73 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  ovfs_Init(Tcl_In
1c180 74 65 72 70 20 2a 29 3b 0a 20 20 20 20 65 78 74  terp *);.    ext
1c190 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65  ern int Sqlitete
1c1a0 73 74 5f 66 75 6e 63 5f 49 6e 69 74 28 54 63 6c  st_func_Init(Tcl
1c1b0 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65  _Interp*);.    e
1c1c0 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65  xtern int Sqlite
1c1d0 74 65 73 74 5f 68 65 78 69 6f 5f 49 6e 69 74 28  test_hexio_Init(
1c1e0 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20  Tcl_Interp*);.  
1c1f0 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c    extern int Sql
1c200 69 74 65 74 65 73 74 5f 69 6e 69 74 5f 49 6e 69  itetest_init_Ini
1c210 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a  t(Tcl_Interp*);.
1c220 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53      extern int S
1c230 71 6c 69 74 65 74 65 73 74 5f 6d 61 6c 6c 6f 63  qlitetest_malloc
1c240 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
1c250 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69  *);.    extern i
1c260 6e 74 20 53 71 6c 69 74 65 74 65 73 74 5f 6d 75  nt Sqlitetest_mu
1c270 74 65 78 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74  tex_Init(Tcl_Int
1c280 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72  erp*);.    exter
1c290 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74  n int Sqlitetest
1c2a0 73 63 68 65 6d 61 5f 49 6e 69 74 28 54 63 6c 5f  schema_Init(Tcl_
1c2b0 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78  Interp*);.    ex
1c2c0 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74  tern int Sqlitet
1c2d0 65 73 74 73 73 65 5f 49 6e 69 74 28 54 63 6c 5f  estsse_Init(Tcl_
1c2e0 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78  Interp*);.    ex
1c2f0 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74  tern int Sqlitet
1c300 65 73 74 74 63 6c 76 61 72 5f 49 6e 69 74 28 54  esttclvar_Init(T
1c310 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20  cl_Interp*);.   
1c320 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69   extern int Sqli
1c330 74 65 74 65 73 74 54 68 72 65 61 64 5f 49 6e 69  tetestThread_Ini
1c340 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a  t(Tcl_Interp*);.
1c350 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53      extern int S
1c360 71 6c 69 74 65 74 65 73 74 4f 6e 65 66 69 6c 65  qlitetestOnefile
1c370 5f 49 6e 69 74 28 29 3b 0a 20 20 20 20 65 78 74  _Init();.    ext
1c380 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65  ern int Sqlitete
1c390 73 74 4f 73 69 6e 73 74 5f 49 6e 69 74 28 54 63  stOsinst_Init(Tc
1c3a0 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20  l_Interp*);.    
1c3b0 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74  extern int Sqlit
1c3c0 65 74 65 73 74 62 61 63 6b 75 70 5f 49 6e 69 74  etestbackup_Init
1c3d0 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20  (Tcl_Interp*);. 
1c3e0 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71     extern int Sq
1c3f0 6c 69 74 65 74 65 73 74 69 6e 74 61 72 72 61 79  litetestintarray
1c400 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
1c410 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69  *);.    extern i
1c420 6e 74 20 53 71 6c 69 74 65 74 65 73 74 76 66 73  nt Sqlitetestvfs
1c430 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
1c440 20 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20   *);.    extern 
1c450 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 53 74  int SqlitetestSt
1c460 61 74 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  at_Init(Tcl_Inte
1c470 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e  rp*);.    extern
1c480 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 72   int Sqlitetestr
1c490 74 72 65 65 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  tree_Init(Tcl_In
1c4a0 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65  terp*);.    exte
1c4b0 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 71 75 6f  rn int Sqlitequo
1c4c0 74 61 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  ta_Init(Tcl_Inte
1c4d0 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e  rp*);.    extern
1c4e0 20 69 6e 74 20 53 71 6c 69 74 65 6d 75 6c 74 69   int Sqlitemulti
1c4f0 70 6c 65 78 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  plex_Init(Tcl_In
1c500 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65  terp*);.    exte
1c510 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 53 75 70  rn int SqliteSup
1c520 65 72 6c 6f 63 6b 5f 49 6e 69 74 28 54 63 6c 5f  erlock_Init(Tcl_
1c530 49 6e 74 65 72 70 2a 29 3b 0a 23 69 66 64 65 66  Interp*);.#ifdef
1c540 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
1c550 45 53 53 49 4f 4e 0a 20 20 20 20 65 78 74 65 72  ESSION.    exter
1c560 6e 20 69 6e 74 20 54 65 73 74 53 65 73 73 69 6f  n int TestSessio
1c570 6e 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  n_Init(Tcl_Inter
1c580 70 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66  p*);.#endif..#if
1c590 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
1c5a0 45 5f 5a 49 50 56 46 53 0a 20 20 20 20 65 78 74  E_ZIPVFS.    ext
1c5b0 65 72 6e 20 69 6e 74 20 5a 69 70 76 66 73 5f 49  ern int Zipvfs_I
1c5c0 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29  nit(Tcl_Interp*)
1c5d0 3b 0a 20 20 20 20 5a 69 70 76 66 73 5f 49 6e 69  ;.    Zipvfs_Ini
1c5e0 74 28 69 6e 74 65 72 70 29 3b 0a 23 65 6e 64 69  t(interp);.#endi
1c5f0 66 0a 0a 20 20 20 20 53 71 6c 69 74 65 63 6f 6e  f..    Sqlitecon
1c600 66 69 67 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  fig_Init(interp)
1c610 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74  ;.    Sqlitetest
1c620 31 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a  1_Init(interp);.
1c630 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 32 5f      Sqlitetest2_
1c640 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  Init(interp);.  
1c650 20 20 53 71 6c 69 74 65 74 65 73 74 33 5f 49 6e    Sqlitetest3_In
1c660 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  it(interp);.    
1c670 53 71 6c 69 74 65 74 65 73 74 34 5f 49 6e 69 74  Sqlitetest4_Init
1c680 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71  (interp);.    Sq
1c690 6c 69 74 65 74 65 73 74 35 5f 49 6e 69 74 28 69  litetest5_Init(i
1c6a0 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69  nterp);.    Sqli
1c6b0 74 65 74 65 73 74 36 5f 49 6e 69 74 28 69 6e 74  tetest6_Init(int
1c6c0 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65  erp);.    Sqlite
1c6d0 74 65 73 74 37 5f 49 6e 69 74 28 69 6e 74 65 72  test7_Init(inter
1c6e0 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65  p);.    Sqlitete
1c6f0 73 74 38 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  st8_Init(interp)
1c700 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74  ;.    Sqlitetest
1c710 39 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a  9_Init(interp);.
1c720 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 61 73      Sqlitetestas
1c730 79 6e 63 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  ync_Init(interp)
1c740 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74  ;.    Sqlitetest
1c750 5f 61 75 74 6f 65 78 74 5f 49 6e 69 74 28 69 6e  _autoext_Init(in
1c760 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74  terp);.    Sqlit
1c770 65 74 65 73 74 5f 64 65 6d 6f 76 66 73 5f 49 6e  etest_demovfs_In
1c780 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  it(interp);.    
1c790 53 71 6c 69 74 65 74 65 73 74 5f 66 75 6e 63 5f  Sqlitetest_func_
1c7a0 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  Init(interp);.  
1c7b0 20 20 53 71 6c 69 74 65 74 65 73 74 5f 68 65 78    Sqlitetest_hex
1c7c0 69 6f 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b  io_Init(interp);
1c7d0 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 5f  .    Sqlitetest_
1c7e0 69 6e 69 74 5f 49 6e 69 74 28 69 6e 74 65 72 70  init_Init(interp
1c7f0 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73  );.    Sqlitetes
1c800 74 5f 6d 61 6c 6c 6f 63 5f 49 6e 69 74 28 69 6e  t_malloc_Init(in
1c810 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74  terp);.    Sqlit
1c820 65 74 65 73 74 5f 6d 75 74 65 78 5f 49 6e 69 74  etest_mutex_Init
1c830 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71  (interp);.    Sq
1c840 6c 69 74 65 74 65 73 74 73 63 68 65 6d 61 5f 49  litetestschema_I
1c850 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20  nit(interp);.   
1c860 20 53 71 6c 69 74 65 74 65 73 74 74 63 6c 76 61   Sqlitetesttclva
1c870 72 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a  r_Init(interp);.
1c880 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 54 68      SqlitetestTh
1c890 72 65 61 64 5f 49 6e 69 74 28 69 6e 74 65 72 70  read_Init(interp
1c8a0 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73  );.    Sqlitetes
1c8b0 74 4f 6e 65 66 69 6c 65 5f 49 6e 69 74 28 69 6e  tOnefile_Init(in
1c8c0 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74  terp);.    Sqlit
1c8d0 65 74 65 73 74 4f 73 69 6e 73 74 5f 49 6e 69 74  etestOsinst_Init
1c8e0 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71  (interp);.    Sq
1c8f0 6c 69 74 65 74 65 73 74 62 61 63 6b 75 70 5f 49  litetestbackup_I
1c900 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20  nit(interp);.   
1c910 20 53 71 6c 69 74 65 74 65 73 74 69 6e 74 61 72   Sqlitetestintar
1c920 72 61 79 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  ray_Init(interp)
1c930 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74  ;.    Sqlitetest
1c940 76 66 73 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  vfs_Init(interp)
1c950 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74  ;.    Sqlitetest
1c960 53 74 61 74 5f 49 6e 69 74 28 69 6e 74 65 72 70  Stat_Init(interp
1c970 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73  );.    Sqlitetes
1c980 74 72 74 72 65 65 5f 49 6e 69 74 28 69 6e 74 65  trtree_Init(inte
1c990 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 71  rp);.    Sqliteq
1c9a0 75 6f 74 61 5f 49 6e 69 74 28 69 6e 74 65 72 70  uota_Init(interp
1c9b0 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 6d 75 6c  );.    Sqlitemul
1c9c0 74 69 70 6c 65 78 5f 49 6e 69 74 28 69 6e 74 65  tiplex_Init(inte
1c9d0 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 53  rp);.    SqliteS
1c9e0 75 70 65 72 6c 6f 63 6b 5f 49 6e 69 74 28 69 6e  uperlock_Init(in
1c9f0 74 65 72 70 29 3b 0a 23 69 66 64 65 66 20 53 51  terp);.#ifdef SQ
1ca00 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45 53 53  LITE_ENABLE_SESS
1ca10 49 4f 4e 0a 20 20 20 20 54 65 73 74 53 65 73 73  ION.    TestSess
1ca20 69 6f 6e 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  ion_Init(interp)
1ca30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 54 63  ;.#endif..    Tc
1ca40 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61  l_CreateObjComma
1ca50 6e 64 28 69 6e 74 65 72 70 2c 22 6c 6f 61 64 5f  nd(interp,"load_
1ca60 74 65 73 74 66 69 78 74 75 72 65 5f 65 78 74 65  testfixture_exte
1ca70 6e 73 69 6f 6e 73 22 2c 69 6e 69 74 5f 61 6c 6c  nsions",init_all
1ca80 5f 63 6d 64 2c 30 2c 30 29 3b 0a 0a 23 69 66 64  _cmd,0,0);..#ifd
1ca90 65 66 20 53 51 4c 49 54 45 5f 53 53 45 0a 20 20  ef SQLITE_SSE.  
1caa0 20 20 53 71 6c 69 74 65 74 65 73 74 73 73 65 5f    Sqlitetestsse_
1cab0 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 23 65  Init(interp);.#e
1cac0 6e 64 69 66 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ndif.  }.#endif.
1cad0 7d 0a 0a 23 64 65 66 69 6e 65 20 54 43 4c 53 48  }..#define TCLSH
1cae0 5f 4d 41 49 4e 20 6d 61 69 6e 20 20 20 2f 2a 20  _MAIN main   /* 
1caf0 4e 65 65 64 65 64 20 74 6f 20 66 61 6b 65 20 6f  Needed to fake o
1cb00 75 74 20 6d 6b 74 63 6c 61 70 70 20 2a 2f 0a 69  ut mktclapp */.i
1cb10 6e 74 20 54 43 4c 53 48 5f 4d 41 49 4e 28 69 6e  nt TCLSH_MAIN(in
1cb20 74 20 61 72 67 63 2c 20 63 68 61 72 20 2a 2a 61  t argc, char **a
1cb30 72 67 76 29 7b 0a 20 20 54 63 6c 5f 49 6e 74 65  rgv){.  Tcl_Inte
1cb40 72 70 20 2a 69 6e 74 65 72 70 3b 0a 20 20 0a 20  rp *interp;.  . 
1cb50 20 2f 2a 20 43 61 6c 6c 20 73 71 6c 69 74 65 33   /* Call sqlite3
1cb60 5f 73 68 75 74 64 6f 77 6e 28 29 20 6f 6e 63 65  _shutdown() once
1cb70 20 62 65 66 6f 72 65 20 64 6f 69 6e 67 20 61 6e   before doing an
1cb80 79 74 68 69 6e 67 20 65 6c 73 65 2e 20 54 68 69  ything else. Thi
1cb90 73 20 69 73 20 74 6f 0a 20 20 2a 2a 20 74 65 73  s is to.  ** tes
1cba0 74 20 74 68 61 74 20 73 71 6c 69 74 65 33 5f 73  t that sqlite3_s
1cbb0 68 75 74 64 6f 77 6e 28 29 20 63 61 6e 20 62 65  hutdown() can be
1cbc0 20 73 61 66 65 6c 79 20 63 61 6c 6c 65 64 20 62   safely called b
1cbd0 79 20 61 20 70 72 6f 63 65 73 73 20 62 65 66 6f  y a process befo
1cbe0 72 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f  re.  ** sqlite3_
1cbf0 69 6e 69 74 69 61 6c 69 7a 65 28 29 20 69 73 2e  initialize() is.
1cc00 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 68   */.  sqlite3_sh
1cc10 75 74 64 6f 77 6e 28 29 3b 0a 0a 23 69 66 20 54  utdown();..#if T
1cc20 43 4c 53 48 3d 3d 32 0a 20 20 73 71 6c 69 74 65  CLSH==2.  sqlite
1cc30 33 5f 63 6f 6e 66 69 67 28 53 51 4c 49 54 45 5f  3_config(SQLITE_
1cc40 43 4f 4e 46 49 47 5f 53 49 4e 47 4c 45 54 48 52  CONFIG_SINGLETHR
1cc50 45 41 44 29 3b 0a 23 65 6e 64 69 66 0a 20 20 54  EAD);.#endif.  T
1cc60 63 6c 5f 46 69 6e 64 45 78 65 63 75 74 61 62 6c  cl_FindExecutabl
1cc70 65 28 61 72 67 76 5b 30 5d 29 3b 0a 0a 20 20 69  e(argv[0]);..  i
1cc80 6e 74 65 72 70 20 3d 20 54 63 6c 5f 43 72 65 61  nterp = Tcl_Crea
1cc90 74 65 49 6e 74 65 72 70 28 29 3b 0a 20 20 69 6e  teInterp();.  in
1cca0 69 74 5f 61 6c 6c 28 69 6e 74 65 72 70 29 3b 0a  it_all(interp);.
1ccb0 20 20 69 66 28 20 61 72 67 63 3e 3d 32 20 29 7b    if( argc>=2 ){
1ccc0 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
1ccd0 63 68 61 72 20 7a 41 72 67 63 5b 33 32 5d 3b 0a  char zArgc[32];.
1cce0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
1ccf0 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 41 72 67  intf(sizeof(zArg
1cd00 63 29 2c 20 7a 41 72 67 63 2c 20 22 25 64 22 2c  c), zArgc, "%d",
1cd10 20 61 72 67 63 2d 28 33 2d 54 43 4c 53 48 29 29   argc-(3-TCLSH))
1cd20 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 56 61 72  ;.    Tcl_SetVar
1cd30 28 69 6e 74 65 72 70 2c 22 61 72 67 63 22 2c 20  (interp,"argc", 
1cd40 7a 41 72 67 63 2c 20 54 43 4c 5f 47 4c 4f 42 41  zArgc, TCL_GLOBA
1cd50 4c 5f 4f 4e 4c 59 29 3b 0a 20 20 20 20 54 63 6c  L_ONLY);.    Tcl
1cd60 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c 22  _SetVar(interp,"
1cd70 61 72 67 76 30 22 2c 61 72 67 76 5b 31 5d 2c 54  argv0",argv[1],T
1cd80 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b  CL_GLOBAL_ONLY);
1cd90 0a 20 20 20 20 54 63 6c 5f 53 65 74 56 61 72 28  .    Tcl_SetVar(
1cda0 69 6e 74 65 72 70 2c 22 61 72 67 76 22 2c 20 22  interp,"argv", "
1cdb0 22 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e  ", TCL_GLOBAL_ON
1cdc0 4c 59 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 33  LY);.    for(i=3
1cdd0 2d 54 43 4c 53 48 3b 20 69 3c 61 72 67 63 3b 20  -TCLSH; i<argc; 
1cde0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  i++){.      Tcl_
1cdf0 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c 20 22  SetVar(interp, "
1ce00 61 72 67 76 22 2c 20 61 72 67 76 5b 69 5d 2c 0a  argv", argv[i],.
1ce10 20 20 20 20 20 20 20 20 20 20 54 43 4c 5f 47 4c            TCL_GL
1ce20 4f 42 41 4c 5f 4f 4e 4c 59 20 7c 20 54 43 4c 5f  OBAL_ONLY | TCL_
1ce30 4c 49 53 54 5f 45 4c 45 4d 45 4e 54 20 7c 20 54  LIST_ELEMENT | T
1ce40 43 4c 5f 41 50 50 45 4e 44 5f 56 41 4c 55 45 29  CL_APPEND_VALUE)
1ce50 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1ce60 54 43 4c 53 48 3d 3d 31 20 26 26 20 54 63 6c 5f  TCLSH==1 && Tcl_
1ce70 45 76 61 6c 46 69 6c 65 28 69 6e 74 65 72 70 2c  EvalFile(interp,
1ce80 20 61 72 67 76 5b 31 5d 29 21 3d 54 43 4c 5f 4f   argv[1])!=TCL_O
1ce90 4b 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  K ){.      const
1cea0 20 63 68 61 72 20 2a 7a 49 6e 66 6f 20 3d 20 54   char *zInfo = T
1ceb0 63 6c 5f 47 65 74 56 61 72 28 69 6e 74 65 72 70  cl_GetVar(interp
1cec0 2c 20 22 65 72 72 6f 72 49 6e 66 6f 22 2c 20 54  , "errorInfo", T
1ced0 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b  CL_GLOBAL_ONLY);
1cee0 0a 20 20 20 20 20 20 69 66 28 20 7a 49 6e 66 6f  .      if( zInfo
1cef0 3d 3d 30 20 29 20 7a 49 6e 66 6f 20 3d 20 54 63  ==0 ) zInfo = Tc
1cf00 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c  l_GetStringResul
1cf10 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 20  t(interp);.     
1cf20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
1cf30 22 25 73 3a 20 25 73 5c 6e 22 2c 20 2a 61 72 67  "%s: %s\n", *arg
1cf40 76 2c 20 7a 49 6e 66 6f 29 3b 0a 20 20 20 20 20  v, zInfo);.     
1cf50 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
1cf60 0a 20 20 7d 0a 20 20 69 66 28 20 54 43 4c 53 48  .  }.  if( TCLSH
1cf70 3d 3d 32 20 7c 7c 20 61 72 67 63 3c 3d 31 20 29  ==2 || argc<=1 )
1cf80 7b 0a 20 20 20 20 54 63 6c 5f 47 6c 6f 62 61 6c  {.    Tcl_Global
1cf90 45 76 61 6c 28 69 6e 74 65 72 70 2c 20 7a 4d 61  Eval(interp, zMa
1cfa0 69 6e 6c 6f 6f 70 29 3b 0a 20 20 7d 0a 20 20 72  inloop);.  }.  r
1cfb0 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69  eturn 0;.}.#endi
1cfc0 66 20 2f 2a 20 54 43 4c 53 48 20 2a 2f 0a        f /* TCLSH */.