/ Hex Artifact Content
Login

Artifact be0e691e223a907aa032c7b3ed310dc0ff048109:


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 50 72 65 55 70 64 61 74  l_Obj *pPreUpdat
1320: 65 48 6f 6f 6b 3b 20 20 20 2f 2a 20 50 72 65 2d  eHook;   /* Pre-
1330: 75 70 64 61 74 65 20 68 6f 6f 6b 20 73 63 72 69  update hook scri
1340: 70 74 20 28 69 66 20 61 6e 79 29 20 2a 2f 0a 20  pt (if any) */. 
1350: 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 6f 6c 6c 62   Tcl_Obj *pRollb
1360: 61 63 6b 48 6f 6f 6b 3b 20 20 20 20 2f 2a 20 52  ackHook;    /* R
1370: 6f 6c 6c 62 61 63 6b 20 68 6f 6f 6b 20 73 63 72  ollback hook scr
1380: 69 70 74 20 28 69 66 20 61 6e 79 29 20 2a 2f 0a  ipt (if any) */.
1390: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 57 61 6c 48    Tcl_Obj *pWalH
13a0: 6f 6f 6b 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ook;         /* 
13b0: 57 41 4c 20 68 6f 6f 6b 20 73 63 72 69 70 74 20  WAL hook script 
13c0: 28 69 66 20 61 6e 79 29 20 2a 2f 0a 20 20 54 63  (if any) */.  Tc
13d0: 6c 5f 4f 62 6a 20 2a 70 55 6e 6c 6f 63 6b 4e 6f  l_Obj *pUnlockNo
13e0: 74 69 66 79 3b 20 20 20 20 2f 2a 20 55 6e 6c 6f  tify;    /* Unlo
13f0: 63 6b 20 6e 6f 74 69 66 79 20 73 63 72 69 70 74  ck notify script
1400: 20 28 69 66 20 61 6e 79 29 20 2a 2f 0a 20 20 53   (if any) */.  S
1410: 71 6c 43 6f 6c 6c 61 74 65 20 2a 70 43 6f 6c 6c  qlCollate *pColl
1420: 61 74 65 3b 20 20 20 20 20 20 2f 2a 20 4c 69 73  ate;      /* Lis
1430: 74 20 6f 66 20 53 51 4c 20 63 6f 6c 6c 61 74 69  t of SQL collati
1440: 6f 6e 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a  on functions */.
1450: 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
1460: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1470: 52 65 74 75 72 6e 20 63 6f 64 65 20 6f 66 20 6d  Return code of m
1480: 6f 73 74 20 72 65 63 65 6e 74 20 73 71 6c 69 74  ost recent sqlit
1490: 65 33 5f 65 78 65 63 28 29 20 2a 2f 0a 20 20 54  e3_exec() */.  T
14a0: 63 6c 5f 4f 62 6a 20 2a 70 43 6f 6c 6c 61 74 65  cl_Obj *pCollate
14b0: 4e 65 65 64 65 64 3b 20 20 20 2f 2a 20 43 6f 6c  Needed;   /* Col
14c0: 6c 61 74 69 6f 6e 20 6e 65 65 64 65 64 20 73 63  lation needed sc
14d0: 72 69 70 74 20 2a 2f 0a 20 20 53 71 6c 50 72 65  ript */.  SqlPre
14e0: 70 61 72 65 64 53 74 6d 74 20 2a 73 74 6d 74 4c  paredStmt *stmtL
14f0: 69 73 74 3b 20 2f 2a 20 4c 69 73 74 20 6f 66 20  ist; /* List of 
1500: 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
1510: 6e 74 73 2a 2f 0a 20 20 53 71 6c 50 72 65 70 61  nts*/.  SqlPrepa
1520: 72 65 64 53 74 6d 74 20 2a 73 74 6d 74 4c 61 73  redStmt *stmtLas
1530: 74 3b 20 2f 2a 20 4c 61 73 74 20 73 74 61 74 65  t; /* Last state
1540: 6d 65 6e 74 20 69 6e 20 74 68 65 20 6c 69 73 74  ment in the list
1550: 20 2a 2f 0a 20 20 69 6e 74 20 6d 61 78 53 74 6d   */.  int maxStm
1560: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
1570: 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 6d 61 78   /* The next max
1580: 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 73  imum number of s
1590: 74 6d 74 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74  tmtList */.  int
15a0: 20 6e 53 74 6d 74 3b 20 20 20 20 20 20 20 20 20   nStmt;         
15b0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
15c0: 72 20 6f 66 20 73 74 61 74 65 6d 65 6e 74 73 20  r of statements 
15d0: 69 6e 20 73 74 6d 74 4c 69 73 74 20 2a 2f 0a 20  in stmtList */. 
15e0: 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c   IncrblobChannel
15f0: 20 2a 70 49 6e 63 72 62 6c 6f 62 3b 2f 2a 20 4c   *pIncrblob;/* L
1600: 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 6f 70  inked list of op
1610: 65 6e 20 69 6e 63 72 62 6c 6f 62 20 63 68 61 6e  en incrblob chan
1620: 6e 65 6c 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53  nels */.  int nS
1630: 74 65 70 2c 20 6e 53 6f 72 74 2c 20 6e 49 6e 64  tep, nSort, nInd
1640: 65 78 3b 20 20 2f 2a 20 53 74 61 74 69 73 74 69  ex;  /* Statisti
1650: 63 73 20 66 6f 72 20 6d 6f 73 74 20 72 65 63 65  cs for most rece
1660: 6e 74 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a  nt operation */.
1670: 20 20 69 6e 74 20 6e 54 72 61 6e 73 61 63 74 69    int nTransacti
1680: 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  on;          /* 
1690: 4e 75 6d 62 65 72 20 6f 66 20 6e 65 73 74 65 64  Number of nested
16a0: 20 5b 74 72 61 6e 73 61 63 74 69 6f 6e 5d 20 6d   [transaction] m
16b0: 65 74 68 6f 64 73 20 2a 2f 0a 23 69 66 64 65 66  ethods */.#ifdef
16c0: 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69   SQLITE_TEST.  i
16d0: 6e 74 20 62 4c 65 67 61 63 79 50 72 65 70 61 72  nt bLegacyPrepar
16e0: 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75  e;        /* Tru
16f0: 65 20 74 6f 20 75 73 65 20 73 71 6c 69 74 65 33  e to use sqlite3
1700: 5f 70 72 65 70 61 72 65 28 29 20 2a 2f 0a 23 65  _prepare() */.#e
1710: 6e 64 69 66 0a 7d 3b 0a 0a 73 74 72 75 63 74 20  ndif.};..struct 
1720: 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20  IncrblobChannel 
1730: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62  {.  sqlite3_blob
1740: 20 2a 70 42 6c 6f 62 3b 20 20 20 20 20 20 2f 2a   *pBlob;      /*
1750: 20 73 71 6c 69 74 65 33 20 62 6c 6f 62 20 68 61   sqlite3 blob ha
1760: 6e 64 6c 65 20 2a 2f 0a 20 20 53 71 6c 69 74 65  ndle */.  Sqlite
1770: 44 62 20 2a 70 44 62 3b 20 20 20 20 20 20 20 20  Db *pDb;        
1780: 20 20 20 20 2f 2a 20 41 73 73 6f 63 69 61 74 65      /* Associate
1790: 64 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  d database conne
17a0: 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  ction */.  int i
17b0: 53 65 65 6b 3b 20 20 20 20 20 20 20 20 20 20 20  Seek;           
17c0: 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
17d0: 73 65 65 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 20  seek offset */. 
17e0: 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61   Tcl_Channel cha
17f0: 6e 6e 65 6c 3b 20 20 20 20 20 20 2f 2a 20 43 68  nnel;      /* Ch
1800: 61 6e 6e 65 6c 20 69 64 65 6e 74 69 66 69 65 72  annel identifier
1810: 20 2a 2f 0a 20 20 49 6e 63 72 62 6c 6f 62 43 68   */.  IncrblobCh
1820: 61 6e 6e 65 6c 20 2a 70 4e 65 78 74 3b 20 20 20  annel *pNext;   
1830: 2f 2a 20 4c 69 6e 6b 65 64 20 6c 69 73 74 20 6f  /* Linked list o
1840: 66 20 61 6c 6c 20 6f 70 65 6e 20 69 6e 63 72 62  f all open incrb
1850: 6c 6f 62 20 63 68 61 6e 6e 65 6c 73 20 2a 2f 0a  lob channels */.
1860: 20 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65    IncrblobChanne
1870: 6c 20 2a 70 50 72 65 76 3b 20 20 20 2f 2a 20 4c  l *pPrev;   /* L
1880: 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 61 6c  inked list of al
1890: 6c 20 6f 70 65 6e 20 69 6e 63 72 62 6c 6f 62 20  l open incrblob 
18a0: 63 68 61 6e 6e 65 6c 73 20 2a 2f 0a 7d 3b 0a 0a  channels */.};..
18b0: 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61 20  /*.** Compute a 
18c0: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 74 68  string length th
18d0: 61 74 20 69 73 20 6c 69 6d 69 74 65 64 20 74 6f  at is limited to
18e0: 20 77 68 61 74 20 63 61 6e 20 62 65 20 73 74 6f   what can be sto
18f0: 72 65 64 20 69 6e 0a 2a 2a 20 6c 6f 77 65 72 20  red in.** lower 
1900: 33 30 20 62 69 74 73 20 6f 66 20 61 20 33 32 2d  30 bits of a 32-
1910: 62 69 74 20 73 69 67 6e 65 64 20 69 6e 74 65 67  bit signed integ
1920: 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
1930: 74 20 73 74 72 6c 65 6e 33 30 28 63 6f 6e 73 74  t strlen30(const
1940: 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 63 6f 6e   char *z){.  con
1950: 73 74 20 63 68 61 72 20 2a 7a 32 20 3d 20 7a 3b  st char *z2 = z;
1960: 0a 20 20 77 68 69 6c 65 28 20 2a 7a 32 20 29 7b  .  while( *z2 ){
1970: 20 7a 32 2b 2b 3b 20 7d 0a 20 20 72 65 74 75 72   z2++; }.  retur
1980: 6e 20 30 78 33 66 66 66 66 66 66 66 20 26 20 28  n 0x3fffffff & (
1990: 69 6e 74 29 28 7a 32 20 2d 20 7a 29 3b 0a 7d 0a  int)(z2 - z);.}.
19a0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
19b0: 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 2f  _OMIT_INCRBLOB./
19c0: 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 69  *.** Close all i
19d0: 6e 63 72 62 6c 6f 62 20 63 68 61 6e 6e 65 6c 73  ncrblob channels
19e0: 20 6f 70 65 6e 65 64 20 75 73 69 6e 67 20 64 61   opened using da
19f0: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
1a00: 6e 20 70 44 62 2e 0a 2a 2a 20 54 68 69 73 20 69  n pDb..** This i
1a10: 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 73 68  s called when sh
1a20: 75 74 74 69 6e 67 20 64 6f 77 6e 20 74 68 65 20  utting down the 
1a30: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
1a40: 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ion..*/.static v
1a50: 6f 69 64 20 63 6c 6f 73 65 49 6e 63 72 62 6c 6f  oid closeIncrblo
1a60: 62 43 68 61 6e 6e 65 6c 73 28 53 71 6c 69 74 65  bChannels(Sqlite
1a70: 44 62 20 2a 70 44 62 29 7b 0a 20 20 49 6e 63 72  Db *pDb){.  Incr
1a80: 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 70 3b 0a  blobChannel *p;.
1a90: 20 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65    IncrblobChanne
1aa0: 6c 20 2a 70 4e 65 78 74 3b 0a 0a 20 20 66 6f 72  l *pNext;..  for
1ab0: 28 70 3d 70 44 62 2d 3e 70 49 6e 63 72 62 6c 6f  (p=pDb->pIncrblo
1ac0: 62 3b 20 70 3b 20 70 3d 70 4e 65 78 74 29 7b 0a  b; p; p=pNext){.
1ad0: 20 20 20 20 70 4e 65 78 74 20 3d 20 70 2d 3e 70      pNext = p->p
1ae0: 4e 65 78 74 3b 0a 0a 20 20 20 20 2f 2a 20 4e 6f  Next;..    /* No
1af0: 74 65 3a 20 43 61 6c 6c 69 6e 67 20 75 6e 72 65  te: Calling unre
1b00: 67 69 73 74 65 72 20 68 65 72 65 20 63 61 6c 6c  gister here call
1b10: 20 54 63 6c 5f 43 6c 6f 73 65 20 6f 6e 20 74 68   Tcl_Close on th
1b20: 65 20 69 6e 63 72 62 6c 6f 62 20 63 68 61 6e 6e  e incrblob chann
1b30: 65 6c 2c 20 0a 20 20 20 20 2a 2a 20 77 68 69 63  el, .    ** whic
1b40: 68 20 64 65 6c 65 74 65 73 20 74 68 65 20 49 6e  h deletes the In
1b50: 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 73 74  crblobChannel st
1b60: 72 75 63 74 75 72 65 20 61 74 20 2a 70 2e 20 53  ructure at *p. S
1b70: 6f 20 64 6f 20 6e 6f 74 0a 20 20 20 20 2a 2a 20  o do not.    ** 
1b80: 63 61 6c 6c 20 54 63 6c 5f 46 72 65 65 28 29 20  call Tcl_Free() 
1b90: 68 65 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  here..    */.   
1ba0: 20 54 63 6c 5f 55 6e 72 65 67 69 73 74 65 72 43   Tcl_UnregisterC
1bb0: 68 61 6e 6e 65 6c 28 70 44 62 2d 3e 69 6e 74 65  hannel(pDb->inte
1bc0: 72 70 2c 20 70 2d 3e 63 68 61 6e 6e 65 6c 29 3b  rp, p->channel);
1bd0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  .  }.}../*.** Cl
1be0: 6f 73 65 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74  ose an increment
1bf0: 61 6c 20 62 6c 6f 62 20 63 68 61 6e 6e 65 6c 2e  al blob channel.
1c00: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69  .*/.static int i
1c10: 6e 63 72 62 6c 6f 62 43 6c 6f 73 65 28 43 6c 69  ncrblobClose(Cli
1c20: 65 6e 74 44 61 74 61 20 69 6e 73 74 61 6e 63 65  entData instance
1c30: 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70  Data, Tcl_Interp
1c40: 20 2a 69 6e 74 65 72 70 29 7b 0a 20 20 49 6e 63   *interp){.  Inc
1c50: 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 70 20  rblobChannel *p 
1c60: 3d 20 28 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e  = (IncrblobChann
1c70: 65 6c 20 2a 29 69 6e 73 74 61 6e 63 65 44 61 74  el *)instanceDat
1c80: 61 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71  a;.  int rc = sq
1c90: 6c 69 74 65 33 5f 62 6c 6f 62 5f 63 6c 6f 73 65  lite3_blob_close
1ca0: 28 70 2d 3e 70 42 6c 6f 62 29 3b 0a 20 20 73 71  (p->pBlob);.  sq
1cb0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 70  lite3 *db = p->p
1cc0: 44 62 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 52 65  Db->db;..  /* Re
1cd0: 6d 6f 76 65 20 74 68 65 20 63 68 61 6e 6e 65 6c  move the channel
1ce0: 20 66 72 6f 6d 20 74 68 65 20 53 71 6c 69 74 65   from the Sqlite
1cf0: 44 62 2e 70 49 6e 63 72 62 6c 6f 62 20 6c 69 73  Db.pIncrblob lis
1d00: 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  t. */.  if( p->p
1d10: 4e 65 78 74 20 29 7b 0a 20 20 20 20 70 2d 3e 70  Next ){.    p->p
1d20: 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 2d  Next->pPrev = p-
1d30: 3e 70 50 72 65 76 3b 0a 20 20 7d 0a 20 20 69 66  >pPrev;.  }.  if
1d40: 28 20 70 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20  ( p->pPrev ){.  
1d50: 20 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78    p->pPrev->pNex
1d60: 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20  t = p->pNext;.  
1d70: 7d 0a 20 20 69 66 28 20 70 2d 3e 70 44 62 2d 3e  }.  if( p->pDb->
1d80: 70 49 6e 63 72 62 6c 6f 62 3d 3d 70 20 29 7b 0a  pIncrblob==p ){.
1d90: 20 20 20 20 70 2d 3e 70 44 62 2d 3e 70 49 6e 63      p->pDb->pInc
1da0: 72 62 6c 6f 62 20 3d 20 70 2d 3e 70 4e 65 78 74  rblob = p->pNext
1db0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 72 65 65  ;.  }..  /* Free
1dc0: 20 74 68 65 20 49 6e 63 72 62 6c 6f 62 43 68 61   the IncrblobCha
1dd0: 6e 6e 65 6c 20 73 74 72 75 63 74 75 72 65 20 2a  nnel structure *
1de0: 2f 0a 20 20 54 63 6c 5f 46 72 65 65 28 28 63 68  /.  Tcl_Free((ch
1df0: 61 72 20 2a 29 70 29 3b 0a 0a 20 20 69 66 28 20  ar *)p);..  if( 
1e00: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1e10: 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75  .    Tcl_SetResu
1e20: 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72  lt(interp, (char
1e30: 20 2a 29 73 71 6c 69 74 65 33 5f 65 72 72 6d 73   *)sqlite3_errms
1e40: 67 28 64 62 29 2c 20 54 43 4c 5f 56 4f 4c 41 54  g(db), TCL_VOLAT
1e50: 49 4c 45 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ILE);.    return
1e60: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
1e70: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
1e80: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 64  .}../*.** Read d
1e90: 61 74 61 20 66 72 6f 6d 20 61 6e 20 69 6e 63 72  ata from an incr
1ea0: 65 6d 65 6e 74 61 6c 20 62 6c 6f 62 20 63 68 61  emental blob cha
1eb0: 6e 6e 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  nnel..*/.static 
1ec0: 69 6e 74 20 69 6e 63 72 62 6c 6f 62 49 6e 70 75  int incrblobInpu
1ed0: 74 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20  t(.  ClientData 
1ee0: 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 20 0a 20  instanceData, . 
1ef0: 20 63 68 61 72 20 2a 62 75 66 2c 20 0a 20 20 69   char *buf, .  i
1f00: 6e 74 20 62 75 66 53 69 7a 65 2c 0a 20 20 69 6e  nt bufSize,.  in
1f10: 74 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 0a  t *errorCodePtr.
1f20: 29 7b 0a 20 20 49 6e 63 72 62 6c 6f 62 43 68 61  ){.  IncrblobCha
1f30: 6e 6e 65 6c 20 2a 70 20 3d 20 28 49 6e 63 72 62  nnel *p = (Incrb
1f40: 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 29 69 6e 73  lobChannel *)ins
1f50: 74 61 6e 63 65 44 61 74 61 3b 0a 20 20 69 6e 74  tanceData;.  int
1f60: 20 6e 52 65 61 64 20 3d 20 62 75 66 53 69 7a 65   nRead = bufSize
1f70: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  ;         /* Num
1f80: 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20  ber of bytes to 
1f90: 72 65 61 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 42  read */.  int nB
1fa0: 6c 6f 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  lob;            
1fb0: 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20         /* Total 
1fc0: 73 69 7a 65 20 6f 66 20 74 68 65 20 62 6c 6f 62  size of the blob
1fd0: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
1fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ff0: 20 20 20 2f 2a 20 73 71 6c 69 74 65 20 65 72 72     /* sqlite err
2000: 6f 72 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 6e 42  or code */..  nB
2010: 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c  lob = sqlite3_bl
2020: 6f 62 5f 62 79 74 65 73 28 70 2d 3e 70 42 6c 6f  ob_bytes(p->pBlo
2030: 62 29 3b 0a 20 20 69 66 28 20 28 70 2d 3e 69 53  b);.  if( (p->iS
2040: 65 65 6b 2b 6e 52 65 61 64 29 3e 6e 42 6c 6f 62  eek+nRead)>nBlob
2050: 20 29 7b 0a 20 20 20 20 6e 52 65 61 64 20 3d 20   ){.    nRead = 
2060: 6e 42 6c 6f 62 2d 70 2d 3e 69 53 65 65 6b 3b 0a  nBlob-p->iSeek;.
2070: 20 20 7d 0a 20 20 69 66 28 20 6e 52 65 61 64 3c    }.  if( nRead<
2080: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
2090: 20 30 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20   0;.  }..  rc = 
20a0: 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 72 65 61  sqlite3_blob_rea
20b0: 64 28 70 2d 3e 70 42 6c 6f 62 2c 20 28 76 6f 69  d(p->pBlob, (voi
20c0: 64 20 2a 29 62 75 66 2c 20 6e 52 65 61 64 2c 20  d *)buf, nRead, 
20d0: 70 2d 3e 69 53 65 65 6b 29 3b 0a 20 20 69 66 28  p->iSeek);.  if(
20e0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
20f0: 7b 0a 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65  {.    *errorCode
2100: 50 74 72 20 3d 20 72 63 3b 0a 20 20 20 20 72 65  Ptr = rc;.    re
2110: 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20  turn -1;.  }..  
2120: 70 2d 3e 69 53 65 65 6b 20 2b 3d 20 6e 52 65 61  p->iSeek += nRea
2130: 64 3b 0a 20 20 72 65 74 75 72 6e 20 6e 52 65 61  d;.  return nRea
2140: 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  d;.}../*.** Writ
2150: 65 20 64 61 74 61 20 74 6f 20 61 6e 20 69 6e 63  e data to an inc
2160: 72 65 6d 65 6e 74 61 6c 20 62 6c 6f 62 20 63 68  remental blob ch
2170: 61 6e 6e 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63  annel..*/.static
2180: 20 69 6e 74 20 69 6e 63 72 62 6c 6f 62 4f 75 74   int incrblobOut
2190: 70 75 74 28 0a 20 20 43 6c 69 65 6e 74 44 61 74  put(.  ClientDat
21a0: 61 20 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 20  a instanceData, 
21b0: 0a 20 20 43 4f 4e 53 54 20 63 68 61 72 20 2a 62  .  CONST char *b
21c0: 75 66 2c 20 0a 20 20 69 6e 74 20 74 6f 57 72 69  uf, .  int toWri
21d0: 74 65 2c 0a 20 20 69 6e 74 20 2a 65 72 72 6f 72  te,.  int *error
21e0: 43 6f 64 65 50 74 72 0a 29 7b 0a 20 20 49 6e 63  CodePtr.){.  Inc
21f0: 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 70 20  rblobChannel *p 
2200: 3d 20 28 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e  = (IncrblobChann
2210: 65 6c 20 2a 29 69 6e 73 74 61 6e 63 65 44 61 74  el *)instanceDat
2220: 61 3b 0a 20 20 69 6e 74 20 6e 57 72 69 74 65 20  a;.  int nWrite 
2230: 3d 20 74 6f 57 72 69 74 65 3b 20 20 20 20 20 20  = toWrite;      
2240: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
2250: 79 74 65 73 20 74 6f 20 77 72 69 74 65 20 2a 2f  ytes to write */
2260: 0a 20 20 69 6e 74 20 6e 42 6c 6f 62 3b 20 20 20  .  int nBlob;   
2270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2280: 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20 6f 66  /* Total size of
2290: 20 74 68 65 20 62 6c 6f 62 20 2a 2f 0a 20 20 69   the blob */.  i
22a0: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
22b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
22c0: 71 6c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  qlite error code
22d0: 20 2a 2f 0a 0a 20 20 6e 42 6c 6f 62 20 3d 20 73   */..  nBlob = s
22e0: 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 62 79 74 65  qlite3_blob_byte
22f0: 73 28 70 2d 3e 70 42 6c 6f 62 29 3b 0a 20 20 69  s(p->pBlob);.  i
2300: 66 28 20 28 70 2d 3e 69 53 65 65 6b 2b 6e 57 72  f( (p->iSeek+nWr
2310: 69 74 65 29 3e 6e 42 6c 6f 62 20 29 7b 0a 20 20  ite)>nBlob ){.  
2320: 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20    *errorCodePtr 
2330: 3d 20 45 49 4e 56 41 4c 3b 0a 20 20 20 20 72 65  = EINVAL;.    re
2340: 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 20 20 69  turn -1;.  }.  i
2350: 66 28 20 6e 57 72 69 74 65 3c 3d 30 20 29 7b 0a  f( nWrite<=0 ){.
2360: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
2370: 7d 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  }..  rc = sqlite
2380: 33 5f 62 6c 6f 62 5f 77 72 69 74 65 28 70 2d 3e  3_blob_write(p->
2390: 70 42 6c 6f 62 2c 20 28 76 6f 69 64 20 2a 29 62  pBlob, (void *)b
23a0: 75 66 2c 20 6e 57 72 69 74 65 2c 20 70 2d 3e 69  uf, nWrite, p->i
23b0: 53 65 65 6b 29 3b 0a 20 20 69 66 28 20 72 63 21  Seek);.  if( rc!
23c0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
23d0: 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20    *errorCodePtr 
23e0: 3d 20 45 49 4f 3b 0a 20 20 20 20 72 65 74 75 72  = EIO;.    retur
23f0: 6e 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 70 2d 3e  n -1;.  }..  p->
2400: 69 53 65 65 6b 20 2b 3d 20 6e 57 72 69 74 65 3b  iSeek += nWrite;
2410: 0a 20 20 72 65 74 75 72 6e 20 6e 57 72 69 74 65  .  return nWrite
2420: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20  ;.}../*.** Seek 
2430: 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 62  an incremental b
2440: 6c 6f 62 20 63 68 61 6e 6e 65 6c 2e 0a 2a 2f 0a  lob channel..*/.
2450: 73 74 61 74 69 63 20 69 6e 74 20 69 6e 63 72 62  static int incrb
2460: 6c 6f 62 53 65 65 6b 28 0a 20 20 43 6c 69 65 6e  lobSeek(.  Clien
2470: 74 44 61 74 61 20 69 6e 73 74 61 6e 63 65 44 61  tData instanceDa
2480: 74 61 2c 20 0a 20 20 6c 6f 6e 67 20 6f 66 66 73  ta, .  long offs
2490: 65 74 2c 0a 20 20 69 6e 74 20 73 65 65 6b 4d 6f  et,.  int seekMo
24a0: 64 65 2c 0a 20 20 69 6e 74 20 2a 65 72 72 6f 72  de,.  int *error
24b0: 43 6f 64 65 50 74 72 0a 29 7b 0a 20 20 49 6e 63  CodePtr.){.  Inc
24c0: 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 70 20  rblobChannel *p 
24d0: 3d 20 28 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e  = (IncrblobChann
24e0: 65 6c 20 2a 29 69 6e 73 74 61 6e 63 65 44 61 74  el *)instanceDat
24f0: 61 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 73 65  a;..  switch( se
2500: 65 6b 4d 6f 64 65 20 29 7b 0a 20 20 20 20 63 61  ekMode ){.    ca
2510: 73 65 20 53 45 45 4b 5f 53 45 54 3a 0a 20 20 20  se SEEK_SET:.   
2520: 20 20 20 70 2d 3e 69 53 65 65 6b 20 3d 20 6f 66     p->iSeek = of
2530: 66 73 65 74 3b 0a 20 20 20 20 20 20 62 72 65 61  fset;.      brea
2540: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 45 45 4b  k;.    case SEEK
2550: 5f 43 55 52 3a 0a 20 20 20 20 20 20 70 2d 3e 69  _CUR:.      p->i
2560: 53 65 65 6b 20 2b 3d 20 6f 66 66 73 65 74 3b 0a  Seek += offset;.
2570: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2580: 20 63 61 73 65 20 53 45 45 4b 5f 45 4e 44 3a 0a   case SEEK_END:.
2590: 20 20 20 20 20 20 70 2d 3e 69 53 65 65 6b 20 3d        p->iSeek =
25a0: 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 62 79   sqlite3_blob_by
25b0: 74 65 73 28 70 2d 3e 70 42 6c 6f 62 29 20 2b 20  tes(p->pBlob) + 
25c0: 6f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 62 72  offset;.      br
25d0: 65 61 6b 3b 0a 0a 20 20 20 20 64 65 66 61 75 6c  eak;..    defaul
25e0: 74 3a 20 61 73 73 65 72 74 28 21 22 42 61 64 20  t: assert(!"Bad 
25f0: 73 65 65 6b 4d 6f 64 65 22 29 3b 0a 20 20 7d 0a  seekMode");.  }.
2600: 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 69 53 65  .  return p->iSe
2610: 65 6b 3b 0a 7d 0a 0a 0a 73 74 61 74 69 63 20 76  ek;.}...static v
2620: 6f 69 64 20 69 6e 63 72 62 6c 6f 62 57 61 74 63  oid incrblobWatc
2630: 68 28 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73  h(ClientData ins
2640: 74 61 6e 63 65 44 61 74 61 2c 20 69 6e 74 20 6d  tanceData, int m
2650: 6f 64 65 29 7b 20 0a 20 20 2f 2a 20 4e 4f 2d 4f  ode){ .  /* NO-O
2660: 50 20 2a 2f 20 0a 7d 0a 73 74 61 74 69 63 20 69  P */ .}.static i
2670: 6e 74 20 69 6e 63 72 62 6c 6f 62 48 61 6e 64 6c  nt incrblobHandl
2680: 65 28 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73  e(ClientData ins
2690: 74 61 6e 63 65 44 61 74 61 2c 20 69 6e 74 20 64  tanceData, int d
26a0: 69 72 2c 20 43 6c 69 65 6e 74 44 61 74 61 20 2a  ir, ClientData *
26b0: 68 50 74 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  hPtr){.  return 
26c0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 73 74  TCL_ERROR;.}..st
26d0: 61 74 69 63 20 54 63 6c 5f 43 68 61 6e 6e 65 6c  atic Tcl_Channel
26e0: 54 79 70 65 20 49 6e 63 72 62 6c 6f 62 43 68 61  Type IncrblobCha
26f0: 6e 6e 65 6c 54 79 70 65 20 3d 20 7b 0a 20 20 22  nnelType = {.  "
2700: 69 6e 63 72 62 6c 6f 62 22 2c 20 20 20 20 20 20  incrblob",      
2710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2720: 20 20 2f 2a 20 74 79 70 65 4e 61 6d 65 20 20 20    /* typeName   
2730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2740: 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 54            */.  T
2750: 43 4c 5f 43 48 41 4e 4e 45 4c 5f 56 45 52 53 49  CL_CHANNEL_VERSI
2760: 4f 4e 5f 32 2c 20 20 20 20 20 20 20 20 20 20 20  ON_2,           
2770: 20 20 2f 2a 20 76 65 72 73 69 6f 6e 20 20 20 20    /* version    
2780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2790: 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 69            */.  i
27a0: 6e 63 72 62 6c 6f 62 43 6c 6f 73 65 2c 20 20 20  ncrblobClose,   
27b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27c0: 20 20 2f 2a 20 63 6c 6f 73 65 50 72 6f 63 20 20    /* closeProc  
27d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27e0: 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 69            */.  i
27f0: 6e 63 72 62 6c 6f 62 49 6e 70 75 74 2c 20 20 20  ncrblobInput,   
2800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2810: 20 20 2f 2a 20 69 6e 70 75 74 50 72 6f 63 20 20    /* inputProc  
2820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2830: 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 69            */.  i
2840: 6e 63 72 62 6c 6f 62 4f 75 74 70 75 74 2c 20 20  ncrblobOutput,  
2850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2860: 20 20 2f 2a 20 6f 75 74 70 75 74 50 72 6f 63 20    /* outputProc 
2870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2880: 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 69            */.  i
2890: 6e 63 72 62 6c 6f 62 53 65 65 6b 2c 20 20 20 20  ncrblobSeek,    
28a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b0: 20 20 2f 2a 20 73 65 65 6b 50 72 6f 63 20 20 20    /* seekProc   
28c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28d0: 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 30            */.  0
28e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
28f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2900: 20 20 2f 2a 20 73 65 74 4f 70 74 69 6f 6e 50 72    /* setOptionPr
2910: 6f 63 20 20 20 20 20 20 20 20 20 20 20 20 20 20  oc              
2920: 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 30            */.  0
2930: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2950: 20 20 2f 2a 20 67 65 74 4f 70 74 69 6f 6e 50 72    /* getOptionPr
2960: 6f 63 20 20 20 20 20 20 20 20 20 20 20 20 20 20  oc              
2970: 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 69            */.  i
2980: 6e 63 72 62 6c 6f 62 57 61 74 63 68 2c 20 20 20  ncrblobWatch,   
2990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29a0: 20 20 2f 2a 20 77 61 74 63 68 50 72 6f 63 20 28    /* watchProc (
29b0: 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 29  this is a no-op)
29c0: 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 69            */.  i
29d0: 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 2c 20 20  ncrblobHandle,  
29e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29f0: 20 20 2f 2a 20 67 65 74 48 61 6e 64 6c 65 50 72    /* getHandlePr
2a00: 6f 63 20 28 61 6c 77 61 79 73 20 72 65 74 75 72  oc (always retur
2a10: 6e 73 20 65 72 72 6f 72 29 20 2a 2f 0a 20 20 30  ns error) */.  0
2a20: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a40: 20 20 2f 2a 20 63 6c 6f 73 65 32 50 72 6f 63 20    /* close2Proc 
2a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a60: 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 30            */.  0
2a70: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a90: 20 20 2f 2a 20 62 6c 6f 63 6b 4d 6f 64 65 50 72    /* blockModePr
2aa0: 6f 63 20 20 20 20 20 20 20 20 20 20 20 20 20 20  oc              
2ab0: 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 30            */.  0
2ac0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ae0: 20 20 2f 2a 20 66 6c 75 73 68 50 72 6f 63 20 20    /* flushProc  
2af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b00: 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 30            */.  0
2b10: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b30: 20 20 2f 2a 20 68 61 6e 64 6c 65 72 50 72 6f 63    /* handlerProc
2b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b50: 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 30            */.  0
2b60: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b80: 20 20 2f 2a 20 77 69 64 65 53 65 65 6b 50 72 6f    /* wideSeekPro
2b90: 63 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c               
2ba0: 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 7d 3b 0a            */.};.
2bb0: 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
2bc0: 6e 65 77 20 69 6e 63 72 62 6c 6f 62 20 63 68 61  new incrblob cha
2bd0: 6e 6e 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  nnel..*/.static 
2be0: 69 6e 74 20 63 72 65 61 74 65 49 6e 63 72 62 6c  int createIncrbl
2bf0: 6f 62 43 68 61 6e 6e 65 6c 28 0a 20 20 54 63 6c  obChannel(.  Tcl
2c00: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
2c10: 20 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44   .  SqliteDb *pD
2c20: 62 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  b, .  const char
2c30: 20 2a 7a 44 62 2c 0a 20 20 63 6f 6e 73 74 20 63   *zDb,.  const c
2c40: 68 61 72 20 2a 7a 54 61 62 6c 65 2c 20 0a 20 20  har *zTable, .  
2c50: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c  const char *zCol
2c60: 75 6d 6e 2c 20 0a 20 20 73 71 6c 69 74 65 5f 69  umn, .  sqlite_i
2c70: 6e 74 36 34 20 69 52 6f 77 2c 0a 20 20 69 6e 74  nt64 iRow,.  int
2c80: 20 69 73 52 65 61 64 6f 6e 6c 79 0a 29 7b 0a 20   isReadonly.){. 
2c90: 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c   IncrblobChannel
2ca0: 20 2a 70 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a   *p;.  sqlite3 *
2cb0: 64 62 20 3d 20 70 44 62 2d 3e 64 62 3b 0a 20 20  db = pDb->db;.  
2cc0: 73 71 6c 69 74 65 33 5f 62 6c 6f 62 20 2a 70 42  sqlite3_blob *pB
2cd0: 6c 6f 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  lob;.  int rc;. 
2ce0: 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 54 43 4c   int flags = TCL
2cf0: 5f 52 45 41 44 41 42 4c 45 7c 28 69 73 52 65 61  _READABLE|(isRea
2d00: 64 6f 6e 6c 79 20 3f 20 30 20 3a 20 54 43 4c 5f  donly ? 0 : TCL_
2d10: 57 52 49 54 41 42 4c 45 29 3b 0a 0a 20 20 2f 2a  WRITABLE);..  /*
2d20: 20 54 68 69 73 20 76 61 72 69 61 62 6c 65 20 69   This variable i
2d30: 73 20 75 73 65 64 20 74 6f 20 6e 61 6d 65 20 74  s used to name t
2d40: 68 65 20 63 68 61 6e 6e 65 6c 73 3a 20 22 69 6e  he channels: "in
2d50: 63 72 62 6c 6f 62 5f 5b 69 6e 63 72 20 63 6f 75  crblob_[incr cou
2d60: 6e 74 5d 22 20 2a 2f 0a 20 20 73 74 61 74 69 63  nt]" */.  static
2d70: 20 69 6e 74 20 63 6f 75 6e 74 20 3d 20 30 3b 0a   int count = 0;.
2d80: 20 20 63 68 61 72 20 7a 43 68 61 6e 6e 65 6c 5b    char zChannel[
2d90: 36 34 5d 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c  64];..  rc = sql
2da0: 69 74 65 33 5f 62 6c 6f 62 5f 6f 70 65 6e 28 64  ite3_blob_open(d
2db0: 62 2c 20 7a 44 62 2c 20 7a 54 61 62 6c 65 2c 20  b, zDb, zTable, 
2dc0: 7a 43 6f 6c 75 6d 6e 2c 20 69 52 6f 77 2c 20 21  zColumn, iRow, !
2dd0: 69 73 52 65 61 64 6f 6e 6c 79 2c 20 26 70 42 6c  isReadonly, &pBl
2de0: 6f 62 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ob);.  if( rc!=S
2df0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2e00: 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
2e10: 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 73 71  terp, (char *)sq
2e20: 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62  lite3_errmsg(pDb
2e30: 2d 3e 64 62 29 2c 20 54 43 4c 5f 56 4f 4c 41 54  ->db), TCL_VOLAT
2e40: 49 4c 45 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ILE);.    return
2e50: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
2e60: 0a 20 20 70 20 3d 20 28 49 6e 63 72 62 6c 6f 62  .  p = (Incrblob
2e70: 43 68 61 6e 6e 65 6c 20 2a 29 54 63 6c 5f 41 6c  Channel *)Tcl_Al
2e80: 6c 6f 63 28 73 69 7a 65 6f 66 28 49 6e 63 72 62  loc(sizeof(Incrb
2e90: 6c 6f 62 43 68 61 6e 6e 65 6c 29 29 3b 0a 20 20  lobChannel));.  
2ea0: 70 2d 3e 69 53 65 65 6b 20 3d 20 30 3b 0a 20 20  p->iSeek = 0;.  
2eb0: 70 2d 3e 70 42 6c 6f 62 20 3d 20 70 42 6c 6f 62  p->pBlob = pBlob
2ec0: 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  ;..  sqlite3_snp
2ed0: 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 43 68  rintf(sizeof(zCh
2ee0: 61 6e 6e 65 6c 29 2c 20 7a 43 68 61 6e 6e 65 6c  annel), zChannel
2ef0: 2c 20 22 69 6e 63 72 62 6c 6f 62 5f 25 64 22 2c  , "incrblob_%d",
2f00: 20 2b 2b 63 6f 75 6e 74 29 3b 0a 20 20 70 2d 3e   ++count);.  p->
2f10: 63 68 61 6e 6e 65 6c 20 3d 20 54 63 6c 5f 43 72  channel = Tcl_Cr
2f20: 65 61 74 65 43 68 61 6e 6e 65 6c 28 26 49 6e 63  eateChannel(&Inc
2f30: 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 54 79 70 65  rblobChannelType
2f40: 2c 20 7a 43 68 61 6e 6e 65 6c 2c 20 70 2c 20 66  , zChannel, p, f
2f50: 6c 61 67 73 29 3b 0a 20 20 54 63 6c 5f 52 65 67  lags);.  Tcl_Reg
2f60: 69 73 74 65 72 43 68 61 6e 6e 65 6c 28 69 6e 74  isterChannel(int
2f70: 65 72 70 2c 20 70 2d 3e 63 68 61 6e 6e 65 6c 29  erp, p->channel)
2f80: 3b 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65  ;..  /* Link the
2f90: 20 6e 65 77 20 63 68 61 6e 6e 65 6c 20 69 6e 74   new channel int
2fa0: 6f 20 74 68 65 20 53 71 6c 69 74 65 44 62 2e 70  o the SqliteDb.p
2fb0: 49 6e 63 72 62 6c 6f 62 20 6c 69 73 74 2e 20 2a  Incrblob list. *
2fc0: 2f 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70  /.  p->pNext = p
2fd0: 44 62 2d 3e 70 49 6e 63 72 62 6c 6f 62 3b 0a 20  Db->pIncrblob;. 
2fe0: 20 70 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20   p->pPrev = 0;. 
2ff0: 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 7b   if( p->pNext ){
3000: 0a 20 20 20 20 70 2d 3e 70 4e 65 78 74 2d 3e 70  .    p->pNext->p
3010: 50 72 65 76 20 3d 20 70 3b 0a 20 20 7d 0a 20 20  Prev = p;.  }.  
3020: 70 44 62 2d 3e 70 49 6e 63 72 62 6c 6f 62 20 3d  pDb->pIncrblob =
3030: 20 70 3b 0a 20 20 70 2d 3e 70 44 62 20 3d 20 70   p;.  p->pDb = p
3040: 44 62 3b 0a 0a 20 20 54 63 6c 5f 53 65 74 52 65  Db;..  Tcl_SetRe
3050: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68  sult(interp, (ch
3060: 61 72 20 2a 29 54 63 6c 5f 47 65 74 43 68 61 6e  ar *)Tcl_GetChan
3070: 6e 65 6c 4e 61 6d 65 28 70 2d 3e 63 68 61 6e 6e  nelName(p->chann
3080: 65 6c 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c  el), TCL_VOLATIL
3090: 45 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  E);.  return TCL
30a0: 5f 4f 4b 3b 0a 7d 0a 23 65 6c 73 65 20 20 2f 2a  _OK;.}.#else  /*
30b0: 20 65 6c 73 65 20 63 6c 61 75 73 65 20 66 6f 72   else clause for
30c0: 20 22 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45   "#ifndef SQLITE
30d0: 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 22 20  _OMIT_INCRBLOB" 
30e0: 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 63 6c 6f  */.  #define clo
30f0: 73 65 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65  seIncrblobChanne
3100: 6c 73 28 70 44 62 29 0a 23 65 6e 64 69 66 0a 0a  ls(pDb).#endif..
3110: 2f 2a 0a 2a 2a 20 4c 6f 6f 6b 20 61 74 20 74 68  /*.** Look at th
3120: 65 20 73 63 72 69 70 74 20 70 72 65 66 69 78 20  e script prefix 
3130: 69 6e 20 70 43 6d 64 2e 20 20 57 65 20 77 69 6c  in pCmd.  We wil
3140: 6c 20 62 65 20 65 78 65 63 75 74 69 6e 67 20 74  l be executing t
3150: 68 69 73 20 73 63 72 69 70 74 0a 2a 2a 20 61 66  his script.** af
3160: 74 65 72 20 66 69 72 73 74 20 61 70 70 65 6e 64  ter first append
3170: 69 6e 67 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  ing one or more 
3180: 61 72 67 75 6d 65 6e 74 73 2e 20 20 54 68 69 73  arguments.  This
3190: 20 72 6f 75 74 69 6e 65 20 61 6e 61 6c 79 7a 65   routine analyze
31a0: 73 0a 2a 2a 20 74 68 65 20 73 63 72 69 70 74 20  s.** the script 
31b0: 74 6f 20 73 65 65 20 69 66 20 69 74 20 69 73 20  to see if it is 
31c0: 73 61 66 65 20 74 6f 20 75 73 65 20 54 63 6c 5f  safe to use Tcl_
31d0: 45 76 61 6c 4f 62 6a 76 28 29 20 6f 6e 20 74 68  EvalObjv() on th
31e0: 65 20 73 63 72 69 70 74 0a 2a 2a 20 72 61 74 68  e script.** rath
31f0: 65 72 20 74 68 61 6e 20 74 68 65 20 6d 6f 72 65  er than the more
3200: 20 67 65 6e 65 72 61 6c 20 54 63 6c 5f 45 76 61   general Tcl_Eva
3210: 6c 45 78 28 29 2e 20 20 54 63 6c 5f 45 76 61 6c  lEx().  Tcl_Eval
3220: 4f 62 6a 76 28 29 20 69 73 20 6d 75 63 68 0a 2a  Objv() is much.*
3230: 2a 20 66 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20  * faster..**.** 
3240: 53 63 72 69 70 74 73 20 74 68 61 74 20 61 72 65  Scripts that are
3250: 20 73 61 66 65 20 74 6f 20 75 73 65 20 77 69 74   safe to use wit
3260: 68 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 76 28 29  h Tcl_EvalObjv()
3270: 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 0a 2a   consists of a.*
3280: 2a 20 63 6f 6d 6d 61 6e 64 20 6e 61 6d 65 20 66  * command name f
3290: 6f 6c 6c 6f 77 65 64 20 62 79 20 7a 65 72 6f 20  ollowed by zero 
32a0: 6f 72 20 6d 6f 72 65 20 61 72 67 75 6d 65 6e 74  or more argument
32b0: 73 20 77 69 74 68 20 6e 6f 20 5b 2e 2e 2e 5d 20  s with no [...] 
32c0: 6f 72 20 24 0a 2a 2a 20 6f 72 20 7b 2e 2e 2e 7d  or $.** or {...}
32d0: 20 6f 72 20 3b 20 74 6f 20 62 65 20 73 65 65 6e   or ; to be seen
32e0: 20 61 6e 79 77 68 65 72 65 2e 20 20 4d 6f 73 74   anywhere.  Most
32f0: 20 63 61 6c 6c 62 61 63 6b 20 73 63 72 69 70 74   callback script
3300: 73 20 63 6f 6e 73 69 73 74 0a 2a 2a 20 6f 66 20  s consist.** of 
3310: 6a 75 73 74 20 61 20 73 69 6e 67 6c 65 20 70 72  just a single pr
3320: 6f 63 65 64 75 72 65 20 6e 61 6d 65 20 61 6e 64  ocedure name and
3330: 20 74 68 65 79 20 6d 65 65 74 20 74 68 69 73 20   they meet this 
3340: 72 65 71 75 69 72 65 6d 65 6e 74 2e 0a 2a 2f 0a  requirement..*/.
3350: 73 74 61 74 69 63 20 69 6e 74 20 73 61 66 65 54  static int safeT
3360: 6f 55 73 65 45 76 61 6c 4f 62 6a 76 28 54 63 6c  oUseEvalObjv(Tcl
3370: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
3380: 20 54 63 6c 5f 4f 62 6a 20 2a 70 43 6d 64 29 7b   Tcl_Obj *pCmd){
3390: 0a 20 20 2f 2a 20 57 65 20 63 6f 75 6c 64 20 74  .  /* We could t
33a0: 72 79 20 74 6f 20 64 6f 20 73 6f 6d 65 74 68 69  ry to do somethi
33b0: 6e 67 20 77 69 74 68 20 54 63 6c 5f 50 61 72 73  ng with Tcl_Pars
33c0: 65 28 29 2e 20 20 42 75 74 20 77 65 20 77 69 6c  e().  But we wil
33d0: 6c 20 69 6e 73 74 65 61 64 0a 20 20 2a 2a 20 6a  l instead.  ** j
33e0: 75 73 74 20 64 6f 20 61 20 73 65 61 72 63 68 20  ust do a search 
33f0: 66 6f 72 20 66 6f 72 62 69 64 64 65 6e 20 63 68  for forbidden ch
3400: 61 72 61 63 74 65 72 73 2e 20 20 49 66 20 61 6e  aracters.  If an
3410: 79 20 6f 66 20 74 68 65 20 66 6f 72 62 69 64 64  y of the forbidd
3420: 65 6e 0a 20 20 2a 2a 20 63 68 61 72 61 63 74 65  en.  ** characte
3430: 72 73 20 61 70 70 65 61 72 20 69 6e 20 70 43 6d  rs appear in pCm
3440: 64 2c 20 77 65 20 77 69 6c 6c 20 72 65 70 6f 72  d, we will repor
3450: 74 20 74 68 65 20 73 74 72 69 6e 67 20 61 73 20  t the string as 
3460: 75 6e 73 61 66 65 2e 0a 20 20 2a 2f 0a 20 20 63  unsafe..  */.  c
3470: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20  onst char *z;.  
3480: 69 6e 74 20 6e 3b 0a 20 20 7a 20 3d 20 54 63 6c  int n;.  z = Tcl
3490: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
34a0: 6a 28 70 43 6d 64 2c 20 26 6e 29 3b 0a 20 20 77  j(pCmd, &n);.  w
34b0: 68 69 6c 65 28 20 6e 2d 2d 20 3e 20 30 20 29 7b  hile( n-- > 0 ){
34c0: 0a 20 20 20 20 69 6e 74 20 63 20 3d 20 2a 28 7a  .    int c = *(z
34d0: 2b 2b 29 3b 0a 20 20 20 20 69 66 28 20 63 3d 3d  ++);.    if( c==
34e0: 27 24 27 20 7c 7c 20 63 3d 3d 27 5b 27 20 7c 7c  '$' || c=='[' ||
34f0: 20 63 3d 3d 27 3b 27 20 29 20 72 65 74 75 72 6e   c==';' ) return
3500: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
3510: 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e   1;.}../*.** Fin
3520: 64 20 61 6e 20 53 71 6c 46 75 6e 63 20 73 74 72  d an SqlFunc str
3530: 75 63 74 75 72 65 20 77 69 74 68 20 74 68 65 20  ucture with the 
3540: 67 69 76 65 6e 20 6e 61 6d 65 2e 20 20 4f 72 20  given name.  Or 
3550: 63 72 65 61 74 65 20 61 20 6e 65 77 0a 2a 2a 20  create a new.** 
3560: 6f 6e 65 20 69 66 20 61 6e 20 65 78 69 73 74 69  one if an existi
3570: 6e 67 20 6f 6e 65 20 63 61 6e 6e 6f 74 20 62 65  ng one cannot be
3580: 20 66 6f 75 6e 64 2e 20 20 52 65 74 75 72 6e 20   found.  Return 
3590: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
35a0: 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  .** structure..*
35b0: 2f 0a 73 74 61 74 69 63 20 53 71 6c 46 75 6e 63  /.static SqlFunc
35c0: 20 2a 66 69 6e 64 53 71 6c 46 75 6e 63 28 53 71   *findSqlFunc(Sq
35d0: 6c 69 74 65 44 62 20 2a 70 44 62 2c 20 63 6f 6e  liteDb *pDb, con
35e0: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b  st char *zName){
35f0: 0a 20 20 53 71 6c 46 75 6e 63 20 2a 70 2c 20 2a  .  SqlFunc *p, *
3600: 70 4e 65 77 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  pNew;.  int i;. 
3610: 20 70 4e 65 77 20 3d 20 28 53 71 6c 46 75 6e 63   pNew = (SqlFunc
3620: 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28 20 73 69 7a  *)Tcl_Alloc( siz
3630: 65 6f 66 28 2a 70 4e 65 77 29 20 2b 20 73 74 72  eof(*pNew) + str
3640: 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 20 2b 20 31  len30(zName) + 1
3650: 20 29 3b 0a 20 20 70 4e 65 77 2d 3e 7a 4e 61 6d   );.  pNew->zNam
3660: 65 20 3d 20 28 63 68 61 72 2a 29 26 70 4e 65 77  e = (char*)&pNew
3670: 5b 31 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  [1];.  for(i=0; 
3680: 7a 4e 61 6d 65 5b 69 5d 3b 20 69 2b 2b 29 7b 20  zName[i]; i++){ 
3690: 70 4e 65 77 2d 3e 7a 4e 61 6d 65 5b 69 5d 20 3d  pNew->zName[i] =
36a0: 20 74 6f 6c 6f 77 65 72 28 7a 4e 61 6d 65 5b 69   tolower(zName[i
36b0: 5d 29 3b 20 7d 0a 20 20 70 4e 65 77 2d 3e 7a 4e  ]); }.  pNew->zN
36c0: 61 6d 65 5b 69 5d 20 3d 20 30 3b 0a 20 20 66 6f  ame[i] = 0;.  fo
36d0: 72 28 70 3d 70 44 62 2d 3e 70 46 75 6e 63 3b 20  r(p=pDb->pFunc; 
36e0: 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 20  p; p=p->pNext){ 
36f0: 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28  .    if( strcmp(
3700: 70 2d 3e 7a 4e 61 6d 65 2c 20 70 4e 65 77 2d 3e  p->zName, pNew->
3710: 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20  zName)==0 ){.   
3720: 20 20 20 54 63 6c 5f 46 72 65 65 28 28 63 68 61     Tcl_Free((cha
3730: 72 2a 29 70 4e 65 77 29 3b 0a 20 20 20 20 20 20  r*)pNew);.      
3740: 72 65 74 75 72 6e 20 70 3b 0a 20 20 20 20 7d 0a  return p;.    }.
3750: 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 69 6e 74 65    }.  pNew->inte
3760: 72 70 20 3d 20 70 44 62 2d 3e 69 6e 74 65 72 70  rp = pDb->interp
3770: 3b 0a 20 20 70 4e 65 77 2d 3e 70 53 63 72 69 70  ;.  pNew->pScrip
3780: 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70  t = 0;.  pNew->p
3790: 4e 65 78 74 20 3d 20 70 44 62 2d 3e 70 46 75 6e  Next = pDb->pFun
37a0: 63 3b 0a 20 20 70 44 62 2d 3e 70 46 75 6e 63 20  c;.  pDb->pFunc 
37b0: 3d 20 70 4e 65 77 3b 0a 20 20 72 65 74 75 72 6e  = pNew;.  return
37c0: 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pNew;.}../*.** 
37d0: 46 72 65 65 20 61 20 73 69 6e 67 6c 65 20 53 71  Free a single Sq
37e0: 6c 50 72 65 70 61 72 65 64 53 74 6d 74 20 6f 62  lPreparedStmt ob
37f0: 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ject..*/.static 
3800: 76 6f 69 64 20 64 62 46 72 65 65 53 74 6d 74 28  void dbFreeStmt(
3810: 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74 20  SqlPreparedStmt 
3820: 2a 70 53 74 6d 74 29 7b 0a 23 69 66 64 65 66 20  *pStmt){.#ifdef 
3830: 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 66  SQLITE_TEST.  if
3840: 28 20 73 71 6c 69 74 65 33 5f 73 71 6c 28 70 53  ( sqlite3_sql(pS
3850: 74 6d 74 2d 3e 70 53 74 6d 74 29 3d 3d 30 20 29  tmt->pStmt)==0 )
3860: 7b 0a 20 20 20 20 54 63 6c 5f 46 72 65 65 28 28  {.    Tcl_Free((
3870: 63 68 61 72 20 2a 29 70 53 74 6d 74 2d 3e 7a 53  char *)pStmt->zS
3880: 71 6c 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ql);.  }.#endif.
3890: 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
38a0: 7a 65 28 70 53 74 6d 74 2d 3e 70 53 74 6d 74 29  ze(pStmt->pStmt)
38b0: 3b 0a 20 20 54 63 6c 5f 46 72 65 65 28 28 63 68  ;.  Tcl_Free((ch
38c0: 61 72 20 2a 29 70 53 74 6d 74 29 3b 0a 7d 0a 0a  ar *)pStmt);.}..
38d0: 2f 2a 0a 2a 2a 20 46 69 6e 61 6c 69 7a 65 20 61  /*.** Finalize a
38e0: 6e 64 20 66 72 65 65 20 61 20 6c 69 73 74 20 6f  nd free a list o
38f0: 66 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  f prepared state
3900: 6d 65 6e 74 73 0a 2a 2f 0a 73 74 61 74 69 63 20  ments.*/.static 
3910: 76 6f 69 64 20 66 6c 75 73 68 53 74 6d 74 43 61  void flushStmtCa
3920: 63 68 65 28 53 71 6c 69 74 65 44 62 20 2a 70 44  che(SqliteDb *pD
3930: 62 29 7b 0a 20 20 53 71 6c 50 72 65 70 61 72 65  b){.  SqlPrepare
3940: 64 53 74 6d 74 20 2a 70 50 72 65 53 74 6d 74 3b  dStmt *pPreStmt;
3950: 0a 20 20 53 71 6c 50 72 65 70 61 72 65 64 53 74  .  SqlPreparedSt
3960: 6d 74 20 2a 70 4e 65 78 74 3b 0a 0a 20 20 66 6f  mt *pNext;..  fo
3970: 72 28 70 50 72 65 53 74 6d 74 20 3d 20 70 44 62  r(pPreStmt = pDb
3980: 2d 3e 73 74 6d 74 4c 69 73 74 3b 20 70 50 72 65  ->stmtList; pPre
3990: 53 74 6d 74 3b 20 70 50 72 65 53 74 6d 74 3d 70  Stmt; pPreStmt=p
39a0: 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74  Next){.    pNext
39b0: 20 3d 20 70 50 72 65 53 74 6d 74 2d 3e 70 4e 65   = pPreStmt->pNe
39c0: 78 74 3b 0a 20 20 20 20 64 62 46 72 65 65 53 74  xt;.    dbFreeSt
39d0: 6d 74 28 70 50 72 65 53 74 6d 74 29 3b 0a 20 20  mt(pPreStmt);.  
39e0: 7d 0a 20 20 70 44 62 2d 3e 6e 53 74 6d 74 20 3d  }.  pDb->nStmt =
39f0: 20 30 3b 0a 20 20 70 44 62 2d 3e 73 74 6d 74 4c   0;.  pDb->stmtL
3a00: 61 73 74 20 3d 20 30 3b 0a 20 20 70 44 62 2d 3e  ast = 0;.  pDb->
3a10: 73 74 6d 74 4c 69 73 74 20 3d 20 30 3b 0a 7d 0a  stmtList = 0;.}.
3a20: 0a 2f 2a 0a 2a 2a 20 54 43 4c 20 63 61 6c 6c 73  ./*.** TCL calls
3a30: 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 20   this procedure 
3a40: 77 68 65 6e 20 61 6e 20 73 71 6c 69 74 65 33 20  when an sqlite3 
3a50: 64 61 74 61 62 61 73 65 20 63 6f 6d 6d 61 6e 64  database command
3a60: 20 69 73 0a 2a 2a 20 64 65 6c 65 74 65 64 2e 0a   is.** deleted..
3a70: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 44  */.static void D
3a80: 62 44 65 6c 65 74 65 43 6d 64 28 76 6f 69 64 20  bDeleteCmd(void 
3a90: 2a 64 62 29 7b 0a 20 20 53 71 6c 69 74 65 44 62  *db){.  SqliteDb
3aa0: 20 2a 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44   *pDb = (SqliteD
3ab0: 62 2a 29 64 62 3b 0a 20 20 66 6c 75 73 68 53 74  b*)db;.  flushSt
3ac0: 6d 74 43 61 63 68 65 28 70 44 62 29 3b 0a 20 20  mtCache(pDb);.  
3ad0: 63 6c 6f 73 65 49 6e 63 72 62 6c 6f 62 43 68 61  closeIncrblobCha
3ae0: 6e 6e 65 6c 73 28 70 44 62 29 3b 0a 20 20 73 71  nnels(pDb);.  sq
3af0: 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70 44 62 2d  lite3_close(pDb-
3b00: 3e 64 62 29 3b 0a 20 20 77 68 69 6c 65 28 20 70  >db);.  while( p
3b10: 44 62 2d 3e 70 46 75 6e 63 20 29 7b 0a 20 20 20  Db->pFunc ){.   
3b20: 20 53 71 6c 46 75 6e 63 20 2a 70 46 75 6e 63 20   SqlFunc *pFunc 
3b30: 3d 20 70 44 62 2d 3e 70 46 75 6e 63 3b 0a 20 20  = pDb->pFunc;.  
3b40: 20 20 70 44 62 2d 3e 70 46 75 6e 63 20 3d 20 70    pDb->pFunc = p
3b50: 46 75 6e 63 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  Func->pNext;.   
3b60: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
3b70: 74 28 70 46 75 6e 63 2d 3e 70 53 63 72 69 70 74  t(pFunc->pScript
3b80: 29 3b 0a 20 20 20 20 54 63 6c 5f 46 72 65 65 28  );.    Tcl_Free(
3b90: 28 63 68 61 72 2a 29 70 46 75 6e 63 29 3b 0a 20  (char*)pFunc);. 
3ba0: 20 7d 0a 20 20 77 68 69 6c 65 28 20 70 44 62 2d   }.  while( pDb-
3bb0: 3e 70 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20  >pCollate ){.   
3bc0: 20 53 71 6c 43 6f 6c 6c 61 74 65 20 2a 70 43 6f   SqlCollate *pCo
3bd0: 6c 6c 61 74 65 20 3d 20 70 44 62 2d 3e 70 43 6f  llate = pDb->pCo
3be0: 6c 6c 61 74 65 3b 0a 20 20 20 20 70 44 62 2d 3e  llate;.    pDb->
3bf0: 70 43 6f 6c 6c 61 74 65 20 3d 20 70 43 6f 6c 6c  pCollate = pColl
3c00: 61 74 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  ate->pNext;.    
3c10: 54 63 6c 5f 46 72 65 65 28 28 63 68 61 72 2a 29  Tcl_Free((char*)
3c20: 70 43 6f 6c 6c 61 74 65 29 3b 0a 20 20 7d 0a 20  pCollate);.  }. 
3c30: 20 69 66 28 20 70 44 62 2d 3e 7a 42 75 73 79 20   if( pDb->zBusy 
3c40: 29 7b 0a 20 20 20 20 54 63 6c 5f 46 72 65 65 28  ){.    Tcl_Free(
3c50: 70 44 62 2d 3e 7a 42 75 73 79 29 3b 0a 20 20 7d  pDb->zBusy);.  }
3c60: 0a 20 20 69 66 28 20 70 44 62 2d 3e 7a 54 72 61  .  if( pDb->zTra
3c70: 63 65 20 29 7b 0a 20 20 20 20 54 63 6c 5f 46 72  ce ){.    Tcl_Fr
3c80: 65 65 28 70 44 62 2d 3e 7a 54 72 61 63 65 29 3b  ee(pDb->zTrace);
3c90: 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 62 2d 3e  .  }.  if( pDb->
3ca0: 7a 50 72 6f 66 69 6c 65 20 29 7b 0a 20 20 20 20  zProfile ){.    
3cb0: 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 50  Tcl_Free(pDb->zP
3cc0: 72 6f 66 69 6c 65 29 3b 0a 20 20 7d 0a 20 20 69  rofile);.  }.  i
3cd0: 66 28 20 70 44 62 2d 3e 7a 41 75 74 68 20 29 7b  f( pDb->zAuth ){
3ce0: 0a 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44  .    Tcl_Free(pD
3cf0: 62 2d 3e 7a 41 75 74 68 29 3b 0a 20 20 7d 0a 20  b->zAuth);.  }. 
3d00: 20 69 66 28 20 70 44 62 2d 3e 7a 4e 75 6c 6c 20   if( pDb->zNull 
3d10: 29 7b 0a 20 20 20 20 54 63 6c 5f 46 72 65 65 28  ){.    Tcl_Free(
3d20: 70 44 62 2d 3e 7a 4e 75 6c 6c 29 3b 0a 20 20 7d  pDb->zNull);.  }
3d30: 0a 20 20 69 66 28 20 70 44 62 2d 3e 70 55 70 64  .  if( pDb->pUpd
3d40: 61 74 65 48 6f 6f 6b 20 29 7b 0a 20 20 20 20 54  ateHook ){.    T
3d50: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
3d60: 70 44 62 2d 3e 70 55 70 64 61 74 65 48 6f 6f 6b  pDb->pUpdateHook
3d70: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 62  );.  }.  if( pDb
3d80: 2d 3e 70 50 72 65 55 70 64 61 74 65 48 6f 6f 6b  ->pPreUpdateHook
3d90: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72   ){.    Tcl_Decr
3da0: 52 65 66 43 6f 75 6e 74 28 70 44 62 2d 3e 70 50  RefCount(pDb->pP
3db0: 72 65 55 70 64 61 74 65 48 6f 6f 6b 29 3b 0a 20  reUpdateHook);. 
3dc0: 20 7d 0a 20 20 69 66 28 20 70 44 62 2d 3e 70 52   }.  if( pDb->pR
3dd0: 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 20 29 7b 0a 20  ollbackHook ){. 
3de0: 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f     Tcl_DecrRefCo
3df0: 75 6e 74 28 70 44 62 2d 3e 70 52 6f 6c 6c 62 61  unt(pDb->pRollba
3e00: 63 6b 48 6f 6f 6b 29 3b 0a 20 20 7d 0a 20 20 69  ckHook);.  }.  i
3e10: 66 28 20 70 44 62 2d 3e 70 57 61 6c 48 6f 6f 6b  f( pDb->pWalHook
3e20: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72   ){.    Tcl_Decr
3e30: 52 65 66 43 6f 75 6e 74 28 70 44 62 2d 3e 70 57  RefCount(pDb->pW
3e40: 61 6c 48 6f 6f 6b 29 3b 0a 20 20 7d 0a 20 20 69  alHook);.  }.  i
3e50: 66 28 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65  f( pDb->pCollate
3e60: 4e 65 65 64 65 64 20 29 7b 0a 20 20 20 20 54 63  Needed ){.    Tc
3e70: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70  l_DecrRefCount(p
3e80: 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65 65 64  Db->pCollateNeed
3e90: 65 64 29 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 46  ed);.  }.  Tcl_F
3ea0: 72 65 65 28 28 63 68 61 72 2a 29 70 44 62 29 3b  ree((char*)pDb);
3eb0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
3ec0: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
3ed0: 20 77 68 65 6e 20 61 20 64 61 74 61 62 61 73 65   when a database
3ee0: 20 66 69 6c 65 20 69 73 20 6c 6f 63 6b 65 64 20   file is locked 
3ef0: 77 68 69 6c 65 20 74 72 79 69 6e 67 0a 2a 2a 20  while trying.** 
3f00: 74 6f 20 65 78 65 63 75 74 65 20 53 51 4c 2e 0a  to execute SQL..
3f10: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 44 62  */.static int Db
3f20: 42 75 73 79 48 61 6e 64 6c 65 72 28 76 6f 69 64  BusyHandler(void
3f30: 20 2a 63 64 2c 20 69 6e 74 20 6e 54 72 69 65 73   *cd, int nTries
3f40: 29 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70  ){.  SqliteDb *p
3f50: 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29  Db = (SqliteDb*)
3f60: 63 64 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  cd;.  int rc;.  
3f70: 63 68 61 72 20 7a 56 61 6c 5b 33 30 5d 3b 0a 0a  char zVal[30];..
3f80: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
3f90: 74 66 28 73 69 7a 65 6f 66 28 7a 56 61 6c 29 2c  tf(sizeof(zVal),
3fa0: 20 7a 56 61 6c 2c 20 22 25 64 22 2c 20 6e 54 72   zVal, "%d", nTr
3fb0: 69 65 73 29 3b 0a 20 20 72 63 20 3d 20 54 63 6c  ies);.  rc = Tcl
3fc0: 5f 56 61 72 45 76 61 6c 28 70 44 62 2d 3e 69 6e  _VarEval(pDb->in
3fd0: 74 65 72 70 2c 20 70 44 62 2d 3e 7a 42 75 73 79  terp, pDb->zBusy
3fe0: 2c 20 22 20 22 2c 20 7a 56 61 6c 2c 20 28 63 68  , " ", zVal, (ch
3ff0: 61 72 2a 29 30 29 3b 0a 20 20 69 66 28 20 72 63  ar*)0);.  if( rc
4000: 21 3d 54 43 4c 5f 4f 4b 20 7c 7c 20 61 74 6f 69  !=TCL_OK || atoi
4010: 28 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65  (Tcl_GetStringRe
4020: 73 75 6c 74 28 70 44 62 2d 3e 69 6e 74 65 72 70  sult(pDb->interp
4030: 29 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  )) ){.    return
4040: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
4050: 20 31 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53   1;.}..#ifndef S
4060: 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 52 4f 47 52  QLITE_OMIT_PROGR
4070: 45 53 53 5f 43 41 4c 4c 42 41 43 4b 0a 2f 2a 0a  ESS_CALLBACK./*.
4080: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
4090: 69 73 20 69 6e 76 6f 6b 65 64 20 61 73 20 74 68  is invoked as th
40a0: 65 20 27 70 72 6f 67 72 65 73 73 20 63 61 6c 6c  e 'progress call
40b0: 62 61 63 6b 27 20 66 6f 72 20 74 68 65 20 64 61  back' for the da
40c0: 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  tabase..*/.stati
40d0: 63 20 69 6e 74 20 44 62 50 72 6f 67 72 65 73 73  c int DbProgress
40e0: 48 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a 63 64  Handler(void *cd
40f0: 29 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70  ){.  SqliteDb *p
4100: 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29  Db = (SqliteDb*)
4110: 63 64 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  cd;.  int rc;.. 
4120: 20 61 73 73 65 72 74 28 20 70 44 62 2d 3e 7a 50   assert( pDb->zP
4130: 72 6f 67 72 65 73 73 20 29 3b 0a 20 20 72 63 20  rogress );.  rc 
4140: 3d 20 54 63 6c 5f 45 76 61 6c 28 70 44 62 2d 3e  = Tcl_Eval(pDb->
4150: 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a 50 72  interp, pDb->zPr
4160: 6f 67 72 65 73 73 29 3b 0a 20 20 69 66 28 20 72  ogress);.  if( r
4170: 63 21 3d 54 43 4c 5f 4f 4b 20 7c 7c 20 61 74 6f  c!=TCL_OK || ato
4180: 69 28 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52  i(Tcl_GetStringR
4190: 65 73 75 6c 74 28 70 44 62 2d 3e 69 6e 74 65 72  esult(pDb->inter
41a0: 70 29 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  p)) ){.    retur
41b0: 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 1;.  }.  retur
41c0: 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  n 0;.}.#endif..#
41d0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
41e0: 49 54 5f 54 52 41 43 45 0a 2f 2a 0a 2a 2a 20 54  IT_TRACE./*.** T
41f0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
4200: 61 6c 6c 65 64 20 62 79 20 74 68 65 20 53 51 4c  alled by the SQL
4210: 69 74 65 20 74 72 61 63 65 20 68 61 6e 64 6c 65  ite trace handle
4220: 72 20 77 68 65 6e 65 76 65 72 20 61 20 6e 65 77  r whenever a new
4230: 0a 2a 2a 20 62 6c 6f 63 6b 20 6f 66 20 53 51 4c  .** block of SQL
4240: 20 69 73 20 65 78 65 63 75 74 65 64 2e 20 20 54   is executed.  T
4250: 68 65 20 54 43 4c 20 73 63 72 69 70 74 20 69 6e  he TCL script in
4260: 20 70 44 62 2d 3e 7a 54 72 61 63 65 20 69 73 20   pDb->zTrace is 
4270: 65 78 65 63 75 74 65 64 2e 0a 2a 2f 0a 73 74 61  executed..*/.sta
4280: 74 69 63 20 76 6f 69 64 20 44 62 54 72 61 63 65  tic void DbTrace
4290: 48 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a 63 64  Handler(void *cd
42a0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53  , const char *zS
42b0: 71 6c 29 7b 0a 20 20 53 71 6c 69 74 65 44 62 20  ql){.  SqliteDb 
42c0: 2a 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62  *pDb = (SqliteDb
42d0: 2a 29 63 64 3b 0a 20 20 54 63 6c 5f 44 53 74 72  *)cd;.  Tcl_DStr
42e0: 69 6e 67 20 73 74 72 3b 0a 0a 20 20 54 63 6c 5f  ing str;..  Tcl_
42f0: 44 53 74 72 69 6e 67 49 6e 69 74 28 26 73 74 72  DStringInit(&str
4300: 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  );.  Tcl_DString
4310: 41 70 70 65 6e 64 28 26 73 74 72 2c 20 70 44 62  Append(&str, pDb
4320: 2d 3e 7a 54 72 61 63 65 2c 20 2d 31 29 3b 0a 20  ->zTrace, -1);. 
4330: 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65   Tcl_DStringAppe
4340: 6e 64 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c 20  ndElement(&str, 
4350: 7a 53 71 6c 29 3b 0a 20 20 54 63 6c 5f 45 76 61  zSql);.  Tcl_Eva
4360: 6c 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20 54  l(pDb->interp, T
4370: 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28  cl_DStringValue(
4380: 26 73 74 72 29 29 3b 0a 20 20 54 63 6c 5f 44 53  &str));.  Tcl_DS
4390: 74 72 69 6e 67 46 72 65 65 28 26 73 74 72 29 3b  tringFree(&str);
43a0: 0a 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73 75  .  Tcl_ResetResu
43b0: 6c 74 28 70 44 62 2d 3e 69 6e 74 65 72 70 29 3b  lt(pDb->interp);
43c0: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  .}.#endif..#ifnd
43d0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ef SQLITE_OMIT_T
43e0: 52 41 43 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  RACE./*.** This 
43f0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
4400: 64 20 62 79 20 74 68 65 20 53 51 4c 69 74 65 20  d by the SQLite 
4410: 70 72 6f 66 69 6c 65 20 68 61 6e 64 6c 65 72 20  profile handler 
4420: 61 66 74 65 72 20 61 20 73 74 61 74 65 6d 65 6e  after a statemen
4430: 74 0a 2a 2a 20 53 51 4c 20 68 61 73 20 65 78 65  t.** SQL has exe
4440: 63 75 74 65 64 2e 20 20 54 68 65 20 54 43 4c 20  cuted.  The TCL 
4450: 73 63 72 69 70 74 20 69 6e 20 70 44 62 2d 3e 7a  script in pDb->z
4460: 50 72 6f 66 69 6c 65 20 69 73 20 65 76 61 6c 75  Profile is evalu
4470: 61 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ated..*/.static 
4480: 76 6f 69 64 20 44 62 50 72 6f 66 69 6c 65 48 61  void DbProfileHa
4490: 6e 64 6c 65 72 28 76 6f 69 64 20 2a 63 64 2c 20  ndler(void *cd, 
44a0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c  const char *zSql
44b0: 2c 20 73 71 6c 69 74 65 5f 75 69 6e 74 36 34 20  , sqlite_uint64 
44c0: 74 6d 29 7b 0a 20 20 53 71 6c 69 74 65 44 62 20  tm){.  SqliteDb 
44d0: 2a 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62  *pDb = (SqliteDb
44e0: 2a 29 63 64 3b 0a 20 20 54 63 6c 5f 44 53 74 72  *)cd;.  Tcl_DStr
44f0: 69 6e 67 20 73 74 72 3b 0a 20 20 63 68 61 72 20  ing str;.  char 
4500: 7a 54 6d 5b 31 30 30 5d 3b 0a 0a 20 20 73 71 6c  zTm[100];..  sql
4510: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
4520: 7a 65 6f 66 28 7a 54 6d 29 2d 31 2c 20 7a 54 6d  zeof(zTm)-1, zTm
4530: 2c 20 22 25 6c 6c 64 22 2c 20 74 6d 29 3b 0a 20  , "%lld", tm);. 
4540: 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74   Tcl_DStringInit
4550: 28 26 73 74 72 29 3b 0a 20 20 54 63 6c 5f 44 53  (&str);.  Tcl_DS
4560: 74 72 69 6e 67 41 70 70 65 6e 64 28 26 73 74 72  tringAppend(&str
4570: 2c 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 2c  , pDb->zProfile,
4580: 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72   -1);.  Tcl_DStr
4590: 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ingAppendElement
45a0: 28 26 73 74 72 2c 20 7a 53 71 6c 29 3b 0a 20 20  (&str, zSql);.  
45b0: 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e  Tcl_DStringAppen
45c0: 64 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c 20 7a  dElement(&str, z
45d0: 54 6d 29 3b 0a 20 20 54 63 6c 5f 45 76 61 6c 28  Tm);.  Tcl_Eval(
45e0: 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20 54 63 6c  pDb->interp, Tcl
45f0: 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 73  _DStringValue(&s
4600: 74 72 29 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72  tr));.  Tcl_DStr
4610: 69 6e 67 46 72 65 65 28 26 73 74 72 29 3b 0a 20  ingFree(&str);. 
4620: 20 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74   Tcl_ResetResult
4630: 28 70 44 62 2d 3e 69 6e 74 65 72 70 29 3b 0a 7d  (pDb->interp);.}
4640: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
4650: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
4660: 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 74 72 61  alled when a tra
4670: 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d  nsaction is comm
4680: 69 74 74 65 64 2e 20 20 54 68 65 0a 2a 2a 20 54  itted.  The.** T
4690: 43 4c 20 73 63 72 69 70 74 20 69 6e 20 70 44 62  CL script in pDb
46a0: 2d 3e 7a 43 6f 6d 6d 69 74 20 69 73 20 65 78 65  ->zCommit is exe
46b0: 63 75 74 65 64 2e 20 20 49 66 20 69 74 20 72 65  cuted.  If it re
46c0: 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 20 6f  turns non-zero o
46d0: 72 0a 2a 2a 20 69 66 20 69 74 20 74 68 72 6f 77  r.** if it throw
46e0: 73 20 61 6e 20 65 78 63 65 70 74 69 6f 6e 2c 20  s an exception, 
46f0: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
4700: 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 69  is rolled back i
4710: 6e 73 74 65 61 64 0a 2a 2a 20 6f 66 20 62 65 69  nstead.** of bei
4720: 6e 67 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2f  ng committed..*/
4730: 0a 73 74 61 74 69 63 20 69 6e 74 20 44 62 43 6f  .static int DbCo
4740: 6d 6d 69 74 48 61 6e 64 6c 65 72 28 76 6f 69 64  mmitHandler(void
4750: 20 2a 63 64 29 7b 0a 20 20 53 71 6c 69 74 65 44   *cd){.  SqliteD
4760: 62 20 2a 70 44 62 20 3d 20 28 53 71 6c 69 74 65  b *pDb = (Sqlite
4770: 44 62 2a 29 63 64 3b 0a 20 20 69 6e 74 20 72 63  Db*)cd;.  int rc
4780: 3b 0a 0a 20 20 72 63 20 3d 20 54 63 6c 5f 45 76  ;..  rc = Tcl_Ev
4790: 61 6c 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20  al(pDb->interp, 
47a0: 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 29 3b 0a 20  pDb->zCommit);. 
47b0: 20 69 66 28 20 72 63 21 3d 54 43 4c 5f 4f 4b 20   if( rc!=TCL_OK 
47c0: 7c 7c 20 61 74 6f 69 28 54 63 6c 5f 47 65 74 53  || atoi(Tcl_GetS
47d0: 74 72 69 6e 67 52 65 73 75 6c 74 28 70 44 62 2d  tringResult(pDb-
47e0: 3e 69 6e 74 65 72 70 29 29 20 29 7b 0a 20 20 20  >interp)) ){.   
47f0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
4800: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 73 74   return 0;.}..st
4810: 61 74 69 63 20 76 6f 69 64 20 44 62 52 6f 6c 6c  atic void DbRoll
4820: 62 61 63 6b 48 61 6e 64 6c 65 72 28 76 6f 69 64  backHandler(void
4830: 20 2a 63 6c 69 65 6e 74 44 61 74 61 29 7b 0a 20   *clientData){. 
4840: 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d   SqliteDb *pDb =
4850: 20 28 53 71 6c 69 74 65 44 62 2a 29 63 6c 69 65   (SqliteDb*)clie
4860: 6e 74 44 61 74 61 3b 0a 20 20 61 73 73 65 72 74  ntData;.  assert
4870: 28 70 44 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 48  (pDb->pRollbackH
4880: 6f 6f 6b 29 3b 0a 20 20 69 66 28 20 54 43 4c 5f  ook);.  if( TCL_
4890: 4f 4b 21 3d 54 63 6c 5f 45 76 61 6c 4f 62 6a 45  OK!=Tcl_EvalObjE
48a0: 78 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20 70  x(pDb->interp, p
48b0: 44 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f  Db->pRollbackHoo
48c0: 6b 2c 20 30 29 20 29 7b 0a 20 20 20 20 54 63 6c  k, 0) ){.    Tcl
48d0: 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72  _BackgroundError
48e0: 28 70 44 62 2d 3e 69 6e 74 65 72 70 29 3b 0a 20  (pDb->interp);. 
48f0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
4900: 20 70 72 6f 63 65 64 75 72 65 20 68 61 6e 64 6c   procedure handl
4910: 65 73 20 77 61 6c 5f 68 6f 6f 6b 20 63 61 6c 6c  es wal_hook call
4920: 62 61 63 6b 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  backs..*/.static
4930: 20 69 6e 74 20 44 62 57 61 6c 48 61 6e 64 6c 65   int DbWalHandle
4940: 72 28 0a 20 20 76 6f 69 64 20 2a 63 6c 69 65 6e  r(.  void *clien
4950: 74 44 61 74 61 2c 20 0a 20 20 73 71 6c 69 74 65  tData, .  sqlite
4960: 33 20 2a 64 62 2c 20 0a 20 20 63 6f 6e 73 74 20  3 *db, .  const 
4970: 63 68 61 72 20 2a 7a 44 62 2c 20 0a 20 20 69 6e  char *zDb, .  in
4980: 74 20 6e 45 6e 74 72 79 0a 29 7b 0a 20 20 69 6e  t nEntry.){.  in
4990: 74 20 72 65 74 20 3d 20 53 51 4c 49 54 45 5f 4f  t ret = SQLITE_O
49a0: 4b 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 3b  K;.  Tcl_Obj *p;
49b0: 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62  .  SqliteDb *pDb
49c0: 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 63 6c   = (SqliteDb*)cl
49d0: 69 65 6e 74 44 61 74 61 3b 0a 20 20 54 63 6c 5f  ientData;.  Tcl_
49e0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 20 3d  Interp *interp =
49f0: 20 70 44 62 2d 3e 69 6e 74 65 72 70 3b 0a 20 20   pDb->interp;.  
4a00: 61 73 73 65 72 74 28 70 44 62 2d 3e 70 57 61 6c  assert(pDb->pWal
4a10: 48 6f 6f 6b 29 3b 0a 0a 20 20 70 20 3d 20 54 63  Hook);..  p = Tc
4a20: 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 70  l_DuplicateObj(p
4a30: 44 62 2d 3e 70 57 61 6c 48 6f 6f 6b 29 3b 0a 20  Db->pWalHook);. 
4a40: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
4a50: 74 28 70 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74  t(p);.  Tcl_List
4a60: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
4a70: 28 69 6e 74 65 72 70 2c 20 70 2c 20 54 63 6c 5f  (interp, p, Tcl_
4a80: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 44 62  NewStringObj(zDb
4a90: 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69  , -1));.  Tcl_Li
4aa0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
4ab0: 6e 74 28 69 6e 74 65 72 70 2c 20 70 2c 20 54 63  nt(interp, p, Tc
4ac0: 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 6e 45 6e 74  l_NewIntObj(nEnt
4ad0: 72 79 29 29 3b 0a 20 20 69 66 28 20 54 43 4c 5f  ry));.  if( TCL_
4ae0: 4f 4b 21 3d 54 63 6c 5f 45 76 61 6c 4f 62 6a 45  OK!=Tcl_EvalObjE
4af0: 78 28 69 6e 74 65 72 70 2c 20 70 2c 20 30 29 20  x(interp, p, 0) 
4b00: 0a 20 20 20 7c 7c 20 54 43 4c 5f 4f 4b 21 3d 54  .   || TCL_OK!=T
4b10: 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
4b20: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
4b30: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
4b40: 29 2c 20 26 72 65 74 29 0a 20 20 29 7b 0a 20 20  ), &ret).  ){.  
4b50: 20 20 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64    Tcl_Background
4b60: 45 72 72 6f 72 28 69 6e 74 65 72 70 29 3b 0a 20  Error(interp);. 
4b70: 20 7d 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66   }.  Tcl_DecrRef
4b80: 43 6f 75 6e 74 28 70 29 3b 0a 0a 20 20 72 65 74  Count(p);..  ret
4b90: 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 23 69 66 20  urn ret;.}..#if 
4ba0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
4bb0: 45 53 54 29 20 26 26 20 64 65 66 69 6e 65 64 28  EST) && defined(
4bc0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 55 4e  SQLITE_ENABLE_UN
4bd0: 4c 4f 43 4b 5f 4e 4f 54 49 46 59 29 0a 73 74 61  LOCK_NOTIFY).sta
4be0: 74 69 63 20 76 6f 69 64 20 73 65 74 54 65 73 74  tic void setTest
4bf0: 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 56 61 72 73  UnlockNotifyVars
4c00: 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74  (Tcl_Interp *int
4c10: 65 72 70 2c 20 69 6e 74 20 69 41 72 67 2c 20 69  erp, int iArg, i
4c20: 6e 74 20 6e 41 72 67 29 7b 0a 20 20 63 68 61 72  nt nArg){.  char
4c30: 20 7a 42 75 66 5b 36 34 5d 3b 0a 20 20 73 70 72   zBuf[64];.  spr
4c40: 69 6e 74 66 28 7a 42 75 66 2c 20 22 25 64 22 2c  intf(zBuf, "%d",
4c50: 20 69 41 72 67 29 3b 0a 20 20 54 63 6c 5f 53 65   iArg);.  Tcl_Se
4c60: 74 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71  tVar(interp, "sq
4c70: 6c 69 74 65 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74 69  lite_unlock_noti
4c80: 66 79 5f 61 72 67 22 2c 20 7a 42 75 66 2c 20 54  fy_arg", zBuf, T
4c90: 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b  CL_GLOBAL_ONLY);
4ca0: 0a 20 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c  .  sprintf(zBuf,
4cb0: 20 22 25 64 22 2c 20 6e 41 72 67 29 3b 0a 20 20   "%d", nArg);.  
4cc0: 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72  Tcl_SetVar(inter
4cd0: 70 2c 20 22 73 71 6c 69 74 65 5f 75 6e 6c 6f 63  p, "sqlite_unloc
4ce0: 6b 5f 6e 6f 74 69 66 79 5f 61 72 67 63 6f 75 6e  k_notify_argcoun
4cf0: 74 22 2c 20 7a 42 75 66 2c 20 54 43 4c 5f 47 4c  t", zBuf, TCL_GL
4d00: 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 7d 0a 23 65  OBAL_ONLY);.}.#e
4d10: 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 73 65 74  lse.# define set
4d20: 54 65 73 74 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79  TestUnlockNotify
4d30: 56 61 72 73 28 78 2c 79 2c 7a 29 0a 23 65 6e 64  Vars(x,y,z).#end
4d40: 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  if..#ifdef SQLIT
4d50: 45 5f 45 4e 41 42 4c 45 5f 55 4e 4c 4f 43 4b 5f  E_ENABLE_UNLOCK_
4d60: 4e 4f 54 49 46 59 0a 73 74 61 74 69 63 20 76 6f  NOTIFY.static vo
4d70: 69 64 20 44 62 55 6e 6c 6f 63 6b 4e 6f 74 69 66  id DbUnlockNotif
4d80: 79 28 76 6f 69 64 20 2a 2a 61 70 41 72 67 2c 20  y(void **apArg, 
4d90: 69 6e 74 20 6e 41 72 67 29 7b 0a 20 20 69 6e 74  int nArg){.  int
4da0: 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
4db0: 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nArg; i++){.   
4dc0: 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67 73   const int flags
4dd0: 20 3d 20 28 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f   = (TCL_EVAL_GLO
4de0: 42 41 4c 7c 54 43 4c 5f 45 56 41 4c 5f 44 49 52  BAL|TCL_EVAL_DIR
4df0: 45 43 54 29 3b 0a 20 20 20 20 53 71 6c 69 74 65  ECT);.    Sqlite
4e00: 44 62 20 2a 70 44 62 20 3d 20 28 53 71 6c 69 74  Db *pDb = (Sqlit
4e10: 65 44 62 20 2a 29 61 70 41 72 67 5b 69 5d 3b 0a  eDb *)apArg[i];.
4e20: 20 20 20 20 73 65 74 54 65 73 74 55 6e 6c 6f 63      setTestUnloc
4e30: 6b 4e 6f 74 69 66 79 56 61 72 73 28 70 44 62 2d  kNotifyVars(pDb-
4e40: 3e 69 6e 74 65 72 70 2c 20 69 2c 20 6e 41 72 67  >interp, i, nArg
4e50: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
4e60: 44 62 2d 3e 70 55 6e 6c 6f 63 6b 4e 6f 74 69 66  Db->pUnlockNotif
4e70: 79 29 3b 0a 20 20 20 20 54 63 6c 5f 45 76 61 6c  y);.    Tcl_Eval
4e80: 4f 62 6a 45 78 28 70 44 62 2d 3e 69 6e 74 65 72  ObjEx(pDb->inter
4e90: 70 2c 20 70 44 62 2d 3e 70 55 6e 6c 6f 63 6b 4e  p, pDb->pUnlockN
4ea0: 6f 74 69 66 79 2c 20 66 6c 61 67 73 29 3b 0a 20  otify, flags);. 
4eb0: 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f     Tcl_DecrRefCo
4ec0: 75 6e 74 28 70 44 62 2d 3e 70 55 6e 6c 6f 63 6b  unt(pDb->pUnlock
4ed0: 4e 6f 74 69 66 79 29 3b 0a 20 20 20 20 70 44 62  Notify);.    pDb
4ee0: 2d 3e 70 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 20  ->pUnlockNotify 
4ef0: 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69  = 0;.  }.}.#endi
4f00: 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  f..#ifdef SQLITE
4f10: 5f 45 4e 41 42 4c 45 5f 50 52 45 55 50 44 41 54  _ENABLE_PREUPDAT
4f20: 45 5f 48 4f 4f 4b 0a 2f 2a 0a 2a 2a 20 50 72 65  E_HOOK./*.** Pre
4f30: 2d 75 70 64 61 74 65 20 68 6f 6f 6b 20 63 61 6c  -update hook cal
4f40: 6c 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63  lback..*/.static
4f50: 20 76 6f 69 64 20 44 62 50 72 65 55 70 64 61 74   void DbPreUpdat
4f60: 65 48 61 6e 64 6c 65 72 28 0a 20 20 76 6f 69 64  eHandler(.  void
4f70: 20 2a 70 2c 20 0a 20 20 73 71 6c 69 74 65 33 20   *p, .  sqlite3 
4f80: 2a 64 62 2c 0a 20 20 69 6e 74 20 6f 70 2c 0a 20  *db,.  int op,. 
4f90: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
4fa0: 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  , .  const char 
4fb0: 2a 7a 54 62 6c 2c 20 0a 20 20 73 71 6c 69 74 65  *zTbl, .  sqlite
4fc0: 5f 69 6e 74 36 34 20 69 4b 65 79 31 2c 0a 20 20  _int64 iKey1,.  
4fd0: 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 69 4b 65  sqlite_int64 iKe
4fe0: 79 32 0a 29 7b 0a 20 20 53 71 6c 69 74 65 44 62  y2.){.  SqliteDb
4ff0: 20 2a 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44   *pDb = (SqliteD
5000: 62 20 2a 29 70 3b 0a 20 20 54 63 6c 5f 4f 62 6a  b *)p;.  Tcl_Obj
5010: 20 2a 70 43 6d 64 3b 0a 20 20 73 74 61 74 69 63   *pCmd;.  static
5020: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 53   const char *azS
5030: 74 72 5b 5d 20 3d 20 7b 22 44 45 4c 45 54 45 22  tr[] = {"DELETE"
5040: 2c 20 22 49 4e 53 45 52 54 22 2c 20 22 55 50 44  , "INSERT", "UPD
5050: 41 54 45 22 7d 3b 0a 0a 20 20 61 73 73 65 72 74  ATE"};..  assert
5060: 28 20 28 53 51 4c 49 54 45 5f 44 45 4c 45 54 45  ( (SQLITE_DELETE
5070: 2d 31 29 2f 39 20 3d 3d 20 30 20 29 3b 0a 20 20  -1)/9 == 0 );.  
5080: 61 73 73 65 72 74 28 20 28 53 51 4c 49 54 45 5f  assert( (SQLITE_
5090: 49 4e 53 45 52 54 2d 31 29 2f 39 20 3d 3d 20 31  INSERT-1)/9 == 1
50a0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 53   );.  assert( (S
50b0: 51 4c 49 54 45 5f 55 50 44 41 54 45 2d 31 29 2f  QLITE_UPDATE-1)/
50c0: 39 20 3d 3d 20 32 20 29 3b 0a 20 20 61 73 73 65  9 == 2 );.  asse
50d0: 72 74 28 20 70 44 62 2d 3e 70 50 72 65 55 70 64  rt( pDb->pPreUpd
50e0: 61 74 65 48 6f 6f 6b 20 29 3b 0a 20 20 61 73 73  ateHook );.  ass
50f0: 65 72 74 28 20 64 62 3d 3d 70 44 62 2d 3e 64 62  ert( db==pDb->db
5100: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70   );.  assert( op
5110: 3d 3d 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 20  ==SQLITE_INSERT 
5120: 7c 7c 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 55 50  || op==SQLITE_UP
5130: 44 41 54 45 20 7c 7c 20 6f 70 3d 3d 53 51 4c 49  DATE || op==SQLI
5140: 54 45 5f 44 45 4c 45 54 45 20 29 3b 0a 0a 20 20  TE_DELETE );..  
5150: 70 43 6d 64 20 3d 20 54 63 6c 5f 44 75 70 6c 69  pCmd = Tcl_Dupli
5160: 63 61 74 65 4f 62 6a 28 70 44 62 2d 3e 70 50 72  cateObj(pDb->pPr
5170: 65 55 70 64 61 74 65 48 6f 6f 6b 29 3b 0a 20 20  eUpdateHook);.  
5180: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
5190: 28 70 43 6d 64 29 3b 0a 20 20 54 63 6c 5f 4c 69  (pCmd);.  Tcl_Li
51a0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
51b0: 6e 74 28 30 2c 20 70 43 6d 64 2c 20 54 63 6c 5f  nt(0, pCmd, Tcl_
51c0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 61 7a 53  NewStringObj(azS
51d0: 74 72 5b 28 6f 70 2d 31 29 2f 39 5d 2c 20 2d 31  tr[(op-1)/9], -1
51e0: 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ));.  Tcl_ListOb
51f0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30  jAppendElement(0
5200: 2c 20 70 43 6d 64 2c 20 54 63 6c 5f 4e 65 77 53  , pCmd, Tcl_NewS
5210: 74 72 69 6e 67 4f 62 6a 28 7a 44 62 2c 20 2d 31  tringObj(zDb, -1
5220: 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ));.  Tcl_ListOb
5230: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30  jAppendElement(0
5240: 2c 20 70 43 6d 64 2c 20 54 63 6c 5f 4e 65 77 53  , pCmd, Tcl_NewS
5250: 74 72 69 6e 67 4f 62 6a 28 7a 54 62 6c 2c 20 2d  tringObj(zTbl, -
5260: 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f  1));.  Tcl_ListO
5270: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
5280: 30 2c 20 70 43 6d 64 2c 20 54 63 6c 5f 4e 65 77  0, pCmd, Tcl_New
5290: 57 69 64 65 49 6e 74 4f 62 6a 28 69 4b 65 79 31  WideIntObj(iKey1
52a0: 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ));.  Tcl_ListOb
52b0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30  jAppendElement(0
52c0: 2c 20 70 43 6d 64 2c 20 54 63 6c 5f 4e 65 77 57  , pCmd, Tcl_NewW
52d0: 69 64 65 49 6e 74 4f 62 6a 28 69 4b 65 79 32 29  ideIntObj(iKey2)
52e0: 29 3b 0a 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a  );.  Tcl_EvalObj
52f0: 45 78 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20  Ex(pDb->interp, 
5300: 70 43 6d 64 2c 20 54 43 4c 5f 45 56 41 4c 5f 44  pCmd, TCL_EVAL_D
5310: 49 52 45 43 54 29 3b 0a 20 20 54 63 6c 5f 44 65  IRECT);.  Tcl_De
5320: 63 72 52 65 66 43 6f 75 6e 74 28 70 43 6d 64 29  crRefCount(pCmd)
5330: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
5340: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52 45 55  LITE_ENABLE_PREU
5350: 50 44 41 54 45 5f 48 4f 4f 4b 20 2a 2f 0a 0a 73  PDATE_HOOK */..s
5360: 74 61 74 69 63 20 76 6f 69 64 20 44 62 55 70 64  tatic void DbUpd
5370: 61 74 65 48 61 6e 64 6c 65 72 28 0a 20 20 76 6f  ateHandler(.  vo
5380: 69 64 20 2a 70 2c 20 0a 20 20 69 6e 74 20 6f 70  id *p, .  int op
5390: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
53a0: 7a 44 62 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68  zDb, .  const ch
53b0: 61 72 20 2a 7a 54 62 6c 2c 20 0a 20 20 73 71 6c  ar *zTbl, .  sql
53c0: 69 74 65 5f 69 6e 74 36 34 20 72 6f 77 69 64 0a  ite_int64 rowid.
53d0: 29 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70  ){.  SqliteDb *p
53e0: 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62 20 2a  Db = (SqliteDb *
53f0: 29 70 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  )p;.  Tcl_Obj *p
5400: 43 6d 64 3b 0a 20 20 73 74 61 74 69 63 20 63 6f  Cmd;.  static co
5410: 6e 73 74 20 63 68 61 72 20 2a 61 7a 53 74 72 5b  nst char *azStr[
5420: 5d 20 3d 20 7b 22 44 45 4c 45 54 45 22 2c 20 22  ] = {"DELETE", "
5430: 49 4e 53 45 52 54 22 2c 20 22 55 50 44 41 54 45  INSERT", "UPDATE
5440: 22 7d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 28  "};..  assert( (
5450: 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2d 31 29  SQLITE_DELETE-1)
5460: 2f 39 20 3d 3d 20 30 20 29 3b 0a 20 20 61 73 73  /9 == 0 );.  ass
5470: 65 72 74 28 20 28 53 51 4c 49 54 45 5f 49 4e 53  ert( (SQLITE_INS
5480: 45 52 54 2d 31 29 2f 39 20 3d 3d 20 31 20 29 3b  ERT-1)/9 == 1 );
5490: 0a 20 20 61 73 73 65 72 74 28 20 28 53 51 4c 49  .  assert( (SQLI
54a0: 54 45 5f 55 50 44 41 54 45 2d 31 29 2f 39 20 3d  TE_UPDATE-1)/9 =
54b0: 3d 20 32 20 29 3b 0a 0a 20 20 61 73 73 65 72 74  = 2 );..  assert
54c0: 28 20 70 44 62 2d 3e 70 55 70 64 61 74 65 48 6f  ( pDb->pUpdateHo
54d0: 6f 6b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ok );.  assert( 
54e0: 6f 70 3d 3d 53 51 4c 49 54 45 5f 49 4e 53 45 52  op==SQLITE_INSER
54f0: 54 20 7c 7c 20 6f 70 3d 3d 53 51 4c 49 54 45 5f  T || op==SQLITE_
5500: 55 50 44 41 54 45 20 7c 7c 20 6f 70 3d 3d 53 51  UPDATE || op==SQ
5510: 4c 49 54 45 5f 44 45 4c 45 54 45 20 29 3b 0a 0a  LITE_DELETE );..
5520: 20 20 70 43 6d 64 20 3d 20 54 63 6c 5f 44 75 70    pCmd = Tcl_Dup
5530: 6c 69 63 61 74 65 4f 62 6a 28 70 44 62 2d 3e 70  licateObj(pDb->p
5540: 55 70 64 61 74 65 48 6f 6f 6b 29 3b 0a 20 20 54  UpdateHook);.  T
5550: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
5560: 70 43 6d 64 29 3b 0a 20 20 54 63 6c 5f 4c 69 73  pCmd);.  Tcl_Lis
5570: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
5580: 74 28 30 2c 20 70 43 6d 64 2c 20 54 63 6c 5f 4e  t(0, pCmd, Tcl_N
5590: 65 77 53 74 72 69 6e 67 4f 62 6a 28 61 7a 53 74  ewStringObj(azSt
55a0: 72 5b 28 6f 70 2d 31 29 2f 39 5d 2c 20 2d 31 29  r[(op-1)/9], -1)
55b0: 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  );.  Tcl_ListObj
55c0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c  AppendElement(0,
55d0: 20 70 43 6d 64 2c 20 54 63 6c 5f 4e 65 77 53 74   pCmd, Tcl_NewSt
55e0: 72 69 6e 67 4f 62 6a 28 7a 44 62 2c 20 2d 31 29  ringObj(zDb, -1)
55f0: 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  );.  Tcl_ListObj
5600: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c  AppendElement(0,
5610: 20 70 43 6d 64 2c 20 54 63 6c 5f 4e 65 77 53 74   pCmd, Tcl_NewSt
5620: 72 69 6e 67 4f 62 6a 28 7a 54 62 6c 2c 20 2d 31  ringObj(zTbl, -1
5630: 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ));.  Tcl_ListOb
5640: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30  jAppendElement(0
5650: 2c 20 70 43 6d 64 2c 20 54 63 6c 5f 4e 65 77 57  , pCmd, Tcl_NewW
5660: 69 64 65 49 6e 74 4f 62 6a 28 72 6f 77 69 64 29  ideIntObj(rowid)
5670: 29 3b 0a 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a  );.  Tcl_EvalObj
5680: 45 78 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20  Ex(pDb->interp, 
5690: 70 43 6d 64 2c 20 54 43 4c 5f 45 56 41 4c 5f 44  pCmd, TCL_EVAL_D
56a0: 49 52 45 43 54 29 3b 0a 20 20 54 63 6c 5f 44 65  IRECT);.  Tcl_De
56b0: 63 72 52 65 66 43 6f 75 6e 74 28 70 43 6d 64 29  crRefCount(pCmd)
56c0: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  ;.}..static void
56d0: 20 74 63 6c 43 6f 6c 6c 61 74 65 4e 65 65 64 65   tclCollateNeede
56e0: 64 28 0a 20 20 76 6f 69 64 20 2a 70 43 74 78 2c  d(.  void *pCtx,
56f0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a  .  sqlite3 *db,.
5700: 20 20 69 6e 74 20 65 6e 63 2c 0a 20 20 63 6f 6e    int enc,.  con
5710: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 0a 29  st char *zName.)
5720: 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44  {.  SqliteDb *pD
5730: 62 20 3d 20 28 53 71 6c 69 74 65 44 62 20 2a 29  b = (SqliteDb *)
5740: 70 43 74 78 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20  pCtx;.  Tcl_Obj 
5750: 2a 70 53 63 72 69 70 74 20 3d 20 54 63 6c 5f 44  *pScript = Tcl_D
5760: 75 70 6c 69 63 61 74 65 4f 62 6a 28 70 44 62 2d  uplicateObj(pDb-
5770: 3e 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64 29  >pCollateNeeded)
5780: 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43  ;.  Tcl_IncrRefC
5790: 6f 75 6e 74 28 70 53 63 72 69 70 74 29 3b 0a 20  ount(pScript);. 
57a0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
57b0: 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 53 63  ndElement(0, pSc
57c0: 72 69 70 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72  ript, Tcl_NewStr
57d0: 69 6e 67 4f 62 6a 28 7a 4e 61 6d 65 2c 20 2d 31  ingObj(zName, -1
57e0: 29 29 3b 0a 20 20 54 63 6c 5f 45 76 61 6c 4f 62  ));.  Tcl_EvalOb
57f0: 6a 45 78 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c  jEx(pDb->interp,
5800: 20 70 53 63 72 69 70 74 2c 20 30 29 3b 0a 20 20   pScript, 0);.  
5810: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
5820: 28 70 53 63 72 69 70 74 29 3b 0a 7d 0a 0a 2f 2a  (pScript);.}../*
5830: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
5840: 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 65 76   is called to ev
5850: 61 6c 75 61 74 65 20 61 6e 20 53 51 4c 20 63 6f  aluate an SQL co
5860: 6c 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e  llation function
5870: 20 69 6d 70 6c 65 6d 65 6e 74 65 64 0a 2a 2a 20   implemented.** 
5880: 75 73 69 6e 67 20 54 43 4c 20 73 63 72 69 70 74  using TCL script
5890: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
58a0: 74 63 6c 53 71 6c 43 6f 6c 6c 61 74 65 28 0a 20  tclSqlCollate(. 
58b0: 20 76 6f 69 64 20 2a 70 43 74 78 2c 0a 20 20 69   void *pCtx,.  i
58c0: 6e 74 20 6e 41 2c 0a 20 20 63 6f 6e 73 74 20 76  nt nA,.  const v
58d0: 6f 69 64 20 2a 7a 41 2c 0a 20 20 69 6e 74 20 6e  oid *zA,.  int n
58e0: 42 2c 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  B,.  const void 
58f0: 2a 7a 42 0a 29 7b 0a 20 20 53 71 6c 43 6f 6c 6c  *zB.){.  SqlColl
5900: 61 74 65 20 2a 70 20 3d 20 28 53 71 6c 43 6f 6c  ate *p = (SqlCol
5910: 6c 61 74 65 20 2a 29 70 43 74 78 3b 0a 20 20 54  late *)pCtx;.  T
5920: 63 6c 5f 4f 62 6a 20 2a 70 43 6d 64 3b 0a 0a 20  cl_Obj *pCmd;.. 
5930: 20 70 43 6d 64 20 3d 20 54 63 6c 5f 4e 65 77 53   pCmd = Tcl_NewS
5940: 74 72 69 6e 67 4f 62 6a 28 70 2d 3e 7a 53 63 72  tringObj(p->zScr
5950: 69 70 74 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f  ipt, -1);.  Tcl_
5960: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 43 6d  IncrRefCount(pCm
5970: 64 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62  d);.  Tcl_ListOb
5980: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 70  jAppendElement(p
5990: 2d 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c 20  ->interp, pCmd, 
59a0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
59b0: 28 7a 41 2c 20 6e 41 29 29 3b 0a 20 20 54 63 6c  (zA, nA));.  Tcl
59c0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
59d0: 65 6d 65 6e 74 28 70 2d 3e 69 6e 74 65 72 70 2c  ement(p->interp,
59e0: 20 70 43 6d 64 2c 20 54 63 6c 5f 4e 65 77 53 74   pCmd, Tcl_NewSt
59f0: 72 69 6e 67 4f 62 6a 28 7a 42 2c 20 6e 42 29 29  ringObj(zB, nB))
5a00: 3b 0a 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45  ;.  Tcl_EvalObjE
5a10: 78 28 70 2d 3e 69 6e 74 65 72 70 2c 20 70 43 6d  x(p->interp, pCm
5a20: 64 2c 20 54 43 4c 5f 45 56 41 4c 5f 44 49 52 45  d, TCL_EVAL_DIRE
5a30: 43 54 29 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52  CT);.  Tcl_DecrR
5a40: 65 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20  efCount(pCmd);. 
5a50: 20 72 65 74 75 72 6e 20 28 61 74 6f 69 28 54 63   return (atoi(Tc
5a60: 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c  l_GetStringResul
5a70: 74 28 70 2d 3e 69 6e 74 65 72 70 29 29 29 3b 0a  t(p->interp)));.
5a80: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
5a90: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
5aa0: 74 6f 20 65 76 61 6c 75 61 74 65 20 61 6e 20 53  to evaluate an S
5ab0: 51 4c 20 66 75 6e 63 74 69 6f 6e 20 69 6d 70 6c  QL function impl
5ac0: 65 6d 65 6e 74 65 64 0a 2a 2a 20 75 73 69 6e 67  emented.** using
5ad0: 20 54 43 4c 20 73 63 72 69 70 74 2e 0a 2a 2f 0a   TCL script..*/.
5ae0: 73 74 61 74 69 63 20 76 6f 69 64 20 74 63 6c 53  static void tclS
5af0: 71 6c 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63  qlFunc(sqlite3_c
5b00: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c  ontext *context,
5b10: 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74   int argc, sqlit
5b20: 65 33 5f 76 61 6c 75 65 2a 2a 61 72 67 76 29 7b  e3_value**argv){
5b30: 0a 20 20 53 71 6c 46 75 6e 63 20 2a 70 20 3d 20  .  SqlFunc *p = 
5b40: 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74  sqlite3_user_dat
5b50: 61 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 54 63  a(context);.  Tc
5b60: 6c 5f 4f 62 6a 20 2a 70 43 6d 64 3b 0a 20 20 69  l_Obj *pCmd;.  i
5b70: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  nt i;.  int rc;.
5b80: 0a 20 20 69 66 28 20 61 72 67 63 3d 3d 30 20 29  .  if( argc==0 )
5b90: 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72  {.    /* If ther
5ba0: 65 20 61 72 65 20 6e 6f 20 61 72 67 75 6d 65 6e  e are no argumen
5bb0: 74 73 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69  ts to the functi
5bc0: 6f 6e 2c 20 63 61 6c 6c 20 54 63 6c 5f 45 76 61  on, call Tcl_Eva
5bd0: 6c 4f 62 6a 45 78 20 6f 6e 20 74 68 65 0a 20 20  lObjEx on the.  
5be0: 20 20 2a 2a 20 73 63 72 69 70 74 20 6f 62 6a 65    ** script obje
5bf0: 63 74 20 64 69 72 65 63 74 6c 79 2e 20 20 54 68  ct directly.  Th
5c00: 69 73 20 61 6c 6c 6f 77 73 20 74 68 65 20 54 43  is allows the TC
5c10: 4c 20 63 6f 6d 70 69 6c 65 72 20 74 6f 20 67 65  L compiler to ge
5c20: 6e 65 72 61 74 65 0a 20 20 20 20 2a 2a 20 62 79  nerate.    ** by
5c30: 74 65 63 6f 64 65 20 66 6f 72 20 74 68 65 20 63  tecode for the c
5c40: 6f 6d 6d 61 6e 64 20 6f 6e 20 74 68 65 20 66 69  ommand on the fi
5c50: 72 73 74 20 69 6e 76 6f 63 61 74 69 6f 6e 20 61  rst invocation a
5c60: 6e 64 20 74 68 75 73 20 6d 61 6b 65 0a 20 20 20  nd thus make.   
5c70: 20 2a 2a 20 73 75 62 73 65 71 75 65 6e 74 20 69   ** subsequent i
5c80: 6e 76 6f 63 61 74 69 6f 6e 73 20 6d 75 63 68 20  nvocations much 
5c90: 66 61 73 74 65 72 2e 20 2a 2f 0a 20 20 20 20 70  faster. */.    p
5ca0: 43 6d 64 20 3d 20 70 2d 3e 70 53 63 72 69 70 74  Cmd = p->pScript
5cb0: 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65  ;.    Tcl_IncrRe
5cc0: 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20  fCount(pCmd);.  
5cd0: 20 20 72 63 20 3d 20 54 63 6c 5f 45 76 61 6c 4f    rc = Tcl_EvalO
5ce0: 62 6a 45 78 28 70 2d 3e 69 6e 74 65 72 70 2c 20  bjEx(p->interp, 
5cf0: 70 43 6d 64 2c 20 30 29 3b 0a 20 20 20 20 54 63  pCmd, 0);.    Tc
5d00: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70  l_DecrRefCount(p
5d10: 43 6d 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Cmd);.  }else{. 
5d20: 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61     /* If there a
5d30: 72 65 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20  re arguments to 
5d40: 74 68 65 20 66 75 6e 63 74 69 6f 6e 2c 20 6d 61  the function, ma
5d50: 6b 65 20 61 20 73 68 61 6c 6c 6f 77 20 63 6f 70  ke a shallow cop
5d60: 79 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  y of the.    ** 
5d70: 73 63 72 69 70 74 20 6f 62 6a 65 63 74 2c 20 6c  script object, l
5d80: 61 70 70 65 6e 64 20 74 68 65 20 61 72 67 75 6d  append the argum
5d90: 65 6e 74 73 2c 20 74 68 65 6e 20 65 76 61 6c 75  ents, then evalu
5da0: 61 74 65 20 74 68 65 20 63 6f 70 79 2e 0a 20 20  ate the copy..  
5db0: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 42 79 20 22    **.    ** By "
5dc0: 73 68 61 6c 6c 6f 77 22 20 63 6f 70 79 2c 20 77  shallow" copy, w
5dd0: 65 20 6d 65 61 6e 20 61 20 6f 6e 6c 79 20 74 68  e mean a only th
5de0: 65 20 6f 75 74 65 72 20 6c 69 73 74 20 54 63 6c  e outer list Tcl
5df0: 5f 4f 62 6a 20 69 73 20 64 75 70 6c 69 63 61 74  _Obj is duplicat
5e00: 65 64 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 6e  ed..    ** The n
5e10: 65 77 20 54 63 6c 5f 4f 62 6a 20 63 6f 6e 74 61  ew Tcl_Obj conta
5e20: 69 6e 73 20 70 6f 69 6e 74 65 72 73 20 74 6f 20  ins pointers to 
5e30: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 6c 69 73  the original lis
5e40: 74 20 65 6c 65 6d 65 6e 74 73 2e 20 0a 20 20 20  t elements. .   
5e50: 20 2a 2a 20 54 68 61 74 20 77 61 79 2c 20 77 68   ** That way, wh
5e60: 65 6e 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 76 28  en Tcl_EvalObjv(
5e70: 29 20 69 73 20 72 75 6e 20 61 6e 64 20 73 68 69  ) is run and shi
5e80: 6d 6d 65 72 73 20 74 68 65 20 66 69 72 73 74 20  mmers the first 
5e90: 65 6c 65 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 6f  element.    ** o
5ea0: 66 20 74 68 65 20 6c 69 73 74 20 74 6f 20 74 63  f the list to tc
5eb0: 6c 43 6d 64 4e 61 6d 65 54 79 70 65 2c 20 74 68  lCmdNameType, th
5ec0: 61 74 20 61 6c 74 65 72 6e 61 74 65 20 72 65 70  at alternate rep
5ed0: 72 65 73 65 6e 74 61 74 69 6f 6e 20 77 69 6c 6c  resentation will
5ee0: 0a 20 20 20 20 2a 2a 20 62 65 20 70 72 65 73 65  .    ** be prese
5ef0: 72 76 65 64 20 61 6e 64 20 72 65 75 73 65 64 20  rved and reused 
5f00: 6f 6e 20 74 68 65 20 6e 65 78 74 20 69 6e 76 6f  on the next invo
5f10: 63 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20  cation..    */. 
5f20: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 61 41 72     Tcl_Obj **aAr
5f30: 67 3b 0a 20 20 20 20 69 6e 74 20 6e 41 72 67 3b  g;.    int nArg;
5f40: 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 4c 69 73  .    if( Tcl_Lis
5f50: 74 4f 62 6a 47 65 74 45 6c 65 6d 65 6e 74 73 28  tObjGetElements(
5f60: 70 2d 3e 69 6e 74 65 72 70 2c 20 70 2d 3e 70 53  p->interp, p->pS
5f70: 63 72 69 70 74 2c 20 26 6e 41 72 67 2c 20 26 61  cript, &nArg, &a
5f80: 41 72 67 29 20 29 7b 0a 20 20 20 20 20 20 73 71  Arg) ){.      sq
5f90: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72  lite3_result_err
5fa0: 6f 72 28 63 6f 6e 74 65 78 74 2c 20 54 63 6c 5f  or(context, Tcl_
5fb0: 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28  GetStringResult(
5fc0: 70 2d 3e 69 6e 74 65 72 70 29 2c 20 2d 31 29 3b  p->interp), -1);
5fd0: 20 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a   .      return;.
5fe0: 20 20 20 20 7d 20 20 20 20 20 0a 20 20 20 20 70      }     .    p
5ff0: 43 6d 64 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73  Cmd = Tcl_NewLis
6000: 74 4f 62 6a 28 6e 41 72 67 2c 20 61 41 72 67 29  tObj(nArg, aArg)
6010: 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65  ;.    Tcl_IncrRe
6020: 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20  fCount(pCmd);.  
6030: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 67    for(i=0; i<arg
6040: 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  c; i++){.      s
6050: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 49  qlite3_value *pI
6060: 6e 20 3d 20 61 72 67 76 5b 69 5d 3b 0a 20 20 20  n = argv[i];.   
6070: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 56 61 6c     Tcl_Obj *pVal
6080: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 0a 20  ;.            . 
6090: 20 20 20 20 20 2f 2a 20 53 65 74 20 70 56 61 6c       /* Set pVal
60a0: 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20   to contain the 
60b0: 69 27 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  i'th column of t
60c0: 68 69 73 20 72 6f 77 2e 20 2a 2f 0a 20 20 20 20  his row. */.    
60d0: 20 20 73 77 69 74 63 68 28 20 73 71 6c 69 74 65    switch( sqlite
60e0: 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 70 49 6e  3_value_type(pIn
60f0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63 61 73  ) ){.        cas
6100: 65 20 53 51 4c 49 54 45 5f 42 4c 4f 42 3a 20 7b  e SQLITE_BLOB: {
6110: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 62  .          int b
6120: 79 74 65 73 20 3d 20 73 71 6c 69 74 65 33 5f 76  ytes = sqlite3_v
6130: 61 6c 75 65 5f 62 79 74 65 73 28 70 49 6e 29 3b  alue_bytes(pIn);
6140: 0a 20 20 20 20 20 20 20 20 20 20 70 56 61 6c 20  .          pVal 
6150: 3d 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72  = Tcl_NewByteArr
6160: 61 79 4f 62 6a 28 73 71 6c 69 74 65 33 5f 76 61  ayObj(sqlite3_va
6170: 6c 75 65 5f 62 6c 6f 62 28 70 49 6e 29 2c 20 62  lue_blob(pIn), b
6180: 79 74 65 73 29 3b 0a 20 20 20 20 20 20 20 20 20  ytes);.         
6190: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
61a0: 7d 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 53  }.        case S
61b0: 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3a 20 7b  QLITE_INTEGER: {
61c0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
61d0: 65 5f 69 6e 74 36 34 20 76 20 3d 20 73 71 6c 69  e_int64 v = sqli
61e0: 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28  te3_value_int64(
61f0: 70 49 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20  pIn);.          
6200: 69 66 28 20 76 3e 3d 2d 32 31 34 37 34 38 33 36  if( v>=-21474836
6210: 34 37 20 26 26 20 76 3c 3d 32 31 34 37 34 38 33  47 && v<=2147483
6220: 36 34 37 20 29 7b 0a 20 20 20 20 20 20 20 20 20  647 ){.         
6230: 20 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65     pVal = Tcl_Ne
6240: 77 49 6e 74 4f 62 6a 28 28 69 6e 74 29 76 29 3b  wIntObj((int)v);
6250: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
6260: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 56  {.            pV
6270: 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 57 69 64 65  al = Tcl_NewWide
6280: 49 6e 74 4f 62 6a 28 76 29 3b 0a 20 20 20 20 20  IntObj(v);.     
6290: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
62a0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
62b0: 7d 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 53  }.        case S
62c0: 51 4c 49 54 45 5f 46 4c 4f 41 54 3a 20 7b 0a 20  QLITE_FLOAT: {. 
62d0: 20 20 20 20 20 20 20 20 20 64 6f 75 62 6c 65 20           double 
62e0: 72 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  r = sqlite3_valu
62f0: 65 5f 64 6f 75 62 6c 65 28 70 49 6e 29 3b 0a 20  e_double(pIn);. 
6300: 20 20 20 20 20 20 20 20 20 70 56 61 6c 20 3d 20           pVal = 
6310: 54 63 6c 5f 4e 65 77 44 6f 75 62 6c 65 4f 62 6a  Tcl_NewDoubleObj
6320: 28 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62  (r);.          b
6330: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
6340: 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c          case SQL
6350: 49 54 45 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20  ITE_NULL: {.    
6360: 20 20 20 20 20 20 70 56 61 6c 20 3d 20 54 63 6c        pVal = Tcl
6370: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 22  _NewStringObj(""
6380: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
6390: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
63a0: 0a 20 20 20 20 20 20 20 20 64 65 66 61 75 6c 74  .        default
63b0: 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  : {.          in
63c0: 74 20 62 79 74 65 73 20 3d 20 73 71 6c 69 74 65  t bytes = sqlite
63d0: 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 70 49  3_value_bytes(pI
63e0: 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 56  n);.          pV
63f0: 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69  al = Tcl_NewStri
6400: 6e 67 4f 62 6a 28 28 63 68 61 72 20 2a 29 73 71  ngObj((char *)sq
6410: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
6420: 28 70 49 6e 29 2c 20 62 79 74 65 73 29 3b 0a 20  (pIn), bytes);. 
6430: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
6440: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
6450: 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 54 63 6c  }.      rc = Tcl
6460: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
6470: 65 6d 65 6e 74 28 70 2d 3e 69 6e 74 65 72 70 2c  ement(p->interp,
6480: 20 70 43 6d 64 2c 20 70 56 61 6c 29 3b 0a 20 20   pCmd, pVal);.  
6490: 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
64a0: 20 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65        Tcl_DecrRe
64b0: 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20  fCount(pCmd);.  
64c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
64d0: 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65  sult_error(conte
64e0: 78 74 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  xt, Tcl_GetStrin
64f0: 67 52 65 73 75 6c 74 28 70 2d 3e 69 6e 74 65 72  gResult(p->inter
6500: 70 29 2c 20 2d 31 29 3b 20 0a 20 20 20 20 20 20  p), -1); .      
6510: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20    return;.      
6520: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
6530: 21 70 2d 3e 75 73 65 45 76 61 6c 4f 62 6a 76 20  !p->useEvalObjv 
6540: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 63 6c 5f  ){.      /* Tcl_
6550: 45 76 61 6c 4f 62 6a 45 78 28 29 20 77 69 6c 6c  EvalObjEx() will
6560: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63   automatically c
6570: 61 6c 6c 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 76  all Tcl_EvalObjv
6580: 28 29 20 69 66 20 70 43 6d 64 0a 20 20 20 20 20  () if pCmd.     
6590: 20 2a 2a 20 69 73 20 61 20 6c 69 73 74 20 77 69   ** is a list wi
65a0: 74 68 6f 75 74 20 61 20 73 74 72 69 6e 67 20 72  thout a string r
65b0: 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 2e 20 20  epresentation.  
65c0: 54 6f 20 70 72 65 76 65 6e 74 20 74 68 69 73 20  To prevent this 
65d0: 66 72 6f 6d 0a 20 20 20 20 20 20 2a 2a 20 68 61  from.      ** ha
65e0: 70 70 65 6e 69 6e 67 2c 20 6d 61 6b 65 20 73 75  ppening, make su
65f0: 72 65 20 70 43 6d 64 20 68 61 73 20 61 20 76 61  re pCmd has a va
6600: 6c 69 64 20 73 74 72 69 6e 67 20 72 65 70 72 65  lid string repre
6610: 73 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 20  sentation */.   
6620: 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
6630: 28 70 43 6d 64 29 3b 0a 20 20 20 20 7d 0a 20 20  (pCmd);.    }.  
6640: 20 20 72 63 20 3d 20 54 63 6c 5f 45 76 61 6c 4f    rc = Tcl_EvalO
6650: 62 6a 45 78 28 70 2d 3e 69 6e 74 65 72 70 2c 20  bjEx(p->interp, 
6660: 70 43 6d 64 2c 20 54 43 4c 5f 45 56 41 4c 5f 44  pCmd, TCL_EVAL_D
6670: 49 52 45 43 54 29 3b 0a 20 20 20 20 54 63 6c 5f  IRECT);.    Tcl_
6680: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 43 6d  DecrRefCount(pCm
6690: 64 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72  d);.  }..  if( r
66a0: 63 20 26 26 20 72 63 21 3d 54 43 4c 5f 52 45 54  c && rc!=TCL_RET
66b0: 55 52 4e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  URN ){.    sqlit
66c0: 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28  e3_result_error(
66d0: 63 6f 6e 74 65 78 74 2c 20 54 63 6c 5f 47 65 74  context, Tcl_Get
66e0: 53 74 72 69 6e 67 52 65 73 75 6c 74 28 70 2d 3e  StringResult(p->
66f0: 69 6e 74 65 72 70 29 2c 20 2d 31 29 3b 20 0a 20  interp), -1); . 
6700: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 54 63 6c 5f   }else{.    Tcl_
6710: 4f 62 6a 20 2a 70 56 61 72 20 3d 20 54 63 6c 5f  Obj *pVar = Tcl_
6720: 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 70 2d 3e  GetObjResult(p->
6730: 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 69 6e 74  interp);.    int
6740: 20 6e 3b 0a 20 20 20 20 75 38 20 2a 64 61 74 61   n;.    u8 *data
6750: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
6760: 20 2a 7a 54 79 70 65 20 3d 20 28 70 56 61 72 2d   *zType = (pVar-
6770: 3e 74 79 70 65 50 74 72 20 3f 20 70 56 61 72 2d  >typePtr ? pVar-
6780: 3e 74 79 70 65 50 74 72 2d 3e 6e 61 6d 65 20 3a  >typePtr->name :
6790: 20 22 22 29 3b 0a 20 20 20 20 63 68 61 72 20 63   "");.    char c
67a0: 20 3d 20 7a 54 79 70 65 5b 30 5d 3b 0a 20 20 20   = zType[0];.   
67b0: 20 69 66 28 20 63 3d 3d 27 62 27 20 26 26 20 73   if( c=='b' && s
67c0: 74 72 63 6d 70 28 7a 54 79 70 65 2c 22 62 79 74  trcmp(zType,"byt
67d0: 65 61 72 72 61 79 22 29 3d 3d 30 20 26 26 20 70  earray")==0 && p
67e0: 56 61 72 2d 3e 62 79 74 65 73 3d 3d 30 20 29 7b  Var->bytes==0 ){
67f0: 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 72  .      /* Only r
6800: 65 74 75 72 6e 20 61 20 42 4c 4f 42 20 74 79 70  eturn a BLOB typ
6810: 65 20 69 66 20 74 68 65 20 54 63 6c 20 76 61 72  e if the Tcl var
6820: 69 61 62 6c 65 20 69 73 20 61 20 62 79 74 65 61  iable is a bytea
6830: 72 72 61 79 20 61 6e 64 0a 20 20 20 20 20 20 2a  rray and.      *
6840: 2a 20 68 61 73 20 6e 6f 20 73 74 72 69 6e 67 20  * has no string 
6850: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 2e 20  representation. 
6860: 2a 2f 0a 20 20 20 20 20 20 64 61 74 61 20 3d 20  */.      data = 
6870: 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79  Tcl_GetByteArray
6880: 46 72 6f 6d 4f 62 6a 28 70 56 61 72 2c 20 26 6e  FromObj(pVar, &n
6890: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
68a0: 5f 72 65 73 75 6c 74 5f 62 6c 6f 62 28 63 6f 6e  _result_blob(con
68b0: 74 65 78 74 2c 20 64 61 74 61 2c 20 6e 2c 20 53  text, data, n, S
68c0: 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
68d0: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
68e0: 63 3d 3d 27 62 27 20 26 26 20 73 74 72 63 6d 70  c=='b' && strcmp
68f0: 28 7a 54 79 70 65 2c 22 62 6f 6f 6c 65 61 6e 22  (zType,"boolean"
6900: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 54 63  )==0 ){.      Tc
6910: 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
6920: 30 2c 20 70 56 61 72 2c 20 26 6e 29 3b 0a 20 20  0, pVar, &n);.  
6930: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
6940: 6c 74 5f 69 6e 74 28 63 6f 6e 74 65 78 74 2c 20  lt_int(context, 
6950: 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  n);.    }else if
6960: 28 20 63 3d 3d 27 64 27 20 26 26 20 73 74 72 63  ( c=='d' && strc
6970: 6d 70 28 7a 54 79 70 65 2c 22 64 6f 75 62 6c 65  mp(zType,"double
6980: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 64  ")==0 ){.      d
6990: 6f 75 62 6c 65 20 72 3b 0a 20 20 20 20 20 20 54  ouble r;.      T
69a0: 63 6c 5f 47 65 74 44 6f 75 62 6c 65 46 72 6f 6d  cl_GetDoubleFrom
69b0: 4f 62 6a 28 30 2c 20 70 56 61 72 2c 20 26 72 29  Obj(0, pVar, &r)
69c0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
69d0: 72 65 73 75 6c 74 5f 64 6f 75 62 6c 65 28 63 6f  result_double(co
69e0: 6e 74 65 78 74 2c 20 72 29 3b 0a 20 20 20 20 7d  ntext, r);.    }
69f0: 65 6c 73 65 20 69 66 28 20 28 63 3d 3d 27 77 27  else if( (c=='w'
6a00: 20 26 26 20 73 74 72 63 6d 70 28 7a 54 79 70 65   && strcmp(zType
6a10: 2c 22 77 69 64 65 49 6e 74 22 29 3d 3d 30 29 20  ,"wideInt")==0) 
6a20: 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 28 63 3d  ||.          (c=
6a30: 3d 27 69 27 20 26 26 20 73 74 72 63 6d 70 28 7a  ='i' && strcmp(z
6a40: 54 79 70 65 2c 22 69 6e 74 22 29 3d 3d 30 29 20  Type,"int")==0) 
6a50: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 69 64  ){.      Tcl_Wid
6a60: 65 49 6e 74 20 76 3b 0a 20 20 20 20 20 20 54 63  eInt v;.      Tc
6a70: 6c 5f 47 65 74 57 69 64 65 49 6e 74 46 72 6f 6d  l_GetWideIntFrom
6a80: 4f 62 6a 28 30 2c 20 70 56 61 72 2c 20 26 76 29  Obj(0, pVar, &v)
6a90: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
6aa0: 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 63 6f 6e  result_int64(con
6ab0: 74 65 78 74 2c 20 76 29 3b 0a 20 20 20 20 7d 65  text, v);.    }e
6ac0: 6c 73 65 7b 0a 20 20 20 20 20 20 64 61 74 61 20  lse{.      data 
6ad0: 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  = (unsigned char
6ae0: 20 2a 29 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   *)Tcl_GetString
6af0: 46 72 6f 6d 4f 62 6a 28 70 56 61 72 2c 20 26 6e  FromObj(pVar, &n
6b00: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
6b10: 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e  _result_text(con
6b20: 74 65 78 74 2c 20 28 63 68 61 72 20 2a 29 64 61  text, (char *)da
6b30: 74 61 2c 20 6e 2c 20 53 51 4c 49 54 45 5f 54 52  ta, n, SQLITE_TR
6b40: 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 7d 0a  ANSIENT);.    }.
6b50: 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53    }.}..#ifndef S
6b60: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f  QLITE_OMIT_AUTHO
6b70: 52 49 5a 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 54  RIZATION./*.** T
6b80: 68 69 73 20 69 73 20 74 68 65 20 61 75 74 68 65  his is the authe
6b90: 6e 74 69 63 61 74 69 6f 6e 20 66 75 6e 63 74 69  ntication functi
6ba0: 6f 6e 2e 20 20 49 74 20 61 70 70 65 6e 64 73 20  on.  It appends 
6bb0: 74 68 65 20 61 75 74 68 65 6e 74 69 63 61 74 69  the authenticati
6bc0: 6f 6e 0a 2a 2a 20 74 79 70 65 20 63 6f 64 65 20  on.** type code 
6bd0: 61 6e 64 20 74 68 65 20 74 77 6f 20 61 72 67 75  and the two argu
6be0: 6d 65 6e 74 73 20 74 6f 20 7a 43 6d 64 5b 5d 20  ments to zCmd[] 
6bf0: 74 68 65 6e 20 69 6e 76 6f 6b 65 73 20 74 68 65  then invokes the
6c00: 20 72 65 73 75 6c 74 0a 2a 2a 20 6f 6e 20 74 68   result.** on th
6c10: 65 20 69 6e 74 65 72 70 72 65 74 65 72 2e 20 20  e interpreter.  
6c20: 54 68 65 20 72 65 70 6c 79 20 69 73 20 65 78 61  The reply is exa
6c30: 6d 69 6e 65 64 20 74 6f 20 64 65 74 65 72 6d 69  mined to determi
6c40: 6e 65 20 69 66 20 74 68 65 0a 2a 2a 20 61 75 74  ne if the.** aut
6c50: 68 65 6e 74 69 63 61 74 69 6f 6e 20 66 61 69 6c  hentication fail
6c60: 73 20 6f 72 20 73 75 63 63 65 65 64 73 2e 0a 2a  s or succeeds..*
6c70: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 75 74  /.static int aut
6c80: 68 5f 63 61 6c 6c 62 61 63 6b 28 0a 20 20 76 6f  h_callback(.  vo
6c90: 69 64 20 2a 70 41 72 67 2c 0a 20 20 69 6e 74 20  id *pArg,.  int 
6ca0: 63 6f 64 65 2c 0a 20 20 63 6f 6e 73 74 20 63 68  code,.  const ch
6cb0: 61 72 20 2a 7a 41 72 67 31 2c 0a 20 20 63 6f 6e  ar *zArg1,.  con
6cc0: 73 74 20 63 68 61 72 20 2a 7a 41 72 67 32 2c 0a  st char *zArg2,.
6cd0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41    const char *zA
6ce0: 72 67 33 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  rg3,.  const cha
6cf0: 72 20 2a 7a 41 72 67 34 0a 29 7b 0a 20 20 63 68  r *zArg4.){.  ch
6d00: 61 72 20 2a 7a 43 6f 64 65 3b 0a 20 20 54 63 6c  ar *zCode;.  Tcl
6d10: 5f 44 53 74 72 69 6e 67 20 73 74 72 3b 0a 20 20  _DString str;.  
6d20: 69 6e 74 20 72 63 3b 0a 20 20 63 6f 6e 73 74 20  int rc;.  const 
6d30: 63 68 61 72 20 2a 7a 52 65 70 6c 79 3b 0a 20 20  char *zReply;.  
6d40: 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20  SqliteDb *pDb = 
6d50: 28 53 71 6c 69 74 65 44 62 2a 29 70 41 72 67 3b  (SqliteDb*)pArg;
6d60: 0a 20 20 69 66 28 20 70 44 62 2d 3e 64 69 73 61  .  if( pDb->disa
6d70: 62 6c 65 41 75 74 68 20 29 20 72 65 74 75 72 6e  bleAuth ) return
6d80: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 73   SQLITE_OK;..  s
6d90: 77 69 74 63 68 28 20 63 6f 64 65 20 29 7b 0a 20  witch( code ){. 
6da0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
6db0: 4f 50 59 20 20 20 20 20 20 20 20 20 20 20 20 20  OPY             
6dc0: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
6dd0: 5f 43 4f 50 59 22 3b 20 62 72 65 61 6b 3b 0a 20  _COPY"; break;. 
6de0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
6df0: 52 45 41 54 45 5f 49 4e 44 45 58 20 20 20 20 20  REATE_INDEX     
6e00: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
6e10: 5f 43 52 45 41 54 45 5f 49 4e 44 45 58 22 3b 20  _CREATE_INDEX"; 
6e20: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
6e30: 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 41  SQLITE_CREATE_TA
6e40: 42 4c 45 20 20 20 20 20 20 3a 20 7a 43 6f 64 65  BLE      : zCode
6e50: 3d 22 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  ="SQLITE_CREATE_
6e60: 54 41 42 4c 45 22 3b 20 62 72 65 61 6b 3b 0a 20  TABLE"; break;. 
6e70: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
6e80: 52 45 41 54 45 5f 54 45 4d 50 5f 49 4e 44 45 58  REATE_TEMP_INDEX
6e90: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
6ea0: 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 49 4e 44  _CREATE_TEMP_IND
6eb0: 45 58 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  EX"; break;.    
6ec0: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 52 45 41  case SQLITE_CREA
6ed0: 54 45 5f 54 45 4d 50 5f 54 41 42 4c 45 20 3a 20  TE_TEMP_TABLE : 
6ee0: 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43 52  zCode="SQLITE_CR
6ef0: 45 41 54 45 5f 54 45 4d 50 5f 54 41 42 4c 45 22  EATE_TEMP_TABLE"
6f00: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
6f10: 65 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  e SQLITE_CREATE_
6f20: 54 45 4d 50 5f 54 52 49 47 47 45 52 3a 20 7a 43  TEMP_TRIGGER: zC
6f30: 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43 52 45 41  ode="SQLITE_CREA
6f40: 54 45 5f 54 45 4d 50 5f 54 52 49 47 47 45 52 22  TE_TEMP_TRIGGER"
6f50: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
6f60: 65 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  e SQLITE_CREATE_
6f70: 54 45 4d 50 5f 56 49 45 57 20 20 3a 20 7a 43 6f  TEMP_VIEW  : zCo
6f80: 64 65 3d 22 53 51 4c 49 54 45 5f 43 52 45 41 54  de="SQLITE_CREAT
6f90: 45 5f 54 45 4d 50 5f 56 49 45 57 22 3b 20 62 72  E_TEMP_VIEW"; br
6fa0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
6fb0: 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 52 49 47  LITE_CREATE_TRIG
6fc0: 47 45 52 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22  GER    : zCode="
6fd0: 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 52  SQLITE_CREATE_TR
6fe0: 49 47 47 45 52 22 3b 20 62 72 65 61 6b 3b 0a 20  IGGER"; break;. 
6ff0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
7000: 52 45 41 54 45 5f 56 49 45 57 20 20 20 20 20 20  REATE_VIEW      
7010: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
7020: 5f 43 52 45 41 54 45 5f 56 49 45 57 22 3b 20 62  _CREATE_VIEW"; b
7030: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
7040: 51 4c 49 54 45 5f 44 45 4c 45 54 45 20 20 20 20  QLITE_DELETE    
7050: 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d          : zCode=
7060: 22 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 22 3b  "SQLITE_DELETE";
7070: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
7080: 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 49 4e 44   SQLITE_DROP_IND
7090: 45 58 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64  EX        : zCod
70a0: 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f 49  e="SQLITE_DROP_I
70b0: 4e 44 45 58 22 3b 20 62 72 65 61 6b 3b 0a 20 20  NDEX"; break;.  
70c0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44 52    case SQLITE_DR
70d0: 4f 50 5f 54 41 42 4c 45 20 20 20 20 20 20 20 20  OP_TABLE        
70e0: 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f  : zCode="SQLITE_
70f0: 44 52 4f 50 5f 54 41 42 4c 45 22 3b 20 62 72 65  DROP_TABLE"; bre
7100: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
7110: 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 49 4e  ITE_DROP_TEMP_IN
7120: 44 45 58 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53  DEX   : zCode="S
7130: 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f  QLITE_DROP_TEMP_
7140: 49 4e 44 45 58 22 3b 20 62 72 65 61 6b 3b 0a 20  INDEX"; break;. 
7150: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44     case SQLITE_D
7160: 52 4f 50 5f 54 45 4d 50 5f 54 41 42 4c 45 20 20  ROP_TEMP_TABLE  
7170: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
7180: 5f 44 52 4f 50 5f 54 45 4d 50 5f 54 41 42 4c 45  _DROP_TEMP_TABLE
7190: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
71a0: 73 65 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54  se SQLITE_DROP_T
71b0: 45 4d 50 5f 54 52 49 47 47 45 52 20 3a 20 7a 43  EMP_TRIGGER : zC
71c0: 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50  ode="SQLITE_DROP
71d0: 5f 54 45 4d 50 5f 54 52 49 47 47 45 52 22 3b 20  _TEMP_TRIGGER"; 
71e0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
71f0: 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50  SQLITE_DROP_TEMP
7200: 5f 56 49 45 57 20 20 20 20 3a 20 7a 43 6f 64 65  _VIEW    : zCode
7210: 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45  ="SQLITE_DROP_TE
7220: 4d 50 5f 56 49 45 57 22 3b 20 62 72 65 61 6b 3b  MP_VIEW"; break;
7230: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
7240: 5f 44 52 4f 50 5f 54 52 49 47 47 45 52 20 20 20  _DROP_TRIGGER   
7250: 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49     : zCode="SQLI
7260: 54 45 5f 44 52 4f 50 5f 54 52 49 47 47 45 52 22  TE_DROP_TRIGGER"
7270: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
7280: 65 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56 49  e SQLITE_DROP_VI
7290: 45 57 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f  EW         : zCo
72a0: 64 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f  de="SQLITE_DROP_
72b0: 56 49 45 57 22 3b 20 62 72 65 61 6b 3b 0a 20 20  VIEW"; break;.  
72c0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e    case SQLITE_IN
72d0: 53 45 52 54 20 20 20 20 20 20 20 20 20 20 20 20  SERT            
72e0: 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f  : zCode="SQLITE_
72f0: 49 4e 53 45 52 54 22 3b 20 62 72 65 61 6b 3b 0a  INSERT"; break;.
7300: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
7310: 50 52 41 47 4d 41 20 20 20 20 20 20 20 20 20 20  PRAGMA          
7320: 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54    : zCode="SQLIT
7330: 45 5f 50 52 41 47 4d 41 22 3b 20 62 72 65 61 6b  E_PRAGMA"; break
7340: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
7350: 45 5f 52 45 41 44 20 20 20 20 20 20 20 20 20 20  E_READ          
7360: 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c      : zCode="SQL
7370: 49 54 45 5f 52 45 41 44 22 3b 20 62 72 65 61 6b  ITE_READ"; break
7380: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
7390: 45 5f 53 45 4c 45 43 54 20 20 20 20 20 20 20 20  E_SELECT        
73a0: 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c      : zCode="SQL
73b0: 49 54 45 5f 53 45 4c 45 43 54 22 3b 20 62 72 65  ITE_SELECT"; bre
73c0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
73d0: 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 20  ITE_TRANSACTION 
73e0: 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53        : zCode="S
73f0: 51 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f  QLITE_TRANSACTIO
7400: 4e 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  N"; break;.    c
7410: 61 73 65 20 53 51 4c 49 54 45 5f 55 50 44 41 54  ase SQLITE_UPDAT
7420: 45 20 20 20 20 20 20 20 20 20 20 20 20 3a 20 7a  E            : z
7430: 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 55 50 44  Code="SQLITE_UPD
7440: 41 54 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  ATE"; break;.   
7450: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 54 54   case SQLITE_ATT
7460: 41 43 48 20 20 20 20 20 20 20 20 20 20 20 20 3a  ACH            :
7470: 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 41   zCode="SQLITE_A
7480: 54 54 41 43 48 22 3b 20 62 72 65 61 6b 3b 0a 20  TTACH"; break;. 
7490: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44     case SQLITE_D
74a0: 45 54 41 43 48 20 20 20 20 20 20 20 20 20 20 20  ETACH           
74b0: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
74c0: 5f 44 45 54 41 43 48 22 3b 20 62 72 65 61 6b 3b  _DETACH"; break;
74d0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
74e0: 5f 41 4c 54 45 52 5f 54 41 42 4c 45 20 20 20 20  _ALTER_TABLE    
74f0: 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49     : zCode="SQLI
7500: 54 45 5f 41 4c 54 45 52 5f 54 41 42 4c 45 22 3b  TE_ALTER_TABLE";
7510: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
7520: 20 53 51 4c 49 54 45 5f 52 45 49 4e 44 45 58 20   SQLITE_REINDEX 
7530: 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64            : zCod
7540: 65 3d 22 53 51 4c 49 54 45 5f 52 45 49 4e 44 45  e="SQLITE_REINDE
7550: 58 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  X"; break;.    c
7560: 61 73 65 20 53 51 4c 49 54 45 5f 41 4e 41 4c 59  ase SQLITE_ANALY
7570: 5a 45 20 20 20 20 20 20 20 20 20 20 20 3a 20 7a  ZE           : z
7580: 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 41 4e 41  Code="SQLITE_ANA
7590: 4c 59 5a 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20  LYZE"; break;.  
75a0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 52    case SQLITE_CR
75b0: 45 41 54 45 5f 56 54 41 42 4c 45 20 20 20 20 20  EATE_VTABLE     
75c0: 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f  : zCode="SQLITE_
75d0: 43 52 45 41 54 45 5f 56 54 41 42 4c 45 22 3b 20  CREATE_VTABLE"; 
75e0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
75f0: 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56 54 41 42  SQLITE_DROP_VTAB
7600: 4c 45 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65  LE       : zCode
7610: 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56 54  ="SQLITE_DROP_VT
7620: 41 42 4c 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20  ABLE"; break;.  
7630: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 55    case SQLITE_FU
7640: 4e 43 54 49 4f 4e 20 20 20 20 20 20 20 20 20 20  NCTION          
7650: 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f  : zCode="SQLITE_
7660: 46 55 4e 43 54 49 4f 4e 22 3b 20 62 72 65 61 6b  FUNCTION"; break
7670: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
7680: 45 5f 53 41 56 45 50 4f 49 4e 54 20 20 20 20 20  E_SAVEPOINT     
7690: 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c      : zCode="SQL
76a0: 49 54 45 5f 53 41 56 45 50 4f 49 4e 54 22 3b 20  ITE_SAVEPOINT"; 
76b0: 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75  break;.    defau
76c0: 6c 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  lt              
76d0: 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65           : zCode
76e0: 3d 22 3f 3f 3f 3f 22 3b 20 62 72 65 61 6b 3b 0a  ="????"; break;.
76f0: 20 20 7d 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e    }.  Tcl_DStrin
7700: 67 49 6e 69 74 28 26 73 74 72 29 3b 0a 20 20 54  gInit(&str);.  T
7710: 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64  cl_DStringAppend
7720: 28 26 73 74 72 2c 20 70 44 62 2d 3e 7a 41 75 74  (&str, pDb->zAut
7730: 68 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 44 53  h, -1);.  Tcl_DS
7740: 74 72 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65  tringAppendEleme
7750: 6e 74 28 26 73 74 72 2c 20 7a 43 6f 64 65 29 3b  nt(&str, zCode);
7760: 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70  .  Tcl_DStringAp
7770: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 26 73 74 72  pendElement(&str
7780: 2c 20 7a 41 72 67 31 20 3f 20 7a 41 72 67 31 20  , zArg1 ? zArg1 
7790: 3a 20 22 22 29 3b 0a 20 20 54 63 6c 5f 44 53 74  : "");.  Tcl_DSt
77a0: 72 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e  ringAppendElemen
77b0: 74 28 26 73 74 72 2c 20 7a 41 72 67 32 20 3f 20  t(&str, zArg2 ? 
77c0: 7a 41 72 67 32 20 3a 20 22 22 29 3b 0a 20 20 54  zArg2 : "");.  T
77d0: 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64  cl_DStringAppend
77e0: 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c 20 7a 41  Element(&str, zA
77f0: 72 67 33 20 3f 20 7a 41 72 67 33 20 3a 20 22 22  rg3 ? zArg3 : ""
7800: 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  );.  Tcl_DString
7810: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 26 73  AppendElement(&s
7820: 74 72 2c 20 7a 41 72 67 34 20 3f 20 7a 41 72 67  tr, zArg4 ? zArg
7830: 34 20 3a 20 22 22 29 3b 0a 20 20 72 63 20 3d 20  4 : "");.  rc = 
7840: 54 63 6c 5f 47 6c 6f 62 61 6c 45 76 61 6c 28 70  Tcl_GlobalEval(p
7850: 44 62 2d 3e 69 6e 74 65 72 70 2c 20 54 63 6c 5f  Db->interp, Tcl_
7860: 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 73 74  DStringValue(&st
7870: 72 29 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69  r));.  Tcl_DStri
7880: 6e 67 46 72 65 65 28 26 73 74 72 29 3b 0a 20 20  ngFree(&str);.  
7890: 7a 52 65 70 6c 79 20 3d 20 54 63 6c 5f 47 65 74  zReply = Tcl_Get
78a0: 53 74 72 69 6e 67 52 65 73 75 6c 74 28 70 44 62  StringResult(pDb
78b0: 2d 3e 69 6e 74 65 72 70 29 3b 0a 20 20 69 66 28  ->interp);.  if(
78c0: 20 73 74 72 63 6d 70 28 7a 52 65 70 6c 79 2c 22   strcmp(zReply,"
78d0: 53 51 4c 49 54 45 5f 4f 4b 22 29 3d 3d 30 20 29  SQLITE_OK")==0 )
78e0: 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
78f0: 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 20 69 66  E_OK;.  }else if
7900: 28 20 73 74 72 63 6d 70 28 7a 52 65 70 6c 79 2c  ( strcmp(zReply,
7910: 22 53 51 4c 49 54 45 5f 44 45 4e 59 22 29 3d 3d  "SQLITE_DENY")==
7920: 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  0 ){.    rc = SQ
7930: 4c 49 54 45 5f 44 45 4e 59 3b 0a 20 20 7d 65 6c  LITE_DENY;.  }el
7940: 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 52  se if( strcmp(zR
7950: 65 70 6c 79 2c 22 53 51 4c 49 54 45 5f 49 47 4e  eply,"SQLITE_IGN
7960: 4f 52 45 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ORE")==0 ){.    
7970: 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 47 4e 4f  rc = SQLITE_IGNO
7980: 52 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  RE;.  }else{.   
7990: 20 72 63 20 3d 20 39 39 39 3b 0a 20 20 7d 0a 20   rc = 999;.  }. 
79a0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65   return rc;.}.#e
79b0: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
79c0: 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f  MIT_AUTHORIZATIO
79d0: 4e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 7a 54 65 78  N */../*.** zTex
79e0: 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  t is a pointer t
79f0: 6f 20 74 65 78 74 20 6f 62 74 61 69 6e 65 64 20  o text obtained 
7a00: 76 69 61 20 61 6e 20 73 71 6c 69 74 65 33 5f 72  via an sqlite3_r
7a10: 65 73 75 6c 74 5f 74 65 78 74 28 29 0a 2a 2a 20  esult_text().** 
7a20: 6f 72 20 73 69 6d 69 6c 61 72 20 69 6e 74 65 72  or similar inter
7a30: 66 61 63 65 2e 20 54 68 69 73 20 72 6f 75 74 69  face. This routi
7a40: 6e 65 20 72 65 74 75 72 6e 73 20 61 20 54 63 6c  ne returns a Tcl
7a50: 20 73 74 72 69 6e 67 20 6f 62 6a 65 63 74 2c 20   string object, 
7a60: 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 63 6f  .** reference co
7a70: 75 6e 74 20 73 65 74 20 74 6f 20 30 2c 20 63 6f  unt set to 0, co
7a80: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74 65 78  ntaining the tex
7a90: 74 2e 20 49 66 20 61 20 74 72 61 6e 73 6c 61 74  t. If a translat
7aa0: 69 6f 6e 0a 2a 2a 20 62 65 74 77 65 65 6e 20 69  ion.** between i
7ab0: 73 6f 38 38 35 39 20 61 6e 64 20 55 54 46 2d 38  so8859 and UTF-8
7ac0: 20 69 73 20 72 65 71 75 69 72 65 64 2c 20 69 74   is required, it
7ad0: 20 69 73 20 70 72 65 66 6f 72 6d 65 64 2e 0a 2a   is preformed..*
7ae0: 2f 0a 73 74 61 74 69 63 20 54 63 6c 5f 4f 62 6a  /.static Tcl_Obj
7af0: 20 2a 64 62 54 65 78 74 54 6f 4f 62 6a 28 63 68   *dbTextToObj(ch
7b00: 61 72 20 63 6f 6e 73 74 20 2a 7a 54 65 78 74 29  ar const *zText)
7b10: 7b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 56 61  {.  Tcl_Obj *pVa
7b20: 6c 3b 0a 23 69 66 64 65 66 20 55 54 46 5f 54 52  l;.#ifdef UTF_TR
7b30: 41 4e 53 4c 41 54 49 4f 4e 5f 4e 45 45 44 45 44  ANSLATION_NEEDED
7b40: 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 64  .  Tcl_DString d
7b50: 43 6f 6c 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69  Col;.  Tcl_DStri
7b60: 6e 67 49 6e 69 74 28 26 64 43 6f 6c 29 3b 0a 20  ngInit(&dCol);. 
7b70: 20 54 63 6c 5f 45 78 74 65 72 6e 61 6c 54 6f 55   Tcl_ExternalToU
7b80: 74 66 44 53 74 72 69 6e 67 28 4e 55 4c 4c 2c 20  tfDString(NULL, 
7b90: 7a 54 65 78 74 2c 20 2d 31 2c 20 26 64 43 6f 6c  zText, -1, &dCol
7ba0: 29 3b 0a 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f  );.  pVal = Tcl_
7bb0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c  NewStringObj(Tcl
7bc0: 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 64  _DStringValue(&d
7bd0: 43 6f 6c 29 2c 20 2d 31 29 3b 0a 20 20 54 63 6c  Col), -1);.  Tcl
7be0: 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 43  _DStringFree(&dC
7bf0: 6f 6c 29 3b 0a 23 65 6c 73 65 0a 20 20 70 56 61  ol);.#else.  pVa
7c00: 6c 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  l = Tcl_NewStrin
7c10: 67 4f 62 6a 28 7a 54 65 78 74 2c 20 2d 31 29 3b  gObj(zText, -1);
7c20: 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
7c30: 20 70 56 61 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pVal;.}../*.** 
7c40: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 61  This routine rea
7c50: 64 73 20 61 20 6c 69 6e 65 20 6f 66 20 74 65 78  ds a line of tex
7c60: 74 20 66 72 6f 6d 20 46 49 4c 45 20 69 6e 2c 20  t from FILE in, 
7c70: 73 74 6f 72 65 73 0a 2a 2a 20 74 68 65 20 74 65  stores.** the te
7c80: 78 74 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74  xt in memory obt
7c90: 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f  ained from mallo
7ca0: 63 28 29 20 61 6e 64 20 72 65 74 75 72 6e 73 20  c() and returns 
7cb0: 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20  a pointer.** to 
7cc0: 74 68 65 20 74 65 78 74 2e 20 20 4e 55 4c 4c 20  the text.  NULL 
7cd0: 69 73 20 72 65 74 75 72 6e 65 64 20 61 74 20 65  is returned at e
7ce0: 6e 64 20 6f 66 20 66 69 6c 65 2c 20 6f 72 20 69  nd of file, or i
7cf0: 66 20 6d 61 6c 6c 6f 63 28 29 0a 2a 2a 20 66 61  f malloc().** fa
7d00: 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69  ils..**.** The i
7d10: 6e 74 65 72 66 61 63 65 20 69 73 20 6c 69 6b 65  nterface is like
7d20: 20 22 72 65 61 64 6c 69 6e 65 22 20 62 75 74 20   "readline" but 
7d30: 6e 6f 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20  no command-line 
7d40: 65 64 69 74 69 6e 67 0a 2a 2a 20 69 73 20 64 6f  editing.** is do
7d50: 6e 65 2e 0a 2a 2a 0a 2a 2a 20 63 6f 70 69 65 64  ne..**.** copied
7d60: 20 66 72 6f 6d 20 73 68 65 6c 6c 2e 63 20 66 72   from shell.c fr
7d70: 6f 6d 20 27 2e 69 6d 70 6f 72 74 27 20 63 6f 6d  om '.import' com
7d80: 6d 61 6e 64 0a 2a 2f 0a 73 74 61 74 69 63 20 63  mand.*/.static c
7d90: 68 61 72 20 2a 6c 6f 63 61 6c 5f 67 65 74 6c 69  har *local_getli
7da0: 6e 65 28 63 68 61 72 20 2a 7a 50 72 6f 6d 70 74  ne(char *zPrompt
7db0: 2c 20 46 49 4c 45 20 2a 69 6e 29 7b 0a 20 20 63  , FILE *in){.  c
7dc0: 68 61 72 20 2a 7a 4c 69 6e 65 3b 0a 20 20 69 6e  har *zLine;.  in
7dd0: 74 20 6e 4c 69 6e 65 3b 0a 20 20 69 6e 74 20 6e  t nLine;.  int n
7de0: 3b 0a 20 20 69 6e 74 20 65 6f 6c 3b 0a 0a 20 20  ;.  int eol;..  
7df0: 6e 4c 69 6e 65 20 3d 20 31 30 30 3b 0a 20 20 7a  nLine = 100;.  z
7e00: 4c 69 6e 65 20 3d 20 6d 61 6c 6c 6f 63 28 20 6e  Line = malloc( n
7e10: 4c 69 6e 65 20 29 3b 0a 20 20 69 66 28 20 7a 4c  Line );.  if( zL
7e20: 69 6e 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ine==0 ) return 
7e30: 30 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20 20 65 6f  0;.  n = 0;.  eo
7e40: 6c 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20  l = 0;.  while( 
7e50: 21 65 6f 6c 20 29 7b 0a 20 20 20 20 69 66 28 20  !eol ){.    if( 
7e60: 6e 2b 31 30 30 3e 6e 4c 69 6e 65 20 29 7b 0a 20  n+100>nLine ){. 
7e70: 20 20 20 20 20 6e 4c 69 6e 65 20 3d 20 6e 4c 69       nLine = nLi
7e80: 6e 65 2a 32 20 2b 20 31 30 30 3b 0a 20 20 20 20  ne*2 + 100;.    
7e90: 20 20 7a 4c 69 6e 65 20 3d 20 72 65 61 6c 6c 6f    zLine = reallo
7ea0: 63 28 7a 4c 69 6e 65 2c 20 6e 4c 69 6e 65 29 3b  c(zLine, nLine);
7eb0: 0a 20 20 20 20 20 20 69 66 28 20 7a 4c 69 6e 65  .      if( zLine
7ec0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
7ed0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 66 67      }.    if( fg
7ee0: 65 74 73 28 26 7a 4c 69 6e 65 5b 6e 5d 2c 20 6e  ets(&zLine[n], n
7ef0: 4c 69 6e 65 20 2d 20 6e 2c 20 69 6e 29 3d 3d 30  Line - n, in)==0
7f00: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 3d   ){.      if( n=
7f10: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66 72  =0 ){.        fr
7f20: 65 65 28 7a 4c 69 6e 65 29 3b 0a 20 20 20 20 20  ee(zLine);.     
7f30: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
7f40: 20 20 20 7d 0a 20 20 20 20 20 20 7a 4c 69 6e 65     }.      zLine
7f50: 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 65  [n] = 0;.      e
7f60: 6f 6c 20 3d 20 31 3b 0a 20 20 20 20 20 20 62 72  ol = 1;.      br
7f70: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77  eak;.    }.    w
7f80: 68 69 6c 65 28 20 7a 4c 69 6e 65 5b 6e 5d 20 29  hile( zLine[n] )
7f90: 7b 20 6e 2b 2b 3b 20 7d 0a 20 20 20 20 69 66 28  { n++; }.    if(
7fa0: 20 6e 3e 30 20 26 26 20 7a 4c 69 6e 65 5b 6e 2d   n>0 && zLine[n-
7fb0: 31 5d 3d 3d 27 5c 6e 27 20 29 7b 0a 20 20 20 20  1]=='\n' ){.    
7fc0: 20 20 6e 2d 2d 3b 0a 20 20 20 20 20 20 7a 4c 69    n--;.      zLi
7fd0: 6e 65 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20  ne[n] = 0;.     
7fe0: 20 65 6f 6c 20 3d 20 31 3b 0a 20 20 20 20 7d 0a   eol = 1;.    }.
7ff0: 20 20 7d 0a 20 20 7a 4c 69 6e 65 20 3d 20 72 65    }.  zLine = re
8000: 61 6c 6c 6f 63 28 20 7a 4c 69 6e 65 2c 20 6e 2b  alloc( zLine, n+
8010: 31 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 4c  1 );.  return zL
8020: 69 6e 65 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54  ine;.}.../*.** T
8030: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
8040: 70 61 72 74 20 6f 66 20 74 68 65 20 69 6d 70 6c  part of the impl
8050: 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  ementation of th
8060: 65 20 63 6f 6d 6d 61 6e 64 3a 0a 2a 2a 0a 2a 2a  e command:.**.**
8070: 20 20 20 24 64 62 20 74 72 61 6e 73 61 63 74 69     $db transacti
8080: 6f 6e 20 5b 2d 64 65 66 65 72 72 65 64 7c 2d 69  on [-deferred|-i
8090: 6d 6d 65 64 69 61 74 65 7c 2d 65 78 63 6c 75 73  mmediate|-exclus
80a0: 69 76 65 5d 20 53 43 52 49 50 54 0a 2a 2a 0a 2a  ive] SCRIPT.**.*
80b0: 2a 20 49 74 20 69 73 20 69 6e 76 6f 6b 65 64 20  * It is invoked 
80c0: 61 66 74 65 72 20 65 76 61 6c 75 61 74 69 6e 67  after evaluating
80d0: 20 74 68 65 20 73 63 72 69 70 74 20 53 43 52 49   the script SCRI
80e0: 50 54 20 74 6f 20 63 6f 6d 6d 69 74 20 6f 72 20  PT to commit or 
80f0: 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 74 68 65 20  rollback.** the 
8100: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 72 20 73  transaction or s
8110: 61 76 65 70 6f 69 6e 74 20 6f 70 65 6e 65 64 20  avepoint opened 
8120: 62 79 20 74 68 65 20 5b 74 72 61 6e 73 61 63 74  by the [transact
8130: 69 6f 6e 5d 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f  ion] command..*/
8140: 0a 73 74 61 74 69 63 20 69 6e 74 20 44 62 54 72  .static int DbTr
8150: 61 6e 73 50 6f 73 74 43 6d 64 28 0a 20 20 43 6c  ansPostCmd(.  Cl
8160: 69 65 6e 74 44 61 74 61 20 64 61 74 61 5b 5d 2c  ientData data[],
8170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8180: 20 20 20 2f 2a 20 64 61 74 61 5b 30 5d 20 69 73     /* data[0] is
8190: 20 74 68 65 20 53 71 6c 69 74 65 33 44 62 2a 20   the Sqlite3Db* 
81a0: 66 6f 72 20 24 64 62 20 2a 2f 0a 20 20 54 63 6c  for $db */.  Tcl
81b0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
81c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
81d0: 20 20 2f 2a 20 54 63 6c 20 69 6e 74 65 72 70 72    /* Tcl interpr
81e0: 65 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65  eter */.  int re
81f0: 73 75 6c 74 20 20 20 20 20 20 20 20 20 20 20 20  sult            
8200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8210: 2a 20 52 65 73 75 6c 74 20 6f 66 20 65 76 61 6c  * Result of eval
8220: 75 61 74 69 6e 67 20 53 43 52 49 50 54 20 2a 2f  uating SCRIPT */
8230: 0a 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  .){.  static con
8240: 73 74 20 63 68 61 72 20 2a 61 7a 45 6e 64 5b 5d  st char *azEnd[]
8250: 20 3d 20 7b 0a 20 20 20 20 22 52 45 4c 45 41 53   = {.    "RELEAS
8260: 45 20 5f 74 63 6c 5f 74 72 61 6e 73 61 63 74 69  E _tcl_transacti
8270: 6f 6e 22 2c 20 20 20 20 20 20 20 20 2f 2a 20 72  on",        /* r
8280: 63 3d 3d 54 43 4c 5f 45 52 52 4f 52 2c 20 6e 54  c==TCL_ERROR, nT
8290: 72 61 6e 73 61 63 74 69 6f 6e 21 3d 30 20 2a 2f  ransaction!=0 */
82a0: 0a 20 20 20 20 22 43 4f 4d 4d 49 54 22 2c 20 20  .    "COMMIT",  
82b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
82c0: 20 20 20 20 20 20 20 20 2f 2a 20 72 63 21 3d 54          /* rc!=T
82d0: 43 4c 5f 45 52 52 4f 52 2c 20 6e 54 72 61 6e 73  CL_ERROR, nTrans
82e0: 61 63 74 69 6f 6e 3d 3d 30 20 2a 2f 0a 20 20 20  action==0 */.   
82f0: 20 22 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 5f 74   "ROLLBACK TO _t
8300: 63 6c 5f 74 72 61 6e 73 61 63 74 69 6f 6e 20 3b  cl_transaction ;
8310: 20 52 45 4c 45 41 53 45 20 5f 74 63 6c 5f 74 72   RELEASE _tcl_tr
8320: 61 6e 73 61 63 74 69 6f 6e 22 2c 0a 20 20 20 20  ansaction",.    
8330: 22 52 4f 4c 4c 42 41 43 4b 22 20 20 20 20 20 20  "ROLLBACK"      
8340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8350: 20 20 20 2f 2a 20 72 63 3d 3d 54 43 4c 5f 45 52     /* rc==TCL_ER
8360: 52 4f 52 2c 20 6e 54 72 61 6e 73 61 63 74 69 6f  ROR, nTransactio
8370: 6e 3d 3d 30 20 2a 2f 0a 20 20 7d 3b 0a 20 20 53  n==0 */.  };.  S
8380: 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28  qliteDb *pDb = (
8390: 53 71 6c 69 74 65 44 62 2a 29 64 61 74 61 5b 30  SqliteDb*)data[0
83a0: 5d 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 72 65  ];.  int rc = re
83b0: 73 75 6c 74 3b 0a 20 20 63 6f 6e 73 74 20 63 68  sult;.  const ch
83c0: 61 72 20 2a 7a 45 6e 64 3b 0a 0a 20 20 70 44 62  ar *zEnd;..  pDb
83d0: 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2d 2d  ->nTransaction--
83e0: 3b 0a 20 20 7a 45 6e 64 20 3d 20 61 7a 45 6e 64  ;.  zEnd = azEnd
83f0: 5b 28 72 63 3d 3d 54 43 4c 5f 45 52 52 4f 52 29  [(rc==TCL_ERROR)
8400: 2a 32 20 2b 20 28 70 44 62 2d 3e 6e 54 72 61 6e  *2 + (pDb->nTran
8410: 73 61 63 74 69 6f 6e 3d 3d 30 29 5d 3b 0a 0a 20  saction==0)];.. 
8420: 20 70 44 62 2d 3e 64 69 73 61 62 6c 65 41 75 74   pDb->disableAut
8430: 68 2b 2b 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  h++;.  if( sqlit
8440: 65 33 5f 65 78 65 63 28 70 44 62 2d 3e 64 62 2c  e3_exec(pDb->db,
8450: 20 7a 45 6e 64 2c 20 30 2c 20 30 2c 20 30 29 20   zEnd, 0, 0, 0) 
8460: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73  ){.      /* This
8470: 20 69 73 20 61 20 74 72 69 63 6b 79 20 73 63 65   is a tricky sce
8480: 6e 61 72 69 6f 20 74 6f 20 68 61 6e 64 6c 65 2e  nario to handle.
8490: 20 54 68 65 20 6d 6f 73 74 20 6c 69 6b 65 6c 79   The most likely
84a0: 20 63 61 75 73 65 20 6f 66 20 61 6e 0a 20 20 20   cause of an.   
84b0: 20 20 20 2a 2a 20 65 72 72 6f 72 20 69 73 20 74     ** error is t
84c0: 68 61 74 20 74 68 65 20 65 78 65 63 28 29 20 61  hat the exec() a
84d0: 62 6f 76 65 20 77 61 73 20 61 6e 20 61 74 74 65  bove was an atte
84e0: 6d 70 74 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68  mpt to commit th
84f0: 65 20 0a 20 20 20 20 20 20 2a 2a 20 74 6f 70 2d  e .      ** top-
8500: 6c 65 76 65 6c 20 74 72 61 6e 73 61 63 74 69 6f  level transactio
8510: 6e 20 74 68 61 74 20 72 65 74 75 72 6e 65 64 20  n that returned 
8520: 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 4f 72 2c  SQLITE_BUSY. Or,
8530: 20 6c 65 73 73 20 6c 69 6b 65 6c 79 2c 0a 20 20   less likely,.  
8540: 20 20 20 20 2a 2a 20 74 68 61 74 20 61 6e 20 49      ** that an I
8550: 4f 2d 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75  O-error has occu
8560: 72 65 64 2e 20 49 6e 20 65 69 74 68 65 72 20 63  red. In either c
8570: 61 73 65 2c 20 74 68 72 6f 77 20 61 20 54 63 6c  ase, throw a Tcl
8580: 20 65 78 63 65 70 74 69 6f 6e 0a 20 20 20 20 20   exception.     
8590: 20 2a 2a 20 61 6e 64 20 74 72 79 20 74 6f 20 72   ** and try to r
85a0: 6f 6c 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e  ollback the tran
85b0: 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a  saction..      *
85c0: 2a 0a 20 20 20 20 20 20 2a 2a 20 42 75 74 20 69  *.      ** But i
85d0: 74 20 63 6f 75 6c 64 20 61 6c 73 6f 20 62 65 20  t could also be 
85e0: 74 68 61 74 20 74 68 65 20 75 73 65 72 20 65 78  that the user ex
85f0: 65 63 75 74 65 64 20 6f 6e 65 20 6f 72 20 6d 6f  ecuted one or mo
8600: 72 65 20 42 45 47 49 4e 2c 20 0a 20 20 20 20 20  re BEGIN, .     
8610: 20 2a 2a 20 43 4f 4d 4d 49 54 2c 20 53 41 56 45   ** COMMIT, SAVE
8620: 50 4f 49 4e 54 2c 20 52 45 4c 45 41 53 45 20 6f  POINT, RELEASE o
8630: 72 20 52 4f 4c 4c 42 41 43 4b 20 63 6f 6d 6d 61  r ROLLBACK comma
8640: 6e 64 73 20 74 68 61 74 20 61 72 65 20 63 6f 6e  nds that are con
8650: 66 75 73 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20  fusing.      ** 
8660: 74 68 69 73 20 6d 65 74 68 6f 64 27 73 20 6c 6f  this method's lo
8670: 67 69 63 2e 20 4e 6f 74 20 63 6c 65 61 72 20 68  gic. Not clear h
8680: 6f 77 20 74 68 69 73 20 77 6f 75 6c 64 20 62 65  ow this would be
8690: 20 62 65 73 74 20 68 61 6e 64 6c 65 64 2e 0a 20   best handled.. 
86a0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20       */.    if( 
86b0: 72 63 21 3d 54 43 4c 5f 45 52 52 4f 52 20 29 7b  rc!=TCL_ERROR ){
86c0: 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  .      Tcl_Appen
86d0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
86e0: 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70  sqlite3_errmsg(p
86f0: 44 62 2d 3e 64 62 29 2c 20 30 29 3b 0a 20 20 20  Db->db), 0);.   
8700: 20 20 20 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f     rc = TCL_ERRO
8710: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  R;.    }.    sql
8720: 69 74 65 33 5f 65 78 65 63 28 70 44 62 2d 3e 64  ite3_exec(pDb->d
8730: 62 2c 20 22 52 4f 4c 4c 42 41 43 4b 22 2c 20 30  b, "ROLLBACK", 0
8740: 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 70  , 0, 0);.  }.  p
8750: 44 62 2d 3e 64 69 73 61 62 6c 65 41 75 74 68 2d  Db->disableAuth-
8760: 2d 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  -;..  return rc;
8770: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 65 73 73  .}../*.** Unless
8780: 20 53 51 4c 49 54 45 5f 54 45 53 54 20 69 73 20   SQLITE_TEST is 
8790: 64 65 66 69 6e 65 64 2c 20 74 68 69 73 20 66 75  defined, this fu
87a0: 6e 63 74 69 6f 6e 20 69 73 20 61 20 73 69 6d 70  nction is a simp
87b0: 6c 65 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e  le wrapper aroun
87c0: 64 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 70 72 65  d.** sqlite3_pre
87d0: 70 61 72 65 5f 76 32 28 29 2e 20 49 66 20 53 51  pare_v2(). If SQ
87e0: 4c 49 54 45 5f 54 45 53 54 20 69 73 20 64 65 66  LITE_TEST is def
87f0: 69 6e 65 64 2c 20 74 68 65 6e 20 69 74 20 75 73  ined, then it us
8800: 65 73 20 65 69 74 68 65 72 0a 2a 2a 20 73 71 6c  es either.** sql
8810: 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28  ite3_prepare_v2(
8820: 29 20 6f 72 20 6c 65 67 61 63 79 20 69 6e 74 65  ) or legacy inte
8830: 72 66 61 63 65 20 73 71 6c 69 74 65 33 5f 70 72  rface sqlite3_pr
8840: 65 70 61 72 65 28 29 2c 20 64 65 70 65 6e 64 69  epare(), dependi
8850: 6e 67 0a 2a 2a 20 6f 6e 20 77 68 65 74 68 65 72  ng.** on whether
8860: 20 6f 72 20 6e 6f 74 20 74 68 65 20 5b 64 62 5f   or not the [db_
8870: 75 73 65 5f 6c 65 67 61 63 79 5f 70 72 65 70 61  use_legacy_prepa
8880: 72 65 5d 20 63 6f 6d 6d 61 6e 64 20 68 61 73 20  re] command has 
8890: 62 65 65 6e 20 75 73 65 64 20 74 6f 20 0a 2a 2a  been used to .**
88a0: 20 63 6f 6e 66 69 67 75 72 65 20 74 68 65 20 63   configure the c
88b0: 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  onnection..*/.st
88c0: 61 74 69 63 20 69 6e 74 20 64 62 50 72 65 70 61  atic int dbPrepa
88d0: 72 65 28 0a 20 20 53 71 6c 69 74 65 44 62 20 2a  re(.  SqliteDb *
88e0: 70 44 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  pDb,            
88f0: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
8900: 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 6f  e object */.  co
8910: 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 2c 20  nst char *zSql, 
8920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8930: 20 53 51 4c 20 74 6f 20 63 6f 6d 70 69 6c 65 20   SQL to compile 
8940: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  */.  sqlite3_stm
8950: 74 20 2a 2a 70 70 53 74 6d 74 2c 20 20 20 20 20  t **ppStmt,     
8960: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 50 72 65       /* OUT: Pre
8970: 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20  pared statement 
8980: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
8990: 2a 2a 70 7a 4f 75 74 20 20 20 20 20 20 20 20 20  **pzOut         
89a0: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 50 6f 69       /* OUT: Poi
89b0: 6e 74 65 72 20 74 6f 20 6e 65 78 74 20 53 51 4c  nter to next SQL
89c0: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 29 7b   statement */.){
89d0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
89e0: 45 53 54 0a 20 20 69 66 28 20 70 44 62 2d 3e 62  EST.  if( pDb->b
89f0: 4c 65 67 61 63 79 50 72 65 70 61 72 65 20 29 7b  LegacyPrepare ){
8a00: 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69  .    return sqli
8a10: 74 65 33 5f 70 72 65 70 61 72 65 28 70 44 62 2d  te3_prepare(pDb-
8a20: 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 70  >db, zSql, -1, p
8a30: 70 53 74 6d 74 2c 20 70 7a 4f 75 74 29 3b 0a 20  pStmt, pzOut);. 
8a40: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75   }.#endif.  retu
8a50: 72 6e 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61  rn sqlite3_prepa
8a60: 72 65 5f 76 32 28 70 44 62 2d 3e 64 62 2c 20 7a  re_v2(pDb->db, z
8a70: 53 71 6c 2c 20 2d 31 2c 20 70 70 53 74 6d 74 2c  Sql, -1, ppStmt,
8a80: 20 70 7a 4f 75 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   pzOut);.}../*.*
8a90: 2a 20 53 65 61 72 63 68 20 74 68 65 20 63 61 63  * Search the cac
8aa0: 68 65 20 66 6f 72 20 61 20 70 72 65 70 61 72 65  he for a prepare
8ab0: 64 2d 73 74 61 74 65 6d 65 6e 74 20 6f 62 6a 65  d-statement obje
8ac0: 63 74 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e  ct that implemen
8ad0: 74 73 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20  ts the.** first 
8ae0: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 69 6e  SQL statement in
8af0: 20 74 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e   the buffer poin
8b00: 74 65 64 20 74 6f 20 62 79 20 70 61 72 61 6d 65  ted to by parame
8b10: 74 65 72 20 7a 49 6e 2e 20 49 66 0a 2a 2a 20 6e  ter zIn. If.** n
8b20: 6f 20 73 75 63 68 20 70 72 65 70 61 72 65 64 2d  o such prepared-
8b30: 73 74 61 74 65 6d 65 6e 74 20 63 61 6e 20 62 65  statement can be
8b40: 20 66 6f 75 6e 64 2c 20 61 6c 6c 6f 63 61 74 65   found, allocate
8b50: 20 61 6e 64 20 70 72 65 70 61 72 65 20 61 20 6e   and prepare a n
8b60: 65 77 0a 2a 2a 20 6f 6e 65 2e 20 49 6e 20 65 69  ew.** one. In ei
8b70: 74 68 65 72 20 63 61 73 65 2c 20 62 69 6e 64 20  ther case, bind 
8b80: 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75  the current valu
8b90: 65 73 20 6f 66 20 74 68 65 20 72 65 6c 65 76 61  es of the releva
8ba0: 6e 74 20 54 63 6c 0a 2a 2a 20 76 61 72 69 61 62  nt Tcl.** variab
8bb0: 6c 65 73 20 74 6f 20 61 6e 79 20 24 76 61 72 2c  les to any $var,
8bc0: 20 3a 76 61 72 20 6f 72 20 40 76 61 72 20 76 61   :var or @var va
8bd0: 72 69 61 62 6c 65 73 20 69 6e 20 74 68 65 20 73  riables in the s
8be0: 74 61 74 65 6d 65 6e 74 2e 20 42 65 66 6f 72 65  tatement. Before
8bf0: 0a 2a 2a 20 72 65 74 75 72 6e 69 6e 67 2c 20 73  .** returning, s
8c00: 65 74 20 2a 70 70 50 72 65 53 74 6d 74 20 74 6f  et *ppPreStmt to
8c10: 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 70 72   point to the pr
8c20: 65 70 61 72 65 64 2d 73 74 61 74 65 6d 65 6e 74  epared-statement
8c30: 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 4f   object..**.** O
8c40: 75 74 70 75 74 20 70 61 72 61 6d 65 74 65 72 20  utput parameter 
8c50: 2a 70 7a 4f 75 74 20 69 73 20 73 65 74 20 74 6f  *pzOut is set to
8c60: 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e 65   point to the ne
8c70: 78 74 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  xt SQL statement
8c80: 20 69 6e 0a 2a 2a 20 62 75 66 66 65 72 20 7a 49   in.** buffer zI
8c90: 6e 2c 20 6f 72 20 74 6f 20 74 68 65 20 27 5c 30  n, or to the '\0
8ca0: 27 20 62 79 74 65 20 61 74 20 74 68 65 20 65 6e  ' byte at the en
8cb0: 64 20 6f 66 20 7a 49 6e 20 69 66 20 74 68 65 72  d of zIn if ther
8cc0: 65 20 69 73 20 6e 6f 0a 2a 2a 20 6e 65 78 74 20  e is no.** next 
8cd0: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a  statement..**.**
8ce0: 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
8cf0: 54 43 4c 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  TCL_OK is return
8d00: 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 54  ed. Otherwise, T
8d10: 43 4c 5f 45 52 52 4f 52 20 69 73 20 72 65 74 75  CL_ERROR is retu
8d20: 72 6e 65 64 0a 2a 2a 20 61 6e 64 20 61 6e 20 65  rned.** and an e
8d30: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 6c 6f 61  rror message loa
8d40: 64 65 64 20 69 6e 74 6f 20 69 6e 74 65 72 70 72  ded into interpr
8d50: 65 74 65 72 20 70 44 62 2d 3e 69 6e 74 65 72 70  eter pDb->interp
8d60: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
8d70: 64 62 50 72 65 70 61 72 65 41 6e 64 42 69 6e 64  dbPrepareAndBind
8d80: 28 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44  (.  SqliteDb *pD
8d90: 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
8da0: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
8db0: 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 68 61 72  object */.  char
8dc0: 20 63 6f 6e 73 74 20 2a 7a 49 6e 2c 20 20 20 20   const *zIn,    
8dd0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
8de0: 51 4c 20 74 6f 20 63 6f 6d 70 69 6c 65 20 2a 2f  QL to compile */
8df0: 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 2a  .  char const **
8e00: 70 7a 4f 75 74 2c 20 20 20 20 20 20 20 20 20 20  pzOut,          
8e10: 20 20 20 2f 2a 20 4f 55 54 3a 20 50 6f 69 6e 74     /* OUT: Point
8e20: 65 72 20 74 6f 20 6e 65 78 74 20 53 51 4c 20 73  er to next SQL s
8e30: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 53 71  tatement */.  Sq
8e40: 6c 50 72 65 70 61 72 65 64 53 74 6d 74 20 2a 2a  lPreparedStmt **
8e50: 70 70 50 72 65 53 74 6d 74 20 20 20 20 20 2f 2a  ppPreStmt     /*
8e60: 20 4f 55 54 3a 20 4f 62 6a 65 63 74 20 75 73 65   OUT: Object use
8e70: 64 20 74 6f 20 63 61 63 68 65 20 73 74 61 74 65  d to cache state
8e80: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e  ment */.){.  con
8e90: 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20  st char *zSql = 
8ea0: 7a 49 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  zIn;         /* 
8eb0: 50 6f 69 6e 74 65 72 20 74 6f 20 66 69 72 73 74  Pointer to first
8ec0: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 69   SQL statement i
8ed0: 6e 20 7a 49 6e 20 2a 2f 0a 20 20 73 71 6c 69 74  n zIn */.  sqlit
8ee0: 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 20  e3_stmt *pStmt; 
8ef0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72             /* Pr
8f00: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
8f10: 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 53 71 6c   object */.  Sql
8f20: 50 72 65 70 61 72 65 64 53 74 6d 74 20 2a 70 50  PreparedStmt *pP
8f30: 72 65 53 74 6d 74 3b 20 20 20 20 20 20 2f 2a 20  reStmt;      /* 
8f40: 50 6f 69 6e 74 65 72 20 74 6f 20 63 61 63 68 65  Pointer to cache
8f50: 64 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  d statement */. 
8f60: 20 69 6e 74 20 6e 53 71 6c 3b 20 20 20 20 20 20   int nSql;      
8f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8f80: 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 7a 53   /* Length of zS
8f90: 71 6c 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  ql in bytes */. 
8fa0: 20 69 6e 74 20 6e 56 61 72 3b 20 20 20 20 20 20   int nVar;      
8fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8fc0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 76 61   /* Number of va
8fd0: 72 69 61 62 6c 65 73 20 69 6e 20 73 74 61 74 65  riables in state
8fe0: 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 50  ment */.  int iP
8ff0: 61 72 6d 20 3d 20 30 3b 20 20 20 20 20 20 20 20  arm = 0;        
9000: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78            /* Nex
9010: 74 20 66 72 65 65 20 65 6e 74 72 79 20 69 6e 20  t free entry in 
9020: 61 70 50 61 72 6d 20 2a 2f 0a 20 20 69 6e 74 20  apParm */.  int 
9030: 69 3b 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  i;.  Tcl_Interp 
9040: 2a 69 6e 74 65 72 70 20 3d 20 70 44 62 2d 3e 69  *interp = pDb->i
9050: 6e 74 65 72 70 3b 0a 0a 20 20 2a 70 70 50 72 65  nterp;..  *ppPre
9060: 53 74 6d 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20  Stmt = 0;..  /* 
9070: 54 72 69 6d 20 73 70 61 63 65 73 20 66 72 6f 6d  Trim spaces from
9080: 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 7a 53   the start of zS
9090: 71 6c 20 61 6e 64 20 63 61 6c 63 75 6c 61 74 65  ql and calculate
90a0: 20 74 68 65 20 72 65 6d 61 69 6e 69 6e 67 20 6c   the remaining l
90b0: 65 6e 67 74 68 2e 20 2a 2f 0a 20 20 77 68 69 6c  ength. */.  whil
90c0: 65 28 20 69 73 73 70 61 63 65 28 7a 53 71 6c 5b  e( isspace(zSql[
90d0: 30 5d 29 20 29 7b 20 7a 53 71 6c 2b 2b 3b 20 7d  0]) ){ zSql++; }
90e0: 0a 20 20 6e 53 71 6c 20 3d 20 73 74 72 6c 65 6e  .  nSql = strlen
90f0: 33 30 28 7a 53 71 6c 29 3b 0a 0a 20 20 66 6f 72  30(zSql);..  for
9100: 28 70 50 72 65 53 74 6d 74 20 3d 20 70 44 62 2d  (pPreStmt = pDb-
9110: 3e 73 74 6d 74 4c 69 73 74 3b 20 70 50 72 65 53  >stmtList; pPreS
9120: 74 6d 74 3b 20 70 50 72 65 53 74 6d 74 3d 70 50  tmt; pPreStmt=pP
9130: 72 65 53 74 6d 74 2d 3e 70 4e 65 78 74 29 7b 0a  reStmt->pNext){.
9140: 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 50 72 65      int n = pPre
9150: 53 74 6d 74 2d 3e 6e 53 71 6c 3b 0a 20 20 20 20  Stmt->nSql;.    
9160: 69 66 28 20 6e 53 71 6c 3e 3d 6e 20 0a 20 20 20  if( nSql>=n .   
9170: 20 20 20 20 20 26 26 20 6d 65 6d 63 6d 70 28 70       && memcmp(p
9180: 50 72 65 53 74 6d 74 2d 3e 7a 53 71 6c 2c 20 7a  PreStmt->zSql, z
9190: 53 71 6c 2c 20 6e 29 3d 3d 30 0a 20 20 20 20 20  Sql, n)==0.     
91a0: 20 20 20 26 26 20 28 7a 53 71 6c 5b 6e 5d 3d 3d     && (zSql[n]==
91b0: 30 20 7c 7c 20 7a 53 71 6c 5b 6e 2d 31 5d 3d 3d  0 || zSql[n-1]==
91c0: 27 3b 27 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  ';').    ){.    
91d0: 20 20 70 53 74 6d 74 20 3d 20 70 50 72 65 53 74    pStmt = pPreSt
91e0: 6d 74 2d 3e 70 53 74 6d 74 3b 0a 20 20 20 20 20  mt->pStmt;.     
91f0: 20 2a 70 7a 4f 75 74 20 3d 20 26 7a 53 71 6c 5b   *pzOut = &zSql[
9200: 70 50 72 65 53 74 6d 74 2d 3e 6e 53 71 6c 5d 3b  pPreStmt->nSql];
9210: 0a 0a 20 20 20 20 20 20 2f 2a 20 57 68 65 6e 20  ..      /* When 
9220: 61 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  a prepared state
9230: 6d 65 6e 74 20 69 73 20 66 6f 75 6e 64 2c 20 75  ment is found, u
9240: 6e 6c 69 6e 6b 20 69 74 20 66 72 6f 6d 20 74 68  nlink it from th
9250: 65 0a 20 20 20 20 20 20 2a 2a 20 63 61 63 68 65  e.      ** cache
9260: 20 6c 69 73 74 2e 20 20 49 74 20 77 69 6c 6c 20   list.  It will 
9270: 6c 61 74 65 72 20 62 65 20 61 64 64 65 64 20 62  later be added b
9280: 61 63 6b 20 74 6f 20 74 68 65 20 62 65 67 69 6e  ack to the begin
9290: 6e 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 6f 66  ning.      ** of
92a0: 20 74 68 65 20 63 61 63 68 65 20 6c 69 73 74 20   the cache list 
92b0: 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6d 70 6c  in order to impl
92c0: 65 6d 65 6e 74 20 4c 52 55 20 72 65 70 6c 61 63  ement LRU replac
92d0: 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f 0a  ement..      */.
92e0: 20 20 20 20 20 20 69 66 28 20 70 50 72 65 53 74        if( pPreSt
92f0: 6d 74 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20 20  mt->pPrev ){.   
9300: 20 20 20 20 20 70 50 72 65 53 74 6d 74 2d 3e 70       pPreStmt->p
9310: 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 50  Prev->pNext = pP
9320: 72 65 53 74 6d 74 2d 3e 70 4e 65 78 74 3b 0a 20  reStmt->pNext;. 
9330: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
9340: 20 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73      pDb->stmtLis
9350: 74 20 3d 20 70 50 72 65 53 74 6d 74 2d 3e 70 4e  t = pPreStmt->pN
9360: 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ext;.      }.   
9370: 20 20 20 69 66 28 20 70 50 72 65 53 74 6d 74 2d     if( pPreStmt-
9380: 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20  >pNext ){.      
9390: 20 20 70 50 72 65 53 74 6d 74 2d 3e 70 4e 65 78    pPreStmt->pNex
93a0: 74 2d 3e 70 50 72 65 76 20 3d 20 70 50 72 65 53  t->pPrev = pPreS
93b0: 74 6d 74 2d 3e 70 50 72 65 76 3b 0a 20 20 20 20  tmt->pPrev;.    
93c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
93d0: 20 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74 20 3d   pDb->stmtLast =
93e0: 20 70 50 72 65 53 74 6d 74 2d 3e 70 50 72 65 76   pPreStmt->pPrev
93f0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
9400: 70 44 62 2d 3e 6e 53 74 6d 74 2d 2d 3b 0a 20 20  pDb->nStmt--;.  
9410: 20 20 20 20 6e 56 61 72 20 3d 20 73 71 6c 69 74      nVar = sqlit
9420: 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65  e3_bind_paramete
9430: 72 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29 3b 0a  r_count(pStmt);.
9440: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9450: 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 49   }.  }.  .  /* I
9460: 66 20 6e 6f 20 70 72 65 70 61 72 65 64 20 73 74  f no prepared st
9470: 61 74 65 6d 65 6e 74 20 77 61 73 20 66 6f 75 6e  atement was foun
9480: 64 2e 20 43 6f 6d 70 69 6c 65 20 74 68 65 20 53  d. Compile the S
9490: 51 4c 20 74 65 78 74 2e 20 41 6c 73 6f 20 61 6c  QL text. Also al
94a0: 6c 6f 63 61 74 65 0a 20 20 2a 2a 20 61 20 6e 65  locate.  ** a ne
94b0: 77 20 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d  w SqlPreparedStm
94c0: 74 20 73 74 72 75 63 74 75 72 65 2e 20 20 2a 2f  t structure.  */
94d0: 0a 20 20 69 66 28 20 70 50 72 65 53 74 6d 74 3d  .  if( pPreStmt=
94e0: 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 42  =0 ){.    int nB
94f0: 79 74 65 3b 0a 0a 20 20 20 20 69 66 28 20 53 51  yte;..    if( SQ
9500: 4c 49 54 45 5f 4f 4b 21 3d 64 62 50 72 65 70 61  LITE_OK!=dbPrepa
9510: 72 65 28 70 44 62 2c 20 7a 53 71 6c 2c 20 26 70  re(pDb, zSql, &p
9520: 53 74 6d 74 2c 20 70 7a 4f 75 74 29 20 29 7b 0a  Stmt, pzOut) ){.
9530: 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a        Tcl_SetObj
9540: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 64  Result(interp, d
9550: 62 54 65 78 74 54 6f 4f 62 6a 28 73 71 6c 69 74  bTextToObj(sqlit
9560: 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64  e3_errmsg(pDb->d
9570: 62 29 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75  b)));.      retu
9580: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
9590: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 53 74 6d    }.    if( pStm
95a0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  t==0 ){.      if
95b0: 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c  ( SQLITE_OK!=sql
95c0: 69 74 65 33 5f 65 72 72 63 6f 64 65 28 70 44 62  ite3_errcode(pDb
95d0: 2d 3e 64 62 29 20 29 7b 0a 20 20 20 20 20 20 20  ->db) ){.       
95e0: 20 2f 2a 20 41 20 63 6f 6d 70 69 6c 65 2d 74 69   /* A compile-ti
95f0: 6d 65 20 65 72 72 6f 72 20 69 6e 20 74 68 65 20  me error in the 
9600: 73 74 61 74 65 6d 65 6e 74 2e 20 2a 2f 0a 20 20  statement. */.  
9610: 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a        Tcl_SetObj
9620: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 64  Result(interp, d
9630: 62 54 65 78 74 54 6f 4f 62 6a 28 73 71 6c 69 74  bTextToObj(sqlit
9640: 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64  e3_errmsg(pDb->d
9650: 62 29 29 29 3b 0a 20 20 20 20 20 20 20 20 72 65  b)));.        re
9660: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
9670: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
9680: 20 20 20 20 20 2f 2a 20 54 68 65 20 73 74 61 74       /* The stat
9690: 65 6d 65 6e 74 20 77 61 73 20 61 20 6e 6f 2d 6f  ement was a no-o
96a0: 70 2e 20 20 43 6f 6e 74 69 6e 75 65 20 74 6f 20  p.  Continue to 
96b0: 74 68 65 20 6e 65 78 74 20 73 74 61 74 65 6d 65  the next stateme
96c0: 6e 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e  nt.        ** in
96d0: 20 74 68 65 20 53 51 4c 20 73 74 72 69 6e 67 2e   the SQL string.
96e0: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
96f0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f      return TCL_O
9700: 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  K;.      }.    }
9710: 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ..    assert( pP
9720: 72 65 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 20  reStmt==0 );.   
9730: 20 6e 56 61 72 20 3d 20 73 71 6c 69 74 65 33 5f   nVar = sqlite3_
9740: 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 63  bind_parameter_c
9750: 6f 75 6e 74 28 70 53 74 6d 74 29 3b 0a 20 20 20  ount(pStmt);.   
9760: 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28   nByte = sizeof(
9770: 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74 29  SqlPreparedStmt)
9780: 20 2b 20 6e 56 61 72 2a 73 69 7a 65 6f 66 28 54   + nVar*sizeof(T
9790: 63 6c 5f 4f 62 6a 20 2a 29 3b 0a 20 20 20 20 70  cl_Obj *);.    p
97a0: 50 72 65 53 74 6d 74 20 3d 20 28 53 71 6c 50 72  PreStmt = (SqlPr
97b0: 65 70 61 72 65 64 53 74 6d 74 2a 29 54 63 6c 5f  eparedStmt*)Tcl_
97c0: 41 6c 6c 6f 63 28 6e 42 79 74 65 29 3b 0a 20 20  Alloc(nByte);.  
97d0: 20 20 6d 65 6d 73 65 74 28 70 50 72 65 53 74 6d    memset(pPreStm
97e0: 74 2c 20 30 2c 20 6e 42 79 74 65 29 3b 0a 0a 20  t, 0, nByte);.. 
97f0: 20 20 20 70 50 72 65 53 74 6d 74 2d 3e 70 53 74     pPreStmt->pSt
9800: 6d 74 20 3d 20 70 53 74 6d 74 3b 0a 20 20 20 20  mt = pStmt;.    
9810: 70 50 72 65 53 74 6d 74 2d 3e 6e 53 71 6c 20 3d  pPreStmt->nSql =
9820: 20 28 2a 70 7a 4f 75 74 20 2d 20 7a 53 71 6c 29   (*pzOut - zSql)
9830: 3b 0a 20 20 20 20 70 50 72 65 53 74 6d 74 2d 3e  ;.    pPreStmt->
9840: 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 73  zSql = sqlite3_s
9850: 71 6c 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 70  ql(pStmt);.    p
9860: 50 72 65 53 74 6d 74 2d 3e 61 70 50 61 72 6d 20  PreStmt->apParm 
9870: 3d 20 28 54 63 6c 5f 4f 62 6a 20 2a 2a 29 26 70  = (Tcl_Obj **)&p
9880: 50 72 65 53 74 6d 74 5b 31 5d 3b 0a 23 69 66 64  PreStmt[1];.#ifd
9890: 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
98a0: 20 20 20 69 66 28 20 70 50 72 65 53 74 6d 74 2d     if( pPreStmt-
98b0: 3e 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  >zSql==0 ){.    
98c0: 20 20 63 68 61 72 20 2a 7a 43 6f 70 79 20 3d 20    char *zCopy = 
98d0: 54 63 6c 5f 41 6c 6c 6f 63 28 70 50 72 65 53 74  Tcl_Alloc(pPreSt
98e0: 6d 74 2d 3e 6e 53 71 6c 20 2b 20 31 29 3b 0a 20  mt->nSql + 1);. 
98f0: 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 43 6f 70       memcpy(zCop
9900: 79 2c 20 7a 53 71 6c 2c 20 70 50 72 65 53 74 6d  y, zSql, pPreStm
9910: 74 2d 3e 6e 53 71 6c 29 3b 0a 20 20 20 20 20 20  t->nSql);.      
9920: 7a 43 6f 70 79 5b 70 50 72 65 53 74 6d 74 2d 3e  zCopy[pPreStmt->
9930: 6e 53 71 6c 5d 20 3d 20 27 5c 30 27 3b 0a 20 20  nSql] = '\0';.  
9940: 20 20 20 20 70 50 72 65 53 74 6d 74 2d 3e 7a 53      pPreStmt->zS
9950: 71 6c 20 3d 20 7a 43 6f 70 79 3b 0a 20 20 20 20  ql = zCopy;.    
9960: 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 61  }.#endif.  }.  a
9970: 73 73 65 72 74 28 20 70 50 72 65 53 74 6d 74 20  ssert( pPreStmt 
9980: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 74 72  );.  assert( str
9990: 6c 65 6e 33 30 28 70 50 72 65 53 74 6d 74 2d 3e  len30(pPreStmt->
99a0: 7a 53 71 6c 29 3d 3d 70 50 72 65 53 74 6d 74 2d  zSql)==pPreStmt-
99b0: 3e 6e 53 71 6c 20 29 3b 0a 20 20 61 73 73 65 72  >nSql );.  asser
99c0: 74 28 20 30 3d 3d 6d 65 6d 63 6d 70 28 70 50 72  t( 0==memcmp(pPr
99d0: 65 53 74 6d 74 2d 3e 7a 53 71 6c 2c 20 7a 53 71  eStmt->zSql, zSq
99e0: 6c 2c 20 70 50 72 65 53 74 6d 74 2d 3e 6e 53 71  l, pPreStmt->nSq
99f0: 6c 29 20 29 3b 0a 0a 20 20 2f 2a 20 42 69 6e 64  l) );..  /* Bind
9a00: 20 76 61 6c 75 65 73 20 74 6f 20 70 61 72 61 6d   values to param
9a10: 65 74 65 72 73 20 74 68 61 74 20 62 65 67 69 6e  eters that begin
9a20: 20 77 69 74 68 20 24 20 6f 72 20 3a 20 2a 2f 20   with $ or : */ 
9a30: 20 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d   .  for(i=1; i<=
9a40: 6e 56 61 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nVar; i++){.    
9a50: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 61 72  const char *zVar
9a60: 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f   = sqlite3_bind_
9a70: 70 61 72 61 6d 65 74 65 72 5f 6e 61 6d 65 28 70  parameter_name(p
9a80: 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 69 66  Stmt, i);.    if
9a90: 28 20 7a 56 61 72 21 3d 30 20 26 26 20 28 7a 56  ( zVar!=0 && (zV
9aa0: 61 72 5b 30 5d 3d 3d 27 24 27 20 7c 7c 20 7a 56  ar[0]=='$' || zV
9ab0: 61 72 5b 30 5d 3d 3d 27 3a 27 20 7c 7c 20 7a 56  ar[0]==':' || zV
9ac0: 61 72 5b 30 5d 3d 3d 27 40 27 29 20 29 7b 0a 20  ar[0]=='@') ){. 
9ad0: 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 56       Tcl_Obj *pV
9ae0: 61 72 20 3d 20 54 63 6c 5f 47 65 74 56 61 72 32  ar = Tcl_GetVar2
9af0: 45 78 28 69 6e 74 65 72 70 2c 20 26 7a 56 61 72  Ex(interp, &zVar
9b00: 5b 31 5d 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  [1], 0, 0);.    
9b10: 20 20 69 66 28 20 70 56 61 72 20 29 7b 0a 20 20    if( pVar ){.  
9b20: 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20        int n;.   
9b30: 20 20 20 20 20 75 38 20 2a 64 61 74 61 3b 0a 20       u8 *data;. 
9b40: 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
9b50: 72 20 2a 7a 54 79 70 65 20 3d 20 28 70 56 61 72  r *zType = (pVar
9b60: 2d 3e 74 79 70 65 50 74 72 20 3f 20 70 56 61 72  ->typePtr ? pVar
9b70: 2d 3e 74 79 70 65 50 74 72 2d 3e 6e 61 6d 65 20  ->typePtr->name 
9b80: 3a 20 22 22 29 3b 0a 20 20 20 20 20 20 20 20 63  : "");.        c
9b90: 68 61 72 20 63 20 3d 20 7a 54 79 70 65 5b 30 5d  har c = zType[0]
9ba0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 56  ;.        if( zV
9bb0: 61 72 5b 30 5d 3d 3d 27 40 27 20 7c 7c 0a 20 20  ar[0]=='@' ||.  
9bc0: 20 20 20 20 20 20 20 20 20 28 63 3d 3d 27 62 27           (c=='b'
9bd0: 20 26 26 20 73 74 72 63 6d 70 28 7a 54 79 70 65   && strcmp(zType
9be0: 2c 22 62 79 74 65 61 72 72 61 79 22 29 3d 3d 30  ,"bytearray")==0
9bf0: 20 26 26 20 70 56 61 72 2d 3e 62 79 74 65 73 3d   && pVar->bytes=
9c00: 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  =0) ){.         
9c10: 20 2f 2a 20 4c 6f 61 64 20 61 20 42 4c 4f 42 20   /* Load a BLOB 
9c20: 74 79 70 65 20 69 66 20 74 68 65 20 54 63 6c 20  type if the Tcl 
9c30: 76 61 72 69 61 62 6c 65 20 69 73 20 61 20 62 79  variable is a by
9c40: 74 65 61 72 72 61 79 20 61 6e 64 0a 20 20 20 20  tearray and.    
9c50: 20 20 20 20 20 20 2a 2a 20 69 74 20 68 61 73 20        ** it has 
9c60: 6e 6f 20 73 74 72 69 6e 67 20 72 65 70 72 65 73  no string repres
9c70: 65 6e 74 61 74 69 6f 6e 20 6f 72 20 74 68 65 20  entation or the 
9c80: 68 6f 73 74 0a 20 20 20 20 20 20 20 20 20 20 2a  host.          *
9c90: 2a 20 70 61 72 61 6d 65 74 65 72 20 6e 61 6d 65  * parameter name
9ca0: 20 62 65 67 69 6e 73 20 77 69 74 68 20 22 40 22   begins with "@"
9cb0: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 64  . */.          d
9cc0: 61 74 61 20 3d 20 54 63 6c 5f 47 65 74 42 79 74  ata = Tcl_GetByt
9cd0: 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 70 56  eArrayFromObj(pV
9ce0: 61 72 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 20  ar, &n);.       
9cf0: 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
9d00: 62 6c 6f 62 28 70 53 74 6d 74 2c 20 69 2c 20 64  blob(pStmt, i, d
9d10: 61 74 61 2c 20 6e 2c 20 53 51 4c 49 54 45 5f 53  ata, n, SQLITE_S
9d20: 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 20 20  TATIC);.        
9d30: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
9d40: 6e 74 28 70 56 61 72 29 3b 0a 20 20 20 20 20 20  nt(pVar);.      
9d50: 20 20 20 20 70 50 72 65 53 74 6d 74 2d 3e 61 70      pPreStmt->ap
9d60: 50 61 72 6d 5b 69 50 61 72 6d 2b 2b 5d 20 3d 20  Parm[iParm++] = 
9d70: 70 56 61 72 3b 0a 20 20 20 20 20 20 20 20 7d 65  pVar;.        }e
9d80: 6c 73 65 20 69 66 28 20 63 3d 3d 27 62 27 20 26  lse if( c=='b' &
9d90: 26 20 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22  & strcmp(zType,"
9da0: 62 6f 6f 6c 65 61 6e 22 29 3d 3d 30 20 29 7b 0a  boolean")==0 ){.
9db0: 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65            Tcl_Ge
9dc0: 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
9dd0: 72 70 2c 20 70 56 61 72 2c 20 26 6e 29 3b 0a 20  rp, pVar, &n);. 
9de0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
9df0: 5f 62 69 6e 64 5f 69 6e 74 28 70 53 74 6d 74 2c  _bind_int(pStmt,
9e00: 20 69 2c 20 6e 29 3b 0a 20 20 20 20 20 20 20 20   i, n);.        
9e10: 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 64 27  }else if( c=='d'
9e20: 20 26 26 20 73 74 72 63 6d 70 28 7a 54 79 70 65   && strcmp(zType
9e30: 2c 22 64 6f 75 62 6c 65 22 29 3d 3d 30 20 29 7b  ,"double")==0 ){
9e40: 0a 20 20 20 20 20 20 20 20 20 20 64 6f 75 62 6c  .          doubl
9e50: 65 20 72 3b 0a 20 20 20 20 20 20 20 20 20 20 54  e r;.          T
9e60: 63 6c 5f 47 65 74 44 6f 75 62 6c 65 46 72 6f 6d  cl_GetDoubleFrom
9e70: 4f 62 6a 28 69 6e 74 65 72 70 2c 20 70 56 61 72  Obj(interp, pVar
9e80: 2c 20 26 72 29 3b 0a 20 20 20 20 20 20 20 20 20  , &r);.         
9e90: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 64 6f   sqlite3_bind_do
9ea0: 75 62 6c 65 28 70 53 74 6d 74 2c 20 69 2c 20 72  uble(pStmt, i, r
9eb0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
9ec0: 20 69 66 28 20 28 63 3d 3d 27 77 27 20 26 26 20   if( (c=='w' && 
9ed0: 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22 77 69  strcmp(zType,"wi
9ee0: 64 65 49 6e 74 22 29 3d 3d 30 29 20 7c 7c 0a 20  deInt")==0) ||. 
9ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 3d               (c=
9f00: 3d 27 69 27 20 26 26 20 73 74 72 63 6d 70 28 7a  ='i' && strcmp(z
9f10: 54 79 70 65 2c 22 69 6e 74 22 29 3d 3d 30 29 20  Type,"int")==0) 
9f20: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c  ){.          Tcl
9f30: 5f 57 69 64 65 49 6e 74 20 76 3b 0a 20 20 20 20  _WideInt v;.    
9f40: 20 20 20 20 20 20 54 63 6c 5f 47 65 74 57 69 64        Tcl_GetWid
9f50: 65 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  eIntFromObj(inte
9f60: 72 70 2c 20 70 56 61 72 2c 20 26 76 29 3b 0a 20  rp, pVar, &v);. 
9f70: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
9f80: 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 53 74 6d  _bind_int64(pStm
9f90: 74 2c 20 69 2c 20 76 29 3b 0a 20 20 20 20 20 20  t, i, v);.      
9fa0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
9fb0: 20 20 20 64 61 74 61 20 3d 20 28 75 6e 73 69 67     data = (unsig
9fc0: 6e 65 64 20 63 68 61 72 20 2a 29 54 63 6c 5f 47  ned char *)Tcl_G
9fd0: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
9fe0: 70 56 61 72 2c 20 26 6e 29 3b 0a 20 20 20 20 20  pVar, &n);.     
9ff0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e       sqlite3_bin
a000: 64 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 69 2c  d_text(pStmt, i,
a010: 20 28 63 68 61 72 20 2a 29 64 61 74 61 2c 20 6e   (char *)data, n
a020: 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
a030: 3b 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f  ;.          Tcl_
a040: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 56 61  IncrRefCount(pVa
a050: 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50  r);.          pP
a060: 72 65 53 74 6d 74 2d 3e 61 70 50 61 72 6d 5b 69  reStmt->apParm[i
a070: 50 61 72 6d 2b 2b 5d 20 3d 20 70 56 61 72 3b 0a  Parm++] = pVar;.
a080: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
a090: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
a0a0: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c  qlite3_bind_null
a0b0: 28 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20  (pStmt, i);.    
a0c0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
a0d0: 70 50 72 65 53 74 6d 74 2d 3e 6e 50 61 72 6d 20  pPreStmt->nParm 
a0e0: 3d 20 69 50 61 72 6d 3b 0a 20 20 2a 70 70 50 72  = iParm;.  *ppPr
a0f0: 65 53 74 6d 74 20 3d 20 70 50 72 65 53 74 6d 74  eStmt = pPreStmt
a100: 3b 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  ;..  return TCL_
a110: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c  OK;.}../*.** Rel
a120: 65 61 73 65 20 61 20 73 74 61 74 65 6d 65 6e 74  ease a statement
a130: 20 72 65 66 65 72 65 6e 63 65 20 6f 62 74 61 69   reference obtai
a140: 6e 65 64 20 62 79 20 63 61 6c 6c 69 6e 67 20 64  ned by calling d
a150: 62 50 72 65 70 61 72 65 41 6e 64 42 69 6e 64 28  bPrepareAndBind(
a160: 29 2e 0a 2a 2a 20 54 68 65 72 65 20 73 68 6f 75  )..** There shou
a170: 6c 64 20 62 65 20 65 78 61 63 74 6c 79 20 6f 6e  ld be exactly on
a180: 65 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 66  e call to this f
a190: 75 6e 63 74 69 6f 6e 20 66 6f 72 20 65 61 63 68  unction for each
a1a0: 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20 64 62 50 72   call to.** dbPr
a1b0: 65 70 61 72 65 41 6e 64 42 69 6e 64 28 29 2e 0a  epareAndBind()..
a1c0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 69 73  **.** If the dis
a1d0: 63 61 72 64 20 70 61 72 61 6d 65 74 65 72 20 69  card parameter i
a1e0: 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
a1f0: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69   the statement i
a200: 73 20 64 65 6c 65 74 65 64 0a 2a 2a 20 69 6d 6d  s deleted.** imm
a210: 65 64 69 61 74 65 6c 79 2e 20 4f 74 68 65 72 77  ediately. Otherw
a220: 69 73 65 20 69 74 20 69 73 20 61 64 64 65 64 20  ise it is added 
a230: 74 6f 20 74 68 65 20 4c 52 55 20 6c 69 73 74 20  to the LRU list 
a240: 61 6e 64 20 6d 61 79 20 62 65 20 72 65 74 75 72  and may be retur
a250: 6e 65 64 0a 2a 2a 20 62 79 20 61 20 73 75 62 73  ned.** by a subs
a260: 65 71 75 65 6e 74 20 63 61 6c 6c 20 74 6f 20 64  equent call to d
a270: 62 50 72 65 70 61 72 65 41 6e 64 42 69 6e 64 28  bPrepareAndBind(
a280: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  )..*/.static voi
a290: 64 20 64 62 52 65 6c 65 61 73 65 53 74 6d 74 28  d dbReleaseStmt(
a2a0: 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62  .  SqliteDb *pDb
a2b0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
a2c0: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68     /* Database h
a2d0: 61 6e 64 6c 65 20 2a 2f 0a 20 20 53 71 6c 50 72  andle */.  SqlPr
a2e0: 65 70 61 72 65 64 53 74 6d 74 20 2a 70 50 72 65  eparedStmt *pPre
a2f0: 53 74 6d 74 2c 20 20 20 20 20 20 2f 2a 20 50 72  Stmt,      /* Pr
a300: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
a310: 20 68 61 6e 64 6c 65 20 74 6f 20 72 65 6c 65 61   handle to relea
a320: 73 65 20 2a 2f 0a 20 20 69 6e 74 20 64 69 73 63  se */.  int disc
a330: 61 72 64 20 20 20 20 20 20 20 20 20 20 20 20 20  ard             
a340: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
a350: 74 6f 20 64 65 6c 65 74 65 20 28 6e 6f 74 20 63  to delete (not c
a360: 61 63 68 65 29 20 74 68 65 20 70 50 72 65 53 74  ache) the pPreSt
a370: 6d 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  mt */.){.  int i
a380: 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20 74 68 65  ;..  /* Free the
a390: 20 62 6f 75 6e 64 20 73 74 72 69 6e 67 20 61 6e   bound string an
a3a0: 64 20 62 6c 6f 62 20 70 61 72 61 6d 65 74 65 72  d blob parameter
a3b0: 73 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20  s */.  for(i=0; 
a3c0: 69 3c 70 50 72 65 53 74 6d 74 2d 3e 6e 50 61 72  i<pPreStmt->nPar
a3d0: 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 54 63 6c  m; i++){.    Tcl
a3e0: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 50  _DecrRefCount(pP
a3f0: 72 65 53 74 6d 74 2d 3e 61 70 50 61 72 6d 5b 69  reStmt->apParm[i
a400: 5d 29 3b 0a 20 20 7d 0a 20 20 70 50 72 65 53 74  ]);.  }.  pPreSt
a410: 6d 74 2d 3e 6e 50 61 72 6d 20 3d 20 30 3b 0a 0a  mt->nParm = 0;..
a420: 20 20 69 66 28 20 70 44 62 2d 3e 6d 61 78 53 74    if( pDb->maxSt
a430: 6d 74 3c 3d 30 20 7c 7c 20 64 69 73 63 61 72 64  mt<=0 || discard
a440: 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   ){.    /* If th
a450: 65 20 63 61 63 68 65 20 69 73 20 74 75 72 6e 65  e cache is turne
a460: 64 20 6f 66 66 2c 20 64 65 61 6c 6c 6f 63 61 74  d off, deallocat
a470: 65 64 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ed the statement
a480: 20 2a 2f 0a 20 20 20 20 64 62 46 72 65 65 53 74   */.    dbFreeSt
a490: 6d 74 28 70 50 72 65 53 74 6d 74 29 3b 0a 20 20  mt(pPreStmt);.  
a4a0: 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 41 64  }else{.    /* Ad
a4b0: 64 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73  d the prepared s
a4c0: 74 61 74 65 6d 65 6e 74 20 74 6f 20 74 68 65 20  tatement to the 
a4d0: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
a4e0: 20 63 61 63 68 65 20 6c 69 73 74 2e 20 2a 2f 0a   cache list. */.
a4f0: 20 20 20 20 70 50 72 65 53 74 6d 74 2d 3e 70 4e      pPreStmt->pN
a500: 65 78 74 20 3d 20 70 44 62 2d 3e 73 74 6d 74 4c  ext = pDb->stmtL
a510: 69 73 74 3b 0a 20 20 20 20 70 50 72 65 53 74 6d  ist;.    pPreStm
a520: 74 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20  t->pPrev = 0;.  
a530: 20 20 69 66 28 20 70 44 62 2d 3e 73 74 6d 74 4c    if( pDb->stmtL
a540: 69 73 74 20 29 7b 0a 20 20 20 20 20 70 44 62 2d  ist ){.     pDb-
a550: 3e 73 74 6d 74 4c 69 73 74 2d 3e 70 50 72 65 76  >stmtList->pPrev
a560: 20 3d 20 70 50 72 65 53 74 6d 74 3b 0a 20 20 20   = pPreStmt;.   
a570: 20 7d 0a 20 20 20 20 70 44 62 2d 3e 73 74 6d 74   }.    pDb->stmt
a580: 4c 69 73 74 20 3d 20 70 50 72 65 53 74 6d 74 3b  List = pPreStmt;
a590: 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e 73 74  .    if( pDb->st
a5a0: 6d 74 4c 61 73 74 3d 3d 30 20 29 7b 0a 20 20 20  mtLast==0 ){.   
a5b0: 20 20 20 61 73 73 65 72 74 28 20 70 44 62 2d 3e     assert( pDb->
a5c0: 6e 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20  nStmt==0 );.    
a5d0: 20 20 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74 20    pDb->stmtLast 
a5e0: 3d 20 70 50 72 65 53 74 6d 74 3b 0a 20 20 20 20  = pPreStmt;.    
a5f0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
a600: 65 72 74 28 20 70 44 62 2d 3e 6e 53 74 6d 74 3e  ert( pDb->nStmt>
a610: 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  0 );.    }.    p
a620: 44 62 2d 3e 6e 53 74 6d 74 2b 2b 3b 0a 20 20 20  Db->nStmt++;.   
a630: 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20 68 61  .    /* If we ha
a640: 76 65 20 74 6f 6f 20 6d 61 6e 79 20 73 74 61 74  ve too many stat
a650: 65 6d 65 6e 74 20 69 6e 20 63 61 63 68 65 2c 20  ement in cache, 
a660: 72 65 6d 6f 76 65 20 74 68 65 20 73 75 72 70 6c  remove the surpl
a670: 75 73 20 66 72 6f 6d 20 0a 20 20 20 20 2a 2a 20  us from .    ** 
a680: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 63  the end of the c
a690: 61 63 68 65 20 6c 69 73 74 2e 20 20 2a 2f 0a 20  ache list.  */. 
a6a0: 20 20 20 77 68 69 6c 65 28 20 70 44 62 2d 3e 6e     while( pDb->n
a6b0: 53 74 6d 74 3e 70 44 62 2d 3e 6d 61 78 53 74 6d  Stmt>pDb->maxStm
a6c0: 74 20 29 7b 0a 20 20 20 20 20 20 53 71 6c 50 72  t ){.      SqlPr
a6d0: 65 70 61 72 65 64 53 74 6d 74 20 2a 70 4c 61 73  eparedStmt *pLas
a6e0: 74 20 3d 20 70 44 62 2d 3e 73 74 6d 74 4c 61 73  t = pDb->stmtLas
a6f0: 74 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e 73 74  t;.      pDb->st
a700: 6d 74 4c 61 73 74 20 3d 20 70 4c 61 73 74 2d 3e  mtLast = pLast->
a710: 70 50 72 65 76 3b 0a 20 20 20 20 20 20 70 44 62  pPrev;.      pDb
a720: 2d 3e 73 74 6d 74 4c 61 73 74 2d 3e 70 4e 65 78  ->stmtLast->pNex
a730: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 44 62  t = 0;.      pDb
a740: 2d 3e 6e 53 74 6d 74 2d 2d 3b 0a 20 20 20 20 20  ->nStmt--;.     
a750: 20 64 62 46 72 65 65 53 74 6d 74 28 70 4c 61 73   dbFreeStmt(pLas
a760: 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  t);.    }.  }.}.
a770: 0a 2f 2a 0a 2a 2a 20 53 74 72 75 63 74 75 72 65  ./*.** Structure
a780: 20 75 73 65 64 20 77 69 74 68 20 64 62 45 76 61   used with dbEva
a790: 6c 58 58 58 28 29 20 66 75 6e 63 74 69 6f 6e 73  lXXX() functions
a7a0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 64 62 45 76 61 6c  :.**.**   dbEval
a7b0: 49 6e 69 74 28 29 0a 2a 2a 20 20 20 64 62 45 76  Init().**   dbEv
a7c0: 61 6c 53 74 65 70 28 29 0a 2a 2a 20 20 20 64 62  alStep().**   db
a7d0: 45 76 61 6c 46 69 6e 61 6c 69 7a 65 28 29 0a 2a  EvalFinalize().*
a7e0: 2a 20 20 20 64 62 45 76 61 6c 52 6f 77 49 6e 66  *   dbEvalRowInf
a7f0: 6f 28 29 0a 2a 2a 20 20 20 64 62 45 76 61 6c 43  o().**   dbEvalC
a800: 6f 6c 75 6d 6e 56 61 6c 75 65 28 29 0a 2a 2f 0a  olumnValue().*/.
a810: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 44  typedef struct D
a820: 62 45 76 61 6c 43 6f 6e 74 65 78 74 20 44 62 45  bEvalContext DbE
a830: 76 61 6c 43 6f 6e 74 65 78 74 3b 0a 73 74 72 75  valContext;.stru
a840: 63 74 20 44 62 45 76 61 6c 43 6f 6e 74 65 78 74  ct DbEvalContext
a850: 20 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70   {.  SqliteDb *p
a860: 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Db;             
a870: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
a880: 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 54 63 6c   handle */.  Tcl
a890: 5f 4f 62 6a 20 2a 70 53 71 6c 3b 20 20 20 20 20  _Obj *pSql;     
a8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a8b0: 4f 62 6a 65 63 74 20 68 6f 6c 64 69 6e 67 20 73  Object holding s
a8c0: 74 72 69 6e 67 20 7a 53 71 6c 20 2a 2f 0a 20 20  tring zSql */.  
a8d0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c  const char *zSql
a8e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
a8f0: 2f 2a 20 52 65 6d 61 69 6e 69 6e 67 20 53 51 4c  /* Remaining SQL
a900: 20 74 6f 20 65 78 65 63 75 74 65 20 2a 2f 0a 20   to execute */. 
a910: 20 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74   SqlPreparedStmt
a920: 20 2a 70 50 72 65 53 74 6d 74 3b 20 20 20 20 20   *pPreStmt;     
a930: 20 2f 2a 20 43 75 72 72 65 6e 74 20 73 74 61 74   /* Current stat
a940: 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6e  ement */.  int n
a950: 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Col;            
a960: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
a970: 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
a980: 72 65 74 75 72 6e 65 64 20 62 79 20 70 53 74 6d  returned by pStm
a990: 74 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  t */.  Tcl_Obj *
a9a0: 70 41 72 72 61 79 3b 20 20 20 20 20 20 20 20 20  pArray;         
a9b0: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
a9c0: 66 20 61 72 72 61 79 20 76 61 72 69 61 62 6c 65  f array variable
a9d0: 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a   */.  Tcl_Obj **
a9e0: 61 70 43 6f 6c 4e 61 6d 65 3b 20 20 20 20 20 20  apColName;      
a9f0: 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f        /* Array o
aa00: 66 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a  f column names *
aa10: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65  /.};../*.** Rele
aa20: 61 73 65 20 61 6e 79 20 63 61 63 68 65 20 6f 66  ase any cache of
aa30: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 63 75   column names cu
aa40: 72 72 65 6e 74 6c 79 20 68 65 6c 64 20 61 73 20  rrently held as 
aa50: 70 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20 44  part of.** the D
aa60: 62 45 76 61 6c 43 6f 6e 74 65 78 74 20 73 74 72  bEvalContext str
aa70: 75 63 74 75 72 65 20 70 61 73 73 65 64 20 61 73  ucture passed as
aa80: 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
aa90: 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ent..*/.static v
aaa0: 6f 69 64 20 64 62 52 65 6c 65 61 73 65 43 6f 6c  oid dbReleaseCol
aab0: 75 6d 6e 4e 61 6d 65 73 28 44 62 45 76 61 6c 43  umnNames(DbEvalC
aac0: 6f 6e 74 65 78 74 20 2a 70 29 7b 0a 20 20 69 66  ontext *p){.  if
aad0: 28 20 70 2d 3e 61 70 43 6f 6c 4e 61 6d 65 20 29  ( p->apColName )
aae0: 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
aaf0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
ab00: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
ab10: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
ab20: 74 28 70 2d 3e 61 70 43 6f 6c 4e 61 6d 65 5b 69  t(p->apColName[i
ab30: 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63  ]);.    }.    Tc
ab40: 6c 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 70  l_Free((char *)p
ab50: 2d 3e 61 70 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20  ->apColName);.  
ab60: 20 20 70 2d 3e 61 70 43 6f 6c 4e 61 6d 65 20 3d    p->apColName =
ab70: 20 30 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6e 43 6f   0;.  }.  p->nCo
ab80: 6c 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  l = 0;.}../*.** 
ab90: 49 6e 69 74 69 61 6c 69 7a 65 20 61 20 44 62 45  Initialize a DbE
aba0: 76 61 6c 43 6f 6e 74 65 78 74 20 73 74 72 75 63  valContext struc
abb0: 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  ture..**.** If p
abc0: 41 72 72 61 79 20 69 73 20 6e 6f 74 20 4e 55 4c  Array is not NUL
abd0: 4c 2c 20 74 68 65 6e 20 69 74 20 63 6f 6e 74 61  L, then it conta
abe0: 69 6e 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ins the name of 
abf0: 61 20 54 63 6c 20 61 72 72 61 79 0a 2a 2a 20 76  a Tcl array.** v
ac00: 61 72 69 61 62 6c 65 2e 20 54 68 65 20 22 2a 22  ariable. The "*"
ac10: 20 6d 65 6d 62 65 72 20 6f 66 20 74 68 69 73 20   member of this 
ac20: 61 72 72 61 79 20 69 73 20 73 65 74 20 74 6f 20  array is set to 
ac30: 61 20 6c 69 73 74 20 63 6f 6e 74 61 69 6e 69 6e  a list containin
ac40: 67 0a 2a 2a 20 74 68 65 20 6e 61 6d 65 73 20 6f  g.** the names o
ac50: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 72 65  f the columns re
ac60: 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 73 74  turned by the st
ac70: 61 74 65 6d 65 6e 74 20 61 73 20 70 61 72 74 20  atement as part 
ac80: 6f 66 20 65 61 63 68 0a 2a 2a 20 63 61 6c 6c 20  of each.** call 
ac90: 74 6f 20 64 62 45 76 61 6c 53 74 65 70 28 29 2c  to dbEvalStep(),
aca0: 20 69 6e 20 6f 72 64 65 72 20 66 72 6f 6d 20 6c   in order from l
acb0: 65 66 74 20 74 6f 20 72 69 67 68 74 2e 20 65 2e  eft to right. e.
acc0: 67 2e 20 69 66 20 74 68 65 20 6e 61 6d 65 73 20  g. if the names 
acd0: 0a 2a 2a 20 6f 66 20 74 68 65 20 72 65 74 75 72  .** of the retur
ace0: 6e 65 64 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20  ned columns are 
acf0: 61 2c 20 62 20 61 6e 64 20 63 2c 20 69 74 20 64  a, b and c, it d
ad00: 6f 65 73 20 74 68 65 20 65 71 75 69 76 61 6c 65  oes the equivale
ad10: 6e 74 20 6f 66 20 74 68 65 20 0a 2a 2a 20 74 63  nt of the .** tc
ad20: 6c 20 63 6f 6d 6d 61 6e 64 3a 0a 2a 2a 0a 2a 2a  l command:.**.**
ad30: 20 20 20 20 20 73 65 74 20 24 7b 70 41 72 72 61       set ${pArra
ad40: 79 7d 28 2a 29 20 7b 61 20 62 20 63 7d 0a 2a 2f  y}(*) {a b c}.*/
ad50: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 62 45  .static void dbE
ad60: 76 61 6c 49 6e 69 74 28 0a 20 20 44 62 45 76 61  valInit(.  DbEva
ad70: 6c 43 6f 6e 74 65 78 74 20 2a 70 2c 20 20 20 20  lContext *p,    
ad80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
ad90: 69 6e 74 65 72 20 74 6f 20 73 74 72 75 63 74 75  inter to structu
ada0: 72 65 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65  re to initialize
adb0: 20 2a 2f 0a 20 20 53 71 6c 69 74 65 44 62 20 2a   */.  SqliteDb *
adc0: 70 44 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  pDb,            
add0: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
ade0: 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 54 63  e handle */.  Tc
adf0: 6c 5f 4f 62 6a 20 2a 70 53 71 6c 2c 20 20 20 20  l_Obj *pSql,    
ae00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ae10: 20 4f 62 6a 65 63 74 20 63 6f 6e 74 61 69 6e 69   Object containi
ae20: 6e 67 20 53 51 4c 20 73 63 72 69 70 74 20 2a 2f  ng SQL script */
ae30: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 41 72 72  .  Tcl_Obj *pArr
ae40: 61 79 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ay              
ae50: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 54 63     /* Name of Tc
ae60: 6c 20 61 72 72 61 79 20 74 6f 20 73 65 74 20 28  l array to set (
ae70: 2a 29 20 65 6c 65 6d 65 6e 74 20 6f 66 20 2a 2f  *) element of */
ae80: 0a 29 7b 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20  .){.  memset(p, 
ae90: 30 2c 20 73 69 7a 65 6f 66 28 44 62 45 76 61 6c  0, sizeof(DbEval
aea0: 43 6f 6e 74 65 78 74 29 29 3b 0a 20 20 70 2d 3e  Context));.  p->
aeb0: 70 44 62 20 3d 20 70 44 62 3b 0a 20 20 70 2d 3e  pDb = pDb;.  p->
aec0: 7a 53 71 6c 20 3d 20 54 63 6c 5f 47 65 74 53 74  zSql = Tcl_GetSt
aed0: 72 69 6e 67 28 70 53 71 6c 29 3b 0a 20 20 70 2d  ring(pSql);.  p-
aee0: 3e 70 53 71 6c 20 3d 20 70 53 71 6c 3b 0a 20 20  >pSql = pSql;.  
aef0: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
af00: 28 70 53 71 6c 29 3b 0a 20 20 69 66 28 20 70 41  (pSql);.  if( pA
af10: 72 72 61 79 20 29 7b 0a 20 20 20 20 70 2d 3e 70  rray ){.    p->p
af20: 41 72 72 61 79 20 3d 20 70 41 72 72 61 79 3b 0a  Array = pArray;.
af30: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43      Tcl_IncrRefC
af40: 6f 75 6e 74 28 70 41 72 72 61 79 29 3b 0a 20 20  ount(pArray);.  
af50: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 62 74 61 69  }.}../*.** Obtai
af60: 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  n information ab
af70: 6f 75 74 20 74 68 65 20 72 6f 77 20 74 68 61 74  out the row that
af80: 20 74 68 65 20 44 62 45 76 61 6c 43 6f 6e 74 65   the DbEvalConte
af90: 78 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65  xt passed as the
afa0: 0a 2a 2a 20 66 69 72 73 74 20 61 72 67 75 6d 65  .** first argume
afb0: 6e 74 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  nt currently poi
afc0: 6e 74 73 20 74 6f 2e 0a 2a 2f 0a 73 74 61 74 69  nts to..*/.stati
afd0: 63 20 76 6f 69 64 20 64 62 45 76 61 6c 52 6f 77  c void dbEvalRow
afe0: 49 6e 66 6f 28 0a 20 20 44 62 45 76 61 6c 43 6f  Info(.  DbEvalCo
aff0: 6e 74 65 78 74 20 2a 70 2c 20 20 20 20 20 20 20  ntext *p,       
b000: 20 20 20 20 20 20 20 20 2f 2a 20 45 76 61 6c 75          /* Evalu
b010: 61 74 69 6f 6e 20 63 6f 6e 74 65 78 74 20 2a 2f  ation context */
b020: 0a 20 20 69 6e 74 20 2a 70 6e 43 6f 6c 2c 20 20  .  int *pnCol,  
b030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b040: 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 75 6d 62 65     /* OUT: Numbe
b050: 72 20 6f 66 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  r of column name
b060: 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  s */.  Tcl_Obj *
b070: 2a 2a 70 61 70 43 6f 6c 4e 61 6d 65 20 20 20 20  **papColName    
b080: 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 41         /* OUT: A
b090: 72 72 61 79 20 6f 66 20 63 6f 6c 75 6d 6e 20 6e  rray of column n
b0a0: 61 6d 65 73 20 2a 2f 0a 29 7b 0a 20 20 2f 2a 20  ames */.){.  /* 
b0b0: 43 6f 6d 70 75 74 65 20 63 6f 6c 75 6d 6e 20 6e  Compute column n
b0c0: 61 6d 65 73 20 2a 2f 0a 20 20 69 66 28 20 30 3d  ames */.  if( 0=
b0d0: 3d 70 2d 3e 61 70 43 6f 6c 4e 61 6d 65 20 29 7b  =p->apColName ){
b0e0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  .    sqlite3_stm
b0f0: 74 20 2a 70 53 74 6d 74 20 3d 20 70 2d 3e 70 50  t *pStmt = p->pP
b100: 72 65 53 74 6d 74 2d 3e 70 53 74 6d 74 3b 0a 20  reStmt->pStmt;. 
b110: 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20     int i;       
b120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b130: 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72   /* Iterator var
b140: 69 61 62 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74  iable */.    int
b150: 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20   nCol;          
b160: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
b170: 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
b180: 72 65 74 75 72 6e 65 64 20 62 79 20 70 53 74 6d  returned by pStm
b190: 74 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  t */.    Tcl_Obj
b1a0: 20 2a 2a 61 70 43 6f 6c 4e 61 6d 65 20 3d 20 30   **apColName = 0
b1b0: 3b 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20  ;      /* Array 
b1c0: 6f 66 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  of column names 
b1d0: 2a 2f 0a 0a 20 20 20 20 70 2d 3e 6e 43 6f 6c 20  */..    p->nCol 
b1e0: 3d 20 6e 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33  = nCol = sqlite3
b1f0: 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70 53  _column_count(pS
b200: 74 6d 74 29 3b 0a 20 20 20 20 69 66 28 20 6e 43  tmt);.    if( nC
b210: 6f 6c 3e 30 20 26 26 20 28 70 61 70 43 6f 6c 4e  ol>0 && (papColN
b220: 61 6d 65 20 7c 7c 20 70 2d 3e 70 41 72 72 61 79  ame || p->pArray
b230: 29 20 29 7b 0a 20 20 20 20 20 20 61 70 43 6f 6c  ) ){.      apCol
b240: 4e 61 6d 65 20 3d 20 28 54 63 6c 5f 4f 62 6a 2a  Name = (Tcl_Obj*
b250: 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28 20 73 69 7a  *)Tcl_Alloc( siz
b260: 65 6f 66 28 54 63 6c 5f 4f 62 6a 2a 29 2a 6e 43  eof(Tcl_Obj*)*nC
b270: 6f 6c 20 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  ol );.      for(
b280: 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b  i=0; i<nCol; i++
b290: 29 7b 0a 20 20 20 20 20 20 20 20 61 70 43 6f 6c  ){.        apCol
b2a0: 4e 61 6d 65 5b 69 5d 20 3d 20 64 62 54 65 78 74  Name[i] = dbText
b2b0: 54 6f 4f 62 6a 28 73 71 6c 69 74 65 33 5f 63 6f  ToObj(sqlite3_co
b2c0: 6c 75 6d 6e 5f 6e 61 6d 65 28 70 53 74 6d 74 2c  lumn_name(pStmt,
b2d0: 69 29 29 3b 0a 20 20 20 20 20 20 20 20 54 63 6c  i));.        Tcl
b2e0: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 61 70  _IncrRefCount(ap
b2f0: 43 6f 6c 4e 61 6d 65 5b 69 5d 29 3b 0a 20 20 20  ColName[i]);.   
b300: 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 61 70     }.      p->ap
b310: 43 6f 6c 4e 61 6d 65 20 3d 20 61 70 43 6f 6c 4e  ColName = apColN
b320: 61 6d 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ame;.    }..    
b330: 2f 2a 20 49 66 20 72 65 73 75 6c 74 73 20 61 72  /* If results ar
b340: 65 20 62 65 69 6e 67 20 73 74 6f 72 65 64 20 69  e being stored i
b350: 6e 20 61 6e 20 61 72 72 61 79 20 76 61 72 69 61  n an array varia
b360: 62 6c 65 2c 20 74 68 65 6e 20 63 72 65 61 74 65  ble, then create
b370: 0a 20 20 20 20 2a 2a 20 74 68 65 20 61 72 72 61  .    ** the arra
b380: 79 28 2a 29 20 65 6e 74 72 79 20 66 6f 72 20 74  y(*) entry for t
b390: 68 61 74 20 61 72 72 61 79 0a 20 20 20 20 2a 2f  hat array.    */
b3a0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 41 72 72  .    if( p->pArr
b3b0: 61 79 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  ay ){.      Tcl_
b3c0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 20 3d  Interp *interp =
b3d0: 20 70 2d 3e 70 44 62 2d 3e 69 6e 74 65 72 70 3b   p->pDb->interp;
b3e0: 0a 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a  .      Tcl_Obj *
b3f0: 70 43 6f 6c 4c 69 73 74 20 3d 20 54 63 6c 5f 4e  pColList = Tcl_N
b400: 65 77 4f 62 6a 28 29 3b 0a 20 20 20 20 20 20 54  ewObj();.      T
b410: 63 6c 5f 4f 62 6a 20 2a 70 53 74 61 72 20 3d 20  cl_Obj *pStar = 
b420: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
b430: 28 22 2a 22 2c 20 2d 31 29 3b 0a 0a 20 20 20 20  ("*", -1);..    
b440: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f    for(i=0; i<nCo
b450: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; i++){.       
b460: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
b470: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
b480: 2c 20 70 43 6f 6c 4c 69 73 74 2c 20 61 70 43 6f  , pColList, apCo
b490: 6c 4e 61 6d 65 5b 69 5d 29 3b 0a 20 20 20 20 20  lName[i]);.     
b4a0: 20 7d 0a 20 20 20 20 20 20 54 63 6c 5f 49 6e 63   }.      Tcl_Inc
b4b0: 72 52 65 66 43 6f 75 6e 74 28 70 53 74 61 72 29  rRefCount(pStar)
b4c0: 3b 0a 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 53  ;.      Tcl_ObjS
b4d0: 65 74 56 61 72 32 28 69 6e 74 65 72 70 2c 20 70  etVar2(interp, p
b4e0: 2d 3e 70 41 72 72 61 79 2c 20 70 53 74 61 72 2c  ->pArray, pStar,
b4f0: 20 70 43 6f 6c 4c 69 73 74 2c 20 30 29 3b 0a 20   pColList, 0);. 
b500: 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66       Tcl_DecrRef
b510: 43 6f 75 6e 74 28 70 53 74 61 72 29 3b 0a 20 20  Count(pStar);.  
b520: 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70    }.  }..  if( p
b530: 61 70 43 6f 6c 4e 61 6d 65 20 29 7b 0a 20 20 20  apColName ){.   
b540: 20 2a 70 61 70 43 6f 6c 4e 61 6d 65 20 3d 20 70   *papColName = p
b550: 2d 3e 61 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20 7d  ->apColName;.  }
b560: 0a 20 20 69 66 28 20 70 6e 43 6f 6c 20 29 7b 0a  .  if( pnCol ){.
b570: 20 20 20 20 2a 70 6e 43 6f 6c 20 3d 20 70 2d 3e      *pnCol = p->
b580: 6e 43 6f 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  nCol;.  }.}../*.
b590: 2a 2a 20 52 65 74 75 72 6e 20 6f 6e 65 20 6f 66  ** Return one of
b5a0: 20 54 43 4c 5f 4f 4b 2c 20 54 43 4c 5f 42 52 45   TCL_OK, TCL_BRE
b5b0: 41 4b 20 6f 72 20 54 43 4c 5f 45 52 52 4f 52 2e  AK or TCL_ERROR.
b5c0: 20 49 66 20 54 43 4c 5f 45 52 52 4f 52 20 69 73   If TCL_ERROR is
b5d0: 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2c 20 74 68  .** returned, th
b5e0: 65 6e 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  en an error mess
b5f0: 61 67 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e  age is stored in
b600: 20 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 72   the interpreter
b610: 20 62 65 66 6f 72 65 0a 2a 2a 20 72 65 74 75 72   before.** retur
b620: 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41 20 72 65  ning..**.** A re
b630: 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 54 43  turn value of TC
b640: 4c 5f 4f 4b 20 6d 65 61 6e 73 20 74 68 65 72 65  L_OK means there
b650: 20 69 73 20 61 20 72 6f 77 20 6f 66 20 64 61 74   is a row of dat
b660: 61 20 61 76 61 69 6c 61 62 6c 65 2e 20 54 68 65  a available. The
b670: 0a 2a 2a 20 64 61 74 61 20 6d 61 79 20 62 65 20  .** data may be 
b680: 61 63 63 65 73 73 65 64 20 75 73 69 6e 67 20 64  accessed using d
b690: 62 45 76 61 6c 52 6f 77 49 6e 66 6f 28 29 20 61  bEvalRowInfo() a
b6a0: 6e 64 20 64 62 45 76 61 6c 43 6f 6c 75 6d 6e 56  nd dbEvalColumnV
b6b0: 61 6c 75 65 28 29 2e 20 54 68 69 73 0a 2a 2a 20  alue(). This.** 
b6c0: 69 73 20 61 6e 61 6c 6f 67 6f 75 73 20 74 6f 20  is analogous to 
b6d0: 61 20 72 65 74 75 72 6e 20 6f 66 20 53 51 4c 49  a return of SQLI
b6e0: 54 45 5f 52 4f 57 20 66 72 6f 6d 20 73 71 6c 69  TE_ROW from sqli
b6f0: 74 65 33 5f 73 74 65 70 28 29 2e 20 49 66 20 54  te3_step(). If T
b700: 43 4c 5f 42 52 45 41 4b 0a 2a 2a 20 69 73 20 72  CL_BREAK.** is r
b710: 65 74 75 72 6e 65 64 2c 20 74 68 65 6e 20 74 68  eturned, then th
b720: 65 20 53 51 4c 20 73 63 72 69 70 74 20 68 61 73  e SQL script has
b730: 20 66 69 6e 69 73 68 65 64 20 65 78 65 63 75 74   finished execut
b740: 69 6e 67 20 61 6e 64 20 74 68 65 72 65 20 61 72  ing and there ar
b750: 65 0a 2a 2a 20 6e 6f 20 66 75 72 74 68 65 72 20  e.** no further 
b760: 72 6f 77 73 20 61 76 61 69 6c 61 62 6c 65 2e 20  rows available. 
b770: 54 68 69 73 20 69 73 20 73 69 6d 69 6c 61 72 20  This is similar 
b780: 74 6f 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a  to SQLITE_DONE..
b790: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 62  */.static int db
b7a0: 45 76 61 6c 53 74 65 70 28 44 62 45 76 61 6c 43  EvalStep(DbEvalC
b7b0: 6f 6e 74 65 78 74 20 2a 70 29 7b 0a 20 20 63 6f  ontext *p){.  co
b7c0: 6e 73 74 20 63 68 61 72 20 2a 7a 50 72 65 76 53  nst char *zPrevS
b7d0: 71 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  ql = 0;       /*
b7e0: 20 50 72 65 76 69 6f 75 73 20 76 61 6c 75 65 20   Previous value 
b7f0: 6f 66 20 70 2d 3e 7a 53 71 6c 20 2a 2f 0a 0a 20  of p->zSql */.. 
b800: 20 77 68 69 6c 65 28 20 70 2d 3e 7a 53 71 6c 5b   while( p->zSql[
b810: 30 5d 20 7c 7c 20 70 2d 3e 70 50 72 65 53 74 6d  0] || p->pPreStm
b820: 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b  t ){.    int rc;
b830: 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 50 72 65  .    if( p->pPre
b840: 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Stmt==0 ){.     
b850: 20 7a 50 72 65 76 53 71 6c 20 3d 20 28 70 2d 3e   zPrevSql = (p->
b860: 7a 53 71 6c 3d 3d 7a 50 72 65 76 53 71 6c 20 3f  zSql==zPrevSql ?
b870: 20 30 20 3a 20 70 2d 3e 7a 53 71 6c 29 3b 0a 20   0 : p->zSql);. 
b880: 20 20 20 20 20 72 63 20 3d 20 64 62 50 72 65 70       rc = dbPrep
b890: 61 72 65 41 6e 64 42 69 6e 64 28 70 2d 3e 70 44  areAndBind(p->pD
b8a0: 62 2c 20 70 2d 3e 7a 53 71 6c 2c 20 26 70 2d 3e  b, p->zSql, &p->
b8b0: 7a 53 71 6c 2c 20 26 70 2d 3e 70 50 72 65 53 74  zSql, &p->pPreSt
b8c0: 6d 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  mt);.      if( r
b8d0: 63 21 3d 54 43 4c 5f 4f 4b 20 29 20 72 65 74 75  c!=TCL_OK ) retu
b8e0: 72 6e 20 72 63 3b 0a 20 20 20 20 7d 65 6c 73 65  rn rc;.    }else
b8f0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 73 3b  {.      int rcs;
b900: 0a 20 20 20 20 20 20 53 71 6c 69 74 65 44 62 20  .      SqliteDb 
b910: 2a 70 44 62 20 3d 20 70 2d 3e 70 44 62 3b 0a 20  *pDb = p->pDb;. 
b920: 20 20 20 20 20 53 71 6c 50 72 65 70 61 72 65 64       SqlPrepared
b930: 53 74 6d 74 20 2a 70 50 72 65 53 74 6d 74 20 3d  Stmt *pPreStmt =
b940: 20 70 2d 3e 70 50 72 65 53 74 6d 74 3b 0a 20 20   p->pPreStmt;.  
b950: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74      sqlite3_stmt
b960: 20 2a 70 53 74 6d 74 20 3d 20 70 50 72 65 53 74   *pStmt = pPreSt
b970: 6d 74 2d 3e 70 53 74 6d 74 3b 0a 0a 20 20 20 20  mt->pStmt;..    
b980: 20 20 72 63 73 20 3d 20 73 71 6c 69 74 65 33 5f    rcs = sqlite3_
b990: 73 74 65 70 28 70 53 74 6d 74 29 3b 0a 20 20 20  step(pStmt);.   
b9a0: 20 20 20 69 66 28 20 72 63 73 3d 3d 53 51 4c 49     if( rcs==SQLI
b9b0: 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20 20  TE_ROW ){.      
b9c0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
b9d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
b9e0: 66 28 20 70 2d 3e 70 41 72 72 61 79 20 29 7b 0a  f( p->pArray ){.
b9f0: 20 20 20 20 20 20 20 20 64 62 45 76 61 6c 52 6f          dbEvalRo
ba00: 77 49 6e 66 6f 28 70 2c 20 30 2c 20 30 29 3b 0a  wInfo(p, 0, 0);.
ba10: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63        }.      rc
ba20: 73 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65  s = sqlite3_rese
ba30: 74 28 70 53 74 6d 74 29 3b 0a 0a 20 20 20 20 20  t(pStmt);..     
ba40: 20 70 44 62 2d 3e 6e 53 74 65 70 20 3d 20 73 71   pDb->nStep = sq
ba50: 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74 61 74 75  lite3_stmt_statu
ba60: 73 28 70 53 74 6d 74 2c 53 51 4c 49 54 45 5f 53  s(pStmt,SQLITE_S
ba70: 54 4d 54 53 54 41 54 55 53 5f 46 55 4c 4c 53 43  TMTSTATUS_FULLSC
ba80: 41 4e 5f 53 54 45 50 2c 31 29 3b 0a 20 20 20 20  AN_STEP,1);.    
ba90: 20 20 70 44 62 2d 3e 6e 53 6f 72 74 20 3d 20 73    pDb->nSort = s
baa0: 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74 61 74  qlite3_stmt_stat
bab0: 75 73 28 70 53 74 6d 74 2c 53 51 4c 49 54 45 5f  us(pStmt,SQLITE_
bac0: 53 54 4d 54 53 54 41 54 55 53 5f 53 4f 52 54 2c  STMTSTATUS_SORT,
bad0: 31 29 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e 6e  1);.      pDb->n
bae0: 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33 5f  Index = sqlite3_
baf0: 73 74 6d 74 5f 73 74 61 74 75 73 28 70 53 74 6d  stmt_status(pStm
bb00: 74 2c 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41  t,SQLITE_STMTSTA
bb10: 54 55 53 5f 41 55 54 4f 49 4e 44 45 58 2c 31 29  TUS_AUTOINDEX,1)
bb20: 3b 0a 20 20 20 20 20 20 64 62 52 65 6c 65 61 73  ;.      dbReleas
bb30: 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 29 3b  eColumnNames(p);
bb40: 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 65 53 74  .      p->pPreSt
bb50: 6d 74 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 69  mt = 0;..      i
bb60: 66 28 20 72 63 73 21 3d 53 51 4c 49 54 45 5f 4f  f( rcs!=SQLITE_O
bb70: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  K ){.        /* 
bb80: 49 66 20 61 20 72 75 6e 2d 74 69 6d 65 20 65 72  If a run-time er
bb90: 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 70 6f  ror occurs, repo
bba0: 72 74 20 74 68 65 20 65 72 72 6f 72 20 61 6e 64  rt the error and
bbb0: 20 73 74 6f 70 20 72 65 61 64 69 6e 67 0a 20 20   stop reading.  
bbc0: 20 20 20 20 20 20 2a 2a 20 74 68 65 20 53 51 4c        ** the SQL
bbd0: 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 64 62  .  */.        db
bbe0: 52 65 6c 65 61 73 65 53 74 6d 74 28 70 44 62 2c  ReleaseStmt(pDb,
bbf0: 20 70 50 72 65 53 74 6d 74 2c 20 31 29 3b 0a 23   pPreStmt, 1);.#
bc00: 69 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  if SQLITE_TEST. 
bc10: 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 44         if( p->pD
bc20: 62 2d 3e 62 4c 65 67 61 63 79 50 72 65 70 61 72  b->bLegacyPrepar
bc30: 65 20 26 26 20 72 63 73 3d 3d 53 51 4c 49 54 45  e && rcs==SQLITE
bc40: 5f 53 43 48 45 4d 41 20 26 26 20 7a 50 72 65 76  _SCHEMA && zPrev
bc50: 53 71 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Sql ){.         
bc60: 20 2f 2a 20 49 66 20 74 68 65 20 72 75 6e 74 69   /* If the runti
bc70: 6d 65 20 65 72 72 6f 72 20 77 61 73 20 61 6e 20  me error was an 
bc80: 53 51 4c 49 54 45 5f 53 43 48 45 4d 41 2c 20 61  SQLITE_SCHEMA, a
bc90: 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  nd the database.
bca0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 68 61 6e            ** han
bcb0: 64 6c 65 20 69 73 20 63 6f 6e 66 69 67 75 72 65  dle is configure
bcc0: 64 20 74 6f 20 75 73 65 20 74 68 65 20 6c 65 67  d to use the leg
bcd0: 61 63 79 20 73 71 6c 69 74 65 33 5f 70 72 65 70  acy sqlite3_prep
bce0: 61 72 65 28 29 20 0a 20 20 20 20 20 20 20 20 20  are() .         
bcf0: 20 2a 2a 20 69 6e 74 65 72 66 61 63 65 2c 20 72   ** interface, r
bd00: 65 74 72 79 20 70 72 65 70 61 72 65 28 29 2f 73  etry prepare()/s
bd10: 74 65 70 28 29 20 6f 6e 20 74 68 65 20 73 61 6d  tep() on the sam
bd20: 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e  e SQL statement.
bd30: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 54 68  .          ** Th
bd40: 69 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20  is only happens 
bd50: 6f 6e 63 65 2e 20 49 66 20 74 68 65 72 65 20 69  once. If there i
bd60: 73 20 61 20 73 65 63 6f 6e 64 20 53 51 4c 49 54  s a second SQLIT
bd70: 45 5f 53 43 48 45 4d 41 0a 20 20 20 20 20 20 20  E_SCHEMA.       
bd80: 20 20 20 2a 2a 20 65 72 72 6f 72 2c 20 74 68 65     ** error, the
bd90: 20 65 72 72 6f 72 20 77 69 6c 6c 20 62 65 20 72   error will be r
bda0: 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63  eturned to the c
bdb0: 61 6c 6c 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  aller. */.      
bdc0: 20 20 20 20 70 2d 3e 7a 53 71 6c 20 3d 20 7a 50      p->zSql = zP
bdd0: 72 65 76 53 71 6c 3b 0a 20 20 20 20 20 20 20 20  revSql;.        
bde0: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
bdf0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
be00: 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52       Tcl_SetObjR
be10: 65 73 75 6c 74 28 70 44 62 2d 3e 69 6e 74 65 72  esult(pDb->inter
be20: 70 2c 20 64 62 54 65 78 74 54 6f 4f 62 6a 28 73  p, dbTextToObj(s
be30: 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44  qlite3_errmsg(pD
be40: 62 2d 3e 64 62 29 29 29 3b 0a 20 20 20 20 20 20  b->db)));.      
be50: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
be60: 4f 52 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  OR;.      }else{
be70: 0a 20 20 20 20 20 20 20 20 64 62 52 65 6c 65 61  .        dbRelea
be80: 73 65 53 74 6d 74 28 70 44 62 2c 20 70 50 72 65  seStmt(pDb, pPre
be90: 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  Stmt, 0);.      
bea0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
beb0: 2a 20 46 69 6e 69 73 68 65 64 20 2a 2f 0a 20 20  * Finished */.  
bec0: 72 65 74 75 72 6e 20 54 43 4c 5f 42 52 45 41 4b  return TCL_BREAK
bed0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20  ;.}../*.** Free 
bee0: 61 6c 6c 20 72 65 73 6f 75 72 63 65 73 20 63 75  all resources cu
bef0: 72 72 65 6e 74 6c 79 20 68 65 6c 64 20 62 79 20  rrently held by 
bf00: 74 68 65 20 44 62 45 76 61 6c 43 6f 6e 74 65 78  the DbEvalContex
bf10: 74 20 73 74 72 75 63 74 75 72 65 20 70 61 73 73  t structure pass
bf20: 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 66 69 72  ed.** as the fir
bf30: 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 65  st argument. The
bf40: 72 65 20 73 68 6f 75 6c 64 20 62 65 20 65 78 61  re should be exa
bf50: 63 74 6c 79 20 6f 6e 65 20 63 61 6c 6c 20 74 6f  ctly one call to
bf60: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a   this function.*
bf70: 2a 20 66 6f 72 20 65 61 63 68 20 63 61 6c 6c 20  * for each call 
bf80: 74 6f 20 64 62 45 76 61 6c 49 6e 69 74 28 29 2e  to dbEvalInit().
bf90: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
bfa0: 64 62 45 76 61 6c 46 69 6e 61 6c 69 7a 65 28 44  dbEvalFinalize(D
bfb0: 62 45 76 61 6c 43 6f 6e 74 65 78 74 20 2a 70 29  bEvalContext *p)
bfc0: 7b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 65 53  {.  if( p->pPreS
bfd0: 74 6d 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  tmt ){.    sqlit
bfe0: 65 33 5f 72 65 73 65 74 28 70 2d 3e 70 50 72 65  e3_reset(p->pPre
bff0: 53 74 6d 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20  Stmt->pStmt);.  
c000: 20 20 64 62 52 65 6c 65 61 73 65 53 74 6d 74 28    dbReleaseStmt(
c010: 70 2d 3e 70 44 62 2c 20 70 2d 3e 70 50 72 65 53  p->pDb, p->pPreS
c020: 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 70 2d 3e  tmt, 0);.    p->
c030: 70 50 72 65 53 74 6d 74 20 3d 20 30 3b 0a 20 20  pPreStmt = 0;.  
c040: 7d 0a 20 20 69 66 28 20 70 2d 3e 70 41 72 72 61  }.  if( p->pArra
c050: 79 20 29 7b 0a 20 20 20 20 54 63 6c 5f 44 65 63  y ){.    Tcl_Dec
c060: 72 52 65 66 43 6f 75 6e 74 28 70 2d 3e 70 41 72  rRefCount(p->pAr
c070: 72 61 79 29 3b 0a 20 20 20 20 70 2d 3e 70 41 72  ray);.    p->pAr
c080: 72 61 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 54  ray = 0;.  }.  T
c090: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
c0a0: 70 2d 3e 70 53 71 6c 29 3b 0a 20 20 64 62 52 65  p->pSql);.  dbRe
c0b0: 6c 65 61 73 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73  leaseColumnNames
c0c0: 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  (p);.}../*.** Re
c0d0: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
c0e0: 6f 20 61 20 54 63 6c 5f 4f 62 6a 20 73 74 72 75  o a Tcl_Obj stru
c0f0: 63 74 75 72 65 20 77 69 74 68 20 72 65 66 2d 63  cture with ref-c
c100: 6f 75 6e 74 20 30 20 74 68 61 74 20 63 6f 6e 74  ount 0 that cont
c110: 61 69 6e 73 0a 2a 2a 20 74 68 65 20 76 61 6c 75  ains.** the valu
c120: 65 20 66 6f 72 20 74 68 65 20 69 43 6f 6c 27 74  e for the iCol't
c130: 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  h column of the 
c140: 72 6f 77 20 63 75 72 72 65 6e 74 6c 79 20 70 6f  row currently po
c150: 69 6e 74 65 64 20 74 6f 20 62 79 0a 2a 2a 20 74  inted to by.** t
c160: 68 65 20 44 62 45 76 61 6c 43 6f 6e 74 65 78 74  he DbEvalContext
c170: 20 73 74 72 75 63 74 75 72 65 20 70 61 73 73 65   structure passe
c180: 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61  d as the first a
c190: 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74  rgument..*/.stat
c1a0: 69 63 20 54 63 6c 5f 4f 62 6a 20 2a 64 62 45 76  ic Tcl_Obj *dbEv
c1b0: 61 6c 43 6f 6c 75 6d 6e 56 61 6c 75 65 28 44 62  alColumnValue(Db
c1c0: 45 76 61 6c 43 6f 6e 74 65 78 74 20 2a 70 2c 20  EvalContext *p, 
c1d0: 69 6e 74 20 69 43 6f 6c 29 7b 0a 20 20 73 71 6c  int iCol){.  sql
c1e0: 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
c1f0: 20 3d 20 70 2d 3e 70 50 72 65 53 74 6d 74 2d 3e   = p->pPreStmt->
c200: 70 53 74 6d 74 3b 0a 20 20 73 77 69 74 63 68 28  pStmt;.  switch(
c210: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
c220: 74 79 70 65 28 70 53 74 6d 74 2c 20 69 43 6f 6c  type(pStmt, iCol
c230: 29 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51  ) ){.    case SQ
c240: 4c 49 54 45 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20  LITE_BLOB: {.   
c250: 20 20 20 69 6e 74 20 62 79 74 65 73 20 3d 20 73     int bytes = s
c260: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79  qlite3_column_by
c270: 74 65 73 28 70 53 74 6d 74 2c 20 69 43 6f 6c 29  tes(pStmt, iCol)
c280: 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  ;.      const ch
c290: 61 72 20 2a 7a 42 6c 6f 62 20 3d 20 73 71 6c 69  ar *zBlob = sqli
c2a0: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28  te3_column_blob(
c2b0: 70 53 74 6d 74 2c 20 69 43 6f 6c 29 3b 0a 20 20  pStmt, iCol);.  
c2c0: 20 20 20 20 69 66 28 20 21 7a 42 6c 6f 62 20 29      if( !zBlob )
c2d0: 20 62 79 74 65 73 20 3d 20 30 3b 0a 20 20 20 20   bytes = 0;.    
c2e0: 20 20 72 65 74 75 72 6e 20 54 63 6c 5f 4e 65 77    return Tcl_New
c2f0: 42 79 74 65 41 72 72 61 79 4f 62 6a 28 28 75 38  ByteArrayObj((u8
c300: 2a 29 7a 42 6c 6f 62 2c 20 62 79 74 65 73 29 3b  *)zBlob, bytes);
c310: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
c320: 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3a 20  SQLITE_INTEGER: 
c330: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 5f 69  {.      sqlite_i
c340: 6e 74 36 34 20 76 20 3d 20 73 71 6c 69 74 65 33  nt64 v = sqlite3
c350: 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 53  _column_int64(pS
c360: 74 6d 74 2c 20 69 43 6f 6c 29 3b 0a 20 20 20 20  tmt, iCol);.    
c370: 20 20 69 66 28 20 76 3e 3d 2d 32 31 34 37 34 38    if( v>=-214748
c380: 33 36 34 37 20 26 26 20 76 3c 3d 32 31 34 37 34  3647 && v<=21474
c390: 38 33 36 34 37 20 29 7b 0a 20 20 20 20 20 20 20  83647 ){.       
c3a0: 20 72 65 74 75 72 6e 20 54 63 6c 5f 4e 65 77 49   return Tcl_NewI
c3b0: 6e 74 4f 62 6a 28 28 69 6e 74 29 76 29 3b 0a 20  ntObj((int)v);. 
c3c0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
c3d0: 20 20 20 20 72 65 74 75 72 6e 20 54 63 6c 5f 4e      return Tcl_N
c3e0: 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 76 29 3b  ewWideIntObj(v);
c3f0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
c400: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
c410: 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20 72 65  LOAT: {.      re
c420: 74 75 72 6e 20 54 63 6c 5f 4e 65 77 44 6f 75 62  turn Tcl_NewDoub
c430: 6c 65 4f 62 6a 28 73 71 6c 69 74 65 33 5f 63 6f  leObj(sqlite3_co
c440: 6c 75 6d 6e 5f 64 6f 75 62 6c 65 28 70 53 74 6d  lumn_double(pStm
c450: 74 2c 20 69 43 6f 6c 29 29 3b 0a 20 20 20 20 7d  t, iCol));.    }
c460: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
c470: 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 72  _NULL: {.      r
c480: 65 74 75 72 6e 20 64 62 54 65 78 74 54 6f 4f 62  eturn dbTextToOb
c490: 6a 28 70 2d 3e 70 44 62 2d 3e 7a 4e 75 6c 6c 29  j(p->pDb->zNull)
c4a0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
c4b0: 65 74 75 72 6e 20 64 62 54 65 78 74 54 6f 4f 62  eturn dbTextToOb
c4c0: 6a 28 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  j((char *)sqlite
c4d0: 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53  3_column_text(pS
c4e0: 74 6d 74 2c 20 69 43 6f 6c 29 29 3b 0a 7d 0a 0a  tmt, iCol));.}..
c4f0: 2f 2a 0a 2a 2a 20 49 66 20 75 73 69 6e 67 20 54  /*.** If using T
c500: 63 6c 20 76 65 72 73 69 6f 6e 20 38 2e 36 20 6f  cl version 8.6 o
c510: 72 20 67 72 65 61 74 65 72 2c 20 75 73 65 20 74  r greater, use t
c520: 68 65 20 4e 52 20 66 75 6e 63 74 69 6f 6e 73 20  he NR functions 
c530: 74 6f 20 61 76 6f 69 64 0a 2a 2a 20 72 65 63 75  to avoid.** recu
c540: 72 73 69 76 65 20 65 76 61 6c 75 74 69 6f 6e 20  rsive evalution 
c550: 6f 66 20 73 63 72 69 70 74 73 20 62 79 20 74 68  of scripts by th
c560: 65 20 5b 64 62 20 65 76 61 6c 5d 20 61 6e 64 20  e [db eval] and 
c570: 5b 64 62 20 74 72 61 6e 73 5d 0a 2a 2a 20 63 6f  [db trans].** co
c580: 6d 6d 61 6e 64 73 2e 20 45 76 65 6e 20 69 66 20  mmands. Even if 
c590: 74 68 65 20 68 65 61 64 65 72 73 20 75 73 65 64  the headers used
c5a0: 20 77 68 69 6c 65 20 63 6f 6d 70 69 6c 69 6e 67   while compiling
c5b0: 20 74 68 65 20 65 78 74 65 6e 73 69 6f 6e 0a 2a   the extension.*
c5c0: 2a 20 61 72 65 20 38 2e 36 20 6f 72 20 6e 65 77  * are 8.6 or new
c5d0: 65 72 2c 20 74 68 65 20 63 6f 64 65 20 73 74 69  er, the code sti
c5e0: 6c 6c 20 74 65 73 74 73 20 74 68 65 20 54 63 6c  ll tests the Tcl
c5f0: 20 76 65 72 73 69 6f 6e 20 61 74 20 72 75 6e 74   version at runt
c600: 69 6d 65 2e 0a 2a 2a 20 54 68 69 73 20 61 6c 6c  ime..** This all
c610: 6f 77 73 20 73 74 75 62 73 2d 65 6e 61 62 6c 65  ows stubs-enable
c620: 64 20 62 75 69 6c 64 73 20 74 6f 20 62 65 20 75  d builds to be u
c630: 73 65 64 20 77 69 74 68 20 6f 6c 64 65 72 20 54  sed with older T
c640: 63 6c 20 6c 69 62 72 61 72 69 65 73 2e 0a 2a 2f  cl libraries..*/
c650: 0a 23 69 66 20 54 43 4c 5f 4d 41 4a 4f 52 5f 56  .#if TCL_MAJOR_V
c660: 45 52 53 49 4f 4e 3e 38 20 7c 7c 20 28 54 43 4c  ERSION>8 || (TCL
c670: 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f 4e 3d 3d  _MAJOR_VERSION==
c680: 38 20 26 26 20 54 43 4c 5f 4d 49 4e 4f 52 5f 56  8 && TCL_MINOR_V
c690: 45 52 53 49 4f 4e 3e 3d 36 29 0a 23 20 64 65 66  ERSION>=6).# def
c6a0: 69 6e 65 20 53 51 4c 49 54 45 5f 54 43 4c 5f 4e  ine SQLITE_TCL_N
c6b0: 52 45 20 31 0a 73 74 61 74 69 63 20 69 6e 74 20  RE 1.static int 
c6c0: 44 62 55 73 65 4e 72 65 28 76 6f 69 64 29 7b 0a  DbUseNre(void){.
c6d0: 20 20 69 6e 74 20 6d 61 6a 6f 72 2c 20 6d 69 6e    int major, min
c6e0: 6f 72 3b 0a 20 20 54 63 6c 5f 47 65 74 56 65 72  or;.  Tcl_GetVer
c6f0: 73 69 6f 6e 28 26 6d 61 6a 6f 72 2c 20 26 6d 69  sion(&major, &mi
c700: 6e 6f 72 2c 20 30 2c 20 30 29 3b 0a 20 20 72 65  nor, 0, 0);.  re
c710: 74 75 72 6e 28 20 28 6d 61 6a 6f 72 3d 3d 38 20  turn( (major==8 
c720: 26 26 20 6d 69 6e 6f 72 3e 3d 36 29 20 7c 7c 20  && minor>=6) || 
c730: 6d 61 6a 6f 72 3e 38 20 29 3b 0a 7d 0a 23 65 6c  major>8 );.}.#el
c740: 73 65 0a 2f 2a 20 0a 2a 2a 20 43 6f 6d 70 69 6c  se./* .** Compil
c750: 69 6e 67 20 75 73 69 6e 67 20 68 65 61 64 65 72  ing using header
c760: 73 20 65 61 72 6c 69 65 72 20 74 68 61 6e 20 38  s earlier than 8
c770: 2e 36 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  .6. In this case
c780: 20 4e 52 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a   NR cannot be.**
c790: 20 75 73 65 64 2c 20 73 6f 20 44 62 55 73 65 4e   used, so DbUseN
c7a0: 72 65 28 29 20 74 6f 20 61 6c 77 61 79 73 20 72  re() to always r
c7b0: 65 74 75 72 6e 20 7a 65 72 6f 2e 20 41 64 64 20  eturn zero. Add 
c7c0: 23 64 65 66 69 6e 65 73 20 66 6f 72 20 74 68 65  #defines for the
c7d0: 20 6f 74 68 65 72 0a 2a 2a 20 54 63 6c 5f 4e 52   other.** Tcl_NR
c7e0: 78 78 78 28 29 20 66 75 6e 63 74 69 6f 6e 73 20  xxx() functions 
c7f0: 74 6f 20 70 72 65 76 65 6e 74 20 74 68 65 6d 20  to prevent them 
c800: 66 72 6f 6d 20 63 61 75 73 69 6e 67 20 63 6f 6d  from causing com
c810: 70 69 6c 61 74 69 6f 6e 20 65 72 72 6f 72 73 2c  pilation errors,
c820: 0a 2a 2a 20 65 76 65 6e 20 74 68 6f 75 67 68 20  .** even though 
c830: 74 68 65 20 6f 6e 6c 79 20 69 6e 76 6f 63 61 74  the only invocat
c840: 69 6f 6e 73 20 6f 66 20 74 68 65 6d 20 61 72 65  ions of them are
c850: 20 77 69 74 68 69 6e 20 63 6f 6e 64 69 74 69 6f   within conditio
c860: 6e 61 6c 20 62 6c 6f 63 6b 73 20 0a 2a 2a 20 6f  nal blocks .** o
c870: 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a  f the form:.**.*
c880: 2a 20 20 20 69 66 28 20 44 62 55 73 65 4e 72 65  *   if( DbUseNre
c890: 28 29 20 29 20 7b 20 2e 2e 2e 20 7d 0a 2a 2f 0a  () ) { ... }.*/.
c8a0: 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f  # define SQLITE_
c8b0: 54 43 4c 5f 4e 52 45 20 30 0a 23 20 64 65 66 69  TCL_NRE 0.# defi
c8c0: 6e 65 20 44 62 55 73 65 4e 72 65 28 29 20 30 0a  ne DbUseNre() 0.
c8d0: 23 20 64 65 66 69 6e 65 20 54 63 6c 5f 4e 52 41  # define Tcl_NRA
c8e0: 64 64 43 61 6c 6c 62 61 63 6b 28 61 2c 62 2c 63  ddCallback(a,b,c
c8f0: 2c 64 2c 65 2c 66 29 20 30 0a 23 20 64 65 66 69  ,d,e,f) 0.# defi
c900: 6e 65 20 54 63 6c 5f 4e 52 45 76 61 6c 4f 62 6a  ne Tcl_NREvalObj
c910: 28 61 2c 62 2c 63 29 20 30 0a 23 20 64 65 66 69  (a,b,c) 0.# defi
c920: 6e 65 20 54 63 6c 5f 4e 52 43 72 65 61 74 65 43  ne Tcl_NRCreateC
c930: 6f 6d 6d 61 6e 64 28 61 2c 62 2c 63 2c 64 2c 65  ommand(a,b,c,d,e
c940: 2c 66 29 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ,f) 0.#endif../*
c950: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
c960: 6e 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65  n is part of the
c970: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
c980: 6f 66 20 74 68 65 20 63 6f 6d 6d 61 6e 64 3a 0a  of the command:.
c990: 2a 2a 0a 2a 2a 20 20 20 24 64 62 20 65 76 61 6c  **.**   $db eval
c9a0: 20 53 51 4c 20 3f 41 52 52 41 59 4e 41 4d 45 3f   SQL ?ARRAYNAME?
c9b0: 20 53 43 52 49 50 54 0a 2a 2f 0a 73 74 61 74 69   SCRIPT.*/.stati
c9c0: 63 20 69 6e 74 20 44 62 45 76 61 6c 4e 65 78 74  c int DbEvalNext
c9d0: 43 6d 64 28 0a 20 20 43 6c 69 65 6e 74 44 61 74  Cmd(.  ClientDat
c9e0: 61 20 64 61 74 61 5b 5d 2c 20 20 20 20 20 20 20  a data[],       
c9f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64              /* d
ca00: 61 74 61 5b 30 5d 20 69 73 20 74 68 65 20 28 44  ata[0] is the (D
ca10: 62 45 76 61 6c 43 6f 6e 74 65 78 74 2a 29 20 2a  bEvalContext*) *
ca20: 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  /.  Tcl_Interp *
ca30: 69 6e 74 65 72 70 2c 20 20 20 20 20 20 20 20 20  interp,         
ca40: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 63 6c 20           /* Tcl 
ca50: 69 6e 74 65 72 70 72 65 74 65 72 20 2a 2f 0a 20  interpreter */. 
ca60: 20 69 6e 74 20 72 65 73 75 6c 74 20 20 20 20 20   int result     
ca70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca80: 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
ca90: 73 6f 20 66 61 72 20 2a 2f 0a 29 7b 0a 20 20 69  so far */.){.  i
caa0: 6e 74 20 72 63 20 3d 20 72 65 73 75 6c 74 3b 20  nt rc = result; 
cab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cac0: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
cad0: 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20  de */..  /* The 
cae0: 66 69 72 73 74 20 65 6c 65 6d 65 6e 74 20 6f 66  first element of
caf0: 20 74 68 65 20 64 61 74 61 5b 5d 20 61 72 72 61   the data[] arra
cb00: 79 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  y is a pointer t
cb10: 6f 20 61 20 44 62 45 76 61 6c 43 6f 6e 74 65 78  o a DbEvalContex
cb20: 74 0a 20 20 2a 2a 20 73 74 72 75 63 74 75 72 65  t.  ** structure
cb30: 20 61 6c 6c 6f 63 61 74 65 64 20 75 73 69 6e 67   allocated using
cb40: 20 54 63 6c 5f 41 6c 6c 6f 63 28 29 2e 20 54 68   Tcl_Alloc(). Th
cb50: 65 20 73 65 63 6f 6e 64 20 65 6c 65 6d 65 6e 74  e second element
cb60: 20 6f 66 20 64 61 74 61 5b 5d 0a 20 20 2a 2a 20   of data[].  ** 
cb70: 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
cb80: 61 20 54 63 6c 5f 4f 62 6a 20 63 6f 6e 74 61 69  a Tcl_Obj contai
cb90: 6e 69 6e 67 20 74 68 65 20 73 63 72 69 70 74 20  ning the script 
cba0: 74 6f 20 72 75 6e 20 66 6f 72 20 65 61 63 68 20  to run for each 
cbb0: 72 6f 77 0a 20 20 2a 2a 20 72 65 74 75 72 6e 65  row.  ** returne
cbc0: 64 20 62 79 20 74 68 65 20 71 75 65 72 69 65 73  d by the queries
cbd0: 20 65 6e 63 61 70 73 75 6c 61 74 65 64 20 69 6e   encapsulated in
cbe0: 20 64 61 74 61 5b 30 5d 2e 20 2a 2f 0a 20 20 44   data[0]. */.  D
cbf0: 62 45 76 61 6c 43 6f 6e 74 65 78 74 20 2a 70 20  bEvalContext *p 
cc00: 3d 20 28 44 62 45 76 61 6c 43 6f 6e 74 65 78 74  = (DbEvalContext
cc10: 20 2a 29 64 61 74 61 5b 30 5d 3b 0a 20 20 54 63   *)data[0];.  Tc
cc20: 6c 5f 4f 62 6a 20 2a 70 53 63 72 69 70 74 20 3d  l_Obj *pScript =
cc30: 20 28 54 63 6c 5f 4f 62 6a 20 2a 29 64 61 74 61   (Tcl_Obj *)data
cc40: 5b 31 5d 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  [1];.  Tcl_Obj *
cc50: 70 41 72 72 61 79 20 3d 20 70 2d 3e 70 41 72 72  pArray = p->pArr
cc60: 61 79 3b 0a 0a 20 20 77 68 69 6c 65 28 20 28 72  ay;..  while( (r
cc70: 63 3d 3d 54 43 4c 5f 4f 4b 20 7c 7c 20 72 63 3d  c==TCL_OK || rc=
cc80: 3d 54 43 4c 5f 43 4f 4e 54 49 4e 55 45 29 20 26  =TCL_CONTINUE) &
cc90: 26 20 54 43 4c 5f 4f 4b 3d 3d 28 72 63 20 3d 20  & TCL_OK==(rc = 
cca0: 64 62 45 76 61 6c 53 74 65 70 28 70 29 29 20 29  dbEvalStep(p)) )
ccb0: 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
ccc0: 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 20 20 54   int nCol;.    T
ccd0: 63 6c 5f 4f 62 6a 20 2a 2a 61 70 43 6f 6c 4e 61  cl_Obj **apColNa
cce0: 6d 65 3b 0a 20 20 20 20 64 62 45 76 61 6c 52 6f  me;.    dbEvalRo
ccf0: 77 49 6e 66 6f 28 70 2c 20 26 6e 43 6f 6c 2c 20  wInfo(p, &nCol, 
cd00: 26 61 70 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 20  &apColName);.   
cd10: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c   for(i=0; i<nCol
cd20: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 54 63  ; i++){.      Tc
cd30: 6c 5f 4f 62 6a 20 2a 70 56 61 6c 20 3d 20 64 62  l_Obj *pVal = db
cd40: 45 76 61 6c 43 6f 6c 75 6d 6e 56 61 6c 75 65 28  EvalColumnValue(
cd50: 70 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28  p, i);.      if(
cd60: 20 70 41 72 72 61 79 3d 3d 30 20 29 7b 0a 20 20   pArray==0 ){.  
cd70: 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 53 65 74        Tcl_ObjSet
cd80: 56 61 72 32 28 69 6e 74 65 72 70 2c 20 61 70 43  Var2(interp, apC
cd90: 6f 6c 4e 61 6d 65 5b 69 5d 2c 20 30 2c 20 70 56  olName[i], 0, pV
cda0: 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 65  al, 0);.      }e
cdb0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 54 63 6c  lse{.        Tcl
cdc0: 5f 4f 62 6a 53 65 74 56 61 72 32 28 69 6e 74 65  _ObjSetVar2(inte
cdd0: 72 70 2c 20 70 41 72 72 61 79 2c 20 61 70 43 6f  rp, pArray, apCo
cde0: 6c 4e 61 6d 65 5b 69 5d 2c 20 70 56 61 6c 2c 20  lName[i], pVal, 
cdf0: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
ce00: 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65  }..    /* The re
ce10: 71 75 69 72 65 64 20 69 6e 74 65 72 70 72 65 74  quired interpret
ce20: 65 72 20 76 61 72 69 61 62 6c 65 73 20 61 72 65  er variables are
ce30: 20 6e 6f 77 20 70 6f 70 75 6c 61 74 65 64 20 77   now populated w
ce40: 69 74 68 20 74 68 65 20 64 61 74 61 20 0a 20 20  ith the data .  
ce50: 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 63 75    ** from the cu
ce60: 72 72 65 6e 74 20 72 6f 77 2e 20 49 66 20 75 73  rrent row. If us
ce70: 69 6e 67 20 4e 52 45 2c 20 73 63 68 65 64 75 6c  ing NRE, schedul
ce80: 65 20 63 61 6c 6c 62 61 63 6b 73 20 74 6f 20 65  e callbacks to e
ce90: 76 61 6c 75 61 74 65 0a 20 20 20 20 2a 2a 20 73  valuate.    ** s
cea0: 63 72 69 70 74 20 70 53 63 72 69 70 74 2c 20 74  cript pScript, t
ceb0: 68 65 6e 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68  hen to invoke th
cec0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 67 61 69  is function agai
ced0: 6e 20 74 6f 20 66 65 74 63 68 20 74 68 65 20 6e  n to fetch the n
cee0: 65 78 74 0a 20 20 20 20 2a 2a 20 72 6f 77 20 28  ext.    ** row (
cef0: 6f 72 20 63 6c 65 61 6e 20 75 70 20 69 66 20 74  or clean up if t
cf00: 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 78 74 20  here is no next 
cf10: 72 6f 77 20 6f 72 20 74 68 65 20 73 63 72 69 70  row or the scrip
cf20: 74 20 74 68 72 6f 77 73 20 61 6e 0a 20 20 20 20  t throws an.    
cf30: 2a 2a 20 65 78 63 65 70 74 69 6f 6e 29 2e 20 41  ** exception). A
cf40: 66 74 65 72 20 73 63 68 65 64 75 6c 69 6e 67 20  fter scheduling 
cf50: 74 68 65 20 63 61 6c 6c 62 61 63 6b 73 2c 20 72  the callbacks, r
cf60: 65 74 75 72 6e 20 63 6f 6e 74 72 6f 6c 20 74 6f  eturn control to
cf70: 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 63 61 6c   the .    ** cal
cf80: 6c 65 72 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ler..    **.    
cf90: 2a 2a 20 49 66 20 6e 6f 74 20 75 73 69 6e 67 20  ** If not using 
cfa0: 4e 52 45 2c 20 65 76 61 6c 75 61 74 65 20 70 53  NRE, evaluate pS
cfb0: 63 72 69 70 74 20 64 69 72 65 63 74 6c 79 20 61  cript directly a
cfc0: 6e 64 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68  nd continue with
cfd0: 20 74 68 65 0a 20 20 20 20 2a 2a 20 6e 65 78 74   the.    ** next
cfe0: 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68   iteration of th
cff0: 69 73 20 77 68 69 6c 65 28 2e 2e 2e 29 20 6c 6f  is while(...) lo
d000: 6f 70 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  op.  */.    if( 
d010: 44 62 55 73 65 4e 72 65 28 29 20 29 7b 0a 20 20  DbUseNre() ){.  
d020: 20 20 20 20 54 63 6c 5f 4e 52 41 64 64 43 61 6c      Tcl_NRAddCal
d030: 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 44 62  lback(interp, Db
d040: 45 76 61 6c 4e 65 78 74 43 6d 64 2c 20 28 76 6f  EvalNextCmd, (vo
d050: 69 64 2a 29 70 2c 20 28 76 6f 69 64 2a 29 70 53  id*)p, (void*)pS
d060: 63 72 69 70 74 2c 20 30 2c 20 30 29 3b 0a 20 20  cript, 0, 0);.  
d070: 20 20 20 20 72 65 74 75 72 6e 20 54 63 6c 5f 4e      return Tcl_N
d080: 52 45 76 61 6c 4f 62 6a 28 69 6e 74 65 72 70 2c  REvalObj(interp,
d090: 20 70 53 63 72 69 70 74 2c 20 30 29 3b 0a 20 20   pScript, 0);.  
d0a0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
d0b0: 63 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45  c = Tcl_EvalObjE
d0c0: 78 28 69 6e 74 65 72 70 2c 20 70 53 63 72 69 70  x(interp, pScrip
d0d0: 74 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  t, 0);.    }.  }
d0e0: 0a 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43  ..  Tcl_DecrRefC
d0f0: 6f 75 6e 74 28 70 53 63 72 69 70 74 29 3b 0a 20  ount(pScript);. 
d100: 20 64 62 45 76 61 6c 46 69 6e 61 6c 69 7a 65 28   dbEvalFinalize(
d110: 70 29 3b 0a 20 20 54 63 6c 5f 46 72 65 65 28 28  p);.  Tcl_Free((
d120: 63 68 61 72 20 2a 29 70 29 3b 0a 0a 20 20 69 66  char *)p);..  if
d130: 28 20 72 63 3d 3d 54 43 4c 5f 4f 4b 20 7c 7c 20  ( rc==TCL_OK || 
d140: 72 63 3d 3d 54 43 4c 5f 42 52 45 41 4b 20 29 7b  rc==TCL_BREAK ){
d150: 0a 20 20 20 20 54 63 6c 5f 52 65 73 65 74 52 65  .    Tcl_ResetRe
d160: 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  sult(interp);.  
d170: 20 20 72 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20    rc = TCL_OK;. 
d180: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
d190: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
d1a0: 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 62  nction is used b
d1b0: 79 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  y the implementa
d1c0: 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 66 6f 6c  tions of the fol
d1d0: 6c 6f 77 69 6e 67 20 64 61 74 61 62 61 73 65 20  lowing database 
d1e0: 0a 2a 2a 20 68 61 6e 64 6c 65 20 73 75 62 2d 63  .** handle sub-c
d1f0: 6f 6d 6d 61 6e 64 73 3a 0a 2a 2a 0a 2a 2a 20 20  ommands:.**.**  
d200: 20 24 64 62 20 75 70 64 61 74 65 5f 68 6f 6f 6b   $db update_hook
d210: 20 3f 53 43 52 49 50 54 3f 0a 2a 2a 20 20 20 24   ?SCRIPT?.**   $
d220: 64 62 20 77 61 6c 5f 68 6f 6f 6b 20 3f 53 43 52  db wal_hook ?SCR
d230: 49 50 54 3f 0a 2a 2a 20 20 20 24 64 62 20 63 6f  IPT?.**   $db co
d240: 6d 6d 69 74 5f 68 6f 6f 6b 20 3f 53 43 52 49 50  mmit_hook ?SCRIP
d250: 54 3f 0a 2a 2a 20 20 20 24 64 62 20 70 72 65 75  T?.**   $db preu
d260: 70 64 61 74 65 20 68 6f 6f 6b 20 3f 53 43 52 49  pdate hook ?SCRI
d270: 50 54 3f 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  PT?.*/.static vo
d280: 69 64 20 44 62 48 6f 6f 6b 43 6d 64 28 0a 20 20  id DbHookCmd(.  
d290: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
d2a0: 72 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  rp,             
d2b0: 2f 2a 20 54 63 6c 20 69 6e 74 65 72 70 72 65 74  /* Tcl interpret
d2c0: 65 72 20 2a 2f 0a 20 20 53 71 6c 69 74 65 44 62  er */.  SqliteDb
d2d0: 20 2a 70 44 62 2c 20 20 20 20 20 20 20 20 20 20   *pDb,          
d2e0: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
d2f0: 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ase handle */.  
d300: 54 63 6c 5f 4f 62 6a 20 2a 70 41 72 67 2c 20 20  Tcl_Obj *pArg,  
d310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d320: 2f 2a 20 53 43 52 49 50 54 20 61 72 67 75 6d 65  /* SCRIPT argume
d330: 6e 74 20 28 6f 72 20 4e 55 4c 4c 29 20 2a 2f 0a  nt (or NULL) */.
d340: 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 70 70 48 6f    Tcl_Obj **ppHo
d350: 6f 6b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ok              
d360: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
d370: 6d 65 6d 62 65 72 20 6f 66 20 53 71 6c 69 74 65  member of Sqlite
d380: 44 62 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  Db */.){.  sqlit
d390: 65 33 20 2a 64 62 20 3d 20 70 44 62 2d 3e 64 62  e3 *db = pDb->db
d3a0: 3b 0a 0a 20 20 69 66 28 20 2a 70 70 48 6f 6f 6b  ;..  if( *ppHook
d3b0: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f   ){.    Tcl_SetO
d3c0: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
d3d0: 20 2a 70 70 48 6f 6f 6b 29 3b 0a 20 20 20 20 69   *ppHook);.    i
d3e0: 66 28 20 70 41 72 67 20 29 7b 0a 20 20 20 20 20  f( pArg ){.     
d3f0: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
d400: 74 28 2a 70 70 48 6f 6f 6b 29 3b 0a 20 20 20 20  t(*ppHook);.    
d410: 20 20 2a 70 70 48 6f 6f 6b 20 3d 20 30 3b 0a 20    *ppHook = 0;. 
d420: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
d430: 41 72 67 20 29 7b 0a 20 20 20 20 61 73 73 65 72  Arg ){.    asser
d440: 74 28 20 21 28 2a 70 70 48 6f 6f 6b 29 20 29 3b  t( !(*ppHook) );
d450: 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74  .    if( Tcl_Get
d460: 43 68 61 72 4c 65 6e 67 74 68 28 70 41 72 67 29  CharLength(pArg)
d470: 3e 30 20 29 7b 0a 20 20 20 20 20 20 2a 70 70 48  >0 ){.      *ppH
d480: 6f 6f 6b 20 3d 20 70 41 72 67 3b 0a 20 20 20 20  ook = pArg;.    
d490: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
d4a0: 6e 74 28 2a 70 70 48 6f 6f 6b 29 3b 0a 20 20 20  nt(*ppHook);.   
d4b0: 20 7d 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53   }.  }..#ifdef S
d4c0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52 45  QLITE_ENABLE_PRE
d4d0: 55 50 44 41 54 45 5f 48 4f 4f 4b 0a 20 20 73 71  UPDATE_HOOK.  sq
d4e0: 6c 69 74 65 33 5f 70 72 65 75 70 64 61 74 65 5f  lite3_preupdate_
d4f0: 68 6f 6f 6b 28 64 62 2c 20 28 70 44 62 2d 3e 70  hook(db, (pDb->p
d500: 50 72 65 55 70 64 61 74 65 48 6f 6f 6b 3f 44 62  PreUpdateHook?Db
d510: 50 72 65 55 70 64 61 74 65 48 61 6e 64 6c 65 72  PreUpdateHandler
d520: 3a 30 29 2c 20 70 44 62 29 3b 0a 23 65 6e 64 69  :0), pDb);.#endi
d530: 66 0a 20 20 73 71 6c 69 74 65 33 5f 75 70 64 61  f.  sqlite3_upda
d540: 74 65 5f 68 6f 6f 6b 28 64 62 2c 20 28 70 44 62  te_hook(db, (pDb
d550: 2d 3e 70 55 70 64 61 74 65 48 6f 6f 6b 3f 44 62  ->pUpdateHook?Db
d560: 55 70 64 61 74 65 48 61 6e 64 6c 65 72 3a 30 29  UpdateHandler:0)
d570: 2c 20 70 44 62 29 3b 0a 20 20 73 71 6c 69 74 65  , pDb);.  sqlite
d580: 33 5f 72 6f 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 28  3_rollback_hook(
d590: 64 62 2c 20 28 70 44 62 2d 3e 70 52 6f 6c 6c 62  db, (pDb->pRollb
d5a0: 61 63 6b 48 6f 6f 6b 3f 44 62 52 6f 6c 6c 62 61  ackHook?DbRollba
d5b0: 63 6b 48 61 6e 64 6c 65 72 3a 30 29 2c 20 70 44  ckHandler:0), pD
d5c0: 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 77 61  b);.  sqlite3_wa
d5d0: 6c 5f 68 6f 6f 6b 28 64 62 2c 20 28 70 44 62 2d  l_hook(db, (pDb-
d5e0: 3e 70 57 61 6c 48 6f 6f 6b 3f 44 62 57 61 6c 48  >pWalHook?DbWalH
d5f0: 61 6e 64 6c 65 72 3a 30 29 2c 20 70 44 62 29 3b  andler:0), pDb);
d600: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 22 73  .}../*.** The "s
d610: 71 6c 69 74 65 22 20 63 6f 6d 6d 61 6e 64 20 62  qlite" command b
d620: 65 6c 6f 77 20 63 72 65 61 74 65 73 20 61 20 6e  elow creates a n
d630: 65 77 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 20 66  ew Tcl command f
d640: 6f 72 20 65 61 63 68 0a 2a 2a 20 63 6f 6e 6e 65  or each.** conne
d650: 63 74 69 6f 6e 20 69 74 20 6f 70 65 6e 73 20 74  ction it opens t
d660: 6f 20 61 6e 20 53 51 4c 69 74 65 20 64 61 74 61  o an SQLite data
d670: 62 61 73 65 2e 20 20 54 68 69 73 20 72 6f 75 74  base.  This rout
d680: 69 6e 65 20 69 73 20 69 6e 76 6f 6b 65 64 0a 2a  ine is invoked.*
d690: 2a 20 77 68 65 6e 65 76 65 72 20 6f 6e 65 20 6f  * whenever one o
d6a0: 66 20 74 68 6f 73 65 20 63 6f 6e 6e 65 63 74 69  f those connecti
d6b0: 6f 6e 2d 73 70 65 63 69 66 69 63 20 63 6f 6d 6d  on-specific comm
d6c0: 61 6e 64 73 20 69 73 20 65 78 65 63 75 74 65 64  ands is executed
d6d0: 0a 2a 2a 20 69 6e 20 54 63 6c 2e 20 20 46 6f 72  .** in Tcl.  For
d6e0: 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 79 6f 75   example, if you
d6f0: 20 72 75 6e 20 54 63 6c 20 63 6f 64 65 20 6c 69   run Tcl code li
d700: 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  ke this:.**.**  
d710: 20 20 20 20 20 73 71 6c 69 74 65 33 20 64 62 31       sqlite3 db1
d720: 20 20 22 6d 79 5f 64 61 74 61 62 61 73 65 22 0a    "my_database".
d730: 2a 2a 20 20 20 20 20 20 20 64 62 31 20 63 6c 6f  **       db1 clo
d740: 73 65 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72  se.**.** The fir
d750: 73 74 20 63 6f 6d 6d 61 6e 64 20 6f 70 65 6e 73  st command opens
d760: 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f   a connection to
d770: 20 74 68 65 20 22 6d 79 5f 64 61 74 61 62 61 73   the "my_databas
d780: 65 22 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 61  e" database.** a
d790: 6e 64 20 63 61 6c 6c 73 20 74 68 61 74 20 63 6f  nd calls that co
d7a0: 6e 6e 65 63 74 69 6f 6e 20 22 64 62 31 22 2e 20  nnection "db1". 
d7b0: 20 54 68 65 20 73 65 63 6f 6e 64 20 63 6f 6d 6d   The second comm
d7c0: 61 6e 64 20 63 61 75 73 65 73 20 74 68 69 73 0a  and causes this.
d7d0: 2a 2a 20 73 75 62 72 6f 75 74 69 6e 65 20 74 6f  ** subroutine to
d7e0: 20 62 65 20 69 6e 76 6f 6b 65 64 2e 0a 2a 2f 0a   be invoked..*/.
d7f0: 73 74 61 74 69 63 20 69 6e 74 20 44 62 4f 62 6a  static int DbObj
d800: 43 6d 64 28 76 6f 69 64 20 2a 63 64 2c 20 54 63  Cmd(void *cd, Tc
d810: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
d820: 2c 20 69 6e 74 20 6f 62 6a 63 2c 54 63 6c 5f 4f  , int objc,Tcl_O
d830: 62 6a 20 2a 63 6f 6e 73 74 2a 6f 62 6a 76 29 7b  bj *const*objv){
d840: 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62  .  SqliteDb *pDb
d850: 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 63 64   = (SqliteDb*)cd
d860: 3b 0a 20 20 69 6e 74 20 63 68 6f 69 63 65 3b 0a  ;.  int choice;.
d870: 20 20 69 6e 74 20 72 63 20 3d 20 54 43 4c 5f 4f    int rc = TCL_O
d880: 4b 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  K;.  static cons
d890: 74 20 63 68 61 72 20 2a 44 42 5f 73 74 72 73 5b  t char *DB_strs[
d8a0: 5d 20 3d 20 7b 0a 20 20 20 20 22 61 75 74 68 6f  ] = {.    "autho
d8b0: 72 69 7a 65 72 22 2c 20 20 20 20 20 20 20 20 20  rizer",         
d8c0: 22 62 61 63 6b 75 70 22 2c 20 20 20 20 20 20 20  "backup",       
d8d0: 20 20 20 20 20 22 62 75 73 79 22 2c 0a 20 20 20       "busy",.   
d8e0: 20 22 63 61 63 68 65 22 2c 20 20 20 20 20 20 20   "cache",       
d8f0: 20 20 20 20 20 20 20 22 63 68 61 6e 67 65 73 22         "changes"
d900: 2c 20 20 20 20 20 20 20 20 20 20 20 22 63 6c 6f  ,           "clo
d910: 73 65 22 2c 0a 20 20 20 20 22 63 6f 6c 6c 61 74  se",.    "collat
d920: 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 22  e",            "
d930: 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64  collation_needed
d940: 22 2c 20 20 22 63 6f 6d 6d 69 74 5f 68 6f 6f 6b  ",  "commit_hook
d950: 22 2c 0a 20 20 20 20 22 63 6f 6d 70 6c 65 74 65  ",.    "complete
d960: 22 2c 20 20 20 20 20 20 20 20 20 20 20 22 63 6f  ",           "co
d970: 70 79 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  py",            
d980: 20 20 22 65 6e 61 62 6c 65 5f 6c 6f 61 64 5f 65    "enable_load_e
d990: 78 74 65 6e 73 69 6f 6e 22 2c 0a 20 20 20 20 22  xtension",.    "
d9a0: 65 72 72 6f 72 63 6f 64 65 22 2c 20 20 20 20 20  errorcode",     
d9b0: 20 20 20 20 20 22 65 76 61 6c 22 2c 20 20 20 20       "eval",    
d9c0: 20 20 20 20 20 20 20 20 20 20 22 65 78 69 73 74            "exist
d9d0: 73 22 2c 0a 20 20 20 20 22 66 75 6e 63 74 69 6f  s",.    "functio
d9e0: 6e 22 2c 20 20 20 20 20 20 20 20 20 20 20 22 69  n",           "i
d9f0: 6e 63 72 62 6c 6f 62 22 2c 20 20 20 20 20 20 20  ncrblob",       
da00: 20 20 20 22 69 6e 74 65 72 72 75 70 74 22 2c 0a     "interrupt",.
da10: 20 20 20 20 22 6c 61 73 74 5f 69 6e 73 65 72 74      "last_insert
da20: 5f 72 6f 77 69 64 22 2c 20 20 22 6e 75 6c 6c 76  _rowid",  "nullv
da30: 61 6c 75 65 22 2c 20 20 20 20 20 20 20 20 20 22  alue",         "
da40: 6f 6e 65 63 6f 6c 75 6d 6e 22 2c 0a 20 20 20 20  onecolumn",.    
da50: 22 70 72 65 75 70 64 61 74 65 22 2c 20 20 20 20  "preupdate",    
da60: 20 20 20 20 20 20 22 70 72 6f 66 69 6c 65 22 2c        "profile",
da70: 20 20 20 20 20 20 20 20 20 20 20 22 70 72 6f 67             "prog
da80: 72 65 73 73 22 2c 0a 20 20 20 20 22 72 65 6b 65  ress",.    "reke
da90: 79 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  y",             
daa0: 20 22 72 65 73 74 6f 72 65 22 2c 20 20 20 20 20   "restore",     
dab0: 20 20 20 20 20 20 22 72 6f 6c 6c 62 61 63 6b 5f        "rollback_
dac0: 68 6f 6f 6b 22 2c 0a 20 20 20 20 22 73 74 61 74  hook",.    "stat
dad0: 75 73 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  us",            
dae0: 20 22 74 69 6d 65 6f 75 74 22 2c 20 20 20 20 20   "timeout",     
daf0: 20 20 20 20 20 20 22 74 6f 74 61 6c 5f 63 68 61        "total_cha
db00: 6e 67 65 73 22 2c 0a 20 20 20 20 22 74 72 61 63  nges",.    "trac
db10: 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  e",             
db20: 20 22 74 72 61 6e 73 61 63 74 69 6f 6e 22 2c 20   "transaction", 
db30: 20 20 20 20 20 20 22 75 6e 6c 6f 63 6b 5f 6e 6f        "unlock_no
db40: 74 69 66 79 22 2c 0a 20 20 20 20 22 75 70 64 61  tify",.    "upda
db50: 74 65 5f 68 6f 6f 6b 22 2c 20 20 20 20 20 20 20  te_hook",       
db60: 20 22 76 65 72 73 69 6f 6e 22 2c 20 20 20 20 20   "version",     
db70: 20 20 20 20 20 20 22 77 61 6c 5f 68 6f 6f 6b 22        "wal_hook"
db80: 2c 0a 20 20 20 20 30 20 20 20 20 20 20 20 20 20  ,.    0         
db90: 20 20 20 20 20 20 20 20 20 20 20 0a 20 20 7d 3b             .  };
dba0: 0a 20 20 65 6e 75 6d 20 44 42 5f 65 6e 75 6d 20  .  enum DB_enum 
dbb0: 7b 0a 20 20 20 20 44 42 5f 41 55 54 48 4f 52 49  {.    DB_AUTHORI
dbc0: 5a 45 52 2c 20 20 20 20 20 20 20 20 44 42 5f 42  ZER,        DB_B
dbd0: 41 43 4b 55 50 2c 20 20 20 20 20 20 20 20 20 20  ACKUP,          
dbe0: 20 44 42 5f 42 55 53 59 2c 0a 20 20 20 20 44 42   DB_BUSY,.    DB
dbf0: 5f 43 41 43 48 45 2c 20 20 20 20 20 20 20 20 20  _CACHE,         
dc00: 20 20 20 20 44 42 5f 43 48 41 4e 47 45 53 2c 20      DB_CHANGES, 
dc10: 20 20 20 20 20 20 20 20 20 44 42 5f 43 4c 4f 53           DB_CLOS
dc20: 45 2c 0a 20 20 20 20 44 42 5f 43 4f 4c 4c 41 54  E,.    DB_COLLAT
dc30: 45 2c 20 20 20 20 20 20 20 20 20 20 20 44 42 5f  E,           DB_
dc40: 43 4f 4c 4c 41 54 49 4f 4e 5f 4e 45 45 44 45 44  COLLATION_NEEDED
dc50: 2c 20 44 42 5f 43 4f 4d 4d 49 54 5f 48 4f 4f 4b  , DB_COMMIT_HOOK
dc60: 2c 0a 20 20 20 20 44 42 5f 43 4f 4d 50 4c 45 54  ,.    DB_COMPLET
dc70: 45 2c 20 20 20 20 20 20 20 20 20 20 44 42 5f 43  E,          DB_C
dc80: 4f 50 59 2c 20 20 20 20 20 20 20 20 20 20 20 20  OPY,            
dc90: 20 44 42 5f 45 4e 41 42 4c 45 5f 4c 4f 41 44 5f   DB_ENABLE_LOAD_
dca0: 45 58 54 45 4e 53 49 4f 4e 2c 0a 20 20 20 20 44  EXTENSION,.    D
dcb0: 42 5f 45 52 52 4f 52 43 4f 44 45 2c 20 20 20 20  B_ERRORCODE,    
dcc0: 20 20 20 20 20 44 42 5f 45 56 41 4c 2c 20 20 20       DB_EVAL,   
dcd0: 20 20 20 20 20 20 20 20 20 20 44 42 5f 45 58 49            DB_EXI
dce0: 53 54 53 2c 0a 20 20 20 20 44 42 5f 46 55 4e 43  STS,.    DB_FUNC
dcf0: 54 49 4f 4e 2c 20 20 20 20 20 20 20 20 20 20 44  TION,          D
dd00: 42 5f 49 4e 43 52 42 4c 4f 42 2c 20 20 20 20 20  B_INCRBLOB,     
dd10: 20 20 20 20 44 42 5f 49 4e 54 45 52 52 55 50 54      DB_INTERRUPT
dd20: 2c 0a 20 20 20 20 44 42 5f 4c 41 53 54 5f 49 4e  ,.    DB_LAST_IN
dd30: 53 45 52 54 5f 52 4f 57 49 44 2c 20 44 42 5f 4e  SERT_ROWID, DB_N
dd40: 55 4c 4c 56 41 4c 55 45 2c 20 20 20 20 20 20 20  ULLVALUE,       
dd50: 20 44 42 5f 4f 4e 45 43 4f 4c 55 4d 4e 2c 0a 20   DB_ONECOLUMN,. 
dd60: 20 20 20 44 42 5f 50 52 45 55 50 44 41 54 45 2c     DB_PREUPDATE,
dd70: 20 20 20 20 20 20 20 20 20 44 42 5f 50 52 4f 46           DB_PROF
dd80: 49 4c 45 2c 20 20 20 20 20 20 20 20 20 20 44 42  ILE,          DB
dd90: 5f 50 52 4f 47 52 45 53 53 2c 0a 20 20 20 20 44  _PROGRESS,.    D
dda0: 42 5f 52 45 4b 45 59 2c 20 20 20 20 20 20 20 20  B_REKEY,        
ddb0: 20 20 20 20 20 44 42 5f 52 45 53 54 4f 52 45 2c       DB_RESTORE,
ddc0: 20 20 20 20 20 20 20 20 20 20 44 42 5f 52 4f 4c            DB_ROL
ddd0: 4c 42 41 43 4b 5f 48 4f 4f 4b 2c 0a 20 20 20 20  LBACK_HOOK,.    
dde0: 44 42 5f 53 54 41 54 55 53 2c 20 20 20 20 20 20  DB_STATUS,      
ddf0: 20 20 20 20 20 20 44 42 5f 54 49 4d 45 4f 55 54        DB_TIMEOUT
de00: 2c 20 20 20 20 20 20 20 20 20 20 44 42 5f 54 4f  ,          DB_TO
de10: 54 41 4c 5f 43 48 41 4e 47 45 53 2c 0a 20 20 20  TAL_CHANGES,.   
de20: 20 44 42 5f 54 52 41 43 45 2c 20 20 20 20 20 20   DB_TRACE,      
de30: 20 20 20 20 20 20 20 44 42 5f 54 52 41 4e 53 41         DB_TRANSA
de40: 43 54 49 4f 4e 2c 20 20 20 20 20 20 44 42 5f 55  CTION,      DB_U
de50: 4e 4c 4f 43 4b 5f 4e 4f 54 49 46 59 2c 0a 20 20  NLOCK_NOTIFY,.  
de60: 20 20 44 42 5f 55 50 44 41 54 45 5f 48 4f 4f 4b    DB_UPDATE_HOOK
de70: 2c 20 20 20 20 20 20 20 44 42 5f 56 45 52 53 49  ,       DB_VERSI
de80: 4f 4e 2c 20 20 20 20 20 20 20 20 20 20 44 42 5f  ON,          DB_
de90: 57 41 4c 5f 48 4f 4f 4b 2c 0a 20 20 7d 3b 0a 20  WAL_HOOK,.  };. 
dea0: 20 2f 2a 20 64 6f 6e 27 74 20 6c 65 61 76 65 20   /* don't leave 
deb0: 74 72 61 69 6c 69 6e 67 20 63 6f 6d 6d 61 73 20  trailing commas 
dec0: 6f 6e 20 44 42 5f 65 6e 75 6d 2c 20 69 74 20 63  on DB_enum, it c
ded0: 6f 6e 66 75 73 65 73 20 74 68 65 20 41 49 58 20  onfuses the AIX 
dee0: 78 6c 63 20 63 6f 6d 70 69 6c 65 72 20 2a 2f 0a  xlc compiler */.
def0: 0a 20 20 69 66 28 20 6f 62 6a 63 3c 32 20 29 7b  .  if( objc<2 ){
df00: 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  .    Tcl_WrongNu
df10: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
df20: 20 6f 62 6a 76 2c 20 22 53 55 42 43 4f 4d 4d 41   objv, "SUBCOMMA
df30: 4e 44 20 2e 2e 2e 22 29 3b 0a 20 20 20 20 72 65  ND ...");.    re
df40: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
df50: 20 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47 65    }.  if( Tcl_Ge
df60: 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e  tIndexFromObj(in
df70: 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 44  terp, objv[1], D
df80: 42 5f 73 74 72 73 2c 20 22 6f 70 74 69 6f 6e 22  B_strs, "option"
df90: 2c 20 30 2c 20 26 63 68 6f 69 63 65 29 20 29 7b  , 0, &choice) ){
dfa0: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
dfb0: 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 73 77  ERROR;.  }..  sw
dfc0: 69 74 63 68 28 20 28 65 6e 75 6d 20 44 42 5f 65  itch( (enum DB_e
dfd0: 6e 75 6d 29 63 68 6f 69 63 65 20 29 7b 0a 0a 20  num)choice ){.. 
dfe0: 20 2f 2a 20 20 20 20 24 64 62 20 61 75 74 68 6f   /*    $db autho
dff0: 72 69 7a 65 72 20 3f 43 41 4c 4c 42 41 43 4b 3f  rizer ?CALLBACK?
e000: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 76 6f 6b  .  **.  ** Invok
e010: 65 20 74 68 65 20 67 69 76 65 6e 20 63 61 6c 6c  e the given call
e020: 62 61 63 6b 20 74 6f 20 61 75 74 68 6f 72 69 7a  back to authoriz
e030: 65 20 65 61 63 68 20 53 51 4c 20 6f 70 65 72 61  e each SQL opera
e040: 74 69 6f 6e 20 61 73 20 69 74 20 69 73 0a 20 20  tion as it is.  
e050: 2a 2a 20 63 6f 6d 70 69 6c 65 64 2e 20 20 35 20  ** compiled.  5 
e060: 61 72 67 75 6d 65 6e 74 73 20 61 72 65 20 61 70  arguments are ap
e070: 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 63 61  pended to the ca
e080: 6c 6c 62 61 63 6b 20 62 65 66 6f 72 65 20 69 74  llback before it
e090: 20 69 73 0a 20 20 2a 2a 20 69 6e 76 6f 6b 65 64   is.  ** invoked
e0a0: 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 28 31  :.  **.  **   (1
e0b0: 29 20 54 68 65 20 61 75 74 68 6f 72 69 7a 61 74  ) The authorizat
e0c0: 69 6f 6e 20 74 79 70 65 20 28 65 78 3a 20 53 51  ion type (ex: SQ
e0d0: 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 41 42 4c  LITE_CREATE_TABL
e0e0: 45 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54  E, SQLITE_INSERT
e0f0: 2c 20 2e 2e 2e 29 0a 20 20 2a 2a 20 20 20 28 32  , ...).  **   (2
e100: 29 20 46 69 72 73 74 20 64 65 73 63 72 69 70 74  ) First descript
e110: 69 76 65 20 6e 61 6d 65 20 28 64 65 70 65 6e 64  ive name (depend
e120: 73 20 6f 6e 20 61 75 74 68 6f 72 69 7a 61 74 69  s on authorizati
e130: 6f 6e 20 74 79 70 65 29 0a 20 20 2a 2a 20 20 20  on type).  **   
e140: 28 33 29 20 53 65 63 6f 6e 64 20 64 65 73 63 72  (3) Second descr
e150: 69 70 74 69 76 65 20 6e 61 6d 65 0a 20 20 2a 2a  iptive name.  **
e160: 20 20 20 28 34 29 20 4e 61 6d 65 20 6f 66 20 74     (4) Name of t
e170: 68 65 20 64 61 74 61 62 61 73 65 20 28 65 78 3a  he database (ex:
e180: 20 22 6d 61 69 6e 22 2c 20 22 74 65 6d 70 22 29   "main", "temp")
e190: 0a 20 20 2a 2a 20 20 20 28 35 29 20 4e 61 6d 65  .  **   (5) Name
e1a0: 20 6f 66 20 74 72 69 67 67 65 72 20 74 68 61 74   of trigger that
e1b0: 20 69 73 20 64 6f 69 6e 67 20 74 68 65 20 61 63   is doing the ac
e1c0: 63 65 73 73 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  cess.  **.  ** T
e1d0: 68 65 20 63 61 6c 6c 62 61 63 6b 20 73 68 6f 75  he callback shou
e1e0: 6c 64 20 72 65 74 75 72 6e 20 6f 6e 20 6f 66 20  ld return on of 
e1f0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
e200: 72 69 6e 67 73 3a 20 53 51 4c 49 54 45 5f 4f 4b  rings: SQLITE_OK
e210: 2c 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 49 47  ,.  ** SQLITE_IG
e220: 4e 4f 52 45 2c 20 6f 72 20 53 51 4c 49 54 45 5f  NORE, or SQLITE_
e230: 44 45 4e 59 2e 20 20 41 6e 79 20 6f 74 68 65 72  DENY.  Any other
e240: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73   return value is
e250: 20 61 6e 20 65 72 72 6f 72 2e 0a 20 20 2a 2a 0a   an error..  **.
e260: 20 20 2a 2a 20 49 66 20 74 68 69 73 20 6d 65 74    ** If this met
e270: 68 6f 64 20 69 73 20 69 6e 76 6f 6b 65 64 20 77  hod is invoked w
e280: 69 74 68 20 6e 6f 20 61 72 67 75 6d 65 6e 74 73  ith no arguments
e290: 2c 20 74 68 65 20 63 75 72 72 65 6e 74 20 61 75  , the current au
e2a0: 74 68 6f 72 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a  thorization.  **
e2b0: 20 63 61 6c 6c 62 61 63 6b 20 73 74 72 69 6e 67   callback string
e2c0: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 20 20   is returned..  
e2d0: 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 41 55 54  */.  case DB_AUT
e2e0: 48 4f 52 49 5a 45 52 3a 20 7b 0a 23 69 66 64 65  HORIZER: {.#ifde
e2f0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
e300: 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 20 20  THORIZATION.    
e310: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
e320: 28 69 6e 74 65 72 70 2c 20 22 61 75 74 68 6f 72  (interp, "author
e330: 69 7a 61 74 69 6f 6e 20 6e 6f 74 20 61 76 61 69  ization not avai
e340: 6c 61 62 6c 65 20 69 6e 20 74 68 69 73 20 62 75  lable in this bu
e350: 69 6c 64 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  ild", 0);.    re
e360: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
e370: 23 65 6c 73 65 0a 20 20 20 20 69 66 28 20 6f 62  #else.    if( ob
e380: 6a 63 3e 33 20 29 7b 0a 20 20 20 20 20 20 54 63  jc>3 ){.      Tc
e390: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
e3a0: 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
e3b0: 22 3f 43 41 4c 4c 42 41 43 4b 3f 22 29 3b 0a 20  "?CALLBACK?");. 
e3c0: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
e3d0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73 65  ERROR;.    }else
e3e0: 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a   if( objc==2 ){.
e3f0: 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a        if( pDb->z
e400: 41 75 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20  Auth ){.        
e410: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
e420: 28 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a 41  (interp, pDb->zA
e430: 75 74 68 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  uth, 0);.      }
e440: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
e450: 20 20 63 68 61 72 20 2a 7a 41 75 74 68 3b 0a 20    char *zAuth;. 
e460: 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20       int len;.  
e470: 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 41 75      if( pDb->zAu
e480: 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63  th ){.        Tc
e490: 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 41 75 74  l_Free(pDb->zAut
e4a0: 68 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  h);.      }.    
e4b0: 20 20 7a 41 75 74 68 20 3d 20 54 63 6c 5f 47 65    zAuth = Tcl_Ge
e4c0: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
e4d0: 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a 20  bjv[2], &len);. 
e4e0: 20 20 20 20 20 69 66 28 20 7a 41 75 74 68 20 26       if( zAuth &
e4f0: 26 20 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20  & len>0 ){.     
e500: 20 20 20 70 44 62 2d 3e 7a 41 75 74 68 20 3d 20     pDb->zAuth = 
e510: 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b  Tcl_Alloc( len +
e520: 20 31 20 29 3b 0a 20 20 20 20 20 20 20 20 6d 65   1 );.        me
e530: 6d 63 70 79 28 70 44 62 2d 3e 7a 41 75 74 68 2c  mcpy(pDb->zAuth,
e540: 20 7a 41 75 74 68 2c 20 6c 65 6e 2b 31 29 3b 0a   zAuth, len+1);.
e550: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
e560: 20 20 20 20 20 70 44 62 2d 3e 7a 41 75 74 68 20       pDb->zAuth 
e570: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
e580: 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 41 75 74     if( pDb->zAut
e590: 68 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62  h ){.        pDb
e5a0: 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72  ->interp = inter
e5b0: 70 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  p;.        sqlit
e5c0: 65 33 5f 73 65 74 5f 61 75 74 68 6f 72 69 7a 65  e3_set_authorize
e5d0: 72 28 70 44 62 2d 3e 64 62 2c 20 61 75 74 68 5f  r(pDb->db, auth_
e5e0: 63 61 6c 6c 62 61 63 6b 2c 20 70 44 62 29 3b 0a  callback, pDb);.
e5f0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
e600: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 65 74       sqlite3_set
e610: 5f 61 75 74 68 6f 72 69 7a 65 72 28 70 44 62 2d  _authorizer(pDb-
e620: 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  >db, 0, 0);.    
e630: 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66    }.    }.#endif
e640: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
e650: 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 62 61 63  .  /*    $db bac
e660: 6b 75 70 20 3f 44 41 54 41 42 41 53 45 3f 20 46  kup ?DATABASE? F
e670: 49 4c 45 4e 41 4d 45 0a 20 20 2a 2a 0a 20 20 2a  ILENAME.  **.  *
e680: 2a 20 4f 70 65 6e 20 6f 72 20 63 72 65 61 74 65  * Open or create
e690: 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65   a database file
e6a0: 20 6e 61 6d 65 64 20 46 49 4c 45 4e 41 4d 45 2e   named FILENAME.
e6b0: 20 20 54 72 61 6e 73 66 65 72 20 74 68 65 0a 20    Transfer the. 
e6c0: 20 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20 6c   ** content of l
e6d0: 6f 63 61 6c 20 64 61 74 61 62 61 73 65 20 44 41  ocal database DA
e6e0: 54 41 42 41 53 45 20 28 64 65 66 61 75 6c 74 3a  TABASE (default:
e6f0: 20 22 6d 61 69 6e 22 29 20 69 6e 74 6f 20 74 68   "main") into th
e700: 65 0a 20 20 2a 2a 20 46 49 4c 45 4e 41 4d 45 20  e.  ** FILENAME 
e710: 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20  database..  */. 
e720: 20 63 61 73 65 20 44 42 5f 42 41 43 4b 55 50 3a   case DB_BACKUP:
e730: 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61   {.    const cha
e740: 72 20 2a 7a 44 65 73 74 46 69 6c 65 3b 0a 20 20  r *zDestFile;.  
e750: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
e760: 72 63 44 62 3b 0a 20 20 20 20 73 71 6c 69 74 65  rcDb;.    sqlite
e770: 33 20 2a 70 44 65 73 74 3b 0a 20 20 20 20 73 71  3 *pDest;.    sq
e780: 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 2a 70 42  lite3_backup *pB
e790: 61 63 6b 75 70 3b 0a 0a 20 20 20 20 69 66 28 20  ackup;..    if( 
e7a0: 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20 20 20 20 20  objc==3 ){.     
e7b0: 20 7a 53 72 63 44 62 20 3d 20 22 6d 61 69 6e 22   zSrcDb = "main"
e7c0: 3b 0a 20 20 20 20 20 20 7a 44 65 73 74 46 69 6c  ;.      zDestFil
e7d0: 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  e = Tcl_GetStrin
e7e0: 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 20 20  g(objv[2]);.    
e7f0: 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d  }else if( objc==
e800: 34 20 29 7b 0a 20 20 20 20 20 20 7a 53 72 63 44  4 ){.      zSrcD
e810: 62 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  b = Tcl_GetStrin
e820: 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 20 20  g(objv[2]);.    
e830: 20 20 7a 44 65 73 74 46 69 6c 65 20 3d 20 54 63    zDestFile = Tc
e840: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
e850: 5b 33 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  [3]);.    }else{
e860: 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  .      Tcl_Wrong
e870: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
e880: 32 2c 20 6f 62 6a 76 2c 20 22 3f 44 41 54 41 42  2, objv, "?DATAB
e890: 41 53 45 3f 20 46 49 4c 45 4e 41 4d 45 22 29 3b  ASE? FILENAME");
e8a0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
e8b0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
e8c0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
e8d0: 6f 70 65 6e 28 7a 44 65 73 74 46 69 6c 65 2c 20  open(zDestFile, 
e8e0: 26 70 44 65 73 74 29 3b 0a 20 20 20 20 69 66 28  &pDest);.    if(
e8f0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
e900: 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65  {.      Tcl_Appe
e910: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
e920: 20 22 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 74 61   "cannot open ta
e930: 72 67 65 74 20 64 61 74 61 62 61 73 65 3a 20 22  rget database: "
e940: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  ,.           sql
e950: 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44 65 73  ite3_errmsg(pDes
e960: 74 29 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20  t), (char*)0);. 
e970: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f       sqlite3_clo
e980: 73 65 28 70 44 65 73 74 29 3b 0a 20 20 20 20 20  se(pDest);.     
e990: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
e9a0: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 61  R;.    }.    pBa
e9b0: 63 6b 75 70 20 3d 20 73 71 6c 69 74 65 33 5f 62  ckup = sqlite3_b
e9c0: 61 63 6b 75 70 5f 69 6e 69 74 28 70 44 65 73 74  ackup_init(pDest
e9d0: 2c 20 22 6d 61 69 6e 22 2c 20 70 44 62 2d 3e 64  , "main", pDb->d
e9e0: 62 2c 20 7a 53 72 63 44 62 29 3b 0a 20 20 20 20  b, zSrcDb);.    
e9f0: 69 66 28 20 70 42 61 63 6b 75 70 3d 3d 30 20 29  if( pBackup==0 )
ea00: 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65  {.      Tcl_Appe
ea10: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
ea20: 20 22 62 61 63 6b 75 70 20 66 61 69 6c 65 64 3a   "backup failed:
ea30: 20 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 73   ",.           s
ea40: 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44  qlite3_errmsg(pD
ea50: 65 73 74 29 2c 20 28 63 68 61 72 2a 29 30 29 3b  est), (char*)0);
ea60: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63  .      sqlite3_c
ea70: 6c 6f 73 65 28 70 44 65 73 74 29 3b 0a 20 20 20  lose(pDest);.   
ea80: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
ea90: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77  ROR;.    }.    w
eaa0: 68 69 6c 65 28 20 20 28 72 63 20 3d 20 73 71 6c  hile(  (rc = sql
eab0: 69 74 65 33 5f 62 61 63 6b 75 70 5f 73 74 65 70  ite3_backup_step
eac0: 28 70 42 61 63 6b 75 70 2c 31 30 30 29 29 3d 3d  (pBackup,100))==
ead0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 7d 0a 20 20  SQLITE_OK ){}.  
eae0: 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70    sqlite3_backup
eaf0: 5f 66 69 6e 69 73 68 28 70 42 61 63 6b 75 70 29  _finish(pBackup)
eb00: 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
eb10: 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20  LITE_DONE ){.   
eb20: 20 20 20 72 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a     rc = TCL_OK;.
eb30: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
eb40: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
eb50: 74 28 69 6e 74 65 72 70 2c 20 22 62 61 63 6b 75  t(interp, "backu
eb60: 70 20 66 61 69 6c 65 64 3a 20 22 2c 0a 20 20 20  p failed: ",.   
eb70: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
eb80: 65 72 72 6d 73 67 28 70 44 65 73 74 29 2c 20 28  errmsg(pDest), (
eb90: 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20  char*)0);.      
eba0: 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  rc = TCL_ERROR;.
ebb0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
ebc0: 33 5f 63 6c 6f 73 65 28 70 44 65 73 74 29 3b 0a  3_close(pDest);.
ebd0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
ebe0: 20 20 2f 2a 20 20 20 20 24 64 62 20 62 75 73 79    /*    $db busy
ebf0: 20 3f 43 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a   ?CALLBACK?.  **
ec00: 0a 20 20 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65  .  ** Invoke the
ec10: 20 67 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b 20   given callback 
ec20: 69 66 20 61 6e 20 53 51 4c 20 73 74 61 74 65 6d  if an SQL statem
ec30: 65 6e 74 20 61 74 74 65 6d 70 74 73 20 74 6f 20  ent attempts to 
ec40: 6f 70 65 6e 0a 20 20 2a 2a 20 61 20 6c 6f 63 6b  open.  ** a lock
ec50: 65 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ed database file
ec60: 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  ..  */.  case DB
ec70: 5f 42 55 53 59 3a 20 7b 0a 20 20 20 20 69 66 28  _BUSY: {.    if(
ec80: 20 6f 62 6a 63 3e 33 20 29 7b 0a 20 20 20 20 20   objc>3 ){.     
ec90: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
eca0: 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a  s(interp, 2, obj
ecb0: 76 2c 20 22 43 41 4c 4c 42 41 43 4b 22 29 3b 0a  v, "CALLBACK");.
ecc0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
ecd0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73  _ERROR;.    }els
ece0: 65 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b  e if( objc==2 ){
ecf0: 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e  .      if( pDb->
ed00: 7a 42 75 73 79 20 29 7b 0a 20 20 20 20 20 20 20  zBusy ){.       
ed10: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
ed20: 74 28 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a  t(interp, pDb->z
ed30: 42 75 73 79 2c 20 30 29 3b 0a 20 20 20 20 20 20  Busy, 0);.      
ed40: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
ed50: 20 20 20 63 68 61 72 20 2a 7a 42 75 73 79 3b 0a     char *zBusy;.
ed60: 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20        int len;. 
ed70: 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 42       if( pDb->zB
ed80: 75 73 79 20 29 7b 0a 20 20 20 20 20 20 20 20 54  usy ){.        T
ed90: 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 42 75  cl_Free(pDb->zBu
eda0: 73 79 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  sy);.      }.   
edb0: 20 20 20 7a 42 75 73 79 20 3d 20 54 63 6c 5f 47     zBusy = Tcl_G
edc0: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
edd0: 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a  objv[2], &len);.
ede0: 20 20 20 20 20 20 69 66 28 20 7a 42 75 73 79 20        if( zBusy 
edf0: 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20  && len>0 ){.    
ee00: 20 20 20 20 70 44 62 2d 3e 7a 42 75 73 79 20 3d      pDb->zBusy =
ee10: 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20   Tcl_Alloc( len 
ee20: 2b 20 31 20 29 3b 0a 20 20 20 20 20 20 20 20 6d  + 1 );.        m
ee30: 65 6d 63 70 79 28 70 44 62 2d 3e 7a 42 75 73 79  emcpy(pDb->zBusy
ee40: 2c 20 7a 42 75 73 79 2c 20 6c 65 6e 2b 31 29 3b  , zBusy, len+1);
ee50: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
ee60: 20 20 20 20 20 20 70 44 62 2d 3e 7a 42 75 73 79        pDb->zBusy
ee70: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
ee80: 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 42 75      if( pDb->zBu
ee90: 73 79 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44  sy ){.        pD
eea0: 62 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65  b->interp = inte
eeb0: 72 70 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  rp;.        sqli
eec0: 74 65 33 5f 62 75 73 79 5f 68 61 6e 64 6c 65 72  te3_busy_handler
eed0: 28 70 44 62 2d 3e 64 62 2c 20 44 62 42 75 73 79  (pDb->db, DbBusy
eee0: 48 61 6e 64 6c 65 72 2c 20 70 44 62 29 3b 0a 20  Handler, pDb);. 
eef0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
ef00: 20 20 20 20 73 71 6c 69 74 65 33 5f 62 75 73 79      sqlite3_busy
ef10: 5f 68 61 6e 64 6c 65 72 28 70 44 62 2d 3e 64 62  _handler(pDb->db
ef20: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  , 0, 0);.      }
ef30: 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b  .    }.    break
ef40: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 20  ;.  }..  /*     
ef50: 24 64 62 20 63 61 63 68 65 20 66 6c 75 73 68 0a  $db cache flush.
ef60: 20 20 2a 2a 20 20 20 20 20 24 64 62 20 63 61 63    **     $db cac
ef70: 68 65 20 73 69 7a 65 20 6e 0a 20 20 2a 2a 0a 20  he size n.  **. 
ef80: 20 2a 2a 20 46 6c 75 73 68 20 74 68 65 20 70 72   ** Flush the pr
ef90: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
efa0: 20 63 61 63 68 65 2c 20 6f 72 20 73 65 74 20 74   cache, or set t
efb0: 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65  he maximum numbe
efc0: 72 20 6f 66 0a 20 20 2a 2a 20 63 61 63 68 65 64  r of.  ** cached
efd0: 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 2a   statements..  *
efe0: 2f 0a 20 20 63 61 73 65 20 44 42 5f 43 41 43 48  /.  case DB_CACH
eff0: 45 3a 20 7b 0a 20 20 20 20 63 68 61 72 20 2a 73  E: {.    char *s
f000: 75 62 43 6d 64 3b 0a 20 20 20 20 69 6e 74 20 6e  ubCmd;.    int n
f010: 3b 0a 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3c  ;..    if( objc<
f020: 3d 32 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  =2 ){.      Tcl_
f030: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
f040: 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63  erp, 1, objv, "c
f050: 61 63 68 65 20 6f 70 74 69 6f 6e 20 3f 61 72 67  ache option ?arg
f060: 3f 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ?");.      retur
f070: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
f080: 20 7d 0a 20 20 20 20 73 75 62 43 6d 64 20 3d 20   }.    subCmd = 
f090: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
f0a0: 6d 4f 62 6a 28 20 6f 62 6a 76 5b 32 5d 2c 20 30  mObj( objv[2], 0
f0b0: 20 29 3b 0a 20 20 20 20 69 66 28 20 2a 73 75 62   );.    if( *sub
f0c0: 43 6d 64 3d 3d 27 66 27 20 26 26 20 73 74 72 63  Cmd=='f' && strc
f0d0: 6d 70 28 73 75 62 43 6d 64 2c 22 66 6c 75 73 68  mp(subCmd,"flush
f0e0: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ")==0 ){.      i
f0f0: 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20  f( objc!=3 ){.  
f100: 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
f110: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
f120: 2c 20 6f 62 6a 76 2c 20 22 66 6c 75 73 68 22 29  , objv, "flush")
f130: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
f140: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
f150: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
f160: 20 66 6c 75 73 68 53 74 6d 74 43 61 63 68 65 28   flushStmtCache(
f170: 20 70 44 62 20 29 3b 0a 20 20 20 20 20 20 7d 0a   pDb );.      }.
f180: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 2a 73      }else if( *s
f190: 75 62 43 6d 64 3d 3d 27 73 27 20 26 26 20 73 74  ubCmd=='s' && st
f1a0: 72 63 6d 70 28 73 75 62 43 6d 64 2c 22 73 69 7a  rcmp(subCmd,"siz
f1b0: 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  e")==0 ){.      
f1c0: 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20  if( objc!=4 ){. 
f1d0: 20 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67         Tcl_Wrong
f1e0: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
f1f0: 32 2c 20 6f 62 6a 76 2c 20 22 73 69 7a 65 20 6e  2, objv, "size n
f200: 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  ");.        retu
f210: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
f220: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
f230: 20 20 20 69 66 28 20 54 43 4c 5f 45 52 52 4f 52     if( TCL_ERROR
f240: 3d 3d 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  ==Tcl_GetIntFrom
f250: 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
f260: 5b 33 5d 2c 20 26 6e 29 20 29 7b 0a 20 20 20 20  [3], &n) ){.    
f270: 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
f280: 52 65 73 75 6c 74 28 20 69 6e 74 65 72 70 2c 20  Result( interp, 
f290: 22 63 61 6e 6e 6f 74 20 63 6f 6e 76 65 72 74 20  "cannot convert 
f2a0: 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20  \"", .          
f2b0: 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
f2c0: 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33  ngFromObj(objv[3
f2d0: 5d 2c 30 29 2c 20 22 5c 22 20 74 6f 20 69 6e 74  ],0), "\" to int
f2e0: 65 67 65 72 22 2c 20 30 29 3b 0a 20 20 20 20 20  eger", 0);.     
f2f0: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
f300: 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d  ERROR;.        }
f310: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
f320: 69 66 28 20 6e 3c 30 20 29 7b 0a 20 20 20 20 20  if( n<0 ){.     
f330: 20 20 20 20 20 20 20 66 6c 75 73 68 53 74 6d 74         flushStmt
f340: 43 61 63 68 65 28 20 70 44 62 20 29 3b 0a 20 20  Cache( pDb );.  
f350: 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20 30 3b            n = 0;
f360: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
f370: 20 69 66 28 20 6e 3e 4d 41 58 5f 50 52 45 50 41   if( n>MAX_PREPA
f380: 52 45 44 5f 53 54 4d 54 53 20 29 7b 0a 20 20 20  RED_STMTS ){.   
f390: 20 20 20 20 20 20 20 20 20 6e 20 3d 20 4d 41 58           n = MAX
f3a0: 5f 50 52 45 50 41 52 45 44 5f 53 54 4d 54 53 3b  _PREPARED_STMTS;
f3b0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
f3c0: 20 20 20 20 20 20 20 70 44 62 2d 3e 6d 61 78 53         pDb->maxS
f3d0: 74 6d 74 20 3d 20 6e 3b 0a 20 20 20 20 20 20 20  tmt = n;.       
f3e0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
f3f0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 54 63 6c 5f  else{.      Tcl_
f400: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 20 69 6e  AppendResult( in
f410: 74 65 72 70 2c 20 22 62 61 64 20 6f 70 74 69 6f  terp, "bad optio
f420: 6e 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 20  n \"", .        
f430: 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46    Tcl_GetStringF
f440: 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 30  romObj(objv[2],0
f450: 29 2c 20 22 5c 22 3a 20 6d 75 73 74 20 62 65 20  ), "\": must be 
f460: 66 6c 75 73 68 20 6f 72 20 73 69 7a 65 22 2c 20  flush or size", 
f470: 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  0);.      return
f480: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
f490: 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  }.    break;.  }
f4a0: 0a 0a 20 20 2f 2a 20 20 20 20 20 24 64 62 20 63  ..  /*     $db c
f4b0: 68 61 6e 67 65 73 0a 20 20 2a 2a 0a 20 20 2a 2a  hanges.  **.  **
f4c0: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
f4d0: 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20  er of rows that 
f4e0: 77 65 72 65 20 6d 6f 64 69 66 69 65 64 2c 20 69  were modified, i
f4f0: 6e 73 65 72 74 65 64 2c 20 6f 72 20 64 65 6c 65  nserted, or dele
f500: 74 65 64 20 62 79 0a 20 20 2a 2a 20 74 68 65 20  ted by.  ** the 
f510: 6d 6f 73 74 20 72 65 63 65 6e 74 20 49 4e 53 45  most recent INSE
f520: 52 54 2c 20 55 50 44 41 54 45 20 6f 72 20 44 45  RT, UPDATE or DE
f530: 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74 2c 20  LETE statement, 
f540: 6e 6f 74 20 69 6e 63 6c 75 64 69 6e 67 20 0a 20  not including . 
f550: 20 2a 2a 20 61 6e 79 20 63 68 61 6e 67 65 73 20   ** any changes 
f560: 6d 61 64 65 20 62 79 20 74 72 69 67 67 65 72 20  made by trigger 
f570: 70 72 6f 67 72 61 6d 73 2e 0a 20 20 2a 2f 0a 20  programs..  */. 
f580: 20 63 61 73 65 20 44 42 5f 43 48 41 4e 47 45 53   case DB_CHANGES
f590: 3a 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20  : {.    Tcl_Obj 
f5a0: 2a 70 52 65 73 75 6c 74 3b 0a 20 20 20 20 69 66  *pResult;.    if
f5b0: 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20  ( objc!=2 ){.   
f5c0: 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
f5d0: 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
f5e0: 62 6a 76 2c 20 22 22 29 3b 0a 20 20 20 20 20 20  bjv, "");.      
f5f0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
f600: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 52 65 73  ;.    }.    pRes
f610: 75 6c 74 20 3d 20 54 63 6c 5f 47 65 74 4f 62 6a  ult = Tcl_GetObj
f620: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a  Result(interp);.
f630: 20 20 20 20 54 63 6c 5f 53 65 74 49 6e 74 4f 62      Tcl_SetIntOb
f640: 6a 28 70 52 65 73 75 6c 74 2c 20 73 71 6c 69 74  j(pResult, sqlit
f650: 65 33 5f 63 68 61 6e 67 65 73 28 70 44 62 2d 3e  e3_changes(pDb->
f660: 64 62 29 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b  db));.    break;
f670: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64  .  }..  /*    $d
f680: 62 20 63 6c 6f 73 65 0a 20 20 2a 2a 0a 20 20 2a  b close.  **.  *
f690: 2a 20 53 68 75 74 64 6f 77 6e 20 74 68 65 20 64  * Shutdown the d
f6a0: 61 74 61 62 61 73 65 0a 20 20 2a 2f 0a 20 20 63  atabase.  */.  c
f6b0: 61 73 65 20 44 42 5f 43 4c 4f 53 45 3a 20 7b 0a  ase DB_CLOSE: {.
f6c0: 20 20 20 20 54 63 6c 5f 44 65 6c 65 74 65 43 6f      Tcl_DeleteCo
f6d0: 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 54 63  mmand(interp, Tc
f6e0: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
f6f0: 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 29 3b  bj(objv[0], 0));
f700: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
f710: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24  .  /*.  **     $
f720: 64 62 20 63 6f 6c 6c 61 74 65 20 4e 41 4d 45 20  db collate NAME 
f730: 53 43 52 49 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a  SCRIPT.  **.  **
f740: 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 53 51   Create a new SQ
f750: 4c 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e 63  L collation func
f760: 74 69 6f 6e 20 63 61 6c 6c 65 64 20 4e 41 4d 45  tion called NAME
f770: 2e 20 20 57 68 65 6e 65 76 65 72 0a 20 20 2a 2a  .  Whenever.  **
f780: 20 74 68 61 74 20 66 75 6e 63 74 69 6f 6e 20 69   that function i
f790: 73 20 63 61 6c 6c 65 64 2c 20 69 6e 76 6f 6b 65  s called, invoke
f7a0: 20 53 43 52 49 50 54 20 74 6f 20 65 76 61 6c 75   SCRIPT to evalu
f7b0: 61 74 65 20 74 68 65 20 66 75 6e 63 74 69 6f 6e  ate the function
f7c0: 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  ..  */.  case DB
f7d0: 5f 43 4f 4c 4c 41 54 45 3a 20 7b 0a 20 20 20 20  _COLLATE: {.    
f7e0: 53 71 6c 43 6f 6c 6c 61 74 65 20 2a 70 43 6f 6c  SqlCollate *pCol
f7f0: 6c 61 74 65 3b 0a 20 20 20 20 63 68 61 72 20 2a  late;.    char *
f800: 7a 4e 61 6d 65 3b 0a 20 20 20 20 63 68 61 72 20  zName;.    char 
f810: 2a 7a 53 63 72 69 70 74 3b 0a 20 20 20 20 69 6e  *zScript;.    in
f820: 74 20 6e 53 63 72 69 70 74 3b 0a 20 20 20 20 69  t nScript;.    i
f830: 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20  f( objc!=4 ){.  
f840: 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
f850: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20  Args(interp, 2, 
f860: 6f 62 6a 76 2c 20 22 4e 41 4d 45 20 53 43 52 49  objv, "NAME SCRI
f870: 50 54 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  PT");.      retu
f880: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
f890: 20 20 7d 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20    }.    zName = 
f8a0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
f8b0: 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30 29  mObj(objv[2], 0)
f8c0: 3b 0a 20 20 20 20 7a 53 63 72 69 70 74 20 3d 20  ;.    zScript = 
f8d0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
f8e0: 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d 2c 20 26 6e  mObj(objv[3], &n
f8f0: 53 63 72 69 70 74 29 3b 0a 20 20 20 20 70 43 6f  Script);.    pCo
f900: 6c 6c 61 74 65 20 3d 20 28 53 71 6c 43 6f 6c 6c  llate = (SqlColl
f910: 61 74 65 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28 20  ate*)Tcl_Alloc( 
f920: 73 69 7a 65 6f 66 28 2a 70 43 6f 6c 6c 61 74 65  sizeof(*pCollate
f930: 29 20 2b 20 6e 53 63 72 69 70 74 20 2b 20 31 20  ) + nScript + 1 
f940: 29 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c  );.    if( pColl
f950: 61 74 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ate==0 ) return 
f960: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 70  TCL_ERROR;.    p
f970: 43 6f 6c 6c 61 74 65 2d 3e 69 6e 74 65 72 70 20  Collate->interp 
f980: 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 70 43  = interp;.    pC
f990: 6f 6c 6c 61 74 65 2d 3e 70 4e 65 78 74 20 3d 20  ollate->pNext = 
f9a0: 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 3b 0a 20  pDb->pCollate;. 
f9b0: 20 20 20 70 43 6f 6c 6c 61 74 65 2d 3e 7a 53 63     pCollate->zSc
f9c0: 72 69 70 74 20 3d 20 28 63 68 61 72 2a 29 26 70  ript = (char*)&p
f9d0: 43 6f 6c 6c 61 74 65 5b 31 5d 3b 0a 20 20 20 20  Collate[1];.    
f9e0: 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 20 3d 20  pDb->pCollate = 
f9f0: 70 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 6d 65  pCollate;.    me
fa00: 6d 63 70 79 28 70 43 6f 6c 6c 61 74 65 2d 3e 7a  mcpy(pCollate->z
fa10: 53 63 72 69 70 74 2c 20 7a 53 63 72 69 70 74 2c  Script, zScript,
fa20: 20 6e 53 63 72 69 70 74 2b 31 29 3b 0a 20 20 20   nScript+1);.   
fa30: 20 69 66 28 20 73 71 6c 69 74 65 33 5f 63 72 65   if( sqlite3_cre
fa40: 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 70 44  ate_collation(pD
fa50: 62 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20 53 51  b->db, zName, SQ
fa60: 4c 49 54 45 5f 55 54 46 38 2c 20 0a 20 20 20 20  LITE_UTF8, .    
fa70: 20 20 20 20 70 43 6f 6c 6c 61 74 65 2c 20 74 63      pCollate, tc
fa80: 6c 53 71 6c 43 6f 6c 6c 61 74 65 29 20 29 7b 0a  lSqlCollate) ){.
fa90: 20 20 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73        Tcl_SetRes
faa0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61  ult(interp, (cha
fab0: 72 20 2a 29 73 71 6c 69 74 65 33 5f 65 72 72 6d  r *)sqlite3_errm
fac0: 73 67 28 70 44 62 2d 3e 64 62 29 2c 20 54 43 4c  sg(pDb->db), TCL
fad0: 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 20 20  _VOLATILE);.    
fae0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
faf0: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 72  OR;.    }.    br
fb00: 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  eak;.  }..  /*. 
fb10: 20 2a 2a 20 20 20 20 20 24 64 62 20 63 6f 6c 6c   **     $db coll
fb20: 61 74 69 6f 6e 5f 6e 65 65 64 65 64 20 53 43 52  ation_needed SCR
fb30: 49 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 72  IPT.  **.  ** Cr
fb40: 65 61 74 65 20 61 20 6e 65 77 20 53 51 4c 20 63  eate a new SQL c
fb50: 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f  ollation functio
fb60: 6e 20 63 61 6c 6c 65 64 20 4e 41 4d 45 2e 20 20  n called NAME.  
fb70: 57 68 65 6e 65 76 65 72 0a 20 20 2a 2a 20 74 68  Whenever.  ** th
fb80: 61 74 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  at function is c
fb90: 61 6c 6c 65 64 2c 20 69 6e 76 6f 6b 65 20 53 43  alled, invoke SC
fba0: 52 49 50 54 20 74 6f 20 65 76 61 6c 75 61 74 65  RIPT to evaluate
fbb0: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 20   the function.. 
fbc0: 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 43 4f   */.  case DB_CO
fbd0: 4c 4c 41 54 49 4f 4e 5f 4e 45 45 44 45 44 3a 20  LLATION_NEEDED: 
fbe0: 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d  {.    if( objc!=
fbf0: 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57  3 ){.      Tcl_W
fc00: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
fc10: 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 53 43  rp, 2, objv, "SC
fc20: 52 49 50 54 22 29 3b 0a 20 20 20 20 20 20 72 65  RIPT");.      re
fc30: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
fc40: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 44      }.    if( pD
fc50: 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65  b->pCollateNeede
fc60: 64 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 44  d ){.      Tcl_D
fc70: 65 63 72 52 65 66 43 6f 75 6e 74 28 70 44 62 2d  ecrRefCount(pDb-
fc80: 3e 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64 29  >pCollateNeeded)
fc90: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 44 62 2d  ;.    }.    pDb-
fca0: 3e 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64 20  >pCollateNeeded 
fcb0: 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f  = Tcl_DuplicateO
fcc0: 62 6a 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 20  bj(objv[2]);.   
fcd0: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
fce0: 74 28 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e  t(pDb->pCollateN
fcf0: 65 65 64 65 64 29 3b 0a 20 20 20 20 73 71 6c 69  eeded);.    sqli
fd00: 74 65 33 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65  te3_collation_ne
fd10: 65 64 65 64 28 70 44 62 2d 3e 64 62 2c 20 70 44  eded(pDb->db, pD
fd20: 62 2c 20 74 63 6c 43 6f 6c 6c 61 74 65 4e 65 65  b, tclCollateNee
fd30: 64 65 64 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b  ded);.    break;
fd40: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64  .  }..  /*    $d
fd50: 62 20 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 20 3f 43  b commit_hook ?C
fd60: 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a 0a 20 20  ALLBACK?.  **.  
fd70: 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 67 69  ** Invoke the gi
fd80: 76 65 6e 20 63 61 6c 6c 62 61 63 6b 20 6a 75 73  ven callback jus
fd90: 74 20 62 65 66 6f 72 65 20 63 6f 6d 6d 69 74 74  t before committ
fda0: 69 6e 67 20 65 76 65 72 79 20 53 51 4c 20 74 72  ing every SQL tr
fdb0: 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20  ansaction..  ** 
fdc0: 49 66 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20  If the callback 
fdd0: 74 68 72 6f 77 73 20 61 6e 20 65 78 63 65 70 74  throws an except
fde0: 69 6f 6e 20 6f 72 20 72 65 74 75 72 6e 73 20 6e  ion or returns n
fdf0: 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  on-zero, then th
fe00: 65 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69  e.  ** transacti
fe10: 6f 6e 20 69 73 20 61 62 6f 72 74 65 64 2e 20 20  on is aborted.  
fe20: 49 66 20 43 41 4c 4c 42 41 43 4b 20 69 73 20 61  If CALLBACK is a
fe30: 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2c 20  n empty string, 
fe40: 74 68 65 20 63 61 6c 6c 62 61 63 6b 0a 20 20 2a  the callback.  *
fe50: 2a 20 69 73 20 64 69 73 61 62 6c 65 64 2e 0a 20  * is disabled.. 
fe60: 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 43 4f   */.  case DB_CO
fe70: 4d 4d 49 54 5f 48 4f 4f 4b 3a 20 7b 0a 20 20 20  MMIT_HOOK: {.   
fe80: 20 69 66 28 20 6f 62 6a 63 3e 33 20 29 7b 0a 20   if( objc>3 ){. 
fe90: 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
fea0: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
feb0: 20 6f 62 6a 76 2c 20 22 3f 43 41 4c 4c 42 41 43   objv, "?CALLBAC
fec0: 4b 3f 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  K?");.      retu
fed0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
fee0: 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a 63    }else if( objc
fef0: 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==2 ){.      if(
ff00: 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 20 29 7b   pDb->zCommit ){
ff10: 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70  .        Tcl_App
ff20: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
ff30: 2c 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 2c 20  , pDb->zCommit, 
ff40: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
ff50: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61  }else{.      cha
ff60: 72 20 2a 7a 43 6f 6d 6d 69 74 3b 0a 20 20 20 20  r *zCommit;.    
ff70: 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20    int len;.     
ff80: 20 69 66 28 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69   if( pDb->zCommi
ff90: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c  t ){.        Tcl
ffa0: 5f 46 72 65 65 28 70 44 62 2d 3e 7a 43 6f 6d 6d  _Free(pDb->zComm
ffb0: 69 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  it);.      }.   
ffc0: 20 20 20 7a 43 6f 6d 6d 69 74 20 3d 20 54 63 6c     zCommit = Tcl
ffd0: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
ffe0: 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29  j(objv[2], &len)
fff0: 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 43 6f 6d  ;.      if( zCom
10000 6d 69 74 20 26 26 20 6c 65 6e 3e 30 20 29 7b 0a  mit && len>0 ){.
10010 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 43 6f          pDb->zCo
10020 6d 6d 69 74 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63  mmit = Tcl_Alloc
10030 28 20 6c 65 6e 20 2b 20 31 20 29 3b 0a 20 20 20  ( len + 1 );.   
10040 20 20 20 20 20 6d 65 6d 63 70 79 28 70 44 62 2d       memcpy(pDb-
10050 3e 7a 43 6f 6d 6d 69 74 2c 20 7a 43 6f 6d 6d 69  >zCommit, zCommi
10060 74 2c 20 6c 65 6e 2b 31 29 3b 0a 20 20 20 20 20  t, len+1);.     
10070 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
10080 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 20 3d 20 30  pDb->zCommit = 0
10090 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
100a0 69 66 28 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74  if( pDb->zCommit
100b0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d   ){.        pDb-
100c0 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70  >interp = interp
100d0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
100e0 33 5f 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 28 70 44  3_commit_hook(pD
100f0 62 2d 3e 64 62 2c 20 44 62 43 6f 6d 6d 69 74 48  b->db, DbCommitH
10100 61 6e 64 6c 65 72 2c 20 70 44 62 29 3b 0a 20 20  andler, pDb);.  
10110 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
10120 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6d 6d 69     sqlite3_commi
10130 74 5f 68 6f 6f 6b 28 70 44 62 2d 3e 64 62 2c 20  t_hook(pDb->db, 
10140 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  0, 0);.      }. 
10150 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a     }.    break;.
10160 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62    }..  /*    $db
10170 20 63 6f 6d 70 6c 65 74 65 20 53 51 4c 0a 20 20   complete SQL.  
10180 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 54  **.  ** Return T
10190 52 55 45 20 69 66 20 53 51 4c 20 69 73 20 61 20  RUE if SQL is a 
101a0 63 6f 6d 70 6c 65 74 65 20 53 51 4c 20 73 74 61  complete SQL sta
101b0 74 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 20  tement.  Return 
101c0 46 41 4c 53 45 20 69 66 0a 20 20 2a 2a 20 61 64  FALSE if.  ** ad
101d0 64 69 74 69 6f 6e 61 6c 20 6c 69 6e 65 73 20 6f  ditional lines o
101e0 66 20 69 6e 70 75 74 20 61 72 65 20 6e 65 65 64  f input are need
101f0 65 64 2e 20 20 54 68 69 73 20 69 73 20 73 69 6d  ed.  This is sim
10200 69 6c 61 72 20 74 6f 20 74 68 65 0a 20 20 2a 2a  ilar to the.  **
10210 20 62 75 69 6c 74 2d 69 6e 20 22 69 6e 66 6f 20   built-in "info 
10220 63 6f 6d 70 6c 65 74 65 22 20 63 6f 6d 6d 61 6e  complete" comman
10230 64 20 6f 66 20 54 63 6c 2e 0a 20 20 2a 2f 0a 20  d of Tcl..  */. 
10240 20 63 61 73 65 20 44 42 5f 43 4f 4d 50 4c 45 54   case DB_COMPLET
10250 45 3a 20 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  E: {.#ifndef SQL
10260 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4c 45 54  ITE_OMIT_COMPLET
10270 45 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  E.    Tcl_Obj *p
10280 52 65 73 75 6c 74 3b 0a 20 20 20 20 69 6e 74 20  Result;.    int 
10290 69 73 43 6f 6d 70 6c 65 74 65 3b 0a 20 20 20 20  isComplete;.    
102a0 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20  if( objc!=3 ){. 
102b0 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
102c0 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
102d0 20 6f 62 6a 76 2c 20 22 53 51 4c 22 29 3b 0a 20   objv, "SQL");. 
102e0 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
102f0 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
10300 20 69 73 43 6f 6d 70 6c 65 74 65 20 3d 20 73 71   isComplete = sq
10310 6c 69 74 65 33 5f 63 6f 6d 70 6c 65 74 65 28 20  lite3_complete( 
10320 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
10330 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30 29  mObj(objv[2], 0)
10340 20 29 3b 0a 20 20 20 20 70 52 65 73 75 6c 74 20   );.    pResult 
10350 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75  = Tcl_GetObjResu
10360 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  lt(interp);.    
10370 54 63 6c 5f 53 65 74 42 6f 6f 6c 65 61 6e 4f 62  Tcl_SetBooleanOb
10380 6a 28 70 52 65 73 75 6c 74 2c 20 69 73 43 6f 6d  j(pResult, isCom
10390 70 6c 65 74 65 29 3b 0a 23 65 6e 64 69 66 0a 20  plete);.#endif. 
103a0 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
103b0 20 2f 2a 20 20 20 20 24 64 62 20 63 6f 70 79 20   /*    $db copy 
103c0 63 6f 6e 66 6c 69 63 74 2d 61 6c 67 6f 72 69 74  conflict-algorit
103d0 68 6d 20 74 61 62 6c 65 20 66 69 6c 65 6e 61 6d  hm table filenam
103e0 65 20 3f 53 45 50 41 52 41 54 4f 52 3f 20 3f 4e  e ?SEPARATOR? ?N
103f0 55 4c 4c 49 4e 44 49 43 41 54 4f 52 3f 0a 20 20  ULLINDICATOR?.  
10400 2a 2a 0a 20 20 2a 2a 20 43 6f 70 79 20 64 61 74  **.  ** Copy dat
10410 61 20 69 6e 74 6f 20 74 61 62 6c 65 20 66 72 6f  a into table fro
10420 6d 20 66 69 6c 65 6e 61 6d 65 2c 20 6f 70 74 69  m filename, opti
10430 6f 6e 61 6c 6c 79 20 75 73 69 6e 67 20 53 45 50  onally using SEP
10440 41 52 41 54 4f 52 0a 20 20 2a 2a 20 61 73 20 63  ARATOR.  ** as c
10450 6f 6c 75 6d 6e 20 73 65 70 61 72 61 74 6f 72 73  olumn separators
10460 2e 20 20 49 66 20 61 20 63 6f 6c 75 6d 6e 20 63  .  If a column c
10470 6f 6e 74 61 69 6e 73 20 61 20 6e 75 6c 6c 20 73  ontains a null s
10480 74 72 69 6e 67 2c 20 6f 72 20 74 68 65 0a 20 20  tring, or the.  
10490 2a 2a 20 76 61 6c 75 65 20 6f 66 20 4e 55 4c 4c  ** value of NULL
104a0 49 4e 44 49 43 41 54 4f 52 2c 20 61 20 4e 55 4c  INDICATOR, a NUL
104b0 4c 20 69 73 20 69 6e 73 65 72 74 65 64 20 66 6f  L is inserted fo
104c0 72 20 74 68 65 20 63 6f 6c 75 6d 6e 2e 0a 20 20  r the column..  
104d0 2a 2a 20 63 6f 6e 66 6c 69 63 74 2d 61 6c 67 6f  ** conflict-algo
104e0 72 69 74 68 6d 20 69 73 20 6f 6e 65 20 6f 66 20  rithm is one of 
104f0 74 68 65 20 73 71 6c 69 74 65 20 63 6f 6e 66 6c  the sqlite confl
10500 69 63 74 20 61 6c 67 6f 72 69 74 68 6d 73 3a 0a  ict algorithms:.
10510 20 20 2a 2a 20 20 20 20 72 6f 6c 6c 62 61 63 6b    **    rollback
10520 2c 20 61 62 6f 72 74 2c 20 66 61 69 6c 2c 20 69  , abort, fail, i
10530 67 6e 6f 72 65 2c 20 72 65 70 6c 61 63 65 0a 20  gnore, replace. 
10540 20 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c 20   ** On success, 
10550 72 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  return the numbe
10560 72 20 6f 66 20 6c 69 6e 65 73 20 70 72 6f 63 65  r of lines proce
10570 73 73 65 64 2c 20 6e 6f 74 20 6e 65 63 65 73 73  ssed, not necess
10580 61 72 69 6c 79 20 73 61 6d 65 0a 20 20 2a 2a 20  arily same.  ** 
10590 61 73 20 27 64 62 20 63 68 61 6e 67 65 73 27 20  as 'db changes' 
105a0 64 75 65 20 74 6f 20 63 6f 6e 66 6c 69 63 74 2d  due to conflict-
105b0 61 6c 67 6f 72 69 74 68 6d 20 73 65 6c 65 63 74  algorithm select
105c0 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  ed..  **.  ** Th
105d0 69 73 20 63 6f 64 65 20 69 73 20 62 61 73 69 63  is code is basic
105e0 61 6c 6c 79 20 61 6e 20 69 6d 70 6c 65 6d 65 6e  ally an implemen
105f0 74 61 74 69 6f 6e 2f 65 6e 68 61 6e 63 65 6d 65  tation/enhanceme
10600 6e 74 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 73  nt of.  ** the s
10610 71 6c 69 74 65 33 20 73 68 65 6c 6c 2e 63 20 22  qlite3 shell.c "
10620 2e 69 6d 70 6f 72 74 22 20 63 6f 6d 6d 61 6e 64  .import" command
10630 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73  ..  **.  ** This
10640 20 63 6f 6d 6d 61 6e 64 20 75 73 61 67 65 20 69   command usage i
10650 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20  s equivalent to 
10660 74 68 65 20 73 71 6c 69 74 65 32 2e 78 20 43 4f  the sqlite2.x CO
10670 50 59 20 73 74 61 74 65 6d 65 6e 74 2c 0a 20 20  PY statement,.  
10680 2a 2a 20 77 68 69 63 68 20 69 6d 70 6f 72 74 73  ** which imports
10690 20 66 69 6c 65 20 64 61 74 61 20 69 6e 74 6f 20   file data into 
106a0 61 20 74 61 62 6c 65 20 75 73 69 6e 67 20 74 68  a table using th
106b0 65 20 50 6f 73 74 67 72 65 53 51 4c 20 43 4f 50  e PostgreSQL COP
106c0 59 20 66 69 6c 65 20 66 6f 72 6d 61 74 3a 0a 20  Y file format:. 
106d0 20 2a 2a 20 20 20 24 64 62 20 63 6f 70 79 20 24   **   $db copy $
106e0 63 6f 6e 66 6c 69 74 5f 61 6c 67 6f 20 24 74 61  conflit_algo $ta
106f0 62 6c 65 5f 6e 61 6d 65 20 24 66 69 6c 65 6e 61  ble_name $filena
10700 6d 65 20 5c 74 20 5c 5c 4e 0a 20 20 2a 2f 0a 20  me \t \\N.  */. 
10710 20 63 61 73 65 20 44 42 5f 43 4f 50 59 3a 20 7b   case DB_COPY: {
10720 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 61 62 6c  .    char *zTabl
10730 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
10740 20 2f 2a 20 49 6e 73 65 72 74 20 64 61 74 61 20   /* Insert data 
10750 69 6e 74 6f 20 74 68 69 73 20 74 61 62 6c 65 20  into this table 
10760 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 46 69  */.    char *zFi
10770 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  le;             
10780 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 66     /* The file f
10790 72 6f 6d 20 77 68 69 63 68 20 74 6f 20 65 78 74  rom which to ext
107a0 72 61 63 74 20 64 61 74 61 20 2a 2f 0a 20 20 20  ract data */.   
107b0 20 63 68 61 72 20 2a 7a 43 6f 6e 66 6c 69 63 74   char *zConflict
107c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
107d0 54 68 65 20 63 6f 6e 66 6c 69 63 74 20 61 6c 67  The conflict alg
107e0 6f 72 69 74 68 6d 20 74 6f 20 75 73 65 20 2a 2f  orithm to use */
107f0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  .    sqlite3_stm
10800 74 20 2a 70 53 74 6d 74 3b 20 20 20 20 20 20 20  t *pStmt;       
10810 20 2f 2a 20 41 20 73 74 61 74 65 6d 65 6e 74 20   /* A statement 
10820 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b  */.    int nCol;
10830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10840 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
10850 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 74  columns in the t
10860 61 62 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20  able */.    int 
10870 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20 20 20  nByte;          
10880 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
10890 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 61 6e  r of bytes in an
108a0 20 53 51 4c 20 73 74 72 69 6e 67 20 2a 2f 0a 20   SQL string */. 
108b0 20 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20     int i, j;    
108c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
108d0 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20  * Loop counters 
108e0 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53 65 70 3b  */.    int nSep;
108f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10900 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
10910 62 79 74 65 73 20 69 6e 20 7a 53 65 70 5b 5d 20  bytes in zSep[] 
10920 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 4e 75 6c 6c  */.    int nNull
10930 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
10940 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
10950 62 79 74 65 73 20 69 6e 20 7a 4e 75 6c 6c 5b 5d  bytes in zNull[]
10960 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 53   */.    char *zS
10970 71 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ql;             
10980 20 20 20 20 2f 2a 20 41 6e 20 53 51 4c 20 73 74      /* An SQL st
10990 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 63  atement */.    c
109a0 68 61 72 20 2a 7a 4c 69 6e 65 3b 20 20 20 20 20  har *zLine;     
109b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
109c0 73 69 6e 67 6c 65 20 6c 69 6e 65 20 6f 66 20 69  single line of i
109d0 6e 70 75 74 20 66 72 6f 6d 20 74 68 65 20 66 69  nput from the fi
109e0 6c 65 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a  le */.    char *
109f0 2a 61 7a 43 6f 6c 3b 20 20 20 20 20 20 20 20 20  *azCol;         
10a00 20 20 20 20 20 20 2f 2a 20 7a 4c 69 6e 65 5b 5d        /* zLine[]
10a10 20 62 72 6f 6b 65 6e 20 75 70 20 69 6e 74 6f 20   broken up into 
10a20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 63  columns */.    c
10a30 68 61 72 20 2a 7a 43 6f 6d 6d 69 74 3b 20 20 20  har *zCommit;   
10a40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f             /* Ho
10a50 77 20 74 6f 20 63 6f 6d 6d 69 74 20 63 68 61 6e  w to commit chan
10a60 67 65 73 20 2a 2f 0a 20 20 20 20 46 49 4c 45 20  ges */.    FILE 
10a70 2a 69 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  *in;            
10a80 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e         /* The in
10a90 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20  put file */.    
10aa0 69 6e 74 20 6c 69 6e 65 6e 6f 20 3d 20 30 3b 20  int lineno = 0; 
10ab0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
10ac0 69 6e 65 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e  ine number of in
10ad0 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20  put file */.    
10ae0 63 68 61 72 20 7a 4c 69 6e 65 4e 75 6d 5b 38 30  char zLineNum[80
10af0 5d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c  ];          /* L
10b00 69 6e 65 20 6e 75 6d 62 65 72 20 70 72 69 6e 74  ine number print
10b10 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 20 20 54   buffer */.    T
10b20 63 6c 5f 4f 62 6a 20 2a 70 52 65 73 75 6c 74 3b  cl_Obj *pResult;
10b30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 6e             /* in
10b40 74 65 72 70 20 72 65 73 75 6c 74 20 2a 2f 0a 0a  terp result */..
10b50 20 20 20 20 63 68 61 72 20 2a 7a 53 65 70 3b 0a      char *zSep;.
10b60 20 20 20 20 63 68 61 72 20 2a 7a 4e 75 6c 6c 3b      char *zNull;
10b70 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3c 35 20  .    if( objc<5 
10b80 7c 7c 20 6f 62 6a 63 3e 37 20 29 7b 0a 20 20 20  || objc>7 ){.   
10b90 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
10ba0 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
10bb0 62 6a 76 2c 20 0a 20 20 20 20 20 20 20 20 20 22  bjv, .         "
10bc0 43 4f 4e 46 4c 49 43 54 2d 41 4c 47 4f 52 49 54  CONFLICT-ALGORIT
10bd0 48 4d 20 54 41 42 4c 45 20 46 49 4c 45 4e 41 4d  HM TABLE FILENAM
10be0 45 20 3f 53 45 50 41 52 41 54 4f 52 3f 20 3f 4e  E ?SEPARATOR? ?N
10bf0 55 4c 4c 49 4e 44 49 43 41 54 4f 52 3f 22 29 3b  ULLINDICATOR?");
10c00 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
10c10 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
10c20 20 20 20 69 66 28 20 6f 62 6a 63 3e 3d 36 20 29     if( objc>=6 )
10c30 7b 0a 20 20 20 20 20 20 7a 53 65 70 20 3d 20 54  {.      zSep = T
10c40 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
10c50 4f 62 6a 28 6f 62 6a 76 5b 35 5d 2c 20 30 29 3b  Obj(objv[5], 0);
10c60 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
10c70 20 20 7a 53 65 70 20 3d 20 22 5c 74 22 3b 0a 20    zSep = "\t";. 
10c80 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 62 6a     }.    if( obj
10c90 63 3e 3d 37 20 29 7b 0a 20 20 20 20 20 20 7a 4e  c>=7 ){.      zN
10ca0 75 6c 6c 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  ull = Tcl_GetStr
10cb0 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
10cc0 36 5d 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73  6], 0);.    }els
10cd0 65 7b 0a 20 20 20 20 20 20 7a 4e 75 6c 6c 20 3d  e{.      zNull =
10ce0 20 22 22 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a   "";.    }.    z
10cf0 43 6f 6e 66 6c 69 63 74 20 3d 20 54 63 6c 5f 47  Conflict = Tcl_G
10d00 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
10d10 6f 62 6a 76 5b 32 5d 2c 20 30 29 3b 0a 20 20 20  objv[2], 0);.   
10d20 20 7a 54 61 62 6c 65 20 3d 20 54 63 6c 5f 47 65   zTable = Tcl_Ge
10d30 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
10d40 62 6a 76 5b 33 5d 2c 20 30 29 3b 0a 20 20 20 20  bjv[3], 0);.    
10d50 7a 46 69 6c 65 20 3d 20 54 63 6c 5f 47 65 74 53  zFile = Tcl_GetS
10d60 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
10d70 76 5b 34 5d 2c 20 30 29 3b 0a 20 20 20 20 6e 53  v[4], 0);.    nS
10d80 65 70 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 53  ep = strlen30(zS
10d90 65 70 29 3b 0a 20 20 20 20 6e 4e 75 6c 6c 20 3d  ep);.    nNull =
10da0 20 73 74 72 6c 65 6e 33 30 28 7a 4e 75 6c 6c 29   strlen30(zNull)
10db0 3b 0a 20 20 20 20 69 66 28 20 6e 53 65 70 3d 3d  ;.    if( nSep==
10dc0 30 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41  0 ){.      Tcl_A
10dd0 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
10de0 72 70 2c 22 45 72 72 6f 72 3a 20 6e 6f 6e 2d 6e  rp,"Error: non-n
10df0 75 6c 6c 20 73 65 70 61 72 61 74 6f 72 20 72 65  ull separator re
10e00 71 75 69 72 65 64 20 66 6f 72 20 63 6f 70 79 22  quired for copy"
10e10 2c 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ,0);.      retur
10e20 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
10e30 20 7d 0a 20 20 20 20 69 66 28 73 74 72 63 6d 70   }.    if(strcmp
10e40 28 7a 43 6f 6e 66 6c 69 63 74 2c 20 22 72 6f 6c  (zConflict, "rol
10e50 6c 62 61 63 6b 22 29 20 21 3d 20 30 20 26 26 0a  lback") != 0 &&.
10e60 20 20 20 20 20 20 20 73 74 72 63 6d 70 28 7a 43         strcmp(zC
10e70 6f 6e 66 6c 69 63 74 2c 20 22 61 62 6f 72 74 22  onflict, "abort"
10e80 20 20 20 29 20 21 3d 20 30 20 26 26 0a 20 20 20     ) != 0 &&.   
10e90 20 20 20 20 73 74 72 63 6d 70 28 7a 43 6f 6e 66      strcmp(zConf
10ea0 6c 69 63 74 2c 20 22 66 61 69 6c 22 20 20 20 20  lict, "fail"    
10eb0 29 20 21 3d 20 30 20 26 26 0a 20 20 20 20 20 20  ) != 0 &&.      
10ec0 20 73 74 72 63 6d 70 28 7a 43 6f 6e 66 6c 69 63   strcmp(zConflic
10ed0 74 2c 20 22 69 67 6e 6f 72 65 22 20 20 29 20 21  t, "ignore"  ) !
10ee0 3d 20 30 20 26 26 0a 20 20 20 20 20 20 20 73 74  = 0 &&.       st
10ef0 72 63 6d 70 28 7a 43 6f 6e 66 6c 69 63 74 2c 20  rcmp(zConflict, 
10f00 22 72 65 70 6c 61 63 65 22 20 29 20 21 3d 20 30  "replace" ) != 0
10f10 20 29 20 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41   ) {.      Tcl_A
10f20 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
10f30 72 70 2c 20 22 45 72 72 6f 72 3a 20 5c 22 22 2c  rp, "Error: \"",
10f40 20 7a 43 6f 6e 66 6c 69 63 74 2c 20 0a 20 20 20   zConflict, .   
10f50 20 20 20 20 20 20 20 20 20 22 5c 22 2c 20 63 6f           "\", co
10f60 6e 66 6c 69 63 74 2d 61 6c 67 6f 72 69 74 68 6d  nflict-algorithm
10f70 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f 66 3a   must be one of:
10f80 20 72 6f 6c 6c 62 61 63 6b 2c 20 22 0a 20 20 20   rollback, ".   
10f90 20 20 20 20 20 20 20 20 20 22 61 62 6f 72 74 2c           "abort,
10fa0 20 66 61 69 6c 2c 20 69 67 6e 6f 72 65 2c 20 6f   fail, ignore, o
10fb0 72 20 72 65 70 6c 61 63 65 22 2c 20 30 29 3b 0a  r replace", 0);.
10fc0 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
10fd0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
10fe0 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33    zSql = sqlite3
10ff0 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c 45 43 54  _mprintf("SELECT
11000 20 2a 20 46 52 4f 4d 20 27 25 71 27 22 2c 20 7a   * FROM '%q'", z
11010 54 61 62 6c 65 29 3b 0a 20 20 20 20 69 66 28 20  Table);.    if( 
11020 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20  zSql==0 ){.     
11030 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
11040 74 28 69 6e 74 65 72 70 2c 20 22 45 72 72 6f 72  t(interp, "Error
11050 3a 20 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 3a  : no such table:
11060 20 22 2c 20 7a 54 61 62 6c 65 2c 20 30 29 3b 0a   ", zTable, 0);.
11070 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
11080 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
11090 20 20 6e 42 79 74 65 20 3d 20 73 74 72 6c 65 6e    nByte = strlen
110a0 33 30 28 7a 53 71 6c 29 3b 0a 20 20 20 20 72 63  30(zSql);.    rc
110b0 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61   = sqlite3_prepa
110c0 72 65 28 70 44 62 2d 3e 64 62 2c 20 7a 53 71 6c  re(pDb->db, zSql
110d0 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29  , -1, &pStmt, 0)
110e0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
110f0 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 69 66  ee(zSql);.    if
11100 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 54 63  ( rc ){.      Tc
11110 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
11120 6e 74 65 72 70 2c 20 22 45 72 72 6f 72 3a 20 22  nterp, "Error: "
11130 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  , sqlite3_errmsg
11140 28 70 44 62 2d 3e 64 62 29 2c 20 30 29 3b 0a 20  (pDb->db), 0);. 
11150 20 20 20 20 20 6e 43 6f 6c 20 3d 20 30 3b 0a 20       nCol = 0;. 
11160 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
11170 6e 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63  nCol = sqlite3_c
11180 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70 53 74 6d  olumn_count(pStm
11190 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  t);.    }.    sq
111a0 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
111b0 53 74 6d 74 29 3b 0a 20 20 20 20 69 66 28 20 6e  Stmt);.    if( n
111c0 43 6f 6c 3d 3d 30 20 29 20 7b 0a 20 20 20 20 20  Col==0 ) {.     
111d0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
111e0 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 53 71  R;.    }.    zSq
111f0 6c 20 3d 20 6d 61 6c 6c 6f 63 28 20 6e 42 79 74  l = malloc( nByt
11200 65 20 2b 20 35 30 20 2b 20 6e 43 6f 6c 2a 32 20  e + 50 + nCol*2 
11210 29 3b 0a 20 20 20 20 69 66 28 20 7a 53 71 6c 3d  );.    if( zSql=
11220 3d 30 20 29 20 7b 0a 20 20 20 20 20 20 54 63 6c  =0 ) {.      Tcl
11230 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
11240 74 65 72 70 2c 20 22 45 72 72 6f 72 3a 20 63 61  terp, "Error: ca
11250 6e 27 74 20 6d 61 6c 6c 6f 63 28 29 22 2c 20 30  n't malloc()", 0
11260 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
11270 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
11280 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
11290 72 69 6e 74 66 28 6e 42 79 74 65 2b 35 30 2c 20  rintf(nByte+50, 
112a0 7a 53 71 6c 2c 20 22 49 4e 53 45 52 54 20 4f 52  zSql, "INSERT OR
112b0 20 25 71 20 49 4e 54 4f 20 27 25 71 27 20 56 41   %q INTO '%q' VA
112c0 4c 55 45 53 28 3f 22 2c 0a 20 20 20 20 20 20 20  LUES(?",.       
112d0 20 20 7a 43 6f 6e 66 6c 69 63 74 2c 20 7a 54 61    zConflict, zTa
112e0 62 6c 65 29 3b 0a 20 20 20 20 6a 20 3d 20 73 74  ble);.    j = st
112f0 72 6c 65 6e 33 30 28 7a 53 71 6c 29 3b 0a 20 20  rlen30(zSql);.  
11300 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 43 6f    for(i=1; i<nCo
11310 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 7a  l; i++){.      z
11320 53 71 6c 5b 6a 2b 2b 5d 20 3d 20 27 2c 27 3b 0a  Sql[j++] = ',';.
11330 20 20 20 20 20 20 7a 53 71 6c 5b 6a 2b 2b 5d 20        zSql[j++] 
11340 3d 20 27 3f 27 3b 0a 20 20 20 20 7d 0a 20 20 20  = '?';.    }.   
11350 20 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d 20 27 29 27   zSql[j++] = ')'
11360 3b 0a 20 20 20 20 7a 53 71 6c 5b 6a 5d 20 3d 20  ;.    zSql[j] = 
11370 30 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  0;.    rc = sqli
11380 74 65 33 5f 70 72 65 70 61 72 65 28 70 44 62 2d  te3_prepare(pDb-
11390 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26  >db, zSql, -1, &
113a0 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 66  pStmt, 0);.    f
113b0 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 69  ree(zSql);.    i
113c0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 54  f( rc ){.      T
113d0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
113e0 69 6e 74 65 72 70 2c 20 22 45 72 72 6f 72 3a 20  interp, "Error: 
113f0 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  ", sqlite3_errms
11400 67 28 70 44 62 2d 3e 64 62 29 2c 20 30 29 3b 0a  g(pDb->db), 0);.
11410 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69        sqlite3_fi
11420 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20  nalize(pStmt);. 
11430 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
11440 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
11450 20 69 6e 20 3d 20 66 6f 70 65 6e 28 7a 46 69 6c   in = fopen(zFil
11460 65 2c 20 22 72 62 22 29 3b 0a 20 20 20 20 69 66  e, "rb");.    if
11470 28 20 69 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ( in==0 ){.     
11480 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
11490 74 28 69 6e 74 65 72 70 2c 20 22 45 72 72 6f 72  t(interp, "Error
114a0 3a 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 66 69  : cannot open fi
114b0 6c 65 3a 20 22 2c 20 7a 46 69 6c 65 2c 20 4e 55  le: ", zFile, NU
114c0 4c 4c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  LL);.      sqlit
114d0 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
114e0 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  t);.      return
114f0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
11500 7d 0a 20 20 20 20 61 7a 43 6f 6c 20 3d 20 6d 61  }.    azCol = ma
11510 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 61 7a 43  lloc( sizeof(azC
11520 6f 6c 5b 30 5d 29 2a 28 6e 43 6f 6c 2b 31 29 20  ol[0])*(nCol+1) 
11530 29 3b 0a 20 20 20 20 69 66 28 20 61 7a 43 6f 6c  );.    if( azCol
11540 3d 3d 30 20 29 20 7b 0a 20 20 20 20 20 20 54 63  ==0 ) {.      Tc
11550 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
11560 6e 74 65 72 70 2c 20 22 45 72 72 6f 72 3a 20 63  nterp, "Error: c
11570 61 6e 27 74 20 6d 61 6c 6c 6f 63 28 29 22 2c 20  an't malloc()", 
11580 30 29 3b 0a 20 20 20 20 20 20 66 63 6c 6f 73 65  0);.      fclose
11590 28 69 6e 29 3b 0a 20 20 20 20 20 20 72 65 74 75  (in);.      retu
115a0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
115b0 20 20 7d 0a 20 20 20 20 28 76 6f 69 64 29 73 71    }.    (void)sq
115c0 6c 69 74 65 33 5f 65 78 65 63 28 70 44 62 2d 3e  lite3_exec(pDb->
115d0 64 62 2c 20 22 42 45 47 49 4e 22 2c 20 30 2c 20  db, "BEGIN", 0, 
115e0 30 2c 20 30 29 3b 0a 20 20 20 20 7a 43 6f 6d 6d  0, 0);.    zComm
115f0 69 74 20 3d 20 22 43 4f 4d 4d 49 54 22 3b 0a 20  it = "COMMIT";. 
11600 20 20 20 77 68 69 6c 65 28 20 28 7a 4c 69 6e 65     while( (zLine
11610 20 3d 20 6c 6f 63 61 6c 5f 67 65 74 6c 69 6e 65   = local_getline
11620 28 30 2c 20 69 6e 29 29 21 3d 30 20 29 7b 0a 20  (0, in))!=0 ){. 
11630 20 20 20 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20       char *z;.  
11640 20 20 20 20 69 20 3d 20 30 3b 0a 20 20 20 20 20      i = 0;.     
11650 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20   lineno++;.     
11660 20 61 7a 43 6f 6c 5b 30 5d 20 3d 20 7a 4c 69 6e   azCol[0] = zLin
11670 65 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  e;.      for(i=0
11680 2c 20 7a 3d 7a 4c 69 6e 65 3b 20 2a 7a 3b 20 7a  , z=zLine; *z; z
11690 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
116a0 20 2a 7a 3d 3d 7a 53 65 70 5b 30 5d 20 26 26 20   *z==zSep[0] && 
116b0 73 74 72 6e 63 6d 70 28 7a 2c 20 7a 53 65 70 2c  strncmp(z, zSep,
116c0 20 6e 53 65 70 29 3d 3d 30 20 29 7b 0a 20 20 20   nSep)==0 ){.   
116d0 20 20 20 20 20 20 20 2a 7a 20 3d 20 30 3b 0a 20         *z = 0;. 
116e0 20 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20           i++;.  
116f0 20 20 20 20 20 20 20 20 69 66 28 20 69 3c 6e 43          if( i<nC
11700 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ol ){.          
11710 20 20 61 7a 43 6f 6c 5b 69 5d 20 3d 20 26 7a 5b    azCol[i] = &z[
11720 6e 53 65 70 5d 3b 0a 20 20 20 20 20 20 20 20 20  nSep];.         
11730 20 20 20 7a 20 2b 3d 20 6e 53 65 70 2d 31 3b 0a     z += nSep-1;.
11740 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
11750 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
11760 20 20 20 20 69 66 28 20 69 2b 31 21 3d 6e 43 6f      if( i+1!=nCo
11770 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  l ){.        cha
11780 72 20 2a 7a 45 72 72 3b 0a 20 20 20 20 20 20 20  r *zErr;.       
11790 20 69 6e 74 20 6e 45 72 72 20 3d 20 73 74 72 6c   int nErr = strl
117a0 65 6e 33 30 28 7a 46 69 6c 65 29 20 2b 20 32 30  en30(zFile) + 20
117b0 30 3b 0a 20 20 20 20 20 20 20 20 7a 45 72 72 20  0;.        zErr 
117c0 3d 20 6d 61 6c 6c 6f 63 28 6e 45 72 72 29 3b 0a  = malloc(nErr);.
117d0 20 20 20 20 20 20 20 20 69 66 28 20 7a 45 72 72          if( zErr
117e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
117f0 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
11800 45 72 72 2c 20 7a 45 72 72 2c 0a 20 20 20 20 20  Err, zErr,.     
11810 20 20 20 20 20 20 20 20 22 45 72 72 6f 72 3a 20          "Error: 
11820 25 73 20 6c 69 6e 65 20 25 64 3a 20 65 78 70 65  %s line %d: expe
11830 63 74 65 64 20 25 64 20 63 6f 6c 75 6d 6e 73 20  cted %d columns 
11840 6f 66 20 64 61 74 61 20 62 75 74 20 66 6f 75 6e  of data but foun
11850 64 20 25 64 22 2c 0a 20 20 20 20 20 20 20 20 20  d %d",.         
11860 20 20 20 20 7a 46 69 6c 65 2c 20 6c 69 6e 65 6e      zFile, linen
11870 6f 2c 20 6e 43 6f 6c 2c 20 69 2b 31 29 3b 0a 20  o, nCol, i+1);. 
11880 20 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70           Tcl_App
11890 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
118a0 2c 20 7a 45 72 72 2c 20 30 29 3b 0a 20 20 20 20  , zErr, 0);.    
118b0 20 20 20 20 20 20 66 72 65 65 28 7a 45 72 72 29        free(zErr)
118c0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
118d0 20 20 20 20 7a 43 6f 6d 6d 69 74 20 3d 20 22 52      zCommit = "R
118e0 4f 4c 4c 42 41 43 4b 22 3b 0a 20 20 20 20 20 20  OLLBACK";.      
118f0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
11900 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
11910 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  i<nCol; i++){.  
11920 20 20 20 20 20 20 2f 2a 20 63 68 65 63 6b 20 66        /* check f
11930 6f 72 20 6e 75 6c 6c 20 64 61 74 61 2c 20 69 66  or null data, if
11940 20 73 6f 2c 20 62 69 6e 64 20 61 73 20 6e 75 6c   so, bind as nul
11950 6c 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28  l */.        if(
11960 20 28 6e 4e 75 6c 6c 3e 30 20 26 26 20 73 74 72   (nNull>0 && str
11970 63 6d 70 28 61 7a 43 6f 6c 5b 69 5d 2c 20 7a 4e  cmp(azCol[i], zN
11980 75 6c 6c 29 3d 3d 30 29 0a 20 20 20 20 20 20 20  ull)==0).       
11990 20 20 20 7c 7c 20 73 74 72 6c 65 6e 33 30 28 61     || strlen30(a
119a0 7a 43 6f 6c 5b 69 5d 29 3d 3d 30 20 0a 20 20 20  zCol[i])==0 .   
119b0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
119c0 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e    sqlite3_bind_n
119d0 75 6c 6c 28 70 53 74 6d 74 2c 20 69 2b 31 29 3b  ull(pStmt, i+1);
119e0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
119f0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
11a00 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 53 74 6d  3_bind_text(pStm
11a10 74 2c 20 69 2b 31 2c 20 61 7a 43 6f 6c 5b 69 5d  t, i+1, azCol[i]
11a20 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54 41  , -1, SQLITE_STA
11a30 54 49 43 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  TIC);.        }.
11a40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
11a50 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74  lite3_step(pStmt
11a60 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
11a70 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53 74 6d  lite3_reset(pStm
11a80 74 29 3b 0a 20 20 20 20 20 20 66 72 65 65 28 7a  t);.      free(z
11a90 4c 69 6e 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Line);.      if(
11aa0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
11ab0 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70  {.        Tcl_Ap
11ac0 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
11ad0 70 2c 22 45 72 72 6f 72 3a 20 22 2c 20 73 71 6c  p,"Error: ", sql
11ae0 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d  ite3_errmsg(pDb-
11af0 3e 64 62 29 2c 20 30 29 3b 0a 20 20 20 20 20 20  >db), 0);.      
11b00 20 20 7a 43 6f 6d 6d 69 74 20 3d 20 22 52 4f 4c    zCommit = "ROL
11b10 4c 42 41 43 4b 22 3b 0a 20 20 20 20 20 20 20 20  LBACK";.        
11b20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
11b30 20 20 20 7d 0a 20 20 20 20 66 72 65 65 28 61 7a     }.    free(az
11b40 43 6f 6c 29 3b 0a 20 20 20 20 66 63 6c 6f 73 65  Col);.    fclose
11b50 28 69 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  (in);.    sqlite
11b60 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
11b70 29 3b 0a 20 20 20 20 28 76 6f 69 64 29 73 71 6c  );.    (void)sql
11b80 69 74 65 33 5f 65 78 65 63 28 70 44 62 2d 3e 64  ite3_exec(pDb->d
11b90 62 2c 20 7a 43 6f 6d 6d 69 74 2c 20 30 2c 20 30  b, zCommit, 0, 0
11ba0 2c 20 30 29 3b 0a 0a 20 20 20 20 69 66 28 20 7a  , 0);..    if( z
11bb0 43 6f 6d 6d 69 74 5b 30 5d 20 3d 3d 20 27 43 27  Commit[0] == 'C'
11bc0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 73 75 63   ){.      /* suc
11bd0 63 65 73 73 2c 20 73 65 74 20 72 65 73 75 6c 74  cess, set result
11be0 20 61 73 20 6e 75 6d 62 65 72 20 6f 66 20 6c 69   as number of li
11bf0 6e 65 73 20 70 72 6f 63 65 73 73 65 64 20 2a 2f  nes processed */
11c00 0a 20 20 20 20 20 20 70 52 65 73 75 6c 74 20 3d  .      pResult =
11c10 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c   Tcl_GetObjResul
11c20 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 20  t(interp);.     
11c30 20 54 63 6c 5f 53 65 74 49 6e 74 4f 62 6a 28 70   Tcl_SetIntObj(p
11c40 52 65 73 75 6c 74 2c 20 6c 69 6e 65 6e 6f 29 3b  Result, lineno);
11c50 0a 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f  .      rc = TCL_
11c60 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  OK;.    }else{. 
11c70 20 20 20 20 20 2f 2a 20 66 61 69 6c 75 72 65 2c       /* failure,
11c80 20 61 70 70 65 6e 64 20 6c 69 6e 65 6e 6f 20 77   append lineno w
11c90 68 65 72 65 20 66 61 69 6c 65 64 20 2a 2f 0a 20  here failed */. 
11ca0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
11cb0 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 4c 69  rintf(sizeof(zLi
11cc0 6e 65 4e 75 6d 29 2c 20 7a 4c 69 6e 65 4e 75 6d  neNum), zLineNum
11cd0 2c 22 25 64 22 2c 6c 69 6e 65 6e 6f 29 3b 0a 20  ,"%d",lineno);. 
11ce0 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
11cf0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 2c 20  esult(interp,", 
11d00 66 61 69 6c 65 64 20 77 68 69 6c 65 20 70 72 6f  failed while pro
11d10 63 65 73 73 69 6e 67 20 6c 69 6e 65 3a 20 22 2c  cessing line: ",
11d20 7a 4c 69 6e 65 4e 75 6d 2c 30 29 3b 0a 20 20 20  zLineNum,0);.   
11d30 20 20 20 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f     rc = TCL_ERRO
11d40 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65  R;.    }.    bre
11d50 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  ak;.  }..  /*.  
11d60 2a 2a 20 20 20 20 24 64 62 20 65 6e 61 62 6c 65  **    $db enable
11d70 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e 20  _load_extension 
11d80 42 4f 4f 4c 45 41 4e 0a 20 20 2a 2a 0a 20 20 2a  BOOLEAN.  **.  *
11d90 2a 20 54 75 72 6e 20 74 68 65 20 65 78 74 65 6e  * Turn the exten
11da0 73 69 6f 6e 20 6c 6f 61 64 69 6e 67 20 66 65 61  sion loading fea
11db0 74 75 72 65 20 6f 6e 20 6f 72 20 6f 66 66 2e 20  ture on or off. 
11dc0 20 49 74 20 69 66 20 6f 66 66 20 62 79 0a 20 20   It if off by.  
11dd0 2a 2a 20 64 65 66 61 75 6c 74 2e 0a 20 20 2a 2f  ** default..  */
11de0 0a 20 20 63 61 73 65 20 44 42 5f 45 4e 41 42 4c  .  case DB_ENABL
11df0 45 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e  E_LOAD_EXTENSION
11e00 3a 20 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  : {.#ifndef SQLI
11e10 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54  TE_OMIT_LOAD_EXT
11e20 45 4e 53 49 4f 4e 0a 20 20 20 20 69 6e 74 20 6f  ENSION.    int o
11e30 6e 6f 66 66 3b 0a 20 20 20 20 69 66 28 20 6f 62  noff;.    if( ob
11e40 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 54  jc!=3 ){.      T
11e50 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
11e60 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c  interp, 2, objv,
11e70 20 22 42 4f 4f 4c 45 41 4e 22 29 3b 0a 20 20 20   "BOOLEAN");.   
11e80 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
11e90 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ROR;.    }.    i
11ea0 66 28 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61  f( Tcl_GetBoolea
11eb0 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  nFromObj(interp,
11ec0 20 6f 62 6a 76 5b 32 5d 2c 20 26 6f 6e 6f 66 66   objv[2], &onoff
11ed0 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
11ee0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
11ef0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 65   }.    sqlite3_e
11f00 6e 61 62 6c 65 5f 6c 6f 61 64 5f 65 78 74 65 6e  nable_load_exten
11f10 73 69 6f 6e 28 70 44 62 2d 3e 64 62 2c 20 6f 6e  sion(pDb->db, on
11f20 6f 66 66 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b  off);.    break;
11f30 0a 23 65 6c 73 65 0a 20 20 20 20 54 63 6c 5f 41  .#else.    Tcl_A
11f40 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
11f50 72 70 2c 20 22 65 78 74 65 6e 73 69 6f 6e 20 6c  rp, "extension l
11f60 6f 61 64 69 6e 67 20 69 73 20 74 75 72 6e 65 64  oading is turned
11f70 20 6f 66 66 20 61 74 20 63 6f 6d 70 69 6c 65 2d   off at compile-
11f80 74 69 6d 65 22 2c 0a 20 20 20 20 20 20 20 20 20  time",.         
11f90 20 20 20 20 20 20 20 20 20 20 20 20 30 29 3b 0a              0);.
11fa0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
11fb0 52 52 4f 52 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  RROR;.#endif.  }
11fc0 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 24  ..  /*.  **    $
11fd0 64 62 20 65 72 72 6f 72 63 6f 64 65 0a 20 20 2a  db errorcode.  *
11fe0 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 74 68  *.  ** Return th
11ff0 65 20 6e 75 6d 65 72 69 63 20 65 72 72 6f 72 20  e numeric error 
12000 63 6f 64 65 20 74 68 61 74 20 77 61 73 20 72 65  code that was re
12010 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 6d 6f  turned by the mo
12020 73 74 20 72 65 63 65 6e 74 0a 20 20 2a 2a 20 63  st recent.  ** c
12030 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 65  all to sqlite3_e
12040 78 65 63 28 29 2e 0a 20 20 2a 2f 0a 20 20 63 61  xec()..  */.  ca
12050 73 65 20 44 42 5f 45 52 52 4f 52 43 4f 44 45 3a  se DB_ERRORCODE:
12060 20 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62   {.    Tcl_SetOb
12070 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
12080 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 71  Tcl_NewIntObj(sq
12090 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28 70 44  lite3_errcode(pD
120a0 62 2d 3e 64 62 29 29 29 3b 0a 20 20 20 20 62 72  b->db)));.    br
120b0 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  eak;.  }..  /*. 
120c0 20 2a 2a 20 20 20 20 24 64 62 20 65 78 69 73 74   **    $db exist
120d0 73 20 24 73 71 6c 0a 20 20 2a 2a 20 20 20 20 24  s $sql.  **    $
120e0 64 62 20 6f 6e 65 63 6f 6c 75 6d 6e 20 24 73 71  db onecolumn $sq
120f0 6c 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  l.  **.  ** The 
12100 6f 6e 65 63 6f 6c 75 6d 6e 20 6d 65 74 68 6f 64  onecolumn method
12110 20 69 73 20 74 68 65 20 65 71 75 69 76 61 6c 65   is the equivale
12120 6e 74 20 6f 66 3a 0a 20 20 2a 2a 20 20 20 20 20  nt of:.  **     
12130 6c 69 6e 64 65 78 20 5b 24 64 62 20 65 76 61 6c  lindex [$db eval
12140 20 24 73 71 6c 5d 20 30 0a 20 20 2a 2f 0a 20 20   $sql] 0.  */.  
12150 63 61 73 65 20 44 42 5f 45 58 49 53 54 53 3a 20  case DB_EXISTS: 
12160 0a 20 20 63 61 73 65 20 44 42 5f 4f 4e 45 43 4f  .  case DB_ONECO
12170 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 44 62 45 76  LUMN: {.    DbEv
12180 61 6c 43 6f 6e 74 65 78 74 20 73 45 76 61 6c 3b  alContext sEval;
12190 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 33  .    if( objc!=3
121a0 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72   ){.      Tcl_Wr
121b0 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
121c0 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 53 51 4c  p, 2, objv, "SQL
121d0 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
121e0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
121f0 7d 0a 0a 20 20 20 20 64 62 45 76 61 6c 49 6e 69  }..    dbEvalIni
12200 74 28 26 73 45 76 61 6c 2c 20 70 44 62 2c 20 6f  t(&sEval, pDb, o
12210 62 6a 76 5b 32 5d 2c 20 30 29 3b 0a 20 20 20 20  bjv[2], 0);.    
12220 72 63 20 3d 20 64 62 45 76 61 6c 53 74 65 70 28  rc = dbEvalStep(
12230 26 73 45 76 61 6c 29 3b 0a 20 20 20 20 69 66 28  &sEval);.    if(
12240 20 63 68 6f 69 63 65 3d 3d 44 42 5f 4f 4e 45 43   choice==DB_ONEC
12250 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 69  OLUMN ){.      i
12260 66 28 20 72 63 3d 3d 54 43 4c 5f 4f 4b 20 29 7b  f( rc==TCL_OK ){
12270 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 53 65 74  .        Tcl_Set
12280 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
12290 2c 20 64 62 45 76 61 6c 43 6f 6c 75 6d 6e 56 61  , dbEvalColumnVa
122a0 6c 75 65 28 26 73 45 76 61 6c 2c 20 30 29 29 3b  lue(&sEval, 0));
122b0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
122c0 20 72 63 3d 3d 54 43 4c 5f 42 52 45 41 4b 20 29   rc==TCL_BREAK )
122d0 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 52 65  {.        Tcl_Re
122e0 73 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  setResult(interp
122f0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
12300 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 54 43 4c  else if( rc==TCL
12310 5f 42 52 45 41 4b 20 7c 7c 20 72 63 3d 3d 54 43  _BREAK || rc==TC
12320 4c 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 54 63  L_OK ){.      Tc
12330 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
12340 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 42 6f  nterp, Tcl_NewBo
12350 6f 6c 65 61 6e 4f 62 6a 28 72 63 3d 3d 54 43 4c  oleanObj(rc==TCL
12360 5f 4f 4b 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20  _OK));.    }.   
12370 20 64 62 45 76 61 6c 46 69 6e 61 6c 69 7a 65 28   dbEvalFinalize(
12380 26 73 45 76 61 6c 29 3b 0a 0a 20 20 20 20 69 66  &sEval);..    if
12390 28 20 72 63 3d 3d 54 43 4c 5f 42 52 45 41 4b 20  ( rc==TCL_BREAK 
123a0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 54 43  ){.      rc = TC
123b0 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  L_OK;.    }.    
123c0 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 20 0a 20  break;.  }.   . 
123d0 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 24 64 62 20   /*.  **    $db 
123e0 65 76 61 6c 20 24 73 71 6c 20 3f 61 72 72 61 79  eval $sql ?array
123f0 3f 20 3f 7b 20 20 2e 2e 2e 63 6f 64 65 2e 2e 2e  ? ?{  ...code...
12400 20 7d 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68   }?.  **.  ** Th
12410 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  e SQL statement 
12420 69 6e 20 24 73 71 6c 20 69 73 20 65 76 61 6c 75  in $sql is evalu
12430 61 74 65 64 2e 20 20 46 6f 72 20 65 61 63 68 20  ated.  For each 
12440 72 6f 77 2c 20 74 68 65 20 76 61 6c 75 65 73 20  row, the values 
12450 61 72 65 0a 20 20 2a 2a 20 70 6c 61 63 65 64 20  are.  ** placed 
12460 69 6e 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74  in elements of t
12470 68 65 20 61 72 72 61 79 20 6e 61 6d 65 64 20 22  he array named "
12480 61 72 72 61 79 22 20 61 6e 64 20 2e 2e 2e 63 6f  array" and ...co
12490 64 65 2e 2e 2e 20 69 73 20 65 78 65 63 75 74 65  de... is execute
124a0 64 2e 0a 20 20 2a 2a 20 49 66 20 22 61 72 72 61  d..  ** If "arra
124b0 79 22 20 61 6e 64 20 22 63 6f 64 65 22 20 61 72  y" and "code" ar
124c0 65 20 6f 6d 69 74 74 65 64 2c 20 74 68 65 6e 20  e omitted, then 
124d0 6e 6f 20 63 61 6c 6c 62 61 63 6b 20 69 73 20 65  no callback is e
124e0 76 65 72 79 20 69 6e 76 6f 6b 65 64 2e 0a 20 20  very invoked..  
124f0 2a 2a 20 49 66 20 22 61 72 72 61 79 22 20 69 73  ** If "array" is
12500 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67   an empty string
12510 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65  , then the value
12520 73 20 61 72 65 20 70 6c 61 63 65 64 20 69 6e 20  s are placed in 
12530 76 61 72 69 61 62 6c 65 73 0a 20 20 2a 2a 20 74  variables.  ** t
12540 68 61 74 20 68 61 76 65 20 74 68 65 20 73 61 6d  hat have the sam
12550 65 20 6e 61 6d 65 20 61 73 20 74 68 65 20 66 69  e name as the fi
12560 65 6c 64 73 20 65 78 74 72 61 63 74 65 64 20 62  elds extracted b
12570 79 20 74 68 65 20 71 75 65 72 79 2e 0a 20 20 2a  y the query..  *
12580 2f 0a 20 20 63 61 73 65 20 44 42 5f 45 56 41 4c  /.  case DB_EVAL
12590 3a 20 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63  : {.    if( objc
125a0 3c 33 20 7c 7c 20 6f 62 6a 63 3e 35 20 29 7b 0a  <3 || objc>5 ){.
125b0 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
125c0 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
125d0 2c 20 6f 62 6a 76 2c 20 22 53 51 4c 20 3f 41 52  , objv, "SQL ?AR
125e0 52 41 59 2d 4e 41 4d 45 3f 20 3f 53 43 52 49 50  RAY-NAME? ?SCRIP
125f0 54 3f 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  T?");.      retu
12600 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
12610 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 6f 62 6a    }..    if( obj
12620 63 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20 44 62  c==3 ){.      Db
12630 45 76 61 6c 43 6f 6e 74 65 78 74 20 73 45 76 61  EvalContext sEva
12640 6c 3b 0a 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a  l;.      Tcl_Obj
12650 20 2a 70 52 65 74 20 3d 20 54 63 6c 5f 4e 65 77   *pRet = Tcl_New
12660 4f 62 6a 28 29 3b 0a 20 20 20 20 20 20 54 63 6c  Obj();.      Tcl
12670 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 52  _IncrRefCount(pR
12680 65 74 29 3b 0a 20 20 20 20 20 20 64 62 45 76 61  et);.      dbEva
12690 6c 49 6e 69 74 28 26 73 45 76 61 6c 2c 20 70 44  lInit(&sEval, pD
126a0 62 2c 20 6f 62 6a 76 5b 32 5d 2c 20 30 29 3b 0a  b, objv[2], 0);.
126b0 20 20 20 20 20 20 77 68 69 6c 65 28 20 54 43 4c        while( TCL
126c0 5f 4f 4b 3d 3d 28 72 63 20 3d 20 64 62 45 76 61  _OK==(rc = dbEva
126d0 6c 53 74 65 70 28 26 73 45 76 61 6c 29 29 20 29  lStep(&sEval)) )
126e0 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b  {.        int i;
126f0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43 6f  .        int nCo
12700 6c 3b 0a 20 20 20 20 20 20 20 20 64 62 45 76 61  l;.        dbEva
12710 6c 52 6f 77 49 6e 66 6f 28 26 73 45 76 61 6c 2c  lRowInfo(&sEval,
12720 20 26 6e 43 6f 6c 2c 20 30 29 3b 0a 20 20 20 20   &nCol, 0);.    
12730 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
12740 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
12750 20 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a       Tcl_ListObj
12760 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
12770 74 65 72 70 2c 20 70 52 65 74 2c 20 64 62 45 76  terp, pRet, dbEv
12780 61 6c 43 6f 6c 75 6d 6e 56 61 6c 75 65 28 26 73  alColumnValue(&s
12790 45 76 61 6c 2c 20 69 29 29 3b 0a 20 20 20 20 20  Eval, i));.     
127a0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
127b0 20 20 20 64 62 45 76 61 6c 46 69 6e 61 6c 69 7a     dbEvalFinaliz
127c0 65 28 26 73 45 76 61 6c 29 3b 0a 20 20 20 20 20  e(&sEval);.     
127d0 20 69 66 28 20 72 63 3d 3d 54 43 4c 5f 42 52 45   if( rc==TCL_BRE
127e0 41 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63  AK ){.        Tc
127f0 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
12800 6e 74 65 72 70 2c 20 70 52 65 74 29 3b 0a 20 20  nterp, pRet);.  
12810 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 4f        rc = TCL_O
12820 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  K;.      }.     
12830 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
12840 74 28 70 52 65 74 29 3b 0a 20 20 20 20 7d 65 6c  t(pRet);.    }el
12850 73 65 7b 0a 20 20 20 20 20 20 43 6c 69 65 6e 74  se{.      Client
12860 44 61 74 61 20 63 64 5b 32 5d 3b 0a 20 20 20 20  Data cd[2];.    
12870 20 20 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 20    DbEvalContext 
12880 2a 70 3b 0a 20 20 20 20 20 20 54 63 6c 5f 4f 62  *p;.      Tcl_Ob
12890 6a 20 2a 70 41 72 72 61 79 20 3d 20 30 3b 0a 20  j *pArray = 0;. 
128a0 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 53       Tcl_Obj *pS
128b0 63 72 69 70 74 3b 0a 0a 20 20 20 20 20 20 69 66  cript;..      if
128c0 28 20 6f 62 6a 63 3d 3d 35 20 26 26 20 2a 28 63  ( objc==5 && *(c
128d0 68 61 72 20 2a 29 54 63 6c 5f 47 65 74 53 74 72  har *)Tcl_GetStr
128e0 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 20 29 7b 0a  ing(objv[3]) ){.
128f0 20 20 20 20 20 20 20 20 70 41 72 72 61 79 20 3d          pArray =
12900 20 6f 62 6a 76 5b 33 5d 3b 0a 20 20 20 20 20 20   objv[3];.      
12910 7d 0a 20 20 20 20 20 20 70 53 63 72 69 70 74 20  }.      pScript 
12920 3d 20 6f 62 6a 76 5b 6f 62 6a 63 2d 31 5d 3b 0a  = objv[objc-1];.
12930 20 20 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65        Tcl_IncrRe
12940 66 43 6f 75 6e 74 28 70 53 63 72 69 70 74 29 3b  fCount(pScript);
12950 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20 70 20  .      .      p 
12960 3d 20 28 44 62 45 76 61 6c 43 6f 6e 74 65 78 74  = (DbEvalContext
12970 20 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28 73 69 7a   *)Tcl_Alloc(siz
12980 65 6f 66 28 44 62 45 76 61 6c 43 6f 6e 74 65 78  eof(DbEvalContex
12990 74 29 29 3b 0a 20 20 20 20 20 20 64 62 45 76 61  t));.      dbEva
129a0 6c 49 6e 69 74 28 70 2c 20 70 44 62 2c 20 6f 62  lInit(p, pDb, ob
129b0 6a 76 5b 32 5d 2c 20 70 41 72 72 61 79 29 3b 0a  jv[2], pArray);.
129c0 0a 20 20 20 20 20 20 63 64 5b 30 5d 20 3d 20 28  .      cd[0] = (
129d0 76 6f 69 64 20 2a 29 70 3b 0a 20 20 20 20 20 20  void *)p;.      
129e0 63 64 5b 31 5d 20 3d 20 28 76 6f 69 64 20 2a 29  cd[1] = (void *)
129f0 70 53 63 72 69 70 74 3b 0a 20 20 20 20 20 20 72  pScript;.      r
12a00 63 20 3d 20 44 62 45 76 61 6c 4e 65 78 74 43 6d  c = DbEvalNextCm
12a10 64 28 63 64 2c 20 69 6e 74 65 72 70 2c 20 54 43  d(cd, interp, TC
12a20 4c 5f 4f 4b 29 3b 0a 20 20 20 20 7d 0a 20 20 20  L_OK);.    }.   
12a30 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
12a40 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20 66  *.  **     $db f
12a50 75 6e 63 74 69 6f 6e 20 4e 41 4d 45 20 5b 2d 61  unction NAME [-a
12a60 72 67 63 6f 75 6e 74 20 4e 5d 20 53 43 52 49 50  rgcount N] SCRIP
12a70 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 72 65 61  T.  **.  ** Crea
12a80 74 65 20 61 20 6e 65 77 20 53 51 4c 20 66 75 6e  te a new SQL fun
12a90 63 74 69 6f 6e 20 63 61 6c 6c 65 64 20 4e 41 4d  ction called NAM
12aa0 45 2e 20 20 57 68 65 6e 65 76 65 72 20 74 68 61  E.  Whenever tha
12ab0 74 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a 20 20  t function is.  
12ac0 2a 2a 20 63 61 6c 6c 65 64 2c 20 69 6e 76 6f 6b  ** called, invok
12ad0 65 20 53 43 52 49 50 54 20 74 6f 20 65 76 61 6c  e SCRIPT to eval
12ae0 75 61 74 65 20 74 68 65 20 66 75 6e 63 74 69 6f  uate the functio
12af0 6e 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  n..  */.  case D
12b00 42 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20  B_FUNCTION: {.  
12b10 20 20 53 71 6c 46 75 6e 63 20 2a 70 46 75 6e 63    SqlFunc *pFunc
12b20 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  ;.    Tcl_Obj *p
12b30 53 63 72 69 70 74 3b 0a 20 20 20 20 63 68 61 72  Script;.    char
12b40 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 6e 74   *zName;.    int
12b50 20 6e 41 72 67 20 3d 20 2d 31 3b 0a 20 20 20 20   nArg = -1;.    
12b60 69 66 28 20 6f 62 6a 63 3d 3d 36 20 29 7b 0a 20  if( objc==6 ){. 
12b70 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
12b80 2a 7a 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  *z = Tcl_GetStri
12b90 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a 20 20 20  ng(objv[3]);.   
12ba0 20 20 20 69 6e 74 20 6e 20 3d 20 73 74 72 6c 65     int n = strle
12bb0 6e 33 30 28 7a 29 3b 0a 20 20 20 20 20 20 69 66  n30(z);.      if
12bc0 28 20 6e 3e 32 20 26 26 20 73 74 72 6e 63 6d 70  ( n>2 && strncmp
12bd0 28 7a 2c 20 22 2d 61 72 67 63 6f 75 6e 74 22 2c  (z, "-argcount",
12be0 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  n)==0 ){.       
12bf0 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46   if( Tcl_GetIntF
12c00 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
12c10 62 6a 76 5b 34 5d 2c 20 26 6e 41 72 67 29 20 29  bjv[4], &nArg) )
12c20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
12c30 52 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  R;.        if( n
12c40 41 72 67 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  Arg<0 ){.       
12c50 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
12c60 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 6e 75 6d  ult(interp, "num
12c70 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
12c80 20 6d 75 73 74 20 62 65 20 6e 6f 6e 2d 6e 65 67   must be non-neg
12c90 61 74 69 76 65 22 2c 0a 20 20 20 20 20 20 20 20  ative",.        
12ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12cb0 20 20 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20     (char*)0);.  
12cc0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54          return T
12cd0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  CL_ERROR;.      
12ce0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
12cf0 20 20 70 53 63 72 69 70 74 20 3d 20 6f 62 6a 76    pScript = objv
12d00 5b 35 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  [5];.    }else i
12d10 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20  f( objc!=4 ){.  
12d20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
12d30 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20  Args(interp, 2, 
12d40 6f 62 6a 76 2c 20 22 4e 41 4d 45 20 5b 2d 61 72  objv, "NAME [-ar
12d50 67 63 6f 75 6e 74 20 4e 5d 20 53 43 52 49 50 54  gcount N] SCRIPT
12d60 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
12d70 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
12d80 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 53 63  }else{.      pSc
12d90 72 69 70 74 20 3d 20 6f 62 6a 76 5b 33 5d 3b 0a  ript = objv[3];.
12da0 20 20 20 20 7d 0a 20 20 20 20 7a 4e 61 6d 65 20      }.    zName 
12db0 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  = Tcl_GetStringF
12dc0 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20  romObj(objv[2], 
12dd0 30 29 3b 0a 20 20 20 20 70 46 75 6e 63 20 3d 20  0);.    pFunc = 
12de0 66 69 6e 64 53 71 6c 46 75 6e 63 28 70 44 62 2c  findSqlFunc(pDb,
12df0 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28   zName);.    if(
12e00 20 70 46 75 6e 63 3d 3d 30 20 29 20 72 65 74 75   pFunc==0 ) retu
12e10 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
12e20 20 20 69 66 28 20 70 46 75 6e 63 2d 3e 70 53 63    if( pFunc->pSc
12e30 72 69 70 74 20 29 7b 0a 20 20 20 20 20 20 54 63  ript ){.      Tc
12e40 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70  l_DecrRefCount(p
12e50 46 75 6e 63 2d 3e 70 53 63 72 69 70 74 29 3b 0a  Func->pScript);.
12e60 20 20 20 20 7d 0a 20 20 20 20 70 46 75 6e 63 2d      }.    pFunc-
12e70 3e 70 53 63 72 69 70 74 20 3d 20 70 53 63 72 69  >pScript = pScri
12e80 70 74 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72  pt;.    Tcl_Incr
12e90 52 65 66 43 6f 75 6e 74 28 70 53 63 72 69 70 74  RefCount(pScript
12ea0 29 3b 0a 20 20 20 20 70 46 75 6e 63 2d 3e 75 73  );.    pFunc->us
12eb0 65 45 76 61 6c 4f 62 6a 76 20 3d 20 73 61 66 65  eEvalObjv = safe
12ec0 54 6f 55 73 65 45 76 61 6c 4f 62 6a 76 28 69 6e  ToUseEvalObjv(in
12ed0 74 65 72 70 2c 20 70 53 63 72 69 70 74 29 3b 0a  terp, pScript);.
12ee0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
12ef0 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
12f00 28 70 44 62 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c  (pDb->db, zName,
12f10 20 6e 41 72 67 2c 20 53 51 4c 49 54 45 5f 55 54   nArg, SQLITE_UT
12f20 46 38 2c 0a 20 20 20 20 20 20 20 20 70 46 75 6e  F8,.        pFun
12f30 63 2c 20 74 63 6c 53 71 6c 46 75 6e 63 2c 20 30  c, tclSqlFunc, 0
12f40 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
12f50 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
12f60 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45 52       rc = TCL_ER
12f70 52 4f 52 3b 0a 20 20 20 20 20 20 54 63 6c 5f 53  ROR;.      Tcl_S
12f80 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
12f90 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33   (char *)sqlite3
12fa0 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62 29  _errmsg(pDb->db)
12fb0 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b  , TCL_VOLATILE);
12fc0 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b  .    }.    break
12fd0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ;.  }..  /*.  **
12fe0 20 20 20 20 20 24 64 62 20 69 6e 63 72 62 6c 6f       $db incrblo
12ff0 62 20 3f 2d 72 65 61 64 6f 6e 6c 79 3f 20 3f 44  b ?-readonly? ?D
13000 42 3f 20 54 41 42 4c 45 20 43 4f 4c 55 4d 4e 20  B? TABLE COLUMN 
13010 52 4f 57 49 44 0a 20 20 2a 2f 0a 20 20 63 61 73  ROWID.  */.  cas
13020 65 20 44 42 5f 49 4e 43 52 42 4c 4f 42 3a 20 7b  e DB_INCRBLOB: {
13030 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
13040 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20  MIT_INCRBLOB.   
13050 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
13060 74 28 69 6e 74 65 72 70 2c 20 22 69 6e 63 72 62  t(interp, "incrb
13070 6c 6f 62 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c  lob not availabl
13080 65 20 69 6e 20 74 68 69 73 20 62 75 69 6c 64 22  e in this build"
13090 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
130a0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73   TCL_ERROR;.#els
130b0 65 0a 20 20 20 20 69 6e 74 20 69 73 52 65 61 64  e.    int isRead
130c0 6f 6e 6c 79 20 3d 20 30 3b 0a 20 20 20 20 63 6f  only = 0;.    co
130d0 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20  nst char *zDb = 
130e0 22 6d 61 69 6e 22 3b 0a 20 20 20 20 63 6f 6e 73  "main";.    cons
130f0 74 20 63 68 61 72 20 2a 7a 54 61 62 6c 65 3b 0a  t char *zTable;.
13100 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
13110 7a 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 73 71 6c  zColumn;.    sql
13120 69 74 65 5f 69 6e 74 36 34 20 69 52 6f 77 3b 0a  ite_int64 iRow;.
13130 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f  .    /* Check fo
13140 72 20 74 68 65 20 2d 72 65 61 64 6f 6e 6c 79 20  r the -readonly 
13150 6f 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 66  option */.    if
13160 28 20 6f 62 6a 63 3e 33 20 26 26 20 73 74 72 63  ( objc>3 && strc
13170 6d 70 28 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  mp(Tcl_GetString
13180 28 6f 62 6a 76 5b 32 5d 29 2c 20 22 2d 72 65 61  (objv[2]), "-rea
13190 64 6f 6e 6c 79 22 29 3d 3d 30 20 29 7b 0a 20 20  donly")==0 ){.  
131a0 20 20 20 20 69 73 52 65 61 64 6f 6e 6c 79 20 3d      isReadonly =
131b0 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69   1;.    }..    i
131c0 66 28 20 6f 62 6a 63 21 3d 28 35 2b 69 73 52 65  f( objc!=(5+isRe
131d0 61 64 6f 6e 6c 79 29 20 26 26 20 6f 62 6a 63 21  adonly) && objc!
131e0 3d 28 36 2b 69 73 52 65 61 64 6f 6e 6c 79 29 20  =(6+isReadonly) 
131f0 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f  ){.      Tcl_Wro
13200 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
13210 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 2d 72 65  , 2, objv, "?-re
13220 61 64 6f 6e 6c 79 3f 20 3f 44 42 3f 20 54 41 42  adonly? ?DB? TAB
13230 4c 45 20 43 4f 4c 55 4d 4e 20 52 4f 57 49 44 22  LE COLUMN ROWID"
13240 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
13250 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
13260 0a 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d  ..    if( objc==
13270 28 36 2b 69 73 52 65 61 64 6f 6e 6c 79 29 20 29  (6+isReadonly) )
13280 7b 0a 20 20 20 20 20 20 7a 44 62 20 3d 20 54 63  {.      zDb = Tc
13290 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
132a0 5b 32 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  [2]);.    }.    
132b0 7a 54 61 62 6c 65 20 3d 20 54 63 6c 5f 47 65 74  zTable = Tcl_Get
132c0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 6f 62 6a 63  String(objv[objc
132d0 2d 33 5d 29 3b 0a 20 20 20 20 7a 43 6f 6c 75 6d  -3]);.    zColum
132e0 6e 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  n = Tcl_GetStrin
132f0 67 28 6f 62 6a 76 5b 6f 62 6a 63 2d 32 5d 29 3b  g(objv[objc-2]);
13300 0a 20 20 20 20 72 63 20 3d 20 54 63 6c 5f 47 65  .    rc = Tcl_Ge
13310 74 57 69 64 65 49 6e 74 46 72 6f 6d 4f 62 6a 28  tWideIntFromObj(
13320 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 6f 62 6a  interp, objv[obj
13330 63 2d 31 5d 2c 20 26 69 52 6f 77 29 3b 0a 0a 20  c-1], &iRow);.. 
13340 20 20 20 69 66 28 20 72 63 3d 3d 54 43 4c 5f 4f     if( rc==TCL_O
13350 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
13360 63 72 65 61 74 65 49 6e 63 72 62 6c 6f 62 43 68  createIncrblobCh
13370 61 6e 6e 65 6c 28 0a 20 20 20 20 20 20 20 20 20  annel(.         
13380 20 69 6e 74 65 72 70 2c 20 70 44 62 2c 20 7a 44   interp, pDb, zD
13390 62 2c 20 7a 54 61 62 6c 65 2c 20 7a 43 6f 6c 75  b, zTable, zColu
133a0 6d 6e 2c 20 69 52 6f 77 2c 20 69 73 52 65 61 64  mn, iRow, isRead
133b0 6f 6e 6c 79 0a 20 20 20 20 20 20 29 3b 0a 20 20  only.      );.  
133c0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 62    }.#endif.    b
133d0 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a  reak;.  }..  /*.
133e0 20 20 2a 2a 20 20 20 20 20 24 64 62 20 69 6e 74    **     $db int
133f0 65 72 72 75 70 74 0a 20 20 2a 2a 0a 20 20 2a 2a  errupt.  **.  **
13400 20 49 6e 74 65 72 72 75 70 74 20 74 68 65 20 65   Interrupt the e
13410 78 65 63 75 74 69 6f 6e 20 6f 66 20 74 68 65 20  xecution of the 
13420 69 6e 6e 65 72 2d 6d 6f 73 74 20 53 51 4c 20 69  inner-most SQL i
13430 6e 74 65 72 70 72 65 74 65 72 2e 20 20 54 68 69  nterpreter.  Thi
13440 73 0a 20 20 2a 2a 20 63 61 75 73 65 73 20 74 68  s.  ** causes th
13450 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  e SQL statement 
13460 74 6f 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72  to return an err
13470 6f 72 20 6f 66 20 53 51 4c 49 54 45 5f 49 4e 54  or of SQLITE_INT
13480 45 52 52 55 50 54 2e 0a 20 20 2a 2f 0a 20 20 63  ERRUPT..  */.  c
13490 61 73 65 20 44 42 5f 49 4e 54 45 52 52 55 50 54  ase DB_INTERRUPT
134a0 3a 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  : {.    sqlite3_
134b0 69 6e 74 65 72 72 75 70 74 28 70 44 62 2d 3e 64  interrupt(pDb->d
134c0 62 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20  b);.    break;. 
134d0 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20   }..  /*.  **   
134e0 20 20 24 64 62 20 6e 75 6c 6c 76 61 6c 75 65 20    $db nullvalue 
134f0 3f 53 54 52 49 4e 47 3f 0a 20 20 2a 2a 0a 20 20  ?STRING?.  **.  
13500 2a 2a 20 43 68 61 6e 67 65 20 74 65 78 74 20 75  ** Change text u
13510 73 65 64 20 77 68 65 6e 20 61 20 4e 55 4c 4c 20  sed when a NULL 
13520 63 6f 6d 65 73 20 62 61 63 6b 20 66 72 6f 6d 20  comes back from 
13530 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 49 66  the database. If
13540 20 3f 53 54 52 49 4e 47 3f 0a 20 20 2a 2a 20 69   ?STRING?.  ** i
13550 73 20 6e 6f 74 20 70 72 65 73 65 6e 74 2c 20 74  s not present, t
13560 68 65 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20  hen the current 
13570 73 74 72 69 6e 67 20 75 73 65 64 20 66 6f 72 20  string used for 
13580 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64  NULL is returned
13590 2e 0a 20 20 2a 2a 20 49 66 20 53 54 52 49 4e 47  ..  ** If STRING
135a0 20 69 73 20 70 72 65 73 65 6e 74 2c 20 74 68 65   is present, the
135b0 6e 20 53 54 52 49 4e 47 20 69 73 20 72 65 74 75  n STRING is retu
135c0 72 6e 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2f 0a  rned..  **.  */.
135d0 20 20 63 61 73 65 20 44 42 5f 4e 55 4c 4c 56 41    case DB_NULLVA
135e0 4c 55 45 3a 20 7b 0a 20 20 20 20 69 66 28 20 6f  LUE: {.    if( o
135f0 62 6a 63 21 3d 32 20 26 26 20 6f 62 6a 63 21 3d  bjc!=2 && objc!=
13600 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57  3 ){.      Tcl_W
13610 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
13620 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 4e 55  rp, 2, objv, "NU
13630 4c 4c 56 41 4c 55 45 22 29 3b 0a 20 20 20 20 20  LLVALUE");.     
13640 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
13650 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  R;.    }.    if(
13660 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20 20 20 20   objc==3 ){.    
13670 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20    int len;.     
13680 20 63 68 61 72 20 2a 7a 4e 75 6c 6c 20 3d 20 54   char *zNull = T
13690 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
136a0 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65  Obj(objv[2], &le
136b0 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44  n);.      if( pD
136c0 62 2d 3e 7a 4e 75 6c 6c 20 29 7b 0a 20 20 20 20  b->zNull ){.    
136d0 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62      Tcl_Free(pDb
136e0 2d 3e 7a 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  ->zNull);.      
136f0 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 4e 75 6c  }.      if( zNul
13700 6c 20 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20 20  l && len>0 ){.  
13710 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e 75 6c 6c        pDb->zNull
13720 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65   = Tcl_Alloc( le
13730 6e 20 2b 20 31 20 29 3b 0a 20 20 20 20 20 20 20  n + 1 );.       
13740 20 6d 65 6d 63 70 79 28 70 44 62 2d 3e 7a 4e 75   memcpy(pDb->zNu
13750 6c 6c 2c 20 7a 4e 75 6c 6c 2c 20 6c 65 6e 29 3b  ll, zNull, len);
13760 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e  .        pDb->zN
13770 75 6c 6c 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b  ull[len] = '\0';
13780 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
13790 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e 75 6c 6c        pDb->zNull
137a0 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
137b0 20 20 7d 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f    }.    Tcl_SetO
137c0 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
137d0 20 64 62 54 65 78 74 54 6f 4f 62 6a 28 70 44 62   dbTextToObj(pDb
137e0 2d 3e 7a 4e 75 6c 6c 29 29 3b 0a 20 20 20 20 62  ->zNull));.    b
137f0 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a  reak;.  }..  /*.
13800 20 20 2a 2a 20 20 20 20 20 24 64 62 20 6c 61 73    **     $db las
13810 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 20 0a  t_insert_rowid .
13820 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e    **.  ** Return
13830 20 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63   an integer whic
13840 68 20 69 73 20 74 68 65 20 52 4f 57 49 44 20 66  h is the ROWID f
13850 6f 72 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  or the most rece
13860 6e 74 20 69 6e 73 65 72 74 2e 0a 20 20 2a 2f 0a  nt insert..  */.
13870 20 20 63 61 73 65 20 44 42 5f 4c 41 53 54 5f 49    case DB_LAST_I
13880 4e 53 45 52 54 5f 52 4f 57 49 44 3a 20 7b 0a 20  NSERT_ROWID: {. 
13890 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 73     Tcl_Obj *pRes
138a0 75 6c 74 3b 0a 20 20 20 20 54 63 6c 5f 57 69 64  ult;.    Tcl_Wid
138b0 65 49 6e 74 20 72 6f 77 69 64 3b 0a 20 20 20 20  eInt rowid;.    
138c0 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20  if( objc!=2 ){. 
138d0 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
138e0 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
138f0 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 20 20 20 20   objv, "");.    
13900 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
13910 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 6f  OR;.    }.    ro
13920 77 69 64 20 3d 20 73 71 6c 69 74 65 33 5f 6c 61  wid = sqlite3_la
13930 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 28  st_insert_rowid(
13940 70 44 62 2d 3e 64 62 29 3b 0a 20 20 20 20 70 52  pDb->db);.    pR
13950 65 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65 74 4f  esult = Tcl_GetO
13960 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29  bjResult(interp)
13970 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 57 69 64  ;.    Tcl_SetWid
13980 65 49 6e 74 4f 62 6a 28 70 52 65 73 75 6c 74 2c  eIntObj(pResult,
13990 20 72 6f 77 69 64 29 3b 0a 20 20 20 20 62 72 65   rowid);.    bre
139a0 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  ak;.  }..  /*.  
139b0 2a 2a 20 54 68 65 20 44 42 5f 4f 4e 45 43 4f 4c  ** The DB_ONECOL
139c0 55 4d 4e 20 6d 65 74 68 6f 64 20 69 73 20 69 6d  UMN method is im
139d0 70 6c 65 6d 65 6e 74 65 64 20 74 6f 67 65 74 68  plemented togeth
139e0 65 72 20 77 69 74 68 20 44 42 5f 45 58 49 53 54  er with DB_EXIST
139f0 53 2e 0a 20 20 2a 2f 0a 0a 20 20 2f 2a 20 20 20  S..  */..  /*   
13a00 20 24 64 62 20 70 72 6f 67 72 65 73 73 20 3f 4e   $db progress ?N
13a10 20 43 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a 20   CALLBACK?.  ** 
13a20 0a 20 20 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65  .  ** Invoke the
13a30 20 67 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b 20   given callback 
13a40 65 76 65 72 79 20 4e 20 76 69 72 74 75 61 6c 20  every N virtual 
13a50 6d 61 63 68 69 6e 65 20 6f 70 63 6f 64 65 73 20  machine opcodes 
13a60 77 68 69 6c 65 20 65 78 65 63 75 74 69 6e 67 0a  while executing.
13a70 20 20 2a 2a 20 71 75 65 72 69 65 73 2e 0a 20 20    ** queries..  
13a80 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 50 52 4f  */.  case DB_PRO
13a90 47 52 45 53 53 3a 20 7b 0a 20 20 20 20 69 66 28  GRESS: {.    if(
13aa0 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20   objc==2 ){.    
13ab0 20 20 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f 67    if( pDb->zProg
13ac0 72 65 73 73 20 29 7b 0a 20 20 20 20 20 20 20 20  ress ){.        
13ad0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
13ae0 28 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a 50  (interp, pDb->zP
13af0 72 6f 67 72 65 73 73 2c 20 30 29 3b 0a 20 20 20  rogress, 0);.   
13b00 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69     }.    }else i
13b10 66 28 20 6f 62 6a 63 3d 3d 34 20 29 7b 0a 20 20  f( objc==4 ){.  
13b20 20 20 20 20 63 68 61 72 20 2a 7a 50 72 6f 67 72      char *zProgr
13b30 65 73 73 3b 0a 20 20 20 20 20 20 69 6e 74 20 6c  ess;.      int l
13b40 65 6e 3b 0a 20 20 20 20 20 20 69 6e 74 20 4e 3b  en;.      int N;
13b50 0a 20 20 20 20 20 20 69 66 28 20 54 43 4c 5f 4f  .      if( TCL_O
13b60 4b 21 3d 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  K!=Tcl_GetIntFro
13b70 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
13b80 76 5b 32 5d 2c 20 26 4e 29 20 29 7b 0a 20 20 20  v[2], &N) ){.   
13b90 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
13ba0 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 3b 0a  ERROR;.      };.
13bb0 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a        if( pDb->z
13bc0 50 72 6f 67 72 65 73 73 20 29 7b 0a 20 20 20 20  Progress ){.    
13bd0 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62      Tcl_Free(pDb
13be0 2d 3e 7a 50 72 6f 67 72 65 73 73 29 3b 0a 20 20  ->zProgress);.  
13bf0 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 50 72 6f      }.      zPro
13c00 67 72 65 73 73 20 3d 20 54 63 6c 5f 47 65 74 53  gress = Tcl_GetS
13c10 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
13c20 76 5b 33 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20 20  v[3], &len);.   
13c30 20 20 20 69 66 28 20 7a 50 72 6f 67 72 65 73 73     if( zProgress
13c40 20 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20 20 20   && len>0 ){.   
13c50 20 20 20 20 20 70 44 62 2d 3e 7a 50 72 6f 67 72       pDb->zProgr
13c60 65 73 73 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28  ess = Tcl_Alloc(
13c70 20 6c 65 6e 20 2b 20 31 20 29 3b 0a 20 20 20 20   len + 1 );.    
13c80 20 20 20 20 6d 65 6d 63 70 79 28 70 44 62 2d 3e      memcpy(pDb->
13c90 7a 50 72 6f 67 72 65 73 73 2c 20 7a 50 72 6f 67  zProgress, zProg
13ca0 72 65 73 73 2c 20 6c 65 6e 2b 31 29 3b 0a 20 20  ress, len+1);.  
13cb0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
13cc0 20 20 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73     pDb->zProgres
13cd0 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23  s = 0;.      }.#
13ce0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
13cf0 49 54 5f 50 52 4f 47 52 45 53 53 5f 43 41 4c 4c  IT_PROGRESS_CALL
13d00 42 41 43 4b 0a 20 20 20 20 20 20 69 66 28 20 70  BACK.      if( p
13d10 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 20 29 7b  Db->zProgress ){
13d20 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 69 6e  .        pDb->in
13d30 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20  terp = interp;. 
13d40 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 70         sqlite3_p
13d50 72 6f 67 72 65 73 73 5f 68 61 6e 64 6c 65 72 28  rogress_handler(
13d60 70 44 62 2d 3e 64 62 2c 20 4e 2c 20 44 62 50 72  pDb->db, N, DbPr
13d70 6f 67 72 65 73 73 48 61 6e 64 6c 65 72 2c 20 70  ogressHandler, p
13d80 44 62 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  Db);.      }else
13d90 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
13da0 33 5f 70 72 6f 67 72 65 73 73 5f 68 61 6e 64 6c  3_progress_handl
13db0 65 72 28 70 44 62 2d 3e 64 62 2c 20 30 2c 20 30  er(pDb->db, 0, 0
13dc0 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65  , 0);.      }.#e
13dd0 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ndif.    }else{.
13de0 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
13df0 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
13e00 2c 20 6f 62 6a 76 2c 20 22 4e 20 43 41 4c 4c 42  , objv, "N CALLB
13e10 41 43 4b 22 29 3b 0a 20 20 20 20 20 20 72 65 74  ACK");.      ret
13e20 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
13e30 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a     }.    break;.
13e40 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62    }..  /*    $db
13e50 20 70 72 6f 66 69 6c 65 20 3f 43 41 4c 4c 42 41   profile ?CALLBA
13e60 43 4b 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 61  CK?.  **.  ** Ma
13e70 6b 65 20 61 72 72 61 6e 67 65 6d 65 6e 74 73 20  ke arrangements 
13e80 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20 43 41  to invoke the CA
13e90 4c 4c 42 41 43 4b 20 72 6f 75 74 69 6e 65 20 61  LLBACK routine a
13ea0 66 74 65 72 20 65 61 63 68 20 53 51 4c 20 73 74  fter each SQL st
13eb0 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 68 61  atement.  ** tha
13ec0 74 20 68 61 73 20 72 75 6e 2e 20 20 54 68 65 20  t has run.  The 
13ed0 74 65 78 74 20 6f 66 20 74 68 65 20 53 51 4c 20  text of the SQL 
13ee0 61 6e 64 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f  and the amount o
13ef0 66 20 65 6c 61 70 73 65 20 74 69 6d 65 20 61 72  f elapse time ar
13f00 65 0a 20 20 2a 2a 20 61 70 70 65 6e 64 65 64 20  e.  ** appended 
13f10 74 6f 20 43 41 4c 4c 42 41 43 4b 20 62 65 66 6f  to CALLBACK befo
13f20 72 65 20 74 68 65 20 73 63 72 69 70 74 20 69 73  re the script is
13f30 20 72 75 6e 2e 0a 20 20 2a 2f 0a 20 20 63 61 73   run..  */.  cas
13f40 65 20 44 42 5f 50 52 4f 46 49 4c 45 3a 20 7b 0a  e DB_PROFILE: {.
13f50 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 33 20 29      if( objc>3 )
13f60 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e  {.      Tcl_Wron
13f70 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
13f80 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 43 41 4c 4c   2, objv, "?CALL
13f90 42 41 43 4b 3f 22 29 3b 0a 20 20 20 20 20 20 72  BACK?");.      r
13fa0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
13fb0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f  .    }else if( o
13fc0 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20  bjc==2 ){.      
13fd0 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c  if( pDb->zProfil
13fe0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c  e ){.        Tcl
13ff0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
14000 74 65 72 70 2c 20 70 44 62 2d 3e 7a 50 72 6f 66  terp, pDb->zProf
14010 69 6c 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  ile, 0);.      }
14020 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
14030 20 20 63 68 61 72 20 2a 7a 50 72 6f 66 69 6c 65    char *zProfile
14040 3b 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b  ;.      int len;
14050 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e  .      if( pDb->
14060 7a 50 72 6f 66 69 6c 65 20 29 7b 0a 20 20 20 20  zProfile ){.    
14070 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62      Tcl_Free(pDb
14080 2d 3e 7a 50 72 6f 66 69 6c 65 29 3b 0a 20 20 20  ->zProfile);.   
14090 20 20 20 7d 0a 20 20 20 20 20 20 7a 50 72 6f 66     }.      zProf
140a0 69 6c 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  ile = Tcl_GetStr
140b0 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
140c0 32 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20  2], &len);.     
140d0 20 69 66 28 20 7a 50 72 6f 66 69 6c 65 20 26 26   if( zProfile &&
140e0 20 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20   len>0 ){.      
140f0 20 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 20    pDb->zProfile 
14100 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e  = Tcl_Alloc( len
14110 20 2b 20 31 20 29 3b 0a 20 20 20 20 20 20 20 20   + 1 );.        
14120 6d 65 6d 63 70 79 28 70 44 62 2d 3e 7a 50 72 6f  memcpy(pDb->zPro
14130 66 69 6c 65 2c 20 7a 50 72 6f 66 69 6c 65 2c 20  file, zProfile, 
14140 6c 65 6e 2b 31 29 3b 0a 20 20 20 20 20 20 7d 65  len+1);.      }e
14150 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 44 62  lse{.        pDb
14160 2d 3e 7a 50 72 6f 66 69 6c 65 20 3d 20 30 3b 0a  ->zProfile = 0;.
14170 20 20 20 20 20 20 7d 0a 23 69 66 20 21 64 65 66        }.#if !def
14180 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
14190 5f 54 52 41 43 45 29 20 26 26 20 21 64 65 66 69  _TRACE) && !defi
141a0 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
141b0 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 29 0a  FLOATING_POINT).
141c0 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a        if( pDb->z
141d0 50 72 6f 66 69 6c 65 20 29 7b 0a 20 20 20 20 20  Profile ){.     
141e0 20 20 20 70 44 62 2d 3e 69 6e 74 65 72 70 20 3d     pDb->interp =
141f0 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 20 20 20   interp;.       
14200 20 73 71 6c 69 74 65 33 5f 70 72 6f 66 69 6c 65   sqlite3_profile
14210 28 70 44 62 2d 3e 64 62 2c 20 44 62 50 72 6f 66  (pDb->db, DbProf
14220 69 6c 65 48 61 6e 64 6c 65 72 2c 20 70 44 62 29  ileHandler, pDb)
14230 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
14240 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 70         sqlite3_p
14250 72 6f 66 69 6c 65 28 70 44 62 2d 3e 64 62 2c 20  rofile(pDb->db, 
14260 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23  0, 0);.      }.#
14270 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20  endif.    }.    
14280 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
14290 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20 72 65  .  **     $db re
142a0 6b 65 79 20 4b 45 59 0a 20 20 2a 2a 0a 20 20 2a  key KEY.  **.  *
142b0 2a 20 43 68 61 6e 67 65 20 74 68 65 20 65 6e 63  * Change the enc
142c0 72 79 70 74 69 6f 6e 20 6b 65 79 20 6f 6e 20 74  ryption key on t
142d0 68 65 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65  he currently ope
142e0 6e 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f  n database..  */
142f0 0a 20 20 63 61 73 65 20 44 42 5f 52 45 4b 45 59  .  case DB_REKEY
14300 3a 20 7b 0a 20 20 20 20 69 6e 74 20 6e 4b 65 79  : {.    int nKey
14310 3b 0a 20 20 20 20 76 6f 69 64 20 2a 70 4b 65 79  ;.    void *pKey
14320 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d  ;.    if( objc!=
14330 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57  3 ){.      Tcl_W
14340 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
14350 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 4b 45  rp, 2, objv, "KE
14360 59 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  Y");.      retur
14370 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
14380 20 7d 0a 20 20 20 20 70 4b 65 79 20 3d 20 54 63   }.    pKey = Tc
14390 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79 46 72  l_GetByteArrayFr
143a0 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26  omObj(objv[2], &
143b0 6e 4b 65 79 29 3b 0a 23 69 66 64 65 66 20 53 51  nKey);.#ifdef SQ
143c0 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20  LITE_HAS_CODEC. 
143d0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
143e0 72 65 6b 65 79 28 70 44 62 2d 3e 64 62 2c 20 70  rekey(pDb->db, p
143f0 4b 65 79 2c 20 6e 4b 65 79 29 3b 0a 20 20 20 20  Key, nKey);.    
14400 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
14410 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
14420 28 69 6e 74 65 72 70 2c 20 73 71 6c 69 74 65 33  (interp, sqlite3
14430 45 72 72 53 74 72 28 72 63 29 2c 20 30 29 3b 0a  ErrStr(rc), 0);.
14440 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45        rc = TCL_E
14450 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  RROR;.    }.#end
14460 69 66 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  if.    break;.  
14470 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 72  }..  /*    $db r
14480 65 73 74 6f 72 65 20 3f 44 41 54 41 42 41 53 45  estore ?DATABASE
14490 3f 20 46 49 4c 45 4e 41 4d 45 0a 20 20 2a 2a 0a  ? FILENAME.  **.
144a0 20 20 2a 2a 20 4f 70 65 6e 20 61 20 64 61 74 61    ** Open a data
144b0 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 64 20  base file named 
144c0 46 49 4c 45 4e 41 4d 45 2e 20 20 54 72 61 6e 73  FILENAME.  Trans
144d0 66 65 72 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  fer the content 
144e0 0a 20 20 2a 2a 20 6f 66 20 46 49 4c 45 4e 41 4d  .  ** of FILENAM
144f0 45 20 69 6e 74 6f 20 74 68 65 20 6c 6f 63 61 6c  E into the local
14500 20 64 61 74 61 62 61 73 65 20 44 41 54 41 42 41   database DATABA
14510 53 45 20 28 64 65 66 61 75 6c 74 3a 20 22 6d 61  SE (default: "ma
14520 69 6e 22 29 2e 0a 20 20 2a 2f 0a 20 20 63 61 73  in")..  */.  cas
14530 65 20 44 42 5f 52 45 53 54 4f 52 45 3a 20 7b 0a  e DB_RESTORE: {.
14540 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
14550 7a 53 72 63 46 69 6c 65 3b 0a 20 20 20 20 63 6f  zSrcFile;.    co
14560 6e 73 74 20 63 68 61 72 20 2a 7a 44 65 73 74 44  nst char *zDestD
14570 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a  b;.    sqlite3 *
14580 70 53 72 63 3b 0a 20 20 20 20 73 71 6c 69 74 65  pSrc;.    sqlite
14590 33 5f 62 61 63 6b 75 70 20 2a 70 42 61 63 6b 75  3_backup *pBacku
145a0 70 3b 0a 20 20 20 20 69 6e 74 20 6e 54 69 6d 65  p;.    int nTime
145b0 6f 75 74 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66  out = 0;..    if
145c0 28 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20 20 20  ( objc==3 ){.   
145d0 20 20 20 7a 44 65 73 74 44 62 20 3d 20 22 6d 61     zDestDb = "ma
145e0 69 6e 22 3b 0a 20 20 20 20 20 20 7a 53 72 63 46  in";.      zSrcF
145f0 69 6c 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  ile = Tcl_GetStr
14600 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20  ing(objv[2]);.  
14610 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a 63    }else if( objc
14620 3d 3d 34 20 29 7b 0a 20 20 20 20 20 20 7a 44 65  ==4 ){.      zDe
14630 73 74 44 62 20 3d 20 54 63 6c 5f 47 65 74 53 74  stDb = Tcl_GetSt
14640 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20  ring(objv[2]);. 
14650 20 20 20 20 20 7a 53 72 63 46 69 6c 65 20 3d 20       zSrcFile = 
14660 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
14670 6a 76 5b 33 5d 29 3b 0a 20 20 20 20 7d 65 6c 73  jv[3]);.    }els
14680 65 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f  e{.      Tcl_Wro
14690 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
146a0 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 44 41 54  , 2, objv, "?DAT
146b0 41 42 41 53 45 3f 20 46 49 4c 45 4e 41 4d 45 22  ABASE? FILENAME"
146c0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
146d0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
146e0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
146f0 33 5f 6f 70 65 6e 5f 76 32 28 7a 53 72 63 46 69  3_open_v2(zSrcFi
14700 6c 65 2c 20 26 70 53 72 63 2c 20 53 51 4c 49 54  le, &pSrc, SQLIT
14710 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 2c  E_OPEN_READONLY,
14720 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21   0);.    if( rc!
14730 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
14740 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
14750 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 63 61  sult(interp, "ca
14760 6e 6e 6f 74 20 6f 70 65 6e 20 73 6f 75 72 63 65  nnot open source
14770 20 64 61 74 61 62 61 73 65 3a 20 22 2c 0a 20 20   database: ",.  
14780 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
14790 5f 65 72 72 6d 73 67 28 70 53 72 63 29 2c 20 28  _errmsg(pSrc), (
147a0 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20  char*)0);.      
147b0 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70 53  sqlite3_close(pS
147c0 72 63 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  rc);.      retur
147d0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
147e0 20 7d 0a 20 20 20 20 70 42 61 63 6b 75 70 20 3d   }.    pBackup =
147f0 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f   sqlite3_backup_
14800 69 6e 69 74 28 70 44 62 2d 3e 64 62 2c 20 7a 44  init(pDb->db, zD
14810 65 73 74 44 62 2c 20 70 53 72 63 2c 20 22 6d 61  estDb, pSrc, "ma
14820 69 6e 22 29 3b 0a 20 20 20 20 69 66 28 20 70 42  in");.    if( pB
14830 61 63 6b 75 70 3d 3d 30 20 29 7b 0a 20 20 20 20  ackup==0 ){.    
14840 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
14850 6c 74 28 69 6e 74 65 72 70 2c 20 22 72 65 73 74  lt(interp, "rest
14860 6f 72 65 20 66 61 69 6c 65 64 3a 20 22 2c 0a 20  ore failed: ",. 
14870 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
14880 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62  3_errmsg(pDb->db
14890 29 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  ), (char*)0);.  
148a0 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73      sqlite3_clos
148b0 65 28 70 53 72 63 29 3b 0a 20 20 20 20 20 20 72  e(pSrc);.      r
148c0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
148d0 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c 65  .    }.    while
148e0 28 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  ( (rc = sqlite3_
148f0 62 61 63 6b 75 70 5f 73 74 65 70 28 70 42 61 63  backup_step(pBac
14900 6b 75 70 2c 31 30 30 29 29 3d 3d 53 51 4c 49 54  kup,100))==SQLIT
14910 45 5f 4f 4b 0a 20 20 20 20 20 20 20 20 20 20 20  E_OK.           
14920 20 20 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45     || rc==SQLITE
14930 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20 69  _BUSY ){.      i
14940 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55  f( rc==SQLITE_BU
14950 53 59 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  SY ){.        if
14960 28 20 6e 54 69 6d 65 6f 75 74 2b 2b 20 3e 3d 20  ( nTimeout++ >= 
14970 33 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  3 ) break;.     
14980 20 20 20 73 71 6c 69 74 65 33 5f 73 6c 65 65 70     sqlite3_sleep
14990 28 31 30 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  (100);.      }. 
149a0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
149b0 5f 62 61 63 6b 75 70 5f 66 69 6e 69 73 68 28 70  _backup_finish(p
149c0 42 61 63 6b 75 70 29 3b 0a 20 20 20 20 69 66 28  Backup);.    if(
149d0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc==SQLITE_DONE
149e0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 54   ){.      rc = T
149f0 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65  CL_OK;.    }else
14a00 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
14a10 42 55 53 59 20 7c 7c 20 72 63 3d 3d 53 51 4c 49  BUSY || rc==SQLI
14a20 54 45 5f 4c 4f 43 4b 45 44 20 29 7b 0a 20 20 20  TE_LOCKED ){.   
14a30 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
14a40 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 72 65 73  ult(interp, "res
14a50 74 6f 72 65 20 66 61 69 6c 65 64 3a 20 73 6f 75  tore failed: sou
14a60 72 63 65 20 64 61 74 61 62 61 73 65 20 62 75 73  rce database bus
14a70 79 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  y",.            
14a80 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
14a90 2a 29 30 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  *)0);.      rc =
14aa0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
14ab0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 54 63 6c  }else{.      Tcl
14ac0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
14ad0 74 65 72 70 2c 20 22 72 65 73 74 6f 72 65 20 66  terp, "restore f
14ae0 61 69 6c 65 64 3a 20 22 2c 0a 20 20 20 20 20 20  ailed: ",.      
14af0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65 72 72       sqlite3_err
14b00 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c 20 28 63  msg(pDb->db), (c
14b10 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 72  har*)0);.      r
14b20 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  c = TCL_ERROR;. 
14b30 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
14b40 5f 63 6c 6f 73 65 28 70 53 72 63 29 3b 0a 20 20  _close(pSrc);.  
14b50 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
14b60 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20  /*.  **     $db 
14b70 73 74 61 74 75 73 20 28 73 74 65 70 7c 73 6f 72  status (step|sor
14b80 74 7c 61 75 74 6f 69 6e 64 65 78 29 0a 20 20 2a  t|autoindex).  *
14b90 2a 0a 20 20 2a 2a 20 44 69 73 70 6c 61 79 20 53  *.  ** Display S
14ba0 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53  QLITE_STMTSTATUS
14bb0 5f 46 55 4c 4c 53 43 41 4e 5f 53 54 45 50 20 6f  _FULLSCAN_STEP o
14bc0 72 20 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 53  r .  ** SQLITE_S
14bd0 54 4d 54 53 54 41 54 55 53 5f 53 4f 52 54 20 66  TMTSTATUS_SORT f
14be0 6f 72 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  or the most rece
14bf0 6e 74 20 65 76 61 6c 2e 0a 20 20 2a 2f 0a 20 20  nt eval..  */.  
14c00 63 61 73 65 20 44 42 5f 53 54 41 54 55 53 3a 20  case DB_STATUS: 
14c10 7b 0a 20 20 20 20 69 6e 74 20 76 3b 0a 20 20 20  {.    int v;.   
14c20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70   const char *zOp
14c30 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d  ;.    if( objc!=
14c40 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57  3 ){.      Tcl_W
14c50 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
14c60 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 28 73  rp, 2, objv, "(s
14c70 74 65 70 7c 73 6f 72 74 7c 61 75 74 6f 69 6e 64  tep|sort|autoind
14c80 65 78 29 22 29 3b 0a 20 20 20 20 20 20 72 65 74  ex)");.      ret
14c90 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
14ca0 20 20 20 7d 0a 20 20 20 20 7a 4f 70 20 3d 20 54     }.    zOp = T
14cb0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
14cc0 76 5b 32 5d 29 3b 0a 20 20 20 20 69 66 28 20 73  v[2]);.    if( s
14cd0 74 72 63 6d 70 28 7a 4f 70 2c 20 22 73 74 65 70  trcmp(zOp, "step
14ce0 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 76  ")==0 ){.      v
14cf0 20 3d 20 70 44 62 2d 3e 6e 53 74 65 70 3b 0a 20   = pDb->nStep;. 
14d00 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
14d10 63 6d 70 28 7a 4f 70 2c 20 22 73 6f 72 74 22 29  cmp(zOp, "sort")
14d20 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 76 20 3d  ==0 ){.      v =
14d30 20 70 44 62 2d 3e 6e 53 6f 72 74 3b 0a 20 20 20   pDb->nSort;.   
14d40 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
14d50 70 28 7a 4f 70 2c 20 22 61 75 74 6f 69 6e 64 65  p(zOp, "autoinde
14d60 78 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  x")==0 ){.      
14d70 76 20 3d 20 70 44 62 2d 3e 6e 49 6e 64 65 78 3b  v = pDb->nIndex;
14d80 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
14d90 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
14da0 6c 74 28 69 6e 74 65 72 70 2c 20 0a 20 20 20 20  lt(interp, .    
14db0 20 20 20 20 20 20 20 20 22 62 61 64 20 61 72 67          "bad arg
14dc0 75 6d 65 6e 74 3a 20 73 68 6f 75 6c 64 20 62 65  ument: should be
14dd0 20 61 75 74 6f 69 6e 64 65 78 2c 20 73 74 65 70   autoindex, step
14de0 2c 20 6f 72 20 73 6f 72 74 22 2c 20 0a 20 20 20  , or sort", .   
14df0 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29           (char*)
14e00 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  0);.      return
14e10 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
14e20 7d 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a  }.    Tcl_SetObj
14e30 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
14e40 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 76 29 29  cl_NewIntObj(v))
14e50 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  ;.    break;.  }
14e60 0a 20 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20  .  .  /*.  **   
14e70 20 20 24 64 62 20 74 69 6d 65 6f 75 74 20 4d 49    $db timeout MI
14e80 4c 4c 45 53 45 43 4f 4e 44 53 0a 20 20 2a 2a 0a  LLESECONDS.  **.
14e90 20 20 2a 2a 20 44 65 6c 61 79 20 66 6f 72 20 74    ** Delay for t
14ea0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c  he number of mil
14eb0 6c 69 73 65 63 6f 6e 64 73 20 73 70 65 63 69 66  liseconds specif
14ec0 69 65 64 20 77 68 65 6e 20 61 20 66 69 6c 65 20  ied when a file 
14ed0 69 73 20 6c 6f 63 6b 65 64 2e 0a 20 20 2a 2f 0a  is locked..  */.
14ee0 20 20 63 61 73 65 20 44 42 5f 54 49 4d 45 4f 55    case DB_TIMEOU
14ef0 54 3a 20 7b 0a 20 20 20 20 69 6e 74 20 6d 73 3b  T: {.    int ms;
14f00 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 33  .    if( objc!=3
14f10 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72   ){.      Tcl_Wr
14f20 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
14f30 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 4d 49 4c  p, 2, objv, "MIL
14f40 4c 49 53 45 43 4f 4e 44 53 22 29 3b 0a 20 20 20  LISECONDS");.   
14f50 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
14f60 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ROR;.    }.    i
14f70 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  f( Tcl_GetIntFro
14f80 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
14f90 76 5b 32 5d 2c 20 26 6d 73 29 20 29 20 72 65 74  v[2], &ms) ) ret
14fa0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
14fb0 20 20 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f     sqlite3_busy_
14fc0 74 69 6d 65 6f 75 74 28 70 44 62 2d 3e 64 62 2c  timeout(pDb->db,
14fd0 20 6d 73 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b   ms);.    break;
14fe0 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 0a 20 20 2a  .  }.  .  /*.  *
14ff0 2a 20 20 20 20 20 24 64 62 20 74 6f 74 61 6c 5f  *     $db total_
15000 63 68 61 6e 67 65 73 0a 20 20 2a 2a 0a 20 20 2a  changes.  **.  *
15010 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
15020 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74  ber of rows that
15030 20 77 65 72 65 20 6d 6f 64 69 66 69 65 64 2c 20   were modified, 
15040 69 6e 73 65 72 74 65 64 2c 20 6f 72 20 64 65 6c  inserted, or del
15050 65 74 65 64 20 0a 20 20 2a 2a 20 73 69 6e 63 65  eted .  ** since
15060 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
15070 6e 64 6c 65 20 77 61 73 20 63 72 65 61 74 65 64  ndle was created
15080 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  ..  */.  case DB
15090 5f 54 4f 54 41 4c 5f 43 48 41 4e 47 45 53 3a 20  _TOTAL_CHANGES: 
150a0 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  {.    Tcl_Obj *p
150b0 52 65 73 75 6c 74 3b 0a 20 20 20 20 69 66 28 20  Result;.    if( 
150c0 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 20  objc!=2 ){.     
150d0 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
150e0 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a  s(interp, 2, obj
150f0 76 2c 20 22 22 29 3b 0a 20 20 20 20 20 20 72 65  v, "");.      re
15100 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
15110 20 20 20 20 7d 0a 20 20 20 20 70 52 65 73 75 6c      }.    pResul
15120 74 20 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65  t = Tcl_GetObjRe
15130 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  sult(interp);.  
15140 20 20 54 63 6c 5f 53 65 74 49 6e 74 4f 62 6a 28    Tcl_SetIntObj(
15150 70 52 65 73 75 6c 74 2c 20 73 71 6c 69 74 65 33  pResult, sqlite3
15160 5f 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73 28 70  _total_changes(p
15170 44 62 2d 3e 64 62 29 29 3b 0a 20 20 20 20 62 72  Db->db));.    br
15180 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20  eak;.  }..  /*  
15190 20 20 24 64 62 20 74 72 61 63 65 20 3f 43 41 4c    $db trace ?CAL
151a0 4c 42 41 43 4b 3f 0a 20 20 2a 2a 0a 20 20 2a 2a  LBACK?.  **.  **
151b0 20 4d 61 6b 65 20 61 72 72 61 6e 67 65 6d 65 6e   Make arrangemen
151c0 74 73 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65  ts to invoke the
151d0 20 43 41 4c 4c 42 41 43 4b 20 72 6f 75 74 69 6e   CALLBACK routin
151e0 65 20 66 6f 72 20 65 61 63 68 20 53 51 4c 20 73  e for each SQL s
151f0 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 68  tatement.  ** th
15200 61 74 20 69 73 20 65 78 65 63 75 74 65 64 2e 20  at is executed. 
15210 20 54 68 65 20 74 65 78 74 20 6f 66 20 74 68 65   The text of the
15220 20 53 51 4c 20 69 73 20 61 70 70 65 6e 64 65 64   SQL is appended
15230 20 74 6f 20 43 41 4c 4c 42 41 43 4b 20 62 65 66   to CALLBACK bef
15240 6f 72 65 0a 20 20 2a 2a 20 69 74 20 69 73 20 65  ore.  ** it is e
15250 78 65 63 75 74 65 64 2e 0a 20 20 2a 2f 0a 20 20  xecuted..  */.  
15260 63 61 73 65 20 44 42 5f 54 52 41 43 45 3a 20 7b  case DB_TRACE: {
15270 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 33 20  .    if( objc>3 
15280 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f  ){.      Tcl_Wro
15290 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
152a0 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 43 41 4c  , 2, objv, "?CAL
152b0 4c 42 41 43 4b 3f 22 29 3b 0a 20 20 20 20 20 20  LBACK?");.      
152c0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
152d0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
152e0 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20 20  objc==2 ){.     
152f0 20 69 66 28 20 70 44 62 2d 3e 7a 54 72 61 63 65   if( pDb->zTrace
15300 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f   ){.        Tcl_
15310 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
15320 65 72 70 2c 20 70 44 62 2d 3e 7a 54 72 61 63 65  erp, pDb->zTrace
15330 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
15340 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63    }else{.      c
15350 68 61 72 20 2a 7a 54 72 61 63 65 3b 0a 20 20 20  har *zTrace;.   
15360 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20     int len;.    
15370 20 20 69 66 28 20 70 44 62 2d 3e 7a 54 72 61 63    if( pDb->zTrac
15380 65 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c  e ){.        Tcl
15390 5f 46 72 65 65 28 70 44 62 2d 3e 7a 54 72 61 63  _Free(pDb->zTrac
153a0 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
153b0 20 20 7a 54 72 61 63 65 20 3d 20 54 63 6c 5f 47    zTrace = Tcl_G
153c0 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
153d0 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a  objv[2], &len);.
153e0 20 20 20 20 20 20 69 66 28 20 7a 54 72 61 63 65        if( zTrace
153f0 20 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20 20 20   && len>0 ){.   
15400 20 20 20 20 20 70 44 62 2d 3e 7a 54 72 61 63 65       pDb->zTrace
15410 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65   = Tcl_Alloc( le
15420 6e 20 2b 20 31 20 29 3b 0a 20 20 20 20 20 20 20  n + 1 );.       
15430 20 6d 65 6d 63 70 79 28 70 44 62 2d 3e 7a 54 72   memcpy(pDb->zTr
15440 61 63 65 2c 20 7a 54 72 61 63 65 2c 20 6c 65 6e  ace, zTrace, len
15450 2b 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  +1);.      }else
15460 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a  {.        pDb->z
15470 54 72 61 63 65 20 3d 20 30 3b 0a 20 20 20 20 20  Trace = 0;.     
15480 20 7d 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28   }.#if !defined(
15490 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43  SQLITE_OMIT_TRAC
154a0 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  E) && !defined(S
154b0 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54  QLITE_OMIT_FLOAT
154c0 49 4e 47 5f 50 4f 49 4e 54 29 0a 20 20 20 20 20  ING_POINT).     
154d0 20 69 66 28 20 70 44 62 2d 3e 7a 54 72 61 63 65   if( pDb->zTrace
154e0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d   ){.        pDb-
154f0 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70  >interp = interp
15500 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
15510 33 5f 74 72 61 63 65 28 70 44 62 2d 3e 64 62 2c  3_trace(pDb->db,
15520 20 44 62 54 72 61 63 65 48 61 6e 64 6c 65 72 2c   DbTraceHandler,
15530 20 70 44 62 29 3b 0a 20 20 20 20 20 20 7d 65 6c   pDb);.      }el
15540 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
15550 74 65 33 5f 74 72 61 63 65 28 70 44 62 2d 3e 64  te3_trace(pDb->d
15560 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  b, 0, 0);.      
15570 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20  }.#endif.    }. 
15580 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
15590 20 2f 2a 20 20 20 20 24 64 62 20 74 72 61 6e 73   /*    $db trans
155a0 61 63 74 69 6f 6e 20 5b 2d 64 65 66 65 72 72 65  action [-deferre
155b0 64 7c 2d 69 6d 6d 65 64 69 61 74 65 7c 2d 65 78  d|-immediate|-ex
155c0 63 6c 75 73 69 76 65 5d 20 53 43 52 49 50 54 0a  clusive] SCRIPT.
155d0 20 20 2a 2a 0a 20 20 2a 2a 20 53 74 61 72 74 20    **.  ** Start 
155e0 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f  a new transactio
155f0 6e 20 28 69 66 20 77 65 20 61 72 65 20 6e 6f 74  n (if we are not
15600 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
15610 6d 69 64 73 74 20 6f 66 20 61 0a 20 20 2a 2a 20  midst of a.  ** 
15620 74 72 61 6e 73 61 63 74 69 6f 6e 29 20 61 6e 64  transaction) and
15630 20 65 78 65 63 75 74 65 20 74 68 65 20 54 43 4c   execute the TCL
15640 20 73 63 72 69 70 74 20 53 43 52 49 50 54 2e 20   script SCRIPT. 
15650 20 41 66 74 65 72 20 53 43 52 49 50 54 0a 20 20   After SCRIPT.  
15660 2a 2a 20 63 6f 6d 70 6c 65 74 65 73 2c 20 65 69  ** completes, ei
15670 74 68 65 72 20 63 6f 6d 6d 69 74 20 74 68 65 20  ther commit the 
15680 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 72 20 72  transaction or r
15690 6f 6c 6c 20 69 74 20 62 61 63 6b 20 69 66 20 53  oll it back if S
156a0 43 52 49 50 54 0a 20 20 2a 2a 20 74 68 72 6f 77  CRIPT.  ** throw
156b0 73 20 61 6e 20 65 78 63 65 70 74 69 6f 6e 2e 20  s an exception. 
156c0 20 4f 72 20 69 66 20 6e 6f 20 6e 65 77 20 74 72   Or if no new tr
156d0 61 6e 73 61 74 69 6f 6e 20 77 61 73 20 73 74 61  ansation was sta
156e0 72 74 65 64 2c 20 64 6f 20 6e 6f 74 68 69 6e 67  rted, do nothing
156f0 2e 0a 20 20 2a 2a 20 70 61 73 73 20 74 68 65 20  ..  ** pass the 
15700 65 78 63 65 70 74 69 6f 6e 20 6f 6e 20 75 70 20  exception on up 
15710 74 68 65 20 73 74 61 63 6b 2e 0a 20 20 2a 2a 0a  the stack..  **.
15720 20 20 2a 2a 20 54 68 69 73 20 63 6f 6d 6d 61 6e    ** This comman
15730 64 20 77 61 73 20 69 6e 73 70 69 72 65 64 20 62  d was inspired b
15740 79 20 44 61 76 65 20 54 68 6f 6d 61 73 27 73 20  y Dave Thomas's 
15750 74 61 6c 6b 20 6f 6e 20 52 75 62 79 20 61 74 20  talk on Ruby at 
15760 74 68 65 0a 20 20 2a 2a 20 32 30 30 35 20 4f 27  the.  ** 2005 O'
15770 52 65 69 6c 6c 79 20 4f 70 65 6e 20 53 6f 75 72  Reilly Open Sour
15780 63 65 20 43 6f 6e 76 65 6e 74 69 6f 6e 20 28 4f  ce Convention (O
15790 53 43 4f 4e 29 2e 0a 20 20 2a 2f 0a 20 20 63 61  SCON)..  */.  ca
157a0 73 65 20 44 42 5f 54 52 41 4e 53 41 43 54 49 4f  se DB_TRANSACTIO
157b0 4e 3a 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  N: {.    Tcl_Obj
157c0 20 2a 70 53 63 72 69 70 74 3b 0a 20 20 20 20 63   *pScript;.    c
157d0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 42 65 67 69  onst char *zBegi
157e0 6e 20 3d 20 22 53 41 56 45 50 4f 49 4e 54 20 5f  n = "SAVEPOINT _
157f0 74 63 6c 5f 74 72 61 6e 73 61 63 74 69 6f 6e 22  tcl_transaction"
15800 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d  ;.    if( objc!=
15810 33 20 26 26 20 6f 62 6a 63 21 3d 34 20 29 7b 0a  3 && objc!=4 ){.
15820 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
15830 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
15840 2c 20 6f 62 6a 76 2c 20 22 5b 54 59 50 45 5d 20  , objv, "[TYPE] 
15850 53 43 52 49 50 54 22 29 3b 0a 20 20 20 20 20 20  SCRIPT");.      
15860 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
15870 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
15880 20 70 44 62 2d 3e 6e 54 72 61 6e 73 61 63 74 69   pDb->nTransacti
15890 6f 6e 3d 3d 30 20 26 26 20 6f 62 6a 63 3d 3d 34  on==0 && objc==4
158a0 20 29 7b 0a 20 20 20 20 20 20 73 74 61 74 69 63   ){.      static
158b0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 54 54 59   const char *TTY
158c0 50 45 5f 73 74 72 73 5b 5d 20 3d 20 7b 0a 20 20  PE_strs[] = {.  
158d0 20 20 20 20 20 20 22 64 65 66 65 72 72 65 64 22        "deferred"
158e0 2c 20 20 20 22 65 78 63 6c 75 73 69 76 65 22 2c  ,   "exclusive",
158f0 20 20 22 69 6d 6d 65 64 69 61 74 65 22 2c 20 30    "immediate", 0
15900 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20  .      };.      
15910 65 6e 75 6d 20 54 54 59 50 45 5f 65 6e 75 6d 20  enum TTYPE_enum 
15920 7b 0a 20 20 20 20 20 20 20 20 54 54 59 50 45 5f  {.        TTYPE_
15930 44 45 46 45 52 52 45 44 2c 20 54 54 59 50 45 5f  DEFERRED, TTYPE_
15940 45 58 43 4c 55 53 49 56 45 2c 20 54 54 59 50 45  EXCLUSIVE, TTYPE
15950 5f 49 4d 4d 45 44 49 41 54 45 0a 20 20 20 20 20  _IMMEDIATE.     
15960 20 7d 3b 0a 20 20 20 20 20 20 69 6e 74 20 74 74   };.      int tt
15970 79 70 65 3b 0a 20 20 20 20 20 20 69 66 28 20 54  ype;.      if( T
15980 63 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f  cl_GetIndexFromO
15990 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
159a0 32 5d 2c 20 54 54 59 50 45 5f 73 74 72 73 2c 20  2], TTYPE_strs, 
159b0 22 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 79 70  "transaction typ
159c0 65 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  e",.            
159d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
159e0 20 20 30 2c 20 26 74 74 79 70 65 29 20 29 7b 0a    0, &ttype) ){.
159f0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54          return T
15a00 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  CL_ERROR;.      
15a10 7d 0a 20 20 20 20 20 20 73 77 69 74 63 68 28 20  }.      switch( 
15a20 28 65 6e 75 6d 20 54 54 59 50 45 5f 65 6e 75 6d  (enum TTYPE_enum
15a30 29 74 74 79 70 65 20 29 7b 0a 20 20 20 20 20 20  )ttype ){.      
15a40 20 20 63 61 73 65 20 54 54 59 50 45 5f 44 45 46    case TTYPE_DEF
15a50 45 52 52 45 44 3a 20 20 20 20 2f 2a 20 6e 6f 2d  ERRED:    /* no-
15a60 6f 70 20 2a 2f 3b 20 20 20 20 20 20 20 20 20 20  op */;          
15a70 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
15a80 20 20 20 20 20 20 63 61 73 65 20 54 54 59 50 45        case TTYPE
15a90 5f 45 58 43 4c 55 53 49 56 45 3a 20 20 20 7a 42  _EXCLUSIVE:   zB
15aa0 65 67 69 6e 20 3d 20 22 42 45 47 49 4e 20 45 58  egin = "BEGIN EX
15ab0 43 4c 55 53 49 56 45 22 3b 20 20 62 72 65 61 6b  CLUSIVE";  break
15ac0 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 54  ;.        case T
15ad0 54 59 50 45 5f 49 4d 4d 45 44 49 41 54 45 3a 20  TYPE_IMMEDIATE: 
15ae0 20 20 7a 42 65 67 69 6e 20 3d 20 22 42 45 47 49    zBegin = "BEGI
15af0 4e 20 49 4d 4d 45 44 49 41 54 45 22 3b 20 20 62  N IMMEDIATE";  b
15b00 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
15b10 20 20 7d 0a 20 20 20 20 70 53 63 72 69 70 74 20    }.    pScript 
15b20 3d 20 6f 62 6a 76 5b 6f 62 6a 63 2d 31 5d 3b 0a  = objv[objc-1];.
15b30 0a 20 20 20 20 2f 2a 20 52 75 6e 20 74 68 65 20  .    /* Run the 
15b40 53 51 4c 69 74 65 20 42 45 47 49 4e 20 63 6f 6d  SQLite BEGIN com
15b50 6d 61 6e 64 20 74 6f 20 6f 70 65 6e 20 61 20 74  mand to open a t
15b60 72 61 6e 73 61 63 74 69 6f 6e 20 6f 72 20 73 61  ransaction or sa
15b70 76 65 70 6f 69 6e 74 2e 20 2a 2f 0a 20 20 20 20  vepoint. */.    
15b80 70 44 62 2d 3e 64 69 73 61 62 6c 65 41 75 74 68  pDb->disableAuth
15b90 2b 2b 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  ++;.    rc = sql
15ba0 69 74 65 33 5f 65 78 65 63 28 70 44 62 2d 3e 64  ite3_exec(pDb->d
15bb0 62 2c 20 7a 42 65 67 69 6e 2c 20 30 2c 20 30 2c  b, zBegin, 0, 0,
15bc0 20 30 29 3b 0a 20 20 20 20 70 44 62 2d 3e 64 69   0);.    pDb->di
15bd0 73 61 62 6c 65 41 75 74 68 2d 2d 3b 0a 20 20 20  sableAuth--;.   
15be0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
15bf0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  OK ){.      Tcl_
15c00 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
15c10 65 72 70 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  erp, sqlite3_err
15c20 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c 20 30 29  msg(pDb->db), 0)
15c30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
15c40 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
15c50 20 20 20 20 70 44 62 2d 3e 6e 54 72 61 6e 73 61      pDb->nTransa
15c60 63 74 69 6f 6e 2b 2b 3b 0a 0a 20 20 20 20 2f 2a  ction++;..    /*
15c70 20 49 66 20 75 73 69 6e 67 20 4e 52 45 2c 20 73   If using NRE, s
15c80 63 68 65 64 75 6c 65 20 61 20 63 61 6c 6c 62 61  chedule a callba
15c90 63 6b 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65  ck to invoke the
15ca0 20 73 63 72 69 70 74 20 70 53 63 72 69 70 74 2c   script pScript,
15cb0 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 61 20 73   then.    ** a s
15cc0 65 63 6f 6e 64 20 63 61 6c 6c 62 61 63 6b 20 74  econd callback t
15cd0 6f 20 63 6f 6d 6d 69 74 20 28 6f 72 20 72 6f 6c  o commit (or rol
15ce0 6c 62 61 63 6b 29 20 74 68 65 20 74 72 61 6e 73  lback) the trans
15cf0 61 63 74 69 6f 6e 20 6f 72 20 73 61 76 65 70 6f  action or savepo
15d00 69 6e 74 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 65  int.    ** opene
15d10 64 20 61 62 6f 76 65 2e 20 49 66 20 6e 6f 74 20  d above. If not 
15d20 75 73 69 6e 67 20 4e 52 45 2c 20 65 76 61 6c 75  using NRE, evalu
15d30 61 74 65 20 74 68 65 20 73 63 72 69 70 74 20 64  ate the script d
15d40 69 72 65 63 74 6c 79 2c 20 74 68 65 6e 0a 20 20  irectly, then.  
15d50 20 20 2a 2a 20 63 61 6c 6c 20 66 75 6e 63 74 69    ** call functi
15d60 6f 6e 20 44 62 54 72 61 6e 73 50 6f 73 74 43 6d  on DbTransPostCm
15d70 64 28 29 20 74 6f 20 63 6f 6d 6d 69 74 20 28 6f  d() to commit (o
15d80 72 20 72 6f 6c 6c 62 61 63 6b 29 20 74 68 65 20  r rollback) the 
15d90 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20 20  transaction .   
15da0 20 2a 2a 20 6f 72 20 73 61 76 65 70 6f 69 6e 74   ** or savepoint
15db0 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 44 62  .  */.    if( Db
15dc0 55 73 65 4e 72 65 28 29 20 29 7b 0a 20 20 20 20  UseNre() ){.    
15dd0 20 20 54 63 6c 5f 4e 52 41 64 64 43 61 6c 6c 62    Tcl_NRAddCallb
15de0 61 63 6b 28 69 6e 74 65 72 70 2c 20 44 62 54 72  ack(interp, DbTr
15df0 61 6e 73 50 6f 73 74 43 6d 64 2c 20 63 64 2c 20  ansPostCmd, cd, 
15e00 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  0, 0, 0);.      
15e10 54 63 6c 5f 4e 52 45 76 61 6c 4f 62 6a 28 69 6e  Tcl_NREvalObj(in
15e20 74 65 72 70 2c 20 70 53 63 72 69 70 74 2c 20 30  terp, pScript, 0
15e30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
15e40 20 20 20 20 72 63 20 3d 20 44 62 54 72 61 6e 73      rc = DbTrans
15e50 50 6f 73 74 43 6d 64 28 26 63 64 2c 20 69 6e 74  PostCmd(&cd, int
15e60 65 72 70 2c 20 54 63 6c 5f 45 76 61 6c 4f 62 6a  erp, Tcl_EvalObj
15e70 45 78 28 69 6e 74 65 72 70 2c 20 70 53 63 72 69  Ex(interp, pScri
15e80 70 74 2c 20 30 29 29 3b 0a 20 20 20 20 7d 0a 20  pt, 0));.    }. 
15e90 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
15ea0 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 24 64 62 20   /*.  **    $db 
15eb0 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79 20 3f 73  unlock_notify ?s
15ec0 63 72 69 70 74 3f 0a 20 20 2a 2f 0a 20 20 63 61  cript?.  */.  ca
15ed0 73 65 20 44 42 5f 55 4e 4c 4f 43 4b 5f 4e 4f 54  se DB_UNLOCK_NOT
15ee0 49 46 59 3a 20 7b 0a 23 69 66 6e 64 65 66 20 53  IFY: {.#ifndef S
15ef0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 55 4e 4c  QLITE_ENABLE_UNL
15f00 4f 43 4b 5f 4e 4f 54 49 46 59 0a 20 20 20 20 54  OCK_NOTIFY.    T
15f10 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
15f20 69 6e 74 65 72 70 2c 20 22 75 6e 6c 6f 63 6b 5f  interp, "unlock_
15f30 6e 6f 74 69 66 79 20 6e 6f 74 20 61 76 61 69 6c  notify not avail
15f40 61 62 6c 65 20 69 6e 20 74 68 69 73 20 62 75 69  able in this bui
15f50 6c 64 22 2c 20 30 29 3b 0a 20 20 20 20 72 63 20  ld", 0);.    rc 
15f60 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c  = TCL_ERROR;.#el
15f70 73 65 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21  se.    if( objc!
15f80 3d 32 20 26 26 20 6f 62 6a 63 21 3d 33 20 29 7b  =2 && objc!=3 ){
15f90 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  .      Tcl_Wrong
15fa0 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
15fb0 32 2c 20 6f 62 6a 76 2c 20 22 3f 53 43 52 49 50  2, objv, "?SCRIP
15fc0 54 3f 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  T?");.      rc =
15fd0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
15fe0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 76 6f 69  }else{.      voi
15ff0 64 20 28 2a 78 4e 6f 74 69 66 79 29 28 76 6f 69  d (*xNotify)(voi
16000 64 20 2a 2a 2c 20 69 6e 74 29 20 3d 20 30 3b 0a  d **, int) = 0;.
16010 20 20 20 20 20 20 76 6f 69 64 20 2a 70 4e 6f 74        void *pNot
16020 69 66 79 41 72 67 20 3d 20 30 3b 0a 0a 20 20 20  ifyArg = 0;..   
16030 20 20 20 69 66 28 20 70 44 62 2d 3e 70 55 6e 6c     if( pDb->pUnl
16040 6f 63 6b 4e 6f 74 69 66 79 20 29 7b 0a 20 20 20  ockNotify ){.   
16050 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66       Tcl_DecrRef
16060 43 6f 75 6e 74 28 70 44 62 2d 3e 70 55 6e 6c 6f  Count(pDb->pUnlo
16070 63 6b 4e 6f 74 69 66 79 29 3b 0a 20 20 20 20 20  ckNotify);.     
16080 20 20 20 70 44 62 2d 3e 70 55 6e 6c 6f 63 6b 4e     pDb->pUnlockN
16090 6f 74 69 66 79 20 3d 20 30 3b 0a 20 20 20 20 20  otify = 0;.     
160a0 20 7d 0a 20 20 0a 20 20 20 20 20 20 69 66 28 20   }.  .      if( 
160b0 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20 20 20 20 20  objc==3 ){.     
160c0 20 20 20 78 4e 6f 74 69 66 79 20 3d 20 44 62 55     xNotify = DbU
160d0 6e 6c 6f 63 6b 4e 6f 74 69 66 79 3b 0a 20 20 20  nlockNotify;.   
160e0 20 20 20 20 20 70 4e 6f 74 69 66 79 41 72 67 20       pNotifyArg 
160f0 3d 20 28 76 6f 69 64 20 2a 29 70 44 62 3b 0a 20  = (void *)pDb;. 
16100 20 20 20 20 20 20 20 70 44 62 2d 3e 70 55 6e 6c         pDb->pUnl
16110 6f 63 6b 4e 6f 74 69 66 79 20 3d 20 6f 62 6a 76  ockNotify = objv
16120 5b 32 5d 3b 0a 20 20 20 20 20 20 20 20 54 63 6c  [2];.        Tcl
16130 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 44  _IncrRefCount(pD
16140 62 2d 3e 70 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79  b->pUnlockNotify
16150 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 0a 20 20  );.      }.  .  
16160 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f      if( sqlite3_
16170 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79 28 70 44  unlock_notify(pD
16180 62 2d 3e 64 62 2c 20 78 4e 6f 74 69 66 79 2c 20  b->db, xNotify, 
16190 70 4e 6f 74 69 66 79 41 72 67 29 20 29 7b 0a 20  pNotifyArg) ){. 
161a0 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e         Tcl_Appen
161b0 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
161c0 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70  sqlite3_errmsg(p
161d0 44 62 2d 3e 64 62 29 2c 20 30 29 3b 0a 20 20 20  Db->db), 0);.   
161e0 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45 52       rc = TCL_ER
161f0 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ROR;.      }.   
16200 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 62 72   }.#endif.    br
16210 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  eak;.  }..  /*. 
16220 20 2a 2a 20 20 20 20 24 64 62 20 70 72 65 75 70   **    $db preup
16230 64 61 74 65 5f 68 6f 6f 6b 20 63 6f 75 6e 74 0a  date_hook count.
16240 20 20 2a 2a 20 20 20 20 24 64 62 20 70 72 65 75    **    $db preu
16250 70 64 61 74 65 5f 68 6f 6f 6b 20 68 6f 6f 6b 20  pdate_hook hook 
16260 3f 53 43 52 49 50 54 3f 0a 20 20 2a 2a 20 20 20  ?SCRIPT?.  **   
16270 20 24 64 62 20 70 72 65 75 70 64 61 74 65 5f 68   $db preupdate_h
16280 6f 6f 6b 20 6e 65 77 20 49 4e 44 45 58 0a 20 20  ook new INDEX.  
16290 2a 2a 20 20 20 20 24 64 62 20 70 72 65 75 70 64  **    $db preupd
162a0 61 74 65 5f 68 6f 6f 6b 20 6f 6c 64 20 49 4e 44  ate_hook old IND
162b0 45 58 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  EX.  */.  case D
162c0 42 5f 50 52 45 55 50 44 41 54 45 3a 20 7b 0a 23  B_PREUPDATE: {.#
162d0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  ifndef SQLITE_EN
162e0 41 42 4c 45 5f 50 52 45 55 50 44 41 54 45 5f 48  ABLE_PREUPDATE_H
162f0 4f 4f 4b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65  OOK.    Tcl_Appe
16300 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
16310 20 22 70 72 65 75 70 64 61 74 65 5f 68 6f 6f 6b   "preupdate_hook
16320 20 77 61 73 20 6f 6d 69 74 74 65 64 20 61 74 20   was omitted at 
16330 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 22 29 3b 0a  compile-time");.
16340 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45 52 52      rc = TCL_ERR
16350 4f 52 3b 0a 23 65 6c 73 65 0a 20 20 20 20 73 74  OR;.#else.    st
16360 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
16370 2a 61 7a 53 75 62 5b 5d 20 3d 20 7b 22 63 6f 75  *azSub[] = {"cou
16380 6e 74 22 2c 20 22 64 65 70 74 68 22 2c 20 22 68  nt", "depth", "h
16390 6f 6f 6b 22 2c 20 22 6e 65 77 22 2c 20 22 6f 6c  ook", "new", "ol
163a0 64 22 2c 20 30 7d 3b 0a 20 20 20 20 65 6e 75 6d  d", 0};.    enum
163b0 20 44 62 50 72 65 75 70 64 61 74 65 53 75 62 43   DbPreupdateSubC
163c0 6d 64 20 7b 0a 20 20 20 20 20 20 50 52 45 5f 43  md {.      PRE_C
163d0 4f 55 4e 54 2c 20 50 52 45 5f 44 45 50 54 48 2c  OUNT, PRE_DEPTH,
163e0 20 50 52 45 5f 48 4f 4f 4b 2c 20 50 52 45 5f 4e   PRE_HOOK, PRE_N
163f0 45 57 2c 20 50 52 45 5f 4f 4c 44 0a 20 20 20 20  EW, PRE_OLD.    
16400 7d 3b 0a 20 20 20 20 69 6e 74 20 69 53 75 62 3b  };.    int iSub;
16410 0a 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3c 33  ..    if( objc<3
16420 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72   ){.      Tcl_Wr
16430 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
16440 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 53 55 42  p, 2, objv, "SUB
16450 2d 43 4f 4d 4d 41 4e 44 20 3f 41 52 47 53 3f 22  -COMMAND ?ARGS?"
16460 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
16470 20 54 63 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f   Tcl_GetIndexFro
16480 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
16490 76 5b 32 5d 2c 20 61 7a 53 75 62 2c 20 22 73 75  v[2], azSub, "su
164a0 62 2d 63 6f 6d 6d 61 6e 64 22 2c 20 30 2c 20 26  b-command", 0, &
164b0 69 53 75 62 29 20 29 7b 0a 20 20 20 20 20 20 72  iSub) ){.      r
164c0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
164d0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 77 69 74  .    }..    swit
164e0 63 68 28 20 28 65 6e 75 6d 20 44 62 50 72 65 75  ch( (enum DbPreu
164f0 70 64 61 74 65 53 75 62 43 6d 64 29 69 53 75 62  pdateSubCmd)iSub
16500 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 50   ){.      case P
16510 52 45 5f 43 4f 55 4e 54 3a 20 7b 0a 20 20 20 20  RE_COUNT: {.    
16520 20 20 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 73      int nCol = s
16530 71 6c 69 74 65 33 5f 70 72 65 75 70 64 61 74 65  qlite3_preupdate
16540 5f 63 6f 75 6e 74 28 70 44 62 2d 3e 64 62 29 3b  _count(pDb->db);
16550 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 53 65 74  .        Tcl_Set
16560 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
16570 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28  , Tcl_NewIntObj(
16580 6e 43 6f 6c 29 29 3b 0a 20 20 20 20 20 20 20 20  nCol));.        
16590 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a  break;.      }..
165a0 20 20 20 20 20 20 63 61 73 65 20 50 52 45 5f 48        case PRE_H
165b0 4f 4f 4b 3a 20 7b 0a 20 20 20 20 20 20 20 20 69  OOK: {.        i
165c0 66 28 20 6f 62 6a 63 3e 34 20 29 7b 0a 20 20 20  f( objc>4 ){.   
165d0 20 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67         Tcl_Wrong
165e0 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
165f0 32 2c 20 6f 62 6a 76 2c 20 22 68 6f 6f 6b 20 3f  2, objv, "hook ?
16600 53 43 52 49 50 54 3f 22 29 3b 0a 20 20 20 20 20  SCRIPT?");.     
16610 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
16620 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d  ERROR;.        }
16630 0a 20 20 20 20 20 20 20 20 44 62 48 6f 6f 6b 43  .        DbHookC
16640 6d 64 28 69 6e 74 65 72 70 2c 20 70 44 62 2c 20  md(interp, pDb, 
16650 28 6f 62 6a 63 3d 3d 34 20 3f 20 6f 62 6a 76 5b  (objc==4 ? objv[
16660 33 5d 20 3a 20 30 29 2c 20 26 70 44 62 2d 3e 70  3] : 0), &pDb->p
16670 50 72 65 55 70 64 61 74 65 48 6f 6f 6b 29 3b 0a  PreUpdateHook);.
16680 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
16690 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 63 61       }..      ca
166a0 73 65 20 50 52 45 5f 44 45 50 54 48 3a 20 7b 0a  se PRE_DEPTH: {.
166b0 20 20 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20          Tcl_Obj 
166c0 2a 70 52 65 74 3b 0a 20 20 20 20 20 20 20 20 69  *pRet;.        i
166d0 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20  f( objc!=3 ){.  
166e0 20 20 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e          Tcl_Wron
166f0 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
16700 20 33 2c 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 20   3, objv, "");. 
16710 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
16720 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  TCL_ERROR;.     
16730 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 52 65     }.        pRe
16740 74 20 3d 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  t = Tcl_NewIntOb
16750 6a 28 73 71 6c 69 74 65 33 5f 70 72 65 75 70 64  j(sqlite3_preupd
16760 61 74 65 5f 64 65 70 74 68 28 70 44 62 2d 3e 64  ate_depth(pDb->d
16770 62 29 29 3b 0a 20 20 20 20 20 20 20 20 54 63 6c  b));.        Tcl
16780 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
16790 74 65 72 70 2c 20 70 52 65 74 29 3b 0a 20 20 20  terp, pRet);.   
167a0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
167b0 20 20 7d 0a 0a 20 20 20 20 20 20 63 61 73 65 20    }..      case 
167c0 50 52 45 5f 4e 45 57 3a 0a 20 20 20 20 20 20 63  PRE_NEW:.      c
167d0 61 73 65 20 50 52 45 5f 4f 4c 44 3a 20 7b 0a 20  ase PRE_OLD: {. 
167e0 20 20 20 20 20 20 20 69 6e 74 20 69 49 64 78 3b         int iIdx;
167f0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
16800 5f 76 61 6c 75 65 20 2a 70 56 61 6c 75 65 3b 0a  _value *pValue;.
16810 20 20 20 20 20 20 20 20 69 66 28 20 6f 62 6a 63          if( objc
16820 21 3d 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=4 ){.         
16830 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
16840 73 28 69 6e 74 65 72 70 2c 20 33 2c 20 6f 62 6a  s(interp, 3, obj
16850 76 2c 20 22 49 4e 44 45 58 22 29 3b 0a 20 20 20  v, "INDEX");.   
16860 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43         return TC
16870 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20  L_ERROR;.       
16880 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 54   }.        if( T
16890 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
168a0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d  (interp, objv[3]
168b0 2c 20 26 69 49 64 78 29 20 29 7b 0a 20 20 20 20  , &iIdx) ){.    
168c0 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
168d0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20  _ERROR;.        
168e0 7d 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  }..        if( i
168f0 53 75 62 3d 3d 50 52 45 5f 4f 4c 44 20 29 7b 0a  Sub==PRE_OLD ){.
16900 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
16910 71 6c 69 74 65 33 5f 70 72 65 75 70 64 61 74 65  qlite3_preupdate
16920 5f 6f 6c 64 28 70 44 62 2d 3e 64 62 2c 20 69 49  _old(pDb->db, iI
16930 64 78 2c 20 26 70 56 61 6c 75 65 29 3b 0a 20 20  dx, &pValue);.  
16940 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
16950 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69         assert( i
16960 53 75 62 3d 3d 50 52 45 5f 4e 45 57 20 29 3b 0a  Sub==PRE_NEW );.
16970 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
16980 71 6c 69 74 65 33 5f 70 72 65 75 70 64 61 74 65  qlite3_preupdate
16990 5f 6e 65 77 28 70 44 62 2d 3e 64 62 2c 20 69 49  _new(pDb->db, iI
169a0 64 78 2c 20 26 70 56 61 6c 75 65 29 3b 0a 20 20  dx, &pValue);.  
169b0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
169c0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
169d0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
169e0 54 63 6c 5f 4f 62 6a 20 2a 70 4f 62 6a 3b 0a 20  Tcl_Obj *pObj;. 
169f0 20 20 20 20 20 20 20 20 20 70 4f 62 6a 20 3d 20           pObj = 
16a00 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
16a10 28 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  ((char*)sqlite3_
16a20 76 61 6c 75 65 5f 74 65 78 74 28 70 56 61 6c 75  value_text(pValu
16a30 65 29 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 20  e), -1);.       
16a40 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73     Tcl_SetObjRes
16a50 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 4f 62 6a  ult(interp, pObj
16a60 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
16a70 7b 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f  {.          Tcl_
16a80 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
16a90 65 72 70 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  erp, sqlite3_err
16aa0 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c 20 30 29  msg(pDb->db), 0)
16ab0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
16ac0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
16ad0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
16ae0 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20      }.#endif /* 
16af0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52  SQLITE_ENABLE_PR
16b00 45 55 50 44 41 54 45 5f 48 4f 4f 4b 20 2a 2f 0a  EUPDATE_HOOK */.
16b10 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
16b20 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 24 64 62    /*.  **    $db
16b30 20 77 61 6c 5f 68 6f 6f 6b 20 3f 73 63 72 69 70   wal_hook ?scrip
16b40 74 3f 0a 20 20 2a 2a 20 20 20 20 24 64 62 20 75  t?.  **    $db u
16b50 70 64 61 74 65 5f 68 6f 6f 6b 20 3f 73 63 72 69  pdate_hook ?scri
16b60 70 74 3f 0a 20 20 2a 2a 20 20 20 20 24 64 62 20  pt?.  **    $db 
16b70 72 6f 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 20 3f 73  rollback_hook ?s
16b80 63 72 69 70 74 3f 0a 20 20 2a 2f 0a 20 20 63 61  cript?.  */.  ca
16b90 73 65 20 44 42 5f 57 41 4c 5f 48 4f 4f 4b 3a 20  se DB_WAL_HOOK: 
16ba0 0a 20 20 63 61 73 65 20 44 42 5f 55 50 44 41 54  .  case DB_UPDAT
16bb0 45 5f 48 4f 4f 4b 3a 20 0a 20 20 63 61 73 65 20  E_HOOK: .  case 
16bc0 44 42 5f 52 4f 4c 4c 42 41 43 4b 5f 48 4f 4f 4b  DB_ROLLBACK_HOOK
16bd0 3a 20 7b 0a 20 20 20 20 2f 2a 20 73 65 74 20 70  : {.    /* set p
16be0 70 48 6f 6f 6b 20 74 6f 20 70 6f 69 6e 74 20 61  pHook to point a
16bf0 74 20 70 55 70 64 61 74 65 48 6f 6f 6b 20 6f 72  t pUpdateHook or
16c00 20 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 2c 20   pRollbackHook, 
16c10 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 0a 20 20  depending on .  
16c20 20 20 2a 2a 20 77 68 65 74 68 65 72 20 5b 24 64    ** whether [$d
16c30 62 20 75 70 64 61 74 65 5f 68 6f 6f 6b 5d 20 6f  b update_hook] o
16c40 72 20 5b 24 64 62 20 72 6f 6c 6c 62 61 63 6b 5f  r [$db rollback_
16c50 68 6f 6f 6b 5d 20 77 61 73 20 69 6e 76 6f 6b 65  hook] was invoke
16c60 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 54 63  d..    */.    Tc
16c70 6c 5f 4f 62 6a 20 2a 2a 70 70 48 6f 6f 6b 3b 20  l_Obj **ppHook; 
16c80 0a 20 20 20 20 69 66 28 20 63 68 6f 69 63 65 3d  .    if( choice=
16c90 3d 44 42 5f 57 41 4c 5f 48 4f 4f 4b 20 29 20 70  =DB_WAL_HOOK ) p
16ca0 70 48 6f 6f 6b 20 3d 20 26 70 44 62 2d 3e 70 57  pHook = &pDb->pW
16cb0 61 6c 48 6f 6f 6b 3b 0a 20 20 20 20 69 66 28 20  alHook;.    if( 
16cc0 63 68 6f 69 63 65 3d 3d 44 42 5f 55 50 44 41 54  choice==DB_UPDAT
16cd0 45 5f 48 4f 4f 4b 20 29 20 70 70 48 6f 6f 6b 20  E_HOOK ) ppHook 
16ce0 3d 20 26 70 44 62 2d 3e 70 55 70 64 61 74 65 48  = &pDb->pUpdateH
16cf0 6f 6f 6b 3b 0a 20 20 20 20 69 66 28 20 63 68 6f  ook;.    if( cho
16d00 69 63 65 3d 3d 44 42 5f 52 4f 4c 4c 42 41 43 4b  ice==DB_ROLLBACK
16d10 5f 48 4f 4f 4b 20 29 20 70 70 48 6f 6f 6b 20 3d  _HOOK ) ppHook =
16d20 20 26 70 44 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b   &pDb->pRollback
16d30 48 6f 6f 6b 3b 0a 20 20 20 20 69 66 28 20 6f 62  Hook;.    if( ob
16d40 6a 63 3e 33 20 29 7b 0a 20 20 20 20 20 20 20 54  jc>3 ){.       T
16d50 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
16d60 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c  interp, 2, objv,
16d70 20 22 3f 53 43 52 49 50 54 3f 22 29 3b 0a 20 20   "?SCRIPT?");.  
16d80 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
16d90 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20  ERROR;.    }..  
16da0 20 20 44 62 48 6f 6f 6b 43 6d 64 28 69 6e 74 65    DbHookCmd(inte
16db0 72 70 2c 20 70 44 62 2c 20 28 6f 62 6a 63 3d 3d  rp, pDb, (objc==
16dc0 33 20 3f 20 6f 62 6a 76 5b 32 5d 20 3a 20 30 29  3 ? objv[2] : 0)
16dd0 2c 20 70 70 48 6f 6f 6b 29 3b 0a 20 20 20 20 62  , ppHook);.    b
16de0 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  reak;.  }..  /* 
16df0 20 20 20 24 64 62 20 76 65 72 73 69 6f 6e 0a 20     $db version. 
16e00 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20   **.  ** Return 
16e10 74 68 65 20 76 65 72 73 69 6f 6e 20 73 74 72 69  the version stri
16e20 6e 67 20 66 6f 72 20 74 68 69 73 20 64 61 74 61  ng for this data
16e30 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 63 61 73  base..  */.  cas
16e40 65 20 44 42 5f 56 45 52 53 49 4f 4e 3a 20 7b 0a  e DB_VERSION: {.
16e50 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c      Tcl_SetResul
16e60 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20  t(interp, (char 
16e70 2a 29 73 71 6c 69 74 65 33 5f 6c 69 62 76 65 72  *)sqlite3_libver
16e80 73 69 6f 6e 28 29 2c 20 54 43 4c 5f 53 54 41 54  sion(), TCL_STAT
16e90 49 43 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a  IC);.    break;.
16ea0 20 20 7d 0a 0a 0a 20 20 7d 20 2f 2a 20 45 6e 64    }...  } /* End
16eb0 20 6f 66 20 74 68 65 20 53 57 49 54 43 48 20 73   of the SWITCH s
16ec0 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 72 65  tatement */.  re
16ed0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 20  turn rc;.}..#if 
16ee0 53 51 4c 49 54 45 5f 54 43 4c 5f 4e 52 45 0a 2f  SQLITE_TCL_NRE./
16ef0 2a 0a 2a 2a 20 41 64 61 70 74 6f 72 20 74 68 61  *.** Adaptor tha
16f00 74 20 70 72 6f 76 69 64 65 73 20 61 6e 20 6f 62  t provides an ob
16f10 6a 43 6d 64 20 69 6e 74 65 72 66 61 63 65 20 74  jCmd interface t
16f20 6f 20 74 68 65 20 4e 52 45 2d 65 6e 61 62 6c 65  o the NRE-enable
16f30 64 0a 2a 2a 20 69 6e 74 65 72 66 61 63 65 20 69  d.** interface i
16f40 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 0a 2a  mplementation..*
16f50 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 44 62 4f  /.static int DbO
16f60 62 6a 43 6d 64 41 64 61 70 74 6f 72 28 0a 20 20  bjCmdAdaptor(.  
16f70 76 6f 69 64 20 2a 63 64 2c 0a 20 20 54 63 6c 5f  void *cd,.  Tcl_
16f80 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
16f90 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
16fa0 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 2a 6f 62 6a  l_Obj *const*obj
16fb0 76 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 54 63  v.){.  return Tc
16fc0 6c 5f 4e 52 43 61 6c 6c 4f 62 6a 50 72 6f 63 28  l_NRCallObjProc(
16fd0 69 6e 74 65 72 70 2c 20 44 62 4f 62 6a 43 6d 64  interp, DbObjCmd
16fe0 2c 20 63 64 2c 20 6f 62 6a 63 2c 20 6f 62 6a 76  , cd, objc, objv
16ff0 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  );.}.#endif /* S
17000 51 4c 49 54 45 5f 54 43 4c 5f 4e 52 45 20 2a 2f  QLITE_TCL_NRE */
17010 0a 0a 2f 2a 0a 2a 2a 20 20 20 73 71 6c 69 74 65  ../*.**   sqlite
17020 33 20 44 42 4e 41 4d 45 20 46 49 4c 45 4e 41 4d  3 DBNAME FILENAM
17030 45 20 3f 2d 76 66 73 20 56 46 53 4e 41 4d 45 3f  E ?-vfs VFSNAME?
17040 20 3f 2d 6b 65 79 20 4b 45 59 3f 20 3f 2d 72 65   ?-key KEY? ?-re
17050 61 64 6f 6e 6c 79 20 42 4f 4f 4c 45 41 4e 3f 0a  adonly BOOLEAN?.
17060 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
17070 20 20 20 20 20 20 20 20 20 20 20 20 20 3f 2d 63               ?-c
17080 72 65 61 74 65 20 42 4f 4f 4c 45 41 4e 3f 20 3f  reate BOOLEAN? ?
17090 2d 6e 6f 6d 75 74 65 78 20 42 4f 4f 4c 45 41 4e  -nomutex BOOLEAN
170a0 3f 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ?.**.** This is 
170b0 74 68 65 20 6d 61 69 6e 20 54 63 6c 20 63 6f 6d  the main Tcl com
170c0 6d 61 6e 64 2e 20 20 57 68 65 6e 20 74 68 65 20  mand.  When the 
170d0 22 73 71 6c 69 74 65 22 20 54 63 6c 20 63 6f 6d  "sqlite" Tcl com
170e0 6d 61 6e 64 20 69 73 0a 2a 2a 20 69 6e 76 6f 6b  mand is.** invok
170f0 65 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ed, this routine
17100 20 72 75 6e 73 20 74 6f 20 70 72 6f 63 65 73 73   runs to process
17110 20 74 68 61 74 20 63 6f 6d 6d 61 6e 64 2e 0a 2a   that command..*
17120 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 61  *.** The first a
17130 72 67 75 6d 65 6e 74 2c 20 44 42 4e 41 4d 45 2c  rgument, DBNAME,
17140 20 69 73 20 61 6e 20 61 72 62 69 74 72 61 72 79   is an arbitrary
17150 20 6e 61 6d 65 20 66 6f 72 20 61 20 6e 65 77 0a   name for a new.
17160 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  ** database conn
17170 65 63 74 69 6f 6e 2e 20 20 54 68 69 73 20 63 6f  ection.  This co
17180 6d 6d 61 6e 64 20 63 72 65 61 74 65 73 20 61 20  mmand creates a 
17190 6e 65 77 20 63 6f 6d 6d 61 6e 64 20 6e 61 6d 65  new command name
171a0 64 0a 2a 2a 20 44 42 4e 41 4d 45 20 74 68 61 74  d.** DBNAME that
171b0 20 69 73 20 75 73 65 64 20 74 6f 20 63 6f 6e 74   is used to cont
171c0 72 6f 6c 20 74 68 61 74 20 63 6f 6e 6e 65 63 74  rol that connect
171d0 69 6f 6e 2e 20 20 54 68 65 20 64 61 74 61 62 61  ion.  The databa
171e0 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e  se.** connection
171f0 20 69 73 20 64 65 6c 65 74 65 64 20 77 68 65 6e   is deleted when
17200 20 74 68 65 20 44 42 4e 41 4d 45 20 63 6f 6d 6d   the DBNAME comm
17210 61 6e 64 20 69 73 20 64 65 6c 65 74 65 64 2e 0a  and is deleted..
17220 2a 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64  **.** The second
17230 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65   argument is the
17240 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   name of the dat
17250 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  abase file..**.*
17260 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 44 62 4d  /.static int DbM
17270 61 69 6e 28 76 6f 69 64 20 2a 63 64 2c 20 54 63  ain(void *cd, Tc
17280 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
17290 2c 20 69 6e 74 20 6f 62 6a 63 2c 54 63 6c 5f 4f  , int objc,Tcl_O
172a0 62 6a 20 2a 63 6f 6e 73 74 2a 6f 62 6a 76 29 7b  bj *const*objv){
172b0 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 3b 0a  .  SqliteDb *p;.
172c0 20 20 76 6f 69 64 20 2a 70 4b 65 79 20 3d 20 30    void *pKey = 0
172d0 3b 0a 20 20 69 6e 74 20 6e 4b 65 79 20 3d 20 30  ;.  int nKey = 0
172e0 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
172f0 7a 41 72 67 3b 0a 20 20 63 68 61 72 20 2a 7a 45  zArg;.  char *zE
17300 72 72 4d 73 67 3b 0a 20 20 69 6e 74 20 69 3b 0a  rrMsg;.  int i;.
17310 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
17320 69 6c 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  ile;.  const cha
17330 72 20 2a 7a 56 66 73 20 3d 20 30 3b 0a 20 20 69  r *zVfs = 0;.  i
17340 6e 74 20 66 6c 61 67 73 3b 0a 20 20 54 63 6c 5f  nt flags;.  Tcl_
17350 44 53 74 72 69 6e 67 20 74 72 61 6e 73 6c 61 74  DString translat
17360 65 64 46 69 6c 65 6e 61 6d 65 3b 0a 0a 20 20 2f  edFilename;..  /
17370 2a 20 49 6e 20 6e 6f 72 6d 61 6c 20 75 73 65 2c  * In normal use,
17380 20 65 61 63 68 20 54 43 4c 20 69 6e 74 65 72 70   each TCL interp
17390 72 65 74 65 72 20 72 75 6e 73 20 69 6e 20 61 20  reter runs in a 
173a0 73 69 6e 67 6c 65 20 74 68 72 65 61 64 2e 20 20  single thread.  
173b0 53 6f 0a 20 20 2a 2a 20 62 79 20 64 65 66 61 75  So.  ** by defau
173c0 6c 74 2c 20 77 65 20 63 61 6e 20 74 75 72 6e 20  lt, we can turn 
173d0 6f 66 20 6d 75 74 65 78 69 6e 67 20 6f 6e 20 53  of mutexing on S
173e0 51 4c 69 74 65 20 64 61 74 61 62 61 73 65 20 63  QLite database c
173f0 6f 6e 6e 65 63 74 69 6f 6e 73 2e 0a 20 20 2a 2a  onnections..  **
17400 20 48 6f 77 65 76 65 72 2c 20 66 6f 72 20 74 65   However, for te
17410 73 74 69 6e 67 20 70 75 72 70 6f 73 65 73 20 69  sting purposes i
17420 74 20 69 73 20 75 73 65 66 75 6c 20 74 6f 20 68  t is useful to h
17430 61 76 65 20 6d 75 74 65 78 65 73 20 74 75 72 6e  ave mutexes turn
17440 65 64 0a 20 20 2a 2a 20 6f 6e 2e 20 20 53 6f 2c  ed.  ** on.  So,
17450 20 62 79 20 64 65 66 61 75 6c 74 2c 20 6d 75 74   by default, mut
17460 65 78 65 73 20 64 65 66 61 75 6c 74 20 6f 66 66  exes default off
17470 2e 20 20 42 75 74 20 69 66 20 63 6f 6d 70 69 6c  .  But if compil
17480 65 64 20 77 69 74 68 0a 20 20 2a 2a 20 53 51 4c  ed with.  ** SQL
17490 49 54 45 5f 54 43 4c 5f 44 45 46 41 55 4c 54 5f  ITE_TCL_DEFAULT_
174a0 46 55 4c 4c 4d 55 54 45 58 20 74 68 65 6e 20 6d  FULLMUTEX then m
174b0 75 74 65 78 65 73 20 64 65 66 61 75 6c 74 20 6f  utexes default o
174c0 6e 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53  n..  */.#ifdef S
174d0 51 4c 49 54 45 5f 54 43 4c 5f 44 45 46 41 55 4c  QLITE_TCL_DEFAUL
174e0 54 5f 46 55 4c 4c 4d 55 54 45 58 0a 20 20 66 6c  T_FULLMUTEX.  fl
174f0 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45  ags = SQLITE_OPE
17500 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53 51  N_READWRITE | SQ
17510 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
17520 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46   | SQLITE_OPEN_F
17530 55 4c 4c 4d 55 54 45 58 3b 0a 23 65 6c 73 65 0a  ULLMUTEX;.#else.
17540 20 20 66 6c 61 67 73 20 3d 20 53 51 4c 49 54 45    flags = SQLITE
17550 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20  _OPEN_READWRITE 
17560 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  | SQLITE_OPEN_CR
17570 45 41 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50  EATE | SQLITE_OP
17580 45 4e 5f 4e 4f 4d 55 54 45 58 3b 0a 23 65 6e 64  EN_NOMUTEX;.#end
17590 69 66 0a 0a 20 20 69 66 28 20 6f 62 6a 63 3d 3d  if..  if( objc==
175a0 32 20 29 7b 0a 20 20 20 20 7a 41 72 67 20 3d 20  2 ){.    zArg = 
175b0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
175c0 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 30 29  mObj(objv[1], 0)
175d0 3b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70  ;.    if( strcmp
175e0 28 7a 41 72 67 2c 22 2d 76 65 72 73 69 6f 6e 22  (zArg,"-version"
175f0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 54 63  )==0 ){.      Tc
17600 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
17610 6e 74 65 72 70 2c 73 71 6c 69 74 65 33 5f 76 65  nterp,sqlite3_ve
17620 72 73 69 6f 6e 2c 30 29 3b 0a 20 20 20 20 20 20  rsion,0);.      
17630 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20  return TCL_OK;. 
17640 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 74 72     }.    if( str
17650 63 6d 70 28 7a 41 72 67 2c 22 2d 68 61 73 2d 63  cmp(zArg,"-has-c
17660 6f 64 65 63 22 29 3d 3d 30 20 29 7b 0a 23 69 66  odec")==0 ){.#if
17670 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43  def SQLITE_HAS_C
17680 4f 44 45 43 0a 20 20 20 20 20 20 54 63 6c 5f 41  ODEC.      Tcl_A
17690 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
176a0 72 70 2c 22 31 22 2c 30 29 3b 0a 23 65 6c 73 65  rp,"1",0);.#else
176b0 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  .      Tcl_Appen
176c0 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22  dResult(interp,"
176d0 30 22 2c 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20  0",0);.#endif.  
176e0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f      return TCL_O
176f0 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66  K;.    }.  }.  f
17700 6f 72 28 69 3d 33 3b 20 69 2b 31 3c 6f 62 6a 63  or(i=3; i+1<objc
17710 3b 20 69 2b 3d 32 29 7b 0a 20 20 20 20 7a 41 72  ; i+=2){.    zAr
17720 67 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  g = Tcl_GetStrin
17730 67 28 6f 62 6a 76 5b 69 5d 29 3b 0a 20 20 20 20  g(objv[i]);.    
17740 69 66 28 20 73 74 72 63 6d 70 28 7a 41 72 67 2c  if( strcmp(zArg,
17750 22 2d 6b 65 79 22 29 3d 3d 30 20 29 7b 0a 20 20  "-key")==0 ){.  
17760 20 20 20 20 70 4b 65 79 20 3d 20 54 63 6c 5f 47      pKey = Tcl_G
17770 65 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d 4f  etByteArrayFromO
17780 62 6a 28 6f 62 6a 76 5b 69 2b 31 5d 2c 20 26 6e  bj(objv[i+1], &n
17790 4b 65 79 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  Key);.    }else 
177a0 69 66 28 20 73 74 72 63 6d 70 28 7a 41 72 67 2c  if( strcmp(zArg,
177b0 20 22 2d 76 66 73 22 29 3d 3d 30 20 29 7b 0a 20   "-vfs")==0 ){. 
177c0 20 20 20 20 20 7a 56 66 73 20 3d 20 54 63 6c 5f       zVfs = Tcl_
177d0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 69  GetString(objv[i
177e0 2b 31 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  +1]);.    }else 
177f0 69 66 28 20 73 74 72 63 6d 70 28 7a 41 72 67 2c  if( strcmp(zArg,
17800 20 22 2d 72 65 61 64 6f 6e 6c 79 22 29 3d 3d 30   "-readonly")==0
17810 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 62 3b   ){.      int b;
17820 0a 20 20 20 20 20 20 69 66 28 20 54 63 6c 5f 47  .      if( Tcl_G
17830 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a  etBooleanFromObj
17840 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 69 2b  (interp, objv[i+
17850 31 5d 2c 20 26 62 29 20 29 20 72 65 74 75 72 6e  1], &b) ) return
17860 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
17870 20 20 69 66 28 20 62 20 29 7b 0a 20 20 20 20 20    if( b ){.     
17880 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 28 53 51     flags &= ~(SQ
17890 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
178a0 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ITE|SQLITE_OPEN_
178b0 43 52 45 41 54 45 29 3b 0a 20 20 20 20 20 20 20  CREATE);.       
178c0 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45   flags |= SQLITE
178d0 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a  _OPEN_READONLY;.
178e0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
178f0 20 20 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 53       flags &= ~S
17900 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
17910 4e 4c 59 3b 0a 20 20 20 20 20 20 20 20 66 6c 61  NLY;.        fla
17920 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45  gs |= SQLITE_OPE
17930 4e 5f 52 45 41 44 57 52 49 54 45 3b 0a 20 20 20  N_READWRITE;.   
17940 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69     }.    }else i
17950 66 28 20 73 74 72 63 6d 70 28 7a 41 72 67 2c 20  f( strcmp(zArg, 
17960 22 2d 63 72 65 61 74 65 22 29 3d 3d 30 20 29 7b  "-create")==0 ){
17970 0a 20 20 20 20 20 20 69 6e 74 20 62 3b 0a 20 20  .      int b;.  
17980 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 42      if( Tcl_GetB
17990 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e  ooleanFromObj(in
179a0 74 65 72 70 2c 20 6f 62 6a 76 5b 69 2b 31 5d 2c  terp, objv[i+1],
179b0 20 26 62 29 20 29 20 72 65 74 75 72 6e 20 54 43   &b) ) return TC
179c0 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 69  L_ERROR;.      i
179d0 66 28 20 62 20 26 26 20 28 66 6c 61 67 73 20 26  f( b && (flags &
179e0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
179f0 44 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a 20 20 20  DONLY)==0 ){.   
17a00 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 53 51       flags |= SQ
17a10 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
17a20 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
17a30 20 20 20 20 20 20 20 66 6c 61 67 73 20 26 3d 20         flags &= 
17a40 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45  ~SQLITE_OPEN_CRE
17a50 41 54 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ATE;.      }.   
17a60 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
17a70 70 28 7a 41 72 67 2c 20 22 2d 6e 6f 6d 75 74 65  p(zArg, "-nomute
17a80 78 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  x")==0 ){.      
17a90 69 6e 74 20 62 3b 0a 20 20 20 20 20 20 69 66 28  int b;.      if(
17aa0 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46   Tcl_GetBooleanF
17ab0 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
17ac0 62 6a 76 5b 69 2b 31 5d 2c 20 26 62 29 20 29 20  bjv[i+1], &b) ) 
17ad0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
17ae0 3b 0a 20 20 20 20 20 20 69 66 28 20 62 20 29 7b  ;.      if( b ){
17af0 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c  .        flags |
17b00 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f  = SQLITE_OPEN_NO
17b10 4d 55 54 45 58 3b 0a 20 20 20 20 20 20 20 20 66  MUTEX;.        f
17b20 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f  lags &= ~SQLITE_
17b30 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54 45 58 3b 0a  OPEN_FULLMUTEX;.
17b40 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
17b50 20 20 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 53       flags &= ~S
17b60 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54  QLITE_OPEN_NOMUT
17b70 45 58 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  EX;.      }.    
17b80 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
17b90 28 7a 41 72 67 2c 20 22 2d 66 75 6c 6c 6d 75 74  (zArg, "-fullmut
17ba0 65 78 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ex")==0 ){.     
17bb0 20 69 6e 74 20 62 3b 0a 20 20 20 20 20 20 69 66   int b;.      if
17bc0 28 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e  ( Tcl_GetBoolean
17bd0 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
17be0 6f 62 6a 76 5b 69 2b 31 5d 2c 20 26 62 29 20 29  objv[i+1], &b) )
17bf0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
17c00 52 3b 0a 20 20 20 20 20 20 69 66 28 20 62 20 29  R;.      if( b )
17c10 7b 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73 20  {.        flags 
17c20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46  |= SQLITE_OPEN_F
17c30 55 4c 4c 4d 55 54 45 58 3b 0a 20 20 20 20 20 20  ULLMUTEX;.      
17c40 20 20 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49    flags &= ~SQLI
17c50 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58 3b  TE_OPEN_NOMUTEX;
17c60 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
17c70 20 20 20 20 20 20 66 6c 61 67 73 20 26 3d 20 7e        flags &= ~
17c80 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c  SQLITE_OPEN_FULL
17c90 4d 55 54 45 58 3b 0a 20 20 20 20 20 20 7d 0a 20  MUTEX;.      }. 
17ca0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
17cb0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
17cc0 28 69 6e 74 65 72 70 2c 20 22 75 6e 6b 6e 6f 77  (interp, "unknow
17cd0 6e 20 6f 70 74 69 6f 6e 3a 20 22 2c 20 7a 41 72  n option: ", zAr
17ce0 67 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  g, (char*)0);.  
17cf0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
17d00 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  RROR;.    }.  }.
17d10 20 20 69 66 28 20 6f 62 6a 63 3c 33 20 7c 7c 20    if( objc<3 || 
17d20 28 6f 62 6a 63 26 31 29 21 3d 31 20 29 7b 0a 20  (objc&1)!=1 ){. 
17d30 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
17d40 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
17d50 62 6a 76 2c 20 0a 20 20 20 20 20 20 22 48 41 4e  bjv, .      "HAN
17d60 44 4c 45 20 46 49 4c 45 4e 41 4d 45 20 3f 2d 76  DLE FILENAME ?-v
17d70 66 73 20 56 46 53 4e 41 4d 45 3f 20 3f 2d 72 65  fs VFSNAME? ?-re
17d80 61 64 6f 6e 6c 79 20 42 4f 4f 4c 45 41 4e 3f 20  adonly BOOLEAN? 
17d90 3f 2d 63 72 65 61 74 65 20 42 4f 4f 4c 45 41 4e  ?-create BOOLEAN
17da0 3f 22 0a 20 20 20 20 20 20 22 20 3f 2d 6e 6f 6d  ?".      " ?-nom
17db0 75 74 65 78 20 42 4f 4f 4c 45 41 4e 3f 20 3f 2d  utex BOOLEAN? ?-
17dc0 66 75 6c 6c 6d 75 74 65 78 20 42 4f 4f 4c 45 41  fullmutex BOOLEA
17dd0 4e 3f 22 0a 23 69 66 64 65 66 20 53 51 4c 49 54  N?".#ifdef SQLIT
17de0 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 20 20  E_HAS_CODEC.    
17df0 20 20 22 20 3f 2d 6b 65 79 20 43 4f 44 45 43 4b    " ?-key CODECK
17e00 45 59 3f 22 0a 23 65 6e 64 69 66 0a 20 20 20 20  EY?".#endif.    
17e10 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
17e20 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a  L_ERROR;.  }.  z
17e30 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 70 20  ErrMsg = 0;.  p 
17e40 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 54 63 6c  = (SqliteDb*)Tcl
17e50 5f 41 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a  _Alloc( sizeof(*
17e60 70 29 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30  p) );.  if( p==0
17e70 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52   ){.    Tcl_SetR
17e80 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 6d  esult(interp, "m
17e90 61 6c 6c 6f 63 20 66 61 69 6c 65 64 22 2c 20 54  alloc failed", T
17ea0 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  CL_STATIC);.    
17eb0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
17ec0 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70  ;.  }.  memset(p
17ed0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29  , 0, sizeof(*p))
17ee0 3b 0a 20 20 7a 46 69 6c 65 20 3d 20 54 63 6c 5f  ;.  zFile = Tcl_
17ef0 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
17f00 28 6f 62 6a 76 5b 32 5d 2c 20 30 29 3b 0a 20 20  (objv[2], 0);.  
17f10 7a 46 69 6c 65 20 3d 20 54 63 6c 5f 54 72 61 6e  zFile = Tcl_Tran
17f20 73 6c 61 74 65 46 69 6c 65 4e 61 6d 65 28 69 6e  slateFileName(in
17f30 74 65 72 70 2c 20 7a 46 69 6c 65 2c 20 26 74 72  terp, zFile, &tr
17f40 61 6e 73 6c 61 74 65 64 46 69 6c 65 6e 61 6d 65  anslatedFilename
17f50 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6f 70 65  );.  sqlite3_ope
17f60 6e 5f 76 32 28 7a 46 69 6c 65 2c 20 26 70 2d 3e  n_v2(zFile, &p->
17f70 64 62 2c 20 66 6c 61 67 73 2c 20 7a 56 66 73 29  db, flags, zVfs)
17f80 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46  ;.  Tcl_DStringF
17f90 72 65 65 28 26 74 72 61 6e 73 6c 61 74 65 64 46  ree(&translatedF
17fa0 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20  ilename);.  if( 
17fb0 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74  SQLITE_OK!=sqlit
17fc0 65 33 5f 65 72 72 63 6f 64 65 28 70 2d 3e 64 62  e3_errcode(p->db
17fd0 29 20 29 7b 0a 20 20 20 20 7a 45 72 72 4d 73 67  ) ){.    zErrMsg
17fe0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
17ff0 74 66 28 22 25 73 22 2c 20 73 71 6c 69 74 65 33  tf("%s", sqlite3
18000 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62 29 29 3b  _errmsg(p->db));
18010 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f  .    sqlite3_clo
18020 73 65 28 70 2d 3e 64 62 29 3b 0a 20 20 20 20 70  se(p->db);.    p
18030 2d 3e 64 62 20 3d 20 30 3b 0a 20 20 7d 0a 23 69  ->db = 0;.  }.#i
18040 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f  fdef SQLITE_HAS_
18050 43 4f 44 45 43 0a 20 20 69 66 28 20 70 2d 3e 64  CODEC.  if( p->d
18060 62 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  b ){.    sqlite3
18070 5f 6b 65 79 28 70 2d 3e 64 62 2c 20 70 4b 65 79  _key(p->db, pKey
18080 2c 20 6e 4b 65 79 29 3b 0a 20 20 7d 0a 23 65 6e  , nKey);.  }.#en
18090 64 69 66 0a 20 20 69 66 28 20 70 2d 3e 64 62 3d  dif.  if( p->db=
180a0 3d 30 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65  =0 ){.    Tcl_Se
180b0 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  tResult(interp, 
180c0 7a 45 72 72 4d 73 67 2c 20 54 43 4c 5f 56 4f 4c  zErrMsg, TCL_VOL
180d0 41 54 49 4c 45 29 3b 0a 20 20 20 20 54 63 6c 5f  ATILE);.    Tcl_
180e0 46 72 65 65 28 28 63 68 61 72 2a 29 70 29 3b 0a  Free((char*)p);.
180f0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
18100 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 72  (zErrMsg);.    r
18110 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
18120 0a 20 20 7d 0a 20 20 70 2d 3e 6d 61 78 53 74 6d  .  }.  p->maxStm
18130 74 20 3d 20 4e 55 4d 5f 50 52 45 50 41 52 45 44  t = NUM_PREPARED
18140 5f 53 54 4d 54 53 3b 0a 20 20 70 2d 3e 69 6e 74  _STMTS;.  p->int
18150 65 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20  erp = interp;.  
18160 7a 41 72 67 20 3d 20 54 63 6c 5f 47 65 74 53 74  zArg = Tcl_GetSt
18170 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
18180 5b 31 5d 2c 20 30 29 3b 0a 20 20 69 66 28 20 44  [1], 0);.  if( D
18190 62 55 73 65 4e 72 65 28 29 20 29 7b 0a 20 20 20  bUseNre() ){.   
181a0 20 54 63 6c 5f 4e 52 43 72 65 61 74 65 43 6f 6d   Tcl_NRCreateCom
181b0 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 7a 41 72  mand(interp, zAr
181c0 67 2c 20 44 62 4f 62 6a 43 6d 64 41 64 61 70 74  g, DbObjCmdAdapt
181d0 6f 72 2c 20 44 62 4f 62 6a 43 6d 64 2c 0a 20 20  or, DbObjCmd,.  
181e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
181f0 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 2c 20        (char*)p, 
18200 44 62 44 65 6c 65 74 65 43 6d 64 29 3b 0a 20 20  DbDeleteCmd);.  
18210 7d 65 6c 73 65 7b 0a 20 20 20 20 54 63 6c 5f 43  }else{.    Tcl_C
18220 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28  reateObjCommand(
18230 69 6e 74 65 72 70 2c 20 7a 41 72 67 2c 20 44 62  interp, zArg, Db
18240 4f 62 6a 43 6d 64 2c 20 28 63 68 61 72 2a 29 70  ObjCmd, (char*)p
18250 2c 20 44 62 44 65 6c 65 74 65 43 6d 64 29 3b 0a  , DbDeleteCmd);.
18260 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c    }.  return TCL
18270 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72  _OK;.}../*.** Pr
18280 6f 76 69 64 65 20 61 20 64 75 6d 6d 79 20 54 63  ovide a dummy Tc
18290 6c 5f 49 6e 69 74 53 74 75 62 73 20 69 66 20 77  l_InitStubs if w
182a0 65 20 61 72 65 20 75 73 69 6e 67 20 74 68 69 73  e are using this
182b0 20 61 73 20 61 20 73 74 61 74 69 63 0a 2a 2a 20   as a static.** 
182c0 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 23 69 66 6e  library..*/.#ifn
182d0 64 65 66 20 55 53 45 5f 54 43 4c 5f 53 54 55 42  def USE_TCL_STUB
182e0 53 0a 23 20 75 6e 64 65 66 20 20 54 63 6c 5f 49  S.# undef  Tcl_I
182f0 6e 69 74 53 74 75 62 73 0a 23 20 64 65 66 69 6e  nitStubs.# defin
18300 65 20 54 63 6c 5f 49 6e 69 74 53 74 75 62 73 28  e Tcl_InitStubs(
18310 61 2c 62 2c 63 29 0a 23 65 6e 64 69 66 0a 0a 2f  a,b,c).#endif../
18320 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 77  *.** Make sure w
18330 65 20 68 61 76 65 20 61 20 50 41 43 4b 41 47 45  e have a PACKAGE
18340 5f 56 45 52 53 49 4f 4e 20 6d 61 63 72 6f 20 64  _VERSION macro d
18350 65 66 69 6e 65 64 2e 20 20 54 68 69 73 20 77 69  efined.  This wi
18360 6c 6c 20 62 65 0a 2a 2a 20 64 65 66 69 6e 65 64  ll be.** defined
18370 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 62   automatically b
18380 79 20 74 68 65 20 54 45 41 20 6d 61 6b 65 66 69  y the TEA makefi
18390 6c 65 2e 20 20 42 75 74 20 6f 74 68 65 72 20 6d  le.  But other m
183a0 61 6b 65 66 69 6c 65 73 0a 2a 2a 20 64 6f 20 6e  akefiles.** do n
183b0 6f 74 20 64 65 66 69 6e 65 20 69 74 2e 0a 2a 2f  ot define it..*/
183c0 0a 23 69 66 6e 64 65 66 20 50 41 43 4b 41 47 45  .#ifndef PACKAGE
183d0 5f 56 45 52 53 49 4f 4e 0a 23 20 64 65 66 69 6e  _VERSION.# defin
183e0 65 20 50 41 43 4b 41 47 45 5f 56 45 52 53 49 4f  e PACKAGE_VERSIO
183f0 4e 20 53 51 4c 49 54 45 5f 56 45 52 53 49 4f 4e  N SQLITE_VERSION
18400 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49  .#endif../*.** I
18410 6e 69 74 69 61 6c 69 7a 65 20 74 68 69 73 20 6d  nitialize this m
18420 6f 64 75 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  odule..**.** Thi
18430 73 20 54 63 6c 20 6d 6f 64 75 6c 65 20 63 6f 6e  s Tcl module con
18440 74 61 69 6e 73 20 6f 6e 6c 79 20 61 20 73 69 6e  tains only a sin
18450 67 6c 65 20 6e 65 77 20 54 63 6c 20 63 6f 6d 6d  gle new Tcl comm
18460 61 6e 64 20 6e 61 6d 65 64 20 22 73 71 6c 69 74  and named "sqlit
18470 65 22 2e 0a 2a 2a 20 28 48 65 6e 63 65 20 74 68  e"..** (Hence th
18480 65 72 65 20 69 73 20 6e 6f 20 6e 61 6d 65 73 70  ere is no namesp
18490 61 63 65 2e 20 20 54 68 65 72 65 20 69 73 20 6e  ace.  There is n
184a0 6f 20 70 6f 69 6e 74 20 69 6e 20 75 73 69 6e 67  o point in using
184b0 20 61 20 6e 61 6d 65 73 70 61 63 65 0a 2a 2a 20   a namespace.** 
184c0 69 66 20 74 68 65 20 65 78 74 65 6e 73 69 6f 6e  if the extension
184d0 20 6f 6e 6c 79 20 73 75 70 70 6c 69 65 73 20 6f   only supplies o
184e0 6e 65 20 6e 65 77 20 6e 61 6d 65 21 29 20 20 54  ne new name!)  T
184f0 68 65 20 22 73 71 6c 69 74 65 22 20 63 6f 6d 6d  he "sqlite" comm
18500 61 6e 64 20 69 73 0a 2a 2a 20 75 73 65 64 20 74  and is.** used t
18510 6f 20 6f 70 65 6e 20 61 20 6e 65 77 20 53 51 4c  o open a new SQL
18520 69 74 65 20 64 61 74 61 62 61 73 65 2e 20 20 53  ite database.  S
18530 65 65 20 74 68 65 20 44 62 4d 61 69 6e 28 29 20  ee the DbMain() 
18540 72 6f 75 74 69 6e 65 20 61 62 6f 76 65 0a 2a 2a  routine above.**
18550 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20   for additional 
18560 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2a 0a  information..**.
18570 2a 2a 20 54 68 65 20 45 58 54 45 52 4e 20 6d 61  ** The EXTERN ma
18580 63 72 6f 73 20 61 72 65 20 72 65 71 75 69 72 65  cros are require
18590 64 20 62 79 20 54 43 4c 20 69 6e 20 6f 72 64 65  d by TCL in orde
185a0 72 20 74 6f 20 77 6f 72 6b 20 6f 6e 20 77 69 6e  r to work on win
185b0 64 6f 77 73 2e 0a 2a 2f 0a 45 58 54 45 52 4e 20  dows..*/.EXTERN 
185c0 69 6e 74 20 53 71 6c 69 74 65 33 5f 49 6e 69 74  int Sqlite3_Init
185d0 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74  (Tcl_Interp *int
185e0 65 72 70 29 7b 0a 20 20 54 63 6c 5f 49 6e 69 74  erp){.  Tcl_Init
185f0 53 74 75 62 73 28 69 6e 74 65 72 70 2c 20 22 38  Stubs(interp, "8
18600 2e 34 22 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 43  .4", 0);.  Tcl_C
18610 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28  reateObjCommand(
18620 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 33  interp, "sqlite3
18630 22 2c 20 28 54 63 6c 5f 4f 62 6a 43 6d 64 50 72  ", (Tcl_ObjCmdPr
18640 6f 63 2a 29 44 62 4d 61 69 6e 2c 20 30 2c 20 30  oc*)DbMain, 0, 0
18650 29 3b 0a 20 20 54 63 6c 5f 50 6b 67 50 72 6f 76  );.  Tcl_PkgProv
18660 69 64 65 28 69 6e 74 65 72 70 2c 20 22 73 71 6c  ide(interp, "sql
18670 69 74 65 33 22 2c 20 50 41 43 4b 41 47 45 5f 56  ite3", PACKAGE_V
18680 45 52 53 49 4f 4e 29 3b 0a 0a 23 69 66 6e 64 65  ERSION);..#ifnde
18690 66 20 53 51 4c 49 54 45 5f 33 5f 53 55 46 46 49  f SQLITE_3_SUFFI
186a0 58 5f 4f 4e 4c 59 0a 20 20 2f 2a 20 54 68 65 20  X_ONLY.  /* The 
186b0 22 73 71 6c 69 74 65 22 20 61 6c 69 61 73 20 69  "sqlite" alias i
186c0 73 20 75 6e 64 6f 63 75 6d 65 6e 74 65 64 2e 20  s undocumented. 
186d0 20 49 74 20 69 73 20 68 65 72 65 20 6f 6e 6c 79   It is here only
186e0 20 74 6f 20 73 75 70 70 6f 72 74 0a 20 20 2a 2a   to support.  **
186f0 20 6c 65 67 61 63 79 20 73 63 72 69 70 74 73 2e   legacy scripts.
18700 20 20 41 6c 6c 20 6e 65 77 20 73 63 72 69 70 74    All new script
18710 73 20 73 68 6f 75 6c 64 20 75 73 65 20 6f 6e 6c  s should use onl
18720 79 20 74 68 65 20 22 73 71 6c 69 74 65 33 22 0a  y the "sqlite3".
18730 20 20 2a 2a 20 63 6f 6d 6d 61 6e 64 2e 0a 20 20    ** command..  
18740 2a 2f 0a 20 20 54 63 6c 5f 43 72 65 61 74 65 4f  */.  Tcl_CreateO
18750 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70  bjCommand(interp
18760 2c 20 22 73 71 6c 69 74 65 22 2c 20 28 54 63 6c  , "sqlite", (Tcl
18770 5f 4f 62 6a 43 6d 64 50 72 6f 63 2a 29 44 62 4d  _ObjCmdProc*)DbM
18780 61 69 6e 2c 20 30 2c 20 30 29 3b 0a 23 65 6e 64  ain, 0, 0);.#end
18790 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  if..  return TCL
187a0 5f 4f 4b 3b 0a 7d 0a 45 58 54 45 52 4e 20 69 6e  _OK;.}.EXTERN in
187b0 74 20 54 63 6c 73 71 6c 69 74 65 33 5f 49 6e 69  t Tclsqlite3_Ini
187c0 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  t(Tcl_Interp *in
187d0 74 65 72 70 29 7b 20 72 65 74 75 72 6e 20 53 71  terp){ return Sq
187e0 6c 69 74 65 33 5f 49 6e 69 74 28 69 6e 74 65 72  lite3_Init(inter
187f0 70 29 3b 20 7d 0a 45 58 54 45 52 4e 20 69 6e 74  p); }.EXTERN int
18800 20 53 71 6c 69 74 65 33 5f 53 61 66 65 49 6e 69   Sqlite3_SafeIni
18810 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  t(Tcl_Interp *in
18820 74 65 72 70 29 7b 20 72 65 74 75 72 6e 20 54 43  terp){ return TC
18830 4c 5f 4f 4b 3b 20 7d 0a 45 58 54 45 52 4e 20 69  L_OK; }.EXTERN i
18840 6e 74 20 54 63 6c 73 71 6c 69 74 65 33 5f 53 61  nt Tclsqlite3_Sa
18850 66 65 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  feInit(Tcl_Inter
18860 70 20 2a 69 6e 74 65 72 70 29 7b 20 72 65 74 75  p *interp){ retu
18870 72 6e 20 54 43 4c 5f 4f 4b 3b 20 7d 0a 45 58 54  rn TCL_OK; }.EXT
18880 45 52 4e 20 69 6e 74 20 53 71 6c 69 74 65 33 5f  ERN int Sqlite3_
18890 55 6e 6c 6f 61 64 28 54 63 6c 5f 49 6e 74 65 72  Unload(Tcl_Inter
188a0 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 66  p *interp, int f
188b0 6c 61 67 73 29 7b 20 72 65 74 75 72 6e 20 54 43  lags){ return TC
188c0 4c 5f 4f 4b 3b 20 7d 0a 45 58 54 45 52 4e 20 69  L_OK; }.EXTERN i
188d0 6e 74 20 54 63 6c 73 71 6c 69 74 65 33 5f 55 6e  nt Tclsqlite3_Un
188e0 6c 6f 61 64 28 54 63 6c 5f 49 6e 74 65 72 70 20  load(Tcl_Interp 
188f0 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 66 6c 61  *interp, int fla
18900 67 73 29 7b 20 72 65 74 75 72 6e 20 54 43 4c 5f  gs){ return TCL_
18910 4f 4b 3b 20 7d 0a 45 58 54 45 52 4e 20 69 6e 74  OK; }.EXTERN int
18920 20 53 71 6c 69 74 65 33 5f 53 61 66 65 55 6e 6c   Sqlite3_SafeUnl
18930 6f 61 64 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a  oad(Tcl_Interp *
18940 69 6e 74 65 72 70 2c 20 69 6e 74 20 66 6c 61 67  interp, int flag
18950 73 29 7b 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  s){ return TCL_O
18960 4b 3b 20 7d 0a 45 58 54 45 52 4e 20 69 6e 74 20  K; }.EXTERN int 
18970 54 63 6c 73 71 6c 69 74 65 33 5f 53 61 66 65 55  Tclsqlite3_SafeU
18980 6e 6c 6f 61 64 28 54 63 6c 5f 49 6e 74 65 72 70  nload(Tcl_Interp
18990 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 66 6c   *interp, int fl
189a0 61 67 73 29 7b 20 72 65 74 75 72 6e 20 54 43 4c  ags){ return TCL
189b0 5f 4f 4b 3b 7d 0a 0a 0a 23 69 66 6e 64 65 66 20  _OK;}...#ifndef 
189c0 53 51 4c 49 54 45 5f 33 5f 53 55 46 46 49 58 5f  SQLITE_3_SUFFIX_
189d0 4f 4e 4c 59 0a 69 6e 74 20 53 71 6c 69 74 65 5f  ONLY.int Sqlite_
189e0 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20  Init(Tcl_Interp 
189f0 2a 69 6e 74 65 72 70 29 7b 20 72 65 74 75 72 6e  *interp){ return
18a00 20 53 71 6c 69 74 65 33 5f 49 6e 69 74 28 69 6e   Sqlite3_Init(in
18a10 74 65 72 70 29 3b 20 7d 0a 69 6e 74 20 54 63 6c  terp); }.int Tcl
18a20 73 71 6c 69 74 65 5f 49 6e 69 74 28 54 63 6c 5f  sqlite_Init(Tcl_
18a30 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b  Interp *interp){
18a40 20 72 65 74 75 72 6e 20 53 71 6c 69 74 65 33 5f   return Sqlite3_
18a50 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 20 7d 0a  Init(interp); }.
18a60 69 6e 74 20 53 71 6c 69 74 65 5f 53 61 66 65 49  int Sqlite_SafeI
18a70 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a  nit(Tcl_Interp *
18a80 69 6e 74 65 72 70 29 7b 20 72 65 74 75 72 6e 20  interp){ return 
18a90 54 43 4c 5f 4f 4b 3b 20 7d 0a 69 6e 74 20 54 63  TCL_OK; }.int Tc
18aa0 6c 73 71 6c 69 74 65 5f 53 61 66 65 49 6e 69 74  lsqlite_SafeInit
18ab0 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74  (Tcl_Interp *int
18ac0 65 72 70 29 7b 20 72 65 74 75 72 6e 20 54 43 4c  erp){ return TCL
18ad0 5f 4f 4b 3b 20 7d 0a 69 6e 74 20 53 71 6c 69 74  _OK; }.int Sqlit
18ae0 65 5f 55 6e 6c 6f 61 64 28 54 63 6c 5f 49 6e 74  e_Unload(Tcl_Int
18af0 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74  erp *interp, int
18b00 20 66 6c 61 67 73 29 7b 20 72 65 74 75 72 6e 20   flags){ return 
18b10 54 43 4c 5f 4f 4b 3b 20 7d 0a 69 6e 74 20 54 63  TCL_OK; }.int Tc
18b20 6c 73 71 6c 69 74 65 5f 55 6e 6c 6f 61 64 28 54  lsqlite_Unload(T
18b30 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
18b40 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 20 72  p, int flags){ r
18b50 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 7d 0a  eturn TCL_OK; }.
18b60 69 6e 74 20 53 71 6c 69 74 65 5f 53 61 66 65 55  int Sqlite_SafeU
18b70 6e 6c 6f 61 64 28 54 63 6c 5f 49 6e 74 65 72 70  nload(Tcl_Interp
18b80 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 66 6c   *interp, int fl
18b90 61 67 73 29 7b 20 72 65 74 75 72 6e 20 54 43 4c  ags){ return TCL
18ba0 5f 4f 4b 3b 20 7d 0a 69 6e 74 20 54 63 6c 73 71  _OK; }.int Tclsq
18bb0 6c 69 74 65 5f 53 61 66 65 55 6e 6c 6f 61 64 28  lite_SafeUnload(
18bc0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
18bd0 72 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 20  rp, int flags){ 
18be0 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 7d 0a  return TCL_OK;}.
18bf0 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 54  #endif..#ifdef T
18c00 43 4c 53 48 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  CLSH./**********
18c10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18c20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18c30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18c40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18c50 2a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 66 20 74 68  ***.** All of th
18c60 65 20 63 6f 64 65 20 74 68 61 74 20 66 6f 6c 6c  e code that foll
18c70 6f 77 73 20 69 73 20 75 73 65 64 20 74 6f 20 62  ows is used to b
18c80 75 69 6c 64 20 73 74 61 6e 64 61 6c 6f 6e 65 20  uild standalone 
18c90 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 73  TCL interpreters
18ca0 0a 2a 2a 20 74 68 61 74 20 61 72 65 20 73 74 61  .** that are sta
18cb0 74 69 63 61 6c 6c 79 20 6c 69 6e 6b 65 64 20 77  tically linked w
18cc0 69 74 68 20 53 51 4c 69 74 65 2e 20 20 45 6e 61  ith SQLite.  Ena
18cd0 62 6c 65 20 74 68 65 73 65 20 62 79 20 63 6f 6d  ble these by com
18ce0 70 69 6c 69 6e 67 0a 2a 2a 20 77 69 74 68 20 2d  piling.** with -
18cf0 44 54 43 4c 53 48 3d 6e 20 77 68 65 72 65 20 6e  DTCLSH=n where n
18d00 20 63 61 6e 20 62 65 20 31 20 6f 72 20 32 2e 20   can be 1 or 2. 
18d10 20 41 6e 20 6e 20 6f 66 20 31 20 67 65 6e 65 72   An n of 1 gener
18d20 61 74 65 73 20 61 20 73 74 61 6e 64 61 72 64 0a  ates a standard.
18d30 2a 2a 20 74 63 6c 73 68 20 62 75 74 20 77 69 74  ** tclsh but wit
18d40 68 20 53 51 4c 69 74 65 20 62 75 69 6c 74 20 69  h SQLite built i
18d50 6e 2e 20 20 41 6e 20 6e 20 6f 66 20 32 20 67 65  n.  An n of 2 ge
18d60 6e 65 72 61 74 65 73 20 74 68 65 20 53 51 4c 69  nerates the SQLi
18d70 74 65 20 73 70 61 63 65 0a 2a 2a 20 61 6e 61 6c  te space.** anal
18d80 79 73 69 73 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f  ysis program..*/
18d90 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ..#if defined(SQ
18da0 4c 49 54 45 5f 54 45 53 54 29 20 7c 7c 20 64 65  LITE_TEST) || de
18db0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 43 4c  fined(SQLITE_TCL
18dc0 4d 44 35 29 0a 2f 2a 0a 20 2a 20 54 68 69 73 20  MD5)./*. * This 
18dd0 63 6f 64 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20  code implements 
18de0 74 68 65 20 4d 44 35 20 6d 65 73 73 61 67 65 2d  the MD5 message-
18df0 64 69 67 65 73 74 20 61 6c 67 6f 72 69 74 68 6d  digest algorithm
18e00 2e 0a 20 2a 20 54 68 65 20 61 6c 67 6f 72 69 74  .. * The algorit
18e10 68 6d 20 69 73 20 64 75 65 20 74 6f 20 52 6f 6e  hm is due to Ron
18e20 20 52 69 76 65 73 74 2e 20 20 54 68 69 73 20 63   Rivest.  This c
18e30 6f 64 65 20 77 61 73 0a 20 2a 20 77 72 69 74 74  ode was. * writt
18e40 65 6e 20 62 79 20 43 6f 6c 69 6e 20 50 6c 75 6d  en by Colin Plum
18e50 62 20 69 6e 20 31 39 39 33 2c 20 6e 6f 20 63 6f  b in 1993, no co
18e60 70 79 72 69 67 68 74 20 69 73 20 63 6c 61 69 6d  pyright is claim
18e70 65 64 2e 0a 20 2a 20 54 68 69 73 20 63 6f 64 65  ed.. * This code
18e80 20 69 73 20 69 6e 20 74 68 65 20 70 75 62 6c 69   is in the publi
18e90 63 20 64 6f 6d 61 69 6e 3b 20 64 6f 20 77 69 74  c domain; do wit
18ea0 68 20 69 74 20 77 68 61 74 20 79 6f 75 20 77 69  h it what you wi
18eb0 73 68 2e 0a 20 2a 0a 20 2a 20 45 71 75 69 76 61  sh.. *. * Equiva
18ec0 6c 65 6e 74 20 63 6f 64 65 20 69 73 20 61 76 61  lent code is ava
18ed0 69 6c 61 62 6c 65 20 66 72 6f 6d 20 52 53 41 20  ilable from RSA 
18ee0 44 61 74 61 20 53 65 63 75 72 69 74 79 2c 20 49  Data Security, I
18ef0 6e 63 2e 0a 20 2a 20 54 68 69 73 20 63 6f 64 65  nc.. * This code
18f00 20 68 61 73 20 62 65 65 6e 20 74 65 73 74 65 64   has been tested
18f10 20 61 67 61 69 6e 73 74 20 74 68 61 74 2c 20 61   against that, a
18f20 6e 64 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74  nd is equivalent
18f30 2c 0a 20 2a 20 65 78 63 65 70 74 20 74 68 61 74  ,. * except that
18f40 20 79 6f 75 20 64 6f 6e 27 74 20 6e 65 65 64 20   you don't need 
18f50 74 6f 20 69 6e 63 6c 75 64 65 20 74 77 6f 20 70  to include two p
18f60 61 67 65 73 20 6f 66 20 6c 65 67 61 6c 65 73 65  ages of legalese
18f70 0a 20 2a 20 77 69 74 68 20 65 76 65 72 79 20 63  . * with every c
18f80 6f 70 79 2e 0a 20 2a 0a 20 2a 20 54 6f 20 63 6f  opy.. *. * To co
18f90 6d 70 75 74 65 20 74 68 65 20 6d 65 73 73 61 67  mpute the messag
18fa0 65 20 64 69 67 65 73 74 20 6f 66 20 61 20 63 68  e digest of a ch
18fb0 75 6e 6b 20 6f 66 20 62 79 74 65 73 2c 20 64 65  unk of bytes, de
18fc0 63 6c 61 72 65 20 61 6e 0a 20 2a 20 4d 44 35 43  clare an. * MD5C
18fd0 6f 6e 74 65 78 74 20 73 74 72 75 63 74 75 72 65  ontext structure
18fe0 2c 20 70 61 73 73 20 69 74 20 74 6f 20 4d 44 35  , pass it to MD5
18ff0 49 6e 69 74 2c 20 63 61 6c 6c 20 4d 44 35 55 70  Init, call MD5Up
19000 64 61 74 65 20 61 73 0a 20 2a 20 6e 65 65 64 65  date as. * neede
19010 64 20 6f 6e 20 62 75 66 66 65 72 73 20 66 75 6c  d on buffers ful
19020 6c 20 6f 66 20 62 79 74 65 73 2c 20 61 6e 64 20  l of bytes, and 
19030 74 68 65 6e 20 63 61 6c 6c 20 4d 44 35 46 69 6e  then call MD5Fin
19040 61 6c 2c 20 77 68 69 63 68 0a 20 2a 20 77 69 6c  al, which. * wil
19050 6c 20 66 69 6c 6c 20 61 20 73 75 70 70 6c 69 65  l fill a supplie
19060 64 20 31 36 2d 62 79 74 65 20 61 72 72 61 79 20  d 16-byte array 
19070 77 69 74 68 20 74 68 65 20 64 69 67 65 73 74 2e  with the digest.
19080 0a 20 2a 2f 0a 0a 2f 2a 0a 20 2a 20 49 66 20 63  . */../*. * If c
19090 6f 6d 70 69 6c 65 64 20 6f 6e 20 61 20 6d 61 63  ompiled on a mac
190a0 68 69 6e 65 20 74 68 61 74 20 64 6f 65 73 6e 27  hine that doesn'
190b0 74 20 68 61 76 65 20 61 20 33 32 2d 62 69 74 20  t have a 32-bit 
190c0 69 6e 74 65 67 65 72 2c 0a 20 2a 20 79 6f 75 20  integer,. * you 
190d0 6a 75 73 74 20 73 65 74 20 22 75 69 6e 74 33 32  just set "uint32
190e0 22 20 74 6f 20 74 68 65 20 61 70 70 72 6f 70 72  " to the appropr
190f0 69 61 74 65 20 64 61 74 61 74 79 70 65 20 66 6f  iate datatype fo
19100 72 20 61 6e 0a 20 2a 20 75 6e 73 69 67 6e 65 64  r an. * unsigned
19110 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 2e   32-bit integer.
19120 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 20    For example:. 
19130 2a 0a 20 2a 20 20 20 20 20 20 20 63 63 20 2d 44  *. *       cc -D
19140 75 69 6e 74 33 32 3d 27 75 6e 73 69 67 6e 65 64  uint32='unsigned
19150 20 6c 6f 6e 67 27 20 6d 64 35 2e 63 0a 20 2a 0a   long' md5.c. *.
19160 20 2a 2f 0a 23 69 66 6e 64 65 66 20 75 69 6e 74   */.#ifndef uint
19170 33 32 0a 23 20 20 64 65 66 69 6e 65 20 75 69 6e  32.#  define uin
19180 74 33 32 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  t32 unsigned int
19190 0a 23 65 6e 64 69 66 0a 0a 73 74 72 75 63 74 20  .#endif..struct 
191a0 4d 44 35 43 6f 6e 74 65 78 74 20 7b 0a 20 20 69  MD5Context {.  i
191b0 6e 74 20 69 73 49 6e 69 74 3b 0a 20 20 75 69 6e  nt isInit;.  uin
191c0 74 33 32 20 62 75 66 5b 34 5d 3b 0a 20 20 75 69  t32 buf[4];.  ui
191d0 6e 74 33 32 20 62 69 74 73 5b 32 5d 3b 0a 20 20  nt32 bits[2];.  
191e0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 69 6e  unsigned char in
191f0 5b 36 34 5d 3b 0a 7d 3b 0a 74 79 70 65 64 65 66  [64];.};.typedef
19200 20 73 74 72 75 63 74 20 4d 44 35 43 6f 6e 74 65   struct MD5Conte
19210 78 74 20 4d 44 35 43 6f 6e 74 65 78 74 3b 0a 0a  xt MD5Context;..
19220 2f 2a 0a 20 2a 20 4e 6f 74 65 3a 20 74 68 69 73  /*. * Note: this
19230 20 63 6f 64 65 20 69 73 20 68 61 72 6d 6c 65 73   code is harmles
19240 73 20 6f 6e 20 6c 69 74 74 6c 65 2d 65 6e 64 69  s on little-endi
19250 61 6e 20 6d 61 63 68 69 6e 65 73 2e 0a 20 2a 2f  an machines.. */
19260 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 79 74  .static void byt
19270 65 52 65 76 65 72 73 65 20 28 75 6e 73 69 67 6e  eReverse (unsign
19280 65 64 20 63 68 61 72 20 2a 62 75 66 2c 20 75 6e  ed char *buf, un
19290 73 69 67 6e 65 64 20 6c 6f 6e 67 73 29 7b 0a 20  signed longs){. 
192a0 20 20 20 20 20 20 20 75 69 6e 74 33 32 20 74 3b         uint32 t;
192b0 0a 20 20 20 20 20 20 20 20 64 6f 20 7b 0a 20 20  .        do {.  
192c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 20                t 
192d0 3d 20 28 75 69 6e 74 33 32 29 28 28 75 6e 73 69  = (uint32)((unsi
192e0 67 6e 65 64 29 62 75 66 5b 33 5d 3c 3c 38 20 7c  gned)buf[3]<<8 |
192f0 20 62 75 66 5b 32 5d 29 20 3c 3c 20 31 36 20 7c   buf[2]) << 16 |
19300 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
19310 20 20 20 20 20 20 20 20 20 20 20 20 20 28 28 75               ((u
19320 6e 73 69 67 6e 65 64 29 62 75 66 5b 31 5d 3c 3c  nsigned)buf[1]<<
19330 38 20 7c 20 62 75 66 5b 30 5d 29 3b 0a 20 20 20  8 | buf[0]);.   
19340 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 28 75               *(u
19350 69 6e 74 33 32 20 2a 29 62 75 66 20 3d 20 74 3b  int32 *)buf = t;
19360 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
19370 20 62 75 66 20 2b 3d 20 34 3b 0a 20 20 20 20 20   buf += 4;.     
19380 20 20 20 7d 20 77 68 69 6c 65 20 28 2d 2d 6c 6f     } while (--lo
19390 6e 67 73 29 3b 0a 7d 0a 2f 2a 20 54 68 65 20 66  ngs);.}./* The f
193a0 6f 75 72 20 63 6f 72 65 20 66 75 6e 63 74 69 6f  our core functio
193b0 6e 73 20 2d 20 46 31 20 69 73 20 6f 70 74 69 6d  ns - F1 is optim
193c0 69 7a 65 64 20 73 6f 6d 65 77 68 61 74 20 2a 2f  ized somewhat */
193d0 0a 0a 2f 2a 20 23 64 65 66 69 6e 65 20 46 31 28  ../* #define F1(
193e0 78 2c 20 79 2c 20 7a 29 20 28 78 20 26 20 79 20  x, y, z) (x & y 
193f0 7c 20 7e 78 20 26 20 7a 29 20 2a 2f 0a 23 64 65  | ~x & z) */.#de
19400 66 69 6e 65 20 46 31 28 78 2c 20 79 2c 20 7a 29  fine F1(x, y, z)
19410 20 28 7a 20 5e 20 28 78 20 26 20 28 79 20 5e 20   (z ^ (x & (y ^ 
19420 7a 29 29 29 0a 23 64 65 66 69 6e 65 20 46 32 28  z))).#define F2(
19430 78 2c 20 79 2c 20 7a 29 20 46 31 28 7a 2c 20 78  x, y, z) F1(z, x
19440 2c 20 79 29 0a 23 64 65 66 69 6e 65 20 46 33 28  , y).#define F3(
19450 78 2c 20 79 2c 20 7a 29 20 28 78 20 5e 20 79 20  x, y, z) (x ^ y 
19460 5e 20 7a 29 0a 23 64 65 66 69 6e 65 20 46 34 28  ^ z).#define F4(
19470 78 2c 20 79 2c 20 7a 29 20 28 79 20 5e 20 28 78  x, y, z) (y ^ (x
19480 20 7c 20 7e 7a 29 29 0a 0a 2f 2a 20 54 68 69 73   | ~z))../* This
19490 20 69 73 20 74 68 65 20 63 65 6e 74 72 61 6c 20   is the central 
194a0 73 74 65 70 20 69 6e 20 74 68 65 20 4d 44 35 20  step in the MD5 
194b0 61 6c 67 6f 72 69 74 68 6d 2e 20 2a 2f 0a 23 64  algorithm. */.#d
194c0 65 66 69 6e 65 20 4d 44 35 53 54 45 50 28 66 2c  efine MD5STEP(f,
194d0 20 77 2c 20 78 2c 20 79 2c 20 7a 2c 20 64 61 74   w, x, y, z, dat
194e0 61 2c 20 73 29 20 5c 0a 20 20 20 20 20 20 20 20  a, s) \.        
194f0 28 20 77 20 2b 3d 20 66 28 78 2c 20 79 2c 20 7a  ( w += f(x, y, z
19500 29 20 2b 20 64 61 74 61 2c 20 20 77 20 3d 20 77  ) + data,  w = w
19510 3c 3c 73 20 7c 20 77 3e 3e 28 33 32 2d 73 29 2c  <<s | w>>(32-s),
19520 20 20 77 20 2b 3d 20 78 20 29 0a 0a 2f 2a 0a 20    w += x )../*. 
19530 2a 20 54 68 65 20 63 6f 72 65 20 6f 66 20 74 68  * The core of th
19540 65 20 4d 44 35 20 61 6c 67 6f 72 69 74 68 6d 2c  e MD5 algorithm,
19550 20 74 68 69 73 20 61 6c 74 65 72 73 20 61 6e 20   this alters an 
19560 65 78 69 73 74 69 6e 67 20 4d 44 35 20 68 61 73  existing MD5 has
19570 68 20 74 6f 0a 20 2a 20 72 65 66 6c 65 63 74 20  h to. * reflect 
19580 74 68 65 20 61 64 64 69 74 69 6f 6e 20 6f 66 20  the addition of 
19590 31 36 20 6c 6f 6e 67 77 6f 72 64 73 20 6f 66 20  16 longwords of 
195a0 6e 65 77 20 64 61 74 61 2e 20 20 4d 44 35 55 70  new data.  MD5Up
195b0 64 61 74 65 20 62 6c 6f 63 6b 73 0a 20 2a 20 74  date blocks. * t
195c0 68 65 20 64 61 74 61 20 61 6e 64 20 63 6f 6e 76  he data and conv
195d0 65 72 74 73 20 62 79 74 65 73 20 69 6e 74 6f 20  erts bytes into 
195e0 6c 6f 6e 67 77 6f 72 64 73 20 66 6f 72 20 74 68  longwords for th
195f0 69 73 20 72 6f 75 74 69 6e 65 2e 0a 20 2a 2f 0a  is routine.. */.
19600 73 74 61 74 69 63 20 76 6f 69 64 20 4d 44 35 54  static void MD5T
19610 72 61 6e 73 66 6f 72 6d 28 75 69 6e 74 33 32 20  ransform(uint32 
19620 62 75 66 5b 34 5d 2c 20 63 6f 6e 73 74 20 75 69  buf[4], const ui
19630 6e 74 33 32 20 69 6e 5b 31 36 5d 29 7b 0a 20 20  nt32 in[16]){.  
19640 20 20 20 20 20 20 72 65 67 69 73 74 65 72 20 75        register u
19650 69 6e 74 33 32 20 61 2c 20 62 2c 20 63 2c 20 64  int32 a, b, c, d
19660 3b 0a 0a 20 20 20 20 20 20 20 20 61 20 3d 20 62  ;..        a = b
19670 75 66 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20 62  uf[0];.        b
19680 20 3d 20 62 75 66 5b 31 5d 3b 0a 20 20 20 20 20   = buf[1];.     
19690 20 20 20 63 20 3d 20 62 75 66 5b 32 5d 3b 0a 20     c = buf[2];. 
196a0 20 20 20 20 20 20 20 64 20 3d 20 62 75 66 5b 33         d = buf[3
196b0 5d 3b 0a 0a 20 20 20 20 20 20 20 20 4d 44 35 53  ];..        MD5S
196c0 54 45 50 28 46 31 2c 20 61 2c 20 62 2c 20 63 2c  TEP(F1, a, b, c,
196d0 20 64 2c 20 69 6e 5b 20 30 5d 2b 30 78 64 37 36   d, in[ 0]+0xd76
196e0 61 61 34 37 38 2c 20 20 37 29 3b 0a 20 20 20 20  aa478,  7);.    
196f0 20 20 20 20 4d 44 35 53 54 45 50 28 46 31 2c 20      MD5STEP(F1, 
19700 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e 5b 20  d, a, b, c, in[ 
19710 31 5d 2b 30 78 65 38 63 37 62 37 35 36 2c 20 31  1]+0xe8c7b756, 1
19720 32 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53  2);.        MD5S
19730 54 45 50 28 46 31 2c 20 63 2c 20 64 2c 20 61 2c  TEP(F1, c, d, a,
19740 20 62 2c 20 69 6e 5b 20 32 5d 2b 30 78 32 34 32   b, in[ 2]+0x242
19750 30 37 30 64 62 2c 20 31 37 29 3b 0a 20 20 20 20  070db, 17);.    
19760 20 20 20 20 4d 44 35 53 54 45 50 28 46 31 2c 20      MD5STEP(F1, 
19770 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e 5b 20  b, c, d, a, in[ 
19780 33 5d 2b 30 78 63 31 62 64 63 65 65 65 2c 20 32  3]+0xc1bdceee, 2
19790 32 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53  2);.        MD5S
197a0 54 45 50 28 46 31 2c 20 61 2c 20 62 2c 20 63 2c  TEP(F1, a, b, c,
197b0 20 64 2c 20 69 6e 5b 20 34 5d 2b 30 78 66 35 37   d, in[ 4]+0xf57
197c0 63 30 66 61 66 2c 20 20 37 29 3b 0a 20 20 20 20  c0faf,  7);.    
197d0 20 20 20 20 4d 44 35 53 54 45 50 28 46 31 2c 20      MD5STEP(F1, 
197e0 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e 5b 20  d, a, b, c, in[ 
197f0 35 5d 2b 30 78 34 37 38 37 63 36 32 61 2c 20 31  5]+0x4787c62a, 1
19800 32 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53  2);.        MD5S
19810 54 45 50 28 46 31 2c 20 63 2c 20 64 2c 20 61 2c  TEP(F1, c, d, a,
19820 20 62 2c 20 69 6e 5b 20 36 5d 2b 30 78 61 38 33   b, in[ 6]+0xa83
19830 30 34 36 31 33 2c 20 31 37 29 3b 0a 20 20 20 20  04613, 17);.    
19840 20 20 20 20 4d 44 35 53 54 45 50 28 46 31 2c 20      MD5STEP(F1, 
19850 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e 5b 20  b, c, d, a, in[ 
19860 37 5d 2b 30 78 66 64 34 36 39 35 30 31 2c 20 32  7]+0xfd469501, 2
19870 32 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53  2);.        MD5S
19880 54 45 50 28 46 31 2c 20 61 2c 20 62 2c 20 63 2c  TEP(F1, a, b, c,
19890 20 64 2c 20 69 6e 5b 20 38 5d 2b 30 78 36 39 38   d, in[ 8]+0x698
198a0 30 39 38 64 38 2c 20 20 37 29 3b 0a 20 20 20 20  098d8,  7);.    
198b0 20 20 20 20 4d 44 35 53 54 45 50 28 46 31 2c 20      MD5STEP(F1, 
198c0 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e 5b 20  d, a, b, c, in[ 
198d0 39 5d 2b 30 78 38 62 34 34 66 37 61 66 2c 20 31  9]+0x8b44f7af, 1
198e0 32 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53  2);.        MD5S
198f0 54 45 50 28 46 31 2c 20 63 2c 20 64 2c 20 61 2c  TEP(F1, c, d, a,
19900 20 62 2c 20 69 6e 5b 31 30 5d 2b 30 78 66 66 66   b, in[10]+0xfff
19910 66 35 62 62 31 2c 20 31 37 29 3b 0a 20 20 20 20  f5bb1, 17);.    
19920 20 20 20 20 4d 44 35 53 54 45 50 28 46 31 2c 20      MD5STEP(F1, 
19930 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e 5b 31  b, c, d, a, in[1
19940 31 5d 2b 30 78 38 39 35 63 64 37 62 65 2c 20 32  1]+0x895cd7be, 2
19950 32 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53  2);.        MD5S
19960 54 45 50 28 46 31 2c 20 61 2c 20 62 2c 20 63 2c  TEP(F1, a, b, c,
19970 20 64 2c 20 69 6e 5b 31 32 5d 2b 30 78 36 62 39   d, in[12]+0x6b9
19980 30 31 31 32 32 2c 20 20 37 29 3b 0a 20 20 20 20  01122,  7);.    
19990 20 20 20 20 4d 44 35 53 54 45 50 28 46 31 2c 20      MD5STEP(F1, 
199a0 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e 5b 31  d, a, b, c, in[1
199b0 33 5d 2b 30 78 66 64 39 38 37 31 39 33 2c 20 31  3]+0xfd987193, 1
199c0 32 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53  2);.        MD5S
199d0 54 45 50 28 46 31 2c 20 63 2c 20 64 2c 20 61 2c  TEP(F1, c, d, a,
199e0 20 62 2c 20 69 6e 5b 31 34 5d 2b 30 78 61 36 37   b, in[14]+0xa67
199f0 39 34 33 38 65 2c 20 31 37 29 3b 0a 20 20 20 20  9438e, 17);.    
19a00 20 20 20 20 4d 44 35 53 54 45 50 28 46 31 2c 20      MD5STEP(F1, 
19a10 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e 5b 31  b, c, d, a, in[1
19a20 35 5d 2b 30 78 34 39 62 34 30 38 32 31 2c 20 32  5]+0x49b40821, 2
19a30 32 29 3b 0a 0a 20 20 20 20 20 20 20 20 4d 44 35  2);..        MD5
19a40 53 54 45 50 28 46 32 2c 20 61 2c 20 62 2c 20 63  STEP(F2, a, b, c
19a50 2c 20 64 2c 20 69 6e 5b 20 31 5d 2b 30 78 66 36  , d, in[ 1]+0xf6
19a60 31 65 32 35 36 32 2c 20 20 35 29 3b 0a 20 20 20  1e2562,  5);.   
19a70 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 32 2c       MD5STEP(F2,
19a80 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e 5b   d, a, b, c, in[
19a90 20 36 5d 2b 30 78 63 30 34 30 62 33 34 30 2c 20   6]+0xc040b340, 
19aa0 20 39 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35   9);.        MD5
19ab0 53 54 45 50 28 46 32 2c 20 63 2c 20 64 2c 20 61  STEP(F2, c, d, a
19ac0 2c 20 62 2c 20 69 6e 5b 31 31 5d 2b 30 78 32 36  , b, in[11]+0x26
19ad0 35 65 35 61 35 31 2c 20 31 34 29 3b 0a 20 20 20  5e5a51, 14);.   
19ae0 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 32 2c       MD5STEP(F2,
19af0 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e 5b   b, c, d, a, in[
19b00 20 30 5d 2b 30 78 65 39 62 36 63 37 61 61 2c 20   0]+0xe9b6c7aa, 
19b10 32 30 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35  20);.        MD5
19b20 53 54 45 50 28 46 32 2c 20 61 2c 20 62 2c 20 63  STEP(F2, a, b, c
19b30 2c 20 64 2c 20 69 6e 5b 20 35 5d 2b 30 78 64 36  , d, in[ 5]+0xd6
19b40 32 66 31 30 35 64 2c 20 20 35 29 3b 0a 20 20 20  2f105d,  5);.   
19b50 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 32 2c       MD5STEP(F2,
19b60 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e 5b   d, a, b, c, in[
19b70 31 30 5d 2b 30 78 30 32 34 34 31 34 35 33 2c 20  10]+0x02441453, 
19b80 20 39 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35   9);.        MD5
19b90 53 54 45 50 28 46 32 2c 20 63 2c 20 64 2c 20 61  STEP(F2, c, d, a
19ba0 2c 20 62 2c 20 69 6e 5b 31 35 5d 2b 30 78 64 38  , b, in[15]+0xd8
19bb0 61 31 65 36 38 31 2c 20 31 34 29 3b 0a 20 20 20  a1e681, 14);.   
19bc0 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 32 2c       MD5STEP(F2,
19bd0 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e 5b   b, c, d, a, in[
19be0 20 34 5d 2b 30 78 65 37 64 33 66 62 63 38 2c 20   4]+0xe7d3fbc8, 
19bf0 32 30 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35  20);.        MD5
19c00 53 54 45 50 28 46 32 2c 20 61 2c 20 62 2c 20 63  STEP(F2, a, b, c
19c10 2c 20 64 2c 20 69 6e 5b 20 39 5d 2b 30 78 32 31  , d, in[ 9]+0x21
19c20 65 31 63 64 65 36 2c 20 20 35 29 3b 0a 20 20 20  e1cde6,  5);.   
19c30 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 32 2c       MD5STEP(F2,
19c40 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e 5b   d, a, b, c, in[
19c50 31 34 5d 2b 30 78 63 33 33 37 30 37 64 36 2c 20  14]+0xc33707d6, 
19c60 20 39 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35   9);.        MD5
19c70 53 54 45 50 28 46 32 2c 20 63 2c 20 64 2c 20 61  STEP(F2, c, d, a
19c80 2c 20 62 2c 20 69 6e 5b 20 33 5d 2b 30 78 66 34  , b, in[ 3]+0xf4
19c90 64 35 30 64 38 37 2c 20 31 34 29 3b 0a 20 20 20  d50d87, 14);.   
19ca0 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 32 2c       MD5STEP(F2,
19cb0 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e 5b   b, c, d, a, in[
19cc0 20 38 5d 2b 30 78 34 35 35 61 31 34 65 64 2c 20   8]+0x455a14ed, 
19cd0 32 30 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35  20);.        MD5
19ce0 53 54 45 50 28 46 32 2c 20 61 2c 20 62 2c 20 63  STEP(F2, a, b, c
19cf0 2c 20 64 2c 20 69 6e 5b 31 33 5d 2b 30 78 61 39  , d, in[13]+0xa9
19d00 65 33 65 39 30 35 2c 20 20 35 29 3b 0a 20 20 20  e3e905,  5);.   
19d10 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 32 2c       MD5STEP(F2,
19d20 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e 5b   d, a, b, c, in[
19d30 20 32 5d 2b 30 78 66 63 65 66 61 33 66 38 2c 20   2]+0xfcefa3f8, 
19d40 20 39 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35   9);.        MD5
19d50 53 54 45 50 28 46 32 2c 20 63 2c 20 64 2c 20 61  STEP(F2, c, d, a
19d60 2c 20 62 2c 20 69 6e 5b 20 37 5d 2b 30 78 36 37  , b, in[ 7]+0x67
19d70 36 66 30 32 64 39 2c 20 31 34 29 3b 0a 20 20 20  6f02d9, 14);.   
19d80 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 32 2c       MD5STEP(F2,
19d90 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e 5b   b, c, d, a, in[
19da0 31 32 5d 2b 30 78 38 64 32 61 34 63 38 61 2c 20  12]+0x8d2a4c8a, 
19db0 32 30 29 3b 0a 0a 20 20 20 20 20 20 20 20 4d 44  20);..        MD
19dc0 35 53 54 45 50 28 46 33 2c 20 61 2c 20 62 2c 20  5STEP(F3, a, b, 
19dd0 63 2c 20 64 2c 20 69 6e 5b 20 35 5d 2b 30 78 66  c, d, in[ 5]+0xf
19de0 66 66 61 33 39 34 32 2c 20 20 34 29 3b 0a 20 20  ffa3942,  4);.  
19df0 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 33        MD5STEP(F3
19e00 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e  , d, a, b, c, in
19e10 5b 20 38 5d 2b 30 78 38 37 37 31 66 36 38 31 2c  [ 8]+0x8771f681,
19e20 20 31 31 29 3b 0a 20 20 20 20 20 20 20 20 4d 44   11);.        MD
19e30 35 53 54 45 50 28 46 33 2c 20 63 2c 20 64 2c 20  5STEP(F3, c, d, 
19e40 61 2c 20 62 2c 20 69 6e 5b 31 31 5d 2b 30 78 36  a, b, in[11]+0x6
19e50 64 39 64 36 31 32 32 2c 20 31 36 29 3b 0a 20 20  d9d6122, 16);.  
19e60 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 33        MD5STEP(F3
19e70 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e  , b, c, d, a, in
19e80 5b 31 34 5d 2b 30 78 66 64 65 35 33 38 30 63 2c  [14]+0xfde5380c,
19e90 20 32 33 29 3b 0a 20 20 20 20 20 20 20 20 4d 44   23);.        MD
19ea0 35 53 54 45 50 28 46 33 2c 20 61 2c 20 62 2c 20  5STEP(F3, a, b, 
19eb0 63 2c 20 64 2c 20 69 6e 5b 20 31 5d 2b 30 78 61  c, d, in[ 1]+0xa
19ec0 34 62 65 65 61 34 34 2c 20 20 34 29 3b 0a 20 20  4beea44,  4);.  
19ed0 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 33        MD5STEP(F3
19ee0 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e  , d, a, b, c, in
19ef0 5b 20 34 5d 2b 30 78 34 62 64 65 63 66 61 39 2c  [ 4]+0x4bdecfa9,
19f00 20 31 31 29 3b 0a 20 20 20 20 20 20 20 20 4d 44   11);.        MD
19f10 35 53 54 45 50 28 46 33 2c 20 63 2c 20 64 2c 20  5STEP(F3, c, d, 
19f20 61 2c 20 62 2c 20 69 6e 5b 20 37 5d 2b 30 78 66  a, b, in[ 7]+0xf
19f30 36 62 62 34 62 36 30 2c 20 31 36 29 3b 0a 20 20  6bb4b60, 16);.  
19f40 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 33        MD5STEP(F3
19f50 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e  , b, c, d, a, in
19f60 5b 31 30 5d 2b 30 78 62 65 62 66 62 63 37 30 2c  [10]+0xbebfbc70,
19f70 20 32 33 29 3b 0a 20 20 20 20 20 20 20 20 4d 44   23);.        MD
19f80 35 53 54 45 50 28 46 33 2c 20 61 2c 20 62 2c 20  5STEP(F3, a, b, 
19f90 63 2c 20 64 2c 20 69 6e 5b 31 33 5d 2b 30 78 32  c, d, in[13]+0x2
19fa0 38 39 62 37 65 63 36 2c 20 20 34 29 3b 0a 20 20  89b7ec6,  4);.  
19fb0 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 33        MD5STEP(F3
19fc0 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e  , d, a, b, c, in
19fd0 5b 20 30 5d 2b 30 78 65 61 61 31 32 37 66 61 2c  [ 0]+0xeaa127fa,
19fe0 20 31 31 29 3b 0a 20 20 20 20 20 20 20 20 4d 44   11);.        MD
19ff0 35 53 54 45 50 28 46 33 2c 20 63 2c 20 64 2c 20  5STEP(F3, c, d, 
1a000 61 2c 20 62 2c 20 69 6e 5b 20 33 5d 2b 30 78 64  a, b, in[ 3]+0xd
1a010 34 65 66 33 30 38 35 2c 20 31 36 29 3b 0a 20 20  4ef3085, 16);.  
1a020 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 33        MD5STEP(F3
1a030 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e  , b, c, d, a, in
1a040 5b 20 36 5d 2b 30 78 30 34 38 38 31 64 30 35 2c  [ 6]+0x04881d05,
1a050 20 32 33 29 3b 0a 20 20 20 20 20 20 20 20 4d 44   23);.        MD
1a060 35 53 54 45 50 28 46 33 2c 20 61 2c 20 62 2c 20  5STEP(F3, a, b, 
1a070 63 2c 20 64 2c 20 69 6e 5b 20 39 5d 2b 30 78 64  c, d, in[ 9]+0xd
1a080 39 64 34 64 30 33 39 2c 20 20 34 29 3b 0a 20 20  9d4d039,  4);.  
1a090 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 33        MD5STEP(F3
1a0a0 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e  , d, a, b, c, in
1a0b0 5b 31 32 5d 2b 30 78 65 36 64 62 39 39 65 35 2c  [12]+0xe6db99e5,
1a0c0 20 31 31 29 3b 0a 20 20 20 20 20 20 20 20 4d 44   11);.        MD
1a0d0 35 53 54 45 50 28 46 33 2c 20 63 2c 20 64 2c 20  5STEP(F3, c, d, 
1a0e0 61 2c 20 62 2c 20 69 6e 5b 31 35 5d 2b 30 78 31  a, b, in[15]+0x1
1a0f0 66 61 32 37 63 66 38 2c 20 31 36 29 3b 0a 20 20  fa27cf8, 16);.  
1a100 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 33        MD5STEP(F3
1a110 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e  , b, c, d, a, in
1a120 5b 20 32 5d 2b 30 78 63 34 61 63 35 36 36 35 2c  [ 2]+0xc4ac5665,
1a130 20 32 33 29 3b 0a 0a 20 20 20 20 20 20 20 20 4d   23);..        M
1a140 44 35 53 54 45 50 28 46 34 2c 20 61 2c 20 62 2c  D5STEP(F4, a, b,
1a150 20 63 2c 20 64 2c 20 69 6e 5b 20 30 5d 2b 30 78   c, d, in[ 0]+0x
1a160 66 34 32 39 32 32 34 34 2c 20 20 36 29 3b 0a 20  f4292244,  6);. 
1a170 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
1a180 34 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69  4, d, a, b, c, i
1a190 6e 5b 20 37 5d 2b 30 78 34 33 32 61 66 66 39 37  n[ 7]+0x432aff97
1a1a0 2c 20 31 30 29 3b 0a 20 20 20 20 20 20 20 20 4d  , 10);.        M
1a1b0 44 35 53 54 45 50 28 46 34 2c 20 63 2c 20 64 2c  D5STEP(F4, c, d,
1a1c0 20 61 2c 20 62 2c 20 69 6e 5b 31 34 5d 2b 30 78   a, b, in[14]+0x
1a1d0 61 62 39 34 32 33 61 37 2c 20 31 35 29 3b 0a 20  ab9423a7, 15);. 
1a1e0 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
1a1f0 34 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69  4, b, c, d, a, i
1a200 6e 5b 20 35 5d 2b 30 78 66 63 39 33 61 30 33 39  n[ 5]+0xfc93a039
1a210 2c 20 32 31 29 3b 0a 20 20 20 20 20 20 20 20 4d  , 21);.        M
1a220 44 35 53 54 45 50 28 46 34 2c 20 61 2c 20 62 2c  D5STEP(F4, a, b,
1a230 20 63 2c 20 64 2c 20 69 6e 5b 31 32 5d 2b 30 78   c, d, in[12]+0x
1a240 36 35 35 62 35 39 63 33 2c 20 20 36 29 3b 0a 20  655b59c3,  6);. 
1a250 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
1a260 34 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69  4, d, a, b, c, i
1a270 6e 5b 20 33 5d 2b 30 78 38 66 30 63 63 63 39 32  n[ 3]+0x8f0ccc92
1a280 2c 20 31 30 29 3b 0a 20 20 20 20 20 20 20 20 4d  , 10);.        M
1a290 44 35 53 54 45 50 28 46 34 2c 20 63 2c 20 64 2c  D5STEP(F4, c, d,
1a2a0 20 61 2c 20 62 2c 20 69 6e 5b 31 30 5d 2b 30 78   a, b, in[10]+0x
1a2b0 66 66 65 66 66 34 37 64 2c 20 31 35 29 3b 0a 20  ffeff47d, 15);. 
1a2c0 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
1a2d0 34 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69  4, b, c, d, a, i
1a2e0 6e 5b 20 31 5d 2b 30 78 38 35 38 34 35 64 64 31  n[ 1]+0x85845dd1
1a2f0 2c 20 32 31 29 3b 0a 20 20 20 20 20 20 20 20 4d  , 21);.        M
1a300 44 35 53 54 45 50 28 46 34 2c 20 61 2c 20 62 2c  D5STEP(F4, a, b,
1a310 20 63 2c 20 64 2c 20 69 6e 5b 20 38 5d 2b 30 78   c, d, in[ 8]+0x
1a320 36 66 61 38 37 65 34 66 2c 20 20 36 29 3b 0a 20  6fa87e4f,  6);. 
1a330 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
1a340 34 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69  4, d, a, b, c, i
1a350 6e 5b 31 35 5d 2b 30 78 66 65 32 63 65 36 65 30  n[15]+0xfe2ce6e0
1a360 2c 20 31 30 29 3b 0a 20 20 20 20 20 20 20 20 4d  , 10);.        M
1a370 44 35 53 54 45 50 28 46 34 2c 20 63 2c 20 64 2c  D5STEP(F4, c, d,
1a380 20 61 2c 20 62 2c 20 69 6e 5b 20 36 5d 2b 30 78   a, b, in[ 6]+0x
1a390 61 33 30 31 34 33 31 34 2c 20 31 35 29 3b 0a 20  a3014314, 15);. 
1a3a0 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
1a3b0 34 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69  4, b, c, d, a, i
1a3c0 6e 5b 31 33 5d 2b 30 78 34 65 30 38 31 31 61 31  n[13]+0x4e0811a1
1a3d0 2c 20 32 31 29 3b 0a 20 20 20 20 20 20 20 20 4d  , 21);.        M
1a3e0 44 35 53 54 45 50 28 46 34 2c 20 61 2c 20 62 2c  D5STEP(F4, a, b,
1a3f0 20 63 2c 20 64 2c 20 69 6e 5b 20 34 5d 2b 30 78   c, d, in[ 4]+0x
1a400 66 37 35 33 37 65 38 32 2c 20 20 36 29 3b 0a 20  f7537e82,  6);. 
1a410 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
1a420 34 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69  4, d, a, b, c, i
1a430 6e 5b 31 31 5d 2b 30 78 62 64 33 61 66 32 33 35  n[11]+0xbd3af235
1a440 2c 20 31 30 29 3b 0a 20 20 20 20 20 20 20 20 4d  , 10);.        M
1a450 44 35 53 54 45 50 28 46 34 2c 20 63 2c 20 64 2c  D5STEP(F4, c, d,
1a460 20 61 2c 20 62 2c 20 69 6e 5b 20 32 5d 2b 30 78   a, b, in[ 2]+0x
1a470 32 61 64 37 64 32 62 62 2c 20 31 35 29 3b 0a 20  2ad7d2bb, 15);. 
1a480 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
1a490 34 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69  4, b, c, d, a, i
1a4a0 6e 5b 20 39 5d 2b 30 78 65 62 38 36 64 33 39 31  n[ 9]+0xeb86d391
1a4b0 2c 20 32 31 29 3b 0a 0a 20 20 20 20 20 20 20 20  , 21);..        
1a4c0 62 75 66 5b 30 5d 20 2b 3d 20 61 3b 0a 20 20 20  buf[0] += a;.   
1a4d0 20 20 20 20 20 62 75 66 5b 31 5d 20 2b 3d 20 62       buf[1] += b
1a4e0 3b 0a 20 20 20 20 20 20 20 20 62 75 66 5b 32 5d  ;.        buf[2]
1a4f0 20 2b 3d 20 63 3b 0a 20 20 20 20 20 20 20 20 62   += c;.        b
1a500 75 66 5b 33 5d 20 2b 3d 20 64 3b 0a 7d 0a 0a 2f  uf[3] += d;.}../
1a510 2a 0a 20 2a 20 53 74 61 72 74 20 4d 44 35 20 61  *. * Start MD5 a
1a520 63 63 75 6d 75 6c 61 74 69 6f 6e 2e 20 20 53 65  ccumulation.  Se
1a530 74 20 62 69 74 20 63 6f 75 6e 74 20 74 6f 20 30  t bit count to 0
1a540 20 61 6e 64 20 62 75 66 66 65 72 20 74 6f 20 6d   and buffer to m
1a550 79 73 74 65 72 69 6f 75 73 0a 20 2a 20 69 6e 69  ysterious. * ini
1a560 74 69 61 6c 69 7a 61 74 69 6f 6e 20 63 6f 6e 73  tialization cons
1a570 74 61 6e 74 73 2e 0a 20 2a 2f 0a 73 74 61 74 69  tants.. */.stati
1a580 63 20 76 6f 69 64 20 4d 44 35 49 6e 69 74 28 4d  c void MD5Init(M
1a590 44 35 43 6f 6e 74 65 78 74 20 2a 63 74 78 29 7b  D5Context *ctx){
1a5a0 0a 20 20 20 20 20 20 20 20 63 74 78 2d 3e 69 73  .        ctx->is
1a5b0 49 6e 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  Init = 1;.      
1a5c0 20 20 63 74 78 2d 3e 62 75 66 5b 30 5d 20 3d 20    ctx->buf[0] = 
1a5d0 30 78 36 37 34 35 32 33 30 31 3b 0a 20 20 20 20  0x67452301;.    
1a5e0 20 20 20 20 63 74 78 2d 3e 62 75 66 5b 31 5d 20      ctx->buf[1] 
1a5f0 3d 20 30 78 65 66 63 64 61 62 38 39 3b 0a 20 20  = 0xefcdab89;.  
1a600 20 20 20 20 20 20 63 74 78 2d 3e 62 75 66 5b 32        ctx->buf[2
1a610 5d 20 3d 20 30 78 39 38 62 61 64 63 66 65 3b 0a  ] = 0x98badcfe;.
1a620 20 20 20 20 20 20 20 20 63 74 78 2d 3e 62 75 66          ctx->buf
1a630 5b 33 5d 20 3d 20 30 78 31 30 33 32 35 34 37 36  [3] = 0x10325476
1a640 3b 0a 20 20 20 20 20 20 20 20 63 74 78 2d 3e 62  ;.        ctx->b
1a650 69 74 73 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20  its[0] = 0;.    
1a660 20 20 20 20 63 74 78 2d 3e 62 69 74 73 5b 31 5d      ctx->bits[1]
1a670 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 55   = 0;.}../*. * U
1a680 70 64 61 74 65 20 63 6f 6e 74 65 78 74 20 74 6f  pdate context to
1a690 20 72 65 66 6c 65 63 74 20 74 68 65 20 63 6f 6e   reflect the con
1a6a0 63 61 74 65 6e 61 74 69 6f 6e 20 6f 66 20 61 6e  catenation of an
1a6b0 6f 74 68 65 72 20 62 75 66 66 65 72 20 66 75 6c  other buffer ful
1a6c0 6c 0a 20 2a 20 6f 66 20 62 79 74 65 73 2e 0a 20  l. * of bytes.. 
1a6d0 2a 2f 0a 73 74 61 74 69 63 20 0a 76 6f 69 64 20  */.static .void 
1a6e0 4d 44 35 55 70 64 61 74 65 28 4d 44 35 43 6f 6e  MD5Update(MD5Con
1a6f0 74 65 78 74 20 2a 63 74 78 2c 20 63 6f 6e 73 74  text *ctx, const
1a700 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
1a710 62 75 66 2c 20 75 6e 73 69 67 6e 65 64 20 69 6e  buf, unsigned in
1a720 74 20 6c 65 6e 29 7b 0a 20 20 20 20 20 20 20 20  t len){.        
1a730 75 69 6e 74 33 32 20 74 3b 0a 0a 20 20 20 20 20  uint32 t;..     
1a740 20 20 20 2f 2a 20 55 70 64 61 74 65 20 62 69 74     /* Update bit
1a750 63 6f 75 6e 74 20 2a 2f 0a 0a 20 20 20 20 20 20  count */..      
1a760 20 20 74 20 3d 20 63 74 78 2d 3e 62 69 74 73 5b    t = ctx->bits[
1a770 30 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 20 28  0];.        if (
1a780 28 63 74 78 2d 3e 62 69 74 73 5b 30 5d 20 3d 20  (ctx->bits[0] = 
1a790 74 20 2b 20 28 28 75 69 6e 74 33 32 29 6c 65 6e  t + ((uint32)len
1a7a0 20 3c 3c 20 33 29 29 20 3c 20 74 29 0a 20 20 20   << 3)) < t).   
1a7b0 20 20 20 20 20 20 20 20 20 20 20 20 20 63 74 78               ctx
1a7c0 2d 3e 62 69 74 73 5b 31 5d 2b 2b 3b 20 2f 2a 20  ->bits[1]++; /* 
1a7d0 43 61 72 72 79 20 66 72 6f 6d 20 6c 6f 77 20 74  Carry from low t
1a7e0 6f 20 68 69 67 68 20 2a 2f 0a 20 20 20 20 20 20  o high */.      
1a7f0 20 20 63 74 78 2d 3e 62 69 74 73 5b 31 5d 20 2b    ctx->bits[1] +
1a800 3d 20 6c 65 6e 20 3e 3e 20 32 39 3b 0a 0a 20 20  = len >> 29;..  
1a810 20 20 20 20 20 20 74 20 3d 20 28 74 20 3e 3e 20        t = (t >> 
1a820 33 29 20 26 20 30 78 33 66 3b 20 20 20 20 2f 2a  3) & 0x3f;    /*
1a830 20 42 79 74 65 73 20 61 6c 72 65 61 64 79 20 69   Bytes already i
1a840 6e 20 73 68 73 49 6e 66 6f 2d 3e 64 61 74 61 20  n shsInfo->data 
1a850 2a 2f 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 48  */..        /* H
1a860 61 6e 64 6c 65 20 61 6e 79 20 6c 65 61 64 69 6e  andle any leadin
1a870 67 20 6f 64 64 2d 73 69 7a 65 64 20 63 68 75 6e  g odd-sized chun
1a880 6b 73 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 69  ks */..        i
1a890 66 20 28 20 74 20 29 20 7b 0a 20 20 20 20 20 20  f ( t ) {.      
1a8a0 20 20 20 20 20 20 20 20 20 20 75 6e 73 69 67 6e            unsign
1a8b0 65 64 20 63 68 61 72 20 2a 70 20 3d 20 28 75 6e  ed char *p = (un
1a8c0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 63 74  signed char *)ct
1a8d0 78 2d 3e 69 6e 20 2b 20 74 3b 0a 0a 20 20 20 20  x->in + t;..    
1a8e0 20 20 20 20 20 20 20 20 20 20 20 20 74 20 3d 20              t = 
1a8f0 36 34 2d 74 3b 0a 20 20 20 20 20 20 20 20 20 20  64-t;.          
1a900 20 20 20 20 20 20 69 66 20 28 6c 65 6e 20 3c 20        if (len < 
1a910 74 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t) {.           
1a920 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d               mem
1a930 63 70 79 28 70 2c 20 62 75 66 2c 20 6c 65 6e 29  cpy(p, buf, len)
1a940 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1a950 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
1a960 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1a970 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
1a980 20 20 20 20 6d 65 6d 63 70 79 28 70 2c 20 62 75      memcpy(p, bu
1a990 66 2c 20 74 29 3b 0a 20 20 20 20 20 20 20 20 20  f, t);.         
1a9a0 20 20 20 20 20 20 20 62 79 74 65 52 65 76 65 72         byteRever
1a9b0 73 65 28 63 74 78 2d 3e 69 6e 2c 20 31 36 29 3b  se(ctx->in, 16);
1a9c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1a9d0 20 4d 44 35 54 72 61 6e 73 66 6f 72 6d 28 63 74   MD5Transform(ct
1a9e0 78 2d 3e 62 75 66 2c 20 28 75 69 6e 74 33 32 20  x->buf, (uint32 
1a9f0 2a 29 63 74 78 2d 3e 69 6e 29 3b 0a 20 20 20 20  *)ctx->in);.    
1aa00 20 20 20 20 20 20 20 20 20 20 20 20 62 75 66 20              buf 
1aa10 2b 3d 20 74 3b 0a 20 20 20 20 20 20 20 20 20 20  += t;.          
1aa20 20 20 20 20 20 20 6c 65 6e 20 2d 3d 20 74 3b 0a        len -= t;.
1aa30 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
1aa40 20 20 20 2f 2a 20 50 72 6f 63 65 73 73 20 64 61     /* Process da
1aa50 74 61 20 69 6e 20 36 34 2d 62 79 74 65 20 63 68  ta in 64-byte ch
1aa60 75 6e 6b 73 20 2a 2f 0a 0a 20 20 20 20 20 20 20  unks */..       
1aa70 20 77 68 69 6c 65 20 28 6c 65 6e 20 3e 3d 20 36   while (len >= 6
1aa80 34 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  4) {.           
1aa90 20 20 20 20 20 6d 65 6d 63 70 79 28 63 74 78 2d       memcpy(ctx-
1aaa0 3e 69 6e 2c 20 62 75 66 2c 20 36 34 29 3b 0a 20  >in, buf, 64);. 
1aab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
1aac0 79 74 65 52 65 76 65 72 73 65 28 63 74 78 2d 3e  yteReverse(ctx->
1aad0 69 6e 2c 20 31 36 29 3b 0a 20 20 20 20 20 20 20  in, 16);.       
1aae0 20 20 20 20 20 20 20 20 20 4d 44 35 54 72 61 6e           MD5Tran
1aaf0 73 66 6f 72 6d 28 63 74 78 2d 3e 62 75 66 2c 20  sform(ctx->buf, 
1ab00 28 75 69 6e 74 33 32 20 2a 29 63 74 78 2d 3e 69  (uint32 *)ctx->i
1ab10 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  n);.            
1ab20 20 20 20 20 62 75 66 20 2b 3d 20 36 34 3b 0a 20      buf += 64;. 
1ab30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c                 l
1ab40 65 6e 20 2d 3d 20 36 34 3b 0a 20 20 20 20 20 20  en -= 64;.      
1ab50 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20    }..        /* 
1ab60 48 61 6e 64 6c 65 20 61 6e 79 20 72 65 6d 61 69  Handle any remai
1ab70 6e 69 6e 67 20 62 79 74 65 73 20 6f 66 20 64 61  ning bytes of da
1ab80 74 61 2e 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20  ta. */..        
1ab90 6d 65 6d 63 70 79 28 63 74 78 2d 3e 69 6e 2c 20  memcpy(ctx->in, 
1aba0 62 75 66 2c 20 6c 65 6e 29 3b 0a 7d 0a 0a 2f 2a  buf, len);.}../*
1abb0 0a 20 2a 20 46 69 6e 61 6c 20 77 72 61 70 75 70  . * Final wrapup
1abc0 20 2d 20 70 61 64 20 74 6f 20 36 34 2d 62 79 74   - pad to 64-byt
1abd0 65 20 62 6f 75 6e 64 61 72 79 20 77 69 74 68 20  e boundary with 
1abe0 74 68 65 20 62 69 74 20 70 61 74 74 65 72 6e 20  the bit pattern 
1abf0 0a 20 2a 20 31 20 30 2a 20 28 36 34 2d 62 69 74  . * 1 0* (64-bit
1ac00 20 63 6f 75 6e 74 20 6f 66 20 62 69 74 73 20 70   count of bits p
1ac10 72 6f 63 65 73 73 65 64 2c 20 4d 53 42 2d 66 69  rocessed, MSB-fi
1ac20 72 73 74 29 0a 20 2a 2f 0a 73 74 61 74 69 63 20  rst). */.static 
1ac30 76 6f 69 64 20 4d 44 35 46 69 6e 61 6c 28 75 6e  void MD5Final(un
1ac40 73 69 67 6e 65 64 20 63 68 61 72 20 64 69 67 65  signed char dige
1ac50 73 74 5b 31 36 5d 2c 20 4d 44 35 43 6f 6e 74 65  st[16], MD5Conte
1ac60 78 74 20 2a 63 74 78 29 7b 0a 20 20 20 20 20 20  xt *ctx){.      
1ac70 20 20 75 6e 73 69 67 6e 65 64 20 63 6f 75 6e 74    unsigned count
1ac80 3b 0a 20 20 20 20 20 20 20 20 75 6e 73 69 67 6e  ;.        unsign
1ac90 65 64 20 63 68 61 72 20 2a 70 3b 0a 0a 20 20 20  ed char *p;..   
1aca0 20 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20       /* Compute 
1acb0 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
1acc0 6d 6f 64 20 36 34 20 2a 2f 0a 20 20 20 20 20 20  mod 64 */.      
1acd0 20 20 63 6f 75 6e 74 20 3d 20 28 63 74 78 2d 3e    count = (ctx->
1ace0 62 69 74 73 5b 30 5d 20 3e 3e 20 33 29 20 26 20  bits[0] >> 3) & 
1acf0 30 78 33 46 3b 0a 0a 20 20 20 20 20 20 20 20 2f  0x3F;..        /
1ad00 2a 20 53 65 74 20 74 68 65 20 66 69 72 73 74 20  * Set the first 
1ad10 63 68 61 72 20 6f 66 20 70 61 64 64 69 6e 67 20  char of padding 
1ad20 74 6f 20 30 78 38 30 2e 20 20 54 68 69 73 20 69  to 0x80.  This i
1ad30 73 20 73 61 66 65 20 73 69 6e 63 65 20 74 68 65  s safe since the
1ad40 72 65 20 69 73 0a 20 20 20 20 20 20 20 20 20 20  re is.          
1ad50 20 61 6c 77 61 79 73 20 61 74 20 6c 65 61 73 74   always at least
1ad60 20 6f 6e 65 20 62 79 74 65 20 66 72 65 65 20 2a   one byte free *
1ad70 2f 0a 20 20 20 20 20 20 20 20 70 20 3d 20 63 74  /.        p = ct
1ad80 78 2d 3e 69 6e 20 2b 20 63 6f 75 6e 74 3b 0a 20  x->in + count;. 
1ad90 20 20 20 20 20 20 20 2a 70 2b 2b 20 3d 20 30 78         *p++ = 0x
1ada0 38 30 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20  80;..        /* 
1adb0 42 79 74 65 73 20 6f 66 20 70 61 64 64 69 6e 67  Bytes of padding
1adc0 20 6e 65 65 64 65 64 20 74 6f 20 6d 61 6b 65 20   needed to make 
1add0 36 34 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20  64 bytes */.    
1ade0 20 20 20 20 63 6f 75 6e 74 20 3d 20 36 34 20 2d      count = 64 -
1adf0 20 31 20 2d 20 63 6f 75 6e 74 3b 0a 0a 20 20 20   1 - count;..   
1ae00 20 20 20 20 20 2f 2a 20 50 61 64 20 6f 75 74 20       /* Pad out 
1ae10 74 6f 20 35 36 20 6d 6f 64 20 36 34 20 2a 2f 0a  to 56 mod 64 */.
1ae20 20 20 20 20 20 20 20 20 69 66 20 28 63 6f 75 6e          if (coun
1ae30 74 20 3c 20 38 29 20 7b 0a 20 20 20 20 20 20 20  t < 8) {.       
1ae40 20 20 20 20 20 20 20 20 20 2f 2a 20 54 77 6f 20           /* Two 
1ae50 6c 6f 74 73 20 6f 66 20 70 61 64 64 69 6e 67 3a  lots of padding:
1ae60 20 20 50 61 64 20 74 68 65 20 66 69 72 73 74 20    Pad the first 
1ae70 62 6c 6f 63 6b 20 74 6f 20 36 34 20 62 79 74 65  block to 64 byte
1ae80 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  s */.           
1ae90 20 20 20 20 20 6d 65 6d 73 65 74 28 70 2c 20 30       memset(p, 0
1aea0 2c 20 63 6f 75 6e 74 29 3b 0a 20 20 20 20 20 20  , count);.      
1aeb0 20 20 20 20 20 20 20 20 20 20 62 79 74 65 52 65            byteRe
1aec0 76 65 72 73 65 28 63 74 78 2d 3e 69 6e 2c 20 31  verse(ctx->in, 1
1aed0 36 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  6);.            
1aee0 20 20 20 20 4d 44 35 54 72 61 6e 73 66 6f 72 6d      MD5Transform
1aef0 28 63 74 78 2d 3e 62 75 66 2c 20 28 75 69 6e 74  (ctx->buf, (uint
1af00 33 32 20 2a 29 63 74 78 2d 3e 69 6e 29 3b 0a 0a  32 *)ctx->in);..
1af10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1af20 2f 2a 20 4e 6f 77 20 66 69 6c 6c 20 74 68 65 20  /* Now fill the 
1af30 6e 65 78 74 20 62 6c 6f 63 6b 20 77 69 74 68 20  next block with 
1af40 35 36 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20  56 bytes */.    
1af50 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 73              mems
1af60 65 74 28 63 74 78 2d 3e 69 6e 2c 20 30 2c 20 35  et(ctx->in, 0, 5
1af70 36 29 3b 0a 20 20 20 20 20 20 20 20 7d 20 65 6c  6);.        } el
1af80 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  se {.           
1af90 20 20 20 20 20 2f 2a 20 50 61 64 20 62 6c 6f 63       /* Pad bloc
1afa0 6b 20 74 6f 20 35 36 20 62 79 74 65 73 20 2a 2f  k to 56 bytes */
1afb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1afc0 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 63 6f   memset(p, 0, co
1afd0 75 6e 74 2d 38 29 3b 0a 20 20 20 20 20 20 20 20  unt-8);.        
1afe0 7d 0a 20 20 20 20 20 20 20 20 62 79 74 65 52 65  }.        byteRe
1aff0 76 65 72 73 65 28 63 74 78 2d 3e 69 6e 2c 20 31  verse(ctx->in, 1
1b000 34 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20  4);..        /* 
1b010 41 70 70 65 6e 64 20 6c 65 6e 67 74 68 20 69 6e  Append length in
1b020 20 62 69 74 73 20 61 6e 64 20 74 72 61 6e 73 66   bits and transf
1b030 6f 72 6d 20 2a 2f 0a 20 20 20 20 20 20 20 20 28  orm */.        (
1b040 28 75 69 6e 74 33 32 20 2a 29 63 74 78 2d 3e 69  (uint32 *)ctx->i
1b050 6e 29 5b 20 31 34 20 5d 20 3d 20 63 74 78 2d 3e  n)[ 14 ] = ctx->
1b060 62 69 74 73 5b 30 5d 3b 0a 20 20 20 20 20 20 20  bits[0];.       
1b070 20 28 28 75 69 6e 74 33 32 20 2a 29 63 74 78 2d   ((uint32 *)ctx-
1b080 3e 69 6e 29 5b 20 31 35 20 5d 20 3d 20 63 74 78  >in)[ 15 ] = ctx
1b090 2d 3e 62 69 74 73 5b 31 5d 3b 0a 0a 20 20 20 20  ->bits[1];..    
1b0a0 20 20 20 20 4d 44 35 54 72 61 6e 73 66 6f 72 6d      MD5Transform
1b0b0 28 63 74 78 2d 3e 62 75 66 2c 20 28 75 69 6e 74  (ctx->buf, (uint
1b0c0 33 32 20 2a 29 63 74 78 2d 3e 69 6e 29 3b 0a 20  32 *)ctx->in);. 
1b0d0 20 20 20 20 20 20 20 62 79 74 65 52 65 76 65 72         byteRever
1b0e0 73 65 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61  se((unsigned cha
1b0f0 72 20 2a 29 63 74 78 2d 3e 62 75 66 2c 20 34 29  r *)ctx->buf, 4)
1b100 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  ;.        memcpy
1b110 28 64 69 67 65 73 74 2c 20 63 74 78 2d 3e 62 75  (digest, ctx->bu
1b120 66 2c 20 31 36 29 3b 0a 20 20 20 20 20 20 20 20  f, 16);.        
1b130 6d 65 6d 73 65 74 28 63 74 78 2c 20 30 2c 20 73  memset(ctx, 0, s
1b140 69 7a 65 6f 66 28 63 74 78 29 29 3b 20 20 20 20  izeof(ctx));    
1b150 2f 2a 20 49 6e 20 63 61 73 65 20 69 74 20 69 73  /* In case it is
1b160 20 73 65 6e 73 69 74 69 76 65 20 2a 2f 0a 7d 0a   sensitive */.}.
1b170 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61  ./*.** Convert a
1b180 20 31 32 38 2d 62 69 74 20 4d 44 35 20 64 69 67   128-bit MD5 dig
1b190 65 73 74 20 69 6e 74 6f 20 61 20 33 32 2d 64 69  est into a 32-di
1b1a0 67 69 74 20 62 61 73 65 2d 31 36 20 6e 75 6d 62  git base-16 numb
1b1b0 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  er..*/.static vo
1b1c0 69 64 20 4d 44 35 44 69 67 65 73 74 54 6f 42 61  id MD5DigestToBa
1b1d0 73 65 31 36 28 75 6e 73 69 67 6e 65 64 20 63 68  se16(unsigned ch
1b1e0 61 72 20 2a 64 69 67 65 73 74 2c 20 63 68 61 72  ar *digest, char
1b1f0 20 2a 7a 42 75 66 29 7b 0a 20 20 73 74 61 74 69   *zBuf){.  stati
1b200 63 20 63 68 61 72 20 63 6f 6e 73 74 20 7a 45 6e  c char const zEn
1b210 63 6f 64 65 5b 5d 20 3d 20 22 30 31 32 33 34 35  code[] = "012345
1b220 36 37 38 39 61 62 63 64 65 66 22 3b 0a 20 20 69  6789abcdef";.  i
1b230 6e 74 20 69 2c 20 6a 3b 0a 0a 20 20 66 6f 72 28  nt i, j;..  for(
1b240 6a 3d 69 3d 30 3b 20 69 3c 31 36 3b 20 69 2b 2b  j=i=0; i<16; i++
1b250 29 7b 0a 20 20 20 20 69 6e 74 20 61 20 3d 20 64  ){.    int a = d
1b260 69 67 65 73 74 5b 69 5d 3b 0a 20 20 20 20 7a 42  igest[i];.    zB
1b270 75 66 5b 6a 2b 2b 5d 20 3d 20 7a 45 6e 63 6f 64  uf[j++] = zEncod
1b280 65 5b 28 61 3e 3e 34 29 26 30 78 66 5d 3b 0a 20  e[(a>>4)&0xf];. 
1b290 20 20 20 7a 42 75 66 5b 6a 2b 2b 5d 20 3d 20 7a     zBuf[j++] = z
1b2a0 45 6e 63 6f 64 65 5b 61 20 26 20 30 78 66 5d 3b  Encode[a & 0xf];
1b2b0 0a 20 20 7d 0a 20 20 7a 42 75 66 5b 6a 5d 20 3d  .  }.  zBuf[j] =
1b2c0 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f   0;.}.../*.** Co
1b2d0 6e 76 65 72 74 20 61 20 31 32 38 2d 62 69 74 20  nvert a 128-bit 
1b2e0 4d 44 35 20 64 69 67 65 73 74 20 69 6e 74 6f 20  MD5 digest into 
1b2f0 73 65 71 75 65 6e 63 79 20 6f 66 20 65 69 67 68  sequency of eigh
1b300 74 20 35 2d 64 69 67 69 74 20 69 6e 74 65 67 65  t 5-digit intege
1b310 72 73 0a 2a 2a 20 65 61 63 68 20 72 65 70 72 65  rs.** each repre
1b320 73 65 6e 74 69 6e 67 20 31 36 20 62 69 74 73 20  senting 16 bits 
1b330 6f 66 20 74 68 65 20 64 69 67 65 73 74 20 61 6e  of the digest an
1b340 64 20 73 65 70 61 72 61 74 65 64 20 66 72 6f 6d  d separated from
1b350 20 65 61 63 68 0a 2a 2a 20 6f 74 68 65 72 20 62   each.** other b
1b360 79 20 61 20 22 2d 22 20 63 68 61 72 61 63 74 65  y a "-" characte
1b370 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  r..*/.static voi
1b380 64 20 4d 44 35 44 69 67 65 73 74 54 6f 42 61 73  d MD5DigestToBas
1b390 65 31 30 78 38 28 75 6e 73 69 67 6e 65 64 20 63  e10x8(unsigned c
1b3a0 68 61 72 20 64 69 67 65 73 74 5b 31 36 5d 2c 20  har digest[16], 
1b3b0 63 68 61 72 20 7a 44 69 67 65 73 74 5b 35 30 5d  char zDigest[50]
1b3c0 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  ){.  int i, j;. 
1b3d0 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 78 3b   unsigned int x;
1b3e0 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c  .  for(i=j=0; i<
1b3f0 31 36 3b 20 69 2b 3d 32 29 7b 0a 20 20 20 20 78  16; i+=2){.    x
1b400 20 3d 20 64 69 67 65 73 74 5b 69 5d 2a 32 35 36   = digest[i]*256
1b410 20 2b 20 64 69 67 65 73 74 5b 69 2b 31 5d 3b 0a   + digest[i+1];.
1b420 20 20 20 20 69 66 28 20 69 3e 30 20 29 20 7a 44      if( i>0 ) zD
1b430 69 67 65 73 74 5b 6a 2b 2b 5d 20 3d 20 27 2d 27  igest[j++] = '-'
1b440 3b 0a 20 20 20 20 73 70 72 69 6e 74 66 28 26 7a  ;.    sprintf(&z
1b450 44 69 67 65 73 74 5b 6a 5d 2c 20 22 25 30 35 75  Digest[j], "%05u
1b460 22 2c 20 78 29 3b 0a 20 20 20 20 6a 20 2b 3d 20  ", x);.    j += 
1b470 35 3b 0a 20 20 7d 0a 20 20 7a 44 69 67 65 73 74  5;.  }.  zDigest
1b480 5b 6a 5d 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  [j] = 0;.}../*.*
1b490 2a 20 41 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20  * A TCL command 
1b4a0 66 6f 72 20 6d 64 35 2e 20 20 54 68 65 20 61 72  for md5.  The ar
1b4b0 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 74 65  gument is the te
1b4c0 78 74 20 74 6f 20 62 65 20 68 61 73 68 65 64 2e  xt to be hashed.
1b4d0 20 20 54 68 65 0a 2a 2a 20 52 65 73 75 6c 74 20    The.** Result 
1b4e0 69 73 20 74 68 65 20 68 61 73 68 20 69 6e 20 62  is the hash in b
1b4f0 61 73 65 36 34 2e 20 20 0a 2a 2f 0a 73 74 61 74  ase64.  .*/.stat
1b500 69 63 20 69 6e 74 20 6d 64 35 5f 63 6d 64 28 76  ic int md5_cmd(v
1b510 6f 69 64 2a 63 64 2c 20 54 63 6c 5f 49 6e 74 65  oid*cd, Tcl_Inte
1b520 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20  rp *interp, int 
1b530 61 72 67 63 2c 20 63 6f 6e 73 74 20 63 68 61 72  argc, const char
1b540 20 2a 2a 61 72 67 76 29 7b 0a 20 20 4d 44 35 43   **argv){.  MD5C
1b550 6f 6e 74 65 78 74 20 63 74 78 3b 0a 20 20 75 6e  ontext ctx;.  un
1b560 73 69 67 6e 65 64 20 63 68 61 72 20 64 69 67 65  signed char dige
1b570 73 74 5b 31 36 5d 3b 0a 20 20 63 68 61 72 20 7a  st[16];.  char z
1b580 42 75 66 5b 35 30 5d 3b 0a 20 20 76 6f 69 64 20  Buf[50];.  void 
1b590 28 2a 63 6f 6e 76 65 72 74 65 72 29 28 75 6e 73  (*converter)(uns
1b5a0 69 67 6e 65 64 20 63 68 61 72 2a 2c 20 63 68 61  igned char*, cha
1b5b0 72 2a 29 3b 0a 0a 20 20 69 66 28 20 61 72 67 63  r*);..  if( argc
1b5c0 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=2 ){.    Tcl_A
1b5d0 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
1b5e0 72 70 2c 22 77 72 6f 6e 67 20 23 20 61 72 67 73  rp,"wrong # args
1b5f0 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
1b600 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20   argv[0], .     
1b610 20 20 20 22 20 54 45 58 54 5c 22 22 2c 20 30 29     " TEXT\"", 0)
1b620 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
1b630 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 4d 44  _ERROR;.  }.  MD
1b640 35 49 6e 69 74 28 26 63 74 78 29 3b 0a 20 20 4d  5Init(&ctx);.  M
1b650 44 35 55 70 64 61 74 65 28 26 63 74 78 2c 20 28  D5Update(&ctx, (
1b660 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 61  unsigned char*)a
1b670 72 67 76 5b 31 5d 2c 20 28 75 6e 73 69 67 6e 65  rgv[1], (unsigne
1b680 64 29 73 74 72 6c 65 6e 28 61 72 67 76 5b 31 5d  d)strlen(argv[1]
1b690 29 29 3b 0a 20 20 4d 44 35 46 69 6e 61 6c 28 64  ));.  MD5Final(d
1b6a0 69 67 65 73 74 2c 20 26 63 74 78 29 3b 0a 20 20  igest, &ctx);.  
1b6b0 63 6f 6e 76 65 72 74 65 72 20 3d 20 28 76 6f 69  converter = (voi
1b6c0 64 28 2a 29 28 75 6e 73 69 67 6e 65 64 20 63 68  d(*)(unsigned ch
1b6d0 61 72 2a 2c 63 68 61 72 2a 29 29 63 64 3b 0a 20  ar*,char*))cd;. 
1b6e0 20 63 6f 6e 76 65 72 74 65 72 28 64 69 67 65 73   converter(diges
1b6f0 74 2c 20 7a 42 75 66 29 3b 0a 20 20 54 63 6c 5f  t, zBuf);.  Tcl_
1b700 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
1b710 65 72 70 2c 20 7a 42 75 66 2c 20 28 63 68 61 72  erp, zBuf, (char
1b720 2a 29 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  *)0);.  return T
1b730 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
1b740 41 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20 74 6f  A TCL command to
1b750 20 74 61 6b 65 20 74 68 65 20 6d 64 35 20 68 61   take the md5 ha
1b760 73 68 20 6f 66 20 61 20 66 69 6c 65 2e 20 20 54  sh of a file.  T
1b770 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74  he argument is t
1b780 68 65 0a 2a 2a 20 6e 61 6d 65 20 6f 66 20 74 68  he.** name of th
1b790 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  e file..*/.stati
1b7a0 63 20 69 6e 74 20 6d 64 35 66 69 6c 65 5f 63 6d  c int md5file_cm
1b7b0 64 28 76 6f 69 64 2a 63 64 2c 20 54 63 6c 5f 49  d(void*cd, Tcl_I
1b7c0 6e 74 65 72 70 2a 69 6e 74 65 72 70 2c 20 69 6e  nterp*interp, in
1b7d0 74 20 61 72 67 63 2c 20 63 6f 6e 73 74 20 63 68  t argc, const ch
1b7e0 61 72 20 2a 2a 61 72 67 76 29 7b 0a 20 20 46 49  ar **argv){.  FI
1b7f0 4c 45 20 2a 69 6e 3b 0a 20 20 4d 44 35 43 6f 6e  LE *in;.  MD5Con
1b800 74 65 78 74 20 63 74 78 3b 0a 20 20 76 6f 69 64  text ctx;.  void
1b810 20 28 2a 63 6f 6e 76 65 72 74 65 72 29 28 75 6e   (*converter)(un
1b820 73 69 67 6e 65 64 20 63 68 61 72 2a 2c 20 63 68  signed char*, ch
1b830 61 72 2a 29 3b 0a 20 20 75 6e 73 69 67 6e 65 64  ar*);.  unsigned
1b840 20 63 68 61 72 20 64 69 67 65 73 74 5b 31 36 5d   char digest[16]
1b850 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 31 30  ;.  char zBuf[10
1b860 32 34 30 5d 3b 0a 0a 20 20 69 66 28 20 61 72 67  240];..  if( arg
1b870 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=2 ){.    Tcl_
1b880 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
1b890 65 72 70 2c 22 77 72 6f 6e 67 20 23 20 61 72 67  erp,"wrong # arg
1b8a0 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
1b8b0 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20  , argv[0], .    
1b8c0 20 20 20 20 22 20 46 49 4c 45 4e 41 4d 45 5c 22      " FILENAME\"
1b8d0 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
1b8e0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
1b8f0 0a 20 20 69 6e 20 3d 20 66 6f 70 65 6e 28 61 72  .  in = fopen(ar
1b900 67 76 5b 31 5d 2c 22 72 62 22 29 3b 0a 20 20 69  gv[1],"rb");.  i
1b910 66 28 20 69 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  f( in==0 ){.    
1b920 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
1b930 28 69 6e 74 65 72 70 2c 22 75 6e 61 62 6c 65 20  (interp,"unable 
1b940 74 6f 20 6f 70 65 6e 20 66 69 6c 65 20 5c 22 22  to open file \""
1b950 2c 20 61 72 67 76 5b 31 5d 2c 20 0a 20 20 20 20  , argv[1], .    
1b960 20 20 20 20 20 22 5c 22 20 66 6f 72 20 72 65 61       "\" for rea
1b970 64 69 6e 67 22 2c 20 30 29 3b 0a 20 20 20 20 72  ding", 0);.    r
1b980 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1b990 0a 20 20 7d 0a 20 20 4d 44 35 49 6e 69 74 28 26  .  }.  MD5Init(&
1b9a0 63 74 78 29 3b 0a 20 20 66 6f 72 28 3b 3b 29 7b  ctx);.  for(;;){
1b9b0 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20  .    int n;.    
1b9c0 6e 20 3d 20 66 72 65 61 64 28 7a 42 75 66 2c 20  n = fread(zBuf, 
1b9d0 31 2c 20 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c  1, sizeof(zBuf),
1b9e0 20 69 6e 29 3b 0a 20 20 20 20 69 66 28 20 6e 3c   in);.    if( n<
1b9f0 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
1ba00 4d 44 35 55 70 64 61 74 65 28 26 63 74 78 2c 20  MD5Update(&ctx, 
1ba10 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29  (unsigned char*)
1ba20 7a 42 75 66 2c 20 28 75 6e 73 69 67 6e 65 64 29  zBuf, (unsigned)
1ba30 6e 29 3b 0a 20 20 7d 0a 20 20 66 63 6c 6f 73 65  n);.  }.  fclose
1ba40 28 69 6e 29 3b 0a 20 20 4d 44 35 46 69 6e 61 6c  (in);.  MD5Final
1ba50 28 64 69 67 65 73 74 2c 20 26 63 74 78 29 3b 0a  (digest, &ctx);.
1ba60 20 20 63 6f 6e 76 65 72 74 65 72 20 3d 20 28 76    converter = (v
1ba70 6f 69 64 28 2a 29 28 75 6e 73 69 67 6e 65 64 20  oid(*)(unsigned 
1ba80 63 68 61 72 2a 2c 63 68 61 72 2a 29 29 63 64 3b  char*,char*))cd;
1ba90 0a 20 20 63 6f 6e 76 65 72 74 65 72 28 64 69 67  .  converter(dig
1baa0 65 73 74 2c 20 7a 42 75 66 29 3b 0a 20 20 54 63  est, zBuf);.  Tc
1bab0 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
1bac0 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 28 63 68  nterp, zBuf, (ch
1bad0 61 72 2a 29 30 29 3b 0a 20 20 72 65 74 75 72 6e  ar*)0);.  return
1bae0 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
1baf0 2a 20 52 65 67 69 73 74 65 72 20 74 68 65 20 66  * Register the f
1bb00 6f 75 72 20 6e 65 77 20 54 43 4c 20 63 6f 6d 6d  our new TCL comm
1bb10 61 6e 64 73 20 66 6f 72 20 67 65 6e 65 72 61 74  ands for generat
1bb20 69 6e 67 20 4d 44 35 20 63 68 65 63 6b 73 75 6d  ing MD5 checksum
1bb30 73 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 54 43  s.** with the TC
1bb40 4c 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0a 2a  L interpreter..*
1bb50 2f 0a 69 6e 74 20 4d 64 35 5f 49 6e 69 74 28 54  /.int Md5_Init(T
1bb60 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
1bb70 70 29 7b 0a 20 20 54 63 6c 5f 43 72 65 61 74 65  p){.  Tcl_Create
1bb80 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20  Command(interp, 
1bb90 22 6d 64 35 22 2c 20 28 54 63 6c 5f 43 6d 64 50  "md5", (Tcl_CmdP
1bba0 72 6f 63 2a 29 6d 64 35 5f 63 6d 64 2c 0a 20 20  roc*)md5_cmd,.  
1bbb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bbc0 20 20 4d 44 35 44 69 67 65 73 74 54 6f 42 61 73    MD5DigestToBas
1bbd0 65 31 36 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 43  e16, 0);.  Tcl_C
1bbe0 72 65 61 74 65 43 6f 6d 6d 61 6e 64 28 69 6e 74  reateCommand(int
1bbf0 65 72 70 2c 20 22 6d 64 35 2d 31 30 78 38 22 2c  erp, "md5-10x8",
1bc00 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 6d   (Tcl_CmdProc*)m
1bc10 64 35 5f 63 6d 64 2c 0a 20 20 20 20 20 20 20 20  d5_cmd,.        
1bc20 20 20 20 20 20 20 20 20 20 20 20 20 4d 44 35 44              MD5D
1bc30 69 67 65 73 74 54 6f 42 61 73 65 31 30 78 38 2c  igestToBase10x8,
1bc40 20 30 29 3b 0a 20 20 54 63 6c 5f 43 72 65 61 74   0);.  Tcl_Creat
1bc50 65 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c  eCommand(interp,
1bc60 20 22 6d 64 35 66 69 6c 65 22 2c 20 28 54 63 6c   "md5file", (Tcl
1bc70 5f 43 6d 64 50 72 6f 63 2a 29 6d 64 35 66 69 6c  _CmdProc*)md5fil
1bc80 65 5f 63 6d 64 2c 0a 20 20 20 20 20 20 20 20 20  e_cmd,.         
1bc90 20 20 20 20 20 20 20 20 20 20 20 4d 44 35 44 69             MD5Di
1bca0 67 65 73 74 54 6f 42 61 73 65 31 36 2c 20 30 29  gestToBase16, 0)
1bcb0 3b 0a 20 20 54 63 6c 5f 43 72 65 61 74 65 43 6f  ;.  Tcl_CreateCo
1bcc0 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 6d  mmand(interp, "m
1bcd0 64 35 66 69 6c 65 2d 31 30 78 38 22 2c 20 28 54  d5file-10x8", (T
1bce0 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 6d 64 35 66  cl_CmdProc*)md5f
1bcf0 69 6c 65 5f 63 6d 64 2c 0a 20 20 20 20 20 20 20  ile_cmd,.       
1bd00 20 20 20 20 20 20 20 20 20 20 20 20 20 4d 44 35               MD5
1bd10 44 69 67 65 73 74 54 6f 42 61 73 65 31 30 78 38  DigestToBase10x8
1bd20 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  , 0);.  return T
1bd30 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20  CL_OK;.}.#endif 
1bd40 2f 2a 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  /* defined(SQLIT
1bd50 45 5f 54 45 53 54 29 20 7c 7c 20 64 65 66 69 6e  E_TEST) || defin
1bd60 65 64 28 53 51 4c 49 54 45 5f 54 43 4c 4d 44 35  ed(SQLITE_TCLMD5
1bd70 29 20 2a 2f 0a 0a 23 69 66 20 64 65 66 69 6e 65  ) */..#if define
1bd80 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 2f  d(SQLITE_TEST)./
1bd90 2a 0a 2a 2a 20 44 75 72 69 6e 67 20 74 65 73 74  *.** During test
1bda0 69 6e 67 2c 20 74 68 65 20 73 70 65 63 69 61 6c  ing, the special
1bdb0 20 6d 64 35 73 75 6d 28 29 20 61 67 67 72 65 67   md5sum() aggreg
1bdc0 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  ate function is 
1bdd0 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 20 69 6e  available..** in
1bde0 73 69 64 65 20 53 51 4c 69 74 65 2e 20 20 54 68  side SQLite.  Th
1bdf0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74  e following rout
1be00 69 6e 65 73 20 69 6d 70 6c 65 6d 65 6e 74 20 74  ines implement t
1be10 68 61 74 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  hat function..*/
1be20 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d 64 35  .static void md5
1be30 73 74 65 70 28 73 71 6c 69 74 65 33 5f 63 6f 6e  step(sqlite3_con
1be40 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 69  text *context, i
1be50 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33  nt argc, sqlite3
1be60 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 29 7b 0a  _value **argv){.
1be70 20 20 4d 44 35 43 6f 6e 74 65 78 74 20 2a 70 3b    MD5Context *p;
1be80 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
1be90 61 72 67 63 3c 31 20 29 20 72 65 74 75 72 6e 3b  argc<1 ) return;
1bea0 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 61  .  p = sqlite3_a
1beb0 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74  ggregate_context
1bec0 28 63 6f 6e 74 65 78 74 2c 20 73 69 7a 65 6f 66  (context, sizeof
1bed0 28 2a 70 29 29 3b 0a 20 20 69 66 28 20 70 3d 3d  (*p));.  if( p==
1bee0 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
1bef0 28 20 21 70 2d 3e 69 73 49 6e 69 74 20 29 7b 0a  ( !p->isInit ){.
1bf00 20 20 20 20 4d 44 35 49 6e 69 74 28 70 29 3b 0a      MD5Init(p);.
1bf10 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69    }.  for(i=0; i
1bf20 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  <argc; i++){.   
1bf30 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 61   const char *zDa
1bf40 74 61 20 3d 20 28 63 68 61 72 2a 29 73 71 6c 69  ta = (char*)sqli
1bf50 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
1bf60 72 67 76 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28  rgv[i]);.    if(
1bf70 20 7a 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20   zData ){.      
1bf80 4d 44 35 55 70 64 61 74 65 28 70 2c 20 28 75 6e  MD5Update(p, (un
1bf90 73 69 67 6e 65 64 20 63 68 61 72 2a 29 7a 44 61  signed char*)zDa
1bfa0 74 61 2c 20 73 74 72 6c 65 6e 28 7a 44 61 74 61  ta, strlen(zData
1bfb0 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  ));.    }.  }.}.
1bfc0 73 74 61 74 69 63 20 76 6f 69 64 20 6d 64 35 66  static void md5f
1bfd0 69 6e 61 6c 69 7a 65 28 73 71 6c 69 74 65 33 5f  inalize(sqlite3_
1bfe0 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  context *context
1bff0 29 7b 0a 20 20 4d 44 35 43 6f 6e 74 65 78 74 20  ){.  MD5Context 
1c000 2a 70 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  *p;.  unsigned c
1c010 68 61 72 20 64 69 67 65 73 74 5b 31 36 5d 3b 0a  har digest[16];.
1c020 20 20 63 68 61 72 20 7a 42 75 66 5b 33 33 5d 3b    char zBuf[33];
1c030 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 61  .  p = sqlite3_a
1c040 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74  ggregate_context
1c050 28 63 6f 6e 74 65 78 74 2c 20 73 69 7a 65 6f 66  (context, sizeof
1c060 28 2a 70 29 29 3b 0a 20 20 4d 44 35 46 69 6e 61  (*p));.  MD5Fina
1c070 6c 28 64 69 67 65 73 74 2c 70 29 3b 0a 20 20 4d  l(digest,p);.  M
1c080 44 35 44 69 67 65 73 74 54 6f 42 61 73 65 31 36  D5DigestToBase16
1c090 28 64 69 67 65 73 74 2c 20 7a 42 75 66 29 3b 0a  (digest, zBuf);.
1c0a0 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
1c0b0 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 7a  _text(context, z
1c0c0 42 75 66 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f  Buf, -1, SQLITE_
1c0d0 54 52 41 4e 53 49 45 4e 54 29 3b 0a 7d 0a 69 6e  TRANSIENT);.}.in
1c0e0 74 20 4d 64 35 5f 52 65 67 69 73 74 65 72 28 73  t Md5_Register(s
1c0f0 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69  qlite3 *db){.  i
1c100 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  nt rc = sqlite3_
1c110 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28  create_function(
1c120 64 62 2c 20 22 6d 64 35 73 75 6d 22 2c 20 2d 31  db, "md5sum", -1
1c130 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30  , SQLITE_UTF8, 0
1c140 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20  , 0, .          
1c150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c160 20 20 20 20 20 20 20 6d 64 35 73 74 65 70 2c 20         md5step, 
1c170 6d 64 35 66 69 6e 61 6c 69 7a 65 29 3b 0a 20 20  md5finalize);.  
1c180 73 71 6c 69 74 65 33 5f 6f 76 65 72 6c 6f 61 64  sqlite3_overload
1c190 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 6d  _function(db, "m
1c1a0 64 35 73 75 6d 22 2c 20 2d 31 29 3b 20 20 2f 2a  d5sum", -1);  /*
1c1b0 20 54 6f 20 65 78 65 72 63 69 73 65 20 74 68 69   To exercise thi
1c1c0 73 20 41 50 49 20 2a 2f 0a 20 20 72 65 74 75 72  s API */.  retur
1c1d0 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  n rc;.}.#endif /
1c1e0 2a 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  * defined(SQLITE
1c1f0 5f 54 45 53 54 29 20 2a 2f 0a 0a 0a 2f 2a 0a 2a  _TEST) */.../*.*
1c200 2a 20 49 66 20 74 68 65 20 6d 61 63 72 6f 20 54  * If the macro T
1c210 43 4c 53 48 20 69 73 20 6f 6e 65 2c 20 74 68 65  CLSH is one, the
1c220 6e 20 70 75 74 20 69 6e 20 63 6f 64 65 20 74 68  n put in code th
1c230 69 73 20 66 6f 72 20 74 68 65 0a 2a 2a 20 22 6d  is for the.** "m
1c240 61 69 6e 22 20 72 6f 75 74 69 6e 65 20 74 68 61  ain" routine tha
1c250 74 20 77 69 6c 6c 20 69 6e 69 74 69 61 6c 69 7a  t will initializ
1c260 65 20 54 63 6c 20 61 6e 64 20 74 61 6b 65 20 69  e Tcl and take i
1c270 6e 70 75 74 20 66 72 6f 6d 0a 2a 2a 20 73 74 61  nput from.** sta
1c280 6e 64 61 72 64 20 69 6e 70 75 74 2c 20 6f 72 20  ndard input, or 
1c290 69 66 20 61 20 66 69 6c 65 20 69 73 20 6e 61 6d  if a file is nam
1c2a0 65 64 20 6f 6e 20 74 68 65 20 63 6f 6d 6d 61 6e  ed on the comman
1c2b0 64 20 6c 69 6e 65 0a 2a 2a 20 74 68 65 20 54 43  d line.** the TC
1c2c0 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 72 65  L interpreter re
1c2d0 61 64 73 20 61 6e 64 20 65 76 61 6c 75 61 74 65  ads and evaluate
1c2e0 73 20 74 68 61 74 20 66 69 6c 65 2e 0a 2a 2f 0a  s that file..*/.
1c2f0 23 69 66 20 54 43 4c 53 48 3d 3d 31 0a 73 74 61  #if TCLSH==1.sta
1c300 74 69 63 20 63 68 61 72 20 7a 4d 61 69 6e 6c 6f  tic char zMainlo
1c310 6f 70 5b 5d 20 3d 0a 20 20 22 73 65 74 20 6c 69  op[] =.  "set li
1c320 6e 65 20 7b 7d 5c 6e 22 0a 20 20 22 77 68 69 6c  ne {}\n".  "whil
1c330 65 20 7b 21 5b 65 6f 66 20 73 74 64 69 6e 5d 7d  e {![eof stdin]}
1c340 20 7b 5c 6e 22 0a 20 20 20 20 22 69 66 20 7b 24   {\n".    "if {$
1c350 6c 69 6e 65 21 3d 5c 22 5c 22 7d 20 7b 5c 6e 22  line!=\"\"} {\n"
1c360 0a 20 20 20 20 20 20 22 70 75 74 73 20 2d 6e 6f  .      "puts -no
1c370 6e 65 77 6c 69 6e 65 20 5c 22 3e 20 5c 22 5c 6e  newline \"> \"\n
1c380 22 0a 20 20 20 20 22 7d 20 65 6c 73 65 20 7b 5c  ".    "} else {\
1c390 6e 22 0a 20 20 20 20 20 20 22 70 75 74 73 20 2d  n".      "puts -
1c3a0 6e 6f 6e 65 77 6c 69 6e 65 20 5c 22 25 20 5c 22  nonewline \"% \"
1c3b0 5c 6e 22 0a 20 20 20 20 22 7d 5c 6e 22 0a 20 20  \n".    "}\n".  
1c3c0 20 20 22 66 6c 75 73 68 20 73 74 64 6f 75 74 5c    "flush stdout\
1c3d0 6e 22 0a 20 20 20 20 22 61 70 70 65 6e 64 20 6c  n".    "append l
1c3e0 69 6e 65 20 5b 67 65 74 73 20 73 74 64 69 6e 5d  ine [gets stdin]
1c3f0 5c 6e 22 0a 20 20 20 20 22 69 66 20 7b 5b 69 6e  \n".    "if {[in
1c400 66 6f 20 63 6f 6d 70 6c 65 74 65 20 24 6c 69 6e  fo complete $lin
1c410 65 5d 7d 20 7b 5c 6e 22 0a 20 20 20 20 20 20 22  e]} {\n".      "
1c420 69 66 20 7b 5b 63 61 74 63 68 20 7b 75 70 6c 65  if {[catch {uple
1c430 76 65 6c 20 23 30 20 24 6c 69 6e 65 7d 20 72 65  vel #0 $line} re
1c440 73 75 6c 74 5d 7d 20 7b 5c 6e 22 0a 20 20 20 20  sult]} {\n".    
1c450 20 20 20 20 22 70 75 74 73 20 73 74 64 65 72 72      "puts stderr
1c460 20 5c 22 45 72 72 6f 72 3a 20 24 72 65 73 75 6c   \"Error: $resul
1c470 74 5c 22 5c 6e 22 0a 20 20 20 20 20 20 22 7d 20  t\"\n".      "} 
1c480 65 6c 73 65 69 66 20 7b 24 72 65 73 75 6c 74 21  elseif {$result!
1c490 3d 5c 22 5c 22 7d 20 7b 5c 6e 22 0a 20 20 20 20  =\"\"} {\n".    
1c4a0 20 20 20 20 22 70 75 74 73 20 24 72 65 73 75 6c      "puts $resul
1c4b0 74 5c 6e 22 0a 20 20 20 20 20 20 22 7d 5c 6e 22  t\n".      "}\n"
1c4c0 0a 20 20 20 20 20 20 22 73 65 74 20 6c 69 6e 65  .      "set line
1c4d0 20 7b 7d 5c 6e 22 0a 20 20 20 20 22 7d 20 65 6c   {}\n".    "} el
1c4e0 73 65 20 7b 5c 6e 22 0a 20 20 20 20 20 20 22 61  se {\n".      "a
1c4f0 70 70 65 6e 64 20 6c 69 6e 65 20 5c 5c 6e 5c 6e  ppend line \\n\n
1c500 22 0a 20 20 20 20 22 7d 5c 6e 22 0a 20 20 22 7d  ".    "}\n".  "}
1c510 5c 6e 22 0a 3b 0a 23 65 6e 64 69 66 0a 23 69 66  \n".;.#endif.#if
1c520 20 54 43 4c 53 48 3d 3d 32 0a 73 74 61 74 69 63   TCLSH==2.static
1c530 20 63 68 61 72 20 7a 4d 61 69 6e 6c 6f 6f 70 5b   char zMainloop[
1c540 5d 20 3d 20 0a 23 69 6e 63 6c 75 64 65 20 22 73  ] = .#include "s
1c550 70 61 63 65 61 6e 61 6c 5f 74 63 6c 2e 68 22 0a  paceanal_tcl.h".
1c560 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66  ;.#endif..#ifdef
1c570 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 73 74 61   SQLITE_TEST.sta
1c580 74 69 63 20 76 6f 69 64 20 69 6e 69 74 5f 61 6c  tic void init_al
1c590 6c 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 29 3b  l(Tcl_Interp *);
1c5a0 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 69 74  .static int init
1c5b0 5f 61 6c 6c 5f 63 6d 64 28 0a 20 20 43 6c 69 65  _all_cmd(.  Clie
1c5c0 6e 74 44 61 74 61 20 63 64 2c 0a 20 20 54 63 6c  ntData cd,.  Tcl
1c5d0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
1c5e0 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
1c5f0 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
1c600 6a 76 5b 5d 0a 29 7b 0a 0a 20 20 54 63 6c 5f 49  jv[].){..  Tcl_I
1c610 6e 74 65 72 70 20 2a 73 6c 61 76 65 3b 0a 20 20  nterp *slave;.  
1c620 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20  if( objc!=2 ){. 
1c630 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
1c640 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
1c650 62 6a 76 2c 20 22 53 4c 41 56 45 22 29 3b 0a 20  bjv, "SLAVE");. 
1c660 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
1c670 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 73 6c 61 76  ROR;.  }..  slav
1c680 65 20 3d 20 54 63 6c 5f 47 65 74 53 6c 61 76 65  e = Tcl_GetSlave
1c690 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
1c6a0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 29  String(objv[1]))
1c6b0 3b 0a 20 20 69 66 28 20 21 73 6c 61 76 65 20 29  ;.  if( !slave )
1c6c0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  {.    return TCL
1c6d0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69  _ERROR;.  }..  i
1c6e0 6e 69 74 5f 61 6c 6c 28 73 6c 61 76 65 29 3b 0a  nit_all(slave);.
1c6f0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
1c700 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 63 6c 63 6d 64  .}../*.** Tclcmd
1c710 3a 20 64 62 5f 75 73 65 5f 6c 65 67 61 63 79 5f  : db_use_legacy_
1c720 70 72 65 70 61 72 65 20 44 42 20 42 4f 4f 4c 45  prepare DB BOOLE
1c730 41 4e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 66  AN.**.**   The f
1c740 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f  irst argument to
1c750 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 6d 75   this command mu
1c760 73 74 20 62 65 20 61 20 64 61 74 61 62 61 73 65  st be a database
1c770 20 63 6f 6d 6d 61 6e 64 20 63 72 65 61 74 65 64   command created
1c780 20 62 79 0a 2a 2a 20 20 20 5b 73 71 6c 69 74 65   by.**   [sqlite
1c790 33 5d 2e 20 49 66 20 74 68 65 20 73 65 63 6f 6e  3]. If the secon
1c7a0 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 72  d argument is tr
1c7b0 75 65 2c 20 74 68 65 6e 20 74 68 65 20 68 61 6e  ue, then the han
1c7c0 64 6c 65 20 69 73 20 63 6f 6e 66 69 67 75 72 65  dle is configure
1c7d0 64 0a 2a 2a 20 20 20 74 6f 20 75 73 65 20 74 68  d.**   to use th
1c7e0 65 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  e sqlite3_prepar
1c7f0 65 5f 76 32 28 29 20 66 75 6e 63 74 69 6f 6e 20  e_v2() function 
1c800 74 6f 20 70 72 65 70 61 72 65 20 73 74 61 74 65  to prepare state
1c810 6d 65 6e 74 73 2e 20 49 66 20 69 74 0a 2a 2a 20  ments. If it.** 
1c820 20 20 69 73 20 66 61 6c 73 65 2c 20 73 71 6c 69    is false, sqli
1c830 74 65 33 5f 70 72 65 70 61 72 65 28 29 2e 0a 2a  te3_prepare()..*
1c840 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 62 5f  /.static int db_
1c850 75 73 65 5f 6c 65 67 61 63 79 5f 70 72 65 70 61  use_legacy_prepa
1c860 72 65 5f 63 6d 64 28 0a 20 20 43 6c 69 65 6e 74  re_cmd(.  Client
1c870 44 61 74 61 20 63 64 2c 0a 20 20 54 63 6c 5f 49  Data cd,.  Tcl_I
1c880 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
1c890 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
1c8a0 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
1c8b0 5b 5d 0a 29 7b 0a 20 20 54 63 6c 5f 43 6d 64 49  [].){.  Tcl_CmdI
1c8c0 6e 66 6f 20 63 6d 64 49 6e 66 6f 3b 0a 20 20 53  nfo cmdInfo;.  S
1c8d0 71 6c 69 74 65 44 62 20 2a 70 44 62 3b 0a 20 20  qliteDb *pDb;.  
1c8e0 69 6e 74 20 62 50 72 65 70 61 72 65 3b 0a 0a 20  int bPrepare;.. 
1c8f0 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a   if( objc!=3 ){.
1c900 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
1c910 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
1c920 6f 62 6a 76 2c 20 22 44 42 20 42 4f 4f 4c 45 41  objv, "DB BOOLEA
1c930 4e 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  N");.    return 
1c940 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
1c950 20 20 69 66 28 20 21 54 63 6c 5f 47 65 74 43 6f    if( !Tcl_GetCo
1c960 6d 6d 61 6e 64 49 6e 66 6f 28 69 6e 74 65 72 70  mmandInfo(interp
1c970 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
1c980 6f 62 6a 76 5b 31 5d 29 2c 20 26 63 6d 64 49 6e  objv[1]), &cmdIn
1c990 66 6f 29 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  fo) ){.    Tcl_A
1c9a0 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
1c9b0 72 70 2c 20 22 6e 6f 20 73 75 63 68 20 64 62 3a  rp, "no such db:
1c9c0 20 22 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e   ", Tcl_GetStrin
1c9d0 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 28 63 68 61  g(objv[1]), (cha
1c9e0 72 2a 29 30 29 3b 0a 20 20 20 20 72 65 74 75 72  r*)0);.    retur
1c9f0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
1ca00 0a 20 20 70 44 62 20 3d 20 28 53 71 6c 69 74 65  .  pDb = (Sqlite
1ca10 44 62 2a 29 63 6d 64 49 6e 66 6f 2e 6f 62 6a 43  Db*)cmdInfo.objC
1ca20 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20 69 66 28  lientData;.  if(
1ca30 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46   Tcl_GetBooleanF
1ca40 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
1ca50 62 6a 76 5b 32 5d 2c 20 26 62 50 72 65 70 61 72  bjv[2], &bPrepar
1ca60 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  e) ){.    return
1ca70 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
1ca80 0a 20 20 70 44 62 2d 3e 62 4c 65 67 61 63 79 50  .  pDb->bLegacyP
1ca90 72 65 70 61 72 65 20 3d 20 62 50 72 65 70 61 72  repare = bPrepar
1caa0 65 3b 0a 0a 20 20 54 63 6c 5f 52 65 73 65 74 52  e;..  Tcl_ResetR
1cab0 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20  esult(interp);. 
1cac0 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
1cad0 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
1cae0 43 6f 6e 66 69 67 75 72 65 20 74 68 65 20 69 6e  Configure the in
1caf0 74 65 72 70 72 65 74 65 72 20 70 61 73 73 65 64  terpreter passed
1cb00 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
1cb10 67 75 6d 65 6e 74 20 74 6f 20 68 61 76 65 20 61  gument to have a
1cb20 63 63 65 73 73 0a 2a 2a 20 74 6f 20 74 68 65 20  ccess.** to the 
1cb30 63 6f 6d 6d 61 6e 64 73 20 61 6e 64 20 6c 69 6e  commands and lin
1cb40 6b 65 64 20 76 61 72 69 61 62 6c 65 73 20 74 68  ked variables th
1cb50 61 74 20 6d 61 6b 65 20 75 70 3a 0a 2a 2a 0a 2a  at make up:.**.*
1cb60 2a 20 20 20 2a 20 74 68 65 20 5b 73 71 6c 69 74  *   * the [sqlit
1cb70 65 33 5d 20 65 78 74 65 6e 73 69 6f 6e 20 69 74  e3] extension it
1cb80 73 65 6c 66 2c 20 0a 2a 2a 0a 2a 2a 20 20 20 2a  self, .**.**   *
1cb90 20 49 66 20 53 51 4c 49 54 45 5f 54 43 4c 4d 44   If SQLITE_TCLMD
1cba0 35 20 6f 72 20 53 51 4c 49 54 45 5f 54 45 53 54  5 or SQLITE_TEST
1cbb0 20 69 73 20 64 65 66 69 6e 65 64 2c 20 74 68 65   is defined, the
1cbc0 20 4d 64 35 20 63 6f 6d 6d 61 6e 64 73 2c 20 61   Md5 commands, a
1cbd0 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20  nd.**.**   * If 
1cbe0 53 51 4c 49 54 45 5f 54 45 53 54 20 69 73 20 73  SQLITE_TEST is s
1cbf0 65 74 2c 20 74 68 65 20 76 61 72 69 6f 75 73 20  et, the various 
1cc00 74 65 73 74 20 69 6e 74 65 72 66 61 63 65 73 20  test interfaces 
1cc10 75 73 65 64 20 62 79 20 74 68 65 20 54 63 6c 0a  used by the Tcl.
1cc20 2a 2a 20 20 20 20 20 74 65 73 74 20 73 75 69 74  **     test suit
1cc30 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
1cc40 64 20 69 6e 69 74 5f 61 6c 6c 28 54 63 6c 5f 49  d init_all(Tcl_I
1cc50 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 0a  nterp *interp){.
1cc60 20 20 53 71 6c 69 74 65 33 5f 49 6e 69 74 28 69    Sqlite3_Init(i
1cc70 6e 74 65 72 70 29 3b 0a 0a 23 69 66 20 64 65 66  nterp);..#if def
1cc80 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54  ined(SQLITE_TEST
1cc90 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c  ) || defined(SQL
1cca0 49 54 45 5f 54 43 4c 4d 44 35 29 0a 20 20 4d 64  ITE_TCLMD5).  Md
1ccb0 35 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a  5_Init(interp);.
1ccc0 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53  #endif..#ifdef S
1ccd0 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 7b 0a 20  QLITE_TEST.  {. 
1cce0 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71     extern int Sq
1ccf0 6c 69 74 65 63 6f 6e 66 69 67 5f 49 6e 69 74 28  liteconfig_Init(
1cd00 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20  Tcl_Interp*);.  
1cd10 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c    extern int Sql
1cd20 69 74 65 74 65 73 74 31 5f 49 6e 69 74 28 54 63  itetest1_Init(Tc
1cd30 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20  l_Interp*);.    
1cd40 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74  extern int Sqlit
1cd50 65 74 65 73 74 32 5f 49 6e 69 74 28 54 63 6c 5f  etest2_Init(Tcl_
1cd60 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78  Interp*);.    ex
1cd70 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74  tern int Sqlitet
1cd80 65 73 74 33 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  est3_Init(Tcl_In
1cd90 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65  terp*);.    exte
1cda0 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73  rn int Sqlitetes
1cdb0 74 34 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  t4_Init(Tcl_Inte
1cdc0 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e  rp*);.    extern
1cdd0 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 35   int Sqlitetest5
1cde0 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
1cdf0 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69  *);.    extern i
1ce00 6e 74 20 53 71 6c 69 74 65 74 65 73 74 36 5f 49  nt Sqlitetest6_I
1ce10 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29  nit(Tcl_Interp*)
1ce20 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74  ;.    extern int
1ce30 20 53 71 6c 69 74 65 74 65 73 74 37 5f 49 6e 69   Sqlitetest7_Ini
1ce40 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a  t(Tcl_Interp*);.
1ce50 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53      extern int S
1ce60 71 6c 69 74 65 74 65 73 74 38 5f 49 6e 69 74 28  qlitetest8_Init(
1ce70 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20  Tcl_Interp*);.  
1ce80 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c    extern int Sql
1ce90 69 74 65 74 65 73 74 39 5f 49 6e 69 74 28 54 63  itetest9_Init(Tc
1cea0 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20  l_Interp*);.    
1ceb0 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74  extern int Sqlit
1cec0 65 74 65 73 74 61 73 79 6e 63 5f 49 6e 69 74 28  etestasync_Init(
1ced0 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20  Tcl_Interp*);.  
1cee0 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c    extern int Sql
1cef0 69 74 65 74 65 73 74 5f 61 75 74 6f 65 78 74 5f  itetest_autoext_
1cf00 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a  Init(Tcl_Interp*
1cf10 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e  );.    extern in
1cf20 74 20 53 71 6c 69 74 65 74 65 73 74 5f 64 65 6d  t Sqlitetest_dem
1cf30 6f 76 66 73 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  ovfs_Init(Tcl_In
1cf40 74 65 72 70 20 2a 29 3b 0a 20 20 20 20 65 78 74  terp *);.    ext
1cf50 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65  ern int Sqlitete
1cf60 73 74 5f 66 75 6e 63 5f 49 6e 69 74 28 54 63 6c  st_func_Init(Tcl
1cf70 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65  _Interp*);.    e
1cf80 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65  xtern int Sqlite
1cf90 74 65 73 74 5f 68 65 78 69 6f 5f 49 6e 69 74 28  test_hexio_Init(
1cfa0 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20  Tcl_Interp*);.  
1cfb0 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c    extern int Sql
1cfc0 69 74 65 74 65 73 74 5f 69 6e 69 74 5f 49 6e 69  itetest_init_Ini
1cfd0 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a  t(Tcl_Interp*);.
1cfe0 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53      extern int S
1cff0 71 6c 69 74 65 74 65 73 74 5f 6d 61 6c 6c 6f 63  qlitetest_malloc
1d000 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
1d010 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69  *);.    extern i
1d020 6e 74 20 53 71 6c 69 74 65 74 65 73 74 5f 6d 75  nt Sqlitetest_mu
1d030 74 65 78 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74  tex_Init(Tcl_Int
1d040 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72  erp*);.    exter
1d050 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74  n int Sqlitetest
1d060 73 63 68 65 6d 61 5f 49 6e 69 74 28 54 63 6c 5f  schema_Init(Tcl_
1d070 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78  Interp*);.    ex
1d080 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74  tern int Sqlitet
1d090 65 73 74 73 73 65 5f 49 6e 69 74 28 54 63 6c 5f  estsse_Init(Tcl_
1d0a0 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78  Interp*);.    ex
1d0b0 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74  tern int Sqlitet
1d0c0 65 73 74 74 63 6c 76 61 72 5f 49 6e 69 74 28 54  esttclvar_Init(T
1d0d0 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20  cl_Interp*);.   
1d0e0 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69   extern int Sqli
1d0f0 74 65 74 65 73 74 54 68 72 65 61 64 5f 49 6e 69  tetestThread_Ini
1d100 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a  t(Tcl_Interp*);.
1d110 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53      extern int S
1d120 71 6c 69 74 65 74 65 73 74 4f 6e 65 66 69 6c 65  qlitetestOnefile
1d130 5f 49 6e 69 74 28 29 3b 0a 20 20 20 20 65 78 74  _Init();.    ext
1d140 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65  ern int Sqlitete
1d150 73 74 4f 73 69 6e 73 74 5f 49 6e 69 74 28 54 63  stOsinst_Init(Tc
1d160 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20  l_Interp*);.    
1d170 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74  extern int Sqlit
1d180 65 74 65 73 74 62 61 63 6b 75 70 5f 49 6e 69 74  etestbackup_Init
1d190 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20  (Tcl_Interp*);. 
1d1a0 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71     extern int Sq
1d1b0 6c 69 74 65 74 65 73 74 69 6e 74 61 72 72 61 79  litetestintarray
1d1c0 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
1d1d0 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69  *);.    extern i
1d1e0 6e 74 20 53 71 6c 69 74 65 74 65 73 74 76 66 73  nt Sqlitetestvfs
1d1f0 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
1d200 20 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20   *);.    extern 
1d210 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 53 74  int SqlitetestSt
1d220 61 74 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  at_Init(Tcl_Inte
1d230 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e  rp*);.    extern
1d240 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 72   int Sqlitetestr
1d250 74 72 65 65 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  tree_Init(Tcl_In
1d260 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65  terp*);.    exte
1d270 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 71 75 6f  rn int Sqlitequo
1d280 74 61 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  ta_Init(Tcl_Inte
1d290 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e  rp*);.    extern
1d2a0 20 69 6e 74 20 53 71 6c 69 74 65 6d 75 6c 74 69   int Sqlitemulti
1d2b0 70 6c 65 78 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  plex_Init(Tcl_In
1d2c0 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65  terp*);.    exte
1d2d0 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 53 75 70  rn int SqliteSup
1d2e0 65 72 6c 6f 63 6b 5f 49 6e 69 74 28 54 63 6c 5f  erlock_Init(Tcl_
1d2f0 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78  Interp*);.    ex
1d300 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74  tern int Sqlitet
1d310 65 73 74 53 79 73 63 61 6c 6c 5f 49 6e 69 74 28  estSyscall_Init(
1d320 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20  Tcl_Interp*);.  
1d330 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c    extern int Sql
1d340 69 74 65 74 65 73 74 66 75 7a 7a 65 72 5f 49 6e  itetestfuzzer_In
1d350 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b  it(Tcl_Interp*);
1d360 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20  .    extern int 
1d370 53 71 6c 69 74 65 74 65 73 74 77 68 6f 6c 65 6e  Sqlitetestwholen
1d380 75 6d 62 65 72 5f 49 6e 69 74 28 54 63 6c 5f 49  umber_Init(Tcl_I
1d390 6e 74 65 72 70 2a 29 3b 0a 23 69 66 20 64 65 66  nterp*);.#if def
1d3a0 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
1d3b0 4c 45 5f 53 45 53 53 49 4f 4e 29 20 26 26 20 64  LE_SESSION) && d
1d3c0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
1d3d0 41 42 4c 45 5f 50 52 45 55 50 44 41 54 45 5f 48  ABLE_PREUPDATE_H
1d3e0 4f 4f 4b 29 0a 20 20 20 20 65 78 74 65 72 6e 20  OOK).    extern 
1d3f0 69 6e 74 20 54 65 73 74 53 65 73 73 69 6f 6e 5f  int TestSession_
1d400 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a  Init(Tcl_Interp*
1d410 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65  );.#endif.#if de
1d420 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
1d430 42 4c 45 5f 46 54 53 33 29 20 7c 7c 20 64 65 66  BLE_FTS3) || def
1d440 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
1d450 4c 45 5f 46 54 53 34 29 0a 20 20 20 20 65 78 74  LE_FTS4).    ext
1d460 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65  ern int Sqlitete
1d470 73 74 66 74 73 33 5f 49 6e 69 74 28 54 63 6c 5f  stfts3_Init(Tcl_
1d480 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 3b  Interp *interp);
1d490 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20  .#endif..#ifdef 
1d4a0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 5a 49  SQLITE_ENABLE_ZI
1d4b0 50 56 46 53 0a 20 20 20 20 65 78 74 65 72 6e 20  PVFS.    extern 
1d4c0 69 6e 74 20 5a 69 70 76 66 73 5f 49 6e 69 74 28  int Zipvfs_Init(
1d4d0 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20  Tcl_Interp*);.  
1d4e0 20 20 5a 69 70 76 66 73 5f 49 6e 69 74 28 69 6e    Zipvfs_Init(in
1d4f0 74 65 72 70 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  terp);.#endif.. 
1d500 20 20 20 53 71 6c 69 74 65 63 6f 6e 66 69 67 5f     Sqliteconfig_
1d510 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  Init(interp);.  
1d520 20 20 53 71 6c 69 74 65 74 65 73 74 31 5f 49 6e    Sqlitetest1_In
1d530 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  it(interp);.    
1d540 53 71 6c 69 74 65 74 65 73 74 32 5f 49 6e 69 74  Sqlitetest2_Init
1d550 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71  (interp);.    Sq
1d560 6c 69 74 65 74 65 73 74 33 5f 49 6e 69 74 28 69  litetest3_Init(i
1d570 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69  nterp);.    Sqli
1d580 74 65 74 65 73 74 34 5f 49 6e 69 74 28 69 6e 74  tetest4_Init(int
1d590 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65  erp);.    Sqlite
1d5a0 74 65 73 74 35 5f 49 6e 69 74 28 69 6e 74 65 72  test5_Init(inter
1d5b0 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65  p);.    Sqlitete
1d5c0 73 74 36 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  st6_Init(interp)
1d5d0 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74  ;.    Sqlitetest
1d5e0 37 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a  7_Init(interp);.
1d5f0 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 38 5f      Sqlitetest8_
1d600 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  Init(interp);.  
1d610 20 20 53 71 6c 69 74 65 74 65 73 74 39 5f 49 6e    Sqlitetest9_In
1d620 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  it(interp);.    
1d630 53 71 6c 69 74 65 74 65 73 74 61 73 79 6e 63 5f  Sqlitetestasync_
1d640 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  Init(interp);.  
1d650 20 20 53 71 6c 69 74 65 74 65 73 74 5f 61 75 74    Sqlitetest_aut
1d660 6f 65 78 74 5f 49 6e 69 74 28 69 6e 74 65 72 70  oext_Init(interp
1d670 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73  );.    Sqlitetes
1d680 74 5f 64 65 6d 6f 76 66 73 5f 49 6e 69 74 28 69  t_demovfs_Init(i
1d690 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69  nterp);.    Sqli
1d6a0 74 65 74 65 73 74 5f 66 75 6e 63 5f 49 6e 69 74  tetest_func_Init
1d6b0 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71  (interp);.    Sq
1d6c0 6c 69 74 65 74 65 73 74 5f 68 65 78 69 6f 5f 49  litetest_hexio_I
1d6d0 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20  nit(interp);.   
1d6e0 20 53 71 6c 69 74 65 74 65 73 74 5f 69 6e 69 74   Sqlitetest_init
1d6f0 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20  _Init(interp);. 
1d700 20 20 20 53 71 6c 69 74 65 74 65 73 74 5f 6d 61     Sqlitetest_ma
1d710 6c 6c 6f 63 5f 49 6e 69 74 28 69 6e 74 65 72 70  lloc_Init(interp
1d720 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73  );.    Sqlitetes
1d730 74 5f 6d 75 74 65 78 5f 49 6e 69 74 28 69 6e 74  t_mutex_Init(int
1d740 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65  erp);.    Sqlite
1d750 74 65 73 74 73 63 68 65 6d 61 5f 49 6e 69 74 28  testschema_Init(
1d760 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c  interp);.    Sql
1d770 69 74 65 74 65 73 74 74 63 6c 76 61 72 5f 49 6e  itetesttclvar_In
1d780 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  it(interp);.    
1d790 53 71 6c 69 74 65 74 65 73 74 54 68 72 65 61 64  SqlitetestThread
1d7a0 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20  _Init(interp);. 
1d7b0 20 20 20 53 71 6c 69 74 65 74 65 73 74 4f 6e 65     SqlitetestOne
1d7c0 66 69 6c 65 5f 49 6e 69 74 28 69 6e 74 65 72 70  file_Init(interp
1d7d0 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73  );.    Sqlitetes
1d7e0 74 4f 73 69 6e 73 74 5f 49 6e 69 74 28 69 6e 74  tOsinst_Init(int
1d7f0 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65  erp);.    Sqlite
1d800 74 65 73 74 62 61 63 6b 75 70 5f 49 6e 69 74 28  testbackup_Init(
1d810 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c  interp);.    Sql
1d820 69 74 65 74 65 73 74 69 6e 74 61 72 72 61 79 5f  itetestintarray_
1d830 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  Init(interp);.  
1d840 20 20 53 71 6c 69 74 65 74 65 73 74 76 66 73 5f    Sqlitetestvfs_
1d850 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  Init(interp);.  
1d860 20 20 53 71 6c 69 74 65 74 65 73 74 53 74 61 74    SqlitetestStat
1d870 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20  _Init(interp);. 
1d880 20 20 20 53 71 6c 69 74 65 74 65 73 74 72 74 72     Sqlitetestrtr
1d890 65 65 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b  ee_Init(interp);
1d8a0 0a 20 20 20 20 53 71 6c 69 74 65 71 75 6f 74 61  .    Sqlitequota
1d8b0 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20  _Init(interp);. 
1d8c0 20 20 20 53 71 6c 69 74 65 6d 75 6c 74 69 70 6c     Sqlitemultipl
1d8d0 65 78 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b  ex_Init(interp);
1d8e0 0a 20 20 20 20 53 71 6c 69 74 65 53 75 70 65 72  .    SqliteSuper
1d8f0 6c 6f 63 6b 5f 49 6e 69 74 28 69 6e 74 65 72 70  lock_Init(interp
1d900 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73  );.    Sqlitetes
1d910 74 53 79 73 63 61 6c 6c 5f 49 6e 69 74 28 69 6e  tSyscall_Init(in
1d920 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74  terp);.    Sqlit
1d930 65 74 65 73 74 66 75 7a 7a 65 72 5f 49 6e 69 74  etestfuzzer_Init
1d940 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71  (interp);.    Sq
1d950 6c 69 74 65 74 65 73 74 77 68 6f 6c 65 6e 75 6d  litetestwholenum
1d960 62 65 72 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  ber_Init(interp)
1d970 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ;.#if defined(SQ
1d980 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45 53 53  LITE_ENABLE_SESS
1d990 49 4f 4e 29 20 26 26 20 64 65 66 69 6e 65 64 28  ION) && defined(
1d9a0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52  SQLITE_ENABLE_PR
1d9b0 45 55 50 44 41 54 45 5f 48 4f 4f 4b 29 0a 20 20  EUPDATE_HOOK).  
1d9c0 20 20 54 65 73 74 53 65 73 73 69 6f 6e 5f 49 6e    TestSession_In
1d9d0 69 74 28 69 6e 74 65 72 70 29 3b 0a 23 65 6e 64  it(interp);.#end
1d9e0 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  if.#if defined(S
1d9f0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53  QLITE_ENABLE_FTS
1da00 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  3) || defined(SQ
1da10 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 34  LITE_ENABLE_FTS4
1da20 29 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74  ).    Sqlitetest
1da30 66 74 73 33 5f 49 6e 69 74 28 69 6e 74 65 72 70  fts3_Init(interp
1da40 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 54  );.#endif..    T
1da50 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d  cl_CreateObjComm
1da60 61 6e 64 28 0a 20 20 20 20 20 20 20 20 69 6e 74  and(.        int
1da70 65 72 70 2c 20 22 6c 6f 61 64 5f 74 65 73 74 66  erp, "load_testf
1da80 69 78 74 75 72 65 5f 65 78 74 65 6e 73 69 6f 6e  ixture_extension
1da90 73 22 2c 20 69 6e 69 74 5f 61 6c 6c 5f 63 6d 64  s", init_all_cmd
1daa0 2c 20 30 2c 20 30 0a 20 20 20 20 29 3b 0a 20 20  , 0, 0.    );.  
1dab0 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43    Tcl_CreateObjC
1dac0 6f 6d 6d 61 6e 64 28 0a 20 20 20 20 20 20 20 20  ommand(.        
1dad0 69 6e 74 65 72 70 2c 20 22 64 62 5f 75 73 65 5f  interp, "db_use_
1dae0 6c 65 67 61 63 79 5f 70 72 65 70 61 72 65 22 2c  legacy_prepare",
1daf0 20 64 62 5f 75 73 65 5f 6c 65 67 61 63 79 5f 70   db_use_legacy_p
1db00 72 65 70 61 72 65 5f 63 6d 64 2c 20 30 2c 20 30  repare_cmd, 0, 0
1db10 0a 20 20 20 20 29 3b 0a 0a 23 69 66 64 65 66 20  .    );..#ifdef 
1db20 53 51 4c 49 54 45 5f 53 53 45 0a 20 20 20 20 53  SQLITE_SSE.    S
1db30 71 6c 69 74 65 74 65 73 74 73 73 65 5f 49 6e 69  qlitetestsse_Ini
1db40 74 28 69 6e 74 65 72 70 29 3b 0a 23 65 6e 64 69  t(interp);.#endi
1db50 66 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a  f.  }.#endif.}..
1db60 23 64 65 66 69 6e 65 20 54 43 4c 53 48 5f 4d 41  #define TCLSH_MA
1db70 49 4e 20 6d 61 69 6e 20 20 20 2f 2a 20 4e 65 65  IN main   /* Nee
1db80 64 65 64 20 74 6f 20 66 61 6b 65 20 6f 75 74 20  ded to fake out 
1db90 6d 6b 74 63 6c 61 70 70 20 2a 2f 0a 69 6e 74 20  mktclapp */.int 
1dba0 54 43 4c 53 48 5f 4d 41 49 4e 28 69 6e 74 20 61  TCLSH_MAIN(int a
1dbb0 72 67 63 2c 20 63 68 61 72 20 2a 2a 61 72 67 76  rgc, char **argv
1dbc0 29 7b 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  ){.  Tcl_Interp 
1dbd0 2a 69 6e 74 65 72 70 3b 0a 20 20 0a 20 20 2f 2a  *interp;.  .  /*
1dbe0 20 43 61 6c 6c 20 73 71 6c 69 74 65 33 5f 73 68   Call sqlite3_sh
1dbf0 75 74 64 6f 77 6e 28 29 20 6f 6e 63 65 20 62 65  utdown() once be
1dc00 66 6f 72 65 20 64 6f 69 6e 67 20 61 6e 79 74 68  fore doing anyth
1dc10 69 6e 67 20 65 6c 73 65 2e 20 54 68 69 73 20 69  ing else. This i
1dc20 73 20 74 6f 0a 20 20 2a 2a 20 74 65 73 74 20 74  s to.  ** test t
1dc30 68 61 74 20 73 71 6c 69 74 65 33 5f 73 68 75 74  hat sqlite3_shut
1dc40 64 6f 77 6e 28 29 20 63 61 6e 20 62 65 20 73 61  down() can be sa
1dc50 66 65 6c 79 20 63 61 6c 6c 65 64 20 62 79 20 61  fely called by a
1dc60 20 70 72 6f 63 65 73 73 20 62 65 66 6f 72 65 0a   process before.
1dc70 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 69 6e 69    ** sqlite3_ini
1dc80 74 69 61 6c 69 7a 65 28 29 20 69 73 2e 20 2a 2f  tialize() is. */
1dc90 0a 20 20 73 71 6c 69 74 65 33 5f 73 68 75 74 64  .  sqlite3_shutd
1dca0 6f 77 6e 28 29 3b 0a 0a 23 69 66 20 54 43 4c 53  own();..#if TCLS
1dcb0 48 3d 3d 32 0a 20 20 73 71 6c 69 74 65 33 5f 63  H==2.  sqlite3_c
1dcc0 6f 6e 66 69 67 28 53 51 4c 49 54 45 5f 43 4f 4e  onfig(SQLITE_CON
1dcd0 46 49 47 5f 53 49 4e 47 4c 45 54 48 52 45 41 44  FIG_SINGLETHREAD
1dce0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 54 63 6c 5f  );.#endif.  Tcl_
1dcf0 46 69 6e 64 45 78 65 63 75 74 61 62 6c 65 28 61  FindExecutable(a
1dd00 72 67 76 5b 30 5d 29 3b 0a 0a 20 20 69 6e 74 65  rgv[0]);..  inte
1dd10 72 70 20 3d 20 54 63 6c 5f 43 72 65 61 74 65 49  rp = Tcl_CreateI
1dd20 6e 74 65 72 70 28 29 3b 0a 20 20 69 6e 69 74 5f  nterp();.  init_
1dd30 61 6c 6c 28 69 6e 74 65 72 70 29 3b 0a 20 20 69  all(interp);.  i
1dd40 66 28 20 61 72 67 63 3e 3d 32 20 29 7b 0a 20 20  f( argc>=2 ){.  
1dd50 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 63 68 61    int i;.    cha
1dd60 72 20 7a 41 72 67 63 5b 33 32 5d 3b 0a 20 20 20  r zArgc[32];.   
1dd70 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
1dd80 66 28 73 69 7a 65 6f 66 28 7a 41 72 67 63 29 2c  f(sizeof(zArgc),
1dd90 20 7a 41 72 67 63 2c 20 22 25 64 22 2c 20 61 72   zArgc, "%d", ar
1dda0 67 63 2d 28 33 2d 54 43 4c 53 48 29 29 3b 0a 20  gc-(3-TCLSH));. 
1ddb0 20 20 20 54 63 6c 5f 53 65 74 56 61 72 28 69 6e     Tcl_SetVar(in
1ddc0 74 65 72 70 2c 22 61 72 67 63 22 2c 20 7a 41 72  terp,"argc", zAr
1ddd0 67 63 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f  gc, TCL_GLOBAL_O
1dde0 4e 4c 59 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65  NLY);.    Tcl_Se
1ddf0 74 56 61 72 28 69 6e 74 65 72 70 2c 22 61 72 67  tVar(interp,"arg
1de00 76 30 22 2c 61 72 67 76 5b 31 5d 2c 54 43 4c 5f  v0",argv[1],TCL_
1de10 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 20 20  GLOBAL_ONLY);.  
1de20 20 20 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74    Tcl_SetVar(int
1de30 65 72 70 2c 22 61 72 67 76 22 2c 20 22 22 2c 20  erp,"argv", "", 
1de40 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29  TCL_GLOBAL_ONLY)
1de50 3b 0a 20 20 20 20 66 6f 72 28 69 3d 33 2d 54 43  ;.    for(i=3-TC
1de60 4c 53 48 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b  LSH; i<argc; i++
1de70 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74  ){.      Tcl_Set
1de80 56 61 72 28 69 6e 74 65 72 70 2c 20 22 61 72 67  Var(interp, "arg
1de90 76 22 2c 20 61 72 67 76 5b 69 5d 2c 0a 20 20 20  v", argv[i],.   
1dea0 20 20 20 20 20 20 20 54 43 4c 5f 47 4c 4f 42 41         TCL_GLOBA
1deb0 4c 5f 4f 4e 4c 59 20 7c 20 54 43 4c 5f 4c 49 53  L_ONLY | TCL_LIS
1dec0 54 5f 45 4c 45 4d 45 4e 54 20 7c 20 54 43 4c 5f  T_ELEMENT | TCL_
1ded0 41 50 50 45 4e 44 5f 56 41 4c 55 45 29 3b 0a 20  APPEND_VALUE);. 
1dee0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 54 43 4c     }.    if( TCL
1def0 53 48 3d 3d 31 20 26 26 20 54 63 6c 5f 45 76 61  SH==1 && Tcl_Eva
1df00 6c 46 69 6c 65 28 69 6e 74 65 72 70 2c 20 61 72  lFile(interp, ar
1df10 67 76 5b 31 5d 29 21 3d 54 43 4c 5f 4f 4b 20 29  gv[1])!=TCL_OK )
1df20 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  {.      const ch
1df30 61 72 20 2a 7a 49 6e 66 6f 20 3d 20 54 63 6c 5f  ar *zInfo = Tcl_
1df40 47 65 74 56 61 72 28 69 6e 74 65 72 70 2c 20 22  GetVar(interp, "
1df50 65 72 72 6f 72 49 6e 66 6f 22 2c 20 54 43 4c 5f  errorInfo", TCL_
1df60 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 20 20  GLOBAL_ONLY);.  
1df70 20 20 20 20 69 66 28 20 7a 49 6e 66 6f 3d 3d 30      if( zInfo==0
1df80 20 29 20 7a 49 6e 66 6f 20 3d 20 54 63 6c 5f 47   ) zInfo = Tcl_G
1df90 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28 69  etStringResult(i
1dfa0 6e 74 65 72 70 29 3b 0a 20 20 20 20 20 20 66 70  nterp);.      fp
1dfb0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 25 73  rintf(stderr,"%s
1dfc0 3a 20 25 73 5c 6e 22 2c 20 2a 61 72 67 76 2c 20  : %s\n", *argv, 
1dfd0 7a 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 72 65  zInfo);.      re
1dfe0 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
1dff0 7d 0a 20 20 69 66 28 20 54 43 4c 53 48 3d 3d 32  }.  if( TCLSH==2
1e000 20 7c 7c 20 61 72 67 63 3c 3d 31 20 29 7b 0a 20   || argc<=1 ){. 
1e010 20 20 20 54 63 6c 5f 47 6c 6f 62 61 6c 45 76 61     Tcl_GlobalEva
1e020 6c 28 69 6e 74 65 72 70 2c 20 7a 4d 61 69 6e 6c  l(interp, zMainl
1e030 6f 6f 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  oop);.  }.  retu
1e040 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  rn 0;.}.#endif /
1e050 2a 20 54 43 4c 53 48 20 2a 2f 0a                 * TCLSH */.