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

Artifact b020ebf3b4af58cae7875e217efd7ac22f485713:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 41 20 54 43 4c 20  ******.** A TCL 
0180: 49 6e 74 65 72 66 61 63 65 20 74 6f 20 53 51 4c  Interface to SQL
0190: 69 74 65 2e 20 20 41 70 70 65 6e 64 20 74 68 69  ite.  Append thi
01a0: 73 20 66 69 6c 65 20 74 6f 20 73 71 6c 69 74 65  s file to sqlite
01b0: 33 2e 63 20 61 6e 64 0a 2a 2a 20 63 6f 6d 70 69  3.c and.** compi
01c0: 6c 65 20 74 68 65 20 77 68 6f 6c 65 20 74 68 69  le the whole thi
01d0: 6e 67 20 74 6f 20 62 75 69 6c 64 20 61 20 54 43  ng to build a TC
01e0: 4c 2d 65 6e 61 62 6c 65 64 20 76 65 72 73 69 6f  L-enabled versio
01f0: 6e 20 6f 66 20 53 51 4c 69 74 65 2e 0a 2a 2a 0a  n of SQLite..**.
0200: 2a 2a 20 43 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  ** Compile-time 
0210: 6f 70 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20  options:.**.**  
0220: 2d 44 54 43 4c 53 48 3d 31 20 20 20 20 20 20 20  -DTCLSH=1       
0230: 20 20 20 20 20 20 41 64 64 20 61 20 22 6d 61 69        Add a "mai
0240: 6e 28 29 22 20 72 6f 75 74 69 6e 65 20 74 68 61  n()" routine tha
0250: 74 20 77 6f 72 6b 73 20 61 73 20 61 20 74 63 6c  t works as a tcl
0260: 73 68 2e 0a 2a 2a 0a 2a 2a 20 20 2d 44 53 51 4c  sh..**.**  -DSQL
0270: 49 54 45 5f 54 43 4c 4d 44 35 20 20 20 20 20 20  ITE_TCLMD5      
0280: 20 57 68 65 6e 20 75 73 65 64 20 69 6e 20 63 6f   When used in co
0290: 6e 6a 75 63 74 69 6f 6e 20 77 69 74 68 20 2d 44  njuction with -D
02a0: 54 43 4c 53 48 3d 31 2c 20 61 64 64 0a 2a 2a 20  TCLSH=1, add.** 
02b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
02c0: 20 20 20 20 20 20 20 66 6f 75 72 20 6e 65 77 20         four new 
02d0: 63 6f 6d 6d 61 6e 64 73 20 74 6f 20 74 68 65 20  commands to the 
02e0: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
02f0: 66 6f 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  for.**          
0300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 67 65                ge
0310: 6e 65 72 61 74 69 6e 67 20 4d 44 35 20 63 68 65  nerating MD5 che
0320: 63 6b 73 75 6d 73 3a 20 20 6d 64 35 2c 20 6d 64  cksums:  md5, md
0330: 35 66 69 6c 65 2c 0a 2a 2a 20 20 20 20 20 20 20  5file,.**       
0340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0350: 20 6d 64 35 2d 31 30 78 38 2c 20 61 6e 64 20 6d   md5-10x8, and m
0360: 64 35 66 69 6c 65 2d 31 30 78 38 2e 0a 2a 2a 0a  d5file-10x8..**.
0370: 2a 2a 20 20 2d 44 53 51 4c 49 54 45 5f 54 45 53  **  -DSQLITE_TES
0380: 54 20 20 20 20 20 20 20 20 20 57 68 65 6e 20 75  T         When u
0390: 73 65 64 20 69 6e 20 63 6f 6e 6a 75 63 74 69 6f  sed in conjuctio
03a0: 6e 20 77 69 74 68 20 2d 44 54 43 4c 53 48 3d 31  n with -DTCLSH=1
03b0: 2c 20 61 64 64 0a 2a 2a 20 20 20 20 20 20 20 20  , add.**        
03c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
03d0: 68 75 6e 64 72 65 64 73 20 6f 66 20 6e 65 77 20  hundreds of new 
03e0: 63 6f 6d 6d 61 6e 64 73 20 75 73 65 64 20 66 6f  commands used fo
03f0: 72 20 74 65 73 74 69 6e 67 0a 2a 2a 20 20 20 20  r testing.**    
0400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0410: 20 20 20 20 53 51 4c 69 74 65 2e 20 20 54 68 69      SQLite.  Thi
0420: 73 20 6f 70 74 69 6f 6e 20 69 6d 70 6c 69 65 73  s option implies
0430: 20 2d 44 53 51 4c 49 54 45 5f 54 43 4c 4d 44 35   -DSQLITE_TCLMD5
0440: 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 74  ..*/.#include "t
0450: 63 6c 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c  cl.h".#include <
0460: 65 72 72 6e 6f 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20  errno.h>../*.** 
0470: 53 6f 6d 65 20 61 64 64 69 74 69 6f 6e 61 6c 20  Some additional 
0480: 69 6e 63 6c 75 64 65 20 66 69 6c 65 73 20 61 72  include files ar
0490: 65 20 6e 65 65 64 65 64 20 69 66 20 74 68 69 73  e needed if this
04a0: 20 66 69 6c 65 20 69 73 20 6e 6f 74 0a 2a 2a 20   file is not.** 
04b0: 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20  appended to the 
04c0: 61 6d 61 6c 67 61 6d 61 74 69 6f 6e 2e 0a 2a 2f  amalgamation..*/
04d0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
04e0: 41 4d 41 4c 47 41 4d 41 54 49 4f 4e 0a 23 20 69  AMALGAMATION.# i
04f0: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 33 2e  nclude "sqlite3.
0500: 68 22 0a 23 20 69 6e 63 6c 75 64 65 20 3c 73 74  h".# include <st
0510: 64 6c 69 62 2e 68 3e 0a 23 20 69 6e 63 6c 75 64  dlib.h>.# includ
0520: 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a 23 20 69  e <string.h>.# i
0530: 6e 63 6c 75 64 65 20 3c 61 73 73 65 72 74 2e 68  nclude <assert.h
0540: 3e 0a 20 20 74 79 70 65 64 65 66 20 75 6e 73 69  >.  typedef unsi
0550: 67 6e 65 64 20 63 68 61 72 20 75 38 3b 0a 23 65  gned char u8;.#e
0560: 6e 64 69 66 0a 23 69 6e 63 6c 75 64 65 20 3c 63  ndif.#include <c
0570: 74 79 70 65 2e 68 3e 0a 0a 2f 2a 0a 20 2a 20 57  type.h>../*. * W
0580: 69 6e 64 6f 77 73 20 6e 65 65 64 73 20 74 6f 20  indows needs to 
0590: 6b 6e 6f 77 20 77 68 69 63 68 20 73 79 6d 62 6f  know which symbo
05a0: 6c 73 20 74 6f 20 65 78 70 6f 72 74 2e 20 20 55  ls to export.  U
05b0: 6e 69 78 20 64 6f 65 73 20 6e 6f 74 2e 0a 20 2a  nix does not.. *
05c0: 20 42 55 49 4c 44 5f 73 71 6c 69 74 65 20 73 68   BUILD_sqlite sh
05d0: 6f 75 6c 64 20 62 65 20 75 6e 64 65 66 69 6e 65  ould be undefine
05e0: 64 20 66 6f 72 20 55 6e 69 78 2e 0a 20 2a 2f 0a  d for Unix.. */.
05f0: 23 69 66 64 65 66 20 42 55 49 4c 44 5f 73 71 6c  #ifdef BUILD_sql
0600: 69 74 65 0a 23 75 6e 64 65 66 20 54 43 4c 5f 53  ite.#undef TCL_S
0610: 54 4f 52 41 47 45 5f 43 4c 41 53 53 0a 23 64 65  TORAGE_CLASS.#de
0620: 66 69 6e 65 20 54 43 4c 5f 53 54 4f 52 41 47 45  fine TCL_STORAGE
0630: 5f 43 4c 41 53 53 20 44 4c 4c 45 58 50 4f 52 54  _CLASS DLLEXPORT
0640: 0a 23 65 6e 64 69 66 20 2f 2a 20 42 55 49 4c 44  .#endif /* BUILD
0650: 5f 73 71 6c 69 74 65 20 2a 2f 0a 0a 23 64 65 66  _sqlite */..#def
0660: 69 6e 65 20 4e 55 4d 5f 50 52 45 50 41 52 45 44  ine NUM_PREPARED
0670: 5f 53 54 4d 54 53 20 31 30 0a 23 64 65 66 69 6e  _STMTS 10.#defin
0680: 65 20 4d 41 58 5f 50 52 45 50 41 52 45 44 5f 53  e MAX_PREPARED_S
0690: 54 4d 54 53 20 31 30 30 0a 0a 2f 2a 0a 2a 2a 20  TMTS 100../*.** 
06a0: 49 66 20 54 43 4c 20 75 73 65 73 20 55 54 46 2d  If TCL uses UTF-
06b0: 38 20 61 6e 64 20 53 51 4c 69 74 65 20 69 73 20  8 and SQLite is 
06c0: 63 6f 6e 66 69 67 75 72 65 64 20 74 6f 20 75 73  configured to us
06d0: 65 20 69 73 6f 38 38 35 39 2c 20 74 68 65 6e 20  e iso8859, then 
06e0: 77 65 0a 2a 2a 20 68 61 76 65 20 74 6f 20 64 6f  we.** have to do
06f0: 20 61 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20 77   a translation w
0700: 68 65 6e 20 67 6f 69 6e 67 20 62 65 74 77 65 65  hen going betwee
0710: 6e 20 74 68 65 20 74 77 6f 2e 20 20 53 65 74 20  n the two.  Set 
0720: 74 68 65 20 0a 2a 2a 20 55 54 46 5f 54 52 41 4e  the .** UTF_TRAN
0730: 53 4c 41 54 49 4f 4e 5f 4e 45 45 44 45 44 20 6d  SLATION_NEEDED m
0740: 61 63 72 6f 20 74 6f 20 69 6e 64 69 63 61 74 65  acro to indicate
0750: 20 74 68 61 74 20 77 65 20 6e 65 65 64 20 74 6f   that we need to
0760: 20 64 6f 0a 2a 2a 20 74 68 69 73 20 74 72 61 6e   do.** this tran
0770: 73 6c 61 74 69 6f 6e 2e 20 20 0a 2a 2f 0a 23 69  slation.  .*/.#i
0780: 66 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 55 54  f defined(TCL_UT
0790: 46 5f 4d 41 58 29 20 26 26 20 21 64 65 66 69 6e  F_MAX) && !defin
07a0: 65 64 28 53 51 4c 49 54 45 5f 55 54 46 38 29 0a  ed(SQLITE_UTF8).
07b0: 23 20 64 65 66 69 6e 65 20 55 54 46 5f 54 52 41  # define UTF_TRA
07c0: 4e 53 4c 41 54 49 4f 4e 5f 4e 45 45 44 45 44 20  NSLATION_NEEDED 
07d0: 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  1.#endif../*.** 
07e0: 4e 65 77 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e  New SQL function
07f0: 73 20 63 61 6e 20 62 65 20 63 72 65 61 74 65 64  s can be created
0800: 20 61 73 20 54 43 4c 20 73 63 72 69 70 74 73 2e   as TCL scripts.
0810: 20 20 45 61 63 68 20 73 75 63 68 20 66 75 6e 63    Each such func
0820: 74 69 6f 6e 0a 2a 2a 20 69 73 20 64 65 73 63 72  tion.** is descr
0830: 69 62 65 64 20 62 79 20 61 6e 20 69 6e 73 74 61  ibed by an insta
0840: 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
0850: 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 0a  wing structure..
0860: 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
0870: 74 20 53 71 6c 46 75 6e 63 20 53 71 6c 46 75 6e  t SqlFunc SqlFun
0880: 63 3b 0a 73 74 72 75 63 74 20 53 71 6c 46 75 6e  c;.struct SqlFun
0890: 63 20 7b 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  c {.  Tcl_Interp
08a0: 20 2a 69 6e 74 65 72 70 3b 20 20 20 2f 2a 20 54   *interp;   /* T
08b0: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
08c0: 20 74 6f 20 65 78 65 63 75 74 65 20 74 68 65 20   to execute the 
08d0: 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63  function */.  Tc
08e0: 6c 5f 4f 62 6a 20 2a 70 53 63 72 69 70 74 3b 20  l_Obj *pScript; 
08f0: 20 20 20 20 2f 2a 20 54 68 65 20 54 63 6c 5f 4f      /* The Tcl_O
0900: 62 6a 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  bj representatio
0910: 6e 20 6f 66 20 74 68 65 20 73 63 72 69 70 74 20  n of the script 
0920: 2a 2f 0a 20 20 69 6e 74 20 75 73 65 45 76 61 6c  */.  int useEval
0930: 4f 62 6a 76 3b 20 20 20 20 20 20 2f 2a 20 54 72  Objv;      /* Tr
0940: 75 65 20 69 66 20 69 74 20 69 73 20 73 61 66 65  ue if it is safe
0950: 20 74 6f 20 75 73 65 20 54 63 6c 5f 45 76 61 6c   to use Tcl_Eval
0960: 4f 62 6a 76 20 2a 2f 0a 20 20 63 68 61 72 20 2a  Objv */.  char *
0970: 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  zName;          
0980: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 69 73 20  /* Name of this 
0990: 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 53 71  function */.  Sq
09a0: 6c 46 75 6e 63 20 2a 70 4e 65 78 74 3b 20 20 20  lFunc *pNext;   
09b0: 20 20 20 20 2f 2a 20 4e 65 78 74 20 66 75 6e 63      /* Next func
09c0: 74 69 6f 6e 20 6f 6e 20 74 68 65 20 6c 69 73 74  tion on the list
09d0: 20 6f 66 20 74 68 65 6d 20 61 6c 6c 20 2a 2f 0a   of them all */.
09e0: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4e 65 77 20 63 6f  };../*.** New co
09f0: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
0a00: 73 20 66 75 6e 63 74 69 6f 6e 20 63 61 6e 20 62  s function can b
0a10: 65 20 63 72 65 61 74 65 64 20 61 73 20 54 43 4c  e created as TCL
0a20: 20 73 63 72 69 70 74 73 2e 20 20 45 61 63 68 20   scripts.  Each 
0a30: 73 75 63 68 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  such.** function
0a40: 20 69 73 20 64 65 73 63 72 69 62 65 64 20 62 79   is described by
0a50: 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   an instance of 
0a60: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
0a70: 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 74 79 70 65  ructure..*/.type
0a80: 64 65 66 20 73 74 72 75 63 74 20 53 71 6c 43 6f  def struct SqlCo
0a90: 6c 6c 61 74 65 20 53 71 6c 43 6f 6c 6c 61 74 65  llate SqlCollate
0aa0: 3b 0a 73 74 72 75 63 74 20 53 71 6c 43 6f 6c 6c  ;.struct SqlColl
0ab0: 61 74 65 20 7b 0a 20 20 54 63 6c 5f 49 6e 74 65  ate {.  Tcl_Inte
0ac0: 72 70 20 2a 69 6e 74 65 72 70 3b 20 20 20 2f 2a  rp *interp;   /*
0ad0: 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
0ae0: 65 74 20 74 6f 20 65 78 65 63 75 74 65 20 74 68  et to execute th
0af0: 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  e function */.  
0b00: 63 68 61 72 20 2a 7a 53 63 72 69 70 74 3b 20 20  char *zScript;  
0b10: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 63 72        /* The scr
0b20: 69 70 74 20 74 6f 20 62 65 20 72 75 6e 20 2a 2f  ipt to be run */
0b30: 0a 20 20 53 71 6c 43 6f 6c 6c 61 74 65 20 2a 70  .  SqlCollate *p
0b40: 4e 65 78 74 3b 20 20 20 20 2f 2a 20 4e 65 78 74  Next;    /* Next
0b50: 20 66 75 6e 63 74 69 6f 6e 20 6f 6e 20 74 68 65   function on the
0b60: 20 6c 69 73 74 20 6f 66 20 74 68 65 6d 20 61 6c   list of them al
0b70: 6c 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 50  l */.};../*.** P
0b80: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
0b90: 74 73 20 61 72 65 20 63 61 63 68 65 64 20 66 6f  ts are cached fo
0ba0: 72 20 66 61 73 74 65 72 20 65 78 65 63 75 74 69  r faster executi
0bb0: 6f 6e 2e 20 20 45 61 63 68 20 70 72 65 70 61 72  on.  Each prepar
0bc0: 65 64 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20  ed.** statement 
0bd0: 69 73 20 64 65 73 63 72 69 62 65 64 20 62 79 20  is described by 
0be0: 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  an instance of t
0bf0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  he following str
0c00: 75 63 74 75 72 65 2e 0a 2a 2f 0a 74 79 70 65 64  ucture..*/.typed
0c10: 65 66 20 73 74 72 75 63 74 20 53 71 6c 50 72 65  ef struct SqlPre
0c20: 70 61 72 65 64 53 74 6d 74 20 53 71 6c 50 72 65  paredStmt SqlPre
0c30: 70 61 72 65 64 53 74 6d 74 3b 0a 73 74 72 75 63  paredStmt;.struc
0c40: 74 20 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d  t SqlPreparedStm
0c50: 74 20 7b 0a 20 20 53 71 6c 50 72 65 70 61 72 65  t {.  SqlPrepare
0c60: 64 53 74 6d 74 20 2a 70 4e 65 78 74 3b 20 20 2f  dStmt *pNext;  /
0c70: 2a 20 4e 65 78 74 20 69 6e 20 6c 69 6e 6b 65 64  * Next in linked
0c80: 20 6c 69 73 74 20 2a 2f 0a 20 20 53 71 6c 50 72   list */.  SqlPr
0c90: 65 70 61 72 65 64 53 74 6d 74 20 2a 70 50 72 65  eparedStmt *pPre
0ca0: 76 3b 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20  v;  /* Previous 
0cb0: 6f 6e 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a 20  on the list */. 
0cc0: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
0cd0: 53 74 6d 74 3b 20 20 20 20 20 2f 2a 20 54 68 65  Stmt;     /* The
0ce0: 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
0cf0: 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 71  ent */.  int nSq
0d00: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
0d10: 20 20 2f 2a 20 63 68 61 72 73 20 69 6e 20 7a 53    /* chars in zS
0d20: 71 6c 5b 5d 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ql[] */.  const 
0d30: 63 68 61 72 20 2a 7a 53 71 6c 3b 20 20 20 20 20  char *zSql;     
0d40: 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 74 68     /* Text of th
0d50: 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  e SQL statement 
0d60: 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 72 6d 3b 20  */.  int nParm; 
0d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
0d80: 20 53 69 7a 65 20 6f 66 20 61 70 50 61 72 6d 20   Size of apParm 
0d90: 61 72 72 61 79 20 2a 2f 0a 20 20 54 63 6c 5f 4f  array */.  Tcl_O
0da0: 62 6a 20 2a 2a 61 70 50 61 72 6d 3b 20 20 20 20  bj **apParm;    
0db0: 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
0dc0: 72 65 66 65 72 65 6e 63 65 64 20 6f 62 6a 65 63  referenced objec
0dd0: 74 20 70 6f 69 6e 74 65 72 73 20 2a 2f 0a 7d 3b  t pointers */.};
0de0: 0a 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  ..typedef struct
0df0: 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c   IncrblobChannel
0e00: 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c   IncrblobChannel
0e10: 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 72 65 20 69  ;../*.** There i
0e20: 73 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f  s one instance o
0e30: 66 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  f this structure
0e40: 20 66 6f 72 20 65 61 63 68 20 53 51 4c 69 74 65   for each SQLite
0e50: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 74 68 61   database.** tha
0e60: 74 20 68 61 73 20 62 65 65 6e 20 6f 70 65 6e 65  t has been opene
0e70: 64 20 62 79 20 74 68 65 20 53 51 4c 69 74 65 20  d by the SQLite 
0e80: 54 43 4c 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a  TCL interface..*
0e90: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
0ea0: 20 53 71 6c 69 74 65 44 62 20 53 71 6c 69 74 65   SqliteDb Sqlite
0eb0: 44 62 3b 0a 73 74 72 75 63 74 20 53 71 6c 69 74  Db;.struct Sqlit
0ec0: 65 44 62 20 7b 0a 20 20 73 71 6c 69 74 65 33 20  eDb {.  sqlite3 
0ed0: 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  *db;            
0ee0: 20 20 20 2f 2a 20 54 68 65 20 22 72 65 61 6c 22     /* The "real"
0ef0: 20 64 61 74 61 62 61 73 65 20 73 74 72 75 63 74   database struct
0f00: 75 72 65 2e 20 4d 55 53 54 20 42 45 20 46 49 52  ure. MUST BE FIR
0f10: 53 54 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65  ST */.  Tcl_Inte
0f20: 72 70 20 2a 69 6e 74 65 72 70 3b 20 20 20 20 20  rp *interp;     
0f30: 20 20 20 2f 2a 20 54 68 65 20 69 6e 74 65 72 70     /* The interp
0f40: 72 65 74 65 72 20 75 73 65 64 20 66 6f 72 20 74  reter used for t
0f50: 68 69 73 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  his database */.
0f60: 20 20 63 68 61 72 20 2a 7a 42 75 73 79 3b 20 20    char *zBusy;  
0f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
0f80: 54 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63  The busy callbac
0f90: 6b 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 63  k routine */.  c
0fa0: 68 61 72 20 2a 7a 43 6f 6d 6d 69 74 3b 20 20 20  har *zCommit;   
0fb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
0fc0: 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20 63 61 6c   commit hook cal
0fd0: 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 20 2a 2f  lback routine */
0fe0: 0a 20 20 63 68 61 72 20 2a 7a 54 72 61 63 65 3b  .  char *zTrace;
0ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1000: 20 54 68 65 20 74 72 61 63 65 20 63 61 6c 6c 62   The trace callb
1010: 61 63 6b 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 20  ack routine */. 
1020: 20 63 68 61 72 20 2a 7a 50 72 6f 66 69 6c 65 3b   char *zProfile;
1030: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1040: 68 65 20 70 72 6f 66 69 6c 65 20 63 61 6c 6c 62  he profile callb
1050: 61 63 6b 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 20  ack routine */. 
1060: 20 63 68 61 72 20 2a 7a 50 72 6f 67 72 65 73 73   char *zProgress
1070: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ;           /* T
1080: 68 65 20 70 72 6f 67 72 65 73 73 20 63 61 6c 6c  he progress call
1090: 62 61 63 6b 20 72 6f 75 74 69 6e 65 20 2a 2f 0a  back routine */.
10a0: 20 20 63 68 61 72 20 2a 7a 41 75 74 68 3b 20 20    char *zAuth;  
10b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10c0: 54 68 65 20 61 75 74 68 6f 72 69 7a 61 74 69 6f  The authorizatio
10d0: 6e 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69  n callback routi
10e0: 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 64 69 73 61  ne */.  int disa
10f0: 62 6c 65 41 75 74 68 3b 20 20 20 20 20 20 20 20  bleAuth;        
1100: 20 20 20 2f 2a 20 44 69 73 61 62 6c 65 20 74 68     /* Disable th
1110: 65 20 61 75 74 68 6f 72 69 7a 65 72 20 69 66 20  e authorizer if 
1120: 69 74 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 63  it exists */.  c
1130: 68 61 72 20 2a 7a 4e 75 6c 6c 3b 20 20 20 20 20  har *zNull;     
1140: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78            /* Tex
1150: 74 20 74 6f 20 73 75 62 73 74 69 74 75 74 65 20  t to substitute 
1160: 66 6f 72 20 61 6e 20 53 51 4c 20 4e 55 4c 4c 20  for an SQL NULL 
1170: 76 61 6c 75 65 20 2a 2f 0a 20 20 53 71 6c 46 75  value */.  SqlFu
1180: 6e 63 20 2a 70 46 75 6e 63 3b 20 20 20 20 20 20  nc *pFunc;      
1190: 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
11a0: 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 73 20 2a   SQL functions *
11b0: 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 55 70  /.  Tcl_Obj *pUp
11c0: 64 61 74 65 48 6f 6f 6b 3b 20 20 20 20 20 20 2f  dateHook;      /
11d0: 2a 20 55 70 64 61 74 65 20 68 6f 6f 6b 20 73 63  * Update hook sc
11e0: 72 69 70 74 20 28 69 66 20 61 6e 79 29 20 2a 2f  ript (if any) */
11f0: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 6f 6c  .  Tcl_Obj *pRol
1200: 6c 62 61 63 6b 48 6f 6f 6b 3b 20 20 20 20 2f 2a  lbackHook;    /*
1210: 20 52 6f 6c 6c 62 61 63 6b 20 68 6f 6f 6b 20 73   Rollback hook s
1220: 63 72 69 70 74 20 28 69 66 20 61 6e 79 29 20 2a  cript (if any) *
1230: 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 57 61  /.  Tcl_Obj *pWa
1240: 6c 48 6f 6f 6b 3b 20 20 20 20 20 20 20 20 20 2f  lHook;         /
1250: 2a 20 57 41 4c 20 68 6f 6f 6b 20 73 63 72 69 70  * WAL hook scrip
1260: 74 20 28 69 66 20 61 6e 79 29 20 2a 2f 0a 20 20  t (if any) */.  
1270: 54 63 6c 5f 4f 62 6a 20 2a 70 55 6e 6c 6f 63 6b  Tcl_Obj *pUnlock
1280: 4e 6f 74 69 66 79 3b 20 20 20 20 2f 2a 20 55 6e  Notify;    /* Un
1290: 6c 6f 63 6b 20 6e 6f 74 69 66 79 20 73 63 72 69  lock notify scri
12a0: 70 74 20 28 69 66 20 61 6e 79 29 20 2a 2f 0a 20  pt (if any) */. 
12b0: 20 53 71 6c 43 6f 6c 6c 61 74 65 20 2a 70 43 6f   SqlCollate *pCo
12c0: 6c 6c 61 74 65 3b 20 20 20 20 20 20 2f 2a 20 4c  llate;      /* L
12d0: 69 73 74 20 6f 66 20 53 51 4c 20 63 6f 6c 6c 61  ist of SQL colla
12e0: 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 73 20 2a  tion functions *
12f0: 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
1300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1310: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 6f 66  * Return code of
1320: 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 73 71 6c   most recent sql
1330: 69 74 65 33 5f 65 78 65 63 28 29 20 2a 2f 0a 20  ite3_exec() */. 
1340: 20 54 63 6c 5f 4f 62 6a 20 2a 70 43 6f 6c 6c 61   Tcl_Obj *pColla
1350: 74 65 4e 65 65 64 65 64 3b 20 20 20 2f 2a 20 43  teNeeded;   /* C
1360: 6f 6c 6c 61 74 69 6f 6e 20 6e 65 65 64 65 64 20  ollation needed 
1370: 73 63 72 69 70 74 20 2a 2f 0a 20 20 53 71 6c 50  script */.  SqlP
1380: 72 65 70 61 72 65 64 53 74 6d 74 20 2a 73 74 6d  reparedStmt *stm
1390: 74 4c 69 73 74 3b 20 2f 2a 20 4c 69 73 74 20 6f  tList; /* List o
13a0: 66 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  f prepared state
13b0: 6d 65 6e 74 73 2a 2f 0a 20 20 53 71 6c 50 72 65  ments*/.  SqlPre
13c0: 70 61 72 65 64 53 74 6d 74 20 2a 73 74 6d 74 4c  paredStmt *stmtL
13d0: 61 73 74 3b 20 2f 2a 20 4c 61 73 74 20 73 74 61  ast; /* Last sta
13e0: 74 65 6d 65 6e 74 20 69 6e 20 74 68 65 20 6c 69  tement in the li
13f0: 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6d 61 78 53  st */.  int maxS
1400: 74 6d 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  tmt;            
1410: 20 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 6d     /* The next m
1420: 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  aximum number of
1430: 20 73 74 6d 74 4c 69 73 74 20 2a 2f 0a 20 20 69   stmtList */.  i
1440: 6e 74 20 6e 53 74 6d 74 3b 20 20 20 20 20 20 20  nt nStmt;       
1450: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1460: 62 65 72 20 6f 66 20 73 74 61 74 65 6d 65 6e 74  ber of statement
1470: 73 20 69 6e 20 73 74 6d 74 4c 69 73 74 20 2a 2f  s in stmtList */
1480: 0a 20 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e  .  IncrblobChann
1490: 65 6c 20 2a 70 49 6e 63 72 62 6c 6f 62 3b 2f 2a  el *pIncrblob;/*
14a0: 20 4c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20   Linked list of 
14b0: 6f 70 65 6e 20 69 6e 63 72 62 6c 6f 62 20 63 68  open incrblob ch
14c0: 61 6e 6e 65 6c 73 20 2a 2f 0a 20 20 69 6e 74 20  annels */.  int 
14d0: 6e 53 74 65 70 2c 20 6e 53 6f 72 74 2c 20 6e 49  nStep, nSort, nI
14e0: 6e 64 65 78 3b 20 20 2f 2a 20 53 74 61 74 69 73  ndex;  /* Statis
14f0: 74 69 63 73 20 66 6f 72 20 6d 6f 73 74 20 72 65  tics for most re
1500: 63 65 6e 74 20 6f 70 65 72 61 74 69 6f 6e 20 2a  cent operation *
1510: 2f 0a 20 20 69 6e 74 20 6e 54 72 61 6e 73 61 63  /.  int nTransac
1520: 74 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 2f  tion;          /
1530: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6e 65 73 74  * Number of nest
1540: 65 64 20 5b 74 72 61 6e 73 61 63 74 69 6f 6e 5d  ed [transaction]
1550: 20 6d 65 74 68 6f 64 73 20 2a 2f 0a 7d 3b 0a 0a   methods */.};..
1560: 73 74 72 75 63 74 20 49 6e 63 72 62 6c 6f 62 43  struct IncrblobC
1570: 68 61 6e 6e 65 6c 20 7b 0a 20 20 73 71 6c 69 74  hannel {.  sqlit
1580: 65 33 5f 62 6c 6f 62 20 2a 70 42 6c 6f 62 3b 20  e3_blob *pBlob; 
1590: 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 20       /* sqlite3 
15a0: 62 6c 6f 62 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  blob handle */. 
15b0: 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 3b 20   SqliteDb *pDb; 
15c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73             /* As
15d0: 73 6f 63 69 61 74 65 64 20 64 61 74 61 62 61 73  sociated databas
15e0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
15f0: 20 20 69 6e 74 20 69 53 65 65 6b 3b 20 20 20 20    int iSeek;    
1600: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
1610: 75 72 72 65 6e 74 20 73 65 65 6b 20 6f 66 66 73  urrent seek offs
1620: 65 74 20 2a 2f 0a 20 20 54 63 6c 5f 43 68 61 6e  et */.  Tcl_Chan
1630: 6e 65 6c 20 63 68 61 6e 6e 65 6c 3b 20 20 20 20  nel channel;    
1640: 20 20 2f 2a 20 43 68 61 6e 6e 65 6c 20 69 64 65    /* Channel ide
1650: 6e 74 69 66 69 65 72 20 2a 2f 0a 20 20 49 6e 63  ntifier */.  Inc
1660: 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 70 4e  rblobChannel *pN
1670: 65 78 74 3b 20 20 20 2f 2a 20 4c 69 6e 6b 65 64  ext;   /* Linked
1680: 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 6f 70 65   list of all ope
1690: 6e 20 69 6e 63 72 62 6c 6f 62 20 63 68 61 6e 6e  n incrblob chann
16a0: 65 6c 73 20 2a 2f 0a 20 20 49 6e 63 72 62 6c 6f  els */.  Incrblo
16b0: 62 43 68 61 6e 6e 65 6c 20 2a 70 50 72 65 76 3b  bChannel *pPrev;
16c0: 20 20 20 2f 2a 20 4c 69 6e 6b 65 64 20 6c 69 73     /* Linked lis
16d0: 74 20 6f 66 20 61 6c 6c 20 6f 70 65 6e 20 69 6e  t of all open in
16e0: 63 72 62 6c 6f 62 20 63 68 61 6e 6e 65 6c 73 20  crblob channels 
16f0: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  */.};../*.** Com
1700: 70 75 74 65 20 61 20 73 74 72 69 6e 67 20 6c 65  pute a string le
1710: 6e 67 74 68 20 74 68 61 74 20 69 73 20 6c 69 6d  ngth that is lim
1720: 69 74 65 64 20 74 6f 20 77 68 61 74 20 63 61 6e  ited to what can
1730: 20 62 65 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a   be stored in.**
1740: 20 6c 6f 77 65 72 20 33 30 20 62 69 74 73 20 6f   lower 30 bits o
1750: 66 20 61 20 33 32 2d 62 69 74 20 73 69 67 6e 65  f a 32-bit signe
1760: 64 20 69 6e 74 65 67 65 72 2e 0a 2a 2f 0a 73 74  d integer..*/.st
1770: 61 74 69 63 20 69 6e 74 20 73 74 72 6c 65 6e 33  atic int strlen3
1780: 30 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29  0(const char *z)
1790: 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
17a0: 7a 32 20 3d 20 7a 3b 0a 20 20 77 68 69 6c 65 28  z2 = z;.  while(
17b0: 20 2a 7a 32 20 29 7b 20 7a 32 2b 2b 3b 20 7d 0a   *z2 ){ z2++; }.
17c0: 20 20 72 65 74 75 72 6e 20 30 78 33 66 66 66 66    return 0x3ffff
17d0: 66 66 66 20 26 20 28 69 6e 74 29 28 7a 32 20 2d  fff & (int)(z2 -
17e0: 20 7a 29 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66   z);.}...#ifndef
17f0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43   SQLITE_OMIT_INC
1800: 52 42 4c 4f 42 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  RBLOB./*.** Clos
1810: 65 20 61 6c 6c 20 69 6e 63 72 62 6c 6f 62 20 63  e all incrblob c
1820: 68 61 6e 6e 65 6c 73 20 6f 70 65 6e 65 64 20 75  hannels opened u
1830: 73 69 6e 67 20 64 61 74 61 62 61 73 65 20 63 6f  sing database co
1840: 6e 6e 65 63 74 69 6f 6e 20 70 44 62 2e 0a 2a 2a  nnection pDb..**
1850: 20 54 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20   This is called 
1860: 77 68 65 6e 20 73 68 75 74 74 69 6e 67 20 64 6f  when shutting do
1870: 77 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  wn the database 
1880: 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  connection..*/.s
1890: 74 61 74 69 63 20 76 6f 69 64 20 63 6c 6f 73 65  tatic void close
18a0: 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 73  IncrblobChannels
18b0: 28 53 71 6c 69 74 65 44 62 20 2a 70 44 62 29 7b  (SqliteDb *pDb){
18c0: 0a 20 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e  .  IncrblobChann
18d0: 65 6c 20 2a 70 3b 0a 20 20 49 6e 63 72 62 6c 6f  el *p;.  Incrblo
18e0: 62 43 68 61 6e 6e 65 6c 20 2a 70 4e 65 78 74 3b  bChannel *pNext;
18f0: 0a 0a 20 20 66 6f 72 28 70 3d 70 44 62 2d 3e 70  ..  for(p=pDb->p
1900: 49 6e 63 72 62 6c 6f 62 3b 20 70 3b 20 70 3d 70  Incrblob; p; p=p
1910: 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74  Next){.    pNext
1920: 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 0a 20 20   = p->pNext;..  
1930: 20 20 2f 2a 20 4e 6f 74 65 3a 20 43 61 6c 6c 69    /* Note: Calli
1940: 6e 67 20 75 6e 72 65 67 69 73 74 65 72 20 68 65  ng unregister he
1950: 72 65 20 63 61 6c 6c 20 54 63 6c 5f 43 6c 6f 73  re call Tcl_Clos
1960: 65 20 6f 6e 20 74 68 65 20 69 6e 63 72 62 6c 6f  e on the incrblo
1970: 62 20 63 68 61 6e 6e 65 6c 2c 20 0a 20 20 20 20  b channel, .    
1980: 2a 2a 20 77 68 69 63 68 20 64 65 6c 65 74 65 73  ** which deletes
1990: 20 74 68 65 20 49 6e 63 72 62 6c 6f 62 43 68 61   the IncrblobCha
19a0: 6e 6e 65 6c 20 73 74 72 75 63 74 75 72 65 20 61  nnel structure a
19b0: 74 20 2a 70 2e 20 53 6f 20 64 6f 20 6e 6f 74 0a  t *p. So do not.
19c0: 20 20 20 20 2a 2a 20 63 61 6c 6c 20 54 63 6c 5f      ** call Tcl_
19d0: 46 72 65 65 28 29 20 68 65 72 65 2e 0a 20 20 20  Free() here..   
19e0: 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 55 6e 72 65   */.    Tcl_Unre
19f0: 67 69 73 74 65 72 43 68 61 6e 6e 65 6c 28 70 44  gisterChannel(pD
1a00: 62 2d 3e 69 6e 74 65 72 70 2c 20 70 2d 3e 63 68  b->interp, p->ch
1a10: 61 6e 6e 65 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  annel);.  }.}../
1a20: 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 69 6e  *.** Close an in
1a30: 63 72 65 6d 65 6e 74 61 6c 20 62 6c 6f 62 20 63  cremental blob c
1a40: 68 61 6e 6e 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69  hannel..*/.stati
1a50: 63 20 69 6e 74 20 69 6e 63 72 62 6c 6f 62 43 6c  c int incrblobCl
1a60: 6f 73 65 28 43 6c 69 65 6e 74 44 61 74 61 20 69  ose(ClientData i
1a70: 6e 73 74 61 6e 63 65 44 61 74 61 2c 20 54 63 6c  nstanceData, Tcl
1a80: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29  _Interp *interp)
1a90: 7b 0a 20 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e  {.  IncrblobChan
1aa0: 6e 65 6c 20 2a 70 20 3d 20 28 49 6e 63 72 62 6c  nel *p = (Incrbl
1ab0: 6f 62 43 68 61 6e 6e 65 6c 20 2a 29 69 6e 73 74  obChannel *)inst
1ac0: 61 6e 63 65 44 61 74 61 3b 0a 20 20 69 6e 74 20  anceData;.  int 
1ad0: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f  rc = sqlite3_blo
1ae0: 62 5f 63 6c 6f 73 65 28 70 2d 3e 70 42 6c 6f 62  b_close(p->pBlob
1af0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  );.  sqlite3 *db
1b00: 20 3d 20 70 2d 3e 70 44 62 2d 3e 64 62 3b 0a 0a   = p->pDb->db;..
1b10: 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20    /* Remove the 
1b20: 63 68 61 6e 6e 65 6c 20 66 72 6f 6d 20 74 68 65  channel from the
1b30: 20 53 71 6c 69 74 65 44 62 2e 70 49 6e 63 72 62   SqliteDb.pIncrb
1b40: 6c 6f 62 20 6c 69 73 74 2e 20 2a 2f 0a 20 20 69  lob list. */.  i
1b50: 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20  f( p->pNext ){. 
1b60: 20 20 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72     p->pNext->pPr
1b70: 65 76 20 3d 20 70 2d 3e 70 50 72 65 76 3b 0a 20  ev = p->pPrev;. 
1b80: 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 65   }.  if( p->pPre
1b90: 76 20 29 7b 0a 20 20 20 20 70 2d 3e 70 50 72 65  v ){.    p->pPre
1ba0: 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e  v->pNext = p->pN
1bb0: 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ext;.  }.  if( p
1bc0: 2d 3e 70 44 62 2d 3e 70 49 6e 63 72 62 6c 6f 62  ->pDb->pIncrblob
1bd0: 3d 3d 70 20 29 7b 0a 20 20 20 20 70 2d 3e 70 44  ==p ){.    p->pD
1be0: 62 2d 3e 70 49 6e 63 72 62 6c 6f 62 20 3d 20 70  b->pIncrblob = p
1bf0: 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 0a 20 20  ->pNext;.  }..  
1c00: 2f 2a 20 46 72 65 65 20 74 68 65 20 49 6e 63 72  /* Free the Incr
1c10: 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 73 74 72 75  blobChannel stru
1c20: 63 74 75 72 65 20 2a 2f 0a 20 20 54 63 6c 5f 46  cture */.  Tcl_F
1c30: 72 65 65 28 28 63 68 61 72 20 2a 29 70 29 3b 0a  ree((char *)p);.
1c40: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
1c50: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f  E_OK ){.    Tcl_
1c60: 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
1c70: 2c 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  , (char *)sqlite
1c80: 33 5f 65 72 72 6d 73 67 28 64 62 29 2c 20 54 43  3_errmsg(db), TC
1c90: 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 20  L_VOLATILE);.   
1ca0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1cb0: 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  R;.  }.  return 
1cc0: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
1cd0: 20 52 65 61 64 20 64 61 74 61 20 66 72 6f 6d 20   Read data from 
1ce0: 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 62  an incremental b
1cf0: 6c 6f 62 20 63 68 61 6e 6e 65 6c 2e 0a 2a 2f 0a  lob channel..*/.
1d00: 73 74 61 74 69 63 20 69 6e 74 20 69 6e 63 72 62  static int incrb
1d10: 6c 6f 62 49 6e 70 75 74 28 0a 20 20 43 6c 69 65  lobInput(.  Clie
1d20: 6e 74 44 61 74 61 20 69 6e 73 74 61 6e 63 65 44  ntData instanceD
1d30: 61 74 61 2c 20 0a 20 20 63 68 61 72 20 2a 62 75  ata, .  char *bu
1d40: 66 2c 20 0a 20 20 69 6e 74 20 62 75 66 53 69 7a  f, .  int bufSiz
1d50: 65 2c 0a 20 20 69 6e 74 20 2a 65 72 72 6f 72 43  e,.  int *errorC
1d60: 6f 64 65 50 74 72 0a 29 7b 0a 20 20 49 6e 63 72  odePtr.){.  Incr
1d70: 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 70 20 3d  blobChannel *p =
1d80: 20 28 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65   (IncrblobChanne
1d90: 6c 20 2a 29 69 6e 73 74 61 6e 63 65 44 61 74 61  l *)instanceData
1da0: 3b 0a 20 20 69 6e 74 20 6e 52 65 61 64 20 3d 20  ;.  int nRead = 
1db0: 62 75 66 53 69 7a 65 3b 20 20 20 20 20 20 20 20  bufSize;        
1dc0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
1dd0: 74 65 73 20 74 6f 20 72 65 61 64 20 2a 2f 0a 20  tes to read */. 
1de0: 20 69 6e 74 20 6e 42 6c 6f 62 3b 20 20 20 20 20   int nBlob;     
1df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e00: 20 54 6f 74 61 6c 20 73 69 7a 65 20 6f 66 20 74   Total size of t
1e10: 68 65 20 62 6c 6f 62 20 2a 2f 0a 20 20 69 6e 74  he blob */.  int
1e20: 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
1e30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c            /* sql
1e40: 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 2a  ite error code *
1e50: 2f 0a 0a 20 20 6e 42 6c 6f 62 20 3d 20 73 71 6c  /..  nBlob = sql
1e60: 69 74 65 33 5f 62 6c 6f 62 5f 62 79 74 65 73 28  ite3_blob_bytes(
1e70: 70 2d 3e 70 42 6c 6f 62 29 3b 0a 20 20 69 66 28  p->pBlob);.  if(
1e80: 20 28 70 2d 3e 69 53 65 65 6b 2b 6e 52 65 61 64   (p->iSeek+nRead
1e90: 29 3e 6e 42 6c 6f 62 20 29 7b 0a 20 20 20 20 6e  )>nBlob ){.    n
1ea0: 52 65 61 64 20 3d 20 6e 42 6c 6f 62 2d 70 2d 3e  Read = nBlob-p->
1eb0: 69 53 65 65 6b 3b 0a 20 20 7d 0a 20 20 69 66 28  iSeek;.  }.  if(
1ec0: 20 6e 52 65 61 64 3c 3d 30 20 29 7b 0a 20 20 20   nRead<=0 ){.   
1ed0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a   return 0;.  }..
1ee0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62    rc = sqlite3_b
1ef0: 6c 6f 62 5f 72 65 61 64 28 70 2d 3e 70 42 6c 6f  lob_read(p->pBlo
1f00: 62 2c 20 28 76 6f 69 64 20 2a 29 62 75 66 2c 20  b, (void *)buf, 
1f10: 6e 52 65 61 64 2c 20 70 2d 3e 69 53 65 65 6b 29  nRead, p->iSeek)
1f20: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
1f30: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 65 72  TE_OK ){.    *er
1f40: 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 72 63 3b  rorCodePtr = rc;
1f50: 0a 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a  .    return -1;.
1f60: 20 20 7d 0a 0a 20 20 70 2d 3e 69 53 65 65 6b 20    }..  p->iSeek 
1f70: 2b 3d 20 6e 52 65 61 64 3b 0a 20 20 72 65 74 75  += nRead;.  retu
1f80: 72 6e 20 6e 52 65 61 64 3b 0a 7d 0a 0a 2f 2a 0a  rn nRead;.}../*.
1f90: 2a 2a 20 57 72 69 74 65 20 64 61 74 61 20 74 6f  ** Write data to
1fa0: 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20   an incremental 
1fb0: 62 6c 6f 62 20 63 68 61 6e 6e 65 6c 2e 0a 2a 2f  blob channel..*/
1fc0: 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 63 72  .static int incr
1fd0: 62 6c 6f 62 4f 75 74 70 75 74 28 0a 20 20 43 6c  blobOutput(.  Cl
1fe0: 69 65 6e 74 44 61 74 61 20 69 6e 73 74 61 6e 63  ientData instanc
1ff0: 65 44 61 74 61 2c 20 0a 20 20 43 4f 4e 53 54 20  eData, .  CONST 
2000: 63 68 61 72 20 2a 62 75 66 2c 20 0a 20 20 69 6e  char *buf, .  in
2010: 74 20 74 6f 57 72 69 74 65 2c 0a 20 20 69 6e 74  t toWrite,.  int
2020: 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 0a 29   *errorCodePtr.)
2030: 7b 0a 20 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e  {.  IncrblobChan
2040: 6e 65 6c 20 2a 70 20 3d 20 28 49 6e 63 72 62 6c  nel *p = (Incrbl
2050: 6f 62 43 68 61 6e 6e 65 6c 20 2a 29 69 6e 73 74  obChannel *)inst
2060: 61 6e 63 65 44 61 74 61 3b 0a 20 20 69 6e 74 20  anceData;.  int 
2070: 6e 57 72 69 74 65 20 3d 20 74 6f 57 72 69 74 65  nWrite = toWrite
2080: 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62  ;        /* Numb
2090: 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 77  er of bytes to w
20a0: 72 69 74 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 42  rite */.  int nB
20b0: 6c 6f 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  lob;            
20c0: 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20         /* Total 
20d0: 73 69 7a 65 20 6f 66 20 74 68 65 20 62 6c 6f 62  size of the blob
20e0: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
20f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2100: 20 20 20 2f 2a 20 73 71 6c 69 74 65 20 65 72 72     /* sqlite err
2110: 6f 72 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 6e 42  or code */..  nB
2120: 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c  lob = sqlite3_bl
2130: 6f 62 5f 62 79 74 65 73 28 70 2d 3e 70 42 6c 6f  ob_bytes(p->pBlo
2140: 62 29 3b 0a 20 20 69 66 28 20 28 70 2d 3e 69 53  b);.  if( (p->iS
2150: 65 65 6b 2b 6e 57 72 69 74 65 29 3e 6e 42 6c 6f  eek+nWrite)>nBlo
2160: 62 20 29 7b 0a 20 20 20 20 2a 65 72 72 6f 72 43  b ){.    *errorC
2170: 6f 64 65 50 74 72 20 3d 20 45 49 4e 56 41 4c 3b  odePtr = EINVAL;
2180: 0a 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a  .    return -1;.
2190: 20 20 7d 0a 20 20 69 66 28 20 6e 57 72 69 74 65    }.  if( nWrite
21a0: 3c 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  <=0 ){.    retur
21b0: 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d  n 0;.  }..  rc =
21c0: 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 77 72   sqlite3_blob_wr
21d0: 69 74 65 28 70 2d 3e 70 42 6c 6f 62 2c 20 28 76  ite(p->pBlob, (v
21e0: 6f 69 64 20 2a 29 62 75 66 2c 20 6e 57 72 69 74  oid *)buf, nWrit
21f0: 65 2c 20 70 2d 3e 69 53 65 65 6b 29 3b 0a 20 20  e, p->iSeek);.  
2200: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2210: 4b 20 29 7b 0a 20 20 20 20 2a 65 72 72 6f 72 43  K ){.    *errorC
2220: 6f 64 65 50 74 72 20 3d 20 45 49 4f 3b 0a 20 20  odePtr = EIO;.  
2230: 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d    return -1;.  }
2240: 0a 0a 20 20 70 2d 3e 69 53 65 65 6b 20 2b 3d 20  ..  p->iSeek += 
2250: 6e 57 72 69 74 65 3b 0a 20 20 72 65 74 75 72 6e  nWrite;.  return
2260: 20 6e 57 72 69 74 65 3b 0a 7d 0a 0a 2f 2a 0a 2a   nWrite;.}../*.*
2270: 2a 20 53 65 65 6b 20 61 6e 20 69 6e 63 72 65 6d  * Seek an increm
2280: 65 6e 74 61 6c 20 62 6c 6f 62 20 63 68 61 6e 6e  ental blob chann
2290: 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  el..*/.static in
22a0: 74 20 69 6e 63 72 62 6c 6f 62 53 65 65 6b 28 0a  t incrblobSeek(.
22b0: 20 20 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73    ClientData ins
22c0: 74 61 6e 63 65 44 61 74 61 2c 20 0a 20 20 6c 6f  tanceData, .  lo
22d0: 6e 67 20 6f 66 66 73 65 74 2c 0a 20 20 69 6e 74  ng offset,.  int
22e0: 20 73 65 65 6b 4d 6f 64 65 2c 0a 20 20 69 6e 74   seekMode,.  int
22f0: 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 0a 29   *errorCodePtr.)
2300: 7b 0a 20 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e  {.  IncrblobChan
2310: 6e 65 6c 20 2a 70 20 3d 20 28 49 6e 63 72 62 6c  nel *p = (Incrbl
2320: 6f 62 43 68 61 6e 6e 65 6c 20 2a 29 69 6e 73 74  obChannel *)inst
2330: 61 6e 63 65 44 61 74 61 3b 0a 0a 20 20 73 77 69  anceData;..  swi
2340: 74 63 68 28 20 73 65 65 6b 4d 6f 64 65 20 29 7b  tch( seekMode ){
2350: 0a 20 20 20 20 63 61 73 65 20 53 45 45 4b 5f 53  .    case SEEK_S
2360: 45 54 3a 0a 20 20 20 20 20 20 70 2d 3e 69 53 65  ET:.      p->iSe
2370: 65 6b 20 3d 20 6f 66 66 73 65 74 3b 0a 20 20 20  ek = offset;.   
2380: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
2390: 73 65 20 53 45 45 4b 5f 43 55 52 3a 0a 20 20 20  se SEEK_CUR:.   
23a0: 20 20 20 70 2d 3e 69 53 65 65 6b 20 2b 3d 20 6f     p->iSeek += o
23b0: 66 66 73 65 74 3b 0a 20 20 20 20 20 20 62 72 65  ffset;.      bre
23c0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 45 45  ak;.    case SEE
23d0: 4b 5f 45 4e 44 3a 0a 20 20 20 20 20 20 70 2d 3e  K_END:.      p->
23e0: 69 53 65 65 6b 20 3d 20 73 71 6c 69 74 65 33 5f  iSeek = sqlite3_
23f0: 62 6c 6f 62 5f 62 79 74 65 73 28 70 2d 3e 70 42  blob_bytes(p->pB
2400: 6c 6f 62 29 20 2b 20 6f 66 66 73 65 74 3b 0a 20  lob) + offset;. 
2410: 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20       break;..   
2420: 20 64 65 66 61 75 6c 74 3a 20 61 73 73 65 72 74   default: assert
2430: 28 21 22 42 61 64 20 73 65 65 6b 4d 6f 64 65 22  (!"Bad seekMode"
2440: 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
2450: 20 70 2d 3e 69 53 65 65 6b 3b 0a 7d 0a 0a 0a 73   p->iSeek;.}...s
2460: 74 61 74 69 63 20 76 6f 69 64 20 69 6e 63 72 62  tatic void incrb
2470: 6c 6f 62 57 61 74 63 68 28 43 6c 69 65 6e 74 44  lobWatch(ClientD
2480: 61 74 61 20 69 6e 73 74 61 6e 63 65 44 61 74 61  ata instanceData
2490: 2c 20 69 6e 74 20 6d 6f 64 65 29 7b 20 0a 20 20  , int mode){ .  
24a0: 2f 2a 20 4e 4f 2d 4f 50 20 2a 2f 20 0a 7d 0a 73  /* NO-OP */ .}.s
24b0: 74 61 74 69 63 20 69 6e 74 20 69 6e 63 72 62 6c  tatic int incrbl
24c0: 6f 62 48 61 6e 64 6c 65 28 43 6c 69 65 6e 74 44  obHandle(ClientD
24d0: 61 74 61 20 69 6e 73 74 61 6e 63 65 44 61 74 61  ata instanceData
24e0: 2c 20 69 6e 74 20 64 69 72 2c 20 43 6c 69 65 6e  , int dir, Clien
24f0: 74 44 61 74 61 20 2a 68 50 74 72 29 7b 0a 20 20  tData *hPtr){.  
2500: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
2510: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 54 63 6c 5f  ;.}..static Tcl_
2520: 43 68 61 6e 6e 65 6c 54 79 70 65 20 49 6e 63 72  ChannelType Incr
2530: 62 6c 6f 62 43 68 61 6e 6e 65 6c 54 79 70 65 20  blobChannelType 
2540: 3d 20 7b 0a 20 20 22 69 6e 63 72 62 6c 6f 62 22  = {.  "incrblob"
2550: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2560: 20 20 20 20 20 20 20 20 20 2f 2a 20 74 79 70 65           /* type
2570: 4e 61 6d 65 20 20 20 20 20 20 20 20 20 20 20 20  Name            
2580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2590: 20 2a 2f 0a 20 20 54 43 4c 5f 43 48 41 4e 4e 45   */.  TCL_CHANNE
25a0: 4c 5f 56 45 52 53 49 4f 4e 5f 32 2c 20 20 20 20  L_VERSION_2,    
25b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 76 65 72 73           /* vers
25c0: 69 6f 6e 20 20 20 20 20 20 20 20 20 20 20 20 20  ion             
25d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25e0: 20 2a 2f 0a 20 20 69 6e 63 72 62 6c 6f 62 43 6c   */.  incrblobCl
25f0: 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ose,            
2600: 20 20 20 20 20 20 20 20 20 2f 2a 20 63 6c 6f 73           /* clos
2610: 65 50 72 6f 63 20 20 20 20 20 20 20 20 20 20 20  eProc           
2620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2630: 20 2a 2f 0a 20 20 69 6e 63 72 62 6c 6f 62 49 6e   */.  incrblobIn
2640: 70 75 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  put,            
2650: 20 20 20 20 20 20 20 20 20 2f 2a 20 69 6e 70 75           /* inpu
2660: 74 50 72 6f 63 20 20 20 20 20 20 20 20 20 20 20  tProc           
2670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2680: 20 2a 2f 0a 20 20 69 6e 63 72 62 6c 6f 62 4f 75   */.  incrblobOu
2690: 74 70 75 74 2c 20 20 20 20 20 20 20 20 20 20 20  tput,           
26a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 75 74 70           /* outp
26b0: 75 74 50 72 6f 63 20 20 20 20 20 20 20 20 20 20  utProc          
26c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26d0: 20 2a 2f 0a 20 20 69 6e 63 72 62 6c 6f 62 53 65   */.  incrblobSe
26e0: 65 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ek,             
26f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 73 65 65 6b           /* seek
2700: 50 72 6f 63 20 20 20 20 20 20 20 20 20 20 20 20  Proc            
2710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2720: 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20   */.  0,        
2730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2740: 20 20 20 20 20 20 20 20 20 2f 2a 20 73 65 74 4f           /* setO
2750: 70 74 69 6f 6e 50 72 6f 63 20 20 20 20 20 20 20  ptionProc       
2760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2770: 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20   */.  0,        
2780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2790: 20 20 20 20 20 20 20 20 20 2f 2a 20 67 65 74 4f           /* getO
27a0: 70 74 69 6f 6e 50 72 6f 63 20 20 20 20 20 20 20  ptionProc       
27b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27c0: 20 2a 2f 0a 20 20 69 6e 63 72 62 6c 6f 62 57 61   */.  incrblobWa
27d0: 74 63 68 2c 20 20 20 20 20 20 20 20 20 20 20 20  tch,            
27e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 77 61 74 63           /* watc
27f0: 68 50 72 6f 63 20 28 74 68 69 73 20 69 73 20 61  hProc (this is a
2800: 20 6e 6f 2d 6f 70 29 20 20 20 20 20 20 20 20 20   no-op)         
2810: 20 2a 2f 0a 20 20 69 6e 63 72 62 6c 6f 62 48 61   */.  incrblobHa
2820: 6e 64 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20  ndle,           
2830: 20 20 20 20 20 20 20 20 20 2f 2a 20 67 65 74 48           /* getH
2840: 61 6e 64 6c 65 50 72 6f 63 20 28 61 6c 77 61 79  andleProc (alway
2850: 73 20 72 65 74 75 72 6e 73 20 65 72 72 6f 72 29  s returns error)
2860: 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20   */.  0,        
2870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2880: 20 20 20 20 20 20 20 20 20 2f 2a 20 63 6c 6f 73           /* clos
2890: 65 32 50 72 6f 63 20 20 20 20 20 20 20 20 20 20  e2Proc          
28a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b0: 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20   */.  0,        
28c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 62 6c 6f 63           /* bloc
28e0: 6b 4d 6f 64 65 50 72 6f 63 20 20 20 20 20 20 20  kModeProc       
28f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2900: 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20   */.  0,        
2910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2920: 20 20 20 20 20 20 20 20 20 2f 2a 20 66 6c 75 73           /* flus
2930: 68 50 72 6f 63 20 20 20 20 20 20 20 20 20 20 20  hProc           
2940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2950: 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20   */.  0,        
2960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2970: 20 20 20 20 20 20 20 20 20 2f 2a 20 68 61 6e 64           /* hand
2980: 6c 65 72 50 72 6f 63 20 20 20 20 20 20 20 20 20  lerProc         
2990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29a0: 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20   */.  0,        
29b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 77 69 64 65           /* wide
29d0: 53 65 65 6b 50 72 6f 63 20 20 20 20 20 20 20 20  SeekProc        
29e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29f0: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 72   */.};../*.** Cr
2a00: 65 61 74 65 20 61 20 6e 65 77 20 69 6e 63 72 62  eate a new incrb
2a10: 6c 6f 62 20 63 68 61 6e 6e 65 6c 2e 0a 2a 2f 0a  lob channel..*/.
2a20: 73 74 61 74 69 63 20 69 6e 74 20 63 72 65 61 74  static int creat
2a30: 65 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c  eIncrblobChannel
2a40: 28 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  (.  Tcl_Interp *
2a50: 69 6e 74 65 72 70 2c 20 0a 20 20 53 71 6c 69 74  interp, .  Sqlit
2a60: 65 44 62 20 2a 70 44 62 2c 20 0a 20 20 63 6f 6e  eDb *pDb, .  con
2a70: 73 74 20 63 68 61 72 20 2a 7a 44 62 2c 0a 20 20  st char *zDb,.  
2a80: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62  const char *zTab
2a90: 6c 65 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61  le, .  const cha
2aa0: 72 20 2a 7a 43 6f 6c 75 6d 6e 2c 20 0a 20 20 73  r *zColumn, .  s
2ab0: 71 6c 69 74 65 5f 69 6e 74 36 34 20 69 52 6f 77  qlite_int64 iRow
2ac0: 2c 0a 20 20 69 6e 74 20 69 73 52 65 61 64 6f 6e  ,.  int isReadon
2ad0: 6c 79 0a 29 7b 0a 20 20 49 6e 63 72 62 6c 6f 62  ly.){.  Incrblob
2ae0: 43 68 61 6e 6e 65 6c 20 2a 70 3b 0a 20 20 73 71  Channel *p;.  sq
2af0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 44 62 2d  lite3 *db = pDb-
2b00: 3e 64 62 3b 0a 20 20 73 71 6c 69 74 65 33 5f 62  >db;.  sqlite3_b
2b10: 6c 6f 62 20 2a 70 42 6c 6f 62 3b 0a 20 20 69 6e  lob *pBlob;.  in
2b20: 74 20 72 63 3b 0a 20 20 69 6e 74 20 66 6c 61 67  t rc;.  int flag
2b30: 73 20 3d 20 54 43 4c 5f 52 45 41 44 41 42 4c 45  s = TCL_READABLE
2b40: 7c 28 69 73 52 65 61 64 6f 6e 6c 79 20 3f 20 30  |(isReadonly ? 0
2b50: 20 3a 20 54 43 4c 5f 57 52 49 54 41 42 4c 45 29   : TCL_WRITABLE)
2b60: 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 76 61 72  ;..  /* This var
2b70: 69 61 62 6c 65 20 69 73 20 75 73 65 64 20 74 6f  iable is used to
2b80: 20 6e 61 6d 65 20 74 68 65 20 63 68 61 6e 6e 65   name the channe
2b90: 6c 73 3a 20 22 69 6e 63 72 62 6c 6f 62 5f 5b 69  ls: "incrblob_[i
2ba0: 6e 63 72 20 63 6f 75 6e 74 5d 22 20 2a 2f 0a 20  ncr count]" */. 
2bb0: 20 73 74 61 74 69 63 20 69 6e 74 20 63 6f 75 6e   static int coun
2bc0: 74 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a 43  t = 0;.  char zC
2bd0: 68 61 6e 6e 65 6c 5b 36 34 5d 3b 0a 0a 20 20 72  hannel[64];..  r
2be0: 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62  c = sqlite3_blob
2bf0: 5f 6f 70 65 6e 28 64 62 2c 20 7a 44 62 2c 20 7a  _open(db, zDb, z
2c00: 54 61 62 6c 65 2c 20 7a 43 6f 6c 75 6d 6e 2c 20  Table, zColumn, 
2c10: 69 52 6f 77 2c 20 21 69 73 52 65 61 64 6f 6e 6c  iRow, !isReadonl
2c20: 79 2c 20 26 70 42 6c 6f 62 29 3b 0a 20 20 69 66  y, &pBlob);.  if
2c30: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2c40: 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65  ){.    Tcl_SetRe
2c50: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68  sult(interp, (ch
2c60: 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 65 72 72  ar *)sqlite3_err
2c70: 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c 20 54 43  msg(pDb->db), TC
2c80: 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 20  L_VOLATILE);.   
2c90: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
2ca0: 52 3b 0a 20 20 7d 0a 0a 20 20 70 20 3d 20 28 49  R;.  }..  p = (I
2cb0: 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a  ncrblobChannel *
2cc0: 29 54 63 6c 5f 41 6c 6c 6f 63 28 73 69 7a 65 6f  )Tcl_Alloc(sizeo
2cd0: 66 28 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65  f(IncrblobChanne
2ce0: 6c 29 29 3b 0a 20 20 70 2d 3e 69 53 65 65 6b 20  l));.  p->iSeek 
2cf0: 3d 20 30 3b 0a 20 20 70 2d 3e 70 42 6c 6f 62 20  = 0;.  p->pBlob 
2d00: 3d 20 70 42 6c 6f 62 3b 0a 0a 20 20 73 71 6c 69  = pBlob;..  sqli
2d10: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
2d20: 65 6f 66 28 7a 43 68 61 6e 6e 65 6c 29 2c 20 7a  eof(zChannel), z
2d30: 43 68 61 6e 6e 65 6c 2c 20 22 69 6e 63 72 62 6c  Channel, "incrbl
2d40: 6f 62 5f 25 64 22 2c 20 2b 2b 63 6f 75 6e 74 29  ob_%d", ++count)
2d50: 3b 0a 20 20 70 2d 3e 63 68 61 6e 6e 65 6c 20 3d  ;.  p->channel =
2d60: 20 54 63 6c 5f 43 72 65 61 74 65 43 68 61 6e 6e   Tcl_CreateChann
2d70: 65 6c 28 26 49 6e 63 72 62 6c 6f 62 43 68 61 6e  el(&IncrblobChan
2d80: 6e 65 6c 54 79 70 65 2c 20 7a 43 68 61 6e 6e 65  nelType, zChanne
2d90: 6c 2c 20 70 2c 20 66 6c 61 67 73 29 3b 0a 20 20  l, p, flags);.  
2da0: 54 63 6c 5f 52 65 67 69 73 74 65 72 43 68 61 6e  Tcl_RegisterChan
2db0: 6e 65 6c 28 69 6e 74 65 72 70 2c 20 70 2d 3e 63  nel(interp, p->c
2dc0: 68 61 6e 6e 65 6c 29 3b 0a 0a 20 20 2f 2a 20 4c  hannel);..  /* L
2dd0: 69 6e 6b 20 74 68 65 20 6e 65 77 20 63 68 61 6e  ink the new chan
2de0: 6e 65 6c 20 69 6e 74 6f 20 74 68 65 20 53 71 6c  nel into the Sql
2df0: 69 74 65 44 62 2e 70 49 6e 63 72 62 6c 6f 62 20  iteDb.pIncrblob 
2e00: 6c 69 73 74 2e 20 2a 2f 0a 20 20 70 2d 3e 70 4e  list. */.  p->pN
2e10: 65 78 74 20 3d 20 70 44 62 2d 3e 70 49 6e 63 72  ext = pDb->pIncr
2e20: 62 6c 6f 62 3b 0a 20 20 70 2d 3e 70 50 72 65 76  blob;.  p->pPrev
2e30: 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 70   = 0;.  if( p->p
2e40: 4e 65 78 74 20 29 7b 0a 20 20 20 20 70 2d 3e 70  Next ){.    p->p
2e50: 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 3b  Next->pPrev = p;
2e60: 0a 20 20 7d 0a 20 20 70 44 62 2d 3e 70 49 6e 63  .  }.  pDb->pInc
2e70: 72 62 6c 6f 62 20 3d 20 70 3b 0a 20 20 70 2d 3e  rblob = p;.  p->
2e80: 70 44 62 20 3d 20 70 44 62 3b 0a 0a 20 20 54 63  pDb = pDb;..  Tc
2e90: 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
2ea0: 72 70 2c 20 28 63 68 61 72 20 2a 29 54 63 6c 5f  rp, (char *)Tcl_
2eb0: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 70  GetChannelName(p
2ec0: 2d 3e 63 68 61 6e 6e 65 6c 29 2c 20 54 43 4c 5f  ->channel), TCL_
2ed0: 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 72 65 74  VOLATILE);.  ret
2ee0: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65  urn TCL_OK;.}.#e
2ef0: 6c 73 65 20 20 2f 2a 20 65 6c 73 65 20 63 6c 61  lse  /* else cla
2f00: 75 73 65 20 66 6f 72 20 22 23 69 66 6e 64 65 66  use for "#ifndef
2f10: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43   SQLITE_OMIT_INC
2f20: 52 42 4c 4f 42 22 20 2a 2f 0a 20 20 23 64 65 66  RBLOB" */.  #def
2f30: 69 6e 65 20 63 6c 6f 73 65 49 6e 63 72 62 6c 6f  ine closeIncrblo
2f40: 62 43 68 61 6e 6e 65 6c 73 28 70 44 62 29 0a 23  bChannels(pDb).#
2f50: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 6f  endif../*.** Loo
2f60: 6b 20 61 74 20 74 68 65 20 73 63 72 69 70 74 20  k at the script 
2f70: 70 72 65 66 69 78 20 69 6e 20 70 43 6d 64 2e 20  prefix in pCmd. 
2f80: 20 57 65 20 77 69 6c 6c 20 62 65 20 65 78 65 63   We will be exec
2f90: 75 74 69 6e 67 20 74 68 69 73 20 73 63 72 69 70  uting this scrip
2fa0: 74 0a 2a 2a 20 61 66 74 65 72 20 66 69 72 73 74  t.** after first
2fb0: 20 61 70 70 65 6e 64 69 6e 67 20 6f 6e 65 20 6f   appending one o
2fc0: 72 20 6d 6f 72 65 20 61 72 67 75 6d 65 6e 74 73  r more arguments
2fd0: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
2fe0: 61 6e 61 6c 79 7a 65 73 0a 2a 2a 20 74 68 65 20  analyzes.** the 
2ff0: 73 63 72 69 70 74 20 74 6f 20 73 65 65 20 69 66  script to see if
3000: 20 69 74 20 69 73 20 73 61 66 65 20 74 6f 20 75   it is safe to u
3010: 73 65 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 76 28  se Tcl_EvalObjv(
3020: 29 20 6f 6e 20 74 68 65 20 73 63 72 69 70 74 0a  ) on the script.
3030: 2a 2a 20 72 61 74 68 65 72 20 74 68 61 6e 20 74  ** rather than t
3040: 68 65 20 6d 6f 72 65 20 67 65 6e 65 72 61 6c 20  he more general 
3050: 54 63 6c 5f 45 76 61 6c 45 78 28 29 2e 20 20 54  Tcl_EvalEx().  T
3060: 63 6c 5f 45 76 61 6c 4f 62 6a 76 28 29 20 69 73  cl_EvalObjv() is
3070: 20 6d 75 63 68 0a 2a 2a 20 66 61 73 74 65 72 2e   much.** faster.
3080: 0a 2a 2a 0a 2a 2a 20 53 63 72 69 70 74 73 20 74  .**.** Scripts t
3090: 68 61 74 20 61 72 65 20 73 61 66 65 20 74 6f 20  hat are safe to 
30a0: 75 73 65 20 77 69 74 68 20 54 63 6c 5f 45 76 61  use with Tcl_Eva
30b0: 6c 4f 62 6a 76 28 29 20 63 6f 6e 73 69 73 74 73  lObjv() consists
30c0: 20 6f 66 20 61 0a 2a 2a 20 63 6f 6d 6d 61 6e 64   of a.** command
30d0: 20 6e 61 6d 65 20 66 6f 6c 6c 6f 77 65 64 20 62   name followed b
30e0: 79 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 61  y zero or more a
30f0: 72 67 75 6d 65 6e 74 73 20 77 69 74 68 20 6e 6f  rguments with no
3100: 20 5b 2e 2e 2e 5d 20 6f 72 20 24 0a 2a 2a 20 6f   [...] or $.** o
3110: 72 20 7b 2e 2e 2e 7d 20 6f 72 20 3b 20 74 6f 20  r {...} or ; to 
3120: 62 65 20 73 65 65 6e 20 61 6e 79 77 68 65 72 65  be seen anywhere
3130: 2e 20 20 4d 6f 73 74 20 63 61 6c 6c 62 61 63 6b  .  Most callback
3140: 20 73 63 72 69 70 74 73 20 63 6f 6e 73 69 73 74   scripts consist
3150: 0a 2a 2a 20 6f 66 20 6a 75 73 74 20 61 20 73 69  .** of just a si
3160: 6e 67 6c 65 20 70 72 6f 63 65 64 75 72 65 20 6e  ngle procedure n
3170: 61 6d 65 20 61 6e 64 20 74 68 65 79 20 6d 65 65  ame and they mee
3180: 74 20 74 68 69 73 20 72 65 71 75 69 72 65 6d 65  t this requireme
3190: 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nt..*/.static in
31a0: 74 20 73 61 66 65 54 6f 55 73 65 45 76 61 6c 4f  t safeToUseEvalO
31b0: 62 6a 76 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a  bjv(Tcl_Interp *
31c0: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4f 62 6a 20  interp, Tcl_Obj 
31d0: 2a 70 43 6d 64 29 7b 0a 20 20 2f 2a 20 57 65 20  *pCmd){.  /* We 
31e0: 63 6f 75 6c 64 20 74 72 79 20 74 6f 20 64 6f 20  could try to do 
31f0: 73 6f 6d 65 74 68 69 6e 67 20 77 69 74 68 20 54  something with T
3200: 63 6c 5f 50 61 72 73 65 28 29 2e 20 20 42 75 74  cl_Parse().  But
3210: 20 77 65 20 77 69 6c 6c 20 69 6e 73 74 65 61 64   we will instead
3220: 0a 20 20 2a 2a 20 6a 75 73 74 20 64 6f 20 61 20  .  ** just do a 
3230: 73 65 61 72 63 68 20 66 6f 72 20 66 6f 72 62 69  search for forbi
3240: 64 64 65 6e 20 63 68 61 72 61 63 74 65 72 73 2e  dden characters.
3250: 20 20 49 66 20 61 6e 79 20 6f 66 20 74 68 65 20    If any of the 
3260: 66 6f 72 62 69 64 64 65 6e 0a 20 20 2a 2a 20 63  forbidden.  ** c
3270: 68 61 72 61 63 74 65 72 73 20 61 70 70 65 61 72  haracters appear
3280: 20 69 6e 20 70 43 6d 64 2c 20 77 65 20 77 69 6c   in pCmd, we wil
3290: 6c 20 72 65 70 6f 72 74 20 74 68 65 20 73 74 72  l report the str
32a0: 69 6e 67 20 61 73 20 75 6e 73 61 66 65 2e 0a 20  ing as unsafe.. 
32b0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
32c0: 20 2a 7a 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20   *z;.  int n;.  
32d0: 7a 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  z = Tcl_GetStrin
32e0: 67 46 72 6f 6d 4f 62 6a 28 70 43 6d 64 2c 20 26  gFromObj(pCmd, &
32f0: 6e 29 3b 0a 20 20 77 68 69 6c 65 28 20 6e 2d 2d  n);.  while( n--
3300: 20 3e 20 30 20 29 7b 0a 20 20 20 20 69 6e 74 20   > 0 ){.    int 
3310: 63 20 3d 20 2a 28 7a 2b 2b 29 3b 0a 20 20 20 20  c = *(z++);.    
3320: 69 66 28 20 63 3d 3d 27 24 27 20 7c 7c 20 63 3d  if( c=='$' || c=
3330: 3d 27 5b 27 20 7c 7c 20 63 3d 3d 27 3b 27 20 29  ='[' || c==';' )
3340: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
3350: 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a   return 1;.}../*
3360: 0a 2a 2a 20 46 69 6e 64 20 61 6e 20 53 71 6c 46  .** Find an SqlF
3370: 75 6e 63 20 73 74 72 75 63 74 75 72 65 20 77 69  unc structure wi
3380: 74 68 20 74 68 65 20 67 69 76 65 6e 20 6e 61 6d  th the given nam
3390: 65 2e 20 20 4f 72 20 63 72 65 61 74 65 20 61 20  e.  Or create a 
33a0: 6e 65 77 0a 2a 2a 20 6f 6e 65 20 69 66 20 61 6e  new.** one if an
33b0: 20 65 78 69 73 74 69 6e 67 20 6f 6e 65 20 63 61   existing one ca
33c0: 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e 20 20  nnot be found.  
33d0: 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
33e0: 20 74 6f 20 74 68 65 0a 2a 2a 20 73 74 72 75 63   to the.** struc
33f0: 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ture..*/.static 
3400: 53 71 6c 46 75 6e 63 20 2a 66 69 6e 64 53 71 6c  SqlFunc *findSql
3410: 46 75 6e 63 28 53 71 6c 69 74 65 44 62 20 2a 70  Func(SqliteDb *p
3420: 44 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  Db, const char *
3430: 7a 4e 61 6d 65 29 7b 0a 20 20 53 71 6c 46 75 6e  zName){.  SqlFun
3440: 63 20 2a 70 2c 20 2a 70 4e 65 77 3b 0a 20 20 69  c *p, *pNew;.  i
3450: 6e 74 20 69 3b 0a 20 20 70 4e 65 77 20 3d 20 28  nt i;.  pNew = (
3460: 53 71 6c 46 75 6e 63 2a 29 54 63 6c 5f 41 6c 6c  SqlFunc*)Tcl_All
3470: 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77  oc( sizeof(*pNew
3480: 29 20 2b 20 73 74 72 6c 65 6e 33 30 28 7a 4e 61  ) + strlen30(zNa
3490: 6d 65 29 20 2b 20 31 20 29 3b 0a 20 20 70 4e 65  me) + 1 );.  pNe
34a0: 77 2d 3e 7a 4e 61 6d 65 20 3d 20 28 63 68 61 72  w->zName = (char
34b0: 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a 20 20 66 6f  *)&pNew[1];.  fo
34c0: 72 28 69 3d 30 3b 20 7a 4e 61 6d 65 5b 69 5d 3b  r(i=0; zName[i];
34d0: 20 69 2b 2b 29 7b 20 70 4e 65 77 2d 3e 7a 4e 61   i++){ pNew->zNa
34e0: 6d 65 5b 69 5d 20 3d 20 74 6f 6c 6f 77 65 72 28  me[i] = tolower(
34f0: 7a 4e 61 6d 65 5b 69 5d 29 3b 20 7d 0a 20 20 70  zName[i]); }.  p
3500: 4e 65 77 2d 3e 7a 4e 61 6d 65 5b 69 5d 20 3d 20  New->zName[i] = 
3510: 30 3b 0a 20 20 66 6f 72 28 70 3d 70 44 62 2d 3e  0;.  for(p=pDb->
3520: 70 46 75 6e 63 3b 20 70 3b 20 70 3d 70 2d 3e 70  pFunc; p; p=p->p
3530: 4e 65 78 74 29 7b 20 0a 20 20 20 20 69 66 28 20  Next){ .    if( 
3540: 73 74 72 63 6d 70 28 70 2d 3e 7a 4e 61 6d 65 2c  strcmp(p->zName,
3550: 20 70 4e 65 77 2d 3e 7a 4e 61 6d 65 29 3d 3d 30   pNew->zName)==0
3560: 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 46 72   ){.      Tcl_Fr
3570: 65 65 28 28 63 68 61 72 2a 29 70 4e 65 77 29 3b  ee((char*)pNew);
3580: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 3b  .      return p;
3590: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 4e 65  .    }.  }.  pNe
35a0: 77 2d 3e 69 6e 74 65 72 70 20 3d 20 70 44 62 2d  w->interp = pDb-
35b0: 3e 69 6e 74 65 72 70 3b 0a 20 20 70 4e 65 77 2d  >interp;.  pNew-
35c0: 3e 70 53 63 72 69 70 74 20 3d 20 30 3b 0a 20 20  >pScript = 0;.  
35d0: 70 4e 65 77 2d 3e 70 4e 65 78 74 20 3d 20 70 44  pNew->pNext = pD
35e0: 62 2d 3e 70 46 75 6e 63 3b 0a 20 20 70 44 62 2d  b->pFunc;.  pDb-
35f0: 3e 70 46 75 6e 63 20 3d 20 70 4e 65 77 3b 0a 20  >pFunc = pNew;. 
3600: 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a   return pNew;.}.
3610: 0a 2f 2a 0a 2a 2a 20 46 69 6e 61 6c 69 7a 65 20  ./*.** Finalize 
3620: 61 6e 64 20 66 72 65 65 20 61 20 6c 69 73 74 20  and free a list 
3630: 6f 66 20 70 72 65 70 61 72 65 64 20 73 74 61 74  of prepared stat
3640: 65 6d 65 6e 74 73 0a 2a 2f 0a 73 74 61 74 69 63  ements.*/.static
3650: 20 76 6f 69 64 20 66 6c 75 73 68 53 74 6d 74 43   void flushStmtC
3660: 61 63 68 65 28 20 53 71 6c 69 74 65 44 62 20 2a  ache( SqliteDb *
3670: 70 44 62 20 29 7b 0a 20 20 53 71 6c 50 72 65 70  pDb ){.  SqlPrep
3680: 61 72 65 64 53 74 6d 74 20 2a 70 50 72 65 53 74  aredStmt *pPreSt
3690: 6d 74 3b 0a 0a 20 20 77 68 69 6c 65 28 20 20 70  mt;..  while(  p
36a0: 44 62 2d 3e 73 74 6d 74 4c 69 73 74 20 29 7b 0a  Db->stmtList ){.
36b0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61      sqlite3_fina
36c0: 6c 69 7a 65 28 20 70 44 62 2d 3e 73 74 6d 74 4c  lize( pDb->stmtL
36d0: 69 73 74 2d 3e 70 53 74 6d 74 20 29 3b 0a 20 20  ist->pStmt );.  
36e0: 20 20 70 50 72 65 53 74 6d 74 20 3d 20 70 44 62    pPreStmt = pDb
36f0: 2d 3e 73 74 6d 74 4c 69 73 74 3b 0a 20 20 20 20  ->stmtList;.    
3700: 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74 20 3d 20  pDb->stmtList = 
3710: 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74 2d 3e 70  pDb->stmtList->p
3720: 4e 65 78 74 3b 0a 20 20 20 20 54 63 6c 5f 46 72  Next;.    Tcl_Fr
3730: 65 65 28 20 28 63 68 61 72 2a 29 70 50 72 65 53  ee( (char*)pPreS
3740: 74 6d 74 20 29 3b 0a 20 20 7d 0a 20 20 70 44 62  tmt );.  }.  pDb
3750: 2d 3e 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 70  ->nStmt = 0;.  p
3760: 44 62 2d 3e 73 74 6d 74 4c 61 73 74 20 3d 20 30  Db->stmtLast = 0
3770: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 43 4c 20 63  ;.}../*.** TCL c
3780: 61 6c 6c 73 20 74 68 69 73 20 70 72 6f 63 65 64  alls this proced
3790: 75 72 65 20 77 68 65 6e 20 61 6e 20 73 71 6c 69  ure when an sqli
37a0: 74 65 33 20 64 61 74 61 62 61 73 65 20 63 6f 6d  te3 database com
37b0: 6d 61 6e 64 20 69 73 0a 2a 2a 20 64 65 6c 65 74  mand is.** delet
37c0: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
37d0: 69 64 20 44 62 44 65 6c 65 74 65 43 6d 64 28 76  id DbDeleteCmd(v
37e0: 6f 69 64 20 2a 64 62 29 7b 0a 20 20 53 71 6c 69  oid *db){.  Sqli
37f0: 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53 71 6c  teDb *pDb = (Sql
3800: 69 74 65 44 62 2a 29 64 62 3b 0a 20 20 66 6c 75  iteDb*)db;.  flu
3810: 73 68 53 74 6d 74 43 61 63 68 65 28 70 44 62 29  shStmtCache(pDb)
3820: 3b 0a 20 20 63 6c 6f 73 65 49 6e 63 72 62 6c 6f  ;.  closeIncrblo
3830: 62 43 68 61 6e 6e 65 6c 73 28 70 44 62 29 3b 0a  bChannels(pDb);.
3840: 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28    sqlite3_close(
3850: 70 44 62 2d 3e 64 62 29 3b 0a 20 20 77 68 69 6c  pDb->db);.  whil
3860: 65 28 20 70 44 62 2d 3e 70 46 75 6e 63 20 29 7b  e( pDb->pFunc ){
3870: 0a 20 20 20 20 53 71 6c 46 75 6e 63 20 2a 70 46  .    SqlFunc *pF
3880: 75 6e 63 20 3d 20 70 44 62 2d 3e 70 46 75 6e 63  unc = pDb->pFunc
3890: 3b 0a 20 20 20 20 70 44 62 2d 3e 70 46 75 6e 63  ;.    pDb->pFunc
38a0: 20 3d 20 70 46 75 6e 63 2d 3e 70 4e 65 78 74 3b   = pFunc->pNext;
38b0: 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66  .    Tcl_DecrRef
38c0: 43 6f 75 6e 74 28 70 46 75 6e 63 2d 3e 70 53 63  Count(pFunc->pSc
38d0: 72 69 70 74 29 3b 0a 20 20 20 20 54 63 6c 5f 46  ript);.    Tcl_F
38e0: 72 65 65 28 28 63 68 61 72 2a 29 70 46 75 6e 63  ree((char*)pFunc
38f0: 29 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20  );.  }.  while( 
3900: 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 20 29 7b  pDb->pCollate ){
3910: 0a 20 20 20 20 53 71 6c 43 6f 6c 6c 61 74 65 20  .    SqlCollate 
3920: 2a 70 43 6f 6c 6c 61 74 65 20 3d 20 70 44 62 2d  *pCollate = pDb-
3930: 3e 70 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 70  >pCollate;.    p
3940: 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 20 3d 20 70  Db->pCollate = p
3950: 43 6f 6c 6c 61 74 65 2d 3e 70 4e 65 78 74 3b 0a  Collate->pNext;.
3960: 20 20 20 20 54 63 6c 5f 46 72 65 65 28 28 63 68      Tcl_Free((ch
3970: 61 72 2a 29 70 43 6f 6c 6c 61 74 65 29 3b 0a 20  ar*)pCollate);. 
3980: 20 7d 0a 20 20 69 66 28 20 70 44 62 2d 3e 7a 42   }.  if( pDb->zB
3990: 75 73 79 20 29 7b 0a 20 20 20 20 54 63 6c 5f 46  usy ){.    Tcl_F
39a0: 72 65 65 28 70 44 62 2d 3e 7a 42 75 73 79 29 3b  ree(pDb->zBusy);
39b0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 62 2d 3e  .  }.  if( pDb->
39c0: 7a 54 72 61 63 65 20 29 7b 0a 20 20 20 20 54 63  zTrace ){.    Tc
39d0: 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 54 72 61  l_Free(pDb->zTra
39e0: 63 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ce);.  }.  if( p
39f0: 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 20 29 7b 0a  Db->zProfile ){.
3a00: 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62      Tcl_Free(pDb
3a10: 2d 3e 7a 50 72 6f 66 69 6c 65 29 3b 0a 20 20 7d  ->zProfile);.  }
3a20: 0a 20 20 69 66 28 20 70 44 62 2d 3e 7a 41 75 74  .  if( pDb->zAut
3a30: 68 20 29 7b 0a 20 20 20 20 54 63 6c 5f 46 72 65  h ){.    Tcl_Fre
3a40: 65 28 70 44 62 2d 3e 7a 41 75 74 68 29 3b 0a 20  e(pDb->zAuth);. 
3a50: 20 7d 0a 20 20 69 66 28 20 70 44 62 2d 3e 7a 4e   }.  if( pDb->zN
3a60: 75 6c 6c 20 29 7b 0a 20 20 20 20 54 63 6c 5f 46  ull ){.    Tcl_F
3a70: 72 65 65 28 70 44 62 2d 3e 7a 4e 75 6c 6c 29 3b  ree(pDb->zNull);
3a80: 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 62 2d 3e  .  }.  if( pDb->
3a90: 70 55 70 64 61 74 65 48 6f 6f 6b 20 29 7b 0a 20  pUpdateHook ){. 
3aa0: 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f     Tcl_DecrRefCo
3ab0: 75 6e 74 28 70 44 62 2d 3e 70 55 70 64 61 74 65  unt(pDb->pUpdate
3ac0: 48 6f 6f 6b 29 3b 0a 20 20 7d 0a 20 20 69 66 28  Hook);.  }.  if(
3ad0: 20 70 44 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 48   pDb->pRollbackH
3ae0: 6f 6f 6b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 44  ook ){.    Tcl_D
3af0: 65 63 72 52 65 66 43 6f 75 6e 74 28 70 44 62 2d  ecrRefCount(pDb-
3b00: 3e 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 29 3b  >pRollbackHook);
3b10: 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 62 2d 3e  .  }.  if( pDb->
3b20: 70 57 61 6c 48 6f 6f 6b 20 29 7b 0a 20 20 20 20  pWalHook ){.    
3b30: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
3b40: 28 70 44 62 2d 3e 70 57 61 6c 48 6f 6f 6b 29 3b  (pDb->pWalHook);
3b50: 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 62 2d 3e  .  }.  if( pDb->
3b60: 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64 20 29  pCollateNeeded )
3b70: 7b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65  {.    Tcl_DecrRe
3b80: 66 43 6f 75 6e 74 28 70 44 62 2d 3e 70 43 6f 6c  fCount(pDb->pCol
3b90: 6c 61 74 65 4e 65 65 64 65 64 29 3b 0a 20 20 7d  lateNeeded);.  }
3ba0: 0a 20 20 54 63 6c 5f 46 72 65 65 28 28 63 68 61  .  Tcl_Free((cha
3bb0: 72 2a 29 70 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  r*)pDb);.}../*.*
3bc0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
3bd0: 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20  s called when a 
3be0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
3bf0: 20 6c 6f 63 6b 65 64 20 77 68 69 6c 65 20 74 72   locked while tr
3c00: 79 69 6e 67 0a 2a 2a 20 74 6f 20 65 78 65 63 75  ying.** to execu
3c10: 74 65 20 53 51 4c 2e 0a 2a 2f 0a 73 74 61 74 69  te SQL..*/.stati
3c20: 63 20 69 6e 74 20 44 62 42 75 73 79 48 61 6e 64  c int DbBusyHand
3c30: 6c 65 72 28 76 6f 69 64 20 2a 63 64 2c 20 69 6e  ler(void *cd, in
3c40: 74 20 6e 54 72 69 65 73 29 7b 0a 20 20 53 71 6c  t nTries){.  Sql
3c50: 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53 71  iteDb *pDb = (Sq
3c60: 6c 69 74 65 44 62 2a 29 63 64 3b 0a 20 20 69 6e  liteDb*)cd;.  in
3c70: 74 20 72 63 3b 0a 20 20 63 68 61 72 20 7a 56 61  t rc;.  char zVa
3c80: 6c 5b 33 30 5d 3b 0a 0a 20 20 73 71 6c 69 74 65  l[30];..  sqlite
3c90: 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
3ca0: 66 28 7a 56 61 6c 29 2c 20 7a 56 61 6c 2c 20 22  f(zVal), zVal, "
3cb0: 25 64 22 2c 20 6e 54 72 69 65 73 29 3b 0a 20 20  %d", nTries);.  
3cc0: 72 63 20 3d 20 54 63 6c 5f 56 61 72 45 76 61 6c  rc = Tcl_VarEval
3cd0: 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20 70 44  (pDb->interp, pD
3ce0: 62 2d 3e 7a 42 75 73 79 2c 20 22 20 22 2c 20 7a  b->zBusy, " ", z
3cf0: 56 61 6c 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  Val, (char*)0);.
3d00: 20 20 69 66 28 20 72 63 21 3d 54 43 4c 5f 4f 4b    if( rc!=TCL_OK
3d10: 20 7c 7c 20 61 74 6f 69 28 54 63 6c 5f 47 65 74   || atoi(Tcl_Get
3d20: 53 74 72 69 6e 67 52 65 73 75 6c 74 28 70 44 62  StringResult(pDb
3d30: 2d 3e 69 6e 74 65 72 70 29 29 20 29 7b 0a 20 20  ->interp)) ){.  
3d40: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
3d50: 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 23    return 1;.}..#
3d60: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
3d70: 49 54 5f 50 52 4f 47 52 45 53 53 5f 43 41 4c 4c  IT_PROGRESS_CALL
3d80: 42 41 43 4b 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  BACK./*.** This 
3d90: 72 6f 75 74 69 6e 65 20 69 73 20 69 6e 76 6f 6b  routine is invok
3da0: 65 64 20 61 73 20 74 68 65 20 27 70 72 6f 67 72  ed as the 'progr
3db0: 65 73 73 20 63 61 6c 6c 62 61 63 6b 27 20 66 6f  ess callback' fo
3dc0: 72 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  r the database..
3dd0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 44 62  */.static int Db
3de0: 50 72 6f 67 72 65 73 73 48 61 6e 64 6c 65 72 28  ProgressHandler(
3df0: 76 6f 69 64 20 2a 63 64 29 7b 0a 20 20 53 71 6c  void *cd){.  Sql
3e00: 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53 71  iteDb *pDb = (Sq
3e10: 6c 69 74 65 44 62 2a 29 63 64 3b 0a 20 20 69 6e  liteDb*)cd;.  in
3e20: 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
3e30: 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 20   pDb->zProgress 
3e40: 29 3b 0a 20 20 72 63 20 3d 20 54 63 6c 5f 45 76  );.  rc = Tcl_Ev
3e50: 61 6c 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20  al(pDb->interp, 
3e60: 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 29 3b  pDb->zProgress);
3e70: 0a 20 20 69 66 28 20 72 63 21 3d 54 43 4c 5f 4f  .  if( rc!=TCL_O
3e80: 4b 20 7c 7c 20 61 74 6f 69 28 54 63 6c 5f 47 65  K || atoi(Tcl_Ge
3e90: 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28 70 44  tStringResult(pD
3ea0: 62 2d 3e 69 6e 74 65 72 70 29 29 20 29 7b 0a 20  b->interp)) ){. 
3eb0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
3ec0: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23  .  return 0;.}.#
3ed0: 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
3ee0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45  QLITE_OMIT_TRACE
3ef0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
3f00: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79  ine is called by
3f10: 20 74 68 65 20 53 51 4c 69 74 65 20 74 72 61 63   the SQLite trac
3f20: 65 20 68 61 6e 64 6c 65 72 20 77 68 65 6e 65 76  e handler whenev
3f30: 65 72 20 61 20 6e 65 77 0a 2a 2a 20 62 6c 6f 63  er a new.** bloc
3f40: 6b 20 6f 66 20 53 51 4c 20 69 73 20 65 78 65 63  k of SQL is exec
3f50: 75 74 65 64 2e 20 20 54 68 65 20 54 43 4c 20 73  uted.  The TCL s
3f60: 63 72 69 70 74 20 69 6e 20 70 44 62 2d 3e 7a 54  cript in pDb->zT
3f70: 72 61 63 65 20 69 73 20 65 78 65 63 75 74 65 64  race is executed
3f80: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
3f90: 20 44 62 54 72 61 63 65 48 61 6e 64 6c 65 72 28   DbTraceHandler(
3fa0: 76 6f 69 64 20 2a 63 64 2c 20 63 6f 6e 73 74 20  void *cd, const 
3fb0: 63 68 61 72 20 2a 7a 53 71 6c 29 7b 0a 20 20 53  char *zSql){.  S
3fc0: 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28  qliteDb *pDb = (
3fd0: 53 71 6c 69 74 65 44 62 2a 29 63 64 3b 0a 20 20  SqliteDb*)cd;.  
3fe0: 54 63 6c 5f 44 53 74 72 69 6e 67 20 73 74 72 3b  Tcl_DString str;
3ff0: 0a 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49  ..  Tcl_DStringI
4000: 6e 69 74 28 26 73 74 72 29 3b 0a 20 20 54 63 6c  nit(&str);.  Tcl
4010: 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64 28 26  _DStringAppend(&
4020: 73 74 72 2c 20 70 44 62 2d 3e 7a 54 72 61 63 65  str, pDb->zTrace
4030: 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 44 53 74  , -1);.  Tcl_DSt
4040: 72 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e  ringAppendElemen
4050: 74 28 26 73 74 72 2c 20 7a 53 71 6c 29 3b 0a 20  t(&str, zSql);. 
4060: 20 54 63 6c 5f 45 76 61 6c 28 70 44 62 2d 3e 69   Tcl_Eval(pDb->i
4070: 6e 74 65 72 70 2c 20 54 63 6c 5f 44 53 74 72 69  nterp, Tcl_DStri
4080: 6e 67 56 61 6c 75 65 28 26 73 74 72 29 29 3b 0a  ngValue(&str));.
4090: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65    Tcl_DStringFre
40a0: 65 28 26 73 74 72 29 3b 0a 20 20 54 63 6c 5f 52  e(&str);.  Tcl_R
40b0: 65 73 65 74 52 65 73 75 6c 74 28 70 44 62 2d 3e  esetResult(pDb->
40c0: 69 6e 74 65 72 70 29 3b 0a 7d 0a 23 65 6e 64 69  interp);.}.#endi
40d0: 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  f..#ifndef SQLIT
40e0: 45 5f 4f 4d 49 54 5f 54 52 41 43 45 0a 2f 2a 0a  E_OMIT_TRACE./*.
40f0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
4100: 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65  is called by the
4110: 20 53 51 4c 69 74 65 20 70 72 6f 66 69 6c 65 20   SQLite profile 
4120: 68 61 6e 64 6c 65 72 20 61 66 74 65 72 20 61 20  handler after a 
4130: 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 53 51 4c  statement.** SQL
4140: 20 68 61 73 20 65 78 65 63 75 74 65 64 2e 20 20   has executed.  
4150: 54 68 65 20 54 43 4c 20 73 63 72 69 70 74 20 69  The TCL script i
4160: 6e 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 20  n pDb->zProfile 
4170: 69 73 20 65 76 61 6c 75 61 74 65 64 2e 0a 2a 2f  is evaluated..*/
4180: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 44 62 50  .static void DbP
4190: 72 6f 66 69 6c 65 48 61 6e 64 6c 65 72 28 76 6f  rofileHandler(vo
41a0: 69 64 20 2a 63 64 2c 20 63 6f 6e 73 74 20 63 68  id *cd, const ch
41b0: 61 72 20 2a 7a 53 71 6c 2c 20 73 71 6c 69 74 65  ar *zSql, sqlite
41c0: 5f 75 69 6e 74 36 34 20 74 6d 29 7b 0a 20 20 53  _uint64 tm){.  S
41d0: 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28  qliteDb *pDb = (
41e0: 53 71 6c 69 74 65 44 62 2a 29 63 64 3b 0a 20 20  SqliteDb*)cd;.  
41f0: 54 63 6c 5f 44 53 74 72 69 6e 67 20 73 74 72 3b  Tcl_DString str;
4200: 0a 20 20 63 68 61 72 20 7a 54 6d 5b 31 30 30 5d  .  char zTm[100]
4210: 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  ;..  sqlite3_snp
4220: 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 54 6d  rintf(sizeof(zTm
4230: 29 2d 31 2c 20 7a 54 6d 2c 20 22 25 6c 6c 64 22  )-1, zTm, "%lld"
4240: 2c 20 74 6d 29 3b 0a 20 20 54 63 6c 5f 44 53 74  , tm);.  Tcl_DSt
4250: 72 69 6e 67 49 6e 69 74 28 26 73 74 72 29 3b 0a  ringInit(&str);.
4260: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70    Tcl_DStringApp
4270: 65 6e 64 28 26 73 74 72 2c 20 70 44 62 2d 3e 7a  end(&str, pDb->z
4280: 50 72 6f 66 69 6c 65 2c 20 2d 31 29 3b 0a 20 20  Profile, -1);.  
4290: 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e  Tcl_DStringAppen
42a0: 64 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c 20 7a  dElement(&str, z
42b0: 53 71 6c 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72  Sql);.  Tcl_DStr
42c0: 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ingAppendElement
42d0: 28 26 73 74 72 2c 20 7a 54 6d 29 3b 0a 20 20 54  (&str, zTm);.  T
42e0: 63 6c 5f 45 76 61 6c 28 70 44 62 2d 3e 69 6e 74  cl_Eval(pDb->int
42f0: 65 72 70 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67  erp, Tcl_DString
4300: 56 61 6c 75 65 28 26 73 74 72 29 29 3b 0a 20 20  Value(&str));.  
4310: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28  Tcl_DStringFree(
4320: 26 73 74 72 29 3b 0a 20 20 54 63 6c 5f 52 65 73  &str);.  Tcl_Res
4330: 65 74 52 65 73 75 6c 74 28 70 44 62 2d 3e 69 6e  etResult(pDb->in
4340: 74 65 72 70 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  terp);.}.#endif.
4350: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
4360: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ine is called wh
4370: 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  en a transaction
4380: 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2e 20 20   is committed.  
4390: 54 68 65 0a 2a 2a 20 54 43 4c 20 73 63 72 69 70  The.** TCL scrip
43a0: 74 20 69 6e 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69  t in pDb->zCommi
43b0: 74 20 69 73 20 65 78 65 63 75 74 65 64 2e 20 20  t is executed.  
43c0: 49 66 20 69 74 20 72 65 74 75 72 6e 73 20 6e 6f  If it returns no
43d0: 6e 2d 7a 65 72 6f 20 6f 72 0a 2a 2a 20 69 66 20  n-zero or.** if 
43e0: 69 74 20 74 68 72 6f 77 73 20 61 6e 20 65 78 63  it throws an exc
43f0: 65 70 74 69 6f 6e 2c 20 74 68 65 20 74 72 61 6e  eption, the tran
4400: 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65  saction is rolle
4410: 64 20 62 61 63 6b 20 69 6e 73 74 65 61 64 0a 2a  d back instead.*
4420: 2a 20 6f 66 20 62 65 69 6e 67 20 63 6f 6d 6d 69  * of being commi
4430: 74 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tted..*/.static 
4440: 69 6e 74 20 44 62 43 6f 6d 6d 69 74 48 61 6e 64  int DbCommitHand
4450: 6c 65 72 28 76 6f 69 64 20 2a 63 64 29 7b 0a 20  ler(void *cd){. 
4460: 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d   SqliteDb *pDb =
4470: 20 28 53 71 6c 69 74 65 44 62 2a 29 63 64 3b 0a   (SqliteDb*)cd;.
4480: 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 72 63 20    int rc;..  rc 
4490: 3d 20 54 63 6c 5f 45 76 61 6c 28 70 44 62 2d 3e  = Tcl_Eval(pDb->
44a0: 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a 43 6f  interp, pDb->zCo
44b0: 6d 6d 69 74 29 3b 0a 20 20 69 66 28 20 72 63 21  mmit);.  if( rc!
44c0: 3d 54 43 4c 5f 4f 4b 20 7c 7c 20 61 74 6f 69 28  =TCL_OK || atoi(
44d0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73  Tcl_GetStringRes
44e0: 75 6c 74 28 70 44 62 2d 3e 69 6e 74 65 72 70 29  ult(pDb->interp)
44f0: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
4500: 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
4510: 30 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69  0;.}..static voi
4520: 64 20 44 62 52 6f 6c 6c 62 61 63 6b 48 61 6e 64  d DbRollbackHand
4530: 6c 65 72 28 76 6f 69 64 20 2a 63 6c 69 65 6e 74  ler(void *client
4540: 44 61 74 61 29 7b 0a 20 20 53 71 6c 69 74 65 44  Data){.  SqliteD
4550: 62 20 2a 70 44 62 20 3d 20 28 53 71 6c 69 74 65  b *pDb = (Sqlite
4560: 44 62 2a 29 63 6c 69 65 6e 74 44 61 74 61 3b 0a  Db*)clientData;.
4570: 20 20 61 73 73 65 72 74 28 70 44 62 2d 3e 70 52    assert(pDb->pR
4580: 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 29 3b 0a 20 20  ollbackHook);.  
4590: 69 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f  if( TCL_OK!=Tcl_
45a0: 45 76 61 6c 4f 62 6a 45 78 28 70 44 62 2d 3e 69  EvalObjEx(pDb->i
45b0: 6e 74 65 72 70 2c 20 70 44 62 2d 3e 70 52 6f 6c  nterp, pDb->pRol
45c0: 6c 62 61 63 6b 48 6f 6f 6b 2c 20 30 29 20 29 7b  lbackHook, 0) ){
45d0: 0a 20 20 20 20 54 63 6c 5f 42 61 63 6b 67 72 6f  .    Tcl_Backgro
45e0: 75 6e 64 45 72 72 6f 72 28 70 44 62 2d 3e 69 6e  undError(pDb->in
45f0: 74 65 72 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  terp);.  }.}../*
4600: 0a 2a 2a 20 54 68 69 73 20 70 72 6f 63 65 64 75  .** This procedu
4610: 72 65 20 68 61 6e 64 6c 65 73 20 77 61 6c 5f 68  re handles wal_h
4620: 6f 6f 6b 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 2a  ook callbacks..*
4630: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 44 62 57  /.static int DbW
4640: 61 6c 48 61 6e 64 6c 65 72 28 0a 20 20 76 6f 69  alHandler(.  voi
4650: 64 20 2a 63 6c 69 65 6e 74 44 61 74 61 2c 20 0a  d *clientData, .
4660: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a    sqlite3 *db, .
4670: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
4680: 62 2c 20 0a 20 20 69 6e 74 20 6e 45 6e 74 72 79  b, .  int nEntry
4690: 0a 29 7b 0a 20 20 69 6e 74 20 72 65 74 20 3d 20  .){.  int ret = 
46a0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 54 63 6c  SQLITE_OK;.  Tcl
46b0: 5f 4f 62 6a 20 2a 70 3b 0a 20 20 53 71 6c 69 74  _Obj *p;.  Sqlit
46c0: 65 44 62 20 2a 70 44 62 20 3d 20 28 53 71 6c 69  eDb *pDb = (Sqli
46d0: 74 65 44 62 2a 29 63 6c 69 65 6e 74 44 61 74 61  teDb*)clientData
46e0: 3b 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ;.  Tcl_Interp *
46f0: 69 6e 74 65 72 70 20 3d 20 70 44 62 2d 3e 69 6e  interp = pDb->in
4700: 74 65 72 70 3b 0a 20 20 61 73 73 65 72 74 28 70  terp;.  assert(p
4710: 44 62 2d 3e 70 57 61 6c 48 6f 6f 6b 29 3b 0a 0a  Db->pWalHook);..
4720: 20 20 70 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63    p = Tcl_Duplic
4730: 61 74 65 4f 62 6a 28 70 44 62 2d 3e 70 57 61 6c  ateObj(pDb->pWal
4740: 48 6f 6f 6b 29 3b 0a 20 20 54 63 6c 5f 49 6e 63  Hook);.  Tcl_Inc
4750: 72 52 65 66 43 6f 75 6e 74 28 70 29 3b 0a 20 20  rRefCount(p);.  
4760: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
4770: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
4780: 20 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e   p, Tcl_NewStrin
4790: 67 4f 62 6a 28 7a 44 62 2c 20 2d 31 29 29 3b 0a  gObj(zDb, -1));.
47a0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
47b0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
47c0: 70 2c 20 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74  p, p, Tcl_NewInt
47d0: 4f 62 6a 28 6e 45 6e 74 72 79 29 29 3b 0a 20 20  Obj(nEntry));.  
47e0: 69 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f  if( TCL_OK!=Tcl_
47f0: 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70  EvalObjEx(interp
4800: 2c 20 70 2c 20 30 29 20 0a 20 20 20 7c 7c 20 54  , p, 0) .   || T
4810: 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 49 6e  CL_OK!=Tcl_GetIn
4820: 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
4830: 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c   Tcl_GetObjResul
4840: 74 28 69 6e 74 65 72 70 29 2c 20 26 72 65 74 29  t(interp), &ret)
4850: 0a 20 20 29 7b 0a 20 20 20 20 54 63 6c 5f 42 61  .  ){.    Tcl_Ba
4860: 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72 28 69 6e  ckgroundError(in
4870: 74 65 72 70 29 3b 0a 20 20 7d 0a 20 20 54 63 6c  terp);.  }.  Tcl
4880: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 29  _DecrRefCount(p)
4890: 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 65 74 3b  ;..  return ret;
48a0: 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .}..#if defined(
48b0: 53 51 4c 49 54 45 5f 54 45 53 54 29 20 26 26 20  SQLITE_TEST) && 
48c0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
48d0: 4e 41 42 4c 45 5f 55 4e 4c 4f 43 4b 5f 4e 4f 54  NABLE_UNLOCK_NOT
48e0: 49 46 59 29 0a 73 74 61 74 69 63 20 76 6f 69 64  IFY).static void
48f0: 20 73 65 74 54 65 73 74 55 6e 6c 6f 63 6b 4e 6f   setTestUnlockNo
4900: 74 69 66 79 56 61 72 73 28 54 63 6c 5f 49 6e 74  tifyVars(Tcl_Int
4910: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74  erp *interp, int
4920: 20 69 41 72 67 2c 20 69 6e 74 20 6e 41 72 67 29   iArg, int nArg)
4930: 7b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 36 34  {.  char zBuf[64
4940: 5d 3b 0a 20 20 73 70 72 69 6e 74 66 28 7a 42 75  ];.  sprintf(zBu
4950: 66 2c 20 22 25 64 22 2c 20 69 41 72 67 29 3b 0a  f, "%d", iArg);.
4960: 20 20 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74    Tcl_SetVar(int
4970: 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 75 6e 6c  erp, "sqlite_unl
4980: 6f 63 6b 5f 6e 6f 74 69 66 79 5f 61 72 67 22 2c  ock_notify_arg",
4990: 20 7a 42 75 66 2c 20 54 43 4c 5f 47 4c 4f 42 41   zBuf, TCL_GLOBA
49a0: 4c 5f 4f 4e 4c 59 29 3b 0a 20 20 73 70 72 69 6e  L_ONLY);.  sprin
49b0: 74 66 28 7a 42 75 66 2c 20 22 25 64 22 2c 20 6e  tf(zBuf, "%d", n
49c0: 41 72 67 29 3b 0a 20 20 54 63 6c 5f 53 65 74 56  Arg);.  Tcl_SetV
49d0: 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69  ar(interp, "sqli
49e0: 74 65 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79  te_unlock_notify
49f0: 5f 61 72 67 63 6f 75 6e 74 22 2c 20 7a 42 75 66  _argcount", zBuf
4a00: 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c  , TCL_GLOBAL_ONL
4a10: 59 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65  Y);.}.#else.# de
4a20: 66 69 6e 65 20 73 65 74 54 65 73 74 55 6e 6c 6f  fine setTestUnlo
4a30: 63 6b 4e 6f 74 69 66 79 56 61 72 73 28 78 2c 79  ckNotifyVars(x,y
4a40: 2c 7a 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64  ,z).#endif..#ifd
4a50: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
4a60: 5f 55 4e 4c 4f 43 4b 5f 4e 4f 54 49 46 59 0a 73  _UNLOCK_NOTIFY.s
4a70: 74 61 74 69 63 20 76 6f 69 64 20 44 62 55 6e 6c  tatic void DbUnl
4a80: 6f 63 6b 4e 6f 74 69 66 79 28 76 6f 69 64 20 2a  ockNotify(void *
4a90: 2a 61 70 41 72 67 2c 20 69 6e 74 20 6e 41 72 67  *apArg, int nArg
4aa0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  ){.  int i;.  fo
4ab0: 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69  r(i=0; i<nArg; i
4ac0: 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69  ++){.    const i
4ad0: 6e 74 20 66 6c 61 67 73 20 3d 20 28 54 43 4c 5f  nt flags = (TCL_
4ae0: 45 56 41 4c 5f 47 4c 4f 42 41 4c 7c 54 43 4c 5f  EVAL_GLOBAL|TCL_
4af0: 45 56 41 4c 5f 44 49 52 45 43 54 29 3b 0a 20 20  EVAL_DIRECT);.  
4b00: 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20    SqliteDb *pDb 
4b10: 3d 20 28 53 71 6c 69 74 65 44 62 20 2a 29 61 70  = (SqliteDb *)ap
4b20: 41 72 67 5b 69 5d 3b 0a 20 20 20 20 73 65 74 54  Arg[i];.    setT
4b30: 65 73 74 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 56  estUnlockNotifyV
4b40: 61 72 73 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c  ars(pDb->interp,
4b50: 20 69 2c 20 6e 41 72 67 29 3b 0a 20 20 20 20 61   i, nArg);.    a
4b60: 73 73 65 72 74 28 20 70 44 62 2d 3e 70 55 6e 6c  ssert( pDb->pUnl
4b70: 6f 63 6b 4e 6f 74 69 66 79 29 3b 0a 20 20 20 20  ockNotify);.    
4b80: 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70 44  Tcl_EvalObjEx(pD
4b90: 62 2d 3e 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e  b->interp, pDb->
4ba0: 70 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 2c 20 66  pUnlockNotify, f
4bb0: 6c 61 67 73 29 3b 0a 20 20 20 20 54 63 6c 5f 44  lags);.    Tcl_D
4bc0: 65 63 72 52 65 66 43 6f 75 6e 74 28 70 44 62 2d  ecrRefCount(pDb-
4bd0: 3e 70 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 29 3b  >pUnlockNotify);
4be0: 0a 20 20 20 20 70 44 62 2d 3e 70 55 6e 6c 6f 63  .    pDb->pUnloc
4bf0: 6b 4e 6f 74 69 66 79 20 3d 20 30 3b 0a 20 20 7d  kNotify = 0;.  }
4c00: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 73 74 61 74 69  .}.#endif..stati
4c10: 63 20 76 6f 69 64 20 44 62 55 70 64 61 74 65 48  c void DbUpdateH
4c20: 61 6e 64 6c 65 72 28 0a 20 20 76 6f 69 64 20 2a  andler(.  void *
4c30: 70 2c 20 0a 20 20 69 6e 74 20 6f 70 2c 0a 20 20  p, .  int op,.  
4c40: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 2c  const char *zDb,
4c50: 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a   .  const char *
4c60: 7a 54 62 6c 2c 20 0a 20 20 73 71 6c 69 74 65 5f  zTbl, .  sqlite_
4c70: 69 6e 74 36 34 20 72 6f 77 69 64 0a 29 7b 0a 20  int64 rowid.){. 
4c80: 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d   SqliteDb *pDb =
4c90: 20 28 53 71 6c 69 74 65 44 62 20 2a 29 70 3b 0a   (SqliteDb *)p;.
4ca0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 43 6d 64 3b    Tcl_Obj *pCmd;
4cb0: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 44 62 2d  ..  assert( pDb-
4cc0: 3e 70 55 70 64 61 74 65 48 6f 6f 6b 20 29 3b 0a  >pUpdateHook );.
4cd0: 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 53 51    assert( op==SQ
4ce0: 4c 49 54 45 5f 49 4e 53 45 52 54 20 7c 7c 20 6f  LITE_INSERT || o
4cf0: 70 3d 3d 53 51 4c 49 54 45 5f 55 50 44 41 54 45  p==SQLITE_UPDATE
4d00: 20 7c 7c 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 44   || op==SQLITE_D
4d10: 45 4c 45 54 45 20 29 3b 0a 0a 20 20 70 43 6d 64  ELETE );..  pCmd
4d20: 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65   = Tcl_Duplicate
4d30: 4f 62 6a 28 70 44 62 2d 3e 70 55 70 64 61 74 65  Obj(pDb->pUpdate
4d40: 48 6f 6f 6b 29 3b 0a 20 20 54 63 6c 5f 49 6e 63  Hook);.  Tcl_Inc
4d50: 72 52 65 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b  rRefCount(pCmd);
4d60: 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  .  Tcl_ListObjAp
4d70: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70  pendElement(0, p
4d80: 43 6d 64 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Cmd, Tcl_NewStri
4d90: 6e 67 4f 62 6a 28 0a 20 20 20 20 28 20 28 6f 70  ngObj(.    ( (op
4da0: 3d 3d 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 29  ==SQLITE_INSERT)
4db0: 3f 22 49 4e 53 45 52 54 22 3a 28 6f 70 3d 3d 53  ?"INSERT":(op==S
4dc0: 51 4c 49 54 45 5f 55 50 44 41 54 45 29 3f 22 55  QLITE_UPDATE)?"U
4dd0: 50 44 41 54 45 22 3a 22 44 45 4c 45 54 45 22 29  PDATE":"DELETE")
4de0: 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69  , -1));.  Tcl_Li
4df0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
4e00: 6e 74 28 30 2c 20 70 43 6d 64 2c 20 54 63 6c 5f  nt(0, pCmd, Tcl_
4e10: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 44 62  NewStringObj(zDb
4e20: 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69  , -1));.  Tcl_Li
4e30: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
4e40: 6e 74 28 30 2c 20 70 43 6d 64 2c 20 54 63 6c 5f  nt(0, pCmd, Tcl_
4e50: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 54 62  NewStringObj(zTb
4e60: 6c 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c  l, -1));.  Tcl_L
4e70: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
4e80: 65 6e 74 28 30 2c 20 70 43 6d 64 2c 20 54 63 6c  ent(0, pCmd, Tcl
4e90: 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 72  _NewWideIntObj(r
4ea0: 6f 77 69 64 29 29 3b 0a 20 20 54 63 6c 5f 45 76  owid));.  Tcl_Ev
4eb0: 61 6c 4f 62 6a 45 78 28 70 44 62 2d 3e 69 6e 74  alObjEx(pDb->int
4ec0: 65 72 70 2c 20 70 43 6d 64 2c 20 54 43 4c 5f 45  erp, pCmd, TCL_E
4ed0: 56 41 4c 5f 44 49 52 45 43 54 29 3b 0a 20 20 54  VAL_DIRECT);.  T
4ee0: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
4ef0: 70 43 6d 64 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  pCmd);.}..static
4f00: 20 76 6f 69 64 20 74 63 6c 43 6f 6c 6c 61 74 65   void tclCollate
4f10: 4e 65 65 64 65 64 28 0a 20 20 76 6f 69 64 20 2a  Needed(.  void *
4f20: 70 43 74 78 2c 0a 20 20 73 71 6c 69 74 65 33 20  pCtx,.  sqlite3 
4f30: 2a 64 62 2c 0a 20 20 69 6e 74 20 65 6e 63 2c 0a  *db,.  int enc,.
4f40: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
4f50: 61 6d 65 0a 29 7b 0a 20 20 53 71 6c 69 74 65 44  ame.){.  SqliteD
4f60: 62 20 2a 70 44 62 20 3d 20 28 53 71 6c 69 74 65  b *pDb = (Sqlite
4f70: 44 62 20 2a 29 70 43 74 78 3b 0a 20 20 54 63 6c  Db *)pCtx;.  Tcl
4f80: 5f 4f 62 6a 20 2a 70 53 63 72 69 70 74 20 3d 20  _Obj *pScript = 
4f90: 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a  Tcl_DuplicateObj
4fa0: 28 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65  (pDb->pCollateNe
4fb0: 65 64 65 64 29 3b 0a 20 20 54 63 6c 5f 49 6e 63  eded);.  Tcl_Inc
4fc0: 72 52 65 66 43 6f 75 6e 74 28 70 53 63 72 69 70  rRefCount(pScrip
4fd0: 74 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62  t);.  Tcl_ListOb
4fe0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30  jAppendElement(0
4ff0: 2c 20 70 53 63 72 69 70 74 2c 20 54 63 6c 5f 4e  , pScript, Tcl_N
5000: 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 4e 61 6d  ewStringObj(zNam
5010: 65 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 45  e, -1));.  Tcl_E
5020: 76 61 6c 4f 62 6a 45 78 28 70 44 62 2d 3e 69 6e  valObjEx(pDb->in
5030: 74 65 72 70 2c 20 70 53 63 72 69 70 74 2c 20 30  terp, pScript, 0
5040: 29 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66  );.  Tcl_DecrRef
5050: 43 6f 75 6e 74 28 70 53 63 72 69 70 74 29 3b 0a  Count(pScript);.
5060: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
5070: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
5080: 74 6f 20 65 76 61 6c 75 61 74 65 20 61 6e 20 53  to evaluate an S
5090: 51 4c 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e  QL collation fun
50a0: 63 74 69 6f 6e 20 69 6d 70 6c 65 6d 65 6e 74 65  ction implemente
50b0: 64 0a 2a 2a 20 75 73 69 6e 67 20 54 43 4c 20 73  d.** using TCL s
50c0: 63 72 69 70 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  cript..*/.static
50d0: 20 69 6e 74 20 74 63 6c 53 71 6c 43 6f 6c 6c 61   int tclSqlColla
50e0: 74 65 28 0a 20 20 76 6f 69 64 20 2a 70 43 74 78  te(.  void *pCtx
50f0: 2c 0a 20 20 69 6e 74 20 6e 41 2c 0a 20 20 63 6f  ,.  int nA,.  co
5100: 6e 73 74 20 76 6f 69 64 20 2a 7a 41 2c 0a 20 20  nst void *zA,.  
5110: 69 6e 74 20 6e 42 2c 0a 20 20 63 6f 6e 73 74 20  int nB,.  const 
5120: 76 6f 69 64 20 2a 7a 42 0a 29 7b 0a 20 20 53 71  void *zB.){.  Sq
5130: 6c 43 6f 6c 6c 61 74 65 20 2a 70 20 3d 20 28 53  lCollate *p = (S
5140: 71 6c 43 6f 6c 6c 61 74 65 20 2a 29 70 43 74 78  qlCollate *)pCtx
5150: 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 43 6d  ;.  Tcl_Obj *pCm
5160: 64 3b 0a 0a 20 20 70 43 6d 64 20 3d 20 54 63 6c  d;..  pCmd = Tcl
5170: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 2d  _NewStringObj(p-
5180: 3e 7a 53 63 72 69 70 74 2c 20 2d 31 29 3b 0a 20  >zScript, -1);. 
5190: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
51a0: 74 28 70 43 6d 64 29 3b 0a 20 20 54 63 6c 5f 4c  t(pCmd);.  Tcl_L
51b0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
51c0: 65 6e 74 28 70 2d 3e 69 6e 74 65 72 70 2c 20 70  ent(p->interp, p
51d0: 43 6d 64 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Cmd, Tcl_NewStri
51e0: 6e 67 4f 62 6a 28 7a 41 2c 20 6e 41 29 29 3b 0a  ngObj(zA, nA));.
51f0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
5200: 65 6e 64 45 6c 65 6d 65 6e 74 28 70 2d 3e 69 6e  endElement(p->in
5210: 74 65 72 70 2c 20 70 43 6d 64 2c 20 54 63 6c 5f  terp, pCmd, Tcl_
5220: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 42 2c  NewStringObj(zB,
5230: 20 6e 42 29 29 3b 0a 20 20 54 63 6c 5f 45 76 61   nB));.  Tcl_Eva
5240: 6c 4f 62 6a 45 78 28 70 2d 3e 69 6e 74 65 72 70  lObjEx(p->interp
5250: 2c 20 70 43 6d 64 2c 20 54 43 4c 5f 45 56 41 4c  , pCmd, TCL_EVAL
5260: 5f 44 49 52 45 43 54 29 3b 0a 20 20 54 63 6c 5f  _DIRECT);.  Tcl_
5270: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 43 6d  DecrRefCount(pCm
5280: 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 61 74  d);.  return (at
5290: 6f 69 28 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  oi(Tcl_GetString
52a0: 52 65 73 75 6c 74 28 70 2d 3e 69 6e 74 65 72 70  Result(p->interp
52b0: 29 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  )));.}../*.** Th
52c0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
52d0: 6c 6c 65 64 20 74 6f 20 65 76 61 6c 75 61 74 65  lled to evaluate
52e0: 20 61 6e 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e   an SQL function
52f0: 20 69 6d 70 6c 65 6d 65 6e 74 65 64 0a 2a 2a 20   implemented.** 
5300: 75 73 69 6e 67 20 54 43 4c 20 73 63 72 69 70 74  using TCL script
5310: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
5320: 20 74 63 6c 53 71 6c 46 75 6e 63 28 73 71 6c 69   tclSqlFunc(sqli
5330: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e  te3_context *con
5340: 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20  text, int argc, 
5350: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 2a 61  sqlite3_value**a
5360: 72 67 76 29 7b 0a 20 20 53 71 6c 46 75 6e 63 20  rgv){.  SqlFunc 
5370: 2a 70 20 3d 20 73 71 6c 69 74 65 33 5f 75 73 65  *p = sqlite3_use
5380: 72 5f 64 61 74 61 28 63 6f 6e 74 65 78 74 29 3b  r_data(context);
5390: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 43 6d 64  .  Tcl_Obj *pCmd
53a0: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ;.  int i;.  int
53b0: 20 72 63 3b 0a 0a 20 20 69 66 28 20 61 72 67 63   rc;..  if( argc
53c0: 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  ==0 ){.    /* If
53d0: 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 61 72   there are no ar
53e0: 67 75 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 66  guments to the f
53f0: 75 6e 63 74 69 6f 6e 2c 20 63 61 6c 6c 20 54 63  unction, call Tc
5400: 6c 5f 45 76 61 6c 4f 62 6a 45 78 20 6f 6e 20 74  l_EvalObjEx on t
5410: 68 65 0a 20 20 20 20 2a 2a 20 73 63 72 69 70 74  he.    ** script
5420: 20 6f 62 6a 65 63 74 20 64 69 72 65 63 74 6c 79   object directly
5430: 2e 20 20 54 68 69 73 20 61 6c 6c 6f 77 73 20 74  .  This allows t
5440: 68 65 20 54 43 4c 20 63 6f 6d 70 69 6c 65 72 20  he TCL compiler 
5450: 74 6f 20 67 65 6e 65 72 61 74 65 0a 20 20 20 20  to generate.    
5460: 2a 2a 20 62 79 74 65 63 6f 64 65 20 66 6f 72 20  ** bytecode for 
5470: 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6f 6e 20 74  the command on t
5480: 68 65 20 66 69 72 73 74 20 69 6e 76 6f 63 61 74  he first invocat
5490: 69 6f 6e 20 61 6e 64 20 74 68 75 73 20 6d 61 6b  ion and thus mak
54a0: 65 0a 20 20 20 20 2a 2a 20 73 75 62 73 65 71 75  e.    ** subsequ
54b0: 65 6e 74 20 69 6e 76 6f 63 61 74 69 6f 6e 73 20  ent invocations 
54c0: 6d 75 63 68 20 66 61 73 74 65 72 2e 20 2a 2f 0a  much faster. */.
54d0: 20 20 20 20 70 43 6d 64 20 3d 20 70 2d 3e 70 53      pCmd = p->pS
54e0: 63 72 69 70 74 3b 0a 20 20 20 20 54 63 6c 5f 49  cript;.    Tcl_I
54f0: 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 43 6d 64  ncrRefCount(pCmd
5500: 29 3b 0a 20 20 20 20 72 63 20 3d 20 54 63 6c 5f  );.    rc = Tcl_
5510: 45 76 61 6c 4f 62 6a 45 78 28 70 2d 3e 69 6e 74  EvalObjEx(p->int
5520: 65 72 70 2c 20 70 43 6d 64 2c 20 30 29 3b 0a 20  erp, pCmd, 0);. 
5530: 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f     Tcl_DecrRefCo
5540: 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20 7d 65 6c  unt(pCmd);.  }el
5550: 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  se{.    /* If th
5560: 65 72 65 20 61 72 65 20 61 72 67 75 6d 65 6e 74  ere are argument
5570: 73 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f  s to the functio
5580: 6e 2c 20 6d 61 6b 65 20 61 20 73 68 61 6c 6c 6f  n, make a shallo
5590: 77 20 63 6f 70 79 20 6f 66 20 74 68 65 0a 20 20  w copy of the.  
55a0: 20 20 2a 2a 20 73 63 72 69 70 74 20 6f 62 6a 65    ** script obje
55b0: 63 74 2c 20 6c 61 70 70 65 6e 64 20 74 68 65 20  ct, lappend the 
55c0: 61 72 67 75 6d 65 6e 74 73 2c 20 74 68 65 6e 20  arguments, then 
55d0: 65 76 61 6c 75 61 74 65 20 74 68 65 20 63 6f 70  evaluate the cop
55e0: 79 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  y..    **.    **
55f0: 20 42 79 20 22 73 68 61 6c 6c 6f 77 22 20 63 6f   By "shallow" co
5600: 70 79 2c 20 77 65 20 6d 65 61 6e 20 61 20 6f 6e  py, we mean a on
5610: 6c 79 20 74 68 65 20 6f 75 74 65 72 20 6c 69 73  ly the outer lis
5620: 74 20 54 63 6c 5f 4f 62 6a 20 69 73 20 64 75 70  t Tcl_Obj is dup
5630: 6c 69 63 61 74 65 64 2e 0a 20 20 20 20 2a 2a 20  licated..    ** 
5640: 54 68 65 20 6e 65 77 20 54 63 6c 5f 4f 62 6a 20  The new Tcl_Obj 
5650: 63 6f 6e 74 61 69 6e 73 20 70 6f 69 6e 74 65 72  contains pointer
5660: 73 20 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61  s to the origina
5670: 6c 20 6c 69 73 74 20 65 6c 65 6d 65 6e 74 73 2e  l list elements.
5680: 20 0a 20 20 20 20 2a 2a 20 54 68 61 74 20 77 61   .    ** That wa
5690: 79 2c 20 77 68 65 6e 20 54 63 6c 5f 45 76 61 6c  y, when Tcl_Eval
56a0: 4f 62 6a 76 28 29 20 69 73 20 72 75 6e 20 61 6e  Objv() is run an
56b0: 64 20 73 68 69 6d 6d 65 72 73 20 74 68 65 20 66  d shimmers the f
56c0: 69 72 73 74 20 65 6c 65 6d 65 6e 74 0a 20 20 20  irst element.   
56d0: 20 2a 2a 20 6f 66 20 74 68 65 20 6c 69 73 74 20   ** of the list 
56e0: 74 6f 20 74 63 6c 43 6d 64 4e 61 6d 65 54 79 70  to tclCmdNameTyp
56f0: 65 2c 20 74 68 61 74 20 61 6c 74 65 72 6e 61 74  e, that alternat
5700: 65 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  e representation
5710: 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20   will.    ** be 
5720: 70 72 65 73 65 72 76 65 64 20 61 6e 64 20 72 65  preserved and re
5730: 75 73 65 64 20 6f 6e 20 74 68 65 20 6e 65 78 74  used on the next
5740: 20 69 6e 76 6f 63 61 74 69 6f 6e 2e 0a 20 20 20   invocation..   
5750: 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20   */.    Tcl_Obj 
5760: 2a 2a 61 41 72 67 3b 0a 20 20 20 20 69 6e 74 20  **aArg;.    int 
5770: 6e 41 72 67 3b 0a 20 20 20 20 69 66 28 20 54 63  nArg;.    if( Tc
5780: 6c 5f 4c 69 73 74 4f 62 6a 47 65 74 45 6c 65 6d  l_ListObjGetElem
5790: 65 6e 74 73 28 70 2d 3e 69 6e 74 65 72 70 2c 20  ents(p->interp, 
57a0: 70 2d 3e 70 53 63 72 69 70 74 2c 20 26 6e 41 72  p->pScript, &nAr
57b0: 67 2c 20 26 61 41 72 67 29 20 29 7b 0a 20 20 20  g, &aArg) ){.   
57c0: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
57d0: 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c  t_error(context,
57e0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65   Tcl_GetStringRe
57f0: 73 75 6c 74 28 70 2d 3e 69 6e 74 65 72 70 29 2c  sult(p->interp),
5800: 20 2d 31 29 3b 20 0a 20 20 20 20 20 20 72 65 74   -1); .      ret
5810: 75 72 6e 3b 0a 20 20 20 20 7d 20 20 20 20 20 0a  urn;.    }     .
5820: 20 20 20 20 70 43 6d 64 20 3d 20 54 63 6c 5f 4e      pCmd = Tcl_N
5830: 65 77 4c 69 73 74 4f 62 6a 28 6e 41 72 67 2c 20  ewListObj(nArg, 
5840: 61 41 72 67 29 3b 0a 20 20 20 20 54 63 6c 5f 49  aArg);.    Tcl_I
5850: 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 43 6d 64  ncrRefCount(pCmd
5860: 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
5870: 69 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20  i<argc; i++){.  
5880: 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75      sqlite3_valu
5890: 65 20 2a 70 49 6e 20 3d 20 61 72 67 76 5b 69 5d  e *pIn = argv[i]
58a0: 3b 0a 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20  ;.      Tcl_Obj 
58b0: 2a 70 56 61 6c 3b 0a 20 20 20 20 20 20 20 20 20  *pVal;.         
58c0: 20 20 20 0a 20 20 20 20 20 20 2f 2a 20 53 65 74     .      /* Set
58d0: 20 70 56 61 6c 20 74 6f 20 63 6f 6e 74 61 69 6e   pVal to contain
58e0: 20 74 68 65 20 69 27 74 68 20 63 6f 6c 75 6d 6e   the i'th column
58f0: 20 6f 66 20 74 68 69 73 20 72 6f 77 2e 20 2a 2f   of this row. */
5900: 0a 20 20 20 20 20 20 73 77 69 74 63 68 28 20 73  .      switch( s
5910: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
5920: 65 28 70 49 6e 29 20 29 7b 0a 20 20 20 20 20 20  e(pIn) ){.      
5930: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 42 4c    case SQLITE_BL
5940: 4f 42 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20  OB: {.          
5950: 69 6e 74 20 62 79 74 65 73 20 3d 20 73 71 6c 69  int bytes = sqli
5960: 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28  te3_value_bytes(
5970: 70 49 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20  pIn);.          
5980: 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 42 79  pVal = Tcl_NewBy
5990: 74 65 41 72 72 61 79 4f 62 6a 28 73 71 6c 69 74  teArrayObj(sqlit
59a0: 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 70 49  e3_value_blob(pI
59b0: 6e 29 2c 20 62 79 74 65 73 29 3b 0a 20 20 20 20  n), bytes);.    
59c0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
59d0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63       }.        c
59e0: 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 47  ase SQLITE_INTEG
59f0: 45 52 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20  ER: {.          
5a00: 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 76 20 3d  sqlite_int64 v =
5a10: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69   sqlite3_value_i
5a20: 6e 74 36 34 28 70 49 6e 29 3b 0a 20 20 20 20 20  nt64(pIn);.     
5a30: 20 20 20 20 20 69 66 28 20 76 3e 3d 2d 32 31 34       if( v>=-214
5a40: 37 34 38 33 36 34 37 20 26 26 20 76 3c 3d 32 31  7483647 && v<=21
5a50: 34 37 34 38 33 36 34 37 20 29 7b 0a 20 20 20 20  47483647 ){.    
5a60: 20 20 20 20 20 20 20 20 70 56 61 6c 20 3d 20 54          pVal = T
5a70: 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 76 29 3b  cl_NewIntObj(v);
5a80: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
5a90: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 56  {.            pV
5aa0: 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 57 69 64 65  al = Tcl_NewWide
5ab0: 49 6e 74 4f 62 6a 28 76 29 3b 0a 20 20 20 20 20  IntObj(v);.     
5ac0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
5ad0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
5ae0: 7d 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 53  }.        case S
5af0: 51 4c 49 54 45 5f 46 4c 4f 41 54 3a 20 7b 0a 20  QLITE_FLOAT: {. 
5b00: 20 20 20 20 20 20 20 20 20 64 6f 75 62 6c 65 20           double 
5b10: 72 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  r = sqlite3_valu
5b20: 65 5f 64 6f 75 62 6c 65 28 70 49 6e 29 3b 0a 20  e_double(pIn);. 
5b30: 20 20 20 20 20 20 20 20 20 70 56 61 6c 20 3d 20           pVal = 
5b40: 54 63 6c 5f 4e 65 77 44 6f 75 62 6c 65 4f 62 6a  Tcl_NewDoubleObj
5b50: 28 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62  (r);.          b
5b60: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
5b70: 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c          case SQL
5b80: 49 54 45 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20  ITE_NULL: {.    
5b90: 20 20 20 20 20 20 70 56 61 6c 20 3d 20 54 63 6c        pVal = Tcl
5ba0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 22  _NewStringObj(""
5bb0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
5bc0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
5bd0: 0a 20 20 20 20 20 20 20 20 64 65 66 61 75 6c 74  .        default
5be0: 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  : {.          in
5bf0: 74 20 62 79 74 65 73 20 3d 20 73 71 6c 69 74 65  t bytes = sqlite
5c00: 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 70 49  3_value_bytes(pI
5c10: 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 56  n);.          pV
5c20: 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69  al = Tcl_NewStri
5c30: 6e 67 4f 62 6a 28 28 63 68 61 72 20 2a 29 73 71  ngObj((char *)sq
5c40: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
5c50: 28 70 49 6e 29 2c 20 62 79 74 65 73 29 3b 0a 20  (pIn), bytes);. 
5c60: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
5c70: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
5c80: 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 54 63 6c  }.      rc = Tcl
5c90: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
5ca0: 65 6d 65 6e 74 28 70 2d 3e 69 6e 74 65 72 70 2c  ement(p->interp,
5cb0: 20 70 43 6d 64 2c 20 70 56 61 6c 29 3b 0a 20 20   pCmd, pVal);.  
5cc0: 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
5cd0: 20 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65        Tcl_DecrRe
5ce0: 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20  fCount(pCmd);.  
5cf0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
5d00: 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65  sult_error(conte
5d10: 78 74 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  xt, Tcl_GetStrin
5d20: 67 52 65 73 75 6c 74 28 70 2d 3e 69 6e 74 65 72  gResult(p->inter
5d30: 70 29 2c 20 2d 31 29 3b 20 0a 20 20 20 20 20 20  p), -1); .      
5d40: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20    return;.      
5d50: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
5d60: 21 70 2d 3e 75 73 65 45 76 61 6c 4f 62 6a 76 20  !p->useEvalObjv 
5d70: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 63 6c 5f  ){.      /* Tcl_
5d80: 45 76 61 6c 4f 62 6a 45 78 28 29 20 77 69 6c 6c  EvalObjEx() will
5d90: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63   automatically c
5da0: 61 6c 6c 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 76  all Tcl_EvalObjv
5db0: 28 29 20 69 66 20 70 43 6d 64 0a 20 20 20 20 20  () if pCmd.     
5dc0: 20 2a 2a 20 69 73 20 61 20 6c 69 73 74 20 77 69   ** is a list wi
5dd0: 74 68 6f 75 74 20 61 20 73 74 72 69 6e 67 20 72  thout a string r
5de0: 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 2e 20 20  epresentation.  
5df0: 54 6f 20 70 72 65 76 65 6e 74 20 74 68 69 73 20  To prevent this 
5e00: 66 72 6f 6d 0a 20 20 20 20 20 20 2a 2a 20 68 61  from.      ** ha
5e10: 70 70 65 6e 69 6e 67 2c 20 6d 61 6b 65 20 73 75  ppening, make su
5e20: 72 65 20 70 43 6d 64 20 68 61 73 20 61 20 76 61  re pCmd has a va
5e30: 6c 69 64 20 73 74 72 69 6e 67 20 72 65 70 72 65  lid string repre
5e40: 73 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 20  sentation */.   
5e50: 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
5e60: 28 70 43 6d 64 29 3b 0a 20 20 20 20 7d 0a 20 20  (pCmd);.    }.  
5e70: 20 20 72 63 20 3d 20 54 63 6c 5f 45 76 61 6c 4f    rc = Tcl_EvalO
5e80: 62 6a 45 78 28 70 2d 3e 69 6e 74 65 72 70 2c 20  bjEx(p->interp, 
5e90: 70 43 6d 64 2c 20 54 43 4c 5f 45 56 41 4c 5f 44  pCmd, TCL_EVAL_D
5ea0: 49 52 45 43 54 29 3b 0a 20 20 20 20 54 63 6c 5f  IRECT);.    Tcl_
5eb0: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 43 6d  DecrRefCount(pCm
5ec0: 64 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72  d);.  }..  if( r
5ed0: 63 20 26 26 20 72 63 21 3d 54 43 4c 5f 52 45 54  c && rc!=TCL_RET
5ee0: 55 52 4e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  URN ){.    sqlit
5ef0: 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28  e3_result_error(
5f00: 63 6f 6e 74 65 78 74 2c 20 54 63 6c 5f 47 65 74  context, Tcl_Get
5f10: 53 74 72 69 6e 67 52 65 73 75 6c 74 28 70 2d 3e  StringResult(p->
5f20: 69 6e 74 65 72 70 29 2c 20 2d 31 29 3b 20 0a 20  interp), -1); . 
5f30: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 54 63 6c 5f   }else{.    Tcl_
5f40: 4f 62 6a 20 2a 70 56 61 72 20 3d 20 54 63 6c 5f  Obj *pVar = Tcl_
5f50: 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 70 2d 3e  GetObjResult(p->
5f60: 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 69 6e 74  interp);.    int
5f70: 20 6e 3b 0a 20 20 20 20 75 38 20 2a 64 61 74 61   n;.    u8 *data
5f80: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
5f90: 20 2a 7a 54 79 70 65 20 3d 20 28 70 56 61 72 2d   *zType = (pVar-
5fa0: 3e 74 79 70 65 50 74 72 20 3f 20 70 56 61 72 2d  >typePtr ? pVar-
5fb0: 3e 74 79 70 65 50 74 72 2d 3e 6e 61 6d 65 20 3a  >typePtr->name :
5fc0: 20 22 22 29 3b 0a 20 20 20 20 63 68 61 72 20 63   "");.    char c
5fd0: 20 3d 20 7a 54 79 70 65 5b 30 5d 3b 0a 20 20 20   = zType[0];.   
5fe0: 20 69 66 28 20 63 3d 3d 27 62 27 20 26 26 20 73   if( c=='b' && s
5ff0: 74 72 63 6d 70 28 7a 54 79 70 65 2c 22 62 79 74  trcmp(zType,"byt
6000: 65 61 72 72 61 79 22 29 3d 3d 30 20 26 26 20 70  earray")==0 && p
6010: 56 61 72 2d 3e 62 79 74 65 73 3d 3d 30 20 29 7b  Var->bytes==0 ){
6020: 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 72  .      /* Only r
6030: 65 74 75 72 6e 20 61 20 42 4c 4f 42 20 74 79 70  eturn a BLOB typ
6040: 65 20 69 66 20 74 68 65 20 54 63 6c 20 76 61 72  e if the Tcl var
6050: 69 61 62 6c 65 20 69 73 20 61 20 62 79 74 65 61  iable is a bytea
6060: 72 72 61 79 20 61 6e 64 0a 20 20 20 20 20 20 2a  rray and.      *
6070: 2a 20 68 61 73 20 6e 6f 20 73 74 72 69 6e 67 20  * has no string 
6080: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 2e 20  representation. 
6090: 2a 2f 0a 20 20 20 20 20 20 64 61 74 61 20 3d 20  */.      data = 
60a0: 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79  Tcl_GetByteArray
60b0: 46 72 6f 6d 4f 62 6a 28 70 56 61 72 2c 20 26 6e  FromObj(pVar, &n
60c0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
60d0: 5f 72 65 73 75 6c 74 5f 62 6c 6f 62 28 63 6f 6e  _result_blob(con
60e0: 74 65 78 74 2c 20 64 61 74 61 2c 20 6e 2c 20 53  text, data, n, S
60f0: 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
6100: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
6110: 63 3d 3d 27 62 27 20 26 26 20 73 74 72 63 6d 70  c=='b' && strcmp
6120: 28 7a 54 79 70 65 2c 22 62 6f 6f 6c 65 61 6e 22  (zType,"boolean"
6130: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 54 63  )==0 ){.      Tc
6140: 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
6150: 30 2c 20 70 56 61 72 2c 20 26 6e 29 3b 0a 20 20  0, pVar, &n);.  
6160: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
6170: 6c 74 5f 69 6e 74 28 63 6f 6e 74 65 78 74 2c 20  lt_int(context, 
6180: 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  n);.    }else if
6190: 28 20 63 3d 3d 27 64 27 20 26 26 20 73 74 72 63  ( c=='d' && strc
61a0: 6d 70 28 7a 54 79 70 65 2c 22 64 6f 75 62 6c 65  mp(zType,"double
61b0: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 64  ")==0 ){.      d
61c0: 6f 75 62 6c 65 20 72 3b 0a 20 20 20 20 20 20 54  ouble r;.      T
61d0: 63 6c 5f 47 65 74 44 6f 75 62 6c 65 46 72 6f 6d  cl_GetDoubleFrom
61e0: 4f 62 6a 28 30 2c 20 70 56 61 72 2c 20 26 72 29  Obj(0, pVar, &r)
61f0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
6200: 72 65 73 75 6c 74 5f 64 6f 75 62 6c 65 28 63 6f  result_double(co
6210: 6e 74 65 78 74 2c 20 72 29 3b 0a 20 20 20 20 7d  ntext, r);.    }
6220: 65 6c 73 65 20 69 66 28 20 28 63 3d 3d 27 77 27  else if( (c=='w'
6230: 20 26 26 20 73 74 72 63 6d 70 28 7a 54 79 70 65   && strcmp(zType
6240: 2c 22 77 69 64 65 49 6e 74 22 29 3d 3d 30 29 20  ,"wideInt")==0) 
6250: 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 28 63 3d  ||.          (c=
6260: 3d 27 69 27 20 26 26 20 73 74 72 63 6d 70 28 7a  ='i' && strcmp(z
6270: 54 79 70 65 2c 22 69 6e 74 22 29 3d 3d 30 29 20  Type,"int")==0) 
6280: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 69 64  ){.      Tcl_Wid
6290: 65 49 6e 74 20 76 3b 0a 20 20 20 20 20 20 54 63  eInt v;.      Tc
62a0: 6c 5f 47 65 74 57 69 64 65 49 6e 74 46 72 6f 6d  l_GetWideIntFrom
62b0: 4f 62 6a 28 30 2c 20 70 56 61 72 2c 20 26 76 29  Obj(0, pVar, &v)
62c0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
62d0: 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 63 6f 6e  result_int64(con
62e0: 74 65 78 74 2c 20 76 29 3b 0a 20 20 20 20 7d 65  text, v);.    }e
62f0: 6c 73 65 7b 0a 20 20 20 20 20 20 64 61 74 61 20  lse{.      data 
6300: 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  = (unsigned char
6310: 20 2a 29 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   *)Tcl_GetString
6320: 46 72 6f 6d 4f 62 6a 28 70 56 61 72 2c 20 26 6e  FromObj(pVar, &n
6330: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
6340: 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e  _result_text(con
6350: 74 65 78 74 2c 20 28 63 68 61 72 20 2a 29 64 61  text, (char *)da
6360: 74 61 2c 20 6e 2c 20 53 51 4c 49 54 45 5f 54 52  ta, n, SQLITE_TR
6370: 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 7d 0a  ANSIENT);.    }.
6380: 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53    }.}..#ifndef S
6390: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f  QLITE_OMIT_AUTHO
63a0: 52 49 5a 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 54  RIZATION./*.** T
63b0: 68 69 73 20 69 73 20 74 68 65 20 61 75 74 68 65  his is the authe
63c0: 6e 74 69 63 61 74 69 6f 6e 20 66 75 6e 63 74 69  ntication functi
63d0: 6f 6e 2e 20 20 49 74 20 61 70 70 65 6e 64 73 20  on.  It appends 
63e0: 74 68 65 20 61 75 74 68 65 6e 74 69 63 61 74 69  the authenticati
63f0: 6f 6e 0a 2a 2a 20 74 79 70 65 20 63 6f 64 65 20  on.** type code 
6400: 61 6e 64 20 74 68 65 20 74 77 6f 20 61 72 67 75  and the two argu
6410: 6d 65 6e 74 73 20 74 6f 20 7a 43 6d 64 5b 5d 20  ments to zCmd[] 
6420: 74 68 65 6e 20 69 6e 76 6f 6b 65 73 20 74 68 65  then invokes the
6430: 20 72 65 73 75 6c 74 0a 2a 2a 20 6f 6e 20 74 68   result.** on th
6440: 65 20 69 6e 74 65 72 70 72 65 74 65 72 2e 20 20  e interpreter.  
6450: 54 68 65 20 72 65 70 6c 79 20 69 73 20 65 78 61  The reply is exa
6460: 6d 69 6e 65 64 20 74 6f 20 64 65 74 65 72 6d 69  mined to determi
6470: 6e 65 20 69 66 20 74 68 65 0a 2a 2a 20 61 75 74  ne if the.** aut
6480: 68 65 6e 74 69 63 61 74 69 6f 6e 20 66 61 69 6c  hentication fail
6490: 73 20 6f 72 20 73 75 63 63 65 65 64 73 2e 0a 2a  s or succeeds..*
64a0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 75 74  /.static int aut
64b0: 68 5f 63 61 6c 6c 62 61 63 6b 28 0a 20 20 76 6f  h_callback(.  vo
64c0: 69 64 20 2a 70 41 72 67 2c 0a 20 20 69 6e 74 20  id *pArg,.  int 
64d0: 63 6f 64 65 2c 0a 20 20 63 6f 6e 73 74 20 63 68  code,.  const ch
64e0: 61 72 20 2a 7a 41 72 67 31 2c 0a 20 20 63 6f 6e  ar *zArg1,.  con
64f0: 73 74 20 63 68 61 72 20 2a 7a 41 72 67 32 2c 0a  st char *zArg2,.
6500: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41    const char *zA
6510: 72 67 33 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  rg3,.  const cha
6520: 72 20 2a 7a 41 72 67 34 0a 29 7b 0a 20 20 63 68  r *zArg4.){.  ch
6530: 61 72 20 2a 7a 43 6f 64 65 3b 0a 20 20 54 63 6c  ar *zCode;.  Tcl
6540: 5f 44 53 74 72 69 6e 67 20 73 74 72 3b 0a 20 20  _DString str;.  
6550: 69 6e 74 20 72 63 3b 0a 20 20 63 6f 6e 73 74 20  int rc;.  const 
6560: 63 68 61 72 20 2a 7a 52 65 70 6c 79 3b 0a 20 20  char *zReply;.  
6570: 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20  SqliteDb *pDb = 
6580: 28 53 71 6c 69 74 65 44 62 2a 29 70 41 72 67 3b  (SqliteDb*)pArg;
6590: 0a 20 20 69 66 28 20 70 44 62 2d 3e 64 69 73 61  .  if( pDb->disa
65a0: 62 6c 65 41 75 74 68 20 29 20 72 65 74 75 72 6e  bleAuth ) return
65b0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 73   SQLITE_OK;..  s
65c0: 77 69 74 63 68 28 20 63 6f 64 65 20 29 7b 0a 20  witch( code ){. 
65d0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
65e0: 4f 50 59 20 20 20 20 20 20 20 20 20 20 20 20 20  OPY             
65f0: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
6600: 5f 43 4f 50 59 22 3b 20 62 72 65 61 6b 3b 0a 20  _COPY"; break;. 
6610: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
6620: 52 45 41 54 45 5f 49 4e 44 45 58 20 20 20 20 20  REATE_INDEX     
6630: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
6640: 5f 43 52 45 41 54 45 5f 49 4e 44 45 58 22 3b 20  _CREATE_INDEX"; 
6650: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
6660: 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 41  SQLITE_CREATE_TA
6670: 42 4c 45 20 20 20 20 20 20 3a 20 7a 43 6f 64 65  BLE      : zCode
6680: 3d 22 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  ="SQLITE_CREATE_
6690: 54 41 42 4c 45 22 3b 20 62 72 65 61 6b 3b 0a 20  TABLE"; break;. 
66a0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
66b0: 52 45 41 54 45 5f 54 45 4d 50 5f 49 4e 44 45 58  REATE_TEMP_INDEX
66c0: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
66d0: 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 49 4e 44  _CREATE_TEMP_IND
66e0: 45 58 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  EX"; break;.    
66f0: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 52 45 41  case SQLITE_CREA
6700: 54 45 5f 54 45 4d 50 5f 54 41 42 4c 45 20 3a 20  TE_TEMP_TABLE : 
6710: 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43 52  zCode="SQLITE_CR
6720: 45 41 54 45 5f 54 45 4d 50 5f 54 41 42 4c 45 22  EATE_TEMP_TABLE"
6730: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
6740: 65 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  e SQLITE_CREATE_
6750: 54 45 4d 50 5f 54 52 49 47 47 45 52 3a 20 7a 43  TEMP_TRIGGER: zC
6760: 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43 52 45 41  ode="SQLITE_CREA
6770: 54 45 5f 54 45 4d 50 5f 54 52 49 47 47 45 52 22  TE_TEMP_TRIGGER"
6780: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
6790: 65 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  e SQLITE_CREATE_
67a0: 54 45 4d 50 5f 56 49 45 57 20 20 3a 20 7a 43 6f  TEMP_VIEW  : zCo
67b0: 64 65 3d 22 53 51 4c 49 54 45 5f 43 52 45 41 54  de="SQLITE_CREAT
67c0: 45 5f 54 45 4d 50 5f 56 49 45 57 22 3b 20 62 72  E_TEMP_VIEW"; br
67d0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
67e0: 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 52 49 47  LITE_CREATE_TRIG
67f0: 47 45 52 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22  GER    : zCode="
6800: 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 52  SQLITE_CREATE_TR
6810: 49 47 47 45 52 22 3b 20 62 72 65 61 6b 3b 0a 20  IGGER"; break;. 
6820: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
6830: 52 45 41 54 45 5f 56 49 45 57 20 20 20 20 20 20  REATE_VIEW      
6840: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
6850: 5f 43 52 45 41 54 45 5f 56 49 45 57 22 3b 20 62  _CREATE_VIEW"; b
6860: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
6870: 51 4c 49 54 45 5f 44 45 4c 45 54 45 20 20 20 20  QLITE_DELETE    
6880: 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d          : zCode=
6890: 22 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 22 3b  "SQLITE_DELETE";
68a0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
68b0: 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 49 4e 44   SQLITE_DROP_IND
68c0: 45 58 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64  EX        : zCod
68d0: 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f 49  e="SQLITE_DROP_I
68e0: 4e 44 45 58 22 3b 20 62 72 65 61 6b 3b 0a 20 20  NDEX"; break;.  
68f0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44 52    case SQLITE_DR
6900: 4f 50 5f 54 41 42 4c 45 20 20 20 20 20 20 20 20  OP_TABLE        
6910: 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f  : zCode="SQLITE_
6920: 44 52 4f 50 5f 54 41 42 4c 45 22 3b 20 62 72 65  DROP_TABLE"; bre
6930: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
6940: 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 49 4e  ITE_DROP_TEMP_IN
6950: 44 45 58 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53  DEX   : zCode="S
6960: 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f  QLITE_DROP_TEMP_
6970: 49 4e 44 45 58 22 3b 20 62 72 65 61 6b 3b 0a 20  INDEX"; break;. 
6980: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44     case SQLITE_D
6990: 52 4f 50 5f 54 45 4d 50 5f 54 41 42 4c 45 20 20  ROP_TEMP_TABLE  
69a0: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
69b0: 5f 44 52 4f 50 5f 54 45 4d 50 5f 54 41 42 4c 45  _DROP_TEMP_TABLE
69c0: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
69d0: 73 65 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54  se SQLITE_DROP_T
69e0: 45 4d 50 5f 54 52 49 47 47 45 52 20 3a 20 7a 43  EMP_TRIGGER : zC
69f0: 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50  ode="SQLITE_DROP
6a00: 5f 54 45 4d 50 5f 54 52 49 47 47 45 52 22 3b 20  _TEMP_TRIGGER"; 
6a10: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
6a20: 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50  SQLITE_DROP_TEMP
6a30: 5f 56 49 45 57 20 20 20 20 3a 20 7a 43 6f 64 65  _VIEW    : zCode
6a40: 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45  ="SQLITE_DROP_TE
6a50: 4d 50 5f 56 49 45 57 22 3b 20 62 72 65 61 6b 3b  MP_VIEW"; break;
6a60: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
6a70: 5f 44 52 4f 50 5f 54 52 49 47 47 45 52 20 20 20  _DROP_TRIGGER   
6a80: 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49     : zCode="SQLI
6a90: 54 45 5f 44 52 4f 50 5f 54 52 49 47 47 45 52 22  TE_DROP_TRIGGER"
6aa0: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
6ab0: 65 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56 49  e SQLITE_DROP_VI
6ac0: 45 57 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f  EW         : zCo
6ad0: 64 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f  de="SQLITE_DROP_
6ae0: 56 49 45 57 22 3b 20 62 72 65 61 6b 3b 0a 20 20  VIEW"; break;.  
6af0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e    case SQLITE_IN
6b00: 53 45 52 54 20 20 20 20 20 20 20 20 20 20 20 20  SERT            
6b10: 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f  : zCode="SQLITE_
6b20: 49 4e 53 45 52 54 22 3b 20 62 72 65 61 6b 3b 0a  INSERT"; break;.
6b30: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
6b40: 50 52 41 47 4d 41 20 20 20 20 20 20 20 20 20 20  PRAGMA          
6b50: 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54    : zCode="SQLIT
6b60: 45 5f 50 52 41 47 4d 41 22 3b 20 62 72 65 61 6b  E_PRAGMA"; break
6b70: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
6b80: 45 5f 52 45 41 44 20 20 20 20 20 20 20 20 20 20  E_READ          
6b90: 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c      : zCode="SQL
6ba0: 49 54 45 5f 52 45 41 44 22 3b 20 62 72 65 61 6b  ITE_READ"; break
6bb0: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
6bc0: 45 5f 53 45 4c 45 43 54 20 20 20 20 20 20 20 20  E_SELECT        
6bd0: 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c      : zCode="SQL
6be0: 49 54 45 5f 53 45 4c 45 43 54 22 3b 20 62 72 65  ITE_SELECT"; bre
6bf0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
6c00: 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 20  ITE_TRANSACTION 
6c10: 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53        : zCode="S
6c20: 51 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f  QLITE_TRANSACTIO
6c30: 4e 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  N"; break;.    c
6c40: 61 73 65 20 53 51 4c 49 54 45 5f 55 50 44 41 54  ase SQLITE_UPDAT
6c50: 45 20 20 20 20 20 20 20 20 20 20 20 20 3a 20 7a  E            : z
6c60: 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 55 50 44  Code="SQLITE_UPD
6c70: 41 54 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  ATE"; break;.   
6c80: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 54 54   case SQLITE_ATT
6c90: 41 43 48 20 20 20 20 20 20 20 20 20 20 20 20 3a  ACH            :
6ca0: 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 41   zCode="SQLITE_A
6cb0: 54 54 41 43 48 22 3b 20 62 72 65 61 6b 3b 0a 20  TTACH"; break;. 
6cc0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44     case SQLITE_D
6cd0: 45 54 41 43 48 20 20 20 20 20 20 20 20 20 20 20  ETACH           
6ce0: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
6cf0: 5f 44 45 54 41 43 48 22 3b 20 62 72 65 61 6b 3b  _DETACH"; break;
6d00: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
6d10: 5f 41 4c 54 45 52 5f 54 41 42 4c 45 20 20 20 20  _ALTER_TABLE    
6d20: 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49     : zCode="SQLI
6d30: 54 45 5f 41 4c 54 45 52 5f 54 41 42 4c 45 22 3b  TE_ALTER_TABLE";
6d40: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
6d50: 20 53 51 4c 49 54 45 5f 52 45 49 4e 44 45 58 20   SQLITE_REINDEX 
6d60: 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64            : zCod
6d70: 65 3d 22 53 51 4c 49 54 45 5f 52 45 49 4e 44 45  e="SQLITE_REINDE
6d80: 58 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  X"; break;.    c
6d90: 61 73 65 20 53 51 4c 49 54 45 5f 41 4e 41 4c 59  ase SQLITE_ANALY
6da0: 5a 45 20 20 20 20 20 20 20 20 20 20 20 3a 20 7a  ZE           : z
6db0: 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 41 4e 41  Code="SQLITE_ANA
6dc0: 4c 59 5a 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20  LYZE"; break;.  
6dd0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 52    case SQLITE_CR
6de0: 45 41 54 45 5f 56 54 41 42 4c 45 20 20 20 20 20  EATE_VTABLE     
6df0: 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f  : zCode="SQLITE_
6e00: 43 52 45 41 54 45 5f 56 54 41 42 4c 45 22 3b 20  CREATE_VTABLE"; 
6e10: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
6e20: 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56 54 41 42  SQLITE_DROP_VTAB
6e30: 4c 45 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65  LE       : zCode
6e40: 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56 54  ="SQLITE_DROP_VT
6e50: 41 42 4c 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20  ABLE"; break;.  
6e60: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 55    case SQLITE_FU
6e70: 4e 43 54 49 4f 4e 20 20 20 20 20 20 20 20 20 20  NCTION          
6e80: 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f  : zCode="SQLITE_
6e90: 46 55 4e 43 54 49 4f 4e 22 3b 20 62 72 65 61 6b  FUNCTION"; break
6ea0: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
6eb0: 45 5f 53 41 56 45 50 4f 49 4e 54 20 20 20 20 20  E_SAVEPOINT     
6ec0: 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c      : zCode="SQL
6ed0: 49 54 45 5f 53 41 56 45 50 4f 49 4e 54 22 3b 20  ITE_SAVEPOINT"; 
6ee0: 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75  break;.    defau
6ef0: 6c 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  lt              
6f00: 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65           : zCode
6f10: 3d 22 3f 3f 3f 3f 22 3b 20 62 72 65 61 6b 3b 0a  ="????"; break;.
6f20: 20 20 7d 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e    }.  Tcl_DStrin
6f30: 67 49 6e 69 74 28 26 73 74 72 29 3b 0a 20 20 54  gInit(&str);.  T
6f40: 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64  cl_DStringAppend
6f50: 28 26 73 74 72 2c 20 70 44 62 2d 3e 7a 41 75 74  (&str, pDb->zAut
6f60: 68 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 44 53  h, -1);.  Tcl_DS
6f70: 74 72 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65  tringAppendEleme
6f80: 6e 74 28 26 73 74 72 2c 20 7a 43 6f 64 65 29 3b  nt(&str, zCode);
6f90: 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70  .  Tcl_DStringAp
6fa0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 26 73 74 72  pendElement(&str
6fb0: 2c 20 7a 41 72 67 31 20 3f 20 7a 41 72 67 31 20  , zArg1 ? zArg1 
6fc0: 3a 20 22 22 29 3b 0a 20 20 54 63 6c 5f 44 53 74  : "");.  Tcl_DSt
6fd0: 72 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e  ringAppendElemen
6fe0: 74 28 26 73 74 72 2c 20 7a 41 72 67 32 20 3f 20  t(&str, zArg2 ? 
6ff0: 7a 41 72 67 32 20 3a 20 22 22 29 3b 0a 20 20 54  zArg2 : "");.  T
7000: 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64  cl_DStringAppend
7010: 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c 20 7a 41  Element(&str, zA
7020: 72 67 33 20 3f 20 7a 41 72 67 33 20 3a 20 22 22  rg3 ? zArg3 : ""
7030: 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  );.  Tcl_DString
7040: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 26 73  AppendElement(&s
7050: 74 72 2c 20 7a 41 72 67 34 20 3f 20 7a 41 72 67  tr, zArg4 ? zArg
7060: 34 20 3a 20 22 22 29 3b 0a 20 20 72 63 20 3d 20  4 : "");.  rc = 
7070: 54 63 6c 5f 47 6c 6f 62 61 6c 45 76 61 6c 28 70  Tcl_GlobalEval(p
7080: 44 62 2d 3e 69 6e 74 65 72 70 2c 20 54 63 6c 5f  Db->interp, Tcl_
7090: 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 73 74  DStringValue(&st
70a0: 72 29 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69  r));.  Tcl_DStri
70b0: 6e 67 46 72 65 65 28 26 73 74 72 29 3b 0a 20 20  ngFree(&str);.  
70c0: 7a 52 65 70 6c 79 20 3d 20 54 63 6c 5f 47 65 74  zReply = Tcl_Get
70d0: 53 74 72 69 6e 67 52 65 73 75 6c 74 28 70 44 62  StringResult(pDb
70e0: 2d 3e 69 6e 74 65 72 70 29 3b 0a 20 20 69 66 28  ->interp);.  if(
70f0: 20 73 74 72 63 6d 70 28 7a 52 65 70 6c 79 2c 22   strcmp(zReply,"
7100: 53 51 4c 49 54 45 5f 4f 4b 22 29 3d 3d 30 20 29  SQLITE_OK")==0 )
7110: 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
7120: 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 20 69 66  E_OK;.  }else if
7130: 28 20 73 74 72 63 6d 70 28 7a 52 65 70 6c 79 2c  ( strcmp(zReply,
7140: 22 53 51 4c 49 54 45 5f 44 45 4e 59 22 29 3d 3d  "SQLITE_DENY")==
7150: 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  0 ){.    rc = SQ
7160: 4c 49 54 45 5f 44 45 4e 59 3b 0a 20 20 7d 65 6c  LITE_DENY;.  }el
7170: 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 52  se if( strcmp(zR
7180: 65 70 6c 79 2c 22 53 51 4c 49 54 45 5f 49 47 4e  eply,"SQLITE_IGN
7190: 4f 52 45 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ORE")==0 ){.    
71a0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 47 4e 4f  rc = SQLITE_IGNO
71b0: 52 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  RE;.  }else{.   
71c0: 20 72 63 20 3d 20 39 39 39 3b 0a 20 20 7d 0a 20   rc = 999;.  }. 
71d0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65   return rc;.}.#e
71e0: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
71f0: 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f  MIT_AUTHORIZATIO
7200: 4e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 7a 54 65 78  N */../*.** zTex
7210: 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  t is a pointer t
7220: 6f 20 74 65 78 74 20 6f 62 74 61 69 6e 65 64 20  o text obtained 
7230: 76 69 61 20 61 6e 20 73 71 6c 69 74 65 33 5f 72  via an sqlite3_r
7240: 65 73 75 6c 74 5f 74 65 78 74 28 29 0a 2a 2a 20  esult_text().** 
7250: 6f 72 20 73 69 6d 69 6c 61 72 20 69 6e 74 65 72  or similar inter
7260: 66 61 63 65 2e 20 54 68 69 73 20 72 6f 75 74 69  face. This routi
7270: 6e 65 20 72 65 74 75 72 6e 73 20 61 20 54 63 6c  ne returns a Tcl
7280: 20 73 74 72 69 6e 67 20 6f 62 6a 65 63 74 2c 20   string object, 
7290: 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 63 6f  .** reference co
72a0: 75 6e 74 20 73 65 74 20 74 6f 20 30 2c 20 63 6f  unt set to 0, co
72b0: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74 65 78  ntaining the tex
72c0: 74 2e 20 49 66 20 61 20 74 72 61 6e 73 6c 61 74  t. If a translat
72d0: 69 6f 6e 0a 2a 2a 20 62 65 74 77 65 65 6e 20 69  ion.** between i
72e0: 73 6f 38 38 35 39 20 61 6e 64 20 55 54 46 2d 38  so8859 and UTF-8
72f0: 20 69 73 20 72 65 71 75 69 72 65 64 2c 20 69 74   is required, it
7300: 20 69 73 20 70 72 65 66 6f 72 6d 65 64 2e 0a 2a   is preformed..*
7310: 2f 0a 73 74 61 74 69 63 20 54 63 6c 5f 4f 62 6a  /.static Tcl_Obj
7320: 20 2a 64 62 54 65 78 74 54 6f 4f 62 6a 28 63 68   *dbTextToObj(ch
7330: 61 72 20 63 6f 6e 73 74 20 2a 7a 54 65 78 74 29  ar const *zText)
7340: 7b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 56 61  {.  Tcl_Obj *pVa
7350: 6c 3b 0a 23 69 66 64 65 66 20 55 54 46 5f 54 52  l;.#ifdef UTF_TR
7360: 41 4e 53 4c 41 54 49 4f 4e 5f 4e 45 45 44 45 44  ANSLATION_NEEDED
7370: 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 64  .  Tcl_DString d
7380: 43 6f 6c 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69  Col;.  Tcl_DStri
7390: 6e 67 49 6e 69 74 28 26 64 43 6f 6c 29 3b 0a 20  ngInit(&dCol);. 
73a0: 20 54 63 6c 5f 45 78 74 65 72 6e 61 6c 54 6f 55   Tcl_ExternalToU
73b0: 74 66 44 53 74 72 69 6e 67 28 4e 55 4c 4c 2c 20  tfDString(NULL, 
73c0: 7a 54 65 78 74 2c 20 2d 31 2c 20 26 64 43 6f 6c  zText, -1, &dCol
73d0: 29 3b 0a 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f  );.  pVal = Tcl_
73e0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c  NewStringObj(Tcl
73f0: 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 64  _DStringValue(&d
7400: 43 6f 6c 29 2c 20 2d 31 29 3b 0a 20 20 54 63 6c  Col), -1);.  Tcl
7410: 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 43  _DStringFree(&dC
7420: 6f 6c 29 3b 0a 23 65 6c 73 65 0a 20 20 70 56 61  ol);.#else.  pVa
7430: 6c 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  l = Tcl_NewStrin
7440: 67 4f 62 6a 28 7a 54 65 78 74 2c 20 2d 31 29 3b  gObj(zText, -1);
7450: 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
7460: 20 70 56 61 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pVal;.}../*.** 
7470: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 61  This routine rea
7480: 64 73 20 61 20 6c 69 6e 65 20 6f 66 20 74 65 78  ds a line of tex
7490: 74 20 66 72 6f 6d 20 46 49 4c 45 20 69 6e 2c 20  t from FILE in, 
74a0: 73 74 6f 72 65 73 0a 2a 2a 20 74 68 65 20 74 65  stores.** the te
74b0: 78 74 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74  xt in memory obt
74c0: 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f  ained from mallo
74d0: 63 28 29 20 61 6e 64 20 72 65 74 75 72 6e 73 20  c() and returns 
74e0: 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20  a pointer.** to 
74f0: 74 68 65 20 74 65 78 74 2e 20 20 4e 55 4c 4c 20  the text.  NULL 
7500: 69 73 20 72 65 74 75 72 6e 65 64 20 61 74 20 65  is returned at e
7510: 6e 64 20 6f 66 20 66 69 6c 65 2c 20 6f 72 20 69  nd of file, or i
7520: 66 20 6d 61 6c 6c 6f 63 28 29 0a 2a 2a 20 66 61  f malloc().** fa
7530: 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69  ils..**.** The i
7540: 6e 74 65 72 66 61 63 65 20 69 73 20 6c 69 6b 65  nterface is like
7550: 20 22 72 65 61 64 6c 69 6e 65 22 20 62 75 74 20   "readline" but 
7560: 6e 6f 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20  no command-line 
7570: 65 64 69 74 69 6e 67 0a 2a 2a 20 69 73 20 64 6f  editing.** is do
7580: 6e 65 2e 0a 2a 2a 0a 2a 2a 20 63 6f 70 69 65 64  ne..**.** copied
7590: 20 66 72 6f 6d 20 73 68 65 6c 6c 2e 63 20 66 72   from shell.c fr
75a0: 6f 6d 20 27 2e 69 6d 70 6f 72 74 27 20 63 6f 6d  om '.import' com
75b0: 6d 61 6e 64 0a 2a 2f 0a 73 74 61 74 69 63 20 63  mand.*/.static c
75c0: 68 61 72 20 2a 6c 6f 63 61 6c 5f 67 65 74 6c 69  har *local_getli
75d0: 6e 65 28 63 68 61 72 20 2a 7a 50 72 6f 6d 70 74  ne(char *zPrompt
75e0: 2c 20 46 49 4c 45 20 2a 69 6e 29 7b 0a 20 20 63  , FILE *in){.  c
75f0: 68 61 72 20 2a 7a 4c 69 6e 65 3b 0a 20 20 69 6e  har *zLine;.  in
7600: 74 20 6e 4c 69 6e 65 3b 0a 20 20 69 6e 74 20 6e  t nLine;.  int n
7610: 3b 0a 20 20 69 6e 74 20 65 6f 6c 3b 0a 0a 20 20  ;.  int eol;..  
7620: 6e 4c 69 6e 65 20 3d 20 31 30 30 3b 0a 20 20 7a  nLine = 100;.  z
7630: 4c 69 6e 65 20 3d 20 6d 61 6c 6c 6f 63 28 20 6e  Line = malloc( n
7640: 4c 69 6e 65 20 29 3b 0a 20 20 69 66 28 20 7a 4c  Line );.  if( zL
7650: 69 6e 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ine==0 ) return 
7660: 30 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20 20 65 6f  0;.  n = 0;.  eo
7670: 6c 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20  l = 0;.  while( 
7680: 21 65 6f 6c 20 29 7b 0a 20 20 20 20 69 66 28 20  !eol ){.    if( 
7690: 6e 2b 31 30 30 3e 6e 4c 69 6e 65 20 29 7b 0a 20  n+100>nLine ){. 
76a0: 20 20 20 20 20 6e 4c 69 6e 65 20 3d 20 6e 4c 69       nLine = nLi
76b0: 6e 65 2a 32 20 2b 20 31 30 30 3b 0a 20 20 20 20  ne*2 + 100;.    
76c0: 20 20 7a 4c 69 6e 65 20 3d 20 72 65 61 6c 6c 6f    zLine = reallo
76d0: 63 28 7a 4c 69 6e 65 2c 20 6e 4c 69 6e 65 29 3b  c(zLine, nLine);
76e0: 0a 20 20 20 20 20 20 69 66 28 20 7a 4c 69 6e 65  .      if( zLine
76f0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
7700: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 66 67      }.    if( fg
7710: 65 74 73 28 26 7a 4c 69 6e 65 5b 6e 5d 2c 20 6e  ets(&zLine[n], n
7720: 4c 69 6e 65 20 2d 20 6e 2c 20 69 6e 29 3d 3d 30  Line - n, in)==0
7730: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 3d   ){.      if( n=
7740: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66 72  =0 ){.        fr
7750: 65 65 28 7a 4c 69 6e 65 29 3b 0a 20 20 20 20 20  ee(zLine);.     
7760: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
7770: 20 20 20 7d 0a 20 20 20 20 20 20 7a 4c 69 6e 65     }.      zLine
7780: 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 65  [n] = 0;.      e
7790: 6f 6c 20 3d 20 31 3b 0a 20 20 20 20 20 20 62 72  ol = 1;.      br
77a0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77  eak;.    }.    w
77b0: 68 69 6c 65 28 20 7a 4c 69 6e 65 5b 6e 5d 20 29  hile( zLine[n] )
77c0: 7b 20 6e 2b 2b 3b 20 7d 0a 20 20 20 20 69 66 28  { n++; }.    if(
77d0: 20 6e 3e 30 20 26 26 20 7a 4c 69 6e 65 5b 6e 2d   n>0 && zLine[n-
77e0: 31 5d 3d 3d 27 5c 6e 27 20 29 7b 0a 20 20 20 20  1]=='\n' ){.    
77f0: 20 20 6e 2d 2d 3b 0a 20 20 20 20 20 20 7a 4c 69    n--;.      zLi
7800: 6e 65 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20  ne[n] = 0;.     
7810: 20 65 6f 6c 20 3d 20 31 3b 0a 20 20 20 20 7d 0a   eol = 1;.    }.
7820: 20 20 7d 0a 20 20 7a 4c 69 6e 65 20 3d 20 72 65    }.  zLine = re
7830: 61 6c 6c 6f 63 28 20 7a 4c 69 6e 65 2c 20 6e 2b  alloc( zLine, n+
7840: 31 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 4c  1 );.  return zL
7850: 69 6e 65 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54  ine;.}.../*.** T
7860: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
7870: 70 61 72 74 20 6f 66 20 74 68 65 20 69 6d 70 6c  part of the impl
7880: 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  ementation of th
7890: 65 20 63 6f 6d 6d 61 6e 64 3a 0a 2a 2a 0a 2a 2a  e command:.**.**
78a0: 20 20 20 24 64 62 20 74 72 61 6e 73 61 63 74 69     $db transacti
78b0: 6f 6e 20 5b 2d 64 65 66 65 72 72 65 64 7c 2d 69  on [-deferred|-i
78c0: 6d 6d 65 64 69 61 74 65 7c 2d 65 78 63 6c 75 73  mmediate|-exclus
78d0: 69 76 65 5d 20 53 43 52 49 50 54 0a 2a 2a 0a 2a  ive] SCRIPT.**.*
78e0: 2a 20 49 74 20 69 73 20 69 6e 76 6f 6b 65 64 20  * It is invoked 
78f0: 61 66 74 65 72 20 65 76 61 6c 75 61 74 69 6e 67  after evaluating
7900: 20 74 68 65 20 73 63 72 69 70 74 20 53 43 52 49   the script SCRI
7910: 50 54 20 74 6f 20 63 6f 6d 6d 69 74 20 6f 72 20  PT to commit or 
7920: 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 74 68 65 20  rollback.** the 
7930: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 72 20 73  transaction or s
7940: 61 76 65 70 6f 69 6e 74 20 6f 70 65 6e 65 64 20  avepoint opened 
7950: 62 79 20 74 68 65 20 5b 74 72 61 6e 73 61 63 74  by the [transact
7960: 69 6f 6e 5d 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f  ion] command..*/
7970: 0a 73 74 61 74 69 63 20 69 6e 74 20 44 62 54 72  .static int DbTr
7980: 61 6e 73 50 6f 73 74 43 6d 64 28 0a 20 20 43 6c  ansPostCmd(.  Cl
7990: 69 65 6e 74 44 61 74 61 20 64 61 74 61 5b 5d 2c  ientData data[],
79a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
79b0: 20 20 20 2f 2a 20 64 61 74 61 5b 30 5d 20 69 73     /* data[0] is
79c0: 20 74 68 65 20 53 71 6c 69 74 65 33 44 62 2a 20   the Sqlite3Db* 
79d0: 66 6f 72 20 24 64 62 20 2a 2f 0a 20 20 54 63 6c  for $db */.  Tcl
79e0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
79f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7a00: 20 20 2f 2a 20 54 63 6c 20 69 6e 74 65 72 70 72    /* Tcl interpr
7a10: 65 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65  eter */.  int re
7a20: 73 75 6c 74 20 20 20 20 20 20 20 20 20 20 20 20  sult            
7a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7a40: 2a 20 52 65 73 75 6c 74 20 6f 66 20 65 76 61 6c  * Result of eval
7a50: 75 61 74 69 6e 67 20 53 43 52 49 50 54 20 2a 2f  uating SCRIPT */
7a60: 0a 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  .){.  static con
7a70: 73 74 20 63 68 61 72 20 2a 61 7a 45 6e 64 5b 5d  st char *azEnd[]
7a80: 20 3d 20 7b 0a 20 20 20 20 22 52 45 4c 45 41 53   = {.    "RELEAS
7a90: 45 20 5f 74 63 6c 5f 74 72 61 6e 73 61 63 74 69  E _tcl_transacti
7aa0: 6f 6e 22 2c 20 20 20 20 20 20 20 20 2f 2a 20 72  on",        /* r
7ab0: 63 3d 3d 54 43 4c 5f 45 52 52 4f 52 2c 20 6e 54  c==TCL_ERROR, nT
7ac0: 72 61 6e 73 61 63 74 69 6f 6e 21 3d 30 20 2a 2f  ransaction!=0 */
7ad0: 0a 20 20 20 20 22 43 4f 4d 4d 49 54 22 2c 20 20  .    "COMMIT",  
7ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7af0: 20 20 20 20 20 20 20 20 2f 2a 20 72 63 21 3d 54          /* rc!=T
7b00: 43 4c 5f 45 52 52 4f 52 2c 20 6e 54 72 61 6e 73  CL_ERROR, nTrans
7b10: 61 63 74 69 6f 6e 3d 3d 30 20 2a 2f 0a 20 20 20  action==0 */.   
7b20: 20 22 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 5f 74   "ROLLBACK TO _t
7b30: 63 6c 5f 74 72 61 6e 73 61 63 74 69 6f 6e 20 3b  cl_transaction ;
7b40: 20 52 45 4c 45 41 53 45 20 5f 74 63 6c 5f 74 72   RELEASE _tcl_tr
7b50: 61 6e 73 61 63 74 69 6f 6e 22 2c 0a 20 20 20 20  ansaction",.    
7b60: 22 52 4f 4c 4c 42 41 43 4b 22 20 20 20 20 20 20  "ROLLBACK"      
7b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7b80: 20 20 20 2f 2a 20 72 63 3d 3d 54 43 4c 5f 45 52     /* rc==TCL_ER
7b90: 52 4f 52 2c 20 6e 54 72 61 6e 73 61 63 74 69 6f  ROR, nTransactio
7ba0: 6e 3d 3d 30 20 2a 2f 0a 20 20 7d 3b 0a 20 20 53  n==0 */.  };.  S
7bb0: 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28  qliteDb *pDb = (
7bc0: 53 71 6c 69 74 65 44 62 2a 29 64 61 74 61 5b 30  SqliteDb*)data[0
7bd0: 5d 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 72 65  ];.  int rc = re
7be0: 73 75 6c 74 3b 0a 20 20 63 6f 6e 73 74 20 63 68  sult;.  const ch
7bf0: 61 72 20 2a 7a 45 6e 64 3b 0a 0a 20 20 70 44 62  ar *zEnd;..  pDb
7c00: 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2d 2d  ->nTransaction--
7c10: 3b 0a 20 20 7a 45 6e 64 20 3d 20 61 7a 45 6e 64  ;.  zEnd = azEnd
7c20: 5b 28 72 63 3d 3d 54 43 4c 5f 45 52 52 4f 52 29  [(rc==TCL_ERROR)
7c30: 2a 32 20 2b 20 28 70 44 62 2d 3e 6e 54 72 61 6e  *2 + (pDb->nTran
7c40: 73 61 63 74 69 6f 6e 3d 3d 30 29 5d 3b 0a 0a 20  saction==0)];.. 
7c50: 20 70 44 62 2d 3e 64 69 73 61 62 6c 65 41 75 74   pDb->disableAut
7c60: 68 2b 2b 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  h++;.  if( sqlit
7c70: 65 33 5f 65 78 65 63 28 70 44 62 2d 3e 64 62 2c  e3_exec(pDb->db,
7c80: 20 7a 45 6e 64 2c 20 30 2c 20 30 2c 20 30 29 20   zEnd, 0, 0, 0) 
7c90: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73  ){.      /* This
7ca0: 20 69 73 20 61 20 74 72 69 63 6b 79 20 73 63 65   is a tricky sce
7cb0: 6e 61 72 69 6f 20 74 6f 20 68 61 6e 64 6c 65 2e  nario to handle.
7cc0: 20 54 68 65 20 6d 6f 73 74 20 6c 69 6b 65 6c 79   The most likely
7cd0: 20 63 61 75 73 65 20 6f 66 20 61 6e 0a 20 20 20   cause of an.   
7ce0: 20 20 20 2a 2a 20 65 72 72 6f 72 20 69 73 20 74     ** error is t
7cf0: 68 61 74 20 74 68 65 20 65 78 65 63 28 29 20 61  hat the exec() a
7d00: 62 6f 76 65 20 77 61 73 20 61 6e 20 61 74 74 65  bove was an atte
7d10: 6d 70 74 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68  mpt to commit th
7d20: 65 20 0a 20 20 20 20 20 20 2a 2a 20 74 6f 70 2d  e .      ** top-
7d30: 6c 65 76 65 6c 20 74 72 61 6e 73 61 63 74 69 6f  level transactio
7d40: 6e 20 74 68 61 74 20 72 65 74 75 72 6e 65 64 20  n that returned 
7d50: 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 4f 72 2c  SQLITE_BUSY. Or,
7d60: 20 6c 65 73 73 20 6c 69 6b 65 6c 79 2c 0a 20 20   less likely,.  
7d70: 20 20 20 20 2a 2a 20 74 68 61 74 20 61 6e 20 49      ** that an I
7d80: 4f 2d 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75  O-error has occu
7d90: 72 65 64 2e 20 49 6e 20 65 69 74 68 65 72 20 63  red. In either c
7da0: 61 73 65 2c 20 74 68 72 6f 77 20 61 20 54 63 6c  ase, throw a Tcl
7db0: 20 65 78 63 65 70 74 69 6f 6e 0a 20 20 20 20 20   exception.     
7dc0: 20 2a 2a 20 61 6e 64 20 74 72 79 20 74 6f 20 72   ** and try to r
7dd0: 6f 6c 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e  ollback the tran
7de0: 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a  saction..      *
7df0: 2a 0a 20 20 20 20 20 20 2a 2a 20 42 75 74 20 69  *.      ** But i
7e00: 74 20 63 6f 75 6c 64 20 61 6c 73 6f 20 62 65 20  t could also be 
7e10: 74 68 61 74 20 74 68 65 20 75 73 65 72 20 65 78  that the user ex
7e20: 65 63 75 74 65 64 20 6f 6e 65 20 6f 72 20 6d 6f  ecuted one or mo
7e30: 72 65 20 42 45 47 49 4e 2c 20 0a 20 20 20 20 20  re BEGIN, .     
7e40: 20 2a 2a 20 43 4f 4d 4d 49 54 2c 20 53 41 56 45   ** COMMIT, SAVE
7e50: 50 4f 49 4e 54 2c 20 52 45 4c 45 41 53 45 20 6f  POINT, RELEASE o
7e60: 72 20 52 4f 4c 4c 42 41 43 4b 20 63 6f 6d 6d 61  r ROLLBACK comma
7e70: 6e 64 73 20 74 68 61 74 20 61 72 65 20 63 6f 6e  nds that are con
7e80: 66 75 73 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20  fusing.      ** 
7e90: 74 68 69 73 20 6d 65 74 68 6f 64 27 73 20 6c 6f  this method's lo
7ea0: 67 69 63 2e 20 4e 6f 74 20 63 6c 65 61 72 20 68  gic. Not clear h
7eb0: 6f 77 20 74 68 69 73 20 77 6f 75 6c 64 20 62 65  ow this would be
7ec0: 20 62 65 73 74 20 68 61 6e 64 6c 65 64 2e 0a 20   best handled.. 
7ed0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20       */.    if( 
7ee0: 72 63 21 3d 54 43 4c 5f 45 52 52 4f 52 20 29 7b  rc!=TCL_ERROR ){
7ef0: 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  .      Tcl_Appen
7f00: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
7f10: 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70  sqlite3_errmsg(p
7f20: 44 62 2d 3e 64 62 29 2c 20 30 29 3b 0a 20 20 20  Db->db), 0);.   
7f30: 20 20 20 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f     rc = TCL_ERRO
7f40: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  R;.    }.    sql
7f50: 69 74 65 33 5f 65 78 65 63 28 70 44 62 2d 3e 64  ite3_exec(pDb->d
7f60: 62 2c 20 22 52 4f 4c 4c 42 41 43 4b 22 2c 20 30  b, "ROLLBACK", 0
7f70: 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 70  , 0, 0);.  }.  p
7f80: 44 62 2d 3e 64 69 73 61 62 6c 65 41 75 74 68 2d  Db->disableAuth-
7f90: 2d 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  -;..  return rc;
7fa0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68  .}../*.** Search
7fb0: 20 74 68 65 20 63 61 63 68 65 20 66 6f 72 20 61   the cache for a
7fc0: 20 70 72 65 70 61 72 65 64 2d 73 74 61 74 65 6d   prepared-statem
7fd0: 65 6e 74 20 6f 62 6a 65 63 74 20 74 68 61 74 20  ent object that 
7fe0: 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 0a 2a  implements the.*
7ff0: 2a 20 66 69 72 73 74 20 53 51 4c 20 73 74 61 74  * first SQL stat
8000: 65 6d 65 6e 74 20 69 6e 20 74 68 65 20 62 75 66  ement in the buf
8010: 66 65 72 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  fer pointed to b
8020: 79 20 70 61 72 61 6d 65 74 65 72 20 7a 49 6e 2e  y parameter zIn.
8030: 20 49 66 0a 2a 2a 20 6e 6f 20 73 75 63 68 20 70   If.** no such p
8040: 72 65 70 61 72 65 64 2d 73 74 61 74 65 6d 65 6e  repared-statemen
8050: 74 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 2c 20  t can be found, 
8060: 61 6c 6c 6f 63 61 74 65 20 61 6e 64 20 70 72 65  allocate and pre
8070: 70 61 72 65 20 61 20 6e 65 77 0a 2a 2a 20 6f 6e  pare a new.** on
8080: 65 2e 20 49 6e 20 65 69 74 68 65 72 20 63 61 73  e. In either cas
8090: 65 2c 20 62 69 6e 64 20 74 68 65 20 63 75 72 72  e, bind the curr
80a0: 65 6e 74 20 76 61 6c 75 65 73 20 6f 66 20 74 68  ent values of th
80b0: 65 20 72 65 6c 65 76 61 6e 74 20 54 63 6c 0a 2a  e relevant Tcl.*
80c0: 2a 20 76 61 72 69 61 62 6c 65 73 20 74 6f 20 61  * variables to a
80d0: 6e 79 20 24 76 61 72 2c 20 3a 76 61 72 20 6f 72  ny $var, :var or
80e0: 20 40 76 61 72 20 76 61 72 69 61 62 6c 65 73 20   @var variables 
80f0: 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  in the statement
8100: 2e 20 42 65 66 6f 72 65 0a 2a 2a 20 72 65 74 75  . Before.** retu
8110: 72 6e 69 6e 67 2c 20 73 65 74 20 2a 70 70 50 72  rning, set *ppPr
8120: 65 53 74 6d 74 20 74 6f 20 70 6f 69 6e 74 20 74  eStmt to point t
8130: 6f 20 74 68 65 20 70 72 65 70 61 72 65 64 2d 73  o the prepared-s
8140: 74 61 74 65 6d 65 6e 74 20 6f 62 6a 65 63 74 2e  tatement object.
8150: 0a 2a 2a 0a 2a 2a 20 4f 75 74 70 75 74 20 70 61  .**.** Output pa
8160: 72 61 6d 65 74 65 72 20 2a 70 7a 4f 75 74 20 69  rameter *pzOut i
8170: 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  s set to point t
8180: 6f 20 74 68 65 20 6e 65 78 74 20 53 51 4c 20 73  o the next SQL s
8190: 74 61 74 65 6d 65 6e 74 20 69 6e 0a 2a 2a 20 62  tatement in.** b
81a0: 75 66 66 65 72 20 7a 49 6e 2c 20 6f 72 20 74 6f  uffer zIn, or to
81b0: 20 74 68 65 20 27 5c 30 27 20 62 79 74 65 20 61   the '\0' byte a
81c0: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 7a 49 6e  t the end of zIn
81d0: 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 0a   if there is no.
81e0: 2a 2a 20 6e 65 78 74 20 73 74 61 74 65 6d 65 6e  ** next statemen
81f0: 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63  t..**.** If succ
8200: 65 73 73 66 75 6c 2c 20 54 43 4c 5f 4f 4b 20 69  essful, TCL_OK i
8210: 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
8220: 72 77 69 73 65 2c 20 54 43 4c 5f 45 52 52 4f 52  rwise, TCL_ERROR
8230: 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20   is returned.** 
8240: 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  and an error mes
8250: 73 61 67 65 20 6c 6f 61 64 65 64 20 69 6e 74 6f  sage loaded into
8260: 20 69 6e 74 65 72 70 72 65 74 65 72 20 70 44 62   interpreter pDb
8270: 2d 3e 69 6e 74 65 72 70 2e 0a 2a 2f 0a 73 74 61  ->interp..*/.sta
8280: 74 69 63 20 69 6e 74 20 64 62 50 72 65 70 61 72  tic int dbPrepar
8290: 65 41 6e 64 42 69 6e 64 28 0a 20 20 53 71 6c 69  eAndBind(.  Sqli
82a0: 74 65 44 62 20 2a 70 44 62 2c 20 20 20 20 20 20  teDb *pDb,      
82b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
82c0: 61 74 61 62 61 73 65 20 6f 62 6a 65 63 74 20 2a  atabase object *
82d0: 2f 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a  /.  char const *
82e0: 7a 49 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  zIn,            
82f0: 20 20 20 20 2f 2a 20 53 51 4c 20 74 6f 20 63 6f      /* SQL to co
8300: 6d 70 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20  mpile */.  char 
8310: 63 6f 6e 73 74 20 2a 2a 70 7a 4f 75 74 2c 20 20  const **pzOut,  
8320: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
8330: 54 3a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6e 65  T: Pointer to ne
8340: 78 74 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  xt SQL statement
8350: 20 2a 2f 0a 20 20 53 71 6c 50 72 65 70 61 72 65   */.  SqlPrepare
8360: 64 53 74 6d 74 20 2a 2a 70 70 50 72 65 53 74 6d  dStmt **ppPreStm
8370: 74 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4f 62  t     /* OUT: Ob
8380: 6a 65 63 74 20 75 73 65 64 20 74 6f 20 63 61 63  ject used to cac
8390: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  he statement */.
83a0: 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
83b0: 2a 7a 53 71 6c 20 3d 20 7a 49 6e 3b 20 20 20 20  *zSql = zIn;    
83c0: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
83d0: 74 6f 20 66 69 72 73 74 20 53 51 4c 20 73 74 61  to first SQL sta
83e0: 74 65 6d 65 6e 74 20 69 6e 20 7a 49 6e 20 2a 2f  tement in zIn */
83f0: 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
8400: 2a 70 53 74 6d 74 3b 20 20 20 20 20 20 20 20 20  *pStmt;         
8410: 20 20 20 2f 2a 20 50 72 65 70 61 72 65 64 20 73     /* Prepared s
8420: 74 61 74 65 6d 65 6e 74 20 6f 62 6a 65 63 74 20  tatement object 
8430: 2a 2f 0a 20 20 53 71 6c 50 72 65 70 61 72 65 64  */.  SqlPrepared
8440: 53 74 6d 74 20 2a 70 50 72 65 53 74 6d 74 3b 20  Stmt *pPreStmt; 
8450: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
8460: 74 6f 20 63 61 63 68 65 64 20 73 74 61 74 65 6d  to cached statem
8470: 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 71  ent */.  int nSq
8480: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
8490: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67           /* Leng
84a0: 74 68 20 6f 66 20 7a 53 71 6c 20 69 6e 20 62 79  th of zSql in by
84b0: 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 56 61  tes */.  int nVa
84c0: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
84d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
84e0: 65 72 20 6f 66 20 76 61 72 69 61 62 6c 65 73 20  er of variables 
84f0: 69 6e 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  in statement */.
8500: 20 20 69 6e 74 20 69 50 61 72 6d 20 3d 20 30 3b    int iParm = 0;
8510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8520: 20 20 2f 2a 20 4e 65 78 74 20 66 72 65 65 20 65    /* Next free e
8530: 6e 74 72 79 20 69 6e 20 61 70 50 61 72 6d 20 2a  ntry in apParm *
8540: 2f 0a 20 20 69 6e 74 20 69 3b 0a 20 20 54 63 6c  /.  int i;.  Tcl
8550: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 20  _Interp *interp 
8560: 3d 20 70 44 62 2d 3e 69 6e 74 65 72 70 3b 0a 0a  = pDb->interp;..
8570: 20 20 2a 70 70 50 72 65 53 74 6d 74 20 3d 20 30    *ppPreStmt = 0
8580: 3b 0a 0a 20 20 2f 2a 20 54 72 69 6d 20 73 70 61  ;..  /* Trim spa
8590: 63 65 73 20 66 72 6f 6d 20 74 68 65 20 73 74 61  ces from the sta
85a0: 72 74 20 6f 66 20 7a 53 71 6c 20 61 6e 64 20 63  rt of zSql and c
85b0: 61 6c 63 75 6c 61 74 65 20 74 68 65 20 72 65 6d  alculate the rem
85c0: 61 69 6e 69 6e 67 20 6c 65 6e 67 74 68 2e 20 2a  aining length. *
85d0: 2f 0a 20 20 77 68 69 6c 65 28 20 69 73 73 70 61  /.  while( isspa
85e0: 63 65 28 7a 53 71 6c 5b 30 5d 29 20 29 7b 20 7a  ce(zSql[0]) ){ z
85f0: 53 71 6c 2b 2b 3b 20 7d 0a 20 20 6e 53 71 6c 20  Sql++; }.  nSql 
8600: 3d 20 73 74 72 6c 65 6e 33 30 28 7a 53 71 6c 29  = strlen30(zSql)
8610: 3b 0a 0a 20 20 66 6f 72 28 70 50 72 65 53 74 6d  ;..  for(pPreStm
8620: 74 20 3d 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73  t = pDb->stmtLis
8630: 74 3b 20 70 50 72 65 53 74 6d 74 3b 20 70 50 72  t; pPreStmt; pPr
8640: 65 53 74 6d 74 3d 70 50 72 65 53 74 6d 74 2d 3e  eStmt=pPreStmt->
8650: 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 6e 74 20  pNext){.    int 
8660: 6e 20 3d 20 70 50 72 65 53 74 6d 74 2d 3e 6e 53  n = pPreStmt->nS
8670: 71 6c 3b 0a 20 20 20 20 69 66 28 20 6e 53 71 6c  ql;.    if( nSql
8680: 3e 3d 6e 20 0a 20 20 20 20 20 20 20 20 26 26 20  >=n .        && 
8690: 6d 65 6d 63 6d 70 28 70 50 72 65 53 74 6d 74 2d  memcmp(pPreStmt-
86a0: 3e 7a 53 71 6c 2c 20 7a 53 71 6c 2c 20 6e 29 3d  >zSql, zSql, n)=
86b0: 3d 30 0a 20 20 20 20 20 20 20 20 26 26 20 28 7a  =0.        && (z
86c0: 53 71 6c 5b 6e 5d 3d 3d 30 20 7c 7c 20 7a 53 71  Sql[n]==0 || zSq
86d0: 6c 5b 6e 2d 31 5d 3d 3d 27 3b 27 29 0a 20 20 20  l[n-1]==';').   
86e0: 20 29 7b 0a 20 20 20 20 20 20 70 53 74 6d 74 20   ){.      pStmt 
86f0: 3d 20 70 50 72 65 53 74 6d 74 2d 3e 70 53 74 6d  = pPreStmt->pStm
8700: 74 3b 0a 20 20 20 20 20 20 2a 70 7a 4f 75 74 20  t;.      *pzOut 
8710: 3d 20 26 7a 53 71 6c 5b 70 50 72 65 53 74 6d 74  = &zSql[pPreStmt
8720: 2d 3e 6e 53 71 6c 5d 3b 0a 0a 20 20 20 20 20 20  ->nSql];..      
8730: 2f 2a 20 57 68 65 6e 20 61 20 70 72 65 70 61 72  /* When a prepar
8740: 65 64 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20  ed statement is 
8750: 66 6f 75 6e 64 2c 20 75 6e 6c 69 6e 6b 20 69 74  found, unlink it
8760: 20 66 72 6f 6d 20 74 68 65 0a 20 20 20 20 20 20   from the.      
8770: 2a 2a 20 63 61 63 68 65 20 6c 69 73 74 2e 20 20  ** cache list.  
8780: 49 74 20 77 69 6c 6c 20 6c 61 74 65 72 20 62 65  It will later be
8790: 20 61 64 64 65 64 20 62 61 63 6b 20 74 6f 20 74   added back to t
87a0: 68 65 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20 20  he beginning.   
87b0: 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 63 61 63     ** of the cac
87c0: 68 65 20 6c 69 73 74 20 69 6e 20 6f 72 64 65 72  he list in order
87d0: 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 4c 52   to implement LR
87e0: 55 20 72 65 70 6c 61 63 65 6d 65 6e 74 2e 0a 20  U replacement.. 
87f0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
8800: 28 20 70 50 72 65 53 74 6d 74 2d 3e 70 50 72 65  ( pPreStmt->pPre
8810: 76 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 72  v ){.        pPr
8820: 65 53 74 6d 74 2d 3e 70 50 72 65 76 2d 3e 70 4e  eStmt->pPrev->pN
8830: 65 78 74 20 3d 20 70 50 72 65 53 74 6d 74 2d 3e  ext = pPreStmt->
8840: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 65 6c  pNext;.      }el
8850: 73 65 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d  se{.        pDb-
8860: 3e 73 74 6d 74 4c 69 73 74 20 3d 20 70 50 72 65  >stmtList = pPre
8870: 53 74 6d 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  Stmt->pNext;.   
8880: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
8890: 50 72 65 53 74 6d 74 2d 3e 70 4e 65 78 74 20 29  PreStmt->pNext )
88a0: 7b 0a 20 20 20 20 20 20 20 20 70 50 72 65 53 74  {.        pPreSt
88b0: 6d 74 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76  mt->pNext->pPrev
88c0: 20 3d 20 70 50 72 65 53 74 6d 74 2d 3e 70 50 72   = pPreStmt->pPr
88d0: 65 76 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ev;.      }else{
88e0: 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 73 74  .        pDb->st
88f0: 6d 74 4c 61 73 74 20 3d 20 70 50 72 65 53 74 6d  mtLast = pPreStm
8900: 74 2d 3e 70 50 72 65 76 3b 0a 20 20 20 20 20 20  t->pPrev;.      
8910: 7d 0a 20 20 20 20 20 20 70 44 62 2d 3e 6e 53 74  }.      pDb->nSt
8920: 6d 74 2d 2d 3b 0a 20 20 20 20 20 20 6e 56 61 72  mt--;.      nVar
8930: 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f   = sqlite3_bind_
8940: 70 61 72 61 6d 65 74 65 72 5f 63 6f 75 6e 74 28  parameter_count(
8950: 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 62 72  pStmt);.      br
8960: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
8970: 20 0a 20 20 2f 2a 20 49 66 20 6e 6f 20 70 72 65   .  /* If no pre
8980: 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20  pared statement 
8990: 77 61 73 20 66 6f 75 6e 64 2e 20 43 6f 6d 70 69  was found. Compi
89a0: 6c 65 20 74 68 65 20 53 51 4c 20 74 65 78 74 2e  le the SQL text.
89b0: 20 41 6c 73 6f 20 61 6c 6c 6f 63 61 74 65 0a 20   Also allocate. 
89c0: 20 2a 2a 20 61 20 6e 65 77 20 53 71 6c 50 72 65   ** a new SqlPre
89d0: 70 61 72 65 64 53 74 6d 74 20 73 74 72 75 63 74  paredStmt struct
89e0: 75 72 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70  ure.  */.  if( p
89f0: 50 72 65 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20  PreStmt==0 ){.  
8a00: 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 0a 20 20    int nByte;..  
8a10: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
8a20: 3d 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65  =sqlite3_prepare
8a30: 5f 76 32 28 70 44 62 2d 3e 64 62 2c 20 7a 53 71  _v2(pDb->db, zSq
8a40: 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 70  l, -1, &pStmt, p
8a50: 7a 4f 75 74 29 20 29 7b 0a 20 20 20 20 20 20 54  zOut) ){.      T
8a60: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
8a70: 69 6e 74 65 72 70 2c 20 64 62 54 65 78 74 54 6f  interp, dbTextTo
8a80: 4f 62 6a 28 73 71 6c 69 74 65 33 5f 65 72 72 6d  Obj(sqlite3_errm
8a90: 73 67 28 70 44 62 2d 3e 64 62 29 29 29 3b 0a 20  sg(pDb->db)));. 
8aa0: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
8ab0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
8ac0: 20 69 66 28 20 70 53 74 6d 74 3d 3d 30 20 29 7b   if( pStmt==0 ){
8ad0: 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54  .      if( SQLIT
8ae0: 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 5f 65 72  E_OK!=sqlite3_er
8af0: 72 63 6f 64 65 28 70 44 62 2d 3e 64 62 29 20 29  rcode(pDb->db) )
8b00: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 20 63  {.        /* A c
8b10: 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 65 72 72 6f  ompile-time erro
8b20: 72 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65  r in the stateme
8b30: 6e 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 54  nt. */.        T
8b40: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
8b50: 69 6e 74 65 72 70 2c 20 64 62 54 65 78 74 54 6f  interp, dbTextTo
8b60: 4f 62 6a 28 73 71 6c 69 74 65 33 5f 65 72 72 6d  Obj(sqlite3_errm
8b70: 73 67 28 70 44 62 2d 3e 64 62 29 29 29 3b 0a 20  sg(pDb->db)));. 
8b80: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43         return TC
8b90: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d  L_ERROR;.      }
8ba0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
8bb0: 20 54 68 65 20 73 74 61 74 65 6d 65 6e 74 20 77   The statement w
8bc0: 61 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 43 6f 6e  as a no-op.  Con
8bd0: 74 69 6e 75 65 20 74 6f 20 74 68 65 20 6e 65 78  tinue to the nex
8be0: 74 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 20 20  t statement.    
8bf0: 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 53 51      ** in the SQ
8c00: 4c 20 73 74 72 69 6e 67 2e 0a 20 20 20 20 20 20  L string..      
8c10: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 74    */.        ret
8c20: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20  urn TCL_OK;.    
8c30: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61    }.    }..    a
8c40: 73 73 65 72 74 28 20 70 50 72 65 53 74 6d 74 3d  ssert( pPreStmt=
8c50: 3d 30 20 29 3b 0a 20 20 20 20 6e 56 61 72 20 3d  =0 );.    nVar =
8c60: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61   sqlite3_bind_pa
8c70: 72 61 6d 65 74 65 72 5f 63 6f 75 6e 74 28 70 53  rameter_count(pS
8c80: 74 6d 74 29 3b 0a 20 20 20 20 6e 42 79 74 65 20  tmt);.    nByte 
8c90: 3d 20 73 69 7a 65 6f 66 28 53 71 6c 50 72 65 70  = sizeof(SqlPrep
8ca0: 61 72 65 64 53 74 6d 74 29 20 2b 20 6e 56 61 72  aredStmt) + nVar
8cb0: 2a 73 69 7a 65 6f 66 28 54 63 6c 5f 4f 62 6a 20  *sizeof(Tcl_Obj 
8cc0: 2a 29 3b 0a 20 20 20 20 70 50 72 65 53 74 6d 74  *);.    pPreStmt
8cd0: 20 3d 20 28 53 71 6c 50 72 65 70 61 72 65 64 53   = (SqlPreparedS
8ce0: 74 6d 74 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28 6e  tmt*)Tcl_Alloc(n
8cf0: 42 79 74 65 29 3b 0a 20 20 20 20 6d 65 6d 73 65  Byte);.    memse
8d00: 74 28 70 50 72 65 53 74 6d 74 2c 20 30 2c 20 6e  t(pPreStmt, 0, n
8d10: 42 79 74 65 29 3b 0a 0a 20 20 20 20 70 50 72 65  Byte);..    pPre
8d20: 53 74 6d 74 2d 3e 70 53 74 6d 74 20 3d 20 70 53  Stmt->pStmt = pS
8d30: 74 6d 74 3b 0a 20 20 20 20 70 50 72 65 53 74 6d  tmt;.    pPreStm
8d40: 74 2d 3e 6e 53 71 6c 20 3d 20 28 2a 70 7a 4f 75  t->nSql = (*pzOu
8d50: 74 20 2d 20 7a 53 71 6c 29 3b 0a 20 20 20 20 70  t - zSql);.    p
8d60: 50 72 65 53 74 6d 74 2d 3e 7a 53 71 6c 20 3d 20  PreStmt->zSql = 
8d70: 73 71 6c 69 74 65 33 5f 73 71 6c 28 70 53 74 6d  sqlite3_sql(pStm
8d80: 74 29 3b 0a 20 20 20 20 70 50 72 65 53 74 6d 74  t);.    pPreStmt
8d90: 2d 3e 61 70 50 61 72 6d 20 3d 20 28 54 63 6c 5f  ->apParm = (Tcl_
8da0: 4f 62 6a 20 2a 2a 29 26 70 50 72 65 53 74 6d 74  Obj **)&pPreStmt
8db0: 5b 31 5d 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  [1];.  }.  asser
8dc0: 74 28 20 70 50 72 65 53 74 6d 74 20 29 3b 0a 20  t( pPreStmt );. 
8dd0: 20 61 73 73 65 72 74 28 20 73 74 72 6c 65 6e 33   assert( strlen3
8de0: 30 28 70 50 72 65 53 74 6d 74 2d 3e 7a 53 71 6c  0(pPreStmt->zSql
8df0: 29 3d 3d 70 50 72 65 53 74 6d 74 2d 3e 6e 53 71  )==pPreStmt->nSq
8e00: 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 30  l );.  assert( 0
8e10: 3d 3d 6d 65 6d 63 6d 70 28 70 50 72 65 53 74 6d  ==memcmp(pPreStm
8e20: 74 2d 3e 7a 53 71 6c 2c 20 7a 53 71 6c 2c 20 70  t->zSql, zSql, p
8e30: 50 72 65 53 74 6d 74 2d 3e 6e 53 71 6c 29 20 29  PreStmt->nSql) )
8e40: 3b 0a 0a 20 20 2f 2a 20 42 69 6e 64 20 76 61 6c  ;..  /* Bind val
8e50: 75 65 73 20 74 6f 20 70 61 72 61 6d 65 74 65 72  ues to parameter
8e60: 73 20 74 68 61 74 20 62 65 67 69 6e 20 77 69 74  s that begin wit
8e70: 68 20 24 20 6f 72 20 3a 20 2a 2f 20 20 0a 20 20  h $ or : */  .  
8e80: 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 6e 56 61 72  for(i=1; i<=nVar
8e90: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73  ; i++){.    cons
8ea0: 74 20 63 68 61 72 20 2a 7a 56 61 72 20 3d 20 73  t char *zVar = s
8eb0: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61  qlite3_bind_para
8ec0: 6d 65 74 65 72 5f 6e 61 6d 65 28 70 53 74 6d 74  meter_name(pStmt
8ed0: 2c 20 69 29 3b 0a 20 20 20 20 69 66 28 20 7a 56  , i);.    if( zV
8ee0: 61 72 21 3d 30 20 26 26 20 28 7a 56 61 72 5b 30  ar!=0 && (zVar[0
8ef0: 5d 3d 3d 27 24 27 20 7c 7c 20 7a 56 61 72 5b 30  ]=='$' || zVar[0
8f00: 5d 3d 3d 27 3a 27 20 7c 7c 20 7a 56 61 72 5b 30  ]==':' || zVar[0
8f10: 5d 3d 3d 27 40 27 29 20 29 7b 0a 20 20 20 20 20  ]=='@') ){.     
8f20: 20 54 63 6c 5f 4f 62 6a 20 2a 70 56 61 72 20 3d   Tcl_Obj *pVar =
8f30: 20 54 63 6c 5f 47 65 74 56 61 72 32 45 78 28 69   Tcl_GetVar2Ex(i
8f40: 6e 74 65 72 70 2c 20 26 7a 56 61 72 5b 31 5d 2c  nterp, &zVar[1],
8f50: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66   0, 0);.      if
8f60: 28 20 70 56 61 72 20 29 7b 0a 20 20 20 20 20 20  ( pVar ){.      
8f70: 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 20    int n;.       
8f80: 20 75 38 20 2a 64 61 74 61 3b 0a 20 20 20 20 20   u8 *data;.     
8f90: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
8fa0: 54 79 70 65 20 3d 20 28 70 56 61 72 2d 3e 74 79  Type = (pVar->ty
8fb0: 70 65 50 74 72 20 3f 20 70 56 61 72 2d 3e 74 79  pePtr ? pVar->ty
8fc0: 70 65 50 74 72 2d 3e 6e 61 6d 65 20 3a 20 22 22  pePtr->name : ""
8fd0: 29 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  );.        char 
8fe0: 63 20 3d 20 7a 54 79 70 65 5b 30 5d 3b 0a 20 20  c = zType[0];.  
8ff0: 20 20 20 20 20 20 69 66 28 20 7a 56 61 72 5b 30        if( zVar[0
9000: 5d 3d 3d 27 40 27 20 7c 7c 0a 20 20 20 20 20 20  ]=='@' ||.      
9010: 20 20 20 20 20 28 63 3d 3d 27 62 27 20 26 26 20       (c=='b' && 
9020: 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22 62 79  strcmp(zType,"by
9030: 74 65 61 72 72 61 79 22 29 3d 3d 30 20 26 26 20  tearray")==0 && 
9040: 70 56 61 72 2d 3e 62 79 74 65 73 3d 3d 30 29 20  pVar->bytes==0) 
9050: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
9060: 4c 6f 61 64 20 61 20 42 4c 4f 42 20 74 79 70 65  Load a BLOB type
9070: 20 69 66 20 74 68 65 20 54 63 6c 20 76 61 72 69   if the Tcl vari
9080: 61 62 6c 65 20 69 73 20 61 20 62 79 74 65 61 72  able is a bytear
9090: 72 61 79 20 61 6e 64 0a 20 20 20 20 20 20 20 20  ray and.        
90a0: 20 20 2a 2a 20 69 74 20 68 61 73 20 6e 6f 20 73    ** it has no s
90b0: 74 72 69 6e 67 20 72 65 70 72 65 73 65 6e 74 61  tring representa
90c0: 74 69 6f 6e 20 6f 72 20 74 68 65 20 68 6f 73 74  tion or the host
90d0: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 61  .          ** pa
90e0: 72 61 6d 65 74 65 72 20 6e 61 6d 65 20 62 65 67  rameter name beg
90f0: 69 6e 73 20 77 69 74 68 20 22 40 22 2e 20 2a 2f  ins with "@". */
9100: 0a 20 20 20 20 20 20 20 20 20 20 64 61 74 61 20  .          data 
9110: 3d 20 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72  = Tcl_GetByteArr
9120: 61 79 46 72 6f 6d 4f 62 6a 28 70 56 61 72 2c 20  ayFromObj(pVar, 
9130: 26 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  &n);.          s
9140: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62  qlite3_bind_blob
9150: 28 70 53 74 6d 74 2c 20 69 2c 20 64 61 74 61 2c  (pStmt, i, data,
9160: 20 6e 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49   n, SQLITE_STATI
9170: 43 29 3b 0a 20 20 20 20 20 20 20 20 20 20 54 63  C);.          Tc
9180: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70  l_IncrRefCount(p
9190: 56 61 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Var);.          
91a0: 70 50 72 65 53 74 6d 74 2d 3e 61 70 50 61 72 6d  pPreStmt->apParm
91b0: 5b 69 50 61 72 6d 2b 2b 5d 20 3d 20 70 56 61 72  [iParm++] = pVar
91c0: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
91d0: 69 66 28 20 63 3d 3d 27 62 27 20 26 26 20 73 74  if( c=='b' && st
91e0: 72 63 6d 70 28 7a 54 79 70 65 2c 22 62 6f 6f 6c  rcmp(zType,"bool
91f0: 65 61 6e 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ean")==0 ){.    
9200: 20 20 20 20 20 20 54 63 6c 5f 47 65 74 49 6e 74        Tcl_GetInt
9210: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
9220: 70 56 61 72 2c 20 26 6e 29 3b 0a 20 20 20 20 20  pVar, &n);.     
9230: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e       sqlite3_bin
9240: 64 5f 69 6e 74 28 70 53 74 6d 74 2c 20 69 2c 20  d_int(pStmt, i, 
9250: 6e 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  n);.        }els
9260: 65 20 69 66 28 20 63 3d 3d 27 64 27 20 26 26 20  e if( c=='d' && 
9270: 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22 64 6f  strcmp(zType,"do
9280: 75 62 6c 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20  uble")==0 ){.   
9290: 20 20 20 20 20 20 20 64 6f 75 62 6c 65 20 72 3b         double r;
92a0: 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 47  .          Tcl_G
92b0: 65 74 44 6f 75 62 6c 65 46 72 6f 6d 4f 62 6a 28  etDoubleFromObj(
92c0: 69 6e 74 65 72 70 2c 20 70 56 61 72 2c 20 26 72  interp, pVar, &r
92d0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
92e0: 69 74 65 33 5f 62 69 6e 64 5f 64 6f 75 62 6c 65  ite3_bind_double
92f0: 28 70 53 74 6d 74 2c 20 69 2c 20 72 29 3b 0a 20  (pStmt, i, r);. 
9300: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
9310: 20 28 63 3d 3d 27 77 27 20 26 26 20 73 74 72 63   (c=='w' && strc
9320: 6d 70 28 7a 54 79 70 65 2c 22 77 69 64 65 49 6e  mp(zType,"wideIn
9330: 74 22 29 3d 3d 30 29 20 7c 7c 0a 20 20 20 20 20  t")==0) ||.     
9340: 20 20 20 20 20 20 20 20 20 28 63 3d 3d 27 69 27           (c=='i'
9350: 20 26 26 20 73 74 72 63 6d 70 28 7a 54 79 70 65   && strcmp(zType
9360: 2c 22 69 6e 74 22 29 3d 3d 30 29 20 29 7b 0a 20  ,"int")==0) ){. 
9370: 20 20 20 20 20 20 20 20 20 54 63 6c 5f 57 69 64           Tcl_Wid
9380: 65 49 6e 74 20 76 3b 0a 20 20 20 20 20 20 20 20  eInt v;.        
9390: 20 20 54 63 6c 5f 47 65 74 57 69 64 65 49 6e 74    Tcl_GetWideInt
93a0: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
93b0: 70 56 61 72 2c 20 26 76 29 3b 0a 20 20 20 20 20  pVar, &v);.     
93c0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e       sqlite3_bin
93d0: 64 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20 69  d_int64(pStmt, i
93e0: 2c 20 76 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  , v);.        }e
93f0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 64  lse{.          d
9400: 61 74 61 20 3d 20 28 75 6e 73 69 67 6e 65 64 20  ata = (unsigned 
9410: 63 68 61 72 20 2a 29 54 63 6c 5f 47 65 74 53 74  char *)Tcl_GetSt
9420: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 70 56 61 72  ringFromObj(pVar
9430: 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 20 20 20  , &n);.         
9440: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65   sqlite3_bind_te
9450: 78 74 28 70 53 74 6d 74 2c 20 69 2c 20 28 63 68  xt(pStmt, i, (ch
9460: 61 72 20 2a 29 64 61 74 61 2c 20 6e 2c 20 53 51  ar *)data, n, SQ
9470: 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20  LITE_STATIC);.  
9480: 20 20 20 20 20 20 20 20 54 63 6c 5f 49 6e 63 72          Tcl_Incr
9490: 52 65 66 43 6f 75 6e 74 28 70 56 61 72 29 3b 0a  RefCount(pVar);.
94a0: 20 20 20 20 20 20 20 20 20 20 70 50 72 65 53 74            pPreSt
94b0: 6d 74 2d 3e 61 70 50 61 72 6d 5b 69 50 61 72 6d  mt->apParm[iParm
94c0: 2b 2b 5d 20 3d 20 70 56 61 72 3b 0a 20 20 20 20  ++] = pVar;.    
94d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
94e0: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
94f0: 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28 70 53 74  e3_bind_null(pSt
9500: 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 7d 0a  mt, i);.      }.
9510: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 50 72 65      }.  }.  pPre
9520: 53 74 6d 74 2d 3e 6e 50 61 72 6d 20 3d 20 69 50  Stmt->nParm = iP
9530: 61 72 6d 3b 0a 20 20 2a 70 70 50 72 65 53 74 6d  arm;.  *ppPreStm
9540: 74 20 3d 20 70 50 72 65 53 74 6d 74 3b 0a 0a 20  t = pPreStmt;.. 
9550: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
9560: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73  }.../*.** Releas
9570: 65 20 61 20 73 74 61 74 65 6d 65 6e 74 20 72 65  e a statement re
9580: 66 65 72 65 6e 63 65 20 6f 62 74 61 69 6e 65 64  ference obtained
9590: 20 62 79 20 63 61 6c 6c 69 6e 67 20 64 62 50 72   by calling dbPr
95a0: 65 70 61 72 65 41 6e 64 42 69 6e 64 28 29 2e 0a  epareAndBind()..
95b0: 2a 2a 20 54 68 65 72 65 20 73 68 6f 75 6c 64 20  ** There should 
95c0: 62 65 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 63  be exactly one c
95d0: 61 6c 6c 20 74 6f 20 74 68 69 73 20 66 75 6e 63  all to this func
95e0: 74 69 6f 6e 20 66 6f 72 20 65 61 63 68 20 63 61  tion for each ca
95f0: 6c 6c 20 74 6f 0a 2a 2a 20 64 62 50 72 65 70 61  ll to.** dbPrepa
9600: 72 65 41 6e 64 42 69 6e 64 28 29 2e 0a 2a 2a 0a  reAndBind()..**.
9610: 2a 2a 20 49 66 20 74 68 65 20 64 69 73 63 61 72  ** If the discar
9620: 64 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e  d parameter is n
9630: 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  on-zero, then th
9640: 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 64  e statement is d
9650: 65 6c 65 74 65 64 0a 2a 2a 20 69 6d 6d 65 64 69  eleted.** immedi
9660: 61 74 65 6c 79 2e 20 4f 74 68 65 72 77 69 73 65  ately. Otherwise
9670: 20 69 74 20 69 73 20 61 64 64 65 64 20 74 6f 20   it is added to 
9680: 74 68 65 20 4c 52 55 20 6c 69 73 74 20 61 6e 64  the LRU list and
9690: 20 6d 61 79 20 62 65 20 72 65 74 75 72 6e 65 64   may be returned
96a0: 0a 2a 2a 20 62 79 20 61 20 73 75 62 73 65 71 75  .** by a subsequ
96b0: 65 6e 74 20 63 61 6c 6c 20 74 6f 20 64 62 50 72  ent call to dbPr
96c0: 65 70 61 72 65 41 6e 64 42 69 6e 64 28 29 2e 0a  epareAndBind()..
96d0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64  */.static void d
96e0: 62 52 65 6c 65 61 73 65 53 74 6d 74 28 0a 20 20  bReleaseStmt(.  
96f0: 53 71 6c 69 74 65 44 62 20 2a 70 44 62 2c 20 20  SqliteDb *pDb,  
9700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9710: 2f 2a 20 44 61 74 61 62 61 73 65 20 68 61 6e 64  /* Database hand
9720: 6c 65 20 2a 2f 0a 20 20 53 71 6c 50 72 65 70 61  le */.  SqlPrepa
9730: 72 65 64 53 74 6d 74 20 2a 70 50 72 65 53 74 6d  redStmt *pPreStm
9740: 74 2c 20 20 20 20 20 20 2f 2a 20 50 72 65 70 61  t,      /* Prepa
9750: 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 68 61  red statement ha
9760: 6e 64 6c 65 20 74 6f 20 72 65 6c 65 61 73 65 20  ndle to release 
9770: 2a 2f 0a 20 20 69 6e 74 20 64 69 73 63 61 72 64  */.  int discard
9780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9790: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
97a0: 64 65 6c 65 74 65 20 28 6e 6f 74 20 63 61 63 68  delete (not cach
97b0: 65 29 20 74 68 65 20 70 50 72 65 53 74 6d 74 20  e) the pPreStmt 
97c0: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 0a  */.){.  int i;..
97d0: 20 20 2f 2a 20 46 72 65 65 20 74 68 65 20 62 6f    /* Free the bo
97e0: 75 6e 64 20 73 74 72 69 6e 67 20 61 6e 64 20 62  und string and b
97f0: 6c 6f 62 20 70 61 72 61 6d 65 74 65 72 73 20 2a  lob parameters *
9800: 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  /.  for(i=0; i<p
9810: 50 72 65 53 74 6d 74 2d 3e 6e 50 61 72 6d 3b 20  PreStmt->nParm; 
9820: 69 2b 2b 29 7b 0a 20 20 20 20 54 63 6c 5f 44 65  i++){.    Tcl_De
9830: 63 72 52 65 66 43 6f 75 6e 74 28 70 50 72 65 53  crRefCount(pPreS
9840: 74 6d 74 2d 3e 61 70 50 61 72 6d 5b 69 5d 29 3b  tmt->apParm[i]);
9850: 0a 20 20 7d 0a 20 20 70 50 72 65 53 74 6d 74 2d  .  }.  pPreStmt-
9860: 3e 6e 50 61 72 6d 20 3d 20 30 3b 0a 0a 20 20 69  >nParm = 0;..  i
9870: 66 28 20 70 44 62 2d 3e 6d 61 78 53 74 6d 74 3c  f( pDb->maxStmt<
9880: 3d 30 20 7c 7c 20 64 69 73 63 61 72 64 20 29 7b  =0 || discard ){
9890: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63  .    /* If the c
98a0: 61 63 68 65 20 69 73 20 74 75 72 6e 65 64 20 6f  ache is turned o
98b0: 66 66 2c 20 64 65 61 6c 6c 6f 63 61 74 65 64 20  ff, deallocated 
98c0: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  the statement */
98d0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e  .    sqlite3_fin
98e0: 61 6c 69 7a 65 28 70 50 72 65 53 74 6d 74 2d 3e  alize(pPreStmt->
98f0: 70 53 74 6d 74 29 3b 0a 20 20 20 20 54 63 6c 5f  pStmt);.    Tcl_
9900: 46 72 65 65 28 28 63 68 61 72 20 2a 29 70 50 72  Free((char *)pPr
9910: 65 53 74 6d 74 29 3b 0a 20 20 7d 65 6c 73 65 7b  eStmt);.  }else{
9920: 0a 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20  .    /* Add the 
9930: 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
9940: 6e 74 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e  nt to the beginn
9950: 69 6e 67 20 6f 66 20 74 68 65 20 63 61 63 68 65  ing of the cache
9960: 20 6c 69 73 74 2e 20 2a 2f 0a 20 20 20 20 70 50   list. */.    pP
9970: 72 65 53 74 6d 74 2d 3e 70 4e 65 78 74 20 3d 20  reStmt->pNext = 
9980: 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74 3b 0a 20  pDb->stmtList;. 
9990: 20 20 20 70 50 72 65 53 74 6d 74 2d 3e 70 50 72     pPreStmt->pPr
99a0: 65 76 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  ev = 0;.    if( 
99b0: 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74 20 29 7b  pDb->stmtList ){
99c0: 0a 20 20 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c  .     pDb->stmtL
99d0: 69 73 74 2d 3e 70 50 72 65 76 20 3d 20 70 50 72  ist->pPrev = pPr
99e0: 65 53 74 6d 74 3b 0a 20 20 20 20 7d 0a 20 20 20  eStmt;.    }.   
99f0: 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74 20 3d   pDb->stmtList =
9a00: 20 70 50 72 65 53 74 6d 74 3b 0a 20 20 20 20 69   pPreStmt;.    i
9a10: 66 28 20 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74  f( pDb->stmtLast
9a20: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ==0 ){.      ass
9a30: 65 72 74 28 20 70 44 62 2d 3e 6e 53 74 6d 74 3d  ert( pDb->nStmt=
9a40: 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 44 62 2d  =0 );.      pDb-
9a50: 3e 73 74 6d 74 4c 61 73 74 20 3d 20 70 50 72 65  >stmtLast = pPre
9a60: 53 74 6d 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Stmt;.    }else{
9a70: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
9a80: 44 62 2d 3e 6e 53 74 6d 74 3e 30 20 29 3b 0a 20  Db->nStmt>0 );. 
9a90: 20 20 20 7d 0a 20 20 20 20 70 44 62 2d 3e 6e 53     }.    pDb->nS
9aa0: 74 6d 74 2b 2b 3b 0a 20 20 20 0a 20 20 20 20 2f  tmt++;.   .    /
9ab0: 2a 20 49 66 20 77 65 20 68 61 76 65 20 74 6f 6f  * If we have too
9ac0: 20 6d 61 6e 79 20 73 74 61 74 65 6d 65 6e 74 20   many statement 
9ad0: 69 6e 20 63 61 63 68 65 2c 20 72 65 6d 6f 76 65  in cache, remove
9ae0: 20 74 68 65 20 73 75 72 70 6c 75 73 20 66 72 6f   the surplus fro
9af0: 6d 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 65 6e  m .    ** the en
9b00: 64 20 6f 66 20 74 68 65 20 63 61 63 68 65 20 6c  d of the cache l
9b10: 69 73 74 2e 20 20 2a 2f 0a 20 20 20 20 77 68 69  ist.  */.    whi
9b20: 6c 65 28 20 70 44 62 2d 3e 6e 53 74 6d 74 3e 70  le( pDb->nStmt>p
9b30: 44 62 2d 3e 6d 61 78 53 74 6d 74 20 29 7b 0a 20  Db->maxStmt ){. 
9b40: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e       sqlite3_fin
9b50: 61 6c 69 7a 65 28 70 44 62 2d 3e 73 74 6d 74 4c  alize(pDb->stmtL
9b60: 61 73 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 20  ast->pStmt);.   
9b70: 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74     pDb->stmtLast
9b80: 20 3d 20 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74   = pDb->stmtLast
9b90: 2d 3e 70 50 72 65 76 3b 0a 20 20 20 20 20 20 54  ->pPrev;.      T
9ba0: 63 6c 5f 46 72 65 65 28 28 63 68 61 72 2a 29 70  cl_Free((char*)p
9bb0: 44 62 2d 3e 73 74 6d 74 4c 61 73 74 2d 3e 70 4e  Db->stmtLast->pN
9bc0: 65 78 74 29 3b 0a 20 20 20 20 20 20 70 44 62 2d  ext);.      pDb-
9bd0: 3e 73 74 6d 74 4c 61 73 74 2d 3e 70 4e 65 78 74  >stmtLast->pNext
9be0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 44 62 2d   = 0;.      pDb-
9bf0: 3e 6e 53 74 6d 74 2d 2d 3b 0a 20 20 20 20 7d 0a  >nStmt--;.    }.
9c00: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 72    }.}../*.** Str
9c10: 75 63 74 75 72 65 20 75 73 65 64 20 77 69 74 68  ucture used with
9c20: 20 64 62 45 76 61 6c 58 58 58 28 29 20 66 75 6e   dbEvalXXX() fun
9c30: 63 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ctions:.**.**   
9c40: 64 62 45 76 61 6c 49 6e 69 74 28 29 0a 2a 2a 20  dbEvalInit().** 
9c50: 20 20 64 62 45 76 61 6c 53 74 65 70 28 29 0a 2a    dbEvalStep().*
9c60: 2a 20 20 20 64 62 45 76 61 6c 46 69 6e 61 6c 69  *   dbEvalFinali
9c70: 7a 65 28 29 0a 2a 2a 20 20 20 64 62 45 76 61 6c  ze().**   dbEval
9c80: 52 6f 77 49 6e 66 6f 28 29 0a 2a 2a 20 20 20 64  RowInfo().**   d
9c90: 62 45 76 61 6c 43 6f 6c 75 6d 6e 56 61 6c 75 65  bEvalColumnValue
9ca0: 28 29 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  ().*/.typedef st
9cb0: 72 75 63 74 20 44 62 45 76 61 6c 43 6f 6e 74 65  ruct DbEvalConte
9cc0: 78 74 20 44 62 45 76 61 6c 43 6f 6e 74 65 78 74  xt DbEvalContext
9cd0: 3b 0a 73 74 72 75 63 74 20 44 62 45 76 61 6c 43  ;.struct DbEvalC
9ce0: 6f 6e 74 65 78 74 20 7b 0a 20 20 53 71 6c 69 74  ontext {.  Sqlit
9cf0: 65 44 62 20 2a 70 44 62 3b 20 20 20 20 20 20 20  eDb *pDb;       
9d00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
9d10: 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f  tabase handle */
9d20: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 53 71 6c  .  Tcl_Obj *pSql
9d30: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
9d40: 20 20 20 2f 2a 20 4f 62 6a 65 63 74 20 68 6f 6c     /* Object hol
9d50: 64 69 6e 67 20 73 74 72 69 6e 67 20 7a 53 71 6c  ding string zSql
9d60: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
9d70: 20 2a 7a 53 71 6c 3b 20 20 20 20 20 20 20 20 20   *zSql;         
9d80: 20 20 20 20 20 20 2f 2a 20 52 65 6d 61 69 6e 69        /* Remaini
9d90: 6e 67 20 53 51 4c 20 74 6f 20 65 78 65 63 75 74  ng SQL to execut
9da0: 65 20 2a 2f 0a 20 20 53 71 6c 50 72 65 70 61 72  e */.  SqlPrepar
9db0: 65 64 53 74 6d 74 20 2a 70 50 72 65 53 74 6d 74  edStmt *pPreStmt
9dc0: 3b 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e  ;      /* Curren
9dd0: 74 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  t statement */. 
9de0: 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20   int nCol;      
9df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9e00: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f   /* Number of co
9e10: 6c 75 6d 6e 73 20 72 65 74 75 72 6e 65 64 20 62  lumns returned b
9e20: 79 20 70 53 74 6d 74 20 2a 2f 0a 20 20 54 63 6c  y pStmt */.  Tcl
9e30: 5f 4f 62 6a 20 2a 70 41 72 72 61 79 3b 20 20 20  _Obj *pArray;   
9e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9e50: 4e 61 6d 65 20 6f 66 20 61 72 72 61 79 20 76 61  Name of array va
9e60: 72 69 61 62 6c 65 20 2a 2f 0a 20 20 54 63 6c 5f  riable */.  Tcl_
9e70: 4f 62 6a 20 2a 2a 61 70 43 6f 6c 4e 61 6d 65 3b  Obj **apColName;
9e80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
9e90: 72 72 61 79 20 6f 66 20 63 6f 6c 75 6d 6e 20 6e  rray of column n
9ea0: 61 6d 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  ames */.};../*.*
9eb0: 2a 20 52 65 6c 65 61 73 65 20 61 6e 79 20 63 61  * Release any ca
9ec0: 63 68 65 20 6f 66 20 63 6f 6c 75 6d 6e 20 6e 61  che of column na
9ed0: 6d 65 73 20 63 75 72 72 65 6e 74 6c 79 20 68 65  mes currently he
9ee0: 6c 64 20 61 73 20 70 61 72 74 20 6f 66 0a 2a 2a  ld as part of.**
9ef0: 20 74 68 65 20 44 62 45 76 61 6c 43 6f 6e 74 65   the DbEvalConte
9f00: 78 74 20 73 74 72 75 63 74 75 72 65 20 70 61 73  xt structure pas
9f10: 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74  sed as the first
9f20: 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74   argument..*/.st
9f30: 61 74 69 63 20 76 6f 69 64 20 64 62 52 65 6c 65  atic void dbRele
9f40: 61 73 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 44  aseColumnNames(D
9f50: 62 45 76 61 6c 43 6f 6e 74 65 78 74 20 2a 70 29  bEvalContext *p)
9f60: 7b 0a 20 20 69 66 28 20 70 2d 3e 61 70 43 6f 6c  {.  if( p->apCol
9f70: 4e 61 6d 65 20 29 7b 0a 20 20 20 20 69 6e 74 20  Name ){.    int 
9f80: 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  i;.    for(i=0; 
9f90: 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  i<p->nCol; i++){
9fa0: 0a 20 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52  .      Tcl_DecrR
9fb0: 65 66 43 6f 75 6e 74 28 70 2d 3e 61 70 43 6f 6c  efCount(p->apCol
9fc0: 4e 61 6d 65 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a  Name[i]);.    }.
9fd0: 20 20 20 20 54 63 6c 5f 46 72 65 65 28 28 63 68      Tcl_Free((ch
9fe0: 61 72 20 2a 29 70 2d 3e 61 70 43 6f 6c 4e 61 6d  ar *)p->apColNam
9ff0: 65 29 3b 0a 20 20 20 20 70 2d 3e 61 70 43 6f 6c  e);.    p->apCol
a000: 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Name = 0;.  }.  
a010: 70 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 7d 0a 0a  p->nCol = 0;.}..
a020: 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65  /*.** Initialize
a030: 20 61 20 44 62 45 76 61 6c 43 6f 6e 74 65 78 74   a DbEvalContext
a040: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a   structure..**.*
a050: 2a 20 49 66 20 70 41 72 72 61 79 20 69 73 20 6e  * If pArray is n
a060: 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 69 74  ot NULL, then it
a070: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e 61   contains the na
a080: 6d 65 20 6f 66 20 61 20 54 63 6c 20 61 72 72 61  me of a Tcl arra
a090: 79 0a 2a 2a 20 76 61 72 69 61 62 6c 65 2e 20 54  y.** variable. T
a0a0: 68 65 20 22 2a 22 20 6d 65 6d 62 65 72 20 6f 66  he "*" member of
a0b0: 20 74 68 69 73 20 61 72 72 61 79 20 69 73 20 73   this array is s
a0c0: 65 74 20 74 6f 20 61 20 6c 69 73 74 20 63 6f 6e  et to a list con
a0d0: 74 61 69 6e 69 6e 67 0a 2a 2a 20 74 68 65 20 6e  taining.** the n
a0e0: 61 6d 65 73 20 6f 66 20 74 68 65 20 63 6f 6c 75  ames of the colu
a0f0: 6d 6e 73 20 72 65 74 75 72 6e 65 64 20 62 79 20  mns returned by 
a100: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 61 73  the statement as
a110: 20 70 61 72 74 20 6f 66 20 65 61 63 68 0a 2a 2a   part of each.**
a120: 20 63 61 6c 6c 20 74 6f 20 64 62 45 76 61 6c 53   call to dbEvalS
a130: 74 65 70 28 29 2c 20 69 6e 20 6f 72 64 65 72 20  tep(), in order 
a140: 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67  from left to rig
a150: 68 74 2e 20 65 2e 67 2e 20 69 66 20 74 68 65 20  ht. e.g. if the 
a160: 6e 61 6d 65 73 20 0a 2a 2a 20 6f 66 20 74 68 65  names .** of the
a170: 20 72 65 74 75 72 6e 65 64 20 63 6f 6c 75 6d 6e   returned column
a180: 73 20 61 72 65 20 61 2c 20 62 20 61 6e 64 20 63  s are a, b and c
a190: 2c 20 69 74 20 64 6f 65 73 20 74 68 65 20 65 71  , it does the eq
a1a0: 75 69 76 61 6c 65 6e 74 20 6f 66 20 74 68 65 20  uivalent of the 
a1b0: 0a 2a 2a 20 74 63 6c 20 63 6f 6d 6d 61 6e 64 3a  .** tcl command:
a1c0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 73 65 74 20 24  .**.**     set $
a1d0: 7b 70 41 72 72 61 79 7d 28 2a 29 20 7b 61 20 62  {pArray}(*) {a b
a1e0: 20 63 7d 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f   c}.*/.static vo
a1f0: 69 64 20 64 62 45 76 61 6c 49 6e 69 74 28 0a 20  id dbEvalInit(. 
a200: 20 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 20 2a   DbEvalContext *
a210: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
a220: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73   /* Pointer to s
a230: 74 72 75 63 74 75 72 65 20 74 6f 20 69 6e 69 74  tructure to init
a240: 69 61 6c 69 7a 65 20 2a 2f 0a 20 20 53 71 6c 69  ialize */.  Sqli
a250: 74 65 44 62 20 2a 70 44 62 2c 20 20 20 20 20 20  teDb *pDb,      
a260: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
a270: 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a  atabase handle *
a280: 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 53 71  /.  Tcl_Obj *pSq
a290: 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
a2a0: 20 20 20 20 2f 2a 20 4f 62 6a 65 63 74 20 63 6f      /* Object co
a2b0: 6e 74 61 69 6e 69 6e 67 20 53 51 4c 20 73 63 72  ntaining SQL scr
a2c0: 69 70 74 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a  ipt */.  Tcl_Obj
a2d0: 20 2a 70 41 72 72 61 79 20 20 20 20 20 20 20 20   *pArray        
a2e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
a2f0: 20 6f 66 20 54 63 6c 20 61 72 72 61 79 20 74 6f   of Tcl array to
a300: 20 73 65 74 20 28 2a 29 20 65 6c 65 6d 65 6e 74   set (*) element
a310: 20 6f 66 20 2a 2f 0a 29 7b 0a 20 20 6d 65 6d 73   of */.){.  mems
a320: 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28  et(p, 0, sizeof(
a330: 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 29 29 3b  DbEvalContext));
a340: 0a 20 20 70 2d 3e 70 44 62 20 3d 20 70 44 62 3b  .  p->pDb = pDb;
a350: 0a 20 20 70 2d 3e 7a 53 71 6c 20 3d 20 54 63 6c  .  p->zSql = Tcl
a360: 5f 47 65 74 53 74 72 69 6e 67 28 70 53 71 6c 29  _GetString(pSql)
a370: 3b 0a 20 20 70 2d 3e 70 53 71 6c 20 3d 20 70 53  ;.  p->pSql = pS
a380: 71 6c 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65  ql;.  Tcl_IncrRe
a390: 66 43 6f 75 6e 74 28 70 53 71 6c 29 3b 0a 20 20  fCount(pSql);.  
a3a0: 69 66 28 20 70 41 72 72 61 79 20 29 7b 0a 20 20  if( pArray ){.  
a3b0: 20 20 70 2d 3e 70 41 72 72 61 79 20 3d 20 70 41    p->pArray = pA
a3c0: 72 72 61 79 3b 0a 20 20 20 20 54 63 6c 5f 49 6e  rray;.    Tcl_In
a3d0: 63 72 52 65 66 43 6f 75 6e 74 28 70 41 72 72 61  crRefCount(pArra
a3e0: 79 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  y);.  }.}../*.**
a3f0: 20 4f 62 74 61 69 6e 20 69 6e 66 6f 72 6d 61 74   Obtain informat
a400: 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 72 6f  ion about the ro
a410: 77 20 74 68 61 74 20 74 68 65 20 44 62 45 76 61  w that the DbEva
a420: 6c 43 6f 6e 74 65 78 74 20 70 61 73 73 65 64 20  lContext passed 
a430: 61 73 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20  as the.** first 
a440: 61 72 67 75 6d 65 6e 74 20 63 75 72 72 65 6e 74  argument current
a450: 6c 79 20 70 6f 69 6e 74 73 20 74 6f 2e 0a 2a 2f  ly points to..*/
a460: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 62 45  .static void dbE
a470: 76 61 6c 52 6f 77 49 6e 66 6f 28 0a 20 20 44 62  valRowInfo(.  Db
a480: 45 76 61 6c 43 6f 6e 74 65 78 74 20 2a 70 2c 20  EvalContext *p, 
a490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a4a0: 20 45 76 61 6c 75 61 74 69 6f 6e 20 63 6f 6e 74   Evaluation cont
a4b0: 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e  ext */.  int *pn
a4c0: 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  Col,            
a4d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
a4e0: 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   Number of colum
a4f0: 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 54 63 6c  n names */.  Tcl
a500: 5f 4f 62 6a 20 2a 2a 2a 70 61 70 43 6f 6c 4e 61  _Obj ***papColNa
a510: 6d 65 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  me           /* 
a520: 4f 55 54 3a 20 41 72 72 61 79 20 6f 66 20 63 6f  OUT: Array of co
a530: 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 29 7b  lumn names */.){
a540: 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 63 6f  .  /* Compute co
a550: 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20  lumn names */.  
a560: 69 66 28 20 30 3d 3d 70 2d 3e 61 70 43 6f 6c 4e  if( 0==p->apColN
a570: 61 6d 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ame ){.    sqlit
a580: 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d  e3_stmt *pStmt =
a590: 20 70 2d 3e 70 50 72 65 53 74 6d 74 2d 3e 70 53   p->pPreStmt->pS
a5a0: 74 6d 74 3b 0a 20 20 20 20 69 6e 74 20 69 3b 20  tmt;.    int i; 
a5b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a5c0: 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74         /* Iterat
a5d0: 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20  or variable */. 
a5e0: 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20     int nCol;    
a5f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a600: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f   /* Number of co
a610: 6c 75 6d 6e 73 20 72 65 74 75 72 6e 65 64 20 62  lumns returned b
a620: 79 20 70 53 74 6d 74 20 2a 2f 0a 20 20 20 20 54  y pStmt */.    T
a630: 63 6c 5f 4f 62 6a 20 2a 2a 61 70 43 6f 6c 4e 61  cl_Obj **apColNa
a640: 6d 65 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20  me = 0;      /* 
a650: 41 72 72 61 79 20 6f 66 20 63 6f 6c 75 6d 6e 20  Array of column 
a660: 6e 61 6d 65 73 20 2a 2f 0a 0a 20 20 20 20 70 2d  names */..    p-
a670: 3e 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 20 3d 20 73  >nCol = nCol = s
a680: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f  qlite3_column_co
a690: 75 6e 74 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  unt(pStmt);.    
a6a0: 69 66 28 20 6e 43 6f 6c 3e 30 20 26 26 20 28 70  if( nCol>0 && (p
a6b0: 61 70 43 6f 6c 4e 61 6d 65 20 7c 7c 20 70 2d 3e  apColName || p->
a6c0: 70 41 72 72 61 79 29 20 29 7b 0a 20 20 20 20 20  pArray) ){.     
a6d0: 20 61 70 43 6f 6c 4e 61 6d 65 20 3d 20 28 54 63   apColName = (Tc
a6e0: 6c 5f 4f 62 6a 2a 2a 29 54 63 6c 5f 41 6c 6c 6f  l_Obj**)Tcl_Allo
a6f0: 63 28 20 73 69 7a 65 6f 66 28 54 63 6c 5f 4f 62  c( sizeof(Tcl_Ob
a700: 6a 2a 29 2a 6e 43 6f 6c 20 29 3b 0a 20 20 20 20  j*)*nCol );.    
a710: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f    for(i=0; i<nCo
a720: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; i++){.       
a730: 20 61 70 43 6f 6c 4e 61 6d 65 5b 69 5d 20 3d 20   apColName[i] = 
a740: 64 62 54 65 78 74 54 6f 4f 62 6a 28 73 71 6c 69  dbTextToObj(sqli
a750: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 28  te3_column_name(
a760: 70 53 74 6d 74 2c 69 29 29 3b 0a 20 20 20 20 20  pStmt,i));.     
a770: 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f     Tcl_IncrRefCo
a780: 75 6e 74 28 61 70 43 6f 6c 4e 61 6d 65 5b 69 5d  unt(apColName[i]
a790: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
a7a0: 20 70 2d 3e 61 70 43 6f 6c 4e 61 6d 65 20 3d 20   p->apColName = 
a7b0: 61 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20 20 20 7d  apColName;.    }
a7c0: 0a 0a 20 20 20 20 2f 2a 20 49 66 20 72 65 73 75  ..    /* If resu
a7d0: 6c 74 73 20 61 72 65 20 62 65 69 6e 67 20 73 74  lts are being st
a7e0: 6f 72 65 64 20 69 6e 20 61 6e 20 61 72 72 61 79  ored in an array
a7f0: 20 76 61 72 69 61 62 6c 65 2c 20 74 68 65 6e 20   variable, then 
a800: 63 72 65 61 74 65 0a 20 20 20 20 2a 2a 20 74 68  create.    ** th
a810: 65 20 61 72 72 61 79 28 2a 29 20 65 6e 74 72 79  e array(*) entry
a820: 20 66 6f 72 20 74 68 61 74 20 61 72 72 61 79 0a   for that array.
a830: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
a840: 2d 3e 70 41 72 72 61 79 20 29 7b 0a 20 20 20 20  ->pArray ){.    
a850: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
a860: 74 65 72 70 20 3d 20 70 2d 3e 70 44 62 2d 3e 69  terp = p->pDb->i
a870: 6e 74 65 72 70 3b 0a 20 20 20 20 20 20 54 63 6c  nterp;.      Tcl
a880: 5f 4f 62 6a 20 2a 70 43 6f 6c 4c 69 73 74 20 3d  _Obj *pColList =
a890: 20 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20   Tcl_NewObj();. 
a8a0: 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 53       Tcl_Obj *pS
a8b0: 74 61 72 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72  tar = Tcl_NewStr
a8c0: 69 6e 67 4f 62 6a 28 22 2a 22 2c 20 2d 31 29 3b  ingObj("*", -1);
a8d0: 0a 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ..      for(i=0;
a8e0: 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20   i<nCol; i++){. 
a8f0: 20 20 20 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f         Tcl_ListO
a900: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
a910: 69 6e 74 65 72 70 2c 20 70 43 6f 6c 4c 69 73 74  interp, pColList
a920: 2c 20 61 70 43 6f 6c 4e 61 6d 65 5b 69 5d 29 3b  , apColName[i]);
a930: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 54  .      }.      T
a940: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
a950: 70 53 74 61 72 29 3b 0a 20 20 20 20 20 20 54 63  pStar);.      Tc
a960: 6c 5f 4f 62 6a 53 65 74 56 61 72 32 28 69 6e 74  l_ObjSetVar2(int
a970: 65 72 70 2c 20 70 2d 3e 70 41 72 72 61 79 2c 20  erp, p->pArray, 
a980: 70 53 74 61 72 2c 20 70 43 6f 6c 4c 69 73 74 2c  pStar, pColList,
a990: 20 30 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 44   0);.      Tcl_D
a9a0: 65 63 72 52 65 66 43 6f 75 6e 74 28 70 53 74 61  ecrRefCount(pSta
a9b0: 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  r);.    }.  }.. 
a9c0: 20 69 66 28 20 70 61 70 43 6f 6c 4e 61 6d 65 20   if( papColName 
a9d0: 29 7b 0a 20 20 20 20 2a 70 61 70 43 6f 6c 4e 61  ){.    *papColNa
a9e0: 6d 65 20 3d 20 70 2d 3e 61 70 43 6f 6c 4e 61 6d  me = p->apColNam
a9f0: 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 6e 43  e;.  }.  if( pnC
aa00: 6f 6c 20 29 7b 0a 20 20 20 20 2a 70 6e 43 6f 6c  ol ){.    *pnCol
aa10: 20 3d 20 70 2d 3e 6e 43 6f 6c 3b 0a 20 20 7d 0a   = p->nCol;.  }.
aa20: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
aa30: 6f 6e 65 20 6f 66 20 54 43 4c 5f 4f 4b 2c 20 54  one of TCL_OK, T
aa40: 43 4c 5f 42 52 45 41 4b 20 6f 72 20 54 43 4c 5f  CL_BREAK or TCL_
aa50: 45 52 52 4f 52 2e 20 49 66 20 54 43 4c 5f 45 52  ERROR. If TCL_ER
aa60: 52 4f 52 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e  ROR is.** return
aa70: 65 64 2c 20 74 68 65 6e 20 61 6e 20 65 72 72 6f  ed, then an erro
aa80: 72 20 6d 65 73 73 61 67 65 20 69 73 20 73 74 6f  r message is sto
aa90: 72 65 64 20 69 6e 20 74 68 65 20 69 6e 74 65 72  red in the inter
aaa0: 70 72 65 74 65 72 20 62 65 66 6f 72 65 0a 2a 2a  preter before.**
aab0: 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a   returning..**.*
aac0: 2a 20 41 20 72 65 74 75 72 6e 20 76 61 6c 75 65  * A return value
aad0: 20 6f 66 20 54 43 4c 5f 4f 4b 20 6d 65 61 6e 73   of TCL_OK means
aae0: 20 74 68 65 72 65 20 69 73 20 61 20 72 6f 77 20   there is a row 
aaf0: 6f 66 20 64 61 74 61 20 61 76 61 69 6c 61 62 6c  of data availabl
ab00: 65 2e 20 54 68 65 0a 2a 2a 20 64 61 74 61 20 6d  e. The.** data m
ab10: 61 79 20 62 65 20 61 63 63 65 73 73 65 64 20 75  ay be accessed u
ab20: 73 69 6e 67 20 64 62 45 76 61 6c 52 6f 77 49 6e  sing dbEvalRowIn
ab30: 66 6f 28 29 20 61 6e 64 20 64 62 45 76 61 6c 43  fo() and dbEvalC
ab40: 6f 6c 75 6d 6e 56 61 6c 75 65 28 29 2e 20 54 68  olumnValue(). Th
ab50: 69 73 0a 2a 2a 20 69 73 20 61 6e 61 6c 6f 67 6f  is.** is analogo
ab60: 75 73 20 74 6f 20 61 20 72 65 74 75 72 6e 20 6f  us to a return o
ab70: 66 20 53 51 4c 49 54 45 5f 52 4f 57 20 66 72 6f  f SQLITE_ROW fro
ab80: 6d 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29  m sqlite3_step()
ab90: 2e 20 49 66 20 54 43 4c 5f 42 52 45 41 4b 0a 2a  . If TCL_BREAK.*
aba0: 2a 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 74  * is returned, t
abb0: 68 65 6e 20 74 68 65 20 53 51 4c 20 73 63 72 69  hen the SQL scri
abc0: 70 74 20 68 61 73 20 66 69 6e 69 73 68 65 64 20  pt has finished 
abd0: 65 78 65 63 75 74 69 6e 67 20 61 6e 64 20 74 68  executing and th
abe0: 65 72 65 20 61 72 65 0a 2a 2a 20 6e 6f 20 66 75  ere are.** no fu
abf0: 72 74 68 65 72 20 72 6f 77 73 20 61 76 61 69 6c  rther rows avail
ac00: 61 62 6c 65 2e 20 54 68 69 73 20 69 73 20 73 69  able. This is si
ac10: 6d 69 6c 61 72 20 74 6f 20 53 51 4c 49 54 45 5f  milar to SQLITE_
ac20: 44 4f 4e 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  DONE..*/.static 
ac30: 69 6e 74 20 64 62 45 76 61 6c 53 74 65 70 28 44  int dbEvalStep(D
ac40: 62 45 76 61 6c 43 6f 6e 74 65 78 74 20 2a 70 29  bEvalContext *p)
ac50: 7b 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 7a 53  {.  while( p->zS
ac60: 71 6c 5b 30 5d 20 7c 7c 20 70 2d 3e 70 50 72 65  ql[0] || p->pPre
ac70: 53 74 6d 74 20 29 7b 0a 20 20 20 20 69 6e 74 20  Stmt ){.    int 
ac80: 72 63 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70  rc;.    if( p->p
ac90: 50 72 65 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20  PreStmt==0 ){.  
aca0: 20 20 20 20 72 63 20 3d 20 64 62 50 72 65 70 61      rc = dbPrepa
acb0: 72 65 41 6e 64 42 69 6e 64 28 70 2d 3e 70 44 62  reAndBind(p->pDb
acc0: 2c 20 70 2d 3e 7a 53 71 6c 2c 20 26 70 2d 3e 7a  , p->zSql, &p->z
acd0: 53 71 6c 2c 20 26 70 2d 3e 70 50 72 65 53 74 6d  Sql, &p->pPreStm
ace0: 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  t);.      if( rc
acf0: 21 3d 54 43 4c 5f 4f 4b 20 29 20 72 65 74 75 72  !=TCL_OK ) retur
ad00: 6e 20 72 63 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  n rc;.    }else{
ad10: 0a 20 20 20 20 20 20 69 6e 74 20 72 63 73 3b 0a  .      int rcs;.
ad20: 20 20 20 20 20 20 53 71 6c 69 74 65 44 62 20 2a        SqliteDb *
ad30: 70 44 62 20 3d 20 70 2d 3e 70 44 62 3b 0a 20 20  pDb = p->pDb;.  
ad40: 20 20 20 20 53 71 6c 50 72 65 70 61 72 65 64 53      SqlPreparedS
ad50: 74 6d 74 20 2a 70 50 72 65 53 74 6d 74 20 3d 20  tmt *pPreStmt = 
ad60: 70 2d 3e 70 50 72 65 53 74 6d 74 3b 0a 20 20 20  p->pPreStmt;.   
ad70: 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20     sqlite3_stmt 
ad80: 2a 70 53 74 6d 74 20 3d 20 70 50 72 65 53 74 6d  *pStmt = pPreStm
ad90: 74 2d 3e 70 53 74 6d 74 3b 0a 0a 20 20 20 20 20  t->pStmt;..     
ada0: 20 72 63 73 20 3d 20 73 71 6c 69 74 65 33 5f 73   rcs = sqlite3_s
adb0: 74 65 70 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  tep(pStmt);.    
adc0: 20 20 69 66 28 20 72 63 73 3d 3d 53 51 4c 49 54    if( rcs==SQLIT
add0: 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 20  E_ROW ){.       
ade0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
adf0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
ae00: 28 20 70 2d 3e 70 41 72 72 61 79 20 29 7b 0a 20  ( p->pArray ){. 
ae10: 20 20 20 20 20 20 20 64 62 45 76 61 6c 52 6f 77         dbEvalRow
ae20: 49 6e 66 6f 28 70 2c 20 30 2c 20 30 29 3b 0a 20  Info(p, 0, 0);. 
ae30: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 73       }.      rcs
ae40: 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74   = sqlite3_reset
ae50: 28 70 53 74 6d 74 29 3b 0a 0a 20 20 20 20 20 20  (pStmt);..      
ae60: 70 44 62 2d 3e 6e 53 74 65 70 20 3d 20 73 71 6c  pDb->nStep = sql
ae70: 69 74 65 33 5f 73 74 6d 74 5f 73 74 61 74 75 73  ite3_stmt_status
ae80: 28 70 53 74 6d 74 2c 53 51 4c 49 54 45 5f 53 54  (pStmt,SQLITE_ST
ae90: 4d 54 53 54 41 54 55 53 5f 46 55 4c 4c 53 43 41  MTSTATUS_FULLSCA
aea0: 4e 5f 53 54 45 50 2c 31 29 3b 0a 20 20 20 20 20  N_STEP,1);.     
aeb0: 20 70 44 62 2d 3e 6e 53 6f 72 74 20 3d 20 73 71   pDb->nSort = sq
aec0: 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74 61 74 75  lite3_stmt_statu
aed0: 73 28 70 53 74 6d 74 2c 53 51 4c 49 54 45 5f 53  s(pStmt,SQLITE_S
aee0: 54 4d 54 53 54 41 54 55 53 5f 53 4f 52 54 2c 31  TMTSTATUS_SORT,1
aef0: 29 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e 6e 49  );.      pDb->nI
af00: 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33 5f 73  ndex = sqlite3_s
af10: 74 6d 74 5f 73 74 61 74 75 73 28 70 53 74 6d 74  tmt_status(pStmt
af20: 2c 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54  ,SQLITE_STMTSTAT
af30: 55 53 5f 41 55 54 4f 49 4e 44 45 58 2c 31 29 3b  US_AUTOINDEX,1);
af40: 0a 20 20 20 20 20 20 64 62 52 65 6c 65 61 73 65  .      dbRelease
af50: 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 29 3b 0a  ColumnNames(p);.
af60: 20 20 20 20 20 20 70 2d 3e 70 50 72 65 53 74 6d        p->pPreStm
af70: 74 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 69 66  t = 0;..      if
af80: 28 20 72 63 73 21 3d 53 51 4c 49 54 45 5f 4f 4b  ( rcs!=SQLITE_OK
af90: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49   ){.        /* I
afa0: 66 20 61 20 72 75 6e 2d 74 69 6d 65 20 65 72 72  f a run-time err
afb0: 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 70 6f 72  or occurs, repor
afc0: 74 20 74 68 65 20 65 72 72 6f 72 20 61 6e 64 20  t the error and 
afd0: 73 74 6f 70 20 72 65 61 64 69 6e 67 0a 20 20 20  stop reading.   
afe0: 20 20 20 20 20 2a 2a 20 74 68 65 20 53 51 4c 2e       ** the SQL.
aff0: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 54 63 6c    */.        Tcl
b000: 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 70 44  _SetObjResult(pD
b010: 62 2d 3e 69 6e 74 65 72 70 2c 20 64 62 54 65 78  b->interp, dbTex
b020: 74 54 6f 4f 62 6a 28 73 71 6c 69 74 65 33 5f 65  tToObj(sqlite3_e
b030: 72 72 6d 73 67 28 70 44 62 2d 3e 64 62 29 29 29  rrmsg(pDb->db)))
b040: 3b 0a 20 20 20 20 20 20 20 20 64 62 52 65 6c 65  ;.        dbRele
b050: 61 73 65 53 74 6d 74 28 70 44 62 2c 20 70 50 72  aseStmt(pDb, pPr
b060: 65 53 74 6d 74 2c 20 31 29 3b 0a 20 20 20 20 20  eStmt, 1);.     
b070: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
b080: 52 4f 52 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ROR;.      }else
b090: 7b 0a 20 20 20 20 20 20 20 20 64 62 52 65 6c 65  {.        dbRele
b0a0: 61 73 65 53 74 6d 74 28 70 44 62 2c 20 70 50 72  aseStmt(pDb, pPr
b0b0: 65 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 20  eStmt, 0);.     
b0c0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
b0d0: 2f 2a 20 46 69 6e 69 73 68 65 64 20 2a 2f 0a 20  /* Finished */. 
b0e0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 42 52 45 41   return TCL_BREA
b0f0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65  K;.}../*.** Free
b100: 20 61 6c 6c 20 72 65 73 6f 75 72 63 65 73 20 63   all resources c
b110: 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 20 62 79  urrently held by
b120: 20 74 68 65 20 44 62 45 76 61 6c 43 6f 6e 74 65   the DbEvalConte
b130: 78 74 20 73 74 72 75 63 74 75 72 65 20 70 61 73  xt structure pas
b140: 73 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 66 69  sed.** as the fi
b150: 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 54 68  rst argument. Th
b160: 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20 65 78  ere should be ex
b170: 61 63 74 6c 79 20 6f 6e 65 20 63 61 6c 6c 20 74  actly one call t
b180: 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  o this function.
b190: 2a 2a 20 66 6f 72 20 65 61 63 68 20 63 61 6c 6c  ** for each call
b1a0: 20 74 6f 20 64 62 45 76 61 6c 49 6e 69 74 28 29   to dbEvalInit()
b1b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
b1c0: 20 64 62 45 76 61 6c 46 69 6e 61 6c 69 7a 65 28   dbEvalFinalize(
b1d0: 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 20 2a 70  DbEvalContext *p
b1e0: 29 7b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 65  ){.  if( p->pPre
b1f0: 53 74 6d 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  Stmt ){.    sqli
b200: 74 65 33 5f 72 65 73 65 74 28 70 2d 3e 70 50 72  te3_reset(p->pPr
b210: 65 53 74 6d 74 2d 3e 70 53 74 6d 74 29 3b 0a 20  eStmt->pStmt);. 
b220: 20 20 20 64 62 52 65 6c 65 61 73 65 53 74 6d 74     dbReleaseStmt
b230: 28 70 2d 3e 70 44 62 2c 20 70 2d 3e 70 50 72 65  (p->pDb, p->pPre
b240: 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 70 2d  Stmt, 0);.    p-
b250: 3e 70 50 72 65 53 74 6d 74 20 3d 20 30 3b 0a 20  >pPreStmt = 0;. 
b260: 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 41 72 72   }.  if( p->pArr
b270: 61 79 20 29 7b 0a 20 20 20 20 54 63 6c 5f 44 65  ay ){.    Tcl_De
b280: 63 72 52 65 66 43 6f 75 6e 74 28 70 2d 3e 70 41  crRefCount(p->pA
b290: 72 72 61 79 29 3b 0a 20 20 20 20 70 2d 3e 70 41  rray);.    p->pA
b2a0: 72 72 61 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  rray = 0;.  }.  
b2b0: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
b2c0: 28 70 2d 3e 70 53 71 6c 29 3b 0a 20 20 64 62 52  (p->pSql);.  dbR
b2d0: 65 6c 65 61 73 65 43 6f 6c 75 6d 6e 4e 61 6d 65  eleaseColumnName
b2e0: 73 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  s(p);.}../*.** R
b2f0: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
b300: 74 6f 20 61 20 54 63 6c 5f 4f 62 6a 20 73 74 72  to a Tcl_Obj str
b310: 75 63 74 75 72 65 20 77 69 74 68 20 72 65 66 2d  ucture with ref-
b320: 63 6f 75 6e 74 20 30 20 74 68 61 74 20 63 6f 6e  count 0 that con
b330: 74 61 69 6e 73 0a 2a 2a 20 74 68 65 20 76 61 6c  tains.** the val
b340: 75 65 20 66 6f 72 20 74 68 65 20 69 43 6f 6c 27  ue for the iCol'
b350: 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65  th column of the
b360: 20 72 6f 77 20 63 75 72 72 65 6e 74 6c 79 20 70   row currently p
b370: 6f 69 6e 74 65 64 20 74 6f 20 62 79 0a 2a 2a 20  ointed to by.** 
b380: 74 68 65 20 44 62 45 76 61 6c 43 6f 6e 74 65 78  the DbEvalContex
b390: 74 20 73 74 72 75 63 74 75 72 65 20 70 61 73 73  t structure pass
b3a0: 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ed as the first 
b3b0: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61  argument..*/.sta
b3c0: 74 69 63 20 54 63 6c 5f 4f 62 6a 20 2a 64 62 45  tic Tcl_Obj *dbE
b3d0: 76 61 6c 43 6f 6c 75 6d 6e 56 61 6c 75 65 28 44  valColumnValue(D
b3e0: 62 45 76 61 6c 43 6f 6e 74 65 78 74 20 2a 70 2c  bEvalContext *p,
b3f0: 20 69 6e 74 20 69 43 6f 6c 29 7b 0a 20 20 73 71   int iCol){.  sq
b400: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
b410: 74 20 3d 20 70 2d 3e 70 50 72 65 53 74 6d 74 2d  t = p->pPreStmt-
b420: 3e 70 53 74 6d 74 3b 0a 20 20 73 77 69 74 63 68  >pStmt;.  switch
b430: 28 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  ( sqlite3_column
b440: 5f 74 79 70 65 28 70 53 74 6d 74 2c 20 69 43 6f  _type(pStmt, iCo
b450: 6c 29 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53  l) ){.    case S
b460: 51 4c 49 54 45 5f 42 4c 4f 42 3a 20 7b 0a 20 20  QLITE_BLOB: {.  
b470: 20 20 20 20 69 6e 74 20 62 79 74 65 73 20 3d 20      int bytes = 
b480: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62  sqlite3_column_b
b490: 79 74 65 73 28 70 53 74 6d 74 2c 20 69 43 6f 6c  ytes(pStmt, iCol
b4a0: 29 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  );.      const c
b4b0: 68 61 72 20 2a 7a 42 6c 6f 62 20 3d 20 73 71 6c  har *zBlob = sql
b4c0: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62  ite3_column_blob
b4d0: 28 70 53 74 6d 74 2c 20 69 43 6f 6c 29 3b 0a 20  (pStmt, iCol);. 
b4e0: 20 20 20 20 20 69 66 28 20 21 7a 42 6c 6f 62 20       if( !zBlob 
b4f0: 29 20 62 79 74 65 73 20 3d 20 30 3b 0a 20 20 20  ) bytes = 0;.   
b500: 20 20 20 72 65 74 75 72 6e 20 54 63 6c 5f 4e 65     return Tcl_Ne
b510: 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 28 75  wByteArrayObj((u
b520: 38 2a 29 7a 42 6c 6f 62 2c 20 62 79 74 65 73 29  8*)zBlob, bytes)
b530: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
b540: 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3a   SQLITE_INTEGER:
b550: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 5f   {.      sqlite_
b560: 69 6e 74 36 34 20 76 20 3d 20 73 71 6c 69 74 65  int64 v = sqlite
b570: 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70  3_column_int64(p
b580: 53 74 6d 74 2c 20 69 43 6f 6c 29 3b 0a 20 20 20  Stmt, iCol);.   
b590: 20 20 20 69 66 28 20 76 3e 3d 2d 32 31 34 37 34     if( v>=-21474
b5a0: 38 33 36 34 37 20 26 26 20 76 3c 3d 32 31 34 37  83647 && v<=2147
b5b0: 34 38 33 36 34 37 20 29 7b 0a 20 20 20 20 20 20  483647 ){.      
b5c0: 20 20 72 65 74 75 72 6e 20 54 63 6c 5f 4e 65 77    return Tcl_New
b5d0: 49 6e 74 4f 62 6a 28 76 29 3b 0a 20 20 20 20 20  IntObj(v);.     
b5e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
b5f0: 72 65 74 75 72 6e 20 54 63 6c 5f 4e 65 77 57 69  return Tcl_NewWi
b600: 64 65 49 6e 74 4f 62 6a 28 76 29 3b 0a 20 20 20  deIntObj(v);.   
b610: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 63     }.    }.    c
b620: 61 73 65 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54  ase SQLITE_FLOAT
b630: 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  : {.      return
b640: 20 54 63 6c 5f 4e 65 77 44 6f 75 62 6c 65 4f 62   Tcl_NewDoubleOb
b650: 6a 28 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  j(sqlite3_column
b660: 5f 64 6f 75 62 6c 65 28 70 53 74 6d 74 2c 20 69  _double(pStmt, i
b670: 43 6f 6c 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Col));.    }.   
b680: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 55 4c   case SQLITE_NUL
b690: 4c 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72  L: {.      retur
b6a0: 6e 20 64 62 54 65 78 74 54 6f 4f 62 6a 28 70 2d  n dbTextToObj(p-
b6b0: 3e 70 44 62 2d 3e 7a 4e 75 6c 6c 29 3b 0a 20 20  >pDb->zNull);.  
b6c0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
b6d0: 6e 20 64 62 54 65 78 74 54 6f 4f 62 6a 28 28 63  n dbTextToObj((c
b6e0: 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 63 6f  har *)sqlite3_co
b6f0: 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c  lumn_text(pStmt,
b700: 20 69 43 6f 6c 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   iCol));.}../*.*
b710: 2a 20 49 66 20 75 73 69 6e 67 20 54 63 6c 20 76  * If using Tcl v
b720: 65 72 73 69 6f 6e 20 38 2e 36 20 6f 72 20 67 72  ersion 8.6 or gr
b730: 65 61 74 65 72 2c 20 75 73 65 20 74 68 65 20 4e  eater, use the N
b740: 52 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20 61  R functions to a
b750: 76 6f 69 64 0a 2a 2a 20 72 65 63 75 72 73 69 76  void.** recursiv
b760: 65 20 65 76 61 6c 75 74 69 6f 6e 20 6f 66 20 73  e evalution of s
b770: 63 72 69 70 74 73 20 62 79 20 74 68 65 20 5b 64  cripts by the [d
b780: 62 20 65 76 61 6c 5d 20 61 6e 64 20 5b 64 62 20  b eval] and [db 
b790: 74 72 61 6e 73 5d 0a 2a 2a 20 63 6f 6d 6d 61 6e  trans].** comman
b7a0: 64 73 2e 20 45 76 65 6e 20 69 66 20 74 68 65 20  ds. Even if the 
b7b0: 68 65 61 64 65 72 73 20 75 73 65 64 20 77 68 69  headers used whi
b7c0: 6c 65 20 63 6f 6d 70 69 6c 69 6e 67 20 74 68 65  le compiling the
b7d0: 20 65 78 74 65 6e 73 69 6f 6e 0a 2a 2a 20 61 72   extension.** ar
b7e0: 65 20 38 2e 36 20 6f 72 20 6e 65 77 65 72 2c 20  e 8.6 or newer, 
b7f0: 74 68 65 20 63 6f 64 65 20 73 74 69 6c 6c 20 74  the code still t
b800: 65 73 74 73 20 74 68 65 20 54 63 6c 20 76 65 72  ests the Tcl ver
b810: 73 69 6f 6e 20 61 74 20 72 75 6e 74 69 6d 65 2e  sion at runtime.
b820: 0a 2a 2a 20 54 68 69 73 20 61 6c 6c 6f 77 73 20  .** This allows 
b830: 73 74 75 62 73 2d 65 6e 61 62 6c 65 64 20 62 75  stubs-enabled bu
b840: 69 6c 64 73 20 74 6f 20 62 65 20 75 73 65 64 20  ilds to be used 
b850: 77 69 74 68 20 6f 6c 64 65 72 20 54 63 6c 20 6c  with older Tcl l
b860: 69 62 72 61 72 69 65 73 2e 0a 2a 2f 0a 23 69 66  ibraries..*/.#if
b870: 20 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49   TCL_MAJOR_VERSI
b880: 4f 4e 3e 38 20 7c 7c 20 28 54 43 4c 5f 4d 41 4a  ON>8 || (TCL_MAJ
b890: 4f 52 5f 56 45 52 53 49 4f 4e 3d 3d 38 20 26 26  OR_VERSION==8 &&
b8a0: 20 54 43 4c 5f 4d 49 4e 4f 52 5f 56 45 52 53 49   TCL_MINOR_VERSI
b8b0: 4f 4e 3e 3d 36 29 0a 23 20 64 65 66 69 6e 65 20  ON>=6).# define 
b8c0: 53 51 4c 49 54 45 5f 54 43 4c 5f 4e 52 45 20 31  SQLITE_TCL_NRE 1
b8d0: 0a 73 74 61 74 69 63 20 69 6e 74 20 44 62 55 73  .static int DbUs
b8e0: 65 4e 72 65 28 76 6f 69 64 29 7b 0a 20 20 69 6e  eNre(void){.  in
b8f0: 74 20 6d 61 6a 6f 72 2c 20 6d 69 6e 6f 72 3b 0a  t major, minor;.
b900: 20 20 54 63 6c 5f 47 65 74 56 65 72 73 69 6f 6e    Tcl_GetVersion
b910: 28 26 6d 61 6a 6f 72 2c 20 26 6d 69 6e 6f 72 2c  (&major, &minor,
b920: 20 30 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e   0, 0);.  return
b930: 28 20 28 6d 61 6a 6f 72 3d 3d 38 20 26 26 20 6d  ( (major==8 && m
b940: 69 6e 6f 72 3e 3d 36 29 20 7c 7c 20 6d 61 6a 6f  inor>=6) || majo
b950: 72 3e 38 20 29 3b 0a 7d 0a 23 65 6c 73 65 0a 2f  r>8 );.}.#else./
b960: 2a 20 0a 2a 2a 20 43 6f 6d 70 69 6c 69 6e 67 20  * .** Compiling 
b970: 75 73 69 6e 67 20 68 65 61 64 65 72 73 20 65 61  using headers ea
b980: 72 6c 69 65 72 20 74 68 61 6e 20 38 2e 36 2e 20  rlier than 8.6. 
b990: 49 6e 20 74 68 69 73 20 63 61 73 65 20 4e 52 20  In this case NR 
b9a0: 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 75 73 65  cannot be.** use
b9b0: 64 2c 20 73 6f 20 44 62 55 73 65 4e 72 65 28 29  d, so DbUseNre()
b9c0: 20 74 6f 20 61 6c 77 61 79 73 20 72 65 74 75 72   to always retur
b9d0: 6e 20 7a 65 72 6f 2e 20 41 64 64 20 23 64 65 66  n zero. Add #def
b9e0: 69 6e 65 73 20 66 6f 72 20 74 68 65 20 6f 74 68  ines for the oth
b9f0: 65 72 0a 2a 2a 20 54 63 6c 5f 4e 52 78 78 78 28  er.** Tcl_NRxxx(
ba00: 29 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20 70  ) functions to p
ba10: 72 65 76 65 6e 74 20 74 68 65 6d 20 66 72 6f 6d  revent them from
ba20: 20 63 61 75 73 69 6e 67 20 63 6f 6d 70 69 6c 61   causing compila
ba30: 74 69 6f 6e 20 65 72 72 6f 72 73 2c 0a 2a 2a 20  tion errors,.** 
ba40: 65 76 65 6e 20 74 68 6f 75 67 68 20 74 68 65 20  even though the 
ba50: 6f 6e 6c 79 20 69 6e 76 6f 63 61 74 69 6f 6e 73  only invocations
ba60: 20 6f 66 20 74 68 65 6d 20 61 72 65 20 77 69 74   of them are wit
ba70: 68 69 6e 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20  hin conditional 
ba80: 62 6c 6f 63 6b 73 20 0a 2a 2a 20 6f 66 20 74 68  blocks .** of th
ba90: 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20  e form:.**.**   
baa0: 69 66 28 20 44 62 55 73 65 4e 72 65 28 29 20 29  if( DbUseNre() )
bab0: 20 7b 20 2e 2e 2e 20 7d 0a 2a 2f 0a 23 20 64 65   { ... }.*/.# de
bac0: 66 69 6e 65 20 53 51 4c 49 54 45 5f 54 43 4c 5f  fine SQLITE_TCL_
bad0: 4e 52 45 20 30 0a 23 20 64 65 66 69 6e 65 20 44  NRE 0.# define D
bae0: 62 55 73 65 4e 72 65 28 29 20 30 0a 23 20 64 65  bUseNre() 0.# de
baf0: 66 69 6e 65 20 54 63 6c 5f 4e 52 41 64 64 43 61  fine Tcl_NRAddCa
bb00: 6c 6c 62 61 63 6b 28 61 2c 62 2c 63 2c 64 2c 65  llback(a,b,c,d,e
bb10: 2c 66 29 20 30 0a 23 20 64 65 66 69 6e 65 20 54  ,f) 0.# define T
bb20: 63 6c 5f 4e 52 45 76 61 6c 4f 62 6a 28 61 2c 62  cl_NREvalObj(a,b
bb30: 2c 63 29 20 30 0a 23 20 64 65 66 69 6e 65 20 54  ,c) 0.# define T
bb40: 63 6c 5f 4e 52 43 72 65 61 74 65 43 6f 6d 6d 61  cl_NRCreateComma
bb50: 6e 64 28 61 2c 62 2c 63 2c 64 2c 65 2c 66 29 20  nd(a,b,c,d,e,f) 
bb60: 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  0.#endif../*.** 
bb70: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
bb80: 20 70 61 72 74 20 6f 66 20 74 68 65 20 69 6d 70   part of the imp
bb90: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
bba0: 68 65 20 63 6f 6d 6d 61 6e 64 3a 0a 2a 2a 0a 2a  he command:.**.*
bbb0: 2a 20 20 20 24 64 62 20 65 76 61 6c 20 53 51 4c  *   $db eval SQL
bbc0: 20 3f 41 52 52 41 59 4e 41 4d 45 3f 20 53 43 52   ?ARRAYNAME? SCR
bbd0: 49 50 54 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  IPT.*/.static in
bbe0: 74 20 44 62 45 76 61 6c 4e 65 78 74 43 6d 64 28  t DbEvalNextCmd(
bbf0: 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 64 61  .  ClientData da
bc00: 74 61 5b 5d 2c 20 20 20 20 20 20 20 20 20 20 20  ta[],           
bc10: 20 20 20 20 20 20 20 20 2f 2a 20 64 61 74 61 5b          /* data[
bc20: 30 5d 20 69 73 20 74 68 65 20 28 44 62 45 76 61  0] is the (DbEva
bc30: 6c 43 6f 6e 74 65 78 74 2a 29 20 2a 2f 0a 20 20  lContext*) */.  
bc40: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
bc50: 72 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  rp,             
bc60: 20 20 20 20 20 2f 2a 20 54 63 6c 20 69 6e 74 65       /* Tcl inte
bc70: 72 70 72 65 74 65 72 20 2a 2f 0a 20 20 69 6e 74  rpreter */.  int
bc80: 20 72 65 73 75 6c 74 20 20 20 20 20 20 20 20 20   result         
bc90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bca0: 20 20 2f 2a 20 52 65 73 75 6c 74 20 73 6f 20 66    /* Result so f
bcb0: 61 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  ar */.){.  int r
bcc0: 63 20 3d 20 72 65 73 75 6c 74 3b 20 20 20 20 20  c = result;     
bcd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bce0: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
bcf0: 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 66 69 72 73  /..  /* The firs
bd00: 74 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65  t element of the
bd10: 20 64 61 74 61 5b 5d 20 61 72 72 61 79 20 69 73   data[] array is
bd20: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
bd30: 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 0a 20 20  DbEvalContext.  
bd40: 2a 2a 20 73 74 72 75 63 74 75 72 65 20 61 6c 6c  ** structure all
bd50: 6f 63 61 74 65 64 20 75 73 69 6e 67 20 54 63 6c  ocated using Tcl
bd60: 5f 41 6c 6c 6f 63 28 29 2e 20 54 68 65 20 73 65  _Alloc(). The se
bd70: 63 6f 6e 64 20 65 6c 65 6d 65 6e 74 20 6f 66 20  cond element of 
bd80: 64 61 74 61 5b 5d 0a 20 20 2a 2a 20 69 73 20 61  data[].  ** is a
bd90: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 54 63   pointer to a Tc
bda0: 6c 5f 4f 62 6a 20 63 6f 6e 74 61 69 6e 69 6e 67  l_Obj containing
bdb0: 20 74 68 65 20 73 63 72 69 70 74 20 74 6f 20 72   the script to r
bdc0: 75 6e 20 66 6f 72 20 65 61 63 68 20 72 6f 77 0a  un for each row.
bdd0: 20 20 2a 2a 20 72 65 74 75 72 6e 65 64 20 62 79    ** returned by
bde0: 20 74 68 65 20 71 75 65 72 69 65 73 20 65 6e 63   the queries enc
bdf0: 61 70 73 75 6c 61 74 65 64 20 69 6e 20 64 61 74  apsulated in dat
be00: 61 5b 30 5d 2e 20 2a 2f 0a 20 20 44 62 45 76 61  a[0]. */.  DbEva
be10: 6c 43 6f 6e 74 65 78 74 20 2a 70 20 3d 20 28 44  lContext *p = (D
be20: 62 45 76 61 6c 43 6f 6e 74 65 78 74 20 2a 29 64  bEvalContext *)d
be30: 61 74 61 5b 30 5d 3b 0a 20 20 54 63 6c 5f 4f 62  ata[0];.  Tcl_Ob
be40: 6a 20 2a 70 53 63 72 69 70 74 20 3d 20 28 54 63  j *pScript = (Tc
be50: 6c 5f 4f 62 6a 20 2a 29 64 61 74 61 5b 31 5d 3b  l_Obj *)data[1];
be60: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 41 72 72  .  Tcl_Obj *pArr
be70: 61 79 20 3d 20 70 2d 3e 70 41 72 72 61 79 3b 0a  ay = p->pArray;.
be80: 0a 20 20 77 68 69 6c 65 28 20 28 72 63 3d 3d 54  .  while( (rc==T
be90: 43 4c 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 54 43 4c  CL_OK || rc==TCL
bea0: 5f 43 4f 4e 54 49 4e 55 45 29 20 26 26 20 54 43  _CONTINUE) && TC
beb0: 4c 5f 4f 4b 3d 3d 28 72 63 20 3d 20 64 62 45 76  L_OK==(rc = dbEv
bec0: 61 6c 53 74 65 70 28 70 29 29 20 29 7b 0a 20 20  alStep(p)) ){.  
bed0: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74    int i;.    int
bee0: 20 6e 43 6f 6c 3b 0a 20 20 20 20 54 63 6c 5f 4f   nCol;.    Tcl_O
bef0: 62 6a 20 2a 2a 61 70 43 6f 6c 4e 61 6d 65 3b 0a  bj **apColName;.
bf00: 20 20 20 20 64 62 45 76 61 6c 52 6f 77 49 6e 66      dbEvalRowInf
bf10: 6f 28 70 2c 20 26 6e 43 6f 6c 2c 20 26 61 70 43  o(p, &nCol, &apC
bf20: 6f 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 66 6f 72  olName);.    for
bf30: 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b  (i=0; i<nCol; i+
bf40: 2b 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 4f 62  +){.      Tcl_Ob
bf50: 6a 20 2a 70 56 61 6c 20 3d 20 64 62 45 76 61 6c  j *pVal = dbEval
bf60: 43 6f 6c 75 6d 6e 56 61 6c 75 65 28 70 2c 20 69  ColumnValue(p, i
bf70: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 41 72  );.      if( pAr
bf80: 72 61 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ray==0 ){.      
bf90: 20 20 54 63 6c 5f 4f 62 6a 53 65 74 56 61 72 32    Tcl_ObjSetVar2
bfa0: 28 69 6e 74 65 72 70 2c 20 61 70 43 6f 6c 4e 61  (interp, apColNa
bfb0: 6d 65 5b 69 5d 2c 20 30 2c 20 70 56 61 6c 2c 20  me[i], 0, pVal, 
bfc0: 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  0);.      }else{
bfd0: 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a  .        Tcl_Obj
bfe0: 53 65 74 56 61 72 32 28 69 6e 74 65 72 70 2c 20  SetVar2(interp, 
bff0: 70 41 72 72 61 79 2c 20 61 70 43 6f 6c 4e 61 6d  pArray, apColNam
c000: 65 5b 69 5d 2c 20 70 56 61 6c 2c 20 30 29 3b 0a  e[i], pVal, 0);.
c010: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
c020: 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 69 72     /* The requir
c030: 65 64 20 69 6e 74 65 72 70 72 65 74 65 72 20 76  ed interpreter v
c040: 61 72 69 61 62 6c 65 73 20 61 72 65 20 6e 6f 77  ariables are now
c050: 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20   populated with 
c060: 74 68 65 20 64 61 74 61 20 0a 20 20 20 20 2a 2a  the data .    **
c070: 20 66 72 6f 6d 20 74 68 65 20 63 75 72 72 65 6e   from the curren
c080: 74 20 72 6f 77 2e 20 49 66 20 75 73 69 6e 67 20  t row. If using 
c090: 4e 52 45 2c 20 73 63 68 65 64 75 6c 65 20 63 61  NRE, schedule ca
c0a0: 6c 6c 62 61 63 6b 73 20 74 6f 20 65 76 61 6c 75  llbacks to evalu
c0b0: 61 74 65 0a 20 20 20 20 2a 2a 20 73 63 72 69 70  ate.    ** scrip
c0c0: 74 20 70 53 63 72 69 70 74 2c 20 74 68 65 6e 20  t pScript, then 
c0d0: 74 6f 20 69 6e 76 6f 6b 65 20 74 68 69 73 20 66  to invoke this f
c0e0: 75 6e 63 74 69 6f 6e 20 61 67 61 69 6e 20 74 6f  unction again to
c0f0: 20 66 65 74 63 68 20 74 68 65 20 6e 65 78 74 0a   fetch the next.
c100: 20 20 20 20 2a 2a 20 72 6f 77 20 28 6f 72 20 63      ** row (or c
c110: 6c 65 61 6e 20 75 70 20 69 66 20 74 68 65 72 65  lean up if there
c120: 20 69 73 20 6e 6f 20 6e 65 78 74 20 72 6f 77 20   is no next row 
c130: 6f 72 20 74 68 65 20 73 63 72 69 70 74 20 74 68  or the script th
c140: 72 6f 77 73 20 61 6e 0a 20 20 20 20 2a 2a 20 65  rows an.    ** e
c150: 78 63 65 70 74 69 6f 6e 29 2e 20 41 66 74 65 72  xception). After
c160: 20 73 63 68 65 64 75 6c 69 6e 67 20 74 68 65 20   scheduling the 
c170: 63 61 6c 6c 62 61 63 6b 73 2c 20 72 65 74 75 72  callbacks, retur
c180: 6e 20 63 6f 6e 74 72 6f 6c 20 74 6f 20 74 68 65  n control to the
c190: 20 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 65 72 2e   .    ** caller.
c1a0: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49  .    **.    ** I
c1b0: 66 20 6e 6f 74 20 75 73 69 6e 67 20 4e 52 45 2c  f not using NRE,
c1c0: 20 65 76 61 6c 75 61 74 65 20 70 53 63 72 69 70   evaluate pScrip
c1d0: 74 20 64 69 72 65 63 74 6c 79 20 61 6e 64 20 63  t directly and c
c1e0: 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 74 68 65  ontinue with the
c1f0: 0a 20 20 20 20 2a 2a 20 6e 65 78 74 20 69 74 65  .    ** next ite
c200: 72 61 74 69 6f 6e 20 6f 66 20 74 68 69 73 20 77  ration of this w
c210: 68 69 6c 65 28 2e 2e 2e 29 20 6c 6f 6f 70 2e 20  hile(...) loop. 
c220: 20 2a 2f 0a 20 20 20 20 69 66 28 20 44 62 55 73   */.    if( DbUs
c230: 65 4e 72 65 28 29 20 29 7b 0a 20 20 20 20 20 20  eNre() ){.      
c240: 54 63 6c 5f 4e 52 41 64 64 43 61 6c 6c 62 61 63  Tcl_NRAddCallbac
c250: 6b 28 69 6e 74 65 72 70 2c 20 44 62 45 76 61 6c  k(interp, DbEval
c260: 4e 65 78 74 43 6d 64 2c 20 28 76 6f 69 64 2a 29  NextCmd, (void*)
c270: 70 2c 20 28 76 6f 69 64 2a 29 70 53 63 72 69 70  p, (void*)pScrip
c280: 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  t, 0, 0);.      
c290: 72 65 74 75 72 6e 20 54 63 6c 5f 4e 52 45 76 61  return Tcl_NREva
c2a0: 6c 4f 62 6a 28 69 6e 74 65 72 70 2c 20 70 53 63  lObj(interp, pSc
c2b0: 72 69 70 74 2c 20 30 29 3b 0a 20 20 20 20 7d 65  ript, 0);.    }e
c2c0: 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
c2d0: 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69 6e  Tcl_EvalObjEx(in
c2e0: 74 65 72 70 2c 20 70 53 63 72 69 70 74 2c 20 30  terp, pScript, 0
c2f0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
c300: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
c310: 28 70 53 63 72 69 70 74 29 3b 0a 20 20 64 62 45  (pScript);.  dbE
c320: 76 61 6c 46 69 6e 61 6c 69 7a 65 28 70 29 3b 0a  valFinalize(p);.
c330: 20 20 54 63 6c 5f 46 72 65 65 28 28 63 68 61 72    Tcl_Free((char
c340: 20 2a 29 70 29 3b 0a 0a 20 20 69 66 28 20 72 63   *)p);..  if( rc
c350: 3d 3d 54 43 4c 5f 4f 4b 20 7c 7c 20 72 63 3d 3d  ==TCL_OK || rc==
c360: 54 43 4c 5f 42 52 45 41 4b 20 29 7b 0a 20 20 20  TCL_BREAK ){.   
c370: 20 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74   Tcl_ResetResult
c380: 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 72 63  (interp);.    rc
c390: 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20 7d 0a 20   = TCL_OK;.  }. 
c3a0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
c3b0: 2a 0a 2a 2a 20 54 68 65 20 22 73 71 6c 69 74 65  *.** The "sqlite
c3c0: 22 20 63 6f 6d 6d 61 6e 64 20 62 65 6c 6f 77 20  " command below 
c3d0: 63 72 65 61 74 65 73 20 61 20 6e 65 77 20 54 63  creates a new Tc
c3e0: 6c 20 63 6f 6d 6d 61 6e 64 20 66 6f 72 20 65 61  l command for ea
c3f0: 63 68 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e  ch.** connection
c400: 20 69 74 20 6f 70 65 6e 73 20 74 6f 20 61 6e 20   it opens to an 
c410: 53 51 4c 69 74 65 20 64 61 74 61 62 61 73 65 2e  SQLite database.
c420: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69    This routine i
c430: 73 20 69 6e 76 6f 6b 65 64 0a 2a 2a 20 77 68 65  s invoked.** whe
c440: 6e 65 76 65 72 20 6f 6e 65 20 6f 66 20 74 68 6f  never one of tho
c450: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2d 73 70  se connection-sp
c460: 65 63 69 66 69 63 20 63 6f 6d 6d 61 6e 64 73 20  ecific commands 
c470: 69 73 20 65 78 65 63 75 74 65 64 0a 2a 2a 20 69  is executed.** i
c480: 6e 20 54 63 6c 2e 20 20 46 6f 72 20 65 78 61 6d  n Tcl.  For exam
c490: 70 6c 65 2c 20 69 66 20 79 6f 75 20 72 75 6e 20  ple, if you run 
c4a0: 54 63 6c 20 63 6f 64 65 20 6c 69 6b 65 20 74 68  Tcl code like th
c4b0: 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  is:.**.**       
c4c0: 73 71 6c 69 74 65 33 20 64 62 31 20 20 22 6d 79  sqlite3 db1  "my
c4d0: 5f 64 61 74 61 62 61 73 65 22 0a 2a 2a 20 20 20  _database".**   
c4e0: 20 20 20 20 64 62 31 20 63 6c 6f 73 65 0a 2a 2a      db1 close.**
c4f0: 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 63 6f  .** The first co
c500: 6d 6d 61 6e 64 20 6f 70 65 6e 73 20 61 20 63 6f  mmand opens a co
c510: 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 74 68 65 20  nnection to the 
c520: 22 6d 79 5f 64 61 74 61 62 61 73 65 22 20 64 61  "my_database" da
c530: 74 61 62 61 73 65 0a 2a 2a 20 61 6e 64 20 63 61  tabase.** and ca
c540: 6c 6c 73 20 74 68 61 74 20 63 6f 6e 6e 65 63 74  lls that connect
c550: 69 6f 6e 20 22 64 62 31 22 2e 20 20 54 68 65 20  ion "db1".  The 
c560: 73 65 63 6f 6e 64 20 63 6f 6d 6d 61 6e 64 20 63  second command c
c570: 61 75 73 65 73 20 74 68 69 73 0a 2a 2a 20 73 75  auses this.** su
c580: 62 72 6f 75 74 69 6e 65 20 74 6f 20 62 65 20 69  broutine to be i
c590: 6e 76 6f 6b 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  nvoked..*/.stati
c5a0: 63 20 69 6e 74 20 44 62 4f 62 6a 43 6d 64 28 76  c int DbObjCmd(v
c5b0: 6f 69 64 20 2a 63 64 2c 20 54 63 6c 5f 49 6e 74  oid *cd, Tcl_Int
c5c0: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74  erp *interp, int
c5d0: 20 6f 62 6a 63 2c 54 63 6c 5f 4f 62 6a 20 2a 63   objc,Tcl_Obj *c
c5e0: 6f 6e 73 74 2a 6f 62 6a 76 29 7b 0a 20 20 53 71  onst*objv){.  Sq
c5f0: 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53  liteDb *pDb = (S
c600: 71 6c 69 74 65 44 62 2a 29 63 64 3b 0a 20 20 69  qliteDb*)cd;.  i
c610: 6e 74 20 63 68 6f 69 63 65 3b 0a 20 20 69 6e 74  nt choice;.  int
c620: 20 72 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20   rc = TCL_OK;.  
c630: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
c640: 72 20 2a 44 42 5f 73 74 72 73 5b 5d 20 3d 20 7b  r *DB_strs[] = {
c650: 0a 20 20 20 20 22 61 75 74 68 6f 72 69 7a 65 72  .    "authorizer
c660: 22 2c 20 20 20 20 20 20 20 20 20 22 62 61 63 6b  ",         "back
c670: 75 70 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  up",            
c680: 22 62 75 73 79 22 2c 0a 20 20 20 20 22 63 61 63  "busy",.    "cac
c690: 68 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  he",            
c6a0: 20 20 22 63 68 61 6e 67 65 73 22 2c 20 20 20 20    "changes",    
c6b0: 20 20 20 20 20 20 20 22 63 6c 6f 73 65 22 2c 0a         "close",.
c6c0: 20 20 20 20 22 63 6f 6c 6c 61 74 65 22 2c 20 20      "collate",  
c6d0: 20 20 20 20 20 20 20 20 20 20 22 63 6f 6c 6c 61            "colla
c6e0: 74 69 6f 6e 5f 6e 65 65 64 65 64 22 2c 20 20 22  tion_needed",  "
c6f0: 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 22 2c 0a 20 20  commit_hook",.  
c700: 20 20 22 63 6f 6d 70 6c 65 74 65 22 2c 20 20 20    "complete",   
c710: 20 20 20 20 20 20 20 20 22 63 6f 70 79 22 2c 20          "copy", 
c720: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 65 6e               "en
c730: 61 62 6c 65 5f 6c 6f 61 64 5f 65 78 74 65 6e 73  able_load_extens
c740: 69 6f 6e 22 2c 0a 20 20 20 20 22 65 72 72 6f 72  ion",.    "error
c750: 63 6f 64 65 22 2c 20 20 20 20 20 20 20 20 20 20  code",          
c760: 22 65 76 61 6c 22 2c 20 20 20 20 20 20 20 20 20  "eval",         
c770: 20 20 20 20 20 22 65 78 69 73 74 73 22 2c 0a 20       "exists",. 
c780: 20 20 20 22 66 75 6e 63 74 69 6f 6e 22 2c 20 20     "function",  
c790: 20 20 20 20 20 20 20 20 20 22 69 6e 63 72 62 6c           "incrbl
c7a0: 6f 62 22 2c 20 20 20 20 20 20 20 20 20 20 22 69  ob",          "i
c7b0: 6e 74 65 72 72 75 70 74 22 2c 0a 20 20 20 20 22  nterrupt",.    "
c7c0: 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69  last_insert_rowi
c7d0: 64 22 2c 20 20 22 6e 75 6c 6c 76 61 6c 75 65 22  d",  "nullvalue"
c7e0: 2c 20 20 20 20 20 20 20 20 20 22 6f 6e 65 63 6f  ,         "oneco
c7f0: 6c 75 6d 6e 22 2c 0a 20 20 20 20 22 70 72 6f 66  lumn",.    "prof
c800: 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ile",           
c810: 20 22 70 72 6f 67 72 65 73 73 22 2c 20 20 20 20   "progress",    
c820: 20 20 20 20 20 20 22 72 65 6b 65 79 22 2c 0a 20        "rekey",. 
c830: 20 20 20 22 72 65 73 74 6f 72 65 22 2c 20 20 20     "restore",   
c840: 20 20 20 20 20 20 20 20 20 22 72 6f 6c 6c 62 61           "rollba
c850: 63 6b 5f 68 6f 6f 6b 22 2c 20 20 20 20 20 22 73  ck_hook",     "s
c860: 74 61 74 75 73 22 2c 0a 20 20 20 20 22 74 69 6d  tatus",.    "tim
c870: 65 6f 75 74 22 2c 20 20 20 20 20 20 20 20 20 20  eout",          
c880: 20 20 22 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73    "total_changes
c890: 22 2c 20 20 20 20 20 22 74 72 61 63 65 22 2c 0a  ",     "trace",.
c8a0: 20 20 20 20 22 74 72 61 6e 73 61 63 74 69 6f 6e      "transaction
c8b0: 22 2c 20 20 20 20 20 20 20 20 22 75 6e 6c 6f 63  ",        "unloc
c8c0: 6b 5f 6e 6f 74 69 66 79 22 2c 20 20 20 20 20 22  k_notify",     "
c8d0: 75 70 64 61 74 65 5f 68 6f 6f 6b 22 2c 0a 20 20  update_hook",.  
c8e0: 20 20 22 76 65 72 73 69 6f 6e 22 2c 20 20 20 20    "version",    
c8f0: 20 20 20 20 20 20 20 20 22 77 61 6c 5f 68 6f 6f          "wal_hoo
c900: 6b 22 2c 20 20 20 20 20 20 20 20 20 20 30 0a 20  k",          0. 
c910: 20 7d 3b 0a 20 20 65 6e 75 6d 20 44 42 5f 65 6e   };.  enum DB_en
c920: 75 6d 20 7b 0a 20 20 20 20 44 42 5f 41 55 54 48  um {.    DB_AUTH
c930: 4f 52 49 5a 45 52 2c 20 20 20 20 20 20 20 20 44  ORIZER,        D
c940: 42 5f 42 41 43 4b 55 50 2c 20 20 20 20 20 20 20  B_BACKUP,       
c950: 20 20 20 20 44 42 5f 42 55 53 59 2c 0a 20 20 20      DB_BUSY,.   
c960: 20 44 42 5f 43 41 43 48 45 2c 20 20 20 20 20 20   DB_CACHE,      
c970: 20 20 20 20 20 20 20 44 42 5f 43 48 41 4e 47 45         DB_CHANGE
c980: 53 2c 20 20 20 20 20 20 20 20 20 20 44 42 5f 43  S,          DB_C
c990: 4c 4f 53 45 2c 0a 20 20 20 20 44 42 5f 43 4f 4c  LOSE,.    DB_COL
c9a0: 4c 41 54 45 2c 20 20 20 20 20 20 20 20 20 20 20  LATE,           
c9b0: 44 42 5f 43 4f 4c 4c 41 54 49 4f 4e 5f 4e 45 45  DB_COLLATION_NEE
c9c0: 44 45 44 2c 20 44 42 5f 43 4f 4d 4d 49 54 5f 48  DED, DB_COMMIT_H
c9d0: 4f 4f 4b 2c 0a 20 20 20 20 44 42 5f 43 4f 4d 50  OOK,.    DB_COMP
c9e0: 4c 45 54 45 2c 20 20 20 20 20 20 20 20 20 20 44  LETE,          D
c9f0: 42 5f 43 4f 50 59 2c 20 20 20 20 20 20 20 20 20  B_COPY,         
ca00: 20 20 20 20 44 42 5f 45 4e 41 42 4c 45 5f 4c 4f      DB_ENABLE_LO
ca10: 41 44 5f 45 58 54 45 4e 53 49 4f 4e 2c 0a 20 20  AD_EXTENSION,.  
ca20: 20 20 44 42 5f 45 52 52 4f 52 43 4f 44 45 2c 20    DB_ERRORCODE, 
ca30: 20 20 20 20 20 20 20 20 44 42 5f 45 56 41 4c 2c          DB_EVAL,
ca40: 20 20 20 20 20 20 20 20 20 20 20 20 20 44 42 5f               DB_
ca50: 45 58 49 53 54 53 2c 0a 20 20 20 20 44 42 5f 46  EXISTS,.    DB_F
ca60: 55 4e 43 54 49 4f 4e 2c 20 20 20 20 20 20 20 20  UNCTION,        
ca70: 20 20 44 42 5f 49 4e 43 52 42 4c 4f 42 2c 20 20    DB_INCRBLOB,  
ca80: 20 20 20 20 20 20 20 44 42 5f 49 4e 54 45 52 52         DB_INTERR
ca90: 55 50 54 2c 0a 20 20 20 20 44 42 5f 4c 41 53 54  UPT,.    DB_LAST
caa0: 5f 49 4e 53 45 52 54 5f 52 4f 57 49 44 2c 20 44  _INSERT_ROWID, D
cab0: 42 5f 4e 55 4c 4c 56 41 4c 55 45 2c 20 20 20 20  B_NULLVALUE,    
cac0: 20 20 20 20 44 42 5f 4f 4e 45 43 4f 4c 55 4d 4e      DB_ONECOLUMN
cad0: 2c 0a 20 20 20 20 44 42 5f 50 52 4f 46 49 4c 45  ,.    DB_PROFILE
cae0: 2c 20 20 20 20 20 20 20 20 20 20 20 44 42 5f 50  ,           DB_P
caf0: 52 4f 47 52 45 53 53 2c 20 20 20 20 20 20 20 20  ROGRESS,        
cb00: 20 44 42 5f 52 45 4b 45 59 2c 0a 20 20 20 20 44   DB_REKEY,.    D
cb10: 42 5f 52 45 53 54 4f 52 45 2c 20 20 20 20 20 20  B_RESTORE,      
cb20: 20 20 20 20 20 44 42 5f 52 4f 4c 4c 42 41 43 4b       DB_ROLLBACK
cb30: 5f 48 4f 4f 4b 2c 20 20 20 20 44 42 5f 53 54 41  _HOOK,    DB_STA
cb40: 54 55 53 2c 0a 20 20 20 20 44 42 5f 54 49 4d 45  TUS,.    DB_TIME
cb50: 4f 55 54 2c 20 20 20 20 20 20 20 20 20 20 20 44  OUT,           D
cb60: 42 5f 54 4f 54 41 4c 5f 43 48 41 4e 47 45 53 2c  B_TOTAL_CHANGES,
cb70: 20 20 20 20 44 42 5f 54 52 41 43 45 2c 0a 20 20      DB_TRACE,.  
cb80: 20 20 44 42 5f 54 52 41 4e 53 41 43 54 49 4f 4e    DB_TRANSACTION
cb90: 2c 20 20 20 20 20 20 20 44 42 5f 55 4e 4c 4f 43  ,       DB_UNLOC
cba0: 4b 5f 4e 4f 54 49 46 59 2c 20 20 20 20 44 42 5f  K_NOTIFY,    DB_
cbb0: 55 50 44 41 54 45 5f 48 4f 4f 4b 2c 0a 20 20 20  UPDATE_HOOK,.   
cbc0: 20 44 42 5f 56 45 52 53 49 4f 4e 2c 20 20 20 20   DB_VERSION,    
cbd0: 20 20 20 20 20 20 20 44 42 5f 57 41 4c 5f 48 4f         DB_WAL_HO
cbe0: 4f 4b 0a 20 20 7d 3b 0a 20 20 2f 2a 20 64 6f 6e  OK.  };.  /* don
cbf0: 27 74 20 6c 65 61 76 65 20 74 72 61 69 6c 69 6e  't leave trailin
cc00: 67 20 63 6f 6d 6d 61 73 20 6f 6e 20 44 42 5f 65  g commas on DB_e
cc10: 6e 75 6d 2c 20 69 74 20 63 6f 6e 66 75 73 65 73  num, it confuses
cc20: 20 74 68 65 20 41 49 58 20 78 6c 63 20 63 6f 6d   the AIX xlc com
cc30: 70 69 6c 65 72 20 2a 2f 0a 0a 20 20 69 66 28 20  piler */..  if( 
cc40: 6f 62 6a 63 3c 32 20 29 7b 0a 20 20 20 20 54 63  objc<2 ){.    Tc
cc50: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
cc60: 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
cc70: 22 53 55 42 43 4f 4d 4d 41 4e 44 20 2e 2e 2e 22  "SUBCOMMAND ..."
cc80: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
cc90: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
cca0: 66 28 20 54 63 6c 5f 47 65 74 49 6e 64 65 78 46  f( Tcl_GetIndexF
ccb0: 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
ccc0: 62 6a 76 5b 31 5d 2c 20 44 42 5f 73 74 72 73 2c  bjv[1], DB_strs,
ccd0: 20 22 6f 70 74 69 6f 6e 22 2c 20 30 2c 20 26 63   "option", 0, &c
cce0: 68 6f 69 63 65 29 20 29 7b 0a 20 20 20 20 72 65  hoice) ){.    re
ccf0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
cd00: 20 20 7d 0a 0a 20 20 73 77 69 74 63 68 28 20 28    }..  switch( (
cd10: 65 6e 75 6d 20 44 42 5f 65 6e 75 6d 29 63 68 6f  enum DB_enum)cho
cd20: 69 63 65 20 29 7b 0a 0a 20 20 2f 2a 20 20 20 20  ice ){..  /*    
cd30: 24 64 62 20 61 75 74 68 6f 72 69 7a 65 72 20 3f  $db authorizer ?
cd40: 43 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a 0a 20  CALLBACK?.  **. 
cd50: 20 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 67   ** Invoke the g
cd60: 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b 20 74 6f  iven callback to
cd70: 20 61 75 74 68 6f 72 69 7a 65 20 65 61 63 68 20   authorize each 
cd80: 53 51 4c 20 6f 70 65 72 61 74 69 6f 6e 20 61 73  SQL operation as
cd90: 20 69 74 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 70   it is.  ** comp
cda0: 69 6c 65 64 2e 20 20 35 20 61 72 67 75 6d 65 6e  iled.  5 argumen
cdb0: 74 73 20 61 72 65 20 61 70 70 65 6e 64 65 64 20  ts are appended 
cdc0: 74 6f 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20  to the callback 
cdd0: 62 65 66 6f 72 65 20 69 74 20 69 73 0a 20 20 2a  before it is.  *
cde0: 2a 20 69 6e 76 6f 6b 65 64 3a 0a 20 20 2a 2a 0a  * invoked:.  **.
cdf0: 20 20 2a 2a 20 20 20 28 31 29 20 54 68 65 20 61    **   (1) The a
ce00: 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 74 79 70  uthorization typ
ce10: 65 20 28 65 78 3a 20 53 51 4c 49 54 45 5f 43 52  e (ex: SQLITE_CR
ce20: 45 41 54 45 5f 54 41 42 4c 45 2c 20 53 51 4c 49  EATE_TABLE, SQLI
ce30: 54 45 5f 49 4e 53 45 52 54 2c 20 2e 2e 2e 29 0a  TE_INSERT, ...).
ce40: 20 20 2a 2a 20 20 20 28 32 29 20 46 69 72 73 74    **   (2) First
ce50: 20 64 65 73 63 72 69 70 74 69 76 65 20 6e 61 6d   descriptive nam
ce60: 65 20 28 64 65 70 65 6e 64 73 20 6f 6e 20 61 75  e (depends on au
ce70: 74 68 6f 72 69 7a 61 74 69 6f 6e 20 74 79 70 65  thorization type
ce80: 29 0a 20 20 2a 2a 20 20 20 28 33 29 20 53 65 63  ).  **   (3) Sec
ce90: 6f 6e 64 20 64 65 73 63 72 69 70 74 69 76 65 20  ond descriptive 
cea0: 6e 61 6d 65 0a 20 20 2a 2a 20 20 20 28 34 29 20  name.  **   (4) 
ceb0: 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  Name of the data
cec0: 62 61 73 65 20 28 65 78 3a 20 22 6d 61 69 6e 22  base (ex: "main"
ced0: 2c 20 22 74 65 6d 70 22 29 0a 20 20 2a 2a 20 20  , "temp").  **  
cee0: 20 28 35 29 20 4e 61 6d 65 20 6f 66 20 74 72 69   (5) Name of tri
cef0: 67 67 65 72 20 74 68 61 74 20 69 73 20 64 6f 69  gger that is doi
cf00: 6e 67 20 74 68 65 20 61 63 63 65 73 73 0a 20 20  ng the access.  
cf10: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c  **.  ** The call
cf20: 62 61 63 6b 20 73 68 6f 75 6c 64 20 72 65 74 75  back should retu
cf30: 72 6e 20 6f 6e 20 6f 66 20 74 68 65 20 66 6f 6c  rn on of the fol
cf40: 6c 6f 77 69 6e 67 20 73 74 72 69 6e 67 73 3a 20  lowing strings: 
cf50: 53 51 4c 49 54 45 5f 4f 4b 2c 0a 20 20 2a 2a 20  SQLITE_OK,.  ** 
cf60: 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 2c 20 6f  SQLITE_IGNORE, o
cf70: 72 20 53 51 4c 49 54 45 5f 44 45 4e 59 2e 20 20  r SQLITE_DENY.  
cf80: 41 6e 79 20 6f 74 68 65 72 20 72 65 74 75 72 6e  Any other return
cf90: 20 76 61 6c 75 65 20 69 73 20 61 6e 20 65 72 72   value is an err
cfa0: 6f 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  or..  **.  ** If
cfb0: 20 74 68 69 73 20 6d 65 74 68 6f 64 20 69 73 20   this method is 
cfc0: 69 6e 76 6f 6b 65 64 20 77 69 74 68 20 6e 6f 20  invoked with no 
cfd0: 61 72 67 75 6d 65 6e 74 73 2c 20 74 68 65 20 63  arguments, the c
cfe0: 75 72 72 65 6e 74 20 61 75 74 68 6f 72 69 7a 61  urrent authoriza
cff0: 74 69 6f 6e 0a 20 20 2a 2a 20 63 61 6c 6c 62 61  tion.  ** callba
d000: 63 6b 20 73 74 72 69 6e 67 20 69 73 20 72 65 74  ck string is ret
d010: 75 72 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 63 61  urned..  */.  ca
d020: 73 65 20 44 42 5f 41 55 54 48 4f 52 49 5a 45 52  se DB_AUTHORIZER
d030: 3a 20 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  : {.#ifdef SQLIT
d040: 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41  E_OMIT_AUTHORIZA
d050: 54 49 4f 4e 0a 20 20 20 20 54 63 6c 5f 41 70 70  TION.    Tcl_App
d060: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
d070: 2c 20 22 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e  , "authorization
d080: 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 69   not available i
d090: 6e 20 74 68 69 73 20 62 75 69 6c 64 22 2c 20 30  n this build", 0
d0a0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
d0b0: 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 20  L_ERROR;.#else. 
d0c0: 20 20 20 69 66 28 20 6f 62 6a 63 3e 33 20 29 7b     if( objc>3 ){
d0d0: 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  .      Tcl_Wrong
d0e0: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
d0f0: 32 2c 20 6f 62 6a 76 2c 20 22 3f 43 41 4c 4c 42  2, objv, "?CALLB
d100: 41 43 4b 3f 22 29 3b 0a 20 20 20 20 20 20 72 65  ACK?");.      re
d110: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
d120: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 62      }else if( ob
d130: 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 69  jc==2 ){.      i
d140: 66 28 20 70 44 62 2d 3e 7a 41 75 74 68 20 29 7b  f( pDb->zAuth ){
d150: 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70  .        Tcl_App
d160: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
d170: 2c 20 70 44 62 2d 3e 7a 41 75 74 68 2c 20 30 29  , pDb->zAuth, 0)
d180: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
d190: 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20  lse{.      char 
d1a0: 2a 7a 41 75 74 68 3b 0a 20 20 20 20 20 20 69 6e  *zAuth;.      in
d1b0: 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20 69 66 28  t len;.      if(
d1c0: 20 70 44 62 2d 3e 7a 41 75 74 68 20 29 7b 0a 20   pDb->zAuth ){. 
d1d0: 20 20 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28         Tcl_Free(
d1e0: 70 44 62 2d 3e 7a 41 75 74 68 29 3b 0a 20 20 20  pDb->zAuth);.   
d1f0: 20 20 20 7d 0a 20 20 20 20 20 20 7a 41 75 74 68     }.      zAuth
d200: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
d210: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c  FromObj(objv[2],
d220: 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69 66   &len);.      if
d230: 28 20 7a 41 75 74 68 20 26 26 20 6c 65 6e 3e 30  ( zAuth && len>0
d240: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d   ){.        pDb-
d250: 3e 7a 41 75 74 68 20 3d 20 54 63 6c 5f 41 6c 6c  >zAuth = Tcl_All
d260: 6f 63 28 20 6c 65 6e 20 2b 20 31 20 29 3b 0a 20  oc( len + 1 );. 
d270: 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 44         memcpy(pD
d280: 62 2d 3e 7a 41 75 74 68 2c 20 7a 41 75 74 68 2c  b->zAuth, zAuth,
d290: 20 6c 65 6e 2b 31 29 3b 0a 20 20 20 20 20 20 7d   len+1);.      }
d2a0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 44  else{.        pD
d2b0: 62 2d 3e 7a 41 75 74 68 20 3d 20 30 3b 0a 20 20  b->zAuth = 0;.  
d2c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
d2d0: 70 44 62 2d 3e 7a 41 75 74 68 20 29 7b 0a 20 20  pDb->zAuth ){.  
d2e0: 20 20 20 20 20 20 70 44 62 2d 3e 69 6e 74 65 72        pDb->inter
d2f0: 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20  p = interp;.    
d300: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 65 74 5f      sqlite3_set_
d310: 61 75 74 68 6f 72 69 7a 65 72 28 70 44 62 2d 3e  authorizer(pDb->
d320: 64 62 2c 20 61 75 74 68 5f 63 61 6c 6c 62 61 63  db, auth_callbac
d330: 6b 2c 20 70 44 62 29 3b 0a 20 20 20 20 20 20 7d  k, pDb);.      }
d340: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
d350: 6c 69 74 65 33 5f 73 65 74 5f 61 75 74 68 6f 72  lite3_set_author
d360: 69 7a 65 72 28 70 44 62 2d 3e 64 62 2c 20 30 2c  izer(pDb->db, 0,
d370: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
d380: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 62 72   }.#endif.    br
d390: 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20  eak;.  }..  /*  
d3a0: 20 20 24 64 62 20 62 61 63 6b 75 70 20 3f 44 41    $db backup ?DA
d3b0: 54 41 42 41 53 45 3f 20 46 49 4c 45 4e 41 4d 45  TABASE? FILENAME
d3c0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 70 65 6e 20  .  **.  ** Open 
d3d0: 6f 72 20 63 72 65 61 74 65 20 61 20 64 61 74 61  or create a data
d3e0: 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 64 20  base file named 
d3f0: 46 49 4c 45 4e 41 4d 45 2e 20 20 54 72 61 6e 73  FILENAME.  Trans
d400: 66 65 72 20 74 68 65 0a 20 20 2a 2a 20 63 6f 6e  fer the.  ** con
d410: 74 65 6e 74 20 6f 66 20 6c 6f 63 61 6c 20 64 61  tent of local da
d420: 74 61 62 61 73 65 20 44 41 54 41 42 41 53 45 20  tabase DATABASE 
d430: 28 64 65 66 61 75 6c 74 3a 20 22 6d 61 69 6e 22  (default: "main"
d440: 29 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20  ) into the.  ** 
d450: 46 49 4c 45 4e 41 4d 45 20 64 61 74 61 62 61 73  FILENAME databas
d460: 65 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  e..  */.  case D
d470: 42 5f 42 41 43 4b 55 50 3a 20 7b 0a 20 20 20 20  B_BACKUP: {.    
d480: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 65 73  const char *zDes
d490: 74 46 69 6c 65 3b 0a 20 20 20 20 63 6f 6e 73 74  tFile;.    const
d4a0: 20 63 68 61 72 20 2a 7a 53 72 63 44 62 3b 0a 20   char *zSrcDb;. 
d4b0: 20 20 20 73 71 6c 69 74 65 33 20 2a 70 44 65 73     sqlite3 *pDes
d4c0: 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62  t;.    sqlite3_b
d4d0: 61 63 6b 75 70 20 2a 70 42 61 63 6b 75 70 3b 0a  ackup *pBackup;.
d4e0: 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d 33  .    if( objc==3
d4f0: 20 29 7b 0a 20 20 20 20 20 20 7a 53 72 63 44 62   ){.      zSrcDb
d500: 20 3d 20 22 6d 61 69 6e 22 3b 0a 20 20 20 20 20   = "main";.     
d510: 20 7a 44 65 73 74 46 69 6c 65 20 3d 20 54 63 6c   zDestFile = Tcl
d520: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
d530: 32 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  2]);.    }else i
d540: 66 28 20 6f 62 6a 63 3d 3d 34 20 29 7b 0a 20 20  f( objc==4 ){.  
d550: 20 20 20 20 7a 53 72 63 44 62 20 3d 20 54 63 6c      zSrcDb = Tcl
d560: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
d570: 32 5d 29 3b 0a 20 20 20 20 20 20 7a 44 65 73 74  2]);.      zDest
d580: 46 69 6c 65 20 3d 20 54 63 6c 5f 47 65 74 53 74  File = Tcl_GetSt
d590: 72 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a 20  ring(objv[3]);. 
d5a0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
d5b0: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
d5c0: 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76  (interp, 2, objv
d5d0: 2c 20 22 3f 44 41 54 41 42 41 53 45 3f 20 46 49  , "?DATABASE? FI
d5e0: 4c 45 4e 41 4d 45 22 29 3b 0a 20 20 20 20 20 20  LENAME");.      
d5f0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
d600: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
d610: 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 7a 44   sqlite3_open(zD
d620: 65 73 74 46 69 6c 65 2c 20 26 70 44 65 73 74 29  estFile, &pDest)
d630: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
d640: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
d650: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
d660: 74 28 69 6e 74 65 72 70 2c 20 22 63 61 6e 6e 6f  t(interp, "canno
d670: 74 20 6f 70 65 6e 20 74 61 72 67 65 74 20 64 61  t open target da
d680: 74 61 62 61 73 65 3a 20 22 2c 0a 20 20 20 20 20  tabase: ",.     
d690: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65 72        sqlite3_er
d6a0: 72 6d 73 67 28 70 44 65 73 74 29 2c 20 28 63 68  rmsg(pDest), (ch
d6b0: 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 73 71  ar*)0);.      sq
d6c0: 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70 44 65 73  lite3_close(pDes
d6d0: 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  t);.      return
d6e0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
d6f0: 7d 0a 20 20 20 20 70 42 61 63 6b 75 70 20 3d 20  }.    pBackup = 
d700: 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f 69  sqlite3_backup_i
d710: 6e 69 74 28 70 44 65 73 74 2c 20 22 6d 61 69 6e  nit(pDest, "main
d720: 22 2c 20 70 44 62 2d 3e 64 62 2c 20 7a 53 72 63  ", pDb->db, zSrc
d730: 44 62 29 3b 0a 20 20 20 20 69 66 28 20 70 42 61  Db);.    if( pBa
d740: 63 6b 75 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ckup==0 ){.     
d750: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
d760: 74 28 69 6e 74 65 72 70 2c 20 22 62 61 63 6b 75  t(interp, "backu
d770: 70 20 66 61 69 6c 65 64 3a 20 22 2c 0a 20 20 20  p failed: ",.   
d780: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
d790: 65 72 72 6d 73 67 28 70 44 65 73 74 29 2c 20 28  errmsg(pDest), (
d7a0: 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20  char*)0);.      
d7b0: 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70 44  sqlite3_close(pD
d7c0: 65 73 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75  est);.      retu
d7d0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
d7e0: 20 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 20    }.    while(  
d7f0: 28 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 61  (rc = sqlite3_ba
d800: 63 6b 75 70 5f 73 74 65 70 28 70 42 61 63 6b 75  ckup_step(pBacku
d810: 70 2c 31 30 30 29 29 3d 3d 53 51 4c 49 54 45 5f  p,100))==SQLITE_
d820: 4f 4b 20 29 7b 7d 0a 20 20 20 20 73 71 6c 69 74  OK ){}.    sqlit
d830: 65 33 5f 62 61 63 6b 75 70 5f 66 69 6e 69 73 68  e3_backup_finish
d840: 28 70 42 61 63 6b 75 70 29 3b 0a 20 20 20 20 69  (pBackup);.    i
d850: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f  f( rc==SQLITE_DO
d860: 4e 45 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  NE ){.      rc =
d870: 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c   TCL_OK;.    }el
d880: 73 65 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70  se{.      Tcl_Ap
d890: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
d8a0: 70 2c 20 22 62 61 63 6b 75 70 20 66 61 69 6c 65  p, "backup faile
d8b0: 64 3a 20 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d: ",.          
d8c0: 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
d8d0: 70 44 65 73 74 29 2c 20 28 63 68 61 72 2a 29 30  pDest), (char*)0
d8e0: 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 54 43  );.      rc = TC
d8f0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
d900: 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65     sqlite3_close
d910: 28 70 44 65 73 74 29 3b 0a 20 20 20 20 62 72 65  (pDest);.    bre
d920: 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20  ak;.  }..  /*   
d930: 20 24 64 62 20 62 75 73 79 20 3f 43 41 4c 4c 42   $db busy ?CALLB
d940: 41 43 4b 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  ACK?.  **.  ** I
d950: 6e 76 6f 6b 65 20 74 68 65 20 67 69 76 65 6e 20  nvoke the given 
d960: 63 61 6c 6c 62 61 63 6b 20 69 66 20 61 6e 20 53  callback if an S
d970: 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 61 74 74  QL statement att
d980: 65 6d 70 74 73 20 74 6f 20 6f 70 65 6e 0a 20 20  empts to open.  
d990: 2a 2a 20 61 20 6c 6f 63 6b 65 64 20 64 61 74 61  ** a locked data
d9a0: 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a  base file..  */.
d9b0: 20 20 63 61 73 65 20 44 42 5f 42 55 53 59 3a 20    case DB_BUSY: 
d9c0: 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 33  {.    if( objc>3
d9d0: 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72   ){.      Tcl_Wr
d9e0: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
d9f0: 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 43 41 4c  p, 2, objv, "CAL
da00: 4c 42 41 43 4b 22 29 3b 0a 20 20 20 20 20 20 72  LBACK");.      r
da10: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
da20: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f  .    }else if( o
da30: 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20  bjc==2 ){.      
da40: 69 66 28 20 70 44 62 2d 3e 7a 42 75 73 79 20 29  if( pDb->zBusy )
da50: 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70  {.        Tcl_Ap
da60: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
da70: 70 2c 20 70 44 62 2d 3e 7a 42 75 73 79 2c 20 30  p, pDb->zBusy, 0
da80: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
da90: 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72  else{.      char
daa0: 20 2a 7a 42 75 73 79 3b 0a 20 20 20 20 20 20 69   *zBusy;.      i
dab0: 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20 69 66  nt len;.      if
dac0: 28 20 70 44 62 2d 3e 7a 42 75 73 79 20 29 7b 0a  ( pDb->zBusy ){.
dad0: 20 20 20 20 20 20 20 20 54 63 6c 5f 46 72 65 65          Tcl_Free
dae0: 28 70 44 62 2d 3e 7a 42 75 73 79 29 3b 0a 20 20  (pDb->zBusy);.  
daf0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 42 75 73      }.      zBus
db00: 79 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  y = Tcl_GetStrin
db10: 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d  gFromObj(objv[2]
db20: 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69  , &len);.      i
db30: 66 28 20 7a 42 75 73 79 20 26 26 20 6c 65 6e 3e  f( zBusy && len>
db40: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62  0 ){.        pDb
db50: 2d 3e 7a 42 75 73 79 20 3d 20 54 63 6c 5f 41 6c  ->zBusy = Tcl_Al
db60: 6c 6f 63 28 20 6c 65 6e 20 2b 20 31 20 29 3b 0a  loc( len + 1 );.
db70: 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70          memcpy(p
db80: 44 62 2d 3e 7a 42 75 73 79 2c 20 7a 42 75 73 79  Db->zBusy, zBusy
db90: 2c 20 6c 65 6e 2b 31 29 3b 0a 20 20 20 20 20 20  , len+1);.      
dba0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
dbb0: 44 62 2d 3e 7a 42 75 73 79 20 3d 20 30 3b 0a 20  Db->zBusy = 0;. 
dbc0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
dbd0: 20 70 44 62 2d 3e 7a 42 75 73 79 20 29 7b 0a 20   pDb->zBusy ){. 
dbe0: 20 20 20 20 20 20 20 70 44 62 2d 3e 69 6e 74 65         pDb->inte
dbf0: 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20  rp = interp;.   
dc00: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 75 73       sqlite3_bus
dc10: 79 5f 68 61 6e 64 6c 65 72 28 70 44 62 2d 3e 64  y_handler(pDb->d
dc20: 62 2c 20 44 62 42 75 73 79 48 61 6e 64 6c 65 72  b, DbBusyHandler
dc30: 2c 20 70 44 62 29 3b 0a 20 20 20 20 20 20 7d 65  , pDb);.      }e
dc40: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
dc50: 69 74 65 33 5f 62 75 73 79 5f 68 61 6e 64 6c 65  ite3_busy_handle
dc60: 72 28 70 44 62 2d 3e 64 62 2c 20 30 2c 20 30 29  r(pDb->db, 0, 0)
dc70: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
dc80: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
dc90: 20 20 2f 2a 20 20 20 20 20 24 64 62 20 63 61 63    /*     $db cac
dca0: 68 65 20 66 6c 75 73 68 0a 20 20 2a 2a 20 20 20  he flush.  **   
dcb0: 20 20 24 64 62 20 63 61 63 68 65 20 73 69 7a 65    $db cache size
dcc0: 20 6e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46 6c 75   n.  **.  ** Flu
dcd0: 73 68 20 74 68 65 20 70 72 65 70 61 72 65 64 20  sh the prepared 
dce0: 73 74 61 74 65 6d 65 6e 74 20 63 61 63 68 65 2c  statement cache,
dcf0: 20 6f 72 20 73 65 74 20 74 68 65 20 6d 61 78 69   or set the maxi
dd00: 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20  mum number of.  
dd10: 2a 2a 20 63 61 63 68 65 64 20 73 74 61 74 65 6d  ** cached statem
dd20: 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 63 61 73  ents..  */.  cas
dd30: 65 20 44 42 5f 43 41 43 48 45 3a 20 7b 0a 20 20  e DB_CACHE: {.  
dd40: 20 20 63 68 61 72 20 2a 73 75 62 43 6d 64 3b 0a    char *subCmd;.
dd50: 20 20 20 20 69 6e 74 20 6e 3b 0a 0a 20 20 20 20      int n;..    
dd60: 69 66 28 20 6f 62 6a 63 3c 3d 32 20 29 7b 0a 20  if( objc<=2 ){. 
dd70: 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
dd80: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
dd90: 20 6f 62 6a 76 2c 20 22 63 61 63 68 65 20 6f 70   objv, "cache op
dda0: 74 69 6f 6e 20 3f 61 72 67 3f 22 29 3b 0a 20 20  tion ?arg?");.  
ddb0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
ddc0: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
ddd0: 73 75 62 43 6d 64 20 3d 20 54 63 6c 5f 47 65 74  subCmd = Tcl_Get
dde0: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 20 6f  StringFromObj( o
ddf0: 62 6a 76 5b 32 5d 2c 20 30 20 29 3b 0a 20 20 20  bjv[2], 0 );.   
de00: 20 69 66 28 20 2a 73 75 62 43 6d 64 3d 3d 27 66   if( *subCmd=='f
de10: 27 20 26 26 20 73 74 72 63 6d 70 28 73 75 62 43  ' && strcmp(subC
de20: 6d 64 2c 22 66 6c 75 73 68 22 29 3d 3d 30 20 29  md,"flush")==0 )
de30: 7b 0a 20 20 20 20 20 20 69 66 28 20 6f 62 6a 63  {.      if( objc
de40: 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 20 20 54  !=3 ){.        T
de50: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
de60: 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c  interp, 2, objv,
de70: 20 22 66 6c 75 73 68 22 29 3b 0a 20 20 20 20 20   "flush");.     
de80: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
de90: 52 4f 52 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ROR;.      }else
dea0: 7b 0a 20 20 20 20 20 20 20 20 66 6c 75 73 68 53  {.        flushS
deb0: 74 6d 74 43 61 63 68 65 28 20 70 44 62 20 29 3b  tmtCache( pDb );
dec0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
ded0: 73 65 20 69 66 28 20 2a 73 75 62 43 6d 64 3d 3d  se if( *subCmd==
dee0: 27 73 27 20 26 26 20 73 74 72 63 6d 70 28 73 75  's' && strcmp(su
def0: 62 43 6d 64 2c 22 73 69 7a 65 22 29 3d 3d 30 20  bCmd,"size")==0 
df00: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6f 62 6a  ){.      if( obj
df10: 63 21 3d 34 20 29 7b 0a 20 20 20 20 20 20 20 20  c!=4 ){.        
df20: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
df30: 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76  (interp, 2, objv
df40: 2c 20 22 73 69 7a 65 20 6e 22 29 3b 0a 20 20 20  , "size n");.   
df50: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
df60: 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 65 6c  ERROR;.      }el
df70: 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  se{.        if( 
df80: 54 43 4c 5f 45 52 52 4f 52 3d 3d 54 63 6c 5f 47  TCL_ERROR==Tcl_G
df90: 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
dfa0: 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 6e  erp, objv[3], &n
dfb0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54  ) ){.          T
dfc0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
dfd0: 20 69 6e 74 65 72 70 2c 20 22 63 61 6e 6e 6f 74   interp, "cannot
dfe0: 20 63 6f 6e 76 65 72 74 20 5c 22 22 2c 20 0a 20   convert \"", . 
dff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54 63                Tc
e000: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
e010: 62 6a 28 6f 62 6a 76 5b 33 5d 2c 30 29 2c 20 22  bj(objv[3],0), "
e020: 5c 22 20 74 6f 20 69 6e 74 65 67 65 72 22 2c 20  \" to integer", 
e030: 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  0);.          re
e040: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
e050: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
e060: 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 3c 30           if( n<0
e070: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
e080: 66 6c 75 73 68 53 74 6d 74 43 61 63 68 65 28 20  flushStmtCache( 
e090: 70 44 62 20 29 3b 0a 20 20 20 20 20 20 20 20 20  pDb );.         
e0a0: 20 20 20 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20     n = 0;.      
e0b0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3e      }else if( n>
e0c0: 4d 41 58 5f 50 52 45 50 41 52 45 44 5f 53 54 4d  MAX_PREPARED_STM
e0d0: 54 53 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  TS ){.          
e0e0: 20 20 6e 20 3d 20 4d 41 58 5f 50 52 45 50 41 52    n = MAX_PREPAR
e0f0: 45 44 5f 53 54 4d 54 53 3b 0a 20 20 20 20 20 20  ED_STMTS;.      
e100: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
e110: 70 44 62 2d 3e 6d 61 78 53 74 6d 74 20 3d 20 6e  pDb->maxStmt = n
e120: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
e130: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
e140: 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
e150: 65 73 75 6c 74 28 20 69 6e 74 65 72 70 2c 20 22  esult( interp, "
e160: 62 61 64 20 6f 70 74 69 6f 6e 20 5c 22 22 2c 20  bad option \"", 
e170: 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 47  .          Tcl_G
e180: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
e190: 6f 62 6a 76 5b 32 5d 2c 30 29 2c 20 22 5c 22 3a  objv[2],0), "\":
e1a0: 20 6d 75 73 74 20 62 65 20 66 6c 75 73 68 20 6f   must be flush o
e1b0: 72 20 73 69 7a 65 22 2c 20 30 29 3b 0a 20 20 20  r size", 0);.   
e1c0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
e1d0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62  ROR;.    }.    b
e1e0: 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  reak;.  }..  /* 
e1f0: 20 20 20 20 24 64 62 20 63 68 61 6e 67 65 73 0a      $db changes.
e200: 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e    **.  ** Return
e210: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
e220: 6f 77 73 20 74 68 61 74 20 77 65 72 65 20 6d 6f  ows that were mo
e230: 64 69 66 69 65 64 2c 20 69 6e 73 65 72 74 65 64  dified, inserted
e240: 2c 20 6f 72 20 64 65 6c 65 74 65 64 20 62 79 0a  , or deleted by.
e250: 20 20 2a 2a 20 74 68 65 20 6d 6f 73 74 20 72 65    ** the most re
e260: 63 65 6e 74 20 49 4e 53 45 52 54 2c 20 55 50 44  cent INSERT, UPD
e270: 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20 73 74  ATE or DELETE st
e280: 61 74 65 6d 65 6e 74 2c 20 6e 6f 74 20 69 6e 63  atement, not inc
e290: 6c 75 64 69 6e 67 20 0a 20 20 2a 2a 20 61 6e 79  luding .  ** any
e2a0: 20 63 68 61 6e 67 65 73 20 6d 61 64 65 20 62 79   changes made by
e2b0: 20 74 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d   trigger program
e2c0: 73 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  s..  */.  case D
e2d0: 42 5f 43 48 41 4e 47 45 53 3a 20 7b 0a 20 20 20  B_CHANGES: {.   
e2e0: 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 73 75 6c   Tcl_Obj *pResul
e2f0: 74 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21  t;.    if( objc!
e300: 3d 32 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  =2 ){.      Tcl_
e310: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
e320: 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 22  erp, 2, objv, ""
e330: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
e340: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
e350: 0a 20 20 20 20 70 52 65 73 75 6c 74 20 3d 20 54  .    pResult = T
e360: 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_GetObjResult(
e370: 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c  interp);.    Tcl
e380: 5f 53 65 74 49 6e 74 4f 62 6a 28 70 52 65 73 75  _SetIntObj(pResu
e390: 6c 74 2c 20 73 71 6c 69 74 65 33 5f 63 68 61 6e  lt, sqlite3_chan
e3a0: 67 65 73 28 70 44 62 2d 3e 64 62 29 29 3b 0a 20  ges(pDb->db));. 
e3b0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
e3c0: 20 2f 2a 20 20 20 20 24 64 62 20 63 6c 6f 73 65   /*    $db close
e3d0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 68 75 74 64  .  **.  ** Shutd
e3e0: 6f 77 6e 20 74 68 65 20 64 61 74 61 62 61 73 65  own the database
e3f0: 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f  .  */.  case DB_
e400: 43 4c 4f 53 45 3a 20 7b 0a 20 20 20 20 54 63 6c  CLOSE: {.    Tcl
e410: 5f 44 65 6c 65 74 65 43 6f 6d 6d 61 6e 64 28 69  _DeleteCommand(i
e420: 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
e430: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
e440: 5b 30 5d 2c 20 30 29 29 3b 0a 20 20 20 20 62 72  [0], 0));.    br
e450: 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  eak;.  }..  /*. 
e460: 20 2a 2a 20 20 20 20 20 24 64 62 20 63 6f 6c 6c   **     $db coll
e470: 61 74 65 20 4e 41 4d 45 20 53 43 52 49 50 54 0a  ate NAME SCRIPT.
e480: 20 20 2a 2a 0a 20 20 2a 2a 20 43 72 65 61 74 65    **.  ** Create
e490: 20 61 20 6e 65 77 20 53 51 4c 20 63 6f 6c 6c 61   a new SQL colla
e4a0: 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 63 61  tion function ca
e4b0: 6c 6c 65 64 20 4e 41 4d 45 2e 20 20 57 68 65 6e  lled NAME.  When
e4c0: 65 76 65 72 0a 20 20 2a 2a 20 74 68 61 74 20 66  ever.  ** that f
e4d0: 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
e4e0: 64 2c 20 69 6e 76 6f 6b 65 20 53 43 52 49 50 54  d, invoke SCRIPT
e4f0: 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65   to evaluate the
e500: 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a   function..  */.
e510: 20 20 63 61 73 65 20 44 42 5f 43 4f 4c 4c 41 54    case DB_COLLAT
e520: 45 3a 20 7b 0a 20 20 20 20 53 71 6c 43 6f 6c 6c  E: {.    SqlColl
e530: 61 74 65 20 2a 70 43 6f 6c 6c 61 74 65 3b 0a 20  ate *pCollate;. 
e540: 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a     char *zName;.
e550: 20 20 20 20 63 68 61 72 20 2a 7a 53 63 72 69 70      char *zScrip
e560: 74 3b 0a 20 20 20 20 69 6e 74 20 6e 53 63 72 69  t;.    int nScri
e570: 70 74 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63  pt;.    if( objc
e580: 21 3d 34 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  !=4 ){.      Tcl
e590: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
e5a0: 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22  terp, 2, objv, "
e5b0: 4e 41 4d 45 20 53 43 52 49 50 54 22 29 3b 0a 20  NAME SCRIPT");. 
e5c0: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
e5d0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
e5e0: 20 7a 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74   zName = Tcl_Get
e5f0: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
e600: 6a 76 5b 32 5d 2c 20 30 29 3b 0a 20 20 20 20 7a  jv[2], 0);.    z
e610: 53 63 72 69 70 74 20 3d 20 54 63 6c 5f 47 65 74  Script = Tcl_Get
e620: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
e630: 6a 76 5b 33 5d 2c 20 26 6e 53 63 72 69 70 74 29  jv[3], &nScript)
e640: 3b 0a 20 20 20 20 70 43 6f 6c 6c 61 74 65 20 3d  ;.    pCollate =
e650: 20 28 53 71 6c 43 6f 6c 6c 61 74 65 2a 29 54 63   (SqlCollate*)Tc
e660: 6c 5f 41 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  l_Alloc( sizeof(
e670: 2a 70 43 6f 6c 6c 61 74 65 29 20 2b 20 6e 53 63  *pCollate) + nSc
e680: 72 69 70 74 20 2b 20 31 20 29 3b 0a 20 20 20 20  ript + 1 );.    
e690: 69 66 28 20 70 43 6f 6c 6c 61 74 65 3d 3d 30 20  if( pCollate==0 
e6a0: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
e6b0: 4f 52 3b 0a 20 20 20 20 70 43 6f 6c 6c 61 74 65  OR;.    pCollate
e6c0: 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72  ->interp = inter
e6d0: 70 3b 0a 20 20 20 20 70 43 6f 6c 6c 61 74 65 2d  p;.    pCollate-
e6e0: 3e 70 4e 65 78 74 20 3d 20 70 44 62 2d 3e 70 43  >pNext = pDb->pC
e6f0: 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 70 43 6f 6c  ollate;.    pCol
e700: 6c 61 74 65 2d 3e 7a 53 63 72 69 70 74 20 3d 20  late->zScript = 
e710: 28 63 68 61 72 2a 29 26 70 43 6f 6c 6c 61 74 65  (char*)&pCollate
e720: 5b 31 5d 3b 0a 20 20 20 20 70 44 62 2d 3e 70 43  [1];.    pDb->pC
e730: 6f 6c 6c 61 74 65 20 3d 20 70 43 6f 6c 6c 61 74  ollate = pCollat
e740: 65 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 43  e;.    memcpy(pC
e750: 6f 6c 6c 61 74 65 2d 3e 7a 53 63 72 69 70 74 2c  ollate->zScript,
e760: 20 7a 53 63 72 69 70 74 2c 20 6e 53 63 72 69 70   zScript, nScrip
e770: 74 2b 31 29 3b 0a 20 20 20 20 69 66 28 20 73 71  t+1);.    if( sq
e780: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c  lite3_create_col
e790: 6c 61 74 69 6f 6e 28 70 44 62 2d 3e 64 62 2c 20  lation(pDb->db, 
e7a0: 7a 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 55 54  zName, SQLITE_UT
e7b0: 46 38 2c 20 0a 20 20 20 20 20 20 20 20 70 43 6f  F8, .        pCo
e7c0: 6c 6c 61 74 65 2c 20 74 63 6c 53 71 6c 43 6f 6c  llate, tclSqlCol
e7d0: 6c 61 74 65 29 20 29 7b 0a 20 20 20 20 20 20 54  late) ){.      T
e7e0: 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
e7f0: 65 72 70 2c 20 28 63 68 61 72 20 2a 29 73 71 6c  erp, (char *)sql
e800: 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d  ite3_errmsg(pDb-
e810: 3e 64 62 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49  >db), TCL_VOLATI
e820: 4c 45 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  LE);.      retur
e830: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
e840: 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20   }.    break;.  
e850: 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20  }..  /*.  **    
e860: 20 24 64 62 20 63 6f 6c 6c 61 74 69 6f 6e 5f 6e   $db collation_n
e870: 65 65 64 65 64 20 53 43 52 49 50 54 0a 20 20 2a  eeded SCRIPT.  *
e880: 2a 0a 20 20 2a 2a 20 43 72 65 61 74 65 20 61 20  *.  ** Create a 
e890: 6e 65 77 20 53 51 4c 20 63 6f 6c 6c 61 74 69 6f  new SQL collatio
e8a0: 6e 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65  n function calle
e8b0: 64 20 4e 41 4d 45 2e 20 20 57 68 65 6e 65 76 65  d NAME.  Wheneve
e8c0: 72 0a 20 20 2a 2a 20 74 68 61 74 20 66 75 6e 63  r.  ** that func
e8d0: 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20  tion is called, 
e8e0: 69 6e 76 6f 6b 65 20 53 43 52 49 50 54 20 74 6f  invoke SCRIPT to
e8f0: 20 65 76 61 6c 75 61 74 65 20 74 68 65 20 66 75   evaluate the fu
e900: 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 63  nction..  */.  c
e910: 61 73 65 20 44 42 5f 43 4f 4c 4c 41 54 49 4f 4e  ase DB_COLLATION
e920: 5f 4e 45 45 44 45 44 3a 20 7b 0a 20 20 20 20 69  _NEEDED: {.    i
e930: 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20  f( objc!=3 ){.  
e940: 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
e950: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20  Args(interp, 2, 
e960: 6f 62 6a 76 2c 20 22 53 43 52 49 50 54 22 29 3b  objv, "SCRIPT");
e970: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
e980: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
e990: 20 20 20 69 66 28 20 70 44 62 2d 3e 70 43 6f 6c     if( pDb->pCol
e9a0: 6c 61 74 65 4e 65 65 64 65 64 20 29 7b 0a 20 20  lateNeeded ){.  
e9b0: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
e9c0: 6f 75 6e 74 28 70 44 62 2d 3e 70 43 6f 6c 6c 61  ount(pDb->pColla
e9d0: 74 65 4e 65 65 64 65 64 29 3b 0a 20 20 20 20 7d  teNeeded);.    }
e9e0: 0a 20 20 20 20 70 44 62 2d 3e 70 43 6f 6c 6c 61  .    pDb->pColla
e9f0: 74 65 4e 65 65 64 65 64 20 3d 20 54 63 6c 5f 44  teNeeded = Tcl_D
ea00: 75 70 6c 69 63 61 74 65 4f 62 6a 28 6f 62 6a 76  uplicateObj(objv
ea10: 5b 32 5d 29 3b 0a 20 20 20 20 54 63 6c 5f 49 6e  [2]);.    Tcl_In
ea20: 63 72 52 65 66 43 6f 75 6e 74 28 70 44 62 2d 3e  crRefCount(pDb->
ea30: 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64 29 3b  pCollateNeeded);
ea40: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c  .    sqlite3_col
ea50: 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64 28 70 44  lation_needed(pD
ea60: 62 2d 3e 64 62 2c 20 70 44 62 2c 20 74 63 6c 43  b->db, pDb, tclC
ea70: 6f 6c 6c 61 74 65 4e 65 65 64 65 64 29 3b 0a 20  ollateNeeded);. 
ea80: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
ea90: 20 2f 2a 20 20 20 20 24 64 62 20 63 6f 6d 6d 69   /*    $db commi
eaa0: 74 5f 68 6f 6f 6b 20 3f 43 41 4c 4c 42 41 43 4b  t_hook ?CALLBACK
eab0: 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 76 6f  ?.  **.  ** Invo
eac0: 6b 65 20 74 68 65 20 67 69 76 65 6e 20 63 61 6c  ke the given cal
ead0: 6c 62 61 63 6b 20 6a 75 73 74 20 62 65 66 6f 72  lback just befor
eae0: 65 20 63 6f 6d 6d 69 74 74 69 6e 67 20 65 76 65  e committing eve
eaf0: 72 79 20 53 51 4c 20 74 72 61 6e 73 61 63 74 69  ry SQL transacti
eb00: 6f 6e 2e 0a 20 20 2a 2a 20 49 66 20 74 68 65 20  on..  ** If the 
eb10: 63 61 6c 6c 62 61 63 6b 20 74 68 72 6f 77 73 20  callback throws 
eb20: 61 6e 20 65 78 63 65 70 74 69 6f 6e 20 6f 72 20  an exception or 
eb30: 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f  returns non-zero
eb40: 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20  , then the.  ** 
eb50: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
eb60: 62 6f 72 74 65 64 2e 20 20 49 66 20 43 41 4c 4c  borted.  If CALL
eb70: 42 41 43 4b 20 69 73 20 61 6e 20 65 6d 70 74 79  BACK is an empty
eb80: 20 73 74 72 69 6e 67 2c 20 74 68 65 20 63 61 6c   string, the cal
eb90: 6c 62 61 63 6b 0a 20 20 2a 2a 20 69 73 20 64 69  lback.  ** is di
eba0: 73 61 62 6c 65 64 2e 0a 20 20 2a 2f 0a 20 20 63  sabled..  */.  c
ebb0: 61 73 65 20 44 42 5f 43 4f 4d 4d 49 54 5f 48 4f  ase DB_COMMIT_HO
ebc0: 4f 4b 3a 20 7b 0a 20 20 20 20 69 66 28 20 6f 62  OK: {.    if( ob
ebd0: 6a 63 3e 33 20 29 7b 0a 20 20 20 20 20 20 54 63  jc>3 ){.      Tc
ebe0: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
ebf0: 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
ec00: 22 3f 43 41 4c 4c 42 41 43 4b 3f 22 29 3b 0a 20  "?CALLBACK?");. 
ec10: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
ec20: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73 65  ERROR;.    }else
ec30: 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a   if( objc==2 ){.
ec40: 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a        if( pDb->z
ec50: 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 20 20  Commit ){.      
ec60: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
ec70: 6c 74 28 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e  lt(interp, pDb->
ec80: 7a 43 6f 6d 6d 69 74 2c 20 30 29 3b 0a 20 20 20  zCommit, 0);.   
ec90: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
eca0: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6d        char *zCom
ecb0: 6d 69 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 6c  mit;.      int l
ecc0: 65 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44  en;.      if( pD
ecd0: 62 2d 3e 7a 43 6f 6d 6d 69 74 20 29 7b 0a 20 20  b->zCommit ){.  
ece0: 20 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70        Tcl_Free(p
ecf0: 44 62 2d 3e 7a 43 6f 6d 6d 69 74 29 3b 0a 20 20  Db->zCommit);.  
ed00: 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 43 6f 6d      }.      zCom
ed10: 6d 69 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  mit = Tcl_GetStr
ed20: 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
ed30: 32 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20  2], &len);.     
ed40: 20 69 66 28 20 7a 43 6f 6d 6d 69 74 20 26 26 20   if( zCommit && 
ed50: 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  len>0 ){.       
ed60: 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 20 3d 20   pDb->zCommit = 
ed70: 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b  Tcl_Alloc( len +
ed80: 20 31 20 29 3b 0a 20 20 20 20 20 20 20 20 6d 65   1 );.        me
ed90: 6d 63 70 79 28 70 44 62 2d 3e 7a 43 6f 6d 6d 69  mcpy(pDb->zCommi
eda0: 74 2c 20 7a 43 6f 6d 6d 69 74 2c 20 6c 65 6e 2b  t, zCommit, len+
edb0: 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  1);.      }else{
edc0: 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 43  .        pDb->zC
edd0: 6f 6d 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20  ommit = 0;.     
ede0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 44 62   }.      if( pDb
edf0: 2d 3e 7a 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20  ->zCommit ){.   
ee00: 20 20 20 20 20 70 44 62 2d 3e 69 6e 74 65 72 70       pDb->interp
ee10: 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 20   = interp;.     
ee20: 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6d 6d 69     sqlite3_commi
ee30: 74 5f 68 6f 6f 6b 28 70 44 62 2d 3e 64 62 2c 20  t_hook(pDb->db, 
ee40: 44 62 43 6f 6d 6d 69 74 48 61 6e 64 6c 65 72 2c  DbCommitHandler,
ee50: 20 70 44 62 29 3b 0a 20 20 20 20 20 20 7d 65 6c   pDb);.      }el
ee60: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
ee70: 74 65 33 5f 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 28  te3_commit_hook(
ee80: 70 44 62 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a  pDb->db, 0, 0);.
ee90: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
eea0: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
eeb0: 2f 2a 20 20 20 20 24 64 62 20 63 6f 6d 70 6c 65  /*    $db comple
eec0: 74 65 20 53 51 4c 0a 20 20 2a 2a 0a 20 20 2a 2a  te SQL.  **.  **
eed0: 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
eee0: 53 51 4c 20 69 73 20 61 20 63 6f 6d 70 6c 65 74  SQL is a complet
eef0: 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e  e SQL statement.
ef00: 20 20 52 65 74 75 72 6e 20 46 41 4c 53 45 20 69    Return FALSE i
ef10: 66 0a 20 20 2a 2a 20 61 64 64 69 74 69 6f 6e 61  f.  ** additiona
ef20: 6c 20 6c 69 6e 65 73 20 6f 66 20 69 6e 70 75 74  l lines of input
ef30: 20 61 72 65 20 6e 65 65 64 65 64 2e 20 20 54 68   are needed.  Th
ef40: 69 73 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f  is is similar to
ef50: 20 74 68 65 0a 20 20 2a 2a 20 62 75 69 6c 74 2d   the.  ** built-
ef60: 69 6e 20 22 69 6e 66 6f 20 63 6f 6d 70 6c 65 74  in "info complet
ef70: 65 22 20 63 6f 6d 6d 61 6e 64 20 6f 66 20 54 63  e" command of Tc
ef80: 6c 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  l..  */.  case D
ef90: 42 5f 43 4f 4d 50 4c 45 54 45 3a 20 7b 0a 23 69  B_COMPLETE: {.#i
efa0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
efb0: 54 5f 43 4f 4d 50 4c 45 54 45 0a 20 20 20 20 54  T_COMPLETE.    T
efc0: 63 6c 5f 4f 62 6a 20 2a 70 52 65 73 75 6c 74 3b  cl_Obj *pResult;
efd0: 0a 20 20 20 20 69 6e 74 20 69 73 43 6f 6d 70 6c  .    int isCompl
efe0: 65 74 65 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a  ete;.    if( obj
eff0: 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 54 63  c!=3 ){.      Tc
f000: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
f010: 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
f020: 22 53 51 4c 22 29 3b 0a 20 20 20 20 20 20 72 65  "SQL");.      re
f030: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
f040: 20 20 20 20 7d 0a 20 20 20 20 69 73 43 6f 6d 70      }.    isComp
f050: 6c 65 74 65 20 3d 20 73 71 6c 69 74 65 33 5f 63  lete = sqlite3_c
f060: 6f 6d 70 6c 65 74 65 28 20 54 63 6c 5f 47 65 74  omplete( Tcl_Get
f070: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
f080: 6a 76 5b 32 5d 2c 20 30 29 20 29 3b 0a 20 20 20  jv[2], 0) );.   
f090: 20 70 52 65 73 75 6c 74 20 3d 20 54 63 6c 5f 47   pResult = Tcl_G
f0a0: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
f0b0: 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74  rp);.    Tcl_Set
f0c0: 42 6f 6f 6c 65 61 6e 4f 62 6a 28 70 52 65 73 75  BooleanObj(pResu
f0d0: 6c 74 2c 20 69 73 43 6f 6d 70 6c 65 74 65 29 3b  lt, isComplete);
f0e0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 62 72 65 61  .#endif.    brea
f0f0: 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20  k;.  }..  /*    
f100: 24 64 62 20 63 6f 70 79 20 63 6f 6e 66 6c 69 63  $db copy conflic
f110: 74 2d 61 6c 67 6f 72 69 74 68 6d 20 74 61 62 6c  t-algorithm tabl
f120: 65 20 66 69 6c 65 6e 61 6d 65 20 3f 53 45 50 41  e filename ?SEPA
f130: 52 41 54 4f 52 3f 20 3f 4e 55 4c 4c 49 4e 44 49  RATOR? ?NULLINDI
f140: 43 41 54 4f 52 3f 0a 20 20 2a 2a 0a 20 20 2a 2a  CATOR?.  **.  **
f150: 20 43 6f 70 79 20 64 61 74 61 20 69 6e 74 6f 20   Copy data into 
f160: 74 61 62 6c 65 20 66 72 6f 6d 20 66 69 6c 65 6e  table from filen
f170: 61 6d 65 2c 20 6f 70 74 69 6f 6e 61 6c 6c 79 20  ame, optionally 
f180: 75 73 69 6e 67 20 53 45 50 41 52 41 54 4f 52 0a  using SEPARATOR.
f190: 20 20 2a 2a 20 61 73 20 63 6f 6c 75 6d 6e 20 73    ** as column s
f1a0: 65 70 61 72 61 74 6f 72 73 2e 20 20 49 66 20 61  eparators.  If a
f1b0: 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 73   column contains
f1c0: 20 61 20 6e 75 6c 6c 20 73 74 72 69 6e 67 2c 20   a null string, 
f1d0: 6f 72 20 74 68 65 0a 20 20 2a 2a 20 76 61 6c 75  or the.  ** valu
f1e0: 65 20 6f 66 20 4e 55 4c 4c 49 4e 44 49 43 41 54  e of NULLINDICAT
f1f0: 4f 52 2c 20 61 20 4e 55 4c 4c 20 69 73 20 69 6e  OR, a NULL is in
f200: 73 65 72 74 65 64 20 66 6f 72 20 74 68 65 20 63  serted for the c
f210: 6f 6c 75 6d 6e 2e 0a 20 20 2a 2a 20 63 6f 6e 66  olumn..  ** conf
f220: 6c 69 63 74 2d 61 6c 67 6f 72 69 74 68 6d 20 69  lict-algorithm i
f230: 73 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 71 6c  s one of the sql
f240: 69 74 65 20 63 6f 6e 66 6c 69 63 74 20 61 6c 67  ite conflict alg
f250: 6f 72 69 74 68 6d 73 3a 0a 20 20 2a 2a 20 20 20  orithms:.  **   
f260: 20 72 6f 6c 6c 62 61 63 6b 2c 20 61 62 6f 72 74   rollback, abort
f270: 2c 20 66 61 69 6c 2c 20 69 67 6e 6f 72 65 2c 20  , fail, ignore, 
f280: 72 65 70 6c 61 63 65 0a 20 20 2a 2a 20 4f 6e 20  replace.  ** On 
f290: 73 75 63 63 65 73 73 2c 20 72 65 74 75 72 6e 20  success, return 
f2a0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6c 69  the number of li
f2b0: 6e 65 73 20 70 72 6f 63 65 73 73 65 64 2c 20 6e  nes processed, n
f2c0: 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 73  ot necessarily s
f2d0: 61 6d 65 0a 20 20 2a 2a 20 61 73 20 27 64 62 20  ame.  ** as 'db 
f2e0: 63 68 61 6e 67 65 73 27 20 64 75 65 20 74 6f 20  changes' due to 
f2f0: 63 6f 6e 66 6c 69 63 74 2d 61 6c 67 6f 72 69 74  conflict-algorit
f300: 68 6d 20 73 65 6c 65 63 74 65 64 2e 0a 20 20 2a  hm selected..  *
f310: 2a 0a 20 20 2a 2a 20 54 68 69 73 20 63 6f 64 65  *.  ** This code
f320: 20 69 73 20 62 61 73 69 63 61 6c 6c 79 20 61 6e   is basically an
f330: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2f   implementation/
f340: 65 6e 68 61 6e 63 65 6d 65 6e 74 20 6f 66 0a 20  enhancement of. 
f350: 20 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 33 20   ** the sqlite3 
f360: 73 68 65 6c 6c 2e 63 20 22 2e 69 6d 70 6f 72 74  shell.c ".import
f370: 22 20 63 6f 6d 6d 61 6e 64 2e 0a 20 20 2a 2a 0a  " command..  **.
f380: 20 20 2a 2a 20 54 68 69 73 20 63 6f 6d 6d 61 6e    ** This comman
f390: 64 20 75 73 61 67 65 20 69 73 20 65 71 75 69 76  d usage is equiv
f3a0: 61 6c 65 6e 74 20 74 6f 20 74 68 65 20 73 71 6c  alent to the sql
f3b0: 69 74 65 32 2e 78 20 43 4f 50 59 20 73 74 61 74  ite2.x COPY stat
f3c0: 65 6d 65 6e 74 2c 0a 20 20 2a 2a 20 77 68 69 63  ement,.  ** whic
f3d0: 68 20 69 6d 70 6f 72 74 73 20 66 69 6c 65 20 64  h imports file d
f3e0: 61 74 61 20 69 6e 74 6f 20 61 20 74 61 62 6c 65  ata into a table
f3f0: 20 75 73 69 6e 67 20 74 68 65 20 50 6f 73 74 67   using the Postg
f400: 72 65 53 51 4c 20 43 4f 50 59 20 66 69 6c 65 20  reSQL COPY file 
f410: 66 6f 72 6d 61 74 3a 0a 20 20 2a 2a 20 20 20 24  format:.  **   $
f420: 64 62 20 63 6f 70 79 20 24 63 6f 6e 66 6c 69 74  db copy $conflit
f430: 5f 61 6c 67 6f 20 24 74 61 62 6c 65 5f 6e 61 6d  _algo $table_nam
f440: 65 20 24 66 69 6c 65 6e 61 6d 65 20 5c 74 20 5c  e $filename \t \
f450: 5c 4e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  \N.  */.  case D
f460: 42 5f 43 4f 50 59 3a 20 7b 0a 20 20 20 20 63 68  B_COPY: {.    ch
f470: 61 72 20 2a 7a 54 61 62 6c 65 3b 20 20 20 20 20  ar *zTable;     
f480: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 73            /* Ins
f490: 65 72 74 20 64 61 74 61 20 69 6e 74 6f 20 74 68  ert data into th
f4a0: 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  is table */.    
f4b0: 63 68 61 72 20 2a 7a 46 69 6c 65 3b 20 20 20 20  char *zFile;    
f4c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
f4d0: 68 65 20 66 69 6c 65 20 66 72 6f 6d 20 77 68 69  he file from whi
f4e0: 63 68 20 74 6f 20 65 78 74 72 61 63 74 20 64 61  ch to extract da
f4f0: 74 61 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a  ta */.    char *
f500: 7a 43 6f 6e 66 6c 69 63 74 3b 20 20 20 20 20 20  zConflict;      
f510: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e        /* The con
f520: 66 6c 69 63 74 20 61 6c 67 6f 72 69 74 68 6d 20  flict algorithm 
f530: 74 6f 20 75 73 65 20 2a 2f 0a 20 20 20 20 73 71  to use */.    sq
f540: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
f550: 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73  t;        /* A s
f560: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20  tatement */.    
f570: 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20  int nCol;       
f580: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
f590: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
f5a0: 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f   in the table */
f5b0: 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65 3b 20  .    int nByte; 
f5c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f5d0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
f5e0: 74 65 73 20 69 6e 20 61 6e 20 53 51 4c 20 73 74  tes in an SQL st
f5f0: 72 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ring */.    int 
f600: 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20  i, j;           
f610: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
f620: 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 20 20  counters */.    
f630: 69 6e 74 20 6e 53 65 70 3b 20 20 20 20 20 20 20  int nSep;       
f640: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
f650: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
f660: 6e 20 7a 53 65 70 5b 5d 20 2a 2f 0a 20 20 20 20  n zSep[] */.    
f670: 69 6e 74 20 6e 4e 75 6c 6c 3b 20 20 20 20 20 20  int nNull;      
f680: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
f690: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
f6a0: 6e 20 7a 4e 75 6c 6c 5b 5d 20 2a 2f 0a 20 20 20  n zNull[] */.   
f6b0: 20 63 68 61 72 20 2a 7a 53 71 6c 3b 20 20 20 20   char *zSql;    
f6c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f6d0: 41 6e 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  An SQL statement
f6e0: 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 4c   */.    char *zL
f6f0: 69 6e 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ine;            
f700: 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20      /* A single 
f710: 6c 69 6e 65 20 6f 66 20 69 6e 70 75 74 20 66 72  line of input fr
f720: 6f 6d 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20  om the file */. 
f730: 20 20 20 63 68 61 72 20 2a 2a 61 7a 43 6f 6c 3b     char **azCol;
f740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f750: 2a 20 7a 4c 69 6e 65 5b 5d 20 62 72 6f 6b 65 6e  * zLine[] broken
f760: 20 75 70 20 69 6e 74 6f 20 63 6f 6c 75 6d 6e 73   up into columns
f770: 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 43   */.    char *zC
f780: 6f 6d 6d 69 74 3b 20 20 20 20 20 20 20 20 20 20  ommit;          
f790: 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20 63 6f      /* How to co
f7a0: 6d 6d 69 74 20 63 68 61 6e 67 65 73 20 2a 2f 0a  mmit changes */.
f7b0: 20 20 20 20 46 49 4c 45 20 2a 69 6e 3b 20 20 20      FILE *in;   
f7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f7d0: 2f 2a 20 54 68 65 20 69 6e 70 75 74 20 66 69 6c  /* The input fil
f7e0: 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6c 69 6e  e */.    int lin
f7f0: 65 6e 6f 20 3d 20 30 3b 20 20 20 20 20 20 20 20  eno = 0;        
f800: 20 20 20 20 20 2f 2a 20 4c 69 6e 65 20 6e 75 6d       /* Line num
f810: 62 65 72 20 6f 66 20 69 6e 70 75 74 20 66 69 6c  ber of input fil
f820: 65 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 7a 4c  e */.    char zL
f830: 69 6e 65 4e 75 6d 5b 38 30 5d 3b 20 20 20 20 20  ineNum[80];     
f840: 20 20 20 20 20 2f 2a 20 4c 69 6e 65 20 6e 75 6d       /* Line num
f850: 62 65 72 20 70 72 69 6e 74 20 62 75 66 66 65 72  ber print buffer
f860: 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20   */.    Tcl_Obj 
f870: 2a 70 52 65 73 75 6c 74 3b 20 20 20 20 20 20 20  *pResult;       
f880: 20 20 20 20 2f 2a 20 69 6e 74 65 72 70 20 72 65      /* interp re
f890: 73 75 6c 74 20 2a 2f 0a 0a 20 20 20 20 63 68 61  sult */..    cha
f8a0: 72 20 2a 7a 53 65 70 3b 0a 20 20 20 20 63 68 61  r *zSep;.    cha
f8b0: 72 20 2a 7a 4e 75 6c 6c 3b 0a 20 20 20 20 69 66  r *zNull;.    if
f8c0: 28 20 6f 62 6a 63 3c 35 20 7c 7c 20 6f 62 6a 63  ( objc<5 || objc
f8d0: 3e 37 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  >7 ){.      Tcl_
f8e0: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
f8f0: 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 0a 20  erp, 2, objv, . 
f900: 20 20 20 20 20 20 20 20 22 43 4f 4e 46 4c 49 43          "CONFLIC
f910: 54 2d 41 4c 47 4f 52 49 54 48 4d 20 54 41 42 4c  T-ALGORITHM TABL
f920: 45 20 46 49 4c 45 4e 41 4d 45 20 3f 53 45 50 41  E FILENAME ?SEPA
f930: 52 41 54 4f 52 3f 20 3f 4e 55 4c 4c 49 4e 44 49  RATOR? ?NULLINDI
f940: 43 41 54 4f 52 3f 22 29 3b 0a 20 20 20 20 20 20  CATOR?");.      
f950: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
f960: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
f970: 6f 62 6a 63 3e 3d 36 20 29 7b 0a 20 20 20 20 20  objc>=6 ){.     
f980: 20 7a 53 65 70 20 3d 20 54 63 6c 5f 47 65 74 53   zSep = Tcl_GetS
f990: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
f9a0: 76 5b 35 5d 2c 20 30 29 3b 0a 20 20 20 20 7d 65  v[5], 0);.    }e
f9b0: 6c 73 65 7b 0a 20 20 20 20 20 20 7a 53 65 70 20  lse{.      zSep 
f9c0: 3d 20 22 5c 74 22 3b 0a 20 20 20 20 7d 0a 20 20  = "\t";.    }.  
f9d0: 20 20 69 66 28 20 6f 62 6a 63 3e 3d 37 20 29 7b    if( objc>=7 ){
f9e0: 0a 20 20 20 20 20 20 7a 4e 75 6c 6c 20 3d 20 54  .      zNull = T
f9f0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
fa00: 4f 62 6a 28 6f 62 6a 76 5b 36 5d 2c 20 30 29 3b  Obj(objv[6], 0);
fa10: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
fa20: 20 20 7a 4e 75 6c 6c 20 3d 20 22 22 3b 0a 20 20    zNull = "";.  
fa30: 20 20 7d 0a 20 20 20 20 7a 43 6f 6e 66 6c 69 63    }.    zConflic
fa40: 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  t = Tcl_GetStrin
fa50: 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d  gFromObj(objv[2]
fa60: 2c 20 30 29 3b 0a 20 20 20 20 7a 54 61 62 6c 65  , 0);.    zTable
fa70: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
fa80: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d 2c  FromObj(objv[3],
fa90: 20 30 29 3b 0a 20 20 20 20 7a 46 69 6c 65 20 3d   0);.    zFile =
faa0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
fab0: 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 34 5d 2c 20 30  omObj(objv[4], 0
fac0: 29 3b 0a 20 20 20 20 6e 53 65 70 20 3d 20 73 74  );.    nSep = st
fad0: 72 6c 65 6e 33 30 28 7a 53 65 70 29 3b 0a 20 20  rlen30(zSep);.  
fae0: 20 20 6e 4e 75 6c 6c 20 3d 20 73 74 72 6c 65 6e    nNull = strlen
faf0: 33 30 28 7a 4e 75 6c 6c 29 3b 0a 20 20 20 20 69  30(zNull);.    i
fb00: 66 28 20 6e 53 65 70 3d 3d 30 20 29 7b 0a 20 20  f( nSep==0 ){.  
fb10: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
fb20: 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 45 72 72  sult(interp,"Err
fb30: 6f 72 3a 20 6e 6f 6e 2d 6e 75 6c 6c 20 73 65 70  or: non-null sep
fb40: 61 72 61 74 6f 72 20 72 65 71 75 69 72 65 64 20  arator required 
fb50: 66 6f 72 20 63 6f 70 79 22 2c 30 29 3b 0a 20 20  for copy",0);.  
fb60: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
fb70: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
fb80: 69 66 28 73 74 72 63 6d 70 28 7a 43 6f 6e 66 6c  if(strcmp(zConfl
fb90: 69 63 74 2c 20 22 72 6f 6c 6c 62 61 63 6b 22 29  ict, "rollback")
fba0: 20 21 3d 20 30 20 26 26 0a 20 20 20 20 20 20 20   != 0 &&.       
fbb0: 73 74 72 63 6d 70 28 7a 43 6f 6e 66 6c 69 63 74  strcmp(zConflict
fbc0: 2c 20 22 61 62 6f 72 74 22 20 20 20 29 20 21 3d  , "abort"   ) !=
fbd0: 20 30 20 26 26 0a 20 20 20 20 20 20 20 73 74 72   0 &&.       str
fbe0: 63 6d 70 28 7a 43 6f 6e 66 6c 69 63 74 2c 20 22  cmp(zConflict, "
fbf0: 66 61 69 6c 22 20 20 20 20 29 20 21 3d 20 30 20  fail"    ) != 0 
fc00: 26 26 0a 20 20 20 20 20 20 20 73 74 72 63 6d 70  &&.       strcmp
fc10: 28 7a 43 6f 6e 66 6c 69 63 74 2c 20 22 69 67 6e  (zConflict, "ign
fc20: 6f 72 65 22 20 20 29 20 21 3d 20 30 20 26 26 0a  ore"  ) != 0 &&.
fc30: 20 20 20 20 20 20 20 73 74 72 63 6d 70 28 7a 43         strcmp(zC
fc40: 6f 6e 66 6c 69 63 74 2c 20 22 72 65 70 6c 61 63  onflict, "replac
fc50: 65 22 20 29 20 21 3d 20 30 20 29 20 7b 0a 20 20  e" ) != 0 ) {.  
fc60: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
fc70: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 45 72  sult(interp, "Er
fc80: 72 6f 72 3a 20 5c 22 22 2c 20 7a 43 6f 6e 66 6c  ror: \"", zConfl
fc90: 69 63 74 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ict, .          
fca0: 20 20 22 5c 22 2c 20 63 6f 6e 66 6c 69 63 74 2d    "\", conflict-
fcb0: 61 6c 67 6f 72 69 74 68 6d 20 6d 75 73 74 20 62  algorithm must b
fcc0: 65 20 6f 6e 65 20 6f 66 3a 20 72 6f 6c 6c 62 61  e one of: rollba
fcd0: 63 6b 2c 20 22 0a 20 20 20 20 20 20 20 20 20 20  ck, ".          
fce0: 20 20 22 61 62 6f 72 74 2c 20 66 61 69 6c 2c 20    "abort, fail, 
fcf0: 69 67 6e 6f 72 65 2c 20 6f 72 20 72 65 70 6c 61  ignore, or repla
fd00: 63 65 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 72  ce", 0);.      r
fd10: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
fd20: 0a 20 20 20 20 7d 0a 20 20 20 20 7a 53 71 6c 20  .    }.    zSql 
fd30: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
fd40: 66 28 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  f("SELECT * FROM
fd50: 20 27 25 71 27 22 2c 20 7a 54 61 62 6c 65 29 3b   '%q'", zTable);
fd60: 0a 20 20 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30  .    if( zSql==0
fd70: 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70   ){.      Tcl_Ap
fd80: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
fd90: 70 2c 20 22 45 72 72 6f 72 3a 20 6e 6f 20 73 75  p, "Error: no su
fda0: 63 68 20 74 61 62 6c 65 3a 20 22 2c 20 7a 54 61  ch table: ", zTa
fdb0: 62 6c 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 72  ble, 0);.      r
fdc0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
fdd0: 0a 20 20 20 20 7d 0a 20 20 20 20 6e 42 79 74 65  .    }.    nByte
fde0: 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 53 71 6c   = strlen30(zSql
fdf0: 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
fe00: 74 65 33 5f 70 72 65 70 61 72 65 28 70 44 62 2d  te3_prepare(pDb-
fe10: 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26  >db, zSql, -1, &
fe20: 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 73  pStmt, 0);.    s
fe30: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c  qlite3_free(zSql
fe40: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  );.    if( rc ){
fe50: 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  .      Tcl_Appen
fe60: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
fe70: 22 45 72 72 6f 72 3a 20 22 2c 20 73 71 6c 69 74  "Error: ", sqlit
fe80: 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64  e3_errmsg(pDb->d
fe90: 62 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 6e 43  b), 0);.      nC
fea0: 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  ol = 0;.    }els
feb0: 65 7b 0a 20 20 20 20 20 20 6e 43 6f 6c 20 3d 20  e{.      nCol = 
fec0: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63  sqlite3_column_c
fed0: 6f 75 6e 74 28 70 53 74 6d 74 29 3b 0a 20 20 20  ount(pStmt);.   
fee0: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
fef0: 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a  inalize(pStmt);.
ff00: 20 20 20 20 69 66 28 20 6e 43 6f 6c 3d 3d 30 20      if( nCol==0 
ff10: 29 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ) {.      return
ff20: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
ff30: 7d 0a 20 20 20 20 7a 53 71 6c 20 3d 20 6d 61 6c  }.    zSql = mal
ff40: 6c 6f 63 28 20 6e 42 79 74 65 20 2b 20 35 30 20  loc( nByte + 50 
ff50: 2b 20 6e 43 6f 6c 2a 32 20 29 3b 0a 20 20 20 20  + nCol*2 );.    
ff60: 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29 20 7b 0a  if( zSql==0 ) {.
ff70: 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
ff80: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
ff90: 45 72 72 6f 72 3a 20 63 61 6e 27 74 20 6d 61 6c  Error: can't mal
ffa0: 6c 6f 63 28 29 22 2c 20 30 29 3b 0a 20 20 20 20  loc()", 0);.    
ffb0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
ffc0: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  OR;.    }.    sq
ffd0: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
ffe0: 42 79 74 65 2b 35 30 2c 20 7a 53 71 6c 2c 20 22  Byte+50, zSql, "
fff0: 49 4e 53 45 52 54 20 4f 52 20 25 71 20 49 4e 54  INSERT OR %q INT
10000 4f 20 27 25 71 27 20 56 41 4c 55 45 53 28 3f 22  O '%q' VALUES(?"
10010 2c 0a 20 20 20 20 20 20 20 20 20 7a 43 6f 6e 66  ,.         zConf
10020 6c 69 63 74 2c 20 7a 54 61 62 6c 65 29 3b 0a 20  lict, zTable);. 
10030 20 20 20 6a 20 3d 20 73 74 72 6c 65 6e 33 30 28     j = strlen30(
10040 7a 53 71 6c 29 3b 0a 20 20 20 20 66 6f 72 28 69  zSql);.    for(i
10050 3d 31 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29  =1; i<nCol; i++)
10060 7b 0a 20 20 20 20 20 20 7a 53 71 6c 5b 6a 2b 2b  {.      zSql[j++
10070 5d 20 3d 20 27 2c 27 3b 0a 20 20 20 20 20 20 7a  ] = ',';.      z
10080 53 71 6c 5b 6a 2b 2b 5d 20 3d 20 27 3f 27 3b 0a  Sql[j++] = '?';.
10090 20 20 20 20 7d 0a 20 20 20 20 7a 53 71 6c 5b 6a      }.    zSql[j
100a0 2b 2b 5d 20 3d 20 27 29 27 3b 0a 20 20 20 20 7a  ++] = ')';.    z
100b0 53 71 6c 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20  Sql[j] = 0;.    
100c0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
100d0 70 61 72 65 28 70 44 62 2d 3e 64 62 2c 20 7a 53  pare(pDb->db, zS
100e0 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20  ql, -1, &pStmt, 
100f0 30 29 3b 0a 20 20 20 20 66 72 65 65 28 7a 53 71  0);.    free(zSq
10100 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  l);.    if( rc )
10110 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65  {.      Tcl_Appe
10120 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
10130 20 22 45 72 72 6f 72 3a 20 22 2c 20 73 71 6c 69   "Error: ", sqli
10140 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e  te3_errmsg(pDb->
10150 64 62 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  db), 0);.      s
10160 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
10170 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 72 65  pStmt);.      re
10180 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
10190 20 20 20 20 7d 0a 20 20 20 20 69 6e 20 3d 20 66      }.    in = f
101a0 6f 70 65 6e 28 7a 46 69 6c 65 2c 20 22 72 62 22  open(zFile, "rb"
101b0 29 3b 0a 20 20 20 20 69 66 28 20 69 6e 3d 3d 30  );.    if( in==0
101c0 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70   ){.      Tcl_Ap
101d0 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
101e0 70 2c 20 22 45 72 72 6f 72 3a 20 63 61 6e 6e 6f  p, "Error: canno
101f0 74 20 6f 70 65 6e 20 66 69 6c 65 3a 20 22 2c 20  t open file: ", 
10200 7a 46 69 6c 65 2c 20 4e 55 4c 4c 29 3b 0a 20 20  zFile, NULL);.  
10210 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61      sqlite3_fina
10220 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20  lize(pStmt);.   
10230 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
10240 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  ROR;.    }.    a
10250 7a 43 6f 6c 20 3d 20 6d 61 6c 6c 6f 63 28 20 73  zCol = malloc( s
10260 69 7a 65 6f 66 28 61 7a 43 6f 6c 5b 30 5d 29 2a  izeof(azCol[0])*
10270 28 6e 43 6f 6c 2b 31 29 20 29 3b 0a 20 20 20 20  (nCol+1) );.    
10280 69 66 28 20 61 7a 43 6f 6c 3d 3d 30 20 29 20 7b  if( azCol==0 ) {
10290 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  .      Tcl_Appen
102a0 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
102b0 22 45 72 72 6f 72 3a 20 63 61 6e 27 74 20 6d 61  "Error: can't ma
102c0 6c 6c 6f 63 28 29 22 2c 20 30 29 3b 0a 20 20 20  lloc()", 0);.   
102d0 20 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20     fclose(in);. 
102e0 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
102f0 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
10300 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33 5f 65   (void)sqlite3_e
10310 78 65 63 28 70 44 62 2d 3e 64 62 2c 20 22 42 45  xec(pDb->db, "BE
10320 47 49 4e 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  GIN", 0, 0, 0);.
10330 20 20 20 20 7a 43 6f 6d 6d 69 74 20 3d 20 22 43      zCommit = "C
10340 4f 4d 4d 49 54 22 3b 0a 20 20 20 20 77 68 69 6c  OMMIT";.    whil
10350 65 28 20 28 7a 4c 69 6e 65 20 3d 20 6c 6f 63 61  e( (zLine = loca
10360 6c 5f 67 65 74 6c 69 6e 65 28 30 2c 20 69 6e 29  l_getline(0, in)
10370 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 68  )!=0 ){.      ch
10380 61 72 20 2a 7a 3b 0a 20 20 20 20 20 20 69 20 3d  ar *z;.      i =
10390 20 30 3b 0a 20 20 20 20 20 20 6c 69 6e 65 6e 6f   0;.      lineno
103a0 2b 2b 3b 0a 20 20 20 20 20 20 61 7a 43 6f 6c 5b  ++;.      azCol[
103b0 30 5d 20 3d 20 7a 4c 69 6e 65 3b 0a 20 20 20 20  0] = zLine;.    
103c0 20 20 66 6f 72 28 69 3d 30 2c 20 7a 3d 7a 4c 69    for(i=0, z=zLi
103d0 6e 65 3b 20 2a 7a 3b 20 7a 2b 2b 29 7b 0a 20 20  ne; *z; z++){.  
103e0 20 20 20 20 20 20 69 66 28 20 2a 7a 3d 3d 7a 53        if( *z==zS
103f0 65 70 5b 30 5d 20 26 26 20 73 74 72 6e 63 6d 70  ep[0] && strncmp
10400 28 7a 2c 20 7a 53 65 70 2c 20 6e 53 65 70 29 3d  (z, zSep, nSep)=
10410 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
10420 2a 7a 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  *z = 0;.        
10430 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20    i++;.         
10440 20 69 66 28 20 69 3c 6e 43 6f 6c 20 29 7b 0a 20   if( i<nCol ){. 
10450 20 20 20 20 20 20 20 20 20 20 20 61 7a 43 6f 6c             azCol
10460 5b 69 5d 20 3d 20 26 7a 5b 6e 53 65 70 5d 3b 0a  [i] = &z[nSep];.
10470 20 20 20 20 20 20 20 20 20 20 20 20 7a 20 2b 3d              z +=
10480 20 6e 53 65 70 2d 31 3b 0a 20 20 20 20 20 20 20   nSep-1;.       
10490 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
104a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
104b0 20 69 2b 31 21 3d 6e 43 6f 6c 20 29 7b 0a 20 20   i+1!=nCol ){.  
104c0 20 20 20 20 20 20 63 68 61 72 20 2a 7a 45 72 72        char *zErr
104d0 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 45  ;.        int nE
104e0 72 72 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 46  rr = strlen30(zF
104f0 69 6c 65 29 20 2b 20 32 30 30 3b 0a 20 20 20 20  ile) + 200;.    
10500 20 20 20 20 7a 45 72 72 20 3d 20 6d 61 6c 6c 6f      zErr = mallo
10510 63 28 6e 45 72 72 29 3b 0a 20 20 20 20 20 20 20  c(nErr);.       
10520 20 69 66 28 20 7a 45 72 72 20 29 7b 0a 20 20 20   if( zErr ){.   
10530 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
10540 6e 70 72 69 6e 74 66 28 6e 45 72 72 2c 20 7a 45  nprintf(nErr, zE
10550 72 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  rr,.            
10560 20 22 45 72 72 6f 72 3a 20 25 73 20 6c 69 6e 65   "Error: %s line
10570 20 25 64 3a 20 65 78 70 65 63 74 65 64 20 25 64   %d: expected %d
10580 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 64 61 74 61   columns of data
10590 20 62 75 74 20 66 6f 75 6e 64 20 25 64 22 2c 0a   but found %d",.
105a0 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 46 69               zFi
105b0 6c 65 2c 20 6c 69 6e 65 6e 6f 2c 20 6e 43 6f 6c  le, lineno, nCol
105c0 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20 20 20 20  , i+1);.        
105d0 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
105e0 6c 74 28 69 6e 74 65 72 70 2c 20 7a 45 72 72 2c  lt(interp, zErr,
105f0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66   0);.          f
10600 72 65 65 28 7a 45 72 72 29 3b 0a 20 20 20 20 20  ree(zErr);.     
10610 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a 43 6f     }.        zCo
10620 6d 6d 69 74 20 3d 20 22 52 4f 4c 4c 42 41 43 4b  mmit = "ROLLBACK
10630 22 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  ";.        break
10640 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
10650 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b  for(i=0; i<nCol;
10660 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 2f   i++){.        /
10670 2a 20 63 68 65 63 6b 20 66 6f 72 20 6e 75 6c 6c  * check for null
10680 20 64 61 74 61 2c 20 69 66 20 73 6f 2c 20 62 69   data, if so, bi
10690 6e 64 20 61 73 20 6e 75 6c 6c 20 2a 2f 0a 20 20  nd as null */.  
106a0 20 20 20 20 20 20 69 66 28 20 28 6e 4e 75 6c 6c        if( (nNull
106b0 3e 30 20 26 26 20 73 74 72 63 6d 70 28 61 7a 43  >0 && strcmp(azC
106c0 6f 6c 5b 69 5d 2c 20 7a 4e 75 6c 6c 29 3d 3d 30  ol[i], zNull)==0
106d0 29 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73  ).          || s
106e0 74 72 6c 65 6e 33 30 28 61 7a 43 6f 6c 5b 69 5d  trlen30(azCol[i]
106f0 29 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 29 7b  )==0 .        ){
10700 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
10710 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28 70 53 74  e3_bind_null(pSt
10720 6d 74 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20 20  mt, i+1);.      
10730 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
10740 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
10750 74 65 78 74 28 70 53 74 6d 74 2c 20 69 2b 31 2c  text(pStmt, i+1,
10760 20 61 7a 43 6f 6c 5b 69 5d 2c 20 2d 31 2c 20 53   azCol[i], -1, S
10770 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20  QLITE_STATIC);. 
10780 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
10790 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
107a0 74 65 70 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  tep(pStmt);.    
107b0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72    rc = sqlite3_r
107c0 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 20 20 20  eset(pStmt);.   
107d0 20 20 20 66 72 65 65 28 7a 4c 69 6e 65 29 3b 0a     free(zLine);.
107e0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
107f0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
10800 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
10810 75 6c 74 28 69 6e 74 65 72 70 2c 22 45 72 72 6f  ult(interp,"Erro
10820 72 3a 20 22 2c 20 73 71 6c 69 74 65 33 5f 65 72  r: ", sqlite3_er
10830 72 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c 20 30  rmsg(pDb->db), 0
10840 29 3b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6d 6d  );.        zComm
10850 69 74 20 3d 20 22 52 4f 4c 4c 42 41 43 4b 22 3b  it = "ROLLBACK";
10860 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
10870 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
10880 20 20 66 72 65 65 28 61 7a 43 6f 6c 29 3b 0a 20    free(azCol);. 
10890 20 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20     fclose(in);. 
108a0 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c     sqlite3_final
108b0 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  ize(pStmt);.    
108c0 28 76 6f 69 64 29 73 71 6c 69 74 65 33 5f 65 78  (void)sqlite3_ex
108d0 65 63 28 70 44 62 2d 3e 64 62 2c 20 7a 43 6f 6d  ec(pDb->db, zCom
108e0 6d 69 74 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 0a  mit, 0, 0, 0);..
108f0 20 20 20 20 69 66 28 20 7a 43 6f 6d 6d 69 74 5b      if( zCommit[
10900 30 5d 20 3d 3d 20 27 43 27 20 29 7b 0a 20 20 20  0] == 'C' ){.   
10910 20 20 20 2f 2a 20 73 75 63 63 65 73 73 2c 20 73     /* success, s
10920 65 74 20 72 65 73 75 6c 74 20 61 73 20 6e 75 6d  et result as num
10930 62 65 72 20 6f 66 20 6c 69 6e 65 73 20 70 72 6f  ber of lines pro
10940 63 65 73 73 65 64 20 2a 2f 0a 20 20 20 20 20 20  cessed */.      
10950 70 52 65 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65  pResult = Tcl_Ge
10960 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
10970 70 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 53 65  p);.      Tcl_Se
10980 74 49 6e 74 4f 62 6a 28 70 52 65 73 75 6c 74 2c  tIntObj(pResult,
10990 20 6c 69 6e 65 6e 6f 29 3b 0a 20 20 20 20 20 20   lineno);.      
109a0 72 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20  rc = TCL_OK;.   
109b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
109c0 20 66 61 69 6c 75 72 65 2c 20 61 70 70 65 6e 64   failure, append
109d0 20 6c 69 6e 65 6e 6f 20 77 68 65 72 65 20 66 61   lineno where fa
109e0 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20 73 71  iled */.      sq
109f0 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
10a00 69 7a 65 6f 66 28 7a 4c 69 6e 65 4e 75 6d 29 2c  izeof(zLineNum),
10a10 20 7a 4c 69 6e 65 4e 75 6d 2c 22 25 64 22 2c 6c   zLineNum,"%d",l
10a20 69 6e 65 6e 6f 29 3b 0a 20 20 20 20 20 20 54 63  ineno);.      Tc
10a30 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
10a40 6e 74 65 72 70 2c 22 2c 20 66 61 69 6c 65 64 20  nterp,", failed 
10a50 77 68 69 6c 65 20 70 72 6f 63 65 73 73 69 6e 67  while processing
10a60 20 6c 69 6e 65 3a 20 22 2c 7a 4c 69 6e 65 4e 75   line: ",zLineNu
10a70 6d 2c 30 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  m,0);.      rc =
10a80 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
10a90 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  }.    break;.  }
10aa0 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 24  ..  /*.  **    $
10ab0 64 62 20 65 6e 61 62 6c 65 5f 6c 6f 61 64 5f 65  db enable_load_e
10ac0 78 74 65 6e 73 69 6f 6e 20 42 4f 4f 4c 45 41 4e  xtension BOOLEAN
10ad0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 75 72 6e 20  .  **.  ** Turn 
10ae0 74 68 65 20 65 78 74 65 6e 73 69 6f 6e 20 6c 6f  the extension lo
10af0 61 64 69 6e 67 20 66 65 61 74 75 72 65 20 6f 6e  ading feature on
10b00 20 6f 72 20 6f 66 66 2e 20 20 49 74 20 69 66 20   or off.  It if 
10b10 6f 66 66 20 62 79 0a 20 20 2a 2a 20 64 65 66 61  off by.  ** defa
10b20 75 6c 74 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  ult..  */.  case
10b30 20 44 42 5f 45 4e 41 42 4c 45 5f 4c 4f 41 44 5f   DB_ENABLE_LOAD_
10b40 45 58 54 45 4e 53 49 4f 4e 3a 20 7b 0a 23 69 66  EXTENSION: {.#if
10b50 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
10b60 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a  _LOAD_EXTENSION.
10b70 20 20 20 20 69 6e 74 20 6f 6e 6f 66 66 3b 0a 20      int onoff;. 
10b80 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29     if( objc!=3 )
10b90 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e  {.      Tcl_Wron
10ba0 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
10bb0 20 32 2c 20 6f 62 6a 76 2c 20 22 42 4f 4f 4c 45   2, objv, "BOOLE
10bc0 41 4e 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  AN");.      retu
10bd0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
10be0 20 20 7d 0a 20 20 20 20 69 66 28 20 54 63 6c 5f    }.    if( Tcl_
10bf0 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62  GetBooleanFromOb
10c00 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32  j(interp, objv[2
10c10 5d 2c 20 26 6f 6e 6f 66 66 29 20 29 7b 0a 20 20  ], &onoff) ){.  
10c20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
10c30 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
10c40 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 6c  sqlite3_enable_l
10c50 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e 28 70 44  oad_extension(pD
10c60 62 2d 3e 64 62 2c 20 6f 6e 6f 66 66 29 3b 0a 20  b->db, onoff);. 
10c70 20 20 20 62 72 65 61 6b 3b 0a 23 65 6c 73 65 0a     break;.#else.
10c80 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
10c90 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 65 78  sult(interp, "ex
10ca0 74 65 6e 73 69 6f 6e 20 6c 6f 61 64 69 6e 67 20  tension loading 
10cb0 69 73 20 74 75 72 6e 65 64 20 6f 66 66 20 61 74  is turned off at
10cc0 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 22 2c 0a   compile-time",.
10cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10ce0 20 20 20 20 20 30 29 3b 0a 20 20 20 20 72 65 74       0);.    ret
10cf0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23  urn TCL_ERROR;.#
10d00 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 0a  endif.  }..  /*.
10d10 20 20 2a 2a 20 20 20 20 24 64 62 20 65 72 72 6f    **    $db erro
10d20 72 63 6f 64 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20  rcode.  **.  ** 
10d30 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 65 72  Return the numer
10d40 69 63 20 65 72 72 6f 72 20 63 6f 64 65 20 74 68  ic error code th
10d50 61 74 20 77 61 73 20 72 65 74 75 72 6e 65 64 20  at was returned 
10d60 62 79 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  by the most rece
10d70 6e 74 0a 20 20 2a 2a 20 63 61 6c 6c 20 74 6f 20  nt.  ** call to 
10d80 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29 2e 0a  sqlite3_exec()..
10d90 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 45    */.  case DB_E
10da0 52 52 4f 52 43 4f 44 45 3a 20 7b 0a 20 20 20 20  RRORCODE: {.    
10db0 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
10dc0 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
10dd0 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f 65  IntObj(sqlite3_e
10de0 72 72 63 6f 64 65 28 70 44 62 2d 3e 64 62 29 29  rrcode(pDb->db))
10df0 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  );.    break;.  
10e00 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20  }..  /*.  **    
10e10 24 64 62 20 65 78 69 73 74 73 20 24 73 71 6c 0a  $db exists $sql.
10e20 20 20 2a 2a 20 20 20 20 24 64 62 20 6f 6e 65 63    **    $db onec
10e30 6f 6c 75 6d 6e 20 24 73 71 6c 0a 20 20 2a 2a 0a  olumn $sql.  **.
10e40 20 20 2a 2a 20 54 68 65 20 6f 6e 65 63 6f 6c 75    ** The onecolu
10e50 6d 6e 20 6d 65 74 68 6f 64 20 69 73 20 74 68 65  mn method is the
10e60 20 65 71 75 69 76 61 6c 65 6e 74 20 6f 66 3a 0a   equivalent of:.
10e70 20 20 2a 2a 20 20 20 20 20 6c 69 6e 64 65 78 20    **     lindex 
10e80 5b 24 64 62 20 65 76 61 6c 20 24 73 71 6c 5d 20  [$db eval $sql] 
10e90 30 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  0.  */.  case DB
10ea0 5f 45 58 49 53 54 53 3a 20 0a 20 20 63 61 73 65  _EXISTS: .  case
10eb0 20 44 42 5f 4f 4e 45 43 4f 4c 55 4d 4e 3a 20 7b   DB_ONECOLUMN: {
10ec0 0a 20 20 20 20 44 62 45 76 61 6c 43 6f 6e 74 65  .    DbEvalConte
10ed0 78 74 20 73 45 76 61 6c 3b 0a 20 20 20 20 69 66  xt sEval;.    if
10ee0 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20  ( objc!=3 ){.   
10ef0 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
10f00 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
10f10 62 6a 76 2c 20 22 53 51 4c 22 29 3b 0a 20 20 20  bjv, "SQL");.   
10f20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
10f30 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ROR;.    }..    
10f40 64 62 45 76 61 6c 49 6e 69 74 28 26 73 45 76 61  dbEvalInit(&sEva
10f50 6c 2c 20 70 44 62 2c 20 6f 62 6a 76 5b 32 5d 2c  l, pDb, objv[2],
10f60 20 30 29 3b 0a 20 20 20 20 72 63 20 3d 20 64 62   0);.    rc = db
10f70 45 76 61 6c 53 74 65 70 28 26 73 45 76 61 6c 29  EvalStep(&sEval)
10f80 3b 0a 20 20 20 20 69 66 28 20 63 68 6f 69 63 65  ;.    if( choice
10f90 3d 3d 44 42 5f 4f 4e 45 43 4f 4c 55 4d 4e 20 29  ==DB_ONECOLUMN )
10fa0 7b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  {.      if( rc==
10fb0 54 43 4c 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  TCL_OK ){.      
10fc0 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
10fd0 6c 74 28 69 6e 74 65 72 70 2c 20 64 62 45 76 61  lt(interp, dbEva
10fe0 6c 43 6f 6c 75 6d 6e 56 61 6c 75 65 28 26 73 45  lColumnValue(&sE
10ff0 76 61 6c 2c 20 30 29 29 3b 0a 20 20 20 20 20 20  val, 0));.      
11000 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  }.    }else if( 
11010 72 63 3d 3d 54 43 4c 5f 42 52 45 41 4b 20 7c 7c  rc==TCL_BREAK ||
11020 20 72 63 3d 3d 54 43 4c 5f 4f 4b 20 29 7b 0a 20   rc==TCL_OK ){. 
11030 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52       Tcl_SetObjR
11040 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
11050 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28  l_NewBooleanObj(
11060 72 63 3d 3d 54 43 4c 5f 4f 4b 29 29 3b 0a 20 20  rc==TCL_OK));.  
11070 20 20 7d 0a 20 20 20 20 64 62 45 76 61 6c 46 69    }.    dbEvalFi
11080 6e 61 6c 69 7a 65 28 26 73 45 76 61 6c 29 3b 0a  nalize(&sEval);.
11090 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 54 43 4c  .    if( rc==TCL
110a0 5f 42 52 45 41 4b 20 29 7b 0a 20 20 20 20 20 20  _BREAK ){.      
110b0 72 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20  rc = TCL_OK;.   
110c0 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20   }.    break;.  
110d0 7d 0a 20 20 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20  }.   .  /*.  ** 
110e0 20 20 20 24 64 62 20 65 76 61 6c 20 24 73 71 6c     $db eval $sql
110f0 20 3f 61 72 72 61 79 3f 20 3f 7b 20 20 2e 2e 2e   ?array? ?{  ...
11100 63 6f 64 65 2e 2e 2e 20 7d 3f 0a 20 20 2a 2a 0a  code... }?.  **.
11110 20 20 2a 2a 20 54 68 65 20 53 51 4c 20 73 74 61    ** The SQL sta
11120 74 65 6d 65 6e 74 20 69 6e 20 24 73 71 6c 20 69  tement in $sql i
11130 73 20 65 76 61 6c 75 61 74 65 64 2e 20 20 46 6f  s evaluated.  Fo
11140 72 20 65 61 63 68 20 72 6f 77 2c 20 74 68 65 20  r each row, the 
11150 76 61 6c 75 65 73 20 61 72 65 0a 20 20 2a 2a 20  values are.  ** 
11160 70 6c 61 63 65 64 20 69 6e 20 65 6c 65 6d 65 6e  placed in elemen
11170 74 73 20 6f 66 20 74 68 65 20 61 72 72 61 79 20  ts of the array 
11180 6e 61 6d 65 64 20 22 61 72 72 61 79 22 20 61 6e  named "array" an
11190 64 20 2e 2e 2e 63 6f 64 65 2e 2e 2e 20 69 73 20  d ...code... is 
111a0 65 78 65 63 75 74 65 64 2e 0a 20 20 2a 2a 20 49  executed..  ** I
111b0 66 20 22 61 72 72 61 79 22 20 61 6e 64 20 22 63  f "array" and "c
111c0 6f 64 65 22 20 61 72 65 20 6f 6d 69 74 74 65 64  ode" are omitted
111d0 2c 20 74 68 65 6e 20 6e 6f 20 63 61 6c 6c 62 61  , then no callba
111e0 63 6b 20 69 73 20 65 76 65 72 79 20 69 6e 76 6f  ck is every invo
111f0 6b 65 64 2e 0a 20 20 2a 2a 20 49 66 20 22 61 72  ked..  ** If "ar
11200 72 61 79 22 20 69 73 20 61 6e 20 65 6d 70 74 79  ray" is an empty
11210 20 73 74 72 69 6e 67 2c 20 74 68 65 6e 20 74 68   string, then th
11220 65 20 76 61 6c 75 65 73 20 61 72 65 20 70 6c 61  e values are pla
11230 63 65 64 20 69 6e 20 76 61 72 69 61 62 6c 65 73  ced in variables
11240 0a 20 20 2a 2a 20 74 68 61 74 20 68 61 76 65 20  .  ** that have 
11250 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 61 73  the same name as
11260 20 74 68 65 20 66 69 65 6c 64 73 20 65 78 74 72   the fields extr
11270 61 63 74 65 64 20 62 79 20 74 68 65 20 71 75 65  acted by the que
11280 72 79 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  ry..  */.  case 
11290 44 42 5f 45 56 41 4c 3a 20 7b 0a 20 20 20 20 69  DB_EVAL: {.    i
112a0 66 28 20 6f 62 6a 63 3c 33 20 7c 7c 20 6f 62 6a  f( objc<3 || obj
112b0 63 3e 35 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  c>5 ){.      Tcl
112c0 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
112d0 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22  terp, 2, objv, "
112e0 53 51 4c 20 3f 41 52 52 41 59 2d 4e 41 4d 45 3f  SQL ?ARRAY-NAME?
112f0 20 3f 53 43 52 49 50 54 3f 22 29 3b 0a 20 20 20   ?SCRIPT?");.   
11300 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
11310 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ROR;.    }..    
11320 69 66 28 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20  if( objc==3 ){. 
11330 20 20 20 20 20 44 62 45 76 61 6c 43 6f 6e 74 65       DbEvalConte
11340 78 74 20 73 45 76 61 6c 3b 0a 20 20 20 20 20 20  xt sEval;.      
11350 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 74 20 3d 20  Tcl_Obj *pRet = 
11360 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20 20  Tcl_NewObj();.  
11370 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43      Tcl_IncrRefC
11380 6f 75 6e 74 28 70 52 65 74 29 3b 0a 20 20 20 20  ount(pRet);.    
11390 20 20 64 62 45 76 61 6c 49 6e 69 74 28 26 73 45    dbEvalInit(&sE
113a0 76 61 6c 2c 20 70 44 62 2c 20 6f 62 6a 76 5b 32  val, pDb, objv[2
113b0 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 77 68 69  ], 0);.      whi
113c0 6c 65 28 20 54 43 4c 5f 4f 4b 3d 3d 28 72 63 20  le( TCL_OK==(rc 
113d0 3d 20 64 62 45 76 61 6c 53 74 65 70 28 26 73 45  = dbEvalStep(&sE
113e0 76 61 6c 29 29 20 29 7b 0a 20 20 20 20 20 20 20  val)) ){.       
113f0 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20   int i;.        
11400 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 20 20 20 20  int nCol;.      
11410 20 20 64 62 45 76 61 6c 52 6f 77 49 6e 66 6f 28    dbEvalRowInfo(
11420 26 73 45 76 61 6c 2c 20 26 6e 43 6f 6c 2c 20 30  &sEval, &nCol, 0
11430 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  );.        for(i
11440 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29  =0; i<nCol; i++)
11450 7b 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f  {.          Tcl_
11460 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
11470 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 52 65  ment(interp, pRe
11480 74 2c 20 64 62 45 76 61 6c 43 6f 6c 75 6d 6e 56  t, dbEvalColumnV
11490 61 6c 75 65 28 26 73 45 76 61 6c 2c 20 69 29 29  alue(&sEval, i))
114a0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
114b0 20 20 7d 0a 20 20 20 20 20 20 64 62 45 76 61 6c    }.      dbEval
114c0 46 69 6e 61 6c 69 7a 65 28 26 73 45 76 61 6c 29  Finalize(&sEval)
114d0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
114e0 54 43 4c 5f 42 52 45 41 4b 20 29 7b 0a 20 20 20  TCL_BREAK ){.   
114f0 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52       Tcl_SetObjR
11500 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 52  esult(interp, pR
11510 65 74 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  et);.        rc 
11520 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 20 20  = TCL_OK;.      
11530 7d 0a 20 20 20 20 20 20 54 63 6c 5f 44 65 63 72  }.      Tcl_Decr
11540 52 65 66 43 6f 75 6e 74 28 70 52 65 74 29 3b 0a  RefCount(pRet);.
11550 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
11560 20 43 6c 69 65 6e 74 44 61 74 61 20 63 64 5b 32   ClientData cd[2
11570 5d 3b 0a 20 20 20 20 20 20 44 62 45 76 61 6c 43  ];.      DbEvalC
11580 6f 6e 74 65 78 74 20 2a 70 3b 0a 20 20 20 20 20  ontext *p;.     
11590 20 54 63 6c 5f 4f 62 6a 20 2a 70 41 72 72 61 79   Tcl_Obj *pArray
115a0 20 3d 20 30 3b 0a 20 20 20 20 20 20 54 63 6c 5f   = 0;.      Tcl_
115b0 4f 62 6a 20 2a 70 53 63 72 69 70 74 3b 0a 0a 20  Obj *pScript;.. 
115c0 20 20 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d 35       if( objc==5
115d0 20 26 26 20 2a 28 63 68 61 72 20 2a 29 54 63 6c   && *(char *)Tcl
115e0 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
115f0 33 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  3]) ){.        p
11600 41 72 72 61 79 20 3d 20 6f 62 6a 76 5b 33 5d 3b  Array = objv[3];
11610 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
11620 53 63 72 69 70 74 20 3d 20 6f 62 6a 76 5b 6f 62  Script = objv[ob
11630 6a 63 2d 31 5d 3b 0a 20 20 20 20 20 20 54 63 6c  jc-1];.      Tcl
11640 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 53  _IncrRefCount(pS
11650 63 72 69 70 74 29 3b 0a 20 20 20 20 20 20 0a 20  cript);.      . 
11660 20 20 20 20 20 70 20 3d 20 28 44 62 45 76 61 6c       p = (DbEval
11670 43 6f 6e 74 65 78 74 20 2a 29 54 63 6c 5f 41 6c  Context *)Tcl_Al
11680 6c 6f 63 28 73 69 7a 65 6f 66 28 44 62 45 76 61  loc(sizeof(DbEva
11690 6c 43 6f 6e 74 65 78 74 29 29 3b 0a 20 20 20 20  lContext));.    
116a0 20 20 64 62 45 76 61 6c 49 6e 69 74 28 70 2c 20    dbEvalInit(p, 
116b0 70 44 62 2c 20 6f 62 6a 76 5b 32 5d 2c 20 70 41  pDb, objv[2], pA
116c0 72 72 61 79 29 3b 0a 0a 20 20 20 20 20 20 63 64  rray);..      cd
116d0 5b 30 5d 20 3d 20 28 76 6f 69 64 20 2a 29 70 3b  [0] = (void *)p;
116e0 0a 20 20 20 20 20 20 63 64 5b 31 5d 20 3d 20 28  .      cd[1] = (
116f0 76 6f 69 64 20 2a 29 70 53 63 72 69 70 74 3b 0a  void *)pScript;.
11700 20 20 20 20 20 20 72 63 20 3d 20 44 62 45 76 61        rc = DbEva
11710 6c 4e 65 78 74 43 6d 64 28 63 64 2c 20 69 6e 74  lNextCmd(cd, int
11720 65 72 70 2c 20 54 43 4c 5f 4f 4b 29 3b 0a 20 20  erp, TCL_OK);.  
11730 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20    }.    break;. 
11740 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20   }..  /*.  **   
11750 20 20 24 64 62 20 66 75 6e 63 74 69 6f 6e 20 4e    $db function N
11760 41 4d 45 20 5b 2d 61 72 67 63 6f 75 6e 74 20 4e  AME [-argcount N
11770 5d 20 53 43 52 49 50 54 0a 20 20 2a 2a 0a 20 20  ] SCRIPT.  **.  
11780 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  ** Create a new 
11790 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c  SQL function cal
117a0 6c 65 64 20 4e 41 4d 45 2e 20 20 57 68 65 6e 65  led NAME.  Whene
117b0 76 65 72 20 74 68 61 74 20 66 75 6e 63 74 69 6f  ver that functio
117c0 6e 20 69 73 0a 20 20 2a 2a 20 63 61 6c 6c 65 64  n is.  ** called
117d0 2c 20 69 6e 76 6f 6b 65 20 53 43 52 49 50 54 20  , invoke SCRIPT 
117e0 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65 20  to evaluate the 
117f0 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20  function..  */. 
11800 20 63 61 73 65 20 44 42 5f 46 55 4e 43 54 49 4f   case DB_FUNCTIO
11810 4e 3a 20 7b 0a 20 20 20 20 53 71 6c 46 75 6e 63  N: {.    SqlFunc
11820 20 2a 70 46 75 6e 63 3b 0a 20 20 20 20 54 63 6c   *pFunc;.    Tcl
11830 5f 4f 62 6a 20 2a 70 53 63 72 69 70 74 3b 0a 20  _Obj *pScript;. 
11840 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a     char *zName;.
11850 20 20 20 20 69 6e 74 20 6e 41 72 67 20 3d 20 2d      int nArg = -
11860 31 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3d  1;.    if( objc=
11870 3d 36 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73  =6 ){.      cons
11880 74 20 63 68 61 72 20 2a 7a 20 3d 20 54 63 6c 5f  t char *z = Tcl_
11890 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33  GetString(objv[3
118a0 5d 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20  ]);.      int n 
118b0 3d 20 73 74 72 6c 65 6e 33 30 28 7a 29 3b 0a 20  = strlen30(z);. 
118c0 20 20 20 20 20 69 66 28 20 6e 3e 32 20 26 26 20       if( n>2 && 
118d0 73 74 72 6e 63 6d 70 28 7a 2c 20 22 2d 61 72 67  strncmp(z, "-arg
118e0 63 6f 75 6e 74 22 2c 6e 29 3d 3d 30 20 29 7b 0a  count",n)==0 ){.
118f0 20 20 20 20 20 20 20 20 69 66 28 20 54 63 6c 5f          if( Tcl_
11900 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
11910 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 26  terp, objv[4], &
11920 6e 41 72 67 29 20 29 20 72 65 74 75 72 6e 20 54  nArg) ) return T
11930 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  CL_ERROR;.      
11940 20 20 69 66 28 20 6e 41 72 67 3c 30 20 29 7b 0a    if( nArg<0 ){.
11950 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70            Tcl_Ap
11960 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
11970 70 2c 20 22 6e 75 6d 62 65 72 20 6f 66 20 61 72  p, "number of ar
11980 67 75 6d 65 6e 74 73 20 6d 75 73 74 20 62 65 20  guments must be 
11990 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 22 2c 0a 20  non-negative",. 
119a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
119b0 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
119c0 29 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  )0);.          r
119d0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
119e0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
119f0 20 7d 0a 20 20 20 20 20 20 70 53 63 72 69 70 74   }.      pScript
11a00 20 3d 20 6f 62 6a 76 5b 35 5d 3b 0a 20 20 20 20   = objv[5];.    
11a10 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a 63 21 3d  }else if( objc!=
11a20 34 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57  4 ){.      Tcl_W
11a30 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
11a40 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 4e 41  rp, 2, objv, "NA
11a50 4d 45 20 5b 2d 61 72 67 63 6f 75 6e 74 20 4e 5d  ME [-argcount N]
11a60 20 53 43 52 49 50 54 22 29 3b 0a 20 20 20 20 20   SCRIPT");.     
11a70 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
11a80 52 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  R;.    }else{.  
11a90 20 20 20 20 70 53 63 72 69 70 74 20 3d 20 6f 62      pScript = ob
11aa0 6a 76 5b 33 5d 3b 0a 20 20 20 20 7d 0a 20 20 20  jv[3];.    }.   
11ab0 20 7a 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74   zName = Tcl_Get
11ac0 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
11ad0 6a 76 5b 32 5d 2c 20 30 29 3b 0a 20 20 20 20 70  jv[2], 0);.    p
11ae0 46 75 6e 63 20 3d 20 66 69 6e 64 53 71 6c 46 75  Func = findSqlFu
11af0 6e 63 28 70 44 62 2c 20 7a 4e 61 6d 65 29 3b 0a  nc(pDb, zName);.
11b00 20 20 20 20 69 66 28 20 70 46 75 6e 63 3d 3d 30      if( pFunc==0
11b10 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
11b20 52 4f 52 3b 0a 20 20 20 20 69 66 28 20 70 46 75  ROR;.    if( pFu
11b30 6e 63 2d 3e 70 53 63 72 69 70 74 20 29 7b 0a 20  nc->pScript ){. 
11b40 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66       Tcl_DecrRef
11b50 43 6f 75 6e 74 28 70 46 75 6e 63 2d 3e 70 53 63  Count(pFunc->pSc
11b60 72 69 70 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ript);.    }.   
11b70 20 70 46 75 6e 63 2d 3e 70 53 63 72 69 70 74 20   pFunc->pScript 
11b80 3d 20 70 53 63 72 69 70 74 3b 0a 20 20 20 20 54  = pScript;.    T
11b90 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
11ba0 70 53 63 72 69 70 74 29 3b 0a 20 20 20 20 70 46  pScript);.    pF
11bb0 75 6e 63 2d 3e 75 73 65 45 76 61 6c 4f 62 6a 76  unc->useEvalObjv
11bc0 20 3d 20 73 61 66 65 54 6f 55 73 65 45 76 61 6c   = safeToUseEval
11bd0 4f 62 6a 76 28 69 6e 74 65 72 70 2c 20 70 53 63  Objv(interp, pSc
11be0 72 69 70 74 29 3b 0a 20 20 20 20 72 63 20 3d 20  ript);.    rc = 
11bf0 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
11c00 75 6e 63 74 69 6f 6e 28 70 44 62 2d 3e 64 62 2c  unction(pDb->db,
11c10 20 7a 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 53 51   zName, nArg, SQ
11c20 4c 49 54 45 5f 55 54 46 38 2c 0a 20 20 20 20 20  LITE_UTF8,.     
11c30 20 20 20 70 46 75 6e 63 2c 20 74 63 6c 53 71 6c     pFunc, tclSql
11c40 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20 20  Func, 0, 0);.   
11c50 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
11c60 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
11c70 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
11c80 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28    Tcl_SetResult(
11c90 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29  interp, (char *)
11ca0 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70  sqlite3_errmsg(p
11cb0 44 62 2d 3e 64 62 29 2c 20 54 43 4c 5f 56 4f 4c  Db->db), TCL_VOL
11cc0 41 54 49 4c 45 29 3b 0a 20 20 20 20 7d 0a 20 20  ATILE);.    }.  
11cd0 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
11ce0 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20  /*.  **     $db 
11cf0 69 6e 63 72 62 6c 6f 62 20 3f 2d 72 65 61 64 6f  incrblob ?-reado
11d00 6e 6c 79 3f 20 3f 44 42 3f 20 54 41 42 4c 45 20  nly? ?DB? TABLE 
11d10 43 4f 4c 55 4d 4e 20 52 4f 57 49 44 0a 20 20 2a  COLUMN ROWID.  *
11d20 2f 0a 20 20 63 61 73 65 20 44 42 5f 49 4e 43 52  /.  case DB_INCR
11d30 42 4c 4f 42 3a 20 7b 0a 23 69 66 64 65 66 20 53  BLOB: {.#ifdef S
11d40 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42  QLITE_OMIT_INCRB
11d50 4c 4f 42 0a 20 20 20 20 54 63 6c 5f 41 70 70 65  LOB.    Tcl_Appe
11d60 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
11d70 20 22 69 6e 63 72 62 6c 6f 62 20 6e 6f 74 20 61   "incrblob not a
11d80 76 61 69 6c 61 62 6c 65 20 69 6e 20 74 68 69 73  vailable in this
11d90 20 62 75 69 6c 64 22 2c 20 30 29 3b 0a 20 20 20   build", 0);.   
11da0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
11db0 52 3b 0a 23 65 6c 73 65 0a 20 20 20 20 69 6e 74  R;.#else.    int
11dc0 20 69 73 52 65 61 64 6f 6e 6c 79 20 3d 20 30 3b   isReadonly = 0;
11dd0 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
11de0 2a 7a 44 62 20 3d 20 22 6d 61 69 6e 22 3b 0a 20  *zDb = "main";. 
11df0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
11e00 54 61 62 6c 65 3b 0a 20 20 20 20 63 6f 6e 73 74  Table;.    const
11e10 20 63 68 61 72 20 2a 7a 43 6f 6c 75 6d 6e 3b 0a   char *zColumn;.
11e20 20 20 20 20 73 71 6c 69 74 65 5f 69 6e 74 36 34      sqlite_int64
11e30 20 69 52 6f 77 3b 0a 0a 20 20 20 20 2f 2a 20 43   iRow;..    /* C
11e40 68 65 63 6b 20 66 6f 72 20 74 68 65 20 2d 72 65  heck for the -re
11e50 61 64 6f 6e 6c 79 20 6f 70 74 69 6f 6e 20 2a 2f  adonly option */
11e60 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 33 20  .    if( objc>3 
11e70 26 26 20 73 74 72 63 6d 70 28 54 63 6c 5f 47 65  && strcmp(Tcl_Ge
11e80 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29  tString(objv[2])
11e90 2c 20 22 2d 72 65 61 64 6f 6e 6c 79 22 29 3d 3d  , "-readonly")==
11ea0 30 20 29 7b 0a 20 20 20 20 20 20 69 73 52 65 61  0 ){.      isRea
11eb0 64 6f 6e 6c 79 20 3d 20 31 3b 0a 20 20 20 20 7d  donly = 1;.    }
11ec0 0a 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d  ..    if( objc!=
11ed0 28 35 2b 69 73 52 65 61 64 6f 6e 6c 79 29 20 26  (5+isReadonly) &
11ee0 26 20 6f 62 6a 63 21 3d 28 36 2b 69 73 52 65 61  & objc!=(6+isRea
11ef0 64 6f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20  donly) ){.      
11f00 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
11f10 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76  (interp, 2, objv
11f20 2c 20 22 3f 2d 72 65 61 64 6f 6e 6c 79 3f 20 3f  , "?-readonly? ?
11f30 44 42 3f 20 54 41 42 4c 45 20 43 4f 4c 55 4d 4e  DB? TABLE COLUMN
11f40 20 52 4f 57 49 44 22 29 3b 0a 20 20 20 20 20 20   ROWID");.      
11f50 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
11f60 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
11f70 20 6f 62 6a 63 3d 3d 28 36 2b 69 73 52 65 61 64   objc==(6+isRead
11f80 6f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 7a  only) ){.      z
11f90 44 62 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  Db = Tcl_GetStri
11fa0 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 20  ng(objv[2]);.   
11fb0 20 7d 0a 20 20 20 20 7a 54 61 62 6c 65 20 3d 20   }.    zTable = 
11fc0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
11fd0 6a 76 5b 6f 62 6a 63 2d 33 5d 29 3b 0a 20 20 20  jv[objc-3]);.   
11fe0 20 7a 43 6f 6c 75 6d 6e 20 3d 20 54 63 6c 5f 47   zColumn = Tcl_G
11ff0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 6f 62  etString(objv[ob
12000 6a 63 2d 32 5d 29 3b 0a 20 20 20 20 72 63 20 3d  jc-2]);.    rc =
12010 20 54 63 6c 5f 47 65 74 57 69 64 65 49 6e 74 46   Tcl_GetWideIntF
12020 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
12030 62 6a 76 5b 6f 62 6a 63 2d 31 5d 2c 20 26 69 52  bjv[objc-1], &iR
12040 6f 77 29 3b 0a 0a 20 20 20 20 69 66 28 20 72 63  ow);..    if( rc
12050 3d 3d 54 43 4c 5f 4f 4b 20 29 7b 0a 20 20 20 20  ==TCL_OK ){.    
12060 20 20 72 63 20 3d 20 63 72 65 61 74 65 49 6e 63    rc = createInc
12070 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 28 0a 20 20  rblobChannel(.  
12080 20 20 20 20 20 20 20 20 69 6e 74 65 72 70 2c 20          interp, 
12090 70 44 62 2c 20 7a 44 62 2c 20 7a 54 61 62 6c 65  pDb, zDb, zTable
120a0 2c 20 7a 43 6f 6c 75 6d 6e 2c 20 69 52 6f 77 2c  , zColumn, iRow,
120b0 20 69 73 52 65 61 64 6f 6e 6c 79 0a 20 20 20 20   isReadonly.    
120c0 20 20 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69    );.    }.#endi
120d0 66 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  f.    break;.  }
120e0 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20  ..  /*.  **     
120f0 24 64 62 20 69 6e 74 65 72 72 75 70 74 0a 20 20  $db interrupt.  
12100 2a 2a 0a 20 20 2a 2a 20 49 6e 74 65 72 72 75 70  **.  ** Interrup
12110 74 20 74 68 65 20 65 78 65 63 75 74 69 6f 6e 20  t the execution 
12120 6f 66 20 74 68 65 20 69 6e 6e 65 72 2d 6d 6f 73  of the inner-mos
12130 74 20 53 51 4c 20 69 6e 74 65 72 70 72 65 74 65  t SQL interprete
12140 72 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20 63 61  r.  This.  ** ca
12150 75 73 65 73 20 74 68 65 20 53 51 4c 20 73 74 61  uses the SQL sta
12160 74 65 6d 65 6e 74 20 74 6f 20 72 65 74 75 72 6e  tement to return
12170 20 61 6e 20 65 72 72 6f 72 20 6f 66 20 53 51 4c   an error of SQL
12180 49 54 45 5f 49 4e 54 45 52 52 55 50 54 2e 0a 20  ITE_INTERRUPT.. 
12190 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 49 4e   */.  case DB_IN
121a0 54 45 52 52 55 50 54 3a 20 7b 0a 20 20 20 20 73  TERRUPT: {.    s
121b0 71 6c 69 74 65 33 5f 69 6e 74 65 72 72 75 70 74  qlite3_interrupt
121c0 28 70 44 62 2d 3e 64 62 29 3b 0a 20 20 20 20 62  (pDb->db);.    b
121d0 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a  reak;.  }..  /*.
121e0 20 20 2a 2a 20 20 20 20 20 24 64 62 20 6e 75 6c    **     $db nul
121f0 6c 76 61 6c 75 65 20 3f 53 54 52 49 4e 47 3f 0a  lvalue ?STRING?.
12200 20 20 2a 2a 0a 20 20 2a 2a 20 43 68 61 6e 67 65    **.  ** Change
12210 20 74 65 78 74 20 75 73 65 64 20 77 68 65 6e 20   text used when 
12220 61 20 4e 55 4c 4c 20 63 6f 6d 65 73 20 62 61 63  a NULL comes bac
12230 6b 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  k from the datab
12240 61 73 65 2e 20 49 66 20 3f 53 54 52 49 4e 47 3f  ase. If ?STRING?
12250 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 70 72 65  .  ** is not pre
12260 73 65 6e 74 2c 20 74 68 65 6e 20 74 68 65 20 63  sent, then the c
12270 75 72 72 65 6e 74 20 73 74 72 69 6e 67 20 75 73  urrent string us
12280 65 64 20 66 6f 72 20 4e 55 4c 4c 20 69 73 20 72  ed for NULL is r
12290 65 74 75 72 6e 65 64 2e 0a 20 20 2a 2a 20 49 66  eturned..  ** If
122a0 20 53 54 52 49 4e 47 20 69 73 20 70 72 65 73 65   STRING is prese
122b0 6e 74 2c 20 74 68 65 6e 20 53 54 52 49 4e 47 20  nt, then STRING 
122c0 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 20 20 2a  is returned..  *
122d0 2a 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  *.  */.  case DB
122e0 5f 4e 55 4c 4c 56 41 4c 55 45 3a 20 7b 0a 20 20  _NULLVALUE: {.  
122f0 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 26 26    if( objc!=2 &&
12300 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20   objc!=3 ){.    
12310 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
12320 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62  gs(interp, 2, ob
12330 6a 76 2c 20 22 4e 55 4c 4c 56 41 4c 55 45 22 29  jv, "NULLVALUE")
12340 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
12350 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
12360 20 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d 33 20      if( objc==3 
12370 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e  ){.      int len
12380 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e  ;.      char *zN
12390 75 6c 6c 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  ull = Tcl_GetStr
123a0 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
123b0 32 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20  2], &len);.     
123c0 20 69 66 28 20 70 44 62 2d 3e 7a 4e 75 6c 6c 20   if( pDb->zNull 
123d0 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 46  ){.        Tcl_F
123e0 72 65 65 28 70 44 62 2d 3e 7a 4e 75 6c 6c 29 3b  ree(pDb->zNull);
123f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
12400 66 28 20 7a 4e 75 6c 6c 20 26 26 20 6c 65 6e 3e  f( zNull && len>
12410 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62  0 ){.        pDb
12420 2d 3e 7a 4e 75 6c 6c 20 3d 20 54 63 6c 5f 41 6c  ->zNull = Tcl_Al
12430 6c 6f 63 28 20 6c 65 6e 20 2b 20 31 20 29 3b 0a  loc( len + 1 );.
12440 20 20 20 20 20 20 20 20 73 74 72 6e 63 70 79 28          strncpy(
12450 70 44 62 2d 3e 7a 4e 75 6c 6c 2c 20 7a 4e 75 6c  pDb->zNull, zNul
12460 6c 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 20 20 20  l, len);.       
12470 20 70 44 62 2d 3e 7a 4e 75 6c 6c 5b 6c 65 6e 5d   pDb->zNull[len]
12480 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20 20 7d   = '\0';.      }
12490 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 44  else{.        pD
124a0 62 2d 3e 7a 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20  b->zNull = 0;.  
124b0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
124c0 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
124d0 28 69 6e 74 65 72 70 2c 20 64 62 54 65 78 74 54  (interp, dbTextT
124e0 6f 4f 62 6a 28 70 44 62 2d 3e 7a 4e 75 6c 6c 29  oObj(pDb->zNull)
124f0 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  );.    break;.  
12500 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20  }..  /*.  **    
12510 20 24 64 62 20 6c 61 73 74 5f 69 6e 73 65 72 74   $db last_insert
12520 5f 72 6f 77 69 64 20 0a 20 20 2a 2a 0a 20 20 2a  _rowid .  **.  *
12530 2a 20 52 65 74 75 72 6e 20 61 6e 20 69 6e 74 65  * Return an inte
12540 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65  ger which is the
12550 20 52 4f 57 49 44 20 66 6f 72 20 74 68 65 20 6d   ROWID for the m
12560 6f 73 74 20 72 65 63 65 6e 74 20 69 6e 73 65 72  ost recent inser
12570 74 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  t..  */.  case D
12580 42 5f 4c 41 53 54 5f 49 4e 53 45 52 54 5f 52 4f  B_LAST_INSERT_RO
12590 57 49 44 3a 20 7b 0a 20 20 20 20 54 63 6c 5f 4f  WID: {.    Tcl_O
125a0 62 6a 20 2a 70 52 65 73 75 6c 74 3b 0a 20 20 20  bj *pResult;.   
125b0 20 54 63 6c 5f 57 69 64 65 49 6e 74 20 72 6f 77   Tcl_WideInt row
125c0 69 64 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63  id;.    if( objc
125d0 21 3d 32 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  !=2 ){.      Tcl
125e0 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
125f0 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22  terp, 2, objv, "
12600 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
12610 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
12620 7d 0a 20 20 20 20 72 6f 77 69 64 20 3d 20 73 71  }.    rowid = sq
12630 6c 69 74 65 33 5f 6c 61 73 74 5f 69 6e 73 65 72  lite3_last_inser
12640 74 5f 72 6f 77 69 64 28 70 44 62 2d 3e 64 62 29  t_rowid(pDb->db)
12650 3b 0a 20 20 20 20 70 52 65 73 75 6c 74 20 3d 20  ;.    pResult = 
12660 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_GetObjResult
12670 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 63  (interp);.    Tc
12680 6c 5f 53 65 74 57 69 64 65 49 6e 74 4f 62 6a 28  l_SetWideIntObj(
12690 70 52 65 73 75 6c 74 2c 20 72 6f 77 69 64 29 3b  pResult, rowid);
126a0 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
126b0 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54 68 65 20 44  .  /*.  ** The D
126c0 42 5f 4f 4e 45 43 4f 4c 55 4d 4e 20 6d 65 74 68  B_ONECOLUMN meth
126d0 6f 64 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65  od is implemente
126e0 64 20 74 6f 67 65 74 68 65 72 20 77 69 74 68 20  d together with 
126f0 44 42 5f 45 58 49 53 54 53 2e 0a 20 20 2a 2f 0a  DB_EXISTS..  */.
12700 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 70 72 6f  .  /*    $db pro
12710 67 72 65 73 73 20 3f 4e 20 43 41 4c 4c 42 41 43  gress ?N CALLBAC
12720 4b 3f 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 49 6e  K?.  ** .  ** In
12730 76 6f 6b 65 20 74 68 65 20 67 69 76 65 6e 20 63  voke the given c
12740 61 6c 6c 62 61 63 6b 20 65 76 65 72 79 20 4e 20  allback every N 
12750 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20  virtual machine 
12760 6f 70 63 6f 64 65 73 20 77 68 69 6c 65 20 65 78  opcodes while ex
12770 65 63 75 74 69 6e 67 0a 20 20 2a 2a 20 71 75 65  ecuting.  ** que
12780 72 69 65 73 2e 0a 20 20 2a 2f 0a 20 20 63 61 73  ries..  */.  cas
12790 65 20 44 42 5f 50 52 4f 47 52 45 53 53 3a 20 7b  e DB_PROGRESS: {
127a0 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d 32  .    if( objc==2
127b0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 44   ){.      if( pD
127c0 62 2d 3e 7a 50 72 6f 67 72 65 73 73 20 29 7b 0a  b->zProgress ){.
127d0 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65          Tcl_Appe
127e0 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
127f0 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 2c   pDb->zProgress,
12800 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
12810 20 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d   }else if( objc=
12820 3d 34 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72  =4 ){.      char
12830 20 2a 7a 50 72 6f 67 72 65 73 73 3b 0a 20 20 20   *zProgress;.   
12840 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20     int len;.    
12850 20 20 69 6e 74 20 4e 3b 0a 20 20 20 20 20 20 69    int N;.      i
12860 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47  f( TCL_OK!=Tcl_G
12870 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
12880 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 4e  erp, objv[2], &N
12890 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  ) ){.        ret
128a0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
128b0 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 69 66       };.      if
128c0 28 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73  ( pDb->zProgress
128d0 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f   ){.        Tcl_
128e0 46 72 65 65 28 70 44 62 2d 3e 7a 50 72 6f 67 72  Free(pDb->zProgr
128f0 65 73 73 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ess);.      }.  
12900 20 20 20 20 7a 50 72 6f 67 72 65 73 73 20 3d 20      zProgress = 
12910 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
12920 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d 2c 20 26 6c  mObj(objv[3], &l
12930 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  en);.      if( z
12940 50 72 6f 67 72 65 73 73 20 26 26 20 6c 65 6e 3e  Progress && len>
12950 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62  0 ){.        pDb
12960 2d 3e 7a 50 72 6f 67 72 65 73 73 20 3d 20 54 63  ->zProgress = Tc
12970 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20 31  l_Alloc( len + 1
12980 20 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63   );.        memc
12990 70 79 28 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73  py(pDb->zProgres
129a0 73 2c 20 7a 50 72 6f 67 72 65 73 73 2c 20 6c 65  s, zProgress, le
129b0 6e 2b 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  n+1);.      }els
129c0 65 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e  e{.        pDb->
129d0 7a 50 72 6f 67 72 65 73 73 20 3d 20 30 3b 0a 20  zProgress = 0;. 
129e0 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53       }.#ifndef S
129f0 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 52 4f 47 52  QLITE_OMIT_PROGR
12a00 45 53 53 5f 43 41 4c 4c 42 41 43 4b 0a 20 20 20  ESS_CALLBACK.   
12a10 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f     if( pDb->zPro
12a20 67 72 65 73 73 20 29 7b 0a 20 20 20 20 20 20 20  gress ){.       
12a30 20 70 44 62 2d 3e 69 6e 74 65 72 70 20 3d 20 69   pDb->interp = i
12a40 6e 74 65 72 70 3b 0a 20 20 20 20 20 20 20 20 73  nterp;.        s
12a50 71 6c 69 74 65 33 5f 70 72 6f 67 72 65 73 73 5f  qlite3_progress_
12a60 68 61 6e 64 6c 65 72 28 70 44 62 2d 3e 64 62 2c  handler(pDb->db,
12a70 20 4e 2c 20 44 62 50 72 6f 67 72 65 73 73 48 61   N, DbProgressHa
12a80 6e 64 6c 65 72 2c 20 70 44 62 29 3b 0a 20 20 20  ndler, pDb);.   
12a90 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
12aa0 20 20 73 71 6c 69 74 65 33 5f 70 72 6f 67 72 65    sqlite3_progre
12ab0 73 73 5f 68 61 6e 64 6c 65 72 28 70 44 62 2d 3e  ss_handler(pDb->
12ac0 64 62 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  db, 0, 0, 0);.  
12ad0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
12ae0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 54 63   }else{.      Tc
12af0 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
12b00 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
12b10 22 4e 20 43 41 4c 4c 42 41 43 4b 22 29 3b 0a 20  "N CALLBACK");. 
12b20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
12b30 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
12b40 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
12b50 2a 20 20 20 20 24 64 62 20 70 72 6f 66 69 6c 65  *    $db profile
12b60 20 3f 43 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a   ?CALLBACK?.  **
12b70 0a 20 20 2a 2a 20 4d 61 6b 65 20 61 72 72 61 6e  .  ** Make arran
12b80 67 65 6d 65 6e 74 73 20 74 6f 20 69 6e 76 6f 6b  gements to invok
12b90 65 20 74 68 65 20 43 41 4c 4c 42 41 43 4b 20 72  e the CALLBACK r
12ba0 6f 75 74 69 6e 65 20 61 66 74 65 72 20 65 61 63  outine after eac
12bb0 68 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 0a  h SQL statement.
12bc0 20 20 2a 2a 20 74 68 61 74 20 68 61 73 20 72 75    ** that has ru
12bd0 6e 2e 20 20 54 68 65 20 74 65 78 74 20 6f 66 20  n.  The text of 
12be0 74 68 65 20 53 51 4c 20 61 6e 64 20 74 68 65 20  the SQL and the 
12bf0 61 6d 6f 75 6e 74 20 6f 66 20 65 6c 61 70 73 65  amount of elapse
12c00 20 74 69 6d 65 20 61 72 65 0a 20 20 2a 2a 20 61   time are.  ** a
12c10 70 70 65 6e 64 65 64 20 74 6f 20 43 41 4c 4c 42  ppended to CALLB
12c20 41 43 4b 20 62 65 66 6f 72 65 20 74 68 65 20 73  ACK before the s
12c30 63 72 69 70 74 20 69 73 20 72 75 6e 2e 0a 20 20  cript is run..  
12c40 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 50 52 4f  */.  case DB_PRO
12c50 46 49 4c 45 3a 20 7b 0a 20 20 20 20 69 66 28 20  FILE: {.    if( 
12c60 6f 62 6a 63 3e 33 20 29 7b 0a 20 20 20 20 20 20  objc>3 ){.      
12c70 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
12c80 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76  (interp, 2, objv
12c90 2c 20 22 3f 43 41 4c 4c 42 41 43 4b 3f 22 29 3b  , "?CALLBACK?");
12ca0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
12cb0 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c  L_ERROR;.    }el
12cc0 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29  se if( objc==2 )
12cd0 7b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d  {.      if( pDb-
12ce0 3e 7a 50 72 6f 66 69 6c 65 20 29 7b 0a 20 20 20  >zProfile ){.   
12cf0 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
12d00 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 44  esult(interp, pD
12d10 62 2d 3e 7a 50 72 6f 66 69 6c 65 2c 20 30 29 3b  b->zProfile, 0);
12d20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
12d30 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  se{.      char *
12d40 7a 50 72 6f 66 69 6c 65 3b 0a 20 20 20 20 20 20  zProfile;.      
12d50 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20 69  int len;.      i
12d60 66 28 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65  f( pDb->zProfile
12d70 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f   ){.        Tcl_
12d80 46 72 65 65 28 70 44 62 2d 3e 7a 50 72 6f 66 69  Free(pDb->zProfi
12d90 6c 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  le);.      }.   
12da0 20 20 20 7a 50 72 6f 66 69 6c 65 20 3d 20 54 63     zProfile = Tc
12db0 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
12dc0 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e  bj(objv[2], &len
12dd0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 50 72  );.      if( zPr
12de0 6f 66 69 6c 65 20 26 26 20 6c 65 6e 3e 30 20 29  ofile && len>0 )
12df0 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a  {.        pDb->z
12e00 50 72 6f 66 69 6c 65 20 3d 20 54 63 6c 5f 41 6c  Profile = Tcl_Al
12e10 6c 6f 63 28 20 6c 65 6e 20 2b 20 31 20 29 3b 0a  loc( len + 1 );.
12e20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70          memcpy(p
12e30 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 2c 20 7a 50  Db->zProfile, zP
12e40 72 6f 66 69 6c 65 2c 20 6c 65 6e 2b 31 29 3b 0a  rofile, len+1);.
12e50 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
12e60 20 20 20 20 20 70 44 62 2d 3e 7a 50 72 6f 66 69       pDb->zProfi
12e70 6c 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  le = 0;.      }.
12e80 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
12e90 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 29 20  ITE_OMIT_TRACE) 
12ea0 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
12eb0 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47  TE_OMIT_FLOATING
12ec0 5f 50 4f 49 4e 54 29 0a 20 20 20 20 20 20 69 66  _POINT).      if
12ed0 28 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 20  ( pDb->zProfile 
12ee0 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e  ){.        pDb->
12ef0 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b  interp = interp;
12f00 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
12f10 5f 70 72 6f 66 69 6c 65 28 70 44 62 2d 3e 64 62  _profile(pDb->db
12f20 2c 20 44 62 50 72 6f 66 69 6c 65 48 61 6e 64 6c  , DbProfileHandl
12f30 65 72 2c 20 70 44 62 29 3b 0a 20 20 20 20 20 20  er, pDb);.      
12f40 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
12f50 71 6c 69 74 65 33 5f 70 72 6f 66 69 6c 65 28 70  qlite3_profile(p
12f60 44 62 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20  Db->db, 0, 0);. 
12f70 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
12f80 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20    }.    break;. 
12f90 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20   }..  /*.  **   
12fa0 20 20 24 64 62 20 72 65 6b 65 79 20 4b 45 59 0a    $db rekey KEY.
12fb0 20 20 2a 2a 0a 20 20 2a 2a 20 43 68 61 6e 67 65    **.  ** Change
12fc0 20 74 68 65 20 65 6e 63 72 79 70 74 69 6f 6e 20   the encryption 
12fd0 6b 65 79 20 6f 6e 20 74 68 65 20 63 75 72 72 65  key on the curre
12fe0 6e 74 6c 79 20 6f 70 65 6e 20 64 61 74 61 62 61  ntly open databa
12ff0 73 65 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  se..  */.  case 
13000 44 42 5f 52 45 4b 45 59 3a 20 7b 0a 20 20 20 20  DB_REKEY: {.    
13010 69 6e 74 20 6e 4b 65 79 3b 0a 20 20 20 20 76 6f  int nKey;.    vo
13020 69 64 20 2a 70 4b 65 79 3b 0a 20 20 20 20 69 66  id *pKey;.    if
13030 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20  ( objc!=3 ){.   
13040 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
13050 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
13060 62 6a 76 2c 20 22 4b 45 59 22 29 3b 0a 20 20 20  bjv, "KEY");.   
13070 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
13080 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ROR;.    }.    p
13090 4b 65 79 20 3d 20 54 63 6c 5f 47 65 74 42 79 74  Key = Tcl_GetByt
130a0 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6f 62  eArrayFromObj(ob
130b0 6a 76 5b 32 5d 2c 20 26 6e 4b 65 79 29 3b 0a 23  jv[2], &nKey);.#
130c0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53  ifdef SQLITE_HAS
130d0 5f 43 4f 44 45 43 0a 20 20 20 20 72 63 20 3d 20  _CODEC.    rc = 
130e0 73 71 6c 69 74 65 33 5f 72 65 6b 65 79 28 70 44  sqlite3_rekey(pD
130f0 62 2d 3e 64 62 2c 20 70 4b 65 79 2c 20 6e 4b 65  b->db, pKey, nKe
13100 79 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  y);.    if( rc )
13110 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65  {.      Tcl_Appe
13120 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
13130 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 72   sqlite3ErrStr(r
13140 63 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 63  c), 0);.      rc
13150 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20   = TCL_ERROR;.  
13160 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 62    }.#endif.    b
13170 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  reak;.  }..  /* 
13180 20 20 20 24 64 62 20 72 65 73 74 6f 72 65 20 3f     $db restore ?
13190 44 41 54 41 42 41 53 45 3f 20 46 49 4c 45 4e 41  DATABASE? FILENA
131a0 4d 45 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 70 65  ME.  **.  ** Ope
131b0 6e 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c  n a database fil
131c0 65 20 6e 61 6d 65 64 20 46 49 4c 45 4e 41 4d 45  e named FILENAME
131d0 2e 20 20 54 72 61 6e 73 66 65 72 20 74 68 65 20  .  Transfer the 
131e0 63 6f 6e 74 65 6e 74 20 0a 20 20 2a 2a 20 6f 66  content .  ** of
131f0 20 46 49 4c 45 4e 41 4d 45 20 69 6e 74 6f 20 74   FILENAME into t
13200 68 65 20 6c 6f 63 61 6c 20 64 61 74 61 62 61 73  he local databas
13210 65 20 44 41 54 41 42 41 53 45 20 28 64 65 66 61  e DATABASE (defa
13220 75 6c 74 3a 20 22 6d 61 69 6e 22 29 2e 0a 20 20  ult: "main")..  
13230 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 52 45 53  */.  case DB_RES
13240 54 4f 52 45 3a 20 7b 0a 20 20 20 20 63 6f 6e 73  TORE: {.    cons
13250 74 20 63 68 61 72 20 2a 7a 53 72 63 46 69 6c 65  t char *zSrcFile
13260 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
13270 20 2a 7a 44 65 73 74 44 62 3b 0a 20 20 20 20 73   *zDestDb;.    s
13280 71 6c 69 74 65 33 20 2a 70 53 72 63 3b 0a 20 20  qlite3 *pSrc;.  
13290 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70    sqlite3_backup
132a0 20 2a 70 42 61 63 6b 75 70 3b 0a 20 20 20 20 69   *pBackup;.    i
132b0 6e 74 20 6e 54 69 6d 65 6f 75 74 20 3d 20 30 3b  nt nTimeout = 0;
132c0 0a 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d  ..    if( objc==
132d0 33 20 29 7b 0a 20 20 20 20 20 20 7a 44 65 73 74  3 ){.      zDest
132e0 44 62 20 3d 20 22 6d 61 69 6e 22 3b 0a 20 20 20  Db = "main";.   
132f0 20 20 20 7a 53 72 63 46 69 6c 65 20 3d 20 54 63     zSrcFile = Tc
13300 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
13310 5b 32 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  [2]);.    }else 
13320 69 66 28 20 6f 62 6a 63 3d 3d 34 20 29 7b 0a 20  if( objc==4 ){. 
13330 20 20 20 20 20 7a 44 65 73 74 44 62 20 3d 20 54       zDestDb = T
13340 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
13350 76 5b 32 5d 29 3b 0a 20 20 20 20 20 20 7a 53 72  v[2]);.      zSr
13360 63 46 69 6c 65 20 3d 20 54 63 6c 5f 47 65 74 53  cFile = Tcl_GetS
13370 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a  tring(objv[3]);.
13380 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
13390 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
133a0 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a  s(interp, 2, obj
133b0 76 2c 20 22 3f 44 41 54 41 42 41 53 45 3f 20 46  v, "?DATABASE? F
133c0 49 4c 45 4e 41 4d 45 22 29 3b 0a 20 20 20 20 20  ILENAME");.     
133d0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
133e0 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  R;.    }.    rc 
133f0 3d 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76  = sqlite3_open_v
13400 32 28 7a 53 72 63 46 69 6c 65 2c 20 26 70 53 72  2(zSrcFile, &pSr
13410 63 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  c, SQLITE_OPEN_R
13420 45 41 44 4f 4e 4c 59 2c 20 30 29 3b 0a 20 20 20  EADONLY, 0);.   
13430 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
13440 4f 4b 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  OK ){.      Tcl_
13450 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
13460 65 72 70 2c 20 22 63 61 6e 6e 6f 74 20 6f 70 65  erp, "cannot ope
13470 6e 20 73 6f 75 72 63 65 20 64 61 74 61 62 61 73  n source databas
13480 65 3a 20 22 2c 0a 20 20 20 20 20 20 20 20 20 20  e: ",.          
13490 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
134a0 70 53 72 63 29 2c 20 28 63 68 61 72 2a 29 30 29  pSrc), (char*)0)
134b0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
134c0 63 6c 6f 73 65 28 70 53 72 63 29 3b 0a 20 20 20  close(pSrc);.   
134d0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
134e0 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ROR;.    }.    p
134f0 42 61 63 6b 75 70 20 3d 20 73 71 6c 69 74 65 33  Backup = sqlite3
13500 5f 62 61 63 6b 75 70 5f 69 6e 69 74 28 70 44 62  _backup_init(pDb
13510 2d 3e 64 62 2c 20 7a 44 65 73 74 44 62 2c 20 70  ->db, zDestDb, p
13520 53 72 63 2c 20 22 6d 61 69 6e 22 29 3b 0a 20 20  Src, "main");.  
13530 20 20 69 66 28 20 70 42 61 63 6b 75 70 3d 3d 30    if( pBackup==0
13540 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70   ){.      Tcl_Ap
13550 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
13560 70 2c 20 22 72 65 73 74 6f 72 65 20 66 61 69 6c  p, "restore fail
13570 65 64 3a 20 22 2c 0a 20 20 20 20 20 20 20 20 20  ed: ",.         
13580 20 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67    sqlite3_errmsg
13590 28 70 44 62 2d 3e 64 62 29 2c 20 28 63 68 61 72  (pDb->db), (char
135a0 2a 29 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  *)0);.      sqli
135b0 74 65 33 5f 63 6c 6f 73 65 28 70 53 72 63 29 3b  te3_close(pSrc);
135c0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
135d0 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
135e0 20 20 20 77 68 69 6c 65 28 20 28 72 63 20 3d 20     while( (rc = 
135f0 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f 73  sqlite3_backup_s
13600 74 65 70 28 70 42 61 63 6b 75 70 2c 31 30 30 29  tep(pBackup,100)
13610 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20  )==SQLITE_OK.   
13620 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 72 63             || rc
13630 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b  ==SQLITE_BUSY ){
13640 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
13650 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20  QLITE_BUSY ){.  
13660 20 20 20 20 20 20 69 66 28 20 6e 54 69 6d 65 6f        if( nTimeo
13670 75 74 2b 2b 20 3e 3d 20 33 20 29 20 62 72 65 61  ut++ >= 3 ) brea
13680 6b 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  k;.        sqlit
13690 65 33 5f 73 6c 65 65 70 28 31 30 30 29 3b 0a 20  e3_sleep(100);. 
136a0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
136b0 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f   sqlite3_backup_
136c0 66 69 6e 69 73 68 28 70 42 61 63 6b 75 70 29 3b  finish(pBackup);
136d0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
136e0 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20  ITE_DONE ){.    
136f0 20 20 72 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20    rc = TCL_OK;. 
13700 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d     }else if( rc=
13710 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 7c 7c 20  =SQLITE_BUSY || 
13720 72 63 3d 3d 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  rc==SQLITE_LOCKE
13730 44 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41  D ){.      Tcl_A
13740 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
13750 72 70 2c 20 22 72 65 73 74 6f 72 65 20 66 61 69  rp, "restore fai
13760 6c 65 64 3a 20 73 6f 75 72 63 65 20 64 61 74 61  led: source data
13770 62 61 73 65 20 62 75 73 79 22 2c 0a 20 20 20 20  base busy",.    
13780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13790 20 20 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20     (char*)0);.  
137a0 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45 52 52      rc = TCL_ERR
137b0 4f 52 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  OR;.    }else{. 
137c0 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
137d0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 72  esult(interp, "r
137e0 65 73 74 6f 72 65 20 66 61 69 6c 65 64 3a 20 22  estore failed: "
137f0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  ,.           sql
13800 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d  ite3_errmsg(pDb-
13810 3e 64 62 29 2c 20 28 63 68 61 72 2a 29 30 29 3b  >db), (char*)0);
13820 0a 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f  .      rc = TCL_
13830 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
13840 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70   sqlite3_close(p
13850 53 72 63 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b  Src);.    break;
13860 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
13870 20 20 20 20 24 64 62 20 73 74 61 74 75 73 20 28      $db status (
13880 73 74 65 70 7c 73 6f 72 74 7c 61 75 74 6f 69 6e  step|sort|autoin
13890 64 65 78 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 44  dex).  **.  ** D
138a0 69 73 70 6c 61 79 20 53 51 4c 49 54 45 5f 53 54  isplay SQLITE_ST
138b0 4d 54 53 54 41 54 55 53 5f 46 55 4c 4c 53 43 41  MTSTATUS_FULLSCA
138c0 4e 5f 53 54 45 50 20 6f 72 20 0a 20 20 2a 2a 20  N_STEP or .  ** 
138d0 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55  SQLITE_STMTSTATU
138e0 53 5f 53 4f 52 54 20 66 6f 72 20 74 68 65 20 6d  S_SORT for the m
138f0 6f 73 74 20 72 65 63 65 6e 74 20 65 76 61 6c 2e  ost recent eval.
13900 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f  .  */.  case DB_
13910 53 54 41 54 55 53 3a 20 7b 0a 20 20 20 20 69 6e  STATUS: {.    in
13920 74 20 76 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  t v;.    const c
13930 68 61 72 20 2a 7a 4f 70 3b 0a 20 20 20 20 69 66  har *zOp;.    if
13940 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20  ( objc!=3 ){.   
13950 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
13960 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
13970 62 6a 76 2c 20 22 28 73 74 65 70 7c 73 6f 72 74  bjv, "(step|sort
13980 7c 61 75 74 6f 69 6e 64 65 78 29 22 29 3b 0a 20  |autoindex)");. 
13990 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
139a0 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
139b0 20 7a 4f 70 20 3d 20 54 63 6c 5f 47 65 74 53 74   zOp = Tcl_GetSt
139c0 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20  ring(objv[2]);. 
139d0 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4f     if( strcmp(zO
139e0 70 2c 20 22 73 74 65 70 22 29 3d 3d 30 20 29 7b  p, "step")==0 ){
139f0 0a 20 20 20 20 20 20 76 20 3d 20 70 44 62 2d 3e  .      v = pDb->
13a00 6e 53 74 65 70 3b 0a 20 20 20 20 7d 65 6c 73 65  nStep;.    }else
13a10 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4f 70 2c   if( strcmp(zOp,
13a20 20 22 73 6f 72 74 22 29 3d 3d 30 20 29 7b 0a 20   "sort")==0 ){. 
13a30 20 20 20 20 20 76 20 3d 20 70 44 62 2d 3e 6e 53       v = pDb->nS
13a40 6f 72 74 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  ort;.    }else i
13a50 66 28 20 73 74 72 63 6d 70 28 7a 4f 70 2c 20 22  f( strcmp(zOp, "
13a60 61 75 74 6f 69 6e 64 65 78 22 29 3d 3d 30 20 29  autoindex")==0 )
13a70 7b 0a 20 20 20 20 20 20 76 20 3d 20 70 44 62 2d  {.      v = pDb-
13a80 3e 6e 49 6e 64 65 78 3b 0a 20 20 20 20 7d 65 6c  >nIndex;.    }el
13a90 73 65 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70  se{.      Tcl_Ap
13aa0 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
13ab0 70 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  p, .            
13ac0 22 62 61 64 20 61 72 67 75 6d 65 6e 74 3a 20 73  "bad argument: s
13ad0 68 6f 75 6c 64 20 62 65 20 61 75 74 6f 69 6e 64  hould be autoind
13ae0 65 78 2c 20 73 74 65 70 2c 20 6f 72 20 73 6f 72  ex, step, or sor
13af0 74 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  t", .           
13b00 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20   (char*)0);.    
13b10 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
13b20 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63  OR;.    }.    Tc
13b30 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
13b40 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e  nterp, Tcl_NewIn
13b50 74 4f 62 6a 28 76 29 29 3b 0a 20 20 20 20 62 72  tObj(v));.    br
13b60 65 61 6b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  eak;.  }.  .  /*
13b70 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20 74 69  .  **     $db ti
13b80 6d 65 6f 75 74 20 4d 49 4c 4c 45 53 45 43 4f 4e  meout MILLESECON
13b90 44 53 0a 20 20 2a 2a 0a 20 20 2a 2a 20 44 65 6c  DS.  **.  ** Del
13ba0 61 79 20 66 6f 72 20 74 68 65 20 6e 75 6d 62 65  ay for the numbe
13bb0 72 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64  r of millisecond
13bc0 73 20 73 70 65 63 69 66 69 65 64 20 77 68 65 6e  s specified when
13bd0 20 61 20 66 69 6c 65 20 69 73 20 6c 6f 63 6b 65   a file is locke
13be0 64 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  d..  */.  case D
13bf0 42 5f 54 49 4d 45 4f 55 54 3a 20 7b 0a 20 20 20  B_TIMEOUT: {.   
13c00 20 69 6e 74 20 6d 73 3b 0a 20 20 20 20 69 66 28   int ms;.    if(
13c10 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20   objc!=3 ){.    
13c20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
13c30 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62  gs(interp, 2, ob
13c40 6a 76 2c 20 22 4d 49 4c 4c 49 53 45 43 4f 4e 44  jv, "MILLISECOND
13c50 53 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  S");.      retur
13c60 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
13c70 20 7d 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 47   }.    if( Tcl_G
13c80 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
13c90 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 6d  erp, objv[2], &m
13ca0 73 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  s) ) return TCL_
13cb0 45 52 52 4f 52 3b 0a 20 20 20 20 73 71 6c 69 74  ERROR;.    sqlit
13cc0 65 33 5f 62 75 73 79 5f 74 69 6d 65 6f 75 74 28  e3_busy_timeout(
13cd0 70 44 62 2d 3e 64 62 2c 20 6d 73 29 3b 0a 20 20  pDb->db, ms);.  
13ce0 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 0a    break;.  }.  .
13cf0 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64    /*.  **     $d
13d00 62 20 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73 0a  b total_changes.
13d10 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e    **.  ** Return
13d20 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
13d30 6f 77 73 20 74 68 61 74 20 77 65 72 65 20 6d 6f  ows that were mo
13d40 64 69 66 69 65 64 2c 20 69 6e 73 65 72 74 65 64  dified, inserted
13d50 2c 20 6f 72 20 64 65 6c 65 74 65 64 20 0a 20 20  , or deleted .  
13d60 2a 2a 20 73 69 6e 63 65 20 74 68 65 20 64 61 74  ** since the dat
13d70 61 62 61 73 65 20 68 61 6e 64 6c 65 20 77 61 73  abase handle was
13d80 20 63 72 65 61 74 65 64 2e 0a 20 20 2a 2f 0a 20   created..  */. 
13d90 20 63 61 73 65 20 44 42 5f 54 4f 54 41 4c 5f 43   case DB_TOTAL_C
13da0 48 41 4e 47 45 53 3a 20 7b 0a 20 20 20 20 54 63  HANGES: {.    Tc
13db0 6c 5f 4f 62 6a 20 2a 70 52 65 73 75 6c 74 3b 0a  l_Obj *pResult;.
13dc0 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20      if( objc!=2 
13dd0 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f  ){.      Tcl_Wro
13de0 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
13df0 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 22 29 3b 0a  , 2, objv, "");.
13e00 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
13e10 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
13e20 20 20 70 52 65 73 75 6c 74 20 3d 20 54 63 6c 5f    pResult = Tcl_
13e30 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  GetObjResult(int
13e40 65 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65  erp);.    Tcl_Se
13e50 74 49 6e 74 4f 62 6a 28 70 52 65 73 75 6c 74 2c  tIntObj(pResult,
13e60 20 73 71 6c 69 74 65 33 5f 74 6f 74 61 6c 5f 63   sqlite3_total_c
13e70 68 61 6e 67 65 73 28 70 44 62 2d 3e 64 62 29 29  hanges(pDb->db))
13e80 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  ;.    break;.  }
13e90 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 74 72  ..  /*    $db tr
13ea0 61 63 65 20 3f 43 41 4c 4c 42 41 43 4b 3f 0a 20  ace ?CALLBACK?. 
13eb0 20 2a 2a 0a 20 20 2a 2a 20 4d 61 6b 65 20 61 72   **.  ** Make ar
13ec0 72 61 6e 67 65 6d 65 6e 74 73 20 74 6f 20 69 6e  rangements to in
13ed0 76 6f 6b 65 20 74 68 65 20 43 41 4c 4c 42 41 43  voke the CALLBAC
13ee0 4b 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 65 61  K routine for ea
13ef0 63 68 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  ch SQL statement
13f00 0a 20 20 2a 2a 20 74 68 61 74 20 69 73 20 65 78  .  ** that is ex
13f10 65 63 75 74 65 64 2e 20 20 54 68 65 20 74 65 78  ecuted.  The tex
13f20 74 20 6f 66 20 74 68 65 20 53 51 4c 20 69 73 20  t of the SQL is 
13f30 61 70 70 65 6e 64 65 64 20 74 6f 20 43 41 4c 4c  appended to CALL
13f40 42 41 43 4b 20 62 65 66 6f 72 65 0a 20 20 2a 2a  BACK before.  **
13f50 20 69 74 20 69 73 20 65 78 65 63 75 74 65 64 2e   it is executed.
13f60 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f  .  */.  case DB_
13f70 54 52 41 43 45 3a 20 7b 0a 20 20 20 20 69 66 28  TRACE: {.    if(
13f80 20 6f 62 6a 63 3e 33 20 29 7b 0a 20 20 20 20 20   objc>3 ){.     
13f90 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
13fa0 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a  s(interp, 2, obj
13fb0 76 2c 20 22 3f 43 41 4c 4c 42 41 43 4b 3f 22 29  v, "?CALLBACK?")
13fc0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
13fd0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65  CL_ERROR;.    }e
13fe0 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20  lse if( objc==2 
13ff0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62  ){.      if( pDb
14000 2d 3e 7a 54 72 61 63 65 20 29 7b 0a 20 20 20 20  ->zTrace ){.    
14010 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
14020 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 44 62  sult(interp, pDb
14030 2d 3e 7a 54 72 61 63 65 2c 20 30 29 3b 0a 20 20  ->zTrace, 0);.  
14040 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
14050 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 72  .      char *zTr
14060 61 63 65 3b 0a 20 20 20 20 20 20 69 6e 74 20 6c  ace;.      int l
14070 65 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44  en;.      if( pD
14080 62 2d 3e 7a 54 72 61 63 65 20 29 7b 0a 20 20 20  b->zTrace ){.   
14090 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44       Tcl_Free(pD
140a0 62 2d 3e 7a 54 72 61 63 65 29 3b 0a 20 20 20 20  b->zTrace);.    
140b0 20 20 7d 0a 20 20 20 20 20 20 7a 54 72 61 63 65    }.      zTrace
140c0 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
140d0 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c  FromObj(objv[2],
140e0 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69 66   &len);.      if
140f0 28 20 7a 54 72 61 63 65 20 26 26 20 6c 65 6e 3e  ( zTrace && len>
14100 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62  0 ){.        pDb
14110 2d 3e 7a 54 72 61 63 65 20 3d 20 54 63 6c 5f 41  ->zTrace = Tcl_A
14120 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20 31 20 29 3b  lloc( len + 1 );
14130 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
14140 70 44 62 2d 3e 7a 54 72 61 63 65 2c 20 7a 54 72  pDb->zTrace, zTr
14150 61 63 65 2c 20 6c 65 6e 2b 31 29 3b 0a 20 20 20  ace, len+1);.   
14160 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
14170 20 20 70 44 62 2d 3e 7a 54 72 61 63 65 20 3d 20    pDb->zTrace = 
14180 30 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 20 21  0;.      }.#if !
14190 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
141a0 4d 49 54 5f 54 52 41 43 45 29 20 26 26 20 21 64  MIT_TRACE) && !d
141b0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
141c0 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e  IT_FLOATING_POIN
141d0 54 29 0a 20 20 20 20 20 20 69 66 28 20 70 44 62  T).      if( pDb
141e0 2d 3e 7a 54 72 61 63 65 20 29 7b 0a 20 20 20 20  ->zTrace ){.    
141f0 20 20 20 20 70 44 62 2d 3e 69 6e 74 65 72 70 20      pDb->interp 
14200 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 20 20  = interp;.      
14210 20 20 73 71 6c 69 74 65 33 5f 74 72 61 63 65 28    sqlite3_trace(
14220 70 44 62 2d 3e 64 62 2c 20 44 62 54 72 61 63 65  pDb->db, DbTrace
14230 48 61 6e 64 6c 65 72 2c 20 70 44 62 29 3b 0a 20  Handler, pDb);. 
14240 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
14250 20 20 20 20 73 71 6c 69 74 65 33 5f 74 72 61 63      sqlite3_trac
14260 65 28 70 44 62 2d 3e 64 62 2c 20 30 2c 20 30 29  e(pDb->db, 0, 0)
14270 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
14280 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b  .    }.    break
14290 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24  ;.  }..  /*    $
142a0 64 62 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 5b  db transaction [
142b0 2d 64 65 66 65 72 72 65 64 7c 2d 69 6d 6d 65 64  -deferred|-immed
142c0 69 61 74 65 7c 2d 65 78 63 6c 75 73 69 76 65 5d  iate|-exclusive]
142d0 20 53 43 52 49 50 54 0a 20 20 2a 2a 0a 20 20 2a   SCRIPT.  **.  *
142e0 2a 20 53 74 61 72 74 20 61 20 6e 65 77 20 74 72  * Start a new tr
142f0 61 6e 73 61 63 74 69 6f 6e 20 28 69 66 20 77 65  ansaction (if we
14300 20 61 72 65 20 6e 6f 74 20 61 6c 72 65 61 64 79   are not already
14310 20 69 6e 20 74 68 65 20 6d 69 64 73 74 20 6f 66   in the midst of
14320 20 61 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74   a.  ** transact
14330 69 6f 6e 29 20 61 6e 64 20 65 78 65 63 75 74 65  ion) and execute
14340 20 74 68 65 20 54 43 4c 20 73 63 72 69 70 74 20   the TCL script 
14350 53 43 52 49 50 54 2e 20 20 41 66 74 65 72 20 53  SCRIPT.  After S
14360 43 52 49 50 54 0a 20 20 2a 2a 20 63 6f 6d 70 6c  CRIPT.  ** compl
14370 65 74 65 73 2c 20 65 69 74 68 65 72 20 63 6f 6d  etes, either com
14380 6d 69 74 20 74 68 65 20 74 72 61 6e 73 61 63 74  mit the transact
14390 69 6f 6e 20 6f 72 20 72 6f 6c 6c 20 69 74 20 62  ion or roll it b
143a0 61 63 6b 20 69 66 20 53 43 52 49 50 54 0a 20 20  ack if SCRIPT.  
143b0 2a 2a 20 74 68 72 6f 77 73 20 61 6e 20 65 78 63  ** throws an exc
143c0 65 70 74 69 6f 6e 2e 20 20 4f 72 20 69 66 20 6e  eption.  Or if n
143d0 6f 20 6e 65 77 20 74 72 61 6e 73 61 74 69 6f 6e  o new transation
143e0 20 77 61 73 20 73 74 61 72 74 65 64 2c 20 64 6f   was started, do
143f0 20 6e 6f 74 68 69 6e 67 2e 0a 20 20 2a 2a 20 70   nothing..  ** p
14400 61 73 73 20 74 68 65 20 65 78 63 65 70 74 69 6f  ass the exceptio
14410 6e 20 6f 6e 20 75 70 20 74 68 65 20 73 74 61 63  n on up the stac
14420 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69  k..  **.  ** Thi
14430 73 20 63 6f 6d 6d 61 6e 64 20 77 61 73 20 69 6e  s command was in
14440 73 70 69 72 65 64 20 62 79 20 44 61 76 65 20 54  spired by Dave T
14450 68 6f 6d 61 73 27 73 20 74 61 6c 6b 20 6f 6e 20  homas's talk on 
14460 52 75 62 79 20 61 74 20 74 68 65 0a 20 20 2a 2a  Ruby at the.  **
14470 20 32 30 30 35 20 4f 27 52 65 69 6c 6c 79 20 4f   2005 O'Reilly O
14480 70 65 6e 20 53 6f 75 72 63 65 20 43 6f 6e 76 65  pen Source Conve
14490 6e 74 69 6f 6e 20 28 4f 53 43 4f 4e 29 2e 0a 20  ntion (OSCON).. 
144a0 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 54 52   */.  case DB_TR
144b0 41 4e 53 41 43 54 49 4f 4e 3a 20 7b 0a 20 20 20  ANSACTION: {.   
144c0 20 54 63 6c 5f 4f 62 6a 20 2a 70 53 63 72 69 70   Tcl_Obj *pScrip
144d0 74 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  t;.    const cha
144e0 72 20 2a 7a 42 65 67 69 6e 20 3d 20 22 53 41 56  r *zBegin = "SAV
144f0 45 50 4f 49 4e 54 20 5f 74 63 6c 5f 74 72 61 6e  EPOINT _tcl_tran
14500 73 61 63 74 69 6f 6e 22 3b 0a 20 20 20 20 69 66  saction";.    if
14510 28 20 6f 62 6a 63 21 3d 33 20 26 26 20 6f 62 6a  ( objc!=3 && obj
14520 63 21 3d 34 20 29 7b 0a 20 20 20 20 20 20 54 63  c!=4 ){.      Tc
14530 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
14540 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
14550 22 5b 54 59 50 45 5d 20 53 43 52 49 50 54 22 29  "[TYPE] SCRIPT")
14560 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
14570 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
14580 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e 6e 54  .    if( pDb->nT
14590 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 30 20 26 26  ransaction==0 &&
145a0 20 6f 62 6a 63 3d 3d 34 20 29 7b 0a 20 20 20 20   objc==4 ){.    
145b0 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63    static const c
145c0 68 61 72 20 2a 54 54 59 50 45 5f 73 74 72 73 5b  har *TTYPE_strs[
145d0 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 22 64  ] = {.        "d
145e0 65 66 65 72 72 65 64 22 2c 20 20 20 22 65 78 63  eferred",   "exc
145f0 6c 75 73 69 76 65 22 2c 20 20 22 69 6d 6d 65 64  lusive",  "immed
14600 69 61 74 65 22 2c 20 30 0a 20 20 20 20 20 20 7d  iate", 0.      }
14610 3b 0a 20 20 20 20 20 20 65 6e 75 6d 20 54 54 59  ;.      enum TTY
14620 50 45 5f 65 6e 75 6d 20 7b 0a 20 20 20 20 20 20  PE_enum {.      
14630 20 20 54 54 59 50 45 5f 44 45 46 45 52 52 45 44    TTYPE_DEFERRED
14640 2c 20 54 54 59 50 45 5f 45 58 43 4c 55 53 49 56  , TTYPE_EXCLUSIV
14650 45 2c 20 54 54 59 50 45 5f 49 4d 4d 45 44 49 41  E, TTYPE_IMMEDIA
14660 54 45 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20  TE.      };.    
14670 20 20 69 6e 74 20 74 74 79 70 65 3b 0a 20 20 20    int ttype;.   
14680 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e     if( Tcl_GetIn
14690 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  dexFromObj(inter
146a0 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 54 54 59 50  p, objv[2], TTYP
146b0 45 5f 73 74 72 73 2c 20 22 74 72 61 6e 73 61 63  E_strs, "transac
146c0 74 69 6f 6e 20 74 79 70 65 22 2c 0a 20 20 20 20  tion type",.    
146d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
146e0 20 20 20 20 20 20 20 20 20 20 30 2c 20 26 74 74            0, &tt
146f0 79 70 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ype) ){.        
14700 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
14710 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
14720 73 77 69 74 63 68 28 20 28 65 6e 75 6d 20 54 54  switch( (enum TT
14730 59 50 45 5f 65 6e 75 6d 29 74 74 79 70 65 20 29  YPE_enum)ttype )
14740 7b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 54  {.        case T
14750 54 59 50 45 5f 44 45 46 45 52 52 45 44 3a 20 20  TYPE_DEFERRED:  
14760 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 3b 20 20    /* no-op */;  
14770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
14780 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61  reak;.        ca
14790 73 65 20 54 54 59 50 45 5f 45 58 43 4c 55 53 49  se TTYPE_EXCLUSI
147a0 56 45 3a 20 20 20 7a 42 65 67 69 6e 20 3d 20 22  VE:   zBegin = "
147b0 42 45 47 49 4e 20 45 58 43 4c 55 53 49 56 45 22  BEGIN EXCLUSIVE"
147c0 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  ;  break;.      
147d0 20 20 63 61 73 65 20 54 54 59 50 45 5f 49 4d 4d    case TTYPE_IMM
147e0 45 44 49 41 54 45 3a 20 20 20 7a 42 65 67 69 6e  EDIATE:   zBegin
147f0 20 3d 20 22 42 45 47 49 4e 20 49 4d 4d 45 44 49   = "BEGIN IMMEDI
14800 41 54 45 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20  ATE";  break;.  
14810 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
14820 70 53 63 72 69 70 74 20 3d 20 6f 62 6a 76 5b 6f  pScript = objv[o
14830 62 6a 63 2d 31 5d 3b 0a 0a 20 20 20 20 2f 2a 20  bjc-1];..    /* 
14840 52 75 6e 20 74 68 65 20 53 51 4c 69 74 65 20 42  Run the SQLite B
14850 45 47 49 4e 20 63 6f 6d 6d 61 6e 64 20 74 6f 20  EGIN command to 
14860 6f 70 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69  open a transacti
14870 6f 6e 20 6f 72 20 73 61 76 65 70 6f 69 6e 74 2e  on or savepoint.
14880 20 2a 2f 0a 20 20 20 20 70 44 62 2d 3e 64 69 73   */.    pDb->dis
14890 61 62 6c 65 41 75 74 68 2b 2b 3b 0a 20 20 20 20  ableAuth++;.    
148a0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65  rc = sqlite3_exe
148b0 63 28 70 44 62 2d 3e 64 62 2c 20 7a 42 65 67 69  c(pDb->db, zBegi
148c0 6e 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  n, 0, 0, 0);.   
148d0 20 70 44 62 2d 3e 64 69 73 61 62 6c 65 41 75 74   pDb->disableAut
148e0 68 2d 2d 3b 0a 20 20 20 20 69 66 28 20 72 63 21  h--;.    if( rc!
148f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
14900 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
14910 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 73 71 6c  sult(interp, sql
14920 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d  ite3_errmsg(pDb-
14930 3e 64 62 29 2c 20 30 29 3b 0a 20 20 20 20 20 20  >db), 0);.      
14940 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
14950 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 44 62 2d  ;.    }.    pDb-
14960 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2b 2b 3b  >nTransaction++;
14970 0a 0a 20 20 20 20 2f 2a 20 49 66 20 75 73 69 6e  ..    /* If usin
14980 67 20 4e 52 45 2c 20 73 63 68 65 64 75 6c 65 20  g NRE, schedule 
14990 61 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20 69 6e  a callback to in
149a0 76 6f 6b 65 20 74 68 65 20 73 63 72 69 70 74 20  voke the script 
149b0 70 53 63 72 69 70 74 2c 20 74 68 65 6e 0a 20 20  pScript, then.  
149c0 20 20 2a 2a 20 61 20 73 65 63 6f 6e 64 20 63 61    ** a second ca
149d0 6c 6c 62 61 63 6b 20 74 6f 20 63 6f 6d 6d 69 74  llback to commit
149e0 20 28 6f 72 20 72 6f 6c 6c 62 61 63 6b 29 20 74   (or rollback) t
149f0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  he transaction o
14a00 72 20 73 61 76 65 70 6f 69 6e 74 0a 20 20 20 20  r savepoint.    
14a10 2a 2a 20 6f 70 65 6e 65 64 20 61 62 6f 76 65 2e  ** opened above.
14a20 20 49 66 20 6e 6f 74 20 75 73 69 6e 67 20 4e 52   If not using NR
14a30 45 2c 20 65 76 61 6c 75 61 74 65 20 74 68 65 20  E, evaluate the 
14a40 73 63 72 69 70 74 20 64 69 72 65 63 74 6c 79 2c  script directly,
14a50 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 63 61 6c   then.    ** cal
14a60 6c 20 66 75 6e 63 74 69 6f 6e 20 44 62 54 72 61  l function DbTra
14a70 6e 73 50 6f 73 74 43 6d 64 28 29 20 74 6f 20 63  nsPostCmd() to c
14a80 6f 6d 6d 69 74 20 28 6f 72 20 72 6f 6c 6c 62 61  ommit (or rollba
14a90 63 6b 29 20 74 68 65 20 74 72 61 6e 73 61 63 74  ck) the transact
14aa0 69 6f 6e 20 0a 20 20 20 20 2a 2a 20 6f 72 20 73  ion .    ** or s
14ab0 61 76 65 70 6f 69 6e 74 2e 20 20 2a 2f 0a 20 20  avepoint.  */.  
14ac0 20 20 69 66 28 20 44 62 55 73 65 4e 72 65 28 29    if( DbUseNre()
14ad0 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 4e 52   ){.      Tcl_NR
14ae0 41 64 64 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65  AddCallback(inte
14af0 72 70 2c 20 44 62 54 72 61 6e 73 50 6f 73 74 43  rp, DbTransPostC
14b00 6d 64 2c 20 63 64 2c 20 30 2c 20 30 2c 20 30 29  md, cd, 0, 0, 0)
14b10 3b 0a 20 20 20 20 20 20 54 63 6c 5f 4e 52 45 76  ;.      Tcl_NREv
14b20 61 6c 4f 62 6a 28 69 6e 74 65 72 70 2c 20 70 53  alObj(interp, pS
14b30 63 72 69 70 74 2c 20 30 29 3b 0a 20 20 20 20 7d  cript, 0);.    }
14b40 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
14b50 20 44 62 54 72 61 6e 73 50 6f 73 74 43 6d 64 28   DbTransPostCmd(
14b60 26 63 64 2c 20 69 6e 74 65 72 70 2c 20 54 63 6c  &cd, interp, Tcl
14b70 5f 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72  _EvalObjEx(inter
14b80 70 2c 20 70 53 63 72 69 70 74 2c 20 30 29 29 3b  p, pScript, 0));
14b90 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b  .    }.    break
14ba0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ;.  }..  /*.  **
14bb0 20 20 20 20 24 64 62 20 75 6e 6c 6f 63 6b 5f 6e      $db unlock_n
14bc0 6f 74 69 66 79 20 3f 73 63 72 69 70 74 3f 0a 20  otify ?script?. 
14bd0 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 55 4e   */.  case DB_UN
14be0 4c 4f 43 4b 5f 4e 4f 54 49 46 59 3a 20 7b 0a 23  LOCK_NOTIFY: {.#
14bf0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  ifndef SQLITE_EN
14c00 41 42 4c 45 5f 55 4e 4c 4f 43 4b 5f 4e 4f 54 49  ABLE_UNLOCK_NOTI
14c10 46 59 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  FY.    Tcl_Appen
14c20 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
14c30 22 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79 20 6e  "unlock_notify n
14c40 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20  ot available in 
14c50 74 68 69 73 20 62 75 69 6c 64 22 2c 20 30 29 3b  this build", 0);
14c60 0a 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45 52  .    rc = TCL_ER
14c70 52 4f 52 3b 0a 23 65 6c 73 65 0a 20 20 20 20 69  ROR;.#else.    i
14c80 66 28 20 6f 62 6a 63 21 3d 32 20 26 26 20 6f 62  f( objc!=2 && ob
14c90 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 54  jc!=3 ){.      T
14ca0 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
14cb0 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c  interp, 2, objv,
14cc0 20 22 3f 53 43 52 49 50 54 3f 22 29 3b 0a 20 20   "?SCRIPT?");.  
14cd0 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45 52 52      rc = TCL_ERR
14ce0 4f 52 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  OR;.    }else{. 
14cf0 20 20 20 20 20 76 6f 69 64 20 28 2a 78 4e 6f 74       void (*xNot
14d00 69 66 79 29 28 76 6f 69 64 20 2a 2a 2c 20 69 6e  ify)(void **, in
14d10 74 29 20 3d 20 30 3b 0a 20 20 20 20 20 20 76 6f  t) = 0;.      vo
14d20 69 64 20 2a 70 4e 6f 74 69 66 79 41 72 67 20 3d  id *pNotifyArg =
14d30 20 30 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70   0;..      if( p
14d40 44 62 2d 3e 70 55 6e 6c 6f 63 6b 4e 6f 74 69 66  Db->pUnlockNotif
14d50 79 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c  y ){.        Tcl
14d60 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 44  _DecrRefCount(pD
14d70 62 2d 3e 70 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79  b->pUnlockNotify
14d80 29 3b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e  );.        pDb->
14d90 70 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 20 3d 20  pUnlockNotify = 
14da0 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 0a 20 20  0;.      }.  .  
14db0 20 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d 33 20      if( objc==3 
14dc0 29 7b 0a 20 20 20 20 20 20 20 20 78 4e 6f 74 69  ){.        xNoti
14dd0 66 79 20 3d 20 44 62 55 6e 6c 6f 63 6b 4e 6f 74  fy = DbUnlockNot
14de0 69 66 79 3b 0a 20 20 20 20 20 20 20 20 70 4e 6f  ify;.        pNo
14df0 74 69 66 79 41 72 67 20 3d 20 28 76 6f 69 64 20  tifyArg = (void 
14e00 2a 29 70 44 62 3b 0a 20 20 20 20 20 20 20 20 70  *)pDb;.        p
14e10 44 62 2d 3e 70 55 6e 6c 6f 63 6b 4e 6f 74 69 66  Db->pUnlockNotif
14e20 79 20 3d 20 6f 62 6a 76 5b 32 5d 3b 0a 20 20 20  y = objv[2];.   
14e30 20 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66       Tcl_IncrRef
14e40 43 6f 75 6e 74 28 70 44 62 2d 3e 70 55 6e 6c 6f  Count(pDb->pUnlo
14e50 63 6b 4e 6f 74 69 66 79 29 3b 0a 20 20 20 20 20  ckNotify);.     
14e60 20 7d 0a 20 20 0a 20 20 20 20 20 20 69 66 28 20   }.  .      if( 
14e70 73 71 6c 69 74 65 33 5f 75 6e 6c 6f 63 6b 5f 6e  sqlite3_unlock_n
14e80 6f 74 69 66 79 28 70 44 62 2d 3e 64 62 2c 20 78  otify(pDb->db, x
14e90 4e 6f 74 69 66 79 2c 20 70 4e 6f 74 69 66 79 41  Notify, pNotifyA
14ea0 72 67 29 20 29 7b 0a 20 20 20 20 20 20 20 20 54  rg) ){.        T
14eb0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
14ec0 69 6e 74 65 72 70 2c 20 73 71 6c 69 74 65 33 5f  interp, sqlite3_
14ed0 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c  errmsg(pDb->db),
14ee0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20   0);.        rc 
14ef0 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  = TCL_ERROR;.   
14f00 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69     }.    }.#endi
14f10 66 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  f.    break;.  }
14f20 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 24  ..  /*.  **    $
14f30 64 62 20 77 61 6c 5f 68 6f 6f 6b 20 3f 73 63 72  db wal_hook ?scr
14f40 69 70 74 3f 0a 20 20 2a 2a 20 20 20 20 24 64 62  ipt?.  **    $db
14f50 20 75 70 64 61 74 65 5f 68 6f 6f 6b 20 3f 73 63   update_hook ?sc
14f60 72 69 70 74 3f 0a 20 20 2a 2a 20 20 20 20 24 64  ript?.  **    $d
14f70 62 20 72 6f 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 20  b rollback_hook 
14f80 3f 73 63 72 69 70 74 3f 0a 20 20 2a 2f 0a 20 20  ?script?.  */.  
14f90 63 61 73 65 20 44 42 5f 57 41 4c 5f 48 4f 4f 4b  case DB_WAL_HOOK
14fa0 3a 20 0a 20 20 63 61 73 65 20 44 42 5f 55 50 44  : .  case DB_UPD
14fb0 41 54 45 5f 48 4f 4f 4b 3a 20 0a 20 20 63 61 73  ATE_HOOK: .  cas
14fc0 65 20 44 42 5f 52 4f 4c 4c 42 41 43 4b 5f 48 4f  e DB_ROLLBACK_HO
14fd0 4f 4b 3a 20 7b 0a 0a 20 20 20 20 2f 2a 20 73 65  OK: {..    /* se
14fe0 74 20 70 70 48 6f 6f 6b 20 74 6f 20 70 6f 69 6e  t ppHook to poin
14ff0 74 20 61 74 20 70 55 70 64 61 74 65 48 6f 6f 6b  t at pUpdateHook
15000 20 6f 72 20 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f   or pRollbackHoo
15010 6b 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20  k, depending on 
15020 0a 20 20 20 20 2a 2a 20 77 68 65 74 68 65 72 20  .    ** whether 
15030 5b 24 64 62 20 75 70 64 61 74 65 5f 68 6f 6f 6b  [$db update_hook
15040 5d 20 6f 72 20 5b 24 64 62 20 72 6f 6c 6c 62 61  ] or [$db rollba
15050 63 6b 5f 68 6f 6f 6b 5d 20 77 61 73 20 69 6e 76  ck_hook] was inv
15060 6f 6b 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  oked..    */.   
15070 20 54 63 6c 5f 4f 62 6a 20 2a 2a 70 70 48 6f 6f   Tcl_Obj **ppHoo
15080 6b 3b 20 0a 20 20 20 20 69 66 28 20 63 68 6f 69  k; .    if( choi
15090 63 65 3d 3d 44 42 5f 55 50 44 41 54 45 5f 48 4f  ce==DB_UPDATE_HO
150a0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 70 48 6f  OK ){.      ppHo
150b0 6f 6b 20 3d 20 26 70 44 62 2d 3e 70 55 70 64 61  ok = &pDb->pUpda
150c0 74 65 48 6f 6f 6b 3b 0a 20 20 20 20 7d 65 6c 73  teHook;.    }els
150d0 65 20 69 66 28 20 63 68 6f 69 63 65 3d 3d 44 42  e if( choice==DB
150e0 5f 57 41 4c 5f 48 4f 4f 4b 20 29 7b 0a 20 20 20  _WAL_HOOK ){.   
150f0 20 20 20 70 70 48 6f 6f 6b 20 3d 20 26 70 44 62     ppHook = &pDb
15100 2d 3e 70 57 61 6c 48 6f 6f 6b 3b 0a 20 20 20 20  ->pWalHook;.    
15110 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 70 48  }else{.      ppH
15120 6f 6f 6b 20 3d 20 26 70 44 62 2d 3e 70 52 6f 6c  ook = &pDb->pRol
15130 6c 62 61 63 6b 48 6f 6f 6b 3b 0a 20 20 20 20 7d  lbackHook;.    }
15140 0a 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d  ..    if( objc!=
15150 32 20 26 26 20 6f 62 6a 63 21 3d 33 20 29 7b 0a  2 && objc!=3 ){.
15160 20 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67         Tcl_Wrong
15170 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
15180 32 2c 20 6f 62 6a 76 2c 20 22 3f 53 43 52 49 50  2, objv, "?SCRIP
15190 54 3f 22 29 3b 0a 20 20 20 20 20 20 20 72 65 74  T?");.       ret
151a0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
151b0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 2a 70 70     }.    if( *pp
151c0 48 6f 6f 6b 20 29 7b 0a 20 20 20 20 20 20 54 63  Hook ){.      Tc
151d0 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
151e0 6e 74 65 72 70 2c 20 2a 70 70 48 6f 6f 6b 29 3b  nterp, *ppHook);
151f0 0a 20 20 20 20 20 20 69 66 28 20 6f 62 6a 63 3d  .      if( objc=
15200 3d 33 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63  =3 ){.        Tc
15210 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 2a  l_DecrRefCount(*
15220 70 70 48 6f 6f 6b 29 3b 0a 20 20 20 20 20 20 20  ppHook);.       
15230 20 2a 70 70 48 6f 6f 6b 20 3d 20 30 3b 0a 20 20   *ppHook = 0;.  
15240 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
15250 69 66 28 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20  if( objc==3 ){. 
15260 20 20 20 20 20 61 73 73 65 72 74 28 20 21 28 2a       assert( !(*
15270 70 70 48 6f 6f 6b 29 20 29 3b 0a 20 20 20 20 20  ppHook) );.     
15280 20 69 66 28 20 54 63 6c 5f 47 65 74 43 68 61 72   if( Tcl_GetChar
15290 4c 65 6e 67 74 68 28 6f 62 6a 76 5b 32 5d 29 3e  Length(objv[2])>
152a0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 70  0 ){.        *pp
152b0 48 6f 6f 6b 20 3d 20 6f 62 6a 76 5b 32 5d 3b 0a  Hook = objv[2];.
152c0 20 20 20 20 20 20 20 20 54 63 6c 5f 49 6e 63 72          Tcl_Incr
152d0 52 65 66 43 6f 75 6e 74 28 2a 70 70 48 6f 6f 6b  RefCount(*ppHook
152e0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
152f0 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 75 70  ..    sqlite3_up
15300 64 61 74 65 5f 68 6f 6f 6b 28 70 44 62 2d 3e 64  date_hook(pDb->d
15310 62 2c 20 28 70 44 62 2d 3e 70 55 70 64 61 74 65  b, (pDb->pUpdate
15320 48 6f 6f 6b 3f 44 62 55 70 64 61 74 65 48 61 6e  Hook?DbUpdateHan
15330 64 6c 65 72 3a 30 29 2c 20 70 44 62 29 3b 0a 20  dler:0), pDb);. 
15340 20 20 20 73 71 6c 69 74 65 33 5f 72 6f 6c 6c 62     sqlite3_rollb
15350 61 63 6b 5f 68 6f 6f 6b 28 70 44 62 2d 3e 64 62  ack_hook(pDb->db
15360 2c 28 70 44 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b  ,(pDb->pRollback
15370 48 6f 6f 6b 3f 44 62 52 6f 6c 6c 62 61 63 6b 48  Hook?DbRollbackH
15380 61 6e 64 6c 65 72 3a 30 29 2c 70 44 62 29 3b 0a  andler:0),pDb);.
15390 20 20 20 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f      sqlite3_wal_
153a0 68 6f 6f 6b 28 70 44 62 2d 3e 64 62 2c 28 70 44  hook(pDb->db,(pD
153b0 62 2d 3e 70 57 61 6c 48 6f 6f 6b 3f 44 62 57 61  b->pWalHook?DbWa
153c0 6c 48 61 6e 64 6c 65 72 3a 30 29 2c 70 44 62 29  lHandler:0),pDb)
153d0 3b 0a 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ;..    break;.  
153e0 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 76  }..  /*    $db v
153f0 65 72 73 69 6f 6e 0a 20 20 2a 2a 0a 20 20 2a 2a  ersion.  **.  **
15400 20 52 65 74 75 72 6e 20 74 68 65 20 76 65 72 73   Return the vers
15410 69 6f 6e 20 73 74 72 69 6e 67 20 66 6f 72 20 74  ion string for t
15420 68 69 73 20 64 61 74 61 62 61 73 65 2e 0a 20 20  his database..  
15430 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 56 45 52  */.  case DB_VER
15440 53 49 4f 4e 3a 20 7b 0a 20 20 20 20 54 63 6c 5f  SION: {.    Tcl_
15450 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
15460 2c 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  , (char *)sqlite
15470 33 5f 6c 69 62 76 65 72 73 69 6f 6e 28 29 2c 20  3_libversion(), 
15480 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 20  TCL_STATIC);.   
15490 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 0a 20 20   break;.  }...  
154a0 7d 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20  } /* End of the 
154b0 53 57 49 54 43 48 20 73 74 61 74 65 6d 65 6e 74  SWITCH statement
154c0 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   */.  return rc;
154d0 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 54  .}..#if SQLITE_T
154e0 43 4c 5f 4e 52 45 0a 2f 2a 0a 2a 2a 20 41 64 61  CL_NRE./*.** Ada
154f0 70 74 6f 72 20 74 68 61 74 20 70 72 6f 76 69 64  ptor that provid
15500 65 73 20 61 6e 20 6f 62 6a 43 6d 64 20 69 6e 74  es an objCmd int
15510 65 72 66 61 63 65 20 74 6f 20 74 68 65 20 4e 52  erface to the NR
15520 45 2d 65 6e 61 62 6c 65 64 0a 2a 2a 20 69 6e 74  E-enabled.** int
15530 65 72 66 61 63 65 20 69 6d 70 6c 65 6d 65 6e 74  erface implement
15540 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ation..*/.static
15550 20 69 6e 74 20 44 62 4f 62 6a 43 6d 64 41 64 61   int DbObjCmdAda
15560 70 74 6f 72 28 0a 20 20 76 6f 69 64 20 2a 63 64  ptor(.  void *cd
15570 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
15580 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
15590 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 63  jc,.  Tcl_Obj *c
155a0 6f 6e 73 74 2a 6f 62 6a 76 0a 29 7b 0a 20 20 72  onst*objv.){.  r
155b0 65 74 75 72 6e 20 54 63 6c 5f 4e 52 43 61 6c 6c  eturn Tcl_NRCall
155c0 4f 62 6a 50 72 6f 63 28 69 6e 74 65 72 70 2c 20  ObjProc(interp, 
155d0 44 62 4f 62 6a 43 6d 64 2c 20 63 64 2c 20 6f 62  DbObjCmd, cd, ob
155e0 6a 63 2c 20 6f 62 6a 76 29 3b 0a 7d 0a 23 65 6e  jc, objv);.}.#en
155f0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 54 43  dif /* SQLITE_TC
15600 4c 5f 4e 52 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  L_NRE */../*.** 
15610 20 20 73 71 6c 69 74 65 33 20 44 42 4e 41 4d 45    sqlite3 DBNAME
15620 20 46 49 4c 45 4e 41 4d 45 20 3f 2d 76 66 73 20   FILENAME ?-vfs 
15630 56 46 53 4e 41 4d 45 3f 20 3f 2d 6b 65 79 20 4b  VFSNAME? ?-key K
15640 45 59 3f 20 3f 2d 72 65 61 64 6f 6e 6c 79 20 42  EY? ?-readonly B
15650 4f 4f 4c 45 41 4e 3f 0a 2a 2a 20 20 20 20 20 20  OOLEAN?.**      
15660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15670 20 20 20 20 20 3f 2d 63 72 65 61 74 65 20 42 4f       ?-create BO
15680 4f 4c 45 41 4e 3f 20 3f 2d 6e 6f 6d 75 74 65 78  OLEAN? ?-nomutex
15690 20 42 4f 4f 4c 45 41 4e 3f 0a 2a 2a 0a 2a 2a 20   BOOLEAN?.**.** 
156a0 54 68 69 73 20 69 73 20 74 68 65 20 6d 61 69 6e  This is the main
156b0 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 2e 20 20 57   Tcl command.  W
156c0 68 65 6e 20 74 68 65 20 22 73 71 6c 69 74 65 22  hen the "sqlite"
156d0 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 20 69 73 0a   Tcl command is.
156e0 2a 2a 20 69 6e 76 6f 6b 65 64 2c 20 74 68 69 73  ** invoked, this
156f0 20 72 6f 75 74 69 6e 65 20 72 75 6e 73 20 74 6f   routine runs to
15700 20 70 72 6f 63 65 73 73 20 74 68 61 74 20 63 6f   process that co
15710 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  mmand..**.** The
15720 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2c   first argument,
15730 20 44 42 4e 41 4d 45 2c 20 69 73 20 61 6e 20 61   DBNAME, is an a
15740 72 62 69 74 72 61 72 79 20 6e 61 6d 65 20 66 6f  rbitrary name fo
15750 72 20 61 20 6e 65 77 0a 2a 2a 20 64 61 74 61 62  r a new.** datab
15760 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20  ase connection. 
15770 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20 63 72   This command cr
15780 65 61 74 65 73 20 61 20 6e 65 77 20 63 6f 6d 6d  eates a new comm
15790 61 6e 64 20 6e 61 6d 65 64 0a 2a 2a 20 44 42 4e  and named.** DBN
157a0 41 4d 45 20 74 68 61 74 20 69 73 20 75 73 65 64  AME that is used
157b0 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 74 68 61 74   to control that
157c0 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 20 54 68   connection.  Th
157d0 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f  e database.** co
157e0 6e 6e 65 63 74 69 6f 6e 20 69 73 20 64 65 6c 65  nnection is dele
157f0 74 65 64 20 77 68 65 6e 20 74 68 65 20 44 42 4e  ted when the DBN
15800 41 4d 45 20 63 6f 6d 6d 61 6e 64 20 69 73 20 64  AME command is d
15810 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  eleted..**.** Th
15820 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
15830 74 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  t is the name of
15840 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
15850 6c 65 2e 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63  le..**.*/.static
15860 20 69 6e 74 20 44 62 4d 61 69 6e 28 76 6f 69 64   int DbMain(void
15870 20 2a 63 64 2c 20 54 63 6c 5f 49 6e 74 65 72 70   *cd, Tcl_Interp
15880 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62   *interp, int ob
15890 6a 63 2c 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73  jc,Tcl_Obj *cons
158a0 74 2a 6f 62 6a 76 29 7b 0a 20 20 53 71 6c 69 74  t*objv){.  Sqlit
158b0 65 44 62 20 2a 70 3b 0a 20 20 76 6f 69 64 20 2a  eDb *p;.  void *
158c0 70 4b 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20  pKey = 0;.  int 
158d0 6e 4b 65 79 20 3d 20 30 3b 0a 20 20 63 6f 6e 73  nKey = 0;.  cons
158e0 74 20 63 68 61 72 20 2a 7a 41 72 67 3b 0a 20 20  t char *zArg;.  
158f0 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 3b 0a 20  char *zErrMsg;. 
15900 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e 73 74 20   int i;.  const 
15910 63 68 61 72 20 2a 7a 46 69 6c 65 3b 0a 20 20 63  char *zFile;.  c
15920 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 66 73 20  onst char *zVfs 
15930 3d 20 30 3b 0a 20 20 69 6e 74 20 66 6c 61 67 73  = 0;.  int flags
15940 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20  ;.  Tcl_DString 
15950 74 72 61 6e 73 6c 61 74 65 64 46 69 6c 65 6e 61  translatedFilena
15960 6d 65 3b 0a 0a 20 20 2f 2a 20 49 6e 20 6e 6f 72  me;..  /* In nor
15970 6d 61 6c 20 75 73 65 2c 20 65 61 63 68 20 54 43  mal use, each TC
15980 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 72 75  L interpreter ru
15990 6e 73 20 69 6e 20 61 20 73 69 6e 67 6c 65 20 74  ns in a single t
159a0 68 72 65 61 64 2e 20 20 53 6f 0a 20 20 2a 2a 20  hread.  So.  ** 
159b0 62 79 20 64 65 66 61 75 6c 74 2c 20 77 65 20 63  by default, we c
159c0 61 6e 20 74 75 72 6e 20 6f 66 20 6d 75 74 65 78  an turn of mutex
159d0 69 6e 67 20 6f 6e 20 53 51 4c 69 74 65 20 64 61  ing on SQLite da
159e0 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
159f0 6e 73 2e 0a 20 20 2a 2a 20 48 6f 77 65 76 65 72  ns..  ** However
15a00 2c 20 66 6f 72 20 74 65 73 74 69 6e 67 20 70 75  , for testing pu
15a10 72 70 6f 73 65 73 20 69 74 20 69 73 20 75 73 65  rposes it is use
15a20 66 75 6c 20 74 6f 20 68 61 76 65 20 6d 75 74 65  ful to have mute
15a30 78 65 73 20 74 75 72 6e 65 64 0a 20 20 2a 2a 20  xes turned.  ** 
15a40 6f 6e 2e 20 20 53 6f 2c 20 62 79 20 64 65 66 61  on.  So, by defa
15a50 75 6c 74 2c 20 6d 75 74 65 78 65 73 20 64 65 66  ult, mutexes def
15a60 61 75 6c 74 20 6f 66 66 2e 20 20 42 75 74 20 69  ault off.  But i
15a70 66 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 0a  f compiled with.
15a80 20 20 2a 2a 20 53 51 4c 49 54 45 5f 54 43 4c 5f    ** SQLITE_TCL_
15a90 44 45 46 41 55 4c 54 5f 46 55 4c 4c 4d 55 54 45  DEFAULT_FULLMUTE
15aa0 58 20 74 68 65 6e 20 6d 75 74 65 78 65 73 20 64  X then mutexes d
15ab0 65 66 61 75 6c 74 20 6f 6e 2e 0a 20 20 2a 2f 0a  efault on..  */.
15ac0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 43  #ifdef SQLITE_TC
15ad0 4c 5f 44 45 46 41 55 4c 54 5f 46 55 4c 4c 4d 55  L_DEFAULT_FULLMU
15ae0 54 45 58 0a 20 20 66 6c 61 67 73 20 3d 20 53 51  TEX.  flags = SQ
15af0 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
15b00 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45  ITE | SQLITE_OPE
15b10 4e 5f 43 52 45 41 54 45 20 7c 20 53 51 4c 49 54  N_CREATE | SQLIT
15b20 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54 45 58  E_OPEN_FULLMUTEX
15b30 3b 0a 23 65 6c 73 65 0a 20 20 66 6c 61 67 73 20  ;.#else.  flags 
15b40 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  = SQLITE_OPEN_RE
15b50 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45  ADWRITE | SQLITE
15b60 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c 20 53  _OPEN_CREATE | S
15b70 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54  QLITE_OPEN_NOMUT
15b80 45 58 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66  EX;.#endif..  if
15b90 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20  ( objc==2 ){.   
15ba0 20 7a 41 72 67 20 3d 20 54 63 6c 5f 47 65 74 53   zArg = Tcl_GetS
15bb0 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
15bc0 76 5b 31 5d 2c 20 30 29 3b 0a 20 20 20 20 69 66  v[1], 0);.    if
15bd0 28 20 73 74 72 63 6d 70 28 7a 41 72 67 2c 22 2d  ( strcmp(zArg,"-
15be0 76 65 72 73 69 6f 6e 22 29 3d 3d 30 20 29 7b 0a  version")==0 ){.
15bf0 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
15c00 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 73 71  Result(interp,sq
15c10 6c 69 74 65 33 5f 76 65 72 73 69 6f 6e 2c 30 29  lite3_version,0)
15c20 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
15c30 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  CL_OK;.    }.   
15c40 20 69 66 28 20 73 74 72 63 6d 70 28 7a 41 72 67   if( strcmp(zArg
15c50 2c 22 2d 68 61 73 2d 63 6f 64 65 63 22 29 3d 3d  ,"-has-codec")==
15c60 30 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  0 ){.#ifdef SQLI
15c70 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 20  TE_HAS_CODEC.   
15c80 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
15c90 75 6c 74 28 69 6e 74 65 72 70 2c 22 31 22 2c 30  ult(interp,"1",0
15ca0 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 54  );.#else.      T
15cb0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
15cc0 69 6e 74 65 72 70 2c 22 30 22 2c 30 29 3b 0a 23  interp,"0",0);.#
15cd0 65 6e 64 69 66 0a 20 20 20 20 20 20 72 65 74 75  endif.      retu
15ce0 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d  rn TCL_OK;.    }
15cf0 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 33 3b 20  .  }.  for(i=3; 
15d00 69 2b 31 3c 6f 62 6a 63 3b 20 69 2b 3d 32 29 7b  i+1<objc; i+=2){
15d10 0a 20 20 20 20 7a 41 72 67 20 3d 20 54 63 6c 5f  .    zArg = Tcl_
15d20 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 69  GetString(objv[i
15d30 5d 29 3b 0a 20 20 20 20 69 66 28 20 73 74 72 63  ]);.    if( strc
15d40 6d 70 28 7a 41 72 67 2c 22 2d 6b 65 79 22 29 3d  mp(zArg,"-key")=
15d50 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 4b 65 79  =0 ){.      pKey
15d60 20 3d 20 54 63 6c 5f 47 65 74 42 79 74 65 41 72   = Tcl_GetByteAr
15d70 72 61 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  rayFromObj(objv[
15d80 69 2b 31 5d 2c 20 26 6e 4b 65 79 29 3b 0a 20 20  i+1], &nKey);.  
15d90 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
15da0 6d 70 28 7a 41 72 67 2c 20 22 2d 76 66 73 22 29  mp(zArg, "-vfs")
15db0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 56 66  ==0 ){.      zVf
15dc0 73 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  s = Tcl_GetStrin
15dd0 67 28 6f 62 6a 76 5b 69 2b 31 5d 29 3b 0a 20 20  g(objv[i+1]);.  
15de0 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
15df0 6d 70 28 7a 41 72 67 2c 20 22 2d 72 65 61 64 6f  mp(zArg, "-reado
15e00 6e 6c 79 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  nly")==0 ){.    
15e10 20 20 69 6e 74 20 62 3b 0a 20 20 20 20 20 20 69    int b;.      i
15e20 66 28 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61  f( Tcl_GetBoolea
15e30 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  nFromObj(interp,
15e40 20 6f 62 6a 76 5b 69 2b 31 5d 2c 20 26 62 29 20   objv[i+1], &b) 
15e50 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
15e60 4f 52 3b 0a 20 20 20 20 20 20 69 66 28 20 62 20  OR;.      if( b 
15e70 29 7b 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73  ){.        flags
15e80 20 26 3d 20 7e 28 53 51 4c 49 54 45 5f 4f 50 45   &= ~(SQLITE_OPE
15e90 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49  N_READWRITE|SQLI
15ea0 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 29 3b  TE_OPEN_CREATE);
15eb0 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c  .        flags |
15ec0 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  = SQLITE_OPEN_RE
15ed0 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 65  ADONLY;.      }e
15ee0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66 6c 61  lse{.        fla
15ef0 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 4f 50  gs &= ~SQLITE_OP
15f00 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20  EN_READONLY;.   
15f10 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 53 51       flags |= SQ
15f20 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
15f30 49 54 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ITE;.      }.   
15f40 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
15f50 70 28 7a 41 72 67 2c 20 22 2d 63 72 65 61 74 65  p(zArg, "-create
15f60 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ")==0 ){.      i
15f70 6e 74 20 62 3b 0a 20 20 20 20 20 20 69 66 28 20  nt b;.      if( 
15f80 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72  Tcl_GetBooleanFr
15f90 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
15fa0 6a 76 5b 69 2b 31 5d 2c 20 26 62 29 20 29 20 72  jv[i+1], &b) ) r
15fb0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
15fc0 0a 20 20 20 20 20 20 69 66 28 20 62 20 26 26 20  .      if( b && 
15fd0 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
15fe0 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3d 3d  OPEN_READONLY)==
15ff0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6c 61  0 ){.        fla
16000 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45  gs |= SQLITE_OPE
16010 4e 5f 43 52 45 41 54 45 3b 0a 20 20 20 20 20 20  N_CREATE;.      
16020 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66  }else{.        f
16030 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f  lags &= ~SQLITE_
16040 4f 50 45 4e 5f 43 52 45 41 54 45 3b 0a 20 20 20  OPEN_CREATE;.   
16050 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69     }.    }else i
16060 66 28 20 73 74 72 63 6d 70 28 7a 41 72 67 2c 20  f( strcmp(zArg, 
16070 22 2d 6e 6f 6d 75 74 65 78 22 29 3d 3d 30 20 29  "-nomutex")==0 )
16080 7b 0a 20 20 20 20 20 20 69 6e 74 20 62 3b 0a 20  {.      int b;. 
16090 20 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74       if( Tcl_Get
160a0 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69  BooleanFromObj(i
160b0 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 69 2b 31 5d  nterp, objv[i+1]
160c0 2c 20 26 62 29 20 29 20 72 65 74 75 72 6e 20 54  , &b) ) return T
160d0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  CL_ERROR;.      
160e0 69 66 28 20 62 20 29 7b 0a 20 20 20 20 20 20 20  if( b ){.       
160f0 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45   flags |= SQLITE
16100 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58 3b 0a 20  _OPEN_NOMUTEX;. 
16110 20 20 20 20 20 20 20 66 6c 61 67 73 20 26 3d 20         flags &= 
16120 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55 4c  ~SQLITE_OPEN_FUL
16130 4c 4d 55 54 45 58 3b 0a 20 20 20 20 20 20 7d 65  LMUTEX;.      }e
16140 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66 6c 61  lse{.        fla
16150 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 4f 50  gs &= ~SQLITE_OP
16160 45 4e 5f 4e 4f 4d 55 54 45 58 3b 0a 20 20 20 20  EN_NOMUTEX;.    
16170 20 20 7d 0a 20 20 20 7d 65 6c 73 65 20 69 66 28    }.   }else if(
16180 20 73 74 72 63 6d 70 28 7a 41 72 67 2c 20 22 2d   strcmp(zArg, "-
16190 66 75 6c 6c 6d 75 74 65 78 22 29 3d 3d 30 20 29  fullmutex")==0 )
161a0 7b 0a 20 20 20 20 20 20 69 6e 74 20 62 3b 0a 20  {.      int b;. 
161b0 20 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74       if( Tcl_Get
161c0 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69  BooleanFromObj(i
161d0 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 69 2b 31 5d  nterp, objv[i+1]
161e0 2c 20 26 62 29 20 29 20 72 65 74 75 72 6e 20 54  , &b) ) return T
161f0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  CL_ERROR;.      
16200 69 66 28 20 62 20 29 7b 0a 20 20 20 20 20 20 20  if( b ){.       
16210 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45   flags |= SQLITE
16220 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54 45 58 3b  _OPEN_FULLMUTEX;
16230 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 26  .        flags &
16240 3d 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e  = ~SQLITE_OPEN_N
16250 4f 4d 55 54 45 58 3b 0a 20 20 20 20 20 20 7d 65  OMUTEX;.      }e
16260 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66 6c 61  lse{.        fla
16270 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 4f 50  gs &= ~SQLITE_OP
16280 45 4e 5f 46 55 4c 4c 4d 55 54 45 58 3b 0a 20 20  EN_FULLMUTEX;.  
16290 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
162a0 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  .      Tcl_Appen
162b0 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
162c0 22 75 6e 6b 6e 6f 77 6e 20 6f 70 74 69 6f 6e 3a  "unknown option:
162d0 20 22 2c 20 7a 41 72 67 2c 20 28 63 68 61 72 2a   ", zArg, (char*
162e0 29 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  )0);.      retur
162f0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
16300 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6f 62 6a   }.  }.  if( obj
16310 63 3c 33 20 7c 7c 20 28 6f 62 6a 63 26 31 29 21  c<3 || (objc&1)!
16320 3d 31 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  =1 ){.    Tcl_Wr
16330 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
16340 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 0a 20 20 20  p, 1, objv, .   
16350 20 20 20 22 48 41 4e 44 4c 45 20 46 49 4c 45 4e     "HANDLE FILEN
16360 41 4d 45 20 3f 2d 76 66 73 20 56 46 53 4e 41 4d  AME ?-vfs VFSNAM
16370 45 3f 20 3f 2d 72 65 61 64 6f 6e 6c 79 20 42 4f  E? ?-readonly BO
16380 4f 4c 45 41 4e 3f 20 3f 2d 63 72 65 61 74 65 20  OLEAN? ?-create 
16390 42 4f 4f 4c 45 41 4e 3f 22 0a 20 20 20 20 20 20  BOOLEAN?".      
163a0 22 20 3f 2d 6e 6f 6d 75 74 65 78 20 42 4f 4f 4c  " ?-nomutex BOOL
163b0 45 41 4e 3f 20 3f 2d 66 75 6c 6c 6d 75 74 65 78  EAN? ?-fullmutex
163c0 20 42 4f 4f 4c 45 41 4e 3f 22 0a 23 69 66 64 65   BOOLEAN?".#ifde
163d0 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
163e0 45 43 0a 20 20 20 20 20 20 22 20 3f 2d 6b 65 79  EC.      " ?-key
163f0 20 43 4f 44 45 43 4b 45 59 3f 22 0a 23 65 6e 64   CODECKEY?".#end
16400 69 66 0a 20 20 20 20 29 3b 0a 20 20 20 20 72 65  if.    );.    re
16410 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
16420 20 20 7d 0a 20 20 7a 45 72 72 4d 73 67 20 3d 20    }.  zErrMsg = 
16430 30 3b 0a 20 20 70 20 3d 20 28 53 71 6c 69 74 65  0;.  p = (Sqlite
16440 44 62 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28 20 73  Db*)Tcl_Alloc( s
16450 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69  izeof(*p) );.  i
16460 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 54  f( p==0 ){.    T
16470 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
16480 65 72 70 2c 20 22 6d 61 6c 6c 6f 63 20 66 61 69  erp, "malloc fai
16490 6c 65 64 22 2c 20 54 43 4c 5f 53 54 41 54 49 43  led", TCL_STATIC
164a0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
164b0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 6d  L_ERROR;.  }.  m
164c0 65 6d 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65  emset(p, 0, size
164d0 6f 66 28 2a 70 29 29 3b 0a 20 20 7a 46 69 6c 65  of(*p));.  zFile
164e0 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
164f0 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c  FromObj(objv[2],
16500 20 30 29 3b 0a 20 20 7a 46 69 6c 65 20 3d 20 54   0);.  zFile = T
16510 63 6c 5f 54 72 61 6e 73 6c 61 74 65 46 69 6c 65  cl_TranslateFile
16520 4e 61 6d 65 28 69 6e 74 65 72 70 2c 20 7a 46 69  Name(interp, zFi
16530 6c 65 2c 20 26 74 72 61 6e 73 6c 61 74 65 64 46  le, &translatedF
16540 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 73 71 6c 69  ilename);.  sqli
16550 74 65 33 5f 6f 70 65 6e 5f 76 32 28 7a 46 69 6c  te3_open_v2(zFil
16560 65 2c 20 26 70 2d 3e 64 62 2c 20 66 6c 61 67 73  e, &p->db, flags
16570 2c 20 7a 56 66 73 29 3b 0a 20 20 54 63 6c 5f 44  , zVfs);.  Tcl_D
16580 53 74 72 69 6e 67 46 72 65 65 28 26 74 72 61 6e  StringFree(&tran
16590 73 6c 61 74 65 64 46 69 6c 65 6e 61 6d 65 29 3b  slatedFilename);
165a0 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b  .  if( SQLITE_OK
165b0 21 3d 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64  !=sqlite3_errcod
165c0 65 28 70 2d 3e 64 62 29 20 29 7b 0a 20 20 20 20  e(p->db) ){.    
165d0 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65  zErrMsg = sqlite
165e0 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20  3_mprintf("%s", 
165f0 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70  sqlite3_errmsg(p
16600 2d 3e 64 62 29 29 3b 0a 20 20 20 20 73 71 6c 69  ->db));.    sqli
16610 74 65 33 5f 63 6c 6f 73 65 28 70 2d 3e 64 62 29  te3_close(p->db)
16620 3b 0a 20 20 20 20 70 2d 3e 64 62 20 3d 20 30 3b  ;.    p->db = 0;
16630 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49  .  }.#ifdef SQLI
16640 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 69  TE_HAS_CODEC.  i
16650 66 28 20 70 2d 3e 64 62 20 29 7b 0a 20 20 20 20  f( p->db ){.    
16660 73 71 6c 69 74 65 33 5f 6b 65 79 28 70 2d 3e 64  sqlite3_key(p->d
16670 62 2c 20 70 4b 65 79 2c 20 6e 4b 65 79 29 3b 0a  b, pKey, nKey);.
16680 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28    }.#endif.  if(
16690 20 70 2d 3e 64 62 3d 3d 30 20 29 7b 0a 20 20 20   p->db==0 ){.   
166a0 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
166b0 6e 74 65 72 70 2c 20 7a 45 72 72 4d 73 67 2c 20  nterp, zErrMsg, 
166c0 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20  TCL_VOLATILE);. 
166d0 20 20 20 54 63 6c 5f 46 72 65 65 28 28 63 68 61     Tcl_Free((cha
166e0 72 2a 29 70 29 3b 0a 20 20 20 20 73 71 6c 69 74  r*)p);.    sqlit
166f0 65 33 5f 66 72 65 65 28 7a 45 72 72 4d 73 67 29  e3_free(zErrMsg)
16700 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
16710 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 2d  _ERROR;.  }.  p-
16720 3e 6d 61 78 53 74 6d 74 20 3d 20 4e 55 4d 5f 50  >maxStmt = NUM_P
16730 52 45 50 41 52 45 44 5f 53 54 4d 54 53 3b 0a 20  REPARED_STMTS;. 
16740 20 70 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74   p->interp = int
16750 65 72 70 3b 0a 20 20 7a 41 72 67 20 3d 20 54 63  erp;.  zArg = Tc
16760 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
16770 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 30 29 3b 0a  bj(objv[1], 0);.
16780 20 20 69 66 28 20 44 62 55 73 65 4e 72 65 28 29    if( DbUseNre()
16790 20 29 7b 0a 20 20 20 20 54 63 6c 5f 4e 52 43 72   ){.    Tcl_NRCr
167a0 65 61 74 65 43 6f 6d 6d 61 6e 64 28 69 6e 74 65  eateCommand(inte
167b0 72 70 2c 20 7a 41 72 67 2c 20 44 62 4f 62 6a 43  rp, zArg, DbObjC
167c0 6d 64 41 64 61 70 74 6f 72 2c 20 44 62 4f 62 6a  mdAdaptor, DbObj
167d0 43 6d 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Cmd,.           
167e0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
167f0 61 72 2a 29 70 2c 20 44 62 44 65 6c 65 74 65 43  ar*)p, DbDeleteC
16800 6d 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  md);.  }else{.  
16810 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43    Tcl_CreateObjC
16820 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 7a  ommand(interp, z
16830 41 72 67 2c 20 44 62 4f 62 6a 43 6d 64 2c 20 28  Arg, DbObjCmd, (
16840 63 68 61 72 2a 29 70 2c 20 44 62 44 65 6c 65 74  char*)p, DbDelet
16850 65 43 6d 64 29 3b 0a 20 20 7d 0a 20 20 72 65 74  eCmd);.  }.  ret
16860 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
16870 2a 0a 2a 2a 20 50 72 6f 76 69 64 65 20 61 20 64  *.** Provide a d
16880 75 6d 6d 79 20 54 63 6c 5f 49 6e 69 74 53 74 75  ummy Tcl_InitStu
16890 62 73 20 69 66 20 77 65 20 61 72 65 20 75 73 69  bs if we are usi
168a0 6e 67 20 74 68 69 73 20 61 73 20 61 20 73 74 61  ng this as a sta
168b0 74 69 63 0a 2a 2a 20 6c 69 62 72 61 72 79 2e 0a  tic.** library..
168c0 2a 2f 0a 23 69 66 6e 64 65 66 20 55 53 45 5f 54  */.#ifndef USE_T
168d0 43 4c 5f 53 54 55 42 53 0a 23 20 75 6e 64 65 66  CL_STUBS.# undef
168e0 20 20 54 63 6c 5f 49 6e 69 74 53 74 75 62 73 0a    Tcl_InitStubs.
168f0 23 20 64 65 66 69 6e 65 20 54 63 6c 5f 49 6e 69  # define Tcl_Ini
16900 74 53 74 75 62 73 28 61 2c 62 2c 63 29 0a 23 65  tStubs(a,b,c).#e
16910 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65  ndif../*.** Make
16920 20 73 75 72 65 20 77 65 20 68 61 76 65 20 61 20   sure we have a 
16930 50 41 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e 20  PACKAGE_VERSION 
16940 6d 61 63 72 6f 20 64 65 66 69 6e 65 64 2e 20 20  macro defined.  
16950 54 68 69 73 20 77 69 6c 6c 20 62 65 0a 2a 2a 20  This will be.** 
16960 64 65 66 69 6e 65 64 20 61 75 74 6f 6d 61 74 69  defined automati
16970 63 61 6c 6c 79 20 62 79 20 74 68 65 20 54 45 41  cally by the TEA
16980 20 6d 61 6b 65 66 69 6c 65 2e 20 20 42 75 74 20   makefile.  But 
16990 6f 74 68 65 72 20 6d 61 6b 65 66 69 6c 65 73 0a  other makefiles.
169a0 2a 2a 20 64 6f 20 6e 6f 74 20 64 65 66 69 6e 65  ** do not define
169b0 20 69 74 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20   it..*/.#ifndef 
169c0 50 41 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e 0a  PACKAGE_VERSION.
169d0 23 20 64 65 66 69 6e 65 20 50 41 43 4b 41 47 45  # define PACKAGE
169e0 5f 56 45 52 53 49 4f 4e 20 53 51 4c 49 54 45 5f  _VERSION SQLITE_
169f0 56 45 52 53 49 4f 4e 0a 23 65 6e 64 69 66 0a 0a  VERSION.#endif..
16a00 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65  /*.** Initialize
16a10 20 74 68 69 73 20 6d 6f 64 75 6c 65 2e 0a 2a 2a   this module..**
16a20 0a 2a 2a 20 54 68 69 73 20 54 63 6c 20 6d 6f 64  .** This Tcl mod
16a30 75 6c 65 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 6c  ule contains onl
16a40 79 20 61 20 73 69 6e 67 6c 65 20 6e 65 77 20 54  y a single new T
16a50 63 6c 20 63 6f 6d 6d 61 6e 64 20 6e 61 6d 65 64  cl command named
16a60 20 22 73 71 6c 69 74 65 22 2e 0a 2a 2a 20 28 48   "sqlite"..** (H
16a70 65 6e 63 65 20 74 68 65 72 65 20 69 73 20 6e 6f  ence there is no
16a80 20 6e 61 6d 65 73 70 61 63 65 2e 20 20 54 68 65   namespace.  The
16a90 72 65 20 69 73 20 6e 6f 20 70 6f 69 6e 74 20 69  re is no point i
16aa0 6e 20 75 73 69 6e 67 20 61 20 6e 61 6d 65 73 70  n using a namesp
16ab0 61 63 65 0a 2a 2a 20 69 66 20 74 68 65 20 65 78  ace.** if the ex
16ac0 74 65 6e 73 69 6f 6e 20 6f 6e 6c 79 20 73 75 70  tension only sup
16ad0 70 6c 69 65 73 20 6f 6e 65 20 6e 65 77 20 6e 61  plies one new na
16ae0 6d 65 21 29 20 20 54 68 65 20 22 73 71 6c 69 74  me!)  The "sqlit
16af0 65 22 20 63 6f 6d 6d 61 6e 64 20 69 73 0a 2a 2a  e" command is.**
16b00 20 75 73 65 64 20 74 6f 20 6f 70 65 6e 20 61 20   used to open a 
16b10 6e 65 77 20 53 51 4c 69 74 65 20 64 61 74 61 62  new SQLite datab
16b20 61 73 65 2e 20 20 53 65 65 20 74 68 65 20 44 62  ase.  See the Db
16b30 4d 61 69 6e 28 29 20 72 6f 75 74 69 6e 65 20 61  Main() routine a
16b40 62 6f 76 65 0a 2a 2a 20 66 6f 72 20 61 64 64 69  bove.** for addi
16b50 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69  tional informati
16b60 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 58  on..**.** The EX
16b70 54 45 52 4e 20 6d 61 63 72 6f 73 20 61 72 65 20  TERN macros are 
16b80 72 65 71 75 69 72 65 64 20 62 79 20 54 43 4c 20  required by TCL 
16b90 69 6e 20 6f 72 64 65 72 20 74 6f 20 77 6f 72 6b  in order to work
16ba0 20 6f 6e 20 77 69 6e 64 6f 77 73 2e 0a 2a 2f 0a   on windows..*/.
16bb0 45 58 54 45 52 4e 20 69 6e 74 20 53 71 6c 69 74  EXTERN int Sqlit
16bc0 65 33 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  e3_Init(Tcl_Inte
16bd0 72 70 20 2a 69 6e 74 65 72 70 29 7b 0a 20 20 54  rp *interp){.  T
16be0 63 6c 5f 49 6e 69 74 53 74 75 62 73 28 69 6e 74  cl_InitStubs(int
16bf0 65 72 70 2c 20 22 38 2e 34 22 2c 20 30 29 3b 0a  erp, "8.4", 0);.
16c00 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43    Tcl_CreateObjC
16c10 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22  ommand(interp, "
16c20 73 71 6c 69 74 65 33 22 2c 20 28 54 63 6c 5f 4f  sqlite3", (Tcl_O
16c30 62 6a 43 6d 64 50 72 6f 63 2a 29 44 62 4d 61 69  bjCmdProc*)DbMai
16c40 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 54 63 6c 5f  n, 0, 0);.  Tcl_
16c50 50 6b 67 50 72 6f 76 69 64 65 28 69 6e 74 65 72  PkgProvide(inter
16c60 70 2c 20 22 73 71 6c 69 74 65 33 22 2c 20 50 41  p, "sqlite3", PA
16c70 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e 29 3b 0a  CKAGE_VERSION);.
16c80 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
16c90 33 5f 53 55 46 46 49 58 5f 4f 4e 4c 59 0a 20 20  3_SUFFIX_ONLY.  
16ca0 2f 2a 20 54 68 65 20 22 73 71 6c 69 74 65 22 20  /* The "sqlite" 
16cb0 61 6c 69 61 73 20 69 73 20 75 6e 64 6f 63 75 6d  alias is undocum
16cc0 65 6e 74 65 64 2e 20 20 49 74 20 69 73 20 68 65  ented.  It is he
16cd0 72 65 20 6f 6e 6c 79 20 74 6f 20 73 75 70 70 6f  re only to suppo
16ce0 72 74 0a 20 20 2a 2a 20 6c 65 67 61 63 79 20 73  rt.  ** legacy s
16cf0 63 72 69 70 74 73 2e 20 20 41 6c 6c 20 6e 65 77  cripts.  All new
16d00 20 73 63 72 69 70 74 73 20 73 68 6f 75 6c 64 20   scripts should 
16d10 75 73 65 20 6f 6e 6c 79 20 74 68 65 20 22 73 71  use only the "sq
16d20 6c 69 74 65 33 22 0a 20 20 2a 2a 20 63 6f 6d 6d  lite3".  ** comm
16d30 61 6e 64 2e 0a 20 20 2a 2f 0a 20 20 54 63 6c 5f  and..  */.  Tcl_
16d40 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64  CreateObjCommand
16d50 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65  (interp, "sqlite
16d60 22 2c 20 28 54 63 6c 5f 4f 62 6a 43 6d 64 50 72  ", (Tcl_ObjCmdPr
16d70 6f 63 2a 29 44 62 4d 61 69 6e 2c 20 30 2c 20 30  oc*)DbMain, 0, 0
16d80 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74  );.#endif..  ret
16d90 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 45 58  urn TCL_OK;.}.EX
16da0 54 45 52 4e 20 69 6e 74 20 54 63 6c 73 71 6c 69  TERN int Tclsqli
16db0 74 65 33 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74  te3_Init(Tcl_Int
16dc0 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 20 72 65  erp *interp){ re
16dd0 74 75 72 6e 20 53 71 6c 69 74 65 33 5f 49 6e 69  turn Sqlite3_Ini
16de0 74 28 69 6e 74 65 72 70 29 3b 20 7d 0a 45 58 54  t(interp); }.EXT
16df0 45 52 4e 20 69 6e 74 20 53 71 6c 69 74 65 33 5f  ERN int Sqlite3_
16e00 53 61 66 65 49 6e 69 74 28 54 63 6c 5f 49 6e 74  SafeInit(Tcl_Int
16e10 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 20 72 65  erp *interp){ re
16e20 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 7d 0a 45  turn TCL_OK; }.E
16e30 58 54 45 52 4e 20 69 6e 74 20 54 63 6c 73 71 6c  XTERN int Tclsql
16e40 69 74 65 33 5f 53 61 66 65 49 6e 69 74 28 54 63  ite3_SafeInit(Tc
16e50 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
16e60 29 7b 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  ){ return TCL_OK
16e70 3b 20 7d 0a 45 58 54 45 52 4e 20 69 6e 74 20 53  ; }.EXTERN int S
16e80 71 6c 69 74 65 33 5f 55 6e 6c 6f 61 64 28 54 63  qlite3_Unload(Tc
16e90 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
16ea0 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 20 72 65  , int flags){ re
16eb0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 7d 0a 45  turn TCL_OK; }.E
16ec0 58 54 45 52 4e 20 69 6e 74 20 54 63 6c 73 71 6c  XTERN int Tclsql
16ed0 69 74 65 33 5f 55 6e 6c 6f 61 64 28 54 63 6c 5f  ite3_Unload(Tcl_
16ee0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
16ef0 69 6e 74 20 66 6c 61 67 73 29 7b 20 72 65 74 75  int flags){ retu
16f00 72 6e 20 54 43 4c 5f 4f 4b 3b 20 7d 0a 45 58 54  rn TCL_OK; }.EXT
16f10 45 52 4e 20 69 6e 74 20 53 71 6c 69 74 65 33 5f  ERN int Sqlite3_
16f20 53 61 66 65 55 6e 6c 6f 61 64 28 54 63 6c 5f 49  SafeUnload(Tcl_I
16f30 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69  nterp *interp, i
16f40 6e 74 20 66 6c 61 67 73 29 7b 20 72 65 74 75 72  nt flags){ retur
16f50 6e 20 54 43 4c 5f 4f 4b 3b 20 7d 0a 45 58 54 45  n TCL_OK; }.EXTE
16f60 52 4e 20 69 6e 74 20 54 63 6c 73 71 6c 69 74 65  RN int Tclsqlite
16f70 33 5f 53 61 66 65 55 6e 6c 6f 61 64 28 54 63 6c  3_SafeUnload(Tcl
16f80 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
16f90 20 69 6e 74 20 66 6c 61 67 73 29 7b 20 72 65 74   int flags){ ret
16fa0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 7d 0a 0a 0a 23  urn TCL_OK;}...#
16fb0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 33 5f  ifndef SQLITE_3_
16fc0 53 55 46 46 49 58 5f 4f 4e 4c 59 0a 69 6e 74 20  SUFFIX_ONLY.int 
16fd0 53 71 6c 69 74 65 5f 49 6e 69 74 28 54 63 6c 5f  Sqlite_Init(Tcl_
16fe0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b  Interp *interp){
16ff0 20 72 65 74 75 72 6e 20 53 71 6c 69 74 65 33 5f   return Sqlite3_
17000 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 20 7d 0a  Init(interp); }.
17010 69 6e 74 20 54 63 6c 73 71 6c 69 74 65 5f 49 6e  int Tclsqlite_In
17020 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  it(Tcl_Interp *i
17030 6e 74 65 72 70 29 7b 20 72 65 74 75 72 6e 20 53  nterp){ return S
17040 71 6c 69 74 65 33 5f 49 6e 69 74 28 69 6e 74 65  qlite3_Init(inte
17050 72 70 29 3b 20 7d 0a 69 6e 74 20 53 71 6c 69 74  rp); }.int Sqlit
17060 65 5f 53 61 66 65 49 6e 69 74 28 54 63 6c 5f 49  e_SafeInit(Tcl_I
17070 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 20  nterp *interp){ 
17080 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 7d  return TCL_OK; }
17090 0a 69 6e 74 20 54 63 6c 73 71 6c 69 74 65 5f 53  .int Tclsqlite_S
170a0 61 66 65 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  afeInit(Tcl_Inte
170b0 72 70 20 2a 69 6e 74 65 72 70 29 7b 20 72 65 74  rp *interp){ ret
170c0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 7d 0a 69 6e  urn TCL_OK; }.in
170d0 74 20 53 71 6c 69 74 65 5f 55 6e 6c 6f 61 64 28  t Sqlite_Unload(
170e0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
170f0 72 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 20  rp, int flags){ 
17100 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 7d  return TCL_OK; }
17110 0a 69 6e 74 20 54 63 6c 73 71 6c 69 74 65 5f 55  .int Tclsqlite_U
17120 6e 6c 6f 61 64 28 54 63 6c 5f 49 6e 74 65 72 70  nload(Tcl_Interp
17130 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 66 6c   *interp, int fl
17140 61 67 73 29 7b 20 72 65 74 75 72 6e 20 54 43 4c  ags){ return TCL
17150 5f 4f 4b 3b 20 7d 0a 69 6e 74 20 53 71 6c 69 74  _OK; }.int Sqlit
17160 65 5f 53 61 66 65 55 6e 6c 6f 61 64 28 54 63 6c  e_SafeUnload(Tcl
17170 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
17180 20 69 6e 74 20 66 6c 61 67 73 29 7b 20 72 65 74   int flags){ ret
17190 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 7d 0a 69 6e  urn TCL_OK; }.in
171a0 74 20 54 63 6c 73 71 6c 69 74 65 5f 53 61 66 65  t Tclsqlite_Safe
171b0 55 6e 6c 6f 61 64 28 54 63 6c 5f 49 6e 74 65 72  Unload(Tcl_Inter
171c0 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 66  p *interp, int f
171d0 6c 61 67 73 29 7b 20 72 65 74 75 72 6e 20 54 43  lags){ return TC
171e0 4c 5f 4f 4b 3b 7d 0a 23 65 6e 64 69 66 0a 0a 23  L_OK;}.#endif..#
171f0 69 66 64 65 66 20 54 43 4c 53 48 0a 2f 2a 2a 2a  ifdef TCLSH./***
17200 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17210 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17220 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17230 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17240 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 41 6c  **********.** Al
17250 6c 20 6f 66 20 74 68 65 20 63 6f 64 65 20 74 68  l of the code th
17260 61 74 20 66 6f 6c 6c 6f 77 73 20 69 73 20 75 73  at follows is us
17270 65 64 20 74 6f 20 62 75 69 6c 64 20 73 74 61 6e  ed to build stan
17280 64 61 6c 6f 6e 65 20 54 43 4c 20 69 6e 74 65 72  dalone TCL inter
17290 70 72 65 74 65 72 73 0a 2a 2a 20 74 68 61 74 20  preters.** that 
172a0 61 72 65 20 73 74 61 74 69 63 61 6c 6c 79 20 6c  are statically l
172b0 69 6e 6b 65 64 20 77 69 74 68 20 53 51 4c 69 74  inked with SQLit
172c0 65 2e 20 20 45 6e 61 62 6c 65 20 74 68 65 73 65  e.  Enable these
172d0 20 62 79 20 63 6f 6d 70 69 6c 69 6e 67 0a 2a 2a   by compiling.**
172e0 20 77 69 74 68 20 2d 44 54 43 4c 53 48 3d 6e 20   with -DTCLSH=n 
172f0 77 68 65 72 65 20 6e 20 63 61 6e 20 62 65 20 31  where n can be 1
17300 20 6f 72 20 32 2e 20 20 41 6e 20 6e 20 6f 66 20   or 2.  An n of 
17310 31 20 67 65 6e 65 72 61 74 65 73 20 61 20 73 74  1 generates a st
17320 61 6e 64 61 72 64 0a 2a 2a 20 74 63 6c 73 68 20  andard.** tclsh 
17330 62 75 74 20 77 69 74 68 20 53 51 4c 69 74 65 20  but with SQLite 
17340 62 75 69 6c 74 20 69 6e 2e 20 20 41 6e 20 6e 20  built in.  An n 
17350 6f 66 20 32 20 67 65 6e 65 72 61 74 65 73 20 74  of 2 generates t
17360 68 65 20 53 51 4c 69 74 65 20 73 70 61 63 65 0a  he SQLite space.
17370 2a 2a 20 61 6e 61 6c 79 73 69 73 20 70 72 6f 67  ** analysis prog
17380 72 61 6d 2e 0a 2a 2f 0a 0a 23 69 66 20 64 65 66  ram..*/..#if def
17390 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54  ined(SQLITE_TEST
173a0 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c  ) || defined(SQL
173b0 49 54 45 5f 54 43 4c 4d 44 35 29 0a 2f 2a 0a 20  ITE_TCLMD5)./*. 
173c0 2a 20 54 68 69 73 20 63 6f 64 65 20 69 6d 70 6c  * This code impl
173d0 65 6d 65 6e 74 73 20 74 68 65 20 4d 44 35 20 6d  ements the MD5 m
173e0 65 73 73 61 67 65 2d 64 69 67 65 73 74 20 61 6c  essage-digest al
173f0 67 6f 72 69 74 68 6d 2e 0a 20 2a 20 54 68 65 20  gorithm.. * The 
17400 61 6c 67 6f 72 69 74 68 6d 20 69 73 20 64 75 65  algorithm is due
17410 20 74 6f 20 52 6f 6e 20 52 69 76 65 73 74 2e 20   to Ron Rivest. 
17420 20 54 68 69 73 20 63 6f 64 65 20 77 61 73 0a 20   This code was. 
17430 2a 20 77 72 69 74 74 65 6e 20 62 79 20 43 6f 6c  * written by Col
17440 69 6e 20 50 6c 75 6d 62 20 69 6e 20 31 39 39 33  in Plumb in 1993
17450 2c 20 6e 6f 20 63 6f 70 79 72 69 67 68 74 20 69  , no copyright i
17460 73 20 63 6c 61 69 6d 65 64 2e 0a 20 2a 20 54 68  s claimed.. * Th
17470 69 73 20 63 6f 64 65 20 69 73 20 69 6e 20 74 68  is code is in th
17480 65 20 70 75 62 6c 69 63 20 64 6f 6d 61 69 6e 3b  e public domain;
17490 20 64 6f 20 77 69 74 68 20 69 74 20 77 68 61 74   do with it what
174a0 20 79 6f 75 20 77 69 73 68 2e 0a 20 2a 0a 20 2a   you wish.. *. *
174b0 20 45 71 75 69 76 61 6c 65 6e 74 20 63 6f 64 65   Equivalent code
174c0 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20 66 72   is available fr
174d0 6f 6d 20 52 53 41 20 44 61 74 61 20 53 65 63 75  om RSA Data Secu
174e0 72 69 74 79 2c 20 49 6e 63 2e 0a 20 2a 20 54 68  rity, Inc.. * Th
174f0 69 73 20 63 6f 64 65 20 68 61 73 20 62 65 65 6e  is code has been
17500 20 74 65 73 74 65 64 20 61 67 61 69 6e 73 74 20   tested against 
17510 74 68 61 74 2c 20 61 6e 64 20 69 73 20 65 71 75  that, and is equ
17520 69 76 61 6c 65 6e 74 2c 0a 20 2a 20 65 78 63 65  ivalent,. * exce
17530 70 74 20 74 68 61 74 20 79 6f 75 20 64 6f 6e 27  pt that you don'
17540 74 20 6e 65 65 64 20 74 6f 20 69 6e 63 6c 75 64  t need to includ
17550 65 20 74 77 6f 20 70 61 67 65 73 20 6f 66 20 6c  e two pages of l
17560 65 67 61 6c 65 73 65 0a 20 2a 20 77 69 74 68 20  egalese. * with 
17570 65 76 65 72 79 20 63 6f 70 79 2e 0a 20 2a 0a 20  every copy.. *. 
17580 2a 20 54 6f 20 63 6f 6d 70 75 74 65 20 74 68 65  * To compute the
17590 20 6d 65 73 73 61 67 65 20 64 69 67 65 73 74 20   message digest 
175a0 6f 66 20 61 20 63 68 75 6e 6b 20 6f 66 20 62 79  of a chunk of by
175b0 74 65 73 2c 20 64 65 63 6c 61 72 65 20 61 6e 0a  tes, declare an.
175c0 20 2a 20 4d 44 35 43 6f 6e 74 65 78 74 20 73 74   * MD5Context st
175d0 72 75 63 74 75 72 65 2c 20 70 61 73 73 20 69 74  ructure, pass it
175e0 20 74 6f 20 4d 44 35 49 6e 69 74 2c 20 63 61 6c   to MD5Init, cal
175f0 6c 20 4d 44 35 55 70 64 61 74 65 20 61 73 0a 20  l MD5Update as. 
17600 2a 20 6e 65 65 64 65 64 20 6f 6e 20 62 75 66 66  * needed on buff
17610 65 72 73 20 66 75 6c 6c 20 6f 66 20 62 79 74 65  ers full of byte
17620 73 2c 20 61 6e 64 20 74 68 65 6e 20 63 61 6c 6c  s, and then call
17630 20 4d 44 35 46 69 6e 61 6c 2c 20 77 68 69 63 68   MD5Final, which
17640 0a 20 2a 20 77 69 6c 6c 20 66 69 6c 6c 20 61 20  . * will fill a 
17650 73 75 70 70 6c 69 65 64 20 31 36 2d 62 79 74 65  supplied 16-byte
17660 20 61 72 72 61 79 20 77 69 74 68 20 74 68 65 20   array with the 
17670 64 69 67 65 73 74 2e 0a 20 2a 2f 0a 0a 2f 2a 0a  digest.. */../*.
17680 20 2a 20 49 66 20 63 6f 6d 70 69 6c 65 64 20 6f   * If compiled o
17690 6e 20 61 20 6d 61 63 68 69 6e 65 20 74 68 61 74  n a machine that
176a0 20 64 6f 65 73 6e 27 74 20 68 61 76 65 20 61 20   doesn't have a 
176b0 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 2c 0a  32-bit integer,.
176c0 20 2a 20 79 6f 75 20 6a 75 73 74 20 73 65 74 20   * you just set 
176d0 22 75 69 6e 74 33 32 22 20 74 6f 20 74 68 65 20  "uint32" to the 
176e0 61 70 70 72 6f 70 72 69 61 74 65 20 64 61 74 61  appropriate data
176f0 74 79 70 65 20 66 6f 72 20 61 6e 0a 20 2a 20 75  type for an. * u
17700 6e 73 69 67 6e 65 64 20 33 32 2d 62 69 74 20 69  nsigned 32-bit i
17710 6e 74 65 67 65 72 2e 20 20 46 6f 72 20 65 78 61  nteger.  For exa
17720 6d 70 6c 65 3a 0a 20 2a 0a 20 2a 20 20 20 20 20  mple:. *. *     
17730 20 20 63 63 20 2d 44 75 69 6e 74 33 32 3d 27 75    cc -Duint32='u
17740 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 27 20 6d 64  nsigned long' md
17750 35 2e 63 0a 20 2a 0a 20 2a 2f 0a 23 69 66 6e 64  5.c. *. */.#ifnd
17760 65 66 20 75 69 6e 74 33 32 0a 23 20 20 64 65 66  ef uint32.#  def
17770 69 6e 65 20 75 69 6e 74 33 32 20 75 6e 73 69 67  ine uint32 unsig
17780 6e 65 64 20 69 6e 74 0a 23 65 6e 64 69 66 0a 0a  ned int.#endif..
17790 73 74 72 75 63 74 20 4d 44 35 43 6f 6e 74 65 78  struct MD5Contex
177a0 74 20 7b 0a 20 20 69 6e 74 20 69 73 49 6e 69 74  t {.  int isInit
177b0 3b 0a 20 20 75 69 6e 74 33 32 20 62 75 66 5b 34  ;.  uint32 buf[4
177c0 5d 3b 0a 20 20 75 69 6e 74 33 32 20 62 69 74 73  ];.  uint32 bits
177d0 5b 32 5d 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  [2];.  unsigned 
177e0 63 68 61 72 20 69 6e 5b 36 34 5d 3b 0a 7d 3b 0a  char in[64];.};.
177f0 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 4d  typedef struct M
17800 44 35 43 6f 6e 74 65 78 74 20 4d 44 35 43 6f 6e  D5Context MD5Con
17810 74 65 78 74 3b 0a 0a 2f 2a 0a 20 2a 20 4e 6f 74  text;../*. * Not
17820 65 3a 20 74 68 69 73 20 63 6f 64 65 20 69 73 20  e: this code is 
17830 68 61 72 6d 6c 65 73 73 20 6f 6e 20 6c 69 74 74  harmless on litt
17840 6c 65 2d 65 6e 64 69 61 6e 20 6d 61 63 68 69 6e  le-endian machin
17850 65 73 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20 76  es.. */.static v
17860 6f 69 64 20 62 79 74 65 52 65 76 65 72 73 65 20  oid byteReverse 
17870 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  (unsigned char *
17880 62 75 66 2c 20 75 6e 73 69 67 6e 65 64 20 6c 6f  buf, unsigned lo
17890 6e 67 73 29 7b 0a 20 20 20 20 20 20 20 20 75 69  ngs){.        ui
178a0 6e 74 33 32 20 74 3b 0a 20 20 20 20 20 20 20 20  nt32 t;.        
178b0 64 6f 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  do {.           
178c0 20 20 20 20 20 74 20 3d 20 28 75 69 6e 74 33 32       t = (uint32
178d0 29 28 28 75 6e 73 69 67 6e 65 64 29 62 75 66 5b  )((unsigned)buf[
178e0 33 5d 3c 3c 38 20 7c 20 62 75 66 5b 32 5d 29 20  3]<<8 | buf[2]) 
178f0 3c 3c 20 31 36 20 7c 0a 20 20 20 20 20 20 20 20  << 16 |.        
17900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17910 20 20 20 20 28 28 75 6e 73 69 67 6e 65 64 29 62      ((unsigned)b
17920 75 66 5b 31 5d 3c 3c 38 20 7c 20 62 75 66 5b 30  uf[1]<<8 | buf[0
17930 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ]);.            
17940 20 20 20 20 2a 28 75 69 6e 74 33 32 20 2a 29 62      *(uint32 *)b
17950 75 66 20 3d 20 74 3b 0a 20 20 20 20 20 20 20 20  uf = t;.        
17960 20 20 20 20 20 20 20 20 62 75 66 20 2b 3d 20 34          buf += 4
17970 3b 0a 20 20 20 20 20 20 20 20 7d 20 77 68 69 6c  ;.        } whil
17980 65 20 28 2d 2d 6c 6f 6e 67 73 29 3b 0a 7d 0a 2f  e (--longs);.}./
17990 2a 20 54 68 65 20 66 6f 75 72 20 63 6f 72 65 20  * The four core 
179a0 66 75 6e 63 74 69 6f 6e 73 20 2d 20 46 31 20 69  functions - F1 i
179b0 73 20 6f 70 74 69 6d 69 7a 65 64 20 73 6f 6d 65  s optimized some
179c0 77 68 61 74 20 2a 2f 0a 0a 2f 2a 20 23 64 65 66  what */../* #def
179d0 69 6e 65 20 46 31 28 78 2c 20 79 2c 20 7a 29 20  ine F1(x, y, z) 
179e0 28 78 20 26 20 79 20 7c 20 7e 78 20 26 20 7a 29  (x & y | ~x & z)
179f0 20 2a 2f 0a 23 64 65 66 69 6e 65 20 46 31 28 78   */.#define F1(x
17a00 2c 20 79 2c 20 7a 29 20 28 7a 20 5e 20 28 78 20  , y, z) (z ^ (x 
17a10 26 20 28 79 20 5e 20 7a 29 29 29 0a 23 64 65 66  & (y ^ z))).#def
17a20 69 6e 65 20 46 32 28 78 2c 20 79 2c 20 7a 29 20  ine F2(x, y, z) 
17a30 46 31 28 7a 2c 20 78 2c 20 79 29 0a 23 64 65 66  F1(z, x, y).#def
17a40 69 6e 65 20 46 33 28 78 2c 20 79 2c 20 7a 29 20  ine F3(x, y, z) 
17a50 28 78 20 5e 20 79 20 5e 20 7a 29 0a 23 64 65 66  (x ^ y ^ z).#def
17a60 69 6e 65 20 46 34 28 78 2c 20 79 2c 20 7a 29 20  ine F4(x, y, z) 
17a70 28 79 20 5e 20 28 78 20 7c 20 7e 7a 29 29 0a 0a  (y ^ (x | ~z))..
17a80 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 63  /* This is the c
17a90 65 6e 74 72 61 6c 20 73 74 65 70 20 69 6e 20 74  entral step in t
17aa0 68 65 20 4d 44 35 20 61 6c 67 6f 72 69 74 68 6d  he MD5 algorithm
17ab0 2e 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 44 35  . */.#define MD5
17ac0 53 54 45 50 28 66 2c 20 77 2c 20 78 2c 20 79 2c  STEP(f, w, x, y,
17ad0 20 7a 2c 20 64 61 74 61 2c 20 73 29 20 5c 0a 20   z, data, s) \. 
17ae0 20 20 20 20 20 20 20 28 20 77 20 2b 3d 20 66 28         ( w += f(
17af0 78 2c 20 79 2c 20 7a 29 20 2b 20 64 61 74 61 2c  x, y, z) + data,
17b00 20 20 77 20 3d 20 77 3c 3c 73 20 7c 20 77 3e 3e    w = w<<s | w>>
17b10 28 33 32 2d 73 29 2c 20 20 77 20 2b 3d 20 78 20  (32-s),  w += x 
17b20 29 0a 0a 2f 2a 0a 20 2a 20 54 68 65 20 63 6f 72  )../*. * The cor
17b30 65 20 6f 66 20 74 68 65 20 4d 44 35 20 61 6c 67  e of the MD5 alg
17b40 6f 72 69 74 68 6d 2c 20 74 68 69 73 20 61 6c 74  orithm, this alt
17b50 65 72 73 20 61 6e 20 65 78 69 73 74 69 6e 67 20  ers an existing 
17b60 4d 44 35 20 68 61 73 68 20 74 6f 0a 20 2a 20 72  MD5 hash to. * r
17b70 65 66 6c 65 63 74 20 74 68 65 20 61 64 64 69 74  eflect the addit
17b80 69 6f 6e 20 6f 66 20 31 36 20 6c 6f 6e 67 77 6f  ion of 16 longwo
17b90 72 64 73 20 6f 66 20 6e 65 77 20 64 61 74 61 2e  rds of new data.
17ba0 20 20 4d 44 35 55 70 64 61 74 65 20 62 6c 6f 63    MD5Update bloc
17bb0 6b 73 0a 20 2a 20 74 68 65 20 64 61 74 61 20 61  ks. * the data a
17bc0 6e 64 20 63 6f 6e 76 65 72 74 73 20 62 79 74 65  nd converts byte
17bd0 73 20 69 6e 74 6f 20 6c 6f 6e 67 77 6f 72 64 73  s into longwords
17be0 20 66 6f 72 20 74 68 69 73 20 72 6f 75 74 69 6e   for this routin
17bf0 65 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f  e.. */.static vo
17c00 69 64 20 4d 44 35 54 72 61 6e 73 66 6f 72 6d 28  id MD5Transform(
17c10 75 69 6e 74 33 32 20 62 75 66 5b 34 5d 2c 20 63  uint32 buf[4], c
17c20 6f 6e 73 74 20 75 69 6e 74 33 32 20 69 6e 5b 31  onst uint32 in[1
17c30 36 5d 29 7b 0a 20 20 20 20 20 20 20 20 72 65 67  6]){.        reg
17c40 69 73 74 65 72 20 75 69 6e 74 33 32 20 61 2c 20  ister uint32 a, 
17c50 62 2c 20 63 2c 20 64 3b 0a 0a 20 20 20 20 20 20  b, c, d;..      
17c60 20 20 61 20 3d 20 62 75 66 5b 30 5d 3b 0a 20 20    a = buf[0];.  
17c70 20 20 20 20 20 20 62 20 3d 20 62 75 66 5b 31 5d        b = buf[1]
17c80 3b 0a 20 20 20 20 20 20 20 20 63 20 3d 20 62 75  ;.        c = bu
17c90 66 5b 32 5d 3b 0a 20 20 20 20 20 20 20 20 64 20  f[2];.        d 
17ca0 3d 20 62 75 66 5b 33 5d 3b 0a 0a 20 20 20 20 20  = buf[3];..     
17cb0 20 20 20 4d 44 35 53 54 45 50 28 46 31 2c 20 61     MD5STEP(F1, a
17cc0 2c 20 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 20 30  , b, c, d, in[ 0
17cd0 5d 2b 30 78 64 37 36 61 61 34 37 38 2c 20 20 37  ]+0xd76aa478,  7
17ce0 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54  );.        MD5ST
17cf0 45 50 28 46 31 2c 20 64 2c 20 61 2c 20 62 2c 20  EP(F1, d, a, b, 
17d00 63 2c 20 69 6e 5b 20 31 5d 2b 30 78 65 38 63 37  c, in[ 1]+0xe8c7
17d10 62 37 35 36 2c 20 31 32 29 3b 0a 20 20 20 20 20  b756, 12);.     
17d20 20 20 20 4d 44 35 53 54 45 50 28 46 31 2c 20 63     MD5STEP(F1, c
17d30 2c 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 20 32  , d, a, b, in[ 2
17d40 5d 2b 30 78 32 34 32 30 37 30 64 62 2c 20 31 37  ]+0x242070db, 17
17d50 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54  );.        MD5ST
17d60 45 50 28 46 31 2c 20 62 2c 20 63 2c 20 64 2c 20  EP(F1, b, c, d, 
17d70 61 2c 20 69 6e 5b 20 33 5d 2b 30 78 63 31 62 64  a, in[ 3]+0xc1bd
17d80 63 65 65 65 2c 20 32 32 29 3b 0a 20 20 20 20 20  ceee, 22);.     
17d90 20 20 20 4d 44 35 53 54 45 50 28 46 31 2c 20 61     MD5STEP(F1, a
17da0 2c 20 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 20 34  , b, c, d, in[ 4
17db0 5d 2b 30 78 66 35 37 63 30 66 61 66 2c 20 20 37  ]+0xf57c0faf,  7
17dc0 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54  );.        MD5ST
17dd0 45 50 28 46 31 2c 20 64 2c 20 61 2c 20 62 2c 20  EP(F1, d, a, b, 
17de0 63 2c 20 69 6e 5b 20 35 5d 2b 30 78 34 37 38 37  c, in[ 5]+0x4787
17df0 63 36 32 61 2c 20 31 32 29 3b 0a 20 20 20 20 20  c62a, 12);.     
17e00 20 20 20 4d 44 35 53 54 45 50 28 46 31 2c 20 63     MD5STEP(F1, c
17e10 2c 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 20 36  , d, a, b, in[ 6
17e20 5d 2b 30 78 61 38 33 30 34 36 31 33 2c 20 31 37  ]+0xa8304613, 17
17e30 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54  );.        MD5ST
17e40 45 50 28 46 31 2c 20 62 2c 20 63 2c 20 64 2c 20  EP(F1, b, c, d, 
17e50 61 2c 20 69 6e 5b 20 37 5d 2b 30 78 66 64 34 36  a, in[ 7]+0xfd46
17e60 39 35 30 31 2c 20 32 32 29 3b 0a 20 20 20 20 20  9501, 22);.     
17e70 20 20 20 4d 44 35 53 54 45 50 28 46 31 2c 20 61     MD5STEP(F1, a
17e80 2c 20 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 20 38  , b, c, d, in[ 8
17e90 5d 2b 30 78 36 39 38 30 39 38 64 38 2c 20 20 37  ]+0x698098d8,  7
17ea0 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54  );.        MD5ST
17eb0 45 50 28 46 31 2c 20 64 2c 20 61 2c 20 62 2c 20  EP(F1, d, a, b, 
17ec0 63 2c 20 69 6e 5b 20 39 5d 2b 30 78 38 62 34 34  c, in[ 9]+0x8b44
17ed0 66 37 61 66 2c 20 31 32 29 3b 0a 20 20 20 20 20  f7af, 12);.     
17ee0 20 20 20 4d 44 35 53 54 45 50 28 46 31 2c 20 63     MD5STEP(F1, c
17ef0 2c 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 31 30  , d, a, b, in[10
17f00 5d 2b 30 78 66 66 66 66 35 62 62 31 2c 20 31 37  ]+0xffff5bb1, 17
17f10 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54  );.        MD5ST
17f20 45 50 28 46 31 2c 20 62 2c 20 63 2c 20 64 2c 20  EP(F1, b, c, d, 
17f30 61 2c 20 69 6e 5b 31 31 5d 2b 30 78 38 39 35 63  a, in[11]+0x895c
17f40 64 37 62 65 2c 20 32 32 29 3b 0a 20 20 20 20 20  d7be, 22);.     
17f50 20 20 20 4d 44 35 53 54 45 50 28 46 31 2c 20 61     MD5STEP(F1, a
17f60 2c 20 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 31 32  , b, c, d, in[12
17f70 5d 2b 30 78 36 62 39 30 31 31 32 32 2c 20 20 37  ]+0x6b901122,  7
17f80 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54  );.        MD5ST
17f90 45 50 28 46 31 2c 20 64 2c 20 61 2c 20 62 2c 20  EP(F1, d, a, b, 
17fa0 63 2c 20 69 6e 5b 31 33 5d 2b 30 78 66 64 39 38  c, in[13]+0xfd98
17fb0 37 31 39 33 2c 20 31 32 29 3b 0a 20 20 20 20 20  7193, 12);.     
17fc0 20 20 20 4d 44 35 53 54 45 50 28 46 31 2c 20 63     MD5STEP(F1, c
17fd0 2c 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 31 34  , d, a, b, in[14
17fe0 5d 2b 30 78 61 36 37 39 34 33 38 65 2c 20 31 37  ]+0xa679438e, 17
17ff0 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54  );.        MD5ST
18000 45 50 28 46 31 2c 20 62 2c 20 63 2c 20 64 2c 20  EP(F1, b, c, d, 
18010 61 2c 20 69 6e 5b 31 35 5d 2b 30 78 34 39 62 34  a, in[15]+0x49b4
18020 30 38 32 31 2c 20 32 32 29 3b 0a 0a 20 20 20 20  0821, 22);..    
18030 20 20 20 20 4d 44 35 53 54 45 50 28 46 32 2c 20      MD5STEP(F2, 
18040 61 2c 20 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 20  a, b, c, d, in[ 
18050 31 5d 2b 30 78 66 36 31 65 32 35 36 32 2c 20 20  1]+0xf61e2562,  
18060 35 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53  5);.        MD5S
18070 54 45 50 28 46 32 2c 20 64 2c 20 61 2c 20 62 2c  TEP(F2, d, a, b,
18080 20 63 2c 20 69 6e 5b 20 36 5d 2b 30 78 63 30 34   c, in[ 6]+0xc04
18090 30 62 33 34 30 2c 20 20 39 29 3b 0a 20 20 20 20  0b340,  9);.    
180a0 20 20 20 20 4d 44 35 53 54 45 50 28 46 32 2c 20      MD5STEP(F2, 
180b0 63 2c 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 31  c, d, a, b, in[1
180c0 31 5d 2b 30 78 32 36 35 65 35 61 35 31 2c 20 31  1]+0x265e5a51, 1
180d0 34 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53  4);.        MD5S
180e0 54 45 50 28 46 32 2c 20 62 2c 20 63 2c 20 64 2c  TEP(F2, b, c, d,
180f0 20 61 2c 20 69 6e 5b 20 30 5d 2b 30 78 65 39 62   a, in[ 0]+0xe9b
18100 36 63 37 61 61 2c 20 32 30 29 3b 0a 20 20 20 20  6c7aa, 20);.    
18110 20 20 20 20 4d 44 35 53 54 45 50 28 46 32 2c 20      MD5STEP(F2, 
18120 61 2c 20 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 20  a, b, c, d, in[ 
18130 35 5d 2b 30 78 64 36 32 66 31 30 35 64 2c 20 20  5]+0xd62f105d,  
18140 35 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53  5);.        MD5S
18150 54 45 50 28 46 32 2c 20 64 2c 20 61 2c 20 62 2c  TEP(F2, d, a, b,
18160 20 63 2c 20 69 6e 5b 31 30 5d 2b 30 78 30 32 34   c, in[10]+0x024
18170 34 31 34 35 33 2c 20 20 39 29 3b 0a 20 20 20 20  41453,  9);.    
18180 20 20 20 20 4d 44 35 53 54 45 50 28 46 32 2c 20      MD5STEP(F2, 
18190 63 2c 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 31  c, d, a, b, in[1
181a0 35 5d 2b 30 78 64 38 61 31 65 36 38 31 2c 20 31  5]+0xd8a1e681, 1
181b0 34 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53  4);.        MD5S
181c0 54 45 50 28 46 32 2c 20 62 2c 20 63 2c 20 64 2c  TEP(F2, b, c, d,
181d0 20 61 2c 20 69 6e 5b 20 34 5d 2b 30 78 65 37 64   a, in[ 4]+0xe7d
181e0 33 66 62 63 38 2c 20 32 30 29 3b 0a 20 20 20 20  3fbc8, 20);.    
181f0 20 20 20 20 4d 44 35 53 54 45 50 28 46 32 2c 20      MD5STEP(F2, 
18200 61 2c 20 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 20  a, b, c, d, in[ 
18210 39 5d 2b 30 78 32 31 65 31 63 64 65 36 2c 20 20  9]+0x21e1cde6,  
18220 35 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53  5);.        MD5S
18230 54 45 50 28 46 32 2c 20 64 2c 20 61 2c 20 62 2c  TEP(F2, d, a, b,
18240 20 63 2c 20 69 6e 5b 31 34 5d 2b 30 78 63 33 33   c, in[14]+0xc33
18250 37 30 37 64 36 2c 20 20 39 29 3b 0a 20 20 20 20  707d6,  9);.    
18260 20 20 20 20 4d 44 35 53 54 45 50 28 46 32 2c 20      MD5STEP(F2, 
18270 63 2c 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 20  c, d, a, b, in[ 
18280 33 5d 2b 30 78 66 34 64 35 30 64 38 37 2c 20 31  3]+0xf4d50d87, 1
18290 34 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53  4);.        MD5S
182a0 54 45 50 28 46 32 2c 20 62 2c 20 63 2c 20 64 2c  TEP(F2, b, c, d,
182b0 20 61 2c 20 69 6e 5b 20 38 5d 2b 30 78 34 35 35   a, in[ 8]+0x455
182c0 61 31 34 65 64 2c 20 32 30 29 3b 0a 20 20 20 20  a14ed, 20);.    
182d0 20 20 20 20 4d 44 35 53 54 45 50 28 46 32 2c 20      MD5STEP(F2, 
182e0 61 2c 20 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 31  a, b, c, d, in[1
182f0 33 5d 2b 30 78 61 39 65 33 65 39 30 35 2c 20 20  3]+0xa9e3e905,  
18300 35 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53  5);.        MD5S
18310 54 45 50 28 46 32 2c 20 64 2c 20 61 2c 20 62 2c  TEP(F2, d, a, b,
18320 20 63 2c 20 69 6e 5b 20 32 5d 2b 30 78 66 63 65   c, in[ 2]+0xfce
18330 66 61 33 66 38 2c 20 20 39 29 3b 0a 20 20 20 20  fa3f8,  9);.    
18340 20 20 20 20 4d 44 35 53 54 45 50 28 46 32 2c 20      MD5STEP(F2, 
18350 63 2c 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 20  c, d, a, b, in[ 
18360 37 5d 2b 30 78 36 37 36 66 30 32 64 39 2c 20 31  7]+0x676f02d9, 1
18370 34 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53  4);.        MD5S
18380 54 45 50 28 46 32 2c 20 62 2c 20 63 2c 20 64 2c  TEP(F2, b, c, d,
18390 20 61 2c 20 69 6e 5b 31 32 5d 2b 30 78 38 64 32   a, in[12]+0x8d2
183a0 61 34 63 38 61 2c 20 32 30 29 3b 0a 0a 20 20 20  a4c8a, 20);..   
183b0 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 33 2c       MD5STEP(F3,
183c0 20 61 2c 20 62 2c 20 63 2c 20 64 2c 20 69 6e 5b   a, b, c, d, in[
183d0 20 35 5d 2b 30 78 66 66 66 61 33 39 34 32 2c 20   5]+0xfffa3942, 
183e0 20 34 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35   4);.        MD5
183f0 53 54 45 50 28 46 33 2c 20 64 2c 20 61 2c 20 62  STEP(F3, d, a, b
18400 2c 20 63 2c 20 69 6e 5b 20 38 5d 2b 30 78 38 37  , c, in[ 8]+0x87
18410 37 31 66 36 38 31 2c 20 31 31 29 3b 0a 20 20 20  71f681, 11);.   
18420 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 33 2c       MD5STEP(F3,
18430 20 63 2c 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b   c, d, a, b, in[
18440 31 31 5d 2b 30 78 36 64 39 64 36 31 32 32 2c 20  11]+0x6d9d6122, 
18450 31 36 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35  16);.        MD5
18460 53 54 45 50 28 46 33 2c 20 62 2c 20 63 2c 20 64  STEP(F3, b, c, d
18470 2c 20 61 2c 20 69 6e 5b 31 34 5d 2b 30 78 66 64  , a, in[14]+0xfd
18480 65 35 33 38 30 63 2c 20 32 33 29 3b 0a 20 20 20  e5380c, 23);.   
18490 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 33 2c       MD5STEP(F3,
184a0 20 61 2c 20 62 2c 20 63 2c 20 64 2c 20 69 6e 5b   a, b, c, d, in[
184b0 20 31 5d 2b 30 78 61 34 62 65 65 61 34 34 2c 20   1]+0xa4beea44, 
184c0 20 34 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35   4);.        MD5
184d0 53 54 45 50 28 46 33 2c 20 64 2c 20 61 2c 20 62  STEP(F3, d, a, b
184e0 2c 20 63 2c 20 69 6e 5b 20 34 5d 2b 30 78 34 62  , c, in[ 4]+0x4b
184f0 64 65 63 66 61 39 2c 20 31 31 29 3b 0a 20 20 20  decfa9, 11);.   
18500 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 33 2c       MD5STEP(F3,
18510 20 63 2c 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b   c, d, a, b, in[
18520 20 37 5d 2b 30 78 66 36 62 62 34 62 36 30 2c 20   7]+0xf6bb4b60, 
18530 31 36 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35  16);.        MD5
18540 53 54 45 50 28 46 33 2c 20 62 2c 20 63 2c 20 64  STEP(F3, b, c, d
18550 2c 20 61 2c 20 69 6e 5b 31 30 5d 2b 30 78 62 65  , a, in[10]+0xbe
18560 62 66 62 63 37 30 2c 20 32 33 29 3b 0a 20 20 20  bfbc70, 23);.   
18570 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 33 2c       MD5STEP(F3,
18580 20 61 2c 20 62 2c 20 63 2c 20 64 2c 20 69 6e 5b   a, b, c, d, in[
18590 31 33 5d 2b 30 78 32 38 39 62 37 65 63 36 2c 20  13]+0x289b7ec6, 
185a0 20 34 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35   4);.        MD5
185b0 53 54 45 50 28 46 33 2c 20 64 2c 20 61 2c 20 62  STEP(F3, d, a, b
185c0 2c 20 63 2c 20 69 6e 5b 20 30 5d 2b 30 78 65 61  , c, in[ 0]+0xea
185d0 61 31 32 37 66 61 2c 20 31 31 29 3b 0a 20 20 20  a127fa, 11);.   
185e0 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 33 2c       MD5STEP(F3,
185f0 20 63 2c 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b   c, d, a, b, in[
18600 20 33 5d 2b 30 78 64 34 65 66 33 30 38 35 2c 20   3]+0xd4ef3085, 
18610 31 36 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35  16);.        MD5
18620 53 54 45 50 28 46 33 2c 20 62 2c 20 63 2c 20 64  STEP(F3, b, c, d
18630 2c 20 61 2c 20 69 6e 5b 20 36 5d 2b 30 78 30 34  , a, in[ 6]+0x04
18640 38 38 31 64 30 35 2c 20 32 33 29 3b 0a 20 20 20  881d05, 23);.   
18650 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 33 2c       MD5STEP(F3,
18660 20 61 2c 20 62 2c 20 63 2c 20 64 2c 20 69 6e 5b   a, b, c, d, in[
18670 20 39 5d 2b 30 78 64 39 64 34 64 30 33 39 2c 20   9]+0xd9d4d039, 
18680 20 34 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35   4);.        MD5
18690 53 54 45 50 28 46 33 2c 20 64 2c 20 61 2c 20 62  STEP(F3, d, a, b
186a0 2c 20 63 2c 20 69 6e 5b 31 32 5d 2b 30 78 65 36  , c, in[12]+0xe6
186b0 64 62 39 39 65 35 2c 20 31 31 29 3b 0a 20 20 20  db99e5, 11);.   
186c0 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 33 2c       MD5STEP(F3,
186d0 20 63 2c 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b   c, d, a, b, in[
186e0 31 35 5d 2b 30 78 31 66 61 32 37 63 66 38 2c 20  15]+0x1fa27cf8, 
186f0 31 36 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35  16);.        MD5
18700 53 54 45 50 28 46 33 2c 20 62 2c 20 63 2c 20 64  STEP(F3, b, c, d
18710 2c 20 61 2c 20 69 6e 5b 20 32 5d 2b 30 78 63 34  , a, in[ 2]+0xc4
18720 61 63 35 36 36 35 2c 20 32 33 29 3b 0a 0a 20 20  ac5665, 23);..  
18730 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 34        MD5STEP(F4
18740 2c 20 61 2c 20 62 2c 20 63 2c 20 64 2c 20 69 6e  , a, b, c, d, in
18750 5b 20 30 5d 2b 30 78 66 34 32 39 32 32 34 34 2c  [ 0]+0xf4292244,
18760 20 20 36 29 3b 0a 20 20 20 20 20 20 20 20 4d 44    6);.        MD
18770 35 53 54 45 50 28 46 34 2c 20 64 2c 20 61 2c 20  5STEP(F4, d, a, 
18780 62 2c 20 63 2c 20 69 6e 5b 20 37 5d 2b 30 78 34  b, c, in[ 7]+0x4
18790 33 32 61 66 66 39 37 2c 20 31 30 29 3b 0a 20 20  32aff97, 10);.  
187a0 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 34        MD5STEP(F4
187b0 2c 20 63 2c 20 64 2c 20 61 2c 20 62 2c 20 69 6e  , c, d, a, b, in
187c0 5b 31 34 5d 2b 30 78 61 62 39 34 32 33 61 37 2c  [14]+0xab9423a7,
187d0 20 31 35 29 3b 0a 20 20 20 20 20 20 20 20 4d 44   15);.        MD
187e0 35 53 54 45 50 28 46 34 2c 20 62 2c 20 63 2c 20  5STEP(F4, b, c, 
187f0 64 2c 20 61 2c 20 69 6e 5b 20 35 5d 2b 30 78 66  d, a, in[ 5]+0xf
18800 63 39 33 61 30 33 39 2c 20 32 31 29 3b 0a 20 20  c93a039, 21);.  
18810 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 34        MD5STEP(F4
18820 2c 20 61 2c 20 62 2c 20 63 2c 20 64 2c 20 69 6e  , a, b, c, d, in
18830 5b 31 32 5d 2b 30 78 36 35 35 62 35 39 63 33 2c  [12]+0x655b59c3,
18840 20 20 36 29 3b 0a 20 20 20 20 20 20 20 20 4d 44    6);.        MD
18850 35 53 54 45 50 28 46 34 2c 20 64 2c 20 61 2c 20  5STEP(F4, d, a, 
18860 62 2c 20 63 2c 20 69 6e 5b 20 33 5d 2b 30 78 38  b, c, in[ 3]+0x8
18870 66 30 63 63 63 39 32 2c 20 31 30 29 3b 0a 20 20  f0ccc92, 10);.  
18880 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 34        MD5STEP(F4
18890 2c 20 63 2c 20 64 2c 20 61 2c 20 62 2c 20 69 6e  , c, d, a, b, in
188a0 5b 31 30 5d 2b 30 78 66 66 65 66 66 34 37 64 2c  [10]+0xffeff47d,
188b0 20 31 35 29 3b 0a 20 20 20 20 20 20 20 20 4d 44   15);.        MD
188c0 35 53 54 45 50 28 46 34 2c 20 62 2c 20 63 2c 20  5STEP(F4, b, c, 
188d0 64 2c 20 61 2c 20 69 6e 5b 20 31 5d 2b 30 78 38  d, a, in[ 1]+0x8
188e0 35 38 34 35 64 64 31 2c 20 32 31 29 3b 0a 20 20  5845dd1, 21);.  
188f0 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 34        MD5STEP(F4
18900 2c 20 61 2c 20 62 2c 20 63 2c 20 64 2c 20 69 6e  , a, b, c, d, in
18910 5b 20 38 5d 2b 30 78 36 66 61 38 37 65 34 66 2c  [ 8]+0x6fa87e4f,
18920 20 20 36 29 3b 0a 20 20 20 20 20 20 20 20 4d 44    6);.        MD
18930 35 53 54 45 50 28 46 34 2c 20 64 2c 20 61 2c 20  5STEP(F4, d, a, 
18940 62 2c 20 63 2c 20 69 6e 5b 31 35 5d 2b 30 78 66  b, c, in[15]+0xf
18950 65 32 63 65 36 65 30 2c 20 31 30 29 3b 0a 20 20  e2ce6e0, 10);.  
18960 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 34        MD5STEP(F4
18970 2c 20 63 2c 20 64 2c 20 61 2c 20 62 2c 20 69 6e  , c, d, a, b, in
18980 5b 20 36 5d 2b 30 78 61 33 30 31 34 33 31 34 2c  [ 6]+0xa3014314,
18990 20 31 35 29 3b 0a 20 20 20 20 20 20 20 20 4d 44   15);.        MD
189a0 35 53 54 45 50 28 46 34 2c 20 62 2c 20 63 2c 20  5STEP(F4, b, c, 
189b0 64 2c 20 61 2c 20 69 6e 5b 31 33 5d 2b 30 78 34  d, a, in[13]+0x4
189c0 65 30 38 31 31 61 31 2c 20 32 31 29 3b 0a 20 20  e0811a1, 21);.  
189d0 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 34        MD5STEP(F4
189e0 2c 20 61 2c 20 62 2c 20 63 2c 20 64 2c 20 69 6e  , a, b, c, d, in
189f0 5b 20 34 5d 2b 30 78 66 37 35 33 37 65 38 32 2c  [ 4]+0xf7537e82,
18a00 20 20 36 29 3b 0a 20 20 20 20 20 20 20 20 4d 44    6);.        MD
18a10 35 53 54 45 50 28 46 34 2c 20 64 2c 20 61 2c 20  5STEP(F4, d, a, 
18a20 62 2c 20 63 2c 20 69 6e 5b 31 31 5d 2b 30 78 62  b, c, in[11]+0xb
18a30 64 33 61 66 32 33 35 2c 20 31 30 29 3b 0a 20 20  d3af235, 10);.  
18a40 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 34        MD5STEP(F4
18a50 2c 20 63 2c 20 64 2c 20 61 2c 20 62 2c 20 69 6e  , c, d, a, b, in
18a60 5b 20 32 5d 2b 30 78 32 61 64 37 64 32 62 62 2c  [ 2]+0x2ad7d2bb,
18a70 20 31 35 29 3b 0a 20 20 20 20 20 20 20 20 4d 44   15);.        MD
18a80 35 53 54 45 50 28 46 34 2c 20 62 2c 20 63 2c 20  5STEP(F4, b, c, 
18a90 64 2c 20 61 2c 20 69 6e 5b 20 39 5d 2b 30 78 65  d, a, in[ 9]+0xe
18aa0 62 38 36 64 33 39 31 2c 20 32 31 29 3b 0a 0a 20  b86d391, 21);.. 
18ab0 20 20 20 20 20 20 20 62 75 66 5b 30 5d 20 2b 3d         buf[0] +=
18ac0 20 61 3b 0a 20 20 20 20 20 20 20 20 62 75 66 5b   a;.        buf[
18ad0 31 5d 20 2b 3d 20 62 3b 0a 20 20 20 20 20 20 20  1] += b;.       
18ae0 20 62 75 66 5b 32 5d 20 2b 3d 20 63 3b 0a 20 20   buf[2] += c;.  
18af0 20 20 20 20 20 20 62 75 66 5b 33 5d 20 2b 3d 20        buf[3] += 
18b00 64 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 74 61 72  d;.}../*. * Star
18b10 74 20 4d 44 35 20 61 63 63 75 6d 75 6c 61 74 69  t MD5 accumulati
18b20 6f 6e 2e 20 20 53 65 74 20 62 69 74 20 63 6f 75  on.  Set bit cou
18b30 6e 74 20 74 6f 20 30 20 61 6e 64 20 62 75 66 66  nt to 0 and buff
18b40 65 72 20 74 6f 20 6d 79 73 74 65 72 69 6f 75 73  er to mysterious
18b50 0a 20 2a 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  . * initializati
18b60 6f 6e 20 63 6f 6e 73 74 61 6e 74 73 2e 0a 20 2a  on constants.. *
18b70 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 4d 44  /.static void MD
18b80 35 49 6e 69 74 28 4d 44 35 43 6f 6e 74 65 78 74  5Init(MD5Context
18b90 20 2a 63 74 78 29 7b 0a 20 20 20 20 20 20 20 20   *ctx){.        
18ba0 63 74 78 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b  ctx->isInit = 1;
18bb0 0a 20 20 20 20 20 20 20 20 63 74 78 2d 3e 62 75  .        ctx->bu
18bc0 66 5b 30 5d 20 3d 20 30 78 36 37 34 35 32 33 30  f[0] = 0x6745230
18bd0 31 3b 0a 20 20 20 20 20 20 20 20 63 74 78 2d 3e  1;.        ctx->
18be0 62 75 66 5b 31 5d 20 3d 20 30 78 65 66 63 64 61  buf[1] = 0xefcda
18bf0 62 38 39 3b 0a 20 20 20 20 20 20 20 20 63 74 78  b89;.        ctx
18c00 2d 3e 62 75 66 5b 32 5d 20 3d 20 30 78 39 38 62  ->buf[2] = 0x98b
18c10 61 64 63 66 65 3b 0a 20 20 20 20 20 20 20 20 63  adcfe;.        c
18c20 74 78 2d 3e 62 75 66 5b 33 5d 20 3d 20 30 78 31  tx->buf[3] = 0x1
18c30 30 33 32 35 34 37 36 3b 0a 20 20 20 20 20 20 20  0325476;.       
18c40 20 63 74 78 2d 3e 62 69 74 73 5b 30 5d 20 3d 20   ctx->bits[0] = 
18c50 30 3b 0a 20 20 20 20 20 20 20 20 63 74 78 2d 3e  0;.        ctx->
18c60 62 69 74 73 5b 31 5d 20 3d 20 30 3b 0a 7d 0a 0a  bits[1] = 0;.}..
18c70 2f 2a 0a 20 2a 20 55 70 64 61 74 65 20 63 6f 6e  /*. * Update con
18c80 74 65 78 74 20 74 6f 20 72 65 66 6c 65 63 74 20  text to reflect 
18c90 74 68 65 20 63 6f 6e 63 61 74 65 6e 61 74 69 6f  the concatenatio
18ca0 6e 20 6f 66 20 61 6e 6f 74 68 65 72 20 62 75 66  n of another buf
18cb0 66 65 72 20 66 75 6c 6c 0a 20 2a 20 6f 66 20 62  fer full. * of b
18cc0 79 74 65 73 2e 0a 20 2a 2f 0a 73 74 61 74 69 63  ytes.. */.static
18cd0 20 0a 76 6f 69 64 20 4d 44 35 55 70 64 61 74 65   .void MD5Update
18ce0 28 4d 44 35 43 6f 6e 74 65 78 74 20 2a 63 74 78  (MD5Context *ctx
18cf0 2c 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64  , const unsigned
18d00 20 63 68 61 72 20 2a 62 75 66 2c 20 75 6e 73 69   char *buf, unsi
18d10 67 6e 65 64 20 69 6e 74 20 6c 65 6e 29 7b 0a 20  gned int len){. 
18d20 20 20 20 20 20 20 20 75 69 6e 74 33 32 20 74 3b         uint32 t;
18d30 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 55 70 64  ..        /* Upd
18d40 61 74 65 20 62 69 74 63 6f 75 6e 74 20 2a 2f 0a  ate bitcount */.
18d50 0a 20 20 20 20 20 20 20 20 74 20 3d 20 63 74 78  .        t = ctx
18d60 2d 3e 62 69 74 73 5b 30 5d 3b 0a 20 20 20 20 20  ->bits[0];.     
18d70 20 20 20 69 66 20 28 28 63 74 78 2d 3e 62 69 74     if ((ctx->bit
18d80 73 5b 30 5d 20 3d 20 74 20 2b 20 28 28 75 69 6e  s[0] = t + ((uin
18d90 74 33 32 29 6c 65 6e 20 3c 3c 20 33 29 29 20 3c  t32)len << 3)) <
18da0 20 74 29 0a 20 20 20 20 20 20 20 20 20 20 20 20   t).            
18db0 20 20 20 20 63 74 78 2d 3e 62 69 74 73 5b 31 5d      ctx->bits[1]
18dc0 2b 2b 3b 20 2f 2a 20 43 61 72 72 79 20 66 72 6f  ++; /* Carry fro
18dd0 6d 20 6c 6f 77 20 74 6f 20 68 69 67 68 20 2a 2f  m low to high */
18de0 0a 20 20 20 20 20 20 20 20 63 74 78 2d 3e 62 69  .        ctx->bi
18df0 74 73 5b 31 5d 20 2b 3d 20 6c 65 6e 20 3e 3e 20  ts[1] += len >> 
18e00 32 39 3b 0a 0a 20 20 20 20 20 20 20 20 74 20 3d  29;..        t =
18e10 20 28 74 20 3e 3e 20 33 29 20 26 20 30 78 33 66   (t >> 3) & 0x3f
18e20 3b 20 20 20 20 2f 2a 20 42 79 74 65 73 20 61 6c  ;    /* Bytes al
18e30 72 65 61 64 79 20 69 6e 20 73 68 73 49 6e 66 6f  ready in shsInfo
18e40 2d 3e 64 61 74 61 20 2a 2f 0a 0a 20 20 20 20 20  ->data */..     
18e50 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 61 6e 79     /* Handle any
18e60 20 6c 65 61 64 69 6e 67 20 6f 64 64 2d 73 69 7a   leading odd-siz
18e70 65 64 20 63 68 75 6e 6b 73 20 2a 2f 0a 0a 20 20  ed chunks */..  
18e80 20 20 20 20 20 20 69 66 20 28 20 74 20 29 20 7b        if ( t ) {
18e90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
18ea0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
18eb0 70 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68  p = (unsigned ch
18ec0 61 72 20 2a 29 63 74 78 2d 3e 69 6e 20 2b 20 74  ar *)ctx->in + t
18ed0 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ;..             
18ee0 20 20 20 74 20 3d 20 36 34 2d 74 3b 0a 20 20 20     t = 64-t;.   
18ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
18f00 28 6c 65 6e 20 3c 20 74 29 20 7b 0a 20 20 20 20  (len < t) {.    
18f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18f20 20 20 20 20 6d 65 6d 63 70 79 28 70 2c 20 62 75      memcpy(p, bu
18f30 66 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 20 20 20  f, len);.       
18f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18f50 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20   return;.       
18f60 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
18f70 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70             memcp
18f80 79 28 70 2c 20 62 75 66 2c 20 74 29 3b 0a 20 20  y(p, buf, t);.  
18f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 79                by
18fa0 74 65 52 65 76 65 72 73 65 28 63 74 78 2d 3e 69  teReverse(ctx->i
18fb0 6e 2c 20 31 36 29 3b 0a 20 20 20 20 20 20 20 20  n, 16);.        
18fc0 20 20 20 20 20 20 20 20 4d 44 35 54 72 61 6e 73          MD5Trans
18fd0 66 6f 72 6d 28 63 74 78 2d 3e 62 75 66 2c 20 28  form(ctx->buf, (
18fe0 75 69 6e 74 33 32 20 2a 29 63 74 78 2d 3e 69 6e  uint32 *)ctx->in
18ff0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
19000 20 20 20 62 75 66 20 2b 3d 20 74 3b 0a 20 20 20     buf += t;.   
19010 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 65 6e               len
19020 20 2d 3d 20 74 3b 0a 20 20 20 20 20 20 20 20 7d   -= t;.        }
19030 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 50 72 6f  ..        /* Pro
19040 63 65 73 73 20 64 61 74 61 20 69 6e 20 36 34 2d  cess data in 64-
19050 62 79 74 65 20 63 68 75 6e 6b 73 20 2a 2f 0a 0a  byte chunks */..
19060 20 20 20 20 20 20 20 20 77 68 69 6c 65 20 28 6c          while (l
19070 65 6e 20 3e 3d 20 36 34 29 20 7b 0a 20 20 20 20  en >= 64) {.    
19080 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63              memc
19090 70 79 28 63 74 78 2d 3e 69 6e 2c 20 62 75 66 2c  py(ctx->in, buf,
190a0 20 36 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20   64);.          
190b0 20 20 20 20 20 20 62 79 74 65 52 65 76 65 72 73        byteRevers
190c0 65 28 63 74 78 2d 3e 69 6e 2c 20 31 36 29 3b 0a  e(ctx->in, 16);.
190d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
190e0 4d 44 35 54 72 61 6e 73 66 6f 72 6d 28 63 74 78  MD5Transform(ctx
190f0 2d 3e 62 75 66 2c 20 28 75 69 6e 74 33 32 20 2a  ->buf, (uint32 *
19100 29 63 74 78 2d 3e 69 6e 29 3b 0a 20 20 20 20 20  )ctx->in);.     
19110 20 20 20 20 20 20 20 20 20 20 20 62 75 66 20 2b             buf +
19120 3d 20 36 34 3b 0a 20 20 20 20 20 20 20 20 20 20  = 64;.          
19130 20 20 20 20 20 20 6c 65 6e 20 2d 3d 20 36 34 3b        len -= 64;
19140 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
19150 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 61 6e      /* Handle an
19160 79 20 72 65 6d 61 69 6e 69 6e 67 20 62 79 74 65  y remaining byte
19170 73 20 6f 66 20 64 61 74 61 2e 20 2a 2f 0a 0a 20  s of data. */.. 
19180 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 63 74         memcpy(ct
19190 78 2d 3e 69 6e 2c 20 62 75 66 2c 20 6c 65 6e 29  x->in, buf, len)
191a0 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 46 69 6e 61 6c  ;.}../*. * Final
191b0 20 77 72 61 70 75 70 20 2d 20 70 61 64 20 74 6f   wrapup - pad to
191c0 20 36 34 2d 62 79 74 65 20 62 6f 75 6e 64 61 72   64-byte boundar
191d0 79 20 77 69 74 68 20 74 68 65 20 62 69 74 20 70  y with the bit p
191e0 61 74 74 65 72 6e 20 0a 20 2a 20 31 20 30 2a 20  attern . * 1 0* 
191f0 28 36 34 2d 62 69 74 20 63 6f 75 6e 74 20 6f 66  (64-bit count of
19200 20 62 69 74 73 20 70 72 6f 63 65 73 73 65 64 2c   bits processed,
19210 20 4d 53 42 2d 66 69 72 73 74 29 0a 20 2a 2f 0a   MSB-first). */.
19220 73 74 61 74 69 63 20 76 6f 69 64 20 4d 44 35 46  static void MD5F
19230 69 6e 61 6c 28 75 6e 73 69 67 6e 65 64 20 63 68  inal(unsigned ch
19240 61 72 20 64 69 67 65 73 74 5b 31 36 5d 2c 20 4d  ar digest[16], M
19250 44 35 43 6f 6e 74 65 78 74 20 2a 63 74 78 29 7b  D5Context *ctx){
19260 0a 20 20 20 20 20 20 20 20 75 6e 73 69 67 6e 65  .        unsigne
19270 64 20 63 6f 75 6e 74 3b 0a 20 20 20 20 20 20 20  d count;.       
19280 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
19290 70 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 43  p;..        /* C
192a0 6f 6d 70 75 74 65 20 6e 75 6d 62 65 72 20 6f 66  ompute number of
192b0 20 62 79 74 65 73 20 6d 6f 64 20 36 34 20 2a 2f   bytes mod 64 */
192c0 0a 20 20 20 20 20 20 20 20 63 6f 75 6e 74 20 3d  .        count =
192d0 20 28 63 74 78 2d 3e 62 69 74 73 5b 30 5d 20 3e   (ctx->bits[0] >
192e0 3e 20 33 29 20 26 20 30 78 33 46 3b 0a 0a 20 20  > 3) & 0x3F;..  
192f0 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65        /* Set the
19300 20 66 69 72 73 74 20 63 68 61 72 20 6f 66 20 70   first char of p
19310 61 64 64 69 6e 67 20 74 6f 20 30 78 38 30 2e 20  adding to 0x80. 
19320 20 54 68 69 73 20 69 73 20 73 61 66 65 20 73 69   This is safe si
19330 6e 63 65 20 74 68 65 72 65 20 69 73 0a 20 20 20  nce there is.   
19340 20 20 20 20 20 20 20 20 61 6c 77 61 79 73 20 61          always a
19350 74 20 6c 65 61 73 74 20 6f 6e 65 20 62 79 74 65  t least one byte
19360 20 66 72 65 65 20 2a 2f 0a 20 20 20 20 20 20 20   free */.       
19370 20 70 20 3d 20 63 74 78 2d 3e 69 6e 20 2b 20 63   p = ctx->in + c
19380 6f 75 6e 74 3b 0a 20 20 20 20 20 20 20 20 2a 70  ount;.        *p
19390 2b 2b 20 3d 20 30 78 38 30 3b 0a 0a 20 20 20 20  ++ = 0x80;..    
193a0 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20      /* Bytes of 
193b0 70 61 64 64 69 6e 67 20 6e 65 65 64 65 64 20 74  padding needed t
193c0 6f 20 6d 61 6b 65 20 36 34 20 62 79 74 65 73 20  o make 64 bytes 
193d0 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f 75 6e 74  */.        count
193e0 20 3d 20 36 34 20 2d 20 31 20 2d 20 63 6f 75 6e   = 64 - 1 - coun
193f0 74 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 50  t;..        /* P
19400 61 64 20 6f 75 74 20 74 6f 20 35 36 20 6d 6f 64  ad out to 56 mod
19410 20 36 34 20 2a 2f 0a 20 20 20 20 20 20 20 20 69   64 */.        i
19420 66 20 28 63 6f 75 6e 74 20 3c 20 38 29 20 7b 0a  f (count < 8) {.
19430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19440 2f 2a 20 54 77 6f 20 6c 6f 74 73 20 6f 66 20 70  /* Two lots of p
19450 61 64 64 69 6e 67 3a 20 20 50 61 64 20 74 68 65  adding:  Pad the
19460 20 66 69 72 73 74 20 62 6c 6f 63 6b 20 74 6f 20   first block to 
19470 36 34 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20  64 bytes */.    
19480 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 73              mems
19490 65 74 28 70 2c 20 30 2c 20 63 6f 75 6e 74 29 3b  et(p, 0, count);
194a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
194b0 20 62 79 74 65 52 65 76 65 72 73 65 28 63 74 78   byteReverse(ctx
194c0 2d 3e 69 6e 2c 20 31 36 29 3b 0a 20 20 20 20 20  ->in, 16);.     
194d0 20 20 20 20 20 20 20 20 20 20 20 4d 44 35 54 72             MD5Tr
194e0 61 6e 73 66 6f 72 6d 28 63 74 78 2d 3e 62 75 66  ansform(ctx->buf
194f0 2c 20 28 75 69 6e 74 33 32 20 2a 29 63 74 78 2d  , (uint32 *)ctx-
19500 3e 69 6e 29 3b 0a 0a 20 20 20 20 20 20 20 20 20  >in);..         
19510 20 20 20 20 20 20 20 2f 2a 20 4e 6f 77 20 66 69         /* Now fi
19520 6c 6c 20 74 68 65 20 6e 65 78 74 20 62 6c 6f 63  ll the next bloc
19530 6b 20 77 69 74 68 20 35 36 20 62 79 74 65 73 20  k with 56 bytes 
19540 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
19550 20 20 20 6d 65 6d 73 65 74 28 63 74 78 2d 3e 69     memset(ctx->i
19560 6e 2c 20 30 2c 20 35 36 29 3b 0a 20 20 20 20 20  n, 0, 56);.     
19570 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
19580 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
19590 61 64 20 62 6c 6f 63 6b 20 74 6f 20 35 36 20 62  ad block to 56 b
195a0 79 74 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  ytes */.        
195b0 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70          memset(p
195c0 2c 20 30 2c 20 63 6f 75 6e 74 2d 38 29 3b 0a 20  , 0, count-8);. 
195d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
195e0 20 62 79 74 65 52 65 76 65 72 73 65 28 63 74 78   byteReverse(ctx
195f0 2d 3e 69 6e 2c 20 31 34 29 3b 0a 0a 20 20 20 20  ->in, 14);..    
19600 20 20 20 20 2f 2a 20 41 70 70 65 6e 64 20 6c 65      /* Append le
19610 6e 67 74 68 20 69 6e 20 62 69 74 73 20 61 6e 64  ngth in bits and
19620 20 74 72 61 6e 73 66 6f 72 6d 20 2a 2f 0a 20 20   transform */.  
19630 20 20 20 20 20 20 28 28 75 69 6e 74 33 32 20 2a        ((uint32 *
19640 29 63 74 78 2d 3e 69 6e 29 5b 20 31 34 20 5d 20  )ctx->in)[ 14 ] 
19650 3d 20 63 74 78 2d 3e 62 69 74 73 5b 30 5d 3b 0a  = ctx->bits[0];.
19660 20 20 20 20 20 20 20 20 28 28 75 69 6e 74 33 32          ((uint32
19670 20 2a 29 63 74 78 2d 3e 69 6e 29 5b 20 31 35 20   *)ctx->in)[ 15 
19680 5d 20 3d 20 63 74 78 2d 3e 62 69 74 73 5b 31 5d  ] = ctx->bits[1]
19690 3b 0a 0a 20 20 20 20 20 20 20 20 4d 44 35 54 72  ;..        MD5Tr
196a0 61 6e 73 66 6f 72 6d 28 63 74 78 2d 3e 62 75 66  ansform(ctx->buf
196b0 2c 20 28 75 69 6e 74 33 32 20 2a 29 63 74 78 2d  , (uint32 *)ctx-
196c0 3e 69 6e 29 3b 0a 20 20 20 20 20 20 20 20 62 79  >in);.        by
196d0 74 65 52 65 76 65 72 73 65 28 28 75 6e 73 69 67  teReverse((unsig
196e0 6e 65 64 20 63 68 61 72 20 2a 29 63 74 78 2d 3e  ned char *)ctx->
196f0 62 75 66 2c 20 34 29 3b 0a 20 20 20 20 20 20 20  buf, 4);.       
19700 20 6d 65 6d 63 70 79 28 64 69 67 65 73 74 2c 20   memcpy(digest, 
19710 63 74 78 2d 3e 62 75 66 2c 20 31 36 29 3b 0a 20  ctx->buf, 16);. 
19720 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 63 74         memset(ct
19730 78 2c 20 30 2c 20 73 69 7a 65 6f 66 28 63 74 78  x, 0, sizeof(ctx
19740 29 29 3b 20 20 20 20 2f 2a 20 49 6e 20 63 61 73  ));    /* In cas
19750 65 20 69 74 20 69 73 20 73 65 6e 73 69 74 69 76  e it is sensitiv
19760 65 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  e */.}../*.** Co
19770 6e 76 65 72 74 20 61 20 31 32 38 2d 62 69 74 20  nvert a 128-bit 
19780 4d 44 35 20 64 69 67 65 73 74 20 69 6e 74 6f 20  MD5 digest into 
19790 61 20 33 32 2d 64 69 67 69 74 20 62 61 73 65 2d  a 32-digit base-
197a0 31 36 20 6e 75 6d 62 65 72 2e 0a 2a 2f 0a 73 74  16 number..*/.st
197b0 61 74 69 63 20 76 6f 69 64 20 4d 44 35 44 69 67  atic void MD5Dig
197c0 65 73 74 54 6f 42 61 73 65 31 36 28 75 6e 73 69  estToBase16(unsi
197d0 67 6e 65 64 20 63 68 61 72 20 2a 64 69 67 65 73  gned char *diges
197e0 74 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a  t, char *zBuf){.
197f0 20 20 73 74 61 74 69 63 20 63 68 61 72 20 63 6f    static char co
19800 6e 73 74 20 7a 45 6e 63 6f 64 65 5b 5d 20 3d 20  nst zEncode[] = 
19810 22 30 31 32 33 34 35 36 37 38 39 61 62 63 64 65  "0123456789abcde
19820 66 22 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  f";.  int i, j;.
19830 0a 20 20 66 6f 72 28 6a 3d 69 3d 30 3b 20 69 3c  .  for(j=i=0; i<
19840 31 36 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e  16; i++){.    in
19850 74 20 61 20 3d 20 64 69 67 65 73 74 5b 69 5d 3b  t a = digest[i];
19860 0a 20 20 20 20 7a 42 75 66 5b 6a 2b 2b 5d 20 3d  .    zBuf[j++] =
19870 20 7a 45 6e 63 6f 64 65 5b 28 61 3e 3e 34 29 26   zEncode[(a>>4)&
19880 30 78 66 5d 3b 0a 20 20 20 20 7a 42 75 66 5b 6a  0xf];.    zBuf[j
19890 2b 2b 5d 20 3d 20 7a 45 6e 63 6f 64 65 5b 61 20  ++] = zEncode[a 
198a0 26 20 30 78 66 5d 3b 0a 20 20 7d 0a 20 20 7a 42  & 0xf];.  }.  zB
198b0 75 66 5b 6a 5d 20 3d 20 30 3b 0a 7d 0a 0a 0a 2f  uf[j] = 0;.}.../
198c0 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 31  *.** Convert a 1
198d0 32 38 2d 62 69 74 20 4d 44 35 20 64 69 67 65 73  28-bit MD5 diges
198e0 74 20 69 6e 74 6f 20 73 65 71 75 65 6e 63 79 20  t into sequency 
198f0 6f 66 20 65 69 67 68 74 20 35 2d 64 69 67 69 74  of eight 5-digit
19900 20 69 6e 74 65 67 65 72 73 0a 2a 2a 20 65 61 63   integers.** eac
19910 68 20 72 65 70 72 65 73 65 6e 74 69 6e 67 20 31  h representing 1
19920 36 20 62 69 74 73 20 6f 66 20 74 68 65 20 64 69  6 bits of the di
19930 67 65 73 74 20 61 6e 64 20 73 65 70 61 72 61 74  gest and separat
19940 65 64 20 66 72 6f 6d 20 65 61 63 68 0a 2a 2a 20  ed from each.** 
19950 6f 74 68 65 72 20 62 79 20 61 20 22 2d 22 20 63  other by a "-" c
19960 68 61 72 61 63 74 65 72 2e 0a 2a 2f 0a 73 74 61  haracter..*/.sta
19970 74 69 63 20 76 6f 69 64 20 4d 44 35 44 69 67 65  tic void MD5Dige
19980 73 74 54 6f 42 61 73 65 31 30 78 38 28 75 6e 73  stToBase10x8(uns
19990 69 67 6e 65 64 20 63 68 61 72 20 64 69 67 65 73  igned char diges
199a0 74 5b 31 36 5d 2c 20 63 68 61 72 20 7a 44 69 67  t[16], char zDig
199b0 65 73 74 5b 35 30 5d 29 7b 0a 20 20 69 6e 74 20  est[50]){.  int 
199c0 69 2c 20 6a 3b 0a 20 20 75 6e 73 69 67 6e 65 64  i, j;.  unsigned
199d0 20 69 6e 74 20 78 3b 0a 20 20 66 6f 72 28 69 3d   int x;.  for(i=
199e0 6a 3d 30 3b 20 69 3c 31 36 3b 20 69 2b 3d 32 29  j=0; i<16; i+=2)
199f0 7b 0a 20 20 20 20 78 20 3d 20 64 69 67 65 73 74  {.    x = digest
19a00 5b 69 5d 2a 32 35 36 20 2b 20 64 69 67 65 73 74  [i]*256 + digest
19a10 5b 69 2b 31 5d 3b 0a 20 20 20 20 69 66 28 20 69  [i+1];.    if( i
19a20 3e 30 20 29 20 7a 44 69 67 65 73 74 5b 6a 2b 2b  >0 ) zDigest[j++
19a30 5d 20 3d 20 27 2d 27 3b 0a 20 20 20 20 73 70 72  ] = '-';.    spr
19a40 69 6e 74 66 28 26 7a 44 69 67 65 73 74 5b 6a 5d  intf(&zDigest[j]
19a50 2c 20 22 25 30 35 75 22 2c 20 78 29 3b 0a 20 20  , "%05u", x);.  
19a60 20 20 6a 20 2b 3d 20 35 3b 0a 20 20 7d 0a 20 20    j += 5;.  }.  
19a70 7a 44 69 67 65 73 74 5b 6a 5d 20 3d 20 30 3b 0a  zDigest[j] = 0;.
19a80 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 54 43 4c 20 63  }../*.** A TCL c
19a90 6f 6d 6d 61 6e 64 20 66 6f 72 20 6d 64 35 2e 20  ommand for md5. 
19aa0 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73   The argument is
19ab0 20 74 68 65 20 74 65 78 74 20 74 6f 20 62 65 20   the text to be 
19ac0 68 61 73 68 65 64 2e 20 20 54 68 65 0a 2a 2a 20  hashed.  The.** 
19ad0 52 65 73 75 6c 74 20 69 73 20 74 68 65 20 68 61  Result is the ha
19ae0 73 68 20 69 6e 20 62 61 73 65 36 34 2e 20 20 0a  sh in base64.  .
19af0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 64  */.static int md
19b00 35 5f 63 6d 64 28 76 6f 69 64 2a 63 64 2c 20 54  5_cmd(void*cd, T
19b10 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
19b20 70 2c 20 69 6e 74 20 61 72 67 63 2c 20 63 6f 6e  p, int argc, con
19b30 73 74 20 63 68 61 72 20 2a 2a 61 72 67 76 29 7b  st char **argv){
19b40 0a 20 20 4d 44 35 43 6f 6e 74 65 78 74 20 63 74  .  MD5Context ct
19b50 78 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  x;.  unsigned ch
19b60 61 72 20 64 69 67 65 73 74 5b 31 36 5d 3b 0a 20  ar digest[16];. 
19b70 20 63 68 61 72 20 7a 42 75 66 5b 35 30 5d 3b 0a   char zBuf[50];.
19b80 20 20 76 6f 69 64 20 28 2a 63 6f 6e 76 65 72 74    void (*convert
19b90 65 72 29 28 75 6e 73 69 67 6e 65 64 20 63 68 61  er)(unsigned cha
19ba0 72 2a 2c 20 63 68 61 72 2a 29 3b 0a 0a 20 20 69  r*, char*);..  i
19bb0 66 28 20 61 72 67 63 21 3d 32 20 29 7b 0a 20 20  f( argc!=2 ){.  
19bc0 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
19bd0 6c 74 28 69 6e 74 65 72 70 2c 22 77 72 6f 6e 67  lt(interp,"wrong
19be0 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
19bf0 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c  be \"", argv[0],
19c00 20 0a 20 20 20 20 20 20 20 20 22 20 54 45 58 54   .        " TEXT
19c10 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  \"", 0);.    ret
19c20 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
19c30 20 7d 0a 20 20 4d 44 35 49 6e 69 74 28 26 63 74   }.  MD5Init(&ct
19c40 78 29 3b 0a 20 20 4d 44 35 55 70 64 61 74 65 28  x);.  MD5Update(
19c50 26 63 74 78 2c 20 28 75 6e 73 69 67 6e 65 64 20  &ctx, (unsigned 
19c60 63 68 61 72 2a 29 61 72 67 76 5b 31 5d 2c 20 28  char*)argv[1], (
19c70 75 6e 73 69 67 6e 65 64 29 73 74 72 6c 65 6e 28  unsigned)strlen(
19c80 61 72 67 76 5b 31 5d 29 29 3b 0a 20 20 4d 44 35  argv[1]));.  MD5
19c90 46 69 6e 61 6c 28 64 69 67 65 73 74 2c 20 26 63  Final(digest, &c
19ca0 74 78 29 3b 0a 20 20 63 6f 6e 76 65 72 74 65 72  tx);.  converter
19cb0 20 3d 20 28 76 6f 69 64 28 2a 29 28 75 6e 73 69   = (void(*)(unsi
19cc0 67 6e 65 64 20 63 68 61 72 2a 2c 63 68 61 72 2a  gned char*,char*
19cd0 29 29 63 64 3b 0a 20 20 63 6f 6e 76 65 72 74 65  ))cd;.  converte
19ce0 72 28 64 69 67 65 73 74 2c 20 7a 42 75 66 29 3b  r(digest, zBuf);
19cf0 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  .  Tcl_AppendRes
19d00 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66  ult(interp, zBuf
19d10 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 72  , (char*)0);.  r
19d20 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
19d30 0a 2f 2a 0a 2a 2a 20 41 20 54 43 4c 20 63 6f 6d  ./*.** A TCL com
19d40 6d 61 6e 64 20 74 6f 20 74 61 6b 65 20 74 68 65  mand to take the
19d50 20 6d 64 35 20 68 61 73 68 20 6f 66 20 61 20 66   md5 hash of a f
19d60 69 6c 65 2e 20 20 54 68 65 20 61 72 67 75 6d 65  ile.  The argume
19d70 6e 74 20 69 73 20 74 68 65 0a 2a 2a 20 6e 61 6d  nt is the.** nam
19d80 65 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 0a 2a  e of the file..*
19d90 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 64 35  /.static int md5
19da0 66 69 6c 65 5f 63 6d 64 28 76 6f 69 64 2a 63 64  file_cmd(void*cd
19db0 2c 20 54 63 6c 5f 49 6e 74 65 72 70 2a 69 6e 74  , Tcl_Interp*int
19dc0 65 72 70 2c 20 69 6e 74 20 61 72 67 63 2c 20 63  erp, int argc, c
19dd0 6f 6e 73 74 20 63 68 61 72 20 2a 2a 61 72 67 76  onst char **argv
19de0 29 7b 0a 20 20 46 49 4c 45 20 2a 69 6e 3b 0a 20  ){.  FILE *in;. 
19df0 20 4d 44 35 43 6f 6e 74 65 78 74 20 63 74 78 3b   MD5Context ctx;
19e00 0a 20 20 76 6f 69 64 20 28 2a 63 6f 6e 76 65 72  .  void (*conver
19e10 74 65 72 29 28 75 6e 73 69 67 6e 65 64 20 63 68  ter)(unsigned ch
19e20 61 72 2a 2c 20 63 68 61 72 2a 29 3b 0a 20 20 75  ar*, char*);.  u
19e30 6e 73 69 67 6e 65 64 20 63 68 61 72 20 64 69 67  nsigned char dig
19e40 65 73 74 5b 31 36 5d 3b 0a 20 20 63 68 61 72 20  est[16];.  char 
19e50 7a 42 75 66 5b 31 30 32 34 30 5d 3b 0a 0a 20 20  zBuf[10240];..  
19e60 69 66 28 20 61 72 67 63 21 3d 32 20 29 7b 0a 20  if( argc!=2 ){. 
19e70 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
19e80 75 6c 74 28 69 6e 74 65 72 70 2c 22 77 72 6f 6e  ult(interp,"wron
19e90 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
19ea0 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d   be \"", argv[0]
19eb0 2c 20 0a 20 20 20 20 20 20 20 20 22 20 46 49 4c  , .        " FIL
19ec0 45 4e 41 4d 45 5c 22 22 2c 20 30 29 3b 0a 20 20  ENAME\"", 0);.  
19ed0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
19ee0 4f 52 3b 0a 20 20 7d 0a 20 20 69 6e 20 3d 20 66  OR;.  }.  in = f
19ef0 6f 70 65 6e 28 61 72 67 76 5b 31 5d 2c 22 72 62  open(argv[1],"rb
19f00 22 29 3b 0a 20 20 69 66 28 20 69 6e 3d 3d 30 20  ");.  if( in==0 
19f10 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
19f20 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22  dResult(interp,"
19f30 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 66  unable to open f
19f40 69 6c 65 20 5c 22 22 2c 20 61 72 67 76 5b 31 5d  ile \"", argv[1]
19f50 2c 20 0a 20 20 20 20 20 20 20 20 20 22 5c 22 20  , .         "\" 
19f60 66 6f 72 20 72 65 61 64 69 6e 67 22 2c 20 30 29  for reading", 0)
19f70 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
19f80 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 4d 44  _ERROR;.  }.  MD
19f90 35 49 6e 69 74 28 26 63 74 78 29 3b 0a 20 20 66  5Init(&ctx);.  f
19fa0 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 69 6e 74 20  or(;;){.    int 
19fb0 6e 3b 0a 20 20 20 20 6e 20 3d 20 66 72 65 61 64  n;.    n = fread
19fc0 28 7a 42 75 66 2c 20 31 2c 20 73 69 7a 65 6f 66  (zBuf, 1, sizeof
19fd0 28 7a 42 75 66 29 2c 20 69 6e 29 3b 0a 20 20 20  (zBuf), in);.   
19fe0 20 69 66 28 20 6e 3c 3d 30 20 29 20 62 72 65 61   if( n<=0 ) brea
19ff0 6b 3b 0a 20 20 20 20 4d 44 35 55 70 64 61 74 65  k;.    MD5Update
1a000 28 26 63 74 78 2c 20 28 75 6e 73 69 67 6e 65 64  (&ctx, (unsigned
1a010 20 63 68 61 72 2a 29 7a 42 75 66 2c 20 28 75 6e   char*)zBuf, (un
1a020 73 69 67 6e 65 64 29 6e 29 3b 0a 20 20 7d 0a 20  signed)n);.  }. 
1a030 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 4d   fclose(in);.  M
1a040 44 35 46 69 6e 61 6c 28 64 69 67 65 73 74 2c 20  D5Final(digest, 
1a050 26 63 74 78 29 3b 0a 20 20 63 6f 6e 76 65 72 74  &ctx);.  convert
1a060 65 72 20 3d 20 28 76 6f 69 64 28 2a 29 28 75 6e  er = (void(*)(un
1a070 73 69 67 6e 65 64 20 63 68 61 72 2a 2c 63 68 61  signed char*,cha
1a080 72 2a 29 29 63 64 3b 0a 20 20 63 6f 6e 76 65 72  r*))cd;.  conver
1a090 74 65 72 28 64 69 67 65 73 74 2c 20 7a 42 75 66  ter(digest, zBuf
1a0a0 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  );.  Tcl_AppendR
1a0b0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42  esult(interp, zB
1a0c0 75 66 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20  uf, (char*)0);. 
1a0d0 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
1a0e0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65  }../*.** Registe
1a0f0 72 20 74 68 65 20 66 6f 75 72 20 6e 65 77 20 54  r the four new T
1a100 43 4c 20 63 6f 6d 6d 61 6e 64 73 20 66 6f 72 20  CL commands for 
1a110 67 65 6e 65 72 61 74 69 6e 67 20 4d 44 35 20 63  generating MD5 c
1a120 68 65 63 6b 73 75 6d 73 0a 2a 2a 20 77 69 74 68  hecksums.** with
1a130 20 74 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   the TCL interpr
1a140 65 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 4d 64 35  eter..*/.int Md5
1a150 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
1a160 20 2a 69 6e 74 65 72 70 29 7b 0a 20 20 54 63 6c   *interp){.  Tcl
1a170 5f 43 72 65 61 74 65 43 6f 6d 6d 61 6e 64 28 69  _CreateCommand(i
1a180 6e 74 65 72 70 2c 20 22 6d 64 35 22 2c 20 28 54  nterp, "md5", (T
1a190 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 6d 64 35 5f  cl_CmdProc*)md5_
1a1a0 63 6d 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20  cmd,.           
1a1b0 20 20 20 20 20 20 20 20 20 4d 44 35 44 69 67 65           MD5Dige
1a1c0 73 74 54 6f 42 61 73 65 31 36 2c 20 30 29 3b 0a  stToBase16, 0);.
1a1d0 20 20 54 63 6c 5f 43 72 65 61 74 65 43 6f 6d 6d    Tcl_CreateComm
1a1e0 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 6d 64 35  and(interp, "md5
1a1f0 2d 31 30 78 38 22 2c 20 28 54 63 6c 5f 43 6d 64  -10x8", (Tcl_Cmd
1a200 50 72 6f 63 2a 29 6d 64 35 5f 63 6d 64 2c 0a 20  Proc*)md5_cmd,. 
1a210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a220 20 20 20 4d 44 35 44 69 67 65 73 74 54 6f 42 61     MD5DigestToBa
1a230 73 65 31 30 78 38 2c 20 30 29 3b 0a 20 20 54 63  se10x8, 0);.  Tc
1a240 6c 5f 43 72 65 61 74 65 43 6f 6d 6d 61 6e 64 28  l_CreateCommand(
1a250 69 6e 74 65 72 70 2c 20 22 6d 64 35 66 69 6c 65  interp, "md5file
1a260 22 2c 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a  ", (Tcl_CmdProc*
1a270 29 6d 64 35 66 69 6c 65 5f 63 6d 64 2c 0a 20 20  )md5file_cmd,.  
1a280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a290 20 20 4d 44 35 44 69 67 65 73 74 54 6f 42 61 73    MD5DigestToBas
1a2a0 65 31 36 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 43  e16, 0);.  Tcl_C
1a2b0 72 65 61 74 65 43 6f 6d 6d 61 6e 64 28 69 6e 74  reateCommand(int
1a2c0 65 72 70 2c 20 22 6d 64 35 66 69 6c 65 2d 31 30  erp, "md5file-10
1a2d0 78 38 22 2c 20 28 54 63 6c 5f 43 6d 64 50 72 6f  x8", (Tcl_CmdPro
1a2e0 63 2a 29 6d 64 35 66 69 6c 65 5f 63 6d 64 2c 0a  c*)md5file_cmd,.
1a2f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a300 20 20 20 20 4d 44 35 44 69 67 65 73 74 54 6f 42      MD5DigestToB
1a310 61 73 65 31 30 78 38 2c 20 30 29 3b 0a 20 20 72  ase10x8, 0);.  r
1a320 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
1a330 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65  #endif /* define
1a340 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 20 7c  d(SQLITE_TEST) |
1a350 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  | defined(SQLITE
1a360 5f 54 43 4c 4d 44 35 29 20 2a 2f 0a 0a 23 69 66  _TCLMD5) */..#if
1a370 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
1a380 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 44 75 72 69  TEST)./*.** Duri
1a390 6e 67 20 74 65 73 74 69 6e 67 2c 20 74 68 65 20  ng testing, the 
1a3a0 73 70 65 63 69 61 6c 20 6d 64 35 73 75 6d 28 29  special md5sum()
1a3b0 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
1a3c0 69 6f 6e 20 69 73 20 61 76 61 69 6c 61 62 6c 65  ion is available
1a3d0 2e 0a 2a 2a 20 69 6e 73 69 64 65 20 53 51 4c 69  ..** inside SQLi
1a3e0 74 65 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  te.  The followi
1a3f0 6e 67 20 72 6f 75 74 69 6e 65 73 20 69 6d 70 6c  ng routines impl
1a400 65 6d 65 6e 74 20 74 68 61 74 20 66 75 6e 63 74  ement that funct
1a410 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ion..*/.static v
1a420 6f 69 64 20 6d 64 35 73 74 65 70 28 73 71 6c 69  oid md5step(sqli
1a430 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e  te3_context *con
1a440 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20  text, int argc, 
1a450 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
1a460 61 72 67 76 29 7b 0a 20 20 4d 44 35 43 6f 6e 74  argv){.  MD5Cont
1a470 65 78 74 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b  ext *p;.  int i;
1a480 0a 20 20 69 66 28 20 61 72 67 63 3c 31 20 29 20  .  if( argc<1 ) 
1a490 72 65 74 75 72 6e 3b 0a 20 20 70 20 3d 20 73 71  return;.  p = sq
1a4a0 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f  lite3_aggregate_
1a4b0 63 6f 6e 74 65 78 74 28 63 6f 6e 74 65 78 74 2c  context(context,
1a4c0 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20   sizeof(*p));.  
1a4d0 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
1a4e0 6e 3b 0a 20 20 69 66 28 20 21 70 2d 3e 69 73 49  n;.  if( !p->isI
1a4f0 6e 69 74 20 29 7b 0a 20 20 20 20 4d 44 35 49 6e  nit ){.    MD5In
1a500 69 74 28 70 29 3b 0a 20 20 7d 0a 20 20 66 6f 72  it(p);.  }.  for
1a510 28 69 3d 30 3b 20 69 3c 61 72 67 63 3b 20 69 2b  (i=0; i<argc; i+
1a520 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  +){.    const ch
1a530 61 72 20 2a 7a 44 61 74 61 20 3d 20 28 63 68 61  ar *zData = (cha
1a540 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  r*)sqlite3_value
1a550 5f 74 65 78 74 28 61 72 67 76 5b 69 5d 29 3b 0a  _text(argv[i]);.
1a560 20 20 20 20 69 66 28 20 7a 44 61 74 61 20 29 7b      if( zData ){
1a570 0a 20 20 20 20 20 20 4d 44 35 55 70 64 61 74 65  .      MD5Update
1a580 28 70 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68  (p, (unsigned ch
1a590 61 72 2a 29 7a 44 61 74 61 2c 20 73 74 72 6c 65  ar*)zData, strle
1a5a0 6e 28 7a 44 61 74 61 29 29 3b 0a 20 20 20 20 7d  n(zData));.    }
1a5b0 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f  .  }.}.static vo
1a5c0 69 64 20 6d 64 35 66 69 6e 61 6c 69 7a 65 28 73  id md5finalize(s
1a5d0 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
1a5e0 63 6f 6e 74 65 78 74 29 7b 0a 20 20 4d 44 35 43  context){.  MD5C
1a5f0 6f 6e 74 65 78 74 20 2a 70 3b 0a 20 20 75 6e 73  ontext *p;.  uns
1a600 69 67 6e 65 64 20 63 68 61 72 20 64 69 67 65 73  igned char diges
1a610 74 5b 31 36 5d 3b 0a 20 20 63 68 61 72 20 7a 42  t[16];.  char zB
1a620 75 66 5b 33 33 5d 3b 0a 20 20 70 20 3d 20 73 71  uf[33];.  p = sq
1a630 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f  lite3_aggregate_
1a640 63 6f 6e 74 65 78 74 28 63 6f 6e 74 65 78 74 2c  context(context,
1a650 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20   sizeof(*p));.  
1a660 4d 44 35 46 69 6e 61 6c 28 64 69 67 65 73 74 2c  MD5Final(digest,
1a670 70 29 3b 0a 20 20 4d 44 35 44 69 67 65 73 74 54  p);.  MD5DigestT
1a680 6f 42 61 73 65 31 36 28 64 69 67 65 73 74 2c 20  oBase16(digest, 
1a690 7a 42 75 66 29 3b 0a 20 20 73 71 6c 69 74 65 33  zBuf);.  sqlite3
1a6a0 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e  _result_text(con
1a6b0 74 65 78 74 2c 20 7a 42 75 66 2c 20 2d 31 2c 20  text, zBuf, -1, 
1a6c0 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
1a6d0 29 3b 0a 7d 0a 69 6e 74 20 4d 64 35 5f 52 65 67  );.}.int Md5_Reg
1a6e0 69 73 74 65 72 28 73 71 6c 69 74 65 33 20 2a 64  ister(sqlite3 *d
1a6f0 62 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 73  b){.  int rc = s
1a700 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
1a710 6e 63 74 69 6f 6e 28 64 62 2c 20 22 6d 64 35 73  nction(db, "md5s
1a720 75 6d 22 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f  um", -1, SQLITE_
1a730 55 54 46 38 2c 20 30 2c 20 30 2c 20 0a 20 20 20  UTF8, 0, 0, .   
1a740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 64                md
1a760 35 73 74 65 70 2c 20 6d 64 35 66 69 6e 61 6c 69  5step, md5finali
1a770 7a 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6f  ze);.  sqlite3_o
1a780 76 65 72 6c 6f 61 64 5f 66 75 6e 63 74 69 6f 6e  verload_function
1a790 28 64 62 2c 20 22 6d 64 35 73 75 6d 22 2c 20 2d  (db, "md5sum", -
1a7a0 31 29 3b 20 20 2f 2a 20 54 6f 20 65 78 65 72 63  1);  /* To exerc
1a7b0 69 73 65 20 74 68 69 73 20 41 50 49 20 2a 2f 0a  ise this API */.
1a7c0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23    return rc;.}.#
1a7d0 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64  endif /* defined
1a7e0 28 53 51 4c 49 54 45 5f 54 45 53 54 29 20 2a 2f  (SQLITE_TEST) */
1a7f0 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  .../*.** If the 
1a800 6d 61 63 72 6f 20 54 43 4c 53 48 20 69 73 20 6f  macro TCLSH is o
1a810 6e 65 2c 20 74 68 65 6e 20 70 75 74 20 69 6e 20  ne, then put in 
1a820 63 6f 64 65 20 74 68 69 73 20 66 6f 72 20 74 68  code this for th
1a830 65 0a 2a 2a 20 22 6d 61 69 6e 22 20 72 6f 75 74  e.** "main" rout
1a840 69 6e 65 20 74 68 61 74 20 77 69 6c 6c 20 69 6e  ine that will in
1a850 69 74 69 61 6c 69 7a 65 20 54 63 6c 20 61 6e 64  itialize Tcl and
1a860 20 74 61 6b 65 20 69 6e 70 75 74 20 66 72 6f 6d   take input from
1a870 0a 2a 2a 20 73 74 61 6e 64 61 72 64 20 69 6e 70  .** standard inp
1a880 75 74 2c 20 6f 72 20 69 66 20 61 20 66 69 6c 65  ut, or if a file
1a890 20 69 73 20 6e 61 6d 65 64 20 6f 6e 20 74 68 65   is named on the
1a8a0 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 0a 2a 2a   command line.**
1a8b0 20 74 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   the TCL interpr
1a8c0 65 74 65 72 20 72 65 61 64 73 20 61 6e 64 20 65  eter reads and e
1a8d0 76 61 6c 75 61 74 65 73 20 74 68 61 74 20 66 69  valuates that fi
1a8e0 6c 65 2e 0a 2a 2f 0a 23 69 66 20 54 43 4c 53 48  le..*/.#if TCLSH
1a8f0 3d 3d 31 0a 73 74 61 74 69 63 20 63 68 61 72 20  ==1.static char 
1a900 7a 4d 61 69 6e 6c 6f 6f 70 5b 5d 20 3d 0a 20 20  zMainloop[] =.  
1a910 22 73 65 74 20 6c 69 6e 65 20 7b 7d 5c 6e 22 0a  "set line {}\n".
1a920 20 20 22 77 68 69 6c 65 20 7b 21 5b 65 6f 66 20    "while {![eof 
1a930 73 74 64 69 6e 5d 7d 20 7b 5c 6e 22 0a 20 20 20  stdin]} {\n".   
1a940 20 22 69 66 20 7b 24 6c 69 6e 65 21 3d 5c 22 5c   "if {$line!=\"\
1a950 22 7d 20 7b 5c 6e 22 0a 20 20 20 20 20 20 22 70  "} {\n".      "p
1a960 75 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20 5c  uts -nonewline \
1a970 22 3e 20 5c 22 5c 6e 22 0a 20 20 20 20 22 7d 20  "> \"\n".    "} 
1a980 65 6c 73 65 20 7b 5c 6e 22 0a 20 20 20 20 20 20  else {\n".      
1a990 22 70 75 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65  "puts -nonewline
1a9a0 20 5c 22 25 20 5c 22 5c 6e 22 0a 20 20 20 20 22   \"% \"\n".    "
1a9b0 7d 5c 6e 22 0a 20 20 20 20 22 66 6c 75 73 68 20  }\n".    "flush 
1a9c0 73 74 64 6f 75 74 5c 6e 22 0a 20 20 20 20 22 61  stdout\n".    "a
1a9d0 70 70 65 6e 64 20 6c 69 6e 65 20 5b 67 65 74 73  ppend line [gets
1a9e0 20 73 74 64 69 6e 5d 5c 6e 22 0a 20 20 20 20 22   stdin]\n".    "
1a9f0 69 66 20 7b 5b 69 6e 66 6f 20 63 6f 6d 70 6c 65  if {[info comple
1aa00 74 65 20 24 6c 69 6e 65 5d 7d 20 7b 5c 6e 22 0a  te $line]} {\n".
1aa10 20 20 20 20 20 20 22 69 66 20 7b 5b 63 61 74 63        "if {[catc
1aa20 68 20 7b 75 70 6c 65 76 65 6c 20 23 30 20 24 6c  h {uplevel #0 $l
1aa30 69 6e 65 7d 20 72 65 73 75 6c 74 5d 7d 20 7b 5c  ine} result]} {\
1aa40 6e 22 0a 20 20 20 20 20 20 20 20 22 70 75 74 73  n".        "puts
1aa50 20 73 74 64 65 72 72 20 5c 22 45 72 72 6f 72 3a   stderr \"Error:
1aa60 20 24 72 65 73 75 6c 74 5c 22 5c 6e 22 0a 20 20   $result\"\n".  
1aa70 20 20 20 20 22 7d 20 65 6c 73 65 69 66 20 7b 24      "} elseif {$
1aa80 72 65 73 75 6c 74 21 3d 5c 22 5c 22 7d 20 7b 5c  result!=\"\"} {\
1aa90 6e 22 0a 20 20 20 20 20 20 20 20 22 70 75 74 73  n".        "puts
1aaa0 20 24 72 65 73 75 6c 74 5c 6e 22 0a 20 20 20 20   $result\n".    
1aab0 20 20 22 7d 5c 6e 22 0a 20 20 20 20 20 20 22 73    "}\n".      "s
1aac0 65 74 20 6c 69 6e 65 20 7b 7d 5c 6e 22 0a 20 20  et line {}\n".  
1aad0 20 20 22 7d 20 65 6c 73 65 20 7b 5c 6e 22 0a 20    "} else {\n". 
1aae0 20 20 20 20 20 22 61 70 70 65 6e 64 20 6c 69 6e       "append lin
1aaf0 65 20 5c 5c 6e 5c 6e 22 0a 20 20 20 20 22 7d 5c  e \\n\n".    "}\
1ab00 6e 22 0a 20 20 22 7d 5c 6e 22 0a 3b 0a 23 65 6e  n".  "}\n".;.#en
1ab10 64 69 66 0a 23 69 66 20 54 43 4c 53 48 3d 3d 32  dif.#if TCLSH==2
1ab20 0a 73 74 61 74 69 63 20 63 68 61 72 20 7a 4d 61  .static char zMa
1ab30 69 6e 6c 6f 6f 70 5b 5d 20 3d 20 0a 23 69 6e 63  inloop[] = .#inc
1ab40 6c 75 64 65 20 22 73 70 61 63 65 61 6e 61 6c 5f  lude "spaceanal_
1ab50 74 63 6c 2e 68 22 0a 3b 0a 23 65 6e 64 69 66 0a  tcl.h".;.#endif.
1ab60 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
1ab70 45 53 54 0a 73 74 61 74 69 63 20 76 6f 69 64 20  EST.static void 
1ab80 69 6e 69 74 5f 61 6c 6c 28 54 63 6c 5f 49 6e 74  init_all(Tcl_Int
1ab90 65 72 70 20 2a 29 3b 0a 73 74 61 74 69 63 20 69  erp *);.static i
1aba0 6e 74 20 69 6e 69 74 5f 61 6c 6c 5f 63 6d 64 28  nt init_all_cmd(
1abb0 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 64  .  ClientData cd
1abc0 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
1abd0 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
1abe0 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
1abf0 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 0a  ONST objv[].){..
1ac00 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 73 6c    Tcl_Interp *sl
1ac10 61 76 65 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21  ave;.  if( objc!
1ac20 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  =2 ){.    Tcl_Wr
1ac30 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
1ac40 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53 4c 41  p, 1, objv, "SLA
1ac50 56 45 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  VE");.    return
1ac60 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
1ac70 0a 20 20 73 6c 61 76 65 20 3d 20 54 63 6c 5f 47  .  slave = Tcl_G
1ac80 65 74 53 6c 61 76 65 28 69 6e 74 65 72 70 2c 20  etSlave(interp, 
1ac90 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
1aca0 6a 76 5b 31 5d 29 29 3b 0a 20 20 69 66 28 20 21  jv[1]));.  if( !
1acb0 73 6c 61 76 65 20 29 7b 0a 20 20 20 20 72 65 74  slave ){.    ret
1acc0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1acd0 20 7d 0a 0a 20 20 69 6e 69 74 5f 61 6c 6c 28 73   }..  init_all(s
1ace0 6c 61 76 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  lave);.  return 
1acf0 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  TCL_OK;.}.#endif
1ad00 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75 72  ../*.** Configur
1ad10 65 20 74 68 65 20 69 6e 74 65 72 70 72 65 74 65  e the interprete
1ad20 72 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  r passed as the 
1ad30 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74  first argument t
1ad40 6f 20 68 61 76 65 20 61 63 63 65 73 73 0a 2a 2a  o have access.**
1ad50 20 74 6f 20 74 68 65 20 63 6f 6d 6d 61 6e 64 73   to the commands
1ad60 20 61 6e 64 20 6c 69 6e 6b 65 64 20 76 61 72 69   and linked vari
1ad70 61 62 6c 65 73 20 74 68 61 74 20 6d 61 6b 65 20  ables that make 
1ad80 75 70 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68  up:.**.**   * th
1ad90 65 20 5b 73 71 6c 69 74 65 33 5d 20 65 78 74 65  e [sqlite3] exte
1ada0 6e 73 69 6f 6e 20 69 74 73 65 6c 66 2c 20 0a 2a  nsion itself, .*
1adb0 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 53 51 4c 49  *.**   * If SQLI
1adc0 54 45 5f 54 43 4c 4d 44 35 20 6f 72 20 53 51 4c  TE_TCLMD5 or SQL
1add0 49 54 45 5f 54 45 53 54 20 69 73 20 64 65 66 69  ITE_TEST is defi
1ade0 6e 65 64 2c 20 74 68 65 20 4d 64 35 20 63 6f 6d  ned, the Md5 com
1adf0 6d 61 6e 64 73 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a  mands, and.**.**
1ae00 20 20 20 2a 20 49 66 20 53 51 4c 49 54 45 5f 54     * If SQLITE_T
1ae10 45 53 54 20 69 73 20 73 65 74 2c 20 74 68 65 20  EST is set, the 
1ae20 76 61 72 69 6f 75 73 20 74 65 73 74 20 69 6e 74  various test int
1ae30 65 72 66 61 63 65 73 20 75 73 65 64 20 62 79 20  erfaces used by 
1ae40 74 68 65 20 54 63 6c 0a 2a 2a 20 20 20 20 20 74  the Tcl.**     t
1ae50 65 73 74 20 73 75 69 74 65 2e 0a 2a 2f 0a 73 74  est suite..*/.st
1ae60 61 74 69 63 20 76 6f 69 64 20 69 6e 69 74 5f 61  atic void init_a
1ae70 6c 6c 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  ll(Tcl_Interp *i
1ae80 6e 74 65 72 70 29 7b 0a 20 20 53 71 6c 69 74 65  nterp){.  Sqlite
1ae90 33 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a  3_Init(interp);.
1aea0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
1aeb0 49 54 45 5f 54 45 53 54 29 20 7c 7c 20 64 65 66  ITE_TEST) || def
1aec0 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 43 4c 4d  ined(SQLITE_TCLM
1aed0 44 35 29 0a 20 20 4d 64 35 5f 49 6e 69 74 28 69  D5).  Md5_Init(i
1aee0 6e 74 65 72 70 29 3b 0a 23 65 6e 64 69 66 0a 0a  nterp);.#endif..
1aef0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
1af00 53 54 0a 20 20 7b 0a 20 20 20 20 65 78 74 65 72  ST.  {.    exter
1af10 6e 20 69 6e 74 20 53 71 6c 69 74 65 63 6f 6e 66  n int Sqliteconf
1af20 69 67 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  ig_Init(Tcl_Inte
1af30 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e  rp*);.    extern
1af40 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 31   int Sqlitetest1
1af50 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
1af60 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69  *);.    extern i
1af70 6e 74 20 53 71 6c 69 74 65 74 65 73 74 32 5f 49  nt Sqlitetest2_I
1af80 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29  nit(Tcl_Interp*)
1af90 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74  ;.    extern int
1afa0 20 53 71 6c 69 74 65 74 65 73 74 33 5f 49 6e 69   Sqlitetest3_Ini
1afb0 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a  t(Tcl_Interp*);.
1afc0 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53      extern int S
1afd0 71 6c 69 74 65 74 65 73 74 34 5f 49 6e 69 74 28  qlitetest4_Init(
1afe0 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20  Tcl_Interp*);.  
1aff0 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c    extern int Sql
1b000 69 74 65 74 65 73 74 35 5f 49 6e 69 74 28 54 63  itetest5_Init(Tc
1b010 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20  l_Interp*);.    
1b020 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74  extern int Sqlit
1b030 65 74 65 73 74 36 5f 49 6e 69 74 28 54 63 6c 5f  etest6_Init(Tcl_
1b040 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78  Interp*);.    ex
1b050 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74  tern int Sqlitet
1b060 65 73 74 37 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  est7_Init(Tcl_In
1b070 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65  terp*);.    exte
1b080 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73  rn int Sqlitetes
1b090 74 38 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  t8_Init(Tcl_Inte
1b0a0 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e  rp*);.    extern
1b0b0 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 39   int Sqlitetest9
1b0c0 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
1b0d0 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69  *);.    extern i
1b0e0 6e 74 20 53 71 6c 69 74 65 74 65 73 74 61 73 79  nt Sqlitetestasy
1b0f0 6e 63 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  nc_Init(Tcl_Inte
1b100 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e  rp*);.    extern
1b110 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 5f   int Sqlitetest_
1b120 61 75 74 6f 65 78 74 5f 49 6e 69 74 28 54 63 6c  autoext_Init(Tcl
1b130 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65  _Interp*);.    e
1b140 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65  xtern int Sqlite
1b150 74 65 73 74 5f 64 65 6d 6f 76 66 73 5f 49 6e 69  test_demovfs_Ini
1b160 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 29 3b  t(Tcl_Interp *);
1b170 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20  .    extern int 
1b180 53 71 6c 69 74 65 74 65 73 74 5f 66 75 6e 63 5f  Sqlitetest_func_
1b190 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a  Init(Tcl_Interp*
1b1a0 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e  );.    extern in
1b1b0 74 20 53 71 6c 69 74 65 74 65 73 74 5f 68 65 78  t Sqlitetest_hex
1b1c0 69 6f 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  io_Init(Tcl_Inte
1b1d0 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e  rp*);.    extern
1b1e0 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 5f   int Sqlitetest_
1b1f0 69 6e 69 74 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  init_Init(Tcl_In
1b200 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65  terp*);.    exte
1b210 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73  rn int Sqlitetes
1b220 74 5f 6d 61 6c 6c 6f 63 5f 49 6e 69 74 28 54 63  t_malloc_Init(Tc
1b230 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20  l_Interp*);.    
1b240 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74  extern int Sqlit
1b250 65 74 65 73 74 5f 6d 75 74 65 78 5f 49 6e 69 74  etest_mutex_Init
1b260 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20  (Tcl_Interp*);. 
1b270 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71     extern int Sq
1b280 6c 69 74 65 74 65 73 74 73 63 68 65 6d 61 5f 49  litetestschema_I
1b290 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29  nit(Tcl_Interp*)
1b2a0 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74  ;.    extern int
1b2b0 20 53 71 6c 69 74 65 74 65 73 74 73 73 65 5f 49   Sqlitetestsse_I
1b2c0 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29  nit(Tcl_Interp*)
1b2d0 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74  ;.    extern int
1b2e0 20 53 71 6c 69 74 65 74 65 73 74 74 63 6c 76 61   Sqlitetesttclva
1b2f0 72 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  r_Init(Tcl_Inter
1b300 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20  p*);.    extern 
1b310 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 54 68  int SqlitetestTh
1b320 72 65 61 64 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  read_Init(Tcl_In
1b330 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65  terp*);.    exte
1b340 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73  rn int Sqlitetes
1b350 74 4f 6e 65 66 69 6c 65 5f 49 6e 69 74 28 29 3b  tOnefile_Init();
1b360 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20  .    extern int 
1b370 53 71 6c 69 74 65 74 65 73 74 4f 73 69 6e 73 74  SqlitetestOsinst
1b380 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
1b390 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69  *);.    extern i
1b3a0 6e 74 20 53 71 6c 69 74 65 74 65 73 74 62 61 63  nt Sqlitetestbac
1b3b0 6b 75 70 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74  kup_Init(Tcl_Int
1b3c0 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72  erp*);.    exter
1b3d0 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74  n int Sqlitetest
1b3e0 69 6e 74 61 72 72 61 79 5f 49 6e 69 74 28 54 63  intarray_Init(Tc
1b3f0 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20  l_Interp*);.    
1b400 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74  extern int Sqlit
1b410 65 74 65 73 74 76 66 73 5f 49 6e 69 74 28 54 63  etestvfs_Init(Tc
1b420 6c 5f 49 6e 74 65 72 70 20 2a 29 3b 0a 20 20 20  l_Interp *);.   
1b430 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69   extern int Sqli
1b440 74 65 74 65 73 74 53 74 61 74 5f 49 6e 69 74 28  tetestStat_Init(
1b450 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20  Tcl_Interp*);.  
1b460 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c    extern int Sql
1b470 69 74 65 74 65 73 74 72 74 72 65 65 5f 49 6e 69  itetestrtree_Ini
1b480 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a  t(Tcl_Interp*);.
1b490 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53      extern int S
1b4a0 71 6c 69 74 65 71 75 6f 74 61 5f 49 6e 69 74 28  qlitequota_Init(
1b4b0 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20  Tcl_Interp*);.  
1b4c0 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c    extern int Sql
1b4d0 69 74 65 6d 75 6c 74 69 70 6c 65 78 5f 49 6e 69  itemultiplex_Ini
1b4e0 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a  t(Tcl_Interp*);.
1b4f0 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53      extern int S
1b500 71 6c 69 74 65 53 75 70 65 72 6c 6f 63 6b 5f 49  qliteSuperlock_I
1b510 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29  nit(Tcl_Interp*)
1b520 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74  ;.    extern int
1b530 20 53 71 6c 69 74 65 74 65 73 74 53 79 73 63 61   SqlitetestSysca
1b540 6c 6c 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  ll_Init(Tcl_Inte
1b550 72 70 2a 29 3b 0a 0a 23 69 66 64 65 66 20 53 51  rp*);..#ifdef SQ
1b560 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 5a 49 50 56  LITE_ENABLE_ZIPV
1b570 46 53 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e  FS.    extern in
1b580 74 20 5a 69 70 76 66 73 5f 49 6e 69 74 28 54 63  t Zipvfs_Init(Tc
1b590 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20  l_Interp*);.    
1b5a0 5a 69 70 76 66 73 5f 49 6e 69 74 28 69 6e 74 65  Zipvfs_Init(inte
1b5b0 72 70 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20  rp);.#endif..   
1b5c0 20 53 71 6c 69 74 65 63 6f 6e 66 69 67 5f 49 6e   Sqliteconfig_In
1b5d0 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  it(interp);.    
1b5e0 53 71 6c 69 74 65 74 65 73 74 31 5f 49 6e 69 74  Sqlitetest1_Init
1b5f0 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71  (interp);.    Sq
1b600 6c 69 74 65 74 65 73 74 32 5f 49 6e 69 74 28 69  litetest2_Init(i
1b610 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69  nterp);.    Sqli
1b620 74 65 74 65 73 74 33 5f 49 6e 69 74 28 69 6e 74  tetest3_Init(int
1b630 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65  erp);.    Sqlite
1b640 74 65 73 74 34 5f 49 6e 69 74 28 69 6e 74 65 72  test4_Init(inter
1b650 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65  p);.    Sqlitete
1b660 73 74 35 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  st5_Init(interp)
1b670 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74  ;.    Sqlitetest
1b680 36 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a  6_Init(interp);.
1b690 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 37 5f      Sqlitetest7_
1b6a0 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  Init(interp);.  
1b6b0 20 20 53 71 6c 69 74 65 74 65 73 74 38 5f 49 6e    Sqlitetest8_In
1b6c0 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  it(interp);.    
1b6d0 53 71 6c 69 74 65 74 65 73 74 39 5f 49 6e 69 74  Sqlitetest9_Init
1b6e0 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71  (interp);.    Sq
1b6f0 6c 69 74 65 74 65 73 74 61 73 79 6e 63 5f 49 6e  litetestasync_In
1b700 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  it(interp);.    
1b710 53 71 6c 69 74 65 74 65 73 74 5f 61 75 74 6f 65  Sqlitetest_autoe
1b720 78 74 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b  xt_Init(interp);
1b730 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 5f  .    Sqlitetest_
1b740 64 65 6d 6f 76 66 73 5f 49 6e 69 74 28 69 6e 74  demovfs_Init(int
1b750 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65  erp);.    Sqlite
1b760 74 65 73 74 5f 66 75 6e 63 5f 49 6e 69 74 28 69  test_func_Init(i
1b770 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69  nterp);.    Sqli
1b780 74 65 74 65 73 74 5f 68 65 78 69 6f 5f 49 6e 69  tetest_hexio_Ini
1b790 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53  t(interp);.    S
1b7a0 71 6c 69 74 65 74 65 73 74 5f 69 6e 69 74 5f 49  qlitetest_init_I
1b7b0 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20  nit(interp);.   
1b7c0 20 53 71 6c 69 74 65 74 65 73 74 5f 6d 61 6c 6c   Sqlitetest_mall
1b7d0 6f 63 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b  oc_Init(interp);
1b7e0 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 5f  .    Sqlitetest_
1b7f0 6d 75 74 65 78 5f 49 6e 69 74 28 69 6e 74 65 72  mutex_Init(inter
1b800 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65  p);.    Sqlitete
1b810 73 74 73 63 68 65 6d 61 5f 49 6e 69 74 28 69 6e  stschema_Init(in
1b820 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74  terp);.    Sqlit
1b830 65 74 65 73 74 74 63 6c 76 61 72 5f 49 6e 69 74  etesttclvar_Init
1b840 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71  (interp);.    Sq
1b850 6c 69 74 65 74 65 73 74 54 68 72 65 61 64 5f 49  litetestThread_I
1b860 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20  nit(interp);.   
1b870 20 53 71 6c 69 74 65 74 65 73 74 4f 6e 65 66 69   SqlitetestOnefi
1b880 6c 65 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b  le_Init(interp);
1b890 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 4f  .    SqlitetestO
1b8a0 73 69 6e 73 74 5f 49 6e 69 74 28 69 6e 74 65 72  sinst_Init(inter
1b8b0 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65  p);.    Sqlitete
1b8c0 73 74 62 61 63 6b 75 70 5f 49 6e 69 74 28 69 6e  stbackup_Init(in
1b8d0 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74  terp);.    Sqlit
1b8e0 65 74 65 73 74 69 6e 74 61 72 72 61 79 5f 49 6e  etestintarray_In
1b8f0 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  it(interp);.    
1b900 53 71 6c 69 74 65 74 65 73 74 76 66 73 5f 49 6e  Sqlitetestvfs_In
1b910 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  it(interp);.    
1b920 53 71 6c 69 74 65 74 65 73 74 53 74 61 74 5f 49  SqlitetestStat_I
1b930 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20  nit(interp);.   
1b940 20 53 71 6c 69 74 65 74 65 73 74 72 74 72 65 65   Sqlitetestrtree
1b950 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20  _Init(interp);. 
1b960 20 20 20 53 71 6c 69 74 65 71 75 6f 74 61 5f 49     Sqlitequota_I
1b970 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20  nit(interp);.   
1b980 20 53 71 6c 69 74 65 6d 75 6c 74 69 70 6c 65 78   Sqlitemultiplex
1b990 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20  _Init(interp);. 
1b9a0 20 20 20 53 71 6c 69 74 65 53 75 70 65 72 6c 6f     SqliteSuperlo
1b9b0 63 6b 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b  ck_Init(interp);
1b9c0 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 53  .    SqlitetestS
1b9d0 79 73 63 61 6c 6c 5f 49 6e 69 74 28 69 6e 74 65  yscall_Init(inte
1b9e0 72 70 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 43 72  rp);..    Tcl_Cr
1b9f0 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69  eateObjCommand(i
1ba00 6e 74 65 72 70 2c 22 6c 6f 61 64 5f 74 65 73 74  nterp,"load_test
1ba10 66 69 78 74 75 72 65 5f 65 78 74 65 6e 73 69 6f  fixture_extensio
1ba20 6e 73 22 2c 69 6e 69 74 5f 61 6c 6c 5f 63 6d 64  ns",init_all_cmd
1ba30 2c 30 2c 30 29 3b 0a 0a 23 69 66 64 65 66 20 53  ,0,0);..#ifdef S
1ba40 51 4c 49 54 45 5f 53 53 45 0a 20 20 20 20 53 71  QLITE_SSE.    Sq
1ba50 6c 69 74 65 74 65 73 74 73 73 65 5f 49 6e 69 74  litetestsse_Init
1ba60 28 69 6e 74 65 72 70 29 3b 0a 23 65 6e 64 69 66  (interp);.#endif
1ba70 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 23  .  }.#endif.}..#
1ba80 64 65 66 69 6e 65 20 54 43 4c 53 48 5f 4d 41 49  define TCLSH_MAI
1ba90 4e 20 6d 61 69 6e 20 20 20 2f 2a 20 4e 65 65 64  N main   /* Need
1baa0 65 64 20 74 6f 20 66 61 6b 65 20 6f 75 74 20 6d  ed to fake out m
1bab0 6b 74 63 6c 61 70 70 20 2a 2f 0a 69 6e 74 20 54  ktclapp */.int T
1bac0 43 4c 53 48 5f 4d 41 49 4e 28 69 6e 74 20 61 72  CLSH_MAIN(int ar
1bad0 67 63 2c 20 63 68 61 72 20 2a 2a 61 72 67 76 29  gc, char **argv)
1bae0 7b 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  {.  Tcl_Interp *
1baf0 69 6e 74 65 72 70 3b 0a 20 20 0a 20 20 2f 2a 20  interp;.  .  /* 
1bb00 43 61 6c 6c 20 73 71 6c 69 74 65 33 5f 73 68 75  Call sqlite3_shu
1bb10 74 64 6f 77 6e 28 29 20 6f 6e 63 65 20 62 65 66  tdown() once bef
1bb20 6f 72 65 20 64 6f 69 6e 67 20 61 6e 79 74 68 69  ore doing anythi
1bb30 6e 67 20 65 6c 73 65 2e 20 54 68 69 73 20 69 73  ng else. This is
1bb40 20 74 6f 0a 20 20 2a 2a 20 74 65 73 74 20 74 68   to.  ** test th
1bb50 61 74 20 73 71 6c 69 74 65 33 5f 73 68 75 74 64  at sqlite3_shutd
1bb60 6f 77 6e 28 29 20 63 61 6e 20 62 65 20 73 61 66  own() can be saf
1bb70 65 6c 79 20 63 61 6c 6c 65 64 20 62 79 20 61 20  ely called by a 
1bb80 70 72 6f 63 65 73 73 20 62 65 66 6f 72 65 0a 20  process before. 
1bb90 20 2a 2a 20 73 71 6c 69 74 65 33 5f 69 6e 69 74   ** sqlite3_init
1bba0 69 61 6c 69 7a 65 28 29 20 69 73 2e 20 2a 2f 0a  ialize() is. */.
1bbb0 20 20 73 71 6c 69 74 65 33 5f 73 68 75 74 64 6f    sqlite3_shutdo
1bbc0 77 6e 28 29 3b 0a 0a 23 69 66 20 54 43 4c 53 48  wn();..#if TCLSH
1bbd0 3d 3d 32 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  ==2.  sqlite3_co
1bbe0 6e 66 69 67 28 53 51 4c 49 54 45 5f 43 4f 4e 46  nfig(SQLITE_CONF
1bbf0 49 47 5f 53 49 4e 47 4c 45 54 48 52 45 41 44 29  IG_SINGLETHREAD)
1bc00 3b 0a 23 65 6e 64 69 66 0a 20 20 54 63 6c 5f 46  ;.#endif.  Tcl_F
1bc10 69 6e 64 45 78 65 63 75 74 61 62 6c 65 28 61 72  indExecutable(ar
1bc20 67 76 5b 30 5d 29 3b 0a 0a 20 20 69 6e 74 65 72  gv[0]);..  inter
1bc30 70 20 3d 20 54 63 6c 5f 43 72 65 61 74 65 49 6e  p = Tcl_CreateIn
1bc40 74 65 72 70 28 29 3b 0a 20 20 69 6e 69 74 5f 61  terp();.  init_a
1bc50 6c 6c 28 69 6e 74 65 72 70 29 3b 0a 20 20 69 66  ll(interp);.  if
1bc60 28 20 61 72 67 63 3e 3d 32 20 29 7b 0a 20 20 20  ( argc>=2 ){.   
1bc70 20 69 6e 74 20 69 3b 0a 20 20 20 20 63 68 61 72   int i;.    char
1bc80 20 7a 41 72 67 63 5b 33 32 5d 3b 0a 20 20 20 20   zArgc[32];.    
1bc90 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
1bca0 28 73 69 7a 65 6f 66 28 7a 41 72 67 63 29 2c 20  (sizeof(zArgc), 
1bcb0 7a 41 72 67 63 2c 20 22 25 64 22 2c 20 61 72 67  zArgc, "%d", arg
1bcc0 63 2d 28 33 2d 54 43 4c 53 48 29 29 3b 0a 20 20  c-(3-TCLSH));.  
1bcd0 20 20 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74    Tcl_SetVar(int
1bce0 65 72 70 2c 22 61 72 67 63 22 2c 20 7a 41 72 67  erp,"argc", zArg
1bcf0 63 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e  c, TCL_GLOBAL_ON
1bd00 4c 59 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74  LY);.    Tcl_Set
1bd10 56 61 72 28 69 6e 74 65 72 70 2c 22 61 72 67 76  Var(interp,"argv
1bd20 30 22 2c 61 72 67 76 5b 31 5d 2c 54 43 4c 5f 47  0",argv[1],TCL_G
1bd30 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 20 20 20  LOBAL_ONLY);.   
1bd40 20 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65   Tcl_SetVar(inte
1bd50 72 70 2c 22 61 72 67 76 22 2c 20 22 22 2c 20 54  rp,"argv", "", T
1bd60 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b  CL_GLOBAL_ONLY);
1bd70 0a 20 20 20 20 66 6f 72 28 69 3d 33 2d 54 43 4c  .    for(i=3-TCL
1bd80 53 48 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b 29  SH; i<argc; i++)
1bd90 7b 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74 56  {.      Tcl_SetV
1bda0 61 72 28 69 6e 74 65 72 70 2c 20 22 61 72 67 76  ar(interp, "argv
1bdb0 22 2c 20 61 72 67 76 5b 69 5d 2c 0a 20 20 20 20  ", argv[i],.    
1bdc0 20 20 20 20 20 20 54 43 4c 5f 47 4c 4f 42 41 4c        TCL_GLOBAL
1bdd0 5f 4f 4e 4c 59 20 7c 20 54 43 4c 5f 4c 49 53 54  _ONLY | TCL_LIST
1bde0 5f 45 4c 45 4d 45 4e 54 20 7c 20 54 43 4c 5f 41  _ELEMENT | TCL_A
1bdf0 50 50 45 4e 44 5f 56 41 4c 55 45 29 3b 0a 20 20  PPEND_VALUE);.  
1be00 20 20 7d 0a 20 20 20 20 69 66 28 20 54 43 4c 53    }.    if( TCLS
1be10 48 3d 3d 31 20 26 26 20 54 63 6c 5f 45 76 61 6c  H==1 && Tcl_Eval
1be20 46 69 6c 65 28 69 6e 74 65 72 70 2c 20 61 72 67  File(interp, arg
1be30 76 5b 31 5d 29 21 3d 54 43 4c 5f 4f 4b 20 29 7b  v[1])!=TCL_OK ){
1be40 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
1be50 72 20 2a 7a 49 6e 66 6f 20 3d 20 54 63 6c 5f 47  r *zInfo = Tcl_G
1be60 65 74 56 61 72 28 69 6e 74 65 72 70 2c 20 22 65  etVar(interp, "e
1be70 72 72 6f 72 49 6e 66 6f 22 2c 20 54 43 4c 5f 47  rrorInfo", TCL_G
1be80 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 20 20 20  LOBAL_ONLY);.   
1be90 20 20 20 69 66 28 20 7a 49 6e 66 6f 3d 3d 30 20     if( zInfo==0 
1bea0 29 20 7a 49 6e 66 6f 20 3d 20 54 63 6c 5f 47 65  ) zInfo = Tcl_Ge
1beb0 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28 69 6e  tStringResult(in
1bec0 74 65 72 70 29 3b 0a 20 20 20 20 20 20 66 70 72  terp);.      fpr
1bed0 69 6e 74 66 28 73 74 64 65 72 72 2c 22 25 73 3a  intf(stderr,"%s:
1bee0 20 25 73 5c 6e 22 2c 20 2a 61 72 67 76 2c 20 7a   %s\n", *argv, z
1bef0 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 72 65 74  Info);.      ret
1bf00 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 1;.    }.  }
1bf10 0a 20 20 69 66 28 20 54 43 4c 53 48 3d 3d 32 20  .  if( TCLSH==2 
1bf20 7c 7c 20 61 72 67 63 3c 3d 31 20 29 7b 0a 20 20  || argc<=1 ){.  
1bf30 20 20 54 63 6c 5f 47 6c 6f 62 61 6c 45 76 61 6c    Tcl_GlobalEval
1bf40 28 69 6e 74 65 72 70 2c 20 7a 4d 61 69 6e 6c 6f  (interp, zMainlo
1bf50 6f 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  op);.  }.  retur
1bf60 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  n 0;.}.#endif /*
1bf70 20 54 43 4c 53 48 20 2a 2f 0a                     TCLSH */.