/ Hex Artifact Content
Login

Artifact bd86070f52ae3f77a2e6b3b065ff03adb9140bfa:


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: 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 6d 6f 64  *.** If this mod
0ea0: 75 6c 65 20 69 73 20 62 75 69 6c 74 20 77 69 74  ule is built wit
0eb0: 68 20 53 51 4c 49 54 45 5f 54 45 53 54 20 64 65  h SQLITE_TEST de
0ec0: 66 69 6e 65 64 20 28 74 6f 20 63 72 65 61 74 65  fined (to create
0ed0: 20 74 68 65 20 53 51 4c 69 74 65 0a 2a 2a 20 74   the SQLite.** t
0ee0: 65 73 74 66 69 78 74 75 72 65 20 65 78 65 63 75  estfixture execu
0ef0: 74 61 62 6c 65 29 2c 20 74 68 65 6e 20 69 74 20  table), then it 
0f00: 6d 61 79 20 62 65 20 63 6f 6e 66 69 67 75 72 65  may be configure
0f10: 64 20 74 6f 20 75 73 65 20 65 69 74 68 65 72 0a  d to use either.
0f20: 2a 2a 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61  ** sqlite3_prepa
0f30: 72 65 5f 76 32 28 29 20 6f 72 20 73 71 6c 69 74  re_v2() or sqlit
0f40: 65 33 5f 70 72 65 70 61 72 65 28 29 20 74 6f 20  e3_prepare() to 
0f50: 70 72 65 70 61 72 65 20 53 51 4c 20 73 74 61 74  prepare SQL stat
0f60: 65 6d 65 6e 74 73 2e 0a 2a 2a 20 49 66 20 53 71  ements..** If Sq
0f70: 6c 69 74 65 44 62 2e 62 4c 65 67 61 63 79 50 72  liteDb.bLegacyPr
0f80: 65 70 61 72 65 20 69 73 20 74 72 75 65 2c 20 73  epare is true, s
0f90: 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28 29  qlite3_prepare()
0fa0: 20 69 73 20 75 73 65 64 2e 0a 2a 2f 0a 74 79 70   is used..*/.typ
0fb0: 65 64 65 66 20 73 74 72 75 63 74 20 53 71 6c 69  edef struct Sqli
0fc0: 74 65 44 62 20 53 71 6c 69 74 65 44 62 3b 0a 73  teDb SqliteDb;.s
0fd0: 74 72 75 63 74 20 53 71 6c 69 74 65 44 62 20 7b  truct SqliteDb {
0fe0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20  .  sqlite3 *db; 
0ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1000: 20 54 68 65 20 22 72 65 61 6c 22 20 64 61 74 61   The "real" data
1010: 62 61 73 65 20 73 74 72 75 63 74 75 72 65 2e 20  base structure. 
1020: 4d 55 53 54 20 42 45 20 46 49 52 53 54 20 2a 2f  MUST BE FIRST */
1030: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
1040: 6e 74 65 72 70 3b 20 20 20 20 20 20 20 20 2f 2a  nterp;        /*
1050: 20 54 68 65 20 69 6e 74 65 72 70 72 65 74 65 72   The interpreter
1060: 20 75 73 65 64 20 66 6f 72 20 74 68 69 73 20 64   used for this d
1070: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 63 68 61  atabase */.  cha
1080: 72 20 2a 7a 42 75 73 79 3b 20 20 20 20 20 20 20  r *zBusy;       
1090: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62          /* The b
10a0: 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75  usy callback rou
10b0: 74 69 6e 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  tine */.  char *
10c0: 7a 43 6f 6d 6d 69 74 3b 20 20 20 20 20 20 20 20  zCommit;        
10d0: 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d 6d       /* The comm
10e0: 69 74 20 68 6f 6f 6b 20 63 61 6c 6c 62 61 63 6b  it hook callback
10f0: 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 63 68   routine */.  ch
1100: 61 72 20 2a 7a 54 72 61 63 65 3b 20 20 20 20 20  ar *zTrace;     
1110: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1120: 74 72 61 63 65 20 63 61 6c 6c 62 61 63 6b 20 72  trace callback r
1130: 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 63 68 61 72  outine */.  char
1140: 20 2a 7a 50 72 6f 66 69 6c 65 3b 20 20 20 20 20   *zProfile;     
1150: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 72         /* The pr
1160: 6f 66 69 6c 65 20 63 61 6c 6c 62 61 63 6b 20 72  ofile callback r
1170: 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 63 68 61 72  outine */.  char
1180: 20 2a 7a 50 72 6f 67 72 65 73 73 3b 20 20 20 20   *zProgress;    
1190: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 72         /* The pr
11a0: 6f 67 72 65 73 73 20 63 61 6c 6c 62 61 63 6b 20  ogress callback 
11b0: 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 63 68 61  routine */.  cha
11c0: 72 20 2a 7a 41 75 74 68 3b 20 20 20 20 20 20 20  r *zAuth;       
11d0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61          /* The a
11e0: 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 63 61 6c  uthorization cal
11f0: 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 20 2a 2f  lback routine */
1200: 0a 20 20 69 6e 74 20 64 69 73 61 62 6c 65 41 75  .  int disableAu
1210: 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  th;           /*
1220: 20 44 69 73 61 62 6c 65 20 74 68 65 20 61 75 74   Disable the aut
1230: 68 6f 72 69 7a 65 72 20 69 66 20 69 74 20 65 78  horizer if it ex
1240: 69 73 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ists */.  char *
1250: 7a 4e 75 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  zNull;          
1260: 20 20 20 20 20 2f 2a 20 54 65 78 74 20 74 6f 20       /* Text to 
1270: 73 75 62 73 74 69 74 75 74 65 20 66 6f 72 20 61  substitute for a
1280: 6e 20 53 51 4c 20 4e 55 4c 4c 20 76 61 6c 75 65  n SQL NULL value
1290: 20 2a 2f 0a 20 20 53 71 6c 46 75 6e 63 20 2a 70   */.  SqlFunc *p
12a0: 46 75 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20  Func;           
12b0: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 53 51 4c 20   /* List of SQL 
12c0: 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 54  functions */.  T
12d0: 63 6c 5f 4f 62 6a 20 2a 70 55 70 64 61 74 65 48  cl_Obj *pUpdateH
12e0: 6f 6f 6b 3b 20 20 20 20 20 20 2f 2a 20 55 70 64  ook;      /* Upd
12f0: 61 74 65 20 68 6f 6f 6b 20 73 63 72 69 70 74 20  ate hook script 
1300: 28 69 66 20 61 6e 79 29 20 2a 2f 0a 20 20 54 63  (if any) */.  Tc
1310: 6c 5f 4f 62 6a 20 2a 70 52 6f 6c 6c 62 61 63 6b  l_Obj *pRollback
1320: 48 6f 6f 6b 3b 20 20 20 20 2f 2a 20 52 6f 6c 6c  Hook;    /* Roll
1330: 62 61 63 6b 20 68 6f 6f 6b 20 73 63 72 69 70 74  back hook script
1340: 20 28 69 66 20 61 6e 79 29 20 2a 2f 0a 20 20 54   (if any) */.  T
1350: 63 6c 5f 4f 62 6a 20 2a 70 57 61 6c 48 6f 6f 6b  cl_Obj *pWalHook
1360: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 57 41 4c  ;         /* WAL
1370: 20 68 6f 6f 6b 20 73 63 72 69 70 74 20 28 69 66   hook script (if
1380: 20 61 6e 79 29 20 2a 2f 0a 20 20 54 63 6c 5f 4f   any) */.  Tcl_O
1390: 62 6a 20 2a 70 55 6e 6c 6f 63 6b 4e 6f 74 69 66  bj *pUnlockNotif
13a0: 79 3b 20 20 20 20 2f 2a 20 55 6e 6c 6f 63 6b 20  y;    /* Unlock 
13b0: 6e 6f 74 69 66 79 20 73 63 72 69 70 74 20 28 69  notify script (i
13c0: 66 20 61 6e 79 29 20 2a 2f 0a 20 20 53 71 6c 43  f any) */.  SqlC
13d0: 6f 6c 6c 61 74 65 20 2a 70 43 6f 6c 6c 61 74 65  ollate *pCollate
13e0: 3b 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f  ;      /* List o
13f0: 66 20 53 51 4c 20 63 6f 6c 6c 61 74 69 6f 6e 20  f SQL collation 
1400: 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 69  functions */.  i
1410: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
1420: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
1430: 75 72 6e 20 63 6f 64 65 20 6f 66 20 6d 6f 73 74  urn code of most
1440: 20 72 65 63 65 6e 74 20 73 71 6c 69 74 65 33 5f   recent sqlite3_
1450: 65 78 65 63 28 29 20 2a 2f 0a 20 20 54 63 6c 5f  exec() */.  Tcl_
1460: 4f 62 6a 20 2a 70 43 6f 6c 6c 61 74 65 4e 65 65  Obj *pCollateNee
1470: 64 65 64 3b 20 20 20 2f 2a 20 43 6f 6c 6c 61 74  ded;   /* Collat
1480: 69 6f 6e 20 6e 65 65 64 65 64 20 73 63 72 69 70  ion needed scrip
1490: 74 20 2a 2f 0a 20 20 53 71 6c 50 72 65 70 61 72  t */.  SqlPrepar
14a0: 65 64 53 74 6d 74 20 2a 73 74 6d 74 4c 69 73 74  edStmt *stmtList
14b0: 3b 20 2f 2a 20 4c 69 73 74 20 6f 66 20 70 72 65  ; /* List of pre
14c0: 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 73  pared statements
14d0: 2a 2f 0a 20 20 53 71 6c 50 72 65 70 61 72 65 64  */.  SqlPrepared
14e0: 53 74 6d 74 20 2a 73 74 6d 74 4c 61 73 74 3b 20  Stmt *stmtLast; 
14f0: 2f 2a 20 4c 61 73 74 20 73 74 61 74 65 6d 65 6e  /* Last statemen
1500: 74 20 69 6e 20 74 68 65 20 6c 69 73 74 20 2a 2f  t in the list */
1510: 0a 20 20 69 6e 74 20 6d 61 78 53 74 6d 74 3b 20  .  int maxStmt; 
1520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1530: 20 54 68 65 20 6e 65 78 74 20 6d 61 78 69 6d 75   The next maximu
1540: 6d 20 6e 75 6d 62 65 72 20 6f 66 20 73 74 6d 74  m number of stmt
1550: 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 53  List */.  int nS
1560: 74 6d 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  tmt;            
1570: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1580: 66 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 20  f statements in 
1590: 73 74 6d 74 4c 69 73 74 20 2a 2f 0a 20 20 49 6e  stmtList */.  In
15a0: 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 70  crblobChannel *p
15b0: 49 6e 63 72 62 6c 6f 62 3b 2f 2a 20 4c 69 6e 6b  Incrblob;/* Link
15c0: 65 64 20 6c 69 73 74 20 6f 66 20 6f 70 65 6e 20  ed list of open 
15d0: 69 6e 63 72 62 6c 6f 62 20 63 68 61 6e 6e 65 6c  incrblob channel
15e0: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 74 65 70  s */.  int nStep
15f0: 2c 20 6e 53 6f 72 74 2c 20 6e 49 6e 64 65 78 3b  , nSort, nIndex;
1600: 20 20 2f 2a 20 53 74 61 74 69 73 74 69 63 73 20    /* Statistics 
1610: 66 6f 72 20 6d 6f 73 74 20 72 65 63 65 6e 74 20  for most recent 
1620: 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69  operation */.  i
1630: 6e 74 20 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3b  nt nTransaction;
1640: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1650: 62 65 72 20 6f 66 20 6e 65 73 74 65 64 20 5b 74  ber of nested [t
1660: 72 61 6e 73 61 63 74 69 6f 6e 5d 20 6d 65 74 68  ransaction] meth
1670: 6f 64 73 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  ods */.#ifdef SQ
1680: 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 6e 74 20  LITE_TEST.  int 
1690: 62 4c 65 67 61 63 79 50 72 65 70 61 72 65 3b 20  bLegacyPrepare; 
16a0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74         /* True t
16b0: 6f 20 75 73 65 20 73 71 6c 69 74 65 33 5f 70 72  o use sqlite3_pr
16c0: 65 70 61 72 65 28 29 20 2a 2f 0a 23 65 6e 64 69  epare() */.#endi
16d0: 66 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 49 6e 63  f.};..struct Inc
16e0: 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 7b 0a 20  rblobChannel {. 
16f0: 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 20 2a 70   sqlite3_blob *p
1700: 42 6c 6f 62 3b 20 20 20 20 20 20 2f 2a 20 73 71  Blob;      /* sq
1710: 6c 69 74 65 33 20 62 6c 6f 62 20 68 61 6e 64 6c  lite3 blob handl
1720: 65 20 2a 2f 0a 20 20 53 71 6c 69 74 65 44 62 20  e */.  SqliteDb 
1730: 2a 70 44 62 3b 20 20 20 20 20 20 20 20 20 20 20  *pDb;           
1740: 20 2f 2a 20 41 73 73 6f 63 69 61 74 65 64 20 64   /* Associated d
1750: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
1760: 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 53 65 65  on */.  int iSee
1770: 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
1780: 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 73 65 65    /* Current see
1790: 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20 54 63  k offset */.  Tc
17a0: 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 6e 65  l_Channel channe
17b0: 6c 3b 20 20 20 20 20 20 2f 2a 20 43 68 61 6e 6e  l;      /* Chann
17c0: 65 6c 20 69 64 65 6e 74 69 66 69 65 72 20 2a 2f  el identifier */
17d0: 0a 20 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e  .  IncrblobChann
17e0: 65 6c 20 2a 70 4e 65 78 74 3b 20 20 20 2f 2a 20  el *pNext;   /* 
17f0: 4c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 61  Linked list of a
1800: 6c 6c 20 6f 70 65 6e 20 69 6e 63 72 62 6c 6f 62  ll open incrblob
1810: 20 63 68 61 6e 6e 65 6c 73 20 2a 2f 0a 20 20 49   channels */.  I
1820: 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a  ncrblobChannel *
1830: 70 50 72 65 76 3b 20 20 20 2f 2a 20 4c 69 6e 6b  pPrev;   /* Link
1840: 65 64 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 6f  ed list of all o
1850: 70 65 6e 20 69 6e 63 72 62 6c 6f 62 20 63 68 61  pen incrblob cha
1860: 6e 6e 65 6c 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a  nnels */.};../*.
1870: 2a 2a 20 43 6f 6d 70 75 74 65 20 61 20 73 74 72  ** Compute a str
1880: 69 6e 67 20 6c 65 6e 67 74 68 20 74 68 61 74 20  ing length that 
1890: 69 73 20 6c 69 6d 69 74 65 64 20 74 6f 20 77 68  is limited to wh
18a0: 61 74 20 63 61 6e 20 62 65 20 73 74 6f 72 65 64  at can be stored
18b0: 20 69 6e 0a 2a 2a 20 6c 6f 77 65 72 20 33 30 20   in.** lower 30 
18c0: 62 69 74 73 20 6f 66 20 61 20 33 32 2d 62 69 74  bits of a 32-bit
18d0: 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 2e   signed integer.
18e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
18f0: 74 72 6c 65 6e 33 30 28 63 6f 6e 73 74 20 63 68  trlen30(const ch
1900: 61 72 20 2a 7a 29 7b 0a 20 20 63 6f 6e 73 74 20  ar *z){.  const 
1910: 63 68 61 72 20 2a 7a 32 20 3d 20 7a 3b 0a 20 20  char *z2 = z;.  
1920: 77 68 69 6c 65 28 20 2a 7a 32 20 29 7b 20 7a 32  while( *z2 ){ z2
1930: 2b 2b 3b 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ++; }.  return 0
1940: 78 33 66 66 66 66 66 66 66 20 26 20 28 69 6e 74  x3fffffff & (int
1950: 29 28 7a 32 20 2d 20 7a 29 3b 0a 7d 0a 0a 0a 23  )(z2 - z);.}...#
1960: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1970: 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 2f 2a 0a 2a  IT_INCRBLOB./*.*
1980: 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 69 6e 63 72  * Close all incr
1990: 62 6c 6f 62 20 63 68 61 6e 6e 65 6c 73 20 6f 70  blob channels op
19a0: 65 6e 65 64 20 75 73 69 6e 67 20 64 61 74 61 62  ened using datab
19b0: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70  ase connection p
19c0: 44 62 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 63  Db..** This is c
19d0: 61 6c 6c 65 64 20 77 68 65 6e 20 73 68 75 74 74  alled when shutt
19e0: 69 6e 67 20 64 6f 77 6e 20 74 68 65 20 64 61 74  ing down the dat
19f0: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
1a00: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1a10: 20 63 6c 6f 73 65 49 6e 63 72 62 6c 6f 62 43 68   closeIncrblobCh
1a20: 61 6e 6e 65 6c 73 28 53 71 6c 69 74 65 44 62 20  annels(SqliteDb 
1a30: 2a 70 44 62 29 7b 0a 20 20 49 6e 63 72 62 6c 6f  *pDb){.  Incrblo
1a40: 62 43 68 61 6e 6e 65 6c 20 2a 70 3b 0a 20 20 49  bChannel *p;.  I
1a50: 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a  ncrblobChannel *
1a60: 70 4e 65 78 74 3b 0a 0a 20 20 66 6f 72 28 70 3d  pNext;..  for(p=
1a70: 70 44 62 2d 3e 70 49 6e 63 72 62 6c 6f 62 3b 20  pDb->pIncrblob; 
1a80: 70 3b 20 70 3d 70 4e 65 78 74 29 7b 0a 20 20 20  p; p=pNext){.   
1a90: 20 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78   pNext = p->pNex
1aa0: 74 3b 0a 0a 20 20 20 20 2f 2a 20 4e 6f 74 65 3a  t;..    /* Note:
1ab0: 20 43 61 6c 6c 69 6e 67 20 75 6e 72 65 67 69 73   Calling unregis
1ac0: 74 65 72 20 68 65 72 65 20 63 61 6c 6c 20 54 63  ter here call Tc
1ad0: 6c 5f 43 6c 6f 73 65 20 6f 6e 20 74 68 65 20 69  l_Close on the i
1ae0: 6e 63 72 62 6c 6f 62 20 63 68 61 6e 6e 65 6c 2c  ncrblob channel,
1af0: 20 0a 20 20 20 20 2a 2a 20 77 68 69 63 68 20 64   .    ** which d
1b00: 65 6c 65 74 65 73 20 74 68 65 20 49 6e 63 72 62  eletes the Incrb
1b10: 6c 6f 62 43 68 61 6e 6e 65 6c 20 73 74 72 75 63  lobChannel struc
1b20: 74 75 72 65 20 61 74 20 2a 70 2e 20 53 6f 20 64  ture at *p. So d
1b30: 6f 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 63 61 6c  o not.    ** cal
1b40: 6c 20 54 63 6c 5f 46 72 65 65 28 29 20 68 65 72  l Tcl_Free() her
1b50: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 54 63  e..    */.    Tc
1b60: 6c 5f 55 6e 72 65 67 69 73 74 65 72 43 68 61 6e  l_UnregisterChan
1b70: 6e 65 6c 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c  nel(pDb->interp,
1b80: 20 70 2d 3e 63 68 61 6e 6e 65 6c 29 3b 0a 20 20   p->channel);.  
1b90: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  }.}../*.** Close
1ba0: 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20   an incremental 
1bb0: 62 6c 6f 62 20 63 68 61 6e 6e 65 6c 2e 0a 2a 2f  blob channel..*/
1bc0: 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 63 72  .static int incr
1bd0: 62 6c 6f 62 43 6c 6f 73 65 28 43 6c 69 65 6e 74  blobClose(Client
1be0: 44 61 74 61 20 69 6e 73 74 61 6e 63 65 44 61 74  Data instanceDat
1bf0: 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  a, Tcl_Interp *i
1c00: 6e 74 65 72 70 29 7b 0a 20 20 49 6e 63 72 62 6c  nterp){.  Incrbl
1c10: 6f 62 43 68 61 6e 6e 65 6c 20 2a 70 20 3d 20 28  obChannel *p = (
1c20: 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20  IncrblobChannel 
1c30: 2a 29 69 6e 73 74 61 6e 63 65 44 61 74 61 3b 0a  *)instanceData;.
1c40: 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74    int rc = sqlit
1c50: 65 33 5f 62 6c 6f 62 5f 63 6c 6f 73 65 28 70 2d  e3_blob_close(p-
1c60: 3e 70 42 6c 6f 62 29 3b 0a 20 20 73 71 6c 69 74  >pBlob);.  sqlit
1c70: 65 33 20 2a 64 62 20 3d 20 70 2d 3e 70 44 62 2d  e3 *db = p->pDb-
1c80: 3e 64 62 3b 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76  >db;..  /* Remov
1c90: 65 20 74 68 65 20 63 68 61 6e 6e 65 6c 20 66 72  e the channel fr
1ca0: 6f 6d 20 74 68 65 20 53 71 6c 69 74 65 44 62 2e  om the SqliteDb.
1cb0: 70 49 6e 63 72 62 6c 6f 62 20 6c 69 73 74 2e 20  pIncrblob list. 
1cc0: 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 4e 65 78  */.  if( p->pNex
1cd0: 74 20 29 7b 0a 20 20 20 20 70 2d 3e 70 4e 65 78  t ){.    p->pNex
1ce0: 74 2d 3e 70 50 72 65 76 20 3d 20 70 2d 3e 70 50  t->pPrev = p->pP
1cf0: 72 65 76 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  rev;.  }.  if( p
1d00: 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20 70  ->pPrev ){.    p
1d10: 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d  ->pPrev->pNext =
1d20: 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20   p->pNext;.  }. 
1d30: 20 69 66 28 20 70 2d 3e 70 44 62 2d 3e 70 49 6e   if( p->pDb->pIn
1d40: 63 72 62 6c 6f 62 3d 3d 70 20 29 7b 0a 20 20 20  crblob==p ){.   
1d50: 20 70 2d 3e 70 44 62 2d 3e 70 49 6e 63 72 62 6c   p->pDb->pIncrbl
1d60: 6f 62 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20  ob = p->pNext;. 
1d70: 20 7d 0a 0a 20 20 2f 2a 20 46 72 65 65 20 74 68   }..  /* Free th
1d80: 65 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65  e IncrblobChanne
1d90: 6c 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  l structure */. 
1da0: 20 54 63 6c 5f 46 72 65 65 28 28 63 68 61 72 20   Tcl_Free((char 
1db0: 2a 29 70 29 3b 0a 0a 20 20 69 66 28 20 72 63 21  *)p);..  if( rc!
1dc0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1dd0: 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28    Tcl_SetResult(
1de0: 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29  interp, (char *)
1df0: 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64  sqlite3_errmsg(d
1e00: 62 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45  b), TCL_VOLATILE
1e10: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
1e20: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72  L_ERROR;.  }.  r
1e30: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
1e40: 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 64 61 74 61  ./*.** Read data
1e50: 20 66 72 6f 6d 20 61 6e 20 69 6e 63 72 65 6d 65   from an increme
1e60: 6e 74 61 6c 20 62 6c 6f 62 20 63 68 61 6e 6e 65  ntal blob channe
1e70: 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  l..*/.static int
1e80: 20 69 6e 63 72 62 6c 6f 62 49 6e 70 75 74 28 0a   incrblobInput(.
1e90: 20 20 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73    ClientData ins
1ea0: 74 61 6e 63 65 44 61 74 61 2c 20 0a 20 20 63 68  tanceData, .  ch
1eb0: 61 72 20 2a 62 75 66 2c 20 0a 20 20 69 6e 74 20  ar *buf, .  int 
1ec0: 62 75 66 53 69 7a 65 2c 0a 20 20 69 6e 74 20 2a  bufSize,.  int *
1ed0: 65 72 72 6f 72 43 6f 64 65 50 74 72 0a 29 7b 0a  errorCodePtr.){.
1ee0: 20 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65    IncrblobChanne
1ef0: 6c 20 2a 70 20 3d 20 28 49 6e 63 72 62 6c 6f 62  l *p = (Incrblob
1f00: 43 68 61 6e 6e 65 6c 20 2a 29 69 6e 73 74 61 6e  Channel *)instan
1f10: 63 65 44 61 74 61 3b 0a 20 20 69 6e 74 20 6e 52  ceData;.  int nR
1f20: 65 61 64 20 3d 20 62 75 66 53 69 7a 65 3b 20 20  ead = bufSize;  
1f30: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1f40: 20 6f 66 20 62 79 74 65 73 20 74 6f 20 72 65 61   of bytes to rea
1f50: 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 6c 6f 62  d */.  int nBlob
1f60: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1f70: 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a      /* Total siz
1f80: 65 20 6f 66 20 74 68 65 20 62 6c 6f 62 20 2a 2f  e of the blob */
1f90: 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
1fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb0: 2f 2a 20 73 71 6c 69 74 65 20 65 72 72 6f 72 20  /* sqlite error 
1fc0: 63 6f 64 65 20 2a 2f 0a 0a 20 20 6e 42 6c 6f 62  code */..  nBlob
1fd0: 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f   = sqlite3_blob_
1fe0: 62 79 74 65 73 28 70 2d 3e 70 42 6c 6f 62 29 3b  bytes(p->pBlob);
1ff0: 0a 20 20 69 66 28 20 28 70 2d 3e 69 53 65 65 6b  .  if( (p->iSeek
2000: 2b 6e 52 65 61 64 29 3e 6e 42 6c 6f 62 20 29 7b  +nRead)>nBlob ){
2010: 0a 20 20 20 20 6e 52 65 61 64 20 3d 20 6e 42 6c  .    nRead = nBl
2020: 6f 62 2d 70 2d 3e 69 53 65 65 6b 3b 0a 20 20 7d  ob-p->iSeek;.  }
2030: 0a 20 20 69 66 28 20 6e 52 65 61 64 3c 3d 30 20  .  if( nRead<=0 
2040: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
2050: 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 73 71 6c  .  }..  rc = sql
2060: 69 74 65 33 5f 62 6c 6f 62 5f 72 65 61 64 28 70  ite3_blob_read(p
2070: 2d 3e 70 42 6c 6f 62 2c 20 28 76 6f 69 64 20 2a  ->pBlob, (void *
2080: 29 62 75 66 2c 20 6e 52 65 61 64 2c 20 70 2d 3e  )buf, nRead, p->
2090: 69 53 65 65 6b 29 3b 0a 20 20 69 66 28 20 72 63  iSeek);.  if( rc
20a0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
20b0: 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72     *errorCodePtr
20c0: 20 3d 20 72 63 3b 0a 20 20 20 20 72 65 74 75 72   = rc;.    retur
20d0: 6e 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 70 2d 3e  n -1;.  }..  p->
20e0: 69 53 65 65 6b 20 2b 3d 20 6e 52 65 61 64 3b 0a  iSeek += nRead;.
20f0: 20 20 72 65 74 75 72 6e 20 6e 52 65 61 64 3b 0a    return nRead;.
2100: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 64  }../*.** Write d
2110: 61 74 61 20 74 6f 20 61 6e 20 69 6e 63 72 65 6d  ata to an increm
2120: 65 6e 74 61 6c 20 62 6c 6f 62 20 63 68 61 6e 6e  ental blob chann
2130: 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  el..*/.static in
2140: 74 20 69 6e 63 72 62 6c 6f 62 4f 75 74 70 75 74  t incrblobOutput
2150: 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 69  (.  ClientData i
2160: 6e 73 74 61 6e 63 65 44 61 74 61 2c 20 0a 20 20  nstanceData, .  
2170: 43 4f 4e 53 54 20 63 68 61 72 20 2a 62 75 66 2c  CONST char *buf,
2180: 20 0a 20 20 69 6e 74 20 74 6f 57 72 69 74 65 2c   .  int toWrite,
2190: 0a 20 20 69 6e 74 20 2a 65 72 72 6f 72 43 6f 64  .  int *errorCod
21a0: 65 50 74 72 0a 29 7b 0a 20 20 49 6e 63 72 62 6c  ePtr.){.  Incrbl
21b0: 6f 62 43 68 61 6e 6e 65 6c 20 2a 70 20 3d 20 28  obChannel *p = (
21c0: 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20  IncrblobChannel 
21d0: 2a 29 69 6e 73 74 61 6e 63 65 44 61 74 61 3b 0a  *)instanceData;.
21e0: 20 20 69 6e 74 20 6e 57 72 69 74 65 20 3d 20 74    int nWrite = t
21f0: 6f 57 72 69 74 65 3b 20 20 20 20 20 20 20 20 2f  oWrite;        /
2200: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
2210: 73 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a 20 20  s to write */.  
2220: 69 6e 74 20 6e 42 6c 6f 62 3b 20 20 20 20 20 20  int nBlob;      
2230: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2240: 54 6f 74 61 6c 20 73 69 7a 65 20 6f 66 20 74 68  Total size of th
2250: 65 20 62 6c 6f 62 20 2a 2f 0a 20 20 69 6e 74 20  e blob */.  int 
2260: 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
2270: 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69           /* sqli
2280: 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f  te error code */
2290: 0a 0a 20 20 6e 42 6c 6f 62 20 3d 20 73 71 6c 69  ..  nBlob = sqli
22a0: 74 65 33 5f 62 6c 6f 62 5f 62 79 74 65 73 28 70  te3_blob_bytes(p
22b0: 2d 3e 70 42 6c 6f 62 29 3b 0a 20 20 69 66 28 20  ->pBlob);.  if( 
22c0: 28 70 2d 3e 69 53 65 65 6b 2b 6e 57 72 69 74 65  (p->iSeek+nWrite
22d0: 29 3e 6e 42 6c 6f 62 20 29 7b 0a 20 20 20 20 2a  )>nBlob ){.    *
22e0: 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 45  errorCodePtr = E
22f0: 49 4e 56 41 4c 3b 0a 20 20 20 20 72 65 74 75 72  INVAL;.    retur
2300: 6e 20 2d 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20  n -1;.  }.  if( 
2310: 6e 57 72 69 74 65 3c 3d 30 20 29 7b 0a 20 20 20  nWrite<=0 ){.   
2320: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a   return 0;.  }..
2330: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62    rc = sqlite3_b
2340: 6c 6f 62 5f 77 72 69 74 65 28 70 2d 3e 70 42 6c  lob_write(p->pBl
2350: 6f 62 2c 20 28 76 6f 69 64 20 2a 29 62 75 66 2c  ob, (void *)buf,
2360: 20 6e 57 72 69 74 65 2c 20 70 2d 3e 69 53 65 65   nWrite, p->iSee
2370: 6b 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  k);.  if( rc!=SQ
2380: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a  LITE_OK ){.    *
2390: 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 45  errorCodePtr = E
23a0: 49 4f 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 2d  IO;.    return -
23b0: 31 3b 0a 20 20 7d 0a 0a 20 20 70 2d 3e 69 53 65  1;.  }..  p->iSe
23c0: 65 6b 20 2b 3d 20 6e 57 72 69 74 65 3b 0a 20 20  ek += nWrite;.  
23d0: 72 65 74 75 72 6e 20 6e 57 72 69 74 65 3b 0a 7d  return nWrite;.}
23e0: 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20 61 6e 20  ../*.** Seek an 
23f0: 69 6e 63 72 65 6d 65 6e 74 61 6c 20 62 6c 6f 62  incremental blob
2400: 20 63 68 61 6e 6e 65 6c 2e 0a 2a 2f 0a 73 74 61   channel..*/.sta
2410: 74 69 63 20 69 6e 74 20 69 6e 63 72 62 6c 6f 62  tic int incrblob
2420: 53 65 65 6b 28 0a 20 20 43 6c 69 65 6e 74 44 61  Seek(.  ClientDa
2430: 74 61 20 69 6e 73 74 61 6e 63 65 44 61 74 61 2c  ta instanceData,
2440: 20 0a 20 20 6c 6f 6e 67 20 6f 66 66 73 65 74 2c   .  long offset,
2450: 0a 20 20 69 6e 74 20 73 65 65 6b 4d 6f 64 65 2c  .  int seekMode,
2460: 0a 20 20 69 6e 74 20 2a 65 72 72 6f 72 43 6f 64  .  int *errorCod
2470: 65 50 74 72 0a 29 7b 0a 20 20 49 6e 63 72 62 6c  ePtr.){.  Incrbl
2480: 6f 62 43 68 61 6e 6e 65 6c 20 2a 70 20 3d 20 28  obChannel *p = (
2490: 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20  IncrblobChannel 
24a0: 2a 29 69 6e 73 74 61 6e 63 65 44 61 74 61 3b 0a  *)instanceData;.
24b0: 0a 20 20 73 77 69 74 63 68 28 20 73 65 65 6b 4d  .  switch( seekM
24c0: 6f 64 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20  ode ){.    case 
24d0: 53 45 45 4b 5f 53 45 54 3a 0a 20 20 20 20 20 20  SEEK_SET:.      
24e0: 70 2d 3e 69 53 65 65 6b 20 3d 20 6f 66 66 73 65  p->iSeek = offse
24f0: 74 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  t;.      break;.
2500: 20 20 20 20 63 61 73 65 20 53 45 45 4b 5f 43 55      case SEEK_CU
2510: 52 3a 0a 20 20 20 20 20 20 70 2d 3e 69 53 65 65  R:.      p->iSee
2520: 6b 20 2b 3d 20 6f 66 66 73 65 74 3b 0a 20 20 20  k += offset;.   
2530: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
2540: 73 65 20 53 45 45 4b 5f 45 4e 44 3a 0a 20 20 20  se SEEK_END:.   
2550: 20 20 20 70 2d 3e 69 53 65 65 6b 20 3d 20 73 71     p->iSeek = sq
2560: 6c 69 74 65 33 5f 62 6c 6f 62 5f 62 79 74 65 73  lite3_blob_bytes
2570: 28 70 2d 3e 70 42 6c 6f 62 29 20 2b 20 6f 66 66  (p->pBlob) + off
2580: 73 65 74 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  set;.      break
2590: 3b 0a 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20  ;..    default: 
25a0: 61 73 73 65 72 74 28 21 22 42 61 64 20 73 65 65  assert(!"Bad see
25b0: 6b 4d 6f 64 65 22 29 3b 0a 20 20 7d 0a 0a 20 20  kMode");.  }..  
25c0: 72 65 74 75 72 6e 20 70 2d 3e 69 53 65 65 6b 3b  return p->iSeek;
25d0: 0a 7d 0a 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  .}...static void
25e0: 20 69 6e 63 72 62 6c 6f 62 57 61 74 63 68 28 43   incrblobWatch(C
25f0: 6c 69 65 6e 74 44 61 74 61 20 69 6e 73 74 61 6e  lientData instan
2600: 63 65 44 61 74 61 2c 20 69 6e 74 20 6d 6f 64 65  ceData, int mode
2610: 29 7b 20 0a 20 20 2f 2a 20 4e 4f 2d 4f 50 20 2a  ){ .  /* NO-OP *
2620: 2f 20 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20  / .}.static int 
2630: 69 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 28 43  incrblobHandle(C
2640: 6c 69 65 6e 74 44 61 74 61 20 69 6e 73 74 61 6e  lientData instan
2650: 63 65 44 61 74 61 2c 20 69 6e 74 20 64 69 72 2c  ceData, int dir,
2660: 20 43 6c 69 65 6e 74 44 61 74 61 20 2a 68 50 74   ClientData *hPt
2670: 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  r){.  return TCL
2680: 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 73 74 61 74 69  _ERROR;.}..stati
2690: 63 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 54 79 70  c Tcl_ChannelTyp
26a0: 65 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65  e IncrblobChanne
26b0: 6c 54 79 70 65 20 3d 20 7b 0a 20 20 22 69 6e 63  lType = {.  "inc
26c0: 72 62 6c 6f 62 22 2c 20 20 20 20 20 20 20 20 20  rblob",         
26d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26e0: 2a 20 74 79 70 65 4e 61 6d 65 20 20 20 20 20 20  * typeName      
26f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2700: 20 20 20 20 20 20 20 2a 2f 0a 20 20 54 43 4c 5f         */.  TCL_
2710: 43 48 41 4e 4e 45 4c 5f 56 45 52 53 49 4f 4e 5f  CHANNEL_VERSION_
2720: 32 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  2,             /
2730: 2a 20 76 65 72 73 69 6f 6e 20 20 20 20 20 20 20  * version       
2740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2750: 20 20 20 20 20 20 20 2a 2f 0a 20 20 69 6e 63 72         */.  incr
2760: 62 6c 6f 62 43 6c 6f 73 65 2c 20 20 20 20 20 20  blobClose,      
2770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2780: 2a 20 63 6c 6f 73 65 50 72 6f 63 20 20 20 20 20  * closeProc     
2790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27a0: 20 20 20 20 20 20 20 2a 2f 0a 20 20 69 6e 63 72         */.  incr
27b0: 62 6c 6f 62 49 6e 70 75 74 2c 20 20 20 20 20 20  blobInput,      
27c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
27d0: 2a 20 69 6e 70 75 74 50 72 6f 63 20 20 20 20 20  * inputProc     
27e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27f0: 20 20 20 20 20 20 20 2a 2f 0a 20 20 69 6e 63 72         */.  incr
2800: 62 6c 6f 62 4f 75 74 70 75 74 2c 20 20 20 20 20  blobOutput,     
2810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2820: 2a 20 6f 75 74 70 75 74 50 72 6f 63 20 20 20 20  * outputProc    
2830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2840: 20 20 20 20 20 20 20 2a 2f 0a 20 20 69 6e 63 72         */.  incr
2850: 62 6c 6f 62 53 65 65 6b 2c 20 20 20 20 20 20 20  blobSeek,       
2860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2870: 2a 20 73 65 65 6b 50 72 6f 63 20 20 20 20 20 20  * seekProc      
2880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2890: 20 20 20 20 20 20 20 2a 2f 0a 20 20 30 2c 20 20         */.  0,  
28a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
28c0: 2a 20 73 65 74 4f 70 74 69 6f 6e 50 72 6f 63 20  * setOptionProc 
28d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28e0: 20 20 20 20 20 20 20 2a 2f 0a 20 20 30 2c 20 20         */.  0,  
28f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2910: 2a 20 67 65 74 4f 70 74 69 6f 6e 50 72 6f 63 20  * getOptionProc 
2920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2930: 20 20 20 20 20 20 20 2a 2f 0a 20 20 69 6e 63 72         */.  incr
2940: 62 6c 6f 62 57 61 74 63 68 2c 20 20 20 20 20 20  blobWatch,      
2950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2960: 2a 20 77 61 74 63 68 50 72 6f 63 20 28 74 68 69  * watchProc (thi
2970: 73 20 69 73 20 61 20 6e 6f 2d 6f 70 29 20 20 20  s is a no-op)   
2980: 20 20 20 20 20 20 20 2a 2f 0a 20 20 69 6e 63 72         */.  incr
2990: 62 6c 6f 62 48 61 6e 64 6c 65 2c 20 20 20 20 20  blobHandle,     
29a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
29b0: 2a 20 67 65 74 48 61 6e 64 6c 65 50 72 6f 63 20  * getHandleProc 
29c0: 28 61 6c 77 61 79 73 20 72 65 74 75 72 6e 73 20  (always returns 
29d0: 65 72 72 6f 72 29 20 2a 2f 0a 20 20 30 2c 20 20  error) */.  0,  
29e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a00: 2a 20 63 6c 6f 73 65 32 50 72 6f 63 20 20 20 20  * close2Proc    
2a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a20: 20 20 20 20 20 20 20 2a 2f 0a 20 20 30 2c 20 20         */.  0,  
2a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a50: 2a 20 62 6c 6f 63 6b 4d 6f 64 65 50 72 6f 63 20  * blockModeProc 
2a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a70: 20 20 20 20 20 20 20 2a 2f 0a 20 20 30 2c 20 20         */.  0,  
2a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2aa0: 2a 20 66 6c 75 73 68 50 72 6f 63 20 20 20 20 20  * flushProc     
2ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ac0: 20 20 20 20 20 20 20 2a 2f 0a 20 20 30 2c 20 20         */.  0,  
2ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2af0: 2a 20 68 61 6e 64 6c 65 72 50 72 6f 63 20 20 20  * handlerProc   
2b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b10: 20 20 20 20 20 20 20 2a 2f 0a 20 20 30 2c 20 20         */.  0,  
2b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2b40: 2a 20 77 69 64 65 53 65 65 6b 50 72 6f 63 20 20  * wideSeekProc  
2b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b60: 20 20 20 20 20 20 20 2a 2f 0a 7d 3b 0a 0a 2f 2a         */.};../*
2b70: 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77  .** Create a new
2b80: 20 69 6e 63 72 62 6c 6f 62 20 63 68 61 6e 6e 65   incrblob channe
2b90: 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  l..*/.static int
2ba0: 20 63 72 65 61 74 65 49 6e 63 72 62 6c 6f 62 43   createIncrblobC
2bb0: 68 61 6e 6e 65 6c 28 0a 20 20 54 63 6c 5f 49 6e  hannel(.  Tcl_In
2bc0: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 0a 20  terp *interp, . 
2bd0: 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 2c 20   SqliteDb *pDb, 
2be0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
2bf0: 44 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  Db,.  const char
2c00: 20 2a 7a 54 61 62 6c 65 2c 20 0a 20 20 63 6f 6e   *zTable, .  con
2c10: 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 75 6d 6e  st char *zColumn
2c20: 2c 20 0a 20 20 73 71 6c 69 74 65 5f 69 6e 74 36  , .  sqlite_int6
2c30: 34 20 69 52 6f 77 2c 0a 20 20 69 6e 74 20 69 73  4 iRow,.  int is
2c40: 52 65 61 64 6f 6e 6c 79 0a 29 7b 0a 20 20 49 6e  Readonly.){.  In
2c50: 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 70  crblobChannel *p
2c60: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
2c70: 3d 20 70 44 62 2d 3e 64 62 3b 0a 20 20 73 71 6c  = pDb->db;.  sql
2c80: 69 74 65 33 5f 62 6c 6f 62 20 2a 70 42 6c 6f 62  ite3_blob *pBlob
2c90: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e  ;.  int rc;.  in
2ca0: 74 20 66 6c 61 67 73 20 3d 20 54 43 4c 5f 52 45  t flags = TCL_RE
2cb0: 41 44 41 42 4c 45 7c 28 69 73 52 65 61 64 6f 6e  ADABLE|(isReadon
2cc0: 6c 79 20 3f 20 30 20 3a 20 54 43 4c 5f 57 52 49  ly ? 0 : TCL_WRI
2cd0: 54 41 42 4c 45 29 3b 0a 0a 20 20 2f 2a 20 54 68  TABLE);..  /* Th
2ce0: 69 73 20 76 61 72 69 61 62 6c 65 20 69 73 20 75  is variable is u
2cf0: 73 65 64 20 74 6f 20 6e 61 6d 65 20 74 68 65 20  sed to name the 
2d00: 63 68 61 6e 6e 65 6c 73 3a 20 22 69 6e 63 72 62  channels: "incrb
2d10: 6c 6f 62 5f 5b 69 6e 63 72 20 63 6f 75 6e 74 5d  lob_[incr count]
2d20: 22 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 69 6e  " */.  static in
2d30: 74 20 63 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 63  t count = 0;.  c
2d40: 68 61 72 20 7a 43 68 61 6e 6e 65 6c 5b 36 34 5d  har zChannel[64]
2d50: 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
2d60: 33 5f 62 6c 6f 62 5f 6f 70 65 6e 28 64 62 2c 20  3_blob_open(db, 
2d70: 7a 44 62 2c 20 7a 54 61 62 6c 65 2c 20 7a 43 6f  zDb, zTable, zCo
2d80: 6c 75 6d 6e 2c 20 69 52 6f 77 2c 20 21 69 73 52  lumn, iRow, !isR
2d90: 65 61 64 6f 6e 6c 79 2c 20 26 70 42 6c 6f 62 29  eadonly, &pBlob)
2da0: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
2db0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c  TE_OK ){.    Tcl
2dc0: 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
2dd0: 70 2c 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74  p, (char *)sqlit
2de0: 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64  e3_errmsg(pDb->d
2df0: 62 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45  b), TCL_VOLATILE
2e00: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
2e10: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
2e20: 70 20 3d 20 28 49 6e 63 72 62 6c 6f 62 43 68 61  p = (IncrblobCha
2e30: 6e 6e 65 6c 20 2a 29 54 63 6c 5f 41 6c 6c 6f 63  nnel *)Tcl_Alloc
2e40: 28 73 69 7a 65 6f 66 28 49 6e 63 72 62 6c 6f 62  (sizeof(Incrblob
2e50: 43 68 61 6e 6e 65 6c 29 29 3b 0a 20 20 70 2d 3e  Channel));.  p->
2e60: 69 53 65 65 6b 20 3d 20 30 3b 0a 20 20 70 2d 3e  iSeek = 0;.  p->
2e70: 70 42 6c 6f 62 20 3d 20 70 42 6c 6f 62 3b 0a 0a  pBlob = pBlob;..
2e80: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
2e90: 74 66 28 73 69 7a 65 6f 66 28 7a 43 68 61 6e 6e  tf(sizeof(zChann
2ea0: 65 6c 29 2c 20 7a 43 68 61 6e 6e 65 6c 2c 20 22  el), zChannel, "
2eb0: 69 6e 63 72 62 6c 6f 62 5f 25 64 22 2c 20 2b 2b  incrblob_%d", ++
2ec0: 63 6f 75 6e 74 29 3b 0a 20 20 70 2d 3e 63 68 61  count);.  p->cha
2ed0: 6e 6e 65 6c 20 3d 20 54 63 6c 5f 43 72 65 61 74  nnel = Tcl_Creat
2ee0: 65 43 68 61 6e 6e 65 6c 28 26 49 6e 63 72 62 6c  eChannel(&Incrbl
2ef0: 6f 62 43 68 61 6e 6e 65 6c 54 79 70 65 2c 20 7a  obChannelType, z
2f00: 43 68 61 6e 6e 65 6c 2c 20 70 2c 20 66 6c 61 67  Channel, p, flag
2f10: 73 29 3b 0a 20 20 54 63 6c 5f 52 65 67 69 73 74  s);.  Tcl_Regist
2f20: 65 72 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70  erChannel(interp
2f30: 2c 20 70 2d 3e 63 68 61 6e 6e 65 6c 29 3b 0a 0a  , p->channel);..
2f40: 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 6e 65    /* Link the ne
2f50: 77 20 63 68 61 6e 6e 65 6c 20 69 6e 74 6f 20 74  w channel into t
2f60: 68 65 20 53 71 6c 69 74 65 44 62 2e 70 49 6e 63  he SqliteDb.pInc
2f70: 72 62 6c 6f 62 20 6c 69 73 74 2e 20 2a 2f 0a 20  rblob list. */. 
2f80: 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 44 62 2d   p->pNext = pDb-
2f90: 3e 70 49 6e 63 72 62 6c 6f 62 3b 0a 20 20 70 2d  >pIncrblob;.  p-
2fa0: 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 69 66  >pPrev = 0;.  if
2fb0: 28 20 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20  ( p->pNext ){.  
2fc0: 20 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65    p->pNext->pPre
2fd0: 76 20 3d 20 70 3b 0a 20 20 7d 0a 20 20 70 44 62  v = p;.  }.  pDb
2fe0: 2d 3e 70 49 6e 63 72 62 6c 6f 62 20 3d 20 70 3b  ->pIncrblob = p;
2ff0: 0a 20 20 70 2d 3e 70 44 62 20 3d 20 70 44 62 3b  .  p->pDb = pDb;
3000: 0a 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c  ..  Tcl_SetResul
3010: 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20  t(interp, (char 
3020: 2a 29 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c  *)Tcl_GetChannel
3030: 4e 61 6d 65 28 70 2d 3e 63 68 61 6e 6e 65 6c 29  Name(p->channel)
3040: 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b  , TCL_VOLATILE);
3050: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
3060: 3b 0a 7d 0a 23 65 6c 73 65 20 20 2f 2a 20 65 6c  ;.}.#else  /* el
3070: 73 65 20 63 6c 61 75 73 65 20 66 6f 72 20 22 23  se clause for "#
3080: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
3090: 49 54 5f 49 4e 43 52 42 4c 4f 42 22 20 2a 2f 0a  IT_INCRBLOB" */.
30a0: 20 20 23 64 65 66 69 6e 65 20 63 6c 6f 73 65 49    #define closeI
30b0: 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 73 28  ncrblobChannels(
30c0: 70 44 62 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  pDb).#endif../*.
30d0: 2a 2a 20 4c 6f 6f 6b 20 61 74 20 74 68 65 20 73  ** Look at the s
30e0: 63 72 69 70 74 20 70 72 65 66 69 78 20 69 6e 20  cript prefix in 
30f0: 70 43 6d 64 2e 20 20 57 65 20 77 69 6c 6c 20 62  pCmd.  We will b
3100: 65 20 65 78 65 63 75 74 69 6e 67 20 74 68 69 73  e executing this
3110: 20 73 63 72 69 70 74 0a 2a 2a 20 61 66 74 65 72   script.** after
3120: 20 66 69 72 73 74 20 61 70 70 65 6e 64 69 6e 67   first appending
3130: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 61 72 67   one or more arg
3140: 75 6d 65 6e 74 73 2e 20 20 54 68 69 73 20 72 6f  uments.  This ro
3150: 75 74 69 6e 65 20 61 6e 61 6c 79 7a 65 73 0a 2a  utine analyzes.*
3160: 2a 20 74 68 65 20 73 63 72 69 70 74 20 74 6f 20  * the script to 
3170: 73 65 65 20 69 66 20 69 74 20 69 73 20 73 61 66  see if it is saf
3180: 65 20 74 6f 20 75 73 65 20 54 63 6c 5f 45 76 61  e to use Tcl_Eva
3190: 6c 4f 62 6a 76 28 29 20 6f 6e 20 74 68 65 20 73  lObjv() on the s
31a0: 63 72 69 70 74 0a 2a 2a 20 72 61 74 68 65 72 20  cript.** rather 
31b0: 74 68 61 6e 20 74 68 65 20 6d 6f 72 65 20 67 65  than the more ge
31c0: 6e 65 72 61 6c 20 54 63 6c 5f 45 76 61 6c 45 78  neral Tcl_EvalEx
31d0: 28 29 2e 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a  ().  Tcl_EvalObj
31e0: 76 28 29 20 69 73 20 6d 75 63 68 0a 2a 2a 20 66  v() is much.** f
31f0: 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 53 63 72  aster..**.** Scr
3200: 69 70 74 73 20 74 68 61 74 20 61 72 65 20 73 61  ipts that are sa
3210: 66 65 20 74 6f 20 75 73 65 20 77 69 74 68 20 54  fe to use with T
3220: 63 6c 5f 45 76 61 6c 4f 62 6a 76 28 29 20 63 6f  cl_EvalObjv() co
3230: 6e 73 69 73 74 73 20 6f 66 20 61 0a 2a 2a 20 63  nsists of a.** c
3240: 6f 6d 6d 61 6e 64 20 6e 61 6d 65 20 66 6f 6c 6c  ommand name foll
3250: 6f 77 65 64 20 62 79 20 7a 65 72 6f 20 6f 72 20  owed by zero or 
3260: 6d 6f 72 65 20 61 72 67 75 6d 65 6e 74 73 20 77  more arguments w
3270: 69 74 68 20 6e 6f 20 5b 2e 2e 2e 5d 20 6f 72 20  ith no [...] or 
3280: 24 0a 2a 2a 20 6f 72 20 7b 2e 2e 2e 7d 20 6f 72  $.** or {...} or
3290: 20 3b 20 74 6f 20 62 65 20 73 65 65 6e 20 61 6e   ; to be seen an
32a0: 79 77 68 65 72 65 2e 20 20 4d 6f 73 74 20 63 61  ywhere.  Most ca
32b0: 6c 6c 62 61 63 6b 20 73 63 72 69 70 74 73 20 63  llback scripts c
32c0: 6f 6e 73 69 73 74 0a 2a 2a 20 6f 66 20 6a 75 73  onsist.** of jus
32d0: 74 20 61 20 73 69 6e 67 6c 65 20 70 72 6f 63 65  t a single proce
32e0: 64 75 72 65 20 6e 61 6d 65 20 61 6e 64 20 74 68  dure name and th
32f0: 65 79 20 6d 65 65 74 20 74 68 69 73 20 72 65 71  ey meet this req
3300: 75 69 72 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61  uirement..*/.sta
3310: 74 69 63 20 69 6e 74 20 73 61 66 65 54 6f 55 73  tic int safeToUs
3320: 65 45 76 61 6c 4f 62 6a 76 28 54 63 6c 5f 49 6e  eEvalObjv(Tcl_In
3330: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 54 63  terp *interp, Tc
3340: 6c 5f 4f 62 6a 20 2a 70 43 6d 64 29 7b 0a 20 20  l_Obj *pCmd){.  
3350: 2f 2a 20 57 65 20 63 6f 75 6c 64 20 74 72 79 20  /* We could try 
3360: 74 6f 20 64 6f 20 73 6f 6d 65 74 68 69 6e 67 20  to do something 
3370: 77 69 74 68 20 54 63 6c 5f 50 61 72 73 65 28 29  with Tcl_Parse()
3380: 2e 20 20 42 75 74 20 77 65 20 77 69 6c 6c 20 69  .  But we will i
3390: 6e 73 74 65 61 64 0a 20 20 2a 2a 20 6a 75 73 74  nstead.  ** just
33a0: 20 64 6f 20 61 20 73 65 61 72 63 68 20 66 6f 72   do a search for
33b0: 20 66 6f 72 62 69 64 64 65 6e 20 63 68 61 72 61   forbidden chara
33c0: 63 74 65 72 73 2e 20 20 49 66 20 61 6e 79 20 6f  cters.  If any o
33d0: 66 20 74 68 65 20 66 6f 72 62 69 64 64 65 6e 0a  f the forbidden.
33e0: 20 20 2a 2a 20 63 68 61 72 61 63 74 65 72 73 20    ** characters 
33f0: 61 70 70 65 61 72 20 69 6e 20 70 43 6d 64 2c 20  appear in pCmd, 
3400: 77 65 20 77 69 6c 6c 20 72 65 70 6f 72 74 20 74  we will report t
3410: 68 65 20 73 74 72 69 6e 67 20 61 73 20 75 6e 73  he string as uns
3420: 61 66 65 2e 0a 20 20 2a 2f 0a 20 20 63 6f 6e 73  afe..  */.  cons
3430: 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 6e 74  t char *z;.  int
3440: 20 6e 3b 0a 20 20 7a 20 3d 20 54 63 6c 5f 47 65   n;.  z = Tcl_Ge
3450: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 70  tStringFromObj(p
3460: 43 6d 64 2c 20 26 6e 29 3b 0a 20 20 77 68 69 6c  Cmd, &n);.  whil
3470: 65 28 20 6e 2d 2d 20 3e 20 30 20 29 7b 0a 20 20  e( n-- > 0 ){.  
3480: 20 20 69 6e 74 20 63 20 3d 20 2a 28 7a 2b 2b 29    int c = *(z++)
3490: 3b 0a 20 20 20 20 69 66 28 20 63 3d 3d 27 24 27  ;.    if( c=='$'
34a0: 20 7c 7c 20 63 3d 3d 27 5b 27 20 7c 7c 20 63 3d   || c=='[' || c=
34b0: 3d 27 3b 27 20 29 20 72 65 74 75 72 6e 20 30 3b  =';' ) return 0;
34c0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b  .  }.  return 1;
34d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61  .}../*.** Find a
34e0: 6e 20 53 71 6c 46 75 6e 63 20 73 74 72 75 63 74  n SqlFunc struct
34f0: 75 72 65 20 77 69 74 68 20 74 68 65 20 67 69 76  ure with the giv
3500: 65 6e 20 6e 61 6d 65 2e 20 20 4f 72 20 63 72 65  en name.  Or cre
3510: 61 74 65 20 61 20 6e 65 77 0a 2a 2a 20 6f 6e 65  ate a new.** one
3520: 20 69 66 20 61 6e 20 65 78 69 73 74 69 6e 67 20   if an existing 
3530: 6f 6e 65 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f  one cannot be fo
3540: 75 6e 64 2e 20 20 52 65 74 75 72 6e 20 61 20 70  und.  Return a p
3550: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 0a 2a 2a  ointer to the.**
3560: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73   structure..*/.s
3570: 74 61 74 69 63 20 53 71 6c 46 75 6e 63 20 2a 66  tatic SqlFunc *f
3580: 69 6e 64 53 71 6c 46 75 6e 63 28 53 71 6c 69 74  indSqlFunc(Sqlit
3590: 65 44 62 20 2a 70 44 62 2c 20 63 6f 6e 73 74 20  eDb *pDb, const 
35a0: 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20  char *zName){.  
35b0: 53 71 6c 46 75 6e 63 20 2a 70 2c 20 2a 70 4e 65  SqlFunc *p, *pNe
35c0: 77 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 70 4e  w;.  int i;.  pN
35d0: 65 77 20 3d 20 28 53 71 6c 46 75 6e 63 2a 29 54  ew = (SqlFunc*)T
35e0: 63 6c 5f 41 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  cl_Alloc( sizeof
35f0: 28 2a 70 4e 65 77 29 20 2b 20 73 74 72 6c 65 6e  (*pNew) + strlen
3600: 33 30 28 7a 4e 61 6d 65 29 20 2b 20 31 20 29 3b  30(zName) + 1 );
3610: 0a 20 20 70 4e 65 77 2d 3e 7a 4e 61 6d 65 20 3d  .  pNew->zName =
3620: 20 28 63 68 61 72 2a 29 26 70 4e 65 77 5b 31 5d   (char*)&pNew[1]
3630: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 7a 4e 61  ;.  for(i=0; zNa
3640: 6d 65 5b 69 5d 3b 20 69 2b 2b 29 7b 20 70 4e 65  me[i]; i++){ pNe
3650: 77 2d 3e 7a 4e 61 6d 65 5b 69 5d 20 3d 20 74 6f  w->zName[i] = to
3660: 6c 6f 77 65 72 28 7a 4e 61 6d 65 5b 69 5d 29 3b  lower(zName[i]);
3670: 20 7d 0a 20 20 70 4e 65 77 2d 3e 7a 4e 61 6d 65   }.  pNew->zName
3680: 5b 69 5d 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70  [i] = 0;.  for(p
3690: 3d 70 44 62 2d 3e 70 46 75 6e 63 3b 20 70 3b 20  =pDb->pFunc; p; 
36a0: 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 20 0a 20 20  p=p->pNext){ .  
36b0: 20 20 69 66 28 20 73 74 72 63 6d 70 28 70 2d 3e    if( strcmp(p->
36c0: 7a 4e 61 6d 65 2c 20 70 4e 65 77 2d 3e 7a 4e 61  zName, pNew->zNa
36d0: 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)==0 ){.      
36e0: 54 63 6c 5f 46 72 65 65 28 28 63 68 61 72 2a 29  Tcl_Free((char*)
36f0: 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 72 65 74  pNew);.      ret
3700: 75 72 6e 20 70 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn p;.    }.  }
3710: 0a 20 20 70 4e 65 77 2d 3e 69 6e 74 65 72 70 20  .  pNew->interp 
3720: 3d 20 70 44 62 2d 3e 69 6e 74 65 72 70 3b 0a 20  = pDb->interp;. 
3730: 20 70 4e 65 77 2d 3e 70 53 63 72 69 70 74 20 3d   pNew->pScript =
3740: 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4e 65 78   0;.  pNew->pNex
3750: 74 20 3d 20 70 44 62 2d 3e 70 46 75 6e 63 3b 0a  t = pDb->pFunc;.
3760: 20 20 70 44 62 2d 3e 70 46 75 6e 63 20 3d 20 70    pDb->pFunc = p
3770: 4e 65 77 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e  New;.  return pN
3780: 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65  ew;.}../*.** Fre
3790: 65 20 61 20 73 69 6e 67 6c 65 20 53 71 6c 50 72  e a single SqlPr
37a0: 65 70 61 72 65 64 53 74 6d 74 20 6f 62 6a 65 63  eparedStmt objec
37b0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
37c0: 64 20 64 62 46 72 65 65 53 74 6d 74 28 53 71 6c  d dbFreeStmt(Sql
37d0: 50 72 65 70 61 72 65 64 53 74 6d 74 20 2a 70 53  PreparedStmt *pS
37e0: 74 6d 74 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  tmt){.#ifdef SQL
37f0: 49 54 45 5f 54 45 53 54 0a 20 20 69 66 28 20 73  ITE_TEST.  if( s
3800: 71 6c 69 74 65 33 5f 73 71 6c 28 70 53 74 6d 74  qlite3_sql(pStmt
3810: 2d 3e 70 53 74 6d 74 29 3d 3d 30 20 29 7b 0a 20  ->pStmt)==0 ){. 
3820: 20 20 20 54 63 6c 5f 46 72 65 65 28 28 63 68 61     Tcl_Free((cha
3830: 72 20 2a 29 70 53 74 6d 74 2d 3e 7a 53 71 6c 29  r *)pStmt->zSql)
3840: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73  ;.  }.#endif.  s
3850: 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
3860: 70 53 74 6d 74 2d 3e 70 53 74 6d 74 29 3b 0a 20  pStmt->pStmt);. 
3870: 20 54 63 6c 5f 46 72 65 65 28 28 63 68 61 72 20   Tcl_Free((char 
3880: 2a 29 70 53 74 6d 74 29 3b 0a 7d 0a 0a 2f 2a 0a  *)pStmt);.}../*.
3890: 2a 2a 20 46 69 6e 61 6c 69 7a 65 20 61 6e 64 20  ** Finalize and 
38a0: 66 72 65 65 20 61 20 6c 69 73 74 20 6f 66 20 70  free a list of p
38b0: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
38c0: 74 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ts.*/.static voi
38d0: 64 20 66 6c 75 73 68 53 74 6d 74 43 61 63 68 65  d flushStmtCache
38e0: 28 53 71 6c 69 74 65 44 62 20 2a 70 44 62 29 7b  (SqliteDb *pDb){
38f0: 0a 20 20 53 71 6c 50 72 65 70 61 72 65 64 53 74  .  SqlPreparedSt
3900: 6d 74 20 2a 70 50 72 65 53 74 6d 74 3b 0a 20 20  mt *pPreStmt;.  
3910: 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74 20  SqlPreparedStmt 
3920: 2a 70 4e 65 78 74 3b 0a 0a 20 20 66 6f 72 28 70  *pNext;..  for(p
3930: 50 72 65 53 74 6d 74 20 3d 20 70 44 62 2d 3e 73  PreStmt = pDb->s
3940: 74 6d 74 4c 69 73 74 3b 20 70 50 72 65 53 74 6d  tmtList; pPreStm
3950: 74 3b 20 70 50 72 65 53 74 6d 74 3d 70 4e 65 78  t; pPreStmt=pNex
3960: 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20  t){.    pNext = 
3970: 70 50 72 65 53 74 6d 74 2d 3e 70 4e 65 78 74 3b  pPreStmt->pNext;
3980: 0a 20 20 20 20 64 62 46 72 65 65 53 74 6d 74 28  .    dbFreeStmt(
3990: 70 50 72 65 53 74 6d 74 29 3b 0a 20 20 7d 0a 20  pPreStmt);.  }. 
39a0: 20 70 44 62 2d 3e 6e 53 74 6d 74 20 3d 20 30 3b   pDb->nStmt = 0;
39b0: 0a 20 20 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74  .  pDb->stmtLast
39c0: 20 3d 20 30 3b 0a 20 20 70 44 62 2d 3e 73 74 6d   = 0;.  pDb->stm
39d0: 74 4c 69 73 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  tList = 0;.}../*
39e0: 0a 2a 2a 20 54 43 4c 20 63 61 6c 6c 73 20 74 68  .** TCL calls th
39f0: 69 73 20 70 72 6f 63 65 64 75 72 65 20 77 68 65  is procedure whe
3a00: 6e 20 61 6e 20 73 71 6c 69 74 65 33 20 64 61 74  n an sqlite3 dat
3a10: 61 62 61 73 65 20 63 6f 6d 6d 61 6e 64 20 69 73  abase command is
3a20: 0a 2a 2a 20 64 65 6c 65 74 65 64 2e 0a 2a 2f 0a  .** deleted..*/.
3a30: 73 74 61 74 69 63 20 76 6f 69 64 20 44 62 44 65  static void DbDe
3a40: 6c 65 74 65 43 6d 64 28 76 6f 69 64 20 2a 64 62  leteCmd(void *db
3a50: 29 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70  ){.  SqliteDb *p
3a60: 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29  Db = (SqliteDb*)
3a70: 64 62 3b 0a 20 20 66 6c 75 73 68 53 74 6d 74 43  db;.  flushStmtC
3a80: 61 63 68 65 28 70 44 62 29 3b 0a 20 20 63 6c 6f  ache(pDb);.  clo
3a90: 73 65 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65  seIncrblobChanne
3aa0: 6c 73 28 70 44 62 29 3b 0a 20 20 73 71 6c 69 74  ls(pDb);.  sqlit
3ab0: 65 33 5f 63 6c 6f 73 65 28 70 44 62 2d 3e 64 62  e3_close(pDb->db
3ac0: 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 44 62 2d  );.  while( pDb-
3ad0: 3e 70 46 75 6e 63 20 29 7b 0a 20 20 20 20 53 71  >pFunc ){.    Sq
3ae0: 6c 46 75 6e 63 20 2a 70 46 75 6e 63 20 3d 20 70  lFunc *pFunc = p
3af0: 44 62 2d 3e 70 46 75 6e 63 3b 0a 20 20 20 20 70  Db->pFunc;.    p
3b00: 44 62 2d 3e 70 46 75 6e 63 20 3d 20 70 46 75 6e  Db->pFunc = pFun
3b10: 63 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 54 63  c->pNext;.    Tc
3b20: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70  l_DecrRefCount(p
3b30: 46 75 6e 63 2d 3e 70 53 63 72 69 70 74 29 3b 0a  Func->pScript);.
3b40: 20 20 20 20 54 63 6c 5f 46 72 65 65 28 28 63 68      Tcl_Free((ch
3b50: 61 72 2a 29 70 46 75 6e 63 29 3b 0a 20 20 7d 0a  ar*)pFunc);.  }.
3b60: 20 20 77 68 69 6c 65 28 20 70 44 62 2d 3e 70 43    while( pDb->pC
3b70: 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 53 71  ollate ){.    Sq
3b80: 6c 43 6f 6c 6c 61 74 65 20 2a 70 43 6f 6c 6c 61  lCollate *pColla
3b90: 74 65 20 3d 20 70 44 62 2d 3e 70 43 6f 6c 6c 61  te = pDb->pColla
3ba0: 74 65 3b 0a 20 20 20 20 70 44 62 2d 3e 70 43 6f  te;.    pDb->pCo
3bb0: 6c 6c 61 74 65 20 3d 20 70 43 6f 6c 6c 61 74 65  llate = pCollate
3bc0: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 54 63 6c  ->pNext;.    Tcl
3bd0: 5f 46 72 65 65 28 28 63 68 61 72 2a 29 70 43 6f  _Free((char*)pCo
3be0: 6c 6c 61 74 65 29 3b 0a 20 20 7d 0a 20 20 69 66  llate);.  }.  if
3bf0: 28 20 70 44 62 2d 3e 7a 42 75 73 79 20 29 7b 0a  ( pDb->zBusy ){.
3c00: 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62      Tcl_Free(pDb
3c10: 2d 3e 7a 42 75 73 79 29 3b 0a 20 20 7d 0a 20 20  ->zBusy);.  }.  
3c20: 69 66 28 20 70 44 62 2d 3e 7a 54 72 61 63 65 20  if( pDb->zTrace 
3c30: 29 7b 0a 20 20 20 20 54 63 6c 5f 46 72 65 65 28  ){.    Tcl_Free(
3c40: 70 44 62 2d 3e 7a 54 72 61 63 65 29 3b 0a 20 20  pDb->zTrace);.  
3c50: 7d 0a 20 20 69 66 28 20 70 44 62 2d 3e 7a 50 72  }.  if( pDb->zPr
3c60: 6f 66 69 6c 65 20 29 7b 0a 20 20 20 20 54 63 6c  ofile ){.    Tcl
3c70: 5f 46 72 65 65 28 70 44 62 2d 3e 7a 50 72 6f 66  _Free(pDb->zProf
3c80: 69 6c 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ile);.  }.  if( 
3c90: 70 44 62 2d 3e 7a 41 75 74 68 20 29 7b 0a 20 20  pDb->zAuth ){.  
3ca0: 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e    Tcl_Free(pDb->
3cb0: 7a 41 75 74 68 29 3b 0a 20 20 7d 0a 20 20 69 66  zAuth);.  }.  if
3cc0: 28 20 70 44 62 2d 3e 7a 4e 75 6c 6c 20 29 7b 0a  ( pDb->zNull ){.
3cd0: 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62      Tcl_Free(pDb
3ce0: 2d 3e 7a 4e 75 6c 6c 29 3b 0a 20 20 7d 0a 20 20  ->zNull);.  }.  
3cf0: 69 66 28 20 70 44 62 2d 3e 70 55 70 64 61 74 65  if( pDb->pUpdate
3d00: 48 6f 6f 6b 20 29 7b 0a 20 20 20 20 54 63 6c 5f  Hook ){.    Tcl_
3d10: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 44 62  DecrRefCount(pDb
3d20: 2d 3e 70 55 70 64 61 74 65 48 6f 6f 6b 29 3b 0a  ->pUpdateHook);.
3d30: 20 20 7d 0a 20 20 69 66 28 20 70 44 62 2d 3e 70    }.  if( pDb->p
3d40: 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 20 29 7b 0a  RollbackHook ){.
3d50: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
3d60: 6f 75 6e 74 28 70 44 62 2d 3e 70 52 6f 6c 6c 62  ount(pDb->pRollb
3d70: 61 63 6b 48 6f 6f 6b 29 3b 0a 20 20 7d 0a 20 20  ackHook);.  }.  
3d80: 69 66 28 20 70 44 62 2d 3e 70 57 61 6c 48 6f 6f  if( pDb->pWalHoo
3d90: 6b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 44 65 63  k ){.    Tcl_Dec
3da0: 72 52 65 66 43 6f 75 6e 74 28 70 44 62 2d 3e 70  rRefCount(pDb->p
3db0: 57 61 6c 48 6f 6f 6b 29 3b 0a 20 20 7d 0a 20 20  WalHook);.  }.  
3dc0: 69 66 28 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74  if( pDb->pCollat
3dd0: 65 4e 65 65 64 65 64 20 29 7b 0a 20 20 20 20 54  eNeeded ){.    T
3de0: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
3df0: 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65 65  pDb->pCollateNee
3e00: 64 65 64 29 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f  ded);.  }.  Tcl_
3e10: 46 72 65 65 28 28 63 68 61 72 2a 29 70 44 62 29  Free((char*)pDb)
3e20: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
3e30: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
3e40: 64 20 77 68 65 6e 20 61 20 64 61 74 61 62 61 73  d when a databas
3e50: 65 20 66 69 6c 65 20 69 73 20 6c 6f 63 6b 65 64  e file is locked
3e60: 20 77 68 69 6c 65 20 74 72 79 69 6e 67 0a 2a 2a   while trying.**
3e70: 20 74 6f 20 65 78 65 63 75 74 65 20 53 51 4c 2e   to execute SQL.
3e80: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 44  .*/.static int D
3e90: 62 42 75 73 79 48 61 6e 64 6c 65 72 28 76 6f 69  bBusyHandler(voi
3ea0: 64 20 2a 63 64 2c 20 69 6e 74 20 6e 54 72 69 65  d *cd, int nTrie
3eb0: 73 29 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a  s){.  SqliteDb *
3ec0: 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62 2a  pDb = (SqliteDb*
3ed0: 29 63 64 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  )cd;.  int rc;. 
3ee0: 20 63 68 61 72 20 7a 56 61 6c 5b 33 30 5d 3b 0a   char zVal[30];.
3ef0: 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69  .  sqlite3_snpri
3f00: 6e 74 66 28 73 69 7a 65 6f 66 28 7a 56 61 6c 29  ntf(sizeof(zVal)
3f10: 2c 20 7a 56 61 6c 2c 20 22 25 64 22 2c 20 6e 54  , zVal, "%d", nT
3f20: 72 69 65 73 29 3b 0a 20 20 72 63 20 3d 20 54 63  ries);.  rc = Tc
3f30: 6c 5f 56 61 72 45 76 61 6c 28 70 44 62 2d 3e 69  l_VarEval(pDb->i
3f40: 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a 42 75 73  nterp, pDb->zBus
3f50: 79 2c 20 22 20 22 2c 20 7a 56 61 6c 2c 20 28 63  y, " ", zVal, (c
3f60: 68 61 72 2a 29 30 29 3b 0a 20 20 69 66 28 20 72  har*)0);.  if( r
3f70: 63 21 3d 54 43 4c 5f 4f 4b 20 7c 7c 20 61 74 6f  c!=TCL_OK || ato
3f80: 69 28 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52  i(Tcl_GetStringR
3f90: 65 73 75 6c 74 28 70 44 62 2d 3e 69 6e 74 65 72  esult(pDb->inter
3fa0: 70 29 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  p)) ){.    retur
3fb0: 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 0;.  }.  retur
3fc0: 6e 20 31 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  n 1;.}..#ifndef 
3fd0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 52 4f 47  SQLITE_OMIT_PROG
3fe0: 52 45 53 53 5f 43 41 4c 4c 42 41 43 4b 0a 2f 2a  RESS_CALLBACK./*
3ff0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
4000: 20 69 73 20 69 6e 76 6f 6b 65 64 20 61 73 20 74   is invoked as t
4010: 68 65 20 27 70 72 6f 67 72 65 73 73 20 63 61 6c  he 'progress cal
4020: 6c 62 61 63 6b 27 20 66 6f 72 20 74 68 65 20 64  lback' for the d
4030: 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74  atabase..*/.stat
4040: 69 63 20 69 6e 74 20 44 62 50 72 6f 67 72 65 73  ic int DbProgres
4050: 73 48 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a 63  sHandler(void *c
4060: 64 29 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a  d){.  SqliteDb *
4070: 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62 2a  pDb = (SqliteDb*
4080: 29 63 64 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  )cd;.  int rc;..
4090: 20 20 61 73 73 65 72 74 28 20 70 44 62 2d 3e 7a    assert( pDb->z
40a0: 50 72 6f 67 72 65 73 73 20 29 3b 0a 20 20 72 63  Progress );.  rc
40b0: 20 3d 20 54 63 6c 5f 45 76 61 6c 28 70 44 62 2d   = Tcl_Eval(pDb-
40c0: 3e 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a 50  >interp, pDb->zP
40d0: 72 6f 67 72 65 73 73 29 3b 0a 20 20 69 66 28 20  rogress);.  if( 
40e0: 72 63 21 3d 54 43 4c 5f 4f 4b 20 7c 7c 20 61 74  rc!=TCL_OK || at
40f0: 6f 69 28 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  oi(Tcl_GetString
4100: 52 65 73 75 6c 74 28 70 44 62 2d 3e 69 6e 74 65  Result(pDb->inte
4110: 72 70 29 29 20 29 7b 0a 20 20 20 20 72 65 74 75  rp)) ){.    retu
4120: 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 1;.  }.  retu
4130: 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  rn 0;.}.#endif..
4140: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
4150: 4d 49 54 5f 54 52 41 43 45 0a 2f 2a 0a 2a 2a 20  MIT_TRACE./*.** 
4160: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
4170: 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 53 51  called by the SQ
4180: 4c 69 74 65 20 74 72 61 63 65 20 68 61 6e 64 6c  Lite trace handl
4190: 65 72 20 77 68 65 6e 65 76 65 72 20 61 20 6e 65  er whenever a ne
41a0: 77 0a 2a 2a 20 62 6c 6f 63 6b 20 6f 66 20 53 51  w.** block of SQ
41b0: 4c 20 69 73 20 65 78 65 63 75 74 65 64 2e 20 20  L is executed.  
41c0: 54 68 65 20 54 43 4c 20 73 63 72 69 70 74 20 69  The TCL script i
41d0: 6e 20 70 44 62 2d 3e 7a 54 72 61 63 65 20 69 73  n pDb->zTrace is
41e0: 20 65 78 65 63 75 74 65 64 2e 0a 2a 2f 0a 73 74   executed..*/.st
41f0: 61 74 69 63 20 76 6f 69 64 20 44 62 54 72 61 63  atic void DbTrac
4200: 65 48 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a 63  eHandler(void *c
4210: 64 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  d, const char *z
4220: 53 71 6c 29 7b 0a 20 20 53 71 6c 69 74 65 44 62  Sql){.  SqliteDb
4230: 20 2a 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44   *pDb = (SqliteD
4240: 62 2a 29 63 64 3b 0a 20 20 54 63 6c 5f 44 53 74  b*)cd;.  Tcl_DSt
4250: 72 69 6e 67 20 73 74 72 3b 0a 0a 20 20 54 63 6c  ring str;..  Tcl
4260: 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 73 74  _DStringInit(&st
4270: 72 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e  r);.  Tcl_DStrin
4280: 67 41 70 70 65 6e 64 28 26 73 74 72 2c 20 70 44  gAppend(&str, pD
4290: 62 2d 3e 7a 54 72 61 63 65 2c 20 2d 31 29 3b 0a  b->zTrace, -1);.
42a0: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70    Tcl_DStringApp
42b0: 65 6e 64 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c  endElement(&str,
42c0: 20 7a 53 71 6c 29 3b 0a 20 20 54 63 6c 5f 45 76   zSql);.  Tcl_Ev
42d0: 61 6c 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20  al(pDb->interp, 
42e0: 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65  Tcl_DStringValue
42f0: 28 26 73 74 72 29 29 3b 0a 20 20 54 63 6c 5f 44  (&str));.  Tcl_D
4300: 53 74 72 69 6e 67 46 72 65 65 28 26 73 74 72 29  StringFree(&str)
4310: 3b 0a 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73  ;.  Tcl_ResetRes
4320: 75 6c 74 28 70 44 62 2d 3e 69 6e 74 65 72 70 29  ult(pDb->interp)
4330: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  ;.}.#endif..#ifn
4340: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
4350: 54 52 41 43 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73  TRACE./*.** This
4360: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
4370: 65 64 20 62 79 20 74 68 65 20 53 51 4c 69 74 65  ed by the SQLite
4380: 20 70 72 6f 66 69 6c 65 20 68 61 6e 64 6c 65 72   profile handler
4390: 20 61 66 74 65 72 20 61 20 73 74 61 74 65 6d 65   after a stateme
43a0: 6e 74 0a 2a 2a 20 53 51 4c 20 68 61 73 20 65 78  nt.** SQL has ex
43b0: 65 63 75 74 65 64 2e 20 20 54 68 65 20 54 43 4c  ecuted.  The TCL
43c0: 20 73 63 72 69 70 74 20 69 6e 20 70 44 62 2d 3e   script in pDb->
43d0: 7a 50 72 6f 66 69 6c 65 20 69 73 20 65 76 61 6c  zProfile is eval
43e0: 75 61 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  uated..*/.static
43f0: 20 76 6f 69 64 20 44 62 50 72 6f 66 69 6c 65 48   void DbProfileH
4400: 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a 63 64 2c  andler(void *cd,
4410: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71   const char *zSq
4420: 6c 2c 20 73 71 6c 69 74 65 5f 75 69 6e 74 36 34  l, sqlite_uint64
4430: 20 74 6d 29 7b 0a 20 20 53 71 6c 69 74 65 44 62   tm){.  SqliteDb
4440: 20 2a 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44   *pDb = (SqliteD
4450: 62 2a 29 63 64 3b 0a 20 20 54 63 6c 5f 44 53 74  b*)cd;.  Tcl_DSt
4460: 72 69 6e 67 20 73 74 72 3b 0a 20 20 63 68 61 72  ring str;.  char
4470: 20 7a 54 6d 5b 31 30 30 5d 3b 0a 0a 20 20 73 71   zTm[100];..  sq
4480: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
4490: 69 7a 65 6f 66 28 7a 54 6d 29 2d 31 2c 20 7a 54  izeof(zTm)-1, zT
44a0: 6d 2c 20 22 25 6c 6c 64 22 2c 20 74 6d 29 3b 0a  m, "%lld", tm);.
44b0: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69    Tcl_DStringIni
44c0: 74 28 26 73 74 72 29 3b 0a 20 20 54 63 6c 5f 44  t(&str);.  Tcl_D
44d0: 53 74 72 69 6e 67 41 70 70 65 6e 64 28 26 73 74  StringAppend(&st
44e0: 72 2c 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65  r, pDb->zProfile
44f0: 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 44 53 74  , -1);.  Tcl_DSt
4500: 72 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e  ringAppendElemen
4510: 74 28 26 73 74 72 2c 20 7a 53 71 6c 29 3b 0a 20  t(&str, zSql);. 
4520: 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65   Tcl_DStringAppe
4530: 6e 64 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c 20  ndElement(&str, 
4540: 7a 54 6d 29 3b 0a 20 20 54 63 6c 5f 45 76 61 6c  zTm);.  Tcl_Eval
4550: 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20 54 63  (pDb->interp, Tc
4560: 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26  l_DStringValue(&
4570: 73 74 72 29 29 3b 0a 20 20 54 63 6c 5f 44 53 74  str));.  Tcl_DSt
4580: 72 69 6e 67 46 72 65 65 28 26 73 74 72 29 3b 0a  ringFree(&str);.
4590: 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c    Tcl_ResetResul
45a0: 74 28 70 44 62 2d 3e 69 6e 74 65 72 70 29 3b 0a  t(pDb->interp);.
45b0: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
45c0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
45d0: 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 74 72  called when a tr
45e0: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d  ansaction is com
45f0: 6d 69 74 74 65 64 2e 20 20 54 68 65 0a 2a 2a 20  mitted.  The.** 
4600: 54 43 4c 20 73 63 72 69 70 74 20 69 6e 20 70 44  TCL script in pD
4610: 62 2d 3e 7a 43 6f 6d 6d 69 74 20 69 73 20 65 78  b->zCommit is ex
4620: 65 63 75 74 65 64 2e 20 20 49 66 20 69 74 20 72  ecuted.  If it r
4630: 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 20  eturns non-zero 
4640: 6f 72 0a 2a 2a 20 69 66 20 69 74 20 74 68 72 6f  or.** if it thro
4650: 77 73 20 61 6e 20 65 78 63 65 70 74 69 6f 6e 2c  ws an exception,
4660: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
4670: 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20   is rolled back 
4680: 69 6e 73 74 65 61 64 0a 2a 2a 20 6f 66 20 62 65  instead.** of be
4690: 69 6e 67 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a  ing committed..*
46a0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 44 62 43  /.static int DbC
46b0: 6f 6d 6d 69 74 48 61 6e 64 6c 65 72 28 76 6f 69  ommitHandler(voi
46c0: 64 20 2a 63 64 29 7b 0a 20 20 53 71 6c 69 74 65  d *cd){.  Sqlite
46d0: 44 62 20 2a 70 44 62 20 3d 20 28 53 71 6c 69 74  Db *pDb = (Sqlit
46e0: 65 44 62 2a 29 63 64 3b 0a 20 20 69 6e 74 20 72  eDb*)cd;.  int r
46f0: 63 3b 0a 0a 20 20 72 63 20 3d 20 54 63 6c 5f 45  c;..  rc = Tcl_E
4700: 76 61 6c 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c  val(pDb->interp,
4710: 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 29 3b 0a   pDb->zCommit);.
4720: 20 20 69 66 28 20 72 63 21 3d 54 43 4c 5f 4f 4b    if( rc!=TCL_OK
4730: 20 7c 7c 20 61 74 6f 69 28 54 63 6c 5f 47 65 74   || atoi(Tcl_Get
4740: 53 74 72 69 6e 67 52 65 73 75 6c 74 28 70 44 62  StringResult(pDb
4750: 2d 3e 69 6e 74 65 72 70 29 29 20 29 7b 0a 20 20  ->interp)) ){.  
4760: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
4770: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 73    return 0;.}..s
4780: 74 61 74 69 63 20 76 6f 69 64 20 44 62 52 6f 6c  tatic void DbRol
4790: 6c 62 61 63 6b 48 61 6e 64 6c 65 72 28 76 6f 69  lbackHandler(voi
47a0: 64 20 2a 63 6c 69 65 6e 74 44 61 74 61 29 7b 0a  d *clientData){.
47b0: 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20    SqliteDb *pDb 
47c0: 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 63 6c 69  = (SqliteDb*)cli
47d0: 65 6e 74 44 61 74 61 3b 0a 20 20 61 73 73 65 72  entData;.  asser
47e0: 74 28 70 44 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b  t(pDb->pRollback
47f0: 48 6f 6f 6b 29 3b 0a 20 20 69 66 28 20 54 43 4c  Hook);.  if( TCL
4800: 5f 4f 4b 21 3d 54 63 6c 5f 45 76 61 6c 4f 62 6a  _OK!=Tcl_EvalObj
4810: 45 78 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20  Ex(pDb->interp, 
4820: 70 44 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 48 6f  pDb->pRollbackHo
4830: 6f 6b 2c 20 30 29 20 29 7b 0a 20 20 20 20 54 63  ok, 0) ){.    Tc
4840: 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f  l_BackgroundErro
4850: 72 28 70 44 62 2d 3e 69 6e 74 65 72 70 29 3b 0a  r(pDb->interp);.
4860: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
4870: 73 20 70 72 6f 63 65 64 75 72 65 20 68 61 6e 64  s procedure hand
4880: 6c 65 73 20 77 61 6c 5f 68 6f 6f 6b 20 63 61 6c  les wal_hook cal
4890: 6c 62 61 63 6b 73 2e 0a 2a 2f 0a 73 74 61 74 69  lbacks..*/.stati
48a0: 63 20 69 6e 74 20 44 62 57 61 6c 48 61 6e 64 6c  c int DbWalHandl
48b0: 65 72 28 0a 20 20 76 6f 69 64 20 2a 63 6c 69 65  er(.  void *clie
48c0: 6e 74 44 61 74 61 2c 20 0a 20 20 73 71 6c 69 74  ntData, .  sqlit
48d0: 65 33 20 2a 64 62 2c 20 0a 20 20 63 6f 6e 73 74  e3 *db, .  const
48e0: 20 63 68 61 72 20 2a 7a 44 62 2c 20 0a 20 20 69   char *zDb, .  i
48f0: 6e 74 20 6e 45 6e 74 72 79 0a 29 7b 0a 20 20 69  nt nEntry.){.  i
4900: 6e 74 20 72 65 74 20 3d 20 53 51 4c 49 54 45 5f  nt ret = SQLITE_
4910: 4f 4b 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  OK;.  Tcl_Obj *p
4920: 3b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44  ;.  SqliteDb *pD
4930: 62 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 63  b = (SqliteDb*)c
4940: 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20 54 63 6c  lientData;.  Tcl
4950: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 20  _Interp *interp 
4960: 3d 20 70 44 62 2d 3e 69 6e 74 65 72 70 3b 0a 20  = pDb->interp;. 
4970: 20 61 73 73 65 72 74 28 70 44 62 2d 3e 70 57 61   assert(pDb->pWa
4980: 6c 48 6f 6f 6b 29 3b 0a 0a 20 20 70 20 3d 20 54  lHook);..  p = T
4990: 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28  cl_DuplicateObj(
49a0: 70 44 62 2d 3e 70 57 61 6c 48 6f 6f 6b 29 3b 0a  pDb->pWalHook);.
49b0: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
49c0: 6e 74 28 70 29 3b 0a 20 20 54 63 6c 5f 4c 69 73  nt(p);.  Tcl_Lis
49d0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
49e0: 74 28 69 6e 74 65 72 70 2c 20 70 2c 20 54 63 6c  t(interp, p, Tcl
49f0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 44  _NewStringObj(zD
4a00: 62 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c  b, -1));.  Tcl_L
4a10: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
4a20: 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 2c 20 54  ent(interp, p, T
4a30: 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 6e 45 6e  cl_NewIntObj(nEn
4a40: 74 72 79 29 29 3b 0a 20 20 69 66 28 20 54 43 4c  try));.  if( TCL
4a50: 5f 4f 4b 21 3d 54 63 6c 5f 45 76 61 6c 4f 62 6a  _OK!=Tcl_EvalObj
4a60: 45 78 28 69 6e 74 65 72 70 2c 20 70 2c 20 30 29  Ex(interp, p, 0)
4a70: 20 0a 20 20 20 7c 7c 20 54 43 4c 5f 4f 4b 21 3d   .   || TCL_OK!=
4a80: 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
4a90: 6a 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  j(interp, Tcl_Ge
4aa0: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
4ab0: 70 29 2c 20 26 72 65 74 29 0a 20 20 29 7b 0a 20  p), &ret).  ){. 
4ac0: 20 20 20 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e     Tcl_Backgroun
4ad0: 64 45 72 72 6f 72 28 69 6e 74 65 72 70 29 3b 0a  dError(interp);.
4ae0: 20 20 7d 0a 20 20 54 63 6c 5f 44 65 63 72 52 65    }.  Tcl_DecrRe
4af0: 66 43 6f 75 6e 74 28 70 29 3b 0a 0a 20 20 72 65  fCount(p);..  re
4b00: 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 23 69 66  turn ret;.}..#if
4b10: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
4b20: 54 45 53 54 29 20 26 26 20 64 65 66 69 6e 65 64  TEST) && defined
4b30: 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 55  (SQLITE_ENABLE_U
4b40: 4e 4c 4f 43 4b 5f 4e 4f 54 49 46 59 29 0a 73 74  NLOCK_NOTIFY).st
4b50: 61 74 69 63 20 76 6f 69 64 20 73 65 74 54 65 73  atic void setTes
4b60: 74 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 56 61 72  tUnlockNotifyVar
4b70: 73 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  s(Tcl_Interp *in
4b80: 74 65 72 70 2c 20 69 6e 74 20 69 41 72 67 2c 20  terp, int iArg, 
4b90: 69 6e 74 20 6e 41 72 67 29 7b 0a 20 20 63 68 61  int nArg){.  cha
4ba0: 72 20 7a 42 75 66 5b 36 34 5d 3b 0a 20 20 73 70  r zBuf[64];.  sp
4bb0: 72 69 6e 74 66 28 7a 42 75 66 2c 20 22 25 64 22  rintf(zBuf, "%d"
4bc0: 2c 20 69 41 72 67 29 3b 0a 20 20 54 63 6c 5f 53  , iArg);.  Tcl_S
4bd0: 65 74 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73  etVar(interp, "s
4be0: 71 6c 69 74 65 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74  qlite_unlock_not
4bf0: 69 66 79 5f 61 72 67 22 2c 20 7a 42 75 66 2c 20  ify_arg", zBuf, 
4c00: 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29  TCL_GLOBAL_ONLY)
4c10: 3b 0a 20 20 73 70 72 69 6e 74 66 28 7a 42 75 66  ;.  sprintf(zBuf
4c20: 2c 20 22 25 64 22 2c 20 6e 41 72 67 29 3b 0a 20  , "%d", nArg);. 
4c30: 20 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65   Tcl_SetVar(inte
4c40: 72 70 2c 20 22 73 71 6c 69 74 65 5f 75 6e 6c 6f  rp, "sqlite_unlo
4c50: 63 6b 5f 6e 6f 74 69 66 79 5f 61 72 67 63 6f 75  ck_notify_argcou
4c60: 6e 74 22 2c 20 7a 42 75 66 2c 20 54 43 4c 5f 47  nt", zBuf, TCL_G
4c70: 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 7d 0a 23  LOBAL_ONLY);.}.#
4c80: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 73 65  else.# define se
4c90: 74 54 65 73 74 55 6e 6c 6f 63 6b 4e 6f 74 69 66  tTestUnlockNotif
4ca0: 79 56 61 72 73 28 78 2c 79 2c 7a 29 0a 23 65 6e  yVars(x,y,z).#en
4cb0: 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
4cc0: 54 45 5f 45 4e 41 42 4c 45 5f 55 4e 4c 4f 43 4b  TE_ENABLE_UNLOCK
4cd0: 5f 4e 4f 54 49 46 59 0a 73 74 61 74 69 63 20 76  _NOTIFY.static v
4ce0: 6f 69 64 20 44 62 55 6e 6c 6f 63 6b 4e 6f 74 69  oid DbUnlockNoti
4cf0: 66 79 28 76 6f 69 64 20 2a 2a 61 70 41 72 67 2c  fy(void **apArg,
4d00: 20 69 6e 74 20 6e 41 72 67 29 7b 0a 20 20 69 6e   int nArg){.  in
4d10: 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
4d20: 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20  i<nArg; i++){.  
4d30: 20 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67    const int flag
4d40: 73 20 3d 20 28 54 43 4c 5f 45 56 41 4c 5f 47 4c  s = (TCL_EVAL_GL
4d50: 4f 42 41 4c 7c 54 43 4c 5f 45 56 41 4c 5f 44 49  OBAL|TCL_EVAL_DI
4d60: 52 45 43 54 29 3b 0a 20 20 20 20 53 71 6c 69 74  RECT);.    Sqlit
4d70: 65 44 62 20 2a 70 44 62 20 3d 20 28 53 71 6c 69  eDb *pDb = (Sqli
4d80: 74 65 44 62 20 2a 29 61 70 41 72 67 5b 69 5d 3b  teDb *)apArg[i];
4d90: 0a 20 20 20 20 73 65 74 54 65 73 74 55 6e 6c 6f  .    setTestUnlo
4da0: 63 6b 4e 6f 74 69 66 79 56 61 72 73 28 70 44 62  ckNotifyVars(pDb
4db0: 2d 3e 69 6e 74 65 72 70 2c 20 69 2c 20 6e 41 72  ->interp, i, nAr
4dc0: 67 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  g);.    assert( 
4dd0: 70 44 62 2d 3e 70 55 6e 6c 6f 63 6b 4e 6f 74 69  pDb->pUnlockNoti
4de0: 66 79 29 3b 0a 20 20 20 20 54 63 6c 5f 45 76 61  fy);.    Tcl_Eva
4df0: 6c 4f 62 6a 45 78 28 70 44 62 2d 3e 69 6e 74 65  lObjEx(pDb->inte
4e00: 72 70 2c 20 70 44 62 2d 3e 70 55 6e 6c 6f 63 6b  rp, pDb->pUnlock
4e10: 4e 6f 74 69 66 79 2c 20 66 6c 61 67 73 29 3b 0a  Notify, flags);.
4e20: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
4e30: 6f 75 6e 74 28 70 44 62 2d 3e 70 55 6e 6c 6f 63  ount(pDb->pUnloc
4e40: 6b 4e 6f 74 69 66 79 29 3b 0a 20 20 20 20 70 44  kNotify);.    pD
4e50: 62 2d 3e 70 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79  b->pUnlockNotify
4e60: 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64   = 0;.  }.}.#end
4e70: 69 66 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  if..static void 
4e80: 44 62 55 70 64 61 74 65 48 61 6e 64 6c 65 72 28  DbUpdateHandler(
4e90: 0a 20 20 76 6f 69 64 20 2a 70 2c 20 0a 20 20 69  .  void *p, .  i
4ea0: 6e 74 20 6f 70 2c 0a 20 20 63 6f 6e 73 74 20 63  nt op,.  const c
4eb0: 68 61 72 20 2a 7a 44 62 2c 20 0a 20 20 63 6f 6e  har *zDb, .  con
4ec0: 73 74 20 63 68 61 72 20 2a 7a 54 62 6c 2c 20 0a  st char *zTbl, .
4ed0: 20 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 72    sqlite_int64 r
4ee0: 6f 77 69 64 0a 29 7b 0a 20 20 53 71 6c 69 74 65  owid.){.  Sqlite
4ef0: 44 62 20 2a 70 44 62 20 3d 20 28 53 71 6c 69 74  Db *pDb = (Sqlit
4f00: 65 44 62 20 2a 29 70 3b 0a 20 20 54 63 6c 5f 4f  eDb *)p;.  Tcl_O
4f10: 62 6a 20 2a 70 43 6d 64 3b 0a 0a 20 20 61 73 73  bj *pCmd;..  ass
4f20: 65 72 74 28 20 70 44 62 2d 3e 70 55 70 64 61 74  ert( pDb->pUpdat
4f30: 65 48 6f 6f 6b 20 29 3b 0a 20 20 61 73 73 65 72  eHook );.  asser
4f40: 74 28 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 49 4e  t( op==SQLITE_IN
4f50: 53 45 52 54 20 7c 7c 20 6f 70 3d 3d 53 51 4c 49  SERT || op==SQLI
4f60: 54 45 5f 55 50 44 41 54 45 20 7c 7c 20 6f 70 3d  TE_UPDATE || op=
4f70: 3d 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 20 29  =SQLITE_DELETE )
4f80: 3b 0a 0a 20 20 70 43 6d 64 20 3d 20 54 63 6c 5f  ;..  pCmd = Tcl_
4f90: 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 70 44 62  DuplicateObj(pDb
4fa0: 2d 3e 70 55 70 64 61 74 65 48 6f 6f 6b 29 3b 0a  ->pUpdateHook);.
4fb0: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
4fc0: 6e 74 28 70 43 6d 64 29 3b 0a 20 20 54 63 6c 5f  nt(pCmd);.  Tcl_
4fd0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
4fe0: 6d 65 6e 74 28 30 2c 20 70 43 6d 64 2c 20 54 63  ment(0, pCmd, Tc
4ff0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 0a  l_NewStringObj(.
5000: 20 20 20 20 28 20 28 6f 70 3d 3d 53 51 4c 49 54      ( (op==SQLIT
5010: 45 5f 49 4e 53 45 52 54 29 3f 22 49 4e 53 45 52  E_INSERT)?"INSER
5020: 54 22 3a 28 6f 70 3d 3d 53 51 4c 49 54 45 5f 55  T":(op==SQLITE_U
5030: 50 44 41 54 45 29 3f 22 55 50 44 41 54 45 22 3a  PDATE)?"UPDATE":
5040: 22 44 45 4c 45 54 45 22 29 2c 20 2d 31 29 29 3b  "DELETE"), -1));
5050: 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  .  Tcl_ListObjAp
5060: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70  pendElement(0, p
5070: 43 6d 64 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Cmd, Tcl_NewStri
5080: 6e 67 4f 62 6a 28 7a 44 62 2c 20 2d 31 29 29 3b  ngObj(zDb, -1));
5090: 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  .  Tcl_ListObjAp
50a0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70  pendElement(0, p
50b0: 43 6d 64 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Cmd, Tcl_NewStri
50c0: 6e 67 4f 62 6a 28 7a 54 62 6c 2c 20 2d 31 29 29  ngObj(zTbl, -1))
50d0: 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  ;.  Tcl_ListObjA
50e0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20  ppendElement(0, 
50f0: 70 43 6d 64 2c 20 54 63 6c 5f 4e 65 77 57 69 64  pCmd, Tcl_NewWid
5100: 65 49 6e 74 4f 62 6a 28 72 6f 77 69 64 29 29 3b  eIntObj(rowid));
5110: 0a 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78  .  Tcl_EvalObjEx
5120: 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20 70 43  (pDb->interp, pC
5130: 6d 64 2c 20 54 43 4c 5f 45 56 41 4c 5f 44 49 52  md, TCL_EVAL_DIR
5140: 45 43 54 29 3b 0a 20 20 54 63 6c 5f 44 65 63 72  ECT);.  Tcl_Decr
5150: 52 65 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a  RefCount(pCmd);.
5160: 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74  }..static void t
5170: 63 6c 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64 28  clCollateNeeded(
5180: 0a 20 20 76 6f 69 64 20 2a 70 43 74 78 2c 0a 20  .  void *pCtx,. 
5190: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20   sqlite3 *db,.  
51a0: 69 6e 74 20 65 6e 63 2c 0a 20 20 63 6f 6e 73 74  int enc,.  const
51b0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 0a 29 7b 0a   char *zName.){.
51c0: 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20    SqliteDb *pDb 
51d0: 3d 20 28 53 71 6c 69 74 65 44 62 20 2a 29 70 43  = (SqliteDb *)pC
51e0: 74 78 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  tx;.  Tcl_Obj *p
51f0: 53 63 72 69 70 74 20 3d 20 54 63 6c 5f 44 75 70  Script = Tcl_Dup
5200: 6c 69 63 61 74 65 4f 62 6a 28 70 44 62 2d 3e 70  licateObj(pDb->p
5210: 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64 29 3b 0a  CollateNeeded);.
5220: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
5230: 6e 74 28 70 53 63 72 69 70 74 29 3b 0a 20 20 54  nt(pScript);.  T
5240: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
5250: 45 6c 65 6d 65 6e 74 28 30 2c 20 70 53 63 72 69  Element(0, pScri
5260: 70 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  pt, Tcl_NewStrin
5270: 67 4f 62 6a 28 7a 4e 61 6d 65 2c 20 2d 31 29 29  gObj(zName, -1))
5280: 3b 0a 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45  ;.  Tcl_EvalObjE
5290: 78 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20 70  x(pDb->interp, p
52a0: 53 63 72 69 70 74 2c 20 30 29 3b 0a 20 20 54 63  Script, 0);.  Tc
52b0: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70  l_DecrRefCount(p
52c0: 53 63 72 69 70 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Script);.}../*.*
52d0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
52e0: 73 20 63 61 6c 6c 65 64 20 74 6f 20 65 76 61 6c  s called to eval
52f0: 75 61 74 65 20 61 6e 20 53 51 4c 20 63 6f 6c 6c  uate an SQL coll
5300: 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 69  ation function i
5310: 6d 70 6c 65 6d 65 6e 74 65 64 0a 2a 2a 20 75 73  mplemented.** us
5320: 69 6e 67 20 54 43 4c 20 73 63 72 69 70 74 2e 0a  ing TCL script..
5330: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 63  */.static int tc
5340: 6c 53 71 6c 43 6f 6c 6c 61 74 65 28 0a 20 20 76  lSqlCollate(.  v
5350: 6f 69 64 20 2a 70 43 74 78 2c 0a 20 20 69 6e 74  oid *pCtx,.  int
5360: 20 6e 41 2c 0a 20 20 63 6f 6e 73 74 20 76 6f 69   nA,.  const voi
5370: 64 20 2a 7a 41 2c 0a 20 20 69 6e 74 20 6e 42 2c  d *zA,.  int nB,
5380: 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a  .  const void *z
5390: 42 0a 29 7b 0a 20 20 53 71 6c 43 6f 6c 6c 61 74  B.){.  SqlCollat
53a0: 65 20 2a 70 20 3d 20 28 53 71 6c 43 6f 6c 6c 61  e *p = (SqlColla
53b0: 74 65 20 2a 29 70 43 74 78 3b 0a 20 20 54 63 6c  te *)pCtx;.  Tcl
53c0: 5f 4f 62 6a 20 2a 70 43 6d 64 3b 0a 0a 20 20 70  _Obj *pCmd;..  p
53d0: 43 6d 64 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72  Cmd = Tcl_NewStr
53e0: 69 6e 67 4f 62 6a 28 70 2d 3e 7a 53 63 72 69 70  ingObj(p->zScrip
53f0: 74 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 49 6e  t, -1);.  Tcl_In
5400: 63 72 52 65 66 43 6f 75 6e 74 28 70 43 6d 64 29  crRefCount(pCmd)
5410: 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  ;.  Tcl_ListObjA
5420: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 70 2d 3e  ppendElement(p->
5430: 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c 20 54 63  interp, pCmd, Tc
5440: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a  l_NewStringObj(z
5450: 41 2c 20 6e 41 29 29 3b 0a 20 20 54 63 6c 5f 4c  A, nA));.  Tcl_L
5460: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
5470: 65 6e 74 28 70 2d 3e 69 6e 74 65 72 70 2c 20 70  ent(p->interp, p
5480: 43 6d 64 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Cmd, Tcl_NewStri
5490: 6e 67 4f 62 6a 28 7a 42 2c 20 6e 42 29 29 3b 0a  ngObj(zB, nB));.
54a0: 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28    Tcl_EvalObjEx(
54b0: 70 2d 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c  p->interp, pCmd,
54c0: 20 54 43 4c 5f 45 56 41 4c 5f 44 49 52 45 43 54   TCL_EVAL_DIRECT
54d0: 29 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66  );.  Tcl_DecrRef
54e0: 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20 72  Count(pCmd);.  r
54f0: 65 74 75 72 6e 20 28 61 74 6f 69 28 54 63 6c 5f  eturn (atoi(Tcl_
5500: 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28  GetStringResult(
5510: 70 2d 3e 69 6e 74 65 72 70 29 29 29 3b 0a 7d 0a  p->interp)));.}.
5520: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
5530: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ine is called to
5540: 20 65 76 61 6c 75 61 74 65 20 61 6e 20 53 51 4c   evaluate an SQL
5550: 20 66 75 6e 63 74 69 6f 6e 20 69 6d 70 6c 65 6d   function implem
5560: 65 6e 74 65 64 0a 2a 2a 20 75 73 69 6e 67 20 54  ented.** using T
5570: 43 4c 20 73 63 72 69 70 74 2e 0a 2a 2f 0a 73 74  CL script..*/.st
5580: 61 74 69 63 20 76 6f 69 64 20 74 63 6c 53 71 6c  atic void tclSql
5590: 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e  Func(sqlite3_con
55a0: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 69  text *context, i
55b0: 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33  nt argc, sqlite3
55c0: 5f 76 61 6c 75 65 2a 2a 61 72 67 76 29 7b 0a 20  _value**argv){. 
55d0: 20 53 71 6c 46 75 6e 63 20 2a 70 20 3d 20 73 71   SqlFunc *p = sq
55e0: 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61 28  lite3_user_data(
55f0: 63 6f 6e 74 65 78 74 29 3b 0a 20 20 54 63 6c 5f  context);.  Tcl_
5600: 4f 62 6a 20 2a 70 43 6d 64 3b 0a 20 20 69 6e 74  Obj *pCmd;.  int
5610: 20 69 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20   i;.  int rc;.. 
5620: 20 69 66 28 20 61 72 67 63 3d 3d 30 20 29 7b 0a   if( argc==0 ){.
5630: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
5640: 61 72 65 20 6e 6f 20 61 72 67 75 6d 65 6e 74 73  are no arguments
5650: 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   to the function
5660: 2c 20 63 61 6c 6c 20 54 63 6c 5f 45 76 61 6c 4f  , call Tcl_EvalO
5670: 62 6a 45 78 20 6f 6e 20 74 68 65 0a 20 20 20 20  bjEx on the.    
5680: 2a 2a 20 73 63 72 69 70 74 20 6f 62 6a 65 63 74  ** script object
5690: 20 64 69 72 65 63 74 6c 79 2e 20 20 54 68 69 73   directly.  This
56a0: 20 61 6c 6c 6f 77 73 20 74 68 65 20 54 43 4c 20   allows the TCL 
56b0: 63 6f 6d 70 69 6c 65 72 20 74 6f 20 67 65 6e 65  compiler to gene
56c0: 72 61 74 65 0a 20 20 20 20 2a 2a 20 62 79 74 65  rate.    ** byte
56d0: 63 6f 64 65 20 66 6f 72 20 74 68 65 20 63 6f 6d  code for the com
56e0: 6d 61 6e 64 20 6f 6e 20 74 68 65 20 66 69 72 73  mand on the firs
56f0: 74 20 69 6e 76 6f 63 61 74 69 6f 6e 20 61 6e 64  t invocation and
5700: 20 74 68 75 73 20 6d 61 6b 65 0a 20 20 20 20 2a   thus make.    *
5710: 2a 20 73 75 62 73 65 71 75 65 6e 74 20 69 6e 76  * subsequent inv
5720: 6f 63 61 74 69 6f 6e 73 20 6d 75 63 68 20 66 61  ocations much fa
5730: 73 74 65 72 2e 20 2a 2f 0a 20 20 20 20 70 43 6d  ster. */.    pCm
5740: 64 20 3d 20 70 2d 3e 70 53 63 72 69 70 74 3b 0a  d = p->pScript;.
5750: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43      Tcl_IncrRefC
5760: 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20 20 20  ount(pCmd);.    
5770: 72 63 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a  rc = Tcl_EvalObj
5780: 45 78 28 70 2d 3e 69 6e 74 65 72 70 2c 20 70 43  Ex(p->interp, pC
5790: 6d 64 2c 20 30 29 3b 0a 20 20 20 20 54 63 6c 5f  md, 0);.    Tcl_
57a0: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 43 6d  DecrRefCount(pCm
57b0: 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  d);.  }else{.   
57c0: 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65   /* If there are
57d0: 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 74 68   arguments to th
57e0: 65 20 66 75 6e 63 74 69 6f 6e 2c 20 6d 61 6b 65  e function, make
57f0: 20 61 20 73 68 61 6c 6c 6f 77 20 63 6f 70 79 20   a shallow copy 
5800: 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 73 63  of the.    ** sc
5810: 72 69 70 74 20 6f 62 6a 65 63 74 2c 20 6c 61 70  ript object, lap
5820: 70 65 6e 64 20 74 68 65 20 61 72 67 75 6d 65 6e  pend the argumen
5830: 74 73 2c 20 74 68 65 6e 20 65 76 61 6c 75 61 74  ts, then evaluat
5840: 65 20 74 68 65 20 63 6f 70 79 2e 0a 20 20 20 20  e the copy..    
5850: 2a 2a 0a 20 20 20 20 2a 2a 20 42 79 20 22 73 68  **.    ** By "sh
5860: 61 6c 6c 6f 77 22 20 63 6f 70 79 2c 20 77 65 20  allow" copy, we 
5870: 6d 65 61 6e 20 61 20 6f 6e 6c 79 20 74 68 65 20  mean a only the 
5880: 6f 75 74 65 72 20 6c 69 73 74 20 54 63 6c 5f 4f  outer list Tcl_O
5890: 62 6a 20 69 73 20 64 75 70 6c 69 63 61 74 65 64  bj is duplicated
58a0: 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 6e 65 77  ..    ** The new
58b0: 20 54 63 6c 5f 4f 62 6a 20 63 6f 6e 74 61 69 6e   Tcl_Obj contain
58c0: 73 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 74 68  s pointers to th
58d0: 65 20 6f 72 69 67 69 6e 61 6c 20 6c 69 73 74 20  e original list 
58e0: 65 6c 65 6d 65 6e 74 73 2e 20 0a 20 20 20 20 2a  elements. .    *
58f0: 2a 20 54 68 61 74 20 77 61 79 2c 20 77 68 65 6e  * That way, when
5900: 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 76 28 29 20   Tcl_EvalObjv() 
5910: 69 73 20 72 75 6e 20 61 6e 64 20 73 68 69 6d 6d  is run and shimm
5920: 65 72 73 20 74 68 65 20 66 69 72 73 74 20 65 6c  ers the first el
5930: 65 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 6f 66 20  ement.    ** of 
5940: 74 68 65 20 6c 69 73 74 20 74 6f 20 74 63 6c 43  the list to tclC
5950: 6d 64 4e 61 6d 65 54 79 70 65 2c 20 74 68 61 74  mdNameType, that
5960: 20 61 6c 74 65 72 6e 61 74 65 20 72 65 70 72 65   alternate repre
5970: 73 65 6e 74 61 74 69 6f 6e 20 77 69 6c 6c 0a 20  sentation will. 
5980: 20 20 20 2a 2a 20 62 65 20 70 72 65 73 65 72 76     ** be preserv
5990: 65 64 20 61 6e 64 20 72 65 75 73 65 64 20 6f 6e  ed and reused on
59a0: 20 74 68 65 20 6e 65 78 74 20 69 6e 76 6f 63 61   the next invoca
59b0: 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tion..    */.   
59c0: 20 54 63 6c 5f 4f 62 6a 20 2a 2a 61 41 72 67 3b   Tcl_Obj **aArg;
59d0: 0a 20 20 20 20 69 6e 74 20 6e 41 72 67 3b 0a 20  .    int nArg;. 
59e0: 20 20 20 69 66 28 20 54 63 6c 5f 4c 69 73 74 4f     if( Tcl_ListO
59f0: 62 6a 47 65 74 45 6c 65 6d 65 6e 74 73 28 70 2d  bjGetElements(p-
5a00: 3e 69 6e 74 65 72 70 2c 20 70 2d 3e 70 53 63 72  >interp, p->pScr
5a10: 69 70 74 2c 20 26 6e 41 72 67 2c 20 26 61 41 72  ipt, &nArg, &aAr
5a20: 67 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  g) ){.      sqli
5a30: 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72  te3_result_error
5a40: 28 63 6f 6e 74 65 78 74 2c 20 54 63 6c 5f 47 65  (context, Tcl_Ge
5a50: 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28 70 2d  tStringResult(p-
5a60: 3e 69 6e 74 65 72 70 29 2c 20 2d 31 29 3b 20 0a  >interp), -1); .
5a70: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
5a80: 20 20 7d 20 20 20 20 20 0a 20 20 20 20 70 43 6d    }     .    pCm
5a90: 64 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f  d = Tcl_NewListO
5aa0: 62 6a 28 6e 41 72 67 2c 20 61 41 72 67 29 3b 0a  bj(nArg, aArg);.
5ab0: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43      Tcl_IncrRefC
5ac0: 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20 20 20  ount(pCmd);.    
5ad0: 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 67 63 3b  for(i=0; i<argc;
5ae0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c   i++){.      sql
5af0: 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 49 6e 20  ite3_value *pIn 
5b00: 3d 20 61 72 67 76 5b 69 5d 3b 0a 20 20 20 20 20  = argv[i];.     
5b10: 20 54 63 6c 5f 4f 62 6a 20 2a 70 56 61 6c 3b 0a   Tcl_Obj *pVal;.
5b20: 20 20 20 20 20 20 20 20 20 20 20 20 0a 20 20 20              .   
5b30: 20 20 20 2f 2a 20 53 65 74 20 70 56 61 6c 20 74     /* Set pVal t
5b40: 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 69 27  o contain the i'
5b50: 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 69  th column of thi
5b60: 73 20 72 6f 77 2e 20 2a 2f 0a 20 20 20 20 20 20  s row. */.      
5b70: 73 77 69 74 63 68 28 20 73 71 6c 69 74 65 33 5f  switch( sqlite3_
5b80: 76 61 6c 75 65 5f 74 79 70 65 28 70 49 6e 29 20  value_type(pIn) 
5b90: 29 7b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  ){.        case 
5ba0: 53 51 4c 49 54 45 5f 42 4c 4f 42 3a 20 7b 0a 20  SQLITE_BLOB: {. 
5bb0: 20 20 20 20 20 20 20 20 20 69 6e 74 20 62 79 74           int byt
5bc0: 65 73 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  es = sqlite3_val
5bd0: 75 65 5f 62 79 74 65 73 28 70 49 6e 29 3b 0a 20  ue_bytes(pIn);. 
5be0: 20 20 20 20 20 20 20 20 20 70 56 61 6c 20 3d 20           pVal = 
5bf0: 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79  Tcl_NewByteArray
5c00: 4f 62 6a 28 73 71 6c 69 74 65 33 5f 76 61 6c 75  Obj(sqlite3_valu
5c10: 65 5f 62 6c 6f 62 28 70 49 6e 29 2c 20 62 79 74  e_blob(pIn), byt
5c20: 65 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62  es);.          b
5c30: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
5c40: 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c          case SQL
5c50: 49 54 45 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20  ITE_INTEGER: {. 
5c60: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 5f           sqlite_
5c70: 69 6e 74 36 34 20 76 20 3d 20 73 71 6c 69 74 65  int64 v = sqlite
5c80: 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28 70 49  3_value_int64(pI
5c90: 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  n);.          if
5ca0: 28 20 76 3e 3d 2d 32 31 34 37 34 38 33 36 34 37  ( v>=-2147483647
5cb0: 20 26 26 20 76 3c 3d 32 31 34 37 34 38 33 36 34   && v<=214748364
5cc0: 37 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  7 ){.           
5cd0: 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 49   pVal = Tcl_NewI
5ce0: 6e 74 4f 62 6a 28 28 69 6e 74 29 76 29 3b 0a 20  ntObj((int)v);. 
5cf0: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
5d00: 20 20 20 20 20 20 20 20 20 20 20 20 70 56 61 6c              pVal
5d10: 20 3d 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e   = Tcl_NewWideIn
5d20: 74 4f 62 6a 28 76 29 3b 0a 20 20 20 20 20 20 20  tObj(v);.       
5d30: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 62     }.          b
5d40: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
5d50: 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c          case SQL
5d60: 49 54 45 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20  ITE_FLOAT: {.   
5d70: 20 20 20 20 20 20 20 64 6f 75 62 6c 65 20 72 20         double r 
5d80: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
5d90: 64 6f 75 62 6c 65 28 70 49 6e 29 3b 0a 20 20 20  double(pIn);.   
5da0: 20 20 20 20 20 20 20 70 56 61 6c 20 3d 20 54 63         pVal = Tc
5db0: 6c 5f 4e 65 77 44 6f 75 62 6c 65 4f 62 6a 28 72  l_NewDoubleObj(r
5dc0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  );.          bre
5dd0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
5de0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
5df0: 45 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20  E_NULL: {.      
5e00: 20 20 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e      pVal = Tcl_N
5e10: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 22 2c 20  ewStringObj("", 
5e20: 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  0);.          br
5e30: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
5e40: 20 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20         default: 
5e50: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
5e60: 62 79 74 65 73 20 3d 20 73 71 6c 69 74 65 33 5f  bytes = sqlite3_
5e70: 76 61 6c 75 65 5f 62 79 74 65 73 28 70 49 6e 29  value_bytes(pIn)
5e80: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 56 61 6c  ;.          pVal
5e90: 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67   = Tcl_NewString
5ea0: 4f 62 6a 28 28 63 68 61 72 20 2a 29 73 71 6c 69  Obj((char *)sqli
5eb0: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 70  te3_value_text(p
5ec0: 49 6e 29 2c 20 62 79 74 65 73 29 3b 0a 20 20 20  In), bytes);.   
5ed0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
5ee0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
5ef0: 20 20 20 20 20 20 72 63 20 3d 20 54 63 6c 5f 4c        rc = Tcl_L
5f00: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
5f10: 65 6e 74 28 70 2d 3e 69 6e 74 65 72 70 2c 20 70  ent(p->interp, p
5f20: 43 6d 64 2c 20 70 56 61 6c 29 3b 0a 20 20 20 20  Cmd, pVal);.    
5f30: 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
5f40: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
5f50: 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20 20 20  ount(pCmd);.    
5f60: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
5f70: 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74  lt_error(context
5f80: 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52  , Tcl_GetStringR
5f90: 65 73 75 6c 74 28 70 2d 3e 69 6e 74 65 72 70 29  esult(p->interp)
5fa0: 2c 20 2d 31 29 3b 20 0a 20 20 20 20 20 20 20 20  , -1); .        
5fb0: 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a  return;.      }.
5fc0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 70      }.    if( !p
5fd0: 2d 3e 75 73 65 45 76 61 6c 4f 62 6a 76 20 29 7b  ->useEvalObjv ){
5fe0: 0a 20 20 20 20 20 20 2f 2a 20 54 63 6c 5f 45 76  .      /* Tcl_Ev
5ff0: 61 6c 4f 62 6a 45 78 28 29 20 77 69 6c 6c 20 61  alObjEx() will a
6000: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 61 6c  utomatically cal
6010: 6c 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 76 28 29  l Tcl_EvalObjv()
6020: 20 69 66 20 70 43 6d 64 0a 20 20 20 20 20 20 2a   if pCmd.      *
6030: 2a 20 69 73 20 61 20 6c 69 73 74 20 77 69 74 68  * is a list with
6040: 6f 75 74 20 61 20 73 74 72 69 6e 67 20 72 65 70  out a string rep
6050: 72 65 73 65 6e 74 61 74 69 6f 6e 2e 20 20 54 6f  resentation.  To
6060: 20 70 72 65 76 65 6e 74 20 74 68 69 73 20 66 72   prevent this fr
6070: 6f 6d 0a 20 20 20 20 20 20 2a 2a 20 68 61 70 70  om.      ** happ
6080: 65 6e 69 6e 67 2c 20 6d 61 6b 65 20 73 75 72 65  ening, make sure
6090: 20 70 43 6d 64 20 68 61 73 20 61 20 76 61 6c 69   pCmd has a vali
60a0: 64 20 73 74 72 69 6e 67 20 72 65 70 72 65 73 65  d string represe
60b0: 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  ntation */.     
60c0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 70   Tcl_GetString(p
60d0: 43 6d 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Cmd);.    }.    
60e0: 72 63 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a  rc = Tcl_EvalObj
60f0: 45 78 28 70 2d 3e 69 6e 74 65 72 70 2c 20 70 43  Ex(p->interp, pC
6100: 6d 64 2c 20 54 43 4c 5f 45 56 41 4c 5f 44 49 52  md, TCL_EVAL_DIR
6110: 45 43 54 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65  ECT);.    Tcl_De
6120: 63 72 52 65 66 43 6f 75 6e 74 28 70 43 6d 64 29  crRefCount(pCmd)
6130: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 20  ;.  }..  if( rc 
6140: 26 26 20 72 63 21 3d 54 43 4c 5f 52 45 54 55 52  && rc!=TCL_RETUR
6150: 4e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  N ){.    sqlite3
6160: 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f  _result_error(co
6170: 6e 74 65 78 74 2c 20 54 63 6c 5f 47 65 74 53 74  ntext, Tcl_GetSt
6180: 72 69 6e 67 52 65 73 75 6c 74 28 70 2d 3e 69 6e  ringResult(p->in
6190: 74 65 72 70 29 2c 20 2d 31 29 3b 20 0a 20 20 7d  terp), -1); .  }
61a0: 65 6c 73 65 7b 0a 20 20 20 20 54 63 6c 5f 4f 62  else{.    Tcl_Ob
61b0: 6a 20 2a 70 56 61 72 20 3d 20 54 63 6c 5f 47 65  j *pVar = Tcl_Ge
61c0: 74 4f 62 6a 52 65 73 75 6c 74 28 70 2d 3e 69 6e  tObjResult(p->in
61d0: 74 65 72 70 29 3b 0a 20 20 20 20 69 6e 74 20 6e  terp);.    int n
61e0: 3b 0a 20 20 20 20 75 38 20 2a 64 61 74 61 3b 0a  ;.    u8 *data;.
61f0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
6200: 7a 54 79 70 65 20 3d 20 28 70 56 61 72 2d 3e 74  zType = (pVar->t
6210: 79 70 65 50 74 72 20 3f 20 70 56 61 72 2d 3e 74  ypePtr ? pVar->t
6220: 79 70 65 50 74 72 2d 3e 6e 61 6d 65 20 3a 20 22  ypePtr->name : "
6230: 22 29 3b 0a 20 20 20 20 63 68 61 72 20 63 20 3d  ");.    char c =
6240: 20 7a 54 79 70 65 5b 30 5d 3b 0a 20 20 20 20 69   zType[0];.    i
6250: 66 28 20 63 3d 3d 27 62 27 20 26 26 20 73 74 72  f( c=='b' && str
6260: 63 6d 70 28 7a 54 79 70 65 2c 22 62 79 74 65 61  cmp(zType,"bytea
6270: 72 72 61 79 22 29 3d 3d 30 20 26 26 20 70 56 61  rray")==0 && pVa
6280: 72 2d 3e 62 79 74 65 73 3d 3d 30 20 29 7b 0a 20  r->bytes==0 ){. 
6290: 20 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 72 65 74       /* Only ret
62a0: 75 72 6e 20 61 20 42 4c 4f 42 20 74 79 70 65 20  urn a BLOB type 
62b0: 69 66 20 74 68 65 20 54 63 6c 20 76 61 72 69 61  if the Tcl varia
62c0: 62 6c 65 20 69 73 20 61 20 62 79 74 65 61 72 72  ble is a bytearr
62d0: 61 79 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20  ay and.      ** 
62e0: 68 61 73 20 6e 6f 20 73 74 72 69 6e 67 20 72 65  has no string re
62f0: 70 72 65 73 65 6e 74 61 74 69 6f 6e 2e 20 2a 2f  presentation. */
6300: 0a 20 20 20 20 20 20 64 61 74 61 20 3d 20 54 63  .      data = Tc
6310: 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79 46 72  l_GetByteArrayFr
6320: 6f 6d 4f 62 6a 28 70 56 61 72 2c 20 26 6e 29 3b  omObj(pVar, &n);
6330: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
6340: 65 73 75 6c 74 5f 62 6c 6f 62 28 63 6f 6e 74 65  esult_blob(conte
6350: 78 74 2c 20 64 61 74 61 2c 20 6e 2c 20 53 51 4c  xt, data, n, SQL
6360: 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
6370: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d      }else if( c=
6380: 3d 27 62 27 20 26 26 20 73 74 72 63 6d 70 28 7a  ='b' && strcmp(z
6390: 54 79 70 65 2c 22 62 6f 6f 6c 65 61 6e 22 29 3d  Type,"boolean")=
63a0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  =0 ){.      Tcl_
63b0: 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 30 2c  GetIntFromObj(0,
63c0: 20 70 56 61 72 2c 20 26 6e 29 3b 0a 20 20 20 20   pVar, &n);.    
63d0: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
63e0: 5f 69 6e 74 28 63 6f 6e 74 65 78 74 2c 20 6e 29  _int(context, n)
63f0: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
6400: 63 3d 3d 27 64 27 20 26 26 20 73 74 72 63 6d 70  c=='d' && strcmp
6410: 28 7a 54 79 70 65 2c 22 64 6f 75 62 6c 65 22 29  (zType,"double")
6420: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 64 6f 75  ==0 ){.      dou
6430: 62 6c 65 20 72 3b 0a 20 20 20 20 20 20 54 63 6c  ble r;.      Tcl
6440: 5f 47 65 74 44 6f 75 62 6c 65 46 72 6f 6d 4f 62  _GetDoubleFromOb
6450: 6a 28 30 2c 20 70 56 61 72 2c 20 26 72 29 3b 0a  j(0, pVar, &r);.
6460: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
6470: 73 75 6c 74 5f 64 6f 75 62 6c 65 28 63 6f 6e 74  sult_double(cont
6480: 65 78 74 2c 20 72 29 3b 0a 20 20 20 20 7d 65 6c  ext, r);.    }el
6490: 73 65 20 69 66 28 20 28 63 3d 3d 27 77 27 20 26  se if( (c=='w' &
64a0: 26 20 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22  & strcmp(zType,"
64b0: 77 69 64 65 49 6e 74 22 29 3d 3d 30 29 20 7c 7c  wideInt")==0) ||
64c0: 0a 20 20 20 20 20 20 20 20 20 20 28 63 3d 3d 27  .          (c=='
64d0: 69 27 20 26 26 20 73 74 72 63 6d 70 28 7a 54 79  i' && strcmp(zTy
64e0: 70 65 2c 22 69 6e 74 22 29 3d 3d 30 29 20 29 7b  pe,"int")==0) ){
64f0: 0a 20 20 20 20 20 20 54 63 6c 5f 57 69 64 65 49  .      Tcl_WideI
6500: 6e 74 20 76 3b 0a 20 20 20 20 20 20 54 63 6c 5f  nt v;.      Tcl_
6510: 47 65 74 57 69 64 65 49 6e 74 46 72 6f 6d 4f 62  GetWideIntFromOb
6520: 6a 28 30 2c 20 70 56 61 72 2c 20 26 76 29 3b 0a  j(0, pVar, &v);.
6530: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
6540: 73 75 6c 74 5f 69 6e 74 36 34 28 63 6f 6e 74 65  sult_int64(conte
6550: 78 74 2c 20 76 29 3b 0a 20 20 20 20 7d 65 6c 73  xt, v);.    }els
6560: 65 7b 0a 20 20 20 20 20 20 64 61 74 61 20 3d 20  e{.      data = 
6570: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  (unsigned char *
6580: 29 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72  )Tcl_GetStringFr
6590: 6f 6d 4f 62 6a 28 70 56 61 72 2c 20 26 6e 29 3b  omObj(pVar, &n);
65a0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
65b0: 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65  esult_text(conte
65c0: 78 74 2c 20 28 63 68 61 72 20 2a 29 64 61 74 61  xt, (char *)data
65d0: 2c 20 6e 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  , n, SQLITE_TRAN
65e0: 53 49 45 4e 54 29 3b 0a 20 20 20 20 7d 0a 20 20  SIENT);.    }.  
65f0: 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  }.}..#ifndef SQL
6600: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49  ITE_OMIT_AUTHORI
6610: 5a 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 54 68 69  ZATION./*.** Thi
6620: 73 20 69 73 20 74 68 65 20 61 75 74 68 65 6e 74  s is the authent
6630: 69 63 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e  ication function
6640: 2e 20 20 49 74 20 61 70 70 65 6e 64 73 20 74 68  .  It appends th
6650: 65 20 61 75 74 68 65 6e 74 69 63 61 74 69 6f 6e  e authentication
6660: 0a 2a 2a 20 74 79 70 65 20 63 6f 64 65 20 61 6e  .** type code an
6670: 64 20 74 68 65 20 74 77 6f 20 61 72 67 75 6d 65  d the two argume
6680: 6e 74 73 20 74 6f 20 7a 43 6d 64 5b 5d 20 74 68  nts to zCmd[] th
6690: 65 6e 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 72  en invokes the r
66a0: 65 73 75 6c 74 0a 2a 2a 20 6f 6e 20 74 68 65 20  esult.** on the 
66b0: 69 6e 74 65 72 70 72 65 74 65 72 2e 20 20 54 68  interpreter.  Th
66c0: 65 20 72 65 70 6c 79 20 69 73 20 65 78 61 6d 69  e reply is exami
66d0: 6e 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  ned to determine
66e0: 20 69 66 20 74 68 65 0a 2a 2a 20 61 75 74 68 65   if the.** authe
66f0: 6e 74 69 63 61 74 69 6f 6e 20 66 61 69 6c 73 20  ntication fails 
6700: 6f 72 20 73 75 63 63 65 65 64 73 2e 0a 2a 2f 0a  or succeeds..*/.
6710: 73 74 61 74 69 63 20 69 6e 74 20 61 75 74 68 5f  static int auth_
6720: 63 61 6c 6c 62 61 63 6b 28 0a 20 20 76 6f 69 64  callback(.  void
6730: 20 2a 70 41 72 67 2c 0a 20 20 69 6e 74 20 63 6f   *pArg,.  int co
6740: 64 65 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  de,.  const char
6750: 20 2a 7a 41 72 67 31 2c 0a 20 20 63 6f 6e 73 74   *zArg1,.  const
6760: 20 63 68 61 72 20 2a 7a 41 72 67 32 2c 0a 20 20   char *zArg2,.  
6770: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67  const char *zArg
6780: 33 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  3,.  const char 
6790: 2a 7a 41 72 67 34 0a 29 7b 0a 20 20 63 68 61 72  *zArg4.){.  char
67a0: 20 2a 7a 43 6f 64 65 3b 0a 20 20 54 63 6c 5f 44   *zCode;.  Tcl_D
67b0: 53 74 72 69 6e 67 20 73 74 72 3b 0a 20 20 69 6e  String str;.  in
67c0: 74 20 72 63 3b 0a 20 20 63 6f 6e 73 74 20 63 68  t rc;.  const ch
67d0: 61 72 20 2a 7a 52 65 70 6c 79 3b 0a 20 20 53 71  ar *zReply;.  Sq
67e0: 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53  liteDb *pDb = (S
67f0: 71 6c 69 74 65 44 62 2a 29 70 41 72 67 3b 0a 20  qliteDb*)pArg;. 
6800: 20 69 66 28 20 70 44 62 2d 3e 64 69 73 61 62 6c   if( pDb->disabl
6810: 65 41 75 74 68 20 29 20 72 65 74 75 72 6e 20 53  eAuth ) return S
6820: 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 73 77 69  QLITE_OK;..  swi
6830: 74 63 68 28 20 63 6f 64 65 20 29 7b 0a 20 20 20  tch( code ){.   
6840: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 50   case SQLITE_COP
6850: 59 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3a  Y              :
6860: 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43   zCode="SQLITE_C
6870: 4f 50 59 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  OPY"; break;.   
6880: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 52 45   case SQLITE_CRE
6890: 41 54 45 5f 49 4e 44 45 58 20 20 20 20 20 20 3a  ATE_INDEX      :
68a0: 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43   zCode="SQLITE_C
68b0: 52 45 41 54 45 5f 49 4e 44 45 58 22 3b 20 62 72  REATE_INDEX"; br
68c0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
68d0: 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 41 42 4c  LITE_CREATE_TABL
68e0: 45 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22  E      : zCode="
68f0: 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 41  SQLITE_CREATE_TA
6900: 42 4c 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  BLE"; break;.   
6910: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 52 45   case SQLITE_CRE
6920: 41 54 45 5f 54 45 4d 50 5f 49 4e 44 45 58 20 3a  ATE_TEMP_INDEX :
6930: 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43   zCode="SQLITE_C
6940: 52 45 41 54 45 5f 54 45 4d 50 5f 49 4e 44 45 58  REATE_TEMP_INDEX
6950: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
6960: 73 65 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45  se SQLITE_CREATE
6970: 5f 54 45 4d 50 5f 54 41 42 4c 45 20 3a 20 7a 43  _TEMP_TABLE : zC
6980: 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43 52 45 41  ode="SQLITE_CREA
6990: 54 45 5f 54 45 4d 50 5f 54 41 42 4c 45 22 3b 20  TE_TEMP_TABLE"; 
69a0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
69b0: 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45  SQLITE_CREATE_TE
69c0: 4d 50 5f 54 52 49 47 47 45 52 3a 20 7a 43 6f 64  MP_TRIGGER: zCod
69d0: 65 3d 22 53 51 4c 49 54 45 5f 43 52 45 41 54 45  e="SQLITE_CREATE
69e0: 5f 54 45 4d 50 5f 54 52 49 47 47 45 52 22 3b 20  _TEMP_TRIGGER"; 
69f0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
6a00: 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45  SQLITE_CREATE_TE
6a10: 4d 50 5f 56 49 45 57 20 20 3a 20 7a 43 6f 64 65  MP_VIEW  : zCode
6a20: 3d 22 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  ="SQLITE_CREATE_
6a30: 54 45 4d 50 5f 56 49 45 57 22 3b 20 62 72 65 61  TEMP_VIEW"; brea
6a40: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
6a50: 54 45 5f 43 52 45 41 54 45 5f 54 52 49 47 47 45  TE_CREATE_TRIGGE
6a60: 52 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51  R    : zCode="SQ
6a70: 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 52 49 47  LITE_CREATE_TRIG
6a80: 47 45 52 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  GER"; break;.   
6a90: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 52 45   case SQLITE_CRE
6aa0: 41 54 45 5f 56 49 45 57 20 20 20 20 20 20 20 3a  ATE_VIEW       :
6ab0: 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43   zCode="SQLITE_C
6ac0: 52 45 41 54 45 5f 56 49 45 57 22 3b 20 62 72 65  REATE_VIEW"; bre
6ad0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
6ae0: 49 54 45 5f 44 45 4c 45 54 45 20 20 20 20 20 20  ITE_DELETE      
6af0: 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53        : zCode="S
6b00: 51 4c 49 54 45 5f 44 45 4c 45 54 45 22 3b 20 62  QLITE_DELETE"; b
6b10: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
6b20: 51 4c 49 54 45 5f 44 52 4f 50 5f 49 4e 44 45 58  QLITE_DROP_INDEX
6b30: 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d          : zCode=
6b40: 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f 49 4e 44  "SQLITE_DROP_IND
6b50: 45 58 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  EX"; break;.    
6b60: 63 61 73 65 20 53 51 4c 49 54 45 5f 44 52 4f 50  case SQLITE_DROP
6b70: 5f 54 41 42 4c 45 20 20 20 20 20 20 20 20 3a 20  _TABLE        : 
6b80: 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44 52  zCode="SQLITE_DR
6b90: 4f 50 5f 54 41 42 4c 45 22 3b 20 62 72 65 61 6b  OP_TABLE"; break
6ba0: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
6bb0: 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 49 4e 44 45  E_DROP_TEMP_INDE
6bc0: 58 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c  X   : zCode="SQL
6bd0: 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 49 4e  ITE_DROP_TEMP_IN
6be0: 44 45 58 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  DEX"; break;.   
6bf0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44 52 4f   case SQLITE_DRO
6c00: 50 5f 54 45 4d 50 5f 54 41 42 4c 45 20 20 20 3a  P_TEMP_TABLE   :
6c10: 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44   zCode="SQLITE_D
6c20: 52 4f 50 5f 54 45 4d 50 5f 54 41 42 4c 45 22 3b  ROP_TEMP_TABLE";
6c30: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
6c40: 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d   SQLITE_DROP_TEM
6c50: 50 5f 54 52 49 47 47 45 52 20 3a 20 7a 43 6f 64  P_TRIGGER : zCod
6c60: 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54  e="SQLITE_DROP_T
6c70: 45 4d 50 5f 54 52 49 47 47 45 52 22 3b 20 62 72  EMP_TRIGGER"; br
6c80: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
6c90: 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 56  LITE_DROP_TEMP_V
6ca0: 49 45 57 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22  IEW    : zCode="
6cb0: 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50  SQLITE_DROP_TEMP
6cc0: 5f 56 49 45 57 22 3b 20 62 72 65 61 6b 3b 0a 20  _VIEW"; break;. 
6cd0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44     case SQLITE_D
6ce0: 52 4f 50 5f 54 52 49 47 47 45 52 20 20 20 20 20  ROP_TRIGGER     
6cf0: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
6d00: 5f 44 52 4f 50 5f 54 52 49 47 47 45 52 22 3b 20  _DROP_TRIGGER"; 
6d10: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
6d20: 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56 49 45 57  SQLITE_DROP_VIEW
6d30: 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65           : zCode
6d40: 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56 49  ="SQLITE_DROP_VI
6d50: 45 57 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  EW"; break;.    
6d60: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 53 45  case SQLITE_INSE
6d70: 52 54 20 20 20 20 20 20 20 20 20 20 20 20 3a 20  RT            : 
6d80: 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 49 4e  zCode="SQLITE_IN
6d90: 53 45 52 54 22 3b 20 62 72 65 61 6b 3b 0a 20 20  SERT"; break;.  
6da0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 50 52    case SQLITE_PR
6db0: 41 47 4d 41 20 20 20 20 20 20 20 20 20 20 20 20  AGMA            
6dc0: 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f  : zCode="SQLITE_
6dd0: 50 52 41 47 4d 41 22 3b 20 62 72 65 61 6b 3b 0a  PRAGMA"; break;.
6de0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
6df0: 52 45 41 44 20 20 20 20 20 20 20 20 20 20 20 20  READ            
6e00: 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54    : zCode="SQLIT
6e10: 45 5f 52 45 41 44 22 3b 20 62 72 65 61 6b 3b 0a  E_READ"; break;.
6e20: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
6e30: 53 45 4c 45 43 54 20 20 20 20 20 20 20 20 20 20  SELECT          
6e40: 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54    : zCode="SQLIT
6e50: 45 5f 53 45 4c 45 43 54 22 3b 20 62 72 65 61 6b  E_SELECT"; break
6e60: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
6e70: 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 20 20 20  E_TRANSACTION   
6e80: 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c      : zCode="SQL
6e90: 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 22  ITE_TRANSACTION"
6ea0: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
6eb0: 65 20 53 51 4c 49 54 45 5f 55 50 44 41 54 45 20  e SQLITE_UPDATE 
6ec0: 20 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f             : zCo
6ed0: 64 65 3d 22 53 51 4c 49 54 45 5f 55 50 44 41 54  de="SQLITE_UPDAT
6ee0: 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  E"; break;.    c
6ef0: 61 73 65 20 53 51 4c 49 54 45 5f 41 54 54 41 43  ase SQLITE_ATTAC
6f00: 48 20 20 20 20 20 20 20 20 20 20 20 20 3a 20 7a  H            : z
6f10: 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 41 54 54  Code="SQLITE_ATT
6f20: 41 43 48 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  ACH"; break;.   
6f30: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44 45 54   case SQLITE_DET
6f40: 41 43 48 20 20 20 20 20 20 20 20 20 20 20 20 3a  ACH            :
6f50: 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44   zCode="SQLITE_D
6f60: 45 54 41 43 48 22 3b 20 62 72 65 61 6b 3b 0a 20  ETACH"; break;. 
6f70: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41     case SQLITE_A
6f80: 4c 54 45 52 5f 54 41 42 4c 45 20 20 20 20 20 20  LTER_TABLE      
6f90: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
6fa0: 5f 41 4c 54 45 52 5f 54 41 42 4c 45 22 3b 20 62  _ALTER_TABLE"; b
6fb0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
6fc0: 51 4c 49 54 45 5f 52 45 49 4e 44 45 58 20 20 20  QLITE_REINDEX   
6fd0: 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d          : zCode=
6fe0: 22 53 51 4c 49 54 45 5f 52 45 49 4e 44 45 58 22  "SQLITE_REINDEX"
6ff0: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
7000: 65 20 53 51 4c 49 54 45 5f 41 4e 41 4c 59 5a 45  e SQLITE_ANALYZE
7010: 20 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f             : zCo
7020: 64 65 3d 22 53 51 4c 49 54 45 5f 41 4e 41 4c 59  de="SQLITE_ANALY
7030: 5a 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  ZE"; break;.    
7040: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 52 45 41  case SQLITE_CREA
7050: 54 45 5f 56 54 41 42 4c 45 20 20 20 20 20 3a 20  TE_VTABLE     : 
7060: 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43 52  zCode="SQLITE_CR
7070: 45 41 54 45 5f 56 54 41 42 4c 45 22 3b 20 62 72  EATE_VTABLE"; br
7080: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
7090: 4c 49 54 45 5f 44 52 4f 50 5f 56 54 41 42 4c 45  LITE_DROP_VTABLE
70a0: 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22         : zCode="
70b0: 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56 54 41 42  SQLITE_DROP_VTAB
70c0: 4c 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  LE"; break;.    
70d0: 63 61 73 65 20 53 51 4c 49 54 45 5f 46 55 4e 43  case SQLITE_FUNC
70e0: 54 49 4f 4e 20 20 20 20 20 20 20 20 20 20 3a 20  TION          : 
70f0: 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 46 55  zCode="SQLITE_FU
7100: 4e 43 54 49 4f 4e 22 3b 20 62 72 65 61 6b 3b 0a  NCTION"; break;.
7110: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
7120: 53 41 56 45 50 4f 49 4e 54 20 20 20 20 20 20 20  SAVEPOINT       
7130: 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54    : zCode="SQLIT
7140: 45 5f 53 41 56 45 50 4f 49 4e 54 22 3b 20 62 72  E_SAVEPOINT"; br
7150: 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74  eak;.    default
7160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7170: 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22         : zCode="
7180: 3f 3f 3f 3f 22 3b 20 62 72 65 61 6b 3b 0a 20 20  ????"; break;.  
7190: 7d 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49  }.  Tcl_DStringI
71a0: 6e 69 74 28 26 73 74 72 29 3b 0a 20 20 54 63 6c  nit(&str);.  Tcl
71b0: 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64 28 26  _DStringAppend(&
71c0: 73 74 72 2c 20 70 44 62 2d 3e 7a 41 75 74 68 2c  str, pDb->zAuth,
71d0: 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72   -1);.  Tcl_DStr
71e0: 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ingAppendElement
71f0: 28 26 73 74 72 2c 20 7a 43 6f 64 65 29 3b 0a 20  (&str, zCode);. 
7200: 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65   Tcl_DStringAppe
7210: 6e 64 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c 20  ndElement(&str, 
7220: 7a 41 72 67 31 20 3f 20 7a 41 72 67 31 20 3a 20  zArg1 ? zArg1 : 
7230: 22 22 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69  "");.  Tcl_DStri
7240: 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  ngAppendElement(
7250: 26 73 74 72 2c 20 7a 41 72 67 32 20 3f 20 7a 41  &str, zArg2 ? zA
7260: 72 67 32 20 3a 20 22 22 29 3b 0a 20 20 54 63 6c  rg2 : "");.  Tcl
7270: 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64 45 6c  _DStringAppendEl
7280: 65 6d 65 6e 74 28 26 73 74 72 2c 20 7a 41 72 67  ement(&str, zArg
7290: 33 20 3f 20 7a 41 72 67 33 20 3a 20 22 22 29 3b  3 ? zArg3 : "");
72a0: 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70  .  Tcl_DStringAp
72b0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 26 73 74 72  pendElement(&str
72c0: 2c 20 7a 41 72 67 34 20 3f 20 7a 41 72 67 34 20  , zArg4 ? zArg4 
72d0: 3a 20 22 22 29 3b 0a 20 20 72 63 20 3d 20 54 63  : "");.  rc = Tc
72e0: 6c 5f 47 6c 6f 62 61 6c 45 76 61 6c 28 70 44 62  l_GlobalEval(pDb
72f0: 2d 3e 69 6e 74 65 72 70 2c 20 54 63 6c 5f 44 53  ->interp, Tcl_DS
7300: 74 72 69 6e 67 56 61 6c 75 65 28 26 73 74 72 29  tringValue(&str)
7310: 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  );.  Tcl_DString
7320: 46 72 65 65 28 26 73 74 72 29 3b 0a 20 20 7a 52  Free(&str);.  zR
7330: 65 70 6c 79 20 3d 20 72 63 3d 3d 54 43 4c 5f 4f  eply = rc==TCL_O
7340: 4b 20 3f 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  K ? Tcl_GetStrin
7350: 67 52 65 73 75 6c 74 28 70 44 62 2d 3e 69 6e 74  gResult(pDb->int
7360: 65 72 70 29 20 3a 20 22 53 51 4c 49 54 45 5f 44  erp) : "SQLITE_D
7370: 45 4e 59 22 3b 0a 20 20 69 66 28 20 73 74 72 63  ENY";.  if( strc
7380: 6d 70 28 7a 52 65 70 6c 79 2c 22 53 51 4c 49 54  mp(zReply,"SQLIT
7390: 45 5f 4f 4b 22 29 3d 3d 30 20 29 7b 0a 20 20 20  E_OK")==0 ){.   
73a0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
73b0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72  .  }else if( str
73c0: 63 6d 70 28 7a 52 65 70 6c 79 2c 22 53 51 4c 49  cmp(zReply,"SQLI
73d0: 54 45 5f 44 45 4e 59 22 29 3d 3d 30 20 29 7b 0a  TE_DENY")==0 ){.
73e0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
73f0: 44 45 4e 59 3b 0a 20 20 7d 65 6c 73 65 20 69 66  DENY;.  }else if
7400: 28 20 73 74 72 63 6d 70 28 7a 52 65 70 6c 79 2c  ( strcmp(zReply,
7410: 22 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 22 29  "SQLITE_IGNORE")
7420: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
7430: 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 3b 0a 20  SQLITE_IGNORE;. 
7440: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
7450: 20 39 39 39 3b 0a 20 20 7d 0a 20 20 72 65 74 75   999;.  }.  retu
7460: 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20  rn rc;.}.#endif 
7470: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  /* SQLITE_OMIT_A
7480: 55 54 48 4f 52 49 5a 41 54 49 4f 4e 20 2a 2f 0a  UTHORIZATION */.
7490: 0a 2f 2a 0a 2a 2a 20 7a 54 65 78 74 20 69 73 20  ./*.** zText is 
74a0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 65 78  a pointer to tex
74b0: 74 20 6f 62 74 61 69 6e 65 64 20 76 69 61 20 61  t obtained via a
74c0: 6e 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74  n sqlite3_result
74d0: 5f 74 65 78 74 28 29 0a 2a 2a 20 6f 72 20 73 69  _text().** or si
74e0: 6d 69 6c 61 72 20 69 6e 74 65 72 66 61 63 65 2e  milar interface.
74f0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
7500: 74 75 72 6e 73 20 61 20 54 63 6c 20 73 74 72 69  turns a Tcl stri
7510: 6e 67 20 6f 62 6a 65 63 74 2c 20 0a 2a 2a 20 72  ng object, .** r
7520: 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 73  eference count s
7530: 65 74 20 74 6f 20 30 2c 20 63 6f 6e 74 61 69 6e  et to 0, contain
7540: 69 6e 67 20 74 68 65 20 74 65 78 74 2e 20 49 66  ing the text. If
7550: 20 61 20 74 72 61 6e 73 6c 61 74 69 6f 6e 0a 2a   a translation.*
7560: 2a 20 62 65 74 77 65 65 6e 20 69 73 6f 38 38 35  * between iso885
7570: 39 20 61 6e 64 20 55 54 46 2d 38 20 69 73 20 72  9 and UTF-8 is r
7580: 65 71 75 69 72 65 64 2c 20 69 74 20 69 73 20 70  equired, it is p
7590: 72 65 66 6f 72 6d 65 64 2e 0a 2a 2f 0a 73 74 61  reformed..*/.sta
75a0: 74 69 63 20 54 63 6c 5f 4f 62 6a 20 2a 64 62 54  tic Tcl_Obj *dbT
75b0: 65 78 74 54 6f 4f 62 6a 28 63 68 61 72 20 63 6f  extToObj(char co
75c0: 6e 73 74 20 2a 7a 54 65 78 74 29 7b 0a 20 20 54  nst *zText){.  T
75d0: 63 6c 5f 4f 62 6a 20 2a 70 56 61 6c 3b 0a 23 69  cl_Obj *pVal;.#i
75e0: 66 64 65 66 20 55 54 46 5f 54 52 41 4e 53 4c 41  fdef UTF_TRANSLA
75f0: 54 49 4f 4e 5f 4e 45 45 44 45 44 0a 20 20 54 63  TION_NEEDED.  Tc
7600: 6c 5f 44 53 74 72 69 6e 67 20 64 43 6f 6c 3b 0a  l_DString dCol;.
7610: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69    Tcl_DStringIni
7620: 74 28 26 64 43 6f 6c 29 3b 0a 20 20 54 63 6c 5f  t(&dCol);.  Tcl_
7630: 45 78 74 65 72 6e 61 6c 54 6f 55 74 66 44 53 74  ExternalToUtfDSt
7640: 72 69 6e 67 28 4e 55 4c 4c 2c 20 7a 54 65 78 74  ring(NULL, zText
7650: 2c 20 2d 31 2c 20 26 64 43 6f 6c 29 3b 0a 20 20  , -1, &dCol);.  
7660: 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 53 74  pVal = Tcl_NewSt
7670: 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 44 53 74 72  ringObj(Tcl_DStr
7680: 69 6e 67 56 61 6c 75 65 28 26 64 43 6f 6c 29 2c  ingValue(&dCol),
7690: 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72   -1);.  Tcl_DStr
76a0: 69 6e 67 46 72 65 65 28 26 64 43 6f 6c 29 3b 0a  ingFree(&dCol);.
76b0: 23 65 6c 73 65 0a 20 20 70 56 61 6c 20 3d 20 54  #else.  pVal = T
76c0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
76d0: 7a 54 65 78 74 2c 20 2d 31 29 3b 0a 23 65 6e 64  zText, -1);.#end
76e0: 69 66 0a 20 20 72 65 74 75 72 6e 20 70 56 61 6c  if.  return pVal
76f0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
7700: 72 6f 75 74 69 6e 65 20 72 65 61 64 73 20 61 20  routine reads a 
7710: 6c 69 6e 65 20 6f 66 20 74 65 78 74 20 66 72 6f  line of text fro
7720: 6d 20 46 49 4c 45 20 69 6e 2c 20 73 74 6f 72 65  m FILE in, store
7730: 73 0a 2a 2a 20 74 68 65 20 74 65 78 74 20 69 6e  s.** the text in
7740: 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64   memory obtained
7750: 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 20 61   from malloc() a
7760: 6e 64 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69  nd returns a poi
7770: 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 74  nter.** to the t
7780: 65 78 74 2e 20 20 4e 55 4c 4c 20 69 73 20 72 65  ext.  NULL is re
7790: 74 75 72 6e 65 64 20 61 74 20 65 6e 64 20 6f 66  turned at end of
77a0: 20 66 69 6c 65 2c 20 6f 72 20 69 66 20 6d 61 6c   file, or if mal
77b0: 6c 6f 63 28 29 0a 2a 2a 20 66 61 69 6c 73 2e 0a  loc().** fails..
77c0: 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 74 65 72 66  **.** The interf
77d0: 61 63 65 20 69 73 20 6c 69 6b 65 20 22 72 65 61  ace is like "rea
77e0: 64 6c 69 6e 65 22 20 62 75 74 20 6e 6f 20 63 6f  dline" but no co
77f0: 6d 6d 61 6e 64 2d 6c 69 6e 65 20 65 64 69 74 69  mmand-line editi
7800: 6e 67 0a 2a 2a 20 69 73 20 64 6f 6e 65 2e 0a 2a  ng.** is done..*
7810: 2a 0a 2a 2a 20 63 6f 70 69 65 64 20 66 72 6f 6d  *.** copied from
7820: 20 73 68 65 6c 6c 2e 63 20 66 72 6f 6d 20 27 2e   shell.c from '.
7830: 69 6d 70 6f 72 74 27 20 63 6f 6d 6d 61 6e 64 0a  import' command.
7840: 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
7850: 6c 6f 63 61 6c 5f 67 65 74 6c 69 6e 65 28 63 68  local_getline(ch
7860: 61 72 20 2a 7a 50 72 6f 6d 70 74 2c 20 46 49 4c  ar *zPrompt, FIL
7870: 45 20 2a 69 6e 29 7b 0a 20 20 63 68 61 72 20 2a  E *in){.  char *
7880: 7a 4c 69 6e 65 3b 0a 20 20 69 6e 74 20 6e 4c 69  zLine;.  int nLi
7890: 6e 65 3b 0a 20 20 69 6e 74 20 6e 3b 0a 0a 20 20  ne;.  int n;..  
78a0: 6e 4c 69 6e 65 20 3d 20 31 30 30 3b 0a 20 20 7a  nLine = 100;.  z
78b0: 4c 69 6e 65 20 3d 20 6d 61 6c 6c 6f 63 28 20 6e  Line = malloc( n
78c0: 4c 69 6e 65 20 29 3b 0a 20 20 69 66 28 20 7a 4c  Line );.  if( zL
78d0: 69 6e 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ine==0 ) return 
78e0: 30 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20 20 77 68  0;.  n = 0;.  wh
78f0: 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 69 66  ile( 1 ){.    if
7900: 28 20 6e 2b 31 30 30 3e 6e 4c 69 6e 65 20 29 7b  ( n+100>nLine ){
7910: 0a 20 20 20 20 20 20 6e 4c 69 6e 65 20 3d 20 6e  .      nLine = n
7920: 4c 69 6e 65 2a 32 20 2b 20 31 30 30 3b 0a 20 20  Line*2 + 100;.  
7930: 20 20 20 20 7a 4c 69 6e 65 20 3d 20 72 65 61 6c      zLine = real
7940: 6c 6f 63 28 7a 4c 69 6e 65 2c 20 6e 4c 69 6e 65  loc(zLine, nLine
7950: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 4c 69  );.      if( zLi
7960: 6e 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ne==0 ) return 0
7970: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
7980: 66 67 65 74 73 28 26 7a 4c 69 6e 65 5b 6e 5d 2c  fgets(&zLine[n],
7990: 20 6e 4c 69 6e 65 20 2d 20 6e 2c 20 69 6e 29 3d   nLine - n, in)=
79a0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
79b0: 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  n==0 ){.        
79c0: 66 72 65 65 28 7a 4c 69 6e 65 29 3b 0a 20 20 20  free(zLine);.   
79d0: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
79e0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 4c 69       }.      zLi
79f0: 6e 65 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20  ne[n] = 0;.     
7a00: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
7a10: 20 20 77 68 69 6c 65 28 20 7a 4c 69 6e 65 5b 6e    while( zLine[n
7a20: 5d 20 29 7b 20 6e 2b 2b 3b 20 7d 0a 20 20 20 20  ] ){ n++; }.    
7a30: 69 66 28 20 6e 3e 30 20 26 26 20 7a 4c 69 6e 65  if( n>0 && zLine
7a40: 5b 6e 2d 31 5d 3d 3d 27 5c 6e 27 20 29 7b 0a 20  [n-1]=='\n' ){. 
7a50: 20 20 20 20 20 6e 2d 2d 3b 0a 20 20 20 20 20 20       n--;.      
7a60: 7a 4c 69 6e 65 5b 6e 5d 20 3d 20 30 3b 0a 20 20  zLine[n] = 0;.  
7a70: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
7a80: 0a 20 20 7d 0a 20 20 7a 4c 69 6e 65 20 3d 20 72  .  }.  zLine = r
7a90: 65 61 6c 6c 6f 63 28 20 7a 4c 69 6e 65 2c 20 6e  ealloc( zLine, n
7aa0: 2b 31 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a  +1 );.  return z
7ab0: 4c 69 6e 65 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  Line;.}.../*.** 
7ac0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
7ad0: 20 70 61 72 74 20 6f 66 20 74 68 65 20 69 6d 70   part of the imp
7ae0: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
7af0: 68 65 20 63 6f 6d 6d 61 6e 64 3a 0a 2a 2a 0a 2a  he command:.**.*
7b00: 2a 20 20 20 24 64 62 20 74 72 61 6e 73 61 63 74  *   $db transact
7b10: 69 6f 6e 20 5b 2d 64 65 66 65 72 72 65 64 7c 2d  ion [-deferred|-
7b20: 69 6d 6d 65 64 69 61 74 65 7c 2d 65 78 63 6c 75  immediate|-exclu
7b30: 73 69 76 65 5d 20 53 43 52 49 50 54 0a 2a 2a 0a  sive] SCRIPT.**.
7b40: 2a 2a 20 49 74 20 69 73 20 69 6e 76 6f 6b 65 64  ** It is invoked
7b50: 20 61 66 74 65 72 20 65 76 61 6c 75 61 74 69 6e   after evaluatin
7b60: 67 20 74 68 65 20 73 63 72 69 70 74 20 53 43 52  g the script SCR
7b70: 49 50 54 20 74 6f 20 63 6f 6d 6d 69 74 20 6f 72  IPT to commit or
7b80: 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 74 68 65   rollback.** the
7b90: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 72 20   transaction or 
7ba0: 73 61 76 65 70 6f 69 6e 74 20 6f 70 65 6e 65 64  savepoint opened
7bb0: 20 62 79 20 74 68 65 20 5b 74 72 61 6e 73 61 63   by the [transac
7bc0: 74 69 6f 6e 5d 20 63 6f 6d 6d 61 6e 64 2e 0a 2a  tion] command..*
7bd0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 44 62 54  /.static int DbT
7be0: 72 61 6e 73 50 6f 73 74 43 6d 64 28 0a 20 20 43  ransPostCmd(.  C
7bf0: 6c 69 65 6e 74 44 61 74 61 20 64 61 74 61 5b 5d  lientData data[]
7c00: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
7c10: 20 20 20 20 2f 2a 20 64 61 74 61 5b 30 5d 20 69      /* data[0] i
7c20: 73 20 74 68 65 20 53 71 6c 69 74 65 33 44 62 2a  s the Sqlite3Db*
7c30: 20 66 6f 72 20 24 64 62 20 2a 2f 0a 20 20 54 63   for $db */.  Tc
7c40: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
7c50: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
7c60: 20 20 20 2f 2a 20 54 63 6c 20 69 6e 74 65 72 70     /* Tcl interp
7c70: 72 65 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72  reter */.  int r
7c80: 65 73 75 6c 74 20 20 20 20 20 20 20 20 20 20 20  esult           
7c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ca0: 2f 2a 20 52 65 73 75 6c 74 20 6f 66 20 65 76 61  /* Result of eva
7cb0: 6c 75 61 74 69 6e 67 20 53 43 52 49 50 54 20 2a  luating SCRIPT *
7cc0: 2f 0a 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f  /.){.  static co
7cd0: 6e 73 74 20 63 68 61 72 20 2a 61 7a 45 6e 64 5b  nst char *azEnd[
7ce0: 5d 20 3d 20 7b 0a 20 20 20 20 22 52 45 4c 45 41  ] = {.    "RELEA
7cf0: 53 45 20 5f 74 63 6c 5f 74 72 61 6e 73 61 63 74  SE _tcl_transact
7d00: 69 6f 6e 22 2c 20 20 20 20 20 20 20 20 2f 2a 20  ion",        /* 
7d10: 72 63 3d 3d 54 43 4c 5f 45 52 52 4f 52 2c 20 6e  rc==TCL_ERROR, n
7d20: 54 72 61 6e 73 61 63 74 69 6f 6e 21 3d 30 20 2a  Transaction!=0 *
7d30: 2f 0a 20 20 20 20 22 43 4f 4d 4d 49 54 22 2c 20  /.    "COMMIT", 
7d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d50: 20 20 20 20 20 20 20 20 20 2f 2a 20 72 63 21 3d           /* rc!=
7d60: 54 43 4c 5f 45 52 52 4f 52 2c 20 6e 54 72 61 6e  TCL_ERROR, nTran
7d70: 73 61 63 74 69 6f 6e 3d 3d 30 20 2a 2f 0a 20 20  saction==0 */.  
7d80: 20 20 22 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 5f    "ROLLBACK TO _
7d90: 74 63 6c 5f 74 72 61 6e 73 61 63 74 69 6f 6e 20  tcl_transaction 
7da0: 3b 20 52 45 4c 45 41 53 45 20 5f 74 63 6c 5f 74  ; RELEASE _tcl_t
7db0: 72 61 6e 73 61 63 74 69 6f 6e 22 2c 0a 20 20 20  ransaction",.   
7dc0: 20 22 52 4f 4c 4c 42 41 43 4b 22 20 20 20 20 20   "ROLLBACK"     
7dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7de0: 20 20 20 20 2f 2a 20 72 63 3d 3d 54 43 4c 5f 45      /* rc==TCL_E
7df0: 52 52 4f 52 2c 20 6e 54 72 61 6e 73 61 63 74 69  RROR, nTransacti
7e00: 6f 6e 3d 3d 30 20 2a 2f 0a 20 20 7d 3b 0a 20 20  on==0 */.  };.  
7e10: 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20  SqliteDb *pDb = 
7e20: 28 53 71 6c 69 74 65 44 62 2a 29 64 61 74 61 5b  (SqliteDb*)data[
7e30: 30 5d 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 72  0];.  int rc = r
7e40: 65 73 75 6c 74 3b 0a 20 20 63 6f 6e 73 74 20 63  esult;.  const c
7e50: 68 61 72 20 2a 7a 45 6e 64 3b 0a 0a 20 20 70 44  har *zEnd;..  pD
7e60: 62 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2d  b->nTransaction-
7e70: 2d 3b 0a 20 20 7a 45 6e 64 20 3d 20 61 7a 45 6e  -;.  zEnd = azEn
7e80: 64 5b 28 72 63 3d 3d 54 43 4c 5f 45 52 52 4f 52  d[(rc==TCL_ERROR
7e90: 29 2a 32 20 2b 20 28 70 44 62 2d 3e 6e 54 72 61  )*2 + (pDb->nTra
7ea0: 6e 73 61 63 74 69 6f 6e 3d 3d 30 29 5d 3b 0a 0a  nsaction==0)];..
7eb0: 20 20 70 44 62 2d 3e 64 69 73 61 62 6c 65 41 75    pDb->disableAu
7ec0: 74 68 2b 2b 3b 0a 20 20 69 66 28 20 73 71 6c 69  th++;.  if( sqli
7ed0: 74 65 33 5f 65 78 65 63 28 70 44 62 2d 3e 64 62  te3_exec(pDb->db
7ee0: 2c 20 7a 45 6e 64 2c 20 30 2c 20 30 2c 20 30 29  , zEnd, 0, 0, 0)
7ef0: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69   ){.      /* Thi
7f00: 73 20 69 73 20 61 20 74 72 69 63 6b 79 20 73 63  s is a tricky sc
7f10: 65 6e 61 72 69 6f 20 74 6f 20 68 61 6e 64 6c 65  enario to handle
7f20: 2e 20 54 68 65 20 6d 6f 73 74 20 6c 69 6b 65 6c  . The most likel
7f30: 79 20 63 61 75 73 65 20 6f 66 20 61 6e 0a 20 20  y cause of an.  
7f40: 20 20 20 20 2a 2a 20 65 72 72 6f 72 20 69 73 20      ** error is 
7f50: 74 68 61 74 20 74 68 65 20 65 78 65 63 28 29 20  that the exec() 
7f60: 61 62 6f 76 65 20 77 61 73 20 61 6e 20 61 74 74  above was an att
7f70: 65 6d 70 74 20 74 6f 20 63 6f 6d 6d 69 74 20 74  empt to commit t
7f80: 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 74 6f 70  he .      ** top
7f90: 2d 6c 65 76 65 6c 20 74 72 61 6e 73 61 63 74 69  -level transacti
7fa0: 6f 6e 20 74 68 61 74 20 72 65 74 75 72 6e 65 64  on that returned
7fb0: 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 4f 72   SQLITE_BUSY. Or
7fc0: 2c 20 6c 65 73 73 20 6c 69 6b 65 6c 79 2c 0a 20  , less likely,. 
7fd0: 20 20 20 20 20 2a 2a 20 74 68 61 74 20 61 6e 20       ** that an 
7fe0: 49 4f 2d 65 72 72 6f 72 20 68 61 73 20 6f 63 63  IO-error has occ
7ff0: 75 72 65 64 2e 20 49 6e 20 65 69 74 68 65 72 20  ured. In either 
8000: 63 61 73 65 2c 20 74 68 72 6f 77 20 61 20 54 63  case, throw a Tc
8010: 6c 20 65 78 63 65 70 74 69 6f 6e 0a 20 20 20 20  l exception.    
8020: 20 20 2a 2a 20 61 6e 64 20 74 72 79 20 74 6f 20    ** and try to 
8030: 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 74 72 61  rollback the tra
8040: 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20  nsaction..      
8050: 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 42 75 74 20  **.      ** But 
8060: 69 74 20 63 6f 75 6c 64 20 61 6c 73 6f 20 62 65  it could also be
8070: 20 74 68 61 74 20 74 68 65 20 75 73 65 72 20 65   that the user e
8080: 78 65 63 75 74 65 64 20 6f 6e 65 20 6f 72 20 6d  xecuted one or m
8090: 6f 72 65 20 42 45 47 49 4e 2c 20 0a 20 20 20 20  ore BEGIN, .    
80a0: 20 20 2a 2a 20 43 4f 4d 4d 49 54 2c 20 53 41 56    ** COMMIT, SAV
80b0: 45 50 4f 49 4e 54 2c 20 52 45 4c 45 41 53 45 20  EPOINT, RELEASE 
80c0: 6f 72 20 52 4f 4c 4c 42 41 43 4b 20 63 6f 6d 6d  or ROLLBACK comm
80d0: 61 6e 64 73 20 74 68 61 74 20 61 72 65 20 63 6f  ands that are co
80e0: 6e 66 75 73 69 6e 67 0a 20 20 20 20 20 20 2a 2a  nfusing.      **
80f0: 20 74 68 69 73 20 6d 65 74 68 6f 64 27 73 20 6c   this method's l
8100: 6f 67 69 63 2e 20 4e 6f 74 20 63 6c 65 61 72 20  ogic. Not clear 
8110: 68 6f 77 20 74 68 69 73 20 77 6f 75 6c 64 20 62  how this would b
8120: 65 20 62 65 73 74 20 68 61 6e 64 6c 65 64 2e 0a  e best handled..
8130: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28        */.    if(
8140: 20 72 63 21 3d 54 43 4c 5f 45 52 52 4f 52 20 29   rc!=TCL_ERROR )
8150: 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65  {.      Tcl_Appe
8160: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
8170: 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
8180: 70 44 62 2d 3e 64 62 29 2c 20 30 29 3b 0a 20 20  pDb->db), 0);.  
8190: 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45 52 52      rc = TCL_ERR
81a0: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  OR;.    }.    sq
81b0: 6c 69 74 65 33 5f 65 78 65 63 28 70 44 62 2d 3e  lite3_exec(pDb->
81c0: 64 62 2c 20 22 52 4f 4c 4c 42 41 43 4b 22 2c 20  db, "ROLLBACK", 
81d0: 30 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  0, 0, 0);.  }.  
81e0: 70 44 62 2d 3e 64 69 73 61 62 6c 65 41 75 74 68  pDb->disableAuth
81f0: 2d 2d 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 63  --;..  return rc
8200: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 65 73  ;.}../*.** Unles
8210: 73 20 53 51 4c 49 54 45 5f 54 45 53 54 20 69 73  s SQLITE_TEST is
8220: 20 64 65 66 69 6e 65 64 2c 20 74 68 69 73 20 66   defined, this f
8230: 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 73 69 6d  unction is a sim
8240: 70 6c 65 20 77 72 61 70 70 65 72 20 61 72 6f 75  ple wrapper arou
8250: 6e 64 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 70 72  nd.** sqlite3_pr
8260: 65 70 61 72 65 5f 76 32 28 29 2e 20 49 66 20 53  epare_v2(). If S
8270: 51 4c 49 54 45 5f 54 45 53 54 20 69 73 20 64 65  QLITE_TEST is de
8280: 66 69 6e 65 64 2c 20 74 68 65 6e 20 69 74 20 75  fined, then it u
8290: 73 65 73 20 65 69 74 68 65 72 0a 2a 2a 20 73 71  ses either.** sq
82a0: 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
82b0: 28 29 20 6f 72 20 6c 65 67 61 63 79 20 69 6e 74  () or legacy int
82c0: 65 72 66 61 63 65 20 73 71 6c 69 74 65 33 5f 70  erface sqlite3_p
82d0: 72 65 70 61 72 65 28 29 2c 20 64 65 70 65 6e 64  repare(), depend
82e0: 69 6e 67 0a 2a 2a 20 6f 6e 20 77 68 65 74 68 65  ing.** on whethe
82f0: 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 5b 64 62  r or not the [db
8300: 5f 75 73 65 5f 6c 65 67 61 63 79 5f 70 72 65 70  _use_legacy_prep
8310: 61 72 65 5d 20 63 6f 6d 6d 61 6e 64 20 68 61 73  are] command has
8320: 20 62 65 65 6e 20 75 73 65 64 20 74 6f 20 0a 2a   been used to .*
8330: 2a 20 63 6f 6e 66 69 67 75 72 65 20 74 68 65 20  * configure the 
8340: 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  connection..*/.s
8350: 74 61 74 69 63 20 69 6e 74 20 64 62 50 72 65 70  tatic int dbPrep
8360: 61 72 65 28 0a 20 20 53 71 6c 69 74 65 44 62 20  are(.  SqliteDb 
8370: 2a 70 44 62 2c 20 20 20 20 20 20 20 20 20 20 20  *pDb,           
8380: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
8390: 73 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63  se object */.  c
83a0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 2c  onst char *zSql,
83b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
83c0: 2a 20 53 51 4c 20 74 6f 20 63 6f 6d 70 69 6c 65  * SQL to compile
83d0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74   */.  sqlite3_st
83e0: 6d 74 20 2a 2a 70 70 53 74 6d 74 2c 20 20 20 20  mt **ppStmt,    
83f0: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 50 72        /* OUT: Pr
8400: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
8410: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
8420: 20 2a 2a 70 7a 4f 75 74 20 20 20 20 20 20 20 20   **pzOut        
8430: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 50 6f        /* OUT: Po
8440: 69 6e 74 65 72 20 74 6f 20 6e 65 78 74 20 53 51  inter to next SQ
8450: 4c 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 29  L statement */.)
8460: 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
8470: 54 45 53 54 0a 20 20 69 66 28 20 70 44 62 2d 3e  TEST.  if( pDb->
8480: 62 4c 65 67 61 63 79 50 72 65 70 61 72 65 20 29  bLegacyPrepare )
8490: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c  {.    return sql
84a0: 69 74 65 33 5f 70 72 65 70 61 72 65 28 70 44 62  ite3_prepare(pDb
84b0: 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20  ->db, zSql, -1, 
84c0: 70 70 53 74 6d 74 2c 20 70 7a 4f 75 74 29 3b 0a  ppStmt, pzOut);.
84d0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74    }.#endif.  ret
84e0: 75 72 6e 20 73 71 6c 69 74 65 33 5f 70 72 65 70  urn sqlite3_prep
84f0: 61 72 65 5f 76 32 28 70 44 62 2d 3e 64 62 2c 20  are_v2(pDb->db, 
8500: 7a 53 71 6c 2c 20 2d 31 2c 20 70 70 53 74 6d 74  zSql, -1, ppStmt
8510: 2c 20 70 7a 4f 75 74 29 3b 0a 7d 0a 0a 2f 2a 0a  , pzOut);.}../*.
8520: 2a 2a 20 53 65 61 72 63 68 20 74 68 65 20 63 61  ** Search the ca
8530: 63 68 65 20 66 6f 72 20 61 20 70 72 65 70 61 72  che for a prepar
8540: 65 64 2d 73 74 61 74 65 6d 65 6e 74 20 6f 62 6a  ed-statement obj
8550: 65 63 74 20 74 68 61 74 20 69 6d 70 6c 65 6d 65  ect that impleme
8560: 6e 74 73 20 74 68 65 0a 2a 2a 20 66 69 72 73 74  nts the.** first
8570: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 69   SQL statement i
8580: 6e 20 74 68 65 20 62 75 66 66 65 72 20 70 6f 69  n the buffer poi
8590: 6e 74 65 64 20 74 6f 20 62 79 20 70 61 72 61 6d  nted to by param
85a0: 65 74 65 72 20 7a 49 6e 2e 20 49 66 0a 2a 2a 20  eter zIn. If.** 
85b0: 6e 6f 20 73 75 63 68 20 70 72 65 70 61 72 65 64  no such prepared
85c0: 2d 73 74 61 74 65 6d 65 6e 74 20 63 61 6e 20 62  -statement can b
85d0: 65 20 66 6f 75 6e 64 2c 20 61 6c 6c 6f 63 61 74  e found, allocat
85e0: 65 20 61 6e 64 20 70 72 65 70 61 72 65 20 61 20  e and prepare a 
85f0: 6e 65 77 0a 2a 2a 20 6f 6e 65 2e 20 49 6e 20 65  new.** one. In e
8600: 69 74 68 65 72 20 63 61 73 65 2c 20 62 69 6e 64  ither case, bind
8610: 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c   the current val
8620: 75 65 73 20 6f 66 20 74 68 65 20 72 65 6c 65 76  ues of the relev
8630: 61 6e 74 20 54 63 6c 0a 2a 2a 20 76 61 72 69 61  ant Tcl.** varia
8640: 62 6c 65 73 20 74 6f 20 61 6e 79 20 24 76 61 72  bles to any $var
8650: 2c 20 3a 76 61 72 20 6f 72 20 40 76 61 72 20 76  , :var or @var v
8660: 61 72 69 61 62 6c 65 73 20 69 6e 20 74 68 65 20  ariables in the 
8670: 73 74 61 74 65 6d 65 6e 74 2e 20 42 65 66 6f 72  statement. Befor
8680: 65 0a 2a 2a 20 72 65 74 75 72 6e 69 6e 67 2c 20  e.** returning, 
8690: 73 65 74 20 2a 70 70 50 72 65 53 74 6d 74 20 74  set *ppPreStmt t
86a0: 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 70  o point to the p
86b0: 72 65 70 61 72 65 64 2d 73 74 61 74 65 6d 65 6e  repared-statemen
86c0: 74 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20  t object..**.** 
86d0: 4f 75 74 70 75 74 20 70 61 72 61 6d 65 74 65 72  Output parameter
86e0: 20 2a 70 7a 4f 75 74 20 69 73 20 73 65 74 20 74   *pzOut is set t
86f0: 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e  o point to the n
8700: 65 78 74 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  ext SQL statemen
8710: 74 20 69 6e 0a 2a 2a 20 62 75 66 66 65 72 20 7a  t in.** buffer z
8720: 49 6e 2c 20 6f 72 20 74 6f 20 74 68 65 20 27 5c  In, or to the '\
8730: 30 27 20 62 79 74 65 20 61 74 20 74 68 65 20 65  0' byte at the e
8740: 6e 64 20 6f 66 20 7a 49 6e 20 69 66 20 74 68 65  nd of zIn if the
8750: 72 65 20 69 73 20 6e 6f 0a 2a 2a 20 6e 65 78 74  re is no.** next
8760: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a   statement..**.*
8770: 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * If successful,
8780: 20 54 43 4c 5f 4f 4b 20 69 73 20 72 65 74 75 72   TCL_OK is retur
8790: 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ned. Otherwise, 
87a0: 54 43 4c 5f 45 52 52 4f 52 20 69 73 20 72 65 74  TCL_ERROR is ret
87b0: 75 72 6e 65 64 0a 2a 2a 20 61 6e 64 20 61 6e 20  urned.** and an 
87c0: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 6c 6f  error message lo
87d0: 61 64 65 64 20 69 6e 74 6f 20 69 6e 74 65 72 70  aded into interp
87e0: 72 65 74 65 72 20 70 44 62 2d 3e 69 6e 74 65 72  reter pDb->inter
87f0: 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  p..*/.static int
8800: 20 64 62 50 72 65 70 61 72 65 41 6e 64 42 69 6e   dbPrepareAndBin
8810: 64 28 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70  d(.  SqliteDb *p
8820: 44 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Db,             
8830: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
8840: 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 68 61   object */.  cha
8850: 72 20 63 6f 6e 73 74 20 2a 7a 49 6e 2c 20 20 20  r const *zIn,   
8860: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8870: 53 51 4c 20 74 6f 20 63 6f 6d 70 69 6c 65 20 2a  SQL to compile *
8880: 2f 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a  /.  char const *
8890: 2a 70 7a 4f 75 74 2c 20 20 20 20 20 20 20 20 20  *pzOut,         
88a0: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 50 6f 69 6e      /* OUT: Poin
88b0: 74 65 72 20 74 6f 20 6e 65 78 74 20 53 51 4c 20  ter to next SQL 
88c0: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 53  statement */.  S
88d0: 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74 20 2a  qlPreparedStmt *
88e0: 2a 70 70 50 72 65 53 74 6d 74 20 20 20 20 20 2f  *ppPreStmt     /
88f0: 2a 20 4f 55 54 3a 20 4f 62 6a 65 63 74 20 75 73  * OUT: Object us
8900: 65 64 20 74 6f 20 63 61 63 68 65 20 73 74 61 74  ed to cache stat
8910: 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 63 6f  ement */.){.  co
8920: 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d  nst char *zSql =
8930: 20 7a 49 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a   zIn;         /*
8940: 20 50 6f 69 6e 74 65 72 20 74 6f 20 66 69 72 73   Pointer to firs
8950: 74 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  t SQL statement 
8960: 69 6e 20 7a 49 6e 20 2a 2f 0a 20 20 73 71 6c 69  in zIn */.  sqli
8970: 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
8980: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
8990: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
89a0: 74 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 53 71  t object */.  Sq
89b0: 6c 50 72 65 70 61 72 65 64 53 74 6d 74 20 2a 70  lPreparedStmt *p
89c0: 50 72 65 53 74 6d 74 3b 20 20 20 20 20 20 2f 2a  PreStmt;      /*
89d0: 20 50 6f 69 6e 74 65 72 20 74 6f 20 63 61 63 68   Pointer to cach
89e0: 65 64 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  ed statement */.
89f0: 20 20 69 6e 74 20 6e 53 71 6c 3b 20 20 20 20 20    int nSql;     
8a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8a10: 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 7a    /* Length of z
8a20: 53 71 6c 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  Sql in bytes */.
8a30: 20 20 69 6e 74 20 6e 56 61 72 3b 20 20 20 20 20    int nVar;     
8a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8a50: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 76    /* Number of v
8a60: 61 72 69 61 62 6c 65 73 20 69 6e 20 73 74 61 74  ariables in stat
8a70: 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69  ement */.  int i
8a80: 50 61 72 6d 20 3d 20 30 3b 20 20 20 20 20 20 20  Parm = 0;       
8a90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
8aa0: 78 74 20 66 72 65 65 20 65 6e 74 72 79 20 69 6e  xt free entry in
8ab0: 20 61 70 50 61 72 6d 20 2a 2f 0a 20 20 69 6e 74   apParm */.  int
8ac0: 20 69 3b 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70   i;.  Tcl_Interp
8ad0: 20 2a 69 6e 74 65 72 70 20 3d 20 70 44 62 2d 3e   *interp = pDb->
8ae0: 69 6e 74 65 72 70 3b 0a 0a 20 20 2a 70 70 50 72  interp;..  *ppPr
8af0: 65 53 74 6d 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a  eStmt = 0;..  /*
8b00: 20 54 72 69 6d 20 73 70 61 63 65 73 20 66 72 6f   Trim spaces fro
8b10: 6d 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 7a  m the start of z
8b20: 53 71 6c 20 61 6e 64 20 63 61 6c 63 75 6c 61 74  Sql and calculat
8b30: 65 20 74 68 65 20 72 65 6d 61 69 6e 69 6e 67 20  e the remaining 
8b40: 6c 65 6e 67 74 68 2e 20 2a 2f 0a 20 20 77 68 69  length. */.  whi
8b50: 6c 65 28 20 69 73 73 70 61 63 65 28 7a 53 71 6c  le( isspace(zSql
8b60: 5b 30 5d 29 20 29 7b 20 7a 53 71 6c 2b 2b 3b 20  [0]) ){ zSql++; 
8b70: 7d 0a 20 20 6e 53 71 6c 20 3d 20 73 74 72 6c 65  }.  nSql = strle
8b80: 6e 33 30 28 7a 53 71 6c 29 3b 0a 0a 20 20 66 6f  n30(zSql);..  fo
8b90: 72 28 70 50 72 65 53 74 6d 74 20 3d 20 70 44 62  r(pPreStmt = pDb
8ba0: 2d 3e 73 74 6d 74 4c 69 73 74 3b 20 70 50 72 65  ->stmtList; pPre
8bb0: 53 74 6d 74 3b 20 70 50 72 65 53 74 6d 74 3d 70  Stmt; pPreStmt=p
8bc0: 50 72 65 53 74 6d 74 2d 3e 70 4e 65 78 74 29 7b  PreStmt->pNext){
8bd0: 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 50 72  .    int n = pPr
8be0: 65 53 74 6d 74 2d 3e 6e 53 71 6c 3b 0a 20 20 20  eStmt->nSql;.   
8bf0: 20 69 66 28 20 6e 53 71 6c 3e 3d 6e 20 0a 20 20   if( nSql>=n .  
8c00: 20 20 20 20 20 20 26 26 20 6d 65 6d 63 6d 70 28        && memcmp(
8c10: 70 50 72 65 53 74 6d 74 2d 3e 7a 53 71 6c 2c 20  pPreStmt->zSql, 
8c20: 7a 53 71 6c 2c 20 6e 29 3d 3d 30 0a 20 20 20 20  zSql, n)==0.    
8c30: 20 20 20 20 26 26 20 28 7a 53 71 6c 5b 6e 5d 3d      && (zSql[n]=
8c40: 3d 30 20 7c 7c 20 7a 53 71 6c 5b 6e 2d 31 5d 3d  =0 || zSql[n-1]=
8c50: 3d 27 3b 27 29 0a 20 20 20 20 29 7b 0a 20 20 20  =';').    ){.   
8c60: 20 20 20 70 53 74 6d 74 20 3d 20 70 50 72 65 53     pStmt = pPreS
8c70: 74 6d 74 2d 3e 70 53 74 6d 74 3b 0a 20 20 20 20  tmt->pStmt;.    
8c80: 20 20 2a 70 7a 4f 75 74 20 3d 20 26 7a 53 71 6c    *pzOut = &zSql
8c90: 5b 70 50 72 65 53 74 6d 74 2d 3e 6e 53 71 6c 5d  [pPreStmt->nSql]
8ca0: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57 68 65 6e  ;..      /* When
8cb0: 20 61 20 70 72 65 70 61 72 65 64 20 73 74 61 74   a prepared stat
8cc0: 65 6d 65 6e 74 20 69 73 20 66 6f 75 6e 64 2c 20  ement is found, 
8cd0: 75 6e 6c 69 6e 6b 20 69 74 20 66 72 6f 6d 20 74  unlink it from t
8ce0: 68 65 0a 20 20 20 20 20 20 2a 2a 20 63 61 63 68  he.      ** cach
8cf0: 65 20 6c 69 73 74 2e 20 20 49 74 20 77 69 6c 6c  e list.  It will
8d00: 20 6c 61 74 65 72 20 62 65 20 61 64 64 65 64 20   later be added 
8d10: 62 61 63 6b 20 74 6f 20 74 68 65 20 62 65 67 69  back to the begi
8d20: 6e 6e 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 6f  nning.      ** o
8d30: 66 20 74 68 65 20 63 61 63 68 65 20 6c 69 73 74  f the cache list
8d40: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6d 70   in order to imp
8d50: 6c 65 6d 65 6e 74 20 4c 52 55 20 72 65 70 6c 61  lement LRU repla
8d60: 63 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f  cement..      */
8d70: 0a 20 20 20 20 20 20 69 66 28 20 70 50 72 65 53  .      if( pPreS
8d80: 74 6d 74 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20  tmt->pPrev ){.  
8d90: 20 20 20 20 20 20 70 50 72 65 53 74 6d 74 2d 3e        pPreStmt->
8da0: 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70  pPrev->pNext = p
8db0: 50 72 65 53 74 6d 74 2d 3e 70 4e 65 78 74 3b 0a  PreStmt->pNext;.
8dc0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
8dd0: 20 20 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c 69       pDb->stmtLi
8de0: 73 74 20 3d 20 70 50 72 65 53 74 6d 74 2d 3e 70  st = pPreStmt->p
8df0: 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Next;.      }.  
8e00: 20 20 20 20 69 66 28 20 70 50 72 65 53 74 6d 74      if( pPreStmt
8e10: 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20  ->pNext ){.     
8e20: 20 20 20 70 50 72 65 53 74 6d 74 2d 3e 70 4e 65     pPreStmt->pNe
8e30: 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 50 72 65  xt->pPrev = pPre
8e40: 53 74 6d 74 2d 3e 70 50 72 65 76 3b 0a 20 20 20  Stmt->pPrev;.   
8e50: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
8e60: 20 20 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74 20    pDb->stmtLast 
8e70: 3d 20 70 50 72 65 53 74 6d 74 2d 3e 70 50 72 65  = pPreStmt->pPre
8e80: 76 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  v;.      }.     
8e90: 20 70 44 62 2d 3e 6e 53 74 6d 74 2d 2d 3b 0a 20   pDb->nStmt--;. 
8ea0: 20 20 20 20 20 6e 56 61 72 20 3d 20 73 71 6c 69       nVar = sqli
8eb0: 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74  te3_bind_paramet
8ec0: 65 72 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29 3b  er_count(pStmt);
8ed0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
8ee0: 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20    }.  }.  .  /* 
8ef0: 49 66 20 6e 6f 20 70 72 65 70 61 72 65 64 20 73  If no prepared s
8f00: 74 61 74 65 6d 65 6e 74 20 77 61 73 20 66 6f 75  tatement was fou
8f10: 6e 64 2e 20 43 6f 6d 70 69 6c 65 20 74 68 65 20  nd. Compile the 
8f20: 53 51 4c 20 74 65 78 74 2e 20 41 6c 73 6f 20 61  SQL text. Also a
8f30: 6c 6c 6f 63 61 74 65 0a 20 20 2a 2a 20 61 20 6e  llocate.  ** a n
8f40: 65 77 20 53 71 6c 50 72 65 70 61 72 65 64 53 74  ew SqlPreparedSt
8f50: 6d 74 20 73 74 72 75 63 74 75 72 65 2e 20 20 2a  mt structure.  *
8f60: 2f 0a 20 20 69 66 28 20 70 50 72 65 53 74 6d 74  /.  if( pPreStmt
8f70: 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e  ==0 ){.    int n
8f80: 42 79 74 65 3b 0a 0a 20 20 20 20 69 66 28 20 53  Byte;..    if( S
8f90: 51 4c 49 54 45 5f 4f 4b 21 3d 64 62 50 72 65 70  QLITE_OK!=dbPrep
8fa0: 61 72 65 28 70 44 62 2c 20 7a 53 71 6c 2c 20 26  are(pDb, zSql, &
8fb0: 70 53 74 6d 74 2c 20 70 7a 4f 75 74 29 20 29 7b  pStmt, pzOut) ){
8fc0: 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62  .      Tcl_SetOb
8fd0: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
8fe0: 64 62 54 65 78 74 54 6f 4f 62 6a 28 73 71 6c 69  dbTextToObj(sqli
8ff0: 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e  te3_errmsg(pDb->
9000: 64 62 29 29 29 3b 0a 20 20 20 20 20 20 72 65 74  db)));.      ret
9010: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
9020: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 53 74     }.    if( pSt
9030: 6d 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  mt==0 ){.      i
9040: 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71  f( SQLITE_OK!=sq
9050: 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28 70 44  lite3_errcode(pD
9060: 62 2d 3e 64 62 29 20 29 7b 0a 20 20 20 20 20 20  b->db) ){.      
9070: 20 20 2f 2a 20 41 20 63 6f 6d 70 69 6c 65 2d 74    /* A compile-t
9080: 69 6d 65 20 65 72 72 6f 72 20 69 6e 20 74 68 65  ime error in the
9090: 20 73 74 61 74 65 6d 65 6e 74 2e 20 2a 2f 0a 20   statement. */. 
90a0: 20 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62         Tcl_SetOb
90b0: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
90c0: 64 62 54 65 78 74 54 6f 4f 62 6a 28 73 71 6c 69  dbTextToObj(sqli
90d0: 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e  te3_errmsg(pDb->
90e0: 64 62 29 29 29 3b 0a 20 20 20 20 20 20 20 20 72  db)));.        r
90f0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
9100: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
9110: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 74 61        /* The sta
9120: 74 65 6d 65 6e 74 20 77 61 73 20 61 20 6e 6f 2d  tement was a no-
9130: 6f 70 2e 20 20 43 6f 6e 74 69 6e 75 65 20 74 6f  op.  Continue to
9140: 20 74 68 65 20 6e 65 78 74 20 73 74 61 74 65 6d   the next statem
9150: 65 6e 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  ent.        ** i
9160: 6e 20 74 68 65 20 53 51 4c 20 73 74 72 69 6e 67  n the SQL string
9170: 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
9180: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
9190: 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OK;.      }.    
91a0: 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  }..    assert( p
91b0: 50 72 65 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20  PreStmt==0 );.  
91c0: 20 20 6e 56 61 72 20 3d 20 73 71 6c 69 74 65 33    nVar = sqlite3
91d0: 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f  _bind_parameter_
91e0: 63 6f 75 6e 74 28 70 53 74 6d 74 29 3b 0a 20 20  count(pStmt);.  
91f0: 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66    nByte = sizeof
9200: 28 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74  (SqlPreparedStmt
9210: 29 20 2b 20 6e 56 61 72 2a 73 69 7a 65 6f 66 28  ) + nVar*sizeof(
9220: 54 63 6c 5f 4f 62 6a 20 2a 29 3b 0a 20 20 20 20  Tcl_Obj *);.    
9230: 70 50 72 65 53 74 6d 74 20 3d 20 28 53 71 6c 50  pPreStmt = (SqlP
9240: 72 65 70 61 72 65 64 53 74 6d 74 2a 29 54 63 6c  reparedStmt*)Tcl
9250: 5f 41 6c 6c 6f 63 28 6e 42 79 74 65 29 3b 0a 20  _Alloc(nByte);. 
9260: 20 20 20 6d 65 6d 73 65 74 28 70 50 72 65 53 74     memset(pPreSt
9270: 6d 74 2c 20 30 2c 20 6e 42 79 74 65 29 3b 0a 0a  mt, 0, nByte);..
9280: 20 20 20 20 70 50 72 65 53 74 6d 74 2d 3e 70 53      pPreStmt->pS
9290: 74 6d 74 20 3d 20 70 53 74 6d 74 3b 0a 20 20 20  tmt = pStmt;.   
92a0: 20 70 50 72 65 53 74 6d 74 2d 3e 6e 53 71 6c 20   pPreStmt->nSql 
92b0: 3d 20 28 2a 70 7a 4f 75 74 20 2d 20 7a 53 71 6c  = (*pzOut - zSql
92c0: 29 3b 0a 20 20 20 20 70 50 72 65 53 74 6d 74 2d  );.    pPreStmt-
92d0: 3e 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f  >zSql = sqlite3_
92e0: 73 71 6c 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  sql(pStmt);.    
92f0: 70 50 72 65 53 74 6d 74 2d 3e 61 70 50 61 72 6d  pPreStmt->apParm
9300: 20 3d 20 28 54 63 6c 5f 4f 62 6a 20 2a 2a 29 26   = (Tcl_Obj **)&
9310: 70 50 72 65 53 74 6d 74 5b 31 5d 3b 0a 23 69 66  pPreStmt[1];.#if
9320: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
9330: 20 20 20 20 69 66 28 20 70 50 72 65 53 74 6d 74      if( pPreStmt
9340: 2d 3e 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20  ->zSql==0 ){.   
9350: 20 20 20 63 68 61 72 20 2a 7a 43 6f 70 79 20 3d     char *zCopy =
9360: 20 54 63 6c 5f 41 6c 6c 6f 63 28 70 50 72 65 53   Tcl_Alloc(pPreS
9370: 74 6d 74 2d 3e 6e 53 71 6c 20 2b 20 31 29 3b 0a  tmt->nSql + 1);.
9380: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 43 6f        memcpy(zCo
9390: 70 79 2c 20 7a 53 71 6c 2c 20 70 50 72 65 53 74  py, zSql, pPreSt
93a0: 6d 74 2d 3e 6e 53 71 6c 29 3b 0a 20 20 20 20 20  mt->nSql);.     
93b0: 20 7a 43 6f 70 79 5b 70 50 72 65 53 74 6d 74 2d   zCopy[pPreStmt-
93c0: 3e 6e 53 71 6c 5d 20 3d 20 27 5c 30 27 3b 0a 20  >nSql] = '\0';. 
93d0: 20 20 20 20 20 70 50 72 65 53 74 6d 74 2d 3e 7a       pPreStmt->z
93e0: 53 71 6c 20 3d 20 7a 43 6f 70 79 3b 0a 20 20 20  Sql = zCopy;.   
93f0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20   }.#endif.  }.  
9400: 61 73 73 65 72 74 28 20 70 50 72 65 53 74 6d 74  assert( pPreStmt
9410: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 74   );.  assert( st
9420: 72 6c 65 6e 33 30 28 70 50 72 65 53 74 6d 74 2d  rlen30(pPreStmt-
9430: 3e 7a 53 71 6c 29 3d 3d 70 50 72 65 53 74 6d 74  >zSql)==pPreStmt
9440: 2d 3e 6e 53 71 6c 20 29 3b 0a 20 20 61 73 73 65  ->nSql );.  asse
9450: 72 74 28 20 30 3d 3d 6d 65 6d 63 6d 70 28 70 50  rt( 0==memcmp(pP
9460: 72 65 53 74 6d 74 2d 3e 7a 53 71 6c 2c 20 7a 53  reStmt->zSql, zS
9470: 71 6c 2c 20 70 50 72 65 53 74 6d 74 2d 3e 6e 53  ql, pPreStmt->nS
9480: 71 6c 29 20 29 3b 0a 0a 20 20 2f 2a 20 42 69 6e  ql) );..  /* Bin
9490: 64 20 76 61 6c 75 65 73 20 74 6f 20 70 61 72 61  d values to para
94a0: 6d 65 74 65 72 73 20 74 68 61 74 20 62 65 67 69  meters that begi
94b0: 6e 20 77 69 74 68 20 24 20 6f 72 20 3a 20 2a 2f  n with $ or : */
94c0: 20 20 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c    .  for(i=1; i<
94d0: 3d 6e 56 61 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  =nVar; i++){.   
94e0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 61   const char *zVa
94f0: 72 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  r = sqlite3_bind
9500: 5f 70 61 72 61 6d 65 74 65 72 5f 6e 61 6d 65 28  _parameter_name(
9510: 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 69  pStmt, i);.    i
9520: 66 28 20 7a 56 61 72 21 3d 30 20 26 26 20 28 7a  f( zVar!=0 && (z
9530: 56 61 72 5b 30 5d 3d 3d 27 24 27 20 7c 7c 20 7a  Var[0]=='$' || z
9540: 56 61 72 5b 30 5d 3d 3d 27 3a 27 20 7c 7c 20 7a  Var[0]==':' || z
9550: 56 61 72 5b 30 5d 3d 3d 27 40 27 29 20 29 7b 0a  Var[0]=='@') ){.
9560: 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70        Tcl_Obj *p
9570: 56 61 72 20 3d 20 54 63 6c 5f 47 65 74 56 61 72  Var = Tcl_GetVar
9580: 32 45 78 28 69 6e 74 65 72 70 2c 20 26 7a 56 61  2Ex(interp, &zVa
9590: 72 5b 31 5d 2c 20 30 2c 20 30 29 3b 0a 20 20 20  r[1], 0, 0);.   
95a0: 20 20 20 69 66 28 20 70 56 61 72 20 29 7b 0a 20     if( pVar ){. 
95b0: 20 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20         int n;.  
95c0: 20 20 20 20 20 20 75 38 20 2a 64 61 74 61 3b 0a        u8 *data;.
95d0: 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
95e0: 61 72 20 2a 7a 54 79 70 65 20 3d 20 28 70 56 61  ar *zType = (pVa
95f0: 72 2d 3e 74 79 70 65 50 74 72 20 3f 20 70 56 61  r->typePtr ? pVa
9600: 72 2d 3e 74 79 70 65 50 74 72 2d 3e 6e 61 6d 65  r->typePtr->name
9610: 20 3a 20 22 22 29 3b 0a 20 20 20 20 20 20 20 20   : "");.        
9620: 63 68 61 72 20 63 20 3d 20 7a 54 79 70 65 5b 30  char c = zType[0
9630: 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a  ];.        if( z
9640: 56 61 72 5b 30 5d 3d 3d 27 40 27 20 7c 7c 0a 20  Var[0]=='@' ||. 
9650: 20 20 20 20 20 20 20 20 20 20 28 63 3d 3d 27 62            (c=='b
9660: 27 20 26 26 20 73 74 72 63 6d 70 28 7a 54 79 70  ' && strcmp(zTyp
9670: 65 2c 22 62 79 74 65 61 72 72 61 79 22 29 3d 3d  e,"bytearray")==
9680: 30 20 26 26 20 70 56 61 72 2d 3e 62 79 74 65 73  0 && pVar->bytes
9690: 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ==0) ){.        
96a0: 20 20 2f 2a 20 4c 6f 61 64 20 61 20 42 4c 4f 42    /* Load a BLOB
96b0: 20 74 79 70 65 20 69 66 20 74 68 65 20 54 63 6c   type if the Tcl
96c0: 20 76 61 72 69 61 62 6c 65 20 69 73 20 61 20 62   variable is a b
96d0: 79 74 65 61 72 72 61 79 20 61 6e 64 0a 20 20 20  ytearray and.   
96e0: 20 20 20 20 20 20 20 2a 2a 20 69 74 20 68 61 73         ** it has
96f0: 20 6e 6f 20 73 74 72 69 6e 67 20 72 65 70 72 65   no string repre
9700: 73 65 6e 74 61 74 69 6f 6e 20 6f 72 20 74 68 65  sentation or the
9710: 20 68 6f 73 74 0a 20 20 20 20 20 20 20 20 20 20   host.          
9720: 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 6e 61 6d  ** parameter nam
9730: 65 20 62 65 67 69 6e 73 20 77 69 74 68 20 22 40  e begins with "@
9740: 22 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ". */.          
9750: 64 61 74 61 20 3d 20 54 63 6c 5f 47 65 74 42 79  data = Tcl_GetBy
9760: 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 70  teArrayFromObj(p
9770: 56 61 72 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20  Var, &n);.      
9780: 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
9790: 5f 62 6c 6f 62 28 70 53 74 6d 74 2c 20 69 2c 20  _blob(pStmt, i, 
97a0: 64 61 74 61 2c 20 6e 2c 20 53 51 4c 49 54 45 5f  data, n, SQLITE_
97b0: 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 20  STATIC);.       
97c0: 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f     Tcl_IncrRefCo
97d0: 75 6e 74 28 70 56 61 72 29 3b 0a 20 20 20 20 20  unt(pVar);.     
97e0: 20 20 20 20 20 70 50 72 65 53 74 6d 74 2d 3e 61       pPreStmt->a
97f0: 70 50 61 72 6d 5b 69 50 61 72 6d 2b 2b 5d 20 3d  pParm[iParm++] =
9800: 20 70 56 61 72 3b 0a 20 20 20 20 20 20 20 20 7d   pVar;.        }
9810: 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 62 27 20  else if( c=='b' 
9820: 26 26 20 73 74 72 63 6d 70 28 7a 54 79 70 65 2c  && strcmp(zType,
9830: 22 62 6f 6f 6c 65 61 6e 22 29 3d 3d 30 20 29 7b  "boolean")==0 ){
9840: 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 47  .          Tcl_G
9850: 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
9860: 65 72 70 2c 20 70 56 61 72 2c 20 26 6e 29 3b 0a  erp, pVar, &n);.
9870: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
9880: 33 5f 62 69 6e 64 5f 69 6e 74 28 70 53 74 6d 74  3_bind_int(pStmt
9890: 2c 20 69 2c 20 6e 29 3b 0a 20 20 20 20 20 20 20  , i, n);.       
98a0: 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 64   }else if( c=='d
98b0: 27 20 26 26 20 73 74 72 63 6d 70 28 7a 54 79 70  ' && strcmp(zTyp
98c0: 65 2c 22 64 6f 75 62 6c 65 22 29 3d 3d 30 20 29  e,"double")==0 )
98d0: 7b 0a 20 20 20 20 20 20 20 20 20 20 64 6f 75 62  {.          doub
98e0: 6c 65 20 72 3b 0a 20 20 20 20 20 20 20 20 20 20  le r;.          
98f0: 54 63 6c 5f 47 65 74 44 6f 75 62 6c 65 46 72 6f  Tcl_GetDoubleFro
9900: 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 70 56 61  mObj(interp, pVa
9910: 72 2c 20 26 72 29 3b 0a 20 20 20 20 20 20 20 20  r, &r);.        
9920: 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 64    sqlite3_bind_d
9930: 6f 75 62 6c 65 28 70 53 74 6d 74 2c 20 69 2c 20  ouble(pStmt, i, 
9940: 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  r);.        }els
9950: 65 20 69 66 28 20 28 63 3d 3d 27 77 27 20 26 26  e if( (c=='w' &&
9960: 20 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22 77   strcmp(zType,"w
9970: 69 64 65 49 6e 74 22 29 3d 3d 30 29 20 7c 7c 0a  ideInt")==0) ||.
9980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
9990: 3d 3d 27 69 27 20 26 26 20 73 74 72 63 6d 70 28  =='i' && strcmp(
99a0: 7a 54 79 70 65 2c 22 69 6e 74 22 29 3d 3d 30 29  zType,"int")==0)
99b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54 63   ){.          Tc
99c0: 6c 5f 57 69 64 65 49 6e 74 20 76 3b 0a 20 20 20  l_WideInt v;.   
99d0: 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 57 69         Tcl_GetWi
99e0: 64 65 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  deIntFromObj(int
99f0: 65 72 70 2c 20 70 56 61 72 2c 20 26 76 29 3b 0a  erp, pVar, &v);.
9a00: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
9a10: 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 53 74  3_bind_int64(pSt
9a20: 6d 74 2c 20 69 2c 20 76 29 3b 0a 20 20 20 20 20  mt, i, v);.     
9a30: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
9a40: 20 20 20 20 64 61 74 61 20 3d 20 28 75 6e 73 69      data = (unsi
9a50: 67 6e 65 64 20 63 68 61 72 20 2a 29 54 63 6c 5f  gned char *)Tcl_
9a60: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
9a70: 28 70 56 61 72 2c 20 26 6e 29 3b 0a 20 20 20 20  (pVar, &n);.    
9a80: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69        sqlite3_bi
9a90: 6e 64 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 69  nd_text(pStmt, i
9aa0: 2c 20 28 63 68 61 72 20 2a 29 64 61 74 61 2c 20  , (char *)data, 
9ab0: 6e 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43  n, SQLITE_STATIC
9ac0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c  );.          Tcl
9ad0: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 56  _IncrRefCount(pV
9ae0: 61 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  ar);.          p
9af0: 50 72 65 53 74 6d 74 2d 3e 61 70 50 61 72 6d 5b  PreStmt->apParm[
9b00: 69 50 61 72 6d 2b 2b 5d 20 3d 20 70 56 61 72 3b  iParm++] = pVar;
9b10: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
9b20: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
9b30: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c  sqlite3_bind_nul
9b40: 6c 28 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20  l(pStmt, i);.   
9b50: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
9b60: 20 70 50 72 65 53 74 6d 74 2d 3e 6e 50 61 72 6d   pPreStmt->nParm
9b70: 20 3d 20 69 50 61 72 6d 3b 0a 20 20 2a 70 70 50   = iParm;.  *ppP
9b80: 72 65 53 74 6d 74 20 3d 20 70 50 72 65 53 74 6d  reStmt = pPreStm
9b90: 74 3b 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  t;..  return TCL
9ba0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  _OK;.}../*.** Re
9bb0: 6c 65 61 73 65 20 61 20 73 74 61 74 65 6d 65 6e  lease a statemen
9bc0: 74 20 72 65 66 65 72 65 6e 63 65 20 6f 62 74 61  t reference obta
9bd0: 69 6e 65 64 20 62 79 20 63 61 6c 6c 69 6e 67 20  ined by calling 
9be0: 64 62 50 72 65 70 61 72 65 41 6e 64 42 69 6e 64  dbPrepareAndBind
9bf0: 28 29 2e 0a 2a 2a 20 54 68 65 72 65 20 73 68 6f  ()..** There sho
9c00: 75 6c 64 20 62 65 20 65 78 61 63 74 6c 79 20 6f  uld be exactly o
9c10: 6e 65 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20  ne call to this 
9c20: 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 65 61 63  function for eac
9c30: 68 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20 64 62 50  h call to.** dbP
9c40: 72 65 70 61 72 65 41 6e 64 42 69 6e 64 28 29 2e  repareAndBind().
9c50: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 69  .**.** If the di
9c60: 73 63 61 72 64 20 70 61 72 61 6d 65 74 65 72 20  scard parameter 
9c70: 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
9c80: 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  n the statement 
9c90: 69 73 20 64 65 6c 65 74 65 64 0a 2a 2a 20 69 6d  is deleted.** im
9ca0: 6d 65 64 69 61 74 65 6c 79 2e 20 4f 74 68 65 72  mediately. Other
9cb0: 77 69 73 65 20 69 74 20 69 73 20 61 64 64 65 64  wise it is added
9cc0: 20 74 6f 20 74 68 65 20 4c 52 55 20 6c 69 73 74   to the LRU list
9cd0: 20 61 6e 64 20 6d 61 79 20 62 65 20 72 65 74 75   and may be retu
9ce0: 72 6e 65 64 0a 2a 2a 20 62 79 20 61 20 73 75 62  rned.** by a sub
9cf0: 73 65 71 75 65 6e 74 20 63 61 6c 6c 20 74 6f 20  sequent call to 
9d00: 64 62 50 72 65 70 61 72 65 41 6e 64 42 69 6e 64  dbPrepareAndBind
9d10: 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ()..*/.static vo
9d20: 69 64 20 64 62 52 65 6c 65 61 73 65 53 74 6d 74  id dbReleaseStmt
9d30: 28 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44  (.  SqliteDb *pD
9d40: 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
9d50: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
9d60: 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 53 71 6c 50  handle */.  SqlP
9d70: 72 65 70 61 72 65 64 53 74 6d 74 20 2a 70 50 72  reparedStmt *pPr
9d80: 65 53 74 6d 74 2c 20 20 20 20 20 20 2f 2a 20 50  eStmt,      /* P
9d90: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
9da0: 74 20 68 61 6e 64 6c 65 20 74 6f 20 72 65 6c 65  t handle to rele
9db0: 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 64 69 73  ase */.  int dis
9dc0: 63 61 72 64 20 20 20 20 20 20 20 20 20 20 20 20  card            
9dd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
9de0: 20 74 6f 20 64 65 6c 65 74 65 20 28 6e 6f 74 20   to delete (not 
9df0: 63 61 63 68 65 29 20 74 68 65 20 70 50 72 65 53  cache) the pPreS
9e00: 74 6d 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  tmt */.){.  int 
9e10: 69 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20 74 68  i;..  /* Free th
9e20: 65 20 62 6f 75 6e 64 20 73 74 72 69 6e 67 20 61  e bound string a
9e30: 6e 64 20 62 6c 6f 62 20 70 61 72 61 6d 65 74 65  nd blob paramete
9e40: 72 73 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  rs */.  for(i=0;
9e50: 20 69 3c 70 50 72 65 53 74 6d 74 2d 3e 6e 50 61   i<pPreStmt->nPa
9e60: 72 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 54 63  rm; i++){.    Tc
9e70: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70  l_DecrRefCount(p
9e80: 50 72 65 53 74 6d 74 2d 3e 61 70 50 61 72 6d 5b  PreStmt->apParm[
9e90: 69 5d 29 3b 0a 20 20 7d 0a 20 20 70 50 72 65 53  i]);.  }.  pPreS
9ea0: 74 6d 74 2d 3e 6e 50 61 72 6d 20 3d 20 30 3b 0a  tmt->nParm = 0;.
9eb0: 0a 20 20 69 66 28 20 70 44 62 2d 3e 6d 61 78 53  .  if( pDb->maxS
9ec0: 74 6d 74 3c 3d 30 20 7c 7c 20 64 69 73 63 61 72  tmt<=0 || discar
9ed0: 64 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  d ){.    /* If t
9ee0: 68 65 20 63 61 63 68 65 20 69 73 20 74 75 72 6e  he cache is turn
9ef0: 65 64 20 6f 66 66 2c 20 64 65 61 6c 6c 6f 63 61  ed off, dealloca
9f00: 74 65 64 20 74 68 65 20 73 74 61 74 65 6d 65 6e  ted the statemen
9f10: 74 20 2a 2f 0a 20 20 20 20 64 62 46 72 65 65 53  t */.    dbFreeS
9f20: 74 6d 74 28 70 50 72 65 53 74 6d 74 29 3b 0a 20  tmt(pPreStmt);. 
9f30: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 41   }else{.    /* A
9f40: 64 64 20 74 68 65 20 70 72 65 70 61 72 65 64 20  dd the prepared 
9f50: 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 74 68 65  statement to the
9f60: 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68   beginning of th
9f70: 65 20 63 61 63 68 65 20 6c 69 73 74 2e 20 2a 2f  e cache list. */
9f80: 0a 20 20 20 20 70 50 72 65 53 74 6d 74 2d 3e 70  .    pPreStmt->p
9f90: 4e 65 78 74 20 3d 20 70 44 62 2d 3e 73 74 6d 74  Next = pDb->stmt
9fa0: 4c 69 73 74 3b 0a 20 20 20 20 70 50 72 65 53 74  List;.    pPreSt
9fb0: 6d 74 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20  mt->pPrev = 0;. 
9fc0: 20 20 20 69 66 28 20 70 44 62 2d 3e 73 74 6d 74     if( pDb->stmt
9fd0: 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 70 44 62  List ){.     pDb
9fe0: 2d 3e 73 74 6d 74 4c 69 73 74 2d 3e 70 50 72 65  ->stmtList->pPre
9ff0: 76 20 3d 20 70 50 72 65 53 74 6d 74 3b 0a 20 20  v = pPreStmt;.  
a000: 20 20 7d 0a 20 20 20 20 70 44 62 2d 3e 73 74 6d    }.    pDb->stm
a010: 74 4c 69 73 74 20 3d 20 70 50 72 65 53 74 6d 74  tList = pPreStmt
a020: 3b 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e 73  ;.    if( pDb->s
a030: 74 6d 74 4c 61 73 74 3d 3d 30 20 29 7b 0a 20 20  tmtLast==0 ){.  
a040: 20 20 20 20 61 73 73 65 72 74 28 20 70 44 62 2d      assert( pDb-
a050: 3e 6e 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 20  >nStmt==0 );.   
a060: 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74     pDb->stmtLast
a070: 20 3d 20 70 50 72 65 53 74 6d 74 3b 0a 20 20 20   = pPreStmt;.   
a080: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
a090: 73 65 72 74 28 20 70 44 62 2d 3e 6e 53 74 6d 74  sert( pDb->nStmt
a0a0: 3e 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  >0 );.    }.    
a0b0: 70 44 62 2d 3e 6e 53 74 6d 74 2b 2b 3b 0a 20 20  pDb->nStmt++;.  
a0c0: 20 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20 68   .    /* If we h
a0d0: 61 76 65 20 74 6f 6f 20 6d 61 6e 79 20 73 74 61  ave too many sta
a0e0: 74 65 6d 65 6e 74 20 69 6e 20 63 61 63 68 65 2c  tement in cache,
a0f0: 20 72 65 6d 6f 76 65 20 74 68 65 20 73 75 72 70   remove the surp
a100: 6c 75 73 20 66 72 6f 6d 20 0a 20 20 20 20 2a 2a  lus from .    **
a110: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
a120: 63 61 63 68 65 20 6c 69 73 74 2e 20 20 2a 2f 0a  cache list.  */.
a130: 20 20 20 20 77 68 69 6c 65 28 20 70 44 62 2d 3e      while( pDb->
a140: 6e 53 74 6d 74 3e 70 44 62 2d 3e 6d 61 78 53 74  nStmt>pDb->maxSt
a150: 6d 74 20 29 7b 0a 20 20 20 20 20 20 53 71 6c 50  mt ){.      SqlP
a160: 72 65 70 61 72 65 64 53 74 6d 74 20 2a 70 4c 61  reparedStmt *pLa
a170: 73 74 20 3d 20 70 44 62 2d 3e 73 74 6d 74 4c 61  st = pDb->stmtLa
a180: 73 74 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e 73  st;.      pDb->s
a190: 74 6d 74 4c 61 73 74 20 3d 20 70 4c 61 73 74 2d  tmtLast = pLast-
a1a0: 3e 70 50 72 65 76 3b 0a 20 20 20 20 20 20 70 44  >pPrev;.      pD
a1b0: 62 2d 3e 73 74 6d 74 4c 61 73 74 2d 3e 70 4e 65  b->stmtLast->pNe
a1c0: 78 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 44  xt = 0;.      pD
a1d0: 62 2d 3e 6e 53 74 6d 74 2d 2d 3b 0a 20 20 20 20  b->nStmt--;.    
a1e0: 20 20 64 62 46 72 65 65 53 74 6d 74 28 70 4c 61    dbFreeStmt(pLa
a1f0: 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  st);.    }.  }.}
a200: 0a 0a 2f 2a 0a 2a 2a 20 53 74 72 75 63 74 75 72  ../*.** Structur
a210: 65 20 75 73 65 64 20 77 69 74 68 20 64 62 45 76  e used with dbEv
a220: 61 6c 58 58 58 28 29 20 66 75 6e 63 74 69 6f 6e  alXXX() function
a230: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 64 62 45 76 61  s:.**.**   dbEva
a240: 6c 49 6e 69 74 28 29 0a 2a 2a 20 20 20 64 62 45  lInit().**   dbE
a250: 76 61 6c 53 74 65 70 28 29 0a 2a 2a 20 20 20 64  valStep().**   d
a260: 62 45 76 61 6c 46 69 6e 61 6c 69 7a 65 28 29 0a  bEvalFinalize().
a270: 2a 2a 20 20 20 64 62 45 76 61 6c 52 6f 77 49 6e  **   dbEvalRowIn
a280: 66 6f 28 29 0a 2a 2a 20 20 20 64 62 45 76 61 6c  fo().**   dbEval
a290: 43 6f 6c 75 6d 6e 56 61 6c 75 65 28 29 0a 2a 2f  ColumnValue().*/
a2a0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
a2b0: 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 20 44 62  DbEvalContext Db
a2c0: 45 76 61 6c 43 6f 6e 74 65 78 74 3b 0a 73 74 72  EvalContext;.str
a2d0: 75 63 74 20 44 62 45 76 61 6c 43 6f 6e 74 65 78  uct DbEvalContex
a2e0: 74 20 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a  t {.  SqliteDb *
a2f0: 70 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  pDb;            
a300: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
a310: 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 54 63  e handle */.  Tc
a320: 6c 5f 4f 62 6a 20 2a 70 53 71 6c 3b 20 20 20 20  l_Obj *pSql;    
a330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a340: 20 4f 62 6a 65 63 74 20 68 6f 6c 64 69 6e 67 20   Object holding 
a350: 73 74 72 69 6e 67 20 7a 53 71 6c 20 2a 2f 0a 20  string zSql */. 
a360: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71   const char *zSq
a370: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
a380: 20 2f 2a 20 52 65 6d 61 69 6e 69 6e 67 20 53 51   /* Remaining SQ
a390: 4c 20 74 6f 20 65 78 65 63 75 74 65 20 2a 2f 0a  L to execute */.
a3a0: 20 20 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d    SqlPreparedStm
a3b0: 74 20 2a 70 50 72 65 53 74 6d 74 3b 20 20 20 20  t *pPreStmt;    
a3c0: 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 73 74 61    /* Current sta
a3d0: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  tement */.  int 
a3e0: 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20  nCol;           
a3f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
a400: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
a410: 20 72 65 74 75 72 6e 65 64 20 62 79 20 70 53 74   returned by pSt
a420: 6d 74 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  mt */.  Tcl_Obj 
a430: 2a 70 41 72 72 61 79 3b 20 20 20 20 20 20 20 20  *pArray;        
a440: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
a450: 6f 66 20 61 72 72 61 79 20 76 61 72 69 61 62 6c  of array variabl
a460: 65 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  e */.  Tcl_Obj *
a470: 2a 61 70 43 6f 6c 4e 61 6d 65 3b 20 20 20 20 20  *apColName;     
a480: 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20         /* Array 
a490: 6f 66 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  of column names 
a4a0: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c  */.};../*.** Rel
a4b0: 65 61 73 65 20 61 6e 79 20 63 61 63 68 65 20 6f  ease any cache o
a4c0: 66 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 63  f column names c
a4d0: 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 20 61 73  urrently held as
a4e0: 20 70 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20   part of.** the 
a4f0: 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 20 73 74  DbEvalContext st
a500: 72 75 63 74 75 72 65 20 70 61 73 73 65 64 20 61  ructure passed a
a510: 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  s the first argu
a520: 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ment..*/.static 
a530: 76 6f 69 64 20 64 62 52 65 6c 65 61 73 65 43 6f  void dbReleaseCo
a540: 6c 75 6d 6e 4e 61 6d 65 73 28 44 62 45 76 61 6c  lumnNames(DbEval
a550: 43 6f 6e 74 65 78 74 20 2a 70 29 7b 0a 20 20 69  Context *p){.  i
a560: 66 28 20 70 2d 3e 61 70 43 6f 6c 4e 61 6d 65 20  f( p->apColName 
a570: 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
a580: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
a590: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
a5a0: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
a5b0: 6e 74 28 70 2d 3e 61 70 43 6f 6c 4e 61 6d 65 5b  nt(p->apColName[
a5c0: 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54  i]);.    }.    T
a5d0: 63 6c 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29  cl_Free((char *)
a5e0: 70 2d 3e 61 70 43 6f 6c 4e 61 6d 65 29 3b 0a 20  p->apColName);. 
a5f0: 20 20 20 70 2d 3e 61 70 43 6f 6c 4e 61 6d 65 20     p->apColName 
a600: 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6e 43  = 0;.  }.  p->nC
a610: 6f 6c 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ol = 0;.}../*.**
a620: 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 20 44 62   Initialize a Db
a630: 45 76 61 6c 43 6f 6e 74 65 78 74 20 73 74 72 75  EvalContext stru
a640: 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  cture..**.** If 
a650: 70 41 72 72 61 79 20 69 73 20 6e 6f 74 20 4e 55  pArray is not NU
a660: 4c 4c 2c 20 74 68 65 6e 20 69 74 20 63 6f 6e 74  LL, then it cont
a670: 61 69 6e 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  ains the name of
a680: 20 61 20 54 63 6c 20 61 72 72 61 79 0a 2a 2a 20   a Tcl array.** 
a690: 76 61 72 69 61 62 6c 65 2e 20 54 68 65 20 22 2a  variable. The "*
a6a0: 22 20 6d 65 6d 62 65 72 20 6f 66 20 74 68 69 73  " member of this
a6b0: 20 61 72 72 61 79 20 69 73 20 73 65 74 20 74 6f   array is set to
a6c0: 20 61 20 6c 69 73 74 20 63 6f 6e 74 61 69 6e 69   a list containi
a6d0: 6e 67 0a 2a 2a 20 74 68 65 20 6e 61 6d 65 73 20  ng.** the names 
a6e0: 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 72  of the columns r
a6f0: 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 73  eturned by the s
a700: 74 61 74 65 6d 65 6e 74 20 61 73 20 70 61 72 74  tatement as part
a710: 20 6f 66 20 65 61 63 68 0a 2a 2a 20 63 61 6c 6c   of each.** call
a720: 20 74 6f 20 64 62 45 76 61 6c 53 74 65 70 28 29   to dbEvalStep()
a730: 2c 20 69 6e 20 6f 72 64 65 72 20 66 72 6f 6d 20  , in order from 
a740: 6c 65 66 74 20 74 6f 20 72 69 67 68 74 2e 20 65  left to right. e
a750: 2e 67 2e 20 69 66 20 74 68 65 20 6e 61 6d 65 73  .g. if the names
a760: 20 0a 2a 2a 20 6f 66 20 74 68 65 20 72 65 74 75   .** of the retu
a770: 72 6e 65 64 20 63 6f 6c 75 6d 6e 73 20 61 72 65  rned columns are
a780: 20 61 2c 20 62 20 61 6e 64 20 63 2c 20 69 74 20   a, b and c, it 
a790: 64 6f 65 73 20 74 68 65 20 65 71 75 69 76 61 6c  does the equival
a7a0: 65 6e 74 20 6f 66 20 74 68 65 20 0a 2a 2a 20 74  ent of the .** t
a7b0: 63 6c 20 63 6f 6d 6d 61 6e 64 3a 0a 2a 2a 0a 2a  cl command:.**.*
a7c0: 2a 20 20 20 20 20 73 65 74 20 24 7b 70 41 72 72  *     set ${pArr
a7d0: 61 79 7d 28 2a 29 20 7b 61 20 62 20 63 7d 0a 2a  ay}(*) {a b c}.*
a7e0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 62  /.static void db
a7f0: 45 76 61 6c 49 6e 69 74 28 0a 20 20 44 62 45 76  EvalInit(.  DbEv
a800: 61 6c 43 6f 6e 74 65 78 74 20 2a 70 2c 20 20 20  alContext *p,   
a810: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
a820: 6f 69 6e 74 65 72 20 74 6f 20 73 74 72 75 63 74  ointer to struct
a830: 75 72 65 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a  ure to initializ
a840: 65 20 2a 2f 0a 20 20 53 71 6c 69 74 65 44 62 20  e */.  SqliteDb 
a850: 2a 70 44 62 2c 20 20 20 20 20 20 20 20 20 20 20  *pDb,           
a860: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
a870: 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 54  se handle */.  T
a880: 63 6c 5f 4f 62 6a 20 2a 70 53 71 6c 2c 20 20 20  cl_Obj *pSql,   
a890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a8a0: 2a 20 4f 62 6a 65 63 74 20 63 6f 6e 74 61 69 6e  * Object contain
a8b0: 69 6e 67 20 53 51 4c 20 73 63 72 69 70 74 20 2a  ing SQL script *
a8c0: 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 41 72  /.  Tcl_Obj *pAr
a8d0: 72 61 79 20 20 20 20 20 20 20 20 20 20 20 20 20  ray             
a8e0: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 54      /* Name of T
a8f0: 63 6c 20 61 72 72 61 79 20 74 6f 20 73 65 74 20  cl array to set 
a900: 28 2a 29 20 65 6c 65 6d 65 6e 74 20 6f 66 20 2a  (*) element of *
a910: 2f 0a 29 7b 0a 20 20 6d 65 6d 73 65 74 28 70 2c  /.){.  memset(p,
a920: 20 30 2c 20 73 69 7a 65 6f 66 28 44 62 45 76 61   0, sizeof(DbEva
a930: 6c 43 6f 6e 74 65 78 74 29 29 3b 0a 20 20 70 2d  lContext));.  p-
a940: 3e 70 44 62 20 3d 20 70 44 62 3b 0a 20 20 70 2d  >pDb = pDb;.  p-
a950: 3e 7a 53 71 6c 20 3d 20 54 63 6c 5f 47 65 74 53  >zSql = Tcl_GetS
a960: 74 72 69 6e 67 28 70 53 71 6c 29 3b 0a 20 20 70  tring(pSql);.  p
a970: 2d 3e 70 53 71 6c 20 3d 20 70 53 71 6c 3b 0a 20  ->pSql = pSql;. 
a980: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
a990: 74 28 70 53 71 6c 29 3b 0a 20 20 69 66 28 20 70  t(pSql);.  if( p
a9a0: 41 72 72 61 79 20 29 7b 0a 20 20 20 20 70 2d 3e  Array ){.    p->
a9b0: 70 41 72 72 61 79 20 3d 20 70 41 72 72 61 79 3b  pArray = pArray;
a9c0: 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66  .    Tcl_IncrRef
a9d0: 43 6f 75 6e 74 28 70 41 72 72 61 79 29 3b 0a 20  Count(pArray);. 
a9e0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 62 74 61   }.}../*.** Obta
a9f0: 69 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  in information a
aa00: 62 6f 75 74 20 74 68 65 20 72 6f 77 20 74 68 61  bout the row tha
aa10: 74 20 74 68 65 20 44 62 45 76 61 6c 43 6f 6e 74  t the DbEvalCont
aa20: 65 78 74 20 70 61 73 73 65 64 20 61 73 20 74 68  ext passed as th
aa30: 65 0a 2a 2a 20 66 69 72 73 74 20 61 72 67 75 6d  e.** first argum
aa40: 65 6e 74 20 63 75 72 72 65 6e 74 6c 79 20 70 6f  ent currently po
aa50: 69 6e 74 73 20 74 6f 2e 0a 2a 2f 0a 73 74 61 74  ints to..*/.stat
aa60: 69 63 20 76 6f 69 64 20 64 62 45 76 61 6c 52 6f  ic void dbEvalRo
aa70: 77 49 6e 66 6f 28 0a 20 20 44 62 45 76 61 6c 43  wInfo(.  DbEvalC
aa80: 6f 6e 74 65 78 74 20 2a 70 2c 20 20 20 20 20 20  ontext *p,      
aa90: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 76 61 6c           /* Eval
aaa0: 75 61 74 69 6f 6e 20 63 6f 6e 74 65 78 74 20 2a  uation context *
aab0: 2f 0a 20 20 69 6e 74 20 2a 70 6e 43 6f 6c 2c 20  /.  int *pnCol, 
aac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aad0: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 75 6d 62      /* OUT: Numb
aae0: 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 20 6e 61 6d  er of column nam
aaf0: 65 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  es */.  Tcl_Obj 
ab00: 2a 2a 2a 70 61 70 43 6f 6c 4e 61 6d 65 20 20 20  ***papColName   
ab10: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
ab20: 41 72 72 61 79 20 6f 66 20 63 6f 6c 75 6d 6e 20  Array of column 
ab30: 6e 61 6d 65 73 20 2a 2f 0a 29 7b 0a 20 20 2f 2a  names */.){.  /*
ab40: 20 43 6f 6d 70 75 74 65 20 63 6f 6c 75 6d 6e 20   Compute column 
ab50: 6e 61 6d 65 73 20 2a 2f 0a 20 20 69 66 28 20 30  names */.  if( 0
ab60: 3d 3d 70 2d 3e 61 70 43 6f 6c 4e 61 6d 65 20 29  ==p->apColName )
ab70: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74  {.    sqlite3_st
ab80: 6d 74 20 2a 70 53 74 6d 74 20 3d 20 70 2d 3e 70  mt *pStmt = p->p
ab90: 50 72 65 53 74 6d 74 2d 3e 70 53 74 6d 74 3b 0a  PreStmt->pStmt;.
aba0: 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20      int i;      
abb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
abc0: 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 61    /* Iterator va
abd0: 72 69 61 62 6c 65 20 2a 2f 0a 20 20 20 20 69 6e  riable */.    in
abe0: 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20 20  t nCol;         
abf0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
ac00: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
ac10: 20 72 65 74 75 72 6e 65 64 20 62 79 20 70 53 74   returned by pSt
ac20: 6d 74 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62  mt */.    Tcl_Ob
ac30: 6a 20 2a 2a 61 70 43 6f 6c 4e 61 6d 65 20 3d 20  j **apColName = 
ac40: 30 3b 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79  0;      /* Array
ac50: 20 6f 66 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73   of column names
ac60: 20 2a 2f 0a 0a 20 20 20 20 70 2d 3e 6e 43 6f 6c   */..    p->nCol
ac70: 20 3d 20 6e 43 6f 6c 20 3d 20 73 71 6c 69 74 65   = nCol = sqlite
ac80: 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70  3_column_count(p
ac90: 53 74 6d 74 29 3b 0a 20 20 20 20 69 66 28 20 6e  Stmt);.    if( n
aca0: 43 6f 6c 3e 30 20 26 26 20 28 70 61 70 43 6f 6c  Col>0 && (papCol
acb0: 4e 61 6d 65 20 7c 7c 20 70 2d 3e 70 41 72 72 61  Name || p->pArra
acc0: 79 29 20 29 7b 0a 20 20 20 20 20 20 61 70 43 6f  y) ){.      apCo
acd0: 6c 4e 61 6d 65 20 3d 20 28 54 63 6c 5f 4f 62 6a  lName = (Tcl_Obj
ace0: 2a 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28 20 73 69  **)Tcl_Alloc( si
acf0: 7a 65 6f 66 28 54 63 6c 5f 4f 62 6a 2a 29 2a 6e  zeof(Tcl_Obj*)*n
ad00: 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20 66 6f 72  Col );.      for
ad10: 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b  (i=0; i<nCol; i+
ad20: 2b 29 7b 0a 20 20 20 20 20 20 20 20 61 70 43 6f  +){.        apCo
ad30: 6c 4e 61 6d 65 5b 69 5d 20 3d 20 64 62 54 65 78  lName[i] = dbTex
ad40: 74 54 6f 4f 62 6a 28 73 71 6c 69 74 65 33 5f 63  tToObj(sqlite3_c
ad50: 6f 6c 75 6d 6e 5f 6e 61 6d 65 28 70 53 74 6d 74  olumn_name(pStmt
ad60: 2c 69 29 29 3b 0a 20 20 20 20 20 20 20 20 54 63  ,i));.        Tc
ad70: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 61  l_IncrRefCount(a
ad80: 70 43 6f 6c 4e 61 6d 65 5b 69 5d 29 3b 0a 20 20  pColName[i]);.  
ad90: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 61      }.      p->a
ada0: 70 43 6f 6c 4e 61 6d 65 20 3d 20 61 70 43 6f 6c  pColName = apCol
adb0: 4e 61 6d 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  Name;.    }..   
adc0: 20 2f 2a 20 49 66 20 72 65 73 75 6c 74 73 20 61   /* If results a
add0: 72 65 20 62 65 69 6e 67 20 73 74 6f 72 65 64 20  re being stored 
ade0: 69 6e 20 61 6e 20 61 72 72 61 79 20 76 61 72 69  in an array vari
adf0: 61 62 6c 65 2c 20 74 68 65 6e 20 63 72 65 61 74  able, then creat
ae00: 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 61 72 72  e.    ** the arr
ae10: 61 79 28 2a 29 20 65 6e 74 72 79 20 66 6f 72 20  ay(*) entry for 
ae20: 74 68 61 74 20 61 72 72 61 79 0a 20 20 20 20 2a  that array.    *
ae30: 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 41 72  /.    if( p->pAr
ae40: 72 61 79 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  ray ){.      Tcl
ae50: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 20  _Interp *interp 
ae60: 3d 20 70 2d 3e 70 44 62 2d 3e 69 6e 74 65 72 70  = p->pDb->interp
ae70: 3b 0a 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20  ;.      Tcl_Obj 
ae80: 2a 70 43 6f 6c 4c 69 73 74 20 3d 20 54 63 6c 5f  *pColList = Tcl_
ae90: 4e 65 77 4f 62 6a 28 29 3b 0a 20 20 20 20 20 20  NewObj();.      
aea0: 54 63 6c 5f 4f 62 6a 20 2a 70 53 74 61 72 20 3d  Tcl_Obj *pStar =
aeb0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
aec0: 6a 28 22 2a 22 2c 20 2d 31 29 3b 0a 0a 20 20 20  j("*", -1);..   
aed0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
aee0: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
aef0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
af00: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
af10: 70 2c 20 70 43 6f 6c 4c 69 73 74 2c 20 61 70 43  p, pColList, apC
af20: 6f 6c 4e 61 6d 65 5b 69 5d 29 3b 0a 20 20 20 20  olName[i]);.    
af30: 20 20 7d 0a 20 20 20 20 20 20 54 63 6c 5f 49 6e    }.      Tcl_In
af40: 63 72 52 65 66 43 6f 75 6e 74 28 70 53 74 61 72  crRefCount(pStar
af50: 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a  );.      Tcl_Obj
af60: 53 65 74 56 61 72 32 28 69 6e 74 65 72 70 2c 20  SetVar2(interp, 
af70: 70 2d 3e 70 41 72 72 61 79 2c 20 70 53 74 61 72  p->pArray, pStar
af80: 2c 20 70 43 6f 6c 4c 69 73 74 2c 20 30 29 3b 0a  , pColList, 0);.
af90: 20 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65        Tcl_DecrRe
afa0: 66 43 6f 75 6e 74 28 70 53 74 61 72 29 3b 0a 20  fCount(pStar);. 
afb0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
afc0: 70 61 70 43 6f 6c 4e 61 6d 65 20 29 7b 0a 20 20  papColName ){.  
afd0: 20 20 2a 70 61 70 43 6f 6c 4e 61 6d 65 20 3d 20    *papColName = 
afe0: 70 2d 3e 61 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20  p->apColName;.  
aff0: 7d 0a 20 20 69 66 28 20 70 6e 43 6f 6c 20 29 7b  }.  if( pnCol ){
b000: 0a 20 20 20 20 2a 70 6e 43 6f 6c 20 3d 20 70 2d  .    *pnCol = p-
b010: 3e 6e 43 6f 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  >nCol;.  }.}../*
b020: 0a 2a 2a 20 52 65 74 75 72 6e 20 6f 6e 65 20 6f  .** Return one o
b030: 66 20 54 43 4c 5f 4f 4b 2c 20 54 43 4c 5f 42 52  f TCL_OK, TCL_BR
b040: 45 41 4b 20 6f 72 20 54 43 4c 5f 45 52 52 4f 52  EAK or TCL_ERROR
b050: 2e 20 49 66 20 54 43 4c 5f 45 52 52 4f 52 20 69  . If TCL_ERROR i
b060: 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2c 20 74  s.** returned, t
b070: 68 65 6e 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  hen an error mes
b080: 73 61 67 65 20 69 73 20 73 74 6f 72 65 64 20 69  sage is stored i
b090: 6e 20 74 68 65 20 69 6e 74 65 72 70 72 65 74 65  n the interprete
b0a0: 72 20 62 65 66 6f 72 65 0a 2a 2a 20 72 65 74 75  r before.** retu
b0b0: 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41 20 72  rning..**.** A r
b0c0: 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 54  eturn value of T
b0d0: 43 4c 5f 4f 4b 20 6d 65 61 6e 73 20 74 68 65 72  CL_OK means ther
b0e0: 65 20 69 73 20 61 20 72 6f 77 20 6f 66 20 64 61  e is a row of da
b0f0: 74 61 20 61 76 61 69 6c 61 62 6c 65 2e 20 54 68  ta available. Th
b100: 65 0a 2a 2a 20 64 61 74 61 20 6d 61 79 20 62 65  e.** data may be
b110: 20 61 63 63 65 73 73 65 64 20 75 73 69 6e 67 20   accessed using 
b120: 64 62 45 76 61 6c 52 6f 77 49 6e 66 6f 28 29 20  dbEvalRowInfo() 
b130: 61 6e 64 20 64 62 45 76 61 6c 43 6f 6c 75 6d 6e  and dbEvalColumn
b140: 56 61 6c 75 65 28 29 2e 20 54 68 69 73 0a 2a 2a  Value(). This.**
b150: 20 69 73 20 61 6e 61 6c 6f 67 6f 75 73 20 74 6f   is analogous to
b160: 20 61 20 72 65 74 75 72 6e 20 6f 66 20 53 51 4c   a return of SQL
b170: 49 54 45 5f 52 4f 57 20 66 72 6f 6d 20 73 71 6c  ITE_ROW from sql
b180: 69 74 65 33 5f 73 74 65 70 28 29 2e 20 49 66 20  ite3_step(). If 
b190: 54 43 4c 5f 42 52 45 41 4b 0a 2a 2a 20 69 73 20  TCL_BREAK.** is 
b1a0: 72 65 74 75 72 6e 65 64 2c 20 74 68 65 6e 20 74  returned, then t
b1b0: 68 65 20 53 51 4c 20 73 63 72 69 70 74 20 68 61  he SQL script ha
b1c0: 73 20 66 69 6e 69 73 68 65 64 20 65 78 65 63 75  s finished execu
b1d0: 74 69 6e 67 20 61 6e 64 20 74 68 65 72 65 20 61  ting and there a
b1e0: 72 65 0a 2a 2a 20 6e 6f 20 66 75 72 74 68 65 72  re.** no further
b1f0: 20 72 6f 77 73 20 61 76 61 69 6c 61 62 6c 65 2e   rows available.
b200: 20 54 68 69 73 20 69 73 20 73 69 6d 69 6c 61 72   This is similar
b210: 20 74 6f 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e   to SQLITE_DONE.
b220: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
b230: 62 45 76 61 6c 53 74 65 70 28 44 62 45 76 61 6c  bEvalStep(DbEval
b240: 43 6f 6e 74 65 78 74 20 2a 70 29 7b 0a 20 20 63  Context *p){.  c
b250: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 72 65 76  onst char *zPrev
b260: 53 71 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  Sql = 0;       /
b270: 2a 20 50 72 65 76 69 6f 75 73 20 76 61 6c 75 65  * Previous value
b280: 20 6f 66 20 70 2d 3e 7a 53 71 6c 20 2a 2f 0a 0a   of p->zSql */..
b290: 20 20 77 68 69 6c 65 28 20 70 2d 3e 7a 53 71 6c    while( p->zSql
b2a0: 5b 30 5d 20 7c 7c 20 70 2d 3e 70 50 72 65 53 74  [0] || p->pPreSt
b2b0: 6d 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  mt ){.    int rc
b2c0: 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 50 72  ;.    if( p->pPr
b2d0: 65 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20 20 20  eStmt==0 ){.    
b2e0: 20 20 7a 50 72 65 76 53 71 6c 20 3d 20 28 70 2d    zPrevSql = (p-
b2f0: 3e 7a 53 71 6c 3d 3d 7a 50 72 65 76 53 71 6c 20  >zSql==zPrevSql 
b300: 3f 20 30 20 3a 20 70 2d 3e 7a 53 71 6c 29 3b 0a  ? 0 : p->zSql);.
b310: 20 20 20 20 20 20 72 63 20 3d 20 64 62 50 72 65        rc = dbPre
b320: 70 61 72 65 41 6e 64 42 69 6e 64 28 70 2d 3e 70  pareAndBind(p->p
b330: 44 62 2c 20 70 2d 3e 7a 53 71 6c 2c 20 26 70 2d  Db, p->zSql, &p-
b340: 3e 7a 53 71 6c 2c 20 26 70 2d 3e 70 50 72 65 53  >zSql, &p->pPreS
b350: 74 6d 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  tmt);.      if( 
b360: 72 63 21 3d 54 43 4c 5f 4f 4b 20 29 20 72 65 74  rc!=TCL_OK ) ret
b370: 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 65 6c 73  urn rc;.    }els
b380: 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 73  e{.      int rcs
b390: 3b 0a 20 20 20 20 20 20 53 71 6c 69 74 65 44 62  ;.      SqliteDb
b3a0: 20 2a 70 44 62 20 3d 20 70 2d 3e 70 44 62 3b 0a   *pDb = p->pDb;.
b3b0: 20 20 20 20 20 20 53 71 6c 50 72 65 70 61 72 65        SqlPrepare
b3c0: 64 53 74 6d 74 20 2a 70 50 72 65 53 74 6d 74 20  dStmt *pPreStmt 
b3d0: 3d 20 70 2d 3e 70 50 72 65 53 74 6d 74 3b 0a 20  = p->pPreStmt;. 
b3e0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d       sqlite3_stm
b3f0: 74 20 2a 70 53 74 6d 74 20 3d 20 70 50 72 65 53  t *pStmt = pPreS
b400: 74 6d 74 2d 3e 70 53 74 6d 74 3b 0a 0a 20 20 20  tmt->pStmt;..   
b410: 20 20 20 72 63 73 20 3d 20 73 71 6c 69 74 65 33     rcs = sqlite3
b420: 5f 73 74 65 70 28 70 53 74 6d 74 29 3b 0a 20 20  _step(pStmt);.  
b430: 20 20 20 20 69 66 28 20 72 63 73 3d 3d 53 51 4c      if( rcs==SQL
b440: 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20  ITE_ROW ){.     
b450: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b     return TCL_OK
b460: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
b470: 69 66 28 20 70 2d 3e 70 41 72 72 61 79 20 29 7b  if( p->pArray ){
b480: 0a 20 20 20 20 20 20 20 20 64 62 45 76 61 6c 52  .        dbEvalR
b490: 6f 77 49 6e 66 6f 28 70 2c 20 30 2c 20 30 29 3b  owInfo(p, 0, 0);
b4a0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
b4b0: 63 73 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73  cs = sqlite3_res
b4c0: 65 74 28 70 53 74 6d 74 29 3b 0a 0a 20 20 20 20  et(pStmt);..    
b4d0: 20 20 70 44 62 2d 3e 6e 53 74 65 70 20 3d 20 73    pDb->nStep = s
b4e0: 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74 61 74  qlite3_stmt_stat
b4f0: 75 73 28 70 53 74 6d 74 2c 53 51 4c 49 54 45 5f  us(pStmt,SQLITE_
b500: 53 54 4d 54 53 54 41 54 55 53 5f 46 55 4c 4c 53  STMTSTATUS_FULLS
b510: 43 41 4e 5f 53 54 45 50 2c 31 29 3b 0a 20 20 20  CAN_STEP,1);.   
b520: 20 20 20 70 44 62 2d 3e 6e 53 6f 72 74 20 3d 20     pDb->nSort = 
b530: 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74 61  sqlite3_stmt_sta
b540: 74 75 73 28 70 53 74 6d 74 2c 53 51 4c 49 54 45  tus(pStmt,SQLITE
b550: 5f 53 54 4d 54 53 54 41 54 55 53 5f 53 4f 52 54  _STMTSTATUS_SORT
b560: 2c 31 29 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e  ,1);.      pDb->
b570: 6e 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33  nIndex = sqlite3
b580: 5f 73 74 6d 74 5f 73 74 61 74 75 73 28 70 53 74  _stmt_status(pSt
b590: 6d 74 2c 53 51 4c 49 54 45 5f 53 54 4d 54 53 54  mt,SQLITE_STMTST
b5a0: 41 54 55 53 5f 41 55 54 4f 49 4e 44 45 58 2c 31  ATUS_AUTOINDEX,1
b5b0: 29 3b 0a 20 20 20 20 20 20 64 62 52 65 6c 65 61  );.      dbRelea
b5c0: 73 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 29  seColumnNames(p)
b5d0: 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 65 53  ;.      p->pPreS
b5e0: 74 6d 74 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20  tmt = 0;..      
b5f0: 69 66 28 20 72 63 73 21 3d 53 51 4c 49 54 45 5f  if( rcs!=SQLITE_
b600: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  OK ){.        /*
b610: 20 49 66 20 61 20 72 75 6e 2d 74 69 6d 65 20 65   If a run-time e
b620: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 70  rror occurs, rep
b630: 6f 72 74 20 74 68 65 20 65 72 72 6f 72 20 61 6e  ort the error an
b640: 64 20 73 74 6f 70 20 72 65 61 64 69 6e 67 0a 20  d stop reading. 
b650: 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 53 51         ** the SQ
b660: 4c 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 64  L.  */.        d
b670: 62 52 65 6c 65 61 73 65 53 74 6d 74 28 70 44 62  bReleaseStmt(pDb
b680: 2c 20 70 50 72 65 53 74 6d 74 2c 20 31 29 3b 0a  , pPreStmt, 1);.
b690: 23 69 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  #if SQLITE_TEST.
b6a0: 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70          if( p->p
b6b0: 44 62 2d 3e 62 4c 65 67 61 63 79 50 72 65 70 61  Db->bLegacyPrepa
b6c0: 72 65 20 26 26 20 72 63 73 3d 3d 53 51 4c 49 54  re && rcs==SQLIT
b6d0: 45 5f 53 43 48 45 4d 41 20 26 26 20 7a 50 72 65  E_SCHEMA && zPre
b6e0: 76 53 71 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  vSql ){.        
b6f0: 20 20 2f 2a 20 49 66 20 74 68 65 20 72 75 6e 74    /* If the runt
b700: 69 6d 65 20 65 72 72 6f 72 20 77 61 73 20 61 6e  ime error was an
b710: 20 53 51 4c 49 54 45 5f 53 43 48 45 4d 41 2c 20   SQLITE_SCHEMA, 
b720: 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65  and the database
b730: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 68 61  .          ** ha
b740: 6e 64 6c 65 20 69 73 20 63 6f 6e 66 69 67 75 72  ndle is configur
b750: 65 64 20 74 6f 20 75 73 65 20 74 68 65 20 6c 65  ed to use the le
b760: 67 61 63 79 20 73 71 6c 69 74 65 33 5f 70 72 65  gacy sqlite3_pre
b770: 70 61 72 65 28 29 20 0a 20 20 20 20 20 20 20 20  pare() .        
b780: 20 20 2a 2a 20 69 6e 74 65 72 66 61 63 65 2c 20    ** interface, 
b790: 72 65 74 72 79 20 70 72 65 70 61 72 65 28 29 2f  retry prepare()/
b7a0: 73 74 65 70 28 29 20 6f 6e 20 74 68 65 20 73 61  step() on the sa
b7b0: 6d 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  me SQL statement
b7c0: 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 54  ..          ** T
b7d0: 68 69 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73  his only happens
b7e0: 20 6f 6e 63 65 2e 20 49 66 20 74 68 65 72 65 20   once. If there 
b7f0: 69 73 20 61 20 73 65 63 6f 6e 64 20 53 51 4c 49  is a second SQLI
b800: 54 45 5f 53 43 48 45 4d 41 0a 20 20 20 20 20 20  TE_SCHEMA.      
b810: 20 20 20 20 2a 2a 20 65 72 72 6f 72 2c 20 74 68      ** error, th
b820: 65 20 65 72 72 6f 72 20 77 69 6c 6c 20 62 65 20  e error will be 
b830: 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20  returned to the 
b840: 63 61 6c 6c 65 72 2e 20 2a 2f 0a 20 20 20 20 20  caller. */.     
b850: 20 20 20 20 20 70 2d 3e 7a 53 71 6c 20 3d 20 7a       p->zSql = z
b860: 50 72 65 76 53 71 6c 3b 0a 20 20 20 20 20 20 20  PrevSql;.       
b870: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
b880: 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
b890: 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a        Tcl_SetObj
b8a0: 52 65 73 75 6c 74 28 70 44 62 2d 3e 69 6e 74 65  Result(pDb->inte
b8b0: 72 70 2c 20 64 62 54 65 78 74 54 6f 4f 62 6a 28  rp, dbTextToObj(
b8c0: 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70  sqlite3_errmsg(p
b8d0: 44 62 2d 3e 64 62 29 29 29 3b 0a 20 20 20 20 20  Db->db)));.     
b8e0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
b8f0: 52 4f 52 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ROR;.      }else
b900: 7b 0a 20 20 20 20 20 20 20 20 64 62 52 65 6c 65  {.        dbRele
b910: 61 73 65 53 74 6d 74 28 70 44 62 2c 20 70 50 72  aseStmt(pDb, pPr
b920: 65 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 20  eStmt, 0);.     
b930: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
b940: 2f 2a 20 46 69 6e 69 73 68 65 64 20 2a 2f 0a 20  /* Finished */. 
b950: 20 72 65 74 75 72 6e 20 54 43 4c 5f 42 52 45 41   return TCL_BREA
b960: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65  K;.}../*.** Free
b970: 20 61 6c 6c 20 72 65 73 6f 75 72 63 65 73 20 63   all resources c
b980: 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 20 62 79  urrently held by
b990: 20 74 68 65 20 44 62 45 76 61 6c 43 6f 6e 74 65   the DbEvalConte
b9a0: 78 74 20 73 74 72 75 63 74 75 72 65 20 70 61 73  xt structure pas
b9b0: 73 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 66 69  sed.** as the fi
b9c0: 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 54 68  rst argument. Th
b9d0: 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20 65 78  ere should be ex
b9e0: 61 63 74 6c 79 20 6f 6e 65 20 63 61 6c 6c 20 74  actly one call t
b9f0: 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  o this function.
ba00: 2a 2a 20 66 6f 72 20 65 61 63 68 20 63 61 6c 6c  ** for each call
ba10: 20 74 6f 20 64 62 45 76 61 6c 49 6e 69 74 28 29   to dbEvalInit()
ba20: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
ba30: 20 64 62 45 76 61 6c 46 69 6e 61 6c 69 7a 65 28   dbEvalFinalize(
ba40: 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 20 2a 70  DbEvalContext *p
ba50: 29 7b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 65  ){.  if( p->pPre
ba60: 53 74 6d 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  Stmt ){.    sqli
ba70: 74 65 33 5f 72 65 73 65 74 28 70 2d 3e 70 50 72  te3_reset(p->pPr
ba80: 65 53 74 6d 74 2d 3e 70 53 74 6d 74 29 3b 0a 20  eStmt->pStmt);. 
ba90: 20 20 20 64 62 52 65 6c 65 61 73 65 53 74 6d 74     dbReleaseStmt
baa0: 28 70 2d 3e 70 44 62 2c 20 70 2d 3e 70 50 72 65  (p->pDb, p->pPre
bab0: 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 70 2d  Stmt, 0);.    p-
bac0: 3e 70 50 72 65 53 74 6d 74 20 3d 20 30 3b 0a 20  >pPreStmt = 0;. 
bad0: 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 41 72 72   }.  if( p->pArr
bae0: 61 79 20 29 7b 0a 20 20 20 20 54 63 6c 5f 44 65  ay ){.    Tcl_De
baf0: 63 72 52 65 66 43 6f 75 6e 74 28 70 2d 3e 70 41  crRefCount(p->pA
bb00: 72 72 61 79 29 3b 0a 20 20 20 20 70 2d 3e 70 41  rray);.    p->pA
bb10: 72 72 61 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  rray = 0;.  }.  
bb20: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
bb30: 28 70 2d 3e 70 53 71 6c 29 3b 0a 20 20 64 62 52  (p->pSql);.  dbR
bb40: 65 6c 65 61 73 65 43 6f 6c 75 6d 6e 4e 61 6d 65  eleaseColumnName
bb50: 73 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  s(p);.}../*.** R
bb60: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
bb70: 74 6f 20 61 20 54 63 6c 5f 4f 62 6a 20 73 74 72  to a Tcl_Obj str
bb80: 75 63 74 75 72 65 20 77 69 74 68 20 72 65 66 2d  ucture with ref-
bb90: 63 6f 75 6e 74 20 30 20 74 68 61 74 20 63 6f 6e  count 0 that con
bba0: 74 61 69 6e 73 0a 2a 2a 20 74 68 65 20 76 61 6c  tains.** the val
bbb0: 75 65 20 66 6f 72 20 74 68 65 20 69 43 6f 6c 27  ue for the iCol'
bbc0: 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65  th column of the
bbd0: 20 72 6f 77 20 63 75 72 72 65 6e 74 6c 79 20 70   row currently p
bbe0: 6f 69 6e 74 65 64 20 74 6f 20 62 79 0a 2a 2a 20  ointed to by.** 
bbf0: 74 68 65 20 44 62 45 76 61 6c 43 6f 6e 74 65 78  the DbEvalContex
bc00: 74 20 73 74 72 75 63 74 75 72 65 20 70 61 73 73  t structure pass
bc10: 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ed as the first 
bc20: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61  argument..*/.sta
bc30: 74 69 63 20 54 63 6c 5f 4f 62 6a 20 2a 64 62 45  tic Tcl_Obj *dbE
bc40: 76 61 6c 43 6f 6c 75 6d 6e 56 61 6c 75 65 28 44  valColumnValue(D
bc50: 62 45 76 61 6c 43 6f 6e 74 65 78 74 20 2a 70 2c  bEvalContext *p,
bc60: 20 69 6e 74 20 69 43 6f 6c 29 7b 0a 20 20 73 71   int iCol){.  sq
bc70: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
bc80: 74 20 3d 20 70 2d 3e 70 50 72 65 53 74 6d 74 2d  t = p->pPreStmt-
bc90: 3e 70 53 74 6d 74 3b 0a 20 20 73 77 69 74 63 68  >pStmt;.  switch
bca0: 28 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  ( sqlite3_column
bcb0: 5f 74 79 70 65 28 70 53 74 6d 74 2c 20 69 43 6f  _type(pStmt, iCo
bcc0: 6c 29 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53  l) ){.    case S
bcd0: 51 4c 49 54 45 5f 42 4c 4f 42 3a 20 7b 0a 20 20  QLITE_BLOB: {.  
bce0: 20 20 20 20 69 6e 74 20 62 79 74 65 73 20 3d 20      int bytes = 
bcf0: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62  sqlite3_column_b
bd00: 79 74 65 73 28 70 53 74 6d 74 2c 20 69 43 6f 6c  ytes(pStmt, iCol
bd10: 29 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  );.      const c
bd20: 68 61 72 20 2a 7a 42 6c 6f 62 20 3d 20 73 71 6c  har *zBlob = sql
bd30: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62  ite3_column_blob
bd40: 28 70 53 74 6d 74 2c 20 69 43 6f 6c 29 3b 0a 20  (pStmt, iCol);. 
bd50: 20 20 20 20 20 69 66 28 20 21 7a 42 6c 6f 62 20       if( !zBlob 
bd60: 29 20 62 79 74 65 73 20 3d 20 30 3b 0a 20 20 20  ) bytes = 0;.   
bd70: 20 20 20 72 65 74 75 72 6e 20 54 63 6c 5f 4e 65     return Tcl_Ne
bd80: 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 28 75  wByteArrayObj((u
bd90: 38 2a 29 7a 42 6c 6f 62 2c 20 62 79 74 65 73 29  8*)zBlob, bytes)
bda0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
bdb0: 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3a   SQLITE_INTEGER:
bdc0: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 5f   {.      sqlite_
bdd0: 69 6e 74 36 34 20 76 20 3d 20 73 71 6c 69 74 65  int64 v = sqlite
bde0: 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70  3_column_int64(p
bdf0: 53 74 6d 74 2c 20 69 43 6f 6c 29 3b 0a 20 20 20  Stmt, iCol);.   
be00: 20 20 20 69 66 28 20 76 3e 3d 2d 32 31 34 37 34     if( v>=-21474
be10: 38 33 36 34 37 20 26 26 20 76 3c 3d 32 31 34 37  83647 && v<=2147
be20: 34 38 33 36 34 37 20 29 7b 0a 20 20 20 20 20 20  483647 ){.      
be30: 20 20 72 65 74 75 72 6e 20 54 63 6c 5f 4e 65 77    return Tcl_New
be40: 49 6e 74 4f 62 6a 28 28 69 6e 74 29 76 29 3b 0a  IntObj((int)v);.
be50: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
be60: 20 20 20 20 20 72 65 74 75 72 6e 20 54 63 6c 5f       return Tcl_
be70: 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 76 29  NewWideIntObj(v)
be80: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
be90: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
bea0: 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20 72  FLOAT: {.      r
beb0: 65 74 75 72 6e 20 54 63 6c 5f 4e 65 77 44 6f 75  eturn Tcl_NewDou
bec0: 62 6c 65 4f 62 6a 28 73 71 6c 69 74 65 33 5f 63  bleObj(sqlite3_c
bed0: 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 28 70 53 74  olumn_double(pSt
bee0: 6d 74 2c 20 69 43 6f 6c 29 29 3b 0a 20 20 20 20  mt, iCol));.    
bef0: 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
bf00: 45 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20  E_NULL: {.      
bf10: 72 65 74 75 72 6e 20 64 62 54 65 78 74 54 6f 4f  return dbTextToO
bf20: 62 6a 28 70 2d 3e 70 44 62 2d 3e 7a 4e 75 6c 6c  bj(p->pDb->zNull
bf30: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
bf40: 72 65 74 75 72 6e 20 64 62 54 65 78 74 54 6f 4f  return dbTextToO
bf50: 62 6a 28 28 63 68 61 72 20 2a 29 73 71 6c 69 74  bj((char *)sqlit
bf60: 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
bf70: 53 74 6d 74 2c 20 69 43 6f 6c 29 29 3b 0a 7d 0a  Stmt, iCol));.}.
bf80: 0a 2f 2a 0a 2a 2a 20 49 66 20 75 73 69 6e 67 20  ./*.** If using 
bf90: 54 63 6c 20 76 65 72 73 69 6f 6e 20 38 2e 36 20  Tcl version 8.6 
bfa0: 6f 72 20 67 72 65 61 74 65 72 2c 20 75 73 65 20  or greater, use 
bfb0: 74 68 65 20 4e 52 20 66 75 6e 63 74 69 6f 6e 73  the NR functions
bfc0: 20 74 6f 20 61 76 6f 69 64 0a 2a 2a 20 72 65 63   to avoid.** rec
bfd0: 75 72 73 69 76 65 20 65 76 61 6c 75 74 69 6f 6e  ursive evalution
bfe0: 20 6f 66 20 73 63 72 69 70 74 73 20 62 79 20 74   of scripts by t
bff0: 68 65 20 5b 64 62 20 65 76 61 6c 5d 20 61 6e 64  he [db eval] and
c000: 20 5b 64 62 20 74 72 61 6e 73 5d 0a 2a 2a 20 63   [db trans].** c
c010: 6f 6d 6d 61 6e 64 73 2e 20 45 76 65 6e 20 69 66  ommands. Even if
c020: 20 74 68 65 20 68 65 61 64 65 72 73 20 75 73 65   the headers use
c030: 64 20 77 68 69 6c 65 20 63 6f 6d 70 69 6c 69 6e  d while compilin
c040: 67 20 74 68 65 20 65 78 74 65 6e 73 69 6f 6e 0a  g the extension.
c050: 2a 2a 20 61 72 65 20 38 2e 36 20 6f 72 20 6e 65  ** are 8.6 or ne
c060: 77 65 72 2c 20 74 68 65 20 63 6f 64 65 20 73 74  wer, the code st
c070: 69 6c 6c 20 74 65 73 74 73 20 74 68 65 20 54 63  ill tests the Tc
c080: 6c 20 76 65 72 73 69 6f 6e 20 61 74 20 72 75 6e  l version at run
c090: 74 69 6d 65 2e 0a 2a 2a 20 54 68 69 73 20 61 6c  time..** This al
c0a0: 6c 6f 77 73 20 73 74 75 62 73 2d 65 6e 61 62 6c  lows stubs-enabl
c0b0: 65 64 20 62 75 69 6c 64 73 20 74 6f 20 62 65 20  ed builds to be 
c0c0: 75 73 65 64 20 77 69 74 68 20 6f 6c 64 65 72 20  used with older 
c0d0: 54 63 6c 20 6c 69 62 72 61 72 69 65 73 2e 0a 2a  Tcl libraries..*
c0e0: 2f 0a 23 69 66 20 54 43 4c 5f 4d 41 4a 4f 52 5f  /.#if TCL_MAJOR_
c0f0: 56 45 52 53 49 4f 4e 3e 38 20 7c 7c 20 28 54 43  VERSION>8 || (TC
c100: 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f 4e 3d  L_MAJOR_VERSION=
c110: 3d 38 20 26 26 20 54 43 4c 5f 4d 49 4e 4f 52 5f  =8 && TCL_MINOR_
c120: 56 45 52 53 49 4f 4e 3e 3d 36 29 0a 23 20 64 65  VERSION>=6).# de
c130: 66 69 6e 65 20 53 51 4c 49 54 45 5f 54 43 4c 5f  fine SQLITE_TCL_
c140: 4e 52 45 20 31 0a 73 74 61 74 69 63 20 69 6e 74  NRE 1.static int
c150: 20 44 62 55 73 65 4e 72 65 28 76 6f 69 64 29 7b   DbUseNre(void){
c160: 0a 20 20 69 6e 74 20 6d 61 6a 6f 72 2c 20 6d 69  .  int major, mi
c170: 6e 6f 72 3b 0a 20 20 54 63 6c 5f 47 65 74 56 65  nor;.  Tcl_GetVe
c180: 72 73 69 6f 6e 28 26 6d 61 6a 6f 72 2c 20 26 6d  rsion(&major, &m
c190: 69 6e 6f 72 2c 20 30 2c 20 30 29 3b 0a 20 20 72  inor, 0, 0);.  r
c1a0: 65 74 75 72 6e 28 20 28 6d 61 6a 6f 72 3d 3d 38  eturn( (major==8
c1b0: 20 26 26 20 6d 69 6e 6f 72 3e 3d 36 29 20 7c 7c   && minor>=6) ||
c1c0: 20 6d 61 6a 6f 72 3e 38 20 29 3b 0a 7d 0a 23 65   major>8 );.}.#e
c1d0: 6c 73 65 0a 2f 2a 20 0a 2a 2a 20 43 6f 6d 70 69  lse./* .** Compi
c1e0: 6c 69 6e 67 20 75 73 69 6e 67 20 68 65 61 64 65  ling using heade
c1f0: 72 73 20 65 61 72 6c 69 65 72 20 74 68 61 6e 20  rs earlier than 
c200: 38 2e 36 2e 20 49 6e 20 74 68 69 73 20 63 61 73  8.6. In this cas
c210: 65 20 4e 52 20 63 61 6e 6e 6f 74 20 62 65 0a 2a  e NR cannot be.*
c220: 2a 20 75 73 65 64 2c 20 73 6f 20 44 62 55 73 65  * used, so DbUse
c230: 4e 72 65 28 29 20 74 6f 20 61 6c 77 61 79 73 20  Nre() to always 
c240: 72 65 74 75 72 6e 20 7a 65 72 6f 2e 20 41 64 64  return zero. Add
c250: 20 23 64 65 66 69 6e 65 73 20 66 6f 72 20 74 68   #defines for th
c260: 65 20 6f 74 68 65 72 0a 2a 2a 20 54 63 6c 5f 4e  e other.** Tcl_N
c270: 52 78 78 78 28 29 20 66 75 6e 63 74 69 6f 6e 73  Rxxx() functions
c280: 20 74 6f 20 70 72 65 76 65 6e 74 20 74 68 65 6d   to prevent them
c290: 20 66 72 6f 6d 20 63 61 75 73 69 6e 67 20 63 6f   from causing co
c2a0: 6d 70 69 6c 61 74 69 6f 6e 20 65 72 72 6f 72 73  mpilation errors
c2b0: 2c 0a 2a 2a 20 65 76 65 6e 20 74 68 6f 75 67 68  ,.** even though
c2c0: 20 74 68 65 20 6f 6e 6c 79 20 69 6e 76 6f 63 61   the only invoca
c2d0: 74 69 6f 6e 73 20 6f 66 20 74 68 65 6d 20 61 72  tions of them ar
c2e0: 65 20 77 69 74 68 69 6e 20 63 6f 6e 64 69 74 69  e within conditi
c2f0: 6f 6e 61 6c 20 62 6c 6f 63 6b 73 20 0a 2a 2a 20  onal blocks .** 
c300: 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a  of the form:.**.
c310: 2a 2a 20 20 20 69 66 28 20 44 62 55 73 65 4e 72  **   if( DbUseNr
c320: 65 28 29 20 29 20 7b 20 2e 2e 2e 20 7d 0a 2a 2f  e() ) { ... }.*/
c330: 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45  .# define SQLITE
c340: 5f 54 43 4c 5f 4e 52 45 20 30 0a 23 20 64 65 66  _TCL_NRE 0.# def
c350: 69 6e 65 20 44 62 55 73 65 4e 72 65 28 29 20 30  ine DbUseNre() 0
c360: 0a 23 20 64 65 66 69 6e 65 20 54 63 6c 5f 4e 52  .# define Tcl_NR
c370: 41 64 64 43 61 6c 6c 62 61 63 6b 28 61 2c 62 2c  AddCallback(a,b,
c380: 63 2c 64 2c 65 2c 66 29 20 30 0a 23 20 64 65 66  c,d,e,f) 0.# def
c390: 69 6e 65 20 54 63 6c 5f 4e 52 45 76 61 6c 4f 62  ine Tcl_NREvalOb
c3a0: 6a 28 61 2c 62 2c 63 29 20 30 0a 23 20 64 65 66  j(a,b,c) 0.# def
c3b0: 69 6e 65 20 54 63 6c 5f 4e 52 43 72 65 61 74 65  ine Tcl_NRCreate
c3c0: 43 6f 6d 6d 61 6e 64 28 61 2c 62 2c 63 2c 64 2c  Command(a,b,c,d,
c3d0: 65 2c 66 29 20 30 0a 23 65 6e 64 69 66 0a 0a 2f  e,f) 0.#endif../
c3e0: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
c3f0: 6f 6e 20 69 73 20 70 61 72 74 20 6f 66 20 74 68  on is part of th
c400: 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
c410: 20 6f 66 20 74 68 65 20 63 6f 6d 6d 61 6e 64 3a   of the command:
c420: 0a 2a 2a 0a 2a 2a 20 20 20 24 64 62 20 65 76 61  .**.**   $db eva
c430: 6c 20 53 51 4c 20 3f 41 52 52 41 59 4e 41 4d 45  l SQL ?ARRAYNAME
c440: 3f 20 53 43 52 49 50 54 0a 2a 2f 0a 73 74 61 74  ? SCRIPT.*/.stat
c450: 69 63 20 69 6e 74 20 44 62 45 76 61 6c 4e 65 78  ic int DbEvalNex
c460: 74 43 6d 64 28 0a 20 20 43 6c 69 65 6e 74 44 61  tCmd(.  ClientDa
c470: 74 61 20 64 61 74 61 5b 5d 2c 20 20 20 20 20 20  ta data[],      
c480: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c490: 64 61 74 61 5b 30 5d 20 69 73 20 74 68 65 20 28  data[0] is the (
c4a0: 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 2a 29 20  DbEvalContext*) 
c4b0: 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  */.  Tcl_Interp 
c4c0: 2a 69 6e 74 65 72 70 2c 20 20 20 20 20 20 20 20  *interp,        
c4d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 63 6c            /* Tcl
c4e0: 20 69 6e 74 65 72 70 72 65 74 65 72 20 2a 2f 0a   interpreter */.
c4f0: 20 20 69 6e 74 20 72 65 73 75 6c 74 20 20 20 20    int result    
c500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c510: 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
c520: 20 73 6f 20 66 61 72 20 2a 2f 0a 29 7b 0a 20 20   so far */.){.  
c530: 69 6e 74 20 72 63 20 3d 20 72 65 73 75 6c 74 3b  int rc = result;
c540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c550: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
c560: 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65  ode */..  /* The
c570: 20 66 69 72 73 74 20 65 6c 65 6d 65 6e 74 20 6f   first element o
c580: 66 20 74 68 65 20 64 61 74 61 5b 5d 20 61 72 72  f the data[] arr
c590: 61 79 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  ay is a pointer 
c5a0: 74 6f 20 61 20 44 62 45 76 61 6c 43 6f 6e 74 65  to a DbEvalConte
c5b0: 78 74 0a 20 20 2a 2a 20 73 74 72 75 63 74 75 72  xt.  ** structur
c5c0: 65 20 61 6c 6c 6f 63 61 74 65 64 20 75 73 69 6e  e allocated usin
c5d0: 67 20 54 63 6c 5f 41 6c 6c 6f 63 28 29 2e 20 54  g Tcl_Alloc(). T
c5e0: 68 65 20 73 65 63 6f 6e 64 20 65 6c 65 6d 65 6e  he second elemen
c5f0: 74 20 6f 66 20 64 61 74 61 5b 5d 0a 20 20 2a 2a  t of data[].  **
c600: 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
c610: 20 61 20 54 63 6c 5f 4f 62 6a 20 63 6f 6e 74 61   a Tcl_Obj conta
c620: 69 6e 69 6e 67 20 74 68 65 20 73 63 72 69 70 74  ining the script
c630: 20 74 6f 20 72 75 6e 20 66 6f 72 20 65 61 63 68   to run for each
c640: 20 72 6f 77 0a 20 20 2a 2a 20 72 65 74 75 72 6e   row.  ** return
c650: 65 64 20 62 79 20 74 68 65 20 71 75 65 72 69 65  ed by the querie
c660: 73 20 65 6e 63 61 70 73 75 6c 61 74 65 64 20 69  s encapsulated i
c670: 6e 20 64 61 74 61 5b 30 5d 2e 20 2a 2f 0a 20 20  n data[0]. */.  
c680: 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 20 2a 70  DbEvalContext *p
c690: 20 3d 20 28 44 62 45 76 61 6c 43 6f 6e 74 65 78   = (DbEvalContex
c6a0: 74 20 2a 29 64 61 74 61 5b 30 5d 3b 0a 20 20 54  t *)data[0];.  T
c6b0: 63 6c 5f 4f 62 6a 20 2a 70 53 63 72 69 70 74 20  cl_Obj *pScript 
c6c0: 3d 20 28 54 63 6c 5f 4f 62 6a 20 2a 29 64 61 74  = (Tcl_Obj *)dat
c6d0: 61 5b 31 5d 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20  a[1];.  Tcl_Obj 
c6e0: 2a 70 41 72 72 61 79 20 3d 20 70 2d 3e 70 41 72  *pArray = p->pAr
c6f0: 72 61 79 3b 0a 0a 20 20 77 68 69 6c 65 28 20 28  ray;..  while( (
c700: 72 63 3d 3d 54 43 4c 5f 4f 4b 20 7c 7c 20 72 63  rc==TCL_OK || rc
c710: 3d 3d 54 43 4c 5f 43 4f 4e 54 49 4e 55 45 29 20  ==TCL_CONTINUE) 
c720: 26 26 20 54 43 4c 5f 4f 4b 3d 3d 28 72 63 20 3d  && TCL_OK==(rc =
c730: 20 64 62 45 76 61 6c 53 74 65 70 28 70 29 29 20   dbEvalStep(p)) 
c740: 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
c750: 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 20 20    int nCol;.    
c760: 54 63 6c 5f 4f 62 6a 20 2a 2a 61 70 43 6f 6c 4e  Tcl_Obj **apColN
c770: 61 6d 65 3b 0a 20 20 20 20 64 62 45 76 61 6c 52  ame;.    dbEvalR
c780: 6f 77 49 6e 66 6f 28 70 2c 20 26 6e 43 6f 6c 2c  owInfo(p, &nCol,
c790: 20 26 61 70 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20   &apColName);.  
c7a0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f    for(i=0; i<nCo
c7b0: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 54  l; i++){.      T
c7c0: 63 6c 5f 4f 62 6a 20 2a 70 56 61 6c 20 3d 20 64  cl_Obj *pVal = d
c7d0: 62 45 76 61 6c 43 6f 6c 75 6d 6e 56 61 6c 75 65  bEvalColumnValue
c7e0: 28 70 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66  (p, i);.      if
c7f0: 28 20 70 41 72 72 61 79 3d 3d 30 20 29 7b 0a 20  ( pArray==0 ){. 
c800: 20 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 53 65         Tcl_ObjSe
c810: 74 56 61 72 32 28 69 6e 74 65 72 70 2c 20 61 70  tVar2(interp, ap
c820: 43 6f 6c 4e 61 6d 65 5b 69 5d 2c 20 30 2c 20 70  ColName[i], 0, p
c830: 56 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  Val, 0);.      }
c840: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 54 63  else{.        Tc
c850: 6c 5f 4f 62 6a 53 65 74 56 61 72 32 28 69 6e 74  l_ObjSetVar2(int
c860: 65 72 70 2c 20 70 41 72 72 61 79 2c 20 61 70 43  erp, pArray, apC
c870: 6f 6c 4e 61 6d 65 5b 69 5d 2c 20 70 56 61 6c 2c  olName[i], pVal,
c880: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
c890: 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 72   }..    /* The r
c8a0: 65 71 75 69 72 65 64 20 69 6e 74 65 72 70 72 65  equired interpre
c8b0: 74 65 72 20 76 61 72 69 61 62 6c 65 73 20 61 72  ter variables ar
c8c0: 65 20 6e 6f 77 20 70 6f 70 75 6c 61 74 65 64 20  e now populated 
c8d0: 77 69 74 68 20 74 68 65 20 64 61 74 61 20 0a 20  with the data . 
c8e0: 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 63     ** from the c
c8f0: 75 72 72 65 6e 74 20 72 6f 77 2e 20 49 66 20 75  urrent row. If u
c900: 73 69 6e 67 20 4e 52 45 2c 20 73 63 68 65 64 75  sing NRE, schedu
c910: 6c 65 20 63 61 6c 6c 62 61 63 6b 73 20 74 6f 20  le callbacks to 
c920: 65 76 61 6c 75 61 74 65 0a 20 20 20 20 2a 2a 20  evaluate.    ** 
c930: 73 63 72 69 70 74 20 70 53 63 72 69 70 74 2c 20  script pScript, 
c940: 74 68 65 6e 20 74 6f 20 69 6e 76 6f 6b 65 20 74  then to invoke t
c950: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 67 61  his function aga
c960: 69 6e 20 74 6f 20 66 65 74 63 68 20 74 68 65 20  in to fetch the 
c970: 6e 65 78 74 0a 20 20 20 20 2a 2a 20 72 6f 77 20  next.    ** row 
c980: 28 6f 72 20 63 6c 65 61 6e 20 75 70 20 69 66 20  (or clean up if 
c990: 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 78 74  there is no next
c9a0: 20 72 6f 77 20 6f 72 20 74 68 65 20 73 63 72 69   row or the scri
c9b0: 70 74 20 74 68 72 6f 77 73 20 61 6e 0a 20 20 20  pt throws an.   
c9c0: 20 2a 2a 20 65 78 63 65 70 74 69 6f 6e 29 2e 20   ** exception). 
c9d0: 41 66 74 65 72 20 73 63 68 65 64 75 6c 69 6e 67  After scheduling
c9e0: 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 73 2c 20   the callbacks, 
c9f0: 72 65 74 75 72 6e 20 63 6f 6e 74 72 6f 6c 20 74  return control t
ca00: 6f 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 63 61  o the .    ** ca
ca10: 6c 6c 65 72 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  ller..    **.   
ca20: 20 2a 2a 20 49 66 20 6e 6f 74 20 75 73 69 6e 67   ** If not using
ca30: 20 4e 52 45 2c 20 65 76 61 6c 75 61 74 65 20 70   NRE, evaluate p
ca40: 53 63 72 69 70 74 20 64 69 72 65 63 74 6c 79 20  Script directly 
ca50: 61 6e 64 20 63 6f 6e 74 69 6e 75 65 20 77 69 74  and continue wit
ca60: 68 20 74 68 65 0a 20 20 20 20 2a 2a 20 6e 65 78  h the.    ** nex
ca70: 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74  t iteration of t
ca80: 68 69 73 20 77 68 69 6c 65 28 2e 2e 2e 29 20 6c  his while(...) l
ca90: 6f 6f 70 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28  oop.  */.    if(
caa0: 20 44 62 55 73 65 4e 72 65 28 29 20 29 7b 0a 20   DbUseNre() ){. 
cab0: 20 20 20 20 20 54 63 6c 5f 4e 52 41 64 64 43 61       Tcl_NRAddCa
cac0: 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 44  llback(interp, D
cad0: 62 45 76 61 6c 4e 65 78 74 43 6d 64 2c 20 28 76  bEvalNextCmd, (v
cae0: 6f 69 64 2a 29 70 2c 20 28 76 6f 69 64 2a 29 70  oid*)p, (void*)p
caf0: 53 63 72 69 70 74 2c 20 30 2c 20 30 29 3b 0a 20  Script, 0, 0);. 
cb00: 20 20 20 20 20 72 65 74 75 72 6e 20 54 63 6c 5f       return Tcl_
cb10: 4e 52 45 76 61 6c 4f 62 6a 28 69 6e 74 65 72 70  NREvalObj(interp
cb20: 2c 20 70 53 63 72 69 70 74 2c 20 30 29 3b 0a 20  , pScript, 0);. 
cb30: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
cb40: 72 63 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a  rc = Tcl_EvalObj
cb50: 45 78 28 69 6e 74 65 72 70 2c 20 70 53 63 72 69  Ex(interp, pScri
cb60: 70 74 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  pt, 0);.    }.  
cb70: 7d 0a 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66  }..  Tcl_DecrRef
cb80: 43 6f 75 6e 74 28 70 53 63 72 69 70 74 29 3b 0a  Count(pScript);.
cb90: 20 20 64 62 45 76 61 6c 46 69 6e 61 6c 69 7a 65    dbEvalFinalize
cba0: 28 70 29 3b 0a 20 20 54 63 6c 5f 46 72 65 65 28  (p);.  Tcl_Free(
cbb0: 28 63 68 61 72 20 2a 29 70 29 3b 0a 0a 20 20 69  (char *)p);..  i
cbc0: 66 28 20 72 63 3d 3d 54 43 4c 5f 4f 4b 20 7c 7c  f( rc==TCL_OK ||
cbd0: 20 72 63 3d 3d 54 43 4c 5f 42 52 45 41 4b 20 29   rc==TCL_BREAK )
cbe0: 7b 0a 20 20 20 20 54 63 6c 5f 52 65 73 65 74 52  {.    Tcl_ResetR
cbf0: 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20  esult(interp);. 
cc00: 20 20 20 72 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a     rc = TCL_OK;.
cc10: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
cc20: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 22 73  .}../*.** The "s
cc30: 71 6c 69 74 65 22 20 63 6f 6d 6d 61 6e 64 20 62  qlite" command b
cc40: 65 6c 6f 77 20 63 72 65 61 74 65 73 20 61 20 6e  elow creates a n
cc50: 65 77 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 20 66  ew Tcl command f
cc60: 6f 72 20 65 61 63 68 0a 2a 2a 20 63 6f 6e 6e 65  or each.** conne
cc70: 63 74 69 6f 6e 20 69 74 20 6f 70 65 6e 73 20 74  ction it opens t
cc80: 6f 20 61 6e 20 53 51 4c 69 74 65 20 64 61 74 61  o an SQLite data
cc90: 62 61 73 65 2e 20 20 54 68 69 73 20 72 6f 75 74  base.  This rout
cca0: 69 6e 65 20 69 73 20 69 6e 76 6f 6b 65 64 0a 2a  ine is invoked.*
ccb0: 2a 20 77 68 65 6e 65 76 65 72 20 6f 6e 65 20 6f  * whenever one o
ccc0: 66 20 74 68 6f 73 65 20 63 6f 6e 6e 65 63 74 69  f those connecti
ccd0: 6f 6e 2d 73 70 65 63 69 66 69 63 20 63 6f 6d 6d  on-specific comm
cce0: 61 6e 64 73 20 69 73 20 65 78 65 63 75 74 65 64  ands is executed
ccf0: 0a 2a 2a 20 69 6e 20 54 63 6c 2e 20 20 46 6f 72  .** in Tcl.  For
cd00: 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 79 6f 75   example, if you
cd10: 20 72 75 6e 20 54 63 6c 20 63 6f 64 65 20 6c 69   run Tcl code li
cd20: 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  ke this:.**.**  
cd30: 20 20 20 20 20 73 71 6c 69 74 65 33 20 64 62 31       sqlite3 db1
cd40: 20 20 22 6d 79 5f 64 61 74 61 62 61 73 65 22 0a    "my_database".
cd50: 2a 2a 20 20 20 20 20 20 20 64 62 31 20 63 6c 6f  **       db1 clo
cd60: 73 65 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72  se.**.** The fir
cd70: 73 74 20 63 6f 6d 6d 61 6e 64 20 6f 70 65 6e 73  st command opens
cd80: 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f   a connection to
cd90: 20 74 68 65 20 22 6d 79 5f 64 61 74 61 62 61 73   the "my_databas
cda0: 65 22 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 61  e" database.** a
cdb0: 6e 64 20 63 61 6c 6c 73 20 74 68 61 74 20 63 6f  nd calls that co
cdc0: 6e 6e 65 63 74 69 6f 6e 20 22 64 62 31 22 2e 20  nnection "db1". 
cdd0: 20 54 68 65 20 73 65 63 6f 6e 64 20 63 6f 6d 6d   The second comm
cde0: 61 6e 64 20 63 61 75 73 65 73 20 74 68 69 73 0a  and causes this.
cdf0: 2a 2a 20 73 75 62 72 6f 75 74 69 6e 65 20 74 6f  ** subroutine to
ce00: 20 62 65 20 69 6e 76 6f 6b 65 64 2e 0a 2a 2f 0a   be invoked..*/.
ce10: 73 74 61 74 69 63 20 69 6e 74 20 44 62 4f 62 6a  static int DbObj
ce20: 43 6d 64 28 76 6f 69 64 20 2a 63 64 2c 20 54 63  Cmd(void *cd, Tc
ce30: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
ce40: 2c 20 69 6e 74 20 6f 62 6a 63 2c 54 63 6c 5f 4f  , int objc,Tcl_O
ce50: 62 6a 20 2a 63 6f 6e 73 74 2a 6f 62 6a 76 29 7b  bj *const*objv){
ce60: 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62  .  SqliteDb *pDb
ce70: 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 63 64   = (SqliteDb*)cd
ce80: 3b 0a 20 20 69 6e 74 20 63 68 6f 69 63 65 3b 0a  ;.  int choice;.
ce90: 20 20 69 6e 74 20 72 63 20 3d 20 54 43 4c 5f 4f    int rc = TCL_O
cea0: 4b 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  K;.  static cons
ceb0: 74 20 63 68 61 72 20 2a 44 42 5f 73 74 72 73 5b  t char *DB_strs[
cec0: 5d 20 3d 20 7b 0a 20 20 20 20 22 61 75 74 68 6f  ] = {.    "autho
ced0: 72 69 7a 65 72 22 2c 20 20 20 20 20 20 20 20 20  rizer",         
cee0: 22 62 61 63 6b 75 70 22 2c 20 20 20 20 20 20 20  "backup",       
cef0: 20 20 20 20 20 22 62 75 73 79 22 2c 0a 20 20 20       "busy",.   
cf00: 20 22 63 61 63 68 65 22 2c 20 20 20 20 20 20 20   "cache",       
cf10: 20 20 20 20 20 20 20 22 63 68 61 6e 67 65 73 22         "changes"
cf20: 2c 20 20 20 20 20 20 20 20 20 20 20 22 63 6c 6f  ,           "clo
cf30: 73 65 22 2c 0a 20 20 20 20 22 63 6f 6c 6c 61 74  se",.    "collat
cf40: 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 22  e",            "
cf50: 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64  collation_needed
cf60: 22 2c 20 20 22 63 6f 6d 6d 69 74 5f 68 6f 6f 6b  ",  "commit_hook
cf70: 22 2c 0a 20 20 20 20 22 63 6f 6d 70 6c 65 74 65  ",.    "complete
cf80: 22 2c 20 20 20 20 20 20 20 20 20 20 20 22 63 6f  ",           "co
cf90: 70 79 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  py",            
cfa0: 20 20 22 65 6e 61 62 6c 65 5f 6c 6f 61 64 5f 65    "enable_load_e
cfb0: 78 74 65 6e 73 69 6f 6e 22 2c 0a 20 20 20 20 22  xtension",.    "
cfc0: 65 72 72 6f 72 63 6f 64 65 22 2c 20 20 20 20 20  errorcode",     
cfd0: 20 20 20 20 20 22 65 76 61 6c 22 2c 20 20 20 20       "eval",    
cfe0: 20 20 20 20 20 20 20 20 20 20 22 65 78 69 73 74            "exist
cff0: 73 22 2c 0a 20 20 20 20 22 66 75 6e 63 74 69 6f  s",.    "functio
d000: 6e 22 2c 20 20 20 20 20 20 20 20 20 20 20 22 69  n",           "i
d010: 6e 63 72 62 6c 6f 62 22 2c 20 20 20 20 20 20 20  ncrblob",       
d020: 20 20 20 22 69 6e 74 65 72 72 75 70 74 22 2c 0a     "interrupt",.
d030: 20 20 20 20 22 6c 61 73 74 5f 69 6e 73 65 72 74      "last_insert
d040: 5f 72 6f 77 69 64 22 2c 20 20 22 6e 75 6c 6c 76  _rowid",  "nullv
d050: 61 6c 75 65 22 2c 20 20 20 20 20 20 20 20 20 22  alue",         "
d060: 6f 6e 65 63 6f 6c 75 6d 6e 22 2c 0a 20 20 20 20  onecolumn",.    
d070: 22 70 72 6f 66 69 6c 65 22 2c 20 20 20 20 20 20  "profile",      
d080: 20 20 20 20 20 20 22 70 72 6f 67 72 65 73 73 22        "progress"
d090: 2c 20 20 20 20 20 20 20 20 20 20 22 72 65 6b 65  ,          "reke
d0a0: 79 22 2c 0a 20 20 20 20 22 72 65 73 74 6f 72 65  y",.    "restore
d0b0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 22 72  ",            "r
d0c0: 6f 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 22 2c 20 20  ollback_hook",  
d0d0: 20 20 20 22 73 74 61 74 75 73 22 2c 0a 20 20 20     "status",.   
d0e0: 20 22 74 69 6d 65 6f 75 74 22 2c 20 20 20 20 20   "timeout",     
d0f0: 20 20 20 20 20 20 20 22 74 6f 74 61 6c 5f 63 68         "total_ch
d100: 61 6e 67 65 73 22 2c 20 20 20 20 20 22 74 72 61  anges",     "tra
d110: 63 65 22 2c 0a 20 20 20 20 22 74 72 61 6e 73 61  ce",.    "transa
d120: 63 74 69 6f 6e 22 2c 20 20 20 20 20 20 20 20 22  ction",        "
d130: 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79 22 2c 20  unlock_notify", 
d140: 20 20 20 20 22 75 70 64 61 74 65 5f 68 6f 6f 6b      "update_hook
d150: 22 2c 0a 20 20 20 20 22 76 65 72 73 69 6f 6e 22  ",.    "version"
d160: 2c 20 20 20 20 20 20 20 20 20 20 20 20 22 77 61  ,            "wa
d170: 6c 5f 68 6f 6f 6b 22 2c 20 20 20 20 20 20 20 20  l_hook",        
d180: 20 20 30 0a 20 20 7d 3b 0a 20 20 65 6e 75 6d 20    0.  };.  enum 
d190: 44 42 5f 65 6e 75 6d 20 7b 0a 20 20 20 20 44 42  DB_enum {.    DB
d1a0: 5f 41 55 54 48 4f 52 49 5a 45 52 2c 20 20 20 20  _AUTHORIZER,    
d1b0: 20 20 20 20 44 42 5f 42 41 43 4b 55 50 2c 20 20      DB_BACKUP,  
d1c0: 20 20 20 20 20 20 20 20 20 44 42 5f 42 55 53 59           DB_BUSY
d1d0: 2c 0a 20 20 20 20 44 42 5f 43 41 43 48 45 2c 20  ,.    DB_CACHE, 
d1e0: 20 20 20 20 20 20 20 20 20 20 20 20 44 42 5f 43              DB_C
d1f0: 48 41 4e 47 45 53 2c 20 20 20 20 20 20 20 20 20  HANGES,         
d200: 20 44 42 5f 43 4c 4f 53 45 2c 0a 20 20 20 20 44   DB_CLOSE,.    D
d210: 42 5f 43 4f 4c 4c 41 54 45 2c 20 20 20 20 20 20  B_COLLATE,      
d220: 20 20 20 20 20 44 42 5f 43 4f 4c 4c 41 54 49 4f       DB_COLLATIO
d230: 4e 5f 4e 45 45 44 45 44 2c 20 44 42 5f 43 4f 4d  N_NEEDED, DB_COM
d240: 4d 49 54 5f 48 4f 4f 4b 2c 0a 20 20 20 20 44 42  MIT_HOOK,.    DB
d250: 5f 43 4f 4d 50 4c 45 54 45 2c 20 20 20 20 20 20  _COMPLETE,      
d260: 20 20 20 20 44 42 5f 43 4f 50 59 2c 20 20 20 20      DB_COPY,    
d270: 20 20 20 20 20 20 20 20 20 44 42 5f 45 4e 41 42           DB_ENAB
d280: 4c 45 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f  LE_LOAD_EXTENSIO
d290: 4e 2c 0a 20 20 20 20 44 42 5f 45 52 52 4f 52 43  N,.    DB_ERRORC
d2a0: 4f 44 45 2c 20 20 20 20 20 20 20 20 20 44 42 5f  ODE,         DB_
d2b0: 45 56 41 4c 2c 20 20 20 20 20 20 20 20 20 20 20  EVAL,           
d2c0: 20 20 44 42 5f 45 58 49 53 54 53 2c 0a 20 20 20    DB_EXISTS,.   
d2d0: 20 44 42 5f 46 55 4e 43 54 49 4f 4e 2c 20 20 20   DB_FUNCTION,   
d2e0: 20 20 20 20 20 20 20 44 42 5f 49 4e 43 52 42 4c         DB_INCRBL
d2f0: 4f 42 2c 20 20 20 20 20 20 20 20 20 44 42 5f 49  OB,         DB_I
d300: 4e 54 45 52 52 55 50 54 2c 0a 20 20 20 20 44 42  NTERRUPT,.    DB
d310: 5f 4c 41 53 54 5f 49 4e 53 45 52 54 5f 52 4f 57  _LAST_INSERT_ROW
d320: 49 44 2c 20 44 42 5f 4e 55 4c 4c 56 41 4c 55 45  ID, DB_NULLVALUE
d330: 2c 20 20 20 20 20 20 20 20 44 42 5f 4f 4e 45 43  ,        DB_ONEC
d340: 4f 4c 55 4d 4e 2c 0a 20 20 20 20 44 42 5f 50 52  OLUMN,.    DB_PR
d350: 4f 46 49 4c 45 2c 20 20 20 20 20 20 20 20 20 20  OFILE,          
d360: 20 44 42 5f 50 52 4f 47 52 45 53 53 2c 20 20 20   DB_PROGRESS,   
d370: 20 20 20 20 20 20 44 42 5f 52 45 4b 45 59 2c 0a        DB_REKEY,.
d380: 20 20 20 20 44 42 5f 52 45 53 54 4f 52 45 2c 20      DB_RESTORE, 
d390: 20 20 20 20 20 20 20 20 20 20 44 42 5f 52 4f 4c            DB_ROL
d3a0: 4c 42 41 43 4b 5f 48 4f 4f 4b 2c 20 20 20 20 44  LBACK_HOOK,    D
d3b0: 42 5f 53 54 41 54 55 53 2c 0a 20 20 20 20 44 42  B_STATUS,.    DB
d3c0: 5f 54 49 4d 45 4f 55 54 2c 20 20 20 20 20 20 20  _TIMEOUT,       
d3d0: 20 20 20 20 44 42 5f 54 4f 54 41 4c 5f 43 48 41      DB_TOTAL_CHA
d3e0: 4e 47 45 53 2c 20 20 20 20 44 42 5f 54 52 41 43  NGES,    DB_TRAC
d3f0: 45 2c 0a 20 20 20 20 44 42 5f 54 52 41 4e 53 41  E,.    DB_TRANSA
d400: 43 54 49 4f 4e 2c 20 20 20 20 20 20 20 44 42 5f  CTION,       DB_
d410: 55 4e 4c 4f 43 4b 5f 4e 4f 54 49 46 59 2c 20 20  UNLOCK_NOTIFY,  
d420: 20 20 44 42 5f 55 50 44 41 54 45 5f 48 4f 4f 4b    DB_UPDATE_HOOK
d430: 2c 0a 20 20 20 20 44 42 5f 56 45 52 53 49 4f 4e  ,.    DB_VERSION
d440: 2c 20 20 20 20 20 20 20 20 20 20 20 44 42 5f 57  ,           DB_W
d450: 41 4c 5f 48 4f 4f 4b 0a 20 20 7d 3b 0a 20 20 2f  AL_HOOK.  };.  /
d460: 2a 20 64 6f 6e 27 74 20 6c 65 61 76 65 20 74 72  * don't leave tr
d470: 61 69 6c 69 6e 67 20 63 6f 6d 6d 61 73 20 6f 6e  ailing commas on
d480: 20 44 42 5f 65 6e 75 6d 2c 20 69 74 20 63 6f 6e   DB_enum, it con
d490: 66 75 73 65 73 20 74 68 65 20 41 49 58 20 78 6c  fuses the AIX xl
d4a0: 63 20 63 6f 6d 70 69 6c 65 72 20 2a 2f 0a 0a 20  c compiler */.. 
d4b0: 20 69 66 28 20 6f 62 6a 63 3c 32 20 29 7b 0a 20   if( objc<2 ){. 
d4c0: 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
d4d0: 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
d4e0: 62 6a 76 2c 20 22 53 55 42 43 4f 4d 4d 41 4e 44  bjv, "SUBCOMMAND
d4f0: 20 2e 2e 2e 22 29 3b 0a 20 20 20 20 72 65 74 75   ...");.    retu
d500: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
d510: 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49  }.  if( Tcl_GetI
d520: 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  ndexFromObj(inte
d530: 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 44 42 5f  rp, objv[1], DB_
d540: 73 74 72 73 2c 20 22 6f 70 74 69 6f 6e 22 2c 20  strs, "option", 
d550: 30 2c 20 26 63 68 6f 69 63 65 29 20 29 7b 0a 20  0, &choice) ){. 
d560: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
d570: 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 73 77 69 74  ROR;.  }..  swit
d580: 63 68 28 20 28 65 6e 75 6d 20 44 42 5f 65 6e 75  ch( (enum DB_enu
d590: 6d 29 63 68 6f 69 63 65 20 29 7b 0a 0a 20 20 2f  m)choice ){..  /
d5a0: 2a 20 20 20 20 24 64 62 20 61 75 74 68 6f 72 69  *    $db authori
d5b0: 7a 65 72 20 3f 43 41 4c 4c 42 41 43 4b 3f 0a 20  zer ?CALLBACK?. 
d5c0: 20 2a 2a 0a 20 20 2a 2a 20 49 6e 76 6f 6b 65 20   **.  ** Invoke 
d5d0: 74 68 65 20 67 69 76 65 6e 20 63 61 6c 6c 62 61  the given callba
d5e0: 63 6b 20 74 6f 20 61 75 74 68 6f 72 69 7a 65 20  ck to authorize 
d5f0: 65 61 63 68 20 53 51 4c 20 6f 70 65 72 61 74 69  each SQL operati
d600: 6f 6e 20 61 73 20 69 74 20 69 73 0a 20 20 2a 2a  on as it is.  **
d610: 20 63 6f 6d 70 69 6c 65 64 2e 20 20 35 20 61 72   compiled.  5 ar
d620: 67 75 6d 65 6e 74 73 20 61 72 65 20 61 70 70 65  guments are appe
d630: 6e 64 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c  nded to the call
d640: 62 61 63 6b 20 62 65 66 6f 72 65 20 69 74 20 69  back before it i
d650: 73 0a 20 20 2a 2a 20 69 6e 76 6f 6b 65 64 3a 0a  s.  ** invoked:.
d660: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 28 31 29 20    **.  **   (1) 
d670: 54 68 65 20 61 75 74 68 6f 72 69 7a 61 74 69 6f  The authorizatio
d680: 6e 20 74 79 70 65 20 28 65 78 3a 20 53 51 4c 49  n type (ex: SQLI
d690: 54 45 5f 43 52 45 41 54 45 5f 54 41 42 4c 45 2c  TE_CREATE_TABLE,
d6a0: 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20   SQLITE_INSERT, 
d6b0: 2e 2e 2e 29 0a 20 20 2a 2a 20 20 20 28 32 29 20  ...).  **   (2) 
d6c0: 46 69 72 73 74 20 64 65 73 63 72 69 70 74 69 76  First descriptiv
d6d0: 65 20 6e 61 6d 65 20 28 64 65 70 65 6e 64 73 20  e name (depends 
d6e0: 6f 6e 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e  on authorization
d6f0: 20 74 79 70 65 29 0a 20 20 2a 2a 20 20 20 28 33   type).  **   (3
d700: 29 20 53 65 63 6f 6e 64 20 64 65 73 63 72 69 70  ) Second descrip
d710: 74 69 76 65 20 6e 61 6d 65 0a 20 20 2a 2a 20 20  tive name.  **  
d720: 20 28 34 29 20 4e 61 6d 65 20 6f 66 20 74 68 65   (4) Name of the
d730: 20 64 61 74 61 62 61 73 65 20 28 65 78 3a 20 22   database (ex: "
d740: 6d 61 69 6e 22 2c 20 22 74 65 6d 70 22 29 0a 20  main", "temp"). 
d750: 20 2a 2a 20 20 20 28 35 29 20 4e 61 6d 65 20 6f   **   (5) Name o
d760: 66 20 74 72 69 67 67 65 72 20 74 68 61 74 20 69  f trigger that i
d770: 73 20 64 6f 69 6e 67 20 74 68 65 20 61 63 63 65  s doing the acce
d780: 73 73 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  ss.  **.  ** The
d790: 20 63 61 6c 6c 62 61 63 6b 20 73 68 6f 75 6c 64   callback should
d7a0: 20 72 65 74 75 72 6e 20 6f 6e 20 6f 66 20 74 68   return on of th
d7b0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 69  e following stri
d7c0: 6e 67 73 3a 20 53 51 4c 49 54 45 5f 4f 4b 2c 0a  ngs: SQLITE_OK,.
d7d0: 20 20 2a 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f    ** SQLITE_IGNO
d7e0: 52 45 2c 20 6f 72 20 53 51 4c 49 54 45 5f 44 45  RE, or SQLITE_DE
d7f0: 4e 59 2e 20 20 41 6e 79 20 6f 74 68 65 72 20 72  NY.  Any other r
d800: 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 61  eturn value is a
d810: 6e 20 65 72 72 6f 72 2e 0a 20 20 2a 2a 0a 20 20  n error..  **.  
d820: 2a 2a 20 49 66 20 74 68 69 73 20 6d 65 74 68 6f  ** If this metho
d830: 64 20 69 73 20 69 6e 76 6f 6b 65 64 20 77 69 74  d is invoked wit
d840: 68 20 6e 6f 20 61 72 67 75 6d 65 6e 74 73 2c 20  h no arguments, 
d850: 74 68 65 20 63 75 72 72 65 6e 74 20 61 75 74 68  the current auth
d860: 6f 72 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a 20 63  orization.  ** c
d870: 61 6c 6c 62 61 63 6b 20 73 74 72 69 6e 67 20 69  allback string i
d880: 73 20 72 65 74 75 72 6e 65 64 2e 0a 20 20 2a 2f  s returned..  */
d890: 0a 20 20 63 61 73 65 20 44 42 5f 41 55 54 48 4f  .  case DB_AUTHO
d8a0: 52 49 5a 45 52 3a 20 7b 0a 23 69 66 64 65 66 20  RIZER: {.#ifdef 
d8b0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48  SQLITE_OMIT_AUTH
d8c0: 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 20 20 54 63  ORIZATION.    Tc
d8d0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
d8e0: 6e 74 65 72 70 2c 20 22 61 75 74 68 6f 72 69 7a  nterp, "authoriz
d8f0: 61 74 69 6f 6e 20 6e 6f 74 20 61 76 61 69 6c 61  ation not availa
d900: 62 6c 65 20 69 6e 20 74 68 69 73 20 62 75 69 6c  ble in this buil
d910: 64 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  d", 0);.    retu
d920: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65  rn TCL_ERROR;.#e
d930: 6c 73 65 0a 20 20 20 20 69 66 28 20 6f 62 6a 63  lse.    if( objc
d940: 3e 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  >3 ){.      Tcl_
d950: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
d960: 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f  erp, 2, objv, "?
d970: 43 41 4c 4c 42 41 43 4b 3f 22 29 3b 0a 20 20 20  CALLBACK?");.   
d980: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
d990: 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  ROR;.    }else i
d9a0: 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20  f( objc==2 ){.  
d9b0: 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 41 75      if( pDb->zAu
d9c0: 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63  th ){.        Tc
d9d0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
d9e0: 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a 41 75 74  nterp, pDb->zAut
d9f0: 68 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  h, 0);.      }. 
da00: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
da10: 63 68 61 72 20 2a 7a 41 75 74 68 3b 0a 20 20 20  char *zAuth;.   
da20: 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20     int len;.    
da30: 20 20 69 66 28 20 70 44 62 2d 3e 7a 41 75 74 68    if( pDb->zAuth
da40: 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f   ){.        Tcl_
da50: 46 72 65 65 28 70 44 62 2d 3e 7a 41 75 74 68 29  Free(pDb->zAuth)
da60: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
da70: 7a 41 75 74 68 20 3d 20 54 63 6c 5f 47 65 74 53  zAuth = Tcl_GetS
da80: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
da90: 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20 20  v[2], &len);.   
daa0: 20 20 20 69 66 28 20 7a 41 75 74 68 20 26 26 20     if( zAuth && 
dab0: 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  len>0 ){.       
dac0: 20 70 44 62 2d 3e 7a 41 75 74 68 20 3d 20 54 63   pDb->zAuth = Tc
dad0: 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20 31  l_Alloc( len + 1
dae0: 20 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63   );.        memc
daf0: 70 79 28 70 44 62 2d 3e 7a 41 75 74 68 2c 20 7a  py(pDb->zAuth, z
db00: 41 75 74 68 2c 20 6c 65 6e 2b 31 29 3b 0a 20 20  Auth, len+1);.  
db10: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
db20: 20 20 20 70 44 62 2d 3e 7a 41 75 74 68 20 3d 20     pDb->zAuth = 
db30: 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
db40: 20 69 66 28 20 70 44 62 2d 3e 7a 41 75 74 68 20   if( pDb->zAuth 
db50: 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e  ){.        pDb->
db60: 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b  interp = interp;
db70: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
db80: 5f 73 65 74 5f 61 75 74 68 6f 72 69 7a 65 72 28  _set_authorizer(
db90: 70 44 62 2d 3e 64 62 2c 20 61 75 74 68 5f 63 61  pDb->db, auth_ca
dba0: 6c 6c 62 61 63 6b 2c 20 70 44 62 29 3b 0a 20 20  llback, pDb);.  
dbb0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
dbc0: 20 20 20 73 71 6c 69 74 65 33 5f 73 65 74 5f 61     sqlite3_set_a
dbd0: 75 74 68 6f 72 69 7a 65 72 28 70 44 62 2d 3e 64  uthorizer(pDb->d
dbe0: 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  b, 0, 0);.      
dbf0: 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  }.    }.#endif. 
dc00: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
dc10: 20 2f 2a 20 20 20 20 24 64 62 20 62 61 63 6b 75   /*    $db backu
dc20: 70 20 3f 44 41 54 41 42 41 53 45 3f 20 46 49 4c  p ?DATABASE? FIL
dc30: 45 4e 41 4d 45 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ENAME.  **.  ** 
dc40: 4f 70 65 6e 20 6f 72 20 63 72 65 61 74 65 20 61  Open or create a
dc50: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e   database file n
dc60: 61 6d 65 64 20 46 49 4c 45 4e 41 4d 45 2e 20 20  amed FILENAME.  
dc70: 54 72 61 6e 73 66 65 72 20 74 68 65 0a 20 20 2a  Transfer the.  *
dc80: 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20 6c 6f 63  * content of loc
dc90: 61 6c 20 64 61 74 61 62 61 73 65 20 44 41 54 41  al database DATA
dca0: 42 41 53 45 20 28 64 65 66 61 75 6c 74 3a 20 22  BASE (default: "
dcb0: 6d 61 69 6e 22 29 20 69 6e 74 6f 20 74 68 65 0a  main") into the.
dcc0: 20 20 2a 2a 20 46 49 4c 45 4e 41 4d 45 20 64 61    ** FILENAME da
dcd0: 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 63  tabase..  */.  c
dce0: 61 73 65 20 44 42 5f 42 41 43 4b 55 50 3a 20 7b  ase DB_BACKUP: {
dcf0: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
dd00: 2a 7a 44 65 73 74 46 69 6c 65 3b 0a 20 20 20 20  *zDestFile;.    
dd10: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 72 63  const char *zSrc
dd20: 44 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 20  Db;.    sqlite3 
dd30: 2a 70 44 65 73 74 3b 0a 20 20 20 20 73 71 6c 69  *pDest;.    sqli
dd40: 74 65 33 5f 62 61 63 6b 75 70 20 2a 70 42 61 63  te3_backup *pBac
dd50: 6b 75 70 3b 0a 0a 20 20 20 20 69 66 28 20 6f 62  kup;..    if( ob
dd60: 6a 63 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20 7a  jc==3 ){.      z
dd70: 53 72 63 44 62 20 3d 20 22 6d 61 69 6e 22 3b 0a  SrcDb = "main";.
dd80: 20 20 20 20 20 20 7a 44 65 73 74 46 69 6c 65 20        zDestFile 
dd90: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  = Tcl_GetString(
dda0: 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 20 20 7d 65  objv[2]);.    }e
ddb0: 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d 34 20  lse if( objc==4 
ddc0: 29 7b 0a 20 20 20 20 20 20 7a 53 72 63 44 62 20  ){.      zSrcDb 
ddd0: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  = Tcl_GetString(
dde0: 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 20 20 20 20  objv[2]);.      
ddf0: 7a 44 65 73 74 46 69 6c 65 20 3d 20 54 63 6c 5f  zDestFile = Tcl_
de00: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33  GetString(objv[3
de10: 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ]);.    }else{. 
de20: 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
de30: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
de40: 20 6f 62 6a 76 2c 20 22 3f 44 41 54 41 42 41 53   objv, "?DATABAS
de50: 45 3f 20 46 49 4c 45 4e 41 4d 45 22 29 3b 0a 20  E? FILENAME");. 
de60: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
de70: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
de80: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 6f 70   rc = sqlite3_op
de90: 65 6e 28 7a 44 65 73 74 46 69 6c 65 2c 20 26 70  en(zDestFile, &p
dea0: 44 65 73 74 29 3b 0a 20 20 20 20 69 66 28 20 72  Dest);.    if( r
deb0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
dec0: 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
ded0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
dee0: 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 74 61 72 67  cannot open targ
def0: 65 74 20 64 61 74 61 62 61 73 65 3a 20 22 2c 0a  et database: ",.
df00: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
df10: 65 33 5f 65 72 72 6d 73 67 28 70 44 65 73 74 29  e3_errmsg(pDest)
df20: 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20  , (char*)0);.   
df30: 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65     sqlite3_close
df40: 28 70 44 65 73 74 29 3b 0a 20 20 20 20 20 20 72  (pDest);.      r
df50: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
df60: 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 61 63 6b  .    }.    pBack
df70: 75 70 20 3d 20 73 71 6c 69 74 65 33 5f 62 61 63  up = sqlite3_bac
df80: 6b 75 70 5f 69 6e 69 74 28 70 44 65 73 74 2c 20  kup_init(pDest, 
df90: 22 6d 61 69 6e 22 2c 20 70 44 62 2d 3e 64 62 2c  "main", pDb->db,
dfa0: 20 7a 53 72 63 44 62 29 3b 0a 20 20 20 20 69 66   zSrcDb);.    if
dfb0: 28 20 70 42 61 63 6b 75 70 3d 3d 30 20 29 7b 0a  ( pBackup==0 ){.
dfc0: 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
dfd0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
dfe0: 62 61 63 6b 75 70 20 66 61 69 6c 65 64 3a 20 22  backup failed: "
dff0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  ,.           sql
e000: 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44 65 73  ite3_errmsg(pDes
e010: 74 29 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20  t), (char*)0);. 
e020: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f       sqlite3_clo
e030: 73 65 28 70 44 65 73 74 29 3b 0a 20 20 20 20 20  se(pDest);.     
e040: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
e050: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69  R;.    }.    whi
e060: 6c 65 28 20 20 28 72 63 20 3d 20 73 71 6c 69 74  le(  (rc = sqlit
e070: 65 33 5f 62 61 63 6b 75 70 5f 73 74 65 70 28 70  e3_backup_step(p
e080: 42 61 63 6b 75 70 2c 31 30 30 29 29 3d 3d 53 51  Backup,100))==SQ
e090: 4c 49 54 45 5f 4f 4b 20 29 7b 7d 0a 20 20 20 20  LITE_OK ){}.    
e0a0: 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f 66  sqlite3_backup_f
e0b0: 69 6e 69 73 68 28 70 42 61 63 6b 75 70 29 3b 0a  inish(pBackup);.
e0c0: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
e0d0: 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20  TE_DONE ){.     
e0e0: 20 72 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20   rc = TCL_OK;.  
e0f0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 54    }else{.      T
e100: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
e110: 69 6e 74 65 72 70 2c 20 22 62 61 63 6b 75 70 20  interp, "backup 
e120: 66 61 69 6c 65 64 3a 20 22 2c 0a 20 20 20 20 20  failed: ",.     
e130: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65 72        sqlite3_er
e140: 72 6d 73 67 28 70 44 65 73 74 29 2c 20 28 63 68  rmsg(pDest), (ch
e150: 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 72 63  ar*)0);.      rc
e160: 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20   = TCL_ERROR;.  
e170: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
e180: 63 6c 6f 73 65 28 70 44 65 73 74 29 3b 0a 20 20  close(pDest);.  
e190: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
e1a0: 2f 2a 20 20 20 20 24 64 62 20 62 75 73 79 20 3f  /*    $db busy ?
e1b0: 43 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a 0a 20  CALLBACK?.  **. 
e1c0: 20 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 67   ** Invoke the g
e1d0: 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b 20 69 66  iven callback if
e1e0: 20 61 6e 20 53 51 4c 20 73 74 61 74 65 6d 65 6e   an SQL statemen
e1f0: 74 20 61 74 74 65 6d 70 74 73 20 74 6f 20 6f 70  t attempts to op
e200: 65 6e 0a 20 20 2a 2a 20 61 20 6c 6f 63 6b 65 64  en.  ** a locked
e210: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
e220: 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 42    */.  case DB_B
e230: 55 53 59 3a 20 7b 0a 20 20 20 20 69 66 28 20 6f  USY: {.    if( o
e240: 62 6a 63 3e 33 20 29 7b 0a 20 20 20 20 20 20 54  bjc>3 ){.      T
e250: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
e260: 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c  interp, 2, objv,
e270: 20 22 43 41 4c 4c 42 41 43 4b 22 29 3b 0a 20 20   "CALLBACK");.  
e280: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
e290: 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73 65 20  RROR;.    }else 
e2a0: 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20  if( objc==2 ){. 
e2b0: 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 42       if( pDb->zB
e2c0: 75 73 79 20 29 7b 0a 20 20 20 20 20 20 20 20 54  usy ){.        T
e2d0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
e2e0: 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a 42 75  interp, pDb->zBu
e2f0: 73 79 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  sy, 0);.      }.
e300: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
e310: 20 63 68 61 72 20 2a 7a 42 75 73 79 3b 0a 20 20   char *zBusy;.  
e320: 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20      int len;.   
e330: 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 42 75 73     if( pDb->zBus
e340: 79 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c  y ){.        Tcl
e350: 5f 46 72 65 65 28 70 44 62 2d 3e 7a 42 75 73 79  _Free(pDb->zBusy
e360: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
e370: 20 7a 42 75 73 79 20 3d 20 54 63 6c 5f 47 65 74   zBusy = Tcl_Get
e380: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
e390: 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20  jv[2], &len);.  
e3a0: 20 20 20 20 69 66 28 20 7a 42 75 73 79 20 26 26      if( zBusy &&
e3b0: 20 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20   len>0 ){.      
e3c0: 20 20 70 44 62 2d 3e 7a 42 75 73 79 20 3d 20 54    pDb->zBusy = T
e3d0: 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20  cl_Alloc( len + 
e3e0: 31 20 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  1 );.        mem
e3f0: 63 70 79 28 70 44 62 2d 3e 7a 42 75 73 79 2c 20  cpy(pDb->zBusy, 
e400: 7a 42 75 73 79 2c 20 6c 65 6e 2b 31 29 3b 0a 20  zBusy, len+1);. 
e410: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
e420: 20 20 20 20 70 44 62 2d 3e 7a 42 75 73 79 20 3d      pDb->zBusy =
e430: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
e440: 20 20 69 66 28 20 70 44 62 2d 3e 7a 42 75 73 79    if( pDb->zBusy
e450: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d   ){.        pDb-
e460: 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70  >interp = interp
e470: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
e480: 33 5f 62 75 73 79 5f 68 61 6e 64 6c 65 72 28 70  3_busy_handler(p
e490: 44 62 2d 3e 64 62 2c 20 44 62 42 75 73 79 48 61  Db->db, DbBusyHa
e4a0: 6e 64 6c 65 72 2c 20 70 44 62 29 3b 0a 20 20 20  ndler, pDb);.   
e4b0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
e4c0: 20 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 68    sqlite3_busy_h
e4d0: 61 6e 64 6c 65 72 28 70 44 62 2d 3e 64 62 2c 20  andler(pDb->db, 
e4e0: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  0, 0);.      }. 
e4f0: 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a     }.    break;.
e500: 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 20 24 64    }..  /*     $d
e510: 62 20 63 61 63 68 65 20 66 6c 75 73 68 0a 20 20  b cache flush.  
e520: 2a 2a 20 20 20 20 20 24 64 62 20 63 61 63 68 65  **     $db cache
e530: 20 73 69 7a 65 20 6e 0a 20 20 2a 2a 0a 20 20 2a   size n.  **.  *
e540: 2a 20 46 6c 75 73 68 20 74 68 65 20 70 72 65 70  * Flush the prep
e550: 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 63  ared statement c
e560: 61 63 68 65 2c 20 6f 72 20 73 65 74 20 74 68 65  ache, or set the
e570: 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20   maximum number 
e580: 6f 66 0a 20 20 2a 2a 20 63 61 63 68 65 64 20 73  of.  ** cached s
e590: 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a  tatements..  */.
e5a0: 20 20 63 61 73 65 20 44 42 5f 43 41 43 48 45 3a    case DB_CACHE:
e5b0: 20 7b 0a 20 20 20 20 63 68 61 72 20 2a 73 75 62   {.    char *sub
e5c0: 43 6d 64 3b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a  Cmd;.    int n;.
e5d0: 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3c 3d 32  .    if( objc<=2
e5e0: 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72   ){.      Tcl_Wr
e5f0: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
e600: 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 61 63  p, 1, objv, "cac
e610: 68 65 20 6f 70 74 69 6f 6e 20 3f 61 72 67 3f 22  he option ?arg?"
e620: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
e630: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
e640: 0a 20 20 20 20 73 75 62 43 6d 64 20 3d 20 54 63  .    subCmd = Tc
e650: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
e660: 62 6a 28 20 6f 62 6a 76 5b 32 5d 2c 20 30 20 29  bj( objv[2], 0 )
e670: 3b 0a 20 20 20 20 69 66 28 20 2a 73 75 62 43 6d  ;.    if( *subCm
e680: 64 3d 3d 27 66 27 20 26 26 20 73 74 72 63 6d 70  d=='f' && strcmp
e690: 28 73 75 62 43 6d 64 2c 22 66 6c 75 73 68 22 29  (subCmd,"flush")
e6a0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==0 ){.      if(
e6b0: 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20   objc!=3 ){.    
e6c0: 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
e6d0: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20  Args(interp, 2, 
e6e0: 6f 62 6a 76 2c 20 22 66 6c 75 73 68 22 29 3b 0a  objv, "flush");.
e6f0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54          return T
e700: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  CL_ERROR;.      
e710: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66  }else{.        f
e720: 6c 75 73 68 53 74 6d 74 43 61 63 68 65 28 20 70  lushStmtCache( p
e730: 44 62 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Db );.      }.  
e740: 20 20 7d 65 6c 73 65 20 69 66 28 20 2a 73 75 62    }else if( *sub
e750: 43 6d 64 3d 3d 27 73 27 20 26 26 20 73 74 72 63  Cmd=='s' && strc
e760: 6d 70 28 73 75 62 43 6d 64 2c 22 73 69 7a 65 22  mp(subCmd,"size"
e770: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  )==0 ){.      if
e780: 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20  ( objc!=4 ){.   
e790: 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
e7a0: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
e7b0: 20 6f 62 6a 76 2c 20 22 73 69 7a 65 20 6e 22 29   objv, "size n")
e7c0: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
e7d0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
e7e0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
e7f0: 20 69 66 28 20 54 43 4c 5f 45 52 52 4f 52 3d 3d   if( TCL_ERROR==
e800: 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
e810: 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33  j(interp, objv[3
e820: 5d 2c 20 26 6e 29 20 29 7b 0a 20 20 20 20 20 20  ], &n) ){.      
e830: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
e840: 73 75 6c 74 28 20 69 6e 74 65 72 70 2c 20 22 63  sult( interp, "c
e850: 61 6e 6e 6f 74 20 63 6f 6e 76 65 72 74 20 5c 22  annot convert \"
e860: 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  ", .            
e870: 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
e880: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d 2c  FromObj(objv[3],
e890: 30 29 2c 20 22 5c 22 20 74 6f 20 69 6e 74 65 67  0), "\" to integ
e8a0: 65 72 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  er", 0);.       
e8b0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
e8c0: 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  ROR;.        }el
e8d0: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  se{.          if
e8e0: 28 20 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  ( n<0 ){.       
e8f0: 20 20 20 20 20 66 6c 75 73 68 53 74 6d 74 43 61       flushStmtCa
e900: 63 68 65 28 20 70 44 62 20 29 3b 0a 20 20 20 20  che( pDb );.    
e910: 20 20 20 20 20 20 20 20 6e 20 3d 20 30 3b 0a 20          n = 0;. 
e920: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69           }else i
e930: 66 28 20 6e 3e 4d 41 58 5f 50 52 45 50 41 52 45  f( n>MAX_PREPARE
e940: 44 5f 53 54 4d 54 53 20 29 7b 0a 20 20 20 20 20  D_STMTS ){.     
e950: 20 20 20 20 20 20 20 6e 20 3d 20 4d 41 58 5f 50         n = MAX_P
e960: 52 45 50 41 52 45 44 5f 53 54 4d 54 53 3b 0a 20  REPARED_STMTS;. 
e970: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
e980: 20 20 20 20 20 70 44 62 2d 3e 6d 61 78 53 74 6d       pDb->maxStm
e990: 74 20 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20 7d  t = n;.        }
e9a0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
e9b0: 73 65 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70  se{.      Tcl_Ap
e9c0: 70 65 6e 64 52 65 73 75 6c 74 28 20 69 6e 74 65  pendResult( inte
e9d0: 72 70 2c 20 22 62 61 64 20 6f 70 74 69 6f 6e 20  rp, "bad option 
e9e0: 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20  \"", .          
e9f0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
ea00: 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 30 29 2c  mObj(objv[2],0),
ea10: 20 22 5c 22 3a 20 6d 75 73 74 20 62 65 20 66 6c   "\": must be fl
ea20: 75 73 68 20 6f 72 20 73 69 7a 65 22 2c 20 30 29  ush or size", 0)
ea30: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
ea40: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
ea50: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
ea60: 20 20 2f 2a 20 20 20 20 20 24 64 62 20 63 68 61    /*     $db cha
ea70: 6e 67 65 73 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52  nges.  **.  ** R
ea80: 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
ea90: 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77 65   of rows that we
eaa0: 72 65 20 6d 6f 64 69 66 69 65 64 2c 20 69 6e 73  re modified, ins
eab0: 65 72 74 65 64 2c 20 6f 72 20 64 65 6c 65 74 65  erted, or delete
eac0: 64 20 62 79 0a 20 20 2a 2a 20 74 68 65 20 6d 6f  d by.  ** the mo
ead0: 73 74 20 72 65 63 65 6e 74 20 49 4e 53 45 52 54  st recent INSERT
eae0: 2c 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45  , UPDATE or DELE
eaf0: 54 45 20 73 74 61 74 65 6d 65 6e 74 2c 20 6e 6f  TE statement, no
eb00: 74 20 69 6e 63 6c 75 64 69 6e 67 20 0a 20 20 2a  t including .  *
eb10: 2a 20 61 6e 79 20 63 68 61 6e 67 65 73 20 6d 61  * any changes ma
eb20: 64 65 20 62 79 20 74 72 69 67 67 65 72 20 70 72  de by trigger pr
eb30: 6f 67 72 61 6d 73 2e 0a 20 20 2a 2f 0a 20 20 63  ograms..  */.  c
eb40: 61 73 65 20 44 42 5f 43 48 41 4e 47 45 53 3a 20  ase DB_CHANGES: 
eb50: 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  {.    Tcl_Obj *p
eb60: 52 65 73 75 6c 74 3b 0a 20 20 20 20 69 66 28 20  Result;.    if( 
eb70: 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 20  objc!=2 ){.     
eb80: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
eb90: 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a  s(interp, 2, obj
eba0: 76 2c 20 22 22 29 3b 0a 20 20 20 20 20 20 72 65  v, "");.      re
ebb0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
ebc0: 20 20 20 20 7d 0a 20 20 20 20 70 52 65 73 75 6c      }.    pResul
ebd0: 74 20 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65  t = Tcl_GetObjRe
ebe0: 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  sult(interp);.  
ebf0: 20 20 54 63 6c 5f 53 65 74 49 6e 74 4f 62 6a 28    Tcl_SetIntObj(
ec00: 70 52 65 73 75 6c 74 2c 20 73 71 6c 69 74 65 33  pResult, sqlite3
ec10: 5f 63 68 61 6e 67 65 73 28 70 44 62 2d 3e 64 62  _changes(pDb->db
ec20: 29 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20  ));.    break;. 
ec30: 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20   }..  /*    $db 
ec40: 63 6c 6f 73 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20  close.  **.  ** 
ec50: 53 68 75 74 64 6f 77 6e 20 74 68 65 20 64 61 74  Shutdown the dat
ec60: 61 62 61 73 65 0a 20 20 2a 2f 0a 20 20 63 61 73  abase.  */.  cas
ec70: 65 20 44 42 5f 43 4c 4f 53 45 3a 20 7b 0a 20 20  e DB_CLOSE: {.  
ec80: 20 20 54 63 6c 5f 44 65 6c 65 74 65 43 6f 6d 6d    Tcl_DeleteComm
ec90: 61 6e 64 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  and(interp, Tcl_
eca0: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
ecb0: 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 29 3b 0a 20  (objv[0], 0));. 
ecc0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
ecd0: 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62   /*.  **     $db
ece0: 20 63 6f 6c 6c 61 74 65 20 4e 41 4d 45 20 53 43   collate NAME SC
ecf0: 52 49 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43  RIPT.  **.  ** C
ed00: 72 65 61 74 65 20 61 20 6e 65 77 20 53 51 4c 20  reate a new SQL 
ed10: 63 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69  collation functi
ed20: 6f 6e 20 63 61 6c 6c 65 64 20 4e 41 4d 45 2e 20  on called NAME. 
ed30: 20 57 68 65 6e 65 76 65 72 0a 20 20 2a 2a 20 74   Whenever.  ** t
ed40: 68 61 74 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  hat function is 
ed50: 63 61 6c 6c 65 64 2c 20 69 6e 76 6f 6b 65 20 53  called, invoke S
ed60: 43 52 49 50 54 20 74 6f 20 65 76 61 6c 75 61 74  CRIPT to evaluat
ed70: 65 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 2e 0a  e the function..
ed80: 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 43    */.  case DB_C
ed90: 4f 4c 4c 41 54 45 3a 20 7b 0a 20 20 20 20 53 71  OLLATE: {.    Sq
eda0: 6c 43 6f 6c 6c 61 74 65 20 2a 70 43 6f 6c 6c 61  lCollate *pColla
edb0: 74 65 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4e  te;.    char *zN
edc0: 61 6d 65 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  ame;.    char *z
edd0: 53 63 72 69 70 74 3b 0a 20 20 20 20 69 6e 74 20  Script;.    int 
ede0: 6e 53 63 72 69 70 74 3b 0a 20 20 20 20 69 66 28  nScript;.    if(
edf0: 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20   objc!=4 ){.    
ee00: 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
ee10: 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62  gs(interp, 2, ob
ee20: 6a 76 2c 20 22 4e 41 4d 45 20 53 43 52 49 50 54  jv, "NAME SCRIPT
ee30: 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
ee40: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
ee50: 7d 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 54 63  }.    zName = Tc
ee60: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
ee70: 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30 29 3b 0a  bj(objv[2], 0);.
ee80: 20 20 20 20 7a 53 63 72 69 70 74 20 3d 20 54 63      zScript = Tc
ee90: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
eea0: 62 6a 28 6f 62 6a 76 5b 33 5d 2c 20 26 6e 53 63  bj(objv[3], &nSc
eeb0: 72 69 70 74 29 3b 0a 20 20 20 20 70 43 6f 6c 6c  ript);.    pColl
eec0: 61 74 65 20 3d 20 28 53 71 6c 43 6f 6c 6c 61 74  ate = (SqlCollat
eed0: 65 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28 20 73 69  e*)Tcl_Alloc( si
eee0: 7a 65 6f 66 28 2a 70 43 6f 6c 6c 61 74 65 29 20  zeof(*pCollate) 
eef0: 2b 20 6e 53 63 72 69 70 74 20 2b 20 31 20 29 3b  + nScript + 1 );
ef00: 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 61 74  .    if( pCollat
ef10: 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 54 43  e==0 ) return TC
ef20: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 70 43 6f  L_ERROR;.    pCo
ef30: 6c 6c 61 74 65 2d 3e 69 6e 74 65 72 70 20 3d 20  llate->interp = 
ef40: 69 6e 74 65 72 70 3b 0a 20 20 20 20 70 43 6f 6c  interp;.    pCol
ef50: 6c 61 74 65 2d 3e 70 4e 65 78 74 20 3d 20 70 44  late->pNext = pD
ef60: 62 2d 3e 70 43 6f 6c 6c 61 74 65 3b 0a 20 20 20  b->pCollate;.   
ef70: 20 70 43 6f 6c 6c 61 74 65 2d 3e 7a 53 63 72 69   pCollate->zScri
ef80: 70 74 20 3d 20 28 63 68 61 72 2a 29 26 70 43 6f  pt = (char*)&pCo
ef90: 6c 6c 61 74 65 5b 31 5d 3b 0a 20 20 20 20 70 44  llate[1];.    pD
efa0: 62 2d 3e 70 43 6f 6c 6c 61 74 65 20 3d 20 70 43  b->pCollate = pC
efb0: 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 6d 65 6d 63  ollate;.    memc
efc0: 70 79 28 70 43 6f 6c 6c 61 74 65 2d 3e 7a 53 63  py(pCollate->zSc
efd0: 72 69 70 74 2c 20 7a 53 63 72 69 70 74 2c 20 6e  ript, zScript, n
efe0: 53 63 72 69 70 74 2b 31 29 3b 0a 20 20 20 20 69  Script+1);.    i
eff0: 66 28 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  f( sqlite3_creat
f000: 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 70 44 62 2d  e_collation(pDb-
f010: 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20 53 51 4c 49  >db, zName, SQLI
f020: 54 45 5f 55 54 46 38 2c 20 0a 20 20 20 20 20 20  TE_UTF8, .      
f030: 20 20 70 43 6f 6c 6c 61 74 65 2c 20 74 63 6c 53    pCollate, tclS
f040: 71 6c 43 6f 6c 6c 61 74 65 29 20 29 7b 0a 20 20  qlCollate) ){.  
f050: 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c      Tcl_SetResul
f060: 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20  t(interp, (char 
f070: 2a 29 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  *)sqlite3_errmsg
f080: 28 70 44 62 2d 3e 64 62 29 2c 20 54 43 4c 5f 56  (pDb->db), TCL_V
f090: 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 20 20 20 20  OLATILE);.      
f0a0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
f0b0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61  ;.    }.    brea
f0c0: 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  k;.  }..  /*.  *
f0d0: 2a 20 20 20 20 20 24 64 62 20 63 6f 6c 6c 61 74  *     $db collat
f0e0: 69 6f 6e 5f 6e 65 65 64 65 64 20 53 43 52 49 50  ion_needed SCRIP
f0f0: 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 72 65 61  T.  **.  ** Crea
f100: 74 65 20 61 20 6e 65 77 20 53 51 4c 20 63 6f 6c  te a new SQL col
f110: 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20  lation function 
f120: 63 61 6c 6c 65 64 20 4e 41 4d 45 2e 20 20 57 68  called NAME.  Wh
f130: 65 6e 65 76 65 72 0a 20 20 2a 2a 20 74 68 61 74  enever.  ** that
f140: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
f150: 6c 65 64 2c 20 69 6e 76 6f 6b 65 20 53 43 52 49  led, invoke SCRI
f160: 50 54 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74  PT to evaluate t
f170: 68 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a  he function..  *
f180: 2f 0a 20 20 63 61 73 65 20 44 42 5f 43 4f 4c 4c  /.  case DB_COLL
f190: 41 54 49 4f 4e 5f 4e 45 45 44 45 44 3a 20 7b 0a  ATION_NEEDED: {.
f1a0: 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20      if( objc!=3 
f1b0: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f  ){.      Tcl_Wro
f1c0: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
f1d0: 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 53 43 52 49  , 2, objv, "SCRI
f1e0: 50 54 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  PT");.      retu
f1f0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
f200: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 44 62 2d    }.    if( pDb-
f210: 3e 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64 20  >pCollateNeeded 
f220: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 44 65 63  ){.      Tcl_Dec
f230: 72 52 65 66 43 6f 75 6e 74 28 70 44 62 2d 3e 70  rRefCount(pDb->p
f240: 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64 29 3b 0a  CollateNeeded);.
f250: 20 20 20 20 7d 0a 20 20 20 20 70 44 62 2d 3e 70      }.    pDb->p
f260: 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64 20 3d 20  CollateNeeded = 
f270: 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a  Tcl_DuplicateObj
f280: 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 20 20 54  (objv[2]);.    T
f290: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
f2a0: 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65 65  pDb->pCollateNee
f2b0: 64 65 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ded);.    sqlite
f2c0: 33 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64  3_collation_need
f2d0: 65 64 28 70 44 62 2d 3e 64 62 2c 20 70 44 62 2c  ed(pDb->db, pDb,
f2e0: 20 74 63 6c 43 6f 6c 6c 61 74 65 4e 65 65 64 65   tclCollateNeede
f2f0: 64 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20  d);.    break;. 
f300: 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20   }..  /*    $db 
f310: 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 20 3f 43 41 4c  commit_hook ?CAL
f320: 4c 42 41 43 4b 3f 0a 20 20 2a 2a 0a 20 20 2a 2a  LBACK?.  **.  **
f330: 20 49 6e 76 6f 6b 65 20 74 68 65 20 67 69 76 65   Invoke the give
f340: 6e 20 63 61 6c 6c 62 61 63 6b 20 6a 75 73 74 20  n callback just 
f350: 62 65 66 6f 72 65 20 63 6f 6d 6d 69 74 74 69 6e  before committin
f360: 67 20 65 76 65 72 79 20 53 51 4c 20 74 72 61 6e  g every SQL tran
f370: 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 49 66  saction..  ** If
f380: 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 74 68   the callback th
f390: 72 6f 77 73 20 61 6e 20 65 78 63 65 70 74 69 6f  rows an exceptio
f3a0: 6e 20 6f 72 20 72 65 74 75 72 6e 73 20 6e 6f 6e  n or returns non
f3b0: 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 0a  -zero, then the.
f3c0: 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
f3d0: 20 69 73 20 61 62 6f 72 74 65 64 2e 20 20 49 66   is aborted.  If
f3e0: 20 43 41 4c 4c 42 41 43 4b 20 69 73 20 61 6e 20   CALLBACK is an 
f3f0: 65 6d 70 74 79 20 73 74 72 69 6e 67 2c 20 74 68  empty string, th
f400: 65 20 63 61 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20  e callback.  ** 
f410: 69 73 20 64 69 73 61 62 6c 65 64 2e 0a 20 20 2a  is disabled..  *
f420: 2f 0a 20 20 63 61 73 65 20 44 42 5f 43 4f 4d 4d  /.  case DB_COMM
f430: 49 54 5f 48 4f 4f 4b 3a 20 7b 0a 20 20 20 20 69  IT_HOOK: {.    i
f440: 66 28 20 6f 62 6a 63 3e 33 20 29 7b 0a 20 20 20  f( objc>3 ){.   
f450: 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
f460: 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
f470: 62 6a 76 2c 20 22 3f 43 41 4c 4c 42 41 43 4b 3f  bjv, "?CALLBACK?
f480: 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
f490: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
f4a0: 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d  }else if( objc==
f4b0: 32 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  2 ){.      if( p
f4c0: 44 62 2d 3e 7a 43 6f 6d 6d 69 74 20 29 7b 0a 20  Db->zCommit ){. 
f4d0: 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e         Tcl_Appen
f4e0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
f4f0: 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 2c 20 30 29  pDb->zCommit, 0)
f500: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
f510: 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20  lse{.      char 
f520: 2a 7a 43 6f 6d 6d 69 74 3b 0a 20 20 20 20 20 20  *zCommit;.      
f530: 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20 69  int len;.      i
f540: 66 28 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 20  f( pDb->zCommit 
f550: 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 46  ){.        Tcl_F
f560: 72 65 65 28 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74  ree(pDb->zCommit
f570: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
f580: 20 7a 43 6f 6d 6d 69 74 20 3d 20 54 63 6c 5f 47   zCommit = Tcl_G
f590: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
f5a0: 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a  objv[2], &len);.
f5b0: 20 20 20 20 20 20 69 66 28 20 7a 43 6f 6d 6d 69        if( zCommi
f5c0: 74 20 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20 20  t && len>0 ){.  
f5d0: 20 20 20 20 20 20 70 44 62 2d 3e 7a 43 6f 6d 6d        pDb->zComm
f5e0: 69 74 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 20  it = Tcl_Alloc( 
f5f0: 6c 65 6e 20 2b 20 31 20 29 3b 0a 20 20 20 20 20  len + 1 );.     
f600: 20 20 20 6d 65 6d 63 70 79 28 70 44 62 2d 3e 7a     memcpy(pDb->z
f610: 43 6f 6d 6d 69 74 2c 20 7a 43 6f 6d 6d 69 74 2c  Commit, zCommit,
f620: 20 6c 65 6e 2b 31 29 3b 0a 20 20 20 20 20 20 7d   len+1);.      }
f630: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 44  else{.        pD
f640: 62 2d 3e 7a 43 6f 6d 6d 69 74 20 3d 20 30 3b 0a  b->zCommit = 0;.
f650: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
f660: 28 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 20 29  ( pDb->zCommit )
f670: 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 69  {.        pDb->i
f680: 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a  nterp = interp;.
f690: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
f6a0: 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 28 70 44 62 2d  commit_hook(pDb-
f6b0: 3e 64 62 2c 20 44 62 43 6f 6d 6d 69 74 48 61 6e  >db, DbCommitHan
f6c0: 64 6c 65 72 2c 20 70 44 62 29 3b 0a 20 20 20 20  dler, pDb);.    
f6d0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
f6e0: 20 73 71 6c 69 74 65 33 5f 63 6f 6d 6d 69 74 5f   sqlite3_commit_
f6f0: 68 6f 6f 6b 28 70 44 62 2d 3e 64 62 2c 20 30 2c  hook(pDb->db, 0,
f700: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
f710: 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20   }.    break;.  
f720: 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 63  }..  /*    $db c
f730: 6f 6d 70 6c 65 74 65 20 53 51 4c 0a 20 20 2a 2a  omplete SQL.  **
f740: 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  .  ** Return TRU
f750: 45 20 69 66 20 53 51 4c 20 69 73 20 61 20 63 6f  E if SQL is a co
f760: 6d 70 6c 65 74 65 20 53 51 4c 20 73 74 61 74 65  mplete SQL state
f770: 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 20 46 41  ment.  Return FA
f780: 4c 53 45 20 69 66 0a 20 20 2a 2a 20 61 64 64 69  LSE if.  ** addi
f790: 74 69 6f 6e 61 6c 20 6c 69 6e 65 73 20 6f 66 20  tional lines of 
f7a0: 69 6e 70 75 74 20 61 72 65 20 6e 65 65 64 65 64  input are needed
f7b0: 2e 20 20 54 68 69 73 20 69 73 20 73 69 6d 69 6c  .  This is simil
f7c0: 61 72 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 62  ar to the.  ** b
f7d0: 75 69 6c 74 2d 69 6e 20 22 69 6e 66 6f 20 63 6f  uilt-in "info co
f7e0: 6d 70 6c 65 74 65 22 20 63 6f 6d 6d 61 6e 64 20  mplete" command 
f7f0: 6f 66 20 54 63 6c 2e 0a 20 20 2a 2f 0a 20 20 63  of Tcl..  */.  c
f800: 61 73 65 20 44 42 5f 43 4f 4d 50 4c 45 54 45 3a  ase DB_COMPLETE:
f810: 20 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   {.#ifndef SQLIT
f820: 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4c 45 54 45 0a  E_OMIT_COMPLETE.
f830: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65      Tcl_Obj *pRe
f840: 73 75 6c 74 3b 0a 20 20 20 20 69 6e 74 20 69 73  sult;.    int is
f850: 43 6f 6d 70 6c 65 74 65 3b 0a 20 20 20 20 69 66  Complete;.    if
f860: 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20  ( objc!=3 ){.   
f870: 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
f880: 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
f890: 62 6a 76 2c 20 22 53 51 4c 22 29 3b 0a 20 20 20  bjv, "SQL");.   
f8a0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
f8b0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ROR;.    }.    i
f8c0: 73 43 6f 6d 70 6c 65 74 65 20 3d 20 73 71 6c 69  sComplete = sqli
f8d0: 74 65 33 5f 63 6f 6d 70 6c 65 74 65 28 20 54 63  te3_complete( Tc
f8e0: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
f8f0: 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30 29 20 29  bj(objv[2], 0) )
f900: 3b 0a 20 20 20 20 70 52 65 73 75 6c 74 20 3d 20  ;.    pResult = 
f910: 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_GetObjResult
f920: 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 63  (interp);.    Tc
f930: 6c 5f 53 65 74 42 6f 6f 6c 65 61 6e 4f 62 6a 28  l_SetBooleanObj(
f940: 70 52 65 73 75 6c 74 2c 20 69 73 43 6f 6d 70 6c  pResult, isCompl
f950: 65 74 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  ete);.#endif.   
f960: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
f970: 2a 20 20 20 20 24 64 62 20 63 6f 70 79 20 63 6f  *    $db copy co
f980: 6e 66 6c 69 63 74 2d 61 6c 67 6f 72 69 74 68 6d  nflict-algorithm
f990: 20 74 61 62 6c 65 20 66 69 6c 65 6e 61 6d 65 20   table filename 
f9a0: 3f 53 45 50 41 52 41 54 4f 52 3f 20 3f 4e 55 4c  ?SEPARATOR? ?NUL
f9b0: 4c 49 4e 44 49 43 41 54 4f 52 3f 0a 20 20 2a 2a  LINDICATOR?.  **
f9c0: 0a 20 20 2a 2a 20 43 6f 70 79 20 64 61 74 61 20  .  ** Copy data 
f9d0: 69 6e 74 6f 20 74 61 62 6c 65 20 66 72 6f 6d 20  into table from 
f9e0: 66 69 6c 65 6e 61 6d 65 2c 20 6f 70 74 69 6f 6e  filename, option
f9f0: 61 6c 6c 79 20 75 73 69 6e 67 20 53 45 50 41 52  ally using SEPAR
fa00: 41 54 4f 52 0a 20 20 2a 2a 20 61 73 20 63 6f 6c  ATOR.  ** as col
fa10: 75 6d 6e 20 73 65 70 61 72 61 74 6f 72 73 2e 20  umn separators. 
fa20: 20 49 66 20 61 20 63 6f 6c 75 6d 6e 20 63 6f 6e   If a column con
fa30: 74 61 69 6e 73 20 61 20 6e 75 6c 6c 20 73 74 72  tains a null str
fa40: 69 6e 67 2c 20 6f 72 20 74 68 65 0a 20 20 2a 2a  ing, or the.  **
fa50: 20 76 61 6c 75 65 20 6f 66 20 4e 55 4c 4c 49 4e   value of NULLIN
fa60: 44 49 43 41 54 4f 52 2c 20 61 20 4e 55 4c 4c 20  DICATOR, a NULL 
fa70: 69 73 20 69 6e 73 65 72 74 65 64 20 66 6f 72 20  is inserted for 
fa80: 74 68 65 20 63 6f 6c 75 6d 6e 2e 0a 20 20 2a 2a  the column..  **
fa90: 20 63 6f 6e 66 6c 69 63 74 2d 61 6c 67 6f 72 69   conflict-algori
faa0: 74 68 6d 20 69 73 20 6f 6e 65 20 6f 66 20 74 68  thm is one of th
fab0: 65 20 73 71 6c 69 74 65 20 63 6f 6e 66 6c 69 63  e sqlite conflic
fac0: 74 20 61 6c 67 6f 72 69 74 68 6d 73 3a 0a 20 20  t algorithms:.  
fad0: 2a 2a 20 20 20 20 72 6f 6c 6c 62 61 63 6b 2c 20  **    rollback, 
fae0: 61 62 6f 72 74 2c 20 66 61 69 6c 2c 20 69 67 6e  abort, fail, ign
faf0: 6f 72 65 2c 20 72 65 70 6c 61 63 65 0a 20 20 2a  ore, replace.  *
fb00: 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c 20 72 65  * On success, re
fb10: 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
fb20: 6f 66 20 6c 69 6e 65 73 20 70 72 6f 63 65 73 73  of lines process
fb30: 65 64 2c 20 6e 6f 74 20 6e 65 63 65 73 73 61 72  ed, not necessar
fb40: 69 6c 79 20 73 61 6d 65 0a 20 20 2a 2a 20 61 73  ily same.  ** as
fb50: 20 27 64 62 20 63 68 61 6e 67 65 73 27 20 64 75   'db changes' du
fb60: 65 20 74 6f 20 63 6f 6e 66 6c 69 63 74 2d 61 6c  e to conflict-al
fb70: 67 6f 72 69 74 68 6d 20 73 65 6c 65 63 74 65 64  gorithm selected
fb80: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73  ..  **.  ** This
fb90: 20 63 6f 64 65 20 69 73 20 62 61 73 69 63 61 6c   code is basical
fba0: 6c 79 20 61 6e 20 69 6d 70 6c 65 6d 65 6e 74 61  ly an implementa
fbb0: 74 69 6f 6e 2f 65 6e 68 61 6e 63 65 6d 65 6e 74  tion/enhancement
fbc0: 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 73 71 6c   of.  ** the sql
fbd0: 69 74 65 33 20 73 68 65 6c 6c 2e 63 20 22 2e 69  ite3 shell.c ".i
fbe0: 6d 70 6f 72 74 22 20 63 6f 6d 6d 61 6e 64 2e 0a  mport" command..
fbf0: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 63    **.  ** This c
fc00: 6f 6d 6d 61 6e 64 20 75 73 61 67 65 20 69 73 20  ommand usage is 
fc10: 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 74 68  equivalent to th
fc20: 65 20 73 71 6c 69 74 65 32 2e 78 20 43 4f 50 59  e sqlite2.x COPY
fc30: 20 73 74 61 74 65 6d 65 6e 74 2c 0a 20 20 2a 2a   statement,.  **
fc40: 20 77 68 69 63 68 20 69 6d 70 6f 72 74 73 20 66   which imports f
fc50: 69 6c 65 20 64 61 74 61 20 69 6e 74 6f 20 61 20  ile data into a 
fc60: 74 61 62 6c 65 20 75 73 69 6e 67 20 74 68 65 20  table using the 
fc70: 50 6f 73 74 67 72 65 53 51 4c 20 43 4f 50 59 20  PostgreSQL COPY 
fc80: 66 69 6c 65 20 66 6f 72 6d 61 74 3a 0a 20 20 2a  file format:.  *
fc90: 2a 20 20 20 24 64 62 20 63 6f 70 79 20 24 63 6f  *   $db copy $co
fca0: 6e 66 6c 69 74 5f 61 6c 67 6f 20 24 74 61 62 6c  nflit_algo $tabl
fcb0: 65 5f 6e 61 6d 65 20 24 66 69 6c 65 6e 61 6d 65  e_name $filename
fcc0: 20 5c 74 20 5c 5c 4e 0a 20 20 2a 2f 0a 20 20 63   \t \\N.  */.  c
fcd0: 61 73 65 20 44 42 5f 43 4f 50 59 3a 20 7b 0a 20  ase DB_COPY: {. 
fce0: 20 20 20 63 68 61 72 20 2a 7a 54 61 62 6c 65 3b     char *zTable;
fcf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
fd00: 2a 20 49 6e 73 65 72 74 20 64 61 74 61 20 69 6e  * Insert data in
fd10: 74 6f 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f  to this table */
fd20: 0a 20 20 20 20 63 68 61 72 20 2a 7a 46 69 6c 65  .    char *zFile
fd30: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
fd40: 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 66 72 6f   /* The file fro
fd50: 6d 20 77 68 69 63 68 20 74 6f 20 65 78 74 72 61  m which to extra
fd60: 63 74 20 64 61 74 61 20 2a 2f 0a 20 20 20 20 63  ct data */.    c
fd70: 68 61 72 20 2a 7a 43 6f 6e 66 6c 69 63 74 3b 20  har *zConflict; 
fd80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
fd90: 65 20 63 6f 6e 66 6c 69 63 74 20 61 6c 67 6f 72  e conflict algor
fda0: 69 74 68 6d 20 74 6f 20 75 73 65 20 2a 2f 0a 20  ithm to use */. 
fdb0: 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20     sqlite3_stmt 
fdc0: 2a 70 53 74 6d 74 3b 20 20 20 20 20 20 20 20 2f  *pStmt;        /
fdd0: 2a 20 41 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  * A statement */
fde0: 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20  .    int nCol;  
fdf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fe00: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f   /* Number of co
fe10: 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 74 61 62  lumns in the tab
fe20: 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 42  le */.    int nB
fe30: 79 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  yte;            
fe40: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
fe50: 6f 66 20 62 79 74 65 73 20 69 6e 20 61 6e 20 53  of bytes in an S
fe60: 51 4c 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 20  QL string */.   
fe70: 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20   int i, j;      
fe80: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
fe90: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f  Loop counters */
fea0: 0a 20 20 20 20 69 6e 74 20 6e 53 65 70 3b 20 20  .    int nSep;  
feb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fec0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
fed0: 74 65 73 20 69 6e 20 7a 53 65 70 5b 5d 20 2a 2f  tes in zSep[] */
fee0: 0a 20 20 20 20 69 6e 74 20 6e 4e 75 6c 6c 3b 20  .    int nNull; 
fef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ff00: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
ff10: 74 65 73 20 69 6e 20 7a 4e 75 6c 6c 5b 5d 20 2a  tes in zNull[] *
ff20: 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 71 6c  /.    char *zSql
ff30: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
ff40: 20 20 2f 2a 20 41 6e 20 53 51 4c 20 73 74 61 74    /* An SQL stat
ff50: 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 63 68 61  ement */.    cha
ff60: 72 20 2a 7a 4c 69 6e 65 3b 20 20 20 20 20 20 20  r *zLine;       
ff70: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69           /* A si
ff80: 6e 67 6c 65 20 6c 69 6e 65 20 6f 66 20 69 6e 70  ngle line of inp
ff90: 75 74 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65  ut from the file
ffa0: 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 2a 61   */.    char **a
ffb0: 7a 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20  zCol;           
ffc0: 20 20 20 20 2f 2a 20 7a 4c 69 6e 65 5b 5d 20 62      /* zLine[] b
ffd0: 72 6f 6b 65 6e 20 75 70 20 69 6e 74 6f 20 63 6f  roken up into co
ffe0: 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 63 68 61  lumns */.    cha
fff0: 72 20 2a 7a 43 6f 6d 6d 69 74 3b 20 20 20 20 20  r *zCommit;     
10000 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f 77 20           /* How 
10010 74 6f 20 63 6f 6d 6d 69 74 20 63 68 61 6e 67 65  to commit change
10020 73 20 2a 2f 0a 20 20 20 20 46 49 4c 45 20 2a 69  s */.    FILE *i
10030 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
10040 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 70 75       /* The inpu
10050 74 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 69 6e  t file */.    in
10060 74 20 6c 69 6e 65 6e 6f 20 3d 20 30 3b 20 20 20  t lineno = 0;   
10070 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e            /* Lin
10080 65 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 70 75  e number of inpu
10090 74 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 63 68  t file */.    ch
100a0 61 72 20 7a 4c 69 6e 65 4e 75 6d 5b 38 30 5d 3b  ar zLineNum[80];
100b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e            /* Lin
100c0 65 20 6e 75 6d 62 65 72 20 70 72 69 6e 74 20 62  e number print b
100d0 75 66 66 65 72 20 2a 2f 0a 20 20 20 20 54 63 6c  uffer */.    Tcl
100e0 5f 4f 62 6a 20 2a 70 52 65 73 75 6c 74 3b 20 20  _Obj *pResult;  
100f0 20 20 20 20 20 20 20 20 20 2f 2a 20 69 6e 74 65           /* inte
10100 72 70 20 72 65 73 75 6c 74 20 2a 2f 0a 0a 20 20  rp result */..  
10110 20 20 63 68 61 72 20 2a 7a 53 65 70 3b 0a 20 20    char *zSep;.  
10120 20 20 63 68 61 72 20 2a 7a 4e 75 6c 6c 3b 0a 20    char *zNull;. 
10130 20 20 20 69 66 28 20 6f 62 6a 63 3c 35 20 7c 7c     if( objc<5 ||
10140 20 6f 62 6a 63 3e 37 20 29 7b 0a 20 20 20 20 20   objc>7 ){.     
10150 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
10160 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a  s(interp, 2, obj
10170 76 2c 20 0a 20 20 20 20 20 20 20 20 20 22 43 4f  v, .         "CO
10180 4e 46 4c 49 43 54 2d 41 4c 47 4f 52 49 54 48 4d  NFLICT-ALGORITHM
10190 20 54 41 42 4c 45 20 46 49 4c 45 4e 41 4d 45 20   TABLE FILENAME 
101a0 3f 53 45 50 41 52 41 54 4f 52 3f 20 3f 4e 55 4c  ?SEPARATOR? ?NUL
101b0 4c 49 4e 44 49 43 41 54 4f 52 3f 22 29 3b 0a 20  LINDICATOR?");. 
101c0 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
101d0 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
101e0 20 69 66 28 20 6f 62 6a 63 3e 3d 36 20 29 7b 0a   if( objc>=6 ){.
101f0 20 20 20 20 20 20 7a 53 65 70 20 3d 20 54 63 6c        zSep = Tcl
10200 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
10210 6a 28 6f 62 6a 76 5b 35 5d 2c 20 30 29 3b 0a 20  j(objv[5], 0);. 
10220 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
10230 7a 53 65 70 20 3d 20 22 5c 74 22 3b 0a 20 20 20  zSep = "\t";.   
10240 20 7d 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3e   }.    if( objc>
10250 3d 37 20 29 7b 0a 20 20 20 20 20 20 7a 4e 75 6c  =7 ){.      zNul
10260 6c 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  l = Tcl_GetStrin
10270 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 36 5d  gFromObj(objv[6]
10280 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , 0);.    }else{
10290 0a 20 20 20 20 20 20 7a 4e 75 6c 6c 20 3d 20 22  .      zNull = "
102a0 22 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 43 6f  ";.    }.    zCo
102b0 6e 66 6c 69 63 74 20 3d 20 54 63 6c 5f 47 65 74  nflict = Tcl_Get
102c0 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
102d0 6a 76 5b 32 5d 2c 20 30 29 3b 0a 20 20 20 20 7a  jv[2], 0);.    z
102e0 54 61 62 6c 65 20 3d 20 54 63 6c 5f 47 65 74 53  Table = Tcl_GetS
102f0 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
10300 76 5b 33 5d 2c 20 30 29 3b 0a 20 20 20 20 7a 46  v[3], 0);.    zF
10310 69 6c 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  ile = Tcl_GetStr
10320 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
10330 34 5d 2c 20 30 29 3b 0a 20 20 20 20 6e 53 65 70  4], 0);.    nSep
10340 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 53 65 70   = strlen30(zSep
10350 29 3b 0a 20 20 20 20 6e 4e 75 6c 6c 20 3d 20 73  );.    nNull = s
10360 74 72 6c 65 6e 33 30 28 7a 4e 75 6c 6c 29 3b 0a  trlen30(zNull);.
10370 20 20 20 20 69 66 28 20 6e 53 65 70 3d 3d 30 20      if( nSep==0 
10380 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70  ){.      Tcl_App
10390 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
103a0 2c 22 45 72 72 6f 72 3a 20 6e 6f 6e 2d 6e 75 6c  ,"Error: non-nul
103b0 6c 20 73 65 70 61 72 61 74 6f 72 20 72 65 71 75  l separator requ
103c0 69 72 65 64 20 66 6f 72 20 63 6f 70 79 22 2c 30  ired for copy",0
103d0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
103e0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
103f0 0a 20 20 20 20 69 66 28 73 74 72 63 6d 70 28 7a  .    if(strcmp(z
10400 43 6f 6e 66 6c 69 63 74 2c 20 22 72 6f 6c 6c 62  Conflict, "rollb
10410 61 63 6b 22 29 20 21 3d 20 30 20 26 26 0a 20 20  ack") != 0 &&.  
10420 20 20 20 20 20 73 74 72 63 6d 70 28 7a 43 6f 6e       strcmp(zCon
10430 66 6c 69 63 74 2c 20 22 61 62 6f 72 74 22 20 20  flict, "abort"  
10440 20 29 20 21 3d 20 30 20 26 26 0a 20 20 20 20 20   ) != 0 &&.     
10450 20 20 73 74 72 63 6d 70 28 7a 43 6f 6e 66 6c 69    strcmp(zConfli
10460 63 74 2c 20 22 66 61 69 6c 22 20 20 20 20 29 20  ct, "fail"    ) 
10470 21 3d 20 30 20 26 26 0a 20 20 20 20 20 20 20 73  != 0 &&.       s
10480 74 72 63 6d 70 28 7a 43 6f 6e 66 6c 69 63 74 2c  trcmp(zConflict,
10490 20 22 69 67 6e 6f 72 65 22 20 20 29 20 21 3d 20   "ignore"  ) != 
104a0 30 20 26 26 0a 20 20 20 20 20 20 20 73 74 72 63  0 &&.       strc
104b0 6d 70 28 7a 43 6f 6e 66 6c 69 63 74 2c 20 22 72  mp(zConflict, "r
104c0 65 70 6c 61 63 65 22 20 29 20 21 3d 20 30 20 29  eplace" ) != 0 )
104d0 20 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70   {.      Tcl_App
104e0 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
104f0 2c 20 22 45 72 72 6f 72 3a 20 5c 22 22 2c 20 7a  , "Error: \"", z
10500 43 6f 6e 66 6c 69 63 74 2c 20 0a 20 20 20 20 20  Conflict, .     
10510 20 20 20 20 20 20 20 22 5c 22 2c 20 63 6f 6e 66         "\", conf
10520 6c 69 63 74 2d 61 6c 67 6f 72 69 74 68 6d 20 6d  lict-algorithm m
10530 75 73 74 20 62 65 20 6f 6e 65 20 6f 66 3a 20 72  ust be one of: r
10540 6f 6c 6c 62 61 63 6b 2c 20 22 0a 20 20 20 20 20  ollback, ".     
10550 20 20 20 20 20 20 20 22 61 62 6f 72 74 2c 20 66         "abort, f
10560 61 69 6c 2c 20 69 67 6e 6f 72 65 2c 20 6f 72 20  ail, ignore, or 
10570 72 65 70 6c 61 63 65 22 2c 20 30 29 3b 0a 20 20  replace", 0);.  
10580 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
10590 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
105a0 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zSql = sqlite3_m
105b0 70 72 69 6e 74 66 28 22 53 45 4c 45 43 54 20 2a  printf("SELECT *
105c0 20 46 52 4f 4d 20 27 25 71 27 22 2c 20 7a 54 61   FROM '%q'", zTa
105d0 62 6c 65 29 3b 0a 20 20 20 20 69 66 28 20 7a 53  ble);.    if( zS
105e0 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 54  ql==0 ){.      T
105f0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
10600 69 6e 74 65 72 70 2c 20 22 45 72 72 6f 72 3a 20  interp, "Error: 
10610 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 3a 20 22  no such table: "
10620 2c 20 7a 54 61 62 6c 65 2c 20 30 29 3b 0a 20 20  , zTable, 0);.  
10630 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
10640 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
10650 6e 42 79 74 65 20 3d 20 73 74 72 6c 65 6e 33 30  nByte = strlen30
10660 28 7a 53 71 6c 29 3b 0a 20 20 20 20 72 63 20 3d  (zSql);.    rc =
10670 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
10680 28 70 44 62 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20  (pDb->db, zSql, 
10690 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a  -1, &pStmt, 0);.
106a0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
106b0 28 7a 53 71 6c 29 3b 0a 20 20 20 20 69 66 28 20  (zSql);.    if( 
106c0 72 63 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  rc ){.      Tcl_
106d0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
106e0 65 72 70 2c 20 22 45 72 72 6f 72 3a 20 22 2c 20  erp, "Error: ", 
106f0 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70  sqlite3_errmsg(p
10700 44 62 2d 3e 64 62 29 2c 20 30 29 3b 0a 20 20 20  Db->db), 0);.   
10710 20 20 20 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20     nCol = 0;.   
10720 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 43   }else{.      nC
10730 6f 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  ol = sqlite3_col
10740 75 6d 6e 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29  umn_count(pStmt)
10750 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
10760 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
10770 6d 74 29 3b 0a 20 20 20 20 69 66 28 20 6e 43 6f  mt);.    if( nCo
10780 6c 3d 3d 30 20 29 20 7b 0a 20 20 20 20 20 20 72  l==0 ) {.      r
10790 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
107a0 0a 20 20 20 20 7d 0a 20 20 20 20 7a 53 71 6c 20  .    }.    zSql 
107b0 3d 20 6d 61 6c 6c 6f 63 28 20 6e 42 79 74 65 20  = malloc( nByte 
107c0 2b 20 35 30 20 2b 20 6e 43 6f 6c 2a 32 20 29 3b  + 50 + nCol*2 );
107d0 0a 20 20 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30  .    if( zSql==0
107e0 20 29 20 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41   ) {.      Tcl_A
107f0 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
10800 72 70 2c 20 22 45 72 72 6f 72 3a 20 63 61 6e 27  rp, "Error: can'
10810 74 20 6d 61 6c 6c 6f 63 28 29 22 2c 20 30 29 3b  t malloc()", 0);
10820 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
10830 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
10840 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
10850 6e 74 66 28 6e 42 79 74 65 2b 35 30 2c 20 7a 53  ntf(nByte+50, zS
10860 71 6c 2c 20 22 49 4e 53 45 52 54 20 4f 52 20 25  ql, "INSERT OR %
10870 71 20 49 4e 54 4f 20 27 25 71 27 20 56 41 4c 55  q INTO '%q' VALU
10880 45 53 28 3f 22 2c 0a 20 20 20 20 20 20 20 20 20  ES(?",.         
10890 7a 43 6f 6e 66 6c 69 63 74 2c 20 7a 54 61 62 6c  zConflict, zTabl
108a0 65 29 3b 0a 20 20 20 20 6a 20 3d 20 73 74 72 6c  e);.    j = strl
108b0 65 6e 33 30 28 7a 53 71 6c 29 3b 0a 20 20 20 20  en30(zSql);.    
108c0 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 43 6f 6c 3b  for(i=1; i<nCol;
108d0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 7a 53 71   i++){.      zSq
108e0 6c 5b 6a 2b 2b 5d 20 3d 20 27 2c 27 3b 0a 20 20  l[j++] = ',';.  
108f0 20 20 20 20 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d 20      zSql[j++] = 
10900 27 3f 27 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a  '?';.    }.    z
10910 53 71 6c 5b 6a 2b 2b 5d 20 3d 20 27 29 27 3b 0a  Sql[j++] = ')';.
10920 20 20 20 20 7a 53 71 6c 5b 6a 5d 20 3d 20 30 3b      zSql[j] = 0;
10930 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
10940 33 5f 70 72 65 70 61 72 65 28 70 44 62 2d 3e 64  3_prepare(pDb->d
10950 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53  b, zSql, -1, &pS
10960 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 66 72 65  tmt, 0);.    fre
10970 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 69 66 28  e(zSql);.    if(
10980 20 72 63 20 29 7b 0a 20 20 20 20 20 20 54 63 6c   rc ){.      Tcl
10990 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
109a0 74 65 72 70 2c 20 22 45 72 72 6f 72 3a 20 22 2c  terp, "Error: ",
109b0 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
109c0 70 44 62 2d 3e 64 62 29 2c 20 30 29 3b 0a 20 20  pDb->db), 0);.  
109d0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61      sqlite3_fina
109e0 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20  lize(pStmt);.   
109f0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
10a00 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ROR;.    }.    i
10a10 6e 20 3d 20 66 6f 70 65 6e 28 7a 46 69 6c 65 2c  n = fopen(zFile,
10a20 20 22 72 62 22 29 3b 0a 20 20 20 20 69 66 28 20   "rb");.    if( 
10a30 69 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 54  in==0 ){.      T
10a40 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
10a50 69 6e 74 65 72 70 2c 20 22 45 72 72 6f 72 3a 20  interp, "Error: 
10a60 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 66 69 6c 65  cannot open file
10a70 3a 20 22 2c 20 7a 46 69 6c 65 2c 20 4e 55 4c 4c  : ", zFile, NULL
10a80 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
10a90 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
10aa0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
10ab0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
10ac0 20 20 20 20 61 7a 43 6f 6c 20 3d 20 6d 61 6c 6c      azCol = mall
10ad0 6f 63 28 20 73 69 7a 65 6f 66 28 61 7a 43 6f 6c  oc( sizeof(azCol
10ae0 5b 30 5d 29 2a 28 6e 43 6f 6c 2b 31 29 20 29 3b  [0])*(nCol+1) );
10af0 0a 20 20 20 20 69 66 28 20 61 7a 43 6f 6c 3d 3d  .    if( azCol==
10b00 30 20 29 20 7b 0a 20 20 20 20 20 20 54 63 6c 5f  0 ) {.      Tcl_
10b10 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
10b20 65 72 70 2c 20 22 45 72 72 6f 72 3a 20 63 61 6e  erp, "Error: can
10b30 27 74 20 6d 61 6c 6c 6f 63 28 29 22 2c 20 30 29  't malloc()", 0)
10b40 3b 0a 20 20 20 20 20 20 66 63 6c 6f 73 65 28 69  ;.      fclose(i
10b50 6e 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  n);.      return
10b60 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
10b70 7d 0a 20 20 20 20 28 76 6f 69 64 29 73 71 6c 69  }.    (void)sqli
10b80 74 65 33 5f 65 78 65 63 28 70 44 62 2d 3e 64 62  te3_exec(pDb->db
10b90 2c 20 22 42 45 47 49 4e 22 2c 20 30 2c 20 30 2c  , "BEGIN", 0, 0,
10ba0 20 30 29 3b 0a 20 20 20 20 7a 43 6f 6d 6d 69 74   0);.    zCommit
10bb0 20 3d 20 22 43 4f 4d 4d 49 54 22 3b 0a 20 20 20   = "COMMIT";.   
10bc0 20 77 68 69 6c 65 28 20 28 7a 4c 69 6e 65 20 3d   while( (zLine =
10bd0 20 6c 6f 63 61 6c 5f 67 65 74 6c 69 6e 65 28 30   local_getline(0
10be0 2c 20 69 6e 29 29 21 3d 30 20 29 7b 0a 20 20 20  , in))!=0 ){.   
10bf0 20 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20     char *z;.    
10c00 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20    lineno++;.    
10c10 20 20 61 7a 43 6f 6c 5b 30 5d 20 3d 20 7a 4c 69    azCol[0] = zLi
10c20 6e 65 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  ne;.      for(i=
10c30 30 2c 20 7a 3d 7a 4c 69 6e 65 3b 20 2a 7a 3b 20  0, z=zLine; *z; 
10c40 7a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  z++){.        if
10c50 28 20 2a 7a 3d 3d 7a 53 65 70 5b 30 5d 20 26 26  ( *z==zSep[0] &&
10c60 20 73 74 72 6e 63 6d 70 28 7a 2c 20 7a 53 65 70   strncmp(z, zSep
10c70 2c 20 6e 53 65 70 29 3d 3d 30 20 29 7b 0a 20 20  , nSep)==0 ){.  
10c80 20 20 20 20 20 20 20 20 2a 7a 20 3d 20 30 3b 0a          *z = 0;.
10c90 20 20 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20            i++;. 
10ca0 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3c 6e           if( i<n
10cb0 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Col ){.         
10cc0 20 20 20 61 7a 43 6f 6c 5b 69 5d 20 3d 20 26 7a     azCol[i] = &z
10cd0 5b 6e 53 65 70 5d 3b 0a 20 20 20 20 20 20 20 20  [nSep];.        
10ce0 20 20 20 20 7a 20 2b 3d 20 6e 53 65 70 2d 31 3b      z += nSep-1;
10cf0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
10d00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
10d10 20 20 20 20 20 69 66 28 20 69 2b 31 21 3d 6e 43       if( i+1!=nC
10d20 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68  ol ){.        ch
10d30 61 72 20 2a 7a 45 72 72 3b 0a 20 20 20 20 20 20  ar *zErr;.      
10d40 20 20 69 6e 74 20 6e 45 72 72 20 3d 20 73 74 72    int nErr = str
10d50 6c 65 6e 33 30 28 7a 46 69 6c 65 29 20 2b 20 32  len30(zFile) + 2
10d60 30 30 3b 0a 20 20 20 20 20 20 20 20 7a 45 72 72  00;.        zErr
10d70 20 3d 20 6d 61 6c 6c 6f 63 28 6e 45 72 72 29 3b   = malloc(nErr);
10d80 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 45 72  .        if( zEr
10d90 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  r ){.          s
10da0 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
10db0 6e 45 72 72 2c 20 7a 45 72 72 2c 0a 20 20 20 20  nErr, zErr,.    
10dc0 20 20 20 20 20 20 20 20 20 22 45 72 72 6f 72 3a           "Error:
10dd0 20 25 73 20 6c 69 6e 65 20 25 64 3a 20 65 78 70   %s line %d: exp
10de0 65 63 74 65 64 20 25 64 20 63 6f 6c 75 6d 6e 73  ected %d columns
10df0 20 6f 66 20 64 61 74 61 20 62 75 74 20 66 6f 75   of data but fou
10e00 6e 64 20 25 64 22 2c 0a 20 20 20 20 20 20 20 20  nd %d",.        
10e10 20 20 20 20 20 7a 46 69 6c 65 2c 20 6c 69 6e 65       zFile, line
10e20 6e 6f 2c 20 6e 43 6f 6c 2c 20 69 2b 31 29 3b 0a  no, nCol, i+1);.
10e30 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70            Tcl_Ap
10e40 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
10e50 70 2c 20 7a 45 72 72 2c 20 30 29 3b 0a 20 20 20  p, zErr, 0);.   
10e60 20 20 20 20 20 20 20 66 72 65 65 28 7a 45 72 72         free(zErr
10e70 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
10e80 20 20 20 20 20 7a 43 6f 6d 6d 69 74 20 3d 20 22       zCommit = "
10e90 52 4f 4c 4c 42 41 43 4b 22 3b 0a 20 20 20 20 20  ROLLBACK";.     
10ea0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
10eb0 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  }.      for(i=0;
10ec0 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20   i<nCol; i++){. 
10ed0 20 20 20 20 20 20 20 2f 2a 20 63 68 65 63 6b 20         /* check 
10ee0 66 6f 72 20 6e 75 6c 6c 20 64 61 74 61 2c 20 69  for null data, i
10ef0 66 20 73 6f 2c 20 62 69 6e 64 20 61 73 20 6e 75  f so, bind as nu
10f00 6c 6c 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66  ll */.        if
10f10 28 20 28 6e 4e 75 6c 6c 3e 30 20 26 26 20 73 74  ( (nNull>0 && st
10f20 72 63 6d 70 28 61 7a 43 6f 6c 5b 69 5d 2c 20 7a  rcmp(azCol[i], z
10f30 4e 75 6c 6c 29 3d 3d 30 29 0a 20 20 20 20 20 20  Null)==0).      
10f40 20 20 20 20 7c 7c 20 73 74 72 6c 65 6e 33 30 28      || strlen30(
10f50 61 7a 43 6f 6c 5b 69 5d 29 3d 3d 30 20 0a 20 20  azCol[i])==0 .  
10f60 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
10f70 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
10f80 6e 75 6c 6c 28 70 53 74 6d 74 2c 20 69 2b 31 29  null(pStmt, i+1)
10f90 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
10fa0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
10fb0 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 53 74  e3_bind_text(pSt
10fc0 6d 74 2c 20 69 2b 31 2c 20 61 7a 43 6f 6c 5b 69  mt, i+1, azCol[i
10fd0 5d 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54  ], -1, SQLITE_ST
10fe0 41 54 49 43 29 3b 0a 20 20 20 20 20 20 20 20 7d  ATIC);.        }
10ff0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
11000 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d  qlite3_step(pStm
11010 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  t);.      rc = s
11020 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53 74  qlite3_reset(pSt
11030 6d 74 29 3b 0a 20 20 20 20 20 20 66 72 65 65 28  mt);.      free(
11040 7a 4c 69 6e 65 29 3b 0a 20 20 20 20 20 20 69 66  zLine);.      if
11050 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
11060 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41  ){.        Tcl_A
11070 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
11080 72 70 2c 22 45 72 72 6f 72 3a 20 22 2c 20 73 71  rp,"Error: ", sq
11090 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62  lite3_errmsg(pDb
110a0 2d 3e 64 62 29 2c 20 30 29 3b 0a 20 20 20 20 20  ->db), 0);.     
110b0 20 20 20 7a 43 6f 6d 6d 69 74 20 3d 20 22 52 4f     zCommit = "RO
110c0 4c 4c 42 41 43 4b 22 3b 0a 20 20 20 20 20 20 20  LLBACK";.       
110d0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
110e0 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65 28 61      }.    free(a
110f0 7a 43 6f 6c 29 3b 0a 20 20 20 20 66 63 6c 6f 73  zCol);.    fclos
11100 65 28 69 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74  e(in);.    sqlit
11110 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
11120 74 29 3b 0a 20 20 20 20 28 76 6f 69 64 29 73 71  t);.    (void)sq
11130 6c 69 74 65 33 5f 65 78 65 63 28 70 44 62 2d 3e  lite3_exec(pDb->
11140 64 62 2c 20 7a 43 6f 6d 6d 69 74 2c 20 30 2c 20  db, zCommit, 0, 
11150 30 2c 20 30 29 3b 0a 0a 20 20 20 20 69 66 28 20  0, 0);..    if( 
11160 7a 43 6f 6d 6d 69 74 5b 30 5d 20 3d 3d 20 27 43  zCommit[0] == 'C
11170 27 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 73 75  ' ){.      /* su
11180 63 63 65 73 73 2c 20 73 65 74 20 72 65 73 75 6c  ccess, set resul
11190 74 20 61 73 20 6e 75 6d 62 65 72 20 6f 66 20 6c  t as number of l
111a0 69 6e 65 73 20 70 72 6f 63 65 73 73 65 64 20 2a  ines processed *
111b0 2f 0a 20 20 20 20 20 20 70 52 65 73 75 6c 74 20  /.      pResult 
111c0 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75  = Tcl_GetObjResu
111d0 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  lt(interp);.    
111e0 20 20 54 63 6c 5f 53 65 74 49 6e 74 4f 62 6a 28    Tcl_SetIntObj(
111f0 70 52 65 73 75 6c 74 2c 20 6c 69 6e 65 6e 6f 29  pResult, lineno)
11200 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c  ;.      rc = TCL
11210 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  _OK;.    }else{.
11220 20 20 20 20 20 20 2f 2a 20 66 61 69 6c 75 72 65        /* failure
11230 2c 20 61 70 70 65 6e 64 20 6c 69 6e 65 6e 6f 20  , append lineno 
11240 77 68 65 72 65 20 66 61 69 6c 65 64 20 2a 2f 0a  where failed */.
11250 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
11260 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 4c  printf(sizeof(zL
11270 69 6e 65 4e 75 6d 29 2c 20 7a 4c 69 6e 65 4e 75  ineNum), zLineNu
11280 6d 2c 22 25 64 22 2c 6c 69 6e 65 6e 6f 29 3b 0a  m,"%d",lineno);.
11290 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
112a0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 2c  Result(interp,",
112b0 20 66 61 69 6c 65 64 20 77 68 69 6c 65 20 70 72   failed while pr
112c0 6f 63 65 73 73 69 6e 67 20 6c 69 6e 65 3a 20 22  ocessing line: "
112d0 2c 7a 4c 69 6e 65 4e 75 6d 2c 30 29 3b 0a 20 20  ,zLineNum,0);.  
112e0 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45 52 52      rc = TCL_ERR
112f0 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 72  OR;.    }.    br
11300 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  eak;.  }..  /*. 
11310 20 2a 2a 20 20 20 20 24 64 62 20 65 6e 61 62 6c   **    $db enabl
11320 65 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e  e_load_extension
11330 20 42 4f 4f 4c 45 41 4e 0a 20 20 2a 2a 0a 20 20   BOOLEAN.  **.  
11340 2a 2a 20 54 75 72 6e 20 74 68 65 20 65 78 74 65  ** Turn the exte
11350 6e 73 69 6f 6e 20 6c 6f 61 64 69 6e 67 20 66 65  nsion loading fe
11360 61 74 75 72 65 20 6f 6e 20 6f 72 20 6f 66 66 2e  ature on or off.
11370 20 20 49 74 20 69 66 20 6f 66 66 20 62 79 0a 20    It if off by. 
11380 20 2a 2a 20 64 65 66 61 75 6c 74 2e 0a 20 20 2a   ** default..  *
11390 2f 0a 20 20 63 61 73 65 20 44 42 5f 45 4e 41 42  /.  case DB_ENAB
113a0 4c 45 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f  LE_LOAD_EXTENSIO
113b0 4e 3a 20 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  N: {.#ifndef SQL
113c0 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58  ITE_OMIT_LOAD_EX
113d0 54 45 4e 53 49 4f 4e 0a 20 20 20 20 69 6e 74 20  TENSION.    int 
113e0 6f 6e 6f 66 66 3b 0a 20 20 20 20 69 66 28 20 6f  onoff;.    if( o
113f0 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20  bjc!=3 ){.      
11400 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
11410 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76  (interp, 2, objv
11420 2c 20 22 42 4f 4f 4c 45 41 4e 22 29 3b 0a 20 20  , "BOOLEAN");.  
11430 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
11440 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
11450 69 66 28 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65  if( Tcl_GetBoole
11460 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  anFromObj(interp
11470 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 6f 6e 6f 66  , objv[2], &onof
11480 66 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  f) ){.      retu
11490 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
114a0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
114b0 65 6e 61 62 6c 65 5f 6c 6f 61 64 5f 65 78 74 65  enable_load_exte
114c0 6e 73 69 6f 6e 28 70 44 62 2d 3e 64 62 2c 20 6f  nsion(pDb->db, o
114d0 6e 6f 66 66 29 3b 0a 20 20 20 20 62 72 65 61 6b  noff);.    break
114e0 3b 0a 23 65 6c 73 65 0a 20 20 20 20 54 63 6c 5f  ;.#else.    Tcl_
114f0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
11500 65 72 70 2c 20 22 65 78 74 65 6e 73 69 6f 6e 20  erp, "extension 
11510 6c 6f 61 64 69 6e 67 20 69 73 20 74 75 72 6e 65  loading is turne
11520 64 20 6f 66 66 20 61 74 20 63 6f 6d 70 69 6c 65  d off at compile
11530 2d 74 69 6d 65 22 2c 0a 20 20 20 20 20 20 20 20  -time",.        
11540 20 20 20 20 20 20 20 20 20 20 20 20 20 30 29 3b               0);
11550 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
11560 45 52 52 4f 52 3b 0a 23 65 6e 64 69 66 0a 20 20  ERROR;.#endif.  
11570 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20  }..  /*.  **    
11580 24 64 62 20 65 72 72 6f 72 63 6f 64 65 0a 20 20  $db errorcode.  
11590 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 74  **.  ** Return t
115a0 68 65 20 6e 75 6d 65 72 69 63 20 65 72 72 6f 72  he numeric error
115b0 20 63 6f 64 65 20 74 68 61 74 20 77 61 73 20 72   code that was r
115c0 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 6d  eturned by the m
115d0 6f 73 74 20 72 65 63 65 6e 74 0a 20 20 2a 2a 20  ost recent.  ** 
115e0 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f  call to sqlite3_
115f0 65 78 65 63 28 29 2e 0a 20 20 2a 2f 0a 20 20 63  exec()..  */.  c
11600 61 73 65 20 44 42 5f 45 52 52 4f 52 43 4f 44 45  ase DB_ERRORCODE
11610 3a 20 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f  : {.    Tcl_SetO
11620 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
11630 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73   Tcl_NewIntObj(s
11640 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28 70  qlite3_errcode(p
11650 44 62 2d 3e 64 62 29 29 29 3b 0a 20 20 20 20 62  Db->db)));.    b
11660 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a  reak;.  }..  /*.
11670 20 20 2a 2a 20 20 20 20 24 64 62 20 65 78 69 73    **    $db exis
11680 74 73 20 24 73 71 6c 0a 20 20 2a 2a 20 20 20 20  ts $sql.  **    
11690 24 64 62 20 6f 6e 65 63 6f 6c 75 6d 6e 20 24 73  $db onecolumn $s
116a0 71 6c 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  ql.  **.  ** The
116b0 20 6f 6e 65 63 6f 6c 75 6d 6e 20 6d 65 74 68 6f   onecolumn metho
116c0 64 20 69 73 20 74 68 65 20 65 71 75 69 76 61 6c  d is the equival
116d0 65 6e 74 20 6f 66 3a 0a 20 20 2a 2a 20 20 20 20  ent of:.  **    
116e0 20 6c 69 6e 64 65 78 20 5b 24 64 62 20 65 76 61   lindex [$db eva
116f0 6c 20 24 73 71 6c 5d 20 30 0a 20 20 2a 2f 0a 20  l $sql] 0.  */. 
11700 20 63 61 73 65 20 44 42 5f 45 58 49 53 54 53 3a   case DB_EXISTS:
11710 20 0a 20 20 63 61 73 65 20 44 42 5f 4f 4e 45 43   .  case DB_ONEC
11720 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 44 62 45  OLUMN: {.    DbE
11730 76 61 6c 43 6f 6e 74 65 78 74 20 73 45 76 61 6c  valContext sEval
11740 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d  ;.    if( objc!=
11750 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57  3 ){.      Tcl_W
11760 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
11770 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 53 51  rp, 2, objv, "SQ
11780 4c 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  L");.      retur
11790 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
117a0 20 7d 0a 0a 20 20 20 20 64 62 45 76 61 6c 49 6e   }..    dbEvalIn
117b0 69 74 28 26 73 45 76 61 6c 2c 20 70 44 62 2c 20  it(&sEval, pDb, 
117c0 6f 62 6a 76 5b 32 5d 2c 20 30 29 3b 0a 20 20 20  objv[2], 0);.   
117d0 20 72 63 20 3d 20 64 62 45 76 61 6c 53 74 65 70   rc = dbEvalStep
117e0 28 26 73 45 76 61 6c 29 3b 0a 20 20 20 20 69 66  (&sEval);.    if
117f0 28 20 63 68 6f 69 63 65 3d 3d 44 42 5f 4f 4e 45  ( choice==DB_ONE
11800 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20  COLUMN ){.      
11810 69 66 28 20 72 63 3d 3d 54 43 4c 5f 4f 4b 20 29  if( rc==TCL_OK )
11820 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 53 65  {.        Tcl_Se
11830 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
11840 70 2c 20 64 62 45 76 61 6c 43 6f 6c 75 6d 6e 56  p, dbEvalColumnV
11850 61 6c 75 65 28 26 73 45 76 61 6c 2c 20 30 29 29  alue(&sEval, 0))
11860 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
11870 28 20 72 63 3d 3d 54 43 4c 5f 42 52 45 41 4b 20  ( rc==TCL_BREAK 
11880 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 52  ){.        Tcl_R
11890 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  esetResult(inter
118a0 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  p);.      }.    
118b0 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 54 43  }else if( rc==TC
118c0 4c 5f 42 52 45 41 4b 20 7c 7c 20 72 63 3d 3d 54  L_BREAK || rc==T
118d0 43 4c 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 54  CL_OK ){.      T
118e0 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
118f0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 42  interp, Tcl_NewB
11900 6f 6f 6c 65 61 6e 4f 62 6a 28 72 63 3d 3d 54 43  ooleanObj(rc==TC
11910 4c 5f 4f 4b 29 29 3b 0a 20 20 20 20 7d 0a 20 20  L_OK));.    }.  
11920 20 20 64 62 45 76 61 6c 46 69 6e 61 6c 69 7a 65    dbEvalFinalize
11930 28 26 73 45 76 61 6c 29 3b 0a 0a 20 20 20 20 69  (&sEval);..    i
11940 66 28 20 72 63 3d 3d 54 43 4c 5f 42 52 45 41 4b  f( rc==TCL_BREAK
11950 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 54   ){.      rc = T
11960 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  CL_OK;.    }.   
11970 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 20 0a   break;.  }.   .
11980 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 24 64 62    /*.  **    $db
11990 20 65 76 61 6c 20 24 73 71 6c 20 3f 61 72 72 61   eval $sql ?arra
119a0 79 3f 20 3f 7b 20 20 2e 2e 2e 63 6f 64 65 2e 2e  y? ?{  ...code..
119b0 2e 20 7d 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  . }?.  **.  ** T
119c0 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  he SQL statement
119d0 20 69 6e 20 24 73 71 6c 20 69 73 20 65 76 61 6c   in $sql is eval
119e0 75 61 74 65 64 2e 20 20 46 6f 72 20 65 61 63 68  uated.  For each
119f0 20 72 6f 77 2c 20 74 68 65 20 76 61 6c 75 65 73   row, the values
11a00 20 61 72 65 0a 20 20 2a 2a 20 70 6c 61 63 65 64   are.  ** placed
11a10 20 69 6e 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20   in elements of 
11a20 74 68 65 20 61 72 72 61 79 20 6e 61 6d 65 64 20  the array named 
11a30 22 61 72 72 61 79 22 20 61 6e 64 20 2e 2e 2e 63  "array" and ...c
11a40 6f 64 65 2e 2e 2e 20 69 73 20 65 78 65 63 75 74  ode... is execut
11a50 65 64 2e 0a 20 20 2a 2a 20 49 66 20 22 61 72 72  ed..  ** If "arr
11a60 61 79 22 20 61 6e 64 20 22 63 6f 64 65 22 20 61  ay" and "code" a
11a70 72 65 20 6f 6d 69 74 74 65 64 2c 20 74 68 65 6e  re omitted, then
11a80 20 6e 6f 20 63 61 6c 6c 62 61 63 6b 20 69 73 20   no callback is 
11a90 65 76 65 72 79 20 69 6e 76 6f 6b 65 64 2e 0a 20  every invoked.. 
11aa0 20 2a 2a 20 49 66 20 22 61 72 72 61 79 22 20 69   ** If "array" i
11ab0 73 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e  s an empty strin
11ac0 67 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75  g, then the valu
11ad0 65 73 20 61 72 65 20 70 6c 61 63 65 64 20 69 6e  es are placed in
11ae0 20 76 61 72 69 61 62 6c 65 73 0a 20 20 2a 2a 20   variables.  ** 
11af0 74 68 61 74 20 68 61 76 65 20 74 68 65 20 73 61  that have the sa
11b00 6d 65 20 6e 61 6d 65 20 61 73 20 74 68 65 20 66  me name as the f
11b10 69 65 6c 64 73 20 65 78 74 72 61 63 74 65 64 20  ields extracted 
11b20 62 79 20 74 68 65 20 71 75 65 72 79 2e 0a 20 20  by the query..  
11b30 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 45 56 41  */.  case DB_EVA
11b40 4c 3a 20 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a  L: {.    if( obj
11b50 63 3c 33 20 7c 7c 20 6f 62 6a 63 3e 35 20 29 7b  c<3 || objc>5 ){
11b60 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  .      Tcl_Wrong
11b70 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
11b80 32 2c 20 6f 62 6a 76 2c 20 22 53 51 4c 20 3f 41  2, objv, "SQL ?A
11b90 52 52 41 59 2d 4e 41 4d 45 3f 20 3f 53 43 52 49  RRAY-NAME? ?SCRI
11ba0 50 54 3f 22 29 3b 0a 20 20 20 20 20 20 72 65 74  PT?");.      ret
11bb0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
11bc0 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 6f 62     }..    if( ob
11bd0 6a 63 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20 44  jc==3 ){.      D
11be0 62 45 76 61 6c 43 6f 6e 74 65 78 74 20 73 45 76  bEvalContext sEv
11bf0 61 6c 3b 0a 20 20 20 20 20 20 54 63 6c 5f 4f 62  al;.      Tcl_Ob
11c00 6a 20 2a 70 52 65 74 20 3d 20 54 63 6c 5f 4e 65  j *pRet = Tcl_Ne
11c10 77 4f 62 6a 28 29 3b 0a 20 20 20 20 20 20 54 63  wObj();.      Tc
11c20 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70  l_IncrRefCount(p
11c30 52 65 74 29 3b 0a 20 20 20 20 20 20 64 62 45 76  Ret);.      dbEv
11c40 61 6c 49 6e 69 74 28 26 73 45 76 61 6c 2c 20 70  alInit(&sEval, p
11c50 44 62 2c 20 6f 62 6a 76 5b 32 5d 2c 20 30 29 3b  Db, objv[2], 0);
11c60 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 54 43  .      while( TC
11c70 4c 5f 4f 4b 3d 3d 28 72 63 20 3d 20 64 62 45 76  L_OK==(rc = dbEv
11c80 61 6c 53 74 65 70 28 26 73 45 76 61 6c 29 29 20  alStep(&sEval)) 
11c90 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  ){.        int i
11ca0 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43  ;.        int nC
11cb0 6f 6c 3b 0a 20 20 20 20 20 20 20 20 64 62 45 76  ol;.        dbEv
11cc0 61 6c 52 6f 77 49 6e 66 6f 28 26 73 45 76 61 6c  alRowInfo(&sEval
11cd0 2c 20 26 6e 43 6f 6c 2c 20 30 29 3b 0a 20 20 20  , &nCol, 0);.   
11ce0 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
11cf0 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
11d00 20 20 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62        Tcl_ListOb
11d10 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
11d20 6e 74 65 72 70 2c 20 70 52 65 74 2c 20 64 62 45  nterp, pRet, dbE
11d30 76 61 6c 43 6f 6c 75 6d 6e 56 61 6c 75 65 28 26  valColumnValue(&
11d40 73 45 76 61 6c 2c 20 69 29 29 3b 0a 20 20 20 20  sEval, i));.    
11d50 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
11d60 20 20 20 20 64 62 45 76 61 6c 46 69 6e 61 6c 69      dbEvalFinali
11d70 7a 65 28 26 73 45 76 61 6c 29 3b 0a 20 20 20 20  ze(&sEval);.    
11d80 20 20 69 66 28 20 72 63 3d 3d 54 43 4c 5f 42 52    if( rc==TCL_BR
11d90 45 41 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 54  EAK ){.        T
11da0 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
11db0 69 6e 74 65 72 70 2c 20 70 52 65 74 29 3b 0a 20  interp, pRet);. 
11dc0 20 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f         rc = TCL_
11dd0 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OK;.      }.    
11de0 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
11df0 6e 74 28 70 52 65 74 29 3b 0a 20 20 20 20 7d 65  nt(pRet);.    }e
11e00 6c 73 65 7b 0a 20 20 20 20 20 20 43 6c 69 65 6e  lse{.      Clien
11e10 74 44 61 74 61 20 63 64 5b 32 5d 3b 0a 20 20 20  tData cd[2];.   
11e20 20 20 20 44 62 45 76 61 6c 43 6f 6e 74 65 78 74     DbEvalContext
11e30 20 2a 70 3b 0a 20 20 20 20 20 20 54 63 6c 5f 4f   *p;.      Tcl_O
11e40 62 6a 20 2a 70 41 72 72 61 79 20 3d 20 30 3b 0a  bj *pArray = 0;.
11e50 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70        Tcl_Obj *p
11e60 53 63 72 69 70 74 3b 0a 0a 20 20 20 20 20 20 69  Script;..      i
11e70 66 28 20 6f 62 6a 63 3d 3d 35 20 26 26 20 2a 28  f( objc==5 && *(
11e80 63 68 61 72 20 2a 29 54 63 6c 5f 47 65 74 53 74  char *)Tcl_GetSt
11e90 72 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 20 29 7b  ring(objv[3]) ){
11ea0 0a 20 20 20 20 20 20 20 20 70 41 72 72 61 79 20  .        pArray 
11eb0 3d 20 6f 62 6a 76 5b 33 5d 3b 0a 20 20 20 20 20  = objv[3];.     
11ec0 20 7d 0a 20 20 20 20 20 20 70 53 63 72 69 70 74   }.      pScript
11ed0 20 3d 20 6f 62 6a 76 5b 6f 62 6a 63 2d 31 5d 3b   = objv[objc-1];
11ee0 0a 20 20 20 20 20 20 54 63 6c 5f 49 6e 63 72 52  .      Tcl_IncrR
11ef0 65 66 43 6f 75 6e 74 28 70 53 63 72 69 70 74 29  efCount(pScript)
11f00 3b 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20 70  ;.      .      p
11f10 20 3d 20 28 44 62 45 76 61 6c 43 6f 6e 74 65 78   = (DbEvalContex
11f20 74 20 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28 73 69  t *)Tcl_Alloc(si
11f30 7a 65 6f 66 28 44 62 45 76 61 6c 43 6f 6e 74 65  zeof(DbEvalConte
11f40 78 74 29 29 3b 0a 20 20 20 20 20 20 64 62 45 76  xt));.      dbEv
11f50 61 6c 49 6e 69 74 28 70 2c 20 70 44 62 2c 20 6f  alInit(p, pDb, o
11f60 62 6a 76 5b 32 5d 2c 20 70 41 72 72 61 79 29 3b  bjv[2], pArray);
11f70 0a 0a 20 20 20 20 20 20 63 64 5b 30 5d 20 3d 20  ..      cd[0] = 
11f80 28 76 6f 69 64 20 2a 29 70 3b 0a 20 20 20 20 20  (void *)p;.     
11f90 20 63 64 5b 31 5d 20 3d 20 28 76 6f 69 64 20 2a   cd[1] = (void *
11fa0 29 70 53 63 72 69 70 74 3b 0a 20 20 20 20 20 20  )pScript;.      
11fb0 72 63 20 3d 20 44 62 45 76 61 6c 4e 65 78 74 43  rc = DbEvalNextC
11fc0 6d 64 28 63 64 2c 20 69 6e 74 65 72 70 2c 20 54  md(cd, interp, T
11fd0 43 4c 5f 4f 4b 29 3b 0a 20 20 20 20 7d 0a 20 20  CL_OK);.    }.  
11fe0 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
11ff0 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20  /*.  **     $db 
12000 66 75 6e 63 74 69 6f 6e 20 4e 41 4d 45 20 5b 2d  function NAME [-
12010 61 72 67 63 6f 75 6e 74 20 4e 5d 20 53 43 52 49  argcount N] SCRI
12020 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 72 65  PT.  **.  ** Cre
12030 61 74 65 20 61 20 6e 65 77 20 53 51 4c 20 66 75  ate a new SQL fu
12040 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 20 4e 41  nction called NA
12050 4d 45 2e 20 20 57 68 65 6e 65 76 65 72 20 74 68  ME.  Whenever th
12060 61 74 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a 20  at function is. 
12070 20 2a 2a 20 63 61 6c 6c 65 64 2c 20 69 6e 76 6f   ** called, invo
12080 6b 65 20 53 43 52 49 50 54 20 74 6f 20 65 76 61  ke SCRIPT to eva
12090 6c 75 61 74 65 20 74 68 65 20 66 75 6e 63 74 69  luate the functi
120a0 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  on..  */.  case 
120b0 44 42 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20  DB_FUNCTION: {. 
120c0 20 20 20 53 71 6c 46 75 6e 63 20 2a 70 46 75 6e     SqlFunc *pFun
120d0 63 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a  c;.    Tcl_Obj *
120e0 70 53 63 72 69 70 74 3b 0a 20 20 20 20 63 68 61  pScript;.    cha
120f0 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 6e  r *zName;.    in
12100 74 20 6e 41 72 67 20 3d 20 2d 31 3b 0a 20 20 20  t nArg = -1;.   
12110 20 69 66 28 20 6f 62 6a 63 3d 3d 36 20 29 7b 0a   if( objc==6 ){.
12120 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
12130 20 2a 7a 20 3d 20 54 63 6c 5f 47 65 74 53 74 72   *z = Tcl_GetStr
12140 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a 20 20  ing(objv[3]);.  
12150 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 74 72 6c      int n = strl
12160 65 6e 33 30 28 7a 29 3b 0a 20 20 20 20 20 20 69  en30(z);.      i
12170 66 28 20 6e 3e 32 20 26 26 20 73 74 72 6e 63 6d  f( n>2 && strncm
12180 70 28 7a 2c 20 22 2d 61 72 67 63 6f 75 6e 74 22  p(z, "-argcount"
12190 2c 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ,n)==0 ){.      
121a0 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
121b0 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
121c0 6f 62 6a 76 5b 34 5d 2c 20 26 6e 41 72 67 29 20  objv[4], &nArg) 
121d0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
121e0 4f 52 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  OR;.        if( 
121f0 6e 41 72 67 3c 30 20 29 7b 0a 20 20 20 20 20 20  nArg<0 ){.      
12200 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
12210 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 6e 75  sult(interp, "nu
12220 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
12230 73 20 6d 75 73 74 20 62 65 20 6e 6f 6e 2d 6e 65  s must be non-ne
12240 67 61 74 69 76 65 22 2c 0a 20 20 20 20 20 20 20  gative",.       
12250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12260 20 20 20 20 28 63 68 61 72 2a 29 30 29 3b 0a 20      (char*)0);. 
12270 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
12280 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  TCL_ERROR;.     
12290 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
122a0 20 20 20 70 53 63 72 69 70 74 20 3d 20 6f 62 6a     pScript = obj
122b0 76 5b 35 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 20  v[5];.    }else 
122c0 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20  if( objc!=4 ){. 
122d0 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
122e0 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
122f0 20 6f 62 6a 76 2c 20 22 4e 41 4d 45 20 5b 2d 61   objv, "NAME [-a
12300 72 67 63 6f 75 6e 74 20 4e 5d 20 53 43 52 49 50  rgcount N] SCRIP
12310 54 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  T");.      retur
12320 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
12330 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 53   }else{.      pS
12340 63 72 69 70 74 20 3d 20 6f 62 6a 76 5b 33 5d 3b  cript = objv[3];
12350 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4e 61 6d 65  .    }.    zName
12360 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
12370 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c  FromObj(objv[2],
12380 20 30 29 3b 0a 20 20 20 20 70 46 75 6e 63 20 3d   0);.    pFunc =
12390 20 66 69 6e 64 53 71 6c 46 75 6e 63 28 70 44 62   findSqlFunc(pDb
123a0 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66  , zName);.    if
123b0 28 20 70 46 75 6e 63 3d 3d 30 20 29 20 72 65 74  ( pFunc==0 ) ret
123c0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
123d0 20 20 20 69 66 28 20 70 46 75 6e 63 2d 3e 70 53     if( pFunc->pS
123e0 63 72 69 70 74 20 29 7b 0a 20 20 20 20 20 20 54  cript ){.      T
123f0 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
12400 70 46 75 6e 63 2d 3e 70 53 63 72 69 70 74 29 3b  pFunc->pScript);
12410 0a 20 20 20 20 7d 0a 20 20 20 20 70 46 75 6e 63  .    }.    pFunc
12420 2d 3e 70 53 63 72 69 70 74 20 3d 20 70 53 63 72  ->pScript = pScr
12430 69 70 74 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 63  ipt;.    Tcl_Inc
12440 72 52 65 66 43 6f 75 6e 74 28 70 53 63 72 69 70  rRefCount(pScrip
12450 74 29 3b 0a 20 20 20 20 70 46 75 6e 63 2d 3e 75  t);.    pFunc->u
12460 73 65 45 76 61 6c 4f 62 6a 76 20 3d 20 73 61 66  seEvalObjv = saf
12470 65 54 6f 55 73 65 45 76 61 6c 4f 62 6a 76 28 69  eToUseEvalObjv(i
12480 6e 74 65 72 70 2c 20 70 53 63 72 69 70 74 29 3b  nterp, pScript);
12490 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
124a0 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
124b0 6e 28 70 44 62 2d 3e 64 62 2c 20 7a 4e 61 6d 65  n(pDb->db, zName
124c0 2c 20 6e 41 72 67 2c 20 53 51 4c 49 54 45 5f 55  , nArg, SQLITE_U
124d0 54 46 38 2c 0a 20 20 20 20 20 20 20 20 70 46 75  TF8,.        pFu
124e0 6e 63 2c 20 74 63 6c 53 71 6c 46 75 6e 63 2c 20  nc, tclSqlFunc, 
124f0 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  0, 0);.    if( r
12500 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
12510 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45        rc = TCL_E
12520 52 52 4f 52 3b 0a 20 20 20 20 20 20 54 63 6c 5f  RROR;.      Tcl_
12530 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
12540 2c 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  , (char *)sqlite
12550 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62  3_errmsg(pDb->db
12560 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29  ), TCL_VOLATILE)
12570 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61  ;.    }.    brea
12580 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  k;.  }..  /*.  *
12590 2a 20 20 20 20 20 24 64 62 20 69 6e 63 72 62 6c  *     $db incrbl
125a0 6f 62 20 3f 2d 72 65 61 64 6f 6e 6c 79 3f 20 3f  ob ?-readonly? ?
125b0 44 42 3f 20 54 41 42 4c 45 20 43 4f 4c 55 4d 4e  DB? TABLE COLUMN
125c0 20 52 4f 57 49 44 0a 20 20 2a 2f 0a 20 20 63 61   ROWID.  */.  ca
125d0 73 65 20 44 42 5f 49 4e 43 52 42 4c 4f 42 3a 20  se DB_INCRBLOB: 
125e0 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
125f0 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20  OMIT_INCRBLOB.  
12600 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
12610 6c 74 28 69 6e 74 65 72 70 2c 20 22 69 6e 63 72  lt(interp, "incr
12620 62 6c 6f 62 20 6e 6f 74 20 61 76 61 69 6c 61 62  blob not availab
12630 6c 65 20 69 6e 20 74 68 69 73 20 62 75 69 6c 64  le in this build
12640 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
12650 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c  n TCL_ERROR;.#el
12660 73 65 0a 20 20 20 20 69 6e 74 20 69 73 52 65 61  se.    int isRea
12670 64 6f 6e 6c 79 20 3d 20 30 3b 0a 20 20 20 20 63  donly = 0;.    c
12680 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d  onst char *zDb =
12690 20 22 6d 61 69 6e 22 3b 0a 20 20 20 20 63 6f 6e   "main";.    con
126a0 73 74 20 63 68 61 72 20 2a 7a 54 61 62 6c 65 3b  st char *zTable;
126b0 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
126c0 2a 7a 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 73 71  *zColumn;.    sq
126d0 6c 69 74 65 5f 69 6e 74 36 34 20 69 52 6f 77 3b  lite_int64 iRow;
126e0 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 66  ..    /* Check f
126f0 6f 72 20 74 68 65 20 2d 72 65 61 64 6f 6e 6c 79  or the -readonly
12700 20 6f 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 69   option */.    i
12710 66 28 20 6f 62 6a 63 3e 33 20 26 26 20 73 74 72  f( objc>3 && str
12720 63 6d 70 28 54 63 6c 5f 47 65 74 53 74 72 69 6e  cmp(Tcl_GetStrin
12730 67 28 6f 62 6a 76 5b 32 5d 29 2c 20 22 2d 72 65  g(objv[2]), "-re
12740 61 64 6f 6e 6c 79 22 29 3d 3d 30 20 29 7b 0a 20  adonly")==0 ){. 
12750 20 20 20 20 20 69 73 52 65 61 64 6f 6e 6c 79 20       isReadonly 
12760 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  = 1;.    }..    
12770 69 66 28 20 6f 62 6a 63 21 3d 28 35 2b 69 73 52  if( objc!=(5+isR
12780 65 61 64 6f 6e 6c 79 29 20 26 26 20 6f 62 6a 63  eadonly) && objc
12790 21 3d 28 36 2b 69 73 52 65 61 64 6f 6e 6c 79 29  !=(6+isReadonly)
127a0 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72   ){.      Tcl_Wr
127b0 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
127c0 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 2d 72  p, 2, objv, "?-r
127d0 65 61 64 6f 6e 6c 79 3f 20 3f 44 42 3f 20 54 41  eadonly? ?DB? TA
127e0 42 4c 45 20 43 4f 4c 55 4d 4e 20 52 4f 57 49 44  BLE COLUMN ROWID
127f0 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
12800 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
12810 7d 0a 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3d  }..    if( objc=
12820 3d 28 36 2b 69 73 52 65 61 64 6f 6e 6c 79 29 20  =(6+isReadonly) 
12830 29 7b 0a 20 20 20 20 20 20 7a 44 62 20 3d 20 54  ){.      zDb = T
12840 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
12850 76 5b 32 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20  v[2]);.    }.   
12860 20 7a 54 61 62 6c 65 20 3d 20 54 63 6c 5f 47 65   zTable = Tcl_Ge
12870 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 6f 62 6a  tString(objv[obj
12880 63 2d 33 5d 29 3b 0a 20 20 20 20 7a 43 6f 6c 75  c-3]);.    zColu
12890 6d 6e 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  mn = Tcl_GetStri
128a0 6e 67 28 6f 62 6a 76 5b 6f 62 6a 63 2d 32 5d 29  ng(objv[objc-2])
128b0 3b 0a 20 20 20 20 72 63 20 3d 20 54 63 6c 5f 47  ;.    rc = Tcl_G
128c0 65 74 57 69 64 65 49 6e 74 46 72 6f 6d 4f 62 6a  etWideIntFromObj
128d0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 6f 62  (interp, objv[ob
128e0 6a 63 2d 31 5d 2c 20 26 69 52 6f 77 29 3b 0a 0a  jc-1], &iRow);..
128f0 20 20 20 20 69 66 28 20 72 63 3d 3d 54 43 4c 5f      if( rc==TCL_
12900 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
12910 20 63 72 65 61 74 65 49 6e 63 72 62 6c 6f 62 43   createIncrblobC
12920 68 61 6e 6e 65 6c 28 0a 20 20 20 20 20 20 20 20  hannel(.        
12930 20 20 69 6e 74 65 72 70 2c 20 70 44 62 2c 20 7a    interp, pDb, z
12940 44 62 2c 20 7a 54 61 62 6c 65 2c 20 7a 43 6f 6c  Db, zTable, zCol
12950 75 6d 6e 2c 20 69 52 6f 77 2c 20 69 73 52 65 61  umn, iRow, isRea
12960 64 6f 6e 6c 79 0a 20 20 20 20 20 20 29 3b 0a 20  donly.      );. 
12970 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
12980 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
12990 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20 69 6e  .  **     $db in
129a0 74 65 72 72 75 70 74 0a 20 20 2a 2a 0a 20 20 2a  terrupt.  **.  *
129b0 2a 20 49 6e 74 65 72 72 75 70 74 20 74 68 65 20  * Interrupt the 
129c0 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 74 68 65  execution of the
129d0 20 69 6e 6e 65 72 2d 6d 6f 73 74 20 53 51 4c 20   inner-most SQL 
129e0 69 6e 74 65 72 70 72 65 74 65 72 2e 20 20 54 68  interpreter.  Th
129f0 69 73 0a 20 20 2a 2a 20 63 61 75 73 65 73 20 74  is.  ** causes t
12a00 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  he SQL statement
12a10 20 74 6f 20 72 65 74 75 72 6e 20 61 6e 20 65 72   to return an er
12a20 72 6f 72 20 6f 66 20 53 51 4c 49 54 45 5f 49 4e  ror of SQLITE_IN
12a30 54 45 52 52 55 50 54 2e 0a 20 20 2a 2f 0a 20 20  TERRUPT..  */.  
12a40 63 61 73 65 20 44 42 5f 49 4e 54 45 52 52 55 50  case DB_INTERRUP
12a50 54 3a 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  T: {.    sqlite3
12a60 5f 69 6e 74 65 72 72 75 70 74 28 70 44 62 2d 3e  _interrupt(pDb->
12a70 64 62 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a  db);.    break;.
12a80 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20    }..  /*.  **  
12a90 20 20 20 24 64 62 20 6e 75 6c 6c 76 61 6c 75 65     $db nullvalue
12aa0 20 3f 53 54 52 49 4e 47 3f 0a 20 20 2a 2a 0a 20   ?STRING?.  **. 
12ab0 20 2a 2a 20 43 68 61 6e 67 65 20 74 65 78 74 20   ** Change text 
12ac0 75 73 65 64 20 77 68 65 6e 20 61 20 4e 55 4c 4c  used when a NULL
12ad0 20 63 6f 6d 65 73 20 62 61 63 6b 20 66 72 6f 6d   comes back from
12ae0 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 49   the database. I
12af0 66 20 3f 53 54 52 49 4e 47 3f 0a 20 20 2a 2a 20  f ?STRING?.  ** 
12b00 69 73 20 6e 6f 74 20 70 72 65 73 65 6e 74 2c 20  is not present, 
12b10 74 68 65 6e 20 74 68 65 20 63 75 72 72 65 6e 74  then the current
12b20 20 73 74 72 69 6e 67 20 75 73 65 64 20 66 6f 72   string used for
12b30 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65   NULL is returne
12b40 64 2e 0a 20 20 2a 2a 20 49 66 20 53 54 52 49 4e  d..  ** If STRIN
12b50 47 20 69 73 20 70 72 65 73 65 6e 74 2c 20 74 68  G is present, th
12b60 65 6e 20 53 54 52 49 4e 47 20 69 73 20 72 65 74  en STRING is ret
12b70 75 72 6e 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2f  urned..  **.  */
12b80 0a 20 20 63 61 73 65 20 44 42 5f 4e 55 4c 4c 56  .  case DB_NULLV
12b90 41 4c 55 45 3a 20 7b 0a 20 20 20 20 69 66 28 20  ALUE: {.    if( 
12ba0 6f 62 6a 63 21 3d 32 20 26 26 20 6f 62 6a 63 21  objc!=2 && objc!
12bb0 3d 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  =3 ){.      Tcl_
12bc0 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
12bd0 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 4e  erp, 2, objv, "N
12be0 55 4c 4c 56 41 4c 55 45 22 29 3b 0a 20 20 20 20  ULLVALUE");.    
12bf0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
12c00 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  OR;.    }.    if
12c10 28 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20 20 20  ( objc==3 ){.   
12c20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20     int len;.    
12c30 20 20 63 68 61 72 20 2a 7a 4e 75 6c 6c 20 3d 20    char *zNull = 
12c40 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
12c50 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c  mObj(objv[2], &l
12c60 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  en);.      if( p
12c70 44 62 2d 3e 7a 4e 75 6c 6c 20 29 7b 0a 20 20 20  Db->zNull ){.   
12c80 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44       Tcl_Free(pD
12c90 62 2d 3e 7a 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  b->zNull);.     
12ca0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 4e 75   }.      if( zNu
12cb0 6c 6c 20 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20  ll && len>0 ){. 
12cc0 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e 75 6c         pDb->zNul
12cd0 6c 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c  l = Tcl_Alloc( l
12ce0 65 6e 20 2b 20 31 20 29 3b 0a 20 20 20 20 20 20  en + 1 );.      
12cf0 20 20 6d 65 6d 63 70 79 28 70 44 62 2d 3e 7a 4e    memcpy(pDb->zN
12d00 75 6c 6c 2c 20 7a 4e 75 6c 6c 2c 20 6c 65 6e 29  ull, zNull, len)
12d10 3b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a  ;.        pDb->z
12d20 4e 75 6c 6c 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27  Null[len] = '\0'
12d30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
12d40 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e 75 6c         pDb->zNul
12d50 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  l = 0;.      }. 
12d60 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 53 65 74     }.    Tcl_Set
12d70 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
12d80 2c 20 64 62 54 65 78 74 54 6f 4f 62 6a 28 70 44  , dbTextToObj(pD
12d90 62 2d 3e 7a 4e 75 6c 6c 29 29 3b 0a 20 20 20 20  b->zNull));.    
12da0 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
12db0 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20 6c 61  .  **     $db la
12dc0 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 20  st_insert_rowid 
12dd0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72  .  **.  ** Retur
12de0 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69  n an integer whi
12df0 63 68 20 69 73 20 74 68 65 20 52 4f 57 49 44 20  ch is the ROWID 
12e00 66 6f 72 20 74 68 65 20 6d 6f 73 74 20 72 65 63  for the most rec
12e10 65 6e 74 20 69 6e 73 65 72 74 2e 0a 20 20 2a 2f  ent insert..  */
12e20 0a 20 20 63 61 73 65 20 44 42 5f 4c 41 53 54 5f  .  case DB_LAST_
12e30 49 4e 53 45 52 54 5f 52 4f 57 49 44 3a 20 7b 0a  INSERT_ROWID: {.
12e40 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65      Tcl_Obj *pRe
12e50 73 75 6c 74 3b 0a 20 20 20 20 54 63 6c 5f 57 69  sult;.    Tcl_Wi
12e60 64 65 49 6e 74 20 72 6f 77 69 64 3b 0a 20 20 20  deInt rowid;.   
12e70 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a   if( objc!=2 ){.
12e80 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
12e90 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
12ea0 2c 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 20 20 20  , objv, "");.   
12eb0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
12ec0 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  ROR;.    }.    r
12ed0 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33 5f 6c  owid = sqlite3_l
12ee0 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64  ast_insert_rowid
12ef0 28 70 44 62 2d 3e 64 62 29 3b 0a 20 20 20 20 70  (pDb->db);.    p
12f00 52 65 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65 74  Result = Tcl_Get
12f10 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
12f20 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 57 69  );.    Tcl_SetWi
12f30 64 65 49 6e 74 4f 62 6a 28 70 52 65 73 75 6c 74  deIntObj(pResult
12f40 2c 20 72 6f 77 69 64 29 3b 0a 20 20 20 20 62 72  , rowid);.    br
12f50 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  eak;.  }..  /*. 
12f60 20 2a 2a 20 54 68 65 20 44 42 5f 4f 4e 45 43 4f   ** The DB_ONECO
12f70 4c 55 4d 4e 20 6d 65 74 68 6f 64 20 69 73 20 69  LUMN method is i
12f80 6d 70 6c 65 6d 65 6e 74 65 64 20 74 6f 67 65 74  mplemented toget
12f90 68 65 72 20 77 69 74 68 20 44 42 5f 45 58 49 53  her with DB_EXIS
12fa0 54 53 2e 0a 20 20 2a 2f 0a 0a 20 20 2f 2a 20 20  TS..  */..  /*  
12fb0 20 20 24 64 62 20 70 72 6f 67 72 65 73 73 20 3f    $db progress ?
12fc0 4e 20 43 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a  N CALLBACK?.  **
12fd0 20 0a 20 20 2a 2a 20 49 6e 76 6f 6b 65 20 74 68   .  ** Invoke th
12fe0 65 20 67 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b  e given callback
12ff0 20 65 76 65 72 79 20 4e 20 76 69 72 74 75 61 6c   every N virtual
13000 20 6d 61 63 68 69 6e 65 20 6f 70 63 6f 64 65 73   machine opcodes
13010 20 77 68 69 6c 65 20 65 78 65 63 75 74 69 6e 67   while executing
13020 0a 20 20 2a 2a 20 71 75 65 72 69 65 73 2e 0a 20  .  ** queries.. 
13030 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 50 52   */.  case DB_PR
13040 4f 47 52 45 53 53 3a 20 7b 0a 20 20 20 20 69 66  OGRESS: {.    if
13050 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20  ( objc==2 ){.   
13060 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f     if( pDb->zPro
13070 67 72 65 73 73 20 29 7b 0a 20 20 20 20 20 20 20  gress ){.       
13080 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
13090 74 28 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a  t(interp, pDb->z
130a0 50 72 6f 67 72 65 73 73 2c 20 30 29 3b 0a 20 20  Progress, 0);.  
130b0 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
130c0 69 66 28 20 6f 62 6a 63 3d 3d 34 20 29 7b 0a 20  if( objc==4 ){. 
130d0 20 20 20 20 20 63 68 61 72 20 2a 7a 50 72 6f 67       char *zProg
130e0 72 65 73 73 3b 0a 20 20 20 20 20 20 69 6e 74 20  ress;.      int 
130f0 6c 65 6e 3b 0a 20 20 20 20 20 20 69 6e 74 20 4e  len;.      int N
13100 3b 0a 20 20 20 20 20 20 69 66 28 20 54 43 4c 5f  ;.      if( TCL_
13110 4f 4b 21 3d 54 63 6c 5f 47 65 74 49 6e 74 46 72  OK!=Tcl_GetIntFr
13120 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
13130 6a 76 5b 32 5d 2c 20 26 4e 29 20 29 7b 0a 20 20  jv[2], &N) ){.  
13140 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
13150 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 3b  _ERROR;.      };
13160 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e  .      if( pDb->
13170 7a 50 72 6f 67 72 65 73 73 20 29 7b 0a 20 20 20  zProgress ){.   
13180 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44       Tcl_Free(pD
13190 62 2d 3e 7a 50 72 6f 67 72 65 73 73 29 3b 0a 20  b->zProgress);. 
131a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 50 72       }.      zPr
131b0 6f 67 72 65 73 73 20 3d 20 54 63 6c 5f 47 65 74  ogress = Tcl_Get
131c0 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
131d0 6a 76 5b 33 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20  jv[3], &len);.  
131e0 20 20 20 20 69 66 28 20 7a 50 72 6f 67 72 65 73      if( zProgres
131f0 73 20 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20 20  s && len>0 ){.  
13200 20 20 20 20 20 20 70 44 62 2d 3e 7a 50 72 6f 67        pDb->zProg
13210 72 65 73 73 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63  ress = Tcl_Alloc
13220 28 20 6c 65 6e 20 2b 20 31 20 29 3b 0a 20 20 20  ( len + 1 );.   
13230 20 20 20 20 20 6d 65 6d 63 70 79 28 70 44 62 2d       memcpy(pDb-
13240 3e 7a 50 72 6f 67 72 65 73 73 2c 20 7a 50 72 6f  >zProgress, zPro
13250 67 72 65 73 73 2c 20 6c 65 6e 2b 31 29 3b 0a 20  gress, len+1);. 
13260 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
13270 20 20 20 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65      pDb->zProgre
13280 73 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  ss = 0;.      }.
13290 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
132a0 4d 49 54 5f 50 52 4f 47 52 45 53 53 5f 43 41 4c  MIT_PROGRESS_CAL
132b0 4c 42 41 43 4b 0a 20 20 20 20 20 20 69 66 28 20  LBACK.      if( 
132c0 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 20 29  pDb->zProgress )
132d0 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 69  {.        pDb->i
132e0 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a  nterp = interp;.
132f0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
13300 70 72 6f 67 72 65 73 73 5f 68 61 6e 64 6c 65 72  progress_handler
13310 28 70 44 62 2d 3e 64 62 2c 20 4e 2c 20 44 62 50  (pDb->db, N, DbP
13320 72 6f 67 72 65 73 73 48 61 6e 64 6c 65 72 2c 20  rogressHandler, 
13330 70 44 62 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  pDb);.      }els
13340 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
13350 65 33 5f 70 72 6f 67 72 65 73 73 5f 68 61 6e 64  e3_progress_hand
13360 6c 65 72 28 70 44 62 2d 3e 64 62 2c 20 30 2c 20  ler(pDb->db, 0, 
13370 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23  0, 0);.      }.#
13380 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b  endif.    }else{
13390 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  .      Tcl_Wrong
133a0 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
133b0 32 2c 20 6f 62 6a 76 2c 20 22 4e 20 43 41 4c 4c  2, objv, "N CALL
133c0 42 41 43 4b 22 29 3b 0a 20 20 20 20 20 20 72 65  BACK");.      re
133d0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
133e0 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b      }.    break;
133f0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64  .  }..  /*    $d
13400 62 20 70 72 6f 66 69 6c 65 20 3f 43 41 4c 4c 42  b profile ?CALLB
13410 41 43 4b 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d  ACK?.  **.  ** M
13420 61 6b 65 20 61 72 72 61 6e 67 65 6d 65 6e 74 73  ake arrangements
13430 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20 43   to invoke the C
13440 41 4c 4c 42 41 43 4b 20 72 6f 75 74 69 6e 65 20  ALLBACK routine 
13450 61 66 74 65 72 20 65 61 63 68 20 53 51 4c 20 73  after each SQL s
13460 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 68  tatement.  ** th
13470 61 74 20 68 61 73 20 72 75 6e 2e 20 20 54 68 65  at has run.  The
13480 20 74 65 78 74 20 6f 66 20 74 68 65 20 53 51 4c   text of the SQL
13490 20 61 6e 64 20 74 68 65 20 61 6d 6f 75 6e 74 20   and the amount 
134a0 6f 66 20 65 6c 61 70 73 65 20 74 69 6d 65 20 61  of elapse time a
134b0 72 65 0a 20 20 2a 2a 20 61 70 70 65 6e 64 65 64  re.  ** appended
134c0 20 74 6f 20 43 41 4c 4c 42 41 43 4b 20 62 65 66   to CALLBACK bef
134d0 6f 72 65 20 74 68 65 20 73 63 72 69 70 74 20 69  ore the script i
134e0 73 20 72 75 6e 2e 0a 20 20 2a 2f 0a 20 20 63 61  s run..  */.  ca
134f0 73 65 20 44 42 5f 50 52 4f 46 49 4c 45 3a 20 7b  se DB_PROFILE: {
13500 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 33 20  .    if( objc>3 
13510 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f  ){.      Tcl_Wro
13520 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
13530 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 43 41 4c  , 2, objv, "?CAL
13540 4c 42 41 43 4b 3f 22 29 3b 0a 20 20 20 20 20 20  LBACK?");.      
13550 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
13560 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
13570 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20 20  objc==2 ){.     
13580 20 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f 66 69   if( pDb->zProfi
13590 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63  le ){.        Tc
135a0 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
135b0 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a 50 72 6f  nterp, pDb->zPro
135c0 66 69 6c 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  file, 0);.      
135d0 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
135e0 20 20 20 63 68 61 72 20 2a 7a 50 72 6f 66 69 6c     char *zProfil
135f0 65 3b 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e  e;.      int len
13600 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d  ;.      if( pDb-
13610 3e 7a 50 72 6f 66 69 6c 65 20 29 7b 0a 20 20 20  >zProfile ){.   
13620 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44       Tcl_Free(pD
13630 62 2d 3e 7a 50 72 6f 66 69 6c 65 29 3b 0a 20 20  b->zProfile);.  
13640 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 50 72 6f      }.      zPro
13650 66 69 6c 65 20 3d 20 54 63 6c 5f 47 65 74 53 74  file = Tcl_GetSt
13660 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
13670 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20  [2], &len);.    
13680 20 20 69 66 28 20 7a 50 72 6f 66 69 6c 65 20 26    if( zProfile &
13690 26 20 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20  & len>0 ){.     
136a0 20 20 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65     pDb->zProfile
136b0 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65   = Tcl_Alloc( le
136c0 6e 20 2b 20 31 20 29 3b 0a 20 20 20 20 20 20 20  n + 1 );.       
136d0 20 6d 65 6d 63 70 79 28 70 44 62 2d 3e 7a 50 72   memcpy(pDb->zPr
136e0 6f 66 69 6c 65 2c 20 7a 50 72 6f 66 69 6c 65 2c  ofile, zProfile,
136f0 20 6c 65 6e 2b 31 29 3b 0a 20 20 20 20 20 20 7d   len+1);.      }
13700 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 44  else{.        pD
13710 62 2d 3e 7a 50 72 6f 66 69 6c 65 20 3d 20 30 3b  b->zProfile = 0;
13720 0a 20 20 20 20 20 20 7d 0a 23 69 66 20 21 64 65  .      }.#if !de
13730 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
13740 54 5f 54 52 41 43 45 29 20 26 26 20 21 64 65 66  T_TRACE) && !def
13750 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
13760 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 29  _FLOATING_POINT)
13770 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e  .      if( pDb->
13780 7a 50 72 6f 66 69 6c 65 20 29 7b 0a 20 20 20 20  zProfile ){.    
13790 20 20 20 20 70 44 62 2d 3e 69 6e 74 65 72 70 20      pDb->interp 
137a0 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 20 20  = interp;.      
137b0 20 20 73 71 6c 69 74 65 33 5f 70 72 6f 66 69 6c    sqlite3_profil
137c0 65 28 70 44 62 2d 3e 64 62 2c 20 44 62 50 72 6f  e(pDb->db, DbPro
137d0 66 69 6c 65 48 61 6e 64 6c 65 72 2c 20 70 44 62  fileHandler, pDb
137e0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
137f0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
13800 70 72 6f 66 69 6c 65 28 70 44 62 2d 3e 64 62 2c  profile(pDb->db,
13810 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a   0, 0);.      }.
13820 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20  #endif.    }.   
13830 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
13840 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20 72  *.  **     $db r
13850 65 6b 65 79 20 4b 45 59 0a 20 20 2a 2a 0a 20 20  ekey KEY.  **.  
13860 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 65 6e  ** Change the en
13870 63 72 79 70 74 69 6f 6e 20 6b 65 79 20 6f 6e 20  cryption key on 
13880 74 68 65 20 63 75 72 72 65 6e 74 6c 79 20 6f 70  the currently op
13890 65 6e 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a  en database..  *
138a0 2f 0a 20 20 63 61 73 65 20 44 42 5f 52 45 4b 45  /.  case DB_REKE
138b0 59 3a 20 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  Y: {.#ifdef SQLI
138c0 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 20  TE_HAS_CODEC.   
138d0 20 69 6e 74 20 6e 4b 65 79 3b 0a 20 20 20 20 76   int nKey;.    v
138e0 6f 69 64 20 2a 70 4b 65 79 3b 0a 23 65 6e 64 69  oid *pKey;.#endi
138f0 66 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d  f.    if( objc!=
13900 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57  3 ){.      Tcl_W
13910 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
13920 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 4b 45  rp, 2, objv, "KE
13930 59 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  Y");.      retur
13940 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
13950 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
13960 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 20 20 70  _HAS_CODEC.    p
13970 4b 65 79 20 3d 20 54 63 6c 5f 47 65 74 42 79 74  Key = Tcl_GetByt
13980 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6f 62  eArrayFromObj(ob
13990 6a 76 5b 32 5d 2c 20 26 6e 4b 65 79 29 3b 0a 20  jv[2], &nKey);. 
139a0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
139b0 72 65 6b 65 79 28 70 44 62 2d 3e 64 62 2c 20 70  rekey(pDb->db, p
139c0 4b 65 79 2c 20 6e 4b 65 79 29 3b 0a 20 20 20 20  Key, nKey);.    
139d0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
139e0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
139f0 28 69 6e 74 65 72 70 2c 20 73 71 6c 69 74 65 33  (interp, sqlite3
13a00 45 72 72 53 74 72 28 72 63 29 2c 20 30 29 3b 0a  ErrStr(rc), 0);.
13a10 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45        rc = TCL_E
13a20 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  RROR;.    }.#end
13a30 69 66 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  if.    break;.  
13a40 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 72  }..  /*    $db r
13a50 65 73 74 6f 72 65 20 3f 44 41 54 41 42 41 53 45  estore ?DATABASE
13a60 3f 20 46 49 4c 45 4e 41 4d 45 0a 20 20 2a 2a 0a  ? FILENAME.  **.
13a70 20 20 2a 2a 20 4f 70 65 6e 20 61 20 64 61 74 61    ** Open a data
13a80 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 64 20  base file named 
13a90 46 49 4c 45 4e 41 4d 45 2e 20 20 54 72 61 6e 73  FILENAME.  Trans
13aa0 66 65 72 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  fer the content 
13ab0 0a 20 20 2a 2a 20 6f 66 20 46 49 4c 45 4e 41 4d  .  ** of FILENAM
13ac0 45 20 69 6e 74 6f 20 74 68 65 20 6c 6f 63 61 6c  E into the local
13ad0 20 64 61 74 61 62 61 73 65 20 44 41 54 41 42 41   database DATABA
13ae0 53 45 20 28 64 65 66 61 75 6c 74 3a 20 22 6d 61  SE (default: "ma
13af0 69 6e 22 29 2e 0a 20 20 2a 2f 0a 20 20 63 61 73  in")..  */.  cas
13b00 65 20 44 42 5f 52 45 53 54 4f 52 45 3a 20 7b 0a  e DB_RESTORE: {.
13b10 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
13b20 7a 53 72 63 46 69 6c 65 3b 0a 20 20 20 20 63 6f  zSrcFile;.    co
13b30 6e 73 74 20 63 68 61 72 20 2a 7a 44 65 73 74 44  nst char *zDestD
13b40 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a  b;.    sqlite3 *
13b50 70 53 72 63 3b 0a 20 20 20 20 73 71 6c 69 74 65  pSrc;.    sqlite
13b60 33 5f 62 61 63 6b 75 70 20 2a 70 42 61 63 6b 75  3_backup *pBacku
13b70 70 3b 0a 20 20 20 20 69 6e 74 20 6e 54 69 6d 65  p;.    int nTime
13b80 6f 75 74 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66  out = 0;..    if
13b90 28 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20 20 20  ( objc==3 ){.   
13ba0 20 20 20 7a 44 65 73 74 44 62 20 3d 20 22 6d 61     zDestDb = "ma
13bb0 69 6e 22 3b 0a 20 20 20 20 20 20 7a 53 72 63 46  in";.      zSrcF
13bc0 69 6c 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  ile = Tcl_GetStr
13bd0 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20  ing(objv[2]);.  
13be0 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a 63    }else if( objc
13bf0 3d 3d 34 20 29 7b 0a 20 20 20 20 20 20 7a 44 65  ==4 ){.      zDe
13c00 73 74 44 62 20 3d 20 54 63 6c 5f 47 65 74 53 74  stDb = Tcl_GetSt
13c10 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20  ring(objv[2]);. 
13c20 20 20 20 20 20 7a 53 72 63 46 69 6c 65 20 3d 20       zSrcFile = 
13c30 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
13c40 6a 76 5b 33 5d 29 3b 0a 20 20 20 20 7d 65 6c 73  jv[3]);.    }els
13c50 65 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f  e{.      Tcl_Wro
13c60 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
13c70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 44 41 54  , 2, objv, "?DAT
13c80 41 42 41 53 45 3f 20 46 49 4c 45 4e 41 4d 45 22  ABASE? FILENAME"
13c90 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
13ca0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
13cb0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
13cc0 33 5f 6f 70 65 6e 5f 76 32 28 7a 53 72 63 46 69  3_open_v2(zSrcFi
13cd0 6c 65 2c 20 26 70 53 72 63 2c 20 53 51 4c 49 54  le, &pSrc, SQLIT
13ce0 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 2c  E_OPEN_READONLY,
13cf0 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21   0);.    if( rc!
13d00 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
13d10 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
13d20 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 63 61  sult(interp, "ca
13d30 6e 6e 6f 74 20 6f 70 65 6e 20 73 6f 75 72 63 65  nnot open source
13d40 20 64 61 74 61 62 61 73 65 3a 20 22 2c 0a 20 20   database: ",.  
13d50 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
13d60 5f 65 72 72 6d 73 67 28 70 53 72 63 29 2c 20 28  _errmsg(pSrc), (
13d70 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20  char*)0);.      
13d80 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70 53  sqlite3_close(pS
13d90 72 63 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  rc);.      retur
13da0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
13db0 20 7d 0a 20 20 20 20 70 42 61 63 6b 75 70 20 3d   }.    pBackup =
13dc0 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f   sqlite3_backup_
13dd0 69 6e 69 74 28 70 44 62 2d 3e 64 62 2c 20 7a 44  init(pDb->db, zD
13de0 65 73 74 44 62 2c 20 70 53 72 63 2c 20 22 6d 61  estDb, pSrc, "ma
13df0 69 6e 22 29 3b 0a 20 20 20 20 69 66 28 20 70 42  in");.    if( pB
13e00 61 63 6b 75 70 3d 3d 30 20 29 7b 0a 20 20 20 20  ackup==0 ){.    
13e10 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
13e20 6c 74 28 69 6e 74 65 72 70 2c 20 22 72 65 73 74  lt(interp, "rest
13e30 6f 72 65 20 66 61 69 6c 65 64 3a 20 22 2c 0a 20  ore failed: ",. 
13e40 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
13e50 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62  3_errmsg(pDb->db
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 77 68 69 6c 65  .    }.    while
13eb0 28 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  ( (rc = sqlite3_
13ec0 62 61 63 6b 75 70 5f 73 74 65 70 28 70 42 61 63  backup_step(pBac
13ed0 6b 75 70 2c 31 30 30 29 29 3d 3d 53 51 4c 49 54  kup,100))==SQLIT
13ee0 45 5f 4f 4b 0a 20 20 20 20 20 20 20 20 20 20 20  E_OK.           
13ef0 20 20 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45     || rc==SQLITE
13f00 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20 69  _BUSY ){.      i
13f10 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55  f( rc==SQLITE_BU
13f20 53 59 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  SY ){.        if
13f30 28 20 6e 54 69 6d 65 6f 75 74 2b 2b 20 3e 3d 20  ( nTimeout++ >= 
13f40 33 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  3 ) break;.     
13f50 20 20 20 73 71 6c 69 74 65 33 5f 73 6c 65 65 70     sqlite3_sleep
13f60 28 31 30 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  (100);.      }. 
13f70 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
13f80 5f 62 61 63 6b 75 70 5f 66 69 6e 69 73 68 28 70  _backup_finish(p
13f90 42 61 63 6b 75 70 29 3b 0a 20 20 20 20 69 66 28  Backup);.    if(
13fa0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc==SQLITE_DONE
13fb0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 54   ){.      rc = T
13fc0 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65  CL_OK;.    }else
13fd0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
13fe0 42 55 53 59 20 7c 7c 20 72 63 3d 3d 53 51 4c 49  BUSY || rc==SQLI
13ff0 54 45 5f 4c 4f 43 4b 45 44 20 29 7b 0a 20 20 20  TE_LOCKED ){.   
14000 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
14010 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 72 65 73  ult(interp, "res
14020 74 6f 72 65 20 66 61 69 6c 65 64 3a 20 73 6f 75  tore failed: sou
14030 72 63 65 20 64 61 74 61 62 61 73 65 20 62 75 73  rce database bus
14040 79 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  y",.            
14050 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
14060 2a 29 30 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  *)0);.      rc =
14070 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
14080 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 54 63 6c  }else{.      Tcl
14090 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
140a0 74 65 72 70 2c 20 22 72 65 73 74 6f 72 65 20 66  terp, "restore f
140b0 61 69 6c 65 64 3a 20 22 2c 0a 20 20 20 20 20 20  ailed: ",.      
140c0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65 72 72       sqlite3_err
140d0 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c 20 28 63  msg(pDb->db), (c
140e0 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 72  har*)0);.      r
140f0 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  c = TCL_ERROR;. 
14100 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
14110 5f 63 6c 6f 73 65 28 70 53 72 63 29 3b 0a 20 20  _close(pSrc);.  
14120 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
14130 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20  /*.  **     $db 
14140 73 74 61 74 75 73 20 28 73 74 65 70 7c 73 6f 72  status (step|sor
14150 74 7c 61 75 74 6f 69 6e 64 65 78 29 0a 20 20 2a  t|autoindex).  *
14160 2a 0a 20 20 2a 2a 20 44 69 73 70 6c 61 79 20 53  *.  ** Display S
14170 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53  QLITE_STMTSTATUS
14180 5f 46 55 4c 4c 53 43 41 4e 5f 53 54 45 50 20 6f  _FULLSCAN_STEP o
14190 72 20 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 53  r .  ** SQLITE_S
141a0 54 4d 54 53 54 41 54 55 53 5f 53 4f 52 54 20 66  TMTSTATUS_SORT f
141b0 6f 72 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  or the most rece
141c0 6e 74 20 65 76 61 6c 2e 0a 20 20 2a 2f 0a 20 20  nt eval..  */.  
141d0 63 61 73 65 20 44 42 5f 53 54 41 54 55 53 3a 20  case DB_STATUS: 
141e0 7b 0a 20 20 20 20 69 6e 74 20 76 3b 0a 20 20 20  {.    int v;.   
141f0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70   const char *zOp
14200 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d  ;.    if( objc!=
14210 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57  3 ){.      Tcl_W
14220 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
14230 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 28 73  rp, 2, objv, "(s
14240 74 65 70 7c 73 6f 72 74 7c 61 75 74 6f 69 6e 64  tep|sort|autoind
14250 65 78 29 22 29 3b 0a 20 20 20 20 20 20 72 65 74  ex)");.      ret
14260 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
14270 20 20 20 7d 0a 20 20 20 20 7a 4f 70 20 3d 20 54     }.    zOp = T
14280 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
14290 76 5b 32 5d 29 3b 0a 20 20 20 20 69 66 28 20 73  v[2]);.    if( s
142a0 74 72 63 6d 70 28 7a 4f 70 2c 20 22 73 74 65 70  trcmp(zOp, "step
142b0 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 76  ")==0 ){.      v
142c0 20 3d 20 70 44 62 2d 3e 6e 53 74 65 70 3b 0a 20   = pDb->nStep;. 
142d0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
142e0 63 6d 70 28 7a 4f 70 2c 20 22 73 6f 72 74 22 29  cmp(zOp, "sort")
142f0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 76 20 3d  ==0 ){.      v =
14300 20 70 44 62 2d 3e 6e 53 6f 72 74 3b 0a 20 20 20   pDb->nSort;.   
14310 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
14320 70 28 7a 4f 70 2c 20 22 61 75 74 6f 69 6e 64 65  p(zOp, "autoinde
14330 78 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  x")==0 ){.      
14340 76 20 3d 20 70 44 62 2d 3e 6e 49 6e 64 65 78 3b  v = pDb->nIndex;
14350 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
14360 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
14370 6c 74 28 69 6e 74 65 72 70 2c 20 0a 20 20 20 20  lt(interp, .    
14380 20 20 20 20 20 20 20 20 22 62 61 64 20 61 72 67          "bad arg
14390 75 6d 65 6e 74 3a 20 73 68 6f 75 6c 64 20 62 65  ument: should be
143a0 20 61 75 74 6f 69 6e 64 65 78 2c 20 73 74 65 70   autoindex, step
143b0 2c 20 6f 72 20 73 6f 72 74 22 2c 20 0a 20 20 20  , or sort", .   
143c0 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29           (char*)
143d0 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  0);.      return
143e0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
143f0 7d 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a  }.    Tcl_SetObj
14400 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
14410 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 76 29 29  cl_NewIntObj(v))
14420 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  ;.    break;.  }
14430 0a 20 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20  .  .  /*.  **   
14440 20 20 24 64 62 20 74 69 6d 65 6f 75 74 20 4d 49    $db timeout MI
14450 4c 4c 45 53 45 43 4f 4e 44 53 0a 20 20 2a 2a 0a  LLESECONDS.  **.
14460 20 20 2a 2a 20 44 65 6c 61 79 20 66 6f 72 20 74    ** Delay for t
14470 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c  he number of mil
14480 6c 69 73 65 63 6f 6e 64 73 20 73 70 65 63 69 66  liseconds specif
14490 69 65 64 20 77 68 65 6e 20 61 20 66 69 6c 65 20  ied when a file 
144a0 69 73 20 6c 6f 63 6b 65 64 2e 0a 20 20 2a 2f 0a  is locked..  */.
144b0 20 20 63 61 73 65 20 44 42 5f 54 49 4d 45 4f 55    case DB_TIMEOU
144c0 54 3a 20 7b 0a 20 20 20 20 69 6e 74 20 6d 73 3b  T: {.    int ms;
144d0 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 33  .    if( objc!=3
144e0 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72   ){.      Tcl_Wr
144f0 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
14500 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 4d 49 4c  p, 2, objv, "MIL
14510 4c 49 53 45 43 4f 4e 44 53 22 29 3b 0a 20 20 20  LISECONDS");.   
14520 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
14530 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ROR;.    }.    i
14540 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  f( Tcl_GetIntFro
14550 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
14560 76 5b 32 5d 2c 20 26 6d 73 29 20 29 20 72 65 74  v[2], &ms) ) ret
14570 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
14580 20 20 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f     sqlite3_busy_
14590 74 69 6d 65 6f 75 74 28 70 44 62 2d 3e 64 62 2c  timeout(pDb->db,
145a0 20 6d 73 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b   ms);.    break;
145b0 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 0a 20 20 2a  .  }.  .  /*.  *
145c0 2a 20 20 20 20 20 24 64 62 20 74 6f 74 61 6c 5f  *     $db total_
145d0 63 68 61 6e 67 65 73 0a 20 20 2a 2a 0a 20 20 2a  changes.  **.  *
145e0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
145f0 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74  ber of rows that
14600 20 77 65 72 65 20 6d 6f 64 69 66 69 65 64 2c 20   were modified, 
14610 69 6e 73 65 72 74 65 64 2c 20 6f 72 20 64 65 6c  inserted, or del
14620 65 74 65 64 20 0a 20 20 2a 2a 20 73 69 6e 63 65  eted .  ** since
14630 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
14640 6e 64 6c 65 20 77 61 73 20 63 72 65 61 74 65 64  ndle was created
14650 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  ..  */.  case DB
14660 5f 54 4f 54 41 4c 5f 43 48 41 4e 47 45 53 3a 20  _TOTAL_CHANGES: 
14670 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  {.    Tcl_Obj *p
14680 52 65 73 75 6c 74 3b 0a 20 20 20 20 69 66 28 20  Result;.    if( 
14690 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 20  objc!=2 ){.     
146a0 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
146b0 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a  s(interp, 2, obj
146c0 76 2c 20 22 22 29 3b 0a 20 20 20 20 20 20 72 65  v, "");.      re
146d0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
146e0 20 20 20 20 7d 0a 20 20 20 20 70 52 65 73 75 6c      }.    pResul
146f0 74 20 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65  t = Tcl_GetObjRe
14700 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  sult(interp);.  
14710 20 20 54 63 6c 5f 53 65 74 49 6e 74 4f 62 6a 28    Tcl_SetIntObj(
14720 70 52 65 73 75 6c 74 2c 20 73 71 6c 69 74 65 33  pResult, sqlite3
14730 5f 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73 28 70  _total_changes(p
14740 44 62 2d 3e 64 62 29 29 3b 0a 20 20 20 20 62 72  Db->db));.    br
14750 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20  eak;.  }..  /*  
14760 20 20 24 64 62 20 74 72 61 63 65 20 3f 43 41 4c    $db trace ?CAL
14770 4c 42 41 43 4b 3f 0a 20 20 2a 2a 0a 20 20 2a 2a  LBACK?.  **.  **
14780 20 4d 61 6b 65 20 61 72 72 61 6e 67 65 6d 65 6e   Make arrangemen
14790 74 73 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65  ts to invoke the
147a0 20 43 41 4c 4c 42 41 43 4b 20 72 6f 75 74 69 6e   CALLBACK routin
147b0 65 20 66 6f 72 20 65 61 63 68 20 53 51 4c 20 73  e for each SQL s
147c0 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 68  tatement.  ** th
147d0 61 74 20 69 73 20 65 78 65 63 75 74 65 64 2e 20  at is executed. 
147e0 20 54 68 65 20 74 65 78 74 20 6f 66 20 74 68 65   The text of the
147f0 20 53 51 4c 20 69 73 20 61 70 70 65 6e 64 65 64   SQL is appended
14800 20 74 6f 20 43 41 4c 4c 42 41 43 4b 20 62 65 66   to CALLBACK bef
14810 6f 72 65 0a 20 20 2a 2a 20 69 74 20 69 73 20 65  ore.  ** it is e
14820 78 65 63 75 74 65 64 2e 0a 20 20 2a 2f 0a 20 20  xecuted..  */.  
14830 63 61 73 65 20 44 42 5f 54 52 41 43 45 3a 20 7b  case DB_TRACE: {
14840 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 33 20  .    if( objc>3 
14850 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f  ){.      Tcl_Wro
14860 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
14870 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 43 41 4c  , 2, objv, "?CAL
14880 4c 42 41 43 4b 3f 22 29 3b 0a 20 20 20 20 20 20  LBACK?");.      
14890 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
148a0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
148b0 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20 20  objc==2 ){.     
148c0 20 69 66 28 20 70 44 62 2d 3e 7a 54 72 61 63 65   if( pDb->zTrace
148d0 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f   ){.        Tcl_
148e0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
148f0 65 72 70 2c 20 70 44 62 2d 3e 7a 54 72 61 63 65  erp, pDb->zTrace
14900 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
14910 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63    }else{.      c
14920 68 61 72 20 2a 7a 54 72 61 63 65 3b 0a 20 20 20  har *zTrace;.   
14930 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20     int len;.    
14940 20 20 69 66 28 20 70 44 62 2d 3e 7a 54 72 61 63    if( pDb->zTrac
14950 65 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c  e ){.        Tcl
14960 5f 46 72 65 65 28 70 44 62 2d 3e 7a 54 72 61 63  _Free(pDb->zTrac
14970 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
14980 20 20 7a 54 72 61 63 65 20 3d 20 54 63 6c 5f 47    zTrace = Tcl_G
14990 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
149a0 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a  objv[2], &len);.
149b0 20 20 20 20 20 20 69 66 28 20 7a 54 72 61 63 65        if( zTrace
149c0 20 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20 20 20   && len>0 ){.   
149d0 20 20 20 20 20 70 44 62 2d 3e 7a 54 72 61 63 65       pDb->zTrace
149e0 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65   = Tcl_Alloc( le
149f0 6e 20 2b 20 31 20 29 3b 0a 20 20 20 20 20 20 20  n + 1 );.       
14a00 20 6d 65 6d 63 70 79 28 70 44 62 2d 3e 7a 54 72   memcpy(pDb->zTr
14a10 61 63 65 2c 20 7a 54 72 61 63 65 2c 20 6c 65 6e  ace, zTrace, len
14a20 2b 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  +1);.      }else
14a30 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a  {.        pDb->z
14a40 54 72 61 63 65 20 3d 20 30 3b 0a 20 20 20 20 20  Trace = 0;.     
14a50 20 7d 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28   }.#if !defined(
14a60 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43  SQLITE_OMIT_TRAC
14a70 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  E) && !defined(S
14a80 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54  QLITE_OMIT_FLOAT
14a90 49 4e 47 5f 50 4f 49 4e 54 29 0a 20 20 20 20 20  ING_POINT).     
14aa0 20 69 66 28 20 70 44 62 2d 3e 7a 54 72 61 63 65   if( pDb->zTrace
14ab0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d   ){.        pDb-
14ac0 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70  >interp = interp
14ad0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
14ae0 33 5f 74 72 61 63 65 28 70 44 62 2d 3e 64 62 2c  3_trace(pDb->db,
14af0 20 44 62 54 72 61 63 65 48 61 6e 64 6c 65 72 2c   DbTraceHandler,
14b00 20 70 44 62 29 3b 0a 20 20 20 20 20 20 7d 65 6c   pDb);.      }el
14b10 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
14b20 74 65 33 5f 74 72 61 63 65 28 70 44 62 2d 3e 64  te3_trace(pDb->d
14b30 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  b, 0, 0);.      
14b40 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20  }.#endif.    }. 
14b50 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
14b60 20 2f 2a 20 20 20 20 24 64 62 20 74 72 61 6e 73   /*    $db trans
14b70 61 63 74 69 6f 6e 20 5b 2d 64 65 66 65 72 72 65  action [-deferre
14b80 64 7c 2d 69 6d 6d 65 64 69 61 74 65 7c 2d 65 78  d|-immediate|-ex
14b90 63 6c 75 73 69 76 65 5d 20 53 43 52 49 50 54 0a  clusive] SCRIPT.
14ba0 20 20 2a 2a 0a 20 20 2a 2a 20 53 74 61 72 74 20    **.  ** Start 
14bb0 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f  a new transactio
14bc0 6e 20 28 69 66 20 77 65 20 61 72 65 20 6e 6f 74  n (if we are not
14bd0 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
14be0 6d 69 64 73 74 20 6f 66 20 61 0a 20 20 2a 2a 20  midst of a.  ** 
14bf0 74 72 61 6e 73 61 63 74 69 6f 6e 29 20 61 6e 64  transaction) and
14c00 20 65 78 65 63 75 74 65 20 74 68 65 20 54 43 4c   execute the TCL
14c10 20 73 63 72 69 70 74 20 53 43 52 49 50 54 2e 20   script SCRIPT. 
14c20 20 41 66 74 65 72 20 53 43 52 49 50 54 0a 20 20   After SCRIPT.  
14c30 2a 2a 20 63 6f 6d 70 6c 65 74 65 73 2c 20 65 69  ** completes, ei
14c40 74 68 65 72 20 63 6f 6d 6d 69 74 20 74 68 65 20  ther commit the 
14c50 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 72 20 72  transaction or r
14c60 6f 6c 6c 20 69 74 20 62 61 63 6b 20 69 66 20 53  oll it back if S
14c70 43 52 49 50 54 0a 20 20 2a 2a 20 74 68 72 6f 77  CRIPT.  ** throw
14c80 73 20 61 6e 20 65 78 63 65 70 74 69 6f 6e 2e 20  s an exception. 
14c90 20 4f 72 20 69 66 20 6e 6f 20 6e 65 77 20 74 72   Or if no new tr
14ca0 61 6e 73 61 74 69 6f 6e 20 77 61 73 20 73 74 61  ansation was sta
14cb0 72 74 65 64 2c 20 64 6f 20 6e 6f 74 68 69 6e 67  rted, do nothing
14cc0 2e 0a 20 20 2a 2a 20 70 61 73 73 20 74 68 65 20  ..  ** pass the 
14cd0 65 78 63 65 70 74 69 6f 6e 20 6f 6e 20 75 70 20  exception on up 
14ce0 74 68 65 20 73 74 61 63 6b 2e 0a 20 20 2a 2a 0a  the stack..  **.
14cf0 20 20 2a 2a 20 54 68 69 73 20 63 6f 6d 6d 61 6e    ** This comman
14d00 64 20 77 61 73 20 69 6e 73 70 69 72 65 64 20 62  d was inspired b
14d10 79 20 44 61 76 65 20 54 68 6f 6d 61 73 27 73 20  y Dave Thomas's 
14d20 74 61 6c 6b 20 6f 6e 20 52 75 62 79 20 61 74 20  talk on Ruby at 
14d30 74 68 65 0a 20 20 2a 2a 20 32 30 30 35 20 4f 27  the.  ** 2005 O'
14d40 52 65 69 6c 6c 79 20 4f 70 65 6e 20 53 6f 75 72  Reilly Open Sour
14d50 63 65 20 43 6f 6e 76 65 6e 74 69 6f 6e 20 28 4f  ce Convention (O
14d60 53 43 4f 4e 29 2e 0a 20 20 2a 2f 0a 20 20 63 61  SCON)..  */.  ca
14d70 73 65 20 44 42 5f 54 52 41 4e 53 41 43 54 49 4f  se DB_TRANSACTIO
14d80 4e 3a 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  N: {.    Tcl_Obj
14d90 20 2a 70 53 63 72 69 70 74 3b 0a 20 20 20 20 63   *pScript;.    c
14da0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 42 65 67 69  onst char *zBegi
14db0 6e 20 3d 20 22 53 41 56 45 50 4f 49 4e 54 20 5f  n = "SAVEPOINT _
14dc0 74 63 6c 5f 74 72 61 6e 73 61 63 74 69 6f 6e 22  tcl_transaction"
14dd0 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d  ;.    if( objc!=
14de0 33 20 26 26 20 6f 62 6a 63 21 3d 34 20 29 7b 0a  3 && objc!=4 ){.
14df0 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
14e00 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
14e10 2c 20 6f 62 6a 76 2c 20 22 5b 54 59 50 45 5d 20  , objv, "[TYPE] 
14e20 53 43 52 49 50 54 22 29 3b 0a 20 20 20 20 20 20  SCRIPT");.      
14e30 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
14e40 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
14e50 20 70 44 62 2d 3e 6e 54 72 61 6e 73 61 63 74 69   pDb->nTransacti
14e60 6f 6e 3d 3d 30 20 26 26 20 6f 62 6a 63 3d 3d 34  on==0 && objc==4
14e70 20 29 7b 0a 20 20 20 20 20 20 73 74 61 74 69 63   ){.      static
14e80 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 54 54 59   const char *TTY
14e90 50 45 5f 73 74 72 73 5b 5d 20 3d 20 7b 0a 20 20  PE_strs[] = {.  
14ea0 20 20 20 20 20 20 22 64 65 66 65 72 72 65 64 22        "deferred"
14eb0 2c 20 20 20 22 65 78 63 6c 75 73 69 76 65 22 2c  ,   "exclusive",
14ec0 20 20 22 69 6d 6d 65 64 69 61 74 65 22 2c 20 30    "immediate", 0
14ed0 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20  .      };.      
14ee0 65 6e 75 6d 20 54 54 59 50 45 5f 65 6e 75 6d 20  enum TTYPE_enum 
14ef0 7b 0a 20 20 20 20 20 20 20 20 54 54 59 50 45 5f  {.        TTYPE_
14f00 44 45 46 45 52 52 45 44 2c 20 54 54 59 50 45 5f  DEFERRED, TTYPE_
14f10 45 58 43 4c 55 53 49 56 45 2c 20 54 54 59 50 45  EXCLUSIVE, TTYPE
14f20 5f 49 4d 4d 45 44 49 41 54 45 0a 20 20 20 20 20  _IMMEDIATE.     
14f30 20 7d 3b 0a 20 20 20 20 20 20 69 6e 74 20 74 74   };.      int tt
14f40 79 70 65 3b 0a 20 20 20 20 20 20 69 66 28 20 54  ype;.      if( T
14f50 63 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f  cl_GetIndexFromO
14f60 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
14f70 32 5d 2c 20 54 54 59 50 45 5f 73 74 72 73 2c 20  2], TTYPE_strs, 
14f80 22 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 79 70  "transaction typ
14f90 65 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  e",.            
14fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14fb0 20 20 30 2c 20 26 74 74 79 70 65 29 20 29 7b 0a    0, &ttype) ){.
14fc0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54          return T
14fd0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  CL_ERROR;.      
14fe0 7d 0a 20 20 20 20 20 20 73 77 69 74 63 68 28 20  }.      switch( 
14ff0 28 65 6e 75 6d 20 54 54 59 50 45 5f 65 6e 75 6d  (enum TTYPE_enum
15000 29 74 74 79 70 65 20 29 7b 0a 20 20 20 20 20 20  )ttype ){.      
15010 20 20 63 61 73 65 20 54 54 59 50 45 5f 44 45 46    case TTYPE_DEF
15020 45 52 52 45 44 3a 20 20 20 20 2f 2a 20 6e 6f 2d  ERRED:    /* no-
15030 6f 70 20 2a 2f 3b 20 20 20 20 20 20 20 20 20 20  op */;          
15040 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
15050 20 20 20 20 20 20 63 61 73 65 20 54 54 59 50 45        case TTYPE
15060 5f 45 58 43 4c 55 53 49 56 45 3a 20 20 20 7a 42  _EXCLUSIVE:   zB
15070 65 67 69 6e 20 3d 20 22 42 45 47 49 4e 20 45 58  egin = "BEGIN EX
15080 43 4c 55 53 49 56 45 22 3b 20 20 62 72 65 61 6b  CLUSIVE";  break
15090 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 54  ;.        case T
150a0 54 59 50 45 5f 49 4d 4d 45 44 49 41 54 45 3a 20  TYPE_IMMEDIATE: 
150b0 20 20 7a 42 65 67 69 6e 20 3d 20 22 42 45 47 49    zBegin = "BEGI
150c0 4e 20 49 4d 4d 45 44 49 41 54 45 22 3b 20 20 62  N IMMEDIATE";  b
150d0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
150e0 20 20 7d 0a 20 20 20 20 70 53 63 72 69 70 74 20    }.    pScript 
150f0 3d 20 6f 62 6a 76 5b 6f 62 6a 63 2d 31 5d 3b 0a  = objv[objc-1];.
15100 0a 20 20 20 20 2f 2a 20 52 75 6e 20 74 68 65 20  .    /* Run the 
15110 53 51 4c 69 74 65 20 42 45 47 49 4e 20 63 6f 6d  SQLite BEGIN com
15120 6d 61 6e 64 20 74 6f 20 6f 70 65 6e 20 61 20 74  mand to open a t
15130 72 61 6e 73 61 63 74 69 6f 6e 20 6f 72 20 73 61  ransaction or sa
15140 76 65 70 6f 69 6e 74 2e 20 2a 2f 0a 20 20 20 20  vepoint. */.    
15150 70 44 62 2d 3e 64 69 73 61 62 6c 65 41 75 74 68  pDb->disableAuth
15160 2b 2b 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  ++;.    rc = sql
15170 69 74 65 33 5f 65 78 65 63 28 70 44 62 2d 3e 64  ite3_exec(pDb->d
15180 62 2c 20 7a 42 65 67 69 6e 2c 20 30 2c 20 30 2c  b, zBegin, 0, 0,
15190 20 30 29 3b 0a 20 20 20 20 70 44 62 2d 3e 64 69   0);.    pDb->di
151a0 73 61 62 6c 65 41 75 74 68 2d 2d 3b 0a 20 20 20  sableAuth--;.   
151b0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
151c0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  OK ){.      Tcl_
151d0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
151e0 65 72 70 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  erp, sqlite3_err
151f0 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c 20 30 29  msg(pDb->db), 0)
15200 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
15210 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
15220 20 20 20 20 70 44 62 2d 3e 6e 54 72 61 6e 73 61      pDb->nTransa
15230 63 74 69 6f 6e 2b 2b 3b 0a 0a 20 20 20 20 2f 2a  ction++;..    /*
15240 20 49 66 20 75 73 69 6e 67 20 4e 52 45 2c 20 73   If using NRE, s
15250 63 68 65 64 75 6c 65 20 61 20 63 61 6c 6c 62 61  chedule a callba
15260 63 6b 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65  ck to invoke the
15270 20 73 63 72 69 70 74 20 70 53 63 72 69 70 74 2c   script pScript,
15280 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 61 20 73   then.    ** a s
15290 65 63 6f 6e 64 20 63 61 6c 6c 62 61 63 6b 20 74  econd callback t
152a0 6f 20 63 6f 6d 6d 69 74 20 28 6f 72 20 72 6f 6c  o commit (or rol
152b0 6c 62 61 63 6b 29 20 74 68 65 20 74 72 61 6e 73  lback) the trans
152c0 61 63 74 69 6f 6e 20 6f 72 20 73 61 76 65 70 6f  action or savepo
152d0 69 6e 74 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 65  int.    ** opene
152e0 64 20 61 62 6f 76 65 2e 20 49 66 20 6e 6f 74 20  d above. If not 
152f0 75 73 69 6e 67 20 4e 52 45 2c 20 65 76 61 6c 75  using NRE, evalu
15300 61 74 65 20 74 68 65 20 73 63 72 69 70 74 20 64  ate the script d
15310 69 72 65 63 74 6c 79 2c 20 74 68 65 6e 0a 20 20  irectly, then.  
15320 20 20 2a 2a 20 63 61 6c 6c 20 66 75 6e 63 74 69    ** call functi
15330 6f 6e 20 44 62 54 72 61 6e 73 50 6f 73 74 43 6d  on DbTransPostCm
15340 64 28 29 20 74 6f 20 63 6f 6d 6d 69 74 20 28 6f  d() to commit (o
15350 72 20 72 6f 6c 6c 62 61 63 6b 29 20 74 68 65 20  r rollback) the 
15360 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20 20  transaction .   
15370 20 2a 2a 20 6f 72 20 73 61 76 65 70 6f 69 6e 74   ** or savepoint
15380 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 44 62  .  */.    if( Db
15390 55 73 65 4e 72 65 28 29 20 29 7b 0a 20 20 20 20  UseNre() ){.    
153a0 20 20 54 63 6c 5f 4e 52 41 64 64 43 61 6c 6c 62    Tcl_NRAddCallb
153b0 61 63 6b 28 69 6e 74 65 72 70 2c 20 44 62 54 72  ack(interp, DbTr
153c0 61 6e 73 50 6f 73 74 43 6d 64 2c 20 63 64 2c 20  ansPostCmd, cd, 
153d0 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  0, 0, 0);.      
153e0 54 63 6c 5f 4e 52 45 76 61 6c 4f 62 6a 28 69 6e  Tcl_NREvalObj(in
153f0 74 65 72 70 2c 20 70 53 63 72 69 70 74 2c 20 30  terp, pScript, 0
15400 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
15410 20 20 20 20 72 63 20 3d 20 44 62 54 72 61 6e 73      rc = DbTrans
15420 50 6f 73 74 43 6d 64 28 26 63 64 2c 20 69 6e 74  PostCmd(&cd, int
15430 65 72 70 2c 20 54 63 6c 5f 45 76 61 6c 4f 62 6a  erp, Tcl_EvalObj
15440 45 78 28 69 6e 74 65 72 70 2c 20 70 53 63 72 69  Ex(interp, pScri
15450 70 74 2c 20 30 29 29 3b 0a 20 20 20 20 7d 0a 20  pt, 0));.    }. 
15460 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
15470 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 24 64 62 20   /*.  **    $db 
15480 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79 20 3f 73  unlock_notify ?s
15490 63 72 69 70 74 3f 0a 20 20 2a 2f 0a 20 20 63 61  cript?.  */.  ca
154a0 73 65 20 44 42 5f 55 4e 4c 4f 43 4b 5f 4e 4f 54  se DB_UNLOCK_NOT
154b0 49 46 59 3a 20 7b 0a 23 69 66 6e 64 65 66 20 53  IFY: {.#ifndef S
154c0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 55 4e 4c  QLITE_ENABLE_UNL
154d0 4f 43 4b 5f 4e 4f 54 49 46 59 0a 20 20 20 20 54  OCK_NOTIFY.    T
154e0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
154f0 69 6e 74 65 72 70 2c 20 22 75 6e 6c 6f 63 6b 5f  interp, "unlock_
15500 6e 6f 74 69 66 79 20 6e 6f 74 20 61 76 61 69 6c  notify not avail
15510 61 62 6c 65 20 69 6e 20 74 68 69 73 20 62 75 69  able in this bui
15520 6c 64 22 2c 20 30 29 3b 0a 20 20 20 20 72 63 20  ld", 0);.    rc 
15530 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c  = TCL_ERROR;.#el
15540 73 65 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21  se.    if( objc!
15550 3d 32 20 26 26 20 6f 62 6a 63 21 3d 33 20 29 7b  =2 && objc!=3 ){
15560 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  .      Tcl_Wrong
15570 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
15580 32 2c 20 6f 62 6a 76 2c 20 22 3f 53 43 52 49 50  2, objv, "?SCRIP
15590 54 3f 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  T?");.      rc =
155a0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
155b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 76 6f 69  }else{.      voi
155c0 64 20 28 2a 78 4e 6f 74 69 66 79 29 28 76 6f 69  d (*xNotify)(voi
155d0 64 20 2a 2a 2c 20 69 6e 74 29 20 3d 20 30 3b 0a  d **, int) = 0;.
155e0 20 20 20 20 20 20 76 6f 69 64 20 2a 70 4e 6f 74        void *pNot
155f0 69 66 79 41 72 67 20 3d 20 30 3b 0a 0a 20 20 20  ifyArg = 0;..   
15600 20 20 20 69 66 28 20 70 44 62 2d 3e 70 55 6e 6c     if( pDb->pUnl
15610 6f 63 6b 4e 6f 74 69 66 79 20 29 7b 0a 20 20 20  ockNotify ){.   
15620 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66       Tcl_DecrRef
15630 43 6f 75 6e 74 28 70 44 62 2d 3e 70 55 6e 6c 6f  Count(pDb->pUnlo
15640 63 6b 4e 6f 74 69 66 79 29 3b 0a 20 20 20 20 20  ckNotify);.     
15650 20 20 20 70 44 62 2d 3e 70 55 6e 6c 6f 63 6b 4e     pDb->pUnlockN
15660 6f 74 69 66 79 20 3d 20 30 3b 0a 20 20 20 20 20  otify = 0;.     
15670 20 7d 0a 20 20 0a 20 20 20 20 20 20 69 66 28 20   }.  .      if( 
15680 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20 20 20 20 20  objc==3 ){.     
15690 20 20 20 78 4e 6f 74 69 66 79 20 3d 20 44 62 55     xNotify = DbU
156a0 6e 6c 6f 63 6b 4e 6f 74 69 66 79 3b 0a 20 20 20  nlockNotify;.   
156b0 20 20 20 20 20 70 4e 6f 74 69 66 79 41 72 67 20       pNotifyArg 
156c0 3d 20 28 76 6f 69 64 20 2a 29 70 44 62 3b 0a 20  = (void *)pDb;. 
156d0 20 20 20 20 20 20 20 70 44 62 2d 3e 70 55 6e 6c         pDb->pUnl
156e0 6f 63 6b 4e 6f 74 69 66 79 20 3d 20 6f 62 6a 76  ockNotify = objv
156f0 5b 32 5d 3b 0a 20 20 20 20 20 20 20 20 54 63 6c  [2];.        Tcl
15700 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 44  _IncrRefCount(pD
15710 62 2d 3e 70 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79  b->pUnlockNotify
15720 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 0a 20 20  );.      }.  .  
15730 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f      if( sqlite3_
15740 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79 28 70 44  unlock_notify(pD
15750 62 2d 3e 64 62 2c 20 78 4e 6f 74 69 66 79 2c 20  b->db, xNotify, 
15760 70 4e 6f 74 69 66 79 41 72 67 29 20 29 7b 0a 20  pNotifyArg) ){. 
15770 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e         Tcl_Appen
15780 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
15790 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70  sqlite3_errmsg(p
157a0 44 62 2d 3e 64 62 29 2c 20 30 29 3b 0a 20 20 20  Db->db), 0);.   
157b0 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45 52       rc = TCL_ER
157c0 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ROR;.      }.   
157d0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 62 72   }.#endif.    br
157e0 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  eak;.  }..  /*. 
157f0 20 2a 2a 20 20 20 20 24 64 62 20 77 61 6c 5f 68   **    $db wal_h
15800 6f 6f 6b 20 3f 73 63 72 69 70 74 3f 0a 20 20 2a  ook ?script?.  *
15810 2a 20 20 20 20 24 64 62 20 75 70 64 61 74 65 5f  *    $db update_
15820 68 6f 6f 6b 20 3f 73 63 72 69 70 74 3f 0a 20 20  hook ?script?.  
15830 2a 2a 20 20 20 20 24 64 62 20 72 6f 6c 6c 62 61  **    $db rollba
15840 63 6b 5f 68 6f 6f 6b 20 3f 73 63 72 69 70 74 3f  ck_hook ?script?
15850 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f  .  */.  case DB_
15860 57 41 4c 5f 48 4f 4f 4b 3a 20 0a 20 20 63 61 73  WAL_HOOK: .  cas
15870 65 20 44 42 5f 55 50 44 41 54 45 5f 48 4f 4f 4b  e DB_UPDATE_HOOK
15880 3a 20 0a 20 20 63 61 73 65 20 44 42 5f 52 4f 4c  : .  case DB_ROL
15890 4c 42 41 43 4b 5f 48 4f 4f 4b 3a 20 7b 0a 0a 20  LBACK_HOOK: {.. 
158a0 20 20 20 2f 2a 20 73 65 74 20 70 70 48 6f 6f 6b     /* set ppHook
158b0 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 70 55 70   to point at pUp
158c0 64 61 74 65 48 6f 6f 6b 20 6f 72 20 70 52 6f 6c  dateHook or pRol
158d0 6c 62 61 63 6b 48 6f 6f 6b 2c 20 64 65 70 65 6e  lbackHook, depen
158e0 64 69 6e 67 20 6f 6e 20 0a 20 20 20 20 2a 2a 20  ding on .    ** 
158f0 77 68 65 74 68 65 72 20 5b 24 64 62 20 75 70 64  whether [$db upd
15900 61 74 65 5f 68 6f 6f 6b 5d 20 6f 72 20 5b 24 64  ate_hook] or [$d
15910 62 20 72 6f 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 5d  b rollback_hook]
15920 20 77 61 73 20 69 6e 76 6f 6b 65 64 2e 0a 20 20   was invoked..  
15930 20 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a    */.    Tcl_Obj
15940 20 2a 2a 70 70 48 6f 6f 6b 3b 20 0a 20 20 20 20   **ppHook; .    
15950 69 66 28 20 63 68 6f 69 63 65 3d 3d 44 42 5f 55  if( choice==DB_U
15960 50 44 41 54 45 5f 48 4f 4f 4b 20 29 7b 0a 20 20  PDATE_HOOK ){.  
15970 20 20 20 20 70 70 48 6f 6f 6b 20 3d 20 26 70 44      ppHook = &pD
15980 62 2d 3e 70 55 70 64 61 74 65 48 6f 6f 6b 3b 0a  b->pUpdateHook;.
15990 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 68      }else if( ch
159a0 6f 69 63 65 3d 3d 44 42 5f 57 41 4c 5f 48 4f 4f  oice==DB_WAL_HOO
159b0 4b 20 29 7b 0a 20 20 20 20 20 20 70 70 48 6f 6f  K ){.      ppHoo
159c0 6b 20 3d 20 26 70 44 62 2d 3e 70 57 61 6c 48 6f  k = &pDb->pWalHo
159d0 6f 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ok;.    }else{. 
159e0 20 20 20 20 20 70 70 48 6f 6f 6b 20 3d 20 26 70       ppHook = &p
159f0 44 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f  Db->pRollbackHoo
15a00 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  k;.    }..    if
15a10 28 20 6f 62 6a 63 21 3d 32 20 26 26 20 6f 62 6a  ( objc!=2 && obj
15a20 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 20 54  c!=3 ){.       T
15a30 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
15a40 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c  interp, 2, objv,
15a50 20 22 3f 53 43 52 49 50 54 3f 22 29 3b 0a 20 20   "?SCRIPT?");.  
15a60 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
15a70 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
15a80 20 69 66 28 20 2a 70 70 48 6f 6f 6b 20 29 7b 0a   if( *ppHook ){.
15a90 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a        Tcl_SetObj
15aa0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 2a  Result(interp, *
15ab0 70 70 48 6f 6f 6b 29 3b 0a 20 20 20 20 20 20 69  ppHook);.      i
15ac0 66 28 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20 20  f( objc==3 ){.  
15ad0 20 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65        Tcl_DecrRe
15ae0 66 43 6f 75 6e 74 28 2a 70 70 48 6f 6f 6b 29 3b  fCount(*ppHook);
15af0 0a 20 20 20 20 20 20 20 20 2a 70 70 48 6f 6f 6b  .        *ppHook
15b00 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
15b10 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 62 6a 63    }.    if( objc
15b20 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ==3 ){.      ass
15b30 65 72 74 28 20 21 28 2a 70 70 48 6f 6f 6b 29 20  ert( !(*ppHook) 
15b40 29 3b 0a 20 20 20 20 20 20 69 66 28 20 54 63 6c  );.      if( Tcl
15b50 5f 47 65 74 43 68 61 72 4c 65 6e 67 74 68 28 6f  _GetCharLength(o
15b60 62 6a 76 5b 32 5d 29 3e 30 20 29 7b 0a 20 20 20  bjv[2])>0 ){.   
15b70 20 20 20 20 20 2a 70 70 48 6f 6f 6b 20 3d 20 6f       *ppHook = o
15b80 62 6a 76 5b 32 5d 3b 0a 20 20 20 20 20 20 20 20  bjv[2];.        
15b90 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
15ba0 28 2a 70 70 48 6f 6f 6b 29 3b 0a 20 20 20 20 20  (*ppHook);.     
15bb0 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 71   }.    }..    sq
15bc0 6c 69 74 65 33 5f 75 70 64 61 74 65 5f 68 6f 6f  lite3_update_hoo
15bd0 6b 28 70 44 62 2d 3e 64 62 2c 20 28 70 44 62 2d  k(pDb->db, (pDb-
15be0 3e 70 55 70 64 61 74 65 48 6f 6f 6b 3f 44 62 55  >pUpdateHook?DbU
15bf0 70 64 61 74 65 48 61 6e 64 6c 65 72 3a 30 29 2c  pdateHandler:0),
15c00 20 70 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74   pDb);.    sqlit
15c10 65 33 5f 72 6f 6c 6c 62 61 63 6b 5f 68 6f 6f 6b  e3_rollback_hook
15c20 28 70 44 62 2d 3e 64 62 2c 28 70 44 62 2d 3e 70  (pDb->db,(pDb->p
15c30 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 3f 44 62 52  RollbackHook?DbR
15c40 6f 6c 6c 62 61 63 6b 48 61 6e 64 6c 65 72 3a 30  ollbackHandler:0
15c50 29 2c 70 44 62 29 3b 0a 20 20 20 20 73 71 6c 69  ),pDb);.    sqli
15c60 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 70 44 62  te3_wal_hook(pDb
15c70 2d 3e 64 62 2c 28 70 44 62 2d 3e 70 57 61 6c 48  ->db,(pDb->pWalH
15c80 6f 6f 6b 3f 44 62 57 61 6c 48 61 6e 64 6c 65 72  ook?DbWalHandler
15c90 3a 30 29 2c 70 44 62 29 3b 0a 0a 20 20 20 20 62  :0),pDb);..    b
15ca0 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  reak;.  }..  /* 
15cb0 20 20 20 24 64 62 20 76 65 72 73 69 6f 6e 0a 20     $db version. 
15cc0 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20   **.  ** Return 
15cd0 74 68 65 20 76 65 72 73 69 6f 6e 20 73 74 72 69  the version stri
15ce0 6e 67 20 66 6f 72 20 74 68 69 73 20 64 61 74 61  ng for this data
15cf0 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 63 61 73  base..  */.  cas
15d00 65 20 44 42 5f 56 45 52 53 49 4f 4e 3a 20 7b 0a  e DB_VERSION: {.
15d10 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c      Tcl_SetResul
15d20 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20  t(interp, (char 
15d30 2a 29 73 71 6c 69 74 65 33 5f 6c 69 62 76 65 72  *)sqlite3_libver
15d40 73 69 6f 6e 28 29 2c 20 54 43 4c 5f 53 54 41 54  sion(), TCL_STAT
15d50 49 43 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a  IC);.    break;.
15d60 20 20 7d 0a 0a 0a 20 20 7d 20 2f 2a 20 45 6e 64    }...  } /* End
15d70 20 6f 66 20 74 68 65 20 53 57 49 54 43 48 20 73   of the SWITCH s
15d80 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 72 65  tatement */.  re
15d90 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 20  turn rc;.}..#if 
15da0 53 51 4c 49 54 45 5f 54 43 4c 5f 4e 52 45 0a 2f  SQLITE_TCL_NRE./
15db0 2a 0a 2a 2a 20 41 64 61 70 74 6f 72 20 74 68 61  *.** Adaptor tha
15dc0 74 20 70 72 6f 76 69 64 65 73 20 61 6e 20 6f 62  t provides an ob
15dd0 6a 43 6d 64 20 69 6e 74 65 72 66 61 63 65 20 74  jCmd interface t
15de0 6f 20 74 68 65 20 4e 52 45 2d 65 6e 61 62 6c 65  o the NRE-enable
15df0 64 0a 2a 2a 20 69 6e 74 65 72 66 61 63 65 20 69  d.** interface i
15e00 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 0a 2a  mplementation..*
15e10 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 44 62 4f  /.static int DbO
15e20 62 6a 43 6d 64 41 64 61 70 74 6f 72 28 0a 20 20  bjCmdAdaptor(.  
15e30 76 6f 69 64 20 2a 63 64 2c 0a 20 20 54 63 6c 5f  void *cd,.  Tcl_
15e40 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
15e50 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
15e60 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 2a 6f 62 6a  l_Obj *const*obj
15e70 76 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 54 63  v.){.  return Tc
15e80 6c 5f 4e 52 43 61 6c 6c 4f 62 6a 50 72 6f 63 28  l_NRCallObjProc(
15e90 69 6e 74 65 72 70 2c 20 44 62 4f 62 6a 43 6d 64  interp, DbObjCmd
15ea0 2c 20 63 64 2c 20 6f 62 6a 63 2c 20 6f 62 6a 76  , cd, objc, objv
15eb0 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  );.}.#endif /* S
15ec0 51 4c 49 54 45 5f 54 43 4c 5f 4e 52 45 20 2a 2f  QLITE_TCL_NRE */
15ed0 0a 0a 2f 2a 0a 2a 2a 20 20 20 73 71 6c 69 74 65  ../*.**   sqlite
15ee0 33 20 44 42 4e 41 4d 45 20 46 49 4c 45 4e 41 4d  3 DBNAME FILENAM
15ef0 45 20 3f 2d 76 66 73 20 56 46 53 4e 41 4d 45 3f  E ?-vfs VFSNAME?
15f00 20 3f 2d 6b 65 79 20 4b 45 59 3f 20 3f 2d 72 65   ?-key KEY? ?-re
15f10 61 64 6f 6e 6c 79 20 42 4f 4f 4c 45 41 4e 3f 0a  adonly BOOLEAN?.
15f20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
15f30 20 20 20 20 20 20 20 20 20 20 20 20 20 3f 2d 63               ?-c
15f40 72 65 61 74 65 20 42 4f 4f 4c 45 41 4e 3f 20 3f  reate BOOLEAN? ?
15f50 2d 6e 6f 6d 75 74 65 78 20 42 4f 4f 4c 45 41 4e  -nomutex BOOLEAN
15f60 3f 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ?.**.** This is 
15f70 74 68 65 20 6d 61 69 6e 20 54 63 6c 20 63 6f 6d  the main Tcl com
15f80 6d 61 6e 64 2e 20 20 57 68 65 6e 20 74 68 65 20  mand.  When the 
15f90 22 73 71 6c 69 74 65 22 20 54 63 6c 20 63 6f 6d  "sqlite" Tcl com
15fa0 6d 61 6e 64 20 69 73 0a 2a 2a 20 69 6e 76 6f 6b  mand is.** invok
15fb0 65 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ed, this routine
15fc0 20 72 75 6e 73 20 74 6f 20 70 72 6f 63 65 73 73   runs to process
15fd0 20 74 68 61 74 20 63 6f 6d 6d 61 6e 64 2e 0a 2a   that command..*
15fe0 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 61  *.** The first a
15ff0 72 67 75 6d 65 6e 74 2c 20 44 42 4e 41 4d 45 2c  rgument, DBNAME,
16000 20 69 73 20 61 6e 20 61 72 62 69 74 72 61 72 79   is an arbitrary
16010 20 6e 61 6d 65 20 66 6f 72 20 61 20 6e 65 77 0a   name for a new.
16020 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  ** database conn
16030 65 63 74 69 6f 6e 2e 20 20 54 68 69 73 20 63 6f  ection.  This co
16040 6d 6d 61 6e 64 20 63 72 65 61 74 65 73 20 61 20  mmand creates a 
16050 6e 65 77 20 63 6f 6d 6d 61 6e 64 20 6e 61 6d 65  new command name
16060 64 0a 2a 2a 20 44 42 4e 41 4d 45 20 74 68 61 74  d.** DBNAME that
16070 20 69 73 20 75 73 65 64 20 74 6f 20 63 6f 6e 74   is used to cont
16080 72 6f 6c 20 74 68 61 74 20 63 6f 6e 6e 65 63 74  rol that connect
16090 69 6f 6e 2e 20 20 54 68 65 20 64 61 74 61 62 61  ion.  The databa
160a0 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e  se.** connection
160b0 20 69 73 20 64 65 6c 65 74 65 64 20 77 68 65 6e   is deleted when
160c0 20 74 68 65 20 44 42 4e 41 4d 45 20 63 6f 6d 6d   the DBNAME comm
160d0 61 6e 64 20 69 73 20 64 65 6c 65 74 65 64 2e 0a  and is deleted..
160e0 2a 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64  **.** The second
160f0 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65   argument is the
16100 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   name of the dat
16110 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  abase file..**.*
16120 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 44 62 4d  /.static int DbM
16130 61 69 6e 28 76 6f 69 64 20 2a 63 64 2c 20 54 63  ain(void *cd, Tc
16140 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
16150 2c 20 69 6e 74 20 6f 62 6a 63 2c 54 63 6c 5f 4f  , int objc,Tcl_O
16160 62 6a 20 2a 63 6f 6e 73 74 2a 6f 62 6a 76 29 7b  bj *const*objv){
16170 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 3b 0a  .  SqliteDb *p;.
16180 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41    const char *zA
16190 72 67 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72  rg;.  char *zErr
161a0 4d 73 67 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  Msg;.  int i;.  
161b0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
161c0 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  e;.  const char 
161d0 2a 7a 56 66 73 20 3d 20 30 3b 0a 20 20 69 6e 74  *zVfs = 0;.  int
161e0 20 66 6c 61 67 73 3b 0a 20 20 54 63 6c 5f 44 53   flags;.  Tcl_DS
161f0 74 72 69 6e 67 20 74 72 61 6e 73 6c 61 74 65 64  tring translated
16200 46 69 6c 65 6e 61 6d 65 3b 0a 23 69 66 64 65 66  Filename;.#ifdef
16210 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45   SQLITE_HAS_CODE
16220 43 0a 20 20 76 6f 69 64 20 2a 70 4b 65 79 20 3d  C.  void *pKey =
16230 20 30 3b 0a 20 20 69 6e 74 20 6e 4b 65 79 20 3d   0;.  int nKey =
16240 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a   0;.#endif..  /*
16250 20 49 6e 20 6e 6f 72 6d 61 6c 20 75 73 65 2c 20   In normal use, 
16260 65 61 63 68 20 54 43 4c 20 69 6e 74 65 72 70 72  each TCL interpr
16270 65 74 65 72 20 72 75 6e 73 20 69 6e 20 61 20 73  eter runs in a s
16280 69 6e 67 6c 65 20 74 68 72 65 61 64 2e 20 20 53  ingle thread.  S
16290 6f 0a 20 20 2a 2a 20 62 79 20 64 65 66 61 75 6c  o.  ** by defaul
162a0 74 2c 20 77 65 20 63 61 6e 20 74 75 72 6e 20 6f  t, we can turn o
162b0 66 20 6d 75 74 65 78 69 6e 67 20 6f 6e 20 53 51  f mutexing on SQ
162c0 4c 69 74 65 20 64 61 74 61 62 61 73 65 20 63 6f  Lite database co
162d0 6e 6e 65 63 74 69 6f 6e 73 2e 0a 20 20 2a 2a 20  nnections..  ** 
162e0 48 6f 77 65 76 65 72 2c 20 66 6f 72 20 74 65 73  However, for tes
162f0 74 69 6e 67 20 70 75 72 70 6f 73 65 73 20 69 74  ting purposes it
16300 20 69 73 20 75 73 65 66 75 6c 20 74 6f 20 68 61   is useful to ha
16310 76 65 20 6d 75 74 65 78 65 73 20 74 75 72 6e 65  ve mutexes turne
16320 64 0a 20 20 2a 2a 20 6f 6e 2e 20 20 53 6f 2c 20  d.  ** on.  So, 
16330 62 79 20 64 65 66 61 75 6c 74 2c 20 6d 75 74 65  by default, mute
16340 78 65 73 20 64 65 66 61 75 6c 74 20 6f 66 66 2e  xes default off.
16350 20 20 42 75 74 20 69 66 20 63 6f 6d 70 69 6c 65    But if compile
16360 64 20 77 69 74 68 0a 20 20 2a 2a 20 53 51 4c 49  d with.  ** SQLI
16370 54 45 5f 54 43 4c 5f 44 45 46 41 55 4c 54 5f 46  TE_TCL_DEFAULT_F
16380 55 4c 4c 4d 55 54 45 58 20 74 68 65 6e 20 6d 75  ULLMUTEX then mu
16390 74 65 78 65 73 20 64 65 66 61 75 6c 74 20 6f 6e  texes default on
163a0 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  ..  */.#ifdef SQ
163b0 4c 49 54 45 5f 54 43 4c 5f 44 45 46 41 55 4c 54  LITE_TCL_DEFAULT
163c0 5f 46 55 4c 4c 4d 55 54 45 58 0a 20 20 66 6c 61  _FULLMUTEX.  fla
163d0 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs = SQLITE_OPEN
163e0 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c  _READWRITE | SQL
163f0 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20  ITE_OPEN_CREATE 
16400 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55  | SQLITE_OPEN_FU
16410 4c 4c 4d 55 54 45 58 3b 0a 23 65 6c 73 65 0a 20  LLMUTEX;.#else. 
16420 20 66 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f   flags = SQLITE_
16430 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c  OPEN_READWRITE |
16440 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45   SQLITE_OPEN_CRE
16450 41 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45  ATE | SQLITE_OPE
16460 4e 5f 4e 4f 4d 55 54 45 58 3b 0a 23 65 6e 64 69  N_NOMUTEX;.#endi
16470 66 0a 0a 20 20 69 66 28 20 6f 62 6a 63 3d 3d 32  f..  if( objc==2
16480 20 29 7b 0a 20 20 20 20 7a 41 72 67 20 3d 20 54   ){.    zArg = T
16490 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
164a0 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 30 29 3b  Obj(objv[1], 0);
164b0 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28  .    if( strcmp(
164c0 7a 41 72 67 2c 22 2d 76 65 72 73 69 6f 6e 22 29  zArg,"-version")
164d0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  ==0 ){.      Tcl
164e0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
164f0 74 65 72 70 2c 73 71 6c 69 74 65 33 5f 76 65 72  terp,sqlite3_ver
16500 73 69 6f 6e 2c 30 29 3b 0a 20 20 20 20 20 20 72  sion,0);.      r
16510 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20  eturn TCL_OK;.  
16520 20 20 7d 0a 20 20 20 20 69 66 28 20 73 74 72 63    }.    if( strc
16530 6d 70 28 7a 41 72 67 2c 22 2d 68 61 73 2d 63 6f  mp(zArg,"-has-co
16540 64 65 63 22 29 3d 3d 30 20 29 7b 0a 23 69 66 64  dec")==0 ){.#ifd
16550 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  ef SQLITE_HAS_CO
16560 44 45 43 0a 20 20 20 20 20 20 54 63 6c 5f 41 70  DEC.      Tcl_Ap
16570 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
16580 70 2c 22 31 22 2c 30 29 3b 0a 23 65 6c 73 65 0a  p,"1",0);.#else.
16590 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
165a0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 30  Result(interp,"0
165b0 22 2c 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  ",0);.#endif.   
165c0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b     return TCL_OK
165d0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f  ;.    }.  }.  fo
165e0 72 28 69 3d 33 3b 20 69 2b 31 3c 6f 62 6a 63 3b  r(i=3; i+1<objc;
165f0 20 69 2b 3d 32 29 7b 0a 20 20 20 20 7a 41 72 67   i+=2){.    zArg
16600 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
16610 28 6f 62 6a 76 5b 69 5d 29 3b 0a 20 20 20 20 69  (objv[i]);.    i
16620 66 28 20 73 74 72 63 6d 70 28 7a 41 72 67 2c 22  f( strcmp(zArg,"
16630 2d 6b 65 79 22 29 3d 3d 30 20 29 7b 0a 23 69 66  -key")==0 ){.#if
16640 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43  def SQLITE_HAS_C
16650 4f 44 45 43 0a 20 20 20 20 20 20 70 4b 65 79 20  ODEC.      pKey 
16660 3d 20 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72  = Tcl_GetByteArr
16670 61 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 69  ayFromObj(objv[i
16680 2b 31 5d 2c 20 26 6e 4b 65 79 29 3b 0a 23 65 6e  +1], &nKey);.#en
16690 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  dif.    }else if
166a0 28 20 73 74 72 63 6d 70 28 7a 41 72 67 2c 20 22  ( strcmp(zArg, "
166b0 2d 76 66 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20  -vfs")==0 ){.   
166c0 20 20 20 7a 56 66 73 20 3d 20 54 63 6c 5f 47 65     zVfs = Tcl_Ge
166d0 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 69 2b 31  tString(objv[i+1
166e0 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  ]);.    }else if
166f0 28 20 73 74 72 63 6d 70 28 7a 41 72 67 2c 20 22  ( strcmp(zArg, "
16700 2d 72 65 61 64 6f 6e 6c 79 22 29 3d 3d 30 20 29  -readonly")==0 )
16710 7b 0a 20 20 20 20 20 20 69 6e 74 20 62 3b 0a 20  {.      int b;. 
16720 20 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74       if( Tcl_Get
16730 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69  BooleanFromObj(i
16740 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 69 2b 31 5d  nterp, objv[i+1]
16750 2c 20 26 62 29 20 29 20 72 65 74 75 72 6e 20 54  , &b) ) return T
16760 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  CL_ERROR;.      
16770 69 66 28 20 62 20 29 7b 0a 20 20 20 20 20 20 20  if( b ){.       
16780 20 66 6c 61 67 73 20 26 3d 20 7e 28 53 51 4c 49   flags &= ~(SQLI
16790 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
167a0 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  E|SQLITE_OPEN_CR
167b0 45 41 54 45 29 3b 0a 20 20 20 20 20 20 20 20 66  EATE);.        f
167c0 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f  lags |= SQLITE_O
167d0 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20  PEN_READONLY;.  
167e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
167f0 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c     flags &= ~SQL
16800 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
16810 59 3b 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73  Y;.        flags
16820 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   |= SQLITE_OPEN_
16830 52 45 41 44 57 52 49 54 45 3b 0a 20 20 20 20 20  READWRITE;.     
16840 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28   }.    }else if(
16850 20 73 74 72 63 6d 70 28 7a 41 72 67 2c 20 22 2d   strcmp(zArg, "-
16860 63 72 65 61 74 65 22 29 3d 3d 30 20 29 7b 0a 20  create")==0 ){. 
16870 20 20 20 20 20 69 6e 74 20 62 3b 0a 20 20 20 20       int b;.    
16880 20 20 69 66 28 20 54 63 6c 5f 47 65 74 42 6f 6f    if( Tcl_GetBoo
16890 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  leanFromObj(inte
168a0 72 70 2c 20 6f 62 6a 76 5b 69 2b 31 5d 2c 20 26  rp, objv[i+1], &
168b0 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
168c0 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 69 66 28  ERROR;.      if(
168d0 20 62 20 26 26 20 28 66 6c 61 67 73 20 26 20 53   b && (flags & S
168e0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
168f0 4e 4c 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  NLY)==0 ){.     
16900 20 20 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49     flags |= SQLI
16910 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 3b 0a  TE_OPEN_CREATE;.
16920 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
16930 20 20 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 53       flags &= ~S
16940 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
16950 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  E;.      }.    }
16960 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
16970 7a 41 72 67 2c 20 22 2d 6e 6f 6d 75 74 65 78 22  zArg, "-nomutex"
16980 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  )==0 ){.      in
16990 74 20 62 3b 0a 20 20 20 20 20 20 69 66 28 20 54  t b;.      if( T
169a0 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f  cl_GetBooleanFro
169b0 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
169c0 76 5b 69 2b 31 5d 2c 20 26 62 29 20 29 20 72 65  v[i+1], &b) ) re
169d0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
169e0 20 20 20 20 20 20 69 66 28 20 62 20 29 7b 0a 20        if( b ){. 
169f0 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20         flags |= 
16a00 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55  SQLITE_OPEN_NOMU
16a10 54 45 58 3b 0a 20 20 20 20 20 20 20 20 66 6c 61  TEX;.        fla
16a20 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 4f 50  gs &= ~SQLITE_OP
16a30 45 4e 5f 46 55 4c 4c 4d 55 54 45 58 3b 0a 20 20  EN_FULLMUTEX;.  
16a40 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
16a50 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c     flags &= ~SQL
16a60 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58  ITE_OPEN_NOMUTEX
16a70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
16a80 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a  lse if( strcmp(z
16a90 41 72 67 2c 20 22 2d 66 75 6c 6c 6d 75 74 65 78  Arg, "-fullmutex
16aa0 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ")==0 ){.      i
16ab0 6e 74 20 62 3b 0a 20 20 20 20 20 20 69 66 28 20  nt b;.      if( 
16ac0 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72  Tcl_GetBooleanFr
16ad0 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
16ae0 6a 76 5b 69 2b 31 5d 2c 20 26 62 29 20 29 20 72  jv[i+1], &b) ) r
16af0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
16b00 0a 20 20 20 20 20 20 69 66 28 20 62 20 29 7b 0a  .      if( b ){.
16b10 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d          flags |=
16b20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55 4c   SQLITE_OPEN_FUL
16b30 4c 4d 55 54 45 58 3b 0a 20 20 20 20 20 20 20 20  LMUTEX;.        
16b40 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45  flags &= ~SQLITE
16b50 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58 3b 0a 20  _OPEN_NOMUTEX;. 
16b60 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
16b70 20 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 53 51      flags &= ~SQ
16b80 4c 49 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55  LITE_OPEN_FULLMU
16b90 54 45 58 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  TEX;.      }.   
16ba0 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
16bb0 70 28 7a 41 72 67 2c 20 22 2d 75 72 69 22 29 3d  p(zArg, "-uri")=
16bc0 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =0 ){.      int 
16bd0 62 3b 0a 20 20 20 20 20 20 69 66 28 20 54 63 6c  b;.      if( Tcl
16be0 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f  _GetBooleanFromO
16bf0 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
16c00 69 2b 31 5d 2c 20 26 62 29 20 29 20 72 65 74 75  i+1], &b) ) retu
16c10 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
16c20 20 20 20 20 69 66 28 20 62 20 29 7b 0a 20 20 20      if( b ){.   
16c30 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 53 51       flags |= SQ
16c40 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 3b 0a 20  LITE_OPEN_URI;. 
16c50 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
16c60 20 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 53 51      flags &= ~SQ
16c70 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 3b 0a 20  LITE_OPEN_URI;. 
16c80 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
16c90 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65  {.      Tcl_Appe
16ca0 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
16cb0 20 22 75 6e 6b 6e 6f 77 6e 20 6f 70 74 69 6f 6e   "unknown option
16cc0 3a 20 22 2c 20 7a 41 72 67 2c 20 28 63 68 61 72  : ", zArg, (char
16cd0 2a 29 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75  *)0);.      retu
16ce0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
16cf0 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6f 62    }.  }.  if( ob
16d00 6a 63 3c 33 20 7c 7c 20 28 6f 62 6a 63 26 31 29  jc<3 || (objc&1)
16d10 21 3d 31 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  !=1 ){.    Tcl_W
16d20 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
16d30 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 0a 20 20  rp, 1, objv, .  
16d40 20 20 20 20 22 48 41 4e 44 4c 45 20 46 49 4c 45      "HANDLE FILE
16d50 4e 41 4d 45 20 3f 2d 76 66 73 20 56 46 53 4e 41  NAME ?-vfs VFSNA
16d60 4d 45 3f 20 3f 2d 72 65 61 64 6f 6e 6c 79 20 42  ME? ?-readonly B
16d70 4f 4f 4c 45 41 4e 3f 20 3f 2d 63 72 65 61 74 65  OOLEAN? ?-create
16d80 20 42 4f 4f 4c 45 41 4e 3f 22 0a 20 20 20 20 20   BOOLEAN?".     
16d90 20 22 20 3f 2d 6e 6f 6d 75 74 65 78 20 42 4f 4f   " ?-nomutex BOO
16da0 4c 45 41 4e 3f 20 3f 2d 66 75 6c 6c 6d 75 74 65  LEAN? ?-fullmute
16db0 78 20 42 4f 4f 4c 45 41 4e 3f 22 0a 23 69 66 64  x BOOLEAN?".#ifd
16dc0 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  ef SQLITE_HAS_CO
16dd0 44 45 43 0a 20 20 20 20 20 20 22 20 3f 2d 6b 65  DEC.      " ?-ke
16de0 79 20 43 4f 44 45 43 4b 45 59 3f 22 0a 23 65 6e  y CODECKEY?".#en
16df0 64 69 66 0a 20 20 20 20 29 3b 0a 20 20 20 20 72  dif.    );.    r
16e00 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
16e10 0a 20 20 7d 0a 20 20 7a 45 72 72 4d 73 67 20 3d  .  }.  zErrMsg =
16e20 20 30 3b 0a 20 20 70 20 3d 20 28 53 71 6c 69 74   0;.  p = (Sqlit
16e30 65 44 62 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28 20  eDb*)Tcl_Alloc( 
16e40 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20  sizeof(*p) );.  
16e50 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20  if( p==0 ){.    
16e60 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
16e70 74 65 72 70 2c 20 22 6d 61 6c 6c 6f 63 20 66 61  terp, "malloc fa
16e80 69 6c 65 64 22 2c 20 54 43 4c 5f 53 54 41 54 49  iled", TCL_STATI
16e90 43 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  C);.    return T
16ea0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
16eb0 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 73 69 7a  memset(p, 0, siz
16ec0 65 6f 66 28 2a 70 29 29 3b 0a 20 20 7a 46 69 6c  eof(*p));.  zFil
16ed0 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  e = Tcl_GetStrin
16ee0 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d  gFromObj(objv[2]
16ef0 2c 20 30 29 3b 0a 20 20 7a 46 69 6c 65 20 3d 20  , 0);.  zFile = 
16f00 54 63 6c 5f 54 72 61 6e 73 6c 61 74 65 46 69 6c  Tcl_TranslateFil
16f10 65 4e 61 6d 65 28 69 6e 74 65 72 70 2c 20 7a 46  eName(interp, zF
16f20 69 6c 65 2c 20 26 74 72 61 6e 73 6c 61 74 65 64  ile, &translated
16f30 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 73 71 6c  Filename);.  sql
16f40 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 7a 46 69  ite3_open_v2(zFi
16f50 6c 65 2c 20 26 70 2d 3e 64 62 2c 20 66 6c 61 67  le, &p->db, flag
16f60 73 2c 20 7a 56 66 73 29 3b 0a 20 20 54 63 6c 5f  s, zVfs);.  Tcl_
16f70 44 53 74 72 69 6e 67 46 72 65 65 28 26 74 72 61  DStringFree(&tra
16f80 6e 73 6c 61 74 65 64 46 69 6c 65 6e 61 6d 65 29  nslatedFilename)
16f90 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  ;.  if( SQLITE_O
16fa0 4b 21 3d 73 71 6c 69 74 65 33 5f 65 72 72 63 6f  K!=sqlite3_errco
16fb0 64 65 28 70 2d 3e 64 62 29 20 29 7b 0a 20 20 20  de(p->db) ){.   
16fc0 20 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74   zErrMsg = sqlit
16fd0 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c  e3_mprintf("%s",
16fe0 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
16ff0 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20 73 71 6c  p->db));.    sql
17000 69 74 65 33 5f 63 6c 6f 73 65 28 70 2d 3e 64 62  ite3_close(p->db
17010 29 3b 0a 20 20 20 20 70 2d 3e 64 62 20 3d 20 30  );.    p->db = 0
17020 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c  ;.  }.#ifdef SQL
17030 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20  ITE_HAS_CODEC.  
17040 69 66 28 20 70 2d 3e 64 62 20 29 7b 0a 20 20 20  if( p->db ){.   
17050 20 73 71 6c 69 74 65 33 5f 6b 65 79 28 70 2d 3e   sqlite3_key(p->
17060 64 62 2c 20 70 4b 65 79 2c 20 6e 4b 65 79 29 3b  db, pKey, nKey);
17070 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66  .  }.#endif.  if
17080 28 20 70 2d 3e 64 62 3d 3d 30 20 29 7b 0a 20 20  ( p->db==0 ){.  
17090 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28    Tcl_SetResult(
170a0 69 6e 74 65 72 70 2c 20 7a 45 72 72 4d 73 67 2c  interp, zErrMsg,
170b0 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a   TCL_VOLATILE);.
170c0 20 20 20 20 54 63 6c 5f 46 72 65 65 28 28 63 68      Tcl_Free((ch
170d0 61 72 2a 29 70 29 3b 0a 20 20 20 20 73 71 6c 69  ar*)p);.    sqli
170e0 74 65 33 5f 66 72 65 65 28 7a 45 72 72 4d 73 67  te3_free(zErrMsg
170f0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
17100 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70  L_ERROR;.  }.  p
17110 2d 3e 6d 61 78 53 74 6d 74 20 3d 20 4e 55 4d 5f  ->maxStmt = NUM_
17120 50 52 45 50 41 52 45 44 5f 53 54 4d 54 53 3b 0a  PREPARED_STMTS;.
17130 20 20 70 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e    p->interp = in
17140 74 65 72 70 3b 0a 20 20 7a 41 72 67 20 3d 20 54  terp;.  zArg = T
17150 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
17160 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 30 29 3b  Obj(objv[1], 0);
17170 0a 20 20 69 66 28 20 44 62 55 73 65 4e 72 65 28  .  if( DbUseNre(
17180 29 20 29 7b 0a 20 20 20 20 54 63 6c 5f 4e 52 43  ) ){.    Tcl_NRC
17190 72 65 61 74 65 43 6f 6d 6d 61 6e 64 28 69 6e 74  reateCommand(int
171a0 65 72 70 2c 20 7a 41 72 67 2c 20 44 62 4f 62 6a  erp, zArg, DbObj
171b0 43 6d 64 41 64 61 70 74 6f 72 2c 20 44 62 4f 62  CmdAdaptor, DbOb
171c0 6a 43 6d 64 2c 0a 20 20 20 20 20 20 20 20 20 20  jCmd,.          
171d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
171e0 68 61 72 2a 29 70 2c 20 44 62 44 65 6c 65 74 65  har*)p, DbDelete
171f0 43 6d 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Cmd);.  }else{. 
17200 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a     Tcl_CreateObj
17210 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20  Command(interp, 
17220 7a 41 72 67 2c 20 44 62 4f 62 6a 43 6d 64 2c 20  zArg, DbObjCmd, 
17230 28 63 68 61 72 2a 29 70 2c 20 44 62 44 65 6c 65  (char*)p, DbDele
17240 74 65 43 6d 64 29 3b 0a 20 20 7d 0a 20 20 72 65  teCmd);.  }.  re
17250 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
17260 2f 2a 0a 2a 2a 20 50 72 6f 76 69 64 65 20 61 20  /*.** Provide a 
17270 64 75 6d 6d 79 20 54 63 6c 5f 49 6e 69 74 53 74  dummy Tcl_InitSt
17280 75 62 73 20 69 66 20 77 65 20 61 72 65 20 75 73  ubs if we are us
17290 69 6e 67 20 74 68 69 73 20 61 73 20 61 20 73 74  ing this as a st
172a0 61 74 69 63 0a 2a 2a 20 6c 69 62 72 61 72 79 2e  atic.** library.
172b0 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 55 53 45 5f  .*/.#ifndef USE_
172c0 54 43 4c 5f 53 54 55 42 53 0a 23 20 75 6e 64 65  TCL_STUBS.# unde
172d0 66 20 20 54 63 6c 5f 49 6e 69 74 53 74 75 62 73  f  Tcl_InitStubs
172e0 0a 23 20 64 65 66 69 6e 65 20 54 63 6c 5f 49 6e  .# define Tcl_In
172f0 69 74 53 74 75 62 73 28 61 2c 62 2c 63 29 0a 23  itStubs(a,b,c).#
17300 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b  endif../*.** Mak
17310 65 20 73 75 72 65 20 77 65 20 68 61 76 65 20 61  e sure we have a
17320 20 50 41 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e   PACKAGE_VERSION
17330 20 6d 61 63 72 6f 20 64 65 66 69 6e 65 64 2e 20   macro defined. 
17340 20 54 68 69 73 20 77 69 6c 6c 20 62 65 0a 2a 2a   This will be.**
17350 20 64 65 66 69 6e 65 64 20 61 75 74 6f 6d 61 74   defined automat
17360 69 63 61 6c 6c 79 20 62 79 20 74 68 65 20 54 45  ically by the TE
17370 41 20 6d 61 6b 65 66 69 6c 65 2e 20 20 42 75 74  A makefile.  But
17380 20 6f 74 68 65 72 20 6d 61 6b 65 66 69 6c 65 73   other makefiles
17390 0a 2a 2a 20 64 6f 20 6e 6f 74 20 64 65 66 69 6e  .** do not defin
173a0 65 20 69 74 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  e it..*/.#ifndef
173b0 20 50 41 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e   PACKAGE_VERSION
173c0 0a 23 20 64 65 66 69 6e 65 20 50 41 43 4b 41 47  .# define PACKAG
173d0 45 5f 56 45 52 53 49 4f 4e 20 53 51 4c 49 54 45  E_VERSION SQLITE
173e0 5f 56 45 52 53 49 4f 4e 0a 23 65 6e 64 69 66 0a  _VERSION.#endif.
173f0 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
17400 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 2e 0a 2a  e this module..*
17410 2a 0a 2a 2a 20 54 68 69 73 20 54 63 6c 20 6d 6f  *.** This Tcl mo
17420 64 75 6c 65 20 63 6f 6e 74 61 69 6e 73 20 6f 6e  dule contains on
17430 6c 79 20 61 20 73 69 6e 67 6c 65 20 6e 65 77 20  ly a single new 
17440 54 63 6c 20 63 6f 6d 6d 61 6e 64 20 6e 61 6d 65  Tcl command name
17450 64 20 22 73 71 6c 69 74 65 22 2e 0a 2a 2a 20 28  d "sqlite"..** (
17460 48 65 6e 63 65 20 74 68 65 72 65 20 69 73 20 6e  Hence there is n
17470 6f 20 6e 61 6d 65 73 70 61 63 65 2e 20 20 54 68  o namespace.  Th
17480 65 72 65 20 69 73 20 6e 6f 20 70 6f 69 6e 74 20  ere is no point 
17490 69 6e 20 75 73 69 6e 67 20 61 20 6e 61 6d 65 73  in using a names
174a0 70 61 63 65 0a 2a 2a 20 69 66 20 74 68 65 20 65  pace.** if the e
174b0 78 74 65 6e 73 69 6f 6e 20 6f 6e 6c 79 20 73 75  xtension only su
174c0 70 70 6c 69 65 73 20 6f 6e 65 20 6e 65 77 20 6e  pplies one new n
174d0 61 6d 65 21 29 20 20 54 68 65 20 22 73 71 6c 69  ame!)  The "sqli
174e0 74 65 22 20 63 6f 6d 6d 61 6e 64 20 69 73 0a 2a  te" command is.*
174f0 2a 20 75 73 65 64 20 74 6f 20 6f 70 65 6e 20 61  * used to open a
17500 20 6e 65 77 20 53 51 4c 69 74 65 20 64 61 74 61   new SQLite data
17510 62 61 73 65 2e 20 20 53 65 65 20 74 68 65 20 44  base.  See the D
17520 62 4d 61 69 6e 28 29 20 72 6f 75 74 69 6e 65 20  bMain() routine 
17530 61 62 6f 76 65 0a 2a 2a 20 66 6f 72 20 61 64 64  above.** for add
17540 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
17550 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45  ion..**.** The E
17560 58 54 45 52 4e 20 6d 61 63 72 6f 73 20 61 72 65  XTERN macros are
17570 20 72 65 71 75 69 72 65 64 20 62 79 20 54 43 4c   required by TCL
17580 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 77 6f 72   in order to wor
17590 6b 20 6f 6e 20 77 69 6e 64 6f 77 73 2e 0a 2a 2f  k on windows..*/
175a0 0a 45 58 54 45 52 4e 20 69 6e 74 20 53 71 6c 69  .EXTERN int Sqli
175b0 74 65 33 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74  te3_Init(Tcl_Int
175c0 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 0a 20 20  erp *interp){.  
175d0 54 63 6c 5f 49 6e 69 74 53 74 75 62 73 28 69 6e  Tcl_InitStubs(in
175e0 74 65 72 70 2c 20 22 38 2e 34 22 2c 20 30 29 3b  terp, "8.4", 0);
175f0 0a 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a  .  Tcl_CreateObj
17600 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20  Command(interp, 
17610 22 73 71 6c 69 74 65 33 22 2c 20 28 54 63 6c 5f  "sqlite3", (Tcl_
17620 4f 62 6a 43 6d 64 50 72 6f 63 2a 29 44 62 4d 61  ObjCmdProc*)DbMa
17630 69 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 54 63 6c  in, 0, 0);.  Tcl
17640 5f 50 6b 67 50 72 6f 76 69 64 65 28 69 6e 74 65  _PkgProvide(inte
17650 72 70 2c 20 22 73 71 6c 69 74 65 33 22 2c 20 50  rp, "sqlite3", P
17660 41 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e 29 3b  ACKAGE_VERSION);
17670 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
17680 5f 33 5f 53 55 46 46 49 58 5f 4f 4e 4c 59 0a 20  _3_SUFFIX_ONLY. 
17690 20 2f 2a 20 54 68 65 20 22 73 71 6c 69 74 65 22   /* The "sqlite"
176a0 20 61 6c 69 61 73 20 69 73 20 75 6e 64 6f 63 75   alias is undocu
176b0 6d 65 6e 74 65 64 2e 20 20 49 74 20 69 73 20 68  mented.  It is h
176c0 65 72 65 20 6f 6e 6c 79 20 74 6f 20 73 75 70 70  ere only to supp
176d0 6f 72 74 0a 20 20 2a 2a 20 6c 65 67 61 63 79 20  ort.  ** legacy 
176e0 73 63 72 69 70 74 73 2e 20 20 41 6c 6c 20 6e 65  scripts.  All ne
176f0 77 20 73 63 72 69 70 74 73 20 73 68 6f 75 6c 64  w scripts should
17700 20 75 73 65 20 6f 6e 6c 79 20 74 68 65 20 22 73   use only the "s
17710 71 6c 69 74 65 33 22 0a 20 20 2a 2a 20 63 6f 6d  qlite3".  ** com
17720 6d 61 6e 64 2e 0a 20 20 2a 2f 0a 20 20 54 63 6c  mand..  */.  Tcl
17730 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e  _CreateObjComman
17740 64 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74  d(interp, "sqlit
17750 65 22 2c 20 28 54 63 6c 5f 4f 62 6a 43 6d 64 50  e", (Tcl_ObjCmdP
17760 72 6f 63 2a 29 44 62 4d 61 69 6e 2c 20 30 2c 20  roc*)DbMain, 0, 
17770 30 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65  0);.#endif..  re
17780 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 45  turn TCL_OK;.}.E
17790 58 54 45 52 4e 20 69 6e 74 20 54 63 6c 73 71 6c  XTERN int Tclsql
177a0 69 74 65 33 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  ite3_Init(Tcl_In
177b0 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 20 72  terp *interp){ r
177c0 65 74 75 72 6e 20 53 71 6c 69 74 65 33 5f 49 6e  eturn Sqlite3_In
177d0 69 74 28 69 6e 74 65 72 70 29 3b 20 7d 0a 45 58  it(interp); }.EX
177e0 54 45 52 4e 20 69 6e 74 20 53 71 6c 69 74 65 33  TERN int Sqlite3
177f0 5f 53 61 66 65 49 6e 69 74 28 54 63 6c 5f 49 6e  _SafeInit(Tcl_In
17800 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 20 72  terp *interp){ r
17810 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 7d 0a  eturn TCL_OK; }.
17820 45 58 54 45 52 4e 20 69 6e 74 20 54 63 6c 73 71  EXTERN int Tclsq
17830 6c 69 74 65 33 5f 53 61 66 65 49 6e 69 74 28 54  lite3_SafeInit(T
17840 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
17850 70 29 7b 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  p){ return TCL_O
17860 4b 3b 20 7d 0a 45 58 54 45 52 4e 20 69 6e 74 20  K; }.EXTERN int 
17870 53 71 6c 69 74 65 33 5f 55 6e 6c 6f 61 64 28 54  Sqlite3_Unload(T
17880 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
17890 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 20 72  p, int flags){ r
178a0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 7d 0a  eturn TCL_OK; }.
178b0 45 58 54 45 52 4e 20 69 6e 74 20 54 63 6c 73 71  EXTERN int Tclsq
178c0 6c 69 74 65 33 5f 55 6e 6c 6f 61 64 28 54 63 6c  lite3_Unload(Tcl
178d0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
178e0 20 69 6e 74 20 66 6c 61 67 73 29 7b 20 72 65 74   int flags){ ret
178f0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 7d 0a 45 58  urn TCL_OK; }.EX
17900 54 45 52 4e 20 69 6e 74 20 53 71 6c 69 74 65 33  TERN int Sqlite3
17910 5f 53 61 66 65 55 6e 6c 6f 61 64 28 54 63 6c 5f  _SafeUnload(Tcl_
17920 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
17930 69 6e 74 20 66 6c 61 67 73 29 7b 20 72 65 74 75  int flags){ retu
17940 72 6e 20 54 43 4c 5f 4f 4b 3b 20 7d 0a 45 58 54  rn TCL_OK; }.EXT
17950 45 52 4e 20 69 6e 74 20 54 63 6c 73 71 6c 69 74  ERN int Tclsqlit
17960 65 33 5f 53 61 66 65 55 6e 6c 6f 61 64 28 54 63  e3_SafeUnload(Tc
17970 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
17980 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 20 72 65  , int flags){ re
17990 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 7d 0a 0a 0a  turn TCL_OK;}...
179a0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 33  #ifndef SQLITE_3
179b0 5f 53 55 46 46 49 58 5f 4f 4e 4c 59 0a 69 6e 74  _SUFFIX_ONLY.int
179c0 20 53 71 6c 69 74 65 5f 49 6e 69 74 28 54 63 6c   Sqlite_Init(Tcl
179d0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29  _Interp *interp)
179e0 7b 20 72 65 74 75 72 6e 20 53 71 6c 69 74 65 33  { return Sqlite3
179f0 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 20 7d  _Init(interp); }
17a00 0a 69 6e 74 20 54 63 6c 73 71 6c 69 74 65 5f 49  .int Tclsqlite_I
17a10 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a  nit(Tcl_Interp *
17a20 69 6e 74 65 72 70 29 7b 20 72 65 74 75 72 6e 20  interp){ return 
17a30 53 71 6c 69 74 65 33 5f 49 6e 69 74 28 69 6e 74  Sqlite3_Init(int
17a40 65 72 70 29 3b 20 7d 0a 69 6e 74 20 53 71 6c 69  erp); }.int Sqli
17a50 74 65 5f 53 61 66 65 49 6e 69 74 28 54 63 6c 5f  te_SafeInit(Tcl_
17a60 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b  Interp *interp){
17a70 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20   return TCL_OK; 
17a80 7d 0a 69 6e 74 20 54 63 6c 73 71 6c 69 74 65 5f  }.int Tclsqlite_
17a90 53 61 66 65 49 6e 69 74 28 54 63 6c 5f 49 6e 74  SafeInit(Tcl_Int
17aa0 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 20 72 65  erp *interp){ re
17ab0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 7d 0a 69  turn TCL_OK; }.i
17ac0 6e 74 20 53 71 6c 69 74 65 5f 55 6e 6c 6f 61 64  nt Sqlite_Unload
17ad0 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74  (Tcl_Interp *int
17ae0 65 72 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b  erp, int flags){
17af0 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20   return TCL_OK; 
17b00 7d 0a 69 6e 74 20 54 63 6c 73 71 6c 69 74 65 5f  }.int Tclsqlite_
17b10 55 6e 6c 6f 61 64 28 54 63 6c 5f 49 6e 74 65 72  Unload(Tcl_Inter
17b20 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 66  p *interp, int f
17b30 6c 61 67 73 29 7b 20 72 65 74 75 72 6e 20 54 43  lags){ return TC
17b40 4c 5f 4f 4b 3b 20 7d 0a 69 6e 74 20 53 71 6c 69  L_OK; }.int Sqli
17b50 74 65 5f 53 61 66 65 55 6e 6c 6f 61 64 28 54 63  te_SafeUnload(Tc
17b60 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
17b70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 20 72 65  , int flags){ re
17b80 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 7d 0a 69  turn TCL_OK; }.i
17b90 6e 74 20 54 63 6c 73 71 6c 69 74 65 5f 53 61 66  nt Tclsqlite_Saf
17ba0 65 55 6e 6c 6f 61 64 28 54 63 6c 5f 49 6e 74 65  eUnload(Tcl_Inte
17bb0 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20  rp *interp, int 
17bc0 66 6c 61 67 73 29 7b 20 72 65 74 75 72 6e 20 54  flags){ return T
17bd0 43 4c 5f 4f 4b 3b 7d 0a 23 65 6e 64 69 66 0a 0a  CL_OK;}.#endif..
17be0 23 69 66 64 65 66 20 54 43 4c 53 48 0a 2f 2a 2a  #ifdef TCLSH./**
17bf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17c00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17c10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17c20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17c30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 41  ***********.** A
17c40 6c 6c 20 6f 66 20 74 68 65 20 63 6f 64 65 20 74  ll of the code t
17c50 68 61 74 20 66 6f 6c 6c 6f 77 73 20 69 73 20 75  hat follows is u
17c60 73 65 64 20 74 6f 20 62 75 69 6c 64 20 73 74 61  sed to build sta
17c70 6e 64 61 6c 6f 6e 65 20 54 43 4c 20 69 6e 74 65  ndalone TCL inte
17c80 72 70 72 65 74 65 72 73 0a 2a 2a 20 74 68 61 74  rpreters.** that
17c90 20 61 72 65 20 73 74 61 74 69 63 61 6c 6c 79 20   are statically 
17ca0 6c 69 6e 6b 65 64 20 77 69 74 68 20 53 51 4c 69  linked with SQLi
17cb0 74 65 2e 20 20 45 6e 61 62 6c 65 20 74 68 65 73  te.  Enable thes
17cc0 65 20 62 79 20 63 6f 6d 70 69 6c 69 6e 67 0a 2a  e by compiling.*
17cd0 2a 20 77 69 74 68 20 2d 44 54 43 4c 53 48 3d 6e  * with -DTCLSH=n
17ce0 20 77 68 65 72 65 20 6e 20 63 61 6e 20 62 65 20   where n can be 
17cf0 31 20 6f 72 20 32 2e 20 20 41 6e 20 6e 20 6f 66  1 or 2.  An n of
17d00 20 31 20 67 65 6e 65 72 61 74 65 73 20 61 20 73   1 generates a s
17d10 74 61 6e 64 61 72 64 0a 2a 2a 20 74 63 6c 73 68  tandard.** tclsh
17d20 20 62 75 74 20 77 69 74 68 20 53 51 4c 69 74 65   but with SQLite
17d30 20 62 75 69 6c 74 20 69 6e 2e 20 20 41 6e 20 6e   built in.  An n
17d40 20 6f 66 20 32 20 67 65 6e 65 72 61 74 65 73 20   of 2 generates 
17d50 74 68 65 20 53 51 4c 69 74 65 20 73 70 61 63 65  the SQLite space
17d60 0a 2a 2a 20 61 6e 61 6c 79 73 69 73 20 70 72 6f  .** analysis pro
17d70 67 72 61 6d 2e 0a 2a 2f 0a 0a 23 69 66 20 64 65  gram..*/..#if de
17d80 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53  fined(SQLITE_TES
17d90 54 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  T) || defined(SQ
17da0 4c 49 54 45 5f 54 43 4c 4d 44 35 29 0a 2f 2a 0a  LITE_TCLMD5)./*.
17db0 20 2a 20 54 68 69 73 20 63 6f 64 65 20 69 6d 70   * This code imp
17dc0 6c 65 6d 65 6e 74 73 20 74 68 65 20 4d 44 35 20  lements the MD5 
17dd0 6d 65 73 73 61 67 65 2d 64 69 67 65 73 74 20 61  message-digest a
17de0 6c 67 6f 72 69 74 68 6d 2e 0a 20 2a 20 54 68 65  lgorithm.. * The
17df0 20 61 6c 67 6f 72 69 74 68 6d 20 69 73 20 64 75   algorithm is du
17e00 65 20 74 6f 20 52 6f 6e 20 52 69 76 65 73 74 2e  e to Ron Rivest.
17e10 20 20 54 68 69 73 20 63 6f 64 65 20 77 61 73 0a    This code was.
17e20 20 2a 20 77 72 69 74 74 65 6e 20 62 79 20 43 6f   * written by Co
17e30 6c 69 6e 20 50 6c 75 6d 62 20 69 6e 20 31 39 39  lin Plumb in 199
17e40 33 2c 20 6e 6f 20 63 6f 70 79 72 69 67 68 74 20  3, no copyright 
17e50 69 73 20 63 6c 61 69 6d 65 64 2e 0a 20 2a 20 54  is claimed.. * T
17e60 68 69 73 20 63 6f 64 65 20 69 73 20 69 6e 20 74  his code is in t
17e70 68 65 20 70 75 62 6c 69 63 20 64 6f 6d 61 69 6e  he public domain
17e80 3b 20 64 6f 20 77 69 74 68 20 69 74 20 77 68 61  ; do with it wha
17e90 74 20 79 6f 75 20 77 69 73 68 2e 0a 20 2a 0a 20  t you wish.. *. 
17ea0 2a 20 45 71 75 69 76 61 6c 65 6e 74 20 63 6f 64  * Equivalent cod
17eb0 65 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20 66  e is available f
17ec0 72 6f 6d 20 52 53 41 20 44 61 74 61 20 53 65 63  rom RSA Data Sec
17ed0 75 72 69 74 79 2c 20 49 6e 63 2e 0a 20 2a 20 54  urity, Inc.. * T
17ee0 68 69 73 20 63 6f 64 65 20 68 61 73 20 62 65 65  his code has bee
17ef0 6e 20 74 65 73 74 65 64 20 61 67 61 69 6e 73 74  n tested against
17f00 20 74 68 61 74 2c 20 61 6e 64 20 69 73 20 65 71   that, and is eq
17f10 75 69 76 61 6c 65 6e 74 2c 0a 20 2a 20 65 78 63  uivalent,. * exc
17f20 65 70 74 20 74 68 61 74 20 79 6f 75 20 64 6f 6e  ept that you don
17f30 27 74 20 6e 65 65 64 20 74 6f 20 69 6e 63 6c 75  't need to inclu
17f40 64 65 20 74 77 6f 20 70 61 67 65 73 20 6f 66 20  de two pages of 
17f50 6c 65 67 61 6c 65 73 65 0a 20 2a 20 77 69 74 68  legalese. * with
17f60 20 65 76 65 72 79 20 63 6f 70 79 2e 0a 20 2a 0a   every copy.. *.
17f70 20 2a 20 54 6f 20 63 6f 6d 70 75 74 65 20 74 68   * To compute th
17f80 65 20 6d 65 73 73 61 67 65 20 64 69 67 65 73 74  e message digest
17f90 20 6f 66 20 61 20 63 68 75 6e 6b 20 6f 66 20 62   of a chunk of b
17fa0 79 74 65 73 2c 20 64 65 63 6c 61 72 65 20 61 6e  ytes, declare an
17fb0 0a 20 2a 20 4d 44 35 43 6f 6e 74 65 78 74 20 73  . * MD5Context s
17fc0 74 72 75 63 74 75 72 65 2c 20 70 61 73 73 20 69  tructure, pass i
17fd0 74 20 74 6f 20 4d 44 35 49 6e 69 74 2c 20 63 61  t to MD5Init, ca
17fe0 6c 6c 20 4d 44 35 55 70 64 61 74 65 20 61 73 0a  ll MD5Update as.
17ff0 20 2a 20 6e 65 65 64 65 64 20 6f 6e 20 62 75 66   * needed on buf
18000 66 65 72 73 20 66 75 6c 6c 20 6f 66 20 62 79 74  fers full of byt
18010 65 73 2c 20 61 6e 64 20 74 68 65 6e 20 63 61 6c  es, and then cal
18020 6c 20 4d 44 35 46 69 6e 61 6c 2c 20 77 68 69 63  l MD5Final, whic
18030 68 0a 20 2a 20 77 69 6c 6c 20 66 69 6c 6c 20 61  h. * will fill a
18040 20 73 75 70 70 6c 69 65 64 20 31 36 2d 62 79 74   supplied 16-byt
18050 65 20 61 72 72 61 79 20 77 69 74 68 20 74 68 65  e array with the
18060 20 64 69 67 65 73 74 2e 0a 20 2a 2f 0a 0a 2f 2a   digest.. */../*
18070 0a 20 2a 20 49 66 20 63 6f 6d 70 69 6c 65 64 20  . * If compiled 
18080 6f 6e 20 61 20 6d 61 63 68 69 6e 65 20 74 68 61  on a machine tha
18090 74 20 64 6f 65 73 6e 27 74 20 68 61 76 65 20 61  t doesn't have a
180a0 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 2c   32-bit integer,
180b0 0a 20 2a 20 79 6f 75 20 6a 75 73 74 20 73 65 74  . * you just set
180c0 20 22 75 69 6e 74 33 32 22 20 74 6f 20 74 68 65   "uint32" to the
180d0 20 61 70 70 72 6f 70 72 69 61 74 65 20 64 61 74   appropriate dat
180e0 61 74 79 70 65 20 66 6f 72 20 61 6e 0a 20 2a 20  atype for an. * 
180f0 75 6e 73 69 67 6e 65 64 20 33 32 2d 62 69 74 20  unsigned 32-bit 
18100 69 6e 74 65 67 65 72 2e 20 20 46 6f 72 20 65 78  integer.  For ex
18110 61 6d 70 6c 65 3a 0a 20 2a 0a 20 2a 20 20 20 20  ample:. *. *    
18120 20 20 20 63 63 20 2d 44 75 69 6e 74 33 32 3d 27     cc -Duint32='
18130 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 27 20 6d  unsigned long' m
18140 64 35 2e 63 0a 20 2a 0a 20 2a 2f 0a 23 69 66 6e  d5.c. *. */.#ifn
18150 64 65 66 20 75 69 6e 74 33 32 0a 23 20 20 64 65  def uint32.#  de
18160 66 69 6e 65 20 75 69 6e 74 33 32 20 75 6e 73 69  fine uint32 unsi
18170 67 6e 65 64 20 69 6e 74 0a 23 65 6e 64 69 66 0a  gned int.#endif.
18180 0a 73 74 72 75 63 74 20 4d 44 35 43 6f 6e 74 65  .struct MD5Conte
18190 78 74 20 7b 0a 20 20 69 6e 74 20 69 73 49 6e 69  xt {.  int isIni
181a0 74 3b 0a 20 20 75 69 6e 74 33 32 20 62 75 66 5b  t;.  uint32 buf[
181b0 34 5d 3b 0a 20 20 75 69 6e 74 33 32 20 62 69 74  4];.  uint32 bit
181c0 73 5b 32 5d 3b 0a 20 20 75 6e 73 69 67 6e 65 64  s[2];.  unsigned
181d0 20 63 68 61 72 20 69 6e 5b 36 34 5d 3b 0a 7d 3b   char in[64];.};
181e0 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
181f0 4d 44 35 43 6f 6e 74 65 78 74 20 4d 44 35 43 6f  MD5Context MD5Co
18200 6e 74 65 78 74 3b 0a 0a 2f 2a 0a 20 2a 20 4e 6f  ntext;../*. * No
18210 74 65 3a 20 74 68 69 73 20 63 6f 64 65 20 69 73  te: this code is
18220 20 68 61 72 6d 6c 65 73 73 20 6f 6e 20 6c 69 74   harmless on lit
18230 74 6c 65 2d 65 6e 64 69 61 6e 20 6d 61 63 68 69  tle-endian machi
18240 6e 65 73 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20  nes.. */.static 
18250 76 6f 69 64 20 62 79 74 65 52 65 76 65 72 73 65  void byteReverse
18260 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20   (unsigned char 
18270 2a 62 75 66 2c 20 75 6e 73 69 67 6e 65 64 20 6c  *buf, unsigned l
18280 6f 6e 67 73 29 7b 0a 20 20 20 20 20 20 20 20 75  ongs){.        u
18290 69 6e 74 33 32 20 74 3b 0a 20 20 20 20 20 20 20  int32 t;.       
182a0 20 64 6f 20 7b 0a 20 20 20 20 20 20 20 20 20 20   do {.          
182b0 20 20 20 20 20 20 74 20 3d 20 28 75 69 6e 74 33        t = (uint3
182c0 32 29 28 28 75 6e 73 69 67 6e 65 64 29 62 75 66  2)((unsigned)buf
182d0 5b 33 5d 3c 3c 38 20 7c 20 62 75 66 5b 32 5d 29  [3]<<8 | buf[2])
182e0 20 3c 3c 20 31 36 20 7c 0a 20 20 20 20 20 20 20   << 16 |.       
182f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18300 20 20 20 20 20 28 28 75 6e 73 69 67 6e 65 64 29       ((unsigned)
18310 62 75 66 5b 31 5d 3c 3c 38 20 7c 20 62 75 66 5b  buf[1]<<8 | buf[
18320 30 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  0]);.           
18330 20 20 20 20 20 2a 28 75 69 6e 74 33 32 20 2a 29       *(uint32 *)
18340 62 75 66 20 3d 20 74 3b 0a 20 20 20 20 20 20 20  buf = t;.       
18350 20 20 20 20 20 20 20 20 20 62 75 66 20 2b 3d 20           buf += 
18360 34 3b 0a 20 20 20 20 20 20 20 20 7d 20 77 68 69  4;.        } whi
18370 6c 65 20 28 2d 2d 6c 6f 6e 67 73 29 3b 0a 7d 0a  le (--longs);.}.
18380 2f 2a 20 54 68 65 20 66 6f 75 72 20 63 6f 72 65  /* The four core
18390 20 66 75 6e 63 74 69 6f 6e 73 20 2d 20 46 31 20   functions - F1 
183a0 69 73 20 6f 70 74 69 6d 69 7a 65 64 20 73 6f 6d  is optimized som
183b0 65 77 68 61 74 20 2a 2f 0a 0a 2f 2a 20 23 64 65  ewhat */../* #de
183c0 66 69 6e 65 20 46 31 28 78 2c 20 79 2c 20 7a 29  fine F1(x, y, z)
183d0 20 28 78 20 26 20 79 20 7c 20 7e 78 20 26 20 7a   (x & y | ~x & z
183e0 29 20 2a 2f 0a 23 64 65 66 69 6e 65 20 46 31 28  ) */.#define F1(
183f0 78 2c 20 79 2c 20 7a 29 20 28 7a 20 5e 20 28 78  x, y, z) (z ^ (x
18400 20 26 20 28 79 20 5e 20 7a 29 29 29 0a 23 64 65   & (y ^ z))).#de
18410 66 69 6e 65 20 46 32 28 78 2c 20 79 2c 20 7a 29  fine F2(x, y, z)
18420 20 46 31 28 7a 2c 20 78 2c 20 79 29 0a 23 64 65   F1(z, x, y).#de
18430 66 69 6e 65 20 46 33 28 78 2c 20 79 2c 20 7a 29  fine F3(x, y, z)
18440 20 28 78 20 5e 20 79 20 5e 20 7a 29 0a 23 64 65   (x ^ y ^ z).#de
18450 66 69 6e 65 20 46 34 28 78 2c 20 79 2c 20 7a 29  fine F4(x, y, z)
18460 20 28 79 20 5e 20 28 78 20 7c 20 7e 7a 29 29 0a   (y ^ (x | ~z)).
18470 0a 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65 20  ./* This is the 
18480 63 65 6e 74 72 61 6c 20 73 74 65 70 20 69 6e 20  central step in 
18490 74 68 65 20 4d 44 35 20 61 6c 67 6f 72 69 74 68  the MD5 algorith
184a0 6d 2e 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 44  m. */.#define MD
184b0 35 53 54 45 50 28 66 2c 20 77 2c 20 78 2c 20 79  5STEP(f, w, x, y
184c0 2c 20 7a 2c 20 64 61 74 61 2c 20 73 29 20 5c 0a  , z, data, s) \.
184d0 20 20 20 20 20 20 20 20 28 20 77 20 2b 3d 20 66          ( w += f
184e0 28 78 2c 20 79 2c 20 7a 29 20 2b 20 64 61 74 61  (x, y, z) + data
184f0 2c 20 20 77 20 3d 20 77 3c 3c 73 20 7c 20 77 3e  ,  w = w<<s | w>
18500 3e 28 33 32 2d 73 29 2c 20 20 77 20 2b 3d 20 78  >(32-s),  w += x
18510 20 29 0a 0a 2f 2a 0a 20 2a 20 54 68 65 20 63 6f   )../*. * The co
18520 72 65 20 6f 66 20 74 68 65 20 4d 44 35 20 61 6c  re of the MD5 al
18530 67 6f 72 69 74 68 6d 2c 20 74 68 69 73 20 61 6c  gorithm, this al
18540 74 65 72 73 20 61 6e 20 65 78 69 73 74 69 6e 67  ters an existing
18550 20 4d 44 35 20 68 61 73 68 20 74 6f 0a 20 2a 20   MD5 hash to. * 
18560 72 65 66 6c 65 63 74 20 74 68 65 20 61 64 64 69  reflect the addi
18570 74 69 6f 6e 20 6f 66 20 31 36 20 6c 6f 6e 67 77  tion of 16 longw
18580 6f 72 64 73 20 6f 66 20 6e 65 77 20 64 61 74 61  ords of new data
18590 2e 20 20 4d 44 35 55 70 64 61 74 65 20 62 6c 6f  .  MD5Update blo
185a0 63 6b 73 0a 20 2a 20 74 68 65 20 64 61 74 61 20  cks. * the data 
185b0 61 6e 64 20 63 6f 6e 76 65 72 74 73 20 62 79 74  and converts byt
185c0 65 73 20 69 6e 74 6f 20 6c 6f 6e 67 77 6f 72 64  es into longword
185d0 73 20 66 6f 72 20 74 68 69 73 20 72 6f 75 74 69  s for this routi
185e0 6e 65 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20 76  ne.. */.static v
185f0 6f 69 64 20 4d 44 35 54 72 61 6e 73 66 6f 72 6d  oid MD5Transform
18600 28 75 69 6e 74 33 32 20 62 75 66 5b 34 5d 2c 20  (uint32 buf[4], 
18610 63 6f 6e 73 74 20 75 69 6e 74 33 32 20 69 6e 5b  const uint32 in[
18620 31 36 5d 29 7b 0a 20 20 20 20 20 20 20 20 72 65  16]){.        re
18630 67 69 73 74 65 72 20 75 69 6e 74 33 32 20 61 2c  gister uint32 a,
18640 20 62 2c 20 63 2c 20 64 3b 0a 0a 20 20 20 20 20   b, c, d;..     
18650 20 20 20 61 20 3d 20 62 75 66 5b 30 5d 3b 0a 20     a = buf[0];. 
18660 20 20 20 20 20 20 20 62 20 3d 20 62 75 66 5b 31         b = buf[1
18670 5d 3b 0a 20 20 20 20 20 20 20 20 63 20 3d 20 62  ];.        c = b
18680 75 66 5b 32 5d 3b 0a 20 20 20 20 20 20 20 20 64  uf[2];.        d
18690 20 3d 20 62 75 66 5b 33 5d 3b 0a 0a 20 20 20 20   = buf[3];..    
186a0 20 20 20 20 4d 44 35 53 54 45 50 28 46 31 2c 20      MD5STEP(F1, 
186b0 61 2c 20 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 20  a, b, c, d, in[ 
186c0 30 5d 2b 30 78 64 37 36 61 61 34 37 38 2c 20 20  0]+0xd76aa478,  
186d0 37 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53  7);.        MD5S
186e0 54 45 50 28 46 31 2c 20 64 2c 20 61 2c 20 62 2c  TEP(F1, d, a, b,
186f0 20 63 2c 20 69 6e 5b 20 31 5d 2b 30 78 65 38 63   c, in[ 1]+0xe8c
18700 37 62 37 35 36 2c 20 31 32 29 3b 0a 20 20 20 20  7b756, 12);.    
18710 20 20 20 20 4d 44 35 53 54 45 50 28 46 31 2c 20      MD5STEP(F1, 
18720 63 2c 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 20  c, d, a, b, in[ 
18730 32 5d 2b 30 78 32 34 32 30 37 30 64 62 2c 20 31  2]+0x242070db, 1
18740 37 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53  7);.        MD5S
18750 54 45 50 28 46 31 2c 20 62 2c 20 63 2c 20 64 2c  TEP(F1, b, c, d,
18760 20 61 2c 20 69 6e 5b 20 33 5d 2b 30 78 63 31 62   a, in[ 3]+0xc1b
18770 64 63 65 65 65 2c 20 32 32 29 3b 0a 20 20 20 20  dceee, 22);.    
18780 20 20 20 20 4d 44 35 53 54 45 50 28 46 31 2c 20      MD5STEP(F1, 
18790 61 2c 20 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 20  a, b, c, d, in[ 
187a0 34 5d 2b 30 78 66 35 37 63 30 66 61 66 2c 20 20  4]+0xf57c0faf,  
187b0 37 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53  7);.        MD5S
187c0 54 45 50 28 46 31 2c 20 64 2c 20 61 2c 20 62 2c  TEP(F1, d, a, b,
187d0 20 63 2c 20 69 6e 5b 20 35 5d 2b 30 78 34 37 38   c, in[ 5]+0x478
187e0 37 63 36 32 61 2c 20 31 32 29 3b 0a 20 20 20 20  7c62a, 12);.    
187f0 20 20 20 20 4d 44 35 53 54 45 50 28 46 31 2c 20      MD5STEP(F1, 
18800 63 2c 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 20  c, d, a, b, in[ 
18810 36 5d 2b 30 78 61 38 33 30 34 36 31 33 2c 20 31  6]+0xa8304613, 1
18820 37 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53  7);.        MD5S
18830 54 45 50 28 46 31 2c 20 62 2c 20 63 2c 20 64 2c  TEP(F1, b, c, d,
18840 20 61 2c 20 69 6e 5b 20 37 5d 2b 30 78 66 64 34   a, in[ 7]+0xfd4
18850 36 39 35 30 31 2c 20 32 32 29 3b 0a 20 20 20 20  69501, 22);.    
18860 20 20 20 20 4d 44 35 53 54 45 50 28 46 31 2c 20      MD5STEP(F1, 
18870 61 2c 20 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 20  a, b, c, d, in[ 
18880 38 5d 2b 30 78 36 39 38 30 39 38 64 38 2c 20 20  8]+0x698098d8,  
18890 37 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53  7);.        MD5S
188a0 54 45 50 28 46 31 2c 20 64 2c 20 61 2c 20 62 2c  TEP(F1, d, a, b,
188b0 20 63 2c 20 69 6e 5b 20 39 5d 2b 30 78 38 62 34   c, in[ 9]+0x8b4
188c0 34 66 37 61 66 2c 20 31 32 29 3b 0a 20 20 20 20  4f7af, 12);.    
188d0 20 20 20 20 4d 44 35 53 54 45 50 28 46 31 2c 20      MD5STEP(F1, 
188e0 63 2c 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 31  c, d, a, b, in[1
188f0 30 5d 2b 30 78 66 66 66 66 35 62 62 31 2c 20 31  0]+0xffff5bb1, 1
18900 37 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53  7);.        MD5S
18910 54 45 50 28 46 31 2c 20 62 2c 20 63 2c 20 64 2c  TEP(F1, b, c, d,
18920 20 61 2c 20 69 6e 5b 31 31 5d 2b 30 78 38 39 35   a, in[11]+0x895
18930 63 64 37 62 65 2c 20 32 32 29 3b 0a 20 20 20 20  cd7be, 22);.    
18940 20 20 20 20 4d 44 35 53 54 45 50 28 46 31 2c 20      MD5STEP(F1, 
18950 61 2c 20 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 31  a, b, c, d, in[1
18960 32 5d 2b 30 78 36 62 39 30 31 31 32 32 2c 20 20  2]+0x6b901122,  
18970 37 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53  7);.        MD5S
18980 54 45 50 28 46 31 2c 20 64 2c 20 61 2c 20 62 2c  TEP(F1, d, a, b,
18990 20 63 2c 20 69 6e 5b 31 33 5d 2b 30 78 66 64 39   c, in[13]+0xfd9
189a0 38 37 31 39 33 2c 20 31 32 29 3b 0a 20 20 20 20  87193, 12);.    
189b0 20 20 20 20 4d 44 35 53 54 45 50 28 46 31 2c 20      MD5STEP(F1, 
189c0 63 2c 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 31  c, d, a, b, in[1
189d0 34 5d 2b 30 78 61 36 37 39 34 33 38 65 2c 20 31  4]+0xa679438e, 1
189e0 37 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53  7);.        MD5S
189f0 54 45 50 28 46 31 2c 20 62 2c 20 63 2c 20 64 2c  TEP(F1, b, c, d,
18a00 20 61 2c 20 69 6e 5b 31 35 5d 2b 30 78 34 39 62   a, in[15]+0x49b
18a10 34 30 38 32 31 2c 20 32 32 29 3b 0a 0a 20 20 20  40821, 22);..   
18a20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 32 2c       MD5STEP(F2,
18a30 20 61 2c 20 62 2c 20 63 2c 20 64 2c 20 69 6e 5b   a, b, c, d, in[
18a40 20 31 5d 2b 30 78 66 36 31 65 32 35 36 32 2c 20   1]+0xf61e2562, 
18a50 20 35 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35   5);.        MD5
18a60 53 54 45 50 28 46 32 2c 20 64 2c 20 61 2c 20 62  STEP(F2, d, a, b
18a70 2c 20 63 2c 20 69 6e 5b 20 36 5d 2b 30 78 63 30  , c, in[ 6]+0xc0
18a80 34 30 62 33 34 30 2c 20 20 39 29 3b 0a 20 20 20  40b340,  9);.   
18a90 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 32 2c       MD5STEP(F2,
18aa0 20 63 2c 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b   c, d, a, b, in[
18ab0 31 31 5d 2b 30 78 32 36 35 65 35 61 35 31 2c 20  11]+0x265e5a51, 
18ac0 31 34 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35  14);.        MD5
18ad0 53 54 45 50 28 46 32 2c 20 62 2c 20 63 2c 20 64  STEP(F2, b, c, d
18ae0 2c 20 61 2c 20 69 6e 5b 20 30 5d 2b 30 78 65 39  , a, in[ 0]+0xe9
18af0 62 36 63 37 61 61 2c 20 32 30 29 3b 0a 20 20 20  b6c7aa, 20);.   
18b00 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 32 2c       MD5STEP(F2,
18b10 20 61 2c 20 62 2c 20 63 2c 20 64 2c 20 69 6e 5b   a, b, c, d, in[
18b20 20 35 5d 2b 30 78 64 36 32 66 31 30 35 64 2c 20   5]+0xd62f105d, 
18b30 20 35 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35   5);.        MD5
18b40 53 54 45 50 28 46 32 2c 20 64 2c 20 61 2c 20 62  STEP(F2, d, a, b
18b50 2c 20 63 2c 20 69 6e 5b 31 30 5d 2b 30 78 30 32  , c, in[10]+0x02
18b60 34 34 31 34 35 33 2c 20 20 39 29 3b 0a 20 20 20  441453,  9);.   
18b70 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 32 2c       MD5STEP(F2,
18b80 20 63 2c 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b   c, d, a, b, in[
18b90 31 35 5d 2b 30 78 64 38 61 31 65 36 38 31 2c 20  15]+0xd8a1e681, 
18ba0 31 34 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35  14);.        MD5
18bb0 53 54 45 50 28 46 32 2c 20 62 2c 20 63 2c 20 64  STEP(F2, b, c, d
18bc0 2c 20 61 2c 20 69 6e 5b 20 34 5d 2b 30 78 65 37  , a, in[ 4]+0xe7
18bd0 64 33 66 62 63 38 2c 20 32 30 29 3b 0a 20 20 20  d3fbc8, 20);.   
18be0 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 32 2c       MD5STEP(F2,
18bf0 20 61 2c 20 62 2c 20 63 2c 20 64 2c 20 69 6e 5b   a, b, c, d, in[
18c00 20 39 5d 2b 30 78 32 31 65 31 63 64 65 36 2c 20   9]+0x21e1cde6, 
18c10 20 35 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35   5);.        MD5
18c20 53 54 45 50 28 46 32 2c 20 64 2c 20 61 2c 20 62  STEP(F2, d, a, b
18c30 2c 20 63 2c 20 69 6e 5b 31 34 5d 2b 30 78 63 33  , c, in[14]+0xc3
18c40 33 37 30 37 64 36 2c 20 20 39 29 3b 0a 20 20 20  3707d6,  9);.   
18c50 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 32 2c       MD5STEP(F2,
18c60 20 63 2c 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b   c, d, a, b, in[
18c70 20 33 5d 2b 30 78 66 34 64 35 30 64 38 37 2c 20   3]+0xf4d50d87, 
18c80 31 34 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35  14);.        MD5
18c90 53 54 45 50 28 46 32 2c 20 62 2c 20 63 2c 20 64  STEP(F2, b, c, d
18ca0 2c 20 61 2c 20 69 6e 5b 20 38 5d 2b 30 78 34 35  , a, in[ 8]+0x45
18cb0 35 61 31 34 65 64 2c 20 32 30 29 3b 0a 20 20 20  5a14ed, 20);.   
18cc0 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 32 2c       MD5STEP(F2,
18cd0 20 61 2c 20 62 2c 20 63 2c 20 64 2c 20 69 6e 5b   a, b, c, d, in[
18ce0 31 33 5d 2b 30 78 61 39 65 33 65 39 30 35 2c 20  13]+0xa9e3e905, 
18cf0 20 35 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35   5);.        MD5
18d00 53 54 45 50 28 46 32 2c 20 64 2c 20 61 2c 20 62  STEP(F2, d, a, b
18d10 2c 20 63 2c 20 69 6e 5b 20 32 5d 2b 30 78 66 63  , c, in[ 2]+0xfc
18d20 65 66 61 33 66 38 2c 20 20 39 29 3b 0a 20 20 20  efa3f8,  9);.   
18d30 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 32 2c       MD5STEP(F2,
18d40 20 63 2c 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b   c, d, a, b, in[
18d50 20 37 5d 2b 30 78 36 37 36 66 30 32 64 39 2c 20   7]+0x676f02d9, 
18d60 31 34 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35  14);.        MD5
18d70 53 54 45 50 28 46 32 2c 20 62 2c 20 63 2c 20 64  STEP(F2, b, c, d
18d80 2c 20 61 2c 20 69 6e 5b 31 32 5d 2b 30 78 38 64  , a, in[12]+0x8d
18d90 32 61 34 63 38 61 2c 20 32 30 29 3b 0a 0a 20 20  2a4c8a, 20);..  
18da0 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 33        MD5STEP(F3
18db0 2c 20 61 2c 20 62 2c 20 63 2c 20 64 2c 20 69 6e  , a, b, c, d, in
18dc0 5b 20 35 5d 2b 30 78 66 66 66 61 33 39 34 32 2c  [ 5]+0xfffa3942,
18dd0 20 20 34 29 3b 0a 20 20 20 20 20 20 20 20 4d 44    4);.        MD
18de0 35 53 54 45 50 28 46 33 2c 20 64 2c 20 61 2c 20  5STEP(F3, d, a, 
18df0 62 2c 20 63 2c 20 69 6e 5b 20 38 5d 2b 30 78 38  b, c, in[ 8]+0x8
18e00 37 37 31 66 36 38 31 2c 20 31 31 29 3b 0a 20 20  771f681, 11);.  
18e10 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 33        MD5STEP(F3
18e20 2c 20 63 2c 20 64 2c 20 61 2c 20 62 2c 20 69 6e  , c, d, a, b, in
18e30 5b 31 31 5d 2b 30 78 36 64 39 64 36 31 32 32 2c  [11]+0x6d9d6122,
18e40 20 31 36 29 3b 0a 20 20 20 20 20 20 20 20 4d 44   16);.        MD
18e50 35 53 54 45 50 28 46 33 2c 20 62 2c 20 63 2c 20  5STEP(F3, b, c, 
18e60 64 2c 20 61 2c 20 69 6e 5b 31 34 5d 2b 30 78 66  d, a, in[14]+0xf
18e70 64 65 35 33 38 30 63 2c 20 32 33 29 3b 0a 20 20  de5380c, 23);.  
18e80 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 33        MD5STEP(F3
18e90 2c 20 61 2c 20 62 2c 20 63 2c 20 64 2c 20 69 6e  , a, b, c, d, in
18ea0 5b 20 31 5d 2b 30 78 61 34 62 65 65 61 34 34 2c  [ 1]+0xa4beea44,
18eb0 20 20 34 29 3b 0a 20 20 20 20 20 20 20 20 4d 44    4);.        MD
18ec0 35 53 54 45 50 28 46 33 2c 20 64 2c 20 61 2c 20  5STEP(F3, d, a, 
18ed0 62 2c 20 63 2c 20 69 6e 5b 20 34 5d 2b 30 78 34  b, c, in[ 4]+0x4
18ee0 62 64 65 63 66 61 39 2c 20 31 31 29 3b 0a 20 20  bdecfa9, 11);.  
18ef0 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 33        MD5STEP(F3
18f00 2c 20 63 2c 20 64 2c 20 61 2c 20 62 2c 20 69 6e  , c, d, a, b, in
18f10 5b 20 37 5d 2b 30 78 66 36 62 62 34 62 36 30 2c  [ 7]+0xf6bb4b60,
18f20 20 31 36 29 3b 0a 20 20 20 20 20 20 20 20 4d 44   16);.        MD
18f30 35 53 54 45 50 28 46 33 2c 20 62 2c 20 63 2c 20  5STEP(F3, b, c, 
18f40 64 2c 20 61 2c 20 69 6e 5b 31 30 5d 2b 30 78 62  d, a, in[10]+0xb
18f50 65 62 66 62 63 37 30 2c 20 32 33 29 3b 0a 20 20  ebfbc70, 23);.  
18f60 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 33        MD5STEP(F3
18f70 2c 20 61 2c 20 62 2c 20 63 2c 20 64 2c 20 69 6e  , a, b, c, d, in
18f80 5b 31 33 5d 2b 30 78 32 38 39 62 37 65 63 36 2c  [13]+0x289b7ec6,
18f90 20 20 34 29 3b 0a 20 20 20 20 20 20 20 20 4d 44    4);.        MD
18fa0 35 53 54 45 50 28 46 33 2c 20 64 2c 20 61 2c 20  5STEP(F3, d, a, 
18fb0 62 2c 20 63 2c 20 69 6e 5b 20 30 5d 2b 30 78 65  b, c, in[ 0]+0xe
18fc0 61 61 31 32 37 66 61 2c 20 31 31 29 3b 0a 20 20  aa127fa, 11);.  
18fd0 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 33        MD5STEP(F3
18fe0 2c 20 63 2c 20 64 2c 20 61 2c 20 62 2c 20 69 6e  , c, d, a, b, in
18ff0 5b 20 33 5d 2b 30 78 64 34 65 66 33 30 38 35 2c  [ 3]+0xd4ef3085,
19000 20 31 36 29 3b 0a 20 20 20 20 20 20 20 20 4d 44   16);.        MD
19010 35 53 54 45 50 28 46 33 2c 20 62 2c 20 63 2c 20  5STEP(F3, b, c, 
19020 64 2c 20 61 2c 20 69 6e 5b 20 36 5d 2b 30 78 30  d, a, in[ 6]+0x0
19030 34 38 38 31 64 30 35 2c 20 32 33 29 3b 0a 20 20  4881d05, 23);.  
19040 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 33        MD5STEP(F3
19050 2c 20 61 2c 20 62 2c 20 63 2c 20 64 2c 20 69 6e  , a, b, c, d, in
19060 5b 20 39 5d 2b 30 78 64 39 64 34 64 30 33 39 2c  [ 9]+0xd9d4d039,
19070 20 20 34 29 3b 0a 20 20 20 20 20 20 20 20 4d 44    4);.        MD
19080 35 53 54 45 50 28 46 33 2c 20 64 2c 20 61 2c 20  5STEP(F3, d, a, 
19090 62 2c 20 63 2c 20 69 6e 5b 31 32 5d 2b 30 78 65  b, c, in[12]+0xe
190a0 36 64 62 39 39 65 35 2c 20 31 31 29 3b 0a 20 20  6db99e5, 11);.  
190b0 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 33        MD5STEP(F3
190c0 2c 20 63 2c 20 64 2c 20 61 2c 20 62 2c 20 69 6e  , c, d, a, b, in
190d0 5b 31 35 5d 2b 30 78 31 66 61 32 37 63 66 38 2c  [15]+0x1fa27cf8,
190e0 20 31 36 29 3b 0a 20 20 20 20 20 20 20 20 4d 44   16);.        MD
190f0 35 53 54 45 50 28 46 33 2c 20 62 2c 20 63 2c 20  5STEP(F3, b, c, 
19100 64 2c 20 61 2c 20 69 6e 5b 20 32 5d 2b 30 78 63  d, a, in[ 2]+0xc
19110 34 61 63 35 36 36 35 2c 20 32 33 29 3b 0a 0a 20  4ac5665, 23);.. 
19120 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
19130 34 2c 20 61 2c 20 62 2c 20 63 2c 20 64 2c 20 69  4, a, b, c, d, i
19140 6e 5b 20 30 5d 2b 30 78 66 34 32 39 32 32 34 34  n[ 0]+0xf4292244
19150 2c 20 20 36 29 3b 0a 20 20 20 20 20 20 20 20 4d  ,  6);.        M
19160 44 35 53 54 45 50 28 46 34 2c 20 64 2c 20 61 2c  D5STEP(F4, d, a,
19170 20 62 2c 20 63 2c 20 69 6e 5b 20 37 5d 2b 30 78   b, c, in[ 7]+0x
19180 34 33 32 61 66 66 39 37 2c 20 31 30 29 3b 0a 20  432aff97, 10);. 
19190 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
191a0 34 2c 20 63 2c 20 64 2c 20 61 2c 20 62 2c 20 69  4, c, d, a, b, i
191b0 6e 5b 31 34 5d 2b 30 78 61 62 39 34 32 33 61 37  n[14]+0xab9423a7
191c0 2c 20 31 35 29 3b 0a 20 20 20 20 20 20 20 20 4d  , 15);.        M
191d0 44 35 53 54 45 50 28 46 34 2c 20 62 2c 20 63 2c  D5STEP(F4, b, c,
191e0 20 64 2c 20 61 2c 20 69 6e 5b 20 35 5d 2b 30 78   d, a, in[ 5]+0x
191f0 66 63 39 33 61 30 33 39 2c 20 32 31 29 3b 0a 20  fc93a039, 21);. 
19200 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
19210 34 2c 20 61 2c 20 62 2c 20 63 2c 20 64 2c 20 69  4, a, b, c, d, i
19220 6e 5b 31 32 5d 2b 30 78 36 35 35 62 35 39 63 33  n[12]+0x655b59c3
19230 2c 20 20 36 29 3b 0a 20 20 20 20 20 20 20 20 4d  ,  6);.        M
19240 44 35 53 54 45 50 28 46 34 2c 20 64 2c 20 61 2c  D5STEP(F4, d, a,
19250 20 62 2c 20 63 2c 20 69 6e 5b 20 33 5d 2b 30 78   b, c, in[ 3]+0x
19260 38 66 30 63 63 63 39 32 2c 20 31 30 29 3b 0a 20  8f0ccc92, 10);. 
19270 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
19280 34 2c 20 63 2c 20 64 2c 20 61 2c 20 62 2c 20 69  4, c, d, a, b, i
19290 6e 5b 31 30 5d 2b 30 78 66 66 65 66 66 34 37 64  n[10]+0xffeff47d
192a0 2c 20 31 35 29 3b 0a 20 20 20 20 20 20 20 20 4d  , 15);.        M
192b0 44 35 53 54 45 50 28 46 34 2c 20 62 2c 20 63 2c  D5STEP(F4, b, c,
192c0 20 64 2c 20 61 2c 20 69 6e 5b 20 31 5d 2b 30 78   d, a, in[ 1]+0x
192d0 38 35 38 34 35 64 64 31 2c 20 32 31 29 3b 0a 20  85845dd1, 21);. 
192e0 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
192f0 34 2c 20 61 2c 20 62 2c 20 63 2c 20 64 2c 20 69  4, a, b, c, d, i
19300 6e 5b 20 38 5d 2b 30 78 36 66 61 38 37 65 34 66  n[ 8]+0x6fa87e4f
19310 2c 20 20 36 29 3b 0a 20 20 20 20 20 20 20 20 4d  ,  6);.        M
19320 44 35 53 54 45 50 28 46 34 2c 20 64 2c 20 61 2c  D5STEP(F4, d, a,
19330 20 62 2c 20 63 2c 20 69 6e 5b 31 35 5d 2b 30 78   b, c, in[15]+0x
19340 66 65 32 63 65 36 65 30 2c 20 31 30 29 3b 0a 20  fe2ce6e0, 10);. 
19350 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
19360 34 2c 20 63 2c 20 64 2c 20 61 2c 20 62 2c 20 69  4, c, d, a, b, i
19370 6e 5b 20 36 5d 2b 30 78 61 33 30 31 34 33 31 34  n[ 6]+0xa3014314
19380 2c 20 31 35 29 3b 0a 20 20 20 20 20 20 20 20 4d  , 15);.        M
19390 44 35 53 54 45 50 28 46 34 2c 20 62 2c 20 63 2c  D5STEP(F4, b, c,
193a0 20 64 2c 20 61 2c 20 69 6e 5b 31 33 5d 2b 30 78   d, a, in[13]+0x
193b0 34 65 30 38 31 31 61 31 2c 20 32 31 29 3b 0a 20  4e0811a1, 21);. 
193c0 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
193d0 34 2c 20 61 2c 20 62 2c 20 63 2c 20 64 2c 20 69  4, a, b, c, d, i
193e0 6e 5b 20 34 5d 2b 30 78 66 37 35 33 37 65 38 32  n[ 4]+0xf7537e82
193f0 2c 20 20 36 29 3b 0a 20 20 20 20 20 20 20 20 4d  ,  6);.        M
19400 44 35 53 54 45 50 28 46 34 2c 20 64 2c 20 61 2c  D5STEP(F4, d, a,
19410 20 62 2c 20 63 2c 20 69 6e 5b 31 31 5d 2b 30 78   b, c, in[11]+0x
19420 62 64 33 61 66 32 33 35 2c 20 31 30 29 3b 0a 20  bd3af235, 10);. 
19430 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
19440 34 2c 20 63 2c 20 64 2c 20 61 2c 20 62 2c 20 69  4, c, d, a, b, i
19450 6e 5b 20 32 5d 2b 30 78 32 61 64 37 64 32 62 62  n[ 2]+0x2ad7d2bb
19460 2c 20 31 35 29 3b 0a 20 20 20 20 20 20 20 20 4d  , 15);.        M
19470 44 35 53 54 45 50 28 46 34 2c 20 62 2c 20 63 2c  D5STEP(F4, b, c,
19480 20 64 2c 20 61 2c 20 69 6e 5b 20 39 5d 2b 30 78   d, a, in[ 9]+0x
19490 65 62 38 36 64 33 39 31 2c 20 32 31 29 3b 0a 0a  eb86d391, 21);..
194a0 20 20 20 20 20 20 20 20 62 75 66 5b 30 5d 20 2b          buf[0] +
194b0 3d 20 61 3b 0a 20 20 20 20 20 20 20 20 62 75 66  = a;.        buf
194c0 5b 31 5d 20 2b 3d 20 62 3b 0a 20 20 20 20 20 20  [1] += b;.      
194d0 20 20 62 75 66 5b 32 5d 20 2b 3d 20 63 3b 0a 20    buf[2] += c;. 
194e0 20 20 20 20 20 20 20 62 75 66 5b 33 5d 20 2b 3d         buf[3] +=
194f0 20 64 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 74 61   d;.}../*. * Sta
19500 72 74 20 4d 44 35 20 61 63 63 75 6d 75 6c 61 74  rt MD5 accumulat
19510 69 6f 6e 2e 20 20 53 65 74 20 62 69 74 20 63 6f  ion.  Set bit co
19520 75 6e 74 20 74 6f 20 30 20 61 6e 64 20 62 75 66  unt to 0 and buf
19530 66 65 72 20 74 6f 20 6d 79 73 74 65 72 69 6f 75  fer to mysteriou
19540 73 0a 20 2a 20 69 6e 69 74 69 61 6c 69 7a 61 74  s. * initializat
19550 69 6f 6e 20 63 6f 6e 73 74 61 6e 74 73 2e 0a 20  ion constants.. 
19560 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 4d  */.static void M
19570 44 35 49 6e 69 74 28 4d 44 35 43 6f 6e 74 65 78  D5Init(MD5Contex
19580 74 20 2a 63 74 78 29 7b 0a 20 20 20 20 20 20 20  t *ctx){.       
19590 20 63 74 78 2d 3e 69 73 49 6e 69 74 20 3d 20 31   ctx->isInit = 1
195a0 3b 0a 20 20 20 20 20 20 20 20 63 74 78 2d 3e 62  ;.        ctx->b
195b0 75 66 5b 30 5d 20 3d 20 30 78 36 37 34 35 32 33  uf[0] = 0x674523
195c0 30 31 3b 0a 20 20 20 20 20 20 20 20 63 74 78 2d  01;.        ctx-
195d0 3e 62 75 66 5b 31 5d 20 3d 20 30 78 65 66 63 64  >buf[1] = 0xefcd
195e0 61 62 38 39 3b 0a 20 20 20 20 20 20 20 20 63 74  ab89;.        ct
195f0 78 2d 3e 62 75 66 5b 32 5d 20 3d 20 30 78 39 38  x->buf[2] = 0x98
19600 62 61 64 63 66 65 3b 0a 20 20 20 20 20 20 20 20  badcfe;.        
19610 63 74 78 2d 3e 62 75 66 5b 33 5d 20 3d 20 30 78  ctx->buf[3] = 0x
19620 31 30 33 32 35 34 37 36 3b 0a 20 20 20 20 20 20  10325476;.      
19630 20 20 63 74 78 2d 3e 62 69 74 73 5b 30 5d 20 3d    ctx->bits[0] =
19640 20 30 3b 0a 20 20 20 20 20 20 20 20 63 74 78 2d   0;.        ctx-
19650 3e 62 69 74 73 5b 31 5d 20 3d 20 30 3b 0a 7d 0a  >bits[1] = 0;.}.
19660 0a 2f 2a 0a 20 2a 20 55 70 64 61 74 65 20 63 6f  ./*. * Update co
19670 6e 74 65 78 74 20 74 6f 20 72 65 66 6c 65 63 74  ntext to reflect
19680 20 74 68 65 20 63 6f 6e 63 61 74 65 6e 61 74 69   the concatenati
19690 6f 6e 20 6f 66 20 61 6e 6f 74 68 65 72 20 62 75  on of another bu
196a0 66 66 65 72 20 66 75 6c 6c 0a 20 2a 20 6f 66 20  ffer full. * of 
196b0 62 79 74 65 73 2e 0a 20 2a 2f 0a 73 74 61 74 69  bytes.. */.stati
196c0 63 20 0a 76 6f 69 64 20 4d 44 35 55 70 64 61 74  c .void MD5Updat
196d0 65 28 4d 44 35 43 6f 6e 74 65 78 74 20 2a 63 74  e(MD5Context *ct
196e0 78 2c 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  x, const unsigne
196f0 64 20 63 68 61 72 20 2a 62 75 66 2c 20 75 6e 73  d char *buf, uns
19700 69 67 6e 65 64 20 69 6e 74 20 6c 65 6e 29 7b 0a  igned int len){.
19710 20 20 20 20 20 20 20 20 75 69 6e 74 33 32 20 74          uint32 t
19720 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 55 70  ;..        /* Up
19730 64 61 74 65 20 62 69 74 63 6f 75 6e 74 20 2a 2f  date bitcount */
19740 0a 0a 20 20 20 20 20 20 20 20 74 20 3d 20 63 74  ..        t = ct
19750 78 2d 3e 62 69 74 73 5b 30 5d 3b 0a 20 20 20 20  x->bits[0];.    
19760 20 20 20 20 69 66 20 28 28 63 74 78 2d 3e 62 69      if ((ctx->bi
19770 74 73 5b 30 5d 20 3d 20 74 20 2b 20 28 28 75 69  ts[0] = t + ((ui
19780 6e 74 33 32 29 6c 65 6e 20 3c 3c 20 33 29 29 20  nt32)len << 3)) 
19790 3c 20 74 29 0a 20 20 20 20 20 20 20 20 20 20 20  < t).           
197a0 20 20 20 20 20 63 74 78 2d 3e 62 69 74 73 5b 31       ctx->bits[1
197b0 5d 2b 2b 3b 20 2f 2a 20 43 61 72 72 79 20 66 72  ]++; /* Carry fr
197c0 6f 6d 20 6c 6f 77 20 74 6f 20 68 69 67 68 20 2a  om low to high *
197d0 2f 0a 20 20 20 20 20 20 20 20 63 74 78 2d 3e 62  /.        ctx->b
197e0 69 74 73 5b 31 5d 20 2b 3d 20 6c 65 6e 20 3e 3e  its[1] += len >>
197f0 20 32 39 3b 0a 0a 20 20 20 20 20 20 20 20 74 20   29;..        t 
19800 3d 20 28 74 20 3e 3e 20 33 29 20 26 20 30 78 33  = (t >> 3) & 0x3
19810 66 3b 20 20 20 20 2f 2a 20 42 79 74 65 73 20 61  f;    /* Bytes a
19820 6c 72 65 61 64 79 20 69 6e 20 73 68 73 49 6e 66  lready in shsInf
19830 6f 2d 3e 64 61 74 61 20 2a 2f 0a 0a 20 20 20 20  o->data */..    
19840 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 61 6e      /* Handle an
19850 79 20 6c 65 61 64 69 6e 67 20 6f 64 64 2d 73 69  y leading odd-si
19860 7a 65 64 20 63 68 75 6e 6b 73 20 2a 2f 0a 0a 20  zed chunks */.. 
19870 20 20 20 20 20 20 20 69 66 20 28 20 74 20 29 20         if ( t ) 
19880 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
19890 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
198a0 2a 70 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63  *p = (unsigned c
198b0 68 61 72 20 2a 29 63 74 78 2d 3e 69 6e 20 2b 20  har *)ctx->in + 
198c0 74 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20  t;..            
198d0 20 20 20 20 74 20 3d 20 36 34 2d 74 3b 0a 20 20      t = 64-t;.  
198e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
198f0 20 28 6c 65 6e 20 3c 20 74 29 20 7b 0a 20 20 20   (len < t) {.   
19900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19910 20 20 20 20 20 6d 65 6d 63 70 79 28 70 2c 20 62       memcpy(p, b
19920 75 66 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 20 20  uf, len);.      
19930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19940 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20    return;.      
19950 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
19960 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63              memc
19970 70 79 28 70 2c 20 62 75 66 2c 20 74 29 3b 0a 20  py(p, buf, t);. 
19980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
19990 79 74 65 52 65 76 65 72 73 65 28 63 74 78 2d 3e  yteReverse(ctx->
199a0 69 6e 2c 20 31 36 29 3b 0a 20 20 20 20 20 20 20  in, 16);.       
199b0 20 20 20 20 20 20 20 20 20 4d 44 35 54 72 61 6e           MD5Tran
199c0 73 66 6f 72 6d 28 63 74 78 2d 3e 62 75 66 2c 20  sform(ctx->buf, 
199d0 28 75 69 6e 74 33 32 20 2a 29 63 74 78 2d 3e 69  (uint32 *)ctx->i
199e0 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  n);.            
199f0 20 20 20 20 62 75 66 20 2b 3d 20 74 3b 0a 20 20      buf += t;.  
19a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 65                le
19a10 6e 20 2d 3d 20 74 3b 0a 20 20 20 20 20 20 20 20  n -= t;.        
19a20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 50 72  }..        /* Pr
19a30 6f 63 65 73 73 20 64 61 74 61 20 69 6e 20 36 34  ocess data in 64
19a40 2d 62 79 74 65 20 63 68 75 6e 6b 73 20 2a 2f 0a  -byte chunks */.
19a50 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 20 28  .        while (
19a60 6c 65 6e 20 3e 3d 20 36 34 29 20 7b 0a 20 20 20  len >= 64) {.   
19a70 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d               mem
19a80 63 70 79 28 63 74 78 2d 3e 69 6e 2c 20 62 75 66  cpy(ctx->in, buf
19a90 2c 20 36 34 29 3b 0a 20 20 20 20 20 20 20 20 20  , 64);.         
19aa0 20 20 20 20 20 20 20 62 79 74 65 52 65 76 65 72         byteRever
19ab0 73 65 28 63 74 78 2d 3e 69 6e 2c 20 31 36 29 3b  se(ctx->in, 16);
19ac0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
19ad0 20 4d 44 35 54 72 61 6e 73 66 6f 72 6d 28 63 74   MD5Transform(ct
19ae0 78 2d 3e 62 75 66 2c 20 28 75 69 6e 74 33 32 20  x->buf, (uint32 
19af0 2a 29 63 74 78 2d 3e 69 6e 29 3b 0a 20 20 20 20  *)ctx->in);.    
19b00 20 20 20 20 20 20 20 20 20 20 20 20 62 75 66 20              buf 
19b10 2b 3d 20 36 34 3b 0a 20 20 20 20 20 20 20 20 20  += 64;.         
19b20 20 20 20 20 20 20 20 6c 65 6e 20 2d 3d 20 36 34         len -= 64
19b30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
19b40 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 61       /* Handle a
19b50 6e 79 20 72 65 6d 61 69 6e 69 6e 67 20 62 79 74  ny remaining byt
19b60 65 73 20 6f 66 20 64 61 74 61 2e 20 2a 2f 0a 0a  es of data. */..
19b70 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 63          memcpy(c
19b80 74 78 2d 3e 69 6e 2c 20 62 75 66 2c 20 6c 65 6e  tx->in, buf, len
19b90 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 46 69 6e 61  );.}../*. * Fina
19ba0 6c 20 77 72 61 70 75 70 20 2d 20 70 61 64 20 74  l wrapup - pad t
19bb0 6f 20 36 34 2d 62 79 74 65 20 62 6f 75 6e 64 61  o 64-byte bounda
19bc0 72 79 20 77 69 74 68 20 74 68 65 20 62 69 74 20  ry with the bit 
19bd0 70 61 74 74 65 72 6e 20 0a 20 2a 20 31 20 30 2a  pattern . * 1 0*
19be0 20 28 36 34 2d 62 69 74 20 63 6f 75 6e 74 20 6f   (64-bit count o
19bf0 66 20 62 69 74 73 20 70 72 6f 63 65 73 73 65 64  f bits processed
19c00 2c 20 4d 53 42 2d 66 69 72 73 74 29 0a 20 2a 2f  , MSB-first). */
19c10 0a 73 74 61 74 69 63 20 76 6f 69 64 20 4d 44 35  .static void MD5
19c20 46 69 6e 61 6c 28 75 6e 73 69 67 6e 65 64 20 63  Final(unsigned c
19c30 68 61 72 20 64 69 67 65 73 74 5b 31 36 5d 2c 20  har digest[16], 
19c40 4d 44 35 43 6f 6e 74 65 78 74 20 2a 63 74 78 29  MD5Context *ctx)
19c50 7b 0a 20 20 20 20 20 20 20 20 75 6e 73 69 67 6e  {.        unsign
19c60 65 64 20 63 6f 75 6e 74 3b 0a 20 20 20 20 20 20  ed count;.      
19c70 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
19c80 2a 70 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20  *p;..        /* 
19c90 43 6f 6d 70 75 74 65 20 6e 75 6d 62 65 72 20 6f  Compute number o
19ca0 66 20 62 79 74 65 73 20 6d 6f 64 20 36 34 20 2a  f bytes mod 64 *
19cb0 2f 0a 20 20 20 20 20 20 20 20 63 6f 75 6e 74 20  /.        count 
19cc0 3d 20 28 63 74 78 2d 3e 62 69 74 73 5b 30 5d 20  = (ctx->bits[0] 
19cd0 3e 3e 20 33 29 20 26 20 30 78 33 46 3b 0a 0a 20  >> 3) & 0x3F;.. 
19ce0 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74 68         /* Set th
19cf0 65 20 66 69 72 73 74 20 63 68 61 72 20 6f 66 20  e first char of 
19d00 70 61 64 64 69 6e 67 20 74 6f 20 30 78 38 30 2e  padding to 0x80.
19d10 20 20 54 68 69 73 20 69 73 20 73 61 66 65 20 73    This is safe s
19d20 69 6e 63 65 20 74 68 65 72 65 20 69 73 0a 20 20  ince there is.  
19d30 20 20 20 20 20 20 20 20 20 61 6c 77 61 79 73 20           always 
19d40 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 62 79 74  at least one byt
19d50 65 20 66 72 65 65 20 2a 2f 0a 20 20 20 20 20 20  e free */.      
19d60 20 20 70 20 3d 20 63 74 78 2d 3e 69 6e 20 2b 20    p = ctx->in + 
19d70 63 6f 75 6e 74 3b 0a 20 20 20 20 20 20 20 20 2a  count;.        *
19d80 70 2b 2b 20 3d 20 30 78 38 30 3b 0a 0a 20 20 20  p++ = 0x80;..   
19d90 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66       /* Bytes of
19da0 20 70 61 64 64 69 6e 67 20 6e 65 65 64 65 64 20   padding needed 
19db0 74 6f 20 6d 61 6b 65 20 36 34 20 62 79 74 65 73  to make 64 bytes
19dc0 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f 75 6e   */.        coun
19dd0 74 20 3d 20 36 34 20 2d 20 31 20 2d 20 63 6f 75  t = 64 - 1 - cou
19de0 6e 74 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20  nt;..        /* 
19df0 50 61 64 20 6f 75 74 20 74 6f 20 35 36 20 6d 6f  Pad out to 56 mo
19e00 64 20 36 34 20 2a 2f 0a 20 20 20 20 20 20 20 20  d 64 */.        
19e10 69 66 20 28 63 6f 75 6e 74 20 3c 20 38 29 20 7b  if (count < 8) {
19e20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
19e30 20 2f 2a 20 54 77 6f 20 6c 6f 74 73 20 6f 66 20   /* Two lots of 
19e40 70 61 64 64 69 6e 67 3a 20 20 50 61 64 20 74 68  padding:  Pad th
19e50 65 20 66 69 72 73 74 20 62 6c 6f 63 6b 20 74 6f  e first block to
19e60 20 36 34 20 62 79 74 65 73 20 2a 2f 0a 20 20 20   64 bytes */.   
19e70 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d               mem
19e80 73 65 74 28 70 2c 20 30 2c 20 63 6f 75 6e 74 29  set(p, 0, count)
19e90 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
19ea0 20 20 62 79 74 65 52 65 76 65 72 73 65 28 63 74    byteReverse(ct
19eb0 78 2d 3e 69 6e 2c 20 31 36 29 3b 0a 20 20 20 20  x->in, 16);.    
19ec0 20 20 20 20 20 20 20 20 20 20 20 20 4d 44 35 54              MD5T
19ed0 72 61 6e 73 66 6f 72 6d 28 63 74 78 2d 3e 62 75  ransform(ctx->bu
19ee0 66 2c 20 28 75 69 6e 74 33 32 20 2a 29 63 74 78  f, (uint32 *)ctx
19ef0 2d 3e 69 6e 29 3b 0a 0a 20 20 20 20 20 20 20 20  ->in);..        
19f00 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 77 20 66          /* Now f
19f10 69 6c 6c 20 74 68 65 20 6e 65 78 74 20 62 6c 6f  ill the next blo
19f20 63 6b 20 77 69 74 68 20 35 36 20 62 79 74 65 73  ck with 56 bytes
19f30 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
19f40 20 20 20 20 6d 65 6d 73 65 74 28 63 74 78 2d 3e      memset(ctx->
19f50 69 6e 2c 20 30 2c 20 35 36 29 3b 0a 20 20 20 20  in, 0, 56);.    
19f60 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
19f70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19f80 50 61 64 20 62 6c 6f 63 6b 20 74 6f 20 35 36 20  Pad block to 56 
19f90 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 20 20 20  bytes */.       
19fa0 20 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28           memset(
19fb0 70 2c 20 30 2c 20 63 6f 75 6e 74 2d 38 29 3b 0a  p, 0, count-8);.
19fc0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
19fd0 20 20 62 79 74 65 52 65 76 65 72 73 65 28 63 74    byteReverse(ct
19fe0 78 2d 3e 69 6e 2c 20 31 34 29 3b 0a 0a 20 20 20  x->in, 14);..   
19ff0 20 20 20 20 20 2f 2a 20 41 70 70 65 6e 64 20 6c       /* Append l
1a000 65 6e 67 74 68 20 69 6e 20 62 69 74 73 20 61 6e  ength in bits an
1a010 64 20 74 72 61 6e 73 66 6f 72 6d 20 2a 2f 0a 20  d transform */. 
1a020 20 20 20 20 20 20 20 28 28 75 69 6e 74 33 32 20         ((uint32 
1a030 2a 29 63 74 78 2d 3e 69 6e 29 5b 20 31 34 20 5d  *)ctx->in)[ 14 ]
1a040 20 3d 20 63 74 78 2d 3e 62 69 74 73 5b 30 5d 3b   = ctx->bits[0];
1a050 0a 20 20 20 20 20 20 20 20 28 28 75 69 6e 74 33  .        ((uint3
1a060 32 20 2a 29 63 74 78 2d 3e 69 6e 29 5b 20 31 35  2 *)ctx->in)[ 15
1a070 20 5d 20 3d 20 63 74 78 2d 3e 62 69 74 73 5b 31   ] = ctx->bits[1
1a080 5d 3b 0a 0a 20 20 20 20 20 20 20 20 4d 44 35 54  ];..        MD5T
1a090 72 61 6e 73 66 6f 72 6d 28 63 74 78 2d 3e 62 75  ransform(ctx->bu
1a0a0 66 2c 20 28 75 69 6e 74 33 32 20 2a 29 63 74 78  f, (uint32 *)ctx
1a0b0 2d 3e 69 6e 29 3b 0a 20 20 20 20 20 20 20 20 62  ->in);.        b
1a0c0 79 74 65 52 65 76 65 72 73 65 28 28 75 6e 73 69  yteReverse((unsi
1a0d0 67 6e 65 64 20 63 68 61 72 20 2a 29 63 74 78 2d  gned char *)ctx-
1a0e0 3e 62 75 66 2c 20 34 29 3b 0a 20 20 20 20 20 20  >buf, 4);.      
1a0f0 20 20 6d 65 6d 63 70 79 28 64 69 67 65 73 74 2c    memcpy(digest,
1a100 20 63 74 78 2d 3e 62 75 66 2c 20 31 36 29 3b 0a   ctx->buf, 16);.
1a110 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 63          memset(c
1a120 74 78 2c 20 30 2c 20 73 69 7a 65 6f 66 28 63 74  tx, 0, sizeof(ct
1a130 78 29 29 3b 20 20 20 20 2f 2a 20 49 6e 20 63 61  x));    /* In ca
1a140 73 65 20 69 74 20 69 73 20 73 65 6e 73 69 74 69  se it is sensiti
1a150 76 65 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ve */.}../*.** C
1a160 6f 6e 76 65 72 74 20 61 20 31 32 38 2d 62 69 74  onvert a 128-bit
1a170 20 4d 44 35 20 64 69 67 65 73 74 20 69 6e 74 6f   MD5 digest into
1a180 20 61 20 33 32 2d 64 69 67 69 74 20 62 61 73 65   a 32-digit base
1a190 2d 31 36 20 6e 75 6d 62 65 72 2e 0a 2a 2f 0a 73  -16 number..*/.s
1a1a0 74 61 74 69 63 20 76 6f 69 64 20 4d 44 35 44 69  tatic void MD5Di
1a1b0 67 65 73 74 54 6f 42 61 73 65 31 36 28 75 6e 73  gestToBase16(uns
1a1c0 69 67 6e 65 64 20 63 68 61 72 20 2a 64 69 67 65  igned char *dige
1a1d0 73 74 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b  st, char *zBuf){
1a1e0 0a 20 20 73 74 61 74 69 63 20 63 68 61 72 20 63  .  static char c
1a1f0 6f 6e 73 74 20 7a 45 6e 63 6f 64 65 5b 5d 20 3d  onst zEncode[] =
1a200 20 22 30 31 32 33 34 35 36 37 38 39 61 62 63 64   "0123456789abcd
1a210 65 66 22 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  ef";.  int i, j;
1a220 0a 0a 20 20 66 6f 72 28 6a 3d 69 3d 30 3b 20 69  ..  for(j=i=0; i
1a230 3c 31 36 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  <16; i++){.    i
1a240 6e 74 20 61 20 3d 20 64 69 67 65 73 74 5b 69 5d  nt a = digest[i]
1a250 3b 0a 20 20 20 20 7a 42 75 66 5b 6a 2b 2b 5d 20  ;.    zBuf[j++] 
1a260 3d 20 7a 45 6e 63 6f 64 65 5b 28 61 3e 3e 34 29  = zEncode[(a>>4)
1a270 26 30 78 66 5d 3b 0a 20 20 20 20 7a 42 75 66 5b  &0xf];.    zBuf[
1a280 6a 2b 2b 5d 20 3d 20 7a 45 6e 63 6f 64 65 5b 61  j++] = zEncode[a
1a290 20 26 20 30 78 66 5d 3b 0a 20 20 7d 0a 20 20 7a   & 0xf];.  }.  z
1a2a0 42 75 66 5b 6a 5d 20 3d 20 30 3b 0a 7d 0a 0a 0a  Buf[j] = 0;.}...
1a2b0 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20  /*.** Convert a 
1a2c0 31 32 38 2d 62 69 74 20 4d 44 35 20 64 69 67 65  128-bit MD5 dige
1a2d0 73 74 20 69 6e 74 6f 20 73 65 71 75 65 6e 63 79  st into sequency
1a2e0 20 6f 66 20 65 69 67 68 74 20 35 2d 64 69 67 69   of eight 5-digi
1a2f0 74 20 69 6e 74 65 67 65 72 73 0a 2a 2a 20 65 61  t integers.** ea
1a300 63 68 20 72 65 70 72 65 73 65 6e 74 69 6e 67 20  ch representing 
1a310 31 36 20 62 69 74 73 20 6f 66 20 74 68 65 20 64  16 bits of the d
1a320 69 67 65 73 74 20 61 6e 64 20 73 65 70 61 72 61  igest and separa
1a330 74 65 64 20 66 72 6f 6d 20 65 61 63 68 0a 2a 2a  ted from each.**
1a340 20 6f 74 68 65 72 20 62 79 20 61 20 22 2d 22 20   other by a "-" 
1a350 63 68 61 72 61 63 74 65 72 2e 0a 2a 2f 0a 73 74  character..*/.st
1a360 61 74 69 63 20 76 6f 69 64 20 4d 44 35 44 69 67  atic void MD5Dig
1a370 65 73 74 54 6f 42 61 73 65 31 30 78 38 28 75 6e  estToBase10x8(un
1a380 73 69 67 6e 65 64 20 63 68 61 72 20 64 69 67 65  signed char dige
1a390 73 74 5b 31 36 5d 2c 20 63 68 61 72 20 7a 44 69  st[16], char zDi
1a3a0 67 65 73 74 5b 35 30 5d 29 7b 0a 20 20 69 6e 74  gest[50]){.  int
1a3b0 20 69 2c 20 6a 3b 0a 20 20 75 6e 73 69 67 6e 65   i, j;.  unsigne
1a3c0 64 20 69 6e 74 20 78 3b 0a 20 20 66 6f 72 28 69  d int x;.  for(i
1a3d0 3d 6a 3d 30 3b 20 69 3c 31 36 3b 20 69 2b 3d 32  =j=0; i<16; i+=2
1a3e0 29 7b 0a 20 20 20 20 78 20 3d 20 64 69 67 65 73  ){.    x = diges
1a3f0 74 5b 69 5d 2a 32 35 36 20 2b 20 64 69 67 65 73  t[i]*256 + diges
1a400 74 5b 69 2b 31 5d 3b 0a 20 20 20 20 69 66 28 20  t[i+1];.    if( 
1a410 69 3e 30 20 29 20 7a 44 69 67 65 73 74 5b 6a 2b  i>0 ) zDigest[j+
1a420 2b 5d 20 3d 20 27 2d 27 3b 0a 20 20 20 20 73 70  +] = '-';.    sp
1a430 72 69 6e 74 66 28 26 7a 44 69 67 65 73 74 5b 6a  rintf(&zDigest[j
1a440 5d 2c 20 22 25 30 35 75 22 2c 20 78 29 3b 0a 20  ], "%05u", x);. 
1a450 20 20 20 6a 20 2b 3d 20 35 3b 0a 20 20 7d 0a 20     j += 5;.  }. 
1a460 20 7a 44 69 67 65 73 74 5b 6a 5d 20 3d 20 30 3b   zDigest[j] = 0;
1a470 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 54 43 4c 20  .}../*.** A TCL 
1a480 63 6f 6d 6d 61 6e 64 20 66 6f 72 20 6d 64 35 2e  command for md5.
1a490 20 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20 69    The argument i
1a4a0 73 20 74 68 65 20 74 65 78 74 20 74 6f 20 62 65  s the text to be
1a4b0 20 68 61 73 68 65 64 2e 20 20 54 68 65 0a 2a 2a   hashed.  The.**
1a4c0 20 52 65 73 75 6c 74 20 69 73 20 74 68 65 20 68   Result is the h
1a4d0 61 73 68 20 69 6e 20 62 61 73 65 36 34 2e 20 20  ash in base64.  
1a4e0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  .*/.static int m
1a4f0 64 35 5f 63 6d 64 28 76 6f 69 64 2a 63 64 2c 20  d5_cmd(void*cd, 
1a500 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
1a510 72 70 2c 20 69 6e 74 20 61 72 67 63 2c 20 63 6f  rp, int argc, co
1a520 6e 73 74 20 63 68 61 72 20 2a 2a 61 72 67 76 29  nst char **argv)
1a530 7b 0a 20 20 4d 44 35 43 6f 6e 74 65 78 74 20 63  {.  MD5Context c
1a540 74 78 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  tx;.  unsigned c
1a550 68 61 72 20 64 69 67 65 73 74 5b 31 36 5d 3b 0a  har digest[16];.
1a560 20 20 63 68 61 72 20 7a 42 75 66 5b 35 30 5d 3b    char zBuf[50];
1a570 0a 20 20 76 6f 69 64 20 28 2a 63 6f 6e 76 65 72  .  void (*conver
1a580 74 65 72 29 28 75 6e 73 69 67 6e 65 64 20 63 68  ter)(unsigned ch
1a590 61 72 2a 2c 20 63 68 61 72 2a 29 3b 0a 0a 20 20  ar*, char*);..  
1a5a0 69 66 28 20 61 72 67 63 21 3d 32 20 29 7b 0a 20  if( argc!=2 ){. 
1a5b0 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
1a5c0 75 6c 74 28 69 6e 74 65 72 70 2c 22 77 72 6f 6e  ult(interp,"wron
1a5d0 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
1a5e0 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d   be \"", argv[0]
1a5f0 2c 20 0a 20 20 20 20 20 20 20 20 22 20 54 45 58  , .        " TEX
1a600 54 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  T\"", 0);.    re
1a610 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1a620 20 20 7d 0a 20 20 4d 44 35 49 6e 69 74 28 26 63    }.  MD5Init(&c
1a630 74 78 29 3b 0a 20 20 4d 44 35 55 70 64 61 74 65  tx);.  MD5Update
1a640 28 26 63 74 78 2c 20 28 75 6e 73 69 67 6e 65 64  (&ctx, (unsigned
1a650 20 63 68 61 72 2a 29 61 72 67 76 5b 31 5d 2c 20   char*)argv[1], 
1a660 28 75 6e 73 69 67 6e 65 64 29 73 74 72 6c 65 6e  (unsigned)strlen
1a670 28 61 72 67 76 5b 31 5d 29 29 3b 0a 20 20 4d 44  (argv[1]));.  MD
1a680 35 46 69 6e 61 6c 28 64 69 67 65 73 74 2c 20 26  5Final(digest, &
1a690 63 74 78 29 3b 0a 20 20 63 6f 6e 76 65 72 74 65  ctx);.  converte
1a6a0 72 20 3d 20 28 76 6f 69 64 28 2a 29 28 75 6e 73  r = (void(*)(uns
1a6b0 69 67 6e 65 64 20 63 68 61 72 2a 2c 63 68 61 72  igned char*,char
1a6c0 2a 29 29 63 64 3b 0a 20 20 63 6f 6e 76 65 72 74  *))cd;.  convert
1a6d0 65 72 28 64 69 67 65 73 74 2c 20 7a 42 75 66 29  er(digest, zBuf)
1a6e0 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65  ;.  Tcl_AppendRe
1a6f0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75  sult(interp, zBu
1a700 66 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  f, (char*)0);.  
1a710 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
1a720 0a 0a 2f 2a 0a 2a 2a 20 41 20 54 43 4c 20 63 6f  ../*.** A TCL co
1a730 6d 6d 61 6e 64 20 74 6f 20 74 61 6b 65 20 74 68  mmand to take th
1a740 65 20 6d 64 35 20 68 61 73 68 20 6f 66 20 61 20  e md5 hash of a 
1a750 66 69 6c 65 2e 20 20 54 68 65 20 61 72 67 75 6d  file.  The argum
1a760 65 6e 74 20 69 73 20 74 68 65 0a 2a 2a 20 6e 61  ent is the.** na
1a770 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 0a  me of the file..
1a780 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 64  */.static int md
1a790 35 66 69 6c 65 5f 63 6d 64 28 76 6f 69 64 2a 63  5file_cmd(void*c
1a7a0 64 2c 20 54 63 6c 5f 49 6e 74 65 72 70 2a 69 6e  d, Tcl_Interp*in
1a7b0 74 65 72 70 2c 20 69 6e 74 20 61 72 67 63 2c 20  terp, int argc, 
1a7c0 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 61 72 67  const char **arg
1a7d0 76 29 7b 0a 20 20 46 49 4c 45 20 2a 69 6e 3b 0a  v){.  FILE *in;.
1a7e0 20 20 4d 44 35 43 6f 6e 74 65 78 74 20 63 74 78    MD5Context ctx
1a7f0 3b 0a 20 20 76 6f 69 64 20 28 2a 63 6f 6e 76 65  ;.  void (*conve
1a800 72 74 65 72 29 28 75 6e 73 69 67 6e 65 64 20 63  rter)(unsigned c
1a810 68 61 72 2a 2c 20 63 68 61 72 2a 29 3b 0a 20 20  har*, char*);.  
1a820 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 64 69  unsigned char di
1a830 67 65 73 74 5b 31 36 5d 3b 0a 20 20 63 68 61 72  gest[16];.  char
1a840 20 7a 42 75 66 5b 31 30 32 34 30 5d 3b 0a 0a 20   zBuf[10240];.. 
1a850 20 69 66 28 20 61 72 67 63 21 3d 32 20 29 7b 0a   if( argc!=2 ){.
1a860 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
1a870 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 77 72 6f  sult(interp,"wro
1a880 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
1a890 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30  d be \"", argv[0
1a8a0 5d 2c 20 0a 20 20 20 20 20 20 20 20 22 20 46 49  ], .        " FI
1a8b0 4c 45 4e 41 4d 45 5c 22 22 2c 20 30 29 3b 0a 20  LENAME\"", 0);. 
1a8c0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
1a8d0 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 6e 20 3d 20  ROR;.  }.  in = 
1a8e0 66 6f 70 65 6e 28 61 72 67 76 5b 31 5d 2c 22 72  fopen(argv[1],"r
1a8f0 62 22 29 3b 0a 20 20 69 66 28 20 69 6e 3d 3d 30  b");.  if( in==0
1a900 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
1a910 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
1a920 22 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20  "unable to open 
1a930 66 69 6c 65 20 5c 22 22 2c 20 61 72 67 76 5b 31  file \"", argv[1
1a940 5d 2c 20 0a 20 20 20 20 20 20 20 20 20 22 5c 22  ], .         "\"
1a950 20 66 6f 72 20 72 65 61 64 69 6e 67 22 2c 20 30   for reading", 0
1a960 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
1a970 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 4d  L_ERROR;.  }.  M
1a980 44 35 49 6e 69 74 28 26 63 74 78 29 3b 0a 20 20  D5Init(&ctx);.  
1a990 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 69 6e 74  for(;;){.    int
1a9a0 20 6e 3b 0a 20 20 20 20 6e 20 3d 20 66 72 65 61   n;.    n = frea
1a9b0 64 28 7a 42 75 66 2c 20 31 2c 20 73 69 7a 65 6f  d(zBuf, 1, sizeo
1a9c0 66 28 7a 42 75 66 29 2c 20 69 6e 29 3b 0a 20 20  f(zBuf), in);.  
1a9d0 20 20 69 66 28 20 6e 3c 3d 30 20 29 20 62 72 65    if( n<=0 ) bre
1a9e0 61 6b 3b 0a 20 20 20 20 4d 44 35 55 70 64 61 74  ak;.    MD5Updat
1a9f0 65 28 26 63 74 78 2c 20 28 75 6e 73 69 67 6e 65  e(&ctx, (unsigne
1aa00 64 20 63 68 61 72 2a 29 7a 42 75 66 2c 20 28 75  d char*)zBuf, (u
1aa10 6e 73 69 67 6e 65 64 29 6e 29 3b 0a 20 20 7d 0a  nsigned)n);.  }.
1aa20 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20    fclose(in);.  
1aa30 4d 44 35 46 69 6e 61 6c 28 64 69 67 65 73 74 2c  MD5Final(digest,
1aa40 20 26 63 74 78 29 3b 0a 20 20 63 6f 6e 76 65 72   &ctx);.  conver
1aa50 74 65 72 20 3d 20 28 76 6f 69 64 28 2a 29 28 75  ter = (void(*)(u
1aa60 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 2c 63 68  nsigned char*,ch
1aa70 61 72 2a 29 29 63 64 3b 0a 20 20 63 6f 6e 76 65  ar*))cd;.  conve
1aa80 72 74 65 72 28 64 69 67 65 73 74 2c 20 7a 42 75  rter(digest, zBu
1aa90 66 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64  f);.  Tcl_Append
1aaa0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a  Result(interp, z
1aab0 42 75 66 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  Buf, (char*)0);.
1aac0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
1aad0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74  .}../*.** Regist
1aae0 65 72 20 74 68 65 20 66 6f 75 72 20 6e 65 77 20  er the four new 
1aaf0 54 43 4c 20 63 6f 6d 6d 61 6e 64 73 20 66 6f 72  TCL commands for
1ab00 20 67 65 6e 65 72 61 74 69 6e 67 20 4d 44 35 20   generating MD5 
1ab10 63 68 65 63 6b 73 75 6d 73 0a 2a 2a 20 77 69 74  checksums.** wit
1ab20 68 20 74 68 65 20 54 43 4c 20 69 6e 74 65 72 70  h the TCL interp
1ab30 72 65 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 4d 64  reter..*/.int Md
1ab40 35 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  5_Init(Tcl_Inter
1ab50 70 20 2a 69 6e 74 65 72 70 29 7b 0a 20 20 54 63  p *interp){.  Tc
1ab60 6c 5f 43 72 65 61 74 65 43 6f 6d 6d 61 6e 64 28  l_CreateCommand(
1ab70 69 6e 74 65 72 70 2c 20 22 6d 64 35 22 2c 20 28  interp, "md5", (
1ab80 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 6d 64 35  Tcl_CmdProc*)md5
1ab90 5f 63 6d 64 2c 0a 20 20 20 20 20 20 20 20 20 20  _cmd,.          
1aba0 20 20 20 20 20 20 20 20 20 20 4d 44 35 44 69 67            MD5Dig
1abb0 65 73 74 54 6f 42 61 73 65 31 36 2c 20 30 29 3b  estToBase16, 0);
1abc0 0a 20 20 54 63 6c 5f 43 72 65 61 74 65 43 6f 6d  .  Tcl_CreateCom
1abd0 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 6d 64  mand(interp, "md
1abe0 35 2d 31 30 78 38 22 2c 20 28 54 63 6c 5f 43 6d  5-10x8", (Tcl_Cm
1abf0 64 50 72 6f 63 2a 29 6d 64 35 5f 63 6d 64 2c 0a  dProc*)md5_cmd,.
1ac00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ac10 20 20 20 20 4d 44 35 44 69 67 65 73 74 54 6f 42      MD5DigestToB
1ac20 61 73 65 31 30 78 38 2c 20 30 29 3b 0a 20 20 54  ase10x8, 0);.  T
1ac30 63 6c 5f 43 72 65 61 74 65 43 6f 6d 6d 61 6e 64  cl_CreateCommand
1ac40 28 69 6e 74 65 72 70 2c 20 22 6d 64 35 66 69 6c  (interp, "md5fil
1ac50 65 22 2c 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63  e", (Tcl_CmdProc
1ac60 2a 29 6d 64 35 66 69 6c 65 5f 63 6d 64 2c 0a 20  *)md5file_cmd,. 
1ac70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ac80 20 20 20 4d 44 35 44 69 67 65 73 74 54 6f 42 61     MD5DigestToBa
1ac90 73 65 31 36 2c 20 30 29 3b 0a 20 20 54 63 6c 5f  se16, 0);.  Tcl_
1aca0 43 72 65 61 74 65 43 6f 6d 6d 61 6e 64 28 69 6e  CreateCommand(in
1acb0 74 65 72 70 2c 20 22 6d 64 35 66 69 6c 65 2d 31  terp, "md5file-1
1acc0 30 78 38 22 2c 20 28 54 63 6c 5f 43 6d 64 50 72  0x8", (Tcl_CmdPr
1acd0 6f 63 2a 29 6d 64 35 66 69 6c 65 5f 63 6d 64 2c  oc*)md5file_cmd,
1ace0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1acf0 20 20 20 20 20 4d 44 35 44 69 67 65 73 74 54 6f       MD5DigestTo
1ad00 42 61 73 65 31 30 78 38 2c 20 30 29 3b 0a 20 20  Base10x8, 0);.  
1ad10 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
1ad20 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e  .#endif /* defin
1ad30 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 20  ed(SQLITE_TEST) 
1ad40 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  || defined(SQLIT
1ad50 45 5f 54 43 4c 4d 44 35 29 20 2a 2f 0a 0a 23 69  E_TCLMD5) */..#i
1ad60 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
1ad70 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 44 75 72  _TEST)./*.** Dur
1ad80 69 6e 67 20 74 65 73 74 69 6e 67 2c 20 74 68 65  ing testing, the
1ad90 20 73 70 65 63 69 61 6c 20 6d 64 35 73 75 6d 28   special md5sum(
1ada0 29 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  ) aggregate func
1adb0 74 69 6f 6e 20 69 73 20 61 76 61 69 6c 61 62 6c  tion is availabl
1adc0 65 2e 0a 2a 2a 20 69 6e 73 69 64 65 20 53 51 4c  e..** inside SQL
1add0 69 74 65 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77  ite.  The follow
1ade0 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 69 6d 70  ing routines imp
1adf0 6c 65 6d 65 6e 74 20 74 68 61 74 20 66 75 6e 63  lement that func
1ae00 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
1ae10 76 6f 69 64 20 6d 64 35 73 74 65 70 28 73 71 6c  void md5step(sql
1ae20 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f  ite3_context *co
1ae30 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c  ntext, int argc,
1ae40 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
1ae50 2a 61 72 67 76 29 7b 0a 20 20 4d 44 35 43 6f 6e  *argv){.  MD5Con
1ae60 74 65 78 74 20 2a 70 3b 0a 20 20 69 6e 74 20 69  text *p;.  int i
1ae70 3b 0a 20 20 69 66 28 20 61 72 67 63 3c 31 20 29  ;.  if( argc<1 )
1ae80 20 72 65 74 75 72 6e 3b 0a 20 20 70 20 3d 20 73   return;.  p = s
1ae90 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74 65  qlite3_aggregate
1aea0 5f 63 6f 6e 74 65 78 74 28 63 6f 6e 74 65 78 74  _context(context
1aeb0 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20  , sizeof(*p));. 
1aec0 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
1aed0 72 6e 3b 0a 20 20 69 66 28 20 21 70 2d 3e 69 73  rn;.  if( !p->is
1aee0 49 6e 69 74 20 29 7b 0a 20 20 20 20 4d 44 35 49  Init ){.    MD5I
1aef0 6e 69 74 28 70 29 3b 0a 20 20 7d 0a 20 20 66 6f  nit(p);.  }.  fo
1af00 72 28 69 3d 30 3b 20 69 3c 61 72 67 63 3b 20 69  r(i=0; i<argc; i
1af10 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ++){.    const c
1af20 68 61 72 20 2a 7a 44 61 74 61 20 3d 20 28 63 68  har *zData = (ch
1af30 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  ar*)sqlite3_valu
1af40 65 5f 74 65 78 74 28 61 72 67 76 5b 69 5d 29 3b  e_text(argv[i]);
1af50 0a 20 20 20 20 69 66 28 20 7a 44 61 74 61 20 29  .    if( zData )
1af60 7b 0a 20 20 20 20 20 20 4d 44 35 55 70 64 61 74  {.      MD5Updat
1af70 65 28 70 2c 20 28 75 6e 73 69 67 6e 65 64 20 63  e(p, (unsigned c
1af80 68 61 72 2a 29 7a 44 61 74 61 2c 20 73 74 72 6c  har*)zData, strl
1af90 65 6e 28 7a 44 61 74 61 29 29 3b 0a 20 20 20 20  en(zData));.    
1afa0 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76  }.  }.}.static v
1afb0 6f 69 64 20 6d 64 35 66 69 6e 61 6c 69 7a 65 28  oid md5finalize(
1afc0 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
1afd0 2a 63 6f 6e 74 65 78 74 29 7b 0a 20 20 4d 44 35  *context){.  MD5
1afe0 43 6f 6e 74 65 78 74 20 2a 70 3b 0a 20 20 75 6e  Context *p;.  un
1aff0 73 69 67 6e 65 64 20 63 68 61 72 20 64 69 67 65  signed char dige
1b000 73 74 5b 31 36 5d 3b 0a 20 20 63 68 61 72 20 7a  st[16];.  char z
1b010 42 75 66 5b 33 33 5d 3b 0a 20 20 70 20 3d 20 73  Buf[33];.  p = s
1b020 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74 65  qlite3_aggregate
1b030 5f 63 6f 6e 74 65 78 74 28 63 6f 6e 74 65 78 74  _context(context
1b040 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20  , sizeof(*p));. 
1b050 20 4d 44 35 46 69 6e 61 6c 28 64 69 67 65 73 74   MD5Final(digest
1b060 2c 70 29 3b 0a 20 20 4d 44 35 44 69 67 65 73 74  ,p);.  MD5Digest
1b070 54 6f 42 61 73 65 31 36 28 64 69 67 65 73 74 2c  ToBase16(digest,
1b080 20 7a 42 75 66 29 3b 0a 20 20 73 71 6c 69 74 65   zBuf);.  sqlite
1b090 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f  3_result_text(co
1b0a0 6e 74 65 78 74 2c 20 7a 42 75 66 2c 20 2d 31 2c  ntext, zBuf, -1,
1b0b0 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
1b0c0 54 29 3b 0a 7d 0a 69 6e 74 20 4d 64 35 5f 52 65  T);.}.int Md5_Re
1b0d0 67 69 73 74 65 72 28 73 71 6c 69 74 65 33 20 2a  gister(sqlite3 *
1b0e0 64 62 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  db){.  int rc = 
1b0f0 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
1b100 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 6d 64 35  unction(db, "md5
1b110 73 75 6d 22 2c 20 2d 31 2c 20 53 51 4c 49 54 45  sum", -1, SQLITE
1b120 5f 55 54 46 38 2c 20 30 2c 20 30 2c 20 0a 20 20  _UTF8, 0, 0, .  
1b130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d                 m
1b150 64 35 73 74 65 70 2c 20 6d 64 35 66 69 6e 61 6c  d5step, md5final
1b160 69 7a 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ize);.  sqlite3_
1b170 6f 76 65 72 6c 6f 61 64 5f 66 75 6e 63 74 69 6f  overload_functio
1b180 6e 28 64 62 2c 20 22 6d 64 35 73 75 6d 22 2c 20  n(db, "md5sum", 
1b190 2d 31 29 3b 20 20 2f 2a 20 54 6f 20 65 78 65 72  -1);  /* To exer
1b1a0 63 69 73 65 20 74 68 69 73 20 41 50 49 20 2a 2f  cise this API */
1b1b0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1b1c0 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65  #endif /* define
1b1d0 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 20 2a  d(SQLITE_TEST) *
1b1e0 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  /.../*.** If the
1b1f0 20 6d 61 63 72 6f 20 54 43 4c 53 48 20 69 73 20   macro TCLSH is 
1b200 6f 6e 65 2c 20 74 68 65 6e 20 70 75 74 20 69 6e  one, then put in
1b210 20 63 6f 64 65 20 74 68 69 73 20 66 6f 72 20 74   code this for t
1b220 68 65 0a 2a 2a 20 22 6d 61 69 6e 22 20 72 6f 75  he.** "main" rou
1b230 74 69 6e 65 20 74 68 61 74 20 77 69 6c 6c 20 69  tine that will i
1b240 6e 69 74 69 61 6c 69 7a 65 20 54 63 6c 20 61 6e  nitialize Tcl an
1b250 64 20 74 61 6b 65 20 69 6e 70 75 74 20 66 72 6f  d take input fro
1b260 6d 0a 2a 2a 20 73 74 61 6e 64 61 72 64 20 69 6e  m.** standard in
1b270 70 75 74 2c 20 6f 72 20 69 66 20 61 20 66 69 6c  put, or if a fil
1b280 65 20 69 73 20 6e 61 6d 65 64 20 6f 6e 20 74 68  e is named on th
1b290 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 0a 2a  e command line.*
1b2a0 2a 20 74 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * the TCL interp
1b2b0 72 65 74 65 72 20 72 65 61 64 73 20 61 6e 64 20  reter reads and 
1b2c0 65 76 61 6c 75 61 74 65 73 20 74 68 61 74 20 66  evaluates that f
1b2d0 69 6c 65 2e 0a 2a 2f 0a 23 69 66 20 54 43 4c 53  ile..*/.#if TCLS
1b2e0 48 3d 3d 31 0a 73 74 61 74 69 63 20 63 6f 6e 73  H==1.static cons
1b2f0 74 20 63 68 61 72 20 2a 74 63 6c 73 68 5f 6d 61  t char *tclsh_ma
1b300 69 6e 5f 6c 6f 6f 70 28 76 6f 69 64 29 7b 0a 20  in_loop(void){. 
1b310 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68   static const ch
1b320 61 72 20 7a 4d 61 69 6e 6c 6f 6f 70 5b 5d 20 3d  ar zMainloop[] =
1b330 0a 20 20 20 20 22 73 65 74 20 6c 69 6e 65 20 7b  .    "set line {
1b340 7d 5c 6e 22 0a 20 20 20 20 22 77 68 69 6c 65 20  }\n".    "while 
1b350 7b 21 5b 65 6f 66 20 73 74 64 69 6e 5d 7d 20 7b  {![eof stdin]} {
1b360 5c 6e 22 0a 20 20 20 20 20 20 22 69 66 20 7b 24  \n".      "if {$
1b370 6c 69 6e 65 21 3d 5c 22 5c 22 7d 20 7b 5c 6e 22  line!=\"\"} {\n"
1b380 0a 20 20 20 20 20 20 20 20 22 70 75 74 73 20 2d  .        "puts -
1b390 6e 6f 6e 65 77 6c 69 6e 65 20 5c 22 3e 20 5c 22  nonewline \"> \"
1b3a0 5c 6e 22 0a 20 20 20 20 20 20 22 7d 20 65 6c 73  \n".      "} els
1b3b0 65 20 7b 5c 6e 22 0a 20 20 20 20 20 20 20 20 22  e {\n".        "
1b3c0 70 75 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20  puts -nonewline 
1b3d0 5c 22 25 20 5c 22 5c 6e 22 0a 20 20 20 20 20 20  \"% \"\n".      
1b3e0 22 7d 5c 6e 22 0a 20 20 20 20 20 20 22 66 6c 75  "}\n".      "flu
1b3f0 73 68 20 73 74 64 6f 75 74 5c 6e 22 0a 20 20 20  sh stdout\n".   
1b400 20 20 20 22 61 70 70 65 6e 64 20 6c 69 6e 65 20     "append line 
1b410 5b 67 65 74 73 20 73 74 64 69 6e 5d 5c 6e 22 0a  [gets stdin]\n".
1b420 20 20 20 20 20 20 22 69 66 20 7b 5b 69 6e 66 6f        "if {[info
1b430 20 63 6f 6d 70 6c 65 74 65 20 24 6c 69 6e 65 5d   complete $line]
1b440 7d 20 7b 5c 6e 22 0a 20 20 20 20 20 20 20 20 22  } {\n".        "
1b450 69 66 20 7b 5b 63 61 74 63 68 20 7b 75 70 6c 65  if {[catch {uple
1b460 76 65 6c 20 23 30 20 24 6c 69 6e 65 7d 20 72 65  vel #0 $line} re
1b470 73 75 6c 74 5d 7d 20 7b 5c 6e 22 0a 20 20 20 20  sult]} {\n".    
1b480 20 20 20 20 20 20 22 70 75 74 73 20 73 74 64 65        "puts stde
1b490 72 72 20 5c 22 45 72 72 6f 72 3a 20 24 72 65 73  rr \"Error: $res
1b4a0 75 6c 74 5c 22 5c 6e 22 0a 20 20 20 20 20 20 20  ult\"\n".       
1b4b0 20 22 7d 20 65 6c 73 65 69 66 20 7b 24 72 65 73   "} elseif {$res
1b4c0 75 6c 74 21 3d 5c 22 5c 22 7d 20 7b 5c 6e 22 0a  ult!=\"\"} {\n".
1b4d0 20 20 20 20 20 20 20 20 20 20 22 70 75 74 73 20            "puts 
1b4e0 24 72 65 73 75 6c 74 5c 6e 22 0a 20 20 20 20 20  $result\n".     
1b4f0 20 20 20 22 7d 5c 6e 22 0a 20 20 20 20 20 20 20     "}\n".       
1b500 20 22 73 65 74 20 6c 69 6e 65 20 7b 7d 5c 6e 22   "set line {}\n"
1b510 0a 20 20 20 20 20 20 22 7d 20 65 6c 73 65 20 7b  .      "} else {
1b520 5c 6e 22 0a 20 20 20 20 20 20 20 20 22 61 70 70  \n".        "app
1b530 65 6e 64 20 6c 69 6e 65 20 5c 5c 6e 5c 6e 22 0a  end line \\n\n".
1b540 20 20 20 20 20 20 22 7d 5c 6e 22 0a 20 20 20 20        "}\n".    
1b550 22 7d 5c 6e 22 0a 20 20 3b 0a 20 20 72 65 74 75  "}\n".  ;.  retu
1b560 72 6e 20 7a 4d 61 69 6e 6c 6f 6f 70 3b 0a 7d 0a  rn zMainloop;.}.
1b570 23 65 6e 64 69 66 0a 23 69 66 20 54 43 4c 53 48  #endif.#if TCLSH
1b580 3d 3d 32 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  ==2.static const
1b590 20 63 68 61 72 20 2a 74 63 6c 73 68 5f 6d 61 69   char *tclsh_mai
1b5a0 6e 5f 6c 6f 6f 70 28 76 6f 69 64 29 3b 0a 23 65  n_loop(void);.#e
1b5b0 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c  ndif..#ifdef SQL
1b5c0 49 54 45 5f 54 45 53 54 0a 73 74 61 74 69 63 20  ITE_TEST.static 
1b5d0 76 6f 69 64 20 69 6e 69 74 5f 61 6c 6c 28 54 63  void init_all(Tc
1b5e0 6c 5f 49 6e 74 65 72 70 20 2a 29 3b 0a 73 74 61  l_Interp *);.sta
1b5f0 74 69 63 20 69 6e 74 20 69 6e 69 74 5f 61 6c 6c  tic int init_all
1b600 5f 63 6d 64 28 0a 20 20 43 6c 69 65 6e 74 44 61  _cmd(.  ClientDa
1b610 74 61 20 63 64 2c 0a 20 20 54 63 6c 5f 49 6e 74  ta cd,.  Tcl_Int
1b620 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
1b630 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
1b640 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
1b650 0a 29 7b 0a 0a 20 20 54 63 6c 5f 49 6e 74 65 72  .){..  Tcl_Inter
1b660 70 20 2a 73 6c 61 76 65 3b 0a 20 20 69 66 28 20  p *slave;.  if( 
1b670 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  objc!=2 ){.    T
1b680 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
1b690 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
1b6a0 20 22 53 4c 41 56 45 22 29 3b 0a 20 20 20 20 72   "SLAVE");.    r
1b6b0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1b6c0 0a 20 20 7d 0a 0a 20 20 73 6c 61 76 65 20 3d 20  .  }..  slave = 
1b6d0 54 63 6c 5f 47 65 74 53 6c 61 76 65 28 69 6e 74  Tcl_GetSlave(int
1b6e0 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
1b6f0 6e 67 28 6f 62 6a 76 5b 31 5d 29 29 3b 0a 20 20  ng(objv[1]));.  
1b700 69 66 28 20 21 73 6c 61 76 65 20 29 7b 0a 20 20  if( !slave ){.  
1b710 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
1b720 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 6e 69 74 5f  OR;.  }..  init_
1b730 61 6c 6c 28 73 6c 61 76 65 29 3b 0a 20 20 72 65  all(slave);.  re
1b740 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
1b750 2f 2a 0a 2a 2a 20 54 63 6c 63 6d 64 3a 20 64 62  /*.** Tclcmd: db
1b760 5f 75 73 65 5f 6c 65 67 61 63 79 5f 70 72 65 70  _use_legacy_prep
1b770 61 72 65 20 44 42 20 42 4f 4f 4c 45 41 4e 0a 2a  are DB BOOLEAN.*
1b780 2a 0a 2a 2a 20 20 20 54 68 65 20 66 69 72 73 74  *.**   The first
1b790 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69   argument to thi
1b7a0 73 20 63 6f 6d 6d 61 6e 64 20 6d 75 73 74 20 62  s command must b
1b7b0 65 20 61 20 64 61 74 61 62 61 73 65 20 63 6f 6d  e a database com
1b7c0 6d 61 6e 64 20 63 72 65 61 74 65 64 20 62 79 0a  mand created by.
1b7d0 2a 2a 20 20 20 5b 73 71 6c 69 74 65 33 5d 2e 20  **   [sqlite3]. 
1b7e0 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  If the second ar
1b7f0 67 75 6d 65 6e 74 20 69 73 20 74 72 75 65 2c 20  gument is true, 
1b800 74 68 65 6e 20 74 68 65 20 68 61 6e 64 6c 65 20  then the handle 
1b810 69 73 20 63 6f 6e 66 69 67 75 72 65 64 0a 2a 2a  is configured.**
1b820 20 20 20 74 6f 20 75 73 65 20 74 68 65 20 73 71     to use the sq
1b830 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
1b840 28 29 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 70  () function to p
1b850 72 65 70 61 72 65 20 73 74 61 74 65 6d 65 6e 74  repare statement
1b860 73 2e 20 49 66 20 69 74 0a 2a 2a 20 20 20 69 73  s. If it.**   is
1b870 20 66 61 6c 73 65 2c 20 73 71 6c 69 74 65 33 5f   false, sqlite3_
1b880 70 72 65 70 61 72 65 28 29 2e 0a 2a 2f 0a 73 74  prepare()..*/.st
1b890 61 74 69 63 20 69 6e 74 20 64 62 5f 75 73 65 5f  atic int db_use_
1b8a0 6c 65 67 61 63 79 5f 70 72 65 70 61 72 65 5f 63  legacy_prepare_c
1b8b0 6d 64 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61  md(.  ClientData
1b8c0 20 63 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72   cd,.  Tcl_Inter
1b8d0 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
1b8e0 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
1b8f0 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
1b900 7b 0a 20 20 54 63 6c 5f 43 6d 64 49 6e 66 6f 20  {.  Tcl_CmdInfo 
1b910 63 6d 64 49 6e 66 6f 3b 0a 20 20 53 71 6c 69 74  cmdInfo;.  Sqlit
1b920 65 44 62 20 2a 70 44 62 3b 0a 20 20 69 6e 74 20  eDb *pDb;.  int 
1b930 62 50 72 65 70 61 72 65 3b 0a 0a 20 20 69 66 28  bPrepare;..  if(
1b940 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20   objc!=3 ){.    
1b950 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
1b960 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
1b970 2c 20 22 44 42 20 42 4f 4f 4c 45 41 4e 22 29 3b  , "DB BOOLEAN");
1b980 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
1b990 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66  ERROR;.  }..  if
1b9a0 28 20 21 54 63 6c 5f 47 65 74 43 6f 6d 6d 61 6e  ( !Tcl_GetComman
1b9b0 64 49 6e 66 6f 28 69 6e 74 65 72 70 2c 20 54 63  dInfo(interp, Tc
1b9c0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
1b9d0 5b 31 5d 29 2c 20 26 63 6d 64 49 6e 66 6f 29 20  [1]), &cmdInfo) 
1b9e0 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
1b9f0 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
1ba00 22 6e 6f 20 73 75 63 68 20 64 62 3a 20 22 2c 20  "no such db: ", 
1ba10 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
1ba20 6a 76 5b 31 5d 29 2c 20 28 63 68 61 72 2a 29 30  jv[1]), (char*)0
1ba30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
1ba40 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70  L_ERROR;.  }.  p
1ba50 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29  Db = (SqliteDb*)
1ba60 63 6d 64 49 6e 66 6f 2e 6f 62 6a 43 6c 69 65 6e  cmdInfo.objClien
1ba70 74 44 61 74 61 3b 0a 20 20 69 66 28 20 54 63 6c  tData;.  if( Tcl
1ba80 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f  _GetBooleanFromO
1ba90 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
1baa0 32 5d 2c 20 26 62 50 72 65 70 61 72 65 29 20 29  2], &bPrepare) )
1bab0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  {.    return TCL
1bac0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 70  _ERROR;.  }..  p
1bad0 44 62 2d 3e 62 4c 65 67 61 63 79 50 72 65 70 61  Db->bLegacyPrepa
1bae0 72 65 20 3d 20 62 50 72 65 70 61 72 65 3b 0a 0a  re = bPrepare;..
1baf0 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c    Tcl_ResetResul
1bb00 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 72 65 74  t(interp);.  ret
1bb10 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65  urn TCL_OK;.}.#e
1bb20 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66  ndif../*.** Conf
1bb30 69 67 75 72 65 20 74 68 65 20 69 6e 74 65 72 70  igure the interp
1bb40 72 65 74 65 72 20 70 61 73 73 65 64 20 61 73 20  reter passed as 
1bb50 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
1bb60 6e 74 20 74 6f 20 68 61 76 65 20 61 63 63 65 73  nt to have acces
1bb70 73 0a 2a 2a 20 74 6f 20 74 68 65 20 63 6f 6d 6d  s.** to the comm
1bb80 61 6e 64 73 20 61 6e 64 20 6c 69 6e 6b 65 64 20  ands and linked 
1bb90 76 61 72 69 61 62 6c 65 73 20 74 68 61 74 20 6d  variables that m
1bba0 61 6b 65 20 75 70 3a 0a 2a 2a 0a 2a 2a 20 20 20  ake up:.**.**   
1bbb0 2a 20 74 68 65 20 5b 73 71 6c 69 74 65 33 5d 20  * the [sqlite3] 
1bbc0 65 78 74 65 6e 73 69 6f 6e 20 69 74 73 65 6c 66  extension itself
1bbd0 2c 20 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20  , .**.**   * If 
1bbe0 53 51 4c 49 54 45 5f 54 43 4c 4d 44 35 20 6f 72  SQLITE_TCLMD5 or
1bbf0 20 53 51 4c 49 54 45 5f 54 45 53 54 20 69 73 20   SQLITE_TEST is 
1bc00 64 65 66 69 6e 65 64 2c 20 74 68 65 20 4d 64 35  defined, the Md5
1bc10 20 63 6f 6d 6d 61 6e 64 73 2c 20 61 6e 64 0a 2a   commands, and.*
1bc20 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 53 51 4c 49  *.**   * If SQLI
1bc30 54 45 5f 54 45 53 54 20 69 73 20 73 65 74 2c 20  TE_TEST is set, 
1bc40 74 68 65 20 76 61 72 69 6f 75 73 20 74 65 73 74  the various test
1bc50 20 69 6e 74 65 72 66 61 63 65 73 20 75 73 65 64   interfaces used
1bc60 20 62 79 20 74 68 65 20 54 63 6c 0a 2a 2a 20 20   by the Tcl.**  
1bc70 20 20 20 74 65 73 74 20 73 75 69 74 65 2e 0a 2a     test suite..*
1bc80 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e  /.static void in
1bc90 69 74 5f 61 6c 6c 28 54 63 6c 5f 49 6e 74 65 72  it_all(Tcl_Inter
1bca0 70 20 2a 69 6e 74 65 72 70 29 7b 0a 20 20 53 71  p *interp){.  Sq
1bcb0 6c 69 74 65 33 5f 49 6e 69 74 28 69 6e 74 65 72  lite3_Init(inter
1bcc0 70 29 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  p);..#if defined
1bcd0 28 53 51 4c 49 54 45 5f 54 45 53 54 29 20 7c 7c  (SQLITE_TEST) ||
1bce0 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
1bcf0 54 43 4c 4d 44 35 29 0a 20 20 4d 64 35 5f 49 6e  TCLMD5).  Md5_In
1bd00 69 74 28 69 6e 74 65 72 70 29 3b 0a 23 65 6e 64  it(interp);.#end
1bd10 69 66 0a 0a 20 20 2f 2a 20 49 6e 73 74 61 6c 6c  if..  /* Install
1bd20 20 74 68 65 20 5b 72 65 67 69 73 74 65 72 5f 64   the [register_d
1bd30 62 73 74 61 74 5f 76 74 61 62 5d 20 63 6f 6d 6d  bstat_vtab] comm
1bd40 61 6e 64 20 74 6f 20 61 63 63 65 73 73 20 74 68  and to access th
1bd50 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
1bd60 0a 20 20 2a 2a 20 6f 66 20 76 69 72 74 75 61 6c  .  ** of virtual
1bd70 20 74 61 62 6c 65 20 64 62 73 74 61 74 20 28 73   table dbstat (s
1bd80 6f 75 72 63 65 20 66 69 6c 65 20 74 65 73 74 5f  ource file test_
1bd90 73 74 61 74 2e 63 29 2e 20 54 68 69 73 20 63 6f  stat.c). This co
1bda0 6d 6d 61 6e 64 20 69 73 0a 20 20 2a 2a 20 72 65  mmand is.  ** re
1bdb0 71 75 69 72 65 64 20 66 6f 72 20 74 65 73 74 66  quired for testf
1bdc0 69 78 74 75 72 65 20 61 6e 64 20 73 71 6c 69 74  ixture and sqlit
1bdd0 65 33 5f 61 6e 61 6c 79 7a 65 72 2c 20 62 75 74  e3_analyzer, but
1bde0 20 6e 6f 74 20 62 79 20 74 68 65 20 70 72 6f 64   not by the prod
1bdf0 75 63 74 69 6f 6e 0a 20 20 2a 2a 20 54 63 6c 20  uction.  ** Tcl 
1be00 65 78 74 65 6e 73 69 6f 6e 2e 20 20 2a 2f 0a 23  extension.  */.#
1be10 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
1be20 45 5f 54 45 53 54 29 20 7c 7c 20 54 43 4c 53 48  E_TEST) || TCLSH
1be30 3d 3d 32 0a 20 20 7b 0a 20 20 20 20 65 78 74 65  ==2.  {.    exte
1be40 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73  rn int Sqlitetes
1be50 74 53 74 61 74 5f 49 6e 69 74 28 54 63 6c 5f 49  tStat_Init(Tcl_I
1be60 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 53 71 6c  nterp*);.    Sql
1be70 69 74 65 74 65 73 74 53 74 61 74 5f 49 6e 69 74  itetestStat_Init
1be80 28 69 6e 74 65 72 70 29 3b 0a 20 20 7d 0a 23 65  (interp);.  }.#e
1be90 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c  ndif..#ifdef SQL
1bea0 49 54 45 5f 54 45 53 54 0a 20 20 7b 0a 20 20 20  ITE_TEST.  {.   
1beb0 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69   extern int Sqli
1bec0 74 65 63 6f 6e 66 69 67 5f 49 6e 69 74 28 54 63  teconfig_Init(Tc
1bed0 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20  l_Interp*);.    
1bee0 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74  extern int Sqlit
1bef0 65 74 65 73 74 31 5f 49 6e 69 74 28 54 63 6c 5f  etest1_Init(Tcl_
1bf00 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78  Interp*);.    ex
1bf10 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74  tern int Sqlitet
1bf20 65 73 74 32 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  est2_Init(Tcl_In
1bf30 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65  terp*);.    exte
1bf40 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73  rn int Sqlitetes
1bf50 74 33 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  t3_Init(Tcl_Inte
1bf60 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e  rp*);.    extern
1bf70 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 34   int Sqlitetest4
1bf80 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
1bf90 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69  *);.    extern i
1bfa0 6e 74 20 53 71 6c 69 74 65 74 65 73 74 35 5f 49  nt Sqlitetest5_I
1bfb0 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29  nit(Tcl_Interp*)
1bfc0 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74  ;.    extern int
1bfd0 20 53 71 6c 69 74 65 74 65 73 74 36 5f 49 6e 69   Sqlitetest6_Ini
1bfe0 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a  t(Tcl_Interp*);.
1bff0 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53      extern int S
1c000 71 6c 69 74 65 74 65 73 74 37 5f 49 6e 69 74 28  qlitetest7_Init(
1c010 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20  Tcl_Interp*);.  
1c020 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c    extern int Sql
1c030 69 74 65 74 65 73 74 38 5f 49 6e 69 74 28 54 63  itetest8_Init(Tc
1c040 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20  l_Interp*);.    
1c050 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74  extern int Sqlit
1c060 65 74 65 73 74 39 5f 49 6e 69 74 28 54 63 6c 5f  etest9_Init(Tcl_
1c070 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78  Interp*);.    ex
1c080 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74  tern int Sqlitet
1c090 65 73 74 61 73 79 6e 63 5f 49 6e 69 74 28 54 63  estasync_Init(Tc
1c0a0 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20  l_Interp*);.    
1c0b0 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74  extern int Sqlit
1c0c0 65 74 65 73 74 5f 61 75 74 6f 65 78 74 5f 49 6e  etest_autoext_In
1c0d0 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b  it(Tcl_Interp*);
1c0e0 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20  .    extern int 
1c0f0 53 71 6c 69 74 65 74 65 73 74 5f 64 65 6d 6f 76  Sqlitetest_demov
1c100 66 73 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  fs_Init(Tcl_Inte
1c110 72 70 20 2a 29 3b 0a 20 20 20 20 65 78 74 65 72  rp *);.    exter
1c120 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74  n int Sqlitetest
1c130 5f 66 75 6e 63 5f 49 6e 69 74 28 54 63 6c 5f 49  _func_Init(Tcl_I
1c140 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74  nterp*);.    ext
1c150 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65  ern int Sqlitete
1c160 73 74 5f 68 65 78 69 6f 5f 49 6e 69 74 28 54 63  st_hexio_Init(Tc
1c170 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20  l_Interp*);.    
1c180 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74  extern int Sqlit
1c190 65 74 65 73 74 5f 69 6e 69 74 5f 49 6e 69 74 28  etest_init_Init(
1c1a0 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20  Tcl_Interp*);.  
1c1b0 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c    extern int Sql
1c1c0 69 74 65 74 65 73 74 5f 6d 61 6c 6c 6f 63 5f 49  itetest_malloc_I
1c1d0 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29  nit(Tcl_Interp*)
1c1e0 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74  ;.    extern int
1c1f0 20 53 71 6c 69 74 65 74 65 73 74 5f 6d 75 74 65   Sqlitetest_mute
1c200 78 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  x_Init(Tcl_Inter
1c210 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20  p*);.    extern 
1c220 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 73 63  int Sqlitetestsc
1c230 68 65 6d 61 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  hema_Init(Tcl_In
1c240 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65  terp*);.    exte
1c250 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73  rn int Sqlitetes
1c260 74 73 73 65 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  tsse_Init(Tcl_In
1c270 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65  terp*);.    exte
1c280 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73  rn int Sqlitetes
1c290 74 74 63 6c 76 61 72 5f 49 6e 69 74 28 54 63 6c  ttclvar_Init(Tcl
1c2a0 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65  _Interp*);.    e
1c2b0 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65  xtern int Sqlite
1c2c0 74 65 73 74 54 68 72 65 61 64 5f 49 6e 69 74 28  testThread_Init(
1c2d0 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20  Tcl_Interp*);.  
1c2e0 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c    extern int Sql
1c2f0 69 74 65 74 65 73 74 4f 6e 65 66 69 6c 65 5f 49  itetestOnefile_I
1c300 6e 69 74 28 29 3b 0a 20 20 20 20 65 78 74 65 72  nit();.    exter
1c310 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74  n int Sqlitetest
1c320 4f 73 69 6e 73 74 5f 49 6e 69 74 28 54 63 6c 5f  Osinst_Init(Tcl_
1c330 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78  Interp*);.    ex
1c340 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74  tern int Sqlitet
1c350 65 73 74 62 61 63 6b 75 70 5f 49 6e 69 74 28 54  estbackup_Init(T
1c360 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20  cl_Interp*);.   
1c370 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69   extern int Sqli
1c380 74 65 74 65 73 74 69 6e 74 61 72 72 61 79 5f 49  tetestintarray_I
1c390 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29  nit(Tcl_Interp*)
1c3a0 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74  ;.    extern int
1c3b0 20 53 71 6c 69 74 65 74 65 73 74 76 66 73 5f 49   Sqlitetestvfs_I
1c3c0 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a  nit(Tcl_Interp *
1c3d0 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e  );.    extern in
1c3e0 74 20 53 71 6c 69 74 65 74 65 73 74 72 74 72 65  t Sqlitetestrtre
1c3f0 65 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  e_Init(Tcl_Inter
1c400 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20  p*);.    extern 
1c410 69 6e 74 20 53 71 6c 69 74 65 71 75 6f 74 61 5f  int Sqlitequota_
1c420 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a  Init(Tcl_Interp*
1c430 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e  );.    extern in
1c440 74 20 53 71 6c 69 74 65 6d 75 6c 74 69 70 6c 65  t Sqlitemultiple
1c450 78 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  x_Init(Tcl_Inter
1c460 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20  p*);.    extern 
1c470 69 6e 74 20 53 71 6c 69 74 65 53 75 70 65 72 6c  int SqliteSuperl
1c480 6f 63 6b 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74  ock_Init(Tcl_Int
1c490 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72  erp*);.    exter
1c4a0 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74  n int Sqlitetest
1c4b0 53 79 73 63 61 6c 6c 5f 49 6e 69 74 28 54 63 6c  Syscall_Init(Tcl
1c4c0 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65  _Interp*);.    e
1c4d0 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65  xtern int Sqlite
1c4e0 74 65 73 74 66 75 7a 7a 65 72 5f 49 6e 69 74 28  testfuzzer_Init(
1c4f0 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20  Tcl_Interp*);.  
1c500 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c    extern int Sql
1c510 69 74 65 74 65 73 74 77 68 6f 6c 65 6e 75 6d 62  itetestwholenumb
1c520 65 72 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  er_Init(Tcl_Inte
1c530 72 70 2a 29 3b 0a 0a 23 69 66 20 64 65 66 69 6e  rp*);..#if defin
1c540 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
1c550 5f 46 54 53 33 29 20 7c 7c 20 64 65 66 69 6e 65  _FTS3) || define
1c560 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
1c570 46 54 53 34 29 0a 20 20 20 20 65 78 74 65 72 6e  FTS4).    extern
1c580 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 66   int Sqlitetestf
1c590 74 73 33 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74  ts3_Init(Tcl_Int
1c5a0 65 72 70 20 2a 69 6e 74 65 72 70 29 3b 0a 23 65  erp *interp);.#e
1c5b0 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c  ndif..#ifdef SQL
1c5c0 49 54 45 5f 45 4e 41 42 4c 45 5f 5a 49 50 56 46  ITE_ENABLE_ZIPVF
1c5d0 53 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74  S.    extern int
1c5e0 20 5a 69 70 76 66 73 5f 49 6e 69 74 28 54 63 6c   Zipvfs_Init(Tcl
1c5f0 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 5a  _Interp*);.    Z
1c600 69 70 76 66 73 5f 49 6e 69 74 28 69 6e 74 65 72  ipvfs_Init(inter
1c610 70 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20  p);.#endif..    
1c620 53 71 6c 69 74 65 63 6f 6e 66 69 67 5f 49 6e 69  Sqliteconfig_Ini
1c630 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53  t(interp);.    S
1c640 71 6c 69 74 65 74 65 73 74 31 5f 49 6e 69 74 28  qlitetest1_Init(
1c650 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c  interp);.    Sql
1c660 69 74 65 74 65 73 74 32 5f 49 6e 69 74 28 69 6e  itetest2_Init(in
1c670 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74  terp);.    Sqlit
1c680 65 74 65 73 74 33 5f 49 6e 69 74 28 69 6e 74 65  etest3_Init(inte
1c690 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74  rp);.    Sqlitet
1c6a0 65 73 74 34 5f 49 6e 69 74 28 69 6e 74 65 72 70  est4_Init(interp
1c6b0 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73  );.    Sqlitetes
1c6c0 74 35 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b  t5_Init(interp);
1c6d0 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 36  .    Sqlitetest6
1c6e0 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20  _Init(interp);. 
1c6f0 20 20 20 53 71 6c 69 74 65 74 65 73 74 37 5f 49     Sqlitetest7_I
1c700 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20  nit(interp);.   
1c710 20 53 71 6c 69 74 65 74 65 73 74 38 5f 49 6e 69   Sqlitetest8_Ini
1c720 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53  t(interp);.    S
1c730 71 6c 69 74 65 74 65 73 74 39 5f 49 6e 69 74 28  qlitetest9_Init(
1c740 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c  interp);.    Sql
1c750 69 74 65 74 65 73 74 61 73 79 6e 63 5f 49 6e 69  itetestasync_Ini
1c760 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53  t(interp);.    S
1c770 71 6c 69 74 65 74 65 73 74 5f 61 75 74 6f 65 78  qlitetest_autoex
1c780 74 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a  t_Init(interp);.
1c790 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 5f 64      Sqlitetest_d
1c7a0 65 6d 6f 76 66 73 5f 49 6e 69 74 28 69 6e 74 65  emovfs_Init(inte
1c7b0 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74  rp);.    Sqlitet
1c7c0 65 73 74 5f 66 75 6e 63 5f 49 6e 69 74 28 69 6e  est_func_Init(in
1c7d0 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74  terp);.    Sqlit
1c7e0 65 74 65 73 74 5f 68 65 78 69 6f 5f 49 6e 69 74  etest_hexio_Init
1c7f0 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71  (interp);.    Sq
1c800 6c 69 74 65 74 65 73 74 5f 69 6e 69 74 5f 49 6e  litetest_init_In
1c810 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  it(interp);.    
1c820 53 71 6c 69 74 65 74 65 73 74 5f 6d 61 6c 6c 6f  Sqlitetest_mallo
1c830 63 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a  c_Init(interp);.
1c840 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 5f 6d      Sqlitetest_m
1c850 75 74 65 78 5f 49 6e 69 74 28 69 6e 74 65 72 70  utex_Init(interp
1c860 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73  );.    Sqlitetes
1c870 74 73 63 68 65 6d 61 5f 49 6e 69 74 28 69 6e 74  tschema_Init(int
1c880 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65  erp);.    Sqlite
1c890 74 65 73 74 74 63 6c 76 61 72 5f 49 6e 69 74 28  testtclvar_Init(
1c8a0 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c  interp);.    Sql
1c8b0 69 74 65 74 65 73 74 54 68 72 65 61 64 5f 49 6e  itetestThread_In
1c8c0 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  it(interp);.    
1c8d0 53 71 6c 69 74 65 74 65 73 74 4f 6e 65 66 69 6c  SqlitetestOnefil
1c8e0 65 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a  e_Init(interp);.
1c8f0 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 4f 73      SqlitetestOs
1c900 69 6e 73 74 5f 49 6e 69 74 28 69 6e 74 65 72 70  inst_Init(interp
1c910 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73  );.    Sqlitetes
1c920 74 62 61 63 6b 75 70 5f 49 6e 69 74 28 69 6e 74  tbackup_Init(int
1c930 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65  erp);.    Sqlite
1c940 74 65 73 74 69 6e 74 61 72 72 61 79 5f 49 6e 69  testintarray_Ini
1c950 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53  t(interp);.    S
1c960 71 6c 69 74 65 74 65 73 74 76 66 73 5f 49 6e 69  qlitetestvfs_Ini
1c970 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53  t(interp);.    S
1c980 71 6c 69 74 65 74 65 73 74 72 74 72 65 65 5f 49  qlitetestrtree_I
1c990 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20  nit(interp);.   
1c9a0 20 53 71 6c 69 74 65 71 75 6f 74 61 5f 49 6e 69   Sqlitequota_Ini
1c9b0 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53  t(interp);.    S
1c9c0 71 6c 69 74 65 6d 75 6c 74 69 70 6c 65 78 5f 49  qlitemultiplex_I
1c9d0 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20  nit(interp);.   
1c9e0 20 53 71 6c 69 74 65 53 75 70 65 72 6c 6f 63 6b   SqliteSuperlock
1c9f0 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20  _Init(interp);. 
1ca00 20 20 20 53 71 6c 69 74 65 74 65 73 74 53 79 73     SqlitetestSys
1ca10 63 61 6c 6c 5f 49 6e 69 74 28 69 6e 74 65 72 70  call_Init(interp
1ca20 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73  );.    Sqlitetes
1ca30 74 66 75 7a 7a 65 72 5f 49 6e 69 74 28 69 6e 74  tfuzzer_Init(int
1ca40 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65  erp);.    Sqlite
1ca50 74 65 73 74 77 68 6f 6c 65 6e 75 6d 62 65 72 5f  testwholenumber_
1ca60 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 0a 23  Init(interp);..#
1ca70 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
1ca80 45 5f 45 4e 41 42 4c 45 5f 46 54 53 33 29 20 7c  E_ENABLE_FTS3) |
1ca90 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  | defined(SQLITE
1caa0 5f 45 4e 41 42 4c 45 5f 46 54 53 34 29 0a 20 20  _ENABLE_FTS4).  
1cab0 20 20 53 71 6c 69 74 65 74 65 73 74 66 74 73 33    Sqlitetestfts3
1cac0 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 23  _Init(interp);.#
1cad0 65 6e 64 69 66 0a 0a 20 20 20 20 54 63 6c 5f 43  endif..    Tcl_C
1cae0 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28  reateObjCommand(
1caf0 0a 20 20 20 20 20 20 20 20 69 6e 74 65 72 70 2c  .        interp,
1cb00 20 22 6c 6f 61 64 5f 74 65 73 74 66 69 78 74 75   "load_testfixtu
1cb10 72 65 5f 65 78 74 65 6e 73 69 6f 6e 73 22 2c 20  re_extensions", 
1cb20 69 6e 69 74 5f 61 6c 6c 5f 63 6d 64 2c 20 30 2c  init_all_cmd, 0,
1cb30 20 30 0a 20 20 20 20 29 3b 0a 20 20 20 20 54 63   0.    );.    Tc
1cb40 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61  l_CreateObjComma
1cb50 6e 64 28 0a 20 20 20 20 20 20 20 20 69 6e 74 65  nd(.        inte
1cb60 72 70 2c 20 22 64 62 5f 75 73 65 5f 6c 65 67 61  rp, "db_use_lega
1cb70 63 79 5f 70 72 65 70 61 72 65 22 2c 20 64 62 5f  cy_prepare", db_
1cb80 75 73 65 5f 6c 65 67 61 63 79 5f 70 72 65 70 61  use_legacy_prepa
1cb90 72 65 5f 63 6d 64 2c 20 30 2c 20 30 0a 20 20 20  re_cmd, 0, 0.   
1cba0 20 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   );..#ifdef SQLI
1cbb0 54 45 5f 53 53 45 0a 20 20 20 20 53 71 6c 69 74  TE_SSE.    Sqlit
1cbc0 65 74 65 73 74 73 73 65 5f 49 6e 69 74 28 69 6e  etestsse_Init(in
1cbd0 74 65 72 70 29 3b 0a 23 65 6e 64 69 66 0a 20 20  terp);.#endif.  
1cbe0 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 23 64 65 66  }.#endif.}..#def
1cbf0 69 6e 65 20 54 43 4c 53 48 5f 4d 41 49 4e 20 6d  ine TCLSH_MAIN m
1cc00 61 69 6e 20 20 20 2f 2a 20 4e 65 65 64 65 64 20  ain   /* Needed 
1cc10 74 6f 20 66 61 6b 65 20 6f 75 74 20 6d 6b 74 63  to fake out mktc
1cc20 6c 61 70 70 20 2a 2f 0a 69 6e 74 20 54 43 4c 53  lapp */.int TCLS
1cc30 48 5f 4d 41 49 4e 28 69 6e 74 20 61 72 67 63 2c  H_MAIN(int argc,
1cc40 20 63 68 61 72 20 2a 2a 61 72 67 76 29 7b 0a 20   char **argv){. 
1cc50 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
1cc60 65 72 70 3b 0a 20 20 0a 20 20 2f 2a 20 43 61 6c  erp;.  .  /* Cal
1cc70 6c 20 73 71 6c 69 74 65 33 5f 73 68 75 74 64 6f  l sqlite3_shutdo
1cc80 77 6e 28 29 20 6f 6e 63 65 20 62 65 66 6f 72 65  wn() once before
1cc90 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 20   doing anything 
1cca0 65 6c 73 65 2e 20 54 68 69 73 20 69 73 20 74 6f  else. This is to
1ccb0 0a 20 20 2a 2a 20 74 65 73 74 20 74 68 61 74 20  .  ** test that 
1ccc0 73 71 6c 69 74 65 33 5f 73 68 75 74 64 6f 77 6e  sqlite3_shutdown
1ccd0 28 29 20 63 61 6e 20 62 65 20 73 61 66 65 6c 79  () can be safely
1cce0 20 63 61 6c 6c 65 64 20 62 79 20 61 20 70 72 6f   called by a pro
1ccf0 63 65 73 73 20 62 65 66 6f 72 65 0a 20 20 2a 2a  cess before.  **
1cd00 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c   sqlite3_initial
1cd10 69 7a 65 28 29 20 69 73 2e 20 2a 2f 0a 20 20 73  ize() is. */.  s
1cd20 71 6c 69 74 65 33 5f 73 68 75 74 64 6f 77 6e 28  qlite3_shutdown(
1cd30 29 3b 0a 0a 20 20 54 63 6c 5f 46 69 6e 64 45 78  );..  Tcl_FindEx
1cd40 65 63 75 74 61 62 6c 65 28 61 72 67 76 5b 30 5d  ecutable(argv[0]
1cd50 29 3b 0a 20 20 69 6e 74 65 72 70 20 3d 20 54 63  );.  interp = Tc
1cd60 6c 5f 43 72 65 61 74 65 49 6e 74 65 72 70 28 29  l_CreateInterp()
1cd70 3b 0a 0a 23 69 66 20 54 43 4c 53 48 3d 3d 32 0a  ;..#if TCLSH==2.
1cd80 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67    sqlite3_config
1cd90 28 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53  (SQLITE_CONFIG_S
1cda0 49 4e 47 4c 45 54 48 52 45 41 44 29 3b 0a 23 65  INGLETHREAD);.#e
1cdb0 6e 64 69 66 0a 0a 20 20 69 6e 69 74 5f 61 6c 6c  ndif..  init_all
1cdc0 28 69 6e 74 65 72 70 29 3b 0a 20 20 69 66 28 20  (interp);.  if( 
1cdd0 61 72 67 63 3e 3d 32 20 29 7b 0a 20 20 20 20 69  argc>=2 ){.    i
1cde0 6e 74 20 69 3b 0a 20 20 20 20 63 68 61 72 20 7a  nt i;.    char z
1cdf0 41 72 67 63 5b 33 32 5d 3b 0a 20 20 20 20 73 71  Argc[32];.    sq
1ce00 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
1ce10 69 7a 65 6f 66 28 7a 41 72 67 63 29 2c 20 7a 41  izeof(zArgc), zA
1ce20 72 67 63 2c 20 22 25 64 22 2c 20 61 72 67 63 2d  rgc, "%d", argc-
1ce30 28 33 2d 54 43 4c 53 48 29 29 3b 0a 20 20 20 20  (3-TCLSH));.    
1ce40 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72  Tcl_SetVar(inter
1ce50 70 2c 22 61 72 67 63 22 2c 20 7a 41 72 67 63 2c  p,"argc", zArgc,
1ce60 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59   TCL_GLOBAL_ONLY
1ce70 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 56 61  );.    Tcl_SetVa
1ce80 72 28 69 6e 74 65 72 70 2c 22 61 72 67 76 30 22  r(interp,"argv0"
1ce90 2c 61 72 67 76 5b 31 5d 2c 54 43 4c 5f 47 4c 4f  ,argv[1],TCL_GLO
1cea0 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 20 20 20 20 54  BAL_ONLY);.    T
1ceb0 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70  cl_SetVar(interp
1cec0 2c 22 61 72 67 76 22 2c 20 22 22 2c 20 54 43 4c  ,"argv", "", TCL
1ced0 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 20  _GLOBAL_ONLY);. 
1cee0 20 20 20 66 6f 72 28 69 3d 33 2d 54 43 4c 53 48     for(i=3-TCLSH
1cef0 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a  ; i<argc; i++){.
1cf00 20 20 20 20 20 20 54 63 6c 5f 53 65 74 56 61 72        Tcl_SetVar
1cf10 28 69 6e 74 65 72 70 2c 20 22 61 72 67 76 22 2c  (interp, "argv",
1cf20 20 61 72 67 76 5b 69 5d 2c 0a 20 20 20 20 20 20   argv[i],.      
1cf30 20 20 20 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f      TCL_GLOBAL_O
1cf40 4e 4c 59 20 7c 20 54 43 4c 5f 4c 49 53 54 5f 45  NLY | TCL_LIST_E
1cf50 4c 45 4d 45 4e 54 20 7c 20 54 43 4c 5f 41 50 50  LEMENT | TCL_APP
1cf60 45 4e 44 5f 56 41 4c 55 45 29 3b 0a 20 20 20 20  END_VALUE);.    
1cf70 7d 0a 20 20 20 20 69 66 28 20 54 43 4c 53 48 3d  }.    if( TCLSH=
1cf80 3d 31 20 26 26 20 54 63 6c 5f 45 76 61 6c 46 69  =1 && Tcl_EvalFi
1cf90 6c 65 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b  le(interp, argv[
1cfa0 31 5d 29 21 3d 54 43 4c 5f 4f 4b 20 29 7b 0a 20  1])!=TCL_OK ){. 
1cfb0 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
1cfc0 2a 7a 49 6e 66 6f 20 3d 20 54 63 6c 5f 47 65 74  *zInfo = Tcl_Get
1cfd0 56 61 72 28 69 6e 74 65 72 70 2c 20 22 65 72 72  Var(interp, "err
1cfe0 6f 72 49 6e 66 6f 22 2c 20 54 43 4c 5f 47 4c 4f  orInfo", TCL_GLO
1cff0 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 20 20 20 20 20  BAL_ONLY);.     
1d000 20 69 66 28 20 7a 49 6e 66 6f 3d 3d 30 20 29 20   if( zInfo==0 ) 
1d010 7a 49 6e 66 6f 20 3d 20 54 63 6c 5f 47 65 74 53  zInfo = Tcl_GetS
1d020 74 72 69 6e 67 52 65 73 75 6c 74 28 69 6e 74 65  tringResult(inte
1d030 72 70 29 3b 0a 20 20 20 20 20 20 66 70 72 69 6e  rp);.      fprin
1d040 74 66 28 73 74 64 65 72 72 2c 22 25 73 3a 20 25  tf(stderr,"%s: %
1d050 73 5c 6e 22 2c 20 2a 61 72 67 76 2c 20 7a 49 6e  s\n", *argv, zIn
1d060 66 6f 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  fo);.      retur
1d070 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n 1;.    }.  }. 
1d080 20 69 66 28 20 54 43 4c 53 48 3d 3d 32 20 7c 7c   if( TCLSH==2 ||
1d090 20 61 72 67 63 3c 3d 31 20 29 7b 0a 20 20 20 20   argc<=1 ){.    
1d0a0 54 63 6c 5f 47 6c 6f 62 61 6c 45 76 61 6c 28 69  Tcl_GlobalEval(i
1d0b0 6e 74 65 72 70 2c 20 74 63 6c 73 68 5f 6d 61 69  nterp, tclsh_mai
1d0c0 6e 5f 6c 6f 6f 70 28 29 29 3b 0a 20 20 7d 0a 20  n_loop());.  }. 
1d0d0 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e   return 0;.}.#en
1d0e0 64 69 66 20 2f 2a 20 54 43 4c 53 48 20 2a 2f 0a  dif /* TCLSH */.