/ Hex Artifact Content
Login

Artifact de581e2e71f5e7f98366156afad83b4742ac6fe0:


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 7b 0a 20 20 20 20 20 20 54 63   }else{.      Tc
16bb0 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
16bc0 6e 74 65 72 70 2c 20 22 75 6e 6b 6e 6f 77 6e 20  nterp, "unknown 
16bd0 6f 70 74 69 6f 6e 3a 20 22 2c 20 7a 41 72 67 2c  option: ", zArg,
16be0 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20   (char*)0);.    
16bf0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
16c00 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  OR;.    }.  }.  
16c10 69 66 28 20 6f 62 6a 63 3c 33 20 7c 7c 20 28 6f  if( objc<3 || (o
16c20 62 6a 63 26 31 29 21 3d 31 20 29 7b 0a 20 20 20  bjc&1)!=1 ){.   
16c30 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
16c40 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
16c50 76 2c 20 0a 20 20 20 20 20 20 22 48 41 4e 44 4c  v, .      "HANDL
16c60 45 20 46 49 4c 45 4e 41 4d 45 20 3f 2d 76 66 73  E FILENAME ?-vfs
16c70 20 56 46 53 4e 41 4d 45 3f 20 3f 2d 72 65 61 64   VFSNAME? ?-read
16c80 6f 6e 6c 79 20 42 4f 4f 4c 45 41 4e 3f 20 3f 2d  only BOOLEAN? ?-
16c90 63 72 65 61 74 65 20 42 4f 4f 4c 45 41 4e 3f 22  create BOOLEAN?"
16ca0 0a 20 20 20 20 20 20 22 20 3f 2d 6e 6f 6d 75 74  .      " ?-nomut
16cb0 65 78 20 42 4f 4f 4c 45 41 4e 3f 20 3f 2d 66 75  ex BOOLEAN? ?-fu
16cc0 6c 6c 6d 75 74 65 78 20 42 4f 4f 4c 45 41 4e 3f  llmutex BOOLEAN?
16cd0 22 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ".#ifdef SQLITE_
16ce0 48 41 53 5f 43 4f 44 45 43 0a 20 20 20 20 20 20  HAS_CODEC.      
16cf0 22 20 3f 2d 6b 65 79 20 43 4f 44 45 43 4b 45 59  " ?-key CODECKEY
16d00 3f 22 0a 23 65 6e 64 69 66 0a 20 20 20 20 29 3b  ?".#endif.    );
16d10 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
16d20 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 45 72  ERROR;.  }.  zEr
16d30 72 4d 73 67 20 3d 20 30 3b 0a 20 20 70 20 3d 20  rMsg = 0;.  p = 
16d40 28 53 71 6c 69 74 65 44 62 2a 29 54 63 6c 5f 41  (SqliteDb*)Tcl_A
16d50 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 29  lloc( sizeof(*p)
16d60 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29   );.  if( p==0 )
16d70 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73  {.    Tcl_SetRes
16d80 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 6d 61 6c  ult(interp, "mal
16d90 6c 6f 63 20 66 61 69 6c 65 64 22 2c 20 54 43 4c  loc failed", TCL
16da0 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 72 65  _STATIC);.    re
16db0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
16dc0 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20    }.  memset(p, 
16dd0 30 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a  0, sizeof(*p));.
16de0 20 20 7a 46 69 6c 65 20 3d 20 54 63 6c 5f 47 65    zFile = Tcl_Ge
16df0 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
16e00 62 6a 76 5b 32 5d 2c 20 30 29 3b 0a 20 20 7a 46  bjv[2], 0);.  zF
16e10 69 6c 65 20 3d 20 54 63 6c 5f 54 72 61 6e 73 6c  ile = Tcl_Transl
16e20 61 74 65 46 69 6c 65 4e 61 6d 65 28 69 6e 74 65  ateFileName(inte
16e30 72 70 2c 20 7a 46 69 6c 65 2c 20 26 74 72 61 6e  rp, zFile, &tran
16e40 73 6c 61 74 65 64 46 69 6c 65 6e 61 6d 65 29 3b  slatedFilename);
16e50 0a 20 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f  .  sqlite3_open_
16e60 76 32 28 7a 46 69 6c 65 2c 20 26 70 2d 3e 64 62  v2(zFile, &p->db
16e70 2c 20 66 6c 61 67 73 2c 20 7a 56 66 73 29 3b 0a  , flags, zVfs);.
16e80 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65    Tcl_DStringFre
16e90 65 28 26 74 72 61 6e 73 6c 61 74 65 64 46 69 6c  e(&translatedFil
16ea0 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20 53 51  ename);.  if( SQ
16eb0 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33  LITE_OK!=sqlite3
16ec0 5f 65 72 72 63 6f 64 65 28 70 2d 3e 64 62 29 20  _errcode(p->db) 
16ed0 29 7b 0a 20 20 20 20 7a 45 72 72 4d 73 67 20 3d  ){.    zErrMsg =
16ee0 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
16ef0 28 22 25 73 22 2c 20 73 71 6c 69 74 65 33 5f 65  ("%s", sqlite3_e
16f00 72 72 6d 73 67 28 70 2d 3e 64 62 29 29 3b 0a 20  rrmsg(p->db));. 
16f10 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65     sqlite3_close
16f20 28 70 2d 3e 64 62 29 3b 0a 20 20 20 20 70 2d 3e  (p->db);.    p->
16f30 64 62 20 3d 20 30 3b 0a 20 20 7d 0a 23 69 66 64  db = 0;.  }.#ifd
16f40 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  ef SQLITE_HAS_CO
16f50 44 45 43 0a 20 20 69 66 28 20 70 2d 3e 64 62 20  DEC.  if( p->db 
16f60 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6b  ){.    sqlite3_k
16f70 65 79 28 70 2d 3e 64 62 2c 20 70 4b 65 79 2c 20  ey(p->db, pKey, 
16f80 6e 4b 65 79 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  nKey);.  }.#endi
16f90 66 0a 20 20 69 66 28 20 70 2d 3e 64 62 3d 3d 30  f.  if( p->db==0
16fa0 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52   ){.    Tcl_SetR
16fb0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 45  esult(interp, zE
16fc0 72 72 4d 73 67 2c 20 54 43 4c 5f 56 4f 4c 41 54  rrMsg, TCL_VOLAT
16fd0 49 4c 45 29 3b 0a 20 20 20 20 54 63 6c 5f 46 72  ILE);.    Tcl_Fr
16fe0 65 65 28 28 63 68 61 72 2a 29 70 29 3b 0a 20 20  ee((char*)p);.  
16ff0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
17000 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 72 65 74  ErrMsg);.    ret
17010 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
17020 20 7d 0a 20 20 70 2d 3e 6d 61 78 53 74 6d 74 20   }.  p->maxStmt 
17030 3d 20 4e 55 4d 5f 50 52 45 50 41 52 45 44 5f 53  = NUM_PREPARED_S
17040 54 4d 54 53 3b 0a 20 20 70 2d 3e 69 6e 74 65 72  TMTS;.  p->inter
17050 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 7a 41  p = interp;.  zA
17060 72 67 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  rg = Tcl_GetStri
17070 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31  ngFromObj(objv[1
17080 5d 2c 20 30 29 3b 0a 20 20 69 66 28 20 44 62 55  ], 0);.  if( DbU
17090 73 65 4e 72 65 28 29 20 29 7b 0a 20 20 20 20 54  seNre() ){.    T
170a0 63 6c 5f 4e 52 43 72 65 61 74 65 43 6f 6d 6d 61  cl_NRCreateComma
170b0 6e 64 28 69 6e 74 65 72 70 2c 20 7a 41 72 67 2c  nd(interp, zArg,
170c0 20 44 62 4f 62 6a 43 6d 64 41 64 61 70 74 6f 72   DbObjCmdAdaptor
170d0 2c 20 44 62 4f 62 6a 43 6d 64 2c 0a 20 20 20 20  , DbObjCmd,.    
170e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
170f0 20 20 20 20 28 63 68 61 72 2a 29 70 2c 20 44 62      (char*)p, Db
17100 44 65 6c 65 74 65 43 6d 64 29 3b 0a 20 20 7d 65  DeleteCmd);.  }e
17110 6c 73 65 7b 0a 20 20 20 20 54 63 6c 5f 43 72 65  lse{.    Tcl_Cre
17120 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e  ateObjCommand(in
17130 74 65 72 70 2c 20 7a 41 72 67 2c 20 44 62 4f 62  terp, zArg, DbOb
17140 6a 43 6d 64 2c 20 28 63 68 61 72 2a 29 70 2c 20  jCmd, (char*)p, 
17150 44 62 44 65 6c 65 74 65 43 6d 64 29 3b 0a 20 20  DbDeleteCmd);.  
17160 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  }.  return TCL_O
17170 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 76  K;.}../*.** Prov
17180 69 64 65 20 61 20 64 75 6d 6d 79 20 54 63 6c 5f  ide a dummy Tcl_
17190 49 6e 69 74 53 74 75 62 73 20 69 66 20 77 65 20  InitStubs if we 
171a0 61 72 65 20 75 73 69 6e 67 20 74 68 69 73 20 61  are using this a
171b0 73 20 61 20 73 74 61 74 69 63 0a 2a 2a 20 6c 69  s a static.** li
171c0 62 72 61 72 79 2e 0a 2a 2f 0a 23 69 66 6e 64 65  brary..*/.#ifnde
171d0 66 20 55 53 45 5f 54 43 4c 5f 53 54 55 42 53 0a  f USE_TCL_STUBS.
171e0 23 20 75 6e 64 65 66 20 20 54 63 6c 5f 49 6e 69  # undef  Tcl_Ini
171f0 74 53 74 75 62 73 0a 23 20 64 65 66 69 6e 65 20  tStubs.# define 
17200 54 63 6c 5f 49 6e 69 74 53 74 75 62 73 28 61 2c  Tcl_InitStubs(a,
17210 62 2c 63 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  b,c).#endif../*.
17220 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 77 65 20  ** Make sure we 
17230 68 61 76 65 20 61 20 50 41 43 4b 41 47 45 5f 56  have a PACKAGE_V
17240 45 52 53 49 4f 4e 20 6d 61 63 72 6f 20 64 65 66  ERSION macro def
17250 69 6e 65 64 2e 20 20 54 68 69 73 20 77 69 6c 6c  ined.  This will
17260 20 62 65 0a 2a 2a 20 64 65 66 69 6e 65 64 20 61   be.** defined a
17270 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 62 79 20  utomatically by 
17280 74 68 65 20 54 45 41 20 6d 61 6b 65 66 69 6c 65  the TEA makefile
17290 2e 20 20 42 75 74 20 6f 74 68 65 72 20 6d 61 6b  .  But other mak
172a0 65 66 69 6c 65 73 0a 2a 2a 20 64 6f 20 6e 6f 74  efiles.** do not
172b0 20 64 65 66 69 6e 65 20 69 74 2e 0a 2a 2f 0a 23   define it..*/.#
172c0 69 66 6e 64 65 66 20 50 41 43 4b 41 47 45 5f 56  ifndef PACKAGE_V
172d0 45 52 53 49 4f 4e 0a 23 20 64 65 66 69 6e 65 20  ERSION.# define 
172e0 50 41 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e 20  PACKAGE_VERSION 
172f0 53 51 4c 49 54 45 5f 56 45 52 53 49 4f 4e 0a 23  SQLITE_VERSION.#
17300 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69  endif../*.** Ini
17310 74 69 61 6c 69 7a 65 20 74 68 69 73 20 6d 6f 64  tialize this mod
17320 75 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ule..**.** This 
17330 54 63 6c 20 6d 6f 64 75 6c 65 20 63 6f 6e 74 61  Tcl module conta
17340 69 6e 73 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c  ins only a singl
17350 65 20 6e 65 77 20 54 63 6c 20 63 6f 6d 6d 61 6e  e new Tcl comman
17360 64 20 6e 61 6d 65 64 20 22 73 71 6c 69 74 65 22  d named "sqlite"
17370 2e 0a 2a 2a 20 28 48 65 6e 63 65 20 74 68 65 72  ..** (Hence ther
17380 65 20 69 73 20 6e 6f 20 6e 61 6d 65 73 70 61 63  e is no namespac
17390 65 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20  e.  There is no 
173a0 70 6f 69 6e 74 20 69 6e 20 75 73 69 6e 67 20 61  point in using a
173b0 20 6e 61 6d 65 73 70 61 63 65 0a 2a 2a 20 69 66   namespace.** if
173c0 20 74 68 65 20 65 78 74 65 6e 73 69 6f 6e 20 6f   the extension o
173d0 6e 6c 79 20 73 75 70 70 6c 69 65 73 20 6f 6e 65  nly supplies one
173e0 20 6e 65 77 20 6e 61 6d 65 21 29 20 20 54 68 65   new name!)  The
173f0 20 22 73 71 6c 69 74 65 22 20 63 6f 6d 6d 61 6e   "sqlite" comman
17400 64 20 69 73 0a 2a 2a 20 75 73 65 64 20 74 6f 20  d is.** used to 
17410 6f 70 65 6e 20 61 20 6e 65 77 20 53 51 4c 69 74  open a new SQLit
17420 65 20 64 61 74 61 62 61 73 65 2e 20 20 53 65 65  e database.  See
17430 20 74 68 65 20 44 62 4d 61 69 6e 28 29 20 72 6f   the DbMain() ro
17440 75 74 69 6e 65 20 61 62 6f 76 65 0a 2a 2a 20 66  utine above.** f
17450 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  or additional in
17460 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  formation..**.**
17470 20 54 68 65 20 45 58 54 45 52 4e 20 6d 61 63 72   The EXTERN macr
17480 6f 73 20 61 72 65 20 72 65 71 75 69 72 65 64 20  os are required 
17490 62 79 20 54 43 4c 20 69 6e 20 6f 72 64 65 72 20  by TCL in order 
174a0 74 6f 20 77 6f 72 6b 20 6f 6e 20 77 69 6e 64 6f  to work on windo
174b0 77 73 2e 0a 2a 2f 0a 45 58 54 45 52 4e 20 69 6e  ws..*/.EXTERN in
174c0 74 20 53 71 6c 69 74 65 33 5f 49 6e 69 74 28 54  t Sqlite3_Init(T
174d0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
174e0 70 29 7b 0a 20 20 54 63 6c 5f 49 6e 69 74 53 74  p){.  Tcl_InitSt
174f0 75 62 73 28 69 6e 74 65 72 70 2c 20 22 38 2e 34  ubs(interp, "8.4
17500 22 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 43 72 65  ", 0);.  Tcl_Cre
17510 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e  ateObjCommand(in
17520 74 65 72 70 2c 20 22 73 71 6c 69 74 65 33 22 2c  terp, "sqlite3",
17530 20 28 54 63 6c 5f 4f 62 6a 43 6d 64 50 72 6f 63   (Tcl_ObjCmdProc
17540 2a 29 44 62 4d 61 69 6e 2c 20 30 2c 20 30 29 3b  *)DbMain, 0, 0);
17550 0a 20 20 54 63 6c 5f 50 6b 67 50 72 6f 76 69 64  .  Tcl_PkgProvid
17560 65 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74  e(interp, "sqlit
17570 65 33 22 2c 20 50 41 43 4b 41 47 45 5f 56 45 52  e3", PACKAGE_VER
17580 53 49 4f 4e 29 3b 0a 0a 23 69 66 6e 64 65 66 20  SION);..#ifndef 
17590 53 51 4c 49 54 45 5f 33 5f 53 55 46 46 49 58 5f  SQLITE_3_SUFFIX_
175a0 4f 4e 4c 59 0a 20 20 2f 2a 20 54 68 65 20 22 73  ONLY.  /* The "s
175b0 71 6c 69 74 65 22 20 61 6c 69 61 73 20 69 73 20  qlite" alias is 
175c0 75 6e 64 6f 63 75 6d 65 6e 74 65 64 2e 20 20 49  undocumented.  I
175d0 74 20 69 73 20 68 65 72 65 20 6f 6e 6c 79 20 74  t is here only t
175e0 6f 20 73 75 70 70 6f 72 74 0a 20 20 2a 2a 20 6c  o support.  ** l
175f0 65 67 61 63 79 20 73 63 72 69 70 74 73 2e 20 20  egacy scripts.  
17600 41 6c 6c 20 6e 65 77 20 73 63 72 69 70 74 73 20  All new scripts 
17610 73 68 6f 75 6c 64 20 75 73 65 20 6f 6e 6c 79 20  should use only 
17620 74 68 65 20 22 73 71 6c 69 74 65 33 22 0a 20 20  the "sqlite3".  
17630 2a 2a 20 63 6f 6d 6d 61 6e 64 2e 0a 20 20 2a 2f  ** command..  */
17640 0a 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a  .  Tcl_CreateObj
17650 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20  Command(interp, 
17660 22 73 71 6c 69 74 65 22 2c 20 28 54 63 6c 5f 4f  "sqlite", (Tcl_O
17670 62 6a 43 6d 64 50 72 6f 63 2a 29 44 62 4d 61 69  bjCmdProc*)DbMai
17680 6e 2c 20 30 2c 20 30 29 3b 0a 23 65 6e 64 69 66  n, 0, 0);.#endif
17690 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ..  return TCL_O
176a0 4b 3b 0a 7d 0a 45 58 54 45 52 4e 20 69 6e 74 20  K;.}.EXTERN int 
176b0 54 63 6c 73 71 6c 69 74 65 33 5f 49 6e 69 74 28  Tclsqlite3_Init(
176c0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
176d0 72 70 29 7b 20 72 65 74 75 72 6e 20 53 71 6c 69  rp){ return Sqli
176e0 74 65 33 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  te3_Init(interp)
176f0 3b 20 7d 0a 45 58 54 45 52 4e 20 69 6e 74 20 53  ; }.EXTERN int S
17700 71 6c 69 74 65 33 5f 53 61 66 65 49 6e 69 74 28  qlite3_SafeInit(
17710 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
17720 72 70 29 7b 20 72 65 74 75 72 6e 20 54 43 4c 5f  rp){ return TCL_
17730 4f 4b 3b 20 7d 0a 45 58 54 45 52 4e 20 69 6e 74  OK; }.EXTERN int
17740 20 54 63 6c 73 71 6c 69 74 65 33 5f 53 61 66 65   Tclsqlite3_Safe
17750 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20  Init(Tcl_Interp 
17760 2a 69 6e 74 65 72 70 29 7b 20 72 65 74 75 72 6e  *interp){ return
17770 20 54 43 4c 5f 4f 4b 3b 20 7d 0a 45 58 54 45 52   TCL_OK; }.EXTER
17780 4e 20 69 6e 74 20 53 71 6c 69 74 65 33 5f 55 6e  N int Sqlite3_Un
17790 6c 6f 61 64 28 54 63 6c 5f 49 6e 74 65 72 70 20  load(Tcl_Interp 
177a0 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 66 6c 61  *interp, int fla
177b0 67 73 29 7b 20 72 65 74 75 72 6e 20 54 43 4c 5f  gs){ return TCL_
177c0 4f 4b 3b 20 7d 0a 45 58 54 45 52 4e 20 69 6e 74  OK; }.EXTERN int
177d0 20 54 63 6c 73 71 6c 69 74 65 33 5f 55 6e 6c 6f   Tclsqlite3_Unlo
177e0 61 64 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  ad(Tcl_Interp *i
177f0 6e 74 65 72 70 2c 20 69 6e 74 20 66 6c 61 67 73  nterp, int flags
17800 29 7b 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  ){ return TCL_OK
17810 3b 20 7d 0a 45 58 54 45 52 4e 20 69 6e 74 20 53  ; }.EXTERN int S
17820 71 6c 69 74 65 33 5f 53 61 66 65 55 6e 6c 6f 61  qlite3_SafeUnloa
17830 64 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  d(Tcl_Interp *in
17840 74 65 72 70 2c 20 69 6e 74 20 66 6c 61 67 73 29  terp, int flags)
17850 7b 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b  { return TCL_OK;
17860 20 7d 0a 45 58 54 45 52 4e 20 69 6e 74 20 54 63   }.EXTERN int Tc
17870 6c 73 71 6c 69 74 65 33 5f 53 61 66 65 55 6e 6c  lsqlite3_SafeUnl
17880 6f 61 64 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a  oad(Tcl_Interp *
17890 69 6e 74 65 72 70 2c 20 69 6e 74 20 66 6c 61 67  interp, int flag
178a0 73 29 7b 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  s){ return TCL_O
178b0 4b 3b 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51  K;}...#ifndef SQ
178c0 4c 49 54 45 5f 33 5f 53 55 46 46 49 58 5f 4f 4e  LITE_3_SUFFIX_ON
178d0 4c 59 0a 69 6e 74 20 53 71 6c 69 74 65 5f 49 6e  LY.int Sqlite_In
178e0 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  it(Tcl_Interp *i
178f0 6e 74 65 72 70 29 7b 20 72 65 74 75 72 6e 20 53  nterp){ return S
17900 71 6c 69 74 65 33 5f 49 6e 69 74 28 69 6e 74 65  qlite3_Init(inte
17910 72 70 29 3b 20 7d 0a 69 6e 74 20 54 63 6c 73 71  rp); }.int Tclsq
17920 6c 69 74 65 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  lite_Init(Tcl_In
17930 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 20 72  terp *interp){ r
17940 65 74 75 72 6e 20 53 71 6c 69 74 65 33 5f 49 6e  eturn Sqlite3_In
17950 69 74 28 69 6e 74 65 72 70 29 3b 20 7d 0a 69 6e  it(interp); }.in
17960 74 20 53 71 6c 69 74 65 5f 53 61 66 65 49 6e 69  t Sqlite_SafeIni
17970 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  t(Tcl_Interp *in
17980 74 65 72 70 29 7b 20 72 65 74 75 72 6e 20 54 43  terp){ return TC
17990 4c 5f 4f 4b 3b 20 7d 0a 69 6e 74 20 54 63 6c 73  L_OK; }.int Tcls
179a0 71 6c 69 74 65 5f 53 61 66 65 49 6e 69 74 28 54  qlite_SafeInit(T
179b0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
179c0 70 29 7b 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  p){ return TCL_O
179d0 4b 3b 20 7d 0a 69 6e 74 20 53 71 6c 69 74 65 5f  K; }.int Sqlite_
179e0 55 6e 6c 6f 61 64 28 54 63 6c 5f 49 6e 74 65 72  Unload(Tcl_Inter
179f0 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 66  p *interp, int f
17a00 6c 61 67 73 29 7b 20 72 65 74 75 72 6e 20 54 43  lags){ return TC
17a10 4c 5f 4f 4b 3b 20 7d 0a 69 6e 74 20 54 63 6c 73  L_OK; }.int Tcls
17a20 71 6c 69 74 65 5f 55 6e 6c 6f 61 64 28 54 63 6c  qlite_Unload(Tcl
17a30 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
17a40 20 69 6e 74 20 66 6c 61 67 73 29 7b 20 72 65 74   int flags){ ret
17a50 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 7d 0a 69 6e  urn TCL_OK; }.in
17a60 74 20 53 71 6c 69 74 65 5f 53 61 66 65 55 6e 6c  t Sqlite_SafeUnl
17a70 6f 61 64 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a  oad(Tcl_Interp *
17a80 69 6e 74 65 72 70 2c 20 69 6e 74 20 66 6c 61 67  interp, int flag
17a90 73 29 7b 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  s){ return TCL_O
17aa0 4b 3b 20 7d 0a 69 6e 74 20 54 63 6c 73 71 6c 69  K; }.int Tclsqli
17ab0 74 65 5f 53 61 66 65 55 6e 6c 6f 61 64 28 54 63  te_SafeUnload(Tc
17ac0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
17ad0 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 20 72 65  , int flags){ re
17ae0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 7d 0a 23 65  turn TCL_OK;}.#e
17af0 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 54 43 4c  ndif..#ifdef TCL
17b00 53 48 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  SH./************
17b10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17b20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17b30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17b40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17b50 2a 0a 2a 2a 20 41 6c 6c 20 6f 66 20 74 68 65 20  *.** All of the 
17b60 63 6f 64 65 20 74 68 61 74 20 66 6f 6c 6c 6f 77  code that follow
17b70 73 20 69 73 20 75 73 65 64 20 74 6f 20 62 75 69  s is used to bui
17b80 6c 64 20 73 74 61 6e 64 61 6c 6f 6e 65 20 54 43  ld standalone TC
17b90 4c 20 69 6e 74 65 72 70 72 65 74 65 72 73 0a 2a  L interpreters.*
17ba0 2a 20 74 68 61 74 20 61 72 65 20 73 74 61 74 69  * that are stati
17bb0 63 61 6c 6c 79 20 6c 69 6e 6b 65 64 20 77 69 74  cally linked wit
17bc0 68 20 53 51 4c 69 74 65 2e 20 20 45 6e 61 62 6c  h SQLite.  Enabl
17bd0 65 20 74 68 65 73 65 20 62 79 20 63 6f 6d 70 69  e these by compi
17be0 6c 69 6e 67 0a 2a 2a 20 77 69 74 68 20 2d 44 54  ling.** with -DT
17bf0 43 4c 53 48 3d 6e 20 77 68 65 72 65 20 6e 20 63  CLSH=n where n c
17c00 61 6e 20 62 65 20 31 20 6f 72 20 32 2e 20 20 41  an be 1 or 2.  A
17c10 6e 20 6e 20 6f 66 20 31 20 67 65 6e 65 72 61 74  n n of 1 generat
17c20 65 73 20 61 20 73 74 61 6e 64 61 72 64 0a 2a 2a  es a standard.**
17c30 20 74 63 6c 73 68 20 62 75 74 20 77 69 74 68 20   tclsh but with 
17c40 53 51 4c 69 74 65 20 62 75 69 6c 74 20 69 6e 2e  SQLite built in.
17c50 20 20 41 6e 20 6e 20 6f 66 20 32 20 67 65 6e 65    An n of 2 gene
17c60 72 61 74 65 73 20 74 68 65 20 53 51 4c 69 74 65  rates the SQLite
17c70 20 73 70 61 63 65 0a 2a 2a 20 61 6e 61 6c 79 73   space.** analys
17c80 69 73 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 0a  is program..*/..
17c90 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
17ca0 54 45 5f 54 45 53 54 29 20 7c 7c 20 64 65 66 69  TE_TEST) || defi
17cb0 6e 65 64 28 53 51 4c 49 54 45 5f 54 43 4c 4d 44  ned(SQLITE_TCLMD
17cc0 35 29 0a 2f 2a 0a 20 2a 20 54 68 69 73 20 63 6f  5)./*. * This co
17cd0 64 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68  de implements th
17ce0 65 20 4d 44 35 20 6d 65 73 73 61 67 65 2d 64 69  e MD5 message-di
17cf0 67 65 73 74 20 61 6c 67 6f 72 69 74 68 6d 2e 0a  gest algorithm..
17d00 20 2a 20 54 68 65 20 61 6c 67 6f 72 69 74 68 6d   * The algorithm
17d10 20 69 73 20 64 75 65 20 74 6f 20 52 6f 6e 20 52   is due to Ron R
17d20 69 76 65 73 74 2e 20 20 54 68 69 73 20 63 6f 64  ivest.  This cod
17d30 65 20 77 61 73 0a 20 2a 20 77 72 69 74 74 65 6e  e was. * written
17d40 20 62 79 20 43 6f 6c 69 6e 20 50 6c 75 6d 62 20   by Colin Plumb 
17d50 69 6e 20 31 39 39 33 2c 20 6e 6f 20 63 6f 70 79  in 1993, no copy
17d60 72 69 67 68 74 20 69 73 20 63 6c 61 69 6d 65 64  right is claimed
17d70 2e 0a 20 2a 20 54 68 69 73 20 63 6f 64 65 20 69  .. * This code i
17d80 73 20 69 6e 20 74 68 65 20 70 75 62 6c 69 63 20  s in the public 
17d90 64 6f 6d 61 69 6e 3b 20 64 6f 20 77 69 74 68 20  domain; do with 
17da0 69 74 20 77 68 61 74 20 79 6f 75 20 77 69 73 68  it what you wish
17db0 2e 0a 20 2a 0a 20 2a 20 45 71 75 69 76 61 6c 65  .. *. * Equivale
17dc0 6e 74 20 63 6f 64 65 20 69 73 20 61 76 61 69 6c  nt code is avail
17dd0 61 62 6c 65 20 66 72 6f 6d 20 52 53 41 20 44 61  able from RSA Da
17de0 74 61 20 53 65 63 75 72 69 74 79 2c 20 49 6e 63  ta Security, Inc
17df0 2e 0a 20 2a 20 54 68 69 73 20 63 6f 64 65 20 68  .. * This code h
17e00 61 73 20 62 65 65 6e 20 74 65 73 74 65 64 20 61  as been tested a
17e10 67 61 69 6e 73 74 20 74 68 61 74 2c 20 61 6e 64  gainst that, and
17e20 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 2c 0a   is equivalent,.
17e30 20 2a 20 65 78 63 65 70 74 20 74 68 61 74 20 79   * except that y
17e40 6f 75 20 64 6f 6e 27 74 20 6e 65 65 64 20 74 6f  ou don't need to
17e50 20 69 6e 63 6c 75 64 65 20 74 77 6f 20 70 61 67   include two pag
17e60 65 73 20 6f 66 20 6c 65 67 61 6c 65 73 65 0a 20  es of legalese. 
17e70 2a 20 77 69 74 68 20 65 76 65 72 79 20 63 6f 70  * with every cop
17e80 79 2e 0a 20 2a 0a 20 2a 20 54 6f 20 63 6f 6d 70  y.. *. * To comp
17e90 75 74 65 20 74 68 65 20 6d 65 73 73 61 67 65 20  ute the message 
17ea0 64 69 67 65 73 74 20 6f 66 20 61 20 63 68 75 6e  digest of a chun
17eb0 6b 20 6f 66 20 62 79 74 65 73 2c 20 64 65 63 6c  k of bytes, decl
17ec0 61 72 65 20 61 6e 0a 20 2a 20 4d 44 35 43 6f 6e  are an. * MD5Con
17ed0 74 65 78 74 20 73 74 72 75 63 74 75 72 65 2c 20  text structure, 
17ee0 70 61 73 73 20 69 74 20 74 6f 20 4d 44 35 49 6e  pass it to MD5In
17ef0 69 74 2c 20 63 61 6c 6c 20 4d 44 35 55 70 64 61  it, call MD5Upda
17f00 74 65 20 61 73 0a 20 2a 20 6e 65 65 64 65 64 20  te as. * needed 
17f10 6f 6e 20 62 75 66 66 65 72 73 20 66 75 6c 6c 20  on buffers full 
17f20 6f 66 20 62 79 74 65 73 2c 20 61 6e 64 20 74 68  of bytes, and th
17f30 65 6e 20 63 61 6c 6c 20 4d 44 35 46 69 6e 61 6c  en call MD5Final
17f40 2c 20 77 68 69 63 68 0a 20 2a 20 77 69 6c 6c 20  , which. * will 
17f50 66 69 6c 6c 20 61 20 73 75 70 70 6c 69 65 64 20  fill a supplied 
17f60 31 36 2d 62 79 74 65 20 61 72 72 61 79 20 77 69  16-byte array wi
17f70 74 68 20 74 68 65 20 64 69 67 65 73 74 2e 0a 20  th the digest.. 
17f80 2a 2f 0a 0a 2f 2a 0a 20 2a 20 49 66 20 63 6f 6d  */../*. * If com
17f90 70 69 6c 65 64 20 6f 6e 20 61 20 6d 61 63 68 69  piled on a machi
17fa0 6e 65 20 74 68 61 74 20 64 6f 65 73 6e 27 74 20  ne that doesn't 
17fb0 68 61 76 65 20 61 20 33 32 2d 62 69 74 20 69 6e  have a 32-bit in
17fc0 74 65 67 65 72 2c 0a 20 2a 20 79 6f 75 20 6a 75  teger,. * you ju
17fd0 73 74 20 73 65 74 20 22 75 69 6e 74 33 32 22 20  st set "uint32" 
17fe0 74 6f 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  to the appropria
17ff0 74 65 20 64 61 74 61 74 79 70 65 20 66 6f 72 20  te datatype for 
18000 61 6e 0a 20 2a 20 75 6e 73 69 67 6e 65 64 20 33  an. * unsigned 3
18010 32 2d 62 69 74 20 69 6e 74 65 67 65 72 2e 20 20  2-bit integer.  
18020 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 20 2a 0a  For example:. *.
18030 20 2a 20 20 20 20 20 20 20 63 63 20 2d 44 75 69   *       cc -Dui
18040 6e 74 33 32 3d 27 75 6e 73 69 67 6e 65 64 20 6c  nt32='unsigned l
18050 6f 6e 67 27 20 6d 64 35 2e 63 0a 20 2a 0a 20 2a  ong' md5.c. *. *
18060 2f 0a 23 69 66 6e 64 65 66 20 75 69 6e 74 33 32  /.#ifndef uint32
18070 0a 23 20 20 64 65 66 69 6e 65 20 75 69 6e 74 33  .#  define uint3
18080 32 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 0a 23  2 unsigned int.#
18090 65 6e 64 69 66 0a 0a 73 74 72 75 63 74 20 4d 44  endif..struct MD
180a0 35 43 6f 6e 74 65 78 74 20 7b 0a 20 20 69 6e 74  5Context {.  int
180b0 20 69 73 49 6e 69 74 3b 0a 20 20 75 69 6e 74 33   isInit;.  uint3
180c0 32 20 62 75 66 5b 34 5d 3b 0a 20 20 75 69 6e 74  2 buf[4];.  uint
180d0 33 32 20 62 69 74 73 5b 32 5d 3b 0a 20 20 75 6e  32 bits[2];.  un
180e0 73 69 67 6e 65 64 20 63 68 61 72 20 69 6e 5b 36  signed char in[6
180f0 34 5d 3b 0a 7d 3b 0a 74 79 70 65 64 65 66 20 73  4];.};.typedef s
18100 74 72 75 63 74 20 4d 44 35 43 6f 6e 74 65 78 74  truct MD5Context
18110 20 4d 44 35 43 6f 6e 74 65 78 74 3b 0a 0a 2f 2a   MD5Context;../*
18120 0a 20 2a 20 4e 6f 74 65 3a 20 74 68 69 73 20 63  . * Note: this c
18130 6f 64 65 20 69 73 20 68 61 72 6d 6c 65 73 73 20  ode is harmless 
18140 6f 6e 20 6c 69 74 74 6c 65 2d 65 6e 64 69 61 6e  on little-endian
18150 20 6d 61 63 68 69 6e 65 73 2e 0a 20 2a 2f 0a 73   machines.. */.s
18160 74 61 74 69 63 20 76 6f 69 64 20 62 79 74 65 52  tatic void byteR
18170 65 76 65 72 73 65 20 28 75 6e 73 69 67 6e 65 64  everse (unsigned
18180 20 63 68 61 72 20 2a 62 75 66 2c 20 75 6e 73 69   char *buf, unsi
18190 67 6e 65 64 20 6c 6f 6e 67 73 29 7b 0a 20 20 20  gned longs){.   
181a0 20 20 20 20 20 75 69 6e 74 33 32 20 74 3b 0a 20       uint32 t;. 
181b0 20 20 20 20 20 20 20 64 6f 20 7b 0a 20 20 20 20         do {.    
181c0 20 20 20 20 20 20 20 20 20 20 20 20 74 20 3d 20              t = 
181d0 28 75 69 6e 74 33 32 29 28 28 75 6e 73 69 67 6e  (uint32)((unsign
181e0 65 64 29 62 75 66 5b 33 5d 3c 3c 38 20 7c 20 62  ed)buf[3]<<8 | b
181f0 75 66 5b 32 5d 29 20 3c 3c 20 31 36 20 7c 0a 20  uf[2]) << 16 |. 
18200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18210 20 20 20 20 20 20 20 20 20 20 20 28 28 75 6e 73             ((uns
18220 69 67 6e 65 64 29 62 75 66 5b 31 5d 3c 3c 38 20  igned)buf[1]<<8 
18230 7c 20 62 75 66 5b 30 5d 29 3b 0a 20 20 20 20 20  | buf[0]);.     
18240 20 20 20 20 20 20 20 20 20 20 20 2a 28 75 69 6e             *(uin
18250 74 33 32 20 2a 29 62 75 66 20 3d 20 74 3b 0a 20  t32 *)buf = t;. 
18260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
18270 75 66 20 2b 3d 20 34 3b 0a 20 20 20 20 20 20 20  uf += 4;.       
18280 20 7d 20 77 68 69 6c 65 20 28 2d 2d 6c 6f 6e 67   } while (--long
18290 73 29 3b 0a 7d 0a 2f 2a 20 54 68 65 20 66 6f 75  s);.}./* The fou
182a0 72 20 63 6f 72 65 20 66 75 6e 63 74 69 6f 6e 73  r core functions
182b0 20 2d 20 46 31 20 69 73 20 6f 70 74 69 6d 69 7a   - F1 is optimiz
182c0 65 64 20 73 6f 6d 65 77 68 61 74 20 2a 2f 0a 0a  ed somewhat */..
182d0 2f 2a 20 23 64 65 66 69 6e 65 20 46 31 28 78 2c  /* #define F1(x,
182e0 20 79 2c 20 7a 29 20 28 78 20 26 20 79 20 7c 20   y, z) (x & y | 
182f0 7e 78 20 26 20 7a 29 20 2a 2f 0a 23 64 65 66 69  ~x & z) */.#defi
18300 6e 65 20 46 31 28 78 2c 20 79 2c 20 7a 29 20 28  ne F1(x, y, z) (
18310 7a 20 5e 20 28 78 20 26 20 28 79 20 5e 20 7a 29  z ^ (x & (y ^ z)
18320 29 29 0a 23 64 65 66 69 6e 65 20 46 32 28 78 2c  )).#define F2(x,
18330 20 79 2c 20 7a 29 20 46 31 28 7a 2c 20 78 2c 20   y, z) F1(z, x, 
18340 79 29 0a 23 64 65 66 69 6e 65 20 46 33 28 78 2c  y).#define F3(x,
18350 20 79 2c 20 7a 29 20 28 78 20 5e 20 79 20 5e 20   y, z) (x ^ y ^ 
18360 7a 29 0a 23 64 65 66 69 6e 65 20 46 34 28 78 2c  z).#define F4(x,
18370 20 79 2c 20 7a 29 20 28 79 20 5e 20 28 78 20 7c   y, z) (y ^ (x |
18380 20 7e 7a 29 29 0a 0a 2f 2a 20 54 68 69 73 20 69   ~z))../* This i
18390 73 20 74 68 65 20 63 65 6e 74 72 61 6c 20 73 74  s the central st
183a0 65 70 20 69 6e 20 74 68 65 20 4d 44 35 20 61 6c  ep in the MD5 al
183b0 67 6f 72 69 74 68 6d 2e 20 2a 2f 0a 23 64 65 66  gorithm. */.#def
183c0 69 6e 65 20 4d 44 35 53 54 45 50 28 66 2c 20 77  ine MD5STEP(f, w
183d0 2c 20 78 2c 20 79 2c 20 7a 2c 20 64 61 74 61 2c  , x, y, z, data,
183e0 20 73 29 20 5c 0a 20 20 20 20 20 20 20 20 28 20   s) \.        ( 
183f0 77 20 2b 3d 20 66 28 78 2c 20 79 2c 20 7a 29 20  w += f(x, y, z) 
18400 2b 20 64 61 74 61 2c 20 20 77 20 3d 20 77 3c 3c  + data,  w = w<<
18410 73 20 7c 20 77 3e 3e 28 33 32 2d 73 29 2c 20 20  s | w>>(32-s),  
18420 77 20 2b 3d 20 78 20 29 0a 0a 2f 2a 0a 20 2a 20  w += x )../*. * 
18430 54 68 65 20 63 6f 72 65 20 6f 66 20 74 68 65 20  The core of the 
18440 4d 44 35 20 61 6c 67 6f 72 69 74 68 6d 2c 20 74  MD5 algorithm, t
18450 68 69 73 20 61 6c 74 65 72 73 20 61 6e 20 65 78  his alters an ex
18460 69 73 74 69 6e 67 20 4d 44 35 20 68 61 73 68 20  isting MD5 hash 
18470 74 6f 0a 20 2a 20 72 65 66 6c 65 63 74 20 74 68  to. * reflect th
18480 65 20 61 64 64 69 74 69 6f 6e 20 6f 66 20 31 36  e addition of 16
18490 20 6c 6f 6e 67 77 6f 72 64 73 20 6f 66 20 6e 65   longwords of ne
184a0 77 20 64 61 74 61 2e 20 20 4d 44 35 55 70 64 61  w data.  MD5Upda
184b0 74 65 20 62 6c 6f 63 6b 73 0a 20 2a 20 74 68 65  te blocks. * the
184c0 20 64 61 74 61 20 61 6e 64 20 63 6f 6e 76 65 72   data and conver
184d0 74 73 20 62 79 74 65 73 20 69 6e 74 6f 20 6c 6f  ts bytes into lo
184e0 6e 67 77 6f 72 64 73 20 66 6f 72 20 74 68 69 73  ngwords for this
184f0 20 72 6f 75 74 69 6e 65 2e 0a 20 2a 2f 0a 73 74   routine.. */.st
18500 61 74 69 63 20 76 6f 69 64 20 4d 44 35 54 72 61  atic void MD5Tra
18510 6e 73 66 6f 72 6d 28 75 69 6e 74 33 32 20 62 75  nsform(uint32 bu
18520 66 5b 34 5d 2c 20 63 6f 6e 73 74 20 75 69 6e 74  f[4], const uint
18530 33 32 20 69 6e 5b 31 36 5d 29 7b 0a 20 20 20 20  32 in[16]){.    
18540 20 20 20 20 72 65 67 69 73 74 65 72 20 75 69 6e      register uin
18550 74 33 32 20 61 2c 20 62 2c 20 63 2c 20 64 3b 0a  t32 a, b, c, d;.
18560 0a 20 20 20 20 20 20 20 20 61 20 3d 20 62 75 66  .        a = buf
18570 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20 62 20 3d  [0];.        b =
18580 20 62 75 66 5b 31 5d 3b 0a 20 20 20 20 20 20 20   buf[1];.       
18590 20 63 20 3d 20 62 75 66 5b 32 5d 3b 0a 20 20 20   c = buf[2];.   
185a0 20 20 20 20 20 64 20 3d 20 62 75 66 5b 33 5d 3b       d = buf[3];
185b0 0a 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45  ..        MD5STE
185c0 50 28 46 31 2c 20 61 2c 20 62 2c 20 63 2c 20 64  P(F1, a, b, c, d
185d0 2c 20 69 6e 5b 20 30 5d 2b 30 78 64 37 36 61 61  , in[ 0]+0xd76aa
185e0 34 37 38 2c 20 20 37 29 3b 0a 20 20 20 20 20 20  478,  7);.      
185f0 20 20 4d 44 35 53 54 45 50 28 46 31 2c 20 64 2c    MD5STEP(F1, d,
18600 20 61 2c 20 62 2c 20 63 2c 20 69 6e 5b 20 31 5d   a, b, c, in[ 1]
18610 2b 30 78 65 38 63 37 62 37 35 36 2c 20 31 32 29  +0xe8c7b756, 12)
18620 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45  ;.        MD5STE
18630 50 28 46 31 2c 20 63 2c 20 64 2c 20 61 2c 20 62  P(F1, c, d, a, b
18640 2c 20 69 6e 5b 20 32 5d 2b 30 78 32 34 32 30 37  , in[ 2]+0x24207
18650 30 64 62 2c 20 31 37 29 3b 0a 20 20 20 20 20 20  0db, 17);.      
18660 20 20 4d 44 35 53 54 45 50 28 46 31 2c 20 62 2c    MD5STEP(F1, b,
18670 20 63 2c 20 64 2c 20 61 2c 20 69 6e 5b 20 33 5d   c, d, a, in[ 3]
18680 2b 30 78 63 31 62 64 63 65 65 65 2c 20 32 32 29  +0xc1bdceee, 22)
18690 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45  ;.        MD5STE
186a0 50 28 46 31 2c 20 61 2c 20 62 2c 20 63 2c 20 64  P(F1, a, b, c, d
186b0 2c 20 69 6e 5b 20 34 5d 2b 30 78 66 35 37 63 30  , in[ 4]+0xf57c0
186c0 66 61 66 2c 20 20 37 29 3b 0a 20 20 20 20 20 20  faf,  7);.      
186d0 20 20 4d 44 35 53 54 45 50 28 46 31 2c 20 64 2c    MD5STEP(F1, d,
186e0 20 61 2c 20 62 2c 20 63 2c 20 69 6e 5b 20 35 5d   a, b, c, in[ 5]
186f0 2b 30 78 34 37 38 37 63 36 32 61 2c 20 31 32 29  +0x4787c62a, 12)
18700 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45  ;.        MD5STE
18710 50 28 46 31 2c 20 63 2c 20 64 2c 20 61 2c 20 62  P(F1, c, d, a, b
18720 2c 20 69 6e 5b 20 36 5d 2b 30 78 61 38 33 30 34  , in[ 6]+0xa8304
18730 36 31 33 2c 20 31 37 29 3b 0a 20 20 20 20 20 20  613, 17);.      
18740 20 20 4d 44 35 53 54 45 50 28 46 31 2c 20 62 2c    MD5STEP(F1, b,
18750 20 63 2c 20 64 2c 20 61 2c 20 69 6e 5b 20 37 5d   c, d, a, in[ 7]
18760 2b 30 78 66 64 34 36 39 35 30 31 2c 20 32 32 29  +0xfd469501, 22)
18770 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45  ;.        MD5STE
18780 50 28 46 31 2c 20 61 2c 20 62 2c 20 63 2c 20 64  P(F1, a, b, c, d
18790 2c 20 69 6e 5b 20 38 5d 2b 30 78 36 39 38 30 39  , in[ 8]+0x69809
187a0 38 64 38 2c 20 20 37 29 3b 0a 20 20 20 20 20 20  8d8,  7);.      
187b0 20 20 4d 44 35 53 54 45 50 28 46 31 2c 20 64 2c    MD5STEP(F1, d,
187c0 20 61 2c 20 62 2c 20 63 2c 20 69 6e 5b 20 39 5d   a, b, c, in[ 9]
187d0 2b 30 78 38 62 34 34 66 37 61 66 2c 20 31 32 29  +0x8b44f7af, 12)
187e0 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45  ;.        MD5STE
187f0 50 28 46 31 2c 20 63 2c 20 64 2c 20 61 2c 20 62  P(F1, c, d, a, b
18800 2c 20 69 6e 5b 31 30 5d 2b 30 78 66 66 66 66 35  , in[10]+0xffff5
18810 62 62 31 2c 20 31 37 29 3b 0a 20 20 20 20 20 20  bb1, 17);.      
18820 20 20 4d 44 35 53 54 45 50 28 46 31 2c 20 62 2c    MD5STEP(F1, b,
18830 20 63 2c 20 64 2c 20 61 2c 20 69 6e 5b 31 31 5d   c, d, a, in[11]
18840 2b 30 78 38 39 35 63 64 37 62 65 2c 20 32 32 29  +0x895cd7be, 22)
18850 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45  ;.        MD5STE
18860 50 28 46 31 2c 20 61 2c 20 62 2c 20 63 2c 20 64  P(F1, a, b, c, d
18870 2c 20 69 6e 5b 31 32 5d 2b 30 78 36 62 39 30 31  , in[12]+0x6b901
18880 31 32 32 2c 20 20 37 29 3b 0a 20 20 20 20 20 20  122,  7);.      
18890 20 20 4d 44 35 53 54 45 50 28 46 31 2c 20 64 2c    MD5STEP(F1, d,
188a0 20 61 2c 20 62 2c 20 63 2c 20 69 6e 5b 31 33 5d   a, b, c, in[13]
188b0 2b 30 78 66 64 39 38 37 31 39 33 2c 20 31 32 29  +0xfd987193, 12)
188c0 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45  ;.        MD5STE
188d0 50 28 46 31 2c 20 63 2c 20 64 2c 20 61 2c 20 62  P(F1, c, d, a, b
188e0 2c 20 69 6e 5b 31 34 5d 2b 30 78 61 36 37 39 34  , in[14]+0xa6794
188f0 33 38 65 2c 20 31 37 29 3b 0a 20 20 20 20 20 20  38e, 17);.      
18900 20 20 4d 44 35 53 54 45 50 28 46 31 2c 20 62 2c    MD5STEP(F1, b,
18910 20 63 2c 20 64 2c 20 61 2c 20 69 6e 5b 31 35 5d   c, d, a, in[15]
18920 2b 30 78 34 39 62 34 30 38 32 31 2c 20 32 32 29  +0x49b40821, 22)
18930 3b 0a 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54  ;..        MD5ST
18940 45 50 28 46 32 2c 20 61 2c 20 62 2c 20 63 2c 20  EP(F2, a, b, c, 
18950 64 2c 20 69 6e 5b 20 31 5d 2b 30 78 66 36 31 65  d, in[ 1]+0xf61e
18960 32 35 36 32 2c 20 20 35 29 3b 0a 20 20 20 20 20  2562,  5);.     
18970 20 20 20 4d 44 35 53 54 45 50 28 46 32 2c 20 64     MD5STEP(F2, d
18980 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e 5b 20 36  , a, b, c, in[ 6
18990 5d 2b 30 78 63 30 34 30 62 33 34 30 2c 20 20 39  ]+0xc040b340,  9
189a0 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54  );.        MD5ST
189b0 45 50 28 46 32 2c 20 63 2c 20 64 2c 20 61 2c 20  EP(F2, c, d, a, 
189c0 62 2c 20 69 6e 5b 31 31 5d 2b 30 78 32 36 35 65  b, in[11]+0x265e
189d0 35 61 35 31 2c 20 31 34 29 3b 0a 20 20 20 20 20  5a51, 14);.     
189e0 20 20 20 4d 44 35 53 54 45 50 28 46 32 2c 20 62     MD5STEP(F2, b
189f0 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e 5b 20 30  , c, d, a, in[ 0
18a00 5d 2b 30 78 65 39 62 36 63 37 61 61 2c 20 32 30  ]+0xe9b6c7aa, 20
18a10 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54  );.        MD5ST
18a20 45 50 28 46 32 2c 20 61 2c 20 62 2c 20 63 2c 20  EP(F2, a, b, c, 
18a30 64 2c 20 69 6e 5b 20 35 5d 2b 30 78 64 36 32 66  d, in[ 5]+0xd62f
18a40 31 30 35 64 2c 20 20 35 29 3b 0a 20 20 20 20 20  105d,  5);.     
18a50 20 20 20 4d 44 35 53 54 45 50 28 46 32 2c 20 64     MD5STEP(F2, d
18a60 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e 5b 31 30  , a, b, c, in[10
18a70 5d 2b 30 78 30 32 34 34 31 34 35 33 2c 20 20 39  ]+0x02441453,  9
18a80 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54  );.        MD5ST
18a90 45 50 28 46 32 2c 20 63 2c 20 64 2c 20 61 2c 20  EP(F2, c, d, a, 
18aa0 62 2c 20 69 6e 5b 31 35 5d 2b 30 78 64 38 61 31  b, in[15]+0xd8a1
18ab0 65 36 38 31 2c 20 31 34 29 3b 0a 20 20 20 20 20  e681, 14);.     
18ac0 20 20 20 4d 44 35 53 54 45 50 28 46 32 2c 20 62     MD5STEP(F2, b
18ad0 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e 5b 20 34  , c, d, a, in[ 4
18ae0 5d 2b 30 78 65 37 64 33 66 62 63 38 2c 20 32 30  ]+0xe7d3fbc8, 20
18af0 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54  );.        MD5ST
18b00 45 50 28 46 32 2c 20 61 2c 20 62 2c 20 63 2c 20  EP(F2, a, b, c, 
18b10 64 2c 20 69 6e 5b 20 39 5d 2b 30 78 32 31 65 31  d, in[ 9]+0x21e1
18b20 63 64 65 36 2c 20 20 35 29 3b 0a 20 20 20 20 20  cde6,  5);.     
18b30 20 20 20 4d 44 35 53 54 45 50 28 46 32 2c 20 64     MD5STEP(F2, d
18b40 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e 5b 31 34  , a, b, c, in[14
18b50 5d 2b 30 78 63 33 33 37 30 37 64 36 2c 20 20 39  ]+0xc33707d6,  9
18b60 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54  );.        MD5ST
18b70 45 50 28 46 32 2c 20 63 2c 20 64 2c 20 61 2c 20  EP(F2, c, d, a, 
18b80 62 2c 20 69 6e 5b 20 33 5d 2b 30 78 66 34 64 35  b, in[ 3]+0xf4d5
18b90 30 64 38 37 2c 20 31 34 29 3b 0a 20 20 20 20 20  0d87, 14);.     
18ba0 20 20 20 4d 44 35 53 54 45 50 28 46 32 2c 20 62     MD5STEP(F2, b
18bb0 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e 5b 20 38  , c, d, a, in[ 8
18bc0 5d 2b 30 78 34 35 35 61 31 34 65 64 2c 20 32 30  ]+0x455a14ed, 20
18bd0 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54  );.        MD5ST
18be0 45 50 28 46 32 2c 20 61 2c 20 62 2c 20 63 2c 20  EP(F2, a, b, c, 
18bf0 64 2c 20 69 6e 5b 31 33 5d 2b 30 78 61 39 65 33  d, in[13]+0xa9e3
18c00 65 39 30 35 2c 20 20 35 29 3b 0a 20 20 20 20 20  e905,  5);.     
18c10 20 20 20 4d 44 35 53 54 45 50 28 46 32 2c 20 64     MD5STEP(F2, d
18c20 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e 5b 20 32  , a, b, c, in[ 2
18c30 5d 2b 30 78 66 63 65 66 61 33 66 38 2c 20 20 39  ]+0xfcefa3f8,  9
18c40 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54  );.        MD5ST
18c50 45 50 28 46 32 2c 20 63 2c 20 64 2c 20 61 2c 20  EP(F2, c, d, a, 
18c60 62 2c 20 69 6e 5b 20 37 5d 2b 30 78 36 37 36 66  b, in[ 7]+0x676f
18c70 30 32 64 39 2c 20 31 34 29 3b 0a 20 20 20 20 20  02d9, 14);.     
18c80 20 20 20 4d 44 35 53 54 45 50 28 46 32 2c 20 62     MD5STEP(F2, b
18c90 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e 5b 31 32  , c, d, a, in[12
18ca0 5d 2b 30 78 38 64 32 61 34 63 38 61 2c 20 32 30  ]+0x8d2a4c8a, 20
18cb0 29 3b 0a 0a 20 20 20 20 20 20 20 20 4d 44 35 53  );..        MD5S
18cc0 54 45 50 28 46 33 2c 20 61 2c 20 62 2c 20 63 2c  TEP(F3, a, b, c,
18cd0 20 64 2c 20 69 6e 5b 20 35 5d 2b 30 78 66 66 66   d, in[ 5]+0xfff
18ce0 61 33 39 34 32 2c 20 20 34 29 3b 0a 20 20 20 20  a3942,  4);.    
18cf0 20 20 20 20 4d 44 35 53 54 45 50 28 46 33 2c 20      MD5STEP(F3, 
18d00 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e 5b 20  d, a, b, c, in[ 
18d10 38 5d 2b 30 78 38 37 37 31 66 36 38 31 2c 20 31  8]+0x8771f681, 1
18d20 31 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53  1);.        MD5S
18d30 54 45 50 28 46 33 2c 20 63 2c 20 64 2c 20 61 2c  TEP(F3, c, d, a,
18d40 20 62 2c 20 69 6e 5b 31 31 5d 2b 30 78 36 64 39   b, in[11]+0x6d9
18d50 64 36 31 32 32 2c 20 31 36 29 3b 0a 20 20 20 20  d6122, 16);.    
18d60 20 20 20 20 4d 44 35 53 54 45 50 28 46 33 2c 20      MD5STEP(F3, 
18d70 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e 5b 31  b, c, d, a, in[1
18d80 34 5d 2b 30 78 66 64 65 35 33 38 30 63 2c 20 32  4]+0xfde5380c, 2
18d90 33 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53  3);.        MD5S
18da0 54 45 50 28 46 33 2c 20 61 2c 20 62 2c 20 63 2c  TEP(F3, a, b, c,
18db0 20 64 2c 20 69 6e 5b 20 31 5d 2b 30 78 61 34 62   d, in[ 1]+0xa4b
18dc0 65 65 61 34 34 2c 20 20 34 29 3b 0a 20 20 20 20  eea44,  4);.    
18dd0 20 20 20 20 4d 44 35 53 54 45 50 28 46 33 2c 20      MD5STEP(F3, 
18de0 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e 5b 20  d, a, b, c, in[ 
18df0 34 5d 2b 30 78 34 62 64 65 63 66 61 39 2c 20 31  4]+0x4bdecfa9, 1
18e00 31 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53  1);.        MD5S
18e10 54 45 50 28 46 33 2c 20 63 2c 20 64 2c 20 61 2c  TEP(F3, c, d, a,
18e20 20 62 2c 20 69 6e 5b 20 37 5d 2b 30 78 66 36 62   b, in[ 7]+0xf6b
18e30 62 34 62 36 30 2c 20 31 36 29 3b 0a 20 20 20 20  b4b60, 16);.    
18e40 20 20 20 20 4d 44 35 53 54 45 50 28 46 33 2c 20      MD5STEP(F3, 
18e50 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e 5b 31  b, c, d, a, in[1
18e60 30 5d 2b 30 78 62 65 62 66 62 63 37 30 2c 20 32  0]+0xbebfbc70, 2
18e70 33 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53  3);.        MD5S
18e80 54 45 50 28 46 33 2c 20 61 2c 20 62 2c 20 63 2c  TEP(F3, a, b, c,
18e90 20 64 2c 20 69 6e 5b 31 33 5d 2b 30 78 32 38 39   d, in[13]+0x289
18ea0 62 37 65 63 36 2c 20 20 34 29 3b 0a 20 20 20 20  b7ec6,  4);.    
18eb0 20 20 20 20 4d 44 35 53 54 45 50 28 46 33 2c 20      MD5STEP(F3, 
18ec0 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e 5b 20  d, a, b, c, in[ 
18ed0 30 5d 2b 30 78 65 61 61 31 32 37 66 61 2c 20 31  0]+0xeaa127fa, 1
18ee0 31 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53  1);.        MD5S
18ef0 54 45 50 28 46 33 2c 20 63 2c 20 64 2c 20 61 2c  TEP(F3, c, d, a,
18f00 20 62 2c 20 69 6e 5b 20 33 5d 2b 30 78 64 34 65   b, in[ 3]+0xd4e
18f10 66 33 30 38 35 2c 20 31 36 29 3b 0a 20 20 20 20  f3085, 16);.    
18f20 20 20 20 20 4d 44 35 53 54 45 50 28 46 33 2c 20      MD5STEP(F3, 
18f30 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e 5b 20  b, c, d, a, in[ 
18f40 36 5d 2b 30 78 30 34 38 38 31 64 30 35 2c 20 32  6]+0x04881d05, 2
18f50 33 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53  3);.        MD5S
18f60 54 45 50 28 46 33 2c 20 61 2c 20 62 2c 20 63 2c  TEP(F3, a, b, c,
18f70 20 64 2c 20 69 6e 5b 20 39 5d 2b 30 78 64 39 64   d, in[ 9]+0xd9d
18f80 34 64 30 33 39 2c 20 20 34 29 3b 0a 20 20 20 20  4d039,  4);.    
18f90 20 20 20 20 4d 44 35 53 54 45 50 28 46 33 2c 20      MD5STEP(F3, 
18fa0 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e 5b 31  d, a, b, c, in[1
18fb0 32 5d 2b 30 78 65 36 64 62 39 39 65 35 2c 20 31  2]+0xe6db99e5, 1
18fc0 31 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53  1);.        MD5S
18fd0 54 45 50 28 46 33 2c 20 63 2c 20 64 2c 20 61 2c  TEP(F3, c, d, a,
18fe0 20 62 2c 20 69 6e 5b 31 35 5d 2b 30 78 31 66 61   b, in[15]+0x1fa
18ff0 32 37 63 66 38 2c 20 31 36 29 3b 0a 20 20 20 20  27cf8, 16);.    
19000 20 20 20 20 4d 44 35 53 54 45 50 28 46 33 2c 20      MD5STEP(F3, 
19010 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e 5b 20  b, c, d, a, in[ 
19020 32 5d 2b 30 78 63 34 61 63 35 36 36 35 2c 20 32  2]+0xc4ac5665, 2
19030 33 29 3b 0a 0a 20 20 20 20 20 20 20 20 4d 44 35  3);..        MD5
19040 53 54 45 50 28 46 34 2c 20 61 2c 20 62 2c 20 63  STEP(F4, a, b, c
19050 2c 20 64 2c 20 69 6e 5b 20 30 5d 2b 30 78 66 34  , d, in[ 0]+0xf4
19060 32 39 32 32 34 34 2c 20 20 36 29 3b 0a 20 20 20  292244,  6);.   
19070 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 34 2c       MD5STEP(F4,
19080 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e 5b   d, a, b, c, in[
19090 20 37 5d 2b 30 78 34 33 32 61 66 66 39 37 2c 20   7]+0x432aff97, 
190a0 31 30 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35  10);.        MD5
190b0 53 54 45 50 28 46 34 2c 20 63 2c 20 64 2c 20 61  STEP(F4, c, d, a
190c0 2c 20 62 2c 20 69 6e 5b 31 34 5d 2b 30 78 61 62  , b, in[14]+0xab
190d0 39 34 32 33 61 37 2c 20 31 35 29 3b 0a 20 20 20  9423a7, 15);.   
190e0 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 34 2c       MD5STEP(F4,
190f0 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e 5b   b, c, d, a, in[
19100 20 35 5d 2b 30 78 66 63 39 33 61 30 33 39 2c 20   5]+0xfc93a039, 
19110 32 31 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35  21);.        MD5
19120 53 54 45 50 28 46 34 2c 20 61 2c 20 62 2c 20 63  STEP(F4, a, b, c
19130 2c 20 64 2c 20 69 6e 5b 31 32 5d 2b 30 78 36 35  , d, in[12]+0x65
19140 35 62 35 39 63 33 2c 20 20 36 29 3b 0a 20 20 20  5b59c3,  6);.   
19150 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 34 2c       MD5STEP(F4,
19160 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e 5b   d, a, b, c, in[
19170 20 33 5d 2b 30 78 38 66 30 63 63 63 39 32 2c 20   3]+0x8f0ccc92, 
19180 31 30 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35  10);.        MD5
19190 53 54 45 50 28 46 34 2c 20 63 2c 20 64 2c 20 61  STEP(F4, c, d, a
191a0 2c 20 62 2c 20 69 6e 5b 31 30 5d 2b 30 78 66 66  , b, in[10]+0xff
191b0 65 66 66 34 37 64 2c 20 31 35 29 3b 0a 20 20 20  eff47d, 15);.   
191c0 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 34 2c       MD5STEP(F4,
191d0 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e 5b   b, c, d, a, in[
191e0 20 31 5d 2b 30 78 38 35 38 34 35 64 64 31 2c 20   1]+0x85845dd1, 
191f0 32 31 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35  21);.        MD5
19200 53 54 45 50 28 46 34 2c 20 61 2c 20 62 2c 20 63  STEP(F4, a, b, c
19210 2c 20 64 2c 20 69 6e 5b 20 38 5d 2b 30 78 36 66  , d, in[ 8]+0x6f
19220 61 38 37 65 34 66 2c 20 20 36 29 3b 0a 20 20 20  a87e4f,  6);.   
19230 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 34 2c       MD5STEP(F4,
19240 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e 5b   d, a, b, c, in[
19250 31 35 5d 2b 30 78 66 65 32 63 65 36 65 30 2c 20  15]+0xfe2ce6e0, 
19260 31 30 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35  10);.        MD5
19270 53 54 45 50 28 46 34 2c 20 63 2c 20 64 2c 20 61  STEP(F4, c, d, a
19280 2c 20 62 2c 20 69 6e 5b 20 36 5d 2b 30 78 61 33  , b, in[ 6]+0xa3
19290 30 31 34 33 31 34 2c 20 31 35 29 3b 0a 20 20 20  014314, 15);.   
192a0 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 34 2c       MD5STEP(F4,
192b0 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e 5b   b, c, d, a, in[
192c0 31 33 5d 2b 30 78 34 65 30 38 31 31 61 31 2c 20  13]+0x4e0811a1, 
192d0 32 31 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35  21);.        MD5
192e0 53 54 45 50 28 46 34 2c 20 61 2c 20 62 2c 20 63  STEP(F4, a, b, c
192f0 2c 20 64 2c 20 69 6e 5b 20 34 5d 2b 30 78 66 37  , d, in[ 4]+0xf7
19300 35 33 37 65 38 32 2c 20 20 36 29 3b 0a 20 20 20  537e82,  6);.   
19310 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 34 2c       MD5STEP(F4,
19320 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e 5b   d, a, b, c, in[
19330 31 31 5d 2b 30 78 62 64 33 61 66 32 33 35 2c 20  11]+0xbd3af235, 
19340 31 30 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35  10);.        MD5
19350 53 54 45 50 28 46 34 2c 20 63 2c 20 64 2c 20 61  STEP(F4, c, d, a
19360 2c 20 62 2c 20 69 6e 5b 20 32 5d 2b 30 78 32 61  , b, in[ 2]+0x2a
19370 64 37 64 32 62 62 2c 20 31 35 29 3b 0a 20 20 20  d7d2bb, 15);.   
19380 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 34 2c       MD5STEP(F4,
19390 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e 5b   b, c, d, a, in[
193a0 20 39 5d 2b 30 78 65 62 38 36 64 33 39 31 2c 20   9]+0xeb86d391, 
193b0 32 31 29 3b 0a 0a 20 20 20 20 20 20 20 20 62 75  21);..        bu
193c0 66 5b 30 5d 20 2b 3d 20 61 3b 0a 20 20 20 20 20  f[0] += a;.     
193d0 20 20 20 62 75 66 5b 31 5d 20 2b 3d 20 62 3b 0a     buf[1] += b;.
193e0 20 20 20 20 20 20 20 20 62 75 66 5b 32 5d 20 2b          buf[2] +
193f0 3d 20 63 3b 0a 20 20 20 20 20 20 20 20 62 75 66  = c;.        buf
19400 5b 33 5d 20 2b 3d 20 64 3b 0a 7d 0a 0a 2f 2a 0a  [3] += d;.}../*.
19410 20 2a 20 53 74 61 72 74 20 4d 44 35 20 61 63 63   * Start MD5 acc
19420 75 6d 75 6c 61 74 69 6f 6e 2e 20 20 53 65 74 20  umulation.  Set 
19430 62 69 74 20 63 6f 75 6e 74 20 74 6f 20 30 20 61  bit count to 0 a
19440 6e 64 20 62 75 66 66 65 72 20 74 6f 20 6d 79 73  nd buffer to mys
19450 74 65 72 69 6f 75 73 0a 20 2a 20 69 6e 69 74 69  terious. * initi
19460 61 6c 69 7a 61 74 69 6f 6e 20 63 6f 6e 73 74 61  alization consta
19470 6e 74 73 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20  nts.. */.static 
19480 76 6f 69 64 20 4d 44 35 49 6e 69 74 28 4d 44 35  void MD5Init(MD5
19490 43 6f 6e 74 65 78 74 20 2a 63 74 78 29 7b 0a 20  Context *ctx){. 
194a0 20 20 20 20 20 20 20 63 74 78 2d 3e 69 73 49 6e         ctx->isIn
194b0 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  it = 1;.        
194c0 63 74 78 2d 3e 62 75 66 5b 30 5d 20 3d 20 30 78  ctx->buf[0] = 0x
194d0 36 37 34 35 32 33 30 31 3b 0a 20 20 20 20 20 20  67452301;.      
194e0 20 20 63 74 78 2d 3e 62 75 66 5b 31 5d 20 3d 20    ctx->buf[1] = 
194f0 30 78 65 66 63 64 61 62 38 39 3b 0a 20 20 20 20  0xefcdab89;.    
19500 20 20 20 20 63 74 78 2d 3e 62 75 66 5b 32 5d 20      ctx->buf[2] 
19510 3d 20 30 78 39 38 62 61 64 63 66 65 3b 0a 20 20  = 0x98badcfe;.  
19520 20 20 20 20 20 20 63 74 78 2d 3e 62 75 66 5b 33        ctx->buf[3
19530 5d 20 3d 20 30 78 31 30 33 32 35 34 37 36 3b 0a  ] = 0x10325476;.
19540 20 20 20 20 20 20 20 20 63 74 78 2d 3e 62 69 74          ctx->bit
19550 73 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  s[0] = 0;.      
19560 20 20 63 74 78 2d 3e 62 69 74 73 5b 31 5d 20 3d    ctx->bits[1] =
19570 20 30 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 55 70 64   0;.}../*. * Upd
19580 61 74 65 20 63 6f 6e 74 65 78 74 20 74 6f 20 72  ate context to r
19590 65 66 6c 65 63 74 20 74 68 65 20 63 6f 6e 63 61  eflect the conca
195a0 74 65 6e 61 74 69 6f 6e 20 6f 66 20 61 6e 6f 74  tenation of anot
195b0 68 65 72 20 62 75 66 66 65 72 20 66 75 6c 6c 0a  her buffer full.
195c0 20 2a 20 6f 66 20 62 79 74 65 73 2e 0a 20 2a 2f   * of bytes.. */
195d0 0a 73 74 61 74 69 63 20 0a 76 6f 69 64 20 4d 44  .static .void MD
195e0 35 55 70 64 61 74 65 28 4d 44 35 43 6f 6e 74 65  5Update(MD5Conte
195f0 78 74 20 2a 63 74 78 2c 20 63 6f 6e 73 74 20 75  xt *ctx, const u
19600 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75  nsigned char *bu
19610 66 2c 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  f, unsigned int 
19620 6c 65 6e 29 7b 0a 20 20 20 20 20 20 20 20 75 69  len){.        ui
19630 6e 74 33 32 20 74 3b 0a 0a 20 20 20 20 20 20 20  nt32 t;..       
19640 20 2f 2a 20 55 70 64 61 74 65 20 62 69 74 63 6f   /* Update bitco
19650 75 6e 74 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20  unt */..        
19660 74 20 3d 20 63 74 78 2d 3e 62 69 74 73 5b 30 5d  t = ctx->bits[0]
19670 3b 0a 20 20 20 20 20 20 20 20 69 66 20 28 28 63  ;.        if ((c
19680 74 78 2d 3e 62 69 74 73 5b 30 5d 20 3d 20 74 20  tx->bits[0] = t 
19690 2b 20 28 28 75 69 6e 74 33 32 29 6c 65 6e 20 3c  + ((uint32)len <
196a0 3c 20 33 29 29 20 3c 20 74 29 0a 20 20 20 20 20  < 3)) < t).     
196b0 20 20 20 20 20 20 20 20 20 20 20 63 74 78 2d 3e             ctx->
196c0 62 69 74 73 5b 31 5d 2b 2b 3b 20 2f 2a 20 43 61  bits[1]++; /* Ca
196d0 72 72 79 20 66 72 6f 6d 20 6c 6f 77 20 74 6f 20  rry from low to 
196e0 68 69 67 68 20 2a 2f 0a 20 20 20 20 20 20 20 20  high */.        
196f0 63 74 78 2d 3e 62 69 74 73 5b 31 5d 20 2b 3d 20  ctx->bits[1] += 
19700 6c 65 6e 20 3e 3e 20 32 39 3b 0a 0a 20 20 20 20  len >> 29;..    
19710 20 20 20 20 74 20 3d 20 28 74 20 3e 3e 20 33 29      t = (t >> 3)
19720 20 26 20 30 78 33 66 3b 20 20 20 20 2f 2a 20 42   & 0x3f;    /* B
19730 79 74 65 73 20 61 6c 72 65 61 64 79 20 69 6e 20  ytes already in 
19740 73 68 73 49 6e 66 6f 2d 3e 64 61 74 61 20 2a 2f  shsInfo->data */
19750 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e  ..        /* Han
19760 64 6c 65 20 61 6e 79 20 6c 65 61 64 69 6e 67 20  dle any leading 
19770 6f 64 64 2d 73 69 7a 65 64 20 63 68 75 6e 6b 73  odd-sized chunks
19780 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 69 66 20   */..        if 
19790 28 20 74 20 29 20 7b 0a 20 20 20 20 20 20 20 20  ( t ) {.        
197a0 20 20 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64          unsigned
197b0 20 63 68 61 72 20 2a 70 20 3d 20 28 75 6e 73 69   char *p = (unsi
197c0 67 6e 65 64 20 63 68 61 72 20 2a 29 63 74 78 2d  gned char *)ctx-
197d0 3e 69 6e 20 2b 20 74 3b 0a 0a 20 20 20 20 20 20  >in + t;..      
197e0 20 20 20 20 20 20 20 20 20 20 74 20 3d 20 36 34            t = 64
197f0 2d 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  -t;.            
19800 20 20 20 20 69 66 20 28 6c 65 6e 20 3c 20 74 29      if (len < t)
19810 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
19820 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70             memcp
19830 79 28 70 2c 20 62 75 66 2c 20 6c 65 6e 29 3b 0a  y(p, buf, len);.
19840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19850 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a          return;.
19860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19870 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
19880 20 20 6d 65 6d 63 70 79 28 70 2c 20 62 75 66 2c    memcpy(p, buf,
19890 20 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   t);.           
198a0 20 20 20 20 20 62 79 74 65 52 65 76 65 72 73 65       byteReverse
198b0 28 63 74 78 2d 3e 69 6e 2c 20 31 36 29 3b 0a 20  (ctx->in, 16);. 
198c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4d                 M
198d0 44 35 54 72 61 6e 73 66 6f 72 6d 28 63 74 78 2d  D5Transform(ctx-
198e0 3e 62 75 66 2c 20 28 75 69 6e 74 33 32 20 2a 29  >buf, (uint32 *)
198f0 63 74 78 2d 3e 69 6e 29 3b 0a 20 20 20 20 20 20  ctx->in);.      
19900 20 20 20 20 20 20 20 20 20 20 62 75 66 20 2b 3d            buf +=
19910 20 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   t;.            
19920 20 20 20 20 6c 65 6e 20 2d 3d 20 74 3b 0a 20 20      len -= t;.  
19930 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
19940 20 2f 2a 20 50 72 6f 63 65 73 73 20 64 61 74 61   /* Process data
19950 20 69 6e 20 36 34 2d 62 79 74 65 20 63 68 75 6e   in 64-byte chun
19960 6b 73 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 77  ks */..        w
19970 68 69 6c 65 20 28 6c 65 6e 20 3e 3d 20 36 34 29  hile (len >= 64)
19980 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
19990 20 20 20 6d 65 6d 63 70 79 28 63 74 78 2d 3e 69     memcpy(ctx->i
199a0 6e 2c 20 62 75 66 2c 20 36 34 29 3b 0a 20 20 20  n, buf, 64);.   
199b0 20 20 20 20 20 20 20 20 20 20 20 20 20 62 79 74               byt
199c0 65 52 65 76 65 72 73 65 28 63 74 78 2d 3e 69 6e  eReverse(ctx->in
199d0 2c 20 31 36 29 3b 0a 20 20 20 20 20 20 20 20 20  , 16);.         
199e0 20 20 20 20 20 20 20 4d 44 35 54 72 61 6e 73 66         MD5Transf
199f0 6f 72 6d 28 63 74 78 2d 3e 62 75 66 2c 20 28 75  orm(ctx->buf, (u
19a00 69 6e 74 33 32 20 2a 29 63 74 78 2d 3e 69 6e 29  int32 *)ctx->in)
19a10 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
19a20 20 20 62 75 66 20 2b 3d 20 36 34 3b 0a 20 20 20    buf += 64;.   
19a30 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 65 6e               len
19a40 20 2d 3d 20 36 34 3b 0a 20 20 20 20 20 20 20 20   -= 64;.        
19a50 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 48 61  }..        /* Ha
19a60 6e 64 6c 65 20 61 6e 79 20 72 65 6d 61 69 6e 69  ndle any remaini
19a70 6e 67 20 62 79 74 65 73 20 6f 66 20 64 61 74 61  ng bytes of data
19a80 2e 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 6d 65  . */..        me
19a90 6d 63 70 79 28 63 74 78 2d 3e 69 6e 2c 20 62 75  mcpy(ctx->in, bu
19aa0 66 2c 20 6c 65 6e 29 3b 0a 7d 0a 0a 2f 2a 0a 20  f, len);.}../*. 
19ab0 2a 20 46 69 6e 61 6c 20 77 72 61 70 75 70 20 2d  * Final wrapup -
19ac0 20 70 61 64 20 74 6f 20 36 34 2d 62 79 74 65 20   pad to 64-byte 
19ad0 62 6f 75 6e 64 61 72 79 20 77 69 74 68 20 74 68  boundary with th
19ae0 65 20 62 69 74 20 70 61 74 74 65 72 6e 20 0a 20  e bit pattern . 
19af0 2a 20 31 20 30 2a 20 28 36 34 2d 62 69 74 20 63  * 1 0* (64-bit c
19b00 6f 75 6e 74 20 6f 66 20 62 69 74 73 20 70 72 6f  ount of bits pro
19b10 63 65 73 73 65 64 2c 20 4d 53 42 2d 66 69 72 73  cessed, MSB-firs
19b20 74 29 0a 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f  t). */.static vo
19b30 69 64 20 4d 44 35 46 69 6e 61 6c 28 75 6e 73 69  id MD5Final(unsi
19b40 67 6e 65 64 20 63 68 61 72 20 64 69 67 65 73 74  gned char digest
19b50 5b 31 36 5d 2c 20 4d 44 35 43 6f 6e 74 65 78 74  [16], MD5Context
19b60 20 2a 63 74 78 29 7b 0a 20 20 20 20 20 20 20 20   *ctx){.        
19b70 75 6e 73 69 67 6e 65 64 20 63 6f 75 6e 74 3b 0a  unsigned count;.
19b80 20 20 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64          unsigned
19b90 20 63 68 61 72 20 2a 70 3b 0a 0a 20 20 20 20 20   char *p;..     
19ba0 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 6e 75     /* Compute nu
19bb0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6d 6f  mber of bytes mo
19bc0 64 20 36 34 20 2a 2f 0a 20 20 20 20 20 20 20 20  d 64 */.        
19bd0 63 6f 75 6e 74 20 3d 20 28 63 74 78 2d 3e 62 69  count = (ctx->bi
19be0 74 73 5b 30 5d 20 3e 3e 20 33 29 20 26 20 30 78  ts[0] >> 3) & 0x
19bf0 33 46 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20  3F;..        /* 
19c00 53 65 74 20 74 68 65 20 66 69 72 73 74 20 63 68  Set the first ch
19c10 61 72 20 6f 66 20 70 61 64 64 69 6e 67 20 74 6f  ar of padding to
19c20 20 30 78 38 30 2e 20 20 54 68 69 73 20 69 73 20   0x80.  This is 
19c30 73 61 66 65 20 73 69 6e 63 65 20 74 68 65 72 65  safe since there
19c40 20 69 73 0a 20 20 20 20 20 20 20 20 20 20 20 61   is.           a
19c50 6c 77 61 79 73 20 61 74 20 6c 65 61 73 74 20 6f  lways at least o
19c60 6e 65 20 62 79 74 65 20 66 72 65 65 20 2a 2f 0a  ne byte free */.
19c70 20 20 20 20 20 20 20 20 70 20 3d 20 63 74 78 2d          p = ctx-
19c80 3e 69 6e 20 2b 20 63 6f 75 6e 74 3b 0a 20 20 20  >in + count;.   
19c90 20 20 20 20 20 2a 70 2b 2b 20 3d 20 30 78 38 30       *p++ = 0x80
19ca0 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 42 79  ;..        /* By
19cb0 74 65 73 20 6f 66 20 70 61 64 64 69 6e 67 20 6e  tes of padding n
19cc0 65 65 64 65 64 20 74 6f 20 6d 61 6b 65 20 36 34  eeded to make 64
19cd0 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 20 20   bytes */.      
19ce0 20 20 63 6f 75 6e 74 20 3d 20 36 34 20 2d 20 31    count = 64 - 1
19cf0 20 2d 20 63 6f 75 6e 74 3b 0a 0a 20 20 20 20 20   - count;..     
19d00 20 20 20 2f 2a 20 50 61 64 20 6f 75 74 20 74 6f     /* Pad out to
19d10 20 35 36 20 6d 6f 64 20 36 34 20 2a 2f 0a 20 20   56 mod 64 */.  
19d20 20 20 20 20 20 20 69 66 20 28 63 6f 75 6e 74 20        if (count 
19d30 3c 20 38 29 20 7b 0a 20 20 20 20 20 20 20 20 20  < 8) {.         
19d40 20 20 20 20 20 20 20 2f 2a 20 54 77 6f 20 6c 6f         /* Two lo
19d50 74 73 20 6f 66 20 70 61 64 64 69 6e 67 3a 20 20  ts of padding:  
19d60 50 61 64 20 74 68 65 20 66 69 72 73 74 20 62 6c  Pad the first bl
19d70 6f 63 6b 20 74 6f 20 36 34 20 62 79 74 65 73 20  ock to 64 bytes 
19d80 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
19d90 20 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20     memset(p, 0, 
19da0 63 6f 75 6e 74 29 3b 0a 20 20 20 20 20 20 20 20  count);.        
19db0 20 20 20 20 20 20 20 20 62 79 74 65 52 65 76 65          byteReve
19dc0 72 73 65 28 63 74 78 2d 3e 69 6e 2c 20 31 36 29  rse(ctx->in, 16)
19dd0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
19de0 20 20 4d 44 35 54 72 61 6e 73 66 6f 72 6d 28 63    MD5Transform(c
19df0 74 78 2d 3e 62 75 66 2c 20 28 75 69 6e 74 33 32  tx->buf, (uint32
19e00 20 2a 29 63 74 78 2d 3e 69 6e 29 3b 0a 0a 20 20   *)ctx->in);..  
19e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
19e20 20 4e 6f 77 20 66 69 6c 6c 20 74 68 65 20 6e 65   Now fill the ne
19e30 78 74 20 62 6c 6f 63 6b 20 77 69 74 68 20 35 36  xt block with 56
19e40 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 20 20   bytes */.      
19e50 20 20 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74            memset
19e60 28 63 74 78 2d 3e 69 6e 2c 20 30 2c 20 35 36 29  (ctx->in, 0, 56)
19e70 3b 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65  ;.        } else
19e80 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
19e90 20 20 20 2f 2a 20 50 61 64 20 62 6c 6f 63 6b 20     /* Pad block 
19ea0 74 6f 20 35 36 20 62 79 74 65 73 20 2a 2f 0a 20  to 56 bytes */. 
19eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d                 m
19ec0 65 6d 73 65 74 28 70 2c 20 30 2c 20 63 6f 75 6e  emset(p, 0, coun
19ed0 74 2d 38 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  t-8);.        }.
19ee0 20 20 20 20 20 20 20 20 62 79 74 65 52 65 76 65          byteReve
19ef0 72 73 65 28 63 74 78 2d 3e 69 6e 2c 20 31 34 29  rse(ctx->in, 14)
19f00 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 70  ;..        /* Ap
19f10 70 65 6e 64 20 6c 65 6e 67 74 68 20 69 6e 20 62  pend length in b
19f20 69 74 73 20 61 6e 64 20 74 72 61 6e 73 66 6f 72  its and transfor
19f30 6d 20 2a 2f 0a 20 20 20 20 20 20 20 20 28 28 75  m */.        ((u
19f40 69 6e 74 33 32 20 2a 29 63 74 78 2d 3e 69 6e 29  int32 *)ctx->in)
19f50 5b 20 31 34 20 5d 20 3d 20 63 74 78 2d 3e 62 69  [ 14 ] = ctx->bi
19f60 74 73 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20 28  ts[0];.        (
19f70 28 75 69 6e 74 33 32 20 2a 29 63 74 78 2d 3e 69  (uint32 *)ctx->i
19f80 6e 29 5b 20 31 35 20 5d 20 3d 20 63 74 78 2d 3e  n)[ 15 ] = ctx->
19f90 62 69 74 73 5b 31 5d 3b 0a 0a 20 20 20 20 20 20  bits[1];..      
19fa0 20 20 4d 44 35 54 72 61 6e 73 66 6f 72 6d 28 63    MD5Transform(c
19fb0 74 78 2d 3e 62 75 66 2c 20 28 75 69 6e 74 33 32  tx->buf, (uint32
19fc0 20 2a 29 63 74 78 2d 3e 69 6e 29 3b 0a 20 20 20   *)ctx->in);.   
19fd0 20 20 20 20 20 62 79 74 65 52 65 76 65 72 73 65       byteReverse
19fe0 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  ((unsigned char 
19ff0 2a 29 63 74 78 2d 3e 62 75 66 2c 20 34 29 3b 0a  *)ctx->buf, 4);.
1a000 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 64          memcpy(d
1a010 69 67 65 73 74 2c 20 63 74 78 2d 3e 62 75 66 2c  igest, ctx->buf,
1a020 20 31 36 29 3b 0a 20 20 20 20 20 20 20 20 6d 65   16);.        me
1a030 6d 73 65 74 28 63 74 78 2c 20 30 2c 20 73 69 7a  mset(ctx, 0, siz
1a040 65 6f 66 28 63 74 78 29 29 3b 20 20 20 20 2f 2a  eof(ctx));    /*
1a050 20 49 6e 20 63 61 73 65 20 69 74 20 69 73 20 73   In case it is s
1a060 65 6e 73 69 74 69 76 65 20 2a 2f 0a 7d 0a 0a 2f  ensitive */.}../
1a070 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 31  *.** Convert a 1
1a080 32 38 2d 62 69 74 20 4d 44 35 20 64 69 67 65 73  28-bit MD5 diges
1a090 74 20 69 6e 74 6f 20 61 20 33 32 2d 64 69 67 69  t into a 32-digi
1a0a0 74 20 62 61 73 65 2d 31 36 20 6e 75 6d 62 65 72  t base-16 number
1a0b0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1a0c0 20 4d 44 35 44 69 67 65 73 74 54 6f 42 61 73 65   MD5DigestToBase
1a0d0 31 36 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  16(unsigned char
1a0e0 20 2a 64 69 67 65 73 74 2c 20 63 68 61 72 20 2a   *digest, char *
1a0f0 7a 42 75 66 29 7b 0a 20 20 73 74 61 74 69 63 20  zBuf){.  static 
1a100 63 68 61 72 20 63 6f 6e 73 74 20 7a 45 6e 63 6f  char const zEnco
1a110 64 65 5b 5d 20 3d 20 22 30 31 32 33 34 35 36 37  de[] = "01234567
1a120 38 39 61 62 63 64 65 66 22 3b 0a 20 20 69 6e 74  89abcdef";.  int
1a130 20 69 2c 20 6a 3b 0a 0a 20 20 66 6f 72 28 6a 3d   i, j;..  for(j=
1a140 69 3d 30 3b 20 69 3c 31 36 3b 20 69 2b 2b 29 7b  i=0; i<16; i++){
1a150 0a 20 20 20 20 69 6e 74 20 61 20 3d 20 64 69 67  .    int a = dig
1a160 65 73 74 5b 69 5d 3b 0a 20 20 20 20 7a 42 75 66  est[i];.    zBuf
1a170 5b 6a 2b 2b 5d 20 3d 20 7a 45 6e 63 6f 64 65 5b  [j++] = zEncode[
1a180 28 61 3e 3e 34 29 26 30 78 66 5d 3b 0a 20 20 20  (a>>4)&0xf];.   
1a190 20 7a 42 75 66 5b 6a 2b 2b 5d 20 3d 20 7a 45 6e   zBuf[j++] = zEn
1a1a0 63 6f 64 65 5b 61 20 26 20 30 78 66 5d 3b 0a 20  code[a & 0xf];. 
1a1b0 20 7d 0a 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 30   }.  zBuf[j] = 0
1a1c0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76  ;.}.../*.** Conv
1a1d0 65 72 74 20 61 20 31 32 38 2d 62 69 74 20 4d 44  ert a 128-bit MD
1a1e0 35 20 64 69 67 65 73 74 20 69 6e 74 6f 20 73 65  5 digest into se
1a1f0 71 75 65 6e 63 79 20 6f 66 20 65 69 67 68 74 20  quency of eight 
1a200 35 2d 64 69 67 69 74 20 69 6e 74 65 67 65 72 73  5-digit integers
1a210 0a 2a 2a 20 65 61 63 68 20 72 65 70 72 65 73 65  .** each represe
1a220 6e 74 69 6e 67 20 31 36 20 62 69 74 73 20 6f 66  nting 16 bits of
1a230 20 74 68 65 20 64 69 67 65 73 74 20 61 6e 64 20   the digest and 
1a240 73 65 70 61 72 61 74 65 64 20 66 72 6f 6d 20 65  separated from e
1a250 61 63 68 0a 2a 2a 20 6f 74 68 65 72 20 62 79 20  ach.** other by 
1a260 61 20 22 2d 22 20 63 68 61 72 61 63 74 65 72 2e  a "-" character.
1a270 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1a280 4d 44 35 44 69 67 65 73 74 54 6f 42 61 73 65 31  MD5DigestToBase1
1a290 30 78 38 28 75 6e 73 69 67 6e 65 64 20 63 68 61  0x8(unsigned cha
1a2a0 72 20 64 69 67 65 73 74 5b 31 36 5d 2c 20 63 68  r digest[16], ch
1a2b0 61 72 20 7a 44 69 67 65 73 74 5b 35 30 5d 29 7b  ar zDigest[50]){
1a2c0 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 75  .  int i, j;.  u
1a2d0 6e 73 69 67 6e 65 64 20 69 6e 74 20 78 3b 0a 20  nsigned int x;. 
1a2e0 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 31 36   for(i=j=0; i<16
1a2f0 3b 20 69 2b 3d 32 29 7b 0a 20 20 20 20 78 20 3d  ; i+=2){.    x =
1a300 20 64 69 67 65 73 74 5b 69 5d 2a 32 35 36 20 2b   digest[i]*256 +
1a310 20 64 69 67 65 73 74 5b 69 2b 31 5d 3b 0a 20 20   digest[i+1];.  
1a320 20 20 69 66 28 20 69 3e 30 20 29 20 7a 44 69 67    if( i>0 ) zDig
1a330 65 73 74 5b 6a 2b 2b 5d 20 3d 20 27 2d 27 3b 0a  est[j++] = '-';.
1a340 20 20 20 20 73 70 72 69 6e 74 66 28 26 7a 44 69      sprintf(&zDi
1a350 67 65 73 74 5b 6a 5d 2c 20 22 25 30 35 75 22 2c  gest[j], "%05u",
1a360 20 78 29 3b 0a 20 20 20 20 6a 20 2b 3d 20 35 3b   x);.    j += 5;
1a370 0a 20 20 7d 0a 20 20 7a 44 69 67 65 73 74 5b 6a  .  }.  zDigest[j
1a380 5d 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ] = 0;.}../*.** 
1a390 41 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20 66 6f  A TCL command fo
1a3a0 72 20 6d 64 35 2e 20 20 54 68 65 20 61 72 67 75  r md5.  The argu
1a3b0 6d 65 6e 74 20 69 73 20 74 68 65 20 74 65 78 74  ment is the text
1a3c0 20 74 6f 20 62 65 20 68 61 73 68 65 64 2e 20 20   to be hashed.  
1a3d0 54 68 65 0a 2a 2a 20 52 65 73 75 6c 74 20 69 73  The.** Result is
1a3e0 20 74 68 65 20 68 61 73 68 20 69 6e 20 62 61 73   the hash in bas
1a3f0 65 36 34 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63  e64.  .*/.static
1a400 20 69 6e 74 20 6d 64 35 5f 63 6d 64 28 76 6f 69   int md5_cmd(voi
1a410 64 2a 63 64 2c 20 54 63 6c 5f 49 6e 74 65 72 70  d*cd, Tcl_Interp
1a420 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 61 72   *interp, int ar
1a430 67 63 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  gc, const char *
1a440 2a 61 72 67 76 29 7b 0a 20 20 4d 44 35 43 6f 6e  *argv){.  MD5Con
1a450 74 65 78 74 20 63 74 78 3b 0a 20 20 75 6e 73 69  text ctx;.  unsi
1a460 67 6e 65 64 20 63 68 61 72 20 64 69 67 65 73 74  gned char digest
1a470 5b 31 36 5d 3b 0a 20 20 63 68 61 72 20 7a 42 75  [16];.  char zBu
1a480 66 5b 35 30 5d 3b 0a 20 20 76 6f 69 64 20 28 2a  f[50];.  void (*
1a490 63 6f 6e 76 65 72 74 65 72 29 28 75 6e 73 69 67  converter)(unsig
1a4a0 6e 65 64 20 63 68 61 72 2a 2c 20 63 68 61 72 2a  ned char*, char*
1a4b0 29 3b 0a 0a 20 20 69 66 28 20 61 72 67 63 21 3d  );..  if( argc!=
1a4c0 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  2 ){.    Tcl_App
1a4d0 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
1a4e0 2c 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20  ,"wrong # args: 
1a4f0 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61  should be \"", a
1a500 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20  rgv[0], .       
1a510 20 22 20 54 45 58 54 5c 22 22 2c 20 30 29 3b 0a   " TEXT\"", 0);.
1a520 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
1a530 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 4d 44 35 49  RROR;.  }.  MD5I
1a540 6e 69 74 28 26 63 74 78 29 3b 0a 20 20 4d 44 35  nit(&ctx);.  MD5
1a550 55 70 64 61 74 65 28 26 63 74 78 2c 20 28 75 6e  Update(&ctx, (un
1a560 73 69 67 6e 65 64 20 63 68 61 72 2a 29 61 72 67  signed char*)arg
1a570 76 5b 31 5d 2c 20 28 75 6e 73 69 67 6e 65 64 29  v[1], (unsigned)
1a580 73 74 72 6c 65 6e 28 61 72 67 76 5b 31 5d 29 29  strlen(argv[1]))
1a590 3b 0a 20 20 4d 44 35 46 69 6e 61 6c 28 64 69 67  ;.  MD5Final(dig
1a5a0 65 73 74 2c 20 26 63 74 78 29 3b 0a 20 20 63 6f  est, &ctx);.  co
1a5b0 6e 76 65 72 74 65 72 20 3d 20 28 76 6f 69 64 28  nverter = (void(
1a5c0 2a 29 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  *)(unsigned char
1a5d0 2a 2c 63 68 61 72 2a 29 29 63 64 3b 0a 20 20 63  *,char*))cd;.  c
1a5e0 6f 6e 76 65 72 74 65 72 28 64 69 67 65 73 74 2c  onverter(digest,
1a5f0 20 7a 42 75 66 29 3b 0a 20 20 54 63 6c 5f 41 70   zBuf);.  Tcl_Ap
1a600 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
1a610 70 2c 20 7a 42 75 66 2c 20 28 63 68 61 72 2a 29  p, zBuf, (char*)
1a620 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  0);.  return TCL
1a630 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20  _OK;.}../*.** A 
1a640 54 43 4c 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 74  TCL command to t
1a650 61 6b 65 20 74 68 65 20 6d 64 35 20 68 61 73 68  ake the md5 hash
1a660 20 6f 66 20 61 20 66 69 6c 65 2e 20 20 54 68 65   of a file.  The
1a670 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65   argument is the
1a680 0a 2a 2a 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  .** name of the 
1a690 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
1a6a0 69 6e 74 20 6d 64 35 66 69 6c 65 5f 63 6d 64 28  int md5file_cmd(
1a6b0 76 6f 69 64 2a 63 64 2c 20 54 63 6c 5f 49 6e 74  void*cd, Tcl_Int
1a6c0 65 72 70 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20  erp*interp, int 
1a6d0 61 72 67 63 2c 20 63 6f 6e 73 74 20 63 68 61 72  argc, const char
1a6e0 20 2a 2a 61 72 67 76 29 7b 0a 20 20 46 49 4c 45   **argv){.  FILE
1a6f0 20 2a 69 6e 3b 0a 20 20 4d 44 35 43 6f 6e 74 65   *in;.  MD5Conte
1a700 78 74 20 63 74 78 3b 0a 20 20 76 6f 69 64 20 28  xt ctx;.  void (
1a710 2a 63 6f 6e 76 65 72 74 65 72 29 28 75 6e 73 69  *converter)(unsi
1a720 67 6e 65 64 20 63 68 61 72 2a 2c 20 63 68 61 72  gned char*, char
1a730 2a 29 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  *);.  unsigned c
1a740 68 61 72 20 64 69 67 65 73 74 5b 31 36 5d 3b 0a  har digest[16];.
1a750 20 20 63 68 61 72 20 7a 42 75 66 5b 31 30 32 34    char zBuf[1024
1a760 30 5d 3b 0a 0a 20 20 69 66 28 20 61 72 67 63 21  0];..  if( argc!
1a770 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =2 ){.    Tcl_Ap
1a780 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
1a790 70 2c 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  p,"wrong # args:
1a7a0 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
1a7b0 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20  argv[0], .      
1a7c0 20 20 22 20 46 49 4c 45 4e 41 4d 45 5c 22 22 2c    " FILENAME\"",
1a7d0 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
1a7e0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
1a7f0 20 69 6e 20 3d 20 66 6f 70 65 6e 28 61 72 67 76   in = fopen(argv
1a800 5b 31 5d 2c 22 72 62 22 29 3b 0a 20 20 69 66 28  [1],"rb");.  if(
1a810 20 69 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 54 63   in==0 ){.    Tc
1a820 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
1a830 6e 74 65 72 70 2c 22 75 6e 61 62 6c 65 20 74 6f  nterp,"unable to
1a840 20 6f 70 65 6e 20 66 69 6c 65 20 5c 22 22 2c 20   open file \"", 
1a850 61 72 67 76 5b 31 5d 2c 20 0a 20 20 20 20 20 20  argv[1], .      
1a860 20 20 20 22 5c 22 20 66 6f 72 20 72 65 61 64 69     "\" for readi
1a870 6e 67 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  ng", 0);.    ret
1a880 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1a890 20 7d 0a 20 20 4d 44 35 49 6e 69 74 28 26 63 74   }.  MD5Init(&ct
1a8a0 78 29 3b 0a 20 20 66 6f 72 28 3b 3b 29 7b 0a 20  x);.  for(;;){. 
1a8b0 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 6e 20     int n;.    n 
1a8c0 3d 20 66 72 65 61 64 28 7a 42 75 66 2c 20 31 2c  = fread(zBuf, 1,
1a8d0 20 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c 20 69   sizeof(zBuf), i
1a8e0 6e 29 3b 0a 20 20 20 20 69 66 28 20 6e 3c 3d 30  n);.    if( n<=0
1a8f0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 4d 44   ) break;.    MD
1a900 35 55 70 64 61 74 65 28 26 63 74 78 2c 20 28 75  5Update(&ctx, (u
1a910 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 7a 42  nsigned char*)zB
1a920 75 66 2c 20 28 75 6e 73 69 67 6e 65 64 29 6e 29  uf, (unsigned)n)
1a930 3b 0a 20 20 7d 0a 20 20 66 63 6c 6f 73 65 28 69  ;.  }.  fclose(i
1a940 6e 29 3b 0a 20 20 4d 44 35 46 69 6e 61 6c 28 64  n);.  MD5Final(d
1a950 69 67 65 73 74 2c 20 26 63 74 78 29 3b 0a 20 20  igest, &ctx);.  
1a960 63 6f 6e 76 65 72 74 65 72 20 3d 20 28 76 6f 69  converter = (voi
1a970 64 28 2a 29 28 75 6e 73 69 67 6e 65 64 20 63 68  d(*)(unsigned ch
1a980 61 72 2a 2c 63 68 61 72 2a 29 29 63 64 3b 0a 20  ar*,char*))cd;. 
1a990 20 63 6f 6e 76 65 72 74 65 72 28 64 69 67 65 73   converter(diges
1a9a0 74 2c 20 7a 42 75 66 29 3b 0a 20 20 54 63 6c 5f  t, zBuf);.  Tcl_
1a9b0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
1a9c0 65 72 70 2c 20 7a 42 75 66 2c 20 28 63 68 61 72  erp, zBuf, (char
1a9d0 2a 29 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  *)0);.  return T
1a9e0 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
1a9f0 52 65 67 69 73 74 65 72 20 74 68 65 20 66 6f 75  Register the fou
1aa00 72 20 6e 65 77 20 54 43 4c 20 63 6f 6d 6d 61 6e  r new TCL comman
1aa10 64 73 20 66 6f 72 20 67 65 6e 65 72 61 74 69 6e  ds for generatin
1aa20 67 20 4d 44 35 20 63 68 65 63 6b 73 75 6d 73 0a  g MD5 checksums.
1aa30 2a 2a 20 77 69 74 68 20 74 68 65 20 54 43 4c 20  ** with the TCL 
1aa40 69 6e 74 65 72 70 72 65 74 65 72 2e 0a 2a 2f 0a  interpreter..*/.
1aa50 69 6e 74 20 4d 64 35 5f 49 6e 69 74 28 54 63 6c  int Md5_Init(Tcl
1aa60 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29  _Interp *interp)
1aa70 7b 0a 20 20 54 63 6c 5f 43 72 65 61 74 65 43 6f  {.  Tcl_CreateCo
1aa80 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 6d  mmand(interp, "m
1aa90 64 35 22 2c 20 28 54 63 6c 5f 43 6d 64 50 72 6f  d5", (Tcl_CmdPro
1aaa0 63 2a 29 6d 64 35 5f 63 6d 64 2c 0a 20 20 20 20  c*)md5_cmd,.    
1aab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aac0 4d 44 35 44 69 67 65 73 74 54 6f 42 61 73 65 31  MD5DigestToBase1
1aad0 36 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 43 72 65  6, 0);.  Tcl_Cre
1aae0 61 74 65 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72  ateCommand(inter
1aaf0 70 2c 20 22 6d 64 35 2d 31 30 78 38 22 2c 20 28  p, "md5-10x8", (
1ab00 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 6d 64 35  Tcl_CmdProc*)md5
1ab10 5f 63 6d 64 2c 0a 20 20 20 20 20 20 20 20 20 20  _cmd,.          
1ab20 20 20 20 20 20 20 20 20 20 20 4d 44 35 44 69 67            MD5Dig
1ab30 65 73 74 54 6f 42 61 73 65 31 30 78 38 2c 20 30  estToBase10x8, 0
1ab40 29 3b 0a 20 20 54 63 6c 5f 43 72 65 61 74 65 43  );.  Tcl_CreateC
1ab50 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22  ommand(interp, "
1ab60 6d 64 35 66 69 6c 65 22 2c 20 28 54 63 6c 5f 43  md5file", (Tcl_C
1ab70 6d 64 50 72 6f 63 2a 29 6d 64 35 66 69 6c 65 5f  mdProc*)md5file_
1ab80 63 6d 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20  cmd,.           
1ab90 20 20 20 20 20 20 20 20 20 4d 44 35 44 69 67 65           MD5Dige
1aba0 73 74 54 6f 42 61 73 65 31 36 2c 20 30 29 3b 0a  stToBase16, 0);.
1abb0 20 20 54 63 6c 5f 43 72 65 61 74 65 43 6f 6d 6d    Tcl_CreateComm
1abc0 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 6d 64 35  and(interp, "md5
1abd0 66 69 6c 65 2d 31 30 78 38 22 2c 20 28 54 63 6c  file-10x8", (Tcl
1abe0 5f 43 6d 64 50 72 6f 63 2a 29 6d 64 35 66 69 6c  _CmdProc*)md5fil
1abf0 65 5f 63 6d 64 2c 0a 20 20 20 20 20 20 20 20 20  e_cmd,.         
1ac00 20 20 20 20 20 20 20 20 20 20 20 4d 44 35 44 69             MD5Di
1ac10 67 65 73 74 54 6f 42 61 73 65 31 30 78 38 2c 20  gestToBase10x8, 
1ac20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  0);.  return TCL
1ac30 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  _OK;.}.#endif /*
1ac40 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
1ac50 54 45 53 54 29 20 7c 7c 20 64 65 66 69 6e 65 64  TEST) || defined
1ac60 28 53 51 4c 49 54 45 5f 54 43 4c 4d 44 35 29 20  (SQLITE_TCLMD5) 
1ac70 2a 2f 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  */..#if defined(
1ac80 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 2f 2a 0a  SQLITE_TEST)./*.
1ac90 2a 2a 20 44 75 72 69 6e 67 20 74 65 73 74 69 6e  ** During testin
1aca0 67 2c 20 74 68 65 20 73 70 65 63 69 61 6c 20 6d  g, the special m
1acb0 64 35 73 75 6d 28 29 20 61 67 67 72 65 67 61 74  d5sum() aggregat
1acc0 65 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 76  e function is av
1acd0 61 69 6c 61 62 6c 65 2e 0a 2a 2a 20 69 6e 73 69  ailable..** insi
1ace0 64 65 20 53 51 4c 69 74 65 2e 20 20 54 68 65 20  de SQLite.  The 
1acf0 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e  following routin
1ad00 65 73 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 61  es implement tha
1ad10 74 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  t function..*/.s
1ad20 74 61 74 69 63 20 76 6f 69 64 20 6d 64 35 73 74  tatic void md5st
1ad30 65 70 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  ep(sqlite3_conte
1ad40 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 69 6e 74  xt *context, int
1ad50 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76   argc, sqlite3_v
1ad60 61 6c 75 65 20 2a 2a 61 72 67 76 29 7b 0a 20 20  alue **argv){.  
1ad70 4d 44 35 43 6f 6e 74 65 78 74 20 2a 70 3b 0a 20  MD5Context *p;. 
1ad80 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 61 72   int i;.  if( ar
1ad90 67 63 3c 31 20 29 20 72 65 74 75 72 6e 3b 0a 20  gc<1 ) return;. 
1ada0 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 61 67 67   p = sqlite3_agg
1adb0 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 63  regate_context(c
1adc0 6f 6e 74 65 78 74 2c 20 73 69 7a 65 6f 66 28 2a  ontext, sizeof(*
1add0 70 29 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  p));.  if( p==0 
1ade0 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
1adf0 21 70 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20  !p->isInit ){.  
1ae00 20 20 4d 44 35 49 6e 69 74 28 70 29 3b 0a 20 20    MD5Init(p);.  
1ae10 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61  }.  for(i=0; i<a
1ae20 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63  rgc; i++){.    c
1ae30 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 61 74 61  onst char *zData
1ae40 20 3d 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65   = (char*)sqlite
1ae50 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
1ae60 76 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28 20 7a  v[i]);.    if( z
1ae70 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 4d 44  Data ){.      MD
1ae80 35 55 70 64 61 74 65 28 70 2c 20 28 75 6e 73 69  5Update(p, (unsi
1ae90 67 6e 65 64 20 63 68 61 72 2a 29 7a 44 61 74 61  gned char*)zData
1aea0 2c 20 73 74 72 6c 65 6e 28 7a 44 61 74 61 29 29  , strlen(zData))
1aeb0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74  ;.    }.  }.}.st
1aec0 61 74 69 63 20 76 6f 69 64 20 6d 64 35 66 69 6e  atic void md5fin
1aed0 61 6c 69 7a 65 28 73 71 6c 69 74 65 33 5f 63 6f  alize(sqlite3_co
1aee0 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 29 7b  ntext *context){
1aef0 0a 20 20 4d 44 35 43 6f 6e 74 65 78 74 20 2a 70  .  MD5Context *p
1af00 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
1af10 72 20 64 69 67 65 73 74 5b 31 36 5d 3b 0a 20 20  r digest[16];.  
1af20 63 68 61 72 20 7a 42 75 66 5b 33 33 5d 3b 0a 20  char zBuf[33];. 
1af30 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 61 67 67   p = sqlite3_agg
1af40 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 63  regate_context(c
1af50 6f 6e 74 65 78 74 2c 20 73 69 7a 65 6f 66 28 2a  ontext, sizeof(*
1af60 70 29 29 3b 0a 20 20 4d 44 35 46 69 6e 61 6c 28  p));.  MD5Final(
1af70 64 69 67 65 73 74 2c 70 29 3b 0a 20 20 4d 44 35  digest,p);.  MD5
1af80 44 69 67 65 73 74 54 6f 42 61 73 65 31 36 28 64  DigestToBase16(d
1af90 69 67 65 73 74 2c 20 7a 42 75 66 29 3b 0a 20 20  igest, zBuf);.  
1afa0 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74  sqlite3_result_t
1afb0 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 7a 42 75  ext(context, zBu
1afc0 66 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52  f, -1, SQLITE_TR
1afd0 41 4e 53 49 45 4e 54 29 3b 0a 7d 0a 69 6e 74 20  ANSIENT);.}.int 
1afe0 4d 64 35 5f 52 65 67 69 73 74 65 72 28 73 71 6c  Md5_Register(sql
1aff0 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74  ite3 *db){.  int
1b000 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72   rc = sqlite3_cr
1b010 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62  eate_function(db
1b020 2c 20 22 6d 64 35 73 75 6d 22 2c 20 2d 31 2c 20  , "md5sum", -1, 
1b030 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20  SQLITE_UTF8, 0, 
1b040 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  0, .            
1b050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b060 20 20 20 20 20 6d 64 35 73 74 65 70 2c 20 6d 64       md5step, md
1b070 35 66 69 6e 61 6c 69 7a 65 29 3b 0a 20 20 73 71  5finalize);.  sq
1b080 6c 69 74 65 33 5f 6f 76 65 72 6c 6f 61 64 5f 66  lite3_overload_f
1b090 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 6d 64 35  unction(db, "md5
1b0a0 73 75 6d 22 2c 20 2d 31 29 3b 20 20 2f 2a 20 54  sum", -1);  /* T
1b0b0 6f 20 65 78 65 72 63 69 73 65 20 74 68 69 73 20  o exercise this 
1b0c0 41 50 49 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  API */.  return 
1b0d0 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  rc;.}.#endif /* 
1b0e0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
1b0f0 45 53 54 29 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20  EST) */.../*.** 
1b100 49 66 20 74 68 65 20 6d 61 63 72 6f 20 54 43 4c  If the macro TCL
1b110 53 48 20 69 73 20 6f 6e 65 2c 20 74 68 65 6e 20  SH is one, then 
1b120 70 75 74 20 69 6e 20 63 6f 64 65 20 74 68 69 73  put in code this
1b130 20 66 6f 72 20 74 68 65 0a 2a 2a 20 22 6d 61 69   for the.** "mai
1b140 6e 22 20 72 6f 75 74 69 6e 65 20 74 68 61 74 20  n" routine that 
1b150 77 69 6c 6c 20 69 6e 69 74 69 61 6c 69 7a 65 20  will initialize 
1b160 54 63 6c 20 61 6e 64 20 74 61 6b 65 20 69 6e 70  Tcl and take inp
1b170 75 74 20 66 72 6f 6d 0a 2a 2a 20 73 74 61 6e 64  ut from.** stand
1b180 61 72 64 20 69 6e 70 75 74 2c 20 6f 72 20 69 66  ard input, or if
1b190 20 61 20 66 69 6c 65 20 69 73 20 6e 61 6d 65 64   a file is named
1b1a0 20 6f 6e 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20   on the command 
1b1b0 6c 69 6e 65 0a 2a 2a 20 74 68 65 20 54 43 4c 20  line.** the TCL 
1b1c0 69 6e 74 65 72 70 72 65 74 65 72 20 72 65 61 64  interpreter read
1b1d0 73 20 61 6e 64 20 65 76 61 6c 75 61 74 65 73 20  s and evaluates 
1b1e0 74 68 61 74 20 66 69 6c 65 2e 0a 2a 2f 0a 23 69  that file..*/.#i
1b1f0 66 20 54 43 4c 53 48 3d 3d 31 0a 73 74 61 74 69  f TCLSH==1.stati
1b200 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 74 63  c const char *tc
1b210 6c 73 68 5f 6d 61 69 6e 5f 6c 6f 6f 70 28 76 6f  lsh_main_loop(vo
1b220 69 64 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f  id){.  static co
1b230 6e 73 74 20 63 68 61 72 20 7a 4d 61 69 6e 6c 6f  nst char zMainlo
1b240 6f 70 5b 5d 20 3d 0a 20 20 20 20 22 73 65 74 20  op[] =.    "set 
1b250 6c 69 6e 65 20 7b 7d 5c 6e 22 0a 20 20 20 20 22  line {}\n".    "
1b260 77 68 69 6c 65 20 7b 21 5b 65 6f 66 20 73 74 64  while {![eof std
1b270 69 6e 5d 7d 20 7b 5c 6e 22 0a 20 20 20 20 20 20  in]} {\n".      
1b280 22 69 66 20 7b 24 6c 69 6e 65 21 3d 5c 22 5c 22  "if {$line!=\"\"
1b290 7d 20 7b 5c 6e 22 0a 20 20 20 20 20 20 20 20 22  } {\n".        "
1b2a0 70 75 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20  puts -nonewline 
1b2b0 5c 22 3e 20 5c 22 5c 6e 22 0a 20 20 20 20 20 20  \"> \"\n".      
1b2c0 22 7d 20 65 6c 73 65 20 7b 5c 6e 22 0a 20 20 20  "} else {\n".   
1b2d0 20 20 20 20 20 22 70 75 74 73 20 2d 6e 6f 6e 65       "puts -none
1b2e0 77 6c 69 6e 65 20 5c 22 25 20 5c 22 5c 6e 22 0a  wline \"% \"\n".
1b2f0 20 20 20 20 20 20 22 7d 5c 6e 22 0a 20 20 20 20        "}\n".    
1b300 20 20 22 66 6c 75 73 68 20 73 74 64 6f 75 74 5c    "flush stdout\
1b310 6e 22 0a 20 20 20 20 20 20 22 61 70 70 65 6e 64  n".      "append
1b320 20 6c 69 6e 65 20 5b 67 65 74 73 20 73 74 64 69   line [gets stdi
1b330 6e 5d 5c 6e 22 0a 20 20 20 20 20 20 22 69 66 20  n]\n".      "if 
1b340 7b 5b 69 6e 66 6f 20 63 6f 6d 70 6c 65 74 65 20  {[info complete 
1b350 24 6c 69 6e 65 5d 7d 20 7b 5c 6e 22 0a 20 20 20  $line]} {\n".   
1b360 20 20 20 20 20 22 69 66 20 7b 5b 63 61 74 63 68       "if {[catch
1b370 20 7b 75 70 6c 65 76 65 6c 20 23 30 20 24 6c 69   {uplevel #0 $li
1b380 6e 65 7d 20 72 65 73 75 6c 74 5d 7d 20 7b 5c 6e  ne} result]} {\n
1b390 22 0a 20 20 20 20 20 20 20 20 20 20 22 70 75 74  ".          "put
1b3a0 73 20 73 74 64 65 72 72 20 5c 22 45 72 72 6f 72  s stderr \"Error
1b3b0 3a 20 24 72 65 73 75 6c 74 5c 22 5c 6e 22 0a 20  : $result\"\n". 
1b3c0 20 20 20 20 20 20 20 22 7d 20 65 6c 73 65 69 66         "} elseif
1b3d0 20 7b 24 72 65 73 75 6c 74 21 3d 5c 22 5c 22 7d   {$result!=\"\"}
1b3e0 20 7b 5c 6e 22 0a 20 20 20 20 20 20 20 20 20 20   {\n".          
1b3f0 22 70 75 74 73 20 24 72 65 73 75 6c 74 5c 6e 22  "puts $result\n"
1b400 0a 20 20 20 20 20 20 20 20 22 7d 5c 6e 22 0a 20  .        "}\n". 
1b410 20 20 20 20 20 20 20 22 73 65 74 20 6c 69 6e 65         "set line
1b420 20 7b 7d 5c 6e 22 0a 20 20 20 20 20 20 22 7d 20   {}\n".      "} 
1b430 65 6c 73 65 20 7b 5c 6e 22 0a 20 20 20 20 20 20  else {\n".      
1b440 20 20 22 61 70 70 65 6e 64 20 6c 69 6e 65 20 5c    "append line \
1b450 5c 6e 5c 6e 22 0a 20 20 20 20 20 20 22 7d 5c 6e  \n\n".      "}\n
1b460 22 0a 20 20 20 20 22 7d 5c 6e 22 0a 20 20 3b 0a  ".    "}\n".  ;.
1b470 20 20 72 65 74 75 72 6e 20 7a 4d 61 69 6e 6c 6f    return zMainlo
1b480 6f 70 3b 0a 7d 0a 23 65 6e 64 69 66 0a 23 69 66  op;.}.#endif.#if
1b490 20 54 43 4c 53 48 3d 3d 32 0a 73 74 61 74 69 63   TCLSH==2.static
1b4a0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 74 63 6c   const char *tcl
1b4b0 73 68 5f 6d 61 69 6e 5f 6c 6f 6f 70 28 76 6f 69  sh_main_loop(voi
1b4c0 64 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64  d);.#endif..#ifd
1b4d0 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 73  ef SQLITE_TEST.s
1b4e0 74 61 74 69 63 20 76 6f 69 64 20 69 6e 69 74 5f  tatic void init_
1b4f0 61 6c 6c 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a  all(Tcl_Interp *
1b500 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e  );.static int in
1b510 69 74 5f 61 6c 6c 5f 63 6d 64 28 0a 20 20 43 6c  it_all_cmd(.  Cl
1b520 69 65 6e 74 44 61 74 61 20 63 64 2c 0a 20 20 54  ientData cd,.  T
1b530 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
1b540 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
1b550 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
1b560 6f 62 6a 76 5b 5d 0a 29 7b 0a 0a 20 20 54 63 6c  objv[].){..  Tcl
1b570 5f 49 6e 74 65 72 70 20 2a 73 6c 61 76 65 3b 0a  _Interp *slave;.
1b580 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b    if( objc!=2 ){
1b590 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  .    Tcl_WrongNu
1b5a0 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
1b5b0 20 6f 62 6a 76 2c 20 22 53 4c 41 56 45 22 29 3b   objv, "SLAVE");
1b5c0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
1b5d0 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 73 6c  ERROR;.  }..  sl
1b5e0 61 76 65 20 3d 20 54 63 6c 5f 47 65 74 53 6c 61  ave = Tcl_GetSla
1b5f0 76 65 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  ve(interp, Tcl_G
1b600 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
1b610 29 29 3b 0a 20 20 69 66 28 20 21 73 6c 61 76 65  ));.  if( !slave
1b620 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54   ){.    return T
1b630 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
1b640 20 69 6e 69 74 5f 61 6c 6c 28 73 6c 61 76 65 29   init_all(slave)
1b650 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
1b660 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 63 6c 63  K;.}../*.** Tclc
1b670 6d 64 3a 20 64 62 5f 75 73 65 5f 6c 65 67 61 63  md: db_use_legac
1b680 79 5f 70 72 65 70 61 72 65 20 44 42 20 42 4f 4f  y_prepare DB BOO
1b690 4c 45 41 4e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65  LEAN.**.**   The
1b6a0 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
1b6b0 74 6f 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  to this command 
1b6c0 6d 75 73 74 20 62 65 20 61 20 64 61 74 61 62 61  must be a databa
1b6d0 73 65 20 63 6f 6d 6d 61 6e 64 20 63 72 65 61 74  se command creat
1b6e0 65 64 20 62 79 0a 2a 2a 20 20 20 5b 73 71 6c 69  ed by.**   [sqli
1b6f0 74 65 33 5d 2e 20 49 66 20 74 68 65 20 73 65 63  te3]. If the sec
1b700 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ond argument is 
1b710 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20 68  true, then the h
1b720 61 6e 64 6c 65 20 69 73 20 63 6f 6e 66 69 67 75  andle is configu
1b730 72 65 64 0a 2a 2a 20 20 20 74 6f 20 75 73 65 20  red.**   to use 
1b740 74 68 65 20 73 71 6c 69 74 65 33 5f 70 72 65 70  the sqlite3_prep
1b750 61 72 65 5f 76 32 28 29 20 66 75 6e 63 74 69 6f  are_v2() functio
1b760 6e 20 74 6f 20 70 72 65 70 61 72 65 20 73 74 61  n to prepare sta
1b770 74 65 6d 65 6e 74 73 2e 20 49 66 20 69 74 0a 2a  tements. If it.*
1b780 2a 20 20 20 69 73 20 66 61 6c 73 65 2c 20 73 71  *   is false, sq
1b790 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28 29 2e  lite3_prepare().
1b7a0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
1b7b0 62 5f 75 73 65 5f 6c 65 67 61 63 79 5f 70 72 65  b_use_legacy_pre
1b7c0 70 61 72 65 5f 63 6d 64 28 0a 20 20 43 6c 69 65  pare_cmd(.  Clie
1b7d0 6e 74 44 61 74 61 20 63 64 2c 0a 20 20 54 63 6c  ntData cd,.  Tcl
1b7e0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
1b7f0 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
1b800 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
1b810 6a 76 5b 5d 0a 29 7b 0a 20 20 54 63 6c 5f 43 6d  jv[].){.  Tcl_Cm
1b820 64 49 6e 66 6f 20 63 6d 64 49 6e 66 6f 3b 0a 20  dInfo cmdInfo;. 
1b830 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 3b 0a   SqliteDb *pDb;.
1b840 20 20 69 6e 74 20 62 50 72 65 70 61 72 65 3b 0a    int bPrepare;.
1b850 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29  .  if( objc!=3 )
1b860 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
1b870 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
1b880 2c 20 6f 62 6a 76 2c 20 22 44 42 20 42 4f 4f 4c  , objv, "DB BOOL
1b890 45 41 4e 22 29 3b 0a 20 20 20 20 72 65 74 75 72  EAN");.    retur
1b8a0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
1b8b0 0a 0a 20 20 69 66 28 20 21 54 63 6c 5f 47 65 74  ..  if( !Tcl_Get
1b8c0 43 6f 6d 6d 61 6e 64 49 6e 66 6f 28 69 6e 74 65  CommandInfo(inte
1b8d0 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
1b8e0 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 63 6d 64  g(objv[1]), &cmd
1b8f0 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20 54 63 6c  Info) ){.    Tcl
1b900 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
1b910 74 65 72 70 2c 20 22 6e 6f 20 73 75 63 68 20 64  terp, "no such d
1b920 62 3a 20 22 2c 20 54 63 6c 5f 47 65 74 53 74 72  b: ", Tcl_GetStr
1b930 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 28 63  ing(objv[1]), (c
1b940 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 72 65 74  har*)0);.    ret
1b950 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1b960 20 7d 0a 20 20 70 44 62 20 3d 20 28 53 71 6c 69   }.  pDb = (Sqli
1b970 74 65 44 62 2a 29 63 6d 64 49 6e 66 6f 2e 6f 62  teDb*)cmdInfo.ob
1b980 6a 43 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20 69  jClientData;.  i
1b990 66 28 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61  f( Tcl_GetBoolea
1b9a0 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  nFromObj(interp,
1b9b0 20 6f 62 6a 76 5b 32 5d 2c 20 26 62 50 72 65 70   objv[2], &bPrep
1b9c0 61 72 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75  are) ){.    retu
1b9d0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1b9e0 7d 0a 0a 20 20 70 44 62 2d 3e 62 4c 65 67 61 63  }..  pDb->bLegac
1b9f0 79 50 72 65 70 61 72 65 20 3d 20 62 50 72 65 70  yPrepare = bPrep
1ba00 61 72 65 3b 0a 0a 20 20 54 63 6c 5f 52 65 73 65  are;..  Tcl_Rese
1ba10 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b  tResult(interp);
1ba20 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
1ba30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
1ba40 2a 20 43 6f 6e 66 69 67 75 72 65 20 74 68 65 20  * Configure the 
1ba50 69 6e 74 65 72 70 72 65 74 65 72 20 70 61 73 73  interpreter pass
1ba60 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ed as the first 
1ba70 61 72 67 75 6d 65 6e 74 20 74 6f 20 68 61 76 65  argument to have
1ba80 20 61 63 63 65 73 73 0a 2a 2a 20 74 6f 20 74 68   access.** to th
1ba90 65 20 63 6f 6d 6d 61 6e 64 73 20 61 6e 64 20 6c  e commands and l
1baa0 69 6e 6b 65 64 20 76 61 72 69 61 62 6c 65 73 20  inked variables 
1bab0 74 68 61 74 20 6d 61 6b 65 20 75 70 3a 0a 2a 2a  that make up:.**
1bac0 0a 2a 2a 20 20 20 2a 20 74 68 65 20 5b 73 71 6c  .**   * the [sql
1bad0 69 74 65 33 5d 20 65 78 74 65 6e 73 69 6f 6e 20  ite3] extension 
1bae0 69 74 73 65 6c 66 2c 20 0a 2a 2a 0a 2a 2a 20 20  itself, .**.**  
1baf0 20 2a 20 49 66 20 53 51 4c 49 54 45 5f 54 43 4c   * If SQLITE_TCL
1bb00 4d 44 35 20 6f 72 20 53 51 4c 49 54 45 5f 54 45  MD5 or SQLITE_TE
1bb10 53 54 20 69 73 20 64 65 66 69 6e 65 64 2c 20 74  ST is defined, t
1bb20 68 65 20 4d 64 35 20 63 6f 6d 6d 61 6e 64 73 2c  he Md5 commands,
1bb30 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49   and.**.**   * I
1bb40 66 20 53 51 4c 49 54 45 5f 54 45 53 54 20 69 73  f SQLITE_TEST is
1bb50 20 73 65 74 2c 20 74 68 65 20 76 61 72 69 6f 75   set, the variou
1bb60 73 20 74 65 73 74 20 69 6e 74 65 72 66 61 63 65  s test interface
1bb70 73 20 75 73 65 64 20 62 79 20 74 68 65 20 54 63  s used by the Tc
1bb80 6c 0a 2a 2a 20 20 20 20 20 74 65 73 74 20 73 75  l.**     test su
1bb90 69 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ite..*/.static v
1bba0 6f 69 64 20 69 6e 69 74 5f 61 6c 6c 28 54 63 6c  oid init_all(Tcl
1bbb0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29  _Interp *interp)
1bbc0 7b 0a 20 20 53 71 6c 69 74 65 33 5f 49 6e 69 74  {.  Sqlite3_Init
1bbd0 28 69 6e 74 65 72 70 29 3b 0a 0a 23 69 66 20 64  (interp);..#if d
1bbe0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45  efined(SQLITE_TE
1bbf0 53 54 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53  ST) || defined(S
1bc00 51 4c 49 54 45 5f 54 43 4c 4d 44 35 29 0a 20 20  QLITE_TCLMD5).  
1bc10 4d 64 35 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  Md5_Init(interp)
1bc20 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49  ;.#endif..  /* I
1bc30 6e 73 74 61 6c 6c 20 74 68 65 20 5b 72 65 67 69  nstall the [regi
1bc40 73 74 65 72 5f 64 62 73 74 61 74 5f 76 74 61 62  ster_dbstat_vtab
1bc50 5d 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 61 63 63  ] command to acc
1bc60 65 73 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e  ess the implemen
1bc70 74 61 74 69 6f 6e 0a 20 20 2a 2a 20 6f 66 20 76  tation.  ** of v
1bc80 69 72 74 75 61 6c 20 74 61 62 6c 65 20 64 62 73  irtual table dbs
1bc90 74 61 74 20 28 73 6f 75 72 63 65 20 66 69 6c 65  tat (source file
1bca0 20 74 65 73 74 5f 73 74 61 74 2e 63 29 2e 20 54   test_stat.c). T
1bcb0 68 69 73 20 63 6f 6d 6d 61 6e 64 20 69 73 0a 20  his command is. 
1bcc0 20 2a 2a 20 72 65 71 75 69 72 65 64 20 66 6f 72   ** required for
1bcd0 20 74 65 73 74 66 69 78 74 75 72 65 20 61 6e 64   testfixture and
1bce0 20 73 71 6c 69 74 65 33 5f 61 6e 61 6c 79 7a 65   sqlite3_analyze
1bcf0 72 2c 20 62 75 74 20 6e 6f 74 20 62 79 20 74 68  r, but not by th
1bd00 65 20 70 72 6f 64 75 63 74 69 6f 6e 0a 20 20 2a  e production.  *
1bd10 2a 20 54 63 6c 20 65 78 74 65 6e 73 69 6f 6e 2e  * Tcl extension.
1bd20 20 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64    */.#if defined
1bd30 28 53 51 4c 49 54 45 5f 54 45 53 54 29 20 7c 7c  (SQLITE_TEST) ||
1bd40 20 54 43 4c 53 48 3d 3d 32 0a 20 20 7b 0a 20 20   TCLSH==2.  {.  
1bd50 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c    extern int Sql
1bd60 69 74 65 74 65 73 74 53 74 61 74 5f 49 6e 69 74  itetestStat_Init
1bd70 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20  (Tcl_Interp*);. 
1bd80 20 20 20 53 71 6c 69 74 65 74 65 73 74 53 74 61     SqlitetestSta
1bd90 74 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a  t_Init(interp);.
1bda0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64    }.#endif..#ifd
1bdb0 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
1bdc0 20 7b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e   {.    extern in
1bdd0 74 20 53 71 6c 69 74 65 63 6f 6e 66 69 67 5f 49  t Sqliteconfig_I
1bde0 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29  nit(Tcl_Interp*)
1bdf0 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74  ;.    extern int
1be00 20 53 71 6c 69 74 65 74 65 73 74 31 5f 49 6e 69   Sqlitetest1_Ini
1be10 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a  t(Tcl_Interp*);.
1be20 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53      extern int S
1be30 71 6c 69 74 65 74 65 73 74 32 5f 49 6e 69 74 28  qlitetest2_Init(
1be40 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20  Tcl_Interp*);.  
1be50 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c    extern int Sql
1be60 69 74 65 74 65 73 74 33 5f 49 6e 69 74 28 54 63  itetest3_Init(Tc
1be70 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20  l_Interp*);.    
1be80 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74  extern int Sqlit
1be90 65 74 65 73 74 34 5f 49 6e 69 74 28 54 63 6c 5f  etest4_Init(Tcl_
1bea0 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78  Interp*);.    ex
1beb0 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74  tern int Sqlitet
1bec0 65 73 74 35 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  est5_Init(Tcl_In
1bed0 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65  terp*);.    exte
1bee0 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73  rn int Sqlitetes
1bef0 74 36 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  t6_Init(Tcl_Inte
1bf00 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e  rp*);.    extern
1bf10 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 37   int Sqlitetest7
1bf20 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
1bf30 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69  *);.    extern i
1bf40 6e 74 20 53 71 6c 69 74 65 74 65 73 74 38 5f 49  nt Sqlitetest8_I
1bf50 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29  nit(Tcl_Interp*)
1bf60 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74  ;.    extern int
1bf70 20 53 71 6c 69 74 65 74 65 73 74 39 5f 49 6e 69   Sqlitetest9_Ini
1bf80 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a  t(Tcl_Interp*);.
1bf90 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53      extern int S
1bfa0 71 6c 69 74 65 74 65 73 74 61 73 79 6e 63 5f 49  qlitetestasync_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 5f 61 75 74 6f   Sqlitetest_auto
1bfe0 65 78 74 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74  ext_Init(Tcl_Int
1bff0 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72  erp*);.    exter
1c000 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74  n int Sqlitetest
1c010 5f 64 65 6d 6f 76 66 73 5f 49 6e 69 74 28 54 63  _demovfs_Init(Tc
1c020 6c 5f 49 6e 74 65 72 70 20 2a 29 3b 0a 20 20 20  l_Interp *);.   
1c030 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69   extern int Sqli
1c040 74 65 74 65 73 74 5f 66 75 6e 63 5f 49 6e 69 74  tetest_func_Init
1c050 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20  (Tcl_Interp*);. 
1c060 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71     extern int Sq
1c070 6c 69 74 65 74 65 73 74 5f 68 65 78 69 6f 5f 49  litetest_hexio_I
1c080 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29  nit(Tcl_Interp*)
1c090 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74  ;.    extern int
1c0a0 20 53 71 6c 69 74 65 74 65 73 74 5f 69 6e 69 74   Sqlitetest_init
1c0b0 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
1c0c0 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69  *);.    extern i
1c0d0 6e 74 20 53 71 6c 69 74 65 74 65 73 74 5f 6d 61  nt Sqlitetest_ma
1c0e0 6c 6c 6f 63 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  lloc_Init(Tcl_In
1c0f0 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65  terp*);.    exte
1c100 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73  rn int Sqlitetes
1c110 74 5f 6d 75 74 65 78 5f 49 6e 69 74 28 54 63 6c  t_mutex_Init(Tcl
1c120 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65  _Interp*);.    e
1c130 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65  xtern int Sqlite
1c140 74 65 73 74 73 63 68 65 6d 61 5f 49 6e 69 74 28  testschema_Init(
1c150 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20  Tcl_Interp*);.  
1c160 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c    extern int Sql
1c170 69 74 65 74 65 73 74 73 73 65 5f 49 6e 69 74 28  itetestsse_Init(
1c180 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20  Tcl_Interp*);.  
1c190 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c    extern int Sql
1c1a0 69 74 65 74 65 73 74 74 63 6c 76 61 72 5f 49 6e  itetesttclvar_In
1c1b0 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b  it(Tcl_Interp*);
1c1c0 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20  .    extern int 
1c1d0 53 71 6c 69 74 65 74 65 73 74 54 68 72 65 61 64  SqlitetestThread
1c1e0 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
1c1f0 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69  *);.    extern i
1c200 6e 74 20 53 71 6c 69 74 65 74 65 73 74 4f 6e 65  nt SqlitetestOne
1c210 66 69 6c 65 5f 49 6e 69 74 28 29 3b 0a 20 20 20  file_Init();.   
1c220 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69   extern int Sqli
1c230 74 65 74 65 73 74 4f 73 69 6e 73 74 5f 49 6e 69  tetestOsinst_Ini
1c240 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a  t(Tcl_Interp*);.
1c250 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53      extern int S
1c260 71 6c 69 74 65 74 65 73 74 62 61 63 6b 75 70 5f  qlitetestbackup_
1c270 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a  Init(Tcl_Interp*
1c280 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e  );.    extern in
1c290 74 20 53 71 6c 69 74 65 74 65 73 74 69 6e 74 61  t Sqlitetestinta
1c2a0 72 72 61 79 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  rray_Init(Tcl_In
1c2b0 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65  terp*);.    exte
1c2c0 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73  rn int Sqlitetes
1c2d0 74 76 66 73 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  tvfs_Init(Tcl_In
1c2e0 74 65 72 70 20 2a 29 3b 0a 20 20 20 20 65 78 74  terp *);.    ext
1c2f0 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65  ern int Sqlitete
1c300 73 74 72 74 72 65 65 5f 49 6e 69 74 28 54 63 6c  strtree_Init(Tcl
1c310 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65  _Interp*);.    e
1c320 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65  xtern int Sqlite
1c330 71 75 6f 74 61 5f 49 6e 69 74 28 54 63 6c 5f 49  quota_Init(Tcl_I
1c340 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74  nterp*);.    ext
1c350 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 6d 75  ern int Sqlitemu
1c360 6c 74 69 70 6c 65 78 5f 49 6e 69 74 28 54 63 6c  ltiplex_Init(Tcl
1c370 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65  _Interp*);.    e
1c380 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65  xtern int Sqlite
1c390 53 75 70 65 72 6c 6f 63 6b 5f 49 6e 69 74 28 54  Superlock_Init(T
1c3a0 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20  cl_Interp*);.   
1c3b0 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69   extern int Sqli
1c3c0 74 65 74 65 73 74 53 79 73 63 61 6c 6c 5f 49 6e  tetestSyscall_In
1c3d0 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b  it(Tcl_Interp*);
1c3e0 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20  .    extern int 
1c3f0 53 71 6c 69 74 65 74 65 73 74 66 75 7a 7a 65 72  Sqlitetestfuzzer
1c400 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
1c410 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69  *);.    extern i
1c420 6e 74 20 53 71 6c 69 74 65 74 65 73 74 77 68 6f  nt Sqlitetestwho
1c430 6c 65 6e 75 6d 62 65 72 5f 49 6e 69 74 28 54 63  lenumber_Init(Tc
1c440 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 0a 23 69 66  l_Interp*);..#if
1c450 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
1c460 45 4e 41 42 4c 45 5f 46 54 53 33 29 20 7c 7c 20  ENABLE_FTS3) || 
1c470 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
1c480 4e 41 42 4c 45 5f 46 54 53 34 29 0a 20 20 20 20  NABLE_FTS4).    
1c490 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74  extern int Sqlit
1c4a0 65 74 65 73 74 66 74 73 33 5f 49 6e 69 74 28 54  etestfts3_Init(T
1c4b0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
1c4c0 70 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64  p);.#endif..#ifd
1c4d0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
1c4e0 5f 5a 49 50 56 46 53 0a 20 20 20 20 65 78 74 65  _ZIPVFS.    exte
1c4f0 72 6e 20 69 6e 74 20 5a 69 70 76 66 73 5f 49 6e  rn int Zipvfs_In
1c500 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b  it(Tcl_Interp*);
1c510 0a 20 20 20 20 5a 69 70 76 66 73 5f 49 6e 69 74  .    Zipvfs_Init
1c520 28 69 6e 74 65 72 70 29 3b 0a 23 65 6e 64 69 66  (interp);.#endif
1c530 0a 0a 20 20 20 20 53 71 6c 69 74 65 63 6f 6e 66  ..    Sqliteconf
1c540 69 67 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b  ig_Init(interp);
1c550 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 31  .    Sqlitetest1
1c560 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20  _Init(interp);. 
1c570 20 20 20 53 71 6c 69 74 65 74 65 73 74 32 5f 49     Sqlitetest2_I
1c580 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20  nit(interp);.   
1c590 20 53 71 6c 69 74 65 74 65 73 74 33 5f 49 6e 69   Sqlitetest3_Ini
1c5a0 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53  t(interp);.    S
1c5b0 71 6c 69 74 65 74 65 73 74 34 5f 49 6e 69 74 28  qlitetest4_Init(
1c5c0 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c  interp);.    Sql
1c5d0 69 74 65 74 65 73 74 35 5f 49 6e 69 74 28 69 6e  itetest5_Init(in
1c5e0 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74  terp);.    Sqlit
1c5f0 65 74 65 73 74 36 5f 49 6e 69 74 28 69 6e 74 65  etest6_Init(inte
1c600 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74  rp);.    Sqlitet
1c610 65 73 74 37 5f 49 6e 69 74 28 69 6e 74 65 72 70  est7_Init(interp
1c620 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73  );.    Sqlitetes
1c630 74 38 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b  t8_Init(interp);
1c640 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 39  .    Sqlitetest9
1c650 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20  _Init(interp);. 
1c660 20 20 20 53 71 6c 69 74 65 74 65 73 74 61 73 79     Sqlitetestasy
1c670 6e 63 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b  nc_Init(interp);
1c680 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 5f  .    Sqlitetest_
1c690 61 75 74 6f 65 78 74 5f 49 6e 69 74 28 69 6e 74  autoext_Init(int
1c6a0 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65  erp);.    Sqlite
1c6b0 74 65 73 74 5f 64 65 6d 6f 76 66 73 5f 49 6e 69  test_demovfs_Ini
1c6c0 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53  t(interp);.    S
1c6d0 71 6c 69 74 65 74 65 73 74 5f 66 75 6e 63 5f 49  qlitetest_func_I
1c6e0 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20  nit(interp);.   
1c6f0 20 53 71 6c 69 74 65 74 65 73 74 5f 68 65 78 69   Sqlitetest_hexi
1c700 6f 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a  o_Init(interp);.
1c710 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 5f 69      Sqlitetest_i
1c720 6e 69 74 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  nit_Init(interp)
1c730 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74  ;.    Sqlitetest
1c740 5f 6d 61 6c 6c 6f 63 5f 49 6e 69 74 28 69 6e 74  _malloc_Init(int
1c750 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65  erp);.    Sqlite
1c760 74 65 73 74 5f 6d 75 74 65 78 5f 49 6e 69 74 28  test_mutex_Init(
1c770 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c  interp);.    Sql
1c780 69 74 65 74 65 73 74 73 63 68 65 6d 61 5f 49 6e  itetestschema_In
1c790 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  it(interp);.    
1c7a0 53 71 6c 69 74 65 74 65 73 74 74 63 6c 76 61 72  Sqlitetesttclvar
1c7b0 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20  _Init(interp);. 
1c7c0 20 20 20 53 71 6c 69 74 65 74 65 73 74 54 68 72     SqlitetestThr
1c7d0 65 61 64 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  ead_Init(interp)
1c7e0 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74  ;.    Sqlitetest
1c7f0 4f 6e 65 66 69 6c 65 5f 49 6e 69 74 28 69 6e 74  Onefile_Init(int
1c800 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65  erp);.    Sqlite
1c810 74 65 73 74 4f 73 69 6e 73 74 5f 49 6e 69 74 28  testOsinst_Init(
1c820 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c  interp);.    Sql
1c830 69 74 65 74 65 73 74 62 61 63 6b 75 70 5f 49 6e  itetestbackup_In
1c840 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  it(interp);.    
1c850 53 71 6c 69 74 65 74 65 73 74 69 6e 74 61 72 72  Sqlitetestintarr
1c860 61 79 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b  ay_Init(interp);
1c870 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 76  .    Sqlitetestv
1c880 66 73 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b  fs_Init(interp);
1c890 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 72  .    Sqlitetestr
1c8a0 74 72 65 65 5f 49 6e 69 74 28 69 6e 74 65 72 70  tree_Init(interp
1c8b0 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 71 75 6f  );.    Sqlitequo
1c8c0 74 61 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b  ta_Init(interp);
1c8d0 0a 20 20 20 20 53 71 6c 69 74 65 6d 75 6c 74 69  .    Sqlitemulti
1c8e0 70 6c 65 78 5f 49 6e 69 74 28 69 6e 74 65 72 70  plex_Init(interp
1c8f0 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 53 75 70  );.    SqliteSup
1c900 65 72 6c 6f 63 6b 5f 49 6e 69 74 28 69 6e 74 65  erlock_Init(inte
1c910 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74  rp);.    Sqlitet
1c920 65 73 74 53 79 73 63 61 6c 6c 5f 49 6e 69 74 28  estSyscall_Init(
1c930 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c  interp);.    Sql
1c940 69 74 65 74 65 73 74 66 75 7a 7a 65 72 5f 49 6e  itetestfuzzer_In
1c950 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  it(interp);.    
1c960 53 71 6c 69 74 65 74 65 73 74 77 68 6f 6c 65 6e  Sqlitetestwholen
1c970 75 6d 62 65 72 5f 49 6e 69 74 28 69 6e 74 65 72  umber_Init(inter
1c980 70 29 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  p);..#if defined
1c990 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46  (SQLITE_ENABLE_F
1c9a0 54 53 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  TS3) || defined(
1c9b0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54  SQLITE_ENABLE_FT
1c9c0 53 34 29 0a 20 20 20 20 53 71 6c 69 74 65 74 65  S4).    Sqlitete
1c9d0 73 74 66 74 73 33 5f 49 6e 69 74 28 69 6e 74 65  stfts3_Init(inte
1c9e0 72 70 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20  rp);.#endif..   
1c9f0 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f   Tcl_CreateObjCo
1ca00 6d 6d 61 6e 64 28 0a 20 20 20 20 20 20 20 20 69  mmand(.        i
1ca10 6e 74 65 72 70 2c 20 22 6c 6f 61 64 5f 74 65 73  nterp, "load_tes
1ca20 74 66 69 78 74 75 72 65 5f 65 78 74 65 6e 73 69  tfixture_extensi
1ca30 6f 6e 73 22 2c 20 69 6e 69 74 5f 61 6c 6c 5f 63  ons", init_all_c
1ca40 6d 64 2c 20 30 2c 20 30 0a 20 20 20 20 29 3b 0a  md, 0, 0.    );.
1ca50 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62      Tcl_CreateOb
1ca60 6a 43 6f 6d 6d 61 6e 64 28 0a 20 20 20 20 20 20  jCommand(.      
1ca70 20 20 69 6e 74 65 72 70 2c 20 22 64 62 5f 75 73    interp, "db_us
1ca80 65 5f 6c 65 67 61 63 79 5f 70 72 65 70 61 72 65  e_legacy_prepare
1ca90 22 2c 20 64 62 5f 75 73 65 5f 6c 65 67 61 63 79  ", db_use_legacy
1caa0 5f 70 72 65 70 61 72 65 5f 63 6d 64 2c 20 30 2c  _prepare_cmd, 0,
1cab0 20 30 0a 20 20 20 20 29 3b 0a 0a 23 69 66 64 65   0.    );..#ifde
1cac0 66 20 53 51 4c 49 54 45 5f 53 53 45 0a 20 20 20  f SQLITE_SSE.   
1cad0 20 53 71 6c 69 74 65 74 65 73 74 73 73 65 5f 49   Sqlitetestsse_I
1cae0 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 23 65 6e  nit(interp);.#en
1caf0 64 69 66 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d  dif.  }.#endif.}
1cb00 0a 0a 23 64 65 66 69 6e 65 20 54 43 4c 53 48 5f  ..#define TCLSH_
1cb10 4d 41 49 4e 20 6d 61 69 6e 20 20 20 2f 2a 20 4e  MAIN main   /* N
1cb20 65 65 64 65 64 20 74 6f 20 66 61 6b 65 20 6f 75  eeded to fake ou
1cb30 74 20 6d 6b 74 63 6c 61 70 70 20 2a 2f 0a 69 6e  t mktclapp */.in
1cb40 74 20 54 43 4c 53 48 5f 4d 41 49 4e 28 69 6e 74  t TCLSH_MAIN(int
1cb50 20 61 72 67 63 2c 20 63 68 61 72 20 2a 2a 61 72   argc, char **ar
1cb60 67 76 29 7b 0a 20 20 54 63 6c 5f 49 6e 74 65 72  gv){.  Tcl_Inter
1cb70 70 20 2a 69 6e 74 65 72 70 3b 0a 20 20 0a 20 20  p *interp;.  .  
1cb80 2f 2a 20 43 61 6c 6c 20 73 71 6c 69 74 65 33 5f  /* Call sqlite3_
1cb90 73 68 75 74 64 6f 77 6e 28 29 20 6f 6e 63 65 20  shutdown() once 
1cba0 62 65 66 6f 72 65 20 64 6f 69 6e 67 20 61 6e 79  before doing any
1cbb0 74 68 69 6e 67 20 65 6c 73 65 2e 20 54 68 69 73  thing else. This
1cbc0 20 69 73 20 74 6f 0a 20 20 2a 2a 20 74 65 73 74   is to.  ** test
1cbd0 20 74 68 61 74 20 73 71 6c 69 74 65 33 5f 73 68   that sqlite3_sh
1cbe0 75 74 64 6f 77 6e 28 29 20 63 61 6e 20 62 65 20  utdown() can be 
1cbf0 73 61 66 65 6c 79 20 63 61 6c 6c 65 64 20 62 79  safely called by
1cc00 20 61 20 70 72 6f 63 65 73 73 20 62 65 66 6f 72   a process befor
1cc10 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 69  e.  ** sqlite3_i
1cc20 6e 69 74 69 61 6c 69 7a 65 28 29 20 69 73 2e 20  nitialize() is. 
1cc30 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 68 75  */.  sqlite3_shu
1cc40 74 64 6f 77 6e 28 29 3b 0a 0a 20 20 54 63 6c 5f  tdown();..  Tcl_
1cc50 46 69 6e 64 45 78 65 63 75 74 61 62 6c 65 28 61  FindExecutable(a
1cc60 72 67 76 5b 30 5d 29 3b 0a 20 20 69 6e 74 65 72  rgv[0]);.  inter
1cc70 70 20 3d 20 54 63 6c 5f 43 72 65 61 74 65 49 6e  p = Tcl_CreateIn
1cc80 74 65 72 70 28 29 3b 0a 0a 23 69 66 20 54 43 4c  terp();..#if TCL
1cc90 53 48 3d 3d 32 0a 20 20 73 71 6c 69 74 65 33 5f  SH==2.  sqlite3_
1cca0 63 6f 6e 66 69 67 28 53 51 4c 49 54 45 5f 43 4f  config(SQLITE_CO
1ccb0 4e 46 49 47 5f 53 49 4e 47 4c 45 54 48 52 45 41  NFIG_SINGLETHREA
1ccc0 44 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69 6e  D);.#endif..  in
1ccd0 69 74 5f 61 6c 6c 28 69 6e 74 65 72 70 29 3b 0a  it_all(interp);.
1cce0 20 20 69 66 28 20 61 72 67 63 3e 3d 32 20 29 7b    if( argc>=2 ){
1ccf0 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
1cd00 63 68 61 72 20 7a 41 72 67 63 5b 33 32 5d 3b 0a  char zArgc[32];.
1cd10 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
1cd20 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 41 72 67  intf(sizeof(zArg
1cd30 63 29 2c 20 7a 41 72 67 63 2c 20 22 25 64 22 2c  c), zArgc, "%d",
1cd40 20 61 72 67 63 2d 28 33 2d 54 43 4c 53 48 29 29   argc-(3-TCLSH))
1cd50 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 56 61 72  ;.    Tcl_SetVar
1cd60 28 69 6e 74 65 72 70 2c 22 61 72 67 63 22 2c 20  (interp,"argc", 
1cd70 7a 41 72 67 63 2c 20 54 43 4c 5f 47 4c 4f 42 41  zArgc, TCL_GLOBA
1cd80 4c 5f 4f 4e 4c 59 29 3b 0a 20 20 20 20 54 63 6c  L_ONLY);.    Tcl
1cd90 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c 22  _SetVar(interp,"
1cda0 61 72 67 76 30 22 2c 61 72 67 76 5b 31 5d 2c 54  argv0",argv[1],T
1cdb0 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b  CL_GLOBAL_ONLY);
1cdc0 0a 20 20 20 20 54 63 6c 5f 53 65 74 56 61 72 28  .    Tcl_SetVar(
1cdd0 69 6e 74 65 72 70 2c 22 61 72 67 76 22 2c 20 22  interp,"argv", "
1cde0 22 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e  ", TCL_GLOBAL_ON
1cdf0 4c 59 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 33  LY);.    for(i=3
1ce00 2d 54 43 4c 53 48 3b 20 69 3c 61 72 67 63 3b 20  -TCLSH; i<argc; 
1ce10 69 2b 2b 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  i++){.      Tcl_
1ce20 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c 20 22  SetVar(interp, "
1ce30 61 72 67 76 22 2c 20 61 72 67 76 5b 69 5d 2c 0a  argv", argv[i],.
1ce40 20 20 20 20 20 20 20 20 20 20 54 43 4c 5f 47 4c            TCL_GL
1ce50 4f 42 41 4c 5f 4f 4e 4c 59 20 7c 20 54 43 4c 5f  OBAL_ONLY | TCL_
1ce60 4c 49 53 54 5f 45 4c 45 4d 45 4e 54 20 7c 20 54  LIST_ELEMENT | T
1ce70 43 4c 5f 41 50 50 45 4e 44 5f 56 41 4c 55 45 29  CL_APPEND_VALUE)
1ce80 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1ce90 54 43 4c 53 48 3d 3d 31 20 26 26 20 54 63 6c 5f  TCLSH==1 && Tcl_
1cea0 45 76 61 6c 46 69 6c 65 28 69 6e 74 65 72 70 2c  EvalFile(interp,
1ceb0 20 61 72 67 76 5b 31 5d 29 21 3d 54 43 4c 5f 4f   argv[1])!=TCL_O
1cec0 4b 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  K ){.      const
1ced0 20 63 68 61 72 20 2a 7a 49 6e 66 6f 20 3d 20 54   char *zInfo = T
1cee0 63 6c 5f 47 65 74 56 61 72 28 69 6e 74 65 72 70  cl_GetVar(interp
1cef0 2c 20 22 65 72 72 6f 72 49 6e 66 6f 22 2c 20 54  , "errorInfo", T
1cf00 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b  CL_GLOBAL_ONLY);
1cf10 0a 20 20 20 20 20 20 69 66 28 20 7a 49 6e 66 6f  .      if( zInfo
1cf20 3d 3d 30 20 29 20 7a 49 6e 66 6f 20 3d 20 54 63  ==0 ) zInfo = Tc
1cf30 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c  l_GetStringResul
1cf40 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 20  t(interp);.     
1cf50 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
1cf60 22 25 73 3a 20 25 73 5c 6e 22 2c 20 2a 61 72 67  "%s: %s\n", *arg
1cf70 76 2c 20 7a 49 6e 66 6f 29 3b 0a 20 20 20 20 20  v, zInfo);.     
1cf80 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
1cf90 0a 20 20 7d 0a 20 20 69 66 28 20 54 43 4c 53 48  .  }.  if( TCLSH
1cfa0 3d 3d 32 20 7c 7c 20 61 72 67 63 3c 3d 31 20 29  ==2 || argc<=1 )
1cfb0 7b 0a 20 20 20 20 54 63 6c 5f 47 6c 6f 62 61 6c  {.    Tcl_Global
1cfc0 45 76 61 6c 28 69 6e 74 65 72 70 2c 20 74 63 6c  Eval(interp, tcl
1cfd0 73 68 5f 6d 61 69 6e 5f 6c 6f 6f 70 28 29 29 3b  sh_main_loop());
1cfe0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
1cff0 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 54 43 4c  .}.#endif /* TCL
1d000 53 48 20 2a 2f 0a                                SH */.