/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact 086dfdd72e5892de223968a258e1ccbd9693e717:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 41 20 54 43 4c 20  ******.** A TCL 
0180: 49 6e 74 65 72 66 61 63 65 20 74 6f 20 53 51 4c  Interface to SQL
0190: 69 74 65 2e 20 20 41 70 70 65 6e 64 20 74 68 69  ite.  Append thi
01a0: 73 20 66 69 6c 65 20 74 6f 20 73 71 6c 69 74 65  s file to sqlite
01b0: 33 2e 63 20 61 6e 64 0a 2a 2a 20 63 6f 6d 70 69  3.c and.** compi
01c0: 6c 65 20 74 68 65 20 77 68 6f 6c 65 20 74 68 69  le the whole thi
01d0: 6e 67 20 74 6f 20 62 75 69 6c 64 20 61 20 54 43  ng to build a TC
01e0: 4c 2d 65 6e 61 62 6c 65 64 20 76 65 72 73 69 6f  L-enabled versio
01f0: 6e 20 6f 66 20 53 51 4c 69 74 65 2e 0a 2a 2a 0a  n of SQLite..**.
0200: 2a 2a 20 43 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  ** Compile-time 
0210: 6f 70 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20  options:.**.**  
0220: 2d 44 54 43 4c 53 48 3d 31 20 20 20 20 20 20 20  -DTCLSH=1       
0230: 20 20 20 20 20 20 41 64 64 20 61 20 22 6d 61 69        Add a "mai
0240: 6e 28 29 22 20 72 6f 75 74 69 6e 65 20 74 68 61  n()" routine tha
0250: 74 20 77 6f 72 6b 73 20 61 73 20 61 20 74 63 6c  t works as a tcl
0260: 73 68 2e 0a 2a 2a 0a 2a 2a 20 20 2d 44 53 51 4c  sh..**.**  -DSQL
0270: 49 54 45 5f 54 43 4c 4d 44 35 20 20 20 20 20 20  ITE_TCLMD5      
0280: 20 57 68 65 6e 20 75 73 65 64 20 69 6e 20 63 6f   When used in co
0290: 6e 6a 75 63 74 69 6f 6e 20 77 69 74 68 20 2d 44  njuction with -D
02a0: 54 43 4c 53 48 3d 31 2c 20 61 64 64 0a 2a 2a 20  TCLSH=1, add.** 
02b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
02c0: 20 20 20 20 20 20 20 66 6f 75 72 20 6e 65 77 20         four new 
02d0: 63 6f 6d 6d 61 6e 64 73 20 74 6f 20 74 68 65 20  commands to the 
02e0: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
02f0: 66 6f 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  for.**          
0300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 67 65                ge
0310: 6e 65 72 61 74 69 6e 67 20 4d 44 35 20 63 68 65  nerating MD5 che
0320: 63 6b 73 75 6d 73 3a 20 20 6d 64 35 2c 20 6d 64  cksums:  md5, md
0330: 35 66 69 6c 65 2c 0a 2a 2a 20 20 20 20 20 20 20  5file,.**       
0340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0350: 20 6d 64 35 2d 31 30 78 38 2c 20 61 6e 64 20 6d   md5-10x8, and m
0360: 64 35 66 69 6c 65 2d 31 30 78 38 2e 0a 2a 2a 0a  d5file-10x8..**.
0370: 2a 2a 20 20 2d 44 53 51 4c 49 54 45 5f 54 45 53  **  -DSQLITE_TES
0380: 54 20 20 20 20 20 20 20 20 20 57 68 65 6e 20 75  T         When u
0390: 73 65 64 20 69 6e 20 63 6f 6e 6a 75 63 74 69 6f  sed in conjuctio
03a0: 6e 20 77 69 74 68 20 2d 44 54 43 4c 53 48 3d 31  n with -DTCLSH=1
03b0: 2c 20 61 64 64 0a 2a 2a 20 20 20 20 20 20 20 20  , add.**        
03c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
03d0: 68 75 6e 64 72 65 64 73 20 6f 66 20 6e 65 77 20  hundreds of new 
03e0: 63 6f 6d 6d 61 6e 64 73 20 75 73 65 64 20 66 6f  commands used fo
03f0: 72 20 74 65 73 74 69 6e 67 0a 2a 2a 20 20 20 20  r testing.**    
0400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0410: 20 20 20 20 53 51 4c 69 74 65 2e 20 20 54 68 69      SQLite.  Thi
0420: 73 20 6f 70 74 69 6f 6e 20 69 6d 70 6c 69 65 73  s option implies
0430: 20 2d 44 53 51 4c 49 54 45 5f 54 43 4c 4d 44 35   -DSQLITE_TCLMD5
0440: 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 74  ..*/.#include "t
0450: 63 6c 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c  cl.h".#include <
0460: 65 72 72 6e 6f 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20  errno.h>../*.** 
0470: 53 6f 6d 65 20 61 64 64 69 74 69 6f 6e 61 6c 20  Some additional 
0480: 69 6e 63 6c 75 64 65 20 66 69 6c 65 73 20 61 72  include files ar
0490: 65 20 6e 65 65 64 65 64 20 69 66 20 74 68 69 73  e needed if this
04a0: 20 66 69 6c 65 20 69 73 20 6e 6f 74 0a 2a 2a 20   file is not.** 
04b0: 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20  appended to the 
04c0: 61 6d 61 6c 67 61 6d 61 74 69 6f 6e 2e 0a 2a 2f  amalgamation..*/
04d0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
04e0: 41 4d 41 4c 47 41 4d 41 54 49 4f 4e 0a 23 20 69  AMALGAMATION.# i
04f0: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 33 2e  nclude "sqlite3.
0500: 68 22 0a 23 20 69 6e 63 6c 75 64 65 20 3c 73 74  h".# include <st
0510: 64 6c 69 62 2e 68 3e 0a 23 20 69 6e 63 6c 75 64  dlib.h>.# includ
0520: 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a 23 20 69  e <string.h>.# i
0530: 6e 63 6c 75 64 65 20 3c 61 73 73 65 72 74 2e 68  nclude <assert.h
0540: 3e 0a 20 20 74 79 70 65 64 65 66 20 75 6e 73 69  >.  typedef unsi
0550: 67 6e 65 64 20 63 68 61 72 20 75 38 3b 0a 23 65  gned char u8;.#e
0560: 6e 64 69 66 0a 23 69 6e 63 6c 75 64 65 20 3c 63  ndif.#include <c
0570: 74 79 70 65 2e 68 3e 0a 0a 2f 2a 0a 20 2a 20 57  type.h>../*. * W
0580: 69 6e 64 6f 77 73 20 6e 65 65 64 73 20 74 6f 20  indows needs to 
0590: 6b 6e 6f 77 20 77 68 69 63 68 20 73 79 6d 62 6f  know which symbo
05a0: 6c 73 20 74 6f 20 65 78 70 6f 72 74 2e 20 20 55  ls to export.  U
05b0: 6e 69 78 20 64 6f 65 73 20 6e 6f 74 2e 0a 20 2a  nix does not.. *
05c0: 20 42 55 49 4c 44 5f 73 71 6c 69 74 65 20 73 68   BUILD_sqlite sh
05d0: 6f 75 6c 64 20 62 65 20 75 6e 64 65 66 69 6e 65  ould be undefine
05e0: 64 20 66 6f 72 20 55 6e 69 78 2e 0a 20 2a 2f 0a  d for Unix.. */.
05f0: 23 69 66 64 65 66 20 42 55 49 4c 44 5f 73 71 6c  #ifdef BUILD_sql
0600: 69 74 65 0a 23 75 6e 64 65 66 20 54 43 4c 5f 53  ite.#undef TCL_S
0610: 54 4f 52 41 47 45 5f 43 4c 41 53 53 0a 23 64 65  TORAGE_CLASS.#de
0620: 66 69 6e 65 20 54 43 4c 5f 53 54 4f 52 41 47 45  fine TCL_STORAGE
0630: 5f 43 4c 41 53 53 20 44 4c 4c 45 58 50 4f 52 54  _CLASS DLLEXPORT
0640: 0a 23 65 6e 64 69 66 20 2f 2a 20 42 55 49 4c 44  .#endif /* BUILD
0650: 5f 73 71 6c 69 74 65 20 2a 2f 0a 0a 23 64 65 66  _sqlite */..#def
0660: 69 6e 65 20 4e 55 4d 5f 50 52 45 50 41 52 45 44  ine NUM_PREPARED
0670: 5f 53 54 4d 54 53 20 31 30 0a 23 64 65 66 69 6e  _STMTS 10.#defin
0680: 65 20 4d 41 58 5f 50 52 45 50 41 52 45 44 5f 53  e MAX_PREPARED_S
0690: 54 4d 54 53 20 31 30 30 0a 0a 2f 2a 0a 2a 2a 20  TMTS 100../*.** 
06a0: 49 66 20 54 43 4c 20 75 73 65 73 20 55 54 46 2d  If TCL uses UTF-
06b0: 38 20 61 6e 64 20 53 51 4c 69 74 65 20 69 73 20  8 and SQLite is 
06c0: 63 6f 6e 66 69 67 75 72 65 64 20 74 6f 20 75 73  configured to us
06d0: 65 20 69 73 6f 38 38 35 39 2c 20 74 68 65 6e 20  e iso8859, then 
06e0: 77 65 0a 2a 2a 20 68 61 76 65 20 74 6f 20 64 6f  we.** have to do
06f0: 20 61 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20 77   a translation w
0700: 68 65 6e 20 67 6f 69 6e 67 20 62 65 74 77 65 65  hen going betwee
0710: 6e 20 74 68 65 20 74 77 6f 2e 20 20 53 65 74 20  n the two.  Set 
0720: 74 68 65 20 0a 2a 2a 20 55 54 46 5f 54 52 41 4e  the .** UTF_TRAN
0730: 53 4c 41 54 49 4f 4e 5f 4e 45 45 44 45 44 20 6d  SLATION_NEEDED m
0740: 61 63 72 6f 20 74 6f 20 69 6e 64 69 63 61 74 65  acro to indicate
0750: 20 74 68 61 74 20 77 65 20 6e 65 65 64 20 74 6f   that we need to
0760: 20 64 6f 0a 2a 2a 20 74 68 69 73 20 74 72 61 6e   do.** this tran
0770: 73 6c 61 74 69 6f 6e 2e 20 20 0a 2a 2f 0a 23 69  slation.  .*/.#i
0780: 66 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 55 54  f defined(TCL_UT
0790: 46 5f 4d 41 58 29 20 26 26 20 21 64 65 66 69 6e  F_MAX) && !defin
07a0: 65 64 28 53 51 4c 49 54 45 5f 55 54 46 38 29 0a  ed(SQLITE_UTF8).
07b0: 23 20 64 65 66 69 6e 65 20 55 54 46 5f 54 52 41  # define UTF_TRA
07c0: 4e 53 4c 41 54 49 4f 4e 5f 4e 45 45 44 45 44 20  NSLATION_NEEDED 
07d0: 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  1.#endif../*.** 
07e0: 4e 65 77 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e  New SQL function
07f0: 73 20 63 61 6e 20 62 65 20 63 72 65 61 74 65 64  s can be created
0800: 20 61 73 20 54 43 4c 20 73 63 72 69 70 74 73 2e   as TCL scripts.
0810: 20 20 45 61 63 68 20 73 75 63 68 20 66 75 6e 63    Each such func
0820: 74 69 6f 6e 0a 2a 2a 20 69 73 20 64 65 73 63 72  tion.** is descr
0830: 69 62 65 64 20 62 79 20 61 6e 20 69 6e 73 74 61  ibed by an insta
0840: 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
0850: 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 0a  wing structure..
0860: 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
0870: 74 20 53 71 6c 46 75 6e 63 20 53 71 6c 46 75 6e  t SqlFunc SqlFun
0880: 63 3b 0a 73 74 72 75 63 74 20 53 71 6c 46 75 6e  c;.struct SqlFun
0890: 63 20 7b 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  c {.  Tcl_Interp
08a0: 20 2a 69 6e 74 65 72 70 3b 20 20 20 2f 2a 20 54   *interp;   /* T
08b0: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
08c0: 20 74 6f 20 65 78 65 63 75 74 65 20 74 68 65 20   to execute the 
08d0: 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63  function */.  Tc
08e0: 6c 5f 4f 62 6a 20 2a 70 53 63 72 69 70 74 3b 20  l_Obj *pScript; 
08f0: 20 20 20 20 2f 2a 20 54 68 65 20 54 63 6c 5f 4f      /* The Tcl_O
0900: 62 6a 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  bj representatio
0910: 6e 20 6f 66 20 74 68 65 20 73 63 72 69 70 74 20  n of the script 
0920: 2a 2f 0a 20 20 69 6e 74 20 75 73 65 45 76 61 6c  */.  int useEval
0930: 4f 62 6a 76 3b 20 20 20 20 20 20 2f 2a 20 54 72  Objv;      /* Tr
0940: 75 65 20 69 66 20 69 74 20 69 73 20 73 61 66 65  ue if it is safe
0950: 20 74 6f 20 75 73 65 20 54 63 6c 5f 45 76 61 6c   to use Tcl_Eval
0960: 4f 62 6a 76 20 2a 2f 0a 20 20 63 68 61 72 20 2a  Objv */.  char *
0970: 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  zName;          
0980: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 69 73 20  /* Name of this 
0990: 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 53 71  function */.  Sq
09a0: 6c 46 75 6e 63 20 2a 70 4e 65 78 74 3b 20 20 20  lFunc *pNext;   
09b0: 20 20 20 20 2f 2a 20 4e 65 78 74 20 66 75 6e 63      /* Next func
09c0: 74 69 6f 6e 20 6f 6e 20 74 68 65 20 6c 69 73 74  tion on the list
09d0: 20 6f 66 20 74 68 65 6d 20 61 6c 6c 20 2a 2f 0a   of them all */.
09e0: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4e 65 77 20 63 6f  };../*.** New co
09f0: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
0a00: 73 20 66 75 6e 63 74 69 6f 6e 20 63 61 6e 20 62  s function can b
0a10: 65 20 63 72 65 61 74 65 64 20 61 73 20 54 43 4c  e created as TCL
0a20: 20 73 63 72 69 70 74 73 2e 20 20 45 61 63 68 20   scripts.  Each 
0a30: 73 75 63 68 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  such.** function
0a40: 20 69 73 20 64 65 73 63 72 69 62 65 64 20 62 79   is described by
0a50: 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   an instance of 
0a60: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
0a70: 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 74 79 70 65  ructure..*/.type
0a80: 64 65 66 20 73 74 72 75 63 74 20 53 71 6c 43 6f  def struct SqlCo
0a90: 6c 6c 61 74 65 20 53 71 6c 43 6f 6c 6c 61 74 65  llate SqlCollate
0aa0: 3b 0a 73 74 72 75 63 74 20 53 71 6c 43 6f 6c 6c  ;.struct SqlColl
0ab0: 61 74 65 20 7b 0a 20 20 54 63 6c 5f 49 6e 74 65  ate {.  Tcl_Inte
0ac0: 72 70 20 2a 69 6e 74 65 72 70 3b 20 20 20 2f 2a  rp *interp;   /*
0ad0: 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
0ae0: 65 74 20 74 6f 20 65 78 65 63 75 74 65 20 74 68  et to execute th
0af0: 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  e function */.  
0b00: 63 68 61 72 20 2a 7a 53 63 72 69 70 74 3b 20 20  char *zScript;  
0b10: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 63 72        /* The scr
0b20: 69 70 74 20 74 6f 20 62 65 20 72 75 6e 20 2a 2f  ipt to be run */
0b30: 0a 20 20 53 71 6c 43 6f 6c 6c 61 74 65 20 2a 70  .  SqlCollate *p
0b40: 4e 65 78 74 3b 20 20 20 20 2f 2a 20 4e 65 78 74  Next;    /* Next
0b50: 20 66 75 6e 63 74 69 6f 6e 20 6f 6e 20 74 68 65   function on the
0b60: 20 6c 69 73 74 20 6f 66 20 74 68 65 6d 20 61 6c   list of them al
0b70: 6c 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 50  l */.};../*.** P
0b80: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
0b90: 74 73 20 61 72 65 20 63 61 63 68 65 64 20 66 6f  ts are cached fo
0ba0: 72 20 66 61 73 74 65 72 20 65 78 65 63 75 74 69  r faster executi
0bb0: 6f 6e 2e 20 20 45 61 63 68 20 70 72 65 70 61 72  on.  Each prepar
0bc0: 65 64 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20  ed.** statement 
0bd0: 69 73 20 64 65 73 63 72 69 62 65 64 20 62 79 20  is described by 
0be0: 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  an instance of t
0bf0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  he following str
0c00: 75 63 74 75 72 65 2e 0a 2a 2f 0a 74 79 70 65 64  ucture..*/.typed
0c10: 65 66 20 73 74 72 75 63 74 20 53 71 6c 50 72 65  ef struct SqlPre
0c20: 70 61 72 65 64 53 74 6d 74 20 53 71 6c 50 72 65  paredStmt SqlPre
0c30: 70 61 72 65 64 53 74 6d 74 3b 0a 73 74 72 75 63  paredStmt;.struc
0c40: 74 20 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d  t SqlPreparedStm
0c50: 74 20 7b 0a 20 20 53 71 6c 50 72 65 70 61 72 65  t {.  SqlPrepare
0c60: 64 53 74 6d 74 20 2a 70 4e 65 78 74 3b 20 20 2f  dStmt *pNext;  /
0c70: 2a 20 4e 65 78 74 20 69 6e 20 6c 69 6e 6b 65 64  * Next in linked
0c80: 20 6c 69 73 74 20 2a 2f 0a 20 20 53 71 6c 50 72   list */.  SqlPr
0c90: 65 70 61 72 65 64 53 74 6d 74 20 2a 70 50 72 65  eparedStmt *pPre
0ca0: 76 3b 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20  v;  /* Previous 
0cb0: 6f 6e 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a 20  on the list */. 
0cc0: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
0cd0: 53 74 6d 74 3b 20 20 20 20 20 2f 2a 20 54 68 65  Stmt;     /* The
0ce0: 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
0cf0: 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 71  ent */.  int nSq
0d00: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
0d10: 20 20 2f 2a 20 63 68 61 72 73 20 69 6e 20 7a 53    /* chars in zS
0d20: 71 6c 5b 5d 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ql[] */.  const 
0d30: 63 68 61 72 20 2a 7a 53 71 6c 3b 20 20 20 20 20  char *zSql;     
0d40: 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 74 68     /* Text of th
0d50: 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  e SQL statement 
0d60: 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 72 6d 3b 20  */.  int nParm; 
0d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
0d80: 20 53 69 7a 65 20 6f 66 20 61 70 50 61 72 6d 20   Size of apParm 
0d90: 61 72 72 61 79 20 2a 2f 0a 20 20 54 63 6c 5f 4f  array */.  Tcl_O
0da0: 62 6a 20 2a 2a 61 70 50 61 72 6d 3b 20 20 20 20  bj **apParm;    
0db0: 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
0dc0: 72 65 66 65 72 65 6e 63 65 64 20 6f 62 6a 65 63  referenced objec
0dd0: 74 20 70 6f 69 6e 74 65 72 73 20 2a 2f 0a 7d 3b  t pointers */.};
0de0: 0a 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  ..typedef struct
0df0: 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c   IncrblobChannel
0e00: 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c   IncrblobChannel
0e10: 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 72 65 20 69  ;../*.** There i
0e20: 73 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f  s one instance o
0e30: 66 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  f this structure
0e40: 20 66 6f 72 20 65 61 63 68 20 53 51 4c 69 74 65   for each SQLite
0e50: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 74 68 61   database.** tha
0e60: 74 20 68 61 73 20 62 65 65 6e 20 6f 70 65 6e 65  t has been opene
0e70: 64 20 62 79 20 74 68 65 20 53 51 4c 69 74 65 20  d by the SQLite 
0e80: 54 43 4c 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a  TCL interface..*
0e90: 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 6d 6f 64  *.** If this mod
0ea0: 75 6c 65 20 69 73 20 62 75 69 6c 74 20 77 69 74  ule is built wit
0eb0: 68 20 53 51 4c 49 54 45 5f 54 45 53 54 20 64 65  h SQLITE_TEST de
0ec0: 66 69 6e 65 64 20 28 74 6f 20 63 72 65 61 74 65  fined (to create
0ed0: 20 74 68 65 20 53 51 4c 69 74 65 0a 2a 2a 20 74   the SQLite.** t
0ee0: 65 73 74 66 69 78 74 75 72 65 20 65 78 65 63 75  estfixture execu
0ef0: 74 61 62 6c 65 29 2c 20 74 68 65 6e 20 69 74 20  table), then it 
0f00: 6d 61 79 20 62 65 20 63 6f 6e 66 69 67 75 72 65  may be configure
0f10: 64 20 74 6f 20 75 73 65 20 65 69 74 68 65 72 0a  d to use either.
0f20: 2a 2a 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61  ** sqlite3_prepa
0f30: 72 65 5f 76 32 28 29 20 6f 72 20 73 71 6c 69 74  re_v2() or sqlit
0f40: 65 33 5f 70 72 65 70 61 72 65 28 29 20 74 6f 20  e3_prepare() to 
0f50: 70 72 65 70 61 72 65 20 53 51 4c 20 73 74 61 74  prepare SQL stat
0f60: 65 6d 65 6e 74 73 2e 0a 2a 2a 20 49 66 20 53 71  ements..** If Sq
0f70: 6c 69 74 65 44 62 2e 62 4c 65 67 61 63 79 50 72  liteDb.bLegacyPr
0f80: 65 70 61 72 65 20 69 73 20 74 72 75 65 2c 20 73  epare is true, s
0f90: 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28 29  qlite3_prepare()
0fa0: 20 69 73 20 75 73 65 64 2e 0a 2a 2f 0a 74 79 70   is used..*/.typ
0fb0: 65 64 65 66 20 73 74 72 75 63 74 20 53 71 6c 69  edef struct Sqli
0fc0: 74 65 44 62 20 53 71 6c 69 74 65 44 62 3b 0a 73  teDb SqliteDb;.s
0fd0: 74 72 75 63 74 20 53 71 6c 69 74 65 44 62 20 7b  truct SqliteDb {
0fe0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20  .  sqlite3 *db; 
0ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1000: 20 54 68 65 20 22 72 65 61 6c 22 20 64 61 74 61   The "real" data
1010: 62 61 73 65 20 73 74 72 75 63 74 75 72 65 2e 20  base structure. 
1020: 4d 55 53 54 20 42 45 20 46 49 52 53 54 20 2a 2f  MUST BE FIRST */
1030: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
1040: 6e 74 65 72 70 3b 20 20 20 20 20 20 20 20 2f 2a  nterp;        /*
1050: 20 54 68 65 20 69 6e 74 65 72 70 72 65 74 65 72   The interpreter
1060: 20 75 73 65 64 20 66 6f 72 20 74 68 69 73 20 64   used for this d
1070: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 63 68 61  atabase */.  cha
1080: 72 20 2a 7a 42 75 73 79 3b 20 20 20 20 20 20 20  r *zBusy;       
1090: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62          /* The b
10a0: 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75  usy callback rou
10b0: 74 69 6e 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  tine */.  char *
10c0: 7a 43 6f 6d 6d 69 74 3b 20 20 20 20 20 20 20 20  zCommit;        
10d0: 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d 6d       /* The comm
10e0: 69 74 20 68 6f 6f 6b 20 63 61 6c 6c 62 61 63 6b  it hook callback
10f0: 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 63 68   routine */.  ch
1100: 61 72 20 2a 7a 54 72 61 63 65 3b 20 20 20 20 20  ar *zTrace;     
1110: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1120: 74 72 61 63 65 20 63 61 6c 6c 62 61 63 6b 20 72  trace callback r
1130: 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 63 68 61 72  outine */.  char
1140: 20 2a 7a 50 72 6f 66 69 6c 65 3b 20 20 20 20 20   *zProfile;     
1150: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 72         /* The pr
1160: 6f 66 69 6c 65 20 63 61 6c 6c 62 61 63 6b 20 72  ofile callback r
1170: 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 63 68 61 72  outine */.  char
1180: 20 2a 7a 50 72 6f 67 72 65 73 73 3b 20 20 20 20   *zProgress;    
1190: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 72         /* The pr
11a0: 6f 67 72 65 73 73 20 63 61 6c 6c 62 61 63 6b 20  ogress callback 
11b0: 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 63 68 61  routine */.  cha
11c0: 72 20 2a 7a 41 75 74 68 3b 20 20 20 20 20 20 20  r *zAuth;       
11d0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61          /* The a
11e0: 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 63 61 6c  uthorization cal
11f0: 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 20 2a 2f  lback routine */
1200: 0a 20 20 69 6e 74 20 64 69 73 61 62 6c 65 41 75  .  int disableAu
1210: 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  th;           /*
1220: 20 44 69 73 61 62 6c 65 20 74 68 65 20 61 75 74   Disable the aut
1230: 68 6f 72 69 7a 65 72 20 69 66 20 69 74 20 65 78  horizer if it ex
1240: 69 73 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ists */.  char *
1250: 7a 4e 75 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  zNull;          
1260: 20 20 20 20 20 2f 2a 20 54 65 78 74 20 74 6f 20       /* Text to 
1270: 73 75 62 73 74 69 74 75 74 65 20 66 6f 72 20 61  substitute for a
1280: 6e 20 53 51 4c 20 4e 55 4c 4c 20 76 61 6c 75 65  n SQL NULL value
1290: 20 2a 2f 0a 20 20 53 71 6c 46 75 6e 63 20 2a 70   */.  SqlFunc *p
12a0: 46 75 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20  Func;           
12b0: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 53 51 4c 20   /* List of SQL 
12c0: 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 54  functions */.  T
12d0: 63 6c 5f 4f 62 6a 20 2a 70 55 70 64 61 74 65 48  cl_Obj *pUpdateH
12e0: 6f 6f 6b 3b 20 20 20 20 20 20 2f 2a 20 55 70 64  ook;      /* Upd
12f0: 61 74 65 20 68 6f 6f 6b 20 73 63 72 69 70 74 20  ate hook script 
1300: 28 69 66 20 61 6e 79 29 20 2a 2f 0a 20 20 54 63  (if any) */.  Tc
1310: 6c 5f 4f 62 6a 20 2a 70 52 6f 6c 6c 62 61 63 6b  l_Obj *pRollback
1320: 48 6f 6f 6b 3b 20 20 20 20 2f 2a 20 52 6f 6c 6c  Hook;    /* Roll
1330: 62 61 63 6b 20 68 6f 6f 6b 20 73 63 72 69 70 74  back hook script
1340: 20 28 69 66 20 61 6e 79 29 20 2a 2f 0a 20 20 54   (if any) */.  T
1350: 63 6c 5f 4f 62 6a 20 2a 70 57 61 6c 48 6f 6f 6b  cl_Obj *pWalHook
1360: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 57 41 4c  ;         /* WAL
1370: 20 68 6f 6f 6b 20 73 63 72 69 70 74 20 28 69 66   hook script (if
1380: 20 61 6e 79 29 20 2a 2f 0a 20 20 54 63 6c 5f 4f   any) */.  Tcl_O
1390: 62 6a 20 2a 70 55 6e 6c 6f 63 6b 4e 6f 74 69 66  bj *pUnlockNotif
13a0: 79 3b 20 20 20 20 2f 2a 20 55 6e 6c 6f 63 6b 20  y;    /* Unlock 
13b0: 6e 6f 74 69 66 79 20 73 63 72 69 70 74 20 28 69  notify script (i
13c0: 66 20 61 6e 79 29 20 2a 2f 0a 20 20 53 71 6c 43  f any) */.  SqlC
13d0: 6f 6c 6c 61 74 65 20 2a 70 43 6f 6c 6c 61 74 65  ollate *pCollate
13e0: 3b 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f  ;      /* List o
13f0: 66 20 53 51 4c 20 63 6f 6c 6c 61 74 69 6f 6e 20  f SQL collation 
1400: 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 69  functions */.  i
1410: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
1420: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
1430: 75 72 6e 20 63 6f 64 65 20 6f 66 20 6d 6f 73 74  urn code of most
1440: 20 72 65 63 65 6e 74 20 73 71 6c 69 74 65 33 5f   recent sqlite3_
1450: 65 78 65 63 28 29 20 2a 2f 0a 20 20 54 63 6c 5f  exec() */.  Tcl_
1460: 4f 62 6a 20 2a 70 43 6f 6c 6c 61 74 65 4e 65 65  Obj *pCollateNee
1470: 64 65 64 3b 20 20 20 2f 2a 20 43 6f 6c 6c 61 74  ded;   /* Collat
1480: 69 6f 6e 20 6e 65 65 64 65 64 20 73 63 72 69 70  ion needed scrip
1490: 74 20 2a 2f 0a 20 20 53 71 6c 50 72 65 70 61 72  t */.  SqlPrepar
14a0: 65 64 53 74 6d 74 20 2a 73 74 6d 74 4c 69 73 74  edStmt *stmtList
14b0: 3b 20 2f 2a 20 4c 69 73 74 20 6f 66 20 70 72 65  ; /* List of pre
14c0: 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 73  pared statements
14d0: 2a 2f 0a 20 20 53 71 6c 50 72 65 70 61 72 65 64  */.  SqlPrepared
14e0: 53 74 6d 74 20 2a 73 74 6d 74 4c 61 73 74 3b 20  Stmt *stmtLast; 
14f0: 2f 2a 20 4c 61 73 74 20 73 74 61 74 65 6d 65 6e  /* Last statemen
1500: 74 20 69 6e 20 74 68 65 20 6c 69 73 74 20 2a 2f  t in the list */
1510: 0a 20 20 69 6e 74 20 6d 61 78 53 74 6d 74 3b 20  .  int maxStmt; 
1520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1530: 20 54 68 65 20 6e 65 78 74 20 6d 61 78 69 6d 75   The next maximu
1540: 6d 20 6e 75 6d 62 65 72 20 6f 66 20 73 74 6d 74  m number of stmt
1550: 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 53  List */.  int nS
1560: 74 6d 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  tmt;            
1570: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1580: 66 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 20  f statements in 
1590: 73 74 6d 74 4c 69 73 74 20 2a 2f 0a 20 20 49 6e  stmtList */.  In
15a0: 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 70  crblobChannel *p
15b0: 49 6e 63 72 62 6c 6f 62 3b 2f 2a 20 4c 69 6e 6b  Incrblob;/* Link
15c0: 65 64 20 6c 69 73 74 20 6f 66 20 6f 70 65 6e 20  ed list of open 
15d0: 69 6e 63 72 62 6c 6f 62 20 63 68 61 6e 6e 65 6c  incrblob channel
15e0: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 74 65 70  s */.  int nStep
15f0: 2c 20 6e 53 6f 72 74 2c 20 6e 49 6e 64 65 78 3b  , nSort, nIndex;
1600: 20 20 2f 2a 20 53 74 61 74 69 73 74 69 63 73 20    /* Statistics 
1610: 66 6f 72 20 6d 6f 73 74 20 72 65 63 65 6e 74 20  for most recent 
1620: 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69  operation */.  i
1630: 6e 74 20 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3b  nt nTransaction;
1640: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1650: 62 65 72 20 6f 66 20 6e 65 73 74 65 64 20 5b 74  ber of nested [t
1660: 72 61 6e 73 61 63 74 69 6f 6e 5d 20 6d 65 74 68  ransaction] meth
1670: 6f 64 73 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  ods */.#ifdef SQ
1680: 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 6e 74 20  LITE_TEST.  int 
1690: 62 4c 65 67 61 63 79 50 72 65 70 61 72 65 3b 20  bLegacyPrepare; 
16a0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74         /* True t
16b0: 6f 20 75 73 65 20 73 71 6c 69 74 65 33 5f 70 72  o use sqlite3_pr
16c0: 65 70 61 72 65 28 29 20 2a 2f 0a 23 65 6e 64 69  epare() */.#endi
16d0: 66 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 49 6e 63  f.};..struct Inc
16e0: 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 7b 0a 20  rblobChannel {. 
16f0: 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 20 2a 70   sqlite3_blob *p
1700: 42 6c 6f 62 3b 20 20 20 20 20 20 2f 2a 20 73 71  Blob;      /* sq
1710: 6c 69 74 65 33 20 62 6c 6f 62 20 68 61 6e 64 6c  lite3 blob handl
1720: 65 20 2a 2f 0a 20 20 53 71 6c 69 74 65 44 62 20  e */.  SqliteDb 
1730: 2a 70 44 62 3b 20 20 20 20 20 20 20 20 20 20 20  *pDb;           
1740: 20 2f 2a 20 41 73 73 6f 63 69 61 74 65 64 20 64   /* Associated d
1750: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
1760: 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 53 65 65  on */.  int iSee
1770: 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
1780: 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 73 65 65    /* Current see
1790: 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20 54 63  k offset */.  Tc
17a0: 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 6e 65  l_Channel channe
17b0: 6c 3b 20 20 20 20 20 20 2f 2a 20 43 68 61 6e 6e  l;      /* Chann
17c0: 65 6c 20 69 64 65 6e 74 69 66 69 65 72 20 2a 2f  el identifier */
17d0: 0a 20 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e  .  IncrblobChann
17e0: 65 6c 20 2a 70 4e 65 78 74 3b 20 20 20 2f 2a 20  el *pNext;   /* 
17f0: 4c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 61  Linked list of a
1800: 6c 6c 20 6f 70 65 6e 20 69 6e 63 72 62 6c 6f 62  ll open incrblob
1810: 20 63 68 61 6e 6e 65 6c 73 20 2a 2f 0a 20 20 49   channels */.  I
1820: 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a  ncrblobChannel *
1830: 70 50 72 65 76 3b 20 20 20 2f 2a 20 4c 69 6e 6b  pPrev;   /* Link
1840: 65 64 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 6f  ed list of all o
1850: 70 65 6e 20 69 6e 63 72 62 6c 6f 62 20 63 68 61  pen incrblob cha
1860: 6e 6e 65 6c 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a  nnels */.};../*.
1870: 2a 2a 20 43 6f 6d 70 75 74 65 20 61 20 73 74 72  ** Compute a str
1880: 69 6e 67 20 6c 65 6e 67 74 68 20 74 68 61 74 20  ing length that 
1890: 69 73 20 6c 69 6d 69 74 65 64 20 74 6f 20 77 68  is limited to wh
18a0: 61 74 20 63 61 6e 20 62 65 20 73 74 6f 72 65 64  at can be stored
18b0: 20 69 6e 0a 2a 2a 20 6c 6f 77 65 72 20 33 30 20   in.** lower 30 
18c0: 62 69 74 73 20 6f 66 20 61 20 33 32 2d 62 69 74  bits of a 32-bit
18d0: 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 2e   signed integer.
18e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
18f0: 74 72 6c 65 6e 33 30 28 63 6f 6e 73 74 20 63 68  trlen30(const ch
1900: 61 72 20 2a 7a 29 7b 0a 20 20 63 6f 6e 73 74 20  ar *z){.  const 
1910: 63 68 61 72 20 2a 7a 32 20 3d 20 7a 3b 0a 20 20  char *z2 = z;.  
1920: 77 68 69 6c 65 28 20 2a 7a 32 20 29 7b 20 7a 32  while( *z2 ){ z2
1930: 2b 2b 3b 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ++; }.  return 0
1940: 78 33 66 66 66 66 66 66 66 20 26 20 28 69 6e 74  x3fffffff & (int
1950: 29 28 7a 32 20 2d 20 7a 29 3b 0a 7d 0a 0a 0a 23  )(z2 - z);.}...#
1960: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1970: 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 2f 2a 0a 2a  IT_INCRBLOB./*.*
1980: 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 69 6e 63 72  * Close all incr
1990: 62 6c 6f 62 20 63 68 61 6e 6e 65 6c 73 20 6f 70  blob channels op
19a0: 65 6e 65 64 20 75 73 69 6e 67 20 64 61 74 61 62  ened using datab
19b0: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70  ase connection p
19c0: 44 62 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 63  Db..** This is c
19d0: 61 6c 6c 65 64 20 77 68 65 6e 20 73 68 75 74 74  alled when shutt
19e0: 69 6e 67 20 64 6f 77 6e 20 74 68 65 20 64 61 74  ing down the dat
19f0: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
1a00: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1a10: 20 63 6c 6f 73 65 49 6e 63 72 62 6c 6f 62 43 68   closeIncrblobCh
1a20: 61 6e 6e 65 6c 73 28 53 71 6c 69 74 65 44 62 20  annels(SqliteDb 
1a30: 2a 70 44 62 29 7b 0a 20 20 49 6e 63 72 62 6c 6f  *pDb){.  Incrblo
1a40: 62 43 68 61 6e 6e 65 6c 20 2a 70 3b 0a 20 20 49  bChannel *p;.  I
1a50: 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a  ncrblobChannel *
1a60: 70 4e 65 78 74 3b 0a 0a 20 20 66 6f 72 28 70 3d  pNext;..  for(p=
1a70: 70 44 62 2d 3e 70 49 6e 63 72 62 6c 6f 62 3b 20  pDb->pIncrblob; 
1a80: 70 3b 20 70 3d 70 4e 65 78 74 29 7b 0a 20 20 20  p; p=pNext){.   
1a90: 20 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78   pNext = p->pNex
1aa0: 74 3b 0a 0a 20 20 20 20 2f 2a 20 4e 6f 74 65 3a  t;..    /* Note:
1ab0: 20 43 61 6c 6c 69 6e 67 20 75 6e 72 65 67 69 73   Calling unregis
1ac0: 74 65 72 20 68 65 72 65 20 63 61 6c 6c 20 54 63  ter here call Tc
1ad0: 6c 5f 43 6c 6f 73 65 20 6f 6e 20 74 68 65 20 69  l_Close on the i
1ae0: 6e 63 72 62 6c 6f 62 20 63 68 61 6e 6e 65 6c 2c  ncrblob channel,
1af0: 20 0a 20 20 20 20 2a 2a 20 77 68 69 63 68 20 64   .    ** which d
1b00: 65 6c 65 74 65 73 20 74 68 65 20 49 6e 63 72 62  eletes the Incrb
1b10: 6c 6f 62 43 68 61 6e 6e 65 6c 20 73 74 72 75 63  lobChannel struc
1b20: 74 75 72 65 20 61 74 20 2a 70 2e 20 53 6f 20 64  ture at *p. So d
1b30: 6f 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 63 61 6c  o not.    ** cal
1b40: 6c 20 54 63 6c 5f 46 72 65 65 28 29 20 68 65 72  l Tcl_Free() her
1b50: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 54 63  e..    */.    Tc
1b60: 6c 5f 55 6e 72 65 67 69 73 74 65 72 43 68 61 6e  l_UnregisterChan
1b70: 6e 65 6c 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c  nel(pDb->interp,
1b80: 20 70 2d 3e 63 68 61 6e 6e 65 6c 29 3b 0a 20 20   p->channel);.  
1b90: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  }.}../*.** Close
1ba0: 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20   an incremental 
1bb0: 62 6c 6f 62 20 63 68 61 6e 6e 65 6c 2e 0a 2a 2f  blob channel..*/
1bc0: 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 63 72  .static int incr
1bd0: 62 6c 6f 62 43 6c 6f 73 65 28 43 6c 69 65 6e 74  blobClose(Client
1be0: 44 61 74 61 20 69 6e 73 74 61 6e 63 65 44 61 74  Data instanceDat
1bf0: 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  a, Tcl_Interp *i
1c00: 6e 74 65 72 70 29 7b 0a 20 20 49 6e 63 72 62 6c  nterp){.  Incrbl
1c10: 6f 62 43 68 61 6e 6e 65 6c 20 2a 70 20 3d 20 28  obChannel *p = (
1c20: 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20  IncrblobChannel 
1c30: 2a 29 69 6e 73 74 61 6e 63 65 44 61 74 61 3b 0a  *)instanceData;.
1c40: 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74    int rc = sqlit
1c50: 65 33 5f 62 6c 6f 62 5f 63 6c 6f 73 65 28 70 2d  e3_blob_close(p-
1c60: 3e 70 42 6c 6f 62 29 3b 0a 20 20 73 71 6c 69 74  >pBlob);.  sqlit
1c70: 65 33 20 2a 64 62 20 3d 20 70 2d 3e 70 44 62 2d  e3 *db = p->pDb-
1c80: 3e 64 62 3b 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76  >db;..  /* Remov
1c90: 65 20 74 68 65 20 63 68 61 6e 6e 65 6c 20 66 72  e the channel fr
1ca0: 6f 6d 20 74 68 65 20 53 71 6c 69 74 65 44 62 2e  om the SqliteDb.
1cb0: 70 49 6e 63 72 62 6c 6f 62 20 6c 69 73 74 2e 20  pIncrblob list. 
1cc0: 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 4e 65 78  */.  if( p->pNex
1cd0: 74 20 29 7b 0a 20 20 20 20 70 2d 3e 70 4e 65 78  t ){.    p->pNex
1ce0: 74 2d 3e 70 50 72 65 76 20 3d 20 70 2d 3e 70 50  t->pPrev = p->pP
1cf0: 72 65 76 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  rev;.  }.  if( p
1d00: 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20 70  ->pPrev ){.    p
1d10: 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d  ->pPrev->pNext =
1d20: 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20   p->pNext;.  }. 
1d30: 20 69 66 28 20 70 2d 3e 70 44 62 2d 3e 70 49 6e   if( p->pDb->pIn
1d40: 63 72 62 6c 6f 62 3d 3d 70 20 29 7b 0a 20 20 20  crblob==p ){.   
1d50: 20 70 2d 3e 70 44 62 2d 3e 70 49 6e 63 72 62 6c   p->pDb->pIncrbl
1d60: 6f 62 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20  ob = p->pNext;. 
1d70: 20 7d 0a 0a 20 20 2f 2a 20 46 72 65 65 20 74 68   }..  /* Free th
1d80: 65 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65  e IncrblobChanne
1d90: 6c 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  l structure */. 
1da0: 20 54 63 6c 5f 46 72 65 65 28 28 63 68 61 72 20   Tcl_Free((char 
1db0: 2a 29 70 29 3b 0a 0a 20 20 69 66 28 20 72 63 21  *)p);..  if( rc!
1dc0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1dd0: 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28    Tcl_SetResult(
1de0: 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29  interp, (char *)
1df0: 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64  sqlite3_errmsg(d
1e00: 62 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45  b), TCL_VOLATILE
1e10: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
1e20: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72  L_ERROR;.  }.  r
1e30: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
1e40: 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 64 61 74 61  ./*.** Read data
1e50: 20 66 72 6f 6d 20 61 6e 20 69 6e 63 72 65 6d 65   from an increme
1e60: 6e 74 61 6c 20 62 6c 6f 62 20 63 68 61 6e 6e 65  ntal blob channe
1e70: 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  l..*/.static int
1e80: 20 69 6e 63 72 62 6c 6f 62 49 6e 70 75 74 28 0a   incrblobInput(.
1e90: 20 20 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73    ClientData ins
1ea0: 74 61 6e 63 65 44 61 74 61 2c 20 0a 20 20 63 68  tanceData, .  ch
1eb0: 61 72 20 2a 62 75 66 2c 20 0a 20 20 69 6e 74 20  ar *buf, .  int 
1ec0: 62 75 66 53 69 7a 65 2c 0a 20 20 69 6e 74 20 2a  bufSize,.  int *
1ed0: 65 72 72 6f 72 43 6f 64 65 50 74 72 0a 29 7b 0a  errorCodePtr.){.
1ee0: 20 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65    IncrblobChanne
1ef0: 6c 20 2a 70 20 3d 20 28 49 6e 63 72 62 6c 6f 62  l *p = (Incrblob
1f00: 43 68 61 6e 6e 65 6c 20 2a 29 69 6e 73 74 61 6e  Channel *)instan
1f10: 63 65 44 61 74 61 3b 0a 20 20 69 6e 74 20 6e 52  ceData;.  int nR
1f20: 65 61 64 20 3d 20 62 75 66 53 69 7a 65 3b 20 20  ead = bufSize;  
1f30: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1f40: 20 6f 66 20 62 79 74 65 73 20 74 6f 20 72 65 61   of bytes to rea
1f50: 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 6c 6f 62  d */.  int nBlob
1f60: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1f70: 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a      /* Total siz
1f80: 65 20 6f 66 20 74 68 65 20 62 6c 6f 62 20 2a 2f  e of the blob */
1f90: 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
1fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb0: 2f 2a 20 73 71 6c 69 74 65 20 65 72 72 6f 72 20  /* sqlite error 
1fc0: 63 6f 64 65 20 2a 2f 0a 0a 20 20 6e 42 6c 6f 62  code */..  nBlob
1fd0: 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f   = sqlite3_blob_
1fe0: 62 79 74 65 73 28 70 2d 3e 70 42 6c 6f 62 29 3b  bytes(p->pBlob);
1ff0: 0a 20 20 69 66 28 20 28 70 2d 3e 69 53 65 65 6b  .  if( (p->iSeek
2000: 2b 6e 52 65 61 64 29 3e 6e 42 6c 6f 62 20 29 7b  +nRead)>nBlob ){
2010: 0a 20 20 20 20 6e 52 65 61 64 20 3d 20 6e 42 6c  .    nRead = nBl
2020: 6f 62 2d 70 2d 3e 69 53 65 65 6b 3b 0a 20 20 7d  ob-p->iSeek;.  }
2030: 0a 20 20 69 66 28 20 6e 52 65 61 64 3c 3d 30 20  .  if( nRead<=0 
2040: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
2050: 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 73 71 6c  .  }..  rc = sql
2060: 69 74 65 33 5f 62 6c 6f 62 5f 72 65 61 64 28 70  ite3_blob_read(p
2070: 2d 3e 70 42 6c 6f 62 2c 20 28 76 6f 69 64 20 2a  ->pBlob, (void *
2080: 29 62 75 66 2c 20 6e 52 65 61 64 2c 20 70 2d 3e  )buf, nRead, p->
2090: 69 53 65 65 6b 29 3b 0a 20 20 69 66 28 20 72 63  iSeek);.  if( rc
20a0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
20b0: 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72     *errorCodePtr
20c0: 20 3d 20 72 63 3b 0a 20 20 20 20 72 65 74 75 72   = rc;.    retur
20d0: 6e 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 70 2d 3e  n -1;.  }..  p->
20e0: 69 53 65 65 6b 20 2b 3d 20 6e 52 65 61 64 3b 0a  iSeek += nRead;.
20f0: 20 20 72 65 74 75 72 6e 20 6e 52 65 61 64 3b 0a    return nRead;.
2100: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 64  }../*.** Write d
2110: 61 74 61 20 74 6f 20 61 6e 20 69 6e 63 72 65 6d  ata to an increm
2120: 65 6e 74 61 6c 20 62 6c 6f 62 20 63 68 61 6e 6e  ental blob chann
2130: 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  el..*/.static in
2140: 74 20 69 6e 63 72 62 6c 6f 62 4f 75 74 70 75 74  t incrblobOutput
2150: 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 69  (.  ClientData i
2160: 6e 73 74 61 6e 63 65 44 61 74 61 2c 20 0a 20 20  nstanceData, .  
2170: 43 4f 4e 53 54 20 63 68 61 72 20 2a 62 75 66 2c  CONST char *buf,
2180: 20 0a 20 20 69 6e 74 20 74 6f 57 72 69 74 65 2c   .  int toWrite,
2190: 0a 20 20 69 6e 74 20 2a 65 72 72 6f 72 43 6f 64  .  int *errorCod
21a0: 65 50 74 72 0a 29 7b 0a 20 20 49 6e 63 72 62 6c  ePtr.){.  Incrbl
21b0: 6f 62 43 68 61 6e 6e 65 6c 20 2a 70 20 3d 20 28  obChannel *p = (
21c0: 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20  IncrblobChannel 
21d0: 2a 29 69 6e 73 74 61 6e 63 65 44 61 74 61 3b 0a  *)instanceData;.
21e0: 20 20 69 6e 74 20 6e 57 72 69 74 65 20 3d 20 74    int nWrite = t
21f0: 6f 57 72 69 74 65 3b 20 20 20 20 20 20 20 20 2f  oWrite;        /
2200: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
2210: 73 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a 20 20  s to write */.  
2220: 69 6e 74 20 6e 42 6c 6f 62 3b 20 20 20 20 20 20  int nBlob;      
2230: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2240: 54 6f 74 61 6c 20 73 69 7a 65 20 6f 66 20 74 68  Total size of th
2250: 65 20 62 6c 6f 62 20 2a 2f 0a 20 20 69 6e 74 20  e blob */.  int 
2260: 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
2270: 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69           /* sqli
2280: 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f  te error code */
2290: 0a 0a 20 20 6e 42 6c 6f 62 20 3d 20 73 71 6c 69  ..  nBlob = sqli
22a0: 74 65 33 5f 62 6c 6f 62 5f 62 79 74 65 73 28 70  te3_blob_bytes(p
22b0: 2d 3e 70 42 6c 6f 62 29 3b 0a 20 20 69 66 28 20  ->pBlob);.  if( 
22c0: 28 70 2d 3e 69 53 65 65 6b 2b 6e 57 72 69 74 65  (p->iSeek+nWrite
22d0: 29 3e 6e 42 6c 6f 62 20 29 7b 0a 20 20 20 20 2a  )>nBlob ){.    *
22e0: 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 45  errorCodePtr = E
22f0: 49 4e 56 41 4c 3b 0a 20 20 20 20 72 65 74 75 72  INVAL;.    retur
2300: 6e 20 2d 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20  n -1;.  }.  if( 
2310: 6e 57 72 69 74 65 3c 3d 30 20 29 7b 0a 20 20 20  nWrite<=0 ){.   
2320: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a   return 0;.  }..
2330: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62    rc = sqlite3_b
2340: 6c 6f 62 5f 77 72 69 74 65 28 70 2d 3e 70 42 6c  lob_write(p->pBl
2350: 6f 62 2c 20 28 76 6f 69 64 20 2a 29 62 75 66 2c  ob, (void *)buf,
2360: 20 6e 57 72 69 74 65 2c 20 70 2d 3e 69 53 65 65   nWrite, p->iSee
2370: 6b 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  k);.  if( rc!=SQ
2380: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a  LITE_OK ){.    *
2390: 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 45  errorCodePtr = E
23a0: 49 4f 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 2d  IO;.    return -
23b0: 31 3b 0a 20 20 7d 0a 0a 20 20 70 2d 3e 69 53 65  1;.  }..  p->iSe
23c0: 65 6b 20 2b 3d 20 6e 57 72 69 74 65 3b 0a 20 20  ek += nWrite;.  
23d0: 72 65 74 75 72 6e 20 6e 57 72 69 74 65 3b 0a 7d  return nWrite;.}
23e0: 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20 61 6e 20  ../*.** Seek an 
23f0: 69 6e 63 72 65 6d 65 6e 74 61 6c 20 62 6c 6f 62  incremental blob
2400: 20 63 68 61 6e 6e 65 6c 2e 0a 2a 2f 0a 73 74 61   channel..*/.sta
2410: 74 69 63 20 69 6e 74 20 69 6e 63 72 62 6c 6f 62  tic int incrblob
2420: 53 65 65 6b 28 0a 20 20 43 6c 69 65 6e 74 44 61  Seek(.  ClientDa
2430: 74 61 20 69 6e 73 74 61 6e 63 65 44 61 74 61 2c  ta instanceData,
2440: 20 0a 20 20 6c 6f 6e 67 20 6f 66 66 73 65 74 2c   .  long offset,
2450: 0a 20 20 69 6e 74 20 73 65 65 6b 4d 6f 64 65 2c  .  int seekMode,
2460: 0a 20 20 69 6e 74 20 2a 65 72 72 6f 72 43 6f 64  .  int *errorCod
2470: 65 50 74 72 0a 29 7b 0a 20 20 49 6e 63 72 62 6c  ePtr.){.  Incrbl
2480: 6f 62 43 68 61 6e 6e 65 6c 20 2a 70 20 3d 20 28  obChannel *p = (
2490: 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20  IncrblobChannel 
24a0: 2a 29 69 6e 73 74 61 6e 63 65 44 61 74 61 3b 0a  *)instanceData;.
24b0: 0a 20 20 73 77 69 74 63 68 28 20 73 65 65 6b 4d  .  switch( seekM
24c0: 6f 64 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20  ode ){.    case 
24d0: 53 45 45 4b 5f 53 45 54 3a 0a 20 20 20 20 20 20  SEEK_SET:.      
24e0: 70 2d 3e 69 53 65 65 6b 20 3d 20 6f 66 66 73 65  p->iSeek = offse
24f0: 74 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  t;.      break;.
2500: 20 20 20 20 63 61 73 65 20 53 45 45 4b 5f 43 55      case SEEK_CU
2510: 52 3a 0a 20 20 20 20 20 20 70 2d 3e 69 53 65 65  R:.      p->iSee
2520: 6b 20 2b 3d 20 6f 66 66 73 65 74 3b 0a 20 20 20  k += offset;.   
2530: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
2540: 73 65 20 53 45 45 4b 5f 45 4e 44 3a 0a 20 20 20  se SEEK_END:.   
2550: 20 20 20 70 2d 3e 69 53 65 65 6b 20 3d 20 73 71     p->iSeek = sq
2560: 6c 69 74 65 33 5f 62 6c 6f 62 5f 62 79 74 65 73  lite3_blob_bytes
2570: 28 70 2d 3e 70 42 6c 6f 62 29 20 2b 20 6f 66 66  (p->pBlob) + off
2580: 73 65 74 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  set;.      break
2590: 3b 0a 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20  ;..    default: 
25a0: 61 73 73 65 72 74 28 21 22 42 61 64 20 73 65 65  assert(!"Bad see
25b0: 6b 4d 6f 64 65 22 29 3b 0a 20 20 7d 0a 0a 20 20  kMode");.  }..  
25c0: 72 65 74 75 72 6e 20 70 2d 3e 69 53 65 65 6b 3b  return p->iSeek;
25d0: 0a 7d 0a 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  .}...static void
25e0: 20 69 6e 63 72 62 6c 6f 62 57 61 74 63 68 28 43   incrblobWatch(C
25f0: 6c 69 65 6e 74 44 61 74 61 20 69 6e 73 74 61 6e  lientData instan
2600: 63 65 44 61 74 61 2c 20 69 6e 74 20 6d 6f 64 65  ceData, int mode
2610: 29 7b 20 0a 20 20 2f 2a 20 4e 4f 2d 4f 50 20 2a  ){ .  /* NO-OP *
2620: 2f 20 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20  / .}.static int 
2630: 69 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 28 43  incrblobHandle(C
2640: 6c 69 65 6e 74 44 61 74 61 20 69 6e 73 74 61 6e  lientData instan
2650: 63 65 44 61 74 61 2c 20 69 6e 74 20 64 69 72 2c  ceData, int dir,
2660: 20 43 6c 69 65 6e 74 44 61 74 61 20 2a 68 50 74   ClientData *hPt
2670: 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  r){.  return TCL
2680: 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 73 74 61 74 69  _ERROR;.}..stati
2690: 63 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 54 79 70  c Tcl_ChannelTyp
26a0: 65 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65  e IncrblobChanne
26b0: 6c 54 79 70 65 20 3d 20 7b 0a 20 20 22 69 6e 63  lType = {.  "inc
26c0: 72 62 6c 6f 62 22 2c 20 20 20 20 20 20 20 20 20  rblob",         
26d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26e0: 2a 20 74 79 70 65 4e 61 6d 65 20 20 20 20 20 20  * typeName      
26f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2700: 20 20 20 20 20 20 20 2a 2f 0a 20 20 54 43 4c 5f         */.  TCL_
2710: 43 48 41 4e 4e 45 4c 5f 56 45 52 53 49 4f 4e 5f  CHANNEL_VERSION_
2720: 32 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  2,             /
2730: 2a 20 76 65 72 73 69 6f 6e 20 20 20 20 20 20 20  * version       
2740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2750: 20 20 20 20 20 20 20 2a 2f 0a 20 20 69 6e 63 72         */.  incr
2760: 62 6c 6f 62 43 6c 6f 73 65 2c 20 20 20 20 20 20  blobClose,      
2770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2780: 2a 20 63 6c 6f 73 65 50 72 6f 63 20 20 20 20 20  * closeProc     
2790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27a0: 20 20 20 20 20 20 20 2a 2f 0a 20 20 69 6e 63 72         */.  incr
27b0: 62 6c 6f 62 49 6e 70 75 74 2c 20 20 20 20 20 20  blobInput,      
27c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
27d0: 2a 20 69 6e 70 75 74 50 72 6f 63 20 20 20 20 20  * inputProc     
27e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27f0: 20 20 20 20 20 20 20 2a 2f 0a 20 20 69 6e 63 72         */.  incr
2800: 62 6c 6f 62 4f 75 74 70 75 74 2c 20 20 20 20 20  blobOutput,     
2810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2820: 2a 20 6f 75 74 70 75 74 50 72 6f 63 20 20 20 20  * outputProc    
2830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2840: 20 20 20 20 20 20 20 2a 2f 0a 20 20 69 6e 63 72         */.  incr
2850: 62 6c 6f 62 53 65 65 6b 2c 20 20 20 20 20 20 20  blobSeek,       
2860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2870: 2a 20 73 65 65 6b 50 72 6f 63 20 20 20 20 20 20  * seekProc      
2880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2890: 20 20 20 20 20 20 20 2a 2f 0a 20 20 30 2c 20 20         */.  0,  
28a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
28c0: 2a 20 73 65 74 4f 70 74 69 6f 6e 50 72 6f 63 20  * setOptionProc 
28d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28e0: 20 20 20 20 20 20 20 2a 2f 0a 20 20 30 2c 20 20         */.  0,  
28f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2910: 2a 20 67 65 74 4f 70 74 69 6f 6e 50 72 6f 63 20  * getOptionProc 
2920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2930: 20 20 20 20 20 20 20 2a 2f 0a 20 20 69 6e 63 72         */.  incr
2940: 62 6c 6f 62 57 61 74 63 68 2c 20 20 20 20 20 20  blobWatch,      
2950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2960: 2a 20 77 61 74 63 68 50 72 6f 63 20 28 74 68 69  * watchProc (thi
2970: 73 20 69 73 20 61 20 6e 6f 2d 6f 70 29 20 20 20  s is a no-op)   
2980: 20 20 20 20 20 20 20 2a 2f 0a 20 20 69 6e 63 72         */.  incr
2990: 62 6c 6f 62 48 61 6e 64 6c 65 2c 20 20 20 20 20  blobHandle,     
29a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
29b0: 2a 20 67 65 74 48 61 6e 64 6c 65 50 72 6f 63 20  * getHandleProc 
29c0: 28 61 6c 77 61 79 73 20 72 65 74 75 72 6e 73 20  (always returns 
29d0: 65 72 72 6f 72 29 20 2a 2f 0a 20 20 30 2c 20 20  error) */.  0,  
29e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a00: 2a 20 63 6c 6f 73 65 32 50 72 6f 63 20 20 20 20  * close2Proc    
2a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a20: 20 20 20 20 20 20 20 2a 2f 0a 20 20 30 2c 20 20         */.  0,  
2a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a50: 2a 20 62 6c 6f 63 6b 4d 6f 64 65 50 72 6f 63 20  * blockModeProc 
2a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a70: 20 20 20 20 20 20 20 2a 2f 0a 20 20 30 2c 20 20         */.  0,  
2a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2aa0: 2a 20 66 6c 75 73 68 50 72 6f 63 20 20 20 20 20  * flushProc     
2ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ac0: 20 20 20 20 20 20 20 2a 2f 0a 20 20 30 2c 20 20         */.  0,  
2ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2af0: 2a 20 68 61 6e 64 6c 65 72 50 72 6f 63 20 20 20  * handlerProc   
2b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b10: 20 20 20 20 20 20 20 2a 2f 0a 20 20 30 2c 20 20         */.  0,  
2b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2b40: 2a 20 77 69 64 65 53 65 65 6b 50 72 6f 63 20 20  * wideSeekProc  
2b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b60: 20 20 20 20 20 20 20 2a 2f 0a 7d 3b 0a 0a 2f 2a         */.};../*
2b70: 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77  .** Create a new
2b80: 20 69 6e 63 72 62 6c 6f 62 20 63 68 61 6e 6e 65   incrblob channe
2b90: 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  l..*/.static int
2ba0: 20 63 72 65 61 74 65 49 6e 63 72 62 6c 6f 62 43   createIncrblobC
2bb0: 68 61 6e 6e 65 6c 28 0a 20 20 54 63 6c 5f 49 6e  hannel(.  Tcl_In
2bc0: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 0a 20  terp *interp, . 
2bd0: 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 2c 20   SqliteDb *pDb, 
2be0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
2bf0: 44 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  Db,.  const char
2c00: 20 2a 7a 54 61 62 6c 65 2c 20 0a 20 20 63 6f 6e   *zTable, .  con
2c10: 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 75 6d 6e  st char *zColumn
2c20: 2c 20 0a 20 20 73 71 6c 69 74 65 5f 69 6e 74 36  , .  sqlite_int6
2c30: 34 20 69 52 6f 77 2c 0a 20 20 69 6e 74 20 69 73  4 iRow,.  int is
2c40: 52 65 61 64 6f 6e 6c 79 0a 29 7b 0a 20 20 49 6e  Readonly.){.  In
2c50: 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 70  crblobChannel *p
2c60: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
2c70: 3d 20 70 44 62 2d 3e 64 62 3b 0a 20 20 73 71 6c  = pDb->db;.  sql
2c80: 69 74 65 33 5f 62 6c 6f 62 20 2a 70 42 6c 6f 62  ite3_blob *pBlob
2c90: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e  ;.  int rc;.  in
2ca0: 74 20 66 6c 61 67 73 20 3d 20 54 43 4c 5f 52 45  t flags = TCL_RE
2cb0: 41 44 41 42 4c 45 7c 28 69 73 52 65 61 64 6f 6e  ADABLE|(isReadon
2cc0: 6c 79 20 3f 20 30 20 3a 20 54 43 4c 5f 57 52 49  ly ? 0 : TCL_WRI
2cd0: 54 41 42 4c 45 29 3b 0a 0a 20 20 2f 2a 20 54 68  TABLE);..  /* Th
2ce0: 69 73 20 76 61 72 69 61 62 6c 65 20 69 73 20 75  is variable is u
2cf0: 73 65 64 20 74 6f 20 6e 61 6d 65 20 74 68 65 20  sed to name the 
2d00: 63 68 61 6e 6e 65 6c 73 3a 20 22 69 6e 63 72 62  channels: "incrb
2d10: 6c 6f 62 5f 5b 69 6e 63 72 20 63 6f 75 6e 74 5d  lob_[incr count]
2d20: 22 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 69 6e  " */.  static in
2d30: 74 20 63 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 63  t count = 0;.  c
2d40: 68 61 72 20 7a 43 68 61 6e 6e 65 6c 5b 36 34 5d  har zChannel[64]
2d50: 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
2d60: 33 5f 62 6c 6f 62 5f 6f 70 65 6e 28 64 62 2c 20  3_blob_open(db, 
2d70: 7a 44 62 2c 20 7a 54 61 62 6c 65 2c 20 7a 43 6f  zDb, zTable, zCo
2d80: 6c 75 6d 6e 2c 20 69 52 6f 77 2c 20 21 69 73 52  lumn, iRow, !isR
2d90: 65 61 64 6f 6e 6c 79 2c 20 26 70 42 6c 6f 62 29  eadonly, &pBlob)
2da0: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
2db0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c  TE_OK ){.    Tcl
2dc0: 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
2dd0: 70 2c 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74  p, (char *)sqlit
2de0: 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64  e3_errmsg(pDb->d
2df0: 62 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45  b), TCL_VOLATILE
2e00: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
2e10: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
2e20: 70 20 3d 20 28 49 6e 63 72 62 6c 6f 62 43 68 61  p = (IncrblobCha
2e30: 6e 6e 65 6c 20 2a 29 54 63 6c 5f 41 6c 6c 6f 63  nnel *)Tcl_Alloc
2e40: 28 73 69 7a 65 6f 66 28 49 6e 63 72 62 6c 6f 62  (sizeof(Incrblob
2e50: 43 68 61 6e 6e 65 6c 29 29 3b 0a 20 20 70 2d 3e  Channel));.  p->
2e60: 69 53 65 65 6b 20 3d 20 30 3b 0a 20 20 70 2d 3e  iSeek = 0;.  p->
2e70: 70 42 6c 6f 62 20 3d 20 70 42 6c 6f 62 3b 0a 0a  pBlob = pBlob;..
2e80: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
2e90: 74 66 28 73 69 7a 65 6f 66 28 7a 43 68 61 6e 6e  tf(sizeof(zChann
2ea0: 65 6c 29 2c 20 7a 43 68 61 6e 6e 65 6c 2c 20 22  el), zChannel, "
2eb0: 69 6e 63 72 62 6c 6f 62 5f 25 64 22 2c 20 2b 2b  incrblob_%d", ++
2ec0: 63 6f 75 6e 74 29 3b 0a 20 20 70 2d 3e 63 68 61  count);.  p->cha
2ed0: 6e 6e 65 6c 20 3d 20 54 63 6c 5f 43 72 65 61 74  nnel = Tcl_Creat
2ee0: 65 43 68 61 6e 6e 65 6c 28 26 49 6e 63 72 62 6c  eChannel(&Incrbl
2ef0: 6f 62 43 68 61 6e 6e 65 6c 54 79 70 65 2c 20 7a  obChannelType, z
2f00: 43 68 61 6e 6e 65 6c 2c 20 70 2c 20 66 6c 61 67  Channel, p, flag
2f10: 73 29 3b 0a 20 20 54 63 6c 5f 52 65 67 69 73 74  s);.  Tcl_Regist
2f20: 65 72 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70  erChannel(interp
2f30: 2c 20 70 2d 3e 63 68 61 6e 6e 65 6c 29 3b 0a 0a  , p->channel);..
2f40: 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 6e 65    /* Link the ne
2f50: 77 20 63 68 61 6e 6e 65 6c 20 69 6e 74 6f 20 74  w channel into t
2f60: 68 65 20 53 71 6c 69 74 65 44 62 2e 70 49 6e 63  he SqliteDb.pInc
2f70: 72 62 6c 6f 62 20 6c 69 73 74 2e 20 2a 2f 0a 20  rblob list. */. 
2f80: 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 44 62 2d   p->pNext = pDb-
2f90: 3e 70 49 6e 63 72 62 6c 6f 62 3b 0a 20 20 70 2d  >pIncrblob;.  p-
2fa0: 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 69 66  >pPrev = 0;.  if
2fb0: 28 20 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20  ( p->pNext ){.  
2fc0: 20 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65    p->pNext->pPre
2fd0: 76 20 3d 20 70 3b 0a 20 20 7d 0a 20 20 70 44 62  v = p;.  }.  pDb
2fe0: 2d 3e 70 49 6e 63 72 62 6c 6f 62 20 3d 20 70 3b  ->pIncrblob = p;
2ff0: 0a 20 20 70 2d 3e 70 44 62 20 3d 20 70 44 62 3b  .  p->pDb = pDb;
3000: 0a 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c  ..  Tcl_SetResul
3010: 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20  t(interp, (char 
3020: 2a 29 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c  *)Tcl_GetChannel
3030: 4e 61 6d 65 28 70 2d 3e 63 68 61 6e 6e 65 6c 29  Name(p->channel)
3040: 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b  , TCL_VOLATILE);
3050: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
3060: 3b 0a 7d 0a 23 65 6c 73 65 20 20 2f 2a 20 65 6c  ;.}.#else  /* el
3070: 73 65 20 63 6c 61 75 73 65 20 66 6f 72 20 22 23  se clause for "#
3080: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
3090: 49 54 5f 49 4e 43 52 42 4c 4f 42 22 20 2a 2f 0a  IT_INCRBLOB" */.
30a0: 20 20 23 64 65 66 69 6e 65 20 63 6c 6f 73 65 49    #define closeI
30b0: 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 73 28  ncrblobChannels(
30c0: 70 44 62 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  pDb).#endif../*.
30d0: 2a 2a 20 4c 6f 6f 6b 20 61 74 20 74 68 65 20 73  ** Look at the s
30e0: 63 72 69 70 74 20 70 72 65 66 69 78 20 69 6e 20  cript prefix in 
30f0: 70 43 6d 64 2e 20 20 57 65 20 77 69 6c 6c 20 62  pCmd.  We will b
3100: 65 20 65 78 65 63 75 74 69 6e 67 20 74 68 69 73  e executing this
3110: 20 73 63 72 69 70 74 0a 2a 2a 20 61 66 74 65 72   script.** after
3120: 20 66 69 72 73 74 20 61 70 70 65 6e 64 69 6e 67   first appending
3130: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 61 72 67   one or more arg
3140: 75 6d 65 6e 74 73 2e 20 20 54 68 69 73 20 72 6f  uments.  This ro
3150: 75 74 69 6e 65 20 61 6e 61 6c 79 7a 65 73 0a 2a  utine analyzes.*
3160: 2a 20 74 68 65 20 73 63 72 69 70 74 20 74 6f 20  * the script to 
3170: 73 65 65 20 69 66 20 69 74 20 69 73 20 73 61 66  see if it is saf
3180: 65 20 74 6f 20 75 73 65 20 54 63 6c 5f 45 76 61  e to use Tcl_Eva
3190: 6c 4f 62 6a 76 28 29 20 6f 6e 20 74 68 65 20 73  lObjv() on the s
31a0: 63 72 69 70 74 0a 2a 2a 20 72 61 74 68 65 72 20  cript.** rather 
31b0: 74 68 61 6e 20 74 68 65 20 6d 6f 72 65 20 67 65  than the more ge
31c0: 6e 65 72 61 6c 20 54 63 6c 5f 45 76 61 6c 45 78  neral Tcl_EvalEx
31d0: 28 29 2e 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a  ().  Tcl_EvalObj
31e0: 76 28 29 20 69 73 20 6d 75 63 68 0a 2a 2a 20 66  v() is much.** f
31f0: 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 53 63 72  aster..**.** Scr
3200: 69 70 74 73 20 74 68 61 74 20 61 72 65 20 73 61  ipts that are sa
3210: 66 65 20 74 6f 20 75 73 65 20 77 69 74 68 20 54  fe to use with T
3220: 63 6c 5f 45 76 61 6c 4f 62 6a 76 28 29 20 63 6f  cl_EvalObjv() co
3230: 6e 73 69 73 74 73 20 6f 66 20 61 0a 2a 2a 20 63  nsists of a.** c
3240: 6f 6d 6d 61 6e 64 20 6e 61 6d 65 20 66 6f 6c 6c  ommand name foll
3250: 6f 77 65 64 20 62 79 20 7a 65 72 6f 20 6f 72 20  owed by zero or 
3260: 6d 6f 72 65 20 61 72 67 75 6d 65 6e 74 73 20 77  more arguments w
3270: 69 74 68 20 6e 6f 20 5b 2e 2e 2e 5d 20 6f 72 20  ith no [...] or 
3280: 24 0a 2a 2a 20 6f 72 20 7b 2e 2e 2e 7d 20 6f 72  $.** or {...} or
3290: 20 3b 20 74 6f 20 62 65 20 73 65 65 6e 20 61 6e   ; to be seen an
32a0: 79 77 68 65 72 65 2e 20 20 4d 6f 73 74 20 63 61  ywhere.  Most ca
32b0: 6c 6c 62 61 63 6b 20 73 63 72 69 70 74 73 20 63  llback scripts c
32c0: 6f 6e 73 69 73 74 0a 2a 2a 20 6f 66 20 6a 75 73  onsist.** of jus
32d0: 74 20 61 20 73 69 6e 67 6c 65 20 70 72 6f 63 65  t a single proce
32e0: 64 75 72 65 20 6e 61 6d 65 20 61 6e 64 20 74 68  dure name and th
32f0: 65 79 20 6d 65 65 74 20 74 68 69 73 20 72 65 71  ey meet this req
3300: 75 69 72 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61  uirement..*/.sta
3310: 74 69 63 20 69 6e 74 20 73 61 66 65 54 6f 55 73  tic int safeToUs
3320: 65 45 76 61 6c 4f 62 6a 76 28 54 63 6c 5f 49 6e  eEvalObjv(Tcl_In
3330: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 54 63  terp *interp, Tc
3340: 6c 5f 4f 62 6a 20 2a 70 43 6d 64 29 7b 0a 20 20  l_Obj *pCmd){.  
3350: 2f 2a 20 57 65 20 63 6f 75 6c 64 20 74 72 79 20  /* We could try 
3360: 74 6f 20 64 6f 20 73 6f 6d 65 74 68 69 6e 67 20  to do something 
3370: 77 69 74 68 20 54 63 6c 5f 50 61 72 73 65 28 29  with Tcl_Parse()
3380: 2e 20 20 42 75 74 20 77 65 20 77 69 6c 6c 20 69  .  But we will i
3390: 6e 73 74 65 61 64 0a 20 20 2a 2a 20 6a 75 73 74  nstead.  ** just
33a0: 20 64 6f 20 61 20 73 65 61 72 63 68 20 66 6f 72   do a search for
33b0: 20 66 6f 72 62 69 64 64 65 6e 20 63 68 61 72 61   forbidden chara
33c0: 63 74 65 72 73 2e 20 20 49 66 20 61 6e 79 20 6f  cters.  If any o
33d0: 66 20 74 68 65 20 66 6f 72 62 69 64 64 65 6e 0a  f the forbidden.
33e0: 20 20 2a 2a 20 63 68 61 72 61 63 74 65 72 73 20    ** characters 
33f0: 61 70 70 65 61 72 20 69 6e 20 70 43 6d 64 2c 20  appear in pCmd, 
3400: 77 65 20 77 69 6c 6c 20 72 65 70 6f 72 74 20 74  we will report t
3410: 68 65 20 73 74 72 69 6e 67 20 61 73 20 75 6e 73  he string as uns
3420: 61 66 65 2e 0a 20 20 2a 2f 0a 20 20 63 6f 6e 73  afe..  */.  cons
3430: 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 6e 74  t char *z;.  int
3440: 20 6e 3b 0a 20 20 7a 20 3d 20 54 63 6c 5f 47 65   n;.  z = Tcl_Ge
3450: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 70  tStringFromObj(p
3460: 43 6d 64 2c 20 26 6e 29 3b 0a 20 20 77 68 69 6c  Cmd, &n);.  whil
3470: 65 28 20 6e 2d 2d 20 3e 20 30 20 29 7b 0a 20 20  e( n-- > 0 ){.  
3480: 20 20 69 6e 74 20 63 20 3d 20 2a 28 7a 2b 2b 29    int c = *(z++)
3490: 3b 0a 20 20 20 20 69 66 28 20 63 3d 3d 27 24 27  ;.    if( c=='$'
34a0: 20 7c 7c 20 63 3d 3d 27 5b 27 20 7c 7c 20 63 3d   || c=='[' || c=
34b0: 3d 27 3b 27 20 29 20 72 65 74 75 72 6e 20 30 3b  =';' ) return 0;
34c0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b  .  }.  return 1;
34d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61  .}../*.** Find a
34e0: 6e 20 53 71 6c 46 75 6e 63 20 73 74 72 75 63 74  n SqlFunc struct
34f0: 75 72 65 20 77 69 74 68 20 74 68 65 20 67 69 76  ure with the giv
3500: 65 6e 20 6e 61 6d 65 2e 20 20 4f 72 20 63 72 65  en name.  Or cre
3510: 61 74 65 20 61 20 6e 65 77 0a 2a 2a 20 6f 6e 65  ate a new.** one
3520: 20 69 66 20 61 6e 20 65 78 69 73 74 69 6e 67 20   if an existing 
3530: 6f 6e 65 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f  one cannot be fo
3540: 75 6e 64 2e 20 20 52 65 74 75 72 6e 20 61 20 70  und.  Return a p
3550: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 0a 2a 2a  ointer to the.**
3560: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73   structure..*/.s
3570: 74 61 74 69 63 20 53 71 6c 46 75 6e 63 20 2a 66  tatic SqlFunc *f
3580: 69 6e 64 53 71 6c 46 75 6e 63 28 53 71 6c 69 74  indSqlFunc(Sqlit
3590: 65 44 62 20 2a 70 44 62 2c 20 63 6f 6e 73 74 20  eDb *pDb, const 
35a0: 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20  char *zName){.  
35b0: 53 71 6c 46 75 6e 63 20 2a 70 2c 20 2a 70 4e 65  SqlFunc *p, *pNe
35c0: 77 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 70 4e  w;.  int i;.  pN
35d0: 65 77 20 3d 20 28 53 71 6c 46 75 6e 63 2a 29 54  ew = (SqlFunc*)T
35e0: 63 6c 5f 41 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  cl_Alloc( sizeof
35f0: 28 2a 70 4e 65 77 29 20 2b 20 73 74 72 6c 65 6e  (*pNew) + strlen
3600: 33 30 28 7a 4e 61 6d 65 29 20 2b 20 31 20 29 3b  30(zName) + 1 );
3610: 0a 20 20 70 4e 65 77 2d 3e 7a 4e 61 6d 65 20 3d  .  pNew->zName =
3620: 20 28 63 68 61 72 2a 29 26 70 4e 65 77 5b 31 5d   (char*)&pNew[1]
3630: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 7a 4e 61  ;.  for(i=0; zNa
3640: 6d 65 5b 69 5d 3b 20 69 2b 2b 29 7b 20 70 4e 65  me[i]; i++){ pNe
3650: 77 2d 3e 7a 4e 61 6d 65 5b 69 5d 20 3d 20 74 6f  w->zName[i] = to
3660: 6c 6f 77 65 72 28 7a 4e 61 6d 65 5b 69 5d 29 3b  lower(zName[i]);
3670: 20 7d 0a 20 20 70 4e 65 77 2d 3e 7a 4e 61 6d 65   }.  pNew->zName
3680: 5b 69 5d 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70  [i] = 0;.  for(p
3690: 3d 70 44 62 2d 3e 70 46 75 6e 63 3b 20 70 3b 20  =pDb->pFunc; p; 
36a0: 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 20 0a 20 20  p=p->pNext){ .  
36b0: 20 20 69 66 28 20 73 74 72 63 6d 70 28 70 2d 3e    if( strcmp(p->
36c0: 7a 4e 61 6d 65 2c 20 70 4e 65 77 2d 3e 7a 4e 61  zName, pNew->zNa
36d0: 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)==0 ){.      
36e0: 54 63 6c 5f 46 72 65 65 28 28 63 68 61 72 2a 29  Tcl_Free((char*)
36f0: 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 72 65 74  pNew);.      ret
3700: 75 72 6e 20 70 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn p;.    }.  }
3710: 0a 20 20 70 4e 65 77 2d 3e 69 6e 74 65 72 70 20  .  pNew->interp 
3720: 3d 20 70 44 62 2d 3e 69 6e 74 65 72 70 3b 0a 20  = pDb->interp;. 
3730: 20 70 4e 65 77 2d 3e 70 53 63 72 69 70 74 20 3d   pNew->pScript =
3740: 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4e 65 78   0;.  pNew->pNex
3750: 74 20 3d 20 70 44 62 2d 3e 70 46 75 6e 63 3b 0a  t = pDb->pFunc;.
3760: 20 20 70 44 62 2d 3e 70 46 75 6e 63 20 3d 20 70    pDb->pFunc = p
3770: 4e 65 77 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e  New;.  return pN
3780: 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65  ew;.}../*.** Fre
3790: 65 20 61 20 73 69 6e 67 6c 65 20 53 71 6c 50 72  e a single SqlPr
37a0: 65 70 61 72 65 64 53 74 6d 74 20 6f 62 6a 65 63  eparedStmt objec
37b0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
37c0: 64 20 64 62 46 72 65 65 53 74 6d 74 28 53 71 6c  d dbFreeStmt(Sql
37d0: 50 72 65 70 61 72 65 64 53 74 6d 74 20 2a 70 53  PreparedStmt *pS
37e0: 74 6d 74 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  tmt){.#ifdef SQL
37f0: 49 54 45 5f 54 45 53 54 0a 20 20 69 66 28 20 73  ITE_TEST.  if( s
3800: 71 6c 69 74 65 33 5f 73 71 6c 28 70 53 74 6d 74  qlite3_sql(pStmt
3810: 2d 3e 70 53 74 6d 74 29 3d 3d 30 20 29 7b 0a 20  ->pStmt)==0 ){. 
3820: 20 20 20 54 63 6c 5f 46 72 65 65 28 28 63 68 61     Tcl_Free((cha
3830: 72 20 2a 29 70 53 74 6d 74 2d 3e 7a 53 71 6c 29  r *)pStmt->zSql)
3840: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73  ;.  }.#endif.  s
3850: 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
3860: 70 53 74 6d 74 2d 3e 70 53 74 6d 74 29 3b 0a 20  pStmt->pStmt);. 
3870: 20 54 63 6c 5f 46 72 65 65 28 28 63 68 61 72 20   Tcl_Free((char 
3880: 2a 29 70 53 74 6d 74 29 3b 0a 7d 0a 0a 2f 2a 0a  *)pStmt);.}../*.
3890: 2a 2a 20 46 69 6e 61 6c 69 7a 65 20 61 6e 64 20  ** Finalize and 
38a0: 66 72 65 65 20 61 20 6c 69 73 74 20 6f 66 20 70  free a list of p
38b0: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
38c0: 74 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ts.*/.static voi
38d0: 64 20 66 6c 75 73 68 53 74 6d 74 43 61 63 68 65  d flushStmtCache
38e0: 28 53 71 6c 69 74 65 44 62 20 2a 70 44 62 29 7b  (SqliteDb *pDb){
38f0: 0a 20 20 53 71 6c 50 72 65 70 61 72 65 64 53 74  .  SqlPreparedSt
3900: 6d 74 20 2a 70 50 72 65 53 74 6d 74 3b 0a 20 20  mt *pPreStmt;.  
3910: 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74 20  SqlPreparedStmt 
3920: 2a 70 4e 65 78 74 3b 0a 0a 20 20 66 6f 72 28 70  *pNext;..  for(p
3930: 50 72 65 53 74 6d 74 20 3d 20 70 44 62 2d 3e 73  PreStmt = pDb->s
3940: 74 6d 74 4c 69 73 74 3b 20 70 50 72 65 53 74 6d  tmtList; pPreStm
3950: 74 3b 20 70 50 72 65 53 74 6d 74 3d 70 4e 65 78  t; pPreStmt=pNex
3960: 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20  t){.    pNext = 
3970: 70 50 72 65 53 74 6d 74 2d 3e 70 4e 65 78 74 3b  pPreStmt->pNext;
3980: 0a 20 20 20 20 64 62 46 72 65 65 53 74 6d 74 28  .    dbFreeStmt(
3990: 70 50 72 65 53 74 6d 74 29 3b 0a 20 20 7d 0a 20  pPreStmt);.  }. 
39a0: 20 70 44 62 2d 3e 6e 53 74 6d 74 20 3d 20 30 3b   pDb->nStmt = 0;
39b0: 0a 20 20 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74  .  pDb->stmtLast
39c0: 20 3d 20 30 3b 0a 20 20 70 44 62 2d 3e 73 74 6d   = 0;.  pDb->stm
39d0: 74 4c 69 73 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  tList = 0;.}../*
39e0: 0a 2a 2a 20 54 43 4c 20 63 61 6c 6c 73 20 74 68  .** TCL calls th
39f0: 69 73 20 70 72 6f 63 65 64 75 72 65 20 77 68 65  is procedure whe
3a00: 6e 20 61 6e 20 73 71 6c 69 74 65 33 20 64 61 74  n an sqlite3 dat
3a10: 61 62 61 73 65 20 63 6f 6d 6d 61 6e 64 20 69 73  abase command is
3a20: 0a 2a 2a 20 64 65 6c 65 74 65 64 2e 0a 2a 2f 0a  .** deleted..*/.
3a30: 73 74 61 74 69 63 20 76 6f 69 64 20 44 62 44 65  static void DbDe
3a40: 6c 65 74 65 43 6d 64 28 76 6f 69 64 20 2a 64 62  leteCmd(void *db
3a50: 29 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70  ){.  SqliteDb *p
3a60: 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29  Db = (SqliteDb*)
3a70: 64 62 3b 0a 20 20 66 6c 75 73 68 53 74 6d 74 43  db;.  flushStmtC
3a80: 61 63 68 65 28 70 44 62 29 3b 0a 20 20 63 6c 6f  ache(pDb);.  clo
3a90: 73 65 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65  seIncrblobChanne
3aa0: 6c 73 28 70 44 62 29 3b 0a 20 20 73 71 6c 69 74  ls(pDb);.  sqlit
3ab0: 65 33 5f 63 6c 6f 73 65 28 70 44 62 2d 3e 64 62  e3_close(pDb->db
3ac0: 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 44 62 2d  );.  while( pDb-
3ad0: 3e 70 46 75 6e 63 20 29 7b 0a 20 20 20 20 53 71  >pFunc ){.    Sq
3ae0: 6c 46 75 6e 63 20 2a 70 46 75 6e 63 20 3d 20 70  lFunc *pFunc = p
3af0: 44 62 2d 3e 70 46 75 6e 63 3b 0a 20 20 20 20 70  Db->pFunc;.    p
3b00: 44 62 2d 3e 70 46 75 6e 63 20 3d 20 70 46 75 6e  Db->pFunc = pFun
3b10: 63 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 54 63  c->pNext;.    Tc
3b20: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70  l_DecrRefCount(p
3b30: 46 75 6e 63 2d 3e 70 53 63 72 69 70 74 29 3b 0a  Func->pScript);.
3b40: 20 20 20 20 54 63 6c 5f 46 72 65 65 28 28 63 68      Tcl_Free((ch
3b50: 61 72 2a 29 70 46 75 6e 63 29 3b 0a 20 20 7d 0a  ar*)pFunc);.  }.
3b60: 20 20 77 68 69 6c 65 28 20 70 44 62 2d 3e 70 43    while( pDb->pC
3b70: 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 53 71  ollate ){.    Sq
3b80: 6c 43 6f 6c 6c 61 74 65 20 2a 70 43 6f 6c 6c 61  lCollate *pColla
3b90: 74 65 20 3d 20 70 44 62 2d 3e 70 43 6f 6c 6c 61  te = pDb->pColla
3ba0: 74 65 3b 0a 20 20 20 20 70 44 62 2d 3e 70 43 6f  te;.    pDb->pCo
3bb0: 6c 6c 61 74 65 20 3d 20 70 43 6f 6c 6c 61 74 65  llate = pCollate
3bc0: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 54 63 6c  ->pNext;.    Tcl
3bd0: 5f 46 72 65 65 28 28 63 68 61 72 2a 29 70 43 6f  _Free((char*)pCo
3be0: 6c 6c 61 74 65 29 3b 0a 20 20 7d 0a 20 20 69 66  llate);.  }.  if
3bf0: 28 20 70 44 62 2d 3e 7a 42 75 73 79 20 29 7b 0a  ( pDb->zBusy ){.
3c00: 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62      Tcl_Free(pDb
3c10: 2d 3e 7a 42 75 73 79 29 3b 0a 20 20 7d 0a 20 20  ->zBusy);.  }.  
3c20: 69 66 28 20 70 44 62 2d 3e 7a 54 72 61 63 65 20  if( pDb->zTrace 
3c30: 29 7b 0a 20 20 20 20 54 63 6c 5f 46 72 65 65 28  ){.    Tcl_Free(
3c40: 70 44 62 2d 3e 7a 54 72 61 63 65 29 3b 0a 20 20  pDb->zTrace);.  
3c50: 7d 0a 20 20 69 66 28 20 70 44 62 2d 3e 7a 50 72  }.  if( pDb->zPr
3c60: 6f 66 69 6c 65 20 29 7b 0a 20 20 20 20 54 63 6c  ofile ){.    Tcl
3c70: 5f 46 72 65 65 28 70 44 62 2d 3e 7a 50 72 6f 66  _Free(pDb->zProf
3c80: 69 6c 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ile);.  }.  if( 
3c90: 70 44 62 2d 3e 7a 41 75 74 68 20 29 7b 0a 20 20  pDb->zAuth ){.  
3ca0: 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e    Tcl_Free(pDb->
3cb0: 7a 41 75 74 68 29 3b 0a 20 20 7d 0a 20 20 69 66  zAuth);.  }.  if
3cc0: 28 20 70 44 62 2d 3e 7a 4e 75 6c 6c 20 29 7b 0a  ( pDb->zNull ){.
3cd0: 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62      Tcl_Free(pDb
3ce0: 2d 3e 7a 4e 75 6c 6c 29 3b 0a 20 20 7d 0a 20 20  ->zNull);.  }.  
3cf0: 69 66 28 20 70 44 62 2d 3e 70 55 70 64 61 74 65  if( pDb->pUpdate
3d00: 48 6f 6f 6b 20 29 7b 0a 20 20 20 20 54 63 6c 5f  Hook ){.    Tcl_
3d10: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 44 62  DecrRefCount(pDb
3d20: 2d 3e 70 55 70 64 61 74 65 48 6f 6f 6b 29 3b 0a  ->pUpdateHook);.
3d30: 20 20 7d 0a 20 20 69 66 28 20 70 44 62 2d 3e 70    }.  if( pDb->p
3d40: 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 20 29 7b 0a  RollbackHook ){.
3d50: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
3d60: 6f 75 6e 74 28 70 44 62 2d 3e 70 52 6f 6c 6c 62  ount(pDb->pRollb
3d70: 61 63 6b 48 6f 6f 6b 29 3b 0a 20 20 7d 0a 20 20  ackHook);.  }.  
3d80: 69 66 28 20 70 44 62 2d 3e 70 57 61 6c 48 6f 6f  if( pDb->pWalHoo
3d90: 6b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 44 65 63  k ){.    Tcl_Dec
3da0: 72 52 65 66 43 6f 75 6e 74 28 70 44 62 2d 3e 70  rRefCount(pDb->p
3db0: 57 61 6c 48 6f 6f 6b 29 3b 0a 20 20 7d 0a 20 20  WalHook);.  }.  
3dc0: 69 66 28 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74  if( pDb->pCollat
3dd0: 65 4e 65 65 64 65 64 20 29 7b 0a 20 20 20 20 54  eNeeded ){.    T
3de0: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
3df0: 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65 65  pDb->pCollateNee
3e00: 64 65 64 29 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f  ded);.  }.  Tcl_
3e10: 46 72 65 65 28 28 63 68 61 72 2a 29 70 44 62 29  Free((char*)pDb)
3e20: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
3e30: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
3e40: 64 20 77 68 65 6e 20 61 20 64 61 74 61 62 61 73  d when a databas
3e50: 65 20 66 69 6c 65 20 69 73 20 6c 6f 63 6b 65 64  e file is locked
3e60: 20 77 68 69 6c 65 20 74 72 79 69 6e 67 0a 2a 2a   while trying.**
3e70: 20 74 6f 20 65 78 65 63 75 74 65 20 53 51 4c 2e   to execute SQL.
3e80: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 44  .*/.static int D
3e90: 62 42 75 73 79 48 61 6e 64 6c 65 72 28 76 6f 69  bBusyHandler(voi
3ea0: 64 20 2a 63 64 2c 20 69 6e 74 20 6e 54 72 69 65  d *cd, int nTrie
3eb0: 73 29 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a  s){.  SqliteDb *
3ec0: 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62 2a  pDb = (SqliteDb*
3ed0: 29 63 64 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  )cd;.  int rc;. 
3ee0: 20 63 68 61 72 20 7a 56 61 6c 5b 33 30 5d 3b 0a   char zVal[30];.
3ef0: 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69  .  sqlite3_snpri
3f00: 6e 74 66 28 73 69 7a 65 6f 66 28 7a 56 61 6c 29  ntf(sizeof(zVal)
3f10: 2c 20 7a 56 61 6c 2c 20 22 25 64 22 2c 20 6e 54  , zVal, "%d", nT
3f20: 72 69 65 73 29 3b 0a 20 20 72 63 20 3d 20 54 63  ries);.  rc = Tc
3f30: 6c 5f 56 61 72 45 76 61 6c 28 70 44 62 2d 3e 69  l_VarEval(pDb->i
3f40: 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a 42 75 73  nterp, pDb->zBus
3f50: 79 2c 20 22 20 22 2c 20 7a 56 61 6c 2c 20 28 63  y, " ", zVal, (c
3f60: 68 61 72 2a 29 30 29 3b 0a 20 20 69 66 28 20 72  har*)0);.  if( r
3f70: 63 21 3d 54 43 4c 5f 4f 4b 20 7c 7c 20 61 74 6f  c!=TCL_OK || ato
3f80: 69 28 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52  i(Tcl_GetStringR
3f90: 65 73 75 6c 74 28 70 44 62 2d 3e 69 6e 74 65 72  esult(pDb->inter
3fa0: 70 29 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  p)) ){.    retur
3fb0: 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 0;.  }.  retur
3fc0: 6e 20 31 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  n 1;.}..#ifndef 
3fd0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 52 4f 47  SQLITE_OMIT_PROG
3fe0: 52 45 53 53 5f 43 41 4c 4c 42 41 43 4b 0a 2f 2a  RESS_CALLBACK./*
3ff0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
4000: 20 69 73 20 69 6e 76 6f 6b 65 64 20 61 73 20 74   is invoked as t
4010: 68 65 20 27 70 72 6f 67 72 65 73 73 20 63 61 6c  he 'progress cal
4020: 6c 62 61 63 6b 27 20 66 6f 72 20 74 68 65 20 64  lback' for the d
4030: 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74  atabase..*/.stat
4040: 69 63 20 69 6e 74 20 44 62 50 72 6f 67 72 65 73  ic int DbProgres
4050: 73 48 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a 63  sHandler(void *c
4060: 64 29 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a  d){.  SqliteDb *
4070: 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62 2a  pDb = (SqliteDb*
4080: 29 63 64 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  )cd;.  int rc;..
4090: 20 20 61 73 73 65 72 74 28 20 70 44 62 2d 3e 7a    assert( pDb->z
40a0: 50 72 6f 67 72 65 73 73 20 29 3b 0a 20 20 72 63  Progress );.  rc
40b0: 20 3d 20 54 63 6c 5f 45 76 61 6c 28 70 44 62 2d   = Tcl_Eval(pDb-
40c0: 3e 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a 50  >interp, pDb->zP
40d0: 72 6f 67 72 65 73 73 29 3b 0a 20 20 69 66 28 20  rogress);.  if( 
40e0: 72 63 21 3d 54 43 4c 5f 4f 4b 20 7c 7c 20 61 74  rc!=TCL_OK || at
40f0: 6f 69 28 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  oi(Tcl_GetString
4100: 52 65 73 75 6c 74 28 70 44 62 2d 3e 69 6e 74 65  Result(pDb->inte
4110: 72 70 29 29 20 29 7b 0a 20 20 20 20 72 65 74 75  rp)) ){.    retu
4120: 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 1;.  }.  retu
4130: 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  rn 0;.}.#endif..
4140: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
4150: 4d 49 54 5f 54 52 41 43 45 0a 2f 2a 0a 2a 2a 20  MIT_TRACE./*.** 
4160: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
4170: 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 53 51  called by the SQ
4180: 4c 69 74 65 20 74 72 61 63 65 20 68 61 6e 64 6c  Lite trace handl
4190: 65 72 20 77 68 65 6e 65 76 65 72 20 61 20 6e 65  er whenever a ne
41a0: 77 0a 2a 2a 20 62 6c 6f 63 6b 20 6f 66 20 53 51  w.** block of SQ
41b0: 4c 20 69 73 20 65 78 65 63 75 74 65 64 2e 20 20  L is executed.  
41c0: 54 68 65 20 54 43 4c 20 73 63 72 69 70 74 20 69  The TCL script i
41d0: 6e 20 70 44 62 2d 3e 7a 54 72 61 63 65 20 69 73  n pDb->zTrace is
41e0: 20 65 78 65 63 75 74 65 64 2e 0a 2a 2f 0a 73 74   executed..*/.st
41f0: 61 74 69 63 20 76 6f 69 64 20 44 62 54 72 61 63  atic void DbTrac
4200: 65 48 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a 63  eHandler(void *c
4210: 64 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  d, const char *z
4220: 53 71 6c 29 7b 0a 20 20 53 71 6c 69 74 65 44 62  Sql){.  SqliteDb
4230: 20 2a 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44   *pDb = (SqliteD
4240: 62 2a 29 63 64 3b 0a 20 20 54 63 6c 5f 44 53 74  b*)cd;.  Tcl_DSt
4250: 72 69 6e 67 20 73 74 72 3b 0a 0a 20 20 54 63 6c  ring str;..  Tcl
4260: 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 73 74  _DStringInit(&st
4270: 72 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e  r);.  Tcl_DStrin
4280: 67 41 70 70 65 6e 64 28 26 73 74 72 2c 20 70 44  gAppend(&str, pD
4290: 62 2d 3e 7a 54 72 61 63 65 2c 20 2d 31 29 3b 0a  b->zTrace, -1);.
42a0: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70    Tcl_DStringApp
42b0: 65 6e 64 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c  endElement(&str,
42c0: 20 7a 53 71 6c 29 3b 0a 20 20 54 63 6c 5f 45 76   zSql);.  Tcl_Ev
42d0: 61 6c 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20  al(pDb->interp, 
42e0: 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65  Tcl_DStringValue
42f0: 28 26 73 74 72 29 29 3b 0a 20 20 54 63 6c 5f 44  (&str));.  Tcl_D
4300: 53 74 72 69 6e 67 46 72 65 65 28 26 73 74 72 29  StringFree(&str)
4310: 3b 0a 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73  ;.  Tcl_ResetRes
4320: 75 6c 74 28 70 44 62 2d 3e 69 6e 74 65 72 70 29  ult(pDb->interp)
4330: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  ;.}.#endif..#ifn
4340: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
4350: 54 52 41 43 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73  TRACE./*.** This
4360: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
4370: 65 64 20 62 79 20 74 68 65 20 53 51 4c 69 74 65  ed by the SQLite
4380: 20 70 72 6f 66 69 6c 65 20 68 61 6e 64 6c 65 72   profile handler
4390: 20 61 66 74 65 72 20 61 20 73 74 61 74 65 6d 65   after a stateme
43a0: 6e 74 0a 2a 2a 20 53 51 4c 20 68 61 73 20 65 78  nt.** SQL has ex
43b0: 65 63 75 74 65 64 2e 20 20 54 68 65 20 54 43 4c  ecuted.  The TCL
43c0: 20 73 63 72 69 70 74 20 69 6e 20 70 44 62 2d 3e   script in pDb->
43d0: 7a 50 72 6f 66 69 6c 65 20 69 73 20 65 76 61 6c  zProfile is eval
43e0: 75 61 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  uated..*/.static
43f0: 20 76 6f 69 64 20 44 62 50 72 6f 66 69 6c 65 48   void DbProfileH
4400: 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a 63 64 2c  andler(void *cd,
4410: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71   const char *zSq
4420: 6c 2c 20 73 71 6c 69 74 65 5f 75 69 6e 74 36 34  l, sqlite_uint64
4430: 20 74 6d 29 7b 0a 20 20 53 71 6c 69 74 65 44 62   tm){.  SqliteDb
4440: 20 2a 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44   *pDb = (SqliteD
4450: 62 2a 29 63 64 3b 0a 20 20 54 63 6c 5f 44 53 74  b*)cd;.  Tcl_DSt
4460: 72 69 6e 67 20 73 74 72 3b 0a 20 20 63 68 61 72  ring str;.  char
4470: 20 7a 54 6d 5b 31 30 30 5d 3b 0a 0a 20 20 73 71   zTm[100];..  sq
4480: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
4490: 69 7a 65 6f 66 28 7a 54 6d 29 2d 31 2c 20 7a 54  izeof(zTm)-1, zT
44a0: 6d 2c 20 22 25 6c 6c 64 22 2c 20 74 6d 29 3b 0a  m, "%lld", tm);.
44b0: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69    Tcl_DStringIni
44c0: 74 28 26 73 74 72 29 3b 0a 20 20 54 63 6c 5f 44  t(&str);.  Tcl_D
44d0: 53 74 72 69 6e 67 41 70 70 65 6e 64 28 26 73 74  StringAppend(&st
44e0: 72 2c 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65  r, pDb->zProfile
44f0: 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 44 53 74  , -1);.  Tcl_DSt
4500: 72 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e  ringAppendElemen
4510: 74 28 26 73 74 72 2c 20 7a 53 71 6c 29 3b 0a 20  t(&str, zSql);. 
4520: 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65   Tcl_DStringAppe
4530: 6e 64 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c 20  ndElement(&str, 
4540: 7a 54 6d 29 3b 0a 20 20 54 63 6c 5f 45 76 61 6c  zTm);.  Tcl_Eval
4550: 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20 54 63  (pDb->interp, Tc
4560: 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26  l_DStringValue(&
4570: 73 74 72 29 29 3b 0a 20 20 54 63 6c 5f 44 53 74  str));.  Tcl_DSt
4580: 72 69 6e 67 46 72 65 65 28 26 73 74 72 29 3b 0a  ringFree(&str);.
4590: 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c    Tcl_ResetResul
45a0: 74 28 70 44 62 2d 3e 69 6e 74 65 72 70 29 3b 0a  t(pDb->interp);.
45b0: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
45c0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
45d0: 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 74 72  called when a tr
45e0: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d  ansaction is com
45f0: 6d 69 74 74 65 64 2e 20 20 54 68 65 0a 2a 2a 20  mitted.  The.** 
4600: 54 43 4c 20 73 63 72 69 70 74 20 69 6e 20 70 44  TCL script in pD
4610: 62 2d 3e 7a 43 6f 6d 6d 69 74 20 69 73 20 65 78  b->zCommit is ex
4620: 65 63 75 74 65 64 2e 20 20 49 66 20 69 74 20 72  ecuted.  If it r
4630: 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 20  eturns non-zero 
4640: 6f 72 0a 2a 2a 20 69 66 20 69 74 20 74 68 72 6f  or.** if it thro
4650: 77 73 20 61 6e 20 65 78 63 65 70 74 69 6f 6e 2c  ws an exception,
4660: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
4670: 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20   is rolled back 
4680: 69 6e 73 74 65 61 64 0a 2a 2a 20 6f 66 20 62 65  instead.** of be
4690: 69 6e 67 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a  ing committed..*
46a0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 44 62 43  /.static int DbC
46b0: 6f 6d 6d 69 74 48 61 6e 64 6c 65 72 28 76 6f 69  ommitHandler(voi
46c0: 64 20 2a 63 64 29 7b 0a 20 20 53 71 6c 69 74 65  d *cd){.  Sqlite
46d0: 44 62 20 2a 70 44 62 20 3d 20 28 53 71 6c 69 74  Db *pDb = (Sqlit
46e0: 65 44 62 2a 29 63 64 3b 0a 20 20 69 6e 74 20 72  eDb*)cd;.  int r
46f0: 63 3b 0a 0a 20 20 72 63 20 3d 20 54 63 6c 5f 45  c;..  rc = Tcl_E
4700: 76 61 6c 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c  val(pDb->interp,
4710: 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 29 3b 0a   pDb->zCommit);.
4720: 20 20 69 66 28 20 72 63 21 3d 54 43 4c 5f 4f 4b    if( rc!=TCL_OK
4730: 20 7c 7c 20 61 74 6f 69 28 54 63 6c 5f 47 65 74   || atoi(Tcl_Get
4740: 53 74 72 69 6e 67 52 65 73 75 6c 74 28 70 44 62  StringResult(pDb
4750: 2d 3e 69 6e 74 65 72 70 29 29 20 29 7b 0a 20 20  ->interp)) ){.  
4760: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
4770: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 73    return 0;.}..s
4780: 74 61 74 69 63 20 76 6f 69 64 20 44 62 52 6f 6c  tatic void DbRol
4790: 6c 62 61 63 6b 48 61 6e 64 6c 65 72 28 76 6f 69  lbackHandler(voi
47a0: 64 20 2a 63 6c 69 65 6e 74 44 61 74 61 29 7b 0a  d *clientData){.
47b0: 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20    SqliteDb *pDb 
47c0: 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 63 6c 69  = (SqliteDb*)cli
47d0: 65 6e 74 44 61 74 61 3b 0a 20 20 61 73 73 65 72  entData;.  asser
47e0: 74 28 70 44 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b  t(pDb->pRollback
47f0: 48 6f 6f 6b 29 3b 0a 20 20 69 66 28 20 54 43 4c  Hook);.  if( TCL
4800: 5f 4f 4b 21 3d 54 63 6c 5f 45 76 61 6c 4f 62 6a  _OK!=Tcl_EvalObj
4810: 45 78 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20  Ex(pDb->interp, 
4820: 70 44 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 48 6f  pDb->pRollbackHo
4830: 6f 6b 2c 20 30 29 20 29 7b 0a 20 20 20 20 54 63  ok, 0) ){.    Tc
4840: 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f  l_BackgroundErro
4850: 72 28 70 44 62 2d 3e 69 6e 74 65 72 70 29 3b 0a  r(pDb->interp);.
4860: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
4870: 73 20 70 72 6f 63 65 64 75 72 65 20 68 61 6e 64  s procedure hand
4880: 6c 65 73 20 77 61 6c 5f 68 6f 6f 6b 20 63 61 6c  les wal_hook cal
4890: 6c 62 61 63 6b 73 2e 0a 2a 2f 0a 73 74 61 74 69  lbacks..*/.stati
48a0: 63 20 69 6e 74 20 44 62 57 61 6c 48 61 6e 64 6c  c int DbWalHandl
48b0: 65 72 28 0a 20 20 76 6f 69 64 20 2a 63 6c 69 65  er(.  void *clie
48c0: 6e 74 44 61 74 61 2c 20 0a 20 20 73 71 6c 69 74  ntData, .  sqlit
48d0: 65 33 20 2a 64 62 2c 20 0a 20 20 63 6f 6e 73 74  e3 *db, .  const
48e0: 20 63 68 61 72 20 2a 7a 44 62 2c 20 0a 20 20 69   char *zDb, .  i
48f0: 6e 74 20 6e 45 6e 74 72 79 0a 29 7b 0a 20 20 69  nt nEntry.){.  i
4900: 6e 74 20 72 65 74 20 3d 20 53 51 4c 49 54 45 5f  nt ret = SQLITE_
4910: 4f 4b 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  OK;.  Tcl_Obj *p
4920: 3b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44  ;.  SqliteDb *pD
4930: 62 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 63  b = (SqliteDb*)c
4940: 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20 54 63 6c  lientData;.  Tcl
4950: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 20  _Interp *interp 
4960: 3d 20 70 44 62 2d 3e 69 6e 74 65 72 70 3b 0a 20  = pDb->interp;. 
4970: 20 61 73 73 65 72 74 28 70 44 62 2d 3e 70 57 61   assert(pDb->pWa
4980: 6c 48 6f 6f 6b 29 3b 0a 0a 20 20 70 20 3d 20 54  lHook);..  p = T
4990: 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28  cl_DuplicateObj(
49a0: 70 44 62 2d 3e 70 57 61 6c 48 6f 6f 6b 29 3b 0a  pDb->pWalHook);.
49b0: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
49c0: 6e 74 28 70 29 3b 0a 20 20 54 63 6c 5f 4c 69 73  nt(p);.  Tcl_Lis
49d0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
49e0: 74 28 69 6e 74 65 72 70 2c 20 70 2c 20 54 63 6c  t(interp, p, Tcl
49f0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 44  _NewStringObj(zD
4a00: 62 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c  b, -1));.  Tcl_L
4a10: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
4a20: 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 2c 20 54  ent(interp, p, T
4a30: 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 6e 45 6e  cl_NewIntObj(nEn
4a40: 74 72 79 29 29 3b 0a 20 20 69 66 28 20 54 43 4c  try));.  if( TCL
4a50: 5f 4f 4b 21 3d 54 63 6c 5f 45 76 61 6c 4f 62 6a  _OK!=Tcl_EvalObj
4a60: 45 78 28 69 6e 74 65 72 70 2c 20 70 2c 20 30 29  Ex(interp, p, 0)
4a70: 20 0a 20 20 20 7c 7c 20 54 43 4c 5f 4f 4b 21 3d   .   || TCL_OK!=
4a80: 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
4a90: 6a 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  j(interp, Tcl_Ge
4aa0: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
4ab0: 70 29 2c 20 26 72 65 74 29 0a 20 20 29 7b 0a 20  p), &ret).  ){. 
4ac0: 20 20 20 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e     Tcl_Backgroun
4ad0: 64 45 72 72 6f 72 28 69 6e 74 65 72 70 29 3b 0a  dError(interp);.
4ae0: 20 20 7d 0a 20 20 54 63 6c 5f 44 65 63 72 52 65    }.  Tcl_DecrRe
4af0: 66 43 6f 75 6e 74 28 70 29 3b 0a 0a 20 20 72 65  fCount(p);..  re
4b00: 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 23 69 66  turn ret;.}..#if
4b10: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
4b20: 54 45 53 54 29 20 26 26 20 64 65 66 69 6e 65 64  TEST) && defined
4b30: 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 55  (SQLITE_ENABLE_U
4b40: 4e 4c 4f 43 4b 5f 4e 4f 54 49 46 59 29 0a 73 74  NLOCK_NOTIFY).st
4b50: 61 74 69 63 20 76 6f 69 64 20 73 65 74 54 65 73  atic void setTes
4b60: 74 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 56 61 72  tUnlockNotifyVar
4b70: 73 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  s(Tcl_Interp *in
4b80: 74 65 72 70 2c 20 69 6e 74 20 69 41 72 67 2c 20  terp, int iArg, 
4b90: 69 6e 74 20 6e 41 72 67 29 7b 0a 20 20 63 68 61  int nArg){.  cha
4ba0: 72 20 7a 42 75 66 5b 36 34 5d 3b 0a 20 20 73 70  r zBuf[64];.  sp
4bb0: 72 69 6e 74 66 28 7a 42 75 66 2c 20 22 25 64 22  rintf(zBuf, "%d"
4bc0: 2c 20 69 41 72 67 29 3b 0a 20 20 54 63 6c 5f 53  , iArg);.  Tcl_S
4bd0: 65 74 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73  etVar(interp, "s
4be0: 71 6c 69 74 65 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74  qlite_unlock_not
4bf0: 69 66 79 5f 61 72 67 22 2c 20 7a 42 75 66 2c 20  ify_arg", zBuf, 
4c00: 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29  TCL_GLOBAL_ONLY)
4c10: 3b 0a 20 20 73 70 72 69 6e 74 66 28 7a 42 75 66  ;.  sprintf(zBuf
4c20: 2c 20 22 25 64 22 2c 20 6e 41 72 67 29 3b 0a 20  , "%d", nArg);. 
4c30: 20 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65   Tcl_SetVar(inte
4c40: 72 70 2c 20 22 73 71 6c 69 74 65 5f 75 6e 6c 6f  rp, "sqlite_unlo
4c50: 63 6b 5f 6e 6f 74 69 66 79 5f 61 72 67 63 6f 75  ck_notify_argcou
4c60: 6e 74 22 2c 20 7a 42 75 66 2c 20 54 43 4c 5f 47  nt", zBuf, TCL_G
4c70: 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 7d 0a 23  LOBAL_ONLY);.}.#
4c80: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 73 65  else.# define se
4c90: 74 54 65 73 74 55 6e 6c 6f 63 6b 4e 6f 74 69 66  tTestUnlockNotif
4ca0: 79 56 61 72 73 28 78 2c 79 2c 7a 29 0a 23 65 6e  yVars(x,y,z).#en
4cb0: 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
4cc0: 54 45 5f 45 4e 41 42 4c 45 5f 55 4e 4c 4f 43 4b  TE_ENABLE_UNLOCK
4cd0: 5f 4e 4f 54 49 46 59 0a 73 74 61 74 69 63 20 76  _NOTIFY.static v
4ce0: 6f 69 64 20 44 62 55 6e 6c 6f 63 6b 4e 6f 74 69  oid DbUnlockNoti
4cf0: 66 79 28 76 6f 69 64 20 2a 2a 61 70 41 72 67 2c  fy(void **apArg,
4d00: 20 69 6e 74 20 6e 41 72 67 29 7b 0a 20 20 69 6e   int nArg){.  in
4d10: 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
4d20: 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20  i<nArg; i++){.  
4d30: 20 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67    const int flag
4d40: 73 20 3d 20 28 54 43 4c 5f 45 56 41 4c 5f 47 4c  s = (TCL_EVAL_GL
4d50: 4f 42 41 4c 7c 54 43 4c 5f 45 56 41 4c 5f 44 49  OBAL|TCL_EVAL_DI
4d60: 52 45 43 54 29 3b 0a 20 20 20 20 53 71 6c 69 74  RECT);.    Sqlit
4d70: 65 44 62 20 2a 70 44 62 20 3d 20 28 53 71 6c 69  eDb *pDb = (Sqli
4d80: 74 65 44 62 20 2a 29 61 70 41 72 67 5b 69 5d 3b  teDb *)apArg[i];
4d90: 0a 20 20 20 20 73 65 74 54 65 73 74 55 6e 6c 6f  .    setTestUnlo
4da0: 63 6b 4e 6f 74 69 66 79 56 61 72 73 28 70 44 62  ckNotifyVars(pDb
4db0: 2d 3e 69 6e 74 65 72 70 2c 20 69 2c 20 6e 41 72  ->interp, i, nAr
4dc0: 67 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  g);.    assert( 
4dd0: 70 44 62 2d 3e 70 55 6e 6c 6f 63 6b 4e 6f 74 69  pDb->pUnlockNoti
4de0: 66 79 29 3b 0a 20 20 20 20 54 63 6c 5f 45 76 61  fy);.    Tcl_Eva
4df0: 6c 4f 62 6a 45 78 28 70 44 62 2d 3e 69 6e 74 65  lObjEx(pDb->inte
4e00: 72 70 2c 20 70 44 62 2d 3e 70 55 6e 6c 6f 63 6b  rp, pDb->pUnlock
4e10: 4e 6f 74 69 66 79 2c 20 66 6c 61 67 73 29 3b 0a  Notify, flags);.
4e20: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
4e30: 6f 75 6e 74 28 70 44 62 2d 3e 70 55 6e 6c 6f 63  ount(pDb->pUnloc
4e40: 6b 4e 6f 74 69 66 79 29 3b 0a 20 20 20 20 70 44  kNotify);.    pD
4e50: 62 2d 3e 70 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79  b->pUnlockNotify
4e60: 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64   = 0;.  }.}.#end
4e70: 69 66 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  if..static void 
4e80: 44 62 55 70 64 61 74 65 48 61 6e 64 6c 65 72 28  DbUpdateHandler(
4e90: 0a 20 20 76 6f 69 64 20 2a 70 2c 20 0a 20 20 69  .  void *p, .  i
4ea0: 6e 74 20 6f 70 2c 0a 20 20 63 6f 6e 73 74 20 63  nt op,.  const c
4eb0: 68 61 72 20 2a 7a 44 62 2c 20 0a 20 20 63 6f 6e  har *zDb, .  con
4ec0: 73 74 20 63 68 61 72 20 2a 7a 54 62 6c 2c 20 0a  st char *zTbl, .
4ed0: 20 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 72    sqlite_int64 r
4ee0: 6f 77 69 64 0a 29 7b 0a 20 20 53 71 6c 69 74 65  owid.){.  Sqlite
4ef0: 44 62 20 2a 70 44 62 20 3d 20 28 53 71 6c 69 74  Db *pDb = (Sqlit
4f00: 65 44 62 20 2a 29 70 3b 0a 20 20 54 63 6c 5f 4f  eDb *)p;.  Tcl_O
4f10: 62 6a 20 2a 70 43 6d 64 3b 0a 0a 20 20 61 73 73  bj *pCmd;..  ass
4f20: 65 72 74 28 20 70 44 62 2d 3e 70 55 70 64 61 74  ert( pDb->pUpdat
4f30: 65 48 6f 6f 6b 20 29 3b 0a 20 20 61 73 73 65 72  eHook );.  asser
4f40: 74 28 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 49 4e  t( op==SQLITE_IN
4f50: 53 45 52 54 20 7c 7c 20 6f 70 3d 3d 53 51 4c 49  SERT || op==SQLI
4f60: 54 45 5f 55 50 44 41 54 45 20 7c 7c 20 6f 70 3d  TE_UPDATE || op=
4f70: 3d 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 20 29  =SQLITE_DELETE )
4f80: 3b 0a 0a 20 20 70 43 6d 64 20 3d 20 54 63 6c 5f  ;..  pCmd = Tcl_
4f90: 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 70 44 62  DuplicateObj(pDb
4fa0: 2d 3e 70 55 70 64 61 74 65 48 6f 6f 6b 29 3b 0a  ->pUpdateHook);.
4fb0: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
4fc0: 6e 74 28 70 43 6d 64 29 3b 0a 20 20 54 63 6c 5f  nt(pCmd);.  Tcl_
4fd0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
4fe0: 6d 65 6e 74 28 30 2c 20 70 43 6d 64 2c 20 54 63  ment(0, pCmd, Tc
4ff0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 0a  l_NewStringObj(.
5000: 20 20 20 20 28 20 28 6f 70 3d 3d 53 51 4c 49 54      ( (op==SQLIT
5010: 45 5f 49 4e 53 45 52 54 29 3f 22 49 4e 53 45 52  E_INSERT)?"INSER
5020: 54 22 3a 28 6f 70 3d 3d 53 51 4c 49 54 45 5f 55  T":(op==SQLITE_U
5030: 50 44 41 54 45 29 3f 22 55 50 44 41 54 45 22 3a  PDATE)?"UPDATE":
5040: 22 44 45 4c 45 54 45 22 29 2c 20 2d 31 29 29 3b  "DELETE"), -1));
5050: 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  .  Tcl_ListObjAp
5060: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70  pendElement(0, p
5070: 43 6d 64 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Cmd, Tcl_NewStri
5080: 6e 67 4f 62 6a 28 7a 44 62 2c 20 2d 31 29 29 3b  ngObj(zDb, -1));
5090: 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  .  Tcl_ListObjAp
50a0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70  pendElement(0, p
50b0: 43 6d 64 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Cmd, Tcl_NewStri
50c0: 6e 67 4f 62 6a 28 7a 54 62 6c 2c 20 2d 31 29 29  ngObj(zTbl, -1))
50d0: 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  ;.  Tcl_ListObjA
50e0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20  ppendElement(0, 
50f0: 70 43 6d 64 2c 20 54 63 6c 5f 4e 65 77 57 69 64  pCmd, Tcl_NewWid
5100: 65 49 6e 74 4f 62 6a 28 72 6f 77 69 64 29 29 3b  eIntObj(rowid));
5110: 0a 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78  .  Tcl_EvalObjEx
5120: 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20 70 43  (pDb->interp, pC
5130: 6d 64 2c 20 54 43 4c 5f 45 56 41 4c 5f 44 49 52  md, TCL_EVAL_DIR
5140: 45 43 54 29 3b 0a 20 20 54 63 6c 5f 44 65 63 72  ECT);.  Tcl_Decr
5150: 52 65 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a  RefCount(pCmd);.
5160: 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74  }..static void t
5170: 63 6c 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64 28  clCollateNeeded(
5180: 0a 20 20 76 6f 69 64 20 2a 70 43 74 78 2c 0a 20  .  void *pCtx,. 
5190: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20   sqlite3 *db,.  
51a0: 69 6e 74 20 65 6e 63 2c 0a 20 20 63 6f 6e 73 74  int enc,.  const
51b0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 0a 29 7b 0a   char *zName.){.
51c0: 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20    SqliteDb *pDb 
51d0: 3d 20 28 53 71 6c 69 74 65 44 62 20 2a 29 70 43  = (SqliteDb *)pC
51e0: 74 78 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  tx;.  Tcl_Obj *p
51f0: 53 63 72 69 70 74 20 3d 20 54 63 6c 5f 44 75 70  Script = Tcl_Dup
5200: 6c 69 63 61 74 65 4f 62 6a 28 70 44 62 2d 3e 70  licateObj(pDb->p
5210: 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64 29 3b 0a  CollateNeeded);.
5220: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
5230: 6e 74 28 70 53 63 72 69 70 74 29 3b 0a 20 20 54  nt(pScript);.  T
5240: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
5250: 45 6c 65 6d 65 6e 74 28 30 2c 20 70 53 63 72 69  Element(0, pScri
5260: 70 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  pt, Tcl_NewStrin
5270: 67 4f 62 6a 28 7a 4e 61 6d 65 2c 20 2d 31 29 29  gObj(zName, -1))
5280: 3b 0a 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45  ;.  Tcl_EvalObjE
5290: 78 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20 70  x(pDb->interp, p
52a0: 53 63 72 69 70 74 2c 20 30 29 3b 0a 20 20 54 63  Script, 0);.  Tc
52b0: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70  l_DecrRefCount(p
52c0: 53 63 72 69 70 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Script);.}../*.*
52d0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
52e0: 73 20 63 61 6c 6c 65 64 20 74 6f 20 65 76 61 6c  s called to eval
52f0: 75 61 74 65 20 61 6e 20 53 51 4c 20 63 6f 6c 6c  uate an SQL coll
5300: 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 69  ation function i
5310: 6d 70 6c 65 6d 65 6e 74 65 64 0a 2a 2a 20 75 73  mplemented.** us
5320: 69 6e 67 20 54 43 4c 20 73 63 72 69 70 74 2e 0a  ing TCL script..
5330: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 63  */.static int tc
5340: 6c 53 71 6c 43 6f 6c 6c 61 74 65 28 0a 20 20 76  lSqlCollate(.  v
5350: 6f 69 64 20 2a 70 43 74 78 2c 0a 20 20 69 6e 74  oid *pCtx,.  int
5360: 20 6e 41 2c 0a 20 20 63 6f 6e 73 74 20 76 6f 69   nA,.  const voi
5370: 64 20 2a 7a 41 2c 0a 20 20 69 6e 74 20 6e 42 2c  d *zA,.  int nB,
5380: 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a  .  const void *z
5390: 42 0a 29 7b 0a 20 20 53 71 6c 43 6f 6c 6c 61 74  B.){.  SqlCollat
53a0: 65 20 2a 70 20 3d 20 28 53 71 6c 43 6f 6c 6c 61  e *p = (SqlColla
53b0: 74 65 20 2a 29 70 43 74 78 3b 0a 20 20 54 63 6c  te *)pCtx;.  Tcl
53c0: 5f 4f 62 6a 20 2a 70 43 6d 64 3b 0a 0a 20 20 70  _Obj *pCmd;..  p
53d0: 43 6d 64 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72  Cmd = Tcl_NewStr
53e0: 69 6e 67 4f 62 6a 28 70 2d 3e 7a 53 63 72 69 70  ingObj(p->zScrip
53f0: 74 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 49 6e  t, -1);.  Tcl_In
5400: 63 72 52 65 66 43 6f 75 6e 74 28 70 43 6d 64 29  crRefCount(pCmd)
5410: 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  ;.  Tcl_ListObjA
5420: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 70 2d 3e  ppendElement(p->
5430: 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c 20 54 63  interp, pCmd, Tc
5440: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a  l_NewStringObj(z
5450: 41 2c 20 6e 41 29 29 3b 0a 20 20 54 63 6c 5f 4c  A, nA));.  Tcl_L
5460: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
5470: 65 6e 74 28 70 2d 3e 69 6e 74 65 72 70 2c 20 70  ent(p->interp, p
5480: 43 6d 64 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Cmd, Tcl_NewStri
5490: 6e 67 4f 62 6a 28 7a 42 2c 20 6e 42 29 29 3b 0a  ngObj(zB, nB));.
54a0: 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28    Tcl_EvalObjEx(
54b0: 70 2d 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c  p->interp, pCmd,
54c0: 20 54 43 4c 5f 45 56 41 4c 5f 44 49 52 45 43 54   TCL_EVAL_DIRECT
54d0: 29 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66  );.  Tcl_DecrRef
54e0: 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20 72  Count(pCmd);.  r
54f0: 65 74 75 72 6e 20 28 61 74 6f 69 28 54 63 6c 5f  eturn (atoi(Tcl_
5500: 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28  GetStringResult(
5510: 70 2d 3e 69 6e 74 65 72 70 29 29 29 3b 0a 7d 0a  p->interp)));.}.
5520: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
5530: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ine is called to
5540: 20 65 76 61 6c 75 61 74 65 20 61 6e 20 53 51 4c   evaluate an SQL
5550: 20 66 75 6e 63 74 69 6f 6e 20 69 6d 70 6c 65 6d   function implem
5560: 65 6e 74 65 64 0a 2a 2a 20 75 73 69 6e 67 20 54  ented.** using T
5570: 43 4c 20 73 63 72 69 70 74 2e 0a 2a 2f 0a 73 74  CL script..*/.st
5580: 61 74 69 63 20 76 6f 69 64 20 74 63 6c 53 71 6c  atic void tclSql
5590: 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e  Func(sqlite3_con
55a0: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 69  text *context, i
55b0: 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33  nt argc, sqlite3
55c0: 5f 76 61 6c 75 65 2a 2a 61 72 67 76 29 7b 0a 20  _value**argv){. 
55d0: 20 53 71 6c 46 75 6e 63 20 2a 70 20 3d 20 73 71   SqlFunc *p = sq
55e0: 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61 28  lite3_user_data(
55f0: 63 6f 6e 74 65 78 74 29 3b 0a 20 20 54 63 6c 5f  context);.  Tcl_
5600: 4f 62 6a 20 2a 70 43 6d 64 3b 0a 20 20 69 6e 74  Obj *pCmd;.  int
5610: 20 69 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20   i;.  int rc;.. 
5620: 20 69 66 28 20 61 72 67 63 3d 3d 30 20 29 7b 0a   if( argc==0 ){.
5630: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
5640: 61 72 65 20 6e 6f 20 61 72 67 75 6d 65 6e 74 73  are no arguments
5650: 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   to the function
5660: 2c 20 63 61 6c 6c 20 54 63 6c 5f 45 76 61 6c 4f  , call Tcl_EvalO
5670: 62 6a 45 78 20 6f 6e 20 74 68 65 0a 20 20 20 20  bjEx on the.    
5680: 2a 2a 20 73 63 72 69 70 74 20 6f 62 6a 65 63 74  ** script object
5690: 20 64 69 72 65 63 74 6c 79 2e 20 20 54 68 69 73   directly.  This
56a0: 20 61 6c 6c 6f 77 73 20 74 68 65 20 54 43 4c 20   allows the TCL 
56b0: 63 6f 6d 70 69 6c 65 72 20 74 6f 20 67 65 6e 65  compiler to gene
56c0: 72 61 74 65 0a 20 20 20 20 2a 2a 20 62 79 74 65  rate.    ** byte
56d0: 63 6f 64 65 20 66 6f 72 20 74 68 65 20 63 6f 6d  code for the com
56e0: 6d 61 6e 64 20 6f 6e 20 74 68 65 20 66 69 72 73  mand on the firs
56f0: 74 20 69 6e 76 6f 63 61 74 69 6f 6e 20 61 6e 64  t invocation and
5700: 20 74 68 75 73 20 6d 61 6b 65 0a 20 20 20 20 2a   thus make.    *
5710: 2a 20 73 75 62 73 65 71 75 65 6e 74 20 69 6e 76  * subsequent inv
5720: 6f 63 61 74 69 6f 6e 73 20 6d 75 63 68 20 66 61  ocations much fa
5730: 73 74 65 72 2e 20 2a 2f 0a 20 20 20 20 70 43 6d  ster. */.    pCm
5740: 64 20 3d 20 70 2d 3e 70 53 63 72 69 70 74 3b 0a  d = p->pScript;.
5750: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43      Tcl_IncrRefC
5760: 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20 20 20  ount(pCmd);.    
5770: 72 63 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a  rc = Tcl_EvalObj
5780: 45 78 28 70 2d 3e 69 6e 74 65 72 70 2c 20 70 43  Ex(p->interp, pC
5790: 6d 64 2c 20 30 29 3b 0a 20 20 20 20 54 63 6c 5f  md, 0);.    Tcl_
57a0: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 43 6d  DecrRefCount(pCm
57b0: 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  d);.  }else{.   
57c0: 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65   /* If there are
57d0: 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 74 68   arguments to th
57e0: 65 20 66 75 6e 63 74 69 6f 6e 2c 20 6d 61 6b 65  e function, make
57f0: 20 61 20 73 68 61 6c 6c 6f 77 20 63 6f 70 79 20   a shallow copy 
5800: 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 73 63  of the.    ** sc
5810: 72 69 70 74 20 6f 62 6a 65 63 74 2c 20 6c 61 70  ript object, lap
5820: 70 65 6e 64 20 74 68 65 20 61 72 67 75 6d 65 6e  pend the argumen
5830: 74 73 2c 20 74 68 65 6e 20 65 76 61 6c 75 61 74  ts, then evaluat
5840: 65 20 74 68 65 20 63 6f 70 79 2e 0a 20 20 20 20  e the copy..    
5850: 2a 2a 0a 20 20 20 20 2a 2a 20 42 79 20 22 73 68  **.    ** By "sh
5860: 61 6c 6c 6f 77 22 20 63 6f 70 79 2c 20 77 65 20  allow" copy, we 
5870: 6d 65 61 6e 20 61 20 6f 6e 6c 79 20 74 68 65 20  mean a only the 
5880: 6f 75 74 65 72 20 6c 69 73 74 20 54 63 6c 5f 4f  outer list Tcl_O
5890: 62 6a 20 69 73 20 64 75 70 6c 69 63 61 74 65 64  bj is duplicated
58a0: 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 6e 65 77  ..    ** The new
58b0: 20 54 63 6c 5f 4f 62 6a 20 63 6f 6e 74 61 69 6e   Tcl_Obj contain
58c0: 73 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 74 68  s pointers to th
58d0: 65 20 6f 72 69 67 69 6e 61 6c 20 6c 69 73 74 20  e original list 
58e0: 65 6c 65 6d 65 6e 74 73 2e 20 0a 20 20 20 20 2a  elements. .    *
58f0: 2a 20 54 68 61 74 20 77 61 79 2c 20 77 68 65 6e  * That way, when
5900: 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 76 28 29 20   Tcl_EvalObjv() 
5910: 69 73 20 72 75 6e 20 61 6e 64 20 73 68 69 6d 6d  is run and shimm
5920: 65 72 73 20 74 68 65 20 66 69 72 73 74 20 65 6c  ers the first el
5930: 65 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 6f 66 20  ement.    ** of 
5940: 74 68 65 20 6c 69 73 74 20 74 6f 20 74 63 6c 43  the list to tclC
5950: 6d 64 4e 61 6d 65 54 79 70 65 2c 20 74 68 61 74  mdNameType, that
5960: 20 61 6c 74 65 72 6e 61 74 65 20 72 65 70 72 65   alternate repre
5970: 73 65 6e 74 61 74 69 6f 6e 20 77 69 6c 6c 0a 20  sentation will. 
5980: 20 20 20 2a 2a 20 62 65 20 70 72 65 73 65 72 76     ** be preserv
5990: 65 64 20 61 6e 64 20 72 65 75 73 65 64 20 6f 6e  ed and reused on
59a0: 20 74 68 65 20 6e 65 78 74 20 69 6e 76 6f 63 61   the next invoca
59b0: 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tion..    */.   
59c0: 20 54 63 6c 5f 4f 62 6a 20 2a 2a 61 41 72 67 3b   Tcl_Obj **aArg;
59d0: 0a 20 20 20 20 69 6e 74 20 6e 41 72 67 3b 0a 20  .    int nArg;. 
59e0: 20 20 20 69 66 28 20 54 63 6c 5f 4c 69 73 74 4f     if( Tcl_ListO
59f0: 62 6a 47 65 74 45 6c 65 6d 65 6e 74 73 28 70 2d  bjGetElements(p-
5a00: 3e 69 6e 74 65 72 70 2c 20 70 2d 3e 70 53 63 72  >interp, p->pScr
5a10: 69 70 74 2c 20 26 6e 41 72 67 2c 20 26 61 41 72  ipt, &nArg, &aAr
5a20: 67 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  g) ){.      sqli
5a30: 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72  te3_result_error
5a40: 28 63 6f 6e 74 65 78 74 2c 20 54 63 6c 5f 47 65  (context, Tcl_Ge
5a50: 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28 70 2d  tStringResult(p-
5a60: 3e 69 6e 74 65 72 70 29 2c 20 2d 31 29 3b 20 0a  >interp), -1); .
5a70: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
5a80: 20 20 7d 20 20 20 20 20 0a 20 20 20 20 70 43 6d    }     .    pCm
5a90: 64 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f  d = Tcl_NewListO
5aa0: 62 6a 28 6e 41 72 67 2c 20 61 41 72 67 29 3b 0a  bj(nArg, aArg);.
5ab0: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43      Tcl_IncrRefC
5ac0: 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20 20 20  ount(pCmd);.    
5ad0: 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 67 63 3b  for(i=0; i<argc;
5ae0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c   i++){.      sql
5af0: 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 49 6e 20  ite3_value *pIn 
5b00: 3d 20 61 72 67 76 5b 69 5d 3b 0a 20 20 20 20 20  = argv[i];.     
5b10: 20 54 63 6c 5f 4f 62 6a 20 2a 70 56 61 6c 3b 0a   Tcl_Obj *pVal;.
5b20: 20 20 20 20 20 20 20 20 20 20 20 20 0a 20 20 20              .   
5b30: 20 20 20 2f 2a 20 53 65 74 20 70 56 61 6c 20 74     /* Set pVal t
5b40: 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 69 27  o contain the i'
5b50: 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 69  th column of thi
5b60: 73 20 72 6f 77 2e 20 2a 2f 0a 20 20 20 20 20 20  s row. */.      
5b70: 73 77 69 74 63 68 28 20 73 71 6c 69 74 65 33 5f  switch( sqlite3_
5b80: 76 61 6c 75 65 5f 74 79 70 65 28 70 49 6e 29 20  value_type(pIn) 
5b90: 29 7b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  ){.        case 
5ba0: 53 51 4c 49 54 45 5f 42 4c 4f 42 3a 20 7b 0a 20  SQLITE_BLOB: {. 
5bb0: 20 20 20 20 20 20 20 20 20 69 6e 74 20 62 79 74           int byt
5bc0: 65 73 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  es = sqlite3_val
5bd0: 75 65 5f 62 79 74 65 73 28 70 49 6e 29 3b 0a 20  ue_bytes(pIn);. 
5be0: 20 20 20 20 20 20 20 20 20 70 56 61 6c 20 3d 20           pVal = 
5bf0: 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79  Tcl_NewByteArray
5c00: 4f 62 6a 28 73 71 6c 69 74 65 33 5f 76 61 6c 75  Obj(sqlite3_valu
5c10: 65 5f 62 6c 6f 62 28 70 49 6e 29 2c 20 62 79 74  e_blob(pIn), byt
5c20: 65 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62  es);.          b
5c30: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
5c40: 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c          case SQL
5c50: 49 54 45 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20  ITE_INTEGER: {. 
5c60: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 5f           sqlite_
5c70: 69 6e 74 36 34 20 76 20 3d 20 73 71 6c 69 74 65  int64 v = sqlite
5c80: 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28 70 49  3_value_int64(pI
5c90: 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  n);.          if
5ca0: 28 20 76 3e 3d 2d 32 31 34 37 34 38 33 36 34 37  ( v>=-2147483647
5cb0: 20 26 26 20 76 3c 3d 32 31 34 37 34 38 33 36 34   && v<=214748364
5cc0: 37 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  7 ){.           
5cd0: 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 49   pVal = Tcl_NewI
5ce0: 6e 74 4f 62 6a 28 28 69 6e 74 29 76 29 3b 0a 20  ntObj((int)v);. 
5cf0: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
5d00: 20 20 20 20 20 20 20 20 20 20 20 20 70 56 61 6c              pVal
5d10: 20 3d 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e   = Tcl_NewWideIn
5d20: 74 4f 62 6a 28 76 29 3b 0a 20 20 20 20 20 20 20  tObj(v);.       
5d30: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 62     }.          b
5d40: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
5d50: 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c          case SQL
5d60: 49 54 45 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20  ITE_FLOAT: {.   
5d70: 20 20 20 20 20 20 20 64 6f 75 62 6c 65 20 72 20         double r 
5d80: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
5d90: 64 6f 75 62 6c 65 28 70 49 6e 29 3b 0a 20 20 20  double(pIn);.   
5da0: 20 20 20 20 20 20 20 70 56 61 6c 20 3d 20 54 63         pVal = Tc
5db0: 6c 5f 4e 65 77 44 6f 75 62 6c 65 4f 62 6a 28 72  l_NewDoubleObj(r
5dc0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  );.          bre
5dd0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
5de0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
5df0: 45 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20  E_NULL: {.      
5e00: 20 20 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e      pVal = Tcl_N
5e10: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 22 2c 20  ewStringObj("", 
5e20: 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  0);.          br
5e30: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
5e40: 20 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20         default: 
5e50: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
5e60: 62 79 74 65 73 20 3d 20 73 71 6c 69 74 65 33 5f  bytes = sqlite3_
5e70: 76 61 6c 75 65 5f 62 79 74 65 73 28 70 49 6e 29  value_bytes(pIn)
5e80: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 56 61 6c  ;.          pVal
5e90: 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67   = Tcl_NewString
5ea0: 4f 62 6a 28 28 63 68 61 72 20 2a 29 73 71 6c 69  Obj((char *)sqli
5eb0: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 70  te3_value_text(p
5ec0: 49 6e 29 2c 20 62 79 74 65 73 29 3b 0a 20 20 20  In), bytes);.   
5ed0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
5ee0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
5ef0: 20 20 20 20 20 20 72 63 20 3d 20 54 63 6c 5f 4c        rc = Tcl_L
5f00: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
5f10: 65 6e 74 28 70 2d 3e 69 6e 74 65 72 70 2c 20 70  ent(p->interp, p
5f20: 43 6d 64 2c 20 70 56 61 6c 29 3b 0a 20 20 20 20  Cmd, pVal);.    
5f30: 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
5f40: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
5f50: 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20 20 20  ount(pCmd);.    
5f60: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
5f70: 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74  lt_error(context
5f80: 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52  , Tcl_GetStringR
5f90: 65 73 75 6c 74 28 70 2d 3e 69 6e 74 65 72 70 29  esult(p->interp)
5fa0: 2c 20 2d 31 29 3b 20 0a 20 20 20 20 20 20 20 20  , -1); .        
5fb0: 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a  return;.      }.
5fc0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 70      }.    if( !p
5fd0: 2d 3e 75 73 65 45 76 61 6c 4f 62 6a 76 20 29 7b  ->useEvalObjv ){
5fe0: 0a 20 20 20 20 20 20 2f 2a 20 54 63 6c 5f 45 76  .      /* Tcl_Ev
5ff0: 61 6c 4f 62 6a 45 78 28 29 20 77 69 6c 6c 20 61  alObjEx() will a
6000: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 61 6c  utomatically cal
6010: 6c 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 76 28 29  l Tcl_EvalObjv()
6020: 20 69 66 20 70 43 6d 64 0a 20 20 20 20 20 20 2a   if pCmd.      *
6030: 2a 20 69 73 20 61 20 6c 69 73 74 20 77 69 74 68  * is a list with
6040: 6f 75 74 20 61 20 73 74 72 69 6e 67 20 72 65 70  out a string rep
6050: 72 65 73 65 6e 74 61 74 69 6f 6e 2e 20 20 54 6f  resentation.  To
6060: 20 70 72 65 76 65 6e 74 20 74 68 69 73 20 66 72   prevent this fr
6070: 6f 6d 0a 20 20 20 20 20 20 2a 2a 20 68 61 70 70  om.      ** happ
6080: 65 6e 69 6e 67 2c 20 6d 61 6b 65 20 73 75 72 65  ening, make sure
6090: 20 70 43 6d 64 20 68 61 73 20 61 20 76 61 6c 69   pCmd has a vali
60a0: 64 20 73 74 72 69 6e 67 20 72 65 70 72 65 73 65  d string represe
60b0: 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  ntation */.     
60c0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 70   Tcl_GetString(p
60d0: 43 6d 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Cmd);.    }.    
60e0: 72 63 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a  rc = Tcl_EvalObj
60f0: 45 78 28 70 2d 3e 69 6e 74 65 72 70 2c 20 70 43  Ex(p->interp, pC
6100: 6d 64 2c 20 54 43 4c 5f 45 56 41 4c 5f 44 49 52  md, TCL_EVAL_DIR
6110: 45 43 54 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65  ECT);.    Tcl_De
6120: 63 72 52 65 66 43 6f 75 6e 74 28 70 43 6d 64 29  crRefCount(pCmd)
6130: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 20  ;.  }..  if( rc 
6140: 26 26 20 72 63 21 3d 54 43 4c 5f 52 45 54 55 52  && rc!=TCL_RETUR
6150: 4e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  N ){.    sqlite3
6160: 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f  _result_error(co
6170: 6e 74 65 78 74 2c 20 54 63 6c 5f 47 65 74 53 74  ntext, Tcl_GetSt
6180: 72 69 6e 67 52 65 73 75 6c 74 28 70 2d 3e 69 6e  ringResult(p->in
6190: 74 65 72 70 29 2c 20 2d 31 29 3b 20 0a 20 20 7d  terp), -1); .  }
61a0: 65 6c 73 65 7b 0a 20 20 20 20 54 63 6c 5f 4f 62  else{.    Tcl_Ob
61b0: 6a 20 2a 70 56 61 72 20 3d 20 54 63 6c 5f 47 65  j *pVar = Tcl_Ge
61c0: 74 4f 62 6a 52 65 73 75 6c 74 28 70 2d 3e 69 6e  tObjResult(p->in
61d0: 74 65 72 70 29 3b 0a 20 20 20 20 69 6e 74 20 6e  terp);.    int n
61e0: 3b 0a 20 20 20 20 75 38 20 2a 64 61 74 61 3b 0a  ;.    u8 *data;.
61f0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
6200: 7a 54 79 70 65 20 3d 20 28 70 56 61 72 2d 3e 74  zType = (pVar->t
6210: 79 70 65 50 74 72 20 3f 20 70 56 61 72 2d 3e 74  ypePtr ? pVar->t
6220: 79 70 65 50 74 72 2d 3e 6e 61 6d 65 20 3a 20 22  ypePtr->name : "
6230: 22 29 3b 0a 20 20 20 20 63 68 61 72 20 63 20 3d  ");.    char c =
6240: 20 7a 54 79 70 65 5b 30 5d 3b 0a 20 20 20 20 69   zType[0];.    i
6250: 66 28 20 63 3d 3d 27 62 27 20 26 26 20 73 74 72  f( c=='b' && str
6260: 63 6d 70 28 7a 54 79 70 65 2c 22 62 79 74 65 61  cmp(zType,"bytea
6270: 72 72 61 79 22 29 3d 3d 30 20 26 26 20 70 56 61  rray")==0 && pVa
6280: 72 2d 3e 62 79 74 65 73 3d 3d 30 20 29 7b 0a 20  r->bytes==0 ){. 
6290: 20 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 72 65 74       /* Only ret
62a0: 75 72 6e 20 61 20 42 4c 4f 42 20 74 79 70 65 20  urn a BLOB type 
62b0: 69 66 20 74 68 65 20 54 63 6c 20 76 61 72 69 61  if the Tcl varia
62c0: 62 6c 65 20 69 73 20 61 20 62 79 74 65 61 72 72  ble is a bytearr
62d0: 61 79 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20  ay and.      ** 
62e0: 68 61 73 20 6e 6f 20 73 74 72 69 6e 67 20 72 65  has no string re
62f0: 70 72 65 73 65 6e 74 61 74 69 6f 6e 2e 20 2a 2f  presentation. */
6300: 0a 20 20 20 20 20 20 64 61 74 61 20 3d 20 54 63  .      data = Tc
6310: 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79 46 72  l_GetByteArrayFr
6320: 6f 6d 4f 62 6a 28 70 56 61 72 2c 20 26 6e 29 3b  omObj(pVar, &n);
6330: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
6340: 65 73 75 6c 74 5f 62 6c 6f 62 28 63 6f 6e 74 65  esult_blob(conte
6350: 78 74 2c 20 64 61 74 61 2c 20 6e 2c 20 53 51 4c  xt, data, n, SQL
6360: 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
6370: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d      }else if( c=
6380: 3d 27 62 27 20 26 26 20 73 74 72 63 6d 70 28 7a  ='b' && strcmp(z
6390: 54 79 70 65 2c 22 62 6f 6f 6c 65 61 6e 22 29 3d  Type,"boolean")=
63a0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  =0 ){.      Tcl_
63b0: 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 30 2c  GetIntFromObj(0,
63c0: 20 70 56 61 72 2c 20 26 6e 29 3b 0a 20 20 20 20   pVar, &n);.    
63d0: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
63e0: 5f 69 6e 74 28 63 6f 6e 74 65 78 74 2c 20 6e 29  _int(context, n)
63f0: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
6400: 63 3d 3d 27 64 27 20 26 26 20 73 74 72 63 6d 70  c=='d' && strcmp
6410: 28 7a 54 79 70 65 2c 22 64 6f 75 62 6c 65 22 29  (zType,"double")
6420: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 64 6f 75  ==0 ){.      dou
6430: 62 6c 65 20 72 3b 0a 20 20 20 20 20 20 54 63 6c  ble r;.      Tcl
6440: 5f 47 65 74 44 6f 75 62 6c 65 46 72 6f 6d 4f 62  _GetDoubleFromOb
6450: 6a 28 30 2c 20 70 56 61 72 2c 20 26 72 29 3b 0a  j(0, pVar, &r);.
6460: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
6470: 73 75 6c 74 5f 64 6f 75 62 6c 65 28 63 6f 6e 74  sult_double(cont
6480: 65 78 74 2c 20 72 29 3b 0a 20 20 20 20 7d 65 6c  ext, r);.    }el
6490: 73 65 20 69 66 28 20 28 63 3d 3d 27 77 27 20 26  se if( (c=='w' &
64a0: 26 20 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22  & strcmp(zType,"
64b0: 77 69 64 65 49 6e 74 22 29 3d 3d 30 29 20 7c 7c  wideInt")==0) ||
64c0: 0a 20 20 20 20 20 20 20 20 20 20 28 63 3d 3d 27  .          (c=='
64d0: 69 27 20 26 26 20 73 74 72 63 6d 70 28 7a 54 79  i' && strcmp(zTy
64e0: 70 65 2c 22 69 6e 74 22 29 3d 3d 30 29 20 29 7b  pe,"int")==0) ){
64f0: 0a 20 20 20 20 20 20 54 63 6c 5f 57 69 64 65 49  .      Tcl_WideI
6500: 6e 74 20 76 3b 0a 20 20 20 20 20 20 54 63 6c 5f  nt v;.      Tcl_
6510: 47 65 74 57 69 64 65 49 6e 74 46 72 6f 6d 4f 62  GetWideIntFromOb
6520: 6a 28 30 2c 20 70 56 61 72 2c 20 26 76 29 3b 0a  j(0, pVar, &v);.
6530: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
6540: 73 75 6c 74 5f 69 6e 74 36 34 28 63 6f 6e 74 65  sult_int64(conte
6550: 78 74 2c 20 76 29 3b 0a 20 20 20 20 7d 65 6c 73  xt, v);.    }els
6560: 65 7b 0a 20 20 20 20 20 20 64 61 74 61 20 3d 20  e{.      data = 
6570: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  (unsigned char *
6580: 29 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72  )Tcl_GetStringFr
6590: 6f 6d 4f 62 6a 28 70 56 61 72 2c 20 26 6e 29 3b  omObj(pVar, &n);
65a0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
65b0: 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65  esult_text(conte
65c0: 78 74 2c 20 28 63 68 61 72 20 2a 29 64 61 74 61  xt, (char *)data
65d0: 2c 20 6e 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  , n, SQLITE_TRAN
65e0: 53 49 45 4e 54 29 3b 0a 20 20 20 20 7d 0a 20 20  SIENT);.    }.  
65f0: 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  }.}..#ifndef SQL
6600: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49  ITE_OMIT_AUTHORI
6610: 5a 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 54 68 69  ZATION./*.** Thi
6620: 73 20 69 73 20 74 68 65 20 61 75 74 68 65 6e 74  s is the authent
6630: 69 63 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e  ication function
6640: 2e 20 20 49 74 20 61 70 70 65 6e 64 73 20 74 68  .  It appends th
6650: 65 20 61 75 74 68 65 6e 74 69 63 61 74 69 6f 6e  e authentication
6660: 0a 2a 2a 20 74 79 70 65 20 63 6f 64 65 20 61 6e  .** type code an
6670: 64 20 74 68 65 20 74 77 6f 20 61 72 67 75 6d 65  d the two argume
6680: 6e 74 73 20 74 6f 20 7a 43 6d 64 5b 5d 20 74 68  nts to zCmd[] th
6690: 65 6e 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 72  en invokes the r
66a0: 65 73 75 6c 74 0a 2a 2a 20 6f 6e 20 74 68 65 20  esult.** on the 
66b0: 69 6e 74 65 72 70 72 65 74 65 72 2e 20 20 54 68  interpreter.  Th
66c0: 65 20 72 65 70 6c 79 20 69 73 20 65 78 61 6d 69  e reply is exami
66d0: 6e 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  ned to determine
66e0: 20 69 66 20 74 68 65 0a 2a 2a 20 61 75 74 68 65   if the.** authe
66f0: 6e 74 69 63 61 74 69 6f 6e 20 66 61 69 6c 73 20  ntication fails 
6700: 6f 72 20 73 75 63 63 65 65 64 73 2e 0a 2a 2f 0a  or succeeds..*/.
6710: 73 74 61 74 69 63 20 69 6e 74 20 61 75 74 68 5f  static int auth_
6720: 63 61 6c 6c 62 61 63 6b 28 0a 20 20 76 6f 69 64  callback(.  void
6730: 20 2a 70 41 72 67 2c 0a 20 20 69 6e 74 20 63 6f   *pArg,.  int co
6740: 64 65 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  de,.  const char
6750: 20 2a 7a 41 72 67 31 2c 0a 20 20 63 6f 6e 73 74   *zArg1,.  const
6760: 20 63 68 61 72 20 2a 7a 41 72 67 32 2c 0a 20 20   char *zArg2,.  
6770: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67  const char *zArg
6780: 33 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  3,.  const char 
6790: 2a 7a 41 72 67 34 0a 29 7b 0a 20 20 63 68 61 72  *zArg4.){.  char
67a0: 20 2a 7a 43 6f 64 65 3b 0a 20 20 54 63 6c 5f 44   *zCode;.  Tcl_D
67b0: 53 74 72 69 6e 67 20 73 74 72 3b 0a 20 20 69 6e  String str;.  in
67c0: 74 20 72 63 3b 0a 20 20 63 6f 6e 73 74 20 63 68  t rc;.  const ch
67d0: 61 72 20 2a 7a 52 65 70 6c 79 3b 0a 20 20 53 71  ar *zReply;.  Sq
67e0: 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53  liteDb *pDb = (S
67f0: 71 6c 69 74 65 44 62 2a 29 70 41 72 67 3b 0a 20  qliteDb*)pArg;. 
6800: 20 69 66 28 20 70 44 62 2d 3e 64 69 73 61 62 6c   if( pDb->disabl
6810: 65 41 75 74 68 20 29 20 72 65 74 75 72 6e 20 53  eAuth ) return S
6820: 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 73 77 69  QLITE_OK;..  swi
6830: 74 63 68 28 20 63 6f 64 65 20 29 7b 0a 20 20 20  tch( code ){.   
6840: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 50   case SQLITE_COP
6850: 59 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3a  Y              :
6860: 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43   zCode="SQLITE_C
6870: 4f 50 59 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  OPY"; break;.   
6880: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 52 45   case SQLITE_CRE
6890: 41 54 45 5f 49 4e 44 45 58 20 20 20 20 20 20 3a  ATE_INDEX      :
68a0: 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43   zCode="SQLITE_C
68b0: 52 45 41 54 45 5f 49 4e 44 45 58 22 3b 20 62 72  REATE_INDEX"; br
68c0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
68d0: 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 41 42 4c  LITE_CREATE_TABL
68e0: 45 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22  E      : zCode="
68f0: 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 41  SQLITE_CREATE_TA
6900: 42 4c 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  BLE"; break;.   
6910: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 52 45   case SQLITE_CRE
6920: 41 54 45 5f 54 45 4d 50 5f 49 4e 44 45 58 20 3a  ATE_TEMP_INDEX :
6930: 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43   zCode="SQLITE_C
6940: 52 45 41 54 45 5f 54 45 4d 50 5f 49 4e 44 45 58  REATE_TEMP_INDEX
6950: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
6960: 73 65 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45  se SQLITE_CREATE
6970: 5f 54 45 4d 50 5f 54 41 42 4c 45 20 3a 20 7a 43  _TEMP_TABLE : zC
6980: 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43 52 45 41  ode="SQLITE_CREA
6990: 54 45 5f 54 45 4d 50 5f 54 41 42 4c 45 22 3b 20  TE_TEMP_TABLE"; 
69a0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
69b0: 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45  SQLITE_CREATE_TE
69c0: 4d 50 5f 54 52 49 47 47 45 52 3a 20 7a 43 6f 64  MP_TRIGGER: zCod
69d0: 65 3d 22 53 51 4c 49 54 45 5f 43 52 45 41 54 45  e="SQLITE_CREATE
69e0: 5f 54 45 4d 50 5f 54 52 49 47 47 45 52 22 3b 20  _TEMP_TRIGGER"; 
69f0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
6a00: 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45  SQLITE_CREATE_TE
6a10: 4d 50 5f 56 49 45 57 20 20 3a 20 7a 43 6f 64 65  MP_VIEW  : zCode
6a20: 3d 22 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  ="SQLITE_CREATE_
6a30: 54 45 4d 50 5f 56 49 45 57 22 3b 20 62 72 65 61  TEMP_VIEW"; brea
6a40: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
6a50: 54 45 5f 43 52 45 41 54 45 5f 54 52 49 47 47 45  TE_CREATE_TRIGGE
6a60: 52 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51  R    : zCode="SQ
6a70: 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 52 49 47  LITE_CREATE_TRIG
6a80: 47 45 52 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  GER"; break;.   
6a90: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 52 45   case SQLITE_CRE
6aa0: 41 54 45 5f 56 49 45 57 20 20 20 20 20 20 20 3a  ATE_VIEW       :
6ab0: 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43   zCode="SQLITE_C
6ac0: 52 45 41 54 45 5f 56 49 45 57 22 3b 20 62 72 65  REATE_VIEW"; bre
6ad0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
6ae0: 49 54 45 5f 44 45 4c 45 54 45 20 20 20 20 20 20  ITE_DELETE      
6af0: 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53        : zCode="S
6b00: 51 4c 49 54 45 5f 44 45 4c 45 54 45 22 3b 20 62  QLITE_DELETE"; b
6b10: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
6b20: 51 4c 49 54 45 5f 44 52 4f 50 5f 49 4e 44 45 58  QLITE_DROP_INDEX
6b30: 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d          : zCode=
6b40: 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f 49 4e 44  "SQLITE_DROP_IND
6b50: 45 58 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  EX"; break;.    
6b60: 63 61 73 65 20 53 51 4c 49 54 45 5f 44 52 4f 50  case SQLITE_DROP
6b70: 5f 54 41 42 4c 45 20 20 20 20 20 20 20 20 3a 20  _TABLE        : 
6b80: 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44 52  zCode="SQLITE_DR
6b90: 4f 50 5f 54 41 42 4c 45 22 3b 20 62 72 65 61 6b  OP_TABLE"; break
6ba0: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
6bb0: 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 49 4e 44 45  E_DROP_TEMP_INDE
6bc0: 58 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c  X   : zCode="SQL
6bd0: 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 49 4e  ITE_DROP_TEMP_IN
6be0: 44 45 58 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  DEX"; break;.   
6bf0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44 52 4f   case SQLITE_DRO
6c00: 50 5f 54 45 4d 50 5f 54 41 42 4c 45 20 20 20 3a  P_TEMP_TABLE   :
6c10: 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44   zCode="SQLITE_D
6c20: 52 4f 50 5f 54 45 4d 50 5f 54 41 42 4c 45 22 3b  ROP_TEMP_TABLE";
6c30: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
6c40: 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d   SQLITE_DROP_TEM
6c50: 50 5f 54 52 49 47 47 45 52 20 3a 20 7a 43 6f 64  P_TRIGGER : zCod
6c60: 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54  e="SQLITE_DROP_T
6c70: 45 4d 50 5f 54 52 49 47 47 45 52 22 3b 20 62 72  EMP_TRIGGER"; br
6c80: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
6c90: 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 56  LITE_DROP_TEMP_V
6ca0: 49 45 57 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22  IEW    : zCode="
6cb0: 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50  SQLITE_DROP_TEMP
6cc0: 5f 56 49 45 57 22 3b 20 62 72 65 61 6b 3b 0a 20  _VIEW"; break;. 
6cd0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44     case SQLITE_D
6ce0: 52 4f 50 5f 54 52 49 47 47 45 52 20 20 20 20 20  ROP_TRIGGER     
6cf0: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
6d00: 5f 44 52 4f 50 5f 54 52 49 47 47 45 52 22 3b 20  _DROP_TRIGGER"; 
6d10: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
6d20: 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56 49 45 57  SQLITE_DROP_VIEW
6d30: 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65           : zCode
6d40: 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56 49  ="SQLITE_DROP_VI
6d50: 45 57 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  EW"; break;.    
6d60: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 53 45  case SQLITE_INSE
6d70: 52 54 20 20 20 20 20 20 20 20 20 20 20 20 3a 20  RT            : 
6d80: 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 49 4e  zCode="SQLITE_IN
6d90: 53 45 52 54 22 3b 20 62 72 65 61 6b 3b 0a 20 20  SERT"; break;.  
6da0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 50 52    case SQLITE_PR
6db0: 41 47 4d 41 20 20 20 20 20 20 20 20 20 20 20 20  AGMA            
6dc0: 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f  : zCode="SQLITE_
6dd0: 50 52 41 47 4d 41 22 3b 20 62 72 65 61 6b 3b 0a  PRAGMA"; break;.
6de0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
6df0: 52 45 41 44 20 20 20 20 20 20 20 20 20 20 20 20  READ            
6e00: 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54    : zCode="SQLIT
6e10: 45 5f 52 45 41 44 22 3b 20 62 72 65 61 6b 3b 0a  E_READ"; break;.
6e20: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
6e30: 53 45 4c 45 43 54 20 20 20 20 20 20 20 20 20 20  SELECT          
6e40: 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54    : zCode="SQLIT
6e50: 45 5f 53 45 4c 45 43 54 22 3b 20 62 72 65 61 6b  E_SELECT"; break
6e60: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
6e70: 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 20 20 20  E_TRANSACTION   
6e80: 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c      : zCode="SQL
6e90: 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 22  ITE_TRANSACTION"
6ea0: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
6eb0: 65 20 53 51 4c 49 54 45 5f 55 50 44 41 54 45 20  e SQLITE_UPDATE 
6ec0: 20 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f             : zCo
6ed0: 64 65 3d 22 53 51 4c 49 54 45 5f 55 50 44 41 54  de="SQLITE_UPDAT
6ee0: 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  E"; break;.    c
6ef0: 61 73 65 20 53 51 4c 49 54 45 5f 41 54 54 41 43  ase SQLITE_ATTAC
6f00: 48 20 20 20 20 20 20 20 20 20 20 20 20 3a 20 7a  H            : z
6f10: 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 41 54 54  Code="SQLITE_ATT
6f20: 41 43 48 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  ACH"; break;.   
6f30: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44 45 54   case SQLITE_DET
6f40: 41 43 48 20 20 20 20 20 20 20 20 20 20 20 20 3a  ACH            :
6f50: 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44   zCode="SQLITE_D
6f60: 45 54 41 43 48 22 3b 20 62 72 65 61 6b 3b 0a 20  ETACH"; break;. 
6f70: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41     case SQLITE_A
6f80: 4c 54 45 52 5f 54 41 42 4c 45 20 20 20 20 20 20  LTER_TABLE      
6f90: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
6fa0: 5f 41 4c 54 45 52 5f 54 41 42 4c 45 22 3b 20 62  _ALTER_TABLE"; b
6fb0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
6fc0: 51 4c 49 54 45 5f 52 45 49 4e 44 45 58 20 20 20  QLITE_REINDEX   
6fd0: 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d          : zCode=
6fe0: 22 53 51 4c 49 54 45 5f 52 45 49 4e 44 45 58 22  "SQLITE_REINDEX"
6ff0: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
7000: 65 20 53 51 4c 49 54 45 5f 41 4e 41 4c 59 5a 45  e SQLITE_ANALYZE
7010: 20 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f             : zCo
7020: 64 65 3d 22 53 51 4c 49 54 45 5f 41 4e 41 4c 59  de="SQLITE_ANALY
7030: 5a 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  ZE"; break;.    
7040: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 52 45 41  case SQLITE_CREA
7050: 54 45 5f 56 54 41 42 4c 45 20 20 20 20 20 3a 20  TE_VTABLE     : 
7060: 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43 52  zCode="SQLITE_CR
7070: 45 41 54 45 5f 56 54 41 42 4c 45 22 3b 20 62 72  EATE_VTABLE"; br
7080: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
7090: 4c 49 54 45 5f 44 52 4f 50 5f 56 54 41 42 4c 45  LITE_DROP_VTABLE
70a0: 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22         : zCode="
70b0: 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56 54 41 42  SQLITE_DROP_VTAB
70c0: 4c 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  LE"; break;.    
70d0: 63 61 73 65 20 53 51 4c 49 54 45 5f 46 55 4e 43  case SQLITE_FUNC
70e0: 54 49 4f 4e 20 20 20 20 20 20 20 20 20 20 3a 20  TION          : 
70f0: 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 46 55  zCode="SQLITE_FU
7100: 4e 43 54 49 4f 4e 22 3b 20 62 72 65 61 6b 3b 0a  NCTION"; break;.
7110: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
7120: 53 41 56 45 50 4f 49 4e 54 20 20 20 20 20 20 20  SAVEPOINT       
7130: 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54    : zCode="SQLIT
7140: 45 5f 53 41 56 45 50 4f 49 4e 54 22 3b 20 62 72  E_SAVEPOINT"; br
7150: 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74  eak;.    default
7160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7170: 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22         : zCode="
7180: 3f 3f 3f 3f 22 3b 20 62 72 65 61 6b 3b 0a 20 20  ????"; break;.  
7190: 7d 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49  }.  Tcl_DStringI
71a0: 6e 69 74 28 26 73 74 72 29 3b 0a 20 20 54 63 6c  nit(&str);.  Tcl
71b0: 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64 28 26  _DStringAppend(&
71c0: 73 74 72 2c 20 70 44 62 2d 3e 7a 41 75 74 68 2c  str, pDb->zAuth,
71d0: 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72   -1);.  Tcl_DStr
71e0: 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ingAppendElement
71f0: 28 26 73 74 72 2c 20 7a 43 6f 64 65 29 3b 0a 20  (&str, zCode);. 
7200: 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65   Tcl_DStringAppe
7210: 6e 64 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c 20  ndElement(&str, 
7220: 7a 41 72 67 31 20 3f 20 7a 41 72 67 31 20 3a 20  zArg1 ? zArg1 : 
7230: 22 22 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69  "");.  Tcl_DStri
7240: 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  ngAppendElement(
7250: 26 73 74 72 2c 20 7a 41 72 67 32 20 3f 20 7a 41  &str, zArg2 ? zA
7260: 72 67 32 20 3a 20 22 22 29 3b 0a 20 20 54 63 6c  rg2 : "");.  Tcl
7270: 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64 45 6c  _DStringAppendEl
7280: 65 6d 65 6e 74 28 26 73 74 72 2c 20 7a 41 72 67  ement(&str, zArg
7290: 33 20 3f 20 7a 41 72 67 33 20 3a 20 22 22 29 3b  3 ? zArg3 : "");
72a0: 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70  .  Tcl_DStringAp
72b0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 26 73 74 72  pendElement(&str
72c0: 2c 20 7a 41 72 67 34 20 3f 20 7a 41 72 67 34 20  , zArg4 ? zArg4 
72d0: 3a 20 22 22 29 3b 0a 20 20 72 63 20 3d 20 54 63  : "");.  rc = Tc
72e0: 6c 5f 47 6c 6f 62 61 6c 45 76 61 6c 28 70 44 62  l_GlobalEval(pDb
72f0: 2d 3e 69 6e 74 65 72 70 2c 20 54 63 6c 5f 44 53  ->interp, Tcl_DS
7300: 74 72 69 6e 67 56 61 6c 75 65 28 26 73 74 72 29  tringValue(&str)
7310: 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  );.  Tcl_DString
7320: 46 72 65 65 28 26 73 74 72 29 3b 0a 20 20 7a 52  Free(&str);.  zR
7330: 65 70 6c 79 20 3d 20 72 63 3d 3d 54 43 4c 5f 4f  eply = rc==TCL_O
7340: 4b 20 3f 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  K ? Tcl_GetStrin
7350: 67 52 65 73 75 6c 74 28 70 44 62 2d 3e 69 6e 74  gResult(pDb->int
7360: 65 72 70 29 20 3a 20 22 53 51 4c 49 54 45 5f 44  erp) : "SQLITE_D
7370: 45 4e 59 22 3b 0a 20 20 69 66 28 20 73 74 72 63  ENY";.  if( strc
7380: 6d 70 28 7a 52 65 70 6c 79 2c 22 53 51 4c 49 54  mp(zReply,"SQLIT
7390: 45 5f 4f 4b 22 29 3d 3d 30 20 29 7b 0a 20 20 20  E_OK")==0 ){.   
73a0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
73b0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72  .  }else if( str
73c0: 63 6d 70 28 7a 52 65 70 6c 79 2c 22 53 51 4c 49  cmp(zReply,"SQLI
73d0: 54 45 5f 44 45 4e 59 22 29 3d 3d 30 20 29 7b 0a  TE_DENY")==0 ){.
73e0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
73f0: 44 45 4e 59 3b 0a 20 20 7d 65 6c 73 65 20 69 66  DENY;.  }else if
7400: 28 20 73 74 72 63 6d 70 28 7a 52 65 70 6c 79 2c  ( strcmp(zReply,
7410: 22 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 22 29  "SQLITE_IGNORE")
7420: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
7430: 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 3b 0a 20  SQLITE_IGNORE;. 
7440: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
7450: 20 39 39 39 3b 0a 20 20 7d 0a 20 20 72 65 74 75   999;.  }.  retu
7460: 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20  rn rc;.}.#endif 
7470: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  /* SQLITE_OMIT_A
7480: 55 54 48 4f 52 49 5a 41 54 49 4f 4e 20 2a 2f 0a  UTHORIZATION */.
7490: 0a 2f 2a 0a 2a 2a 20 7a 54 65 78 74 20 69 73 20  ./*.** zText is 
74a0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 65 78  a pointer to tex
74b0: 74 20 6f 62 74 61 69 6e 65 64 20 76 69 61 20 61  t obtained via a
74c0: 6e 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74  n sqlite3_result
74d0: 5f 74 65 78 74 28 29 0a 2a 2a 20 6f 72 20 73 69  _text().** or si
74e0: 6d 69 6c 61 72 20 69 6e 74 65 72 66 61 63 65 2e  milar interface.
74f0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
7500: 74 75 72 6e 73 20 61 20 54 63 6c 20 73 74 72 69  turns a Tcl stri
7510: 6e 67 20 6f 62 6a 65 63 74 2c 20 0a 2a 2a 20 72  ng object, .** r
7520: 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 73  eference count s
7530: 65 74 20 74 6f 20 30 2c 20 63 6f 6e 74 61 69 6e  et to 0, contain
7540: 69 6e 67 20 74 68 65 20 74 65 78 74 2e 20 49 66  ing the text. If
7550: 20 61 20 74 72 61 6e 73 6c 61 74 69 6f 6e 0a 2a   a translation.*
7560: 2a 20 62 65 74 77 65 65 6e 20 69 73 6f 38 38 35  * between iso885
7570: 39 20 61 6e 64 20 55 54 46 2d 38 20 69 73 20 72  9 and UTF-8 is r
7580: 65 71 75 69 72 65 64 2c 20 69 74 20 69 73 20 70  equired, it is p
7590: 72 65 66 6f 72 6d 65 64 2e 0a 2a 2f 0a 73 74 61  reformed..*/.sta
75a0: 74 69 63 20 54 63 6c 5f 4f 62 6a 20 2a 64 62 54  tic Tcl_Obj *dbT
75b0: 65 78 74 54 6f 4f 62 6a 28 63 68 61 72 20 63 6f  extToObj(char co
75c0: 6e 73 74 20 2a 7a 54 65 78 74 29 7b 0a 20 20 54  nst *zText){.  T
75d0: 63 6c 5f 4f 62 6a 20 2a 70 56 61 6c 3b 0a 23 69  cl_Obj *pVal;.#i
75e0: 66 64 65 66 20 55 54 46 5f 54 52 41 4e 53 4c 41  fdef UTF_TRANSLA
75f0: 54 49 4f 4e 5f 4e 45 45 44 45 44 0a 20 20 54 63  TION_NEEDED.  Tc
7600: 6c 5f 44 53 74 72 69 6e 67 20 64 43 6f 6c 3b 0a  l_DString dCol;.
7610: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69    Tcl_DStringIni
7620: 74 28 26 64 43 6f 6c 29 3b 0a 20 20 54 63 6c 5f  t(&dCol);.  Tcl_
7630: 45 78 74 65 72 6e 61 6c 54 6f 55 74 66 44 53 74  ExternalToUtfDSt
7640: 72 69 6e 67 28 4e 55 4c 4c 2c 20 7a 54 65 78 74  ring(NULL, zText
7650: 2c 20 2d 31 2c 20 26 64 43 6f 6c 29 3b 0a 20 20  , -1, &dCol);.  
7660: 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 53 74  pVal = Tcl_NewSt
7670: 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 44 53 74 72  ringObj(Tcl_DStr
7680: 69 6e 67 56 61 6c 75 65 28 26 64 43 6f 6c 29 2c  ingValue(&dCol),
7690: 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72   -1);.  Tcl_DStr
76a0: 69 6e 67 46 72 65 65 28 26 64 43 6f 6c 29 3b 0a  ingFree(&dCol);.
76b0: 23 65 6c 73 65 0a 20 20 70 56 61 6c 20 3d 20 54  #else.  pVal = T
76c0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
76d0: 7a 54 65 78 74 2c 20 2d 31 29 3b 0a 23 65 6e 64  zText, -1);.#end
76e0: 69 66 0a 20 20 72 65 74 75 72 6e 20 70 56 61 6c  if.  return pVal
76f0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
7700: 72 6f 75 74 69 6e 65 20 72 65 61 64 73 20 61 20  routine reads a 
7710: 6c 69 6e 65 20 6f 66 20 74 65 78 74 20 66 72 6f  line of text fro
7720: 6d 20 46 49 4c 45 20 69 6e 2c 20 73 74 6f 72 65  m FILE in, store
7730: 73 0a 2a 2a 20 74 68 65 20 74 65 78 74 20 69 6e  s.** the text in
7740: 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64   memory obtained
7750: 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 20 61   from malloc() a
7760: 6e 64 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69  nd returns a poi
7770: 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 74  nter.** to the t
7780: 65 78 74 2e 20 20 4e 55 4c 4c 20 69 73 20 72 65  ext.  NULL is re
7790: 74 75 72 6e 65 64 20 61 74 20 65 6e 64 20 6f 66  turned at end of
77a0: 20 66 69 6c 65 2c 20 6f 72 20 69 66 20 6d 61 6c   file, or if mal
77b0: 6c 6f 63 28 29 0a 2a 2a 20 66 61 69 6c 73 2e 0a  loc().** fails..
77c0: 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 74 65 72 66  **.** The interf
77d0: 61 63 65 20 69 73 20 6c 69 6b 65 20 22 72 65 61  ace is like "rea
77e0: 64 6c 69 6e 65 22 20 62 75 74 20 6e 6f 20 63 6f  dline" but no co
77f0: 6d 6d 61 6e 64 2d 6c 69 6e 65 20 65 64 69 74 69  mmand-line editi
7800: 6e 67 0a 2a 2a 20 69 73 20 64 6f 6e 65 2e 0a 2a  ng.** is done..*
7810: 2a 0a 2a 2a 20 63 6f 70 69 65 64 20 66 72 6f 6d  *.** copied from
7820: 20 73 68 65 6c 6c 2e 63 20 66 72 6f 6d 20 27 2e   shell.c from '.
7830: 69 6d 70 6f 72 74 27 20 63 6f 6d 6d 61 6e 64 0a  import' command.
7840: 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
7850: 6c 6f 63 61 6c 5f 67 65 74 6c 69 6e 65 28 63 68  local_getline(ch
7860: 61 72 20 2a 7a 50 72 6f 6d 70 74 2c 20 46 49 4c  ar *zPrompt, FIL
7870: 45 20 2a 69 6e 29 7b 0a 20 20 63 68 61 72 20 2a  E *in){.  char *
7880: 7a 4c 69 6e 65 3b 0a 20 20 69 6e 74 20 6e 4c 69  zLine;.  int nLi
7890: 6e 65 3b 0a 20 20 69 6e 74 20 6e 3b 0a 0a 20 20  ne;.  int n;..  
78a0: 6e 4c 69 6e 65 20 3d 20 31 30 30 3b 0a 20 20 7a  nLine = 100;.  z
78b0: 4c 69 6e 65 20 3d 20 6d 61 6c 6c 6f 63 28 20 6e  Line = malloc( n
78c0: 4c 69 6e 65 20 29 3b 0a 20 20 69 66 28 20 7a 4c  Line );.  if( zL
78d0: 69 6e 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ine==0 ) return 
78e0: 30 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20 20 77 68  0;.  n = 0;.  wh
78f0: 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 69 66  ile( 1 ){.    if
7900: 28 20 6e 2b 31 30 30 3e 6e 4c 69 6e 65 20 29 7b  ( n+100>nLine ){
7910: 0a 20 20 20 20 20 20 6e 4c 69 6e 65 20 3d 20 6e  .      nLine = n
7920: 4c 69 6e 65 2a 32 20 2b 20 31 30 30 3b 0a 20 20  Line*2 + 100;.  
7930: 20 20 20 20 7a 4c 69 6e 65 20 3d 20 72 65 61 6c      zLine = real
7940: 6c 6f 63 28 7a 4c 69 6e 65 2c 20 6e 4c 69 6e 65  loc(zLine, nLine
7950: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 4c 69  );.      if( zLi
7960: 6e 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ne==0 ) return 0
7970: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
7980: 66 67 65 74 73 28 26 7a 4c 69 6e 65 5b 6e 5d 2c  fgets(&zLine[n],
7990: 20 6e 4c 69 6e 65 20 2d 20 6e 2c 20 69 6e 29 3d   nLine - n, in)=
79a0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
79b0: 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  n==0 ){.        
79c0: 66 72 65 65 28 7a 4c 69 6e 65 29 3b 0a 20 20 20  free(zLine);.   
79d0: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
79e0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 4c 69       }.      zLi
79f0: 6e 65 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20  ne[n] = 0;.     
7a00: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
7a10: 20 20 77 68 69 6c 65 28 20 7a 4c 69 6e 65 5b 6e    while( zLine[n
7a20: 5d 20 29 7b 20 6e 2b 2b 3b 20 7d 0a 20 20 20 20  ] ){ n++; }.    
7a30: 69 66 28 20 6e 3e 30 20 26 26 20 7a 4c 69 6e 65  if( n>0 && zLine
7a40: 5b 6e 2d 31 5d 3d 3d 27 5c 6e 27 20 29 7b 0a 20  [n-1]=='\n' ){. 
7a50: 20 20 20 20 20 6e 2d 2d 3b 0a 20 20 20 20 20 20       n--;.      
7a60: 7a 4c 69 6e 65 5b 6e 5d 20 3d 20 30 3b 0a 20 20  zLine[n] = 0;.  
7a70: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
7a80: 0a 20 20 7d 0a 20 20 7a 4c 69 6e 65 20 3d 20 72  .  }.  zLine = r
7a90: 65 61 6c 6c 6f 63 28 20 7a 4c 69 6e 65 2c 20 6e  ealloc( zLine, n
7aa0: 2b 31 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a  +1 );.  return z
7ab0: 4c 69 6e 65 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  Line;.}.../*.** 
7ac0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
7ad0: 20 70 61 72 74 20 6f 66 20 74 68 65 20 69 6d 70   part of the imp
7ae0: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
7af0: 68 65 20 63 6f 6d 6d 61 6e 64 3a 0a 2a 2a 0a 2a  he command:.**.*
7b00: 2a 20 20 20 24 64 62 20 74 72 61 6e 73 61 63 74  *   $db transact
7b10: 69 6f 6e 20 5b 2d 64 65 66 65 72 72 65 64 7c 2d  ion [-deferred|-
7b20: 69 6d 6d 65 64 69 61 74 65 7c 2d 65 78 63 6c 75  immediate|-exclu
7b30: 73 69 76 65 5d 20 53 43 52 49 50 54 0a 2a 2a 0a  sive] SCRIPT.**.
7b40: 2a 2a 20 49 74 20 69 73 20 69 6e 76 6f 6b 65 64  ** It is invoked
7b50: 20 61 66 74 65 72 20 65 76 61 6c 75 61 74 69 6e   after evaluatin
7b60: 67 20 74 68 65 20 73 63 72 69 70 74 20 53 43 52  g the script SCR
7b70: 49 50 54 20 74 6f 20 63 6f 6d 6d 69 74 20 6f 72  IPT to commit or
7b80: 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 74 68 65   rollback.** the
7b90: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 72 20   transaction or 
7ba0: 73 61 76 65 70 6f 69 6e 74 20 6f 70 65 6e 65 64  savepoint opened
7bb0: 20 62 79 20 74 68 65 20 5b 74 72 61 6e 73 61 63   by the [transac
7bc0: 74 69 6f 6e 5d 20 63 6f 6d 6d 61 6e 64 2e 0a 2a  tion] command..*
7bd0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 44 62 54  /.static int DbT
7be0: 72 61 6e 73 50 6f 73 74 43 6d 64 28 0a 20 20 43  ransPostCmd(.  C
7bf0: 6c 69 65 6e 74 44 61 74 61 20 64 61 74 61 5b 5d  lientData data[]
7c00: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
7c10: 20 20 20 20 2f 2a 20 64 61 74 61 5b 30 5d 20 69      /* data[0] i
7c20: 73 20 74 68 65 20 53 71 6c 69 74 65 33 44 62 2a  s the Sqlite3Db*
7c30: 20 66 6f 72 20 24 64 62 20 2a 2f 0a 20 20 54 63   for $db */.  Tc
7c40: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
7c50: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
7c60: 20 20 20 2f 2a 20 54 63 6c 20 69 6e 74 65 72 70     /* Tcl interp
7c70: 72 65 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72  reter */.  int r
7c80: 65 73 75 6c 74 20 20 20 20 20 20 20 20 20 20 20  esult           
7c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ca0: 2f 2a 20 52 65 73 75 6c 74 20 6f 66 20 65 76 61  /* Result of eva
7cb0: 6c 75 61 74 69 6e 67 20 53 43 52 49 50 54 20 2a  luating SCRIPT *
7cc0: 2f 0a 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f  /.){.  static co
7cd0: 6e 73 74 20 63 68 61 72 20 2a 61 7a 45 6e 64 5b  nst char *azEnd[
7ce0: 5d 20 3d 20 7b 0a 20 20 20 20 22 52 45 4c 45 41  ] = {.    "RELEA
7cf0: 53 45 20 5f 74 63 6c 5f 74 72 61 6e 73 61 63 74  SE _tcl_transact
7d00: 69 6f 6e 22 2c 20 20 20 20 20 20 20 20 2f 2a 20  ion",        /* 
7d10: 72 63 3d 3d 54 43 4c 5f 45 52 52 4f 52 2c 20 6e  rc==TCL_ERROR, n
7d20: 54 72 61 6e 73 61 63 74 69 6f 6e 21 3d 30 20 2a  Transaction!=0 *
7d30: 2f 0a 20 20 20 20 22 43 4f 4d 4d 49 54 22 2c 20  /.    "COMMIT", 
7d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d50: 20 20 20 20 20 20 20 20 20 2f 2a 20 72 63 21 3d           /* rc!=
7d60: 54 43 4c 5f 45 52 52 4f 52 2c 20 6e 54 72 61 6e  TCL_ERROR, nTran
7d70: 73 61 63 74 69 6f 6e 3d 3d 30 20 2a 2f 0a 20 20  saction==0 */.  
7d80: 20 20 22 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 5f    "ROLLBACK TO _
7d90: 74 63 6c 5f 74 72 61 6e 73 61 63 74 69 6f 6e 20  tcl_transaction 
7da0: 3b 20 52 45 4c 45 41 53 45 20 5f 74 63 6c 5f 74  ; RELEASE _tcl_t
7db0: 72 61 6e 73 61 63 74 69 6f 6e 22 2c 0a 20 20 20  ransaction",.   
7dc0: 20 22 52 4f 4c 4c 42 41 43 4b 22 20 20 20 20 20   "ROLLBACK"     
7dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7de0: 20 20 20 20 2f 2a 20 72 63 3d 3d 54 43 4c 5f 45      /* rc==TCL_E
7df0: 52 52 4f 52 2c 20 6e 54 72 61 6e 73 61 63 74 69  RROR, nTransacti
7e00: 6f 6e 3d 3d 30 20 2a 2f 0a 20 20 7d 3b 0a 20 20  on==0 */.  };.  
7e10: 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20  SqliteDb *pDb = 
7e20: 28 53 71 6c 69 74 65 44 62 2a 29 64 61 74 61 5b  (SqliteDb*)data[
7e30: 30 5d 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 72  0];.  int rc = r
7e40: 65 73 75 6c 74 3b 0a 20 20 63 6f 6e 73 74 20 63  esult;.  const c
7e50: 68 61 72 20 2a 7a 45 6e 64 3b 0a 0a 20 20 70 44  har *zEnd;..  pD
7e60: 62 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2d  b->nTransaction-
7e70: 2d 3b 0a 20 20 7a 45 6e 64 20 3d 20 61 7a 45 6e  -;.  zEnd = azEn
7e80: 64 5b 28 72 63 3d 3d 54 43 4c 5f 45 52 52 4f 52  d[(rc==TCL_ERROR
7e90: 29 2a 32 20 2b 20 28 70 44 62 2d 3e 6e 54 72 61  )*2 + (pDb->nTra
7ea0: 6e 73 61 63 74 69 6f 6e 3d 3d 30 29 5d 3b 0a 0a  nsaction==0)];..
7eb0: 20 20 70 44 62 2d 3e 64 69 73 61 62 6c 65 41 75    pDb->disableAu
7ec0: 74 68 2b 2b 3b 0a 20 20 69 66 28 20 73 71 6c 69  th++;.  if( sqli
7ed0: 74 65 33 5f 65 78 65 63 28 70 44 62 2d 3e 64 62  te3_exec(pDb->db
7ee0: 2c 20 7a 45 6e 64 2c 20 30 2c 20 30 2c 20 30 29  , zEnd, 0, 0, 0)
7ef0: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69   ){.      /* Thi
7f00: 73 20 69 73 20 61 20 74 72 69 63 6b 79 20 73 63  s is a tricky sc
7f10: 65 6e 61 72 69 6f 20 74 6f 20 68 61 6e 64 6c 65  enario to handle
7f20: 2e 20 54 68 65 20 6d 6f 73 74 20 6c 69 6b 65 6c  . The most likel
7f30: 79 20 63 61 75 73 65 20 6f 66 20 61 6e 0a 20 20  y cause of an.  
7f40: 20 20 20 20 2a 2a 20 65 72 72 6f 72 20 69 73 20      ** error is 
7f50: 74 68 61 74 20 74 68 65 20 65 78 65 63 28 29 20  that the exec() 
7f60: 61 62 6f 76 65 20 77 61 73 20 61 6e 20 61 74 74  above was an att
7f70: 65 6d 70 74 20 74 6f 20 63 6f 6d 6d 69 74 20 74  empt to commit t
7f80: 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 74 6f 70  he .      ** top
7f90: 2d 6c 65 76 65 6c 20 74 72 61 6e 73 61 63 74 69  -level transacti
7fa0: 6f 6e 20 74 68 61 74 20 72 65 74 75 72 6e 65 64  on that returned
7fb0: 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 4f 72   SQLITE_BUSY. Or
7fc0: 2c 20 6c 65 73 73 20 6c 69 6b 65 6c 79 2c 0a 20  , less likely,. 
7fd0: 20 20 20 20 20 2a 2a 20 74 68 61 74 20 61 6e 20       ** that an 
7fe0: 49 4f 2d 65 72 72 6f 72 20 68 61 73 20 6f 63 63  IO-error has occ
7ff0: 75 72 65 64 2e 20 49 6e 20 65 69 74 68 65 72 20  ured. In either 
8000: 63 61 73 65 2c 20 74 68 72 6f 77 20 61 20 54 63  case, throw a Tc
8010: 6c 20 65 78 63 65 70 74 69 6f 6e 0a 20 20 20 20  l exception.    
8020: 20 20 2a 2a 20 61 6e 64 20 74 72 79 20 74 6f 20    ** and try to 
8030: 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 74 72 61  rollback the tra
8040: 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20  nsaction..      
8050: 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 42 75 74 20  **.      ** But 
8060: 69 74 20 63 6f 75 6c 64 20 61 6c 73 6f 20 62 65  it could also be
8070: 20 74 68 61 74 20 74 68 65 20 75 73 65 72 20 65   that the user e
8080: 78 65 63 75 74 65 64 20 6f 6e 65 20 6f 72 20 6d  xecuted one or m
8090: 6f 72 65 20 42 45 47 49 4e 2c 20 0a 20 20 20 20  ore BEGIN, .    
80a0: 20 20 2a 2a 20 43 4f 4d 4d 49 54 2c 20 53 41 56    ** COMMIT, SAV
80b0: 45 50 4f 49 4e 54 2c 20 52 45 4c 45 41 53 45 20  EPOINT, RELEASE 
80c0: 6f 72 20 52 4f 4c 4c 42 41 43 4b 20 63 6f 6d 6d  or ROLLBACK comm
80d0: 61 6e 64 73 20 74 68 61 74 20 61 72 65 20 63 6f  ands that are co
80e0: 6e 66 75 73 69 6e 67 0a 20 20 20 20 20 20 2a 2a  nfusing.      **
80f0: 20 74 68 69 73 20 6d 65 74 68 6f 64 27 73 20 6c   this method's l
8100: 6f 67 69 63 2e 20 4e 6f 74 20 63 6c 65 61 72 20  ogic. Not clear 
8110: 68 6f 77 20 74 68 69 73 20 77 6f 75 6c 64 20 62  how this would b
8120: 65 20 62 65 73 74 20 68 61 6e 64 6c 65 64 2e 0a  e best handled..
8130: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28        */.    if(
8140: 20 72 63 21 3d 54 43 4c 5f 45 52 52 4f 52 20 29   rc!=TCL_ERROR )
8150: 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65  {.      Tcl_Appe
8160: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
8170: 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
8180: 70 44 62 2d 3e 64 62 29 2c 20 30 29 3b 0a 20 20  pDb->db), 0);.  
8190: 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45 52 52      rc = TCL_ERR
81a0: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  OR;.    }.    sq
81b0: 6c 69 74 65 33 5f 65 78 65 63 28 70 44 62 2d 3e  lite3_exec(pDb->
81c0: 64 62 2c 20 22 52 4f 4c 4c 42 41 43 4b 22 2c 20  db, "ROLLBACK", 
81d0: 30 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  0, 0, 0);.  }.  
81e0: 70 44 62 2d 3e 64 69 73 61 62 6c 65 41 75 74 68  pDb->disableAuth
81f0: 2d 2d 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 63  --;..  return rc
8200: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 65 73  ;.}../*.** Unles
8210: 73 20 53 51 4c 49 54 45 5f 54 45 53 54 20 69 73  s SQLITE_TEST is
8220: 20 64 65 66 69 6e 65 64 2c 20 74 68 69 73 20 66   defined, this f
8230: 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 73 69 6d  unction is a sim
8240: 70 6c 65 20 77 72 61 70 70 65 72 20 61 72 6f 75  ple wrapper arou
8250: 6e 64 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 70 72  nd.** sqlite3_pr
8260: 65 70 61 72 65 5f 76 32 28 29 2e 20 49 66 20 53  epare_v2(). If S
8270: 51 4c 49 54 45 5f 54 45 53 54 20 69 73 20 64 65  QLITE_TEST is de
8280: 66 69 6e 65 64 2c 20 74 68 65 6e 20 69 74 20 75  fined, then it u
8290: 73 65 73 20 65 69 74 68 65 72 0a 2a 2a 20 73 71  ses either.** sq
82a0: 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
82b0: 28 29 20 6f 72 20 6c 65 67 61 63 79 20 69 6e 74  () or legacy int
82c0: 65 72 66 61 63 65 20 73 71 6c 69 74 65 33 5f 70  erface sqlite3_p
82d0: 72 65 70 61 72 65 28 29 2c 20 64 65 70 65 6e 64  repare(), depend
82e0: 69 6e 67 0a 2a 2a 20 6f 6e 20 77 68 65 74 68 65  ing.** on whethe
82f0: 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 5b 64 62  r or not the [db
8300: 5f 75 73 65 5f 6c 65 67 61 63 79 5f 70 72 65 70  _use_legacy_prep
8310: 61 72 65 5d 20 63 6f 6d 6d 61 6e 64 20 68 61 73  are] command has
8320: 20 62 65 65 6e 20 75 73 65 64 20 74 6f 20 0a 2a   been used to .*
8330: 2a 20 63 6f 6e 66 69 67 75 72 65 20 74 68 65 20  * configure the 
8340: 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  connection..*/.s
8350: 74 61 74 69 63 20 69 6e 74 20 64 62 50 72 65 70  tatic int dbPrep
8360: 61 72 65 28 0a 20 20 53 71 6c 69 74 65 44 62 20  are(.  SqliteDb 
8370: 2a 70 44 62 2c 20 20 20 20 20 20 20 20 20 20 20  *pDb,           
8380: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
8390: 73 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63  se object */.  c
83a0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 2c  onst char *zSql,
83b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
83c0: 2a 20 53 51 4c 20 74 6f 20 63 6f 6d 70 69 6c 65  * SQL to compile
83d0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74   */.  sqlite3_st
83e0: 6d 74 20 2a 2a 70 70 53 74 6d 74 2c 20 20 20 20  mt **ppStmt,    
83f0: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 50 72        /* OUT: Pr
8400: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
8410: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
8420: 20 2a 2a 70 7a 4f 75 74 20 20 20 20 20 20 20 20   **pzOut        
8430: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 50 6f        /* OUT: Po
8440: 69 6e 74 65 72 20 74 6f 20 6e 65 78 74 20 53 51  inter to next SQ
8450: 4c 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 29  L statement */.)
8460: 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
8470: 54 45 53 54 0a 20 20 69 66 28 20 70 44 62 2d 3e  TEST.  if( pDb->
8480: 62 4c 65 67 61 63 79 50 72 65 70 61 72 65 20 29  bLegacyPrepare )
8490: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c  {.    return sql
84a0: 69 74 65 33 5f 70 72 65 70 61 72 65 28 70 44 62  ite3_prepare(pDb
84b0: 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20  ->db, zSql, -1, 
84c0: 70 70 53 74 6d 74 2c 20 70 7a 4f 75 74 29 3b 0a  ppStmt, pzOut);.
84d0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74    }.#endif.  ret
84e0: 75 72 6e 20 73 71 6c 69 74 65 33 5f 70 72 65 70  urn sqlite3_prep
84f0: 61 72 65 5f 76 32 28 70 44 62 2d 3e 64 62 2c 20  are_v2(pDb->db, 
8500: 7a 53 71 6c 2c 20 2d 31 2c 20 70 70 53 74 6d 74  zSql, -1, ppStmt
8510: 2c 20 70 7a 4f 75 74 29 3b 0a 7d 0a 0a 2f 2a 0a  , pzOut);.}../*.
8520: 2a 2a 20 53 65 61 72 63 68 20 74 68 65 20 63 61  ** Search the ca
8530: 63 68 65 20 66 6f 72 20 61 20 70 72 65 70 61 72  che for a prepar
8540: 65 64 2d 73 74 61 74 65 6d 65 6e 74 20 6f 62 6a  ed-statement obj
8550: 65 63 74 20 74 68 61 74 20 69 6d 70 6c 65 6d 65  ect that impleme
8560: 6e 74 73 20 74 68 65 0a 2a 2a 20 66 69 72 73 74  nts the.** first
8570: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 69   SQL statement i
8580: 6e 20 74 68 65 20 62 75 66 66 65 72 20 70 6f 69  n the buffer poi
8590: 6e 74 65 64 20 74 6f 20 62 79 20 70 61 72 61 6d  nted to by param
85a0: 65 74 65 72 20 7a 49 6e 2e 20 49 66 0a 2a 2a 20  eter zIn. If.** 
85b0: 6e 6f 20 73 75 63 68 20 70 72 65 70 61 72 65 64  no such prepared
85c0: 2d 73 74 61 74 65 6d 65 6e 74 20 63 61 6e 20 62  -statement can b
85d0: 65 20 66 6f 75 6e 64 2c 20 61 6c 6c 6f 63 61 74  e found, allocat
85e0: 65 20 61 6e 64 20 70 72 65 70 61 72 65 20 61 20  e and prepare a 
85f0: 6e 65 77 0a 2a 2a 20 6f 6e 65 2e 20 49 6e 20 65  new.** one. In e
8600: 69 74 68 65 72 20 63 61 73 65 2c 20 62 69 6e 64  ither case, bind
8610: 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c   the current val
8620: 75 65 73 20 6f 66 20 74 68 65 20 72 65 6c 65 76  ues of the relev
8630: 61 6e 74 20 54 63 6c 0a 2a 2a 20 76 61 72 69 61  ant Tcl.** varia
8640: 62 6c 65 73 20 74 6f 20 61 6e 79 20 24 76 61 72  bles to any $var
8650: 2c 20 3a 76 61 72 20 6f 72 20 40 76 61 72 20 76  , :var or @var v
8660: 61 72 69 61 62 6c 65 73 20 69 6e 20 74 68 65 20  ariables in the 
8670: 73 74 61 74 65 6d 65 6e 74 2e 20 42 65 66 6f 72  statement. Befor
8680: 65 0a 2a 2a 20 72 65 74 75 72 6e 69 6e 67 2c 20  e.** returning, 
8690: 73 65 74 20 2a 70 70 50 72 65 53 74 6d 74 20 74  set *ppPreStmt t
86a0: 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 70  o point to the p
86b0: 72 65 70 61 72 65 64 2d 73 74 61 74 65 6d 65 6e  repared-statemen
86c0: 74 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20  t object..**.** 
86d0: 4f 75 74 70 75 74 20 70 61 72 61 6d 65 74 65 72  Output parameter
86e0: 20 2a 70 7a 4f 75 74 20 69 73 20 73 65 74 20 74   *pzOut is set t
86f0: 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e  o point to the n
8700: 65 78 74 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  ext SQL statemen
8710: 74 20 69 6e 0a 2a 2a 20 62 75 66 66 65 72 20 7a  t in.** buffer z
8720: 49 6e 2c 20 6f 72 20 74 6f 20 74 68 65 20 27 5c  In, or to the '\
8730: 30 27 20 62 79 74 65 20 61 74 20 74 68 65 20 65  0' byte at the e
8740: 6e 64 20 6f 66 20 7a 49 6e 20 69 66 20 74 68 65  nd of zIn if the
8750: 72 65 20 69 73 20 6e 6f 0a 2a 2a 20 6e 65 78 74  re is no.** next
8760: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a   statement..**.*
8770: 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * If successful,
8780: 20 54 43 4c 5f 4f 4b 20 69 73 20 72 65 74 75 72   TCL_OK is retur
8790: 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ned. Otherwise, 
87a0: 54 43 4c 5f 45 52 52 4f 52 20 69 73 20 72 65 74  TCL_ERROR is ret
87b0: 75 72 6e 65 64 0a 2a 2a 20 61 6e 64 20 61 6e 20  urned.** and an 
87c0: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 6c 6f  error message lo
87d0: 61 64 65 64 20 69 6e 74 6f 20 69 6e 74 65 72 70  aded into interp
87e0: 72 65 74 65 72 20 70 44 62 2d 3e 69 6e 74 65 72  reter pDb->inter
87f0: 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  p..*/.static int
8800: 20 64 62 50 72 65 70 61 72 65 41 6e 64 42 69 6e   dbPrepareAndBin
8810: 64 28 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70  d(.  SqliteDb *p
8820: 44 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Db,             
8830: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
8840: 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 68 61   object */.  cha
8850: 72 20 63 6f 6e 73 74 20 2a 7a 49 6e 2c 20 20 20  r const *zIn,   
8860: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8870: 53 51 4c 20 74 6f 20 63 6f 6d 70 69 6c 65 20 2a  SQL to compile *
8880: 2f 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a  /.  char const *
8890: 2a 70 7a 4f 75 74 2c 20 20 20 20 20 20 20 20 20  *pzOut,         
88a0: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 50 6f 69 6e      /* OUT: Poin
88b0: 74 65 72 20 74 6f 20 6e 65 78 74 20 53 51 4c 20  ter to next SQL 
88c0: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 53  statement */.  S
88d0: 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74 20 2a  qlPreparedStmt *
88e0: 2a 70 70 50 72 65 53 74 6d 74 20 20 20 20 20 2f  *ppPreStmt     /
88f0: 2a 20 4f 55 54 3a 20 4f 62 6a 65 63 74 20 75 73  * OUT: Object us
8900: 65 64 20 74 6f 20 63 61 63 68 65 20 73 74 61 74  ed to cache stat
8910: 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 63 6f  ement */.){.  co
8920: 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d  nst char *zSql =
8930: 20 7a 49 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a   zIn;         /*
8940: 20 50 6f 69 6e 74 65 72 20 74 6f 20 66 69 72 73   Pointer to firs
8950: 74 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  t SQL statement 
8960: 69 6e 20 7a 49 6e 20 2a 2f 0a 20 20 73 71 6c 69  in zIn */.  sqli
8970: 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
8980: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
8990: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
89a0: 74 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 53 71  t object */.  Sq
89b0: 6c 50 72 65 70 61 72 65 64 53 74 6d 74 20 2a 70  lPreparedStmt *p
89c0: 50 72 65 53 74 6d 74 3b 20 20 20 20 20 20 2f 2a  PreStmt;      /*
89d0: 20 50 6f 69 6e 74 65 72 20 74 6f 20 63 61 63 68   Pointer to cach
89e0: 65 64 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  ed statement */.
89f0: 20 20 69 6e 74 20 6e 53 71 6c 3b 20 20 20 20 20    int nSql;     
8a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8a10: 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 7a    /* Length of z
8a20: 53 71 6c 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  Sql in bytes */.
8a30: 20 20 69 6e 74 20 6e 56 61 72 3b 20 20 20 20 20    int nVar;     
8a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8a50: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 76    /* Number of v
8a60: 61 72 69 61 62 6c 65 73 20 69 6e 20 73 74 61 74  ariables in stat
8a70: 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69  ement */.  int i
8a80: 50 61 72 6d 20 3d 20 30 3b 20 20 20 20 20 20 20  Parm = 0;       
8a90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
8aa0: 78 74 20 66 72 65 65 20 65 6e 74 72 79 20 69 6e  xt free entry in
8ab0: 20 61 70 50 61 72 6d 20 2a 2f 0a 20 20 69 6e 74   apParm */.  int
8ac0: 20 69 3b 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70   i;.  Tcl_Interp
8ad0: 20 2a 69 6e 74 65 72 70 20 3d 20 70 44 62 2d 3e   *interp = pDb->
8ae0: 69 6e 74 65 72 70 3b 0a 0a 20 20 2a 70 70 50 72  interp;..  *ppPr
8af0: 65 53 74 6d 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a  eStmt = 0;..  /*
8b00: 20 54 72 69 6d 20 73 70 61 63 65 73 20 66 72 6f   Trim spaces fro
8b10: 6d 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 7a  m the start of z
8b20: 53 71 6c 20 61 6e 64 20 63 61 6c 63 75 6c 61 74  Sql and calculat
8b30: 65 20 74 68 65 20 72 65 6d 61 69 6e 69 6e 67 20  e the remaining 
8b40: 6c 65 6e 67 74 68 2e 20 2a 2f 0a 20 20 77 68 69  length. */.  whi
8b50: 6c 65 28 20 69 73 73 70 61 63 65 28 7a 53 71 6c  le( isspace(zSql
8b60: 5b 30 5d 29 20 29 7b 20 7a 53 71 6c 2b 2b 3b 20  [0]) ){ zSql++; 
8b70: 7d 0a 20 20 6e 53 71 6c 20 3d 20 73 74 72 6c 65  }.  nSql = strle
8b80: 6e 33 30 28 7a 53 71 6c 29 3b 0a 0a 20 20 66 6f  n30(zSql);..  fo
8b90: 72 28 70 50 72 65 53 74 6d 74 20 3d 20 70 44 62  r(pPreStmt = pDb
8ba0: 2d 3e 73 74 6d 74 4c 69 73 74 3b 20 70 50 72 65  ->stmtList; pPre
8bb0: 53 74 6d 74 3b 20 70 50 72 65 53 74 6d 74 3d 70  Stmt; pPreStmt=p
8bc0: 50 72 65 53 74 6d 74 2d 3e 70 4e 65 78 74 29 7b  PreStmt->pNext){
8bd0: 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 50 72  .    int n = pPr
8be0: 65 53 74 6d 74 2d 3e 6e 53 71 6c 3b 0a 20 20 20  eStmt->nSql;.   
8bf0: 20 69 66 28 20 6e 53 71 6c 3e 3d 6e 20 0a 20 20   if( nSql>=n .  
8c00: 20 20 20 20 20 20 26 26 20 6d 65 6d 63 6d 70 28        && memcmp(
8c10: 70 50 72 65 53 74 6d 74 2d 3e 7a 53 71 6c 2c 20  pPreStmt->zSql, 
8c20: 7a 53 71 6c 2c 20 6e 29 3d 3d 30 0a 20 20 20 20  zSql, n)==0.    
8c30: 20 20 20 20 26 26 20 28 7a 53 71 6c 5b 6e 5d 3d      && (zSql[n]=
8c40: 3d 30 20 7c 7c 20 7a 53 71 6c 5b 6e 2d 31 5d 3d  =0 || zSql[n-1]=
8c50: 3d 27 3b 27 29 0a 20 20 20 20 29 7b 0a 20 20 20  =';').    ){.   
8c60: 20 20 20 70 53 74 6d 74 20 3d 20 70 50 72 65 53     pStmt = pPreS
8c70: 74 6d 74 2d 3e 70 53 74 6d 74 3b 0a 20 20 20 20  tmt->pStmt;.    
8c80: 20 20 2a 70 7a 4f 75 74 20 3d 20 26 7a 53 71 6c    *pzOut = &zSql
8c90: 5b 70 50 72 65 53 74 6d 74 2d 3e 6e 53 71 6c 5d  [pPreStmt->nSql]
8ca0: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57 68 65 6e  ;..      /* When
8cb0: 20 61 20 70 72 65 70 61 72 65 64 20 73 74 61 74   a prepared stat
8cc0: 65 6d 65 6e 74 20 69 73 20 66 6f 75 6e 64 2c 20  ement is found, 
8cd0: 75 6e 6c 69 6e 6b 20 69 74 20 66 72 6f 6d 20 74  unlink it from t
8ce0: 68 65 0a 20 20 20 20 20 20 2a 2a 20 63 61 63 68  he.      ** cach
8cf0: 65 20 6c 69 73 74 2e 20 20 49 74 20 77 69 6c 6c  e list.  It will
8d00: 20 6c 61 74 65 72 20 62 65 20 61 64 64 65 64 20   later be added 
8d10: 62 61 63 6b 20 74 6f 20 74 68 65 20 62 65 67 69  back to the begi
8d20: 6e 6e 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 6f  nning.      ** o
8d30: 66 20 74 68 65 20 63 61 63 68 65 20 6c 69 73 74  f the cache list
8d40: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6d 70   in order to imp
8d50: 6c 65 6d 65 6e 74 20 4c 52 55 20 72 65 70 6c 61  lement LRU repla
8d60: 63 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f  cement..      */
8d70: 0a 20 20 20 20 20 20 69 66 28 20 70 50 72 65 53  .      if( pPreS
8d80: 74 6d 74 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20  tmt->pPrev ){.  
8d90: 20 20 20 20 20 20 70 50 72 65 53 74 6d 74 2d 3e        pPreStmt->
8da0: 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70  pPrev->pNext = p
8db0: 50 72 65 53 74 6d 74 2d 3e 70 4e 65 78 74 3b 0a  PreStmt->pNext;.
8dc0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
8dd0: 20 20 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c 69       pDb->stmtLi
8de0: 73 74 20 3d 20 70 50 72 65 53 74 6d 74 2d 3e 70  st = pPreStmt->p
8df0: 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Next;.      }.  
8e00: 20 20 20 20 69 66 28 20 70 50 72 65 53 74 6d 74      if( pPreStmt
8e10: 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20  ->pNext ){.     
8e20: 20 20 20 70 50 72 65 53 74 6d 74 2d 3e 70 4e 65     pPreStmt->pNe
8e30: 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 50 72 65  xt->pPrev = pPre
8e40: 53 74 6d 74 2d 3e 70 50 72 65 76 3b 0a 20 20 20  Stmt->pPrev;.   
8e50: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
8e60: 20 20 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74 20    pDb->stmtLast 
8e70: 3d 20 70 50 72 65 53 74 6d 74 2d 3e 70 50 72 65  = pPreStmt->pPre
8e80: 76 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  v;.      }.     
8e90: 20 70 44 62 2d 3e 6e 53 74 6d 74 2d 2d 3b 0a 20   pDb->nStmt--;. 
8ea0: 20 20 20 20 20 6e 56 61 72 20 3d 20 73 71 6c 69       nVar = sqli
8eb0: 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74  te3_bind_paramet
8ec0: 65 72 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29 3b  er_count(pStmt);
8ed0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
8ee0: 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20    }.  }.  .  /* 
8ef0: 49 66 20 6e 6f 20 70 72 65 70 61 72 65 64 20 73  If no prepared s
8f00: 74 61 74 65 6d 65 6e 74 20 77 61 73 20 66 6f 75  tatement was fou
8f10: 6e 64 2e 20 43 6f 6d 70 69 6c 65 20 74 68 65 20  nd. Compile the 
8f20: 53 51 4c 20 74 65 78 74 2e 20 41 6c 73 6f 20 61  SQL text. Also a
8f30: 6c 6c 6f 63 61 74 65 0a 20 20 2a 2a 20 61 20 6e  llocate.  ** a n
8f40: 65 77 20 53 71 6c 50 72 65 70 61 72 65 64 53 74  ew SqlPreparedSt
8f50: 6d 74 20 73 74 72 75 63 74 75 72 65 2e 20 20 2a  mt structure.  *
8f60: 2f 0a 20 20 69 66 28 20 70 50 72 65 53 74 6d 74  /.  if( pPreStmt
8f70: 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e  ==0 ){.    int n
8f80: 42 79 74 65 3b 0a 0a 20 20 20 20 69 66 28 20 53  Byte;..    if( S
8f90: 51 4c 49 54 45 5f 4f 4b 21 3d 64 62 50 72 65 70  QLITE_OK!=dbPrep
8fa0: 61 72 65 28 70 44 62 2c 20 7a 53 71 6c 2c 20 26  are(pDb, zSql, &
8fb0: 70 53 74 6d 74 2c 20 70 7a 4f 75 74 29 20 29 7b  pStmt, pzOut) ){
8fc0: 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62  .      Tcl_SetOb
8fd0: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
8fe0: 64 62 54 65 78 74 54 6f 4f 62 6a 28 73 71 6c 69  dbTextToObj(sqli
8ff0: 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e  te3_errmsg(pDb->
9000: 64 62 29 29 29 3b 0a 20 20 20 20 20 20 72 65 74  db)));.      ret
9010: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
9020: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 53 74     }.    if( pSt
9030: 6d 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  mt==0 ){.      i
9040: 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71  f( SQLITE_OK!=sq
9050: 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28 70 44  lite3_errcode(pD
9060: 62 2d 3e 64 62 29 20 29 7b 0a 20 20 20 20 20 20  b->db) ){.      
9070: 20 20 2f 2a 20 41 20 63 6f 6d 70 69 6c 65 2d 74    /* A compile-t
9080: 69 6d 65 20 65 72 72 6f 72 20 69 6e 20 74 68 65  ime error in the
9090: 20 73 74 61 74 65 6d 65 6e 74 2e 20 2a 2f 0a 20   statement. */. 
90a0: 20 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62         Tcl_SetOb
90b0: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
90c0: 64 62 54 65 78 74 54 6f 4f 62 6a 28 73 71 6c 69  dbTextToObj(sqli
90d0: 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e  te3_errmsg(pDb->
90e0: 64 62 29 29 29 3b 0a 20 20 20 20 20 20 20 20 72  db)));.        r
90f0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
9100: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
9110: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 74 61        /* The sta
9120: 74 65 6d 65 6e 74 20 77 61 73 20 61 20 6e 6f 2d  tement was a no-
9130: 6f 70 2e 20 20 43 6f 6e 74 69 6e 75 65 20 74 6f  op.  Continue to
9140: 20 74 68 65 20 6e 65 78 74 20 73 74 61 74 65 6d   the next statem
9150: 65 6e 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  ent.        ** i
9160: 6e 20 74 68 65 20 53 51 4c 20 73 74 72 69 6e 67  n the SQL string
9170: 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
9180: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
9190: 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OK;.      }.    
91a0: 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  }..    assert( p
91b0: 50 72 65 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20  PreStmt==0 );.  
91c0: 20 20 6e 56 61 72 20 3d 20 73 71 6c 69 74 65 33    nVar = sqlite3
91d0: 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f  _bind_parameter_
91e0: 63 6f 75 6e 74 28 70 53 74 6d 74 29 3b 0a 20 20  count(pStmt);.  
91f0: 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66    nByte = sizeof
9200: 28 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74  (SqlPreparedStmt
9210: 29 20 2b 20 6e 56 61 72 2a 73 69 7a 65 6f 66 28  ) + nVar*sizeof(
9220: 54 63 6c 5f 4f 62 6a 20 2a 29 3b 0a 20 20 20 20  Tcl_Obj *);.    
9230: 70 50 72 65 53 74 6d 74 20 3d 20 28 53 71 6c 50  pPreStmt = (SqlP
9240: 72 65 70 61 72 65 64 53 74 6d 74 2a 29 54 63 6c  reparedStmt*)Tcl
9250: 5f 41 6c 6c 6f 63 28 6e 42 79 74 65 29 3b 0a 20  _Alloc(nByte);. 
9260: 20 20 20 6d 65 6d 73 65 74 28 70 50 72 65 53 74     memset(pPreSt
9270: 6d 74 2c 20 30 2c 20 6e 42 79 74 65 29 3b 0a 0a  mt, 0, nByte);..
9280: 20 20 20 20 70 50 72 65 53 74 6d 74 2d 3e 70 53      pPreStmt->pS
9290: 74 6d 74 20 3d 20 70 53 74 6d 74 3b 0a 20 20 20  tmt = pStmt;.   
92a0: 20 70 50 72 65 53 74 6d 74 2d 3e 6e 53 71 6c 20   pPreStmt->nSql 
92b0: 3d 20 28 2a 70 7a 4f 75 74 20 2d 20 7a 53 71 6c  = (*pzOut - zSql
92c0: 29 3b 0a 20 20 20 20 70 50 72 65 53 74 6d 74 2d  );.    pPreStmt-
92d0: 3e 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f  >zSql = sqlite3_
92e0: 73 71 6c 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  sql(pStmt);.    
92f0: 70 50 72 65 53 74 6d 74 2d 3e 61 70 50 61 72 6d  pPreStmt->apParm
9300: 20 3d 20 28 54 63 6c 5f 4f 62 6a 20 2a 2a 29 26   = (Tcl_Obj **)&
9310: 70 50 72 65 53 74 6d 74 5b 31 5d 3b 0a 23 69 66  pPreStmt[1];.#if
9320: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
9330: 20 20 20 20 69 66 28 20 70 50 72 65 53 74 6d 74      if( pPreStmt
9340: 2d 3e 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20  ->zSql==0 ){.   
9350: 20 20 20 63 68 61 72 20 2a 7a 43 6f 70 79 20 3d     char *zCopy =
9360: 20 54 63 6c 5f 41 6c 6c 6f 63 28 70 50 72 65 53   Tcl_Alloc(pPreS
9370: 74 6d 74 2d 3e 6e 53 71 6c 20 2b 20 31 29 3b 0a  tmt->nSql + 1);.
9380: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 43 6f        memcpy(zCo
9390: 70 79 2c 20 7a 53 71 6c 2c 20 70 50 72 65 53 74  py, zSql, pPreSt
93a0: 6d 74 2d 3e 6e 53 71 6c 29 3b 0a 20 20 20 20 20  mt->nSql);.     
93b0: 20 7a 43 6f 70 79 5b 70 50 72 65 53 74 6d 74 2d   zCopy[pPreStmt-
93c0: 3e 6e 53 71 6c 5d 20 3d 20 27 5c 30 27 3b 0a 20  >nSql] = '\0';. 
93d0: 20 20 20 20 20 70 50 72 65 53 74 6d 74 2d 3e 7a       pPreStmt->z
93e0: 53 71 6c 20 3d 20 7a 43 6f 70 79 3b 0a 20 20 20  Sql = zCopy;.   
93f0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20   }.#endif.  }.  
9400: 61 73 73 65 72 74 28 20 70 50 72 65 53 74 6d 74  assert( pPreStmt
9410: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 74   );.  assert( st
9420: 72 6c 65 6e 33 30 28 70 50 72 65 53 74 6d 74 2d  rlen30(pPreStmt-
9430: 3e 7a 53 71 6c 29 3d 3d 70 50 72 65 53 74 6d 74  >zSql)==pPreStmt
9440: 2d 3e 6e 53 71 6c 20 29 3b 0a 20 20 61 73 73 65  ->nSql );.  asse
9450: 72 74 28 20 30 3d 3d 6d 65 6d 63 6d 70 28 70 50  rt( 0==memcmp(pP
9460: 72 65 53 74 6d 74 2d 3e 7a 53 71 6c 2c 20 7a 53  reStmt->zSql, zS
9470: 71 6c 2c 20 70 50 72 65 53 74 6d 74 2d 3e 6e 53  ql, pPreStmt->nS
9480: 71 6c 29 20 29 3b 0a 0a 20 20 2f 2a 20 42 69 6e  ql) );..  /* Bin
9490: 64 20 76 61 6c 75 65 73 20 74 6f 20 70 61 72 61  d values to para
94a0: 6d 65 74 65 72 73 20 74 68 61 74 20 62 65 67 69  meters that begi
94b0: 6e 20 77 69 74 68 20 24 20 6f 72 20 3a 20 2a 2f  n with $ or : */
94c0: 20 20 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c    .  for(i=1; i<
94d0: 3d 6e 56 61 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  =nVar; i++){.   
94e0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 61   const char *zVa
94f0: 72 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  r = sqlite3_bind
9500: 5f 70 61 72 61 6d 65 74 65 72 5f 6e 61 6d 65 28  _parameter_name(
9510: 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 69  pStmt, i);.    i
9520: 66 28 20 7a 56 61 72 21 3d 30 20 26 26 20 28 7a  f( zVar!=0 && (z
9530: 56 61 72 5b 30 5d 3d 3d 27 24 27 20 7c 7c 20 7a  Var[0]=='$' || z
9540: 56 61 72 5b 30 5d 3d 3d 27 3a 27 20 7c 7c 20 7a  Var[0]==':' || z
9550: 56 61 72 5b 30 5d 3d 3d 27 40 27 29 20 29 7b 0a  Var[0]=='@') ){.
9560: 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70        Tcl_Obj *p
9570: 56 61 72 20 3d 20 54 63 6c 5f 47 65 74 56 61 72  Var = Tcl_GetVar
9580: 32 45 78 28 69 6e 74 65 72 70 2c 20 26 7a 56 61  2Ex(interp, &zVa
9590: 72 5b 31 5d 2c 20 30 2c 20 30 29 3b 0a 20 20 20  r[1], 0, 0);.   
95a0: 20 20 20 69 66 28 20 70 56 61 72 20 29 7b 0a 20     if( pVar ){. 
95b0: 20 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20         int n;.  
95c0: 20 20 20 20 20 20 75 38 20 2a 64 61 74 61 3b 0a        u8 *data;.
95d0: 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
95e0: 61 72 20 2a 7a 54 79 70 65 20 3d 20 28 70 56 61  ar *zType = (pVa
95f0: 72 2d 3e 74 79 70 65 50 74 72 20 3f 20 70 56 61  r->typePtr ? pVa
9600: 72 2d 3e 74 79 70 65 50 74 72 2d 3e 6e 61 6d 65  r->typePtr->name
9610: 20 3a 20 22 22 29 3b 0a 20 20 20 20 20 20 20 20   : "");.        
9620: 63 68 61 72 20 63 20 3d 20 7a 54 79 70 65 5b 30  char c = zType[0
9630: 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a  ];.        if( z
9640: 56 61 72 5b 30 5d 3d 3d 27 40 27 20 7c 7c 0a 20  Var[0]=='@' ||. 
9650: 20 20 20 20 20 20 20 20 20 20 28 63 3d 3d 27 62            (c=='b
9660: 27 20 26 26 20 73 74 72 63 6d 70 28 7a 54 79 70  ' && strcmp(zTyp
9670: 65 2c 22 62 79 74 65 61 72 72 61 79 22 29 3d 3d  e,"bytearray")==
9680: 30 20 26 26 20 70 56 61 72 2d 3e 62 79 74 65 73  0 && pVar->bytes
9690: 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ==0) ){.        
96a0: 20 20 2f 2a 20 4c 6f 61 64 20 61 20 42 4c 4f 42    /* Load a BLOB
96b0: 20 74 79 70 65 20 69 66 20 74 68 65 20 54 63 6c   type if the Tcl
96c0: 20 76 61 72 69 61 62 6c 65 20 69 73 20 61 20 62   variable is a b
96d0: 79 74 65 61 72 72 61 79 20 61 6e 64 0a 20 20 20  ytearray and.   
96e0: 20 20 20 20 20 20 20 2a 2a 20 69 74 20 68 61 73         ** it has
96f0: 20 6e 6f 20 73 74 72 69 6e 67 20 72 65 70 72 65   no string repre
9700: 73 65 6e 74 61 74 69 6f 6e 20 6f 72 20 74 68 65  sentation or the
9710: 20 68 6f 73 74 0a 20 20 20 20 20 20 20 20 20 20   host.          
9720: 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 6e 61 6d  ** parameter nam
9730: 65 20 62 65 67 69 6e 73 20 77 69 74 68 20 22 40  e begins with "@
9740: 22 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ". */.          
9750: 64 61 74 61 20 3d 20 54 63 6c 5f 47 65 74 42 79  data = Tcl_GetBy
9760: 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 70  teArrayFromObj(p
9770: 56 61 72 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20  Var, &n);.      
9780: 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
9790: 5f 62 6c 6f 62 28 70 53 74 6d 74 2c 20 69 2c 20  _blob(pStmt, i, 
97a0: 64 61 74 61 2c 20 6e 2c 20 53 51 4c 49 54 45 5f  data, n, SQLITE_
97b0: 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 20  STATIC);.       
97c0: 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f     Tcl_IncrRefCo
97d0: 75 6e 74 28 70 56 61 72 29 3b 0a 20 20 20 20 20  unt(pVar);.     
97e0: 20 20 20 20 20 70 50 72 65 53 74 6d 74 2d 3e 61       pPreStmt->a
97f0: 70 50 61 72 6d 5b 69 50 61 72 6d 2b 2b 5d 20 3d  pParm[iParm++] =
9800: 20 70 56 61 72 3b 0a 20 20 20 20 20 20 20 20 7d   pVar;.        }
9810: 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 62 27 20  else if( c=='b' 
9820: 26 26 20 73 74 72 63 6d 70 28 7a 54 79 70 65 2c  && strcmp(zType,
9830: 22 62 6f 6f 6c 65 61 6e 22 29 3d 3d 30 20 29 7b  "boolean")==0 ){
9840: 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 47  .          Tcl_G
9850: 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
9860: 65 72 70 2c 20 70 56 61 72 2c 20 26 6e 29 3b 0a  erp, pVar, &n);.
9870: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
9880: 33 5f 62 69 6e 64 5f 69 6e 74 28 70 53 74 6d 74  3_bind_int(pStmt
9890: 2c 20 69 2c 20 6e 29 3b 0a 20 20 20 20 20 20 20  , i, n);.       
98a0: 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 64   }else if( c=='d
98b0: 27 20 26 26 20 73 74 72 63 6d 70 28 7a 54 79 70  ' && strcmp(zTyp
98c0: 65 2c 22 64 6f 75 62 6c 65 22 29 3d 3d 30 20 29  e,"double")==0 )
98d0: 7b 0a 20 20 20 20 20 20 20 20 20 20 64 6f 75 62  {.          doub
98e0: 6c 65 20 72 3b 0a 20 20 20 20 20 20 20 20 20 20  le r;.          
98f0: 54 63 6c 5f 47 65 74 44 6f 75 62 6c 65 46 72 6f  Tcl_GetDoubleFro
9900: 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 70 56 61  mObj(interp, pVa
9910: 72 2c 20 26 72 29 3b 0a 20 20 20 20 20 20 20 20  r, &r);.        
9920: 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 64    sqlite3_bind_d
9930: 6f 75 62 6c 65 28 70 53 74 6d 74 2c 20 69 2c 20  ouble(pStmt, i, 
9940: 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  r);.        }els
9950: 65 20 69 66 28 20 28 63 3d 3d 27 77 27 20 26 26  e if( (c=='w' &&
9960: 20 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22 77   strcmp(zType,"w
9970: 69 64 65 49 6e 74 22 29 3d 3d 30 29 20 7c 7c 0a  ideInt")==0) ||.
9980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
9990: 3d 3d 27 69 27 20 26 26 20 73 74 72 63 6d 70 28  =='i' && strcmp(
99a0: 7a 54 79 70 65 2c 22 69 6e 74 22 29 3d 3d 30 29  zType,"int")==0)
99b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54 63   ){.          Tc
99c0: 6c 5f 57 69 64 65 49 6e 74 20 76 3b 0a 20 20 20  l_WideInt v;.   
99d0: 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 57 69         Tcl_GetWi
99e0: 64 65 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  deIntFromObj(int
99f0: 65 72 70 2c 20 70 56 61 72 2c 20 26 76 29 3b 0a  erp, pVar, &v);.
9a00: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
9a10: 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 53 74  3_bind_int64(pSt
9a20: 6d 74 2c 20 69 2c 20 76 29 3b 0a 20 20 20 20 20  mt, i, v);.     
9a30: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
9a40: 20 20 20 20 64 61 74 61 20 3d 20 28 75 6e 73 69      data = (unsi
9a50: 67 6e 65 64 20 63 68 61 72 20 2a 29 54 63 6c 5f  gned char *)Tcl_
9a60: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
9a70: 28 70 56 61 72 2c 20 26 6e 29 3b 0a 20 20 20 20  (pVar, &n);.    
9a80: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69        sqlite3_bi
9a90: 6e 64 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 69  nd_text(pStmt, i
9aa0: 2c 20 28 63 68 61 72 20 2a 29 64 61 74 61 2c 20  , (char *)data, 
9ab0: 6e 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43  n, SQLITE_STATIC
9ac0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c  );.          Tcl
9ad0: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 56  _IncrRefCount(pV
9ae0: 61 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  ar);.          p
9af0: 50 72 65 53 74 6d 74 2d 3e 61 70 50 61 72 6d 5b  PreStmt->apParm[
9b00: 69 50 61 72 6d 2b 2b 5d 20 3d 20 70 56 61 72 3b  iParm++] = pVar;
9b10: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
9b20: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
9b30: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c  sqlite3_bind_nul
9b40: 6c 28 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20  l(pStmt, i);.   
9b50: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
9b60: 20 70 50 72 65 53 74 6d 74 2d 3e 6e 50 61 72 6d   pPreStmt->nParm
9b70: 20 3d 20 69 50 61 72 6d 3b 0a 20 20 2a 70 70 50   = iParm;.  *ppP
9b80: 72 65 53 74 6d 74 20 3d 20 70 50 72 65 53 74 6d  reStmt = pPreStm
9b90: 74 3b 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  t;..  return TCL
9ba0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  _OK;.}../*.** Re
9bb0: 6c 65 61 73 65 20 61 20 73 74 61 74 65 6d 65 6e  lease a statemen
9bc0: 74 20 72 65 66 65 72 65 6e 63 65 20 6f 62 74 61  t reference obta
9bd0: 69 6e 65 64 20 62 79 20 63 61 6c 6c 69 6e 67 20  ined by calling 
9be0: 64 62 50 72 65 70 61 72 65 41 6e 64 42 69 6e 64  dbPrepareAndBind
9bf0: 28 29 2e 0a 2a 2a 20 54 68 65 72 65 20 73 68 6f  ()..** There sho
9c00: 75 6c 64 20 62 65 20 65 78 61 63 74 6c 79 20 6f  uld be exactly o
9c10: 6e 65 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20  ne call to this 
9c20: 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 65 61 63  function for eac
9c30: 68 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20 64 62 50  h call to.** dbP
9c40: 72 65 70 61 72 65 41 6e 64 42 69 6e 64 28 29 2e  repareAndBind().
9c50: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 69  .**.** If the di
9c60: 73 63 61 72 64 20 70 61 72 61 6d 65 74 65 72 20  scard parameter 
9c70: 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
9c80: 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  n the statement 
9c90: 69 73 20 64 65 6c 65 74 65 64 0a 2a 2a 20 69 6d  is deleted.** im
9ca0: 6d 65 64 69 61 74 65 6c 79 2e 20 4f 74 68 65 72  mediately. Other
9cb0: 77 69 73 65 20 69 74 20 69 73 20 61 64 64 65 64  wise it is added
9cc0: 20 74 6f 20 74 68 65 20 4c 52 55 20 6c 69 73 74   to the LRU list
9cd0: 20 61 6e 64 20 6d 61 79 20 62 65 20 72 65 74 75   and may be retu
9ce0: 72 6e 65 64 0a 2a 2a 20 62 79 20 61 20 73 75 62  rned.** by a sub
9cf0: 73 65 71 75 65 6e 74 20 63 61 6c 6c 20 74 6f 20  sequent call to 
9d00: 64 62 50 72 65 70 61 72 65 41 6e 64 42 69 6e 64  dbPrepareAndBind
9d10: 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ()..*/.static vo
9d20: 69 64 20 64 62 52 65 6c 65 61 73 65 53 74 6d 74  id dbReleaseStmt
9d30: 28 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44  (.  SqliteDb *pD
9d40: 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
9d50: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
9d60: 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 53 71 6c 50  handle */.  SqlP
9d70: 72 65 70 61 72 65 64 53 74 6d 74 20 2a 70 50 72  reparedStmt *pPr
9d80: 65 53 74 6d 74 2c 20 20 20 20 20 20 2f 2a 20 50  eStmt,      /* P
9d90: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
9da0: 74 20 68 61 6e 64 6c 65 20 74 6f 20 72 65 6c 65  t handle to rele
9db0: 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 64 69 73  ase */.  int dis
9dc0: 63 61 72 64 20 20 20 20 20 20 20 20 20 20 20 20  card            
9dd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
9de0: 20 74 6f 20 64 65 6c 65 74 65 20 28 6e 6f 74 20   to delete (not 
9df0: 63 61 63 68 65 29 20 74 68 65 20 70 50 72 65 53  cache) the pPreS
9e00: 74 6d 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  tmt */.){.  int 
9e10: 69 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20 74 68  i;..  /* Free th
9e20: 65 20 62 6f 75 6e 64 20 73 74 72 69 6e 67 20 61  e bound string a
9e30: 6e 64 20 62 6c 6f 62 20 70 61 72 61 6d 65 74 65  nd blob paramete
9e40: 72 73 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  rs */.  for(i=0;
9e50: 20 69 3c 70 50 72 65 53 74 6d 74 2d 3e 6e 50 61   i<pPreStmt->nPa
9e60: 72 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 54 63  rm; i++){.    Tc
9e70: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70  l_DecrRefCount(p
9e80: 50 72 65 53 74 6d 74 2d 3e 61 70 50 61 72 6d 5b  PreStmt->apParm[
9e90: 69 5d 29 3b 0a 20 20 7d 0a 20 20 70 50 72 65 53  i]);.  }.  pPreS
9ea0: 74 6d 74 2d 3e 6e 50 61 72 6d 20 3d 20 30 3b 0a  tmt->nParm = 0;.
9eb0: 0a 20 20 69 66 28 20 70 44 62 2d 3e 6d 61 78 53  .  if( pDb->maxS
9ec0: 74 6d 74 3c 3d 30 20 7c 7c 20 64 69 73 63 61 72  tmt<=0 || discar
9ed0: 64 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  d ){.    /* If t
9ee0: 68 65 20 63 61 63 68 65 20 69 73 20 74 75 72 6e  he cache is turn
9ef0: 65 64 20 6f 66 66 2c 20 64 65 61 6c 6c 6f 63 61  ed off, dealloca
9f00: 74 65 64 20 74 68 65 20 73 74 61 74 65 6d 65 6e  ted the statemen
9f10: 74 20 2a 2f 0a 20 20 20 20 64 62 46 72 65 65 53  t */.    dbFreeS
9f20: 74 6d 74 28 70 50 72 65 53 74 6d 74 29 3b 0a 20  tmt(pPreStmt);. 
9f30: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 41   }else{.    /* A
9f40: 64 64 20 74 68 65 20 70 72 65 70 61 72 65 64 20  dd the prepared 
9f50: 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 74 68 65  statement to the
9f60: 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68   beginning of th
9f70: 65 20 63 61 63 68 65 20 6c 69 73 74 2e 20 2a 2f  e cache list. */
9f80: 0a 20 20 20 20 70 50 72 65 53 74 6d 74 2d 3e 70  .    pPreStmt->p
9f90: 4e 65 78 74 20 3d 20 70 44 62 2d 3e 73 74 6d 74  Next = pDb->stmt
9fa0: 4c 69 73 74 3b 0a 20 20 20 20 70 50 72 65 53 74  List;.    pPreSt
9fb0: 6d 74 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20  mt->pPrev = 0;. 
9fc0: 20 20 20 69 66 28 20 70 44 62 2d 3e 73 74 6d 74     if( pDb->stmt
9fd0: 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 70 44 62  List ){.     pDb
9fe0: 2d 3e 73 74 6d 74 4c 69 73 74 2d 3e 70 50 72 65  ->stmtList->pPre
9ff0: 76 20 3d 20 70 50 72 65 53 74 6d 74 3b 0a 20 20  v = pPreStmt;.  
a000: 20 20 7d 0a 20 20 20 20 70 44 62 2d 3e 73 74 6d    }.    pDb->stm
a010: 74 4c 69 73 74 20 3d 20 70 50 72 65 53 74 6d 74  tList = pPreStmt
a020: 3b 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e 73  ;.    if( pDb->s
a030: 74 6d 74 4c 61 73 74 3d 3d 30 20 29 7b 0a 20 20  tmtLast==0 ){.  
a040: 20 20 20 20 61 73 73 65 72 74 28 20 70 44 62 2d      assert( pDb-
a050: 3e 6e 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 20  >nStmt==0 );.   
a060: 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74     pDb->stmtLast
a070: 20 3d 20 70 50 72 65 53 74 6d 74 3b 0a 20 20 20   = pPreStmt;.   
a080: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
a090: 73 65 72 74 28 20 70 44 62 2d 3e 6e 53 74 6d 74  sert( pDb->nStmt
a0a0: 3e 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  >0 );.    }.    
a0b0: 70 44 62 2d 3e 6e 53 74 6d 74 2b 2b 3b 0a 20 20  pDb->nStmt++;.  
a0c0: 20 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20 68   .    /* If we h
a0d0: 61 76 65 20 74 6f 6f 20 6d 61 6e 79 20 73 74 61  ave too many sta
a0e0: 74 65 6d 65 6e 74 20 69 6e 20 63 61 63 68 65 2c  tement in cache,
a0f0: 20 72 65 6d 6f 76 65 20 74 68 65 20 73 75 72 70   remove the surp
a100: 6c 75 73 20 66 72 6f 6d 20 0a 20 20 20 20 2a 2a  lus from .    **
a110: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
a120: 63 61 63 68 65 20 6c 69 73 74 2e 20 20 2a 2f 0a  cache list.  */.
a130: 20 20 20 20 77 68 69 6c 65 28 20 70 44 62 2d 3e      while( pDb->
a140: 6e 53 74 6d 74 3e 70 44 62 2d 3e 6d 61 78 53 74  nStmt>pDb->maxSt
a150: 6d 74 20 29 7b 0a 20 20 20 20 20 20 53 71 6c 50  mt ){.      SqlP
a160: 72 65 70 61 72 65 64 53 74 6d 74 20 2a 70 4c 61  reparedStmt *pLa
a170: 73 74 20 3d 20 70 44 62 2d 3e 73 74 6d 74 4c 61  st = pDb->stmtLa
a180: 73 74 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e 73  st;.      pDb->s
a190: 74 6d 74 4c 61 73 74 20 3d 20 70 4c 61 73 74 2d  tmtLast = pLast-
a1a0: 3e 70 50 72 65 76 3b 0a 20 20 20 20 20 20 70 44  >pPrev;.      pD
a1b0: 62 2d 3e 73 74 6d 74 4c 61 73 74 2d 3e 70 4e 65  b->stmtLast->pNe
a1c0: 78 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 44  xt = 0;.      pD
a1d0: 62 2d 3e 6e 53 74 6d 74 2d 2d 3b 0a 20 20 20 20  b->nStmt--;.    
a1e0: 20 20 64 62 46 72 65 65 53 74 6d 74 28 70 4c 61    dbFreeStmt(pLa
a1f0: 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  st);.    }.  }.}
a200: 0a 0a 2f 2a 0a 2a 2a 20 53 74 72 75 63 74 75 72  ../*.** Structur
a210: 65 20 75 73 65 64 20 77 69 74 68 20 64 62 45 76  e used with dbEv
a220: 61 6c 58 58 58 28 29 20 66 75 6e 63 74 69 6f 6e  alXXX() function
a230: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 64 62 45 76 61  s:.**.**   dbEva
a240: 6c 49 6e 69 74 28 29 0a 2a 2a 20 20 20 64 62 45  lInit().**   dbE
a250: 76 61 6c 53 74 65 70 28 29 0a 2a 2a 20 20 20 64  valStep().**   d
a260: 62 45 76 61 6c 46 69 6e 61 6c 69 7a 65 28 29 0a  bEvalFinalize().
a270: 2a 2a 20 20 20 64 62 45 76 61 6c 52 6f 77 49 6e  **   dbEvalRowIn
a280: 66 6f 28 29 0a 2a 2a 20 20 20 64 62 45 76 61 6c  fo().**   dbEval
a290: 43 6f 6c 75 6d 6e 56 61 6c 75 65 28 29 0a 2a 2f  ColumnValue().*/
a2a0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
a2b0: 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 20 44 62  DbEvalContext Db
a2c0: 45 76 61 6c 43 6f 6e 74 65 78 74 3b 0a 73 74 72  EvalContext;.str
a2d0: 75 63 74 20 44 62 45 76 61 6c 43 6f 6e 74 65 78  uct DbEvalContex
a2e0: 74 20 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a  t {.  SqliteDb *
a2f0: 70 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  pDb;            
a300: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
a310: 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 54 63  e handle */.  Tc
a320: 6c 5f 4f 62 6a 20 2a 70 53 71 6c 3b 20 20 20 20  l_Obj *pSql;    
a330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a340: 20 4f 62 6a 65 63 74 20 68 6f 6c 64 69 6e 67 20   Object holding 
a350: 73 74 72 69 6e 67 20 7a 53 71 6c 20 2a 2f 0a 20  string zSql */. 
a360: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71   const char *zSq
a370: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
a380: 20 2f 2a 20 52 65 6d 61 69 6e 69 6e 67 20 53 51   /* Remaining SQ
a390: 4c 20 74 6f 20 65 78 65 63 75 74 65 20 2a 2f 0a  L to execute */.
a3a0: 20 20 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d    SqlPreparedStm
a3b0: 74 20 2a 70 50 72 65 53 74 6d 74 3b 20 20 20 20  t *pPreStmt;    
a3c0: 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 73 74 61    /* Current sta
a3d0: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  tement */.  int 
a3e0: 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20  nCol;           
a3f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
a400: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
a410: 20 72 65 74 75 72 6e 65 64 20 62 79 20 70 53 74   returned by pSt
a420: 6d 74 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  mt */.  Tcl_Obj 
a430: 2a 70 41 72 72 61 79 3b 20 20 20 20 20 20 20 20  *pArray;        
a440: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
a450: 6f 66 20 61 72 72 61 79 20 76 61 72 69 61 62 6c  of array variabl
a460: 65 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  e */.  Tcl_Obj *
a470: 2a 61 70 43 6f 6c 4e 61 6d 65 3b 20 20 20 20 20  *apColName;     
a480: 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20         /* Array 
a490: 6f 66 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  of column names 
a4a0: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c  */.};../*.** Rel
a4b0: 65 61 73 65 20 61 6e 79 20 63 61 63 68 65 20 6f  ease any cache o
a4c0: 66 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 63  f column names c
a4d0: 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 20 61 73  urrently held as
a4e0: 20 70 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20   part of.** the 
a4f0: 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 20 73 74  DbEvalContext st
a500: 72 75 63 74 75 72 65 20 70 61 73 73 65 64 20 61  ructure passed a
a510: 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  s the first argu
a520: 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ment..*/.static 
a530: 76 6f 69 64 20 64 62 52 65 6c 65 61 73 65 43 6f  void dbReleaseCo
a540: 6c 75 6d 6e 4e 61 6d 65 73 28 44 62 45 76 61 6c  lumnNames(DbEval
a550: 43 6f 6e 74 65 78 74 20 2a 70 29 7b 0a 20 20 69  Context *p){.  i
a560: 66 28 20 70 2d 3e 61 70 43 6f 6c 4e 61 6d 65 20  f( p->apColName 
a570: 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
a580: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
a590: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
a5a0: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
a5b0: 6e 74 28 70 2d 3e 61 70 43 6f 6c 4e 61 6d 65 5b  nt(p->apColName[
a5c0: 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54  i]);.    }.    T
a5d0: 63 6c 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29  cl_Free((char *)
a5e0: 70 2d 3e 61 70 43 6f 6c 4e 61 6d 65 29 3b 0a 20  p->apColName);. 
a5f0: 20 20 20 70 2d 3e 61 70 43 6f 6c 4e 61 6d 65 20     p->apColName 
a600: 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6e 43  = 0;.  }.  p->nC
a610: 6f 6c 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ol = 0;.}../*.**
a620: 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 20 44 62   Initialize a Db
a630: 45 76 61 6c 43 6f 6e 74 65 78 74 20 73 74 72 75  EvalContext stru
a640: 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  cture..**.** If 
a650: 70 41 72 72 61 79 20 69 73 20 6e 6f 74 20 4e 55  pArray is not NU
a660: 4c 4c 2c 20 74 68 65 6e 20 69 74 20 63 6f 6e 74  LL, then it cont
a670: 61 69 6e 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  ains the name of
a680: 20 61 20 54 63 6c 20 61 72 72 61 79 0a 2a 2a 20   a Tcl array.** 
a690: 76 61 72 69 61 62 6c 65 2e 20 54 68 65 20 22 2a  variable. The "*
a6a0: 22 20 6d 65 6d 62 65 72 20 6f 66 20 74 68 69 73  " member of this
a6b0: 20 61 72 72 61 79 20 69 73 20 73 65 74 20 74 6f   array is set to
a6c0: 20 61 20 6c 69 73 74 20 63 6f 6e 74 61 69 6e 69   a list containi
a6d0: 6e 67 0a 2a 2a 20 74 68 65 20 6e 61 6d 65 73 20  ng.** the names 
a6e0: 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 72  of the columns r
a6f0: 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 73  eturned by the s
a700: 74 61 74 65 6d 65 6e 74 20 61 73 20 70 61 72 74  tatement as part
a710: 20 6f 66 20 65 61 63 68 0a 2a 2a 20 63 61 6c 6c   of each.** call
a720: 20 74 6f 20 64 62 45 76 61 6c 53 74 65 70 28 29   to dbEvalStep()
a730: 2c 20 69 6e 20 6f 72 64 65 72 20 66 72 6f 6d 20  , in order from 
a740: 6c 65 66 74 20 74 6f 20 72 69 67 68 74 2e 20 65  left to right. e
a750: 2e 67 2e 20 69 66 20 74 68 65 20 6e 61 6d 65 73  .g. if the names
a760: 20 0a 2a 2a 20 6f 66 20 74 68 65 20 72 65 74 75   .** of the retu
a770: 72 6e 65 64 20 63 6f 6c 75 6d 6e 73 20 61 72 65  rned columns are
a780: 20 61 2c 20 62 20 61 6e 64 20 63 2c 20 69 74 20   a, b and c, it 
a790: 64 6f 65 73 20 74 68 65 20 65 71 75 69 76 61 6c  does the equival
a7a0: 65 6e 74 20 6f 66 20 74 68 65 20 0a 2a 2a 20 74  ent of the .** t
a7b0: 63 6c 20 63 6f 6d 6d 61 6e 64 3a 0a 2a 2a 0a 2a  cl command:.**.*
a7c0: 2a 20 20 20 20 20 73 65 74 20 24 7b 70 41 72 72  *     set ${pArr
a7d0: 61 79 7d 28 2a 29 20 7b 61 20 62 20 63 7d 0a 2a  ay}(*) {a b c}.*
a7e0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 62  /.static void db
a7f0: 45 76 61 6c 49 6e 69 74 28 0a 20 20 44 62 45 76  EvalInit(.  DbEv
a800: 61 6c 43 6f 6e 74 65 78 74 20 2a 70 2c 20 20 20  alContext *p,   
a810: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
a820: 6f 69 6e 74 65 72 20 74 6f 20 73 74 72 75 63 74  ointer to struct
a830: 75 72 65 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a  ure to initializ
a840: 65 20 2a 2f 0a 20 20 53 71 6c 69 74 65 44 62 20  e */.  SqliteDb 
a850: 2a 70 44 62 2c 20 20 20 20 20 20 20 20 20 20 20  *pDb,           
a860: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
a870: 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 54  se handle */.  T
a880: 63 6c 5f 4f 62 6a 20 2a 70 53 71 6c 2c 20 20 20  cl_Obj *pSql,   
a890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a8a0: 2a 20 4f 62 6a 65 63 74 20 63 6f 6e 74 61 69 6e  * Object contain
a8b0: 69 6e 67 20 53 51 4c 20 73 63 72 69 70 74 20 2a  ing SQL script *
a8c0: 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 41 72  /.  Tcl_Obj *pAr
a8d0: 72 61 79 20 20 20 20 20 20 20 20 20 20 20 20 20  ray             
a8e0: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 54      /* Name of T
a8f0: 63 6c 20 61 72 72 61 79 20 74 6f 20 73 65 74 20  cl array to set 
a900: 28 2a 29 20 65 6c 65 6d 65 6e 74 20 6f 66 20 2a  (*) element of *
a910: 2f 0a 29 7b 0a 20 20 6d 65 6d 73 65 74 28 70 2c  /.){.  memset(p,
a920: 20 30 2c 20 73 69 7a 65 6f 66 28 44 62 45 76 61   0, sizeof(DbEva
a930: 6c 43 6f 6e 74 65 78 74 29 29 3b 0a 20 20 70 2d  lContext));.  p-
a940: 3e 70 44 62 20 3d 20 70 44 62 3b 0a 20 20 70 2d  >pDb = pDb;.  p-
a950: 3e 7a 53 71 6c 20 3d 20 54 63 6c 5f 47 65 74 53  >zSql = Tcl_GetS
a960: 74 72 69 6e 67 28 70 53 71 6c 29 3b 0a 20 20 70  tring(pSql);.  p
a970: 2d 3e 70 53 71 6c 20 3d 20 70 53 71 6c 3b 0a 20  ->pSql = pSql;. 
a980: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
a990: 74 28 70 53 71 6c 29 3b 0a 20 20 69 66 28 20 70  t(pSql);.  if( p
a9a0: 41 72 72 61 79 20 29 7b 0a 20 20 20 20 70 2d 3e  Array ){.    p->
a9b0: 70 41 72 72 61 79 20 3d 20 70 41 72 72 61 79 3b  pArray = pArray;
a9c0: 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66  .    Tcl_IncrRef
a9d0: 43 6f 75 6e 74 28 70 41 72 72 61 79 29 3b 0a 20  Count(pArray);. 
a9e0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 62 74 61   }.}../*.** Obta
a9f0: 69 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  in information a
aa00: 62 6f 75 74 20 74 68 65 20 72 6f 77 20 74 68 61  bout the row tha
aa10: 74 20 74 68 65 20 44 62 45 76 61 6c 43 6f 6e 74  t the DbEvalCont
aa20: 65 78 74 20 70 61 73 73 65 64 20 61 73 20 74 68  ext passed as th
aa30: 65 0a 2a 2a 20 66 69 72 73 74 20 61 72 67 75 6d  e.** first argum
aa40: 65 6e 74 20 63 75 72 72 65 6e 74 6c 79 20 70 6f  ent currently po
aa50: 69 6e 74 73 20 74 6f 2e 0a 2a 2f 0a 73 74 61 74  ints to..*/.stat
aa60: 69 63 20 76 6f 69 64 20 64 62 45 76 61 6c 52 6f  ic void dbEvalRo
aa70: 77 49 6e 66 6f 28 0a 20 20 44 62 45 76 61 6c 43  wInfo(.  DbEvalC
aa80: 6f 6e 74 65 78 74 20 2a 70 2c 20 20 20 20 20 20  ontext *p,      
aa90: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 76 61 6c           /* Eval
aaa0: 75 61 74 69 6f 6e 20 63 6f 6e 74 65 78 74 20 2a  uation context *
aab0: 2f 0a 20 20 69 6e 74 20 2a 70 6e 43 6f 6c 2c 20  /.  int *pnCol, 
aac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aad0: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 75 6d 62      /* OUT: Numb
aae0: 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 20 6e 61 6d  er of column nam
aaf0: 65 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  es */.  Tcl_Obj 
ab00: 2a 2a 2a 70 61 70 43 6f 6c 4e 61 6d 65 20 20 20  ***papColName   
ab10: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
ab20: 41 72 72 61 79 20 6f 66 20 63 6f 6c 75 6d 6e 20  Array of column 
ab30: 6e 61 6d 65 73 20 2a 2f 0a 29 7b 0a 20 20 2f 2a  names */.){.  /*
ab40: 20 43 6f 6d 70 75 74 65 20 63 6f 6c 75 6d 6e 20   Compute column 
ab50: 6e 61 6d 65 73 20 2a 2f 0a 20 20 69 66 28 20 30  names */.  if( 0
ab60: 3d 3d 70 2d 3e 61 70 43 6f 6c 4e 61 6d 65 20 29  ==p->apColName )
ab70: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74  {.    sqlite3_st
ab80: 6d 74 20 2a 70 53 74 6d 74 20 3d 20 70 2d 3e 70  mt *pStmt = p->p
ab90: 50 72 65 53 74 6d 74 2d 3e 70 53 74 6d 74 3b 0a  PreStmt->pStmt;.
aba0: 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20      int i;      
abb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
abc0: 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 61    /* Iterator va
abd0: 72 69 61 62 6c 65 20 2a 2f 0a 20 20 20 20 69 6e  riable */.    in
abe0: 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20 20  t nCol;         
abf0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
ac00: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
ac10: 20 72 65 74 75 72 6e 65 64 20 62 79 20 70 53 74   returned by pSt
ac20: 6d 74 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62  mt */.    Tcl_Ob
ac30: 6a 20 2a 2a 61 70 43 6f 6c 4e 61 6d 65 20 3d 20  j **apColName = 
ac40: 30 3b 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79  0;      /* Array
ac50: 20 6f 66 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73   of column names
ac60: 20 2a 2f 0a 0a 20 20 20 20 70 2d 3e 6e 43 6f 6c   */..    p->nCol
ac70: 20 3d 20 6e 43 6f 6c 20 3d 20 73 71 6c 69 74 65   = nCol = sqlite
ac80: 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70  3_column_count(p
ac90: 53 74 6d 74 29 3b 0a 20 20 20 20 69 66 28 20 6e  Stmt);.    if( n
aca0: 43 6f 6c 3e 30 20 26 26 20 28 70 61 70 43 6f 6c  Col>0 && (papCol
acb0: 4e 61 6d 65 20 7c 7c 20 70 2d 3e 70 41 72 72 61  Name || p->pArra
acc0: 79 29 20 29 7b 0a 20 20 20 20 20 20 61 70 43 6f  y) ){.      apCo
acd0: 6c 4e 61 6d 65 20 3d 20 28 54 63 6c 5f 4f 62 6a  lName = (Tcl_Obj
ace0: 2a 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28 20 73 69  **)Tcl_Alloc( si
acf0: 7a 65 6f 66 28 54 63 6c 5f 4f 62 6a 2a 29 2a 6e  zeof(Tcl_Obj*)*n
ad00: 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20 66 6f 72  Col );.      for
ad10: 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b  (i=0; i<nCol; i+
ad20: 2b 29 7b 0a 20 20 20 20 20 20 20 20 61 70 43 6f  +){.        apCo
ad30: 6c 4e 61 6d 65 5b 69 5d 20 3d 20 64 62 54 65 78  lName[i] = dbTex
ad40: 74 54 6f 4f 62 6a 28 73 71 6c 69 74 65 33 5f 63  tToObj(sqlite3_c
ad50: 6f 6c 75 6d 6e 5f 6e 61 6d 65 28 70 53 74 6d 74  olumn_name(pStmt
ad60: 2c 69 29 29 3b 0a 20 20 20 20 20 20 20 20 54 63  ,i));.        Tc
ad70: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 61  l_IncrRefCount(a
ad80: 70 43 6f 6c 4e 61 6d 65 5b 69 5d 29 3b 0a 20 20  pColName[i]);.  
ad90: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 61      }.      p->a
ada0: 70 43 6f 6c 4e 61 6d 65 20 3d 20 61 70 43 6f 6c  pColName = apCol
adb0: 4e 61 6d 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  Name;.    }..   
adc0: 20 2f 2a 20 49 66 20 72 65 73 75 6c 74 73 20 61   /* If results a
add0: 72 65 20 62 65 69 6e 67 20 73 74 6f 72 65 64 20  re being stored 
ade0: 69 6e 20 61 6e 20 61 72 72 61 79 20 76 61 72 69  in an array vari
adf0: 61 62 6c 65 2c 20 74 68 65 6e 20 63 72 65 61 74  able, then creat
ae00: 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 61 72 72  e.    ** the arr
ae10: 61 79 28 2a 29 20 65 6e 74 72 79 20 66 6f 72 20  ay(*) entry for 
ae20: 74 68 61 74 20 61 72 72 61 79 0a 20 20 20 20 2a  that array.    *
ae30: 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 41 72  /.    if( p->pAr
ae40: 72 61 79 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  ray ){.      Tcl
ae50: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 20  _Interp *interp 
ae60: 3d 20 70 2d 3e 70 44 62 2d 3e 69 6e 74 65 72 70  = p->pDb->interp
ae70: 3b 0a 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20  ;.      Tcl_Obj 
ae80: 2a 70 43 6f 6c 4c 69 73 74 20 3d 20 54 63 6c 5f  *pColList = Tcl_
ae90: 4e 65 77 4f 62 6a 28 29 3b 0a 20 20 20 20 20 20  NewObj();.      
aea0: 54 63 6c 5f 4f 62 6a 20 2a 70 53 74 61 72 20 3d  Tcl_Obj *pStar =
aeb0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
aec0: 6a 28 22 2a 22 2c 20 2d 31 29 3b 0a 0a 20 20 20  j("*", -1);..   
aed0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
aee0: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
aef0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
af00: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
af10: 70 2c 20 70 43 6f 6c 4c 69 73 74 2c 20 61 70 43  p, pColList, apC
af20: 6f 6c 4e 61 6d 65 5b 69 5d 29 3b 0a 20 20 20 20  olName[i]);.    
af30: 20 20 7d 0a 20 20 20 20 20 20 54 63 6c 5f 49 6e    }.      Tcl_In
af40: 63 72 52 65 66 43 6f 75 6e 74 28 70 53 74 61 72  crRefCount(pStar
af50: 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a  );.      Tcl_Obj
af60: 53 65 74 56 61 72 32 28 69 6e 74 65 72 70 2c 20  SetVar2(interp, 
af70: 70 2d 3e 70 41 72 72 61 79 2c 20 70 53 74 61 72  p->pArray, pStar
af80: 2c 20 70 43 6f 6c 4c 69 73 74 2c 20 30 29 3b 0a  , pColList, 0);.
af90: 20 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65        Tcl_DecrRe
afa0: 66 43 6f 75 6e 74 28 70 53 74 61 72 29 3b 0a 20  fCount(pStar);. 
afb0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
afc0: 70 61 70 43 6f 6c 4e 61 6d 65 20 29 7b 0a 20 20  papColName ){.  
afd0: 20 20 2a 70 61 70 43 6f 6c 4e 61 6d 65 20 3d 20    *papColName = 
afe0: 70 2d 3e 61 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20  p->apColName;.  
aff0: 7d 0a 20 20 69 66 28 20 70 6e 43 6f 6c 20 29 7b  }.  if( pnCol ){
b000: 0a 20 20 20 20 2a 70 6e 43 6f 6c 20 3d 20 70 2d  .    *pnCol = p-
b010: 3e 6e 43 6f 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  >nCol;.  }.}../*
b020: 0a 2a 2a 20 52 65 74 75 72 6e 20 6f 6e 65 20 6f  .** Return one o
b030: 66 20 54 43 4c 5f 4f 4b 2c 20 54 43 4c 5f 42 52  f TCL_OK, TCL_BR
b040: 45 41 4b 20 6f 72 20 54 43 4c 5f 45 52 52 4f 52  EAK or TCL_ERROR
b050: 2e 20 49 66 20 54 43 4c 5f 45 52 52 4f 52 20 69  . If TCL_ERROR i
b060: 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2c 20 74  s.** returned, t
b070: 68 65 6e 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  hen an error mes
b080: 73 61 67 65 20 69 73 20 73 74 6f 72 65 64 20 69  sage is stored i
b090: 6e 20 74 68 65 20 69 6e 74 65 72 70 72 65 74 65  n the interprete
b0a0: 72 20 62 65 66 6f 72 65 0a 2a 2a 20 72 65 74 75  r before.** retu
b0b0: 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41 20 72  rning..**.** A r
b0c0: 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 54  eturn value of T
b0d0: 43 4c 5f 4f 4b 20 6d 65 61 6e 73 20 74 68 65 72  CL_OK means ther
b0e0: 65 20 69 73 20 61 20 72 6f 77 20 6f 66 20 64 61  e is a row of da
b0f0: 74 61 20 61 76 61 69 6c 61 62 6c 65 2e 20 54 68  ta available. Th
b100: 65 0a 2a 2a 20 64 61 74 61 20 6d 61 79 20 62 65  e.** data may be
b110: 20 61 63 63 65 73 73 65 64 20 75 73 69 6e 67 20   accessed using 
b120: 64 62 45 76 61 6c 52 6f 77 49 6e 66 6f 28 29 20  dbEvalRowInfo() 
b130: 61 6e 64 20 64 62 45 76 61 6c 43 6f 6c 75 6d 6e  and dbEvalColumn
b140: 56 61 6c 75 65 28 29 2e 20 54 68 69 73 0a 2a 2a  Value(). This.**
b150: 20 69 73 20 61 6e 61 6c 6f 67 6f 75 73 20 74 6f   is analogous to
b160: 20 61 20 72 65 74 75 72 6e 20 6f 66 20 53 51 4c   a return of SQL
b170: 49 54 45 5f 52 4f 57 20 66 72 6f 6d 20 73 71 6c  ITE_ROW from sql
b180: 69 74 65 33 5f 73 74 65 70 28 29 2e 20 49 66 20  ite3_step(). If 
b190: 54 43 4c 5f 42 52 45 41 4b 0a 2a 2a 20 69 73 20  TCL_BREAK.** is 
b1a0: 72 65 74 75 72 6e 65 64 2c 20 74 68 65 6e 20 74  returned, then t
b1b0: 68 65 20 53 51 4c 20 73 63 72 69 70 74 20 68 61  he SQL script ha
b1c0: 73 20 66 69 6e 69 73 68 65 64 20 65 78 65 63 75  s finished execu
b1d0: 74 69 6e 67 20 61 6e 64 20 74 68 65 72 65 20 61  ting and there a
b1e0: 72 65 0a 2a 2a 20 6e 6f 20 66 75 72 74 68 65 72  re.** no further
b1f0: 20 72 6f 77 73 20 61 76 61 69 6c 61 62 6c 65 2e   rows available.
b200: 20 54 68 69 73 20 69 73 20 73 69 6d 69 6c 61 72   This is similar
b210: 20 74 6f 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e   to SQLITE_DONE.
b220: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
b230: 62 45 76 61 6c 53 74 65 70 28 44 62 45 76 61 6c  bEvalStep(DbEval
b240: 43 6f 6e 74 65 78 74 20 2a 70 29 7b 0a 20 20 63  Context *p){.  c
b250: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 72 65 76  onst char *zPrev
b260: 53 71 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  Sql = 0;       /
b270: 2a 20 50 72 65 76 69 6f 75 73 20 76 61 6c 75 65  * Previous value
b280: 20 6f 66 20 70 2d 3e 7a 53 71 6c 20 2a 2f 0a 0a   of p->zSql */..
b290: 20 20 77 68 69 6c 65 28 20 70 2d 3e 7a 53 71 6c    while( p->zSql
b2a0: 5b 30 5d 20 7c 7c 20 70 2d 3e 70 50 72 65 53 74  [0] || p->pPreSt
b2b0: 6d 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  mt ){.    int rc
b2c0: 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 50 72  ;.    if( p->pPr
b2d0: 65 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20 20 20  eStmt==0 ){.    
b2e0: 20 20 7a 50 72 65 76 53 71 6c 20 3d 20 28 70 2d    zPrevSql = (p-
b2f0: 3e 7a 53 71 6c 3d 3d 7a 50 72 65 76 53 71 6c 20  >zSql==zPrevSql 
b300: 3f 20 30 20 3a 20 70 2d 3e 7a 53 71 6c 29 3b 0a  ? 0 : p->zSql);.
b310: 20 20 20 20 20 20 72 63 20 3d 20 64 62 50 72 65        rc = dbPre
b320: 70 61 72 65 41 6e 64 42 69 6e 64 28 70 2d 3e 70  pareAndBind(p->p
b330: 44 62 2c 20 70 2d 3e 7a 53 71 6c 2c 20 26 70 2d  Db, p->zSql, &p-
b340: 3e 7a 53 71 6c 2c 20 26 70 2d 3e 70 50 72 65 53  >zSql, &p->pPreS
b350: 74 6d 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  tmt);.      if( 
b360: 72 63 21 3d 54 43 4c 5f 4f 4b 20 29 20 72 65 74  rc!=TCL_OK ) ret
b370: 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 65 6c 73  urn rc;.    }els
b380: 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 73  e{.      int rcs
b390: 3b 0a 20 20 20 20 20 20 53 71 6c 69 74 65 44 62  ;.      SqliteDb
b3a0: 20 2a 70 44 62 20 3d 20 70 2d 3e 70 44 62 3b 0a   *pDb = p->pDb;.
b3b0: 20 20 20 20 20 20 53 71 6c 50 72 65 70 61 72 65        SqlPrepare
b3c0: 64 53 74 6d 74 20 2a 70 50 72 65 53 74 6d 74 20  dStmt *pPreStmt 
b3d0: 3d 20 70 2d 3e 70 50 72 65 53 74 6d 74 3b 0a 20  = p->pPreStmt;. 
b3e0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d       sqlite3_stm
b3f0: 74 20 2a 70 53 74 6d 74 20 3d 20 70 50 72 65 53  t *pStmt = pPreS
b400: 74 6d 74 2d 3e 70 53 74 6d 74 3b 0a 0a 20 20 20  tmt->pStmt;..   
b410: 20 20 20 72 63 73 20 3d 20 73 71 6c 69 74 65 33     rcs = sqlite3
b420: 5f 73 74 65 70 28 70 53 74 6d 74 29 3b 0a 20 20  _step(pStmt);.  
b430: 20 20 20 20 69 66 28 20 72 63 73 3d 3d 53 51 4c      if( rcs==SQL
b440: 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20  ITE_ROW ){.     
b450: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b     return TCL_OK
b460: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
b470: 69 66 28 20 70 2d 3e 70 41 72 72 61 79 20 29 7b  if( p->pArray ){
b480: 0a 20 20 20 20 20 20 20 20 64 62 45 76 61 6c 52  .        dbEvalR
b490: 6f 77 49 6e 66 6f 28 70 2c 20 30 2c 20 30 29 3b  owInfo(p, 0, 0);
b4a0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
b4b0: 63 73 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73  cs = sqlite3_res
b4c0: 65 74 28 70 53 74 6d 74 29 3b 0a 0a 20 20 20 20  et(pStmt);..    
b4d0: 20 20 70 44 62 2d 3e 6e 53 74 65 70 20 3d 20 73    pDb->nStep = s
b4e0: 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74 61 74  qlite3_stmt_stat
b4f0: 75 73 28 70 53 74 6d 74 2c 53 51 4c 49 54 45 5f  us(pStmt,SQLITE_
b500: 53 54 4d 54 53 54 41 54 55 53 5f 46 55 4c 4c 53  STMTSTATUS_FULLS
b510: 43 41 4e 5f 53 54 45 50 2c 31 29 3b 0a 20 20 20  CAN_STEP,1);.   
b520: 20 20 20 70 44 62 2d 3e 6e 53 6f 72 74 20 3d 20     pDb->nSort = 
b530: 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74 61  sqlite3_stmt_sta
b540: 74 75 73 28 70 53 74 6d 74 2c 53 51 4c 49 54 45  tus(pStmt,SQLITE
b550: 5f 53 54 4d 54 53 54 41 54 55 53 5f 53 4f 52 54  _STMTSTATUS_SORT
b560: 2c 31 29 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e  ,1);.      pDb->
b570: 6e 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33  nIndex = sqlite3
b580: 5f 73 74 6d 74 5f 73 74 61 74 75 73 28 70 53 74  _stmt_status(pSt
b590: 6d 74 2c 53 51 4c 49 54 45 5f 53 54 4d 54 53 54  mt,SQLITE_STMTST
b5a0: 41 54 55 53 5f 41 55 54 4f 49 4e 44 45 58 2c 31  ATUS_AUTOINDEX,1
b5b0: 29 3b 0a 20 20 20 20 20 20 64 62 52 65 6c 65 61  );.      dbRelea
b5c0: 73 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 29  seColumnNames(p)
b5d0: 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 65 53  ;.      p->pPreS
b5e0: 74 6d 74 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20  tmt = 0;..      
b5f0: 69 66 28 20 72 63 73 21 3d 53 51 4c 49 54 45 5f  if( rcs!=SQLITE_
b600: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  OK ){.        /*
b610: 20 49 66 20 61 20 72 75 6e 2d 74 69 6d 65 20 65   If a run-time e
b620: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 70  rror occurs, rep
b630: 6f 72 74 20 74 68 65 20 65 72 72 6f 72 20 61 6e  ort the error an
b640: 64 20 73 74 6f 70 20 72 65 61 64 69 6e 67 0a 20  d stop reading. 
b650: 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 53 51         ** the SQ
b660: 4c 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 64  L.  */.        d
b670: 62 52 65 6c 65 61 73 65 53 74 6d 74 28 70 44 62  bReleaseStmt(pDb
b680: 2c 20 70 50 72 65 53 74 6d 74 2c 20 31 29 3b 0a  , pPreStmt, 1);.
b690: 23 69 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  #if SQLITE_TEST.
b6a0: 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70          if( p->p
b6b0: 44 62 2d 3e 62 4c 65 67 61 63 79 50 72 65 70 61  Db->bLegacyPrepa
b6c0: 72 65 20 26 26 20 72 63 73 3d 3d 53 51 4c 49 54  re && rcs==SQLIT
b6d0: 45 5f 53 43 48 45 4d 41 20 26 26 20 7a 50 72 65  E_SCHEMA && zPre
b6e0: 76 53 71 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  vSql ){.        
b6f0: 20 20 2f 2a 20 49 66 20 74 68 65 20 72 75 6e 74    /* If the runt
b700: 69 6d 65 20 65 72 72 6f 72 20 77 61 73 20 61 6e  ime error was an
b710: 20 53 51 4c 49 54 45 5f 53 43 48 45 4d 41 2c 20   SQLITE_SCHEMA, 
b720: 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65  and the database
b730: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 68 61  .          ** ha
b740: 6e 64 6c 65 20 69 73 20 63 6f 6e 66 69 67 75 72  ndle is configur
b750: 65 64 20 74 6f 20 75 73 65 20 74 68 65 20 6c 65  ed to use the le
b760: 67 61 63 79 20 73 71 6c 69 74 65 33 5f 70 72 65  gacy sqlite3_pre
b770: 70 61 72 65 28 29 20 0a 20 20 20 20 20 20 20 20  pare() .        
b780: 20 20 2a 2a 20 69 6e 74 65 72 66 61 63 65 2c 20    ** interface, 
b790: 72 65 74 72 79 20 70 72 65 70 61 72 65 28 29 2f  retry prepare()/
b7a0: 73 74 65 70 28 29 20 6f 6e 20 74 68 65 20 73 61  step() on the sa
b7b0: 6d 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  me SQL statement
b7c0: 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 54  ..          ** T
b7d0: 68 69 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73  his only happens
b7e0: 20 6f 6e 63 65 2e 20 49 66 20 74 68 65 72 65 20   once. If there 
b7f0: 69 73 20 61 20 73 65 63 6f 6e 64 20 53 51 4c 49  is a second SQLI
b800: 54 45 5f 53 43 48 45 4d 41 0a 20 20 20 20 20 20  TE_SCHEMA.      
b810: 20 20 20 20 2a 2a 20 65 72 72 6f 72 2c 20 74 68      ** error, th
b820: 65 20 65 72 72 6f 72 20 77 69 6c 6c 20 62 65 20  e error will be 
b830: 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20  returned to the 
b840: 63 61 6c 6c 65 72 2e 20 2a 2f 0a 20 20 20 20 20  caller. */.     
b850: 20 20 20 20 20 70 2d 3e 7a 53 71 6c 20 3d 20 7a       p->zSql = z
b860: 50 72 65 76 53 71 6c 3b 0a 20 20 20 20 20 20 20  PrevSql;.       
b870: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
b880: 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
b890: 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a        Tcl_SetObj
b8a0: 52 65 73 75 6c 74 28 70 44 62 2d 3e 69 6e 74 65  Result(pDb->inte
b8b0: 72 70 2c 20 64 62 54 65 78 74 54 6f 4f 62 6a 28  rp, dbTextToObj(
b8c0: 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70  sqlite3_errmsg(p
b8d0: 44 62 2d 3e 64 62 29 29 29 3b 0a 20 20 20 20 20  Db->db)));.     
b8e0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
b8f0: 52 4f 52 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ROR;.      }else
b900: 7b 0a 20 20 20 20 20 20 20 20 64 62 52 65 6c 65  {.        dbRele
b910: 61 73 65 53 74 6d 74 28 70 44 62 2c 20 70 50 72  aseStmt(pDb, pPr
b920: 65 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 20  eStmt, 0);.     
b930: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
b940: 2f 2a 20 46 69 6e 69 73 68 65 64 20 2a 2f 0a 20  /* Finished */. 
b950: 20 72 65 74 75 72 6e 20 54 43 4c 5f 42 52 45 41   return TCL_BREA
b960: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65  K;.}../*.** Free
b970: 20 61 6c 6c 20 72 65 73 6f 75 72 63 65 73 20 63   all resources c
b980: 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 20 62 79  urrently held by
b990: 20 74 68 65 20 44 62 45 76 61 6c 43 6f 6e 74 65   the DbEvalConte
b9a0: 78 74 20 73 74 72 75 63 74 75 72 65 20 70 61 73  xt structure pas
b9b0: 73 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 66 69  sed.** as the fi
b9c0: 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 54 68  rst argument. Th
b9d0: 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20 65 78  ere should be ex
b9e0: 61 63 74 6c 79 20 6f 6e 65 20 63 61 6c 6c 20 74  actly one call t
b9f0: 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  o this function.
ba00: 2a 2a 20 66 6f 72 20 65 61 63 68 20 63 61 6c 6c  ** for each call
ba10: 20 74 6f 20 64 62 45 76 61 6c 49 6e 69 74 28 29   to dbEvalInit()
ba20: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
ba30: 20 64 62 45 76 61 6c 46 69 6e 61 6c 69 7a 65 28   dbEvalFinalize(
ba40: 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 20 2a 70  DbEvalContext *p
ba50: 29 7b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 65  ){.  if( p->pPre
ba60: 53 74 6d 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  Stmt ){.    sqli
ba70: 74 65 33 5f 72 65 73 65 74 28 70 2d 3e 70 50 72  te3_reset(p->pPr
ba80: 65 53 74 6d 74 2d 3e 70 53 74 6d 74 29 3b 0a 20  eStmt->pStmt);. 
ba90: 20 20 20 64 62 52 65 6c 65 61 73 65 53 74 6d 74     dbReleaseStmt
baa0: 28 70 2d 3e 70 44 62 2c 20 70 2d 3e 70 50 72 65  (p->pDb, p->pPre
bab0: 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 70 2d  Stmt, 0);.    p-
bac0: 3e 70 50 72 65 53 74 6d 74 20 3d 20 30 3b 0a 20  >pPreStmt = 0;. 
bad0: 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 41 72 72   }.  if( p->pArr
bae0: 61 79 20 29 7b 0a 20 20 20 20 54 63 6c 5f 44 65  ay ){.    Tcl_De
baf0: 63 72 52 65 66 43 6f 75 6e 74 28 70 2d 3e 70 41  crRefCount(p->pA
bb00: 72 72 61 79 29 3b 0a 20 20 20 20 70 2d 3e 70 41  rray);.    p->pA
bb10: 72 72 61 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  rray = 0;.  }.  
bb20: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
bb30: 28 70 2d 3e 70 53 71 6c 29 3b 0a 20 20 64 62 52  (p->pSql);.  dbR
bb40: 65 6c 65 61 73 65 43 6f 6c 75 6d 6e 4e 61 6d 65  eleaseColumnName
bb50: 73 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  s(p);.}../*.** R
bb60: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
bb70: 74 6f 20 61 20 54 63 6c 5f 4f 62 6a 20 73 74 72  to a Tcl_Obj str
bb80: 75 63 74 75 72 65 20 77 69 74 68 20 72 65 66 2d  ucture with ref-
bb90: 63 6f 75 6e 74 20 30 20 74 68 61 74 20 63 6f 6e  count 0 that con
bba0: 74 61 69 6e 73 0a 2a 2a 20 74 68 65 20 76 61 6c  tains.** the val
bbb0: 75 65 20 66 6f 72 20 74 68 65 20 69 43 6f 6c 27  ue for the iCol'
bbc0: 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65  th column of the
bbd0: 20 72 6f 77 20 63 75 72 72 65 6e 74 6c 79 20 70   row currently p
bbe0: 6f 69 6e 74 65 64 20 74 6f 20 62 79 0a 2a 2a 20  ointed to by.** 
bbf0: 74 68 65 20 44 62 45 76 61 6c 43 6f 6e 74 65 78  the DbEvalContex
bc00: 74 20 73 74 72 75 63 74 75 72 65 20 70 61 73 73  t structure pass
bc10: 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ed as the first 
bc20: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61  argument..*/.sta
bc30: 74 69 63 20 54 63 6c 5f 4f 62 6a 20 2a 64 62 45  tic Tcl_Obj *dbE
bc40: 76 61 6c 43 6f 6c 75 6d 6e 56 61 6c 75 65 28 44  valColumnValue(D
bc50: 62 45 76 61 6c 43 6f 6e 74 65 78 74 20 2a 70 2c  bEvalContext *p,
bc60: 20 69 6e 74 20 69 43 6f 6c 29 7b 0a 20 20 73 71   int iCol){.  sq
bc70: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
bc80: 74 20 3d 20 70 2d 3e 70 50 72 65 53 74 6d 74 2d  t = p->pPreStmt-
bc90: 3e 70 53 74 6d 74 3b 0a 20 20 73 77 69 74 63 68  >pStmt;.  switch
bca0: 28 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  ( sqlite3_column
bcb0: 5f 74 79 70 65 28 70 53 74 6d 74 2c 20 69 43 6f  _type(pStmt, iCo
bcc0: 6c 29 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53  l) ){.    case S
bcd0: 51 4c 49 54 45 5f 42 4c 4f 42 3a 20 7b 0a 20 20  QLITE_BLOB: {.  
bce0: 20 20 20 20 69 6e 74 20 62 79 74 65 73 20 3d 20      int bytes = 
bcf0: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62  sqlite3_column_b
bd00: 79 74 65 73 28 70 53 74 6d 74 2c 20 69 43 6f 6c  ytes(pStmt, iCol
bd10: 29 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  );.      const c
bd20: 68 61 72 20 2a 7a 42 6c 6f 62 20 3d 20 73 71 6c  har *zBlob = sql
bd30: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62  ite3_column_blob
bd40: 28 70 53 74 6d 74 2c 20 69 43 6f 6c 29 3b 0a 20  (pStmt, iCol);. 
bd50: 20 20 20 20 20 69 66 28 20 21 7a 42 6c 6f 62 20       if( !zBlob 
bd60: 29 20 62 79 74 65 73 20 3d 20 30 3b 0a 20 20 20  ) bytes = 0;.   
bd70: 20 20 20 72 65 74 75 72 6e 20 54 63 6c 5f 4e 65     return Tcl_Ne
bd80: 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 28 75  wByteArrayObj((u
bd90: 38 2a 29 7a 42 6c 6f 62 2c 20 62 79 74 65 73 29  8*)zBlob, bytes)
bda0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
bdb0: 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3a   SQLITE_INTEGER:
bdc0: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 5f   {.      sqlite_
bdd0: 69 6e 74 36 34 20 76 20 3d 20 73 71 6c 69 74 65  int64 v = sqlite
bde0: 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70  3_column_int64(p
bdf0: 53 74 6d 74 2c 20 69 43 6f 6c 29 3b 0a 20 20 20  Stmt, iCol);.   
be00: 20 20 20 69 66 28 20 76 3e 3d 2d 32 31 34 37 34     if( v>=-21474
be10: 38 33 36 34 37 20 26 26 20 76 3c 3d 32 31 34 37  83647 && v<=2147
be20: 34 38 33 36 34 37 20 29 7b 0a 20 20 20 20 20 20  483647 ){.      
be30: 20 20 72 65 74 75 72 6e 20 54 63 6c 5f 4e 65 77    return Tcl_New
be40: 49 6e 74 4f 62 6a 28 28 69 6e 74 29 76 29 3b 0a  IntObj((int)v);.
be50: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
be60: 20 20 20 20 20 72 65 74 75 72 6e 20 54 63 6c 5f       return Tcl_
be70: 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 76 29  NewWideIntObj(v)
be80: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
be90: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
bea0: 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20 72  FLOAT: {.      r
beb0: 65 74 75 72 6e 20 54 63 6c 5f 4e 65 77 44 6f 75  eturn Tcl_NewDou
bec0: 62 6c 65 4f 62 6a 28 73 71 6c 69 74 65 33 5f 63  bleObj(sqlite3_c
bed0: 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 28 70 53 74  olumn_double(pSt
bee0: 6d 74 2c 20 69 43 6f 6c 29 29 3b 0a 20 20 20 20  mt, iCol));.    
bef0: 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
bf00: 45 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20  E_NULL: {.      
bf10: 72 65 74 75 72 6e 20 64 62 54 65 78 74 54 6f 4f  return dbTextToO
bf20: 62 6a 28 70 2d 3e 70 44 62 2d 3e 7a 4e 75 6c 6c  bj(p->pDb->zNull
bf30: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
bf40: 72 65 74 75 72 6e 20 64 62 54 65 78 74 54 6f 4f  return dbTextToO
bf50: 62 6a 28 28 63 68 61 72 20 2a 29 73 71 6c 69 74  bj((char *)sqlit
bf60: 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
bf70: 53 74 6d 74 2c 20 69 43 6f 6c 29 29 3b 0a 7d 0a  Stmt, iCol));.}.
bf80: 0a 2f 2a 0a 2a 2a 20 49 66 20 75 73 69 6e 67 20  ./*.** If using 
bf90: 54 63 6c 20 76 65 72 73 69 6f 6e 20 38 2e 36 20  Tcl version 8.6 
bfa0: 6f 72 20 67 72 65 61 74 65 72 2c 20 75 73 65 20  or greater, use 
bfb0: 74 68 65 20 4e 52 20 66 75 6e 63 74 69 6f 6e 73  the NR functions
bfc0: 20 74 6f 20 61 76 6f 69 64 0a 2a 2a 20 72 65 63   to avoid.** rec
bfd0: 75 72 73 69 76 65 20 65 76 61 6c 75 74 69 6f 6e  ursive evalution
bfe0: 20 6f 66 20 73 63 72 69 70 74 73 20 62 79 20 74   of scripts by t
bff0: 68 65 20 5b 64 62 20 65 76 61 6c 5d 20 61 6e 64  he [db eval] and
c000: 20 5b 64 62 20 74 72 61 6e 73 5d 0a 2a 2a 20 63   [db trans].** c
c010: 6f 6d 6d 61 6e 64 73 2e 20 45 76 65 6e 20 69 66  ommands. Even if
c020: 20 74 68 65 20 68 65 61 64 65 72 73 20 75 73 65   the headers use
c030: 64 20 77 68 69 6c 65 20 63 6f 6d 70 69 6c 69 6e  d while compilin
c040: 67 20 74 68 65 20 65 78 74 65 6e 73 69 6f 6e 0a  g the extension.
c050: 2a 2a 20 61 72 65 20 38 2e 36 20 6f 72 20 6e 65  ** are 8.6 or ne
c060: 77 65 72 2c 20 74 68 65 20 63 6f 64 65 20 73 74  wer, the code st
c070: 69 6c 6c 20 74 65 73 74 73 20 74 68 65 20 54 63  ill tests the Tc
c080: 6c 20 76 65 72 73 69 6f 6e 20 61 74 20 72 75 6e  l version at run
c090: 74 69 6d 65 2e 0a 2a 2a 20 54 68 69 73 20 61 6c  time..** This al
c0a0: 6c 6f 77 73 20 73 74 75 62 73 2d 65 6e 61 62 6c  lows stubs-enabl
c0b0: 65 64 20 62 75 69 6c 64 73 20 74 6f 20 62 65 20  ed builds to be 
c0c0: 75 73 65 64 20 77 69 74 68 20 6f 6c 64 65 72 20  used with older 
c0d0: 54 63 6c 20 6c 69 62 72 61 72 69 65 73 2e 0a 2a  Tcl libraries..*
c0e0: 2f 0a 23 69 66 20 54 43 4c 5f 4d 41 4a 4f 52 5f  /.#if TCL_MAJOR_
c0f0: 56 45 52 53 49 4f 4e 3e 38 20 7c 7c 20 28 54 43  VERSION>8 || (TC
c100: 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f 4e 3d  L_MAJOR_VERSION=
c110: 3d 38 20 26 26 20 54 43 4c 5f 4d 49 4e 4f 52 5f  =8 && TCL_MINOR_
c120: 56 45 52 53 49 4f 4e 3e 3d 36 29 0a 23 20 64 65  VERSION>=6).# de
c130: 66 69 6e 65 20 53 51 4c 49 54 45 5f 54 43 4c 5f  fine SQLITE_TCL_
c140: 4e 52 45 20 31 0a 73 74 61 74 69 63 20 69 6e 74  NRE 1.static int
c150: 20 44 62 55 73 65 4e 72 65 28 76 6f 69 64 29 7b   DbUseNre(void){
c160: 0a 20 20 69 6e 74 20 6d 61 6a 6f 72 2c 20 6d 69  .  int major, mi
c170: 6e 6f 72 3b 0a 20 20 54 63 6c 5f 47 65 74 56 65  nor;.  Tcl_GetVe
c180: 72 73 69 6f 6e 28 26 6d 61 6a 6f 72 2c 20 26 6d  rsion(&major, &m
c190: 69 6e 6f 72 2c 20 30 2c 20 30 29 3b 0a 20 20 72  inor, 0, 0);.  r
c1a0: 65 74 75 72 6e 28 20 28 6d 61 6a 6f 72 3d 3d 38  eturn( (major==8
c1b0: 20 26 26 20 6d 69 6e 6f 72 3e 3d 36 29 20 7c 7c   && minor>=6) ||
c1c0: 20 6d 61 6a 6f 72 3e 38 20 29 3b 0a 7d 0a 23 65   major>8 );.}.#e
c1d0: 6c 73 65 0a 2f 2a 20 0a 2a 2a 20 43 6f 6d 70 69  lse./* .** Compi
c1e0: 6c 69 6e 67 20 75 73 69 6e 67 20 68 65 61 64 65  ling using heade
c1f0: 72 73 20 65 61 72 6c 69 65 72 20 74 68 61 6e 20  rs earlier than 
c200: 38 2e 36 2e 20 49 6e 20 74 68 69 73 20 63 61 73  8.6. In this cas
c210: 65 20 4e 52 20 63 61 6e 6e 6f 74 20 62 65 0a 2a  e NR cannot be.*
c220: 2a 20 75 73 65 64 2c 20 73 6f 20 44 62 55 73 65  * used, so DbUse
c230: 4e 72 65 28 29 20 74 6f 20 61 6c 77 61 79 73 20  Nre() to always 
c240: 72 65 74 75 72 6e 20 7a 65 72 6f 2e 20 41 64 64  return zero. Add
c250: 20 23 64 65 66 69 6e 65 73 20 66 6f 72 20 74 68   #defines for th
c260: 65 20 6f 74 68 65 72 0a 2a 2a 20 54 63 6c 5f 4e  e other.** Tcl_N
c270: 52 78 78 78 28 29 20 66 75 6e 63 74 69 6f 6e 73  Rxxx() functions
c280: 20 74 6f 20 70 72 65 76 65 6e 74 20 74 68 65 6d   to prevent them
c290: 20 66 72 6f 6d 20 63 61 75 73 69 6e 67 20 63 6f   from causing co
c2a0: 6d 70 69 6c 61 74 69 6f 6e 20 65 72 72 6f 72 73  mpilation errors
c2b0: 2c 0a 2a 2a 20 65 76 65 6e 20 74 68 6f 75 67 68  ,.** even though
c2c0: 20 74 68 65 20 6f 6e 6c 79 20 69 6e 76 6f 63 61   the only invoca
c2d0: 74 69 6f 6e 73 20 6f 66 20 74 68 65 6d 20 61 72  tions of them ar
c2e0: 65 20 77 69 74 68 69 6e 20 63 6f 6e 64 69 74 69  e within conditi
c2f0: 6f 6e 61 6c 20 62 6c 6f 63 6b 73 20 0a 2a 2a 20  onal blocks .** 
c300: 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a  of the form:.**.
c310: 2a 2a 20 20 20 69 66 28 20 44 62 55 73 65 4e 72  **   if( DbUseNr
c320: 65 28 29 20 29 20 7b 20 2e 2e 2e 20 7d 0a 2a 2f  e() ) { ... }.*/
c330: 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45  .# define SQLITE
c340: 5f 54 43 4c 5f 4e 52 45 20 30 0a 23 20 64 65 66  _TCL_NRE 0.# def
c350: 69 6e 65 20 44 62 55 73 65 4e 72 65 28 29 20 30  ine DbUseNre() 0
c360: 0a 23 20 64 65 66 69 6e 65 20 54 63 6c 5f 4e 52  .# define Tcl_NR
c370: 41 64 64 43 61 6c 6c 62 61 63 6b 28 61 2c 62 2c  AddCallback(a,b,
c380: 63 2c 64 2c 65 2c 66 29 20 30 0a 23 20 64 65 66  c,d,e,f) 0.# def
c390: 69 6e 65 20 54 63 6c 5f 4e 52 45 76 61 6c 4f 62  ine Tcl_NREvalOb
c3a0: 6a 28 61 2c 62 2c 63 29 20 30 0a 23 20 64 65 66  j(a,b,c) 0.# def
c3b0: 69 6e 65 20 54 63 6c 5f 4e 52 43 72 65 61 74 65  ine Tcl_NRCreate
c3c0: 43 6f 6d 6d 61 6e 64 28 61 2c 62 2c 63 2c 64 2c  Command(a,b,c,d,
c3d0: 65 2c 66 29 20 30 0a 23 65 6e 64 69 66 0a 0a 2f  e,f) 0.#endif../
c3e0: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
c3f0: 6f 6e 20 69 73 20 70 61 72 74 20 6f 66 20 74 68  on is part of th
c400: 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
c410: 20 6f 66 20 74 68 65 20 63 6f 6d 6d 61 6e 64 3a   of the command:
c420: 0a 2a 2a 0a 2a 2a 20 20 20 24 64 62 20 65 76 61  .**.**   $db eva
c430: 6c 20 53 51 4c 20 3f 41 52 52 41 59 4e 41 4d 45  l SQL ?ARRAYNAME
c440: 3f 20 53 43 52 49 50 54 0a 2a 2f 0a 73 74 61 74  ? SCRIPT.*/.stat
c450: 69 63 20 69 6e 74 20 44 62 45 76 61 6c 4e 65 78  ic int DbEvalNex
c460: 74 43 6d 64 28 0a 20 20 43 6c 69 65 6e 74 44 61  tCmd(.  ClientDa
c470: 74 61 20 64 61 74 61 5b 5d 2c 20 20 20 20 20 20  ta data[],      
c480: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c490: 64 61 74 61 5b 30 5d 20 69 73 20 74 68 65 20 28  data[0] is the (
c4a0: 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 2a 29 20  DbEvalContext*) 
c4b0: 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  */.  Tcl_Interp 
c4c0: 2a 69 6e 74 65 72 70 2c 20 20 20 20 20 20 20 20  *interp,        
c4d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 63 6c            /* Tcl
c4e0: 20 69 6e 74 65 72 70 72 65 74 65 72 20 2a 2f 0a   interpreter */.
c4f0: 20 20 69 6e 74 20 72 65 73 75 6c 74 20 20 20 20    int result    
c500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c510: 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
c520: 20 73 6f 20 66 61 72 20 2a 2f 0a 29 7b 0a 20 20   so far */.){.  
c530: 69 6e 74 20 72 63 20 3d 20 72 65 73 75 6c 74 3b  int rc = result;
c540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c550: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
c560: 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65  ode */..  /* The
c570: 20 66 69 72 73 74 20 65 6c 65 6d 65 6e 74 20 6f   first element o
c580: 66 20 74 68 65 20 64 61 74 61 5b 5d 20 61 72 72  f the data[] arr
c590: 61 79 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  ay is a pointer 
c5a0: 74 6f 20 61 20 44 62 45 76 61 6c 43 6f 6e 74 65  to a DbEvalConte
c5b0: 78 74 0a 20 20 2a 2a 20 73 74 72 75 63 74 75 72  xt.  ** structur
c5c0: 65 20 61 6c 6c 6f 63 61 74 65 64 20 75 73 69 6e  e allocated usin
c5d0: 67 20 54 63 6c 5f 41 6c 6c 6f 63 28 29 2e 20 54  g Tcl_Alloc(). T
c5e0: 68 65 20 73 65 63 6f 6e 64 20 65 6c 65 6d 65 6e  he second elemen
c5f0: 74 20 6f 66 20 64 61 74 61 5b 5d 0a 20 20 2a 2a  t of data[].  **
c600: 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
c610: 20 61 20 54 63 6c 5f 4f 62 6a 20 63 6f 6e 74 61   a Tcl_Obj conta
c620: 69 6e 69 6e 67 20 74 68 65 20 73 63 72 69 70 74  ining the script
c630: 20 74 6f 20 72 75 6e 20 66 6f 72 20 65 61 63 68   to run for each
c640: 20 72 6f 77 0a 20 20 2a 2a 20 72 65 74 75 72 6e   row.  ** return
c650: 65 64 20 62 79 20 74 68 65 20 71 75 65 72 69 65  ed by the querie
c660: 73 20 65 6e 63 61 70 73 75 6c 61 74 65 64 20 69  s encapsulated i
c670: 6e 20 64 61 74 61 5b 30 5d 2e 20 2a 2f 0a 20 20  n data[0]. */.  
c680: 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 20 2a 70  DbEvalContext *p
c690: 20 3d 20 28 44 62 45 76 61 6c 43 6f 6e 74 65 78   = (DbEvalContex
c6a0: 74 20 2a 29 64 61 74 61 5b 30 5d 3b 0a 20 20 54  t *)data[0];.  T
c6b0: 63 6c 5f 4f 62 6a 20 2a 70 53 63 72 69 70 74 20  cl_Obj *pScript 
c6c0: 3d 20 28 54 63 6c 5f 4f 62 6a 20 2a 29 64 61 74  = (Tcl_Obj *)dat
c6d0: 61 5b 31 5d 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20  a[1];.  Tcl_Obj 
c6e0: 2a 70 41 72 72 61 79 20 3d 20 70 2d 3e 70 41 72  *pArray = p->pAr
c6f0: 72 61 79 3b 0a 0a 20 20 77 68 69 6c 65 28 20 28  ray;..  while( (
c700: 72 63 3d 3d 54 43 4c 5f 4f 4b 20 7c 7c 20 72 63  rc==TCL_OK || rc
c710: 3d 3d 54 43 4c 5f 43 4f 4e 54 49 4e 55 45 29 20  ==TCL_CONTINUE) 
c720: 26 26 20 54 43 4c 5f 4f 4b 3d 3d 28 72 63 20 3d  && TCL_OK==(rc =
c730: 20 64 62 45 76 61 6c 53 74 65 70 28 70 29 29 20   dbEvalStep(p)) 
c740: 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
c750: 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 20 20    int nCol;.    
c760: 54 63 6c 5f 4f 62 6a 20 2a 2a 61 70 43 6f 6c 4e  Tcl_Obj **apColN
c770: 61 6d 65 3b 0a 20 20 20 20 64 62 45 76 61 6c 52  ame;.    dbEvalR
c780: 6f 77 49 6e 66 6f 28 70 2c 20 26 6e 43 6f 6c 2c  owInfo(p, &nCol,
c790: 20 26 61 70 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20   &apColName);.  
c7a0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f    for(i=0; i<nCo
c7b0: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 54  l; i++){.      T
c7c0: 63 6c 5f 4f 62 6a 20 2a 70 56 61 6c 20 3d 20 64  cl_Obj *pVal = d
c7d0: 62 45 76 61 6c 43 6f 6c 75 6d 6e 56 61 6c 75 65  bEvalColumnValue
c7e0: 28 70 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66  (p, i);.      if
c7f0: 28 20 70 41 72 72 61 79 3d 3d 30 20 29 7b 0a 20  ( pArray==0 ){. 
c800: 20 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 53 65         Tcl_ObjSe
c810: 74 56 61 72 32 28 69 6e 74 65 72 70 2c 20 61 70  tVar2(interp, ap
c820: 43 6f 6c 4e 61 6d 65 5b 69 5d 2c 20 30 2c 20 70  ColName[i], 0, p
c830: 56 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  Val, 0);.      }
c840: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 54 63  else{.        Tc
c850: 6c 5f 4f 62 6a 53 65 74 56 61 72 32 28 69 6e 74  l_ObjSetVar2(int
c860: 65 72 70 2c 20 70 41 72 72 61 79 2c 20 61 70 43  erp, pArray, apC
c870: 6f 6c 4e 61 6d 65 5b 69 5d 2c 20 70 56 61 6c 2c  olName[i], pVal,
c880: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
c890: 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 72   }..    /* The r
c8a0: 65 71 75 69 72 65 64 20 69 6e 74 65 72 70 72 65  equired interpre
c8b0: 74 65 72 20 76 61 72 69 61 62 6c 65 73 20 61 72  ter variables ar
c8c0: 65 20 6e 6f 77 20 70 6f 70 75 6c 61 74 65 64 20  e now populated 
c8d0: 77 69 74 68 20 74 68 65 20 64 61 74 61 20 0a 20  with the data . 
c8e0: 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 63     ** from the c
c8f0: 75 72 72 65 6e 74 20 72 6f 77 2e 20 49 66 20 75  urrent row. If u
c900: 73 69 6e 67 20 4e 52 45 2c 20 73 63 68 65 64 75  sing NRE, schedu
c910: 6c 65 20 63 61 6c 6c 62 61 63 6b 73 20 74 6f 20  le callbacks to 
c920: 65 76 61 6c 75 61 74 65 0a 20 20 20 20 2a 2a 20  evaluate.    ** 
c930: 73 63 72 69 70 74 20 70 53 63 72 69 70 74 2c 20  script pScript, 
c940: 74 68 65 6e 20 74 6f 20 69 6e 76 6f 6b 65 20 74  then to invoke t
c950: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 67 61  his function aga
c960: 69 6e 20 74 6f 20 66 65 74 63 68 20 74 68 65 20  in to fetch the 
c970: 6e 65 78 74 0a 20 20 20 20 2a 2a 20 72 6f 77 20  next.    ** row 
c980: 28 6f 72 20 63 6c 65 61 6e 20 75 70 20 69 66 20  (or clean up if 
c990: 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 78 74  there is no next
c9a0: 20 72 6f 77 20 6f 72 20 74 68 65 20 73 63 72 69   row or the scri
c9b0: 70 74 20 74 68 72 6f 77 73 20 61 6e 0a 20 20 20  pt throws an.   
c9c0: 20 2a 2a 20 65 78 63 65 70 74 69 6f 6e 29 2e 20   ** exception). 
c9d0: 41 66 74 65 72 20 73 63 68 65 64 75 6c 69 6e 67  After scheduling
c9e0: 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 73 2c 20   the callbacks, 
c9f0: 72 65 74 75 72 6e 20 63 6f 6e 74 72 6f 6c 20 74  return control t
ca00: 6f 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 63 61  o the .    ** ca
ca10: 6c 6c 65 72 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  ller..    **.   
ca20: 20 2a 2a 20 49 66 20 6e 6f 74 20 75 73 69 6e 67   ** If not using
ca30: 20 4e 52 45 2c 20 65 76 61 6c 75 61 74 65 20 70   NRE, evaluate p
ca40: 53 63 72 69 70 74 20 64 69 72 65 63 74 6c 79 20  Script directly 
ca50: 61 6e 64 20 63 6f 6e 74 69 6e 75 65 20 77 69 74  and continue wit
ca60: 68 20 74 68 65 0a 20 20 20 20 2a 2a 20 6e 65 78  h the.    ** nex
ca70: 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74  t iteration of t
ca80: 68 69 73 20 77 68 69 6c 65 28 2e 2e 2e 29 20 6c  his while(...) l
ca90: 6f 6f 70 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28  oop.  */.    if(
caa0: 20 44 62 55 73 65 4e 72 65 28 29 20 29 7b 0a 20   DbUseNre() ){. 
cab0: 20 20 20 20 20 54 63 6c 5f 4e 52 41 64 64 43 61       Tcl_NRAddCa
cac0: 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 44  llback(interp, D
cad0: 62 45 76 61 6c 4e 65 78 74 43 6d 64 2c 20 28 76  bEvalNextCmd, (v
cae0: 6f 69 64 2a 29 70 2c 20 28 76 6f 69 64 2a 29 70  oid*)p, (void*)p
caf0: 53 63 72 69 70 74 2c 20 30 2c 20 30 29 3b 0a 20  Script, 0, 0);. 
cb00: 20 20 20 20 20 72 65 74 75 72 6e 20 54 63 6c 5f       return Tcl_
cb10: 4e 52 45 76 61 6c 4f 62 6a 28 69 6e 74 65 72 70  NREvalObj(interp
cb20: 2c 20 70 53 63 72 69 70 74 2c 20 30 29 3b 0a 20  , pScript, 0);. 
cb30: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
cb40: 72 63 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a  rc = Tcl_EvalObj
cb50: 45 78 28 69 6e 74 65 72 70 2c 20 70 53 63 72 69  Ex(interp, pScri
cb60: 70 74 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  pt, 0);.    }.  
cb70: 7d 0a 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66  }..  Tcl_DecrRef
cb80: 43 6f 75 6e 74 28 70 53 63 72 69 70 74 29 3b 0a  Count(pScript);.
cb90: 20 20 64 62 45 76 61 6c 46 69 6e 61 6c 69 7a 65    dbEvalFinalize
cba0: 28 70 29 3b 0a 20 20 54 63 6c 5f 46 72 65 65 28  (p);.  Tcl_Free(
cbb0: 28 63 68 61 72 20 2a 29 70 29 3b 0a 0a 20 20 69  (char *)p);..  i
cbc0: 66 28 20 72 63 3d 3d 54 43 4c 5f 4f 4b 20 7c 7c  f( rc==TCL_OK ||
cbd0: 20 72 63 3d 3d 54 43 4c 5f 42 52 45 41 4b 20 29   rc==TCL_BREAK )
cbe0: 7b 0a 20 20 20 20 54 63 6c 5f 52 65 73 65 74 52  {.    Tcl_ResetR
cbf0: 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20  esult(interp);. 
cc00: 20 20 20 72 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a     rc = TCL_OK;.
cc10: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
cc20: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 22 73  .}../*.** The "s
cc30: 71 6c 69 74 65 22 20 63 6f 6d 6d 61 6e 64 20 62  qlite" command b
cc40: 65 6c 6f 77 20 63 72 65 61 74 65 73 20 61 20 6e  elow creates a n
cc50: 65 77 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 20 66  ew Tcl command f
cc60: 6f 72 20 65 61 63 68 0a 2a 2a 20 63 6f 6e 6e 65  or each.** conne
cc70: 63 74 69 6f 6e 20 69 74 20 6f 70 65 6e 73 20 74  ction it opens t
cc80: 6f 20 61 6e 20 53 51 4c 69 74 65 20 64 61 74 61  o an SQLite data
cc90: 62 61 73 65 2e 20 20 54 68 69 73 20 72 6f 75 74  base.  This rout
cca0: 69 6e 65 20 69 73 20 69 6e 76 6f 6b 65 64 0a 2a  ine is invoked.*
ccb0: 2a 20 77 68 65 6e 65 76 65 72 20 6f 6e 65 20 6f  * whenever one o
ccc0: 66 20 74 68 6f 73 65 20 63 6f 6e 6e 65 63 74 69  f those connecti
ccd0: 6f 6e 2d 73 70 65 63 69 66 69 63 20 63 6f 6d 6d  on-specific comm
cce0: 61 6e 64 73 20 69 73 20 65 78 65 63 75 74 65 64  ands is executed
ccf0: 0a 2a 2a 20 69 6e 20 54 63 6c 2e 20 20 46 6f 72  .** in Tcl.  For
cd00: 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 79 6f 75   example, if you
cd10: 20 72 75 6e 20 54 63 6c 20 63 6f 64 65 20 6c 69   run Tcl code li
cd20: 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  ke this:.**.**  
cd30: 20 20 20 20 20 73 71 6c 69 74 65 33 20 64 62 31       sqlite3 db1
cd40: 20 20 22 6d 79 5f 64 61 74 61 62 61 73 65 22 0a    "my_database".
cd50: 2a 2a 20 20 20 20 20 20 20 64 62 31 20 63 6c 6f  **       db1 clo
cd60: 73 65 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72  se.**.** The fir
cd70: 73 74 20 63 6f 6d 6d 61 6e 64 20 6f 70 65 6e 73  st command opens
cd80: 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f   a connection to
cd90: 20 74 68 65 20 22 6d 79 5f 64 61 74 61 62 61 73   the "my_databas
cda0: 65 22 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 61  e" database.** a
cdb0: 6e 64 20 63 61 6c 6c 73 20 74 68 61 74 20 63 6f  nd calls that co
cdc0: 6e 6e 65 63 74 69 6f 6e 20 22 64 62 31 22 2e 20  nnection "db1". 
cdd0: 20 54 68 65 20 73 65 63 6f 6e 64 20 63 6f 6d 6d   The second comm
cde0: 61 6e 64 20 63 61 75 73 65 73 20 74 68 69 73 0a  and causes this.
cdf0: 2a 2a 20 73 75 62 72 6f 75 74 69 6e 65 20 74 6f  ** subroutine to
ce00: 20 62 65 20 69 6e 76 6f 6b 65 64 2e 0a 2a 2f 0a   be invoked..*/.
ce10: 73 74 61 74 69 63 20 69 6e 74 20 44 62 4f 62 6a  static int DbObj
ce20: 43 6d 64 28 76 6f 69 64 20 2a 63 64 2c 20 54 63  Cmd(void *cd, Tc
ce30: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
ce40: 2c 20 69 6e 74 20 6f 62 6a 63 2c 54 63 6c 5f 4f  , int objc,Tcl_O
ce50: 62 6a 20 2a 63 6f 6e 73 74 2a 6f 62 6a 76 29 7b  bj *const*objv){
ce60: 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62  .  SqliteDb *pDb
ce70: 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 63 64   = (SqliteDb*)cd
ce80: 3b 0a 20 20 69 6e 74 20 63 68 6f 69 63 65 3b 0a  ;.  int choice;.
ce90: 20 20 69 6e 74 20 72 63 20 3d 20 54 43 4c 5f 4f    int rc = TCL_O
cea0: 4b 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  K;.  static cons
ceb0: 74 20 63 68 61 72 20 2a 44 42 5f 73 74 72 73 5b  t char *DB_strs[
cec0: 5d 20 3d 20 7b 0a 20 20 20 20 22 61 75 74 68 6f  ] = {.    "autho
ced0: 72 69 7a 65 72 22 2c 20 20 20 20 20 20 20 20 20  rizer",         
cee0: 22 62 61 63 6b 75 70 22 2c 20 20 20 20 20 20 20  "backup",       
cef0: 20 20 20 20 20 22 62 75 73 79 22 2c 0a 20 20 20       "busy",.   
cf00: 20 22 63 61 63 68 65 22 2c 20 20 20 20 20 20 20   "cache",       
cf10: 20 20 20 20 20 20 20 22 63 68 61 6e 67 65 73 22         "changes"
cf20: 2c 20 20 20 20 20 20 20 20 20 20 20 22 63 6c 6f  ,           "clo
cf30: 73 65 22 2c 0a 20 20 20 20 22 63 6f 6c 6c 61 74  se",.    "collat
cf40: 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 22  e",            "
cf50: 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64  collation_needed
cf60: 22 2c 20 20 22 63 6f 6d 6d 69 74 5f 68 6f 6f 6b  ",  "commit_hook
cf70: 22 2c 0a 20 20 20 20 22 63 6f 6d 70 6c 65 74 65  ",.    "complete
cf80: 22 2c 20 20 20 20 20 20 20 20 20 20 20 22 63 6f  ",           "co
cf90: 70 79 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  py",            
cfa0: 20 20 22 65 6e 61 62 6c 65 5f 6c 6f 61 64 5f 65    "enable_load_e
cfb0: 78 74 65 6e 73 69 6f 6e 22 2c 0a 20 20 20 20 22  xtension",.    "
cfc0: 65 72 72 6f 72 63 6f 64 65 22 2c 20 20 20 20 20  errorcode",     
cfd0: 20 20 20 20 20 22 65 76 61 6c 22 2c 20 20 20 20       "eval",    
cfe0: 20 20 20 20 20 20 20 20 20 20 22 65 78 69 73 74            "exist
cff0: 73 22 2c 0a 20 20 20 20 22 66 75 6e 63 74 69 6f  s",.    "functio
d000: 6e 22 2c 20 20 20 20 20 20 20 20 20 20 20 22 69  n",           "i
d010: 6e 63 72 62 6c 6f 62 22 2c 20 20 20 20 20 20 20  ncrblob",       
d020: 20 20 20 22 69 6e 74 65 72 72 75 70 74 22 2c 0a     "interrupt",.
d030: 20 20 20 20 22 6c 61 73 74 5f 69 6e 73 65 72 74      "last_insert
d040: 5f 72 6f 77 69 64 22 2c 20 20 22 6e 75 6c 6c 76  _rowid",  "nullv
d050: 61 6c 75 65 22 2c 20 20 20 20 20 20 20 20 20 22  alue",         "
d060: 6f 6e 65 63 6f 6c 75 6d 6e 22 2c 0a 20 20 20 20  onecolumn",.    
d070: 22 70 72 6f 66 69 6c 65 22 2c 20 20 20 20 20 20  "profile",      
d080: 20 20 20 20 20 20 22 70 72 6f 67 72 65 73 73 22        "progress"
d090: 2c 20 20 20 20 20 20 20 20 20 20 22 72 65 6b 65  ,          "reke
d0a0: 79 22 2c 0a 20 20 20 20 22 72 65 73 74 6f 72 65  y",.    "restore
d0b0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 22 72  ",            "r
d0c0: 6f 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 22 2c 20 20  ollback_hook",  
d0d0: 20 20 20 22 73 74 61 74 75 73 22 2c 0a 20 20 20     "status",.   
d0e0: 20 22 74 69 6d 65 6f 75 74 22 2c 20 20 20 20 20   "timeout",     
d0f0: 20 20 20 20 20 20 20 22 74 6f 74 61 6c 5f 63 68         "total_ch
d100: 61 6e 67 65 73 22 2c 20 20 20 20 20 22 74 72 61  anges",     "tra
d110: 63 65 22 2c 0a 20 20 20 20 22 74 72 61 6e 73 61  ce",.    "transa
d120: 63 74 69 6f 6e 22 2c 20 20 20 20 20 20 20 20 22  ction",        "
d130: 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79 22 2c 20  unlock_notify", 
d140: 20 20 20 20 22 75 70 64 61 74 65 5f 68 6f 6f 6b      "update_hook
d150: 22 2c 0a 20 20 20 20 22 76 65 72 73 69 6f 6e 22  ",.    "version"
d160: 2c 20 20 20 20 20 20 20 20 20 20 20 20 22 77 61  ,            "wa
d170: 6c 5f 68 6f 6f 6b 22 2c 20 20 20 20 20 20 20 20  l_hook",        
d180: 20 20 30 0a 20 20 7d 3b 0a 20 20 65 6e 75 6d 20    0.  };.  enum 
d190: 44 42 5f 65 6e 75 6d 20 7b 0a 20 20 20 20 44 42  DB_enum {.    DB
d1a0: 5f 41 55 54 48 4f 52 49 5a 45 52 2c 20 20 20 20  _AUTHORIZER,    
d1b0: 20 20 20 20 44 42 5f 42 41 43 4b 55 50 2c 20 20      DB_BACKUP,  
d1c0: 20 20 20 20 20 20 20 20 20 44 42 5f 42 55 53 59           DB_BUSY
d1d0: 2c 0a 20 20 20 20 44 42 5f 43 41 43 48 45 2c 20  ,.    DB_CACHE, 
d1e0: 20 20 20 20 20 20 20 20 20 20 20 20 44 42 5f 43              DB_C
d1f0: 48 41 4e 47 45 53 2c 20 20 20 20 20 20 20 20 20  HANGES,         
d200: 20 44 42 5f 43 4c 4f 53 45 2c 0a 20 20 20 20 44   DB_CLOSE,.    D
d210: 42 5f 43 4f 4c 4c 41 54 45 2c 20 20 20 20 20 20  B_COLLATE,      
d220: 20 20 20 20 20 44 42 5f 43 4f 4c 4c 41 54 49 4f       DB_COLLATIO
d230: 4e 5f 4e 45 45 44 45 44 2c 20 44 42 5f 43 4f 4d  N_NEEDED, DB_COM
d240: 4d 49 54 5f 48 4f 4f 4b 2c 0a 20 20 20 20 44 42  MIT_HOOK,.    DB
d250: 5f 43 4f 4d 50 4c 45 54 45 2c 20 20 20 20 20 20  _COMPLETE,      
d260: 20 20 20 20 44 42 5f 43 4f 50 59 2c 20 20 20 20      DB_COPY,    
d270: 20 20 20 20 20 20 20 20 20 44 42 5f 45 4e 41 42           DB_ENAB
d280: 4c 45 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f  LE_LOAD_EXTENSIO
d290: 4e 2c 0a 20 20 20 20 44 42 5f 45 52 52 4f 52 43  N,.    DB_ERRORC
d2a0: 4f 44 45 2c 20 20 20 20 20 20 20 20 20 44 42 5f  ODE,         DB_
d2b0: 45 56 41 4c 2c 20 20 20 20 20 20 20 20 20 20 20  EVAL,           
d2c0: 20 20 44 42 5f 45 58 49 53 54 53 2c 0a 20 20 20    DB_EXISTS,.   
d2d0: 20 44 42 5f 46 55 4e 43 54 49 4f 4e 2c 20 20 20   DB_FUNCTION,   
d2e0: 20 20 20 20 20 20 20 44 42 5f 49 4e 43 52 42 4c         DB_INCRBL
d2f0: 4f 42 2c 20 20 20 20 20 20 20 20 20 44 42 5f 49  OB,         DB_I
d300: 4e 54 45 52 52 55 50 54 2c 0a 20 20 20 20 44 42  NTERRUPT,.    DB
d310: 5f 4c 41 53 54 5f 49 4e 53 45 52 54 5f 52 4f 57  _LAST_INSERT_ROW
d320: 49 44 2c 20 44 42 5f 4e 55 4c 4c 56 41 4c 55 45  ID, DB_NULLVALUE
d330: 2c 20 20 20 20 20 20 20 20 44 42 5f 4f 4e 45 43  ,        DB_ONEC
d340: 4f 4c 55 4d 4e 2c 0a 20 20 20 20 44 42 5f 50 52  OLUMN,.    DB_PR
d350: 4f 46 49 4c 45 2c 20 20 20 20 20 20 20 20 20 20  OFILE,          
d360: 20 44 42 5f 50 52 4f 47 52 45 53 53 2c 20 20 20   DB_PROGRESS,   
d370: 20 20 20 20 20 20 44 42 5f 52 45 4b 45 59 2c 0a        DB_REKEY,.
d380: 20 20 20 20 44 42 5f 52 45 53 54 4f 52 45 2c 20      DB_RESTORE, 
d390: 20 20 20 20 20 20 20 20 20 20 44 42 5f 52 4f 4c            DB_ROL
d3a0: 4c 42 41 43 4b 5f 48 4f 4f 4b 2c 20 20 20 20 44  LBACK_HOOK,    D
d3b0: 42 5f 53 54 41 54 55 53 2c 0a 20 20 20 20 44 42  B_STATUS,.    DB
d3c0: 5f 54 49 4d 45 4f 55 54 2c 20 20 20 20 20 20 20  _TIMEOUT,       
d3d0: 20 20 20 20 44 42 5f 54 4f 54 41 4c 5f 43 48 41      DB_TOTAL_CHA
d3e0: 4e 47 45 53 2c 20 20 20 20 44 42 5f 54 52 41 43  NGES,    DB_TRAC
d3f0: 45 2c 0a 20 20 20 20 44 42 5f 54 52 41 4e 53 41  E,.    DB_TRANSA
d400: 43 54 49 4f 4e 2c 20 20 20 20 20 20 20 44 42 5f  CTION,       DB_
d410: 55 4e 4c 4f 43 4b 5f 4e 4f 54 49 46 59 2c 20 20  UNLOCK_NOTIFY,  
d420: 20 20 44 42 5f 55 50 44 41 54 45 5f 48 4f 4f 4b    DB_UPDATE_HOOK
d430: 2c 0a 20 20 20 20 44 42 5f 56 45 52 53 49 4f 4e  ,.    DB_VERSION
d440: 2c 20 20 20 20 20 20 20 20 20 20 20 44 42 5f 57  ,           DB_W
d450: 41 4c 5f 48 4f 4f 4b 0a 20 20 7d 3b 0a 20 20 2f  AL_HOOK.  };.  /
d460: 2a 20 64 6f 6e 27 74 20 6c 65 61 76 65 20 74 72  * don't leave tr
d470: 61 69 6c 69 6e 67 20 63 6f 6d 6d 61 73 20 6f 6e  ailing commas on
d480: 20 44 42 5f 65 6e 75 6d 2c 20 69 74 20 63 6f 6e   DB_enum, it con
d490: 66 75 73 65 73 20 74 68 65 20 41 49 58 20 78 6c  fuses the AIX xl
d4a0: 63 20 63 6f 6d 70 69 6c 65 72 20 2a 2f 0a 0a 20  c compiler */.. 
d4b0: 20 69 66 28 20 6f 62 6a 63 3c 32 20 29 7b 0a 20   if( objc<2 ){. 
d4c0: 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
d4d0: 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
d4e0: 62 6a 76 2c 20 22 53 55 42 43 4f 4d 4d 41 4e 44  bjv, "SUBCOMMAND
d4f0: 20 2e 2e 2e 22 29 3b 0a 20 20 20 20 72 65 74 75   ...");.    retu
d500: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
d510: 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49  }.  if( Tcl_GetI
d520: 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  ndexFromObj(inte
d530: 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 44 42 5f  rp, objv[1], DB_
d540: 73 74 72 73 2c 20 22 6f 70 74 69 6f 6e 22 2c 20  strs, "option", 
d550: 30 2c 20 26 63 68 6f 69 63 65 29 20 29 7b 0a 20  0, &choice) ){. 
d560: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
d570: 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 73 77 69 74  ROR;.  }..  swit
d580: 63 68 28 20 28 65 6e 75 6d 20 44 42 5f 65 6e 75  ch( (enum DB_enu
d590: 6d 29 63 68 6f 69 63 65 20 29 7b 0a 0a 20 20 2f  m)choice ){..  /
d5a0: 2a 20 20 20 20 24 64 62 20 61 75 74 68 6f 72 69  *    $db authori
d5b0: 7a 65 72 20 3f 43 41 4c 4c 42 41 43 4b 3f 0a 20  zer ?CALLBACK?. 
d5c0: 20 2a 2a 0a 20 20 2a 2a 20 49 6e 76 6f 6b 65 20   **.  ** Invoke 
d5d0: 74 68 65 20 67 69 76 65 6e 20 63 61 6c 6c 62 61  the given callba
d5e0: 63 6b 20 74 6f 20 61 75 74 68 6f 72 69 7a 65 20  ck to authorize 
d5f0: 65 61 63 68 20 53 51 4c 20 6f 70 65 72 61 74 69  each SQL operati
d600: 6f 6e 20 61 73 20 69 74 20 69 73 0a 20 20 2a 2a  on as it is.  **
d610: 20 63 6f 6d 70 69 6c 65 64 2e 20 20 35 20 61 72   compiled.  5 ar
d620: 67 75 6d 65 6e 74 73 20 61 72 65 20 61 70 70 65  guments are appe
d630: 6e 64 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c  nded to the call
d640: 62 61 63 6b 20 62 65 66 6f 72 65 20 69 74 20 69  back before it i
d650: 73 0a 20 20 2a 2a 20 69 6e 76 6f 6b 65 64 3a 0a  s.  ** invoked:.
d660: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 28 31 29 20    **.  **   (1) 
d670: 54 68 65 20 61 75 74 68 6f 72 69 7a 61 74 69 6f  The authorizatio
d680: 6e 20 74 79 70 65 20 28 65 78 3a 20 53 51 4c 49  n type (ex: SQLI
d690: 54 45 5f 43 52 45 41 54 45 5f 54 41 42 4c 45 2c  TE_CREATE_TABLE,
d6a0: 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20   SQLITE_INSERT, 
d6b0: 2e 2e 2e 29 0a 20 20 2a 2a 20 20 20 28 32 29 20  ...).  **   (2) 
d6c0: 46 69 72 73 74 20 64 65 73 63 72 69 70 74 69 76  First descriptiv
d6d0: 65 20 6e 61 6d 65 20 28 64 65 70 65 6e 64 73 20  e name (depends 
d6e0: 6f 6e 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e  on authorization
d6f0: 20 74 79 70 65 29 0a 20 20 2a 2a 20 20 20 28 33   type).  **   (3
d700: 29 20 53 65 63 6f 6e 64 20 64 65 73 63 72 69 70  ) Second descrip
d710: 74 69 76 65 20 6e 61 6d 65 0a 20 20 2a 2a 20 20  tive name.  **  
d720: 20 28 34 29 20 4e 61 6d 65 20 6f 66 20 74 68 65   (4) Name of the
d730: 20 64 61 74 61 62 61 73 65 20 28 65 78 3a 20 22   database (ex: "
d740: 6d 61 69 6e 22 2c 20 22 74 65 6d 70 22 29 0a 20  main", "temp"). 
d750: 20 2a 2a 20 20 20 28 35 29 20 4e 61 6d 65 20 6f   **   (5) Name o
d760: 66 20 74 72 69 67 67 65 72 20 74 68 61 74 20 69  f trigger that i
d770: 73 20 64 6f 69 6e 67 20 74 68 65 20 61 63 63 65  s doing the acce
d780: 73 73 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  ss.  **.  ** The
d790: 20 63 61 6c 6c 62 61 63 6b 20 73 68 6f 75 6c 64   callback should
d7a0: 20 72 65 74 75 72 6e 20 6f 6e 20 6f 66 20 74 68   return on of th
d7b0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 69  e following stri
d7c0: 6e 67 73 3a 20 53 51 4c 49 54 45 5f 4f 4b 2c 0a  ngs: SQLITE_OK,.
d7d0: 20 20 2a 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f    ** SQLITE_IGNO
d7e0: 52 45 2c 20 6f 72 20 53 51 4c 49 54 45 5f 44 45  RE, or SQLITE_DE
d7f0: 4e 59 2e 20 20 41 6e 79 20 6f 74 68 65 72 20 72  NY.  Any other r
d800: 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 61  eturn value is a
d810: 6e 20 65 72 72 6f 72 2e 0a 20 20 2a 2a 0a 20 20  n error..  **.  
d820: 2a 2a 20 49 66 20 74 68 69 73 20 6d 65 74 68 6f  ** If this metho
d830: 64 20 69 73 20 69 6e 76 6f 6b 65 64 20 77 69 74  d is invoked wit
d840: 68 20 6e 6f 20 61 72 67 75 6d 65 6e 74 73 2c 20  h no arguments, 
d850: 74 68 65 20 63 75 72 72 65 6e 74 20 61 75 74 68  the current auth
d860: 6f 72 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a 20 63  orization.  ** c
d870: 61 6c 6c 62 61 63 6b 20 73 74 72 69 6e 67 20 69  allback string i
d880: 73 20 72 65 74 75 72 6e 65 64 2e 0a 20 20 2a 2f  s returned..  */
d890: 0a 20 20 63 61 73 65 20 44 42 5f 41 55 54 48 4f  .  case DB_AUTHO
d8a0: 52 49 5a 45 52 3a 20 7b 0a 23 69 66 64 65 66 20  RIZER: {.#ifdef 
d8b0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48  SQLITE_OMIT_AUTH
d8c0: 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 20 20 54 63  ORIZATION.    Tc
d8d0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
d8e0: 6e 74 65 72 70 2c 20 22 61 75 74 68 6f 72 69 7a  nterp, "authoriz
d8f0: 61 74 69 6f 6e 20 6e 6f 74 20 61 76 61 69 6c 61  ation not availa
d900: 62 6c 65 20 69 6e 20 74 68 69 73 20 62 75 69 6c  ble in this buil
d910: 64 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  d", 0);.    retu
d920: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65  rn TCL_ERROR;.#e
d930: 6c 73 65 0a 20 20 20 20 69 66 28 20 6f 62 6a 63  lse.    if( objc
d940: 3e 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  >3 ){.      Tcl_
d950: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
d960: 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f  erp, 2, objv, "?
d970: 43 41 4c 4c 42 41 43 4b 3f 22 29 3b 0a 20 20 20  CALLBACK?");.   
d980: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
d990: 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  ROR;.    }else i
d9a0: 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20  f( objc==2 ){.  
d9b0: 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 41 75      if( pDb->zAu
d9c0: 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63  th ){.        Tc
d9d0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
d9e0: 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a 41 75 74  nterp, pDb->zAut
d9f0: 68 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  h, 0);.      }. 
da00: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
da10: 63 68 61 72 20 2a 7a 41 75 74 68 3b 0a 20 20 20  char *zAuth;.   
da20: 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20     int len;.    
da30: 20 20 69 66 28 20 70 44 62 2d 3e 7a 41 75 74 68    if( pDb->zAuth
da40: 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f   ){.        Tcl_
da50: 46 72 65 65 28 70 44 62 2d 3e 7a 41 75 74 68 29  Free(pDb->zAuth)
da60: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
da70: 7a 41 75 74 68 20 3d 20 54 63 6c 5f 47 65 74 53  zAuth = Tcl_GetS
da80: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
da90: 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20 20  v[2], &len);.   
daa0: 20 20 20 69 66 28 20 7a 41 75 74 68 20 26 26 20     if( zAuth && 
dab0: 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  len>0 ){.       
dac0: 20 70 44 62 2d 3e 7a 41 75 74 68 20 3d 20 54 63   pDb->zAuth = Tc
dad0: 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20 31  l_Alloc( len + 1
dae0: 20 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63   );.        memc
daf0: 70 79 28 70 44 62 2d 3e 7a 41 75 74 68 2c 20 7a  py(pDb->zAuth, z
db00: 41 75 74 68 2c 20 6c 65 6e 2b 31 29 3b 0a 20 20  Auth, len+1);.  
db10: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
db20: 20 20 20 70 44 62 2d 3e 7a 41 75 74 68 20 3d 20     pDb->zAuth = 
db30: 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
db40: 20 69 66 28 20 70 44 62 2d 3e 7a 41 75 74 68 20   if( pDb->zAuth 
db50: 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e  ){.        pDb->
db60: 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b  interp = interp;
db70: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
db80: 5f 73 65 74 5f 61 75 74 68 6f 72 69 7a 65 72 28  _set_authorizer(
db90: 70 44 62 2d 3e 64 62 2c 20 61 75 74 68 5f 63 61  pDb->db, auth_ca
dba0: 6c 6c 62 61 63 6b 2c 20 70 44 62 29 3b 0a 20 20  llback, pDb);.  
dbb0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
dbc0: 20 20 20 73 71 6c 69 74 65 33 5f 73 65 74 5f 61     sqlite3_set_a
dbd0: 75 74 68 6f 72 69 7a 65 72 28 70 44 62 2d 3e 64  uthorizer(pDb->d
dbe0: 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  b, 0, 0);.      
dbf0: 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  }.    }.#endif. 
dc00: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
dc10: 20 2f 2a 20 20 20 20 24 64 62 20 62 61 63 6b 75   /*    $db backu
dc20: 70 20 3f 44 41 54 41 42 41 53 45 3f 20 46 49 4c  p ?DATABASE? FIL
dc30: 45 4e 41 4d 45 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ENAME.  **.  ** 
dc40: 4f 70 65 6e 20 6f 72 20 63 72 65 61 74 65 20 61  Open or create a
dc50: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e   database file n
dc60: 61 6d 65 64 20 46 49 4c 45 4e 41 4d 45 2e 20 20  amed FILENAME.  
dc70: 54 72 61 6e 73 66 65 72 20 74 68 65 0a 20 20 2a  Transfer the.  *
dc80: 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20 6c 6f 63  * content of loc
dc90: 61 6c 20 64 61 74 61 62 61 73 65 20 44 41 54 41  al database DATA
dca0: 42 41 53 45 20 28 64 65 66 61 75 6c 74 3a 20 22  BASE (default: "
dcb0: 6d 61 69 6e 22 29 20 69 6e 74 6f 20 74 68 65 0a  main") into the.
dcc0: 20 20 2a 2a 20 46 49 4c 45 4e 41 4d 45 20 64 61    ** FILENAME da
dcd0: 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 63  tabase..  */.  c
dce0: 61 73 65 20 44 42 5f 42 41 43 4b 55 50 3a 20 7b  ase DB_BACKUP: {
dcf0: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
dd00: 2a 7a 44 65 73 74 46 69 6c 65 3b 0a 20 20 20 20  *zDestFile;.    
dd10: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 72 63  const char *zSrc
dd20: 44 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 20  Db;.    sqlite3 
dd30: 2a 70 44 65 73 74 3b 0a 20 20 20 20 73 71 6c 69  *pDest;.    sqli
dd40: 74 65 33 5f 62 61 63 6b 75 70 20 2a 70 42 61 63  te3_backup *pBac
dd50: 6b 75 70 3b 0a 0a 20 20 20 20 69 66 28 20 6f 62  kup;..    if( ob
dd60: 6a 63 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20 7a  jc==3 ){.      z
dd70: 53 72 63 44 62 20 3d 20 22 6d 61 69 6e 22 3b 0a  SrcDb = "main";.
dd80: 20 20 20 20 20 20 7a 44 65 73 74 46 69 6c 65 20        zDestFile 
dd90: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  = Tcl_GetString(
dda0: 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 20 20 7d 65  objv[2]);.    }e
ddb0: 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d 34 20  lse if( objc==4 
ddc0: 29 7b 0a 20 20 20 20 20 20 7a 53 72 63 44 62 20  ){.      zSrcDb 
ddd0: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  = Tcl_GetString(
dde0: 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 20 20 20 20  objv[2]);.      
ddf0: 7a 44 65 73 74 46 69 6c 65 20 3d 20 54 63 6c 5f  zDestFile = Tcl_
de00: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33  GetString(objv[3
de10: 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ]);.    }else{. 
de20: 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
de30: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
de40: 20 6f 62 6a 76 2c 20 22 3f 44 41 54 41 42 41 53   objv, "?DATABAS
de50: 45 3f 20 46 49 4c 45 4e 41 4d 45 22 29 3b 0a 20  E? FILENAME");. 
de60: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
de70: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
de80: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 6f 70   rc = sqlite3_op
de90: 65 6e 28 7a 44 65 73 74 46 69 6c 65 2c 20 26 70  en(zDestFile, &p
dea0: 44 65 73 74 29 3b 0a 20 20 20 20 69 66 28 20 72  Dest);.    if( r
deb0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
dec0: 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
ded0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
dee0: 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 74 61 72 67  cannot open targ
def0: 65 74 20 64 61 74 61 62 61 73 65 3a 20 22 2c 0a  et database: ",.
df00: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
df10: 65 33 5f 65 72 72 6d 73 67 28 70 44 65 73 74 29  e3_errmsg(pDest)
df20: 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20  , (char*)0);.   
df30: 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65     sqlite3_close
df40: 28 70 44 65 73 74 29 3b 0a 20 20 20 20 20 20 72  (pDest);.      r
df50: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
df60: 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 61 63 6b  .    }.    pBack
df70: 75 70 20 3d 20 73 71 6c 69 74 65 33 5f 62 61 63  up = sqlite3_bac
df80: 6b 75 70 5f 69 6e 69 74 28 70 44 65 73 74 2c 20  kup_init(pDest, 
df90: 22 6d 61 69 6e 22 2c 20 70 44 62 2d 3e 64 62 2c  "main", pDb->db,
dfa0: 20 7a 53 72 63 44 62 29 3b 0a 20 20 20 20 69 66   zSrcDb);.    if
dfb0: 28 20 70 42 61 63 6b 75 70 3d 3d 30 20 29 7b 0a  ( pBackup==0 ){.
dfc0: 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
dfd0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
dfe0: 62 61 63 6b 75 70 20 66 61 69 6c 65 64 3a 20 22  backup failed: "
dff0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  ,.           sql
e000: 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44 65 73  ite3_errmsg(pDes
e010: 74 29 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20  t), (char*)0);. 
e020: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f       sqlite3_clo
e030: 73 65 28 70 44 65 73 74 29 3b 0a 20 20 20 20 20  se(pDest);.     
e040: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
e050: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69  R;.    }.    whi
e060: 6c 65 28 20 20 28 72 63 20 3d 20 73 71 6c 69 74  le(  (rc = sqlit
e070: 65 33 5f 62 61 63 6b 75 70 5f 73 74 65 70 28 70  e3_backup_step(p
e080: 42 61 63 6b 75 70 2c 31 30 30 29 29 3d 3d 53 51  Backup,100))==SQ
e090: 4c 49 54 45 5f 4f 4b 20 29 7b 7d 0a 20 20 20 20  LITE_OK ){}.    
e0a0: 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f 66  sqlite3_backup_f
e0b0: 69 6e 69 73 68 28 70 42 61 63 6b 75 70 29 3b 0a  inish(pBackup);.
e0c0: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
e0d0: 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20  TE_DONE ){.     
e0e0: 20 72 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20   rc = TCL_OK;.  
e0f0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 54    }else{.      T
e100: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
e110: 69 6e 74 65 72 70 2c 20 22 62 61 63 6b 75 70 20  interp, "backup 
e120: 66 61 69 6c 65 64 3a 20 22 2c 0a 20 20 20 20 20  failed: ",.     
e130: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65 72        sqlite3_er
e140: 72 6d 73 67 28 70 44 65 73 74 29 2c 20 28 63 68  rmsg(pDest), (ch
e150: 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 72 63  ar*)0);.      rc
e160: 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20   = TCL_ERROR;.  
e170: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
e180: 63 6c 6f 73 65 28 70 44 65 73 74 29 3b 0a 20 20  close(pDest);.  
e190: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
e1a0: 2f 2a 20 20 20 20 24 64 62 20 62 75 73 79 20 3f  /*    $db busy ?
e1b0: 43 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a 0a 20  CALLBACK?.  **. 
e1c0: 20 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 67   ** Invoke the g
e1d0: 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b 20 69 66  iven callback if
e1e0: 20 61 6e 20 53 51 4c 20 73 74 61 74 65 6d 65 6e   an SQL statemen
e1f0: 74 20 61 74 74 65 6d 70 74 73 20 74 6f 20 6f 70  t attempts to op
e200: 65 6e 0a 20 20 2a 2a 20 61 20 6c 6f 63 6b 65 64  en.  ** a locked
e210: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
e220: 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 42    */.  case DB_B
e230: 55 53 59 3a 20 7b 0a 20 20 20 20 69 66 28 20 6f  USY: {.    if( o
e240: 62 6a 63 3e 33 20 29 7b 0a 20 20 20 20 20 20 54  bjc>3 ){.      T
e250: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
e260: 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c  interp, 2, objv,
e270: 20 22 43 41 4c 4c 42 41 43 4b 22 29 3b 0a 20 20   "CALLBACK");.  
e280: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
e290: 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73 65 20  RROR;.    }else 
e2a0: 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20  if( objc==2 ){. 
e2b0: 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 42       if( pDb->zB
e2c0: 75 73 79 20 29 7b 0a 20 20 20 20 20 20 20 20 54  usy ){.        T
e2d0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
e2e0: 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a 42 75  interp, pDb->zBu
e2f0: 73 79 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  sy, 0);.      }.
e300: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
e310: 20 63 68 61 72 20 2a 7a 42 75 73 79 3b 0a 20 20   char *zBusy;.  
e320: 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20      int len;.   
e330: 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 42 75 73     if( pDb->zBus
e340: 79 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c  y ){.        Tcl
e350: 5f 46 72 65 65 28 70 44 62 2d 3e 7a 42 75 73 79  _Free(pDb->zBusy
e360: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
e370: 20 7a 42 75 73 79 20 3d 20 54 63 6c 5f 47 65 74   zBusy = Tcl_Get
e380: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
e390: 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20  jv[2], &len);.  
e3a0: 20 20 20 20 69 66 28 20 7a 42 75 73 79 20 26 26      if( zBusy &&
e3b0: 20 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20   len>0 ){.      
e3c0: 20 20 70 44 62 2d 3e 7a 42 75 73 79 20 3d 20 54    pDb->zBusy = T
e3d0: 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20  cl_Alloc( len + 
e3e0: 31 20 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  1 );.        mem
e3f0: 63 70 79 28 70 44 62 2d 3e 7a 42 75 73 79 2c 20  cpy(pDb->zBusy, 
e400: 7a 42 75 73 79 2c 20 6c 65 6e 2b 31 29 3b 0a 20  zBusy, len+1);. 
e410: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
e420: 20 20 20 20 70 44 62 2d 3e 7a 42 75 73 79 20 3d      pDb->zBusy =
e430: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
e440: 20 20 69 66 28 20 70 44 62 2d 3e 7a 42 75 73 79    if( pDb->zBusy
e450: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d   ){.        pDb-
e460: 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70  >interp = interp
e470: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
e480: 33 5f 62 75 73 79 5f 68 61 6e 64 6c 65 72 28 70  3_busy_handler(p
e490: 44 62 2d 3e 64 62 2c 20 44 62 42 75 73 79 48 61  Db->db, DbBusyHa
e4a0: 6e 64 6c 65 72 2c 20 70 44 62 29 3b 0a 20 20 20  ndler, pDb);.   
e4b0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
e4c0: 20 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 68    sqlite3_busy_h
e4d0: 61 6e 64 6c 65 72 28 70 44 62 2d 3e 64 62 2c 20  andler(pDb->db, 
e4e0: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  0, 0);.      }. 
e4f0: 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a     }.    break;.
e500: 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 20 24 64    }..  /*     $d
e510: 62 20 63 61 63 68 65 20 66 6c 75 73 68 0a 20 20  b cache flush.  
e520: 2a 2a 20 20 20 20 20 24 64 62 20 63 61 63 68 65  **     $db cache
e530: 20 73 69 7a 65 20 6e 0a 20 20 2a 2a 0a 20 20 2a   size n.  **.  *
e540: 2a 20 46 6c 75 73 68 20 74 68 65 20 70 72 65 70  * Flush the prep
e550: 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 63  ared statement c
e560: 61 63 68 65 2c 20 6f 72 20 73 65 74 20 74 68 65  ache, or set the
e570: 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20   maximum number 
e580: 6f 66 0a 20 20 2a 2a 20 63 61 63 68 65 64 20 73  of.  ** cached s
e590: 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a  tatements..  */.
e5a0: 20 20 63 61 73 65 20 44 42 5f 43 41 43 48 45 3a    case DB_CACHE:
e5b0: 20 7b 0a 20 20 20 20 63 68 61 72 20 2a 73 75 62   {.    char *sub
e5c0: 43 6d 64 3b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a  Cmd;.    int n;.
e5d0: 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3c 3d 32  .    if( objc<=2
e5e0: 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72   ){.      Tcl_Wr
e5f0: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
e600: 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 61 63  p, 1, objv, "cac
e610: 68 65 20 6f 70 74 69 6f 6e 20 3f 61 72 67 3f 22  he option ?arg?"
e620: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
e630: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
e640: 0a 20 20 20 20 73 75 62 43 6d 64 20 3d 20 54 63  .    subCmd = Tc
e650: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
e660: 62 6a 28 20 6f 62 6a 76 5b 32 5d 2c 20 30 20 29  bj( objv[2], 0 )
e670: 3b 0a 20 20 20 20 69 66 28 20 2a 73 75 62 43 6d  ;.    if( *subCm
e680: 64 3d 3d 27 66 27 20 26 26 20 73 74 72 63 6d 70  d=='f' && strcmp
e690: 28 73 75 62 43 6d 64 2c 22 66 6c 75 73 68 22 29  (subCmd,"flush")
e6a0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==0 ){.      if(
e6b0: 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20   objc!=3 ){.    
e6c0: 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
e6d0: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20  Args(interp, 2, 
e6e0: 6f 62 6a 76 2c 20 22 66 6c 75 73 68 22 29 3b 0a  objv, "flush");.
e6f0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54          return T
e700: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  CL_ERROR;.      
e710: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66  }else{.        f
e720: 6c 75 73 68 53 74 6d 74 43 61 63 68 65 28 20 70  lushStmtCache( p
e730: 44 62 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Db );.      }.  
e740: 20 20 7d 65 6c 73 65 20 69 66 28 20 2a 73 75 62    }else if( *sub
e750: 43 6d 64 3d 3d 27 73 27 20 26 26 20 73 74 72 63  Cmd=='s' && strc
e760: 6d 70 28 73 75 62 43 6d 64 2c 22 73 69 7a 65 22  mp(subCmd,"size"
e770: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  )==0 ){.      if
e780: 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20  ( objc!=4 ){.   
e790: 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
e7a0: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
e7b0: 20 6f 62 6a 76 2c 20 22 73 69 7a 65 20 6e 22 29   objv, "size n")
e7c0: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
e7d0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
e7e0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
e7f0: 20 69 66 28 20 54 43 4c 5f 45 52 52 4f 52 3d 3d   if( TCL_ERROR==
e800: 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
e810: 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33  j(interp, objv[3
e820: 5d 2c 20 26 6e 29 20 29 7b 0a 20 20 20 20 20 20  ], &n) ){.      
e830: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
e840: 73 75 6c 74 28 20 69 6e 74 65 72 70 2c 20 22 63  sult( interp, "c
e850: 61 6e 6e 6f 74 20 63 6f 6e 76 65 72 74 20 5c 22  annot convert \"
e860: 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  ", .            
e870: 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
e880: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d 2c  FromObj(objv[3],
e890: 30 29 2c 20 22 5c 22 20 74 6f 20 69 6e 74 65 67  0), "\" to integ
e8a0: 65 72 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  er", 0);.       
e8b0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
e8c0: 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  ROR;.        }el
e8d0: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  se{.          if
e8e0: 28 20 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  ( n<0 ){.       
e8f0: 20 20 20 20 20 66 6c 75 73 68 53 74 6d 74 43 61       flushStmtCa
e900: 63 68 65 28 20 70 44 62 20 29 3b 0a 20 20 20 20  che( pDb );.    
e910: 20 20 20 20 20 20 20 20 6e 20 3d 20 30 3b 0a 20          n = 0;. 
e920: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69           }else i
e930: 66 28 20 6e 3e 4d 41 58 5f 50 52 45 50 41 52 45  f( n>MAX_PREPARE
e940: 44 5f 53 54 4d 54 53 20 29 7b 0a 20 20 20 20 20  D_STMTS ){.     
e950: 20 20 20 20 20 20 20 6e 20 3d 20 4d 41 58 5f 50         n = MAX_P
e960: 52 45 50 41 52 45 44 5f 53 54 4d 54 53 3b 0a 20  REPARED_STMTS;. 
e970: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
e980: 20 20 20 20 20 70 44 62 2d 3e 6d 61 78 53 74 6d       pDb->maxStm
e990: 74 20 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20 7d  t = n;.        }
e9a0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
e9b0: 73 65 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70  se{.      Tcl_Ap
e9c0: 70 65 6e 64 52 65 73 75 6c 74 28 20 69 6e 74 65  pendResult( inte
e9d0: 72 70 2c 20 22 62 61 64 20 6f 70 74 69 6f 6e 20  rp, "bad option 
e9e0: 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20  \"", .          
e9f0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
ea00: 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 30 29 2c  mObj(objv[2],0),
ea10: 20 22 5c 22 3a 20 6d 75 73 74 20 62 65 20 66 6c   "\": must be fl
ea20: 75 73 68 20 6f 72 20 73 69 7a 65 22 2c 20 30 29  ush or size", 0)
ea30: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
ea40: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
ea50: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
ea60: 20 20 2f 2a 20 20 20 20 20 24 64 62 20 63 68 61    /*     $db cha
ea70: 6e 67 65 73 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52  nges.  **.  ** R
ea80: 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
ea90: 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77 65   of rows that we
eaa0: 72 65 20 6d 6f 64 69 66 69 65 64 2c 20 69 6e 73  re modified, ins
eab0: 65 72 74 65 64 2c 20 6f 72 20 64 65 6c 65 74 65  erted, or delete
eac0: 64 20 62 79 0a 20 20 2a 2a 20 74 68 65 20 6d 6f  d by.  ** the mo
ead0: 73 74 20 72 65 63 65 6e 74 20 49 4e 53 45 52 54  st recent INSERT
eae0: 2c 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45  , UPDATE or DELE
eaf0: 54 45 20 73 74 61 74 65 6d 65 6e 74 2c 20 6e 6f  TE statement, no
eb00: 74 20 69 6e 63 6c 75 64 69 6e 67 20 0a 20 20 2a  t including .  *
eb10: 2a 20 61 6e 79 20 63 68 61 6e 67 65 73 20 6d 61  * any changes ma
eb20: 64 65 20 62 79 20 74 72 69 67 67 65 72 20 70 72  de by trigger pr
eb30: 6f 67 72 61 6d 73 2e 0a 20 20 2a 2f 0a 20 20 63  ograms..  */.  c
eb40: 61 73 65 20 44 42 5f 43 48 41 4e 47 45 53 3a 20  ase DB_CHANGES: 
eb50: 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  {.    Tcl_Obj *p
eb60: 52 65 73 75 6c 74 3b 0a 20 20 20 20 69 66 28 20  Result;.    if( 
eb70: 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 20  objc!=2 ){.     
eb80: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
eb90: 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a  s(interp, 2, obj
eba0: 76 2c 20 22 22 29 3b 0a 20 20 20 20 20 20 72 65  v, "");.      re
ebb0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
ebc0: 20 20 20 20 7d 0a 20 20 20 20 70 52 65 73 75 6c      }.    pResul
ebd0: 74 20 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65  t = Tcl_GetObjRe
ebe0: 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  sult(interp);.  
ebf0: 20 20 54 63 6c 5f 53 65 74 49 6e 74 4f 62 6a 28    Tcl_SetIntObj(
ec00: 70 52 65 73 75 6c 74 2c 20 73 71 6c 69 74 65 33  pResult, sqlite3
ec10: 5f 63 68 61 6e 67 65 73 28 70 44 62 2d 3e 64 62  _changes(pDb->db
ec20: 29 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20  ));.    break;. 
ec30: 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20   }..  /*    $db 
ec40: 63 6c 6f 73 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20  close.  **.  ** 
ec50: 53 68 75 74 64 6f 77 6e 20 74 68 65 20 64 61 74  Shutdown the dat
ec60: 61 62 61 73 65 0a 20 20 2a 2f 0a 20 20 63 61 73  abase.  */.  cas
ec70: 65 20 44 42 5f 43 4c 4f 53 45 3a 20 7b 0a 20 20  e DB_CLOSE: {.  
ec80: 20 20 54 63 6c 5f 44 65 6c 65 74 65 43 6f 6d 6d    Tcl_DeleteComm
ec90: 61 6e 64 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  and(interp, Tcl_
eca0: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
ecb0: 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 29 3b 0a 20  (objv[0], 0));. 
ecc0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
ecd0: 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62   /*.  **     $db
ece0: 20 63 6f 6c 6c 61 74 65 20 4e 41 4d 45 20 53 43   collate NAME SC
ecf0: 52 49 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43  RIPT.  **.  ** C
ed00: 72 65 61 74 65 20 61 20 6e 65 77 20 53 51 4c 20  reate a new SQL 
ed10: 63 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69  collation functi
ed20: 6f 6e 20 63 61 6c 6c 65 64 20 4e 41 4d 45 2e 20  on called NAME. 
ed30: 20 57 68 65 6e 65 76 65 72 0a 20 20 2a 2a 20 74   Whenever.  ** t
ed40: 68 61 74 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  hat function is 
ed50: 63 61 6c 6c 65 64 2c 20 69 6e 76 6f 6b 65 20 53  called, invoke S
ed60: 43 52 49 50 54 20 74 6f 20 65 76 61 6c 75 61 74  CRIPT to evaluat
ed70: 65 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 2e 0a  e the function..
ed80: 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 43    */.  case DB_C
ed90: 4f 4c 4c 41 54 45 3a 20 7b 0a 20 20 20 20 53 71  OLLATE: {.    Sq
eda0: 6c 43 6f 6c 6c 61 74 65 20 2a 70 43 6f 6c 6c 61  lCollate *pColla
edb0: 74 65 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4e  te;.    char *zN
edc0: 61 6d 65 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  ame;.    char *z
edd0: 53 63 72 69 70 74 3b 0a 20 20 20 20 69 6e 74 20  Script;.    int 
ede0: 6e 53 63 72 69 70 74 3b 0a 20 20 20 20 69 66 28  nScript;.    if(
edf0: 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20   objc!=4 ){.    
ee00: 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
ee10: 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62  gs(interp, 2, ob
ee20: 6a 76 2c 20 22 4e 41 4d 45 20 53 43 52 49 50 54  jv, "NAME SCRIPT
ee30: 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
ee40: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
ee50: 7d 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 54 63  }.    zName = Tc
ee60: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
ee70: 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30 29 3b 0a  bj(objv[2], 0);.
ee80: 20 20 20 20 7a 53 63 72 69 70 74 20 3d 20 54 63      zScript = Tc
ee90: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
eea0: 62 6a 28 6f 62 6a 76 5b 33 5d 2c 20 26 6e 53 63  bj(objv[3], &nSc
eeb0: 72 69 70 74 29 3b 0a 20 20 20 20 70 43 6f 6c 6c  ript);.    pColl
eec0: 61 74 65 20 3d 20 28 53 71 6c 43 6f 6c 6c 61 74  ate = (SqlCollat
eed0: 65 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28 20 73 69  e*)Tcl_Alloc( si
eee0: 7a 65 6f 66 28 2a 70 43 6f 6c 6c 61 74 65 29 20  zeof(*pCollate) 
eef0: 2b 20 6e 53 63 72 69 70 74 20 2b 20 31 20 29 3b  + nScript + 1 );
ef00: 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 61 74  .    if( pCollat
ef10: 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 54 43  e==0 ) return TC
ef20: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 70 43 6f  L_ERROR;.    pCo
ef30: 6c 6c 61 74 65 2d 3e 69 6e 74 65 72 70 20 3d 20  llate->interp = 
ef40: 69 6e 74 65 72 70 3b 0a 20 20 20 20 70 43 6f 6c  interp;.    pCol
ef50: 6c 61 74 65 2d 3e 70 4e 65 78 74 20 3d 20 70 44  late->pNext = pD
ef60: 62 2d 3e 70 43 6f 6c 6c 61 74 65 3b 0a 20 20 20  b->pCollate;.   
ef70: 20 70 43 6f 6c 6c 61 74 65 2d 3e 7a 53 63 72 69   pCollate->zScri
ef80: 70 74 20 3d 20 28 63 68 61 72 2a 29 26 70 43 6f  pt = (char*)&pCo
ef90: 6c 6c 61 74 65 5b 31 5d 3b 0a 20 20 20 20 70 44  llate[1];.    pD
efa0: 62 2d 3e 70 43 6f 6c 6c 61 74 65 20 3d 20 70 43  b->pCollate = pC
efb0: 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 6d 65 6d 63  ollate;.    memc
efc0: 70 79 28 70 43 6f 6c 6c 61 74 65 2d 3e 7a 53 63  py(pCollate->zSc
efd0: 72 69 70 74 2c 20 7a 53 63 72 69 70 74 2c 20 6e  ript, zScript, n
efe0: 53 63 72 69 70 74 2b 31 29 3b 0a 20 20 20 20 69  Script+1);.    i
eff0: 66 28 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  f( sqlite3_creat
f000: 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 70 44 62 2d  e_collation(pDb-
f010: 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20 53 51 4c 49  >db, zName, SQLI
f020: 54 45 5f 55 54 46 38 2c 20 0a 20 20 20 20 20 20  TE_UTF8, .      
f030: 20 20 70 43 6f 6c 6c 61 74 65 2c 20 74 63 6c 53    pCollate, tclS
f040: 71 6c 43 6f 6c 6c 61 74 65 29 20 29 7b 0a 20 20  qlCollate) ){.  
f050: 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c      Tcl_SetResul
f060: 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20  t(interp, (char 
f070: 2a 29 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  *)sqlite3_errmsg
f080: 28 70 44 62 2d 3e 64 62 29 2c 20 54 43 4c 5f 56  (pDb->db), TCL_V
f090: 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 20 20 20 20  OLATILE);.      
f0a0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
f0b0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61  ;.    }.    brea
f0c0: 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  k;.  }..  /*.  *
f0d0: 2a 20 20 20 20 20 24 64 62 20 63 6f 6c 6c 61 74  *     $db collat
f0e0: 69 6f 6e 5f 6e 65 65 64 65 64 20 53 43 52 49 50  ion_needed SCRIP
f0f0: 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 72 65 61  T.  **.  ** Crea
f100: 74 65 20 61 20 6e 65 77 20 53 51 4c 20 63 6f 6c  te a new SQL col
f110: 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20  lation function 
f120: 63 61 6c 6c 65 64 20 4e 41 4d 45 2e 20 20 57 68  called NAME.  Wh
f130: 65 6e 65 76 65 72 0a 20 20 2a 2a 20 74 68 61 74  enever.  ** that
f140: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
f150: 6c 65 64 2c 20 69 6e 76 6f 6b 65 20 53 43 52 49  led, invoke SCRI
f160: 50 54 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74  PT to evaluate t
f170: 68 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a  he function..  *
f180: 2f 0a 20 20 63 61 73 65 20 44 42 5f 43 4f 4c 4c  /.  case DB_COLL
f190: 41 54 49 4f 4e 5f 4e 45 45 44 45 44 3a 20 7b 0a  ATION_NEEDED: {.
f1a0: 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20      if( objc!=3 
f1b0: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f  ){.      Tcl_Wro
f1c0: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
f1d0: 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 53 43 52 49  , 2, objv, "SCRI
f1e0: 50 54 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  PT");.      retu
f1f0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
f200: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 44 62 2d    }.    if( pDb-
f210: 3e 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64 20  >pCollateNeeded 
f220: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 44 65 63  ){.      Tcl_Dec
f230: 72 52 65 66 43 6f 75 6e 74 28 70 44 62 2d 3e 70  rRefCount(pDb->p
f240: 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64 29 3b 0a  CollateNeeded);.
f250: 20 20 20 20 7d 0a 20 20 20 20 70 44 62 2d 3e 70      }.    pDb->p
f260: 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64 20 3d 20  CollateNeeded = 
f270: 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a  Tcl_DuplicateObj
f280: 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 20 20 54  (objv[2]);.    T
f290: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
f2a0: 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65 65  pDb->pCollateNee
f2b0: 64 65 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ded);.    sqlite
f2c0: 33 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64  3_collation_need
f2d0: 65 64 28 70 44 62 2d 3e 64 62 2c 20 70 44 62 2c  ed(pDb->db, pDb,
f2e0: 20 74 63 6c 43 6f 6c 6c 61 74 65 4e 65 65 64 65   tclCollateNeede
f2f0: 64 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20  d);.    break;. 
f300: 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20   }..  /*    $db 
f310: 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 20 3f 43 41 4c  commit_hook ?CAL
f320: 4c 42 41 43 4b 3f 0a 20 20 2a 2a 0a 20 20 2a 2a  LBACK?.  **.  **
f330: 20 49 6e 76 6f 6b 65 20 74 68 65 20 67 69 76 65   Invoke the give
f340: 6e 20 63 61 6c 6c 62 61 63 6b 20 6a 75 73 74 20  n callback just 
f350: 62 65 66 6f 72 65 20 63 6f 6d 6d 69 74 74 69 6e  before committin
f360: 67 20 65 76 65 72 79 20 53 51 4c 20 74 72 61 6e  g every SQL tran
f370: 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 49 66  saction..  ** If
f380: 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 74 68   the callback th
f390: 72 6f 77 73 20 61 6e 20 65 78 63 65 70 74 69 6f  rows an exceptio
f3a0: 6e 20 6f 72 20 72 65 74 75 72 6e 73 20 6e 6f 6e  n or returns non
f3b0: 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 0a  -zero, then the.
f3c0: 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
f3d0: 20 69 73 20 61 62 6f 72 74 65 64 2e 20 20 49 66   is aborted.  If
f3e0: 20 43 41 4c 4c 42 41 43 4b 20 69 73 20 61 6e 20   CALLBACK is an 
f3f0: 65 6d 70 74 79 20 73 74 72 69 6e 67 2c 20 74 68  empty string, th
f400: 65 20 63 61 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20  e callback.  ** 
f410: 69 73 20 64 69 73 61 62 6c 65 64 2e 0a 20 20 2a  is disabled..  *
f420: 2f 0a 20 20 63 61 73 65 20 44 42 5f 43 4f 4d 4d  /.  case DB_COMM
f430: 49 54 5f 48 4f 4f 4b 3a 20 7b 0a 20 20 20 20 69  IT_HOOK: {.    i
f440: 66 28 20 6f 62 6a 63 3e 33 20 29 7b 0a 20 20 20  f( objc>3 ){.   
f450: 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
f460: 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
f470: 62 6a 76 2c 20 22 3f 43 41 4c 4c 42 41 43 4b 3f  bjv, "?CALLBACK?
f480: 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
f490: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
f4a0: 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d  }else if( objc==
f4b0: 32 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  2 ){.      if( p
f4c0: 44 62 2d 3e 7a 43 6f 6d 6d 69 74 20 29 7b 0a 20  Db->zCommit ){. 
f4d0: 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e         Tcl_Appen
f4e0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
f4f0: 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 2c 20 30 29  pDb->zCommit, 0)
f500: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
f510: 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20  lse{.      char 
f520: 2a 7a 43 6f 6d 6d 69 74 3b 0a 20 20 20 20 20 20  *zCommit;.      
f530: 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20 69  int len;.      i
f540: 66 28 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 20  f( pDb->zCommit 
f550: 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 46  ){.        Tcl_F
f560: 72 65 65 28 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74  ree(pDb->zCommit
f570: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
f580: 20 7a 43 6f 6d 6d 69 74 20 3d 20 54 63 6c 5f 47   zCommit = Tcl_G
f590: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
f5a0: 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a  objv[2], &len);.
f5b0: 20 20 20 20 20 20 69 66 28 20 7a 43 6f 6d 6d 69        if( zCommi
f5c0: 74 20 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20 20  t && len>0 ){.  
f5d0: 20 20 20 20 20 20 70 44 62 2d 3e 7a 43 6f 6d 6d        pDb->zComm
f5e0: 69 74 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 20  it = Tcl_Alloc( 
f5f0: 6c 65 6e 20 2b 20 31 20 29 3b 0a 20 20 20 20 20  len + 1 );.     
f600: 20 20 20 6d 65 6d 63 70 79 28 70 44 62 2d 3e 7a     memcpy(pDb->z
f610: 43 6f 6d 6d 69 74 2c 20 7a 43 6f 6d 6d 69 74 2c  Commit, zCommit,
f620: 20 6c 65 6e 2b 31 29 3b 0a 20 20 20 20 20 20 7d   len+1);.      }
f630: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 44  else{.        pD
f640: 62 2d 3e 7a 43 6f 6d 6d 69 74 20 3d 20 30 3b 0a  b->zCommit = 0;.
f650: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
f660: 28 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 20 29  ( pDb->zCommit )
f670: 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 69  {.        pDb->i
f680: 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a  nterp = interp;.
f690: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
f6a0: 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 28 70 44 62 2d  commit_hook(pDb-
f6b0: 3e 64 62 2c 20 44 62 43 6f 6d 6d 69 74 48 61 6e  >db, DbCommitHan
f6c0: 64 6c 65 72 2c 20 70 44 62 29 3b 0a 20 20 20 20  dler, pDb);.    
f6d0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
f6e0: 20 73 71 6c 69 74 65 33 5f 63 6f 6d 6d 69 74 5f   sqlite3_commit_
f6f0: 68 6f 6f 6b 28 70 44 62 2d 3e 64 62 2c 20 30 2c  hook(pDb->db, 0,
f700: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
f710: 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20   }.    break;.  
f720: 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 63  }..  /*    $db c
f730: 6f 6d 70 6c 65 74 65 20 53 51 4c 0a 20 20 2a 2a  omplete SQL.  **
f740: 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  .  ** Return TRU
f750: 45 20 69 66 20 53 51 4c 20 69 73 20 61 20 63 6f  E if SQL is a co
f760: 6d 70 6c 65 74 65 20 53 51 4c 20 73 74 61 74 65  mplete SQL state
f770: 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 20 46 41  ment.  Return FA
f780: 4c 53 45 20 69 66 0a 20 20 2a 2a 20 61 64 64 69  LSE if.  ** addi
f790: 74 69 6f 6e 61 6c 20 6c 69 6e 65 73 20 6f 66 20  tional lines of 
f7a0: 69 6e 70 75 74 20 61 72 65 20 6e 65 65 64 65 64  input are needed
f7b0: 2e 20 20 54 68 69 73 20 69 73 20 73 69 6d 69 6c  .  This is simil
f7c0: 61 72 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 62  ar to the.  ** b
f7d0: 75 69 6c 74 2d 69 6e 20 22 69 6e 66 6f 20 63 6f  uilt-in "info co
f7e0: 6d 70 6c 65 74 65 22 20 63 6f 6d 6d 61 6e 64 20  mplete" command 
f7f0: 6f 66 20 54 63 6c 2e 0a 20 20 2a 2f 0a 20 20 63  of Tcl..  */.  c
f800: 61 73 65 20 44 42 5f 43 4f 4d 50 4c 45 54 45 3a  ase DB_COMPLETE:
f810: 20 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   {.#ifndef SQLIT
f820: 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4c 45 54 45 0a  E_OMIT_COMPLETE.
f830: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65      Tcl_Obj *pRe
f840: 73 75 6c 74 3b 0a 20 20 20 20 69 6e 74 20 69 73  sult;.    int is
f850: 43 6f 6d 70 6c 65 74 65 3b 0a 20 20 20 20 69 66  Complete;.    if
f860: 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20  ( objc!=3 ){.   
f870: 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
f880: 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
f890: 62 6a 76 2c 20 22 53 51 4c 22 29 3b 0a 20 20 20  bjv, "SQL");.   
f8a0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
f8b0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ROR;.    }.    i
f8c0: 73 43 6f 6d 70 6c 65 74 65 20 3d 20 73 71 6c 69  sComplete = sqli
f8d0: 74 65 33 5f 63 6f 6d 70 6c 65 74 65 28 20 54 63  te3_complete( Tc
f8e0: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
f8f0: 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30 29 20 29  bj(objv[2], 0) )
f900: 3b 0a 20 20 20 20 70 52 65 73 75 6c 74 20 3d 20  ;.    pResult = 
f910: 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_GetObjResult
f920: 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 63  (interp);.    Tc
f930: 6c 5f 53 65 74 42 6f 6f 6c 65 61 6e 4f 62 6a 28  l_SetBooleanObj(
f940: 70 52 65 73 75 6c 74 2c 20 69 73 43 6f 6d 70 6c  pResult, isCompl
f950: 65 74 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  ete);.#endif.   
f960: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
f970: 2a 20 20 20 20 24 64 62 20 63 6f 70 79 20 63 6f  *    $db copy co
f980: 6e 66 6c 69 63 74 2d 61 6c 67 6f 72 69 74 68 6d  nflict-algorithm
f990: 20 74 61 62 6c 65 20 66 69 6c 65 6e 61 6d 65 20   table filename 
f9a0: 3f 53 45 50 41 52 41 54 4f 52 3f 20 3f 4e 55 4c  ?SEPARATOR? ?NUL
f9b0: 4c 49 4e 44 49 43 41 54 4f 52 3f 0a 20 20 2a 2a  LINDICATOR?.  **
f9c0: 0a 20 20 2a 2a 20 43 6f 70 79 20 64 61 74 61 20  .  ** Copy data 
f9d0: 69 6e 74 6f 20 74 61 62 6c 65 20 66 72 6f 6d 20  into table from 
f9e0: 66 69 6c 65 6e 61 6d 65 2c 20 6f 70 74 69 6f 6e  filename, option
f9f0: 61 6c 6c 79 20 75 73 69 6e 67 20 53 45 50 41 52  ally using SEPAR
fa00: 41 54 4f 52 0a 20 20 2a 2a 20 61 73 20 63 6f 6c  ATOR.  ** as col
fa10: 75 6d 6e 20 73 65 70 61 72 61 74 6f 72 73 2e 20  umn separators. 
fa20: 20 49 66 20 61 20 63 6f 6c 75 6d 6e 20 63 6f 6e   If a column con
fa30: 74 61 69 6e 73 20 61 20 6e 75 6c 6c 20 73 74 72  tains a null str
fa40: 69 6e 67 2c 20 6f 72 20 74 68 65 0a 20 20 2a 2a  ing, or the.  **
fa50: 20 76 61 6c 75 65 20 6f 66 20 4e 55 4c 4c 49 4e   value of NULLIN
fa60: 44 49 43 41 54 4f 52 2c 20 61 20 4e 55 4c 4c 20  DICATOR, a NULL 
fa70: 69 73 20 69 6e 73 65 72 74 65 64 20 66 6f 72 20  is inserted for 
fa80: 74 68 65 20 63 6f 6c 75 6d 6e 2e 0a 20 20 2a 2a  the column..  **
fa90: 20 63 6f 6e 66 6c 69 63 74 2d 61 6c 67 6f 72 69   conflict-algori
faa0: 74 68 6d 20 69 73 20 6f 6e 65 20 6f 66 20 74 68  thm is one of th
fab0: 65 20 73 71 6c 69 74 65 20 63 6f 6e 66 6c 69 63  e sqlite conflic
fac0: 74 20 61 6c 67 6f 72 69 74 68 6d 73 3a 0a 20 20  t algorithms:.  
fad0: 2a 2a 20 20 20 20 72 6f 6c 6c 62 61 63 6b 2c 20  **    rollback, 
fae0: 61 62 6f 72 74 2c 20 66 61 69 6c 2c 20 69 67 6e  abort, fail, ign
faf0: 6f 72 65 2c 20 72 65 70 6c 61 63 65 0a 20 20 2a  ore, replace.  *
fb00: 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c 20 72 65  * On success, re
fb10: 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
fb20: 6f 66 20 6c 69 6e 65 73 20 70 72 6f 63 65 73 73  of lines process
fb30: 65 64 2c 20 6e 6f 74 20 6e 65 63 65 73 73 61 72  ed, not necessar
fb40: 69 6c 79 20 73 61 6d 65 0a 20 20 2a 2a 20 61 73  ily same.  ** as
fb50: 20 27 64 62 20 63 68 61 6e 67 65 73 27 20 64 75   'db changes' du
fb60: 65 20 74 6f 20 63 6f 6e 66 6c 69 63 74 2d 61 6c  e to conflict-al
fb70: 67 6f 72 69 74 68 6d 20 73 65 6c 65 63 74 65 64  gorithm selected
fb80: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73  ..  **.  ** This
fb90: 20 63 6f 64 65 20 69 73 20 62 61 73 69 63 61 6c   code is basical
fba0: 6c 79 20 61 6e 20 69 6d 70 6c 65 6d 65 6e 74 61  ly an implementa
fbb0: 74 69 6f 6e 2f 65 6e 68 61 6e 63 65 6d 65 6e 74  tion/enhancement
fbc0: 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 73 71 6c   of.  ** the sql
fbd0: 69 74 65 33 20 73 68 65 6c 6c 2e 63 20 22 2e 69  ite3 shell.c ".i
fbe0: 6d 70 6f 72 74 22 20 63 6f 6d 6d 61 6e 64 2e 0a  mport" command..
fbf0: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 63    **.  ** This c
fc00: 6f 6d 6d 61 6e 64 20 75 73 61 67 65 20 69 73 20  ommand usage is 
fc10: 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 74 68  equivalent to th
fc20: 65 20 73 71 6c 69 74 65 32 2e 78 20 43 4f 50 59  e sqlite2.x COPY
fc30: 20 73 74 61 74 65 6d 65 6e 74 2c 0a 20 20 2a 2a   statement,.  **
fc40: 20 77 68 69 63 68 20 69 6d 70 6f 72 74 73 20 66   which imports f
fc50: 69 6c 65 20 64 61 74 61 20 69 6e 74 6f 20 61 20  ile data into a 
fc60: 74 61 62 6c 65 20 75 73 69 6e 67 20 74 68 65 20  table using the 
fc70: 50 6f 73 74 67 72 65 53 51 4c 20 43 4f 50 59 20  PostgreSQL COPY 
fc80: 66 69 6c 65 20 66 6f 72 6d 61 74 3a 0a 20 20 2a  file format:.  *
fc90: 2a 20 20 20 24 64 62 20 63 6f 70 79 20 24 63 6f  *   $db copy $co
fca0: 6e 66 6c 69 74 5f 61 6c 67 6f 20 24 74 61 62 6c  nflit_algo $tabl
fcb0: 65 5f 6e 61 6d 65 20 24 66 69 6c 65 6e 61 6d 65  e_name $filename
fcc0: 20 5c 74 20 5c 5c 4e 0a 20 20 2a 2f 0a 20 20 63   \t \\N.  */.  c
fcd0: 61 73 65 20 44 42 5f 43 4f 50 59 3a 20 7b 0a 20  ase DB_COPY: {. 
fce0: 20 20 20 63 68 61 72 20 2a 7a 54 61 62 6c 65 3b     char *zTable;
fcf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
fd00: 2a 20 49 6e 73 65 72 74 20 64 61 74 61 20 69 6e  * Insert data in
fd10: 74 6f 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f  to this table */
fd20: 0a 20 20 20 20 63 68 61 72 20 2a 7a 46 69 6c 65  .    char *zFile
fd30: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
fd40: 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 66 72 6f   /* The file fro
fd50: 6d 20 77 68 69 63 68 20 74 6f 20 65 78 74 72 61  m which to extra
fd60: 63 74 20 64 61 74 61 20 2a 2f 0a 20 20 20 20 63  ct data */.    c
fd70: 68 61 72 20 2a 7a 43 6f 6e 66 6c 69 63 74 3b 20  har *zConflict; 
fd80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
fd90: 65 20 63 6f 6e 66 6c 69 63 74 20 61 6c 67 6f 72  e conflict algor
fda0: 69 74 68 6d 20 74 6f 20 75 73 65 20 2a 2f 0a 20  ithm to use */. 
fdb0: 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20     sqlite3_stmt 
fdc0: 2a 70 53 74 6d 74 3b 20 20 20 20 20 20 20 20 2f  *pStmt;        /
fdd0: 2a 20 41 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  * A statement */
fde0: 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20  .    int nCol;  
fdf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fe00: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f   /* Number of co
fe10: 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 74 61 62  lumns in the tab
fe20: 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 42  le */.    int nB
fe30: 79 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  yte;            
fe40: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
fe50: 6f 66 20 62 79 74 65 73 20 69 6e 20 61 6e 20 53  of bytes in an S
fe60: 51 4c 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 20  QL string */.   
fe70: 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20   int i, j;      
fe80: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
fe90: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f  Loop counters */
fea0: 0a 20 20 20 20 69 6e 74 20 6e 53 65 70 3b 20 20  .    int nSep;  
feb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fec0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
fed0: 74 65 73 20 69 6e 20 7a 53 65 70 5b 5d 20 2a 2f  tes in zSep[] */
fee0: 0a 20 20 20 20 69 6e 74 20 6e 4e 75 6c 6c 3b 20  .    int nNull; 
fef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ff00: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
ff10: 74 65 73 20 69 6e 20 7a 4e 75 6c 6c 5b 5d 20 2a  tes in zNull[] *
ff20: 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 71 6c  /.    char *zSql
ff30: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
ff40: 20 20 2f 2a 20 41 6e 20 53 51 4c 20 73 74 61 74    /* An SQL stat
ff50: 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 63 68 61  ement */.    cha
ff60: 72 20 2a 7a 4c 69 6e 65 3b 20 20 20 20 20 20 20  r *zLine;       
ff70: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69           /* A si
ff80: 6e 67 6c 65 20 6c 69 6e 65 20 6f 66 20 69 6e 70  ngle line of inp
ff90: 75 74 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65  ut from the file
ffa0: 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 2a 61   */.    char **a
ffb0: 7a 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20  zCol;           
ffc0: 20 20 20 20 2f 2a 20 7a 4c 69 6e 65 5b 5d 20 62      /* zLine[] b
ffd0: 72 6f 6b 65 6e 20 75 70 20 69 6e 74 6f 20 63 6f  roken up into co
ffe0: 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 63 68 61  lumns */.    cha
fff0: 72 20 2a 7a 43 6f 6d 6d 69 74 3b 20 20 20 20 20  r *zCommit;     
10000 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f 77 20           /* How 
10010 74 6f 20 63 6f 6d 6d 69 74 20 63 68 61 6e 67 65  to commit change
10020 73 20 2a 2f 0a 20 20 20 20 46 49 4c 45 20 2a 69  s */.    FILE *i
10030 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
10040 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 70 75       /* The inpu
10050 74 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 69 6e  t file */.    in
10060 74 20 6c 69 6e 65 6e 6f 20 3d 20 30 3b 20 20 20  t lineno = 0;   
10070 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e            /* Lin
10080 65 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 70 75  e number of inpu
10090 74 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 63 68  t file */.    ch
100a0 61 72 20 7a 4c 69 6e 65 4e 75 6d 5b 38 30 5d 3b  ar zLineNum[80];
100b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e            /* Lin
100c0 65 20 6e 75 6d 62 65 72 20 70 72 69 6e 74 20 62  e number print b
100d0 75 66 66 65 72 20 2a 2f 0a 20 20 20 20 54 63 6c  uffer */.    Tcl
100e0 5f 4f 62 6a 20 2a 70 52 65 73 75 6c 74 3b 20 20  _Obj *pResult;  
100f0 20 20 20 20 20 20 20 20 20 2f 2a 20 69 6e 74 65           /* inte
10100 72 70 20 72 65 73 75 6c 74 20 2a 2f 0a 0a 20 20  rp result */..  
10110 20 20 63 68 61 72 20 2a 7a 53 65 70 3b 0a 20 20    char *zSep;.  
10120 20 20 63 68 61 72 20 2a 7a 4e 75 6c 6c 3b 0a 20    char *zNull;. 
10130 20 20 20 69 66 28 20 6f 62 6a 63 3c 35 20 7c 7c     if( objc<5 ||
10140 20 6f 62 6a 63 3e 37 20 29 7b 0a 20 20 20 20 20   objc>7 ){.     
10150 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
10160 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a  s(interp, 2, obj
10170 76 2c 20 0a 20 20 20 20 20 20 20 20 20 22 43 4f  v, .         "CO
10180 4e 46 4c 49 43 54 2d 41 4c 47 4f 52 49 54 48 4d  NFLICT-ALGORITHM
10190 20 54 41 42 4c 45 20 46 49 4c 45 4e 41 4d 45 20   TABLE FILENAME 
101a0 3f 53 45 50 41 52 41 54 4f 52 3f 20 3f 4e 55 4c  ?SEPARATOR? ?NUL
101b0 4c 49 4e 44 49 43 41 54 4f 52 3f 22 29 3b 0a 20  LINDICATOR?");. 
101c0 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
101d0 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
101e0 20 69 66 28 20 6f 62 6a 63 3e 3d 36 20 29 7b 0a   if( objc>=6 ){.
101f0 20 20 20 20 20 20 7a 53 65 70 20 3d 20 54 63 6c        zSep = Tcl
10200 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
10210 6a 28 6f 62 6a 76 5b 35 5d 2c 20 30 29 3b 0a 20  j(objv[5], 0);. 
10220 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
10230 7a 53 65 70 20 3d 20 22 5c 74 22 3b 0a 20 20 20  zSep = "\t";.   
10240 20 7d 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3e   }.    if( objc>
10250 3d 37 20 29 7b 0a 20 20 20 20 20 20 7a 4e 75 6c  =7 ){.      zNul
10260 6c 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  l = Tcl_GetStrin
10270 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 36 5d  gFromObj(objv[6]
10280 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , 0);.    }else{
10290 0a 20 20 20 20 20 20 7a 4e 75 6c 6c 20 3d 20 22  .      zNull = "
102a0 22 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 43 6f  ";.    }.    zCo
102b0 6e 66 6c 69 63 74 20 3d 20 54 63 6c 5f 47 65 74  nflict = Tcl_Get
102c0 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
102d0 6a 76 5b 32 5d 2c 20 30 29 3b 0a 20 20 20 20 7a  jv[2], 0);.    z
102e0 54 61 62 6c 65 20 3d 20 54 63 6c 5f 47 65 74 53  Table = Tcl_GetS
102f0 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
10300 76 5b 33 5d 2c 20 30 29 3b 0a 20 20 20 20 7a 46  v[3], 0);.    zF
10310 69 6c 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  ile = Tcl_GetStr
10320 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
10330 34 5d 2c 20 30 29 3b 0a 20 20 20 20 6e 53 65 70  4], 0);.    nSep
10340 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 53 65 70   = strlen30(zSep
10350 29 3b 0a 20 20 20 20 6e 4e 75 6c 6c 20 3d 20 73  );.    nNull = s
10360 74 72 6c 65 6e 33 30 28 7a 4e 75 6c 6c 29 3b 0a  trlen30(zNull);.
10370 20 20 20 20 69 66 28 20 6e 53 65 70 3d 3d 30 20      if( nSep==0 
10380 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70  ){.      Tcl_App
10390 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
103a0 2c 22 45 72 72 6f 72 3a 20 6e 6f 6e 2d 6e 75 6c  ,"Error: non-nul
103b0 6c 20 73 65 70 61 72 61 74 6f 72 20 72 65 71 75  l separator requ
103c0 69 72 65 64 20 66 6f 72 20 63 6f 70 79 22 2c 30  ired for copy",0
103d0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
103e0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
103f0 0a 20 20 20 20 69 66 28 73 74 72 63 6d 70 28 7a  .    if(strcmp(z
10400 43 6f 6e 66 6c 69 63 74 2c 20 22 72 6f 6c 6c 62  Conflict, "rollb
10410 61 63 6b 22 29 20 21 3d 20 30 20 26 26 0a 20 20  ack") != 0 &&.  
10420 20 20 20 20 20 73 74 72 63 6d 70 28 7a 43 6f 6e       strcmp(zCon
10430 66 6c 69 63 74 2c 20 22 61 62 6f 72 74 22 20 20  flict, "abort"  
10440 20 29 20 21 3d 20 30 20 26 26 0a 20 20 20 20 20   ) != 0 &&.     
10450 20 20 73 74 72 63 6d 70 28 7a 43 6f 6e 66 6c 69    strcmp(zConfli
10460 63 74 2c 20 22 66 61 69 6c 22 20 20 20 20 29 20  ct, "fail"    ) 
10470 21 3d 20 30 20 26 26 0a 20 20 20 20 20 20 20 73  != 0 &&.       s
10480 74 72 63 6d 70 28 7a 43 6f 6e 66 6c 69 63 74 2c  trcmp(zConflict,
10490 20 22 69 67 6e 6f 72 65 22 20 20 29 20 21 3d 20   "ignore"  ) != 
104a0 30 20 26 26 0a 20 20 20 20 20 20 20 73 74 72 63  0 &&.       strc
104b0 6d 70 28 7a 43 6f 6e 66 6c 69 63 74 2c 20 22 72  mp(zConflict, "r
104c0 65 70 6c 61 63 65 22 20 29 20 21 3d 20 30 20 29  eplace" ) != 0 )
104d0 20 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70   {.      Tcl_App
104e0 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
104f0 2c 20 22 45 72 72 6f 72 3a 20 5c 22 22 2c 20 7a  , "Error: \"", z
10500 43 6f 6e 66 6c 69 63 74 2c 20 0a 20 20 20 20 20  Conflict, .     
10510 20 20 20 20 20 20 20 22 5c 22 2c 20 63 6f 6e 66         "\", conf
10520 6c 69 63 74 2d 61 6c 67 6f 72 69 74 68 6d 20 6d  lict-algorithm m
10530 75 73 74 20 62 65 20 6f 6e 65 20 6f 66 3a 20 72  ust be one of: r
10540 6f 6c 6c 62 61 63 6b 2c 20 22 0a 20 20 20 20 20  ollback, ".     
10550 20 20 20 20 20 20 20 22 61 62 6f 72 74 2c 20 66         "abort, f
10560 61 69 6c 2c 20 69 67 6e 6f 72 65 2c 20 6f 72 20  ail, ignore, or 
10570 72 65 70 6c 61 63 65 22 2c 20 30 29 3b 0a 20 20  replace", 0);.  
10580 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
10590 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
105a0 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zSql = sqlite3_m
105b0 70 72 69 6e 74 66 28 22 53 45 4c 45 43 54 20 2a  printf("SELECT *
105c0 20 46 52 4f 4d 20 27 25 71 27 22 2c 20 7a 54 61   FROM '%q'", zTa
105d0 62 6c 65 29 3b 0a 20 20 20 20 69 66 28 20 7a 53  ble);.    if( zS
105e0 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 54  ql==0 ){.      T
105f0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
10600 69 6e 74 65 72 70 2c 20 22 45 72 72 6f 72 3a 20  interp, "Error: 
10610 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 3a 20 22  no such table: "
10620 2c 20 7a 54 61 62 6c 65 2c 20 30 29 3b 0a 20 20  , zTable, 0);.  
10630 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
10640 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
10650 6e 42 79 74 65 20 3d 20 73 74 72 6c 65 6e 33 30  nByte = strlen30
10660 28 7a 53 71 6c 29 3b 0a 20 20 20 20 72 63 20 3d  (zSql);.    rc =
10670 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
10680 28 70 44 62 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20  (pDb->db, zSql, 
10690 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a  -1, &pStmt, 0);.
106a0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
106b0 28 7a 53 71 6c 29 3b 0a 20 20 20 20 69 66 28 20  (zSql);.    if( 
106c0 72 63 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  rc ){.      Tcl_
106d0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
106e0 65 72 70 2c 20 22 45 72 72 6f 72 3a 20 22 2c 20  erp, "Error: ", 
106f0 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70  sqlite3_errmsg(p
10700 44 62 2d 3e 64 62 29 2c 20 30 29 3b 0a 20 20 20  Db->db), 0);.   
10710 20 20 20 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20     nCol = 0;.   
10720 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 43   }else{.      nC
10730 6f 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  ol = sqlite3_col
10740 75 6d 6e 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29  umn_count(pStmt)
10750 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
10760 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
10770 6d 74 29 3b 0a 20 20 20 20 69 66 28 20 6e 43 6f  mt);.    if( nCo
10780 6c 3d 3d 30 20 29 20 7b 0a 20 20 20 20 20 20 72  l==0 ) {.      r
10790 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
107a0 0a 20 20 20 20 7d 0a 20 20 20 20 7a 53 71 6c 20  .    }.    zSql 
107b0 3d 20 6d 61 6c 6c 6f 63 28 20 6e 42 79 74 65 20  = malloc( nByte 
107c0 2b 20 35 30 20 2b 20 6e 43 6f 6c 2a 32 20 29 3b  + 50 + nCol*2 );
107d0 0a 20 20 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30  .    if( zSql==0
107e0 20 29 20 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41   ) {.      Tcl_A
107f0 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
10800 72 70 2c 20 22 45 72 72 6f 72 3a 20 63 61 6e 27  rp, "Error: can'
10810 74 20 6d 61 6c 6c 6f 63 28 29 22 2c 20 30 29 3b  t malloc()", 0);
10820 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
10830 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
10840 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
10850 6e 74 66 28 6e 42 79 74 65 2b 35 30 2c 20 7a 53  ntf(nByte+50, zS
10860 71 6c 2c 20 22 49 4e 53 45 52 54 20 4f 52 20 25  ql, "INSERT OR %
10870 71 20 49 4e 54 4f 20 27 25 71 27 20 56 41 4c 55  q INTO '%q' VALU
10880 45 53 28 3f 22 2c 0a 20 20 20 20 20 20 20 20 20  ES(?",.         
10890 7a 43 6f 6e 66 6c 69 63 74 2c 20 7a 54 61 62 6c  zConflict, zTabl
108a0 65 29 3b 0a 20 20 20 20 6a 20 3d 20 73 74 72 6c  e);.    j = strl
108b0 65 6e 33 30 28 7a 53 71 6c 29 3b 0a 20 20 20 20  en30(zSql);.    
108c0 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 43 6f 6c 3b  for(i=1; i<nCol;
108d0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 7a 53 71   i++){.      zSq
108e0 6c 5b 6a 2b 2b 5d 20 3d 20 27 2c 27 3b 0a 20 20  l[j++] = ',';.  
108f0 20 20 20 20 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d 20      zSql[j++] = 
10900 27 3f 27 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a  '?';.    }.    z
10910 53 71 6c 5b 6a 2b 2b 5d 20 3d 20 27 29 27 3b 0a  Sql[j++] = ')';.
10920 20 20 20 20 7a 53 71 6c 5b 6a 5d 20 3d 20 30 3b      zSql[j] = 0;
10930 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
10940 33 5f 70 72 65 70 61 72 65 28 70 44 62 2d 3e 64  3_prepare(pDb->d
10950 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53  b, zSql, -1, &pS
10960 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 66 72 65  tmt, 0);.    fre
10970 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 69 66 28  e(zSql);.    if(
10980 20 72 63 20 29 7b 0a 20 20 20 20 20 20 54 63 6c   rc ){.      Tcl
10990 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
109a0 74 65 72 70 2c 20 22 45 72 72 6f 72 3a 20 22 2c  terp, "Error: ",
109b0 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
109c0 70 44 62 2d 3e 64 62 29 2c 20 30 29 3b 0a 20 20  pDb->db), 0);.  
109d0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61      sqlite3_fina
109e0 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20  lize(pStmt);.   
109f0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
10a00 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ROR;.    }.    i
10a10 6e 20 3d 20 66 6f 70 65 6e 28 7a 46 69 6c 65 2c  n = fopen(zFile,
10a20 20 22 72 62 22 29 3b 0a 20 20 20 20 69 66 28 20   "rb");.    if( 
10a30 69 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 54  in==0 ){.      T
10a40 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
10a50 69 6e 74 65 72 70 2c 20 22 45 72 72 6f 72 3a 20  interp, "Error: 
10a60 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 66 69 6c 65  cannot open file
10a70 3a 20 22 2c 20 7a 46 69 6c 65 2c 20 4e 55 4c 4c  : ", zFile, NULL
10a80 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
10a90 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
10aa0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
10ab0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
10ac0 20 20 20 20 61 7a 43 6f 6c 20 3d 20 6d 61 6c 6c      azCol = mall
10ad0 6f 63 28 20 73 69 7a 65 6f 66 28 61 7a 43 6f 6c  oc( sizeof(azCol
10ae0 5b 30 5d 29 2a 28 6e 43 6f 6c 2b 31 29 20 29 3b  [0])*(nCol+1) );
10af0 0a 20 20 20 20 69 66 28 20 61 7a 43 6f 6c 3d 3d  .    if( azCol==
10b00 30 20 29 20 7b 0a 20 20 20 20 20 20 54 63 6c 5f  0 ) {.      Tcl_
10b10 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
10b20 65 72 70 2c 20 22 45 72 72 6f 72 3a 20 63 61 6e  erp, "Error: can
10b30 27 74 20 6d 61 6c 6c 6f 63 28 29 22 2c 20 30 29  't malloc()", 0)
10b40 3b 0a 20 20 20 20 20 20 66 63 6c 6f 73 65 28 69  ;.      fclose(i
10b50 6e 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  n);.      return
10b60 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
10b70 7d 0a 20 20 20 20 28 76 6f 69 64 29 73 71 6c 69  }.    (void)sqli
10b80 74 65 33 5f 65 78 65 63 28 70 44 62 2d 3e 64 62  te3_exec(pDb->db
10b90 2c 20 22 42 45 47 49 4e 22 2c 20 30 2c 20 30 2c  , "BEGIN", 0, 0,
10ba0 20 30 29 3b 0a 20 20 20 20 7a 43 6f 6d 6d 69 74   0);.    zCommit
10bb0 20 3d 20 22 43 4f 4d 4d 49 54 22 3b 0a 20 20 20   = "COMMIT";.   
10bc0 20 77 68 69 6c 65 28 20 28 7a 4c 69 6e 65 20 3d   while( (zLine =
10bd0 20 6c 6f 63 61 6c 5f 67 65 74 6c 69 6e 65 28 30   local_getline(0
10be0 2c 20 69 6e 29 29 21 3d 30 20 29 7b 0a 20 20 20  , in))!=0 ){.   
10bf0 20 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20     char *z;.    
10c00 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20    lineno++;.    
10c10 20 20 61 7a 43 6f 6c 5b 30 5d 20 3d 20 7a 4c 69    azCol[0] = zLi
10c20 6e 65 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  ne;.      for(i=
10c30 30 2c 20 7a 3d 7a 4c 69 6e 65 3b 20 2a 7a 3b 20  0, z=zLine; *z; 
10c40 7a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  z++){.        if
10c50 28 20 2a 7a 3d 3d 7a 53 65 70 5b 30 5d 20 26 26  ( *z==zSep[0] &&
10c60 20 73 74 72 6e 63 6d 70 28 7a 2c 20 7a 53 65 70   strncmp(z, zSep
10c70 2c 20 6e 53 65 70 29 3d 3d 30 20 29 7b 0a 20 20  , nSep)==0 ){.  
10c80 20 20 20 20 20 20 20 20 2a 7a 20 3d 20 30 3b 0a          *z = 0;.
10c90 20 20 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20            i++;. 
10ca0 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3c 6e           if( i<n
10cb0 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Col ){.         
10cc0 20 20 20 61 7a 43 6f 6c 5b 69 5d 20 3d 20 26 7a     azCol[i] = &z
10cd0 5b 6e 53 65 70 5d 3b 0a 20 20 20 20 20 20 20 20  [nSep];.        
10ce0 20 20 20 20 7a 20 2b 3d 20 6e 53 65 70 2d 31 3b      z += nSep-1;
10cf0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
10d00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
10d10 20 20 20 20 20 69 66 28 20 69 2b 31 21 3d 6e 43       if( i+1!=nC
10d20 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68  ol ){.        ch
10d30 61 72 20 2a 7a 45 72 72 3b 0a 20 20 20 20 20 20  ar *zErr;.      
10d40 20 20 69 6e 74 20 6e 45 72 72 20 3d 20 73 74 72    int nErr = str
10d50 6c 65 6e 33 30 28 7a 46 69 6c 65 29 20 2b 20 32  len30(zFile) + 2
10d60 30 30 3b 0a 20 20 20 20 20 20 20 20 7a 45 72 72  00;.        zErr
10d70 20 3d 20 6d 61 6c 6c 6f 63 28 6e 45 72 72 29 3b   = malloc(nErr);
10d80 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 45 72  .        if( zEr
10d90 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  r ){.          s
10da0 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
10db0 6e 45 72 72 2c 20 7a 45 72 72 2c 0a 20 20 20 20  nErr, zErr,.    
10dc0 20 20 20 20 20 20 20 20 20 22 45 72 72 6f 72 3a           "Error:
10dd0 20 25 73 20 6c 69 6e 65 20 25 64 3a 20 65 78 70   %s line %d: exp
10de0 65 63 74 65 64 20 25 64 20 63 6f 6c 75 6d 6e 73  ected %d columns
10df0 20 6f 66 20 64 61 74 61 20 62 75 74 20 66 6f 75   of data but fou
10e00 6e 64 20 25 64 22 2c 0a 20 20 20 20 20 20 20 20  nd %d",.        
10e10 20 20 20 20 20 7a 46 69 6c 65 2c 20 6c 69 6e 65       zFile, line
10e20 6e 6f 2c 20 6e 43 6f 6c 2c 20 69 2b 31 29 3b 0a  no, nCol, i+1);.
10e30 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70            Tcl_Ap
10e40 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
10e50 70 2c 20 7a 45 72 72 2c 20 30 29 3b 0a 20 20 20  p, zErr, 0);.   
10e60 20 20 20 20 20 20 20 66 72 65 65 28 7a 45 72 72         free(zErr
10e70 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
10e80 20 20 20 20 20 7a 43 6f 6d 6d 69 74 20 3d 20 22       zCommit = "
10e90 52 4f 4c 4c 42 41 43 4b 22 3b 0a 20 20 20 20 20  ROLLBACK";.     
10ea0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
10eb0 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  }.      for(i=0;
10ec0 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20   i<nCol; i++){. 
10ed0 20 20 20 20 20 20 20 2f 2a 20 63 68 65 63 6b 20         /* check 
10ee0 66 6f 72 20 6e 75 6c 6c 20 64 61 74 61 2c 20 69  for null data, i
10ef0 66 20 73 6f 2c 20 62 69 6e 64 20 61 73 20 6e 75  f so, bind as nu
10f00 6c 6c 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66  ll */.        if
10f10 28 20 28 6e 4e 75 6c 6c 3e 30 20 26 26 20 73 74  ( (nNull>0 && st
10f20 72 63 6d 70 28 61 7a 43 6f 6c 5b 69 5d 2c 20 7a  rcmp(azCol[i], z
10f30 4e 75 6c 6c 29 3d 3d 30 29 0a 20 20 20 20 20 20  Null)==0).      
10f40 20 20 20 20 7c 7c 20 73 74 72 6c 65 6e 33 30 28      || strlen30(
10f50 61 7a 43 6f 6c 5b 69 5d 29 3d 3d 30 20 0a 20 20  azCol[i])==0 .  
10f60 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
10f70 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
10f80 6e 75 6c 6c 28 70 53 74 6d 74 2c 20 69 2b 31 29  null(pStmt, i+1)
10f90 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
10fa0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
10fb0 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 53 74  e3_bind_text(pSt
10fc0 6d 74 2c 20 69 2b 31 2c 20 61 7a 43 6f 6c 5b 69  mt, i+1, azCol[i
10fd0 5d 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54  ], -1, SQLITE_ST
10fe0 41 54 49 43 29 3b 0a 20 20 20 20 20 20 20 20 7d  ATIC);.        }
10ff0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
11000 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d  qlite3_step(pStm
11010 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  t);.      rc = s
11020 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53 74  qlite3_reset(pSt
11030 6d 74 29 3b 0a 20 20 20 20 20 20 66 72 65 65 28  mt);.      free(
11040 7a 4c 69 6e 65 29 3b 0a 20 20 20 20 20 20 69 66  zLine);.      if
11050 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
11060 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41  ){.        Tcl_A
11070 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
11080 72 70 2c 22 45 72 72 6f 72 3a 20 22 2c 20 73 71  rp,"Error: ", sq
11090 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62  lite3_errmsg(pDb
110a0 2d 3e 64 62 29 2c 20 30 29 3b 0a 20 20 20 20 20  ->db), 0);.     
110b0 20 20 20 7a 43 6f 6d 6d 69 74 20 3d 20 22 52 4f     zCommit = "RO
110c0 4c 4c 42 41 43 4b 22 3b 0a 20 20 20 20 20 20 20  LLBACK";.       
110d0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
110e0 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65 28 61      }.    free(a
110f0 7a 43 6f 6c 29 3b 0a 20 20 20 20 66 63 6c 6f 73  zCol);.    fclos
11100 65 28 69 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74  e(in);.    sqlit
11110 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
11120 74 29 3b 0a 20 20 20 20 28 76 6f 69 64 29 73 71  t);.    (void)sq
11130 6c 69 74 65 33 5f 65 78 65 63 28 70 44 62 2d 3e  lite3_exec(pDb->
11140 64 62 2c 20 7a 43 6f 6d 6d 69 74 2c 20 30 2c 20  db, zCommit, 0, 
11150 30 2c 20 30 29 3b 0a 0a 20 20 20 20 69 66 28 20  0, 0);..    if( 
11160 7a 43 6f 6d 6d 69 74 5b 30 5d 20 3d 3d 20 27 43  zCommit[0] == 'C
11170 27 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 73 75  ' ){.      /* su
11180 63 63 65 73 73 2c 20 73 65 74 20 72 65 73 75 6c  ccess, set resul
11190 74 20 61 73 20 6e 75 6d 62 65 72 20 6f 66 20 6c  t as number of l
111a0 69 6e 65 73 20 70 72 6f 63 65 73 73 65 64 20 2a  ines processed *
111b0 2f 0a 20 20 20 20 20 20 70 52 65 73 75 6c 74 20  /.      pResult 
111c0 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75  = Tcl_GetObjResu
111d0 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  lt(interp);.    
111e0 20 20 54 63 6c 5f 53 65 74 49 6e 74 4f 62 6a 28    Tcl_SetIntObj(
111f0 70 52 65 73 75 6c 74 2c 20 6c 69 6e 65 6e 6f 29  pResult, lineno)
11200 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c  ;.      rc = TCL
11210 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  _OK;.    }else{.
11220 20 20 20 20 20 20 2f 2a 20 66 61 69 6c 75 72 65        /* failure
11230 2c 20 61 70 70 65 6e 64 20 6c 69 6e 65 6e 6f 20  , append lineno 
11240 77 68 65 72 65 20 66 61 69 6c 65 64 20 2a 2f 0a  where failed */.
11250 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
11260 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 4c  printf(sizeof(zL
11270 69 6e 65 4e 75 6d 29 2c 20 7a 4c 69 6e 65 4e 75  ineNum), zLineNu
11280 6d 2c 22 25 64 22 2c 6c 69 6e 65 6e 6f 29 3b 0a  m,"%d",lineno);.
11290 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
112a0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 2c  Result(interp,",
112b0 20 66 61 69 6c 65 64 20 77 68 69 6c 65 20 70 72   failed while pr
112c0 6f 63 65 73 73 69 6e 67 20 6c 69 6e 65 3a 20 22  ocessing line: "
112d0 2c 7a 4c 69 6e 65 4e 75 6d 2c 30 29 3b 0a 20 20  ,zLineNum,0);.  
112e0 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45 52 52      rc = TCL_ERR
112f0 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 72  OR;.    }.    br
11300 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  eak;.  }..  /*. 
11310 20 2a 2a 20 20 20 20 24 64 62 20 65 6e 61 62 6c   **    $db enabl
11320 65 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e  e_load_extension
11330 20 42 4f 4f 4c 45 41 4e 0a 20 20 2a 2a 0a 20 20   BOOLEAN.  **.  
11340 2a 2a 20 54 75 72 6e 20 74 68 65 20 65 78 74 65  ** Turn the exte
11350 6e 73 69 6f 6e 20 6c 6f 61 64 69 6e 67 20 66 65  nsion loading fe
11360 61 74 75 72 65 20 6f 6e 20 6f 72 20 6f 66 66 2e  ature on or off.
11370 20 20 49 74 20 69 66 20 6f 66 66 20 62 79 0a 20    It if off by. 
11380 20 2a 2a 20 64 65 66 61 75 6c 74 2e 0a 20 20 2a   ** default..  *
11390 2f 0a 20 20 63 61 73 65 20 44 42 5f 45 4e 41 42  /.  case DB_ENAB
113a0 4c 45 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f  LE_LOAD_EXTENSIO
113b0 4e 3a 20 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  N: {.#ifndef SQL
113c0 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58  ITE_OMIT_LOAD_EX
113d0 54 45 4e 53 49 4f 4e 0a 20 20 20 20 69 6e 74 20  TENSION.    int 
113e0 6f 6e 6f 66 66 3b 0a 20 20 20 20 69 66 28 20 6f  onoff;.    if( o
113f0 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20  bjc!=3 ){.      
11400 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
11410 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76  (interp, 2, objv
11420 2c 20 22 42 4f 4f 4c 45 41 4e 22 29 3b 0a 20 20  , "BOOLEAN");.  
11430 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
11440 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
11450 69 66 28 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65  if( Tcl_GetBoole
11460 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  anFromObj(interp
11470 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 6f 6e 6f 66  , objv[2], &onof
11480 66 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  f) ){.      retu
11490 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
114a0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
114b0 65 6e 61 62 6c 65 5f 6c 6f 61 64 5f 65 78 74 65  enable_load_exte
114c0 6e 73 69 6f 6e 28 70 44 62 2d 3e 64 62 2c 20 6f  nsion(pDb->db, o
114d0 6e 6f 66 66 29 3b 0a 20 20 20 20 62 72 65 61 6b  noff);.    break
114e0 3b 0a 23 65 6c 73 65 0a 20 20 20 20 54 63 6c 5f  ;.#else.    Tcl_
114f0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
11500 65 72 70 2c 20 22 65 78 74 65 6e 73 69 6f 6e 20  erp, "extension 
11510 6c 6f 61 64 69 6e 67 20 69 73 20 74 75 72 6e 65  loading is turne
11520 64 20 6f 66 66 20 61 74 20 63 6f 6d 70 69 6c 65  d off at compile
11530 2d 74 69 6d 65 22 2c 0a 20 20 20 20 20 20 20 20  -time",.        
11540 20 20 20 20 20 20 20 20 20 20 20 20 20 30 29 3b               0);
11550 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
11560 45 52 52 4f 52 3b 0a 23 65 6e 64 69 66 0a 20 20  ERROR;.#endif.  
11570 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20  }..  /*.  **    
11580 24 64 62 20 65 72 72 6f 72 63 6f 64 65 0a 20 20  $db errorcode.  
11590 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 74  **.  ** Return t
115a0 68 65 20 6e 75 6d 65 72 69 63 20 65 72 72 6f 72  he numeric error
115b0 20 63 6f 64 65 20 74 68 61 74 20 77 61 73 20 72   code that was r
115c0 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 6d  eturned by the m
115d0 6f 73 74 20 72 65 63 65 6e 74 0a 20 20 2a 2a 20  ost recent.  ** 
115e0 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f  call to sqlite3_
115f0 65 78 65 63 28 29 2e 0a 20 20 2a 2f 0a 20 20 63  exec()..  */.  c
11600 61 73 65 20 44 42 5f 45 52 52 4f 52 43 4f 44 45  ase DB_ERRORCODE
11610 3a 20 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f  : {.    Tcl_SetO
11620 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
11630 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73   Tcl_NewIntObj(s
11640 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28 70  qlite3_errcode(p
11650 44 62 2d 3e 64 62 29 29 29 3b 0a 20 20 20 20 62  Db->db)));.    b
11660 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a  reak;.  }..  /*.
11670 20 20 2a 2a 20 20 20 20 24 64 62 20 65 78 69 73    **    $db exis
11680 74 73 20 24 73 71 6c 0a 20 20 2a 2a 20 20 20 20  ts $sql.  **    
11690 24 64 62 20 6f 6e 65 63 6f 6c 75 6d 6e 20 24 73  $db onecolumn $s
116a0 71 6c 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  ql.  **.  ** The
116b0 20 6f 6e 65 63 6f 6c 75 6d 6e 20 6d 65 74 68 6f   onecolumn metho
116c0 64 20 69 73 20 74 68 65 20 65 71 75 69 76 61 6c  d is the equival
116d0 65 6e 74 20 6f 66 3a 0a 20 20 2a 2a 20 20 20 20  ent of:.  **    
116e0 20 6c 69 6e 64 65 78 20 5b 24 64 62 20 65 76 61   lindex [$db eva
116f0 6c 20 24 73 71 6c 5d 20 30 0a 20 20 2a 2f 0a 20  l $sql] 0.  */. 
11700 20 63 61 73 65 20 44 42 5f 45 58 49 53 54 53 3a   case DB_EXISTS:
11710 20 0a 20 20 63 61 73 65 20 44 42 5f 4f 4e 45 43   .  case DB_ONEC
11720 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 44 62 45  OLUMN: {.    DbE
11730 76 61 6c 43 6f 6e 74 65 78 74 20 73 45 76 61 6c  valContext sEval
11740 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d  ;.    if( objc!=
11750 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57  3 ){.      Tcl_W
11760 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
11770 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 53 51  rp, 2, objv, "SQ
11780 4c 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  L");.      retur
11790 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
117a0 20 7d 0a 0a 20 20 20 20 64 62 45 76 61 6c 49 6e   }..    dbEvalIn
117b0 69 74 28 26 73 45 76 61 6c 2c 20 70 44 62 2c 20  it(&sEval, pDb, 
117c0 6f 62 6a 76 5b 32 5d 2c 20 30 29 3b 0a 20 20 20  objv[2], 0);.   
117d0 20 72 63 20 3d 20 64 62 45 76 61 6c 53 74 65 70   rc = dbEvalStep
117e0 28 26 73 45 76 61 6c 29 3b 0a 20 20 20 20 69 66  (&sEval);.    if
117f0 28 20 63 68 6f 69 63 65 3d 3d 44 42 5f 4f 4e 45  ( choice==DB_ONE
11800 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20  COLUMN ){.      
11810 69 66 28 20 72 63 3d 3d 54 43 4c 5f 4f 4b 20 29  if( rc==TCL_OK )
11820 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 53 65  {.        Tcl_Se
11830 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
11840 70 2c 20 64 62 45 76 61 6c 43 6f 6c 75 6d 6e 56  p, dbEvalColumnV
11850 61 6c 75 65 28 26 73 45 76 61 6c 2c 20 30 29 29  alue(&sEval, 0))
11860 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
11870 28 20 72 63 3d 3d 54 43 4c 5f 42 52 45 41 4b 20  ( rc==TCL_BREAK 
11880 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 52  ){.        Tcl_R
11890 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  esetResult(inter
118a0 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  p);.      }.    
118b0 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 54 43  }else if( rc==TC
118c0 4c 5f 42 52 45 41 4b 20 7c 7c 20 72 63 3d 3d 54  L_BREAK || rc==T
118d0 43 4c 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 54  CL_OK ){.      T
118e0 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
118f0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 42  interp, Tcl_NewB
11900 6f 6f 6c 65 61 6e 4f 62 6a 28 72 63 3d 3d 54 43  ooleanObj(rc==TC
11910 4c 5f 4f 4b 29 29 3b 0a 20 20 20 20 7d 0a 20 20  L_OK));.    }.  
11920 20 20 64 62 45 76 61 6c 46 69 6e 61 6c 69 7a 65    dbEvalFinalize
11930 28 26 73 45 76 61 6c 29 3b 0a 0a 20 20 20 20 69  (&sEval);..    i
11940 66 28 20 72 63 3d 3d 54 43 4c 5f 42 52 45 41 4b  f( rc==TCL_BREAK
11950 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 54   ){.      rc = T
11960 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  CL_OK;.    }.   
11970 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 20 0a   break;.  }.   .
11980 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 24 64 62    /*.  **    $db
11990 20 65 76 61 6c 20 24 73 71 6c 20 3f 61 72 72 61   eval $sql ?arra
119a0 79 3f 20 3f 7b 20 20 2e 2e 2e 63 6f 64 65 2e 2e  y? ?{  ...code..
119b0 2e 20 7d 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  . }?.  **.  ** T
119c0 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  he SQL statement
119d0 20 69 6e 20 24 73 71 6c 20 69 73 20 65 76 61 6c   in $sql is eval
119e0 75 61 74 65 64 2e 20 20 46 6f 72 20 65 61 63 68  uated.  For each
119f0 20 72 6f 77 2c 20 74 68 65 20 76 61 6c 75 65 73   row, the values
11a00 20 61 72 65 0a 20 20 2a 2a 20 70 6c 61 63 65 64   are.  ** placed
11a10 20 69 6e 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20   in elements of 
11a20 74 68 65 20 61 72 72 61 79 20 6e 61 6d 65 64 20  the array named 
11a30 22 61 72 72 61 79 22 20 61 6e 64 20 2e 2e 2e 63  "array" and ...c
11a40 6f 64 65 2e 2e 2e 20 69 73 20 65 78 65 63 75 74  ode... is execut
11a50 65 64 2e 0a 20 20 2a 2a 20 49 66 20 22 61 72 72  ed..  ** If "arr
11a60 61 79 22 20 61 6e 64 20 22 63 6f 64 65 22 20 61  ay" and "code" a
11a70 72 65 20 6f 6d 69 74 74 65 64 2c 20 74 68 65 6e  re omitted, then
11a80 20 6e 6f 20 63 61 6c 6c 62 61 63 6b 20 69 73 20   no callback is 
11a90 65 76 65 72 79 20 69 6e 76 6f 6b 65 64 2e 0a 20  every invoked.. 
11aa0 20 2a 2a 20 49 66 20 22 61 72 72 61 79 22 20 69   ** If "array" i
11ab0 73 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e  s an empty strin
11ac0 67 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75  g, then the valu
11ad0 65 73 20 61 72 65 20 70 6c 61 63 65 64 20 69 6e  es are placed in
11ae0 20 76 61 72 69 61 62 6c 65 73 0a 20 20 2a 2a 20   variables.  ** 
11af0 74 68 61 74 20 68 61 76 65 20 74 68 65 20 73 61  that have the sa
11b00 6d 65 20 6e 61 6d 65 20 61 73 20 74 68 65 20 66  me name as the f
11b10 69 65 6c 64 73 20 65 78 74 72 61 63 74 65 64 20  ields extracted 
11b20 62 79 20 74 68 65 20 71 75 65 72 79 2e 0a 20 20  by the query..  
11b30 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 45 56 41  */.  case DB_EVA
11b40 4c 3a 20 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a  L: {.    if( obj
11b50 63 3c 33 20 7c 7c 20 6f 62 6a 63 3e 35 20 29 7b  c<3 || objc>5 ){
11b60 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  .      Tcl_Wrong
11b70 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
11b80 32 2c 20 6f 62 6a 76 2c 20 22 53 51 4c 20 3f 41  2, objv, "SQL ?A
11b90 52 52 41 59 2d 4e 41 4d 45 3f 20 3f 53 43 52 49  RRAY-NAME? ?SCRI
11ba0 50 54 3f 22 29 3b 0a 20 20 20 20 20 20 72 65 74  PT?");.      ret
11bb0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
11bc0 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 6f 62     }..    if( ob
11bd0 6a 63 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20 44  jc==3 ){.      D
11be0 62 45 76 61 6c 43 6f 6e 74 65 78 74 20 73 45 76  bEvalContext sEv
11bf0 61 6c 3b 0a 20 20 20 20 20 20 54 63 6c 5f 4f 62  al;.      Tcl_Ob
11c00 6a 20 2a 70 52 65 74 20 3d 20 54 63 6c 5f 4e 65  j *pRet = Tcl_Ne
11c10 77 4f 62 6a 28 29 3b 0a 20 20 20 20 20 20 54 63  wObj();.      Tc
11c20 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70  l_IncrRefCount(p
11c30 52 65 74 29 3b 0a 20 20 20 20 20 20 64 62 45 76  Ret);.      dbEv
11c40 61 6c 49 6e 69 74 28 26 73 45 76 61 6c 2c 20 70  alInit(&sEval, p
11c50 44 62 2c 20 6f 62 6a 76 5b 32 5d 2c 20 30 29 3b  Db, objv[2], 0);
11c60 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 54 43  .      while( TC
11c70 4c 5f 4f 4b 3d 3d 28 72 63 20 3d 20 64 62 45 76  L_OK==(rc = dbEv
11c80 61 6c 53 74 65 70 28 26 73 45 76 61 6c 29 29 20  alStep(&sEval)) 
11c90 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  ){.        int i
11ca0 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43  ;.        int nC
11cb0 6f 6c 3b 0a 20 20 20 20 20 20 20 20 64 62 45 76  ol;.        dbEv
11cc0 61 6c 52 6f 77 49 6e 66 6f 28 26 73 45 76 61 6c  alRowInfo(&sEval
11cd0 2c 20 26 6e 43 6f 6c 2c 20 30 29 3b 0a 20 20 20  , &nCol, 0);.   
11ce0 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
11cf0 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
11d00 20 20 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62        Tcl_ListOb
11d10 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
11d20 6e 74 65 72 70 2c 20 70 52 65 74 2c 20 64 62 45  nterp, pRet, dbE
11d30 76 61 6c 43 6f 6c 75 6d 6e 56 61 6c 75 65 28 26  valColumnValue(&
11d40 73 45 76 61 6c 2c 20 69 29 29 3b 0a 20 20 20 20  sEval, i));.    
11d50 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
11d60 20 20 20 20 64 62 45 76 61 6c 46 69 6e 61 6c 69      dbEvalFinali
11d70 7a 65 28 26 73 45 76 61 6c 29 3b 0a 20 20 20 20  ze(&sEval);.    
11d80 20 20 69 66 28 20 72 63 3d 3d 54 43 4c 5f 42 52    if( rc==TCL_BR
11d90 45 41 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 54  EAK ){.        T
11da0 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
11db0 69 6e 74 65 72 70 2c 20 70 52 65 74 29 3b 0a 20  interp, pRet);. 
11dc0 20 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f         rc = TCL_
11dd0 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OK;.      }.    
11de0 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
11df0 6e 74 28 70 52 65 74 29 3b 0a 20 20 20 20 7d 65  nt(pRet);.    }e
11e00 6c 73 65 7b 0a 20 20 20 20 20 20 43 6c 69 65 6e  lse{.      Clien
11e10 74 44 61 74 61 20 63 64 5b 32 5d 3b 0a 20 20 20  tData cd[2];.   
11e20 20 20 20 44 62 45 76 61 6c 43 6f 6e 74 65 78 74     DbEvalContext
11e30 20 2a 70 3b 0a 20 20 20 20 20 20 54 63 6c 5f 4f   *p;.      Tcl_O
11e40 62 6a 20 2a 70 41 72 72 61 79 20 3d 20 30 3b 0a  bj *pArray = 0;.
11e50 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70        Tcl_Obj *p
11e60 53 63 72 69 70 74 3b 0a 0a 20 20 20 20 20 20 69  Script;..      i
11e70 66 28 20 6f 62 6a 63 3d 3d 35 20 26 26 20 2a 28  f( objc==5 && *(
11e80 63 68 61 72 20 2a 29 54 63 6c 5f 47 65 74 53 74  char *)Tcl_GetSt
11e90 72 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 20 29 7b  ring(objv[3]) ){
11ea0 0a 20 20 20 20 20 20 20 20 70 41 72 72 61 79 20  .        pArray 
11eb0 3d 20 6f 62 6a 76 5b 33 5d 3b 0a 20 20 20 20 20  = objv[3];.     
11ec0 20 7d 0a 20 20 20 20 20 20 70 53 63 72 69 70 74   }.      pScript
11ed0 20 3d 20 6f 62 6a 76 5b 6f 62 6a 63 2d 31 5d 3b   = objv[objc-1];
11ee0 0a 20 20 20 20 20 20 54 63 6c 5f 49 6e 63 72 52  .      Tcl_IncrR
11ef0 65 66 43 6f 75 6e 74 28 70 53 63 72 69 70 74 29  efCount(pScript)
11f00 3b 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20 70  ;.      .      p
11f10 20 3d 20 28 44 62 45 76 61 6c 43 6f 6e 74 65 78   = (DbEvalContex
11f20 74 20 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28 73 69  t *)Tcl_Alloc(si
11f30 7a 65 6f 66 28 44 62 45 76 61 6c 43 6f 6e 74 65  zeof(DbEvalConte
11f40 78 74 29 29 3b 0a 20 20 20 20 20 20 64 62 45 76  xt));.      dbEv
11f50 61 6c 49 6e 69 74 28 70 2c 20 70 44 62 2c 20 6f  alInit(p, pDb, o
11f60 62 6a 76 5b 32 5d 2c 20 70 41 72 72 61 79 29 3b  bjv[2], pArray);
11f70 0a 0a 20 20 20 20 20 20 63 64 5b 30 5d 20 3d 20  ..      cd[0] = 
11f80 28 76 6f 69 64 20 2a 29 70 3b 0a 20 20 20 20 20  (void *)p;.     
11f90 20 63 64 5b 31 5d 20 3d 20 28 76 6f 69 64 20 2a   cd[1] = (void *
11fa0 29 70 53 63 72 69 70 74 3b 0a 20 20 20 20 20 20  )pScript;.      
11fb0 72 63 20 3d 20 44 62 45 76 61 6c 4e 65 78 74 43  rc = DbEvalNextC
11fc0 6d 64 28 63 64 2c 20 69 6e 74 65 72 70 2c 20 54  md(cd, interp, T
11fd0 43 4c 5f 4f 4b 29 3b 0a 20 20 20 20 7d 0a 20 20  CL_OK);.    }.  
11fe0 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
11ff0 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20  /*.  **     $db 
12000 66 75 6e 63 74 69 6f 6e 20 4e 41 4d 45 20 5b 2d  function NAME [-
12010 61 72 67 63 6f 75 6e 74 20 4e 5d 20 53 43 52 49  argcount N] SCRI
12020 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 72 65  PT.  **.  ** Cre
12030 61 74 65 20 61 20 6e 65 77 20 53 51 4c 20 66 75  ate a new SQL fu
12040 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 20 4e 41  nction called NA
12050 4d 45 2e 20 20 57 68 65 6e 65 76 65 72 20 74 68  ME.  Whenever th
12060 61 74 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a 20  at function is. 
12070 20 2a 2a 20 63 61 6c 6c 65 64 2c 20 69 6e 76 6f   ** called, invo
12080 6b 65 20 53 43 52 49 50 54 20 74 6f 20 65 76 61  ke SCRIPT to eva
12090 6c 75 61 74 65 20 74 68 65 20 66 75 6e 63 74 69  luate the functi
120a0 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  on..  */.  case 
120b0 44 42 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20  DB_FUNCTION: {. 
120c0 20 20 20 53 71 6c 46 75 6e 63 20 2a 70 46 75 6e     SqlFunc *pFun
120d0 63 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a  c;.    Tcl_Obj *
120e0 70 53 63 72 69 70 74 3b 0a 20 20 20 20 63 68 61  pScript;.    cha
120f0 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 6e  r *zName;.    in
12100 74 20 6e 41 72 67 20 3d 20 2d 31 3b 0a 20 20 20  t nArg = -1;.   
12110 20 69 66 28 20 6f 62 6a 63 3d 3d 36 20 29 7b 0a   if( objc==6 ){.
12120 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
12130 20 2a 7a 20 3d 20 54 63 6c 5f 47 65 74 53 74 72   *z = Tcl_GetStr
12140 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a 20 20  ing(objv[3]);.  
12150 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 74 72 6c      int n = strl
12160 65 6e 33 30 28 7a 29 3b 0a 20 20 20 20 20 20 69  en30(z);.      i
12170 66 28 20 6e 3e 32 20 26 26 20 73 74 72 6e 63 6d  f( n>2 && strncm
12180 70 28 7a 2c 20 22 2d 61 72 67 63 6f 75 6e 74 22  p(z, "-argcount"
12190 2c 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ,n)==0 ){.      
121a0 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
121b0 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
121c0 6f 62 6a 76 5b 34 5d 2c 20 26 6e 41 72 67 29 20  objv[4], &nArg) 
121d0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
121e0 4f 52 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  OR;.        if( 
121f0 6e 41 72 67 3c 30 20 29 7b 0a 20 20 20 20 20 20  nArg<0 ){.      
12200 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
12210 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 6e 75  sult(interp, "nu
12220 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
12230 73 20 6d 75 73 74 20 62 65 20 6e 6f 6e 2d 6e 65  s must be non-ne
12240 67 61 74 69 76 65 22 2c 0a 20 20 20 20 20 20 20  gative",.       
12250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12260 20 20 20 20 28 63 68 61 72 2a 29 30 29 3b 0a 20      (char*)0);. 
12270 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
12280 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  TCL_ERROR;.     
12290 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
122a0 20 20 20 70 53 63 72 69 70 74 20 3d 20 6f 62 6a     pScript = obj
122b0 76 5b 35 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 20  v[5];.    }else 
122c0 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20  if( objc!=4 ){. 
122d0 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
122e0 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
122f0 20 6f 62 6a 76 2c 20 22 4e 41 4d 45 20 5b 2d 61   objv, "NAME [-a
12300 72 67 63 6f 75 6e 74 20 4e 5d 20 53 43 52 49 50  rgcount N] SCRIP
12310 54 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  T");.      retur
12320 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
12330 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 53   }else{.      pS
12340 63 72 69 70 74 20 3d 20 6f 62 6a 76 5b 33 5d 3b  cript = objv[3];
12350 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4e 61 6d 65  .    }.    zName
12360 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
12370 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c  FromObj(objv[2],
12380 20 30 29 3b 0a 20 20 20 20 70 46 75 6e 63 20 3d   0);.    pFunc =
12390 20 66 69 6e 64 53 71 6c 46 75 6e 63 28 70 44 62   findSqlFunc(pDb
123a0 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66  , zName);.    if
123b0 28 20 70 46 75 6e 63 3d 3d 30 20 29 20 72 65 74  ( pFunc==0 ) ret
123c0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
123d0 20 20 20 69 66 28 20 70 46 75 6e 63 2d 3e 70 53     if( pFunc->pS
123e0 63 72 69 70 74 20 29 7b 0a 20 20 20 20 20 20 54  cript ){.      T
123f0 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
12400 70 46 75 6e 63 2d 3e 70 53 63 72 69 70 74 29 3b  pFunc->pScript);
12410 0a 20 20 20 20 7d 0a 20 20 20 20 70 46 75 6e 63  .    }.    pFunc
12420 2d 3e 70 53 63 72 69 70 74 20 3d 20 70 53 63 72  ->pScript = pScr
12430 69 70 74 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 63  ipt;.    Tcl_Inc
12440 72 52 65 66 43 6f 75 6e 74 28 70 53 63 72 69 70  rRefCount(pScrip
12450 74 29 3b 0a 20 20 20 20 70 46 75 6e 63 2d 3e 75  t);.    pFunc->u
12460 73 65 45 76 61 6c 4f 62 6a 76 20 3d 20 73 61 66  seEvalObjv = saf
12470 65 54 6f 55 73 65 45 76 61 6c 4f 62 6a 76 28 69  eToUseEvalObjv(i
12480 6e 74 65 72 70 2c 20 70 53 63 72 69 70 74 29 3b  nterp, pScript);
12490 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
124a0 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
124b0 6e 28 70 44 62 2d 3e 64 62 2c 20 7a 4e 61 6d 65  n(pDb->db, zName
124c0 2c 20 6e 41 72 67 2c 20 53 51 4c 49 54 45 5f 55  , nArg, SQLITE_U
124d0 54 46 38 2c 0a 20 20 20 20 20 20 20 20 70 46 75  TF8,.        pFu
124e0 6e 63 2c 20 74 63 6c 53 71 6c 46 75 6e 63 2c 20  nc, tclSqlFunc, 
124f0 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  0, 0);.    if( r
12500 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
12510 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45        rc = TCL_E
12520 52 52 4f 52 3b 0a 20 20 20 20 20 20 54 63 6c 5f  RROR;.      Tcl_
12530 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
12540 2c 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  , (char *)sqlite
12550 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62  3_errmsg(pDb->db
12560 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29  ), TCL_VOLATILE)
12570 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61  ;.    }.    brea
12580 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  k;.  }..  /*.  *
12590 2a 20 20 20 20 20 24 64 62 20 69 6e 63 72 62 6c  *     $db incrbl
125a0 6f 62 20 3f 2d 72 65 61 64 6f 6e 6c 79 3f 20 3f  ob ?-readonly? ?
125b0 44 42 3f 20 54 41 42 4c 45 20 43 4f 4c 55 4d 4e  DB? TABLE COLUMN
125c0 20 52 4f 57 49 44 0a 20 20 2a 2f 0a 20 20 63 61   ROWID.  */.  ca
125d0 73 65 20 44 42 5f 49 4e 43 52 42 4c 4f 42 3a 20  se DB_INCRBLOB: 
125e0 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
125f0 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20  OMIT_INCRBLOB.  
12600 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
12610 6c 74 28 69 6e 74 65 72 70 2c 20 22 69 6e 63 72  lt(interp, "incr
12620 62 6c 6f 62 20 6e 6f 74 20 61 76 61 69 6c 61 62  blob not availab
12630 6c 65 20 69 6e 20 74 68 69 73 20 62 75 69 6c 64  le in this build
12640 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
12650 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c  n TCL_ERROR;.#el
12660 73 65 0a 20 20 20 20 69 6e 74 20 69 73 52 65 61  se.    int isRea
12670 64 6f 6e 6c 79 20 3d 20 30 3b 0a 20 20 20 20 63  donly = 0;.    c
12680 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d  onst char *zDb =
12690 20 22 6d 61 69 6e 22 3b 0a 20 20 20 20 63 6f 6e   "main";.    con
126a0 73 74 20 63 68 61 72 20 2a 7a 54 61 62 6c 65 3b  st char *zTable;
126b0 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
126c0 2a 7a 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 73 71  *zColumn;.    sq
126d0 6c 69 74 65 5f 69 6e 74 36 34 20 69 52 6f 77 3b  lite_int64 iRow;
126e0 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 66  ..    /* Check f
126f0 6f 72 20 74 68 65 20 2d 72 65 61 64 6f 6e 6c 79  or the -readonly
12700 20 6f 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 69   option */.    i
12710 66 28 20 6f 62 6a 63 3e 33 20 26 26 20 73 74 72  f( objc>3 && str
12720 63 6d 70 28 54 63 6c 5f 47 65 74 53 74 72 69 6e  cmp(Tcl_GetStrin
12730 67 28 6f 62 6a 76 5b 32 5d 29 2c 20 22 2d 72 65  g(objv[2]), "-re
12740 61 64 6f 6e 6c 79 22 29 3d 3d 30 20 29 7b 0a 20  adonly")==0 ){. 
12750 20 20 20 20 20 69 73 52 65 61 64 6f 6e 6c 79 20       isReadonly 
12760 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  = 1;.    }..    
12770 69 66 28 20 6f 62 6a 63 21 3d 28 35 2b 69 73 52  if( objc!=(5+isR
12780 65 61 64 6f 6e 6c 79 29 20 26 26 20 6f 62 6a 63  eadonly) && objc
12790 21 3d 28 36 2b 69 73 52 65 61 64 6f 6e 6c 79 29  !=(6+isReadonly)
127a0 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72   ){.      Tcl_Wr
127b0 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
127c0 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 2d 72  p, 2, objv, "?-r
127d0 65 61 64 6f 6e 6c 79 3f 20 3f 44 42 3f 20 54 41  eadonly? ?DB? TA
127e0 42 4c 45 20 43 4f 4c 55 4d 4e 20 52 4f 57 49 44  BLE COLUMN ROWID
127f0 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
12800 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
12810 7d 0a 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3d  }..    if( objc=
12820 3d 28 36 2b 69 73 52 65 61 64 6f 6e 6c 79 29 20  =(6+isReadonly) 
12830 29 7b 0a 20 20 20 20 20 20 7a 44 62 20 3d 20 54  ){.      zDb = T
12840 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
12850 76 5b 32 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20  v[2]);.    }.   
12860 20 7a 54 61 62 6c 65 20 3d 20 54 63 6c 5f 47 65   zTable = Tcl_Ge
12870 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 6f 62 6a  tString(objv[obj
12880 63 2d 33 5d 29 3b 0a 20 20 20 20 7a 43 6f 6c 75  c-3]);.    zColu
12890 6d 6e 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  mn = Tcl_GetStri
128a0 6e 67 28 6f 62 6a 76 5b 6f 62 6a 63 2d 32 5d 29  ng(objv[objc-2])
128b0 3b 0a 20 20 20 20 72 63 20 3d 20 54 63 6c 5f 47  ;.    rc = Tcl_G
128c0 65 74 57 69 64 65 49 6e 74 46 72 6f 6d 4f 62 6a  etWideIntFromObj
128d0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 6f 62  (interp, objv[ob
128e0 6a 63 2d 31 5d 2c 20 26 69 52 6f 77 29 3b 0a 0a  jc-1], &iRow);..
128f0 20 20 20 20 69 66 28 20 72 63 3d 3d 54 43 4c 5f      if( rc==TCL_
12900 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
12910 20 63 72 65 61 74 65 49 6e 63 72 62 6c 6f 62 43   createIncrblobC
12920 68 61 6e 6e 65 6c 28 0a 20 20 20 20 20 20 20 20  hannel(.        
12930 20 20 69 6e 74 65 72 70 2c 20 70 44 62 2c 20 7a    interp, pDb, z
12940 44 62 2c 20 7a 54 61 62 6c 65 2c 20 7a 43 6f 6c  Db, zTable, zCol
12950 75 6d 6e 2c 20 69 52 6f 77 2c 20 69 73 52 65 61  umn, iRow, isRea
12960 64 6f 6e 6c 79 0a 20 20 20 20 20 20 29 3b 0a 20  donly.      );. 
12970 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
12980 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
12990 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20 69 6e  .  **     $db in
129a0 74 65 72 72 75 70 74 0a 20 20 2a 2a 0a 20 20 2a  terrupt.  **.  *
129b0 2a 20 49 6e 74 65 72 72 75 70 74 20 74 68 65 20  * Interrupt the 
129c0 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 74 68 65  execution of the
129d0 20 69 6e 6e 65 72 2d 6d 6f 73 74 20 53 51 4c 20   inner-most SQL 
129e0 69 6e 74 65 72 70 72 65 74 65 72 2e 20 20 54 68  interpreter.  Th
129f0 69 73 0a 20 20 2a 2a 20 63 61 75 73 65 73 20 74  is.  ** causes t
12a00 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  he SQL statement
12a10 20 74 6f 20 72 65 74 75 72 6e 20 61 6e 20 65 72   to return an er
12a20 72 6f 72 20 6f 66 20 53 51 4c 49 54 45 5f 49 4e  ror of SQLITE_IN
12a30 54 45 52 52 55 50 54 2e 0a 20 20 2a 2f 0a 20 20  TERRUPT..  */.  
12a40 63 61 73 65 20 44 42 5f 49 4e 54 45 52 52 55 50  case DB_INTERRUP
12a50 54 3a 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  T: {.    sqlite3
12a60 5f 69 6e 74 65 72 72 75 70 74 28 70 44 62 2d 3e  _interrupt(pDb->
12a70 64 62 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a  db);.    break;.
12a80 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20    }..  /*.  **  
12a90 20 20 20 24 64 62 20 6e 75 6c 6c 76 61 6c 75 65     $db nullvalue
12aa0 20 3f 53 54 52 49 4e 47 3f 0a 20 20 2a 2a 0a 20   ?STRING?.  **. 
12ab0 20 2a 2a 20 43 68 61 6e 67 65 20 74 65 78 74 20   ** Change text 
12ac0 75 73 65 64 20 77 68 65 6e 20 61 20 4e 55 4c 4c  used when a NULL
12ad0 20 63 6f 6d 65 73 20 62 61 63 6b 20 66 72 6f 6d   comes back from
12ae0 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 49   the database. I
12af0 66 20 3f 53 54 52 49 4e 47 3f 0a 20 20 2a 2a 20  f ?STRING?.  ** 
12b00 69 73 20 6e 6f 74 20 70 72 65 73 65 6e 74 2c 20  is not present, 
12b10 74 68 65 6e 20 74 68 65 20 63 75 72 72 65 6e 74  then the current
12b20 20 73 74 72 69 6e 67 20 75 73 65 64 20 66 6f 72   string used for
12b30 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65   NULL is returne
12b40 64 2e 0a 20 20 2a 2a 20 49 66 20 53 54 52 49 4e  d..  ** If STRIN
12b50 47 20 69 73 20 70 72 65 73 65 6e 74 2c 20 74 68  G is present, th
12b60 65 6e 20 53 54 52 49 4e 47 20 69 73 20 72 65 74  en STRING is ret
12b70 75 72 6e 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2f  urned..  **.  */
12b80 0a 20 20 63 61 73 65 20 44 42 5f 4e 55 4c 4c 56  .  case DB_NULLV
12b90 41 4c 55 45 3a 20 7b 0a 20 20 20 20 69 66 28 20  ALUE: {.    if( 
12ba0 6f 62 6a 63 21 3d 32 20 26 26 20 6f 62 6a 63 21  objc!=2 && objc!
12bb0 3d 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  =3 ){.      Tcl_
12bc0 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
12bd0 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 4e  erp, 2, objv, "N
12be0 55 4c 4c 56 41 4c 55 45 22 29 3b 0a 20 20 20 20  ULLVALUE");.    
12bf0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
12c00 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  OR;.    }.    if
12c10 28 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20 20 20  ( objc==3 ){.   
12c20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20     int len;.    
12c30 20 20 63 68 61 72 20 2a 7a 4e 75 6c 6c 20 3d 20    char *zNull = 
12c40 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
12c50 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c  mObj(objv[2], &l
12c60 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  en);.      if( p
12c70 44 62 2d 3e 7a 4e 75 6c 6c 20 29 7b 0a 20 20 20  Db->zNull ){.   
12c80 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44       Tcl_Free(pD
12c90 62 2d 3e 7a 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  b->zNull);.     
12ca0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 4e 75   }.      if( zNu
12cb0 6c 6c 20 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20  ll && len>0 ){. 
12cc0 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e 75 6c         pDb->zNul
12cd0 6c 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c  l = Tcl_Alloc( l
12ce0 65 6e 20 2b 20 31 20 29 3b 0a 20 20 20 20 20 20  en + 1 );.      
12cf0 20 20 6d 65 6d 63 70 79 28 70 44 62 2d 3e 7a 4e    memcpy(pDb->zN
12d00 75 6c 6c 2c 20 7a 4e 75 6c 6c 2c 20 6c 65 6e 29  ull, zNull, len)
12d10 3b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a  ;.        pDb->z
12d20 4e 75 6c 6c 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27  Null[len] = '\0'
12d30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
12d40 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e 75 6c         pDb->zNul
12d50 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  l = 0;.      }. 
12d60 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 53 65 74     }.    Tcl_Set
12d70 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
12d80 2c 20 64 62 54 65 78 74 54 6f 4f 62 6a 28 70 44  , dbTextToObj(pD
12d90 62 2d 3e 7a 4e 75 6c 6c 29 29 3b 0a 20 20 20 20  b->zNull));.    
12da0 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
12db0 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20 6c 61  .  **     $db la
12dc0 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 20  st_insert_rowid 
12dd0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72  .  **.  ** Retur
12de0 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69  n an integer whi
12df0 63 68 20 69 73 20 74 68 65 20 52 4f 57 49 44 20  ch is the ROWID 
12e00 66 6f 72 20 74 68 65 20 6d 6f 73 74 20 72 65 63  for the most rec
12e10 65 6e 74 20 69 6e 73 65 72 74 2e 0a 20 20 2a 2f  ent insert..  */
12e20 0a 20 20 63 61 73 65 20 44 42 5f 4c 41 53 54 5f  .  case DB_LAST_
12e30 49 4e 53 45 52 54 5f 52 4f 57 49 44 3a 20 7b 0a  INSERT_ROWID: {.
12e40 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65      Tcl_Obj *pRe
12e50 73 75 6c 74 3b 0a 20 20 20 20 54 63 6c 5f 57 69  sult;.    Tcl_Wi
12e60 64 65 49 6e 74 20 72 6f 77 69 64 3b 0a 20 20 20  deInt rowid;.   
12e70 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a   if( objc!=2 ){.
12e80 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
12e90 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
12ea0 2c 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 20 20 20  , objv, "");.   
12eb0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
12ec0 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  ROR;.    }.    r
12ed0 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33 5f 6c  owid = sqlite3_l
12ee0 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64  ast_insert_rowid
12ef0 28 70 44 62 2d 3e 64 62 29 3b 0a 20 20 20 20 70  (pDb->db);.    p
12f00 52 65 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65 74  Result = Tcl_Get
12f10 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
12f20 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 57 69  );.    Tcl_SetWi
12f30 64 65 49 6e 74 4f 62 6a 28 70 52 65 73 75 6c 74  deIntObj(pResult
12f40 2c 20 72 6f 77 69 64 29 3b 0a 20 20 20 20 62 72  , rowid);.    br
12f50 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  eak;.  }..  /*. 
12f60 20 2a 2a 20 54 68 65 20 44 42 5f 4f 4e 45 43 4f   ** The DB_ONECO
12f70 4c 55 4d 4e 20 6d 65 74 68 6f 64 20 69 73 20 69  LUMN method is i
12f80 6d 70 6c 65 6d 65 6e 74 65 64 20 74 6f 67 65 74  mplemented toget
12f90 68 65 72 20 77 69 74 68 20 44 42 5f 45 58 49 53  her with DB_EXIS
12fa0 54 53 2e 0a 20 20 2a 2f 0a 0a 20 20 2f 2a 20 20  TS..  */..  /*  
12fb0 20 20 24 64 62 20 70 72 6f 67 72 65 73 73 20 3f    $db progress ?
12fc0 4e 20 43 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a  N CALLBACK?.  **
12fd0 20 0a 20 20 2a 2a 20 49 6e 76 6f 6b 65 20 74 68   .  ** Invoke th
12fe0 65 20 67 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b  e given callback
12ff0 20 65 76 65 72 79 20 4e 20 76 69 72 74 75 61 6c   every N virtual
13000 20 6d 61 63 68 69 6e 65 20 6f 70 63 6f 64 65 73   machine opcodes
13010 20 77 68 69 6c 65 20 65 78 65 63 75 74 69 6e 67   while executing
13020 0a 20 20 2a 2a 20 71 75 65 72 69 65 73 2e 0a 20  .  ** queries.. 
13030 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 50 52   */.  case DB_PR
13040 4f 47 52 45 53 53 3a 20 7b 0a 20 20 20 20 69 66  OGRESS: {.    if
13050 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20  ( objc==2 ){.   
13060 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f     if( pDb->zPro
13070 67 72 65 73 73 20 29 7b 0a 20 20 20 20 20 20 20  gress ){.       
13080 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
13090 74 28 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a  t(interp, pDb->z
130a0 50 72 6f 67 72 65 73 73 2c 20 30 29 3b 0a 20 20  Progress, 0);.  
130b0 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
130c0 69 66 28 20 6f 62 6a 63 3d 3d 34 20 29 7b 0a 20  if( objc==4 ){. 
130d0 20 20 20 20 20 63 68 61 72 20 2a 7a 50 72 6f 67       char *zProg
130e0 72 65 73 73 3b 0a 20 20 20 20 20 20 69 6e 74 20  ress;.      int 
130f0 6c 65 6e 3b 0a 20 20 20 20 20 20 69 6e 74 20 4e  len;.      int N
13100 3b 0a 20 20 20 20 20 20 69 66 28 20 54 43 4c 5f  ;.      if( TCL_
13110 4f 4b 21 3d 54 63 6c 5f 47 65 74 49 6e 74 46 72  OK!=Tcl_GetIntFr
13120 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
13130 6a 76 5b 32 5d 2c 20 26 4e 29 20 29 7b 0a 20 20  jv[2], &N) ){.  
13140 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
13150 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 3b  _ERROR;.      };
13160 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e  .      if( pDb->
13170 7a 50 72 6f 67 72 65 73 73 20 29 7b 0a 20 20 20  zProgress ){.   
13180 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44       Tcl_Free(pD
13190 62 2d 3e 7a 50 72 6f 67 72 65 73 73 29 3b 0a 20  b->zProgress);. 
131a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 50 72       }.      zPr
131b0 6f 67 72 65 73 73 20 3d 20 54 63 6c 5f 47 65 74  ogress = Tcl_Get
131c0 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
131d0 6a 76 5b 33 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20  jv[3], &len);.  
131e0 20 20 20 20 69 66 28 20 7a 50 72 6f 67 72 65 73      if( zProgres
131f0 73 20 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20 20  s && len>0 ){.  
13200 20 20 20 20 20 20 70 44 62 2d 3e 7a 50 72 6f 67        pDb->zProg
13210 72 65 73 73 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63  ress = Tcl_Alloc
13220 28 20 6c 65 6e 20 2b 20 31 20 29 3b 0a 20 20 20  ( len + 1 );.   
13230 20 20 20 20 20 6d 65 6d 63 70 79 28 70 44 62 2d       memcpy(pDb-
13240 3e 7a 50 72 6f 67 72 65 73 73 2c 20 7a 50 72 6f  >zProgress, zPro
13250 67 72 65 73 73 2c 20 6c 65 6e 2b 31 29 3b 0a 20  gress, len+1);. 
13260 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
13270 20 20 20 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65      pDb->zProgre
13280 73 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  ss = 0;.      }.
13290 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
132a0 4d 49 54 5f 50 52 4f 47 52 45 53 53 5f 43 41 4c  MIT_PROGRESS_CAL
132b0 4c 42 41 43 4b 0a 20 20 20 20 20 20 69 66 28 20  LBACK.      if( 
132c0 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 20 29  pDb->zProgress )
132d0 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 69  {.        pDb->i
132e0 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a  nterp = interp;.
132f0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
13300 70 72 6f 67 72 65 73 73 5f 68 61 6e 64 6c 65 72  progress_handler
13310 28 70 44 62 2d 3e 64 62 2c 20 4e 2c 20 44 62 50  (pDb->db, N, DbP
13320 72 6f 67 72 65 73 73 48 61 6e 64 6c 65 72 2c 20  rogressHandler, 
13330 70 44 62 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  pDb);.      }els
13340 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
13350 65 33 5f 70 72 6f 67 72 65 73 73 5f 68 61 6e 64  e3_progress_hand
13360 6c 65 72 28 70 44 62 2d 3e 64 62 2c 20 30 2c 20  ler(pDb->db, 0, 
13370 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23  0, 0);.      }.#
13380 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b  endif.    }else{
13390 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  .      Tcl_Wrong
133a0 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
133b0 32 2c 20 6f 62 6a 76 2c 20 22 4e 20 43 41 4c 4c  2, objv, "N CALL
133c0 42 41 43 4b 22 29 3b 0a 20 20 20 20 20 20 72 65  BACK");.      re
133d0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
133e0 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b      }.    break;
133f0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64  .  }..  /*    $d
13400 62 20 70 72 6f 66 69 6c 65 20 3f 43 41 4c 4c 42  b profile ?CALLB
13410 41 43 4b 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d  ACK?.  **.  ** M
13420 61 6b 65 20 61 72 72 61 6e 67 65 6d 65 6e 74 73  ake arrangements
13430 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20 43   to invoke the C
13440 41 4c 4c 42 41 43 4b 20 72 6f 75 74 69 6e 65 20  ALLBACK routine 
13450 61 66 74 65 72 20 65 61 63 68 20 53 51 4c 20 73  after each SQL s
13460 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 68  tatement.  ** th
13470 61 74 20 68 61 73 20 72 75 6e 2e 20 20 54 68 65  at has run.  The
13480 20 74 65 78 74 20 6f 66 20 74 68 65 20 53 51 4c   text of the SQL
13490 20 61 6e 64 20 74 68 65 20 61 6d 6f 75 6e 74 20   and the amount 
134a0 6f 66 20 65 6c 61 70 73 65 20 74 69 6d 65 20 61  of elapse time a
134b0 72 65 0a 20 20 2a 2a 20 61 70 70 65 6e 64 65 64  re.  ** appended
134c0 20 74 6f 20 43 41 4c 4c 42 41 43 4b 20 62 65 66   to CALLBACK bef
134d0 6f 72 65 20 74 68 65 20 73 63 72 69 70 74 20 69  ore the script i
134e0 73 20 72 75 6e 2e 0a 20 20 2a 2f 0a 20 20 63 61  s run..  */.  ca
134f0 73 65 20 44 42 5f 50 52 4f 46 49 4c 45 3a 20 7b  se DB_PROFILE: {
13500 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 33 20  .    if( objc>3 
13510 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f  ){.      Tcl_Wro
13520 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
13530 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 43 41 4c  , 2, objv, "?CAL
13540 4c 42 41 43 4b 3f 22 29 3b 0a 20 20 20 20 20 20  LBACK?");.      
13550 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
13560 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
13570 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20 20  objc==2 ){.     
13580 20 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f 66 69   if( pDb->zProfi
13590 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63  le ){.        Tc
135a0 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
135b0 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a 50 72 6f  nterp, pDb->zPro
135c0 66 69 6c 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  file, 0);.      
135d0 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
135e0 20 20 20 63 68 61 72 20 2a 7a 50 72 6f 66 69 6c     char *zProfil
135f0 65 3b 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e  e;.      int len
13600 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d  ;.      if( pDb-
13610 3e 7a 50 72 6f 66 69 6c 65 20 29 7b 0a 20 20 20  >zProfile ){.   
13620 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44       Tcl_Free(pD
13630 62 2d 3e 7a 50 72 6f 66 69 6c 65 29 3b 0a 20 20  b->zProfile);.  
13640 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 50 72 6f      }.      zPro
13650 66 69 6c 65 20 3d 20 54 63 6c 5f 47 65 74 53 74  file = Tcl_GetSt
13660 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
13670 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20  [2], &len);.    
13680 20 20 69 66 28 20 7a 50 72 6f 66 69 6c 65 20 26    if( zProfile &
13690 26 20 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20  & len>0 ){.     
136a0 20 20 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65     pDb->zProfile
136b0 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65   = Tcl_Alloc( le
136c0 6e 20 2b 20 31 20 29 3b 0a 20 20 20 20 20 20 20  n + 1 );.       
136d0 20 6d 65 6d 63 70 79 28 70 44 62 2d 3e 7a 50 72   memcpy(pDb->zPr
136e0 6f 66 69 6c 65 2c 20 7a 50 72 6f 66 69 6c 65 2c  ofile, zProfile,
136f0 20 6c 65 6e 2b 31 29 3b 0a 20 20 20 20 20 20 7d   len+1);.      }
13700 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 44  else{.        pD
13710 62 2d 3e 7a 50 72 6f 66 69 6c 65 20 3d 20 30 3b  b->zProfile = 0;
13720 0a 20 20 20 20 20 20 7d 0a 23 69 66 20 21 64 65  .      }.#if !de
13730 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
13740 54 5f 54 52 41 43 45 29 20 26 26 20 21 64 65 66  T_TRACE) && !def
13750 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
13760 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 29  _FLOATING_POINT)
13770 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e  .      if( pDb->
13780 7a 50 72 6f 66 69 6c 65 20 29 7b 0a 20 20 20 20  zProfile ){.    
13790 20 20 20 20 70 44 62 2d 3e 69 6e 74 65 72 70 20      pDb->interp 
137a0 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 20 20  = interp;.      
137b0 20 20 73 71 6c 69 74 65 33 5f 70 72 6f 66 69 6c    sqlite3_profil
137c0 65 28 70 44 62 2d 3e 64 62 2c 20 44 62 50 72 6f  e(pDb->db, DbPro
137d0 66 69 6c 65 48 61 6e 64 6c 65 72 2c 20 70 44 62  fileHandler, pDb
137e0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
137f0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
13800 70 72 6f 66 69 6c 65 28 70 44 62 2d 3e 64 62 2c  profile(pDb->db,
13810 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a   0, 0);.      }.
13820 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20  #endif.    }.   
13830 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
13840 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20 72  *.  **     $db r
13850 65 6b 65 79 20 4b 45 59 0a 20 20 2a 2a 0a 20 20  ekey KEY.  **.  
13860 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 65 6e  ** Change the en
13870 63 72 79 70 74 69 6f 6e 20 6b 65 79 20 6f 6e 20  cryption key on 
13880 74 68 65 20 63 75 72 72 65 6e 74 6c 79 20 6f 70  the currently op
13890 65 6e 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a  en database..  *
138a0 2f 0a 20 20 63 61 73 65 20 44 42 5f 52 45 4b 45  /.  case DB_REKE
138b0 59 3a 20 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  Y: {.#ifdef SQLI
138c0 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 20  TE_HAS_CODEC.   
138d0 20 69 6e 74 20 6e 4b 65 79 3b 0a 20 20 20 20 76   int nKey;.    v
138e0 6f 69 64 20 2a 70 4b 65 79 3b 0a 23 65 6e 64 69  oid *pKey;.#endi
138f0 66 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d  f.    if( objc!=
13900 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57  3 ){.      Tcl_W
13910 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
13920 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 4b 45  rp, 2, objv, "KE
13930 59 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  Y");.      retur
13940 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
13950 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
13960 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 20 20 70  _HAS_CODEC.    p
13970 4b 65 79 20 3d 20 54 63 6c 5f 47 65 74 42 79 74  Key = Tcl_GetByt
13980 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6f 62  eArrayFromObj(ob
13990 6a 76 5b 32 5d 2c 20 26 6e 4b 65 79 29 3b 0a 20  jv[2], &nKey);. 
139a0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
139b0 72 65 6b 65 79 28 70 44 62 2d 3e 64 62 2c 20 70  rekey(pDb->db, p
139c0 4b 65 79 2c 20 6e 4b 65 79 29 3b 0a 20 20 20 20  Key, nKey);.    
139d0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
139e0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
139f0 28 69 6e 74 65 72 70 2c 20 73 71 6c 69 74 65 33  (interp, sqlite3
13a00 45 72 72 53 74 72 28 72 63 29 2c 20 30 29 3b 0a  ErrStr(rc), 0);.
13a10 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45        rc = TCL_E
13a20 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  RROR;.    }.#end
13a30 69 66 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  if.    break;.  
13a40 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 72  }..  /*    $db r
13a50 65 73 74 6f 72 65 20 3f 44 41 54 41 42 41 53 45  estore ?DATABASE
13a60 3f 20 46 49 4c 45 4e 41 4d 45 0a 20 20 2a 2a 0a  ? FILENAME.  **.
13a70 20 20 2a 2a 20 4f 70 65 6e 20 61 20 64 61 74 61    ** Open a data
13a80 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 64 20  base file named 
13a90 46 49 4c 45 4e 41 4d 45 2e 20 20 54 72 61 6e 73  FILENAME.  Trans
13aa0 66 65 72 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  fer the content 
13ab0 0a 20 20 2a 2a 20 6f 66 20 46 49 4c 45 4e 41 4d  .  ** of FILENAM
13ac0 45 20 69 6e 74 6f 20 74 68 65 20 6c 6f 63 61 6c  E into the local
13ad0 20 64 61 74 61 62 61 73 65 20 44 41 54 41 42 41   database DATABA
13ae0 53 45 20 28 64 65 66 61 75 6c 74 3a 20 22 6d 61  SE (default: "ma
13af0 69 6e 22 29 2e 0a 20 20 2a 2f 0a 20 20 63 61 73  in")..  */.  cas
13b00 65 20 44 42 5f 52 45 53 54 4f 52 45 3a 20 7b 0a  e DB_RESTORE: {.
13b10 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
13b20 7a 53 72 63 46 69 6c 65 3b 0a 20 20 20 20 63 6f  zSrcFile;.    co
13b30 6e 73 74 20 63 68 61 72 20 2a 7a 44 65 73 74 44  nst char *zDestD
13b40 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a  b;.    sqlite3 *
13b50 70 53 72 63 3b 0a 20 20 20 20 73 71 6c 69 74 65  pSrc;.    sqlite
13b60 33 5f 62 61 63 6b 75 70 20 2a 70 42 61 63 6b 75  3_backup *pBacku
13b70 70 3b 0a 20 20 20 20 69 6e 74 20 6e 54 69 6d 65  p;.    int nTime
13b80 6f 75 74 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66  out = 0;..    if
13b90 28 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20 20 20  ( objc==3 ){.   
13ba0 20 20 20 7a 44 65 73 74 44 62 20 3d 20 22 6d 61     zDestDb = "ma
13bb0 69 6e 22 3b 0a 20 20 20 20 20 20 7a 53 72 63 46  in";.      zSrcF
13bc0 69 6c 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  ile = Tcl_GetStr
13bd0 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20  ing(objv[2]);.  
13be0 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a 63    }else if( objc
13bf0 3d 3d 34 20 29 7b 0a 20 20 20 20 20 20 7a 44 65  ==4 ){.      zDe
13c00 73 74 44 62 20 3d 20 54 63 6c 5f 47 65 74 53 74  stDb = Tcl_GetSt
13c10 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20  ring(objv[2]);. 
13c20 20 20 20 20 20 7a 53 72 63 46 69 6c 65 20 3d 20       zSrcFile = 
13c30 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
13c40 6a 76 5b 33 5d 29 3b 0a 20 20 20 20 7d 65 6c 73  jv[3]);.    }els
13c50 65 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f  e{.      Tcl_Wro
13c60 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
13c70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 44 41 54  , 2, objv, "?DAT
13c80 41 42 41 53 45 3f 20 46 49 4c 45 4e 41 4d 45 22  ABASE? FILENAME"
13c90 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
13ca0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
13cb0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
13cc0 33 5f 6f 70 65 6e 5f 76 32 28 7a 53 72 63 46 69  3_open_v2(zSrcFi
13cd0 6c 65 2c 20 26 70 53 72 63 2c 20 53 51 4c 49 54  le, &pSrc, SQLIT
13ce0 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 2c  E_OPEN_READONLY,
13cf0 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21   0);.    if( rc!
13d00 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
13d10 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
13d20 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 63 61  sult(interp, "ca
13d30 6e 6e 6f 74 20 6f 70 65 6e 20 73 6f 75 72 63 65  nnot open source
13d40 20 64 61 74 61 62 61 73 65 3a 20 22 2c 0a 20 20   database: ",.  
13d50 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
13d60 5f 65 72 72 6d 73 67 28 70 53 72 63 29 2c 20 28  _errmsg(pSrc), (
13d70 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20  char*)0);.      
13d80 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70 53  sqlite3_close(pS
13d90 72 63 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  rc);.      retur
13da0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
13db0 20 7d 0a 20 20 20 20 70 42 61 63 6b 75 70 20 3d   }.    pBackup =
13dc0 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f   sqlite3_backup_
13dd0 69 6e 69 74 28 70 44 62 2d 3e 64 62 2c 20 7a 44  init(pDb->db, zD
13de0 65 73 74 44 62 2c 20 70 53 72 63 2c 20 22 6d 61  estDb, pSrc, "ma
13df0 69 6e 22 29 3b 0a 20 20 20 20 69 66 28 20 70 42  in");.    if( pB
13e00 61 63 6b 75 70 3d 3d 30 20 29 7b 0a 20 20 20 20  ackup==0 ){.    
13e10 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
13e20 6c 74 28 69 6e 74 65 72 70 2c 20 22 72 65 73 74  lt(interp, "rest
13e30 6f 72 65 20 66 61 69 6c 65 64 3a 20 22 2c 0a 20  ore failed: ",. 
13e40 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
13e50 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62  3_errmsg(pDb->db
13e60 29 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  ), (char*)0);.  
13e70 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73      sqlite3_clos
13e80 65 28 70 53 72 63 29 3b 0a 20 20 20 20 20 20 72  e(pSrc);.      r
13e90 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
13ea0 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c 65  .    }.    while
13eb0 28 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  ( (rc = sqlite3_
13ec0 62 61 63 6b 75 70 5f 73 74 65 70 28 70 42 61 63  backup_step(pBac
13ed0 6b 75 70 2c 31 30 30 29 29 3d 3d 53 51 4c 49 54  kup,100))==SQLIT
13ee0 45 5f 4f 4b 0a 20 20 20 20 20 20 20 20 20 20 20  E_OK.           
13ef0 20 20 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45     || rc==SQLITE
13f00 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20 69  _BUSY ){.      i
13f10 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55  f( rc==SQLITE_BU
13f20 53 59 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  SY ){.        if
13f30 28 20 6e 54 69 6d 65 6f 75 74 2b 2b 20 3e 3d 20  ( nTimeout++ >= 
13f40 33 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  3 ) break;.     
13f50 20 20 20 73 71 6c 69 74 65 33 5f 73 6c 65 65 70     sqlite3_sleep
13f60 28 31 30 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  (100);.      }. 
13f70 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
13f80 5f 62 61 63 6b 75 70 5f 66 69 6e 69 73 68 28 70  _backup_finish(p
13f90 42 61 63 6b 75 70 29 3b 0a 20 20 20 20 69 66 28  Backup);.    if(
13fa0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc==SQLITE_DONE
13fb0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 54   ){.      rc = T
13fc0 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65  CL_OK;.    }else
13fd0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
13fe0 42 55 53 59 20 7c 7c 20 72 63 3d 3d 53 51 4c 49  BUSY || rc==SQLI
13ff0 54 45 5f 4c 4f 43 4b 45 44 20 29 7b 0a 20 20 20  TE_LOCKED ){.   
14000 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
14010 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 72 65 73  ult(interp, "res
14020 74 6f 72 65 20 66 61 69 6c 65 64 3a 20 73 6f 75  tore failed: sou
14030 72 63 65 20 64 61 74 61 62 61 73 65 20 62 75 73  rce database bus
14040 79 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  y",.            
14050 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
14060 2a 29 30 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  *)0);.      rc =
14070 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
14080 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 54 63 6c  }else{.      Tcl
14090 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
140a0 74 65 72 70 2c 20 22 72 65 73 74 6f 72 65 20 66  terp, "restore f
140b0 61 69 6c 65 64 3a 20 22 2c 0a 20 20 20 20 20 20  ailed: ",.      
140c0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65 72 72       sqlite3_err
140d0 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c 20 28 63  msg(pDb->db), (c
140e0 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 72  har*)0);.      r
140f0 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  c = TCL_ERROR;. 
14100 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
14110 5f 63 6c 6f 73 65 28 70 53 72 63 29 3b 0a 20 20  _close(pSrc);.  
14120 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
14130 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20  /*.  **     $db 
14140 73 74 61 74 75 73 20 28 73 74 65 70 7c 73 6f 72  status (step|sor
14150 74 7c 61 75 74 6f 69 6e 64 65 78 29 0a 20 20 2a  t|autoindex).  *
14160 2a 0a 20 20 2a 2a 20 44 69 73 70 6c 61 79 20 53  *.  ** Display S
14170 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53  QLITE_STMTSTATUS
14180 5f 46 55 4c 4c 53 43 41 4e 5f 53 54 45 50 20 6f  _FULLSCAN_STEP o
14190 72 20 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 53  r .  ** SQLITE_S
141a0 54 4d 54 53 54 41 54 55 53 5f 53 4f 52 54 20 66  TMTSTATUS_SORT f
141b0 6f 72 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  or the most rece
141c0 6e 74 20 65 76 61 6c 2e 0a 20 20 2a 2f 0a 20 20  nt eval..  */.  
141d0 63 61 73 65 20 44 42 5f 53 54 41 54 55 53 3a 20  case DB_STATUS: 
141e0 7b 0a 20 20 20 20 69 6e 74 20 76 3b 0a 20 20 20  {.    int v;.   
141f0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70   const char *zOp
14200 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d  ;.    if( objc!=
14210 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57  3 ){.      Tcl_W
14220 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
14230 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 28 73  rp, 2, objv, "(s
14240 74 65 70 7c 73 6f 72 74 7c 61 75 74 6f 69 6e 64  tep|sort|autoind
14250 65 78 29 22 29 3b 0a 20 20 20 20 20 20 72 65 74  ex)");.      ret
14260 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
14270 20 20 20 7d 0a 20 20 20 20 7a 4f 70 20 3d 20 54     }.    zOp = T
14280 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
14290 76 5b 32 5d 29 3b 0a 20 20 20 20 69 66 28 20 73  v[2]);.    if( s
142a0 74 72 63 6d 70 28 7a 4f 70 2c 20 22 73 74 65 70  trcmp(zOp, "step
142b0 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 76  ")==0 ){.      v
142c0 20 3d 20 70 44 62 2d 3e 6e 53 74 65 70 3b 0a 20   = pDb->nStep;. 
142d0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
142e0 63 6d 70 28 7a 4f 70 2c 20 22 73 6f 72 74 22 29  cmp(zOp, "sort")
142f0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 76 20 3d  ==0 ){.      v =
14300 20 70 44 62 2d 3e 6e 53 6f 72 74 3b 0a 20 20 20   pDb->nSort;.   
14310 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
14320 70 28 7a 4f 70 2c 20 22 61 75 74 6f 69 6e 64 65  p(zOp, "autoinde
14330 78 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  x")==0 ){.      
14340 76 20 3d 20 70 44 62 2d 3e 6e 49 6e 64 65 78 3b  v = pDb->nIndex;
14350 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
14360 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
14370 6c 74 28 69 6e 74 65 72 70 2c 20 0a 20 20 20 20  lt(interp, .    
14380 20 20 20 20 20 20 20 20 22 62 61 64 20 61 72 67          "bad arg
14390 75 6d 65 6e 74 3a 20 73 68 6f 75 6c 64 20 62 65  ument: should be
143a0 20 61 75 74 6f 69 6e 64 65 78 2c 20 73 74 65 70   autoindex, step
143b0 2c 20 6f 72 20 73 6f 72 74 22 2c 20 0a 20 20 20  , or sort", .   
143c0 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29           (char*)
143d0 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  0);.      return
143e0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
143f0 7d 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a  }.    Tcl_SetObj
14400 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
14410 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 76 29 29  cl_NewIntObj(v))
14420 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  ;.    break;.  }
14430 0a 20 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20  .  .  /*.  **   
14440 20 20 24 64 62 20 74 69 6d 65 6f 75 74 20 4d 49    $db timeout MI
14450 4c 4c 45 53 45 43 4f 4e 44 53 0a 20 20 2a 2a 0a  LLESECONDS.  **.
14460 20 20 2a 2a 20 44 65 6c 61 79 20 66 6f 72 20 74    ** Delay for t
14470 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c  he number of mil
14480 6c 69 73 65 63 6f 6e 64 73 20 73 70 65 63 69 66  liseconds specif
14490 69 65 64 20 77 68 65 6e 20 61 20 66 69 6c 65 20  ied when a file 
144a0 69 73 20 6c 6f 63 6b 65 64 2e 0a 20 20 2a 2f 0a  is locked..  */.
144b0 20 20 63 61 73 65 20 44 42 5f 54 49 4d 45 4f 55    case DB_TIMEOU
144c0 54 3a 20 7b 0a 20 20 20 20 69 6e 74 20 6d 73 3b  T: {.    int ms;
144d0 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 33  .    if( objc!=3
144e0 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72   ){.      Tcl_Wr
144f0 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
14500 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 4d 49 4c  p, 2, objv, "MIL
14510 4c 49 53 45 43 4f 4e 44 53 22 29 3b 0a 20 20 20  LISECONDS");.   
14520 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
14530 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ROR;.    }.    i
14540 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  f( Tcl_GetIntFro
14550 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
14560 76 5b 32 5d 2c 20 26 6d 73 29 20 29 20 72 65 74  v[2], &ms) ) ret
14570 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
14580 20 20 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f     sqlite3_busy_
14590 74 69 6d 65 6f 75 74 28 70 44 62 2d 3e 64 62 2c  timeout(pDb->db,
145a0 20 6d 73 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b   ms);.    break;
145b0 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 0a 20 20 2a  .  }.  .  /*.  *
145c0 2a 20 20 20 20 20 24 64 62 20 74 6f 74 61 6c 5f  *     $db total_
145d0 63 68 61 6e 67 65 73 0a 20 20 2a 2a 0a 20 20 2a  changes.  **.  *
145e0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
145f0 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74  ber of rows that
14600 20 77 65 72 65 20 6d 6f 64 69 66 69 65 64 2c 20   were modified, 
14610 69 6e 73 65 72 74 65 64 2c 20 6f 72 20 64 65 6c  inserted, or del
14620 65 74 65 64 20 0a 20 20 2a 2a 20 73 69 6e 63 65  eted .  ** since
14630 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
14640 6e 64 6c 65 20 77 61 73 20 63 72 65 61 74 65 64  ndle was created
14650 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  ..  */.  case DB
14660 5f 54 4f 54 41 4c 5f 43 48 41 4e 47 45 53 3a 20  _TOTAL_CHANGES: 
14670 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  {.    Tcl_Obj *p
14680 52 65 73 75 6c 74 3b 0a 20 20 20 20 69 66 28 20  Result;.    if( 
14690 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 20  objc!=2 ){.     
146a0 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
146b0 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a  s(interp, 2, obj
146c0 76 2c 20 22 22 29 3b 0a 20 20 20 20 20 20 72 65  v, "");.      re
146d0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
146e0 20 20 20 20 7d 0a 20 20 20 20 70 52 65 73 75 6c      }.    pResul
146f0 74 20 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65  t = Tcl_GetObjRe
14700 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  sult(interp);.  
14710 20 20 54 63 6c 5f 53 65 74 49 6e 74 4f 62 6a 28    Tcl_SetIntObj(
14720 70 52 65 73 75 6c 74 2c 20 73 71 6c 69 74 65 33  pResult, sqlite3
14730 5f 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73 28 70  _total_changes(p
14740 44 62 2d 3e 64 62 29 29 3b 0a 20 20 20 20 62 72  Db->db));.    br
14750 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20  eak;.  }..  /*  
14760 20 20 24 64 62 20 74 72 61 63 65 20 3f 43 41 4c    $db trace ?CAL
14770 4c 42 41 43 4b 3f 0a 20 20 2a 2a 0a 20 20 2a 2a  LBACK?.  **.  **
14780 20 4d 61 6b 65 20 61 72 72 61 6e 67 65 6d 65 6e   Make arrangemen
14790 74 73 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65  ts to invoke the
147a0 20 43 41 4c 4c 42 41 43 4b 20 72 6f 75 74 69 6e   CALLBACK routin
147b0 65 20 66 6f 72 20 65 61 63 68 20 53 51 4c 20 73  e for each SQL s
147c0 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 68  tatement.  ** th
147d0 61 74 20 69 73 20 65 78 65 63 75 74 65 64 2e 20  at is executed. 
147e0 20 54 68 65 20 74 65 78 74 20 6f 66 20 74 68 65   The text of the
147f0 20 53 51 4c 20 69 73 20 61 70 70 65 6e 64 65 64   SQL is appended
14800 20 74 6f 20 43 41 4c 4c 42 41 43 4b 20 62 65 66   to CALLBACK bef
14810 6f 72 65 0a 20 20 2a 2a 20 69 74 20 69 73 20 65  ore.  ** it is e
14820 78 65 63 75 74 65 64 2e 0a 20 20 2a 2f 0a 20 20  xecuted..  */.  
14830 63 61 73 65 20 44 42 5f 54 52 41 43 45 3a 20 7b  case DB_TRACE: {
14840 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 33 20  .    if( objc>3 
14850 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f  ){.      Tcl_Wro
14860 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
14870 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 43 41 4c  , 2, objv, "?CAL
14880 4c 42 41 43 4b 3f 22 29 3b 0a 20 20 20 20 20 20  LBACK?");.      
14890 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
148a0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
148b0 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20 20  objc==2 ){.     
148c0 20 69 66 28 20 70 44 62 2d 3e 7a 54 72 61 63 65   if( pDb->zTrace
148d0 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f   ){.        Tcl_
148e0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
148f0 65 72 70 2c 20 70 44 62 2d 3e 7a 54 72 61 63 65  erp, pDb->zTrace
14900 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
14910 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63    }else{.      c
14920 68 61 72 20 2a 7a 54 72 61 63 65 3b 0a 20 20 20  har *zTrace;.   
14930 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20     int len;.    
14940 20 20 69 66 28 20 70 44 62 2d 3e 7a 54 72 61 63    if( pDb->zTrac
14950 65 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c  e ){.        Tcl
14960 5f 46 72 65 65 28 70 44 62 2d 3e 7a 54 72 61 63  _Free(pDb->zTrac
14970 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
14980 20 20 7a 54 72 61 63 65 20 3d 20 54 63 6c 5f 47    zTrace = Tcl_G
14990 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
149a0 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a  objv[2], &len);.
149b0 20 20 20 20 20 20 69 66 28 20 7a 54 72 61 63 65        if( zTrace
149c0 20 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20 20 20   && len>0 ){.   
149d0 20 20 20 20 20 70 44 62 2d 3e 7a 54 72 61 63 65       pDb->zTrace
149e0 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65   = Tcl_Alloc( le
149f0 6e 20 2b 20 31 20 29 3b 0a 20 20 20 20 20 20 20  n + 1 );.       
14a00 20 6d 65 6d 63 70 79 28 70 44 62 2d 3e 7a 54 72   memcpy(pDb->zTr
14a10 61 63 65 2c 20 7a 54 72 61 63 65 2c 20 6c 65 6e  ace, zTrace, len
14a20 2b 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  +1);.      }else
14a30 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a  {.        pDb->z
14a40 54 72 61 63 65 20 3d 20 30 3b 0a 20 20 20 20 20  Trace = 0;.     
14a50 20 7d 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28   }.#if !defined(
14a60 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43  SQLITE_OMIT_TRAC
14a70 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  E) && !defined(S
14a80 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54  QLITE_OMIT_FLOAT
14a90 49 4e 47 5f 50 4f 49 4e 54 29 0a 20 20 20 20 20  ING_POINT).     
14aa0 20 69 66 28 20 70 44 62 2d 3e 7a 54 72 61 63 65   if( pDb->zTrace
14ab0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d   ){.        pDb-
14ac0 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70  >interp = interp
14ad0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
14ae0 33 5f 74 72 61 63 65 28 70 44 62 2d 3e 64 62 2c  3_trace(pDb->db,
14af0 20 44 62 54 72 61 63 65 48 61 6e 64 6c 65 72 2c   DbTraceHandler,
14b00 20 70 44 62 29 3b 0a 20 20 20 20 20 20 7d 65 6c   pDb);.      }el
14b10 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
14b20 74 65 33 5f 74 72 61 63 65 28 70 44 62 2d 3e 64  te3_trace(pDb->d
14b30 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  b, 0, 0);.      
14b40 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20  }.#endif.    }. 
14b50 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
14b60 20 2f 2a 20 20 20 20 24 64 62 20 74 72 61 6e 73   /*    $db trans
14b70 61 63 74 69 6f 6e 20 5b 2d 64 65 66 65 72 72 65  action [-deferre
14b80 64 7c 2d 69 6d 6d 65 64 69 61 74 65 7c 2d 65 78  d|-immediate|-ex
14b90 63 6c 75 73 69 76 65 5d 20 53 43 52 49 50 54 0a  clusive] SCRIPT.
14ba0 20 20 2a 2a 0a 20 20 2a 2a 20 53 74 61 72 74 20    **.  ** Start 
14bb0 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f  a new transactio
14bc0 6e 20 28 69 66 20 77 65 20 61 72 65 20 6e 6f 74  n (if we are not
14bd0 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
14be0 6d 69 64 73 74 20 6f 66 20 61 0a 20 20 2a 2a 20  midst of a.  ** 
14bf0 74 72 61 6e 73 61 63 74 69 6f 6e 29 20 61 6e 64  transaction) and
14c00 20 65 78 65 63 75 74 65 20 74 68 65 20 54 43 4c   execute the TCL
14c10 20 73 63 72 69 70 74 20 53 43 52 49 50 54 2e 20   script SCRIPT. 
14c20 20 41 66 74 65 72 20 53 43 52 49 50 54 0a 20 20   After SCRIPT.  
14c30 2a 2a 20 63 6f 6d 70 6c 65 74 65 73 2c 20 65 69  ** completes, ei
14c40 74 68 65 72 20 63 6f 6d 6d 69 74 20 74 68 65 20  ther commit the 
14c50 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 72 20 72  transaction or r
14c60 6f 6c 6c 20 69 74 20 62 61 63 6b 20 69 66 20 53  oll it back if S
14c70 43 52 49 50 54 0a 20 20 2a 2a 20 74 68 72 6f 77  CRIPT.  ** throw
14c80 73 20 61 6e 20 65 78 63 65 70 74 69 6f 6e 2e 20  s an exception. 
14c90 20 4f 72 20 69 66 20 6e 6f 20 6e 65 77 20 74 72   Or if no new tr
14ca0 61 6e 73 61 74 69 6f 6e 20 77 61 73 20 73 74 61  ansation was sta
14cb0 72 74 65 64 2c 20 64 6f 20 6e 6f 74 68 69 6e 67  rted, do nothing
14cc0 2e 0a 20 20 2a 2a 20 70 61 73 73 20 74 68 65 20  ..  ** pass the 
14cd0 65 78 63 65 70 74 69 6f 6e 20 6f 6e 20 75 70 20  exception on up 
14ce0 74 68 65 20 73 74 61 63 6b 2e 0a 20 20 2a 2a 0a  the stack..  **.
14cf0 20 20 2a 2a 20 54 68 69 73 20 63 6f 6d 6d 61 6e    ** This comman
14d00 64 20 77 61 73 20 69 6e 73 70 69 72 65 64 20 62  d was inspired b
14d10 79 20 44 61 76 65 20 54 68 6f 6d 61 73 27 73 20  y Dave Thomas's 
14d20 74 61 6c 6b 20 6f 6e 20 52 75 62 79 20 61 74 20  talk on Ruby at 
14d30 74 68 65 0a 20 20 2a 2a 20 32 30 30 35 20 4f 27  the.  ** 2005 O'
14d40 52 65 69 6c 6c 79 20 4f 70 65 6e 20 53 6f 75 72  Reilly Open Sour
14d50 63 65 20 43 6f 6e 76 65 6e 74 69 6f 6e 20 28 4f  ce Convention (O
14d60 53 43 4f 4e 29 2e 0a 20 20 2a 2f 0a 20 20 63 61  SCON)..  */.  ca
14d70 73 65 20 44 42 5f 54 52 41 4e 53 41 43 54 49 4f  se DB_TRANSACTIO
14d80 4e 3a 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  N: {.    Tcl_Obj
14d90 20 2a 70 53 63 72 69 70 74 3b 0a 20 20 20 20 63   *pScript;.    c
14da0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 42 65 67 69  onst char *zBegi
14db0 6e 20 3d 20 22 53 41 56 45 50 4f 49 4e 54 20 5f  n = "SAVEPOINT _
14dc0 74 63 6c 5f 74 72 61 6e 73 61 63 74 69 6f 6e 22  tcl_transaction"
14dd0 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d  ;.    if( objc!=
14de0 33 20 26 26 20 6f 62 6a 63 21 3d 34 20 29 7b 0a  3 && objc!=4 ){.
14df0 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
14e00 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
14e10 2c 20 6f 62 6a 76 2c 20 22 5b 54 59 50 45 5d 20  , objv, "[TYPE] 
14e20 53 43 52 49 50 54 22 29 3b 0a 20 20 20 20 20 20  SCRIPT");.      
14e30 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
14e40 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
14e50 20 70 44 62 2d 3e 6e 54 72 61 6e 73 61 63 74 69   pDb->nTransacti
14e60 6f 6e 3d 3d 30 20 26 26 20 6f 62 6a 63 3d 3d 34  on==0 && objc==4
14e70 20 29 7b 0a 20 20 20 20 20 20 73 74 61 74 69 63   ){.      static
14e80 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 54 54 59   const char *TTY
14e90 50 45 5f 73 74 72 73 5b 5d 20 3d 20 7b 0a 20 20  PE_strs[] = {.  
14ea0 20 20 20 20 20 20 22 64 65 66 65 72 72 65 64 22        "deferred"
14eb0 2c 20 20 20 22 65 78 63 6c 75 73 69 76 65 22 2c  ,   "exclusive",
14ec0 20 20 22 69 6d 6d 65 64 69 61 74 65 22 2c 20 30    "immediate", 0
14ed0 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20  .      };.      
14ee0 65 6e 75 6d 20 54 54 59 50 45 5f 65 6e 75 6d 20  enum TTYPE_enum 
14ef0 7b 0a 20 20 20 20 20 20 20 20 54 54 59 50 45 5f  {.        TTYPE_
14f00 44 45 46 45 52 52 45 44 2c 20 54 54 59 50 45 5f  DEFERRED, TTYPE_
14f10 45 58 43 4c 55 53 49 56 45 2c 20 54 54 59 50 45  EXCLUSIVE, TTYPE
14f20 5f 49 4d 4d 45 44 49 41 54 45 0a 20 20 20 20 20  _IMMEDIATE.     
14f30 20 7d 3b 0a 20 20 20 20 20 20 69 6e 74 20 74 74   };.      int tt
14f40 79 70 65 3b 0a 20 20 20 20 20 20 69 66 28 20 54  ype;.      if( T
14f50 63 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f  cl_GetIndexFromO
14f60 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
14f70 32 5d 2c 20 54 54 59 50 45 5f 73 74 72 73 2c 20  2], TTYPE_strs, 
14f80 22 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 79 70  "transaction typ
14f90 65 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  e",.            
14fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14fb0 20 20 30 2c 20 26 74 74 79 70 65 29 20 29 7b 0a    0, &ttype) ){.
14fc0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54          return T
14fd0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  CL_ERROR;.      
14fe0 7d 0a 20 20 20 20 20 20 73 77 69 74 63 68 28 20  }.      switch( 
14ff0 28 65 6e 75 6d 20 54 54 59 50 45 5f 65 6e 75 6d  (enum TTYPE_enum
15000 29 74 74 79 70 65 20 29 7b 0a 20 20 20 20 20 20  )ttype ){.      
15010 20 20 63 61 73 65 20 54 54 59 50 45 5f 44 45 46    case TTYPE_DEF
15020 45 52 52 45 44 3a 20 20 20 20 2f 2a 20 6e 6f 2d  ERRED:    /* no-
15030 6f 70 20 2a 2f 3b 20 20 20 20 20 20 20 20 20 20  op */;          
15040 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
15050 20 20 20 20 20 20 63 61 73 65 20 54 54 59 50 45        case TTYPE
15060 5f 45 58 43 4c 55 53 49 56 45 3a 20 20 20 7a 42  _EXCLUSIVE:   zB
15070 65 67 69 6e 20 3d 20 22 42 45 47 49 4e 20 45 58  egin = "BEGIN EX
15080 43 4c 55 53 49 56 45 22 3b 20 20 62 72 65 61 6b  CLUSIVE";  break
15090 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 54  ;.        case T
150a0 54 59 50 45 5f 49 4d 4d 45 44 49 41 54 45 3a 20  TYPE_IMMEDIATE: 
150b0 20 20 7a 42 65 67 69 6e 20 3d 20 22 42 45 47 49    zBegin = "BEGI
150c0 4e 20 49 4d 4d 45 44 49 41 54 45 22 3b 20 20 62  N IMMEDIATE";  b
150d0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
150e0 20 20 7d 0a 20 20 20 20 70 53 63 72 69 70 74 20    }.    pScript 
150f0 3d 20 6f 62 6a 76 5b 6f 62 6a 63 2d 31 5d 3b 0a  = objv[objc-1];.
15100 0a 20 20 20 20 2f 2a 20 52 75 6e 20 74 68 65 20  .    /* Run the 
15110 53 51 4c 69 74 65 20 42 45 47 49 4e 20 63 6f 6d  SQLite BEGIN com
15120 6d 61 6e 64 20 74 6f 20 6f 70 65 6e 20 61 20 74  mand to open a t
15130 72 61 6e 73 61 63 74 69 6f 6e 20 6f 72 20 73 61  ransaction or sa
15140 76 65 70 6f 69 6e 74 2e 20 2a 2f 0a 20 20 20 20  vepoint. */.    
15150 70 44 62 2d 3e 64 69 73 61 62 6c 65 41 75 74 68  pDb->disableAuth
15160 2b 2b 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  ++;.    rc = sql
15170 69 74 65 33 5f 65 78 65 63 28 70 44 62 2d 3e 64  ite3_exec(pDb->d
15180 62 2c 20 7a 42 65 67 69 6e 2c 20 30 2c 20 30 2c  b, zBegin, 0, 0,
15190 20 30 29 3b 0a 20 20 20 20 70 44 62 2d 3e 64 69   0);.    pDb->di
151a0 73 61 62 6c 65 41 75 74 68 2d 2d 3b 0a 20 20 20  sableAuth--;.   
151b0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
151c0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  OK ){.      Tcl_
151d0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
151e0 65 72 70 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  erp, sqlite3_err
151f0 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c 20 30 29  msg(pDb->db), 0)
15200 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
15210 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
15220 20 20 20 20 70 44 62 2d 3e 6e 54 72 61 6e 73 61      pDb->nTransa
15230 63 74 69 6f 6e 2b 2b 3b 0a 0a 20 20 20 20 2f 2a  ction++;..    /*
15240 20 49 66 20 75 73 69 6e 67 20 4e 52 45 2c 20 73   If using NRE, s
15250 63 68 65 64 75 6c 65 20 61 20 63 61 6c 6c 62 61  chedule a callba
15260 63 6b 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65  ck to invoke the
15270 20 73 63 72 69 70 74 20 70 53 63 72 69 70 74 2c   script pScript,
15280 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 61 20 73   then.    ** a s
15290 65 63 6f 6e 64 20 63 61 6c 6c 62 61 63 6b 20 74  econd callback t
152a0 6f 20 63 6f 6d 6d 69 74 20 28 6f 72 20 72 6f 6c  o commit (or rol
152b0 6c 62 61 63 6b 29 20 74 68 65 20 74 72 61 6e 73  lback) the trans
152c0 61 63 74 69 6f 6e 20 6f 72 20 73 61 76 65 70 6f  action or savepo
152d0 69 6e 74 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 65  int.    ** opene
152e0 64 20 61 62 6f 76 65 2e 20 49 66 20 6e 6f 74 20  d above. If not 
152f0 75 73 69 6e 67 20 4e 52 45 2c 20 65 76 61 6c 75  using NRE, evalu
15300 61 74 65 20 74 68 65 20 73 63 72 69 70 74 20 64  ate the script d
15310 69 72 65 63 74 6c 79 2c 20 74 68 65 6e 0a 20 20  irectly, then.  
15320 20 20 2a 2a 20 63 61 6c 6c 20 66 75 6e 63 74 69    ** call functi
15330 6f 6e 20 44 62 54 72 61 6e 73 50 6f 73 74 43 6d  on DbTransPostCm
15340 64 28 29 20 74 6f 20 63 6f 6d 6d 69 74 20 28 6f  d() to commit (o
15350 72 20 72 6f 6c 6c 62 61 63 6b 29 20 74 68 65 20  r rollback) the 
15360 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20 20  transaction .   
15370 20 2a 2a 20 6f 72 20 73 61 76 65 70 6f 69 6e 74   ** or savepoint
15380 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 44 62  .  */.    if( Db
15390 55 73 65 4e 72 65 28 29 20 29 7b 0a 20 20 20 20  UseNre() ){.    
153a0 20 20 54 63 6c 5f 4e 52 41 64 64 43 61 6c 6c 62    Tcl_NRAddCallb
153b0 61 63 6b 28 69 6e 74 65 72 70 2c 20 44 62 54 72  ack(interp, DbTr
153c0 61 6e 73 50 6f 73 74 43 6d 64 2c 20 63 64 2c 20  ansPostCmd, cd, 
153d0 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  0, 0, 0);.      
153e0 54 63 6c 5f 4e 52 45 76 61 6c 4f 62 6a 28 69 6e  Tcl_NREvalObj(in
153f0 74 65 72 70 2c 20 70 53 63 72 69 70 74 2c 20 30  terp, pScript, 0
15400 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
15410 20 20 20 20 72 63 20 3d 20 44 62 54 72 61 6e 73      rc = DbTrans
15420 50 6f 73 74 43 6d 64 28 26 63 64 2c 20 69 6e 74  PostCmd(&cd, int
15430 65 72 70 2c 20 54 63 6c 5f 45 76 61 6c 4f 62 6a  erp, Tcl_EvalObj
15440 45 78 28 69 6e 74 65 72 70 2c 20 70 53 63 72 69  Ex(interp, pScri
15450 70 74 2c 20 30 29 29 3b 0a 20 20 20 20 7d 0a 20  pt, 0));.    }. 
15460 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
15470 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 24 64 62 20   /*.  **    $db 
15480 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79 20 3f 73  unlock_notify ?s
15490 63 72 69 70 74 3f 0a 20 20 2a 2f 0a 20 20 63 61  cript?.  */.  ca
154a0 73 65 20 44 42 5f 55 4e 4c 4f 43 4b 5f 4e 4f 54  se DB_UNLOCK_NOT
154b0 49 46 59 3a 20 7b 0a 23 69 66 6e 64 65 66 20 53  IFY: {.#ifndef S
154c0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 55 4e 4c  QLITE_ENABLE_UNL
154d0 4f 43 4b 5f 4e 4f 54 49 46 59 0a 20 20 20 20 54  OCK_NOTIFY.    T
154e0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
154f0 69 6e 74 65 72 70 2c 20 22 75 6e 6c 6f 63 6b 5f  interp, "unlock_
15500 6e 6f 74 69 66 79 20 6e 6f 74 20 61 76 61 69 6c  notify not avail
15510 61 62 6c 65 20 69 6e 20 74 68 69 73 20 62 75 69  able in this bui
15520 6c 64 22 2c 20 30 29 3b 0a 20 20 20 20 72 63 20  ld", 0);.    rc 
15530 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c  = TCL_ERROR;.#el
15540 73 65 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21  se.    if( objc!
15550 3d 32 20 26 26 20 6f 62 6a 63 21 3d 33 20 29 7b  =2 && objc!=3 ){
15560 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  .      Tcl_Wrong
15570 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
15580 32 2c 20 6f 62 6a 76 2c 20 22 3f 53 43 52 49 50  2, objv, "?SCRIP
15590 54 3f 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  T?");.      rc =
155a0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
155b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 76 6f 69  }else{.      voi
155c0 64 20 28 2a 78 4e 6f 74 69 66 79 29 28 76 6f 69  d (*xNotify)(voi
155d0 64 20 2a 2a 2c 20 69 6e 74 29 20 3d 20 30 3b 0a  d **, int) = 0;.
155e0 20 20 20 20 20 20 76 6f 69 64 20 2a 70 4e 6f 74        void *pNot
155f0 69 66 79 41 72 67 20 3d 20 30 3b 0a 0a 20 20 20  ifyArg = 0;..   
15600 20 20 20 69 66 28 20 70 44 62 2d 3e 70 55 6e 6c     if( pDb->pUnl
15610 6f 63 6b 4e 6f 74 69 66 79 20 29 7b 0a 20 20 20  ockNotify ){.   
15620 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66       Tcl_DecrRef
15630 43 6f 75 6e 74 28 70 44 62 2d 3e 70 55 6e 6c 6f  Count(pDb->pUnlo
15640 63 6b 4e 6f 74 69 66 79 29 3b 0a 20 20 20 20 20  ckNotify);.     
15650 20 20 20 70 44 62 2d 3e 70 55 6e 6c 6f 63 6b 4e     pDb->pUnlockN
15660 6f 74 69 66 79 20 3d 20 30 3b 0a 20 20 20 20 20  otify = 0;.     
15670 20 7d 0a 20 20 0a 20 20 20 20 20 20 69 66 28 20   }.  .      if( 
15680 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20 20 20 20 20  objc==3 ){.     
15690 20 20 20 78 4e 6f 74 69 66 79 20 3d 20 44 62 55     xNotify = DbU
156a0 6e 6c 6f 63 6b 4e 6f 74 69 66 79 3b 0a 20 20 20  nlockNotify;.   
156b0 20 20 20 20 20 70 4e 6f 74 69 66 79 41 72 67 20       pNotifyArg 
156c0 3d 20 28 76 6f 69 64 20 2a 29 70 44 62 3b 0a 20  = (void *)pDb;. 
156d0 20 20 20 20 20 20 20 70 44 62 2d 3e 70 55 6e 6c         pDb->pUnl
156e0 6f 63 6b 4e 6f 74 69 66 79 20 3d 20 6f 62 6a 76  ockNotify = objv
156f0 5b 32 5d 3b 0a 20 20 20 20 20 20 20 20 54 63 6c  [2];.        Tcl
15700 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 44  _IncrRefCount(pD
15710 62 2d 3e 70 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79  b->pUnlockNotify
15720 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 0a 20 20  );.      }.  .  
15730 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f      if( sqlite3_
15740 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79 28 70 44  unlock_notify(pD
15750 62 2d 3e 64 62 2c 20 78 4e 6f 74 69 66 79 2c 20  b->db, xNotify, 
15760 70 4e 6f 74 69 66 79 41 72 67 29 20 29 7b 0a 20  pNotifyArg) ){. 
15770 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e         Tcl_Appen
15780 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
15790 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70  sqlite3_errmsg(p
157a0 44 62 2d 3e 64 62 29 2c 20 30 29 3b 0a 20 20 20  Db->db), 0);.   
157b0 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45 52       rc = TCL_ER
157c0 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ROR;.      }.   
157d0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 62 72   }.#endif.    br
157e0 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  eak;.  }..  /*. 
157f0 20 2a 2a 20 20 20 20 24 64 62 20 77 61 6c 5f 68   **    $db wal_h
15800 6f 6f 6b 20 3f 73 63 72 69 70 74 3f 0a 20 20 2a  ook ?script?.  *
15810 2a 20 20 20 20 24 64 62 20 75 70 64 61 74 65 5f  *    $db update_
15820 68 6f 6f 6b 20 3f 73 63 72 69 70 74 3f 0a 20 20  hook ?script?.  
15830 2a 2a 20 20 20 20 24 64 62 20 72 6f 6c 6c 62 61  **    $db rollba
15840 63 6b 5f 68 6f 6f 6b 20 3f 73 63 72 69 70 74 3f  ck_hook ?script?
15850 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f  .  */.  case DB_
15860 57 41 4c 5f 48 4f 4f 4b 3a 20 0a 20 20 63 61 73  WAL_HOOK: .  cas
15870 65 20 44 42 5f 55 50 44 41 54 45 5f 48 4f 4f 4b  e DB_UPDATE_HOOK
15880 3a 20 0a 20 20 63 61 73 65 20 44 42 5f 52 4f 4c  : .  case DB_ROL
15890 4c 42 41 43 4b 5f 48 4f 4f 4b 3a 20 7b 0a 0a 20  LBACK_HOOK: {.. 
158a0 20 20 20 2f 2a 20 73 65 74 20 70 70 48 6f 6f 6b     /* set ppHook
158b0 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 70 55 70   to point at pUp
158c0 64 61 74 65 48 6f 6f 6b 20 6f 72 20 70 52 6f 6c  dateHook or pRol
158d0 6c 62 61 63 6b 48 6f 6f 6b 2c 20 64 65 70 65 6e  lbackHook, depen
158e0 64 69 6e 67 20 6f 6e 20 0a 20 20 20 20 2a 2a 20  ding on .    ** 
158f0 77 68 65 74 68 65 72 20 5b 24 64 62 20 75 70 64  whether [$db upd
15900 61 74 65 5f 68 6f 6f 6b 5d 20 6f 72 20 5b 24 64  ate_hook] or [$d
15910 62 20 72 6f 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 5d  b rollback_hook]
15920 20 77 61 73 20 69 6e 76 6f 6b 65 64 2e 0a 20 20   was invoked..  
15930 20 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a    */.    Tcl_Obj
15940 20 2a 2a 70 70 48 6f 6f 6b 3b 20 0a 20 20 20 20   **ppHook; .    
15950 69 66 28 20 63 68 6f 69 63 65 3d 3d 44 42 5f 55  if( choice==DB_U
15960 50 44 41 54 45 5f 48 4f 4f 4b 20 29 7b 0a 20 20  PDATE_HOOK ){.  
15970 20 20 20 20 70 70 48 6f 6f 6b 20 3d 20 26 70 44      ppHook = &pD
15980 62 2d 3e 70 55 70 64 61 74 65 48 6f 6f 6b 3b 0a  b->pUpdateHook;.
15990 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 68      }else if( ch
159a0 6f 69 63 65 3d 3d 44 42 5f 57 41 4c 5f 48 4f 4f  oice==DB_WAL_HOO
159b0 4b 20 29 7b 0a 20 20 20 20 20 20 70 70 48 6f 6f  K ){.      ppHoo
159c0 6b 20 3d 20 26 70 44 62 2d 3e 70 57 61 6c 48 6f  k = &pDb->pWalHo
159d0 6f 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ok;.    }else{. 
159e0 20 20 20 20 20 70 70 48 6f 6f 6b 20 3d 20 26 70       ppHook = &p
159f0 44 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f  Db->pRollbackHoo
15a00 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  k;.    }..    if
15a10 28 20 6f 62 6a 63 21 3d 32 20 26 26 20 6f 62 6a  ( objc!=2 && obj
15a20 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 20 54  c!=3 ){.       T
15a30 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
15a40 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c  interp, 2, objv,
15a50 20 22 3f 53 43 52 49 50 54 3f 22 29 3b 0a 20 20   "?SCRIPT?");.  
15a60 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
15a70 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
15a80 20 69 66 28 20 2a 70 70 48 6f 6f 6b 20 29 7b 0a   if( *ppHook ){.
15a90 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a        Tcl_SetObj
15aa0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 2a  Result(interp, *
15ab0 70 70 48 6f 6f 6b 29 3b 0a 20 20 20 20 20 20 69  ppHook);.      i
15ac0 66 28 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20 20  f( objc==3 ){.  
15ad0 20 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65        Tcl_DecrRe
15ae0 66 43 6f 75 6e 74 28 2a 70 70 48 6f 6f 6b 29 3b  fCount(*ppHook);
15af0 0a 20 20 20 20 20 20 20 20 2a 70 70 48 6f 6f 6b  .        *ppHook
15b00 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
15b10 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 62 6a 63    }.    if( objc
15b20 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ==3 ){.      ass
15b30 65 72 74 28 20 21 28 2a 70 70 48 6f 6f 6b 29 20  ert( !(*ppHook) 
15b40 29 3b 0a 20 20 20 20 20 20 69 66 28 20 54 63 6c  );.      if( Tcl
15b50 5f 47 65 74 43 68 61 72 4c 65 6e 67 74 68 28 6f  _GetCharLength(o
15b60 62 6a 76 5b 32 5d 29 3e 30 20 29 7b 0a 20 20 20  bjv[2])>0 ){.   
15b70 20 20 20 20 20 2a 70 70 48 6f 6f 6b 20 3d 20 6f       *ppHook = o
15b80 62 6a 76 5b 32 5d 3b 0a 20 20 20 20 20 20 20 20  bjv[2];.        
15b90 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
15ba0 28 2a 70 70 48 6f 6f 6b 29 3b 0a 20 20 20 20 20  (*ppHook);.     
15bb0 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 71   }.    }..    sq
15bc0 6c 69 74 65 33 5f 75 70 64 61 74 65 5f 68 6f 6f  lite3_update_hoo
15bd0 6b 28 70 44 62 2d 3e 64 62 2c 20 28 70 44 62 2d  k(pDb->db, (pDb-
15be0 3e 70 55 70 64 61 74 65 48 6f 6f 6b 3f 44 62 55  >pUpdateHook?DbU
15bf0 70 64 61 74 65 48 61 6e 64 6c 65 72 3a 30 29 2c  pdateHandler:0),
15c00 20 70 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74   pDb);.    sqlit
15c10 65 33 5f 72 6f 6c 6c 62 61 63 6b 5f 68 6f 6f 6b  e3_rollback_hook
15c20 28 70 44 62 2d 3e 64 62 2c 28 70 44 62 2d 3e 70  (pDb->db,(pDb->p
15c30 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 3f 44 62 52  RollbackHook?DbR
15c40 6f 6c 6c 62 61 63 6b 48 61 6e 64 6c 65 72 3a 30  ollbackHandler:0
15c50 29 2c 70 44 62 29 3b 0a 20 20 20 20 73 71 6c 69  ),pDb);.    sqli
15c60 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 70 44 62  te3_wal_hook(pDb
15c70 2d 3e 64 62 2c 28 70 44 62 2d 3e 70 57 61 6c 48  ->db,(pDb->pWalH
15c80 6f 6f 6b 3f 44 62 57 61 6c 48 61 6e 64 6c 65 72  ook?DbWalHandler
15c90 3a 30 29 2c 70 44 62 29 3b 0a 0a 20 20 20 20 62  :0),pDb);..    b
15ca0 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  reak;.  }..  /* 
15cb0 20 20 20 24 64 62 20 76 65 72 73 69 6f 6e 0a 20     $db version. 
15cc0 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20   **.  ** Return 
15cd0 74 68 65 20 76 65 72 73 69 6f 6e 20 73 74 72 69  the version stri
15ce0 6e 67 20 66 6f 72 20 74 68 69 73 20 64 61 74 61  ng for this data
15cf0 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 63 61 73  base..  */.  cas
15d00 65 20 44 42 5f 56 45 52 53 49 4f 4e 3a 20 7b 0a  e DB_VERSION: {.
15d10 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c      Tcl_SetResul
15d20 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20  t(interp, (char 
15d30 2a 29 73 71 6c 69 74 65 33 5f 6c 69 62 76 65 72  *)sqlite3_libver
15d40 73 69 6f 6e 28 29 2c 20 54 43 4c 5f 53 54 41 54  sion(), TCL_STAT
15d50 49 43 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a  IC);.    break;.
15d60 20 20 7d 0a 0a 0a 20 20 7d 20 2f 2a 20 45 6e 64    }...  } /* End
15d70 20 6f 66 20 74 68 65 20 53 57 49 54 43 48 20 73   of the SWITCH s
15d80 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 72 65  tatement */.  re
15d90 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 20  turn rc;.}..#if 
15da0 53 51 4c 49 54 45 5f 54 43 4c 5f 4e 52 45 0a 2f  SQLITE_TCL_NRE./
15db0 2a 0a 2a 2a 20 41 64 61 70 74 6f 72 20 74 68 61  *.** Adaptor tha
15dc0 74 20 70 72 6f 76 69 64 65 73 20 61 6e 20 6f 62  t provides an ob
15dd0 6a 43 6d 64 20 69 6e 74 65 72 66 61 63 65 20 74  jCmd interface t
15de0 6f 20 74 68 65 20 4e 52 45 2d 65 6e 61 62 6c 65  o the NRE-enable
15df0 64 0a 2a 2a 20 69 6e 74 65 72 66 61 63 65 20 69  d.** interface i
15e00 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 0a 2a  mplementation..*
15e10 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 44 62 4f  /.static int DbO
15e20 62 6a 43 6d 64 41 64 61 70 74 6f 72 28 0a 20 20  bjCmdAdaptor(.  
15e30 76 6f 69 64 20 2a 63 64 2c 0a 20 20 54 63 6c 5f  void *cd,.  Tcl_
15e40 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
15e50 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
15e60 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 2a 6f 62 6a  l_Obj *const*obj
15e70 76 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 54 63  v.){.  return Tc
15e80 6c 5f 4e 52 43 61 6c 6c 4f 62 6a 50 72 6f 63 28  l_NRCallObjProc(
15e90 69 6e 74 65 72 70 2c 20 44 62 4f 62 6a 43 6d 64  interp, DbObjCmd
15ea0 2c 20 63 64 2c 20 6f 62 6a 63 2c 20 6f 62 6a 76  , cd, objc, objv
15eb0 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  );.}.#endif /* S
15ec0 51 4c 49 54 45 5f 54 43 4c 5f 4e 52 45 20 2a 2f  QLITE_TCL_NRE */
15ed0 0a 0a 2f 2a 0a 2a 2a 20 20 20 73 71 6c 69 74 65  ../*.**   sqlite
15ee0 33 20 44 42 4e 41 4d 45 20 46 49 4c 45 4e 41 4d  3 DBNAME FILENAM
15ef0 45 20 3f 2d 76 66 73 20 56 46 53 4e 41 4d 45 3f  E ?-vfs VFSNAME?
15f00 20 3f 2d 6b 65 79 20 4b 45 59 3f 20 3f 2d 72 65   ?-key KEY? ?-re
15f10 61 64 6f 6e 6c 79 20 42 4f 4f 4c 45 41 4e 3f 0a  adonly BOOLEAN?.
15f20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
15f30 20 20 20 20 20 20 20 20 20 20 20 20 20 3f 2d 63               ?-c
15f40 72 65 61 74 65 20 42 4f 4f 4c 45 41 4e 3f 20 3f  reate BOOLEAN? ?
15f50 2d 6e 6f 6d 75 74 65 78 20 42 4f 4f 4c 45 41 4e  -nomutex BOOLEAN
15f60 3f 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ?.**.** This is 
15f70 74 68 65 20 6d 61 69 6e 20 54 63 6c 20 63 6f 6d  the main Tcl com
15f80 6d 61 6e 64 2e 20 20 57 68 65 6e 20 74 68 65 20  mand.  When the 
15f90 22 73 71 6c 69 74 65 22 20 54 63 6c 20 63 6f 6d  "sqlite" Tcl com
15fa0 6d 61 6e 64 20 69 73 0a 2a 2a 20 69 6e 76 6f 6b  mand is.** invok
15fb0 65 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ed, this routine
15fc0 20 72 75 6e 73 20 74 6f 20 70 72 6f 63 65 73 73   runs to process
15fd0 20 74 68 61 74 20 63 6f 6d 6d 61 6e 64 2e 0a 2a   that command..*
15fe0 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 61  *.** The first a
15ff0 72 67 75 6d 65 6e 74 2c 20 44 42 4e 41 4d 45 2c  rgument, DBNAME,
16000 20 69 73 20 61 6e 20 61 72 62 69 74 72 61 72 79   is an arbitrary
16010 20 6e 61 6d 65 20 66 6f 72 20 61 20 6e 65 77 0a   name for a new.
16020 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  ** database conn
16030 65 63 74 69 6f 6e 2e 20 20 54 68 69 73 20 63 6f  ection.  This co
16040 6d 6d 61 6e 64 20 63 72 65 61 74 65 73 20 61 20  mmand creates a 
16050 6e 65 77 20 63 6f 6d 6d 61 6e 64 20 6e 61 6d 65  new command name
16060 64 0a 2a 2a 20 44 42 4e 41 4d 45 20 74 68 61 74  d.** DBNAME that
16070 20 69 73 20 75 73 65 64 20 74 6f 20 63 6f 6e 74   is used to cont
16080 72 6f 6c 20 74 68 61 74 20 63 6f 6e 6e 65 63 74  rol that connect
16090 69 6f 6e 2e 20 20 54 68 65 20 64 61 74 61 62 61  ion.  The databa
160a0 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e  se.** connection
160b0 20 69 73 20 64 65 6c 65 74 65 64 20 77 68 65 6e   is deleted when
160c0 20 74 68 65 20 44 42 4e 41 4d 45 20 63 6f 6d 6d   the DBNAME comm
160d0 61 6e 64 20 69 73 20 64 65 6c 65 74 65 64 2e 0a  and is deleted..
160e0 2a 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64  **.** The second
160f0 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65   argument is the
16100 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   name of the dat
16110 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  abase file..**.*
16120 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 44 62 4d  /.static int DbM
16130 61 69 6e 28 76 6f 69 64 20 2a 63 64 2c 20 54 63  ain(void *cd, Tc
16140 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
16150 2c 20 69 6e 74 20 6f 62 6a 63 2c 54 63 6c 5f 4f  , int objc,Tcl_O
16160 62 6a 20 2a 63 6f 6e 73 74 2a 6f 62 6a 76 29 7b  bj *const*objv){
16170 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 3b 0a  .  SqliteDb *p;.
16180 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41    const char *zA
16190 72 67 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72  rg;.  char *zErr
161a0 4d 73 67 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  Msg;.  int i;.  
161b0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
161c0 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  e;.  const char 
161d0 2a 7a 56 66 73 20 3d 20 30 3b 0a 20 20 69 6e 74  *zVfs = 0;.  int
161e0 20 66 6c 61 67 73 3b 0a 20 20 54 63 6c 5f 44 53   flags;.  Tcl_DS
161f0 74 72 69 6e 67 20 74 72 61 6e 73 6c 61 74 65 64  tring translated
16200 46 69 6c 65 6e 61 6d 65 3b 0a 23 69 66 64 65 66  Filename;.#ifdef
16210 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45   SQLITE_HAS_CODE
16220 43 0a 20 20 76 6f 69 64 20 2a 70 4b 65 79 20 3d  C.  void *pKey =
16230 20 30 3b 0a 20 20 69 6e 74 20 6e 4b 65 79 20 3d   0;.  int nKey =
16240 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a   0;.#endif..  /*
16250 20 49 6e 20 6e 6f 72 6d 61 6c 20 75 73 65 2c 20   In normal use, 
16260 65 61 63 68 20 54 43 4c 20 69 6e 74 65 72 70 72  each TCL interpr
16270 65 74 65 72 20 72 75 6e 73 20 69 6e 20 61 20 73  eter runs in a s
16280 69 6e 67 6c 65 20 74 68 72 65 61 64 2e 20 20 53  ingle thread.  S
16290 6f 0a 20 20 2a 2a 20 62 79 20 64 65 66 61 75 6c  o.  ** by defaul
162a0 74 2c 20 77 65 20 63 61 6e 20 74 75 72 6e 20 6f  t, we can turn o
162b0 66 20 6d 75 74 65 78 69 6e 67 20 6f 6e 20 53 51  f mutexing on SQ
162c0 4c 69 74 65 20 64 61 74 61 62 61 73 65 20 63 6f  Lite database co
162d0 6e 6e 65 63 74 69 6f 6e 73 2e 0a 20 20 2a 2a 20  nnections..  ** 
162e0 48 6f 77 65 76 65 72 2c 20 66 6f 72 20 74 65 73  However, for tes
162f0 74 69 6e 67 20 70 75 72 70 6f 73 65 73 20 69 74  ting purposes it
16300 20 69 73 20 75 73 65 66 75 6c 20 74 6f 20 68 61   is useful to ha
16310 76 65 20 6d 75 74 65 78 65 73 20 74 75 72 6e 65  ve mutexes turne
16320 64 0a 20 20 2a 2a 20 6f 6e 2e 20 20 53 6f 2c 20  d.  ** on.  So, 
16330 62 79 20 64 65 66 61 75 6c 74 2c 20 6d 75 74 65  by default, mute
16340 78 65 73 20 64 65 66 61 75 6c 74 20 6f 66 66 2e  xes default off.
16350 20 20 42 75 74 20 69 66 20 63 6f 6d 70 69 6c 65    But if compile
16360 64 20 77 69 74 68 0a 20 20 2a 2a 20 53 51 4c 49  d with.  ** SQLI
16370 54 45 5f 54 43 4c 5f 44 45 46 41 55 4c 54 5f 46  TE_TCL_DEFAULT_F
16380 55 4c 4c 4d 55 54 45 58 20 74 68 65 6e 20 6d 75  ULLMUTEX then mu
16390 74 65 78 65 73 20 64 65 66 61 75 6c 74 20 6f 6e  texes default on
163a0 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  ..  */.#ifdef SQ
163b0 4c 49 54 45 5f 54 43 4c 5f 44 45 46 41 55 4c 54  LITE_TCL_DEFAULT
163c0 5f 46 55 4c 4c 4d 55 54 45 58 0a 20 20 66 6c 61  _FULLMUTEX.  fla
163d0 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs = SQLITE_OPEN
163e0 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c  _READWRITE | SQL
163f0 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20  ITE_OPEN_CREATE 
16400 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55  | SQLITE_OPEN_FU
16410 4c 4c 4d 55 54 45 58 3b 0a 23 65 6c 73 65 0a 20  LLMUTEX;.#else. 
16420 20 66 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f   flags = SQLITE_
16430 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c  OPEN_READWRITE |
16440 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45   SQLITE_OPEN_CRE
16450 41 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45  ATE | SQLITE_OPE
16460 4e 5f 4e 4f 4d 55 54 45 58 3b 0a 23 65 6e 64 69  N_NOMUTEX;.#endi
16470 66 0a 0a 20 20 69 66 28 20 6f 62 6a 63 3d 3d 32  f..  if( objc==2
16480 20 29 7b 0a 20 20 20 20 7a 41 72 67 20 3d 20 54   ){.    zArg = T
16490 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
164a0 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 30 29 3b  Obj(objv[1], 0);
164b0 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28  .    if( strcmp(
164c0 7a 41 72 67 2c 22 2d 76 65 72 73 69 6f 6e 22 29  zArg,"-version")
164d0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  ==0 ){.      Tcl
164e0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
164f0 74 65 72 70 2c 73 71 6c 69 74 65 33 5f 76 65 72  terp,sqlite3_ver
16500 73 69 6f 6e 2c 30 29 3b 0a 20 20 20 20 20 20 72  sion,0);.      r
16510 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20  eturn TCL_OK;.  
16520 20 20 7d 0a 20 20 20 20 69 66 28 20 73 74 72 63    }.    if( strc
16530 6d 70 28 7a 41 72 67 2c 22 2d 68 61 73 2d 63 6f  mp(zArg,"-has-co
16540 64 65 63 22 29 3d 3d 30 20 29 7b 0a 23 69 66 64  dec")==0 ){.#ifd
16550 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  ef SQLITE_HAS_CO
16560 44 45 43 0a 20 20 20 20 20 20 54 63 6c 5f 41 70  DEC.      Tcl_Ap
16570 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
16580 70 2c 22 31 22 2c 30 29 3b 0a 23 65 6c 73 65 0a  p,"1",0);.#else.
16590 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
165a0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 30  Result(interp,"0
165b0 22 2c 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  ",0);.#endif.   
165c0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b     return TCL_OK
165d0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f  ;.    }.  }.  fo
165e0 72 28 69 3d 33 3b 20 69 2b 31 3c 6f 62 6a 63 3b  r(i=3; i+1<objc;
165f0 20 69 2b 3d 32 29 7b 0a 20 20 20 20 7a 41 72 67   i+=2){.    zArg
16600 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
16610 28 6f 62 6a 76 5b 69 5d 29 3b 0a 20 20 20 20 69  (objv[i]);.    i
16620 66 28 20 73 74 72 63 6d 70 28 7a 41 72 67 2c 22  f( strcmp(zArg,"
16630 2d 6b 65 79 22 29 3d 3d 30 20 29 7b 0a 23 69 66  -key")==0 ){.#if
16640 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43  def SQLITE_HAS_C
16650 4f 44 45 43 0a 20 20 20 20 20 20 70 4b 65 79 20  ODEC.      pKey 
16660 3d 20 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72  = Tcl_GetByteArr
16670 61 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 69  ayFromObj(objv[i
16680 2b 31 5d 2c 20 26 6e 4b 65 79 29 3b 0a 23 65 6e  +1], &nKey);.#en
16690 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  dif.    }else if
166a0 28 20 73 74 72 63 6d 70 28 7a 41 72 67 2c 20 22  ( strcmp(zArg, "
166b0 2d 76 66 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20  -vfs")==0 ){.   
166c0 20 20 20 7a 56 66 73 20 3d 20 54 63 6c 5f 47 65     zVfs = Tcl_Ge
166d0 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 69 2b 31  tString(objv[i+1
166e0 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  ]);.    }else if
166f0 28 20 73 74 72 63 6d 70 28 7a 41 72 67 2c 20 22  ( strcmp(zArg, "
16700 2d 72 65 61 64 6f 6e 6c 79 22 29 3d 3d 30 20 29  -readonly")==0 )
16710 7b 0a 20 20 20 20 20 20 69 6e 74 20 62 3b 0a 20  {.      int b;. 
16720 20 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74       if( Tcl_Get
16730 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69  BooleanFromObj(i
16740 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 69 2b 31 5d  nterp, objv[i+1]
16750 2c 20 26 62 29 20 29 20 72 65 74 75 72 6e 20 54  , &b) ) return T
16760 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  CL_ERROR;.      
16770 69 66 28 20 62 20 29 7b 0a 20 20 20 20 20 20 20  if( b ){.       
16780 20 66 6c 61 67 73 20 26 3d 20 7e 28 53 51 4c 49   flags &= ~(SQLI
16790 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
167a0 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  E|SQLITE_OPEN_CR
167b0 45 41 54 45 29 3b 0a 20 20 20 20 20 20 20 20 66  EATE);.        f
167c0 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f  lags |= SQLITE_O
167d0 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20  PEN_READONLY;.  
167e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
167f0 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c     flags &= ~SQL
16800 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
16810 59 3b 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73  Y;.        flags
16820 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   |= SQLITE_OPEN_
16830 52 45 41 44 57 52 49 54 45 3b 0a 20 20 20 20 20  READWRITE;.     
16840 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28   }.    }else if(
16850 20 73 74 72 63 6d 70 28 7a 41 72 67 2c 20 22 2d   strcmp(zArg, "-
16860 63 72 65 61 74 65 22 29 3d 3d 30 20 29 7b 0a 20  create")==0 ){. 
16870 20 20 20 20 20 69 6e 74 20 62 3b 0a 20 20 20 20       int b;.    
16880 20 20 69 66 28 20 54 63 6c 5f 47 65 74 42 6f 6f    if( Tcl_GetBoo
16890 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  leanFromObj(inte
168a0 72 70 2c 20 6f 62 6a 76 5b 69 2b 31 5d 2c 20 26  rp, objv[i+1], &
168b0 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
168c0 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 69 66 28  ERROR;.      if(
168d0 20 62 20 26 26 20 28 66 6c 61 67 73 20 26 20 53   b && (flags & S
168e0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
168f0 4e 4c 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  NLY)==0 ){.     
16900 20 20 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49     flags |= SQLI
16910 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 3b 0a  TE_OPEN_CREATE;.
16920 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
16930 20 20 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 53       flags &= ~S
16940 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
16950 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  E;.      }.    }
16960 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
16970 7a 41 72 67 2c 20 22 2d 6e 6f 6d 75 74 65 78 22  zArg, "-nomutex"
16980 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  )==0 ){.      in
16990 74 20 62 3b 0a 20 20 20 20 20 20 69 66 28 20 54  t b;.      if( T
169a0 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f  cl_GetBooleanFro
169b0 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
169c0 76 5b 69 2b 31 5d 2c 20 26 62 29 20 29 20 72 65  v[i+1], &b) ) re
169d0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
169e0 20 20 20 20 20 20 69 66 28 20 62 20 29 7b 0a 20        if( b ){. 
169f0 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20         flags |= 
16a00 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55  SQLITE_OPEN_NOMU
16a10 54 45 58 3b 0a 20 20 20 20 20 20 20 20 66 6c 61  TEX;.        fla
16a20 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 4f 50  gs &= ~SQLITE_OP
16a30 45 4e 5f 46 55 4c 4c 4d 55 54 45 58 3b 0a 20 20  EN_FULLMUTEX;.  
16a40 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
16a50 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c     flags &= ~SQL
16a60 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58  ITE_OPEN_NOMUTEX
16a70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
16a80 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a  lse if( strcmp(z
16a90 41 72 67 2c 20 22 2d 66 75 6c 6c 6d 75 74 65 78  Arg, "-fullmutex
16aa0 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ")==0 ){.      i
16ab0 6e 74 20 62 3b 0a 20 20 20 20 20 20 69 66 28 20  nt b;.      if( 
16ac0 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72  Tcl_GetBooleanFr
16ad0 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
16ae0 6a 76 5b 69 2b 31 5d 2c 20 26 62 29 20 29 20 72  jv[i+1], &b) ) r
16af0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
16b00 0a 20 20 20 20 20 20 69 66 28 20 62 20 29 7b 0a  .      if( b ){.
16b10 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d          flags |=
16b20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55 4c   SQLITE_OPEN_FUL
16b30 4c 4d 55 54 45 58 3b 0a 20 20 20 20 20 20 20 20  LMUTEX;.        
16b40 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45  flags &= ~SQLITE
16b50 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58 3b 0a 20  _OPEN_NOMUTEX;. 
16b60 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
16b70 20 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 53 51      flags &= ~SQ
16b80 4c 49 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55  LITE_OPEN_FULLMU
16b90 54 45 58 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  TEX;.      }.   
16ba0 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
16bb0 70 28 7a 41 72 67 2c 20 22 2d 75 72 69 22 29 3d  p(zArg, "-uri")=
16bc0 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =0 ){.      int 
16bd0 62 3b 0a 20 20 20 20 20 20 69 66 28 20 54 63 6c  b;.      if( Tcl
16be0 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f  _GetBooleanFromO
16bf0 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
16c00 69 2b 31 5d 2c 20 26 62 29 20 29 20 72 65 74 75  i+1], &b) ) retu
16c10 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
16c20 20 20 20 20 69 66 28 20 62 20 29 7b 0a 20 20 20      if( b ){.   
16c30 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 53 51       flags |= SQ
16c40 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 3b 0a 20  LITE_OPEN_URI;. 
16c50 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
16c60 20 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 53 51      flags &= ~SQ
16c70 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 3b 0a 20  LITE_OPEN_URI;. 
16c80 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
16c90 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65  {.      Tcl_Appe
16ca0 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
16cb0 20 22 75 6e 6b 6e 6f 77 6e 20 6f 70 74 69 6f 6e   "unknown option
16cc0 3a 20 22 2c 20 7a 41 72 67 2c 20 28 63 68 61 72  : ", zArg, (char
16cd0 2a 29 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75  *)0);.      retu
16ce0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
16cf0 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6f 62    }.  }.  if( ob
16d00 6a 63 3c 33 20 7c 7c 20 28 6f 62 6a 63 26 31 29  jc<3 || (objc&1)
16d10 21 3d 31 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  !=1 ){.    Tcl_W
16d20 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
16d30 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 0a 20 20  rp, 1, objv, .  
16d40 20 20 20 20 22 48 41 4e 44 4c 45 20 46 49 4c 45      "HANDLE FILE
16d50 4e 41 4d 45 20 3f 2d 76 66 73 20 56 46 53 4e 41  NAME ?-vfs VFSNA
16d60 4d 45 3f 20 3f 2d 72 65 61 64 6f 6e 6c 79 20 42  ME? ?-readonly B
16d70 4f 4f 4c 45 41 4e 3f 20 3f 2d 63 72 65 61 74 65  OOLEAN? ?-create
16d80 20 42 4f 4f 4c 45 41 4e 3f 22 0a 20 20 20 20 20   BOOLEAN?".     
16d90 20 22 20 3f 2d 6e 6f 6d 75 74 65 78 20 42 4f 4f   " ?-nomutex BOO
16da0 4c 45 41 4e 3f 20 3f 2d 66 75 6c 6c 6d 75 74 65  LEAN? ?-fullmute
16db0 78 20 42 4f 4f 4c 45 41 4e 3f 20 3f 2d 75 72 69  x BOOLEAN? ?-uri
16dc0 20 42 4f 4f 4c 45 41 4e 3f 22 0a 23 69 66 64 65   BOOLEAN?".#ifde
16dd0 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
16de0 45 43 0a 20 20 20 20 20 20 22 20 3f 2d 6b 65 79  EC.      " ?-key
16df0 20 43 4f 44 45 43 4b 45 59 3f 22 0a 23 65 6e 64   CODECKEY?".#end
16e00 69 66 0a 20 20 20 20 29 3b 0a 20 20 20 20 72 65  if.    );.    re
16e10 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
16e20 20 20 7d 0a 20 20 7a 45 72 72 4d 73 67 20 3d 20    }.  zErrMsg = 
16e30 30 3b 0a 20 20 70 20 3d 20 28 53 71 6c 69 74 65  0;.  p = (Sqlite
16e40 44 62 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28 20 73  Db*)Tcl_Alloc( s
16e50 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69  izeof(*p) );.  i
16e60 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 54  f( p==0 ){.    T
16e70 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
16e80 65 72 70 2c 20 22 6d 61 6c 6c 6f 63 20 66 61 69  erp, "malloc fai
16e90 6c 65 64 22 2c 20 54 43 4c 5f 53 54 41 54 49 43  led", TCL_STATIC
16ea0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
16eb0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 6d  L_ERROR;.  }.  m
16ec0 65 6d 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65  emset(p, 0, size
16ed0 6f 66 28 2a 70 29 29 3b 0a 20 20 7a 46 69 6c 65  of(*p));.  zFile
16ee0 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
16ef0 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c  FromObj(objv[2],
16f00 20 30 29 3b 0a 20 20 7a 46 69 6c 65 20 3d 20 54   0);.  zFile = T
16f10 63 6c 5f 54 72 61 6e 73 6c 61 74 65 46 69 6c 65  cl_TranslateFile
16f20 4e 61 6d 65 28 69 6e 74 65 72 70 2c 20 7a 46 69  Name(interp, zFi
16f30 6c 65 2c 20 26 74 72 61 6e 73 6c 61 74 65 64 46  le, &translatedF
16f40 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 73 71 6c 69  ilename);.  sqli
16f50 74 65 33 5f 6f 70 65 6e 5f 76 32 28 7a 46 69 6c  te3_open_v2(zFil
16f60 65 2c 20 26 70 2d 3e 64 62 2c 20 66 6c 61 67 73  e, &p->db, flags
16f70 2c 20 7a 56 66 73 29 3b 0a 20 20 54 63 6c 5f 44  , zVfs);.  Tcl_D
16f80 53 74 72 69 6e 67 46 72 65 65 28 26 74 72 61 6e  StringFree(&tran
16f90 73 6c 61 74 65 64 46 69 6c 65 6e 61 6d 65 29 3b  slatedFilename);
16fa0 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b  .  if( SQLITE_OK
16fb0 21 3d 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64  !=sqlite3_errcod
16fc0 65 28 70 2d 3e 64 62 29 20 29 7b 0a 20 20 20 20  e(p->db) ){.    
16fd0 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65  zErrMsg = sqlite
16fe0 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20  3_mprintf("%s", 
16ff0 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70  sqlite3_errmsg(p
17000 2d 3e 64 62 29 29 3b 0a 20 20 20 20 73 71 6c 69  ->db));.    sqli
17010 74 65 33 5f 63 6c 6f 73 65 28 70 2d 3e 64 62 29  te3_close(p->db)
17020 3b 0a 20 20 20 20 70 2d 3e 64 62 20 3d 20 30 3b  ;.    p->db = 0;
17030 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49  .  }.#ifdef SQLI
17040 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 69  TE_HAS_CODEC.  i
17050 66 28 20 70 2d 3e 64 62 20 29 7b 0a 20 20 20 20  f( p->db ){.    
17060 73 71 6c 69 74 65 33 5f 6b 65 79 28 70 2d 3e 64  sqlite3_key(p->d
17070 62 2c 20 70 4b 65 79 2c 20 6e 4b 65 79 29 3b 0a  b, pKey, nKey);.
17080 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28    }.#endif.  if(
17090 20 70 2d 3e 64 62 3d 3d 30 20 29 7b 0a 20 20 20   p->db==0 ){.   
170a0 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
170b0 6e 74 65 72 70 2c 20 7a 45 72 72 4d 73 67 2c 20  nterp, zErrMsg, 
170c0 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20  TCL_VOLATILE);. 
170d0 20 20 20 54 63 6c 5f 46 72 65 65 28 28 63 68 61     Tcl_Free((cha
170e0 72 2a 29 70 29 3b 0a 20 20 20 20 73 71 6c 69 74  r*)p);.    sqlit
170f0 65 33 5f 66 72 65 65 28 7a 45 72 72 4d 73 67 29  e3_free(zErrMsg)
17100 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
17110 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 2d  _ERROR;.  }.  p-
17120 3e 6d 61 78 53 74 6d 74 20 3d 20 4e 55 4d 5f 50  >maxStmt = NUM_P
17130 52 45 50 41 52 45 44 5f 53 54 4d 54 53 3b 0a 20  REPARED_STMTS;. 
17140 20 70 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74   p->interp = int
17150 65 72 70 3b 0a 20 20 7a 41 72 67 20 3d 20 54 63  erp;.  zArg = Tc
17160 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
17170 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 30 29 3b 0a  bj(objv[1], 0);.
17180 20 20 69 66 28 20 44 62 55 73 65 4e 72 65 28 29    if( DbUseNre()
17190 20 29 7b 0a 20 20 20 20 54 63 6c 5f 4e 52 43 72   ){.    Tcl_NRCr
171a0 65 61 74 65 43 6f 6d 6d 61 6e 64 28 69 6e 74 65  eateCommand(inte
171b0 72 70 2c 20 7a 41 72 67 2c 20 44 62 4f 62 6a 43  rp, zArg, DbObjC
171c0 6d 64 41 64 61 70 74 6f 72 2c 20 44 62 4f 62 6a  mdAdaptor, DbObj
171d0 43 6d 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Cmd,.           
171e0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
171f0 61 72 2a 29 70 2c 20 44 62 44 65 6c 65 74 65 43  ar*)p, DbDeleteC
17200 6d 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  md);.  }else{.  
17210 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43    Tcl_CreateObjC
17220 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 7a  ommand(interp, z
17230 41 72 67 2c 20 44 62 4f 62 6a 43 6d 64 2c 20 28  Arg, DbObjCmd, (
17240 63 68 61 72 2a 29 70 2c 20 44 62 44 65 6c 65 74  char*)p, DbDelet
17250 65 43 6d 64 29 3b 0a 20 20 7d 0a 20 20 72 65 74  eCmd);.  }.  ret
17260 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
17270 2a 0a 2a 2a 20 50 72 6f 76 69 64 65 20 61 20 64  *.** Provide a d
17280 75 6d 6d 79 20 54 63 6c 5f 49 6e 69 74 53 74 75  ummy Tcl_InitStu
17290 62 73 20 69 66 20 77 65 20 61 72 65 20 75 73 69  bs if we are usi
172a0 6e 67 20 74 68 69 73 20 61 73 20 61 20 73 74 61  ng this as a sta
172b0 74 69 63 0a 2a 2a 20 6c 69 62 72 61 72 79 2e 0a  tic.** library..
172c0 2a 2f 0a 23 69 66 6e 64 65 66 20 55 53 45 5f 54  */.#ifndef USE_T
172d0 43 4c 5f 53 54 55 42 53 0a 23 20 75 6e 64 65 66  CL_STUBS.# undef
172e0 20 20 54 63 6c 5f 49 6e 69 74 53 74 75 62 73 0a    Tcl_InitStubs.
172f0 23 20 64 65 66 69 6e 65 20 54 63 6c 5f 49 6e 69  # define Tcl_Ini
17300 74 53 74 75 62 73 28 61 2c 62 2c 63 29 0a 23 65  tStubs(a,b,c).#e
17310 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65  ndif../*.** Make
17320 20 73 75 72 65 20 77 65 20 68 61 76 65 20 61 20   sure we have a 
17330 50 41 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e 20  PACKAGE_VERSION 
17340 6d 61 63 72 6f 20 64 65 66 69 6e 65 64 2e 20 20  macro defined.  
17350 54 68 69 73 20 77 69 6c 6c 20 62 65 0a 2a 2a 20  This will be.** 
17360 64 65 66 69 6e 65 64 20 61 75 74 6f 6d 61 74 69  defined automati
17370 63 61 6c 6c 79 20 62 79 20 74 68 65 20 54 45 41  cally by the TEA
17380 20 6d 61 6b 65 66 69 6c 65 2e 20 20 42 75 74 20   makefile.  But 
17390 6f 74 68 65 72 20 6d 61 6b 65 66 69 6c 65 73 0a  other makefiles.
173a0 2a 2a 20 64 6f 20 6e 6f 74 20 64 65 66 69 6e 65  ** do not define
173b0 20 69 74 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20   it..*/.#ifndef 
173c0 50 41 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e 0a  PACKAGE_VERSION.
173d0 23 20 64 65 66 69 6e 65 20 50 41 43 4b 41 47 45  # define PACKAGE
173e0 5f 56 45 52 53 49 4f 4e 20 53 51 4c 49 54 45 5f  _VERSION SQLITE_
173f0 56 45 52 53 49 4f 4e 0a 23 65 6e 64 69 66 0a 0a  VERSION.#endif..
17400 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65  /*.** Initialize
17410 20 74 68 69 73 20 6d 6f 64 75 6c 65 2e 0a 2a 2a   this module..**
17420 0a 2a 2a 20 54 68 69 73 20 54 63 6c 20 6d 6f 64  .** This Tcl mod
17430 75 6c 65 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 6c  ule contains onl
17440 79 20 61 20 73 69 6e 67 6c 65 20 6e 65 77 20 54  y a single new T
17450 63 6c 20 63 6f 6d 6d 61 6e 64 20 6e 61 6d 65 64  cl command named
17460 20 22 73 71 6c 69 74 65 22 2e 0a 2a 2a 20 28 48   "sqlite"..** (H
17470 65 6e 63 65 20 74 68 65 72 65 20 69 73 20 6e 6f  ence there is no
17480 20 6e 61 6d 65 73 70 61 63 65 2e 20 20 54 68 65   namespace.  The
17490 72 65 20 69 73 20 6e 6f 20 70 6f 69 6e 74 20 69  re is no point i
174a0 6e 20 75 73 69 6e 67 20 61 20 6e 61 6d 65 73 70  n using a namesp
174b0 61 63 65 0a 2a 2a 20 69 66 20 74 68 65 20 65 78  ace.** if the ex
174c0 74 65 6e 73 69 6f 6e 20 6f 6e 6c 79 20 73 75 70  tension only sup
174d0 70 6c 69 65 73 20 6f 6e 65 20 6e 65 77 20 6e 61  plies one new na
174e0 6d 65 21 29 20 20 54 68 65 20 22 73 71 6c 69 74  me!)  The "sqlit
174f0 65 22 20 63 6f 6d 6d 61 6e 64 20 69 73 0a 2a 2a  e" command is.**
17500 20 75 73 65 64 20 74 6f 20 6f 70 65 6e 20 61 20   used to open a 
17510 6e 65 77 20 53 51 4c 69 74 65 20 64 61 74 61 62  new SQLite datab
17520 61 73 65 2e 20 20 53 65 65 20 74 68 65 20 44 62  ase.  See the Db
17530 4d 61 69 6e 28 29 20 72 6f 75 74 69 6e 65 20 61  Main() routine a
17540 62 6f 76 65 0a 2a 2a 20 66 6f 72 20 61 64 64 69  bove.** for addi
17550 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69  tional informati
17560 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 58  on..**.** The EX
17570 54 45 52 4e 20 6d 61 63 72 6f 73 20 61 72 65 20  TERN macros are 
17580 72 65 71 75 69 72 65 64 20 62 79 20 54 43 4c 20  required by TCL 
17590 69 6e 20 6f 72 64 65 72 20 74 6f 20 77 6f 72 6b  in order to work
175a0 20 6f 6e 20 77 69 6e 64 6f 77 73 2e 0a 2a 2f 0a   on windows..*/.
175b0 45 58 54 45 52 4e 20 69 6e 74 20 53 71 6c 69 74  EXTERN int Sqlit
175c0 65 33 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  e3_Init(Tcl_Inte
175d0 72 70 20 2a 69 6e 74 65 72 70 29 7b 0a 20 20 54  rp *interp){.  T
175e0 63 6c 5f 49 6e 69 74 53 74 75 62 73 28 69 6e 74  cl_InitStubs(int
175f0 65 72 70 2c 20 22 38 2e 34 22 2c 20 30 29 3b 0a  erp, "8.4", 0);.
17600 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43    Tcl_CreateObjC
17610 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22  ommand(interp, "
17620 73 71 6c 69 74 65 33 22 2c 20 28 54 63 6c 5f 4f  sqlite3", (Tcl_O
17630 62 6a 43 6d 64 50 72 6f 63 2a 29 44 62 4d 61 69  bjCmdProc*)DbMai
17640 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 54 63 6c 5f  n, 0, 0);.  Tcl_
17650 50 6b 67 50 72 6f 76 69 64 65 28 69 6e 74 65 72  PkgProvide(inter
17660 70 2c 20 22 73 71 6c 69 74 65 33 22 2c 20 50 41  p, "sqlite3", PA
17670 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e 29 3b 0a  CKAGE_VERSION);.
17680 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
17690 33 5f 53 55 46 46 49 58 5f 4f 4e 4c 59 0a 20 20  3_SUFFIX_ONLY.  
176a0 2f 2a 20 54 68 65 20 22 73 71 6c 69 74 65 22 20  /* The "sqlite" 
176b0 61 6c 69 61 73 20 69 73 20 75 6e 64 6f 63 75 6d  alias is undocum
176c0 65 6e 74 65 64 2e 20 20 49 74 20 69 73 20 68 65  ented.  It is he
176d0 72 65 20 6f 6e 6c 79 20 74 6f 20 73 75 70 70 6f  re only to suppo
176e0 72 74 0a 20 20 2a 2a 20 6c 65 67 61 63 79 20 73  rt.  ** legacy s
176f0 63 72 69 70 74 73 2e 20 20 41 6c 6c 20 6e 65 77  cripts.  All new
17700 20 73 63 72 69 70 74 73 20 73 68 6f 75 6c 64 20   scripts should 
17710 75 73 65 20 6f 6e 6c 79 20 74 68 65 20 22 73 71  use only the "sq
17720 6c 69 74 65 33 22 0a 20 20 2a 2a 20 63 6f 6d 6d  lite3".  ** comm
17730 61 6e 64 2e 0a 20 20 2a 2f 0a 20 20 54 63 6c 5f  and..  */.  Tcl_
17740 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64  CreateObjCommand
17750 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65  (interp, "sqlite
17760 22 2c 20 28 54 63 6c 5f 4f 62 6a 43 6d 64 50 72  ", (Tcl_ObjCmdPr
17770 6f 63 2a 29 44 62 4d 61 69 6e 2c 20 30 2c 20 30  oc*)DbMain, 0, 0
17780 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74  );.#endif..  ret
17790 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 45 58  urn TCL_OK;.}.EX
177a0 54 45 52 4e 20 69 6e 74 20 54 63 6c 73 71 6c 69  TERN int Tclsqli
177b0 74 65 33 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74  te3_Init(Tcl_Int
177c0 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 20 72 65  erp *interp){ re
177d0 74 75 72 6e 20 53 71 6c 69 74 65 33 5f 49 6e 69  turn Sqlite3_Ini
177e0 74 28 69 6e 74 65 72 70 29 3b 20 7d 0a 45 58 54  t(interp); }.EXT
177f0 45 52 4e 20 69 6e 74 20 53 71 6c 69 74 65 33 5f  ERN int Sqlite3_
17800 55 6e 6c 6f 61 64 28 54 63 6c 5f 49 6e 74 65 72  Unload(Tcl_Inter
17810 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 66  p *interp, int f
17820 6c 61 67 73 29 7b 20 72 65 74 75 72 6e 20 54 43  lags){ return TC
17830 4c 5f 4f 4b 3b 20 7d 0a 45 58 54 45 52 4e 20 69  L_OK; }.EXTERN i
17840 6e 74 20 54 63 6c 73 71 6c 69 74 65 33 5f 55 6e  nt Tclsqlite3_Un
17850 6c 6f 61 64 28 54 63 6c 5f 49 6e 74 65 72 70 20  load(Tcl_Interp 
17860 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 66 6c 61  *interp, int fla
17870 67 73 29 7b 20 72 65 74 75 72 6e 20 54 43 4c 5f  gs){ return TCL_
17880 4f 4b 3b 20 7d 0a 0a 2f 2a 20 42 65 63 61 75 73  OK; }../* Becaus
17890 65 20 69 74 20 61 63 63 65 73 73 65 73 20 74 68  e it accesses th
178a0 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 61 6e  e file-system an
178b0 64 20 75 73 65 73 20 70 65 72 73 69 73 74 65 6e  d uses persisten
178c0 74 20 73 74 61 74 65 2c 20 53 51 4c 69 74 65 0a  t state, SQLite.
178d0 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6e 73 69 64  ** is not consid
178e0 65 72 65 64 20 61 70 70 72 6f 70 72 69 61 74 65  ered appropriate
178f0 20 66 6f 72 20 73 61 66 65 20 69 6e 74 65 72 70   for safe interp
17900 72 65 74 65 72 73 2e 20 20 48 65 6e 63 65 2c 20  reters.  Hence, 
17910 77 65 20 64 65 6c 69 62 65 72 61 74 65 6c 79 0a  we deliberately.
17920 2a 2a 20 6f 6d 69 74 20 74 68 65 20 5f 53 61 66  ** omit the _Saf
17930 65 49 6e 69 74 28 29 20 69 6e 74 65 72 66 61 63  eInit() interfac
17940 65 73 2e 0a 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  es..*/..#ifndef 
17950 53 51 4c 49 54 45 5f 33 5f 53 55 46 46 49 58 5f  SQLITE_3_SUFFIX_
17960 4f 4e 4c 59 0a 69 6e 74 20 53 71 6c 69 74 65 5f  ONLY.int Sqlite_
17970 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20  Init(Tcl_Interp 
17980 2a 69 6e 74 65 72 70 29 7b 20 72 65 74 75 72 6e  *interp){ return
17990 20 53 71 6c 69 74 65 33 5f 49 6e 69 74 28 69 6e   Sqlite3_Init(in
179a0 74 65 72 70 29 3b 20 7d 0a 69 6e 74 20 54 63 6c  terp); }.int Tcl
179b0 73 71 6c 69 74 65 5f 49 6e 69 74 28 54 63 6c 5f  sqlite_Init(Tcl_
179c0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b  Interp *interp){
179d0 20 72 65 74 75 72 6e 20 53 71 6c 69 74 65 33 5f   return Sqlite3_
179e0 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 20 7d 0a  Init(interp); }.
179f0 69 6e 74 20 53 71 6c 69 74 65 5f 55 6e 6c 6f 61  int Sqlite_Unloa
17a00 64 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  d(Tcl_Interp *in
17a10 74 65 72 70 2c 20 69 6e 74 20 66 6c 61 67 73 29  terp, int flags)
17a20 7b 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b  { return TCL_OK;
17a30 20 7d 0a 69 6e 74 20 54 63 6c 73 71 6c 69 74 65   }.int Tclsqlite
17a40 5f 55 6e 6c 6f 61 64 28 54 63 6c 5f 49 6e 74 65  _Unload(Tcl_Inte
17a50 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20  rp *interp, int 
17a60 66 6c 61 67 73 29 7b 20 72 65 74 75 72 6e 20 54  flags){ return T
17a70 43 4c 5f 4f 4b 3b 20 7d 0a 23 65 6e 64 69 66 0a  CL_OK; }.#endif.
17a80 0a 23 69 66 64 65 66 20 54 43 4c 53 48 0a 2f 2a  .#ifdef TCLSH./*
17a90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17aa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17ab0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17ac0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17ad0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20  ************.** 
17ae0 41 6c 6c 20 6f 66 20 74 68 65 20 63 6f 64 65 20  All of the code 
17af0 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20 69 73 20  that follows is 
17b00 75 73 65 64 20 74 6f 20 62 75 69 6c 64 20 73 74  used to build st
17b10 61 6e 64 61 6c 6f 6e 65 20 54 43 4c 20 69 6e 74  andalone TCL int
17b20 65 72 70 72 65 74 65 72 73 0a 2a 2a 20 74 68 61  erpreters.** tha
17b30 74 20 61 72 65 20 73 74 61 74 69 63 61 6c 6c 79  t are statically
17b40 20 6c 69 6e 6b 65 64 20 77 69 74 68 20 53 51 4c   linked with SQL
17b50 69 74 65 2e 20 20 45 6e 61 62 6c 65 20 74 68 65  ite.  Enable the
17b60 73 65 20 62 79 20 63 6f 6d 70 69 6c 69 6e 67 0a  se by compiling.
17b70 2a 2a 20 77 69 74 68 20 2d 44 54 43 4c 53 48 3d  ** with -DTCLSH=
17b80 6e 20 77 68 65 72 65 20 6e 20 63 61 6e 20 62 65  n where n can be
17b90 20 31 20 6f 72 20 32 2e 20 20 41 6e 20 6e 20 6f   1 or 2.  An n o
17ba0 66 20 31 20 67 65 6e 65 72 61 74 65 73 20 61 20  f 1 generates a 
17bb0 73 74 61 6e 64 61 72 64 0a 2a 2a 20 74 63 6c 73  standard.** tcls
17bc0 68 20 62 75 74 20 77 69 74 68 20 53 51 4c 69 74  h but with SQLit
17bd0 65 20 62 75 69 6c 74 20 69 6e 2e 20 20 41 6e 20  e built in.  An 
17be0 6e 20 6f 66 20 32 20 67 65 6e 65 72 61 74 65 73  n of 2 generates
17bf0 20 74 68 65 20 53 51 4c 69 74 65 20 73 70 61 63   the SQLite spac
17c00 65 0a 2a 2a 20 61 6e 61 6c 79 73 69 73 20 70 72  e.** analysis pr
17c10 6f 67 72 61 6d 2e 0a 2a 2f 0a 0a 23 69 66 20 64  ogram..*/..#if d
17c20 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45  efined(SQLITE_TE
17c30 53 54 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53  ST) || defined(S
17c40 51 4c 49 54 45 5f 54 43 4c 4d 44 35 29 0a 2f 2a  QLITE_TCLMD5)./*
17c50 0a 20 2a 20 54 68 69 73 20 63 6f 64 65 20 69 6d  . * This code im
17c60 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 4d 44 35  plements the MD5
17c70 20 6d 65 73 73 61 67 65 2d 64 69 67 65 73 74 20   message-digest 
17c80 61 6c 67 6f 72 69 74 68 6d 2e 0a 20 2a 20 54 68  algorithm.. * Th
17c90 65 20 61 6c 67 6f 72 69 74 68 6d 20 69 73 20 64  e algorithm is d
17ca0 75 65 20 74 6f 20 52 6f 6e 20 52 69 76 65 73 74  ue to Ron Rivest
17cb0 2e 20 20 54 68 69 73 20 63 6f 64 65 20 77 61 73  .  This code was
17cc0 0a 20 2a 20 77 72 69 74 74 65 6e 20 62 79 20 43  . * written by C
17cd0 6f 6c 69 6e 20 50 6c 75 6d 62 20 69 6e 20 31 39  olin Plumb in 19
17ce0 39 33 2c 20 6e 6f 20 63 6f 70 79 72 69 67 68 74  93, no copyright
17cf0 20 69 73 20 63 6c 61 69 6d 65 64 2e 0a 20 2a 20   is claimed.. * 
17d00 54 68 69 73 20 63 6f 64 65 20 69 73 20 69 6e 20  This code is in 
17d10 74 68 65 20 70 75 62 6c 69 63 20 64 6f 6d 61 69  the public domai
17d20 6e 3b 20 64 6f 20 77 69 74 68 20 69 74 20 77 68  n; do with it wh
17d30 61 74 20 79 6f 75 20 77 69 73 68 2e 0a 20 2a 0a  at you wish.. *.
17d40 20 2a 20 45 71 75 69 76 61 6c 65 6e 74 20 63 6f   * Equivalent co
17d50 64 65 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20  de is available 
17d60 66 72 6f 6d 20 52 53 41 20 44 61 74 61 20 53 65  from RSA Data Se
17d70 63 75 72 69 74 79 2c 20 49 6e 63 2e 0a 20 2a 20  curity, Inc.. * 
17d80 54 68 69 73 20 63 6f 64 65 20 68 61 73 20 62 65  This code has be
17d90 65 6e 20 74 65 73 74 65 64 20 61 67 61 69 6e 73  en tested agains
17da0 74 20 74 68 61 74 2c 20 61 6e 64 20 69 73 20 65  t that, and is e
17db0 71 75 69 76 61 6c 65 6e 74 2c 0a 20 2a 20 65 78  quivalent,. * ex
17dc0 63 65 70 74 20 74 68 61 74 20 79 6f 75 20 64 6f  cept that you do
17dd0 6e 27 74 20 6e 65 65 64 20 74 6f 20 69 6e 63 6c  n't need to incl
17de0 75 64 65 20 74 77 6f 20 70 61 67 65 73 20 6f 66  ude two pages of
17df0 20 6c 65 67 61 6c 65 73 65 0a 20 2a 20 77 69 74   legalese. * wit
17e00 68 20 65 76 65 72 79 20 63 6f 70 79 2e 0a 20 2a  h every copy.. *
17e10 0a 20 2a 20 54 6f 20 63 6f 6d 70 75 74 65 20 74  . * To compute t
17e20 68 65 20 6d 65 73 73 61 67 65 20 64 69 67 65 73  he message diges
17e30 74 20 6f 66 20 61 20 63 68 75 6e 6b 20 6f 66 20  t of a chunk of 
17e40 62 79 74 65 73 2c 20 64 65 63 6c 61 72 65 20 61  bytes, declare a
17e50 6e 0a 20 2a 20 4d 44 35 43 6f 6e 74 65 78 74 20  n. * MD5Context 
17e60 73 74 72 75 63 74 75 72 65 2c 20 70 61 73 73 20  structure, pass 
17e70 69 74 20 74 6f 20 4d 44 35 49 6e 69 74 2c 20 63  it to MD5Init, c
17e80 61 6c 6c 20 4d 44 35 55 70 64 61 74 65 20 61 73  all MD5Update as
17e90 0a 20 2a 20 6e 65 65 64 65 64 20 6f 6e 20 62 75  . * needed on bu
17ea0 66 66 65 72 73 20 66 75 6c 6c 20 6f 66 20 62 79  ffers full of by
17eb0 74 65 73 2c 20 61 6e 64 20 74 68 65 6e 20 63 61  tes, and then ca
17ec0 6c 6c 20 4d 44 35 46 69 6e 61 6c 2c 20 77 68 69  ll MD5Final, whi
17ed0 63 68 0a 20 2a 20 77 69 6c 6c 20 66 69 6c 6c 20  ch. * will fill 
17ee0 61 20 73 75 70 70 6c 69 65 64 20 31 36 2d 62 79  a supplied 16-by
17ef0 74 65 20 61 72 72 61 79 20 77 69 74 68 20 74 68  te array with th
17f00 65 20 64 69 67 65 73 74 2e 0a 20 2a 2f 0a 0a 2f  e digest.. */../
17f10 2a 0a 20 2a 20 49 66 20 63 6f 6d 70 69 6c 65 64  *. * If compiled
17f20 20 6f 6e 20 61 20 6d 61 63 68 69 6e 65 20 74 68   on a machine th
17f30 61 74 20 64 6f 65 73 6e 27 74 20 68 61 76 65 20  at doesn't have 
17f40 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72  a 32-bit integer
17f50 2c 0a 20 2a 20 79 6f 75 20 6a 75 73 74 20 73 65  ,. * you just se
17f60 74 20 22 75 69 6e 74 33 32 22 20 74 6f 20 74 68  t "uint32" to th
17f70 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 64 61  e appropriate da
17f80 74 61 74 79 70 65 20 66 6f 72 20 61 6e 0a 20 2a  tatype for an. *
17f90 20 75 6e 73 69 67 6e 65 64 20 33 32 2d 62 69 74   unsigned 32-bit
17fa0 20 69 6e 74 65 67 65 72 2e 20 20 46 6f 72 20 65   integer.  For e
17fb0 78 61 6d 70 6c 65 3a 0a 20 2a 0a 20 2a 20 20 20  xample:. *. *   
17fc0 20 20 20 20 63 63 20 2d 44 75 69 6e 74 33 32 3d      cc -Duint32=
17fd0 27 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 27 20  'unsigned long' 
17fe0 6d 64 35 2e 63 0a 20 2a 0a 20 2a 2f 0a 23 69 66  md5.c. *. */.#if
17ff0 6e 64 65 66 20 75 69 6e 74 33 32 0a 23 20 20 64  ndef uint32.#  d
18000 65 66 69 6e 65 20 75 69 6e 74 33 32 20 75 6e 73  efine uint32 uns
18010 69 67 6e 65 64 20 69 6e 74 0a 23 65 6e 64 69 66  igned int.#endif
18020 0a 0a 73 74 72 75 63 74 20 4d 44 35 43 6f 6e 74  ..struct MD5Cont
18030 65 78 74 20 7b 0a 20 20 69 6e 74 20 69 73 49 6e  ext {.  int isIn
18040 69 74 3b 0a 20 20 75 69 6e 74 33 32 20 62 75 66  it;.  uint32 buf
18050 5b 34 5d 3b 0a 20 20 75 69 6e 74 33 32 20 62 69  [4];.  uint32 bi
18060 74 73 5b 32 5d 3b 0a 20 20 75 6e 73 69 67 6e 65  ts[2];.  unsigne
18070 64 20 63 68 61 72 20 69 6e 5b 36 34 5d 3b 0a 7d  d char in[64];.}
18080 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  ;.typedef struct
18090 20 4d 44 35 43 6f 6e 74 65 78 74 20 4d 44 35 43   MD5Context MD5C
180a0 6f 6e 74 65 78 74 3b 0a 0a 2f 2a 0a 20 2a 20 4e  ontext;../*. * N
180b0 6f 74 65 3a 20 74 68 69 73 20 63 6f 64 65 20 69  ote: this code i
180c0 73 20 68 61 72 6d 6c 65 73 73 20 6f 6e 20 6c 69  s harmless on li
180d0 74 74 6c 65 2d 65 6e 64 69 61 6e 20 6d 61 63 68  ttle-endian mach
180e0 69 6e 65 73 2e 0a 20 2a 2f 0a 73 74 61 74 69 63  ines.. */.static
180f0 20 76 6f 69 64 20 62 79 74 65 52 65 76 65 72 73   void byteRevers
18100 65 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  e (unsigned char
18110 20 2a 62 75 66 2c 20 75 6e 73 69 67 6e 65 64 20   *buf, unsigned 
18120 6c 6f 6e 67 73 29 7b 0a 20 20 20 20 20 20 20 20  longs){.        
18130 75 69 6e 74 33 32 20 74 3b 0a 20 20 20 20 20 20  uint32 t;.      
18140 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 20 20 20    do {.         
18150 20 20 20 20 20 20 20 74 20 3d 20 28 75 69 6e 74         t = (uint
18160 33 32 29 28 28 75 6e 73 69 67 6e 65 64 29 62 75  32)((unsigned)bu
18170 66 5b 33 5d 3c 3c 38 20 7c 20 62 75 66 5b 32 5d  f[3]<<8 | buf[2]
18180 29 20 3c 3c 20 31 36 20 7c 0a 20 20 20 20 20 20  ) << 16 |.      
18190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
181a0 20 20 20 20 20 20 28 28 75 6e 73 69 67 6e 65 64        ((unsigned
181b0 29 62 75 66 5b 31 5d 3c 3c 38 20 7c 20 62 75 66  )buf[1]<<8 | buf
181c0 5b 30 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  [0]);.          
181d0 20 20 20 20 20 20 2a 28 75 69 6e 74 33 32 20 2a        *(uint32 *
181e0 29 62 75 66 20 3d 20 74 3b 0a 20 20 20 20 20 20  )buf = t;.      
181f0 20 20 20 20 20 20 20 20 20 20 62 75 66 20 2b 3d            buf +=
18200 20 34 3b 0a 20 20 20 20 20 20 20 20 7d 20 77 68   4;.        } wh
18210 69 6c 65 20 28 2d 2d 6c 6f 6e 67 73 29 3b 0a 7d  ile (--longs);.}
18220 0a 2f 2a 20 54 68 65 20 66 6f 75 72 20 63 6f 72  ./* The four cor
18230 65 20 66 75 6e 63 74 69 6f 6e 73 20 2d 20 46 31  e functions - F1
18240 20 69 73 20 6f 70 74 69 6d 69 7a 65 64 20 73 6f   is optimized so
18250 6d 65 77 68 61 74 20 2a 2f 0a 0a 2f 2a 20 23 64  mewhat */../* #d
18260 65 66 69 6e 65 20 46 31 28 78 2c 20 79 2c 20 7a  efine F1(x, y, z
18270 29 20 28 78 20 26 20 79 20 7c 20 7e 78 20 26 20  ) (x & y | ~x & 
18280 7a 29 20 2a 2f 0a 23 64 65 66 69 6e 65 20 46 31  z) */.#define F1
18290 28 78 2c 20 79 2c 20 7a 29 20 28 7a 20 5e 20 28  (x, y, z) (z ^ (
182a0 78 20 26 20 28 79 20 5e 20 7a 29 29 29 0a 23 64  x & (y ^ z))).#d
182b0 65 66 69 6e 65 20 46 32 28 78 2c 20 79 2c 20 7a  efine F2(x, y, z
182c0 29 20 46 31 28 7a 2c 20 78 2c 20 79 29 0a 23 64  ) F1(z, x, y).#d
182d0 65 66 69 6e 65 20 46 33 28 78 2c 20 79 2c 20 7a  efine F3(x, y, z
182e0 29 20 28 78 20 5e 20 79 20 5e 20 7a 29 0a 23 64  ) (x ^ y ^ z).#d
182f0 65 66 69 6e 65 20 46 34 28 78 2c 20 79 2c 20 7a  efine F4(x, y, z
18300 29 20 28 79 20 5e 20 28 78 20 7c 20 7e 7a 29 29  ) (y ^ (x | ~z))
18310 0a 0a 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65  ../* This is the
18320 20 63 65 6e 74 72 61 6c 20 73 74 65 70 20 69 6e   central step in
18330 20 74 68 65 20 4d 44 35 20 61 6c 67 6f 72 69 74   the MD5 algorit
18340 68 6d 2e 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d  hm. */.#define M
18350 44 35 53 54 45 50 28 66 2c 20 77 2c 20 78 2c 20  D5STEP(f, w, x, 
18360 79 2c 20 7a 2c 20 64 61 74 61 2c 20 73 29 20 5c  y, z, data, s) \
18370 0a 20 20 20 20 20 20 20 20 28 20 77 20 2b 3d 20  .        ( w += 
18380 66 28 78 2c 20 79 2c 20 7a 29 20 2b 20 64 61 74  f(x, y, z) + dat
18390 61 2c 20 20 77 20 3d 20 77 3c 3c 73 20 7c 20 77  a,  w = w<<s | w
183a0 3e 3e 28 33 32 2d 73 29 2c 20 20 77 20 2b 3d 20  >>(32-s),  w += 
183b0 78 20 29 0a 0a 2f 2a 0a 20 2a 20 54 68 65 20 63  x )../*. * The c
183c0 6f 72 65 20 6f 66 20 74 68 65 20 4d 44 35 20 61  ore of the MD5 a
183d0 6c 67 6f 72 69 74 68 6d 2c 20 74 68 69 73 20 61  lgorithm, this a
183e0 6c 74 65 72 73 20 61 6e 20 65 78 69 73 74 69 6e  lters an existin
183f0 67 20 4d 44 35 20 68 61 73 68 20 74 6f 0a 20 2a  g MD5 hash to. *
18400 20 72 65 66 6c 65 63 74 20 74 68 65 20 61 64 64   reflect the add
18410 69 74 69 6f 6e 20 6f 66 20 31 36 20 6c 6f 6e 67  ition of 16 long
18420 77 6f 72 64 73 20 6f 66 20 6e 65 77 20 64 61 74  words of new dat
18430 61 2e 20 20 4d 44 35 55 70 64 61 74 65 20 62 6c  a.  MD5Update bl
18440 6f 63 6b 73 0a 20 2a 20 74 68 65 20 64 61 74 61  ocks. * the data
18450 20 61 6e 64 20 63 6f 6e 76 65 72 74 73 20 62 79   and converts by
18460 74 65 73 20 69 6e 74 6f 20 6c 6f 6e 67 77 6f 72  tes into longwor
18470 64 73 20 66 6f 72 20 74 68 69 73 20 72 6f 75 74  ds for this rout
18480 69 6e 65 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20  ine.. */.static 
18490 76 6f 69 64 20 4d 44 35 54 72 61 6e 73 66 6f 72  void MD5Transfor
184a0 6d 28 75 69 6e 74 33 32 20 62 75 66 5b 34 5d 2c  m(uint32 buf[4],
184b0 20 63 6f 6e 73 74 20 75 69 6e 74 33 32 20 69 6e   const uint32 in
184c0 5b 31 36 5d 29 7b 0a 20 20 20 20 20 20 20 20 72  [16]){.        r
184d0 65 67 69 73 74 65 72 20 75 69 6e 74 33 32 20 61  egister uint32 a
184e0 2c 20 62 2c 20 63 2c 20 64 3b 0a 0a 20 20 20 20  , b, c, d;..    
184f0 20 20 20 20 61 20 3d 20 62 75 66 5b 30 5d 3b 0a      a = buf[0];.
18500 20 20 20 20 20 20 20 20 62 20 3d 20 62 75 66 5b          b = buf[
18510 31 5d 3b 0a 20 20 20 20 20 20 20 20 63 20 3d 20  1];.        c = 
18520 62 75 66 5b 32 5d 3b 0a 20 20 20 20 20 20 20 20  buf[2];.        
18530 64 20 3d 20 62 75 66 5b 33 5d 3b 0a 0a 20 20 20  d = buf[3];..   
18540 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 31 2c       MD5STEP(F1,
18550 20 61 2c 20 62 2c 20 63 2c 20 64 2c 20 69 6e 5b   a, b, c, d, in[
18560 20 30 5d 2b 30 78 64 37 36 61 61 34 37 38 2c 20   0]+0xd76aa478, 
18570 20 37 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35   7);.        MD5
18580 53 54 45 50 28 46 31 2c 20 64 2c 20 61 2c 20 62  STEP(F1, d, a, b
18590 2c 20 63 2c 20 69 6e 5b 20 31 5d 2b 30 78 65 38  , c, in[ 1]+0xe8
185a0 63 37 62 37 35 36 2c 20 31 32 29 3b 0a 20 20 20  c7b756, 12);.   
185b0 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 31 2c       MD5STEP(F1,
185c0 20 63 2c 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b   c, d, a, b, in[
185d0 20 32 5d 2b 30 78 32 34 32 30 37 30 64 62 2c 20   2]+0x242070db, 
185e0 31 37 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35  17);.        MD5
185f0 53 54 45 50 28 46 31 2c 20 62 2c 20 63 2c 20 64  STEP(F1, b, c, d
18600 2c 20 61 2c 20 69 6e 5b 20 33 5d 2b 30 78 63 31  , a, in[ 3]+0xc1
18610 62 64 63 65 65 65 2c 20 32 32 29 3b 0a 20 20 20  bdceee, 22);.   
18620 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 31 2c       MD5STEP(F1,
18630 20 61 2c 20 62 2c 20 63 2c 20 64 2c 20 69 6e 5b   a, b, c, d, in[
18640 20 34 5d 2b 30 78 66 35 37 63 30 66 61 66 2c 20   4]+0xf57c0faf, 
18650 20 37 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35   7);.        MD5
18660 53 54 45 50 28 46 31 2c 20 64 2c 20 61 2c 20 62  STEP(F1, d, a, b
18670 2c 20 63 2c 20 69 6e 5b 20 35 5d 2b 30 78 34 37  , c, in[ 5]+0x47
18680 38 37 63 36 32 61 2c 20 31 32 29 3b 0a 20 20 20  87c62a, 12);.   
18690 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 31 2c       MD5STEP(F1,
186a0 20 63 2c 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b   c, d, a, b, in[
186b0 20 36 5d 2b 30 78 61 38 33 30 34 36 31 33 2c 20   6]+0xa8304613, 
186c0 31 37 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35  17);.        MD5
186d0 53 54 45 50 28 46 31 2c 20 62 2c 20 63 2c 20 64  STEP(F1, b, c, d
186e0 2c 20 61 2c 20 69 6e 5b 20 37 5d 2b 30 78 66 64  , a, in[ 7]+0xfd
186f0 34 36 39 35 30 31 2c 20 32 32 29 3b 0a 20 20 20  469501, 22);.   
18700 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 31 2c       MD5STEP(F1,
18710 20 61 2c 20 62 2c 20 63 2c 20 64 2c 20 69 6e 5b   a, b, c, d, in[
18720 20 38 5d 2b 30 78 36 39 38 30 39 38 64 38 2c 20   8]+0x698098d8, 
18730 20 37 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35   7);.        MD5
18740 53 54 45 50 28 46 31 2c 20 64 2c 20 61 2c 20 62  STEP(F1, d, a, b
18750 2c 20 63 2c 20 69 6e 5b 20 39 5d 2b 30 78 38 62  , c, in[ 9]+0x8b
18760 34 34 66 37 61 66 2c 20 31 32 29 3b 0a 20 20 20  44f7af, 12);.   
18770 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 31 2c       MD5STEP(F1,
18780 20 63 2c 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b   c, d, a, b, in[
18790 31 30 5d 2b 30 78 66 66 66 66 35 62 62 31 2c 20  10]+0xffff5bb1, 
187a0 31 37 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35  17);.        MD5
187b0 53 54 45 50 28 46 31 2c 20 62 2c 20 63 2c 20 64  STEP(F1, b, c, d
187c0 2c 20 61 2c 20 69 6e 5b 31 31 5d 2b 30 78 38 39  , a, in[11]+0x89
187d0 35 63 64 37 62 65 2c 20 32 32 29 3b 0a 20 20 20  5cd7be, 22);.   
187e0 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 31 2c       MD5STEP(F1,
187f0 20 61 2c 20 62 2c 20 63 2c 20 64 2c 20 69 6e 5b   a, b, c, d, in[
18800 31 32 5d 2b 30 78 36 62 39 30 31 31 32 32 2c 20  12]+0x6b901122, 
18810 20 37 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35   7);.        MD5
18820 53 54 45 50 28 46 31 2c 20 64 2c 20 61 2c 20 62  STEP(F1, d, a, b
18830 2c 20 63 2c 20 69 6e 5b 31 33 5d 2b 30 78 66 64  , c, in[13]+0xfd
18840 39 38 37 31 39 33 2c 20 31 32 29 3b 0a 20 20 20  987193, 12);.   
18850 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 31 2c       MD5STEP(F1,
18860 20 63 2c 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b   c, d, a, b, in[
18870 31 34 5d 2b 30 78 61 36 37 39 34 33 38 65 2c 20  14]+0xa679438e, 
18880 31 37 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35  17);.        MD5
18890 53 54 45 50 28 46 31 2c 20 62 2c 20 63 2c 20 64  STEP(F1, b, c, d
188a0 2c 20 61 2c 20 69 6e 5b 31 35 5d 2b 30 78 34 39  , a, in[15]+0x49
188b0 62 34 30 38 32 31 2c 20 32 32 29 3b 0a 0a 20 20  b40821, 22);..  
188c0 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 32        MD5STEP(F2
188d0 2c 20 61 2c 20 62 2c 20 63 2c 20 64 2c 20 69 6e  , a, b, c, d, in
188e0 5b 20 31 5d 2b 30 78 66 36 31 65 32 35 36 32 2c  [ 1]+0xf61e2562,
188f0 20 20 35 29 3b 0a 20 20 20 20 20 20 20 20 4d 44    5);.        MD
18900 35 53 54 45 50 28 46 32 2c 20 64 2c 20 61 2c 20  5STEP(F2, d, a, 
18910 62 2c 20 63 2c 20 69 6e 5b 20 36 5d 2b 30 78 63  b, c, in[ 6]+0xc
18920 30 34 30 62 33 34 30 2c 20 20 39 29 3b 0a 20 20  040b340,  9);.  
18930 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 32        MD5STEP(F2
18940 2c 20 63 2c 20 64 2c 20 61 2c 20 62 2c 20 69 6e  , c, d, a, b, in
18950 5b 31 31 5d 2b 30 78 32 36 35 65 35 61 35 31 2c  [11]+0x265e5a51,
18960 20 31 34 29 3b 0a 20 20 20 20 20 20 20 20 4d 44   14);.        MD
18970 35 53 54 45 50 28 46 32 2c 20 62 2c 20 63 2c 20  5STEP(F2, b, c, 
18980 64 2c 20 61 2c 20 69 6e 5b 20 30 5d 2b 30 78 65  d, a, in[ 0]+0xe
18990 39 62 36 63 37 61 61 2c 20 32 30 29 3b 0a 20 20  9b6c7aa, 20);.  
189a0 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 32        MD5STEP(F2
189b0 2c 20 61 2c 20 62 2c 20 63 2c 20 64 2c 20 69 6e  , a, b, c, d, in
189c0 5b 20 35 5d 2b 30 78 64 36 32 66 31 30 35 64 2c  [ 5]+0xd62f105d,
189d0 20 20 35 29 3b 0a 20 20 20 20 20 20 20 20 4d 44    5);.        MD
189e0 35 53 54 45 50 28 46 32 2c 20 64 2c 20 61 2c 20  5STEP(F2, d, a, 
189f0 62 2c 20 63 2c 20 69 6e 5b 31 30 5d 2b 30 78 30  b, c, in[10]+0x0
18a00 32 34 34 31 34 35 33 2c 20 20 39 29 3b 0a 20 20  2441453,  9);.  
18a10 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 32        MD5STEP(F2
18a20 2c 20 63 2c 20 64 2c 20 61 2c 20 62 2c 20 69 6e  , c, d, a, b, in
18a30 5b 31 35 5d 2b 30 78 64 38 61 31 65 36 38 31 2c  [15]+0xd8a1e681,
18a40 20 31 34 29 3b 0a 20 20 20 20 20 20 20 20 4d 44   14);.        MD
18a50 35 53 54 45 50 28 46 32 2c 20 62 2c 20 63 2c 20  5STEP(F2, b, c, 
18a60 64 2c 20 61 2c 20 69 6e 5b 20 34 5d 2b 30 78 65  d, a, in[ 4]+0xe
18a70 37 64 33 66 62 63 38 2c 20 32 30 29 3b 0a 20 20  7d3fbc8, 20);.  
18a80 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 32        MD5STEP(F2
18a90 2c 20 61 2c 20 62 2c 20 63 2c 20 64 2c 20 69 6e  , a, b, c, d, in
18aa0 5b 20 39 5d 2b 30 78 32 31 65 31 63 64 65 36 2c  [ 9]+0x21e1cde6,
18ab0 20 20 35 29 3b 0a 20 20 20 20 20 20 20 20 4d 44    5);.        MD
18ac0 35 53 54 45 50 28 46 32 2c 20 64 2c 20 61 2c 20  5STEP(F2, d, a, 
18ad0 62 2c 20 63 2c 20 69 6e 5b 31 34 5d 2b 30 78 63  b, c, in[14]+0xc
18ae0 33 33 37 30 37 64 36 2c 20 20 39 29 3b 0a 20 20  33707d6,  9);.  
18af0 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 32        MD5STEP(F2
18b00 2c 20 63 2c 20 64 2c 20 61 2c 20 62 2c 20 69 6e  , c, d, a, b, in
18b10 5b 20 33 5d 2b 30 78 66 34 64 35 30 64 38 37 2c  [ 3]+0xf4d50d87,
18b20 20 31 34 29 3b 0a 20 20 20 20 20 20 20 20 4d 44   14);.        MD
18b30 35 53 54 45 50 28 46 32 2c 20 62 2c 20 63 2c 20  5STEP(F2, b, c, 
18b40 64 2c 20 61 2c 20 69 6e 5b 20 38 5d 2b 30 78 34  d, a, in[ 8]+0x4
18b50 35 35 61 31 34 65 64 2c 20 32 30 29 3b 0a 20 20  55a14ed, 20);.  
18b60 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 32        MD5STEP(F2
18b70 2c 20 61 2c 20 62 2c 20 63 2c 20 64 2c 20 69 6e  , a, b, c, d, in
18b80 5b 31 33 5d 2b 30 78 61 39 65 33 65 39 30 35 2c  [13]+0xa9e3e905,
18b90 20 20 35 29 3b 0a 20 20 20 20 20 20 20 20 4d 44    5);.        MD
18ba0 35 53 54 45 50 28 46 32 2c 20 64 2c 20 61 2c 20  5STEP(F2, d, a, 
18bb0 62 2c 20 63 2c 20 69 6e 5b 20 32 5d 2b 30 78 66  b, c, in[ 2]+0xf
18bc0 63 65 66 61 33 66 38 2c 20 20 39 29 3b 0a 20 20  cefa3f8,  9);.  
18bd0 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 32        MD5STEP(F2
18be0 2c 20 63 2c 20 64 2c 20 61 2c 20 62 2c 20 69 6e  , c, d, a, b, in
18bf0 5b 20 37 5d 2b 30 78 36 37 36 66 30 32 64 39 2c  [ 7]+0x676f02d9,
18c00 20 31 34 29 3b 0a 20 20 20 20 20 20 20 20 4d 44   14);.        MD
18c10 35 53 54 45 50 28 46 32 2c 20 62 2c 20 63 2c 20  5STEP(F2, b, c, 
18c20 64 2c 20 61 2c 20 69 6e 5b 31 32 5d 2b 30 78 38  d, a, in[12]+0x8
18c30 64 32 61 34 63 38 61 2c 20 32 30 29 3b 0a 0a 20  d2a4c8a, 20);.. 
18c40 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
18c50 33 2c 20 61 2c 20 62 2c 20 63 2c 20 64 2c 20 69  3, a, b, c, d, i
18c60 6e 5b 20 35 5d 2b 30 78 66 66 66 61 33 39 34 32  n[ 5]+0xfffa3942
18c70 2c 20 20 34 29 3b 0a 20 20 20 20 20 20 20 20 4d  ,  4);.        M
18c80 44 35 53 54 45 50 28 46 33 2c 20 64 2c 20 61 2c  D5STEP(F3, d, a,
18c90 20 62 2c 20 63 2c 20 69 6e 5b 20 38 5d 2b 30 78   b, c, in[ 8]+0x
18ca0 38 37 37 31 66 36 38 31 2c 20 31 31 29 3b 0a 20  8771f681, 11);. 
18cb0 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
18cc0 33 2c 20 63 2c 20 64 2c 20 61 2c 20 62 2c 20 69  3, c, d, a, b, i
18cd0 6e 5b 31 31 5d 2b 30 78 36 64 39 64 36 31 32 32  n[11]+0x6d9d6122
18ce0 2c 20 31 36 29 3b 0a 20 20 20 20 20 20 20 20 4d  , 16);.        M
18cf0 44 35 53 54 45 50 28 46 33 2c 20 62 2c 20 63 2c  D5STEP(F3, b, c,
18d00 20 64 2c 20 61 2c 20 69 6e 5b 31 34 5d 2b 30 78   d, a, in[14]+0x
18d10 66 64 65 35 33 38 30 63 2c 20 32 33 29 3b 0a 20  fde5380c, 23);. 
18d20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
18d30 33 2c 20 61 2c 20 62 2c 20 63 2c 20 64 2c 20 69  3, a, b, c, d, i
18d40 6e 5b 20 31 5d 2b 30 78 61 34 62 65 65 61 34 34  n[ 1]+0xa4beea44
18d50 2c 20 20 34 29 3b 0a 20 20 20 20 20 20 20 20 4d  ,  4);.        M
18d60 44 35 53 54 45 50 28 46 33 2c 20 64 2c 20 61 2c  D5STEP(F3, d, a,
18d70 20 62 2c 20 63 2c 20 69 6e 5b 20 34 5d 2b 30 78   b, c, in[ 4]+0x
18d80 34 62 64 65 63 66 61 39 2c 20 31 31 29 3b 0a 20  4bdecfa9, 11);. 
18d90 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
18da0 33 2c 20 63 2c 20 64 2c 20 61 2c 20 62 2c 20 69  3, c, d, a, b, i
18db0 6e 5b 20 37 5d 2b 30 78 66 36 62 62 34 62 36 30  n[ 7]+0xf6bb4b60
18dc0 2c 20 31 36 29 3b 0a 20 20 20 20 20 20 20 20 4d  , 16);.        M
18dd0 44 35 53 54 45 50 28 46 33 2c 20 62 2c 20 63 2c  D5STEP(F3, b, c,
18de0 20 64 2c 20 61 2c 20 69 6e 5b 31 30 5d 2b 30 78   d, a, in[10]+0x
18df0 62 65 62 66 62 63 37 30 2c 20 32 33 29 3b 0a 20  bebfbc70, 23);. 
18e00 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
18e10 33 2c 20 61 2c 20 62 2c 20 63 2c 20 64 2c 20 69  3, a, b, c, d, i
18e20 6e 5b 31 33 5d 2b 30 78 32 38 39 62 37 65 63 36  n[13]+0x289b7ec6
18e30 2c 20 20 34 29 3b 0a 20 20 20 20 20 20 20 20 4d  ,  4);.        M
18e40 44 35 53 54 45 50 28 46 33 2c 20 64 2c 20 61 2c  D5STEP(F3, d, a,
18e50 20 62 2c 20 63 2c 20 69 6e 5b 20 30 5d 2b 30 78   b, c, in[ 0]+0x
18e60 65 61 61 31 32 37 66 61 2c 20 31 31 29 3b 0a 20  eaa127fa, 11);. 
18e70 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
18e80 33 2c 20 63 2c 20 64 2c 20 61 2c 20 62 2c 20 69  3, c, d, a, b, i
18e90 6e 5b 20 33 5d 2b 30 78 64 34 65 66 33 30 38 35  n[ 3]+0xd4ef3085
18ea0 2c 20 31 36 29 3b 0a 20 20 20 20 20 20 20 20 4d  , 16);.        M
18eb0 44 35 53 54 45 50 28 46 33 2c 20 62 2c 20 63 2c  D5STEP(F3, b, c,
18ec0 20 64 2c 20 61 2c 20 69 6e 5b 20 36 5d 2b 30 78   d, a, in[ 6]+0x
18ed0 30 34 38 38 31 64 30 35 2c 20 32 33 29 3b 0a 20  04881d05, 23);. 
18ee0 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
18ef0 33 2c 20 61 2c 20 62 2c 20 63 2c 20 64 2c 20 69  3, a, b, c, d, i
18f00 6e 5b 20 39 5d 2b 30 78 64 39 64 34 64 30 33 39  n[ 9]+0xd9d4d039
18f10 2c 20 20 34 29 3b 0a 20 20 20 20 20 20 20 20 4d  ,  4);.        M
18f20 44 35 53 54 45 50 28 46 33 2c 20 64 2c 20 61 2c  D5STEP(F3, d, a,
18f30 20 62 2c 20 63 2c 20 69 6e 5b 31 32 5d 2b 30 78   b, c, in[12]+0x
18f40 65 36 64 62 39 39 65 35 2c 20 31 31 29 3b 0a 20  e6db99e5, 11);. 
18f50 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
18f60 33 2c 20 63 2c 20 64 2c 20 61 2c 20 62 2c 20 69  3, c, d, a, b, i
18f70 6e 5b 31 35 5d 2b 30 78 31 66 61 32 37 63 66 38  n[15]+0x1fa27cf8
18f80 2c 20 31 36 29 3b 0a 20 20 20 20 20 20 20 20 4d  , 16);.        M
18f90 44 35 53 54 45 50 28 46 33 2c 20 62 2c 20 63 2c  D5STEP(F3, b, c,
18fa0 20 64 2c 20 61 2c 20 69 6e 5b 20 32 5d 2b 30 78   d, a, in[ 2]+0x
18fb0 63 34 61 63 35 36 36 35 2c 20 32 33 29 3b 0a 0a  c4ac5665, 23);..
18fc0 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28          MD5STEP(
18fd0 46 34 2c 20 61 2c 20 62 2c 20 63 2c 20 64 2c 20  F4, a, b, c, d, 
18fe0 69 6e 5b 20 30 5d 2b 30 78 66 34 32 39 32 32 34  in[ 0]+0xf429224
18ff0 34 2c 20 20 36 29 3b 0a 20 20 20 20 20 20 20 20  4,  6);.        
19000 4d 44 35 53 54 45 50 28 46 34 2c 20 64 2c 20 61  MD5STEP(F4, d, a
19010 2c 20 62 2c 20 63 2c 20 69 6e 5b 20 37 5d 2b 30  , b, c, in[ 7]+0
19020 78 34 33 32 61 66 66 39 37 2c 20 31 30 29 3b 0a  x432aff97, 10);.
19030 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28          MD5STEP(
19040 46 34 2c 20 63 2c 20 64 2c 20 61 2c 20 62 2c 20  F4, c, d, a, b, 
19050 69 6e 5b 31 34 5d 2b 30 78 61 62 39 34 32 33 61  in[14]+0xab9423a
19060 37 2c 20 31 35 29 3b 0a 20 20 20 20 20 20 20 20  7, 15);.        
19070 4d 44 35 53 54 45 50 28 46 34 2c 20 62 2c 20 63  MD5STEP(F4, b, c
19080 2c 20 64 2c 20 61 2c 20 69 6e 5b 20 35 5d 2b 30  , d, a, in[ 5]+0
19090 78 66 63 39 33 61 30 33 39 2c 20 32 31 29 3b 0a  xfc93a039, 21);.
190a0 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28          MD5STEP(
190b0 46 34 2c 20 61 2c 20 62 2c 20 63 2c 20 64 2c 20  F4, a, b, c, d, 
190c0 69 6e 5b 31 32 5d 2b 30 78 36 35 35 62 35 39 63  in[12]+0x655b59c
190d0 33 2c 20 20 36 29 3b 0a 20 20 20 20 20 20 20 20  3,  6);.        
190e0 4d 44 35 53 54 45 50 28 46 34 2c 20 64 2c 20 61  MD5STEP(F4, d, a
190f0 2c 20 62 2c 20 63 2c 20 69 6e 5b 20 33 5d 2b 30  , b, c, in[ 3]+0
19100 78 38 66 30 63 63 63 39 32 2c 20 31 30 29 3b 0a  x8f0ccc92, 10);.
19110 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28          MD5STEP(
19120 46 34 2c 20 63 2c 20 64 2c 20 61 2c 20 62 2c 20  F4, c, d, a, b, 
19130 69 6e 5b 31 30 5d 2b 30 78 66 66 65 66 66 34 37  in[10]+0xffeff47
19140 64 2c 20 31 35 29 3b 0a 20 20 20 20 20 20 20 20  d, 15);.        
19150 4d 44 35 53 54 45 50 28 46 34 2c 20 62 2c 20 63  MD5STEP(F4, b, c
19160 2c 20 64 2c 20 61 2c 20 69 6e 5b 20 31 5d 2b 30  , d, a, in[ 1]+0
19170 78 38 35 38 34 35 64 64 31 2c 20 32 31 29 3b 0a  x85845dd1, 21);.
19180 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28          MD5STEP(
19190 46 34 2c 20 61 2c 20 62 2c 20 63 2c 20 64 2c 20  F4, a, b, c, d, 
191a0 69 6e 5b 20 38 5d 2b 30 78 36 66 61 38 37 65 34  in[ 8]+0x6fa87e4
191b0 66 2c 20 20 36 29 3b 0a 20 20 20 20 20 20 20 20  f,  6);.        
191c0 4d 44 35 53 54 45 50 28 46 34 2c 20 64 2c 20 61  MD5STEP(F4, d, a
191d0 2c 20 62 2c 20 63 2c 20 69 6e 5b 31 35 5d 2b 30  , b, c, in[15]+0
191e0 78 66 65 32 63 65 36 65 30 2c 20 31 30 29 3b 0a  xfe2ce6e0, 10);.
191f0 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28          MD5STEP(
19200 46 34 2c 20 63 2c 20 64 2c 20 61 2c 20 62 2c 20  F4, c, d, a, b, 
19210 69 6e 5b 20 36 5d 2b 30 78 61 33 30 31 34 33 31  in[ 6]+0xa301431
19220 34 2c 20 31 35 29 3b 0a 20 20 20 20 20 20 20 20  4, 15);.        
19230 4d 44 35 53 54 45 50 28 46 34 2c 20 62 2c 20 63  MD5STEP(F4, b, c
19240 2c 20 64 2c 20 61 2c 20 69 6e 5b 31 33 5d 2b 30  , d, a, in[13]+0
19250 78 34 65 30 38 31 31 61 31 2c 20 32 31 29 3b 0a  x4e0811a1, 21);.
19260 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28          MD5STEP(
19270 46 34 2c 20 61 2c 20 62 2c 20 63 2c 20 64 2c 20  F4, a, b, c, d, 
19280 69 6e 5b 20 34 5d 2b 30 78 66 37 35 33 37 65 38  in[ 4]+0xf7537e8
19290 32 2c 20 20 36 29 3b 0a 20 20 20 20 20 20 20 20  2,  6);.        
192a0 4d 44 35 53 54 45 50 28 46 34 2c 20 64 2c 20 61  MD5STEP(F4, d, a
192b0 2c 20 62 2c 20 63 2c 20 69 6e 5b 31 31 5d 2b 30  , b, c, in[11]+0
192c0 78 62 64 33 61 66 32 33 35 2c 20 31 30 29 3b 0a  xbd3af235, 10);.
192d0 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28          MD5STEP(
192e0 46 34 2c 20 63 2c 20 64 2c 20 61 2c 20 62 2c 20  F4, c, d, a, b, 
192f0 69 6e 5b 20 32 5d 2b 30 78 32 61 64 37 64 32 62  in[ 2]+0x2ad7d2b
19300 62 2c 20 31 35 29 3b 0a 20 20 20 20 20 20 20 20  b, 15);.        
19310 4d 44 35 53 54 45 50 28 46 34 2c 20 62 2c 20 63  MD5STEP(F4, b, c
19320 2c 20 64 2c 20 61 2c 20 69 6e 5b 20 39 5d 2b 30  , d, a, in[ 9]+0
19330 78 65 62 38 36 64 33 39 31 2c 20 32 31 29 3b 0a  xeb86d391, 21);.
19340 0a 20 20 20 20 20 20 20 20 62 75 66 5b 30 5d 20  .        buf[0] 
19350 2b 3d 20 61 3b 0a 20 20 20 20 20 20 20 20 62 75  += a;.        bu
19360 66 5b 31 5d 20 2b 3d 20 62 3b 0a 20 20 20 20 20  f[1] += b;.     
19370 20 20 20 62 75 66 5b 32 5d 20 2b 3d 20 63 3b 0a     buf[2] += c;.
19380 20 20 20 20 20 20 20 20 62 75 66 5b 33 5d 20 2b          buf[3] +
19390 3d 20 64 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 74  = d;.}../*. * St
193a0 61 72 74 20 4d 44 35 20 61 63 63 75 6d 75 6c 61  art MD5 accumula
193b0 74 69 6f 6e 2e 20 20 53 65 74 20 62 69 74 20 63  tion.  Set bit c
193c0 6f 75 6e 74 20 74 6f 20 30 20 61 6e 64 20 62 75  ount to 0 and bu
193d0 66 66 65 72 20 74 6f 20 6d 79 73 74 65 72 69 6f  ffer to mysterio
193e0 75 73 0a 20 2a 20 69 6e 69 74 69 61 6c 69 7a 61  us. * initializa
193f0 74 69 6f 6e 20 63 6f 6e 73 74 61 6e 74 73 2e 0a  tion constants..
19400 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20   */.static void 
19410 4d 44 35 49 6e 69 74 28 4d 44 35 43 6f 6e 74 65  MD5Init(MD5Conte
19420 78 74 20 2a 63 74 78 29 7b 0a 20 20 20 20 20 20  xt *ctx){.      
19430 20 20 63 74 78 2d 3e 69 73 49 6e 69 74 20 3d 20    ctx->isInit = 
19440 31 3b 0a 20 20 20 20 20 20 20 20 63 74 78 2d 3e  1;.        ctx->
19450 62 75 66 5b 30 5d 20 3d 20 30 78 36 37 34 35 32  buf[0] = 0x67452
19460 33 30 31 3b 0a 20 20 20 20 20 20 20 20 63 74 78  301;.        ctx
19470 2d 3e 62 75 66 5b 31 5d 20 3d 20 30 78 65 66 63  ->buf[1] = 0xefc
19480 64 61 62 38 39 3b 0a 20 20 20 20 20 20 20 20 63  dab89;.        c
19490 74 78 2d 3e 62 75 66 5b 32 5d 20 3d 20 30 78 39  tx->buf[2] = 0x9
194a0 38 62 61 64 63 66 65 3b 0a 20 20 20 20 20 20 20  8badcfe;.       
194b0 20 63 74 78 2d 3e 62 75 66 5b 33 5d 20 3d 20 30   ctx->buf[3] = 0
194c0 78 31 30 33 32 35 34 37 36 3b 0a 20 20 20 20 20  x10325476;.     
194d0 20 20 20 63 74 78 2d 3e 62 69 74 73 5b 30 5d 20     ctx->bits[0] 
194e0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 63 74 78  = 0;.        ctx
194f0 2d 3e 62 69 74 73 5b 31 5d 20 3d 20 30 3b 0a 7d  ->bits[1] = 0;.}
19500 0a 0a 2f 2a 0a 20 2a 20 55 70 64 61 74 65 20 63  ../*. * Update c
19510 6f 6e 74 65 78 74 20 74 6f 20 72 65 66 6c 65 63  ontext to reflec
19520 74 20 74 68 65 20 63 6f 6e 63 61 74 65 6e 61 74  t the concatenat
19530 69 6f 6e 20 6f 66 20 61 6e 6f 74 68 65 72 20 62  ion of another b
19540 75 66 66 65 72 20 66 75 6c 6c 0a 20 2a 20 6f 66  uffer full. * of
19550 20 62 79 74 65 73 2e 0a 20 2a 2f 0a 73 74 61 74   bytes.. */.stat
19560 69 63 20 0a 76 6f 69 64 20 4d 44 35 55 70 64 61  ic .void MD5Upda
19570 74 65 28 4d 44 35 43 6f 6e 74 65 78 74 20 2a 63  te(MD5Context *c
19580 74 78 2c 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  tx, const unsign
19590 65 64 20 63 68 61 72 20 2a 62 75 66 2c 20 75 6e  ed char *buf, un
195a0 73 69 67 6e 65 64 20 69 6e 74 20 6c 65 6e 29 7b  signed int len){
195b0 0a 20 20 20 20 20 20 20 20 75 69 6e 74 33 32 20  .        uint32 
195c0 74 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 55  t;..        /* U
195d0 70 64 61 74 65 20 62 69 74 63 6f 75 6e 74 20 2a  pdate bitcount *
195e0 2f 0a 0a 20 20 20 20 20 20 20 20 74 20 3d 20 63  /..        t = c
195f0 74 78 2d 3e 62 69 74 73 5b 30 5d 3b 0a 20 20 20  tx->bits[0];.   
19600 20 20 20 20 20 69 66 20 28 28 63 74 78 2d 3e 62       if ((ctx->b
19610 69 74 73 5b 30 5d 20 3d 20 74 20 2b 20 28 28 75  its[0] = t + ((u
19620 69 6e 74 33 32 29 6c 65 6e 20 3c 3c 20 33 29 29  int32)len << 3))
19630 20 3c 20 74 29 0a 20 20 20 20 20 20 20 20 20 20   < t).          
19640 20 20 20 20 20 20 63 74 78 2d 3e 62 69 74 73 5b        ctx->bits[
19650 31 5d 2b 2b 3b 20 2f 2a 20 43 61 72 72 79 20 66  1]++; /* Carry f
19660 72 6f 6d 20 6c 6f 77 20 74 6f 20 68 69 67 68 20  rom low to high 
19670 2a 2f 0a 20 20 20 20 20 20 20 20 63 74 78 2d 3e  */.        ctx->
19680 62 69 74 73 5b 31 5d 20 2b 3d 20 6c 65 6e 20 3e  bits[1] += len >
19690 3e 20 32 39 3b 0a 0a 20 20 20 20 20 20 20 20 74  > 29;..        t
196a0 20 3d 20 28 74 20 3e 3e 20 33 29 20 26 20 30 78   = (t >> 3) & 0x
196b0 33 66 3b 20 20 20 20 2f 2a 20 42 79 74 65 73 20  3f;    /* Bytes 
196c0 61 6c 72 65 61 64 79 20 69 6e 20 73 68 73 49 6e  already in shsIn
196d0 66 6f 2d 3e 64 61 74 61 20 2a 2f 0a 0a 20 20 20  fo->data */..   
196e0 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 61       /* Handle a
196f0 6e 79 20 6c 65 61 64 69 6e 67 20 6f 64 64 2d 73  ny leading odd-s
19700 69 7a 65 64 20 63 68 75 6e 6b 73 20 2a 2f 0a 0a  ized chunks */..
19710 20 20 20 20 20 20 20 20 69 66 20 28 20 74 20 29          if ( t )
19720 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
19730 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72     unsigned char
19740 20 2a 70 20 3d 20 28 75 6e 73 69 67 6e 65 64 20   *p = (unsigned 
19750 63 68 61 72 20 2a 29 63 74 78 2d 3e 69 6e 20 2b  char *)ctx->in +
19760 20 74 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20   t;..           
19770 20 20 20 20 20 74 20 3d 20 36 34 2d 74 3b 0a 20       t = 64-t;. 
19780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
19790 66 20 28 6c 65 6e 20 3c 20 74 29 20 7b 0a 20 20  f (len < t) {.  
197a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
197b0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 2c 20        memcpy(p, 
197c0 62 75 66 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 20  buf, len);.     
197d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
197e0 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20     return;.     
197f0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
19800 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d               mem
19810 63 70 79 28 70 2c 20 62 75 66 2c 20 74 29 3b 0a  cpy(p, buf, t);.
19820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19830 62 79 74 65 52 65 76 65 72 73 65 28 63 74 78 2d  byteReverse(ctx-
19840 3e 69 6e 2c 20 31 36 29 3b 0a 20 20 20 20 20 20  >in, 16);.      
19850 20 20 20 20 20 20 20 20 20 20 4d 44 35 54 72 61            MD5Tra
19860 6e 73 66 6f 72 6d 28 63 74 78 2d 3e 62 75 66 2c  nsform(ctx->buf,
19870 20 28 75 69 6e 74 33 32 20 2a 29 63 74 78 2d 3e   (uint32 *)ctx->
19880 69 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  in);.           
19890 20 20 20 20 20 62 75 66 20 2b 3d 20 74 3b 0a 20       buf += t;. 
198a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c                 l
198b0 65 6e 20 2d 3d 20 74 3b 0a 20 20 20 20 20 20 20  en -= t;.       
198c0 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 50   }..        /* P
198d0 72 6f 63 65 73 73 20 64 61 74 61 20 69 6e 20 36  rocess data in 6
198e0 34 2d 62 79 74 65 20 63 68 75 6e 6b 73 20 2a 2f  4-byte chunks */
198f0 0a 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 20  ..        while 
19900 28 6c 65 6e 20 3e 3d 20 36 34 29 20 7b 0a 20 20  (len >= 64) {.  
19910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 65                me
19920 6d 63 70 79 28 63 74 78 2d 3e 69 6e 2c 20 62 75  mcpy(ctx->in, bu
19930 66 2c 20 36 34 29 3b 0a 20 20 20 20 20 20 20 20  f, 64);.        
19940 20 20 20 20 20 20 20 20 62 79 74 65 52 65 76 65          byteReve
19950 72 73 65 28 63 74 78 2d 3e 69 6e 2c 20 31 36 29  rse(ctx->in, 16)
19960 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
19970 20 20 4d 44 35 54 72 61 6e 73 66 6f 72 6d 28 63    MD5Transform(c
19980 74 78 2d 3e 62 75 66 2c 20 28 75 69 6e 74 33 32  tx->buf, (uint32
19990 20 2a 29 63 74 78 2d 3e 69 6e 29 3b 0a 20 20 20   *)ctx->in);.   
199a0 20 20 20 20 20 20 20 20 20 20 20 20 20 62 75 66               buf
199b0 20 2b 3d 20 36 34 3b 0a 20 20 20 20 20 20 20 20   += 64;.        
199c0 20 20 20 20 20 20 20 20 6c 65 6e 20 2d 3d 20 36          len -= 6
199d0 34 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  4;.        }..  
199e0 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20        /* Handle 
199f0 61 6e 79 20 72 65 6d 61 69 6e 69 6e 67 20 62 79  any remaining by
19a00 74 65 73 20 6f 66 20 64 61 74 61 2e 20 2a 2f 0a  tes of data. */.
19a10 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
19a20 63 74 78 2d 3e 69 6e 2c 20 62 75 66 2c 20 6c 65  ctx->in, buf, le
19a30 6e 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 46 69 6e  n);.}../*. * Fin
19a40 61 6c 20 77 72 61 70 75 70 20 2d 20 70 61 64 20  al wrapup - pad 
19a50 74 6f 20 36 34 2d 62 79 74 65 20 62 6f 75 6e 64  to 64-byte bound
19a60 61 72 79 20 77 69 74 68 20 74 68 65 20 62 69 74  ary with the bit
19a70 20 70 61 74 74 65 72 6e 20 0a 20 2a 20 31 20 30   pattern . * 1 0
19a80 2a 20 28 36 34 2d 62 69 74 20 63 6f 75 6e 74 20  * (64-bit count 
19a90 6f 66 20 62 69 74 73 20 70 72 6f 63 65 73 73 65  of bits processe
19aa0 64 2c 20 4d 53 42 2d 66 69 72 73 74 29 0a 20 2a  d, MSB-first). *
19ab0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 4d 44  /.static void MD
19ac0 35 46 69 6e 61 6c 28 75 6e 73 69 67 6e 65 64 20  5Final(unsigned 
19ad0 63 68 61 72 20 64 69 67 65 73 74 5b 31 36 5d 2c  char digest[16],
19ae0 20 4d 44 35 43 6f 6e 74 65 78 74 20 2a 63 74 78   MD5Context *ctx
19af0 29 7b 0a 20 20 20 20 20 20 20 20 75 6e 73 69 67  ){.        unsig
19b00 6e 65 64 20 63 6f 75 6e 74 3b 0a 20 20 20 20 20  ned count;.     
19b10 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72     unsigned char
19b20 20 2a 70 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a   *p;..        /*
19b30 20 43 6f 6d 70 75 74 65 20 6e 75 6d 62 65 72 20   Compute number 
19b40 6f 66 20 62 79 74 65 73 20 6d 6f 64 20 36 34 20  of bytes mod 64 
19b50 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f 75 6e 74  */.        count
19b60 20 3d 20 28 63 74 78 2d 3e 62 69 74 73 5b 30 5d   = (ctx->bits[0]
19b70 20 3e 3e 20 33 29 20 26 20 30 78 33 46 3b 0a 0a   >> 3) & 0x3F;..
19b80 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74          /* Set t
19b90 68 65 20 66 69 72 73 74 20 63 68 61 72 20 6f 66  he first char of
19ba0 20 70 61 64 64 69 6e 67 20 74 6f 20 30 78 38 30   padding to 0x80
19bb0 2e 20 20 54 68 69 73 20 69 73 20 73 61 66 65 20  .  This is safe 
19bc0 73 69 6e 63 65 20 74 68 65 72 65 20 69 73 0a 20  since there is. 
19bd0 20 20 20 20 20 20 20 20 20 20 61 6c 77 61 79 73            always
19be0 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 62 79   at least one by
19bf0 74 65 20 66 72 65 65 20 2a 2f 0a 20 20 20 20 20  te free */.     
19c00 20 20 20 70 20 3d 20 63 74 78 2d 3e 69 6e 20 2b     p = ctx->in +
19c10 20 63 6f 75 6e 74 3b 0a 20 20 20 20 20 20 20 20   count;.        
19c20 2a 70 2b 2b 20 3d 20 30 78 38 30 3b 0a 0a 20 20  *p++ = 0x80;..  
19c30 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f        /* Bytes o
19c40 66 20 70 61 64 64 69 6e 67 20 6e 65 65 64 65 64  f padding needed
19c50 20 74 6f 20 6d 61 6b 65 20 36 34 20 62 79 74 65   to make 64 byte
19c60 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f 75  s */.        cou
19c70 6e 74 20 3d 20 36 34 20 2d 20 31 20 2d 20 63 6f  nt = 64 - 1 - co
19c80 75 6e 74 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a  unt;..        /*
19c90 20 50 61 64 20 6f 75 74 20 74 6f 20 35 36 20 6d   Pad out to 56 m
19ca0 6f 64 20 36 34 20 2a 2f 0a 20 20 20 20 20 20 20  od 64 */.       
19cb0 20 69 66 20 28 63 6f 75 6e 74 20 3c 20 38 29 20   if (count < 8) 
19cc0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
19cd0 20 20 2f 2a 20 54 77 6f 20 6c 6f 74 73 20 6f 66    /* Two lots of
19ce0 20 70 61 64 64 69 6e 67 3a 20 20 50 61 64 20 74   padding:  Pad t
19cf0 68 65 20 66 69 72 73 74 20 62 6c 6f 63 6b 20 74  he first block t
19d00 6f 20 36 34 20 62 79 74 65 73 20 2a 2f 0a 20 20  o 64 bytes */.  
19d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 65                me
19d20 6d 73 65 74 28 70 2c 20 30 2c 20 63 6f 75 6e 74  mset(p, 0, count
19d30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
19d40 20 20 20 62 79 74 65 52 65 76 65 72 73 65 28 63     byteReverse(c
19d50 74 78 2d 3e 69 6e 2c 20 31 36 29 3b 0a 20 20 20  tx->in, 16);.   
19d60 20 20 20 20 20 20 20 20 20 20 20 20 20 4d 44 35               MD5
19d70 54 72 61 6e 73 66 6f 72 6d 28 63 74 78 2d 3e 62  Transform(ctx->b
19d80 75 66 2c 20 28 75 69 6e 74 33 32 20 2a 29 63 74  uf, (uint32 *)ct
19d90 78 2d 3e 69 6e 29 3b 0a 0a 20 20 20 20 20 20 20  x->in);..       
19da0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 77 20           /* Now 
19db0 66 69 6c 6c 20 74 68 65 20 6e 65 78 74 20 62 6c  fill the next bl
19dc0 6f 63 6b 20 77 69 74 68 20 35 36 20 62 79 74 65  ock with 56 byte
19dd0 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  s */.           
19de0 20 20 20 20 20 6d 65 6d 73 65 74 28 63 74 78 2d       memset(ctx-
19df0 3e 69 6e 2c 20 30 2c 20 35 36 29 3b 0a 20 20 20  >in, 0, 56);.   
19e00 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20       } else {.  
19e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
19e20 20 50 61 64 20 62 6c 6f 63 6b 20 74 6f 20 35 36   Pad block to 56
19e30 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 20 20   bytes */.      
19e40 20 20 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74            memset
19e50 28 70 2c 20 30 2c 20 63 6f 75 6e 74 2d 38 29 3b  (p, 0, count-8);
19e60 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
19e70 20 20 20 62 79 74 65 52 65 76 65 72 73 65 28 63     byteReverse(c
19e80 74 78 2d 3e 69 6e 2c 20 31 34 29 3b 0a 0a 20 20  tx->in, 14);..  
19e90 20 20 20 20 20 20 2f 2a 20 41 70 70 65 6e 64 20        /* Append 
19ea0 6c 65 6e 67 74 68 20 69 6e 20 62 69 74 73 20 61  length in bits a
19eb0 6e 64 20 74 72 61 6e 73 66 6f 72 6d 20 2a 2f 0a  nd transform */.
19ec0 20 20 20 20 20 20 20 20 28 28 75 69 6e 74 33 32          ((uint32
19ed0 20 2a 29 63 74 78 2d 3e 69 6e 29 5b 20 31 34 20   *)ctx->in)[ 14 
19ee0 5d 20 3d 20 63 74 78 2d 3e 62 69 74 73 5b 30 5d  ] = ctx->bits[0]
19ef0 3b 0a 20 20 20 20 20 20 20 20 28 28 75 69 6e 74  ;.        ((uint
19f00 33 32 20 2a 29 63 74 78 2d 3e 69 6e 29 5b 20 31  32 *)ctx->in)[ 1
19f10 35 20 5d 20 3d 20 63 74 78 2d 3e 62 69 74 73 5b  5 ] = ctx->bits[
19f20 31 5d 3b 0a 0a 20 20 20 20 20 20 20 20 4d 44 35  1];..        MD5
19f30 54 72 61 6e 73 66 6f 72 6d 28 63 74 78 2d 3e 62  Transform(ctx->b
19f40 75 66 2c 20 28 75 69 6e 74 33 32 20 2a 29 63 74  uf, (uint32 *)ct
19f50 78 2d 3e 69 6e 29 3b 0a 20 20 20 20 20 20 20 20  x->in);.        
19f60 62 79 74 65 52 65 76 65 72 73 65 28 28 75 6e 73  byteReverse((uns
19f70 69 67 6e 65 64 20 63 68 61 72 20 2a 29 63 74 78  igned char *)ctx
19f80 2d 3e 62 75 66 2c 20 34 29 3b 0a 20 20 20 20 20  ->buf, 4);.     
19f90 20 20 20 6d 65 6d 63 70 79 28 64 69 67 65 73 74     memcpy(digest
19fa0 2c 20 63 74 78 2d 3e 62 75 66 2c 20 31 36 29 3b  , ctx->buf, 16);
19fb0 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28  .        memset(
19fc0 63 74 78 2c 20 30 2c 20 73 69 7a 65 6f 66 28 63  ctx, 0, sizeof(c
19fd0 74 78 29 29 3b 20 20 20 20 2f 2a 20 49 6e 20 63  tx));    /* In c
19fe0 61 73 65 20 69 74 20 69 73 20 73 65 6e 73 69 74  ase it is sensit
19ff0 69 76 65 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ive */.}../*.** 
1a000 43 6f 6e 76 65 72 74 20 61 20 31 32 38 2d 62 69  Convert a 128-bi
1a010 74 20 4d 44 35 20 64 69 67 65 73 74 20 69 6e 74  t MD5 digest int
1a020 6f 20 61 20 33 32 2d 64 69 67 69 74 20 62 61 73  o a 32-digit bas
1a030 65 2d 31 36 20 6e 75 6d 62 65 72 2e 0a 2a 2f 0a  e-16 number..*/.
1a040 73 74 61 74 69 63 20 76 6f 69 64 20 4d 44 35 44  static void MD5D
1a050 69 67 65 73 74 54 6f 42 61 73 65 31 36 28 75 6e  igestToBase16(un
1a060 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 69 67  signed char *dig
1a070 65 73 74 2c 20 63 68 61 72 20 2a 7a 42 75 66 29  est, char *zBuf)
1a080 7b 0a 20 20 73 74 61 74 69 63 20 63 68 61 72 20  {.  static char 
1a090 63 6f 6e 73 74 20 7a 45 6e 63 6f 64 65 5b 5d 20  const zEncode[] 
1a0a0 3d 20 22 30 31 32 33 34 35 36 37 38 39 61 62 63  = "0123456789abc
1a0b0 64 65 66 22 3b 0a 20 20 69 6e 74 20 69 2c 20 6a  def";.  int i, j
1a0c0 3b 0a 0a 20 20 66 6f 72 28 6a 3d 69 3d 30 3b 20  ;..  for(j=i=0; 
1a0d0 69 3c 31 36 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  i<16; i++){.    
1a0e0 69 6e 74 20 61 20 3d 20 64 69 67 65 73 74 5b 69  int a = digest[i
1a0f0 5d 3b 0a 20 20 20 20 7a 42 75 66 5b 6a 2b 2b 5d  ];.    zBuf[j++]
1a100 20 3d 20 7a 45 6e 63 6f 64 65 5b 28 61 3e 3e 34   = zEncode[(a>>4
1a110 29 26 30 78 66 5d 3b 0a 20 20 20 20 7a 42 75 66  )&0xf];.    zBuf
1a120 5b 6a 2b 2b 5d 20 3d 20 7a 45 6e 63 6f 64 65 5b  [j++] = zEncode[
1a130 61 20 26 20 30 78 66 5d 3b 0a 20 20 7d 0a 20 20  a & 0xf];.  }.  
1a140 7a 42 75 66 5b 6a 5d 20 3d 20 30 3b 0a 7d 0a 0a  zBuf[j] = 0;.}..
1a150 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61  ./*.** Convert a
1a160 20 31 32 38 2d 62 69 74 20 4d 44 35 20 64 69 67   128-bit MD5 dig
1a170 65 73 74 20 69 6e 74 6f 20 73 65 71 75 65 6e 63  est into sequenc
1a180 79 20 6f 66 20 65 69 67 68 74 20 35 2d 64 69 67  y of eight 5-dig
1a190 69 74 20 69 6e 74 65 67 65 72 73 0a 2a 2a 20 65  it integers.** e
1a1a0 61 63 68 20 72 65 70 72 65 73 65 6e 74 69 6e 67  ach representing
1a1b0 20 31 36 20 62 69 74 73 20 6f 66 20 74 68 65 20   16 bits of the 
1a1c0 64 69 67 65 73 74 20 61 6e 64 20 73 65 70 61 72  digest and separ
1a1d0 61 74 65 64 20 66 72 6f 6d 20 65 61 63 68 0a 2a  ated from each.*
1a1e0 2a 20 6f 74 68 65 72 20 62 79 20 61 20 22 2d 22  * other by a "-"
1a1f0 20 63 68 61 72 61 63 74 65 72 2e 0a 2a 2f 0a 73   character..*/.s
1a200 74 61 74 69 63 20 76 6f 69 64 20 4d 44 35 44 69  tatic void MD5Di
1a210 67 65 73 74 54 6f 42 61 73 65 31 30 78 38 28 75  gestToBase10x8(u
1a220 6e 73 69 67 6e 65 64 20 63 68 61 72 20 64 69 67  nsigned char dig
1a230 65 73 74 5b 31 36 5d 2c 20 63 68 61 72 20 7a 44  est[16], char zD
1a240 69 67 65 73 74 5b 35 30 5d 29 7b 0a 20 20 69 6e  igest[50]){.  in
1a250 74 20 69 2c 20 6a 3b 0a 20 20 75 6e 73 69 67 6e  t i, j;.  unsign
1a260 65 64 20 69 6e 74 20 78 3b 0a 20 20 66 6f 72 28  ed int x;.  for(
1a270 69 3d 6a 3d 30 3b 20 69 3c 31 36 3b 20 69 2b 3d  i=j=0; i<16; i+=
1a280 32 29 7b 0a 20 20 20 20 78 20 3d 20 64 69 67 65  2){.    x = dige
1a290 73 74 5b 69 5d 2a 32 35 36 20 2b 20 64 69 67 65  st[i]*256 + dige
1a2a0 73 74 5b 69 2b 31 5d 3b 0a 20 20 20 20 69 66 28  st[i+1];.    if(
1a2b0 20 69 3e 30 20 29 20 7a 44 69 67 65 73 74 5b 6a   i>0 ) zDigest[j
1a2c0 2b 2b 5d 20 3d 20 27 2d 27 3b 0a 20 20 20 20 73  ++] = '-';.    s
1a2d0 70 72 69 6e 74 66 28 26 7a 44 69 67 65 73 74 5b  printf(&zDigest[
1a2e0 6a 5d 2c 20 22 25 30 35 75 22 2c 20 78 29 3b 0a  j], "%05u", x);.
1a2f0 20 20 20 20 6a 20 2b 3d 20 35 3b 0a 20 20 7d 0a      j += 5;.  }.
1a300 20 20 7a 44 69 67 65 73 74 5b 6a 5d 20 3d 20 30    zDigest[j] = 0
1a310 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 54 43 4c  ;.}../*.** A TCL
1a320 20 63 6f 6d 6d 61 6e 64 20 66 6f 72 20 6d 64 35   command for md5
1a330 2e 20 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20  .  The argument 
1a340 69 73 20 74 68 65 20 74 65 78 74 20 74 6f 20 62  is the text to b
1a350 65 20 68 61 73 68 65 64 2e 20 20 54 68 65 0a 2a  e hashed.  The.*
1a360 2a 20 52 65 73 75 6c 74 20 69 73 20 74 68 65 20  * Result is the 
1a370 68 61 73 68 20 69 6e 20 62 61 73 65 36 34 2e 20  hash in base64. 
1a380 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20   .*/.static int 
1a390 6d 64 35 5f 63 6d 64 28 76 6f 69 64 2a 63 64 2c  md5_cmd(void*cd,
1a3a0 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
1a3b0 65 72 70 2c 20 69 6e 74 20 61 72 67 63 2c 20 63  erp, int argc, c
1a3c0 6f 6e 73 74 20 63 68 61 72 20 2a 2a 61 72 67 76  onst char **argv
1a3d0 29 7b 0a 20 20 4d 44 35 43 6f 6e 74 65 78 74 20  ){.  MD5Context 
1a3e0 63 74 78 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  ctx;.  unsigned 
1a3f0 63 68 61 72 20 64 69 67 65 73 74 5b 31 36 5d 3b  char digest[16];
1a400 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 35 30 5d  .  char zBuf[50]
1a410 3b 0a 20 20 76 6f 69 64 20 28 2a 63 6f 6e 76 65  ;.  void (*conve
1a420 72 74 65 72 29 28 75 6e 73 69 67 6e 65 64 20 63  rter)(unsigned c
1a430 68 61 72 2a 2c 20 63 68 61 72 2a 29 3b 0a 0a 20  har*, char*);.. 
1a440 20 69 66 28 20 61 72 67 63 21 3d 32 20 29 7b 0a   if( argc!=2 ){.
1a450 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
1a460 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 77 72 6f  sult(interp,"wro
1a470 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
1a480 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30  d be \"", argv[0
1a490 5d 2c 20 0a 20 20 20 20 20 20 20 20 22 20 54 45  ], .        " TE
1a4a0 58 54 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72  XT\"", 0);.    r
1a4b0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1a4c0 0a 20 20 7d 0a 20 20 4d 44 35 49 6e 69 74 28 26  .  }.  MD5Init(&
1a4d0 63 74 78 29 3b 0a 20 20 4d 44 35 55 70 64 61 74  ctx);.  MD5Updat
1a4e0 65 28 26 63 74 78 2c 20 28 75 6e 73 69 67 6e 65  e(&ctx, (unsigne
1a4f0 64 20 63 68 61 72 2a 29 61 72 67 76 5b 31 5d 2c  d char*)argv[1],
1a500 20 28 75 6e 73 69 67 6e 65 64 29 73 74 72 6c 65   (unsigned)strle
1a510 6e 28 61 72 67 76 5b 31 5d 29 29 3b 0a 20 20 4d  n(argv[1]));.  M
1a520 44 35 46 69 6e 61 6c 28 64 69 67 65 73 74 2c 20  D5Final(digest, 
1a530 26 63 74 78 29 3b 0a 20 20 63 6f 6e 76 65 72 74  &ctx);.  convert
1a540 65 72 20 3d 20 28 76 6f 69 64 28 2a 29 28 75 6e  er = (void(*)(un
1a550 73 69 67 6e 65 64 20 63 68 61 72 2a 2c 63 68 61  signed char*,cha
1a560 72 2a 29 29 63 64 3b 0a 20 20 63 6f 6e 76 65 72  r*))cd;.  conver
1a570 74 65 72 28 64 69 67 65 73 74 2c 20 7a 42 75 66  ter(digest, zBuf
1a580 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  );.  Tcl_AppendR
1a590 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42  esult(interp, zB
1a5a0 75 66 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20  uf, (char*)0);. 
1a5b0 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
1a5c0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 54 43 4c 20 63  }../*.** A TCL c
1a5d0 6f 6d 6d 61 6e 64 20 74 6f 20 74 61 6b 65 20 74  ommand to take t
1a5e0 68 65 20 6d 64 35 20 68 61 73 68 20 6f 66 20 61  he md5 hash of a
1a5f0 20 66 69 6c 65 2e 20 20 54 68 65 20 61 72 67 75   file.  The argu
1a600 6d 65 6e 74 20 69 73 20 74 68 65 0a 2a 2a 20 6e  ment is the.** n
1a610 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 2e  ame of the file.
1a620 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  .*/.static int m
1a630 64 35 66 69 6c 65 5f 63 6d 64 28 76 6f 69 64 2a  d5file_cmd(void*
1a640 63 64 2c 20 54 63 6c 5f 49 6e 74 65 72 70 2a 69  cd, Tcl_Interp*i
1a650 6e 74 65 72 70 2c 20 69 6e 74 20 61 72 67 63 2c  nterp, int argc,
1a660 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 61 72   const char **ar
1a670 67 76 29 7b 0a 20 20 46 49 4c 45 20 2a 69 6e 3b  gv){.  FILE *in;
1a680 0a 20 20 4d 44 35 43 6f 6e 74 65 78 74 20 63 74  .  MD5Context ct
1a690 78 3b 0a 20 20 76 6f 69 64 20 28 2a 63 6f 6e 76  x;.  void (*conv
1a6a0 65 72 74 65 72 29 28 75 6e 73 69 67 6e 65 64 20  erter)(unsigned 
1a6b0 63 68 61 72 2a 2c 20 63 68 61 72 2a 29 3b 0a 20  char*, char*);. 
1a6c0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 64   unsigned char d
1a6d0 69 67 65 73 74 5b 31 36 5d 3b 0a 20 20 63 68 61  igest[16];.  cha
1a6e0 72 20 7a 42 75 66 5b 31 30 32 34 30 5d 3b 0a 0a  r zBuf[10240];..
1a6f0 20 20 69 66 28 20 61 72 67 63 21 3d 32 20 29 7b    if( argc!=2 ){
1a700 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
1a710 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 77 72  esult(interp,"wr
1a720 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
1a730 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b  ld be \"", argv[
1a740 30 5d 2c 20 0a 20 20 20 20 20 20 20 20 22 20 46  0], .        " F
1a750 49 4c 45 4e 41 4d 45 5c 22 22 2c 20 30 29 3b 0a  ILENAME\"", 0);.
1a760 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
1a770 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 6e 20 3d  RROR;.  }.  in =
1a780 20 66 6f 70 65 6e 28 61 72 67 76 5b 31 5d 2c 22   fopen(argv[1],"
1a790 72 62 22 29 3b 0a 20 20 69 66 28 20 69 6e 3d 3d  rb");.  if( in==
1a7a0 30 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  0 ){.    Tcl_App
1a7b0 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
1a7c0 2c 22 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e  ,"unable to open
1a7d0 20 66 69 6c 65 20 5c 22 22 2c 20 61 72 67 76 5b   file \"", argv[
1a7e0 31 5d 2c 20 0a 20 20 20 20 20 20 20 20 20 22 5c  1], .         "\
1a7f0 22 20 66 6f 72 20 72 65 61 64 69 6e 67 22 2c 20  " for reading", 
1a800 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
1a810 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
1a820 4d 44 35 49 6e 69 74 28 26 63 74 78 29 3b 0a 20  MD5Init(&ctx);. 
1a830 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 69 6e   for(;;){.    in
1a840 74 20 6e 3b 0a 20 20 20 20 6e 20 3d 20 66 72 65  t n;.    n = fre
1a850 61 64 28 7a 42 75 66 2c 20 31 2c 20 73 69 7a 65  ad(zBuf, 1, size
1a860 6f 66 28 7a 42 75 66 29 2c 20 69 6e 29 3b 0a 20  of(zBuf), in);. 
1a870 20 20 20 69 66 28 20 6e 3c 3d 30 20 29 20 62 72     if( n<=0 ) br
1a880 65 61 6b 3b 0a 20 20 20 20 4d 44 35 55 70 64 61  eak;.    MD5Upda
1a890 74 65 28 26 63 74 78 2c 20 28 75 6e 73 69 67 6e  te(&ctx, (unsign
1a8a0 65 64 20 63 68 61 72 2a 29 7a 42 75 66 2c 20 28  ed char*)zBuf, (
1a8b0 75 6e 73 69 67 6e 65 64 29 6e 29 3b 0a 20 20 7d  unsigned)n);.  }
1a8c0 0a 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20  .  fclose(in);. 
1a8d0 20 4d 44 35 46 69 6e 61 6c 28 64 69 67 65 73 74   MD5Final(digest
1a8e0 2c 20 26 63 74 78 29 3b 0a 20 20 63 6f 6e 76 65  , &ctx);.  conve
1a8f0 72 74 65 72 20 3d 20 28 76 6f 69 64 28 2a 29 28  rter = (void(*)(
1a900 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 2c 63  unsigned char*,c
1a910 68 61 72 2a 29 29 63 64 3b 0a 20 20 63 6f 6e 76  har*))cd;.  conv
1a920 65 72 74 65 72 28 64 69 67 65 73 74 2c 20 7a 42  erter(digest, zB
1a930 75 66 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e  uf);.  Tcl_Appen
1a940 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
1a950 7a 42 75 66 2c 20 28 63 68 61 72 2a 29 30 29 3b  zBuf, (char*)0);
1a960 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
1a970 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73  ;.}../*.** Regis
1a980 74 65 72 20 74 68 65 20 66 6f 75 72 20 6e 65 77  ter the four new
1a990 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 73 20 66 6f   TCL commands fo
1a9a0 72 20 67 65 6e 65 72 61 74 69 6e 67 20 4d 44 35  r generating MD5
1a9b0 20 63 68 65 63 6b 73 75 6d 73 0a 2a 2a 20 77 69   checksums.** wi
1a9c0 74 68 20 74 68 65 20 54 43 4c 20 69 6e 74 65 72  th the TCL inter
1a9d0 70 72 65 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 4d  preter..*/.int M
1a9e0 64 35 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  d5_Init(Tcl_Inte
1a9f0 72 70 20 2a 69 6e 74 65 72 70 29 7b 0a 20 20 54  rp *interp){.  T
1aa00 63 6c 5f 43 72 65 61 74 65 43 6f 6d 6d 61 6e 64  cl_CreateCommand
1aa10 28 69 6e 74 65 72 70 2c 20 22 6d 64 35 22 2c 20  (interp, "md5", 
1aa20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 6d 64  (Tcl_CmdProc*)md
1aa30 35 5f 63 6d 64 2c 0a 20 20 20 20 20 20 20 20 20  5_cmd,.         
1aa40 20 20 20 20 20 20 20 20 20 20 20 4d 44 35 44 69             MD5Di
1aa50 67 65 73 74 54 6f 42 61 73 65 31 36 2c 20 30 29  gestToBase16, 0)
1aa60 3b 0a 20 20 54 63 6c 5f 43 72 65 61 74 65 43 6f  ;.  Tcl_CreateCo
1aa70 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 6d  mmand(interp, "m
1aa80 64 35 2d 31 30 78 38 22 2c 20 28 54 63 6c 5f 43  d5-10x8", (Tcl_C
1aa90 6d 64 50 72 6f 63 2a 29 6d 64 35 5f 63 6d 64 2c  mdProc*)md5_cmd,
1aaa0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1aab0 20 20 20 20 20 4d 44 35 44 69 67 65 73 74 54 6f       MD5DigestTo
1aac0 42 61 73 65 31 30 78 38 2c 20 30 29 3b 0a 20 20  Base10x8, 0);.  
1aad0 54 63 6c 5f 43 72 65 61 74 65 43 6f 6d 6d 61 6e  Tcl_CreateComman
1aae0 64 28 69 6e 74 65 72 70 2c 20 22 6d 64 35 66 69  d(interp, "md5fi
1aaf0 6c 65 22 2c 20 28 54 63 6c 5f 43 6d 64 50 72 6f  le", (Tcl_CmdPro
1ab00 63 2a 29 6d 64 35 66 69 6c 65 5f 63 6d 64 2c 0a  c*)md5file_cmd,.
1ab10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ab20 20 20 20 20 4d 44 35 44 69 67 65 73 74 54 6f 42      MD5DigestToB
1ab30 61 73 65 31 36 2c 20 30 29 3b 0a 20 20 54 63 6c  ase16, 0);.  Tcl
1ab40 5f 43 72 65 61 74 65 43 6f 6d 6d 61 6e 64 28 69  _CreateCommand(i
1ab50 6e 74 65 72 70 2c 20 22 6d 64 35 66 69 6c 65 2d  nterp, "md5file-
1ab60 31 30 78 38 22 2c 20 28 54 63 6c 5f 43 6d 64 50  10x8", (Tcl_CmdP
1ab70 72 6f 63 2a 29 6d 64 35 66 69 6c 65 5f 63 6d 64  roc*)md5file_cmd
1ab80 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1ab90 20 20 20 20 20 20 4d 44 35 44 69 67 65 73 74 54        MD5DigestT
1aba0 6f 42 61 73 65 31 30 78 38 2c 20 30 29 3b 0a 20  oBase10x8, 0);. 
1abb0 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
1abc0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69  }.#endif /* defi
1abd0 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29  ned(SQLITE_TEST)
1abe0 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49   || defined(SQLI
1abf0 54 45 5f 54 43 4c 4d 44 35 29 20 2a 2f 0a 0a 23  TE_TCLMD5) */..#
1ac00 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
1ac10 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 44 75  E_TEST)./*.** Du
1ac20 72 69 6e 67 20 74 65 73 74 69 6e 67 2c 20 74 68  ring testing, th
1ac30 65 20 73 70 65 63 69 61 6c 20 6d 64 35 73 75 6d  e special md5sum
1ac40 28 29 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  () aggregate fun
1ac50 63 74 69 6f 6e 20 69 73 20 61 76 61 69 6c 61 62  ction is availab
1ac60 6c 65 2e 0a 2a 2a 20 69 6e 73 69 64 65 20 53 51  le..** inside SQ
1ac70 4c 69 74 65 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  Lite.  The follo
1ac80 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 69 6d  wing routines im
1ac90 70 6c 65 6d 65 6e 74 20 74 68 61 74 20 66 75 6e  plement that fun
1aca0 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
1acb0 20 76 6f 69 64 20 6d 64 35 73 74 65 70 28 73 71   void md5step(sq
1acc0 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
1acd0 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63  ontext, int argc
1ace0 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  , sqlite3_value 
1acf0 2a 2a 61 72 67 76 29 7b 0a 20 20 4d 44 35 43 6f  **argv){.  MD5Co
1ad00 6e 74 65 78 74 20 2a 70 3b 0a 20 20 69 6e 74 20  ntext *p;.  int 
1ad10 69 3b 0a 20 20 69 66 28 20 61 72 67 63 3c 31 20  i;.  if( argc<1 
1ad20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 20 3d 20  ) return;.  p = 
1ad30 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74  sqlite3_aggregat
1ad40 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e 74 65 78  e_context(contex
1ad50 74 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a  t, sizeof(*p));.
1ad60 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
1ad70 75 72 6e 3b 0a 20 20 69 66 28 20 21 70 2d 3e 69  urn;.  if( !p->i
1ad80 73 49 6e 69 74 20 29 7b 0a 20 20 20 20 4d 44 35  sInit ){.    MD5
1ad90 49 6e 69 74 28 70 29 3b 0a 20 20 7d 0a 20 20 66  Init(p);.  }.  f
1ada0 6f 72 28 69 3d 30 3b 20 69 3c 61 72 67 63 3b 20  or(i=0; i<argc; 
1adb0 69 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  i++){.    const 
1adc0 63 68 61 72 20 2a 7a 44 61 74 61 20 3d 20 28 63  char *zData = (c
1add0 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  har*)sqlite3_val
1ade0 75 65 5f 74 65 78 74 28 61 72 67 76 5b 69 5d 29  ue_text(argv[i])
1adf0 3b 0a 20 20 20 20 69 66 28 20 7a 44 61 74 61 20  ;.    if( zData 
1ae00 29 7b 0a 20 20 20 20 20 20 4d 44 35 55 70 64 61  ){.      MD5Upda
1ae10 74 65 28 70 2c 20 28 75 6e 73 69 67 6e 65 64 20  te(p, (unsigned 
1ae20 63 68 61 72 2a 29 7a 44 61 74 61 2c 20 73 74 72  char*)zData, str
1ae30 6c 65 6e 28 7a 44 61 74 61 29 29 3b 0a 20 20 20  len(zData));.   
1ae40 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20   }.  }.}.static 
1ae50 76 6f 69 64 20 6d 64 35 66 69 6e 61 6c 69 7a 65  void md5finalize
1ae60 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
1ae70 20 2a 63 6f 6e 74 65 78 74 29 7b 0a 20 20 4d 44   *context){.  MD
1ae80 35 43 6f 6e 74 65 78 74 20 2a 70 3b 0a 20 20 75  5Context *p;.  u
1ae90 6e 73 69 67 6e 65 64 20 63 68 61 72 20 64 69 67  nsigned char dig
1aea0 65 73 74 5b 31 36 5d 3b 0a 20 20 63 68 61 72 20  est[16];.  char 
1aeb0 7a 42 75 66 5b 33 33 5d 3b 0a 20 20 70 20 3d 20  zBuf[33];.  p = 
1aec0 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74  sqlite3_aggregat
1aed0 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e 74 65 78  e_context(contex
1aee0 74 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a  t, sizeof(*p));.
1aef0 20 20 4d 44 35 46 69 6e 61 6c 28 64 69 67 65 73    MD5Final(diges
1af00 74 2c 70 29 3b 0a 20 20 4d 44 35 44 69 67 65 73  t,p);.  MD5Diges
1af10 74 54 6f 42 61 73 65 31 36 28 64 69 67 65 73 74  tToBase16(digest
1af20 2c 20 7a 42 75 66 29 3b 0a 20 20 73 71 6c 69 74  , zBuf);.  sqlit
1af30 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63  e3_result_text(c
1af40 6f 6e 74 65 78 74 2c 20 7a 42 75 66 2c 20 2d 31  ontext, zBuf, -1
1af50 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
1af60 4e 54 29 3b 0a 7d 0a 69 6e 74 20 4d 64 35 5f 52  NT);.}.int Md5_R
1af70 65 67 69 73 74 65 72 28 73 71 6c 69 74 65 33 20  egister(sqlite3 
1af80 2a 64 62 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  *db){.  int rc =
1af90 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
1afa0 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 6d 64  function(db, "md
1afb0 35 73 75 6d 22 2c 20 2d 31 2c 20 53 51 4c 49 54  5sum", -1, SQLIT
1afc0 45 5f 55 54 46 38 2c 20 30 2c 20 30 2c 20 0a 20  E_UTF8, 0, 0, . 
1afd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1afe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aff0 6d 64 35 73 74 65 70 2c 20 6d 64 35 66 69 6e 61  md5step, md5fina
1b000 6c 69 7a 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  lize);.  sqlite3
1b010 5f 6f 76 65 72 6c 6f 61 64 5f 66 75 6e 63 74 69  _overload_functi
1b020 6f 6e 28 64 62 2c 20 22 6d 64 35 73 75 6d 22 2c  on(db, "md5sum",
1b030 20 2d 31 29 3b 20 20 2f 2a 20 54 6f 20 65 78 65   -1);  /* To exe
1b040 72 63 69 73 65 20 74 68 69 73 20 41 50 49 20 2a  rcise this API *
1b050 2f 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  /.  return rc;.}
1b060 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e  .#endif /* defin
1b070 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 20  ed(SQLITE_TEST) 
1b080 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  */.../*.** If th
1b090 65 20 6d 61 63 72 6f 20 54 43 4c 53 48 20 69 73  e macro TCLSH is
1b0a0 20 6f 6e 65 2c 20 74 68 65 6e 20 70 75 74 20 69   one, then put i
1b0b0 6e 20 63 6f 64 65 20 74 68 69 73 20 66 6f 72 20  n code this for 
1b0c0 74 68 65 0a 2a 2a 20 22 6d 61 69 6e 22 20 72 6f  the.** "main" ro
1b0d0 75 74 69 6e 65 20 74 68 61 74 20 77 69 6c 6c 20  utine that will 
1b0e0 69 6e 69 74 69 61 6c 69 7a 65 20 54 63 6c 20 61  initialize Tcl a
1b0f0 6e 64 20 74 61 6b 65 20 69 6e 70 75 74 20 66 72  nd take input fr
1b100 6f 6d 0a 2a 2a 20 73 74 61 6e 64 61 72 64 20 69  om.** standard i
1b110 6e 70 75 74 2c 20 6f 72 20 69 66 20 61 20 66 69  nput, or if a fi
1b120 6c 65 20 69 73 20 6e 61 6d 65 64 20 6f 6e 20 74  le is named on t
1b130 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 0a  he command line.
1b140 2a 2a 20 74 68 65 20 54 43 4c 20 69 6e 74 65 72  ** the TCL inter
1b150 70 72 65 74 65 72 20 72 65 61 64 73 20 61 6e 64  preter reads and
1b160 20 65 76 61 6c 75 61 74 65 73 20 74 68 61 74 20   evaluates that 
1b170 66 69 6c 65 2e 0a 2a 2f 0a 23 69 66 20 54 43 4c  file..*/.#if TCL
1b180 53 48 3d 3d 31 0a 73 74 61 74 69 63 20 63 6f 6e  SH==1.static con
1b190 73 74 20 63 68 61 72 20 2a 74 63 6c 73 68 5f 6d  st char *tclsh_m
1b1a0 61 69 6e 5f 6c 6f 6f 70 28 76 6f 69 64 29 7b 0a  ain_loop(void){.
1b1b0 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63    static const c
1b1c0 68 61 72 20 7a 4d 61 69 6e 6c 6f 6f 70 5b 5d 20  har zMainloop[] 
1b1d0 3d 0a 20 20 20 20 22 73 65 74 20 6c 69 6e 65 20  =.    "set line 
1b1e0 7b 7d 5c 6e 22 0a 20 20 20 20 22 77 68 69 6c 65  {}\n".    "while
1b1f0 20 7b 21 5b 65 6f 66 20 73 74 64 69 6e 5d 7d 20   {![eof stdin]} 
1b200 7b 5c 6e 22 0a 20 20 20 20 20 20 22 69 66 20 7b  {\n".      "if {
1b210 24 6c 69 6e 65 21 3d 5c 22 5c 22 7d 20 7b 5c 6e  $line!=\"\"} {\n
1b220 22 0a 20 20 20 20 20 20 20 20 22 70 75 74 73 20  ".        "puts 
1b230 2d 6e 6f 6e 65 77 6c 69 6e 65 20 5c 22 3e 20 5c  -nonewline \"> \
1b240 22 5c 6e 22 0a 20 20 20 20 20 20 22 7d 20 65 6c  "\n".      "} el
1b250 73 65 20 7b 5c 6e 22 0a 20 20 20 20 20 20 20 20  se {\n".        
1b260 22 70 75 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65  "puts -nonewline
1b270 20 5c 22 25 20 5c 22 5c 6e 22 0a 20 20 20 20 20   \"% \"\n".     
1b280 20 22 7d 5c 6e 22 0a 20 20 20 20 20 20 22 66 6c   "}\n".      "fl
1b290 75 73 68 20 73 74 64 6f 75 74 5c 6e 22 0a 20 20  ush stdout\n".  
1b2a0 20 20 20 20 22 61 70 70 65 6e 64 20 6c 69 6e 65      "append line
1b2b0 20 5b 67 65 74 73 20 73 74 64 69 6e 5d 5c 6e 22   [gets stdin]\n"
1b2c0 0a 20 20 20 20 20 20 22 69 66 20 7b 5b 69 6e 66  .      "if {[inf
1b2d0 6f 20 63 6f 6d 70 6c 65 74 65 20 24 6c 69 6e 65  o complete $line
1b2e0 5d 7d 20 7b 5c 6e 22 0a 20 20 20 20 20 20 20 20  ]} {\n".        
1b2f0 22 69 66 20 7b 5b 63 61 74 63 68 20 7b 75 70 6c  "if {[catch {upl
1b300 65 76 65 6c 20 23 30 20 24 6c 69 6e 65 7d 20 72  evel #0 $line} r
1b310 65 73 75 6c 74 5d 7d 20 7b 5c 6e 22 0a 20 20 20  esult]} {\n".   
1b320 20 20 20 20 20 20 20 22 70 75 74 73 20 73 74 64         "puts std
1b330 65 72 72 20 5c 22 45 72 72 6f 72 3a 20 24 72 65  err \"Error: $re
1b340 73 75 6c 74 5c 22 5c 6e 22 0a 20 20 20 20 20 20  sult\"\n".      
1b350 20 20 22 7d 20 65 6c 73 65 69 66 20 7b 24 72 65    "} elseif {$re
1b360 73 75 6c 74 21 3d 5c 22 5c 22 7d 20 7b 5c 6e 22  sult!=\"\"} {\n"
1b370 0a 20 20 20 20 20 20 20 20 20 20 22 70 75 74 73  .          "puts
1b380 20 24 72 65 73 75 6c 74 5c 6e 22 0a 20 20 20 20   $result\n".    
1b390 20 20 20 20 22 7d 5c 6e 22 0a 20 20 20 20 20 20      "}\n".      
1b3a0 20 20 22 73 65 74 20 6c 69 6e 65 20 7b 7d 5c 6e    "set line {}\n
1b3b0 22 0a 20 20 20 20 20 20 22 7d 20 65 6c 73 65 20  ".      "} else 
1b3c0 7b 5c 6e 22 0a 20 20 20 20 20 20 20 20 22 61 70  {\n".        "ap
1b3d0 70 65 6e 64 20 6c 69 6e 65 20 5c 5c 6e 5c 6e 22  pend line \\n\n"
1b3e0 0a 20 20 20 20 20 20 22 7d 5c 6e 22 0a 20 20 20  .      "}\n".   
1b3f0 20 22 7d 5c 6e 22 0a 20 20 3b 0a 20 20 72 65 74   "}\n".  ;.  ret
1b400 75 72 6e 20 7a 4d 61 69 6e 6c 6f 6f 70 3b 0a 7d  urn zMainloop;.}
1b410 0a 23 65 6e 64 69 66 0a 23 69 66 20 54 43 4c 53  .#endif.#if TCLS
1b420 48 3d 3d 32 0a 73 74 61 74 69 63 20 63 6f 6e 73  H==2.static cons
1b430 74 20 63 68 61 72 20 2a 74 63 6c 73 68 5f 6d 61  t char *tclsh_ma
1b440 69 6e 5f 6c 6f 6f 70 28 76 6f 69 64 29 3b 0a 23  in_loop(void);.#
1b450 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51  endif..#ifdef SQ
1b460 4c 49 54 45 5f 54 45 53 54 0a 73 74 61 74 69 63  LITE_TEST.static
1b470 20 76 6f 69 64 20 69 6e 69 74 5f 61 6c 6c 28 54   void init_all(T
1b480 63 6c 5f 49 6e 74 65 72 70 20 2a 29 3b 0a 73 74  cl_Interp *);.st
1b490 61 74 69 63 20 69 6e 74 20 69 6e 69 74 5f 61 6c  atic int init_al
1b4a0 6c 5f 63 6d 64 28 0a 20 20 43 6c 69 65 6e 74 44  l_cmd(.  ClientD
1b4b0 61 74 61 20 63 64 2c 0a 20 20 54 63 6c 5f 49 6e  ata cd,.  Tcl_In
1b4c0 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
1b4d0 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
1b4e0 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
1b4f0 5d 0a 29 7b 0a 0a 20 20 54 63 6c 5f 49 6e 74 65  ].){..  Tcl_Inte
1b500 72 70 20 2a 73 6c 61 76 65 3b 0a 20 20 69 66 28  rp *slave;.  if(
1b510 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20   objc!=2 ){.    
1b520 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
1b530 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
1b540 2c 20 22 53 4c 41 56 45 22 29 3b 0a 20 20 20 20  , "SLAVE");.    
1b550 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1b560 3b 0a 20 20 7d 0a 0a 20 20 73 6c 61 76 65 20 3d  ;.  }..  slave =
1b570 20 54 63 6c 5f 47 65 74 53 6c 61 76 65 28 69 6e   Tcl_GetSlave(in
1b580 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
1b590 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 29 3b 0a 20  ing(objv[1]));. 
1b5a0 20 69 66 28 20 21 73 6c 61 76 65 20 29 7b 0a 20   if( !slave ){. 
1b5b0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
1b5c0 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 6e 69 74  ROR;.  }..  init
1b5d0 5f 61 6c 6c 28 73 6c 61 76 65 29 3b 0a 20 20 72  _all(slave);.  r
1b5e0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
1b5f0 0a 2f 2a 0a 2a 2a 20 54 63 6c 63 6d 64 3a 20 64  ./*.** Tclcmd: d
1b600 62 5f 75 73 65 5f 6c 65 67 61 63 79 5f 70 72 65  b_use_legacy_pre
1b610 70 61 72 65 20 44 42 20 42 4f 4f 4c 45 41 4e 0a  pare DB BOOLEAN.
1b620 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 66 69 72 73  **.**   The firs
1b630 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  t argument to th
1b640 69 73 20 63 6f 6d 6d 61 6e 64 20 6d 75 73 74 20  is command must 
1b650 62 65 20 61 20 64 61 74 61 62 61 73 65 20 63 6f  be a database co
1b660 6d 6d 61 6e 64 20 63 72 65 61 74 65 64 20 62 79  mmand created by
1b670 0a 2a 2a 20 20 20 5b 73 71 6c 69 74 65 33 5d 2e  .**   [sqlite3].
1b680 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61   If the second a
1b690 72 67 75 6d 65 6e 74 20 69 73 20 74 72 75 65 2c  rgument is true,
1b6a0 20 74 68 65 6e 20 74 68 65 20 68 61 6e 64 6c 65   then the handle
1b6b0 20 69 73 20 63 6f 6e 66 69 67 75 72 65 64 0a 2a   is configured.*
1b6c0 2a 20 20 20 74 6f 20 75 73 65 20 74 68 65 20 73  *   to use the s
1b6d0 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76  qlite3_prepare_v
1b6e0 32 28 29 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20  2() function to 
1b6f0 70 72 65 70 61 72 65 20 73 74 61 74 65 6d 65 6e  prepare statemen
1b700 74 73 2e 20 49 66 20 69 74 0a 2a 2a 20 20 20 69  ts. If it.**   i
1b710 73 20 66 61 6c 73 65 2c 20 73 71 6c 69 74 65 33  s false, sqlite3
1b720 5f 70 72 65 70 61 72 65 28 29 2e 0a 2a 2f 0a 73  _prepare()..*/.s
1b730 74 61 74 69 63 20 69 6e 74 20 64 62 5f 75 73 65  tatic int db_use
1b740 5f 6c 65 67 61 63 79 5f 70 72 65 70 61 72 65 5f  _legacy_prepare_
1b750 63 6d 64 28 0a 20 20 43 6c 69 65 6e 74 44 61 74  cmd(.  ClientDat
1b760 61 20 63 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  a cd,.  Tcl_Inte
1b770 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
1b780 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
1b790 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
1b7a0 29 7b 0a 20 20 54 63 6c 5f 43 6d 64 49 6e 66 6f  ){.  Tcl_CmdInfo
1b7b0 20 63 6d 64 49 6e 66 6f 3b 0a 20 20 53 71 6c 69   cmdInfo;.  Sqli
1b7c0 74 65 44 62 20 2a 70 44 62 3b 0a 20 20 69 6e 74  teDb *pDb;.  int
1b7d0 20 62 50 72 65 70 61 72 65 3b 0a 0a 20 20 69 66   bPrepare;..  if
1b7e0 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20  ( objc!=3 ){.   
1b7f0 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
1b800 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
1b810 76 2c 20 22 44 42 20 42 4f 4f 4c 45 41 4e 22 29  v, "DB BOOLEAN")
1b820 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
1b830 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69  _ERROR;.  }..  i
1b840 66 28 20 21 54 63 6c 5f 47 65 74 43 6f 6d 6d 61  f( !Tcl_GetComma
1b850 6e 64 49 6e 66 6f 28 69 6e 74 65 72 70 2c 20 54  ndInfo(interp, T
1b860 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
1b870 76 5b 31 5d 29 2c 20 26 63 6d 64 49 6e 66 6f 29  v[1]), &cmdInfo)
1b880 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
1b890 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
1b8a0 20 22 6e 6f 20 73 75 63 68 20 64 62 3a 20 22 2c   "no such db: ",
1b8b0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
1b8c0 62 6a 76 5b 31 5d 29 2c 20 28 63 68 61 72 2a 29  bjv[1]), (char*)
1b8d0 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
1b8e0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
1b8f0 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62 2a  pDb = (SqliteDb*
1b900 29 63 6d 64 49 6e 66 6f 2e 6f 62 6a 43 6c 69 65  )cmdInfo.objClie
1b910 6e 74 44 61 74 61 3b 0a 20 20 69 66 28 20 54 63  ntData;.  if( Tc
1b920 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d  l_GetBooleanFrom
1b930 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
1b940 5b 32 5d 2c 20 26 62 50 72 65 70 61 72 65 29 20  [2], &bPrepare) 
1b950 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  ){.    return TC
1b960 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
1b970 70 44 62 2d 3e 62 4c 65 67 61 63 79 50 72 65 70  pDb->bLegacyPrep
1b980 61 72 65 20 3d 20 62 50 72 65 70 61 72 65 3b 0a  are = bPrepare;.
1b990 0a 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73 75  .  Tcl_ResetResu
1b9a0 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 72 65  lt(interp);.  re
1b9b0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23  turn TCL_OK;.}.#
1b9c0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  endif../*.** Con
1b9d0 66 69 67 75 72 65 20 74 68 65 20 69 6e 74 65 72  figure the inter
1b9e0 70 72 65 74 65 72 20 70 61 73 73 65 64 20 61 73  preter passed as
1b9f0 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
1ba00 65 6e 74 20 74 6f 20 68 61 76 65 20 61 63 63 65  ent to have acce
1ba10 73 73 0a 2a 2a 20 74 6f 20 74 68 65 20 63 6f 6d  ss.** to the com
1ba20 6d 61 6e 64 73 20 61 6e 64 20 6c 69 6e 6b 65 64  mands and linked
1ba30 20 76 61 72 69 61 62 6c 65 73 20 74 68 61 74 20   variables that 
1ba40 6d 61 6b 65 20 75 70 3a 0a 2a 2a 0a 2a 2a 20 20  make up:.**.**  
1ba50 20 2a 20 74 68 65 20 5b 73 71 6c 69 74 65 33 5d   * the [sqlite3]
1ba60 20 65 78 74 65 6e 73 69 6f 6e 20 69 74 73 65 6c   extension itsel
1ba70 66 2c 20 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66  f, .**.**   * If
1ba80 20 53 51 4c 49 54 45 5f 54 43 4c 4d 44 35 20 6f   SQLITE_TCLMD5 o
1ba90 72 20 53 51 4c 49 54 45 5f 54 45 53 54 20 69 73  r SQLITE_TEST is
1baa0 20 64 65 66 69 6e 65 64 2c 20 74 68 65 20 4d 64   defined, the Md
1bab0 35 20 63 6f 6d 6d 61 6e 64 73 2c 20 61 6e 64 0a  5 commands, and.
1bac0 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 53 51 4c  **.**   * If SQL
1bad0 49 54 45 5f 54 45 53 54 20 69 73 20 73 65 74 2c  ITE_TEST is set,
1bae0 20 74 68 65 20 76 61 72 69 6f 75 73 20 74 65 73   the various tes
1baf0 74 20 69 6e 74 65 72 66 61 63 65 73 20 75 73 65  t interfaces use
1bb00 64 20 62 79 20 74 68 65 20 54 63 6c 0a 2a 2a 20  d by the Tcl.** 
1bb10 20 20 20 20 74 65 73 74 20 73 75 69 74 65 2e 0a      test suite..
1bb20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69  */.static void i
1bb30 6e 69 74 5f 61 6c 6c 28 54 63 6c 5f 49 6e 74 65  nit_all(Tcl_Inte
1bb40 72 70 20 2a 69 6e 74 65 72 70 29 7b 0a 20 20 53  rp *interp){.  S
1bb50 71 6c 69 74 65 33 5f 49 6e 69 74 28 69 6e 74 65  qlite3_Init(inte
1bb60 72 70 29 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65  rp);..#if define
1bb70 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 20 7c  d(SQLITE_TEST) |
1bb80 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  | defined(SQLITE
1bb90 5f 54 43 4c 4d 44 35 29 0a 20 20 4d 64 35 5f 49  _TCLMD5).  Md5_I
1bba0 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 23 65 6e  nit(interp);.#en
1bbb0 64 69 66 0a 0a 20 20 2f 2a 20 49 6e 73 74 61 6c  dif..  /* Instal
1bbc0 6c 20 74 68 65 20 5b 72 65 67 69 73 74 65 72 5f  l the [register_
1bbd0 64 62 73 74 61 74 5f 76 74 61 62 5d 20 63 6f 6d  dbstat_vtab] com
1bbe0 6d 61 6e 64 20 74 6f 20 61 63 63 65 73 73 20 74  mand to access t
1bbf0 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
1bc00 6e 0a 20 20 2a 2a 20 6f 66 20 76 69 72 74 75 61  n.  ** of virtua
1bc10 6c 20 74 61 62 6c 65 20 64 62 73 74 61 74 20 28  l table dbstat (
1bc20 73 6f 75 72 63 65 20 66 69 6c 65 20 74 65 73 74  source file test
1bc30 5f 73 74 61 74 2e 63 29 2e 20 54 68 69 73 20 63  _stat.c). This c
1bc40 6f 6d 6d 61 6e 64 20 69 73 0a 20 20 2a 2a 20 72  ommand is.  ** r
1bc50 65 71 75 69 72 65 64 20 66 6f 72 20 74 65 73 74  equired for test
1bc60 66 69 78 74 75 72 65 20 61 6e 64 20 73 71 6c 69  fixture and sqli
1bc70 74 65 33 5f 61 6e 61 6c 79 7a 65 72 2c 20 62 75  te3_analyzer, bu
1bc80 74 20 6e 6f 74 20 62 79 20 74 68 65 20 70 72 6f  t not by the pro
1bc90 64 75 63 74 69 6f 6e 0a 20 20 2a 2a 20 54 63 6c  duction.  ** Tcl
1bca0 20 65 78 74 65 6e 73 69 6f 6e 2e 20 20 2a 2f 0a   extension.  */.
1bcb0 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
1bcc0 54 45 5f 54 45 53 54 29 20 7c 7c 20 54 43 4c 53  TE_TEST) || TCLS
1bcd0 48 3d 3d 32 0a 20 20 7b 0a 20 20 20 20 65 78 74  H==2.  {.    ext
1bce0 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65  ern int Sqlitete
1bcf0 73 74 53 74 61 74 5f 49 6e 69 74 28 54 63 6c 5f  stStat_Init(Tcl_
1bd00 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 53 71  Interp*);.    Sq
1bd10 6c 69 74 65 74 65 73 74 53 74 61 74 5f 49 6e 69  litetestStat_Ini
1bd20 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 7d 0a 23  t(interp);.  }.#
1bd30 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51  endif..#ifdef SQ
1bd40 4c 49 54 45 5f 54 45 53 54 0a 20 20 7b 0a 20 20  LITE_TEST.  {.  
1bd50 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c    extern int Sql
1bd60 69 74 65 63 6f 6e 66 69 67 5f 49 6e 69 74 28 54  iteconfig_Init(T
1bd70 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20  cl_Interp*);.   
1bd80 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69   extern int Sqli
1bd90 74 65 74 65 73 74 31 5f 49 6e 69 74 28 54 63 6c  tetest1_Init(Tcl
1bda0 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65  _Interp*);.    e
1bdb0 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65  xtern int Sqlite
1bdc0 74 65 73 74 32 5f 49 6e 69 74 28 54 63 6c 5f 49  test2_Init(Tcl_I
1bdd0 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74  nterp*);.    ext
1bde0 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65  ern int Sqlitete
1bdf0 73 74 33 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74  st3_Init(Tcl_Int
1be00 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72  erp*);.    exter
1be10 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74  n int Sqlitetest
1be20 34 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  4_Init(Tcl_Inter
1be30 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20  p*);.    extern 
1be40 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 35 5f  int Sqlitetest5_
1be50 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a  Init(Tcl_Interp*
1be60 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e  );.    extern in
1be70 74 20 53 71 6c 69 74 65 74 65 73 74 36 5f 49 6e  t Sqlitetest6_In
1be80 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b  it(Tcl_Interp*);
1be90 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20  .    extern int 
1bea0 53 71 6c 69 74 65 74 65 73 74 37 5f 49 6e 69 74  Sqlitetest7_Init
1beb0 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20  (Tcl_Interp*);. 
1bec0 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71     extern int Sq
1bed0 6c 69 74 65 74 65 73 74 38 5f 49 6e 69 74 28 54  litetest8_Init(T
1bee0 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20  cl_Interp*);.   
1bef0 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69   extern int Sqli
1bf00 74 65 74 65 73 74 39 5f 49 6e 69 74 28 54 63 6c  tetest9_Init(Tcl
1bf10 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65  _Interp*);.    e
1bf20 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65  xtern int Sqlite
1bf30 74 65 73 74 61 73 79 6e 63 5f 49 6e 69 74 28 54  testasync_Init(T
1bf40 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20  cl_Interp*);.   
1bf50 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69   extern int Sqli
1bf60 74 65 74 65 73 74 5f 61 75 74 6f 65 78 74 5f 49  tetest_autoext_I
1bf70 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29  nit(Tcl_Interp*)
1bf80 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74  ;.    extern int
1bf90 20 53 71 6c 69 74 65 74 65 73 74 5f 64 65 6d 6f   Sqlitetest_demo
1bfa0 76 66 73 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74  vfs_Init(Tcl_Int
1bfb0 65 72 70 20 2a 29 3b 0a 20 20 20 20 65 78 74 65  erp *);.    exte
1bfc0 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73  rn int Sqlitetes
1bfd0 74 5f 66 75 6e 63 5f 49 6e 69 74 28 54 63 6c 5f  t_func_Init(Tcl_
1bfe0 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78  Interp*);.    ex
1bff0 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74  tern int Sqlitet
1c000 65 73 74 5f 68 65 78 69 6f 5f 49 6e 69 74 28 54  est_hexio_Init(T
1c010 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20  cl_Interp*);.   
1c020 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69   extern int Sqli
1c030 74 65 74 65 73 74 5f 69 6e 69 74 5f 49 6e 69 74  tetest_init_Init
1c040 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20  (Tcl_Interp*);. 
1c050 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71     extern int Sq
1c060 6c 69 74 65 74 65 73 74 5f 6d 61 6c 6c 6f 63 5f  litetest_malloc_
1c070 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a  Init(Tcl_Interp*
1c080 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e  );.    extern in
1c090 74 20 53 71 6c 69 74 65 74 65 73 74 5f 6d 75 74  t Sqlitetest_mut
1c0a0 65 78 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  ex_Init(Tcl_Inte
1c0b0 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e  rp*);.    extern
1c0c0 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 73   int Sqlitetests
1c0d0 63 68 65 6d 61 5f 49 6e 69 74 28 54 63 6c 5f 49  chema_Init(Tcl_I
1c0e0 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74  nterp*);.    ext
1c0f0 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65  ern int Sqlitete
1c100 73 74 73 73 65 5f 49 6e 69 74 28 54 63 6c 5f 49  stsse_Init(Tcl_I
1c110 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74  nterp*);.    ext
1c120 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65  ern int Sqlitete
1c130 73 74 74 63 6c 76 61 72 5f 49 6e 69 74 28 54 63  sttclvar_Init(Tc
1c140 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20  l_Interp*);.    
1c150 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74  extern int Sqlit
1c160 65 74 65 73 74 54 68 72 65 61 64 5f 49 6e 69 74  etestThread_Init
1c170 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20  (Tcl_Interp*);. 
1c180 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71     extern int Sq
1c190 6c 69 74 65 74 65 73 74 4f 6e 65 66 69 6c 65 5f  litetestOnefile_
1c1a0 49 6e 69 74 28 29 3b 0a 20 20 20 20 65 78 74 65  Init();.    exte
1c1b0 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73  rn int Sqlitetes
1c1c0 74 4f 73 69 6e 73 74 5f 49 6e 69 74 28 54 63 6c  tOsinst_Init(Tcl
1c1d0 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65  _Interp*);.    e
1c1e0 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65  xtern int Sqlite
1c1f0 74 65 73 74 62 61 63 6b 75 70 5f 49 6e 69 74 28  testbackup_Init(
1c200 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20  Tcl_Interp*);.  
1c210 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c    extern int Sql
1c220 69 74 65 74 65 73 74 69 6e 74 61 72 72 61 79 5f  itetestintarray_
1c230 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a  Init(Tcl_Interp*
1c240 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e  );.    extern in
1c250 74 20 53 71 6c 69 74 65 74 65 73 74 76 66 73 5f  t Sqlitetestvfs_
1c260 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20  Init(Tcl_Interp 
1c270 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69  *);.    extern i
1c280 6e 74 20 53 71 6c 69 74 65 74 65 73 74 72 74 72  nt Sqlitetestrtr
1c290 65 65 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  ee_Init(Tcl_Inte
1c2a0 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e  rp*);.    extern
1c2b0 20 69 6e 74 20 53 71 6c 69 74 65 71 75 6f 74 61   int Sqlitequota
1c2c0 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
1c2d0 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69  *);.    extern i
1c2e0 6e 74 20 53 71 6c 69 74 65 6d 75 6c 74 69 70 6c  nt Sqlitemultipl
1c2f0 65 78 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  ex_Init(Tcl_Inte
1c300 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e  rp*);.    extern
1c310 20 69 6e 74 20 53 71 6c 69 74 65 53 75 70 65 72   int SqliteSuper
1c320 6c 6f 63 6b 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  lock_Init(Tcl_In
1c330 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65  terp*);.    exte
1c340 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73  rn int Sqlitetes
1c350 74 53 79 73 63 61 6c 6c 5f 49 6e 69 74 28 54 63  tSyscall_Init(Tc
1c360 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20  l_Interp*);.    
1c370 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74  extern int Sqlit
1c380 65 74 65 73 74 66 75 7a 7a 65 72 5f 49 6e 69 74  etestfuzzer_Init
1c390 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20  (Tcl_Interp*);. 
1c3a0 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71     extern int Sq
1c3b0 6c 69 74 65 74 65 73 74 77 68 6f 6c 65 6e 75 6d  litetestwholenum
1c3c0 62 65 72 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74  ber_Init(Tcl_Int
1c3d0 65 72 70 2a 29 3b 0a 0a 23 69 66 20 64 65 66 69  erp*);..#if defi
1c3e0 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
1c3f0 45 5f 46 54 53 33 29 20 7c 7c 20 64 65 66 69 6e  E_FTS3) || defin
1c400 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
1c410 5f 46 54 53 34 29 0a 20 20 20 20 65 78 74 65 72  _FTS4).    exter
1c420 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74  n int Sqlitetest
1c430 66 74 73 33 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  fts3_Init(Tcl_In
1c440 74 65 72 70 20 2a 69 6e 74 65 72 70 29 3b 0a 23  terp *interp);.#
1c450 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51  endif..#ifdef SQ
1c460 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 5a 49 50 56  LITE_ENABLE_ZIPV
1c470 46 53 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e  FS.    extern in
1c480 74 20 5a 69 70 76 66 73 5f 49 6e 69 74 28 54 63  t Zipvfs_Init(Tc
1c490 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20  l_Interp*);.    
1c4a0 5a 69 70 76 66 73 5f 49 6e 69 74 28 69 6e 74 65  Zipvfs_Init(inte
1c4b0 72 70 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20  rp);.#endif..   
1c4c0 20 53 71 6c 69 74 65 63 6f 6e 66 69 67 5f 49 6e   Sqliteconfig_In
1c4d0 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  it(interp);.    
1c4e0 53 71 6c 69 74 65 74 65 73 74 31 5f 49 6e 69 74  Sqlitetest1_Init
1c4f0 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71  (interp);.    Sq
1c500 6c 69 74 65 74 65 73 74 32 5f 49 6e 69 74 28 69  litetest2_Init(i
1c510 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69  nterp);.    Sqli
1c520 74 65 74 65 73 74 33 5f 49 6e 69 74 28 69 6e 74  tetest3_Init(int
1c530 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65  erp);.    Sqlite
1c540 74 65 73 74 34 5f 49 6e 69 74 28 69 6e 74 65 72  test4_Init(inter
1c550 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65  p);.    Sqlitete
1c560 73 74 35 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  st5_Init(interp)
1c570 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74  ;.    Sqlitetest
1c580 36 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a  6_Init(interp);.
1c590 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 37 5f      Sqlitetest7_
1c5a0 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  Init(interp);.  
1c5b0 20 20 53 71 6c 69 74 65 74 65 73 74 38 5f 49 6e    Sqlitetest8_In
1c5c0 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  it(interp);.    
1c5d0 53 71 6c 69 74 65 74 65 73 74 39 5f 49 6e 69 74  Sqlitetest9_Init
1c5e0 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71  (interp);.    Sq
1c5f0 6c 69 74 65 74 65 73 74 61 73 79 6e 63 5f 49 6e  litetestasync_In
1c600 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  it(interp);.    
1c610 53 71 6c 69 74 65 74 65 73 74 5f 61 75 74 6f 65  Sqlitetest_autoe
1c620 78 74 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b  xt_Init(interp);
1c630 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 5f  .    Sqlitetest_
1c640 64 65 6d 6f 76 66 73 5f 49 6e 69 74 28 69 6e 74  demovfs_Init(int
1c650 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65  erp);.    Sqlite
1c660 74 65 73 74 5f 66 75 6e 63 5f 49 6e 69 74 28 69  test_func_Init(i
1c670 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69  nterp);.    Sqli
1c680 74 65 74 65 73 74 5f 68 65 78 69 6f 5f 49 6e 69  tetest_hexio_Ini
1c690 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53  t(interp);.    S
1c6a0 71 6c 69 74 65 74 65 73 74 5f 69 6e 69 74 5f 49  qlitetest_init_I
1c6b0 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20  nit(interp);.   
1c6c0 20 53 71 6c 69 74 65 74 65 73 74 5f 6d 61 6c 6c   Sqlitetest_mall
1c6d0 6f 63 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b  oc_Init(interp);
1c6e0 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 5f  .    Sqlitetest_
1c6f0 6d 75 74 65 78 5f 49 6e 69 74 28 69 6e 74 65 72  mutex_Init(inter
1c700 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65  p);.    Sqlitete
1c710 73 74 73 63 68 65 6d 61 5f 49 6e 69 74 28 69 6e  stschema_Init(in
1c720 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74  terp);.    Sqlit
1c730 65 74 65 73 74 74 63 6c 76 61 72 5f 49 6e 69 74  etesttclvar_Init
1c740 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71  (interp);.    Sq
1c750 6c 69 74 65 74 65 73 74 54 68 72 65 61 64 5f 49  litetestThread_I
1c760 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20  nit(interp);.   
1c770 20 53 71 6c 69 74 65 74 65 73 74 4f 6e 65 66 69   SqlitetestOnefi
1c780 6c 65 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b  le_Init(interp);
1c790 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 4f  .    SqlitetestO
1c7a0 73 69 6e 73 74 5f 49 6e 69 74 28 69 6e 74 65 72  sinst_Init(inter
1c7b0 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65  p);.    Sqlitete
1c7c0 73 74 62 61 63 6b 75 70 5f 49 6e 69 74 28 69 6e  stbackup_Init(in
1c7d0 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74  terp);.    Sqlit
1c7e0 65 74 65 73 74 69 6e 74 61 72 72 61 79 5f 49 6e  etestintarray_In
1c7f0 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  it(interp);.    
1c800 53 71 6c 69 74 65 74 65 73 74 76 66 73 5f 49 6e  Sqlitetestvfs_In
1c810 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  it(interp);.    
1c820 53 71 6c 69 74 65 74 65 73 74 72 74 72 65 65 5f  Sqlitetestrtree_
1c830 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  Init(interp);.  
1c840 20 20 53 71 6c 69 74 65 71 75 6f 74 61 5f 49 6e    Sqlitequota_In
1c850 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  it(interp);.    
1c860 53 71 6c 69 74 65 6d 75 6c 74 69 70 6c 65 78 5f  Sqlitemultiplex_
1c870 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  Init(interp);.  
1c880 20 20 53 71 6c 69 74 65 53 75 70 65 72 6c 6f 63    SqliteSuperloc
1c890 6b 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a  k_Init(interp);.
1c8a0 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 53 79      SqlitetestSy
1c8b0 73 63 61 6c 6c 5f 49 6e 69 74 28 69 6e 74 65 72  scall_Init(inter
1c8c0 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65  p);.    Sqlitete
1c8d0 73 74 66 75 7a 7a 65 72 5f 49 6e 69 74 28 69 6e  stfuzzer_Init(in
1c8e0 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74  terp);.    Sqlit
1c8f0 65 74 65 73 74 77 68 6f 6c 65 6e 75 6d 62 65 72  etestwholenumber
1c900 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 0a  _Init(interp);..
1c910 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
1c920 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 33 29 20  TE_ENABLE_FTS3) 
1c930 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  || defined(SQLIT
1c940 45 5f 45 4e 41 42 4c 45 5f 46 54 53 34 29 0a 20  E_ENABLE_FTS4). 
1c950 20 20 20 53 71 6c 69 74 65 74 65 73 74 66 74 73     Sqlitetestfts
1c960 33 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a  3_Init(interp);.
1c970 23 65 6e 64 69 66 0a 0a 20 20 20 20 54 63 6c 5f  #endif..    Tcl_
1c980 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64  CreateObjCommand
1c990 28 0a 20 20 20 20 20 20 20 20 69 6e 74 65 72 70  (.        interp
1c9a0 2c 20 22 6c 6f 61 64 5f 74 65 73 74 66 69 78 74  , "load_testfixt
1c9b0 75 72 65 5f 65 78 74 65 6e 73 69 6f 6e 73 22 2c  ure_extensions",
1c9c0 20 69 6e 69 74 5f 61 6c 6c 5f 63 6d 64 2c 20 30   init_all_cmd, 0
1c9d0 2c 20 30 0a 20 20 20 20 29 3b 0a 20 20 20 20 54  , 0.    );.    T
1c9e0 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d  cl_CreateObjComm
1c9f0 61 6e 64 28 0a 20 20 20 20 20 20 20 20 69 6e 74  and(.        int
1ca00 65 72 70 2c 20 22 64 62 5f 75 73 65 5f 6c 65 67  erp, "db_use_leg
1ca10 61 63 79 5f 70 72 65 70 61 72 65 22 2c 20 64 62  acy_prepare", db
1ca20 5f 75 73 65 5f 6c 65 67 61 63 79 5f 70 72 65 70  _use_legacy_prep
1ca30 61 72 65 5f 63 6d 64 2c 20 30 2c 20 30 0a 20 20  are_cmd, 0, 0.  
1ca40 20 20 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c    );..#ifdef SQL
1ca50 49 54 45 5f 53 53 45 0a 20 20 20 20 53 71 6c 69  ITE_SSE.    Sqli
1ca60 74 65 74 65 73 74 73 73 65 5f 49 6e 69 74 28 69  tetestsse_Init(i
1ca70 6e 74 65 72 70 29 3b 0a 23 65 6e 64 69 66 0a 20  nterp);.#endif. 
1ca80 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 23 64 65   }.#endif.}..#de
1ca90 66 69 6e 65 20 54 43 4c 53 48 5f 4d 41 49 4e 20  fine TCLSH_MAIN 
1caa0 6d 61 69 6e 20 20 20 2f 2a 20 4e 65 65 64 65 64  main   /* Needed
1cab0 20 74 6f 20 66 61 6b 65 20 6f 75 74 20 6d 6b 74   to fake out mkt
1cac0 63 6c 61 70 70 20 2a 2f 0a 69 6e 74 20 54 43 4c  clapp */.int TCL
1cad0 53 48 5f 4d 41 49 4e 28 69 6e 74 20 61 72 67 63  SH_MAIN(int argc
1cae0 2c 20 63 68 61 72 20 2a 2a 61 72 67 76 29 7b 0a  , char **argv){.
1caf0 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
1cb00 74 65 72 70 3b 0a 20 20 0a 20 20 2f 2a 20 43 61  terp;.  .  /* Ca
1cb10 6c 6c 20 73 71 6c 69 74 65 33 5f 73 68 75 74 64  ll sqlite3_shutd
1cb20 6f 77 6e 28 29 20 6f 6e 63 65 20 62 65 66 6f 72  own() once befor
1cb30 65 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67  e doing anything
1cb40 20 65 6c 73 65 2e 20 54 68 69 73 20 69 73 20 74   else. This is t
1cb50 6f 0a 20 20 2a 2a 20 74 65 73 74 20 74 68 61 74  o.  ** test that
1cb60 20 73 71 6c 69 74 65 33 5f 73 68 75 74 64 6f 77   sqlite3_shutdow
1cb70 6e 28 29 20 63 61 6e 20 62 65 20 73 61 66 65 6c  n() can be safel
1cb80 79 20 63 61 6c 6c 65 64 20 62 79 20 61 20 70 72  y called by a pr
1cb90 6f 63 65 73 73 20 62 65 66 6f 72 65 0a 20 20 2a  ocess before.  *
1cba0 2a 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61  * sqlite3_initia
1cbb0 6c 69 7a 65 28 29 20 69 73 2e 20 2a 2f 0a 20 20  lize() is. */.  
1cbc0 73 71 6c 69 74 65 33 5f 73 68 75 74 64 6f 77 6e  sqlite3_shutdown
1cbd0 28 29 3b 0a 0a 20 20 54 63 6c 5f 46 69 6e 64 45  ();..  Tcl_FindE
1cbe0 78 65 63 75 74 61 62 6c 65 28 61 72 67 76 5b 30  xecutable(argv[0
1cbf0 5d 29 3b 0a 20 20 69 6e 74 65 72 70 20 3d 20 54  ]);.  interp = T
1cc00 63 6c 5f 43 72 65 61 74 65 49 6e 74 65 72 70 28  cl_CreateInterp(
1cc10 29 3b 0a 0a 23 69 66 20 54 43 4c 53 48 3d 3d 32  );..#if TCLSH==2
1cc20 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69  .  sqlite3_confi
1cc30 67 28 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  g(SQLITE_CONFIG_
1cc40 53 49 4e 47 4c 45 54 48 52 45 41 44 29 3b 0a 23  SINGLETHREAD);.#
1cc50 65 6e 64 69 66 0a 0a 20 20 69 6e 69 74 5f 61 6c  endif..  init_al
1cc60 6c 28 69 6e 74 65 72 70 29 3b 0a 20 20 69 66 28  l(interp);.  if(
1cc70 20 61 72 67 63 3e 3d 32 20 29 7b 0a 20 20 20 20   argc>=2 ){.    
1cc80 69 6e 74 20 69 3b 0a 20 20 20 20 63 68 61 72 20  int i;.    char 
1cc90 7a 41 72 67 63 5b 33 32 5d 3b 0a 20 20 20 20 73  zArgc[32];.    s
1cca0 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
1ccb0 73 69 7a 65 6f 66 28 7a 41 72 67 63 29 2c 20 7a  sizeof(zArgc), z
1ccc0 41 72 67 63 2c 20 22 25 64 22 2c 20 61 72 67 63  Argc, "%d", argc
1ccd0 2d 28 33 2d 54 43 4c 53 48 29 29 3b 0a 20 20 20  -(3-TCLSH));.   
1cce0 20 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65   Tcl_SetVar(inte
1ccf0 72 70 2c 22 61 72 67 63 22 2c 20 7a 41 72 67 63  rp,"argc", zArgc
1cd00 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c  , TCL_GLOBAL_ONL
1cd10 59 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 56  Y);.    Tcl_SetV
1cd20 61 72 28 69 6e 74 65 72 70 2c 22 61 72 67 76 30  ar(interp,"argv0
1cd30 22 2c 61 72 67 76 5b 31 5d 2c 54 43 4c 5f 47 4c  ",argv[1],TCL_GL
1cd40 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 20 20 20 20  OBAL_ONLY);.    
1cd50 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72  Tcl_SetVar(inter
1cd60 70 2c 22 61 72 67 76 22 2c 20 22 22 2c 20 54 43  p,"argv", "", TC
1cd70 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a  L_GLOBAL_ONLY);.
1cd80 20 20 20 20 66 6f 72 28 69 3d 33 2d 54 43 4c 53      for(i=3-TCLS
1cd90 48 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b 29 7b  H; i<argc; i++){
1cda0 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74 56 61  .      Tcl_SetVa
1cdb0 72 28 69 6e 74 65 72 70 2c 20 22 61 72 67 76 22  r(interp, "argv"
1cdc0 2c 20 61 72 67 76 5b 69 5d 2c 0a 20 20 20 20 20  , argv[i],.     
1cdd0 20 20 20 20 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f       TCL_GLOBAL_
1cde0 4f 4e 4c 59 20 7c 20 54 43 4c 5f 4c 49 53 54 5f  ONLY | TCL_LIST_
1cdf0 45 4c 45 4d 45 4e 54 20 7c 20 54 43 4c 5f 41 50  ELEMENT | TCL_AP
1ce00 50 45 4e 44 5f 56 41 4c 55 45 29 3b 0a 20 20 20  PEND_VALUE);.   
1ce10 20 7d 0a 20 20 20 20 69 66 28 20 54 43 4c 53 48   }.    if( TCLSH
1ce20 3d 3d 31 20 26 26 20 54 63 6c 5f 45 76 61 6c 46  ==1 && Tcl_EvalF
1ce30 69 6c 65 28 69 6e 74 65 72 70 2c 20 61 72 67 76  ile(interp, argv
1ce40 5b 31 5d 29 21 3d 54 43 4c 5f 4f 4b 20 29 7b 0a  [1])!=TCL_OK ){.
1ce50 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
1ce60 20 2a 7a 49 6e 66 6f 20 3d 20 54 63 6c 5f 47 65   *zInfo = Tcl_Ge
1ce70 74 56 61 72 28 69 6e 74 65 72 70 2c 20 22 65 72  tVar(interp, "er
1ce80 72 6f 72 49 6e 66 6f 22 2c 20 54 43 4c 5f 47 4c  rorInfo", TCL_GL
1ce90 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 20 20 20 20  OBAL_ONLY);.    
1cea0 20 20 69 66 28 20 7a 49 6e 66 6f 3d 3d 30 20 29    if( zInfo==0 )
1ceb0 20 7a 49 6e 66 6f 20 3d 20 54 63 6c 5f 47 65 74   zInfo = Tcl_Get
1cec0 53 74 72 69 6e 67 52 65 73 75 6c 74 28 69 6e 74  StringResult(int
1ced0 65 72 70 29 3b 0a 20 20 20 20 20 20 66 70 72 69  erp);.      fpri
1cee0 6e 74 66 28 73 74 64 65 72 72 2c 22 25 73 3a 20  ntf(stderr,"%s: 
1cef0 25 73 5c 6e 22 2c 20 2a 61 72 67 76 2c 20 7a 49  %s\n", *argv, zI
1cf00 6e 66 6f 29 3b 0a 20 20 20 20 20 20 72 65 74 75  nfo);.      retu
1cf10 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 1;.    }.  }.
1cf20 20 20 69 66 28 20 54 43 4c 53 48 3d 3d 32 20 7c    if( TCLSH==2 |
1cf30 7c 20 61 72 67 63 3c 3d 31 20 29 7b 0a 20 20 20  | argc<=1 ){.   
1cf40 20 54 63 6c 5f 47 6c 6f 62 61 6c 45 76 61 6c 28   Tcl_GlobalEval(
1cf50 69 6e 74 65 72 70 2c 20 74 63 6c 73 68 5f 6d 61  interp, tclsh_ma
1cf60 69 6e 5f 6c 6f 6f 70 28 29 29 3b 0a 20 20 7d 0a  in_loop());.  }.
1cf70 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65    return 0;.}.#e
1cf80 6e 64 69 66 20 2f 2a 20 54 43 4c 53 48 20 2a 2f  ndif /* TCLSH */
1cf90 0a                                               .