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

Artifact 0aa7e768b3bd72bf4c4b0312c9a84d6cdedb7638:


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 50 72 65  .  Tcl_Obj *pPre
1200: 55 70 64 61 74 65 48 6f 6f 6b 3b 20 20 20 2f 2a  UpdateHook;   /*
1210: 20 50 72 65 2d 75 70 64 61 74 65 20 68 6f 6f 6b   Pre-update hook
1220: 20 73 63 72 69 70 74 20 28 69 66 20 61 6e 79 29   script (if any)
1230: 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70   */.  Tcl_Obj *p
1240: 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 3b 20 20 20  RollbackHook;   
1250: 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20 68 6f 6f   /* Rollback hoo
1260: 6b 20 73 63 72 69 70 74 20 28 69 66 20 61 6e 79  k script (if any
1270: 29 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  ) */.  Tcl_Obj *
1280: 70 57 61 6c 48 6f 6f 6b 3b 20 20 20 20 20 20 20  pWalHook;       
1290: 20 20 2f 2a 20 57 41 4c 20 68 6f 6f 6b 20 73 63    /* WAL hook sc
12a0: 72 69 70 74 20 28 69 66 20 61 6e 79 29 20 2a 2f  ript (if any) */
12b0: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 55 6e 6c  .  Tcl_Obj *pUnl
12c0: 6f 63 6b 4e 6f 74 69 66 79 3b 20 20 20 20 2f 2a  ockNotify;    /*
12d0: 20 55 6e 6c 6f 63 6b 20 6e 6f 74 69 66 79 20 73   Unlock notify s
12e0: 63 72 69 70 74 20 28 69 66 20 61 6e 79 29 20 2a  cript (if any) *
12f0: 2f 0a 20 20 53 71 6c 43 6f 6c 6c 61 74 65 20 2a  /.  SqlCollate *
1300: 70 43 6f 6c 6c 61 74 65 3b 20 20 20 20 20 20 2f  pCollate;      /
1310: 2a 20 4c 69 73 74 20 6f 66 20 53 51 4c 20 63 6f  * List of SQL co
1320: 6c 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e  llation function
1330: 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  s */.  int rc;  
1340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1350: 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
1360: 20 6f 66 20 6d 6f 73 74 20 72 65 63 65 6e 74 20   of most recent 
1370: 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29 20 2a  sqlite3_exec() *
1380: 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 43 6f  /.  Tcl_Obj *pCo
1390: 6c 6c 61 74 65 4e 65 65 64 65 64 3b 20 20 20 2f  llateNeeded;   /
13a0: 2a 20 43 6f 6c 6c 61 74 69 6f 6e 20 6e 65 65 64  * Collation need
13b0: 65 64 20 73 63 72 69 70 74 20 2a 2f 0a 20 20 53  ed script */.  S
13c0: 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74 20 2a  qlPreparedStmt *
13d0: 73 74 6d 74 4c 69 73 74 3b 20 2f 2a 20 4c 69 73  stmtList; /* Lis
13e0: 74 20 6f 66 20 70 72 65 70 61 72 65 64 20 73 74  t of prepared st
13f0: 61 74 65 6d 65 6e 74 73 2a 2f 0a 20 20 53 71 6c  atements*/.  Sql
1400: 50 72 65 70 61 72 65 64 53 74 6d 74 20 2a 73 74  PreparedStmt *st
1410: 6d 74 4c 61 73 74 3b 20 2f 2a 20 4c 61 73 74 20  mtLast; /* Last 
1420: 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 74 68 65  statement in the
1430: 20 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6d   list */.  int m
1440: 61 78 53 74 6d 74 3b 20 20 20 20 20 20 20 20 20  axStmt;         
1450: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 78        /* The nex
1460: 74 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  t maximum number
1470: 20 6f 66 20 73 74 6d 74 4c 69 73 74 20 2a 2f 0a   of stmtList */.
1480: 20 20 69 6e 74 20 6e 53 74 6d 74 3b 20 20 20 20    int nStmt;    
1490: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14a0: 4e 75 6d 62 65 72 20 6f 66 20 73 74 61 74 65 6d  Number of statem
14b0: 65 6e 74 73 20 69 6e 20 73 74 6d 74 4c 69 73 74  ents in stmtList
14c0: 20 2a 2f 0a 20 20 49 6e 63 72 62 6c 6f 62 43 68   */.  IncrblobCh
14d0: 61 6e 6e 65 6c 20 2a 70 49 6e 63 72 62 6c 6f 62  annel *pIncrblob
14e0: 3b 2f 2a 20 4c 69 6e 6b 65 64 20 6c 69 73 74 20  ;/* Linked list 
14f0: 6f 66 20 6f 70 65 6e 20 69 6e 63 72 62 6c 6f 62  of open incrblob
1500: 20 63 68 61 6e 6e 65 6c 73 20 2a 2f 0a 20 20 69   channels */.  i
1510: 6e 74 20 6e 53 74 65 70 2c 20 6e 53 6f 72 74 2c  nt nStep, nSort,
1520: 20 6e 49 6e 64 65 78 3b 20 20 2f 2a 20 53 74 61   nIndex;  /* Sta
1530: 74 69 73 74 69 63 73 20 66 6f 72 20 6d 6f 73 74  tistics for most
1540: 20 72 65 63 65 6e 74 20 6f 70 65 72 61 74 69 6f   recent operatio
1550: 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 72 61 6e  n */.  int nTran
1560: 73 61 63 74 69 6f 6e 3b 20 20 20 20 20 20 20 20  saction;        
1570: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6e    /* Number of n
1580: 65 73 74 65 64 20 5b 74 72 61 6e 73 61 63 74 69  ested [transacti
1590: 6f 6e 5d 20 6d 65 74 68 6f 64 73 20 2a 2f 0a 7d  on] methods */.}
15a0: 3b 0a 0a 73 74 72 75 63 74 20 49 6e 63 72 62 6c  ;..struct Incrbl
15b0: 6f 62 43 68 61 6e 6e 65 6c 20 7b 0a 20 20 73 71  obChannel {.  sq
15c0: 6c 69 74 65 33 5f 62 6c 6f 62 20 2a 70 42 6c 6f  lite3_blob *pBlo
15d0: 62 3b 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74  b;      /* sqlit
15e0: 65 33 20 62 6c 6f 62 20 68 61 6e 64 6c 65 20 2a  e3 blob handle *
15f0: 2f 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44  /.  SqliteDb *pD
1600: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  b;            /*
1610: 20 41 73 73 6f 63 69 61 74 65 64 20 64 61 74 61   Associated data
1620: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
1630: 2a 2f 0a 20 20 69 6e 74 20 69 53 65 65 6b 3b 20  */.  int iSeek; 
1640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1650: 2a 20 43 75 72 72 65 6e 74 20 73 65 65 6b 20 6f  * Current seek o
1660: 66 66 73 65 74 20 2a 2f 0a 20 20 54 63 6c 5f 43  ffset */.  Tcl_C
1670: 68 61 6e 6e 65 6c 20 63 68 61 6e 6e 65 6c 3b 20  hannel channel; 
1680: 20 20 20 20 20 2f 2a 20 43 68 61 6e 6e 65 6c 20       /* Channel 
1690: 69 64 65 6e 74 69 66 69 65 72 20 2a 2f 0a 20 20  identifier */.  
16a0: 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20  IncrblobChannel 
16b0: 2a 70 4e 65 78 74 3b 20 20 20 2f 2a 20 4c 69 6e  *pNext;   /* Lin
16c0: 6b 65 64 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20  ked list of all 
16d0: 6f 70 65 6e 20 69 6e 63 72 62 6c 6f 62 20 63 68  open incrblob ch
16e0: 61 6e 6e 65 6c 73 20 2a 2f 0a 20 20 49 6e 63 72  annels */.  Incr
16f0: 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 70 50 72  blobChannel *pPr
1700: 65 76 3b 20 20 20 2f 2a 20 4c 69 6e 6b 65 64 20  ev;   /* Linked 
1710: 6c 69 73 74 20 6f 66 20 61 6c 6c 20 6f 70 65 6e  list of all open
1720: 20 69 6e 63 72 62 6c 6f 62 20 63 68 61 6e 6e 65   incrblob channe
1730: 6c 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  ls */.};../*.** 
1740: 43 6f 6d 70 75 74 65 20 61 20 73 74 72 69 6e 67  Compute a string
1750: 20 6c 65 6e 67 74 68 20 74 68 61 74 20 69 73 20   length that is 
1760: 6c 69 6d 69 74 65 64 20 74 6f 20 77 68 61 74 20  limited to what 
1770: 63 61 6e 20 62 65 20 73 74 6f 72 65 64 20 69 6e  can be stored in
1780: 0a 2a 2a 20 6c 6f 77 65 72 20 33 30 20 62 69 74  .** lower 30 bit
1790: 73 20 6f 66 20 61 20 33 32 2d 62 69 74 20 73 69  s of a 32-bit si
17a0: 67 6e 65 64 20 69 6e 74 65 67 65 72 2e 0a 2a 2f  gned integer..*/
17b0: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 74 72 6c  .static int strl
17c0: 65 6e 33 30 28 63 6f 6e 73 74 20 63 68 61 72 20  en30(const char 
17d0: 2a 7a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  *z){.  const cha
17e0: 72 20 2a 7a 32 20 3d 20 7a 3b 0a 20 20 77 68 69  r *z2 = z;.  whi
17f0: 6c 65 28 20 2a 7a 32 20 29 7b 20 7a 32 2b 2b 3b  le( *z2 ){ z2++;
1800: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 78 33 66   }.  return 0x3f
1810: 66 66 66 66 66 66 20 26 20 28 69 6e 74 29 28 7a  ffffff & (int)(z
1820: 32 20 2d 20 7a 29 3b 0a 7d 0a 0a 0a 23 69 66 6e  2 - z);.}...#ifn
1830: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1840: 49 4e 43 52 42 4c 4f 42 0a 2f 2a 0a 2a 2a 20 43  INCRBLOB./*.** C
1850: 6c 6f 73 65 20 61 6c 6c 20 69 6e 63 72 62 6c 6f  lose all incrblo
1860: 62 20 63 68 61 6e 6e 65 6c 73 20 6f 70 65 6e 65  b channels opene
1870: 64 20 75 73 69 6e 67 20 64 61 74 61 62 61 73 65  d using database
1880: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 44 62 2e   connection pDb.
1890: 0a 2a 2a 20 54 68 69 73 20 69 73 20 63 61 6c 6c  .** This is call
18a0: 65 64 20 77 68 65 6e 20 73 68 75 74 74 69 6e 67  ed when shutting
18b0: 20 64 6f 77 6e 20 74 68 65 20 64 61 74 61 62 61   down the databa
18c0: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a  se connection..*
18d0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6c  /.static void cl
18e0: 6f 73 65 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e  oseIncrblobChann
18f0: 65 6c 73 28 53 71 6c 69 74 65 44 62 20 2a 70 44  els(SqliteDb *pD
1900: 62 29 7b 0a 20 20 49 6e 63 72 62 6c 6f 62 43 68  b){.  IncrblobCh
1910: 61 6e 6e 65 6c 20 2a 70 3b 0a 20 20 49 6e 63 72  annel *p;.  Incr
1920: 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 70 4e 65  blobChannel *pNe
1930: 78 74 3b 0a 0a 20 20 66 6f 72 28 70 3d 70 44 62  xt;..  for(p=pDb
1940: 2d 3e 70 49 6e 63 72 62 6c 6f 62 3b 20 70 3b 20  ->pIncrblob; p; 
1950: 70 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e  p=pNext){.    pN
1960: 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a  ext = p->pNext;.
1970: 0a 20 20 20 20 2f 2a 20 4e 6f 74 65 3a 20 43 61  .    /* Note: Ca
1980: 6c 6c 69 6e 67 20 75 6e 72 65 67 69 73 74 65 72  lling unregister
1990: 20 68 65 72 65 20 63 61 6c 6c 20 54 63 6c 5f 43   here call Tcl_C
19a0: 6c 6f 73 65 20 6f 6e 20 74 68 65 20 69 6e 63 72  lose on the incr
19b0: 62 6c 6f 62 20 63 68 61 6e 6e 65 6c 2c 20 0a 20  blob channel, . 
19c0: 20 20 20 2a 2a 20 77 68 69 63 68 20 64 65 6c 65     ** which dele
19d0: 74 65 73 20 74 68 65 20 49 6e 63 72 62 6c 6f 62  tes the Incrblob
19e0: 43 68 61 6e 6e 65 6c 20 73 74 72 75 63 74 75 72  Channel structur
19f0: 65 20 61 74 20 2a 70 2e 20 53 6f 20 64 6f 20 6e  e at *p. So do n
1a00: 6f 74 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 54  ot.    ** call T
1a10: 63 6c 5f 46 72 65 65 28 29 20 68 65 72 65 2e 0a  cl_Free() here..
1a20: 20 20 20 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 55      */.    Tcl_U
1a30: 6e 72 65 67 69 73 74 65 72 43 68 61 6e 6e 65 6c  nregisterChannel
1a40: 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20 70 2d  (pDb->interp, p-
1a50: 3e 63 68 61 6e 6e 65 6c 29 3b 0a 20 20 7d 0a 7d  >channel);.  }.}
1a60: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e  ../*.** Close an
1a70: 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 62 6c 6f   incremental blo
1a80: 62 20 63 68 61 6e 6e 65 6c 2e 0a 2a 2f 0a 73 74  b channel..*/.st
1a90: 61 74 69 63 20 69 6e 74 20 69 6e 63 72 62 6c 6f  atic int incrblo
1aa0: 62 43 6c 6f 73 65 28 43 6c 69 65 6e 74 44 61 74  bClose(ClientDat
1ab0: 61 20 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 20  a instanceData, 
1ac0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
1ad0: 72 70 29 7b 0a 20 20 49 6e 63 72 62 6c 6f 62 43  rp){.  IncrblobC
1ae0: 68 61 6e 6e 65 6c 20 2a 70 20 3d 20 28 49 6e 63  hannel *p = (Inc
1af0: 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 29 69  rblobChannel *)i
1b00: 6e 73 74 61 6e 63 65 44 61 74 61 3b 0a 20 20 69  nstanceData;.  i
1b10: 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  nt rc = sqlite3_
1b20: 62 6c 6f 62 5f 63 6c 6f 73 65 28 70 2d 3e 70 42  blob_close(p->pB
1b30: 6c 6f 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 20  lob);.  sqlite3 
1b40: 2a 64 62 20 3d 20 70 2d 3e 70 44 62 2d 3e 64 62  *db = p->pDb->db
1b50: 3b 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74  ;..  /* Remove t
1b60: 68 65 20 63 68 61 6e 6e 65 6c 20 66 72 6f 6d 20  he channel from 
1b70: 74 68 65 20 53 71 6c 69 74 65 44 62 2e 70 49 6e  the SqliteDb.pIn
1b80: 63 72 62 6c 6f 62 20 6c 69 73 74 2e 20 2a 2f 0a  crblob list. */.
1b90: 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29    if( p->pNext )
1ba0: 7b 0a 20 20 20 20 70 2d 3e 70 4e 65 78 74 2d 3e  {.    p->pNext->
1bb0: 70 50 72 65 76 20 3d 20 70 2d 3e 70 50 72 65 76  pPrev = p->pPrev
1bc0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70  ;.  }.  if( p->p
1bd0: 50 72 65 76 20 29 7b 0a 20 20 20 20 70 2d 3e 70  Prev ){.    p->p
1be0: 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d  Prev->pNext = p-
1bf0: 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66  >pNext;.  }.  if
1c00: 28 20 70 2d 3e 70 44 62 2d 3e 70 49 6e 63 72 62  ( p->pDb->pIncrb
1c10: 6c 6f 62 3d 3d 70 20 29 7b 0a 20 20 20 20 70 2d  lob==p ){.    p-
1c20: 3e 70 44 62 2d 3e 70 49 6e 63 72 62 6c 6f 62 20  >pDb->pIncrblob 
1c30: 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a  = p->pNext;.  }.
1c40: 0a 20 20 2f 2a 20 46 72 65 65 20 74 68 65 20 49  .  /* Free the I
1c50: 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 73  ncrblobChannel s
1c60: 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 54 63  tructure */.  Tc
1c70: 6c 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 70  l_Free((char *)p
1c80: 29 3b 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51  );..  if( rc!=SQ
1c90: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54  LITE_OK ){.    T
1ca0: 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
1cb0: 65 72 70 2c 20 28 63 68 61 72 20 2a 29 73 71 6c  erp, (char *)sql
1cc0: 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29 2c  ite3_errmsg(db),
1cd0: 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a   TCL_VOLATILE);.
1ce0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
1cf0: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75  RROR;.  }.  retu
1d00: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
1d10: 0a 2a 2a 20 52 65 61 64 20 64 61 74 61 20 66 72  .** Read data fr
1d20: 6f 6d 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61  om an incrementa
1d30: 6c 20 62 6c 6f 62 20 63 68 61 6e 6e 65 6c 2e 0a  l blob channel..
1d40: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e  */.static int in
1d50: 63 72 62 6c 6f 62 49 6e 70 75 74 28 0a 20 20 43  crblobInput(.  C
1d60: 6c 69 65 6e 74 44 61 74 61 20 69 6e 73 74 61 6e  lientData instan
1d70: 63 65 44 61 74 61 2c 20 0a 20 20 63 68 61 72 20  ceData, .  char 
1d80: 2a 62 75 66 2c 20 0a 20 20 69 6e 74 20 62 75 66  *buf, .  int buf
1d90: 53 69 7a 65 2c 0a 20 20 69 6e 74 20 2a 65 72 72  Size,.  int *err
1da0: 6f 72 43 6f 64 65 50 74 72 0a 29 7b 0a 20 20 49  orCodePtr.){.  I
1db0: 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a  ncrblobChannel *
1dc0: 70 20 3d 20 28 49 6e 63 72 62 6c 6f 62 43 68 61  p = (IncrblobCha
1dd0: 6e 6e 65 6c 20 2a 29 69 6e 73 74 61 6e 63 65 44  nnel *)instanceD
1de0: 61 74 61 3b 0a 20 20 69 6e 74 20 6e 52 65 61 64  ata;.  int nRead
1df0: 20 3d 20 62 75 66 53 69 7a 65 3b 20 20 20 20 20   = bufSize;     
1e00: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1e10: 20 62 79 74 65 73 20 74 6f 20 72 65 61 64 20 2a   bytes to read *
1e20: 2f 0a 20 20 69 6e 74 20 6e 42 6c 6f 62 3b 20 20  /.  int nBlob;  
1e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e40: 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20 6f   /* Total size o
1e50: 66 20 74 68 65 20 62 6c 6f 62 20 2a 2f 0a 20 20  f the blob */.  
1e60: 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
1e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e80: 73 71 6c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  sqlite error cod
1e90: 65 20 2a 2f 0a 0a 20 20 6e 42 6c 6f 62 20 3d 20  e */..  nBlob = 
1ea0: 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 62 79 74  sqlite3_blob_byt
1eb0: 65 73 28 70 2d 3e 70 42 6c 6f 62 29 3b 0a 20 20  es(p->pBlob);.  
1ec0: 69 66 28 20 28 70 2d 3e 69 53 65 65 6b 2b 6e 52  if( (p->iSeek+nR
1ed0: 65 61 64 29 3e 6e 42 6c 6f 62 20 29 7b 0a 20 20  ead)>nBlob ){.  
1ee0: 20 20 6e 52 65 61 64 20 3d 20 6e 42 6c 6f 62 2d    nRead = nBlob-
1ef0: 70 2d 3e 69 53 65 65 6b 3b 0a 20 20 7d 0a 20 20  p->iSeek;.  }.  
1f00: 69 66 28 20 6e 52 65 61 64 3c 3d 30 20 29 7b 0a  if( nRead<=0 ){.
1f10: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
1f20: 7d 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  }..  rc = sqlite
1f30: 33 5f 62 6c 6f 62 5f 72 65 61 64 28 70 2d 3e 70  3_blob_read(p->p
1f40: 42 6c 6f 62 2c 20 28 76 6f 69 64 20 2a 29 62 75  Blob, (void *)bu
1f50: 66 2c 20 6e 52 65 61 64 2c 20 70 2d 3e 69 53 65  f, nRead, p->iSe
1f60: 65 6b 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ek);.  if( rc!=S
1f70: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1f80: 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20  *errorCodePtr = 
1f90: 72 63 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 2d  rc;.    return -
1fa0: 31 3b 0a 20 20 7d 0a 0a 20 20 70 2d 3e 69 53 65  1;.  }..  p->iSe
1fb0: 65 6b 20 2b 3d 20 6e 52 65 61 64 3b 0a 20 20 72  ek += nRead;.  r
1fc0: 65 74 75 72 6e 20 6e 52 65 61 64 3b 0a 7d 0a 0a  eturn nRead;.}..
1fd0: 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 64 61 74 61  /*.** Write data
1fe0: 20 74 6f 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74   to an increment
1ff0: 61 6c 20 62 6c 6f 62 20 63 68 61 6e 6e 65 6c 2e  al blob channel.
2000: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69  .*/.static int i
2010: 6e 63 72 62 6c 6f 62 4f 75 74 70 75 74 28 0a 20  ncrblobOutput(. 
2020: 20 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73 74   ClientData inst
2030: 61 6e 63 65 44 61 74 61 2c 20 0a 20 20 43 4f 4e  anceData, .  CON
2040: 53 54 20 63 68 61 72 20 2a 62 75 66 2c 20 0a 20  ST char *buf, . 
2050: 20 69 6e 74 20 74 6f 57 72 69 74 65 2c 0a 20 20   int toWrite,.  
2060: 69 6e 74 20 2a 65 72 72 6f 72 43 6f 64 65 50 74  int *errorCodePt
2070: 72 0a 29 7b 0a 20 20 49 6e 63 72 62 6c 6f 62 43  r.){.  IncrblobC
2080: 68 61 6e 6e 65 6c 20 2a 70 20 3d 20 28 49 6e 63  hannel *p = (Inc
2090: 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 29 69  rblobChannel *)i
20a0: 6e 73 74 61 6e 63 65 44 61 74 61 3b 0a 20 20 69  nstanceData;.  i
20b0: 6e 74 20 6e 57 72 69 74 65 20 3d 20 74 6f 57 72  nt nWrite = toWr
20c0: 69 74 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e  ite;        /* N
20d0: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74  umber of bytes t
20e0: 6f 20 77 72 69 74 65 20 2a 2f 0a 20 20 69 6e 74  o write */.  int
20f0: 20 6e 42 6c 6f 62 3b 20 20 20 20 20 20 20 20 20   nBlob;         
2100: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74            /* Tot
2110: 61 6c 20 73 69 7a 65 20 6f 66 20 74 68 65 20 62  al size of the b
2120: 6c 6f 62 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  lob */.  int rc;
2130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2140: 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 20        /* sqlite 
2150: 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 0a 20  error code */.. 
2160: 20 6e 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33   nBlob = sqlite3
2170: 5f 62 6c 6f 62 5f 62 79 74 65 73 28 70 2d 3e 70  _blob_bytes(p->p
2180: 42 6c 6f 62 29 3b 0a 20 20 69 66 28 20 28 70 2d  Blob);.  if( (p-
2190: 3e 69 53 65 65 6b 2b 6e 57 72 69 74 65 29 3e 6e  >iSeek+nWrite)>n
21a0: 42 6c 6f 62 20 29 7b 0a 20 20 20 20 2a 65 72 72  Blob ){.    *err
21b0: 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 49 4e 56  orCodePtr = EINV
21c0: 41 4c 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 2d  AL;.    return -
21d0: 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 57 72  1;.  }.  if( nWr
21e0: 69 74 65 3c 3d 30 20 29 7b 0a 20 20 20 20 72 65  ite<=0 ){.    re
21f0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 72  turn 0;.  }..  r
2200: 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62  c = sqlite3_blob
2210: 5f 77 72 69 74 65 28 70 2d 3e 70 42 6c 6f 62 2c  _write(p->pBlob,
2220: 20 28 76 6f 69 64 20 2a 29 62 75 66 2c 20 6e 57   (void *)buf, nW
2230: 72 69 74 65 2c 20 70 2d 3e 69 53 65 65 6b 29 3b  rite, p->iSeek);
2240: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
2250: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 65 72 72  E_OK ){.    *err
2260: 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 49 4f 3b  orCodePtr = EIO;
2270: 0a 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a  .    return -1;.
2280: 20 20 7d 0a 0a 20 20 70 2d 3e 69 53 65 65 6b 20    }..  p->iSeek 
2290: 2b 3d 20 6e 57 72 69 74 65 3b 0a 20 20 72 65 74  += nWrite;.  ret
22a0: 75 72 6e 20 6e 57 72 69 74 65 3b 0a 7d 0a 0a 2f  urn nWrite;.}../
22b0: 2a 0a 2a 2a 20 53 65 65 6b 20 61 6e 20 69 6e 63  *.** Seek an inc
22c0: 72 65 6d 65 6e 74 61 6c 20 62 6c 6f 62 20 63 68  remental blob ch
22d0: 61 6e 6e 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63  annel..*/.static
22e0: 20 69 6e 74 20 69 6e 63 72 62 6c 6f 62 53 65 65   int incrblobSee
22f0: 6b 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20  k(.  ClientData 
2300: 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 20 0a 20  instanceData, . 
2310: 20 6c 6f 6e 67 20 6f 66 66 73 65 74 2c 0a 20 20   long offset,.  
2320: 69 6e 74 20 73 65 65 6b 4d 6f 64 65 2c 0a 20 20  int seekMode,.  
2330: 69 6e 74 20 2a 65 72 72 6f 72 43 6f 64 65 50 74  int *errorCodePt
2340: 72 0a 29 7b 0a 20 20 49 6e 63 72 62 6c 6f 62 43  r.){.  IncrblobC
2350: 68 61 6e 6e 65 6c 20 2a 70 20 3d 20 28 49 6e 63  hannel *p = (Inc
2360: 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 29 69  rblobChannel *)i
2370: 6e 73 74 61 6e 63 65 44 61 74 61 3b 0a 0a 20 20  nstanceData;..  
2380: 73 77 69 74 63 68 28 20 73 65 65 6b 4d 6f 64 65  switch( seekMode
2390: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 45 45   ){.    case SEE
23a0: 4b 5f 53 45 54 3a 0a 20 20 20 20 20 20 70 2d 3e  K_SET:.      p->
23b0: 69 53 65 65 6b 20 3d 20 6f 66 66 73 65 74 3b 0a  iSeek = offset;.
23c0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
23d0: 20 63 61 73 65 20 53 45 45 4b 5f 43 55 52 3a 0a   case SEEK_CUR:.
23e0: 20 20 20 20 20 20 70 2d 3e 69 53 65 65 6b 20 2b        p->iSeek +
23f0: 3d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  = offset;.      
2400: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
2410: 53 45 45 4b 5f 45 4e 44 3a 0a 20 20 20 20 20 20  SEEK_END:.      
2420: 70 2d 3e 69 53 65 65 6b 20 3d 20 73 71 6c 69 74  p->iSeek = sqlit
2430: 65 33 5f 62 6c 6f 62 5f 62 79 74 65 73 28 70 2d  e3_blob_bytes(p-
2440: 3e 70 42 6c 6f 62 29 20 2b 20 6f 66 66 73 65 74  >pBlob) + offset
2450: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a  ;.      break;..
2460: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 61 73 73      default: ass
2470: 65 72 74 28 21 22 42 61 64 20 73 65 65 6b 4d 6f  ert(!"Bad seekMo
2480: 64 65 22 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  de");.  }..  ret
2490: 75 72 6e 20 70 2d 3e 69 53 65 65 6b 3b 0a 7d 0a  urn p->iSeek;.}.
24a0: 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e  ..static void in
24b0: 63 72 62 6c 6f 62 57 61 74 63 68 28 43 6c 69 65  crblobWatch(Clie
24c0: 6e 74 44 61 74 61 20 69 6e 73 74 61 6e 63 65 44  ntData instanceD
24d0: 61 74 61 2c 20 69 6e 74 20 6d 6f 64 65 29 7b 20  ata, int mode){ 
24e0: 0a 20 20 2f 2a 20 4e 4f 2d 4f 50 20 2a 2f 20 0a  .  /* NO-OP */ .
24f0: 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 63  }.static int inc
2500: 72 62 6c 6f 62 48 61 6e 64 6c 65 28 43 6c 69 65  rblobHandle(Clie
2510: 6e 74 44 61 74 61 20 69 6e 73 74 61 6e 63 65 44  ntData instanceD
2520: 61 74 61 2c 20 69 6e 74 20 64 69 72 2c 20 43 6c  ata, int dir, Cl
2530: 69 65 6e 74 44 61 74 61 20 2a 68 50 74 72 29 7b  ientData *hPtr){
2540: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  .  return TCL_ER
2550: 52 4f 52 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 54  ROR;.}..static T
2560: 63 6c 5f 43 68 61 6e 6e 65 6c 54 79 70 65 20 49  cl_ChannelType I
2570: 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 54 79  ncrblobChannelTy
2580: 70 65 20 3d 20 7b 0a 20 20 22 69 6e 63 72 62 6c  pe = {.  "incrbl
2590: 6f 62 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ob",            
25a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74              /* t
25b0: 79 70 65 4e 61 6d 65 20 20 20 20 20 20 20 20 20  ypeName         
25c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25d0: 20 20 20 20 2a 2f 0a 20 20 54 43 4c 5f 43 48 41      */.  TCL_CHA
25e0: 4e 4e 45 4c 5f 56 45 52 53 49 4f 4e 5f 32 2c 20  NNEL_VERSION_2, 
25f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 76              /* v
2600: 65 72 73 69 6f 6e 20 20 20 20 20 20 20 20 20 20  ersion          
2610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2620: 20 20 20 20 2a 2f 0a 20 20 69 6e 63 72 62 6c 6f      */.  incrblo
2630: 62 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20  bClose,         
2640: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 63              /* c
2650: 6c 6f 73 65 50 72 6f 63 20 20 20 20 20 20 20 20  loseProc        
2660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2670: 20 20 20 20 2a 2f 0a 20 20 69 6e 63 72 62 6c 6f      */.  incrblo
2680: 62 49 6e 70 75 74 2c 20 20 20 20 20 20 20 20 20  bInput,         
2690: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69              /* i
26a0: 6e 70 75 74 50 72 6f 63 20 20 20 20 20 20 20 20  nputProc        
26b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26c0: 20 20 20 20 2a 2f 0a 20 20 69 6e 63 72 62 6c 6f      */.  incrblo
26d0: 62 4f 75 74 70 75 74 2c 20 20 20 20 20 20 20 20  bOutput,        
26e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6f              /* o
26f0: 75 74 70 75 74 50 72 6f 63 20 20 20 20 20 20 20  utputProc       
2700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2710: 20 20 20 20 2a 2f 0a 20 20 69 6e 63 72 62 6c 6f      */.  incrblo
2720: 62 53 65 65 6b 2c 20 20 20 20 20 20 20 20 20 20  bSeek,          
2730: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
2740: 65 65 6b 50 72 6f 63 20 20 20 20 20 20 20 20 20  eekProc         
2750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2760: 20 20 20 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20      */.  0,     
2770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2780: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
2790: 65 74 4f 70 74 69 6f 6e 50 72 6f 63 20 20 20 20  etOptionProc    
27a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27b0: 20 20 20 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20      */.  0,     
27c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 67              /* g
27e0: 65 74 4f 70 74 69 6f 6e 50 72 6f 63 20 20 20 20  etOptionProc    
27f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2800: 20 20 20 20 2a 2f 0a 20 20 69 6e 63 72 62 6c 6f      */.  incrblo
2810: 62 57 61 74 63 68 2c 20 20 20 20 20 20 20 20 20  bWatch,         
2820: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 77              /* w
2830: 61 74 63 68 50 72 6f 63 20 28 74 68 69 73 20 69  atchProc (this i
2840: 73 20 61 20 6e 6f 2d 6f 70 29 20 20 20 20 20 20  s a no-op)      
2850: 20 20 20 20 2a 2f 0a 20 20 69 6e 63 72 62 6c 6f      */.  incrblo
2860: 62 48 61 6e 64 6c 65 2c 20 20 20 20 20 20 20 20  bHandle,        
2870: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 67              /* g
2880: 65 74 48 61 6e 64 6c 65 50 72 6f 63 20 28 61 6c  etHandleProc (al
2890: 77 61 79 73 20 72 65 74 75 72 6e 73 20 65 72 72  ways returns err
28a0: 6f 72 29 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20  or) */.  0,     
28b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 63              /* c
28d0: 6c 6f 73 65 32 50 72 6f 63 20 20 20 20 20 20 20  lose2Proc       
28e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28f0: 20 20 20 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20      */.  0,     
2900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2910: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 62              /* b
2920: 6c 6f 63 6b 4d 6f 64 65 50 72 6f 63 20 20 20 20  lockModeProc    
2930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2940: 20 20 20 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20      */.  0,     
2950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2960: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66              /* f
2970: 6c 75 73 68 50 72 6f 63 20 20 20 20 20 20 20 20  lushProc        
2980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2990: 20 20 20 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20      */.  0,     
29a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 68              /* h
29c0: 61 6e 64 6c 65 72 50 72 6f 63 20 20 20 20 20 20  andlerProc      
29d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29e0: 20 20 20 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20      */.  0,     
29f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 77              /* w
2a10: 69 64 65 53 65 65 6b 50 72 6f 63 20 20 20 20 20  ideSeekProc     
2a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a30: 20 20 20 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a      */.};../*.**
2a40: 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 69 6e   Create a new in
2a50: 63 72 62 6c 6f 62 20 63 68 61 6e 6e 65 6c 2e 0a  crblob channel..
2a60: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 72  */.static int cr
2a70: 65 61 74 65 49 6e 63 72 62 6c 6f 62 43 68 61 6e  eateIncrblobChan
2a80: 6e 65 6c 28 0a 20 20 54 63 6c 5f 49 6e 74 65 72  nel(.  Tcl_Inter
2a90: 70 20 2a 69 6e 74 65 72 70 2c 20 0a 20 20 53 71  p *interp, .  Sq
2aa0: 6c 69 74 65 44 62 20 2a 70 44 62 2c 20 0a 20 20  liteDb *pDb, .  
2ab0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 2c  const char *zDb,
2ac0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
2ad0: 54 61 62 6c 65 2c 20 0a 20 20 63 6f 6e 73 74 20  Table, .  const 
2ae0: 63 68 61 72 20 2a 7a 43 6f 6c 75 6d 6e 2c 20 0a  char *zColumn, .
2af0: 20 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 69    sqlite_int64 i
2b00: 52 6f 77 2c 0a 20 20 69 6e 74 20 69 73 52 65 61  Row,.  int isRea
2b10: 64 6f 6e 6c 79 0a 29 7b 0a 20 20 49 6e 63 72 62  donly.){.  Incrb
2b20: 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 70 3b 0a 20  lobChannel *p;. 
2b30: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
2b40: 44 62 2d 3e 64 62 3b 0a 20 20 73 71 6c 69 74 65  Db->db;.  sqlite
2b50: 33 5f 62 6c 6f 62 20 2a 70 42 6c 6f 62 3b 0a 20  3_blob *pBlob;. 
2b60: 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 66   int rc;.  int f
2b70: 6c 61 67 73 20 3d 20 54 43 4c 5f 52 45 41 44 41  lags = TCL_READA
2b80: 42 4c 45 7c 28 69 73 52 65 61 64 6f 6e 6c 79 20  BLE|(isReadonly 
2b90: 3f 20 30 20 3a 20 54 43 4c 5f 57 52 49 54 41 42  ? 0 : TCL_WRITAB
2ba0: 4c 45 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20  LE);..  /* This 
2bb0: 76 61 72 69 61 62 6c 65 20 69 73 20 75 73 65 64  variable is used
2bc0: 20 74 6f 20 6e 61 6d 65 20 74 68 65 20 63 68 61   to name the cha
2bd0: 6e 6e 65 6c 73 3a 20 22 69 6e 63 72 62 6c 6f 62  nnels: "incrblob
2be0: 5f 5b 69 6e 63 72 20 63 6f 75 6e 74 5d 22 20 2a  _[incr count]" *
2bf0: 2f 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 63  /.  static int c
2c00: 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 63 68 61 72  ount = 0;.  char
2c10: 20 7a 43 68 61 6e 6e 65 6c 5b 36 34 5d 3b 0a 0a   zChannel[64];..
2c20: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62    rc = sqlite3_b
2c30: 6c 6f 62 5f 6f 70 65 6e 28 64 62 2c 20 7a 44 62  lob_open(db, zDb
2c40: 2c 20 7a 54 61 62 6c 65 2c 20 7a 43 6f 6c 75 6d  , zTable, zColum
2c50: 6e 2c 20 69 52 6f 77 2c 20 21 69 73 52 65 61 64  n, iRow, !isRead
2c60: 6f 6e 6c 79 2c 20 26 70 42 6c 6f 62 29 3b 0a 20  only, &pBlob);. 
2c70: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2c80: 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65  OK ){.    Tcl_Se
2c90: 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  tResult(interp, 
2ca0: 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f  (char *)sqlite3_
2cb0: 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c  errmsg(pDb->db),
2cc0: 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a   TCL_VOLATILE);.
2cd0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
2ce0: 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 70 20 3d  RROR;.  }..  p =
2cf0: 20 28 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65   (IncrblobChanne
2d00: 6c 20 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28 73 69  l *)Tcl_Alloc(si
2d10: 7a 65 6f 66 28 49 6e 63 72 62 6c 6f 62 43 68 61  zeof(IncrblobCha
2d20: 6e 6e 65 6c 29 29 3b 0a 20 20 70 2d 3e 69 53 65  nnel));.  p->iSe
2d30: 65 6b 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 42 6c  ek = 0;.  p->pBl
2d40: 6f 62 20 3d 20 70 42 6c 6f 62 3b 0a 0a 20 20 73  ob = pBlob;..  s
2d50: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
2d60: 73 69 7a 65 6f 66 28 7a 43 68 61 6e 6e 65 6c 29  sizeof(zChannel)
2d70: 2c 20 7a 43 68 61 6e 6e 65 6c 2c 20 22 69 6e 63  , zChannel, "inc
2d80: 72 62 6c 6f 62 5f 25 64 22 2c 20 2b 2b 63 6f 75  rblob_%d", ++cou
2d90: 6e 74 29 3b 0a 20 20 70 2d 3e 63 68 61 6e 6e 65  nt);.  p->channe
2da0: 6c 20 3d 20 54 63 6c 5f 43 72 65 61 74 65 43 68  l = Tcl_CreateCh
2db0: 61 6e 6e 65 6c 28 26 49 6e 63 72 62 6c 6f 62 43  annel(&IncrblobC
2dc0: 68 61 6e 6e 65 6c 54 79 70 65 2c 20 7a 43 68 61  hannelType, zCha
2dd0: 6e 6e 65 6c 2c 20 70 2c 20 66 6c 61 67 73 29 3b  nnel, p, flags);
2de0: 0a 20 20 54 63 6c 5f 52 65 67 69 73 74 65 72 43  .  Tcl_RegisterC
2df0: 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 70  hannel(interp, p
2e00: 2d 3e 63 68 61 6e 6e 65 6c 29 3b 0a 0a 20 20 2f  ->channel);..  /
2e10: 2a 20 4c 69 6e 6b 20 74 68 65 20 6e 65 77 20 63  * Link the new c
2e20: 68 61 6e 6e 65 6c 20 69 6e 74 6f 20 74 68 65 20  hannel into the 
2e30: 53 71 6c 69 74 65 44 62 2e 70 49 6e 63 72 62 6c  SqliteDb.pIncrbl
2e40: 6f 62 20 6c 69 73 74 2e 20 2a 2f 0a 20 20 70 2d  ob list. */.  p-
2e50: 3e 70 4e 65 78 74 20 3d 20 70 44 62 2d 3e 70 49  >pNext = pDb->pI
2e60: 6e 63 72 62 6c 6f 62 3b 0a 20 20 70 2d 3e 70 50  ncrblob;.  p->pP
2e70: 72 65 76 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  rev = 0;.  if( p
2e80: 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 70  ->pNext ){.    p
2e90: 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d  ->pNext->pPrev =
2ea0: 20 70 3b 0a 20 20 7d 0a 20 20 70 44 62 2d 3e 70   p;.  }.  pDb->p
2eb0: 49 6e 63 72 62 6c 6f 62 20 3d 20 70 3b 0a 20 20  Incrblob = p;.  
2ec0: 70 2d 3e 70 44 62 20 3d 20 70 44 62 3b 0a 0a 20  p->pDb = pDb;.. 
2ed0: 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
2ee0: 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 54  nterp, (char *)T
2ef0: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d  cl_GetChannelNam
2f00: 65 28 70 2d 3e 63 68 61 6e 6e 65 6c 29 2c 20 54  e(p->channel), T
2f10: 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20  CL_VOLATILE);.  
2f20: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
2f30: 0a 23 65 6c 73 65 20 20 2f 2a 20 65 6c 73 65 20  .#else  /* else 
2f40: 63 6c 61 75 73 65 20 66 6f 72 20 22 23 69 66 6e  clause for "#ifn
2f50: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2f60: 49 4e 43 52 42 4c 4f 42 22 20 2a 2f 0a 20 20 23  INCRBLOB" */.  #
2f70: 64 65 66 69 6e 65 20 63 6c 6f 73 65 49 6e 63 72  define closeIncr
2f80: 62 6c 6f 62 43 68 61 6e 6e 65 6c 73 28 70 44 62  blobChannels(pDb
2f90: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
2fa0: 4c 6f 6f 6b 20 61 74 20 74 68 65 20 73 63 72 69  Look at the scri
2fb0: 70 74 20 70 72 65 66 69 78 20 69 6e 20 70 43 6d  pt prefix in pCm
2fc0: 64 2e 20 20 57 65 20 77 69 6c 6c 20 62 65 20 65  d.  We will be e
2fd0: 78 65 63 75 74 69 6e 67 20 74 68 69 73 20 73 63  xecuting this sc
2fe0: 72 69 70 74 0a 2a 2a 20 61 66 74 65 72 20 66 69  ript.** after fi
2ff0: 72 73 74 20 61 70 70 65 6e 64 69 6e 67 20 6f 6e  rst appending on
3000: 65 20 6f 72 20 6d 6f 72 65 20 61 72 67 75 6d 65  e or more argume
3010: 6e 74 73 2e 20 20 54 68 69 73 20 72 6f 75 74 69  nts.  This routi
3020: 6e 65 20 61 6e 61 6c 79 7a 65 73 0a 2a 2a 20 74  ne analyzes.** t
3030: 68 65 20 73 63 72 69 70 74 20 74 6f 20 73 65 65  he script to see
3040: 20 69 66 20 69 74 20 69 73 20 73 61 66 65 20 74   if it is safe t
3050: 6f 20 75 73 65 20 54 63 6c 5f 45 76 61 6c 4f 62  o use Tcl_EvalOb
3060: 6a 76 28 29 20 6f 6e 20 74 68 65 20 73 63 72 69  jv() on the scri
3070: 70 74 0a 2a 2a 20 72 61 74 68 65 72 20 74 68 61  pt.** rather tha
3080: 6e 20 74 68 65 20 6d 6f 72 65 20 67 65 6e 65 72  n the more gener
3090: 61 6c 20 54 63 6c 5f 45 76 61 6c 45 78 28 29 2e  al Tcl_EvalEx().
30a0: 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 76 28 29    Tcl_EvalObjv()
30b0: 20 69 73 20 6d 75 63 68 0a 2a 2a 20 66 61 73 74   is much.** fast
30c0: 65 72 2e 0a 2a 2a 0a 2a 2a 20 53 63 72 69 70 74  er..**.** Script
30d0: 73 20 74 68 61 74 20 61 72 65 20 73 61 66 65 20  s that are safe 
30e0: 74 6f 20 75 73 65 20 77 69 74 68 20 54 63 6c 5f  to use with Tcl_
30f0: 45 76 61 6c 4f 62 6a 76 28 29 20 63 6f 6e 73 69  EvalObjv() consi
3100: 73 74 73 20 6f 66 20 61 0a 2a 2a 20 63 6f 6d 6d  sts of a.** comm
3110: 61 6e 64 20 6e 61 6d 65 20 66 6f 6c 6c 6f 77 65  and name followe
3120: 64 20 62 79 20 7a 65 72 6f 20 6f 72 20 6d 6f 72  d by zero or mor
3130: 65 20 61 72 67 75 6d 65 6e 74 73 20 77 69 74 68  e arguments with
3140: 20 6e 6f 20 5b 2e 2e 2e 5d 20 6f 72 20 24 0a 2a   no [...] or $.*
3150: 2a 20 6f 72 20 7b 2e 2e 2e 7d 20 6f 72 20 3b 20  * or {...} or ; 
3160: 74 6f 20 62 65 20 73 65 65 6e 20 61 6e 79 77 68  to be seen anywh
3170: 65 72 65 2e 20 20 4d 6f 73 74 20 63 61 6c 6c 62  ere.  Most callb
3180: 61 63 6b 20 73 63 72 69 70 74 73 20 63 6f 6e 73  ack scripts cons
3190: 69 73 74 0a 2a 2a 20 6f 66 20 6a 75 73 74 20 61  ist.** of just a
31a0: 20 73 69 6e 67 6c 65 20 70 72 6f 63 65 64 75 72   single procedur
31b0: 65 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 79 20  e name and they 
31c0: 6d 65 65 74 20 74 68 69 73 20 72 65 71 75 69 72  meet this requir
31d0: 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ement..*/.static
31e0: 20 69 6e 74 20 73 61 66 65 54 6f 55 73 65 45 76   int safeToUseEv
31f0: 61 6c 4f 62 6a 76 28 54 63 6c 5f 49 6e 74 65 72  alObjv(Tcl_Inter
3200: 70 20 2a 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4f  p *interp, Tcl_O
3210: 62 6a 20 2a 70 43 6d 64 29 7b 0a 20 20 2f 2a 20  bj *pCmd){.  /* 
3220: 57 65 20 63 6f 75 6c 64 20 74 72 79 20 74 6f 20  We could try to 
3230: 64 6f 20 73 6f 6d 65 74 68 69 6e 67 20 77 69 74  do something wit
3240: 68 20 54 63 6c 5f 50 61 72 73 65 28 29 2e 20 20  h Tcl_Parse().  
3250: 42 75 74 20 77 65 20 77 69 6c 6c 20 69 6e 73 74  But we will inst
3260: 65 61 64 0a 20 20 2a 2a 20 6a 75 73 74 20 64 6f  ead.  ** just do
3270: 20 61 20 73 65 61 72 63 68 20 66 6f 72 20 66 6f   a search for fo
3280: 72 62 69 64 64 65 6e 20 63 68 61 72 61 63 74 65  rbidden characte
3290: 72 73 2e 20 20 49 66 20 61 6e 79 20 6f 66 20 74  rs.  If any of t
32a0: 68 65 20 66 6f 72 62 69 64 64 65 6e 0a 20 20 2a  he forbidden.  *
32b0: 2a 20 63 68 61 72 61 63 74 65 72 73 20 61 70 70  * characters app
32c0: 65 61 72 20 69 6e 20 70 43 6d 64 2c 20 77 65 20  ear in pCmd, we 
32d0: 77 69 6c 6c 20 72 65 70 6f 72 74 20 74 68 65 20  will report the 
32e0: 73 74 72 69 6e 67 20 61 73 20 75 6e 73 61 66 65  string as unsafe
32f0: 2e 0a 20 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ..  */.  const c
3300: 68 61 72 20 2a 7a 3b 0a 20 20 69 6e 74 20 6e 3b  har *z;.  int n;
3310: 0a 20 20 7a 20 3d 20 54 63 6c 5f 47 65 74 53 74  .  z = Tcl_GetSt
3320: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 70 43 6d 64  ringFromObj(pCmd
3330: 2c 20 26 6e 29 3b 0a 20 20 77 68 69 6c 65 28 20  , &n);.  while( 
3340: 6e 2d 2d 20 3e 20 30 20 29 7b 0a 20 20 20 20 69  n-- > 0 ){.    i
3350: 6e 74 20 63 20 3d 20 2a 28 7a 2b 2b 29 3b 0a 20  nt c = *(z++);. 
3360: 20 20 20 69 66 28 20 63 3d 3d 27 24 27 20 7c 7c     if( c=='$' ||
3370: 20 63 3d 3d 27 5b 27 20 7c 7c 20 63 3d 3d 27 3b   c=='[' || c==';
3380: 27 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ' ) return 0;.  
3390: 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  }.  return 1;.}.
33a0: 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61 6e 20 53  ./*.** Find an S
33b0: 71 6c 46 75 6e 63 20 73 74 72 75 63 74 75 72 65  qlFunc structure
33c0: 20 77 69 74 68 20 74 68 65 20 67 69 76 65 6e 20   with the given 
33d0: 6e 61 6d 65 2e 20 20 4f 72 20 63 72 65 61 74 65  name.  Or create
33e0: 20 61 20 6e 65 77 0a 2a 2a 20 6f 6e 65 20 69 66   a new.** one if
33f0: 20 61 6e 20 65 78 69 73 74 69 6e 67 20 6f 6e 65   an existing one
3400: 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64   cannot be found
3410: 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  .  Return a poin
3420: 74 65 72 20 74 6f 20 74 68 65 0a 2a 2a 20 73 74  ter to the.** st
3430: 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74  ructure..*/.stat
3440: 69 63 20 53 71 6c 46 75 6e 63 20 2a 66 69 6e 64  ic SqlFunc *find
3450: 53 71 6c 46 75 6e 63 28 53 71 6c 69 74 65 44 62  SqlFunc(SqliteDb
3460: 20 2a 70 44 62 2c 20 63 6f 6e 73 74 20 63 68 61   *pDb, const cha
3470: 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 53 71 6c  r *zName){.  Sql
3480: 46 75 6e 63 20 2a 70 2c 20 2a 70 4e 65 77 3b 0a  Func *p, *pNew;.
3490: 20 20 69 6e 74 20 69 3b 0a 20 20 70 4e 65 77 20    int i;.  pNew 
34a0: 3d 20 28 53 71 6c 46 75 6e 63 2a 29 54 63 6c 5f  = (SqlFunc*)Tcl_
34b0: 41 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70  Alloc( sizeof(*p
34c0: 4e 65 77 29 20 2b 20 73 74 72 6c 65 6e 33 30 28  New) + strlen30(
34d0: 7a 4e 61 6d 65 29 20 2b 20 31 20 29 3b 0a 20 20  zName) + 1 );.  
34e0: 70 4e 65 77 2d 3e 7a 4e 61 6d 65 20 3d 20 28 63  pNew->zName = (c
34f0: 68 61 72 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a 20  har*)&pNew[1];. 
3500: 20 66 6f 72 28 69 3d 30 3b 20 7a 4e 61 6d 65 5b   for(i=0; zName[
3510: 69 5d 3b 20 69 2b 2b 29 7b 20 70 4e 65 77 2d 3e  i]; i++){ pNew->
3520: 7a 4e 61 6d 65 5b 69 5d 20 3d 20 74 6f 6c 6f 77  zName[i] = tolow
3530: 65 72 28 7a 4e 61 6d 65 5b 69 5d 29 3b 20 7d 0a  er(zName[i]); }.
3540: 20 20 70 4e 65 77 2d 3e 7a 4e 61 6d 65 5b 69 5d    pNew->zName[i]
3550: 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 3d 70 44   = 0;.  for(p=pD
3560: 62 2d 3e 70 46 75 6e 63 3b 20 70 3b 20 70 3d 70  b->pFunc; p; p=p
3570: 2d 3e 70 4e 65 78 74 29 7b 20 0a 20 20 20 20 69  ->pNext){ .    i
3580: 66 28 20 73 74 72 63 6d 70 28 70 2d 3e 7a 4e 61  f( strcmp(p->zNa
3590: 6d 65 2c 20 70 4e 65 77 2d 3e 7a 4e 61 6d 65 29  me, pNew->zName)
35a0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  ==0 ){.      Tcl
35b0: 5f 46 72 65 65 28 28 63 68 61 72 2a 29 70 4e 65  _Free((char*)pNe
35c0: 77 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  w);.      return
35d0: 20 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   p;.    }.  }.  
35e0: 70 4e 65 77 2d 3e 69 6e 74 65 72 70 20 3d 20 70  pNew->interp = p
35f0: 44 62 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 70 4e  Db->interp;.  pN
3600: 65 77 2d 3e 70 53 63 72 69 70 74 20 3d 20 30 3b  ew->pScript = 0;
3610: 0a 20 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20 3d  .  pNew->pNext =
3620: 20 70 44 62 2d 3e 70 46 75 6e 63 3b 0a 20 20 70   pDb->pFunc;.  p
3630: 44 62 2d 3e 70 46 75 6e 63 20 3d 20 70 4e 65 77  Db->pFunc = pNew
3640: 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b  ;.  return pNew;
3650: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 61 6c 69  .}../*.** Finali
3660: 7a 65 20 61 6e 64 20 66 72 65 65 20 61 20 6c 69  ze and free a li
3670: 73 74 20 6f 66 20 70 72 65 70 61 72 65 64 20 73  st of prepared s
3680: 74 61 74 65 6d 65 6e 74 73 0a 2a 2f 0a 73 74 61  tatements.*/.sta
3690: 74 69 63 20 76 6f 69 64 20 66 6c 75 73 68 53 74  tic void flushSt
36a0: 6d 74 43 61 63 68 65 28 20 53 71 6c 69 74 65 44  mtCache( SqliteD
36b0: 62 20 2a 70 44 62 20 29 7b 0a 20 20 53 71 6c 50  b *pDb ){.  SqlP
36c0: 72 65 70 61 72 65 64 53 74 6d 74 20 2a 70 50 72  reparedStmt *pPr
36d0: 65 53 74 6d 74 3b 0a 0a 20 20 77 68 69 6c 65 28  eStmt;..  while(
36e0: 20 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74 20    pDb->stmtList 
36f0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
3700: 69 6e 61 6c 69 7a 65 28 20 70 44 62 2d 3e 73 74  inalize( pDb->st
3710: 6d 74 4c 69 73 74 2d 3e 70 53 74 6d 74 20 29 3b  mtList->pStmt );
3720: 0a 20 20 20 20 70 50 72 65 53 74 6d 74 20 3d 20  .    pPreStmt = 
3730: 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74 3b 0a 20  pDb->stmtList;. 
3740: 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74     pDb->stmtList
3750: 20 3d 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74   = pDb->stmtList
3760: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 54 63 6c  ->pNext;.    Tcl
3770: 5f 46 72 65 65 28 20 28 63 68 61 72 2a 29 70 50  _Free( (char*)pP
3780: 72 65 53 74 6d 74 20 29 3b 0a 20 20 7d 0a 20 20  reStmt );.  }.  
3790: 70 44 62 2d 3e 6e 53 74 6d 74 20 3d 20 30 3b 0a  pDb->nStmt = 0;.
37a0: 20 20 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74 20    pDb->stmtLast 
37b0: 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 43  = 0;.}../*.** TC
37c0: 4c 20 63 61 6c 6c 73 20 74 68 69 73 20 70 72 6f  L calls this pro
37d0: 63 65 64 75 72 65 20 77 68 65 6e 20 61 6e 20 73  cedure when an s
37e0: 71 6c 69 74 65 33 20 64 61 74 61 62 61 73 65 20  qlite3 database 
37f0: 63 6f 6d 6d 61 6e 64 20 69 73 0a 2a 2a 20 64 65  command is.** de
3800: 6c 65 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  leted..*/.static
3810: 20 76 6f 69 64 20 44 62 44 65 6c 65 74 65 43 6d   void DbDeleteCm
3820: 64 28 76 6f 69 64 20 2a 64 62 29 7b 0a 20 20 53  d(void *db){.  S
3830: 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28  qliteDb *pDb = (
3840: 53 71 6c 69 74 65 44 62 2a 29 64 62 3b 0a 20 20  SqliteDb*)db;.  
3850: 66 6c 75 73 68 53 74 6d 74 43 61 63 68 65 28 70  flushStmtCache(p
3860: 44 62 29 3b 0a 20 20 63 6c 6f 73 65 49 6e 63 72  Db);.  closeIncr
3870: 62 6c 6f 62 43 68 61 6e 6e 65 6c 73 28 70 44 62  blobChannels(pDb
3880: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f  );.  sqlite3_clo
3890: 73 65 28 70 44 62 2d 3e 64 62 29 3b 0a 20 20 77  se(pDb->db);.  w
38a0: 68 69 6c 65 28 20 70 44 62 2d 3e 70 46 75 6e 63  hile( pDb->pFunc
38b0: 20 29 7b 0a 20 20 20 20 53 71 6c 46 75 6e 63 20   ){.    SqlFunc 
38c0: 2a 70 46 75 6e 63 20 3d 20 70 44 62 2d 3e 70 46  *pFunc = pDb->pF
38d0: 75 6e 63 3b 0a 20 20 20 20 70 44 62 2d 3e 70 46  unc;.    pDb->pF
38e0: 75 6e 63 20 3d 20 70 46 75 6e 63 2d 3e 70 4e 65  unc = pFunc->pNe
38f0: 78 74 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72  xt;.    Tcl_Decr
3900: 52 65 66 43 6f 75 6e 74 28 70 46 75 6e 63 2d 3e  RefCount(pFunc->
3910: 70 53 63 72 69 70 74 29 3b 0a 20 20 20 20 54 63  pScript);.    Tc
3920: 6c 5f 46 72 65 65 28 28 63 68 61 72 2a 29 70 46  l_Free((char*)pF
3930: 75 6e 63 29 3b 0a 20 20 7d 0a 20 20 77 68 69 6c  unc);.  }.  whil
3940: 65 28 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65  e( pDb->pCollate
3950: 20 29 7b 0a 20 20 20 20 53 71 6c 43 6f 6c 6c 61   ){.    SqlColla
3960: 74 65 20 2a 70 43 6f 6c 6c 61 74 65 20 3d 20 70  te *pCollate = p
3970: 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 3b 0a 20 20  Db->pCollate;.  
3980: 20 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 20    pDb->pCollate 
3990: 3d 20 70 43 6f 6c 6c 61 74 65 2d 3e 70 4e 65 78  = pCollate->pNex
39a0: 74 3b 0a 20 20 20 20 54 63 6c 5f 46 72 65 65 28  t;.    Tcl_Free(
39b0: 28 63 68 61 72 2a 29 70 43 6f 6c 6c 61 74 65 29  (char*)pCollate)
39c0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 62 2d  ;.  }.  if( pDb-
39d0: 3e 7a 42 75 73 79 20 29 7b 0a 20 20 20 20 54 63  >zBusy ){.    Tc
39e0: 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 42 75 73  l_Free(pDb->zBus
39f0: 79 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44  y);.  }.  if( pD
3a00: 62 2d 3e 7a 54 72 61 63 65 20 29 7b 0a 20 20 20  b->zTrace ){.   
3a10: 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a   Tcl_Free(pDb->z
3a20: 54 72 61 63 65 29 3b 0a 20 20 7d 0a 20 20 69 66  Trace);.  }.  if
3a30: 28 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 20  ( pDb->zProfile 
3a40: 29 7b 0a 20 20 20 20 54 63 6c 5f 46 72 65 65 28  ){.    Tcl_Free(
3a50: 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 29 3b 0a  pDb->zProfile);.
3a60: 20 20 7d 0a 20 20 69 66 28 20 70 44 62 2d 3e 7a    }.  if( pDb->z
3a70: 41 75 74 68 20 29 7b 0a 20 20 20 20 54 63 6c 5f  Auth ){.    Tcl_
3a80: 46 72 65 65 28 70 44 62 2d 3e 7a 41 75 74 68 29  Free(pDb->zAuth)
3a90: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 62 2d  ;.  }.  if( pDb-
3aa0: 3e 7a 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 54 63  >zNull ){.    Tc
3ab0: 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 4e 75 6c  l_Free(pDb->zNul
3ac0: 6c 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44  l);.  }.  if( pD
3ad0: 62 2d 3e 70 55 70 64 61 74 65 48 6f 6f 6b 20 29  b->pUpdateHook )
3ae0: 7b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65  {.    Tcl_DecrRe
3af0: 66 43 6f 75 6e 74 28 70 44 62 2d 3e 70 55 70 64  fCount(pDb->pUpd
3b00: 61 74 65 48 6f 6f 6b 29 3b 0a 20 20 7d 0a 20 20  ateHook);.  }.  
3b10: 69 66 28 20 70 44 62 2d 3e 70 50 72 65 55 70 64  if( pDb->pPreUpd
3b20: 61 74 65 48 6f 6f 6b 20 29 7b 0a 20 20 20 20 54  ateHook ){.    T
3b30: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
3b40: 70 44 62 2d 3e 70 50 72 65 55 70 64 61 74 65 48  pDb->pPreUpdateH
3b50: 6f 6f 6b 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ook);.  }.  if( 
3b60: 70 44 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 48 6f  pDb->pRollbackHo
3b70: 6f 6b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 44 65  ok ){.    Tcl_De
3b80: 63 72 52 65 66 43 6f 75 6e 74 28 70 44 62 2d 3e  crRefCount(pDb->
3b90: 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 29 3b 0a  pRollbackHook);.
3ba0: 20 20 7d 0a 20 20 69 66 28 20 70 44 62 2d 3e 70    }.  if( pDb->p
3bb0: 57 61 6c 48 6f 6f 6b 20 29 7b 0a 20 20 20 20 54  WalHook ){.    T
3bc0: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
3bd0: 70 44 62 2d 3e 70 57 61 6c 48 6f 6f 6b 29 3b 0a  pDb->pWalHook);.
3be0: 20 20 7d 0a 20 20 69 66 28 20 70 44 62 2d 3e 70    }.  if( pDb->p
3bf0: 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64 20 29 7b  CollateNeeded ){
3c00: 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66  .    Tcl_DecrRef
3c10: 43 6f 75 6e 74 28 70 44 62 2d 3e 70 43 6f 6c 6c  Count(pDb->pColl
3c20: 61 74 65 4e 65 65 64 65 64 29 3b 0a 20 20 7d 0a  ateNeeded);.  }.
3c30: 20 20 54 63 6c 5f 46 72 65 65 28 28 63 68 61 72    Tcl_Free((char
3c40: 2a 29 70 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  *)pDb);.}../*.**
3c50: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
3c60: 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 64   called when a d
3c70: 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
3c80: 6c 6f 63 6b 65 64 20 77 68 69 6c 65 20 74 72 79  locked while try
3c90: 69 6e 67 0a 2a 2a 20 74 6f 20 65 78 65 63 75 74  ing.** to execut
3ca0: 65 20 53 51 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63  e SQL..*/.static
3cb0: 20 69 6e 74 20 44 62 42 75 73 79 48 61 6e 64 6c   int DbBusyHandl
3cc0: 65 72 28 76 6f 69 64 20 2a 63 64 2c 20 69 6e 74  er(void *cd, int
3cd0: 20 6e 54 72 69 65 73 29 7b 0a 20 20 53 71 6c 69   nTries){.  Sqli
3ce0: 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53 71 6c  teDb *pDb = (Sql
3cf0: 69 74 65 44 62 2a 29 63 64 3b 0a 20 20 69 6e 74  iteDb*)cd;.  int
3d00: 20 72 63 3b 0a 20 20 63 68 61 72 20 7a 56 61 6c   rc;.  char zVal
3d10: 5b 33 30 5d 3b 0a 0a 20 20 73 71 6c 69 74 65 33  [30];..  sqlite3
3d20: 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
3d30: 28 7a 56 61 6c 29 2c 20 7a 56 61 6c 2c 20 22 25  (zVal), zVal, "%
3d40: 64 22 2c 20 6e 54 72 69 65 73 29 3b 0a 20 20 72  d", nTries);.  r
3d50: 63 20 3d 20 54 63 6c 5f 56 61 72 45 76 61 6c 28  c = Tcl_VarEval(
3d60: 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20 70 44 62  pDb->interp, pDb
3d70: 2d 3e 7a 42 75 73 79 2c 20 22 20 22 2c 20 7a 56  ->zBusy, " ", zV
3d80: 61 6c 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20  al, (char*)0);. 
3d90: 20 69 66 28 20 72 63 21 3d 54 43 4c 5f 4f 4b 20   if( rc!=TCL_OK 
3da0: 7c 7c 20 61 74 6f 69 28 54 63 6c 5f 47 65 74 53  || atoi(Tcl_GetS
3db0: 74 72 69 6e 67 52 65 73 75 6c 74 28 70 44 62 2d  tringResult(pDb-
3dc0: 3e 69 6e 74 65 72 70 29 29 20 29 7b 0a 20 20 20  >interp)) ){.   
3dd0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
3de0: 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 23 69   return 1;.}..#i
3df0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
3e00: 54 5f 50 52 4f 47 52 45 53 53 5f 43 41 4c 4c 42  T_PROGRESS_CALLB
3e10: 41 43 4b 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  ACK./*.** This r
3e20: 6f 75 74 69 6e 65 20 69 73 20 69 6e 76 6f 6b 65  outine is invoke
3e30: 64 20 61 73 20 74 68 65 20 27 70 72 6f 67 72 65  d as the 'progre
3e40: 73 73 20 63 61 6c 6c 62 61 63 6b 27 20 66 6f 72  ss callback' for
3e50: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a   the database..*
3e60: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 44 62 50  /.static int DbP
3e70: 72 6f 67 72 65 73 73 48 61 6e 64 6c 65 72 28 76  rogressHandler(v
3e80: 6f 69 64 20 2a 63 64 29 7b 0a 20 20 53 71 6c 69  oid *cd){.  Sqli
3e90: 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53 71 6c  teDb *pDb = (Sql
3ea0: 69 74 65 44 62 2a 29 63 64 3b 0a 20 20 69 6e 74  iteDb*)cd;.  int
3eb0: 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
3ec0: 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 20 29  pDb->zProgress )
3ed0: 3b 0a 20 20 72 63 20 3d 20 54 63 6c 5f 45 76 61  ;.  rc = Tcl_Eva
3ee0: 6c 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20 70  l(pDb->interp, p
3ef0: 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 29 3b 0a  Db->zProgress);.
3f00: 20 20 69 66 28 20 72 63 21 3d 54 43 4c 5f 4f 4b    if( rc!=TCL_OK
3f10: 20 7c 7c 20 61 74 6f 69 28 54 63 6c 5f 47 65 74   || atoi(Tcl_Get
3f20: 53 74 72 69 6e 67 52 65 73 75 6c 74 28 70 44 62  StringResult(pDb
3f30: 2d 3e 69 6e 74 65 72 70 29 29 20 29 7b 0a 20 20  ->interp)) ){.  
3f40: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
3f50: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65    return 0;.}.#e
3f60: 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
3f70: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 0a  LITE_OMIT_TRACE.
3f80: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
3f90: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20  ne is called by 
3fa0: 74 68 65 20 53 51 4c 69 74 65 20 74 72 61 63 65  the SQLite trace
3fb0: 20 68 61 6e 64 6c 65 72 20 77 68 65 6e 65 76 65   handler wheneve
3fc0: 72 20 61 20 6e 65 77 0a 2a 2a 20 62 6c 6f 63 6b  r a new.** block
3fd0: 20 6f 66 20 53 51 4c 20 69 73 20 65 78 65 63 75   of SQL is execu
3fe0: 74 65 64 2e 20 20 54 68 65 20 54 43 4c 20 73 63  ted.  The TCL sc
3ff0: 72 69 70 74 20 69 6e 20 70 44 62 2d 3e 7a 54 72  ript in pDb->zTr
4000: 61 63 65 20 69 73 20 65 78 65 63 75 74 65 64 2e  ace is executed.
4010: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
4020: 44 62 54 72 61 63 65 48 61 6e 64 6c 65 72 28 76  DbTraceHandler(v
4030: 6f 69 64 20 2a 63 64 2c 20 63 6f 6e 73 74 20 63  oid *cd, const c
4040: 68 61 72 20 2a 7a 53 71 6c 29 7b 0a 20 20 53 71  har *zSql){.  Sq
4050: 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53  liteDb *pDb = (S
4060: 71 6c 69 74 65 44 62 2a 29 63 64 3b 0a 20 20 54  qliteDb*)cd;.  T
4070: 63 6c 5f 44 53 74 72 69 6e 67 20 73 74 72 3b 0a  cl_DString str;.
4080: 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e  .  Tcl_DStringIn
4090: 69 74 28 26 73 74 72 29 3b 0a 20 20 54 63 6c 5f  it(&str);.  Tcl_
40a0: 44 53 74 72 69 6e 67 41 70 70 65 6e 64 28 26 73  DStringAppend(&s
40b0: 74 72 2c 20 70 44 62 2d 3e 7a 54 72 61 63 65 2c  tr, pDb->zTrace,
40c0: 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72   -1);.  Tcl_DStr
40d0: 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ingAppendElement
40e0: 28 26 73 74 72 2c 20 7a 53 71 6c 29 3b 0a 20 20  (&str, zSql);.  
40f0: 54 63 6c 5f 45 76 61 6c 28 70 44 62 2d 3e 69 6e  Tcl_Eval(pDb->in
4100: 74 65 72 70 2c 20 54 63 6c 5f 44 53 74 72 69 6e  terp, Tcl_DStrin
4110: 67 56 61 6c 75 65 28 26 73 74 72 29 29 3b 0a 20  gValue(&str));. 
4120: 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65   Tcl_DStringFree
4130: 28 26 73 74 72 29 3b 0a 20 20 54 63 6c 5f 52 65  (&str);.  Tcl_Re
4140: 73 65 74 52 65 73 75 6c 74 28 70 44 62 2d 3e 69  setResult(pDb->i
4150: 6e 74 65 72 70 29 3b 0a 7d 0a 23 65 6e 64 69 66  nterp);.}.#endif
4160: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
4170: 5f 4f 4d 49 54 5f 54 52 41 43 45 0a 2f 2a 0a 2a  _OMIT_TRACE./*.*
4180: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
4190: 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20  s called by the 
41a0: 53 51 4c 69 74 65 20 70 72 6f 66 69 6c 65 20 68  SQLite profile h
41b0: 61 6e 64 6c 65 72 20 61 66 74 65 72 20 61 20 73  andler after a s
41c0: 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 53 51 4c 20  tatement.** SQL 
41d0: 68 61 73 20 65 78 65 63 75 74 65 64 2e 20 20 54  has executed.  T
41e0: 68 65 20 54 43 4c 20 73 63 72 69 70 74 20 69 6e  he TCL script in
41f0: 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 20 69   pDb->zProfile i
4200: 73 20 65 76 61 6c 75 61 74 65 64 2e 0a 2a 2f 0a  s evaluated..*/.
4210: 73 74 61 74 69 63 20 76 6f 69 64 20 44 62 50 72  static void DbPr
4220: 6f 66 69 6c 65 48 61 6e 64 6c 65 72 28 76 6f 69  ofileHandler(voi
4230: 64 20 2a 63 64 2c 20 63 6f 6e 73 74 20 63 68 61  d *cd, const cha
4240: 72 20 2a 7a 53 71 6c 2c 20 73 71 6c 69 74 65 5f  r *zSql, sqlite_
4250: 75 69 6e 74 36 34 20 74 6d 29 7b 0a 20 20 53 71  uint64 tm){.  Sq
4260: 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53  liteDb *pDb = (S
4270: 71 6c 69 74 65 44 62 2a 29 63 64 3b 0a 20 20 54  qliteDb*)cd;.  T
4280: 63 6c 5f 44 53 74 72 69 6e 67 20 73 74 72 3b 0a  cl_DString str;.
4290: 20 20 63 68 61 72 20 7a 54 6d 5b 31 30 30 5d 3b    char zTm[100];
42a0: 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72  ..  sqlite3_snpr
42b0: 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 54 6d 29  intf(sizeof(zTm)
42c0: 2d 31 2c 20 7a 54 6d 2c 20 22 25 6c 6c 64 22 2c  -1, zTm, "%lld",
42d0: 20 74 6d 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72   tm);.  Tcl_DStr
42e0: 69 6e 67 49 6e 69 74 28 26 73 74 72 29 3b 0a 20  ingInit(&str);. 
42f0: 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65   Tcl_DStringAppe
4300: 6e 64 28 26 73 74 72 2c 20 70 44 62 2d 3e 7a 50  nd(&str, pDb->zP
4310: 72 6f 66 69 6c 65 2c 20 2d 31 29 3b 0a 20 20 54  rofile, -1);.  T
4320: 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64  cl_DStringAppend
4330: 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c 20 7a 53  Element(&str, zS
4340: 71 6c 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69  ql);.  Tcl_DStri
4350: 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  ngAppendElement(
4360: 26 73 74 72 2c 20 7a 54 6d 29 3b 0a 20 20 54 63  &str, zTm);.  Tc
4370: 6c 5f 45 76 61 6c 28 70 44 62 2d 3e 69 6e 74 65  l_Eval(pDb->inte
4380: 72 70 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56  rp, Tcl_DStringV
4390: 61 6c 75 65 28 26 73 74 72 29 29 3b 0a 20 20 54  alue(&str));.  T
43a0: 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26  cl_DStringFree(&
43b0: 73 74 72 29 3b 0a 20 20 54 63 6c 5f 52 65 73 65  str);.  Tcl_Rese
43c0: 74 52 65 73 75 6c 74 28 70 44 62 2d 3e 69 6e 74  tResult(pDb->int
43d0: 65 72 70 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  erp);.}.#endif..
43e0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
43f0: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  ne is called whe
4400: 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  n a transaction 
4410: 69 73 20 63 6f 6d 6d 69 74 74 65 64 2e 20 20 54  is committed.  T
4420: 68 65 0a 2a 2a 20 54 43 4c 20 73 63 72 69 70 74  he.** TCL script
4430: 20 69 6e 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74   in pDb->zCommit
4440: 20 69 73 20 65 78 65 63 75 74 65 64 2e 20 20 49   is executed.  I
4450: 66 20 69 74 20 72 65 74 75 72 6e 73 20 6e 6f 6e  f it returns non
4460: 2d 7a 65 72 6f 20 6f 72 0a 2a 2a 20 69 66 20 69  -zero or.** if i
4470: 74 20 74 68 72 6f 77 73 20 61 6e 20 65 78 63 65  t throws an exce
4480: 70 74 69 6f 6e 2c 20 74 68 65 20 74 72 61 6e 73  ption, the trans
4490: 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64  action is rolled
44a0: 20 62 61 63 6b 20 69 6e 73 74 65 61 64 0a 2a 2a   back instead.**
44b0: 20 6f 66 20 62 65 69 6e 67 20 63 6f 6d 6d 69 74   of being commit
44c0: 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ted..*/.static i
44d0: 6e 74 20 44 62 43 6f 6d 6d 69 74 48 61 6e 64 6c  nt DbCommitHandl
44e0: 65 72 28 76 6f 69 64 20 2a 63 64 29 7b 0a 20 20  er(void *cd){.  
44f0: 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20  SqliteDb *pDb = 
4500: 28 53 71 6c 69 74 65 44 62 2a 29 63 64 3b 0a 20  (SqliteDb*)cd;. 
4510: 20 69 6e 74 20 72 63 3b 0a 0a 20 20 72 63 20 3d   int rc;..  rc =
4520: 20 54 63 6c 5f 45 76 61 6c 28 70 44 62 2d 3e 69   Tcl_Eval(pDb->i
4530: 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a 43 6f 6d  nterp, pDb->zCom
4540: 6d 69 74 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  mit);.  if( rc!=
4550: 54 43 4c 5f 4f 4b 20 7c 7c 20 61 74 6f 69 28 54  TCL_OK || atoi(T
4560: 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75  cl_GetStringResu
4570: 6c 74 28 70 44 62 2d 3e 69 6e 74 65 72 70 29 29  lt(pDb->interp))
4580: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31   ){.    return 1
4590: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
45a0: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  ;.}..static void
45b0: 20 44 62 52 6f 6c 6c 62 61 63 6b 48 61 6e 64 6c   DbRollbackHandl
45c0: 65 72 28 76 6f 69 64 20 2a 63 6c 69 65 6e 74 44  er(void *clientD
45d0: 61 74 61 29 7b 0a 20 20 53 71 6c 69 74 65 44 62  ata){.  SqliteDb
45e0: 20 2a 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44   *pDb = (SqliteD
45f0: 62 2a 29 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20  b*)clientData;. 
4600: 20 61 73 73 65 72 74 28 70 44 62 2d 3e 70 52 6f   assert(pDb->pRo
4610: 6c 6c 62 61 63 6b 48 6f 6f 6b 29 3b 0a 20 20 69  llbackHook);.  i
4620: 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 45  f( TCL_OK!=Tcl_E
4630: 76 61 6c 4f 62 6a 45 78 28 70 44 62 2d 3e 69 6e  valObjEx(pDb->in
4640: 74 65 72 70 2c 20 70 44 62 2d 3e 70 52 6f 6c 6c  terp, pDb->pRoll
4650: 62 61 63 6b 48 6f 6f 6b 2c 20 30 29 20 29 7b 0a  backHook, 0) ){.
4660: 20 20 20 20 54 63 6c 5f 42 61 63 6b 67 72 6f 75      Tcl_Backgrou
4670: 6e 64 45 72 72 6f 72 28 70 44 62 2d 3e 69 6e 74  ndError(pDb->int
4680: 65 72 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  erp);.  }.}../*.
4690: 2a 2a 20 54 68 69 73 20 70 72 6f 63 65 64 75 72  ** This procedur
46a0: 65 20 68 61 6e 64 6c 65 73 20 77 61 6c 5f 68 6f  e handles wal_ho
46b0: 6f 6b 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 2a 2f  ok callbacks..*/
46c0: 0a 73 74 61 74 69 63 20 69 6e 74 20 44 62 57 61  .static int DbWa
46d0: 6c 48 61 6e 64 6c 65 72 28 0a 20 20 76 6f 69 64  lHandler(.  void
46e0: 20 2a 63 6c 69 65 6e 74 44 61 74 61 2c 20 0a 20   *clientData, . 
46f0: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20   sqlite3 *db, . 
4700: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
4710: 2c 20 0a 20 20 69 6e 74 20 6e 45 6e 74 72 79 0a  , .  int nEntry.
4720: 29 7b 0a 20 20 69 6e 74 20 72 65 74 20 3d 20 53  ){.  int ret = S
4730: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 54 63 6c 5f  QLITE_OK;.  Tcl_
4740: 4f 62 6a 20 2a 70 3b 0a 20 20 53 71 6c 69 74 65  Obj *p;.  Sqlite
4750: 44 62 20 2a 70 44 62 20 3d 20 28 53 71 6c 69 74  Db *pDb = (Sqlit
4760: 65 44 62 2a 29 63 6c 69 65 6e 74 44 61 74 61 3b  eDb*)clientData;
4770: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
4780: 6e 74 65 72 70 20 3d 20 70 44 62 2d 3e 69 6e 74  nterp = pDb->int
4790: 65 72 70 3b 0a 20 20 61 73 73 65 72 74 28 70 44  erp;.  assert(pD
47a0: 62 2d 3e 70 57 61 6c 48 6f 6f 6b 29 3b 0a 0a 20  b->pWalHook);.. 
47b0: 20 70 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61   p = Tcl_Duplica
47c0: 74 65 4f 62 6a 28 70 44 62 2d 3e 70 57 61 6c 48  teObj(pDb->pWalH
47d0: 6f 6f 6b 29 3b 0a 20 20 54 63 6c 5f 49 6e 63 72  ook);.  Tcl_Incr
47e0: 52 65 66 43 6f 75 6e 74 28 70 29 3b 0a 20 20 54  RefCount(p);.  T
47f0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
4800: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
4810: 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  p, Tcl_NewString
4820: 4f 62 6a 28 7a 44 62 2c 20 2d 31 29 29 3b 0a 20  Obj(zDb, -1));. 
4830: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
4840: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
4850: 2c 20 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f  , p, Tcl_NewIntO
4860: 62 6a 28 6e 45 6e 74 72 79 29 29 3b 0a 20 20 69  bj(nEntry));.  i
4870: 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 45  f( TCL_OK!=Tcl_E
4880: 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c  valObjEx(interp,
4890: 20 70 2c 20 30 29 20 0a 20 20 20 7c 7c 20 54 43   p, 0) .   || TC
48a0: 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 49 6e 74  L_OK!=Tcl_GetInt
48b0: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
48c0: 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_GetObjResult
48d0: 28 69 6e 74 65 72 70 29 2c 20 26 72 65 74 29 0a  (interp), &ret).
48e0: 20 20 29 7b 0a 20 20 20 20 54 63 6c 5f 42 61 63    ){.    Tcl_Bac
48f0: 6b 67 72 6f 75 6e 64 45 72 72 6f 72 28 69 6e 74  kgroundError(int
4900: 65 72 70 29 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f  erp);.  }.  Tcl_
4910: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 29 3b  DecrRefCount(p);
4920: 0a 0a 20 20 72 65 74 75 72 6e 20 72 65 74 3b 0a  ..  return ret;.
4930: 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  }..#if defined(S
4940: 51 4c 49 54 45 5f 54 45 53 54 29 20 26 26 20 64  QLITE_TEST) && d
4950: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
4960: 41 42 4c 45 5f 55 4e 4c 4f 43 4b 5f 4e 4f 54 49  ABLE_UNLOCK_NOTI
4970: 46 59 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20  FY).static void 
4980: 73 65 74 54 65 73 74 55 6e 6c 6f 63 6b 4e 6f 74  setTestUnlockNot
4990: 69 66 79 56 61 72 73 28 54 63 6c 5f 49 6e 74 65  ifyVars(Tcl_Inte
49a0: 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20  rp *interp, int 
49b0: 69 41 72 67 2c 20 69 6e 74 20 6e 41 72 67 29 7b  iArg, int nArg){
49c0: 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 36 34 5d  .  char zBuf[64]
49d0: 3b 0a 20 20 73 70 72 69 6e 74 66 28 7a 42 75 66  ;.  sprintf(zBuf
49e0: 2c 20 22 25 64 22 2c 20 69 41 72 67 29 3b 0a 20  , "%d", iArg);. 
49f0: 20 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65   Tcl_SetVar(inte
4a00: 72 70 2c 20 22 73 71 6c 69 74 65 5f 75 6e 6c 6f  rp, "sqlite_unlo
4a10: 63 6b 5f 6e 6f 74 69 66 79 5f 61 72 67 22 2c 20  ck_notify_arg", 
4a20: 7a 42 75 66 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c  zBuf, TCL_GLOBAL
4a30: 5f 4f 4e 4c 59 29 3b 0a 20 20 73 70 72 69 6e 74  _ONLY);.  sprint
4a40: 66 28 7a 42 75 66 2c 20 22 25 64 22 2c 20 6e 41  f(zBuf, "%d", nA
4a50: 72 67 29 3b 0a 20 20 54 63 6c 5f 53 65 74 56 61  rg);.  Tcl_SetVa
4a60: 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74  r(interp, "sqlit
4a70: 65 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79 5f  e_unlock_notify_
4a80: 61 72 67 63 6f 75 6e 74 22 2c 20 7a 42 75 66 2c  argcount", zBuf,
4a90: 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59   TCL_GLOBAL_ONLY
4aa0: 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66  );.}.#else.# def
4ab0: 69 6e 65 20 73 65 74 54 65 73 74 55 6e 6c 6f 63  ine setTestUnloc
4ac0: 6b 4e 6f 74 69 66 79 56 61 72 73 28 78 2c 79 2c  kNotifyVars(x,y,
4ad0: 7a 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65  z).#endif..#ifde
4ae0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
4af0: 55 4e 4c 4f 43 4b 5f 4e 4f 54 49 46 59 0a 73 74  UNLOCK_NOTIFY.st
4b00: 61 74 69 63 20 76 6f 69 64 20 44 62 55 6e 6c 6f  atic void DbUnlo
4b10: 63 6b 4e 6f 74 69 66 79 28 76 6f 69 64 20 2a 2a  ckNotify(void **
4b20: 61 70 41 72 67 2c 20 69 6e 74 20 6e 41 72 67 29  apArg, int nArg)
4b30: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  {.  int i;.  for
4b40: 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b  (i=0; i<nArg; i+
4b50: 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e  +){.    const in
4b60: 74 20 66 6c 61 67 73 20 3d 20 28 54 43 4c 5f 45  t flags = (TCL_E
4b70: 56 41 4c 5f 47 4c 4f 42 41 4c 7c 54 43 4c 5f 45  VAL_GLOBAL|TCL_E
4b80: 56 41 4c 5f 44 49 52 45 43 54 29 3b 0a 20 20 20  VAL_DIRECT);.   
4b90: 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d   SqliteDb *pDb =
4ba0: 20 28 53 71 6c 69 74 65 44 62 20 2a 29 61 70 41   (SqliteDb *)apA
4bb0: 72 67 5b 69 5d 3b 0a 20 20 20 20 73 65 74 54 65  rg[i];.    setTe
4bc0: 73 74 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 56 61  stUnlockNotifyVa
4bd0: 72 73 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20  rs(pDb->interp, 
4be0: 69 2c 20 6e 41 72 67 29 3b 0a 20 20 20 20 61 73  i, nArg);.    as
4bf0: 73 65 72 74 28 20 70 44 62 2d 3e 70 55 6e 6c 6f  sert( pDb->pUnlo
4c00: 63 6b 4e 6f 74 69 66 79 29 3b 0a 20 20 20 20 54  ckNotify);.    T
4c10: 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70 44 62  cl_EvalObjEx(pDb
4c20: 2d 3e 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 70  ->interp, pDb->p
4c30: 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 2c 20 66 6c  UnlockNotify, fl
4c40: 61 67 73 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65  ags);.    Tcl_De
4c50: 63 72 52 65 66 43 6f 75 6e 74 28 70 44 62 2d 3e  crRefCount(pDb->
4c60: 70 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 29 3b 0a  pUnlockNotify);.
4c70: 20 20 20 20 70 44 62 2d 3e 70 55 6e 6c 6f 63 6b      pDb->pUnlock
4c80: 4e 6f 74 69 66 79 20 3d 20 30 3b 0a 20 20 7d 0a  Notify = 0;.  }.
4c90: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
4ca0: 50 72 65 2d 75 70 64 61 74 65 20 68 6f 6f 6b 20  Pre-update hook 
4cb0: 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61  callback..*/.sta
4cc0: 74 69 63 20 76 6f 69 64 20 44 62 50 72 65 55 70  tic void DbPreUp
4cd0: 64 61 74 65 48 61 6e 64 6c 65 72 28 0a 20 20 76  dateHandler(.  v
4ce0: 6f 69 64 20 2a 70 2c 20 0a 20 20 73 71 6c 69 74  oid *p, .  sqlit
4cf0: 65 33 20 2a 64 62 2c 0a 20 20 69 6e 74 20 6f 70  e3 *db,.  int op
4d00: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
4d10: 7a 44 62 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68  zDb, .  const ch
4d20: 61 72 20 2a 7a 54 62 6c 2c 20 0a 20 20 73 71 6c  ar *zTbl, .  sql
4d30: 69 74 65 5f 69 6e 74 36 34 20 69 4b 65 79 31 2c  ite_int64 iKey1,
4d40: 0a 20 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20  .  sqlite_int64 
4d50: 69 4b 65 79 32 0a 29 7b 0a 20 20 53 71 6c 69 74  iKey2.){.  Sqlit
4d60: 65 44 62 20 2a 70 44 62 20 3d 20 28 53 71 6c 69  eDb *pDb = (Sqli
4d70: 74 65 44 62 20 2a 29 70 3b 0a 20 20 54 63 6c 5f  teDb *)p;.  Tcl_
4d80: 4f 62 6a 20 2a 70 43 6d 64 3b 0a 20 20 73 74 61  Obj *pCmd;.  sta
4d90: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
4da0: 61 7a 53 74 72 5b 5d 20 3d 20 7b 22 44 45 4c 45  azStr[] = {"DELE
4db0: 54 45 22 2c 20 22 49 4e 53 45 52 54 22 2c 20 22  TE", "INSERT", "
4dc0: 55 50 44 41 54 45 22 7d 3b 0a 0a 20 20 61 73 73  UPDATE"};..  ass
4dd0: 65 72 74 28 20 28 53 51 4c 49 54 45 5f 44 45 4c  ert( (SQLITE_DEL
4de0: 45 54 45 2d 31 29 2f 39 20 3d 3d 20 30 20 29 3b  ETE-1)/9 == 0 );
4df0: 0a 20 20 61 73 73 65 72 74 28 20 28 53 51 4c 49  .  assert( (SQLI
4e00: 54 45 5f 49 4e 53 45 52 54 2d 31 29 2f 39 20 3d  TE_INSERT-1)/9 =
4e10: 3d 20 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  = 1 );.  assert(
4e20: 20 28 53 51 4c 49 54 45 5f 55 50 44 41 54 45 2d   (SQLITE_UPDATE-
4e30: 31 29 2f 39 20 3d 3d 20 32 20 29 3b 0a 20 20 61  1)/9 == 2 );.  a
4e40: 73 73 65 72 74 28 20 70 44 62 2d 3e 70 50 72 65  ssert( pDb->pPre
4e50: 55 70 64 61 74 65 48 6f 6f 6b 20 29 3b 0a 20 20  UpdateHook );.  
4e60: 61 73 73 65 72 74 28 20 64 62 3d 3d 70 44 62 2d  assert( db==pDb-
4e70: 3e 64 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28  >db );.  assert(
4e80: 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 49 4e 53 45   op==SQLITE_INSE
4e90: 52 54 20 7c 7c 20 6f 70 3d 3d 53 51 4c 49 54 45  RT || op==SQLITE
4ea0: 5f 55 50 44 41 54 45 20 7c 7c 20 6f 70 3d 3d 53  _UPDATE || op==S
4eb0: 51 4c 49 54 45 5f 44 45 4c 45 54 45 20 29 3b 0a  QLITE_DELETE );.
4ec0: 0a 20 20 70 43 6d 64 20 3d 20 54 63 6c 5f 44 75  .  pCmd = Tcl_Du
4ed0: 70 6c 69 63 61 74 65 4f 62 6a 28 70 44 62 2d 3e  plicateObj(pDb->
4ee0: 70 50 72 65 55 70 64 61 74 65 48 6f 6f 6b 29 3b  pPreUpdateHook);
4ef0: 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f  .  Tcl_IncrRefCo
4f00: 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20 54 63 6c  unt(pCmd);.  Tcl
4f10: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
4f20: 65 6d 65 6e 74 28 30 2c 20 70 43 6d 64 2c 20 54  ement(0, pCmd, T
4f30: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
4f40: 61 7a 53 74 72 5b 28 6f 70 2d 31 29 2f 39 5d 2c  azStr[(op-1)/9],
4f50: 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73   -1));.  Tcl_Lis
4f60: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
4f70: 74 28 30 2c 20 70 43 6d 64 2c 20 54 63 6c 5f 4e  t(0, pCmd, Tcl_N
4f80: 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 44 62 2c  ewStringObj(zDb,
4f90: 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73   -1));.  Tcl_Lis
4fa0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
4fb0: 74 28 30 2c 20 70 43 6d 64 2c 20 54 63 6c 5f 4e  t(0, pCmd, Tcl_N
4fc0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 54 62 6c  ewStringObj(zTbl
4fd0: 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69  , -1));.  Tcl_Li
4fe0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
4ff0: 6e 74 28 30 2c 20 70 43 6d 64 2c 20 54 63 6c 5f  nt(0, pCmd, Tcl_
5000: 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 69 4b  NewWideIntObj(iK
5010: 65 79 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73  ey1));.  Tcl_Lis
5020: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
5030: 74 28 30 2c 20 70 43 6d 64 2c 20 54 63 6c 5f 4e  t(0, pCmd, Tcl_N
5040: 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 69 4b 65  ewWideIntObj(iKe
5050: 79 32 29 29 3b 0a 20 20 54 63 6c 5f 45 76 61 6c  y2));.  Tcl_Eval
5060: 4f 62 6a 45 78 28 70 44 62 2d 3e 69 6e 74 65 72  ObjEx(pDb->inter
5070: 70 2c 20 70 43 6d 64 2c 20 54 43 4c 5f 45 56 41  p, pCmd, TCL_EVA
5080: 4c 5f 44 49 52 45 43 54 29 3b 0a 20 20 54 63 6c  L_DIRECT);.  Tcl
5090: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 43  _DecrRefCount(pC
50a0: 6d 64 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76  md);.}..static v
50b0: 6f 69 64 20 44 62 55 70 64 61 74 65 48 61 6e 64  oid DbUpdateHand
50c0: 6c 65 72 28 0a 20 20 76 6f 69 64 20 2a 70 2c 20  ler(.  void *p, 
50d0: 0a 20 20 69 6e 74 20 6f 70 2c 0a 20 20 63 6f 6e  .  int op,.  con
50e0: 73 74 20 63 68 61 72 20 2a 7a 44 62 2c 20 0a 20  st char *zDb, . 
50f0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 62   const char *zTb
5100: 6c 2c 20 0a 20 20 73 71 6c 69 74 65 5f 69 6e 74  l, .  sqlite_int
5110: 36 34 20 72 6f 77 69 64 0a 29 7b 0a 20 20 53 71  64 rowid.){.  Sq
5120: 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53  liteDb *pDb = (S
5130: 71 6c 69 74 65 44 62 20 2a 29 70 3b 0a 20 20 54  qliteDb *)p;.  T
5140: 63 6c 5f 4f 62 6a 20 2a 70 43 6d 64 3b 0a 20 20  cl_Obj *pCmd;.  
5150: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
5160: 72 20 2a 61 7a 53 74 72 5b 5d 20 3d 20 7b 22 44  r *azStr[] = {"D
5170: 45 4c 45 54 45 22 2c 20 22 49 4e 53 45 52 54 22  ELETE", "INSERT"
5180: 2c 20 22 55 50 44 41 54 45 22 7d 3b 0a 0a 20 20  , "UPDATE"};..  
5190: 61 73 73 65 72 74 28 20 28 53 51 4c 49 54 45 5f  assert( (SQLITE_
51a0: 44 45 4c 45 54 45 2d 31 29 2f 39 20 3d 3d 20 30  DELETE-1)/9 == 0
51b0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 53   );.  assert( (S
51c0: 51 4c 49 54 45 5f 49 4e 53 45 52 54 2d 31 29 2f  QLITE_INSERT-1)/
51d0: 39 20 3d 3d 20 31 20 29 3b 0a 20 20 61 73 73 65  9 == 1 );.  asse
51e0: 72 74 28 20 28 53 51 4c 49 54 45 5f 55 50 44 41  rt( (SQLITE_UPDA
51f0: 54 45 2d 31 29 2f 39 20 3d 3d 20 32 20 29 3b 0a  TE-1)/9 == 2 );.
5200: 0a 20 20 61 73 73 65 72 74 28 20 70 44 62 2d 3e  .  assert( pDb->
5210: 70 55 70 64 61 74 65 48 6f 6f 6b 20 29 3b 0a 20  pUpdateHook );. 
5220: 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 53 51 4c   assert( op==SQL
5230: 49 54 45 5f 49 4e 53 45 52 54 20 7c 7c 20 6f 70  ITE_INSERT || op
5240: 3d 3d 53 51 4c 49 54 45 5f 55 50 44 41 54 45 20  ==SQLITE_UPDATE 
5250: 7c 7c 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 44 45  || op==SQLITE_DE
5260: 4c 45 54 45 20 29 3b 0a 0a 20 20 70 43 6d 64 20  LETE );..  pCmd 
5270: 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f  = Tcl_DuplicateO
5280: 62 6a 28 70 44 62 2d 3e 70 55 70 64 61 74 65 48  bj(pDb->pUpdateH
5290: 6f 6f 6b 29 3b 0a 20 20 54 63 6c 5f 49 6e 63 72  ook);.  Tcl_Incr
52a0: 52 65 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a  RefCount(pCmd);.
52b0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
52c0: 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 43  endElement(0, pC
52d0: 6d 64 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  md, Tcl_NewStrin
52e0: 67 4f 62 6a 28 61 7a 53 74 72 5b 28 6f 70 2d 31  gObj(azStr[(op-1
52f0: 29 2f 39 5d 2c 20 2d 31 29 29 3b 0a 20 20 54 63  )/9], -1));.  Tc
5300: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
5310: 6c 65 6d 65 6e 74 28 30 2c 20 70 43 6d 64 2c 20  lement(0, pCmd, 
5320: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
5330: 28 7a 44 62 2c 20 2d 31 29 29 3b 0a 20 20 54 63  (zDb, -1));.  Tc
5340: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
5350: 6c 65 6d 65 6e 74 28 30 2c 20 70 43 6d 64 2c 20  lement(0, pCmd, 
5360: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
5370: 28 7a 54 62 6c 2c 20 2d 31 29 29 3b 0a 20 20 54  (zTbl, -1));.  T
5380: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
5390: 45 6c 65 6d 65 6e 74 28 30 2c 20 70 43 6d 64 2c  Element(0, pCmd,
53a0: 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f   Tcl_NewWideIntO
53b0: 62 6a 28 72 6f 77 69 64 29 29 3b 0a 20 20 54 63  bj(rowid));.  Tc
53c0: 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70 44 62 2d  l_EvalObjEx(pDb-
53d0: 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c 20 54  >interp, pCmd, T
53e0: 43 4c 5f 45 56 41 4c 5f 44 49 52 45 43 54 29 3b  CL_EVAL_DIRECT);
53f0: 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f  .  Tcl_DecrRefCo
5400: 75 6e 74 28 70 43 6d 64 29 3b 0a 7d 0a 0a 73 74  unt(pCmd);.}..st
5410: 61 74 69 63 20 76 6f 69 64 20 74 63 6c 43 6f 6c  atic void tclCol
5420: 6c 61 74 65 4e 65 65 64 65 64 28 0a 20 20 76 6f  lateNeeded(.  vo
5430: 69 64 20 2a 70 43 74 78 2c 0a 20 20 73 71 6c 69  id *pCtx,.  sqli
5440: 74 65 33 20 2a 64 62 2c 0a 20 20 69 6e 74 20 65  te3 *db,.  int e
5450: 6e 63 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  nc,.  const char
5460: 20 2a 7a 4e 61 6d 65 0a 29 7b 0a 20 20 53 71 6c   *zName.){.  Sql
5470: 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53 71  iteDb *pDb = (Sq
5480: 6c 69 74 65 44 62 20 2a 29 70 43 74 78 3b 0a 20  liteDb *)pCtx;. 
5490: 20 54 63 6c 5f 4f 62 6a 20 2a 70 53 63 72 69 70   Tcl_Obj *pScrip
54a0: 74 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74  t = Tcl_Duplicat
54b0: 65 4f 62 6a 28 70 44 62 2d 3e 70 43 6f 6c 6c 61  eObj(pDb->pColla
54c0: 74 65 4e 65 65 64 65 64 29 3b 0a 20 20 54 63 6c  teNeeded);.  Tcl
54d0: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 53  _IncrRefCount(pS
54e0: 63 72 69 70 74 29 3b 0a 20 20 54 63 6c 5f 4c 69  cript);.  Tcl_Li
54f0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
5500: 6e 74 28 30 2c 20 70 53 63 72 69 70 74 2c 20 54  nt(0, pScript, T
5510: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
5520: 7a 4e 61 6d 65 2c 20 2d 31 29 29 3b 0a 20 20 54  zName, -1));.  T
5530: 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70 44 62  cl_EvalObjEx(pDb
5540: 2d 3e 69 6e 74 65 72 70 2c 20 70 53 63 72 69 70  ->interp, pScrip
5550: 74 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 44 65 63  t, 0);.  Tcl_Dec
5560: 72 52 65 66 43 6f 75 6e 74 28 70 53 63 72 69 70  rRefCount(pScrip
5570: 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  t);.}../*.** Thi
5580: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
5590: 6c 65 64 20 74 6f 20 65 76 61 6c 75 61 74 65 20  led to evaluate 
55a0: 61 6e 20 53 51 4c 20 63 6f 6c 6c 61 74 69 6f 6e  an SQL collation
55b0: 20 66 75 6e 63 74 69 6f 6e 20 69 6d 70 6c 65 6d   function implem
55c0: 65 6e 74 65 64 0a 2a 2a 20 75 73 69 6e 67 20 54  ented.** using T
55d0: 43 4c 20 73 63 72 69 70 74 2e 0a 2a 2f 0a 73 74  CL script..*/.st
55e0: 61 74 69 63 20 69 6e 74 20 74 63 6c 53 71 6c 43  atic int tclSqlC
55f0: 6f 6c 6c 61 74 65 28 0a 20 20 76 6f 69 64 20 2a  ollate(.  void *
5600: 70 43 74 78 2c 0a 20 20 69 6e 74 20 6e 41 2c 0a  pCtx,.  int nA,.
5610: 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 41    const void *zA
5620: 2c 0a 20 20 69 6e 74 20 6e 42 2c 0a 20 20 63 6f  ,.  int nB,.  co
5630: 6e 73 74 20 76 6f 69 64 20 2a 7a 42 0a 29 7b 0a  nst void *zB.){.
5640: 20 20 53 71 6c 43 6f 6c 6c 61 74 65 20 2a 70 20    SqlCollate *p 
5650: 3d 20 28 53 71 6c 43 6f 6c 6c 61 74 65 20 2a 29  = (SqlCollate *)
5660: 70 43 74 78 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20  pCtx;.  Tcl_Obj 
5670: 2a 70 43 6d 64 3b 0a 0a 20 20 70 43 6d 64 20 3d  *pCmd;..  pCmd =
5680: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
5690: 6a 28 70 2d 3e 7a 53 63 72 69 70 74 2c 20 2d 31  j(p->zScript, -1
56a0: 29 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65 66  );.  Tcl_IncrRef
56b0: 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20 54  Count(pCmd);.  T
56c0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
56d0: 45 6c 65 6d 65 6e 74 28 70 2d 3e 69 6e 74 65 72  Element(p->inter
56e0: 70 2c 20 70 43 6d 64 2c 20 54 63 6c 5f 4e 65 77  p, pCmd, Tcl_New
56f0: 53 74 72 69 6e 67 4f 62 6a 28 7a 41 2c 20 6e 41  StringObj(zA, nA
5700: 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ));.  Tcl_ListOb
5710: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 70  jAppendElement(p
5720: 2d 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c 20  ->interp, pCmd, 
5730: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
5740: 28 7a 42 2c 20 6e 42 29 29 3b 0a 20 20 54 63 6c  (zB, nB));.  Tcl
5750: 5f 45 76 61 6c 4f 62 6a 45 78 28 70 2d 3e 69 6e  _EvalObjEx(p->in
5760: 74 65 72 70 2c 20 70 43 6d 64 2c 20 54 43 4c 5f  terp, pCmd, TCL_
5770: 45 56 41 4c 5f 44 49 52 45 43 54 29 3b 0a 20 20  EVAL_DIRECT);.  
5780: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
5790: 28 70 43 6d 64 29 3b 0a 20 20 72 65 74 75 72 6e  (pCmd);.  return
57a0: 20 28 61 74 6f 69 28 54 63 6c 5f 47 65 74 53 74   (atoi(Tcl_GetSt
57b0: 72 69 6e 67 52 65 73 75 6c 74 28 70 2d 3e 69 6e  ringResult(p->in
57c0: 74 65 72 70 29 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  terp)));.}../*.*
57d0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
57e0: 73 20 63 61 6c 6c 65 64 20 74 6f 20 65 76 61 6c  s called to eval
57f0: 75 61 74 65 20 61 6e 20 53 51 4c 20 66 75 6e 63  uate an SQL func
5800: 74 69 6f 6e 20 69 6d 70 6c 65 6d 65 6e 74 65 64  tion implemented
5810: 0a 2a 2a 20 75 73 69 6e 67 20 54 43 4c 20 73 63  .** using TCL sc
5820: 72 69 70 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ript..*/.static 
5830: 76 6f 69 64 20 74 63 6c 53 71 6c 46 75 6e 63 28  void tclSqlFunc(
5840: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
5850: 2a 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72  *context, int ar
5860: 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  gc, sqlite3_valu
5870: 65 2a 2a 61 72 67 76 29 7b 0a 20 20 53 71 6c 46  e**argv){.  SqlF
5880: 75 6e 63 20 2a 70 20 3d 20 73 71 6c 69 74 65 33  unc *p = sqlite3
5890: 5f 75 73 65 72 5f 64 61 74 61 28 63 6f 6e 74 65  _user_data(conte
58a0: 78 74 29 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  xt);.  Tcl_Obj *
58b0: 70 43 6d 64 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  pCmd;.  int i;. 
58c0: 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20   int rc;..  if( 
58d0: 61 72 67 63 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  argc==0 ){.    /
58e0: 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6e  * If there are n
58f0: 6f 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 74  o arguments to t
5900: 68 65 20 66 75 6e 63 74 69 6f 6e 2c 20 63 61 6c  he function, cal
5910: 6c 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 20  l Tcl_EvalObjEx 
5920: 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 73 63  on the.    ** sc
5930: 72 69 70 74 20 6f 62 6a 65 63 74 20 64 69 72 65  ript object dire
5940: 63 74 6c 79 2e 20 20 54 68 69 73 20 61 6c 6c 6f  ctly.  This allo
5950: 77 73 20 74 68 65 20 54 43 4c 20 63 6f 6d 70 69  ws the TCL compi
5960: 6c 65 72 20 74 6f 20 67 65 6e 65 72 61 74 65 0a  ler to generate.
5970: 20 20 20 20 2a 2a 20 62 79 74 65 63 6f 64 65 20      ** bytecode 
5980: 66 6f 72 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20  for the command 
5990: 6f 6e 20 74 68 65 20 66 69 72 73 74 20 69 6e 76  on the first inv
59a0: 6f 63 61 74 69 6f 6e 20 61 6e 64 20 74 68 75 73  ocation and thus
59b0: 20 6d 61 6b 65 0a 20 20 20 20 2a 2a 20 73 75 62   make.    ** sub
59c0: 73 65 71 75 65 6e 74 20 69 6e 76 6f 63 61 74 69  sequent invocati
59d0: 6f 6e 73 20 6d 75 63 68 20 66 61 73 74 65 72 2e  ons much faster.
59e0: 20 2a 2f 0a 20 20 20 20 70 43 6d 64 20 3d 20 70   */.    pCmd = p
59f0: 2d 3e 70 53 63 72 69 70 74 3b 0a 20 20 20 20 54  ->pScript;.    T
5a00: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
5a10: 70 43 6d 64 29 3b 0a 20 20 20 20 72 63 20 3d 20  pCmd);.    rc = 
5a20: 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70 2d  Tcl_EvalObjEx(p-
5a30: 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c 20 30  >interp, pCmd, 0
5a40: 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52  );.    Tcl_DecrR
5a50: 65 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20  efCount(pCmd);. 
5a60: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49   }else{.    /* I
5a70: 66 20 74 68 65 72 65 20 61 72 65 20 61 72 67 75  f there are argu
5a80: 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 66 75 6e  ments to the fun
5a90: 63 74 69 6f 6e 2c 20 6d 61 6b 65 20 61 20 73 68  ction, make a sh
5aa0: 61 6c 6c 6f 77 20 63 6f 70 79 20 6f 66 20 74 68  allow copy of th
5ab0: 65 0a 20 20 20 20 2a 2a 20 73 63 72 69 70 74 20  e.    ** script 
5ac0: 6f 62 6a 65 63 74 2c 20 6c 61 70 70 65 6e 64 20  object, lappend 
5ad0: 74 68 65 20 61 72 67 75 6d 65 6e 74 73 2c 20 74  the arguments, t
5ae0: 68 65 6e 20 65 76 61 6c 75 61 74 65 20 74 68 65  hen evaluate the
5af0: 20 63 6f 70 79 2e 0a 20 20 20 20 2a 2a 0a 20 20   copy..    **.  
5b00: 20 20 2a 2a 20 42 79 20 22 73 68 61 6c 6c 6f 77    ** By "shallow
5b10: 22 20 63 6f 70 79 2c 20 77 65 20 6d 65 61 6e 20  " copy, we mean 
5b20: 61 20 6f 6e 6c 79 20 74 68 65 20 6f 75 74 65 72  a only the outer
5b30: 20 6c 69 73 74 20 54 63 6c 5f 4f 62 6a 20 69 73   list Tcl_Obj is
5b40: 20 64 75 70 6c 69 63 61 74 65 64 2e 0a 20 20 20   duplicated..   
5b50: 20 2a 2a 20 54 68 65 20 6e 65 77 20 54 63 6c 5f   ** The new Tcl_
5b60: 4f 62 6a 20 63 6f 6e 74 61 69 6e 73 20 70 6f 69  Obj contains poi
5b70: 6e 74 65 72 73 20 74 6f 20 74 68 65 20 6f 72 69  nters to the ori
5b80: 67 69 6e 61 6c 20 6c 69 73 74 20 65 6c 65 6d 65  ginal list eleme
5b90: 6e 74 73 2e 20 0a 20 20 20 20 2a 2a 20 54 68 61  nts. .    ** Tha
5ba0: 74 20 77 61 79 2c 20 77 68 65 6e 20 54 63 6c 5f  t way, when Tcl_
5bb0: 45 76 61 6c 4f 62 6a 76 28 29 20 69 73 20 72 75  EvalObjv() is ru
5bc0: 6e 20 61 6e 64 20 73 68 69 6d 6d 65 72 73 20 74  n and shimmers t
5bd0: 68 65 20 66 69 72 73 74 20 65 6c 65 6d 65 6e 74  he first element
5be0: 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 6c  .    ** of the l
5bf0: 69 73 74 20 74 6f 20 74 63 6c 43 6d 64 4e 61 6d  ist to tclCmdNam
5c00: 65 54 79 70 65 2c 20 74 68 61 74 20 61 6c 74 65  eType, that alte
5c10: 72 6e 61 74 65 20 72 65 70 72 65 73 65 6e 74 61  rnate representa
5c20: 74 69 6f 6e 20 77 69 6c 6c 0a 20 20 20 20 2a 2a  tion will.    **
5c30: 20 62 65 20 70 72 65 73 65 72 76 65 64 20 61 6e   be preserved an
5c40: 64 20 72 65 75 73 65 64 20 6f 6e 20 74 68 65 20  d reused on the 
5c50: 6e 65 78 74 20 69 6e 76 6f 63 61 74 69 6f 6e 2e  next invocation.
5c60: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 54 63 6c 5f  .    */.    Tcl_
5c70: 4f 62 6a 20 2a 2a 61 41 72 67 3b 0a 20 20 20 20  Obj **aArg;.    
5c80: 69 6e 74 20 6e 41 72 67 3b 0a 20 20 20 20 69 66  int nArg;.    if
5c90: 28 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 47 65 74  ( Tcl_ListObjGet
5ca0: 45 6c 65 6d 65 6e 74 73 28 70 2d 3e 69 6e 74 65  Elements(p->inte
5cb0: 72 70 2c 20 70 2d 3e 70 53 63 72 69 70 74 2c 20  rp, p->pScript, 
5cc0: 26 6e 41 72 67 2c 20 26 61 41 72 67 29 20 29 7b  &nArg, &aArg) ){
5cd0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
5ce0: 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74  esult_error(cont
5cf0: 65 78 74 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  ext, Tcl_GetStri
5d00: 6e 67 52 65 73 75 6c 74 28 70 2d 3e 69 6e 74 65  ngResult(p->inte
5d10: 72 70 29 2c 20 2d 31 29 3b 20 0a 20 20 20 20 20  rp), -1); .     
5d20: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 20 20   return;.    }  
5d30: 20 20 20 0a 20 20 20 20 70 43 6d 64 20 3d 20 54     .    pCmd = T
5d40: 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 6e 41  cl_NewListObj(nA
5d50: 72 67 2c 20 61 41 72 67 29 3b 0a 20 20 20 20 54  rg, aArg);.    T
5d60: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
5d70: 70 43 6d 64 29 3b 0a 20 20 20 20 66 6f 72 28 69  pCmd);.    for(i
5d80: 3d 30 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b 29  =0; i<argc; i++)
5d90: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
5da0: 76 61 6c 75 65 20 2a 70 49 6e 20 3d 20 61 72 67  value *pIn = arg
5db0: 76 5b 69 5d 3b 0a 20 20 20 20 20 20 54 63 6c 5f  v[i];.      Tcl_
5dc0: 4f 62 6a 20 2a 70 56 61 6c 3b 0a 20 20 20 20 20  Obj *pVal;.     
5dd0: 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 2f 2a         .      /*
5de0: 20 53 65 74 20 70 56 61 6c 20 74 6f 20 63 6f 6e   Set pVal to con
5df0: 74 61 69 6e 20 74 68 65 20 69 27 74 68 20 63 6f  tain the i'th co
5e00: 6c 75 6d 6e 20 6f 66 20 74 68 69 73 20 72 6f 77  lumn of this row
5e10: 2e 20 2a 2f 0a 20 20 20 20 20 20 73 77 69 74 63  . */.      switc
5e20: 68 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  h( sqlite3_value
5e30: 5f 74 79 70 65 28 70 49 6e 29 20 29 7b 0a 20 20  _type(pIn) ){.  
5e40: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
5e50: 45 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20  E_BLOB: {.      
5e60: 20 20 20 20 69 6e 74 20 62 79 74 65 73 20 3d 20      int bytes = 
5e70: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79  sqlite3_value_by
5e80: 74 65 73 28 70 49 6e 29 3b 0a 20 20 20 20 20 20  tes(pIn);.      
5e90: 20 20 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e      pVal = Tcl_N
5ea0: 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 73  ewByteArrayObj(s
5eb0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f  qlite3_value_blo
5ec0: 62 28 70 49 6e 29 2c 20 62 79 74 65 73 29 3b 0a  b(pIn), bytes);.
5ed0: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
5ee0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
5ef0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
5f00: 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20 20 20  NTEGER: {.      
5f10: 20 20 20 20 73 71 6c 69 74 65 5f 69 6e 74 36 34      sqlite_int64
5f20: 20 76 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c   v = sqlite3_val
5f30: 75 65 5f 69 6e 74 36 34 28 70 49 6e 29 3b 0a 20  ue_int64(pIn);. 
5f40: 20 20 20 20 20 20 20 20 20 69 66 28 20 76 3e 3d           if( v>=
5f50: 2d 32 31 34 37 34 38 33 36 34 37 20 26 26 20 76  -2147483647 && v
5f60: 3c 3d 32 31 34 37 34 38 33 36 34 37 20 29 7b 0a  <=2147483647 ){.
5f70: 20 20 20 20 20 20 20 20 20 20 20 20 70 56 61 6c              pVal
5f80: 20 3d 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a   = Tcl_NewIntObj
5f90: 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  (v);.          }
5fa0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
5fb0: 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77    pVal = Tcl_New
5fc0: 57 69 64 65 49 6e 74 4f 62 6a 28 76 29 3b 0a 20  WideIntObj(v);. 
5fd0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
5fe0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
5ff0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63 61      }.        ca
6000: 73 65 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54 3a  se SQLITE_FLOAT:
6010: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 64 6f 75   {.          dou
6020: 62 6c 65 20 72 20 3d 20 73 71 6c 69 74 65 33 5f  ble r = sqlite3_
6030: 76 61 6c 75 65 5f 64 6f 75 62 6c 65 28 70 49 6e  value_double(pIn
6040: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 56 61  );.          pVa
6050: 6c 20 3d 20 54 63 6c 5f 4e 65 77 44 6f 75 62 6c  l = Tcl_NewDoubl
6060: 65 4f 62 6a 28 72 29 3b 0a 20 20 20 20 20 20 20  eObj(r);.       
6070: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
6080: 20 20 7d 0a 20 20 20 20 20 20 20 20 63 61 73 65    }.        case
6090: 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 3a 20 7b 0a   SQLITE_NULL: {.
60a0: 20 20 20 20 20 20 20 20 20 20 70 56 61 6c 20 3d            pVal =
60b0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
60c0: 6a 28 22 22 2c 20 30 29 3b 0a 20 20 20 20 20 20  j("", 0);.      
60d0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
60e0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 64 65 66     }.        def
60f0: 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 20 20  ault: {.        
6100: 20 20 69 6e 74 20 62 79 74 65 73 20 3d 20 73 71    int bytes = sq
6110: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65  lite3_value_byte
6120: 73 28 70 49 6e 29 3b 0a 20 20 20 20 20 20 20 20  s(pIn);.        
6130: 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77    pVal = Tcl_New
6140: 53 74 72 69 6e 67 4f 62 6a 28 28 63 68 61 72 20  StringObj((char 
6150: 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  *)sqlite3_value_
6160: 74 65 78 74 28 70 49 6e 29 2c 20 62 79 74 65 73  text(pIn), bytes
6170: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  );.          bre
6180: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
6190: 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d      }.      rc =
61a0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
61b0: 6e 64 45 6c 65 6d 65 6e 74 28 70 2d 3e 69 6e 74  ndElement(p->int
61c0: 65 72 70 2c 20 70 43 6d 64 2c 20 70 56 61 6c 29  erp, pCmd, pVal)
61d0: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
61e0: 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 44 65  {.        Tcl_De
61f0: 63 72 52 65 66 43 6f 75 6e 74 28 70 43 6d 64 29  crRefCount(pCmd)
6200: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
6210: 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63  3_result_error(c
6220: 6f 6e 74 65 78 74 2c 20 54 63 6c 5f 47 65 74 53  ontext, Tcl_GetS
6230: 74 72 69 6e 67 52 65 73 75 6c 74 28 70 2d 3e 69  tringResult(p->i
6240: 6e 74 65 72 70 29 2c 20 2d 31 29 3b 20 0a 20 20  nterp), -1); .  
6250: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
6260: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
6270: 69 66 28 20 21 70 2d 3e 75 73 65 45 76 61 6c 4f  if( !p->useEvalO
6280: 62 6a 76 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  bjv ){.      /* 
6290: 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 29 20  Tcl_EvalObjEx() 
62a0: 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c  will automatical
62b0: 6c 79 20 63 61 6c 6c 20 54 63 6c 5f 45 76 61 6c  ly call Tcl_Eval
62c0: 4f 62 6a 76 28 29 20 69 66 20 70 43 6d 64 0a 20  Objv() if pCmd. 
62d0: 20 20 20 20 20 2a 2a 20 69 73 20 61 20 6c 69 73       ** is a lis
62e0: 74 20 77 69 74 68 6f 75 74 20 61 20 73 74 72 69  t without a stri
62f0: 6e 67 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  ng representatio
6300: 6e 2e 20 20 54 6f 20 70 72 65 76 65 6e 74 20 74  n.  To prevent t
6310: 68 69 73 20 66 72 6f 6d 0a 20 20 20 20 20 20 2a  his from.      *
6320: 2a 20 68 61 70 70 65 6e 69 6e 67 2c 20 6d 61 6b  * happening, mak
6330: 65 20 73 75 72 65 20 70 43 6d 64 20 68 61 73 20  e sure pCmd has 
6340: 61 20 76 61 6c 69 64 20 73 74 72 69 6e 67 20 72  a valid string r
6350: 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 2a 2f  epresentation */
6360: 0a 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74  .      Tcl_GetSt
6370: 72 69 6e 67 28 70 43 6d 64 29 3b 0a 20 20 20 20  ring(pCmd);.    
6380: 7d 0a 20 20 20 20 72 63 20 3d 20 54 63 6c 5f 45  }.    rc = Tcl_E
6390: 76 61 6c 4f 62 6a 45 78 28 70 2d 3e 69 6e 74 65  valObjEx(p->inte
63a0: 72 70 2c 20 70 43 6d 64 2c 20 54 43 4c 5f 45 56  rp, pCmd, TCL_EV
63b0: 41 4c 5f 44 49 52 45 43 54 29 3b 0a 20 20 20 20  AL_DIRECT);.    
63c0: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
63d0: 28 70 43 6d 64 29 3b 0a 20 20 7d 0a 0a 20 20 69  (pCmd);.  }..  i
63e0: 66 28 20 72 63 20 26 26 20 72 63 21 3d 54 43 4c  f( rc && rc!=TCL
63f0: 5f 52 45 54 55 52 4e 20 29 7b 0a 20 20 20 20 73  _RETURN ){.    s
6400: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72  qlite3_result_er
6410: 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20 54 63 6c  ror(context, Tcl
6420: 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74  _GetStringResult
6430: 28 70 2d 3e 69 6e 74 65 72 70 29 2c 20 2d 31 29  (p->interp), -1)
6440: 3b 20 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  ; .  }else{.    
6450: 54 63 6c 5f 4f 62 6a 20 2a 70 56 61 72 20 3d 20  Tcl_Obj *pVar = 
6460: 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_GetObjResult
6470: 28 70 2d 3e 69 6e 74 65 72 70 29 3b 0a 20 20 20  (p->interp);.   
6480: 20 69 6e 74 20 6e 3b 0a 20 20 20 20 75 38 20 2a   int n;.    u8 *
6490: 64 61 74 61 3b 0a 20 20 20 20 63 6f 6e 73 74 20  data;.    const 
64a0: 63 68 61 72 20 2a 7a 54 79 70 65 20 3d 20 28 70  char *zType = (p
64b0: 56 61 72 2d 3e 74 79 70 65 50 74 72 20 3f 20 70  Var->typePtr ? p
64c0: 56 61 72 2d 3e 74 79 70 65 50 74 72 2d 3e 6e 61  Var->typePtr->na
64d0: 6d 65 20 3a 20 22 22 29 3b 0a 20 20 20 20 63 68  me : "");.    ch
64e0: 61 72 20 63 20 3d 20 7a 54 79 70 65 5b 30 5d 3b  ar c = zType[0];
64f0: 0a 20 20 20 20 69 66 28 20 63 3d 3d 27 62 27 20  .    if( c=='b' 
6500: 26 26 20 73 74 72 63 6d 70 28 7a 54 79 70 65 2c  && strcmp(zType,
6510: 22 62 79 74 65 61 72 72 61 79 22 29 3d 3d 30 20  "bytearray")==0 
6520: 26 26 20 70 56 61 72 2d 3e 62 79 74 65 73 3d 3d  && pVar->bytes==
6530: 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 6e  0 ){.      /* On
6540: 6c 79 20 72 65 74 75 72 6e 20 61 20 42 4c 4f 42  ly return a BLOB
6550: 20 74 79 70 65 20 69 66 20 74 68 65 20 54 63 6c   type if the Tcl
6560: 20 76 61 72 69 61 62 6c 65 20 69 73 20 61 20 62   variable is a b
6570: 79 74 65 61 72 72 61 79 20 61 6e 64 0a 20 20 20  ytearray and.   
6580: 20 20 20 2a 2a 20 68 61 73 20 6e 6f 20 73 74 72     ** has no str
6590: 69 6e 67 20 72 65 70 72 65 73 65 6e 74 61 74 69  ing representati
65a0: 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 64 61 74  on. */.      dat
65b0: 61 20 3d 20 54 63 6c 5f 47 65 74 42 79 74 65 41  a = Tcl_GetByteA
65c0: 72 72 61 79 46 72 6f 6d 4f 62 6a 28 70 56 61 72  rrayFromObj(pVar
65d0: 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c  , &n);.      sql
65e0: 69 74 65 33 5f 72 65 73 75 6c 74 5f 62 6c 6f 62  ite3_result_blob
65f0: 28 63 6f 6e 74 65 78 74 2c 20 64 61 74 61 2c 20  (context, data, 
6600: 6e 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  n, SQLITE_TRANSI
6610: 45 4e 54 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  ENT);.    }else 
6620: 69 66 28 20 63 3d 3d 27 62 27 20 26 26 20 73 74  if( c=='b' && st
6630: 72 63 6d 70 28 7a 54 79 70 65 2c 22 62 6f 6f 6c  rcmp(zType,"bool
6640: 65 61 6e 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ean")==0 ){.    
6650: 20 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d    Tcl_GetIntFrom
6660: 4f 62 6a 28 30 2c 20 70 56 61 72 2c 20 26 6e 29  Obj(0, pVar, &n)
6670: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
6680: 72 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e 74 65  result_int(conte
6690: 78 74 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73  xt, n);.    }els
66a0: 65 20 69 66 28 20 63 3d 3d 27 64 27 20 26 26 20  e if( c=='d' && 
66b0: 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22 64 6f  strcmp(zType,"do
66c0: 75 62 6c 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20  uble")==0 ){.   
66d0: 20 20 20 64 6f 75 62 6c 65 20 72 3b 0a 20 20 20     double r;.   
66e0: 20 20 20 54 63 6c 5f 47 65 74 44 6f 75 62 6c 65     Tcl_GetDouble
66f0: 46 72 6f 6d 4f 62 6a 28 30 2c 20 70 56 61 72 2c  FromObj(0, pVar,
6700: 20 26 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   &r);.      sqli
6710: 74 65 33 5f 72 65 73 75 6c 74 5f 64 6f 75 62 6c  te3_result_doubl
6720: 65 28 63 6f 6e 74 65 78 74 2c 20 72 29 3b 0a 20  e(context, r);. 
6730: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 63 3d     }else if( (c=
6740: 3d 27 77 27 20 26 26 20 73 74 72 63 6d 70 28 7a  ='w' && strcmp(z
6750: 54 79 70 65 2c 22 77 69 64 65 49 6e 74 22 29 3d  Type,"wideInt")=
6760: 3d 30 29 20 7c 7c 0a 20 20 20 20 20 20 20 20 20  =0) ||.         
6770: 20 28 63 3d 3d 27 69 27 20 26 26 20 73 74 72 63   (c=='i' && strc
6780: 6d 70 28 7a 54 79 70 65 2c 22 69 6e 74 22 29 3d  mp(zType,"int")=
6790: 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  =0) ){.      Tcl
67a0: 5f 57 69 64 65 49 6e 74 20 76 3b 0a 20 20 20 20  _WideInt v;.    
67b0: 20 20 54 63 6c 5f 47 65 74 57 69 64 65 49 6e 74    Tcl_GetWideInt
67c0: 46 72 6f 6d 4f 62 6a 28 30 2c 20 70 56 61 72 2c  FromObj(0, pVar,
67d0: 20 26 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   &v);.      sqli
67e0: 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34  te3_result_int64
67f0: 28 63 6f 6e 74 65 78 74 2c 20 76 29 3b 0a 20 20  (context, v);.  
6800: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 64    }else{.      d
6810: 61 74 61 20 3d 20 28 75 6e 73 69 67 6e 65 64 20  ata = (unsigned 
6820: 63 68 61 72 20 2a 29 54 63 6c 5f 47 65 74 53 74  char *)Tcl_GetSt
6830: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 70 56 61 72  ringFromObj(pVar
6840: 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c  , &n);.      sql
6850: 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74  ite3_result_text
6860: 28 63 6f 6e 74 65 78 74 2c 20 28 63 68 61 72 20  (context, (char 
6870: 2a 29 64 61 74 61 2c 20 6e 2c 20 53 51 4c 49 54  *)data, n, SQLIT
6880: 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  E_TRANSIENT);.  
6890: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64    }.  }.}..#ifnd
68a0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
68b0: 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 2f 2a 0a  UTHORIZATION./*.
68c0: 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 61  ** This is the a
68d0: 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 20 66 75  uthentication fu
68e0: 6e 63 74 69 6f 6e 2e 20 20 49 74 20 61 70 70 65  nction.  It appe
68f0: 6e 64 73 20 74 68 65 20 61 75 74 68 65 6e 74 69  nds the authenti
6900: 63 61 74 69 6f 6e 0a 2a 2a 20 74 79 70 65 20 63  cation.** type c
6910: 6f 64 65 20 61 6e 64 20 74 68 65 20 74 77 6f 20  ode and the two 
6920: 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 7a 43 6d  arguments to zCm
6930: 64 5b 5d 20 74 68 65 6e 20 69 6e 76 6f 6b 65 73  d[] then invokes
6940: 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 6f   the result.** o
6950: 6e 20 74 68 65 20 69 6e 74 65 72 70 72 65 74 65  n the interprete
6960: 72 2e 20 20 54 68 65 20 72 65 70 6c 79 20 69 73  r.  The reply is
6970: 20 65 78 61 6d 69 6e 65 64 20 74 6f 20 64 65 74   examined to det
6980: 65 72 6d 69 6e 65 20 69 66 20 74 68 65 0a 2a 2a  ermine if the.**
6990: 20 61 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 20   authentication 
69a0: 66 61 69 6c 73 20 6f 72 20 73 75 63 63 65 65 64  fails or succeed
69b0: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
69c0: 20 61 75 74 68 5f 63 61 6c 6c 62 61 63 6b 28 0a   auth_callback(.
69d0: 20 20 76 6f 69 64 20 2a 70 41 72 67 2c 0a 20 20    void *pArg,.  
69e0: 69 6e 74 20 63 6f 64 65 2c 0a 20 20 63 6f 6e 73  int code,.  cons
69f0: 74 20 63 68 61 72 20 2a 7a 41 72 67 31 2c 0a 20  t char *zArg1,. 
6a00: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72   const char *zAr
6a10: 67 32 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  g2,.  const char
6a20: 20 2a 7a 41 72 67 33 2c 0a 20 20 63 6f 6e 73 74   *zArg3,.  const
6a30: 20 63 68 61 72 20 2a 7a 41 72 67 34 0a 29 7b 0a   char *zArg4.){.
6a40: 20 20 63 68 61 72 20 2a 7a 43 6f 64 65 3b 0a 20    char *zCode;. 
6a50: 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 73 74 72   Tcl_DString str
6a60: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 6f  ;.  int rc;.  co
6a70: 6e 73 74 20 63 68 61 72 20 2a 7a 52 65 70 6c 79  nst char *zReply
6a80: 3b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44  ;.  SqliteDb *pD
6a90: 62 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 70  b = (SqliteDb*)p
6aa0: 41 72 67 3b 0a 20 20 69 66 28 20 70 44 62 2d 3e  Arg;.  if( pDb->
6ab0: 64 69 73 61 62 6c 65 41 75 74 68 20 29 20 72 65  disableAuth ) re
6ac0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
6ad0: 0a 20 20 73 77 69 74 63 68 28 20 63 6f 64 65 20  .  switch( code 
6ae0: 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  ){.    case SQLI
6af0: 54 45 5f 43 4f 50 59 20 20 20 20 20 20 20 20 20  TE_COPY         
6b00: 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51       : zCode="SQ
6b10: 4c 49 54 45 5f 43 4f 50 59 22 3b 20 62 72 65 61  LITE_COPY"; brea
6b20: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
6b30: 54 45 5f 43 52 45 41 54 45 5f 49 4e 44 45 58 20  TE_CREATE_INDEX 
6b40: 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51       : zCode="SQ
6b50: 4c 49 54 45 5f 43 52 45 41 54 45 5f 49 4e 44 45  LITE_CREATE_INDE
6b60: 58 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  X"; break;.    c
6b70: 61 73 65 20 53 51 4c 49 54 45 5f 43 52 45 41 54  ase SQLITE_CREAT
6b80: 45 5f 54 41 42 4c 45 20 20 20 20 20 20 3a 20 7a  E_TABLE      : z
6b90: 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43 52 45  Code="SQLITE_CRE
6ba0: 41 54 45 5f 54 41 42 4c 45 22 3b 20 62 72 65 61  ATE_TABLE"; brea
6bb0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
6bc0: 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 49  TE_CREATE_TEMP_I
6bd0: 4e 44 45 58 20 3a 20 7a 43 6f 64 65 3d 22 53 51  NDEX : zCode="SQ
6be0: 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50  LITE_CREATE_TEMP
6bf0: 5f 49 4e 44 45 58 22 3b 20 62 72 65 61 6b 3b 0a  _INDEX"; break;.
6c00: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
6c10: 43 52 45 41 54 45 5f 54 45 4d 50 5f 54 41 42 4c  CREATE_TEMP_TABL
6c20: 45 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54  E : zCode="SQLIT
6c30: 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 54 41  E_CREATE_TEMP_TA
6c40: 42 4c 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  BLE"; break;.   
6c50: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 52 45   case SQLITE_CRE
6c60: 41 54 45 5f 54 45 4d 50 5f 54 52 49 47 47 45 52  ATE_TEMP_TRIGGER
6c70: 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f  : zCode="SQLITE_
6c80: 43 52 45 41 54 45 5f 54 45 4d 50 5f 54 52 49 47  CREATE_TEMP_TRIG
6c90: 47 45 52 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  GER"; break;.   
6ca0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 52 45   case SQLITE_CRE
6cb0: 41 54 45 5f 54 45 4d 50 5f 56 49 45 57 20 20 3a  ATE_TEMP_VIEW  :
6cc0: 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43   zCode="SQLITE_C
6cd0: 52 45 41 54 45 5f 54 45 4d 50 5f 56 49 45 57 22  REATE_TEMP_VIEW"
6ce0: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
6cf0: 65 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  e SQLITE_CREATE_
6d00: 54 52 49 47 47 45 52 20 20 20 20 3a 20 7a 43 6f  TRIGGER    : zCo
6d10: 64 65 3d 22 53 51 4c 49 54 45 5f 43 52 45 41 54  de="SQLITE_CREAT
6d20: 45 5f 54 52 49 47 47 45 52 22 3b 20 62 72 65 61  E_TRIGGER"; brea
6d30: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
6d40: 54 45 5f 43 52 45 41 54 45 5f 56 49 45 57 20 20  TE_CREATE_VIEW  
6d50: 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51       : zCode="SQ
6d60: 4c 49 54 45 5f 43 52 45 41 54 45 5f 56 49 45 57  LITE_CREATE_VIEW
6d70: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
6d80: 73 65 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45  se SQLITE_DELETE
6d90: 20 20 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43              : zC
6da0: 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44 45 4c 45  ode="SQLITE_DELE
6db0: 54 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  TE"; break;.    
6dc0: 63 61 73 65 20 53 51 4c 49 54 45 5f 44 52 4f 50  case SQLITE_DROP
6dd0: 5f 49 4e 44 45 58 20 20 20 20 20 20 20 20 3a 20  _INDEX        : 
6de0: 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44 52  zCode="SQLITE_DR
6df0: 4f 50 5f 49 4e 44 45 58 22 3b 20 62 72 65 61 6b  OP_INDEX"; break
6e00: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
6e10: 45 5f 44 52 4f 50 5f 54 41 42 4c 45 20 20 20 20  E_DROP_TABLE    
6e20: 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c      : zCode="SQL
6e30: 49 54 45 5f 44 52 4f 50 5f 54 41 42 4c 45 22 3b  ITE_DROP_TABLE";
6e40: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
6e50: 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d   SQLITE_DROP_TEM
6e60: 50 5f 49 4e 44 45 58 20 20 20 3a 20 7a 43 6f 64  P_INDEX   : zCod
6e70: 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54  e="SQLITE_DROP_T
6e80: 45 4d 50 5f 49 4e 44 45 58 22 3b 20 62 72 65 61  EMP_INDEX"; brea
6e90: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
6ea0: 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 54 41 42  TE_DROP_TEMP_TAB
6eb0: 4c 45 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51  LE   : zCode="SQ
6ec0: 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 54  LITE_DROP_TEMP_T
6ed0: 41 42 4c 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20  ABLE"; break;.  
6ee0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44 52    case SQLITE_DR
6ef0: 4f 50 5f 54 45 4d 50 5f 54 52 49 47 47 45 52 20  OP_TEMP_TRIGGER 
6f00: 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f  : zCode="SQLITE_
6f10: 44 52 4f 50 5f 54 45 4d 50 5f 54 52 49 47 47 45  DROP_TEMP_TRIGGE
6f20: 52 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  R"; break;.    c
6f30: 61 73 65 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f  ase SQLITE_DROP_
6f40: 54 45 4d 50 5f 56 49 45 57 20 20 20 20 3a 20 7a  TEMP_VIEW    : z
6f50: 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f  Code="SQLITE_DRO
6f60: 50 5f 54 45 4d 50 5f 56 49 45 57 22 3b 20 62 72  P_TEMP_VIEW"; br
6f70: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
6f80: 4c 49 54 45 5f 44 52 4f 50 5f 54 52 49 47 47 45  LITE_DROP_TRIGGE
6f90: 52 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22  R      : zCode="
6fa0: 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 52 49 47  SQLITE_DROP_TRIG
6fb0: 47 45 52 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  GER"; break;.   
6fc0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44 52 4f   case SQLITE_DRO
6fd0: 50 5f 56 49 45 57 20 20 20 20 20 20 20 20 20 3a  P_VIEW         :
6fe0: 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44   zCode="SQLITE_D
6ff0: 52 4f 50 5f 56 49 45 57 22 3b 20 62 72 65 61 6b  ROP_VIEW"; break
7000: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
7010: 45 5f 49 4e 53 45 52 54 20 20 20 20 20 20 20 20  E_INSERT        
7020: 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c      : zCode="SQL
7030: 49 54 45 5f 49 4e 53 45 52 54 22 3b 20 62 72 65  ITE_INSERT"; bre
7040: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
7050: 49 54 45 5f 50 52 41 47 4d 41 20 20 20 20 20 20  ITE_PRAGMA      
7060: 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53        : zCode="S
7070: 51 4c 49 54 45 5f 50 52 41 47 4d 41 22 3b 20 62  QLITE_PRAGMA"; b
7080: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
7090: 51 4c 49 54 45 5f 52 45 41 44 20 20 20 20 20 20  QLITE_READ      
70a0: 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d          : zCode=
70b0: 22 53 51 4c 49 54 45 5f 52 45 41 44 22 3b 20 62  "SQLITE_READ"; b
70c0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
70d0: 51 4c 49 54 45 5f 53 45 4c 45 43 54 20 20 20 20  QLITE_SELECT    
70e0: 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d          : zCode=
70f0: 22 53 51 4c 49 54 45 5f 53 45 4c 45 43 54 22 3b  "SQLITE_SELECT";
7100: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
7110: 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 41 43 54   SQLITE_TRANSACT
7120: 49 4f 4e 20 20 20 20 20 20 20 3a 20 7a 43 6f 64  ION       : zCod
7130: 65 3d 22 53 51 4c 49 54 45 5f 54 52 41 4e 53 41  e="SQLITE_TRANSA
7140: 43 54 49 4f 4e 22 3b 20 62 72 65 61 6b 3b 0a 20  CTION"; break;. 
7150: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 55     case SQLITE_U
7160: 50 44 41 54 45 20 20 20 20 20 20 20 20 20 20 20  PDATE           
7170: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
7180: 5f 55 50 44 41 54 45 22 3b 20 62 72 65 61 6b 3b  _UPDATE"; break;
7190: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
71a0: 5f 41 54 54 41 43 48 20 20 20 20 20 20 20 20 20  _ATTACH         
71b0: 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49     : zCode="SQLI
71c0: 54 45 5f 41 54 54 41 43 48 22 3b 20 62 72 65 61  TE_ATTACH"; brea
71d0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
71e0: 54 45 5f 44 45 54 41 43 48 20 20 20 20 20 20 20  TE_DETACH       
71f0: 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51       : zCode="SQ
7200: 4c 49 54 45 5f 44 45 54 41 43 48 22 3b 20 62 72  LITE_DETACH"; br
7210: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
7220: 4c 49 54 45 5f 41 4c 54 45 52 5f 54 41 42 4c 45  LITE_ALTER_TABLE
7230: 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22         : zCode="
7240: 53 51 4c 49 54 45 5f 41 4c 54 45 52 5f 54 41 42  SQLITE_ALTER_TAB
7250: 4c 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  LE"; break;.    
7260: 63 61 73 65 20 53 51 4c 49 54 45 5f 52 45 49 4e  case SQLITE_REIN
7270: 44 45 58 20 20 20 20 20 20 20 20 20 20 20 3a 20  DEX           : 
7280: 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 52 45  zCode="SQLITE_RE
7290: 49 4e 44 45 58 22 3b 20 62 72 65 61 6b 3b 0a 20  INDEX"; break;. 
72a0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41     case SQLITE_A
72b0: 4e 41 4c 59 5a 45 20 20 20 20 20 20 20 20 20 20  NALYZE          
72c0: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
72d0: 5f 41 4e 41 4c 59 5a 45 22 3b 20 62 72 65 61 6b  _ANALYZE"; break
72e0: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
72f0: 45 5f 43 52 45 41 54 45 5f 56 54 41 42 4c 45 20  E_CREATE_VTABLE 
7300: 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c      : zCode="SQL
7310: 49 54 45 5f 43 52 45 41 54 45 5f 56 54 41 42 4c  ITE_CREATE_VTABL
7320: 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  E"; break;.    c
7330: 61 73 65 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f  ase SQLITE_DROP_
7340: 56 54 41 42 4c 45 20 20 20 20 20 20 20 3a 20 7a  VTABLE       : z
7350: 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f  Code="SQLITE_DRO
7360: 50 5f 56 54 41 42 4c 45 22 3b 20 62 72 65 61 6b  P_VTABLE"; break
7370: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
7380: 45 5f 46 55 4e 43 54 49 4f 4e 20 20 20 20 20 20  E_FUNCTION      
7390: 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c      : zCode="SQL
73a0: 49 54 45 5f 46 55 4e 43 54 49 4f 4e 22 3b 20 62  ITE_FUNCTION"; b
73b0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
73c0: 51 4c 49 54 45 5f 53 41 56 45 50 4f 49 4e 54 20  QLITE_SAVEPOINT 
73d0: 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d          : zCode=
73e0: 22 53 51 4c 49 54 45 5f 53 41 56 45 50 4f 49 4e  "SQLITE_SAVEPOIN
73f0: 54 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 64  T"; break;.    d
7400: 65 66 61 75 6c 74 20 20 20 20 20 20 20 20 20 20  efault          
7410: 20 20 20 20 20 20 20 20 20 20 20 20 20 3a 20 7a               : z
7420: 43 6f 64 65 3d 22 3f 3f 3f 3f 22 3b 20 62 72 65  Code="????"; bre
7430: 61 6b 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 44 53  ak;.  }.  Tcl_DS
7440: 74 72 69 6e 67 49 6e 69 74 28 26 73 74 72 29 3b  tringInit(&str);
7450: 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70  .  Tcl_DStringAp
7460: 70 65 6e 64 28 26 73 74 72 2c 20 70 44 62 2d 3e  pend(&str, pDb->
7470: 7a 41 75 74 68 2c 20 2d 31 29 3b 0a 20 20 54 63  zAuth, -1);.  Tc
7480: 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64 45  l_DStringAppendE
7490: 6c 65 6d 65 6e 74 28 26 73 74 72 2c 20 7a 43 6f  lement(&str, zCo
74a0: 64 65 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69  de);.  Tcl_DStri
74b0: 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  ngAppendElement(
74c0: 26 73 74 72 2c 20 7a 41 72 67 31 20 3f 20 7a 41  &str, zArg1 ? zA
74d0: 72 67 31 20 3a 20 22 22 29 3b 0a 20 20 54 63 6c  rg1 : "");.  Tcl
74e0: 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64 45 6c  _DStringAppendEl
74f0: 65 6d 65 6e 74 28 26 73 74 72 2c 20 7a 41 72 67  ement(&str, zArg
7500: 32 20 3f 20 7a 41 72 67 32 20 3a 20 22 22 29 3b  2 ? zArg2 : "");
7510: 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70  .  Tcl_DStringAp
7520: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 26 73 74 72  pendElement(&str
7530: 2c 20 7a 41 72 67 33 20 3f 20 7a 41 72 67 33 20  , zArg3 ? zArg3 
7540: 3a 20 22 22 29 3b 0a 20 20 54 63 6c 5f 44 53 74  : "");.  Tcl_DSt
7550: 72 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e  ringAppendElemen
7560: 74 28 26 73 74 72 2c 20 7a 41 72 67 34 20 3f 20  t(&str, zArg4 ? 
7570: 7a 41 72 67 34 20 3a 20 22 22 29 3b 0a 20 20 72  zArg4 : "");.  r
7580: 63 20 3d 20 54 63 6c 5f 47 6c 6f 62 61 6c 45 76  c = Tcl_GlobalEv
7590: 61 6c 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20  al(pDb->interp, 
75a0: 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65  Tcl_DStringValue
75b0: 28 26 73 74 72 29 29 3b 0a 20 20 54 63 6c 5f 44  (&str));.  Tcl_D
75c0: 53 74 72 69 6e 67 46 72 65 65 28 26 73 74 72 29  StringFree(&str)
75d0: 3b 0a 20 20 7a 52 65 70 6c 79 20 3d 20 54 63 6c  ;.  zReply = Tcl
75e0: 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74  _GetStringResult
75f0: 28 70 44 62 2d 3e 69 6e 74 65 72 70 29 3b 0a 20  (pDb->interp);. 
7600: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 52 65 70   if( strcmp(zRep
7610: 6c 79 2c 22 53 51 4c 49 54 45 5f 4f 4b 22 29 3d  ly,"SQLITE_OK")=
7620: 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  =0 ){.    rc = S
7630: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73  QLITE_OK;.  }els
7640: 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 52 65  e if( strcmp(zRe
7650: 70 6c 79 2c 22 53 51 4c 49 54 45 5f 44 45 4e 59  ply,"SQLITE_DENY
7660: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  ")==0 ){.    rc 
7670: 3d 20 53 51 4c 49 54 45 5f 44 45 4e 59 3b 0a 20  = SQLITE_DENY;. 
7680: 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
7690: 70 28 7a 52 65 70 6c 79 2c 22 53 51 4c 49 54 45  p(zReply,"SQLITE
76a0: 5f 49 47 4e 4f 52 45 22 29 3d 3d 30 20 29 7b 0a  _IGNORE")==0 ){.
76b0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
76c0: 49 47 4e 4f 52 45 3b 0a 20 20 7d 65 6c 73 65 7b  IGNORE;.  }else{
76d0: 0a 20 20 20 20 72 63 20 3d 20 39 39 39 3b 0a 20  .    rc = 999;. 
76e0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
76f0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
7700: 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a  TE_OMIT_AUTHORIZ
7710: 41 54 49 4f 4e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  ATION */../*.** 
7720: 7a 54 65 78 74 20 69 73 20 61 20 70 6f 69 6e 74  zText is a point
7730: 65 72 20 74 6f 20 74 65 78 74 20 6f 62 74 61 69  er to text obtai
7740: 6e 65 64 20 76 69 61 20 61 6e 20 73 71 6c 69 74  ned via an sqlit
7750: 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 29  e3_result_text()
7760: 0a 2a 2a 20 6f 72 20 73 69 6d 69 6c 61 72 20 69  .** or similar i
7770: 6e 74 65 72 66 61 63 65 2e 20 54 68 69 73 20 72  nterface. This r
7780: 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 61  outine returns a
7790: 20 54 63 6c 20 73 74 72 69 6e 67 20 6f 62 6a 65   Tcl string obje
77a0: 63 74 2c 20 0a 2a 2a 20 72 65 66 65 72 65 6e 63  ct, .** referenc
77b0: 65 20 63 6f 75 6e 74 20 73 65 74 20 74 6f 20 30  e count set to 0
77c0: 2c 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  , containing the
77d0: 20 74 65 78 74 2e 20 49 66 20 61 20 74 72 61 6e   text. If a tran
77e0: 73 6c 61 74 69 6f 6e 0a 2a 2a 20 62 65 74 77 65  slation.** betwe
77f0: 65 6e 20 69 73 6f 38 38 35 39 20 61 6e 64 20 55  en iso8859 and U
7800: 54 46 2d 38 20 69 73 20 72 65 71 75 69 72 65 64  TF-8 is required
7810: 2c 20 69 74 20 69 73 20 70 72 65 66 6f 72 6d 65  , it is preforme
7820: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 54 63 6c  d..*/.static Tcl
7830: 5f 4f 62 6a 20 2a 64 62 54 65 78 74 54 6f 4f 62  _Obj *dbTextToOb
7840: 6a 28 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 54  j(char const *zT
7850: 65 78 74 29 7b 0a 20 20 54 63 6c 5f 4f 62 6a 20  ext){.  Tcl_Obj 
7860: 2a 70 56 61 6c 3b 0a 23 69 66 64 65 66 20 55 54  *pVal;.#ifdef UT
7870: 46 5f 54 52 41 4e 53 4c 41 54 49 4f 4e 5f 4e 45  F_TRANSLATION_NE
7880: 45 44 45 44 0a 20 20 54 63 6c 5f 44 53 74 72 69  EDED.  Tcl_DStri
7890: 6e 67 20 64 43 6f 6c 3b 0a 20 20 54 63 6c 5f 44  ng dCol;.  Tcl_D
78a0: 53 74 72 69 6e 67 49 6e 69 74 28 26 64 43 6f 6c  StringInit(&dCol
78b0: 29 3b 0a 20 20 54 63 6c 5f 45 78 74 65 72 6e 61  );.  Tcl_Externa
78c0: 6c 54 6f 55 74 66 44 53 74 72 69 6e 67 28 4e 55  lToUtfDString(NU
78d0: 4c 4c 2c 20 7a 54 65 78 74 2c 20 2d 31 2c 20 26  LL, zText, -1, &
78e0: 64 43 6f 6c 29 3b 0a 20 20 70 56 61 6c 20 3d 20  dCol);.  pVal = 
78f0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
7900: 28 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75  (Tcl_DStringValu
7910: 65 28 26 64 43 6f 6c 29 2c 20 2d 31 29 3b 0a 20  e(&dCol), -1);. 
7920: 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65   Tcl_DStringFree
7930: 28 26 64 43 6f 6c 29 3b 0a 23 65 6c 73 65 0a 20  (&dCol);.#else. 
7940: 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 53   pVal = Tcl_NewS
7950: 74 72 69 6e 67 4f 62 6a 28 7a 54 65 78 74 2c 20  tringObj(zText, 
7960: 2d 31 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65  -1);.#endif.  re
7970: 74 75 72 6e 20 70 56 61 6c 3b 0a 7d 0a 0a 2f 2a  turn pVal;.}../*
7980: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
7990: 20 72 65 61 64 73 20 61 20 6c 69 6e 65 20 6f 66   reads a line of
79a0: 20 74 65 78 74 20 66 72 6f 6d 20 46 49 4c 45 20   text from FILE 
79b0: 69 6e 2c 20 73 74 6f 72 65 73 0a 2a 2a 20 74 68  in, stores.** th
79c0: 65 20 74 65 78 74 20 69 6e 20 6d 65 6d 6f 72 79  e text in memory
79d0: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d   obtained from m
79e0: 61 6c 6c 6f 63 28 29 20 61 6e 64 20 72 65 74 75  alloc() and retu
79f0: 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a  rns a pointer.**
7a00: 20 74 6f 20 74 68 65 20 74 65 78 74 2e 20 20 4e   to the text.  N
7a10: 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20  ULL is returned 
7a20: 61 74 20 65 6e 64 20 6f 66 20 66 69 6c 65 2c 20  at end of file, 
7a30: 6f 72 20 69 66 20 6d 61 6c 6c 6f 63 28 29 0a 2a  or if malloc().*
7a40: 2a 20 66 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 54  * fails..**.** T
7a50: 68 65 20 69 6e 74 65 72 66 61 63 65 20 69 73 20  he interface is 
7a60: 6c 69 6b 65 20 22 72 65 61 64 6c 69 6e 65 22 20  like "readline" 
7a70: 62 75 74 20 6e 6f 20 63 6f 6d 6d 61 6e 64 2d 6c  but no command-l
7a80: 69 6e 65 20 65 64 69 74 69 6e 67 0a 2a 2a 20 69  ine editing.** i
7a90: 73 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 63 6f  s done..**.** co
7aa0: 70 69 65 64 20 66 72 6f 6d 20 73 68 65 6c 6c 2e  pied from shell.
7ab0: 63 20 66 72 6f 6d 20 27 2e 69 6d 70 6f 72 74 27  c from '.import'
7ac0: 20 63 6f 6d 6d 61 6e 64 0a 2a 2f 0a 73 74 61 74   command.*/.stat
7ad0: 69 63 20 63 68 61 72 20 2a 6c 6f 63 61 6c 5f 67  ic char *local_g
7ae0: 65 74 6c 69 6e 65 28 63 68 61 72 20 2a 7a 50 72  etline(char *zPr
7af0: 6f 6d 70 74 2c 20 46 49 4c 45 20 2a 69 6e 29 7b  ompt, FILE *in){
7b00: 0a 20 20 63 68 61 72 20 2a 7a 4c 69 6e 65 3b 0a  .  char *zLine;.
7b10: 20 20 69 6e 74 20 6e 4c 69 6e 65 3b 0a 20 20 69    int nLine;.  i
7b20: 6e 74 20 6e 3b 0a 20 20 69 6e 74 20 65 6f 6c 3b  nt n;.  int eol;
7b30: 0a 0a 20 20 6e 4c 69 6e 65 20 3d 20 31 30 30 3b  ..  nLine = 100;
7b40: 0a 20 20 7a 4c 69 6e 65 20 3d 20 6d 61 6c 6c 6f  .  zLine = mallo
7b50: 63 28 20 6e 4c 69 6e 65 20 29 3b 0a 20 20 69 66  c( nLine );.  if
7b60: 28 20 7a 4c 69 6e 65 3d 3d 30 20 29 20 72 65 74  ( zLine==0 ) ret
7b70: 75 72 6e 20 30 3b 0a 20 20 6e 20 3d 20 30 3b 0a  urn 0;.  n = 0;.
7b80: 20 20 65 6f 6c 20 3d 20 30 3b 0a 20 20 77 68 69    eol = 0;.  whi
7b90: 6c 65 28 20 21 65 6f 6c 20 29 7b 0a 20 20 20 20  le( !eol ){.    
7ba0: 69 66 28 20 6e 2b 31 30 30 3e 6e 4c 69 6e 65 20  if( n+100>nLine 
7bb0: 29 7b 0a 20 20 20 20 20 20 6e 4c 69 6e 65 20 3d  ){.      nLine =
7bc0: 20 6e 4c 69 6e 65 2a 32 20 2b 20 31 30 30 3b 0a   nLine*2 + 100;.
7bd0: 20 20 20 20 20 20 7a 4c 69 6e 65 20 3d 20 72 65        zLine = re
7be0: 61 6c 6c 6f 63 28 7a 4c 69 6e 65 2c 20 6e 4c 69  alloc(zLine, nLi
7bf0: 6e 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  ne);.      if( z
7c00: 4c 69 6e 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  Line==0 ) return
7c10: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   0;.    }.    if
7c20: 28 20 66 67 65 74 73 28 26 7a 4c 69 6e 65 5b 6e  ( fgets(&zLine[n
7c30: 5d 2c 20 6e 4c 69 6e 65 20 2d 20 6e 2c 20 69 6e  ], nLine - n, in
7c40: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  )==0 ){.      if
7c50: 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( n==0 ){.      
7c60: 20 20 66 72 65 65 28 7a 4c 69 6e 65 29 3b 0a 20    free(zLine);. 
7c70: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b         return 0;
7c80: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a  .      }.      z
7c90: 4c 69 6e 65 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20  Line[n] = 0;.   
7ca0: 20 20 20 65 6f 6c 20 3d 20 31 3b 0a 20 20 20 20     eol = 1;.    
7cb0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
7cc0: 20 20 20 77 68 69 6c 65 28 20 7a 4c 69 6e 65 5b     while( zLine[
7cd0: 6e 5d 20 29 7b 20 6e 2b 2b 3b 20 7d 0a 20 20 20  n] ){ n++; }.   
7ce0: 20 69 66 28 20 6e 3e 30 20 26 26 20 7a 4c 69 6e   if( n>0 && zLin
7cf0: 65 5b 6e 2d 31 5d 3d 3d 27 5c 6e 27 20 29 7b 0a  e[n-1]=='\n' ){.
7d00: 20 20 20 20 20 20 6e 2d 2d 3b 0a 20 20 20 20 20        n--;.     
7d10: 20 7a 4c 69 6e 65 5b 6e 5d 20 3d 20 30 3b 0a 20   zLine[n] = 0;. 
7d20: 20 20 20 20 20 65 6f 6c 20 3d 20 31 3b 0a 20 20       eol = 1;.  
7d30: 20 20 7d 0a 20 20 7d 0a 20 20 7a 4c 69 6e 65 20    }.  }.  zLine 
7d40: 3d 20 72 65 61 6c 6c 6f 63 28 20 7a 4c 69 6e 65  = realloc( zLine
7d50: 2c 20 6e 2b 31 20 29 3b 0a 20 20 72 65 74 75 72  , n+1 );.  retur
7d60: 6e 20 7a 4c 69 6e 65 3b 0a 7d 0a 0a 0a 2f 2a 0a  n zLine;.}.../*.
7d70: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
7d80: 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   is part of the 
7d90: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
7da0: 66 20 74 68 65 20 63 6f 6d 6d 61 6e 64 3a 0a 2a  f the command:.*
7db0: 2a 0a 2a 2a 20 20 20 24 64 62 20 74 72 61 6e 73  *.**   $db trans
7dc0: 61 63 74 69 6f 6e 20 5b 2d 64 65 66 65 72 72 65  action [-deferre
7dd0: 64 7c 2d 69 6d 6d 65 64 69 61 74 65 7c 2d 65 78  d|-immediate|-ex
7de0: 63 6c 75 73 69 76 65 5d 20 53 43 52 49 50 54 0a  clusive] SCRIPT.
7df0: 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 69 6e 76 6f  **.** It is invo
7e00: 6b 65 64 20 61 66 74 65 72 20 65 76 61 6c 75 61  ked after evalua
7e10: 74 69 6e 67 20 74 68 65 20 73 63 72 69 70 74 20  ting the script 
7e20: 53 43 52 49 50 54 20 74 6f 20 63 6f 6d 6d 69 74  SCRIPT to commit
7e30: 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20   or rollback.** 
7e40: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
7e50: 6f 72 20 73 61 76 65 70 6f 69 6e 74 20 6f 70 65  or savepoint ope
7e60: 6e 65 64 20 62 79 20 74 68 65 20 5b 74 72 61 6e  ned by the [tran
7e70: 73 61 63 74 69 6f 6e 5d 20 63 6f 6d 6d 61 6e 64  saction] command
7e80: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
7e90: 44 62 54 72 61 6e 73 50 6f 73 74 43 6d 64 28 0a  DbTransPostCmd(.
7ea0: 20 20 43 6c 69 65 6e 74 44 61 74 61 20 64 61 74    ClientData dat
7eb0: 61 5b 5d 2c 20 20 20 20 20 20 20 20 20 20 20 20  a[],            
7ec0: 20 20 20 20 20 20 20 2f 2a 20 64 61 74 61 5b 30         /* data[0
7ed0: 5d 20 69 73 20 74 68 65 20 53 71 6c 69 74 65 33  ] is the Sqlite3
7ee0: 44 62 2a 20 66 6f 72 20 24 64 62 20 2a 2f 0a 20  Db* for $db */. 
7ef0: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
7f00: 65 72 70 2c 20 20 20 20 20 20 20 20 20 20 20 20  erp,            
7f10: 20 20 20 20 20 20 2f 2a 20 54 63 6c 20 69 6e 74        /* Tcl int
7f20: 65 72 70 72 65 74 65 72 20 2a 2f 0a 20 20 69 6e  erpreter */.  in
7f30: 74 20 72 65 73 75 6c 74 20 20 20 20 20 20 20 20  t result        
7f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f50: 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 6f 66 20     /* Result of 
7f60: 65 76 61 6c 75 61 74 69 6e 67 20 53 43 52 49 50  evaluating SCRIP
7f70: 54 20 2a 2f 0a 29 7b 0a 20 20 73 74 61 74 69 63  T */.){.  static
7f80: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 45   const char *azE
7f90: 6e 64 5b 5d 20 3d 20 7b 0a 20 20 20 20 22 52 45  nd[] = {.    "RE
7fa0: 4c 45 41 53 45 20 5f 74 63 6c 5f 74 72 61 6e 73  LEASE _tcl_trans
7fb0: 61 63 74 69 6f 6e 22 2c 20 20 20 20 20 20 20 20  action",        
7fc0: 2f 2a 20 72 63 3d 3d 54 43 4c 5f 45 52 52 4f 52  /* rc==TCL_ERROR
7fd0: 2c 20 6e 54 72 61 6e 73 61 63 74 69 6f 6e 21 3d  , nTransaction!=
7fe0: 30 20 2a 2f 0a 20 20 20 20 22 43 4f 4d 4d 49 54  0 */.    "COMMIT
7ff0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
8000: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 72              /* r
8010: 63 21 3d 54 43 4c 5f 45 52 52 4f 52 2c 20 6e 54  c!=TCL_ERROR, nT
8020: 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 30 20 2a 2f  ransaction==0 */
8030: 0a 20 20 20 20 22 52 4f 4c 4c 42 41 43 4b 20 54  .    "ROLLBACK T
8040: 4f 20 5f 74 63 6c 5f 74 72 61 6e 73 61 63 74 69  O _tcl_transacti
8050: 6f 6e 20 3b 20 52 45 4c 45 41 53 45 20 5f 74 63  on ; RELEASE _tc
8060: 6c 5f 74 72 61 6e 73 61 63 74 69 6f 6e 22 2c 0a  l_transaction",.
8070: 20 20 20 20 22 52 4f 4c 4c 42 41 43 4b 22 20 20      "ROLLBACK"  
8080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8090: 20 20 20 20 20 20 20 2f 2a 20 72 63 3d 3d 54 43         /* rc==TC
80a0: 4c 5f 45 52 52 4f 52 2c 20 6e 54 72 61 6e 73 61  L_ERROR, nTransa
80b0: 63 74 69 6f 6e 3d 3d 30 20 2a 2f 0a 20 20 7d 3b  ction==0 */.  };
80c0: 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62  .  SqliteDb *pDb
80d0: 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 64 61   = (SqliteDb*)da
80e0: 74 61 5b 30 5d 3b 0a 20 20 69 6e 74 20 72 63 20  ta[0];.  int rc 
80f0: 3d 20 72 65 73 75 6c 74 3b 0a 20 20 63 6f 6e 73  = result;.  cons
8100: 74 20 63 68 61 72 20 2a 7a 45 6e 64 3b 0a 0a 20  t char *zEnd;.. 
8110: 20 70 44 62 2d 3e 6e 54 72 61 6e 73 61 63 74 69   pDb->nTransacti
8120: 6f 6e 2d 2d 3b 0a 20 20 7a 45 6e 64 20 3d 20 61  on--;.  zEnd = a
8130: 7a 45 6e 64 5b 28 72 63 3d 3d 54 43 4c 5f 45 52  zEnd[(rc==TCL_ER
8140: 52 4f 52 29 2a 32 20 2b 20 28 70 44 62 2d 3e 6e  ROR)*2 + (pDb->n
8150: 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 30 29 5d  Transaction==0)]
8160: 3b 0a 0a 20 20 70 44 62 2d 3e 64 69 73 61 62 6c  ;..  pDb->disabl
8170: 65 41 75 74 68 2b 2b 3b 0a 20 20 69 66 28 20 73  eAuth++;.  if( s
8180: 71 6c 69 74 65 33 5f 65 78 65 63 28 70 44 62 2d  qlite3_exec(pDb-
8190: 3e 64 62 2c 20 7a 45 6e 64 2c 20 30 2c 20 30 2c  >db, zEnd, 0, 0,
81a0: 20 30 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20   0) ){.      /* 
81b0: 54 68 69 73 20 69 73 20 61 20 74 72 69 63 6b 79  This is a tricky
81c0: 20 73 63 65 6e 61 72 69 6f 20 74 6f 20 68 61 6e   scenario to han
81d0: 64 6c 65 2e 20 54 68 65 20 6d 6f 73 74 20 6c 69  dle. The most li
81e0: 6b 65 6c 79 20 63 61 75 73 65 20 6f 66 20 61 6e  kely cause of an
81f0: 0a 20 20 20 20 20 20 2a 2a 20 65 72 72 6f 72 20  .      ** error 
8200: 69 73 20 74 68 61 74 20 74 68 65 20 65 78 65 63  is that the exec
8210: 28 29 20 61 62 6f 76 65 20 77 61 73 20 61 6e 20  () above was an 
8220: 61 74 74 65 6d 70 74 20 74 6f 20 63 6f 6d 6d 69  attempt to commi
8230: 74 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20  t the .      ** 
8240: 74 6f 70 2d 6c 65 76 65 6c 20 74 72 61 6e 73 61  top-level transa
8250: 63 74 69 6f 6e 20 74 68 61 74 20 72 65 74 75 72  ction that retur
8260: 6e 65 64 20 53 51 4c 49 54 45 5f 42 55 53 59 2e  ned SQLITE_BUSY.
8270: 20 4f 72 2c 20 6c 65 73 73 20 6c 69 6b 65 6c 79   Or, less likely
8280: 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20  ,.      ** that 
8290: 61 6e 20 49 4f 2d 65 72 72 6f 72 20 68 61 73 20  an IO-error has 
82a0: 6f 63 63 75 72 65 64 2e 20 49 6e 20 65 69 74 68  occured. In eith
82b0: 65 72 20 63 61 73 65 2c 20 74 68 72 6f 77 20 61  er case, throw a
82c0: 20 54 63 6c 20 65 78 63 65 70 74 69 6f 6e 0a 20   Tcl exception. 
82d0: 20 20 20 20 20 2a 2a 20 61 6e 64 20 74 72 79 20       ** and try 
82e0: 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20  to rollback the 
82f0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20  transaction..   
8300: 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 42     **.      ** B
8310: 75 74 20 69 74 20 63 6f 75 6c 64 20 61 6c 73 6f  ut it could also
8320: 20 62 65 20 74 68 61 74 20 74 68 65 20 75 73 65   be that the use
8330: 72 20 65 78 65 63 75 74 65 64 20 6f 6e 65 20 6f  r executed one o
8340: 72 20 6d 6f 72 65 20 42 45 47 49 4e 2c 20 0a 20  r more BEGIN, . 
8350: 20 20 20 20 20 2a 2a 20 43 4f 4d 4d 49 54 2c 20       ** COMMIT, 
8360: 53 41 56 45 50 4f 49 4e 54 2c 20 52 45 4c 45 41  SAVEPOINT, RELEA
8370: 53 45 20 6f 72 20 52 4f 4c 4c 42 41 43 4b 20 63  SE or ROLLBACK c
8380: 6f 6d 6d 61 6e 64 73 20 74 68 61 74 20 61 72 65  ommands that are
8390: 20 63 6f 6e 66 75 73 69 6e 67 0a 20 20 20 20 20   confusing.     
83a0: 20 2a 2a 20 74 68 69 73 20 6d 65 74 68 6f 64 27   ** this method'
83b0: 73 20 6c 6f 67 69 63 2e 20 4e 6f 74 20 63 6c 65  s logic. Not cle
83c0: 61 72 20 68 6f 77 20 74 68 69 73 20 77 6f 75 6c  ar how this woul
83d0: 64 20 62 65 20 62 65 73 74 20 68 61 6e 64 6c 65  d be best handle
83e0: 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  d..      */.    
83f0: 69 66 28 20 72 63 21 3d 54 43 4c 5f 45 52 52 4f  if( rc!=TCL_ERRO
8400: 52 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41  R ){.      Tcl_A
8410: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
8420: 72 70 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  rp, sqlite3_errm
8430: 73 67 28 70 44 62 2d 3e 64 62 29 2c 20 30 29 3b  sg(pDb->db), 0);
8440: 0a 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f  .      rc = TCL_
8450: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
8460: 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 44   sqlite3_exec(pD
8470: 62 2d 3e 64 62 2c 20 22 52 4f 4c 4c 42 41 43 4b  b->db, "ROLLBACK
8480: 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 7d  ", 0, 0, 0);.  }
8490: 0a 20 20 70 44 62 2d 3e 64 69 73 61 62 6c 65 41  .  pDb->disableA
84a0: 75 74 68 2d 2d 3b 0a 0a 20 20 72 65 74 75 72 6e  uth--;..  return
84b0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65   rc;.}../*.** Se
84c0: 61 72 63 68 20 74 68 65 20 63 61 63 68 65 20 66  arch the cache f
84d0: 6f 72 20 61 20 70 72 65 70 61 72 65 64 2d 73 74  or a prepared-st
84e0: 61 74 65 6d 65 6e 74 20 6f 62 6a 65 63 74 20 74  atement object t
84f0: 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74  hat implements t
8500: 68 65 0a 2a 2a 20 66 69 72 73 74 20 53 51 4c 20  he.** first SQL 
8510: 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 74 68 65  statement in the
8520: 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20   buffer pointed 
8530: 74 6f 20 62 79 20 70 61 72 61 6d 65 74 65 72 20  to by parameter 
8540: 7a 49 6e 2e 20 49 66 0a 2a 2a 20 6e 6f 20 73 75  zIn. If.** no su
8550: 63 68 20 70 72 65 70 61 72 65 64 2d 73 74 61 74  ch prepared-stat
8560: 65 6d 65 6e 74 20 63 61 6e 20 62 65 20 66 6f 75  ement can be fou
8570: 6e 64 2c 20 61 6c 6c 6f 63 61 74 65 20 61 6e 64  nd, allocate and
8580: 20 70 72 65 70 61 72 65 20 61 20 6e 65 77 0a 2a   prepare a new.*
8590: 2a 20 6f 6e 65 2e 20 49 6e 20 65 69 74 68 65 72  * one. In either
85a0: 20 63 61 73 65 2c 20 62 69 6e 64 20 74 68 65 20   case, bind the 
85b0: 63 75 72 72 65 6e 74 20 76 61 6c 75 65 73 20 6f  current values o
85c0: 66 20 74 68 65 20 72 65 6c 65 76 61 6e 74 20 54  f the relevant T
85d0: 63 6c 0a 2a 2a 20 76 61 72 69 61 62 6c 65 73 20  cl.** variables 
85e0: 74 6f 20 61 6e 79 20 24 76 61 72 2c 20 3a 76 61  to any $var, :va
85f0: 72 20 6f 72 20 40 76 61 72 20 76 61 72 69 61 62  r or @var variab
8600: 6c 65 73 20 69 6e 20 74 68 65 20 73 74 61 74 65  les in the state
8610: 6d 65 6e 74 2e 20 42 65 66 6f 72 65 0a 2a 2a 20  ment. Before.** 
8620: 72 65 74 75 72 6e 69 6e 67 2c 20 73 65 74 20 2a  returning, set *
8630: 70 70 50 72 65 53 74 6d 74 20 74 6f 20 70 6f 69  ppPreStmt to poi
8640: 6e 74 20 74 6f 20 74 68 65 20 70 72 65 70 61 72  nt to the prepar
8650: 65 64 2d 73 74 61 74 65 6d 65 6e 74 20 6f 62 6a  ed-statement obj
8660: 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 4f 75 74 70 75  ect..**.** Outpu
8670: 74 20 70 61 72 61 6d 65 74 65 72 20 2a 70 7a 4f  t parameter *pzO
8680: 75 74 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69  ut is set to poi
8690: 6e 74 20 74 6f 20 74 68 65 20 6e 65 78 74 20 53  nt to the next S
86a0: 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 0a  QL statement in.
86b0: 2a 2a 20 62 75 66 66 65 72 20 7a 49 6e 2c 20 6f  ** buffer zIn, o
86c0: 72 20 74 6f 20 74 68 65 20 27 5c 30 27 20 62 79  r to the '\0' by
86d0: 74 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  te at the end of
86e0: 20 7a 49 6e 20 69 66 20 74 68 65 72 65 20 69 73   zIn if there is
86f0: 20 6e 6f 0a 2a 2a 20 6e 65 78 74 20 73 74 61 74   no.** next stat
8700: 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ement..**.** If 
8710: 73 75 63 63 65 73 73 66 75 6c 2c 20 54 43 4c 5f  successful, TCL_
8720: 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  OK is returned. 
8730: 4f 74 68 65 72 77 69 73 65 2c 20 54 43 4c 5f 45  Otherwise, TCL_E
8740: 52 52 4f 52 20 69 73 20 72 65 74 75 72 6e 65 64  RROR is returned
8750: 0a 2a 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f 72  .** and an error
8760: 20 6d 65 73 73 61 67 65 20 6c 6f 61 64 65 64 20   message loaded 
8770: 69 6e 74 6f 20 69 6e 74 65 72 70 72 65 74 65 72  into interpreter
8780: 20 70 44 62 2d 3e 69 6e 74 65 72 70 2e 0a 2a 2f   pDb->interp..*/
8790: 0a 73 74 61 74 69 63 20 69 6e 74 20 64 62 50 72  .static int dbPr
87a0: 65 70 61 72 65 41 6e 64 42 69 6e 64 28 0a 20 20  epareAndBind(.  
87b0: 53 71 6c 69 74 65 44 62 20 2a 70 44 62 2c 20 20  SqliteDb *pDb,  
87c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
87d0: 2f 2a 20 44 61 74 61 62 61 73 65 20 6f 62 6a 65  /* Database obje
87e0: 63 74 20 2a 2f 0a 20 20 63 68 61 72 20 63 6f 6e  ct */.  char con
87f0: 73 74 20 2a 7a 49 6e 2c 20 20 20 20 20 20 20 20  st *zIn,        
8800: 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 20 74          /* SQL t
8810: 6f 20 63 6f 6d 70 69 6c 65 20 2a 2f 0a 20 20 63  o compile */.  c
8820: 68 61 72 20 63 6f 6e 73 74 20 2a 2a 70 7a 4f 75  har const **pzOu
8830: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  t,             /
8840: 2a 20 4f 55 54 3a 20 50 6f 69 6e 74 65 72 20 74  * OUT: Pointer t
8850: 6f 20 6e 65 78 74 20 53 51 4c 20 73 74 61 74 65  o next SQL state
8860: 6d 65 6e 74 20 2a 2f 0a 20 20 53 71 6c 50 72 65  ment */.  SqlPre
8870: 70 61 72 65 64 53 74 6d 74 20 2a 2a 70 70 50 72  paredStmt **ppPr
8880: 65 53 74 6d 74 20 20 20 20 20 2f 2a 20 4f 55 54  eStmt     /* OUT
8890: 3a 20 4f 62 6a 65 63 74 20 75 73 65 64 20 74 6f  : Object used to
88a0: 20 63 61 63 68 65 20 73 74 61 74 65 6d 65 6e 74   cache statement
88b0: 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63   */.){.  const c
88c0: 68 61 72 20 2a 7a 53 71 6c 20 3d 20 7a 49 6e 3b  har *zSql = zIn;
88d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
88e0: 74 65 72 20 74 6f 20 66 69 72 73 74 20 53 51 4c  ter to first SQL
88f0: 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 7a 49   statement in zI
8900: 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73  n */.  sqlite3_s
8910: 74 6d 74 20 2a 70 53 74 6d 74 3b 20 20 20 20 20  tmt *pStmt;     
8920: 20 20 20 20 20 20 20 2f 2a 20 50 72 65 70 61 72         /* Prepar
8930: 65 64 20 73 74 61 74 65 6d 65 6e 74 20 6f 62 6a  ed statement obj
8940: 65 63 74 20 2a 2f 0a 20 20 53 71 6c 50 72 65 70  ect */.  SqlPrep
8950: 61 72 65 64 53 74 6d 74 20 2a 70 50 72 65 53 74  aredStmt *pPreSt
8960: 6d 74 3b 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e  mt;      /* Poin
8970: 74 65 72 20 74 6f 20 63 61 63 68 65 64 20 73 74  ter to cached st
8980: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  atement */.  int
8990: 20 6e 53 71 6c 3b 20 20 20 20 20 20 20 20 20 20   nSql;          
89a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
89b0: 4c 65 6e 67 74 68 20 6f 66 20 7a 53 71 6c 20 69  Length of zSql i
89c0: 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74  n bytes */.  int
89d0: 20 6e 56 61 72 3b 20 20 20 20 20 20 20 20 20 20   nVar;          
89e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
89f0: 4e 75 6d 62 65 72 20 6f 66 20 76 61 72 69 61 62  Number of variab
8a00: 6c 65 73 20 69 6e 20 73 74 61 74 65 6d 65 6e 74  les in statement
8a10: 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 6d 20   */.  int iParm 
8a20: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
8a30: 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 66 72        /* Next fr
8a40: 65 65 20 65 6e 74 72 79 20 69 6e 20 61 70 50 61  ee entry in apPa
8a50: 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 0a 20  rm */.  int i;. 
8a60: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
8a70: 65 72 70 20 3d 20 70 44 62 2d 3e 69 6e 74 65 72  erp = pDb->inter
8a80: 70 3b 0a 0a 20 20 2a 70 70 50 72 65 53 74 6d 74  p;..  *ppPreStmt
8a90: 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 54 72 69 6d   = 0;..  /* Trim
8aa0: 20 73 70 61 63 65 73 20 66 72 6f 6d 20 74 68 65   spaces from the
8ab0: 20 73 74 61 72 74 20 6f 66 20 7a 53 71 6c 20 61   start of zSql a
8ac0: 6e 64 20 63 61 6c 63 75 6c 61 74 65 20 74 68 65  nd calculate the
8ad0: 20 72 65 6d 61 69 6e 69 6e 67 20 6c 65 6e 67 74   remaining lengt
8ae0: 68 2e 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 69  h. */.  while( i
8af0: 73 73 70 61 63 65 28 7a 53 71 6c 5b 30 5d 29 20  sspace(zSql[0]) 
8b00: 29 7b 20 7a 53 71 6c 2b 2b 3b 20 7d 0a 20 20 6e  ){ zSql++; }.  n
8b10: 53 71 6c 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a  Sql = strlen30(z
8b20: 53 71 6c 29 3b 0a 0a 20 20 66 6f 72 28 70 50 72  Sql);..  for(pPr
8b30: 65 53 74 6d 74 20 3d 20 70 44 62 2d 3e 73 74 6d  eStmt = pDb->stm
8b40: 74 4c 69 73 74 3b 20 70 50 72 65 53 74 6d 74 3b  tList; pPreStmt;
8b50: 20 70 50 72 65 53 74 6d 74 3d 70 50 72 65 53 74   pPreStmt=pPreSt
8b60: 6d 74 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  mt->pNext){.    
8b70: 69 6e 74 20 6e 20 3d 20 70 50 72 65 53 74 6d 74  int n = pPreStmt
8b80: 2d 3e 6e 53 71 6c 3b 0a 20 20 20 20 69 66 28 20  ->nSql;.    if( 
8b90: 6e 53 71 6c 3e 3d 6e 20 0a 20 20 20 20 20 20 20  nSql>=n .       
8ba0: 20 26 26 20 6d 65 6d 63 6d 70 28 70 50 72 65 53   && memcmp(pPreS
8bb0: 74 6d 74 2d 3e 7a 53 71 6c 2c 20 7a 53 71 6c 2c  tmt->zSql, zSql,
8bc0: 20 6e 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 26   n)==0.        &
8bd0: 26 20 28 7a 53 71 6c 5b 6e 5d 3d 3d 30 20 7c 7c  & (zSql[n]==0 ||
8be0: 20 7a 53 71 6c 5b 6e 2d 31 5d 3d 3d 27 3b 27 29   zSql[n-1]==';')
8bf0: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 70 53  .    ){.      pS
8c00: 74 6d 74 20 3d 20 70 50 72 65 53 74 6d 74 2d 3e  tmt = pPreStmt->
8c10: 70 53 74 6d 74 3b 0a 20 20 20 20 20 20 2a 70 7a  pStmt;.      *pz
8c20: 4f 75 74 20 3d 20 26 7a 53 71 6c 5b 70 50 72 65  Out = &zSql[pPre
8c30: 53 74 6d 74 2d 3e 6e 53 71 6c 5d 3b 0a 0a 20 20  Stmt->nSql];..  
8c40: 20 20 20 20 2f 2a 20 57 68 65 6e 20 61 20 70 72      /* When a pr
8c50: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
8c60: 20 69 73 20 66 6f 75 6e 64 2c 20 75 6e 6c 69 6e   is found, unlin
8c70: 6b 20 69 74 20 66 72 6f 6d 20 74 68 65 0a 20 20  k it from the.  
8c80: 20 20 20 20 2a 2a 20 63 61 63 68 65 20 6c 69 73      ** cache lis
8c90: 74 2e 20 20 49 74 20 77 69 6c 6c 20 6c 61 74 65  t.  It will late
8ca0: 72 20 62 65 20 61 64 64 65 64 20 62 61 63 6b 20  r be added back 
8cb0: 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  to the beginning
8cc0: 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  .      ** of the
8cd0: 20 63 61 63 68 65 20 6c 69 73 74 20 69 6e 20 6f   cache list in o
8ce0: 72 64 65 72 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  rder to implemen
8cf0: 74 20 4c 52 55 20 72 65 70 6c 61 63 65 6d 65 6e  t LRU replacemen
8d00: 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  t..      */.    
8d10: 20 20 69 66 28 20 70 50 72 65 53 74 6d 74 2d 3e    if( pPreStmt->
8d20: 70 50 72 65 76 20 29 7b 0a 20 20 20 20 20 20 20  pPrev ){.       
8d30: 20 70 50 72 65 53 74 6d 74 2d 3e 70 50 72 65 76   pPreStmt->pPrev
8d40: 2d 3e 70 4e 65 78 74 20 3d 20 70 50 72 65 53 74  ->pNext = pPreSt
8d50: 6d 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  mt->pNext;.     
8d60: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
8d70: 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74 20 3d 20  pDb->stmtList = 
8d80: 70 50 72 65 53 74 6d 74 2d 3e 70 4e 65 78 74 3b  pPreStmt->pNext;
8d90: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
8da0: 66 28 20 70 50 72 65 53 74 6d 74 2d 3e 70 4e 65  f( pPreStmt->pNe
8db0: 78 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50  xt ){.        pP
8dc0: 72 65 53 74 6d 74 2d 3e 70 4e 65 78 74 2d 3e 70  reStmt->pNext->p
8dd0: 50 72 65 76 20 3d 20 70 50 72 65 53 74 6d 74 2d  Prev = pPreStmt-
8de0: 3e 70 50 72 65 76 3b 0a 20 20 20 20 20 20 7d 65  >pPrev;.      }e
8df0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 44 62  lse{.        pDb
8e00: 2d 3e 73 74 6d 74 4c 61 73 74 20 3d 20 70 50 72  ->stmtLast = pPr
8e10: 65 53 74 6d 74 2d 3e 70 50 72 65 76 3b 0a 20 20  eStmt->pPrev;.  
8e20: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 44 62 2d      }.      pDb-
8e30: 3e 6e 53 74 6d 74 2d 2d 3b 0a 20 20 20 20 20 20  >nStmt--;.      
8e40: 6e 56 61 72 20 3d 20 73 71 6c 69 74 65 33 5f 62  nVar = sqlite3_b
8e50: 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 63 6f  ind_parameter_co
8e60: 75 6e 74 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  unt(pStmt);.    
8e70: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
8e80: 20 7d 0a 20 20 0a 20 20 2f 2a 20 49 66 20 6e 6f   }.  .  /* If no
8e90: 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
8ea0: 65 6e 74 20 77 61 73 20 66 6f 75 6e 64 2e 20 43  ent was found. C
8eb0: 6f 6d 70 69 6c 65 20 74 68 65 20 53 51 4c 20 74  ompile the SQL t
8ec0: 65 78 74 2e 20 41 6c 73 6f 20 61 6c 6c 6f 63 61  ext. Also alloca
8ed0: 74 65 0a 20 20 2a 2a 20 61 20 6e 65 77 20 53 71  te.  ** a new Sq
8ee0: 6c 50 72 65 70 61 72 65 64 53 74 6d 74 20 73 74  lPreparedStmt st
8ef0: 72 75 63 74 75 72 65 2e 20 20 2a 2f 0a 20 20 69  ructure.  */.  i
8f00: 66 28 20 70 50 72 65 53 74 6d 74 3d 3d 30 20 29  f( pPreStmt==0 )
8f10: 7b 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65 3b  {.    int nByte;
8f20: 0a 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45  ..    if( SQLITE
8f30: 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 5f 70 72 65  _OK!=sqlite3_pre
8f40: 70 61 72 65 5f 76 32 28 70 44 62 2d 3e 64 62 2c  pare_v2(pDb->db,
8f50: 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d   zSql, -1, &pStm
8f60: 74 2c 20 70 7a 4f 75 74 29 20 29 7b 0a 20 20 20  t, pzOut) ){.   
8f70: 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73     Tcl_SetObjRes
8f80: 75 6c 74 28 69 6e 74 65 72 70 2c 20 64 62 54 65  ult(interp, dbTe
8f90: 78 74 54 6f 4f 62 6a 28 73 71 6c 69 74 65 33 5f  xtToObj(sqlite3_
8fa0: 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62 29 29  errmsg(pDb->db))
8fb0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
8fc0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
8fd0: 0a 20 20 20 20 69 66 28 20 70 53 74 6d 74 3d 3d  .    if( pStmt==
8fe0: 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 53  0 ){.      if( S
8ff0: 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65  QLITE_OK!=sqlite
9000: 33 5f 65 72 72 63 6f 64 65 28 70 44 62 2d 3e 64  3_errcode(pDb->d
9010: 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  b) ){.        /*
9020: 20 41 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20   A compile-time 
9030: 65 72 72 6f 72 20 69 6e 20 74 68 65 20 73 74 61  error in the sta
9040: 74 65 6d 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 20  tement. */.     
9050: 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73     Tcl_SetObjRes
9060: 75 6c 74 28 69 6e 74 65 72 70 2c 20 64 62 54 65  ult(interp, dbTe
9070: 78 74 54 6f 4f 62 6a 28 73 71 6c 69 74 65 33 5f  xtToObj(sqlite3_
9080: 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62 29 29  errmsg(pDb->db))
9090: 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
90a0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
90b0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
90c0: 20 20 2f 2a 20 54 68 65 20 73 74 61 74 65 6d 65    /* The stateme
90d0: 6e 74 20 77 61 73 20 61 20 6e 6f 2d 6f 70 2e 20  nt was a no-op. 
90e0: 20 43 6f 6e 74 69 6e 75 65 20 74 6f 20 74 68 65   Continue to the
90f0: 20 6e 65 78 74 20 73 74 61 74 65 6d 65 6e 74 0a   next statement.
9100: 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68          ** in th
9110: 65 20 53 51 4c 20 73 74 72 69 6e 67 2e 0a 20 20  e SQL string..  
9120: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
9130: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
9140: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
9150: 20 20 20 61 73 73 65 72 74 28 20 70 50 72 65 53     assert( pPreS
9160: 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20 6e 56  tmt==0 );.    nV
9170: 61 72 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e  ar = sqlite3_bin
9180: 64 5f 70 61 72 61 6d 65 74 65 72 5f 63 6f 75 6e  d_parameter_coun
9190: 74 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 6e 42  t(pStmt);.    nB
91a0: 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 53 71 6c  yte = sizeof(Sql
91b0: 50 72 65 70 61 72 65 64 53 74 6d 74 29 20 2b 20  PreparedStmt) + 
91c0: 6e 56 61 72 2a 73 69 7a 65 6f 66 28 54 63 6c 5f  nVar*sizeof(Tcl_
91d0: 4f 62 6a 20 2a 29 3b 0a 20 20 20 20 70 50 72 65  Obj *);.    pPre
91e0: 53 74 6d 74 20 3d 20 28 53 71 6c 50 72 65 70 61  Stmt = (SqlPrepa
91f0: 72 65 64 53 74 6d 74 2a 29 54 63 6c 5f 41 6c 6c  redStmt*)Tcl_All
9200: 6f 63 28 6e 42 79 74 65 29 3b 0a 20 20 20 20 6d  oc(nByte);.    m
9210: 65 6d 73 65 74 28 70 50 72 65 53 74 6d 74 2c 20  emset(pPreStmt, 
9220: 30 2c 20 6e 42 79 74 65 29 3b 0a 0a 20 20 20 20  0, nByte);..    
9230: 70 50 72 65 53 74 6d 74 2d 3e 70 53 74 6d 74 20  pPreStmt->pStmt 
9240: 3d 20 70 53 74 6d 74 3b 0a 20 20 20 20 70 50 72  = pStmt;.    pPr
9250: 65 53 74 6d 74 2d 3e 6e 53 71 6c 20 3d 20 28 2a  eStmt->nSql = (*
9260: 70 7a 4f 75 74 20 2d 20 7a 53 71 6c 29 3b 0a 20  pzOut - zSql);. 
9270: 20 20 20 70 50 72 65 53 74 6d 74 2d 3e 7a 53 71     pPreStmt->zSq
9280: 6c 20 3d 20 73 71 6c 69 74 65 33 5f 73 71 6c 28  l = sqlite3_sql(
9290: 70 53 74 6d 74 29 3b 0a 20 20 20 20 70 50 72 65  pStmt);.    pPre
92a0: 53 74 6d 74 2d 3e 61 70 50 61 72 6d 20 3d 20 28  Stmt->apParm = (
92b0: 54 63 6c 5f 4f 62 6a 20 2a 2a 29 26 70 50 72 65  Tcl_Obj **)&pPre
92c0: 53 74 6d 74 5b 31 5d 3b 0a 20 20 7d 0a 20 20 61  Stmt[1];.  }.  a
92d0: 73 73 65 72 74 28 20 70 50 72 65 53 74 6d 74 20  ssert( pPreStmt 
92e0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 74 72  );.  assert( str
92f0: 6c 65 6e 33 30 28 70 50 72 65 53 74 6d 74 2d 3e  len30(pPreStmt->
9300: 7a 53 71 6c 29 3d 3d 70 50 72 65 53 74 6d 74 2d  zSql)==pPreStmt-
9310: 3e 6e 53 71 6c 20 29 3b 0a 20 20 61 73 73 65 72  >nSql );.  asser
9320: 74 28 20 30 3d 3d 6d 65 6d 63 6d 70 28 70 50 72  t( 0==memcmp(pPr
9330: 65 53 74 6d 74 2d 3e 7a 53 71 6c 2c 20 7a 53 71  eStmt->zSql, zSq
9340: 6c 2c 20 70 50 72 65 53 74 6d 74 2d 3e 6e 53 71  l, pPreStmt->nSq
9350: 6c 29 20 29 3b 0a 0a 20 20 2f 2a 20 42 69 6e 64  l) );..  /* Bind
9360: 20 76 61 6c 75 65 73 20 74 6f 20 70 61 72 61 6d   values to param
9370: 65 74 65 72 73 20 74 68 61 74 20 62 65 67 69 6e  eters that begin
9380: 20 77 69 74 68 20 24 20 6f 72 20 3a 20 2a 2f 20   with $ or : */ 
9390: 20 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d   .  for(i=1; i<=
93a0: 6e 56 61 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nVar; i++){.    
93b0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 61 72  const char *zVar
93c0: 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f   = sqlite3_bind_
93d0: 70 61 72 61 6d 65 74 65 72 5f 6e 61 6d 65 28 70  parameter_name(p
93e0: 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 69 66  Stmt, i);.    if
93f0: 28 20 7a 56 61 72 21 3d 30 20 26 26 20 28 7a 56  ( zVar!=0 && (zV
9400: 61 72 5b 30 5d 3d 3d 27 24 27 20 7c 7c 20 7a 56  ar[0]=='$' || zV
9410: 61 72 5b 30 5d 3d 3d 27 3a 27 20 7c 7c 20 7a 56  ar[0]==':' || zV
9420: 61 72 5b 30 5d 3d 3d 27 40 27 29 20 29 7b 0a 20  ar[0]=='@') ){. 
9430: 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 56       Tcl_Obj *pV
9440: 61 72 20 3d 20 54 63 6c 5f 47 65 74 56 61 72 32  ar = Tcl_GetVar2
9450: 45 78 28 69 6e 74 65 72 70 2c 20 26 7a 56 61 72  Ex(interp, &zVar
9460: 5b 31 5d 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  [1], 0, 0);.    
9470: 20 20 69 66 28 20 70 56 61 72 20 29 7b 0a 20 20    if( pVar ){.  
9480: 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20        int n;.   
9490: 20 20 20 20 20 75 38 20 2a 64 61 74 61 3b 0a 20       u8 *data;. 
94a0: 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
94b0: 72 20 2a 7a 54 79 70 65 20 3d 20 28 70 56 61 72  r *zType = (pVar
94c0: 2d 3e 74 79 70 65 50 74 72 20 3f 20 70 56 61 72  ->typePtr ? pVar
94d0: 2d 3e 74 79 70 65 50 74 72 2d 3e 6e 61 6d 65 20  ->typePtr->name 
94e0: 3a 20 22 22 29 3b 0a 20 20 20 20 20 20 20 20 63  : "");.        c
94f0: 68 61 72 20 63 20 3d 20 7a 54 79 70 65 5b 30 5d  har c = zType[0]
9500: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 56  ;.        if( zV
9510: 61 72 5b 30 5d 3d 3d 27 40 27 20 7c 7c 0a 20 20  ar[0]=='@' ||.  
9520: 20 20 20 20 20 20 20 20 20 28 63 3d 3d 27 62 27           (c=='b'
9530: 20 26 26 20 73 74 72 63 6d 70 28 7a 54 79 70 65   && strcmp(zType
9540: 2c 22 62 79 74 65 61 72 72 61 79 22 29 3d 3d 30  ,"bytearray")==0
9550: 20 26 26 20 70 56 61 72 2d 3e 62 79 74 65 73 3d   && pVar->bytes=
9560: 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  =0) ){.         
9570: 20 2f 2a 20 4c 6f 61 64 20 61 20 42 4c 4f 42 20   /* Load a BLOB 
9580: 74 79 70 65 20 69 66 20 74 68 65 20 54 63 6c 20  type if the Tcl 
9590: 76 61 72 69 61 62 6c 65 20 69 73 20 61 20 62 79  variable is a by
95a0: 74 65 61 72 72 61 79 20 61 6e 64 0a 20 20 20 20  tearray and.    
95b0: 20 20 20 20 20 20 2a 2a 20 69 74 20 68 61 73 20        ** it has 
95c0: 6e 6f 20 73 74 72 69 6e 67 20 72 65 70 72 65 73  no string repres
95d0: 65 6e 74 61 74 69 6f 6e 20 6f 72 20 74 68 65 20  entation or the 
95e0: 68 6f 73 74 0a 20 20 20 20 20 20 20 20 20 20 2a  host.          *
95f0: 2a 20 70 61 72 61 6d 65 74 65 72 20 6e 61 6d 65  * parameter name
9600: 20 62 65 67 69 6e 73 20 77 69 74 68 20 22 40 22   begins with "@"
9610: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 64  . */.          d
9620: 61 74 61 20 3d 20 54 63 6c 5f 47 65 74 42 79 74  ata = Tcl_GetByt
9630: 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 70 56  eArrayFromObj(pV
9640: 61 72 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 20  ar, &n);.       
9650: 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
9660: 62 6c 6f 62 28 70 53 74 6d 74 2c 20 69 2c 20 64  blob(pStmt, i, d
9670: 61 74 61 2c 20 6e 2c 20 53 51 4c 49 54 45 5f 53  ata, n, SQLITE_S
9680: 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 20 20  TATIC);.        
9690: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
96a0: 6e 74 28 70 56 61 72 29 3b 0a 20 20 20 20 20 20  nt(pVar);.      
96b0: 20 20 20 20 70 50 72 65 53 74 6d 74 2d 3e 61 70      pPreStmt->ap
96c0: 50 61 72 6d 5b 69 50 61 72 6d 2b 2b 5d 20 3d 20  Parm[iParm++] = 
96d0: 70 56 61 72 3b 0a 20 20 20 20 20 20 20 20 7d 65  pVar;.        }e
96e0: 6c 73 65 20 69 66 28 20 63 3d 3d 27 62 27 20 26  lse if( c=='b' &
96f0: 26 20 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22  & strcmp(zType,"
9700: 62 6f 6f 6c 65 61 6e 22 29 3d 3d 30 20 29 7b 0a  boolean")==0 ){.
9710: 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65            Tcl_Ge
9720: 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
9730: 72 70 2c 20 70 56 61 72 2c 20 26 6e 29 3b 0a 20  rp, pVar, &n);. 
9740: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
9750: 5f 62 69 6e 64 5f 69 6e 74 28 70 53 74 6d 74 2c  _bind_int(pStmt,
9760: 20 69 2c 20 6e 29 3b 0a 20 20 20 20 20 20 20 20   i, n);.        
9770: 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 64 27  }else if( c=='d'
9780: 20 26 26 20 73 74 72 63 6d 70 28 7a 54 79 70 65   && strcmp(zType
9790: 2c 22 64 6f 75 62 6c 65 22 29 3d 3d 30 20 29 7b  ,"double")==0 ){
97a0: 0a 20 20 20 20 20 20 20 20 20 20 64 6f 75 62 6c  .          doubl
97b0: 65 20 72 3b 0a 20 20 20 20 20 20 20 20 20 20 54  e r;.          T
97c0: 63 6c 5f 47 65 74 44 6f 75 62 6c 65 46 72 6f 6d  cl_GetDoubleFrom
97d0: 4f 62 6a 28 69 6e 74 65 72 70 2c 20 70 56 61 72  Obj(interp, pVar
97e0: 2c 20 26 72 29 3b 0a 20 20 20 20 20 20 20 20 20  , &r);.         
97f0: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 64 6f   sqlite3_bind_do
9800: 75 62 6c 65 28 70 53 74 6d 74 2c 20 69 2c 20 72  uble(pStmt, i, r
9810: 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
9820: 20 69 66 28 20 28 63 3d 3d 27 77 27 20 26 26 20   if( (c=='w' && 
9830: 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22 77 69  strcmp(zType,"wi
9840: 64 65 49 6e 74 22 29 3d 3d 30 29 20 7c 7c 0a 20  deInt")==0) ||. 
9850: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 3d               (c=
9860: 3d 27 69 27 20 26 26 20 73 74 72 63 6d 70 28 7a  ='i' && strcmp(z
9870: 54 79 70 65 2c 22 69 6e 74 22 29 3d 3d 30 29 20  Type,"int")==0) 
9880: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c  ){.          Tcl
9890: 5f 57 69 64 65 49 6e 74 20 76 3b 0a 20 20 20 20  _WideInt v;.    
98a0: 20 20 20 20 20 20 54 63 6c 5f 47 65 74 57 69 64        Tcl_GetWid
98b0: 65 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  eIntFromObj(inte
98c0: 72 70 2c 20 70 56 61 72 2c 20 26 76 29 3b 0a 20  rp, pVar, &v);. 
98d0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
98e0: 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 53 74 6d  _bind_int64(pStm
98f0: 74 2c 20 69 2c 20 76 29 3b 0a 20 20 20 20 20 20  t, i, v);.      
9900: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
9910: 20 20 20 64 61 74 61 20 3d 20 28 75 6e 73 69 67     data = (unsig
9920: 6e 65 64 20 63 68 61 72 20 2a 29 54 63 6c 5f 47  ned char *)Tcl_G
9930: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
9940: 70 56 61 72 2c 20 26 6e 29 3b 0a 20 20 20 20 20  pVar, &n);.     
9950: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e       sqlite3_bin
9960: 64 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 69 2c  d_text(pStmt, i,
9970: 20 28 63 68 61 72 20 2a 29 64 61 74 61 2c 20 6e   (char *)data, n
9980: 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
9990: 3b 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f  ;.          Tcl_
99a0: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 56 61  IncrRefCount(pVa
99b0: 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50  r);.          pP
99c0: 72 65 53 74 6d 74 2d 3e 61 70 50 61 72 6d 5b 69  reStmt->apParm[i
99d0: 50 61 72 6d 2b 2b 5d 20 3d 20 70 56 61 72 3b 0a  Parm++] = pVar;.
99e0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
99f0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
9a00: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c  qlite3_bind_null
9a10: 28 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20  (pStmt, i);.    
9a20: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
9a30: 70 50 72 65 53 74 6d 74 2d 3e 6e 50 61 72 6d 20  pPreStmt->nParm 
9a40: 3d 20 69 50 61 72 6d 3b 0a 20 20 2a 70 70 50 72  = iParm;.  *ppPr
9a50: 65 53 74 6d 74 20 3d 20 70 50 72 65 53 74 6d 74  eStmt = pPreStmt
9a60: 3b 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  ;..  return TCL_
9a70: 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65  OK;.}.../*.** Re
9a80: 6c 65 61 73 65 20 61 20 73 74 61 74 65 6d 65 6e  lease a statemen
9a90: 74 20 72 65 66 65 72 65 6e 63 65 20 6f 62 74 61  t reference obta
9aa0: 69 6e 65 64 20 62 79 20 63 61 6c 6c 69 6e 67 20  ined by calling 
9ab0: 64 62 50 72 65 70 61 72 65 41 6e 64 42 69 6e 64  dbPrepareAndBind
9ac0: 28 29 2e 0a 2a 2a 20 54 68 65 72 65 20 73 68 6f  ()..** There sho
9ad0: 75 6c 64 20 62 65 20 65 78 61 63 74 6c 79 20 6f  uld be exactly o
9ae0: 6e 65 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20  ne call to this 
9af0: 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 65 61 63  function for eac
9b00: 68 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20 64 62 50  h call to.** dbP
9b10: 72 65 70 61 72 65 41 6e 64 42 69 6e 64 28 29 2e  repareAndBind().
9b20: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 69  .**.** If the di
9b30: 73 63 61 72 64 20 70 61 72 61 6d 65 74 65 72 20  scard parameter 
9b40: 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
9b50: 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  n the statement 
9b60: 69 73 20 64 65 6c 65 74 65 64 0a 2a 2a 20 69 6d  is deleted.** im
9b70: 6d 65 64 69 61 74 65 6c 79 2e 20 4f 74 68 65 72  mediately. Other
9b80: 77 69 73 65 20 69 74 20 69 73 20 61 64 64 65 64  wise it is added
9b90: 20 74 6f 20 74 68 65 20 4c 52 55 20 6c 69 73 74   to the LRU list
9ba0: 20 61 6e 64 20 6d 61 79 20 62 65 20 72 65 74 75   and may be retu
9bb0: 72 6e 65 64 0a 2a 2a 20 62 79 20 61 20 73 75 62  rned.** by a sub
9bc0: 73 65 71 75 65 6e 74 20 63 61 6c 6c 20 74 6f 20  sequent call to 
9bd0: 64 62 50 72 65 70 61 72 65 41 6e 64 42 69 6e 64  dbPrepareAndBind
9be0: 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ()..*/.static vo
9bf0: 69 64 20 64 62 52 65 6c 65 61 73 65 53 74 6d 74  id dbReleaseStmt
9c00: 28 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44  (.  SqliteDb *pD
9c10: 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
9c20: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
9c30: 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 53 71 6c 50  handle */.  SqlP
9c40: 72 65 70 61 72 65 64 53 74 6d 74 20 2a 70 50 72  reparedStmt *pPr
9c50: 65 53 74 6d 74 2c 20 20 20 20 20 20 2f 2a 20 50  eStmt,      /* P
9c60: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
9c70: 74 20 68 61 6e 64 6c 65 20 74 6f 20 72 65 6c 65  t handle to rele
9c80: 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 64 69 73  ase */.  int dis
9c90: 63 61 72 64 20 20 20 20 20 20 20 20 20 20 20 20  card            
9ca0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
9cb0: 20 74 6f 20 64 65 6c 65 74 65 20 28 6e 6f 74 20   to delete (not 
9cc0: 63 61 63 68 65 29 20 74 68 65 20 70 50 72 65 53  cache) the pPreS
9cd0: 74 6d 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  tmt */.){.  int 
9ce0: 69 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20 74 68  i;..  /* Free th
9cf0: 65 20 62 6f 75 6e 64 20 73 74 72 69 6e 67 20 61  e bound string a
9d00: 6e 64 20 62 6c 6f 62 20 70 61 72 61 6d 65 74 65  nd blob paramete
9d10: 72 73 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  rs */.  for(i=0;
9d20: 20 69 3c 70 50 72 65 53 74 6d 74 2d 3e 6e 50 61   i<pPreStmt->nPa
9d30: 72 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 54 63  rm; i++){.    Tc
9d40: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70  l_DecrRefCount(p
9d50: 50 72 65 53 74 6d 74 2d 3e 61 70 50 61 72 6d 5b  PreStmt->apParm[
9d60: 69 5d 29 3b 0a 20 20 7d 0a 20 20 70 50 72 65 53  i]);.  }.  pPreS
9d70: 74 6d 74 2d 3e 6e 50 61 72 6d 20 3d 20 30 3b 0a  tmt->nParm = 0;.
9d80: 0a 20 20 69 66 28 20 70 44 62 2d 3e 6d 61 78 53  .  if( pDb->maxS
9d90: 74 6d 74 3c 3d 30 20 7c 7c 20 64 69 73 63 61 72  tmt<=0 || discar
9da0: 64 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  d ){.    /* If t
9db0: 68 65 20 63 61 63 68 65 20 69 73 20 74 75 72 6e  he cache is turn
9dc0: 65 64 20 6f 66 66 2c 20 64 65 61 6c 6c 6f 63 61  ed off, dealloca
9dd0: 74 65 64 20 74 68 65 20 73 74 61 74 65 6d 65 6e  ted the statemen
9de0: 74 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  t */.    sqlite3
9df0: 5f 66 69 6e 61 6c 69 7a 65 28 70 50 72 65 53 74  _finalize(pPreSt
9e00: 6d 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 20 20  mt->pStmt);.    
9e10: 54 63 6c 5f 46 72 65 65 28 28 63 68 61 72 20 2a  Tcl_Free((char *
9e20: 29 70 50 72 65 53 74 6d 74 29 3b 0a 20 20 7d 65  )pPreStmt);.  }e
9e30: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 41 64 64 20  lse{.    /* Add 
9e40: 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61  the prepared sta
9e50: 74 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 62 65  tement to the be
9e60: 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 63  ginning of the c
9e70: 61 63 68 65 20 6c 69 73 74 2e 20 2a 2f 0a 20 20  ache list. */.  
9e80: 20 20 70 50 72 65 53 74 6d 74 2d 3e 70 4e 65 78    pPreStmt->pNex
9e90: 74 20 3d 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73  t = pDb->stmtLis
9ea0: 74 3b 0a 20 20 20 20 70 50 72 65 53 74 6d 74 2d  t;.    pPreStmt-
9eb0: 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 20 20  >pPrev = 0;.    
9ec0: 69 66 28 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73  if( pDb->stmtLis
9ed0: 74 20 29 7b 0a 20 20 20 20 20 70 44 62 2d 3e 73  t ){.     pDb->s
9ee0: 74 6d 74 4c 69 73 74 2d 3e 70 50 72 65 76 20 3d  tmtList->pPrev =
9ef0: 20 70 50 72 65 53 74 6d 74 3b 0a 20 20 20 20 7d   pPreStmt;.    }
9f00: 0a 20 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c 69  .    pDb->stmtLi
9f10: 73 74 20 3d 20 70 50 72 65 53 74 6d 74 3b 0a 20  st = pPreStmt;. 
9f20: 20 20 20 69 66 28 20 70 44 62 2d 3e 73 74 6d 74     if( pDb->stmt
9f30: 4c 61 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Last==0 ){.     
9f40: 20 61 73 73 65 72 74 28 20 70 44 62 2d 3e 6e 53   assert( pDb->nS
9f50: 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  tmt==0 );.      
9f60: 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74 20 3d 20  pDb->stmtLast = 
9f70: 70 50 72 65 53 74 6d 74 3b 0a 20 20 20 20 7d 65  pPreStmt;.    }e
9f80: 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
9f90: 74 28 20 70 44 62 2d 3e 6e 53 74 6d 74 3e 30 20  t( pDb->nStmt>0 
9fa0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 44 62  );.    }.    pDb
9fb0: 2d 3e 6e 53 74 6d 74 2b 2b 3b 0a 20 20 20 0a 20  ->nStmt++;.   . 
9fc0: 20 20 20 2f 2a 20 49 66 20 77 65 20 68 61 76 65     /* If we have
9fd0: 20 74 6f 6f 20 6d 61 6e 79 20 73 74 61 74 65 6d   too many statem
9fe0: 65 6e 74 20 69 6e 20 63 61 63 68 65 2c 20 72 65  ent in cache, re
9ff0: 6d 6f 76 65 20 74 68 65 20 73 75 72 70 6c 75 73  move the surplus
a000: 20 66 72 6f 6d 20 0a 20 20 20 20 2a 2a 20 74 68   from .    ** th
a010: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 63 61 63  e end of the cac
a020: 68 65 20 6c 69 73 74 2e 20 20 2a 2f 0a 20 20 20  he list.  */.   
a030: 20 77 68 69 6c 65 28 20 70 44 62 2d 3e 6e 53 74   while( pDb->nSt
a040: 6d 74 3e 70 44 62 2d 3e 6d 61 78 53 74 6d 74 20  mt>pDb->maxStmt 
a050: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
a060: 5f 66 69 6e 61 6c 69 7a 65 28 70 44 62 2d 3e 73  _finalize(pDb->s
a070: 74 6d 74 4c 61 73 74 2d 3e 70 53 74 6d 74 29 3b  tmtLast->pStmt);
a080: 0a 20 20 20 20 20 20 70 44 62 2d 3e 73 74 6d 74  .      pDb->stmt
a090: 4c 61 73 74 20 3d 20 70 44 62 2d 3e 73 74 6d 74  Last = pDb->stmt
a0a0: 4c 61 73 74 2d 3e 70 50 72 65 76 3b 0a 20 20 20  Last->pPrev;.   
a0b0: 20 20 20 54 63 6c 5f 46 72 65 65 28 28 63 68 61     Tcl_Free((cha
a0c0: 72 2a 29 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74  r*)pDb->stmtLast
a0d0: 2d 3e 70 4e 65 78 74 29 3b 0a 20 20 20 20 20 20  ->pNext);.      
a0e0: 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74 2d 3e 70  pDb->stmtLast->p
a0f0: 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Next = 0;.      
a100: 70 44 62 2d 3e 6e 53 74 6d 74 2d 2d 3b 0a 20 20  pDb->nStmt--;.  
a110: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
a120: 20 53 74 72 75 63 74 75 72 65 20 75 73 65 64 20   Structure used 
a130: 77 69 74 68 20 64 62 45 76 61 6c 58 58 58 28 29  with dbEvalXXX()
a140: 20 66 75 6e 63 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a   functions:.**.*
a150: 2a 20 20 20 64 62 45 76 61 6c 49 6e 69 74 28 29  *   dbEvalInit()
a160: 0a 2a 2a 20 20 20 64 62 45 76 61 6c 53 74 65 70  .**   dbEvalStep
a170: 28 29 0a 2a 2a 20 20 20 64 62 45 76 61 6c 46 69  ().**   dbEvalFi
a180: 6e 61 6c 69 7a 65 28 29 0a 2a 2a 20 20 20 64 62  nalize().**   db
a190: 45 76 61 6c 52 6f 77 49 6e 66 6f 28 29 0a 2a 2a  EvalRowInfo().**
a1a0: 20 20 20 64 62 45 76 61 6c 43 6f 6c 75 6d 6e 56     dbEvalColumnV
a1b0: 61 6c 75 65 28 29 0a 2a 2f 0a 74 79 70 65 64 65  alue().*/.typede
a1c0: 66 20 73 74 72 75 63 74 20 44 62 45 76 61 6c 43  f struct DbEvalC
a1d0: 6f 6e 74 65 78 74 20 44 62 45 76 61 6c 43 6f 6e  ontext DbEvalCon
a1e0: 74 65 78 74 3b 0a 73 74 72 75 63 74 20 44 62 45  text;.struct DbE
a1f0: 76 61 6c 43 6f 6e 74 65 78 74 20 7b 0a 20 20 53  valContext {.  S
a200: 71 6c 69 74 65 44 62 20 2a 70 44 62 3b 20 20 20  qliteDb *pDb;   
a210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a220: 2a 20 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c  * Database handl
a230: 65 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  e */.  Tcl_Obj *
a240: 70 53 71 6c 3b 20 20 20 20 20 20 20 20 20 20 20  pSql;           
a250: 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63 74         /* Object
a260: 20 68 6f 6c 64 69 6e 67 20 73 74 72 69 6e 67 20   holding string 
a270: 7a 53 71 6c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  zSql */.  const 
a280: 63 68 61 72 20 2a 7a 53 71 6c 3b 20 20 20 20 20  char *zSql;     
a290: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6d            /* Rem
a2a0: 61 69 6e 69 6e 67 20 53 51 4c 20 74 6f 20 65 78  aining SQL to ex
a2b0: 65 63 75 74 65 20 2a 2f 0a 20 20 53 71 6c 50 72  ecute */.  SqlPr
a2c0: 65 70 61 72 65 64 53 74 6d 74 20 2a 70 50 72 65  eparedStmt *pPre
a2d0: 53 74 6d 74 3b 20 20 20 20 20 20 2f 2a 20 43 75  Stmt;      /* Cu
a2e0: 72 72 65 6e 74 20 73 74 61 74 65 6d 65 6e 74 20  rrent statement 
a2f0: 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20  */.  int nCol;  
a300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a310: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
a320: 66 20 63 6f 6c 75 6d 6e 73 20 72 65 74 75 72 6e  f columns return
a330: 65 64 20 62 79 20 70 53 74 6d 74 20 2a 2f 0a 20  ed by pStmt */. 
a340: 20 54 63 6c 5f 4f 62 6a 20 2a 70 41 72 72 61 79   Tcl_Obj *pArray
a350: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
a360: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 61 72 72 61   /* Name of arra
a370: 79 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20  y variable */.  
a380: 54 63 6c 5f 4f 62 6a 20 2a 2a 61 70 43 6f 6c 4e  Tcl_Obj **apColN
a390: 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
a3a0: 2f 2a 20 41 72 72 61 79 20 6f 66 20 63 6f 6c 75  /* Array of colu
a3b0: 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 7d 3b 0a 0a  mn names */.};..
a3c0: 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 6e  /*.** Release an
a3d0: 79 20 63 61 63 68 65 20 6f 66 20 63 6f 6c 75 6d  y cache of colum
a3e0: 6e 20 6e 61 6d 65 73 20 63 75 72 72 65 6e 74 6c  n names currentl
a3f0: 79 20 68 65 6c 64 20 61 73 20 70 61 72 74 20 6f  y held as part o
a400: 66 0a 2a 2a 20 74 68 65 20 44 62 45 76 61 6c 43  f.** the DbEvalC
a410: 6f 6e 74 65 78 74 20 73 74 72 75 63 74 75 72 65  ontext structure
a420: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66   passed as the f
a430: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  irst argument..*
a440: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 62  /.static void db
a450: 52 65 6c 65 61 73 65 43 6f 6c 75 6d 6e 4e 61 6d  ReleaseColumnNam
a460: 65 73 28 44 62 45 76 61 6c 43 6f 6e 74 65 78 74  es(DbEvalContext
a470: 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 61   *p){.  if( p->a
a480: 70 43 6f 6c 4e 61 6d 65 20 29 7b 0a 20 20 20 20  pColName ){.    
a490: 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
a4a0: 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69  =0; i<p->nCol; i
a4b0: 2b 2b 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 44  ++){.      Tcl_D
a4c0: 65 63 72 52 65 66 43 6f 75 6e 74 28 70 2d 3e 61  ecrRefCount(p->a
a4d0: 70 43 6f 6c 4e 61 6d 65 5b 69 5d 29 3b 0a 20 20  pColName[i]);.  
a4e0: 20 20 7d 0a 20 20 20 20 54 63 6c 5f 46 72 65 65    }.    Tcl_Free
a4f0: 28 28 63 68 61 72 20 2a 29 70 2d 3e 61 70 43 6f  ((char *)p->apCo
a500: 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 70 2d 3e 61  lName);.    p->a
a510: 70 43 6f 6c 4e 61 6d 65 20 3d 20 30 3b 0a 20 20  pColName = 0;.  
a520: 7d 0a 20 20 70 2d 3e 6e 43 6f 6c 20 3d 20 30 3b  }.  p->nCol = 0;
a530: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61  .}../*.** Initia
a540: 6c 69 7a 65 20 61 20 44 62 45 76 61 6c 43 6f 6e  lize a DbEvalCon
a550: 74 65 78 74 20 73 74 72 75 63 74 75 72 65 2e 0a  text structure..
a560: 2a 2a 0a 2a 2a 20 49 66 20 70 41 72 72 61 79 20  **.** If pArray 
a570: 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65  is not NULL, the
a580: 6e 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  n it contains th
a590: 65 20 6e 61 6d 65 20 6f 66 20 61 20 54 63 6c 20  e name of a Tcl 
a5a0: 61 72 72 61 79 0a 2a 2a 20 76 61 72 69 61 62 6c  array.** variabl
a5b0: 65 2e 20 54 68 65 20 22 2a 22 20 6d 65 6d 62 65  e. The "*" membe
a5c0: 72 20 6f 66 20 74 68 69 73 20 61 72 72 61 79 20  r of this array 
a5d0: 69 73 20 73 65 74 20 74 6f 20 61 20 6c 69 73 74  is set to a list
a5e0: 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 2a 2a 20 74   containing.** t
a5f0: 68 65 20 6e 61 6d 65 73 20 6f 66 20 74 68 65 20  he names of the 
a600: 63 6f 6c 75 6d 6e 73 20 72 65 74 75 72 6e 65 64  columns returned
a610: 20 62 79 20 74 68 65 20 73 74 61 74 65 6d 65 6e   by the statemen
a620: 74 20 61 73 20 70 61 72 74 20 6f 66 20 65 61 63  t as part of eac
a630: 68 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 64 62 45  h.** call to dbE
a640: 76 61 6c 53 74 65 70 28 29 2c 20 69 6e 20 6f 72  valStep(), in or
a650: 64 65 72 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f  der from left to
a660: 20 72 69 67 68 74 2e 20 65 2e 67 2e 20 69 66 20   right. e.g. if 
a670: 74 68 65 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f 66  the names .** of
a680: 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 63 6f   the returned co
a690: 6c 75 6d 6e 73 20 61 72 65 20 61 2c 20 62 20 61  lumns are a, b a
a6a0: 6e 64 20 63 2c 20 69 74 20 64 6f 65 73 20 74 68  nd c, it does th
a6b0: 65 20 65 71 75 69 76 61 6c 65 6e 74 20 6f 66 20  e equivalent of 
a6c0: 74 68 65 20 0a 2a 2a 20 74 63 6c 20 63 6f 6d 6d  the .** tcl comm
a6d0: 61 6e 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 73  and:.**.**     s
a6e0: 65 74 20 24 7b 70 41 72 72 61 79 7d 28 2a 29 20  et ${pArray}(*) 
a6f0: 7b 61 20 62 20 63 7d 0a 2a 2f 0a 73 74 61 74 69  {a b c}.*/.stati
a700: 63 20 76 6f 69 64 20 64 62 45 76 61 6c 49 6e 69  c void dbEvalIni
a710: 74 28 0a 20 20 44 62 45 76 61 6c 43 6f 6e 74 65  t(.  DbEvalConte
a720: 78 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  xt *p,          
a730: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
a740: 74 6f 20 73 74 72 75 63 74 75 72 65 20 74 6f 20  to structure to 
a750: 69 6e 69 74 69 61 6c 69 7a 65 20 2a 2f 0a 20 20  initialize */.  
a760: 53 71 6c 69 74 65 44 62 20 2a 70 44 62 2c 20 20  SqliteDb *pDb,  
a770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a780: 2f 2a 20 44 61 74 61 62 61 73 65 20 68 61 6e 64  /* Database hand
a790: 6c 65 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  le */.  Tcl_Obj 
a7a0: 2a 70 53 71 6c 2c 20 20 20 20 20 20 20 20 20 20  *pSql,          
a7b0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63          /* Objec
a7c0: 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 53 51 4c  t containing SQL
a7d0: 20 73 63 72 69 70 74 20 2a 2f 0a 20 20 54 63 6c   script */.  Tcl
a7e0: 5f 4f 62 6a 20 2a 70 41 72 72 61 79 20 20 20 20  _Obj *pArray    
a7f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a800: 4e 61 6d 65 20 6f 66 20 54 63 6c 20 61 72 72 61  Name of Tcl arra
a810: 79 20 74 6f 20 73 65 74 20 28 2a 29 20 65 6c 65  y to set (*) ele
a820: 6d 65 6e 74 20 6f 66 20 2a 2f 0a 29 7b 0a 20 20  ment of */.){.  
a830: 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 73 69 7a  memset(p, 0, siz
a840: 65 6f 66 28 44 62 45 76 61 6c 43 6f 6e 74 65 78  eof(DbEvalContex
a850: 74 29 29 3b 0a 20 20 70 2d 3e 70 44 62 20 3d 20  t));.  p->pDb = 
a860: 70 44 62 3b 0a 20 20 70 2d 3e 7a 53 71 6c 20 3d  pDb;.  p->zSql =
a870: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 70   Tcl_GetString(p
a880: 53 71 6c 29 3b 0a 20 20 70 2d 3e 70 53 71 6c 20  Sql);.  p->pSql 
a890: 3d 20 70 53 71 6c 3b 0a 20 20 54 63 6c 5f 49 6e  = pSql;.  Tcl_In
a8a0: 63 72 52 65 66 43 6f 75 6e 74 28 70 53 71 6c 29  crRefCount(pSql)
a8b0: 3b 0a 20 20 69 66 28 20 70 41 72 72 61 79 20 29  ;.  if( pArray )
a8c0: 7b 0a 20 20 20 20 70 2d 3e 70 41 72 72 61 79 20  {.    p->pArray 
a8d0: 3d 20 70 41 72 72 61 79 3b 0a 20 20 20 20 54 63  = pArray;.    Tc
a8e0: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70  l_IncrRefCount(p
a8f0: 41 72 72 61 79 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  Array);.  }.}../
a900: 2a 0a 2a 2a 20 4f 62 74 61 69 6e 20 69 6e 66 6f  *.** Obtain info
a910: 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68  rmation about th
a920: 65 20 72 6f 77 20 74 68 61 74 20 74 68 65 20 44  e row that the D
a930: 62 45 76 61 6c 43 6f 6e 74 65 78 74 20 70 61 73  bEvalContext pas
a940: 73 65 64 20 61 73 20 74 68 65 0a 2a 2a 20 66 69  sed as the.** fi
a950: 72 73 74 20 61 72 67 75 6d 65 6e 74 20 63 75 72  rst argument cur
a960: 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f  rently points to
a970: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
a980: 20 64 62 45 76 61 6c 52 6f 77 49 6e 66 6f 28 0a   dbEvalRowInfo(.
a990: 20 20 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 20    DbEvalContext 
a9a0: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
a9b0: 20 20 2f 2a 20 45 76 61 6c 75 61 74 69 6f 6e 20    /* Evaluation 
a9c0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74  context */.  int
a9d0: 20 2a 70 6e 43 6f 6c 2c 20 20 20 20 20 20 20 20   *pnCol,        
a9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a9f0: 4f 55 54 3a 20 4e 75 6d 62 65 72 20 6f 66 20 63  OUT: Number of c
aa00: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20  olumn names */. 
aa10: 20 54 63 6c 5f 4f 62 6a 20 2a 2a 2a 70 61 70 43   Tcl_Obj ***papC
aa20: 6f 6c 4e 61 6d 65 20 20 20 20 20 20 20 20 20 20  olName          
aa30: 20 2f 2a 20 4f 55 54 3a 20 41 72 72 61 79 20 6f   /* OUT: Array o
aa40: 66 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a  f column names *
aa50: 2f 0a 29 7b 0a 20 20 2f 2a 20 43 6f 6d 70 75 74  /.){.  /* Comput
aa60: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a  e column names *
aa70: 2f 0a 20 20 69 66 28 20 30 3d 3d 70 2d 3e 61 70  /.  if( 0==p->ap
aa80: 43 6f 6c 4e 61 6d 65 20 29 7b 0a 20 20 20 20 73  ColName ){.    s
aa90: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
aaa0: 6d 74 20 3d 20 70 2d 3e 70 50 72 65 53 74 6d 74  mt = p->pPreStmt
aab0: 2d 3e 70 53 74 6d 74 3b 0a 20 20 20 20 69 6e 74  ->pStmt;.    int
aac0: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
aad0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74             /* It
aae0: 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c 65 20  erator variable 
aaf0: 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b  */.    int nCol;
ab00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ab10: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
ab20: 66 20 63 6f 6c 75 6d 6e 73 20 72 65 74 75 72 6e  f columns return
ab30: 65 64 20 62 79 20 70 53 74 6d 74 20 2a 2f 0a 20  ed by pStmt */. 
ab40: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 61 70 43     Tcl_Obj **apC
ab50: 6f 6c 4e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20  olName = 0;     
ab60: 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 63 6f 6c   /* Array of col
ab70: 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 0a 20 20  umn names */..  
ab80: 20 20 70 2d 3e 6e 43 6f 6c 20 3d 20 6e 43 6f 6c    p->nCol = nCol
ab90: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
aba0: 6e 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29 3b 0a  n_count(pStmt);.
abb0: 20 20 20 20 69 66 28 20 6e 43 6f 6c 3e 30 20 26      if( nCol>0 &
abc0: 26 20 28 70 61 70 43 6f 6c 4e 61 6d 65 20 7c 7c  & (papColName ||
abd0: 20 70 2d 3e 70 41 72 72 61 79 29 20 29 7b 0a 20   p->pArray) ){. 
abe0: 20 20 20 20 20 61 70 43 6f 6c 4e 61 6d 65 20 3d       apColName =
abf0: 20 28 54 63 6c 5f 4f 62 6a 2a 2a 29 54 63 6c 5f   (Tcl_Obj**)Tcl_
ac00: 41 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 54 63  Alloc( sizeof(Tc
ac10: 6c 5f 4f 62 6a 2a 29 2a 6e 43 6f 6c 20 29 3b 0a  l_Obj*)*nCol );.
ac20: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
ac30: 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nCol; i++){.   
ac40: 20 20 20 20 20 61 70 43 6f 6c 4e 61 6d 65 5b 69       apColName[i
ac50: 5d 20 3d 20 64 62 54 65 78 74 54 6f 4f 62 6a 28  ] = dbTextToObj(
ac60: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e  sqlite3_column_n
ac70: 61 6d 65 28 70 53 74 6d 74 2c 69 29 29 3b 0a 20  ame(pStmt,i));. 
ac80: 20 20 20 20 20 20 20 54 63 6c 5f 49 6e 63 72 52         Tcl_IncrR
ac90: 65 66 43 6f 75 6e 74 28 61 70 43 6f 6c 4e 61 6d  efCount(apColNam
aca0: 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  e[i]);.      }. 
acb0: 20 20 20 20 20 70 2d 3e 61 70 43 6f 6c 4e 61 6d       p->apColNam
acc0: 65 20 3d 20 61 70 43 6f 6c 4e 61 6d 65 3b 0a 20  e = apColName;. 
acd0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
ace0: 72 65 73 75 6c 74 73 20 61 72 65 20 62 65 69 6e  results are bein
acf0: 67 20 73 74 6f 72 65 64 20 69 6e 20 61 6e 20 61  g stored in an a
ad00: 72 72 61 79 20 76 61 72 69 61 62 6c 65 2c 20 74  rray variable, t
ad10: 68 65 6e 20 63 72 65 61 74 65 0a 20 20 20 20 2a  hen create.    *
ad20: 2a 20 74 68 65 20 61 72 72 61 79 28 2a 29 20 65  * the array(*) e
ad30: 6e 74 72 79 20 66 6f 72 20 74 68 61 74 20 61 72  ntry for that ar
ad40: 72 61 79 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ray.    */.    i
ad50: 66 28 20 70 2d 3e 70 41 72 72 61 79 20 29 7b 0a  f( p->pArray ){.
ad60: 20 20 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70        Tcl_Interp
ad70: 20 2a 69 6e 74 65 72 70 20 3d 20 70 2d 3e 70 44   *interp = p->pD
ad80: 62 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 20  b->interp;.     
ad90: 20 54 63 6c 5f 4f 62 6a 20 2a 70 43 6f 6c 4c 69   Tcl_Obj *pColLi
ada0: 73 74 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a 28  st = Tcl_NewObj(
adb0: 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a  );.      Tcl_Obj
adc0: 20 2a 70 53 74 61 72 20 3d 20 54 63 6c 5f 4e 65   *pStar = Tcl_Ne
add0: 77 53 74 72 69 6e 67 4f 62 6a 28 22 2a 22 2c 20  wStringObj("*", 
ade0: 2d 31 29 3b 0a 0a 20 20 20 20 20 20 66 6f 72 28  -1);..      for(
adf0: 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b  i=0; i<nCol; i++
ae00: 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 4c  ){.        Tcl_L
ae10: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
ae20: 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 43 6f 6c  ent(interp, pCol
ae30: 4c 69 73 74 2c 20 61 70 43 6f 6c 4e 61 6d 65 5b  List, apColName[
ae40: 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  i]);.      }.   
ae50: 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f     Tcl_IncrRefCo
ae60: 75 6e 74 28 70 53 74 61 72 29 3b 0a 20 20 20 20  unt(pStar);.    
ae70: 20 20 54 63 6c 5f 4f 62 6a 53 65 74 56 61 72 32    Tcl_ObjSetVar2
ae80: 28 69 6e 74 65 72 70 2c 20 70 2d 3e 70 41 72 72  (interp, p->pArr
ae90: 61 79 2c 20 70 53 74 61 72 2c 20 70 43 6f 6c 4c  ay, pStar, pColL
aea0: 69 73 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 54  ist, 0);.      T
aeb0: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
aec0: 70 53 74 61 72 29 3b 0a 20 20 20 20 7d 0a 20 20  pStar);.    }.  
aed0: 7d 0a 0a 20 20 69 66 28 20 70 61 70 43 6f 6c 4e  }..  if( papColN
aee0: 61 6d 65 20 29 7b 0a 20 20 20 20 2a 70 61 70 43  ame ){.    *papC
aef0: 6f 6c 4e 61 6d 65 20 3d 20 70 2d 3e 61 70 43 6f  olName = p->apCo
af00: 6c 4e 61 6d 65 3b 0a 20 20 7d 0a 20 20 69 66 28  lName;.  }.  if(
af10: 20 70 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 2a 70   pnCol ){.    *p
af20: 6e 43 6f 6c 20 3d 20 70 2d 3e 6e 43 6f 6c 3b 0a  nCol = p->nCol;.
af30: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74    }.}../*.** Ret
af40: 75 72 6e 20 6f 6e 65 20 6f 66 20 54 43 4c 5f 4f  urn one of TCL_O
af50: 4b 2c 20 54 43 4c 5f 42 52 45 41 4b 20 6f 72 20  K, TCL_BREAK or 
af60: 54 43 4c 5f 45 52 52 4f 52 2e 20 49 66 20 54 43  TCL_ERROR. If TC
af70: 4c 5f 45 52 52 4f 52 20 69 73 0a 2a 2a 20 72 65  L_ERROR is.** re
af80: 74 75 72 6e 65 64 2c 20 74 68 65 6e 20 61 6e 20  turned, then an 
af90: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73  error message is
afa0: 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 69   stored in the i
afb0: 6e 74 65 72 70 72 65 74 65 72 20 62 65 66 6f 72  nterpreter befor
afc0: 65 0a 2a 2a 20 72 65 74 75 72 6e 69 6e 67 2e 0a  e.** returning..
afd0: 2a 2a 0a 2a 2a 20 41 20 72 65 74 75 72 6e 20 76  **.** A return v
afe0: 61 6c 75 65 20 6f 66 20 54 43 4c 5f 4f 4b 20 6d  alue of TCL_OK m
aff0: 65 61 6e 73 20 74 68 65 72 65 20 69 73 20 61 20  eans there is a 
b000: 72 6f 77 20 6f 66 20 64 61 74 61 20 61 76 61 69  row of data avai
b010: 6c 61 62 6c 65 2e 20 54 68 65 0a 2a 2a 20 64 61  lable. The.** da
b020: 74 61 20 6d 61 79 20 62 65 20 61 63 63 65 73 73  ta may be access
b030: 65 64 20 75 73 69 6e 67 20 64 62 45 76 61 6c 52  ed using dbEvalR
b040: 6f 77 49 6e 66 6f 28 29 20 61 6e 64 20 64 62 45  owInfo() and dbE
b050: 76 61 6c 43 6f 6c 75 6d 6e 56 61 6c 75 65 28 29  valColumnValue()
b060: 2e 20 54 68 69 73 0a 2a 2a 20 69 73 20 61 6e 61  . This.** is ana
b070: 6c 6f 67 6f 75 73 20 74 6f 20 61 20 72 65 74 75  logous to a retu
b080: 72 6e 20 6f 66 20 53 51 4c 49 54 45 5f 52 4f 57  rn of SQLITE_ROW
b090: 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 73 74   from sqlite3_st
b0a0: 65 70 28 29 2e 20 49 66 20 54 43 4c 5f 42 52 45  ep(). If TCL_BRE
b0b0: 41 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65  AK.** is returne
b0c0: 64 2c 20 74 68 65 6e 20 74 68 65 20 53 51 4c 20  d, then the SQL 
b0d0: 73 63 72 69 70 74 20 68 61 73 20 66 69 6e 69 73  script has finis
b0e0: 68 65 64 20 65 78 65 63 75 74 69 6e 67 20 61 6e  hed executing an
b0f0: 64 20 74 68 65 72 65 20 61 72 65 0a 2a 2a 20 6e  d there are.** n
b100: 6f 20 66 75 72 74 68 65 72 20 72 6f 77 73 20 61  o further rows a
b110: 76 61 69 6c 61 62 6c 65 2e 20 54 68 69 73 20 69  vailable. This i
b120: 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 53 51 4c  s similar to SQL
b130: 49 54 45 5f 44 4f 4e 45 2e 0a 2a 2f 0a 73 74 61  ITE_DONE..*/.sta
b140: 74 69 63 20 69 6e 74 20 64 62 45 76 61 6c 53 74  tic int dbEvalSt
b150: 65 70 28 44 62 45 76 61 6c 43 6f 6e 74 65 78 74  ep(DbEvalContext
b160: 20 2a 70 29 7b 0a 20 20 77 68 69 6c 65 28 20 70   *p){.  while( p
b170: 2d 3e 7a 53 71 6c 5b 30 5d 20 7c 7c 20 70 2d 3e  ->zSql[0] || p->
b180: 70 50 72 65 53 74 6d 74 20 29 7b 0a 20 20 20 20  pPreStmt ){.    
b190: 69 6e 74 20 72 63 3b 0a 20 20 20 20 69 66 28 20  int rc;.    if( 
b1a0: 70 2d 3e 70 50 72 65 53 74 6d 74 3d 3d 30 20 29  p->pPreStmt==0 )
b1b0: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 64 62 50  {.      rc = dbP
b1c0: 72 65 70 61 72 65 41 6e 64 42 69 6e 64 28 70 2d  repareAndBind(p-
b1d0: 3e 70 44 62 2c 20 70 2d 3e 7a 53 71 6c 2c 20 26  >pDb, p->zSql, &
b1e0: 70 2d 3e 7a 53 71 6c 2c 20 26 70 2d 3e 70 50 72  p->zSql, &p->pPr
b1f0: 65 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 69 66  eStmt);.      if
b200: 28 20 72 63 21 3d 54 43 4c 5f 4f 4b 20 29 20 72  ( rc!=TCL_OK ) r
b210: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 65  eturn rc;.    }e
b220: 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 72  lse{.      int r
b230: 63 73 3b 0a 20 20 20 20 20 20 53 71 6c 69 74 65  cs;.      Sqlite
b240: 44 62 20 2a 70 44 62 20 3d 20 70 2d 3e 70 44 62  Db *pDb = p->pDb
b250: 3b 0a 20 20 20 20 20 20 53 71 6c 50 72 65 70 61  ;.      SqlPrepa
b260: 72 65 64 53 74 6d 74 20 2a 70 50 72 65 53 74 6d  redStmt *pPreStm
b270: 74 20 3d 20 70 2d 3e 70 50 72 65 53 74 6d 74 3b  t = p->pPreStmt;
b280: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
b290: 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 70 50 72  tmt *pStmt = pPr
b2a0: 65 53 74 6d 74 2d 3e 70 53 74 6d 74 3b 0a 0a 20  eStmt->pStmt;.. 
b2b0: 20 20 20 20 20 72 63 73 20 3d 20 73 71 6c 69 74       rcs = sqlit
b2c0: 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3b 0a  e3_step(pStmt);.
b2d0: 20 20 20 20 20 20 69 66 28 20 72 63 73 3d 3d 53        if( rcs==S
b2e0: 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20  QLITE_ROW ){.   
b2f0: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
b300: 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OK;.      }.    
b310: 20 20 69 66 28 20 70 2d 3e 70 41 72 72 61 79 20    if( p->pArray 
b320: 29 7b 0a 20 20 20 20 20 20 20 20 64 62 45 76 61  ){.        dbEva
b330: 6c 52 6f 77 49 6e 66 6f 28 70 2c 20 30 2c 20 30  lRowInfo(p, 0, 0
b340: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
b350: 20 72 63 73 20 3d 20 73 71 6c 69 74 65 33 5f 72   rcs = sqlite3_r
b360: 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 0a 20 20  eset(pStmt);..  
b370: 20 20 20 20 70 44 62 2d 3e 6e 53 74 65 70 20 3d      pDb->nStep =
b380: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74   sqlite3_stmt_st
b390: 61 74 75 73 28 70 53 74 6d 74 2c 53 51 4c 49 54  atus(pStmt,SQLIT
b3a0: 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 46 55 4c  E_STMTSTATUS_FUL
b3b0: 4c 53 43 41 4e 5f 53 54 45 50 2c 31 29 3b 0a 20  LSCAN_STEP,1);. 
b3c0: 20 20 20 20 20 70 44 62 2d 3e 6e 53 6f 72 74 20       pDb->nSort 
b3d0: 3d 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73  = sqlite3_stmt_s
b3e0: 74 61 74 75 73 28 70 53 74 6d 74 2c 53 51 4c 49  tatus(pStmt,SQLI
b3f0: 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 53 4f  TE_STMTSTATUS_SO
b400: 52 54 2c 31 29 3b 0a 20 20 20 20 20 20 70 44 62  RT,1);.      pDb
b410: 2d 3e 6e 49 6e 64 65 78 20 3d 20 73 71 6c 69 74  ->nIndex = sqlit
b420: 65 33 5f 73 74 6d 74 5f 73 74 61 74 75 73 28 70  e3_stmt_status(p
b430: 53 74 6d 74 2c 53 51 4c 49 54 45 5f 53 54 4d 54  Stmt,SQLITE_STMT
b440: 53 54 41 54 55 53 5f 41 55 54 4f 49 4e 44 45 58  STATUS_AUTOINDEX
b450: 2c 31 29 3b 0a 20 20 20 20 20 20 64 62 52 65 6c  ,1);.      dbRel
b460: 65 61 73 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  easeColumnNames(
b470: 70 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72  p);.      p->pPr
b480: 65 53 74 6d 74 20 3d 20 30 3b 0a 0a 20 20 20 20  eStmt = 0;..    
b490: 20 20 69 66 28 20 72 63 73 21 3d 53 51 4c 49 54    if( rcs!=SQLIT
b4a0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
b4b0: 2f 2a 20 49 66 20 61 20 72 75 6e 2d 74 69 6d 65  /* If a run-time
b4c0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72   error occurs, r
b4d0: 65 70 6f 72 74 20 74 68 65 20 65 72 72 6f 72 20  eport the error 
b4e0: 61 6e 64 20 73 74 6f 70 20 72 65 61 64 69 6e 67  and stop reading
b4f0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
b500: 53 51 4c 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  SQL.  */.       
b510: 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
b520: 74 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20 64  t(pDb->interp, d
b530: 62 54 65 78 74 54 6f 4f 62 6a 28 73 71 6c 69 74  bTextToObj(sqlit
b540: 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64  e3_errmsg(pDb->d
b550: 62 29 29 29 3b 0a 20 20 20 20 20 20 20 20 64 62  b)));.        db
b560: 52 65 6c 65 61 73 65 53 74 6d 74 28 70 44 62 2c  ReleaseStmt(pDb,
b570: 20 70 50 72 65 53 74 6d 74 2c 20 31 29 3b 0a 20   pPreStmt, 1);. 
b580: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43         return TC
b590: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d  L_ERROR;.      }
b5a0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 64 62  else{.        db
b5b0: 52 65 6c 65 61 73 65 53 74 6d 74 28 70 44 62 2c  ReleaseStmt(pDb,
b5c0: 20 70 50 72 65 53 74 6d 74 2c 20 30 29 3b 0a 20   pPreStmt, 0);. 
b5d0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
b5e0: 0a 0a 20 20 2f 2a 20 46 69 6e 69 73 68 65 64 20  ..  /* Finished 
b5f0: 2a 2f 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  */.  return TCL_
b600: 42 52 45 41 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  BREAK;.}../*.** 
b610: 46 72 65 65 20 61 6c 6c 20 72 65 73 6f 75 72 63  Free all resourc
b620: 65 73 20 63 75 72 72 65 6e 74 6c 79 20 68 65 6c  es currently hel
b630: 64 20 62 79 20 74 68 65 20 44 62 45 76 61 6c 43  d by the DbEvalC
b640: 6f 6e 74 65 78 74 20 73 74 72 75 63 74 75 72 65  ontext structure
b650: 20 70 61 73 73 65 64 0a 2a 2a 20 61 73 20 74 68   passed.** as th
b660: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
b670: 2e 20 54 68 65 72 65 20 73 68 6f 75 6c 64 20 62  . There should b
b680: 65 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 63 61  e exactly one ca
b690: 6c 6c 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  ll to this funct
b6a0: 69 6f 6e 0a 2a 2a 20 66 6f 72 20 65 61 63 68 20  ion.** for each 
b6b0: 63 61 6c 6c 20 74 6f 20 64 62 45 76 61 6c 49 6e  call to dbEvalIn
b6c0: 69 74 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  it()..*/.static 
b6d0: 76 6f 69 64 20 64 62 45 76 61 6c 46 69 6e 61 6c  void dbEvalFinal
b6e0: 69 7a 65 28 44 62 45 76 61 6c 43 6f 6e 74 65 78  ize(DbEvalContex
b6f0: 74 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e  t *p){.  if( p->
b700: 70 50 72 65 53 74 6d 74 20 29 7b 0a 20 20 20 20  pPreStmt ){.    
b710: 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 2d  sqlite3_reset(p-
b720: 3e 70 50 72 65 53 74 6d 74 2d 3e 70 53 74 6d 74  >pPreStmt->pStmt
b730: 29 3b 0a 20 20 20 20 64 62 52 65 6c 65 61 73 65  );.    dbRelease
b740: 53 74 6d 74 28 70 2d 3e 70 44 62 2c 20 70 2d 3e  Stmt(p->pDb, p->
b750: 70 50 72 65 53 74 6d 74 2c 20 30 29 3b 0a 20 20  pPreStmt, 0);.  
b760: 20 20 70 2d 3e 70 50 72 65 53 74 6d 74 20 3d 20    p->pPreStmt = 
b770: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  0;.  }.  if( p->
b780: 70 41 72 72 61 79 20 29 7b 0a 20 20 20 20 54 63  pArray ){.    Tc
b790: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70  l_DecrRefCount(p
b7a0: 2d 3e 70 41 72 72 61 79 29 3b 0a 20 20 20 20 70  ->pArray);.    p
b7b0: 2d 3e 70 41 72 72 61 79 20 3d 20 30 3b 0a 20 20  ->pArray = 0;.  
b7c0: 7d 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43  }.  Tcl_DecrRefC
b7d0: 6f 75 6e 74 28 70 2d 3e 70 53 71 6c 29 3b 0a 20  ount(p->pSql);. 
b7e0: 20 64 62 52 65 6c 65 61 73 65 43 6f 6c 75 6d 6e   dbReleaseColumn
b7f0: 4e 61 6d 65 73 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a  Names(p);.}../*.
b800: 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
b810: 74 65 72 20 74 6f 20 61 20 54 63 6c 5f 4f 62 6a  ter to a Tcl_Obj
b820: 20 73 74 72 75 63 74 75 72 65 20 77 69 74 68 20   structure with 
b830: 72 65 66 2d 63 6f 75 6e 74 20 30 20 74 68 61 74  ref-count 0 that
b840: 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 74 68 65   contains.** the
b850: 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 69   value for the i
b860: 43 6f 6c 27 74 68 20 63 6f 6c 75 6d 6e 20 6f 66  Col'th column of
b870: 20 74 68 65 20 72 6f 77 20 63 75 72 72 65 6e 74   the row current
b880: 6c 79 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  ly pointed to by
b890: 0a 2a 2a 20 74 68 65 20 44 62 45 76 61 6c 43 6f  .** the DbEvalCo
b8a0: 6e 74 65 78 74 20 73 74 72 75 63 74 75 72 65 20  ntext structure 
b8b0: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69  passed as the fi
b8c0: 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  rst argument..*/
b8d0: 0a 73 74 61 74 69 63 20 54 63 6c 5f 4f 62 6a 20  .static Tcl_Obj 
b8e0: 2a 64 62 45 76 61 6c 43 6f 6c 75 6d 6e 56 61 6c  *dbEvalColumnVal
b8f0: 75 65 28 44 62 45 76 61 6c 43 6f 6e 74 65 78 74  ue(DbEvalContext
b900: 20 2a 70 2c 20 69 6e 74 20 69 43 6f 6c 29 7b 0a   *p, int iCol){.
b910: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
b920: 70 53 74 6d 74 20 3d 20 70 2d 3e 70 50 72 65 53  pStmt = p->pPreS
b930: 74 6d 74 2d 3e 70 53 74 6d 74 3b 0a 20 20 73 77  tmt->pStmt;.  sw
b940: 69 74 63 68 28 20 73 71 6c 69 74 65 33 5f 63 6f  itch( sqlite3_co
b950: 6c 75 6d 6e 5f 74 79 70 65 28 70 53 74 6d 74 2c  lumn_type(pStmt,
b960: 20 69 43 6f 6c 29 20 29 7b 0a 20 20 20 20 63 61   iCol) ){.    ca
b970: 73 65 20 53 51 4c 49 54 45 5f 42 4c 4f 42 3a 20  se SQLITE_BLOB: 
b980: 7b 0a 20 20 20 20 20 20 69 6e 74 20 62 79 74 65  {.      int byte
b990: 73 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  s = sqlite3_colu
b9a0: 6d 6e 5f 62 79 74 65 73 28 70 53 74 6d 74 2c 20  mn_bytes(pStmt, 
b9b0: 69 43 6f 6c 29 3b 0a 20 20 20 20 20 20 63 6f 6e  iCol);.      con
b9c0: 73 74 20 63 68 61 72 20 2a 7a 42 6c 6f 62 20 3d  st char *zBlob =
b9d0: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
b9e0: 62 6c 6f 62 28 70 53 74 6d 74 2c 20 69 43 6f 6c  blob(pStmt, iCol
b9f0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 7a 42  );.      if( !zB
ba00: 6c 6f 62 20 29 20 62 79 74 65 73 20 3d 20 30 3b  lob ) bytes = 0;
ba10: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 63  .      return Tc
ba20: 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62  l_NewByteArrayOb
ba30: 6a 28 28 75 38 2a 29 7a 42 6c 6f 62 2c 20 62 79  j((u8*)zBlob, by
ba40: 74 65 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  tes);.    }.    
ba50: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 54 45  case SQLITE_INTE
ba60: 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  GER: {.      sql
ba70: 69 74 65 5f 69 6e 74 36 34 20 76 20 3d 20 73 71  ite_int64 v = sq
ba80: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
ba90: 36 34 28 70 53 74 6d 74 2c 20 69 43 6f 6c 29 3b  64(pStmt, iCol);
baa0: 0a 20 20 20 20 20 20 69 66 28 20 76 3e 3d 2d 32  .      if( v>=-2
bab0: 31 34 37 34 38 33 36 34 37 20 26 26 20 76 3c 3d  147483647 && v<=
bac0: 32 31 34 37 34 38 33 36 34 37 20 29 7b 0a 20 20  2147483647 ){.  
bad0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 63 6c        return Tcl
bae0: 5f 4e 65 77 49 6e 74 4f 62 6a 28 76 29 3b 0a 20  _NewIntObj(v);. 
baf0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
bb00: 20 20 20 20 72 65 74 75 72 6e 20 54 63 6c 5f 4e      return Tcl_N
bb10: 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 76 29 3b  ewWideIntObj(v);
bb20: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
bb30: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
bb40: 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20 72 65  LOAT: {.      re
bb50: 74 75 72 6e 20 54 63 6c 5f 4e 65 77 44 6f 75 62  turn Tcl_NewDoub
bb60: 6c 65 4f 62 6a 28 73 71 6c 69 74 65 33 5f 63 6f  leObj(sqlite3_co
bb70: 6c 75 6d 6e 5f 64 6f 75 62 6c 65 28 70 53 74 6d  lumn_double(pStm
bb80: 74 2c 20 69 43 6f 6c 29 29 3b 0a 20 20 20 20 7d  t, iCol));.    }
bb90: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
bba0: 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 72  _NULL: {.      r
bbb0: 65 74 75 72 6e 20 64 62 54 65 78 74 54 6f 4f 62  eturn dbTextToOb
bbc0: 6a 28 70 2d 3e 70 44 62 2d 3e 7a 4e 75 6c 6c 29  j(p->pDb->zNull)
bbd0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
bbe0: 65 74 75 72 6e 20 64 62 54 65 78 74 54 6f 4f 62  eturn dbTextToOb
bbf0: 6a 28 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  j((char *)sqlite
bc00: 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53  3_column_text(pS
bc10: 74 6d 74 2c 20 69 43 6f 6c 29 29 3b 0a 7d 0a 0a  tmt, iCol));.}..
bc20: 2f 2a 0a 2a 2a 20 49 66 20 75 73 69 6e 67 20 54  /*.** If using T
bc30: 63 6c 20 76 65 72 73 69 6f 6e 20 38 2e 36 20 6f  cl version 8.6 o
bc40: 72 20 67 72 65 61 74 65 72 2c 20 75 73 65 20 74  r greater, use t
bc50: 68 65 20 4e 52 20 66 75 6e 63 74 69 6f 6e 73 20  he NR functions 
bc60: 74 6f 20 61 76 6f 69 64 0a 2a 2a 20 72 65 63 75  to avoid.** recu
bc70: 72 73 69 76 65 20 65 76 61 6c 75 74 69 6f 6e 20  rsive evalution 
bc80: 6f 66 20 73 63 72 69 70 74 73 20 62 79 20 74 68  of scripts by th
bc90: 65 20 5b 64 62 20 65 76 61 6c 5d 20 61 6e 64 20  e [db eval] and 
bca0: 5b 64 62 20 74 72 61 6e 73 5d 0a 2a 2a 20 63 6f  [db trans].** co
bcb0: 6d 6d 61 6e 64 73 2e 20 45 76 65 6e 20 69 66 20  mmands. Even if 
bcc0: 74 68 65 20 68 65 61 64 65 72 73 20 75 73 65 64  the headers used
bcd0: 20 77 68 69 6c 65 20 63 6f 6d 70 69 6c 69 6e 67   while compiling
bce0: 20 74 68 65 20 65 78 74 65 6e 73 69 6f 6e 0a 2a   the extension.*
bcf0: 2a 20 61 72 65 20 38 2e 36 20 6f 72 20 6e 65 77  * are 8.6 or new
bd00: 65 72 2c 20 74 68 65 20 63 6f 64 65 20 73 74 69  er, the code sti
bd10: 6c 6c 20 74 65 73 74 73 20 74 68 65 20 54 63 6c  ll tests the Tcl
bd20: 20 76 65 72 73 69 6f 6e 20 61 74 20 72 75 6e 74   version at runt
bd30: 69 6d 65 2e 0a 2a 2a 20 54 68 69 73 20 61 6c 6c  ime..** This all
bd40: 6f 77 73 20 73 74 75 62 73 2d 65 6e 61 62 6c 65  ows stubs-enable
bd50: 64 20 62 75 69 6c 64 73 20 74 6f 20 62 65 20 75  d builds to be u
bd60: 73 65 64 20 77 69 74 68 20 6f 6c 64 65 72 20 54  sed with older T
bd70: 63 6c 20 6c 69 62 72 61 72 69 65 73 2e 0a 2a 2f  cl libraries..*/
bd80: 0a 23 69 66 20 54 43 4c 5f 4d 41 4a 4f 52 5f 56  .#if TCL_MAJOR_V
bd90: 45 52 53 49 4f 4e 3e 38 20 7c 7c 20 28 54 43 4c  ERSION>8 || (TCL
bda0: 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f 4e 3d 3d  _MAJOR_VERSION==
bdb0: 38 20 26 26 20 54 43 4c 5f 4d 49 4e 4f 52 5f 56  8 && TCL_MINOR_V
bdc0: 45 52 53 49 4f 4e 3e 3d 36 29 0a 23 20 64 65 66  ERSION>=6).# def
bdd0: 69 6e 65 20 53 51 4c 49 54 45 5f 54 43 4c 5f 4e  ine SQLITE_TCL_N
bde0: 52 45 20 31 0a 73 74 61 74 69 63 20 69 6e 74 20  RE 1.static int 
bdf0: 44 62 55 73 65 4e 72 65 28 76 6f 69 64 29 7b 0a  DbUseNre(void){.
be00: 20 20 69 6e 74 20 6d 61 6a 6f 72 2c 20 6d 69 6e    int major, min
be10: 6f 72 3b 0a 20 20 54 63 6c 5f 47 65 74 56 65 72  or;.  Tcl_GetVer
be20: 73 69 6f 6e 28 26 6d 61 6a 6f 72 2c 20 26 6d 69  sion(&major, &mi
be30: 6e 6f 72 2c 20 30 2c 20 30 29 3b 0a 20 20 72 65  nor, 0, 0);.  re
be40: 74 75 72 6e 28 20 28 6d 61 6a 6f 72 3d 3d 38 20  turn( (major==8 
be50: 26 26 20 6d 69 6e 6f 72 3e 3d 36 29 20 7c 7c 20  && minor>=6) || 
be60: 6d 61 6a 6f 72 3e 38 20 29 3b 0a 7d 0a 23 65 6c  major>8 );.}.#el
be70: 73 65 0a 2f 2a 20 0a 2a 2a 20 43 6f 6d 70 69 6c  se./* .** Compil
be80: 69 6e 67 20 75 73 69 6e 67 20 68 65 61 64 65 72  ing using header
be90: 73 20 65 61 72 6c 69 65 72 20 74 68 61 6e 20 38  s earlier than 8
bea0: 2e 36 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  .6. In this case
beb0: 20 4e 52 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a   NR cannot be.**
bec0: 20 75 73 65 64 2c 20 73 6f 20 44 62 55 73 65 4e   used, so DbUseN
bed0: 72 65 28 29 20 74 6f 20 61 6c 77 61 79 73 20 72  re() to always r
bee0: 65 74 75 72 6e 20 7a 65 72 6f 2e 20 41 64 64 20  eturn zero. Add 
bef0: 23 64 65 66 69 6e 65 73 20 66 6f 72 20 74 68 65  #defines for the
bf00: 20 6f 74 68 65 72 0a 2a 2a 20 54 63 6c 5f 4e 52   other.** Tcl_NR
bf10: 78 78 78 28 29 20 66 75 6e 63 74 69 6f 6e 73 20  xxx() functions 
bf20: 74 6f 20 70 72 65 76 65 6e 74 20 74 68 65 6d 20  to prevent them 
bf30: 66 72 6f 6d 20 63 61 75 73 69 6e 67 20 63 6f 6d  from causing com
bf40: 70 69 6c 61 74 69 6f 6e 20 65 72 72 6f 72 73 2c  pilation errors,
bf50: 0a 2a 2a 20 65 76 65 6e 20 74 68 6f 75 67 68 20  .** even though 
bf60: 74 68 65 20 6f 6e 6c 79 20 69 6e 76 6f 63 61 74  the only invocat
bf70: 69 6f 6e 73 20 6f 66 20 74 68 65 6d 20 61 72 65  ions of them are
bf80: 20 77 69 74 68 69 6e 20 63 6f 6e 64 69 74 69 6f   within conditio
bf90: 6e 61 6c 20 62 6c 6f 63 6b 73 20 0a 2a 2a 20 6f  nal blocks .** o
bfa0: 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a  f the form:.**.*
bfb0: 2a 20 20 20 69 66 28 20 44 62 55 73 65 4e 72 65  *   if( DbUseNre
bfc0: 28 29 20 29 20 7b 20 2e 2e 2e 20 7d 0a 2a 2f 0a  () ) { ... }.*/.
bfd0: 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f  # define SQLITE_
bfe0: 54 43 4c 5f 4e 52 45 20 30 0a 23 20 64 65 66 69  TCL_NRE 0.# defi
bff0: 6e 65 20 44 62 55 73 65 4e 72 65 28 29 20 30 0a  ne DbUseNre() 0.
c000: 23 20 64 65 66 69 6e 65 20 54 63 6c 5f 4e 52 41  # define Tcl_NRA
c010: 64 64 43 61 6c 6c 62 61 63 6b 28 61 2c 62 2c 63  ddCallback(a,b,c
c020: 2c 64 2c 65 2c 66 29 20 30 0a 23 20 64 65 66 69  ,d,e,f) 0.# defi
c030: 6e 65 20 54 63 6c 5f 4e 52 45 76 61 6c 4f 62 6a  ne Tcl_NREvalObj
c040: 28 61 2c 62 2c 63 29 20 30 0a 23 20 64 65 66 69  (a,b,c) 0.# defi
c050: 6e 65 20 54 63 6c 5f 4e 52 43 72 65 61 74 65 43  ne Tcl_NRCreateC
c060: 6f 6d 6d 61 6e 64 28 61 2c 62 2c 63 2c 64 2c 65  ommand(a,b,c,d,e
c070: 2c 66 29 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ,f) 0.#endif../*
c080: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
c090: 6e 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65  n is part of the
c0a0: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
c0b0: 6f 66 20 74 68 65 20 63 6f 6d 6d 61 6e 64 3a 0a  of the command:.
c0c0: 2a 2a 0a 2a 2a 20 20 20 24 64 62 20 65 76 61 6c  **.**   $db eval
c0d0: 20 53 51 4c 20 3f 41 52 52 41 59 4e 41 4d 45 3f   SQL ?ARRAYNAME?
c0e0: 20 53 43 52 49 50 54 0a 2a 2f 0a 73 74 61 74 69   SCRIPT.*/.stati
c0f0: 63 20 69 6e 74 20 44 62 45 76 61 6c 4e 65 78 74  c int DbEvalNext
c100: 43 6d 64 28 0a 20 20 43 6c 69 65 6e 74 44 61 74  Cmd(.  ClientDat
c110: 61 20 64 61 74 61 5b 5d 2c 20 20 20 20 20 20 20  a data[],       
c120: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64              /* d
c130: 61 74 61 5b 30 5d 20 69 73 20 74 68 65 20 28 44  ata[0] is the (D
c140: 62 45 76 61 6c 43 6f 6e 74 65 78 74 2a 29 20 2a  bEvalContext*) *
c150: 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  /.  Tcl_Interp *
c160: 69 6e 74 65 72 70 2c 20 20 20 20 20 20 20 20 20  interp,         
c170: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 63 6c 20           /* Tcl 
c180: 69 6e 74 65 72 70 72 65 74 65 72 20 2a 2f 0a 20  interpreter */. 
c190: 20 69 6e 74 20 72 65 73 75 6c 74 20 20 20 20 20   int result     
c1a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c1b0: 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
c1c0: 73 6f 20 66 61 72 20 2a 2f 0a 29 7b 0a 20 20 69  so far */.){.  i
c1d0: 6e 74 20 72 63 20 3d 20 72 65 73 75 6c 74 3b 20  nt rc = result; 
c1e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c1f0: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
c200: 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20  de */..  /* The 
c210: 66 69 72 73 74 20 65 6c 65 6d 65 6e 74 20 6f 66  first element of
c220: 20 74 68 65 20 64 61 74 61 5b 5d 20 61 72 72 61   the data[] arra
c230: 79 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  y is a pointer t
c240: 6f 20 61 20 44 62 45 76 61 6c 43 6f 6e 74 65 78  o a DbEvalContex
c250: 74 0a 20 20 2a 2a 20 73 74 72 75 63 74 75 72 65  t.  ** structure
c260: 20 61 6c 6c 6f 63 61 74 65 64 20 75 73 69 6e 67   allocated using
c270: 20 54 63 6c 5f 41 6c 6c 6f 63 28 29 2e 20 54 68   Tcl_Alloc(). Th
c280: 65 20 73 65 63 6f 6e 64 20 65 6c 65 6d 65 6e 74  e second element
c290: 20 6f 66 20 64 61 74 61 5b 5d 0a 20 20 2a 2a 20   of data[].  ** 
c2a0: 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
c2b0: 61 20 54 63 6c 5f 4f 62 6a 20 63 6f 6e 74 61 69  a Tcl_Obj contai
c2c0: 6e 69 6e 67 20 74 68 65 20 73 63 72 69 70 74 20  ning the script 
c2d0: 74 6f 20 72 75 6e 20 66 6f 72 20 65 61 63 68 20  to run for each 
c2e0: 72 6f 77 0a 20 20 2a 2a 20 72 65 74 75 72 6e 65  row.  ** returne
c2f0: 64 20 62 79 20 74 68 65 20 71 75 65 72 69 65 73  d by the queries
c300: 20 65 6e 63 61 70 73 75 6c 61 74 65 64 20 69 6e   encapsulated in
c310: 20 64 61 74 61 5b 30 5d 2e 20 2a 2f 0a 20 20 44   data[0]. */.  D
c320: 62 45 76 61 6c 43 6f 6e 74 65 78 74 20 2a 70 20  bEvalContext *p 
c330: 3d 20 28 44 62 45 76 61 6c 43 6f 6e 74 65 78 74  = (DbEvalContext
c340: 20 2a 29 64 61 74 61 5b 30 5d 3b 0a 20 20 54 63   *)data[0];.  Tc
c350: 6c 5f 4f 62 6a 20 2a 70 53 63 72 69 70 74 20 3d  l_Obj *pScript =
c360: 20 28 54 63 6c 5f 4f 62 6a 20 2a 29 64 61 74 61   (Tcl_Obj *)data
c370: 5b 31 5d 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  [1];.  Tcl_Obj *
c380: 70 41 72 72 61 79 20 3d 20 70 2d 3e 70 41 72 72  pArray = p->pArr
c390: 61 79 3b 0a 0a 20 20 77 68 69 6c 65 28 20 28 72  ay;..  while( (r
c3a0: 63 3d 3d 54 43 4c 5f 4f 4b 20 7c 7c 20 72 63 3d  c==TCL_OK || rc=
c3b0: 3d 54 43 4c 5f 43 4f 4e 54 49 4e 55 45 29 20 26  =TCL_CONTINUE) &
c3c0: 26 20 54 43 4c 5f 4f 4b 3d 3d 28 72 63 20 3d 20  & TCL_OK==(rc = 
c3d0: 64 62 45 76 61 6c 53 74 65 70 28 70 29 29 20 29  dbEvalStep(p)) )
c3e0: 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
c3f0: 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 20 20 54   int nCol;.    T
c400: 63 6c 5f 4f 62 6a 20 2a 2a 61 70 43 6f 6c 4e 61  cl_Obj **apColNa
c410: 6d 65 3b 0a 20 20 20 20 64 62 45 76 61 6c 52 6f  me;.    dbEvalRo
c420: 77 49 6e 66 6f 28 70 2c 20 26 6e 43 6f 6c 2c 20  wInfo(p, &nCol, 
c430: 26 61 70 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 20  &apColName);.   
c440: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c   for(i=0; i<nCol
c450: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 54 63  ; i++){.      Tc
c460: 6c 5f 4f 62 6a 20 2a 70 56 61 6c 20 3d 20 64 62  l_Obj *pVal = db
c470: 45 76 61 6c 43 6f 6c 75 6d 6e 56 61 6c 75 65 28  EvalColumnValue(
c480: 70 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28  p, i);.      if(
c490: 20 70 41 72 72 61 79 3d 3d 30 20 29 7b 0a 20 20   pArray==0 ){.  
c4a0: 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 53 65 74        Tcl_ObjSet
c4b0: 56 61 72 32 28 69 6e 74 65 72 70 2c 20 61 70 43  Var2(interp, apC
c4c0: 6f 6c 4e 61 6d 65 5b 69 5d 2c 20 30 2c 20 70 56  olName[i], 0, pV
c4d0: 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 65  al, 0);.      }e
c4e0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 54 63 6c  lse{.        Tcl
c4f0: 5f 4f 62 6a 53 65 74 56 61 72 32 28 69 6e 74 65  _ObjSetVar2(inte
c500: 72 70 2c 20 70 41 72 72 61 79 2c 20 61 70 43 6f  rp, pArray, apCo
c510: 6c 4e 61 6d 65 5b 69 5d 2c 20 70 56 61 6c 2c 20  lName[i], pVal, 
c520: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
c530: 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65  }..    /* The re
c540: 71 75 69 72 65 64 20 69 6e 74 65 72 70 72 65 74  quired interpret
c550: 65 72 20 76 61 72 69 61 62 6c 65 73 20 61 72 65  er variables are
c560: 20 6e 6f 77 20 70 6f 70 75 6c 61 74 65 64 20 77   now populated w
c570: 69 74 68 20 74 68 65 20 64 61 74 61 20 0a 20 20  ith the data .  
c580: 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 63 75    ** from the cu
c590: 72 72 65 6e 74 20 72 6f 77 2e 20 49 66 20 75 73  rrent row. If us
c5a0: 69 6e 67 20 4e 52 45 2c 20 73 63 68 65 64 75 6c  ing NRE, schedul
c5b0: 65 20 63 61 6c 6c 62 61 63 6b 73 20 74 6f 20 65  e callbacks to e
c5c0: 76 61 6c 75 61 74 65 0a 20 20 20 20 2a 2a 20 73  valuate.    ** s
c5d0: 63 72 69 70 74 20 70 53 63 72 69 70 74 2c 20 74  cript pScript, t
c5e0: 68 65 6e 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68  hen to invoke th
c5f0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 67 61 69  is function agai
c600: 6e 20 74 6f 20 66 65 74 63 68 20 74 68 65 20 6e  n to fetch the n
c610: 65 78 74 0a 20 20 20 20 2a 2a 20 72 6f 77 20 28  ext.    ** row (
c620: 6f 72 20 63 6c 65 61 6e 20 75 70 20 69 66 20 74  or clean up if t
c630: 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 78 74 20  here is no next 
c640: 72 6f 77 20 6f 72 20 74 68 65 20 73 63 72 69 70  row or the scrip
c650: 74 20 74 68 72 6f 77 73 20 61 6e 0a 20 20 20 20  t throws an.    
c660: 2a 2a 20 65 78 63 65 70 74 69 6f 6e 29 2e 20 41  ** exception). A
c670: 66 74 65 72 20 73 63 68 65 64 75 6c 69 6e 67 20  fter scheduling 
c680: 74 68 65 20 63 61 6c 6c 62 61 63 6b 73 2c 20 72  the callbacks, r
c690: 65 74 75 72 6e 20 63 6f 6e 74 72 6f 6c 20 74 6f  eturn control to
c6a0: 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 63 61 6c   the .    ** cal
c6b0: 6c 65 72 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ler..    **.    
c6c0: 2a 2a 20 49 66 20 6e 6f 74 20 75 73 69 6e 67 20  ** If not using 
c6d0: 4e 52 45 2c 20 65 76 61 6c 75 61 74 65 20 70 53  NRE, evaluate pS
c6e0: 63 72 69 70 74 20 64 69 72 65 63 74 6c 79 20 61  cript directly a
c6f0: 6e 64 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68  nd continue with
c700: 20 74 68 65 0a 20 20 20 20 2a 2a 20 6e 65 78 74   the.    ** next
c710: 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68   iteration of th
c720: 69 73 20 77 68 69 6c 65 28 2e 2e 2e 29 20 6c 6f  is while(...) lo
c730: 6f 70 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  op.  */.    if( 
c740: 44 62 55 73 65 4e 72 65 28 29 20 29 7b 0a 20 20  DbUseNre() ){.  
c750: 20 20 20 20 54 63 6c 5f 4e 52 41 64 64 43 61 6c      Tcl_NRAddCal
c760: 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 44 62  lback(interp, Db
c770: 45 76 61 6c 4e 65 78 74 43 6d 64 2c 20 28 76 6f  EvalNextCmd, (vo
c780: 69 64 2a 29 70 2c 20 28 76 6f 69 64 2a 29 70 53  id*)p, (void*)pS
c790: 63 72 69 70 74 2c 20 30 2c 20 30 29 3b 0a 20 20  cript, 0, 0);.  
c7a0: 20 20 20 20 72 65 74 75 72 6e 20 54 63 6c 5f 4e      return Tcl_N
c7b0: 52 45 76 61 6c 4f 62 6a 28 69 6e 74 65 72 70 2c  REvalObj(interp,
c7c0: 20 70 53 63 72 69 70 74 2c 20 30 29 3b 0a 20 20   pScript, 0);.  
c7d0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
c7e0: 63 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45  c = Tcl_EvalObjE
c7f0: 78 28 69 6e 74 65 72 70 2c 20 70 53 63 72 69 70  x(interp, pScrip
c800: 74 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  t, 0);.    }.  }
c810: 0a 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43  ..  Tcl_DecrRefC
c820: 6f 75 6e 74 28 70 53 63 72 69 70 74 29 3b 0a 20  ount(pScript);. 
c830: 20 64 62 45 76 61 6c 46 69 6e 61 6c 69 7a 65 28   dbEvalFinalize(
c840: 70 29 3b 0a 20 20 54 63 6c 5f 46 72 65 65 28 28  p);.  Tcl_Free((
c850: 63 68 61 72 20 2a 29 70 29 3b 0a 0a 20 20 69 66  char *)p);..  if
c860: 28 20 72 63 3d 3d 54 43 4c 5f 4f 4b 20 7c 7c 20  ( rc==TCL_OK || 
c870: 72 63 3d 3d 54 43 4c 5f 42 52 45 41 4b 20 29 7b  rc==TCL_BREAK ){
c880: 0a 20 20 20 20 54 63 6c 5f 52 65 73 65 74 52 65  .    Tcl_ResetRe
c890: 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  sult(interp);.  
c8a0: 20 20 72 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20    rc = TCL_OK;. 
c8b0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
c8c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
c8d0: 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 62  nction is used b
c8e0: 79 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  y the implementa
c8f0: 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 66 6f 6c  tions of the fol
c900: 6c 6f 77 69 6e 67 20 64 61 74 61 62 61 73 65 20  lowing database 
c910: 0a 2a 2a 20 68 61 6e 64 6c 65 20 73 75 62 2d 63  .** handle sub-c
c920: 6f 6d 6d 61 6e 64 73 3a 0a 2a 2a 0a 2a 2a 20 20  ommands:.**.**  
c930: 20 24 64 62 20 75 70 64 61 74 65 5f 68 6f 6f 6b   $db update_hook
c940: 20 3f 53 43 52 49 50 54 3f 0a 2a 2a 20 20 20 24   ?SCRIPT?.**   $
c950: 64 62 20 77 61 6c 5f 68 6f 6f 6b 20 3f 53 43 52  db wal_hook ?SCR
c960: 49 50 54 3f 0a 2a 2a 20 20 20 24 64 62 20 63 6f  IPT?.**   $db co
c970: 6d 6d 69 74 5f 68 6f 6f 6b 20 3f 53 43 52 49 50  mmit_hook ?SCRIP
c980: 54 3f 0a 2a 2a 20 20 20 24 64 62 20 70 72 65 75  T?.**   $db preu
c990: 70 64 61 74 65 20 68 6f 6f 6b 20 3f 53 43 52 49  pdate hook ?SCRI
c9a0: 50 54 3f 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  PT?.*/.static vo
c9b0: 69 64 20 44 62 48 6f 6f 6b 43 6d 64 28 0a 20 20  id DbHookCmd(.  
c9c0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
c9d0: 72 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  rp,             
c9e0: 2f 2a 20 54 63 6c 20 69 6e 74 65 72 70 72 65 74  /* Tcl interpret
c9f0: 65 72 20 2a 2f 0a 20 20 53 71 6c 69 74 65 44 62  er */.  SqliteDb
ca00: 20 2a 70 44 62 2c 20 20 20 20 20 20 20 20 20 20   *pDb,          
ca10: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
ca20: 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ase handle */.  
ca30: 54 63 6c 5f 4f 62 6a 20 2a 70 41 72 67 2c 20 20  Tcl_Obj *pArg,  
ca40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca50: 2f 2a 20 53 43 52 49 50 54 20 61 72 67 75 6d 65  /* SCRIPT argume
ca60: 6e 74 20 28 6f 72 20 4e 55 4c 4c 29 20 2a 2f 0a  nt (or NULL) */.
ca70: 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 70 70 48 6f    Tcl_Obj **ppHo
ca80: 6f 6b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ok              
ca90: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
caa0: 6d 65 6d 62 65 72 20 6f 66 20 53 71 6c 69 74 65  member of Sqlite
cab0: 44 62 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  Db */.){.  sqlit
cac0: 65 33 20 2a 64 62 20 3d 20 70 44 62 2d 3e 64 62  e3 *db = pDb->db
cad0: 3b 0a 0a 20 20 69 66 28 20 2a 70 70 48 6f 6f 6b  ;..  if( *ppHook
cae0: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f   ){.    Tcl_SetO
caf0: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
cb00: 20 2a 70 70 48 6f 6f 6b 29 3b 0a 20 20 20 20 69   *ppHook);.    i
cb10: 66 28 20 70 41 72 67 20 29 7b 0a 20 20 20 20 20  f( pArg ){.     
cb20: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
cb30: 74 28 2a 70 70 48 6f 6f 6b 29 3b 0a 20 20 20 20  t(*ppHook);.    
cb40: 20 20 2a 70 70 48 6f 6f 6b 20 3d 20 30 3b 0a 20    *ppHook = 0;. 
cb50: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
cb60: 41 72 67 20 29 7b 0a 20 20 20 20 61 73 73 65 72  Arg ){.    asser
cb70: 74 28 20 21 28 2a 70 70 48 6f 6f 6b 29 20 29 3b  t( !(*ppHook) );
cb80: 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74  .    if( Tcl_Get
cb90: 43 68 61 72 4c 65 6e 67 74 68 28 70 41 72 67 29  CharLength(pArg)
cba0: 3e 30 20 29 7b 0a 20 20 20 20 20 20 2a 70 70 48  >0 ){.      *ppH
cbb0: 6f 6f 6b 20 3d 20 70 41 72 67 3b 0a 20 20 20 20  ook = pArg;.    
cbc0: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
cbd0: 6e 74 28 2a 70 70 48 6f 6f 6b 29 3b 0a 20 20 20  nt(*ppHook);.   
cbe0: 20 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65   }.  }..  sqlite
cbf0: 33 5f 70 72 65 75 70 64 61 74 65 5f 68 6f 6f 6b  3_preupdate_hook
cc00: 28 64 62 2c 20 28 70 44 62 2d 3e 70 50 72 65 55  (db, (pDb->pPreU
cc10: 70 64 61 74 65 48 6f 6f 6b 3f 44 62 50 72 65 55  pdateHook?DbPreU
cc20: 70 64 61 74 65 48 61 6e 64 6c 65 72 3a 30 29 2c  pdateHandler:0),
cc30: 20 70 44 62 29 3b 0a 20 20 73 71 6c 69 74 65 33   pDb);.  sqlite3
cc40: 5f 75 70 64 61 74 65 5f 68 6f 6f 6b 28 64 62 2c  _update_hook(db,
cc50: 20 28 70 44 62 2d 3e 70 55 70 64 61 74 65 48 6f   (pDb->pUpdateHo
cc60: 6f 6b 3f 44 62 55 70 64 61 74 65 48 61 6e 64 6c  ok?DbUpdateHandl
cc70: 65 72 3a 30 29 2c 20 70 44 62 29 3b 0a 20 20 73  er:0), pDb);.  s
cc80: 71 6c 69 74 65 33 5f 72 6f 6c 6c 62 61 63 6b 5f  qlite3_rollback_
cc90: 68 6f 6f 6b 28 64 62 2c 20 28 70 44 62 2d 3e 70  hook(db, (pDb->p
cca0: 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 3f 44 62 52  RollbackHook?DbR
ccb0: 6f 6c 6c 62 61 63 6b 48 61 6e 64 6c 65 72 3a 30  ollbackHandler:0
ccc0: 29 2c 20 70 44 62 29 3b 0a 20 20 73 71 6c 69 74  ), pDb);.  sqlit
ccd0: 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 64 62 2c 20  e3_wal_hook(db, 
cce0: 28 70 44 62 2d 3e 70 57 61 6c 48 6f 6f 6b 3f 44  (pDb->pWalHook?D
ccf0: 62 57 61 6c 48 61 6e 64 6c 65 72 3a 30 29 2c 20  bWalHandler:0), 
cd00: 70 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  pDb);.}../*.** T
cd10: 68 65 20 22 73 71 6c 69 74 65 22 20 63 6f 6d 6d  he "sqlite" comm
cd20: 61 6e 64 20 62 65 6c 6f 77 20 63 72 65 61 74 65  and below create
cd30: 73 20 61 20 6e 65 77 20 54 63 6c 20 63 6f 6d 6d  s a new Tcl comm
cd40: 61 6e 64 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20  and for each.** 
cd50: 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 74 20 6f 70  connection it op
cd60: 65 6e 73 20 74 6f 20 61 6e 20 53 51 4c 69 74 65  ens to an SQLite
cd70: 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 69 73   database.  This
cd80: 20 72 6f 75 74 69 6e 65 20 69 73 20 69 6e 76 6f   routine is invo
cd90: 6b 65 64 0a 2a 2a 20 77 68 65 6e 65 76 65 72 20  ked.** whenever 
cda0: 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20 63 6f 6e  one of those con
cdb0: 6e 65 63 74 69 6f 6e 2d 73 70 65 63 69 66 69 63  nection-specific
cdc0: 20 63 6f 6d 6d 61 6e 64 73 20 69 73 20 65 78 65   commands is exe
cdd0: 63 75 74 65 64 0a 2a 2a 20 69 6e 20 54 63 6c 2e  cuted.** in Tcl.
cde0: 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69    For example, i
cdf0: 66 20 79 6f 75 20 72 75 6e 20 54 63 6c 20 63 6f  f you run Tcl co
ce00: 64 65 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a  de like this:.**
ce10: 0a 2a 2a 20 20 20 20 20 20 20 73 71 6c 69 74 65  .**       sqlite
ce20: 33 20 64 62 31 20 20 22 6d 79 5f 64 61 74 61 62  3 db1  "my_datab
ce30: 61 73 65 22 0a 2a 2a 20 20 20 20 20 20 20 64 62  ase".**       db
ce40: 31 20 63 6c 6f 73 65 0a 2a 2a 0a 2a 2a 20 54 68  1 close.**.** Th
ce50: 65 20 66 69 72 73 74 20 63 6f 6d 6d 61 6e 64 20  e first command 
ce60: 6f 70 65 6e 73 20 61 20 63 6f 6e 6e 65 63 74 69  opens a connecti
ce70: 6f 6e 20 74 6f 20 74 68 65 20 22 6d 79 5f 64 61  on to the "my_da
ce80: 74 61 62 61 73 65 22 20 64 61 74 61 62 61 73 65  tabase" database
ce90: 0a 2a 2a 20 61 6e 64 20 63 61 6c 6c 73 20 74 68  .** and calls th
cea0: 61 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 22 64  at connection "d
ceb0: 62 31 22 2e 20 20 54 68 65 20 73 65 63 6f 6e 64  b1".  The second
cec0: 20 63 6f 6d 6d 61 6e 64 20 63 61 75 73 65 73 20   command causes 
ced0: 74 68 69 73 0a 2a 2a 20 73 75 62 72 6f 75 74 69  this.** subrouti
cee0: 6e 65 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64  ne to be invoked
cef0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
cf00: 44 62 4f 62 6a 43 6d 64 28 76 6f 69 64 20 2a 63  DbObjCmd(void *c
cf10: 64 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  d, Tcl_Interp *i
cf20: 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c  nterp, int objc,
cf30: 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 2a 6f  Tcl_Obj *const*o
cf40: 62 6a 76 29 7b 0a 20 20 53 71 6c 69 74 65 44 62  bjv){.  SqliteDb
cf50: 20 2a 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44   *pDb = (SqliteD
cf60: 62 2a 29 63 64 3b 0a 20 20 69 6e 74 20 63 68 6f  b*)cd;.  int cho
cf70: 69 63 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ice;.  int rc = 
cf80: 54 43 4c 5f 4f 4b 3b 0a 20 20 73 74 61 74 69 63  TCL_OK;.  static
cf90: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 44 42 5f   const char *DB_
cfa0: 73 74 72 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 22  strs[] = {.    "
cfb0: 61 75 74 68 6f 72 69 7a 65 72 22 2c 20 20 20 20  authorizer",    
cfc0: 20 20 20 20 20 22 62 61 63 6b 75 70 22 2c 20 20       "backup",  
cfd0: 20 20 20 20 20 20 20 20 20 20 22 62 75 73 79 22            "busy"
cfe0: 2c 0a 20 20 20 20 22 63 61 63 68 65 22 2c 20 20  ,.    "cache",  
cff0: 20 20 20 20 20 20 20 20 20 20 20 20 22 63 68 61              "cha
d000: 6e 67 65 73 22 2c 20 20 20 20 20 20 20 20 20 20  nges",          
d010: 20 22 63 6c 6f 73 65 22 2c 0a 20 20 20 20 22 63   "close",.    "c
d020: 6f 6c 6c 61 74 65 22 2c 20 20 20 20 20 20 20 20  ollate",        
d030: 20 20 20 20 22 63 6f 6c 6c 61 74 69 6f 6e 5f 6e      "collation_n
d040: 65 65 64 65 64 22 2c 20 20 22 63 6f 6d 6d 69 74  eeded",  "commit
d050: 5f 68 6f 6f 6b 22 2c 0a 20 20 20 20 22 63 6f 6d  _hook",.    "com
d060: 70 6c 65 74 65 22 2c 20 20 20 20 20 20 20 20 20  plete",         
d070: 20 20 22 63 6f 70 79 22 2c 20 20 20 20 20 20 20    "copy",       
d080: 20 20 20 20 20 20 20 22 65 6e 61 62 6c 65 5f 6c         "enable_l
d090: 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e 22 2c 0a  oad_extension",.
d0a0: 20 20 20 20 22 65 72 72 6f 72 63 6f 64 65 22 2c      "errorcode",
d0b0: 20 20 20 20 20 20 20 20 20 20 22 65 76 61 6c 22            "eval"
d0c0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  ,              "
d0d0: 65 78 69 73 74 73 22 2c 0a 20 20 20 20 22 66 75  exists",.    "fu
d0e0: 6e 63 74 69 6f 6e 22 2c 20 20 20 20 20 20 20 20  nction",        
d0f0: 20 20 20 22 69 6e 63 72 62 6c 6f 62 22 2c 20 20     "incrblob",  
d100: 20 20 20 20 20 20 20 20 22 69 6e 74 65 72 72 75          "interru
d110: 70 74 22 2c 0a 20 20 20 20 22 6c 61 73 74 5f 69  pt",.    "last_i
d120: 6e 73 65 72 74 5f 72 6f 77 69 64 22 2c 20 20 22  nsert_rowid",  "
d130: 6e 75 6c 6c 76 61 6c 75 65 22 2c 20 20 20 20 20  nullvalue",     
d140: 20 20 20 20 22 6f 6e 65 63 6f 6c 75 6d 6e 22 2c      "onecolumn",
d150: 0a 20 20 20 20 22 70 72 65 75 70 64 61 74 65 22  .    "preupdate"
d160: 2c 0a 20 20 20 20 22 70 72 6f 66 69 6c 65 22 2c  ,.    "profile",
d170: 20 20 20 20 20 20 20 20 20 20 20 20 22 70 72 6f              "pro
d180: 67 72 65 73 73 22 2c 20 20 20 20 20 20 20 20 20  gress",         
d190: 20 22 72 65 6b 65 79 22 2c 0a 20 20 20 20 22 72   "rekey",.    "r
d1a0: 65 73 74 6f 72 65 22 2c 20 20 20 20 20 20 20 20  estore",        
d1b0: 20 20 20 20 22 72 6f 6c 6c 62 61 63 6b 5f 68 6f      "rollback_ho
d1c0: 6f 6b 22 2c 20 20 20 20 20 22 73 74 61 74 75 73  ok",     "status
d1d0: 22 2c 0a 20 20 20 20 22 74 69 6d 65 6f 75 74 22  ",.    "timeout"
d1e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 22 74 6f  ,            "to
d1f0: 74 61 6c 5f 63 68 61 6e 67 65 73 22 2c 20 20 20  tal_changes",   
d200: 20 20 22 74 72 61 63 65 22 2c 0a 20 20 20 20 22    "trace",.    "
d210: 74 72 61 6e 73 61 63 74 69 6f 6e 22 2c 20 20 20  transaction",   
d220: 20 20 20 20 20 22 75 6e 6c 6f 63 6b 5f 6e 6f 74       "unlock_not
d230: 69 66 79 22 2c 20 20 20 20 20 22 75 70 64 61 74  ify",     "updat
d240: 65 5f 68 6f 6f 6b 22 2c 0a 20 20 20 20 22 76 65  e_hook",.    "ve
d250: 72 73 69 6f 6e 22 2c 20 20 20 20 20 20 20 20 20  rsion",         
d260: 20 20 20 22 77 61 6c 5f 68 6f 6f 6b 22 2c 20 20     "wal_hook",  
d270: 20 20 20 20 20 20 20 20 30 0a 20 20 7d 3b 0a 20          0.  };. 
d280: 20 65 6e 75 6d 20 44 42 5f 65 6e 75 6d 20 7b 0a   enum DB_enum {.
d290: 20 20 20 20 44 42 5f 41 55 54 48 4f 52 49 5a 45      DB_AUTHORIZE
d2a0: 52 2c 20 20 20 20 20 20 20 20 44 42 5f 42 41 43  R,        DB_BAC
d2b0: 4b 55 50 2c 20 20 20 20 20 20 20 20 20 20 20 44  KUP,           D
d2c0: 42 5f 42 55 53 59 2c 0a 20 20 20 20 44 42 5f 43  B_BUSY,.    DB_C
d2d0: 41 43 48 45 2c 20 20 20 20 20 20 20 20 20 20 20  ACHE,           
d2e0: 20 20 44 42 5f 43 48 41 4e 47 45 53 2c 20 20 20    DB_CHANGES,   
d2f0: 20 20 20 20 20 20 20 44 42 5f 43 4c 4f 53 45 2c         DB_CLOSE,
d300: 0a 20 20 20 20 44 42 5f 43 4f 4c 4c 41 54 45 2c  .    DB_COLLATE,
d310: 20 20 20 20 20 20 20 20 20 20 20 44 42 5f 43 4f             DB_CO
d320: 4c 4c 41 54 49 4f 4e 5f 4e 45 45 44 45 44 2c 20  LLATION_NEEDED, 
d330: 44 42 5f 43 4f 4d 4d 49 54 5f 48 4f 4f 4b 2c 0a  DB_COMMIT_HOOK,.
d340: 20 20 20 20 44 42 5f 43 4f 4d 50 4c 45 54 45 2c      DB_COMPLETE,
d350: 20 20 20 20 20 20 20 20 20 20 44 42 5f 43 4f 50            DB_COP
d360: 59 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 44  Y,             D
d370: 42 5f 45 4e 41 42 4c 45 5f 4c 4f 41 44 5f 45 58  B_ENABLE_LOAD_EX
d380: 54 45 4e 53 49 4f 4e 2c 0a 20 20 20 20 44 42 5f  TENSION,.    DB_
d390: 45 52 52 4f 52 43 4f 44 45 2c 20 20 20 20 20 20  ERRORCODE,      
d3a0: 20 20 20 44 42 5f 45 56 41 4c 2c 20 20 20 20 20     DB_EVAL,     
d3b0: 20 20 20 20 20 20 20 20 44 42 5f 45 58 49 53 54          DB_EXIST
d3c0: 53 2c 0a 20 20 20 20 44 42 5f 46 55 4e 43 54 49  S,.    DB_FUNCTI
d3d0: 4f 4e 2c 20 20 20 20 20 20 20 20 20 20 44 42 5f  ON,          DB_
d3e0: 49 4e 43 52 42 4c 4f 42 2c 20 20 20 20 20 20 20  INCRBLOB,       
d3f0: 20 20 44 42 5f 49 4e 54 45 52 52 55 50 54 2c 0a    DB_INTERRUPT,.
d400: 20 20 20 20 44 42 5f 4c 41 53 54 5f 49 4e 53 45      DB_LAST_INSE
d410: 52 54 5f 52 4f 57 49 44 2c 20 44 42 5f 4e 55 4c  RT_ROWID, DB_NUL
d420: 4c 56 41 4c 55 45 2c 20 20 20 20 20 20 20 20 44  LVALUE,        D
d430: 42 5f 4f 4e 45 43 4f 4c 55 4d 4e 2c 0a 20 20 20  B_ONECOLUMN,.   
d440: 20 44 42 5f 50 52 45 55 50 44 41 54 45 2c 0a 20   DB_PREUPDATE,. 
d450: 20 20 20 44 42 5f 50 52 4f 46 49 4c 45 2c 20 20     DB_PROFILE,  
d460: 20 20 20 20 20 20 20 20 20 44 42 5f 50 52 4f 47           DB_PROG
d470: 52 45 53 53 2c 20 20 20 20 20 20 20 20 20 44 42  RESS,         DB
d480: 5f 52 45 4b 45 59 2c 0a 20 20 20 20 44 42 5f 52  _REKEY,.    DB_R
d490: 45 53 54 4f 52 45 2c 20 20 20 20 20 20 20 20 20  ESTORE,         
d4a0: 20 20 44 42 5f 52 4f 4c 4c 42 41 43 4b 5f 48 4f    DB_ROLLBACK_HO
d4b0: 4f 4b 2c 20 20 20 20 44 42 5f 53 54 41 54 55 53  OK,    DB_STATUS
d4c0: 2c 0a 20 20 20 20 44 42 5f 54 49 4d 45 4f 55 54  ,.    DB_TIMEOUT
d4d0: 2c 20 20 20 20 20 20 20 20 20 20 20 44 42 5f 54  ,           DB_T
d4e0: 4f 54 41 4c 5f 43 48 41 4e 47 45 53 2c 20 20 20  OTAL_CHANGES,   
d4f0: 20 44 42 5f 54 52 41 43 45 2c 0a 20 20 20 20 44   DB_TRACE,.    D
d500: 42 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20 20  B_TRANSACTION,  
d510: 20 20 20 20 20 44 42 5f 55 4e 4c 4f 43 4b 5f 4e       DB_UNLOCK_N
d520: 4f 54 49 46 59 2c 20 20 20 20 44 42 5f 55 50 44  OTIFY,    DB_UPD
d530: 41 54 45 5f 48 4f 4f 4b 2c 0a 20 20 20 20 44 42  ATE_HOOK,.    DB
d540: 5f 56 45 52 53 49 4f 4e 2c 20 20 20 20 20 20 20  _VERSION,       
d550: 20 20 20 20 44 42 5f 57 41 4c 5f 48 4f 4f 4b 0a      DB_WAL_HOOK.
d560: 20 20 7d 3b 0a 20 20 2f 2a 20 64 6f 6e 27 74 20    };.  /* don't 
d570: 6c 65 61 76 65 20 74 72 61 69 6c 69 6e 67 20 63  leave trailing c
d580: 6f 6d 6d 61 73 20 6f 6e 20 44 42 5f 65 6e 75 6d  ommas on DB_enum
d590: 2c 20 69 74 20 63 6f 6e 66 75 73 65 73 20 74 68  , it confuses th
d5a0: 65 20 41 49 58 20 78 6c 63 20 63 6f 6d 70 69 6c  e AIX xlc compil
d5b0: 65 72 20 2a 2f 0a 0a 20 20 69 66 28 20 6f 62 6a  er */..  if( obj
d5c0: 63 3c 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  c<2 ){.    Tcl_W
d5d0: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
d5e0: 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53 55  rp, 1, objv, "SU
d5f0: 42 43 4f 4d 4d 41 4e 44 20 2e 2e 2e 22 29 3b 0a  BCOMMAND ...");.
d600: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
d610: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
d620: 54 63 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d  Tcl_GetIndexFrom
d630: 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
d640: 5b 31 5d 2c 20 44 42 5f 73 74 72 73 2c 20 22 6f  [1], DB_strs, "o
d650: 70 74 69 6f 6e 22 2c 20 30 2c 20 26 63 68 6f 69  ption", 0, &choi
d660: 63 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ce) ){.    retur
d670: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
d680: 0a 0a 20 20 73 77 69 74 63 68 28 20 28 65 6e 75  ..  switch( (enu
d690: 6d 20 44 42 5f 65 6e 75 6d 29 63 68 6f 69 63 65  m DB_enum)choice
d6a0: 20 29 7b 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62   ){..  /*    $db
d6b0: 20 61 75 74 68 6f 72 69 7a 65 72 20 3f 43 41 4c   authorizer ?CAL
d6c0: 4c 42 41 43 4b 3f 0a 20 20 2a 2a 0a 20 20 2a 2a  LBACK?.  **.  **
d6d0: 20 49 6e 76 6f 6b 65 20 74 68 65 20 67 69 76 65   Invoke the give
d6e0: 6e 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20 61 75  n callback to au
d6f0: 74 68 6f 72 69 7a 65 20 65 61 63 68 20 53 51 4c  thorize each SQL
d700: 20 6f 70 65 72 61 74 69 6f 6e 20 61 73 20 69 74   operation as it
d710: 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 70 69 6c 65   is.  ** compile
d720: 64 2e 20 20 35 20 61 72 67 75 6d 65 6e 74 73 20  d.  5 arguments 
d730: 61 72 65 20 61 70 70 65 6e 64 65 64 20 74 6f 20  are appended to 
d740: 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 62 65 66  the callback bef
d750: 6f 72 65 20 69 74 20 69 73 0a 20 20 2a 2a 20 69  ore it is.  ** i
d760: 6e 76 6f 6b 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a  nvoked:.  **.  *
d770: 2a 20 20 20 28 31 29 20 54 68 65 20 61 75 74 68  *   (1) The auth
d780: 6f 72 69 7a 61 74 69 6f 6e 20 74 79 70 65 20 28  orization type (
d790: 65 78 3a 20 53 51 4c 49 54 45 5f 43 52 45 41 54  ex: SQLITE_CREAT
d7a0: 45 5f 54 41 42 4c 45 2c 20 53 51 4c 49 54 45 5f  E_TABLE, SQLITE_
d7b0: 49 4e 53 45 52 54 2c 20 2e 2e 2e 29 0a 20 20 2a  INSERT, ...).  *
d7c0: 2a 20 20 20 28 32 29 20 46 69 72 73 74 20 64 65  *   (2) First de
d7d0: 73 63 72 69 70 74 69 76 65 20 6e 61 6d 65 20 28  scriptive name (
d7e0: 64 65 70 65 6e 64 73 20 6f 6e 20 61 75 74 68 6f  depends on autho
d7f0: 72 69 7a 61 74 69 6f 6e 20 74 79 70 65 29 0a 20  rization type). 
d800: 20 2a 2a 20 20 20 28 33 29 20 53 65 63 6f 6e 64   **   (3) Second
d810: 20 64 65 73 63 72 69 70 74 69 76 65 20 6e 61 6d   descriptive nam
d820: 65 0a 20 20 2a 2a 20 20 20 28 34 29 20 4e 61 6d  e.  **   (4) Nam
d830: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
d840: 65 20 28 65 78 3a 20 22 6d 61 69 6e 22 2c 20 22  e (ex: "main", "
d850: 74 65 6d 70 22 29 0a 20 20 2a 2a 20 20 20 28 35  temp").  **   (5
d860: 29 20 4e 61 6d 65 20 6f 66 20 74 72 69 67 67 65  ) Name of trigge
d870: 72 20 74 68 61 74 20 69 73 20 64 6f 69 6e 67 20  r that is doing 
d880: 74 68 65 20 61 63 63 65 73 73 0a 20 20 2a 2a 0a  the access.  **.
d890: 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c 62 61 63    ** The callbac
d8a0: 6b 20 73 68 6f 75 6c 64 20 72 65 74 75 72 6e 20  k should return 
d8b0: 6f 6e 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  on of the follow
d8c0: 69 6e 67 20 73 74 72 69 6e 67 73 3a 20 53 51 4c  ing strings: SQL
d8d0: 49 54 45 5f 4f 4b 2c 0a 20 20 2a 2a 20 53 51 4c  ITE_OK,.  ** SQL
d8e0: 49 54 45 5f 49 47 4e 4f 52 45 2c 20 6f 72 20 53  ITE_IGNORE, or S
d8f0: 51 4c 49 54 45 5f 44 45 4e 59 2e 20 20 41 6e 79  QLITE_DENY.  Any
d900: 20 6f 74 68 65 72 20 72 65 74 75 72 6e 20 76 61   other return va
d910: 6c 75 65 20 69 73 20 61 6e 20 65 72 72 6f 72 2e  lue is an error.
d920: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68  .  **.  ** If th
d930: 69 73 20 6d 65 74 68 6f 64 20 69 73 20 69 6e 76  is method is inv
d940: 6f 6b 65 64 20 77 69 74 68 20 6e 6f 20 61 72 67  oked with no arg
d950: 75 6d 65 6e 74 73 2c 20 74 68 65 20 63 75 72 72  uments, the curr
d960: 65 6e 74 20 61 75 74 68 6f 72 69 7a 61 74 69 6f  ent authorizatio
d970: 6e 0a 20 20 2a 2a 20 63 61 6c 6c 62 61 63 6b 20  n.  ** callback 
d980: 73 74 72 69 6e 67 20 69 73 20 72 65 74 75 72 6e  string is return
d990: 65 64 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  ed..  */.  case 
d9a0: 44 42 5f 41 55 54 48 4f 52 49 5a 45 52 3a 20 7b  DB_AUTHORIZER: {
d9b0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
d9c0: 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f  MIT_AUTHORIZATIO
d9d0: 4e 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  N.    Tcl_Append
d9e0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
d9f0: 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 6e 6f  authorization no
da00: 74 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 74  t available in t
da10: 68 69 73 20 62 75 69 6c 64 22 2c 20 30 29 3b 0a  his build", 0);.
da20: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
da30: 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 20 20 20 20  RROR;.#else.    
da40: 69 66 28 20 6f 62 6a 63 3e 33 20 29 7b 0a 20 20  if( objc>3 ){.  
da50: 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
da60: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20  Args(interp, 2, 
da70: 6f 62 6a 76 2c 20 22 3f 43 41 4c 4c 42 41 43 4b  objv, "?CALLBACK
da80: 3f 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ?");.      retur
da90: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
daa0: 20 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d   }else if( objc=
dab0: 3d 32 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =2 ){.      if( 
dac0: 70 44 62 2d 3e 7a 41 75 74 68 20 29 7b 0a 20 20  pDb->zAuth ){.  
dad0: 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
dae0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70  Result(interp, p
daf0: 44 62 2d 3e 7a 41 75 74 68 2c 20 30 29 3b 0a 20  Db->zAuth, 0);. 
db00: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
db10: 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 41  {.      char *zA
db20: 75 74 68 3b 0a 20 20 20 20 20 20 69 6e 74 20 6c  uth;.      int l
db30: 65 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44  en;.      if( pD
db40: 62 2d 3e 7a 41 75 74 68 20 29 7b 0a 20 20 20 20  b->zAuth ){.    
db50: 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62      Tcl_Free(pDb
db60: 2d 3e 7a 41 75 74 68 29 3b 0a 20 20 20 20 20 20  ->zAuth);.      
db70: 7d 0a 20 20 20 20 20 20 7a 41 75 74 68 20 3d 20  }.      zAuth = 
db80: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
db90: 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c  mObj(objv[2], &l
dba0: 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  en);.      if( z
dbb0: 41 75 74 68 20 26 26 20 6c 65 6e 3e 30 20 29 7b  Auth && len>0 ){
dbc0: 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 41  .        pDb->zA
dbd0: 75 74 68 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28  uth = Tcl_Alloc(
dbe0: 20 6c 65 6e 20 2b 20 31 20 29 3b 0a 20 20 20 20   len + 1 );.    
dbf0: 20 20 20 20 6d 65 6d 63 70 79 28 70 44 62 2d 3e      memcpy(pDb->
dc00: 7a 41 75 74 68 2c 20 7a 41 75 74 68 2c 20 6c 65  zAuth, zAuth, le
dc10: 6e 2b 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  n+1);.      }els
dc20: 65 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e  e{.        pDb->
dc30: 7a 41 75 74 68 20 3d 20 30 3b 0a 20 20 20 20 20  zAuth = 0;.     
dc40: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 44 62   }.      if( pDb
dc50: 2d 3e 7a 41 75 74 68 20 29 7b 0a 20 20 20 20 20  ->zAuth ){.     
dc60: 20 20 20 70 44 62 2d 3e 69 6e 74 65 72 70 20 3d     pDb->interp =
dc70: 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 20 20 20   interp;.       
dc80: 20 73 71 6c 69 74 65 33 5f 73 65 74 5f 61 75 74   sqlite3_set_aut
dc90: 68 6f 72 69 7a 65 72 28 70 44 62 2d 3e 64 62 2c  horizer(pDb->db,
dca0: 20 61 75 74 68 5f 63 61 6c 6c 62 61 63 6b 2c 20   auth_callback, 
dcb0: 70 44 62 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  pDb);.      }els
dcc0: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
dcd0: 65 33 5f 73 65 74 5f 61 75 74 68 6f 72 69 7a 65  e3_set_authorize
dce0: 72 28 70 44 62 2d 3e 64 62 2c 20 30 2c 20 30 29  r(pDb->db, 0, 0)
dcf0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
dd00: 23 65 6e 64 69 66 0a 20 20 20 20 62 72 65 61 6b  #endif.    break
dd10: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24  ;.  }..  /*    $
dd20: 64 62 20 62 61 63 6b 75 70 20 3f 44 41 54 41 42  db backup ?DATAB
dd30: 41 53 45 3f 20 46 49 4c 45 4e 41 4d 45 0a 20 20  ASE? FILENAME.  
dd40: 2a 2a 0a 20 20 2a 2a 20 4f 70 65 6e 20 6f 72 20  **.  ** Open or 
dd50: 63 72 65 61 74 65 20 61 20 64 61 74 61 62 61 73  create a databas
dd60: 65 20 66 69 6c 65 20 6e 61 6d 65 64 20 46 49 4c  e file named FIL
dd70: 45 4e 41 4d 45 2e 20 20 54 72 61 6e 73 66 65 72  ENAME.  Transfer
dd80: 20 74 68 65 0a 20 20 2a 2a 20 63 6f 6e 74 65 6e   the.  ** conten
dd90: 74 20 6f 66 20 6c 6f 63 61 6c 20 64 61 74 61 62  t of local datab
dda0: 61 73 65 20 44 41 54 41 42 41 53 45 20 28 64 65  ase DATABASE (de
ddb0: 66 61 75 6c 74 3a 20 22 6d 61 69 6e 22 29 20 69  fault: "main") i
ddc0: 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 46 49 4c  nto the.  ** FIL
ddd0: 45 4e 41 4d 45 20 64 61 74 61 62 61 73 65 2e 0a  ENAME database..
dde0: 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 42    */.  case DB_B
ddf0: 41 43 4b 55 50 3a 20 7b 0a 20 20 20 20 63 6f 6e  ACKUP: {.    con
de00: 73 74 20 63 68 61 72 20 2a 7a 44 65 73 74 46 69  st char *zDestFi
de10: 6c 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  le;.    const ch
de20: 61 72 20 2a 7a 53 72 63 44 62 3b 0a 20 20 20 20  ar *zSrcDb;.    
de30: 73 71 6c 69 74 65 33 20 2a 70 44 65 73 74 3b 0a  sqlite3 *pDest;.
de40: 20 20 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b      sqlite3_back
de50: 75 70 20 2a 70 42 61 63 6b 75 70 3b 0a 0a 20 20  up *pBackup;..  
de60: 20 20 69 66 28 20 6f 62 6a 63 3d 3d 33 20 29 7b    if( objc==3 ){
de70: 0a 20 20 20 20 20 20 7a 53 72 63 44 62 20 3d 20  .      zSrcDb = 
de80: 22 6d 61 69 6e 22 3b 0a 20 20 20 20 20 20 7a 44  "main";.      zD
de90: 65 73 74 46 69 6c 65 20 3d 20 54 63 6c 5f 47 65  estFile = Tcl_Ge
dea0: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29  tString(objv[2])
deb0: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
dec0: 6f 62 6a 63 3d 3d 34 20 29 7b 0a 20 20 20 20 20  objc==4 ){.     
ded0: 20 7a 53 72 63 44 62 20 3d 20 54 63 6c 5f 47 65   zSrcDb = Tcl_Ge
dee0: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29  tString(objv[2])
def0: 3b 0a 20 20 20 20 20 20 7a 44 65 73 74 46 69 6c  ;.      zDestFil
df00: 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  e = Tcl_GetStrin
df10: 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a 20 20 20 20  g(objv[3]);.    
df20: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 54 63 6c  }else{.      Tcl
df30: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
df40: 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22  terp, 2, objv, "
df50: 3f 44 41 54 41 42 41 53 45 3f 20 46 49 4c 45 4e  ?DATABASE? FILEN
df60: 41 4d 45 22 29 3b 0a 20 20 20 20 20 20 72 65 74  AME");.      ret
df70: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
df80: 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71     }.    rc = sq
df90: 6c 69 74 65 33 5f 6f 70 65 6e 28 7a 44 65 73 74  lite3_open(zDest
dfa0: 46 69 6c 65 2c 20 26 70 44 65 73 74 29 3b 0a 20  File, &pDest);. 
dfb0: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
dfc0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 54 63  E_OK ){.      Tc
dfd0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
dfe0: 6e 74 65 72 70 2c 20 22 63 61 6e 6e 6f 74 20 6f  nterp, "cannot o
dff0: 70 65 6e 20 74 61 72 67 65 74 20 64 61 74 61 62  pen target datab
e000: 61 73 65 3a 20 22 2c 0a 20 20 20 20 20 20 20 20  ase: ",.        
e010: 20 20 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73     sqlite3_errms
e020: 67 28 70 44 65 73 74 29 2c 20 28 63 68 61 72 2a  g(pDest), (char*
e030: 29 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  )0);.      sqlit
e040: 65 33 5f 63 6c 6f 73 65 28 70 44 65 73 74 29 3b  e3_close(pDest);
e050: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
e060: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
e070: 20 20 20 70 42 61 63 6b 75 70 20 3d 20 73 71 6c     pBackup = sql
e080: 69 74 65 33 5f 62 61 63 6b 75 70 5f 69 6e 69 74  ite3_backup_init
e090: 28 70 44 65 73 74 2c 20 22 6d 61 69 6e 22 2c 20  (pDest, "main", 
e0a0: 70 44 62 2d 3e 64 62 2c 20 7a 53 72 63 44 62 29  pDb->db, zSrcDb)
e0b0: 3b 0a 20 20 20 20 69 66 28 20 70 42 61 63 6b 75  ;.    if( pBacku
e0c0: 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 54 63  p==0 ){.      Tc
e0d0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
e0e0: 6e 74 65 72 70 2c 20 22 62 61 63 6b 75 70 20 66  nterp, "backup f
e0f0: 61 69 6c 65 64 3a 20 22 2c 0a 20 20 20 20 20 20  ailed: ",.      
e100: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65 72 72       sqlite3_err
e110: 6d 73 67 28 70 44 65 73 74 29 2c 20 28 63 68 61  msg(pDest), (cha
e120: 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  r*)0);.      sql
e130: 69 74 65 33 5f 63 6c 6f 73 65 28 70 44 65 73 74  ite3_close(pDest
e140: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
e150: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
e160: 0a 20 20 20 20 77 68 69 6c 65 28 20 20 28 72 63  .    while(  (rc
e170: 20 3d 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75   = sqlite3_backu
e180: 70 5f 73 74 65 70 28 70 42 61 63 6b 75 70 2c 31  p_step(pBackup,1
e190: 30 30 29 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  00))==SQLITE_OK 
e1a0: 29 7b 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  ){}.    sqlite3_
e1b0: 62 61 63 6b 75 70 5f 66 69 6e 69 73 68 28 70 42  backup_finish(pB
e1c0: 61 63 6b 75 70 29 3b 0a 20 20 20 20 69 66 28 20  ackup);.    if( 
e1d0: 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc==SQLITE_DONE 
e1e0: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 54 43  ){.      rc = TC
e1f0: 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  L_OK;.    }else{
e200: 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  .      Tcl_Appen
e210: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
e220: 22 62 61 63 6b 75 70 20 66 61 69 6c 65 64 3a 20  "backup failed: 
e230: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 73 71  ",.           sq
e240: 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44 65  lite3_errmsg(pDe
e250: 73 74 29 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  st), (char*)0);.
e260: 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45        rc = TCL_E
e270: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
e280: 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70 44  sqlite3_close(pD
e290: 65 73 74 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b  est);.    break;
e2a0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64  .  }..  /*    $d
e2b0: 62 20 62 75 73 79 20 3f 43 41 4c 4c 42 41 43 4b  b busy ?CALLBACK
e2c0: 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 76 6f  ?.  **.  ** Invo
e2d0: 6b 65 20 74 68 65 20 67 69 76 65 6e 20 63 61 6c  ke the given cal
e2e0: 6c 62 61 63 6b 20 69 66 20 61 6e 20 53 51 4c 20  lback if an SQL 
e2f0: 73 74 61 74 65 6d 65 6e 74 20 61 74 74 65 6d 70  statement attemp
e300: 74 73 20 74 6f 20 6f 70 65 6e 0a 20 20 2a 2a 20  ts to open.  ** 
e310: 61 20 6c 6f 63 6b 65 64 20 64 61 74 61 62 61 73  a locked databas
e320: 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 63  e file..  */.  c
e330: 61 73 65 20 44 42 5f 42 55 53 59 3a 20 7b 0a 20  ase DB_BUSY: {. 
e340: 20 20 20 69 66 28 20 6f 62 6a 63 3e 33 20 29 7b     if( objc>3 ){
e350: 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  .      Tcl_Wrong
e360: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
e370: 32 2c 20 6f 62 6a 76 2c 20 22 43 41 4c 4c 42 41  2, objv, "CALLBA
e380: 43 4b 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  CK");.      retu
e390: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
e3a0: 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a 63    }else if( objc
e3b0: 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==2 ){.      if(
e3c0: 20 70 44 62 2d 3e 7a 42 75 73 79 20 29 7b 0a 20   pDb->zBusy ){. 
e3d0: 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e         Tcl_Appen
e3e0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
e3f0: 70 44 62 2d 3e 7a 42 75 73 79 2c 20 30 29 3b 0a  pDb->zBusy, 0);.
e400: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
e410: 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  e{.      char *z
e420: 42 75 73 79 3b 0a 20 20 20 20 20 20 69 6e 74 20  Busy;.      int 
e430: 6c 65 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 70  len;.      if( p
e440: 44 62 2d 3e 7a 42 75 73 79 20 29 7b 0a 20 20 20  Db->zBusy ){.   
e450: 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44       Tcl_Free(pD
e460: 62 2d 3e 7a 42 75 73 79 29 3b 0a 20 20 20 20 20  b->zBusy);.     
e470: 20 7d 0a 20 20 20 20 20 20 7a 42 75 73 79 20 3d   }.      zBusy =
e480: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
e490: 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26  omObj(objv[2], &
e4a0: 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20  len);.      if( 
e4b0: 7a 42 75 73 79 20 26 26 20 6c 65 6e 3e 30 20 29  zBusy && len>0 )
e4c0: 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a  {.        pDb->z
e4d0: 42 75 73 79 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63  Busy = Tcl_Alloc
e4e0: 28 20 6c 65 6e 20 2b 20 31 20 29 3b 0a 20 20 20  ( len + 1 );.   
e4f0: 20 20 20 20 20 6d 65 6d 63 70 79 28 70 44 62 2d       memcpy(pDb-
e500: 3e 7a 42 75 73 79 2c 20 7a 42 75 73 79 2c 20 6c  >zBusy, zBusy, l
e510: 65 6e 2b 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c  en+1);.      }el
e520: 73 65 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d  se{.        pDb-
e530: 3e 7a 42 75 73 79 20 3d 20 30 3b 0a 20 20 20 20  >zBusy = 0;.    
e540: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 44    }.      if( pD
e550: 62 2d 3e 7a 42 75 73 79 20 29 7b 0a 20 20 20 20  b->zBusy ){.    
e560: 20 20 20 20 70 44 62 2d 3e 69 6e 74 65 72 70 20      pDb->interp 
e570: 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 20 20  = interp;.      
e580: 20 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 68    sqlite3_busy_h
e590: 61 6e 64 6c 65 72 28 70 44 62 2d 3e 64 62 2c 20  andler(pDb->db, 
e5a0: 44 62 42 75 73 79 48 61 6e 64 6c 65 72 2c 20 70  DbBusyHandler, p
e5b0: 44 62 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  Db);.      }else
e5c0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
e5d0: 33 5f 62 75 73 79 5f 68 61 6e 64 6c 65 72 28 70  3_busy_handler(p
e5e0: 44 62 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20  Db->db, 0, 0);. 
e5f0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
e600: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
e610: 2a 20 20 20 20 20 24 64 62 20 63 61 63 68 65 20  *     $db cache 
e620: 66 6c 75 73 68 0a 20 20 2a 2a 20 20 20 20 20 24  flush.  **     $
e630: 64 62 20 63 61 63 68 65 20 73 69 7a 65 20 6e 0a  db cache size n.
e640: 20 20 2a 2a 0a 20 20 2a 2a 20 46 6c 75 73 68 20    **.  ** Flush 
e650: 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61  the prepared sta
e660: 74 65 6d 65 6e 74 20 63 61 63 68 65 2c 20 6f 72  tement cache, or
e670: 20 73 65 74 20 74 68 65 20 6d 61 78 69 6d 75 6d   set the maximum
e680: 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 2a 2a 20   number of.  ** 
e690: 63 61 63 68 65 64 20 73 74 61 74 65 6d 65 6e 74  cached statement
e6a0: 73 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  s..  */.  case D
e6b0: 42 5f 43 41 43 48 45 3a 20 7b 0a 20 20 20 20 63  B_CACHE: {.    c
e6c0: 68 61 72 20 2a 73 75 62 43 6d 64 3b 0a 20 20 20  har *subCmd;.   
e6d0: 20 69 6e 74 20 6e 3b 0a 0a 20 20 20 20 69 66 28   int n;..    if(
e6e0: 20 6f 62 6a 63 3c 3d 32 20 29 7b 0a 20 20 20 20   objc<=2 ){.    
e6f0: 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
e700: 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
e710: 6a 76 2c 20 22 63 61 63 68 65 20 6f 70 74 69 6f  jv, "cache optio
e720: 6e 20 3f 61 72 67 3f 22 29 3b 0a 20 20 20 20 20  n ?arg?");.     
e730: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
e740: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 75 62  R;.    }.    sub
e750: 43 6d 64 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  Cmd = Tcl_GetStr
e760: 69 6e 67 46 72 6f 6d 4f 62 6a 28 20 6f 62 6a 76  ingFromObj( objv
e770: 5b 32 5d 2c 20 30 20 29 3b 0a 20 20 20 20 69 66  [2], 0 );.    if
e780: 28 20 2a 73 75 62 43 6d 64 3d 3d 27 66 27 20 26  ( *subCmd=='f' &
e790: 26 20 73 74 72 63 6d 70 28 73 75 62 43 6d 64 2c  & strcmp(subCmd,
e7a0: 22 66 6c 75 73 68 22 29 3d 3d 30 20 29 7b 0a 20  "flush")==0 ){. 
e7b0: 20 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 33       if( objc!=3
e7c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f   ){.        Tcl_
e7d0: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
e7e0: 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 66  erp, 2, objv, "f
e7f0: 6c 75 73 68 22 29 3b 0a 20 20 20 20 20 20 20 20  lush");.        
e800: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
e810: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
e820: 20 20 20 20 20 20 20 66 6c 75 73 68 53 74 6d 74         flushStmt
e830: 43 61 63 68 65 28 20 70 44 62 20 29 3b 0a 20 20  Cache( pDb );.  
e840: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
e850: 69 66 28 20 2a 73 75 62 43 6d 64 3d 3d 27 73 27  if( *subCmd=='s'
e860: 20 26 26 20 73 74 72 63 6d 70 28 73 75 62 43 6d   && strcmp(subCm
e870: 64 2c 22 73 69 7a 65 22 29 3d 3d 30 20 29 7b 0a  d,"size")==0 ){.
e880: 20 20 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d        if( objc!=
e890: 34 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c  4 ){.        Tcl
e8a0: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
e8b0: 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22  terp, 2, objv, "
e8c0: 73 69 7a 65 20 6e 22 29 3b 0a 20 20 20 20 20 20  size n");.      
e8d0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
e8e0: 4f 52 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  OR;.      }else{
e8f0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 54 43 4c  .        if( TCL
e900: 5f 45 52 52 4f 52 3d 3d 54 63 6c 5f 47 65 74 49  _ERROR==Tcl_GetI
e910: 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
e920: 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 6e 29 20 29  , objv[3], &n) )
e930: 7b 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f  {.          Tcl_
e940: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 20 69 6e  AppendResult( in
e950: 74 65 72 70 2c 20 22 63 61 6e 6e 6f 74 20 63 6f  terp, "cannot co
e960: 6e 76 65 72 74 20 5c 22 22 2c 20 0a 20 20 20 20  nvert \"", .    
e970: 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 47             Tcl_G
e980: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
e990: 6f 62 6a 76 5b 33 5d 2c 30 29 2c 20 22 5c 22 20  objv[3],0), "\" 
e9a0: 74 6f 20 69 6e 74 65 67 65 72 22 2c 20 30 29 3b  to integer", 0);
e9b0: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
e9c0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
e9d0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
e9e0: 20 20 20 20 20 20 69 66 28 20 6e 3c 30 20 29 7b        if( n<0 ){
e9f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6c 75  .            flu
ea00: 73 68 53 74 6d 74 43 61 63 68 65 28 20 70 44 62  shStmtCache( pDb
ea10: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
ea20: 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  n = 0;.         
ea30: 20 7d 65 6c 73 65 20 69 66 28 20 6e 3e 4d 41 58   }else if( n>MAX
ea40: 5f 50 52 45 50 41 52 45 44 5f 53 54 4d 54 53 20  _PREPARED_STMTS 
ea50: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e  ){.            n
ea60: 20 3d 20 4d 41 58 5f 50 52 45 50 41 52 45 44 5f   = MAX_PREPARED_
ea70: 53 54 4d 54 53 3b 0a 20 20 20 20 20 20 20 20 20  STMTS;.         
ea80: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 44 62   }.          pDb
ea90: 2d 3e 6d 61 78 53 74 6d 74 20 3d 20 6e 3b 0a 20  ->maxStmt = n;. 
eaa0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
eab0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
eac0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
ead0: 6c 74 28 20 69 6e 74 65 72 70 2c 20 22 62 61 64  lt( interp, "bad
eae0: 20 6f 70 74 69 6f 6e 20 5c 22 22 2c 20 0a 20 20   option \"", .  
eaf0: 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53          Tcl_GetS
eb00: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
eb10: 76 5b 32 5d 2c 30 29 2c 20 22 5c 22 3a 20 6d 75  v[2],0), "\": mu
eb20: 73 74 20 62 65 20 66 6c 75 73 68 20 6f 72 20 73  st be flush or s
eb30: 69 7a 65 22 2c 20 30 29 3b 0a 20 20 20 20 20 20  ize", 0);.      
eb40: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
eb50: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61  ;.    }.    brea
eb60: 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20  k;.  }..  /*    
eb70: 20 24 64 62 20 63 68 61 6e 67 65 73 0a 20 20 2a   $db changes.  *
eb80: 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 74 68  *.  ** Return th
eb90: 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
eba0: 20 74 68 61 74 20 77 65 72 65 20 6d 6f 64 69 66   that were modif
ebb0: 69 65 64 2c 20 69 6e 73 65 72 74 65 64 2c 20 6f  ied, inserted, o
ebc0: 72 20 64 65 6c 65 74 65 64 20 62 79 0a 20 20 2a  r deleted by.  *
ebd0: 2a 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  * the most recen
ebe0: 74 20 49 4e 53 45 52 54 2c 20 55 50 44 41 54 45  t INSERT, UPDATE
ebf0: 20 6f 72 20 44 45 4c 45 54 45 20 73 74 61 74 65   or DELETE state
ec00: 6d 65 6e 74 2c 20 6e 6f 74 20 69 6e 63 6c 75 64  ment, not includ
ec10: 69 6e 67 20 0a 20 20 2a 2a 20 61 6e 79 20 63 68  ing .  ** any ch
ec20: 61 6e 67 65 73 20 6d 61 64 65 20 62 79 20 74 72  anges made by tr
ec30: 69 67 67 65 72 20 70 72 6f 67 72 61 6d 73 2e 0a  igger programs..
ec40: 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 43    */.  case DB_C
ec50: 48 41 4e 47 45 53 3a 20 7b 0a 20 20 20 20 54 63  HANGES: {.    Tc
ec60: 6c 5f 4f 62 6a 20 2a 70 52 65 73 75 6c 74 3b 0a  l_Obj *pResult;.
ec70: 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20      if( objc!=2 
ec80: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f  ){.      Tcl_Wro
ec90: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
eca0: 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 22 29 3b 0a  , 2, objv, "");.
ecb0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
ecc0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
ecd0: 20 20 70 52 65 73 75 6c 74 20 3d 20 54 63 6c 5f    pResult = Tcl_
ece0: 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  GetObjResult(int
ecf0: 65 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65  erp);.    Tcl_Se
ed00: 74 49 6e 74 4f 62 6a 28 70 52 65 73 75 6c 74 2c  tIntObj(pResult,
ed10: 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73   sqlite3_changes
ed20: 28 70 44 62 2d 3e 64 62 29 29 3b 0a 20 20 20 20  (pDb->db));.    
ed30: 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
ed40: 20 20 20 20 24 64 62 20 63 6c 6f 73 65 0a 20 20      $db close.  
ed50: 2a 2a 0a 20 20 2a 2a 20 53 68 75 74 64 6f 77 6e  **.  ** Shutdown
ed60: 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20   the database.  
ed70: 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 43 4c 4f  */.  case DB_CLO
ed80: 53 45 3a 20 7b 0a 20 20 20 20 54 63 6c 5f 44 65  SE: {.    Tcl_De
ed90: 6c 65 74 65 43 6f 6d 6d 61 6e 64 28 69 6e 74 65  leteCommand(inte
eda0: 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
edb0: 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d  gFromObj(objv[0]
edc0: 2c 20 30 29 29 3b 0a 20 20 20 20 62 72 65 61 6b  , 0));.    break
edd0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ;.  }..  /*.  **
ede0: 20 20 20 20 20 24 64 62 20 63 6f 6c 6c 61 74 65       $db collate
edf0: 20 4e 41 4d 45 20 53 43 52 49 50 54 0a 20 20 2a   NAME SCRIPT.  *
ee00: 2a 0a 20 20 2a 2a 20 43 72 65 61 74 65 20 61 20  *.  ** Create a 
ee10: 6e 65 77 20 53 51 4c 20 63 6f 6c 6c 61 74 69 6f  new SQL collatio
ee20: 6e 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65  n function calle
ee30: 64 20 4e 41 4d 45 2e 20 20 57 68 65 6e 65 76 65  d NAME.  Wheneve
ee40: 72 0a 20 20 2a 2a 20 74 68 61 74 20 66 75 6e 63  r.  ** that func
ee50: 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20  tion is called, 
ee60: 69 6e 76 6f 6b 65 20 53 43 52 49 50 54 20 74 6f  invoke SCRIPT to
ee70: 20 65 76 61 6c 75 61 74 65 20 74 68 65 20 66 75   evaluate the fu
ee80: 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 63  nction..  */.  c
ee90: 61 73 65 20 44 42 5f 43 4f 4c 4c 41 54 45 3a 20  ase DB_COLLATE: 
eea0: 7b 0a 20 20 20 20 53 71 6c 43 6f 6c 6c 61 74 65  {.    SqlCollate
eeb0: 20 2a 70 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20   *pCollate;.    
eec0: 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20  char *zName;.   
eed0: 20 63 68 61 72 20 2a 7a 53 63 72 69 70 74 3b 0a   char *zScript;.
eee0: 20 20 20 20 69 6e 74 20 6e 53 63 72 69 70 74 3b      int nScript;
eef0: 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 34  .    if( objc!=4
ef00: 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72   ){.      Tcl_Wr
ef10: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
ef20: 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 4e 41 4d  p, 2, objv, "NAM
ef30: 45 20 53 43 52 49 50 54 22 29 3b 0a 20 20 20 20  E SCRIPT");.    
ef40: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
ef50: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4e  OR;.    }.    zN
ef60: 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  ame = Tcl_GetStr
ef70: 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
ef80: 32 5d 2c 20 30 29 3b 0a 20 20 20 20 7a 53 63 72  2], 0);.    zScr
ef90: 69 70 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  ipt = Tcl_GetStr
efa0: 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
efb0: 33 5d 2c 20 26 6e 53 63 72 69 70 74 29 3b 0a 20  3], &nScript);. 
efc0: 20 20 20 70 43 6f 6c 6c 61 74 65 20 3d 20 28 53     pCollate = (S
efd0: 71 6c 43 6f 6c 6c 61 74 65 2a 29 54 63 6c 5f 41  qlCollate*)Tcl_A
efe0: 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 43  lloc( sizeof(*pC
eff0: 6f 6c 6c 61 74 65 29 20 2b 20 6e 53 63 72 69 70  ollate) + nScrip
f000: 74 20 2b 20 31 20 29 3b 0a 20 20 20 20 69 66 28  t + 1 );.    if(
f010: 20 70 43 6f 6c 6c 61 74 65 3d 3d 30 20 29 20 72   pCollate==0 ) r
f020: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
f030: 0a 20 20 20 20 70 43 6f 6c 6c 61 74 65 2d 3e 69  .    pCollate->i
f040: 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a  nterp = interp;.
f050: 20 20 20 20 70 43 6f 6c 6c 61 74 65 2d 3e 70 4e      pCollate->pN
f060: 65 78 74 20 3d 20 70 44 62 2d 3e 70 43 6f 6c 6c  ext = pDb->pColl
f070: 61 74 65 3b 0a 20 20 20 20 70 43 6f 6c 6c 61 74  ate;.    pCollat
f080: 65 2d 3e 7a 53 63 72 69 70 74 20 3d 20 28 63 68  e->zScript = (ch
f090: 61 72 2a 29 26 70 43 6f 6c 6c 61 74 65 5b 31 5d  ar*)&pCollate[1]
f0a0: 3b 0a 20 20 20 20 70 44 62 2d 3e 70 43 6f 6c 6c  ;.    pDb->pColl
f0b0: 61 74 65 20 3d 20 70 43 6f 6c 6c 61 74 65 3b 0a  ate = pCollate;.
f0c0: 20 20 20 20 6d 65 6d 63 70 79 28 70 43 6f 6c 6c      memcpy(pColl
f0d0: 61 74 65 2d 3e 7a 53 63 72 69 70 74 2c 20 7a 53  ate->zScript, zS
f0e0: 63 72 69 70 74 2c 20 6e 53 63 72 69 70 74 2b 31  cript, nScript+1
f0f0: 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  );.    if( sqlit
f100: 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74  e3_create_collat
f110: 69 6f 6e 28 70 44 62 2d 3e 64 62 2c 20 7a 4e 61  ion(pDb->db, zNa
f120: 6d 65 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  me, SQLITE_UTF8,
f130: 20 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 61   .        pColla
f140: 74 65 2c 20 74 63 6c 53 71 6c 43 6f 6c 6c 61 74  te, tclSqlCollat
f150: 65 29 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  e) ){.      Tcl_
f160: 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
f170: 2c 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  , (char *)sqlite
f180: 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62  3_errmsg(pDb->db
f190: 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29  ), TCL_VOLATILE)
f1a0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
f1b0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
f1c0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
f1d0: 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64    /*.  **     $d
f1e0: 62 20 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64  b collation_need
f1f0: 65 64 20 53 43 52 49 50 54 0a 20 20 2a 2a 0a 20  ed SCRIPT.  **. 
f200: 20 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77   ** Create a new
f210: 20 53 51 4c 20 63 6f 6c 6c 61 74 69 6f 6e 20 66   SQL collation f
f220: 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 20 4e  unction called N
f230: 41 4d 45 2e 20 20 57 68 65 6e 65 76 65 72 0a 20  AME.  Whenever. 
f240: 20 2a 2a 20 74 68 61 74 20 66 75 6e 63 74 69 6f   ** that functio
f250: 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 6e 76  n is called, inv
f260: 6f 6b 65 20 53 43 52 49 50 54 20 74 6f 20 65 76  oke SCRIPT to ev
f270: 61 6c 75 61 74 65 20 74 68 65 20 66 75 6e 63 74  aluate the funct
f280: 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  ion..  */.  case
f290: 20 44 42 5f 43 4f 4c 4c 41 54 49 4f 4e 5f 4e 45   DB_COLLATION_NE
f2a0: 45 44 45 44 3a 20 7b 0a 20 20 20 20 69 66 28 20  EDED: {.    if( 
f2b0: 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 20  objc!=3 ){.     
f2c0: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
f2d0: 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a  s(interp, 2, obj
f2e0: 76 2c 20 22 53 43 52 49 50 54 22 29 3b 0a 20 20  v, "SCRIPT");.  
f2f0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
f300: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
f310: 69 66 28 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74  if( pDb->pCollat
f320: 65 4e 65 65 64 65 64 20 29 7b 0a 20 20 20 20 20  eNeeded ){.     
f330: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
f340: 74 28 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e  t(pDb->pCollateN
f350: 65 65 64 65 64 29 3b 0a 20 20 20 20 7d 0a 20 20  eeded);.    }.  
f360: 20 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e    pDb->pCollateN
f370: 65 65 64 65 64 20 3d 20 54 63 6c 5f 44 75 70 6c  eeded = Tcl_Dupl
f380: 69 63 61 74 65 4f 62 6a 28 6f 62 6a 76 5b 32 5d  icateObj(objv[2]
f390: 29 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52  );.    Tcl_IncrR
f3a0: 65 66 43 6f 75 6e 74 28 70 44 62 2d 3e 70 43 6f  efCount(pDb->pCo
f3b0: 6c 6c 61 74 65 4e 65 65 64 65 64 29 3b 0a 20 20  llateNeeded);.  
f3c0: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c 6c 61 74    sqlite3_collat
f3d0: 69 6f 6e 5f 6e 65 65 64 65 64 28 70 44 62 2d 3e  ion_needed(pDb->
f3e0: 64 62 2c 20 70 44 62 2c 20 74 63 6c 43 6f 6c 6c  db, pDb, tclColl
f3f0: 61 74 65 4e 65 65 64 65 64 29 3b 0a 20 20 20 20  ateNeeded);.    
f400: 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
f410: 20 20 20 20 24 64 62 20 63 6f 6d 6d 69 74 5f 68      $db commit_h
f420: 6f 6f 6b 20 3f 43 41 4c 4c 42 41 43 4b 3f 0a 20  ook ?CALLBACK?. 
f430: 20 2a 2a 0a 20 20 2a 2a 20 49 6e 76 6f 6b 65 20   **.  ** Invoke 
f440: 74 68 65 20 67 69 76 65 6e 20 63 61 6c 6c 62 61  the given callba
f450: 63 6b 20 6a 75 73 74 20 62 65 66 6f 72 65 20 63  ck just before c
f460: 6f 6d 6d 69 74 74 69 6e 67 20 65 76 65 72 79 20  ommitting every 
f470: 53 51 4c 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  SQL transaction.
f480: 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 63 61 6c  .  ** If the cal
f490: 6c 62 61 63 6b 20 74 68 72 6f 77 73 20 61 6e 20  lback throws an 
f4a0: 65 78 63 65 70 74 69 6f 6e 20 6f 72 20 72 65 74  exception or ret
f4b0: 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  urns non-zero, t
f4c0: 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20 74 72 61  hen the.  ** tra
f4d0: 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 62 6f 72  nsaction is abor
f4e0: 74 65 64 2e 20 20 49 66 20 43 41 4c 4c 42 41 43  ted.  If CALLBAC
f4f0: 4b 20 69 73 20 61 6e 20 65 6d 70 74 79 20 73 74  K is an empty st
f500: 72 69 6e 67 2c 20 74 68 65 20 63 61 6c 6c 62 61  ring, the callba
f510: 63 6b 0a 20 20 2a 2a 20 69 73 20 64 69 73 61 62  ck.  ** is disab
f520: 6c 65 64 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  led..  */.  case
f530: 20 44 42 5f 43 4f 4d 4d 49 54 5f 48 4f 4f 4b 3a   DB_COMMIT_HOOK:
f540: 20 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3e   {.    if( objc>
f550: 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57  3 ){.      Tcl_W
f560: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
f570: 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 43  rp, 2, objv, "?C
f580: 41 4c 4c 42 41 43 4b 3f 22 29 3b 0a 20 20 20 20  ALLBACK?");.    
f590: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
f5a0: 4f 52 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  OR;.    }else if
f5b0: 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20  ( objc==2 ){.   
f5c0: 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 43 6f 6d     if( pDb->zCom
f5d0: 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20 54  mit ){.        T
f5e0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
f5f0: 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a 43 6f  interp, pDb->zCo
f600: 6d 6d 69 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  mmit, 0);.      
f610: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
f620: 20 20 20 63 68 61 72 20 2a 7a 43 6f 6d 6d 69 74     char *zCommit
f630: 3b 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b  ;.      int len;
f640: 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e  .      if( pDb->
f650: 7a 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 20  zCommit ){.     
f660: 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d     Tcl_Free(pDb-
f670: 3e 7a 43 6f 6d 6d 69 74 29 3b 0a 20 20 20 20 20  >zCommit);.     
f680: 20 7d 0a 20 20 20 20 20 20 7a 43 6f 6d 6d 69 74   }.      zCommit
f690: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
f6a0: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c  FromObj(objv[2],
f6b0: 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69 66   &len);.      if
f6c0: 28 20 7a 43 6f 6d 6d 69 74 20 26 26 20 6c 65 6e  ( zCommit && len
f6d0: 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44  >0 ){.        pD
f6e0: 62 2d 3e 7a 43 6f 6d 6d 69 74 20 3d 20 54 63 6c  b->zCommit = Tcl
f6f0: 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20 31 20  _Alloc( len + 1 
f700: 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  );.        memcp
f710: 79 28 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 2c 20  y(pDb->zCommit, 
f720: 7a 43 6f 6d 6d 69 74 2c 20 6c 65 6e 2b 31 29 3b  zCommit, len+1);
f730: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
f740: 20 20 20 20 20 20 70 44 62 2d 3e 7a 43 6f 6d 6d        pDb->zComm
f750: 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  it = 0;.      }.
f760: 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a        if( pDb->z
f770: 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 20 20  Commit ){.      
f780: 20 20 70 44 62 2d 3e 69 6e 74 65 72 70 20 3d 20    pDb->interp = 
f790: 69 6e 74 65 72 70 3b 0a 20 20 20 20 20 20 20 20  interp;.        
f7a0: 73 71 6c 69 74 65 33 5f 63 6f 6d 6d 69 74 5f 68  sqlite3_commit_h
f7b0: 6f 6f 6b 28 70 44 62 2d 3e 64 62 2c 20 44 62 43  ook(pDb->db, DbC
f7c0: 6f 6d 6d 69 74 48 61 6e 64 6c 65 72 2c 20 70 44  ommitHandler, pD
f7d0: 62 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  b);.      }else{
f7e0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
f7f0: 5f 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 28 70 44 62  _commit_hook(pDb
f800: 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ->db, 0, 0);.   
f810: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 62     }.    }.    b
f820: 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  reak;.  }..  /* 
f830: 20 20 20 24 64 62 20 63 6f 6d 70 6c 65 74 65 20     $db complete 
f840: 53 51 4c 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65  SQL.  **.  ** Re
f850: 74 75 72 6e 20 54 52 55 45 20 69 66 20 53 51 4c  turn TRUE if SQL
f860: 20 69 73 20 61 20 63 6f 6d 70 6c 65 74 65 20 53   is a complete S
f870: 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 52  QL statement.  R
f880: 65 74 75 72 6e 20 46 41 4c 53 45 20 69 66 0a 20  eturn FALSE if. 
f890: 20 2a 2a 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c   ** additional l
f8a0: 69 6e 65 73 20 6f 66 20 69 6e 70 75 74 20 61 72  ines of input ar
f8b0: 65 20 6e 65 65 64 65 64 2e 20 20 54 68 69 73 20  e needed.  This 
f8c0: 69 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 74 68  is similar to th
f8d0: 65 0a 20 20 2a 2a 20 62 75 69 6c 74 2d 69 6e 20  e.  ** built-in 
f8e0: 22 69 6e 66 6f 20 63 6f 6d 70 6c 65 74 65 22 20  "info complete" 
f8f0: 63 6f 6d 6d 61 6e 64 20 6f 66 20 54 63 6c 2e 0a  command of Tcl..
f900: 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 43    */.  case DB_C
f910: 4f 4d 50 4c 45 54 45 3a 20 7b 0a 23 69 66 6e 64  OMPLETE: {.#ifnd
f920: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
f930: 4f 4d 50 4c 45 54 45 0a 20 20 20 20 54 63 6c 5f  OMPLETE.    Tcl_
f940: 4f 62 6a 20 2a 70 52 65 73 75 6c 74 3b 0a 20 20  Obj *pResult;.  
f950: 20 20 69 6e 74 20 69 73 43 6f 6d 70 6c 65 74 65    int isComplete
f960: 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d  ;.    if( objc!=
f970: 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57  3 ){.      Tcl_W
f980: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
f990: 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 53 51  rp, 2, objv, "SQ
f9a0: 4c 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  L");.      retur
f9b0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
f9c0: 20 7d 0a 20 20 20 20 69 73 43 6f 6d 70 6c 65 74   }.    isComplet
f9d0: 65 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6d 70  e = sqlite3_comp
f9e0: 6c 65 74 65 28 20 54 63 6c 5f 47 65 74 53 74 72  lete( Tcl_GetStr
f9f0: 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
fa00: 32 5d 2c 20 30 29 20 29 3b 0a 20 20 20 20 70 52  2], 0) );.    pR
fa10: 65 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65 74 4f  esult = Tcl_GetO
fa20: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29  bjResult(interp)
fa30: 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 42 6f 6f  ;.    Tcl_SetBoo
fa40: 6c 65 61 6e 4f 62 6a 28 70 52 65 73 75 6c 74 2c  leanObj(pResult,
fa50: 20 69 73 43 6f 6d 70 6c 65 74 65 29 3b 0a 23 65   isComplete);.#e
fa60: 6e 64 69 66 0a 20 20 20 20 62 72 65 61 6b 3b 0a  ndif.    break;.
fa70: 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62    }..  /*    $db
fa80: 20 63 6f 70 79 20 63 6f 6e 66 6c 69 63 74 2d 61   copy conflict-a
fa90: 6c 67 6f 72 69 74 68 6d 20 74 61 62 6c 65 20 66  lgorithm table f
faa0: 69 6c 65 6e 61 6d 65 20 3f 53 45 50 41 52 41 54  ilename ?SEPARAT
fab0: 4f 52 3f 20 3f 4e 55 4c 4c 49 4e 44 49 43 41 54  OR? ?NULLINDICAT
fac0: 4f 52 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 6f  OR?.  **.  ** Co
fad0: 70 79 20 64 61 74 61 20 69 6e 74 6f 20 74 61 62  py data into tab
fae0: 6c 65 20 66 72 6f 6d 20 66 69 6c 65 6e 61 6d 65  le from filename
faf0: 2c 20 6f 70 74 69 6f 6e 61 6c 6c 79 20 75 73 69  , optionally usi
fb00: 6e 67 20 53 45 50 41 52 41 54 4f 52 0a 20 20 2a  ng SEPARATOR.  *
fb10: 2a 20 61 73 20 63 6f 6c 75 6d 6e 20 73 65 70 61  * as column sepa
fb20: 72 61 74 6f 72 73 2e 20 20 49 66 20 61 20 63 6f  rators.  If a co
fb30: 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 73 20 61 20  lumn contains a 
fb40: 6e 75 6c 6c 20 73 74 72 69 6e 67 2c 20 6f 72 20  null string, or 
fb50: 74 68 65 0a 20 20 2a 2a 20 76 61 6c 75 65 20 6f  the.  ** value o
fb60: 66 20 4e 55 4c 4c 49 4e 44 49 43 41 54 4f 52 2c  f NULLINDICATOR,
fb70: 20 61 20 4e 55 4c 4c 20 69 73 20 69 6e 73 65 72   a NULL is inser
fb80: 74 65 64 20 66 6f 72 20 74 68 65 20 63 6f 6c 75  ted for the colu
fb90: 6d 6e 2e 0a 20 20 2a 2a 20 63 6f 6e 66 6c 69 63  mn..  ** conflic
fba0: 74 2d 61 6c 67 6f 72 69 74 68 6d 20 69 73 20 6f  t-algorithm is o
fbb0: 6e 65 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65  ne of the sqlite
fbc0: 20 63 6f 6e 66 6c 69 63 74 20 61 6c 67 6f 72 69   conflict algori
fbd0: 74 68 6d 73 3a 0a 20 20 2a 2a 20 20 20 20 72 6f  thms:.  **    ro
fbe0: 6c 6c 62 61 63 6b 2c 20 61 62 6f 72 74 2c 20 66  llback, abort, f
fbf0: 61 69 6c 2c 20 69 67 6e 6f 72 65 2c 20 72 65 70  ail, ignore, rep
fc00: 6c 61 63 65 0a 20 20 2a 2a 20 4f 6e 20 73 75 63  lace.  ** On suc
fc10: 63 65 73 73 2c 20 72 65 74 75 72 6e 20 74 68 65  cess, return the
fc20: 20 6e 75 6d 62 65 72 20 6f 66 20 6c 69 6e 65 73   number of lines
fc30: 20 70 72 6f 63 65 73 73 65 64 2c 20 6e 6f 74 20   processed, not 
fc40: 6e 65 63 65 73 73 61 72 69 6c 79 20 73 61 6d 65  necessarily same
fc50: 0a 20 20 2a 2a 20 61 73 20 27 64 62 20 63 68 61  .  ** as 'db cha
fc60: 6e 67 65 73 27 20 64 75 65 20 74 6f 20 63 6f 6e  nges' due to con
fc70: 66 6c 69 63 74 2d 61 6c 67 6f 72 69 74 68 6d 20  flict-algorithm 
fc80: 73 65 6c 65 63 74 65 64 2e 0a 20 20 2a 2a 0a 20  selected..  **. 
fc90: 20 2a 2a 20 54 68 69 73 20 63 6f 64 65 20 69 73   ** This code is
fca0: 20 62 61 73 69 63 61 6c 6c 79 20 61 6e 20 69 6d   basically an im
fcb0: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2f 65 6e 68  plementation/enh
fcc0: 61 6e 63 65 6d 65 6e 74 20 6f 66 0a 20 20 2a 2a  ancement of.  **
fcd0: 20 74 68 65 20 73 71 6c 69 74 65 33 20 73 68 65   the sqlite3 she
fce0: 6c 6c 2e 63 20 22 2e 69 6d 70 6f 72 74 22 20 63  ll.c ".import" c
fcf0: 6f 6d 6d 61 6e 64 2e 0a 20 20 2a 2a 0a 20 20 2a  ommand..  **.  *
fd00: 2a 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20 75  * This command u
fd10: 73 61 67 65 20 69 73 20 65 71 75 69 76 61 6c 65  sage is equivale
fd20: 6e 74 20 74 6f 20 74 68 65 20 73 71 6c 69 74 65  nt to the sqlite
fd30: 32 2e 78 20 43 4f 50 59 20 73 74 61 74 65 6d 65  2.x COPY stateme
fd40: 6e 74 2c 0a 20 20 2a 2a 20 77 68 69 63 68 20 69  nt,.  ** which i
fd50: 6d 70 6f 72 74 73 20 66 69 6c 65 20 64 61 74 61  mports file data
fd60: 20 69 6e 74 6f 20 61 20 74 61 62 6c 65 20 75 73   into a table us
fd70: 69 6e 67 20 74 68 65 20 50 6f 73 74 67 72 65 53  ing the PostgreS
fd80: 51 4c 20 43 4f 50 59 20 66 69 6c 65 20 66 6f 72  QL COPY file for
fd90: 6d 61 74 3a 0a 20 20 2a 2a 20 20 20 24 64 62 20  mat:.  **   $db 
fda0: 63 6f 70 79 20 24 63 6f 6e 66 6c 69 74 5f 61 6c  copy $conflit_al
fdb0: 67 6f 20 24 74 61 62 6c 65 5f 6e 61 6d 65 20 24  go $table_name $
fdc0: 66 69 6c 65 6e 61 6d 65 20 5c 74 20 5c 5c 4e 0a  filename \t \\N.
fdd0: 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 43    */.  case DB_C
fde0: 4f 50 59 3a 20 7b 0a 20 20 20 20 63 68 61 72 20  OPY: {.    char 
fdf0: 2a 7a 54 61 62 6c 65 3b 20 20 20 20 20 20 20 20  *zTable;        
fe00: 20 20 20 20 20 20 20 2f 2a 20 49 6e 73 65 72 74         /* Insert
fe10: 20 64 61 74 61 20 69 6e 74 6f 20 74 68 69 73 20   data into this 
fe20: 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 63 68 61  table */.    cha
fe30: 72 20 2a 7a 46 69 6c 65 3b 20 20 20 20 20 20 20  r *zFile;       
fe40: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
fe50: 66 69 6c 65 20 66 72 6f 6d 20 77 68 69 63 68 20  file from which 
fe60: 74 6f 20 65 78 74 72 61 63 74 20 64 61 74 61 20  to extract data 
fe70: 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 43 6f  */.    char *zCo
fe80: 6e 66 6c 69 63 74 3b 20 20 20 20 20 20 20 20 20  nflict;         
fe90: 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 66 6c 69     /* The confli
fea0: 63 74 20 61 6c 67 6f 72 69 74 68 6d 20 74 6f 20  ct algorithm to 
feb0: 75 73 65 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  use */.    sqlit
fec0: 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 20  e3_stmt *pStmt; 
fed0: 20 20 20 20 20 20 20 2f 2a 20 41 20 73 74 61 74         /* A stat
fee0: 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 69 6e 74  ement */.    int
fef0: 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20   nCol;          
ff00: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
ff10: 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
ff20: 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20   the table */.  
ff30: 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20 20 20    int nByte;    
ff40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ff50: 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
ff60: 20 69 6e 20 61 6e 20 53 51 4c 20 73 74 72 69 6e   in an SQL strin
ff70: 67 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 2c 20  g */.    int i, 
ff80: 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  j;              
ff90: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
ffa0: 6e 74 65 72 73 20 2a 2f 0a 20 20 20 20 69 6e 74  nters */.    int
ffb0: 20 6e 53 65 70 3b 20 20 20 20 20 20 20 20 20 20   nSep;          
ffc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
ffd0: 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 7a  er of bytes in z
ffe0: 53 65 70 5b 5d 20 2a 2f 0a 20 20 20 20 69 6e 74  Sep[] */.    int
fff0: 20 6e 4e 75 6c 6c 3b 20 20 20 20 20 20 20 20 20   nNull;         
10000 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
10010 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 7a  er of bytes in z
10020 4e 75 6c 6c 5b 5d 20 2a 2f 0a 20 20 20 20 63 68  Null[] */.    ch
10030 61 72 20 2a 7a 53 71 6c 3b 20 20 20 20 20 20 20  ar *zSql;       
10040 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20            /* An 
10050 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  SQL statement */
10060 0a 20 20 20 20 63 68 61 72 20 2a 7a 4c 69 6e 65  .    char *zLine
10070 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
10080 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 6c 69 6e   /* A single lin
10090 65 20 6f 66 20 69 6e 70 75 74 20 66 72 6f 6d 20  e of input from 
100a0 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20  the file */.    
100b0 63 68 61 72 20 2a 2a 61 7a 43 6f 6c 3b 20 20 20  char **azCol;   
100c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a              /* z
100d0 4c 69 6e 65 5b 5d 20 62 72 6f 6b 65 6e 20 75 70  Line[] broken up
100e0 20 69 6e 74 6f 20 63 6f 6c 75 6d 6e 73 20 2a 2f   into columns */
100f0 0a 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6d 6d  .    char *zComm
10100 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  it;             
10110 20 2f 2a 20 48 6f 77 20 74 6f 20 63 6f 6d 6d 69   /* How to commi
10120 74 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20 20  t changes */.   
10130 20 46 49 4c 45 20 2a 69 6e 3b 20 20 20 20 20 20   FILE *in;      
10140 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10150 54 68 65 20 69 6e 70 75 74 20 66 69 6c 65 20 2a  The input file *
10160 2f 0a 20 20 20 20 69 6e 74 20 6c 69 6e 65 6e 6f  /.    int lineno
10170 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
10180 20 20 2f 2a 20 4c 69 6e 65 20 6e 75 6d 62 65 72    /* Line number
10190 20 6f 66 20 69 6e 70 75 74 20 66 69 6c 65 20 2a   of input file *
101a0 2f 0a 20 20 20 20 63 68 61 72 20 7a 4c 69 6e 65  /.    char zLine
101b0 4e 75 6d 5b 38 30 5d 3b 20 20 20 20 20 20 20 20  Num[80];        
101c0 20 20 2f 2a 20 4c 69 6e 65 20 6e 75 6d 62 65 72    /* Line number
101d0 20 70 72 69 6e 74 20 62 75 66 66 65 72 20 2a 2f   print buffer */
101e0 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52  .    Tcl_Obj *pR
101f0 65 73 75 6c 74 3b 20 20 20 20 20 20 20 20 20 20  esult;          
10200 20 2f 2a 20 69 6e 74 65 72 70 20 72 65 73 75 6c   /* interp resul
10210 74 20 2a 2f 0a 0a 20 20 20 20 63 68 61 72 20 2a  t */..    char *
10220 7a 53 65 70 3b 0a 20 20 20 20 63 68 61 72 20 2a  zSep;.    char *
10230 7a 4e 75 6c 6c 3b 0a 20 20 20 20 69 66 28 20 6f  zNull;.    if( o
10240 62 6a 63 3c 35 20 7c 7c 20 6f 62 6a 63 3e 37 20  bjc<5 || objc>7 
10250 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f  ){.      Tcl_Wro
10260 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
10270 2c 20 32 2c 20 6f 62 6a 76 2c 20 0a 20 20 20 20  , 2, objv, .    
10280 20 20 20 20 20 22 43 4f 4e 46 4c 49 43 54 2d 41       "CONFLICT-A
10290 4c 47 4f 52 49 54 48 4d 20 54 41 42 4c 45 20 46  LGORITHM TABLE F
102a0 49 4c 45 4e 41 4d 45 20 3f 53 45 50 41 52 41 54  ILENAME ?SEPARAT
102b0 4f 52 3f 20 3f 4e 55 4c 4c 49 4e 44 49 43 41 54  OR? ?NULLINDICAT
102c0 4f 52 3f 22 29 3b 0a 20 20 20 20 20 20 72 65 74  OR?");.      ret
102d0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
102e0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 62 6a     }.    if( obj
102f0 63 3e 3d 36 20 29 7b 0a 20 20 20 20 20 20 7a 53  c>=6 ){.      zS
10300 65 70 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  ep = Tcl_GetStri
10310 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 35  ngFromObj(objv[5
10320 5d 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65  ], 0);.    }else
10330 7b 0a 20 20 20 20 20 20 7a 53 65 70 20 3d 20 22  {.      zSep = "
10340 5c 74 22 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  \t";.    }.    i
10350 66 28 20 6f 62 6a 63 3e 3d 37 20 29 7b 0a 20 20  f( objc>=7 ){.  
10360 20 20 20 20 7a 4e 75 6c 6c 20 3d 20 54 63 6c 5f      zNull = Tcl_
10370 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
10380 28 6f 62 6a 76 5b 36 5d 2c 20 30 29 3b 0a 20 20  (objv[6], 0);.  
10390 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a    }else{.      z
103a0 4e 75 6c 6c 20 3d 20 22 22 3b 0a 20 20 20 20 7d  Null = "";.    }
103b0 0a 20 20 20 20 7a 43 6f 6e 66 6c 69 63 74 20 3d  .    zConflict =
103c0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
103d0 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30  omObj(objv[2], 0
103e0 29 3b 0a 20 20 20 20 7a 54 61 62 6c 65 20 3d 20  );.    zTable = 
103f0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
10400 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d 2c 20 30 29  mObj(objv[3], 0)
10410 3b 0a 20 20 20 20 7a 46 69 6c 65 20 3d 20 54 63  ;.    zFile = Tc
10420 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
10430 62 6a 28 6f 62 6a 76 5b 34 5d 2c 20 30 29 3b 0a  bj(objv[4], 0);.
10440 20 20 20 20 6e 53 65 70 20 3d 20 73 74 72 6c 65      nSep = strle
10450 6e 33 30 28 7a 53 65 70 29 3b 0a 20 20 20 20 6e  n30(zSep);.    n
10460 4e 75 6c 6c 20 3d 20 73 74 72 6c 65 6e 33 30 28  Null = strlen30(
10470 7a 4e 75 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20  zNull);.    if( 
10480 6e 53 65 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20  nSep==0 ){.     
10490 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
104a0 74 28 69 6e 74 65 72 70 2c 22 45 72 72 6f 72 3a  t(interp,"Error:
104b0 20 6e 6f 6e 2d 6e 75 6c 6c 20 73 65 70 61 72 61   non-null separa
104c0 74 6f 72 20 72 65 71 75 69 72 65 64 20 66 6f 72  tor required for
104d0 20 63 6f 70 79 22 2c 30 29 3b 0a 20 20 20 20 20   copy",0);.     
104e0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
104f0 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  R;.    }.    if(
10500 73 74 72 63 6d 70 28 7a 43 6f 6e 66 6c 69 63 74  strcmp(zConflict
10510 2c 20 22 72 6f 6c 6c 62 61 63 6b 22 29 20 21 3d  , "rollback") !=
10520 20 30 20 26 26 0a 20 20 20 20 20 20 20 73 74 72   0 &&.       str
10530 63 6d 70 28 7a 43 6f 6e 66 6c 69 63 74 2c 20 22  cmp(zConflict, "
10540 61 62 6f 72 74 22 20 20 20 29 20 21 3d 20 30 20  abort"   ) != 0 
10550 26 26 0a 20 20 20 20 20 20 20 73 74 72 63 6d 70  &&.       strcmp
10560 28 7a 43 6f 6e 66 6c 69 63 74 2c 20 22 66 61 69  (zConflict, "fai
10570 6c 22 20 20 20 20 29 20 21 3d 20 30 20 26 26 0a  l"    ) != 0 &&.
10580 20 20 20 20 20 20 20 73 74 72 63 6d 70 28 7a 43         strcmp(zC
10590 6f 6e 66 6c 69 63 74 2c 20 22 69 67 6e 6f 72 65  onflict, "ignore
105a0 22 20 20 29 20 21 3d 20 30 20 26 26 0a 20 20 20  "  ) != 0 &&.   
105b0 20 20 20 20 73 74 72 63 6d 70 28 7a 43 6f 6e 66      strcmp(zConf
105c0 6c 69 63 74 2c 20 22 72 65 70 6c 61 63 65 22 20  lict, "replace" 
105d0 29 20 21 3d 20 30 20 29 20 7b 0a 20 20 20 20 20  ) != 0 ) {.     
105e0 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
105f0 74 28 69 6e 74 65 72 70 2c 20 22 45 72 72 6f 72  t(interp, "Error
10600 3a 20 5c 22 22 2c 20 7a 43 6f 6e 66 6c 69 63 74  : \"", zConflict
10610 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  , .            "
10620 5c 22 2c 20 63 6f 6e 66 6c 69 63 74 2d 61 6c 67  \", conflict-alg
10630 6f 72 69 74 68 6d 20 6d 75 73 74 20 62 65 20 6f  orithm must be o
10640 6e 65 20 6f 66 3a 20 72 6f 6c 6c 62 61 63 6b 2c  ne of: rollback,
10650 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 22   ".            "
10660 61 62 6f 72 74 2c 20 66 61 69 6c 2c 20 69 67 6e  abort, fail, ign
10670 6f 72 65 2c 20 6f 72 20 72 65 70 6c 61 63 65 22  ore, or replace"
10680 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75  , 0);.      retu
10690 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
106a0 20 20 7d 0a 20 20 20 20 7a 53 71 6c 20 3d 20 73    }.    zSql = s
106b0 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
106c0 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 27 25  SELECT * FROM '%
106d0 71 27 22 2c 20 7a 54 61 62 6c 65 29 3b 0a 20 20  q'", zTable);.  
106e0 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29 7b    if( zSql==0 ){
106f0 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  .      Tcl_Appen
10700 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
10710 22 45 72 72 6f 72 3a 20 6e 6f 20 73 75 63 68 20  "Error: no such 
10720 74 61 62 6c 65 3a 20 22 2c 20 7a 54 61 62 6c 65  table: ", zTable
10730 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75  , 0);.      retu
10740 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
10750 20 20 7d 0a 20 20 20 20 6e 42 79 74 65 20 3d 20    }.    nByte = 
10760 73 74 72 6c 65 6e 33 30 28 7a 53 71 6c 29 3b 0a  strlen30(zSql);.
10770 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
10780 5f 70 72 65 70 61 72 65 28 70 44 62 2d 3e 64 62  _prepare(pDb->db
10790 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74  , zSql, -1, &pSt
107a0 6d 74 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  mt, 0);.    sqli
107b0 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a  te3_free(zSql);.
107c0 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
107d0 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
107e0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 45 72  sult(interp, "Er
107f0 72 6f 72 3a 20 22 2c 20 73 71 6c 69 74 65 33 5f  ror: ", sqlite3_
10800 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c  errmsg(pDb->db),
10810 20 30 29 3b 0a 20 20 20 20 20 20 6e 43 6f 6c 20   0);.      nCol 
10820 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
10830 20 20 20 20 20 20 6e 43 6f 6c 20 3d 20 73 71 6c        nCol = sql
10840 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e  ite3_column_coun
10850 74 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 7d 0a  t(pStmt);.    }.
10860 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61      sqlite3_fina
10870 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20  lize(pStmt);.   
10880 20 69 66 28 20 6e 43 6f 6c 3d 3d 30 20 29 20 7b   if( nCol==0 ) {
10890 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
108a0 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
108b0 20 20 20 7a 53 71 6c 20 3d 20 6d 61 6c 6c 6f 63     zSql = malloc
108c0 28 20 6e 42 79 74 65 20 2b 20 35 30 20 2b 20 6e  ( nByte + 50 + n
108d0 43 6f 6c 2a 32 20 29 3b 0a 20 20 20 20 69 66 28  Col*2 );.    if(
108e0 20 7a 53 71 6c 3d 3d 30 20 29 20 7b 0a 20 20 20   zSql==0 ) {.   
108f0 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
10900 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 45 72 72  ult(interp, "Err
10910 6f 72 3a 20 63 61 6e 27 74 20 6d 61 6c 6c 6f 63  or: can't malloc
10920 28 29 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 72  ()", 0);.      r
10930 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
10940 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
10950 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 79 74  e3_snprintf(nByt
10960 65 2b 35 30 2c 20 7a 53 71 6c 2c 20 22 49 4e 53  e+50, zSql, "INS
10970 45 52 54 20 4f 52 20 25 71 20 49 4e 54 4f 20 27  ERT OR %q INTO '
10980 25 71 27 20 56 41 4c 55 45 53 28 3f 22 2c 0a 20  %q' VALUES(?",. 
10990 20 20 20 20 20 20 20 20 7a 43 6f 6e 66 6c 69 63          zConflic
109a0 74 2c 20 7a 54 61 62 6c 65 29 3b 0a 20 20 20 20  t, zTable);.    
109b0 6a 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 53 71  j = strlen30(zSq
109c0 6c 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b  l);.    for(i=1;
109d0 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20   i<nCol; i++){. 
109e0 20 20 20 20 20 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d       zSql[j++] =
109f0 20 27 2c 27 3b 0a 20 20 20 20 20 20 7a 53 71 6c   ',';.      zSql
10a00 5b 6a 2b 2b 5d 20 3d 20 27 3f 27 3b 0a 20 20 20  [j++] = '?';.   
10a10 20 7d 0a 20 20 20 20 7a 53 71 6c 5b 6a 2b 2b 5d   }.    zSql[j++]
10a20 20 3d 20 27 29 27 3b 0a 20 20 20 20 7a 53 71 6c   = ')';.    zSql
10a30 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 72 63 20  [j] = 0;.    rc 
10a40 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  = sqlite3_prepar
10a50 65 28 70 44 62 2d 3e 64 62 2c 20 7a 53 71 6c 2c  e(pDb->db, zSql,
10a60 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b   -1, &pStmt, 0);
10a70 0a 20 20 20 20 66 72 65 65 28 7a 53 71 6c 29 3b  .    free(zSql);
10a80 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
10a90 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
10aa0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 45  esult(interp, "E
10ab0 72 72 6f 72 3a 20 22 2c 20 73 71 6c 69 74 65 33  rror: ", sqlite3
10ac0 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62 29  _errmsg(pDb->db)
10ad0 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
10ae0 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
10af0 6d 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  mt);.      retur
10b00 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
10b10 20 7d 0a 20 20 20 20 69 6e 20 3d 20 66 6f 70 65   }.    in = fope
10b20 6e 28 7a 46 69 6c 65 2c 20 22 72 62 22 29 3b 0a  n(zFile, "rb");.
10b30 20 20 20 20 69 66 28 20 69 6e 3d 3d 30 20 29 7b      if( in==0 ){
10b40 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  .      Tcl_Appen
10b50 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
10b60 22 45 72 72 6f 72 3a 20 63 61 6e 6e 6f 74 20 6f  "Error: cannot o
10b70 70 65 6e 20 66 69 6c 65 3a 20 22 2c 20 7a 46 69  pen file: ", zFi
10b80 6c 65 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  le, NULL);.     
10b90 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
10ba0 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20  e(pStmt);.      
10bb0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
10bc0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 7a 43 6f  ;.    }.    azCo
10bd0 6c 20 3d 20 6d 61 6c 6c 6f 63 28 20 73 69 7a 65  l = malloc( size
10be0 6f 66 28 61 7a 43 6f 6c 5b 30 5d 29 2a 28 6e 43  of(azCol[0])*(nC
10bf0 6f 6c 2b 31 29 20 29 3b 0a 20 20 20 20 69 66 28  ol+1) );.    if(
10c00 20 61 7a 43 6f 6c 3d 3d 30 20 29 20 7b 0a 20 20   azCol==0 ) {.  
10c10 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
10c20 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 45 72  sult(interp, "Er
10c30 72 6f 72 3a 20 63 61 6e 27 74 20 6d 61 6c 6c 6f  ror: can't mallo
10c40 63 28 29 22 2c 20 30 29 3b 0a 20 20 20 20 20 20  c()", 0);.      
10c50 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 20 20  fclose(in);.    
10c60 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
10c70 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 28 76  OR;.    }.    (v
10c80 6f 69 64 29 73 71 6c 69 74 65 33 5f 65 78 65 63  oid)sqlite3_exec
10c90 28 70 44 62 2d 3e 64 62 2c 20 22 42 45 47 49 4e  (pDb->db, "BEGIN
10ca0 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ", 0, 0, 0);.   
10cb0 20 7a 43 6f 6d 6d 69 74 20 3d 20 22 43 4f 4d 4d   zCommit = "COMM
10cc0 49 54 22 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  IT";.    while( 
10cd0 28 7a 4c 69 6e 65 20 3d 20 6c 6f 63 61 6c 5f 67  (zLine = local_g
10ce0 65 74 6c 69 6e 65 28 30 2c 20 69 6e 29 29 21 3d  etline(0, in))!=
10cf0 30 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20  0 ){.      char 
10d00 2a 7a 3b 0a 20 20 20 20 20 20 69 20 3d 20 30 3b  *z;.      i = 0;
10d10 0a 20 20 20 20 20 20 6c 69 6e 65 6e 6f 2b 2b 3b  .      lineno++;
10d20 0a 20 20 20 20 20 20 61 7a 43 6f 6c 5b 30 5d 20  .      azCol[0] 
10d30 3d 20 7a 4c 69 6e 65 3b 0a 20 20 20 20 20 20 66  = zLine;.      f
10d40 6f 72 28 69 3d 30 2c 20 7a 3d 7a 4c 69 6e 65 3b  or(i=0, z=zLine;
10d50 20 2a 7a 3b 20 7a 2b 2b 29 7b 0a 20 20 20 20 20   *z; z++){.     
10d60 20 20 20 69 66 28 20 2a 7a 3d 3d 7a 53 65 70 5b     if( *z==zSep[
10d70 30 5d 20 26 26 20 73 74 72 6e 63 6d 70 28 7a 2c  0] && strncmp(z,
10d80 20 7a 53 65 70 2c 20 6e 53 65 70 29 3d 3d 30 20   zSep, nSep)==0 
10d90 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 7a 20  ){.          *z 
10da0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69  = 0;.          i
10db0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ++;.          if
10dc0 28 20 69 3c 6e 43 6f 6c 20 29 7b 0a 20 20 20 20  ( i<nCol ){.    
10dd0 20 20 20 20 20 20 20 20 61 7a 43 6f 6c 5b 69 5d          azCol[i]
10de0 20 3d 20 26 7a 5b 6e 53 65 70 5d 3b 0a 20 20 20   = &z[nSep];.   
10df0 20 20 20 20 20 20 20 20 20 7a 20 2b 3d 20 6e 53           z += nS
10e00 65 70 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20  ep-1;.          
10e10 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
10e20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 2b    }.      if( i+
10e30 31 21 3d 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20  1!=nCol ){.     
10e40 20 20 20 63 68 61 72 20 2a 7a 45 72 72 3b 0a 20     char *zErr;. 
10e50 20 20 20 20 20 20 20 69 6e 74 20 6e 45 72 72 20         int nErr 
10e60 3d 20 73 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65  = strlen30(zFile
10e70 29 20 2b 20 32 30 30 3b 0a 20 20 20 20 20 20 20  ) + 200;.       
10e80 20 7a 45 72 72 20 3d 20 6d 61 6c 6c 6f 63 28 6e   zErr = malloc(n
10e90 45 72 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66  Err);.        if
10ea0 28 20 7a 45 72 72 20 29 7b 0a 20 20 20 20 20 20  ( zErr ){.      
10eb0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
10ec0 69 6e 74 66 28 6e 45 72 72 2c 20 7a 45 72 72 2c  intf(nErr, zErr,
10ed0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 22 45  .             "E
10ee0 72 72 6f 72 3a 20 25 73 20 6c 69 6e 65 20 25 64  rror: %s line %d
10ef0 3a 20 65 78 70 65 63 74 65 64 20 25 64 20 63 6f  : expected %d co
10f00 6c 75 6d 6e 73 20 6f 66 20 64 61 74 61 20 62 75  lumns of data bu
10f10 74 20 66 6f 75 6e 64 20 25 64 22 2c 0a 20 20 20  t found %d",.   
10f20 20 20 20 20 20 20 20 20 20 20 7a 46 69 6c 65 2c            zFile,
10f30 20 6c 69 6e 65 6e 6f 2c 20 6e 43 6f 6c 2c 20 69   lineno, nCol, i
10f40 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 54  +1);.          T
10f50 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
10f60 69 6e 74 65 72 70 2c 20 7a 45 72 72 2c 20 30 29  interp, zErr, 0)
10f70 3b 0a 20 20 20 20 20 20 20 20 20 20 66 72 65 65  ;.          free
10f80 28 7a 45 72 72 29 3b 0a 20 20 20 20 20 20 20 20  (zErr);.        
10f90 7d 0a 20 20 20 20 20 20 20 20 7a 43 6f 6d 6d 69  }.        zCommi
10fa0 74 20 3d 20 22 52 4f 4c 4c 42 41 43 4b 22 3b 0a  t = "ROLLBACK";.
10fb0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
10fc0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72       }.      for
10fd0 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b  (i=0; i<nCol; i+
10fe0 2b 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 63  +){.        /* c
10ff0 68 65 63 6b 20 66 6f 72 20 6e 75 6c 6c 20 64 61  heck for null da
11000 74 61 2c 20 69 66 20 73 6f 2c 20 62 69 6e 64 20  ta, if so, bind 
11010 61 73 20 6e 75 6c 6c 20 2a 2f 0a 20 20 20 20 20  as null */.     
11020 20 20 20 69 66 28 20 28 6e 4e 75 6c 6c 3e 30 20     if( (nNull>0 
11030 26 26 20 73 74 72 63 6d 70 28 61 7a 43 6f 6c 5b  && strcmp(azCol[
11040 69 5d 2c 20 7a 4e 75 6c 6c 29 3d 3d 30 29 0a 20  i], zNull)==0). 
11050 20 20 20 20 20 20 20 20 20 7c 7c 20 73 74 72 6c           || strl
11060 65 6e 33 30 28 61 7a 43 6f 6c 5b 69 5d 29 3d 3d  en30(azCol[i])==
11070 30 20 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  0 .        ){.  
11080 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
11090 62 69 6e 64 5f 6e 75 6c 6c 28 70 53 74 6d 74 2c  bind_null(pStmt,
110a0 20 69 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 7d   i+1);.        }
110b0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
110c0 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78  sqlite3_bind_tex
110d0 74 28 70 53 74 6d 74 2c 20 69 2b 31 2c 20 61 7a  t(pStmt, i+1, az
110e0 43 6f 6c 5b 69 5d 2c 20 2d 31 2c 20 53 51 4c 49  Col[i], -1, SQLI
110f0 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  TE_STATIC);.    
11100 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
11110 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70      sqlite3_step
11120 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 72  (pStmt);.      r
11130 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65  c = sqlite3_rese
11140 74 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20  t(pStmt);.      
11150 66 72 65 65 28 7a 4c 69 6e 65 29 3b 0a 20 20 20  free(zLine);.   
11160 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
11170 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
11180 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
11190 28 69 6e 74 65 72 70 2c 22 45 72 72 6f 72 3a 20  (interp,"Error: 
111a0 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  ", sqlite3_errms
111b0 67 28 70 44 62 2d 3e 64 62 29 2c 20 30 29 3b 0a  g(pDb->db), 0);.
111c0 20 20 20 20 20 20 20 20 7a 43 6f 6d 6d 69 74 20          zCommit 
111d0 3d 20 22 52 4f 4c 4c 42 41 43 4b 22 3b 0a 20 20  = "ROLLBACK";.  
111e0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
111f0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66     }.    }.    f
11200 72 65 65 28 61 7a 43 6f 6c 29 3b 0a 20 20 20 20  ree(azCol);.    
11210 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 20 20  fclose(in);.    
11220 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
11230 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 28 76 6f  (pStmt);.    (vo
11240 69 64 29 73 71 6c 69 74 65 33 5f 65 78 65 63 28  id)sqlite3_exec(
11250 70 44 62 2d 3e 64 62 2c 20 7a 43 6f 6d 6d 69 74  pDb->db, zCommit
11260 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 20  , 0, 0, 0);..   
11270 20 69 66 28 20 7a 43 6f 6d 6d 69 74 5b 30 5d 20   if( zCommit[0] 
11280 3d 3d 20 27 43 27 20 29 7b 0a 20 20 20 20 20 20  == 'C' ){.      
11290 2f 2a 20 73 75 63 63 65 73 73 2c 20 73 65 74 20  /* success, set 
112a0 72 65 73 75 6c 74 20 61 73 20 6e 75 6d 62 65 72  result as number
112b0 20 6f 66 20 6c 69 6e 65 73 20 70 72 6f 63 65 73   of lines proces
112c0 73 65 64 20 2a 2f 0a 20 20 20 20 20 20 70 52 65  sed */.      pRe
112d0 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65 74 4f 62  sult = Tcl_GetOb
112e0 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b  jResult(interp);
112f0 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74 49 6e  .      Tcl_SetIn
11300 74 4f 62 6a 28 70 52 65 73 75 6c 74 2c 20 6c 69  tObj(pResult, li
11310 6e 65 6e 6f 29 3b 0a 20 20 20 20 20 20 72 63 20  neno);.      rc 
11320 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 65  = TCL_OK;.    }e
11330 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 66 61  lse{.      /* fa
11340 69 6c 75 72 65 2c 20 61 70 70 65 6e 64 20 6c 69  ilure, append li
11350 6e 65 6e 6f 20 77 68 65 72 65 20 66 61 69 6c 65  neno where faile
11360 64 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  d */.      sqlit
11370 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
11380 6f 66 28 7a 4c 69 6e 65 4e 75 6d 29 2c 20 7a 4c  of(zLineNum), zL
11390 69 6e 65 4e 75 6d 2c 22 25 64 22 2c 6c 69 6e 65  ineNum,"%d",line
113a0 6e 6f 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 41  no);.      Tcl_A
113b0 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
113c0 72 70 2c 22 2c 20 66 61 69 6c 65 64 20 77 68 69  rp,", failed whi
113d0 6c 65 20 70 72 6f 63 65 73 73 69 6e 67 20 6c 69  le processing li
113e0 6e 65 3a 20 22 2c 7a 4c 69 6e 65 4e 75 6d 2c 30  ne: ",zLineNum,0
113f0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 54 43  );.      rc = TC
11400 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
11410 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
11420 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 24 64 62 20   /*.  **    $db 
11430 65 6e 61 62 6c 65 5f 6c 6f 61 64 5f 65 78 74 65  enable_load_exte
11440 6e 73 69 6f 6e 20 42 4f 4f 4c 45 41 4e 0a 20 20  nsion BOOLEAN.  
11450 2a 2a 0a 20 20 2a 2a 20 54 75 72 6e 20 74 68 65  **.  ** Turn the
11460 20 65 78 74 65 6e 73 69 6f 6e 20 6c 6f 61 64 69   extension loadi
11470 6e 67 20 66 65 61 74 75 72 65 20 6f 6e 20 6f 72  ng feature on or
11480 20 6f 66 66 2e 20 20 49 74 20 69 66 20 6f 66 66   off.  It if off
11490 20 62 79 0a 20 20 2a 2a 20 64 65 66 61 75 6c 74   by.  ** default
114a0 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  ..  */.  case DB
114b0 5f 45 4e 41 42 4c 45 5f 4c 4f 41 44 5f 45 58 54  _ENABLE_LOAD_EXT
114c0 45 4e 53 49 4f 4e 3a 20 7b 0a 23 69 66 6e 64 65  ENSION: {.#ifnde
114d0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f  f SQLITE_OMIT_LO
114e0 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 20 20 20  AD_EXTENSION.   
114f0 20 69 6e 74 20 6f 6e 6f 66 66 3b 0a 20 20 20 20   int onoff;.    
11500 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20  if( objc!=3 ){. 
11510 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
11520 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
11530 20 6f 62 6a 76 2c 20 22 42 4f 4f 4c 45 41 4e 22   objv, "BOOLEAN"
11540 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
11550 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
11560 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74  .    if( Tcl_Get
11570 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69  BooleanFromObj(i
11580 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20  nterp, objv[2], 
11590 26 6f 6e 6f 66 66 29 20 29 7b 0a 20 20 20 20 20  &onoff) ){.     
115a0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
115b0 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  R;.    }.    sql
115c0 69 74 65 33 5f 65 6e 61 62 6c 65 5f 6c 6f 61 64  ite3_enable_load
115d0 5f 65 78 74 65 6e 73 69 6f 6e 28 70 44 62 2d 3e  _extension(pDb->
115e0 64 62 2c 20 6f 6e 6f 66 66 29 3b 0a 20 20 20 20  db, onoff);.    
115f0 62 72 65 61 6b 3b 0a 23 65 6c 73 65 0a 20 20 20  break;.#else.   
11600 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
11610 74 28 69 6e 74 65 72 70 2c 20 22 65 78 74 65 6e  t(interp, "exten
11620 73 69 6f 6e 20 6c 6f 61 64 69 6e 67 20 69 73 20  sion loading is 
11630 74 75 72 6e 65 64 20 6f 66 66 20 61 74 20 63 6f  turned off at co
11640 6d 70 69 6c 65 2d 74 69 6d 65 22 2c 0a 20 20 20  mpile-time",.   
11650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11660 20 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e    0);.    return
11670 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6e 64   TCL_ERROR;.#end
11680 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  if.  }..  /*.  *
11690 2a 20 20 20 20 24 64 62 20 65 72 72 6f 72 63 6f  *    $db errorco
116a0 64 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74  de.  **.  ** Ret
116b0 75 72 6e 20 74 68 65 20 6e 75 6d 65 72 69 63 20  urn the numeric 
116c0 65 72 72 6f 72 20 63 6f 64 65 20 74 68 61 74 20  error code that 
116d0 77 61 73 20 72 65 74 75 72 6e 65 64 20 62 79 20  was returned by 
116e0 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 0a  the most recent.
116f0 20 20 2a 2a 20 63 61 6c 6c 20 74 6f 20 73 71 6c    ** call to sql
11700 69 74 65 33 5f 65 78 65 63 28 29 2e 0a 20 20 2a  ite3_exec()..  *
11710 2f 0a 20 20 63 61 73 65 20 44 42 5f 45 52 52 4f  /.  case DB_ERRO
11720 52 43 4f 44 45 3a 20 7b 0a 20 20 20 20 54 63 6c  RCODE: {.    Tcl
11730 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
11740 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74  terp, Tcl_NewInt
11750 4f 62 6a 28 73 71 6c 69 74 65 33 5f 65 72 72 63  Obj(sqlite3_errc
11760 6f 64 65 28 70 44 62 2d 3e 64 62 29 29 29 3b 0a  ode(pDb->db)));.
11770 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
11780 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 24 64 62    /*.  **    $db
11790 20 65 78 69 73 74 73 20 24 73 71 6c 0a 20 20 2a   exists $sql.  *
117a0 2a 20 20 20 20 24 64 62 20 6f 6e 65 63 6f 6c 75  *    $db onecolu
117b0 6d 6e 20 24 73 71 6c 0a 20 20 2a 2a 0a 20 20 2a  mn $sql.  **.  *
117c0 2a 20 54 68 65 20 6f 6e 65 63 6f 6c 75 6d 6e 20  * The onecolumn 
117d0 6d 65 74 68 6f 64 20 69 73 20 74 68 65 20 65 71  method is the eq
117e0 75 69 76 61 6c 65 6e 74 20 6f 66 3a 0a 20 20 2a  uivalent of:.  *
117f0 2a 20 20 20 20 20 6c 69 6e 64 65 78 20 5b 24 64  *     lindex [$d
11800 62 20 65 76 61 6c 20 24 73 71 6c 5d 20 30 0a 20  b eval $sql] 0. 
11810 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 45 58   */.  case DB_EX
11820 49 53 54 53 3a 20 0a 20 20 63 61 73 65 20 44 42  ISTS: .  case DB
11830 5f 4f 4e 45 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20  _ONECOLUMN: {.  
11840 20 20 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 20    DbEvalContext 
11850 73 45 76 61 6c 3b 0a 20 20 20 20 69 66 28 20 6f  sEval;.    if( o
11860 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20  bjc!=3 ){.      
11870 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
11880 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76  (interp, 2, objv
11890 2c 20 22 53 51 4c 22 29 3b 0a 20 20 20 20 20 20  , "SQL");.      
118a0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
118b0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 62 45  ;.    }..    dbE
118c0 76 61 6c 49 6e 69 74 28 26 73 45 76 61 6c 2c 20  valInit(&sEval, 
118d0 70 44 62 2c 20 6f 62 6a 76 5b 32 5d 2c 20 30 29  pDb, objv[2], 0)
118e0 3b 0a 20 20 20 20 72 63 20 3d 20 64 62 45 76 61  ;.    rc = dbEva
118f0 6c 53 74 65 70 28 26 73 45 76 61 6c 29 3b 0a 20  lStep(&sEval);. 
11900 20 20 20 69 66 28 20 63 68 6f 69 63 65 3d 3d 44     if( choice==D
11910 42 5f 4f 4e 45 43 4f 4c 55 4d 4e 20 29 7b 0a 20  B_ONECOLUMN ){. 
11920 20 20 20 20 20 69 66 28 20 72 63 3d 3d 54 43 4c       if( rc==TCL
11930 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 54  _OK ){.        T
11940 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
11950 69 6e 74 65 72 70 2c 20 64 62 45 76 61 6c 43 6f  interp, dbEvalCo
11960 6c 75 6d 6e 56 61 6c 75 65 28 26 73 45 76 61 6c  lumnValue(&sEval
11970 2c 20 30 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20  , 0));.      }. 
11980 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d     }else if( rc=
11990 3d 54 43 4c 5f 42 52 45 41 4b 20 7c 7c 20 72 63  =TCL_BREAK || rc
119a0 3d 3d 54 43 4c 5f 4f 4b 20 29 7b 0a 20 20 20 20  ==TCL_OK ){.    
119b0 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
119c0 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
119d0 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28 72 63 3d  ewBooleanObj(rc=
119e0 3d 54 43 4c 5f 4f 4b 29 29 3b 0a 20 20 20 20 7d  =TCL_OK));.    }
119f0 0a 20 20 20 20 64 62 45 76 61 6c 46 69 6e 61 6c  .    dbEvalFinal
11a00 69 7a 65 28 26 73 45 76 61 6c 29 3b 0a 0a 20 20  ize(&sEval);..  
11a10 20 20 69 66 28 20 72 63 3d 3d 54 43 4c 5f 42 52    if( rc==TCL_BR
11a20 45 41 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  EAK ){.      rc 
11a30 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  = TCL_OK;.    }.
11a40 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20      break;.  }. 
11a50 20 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20    .  /*.  **    
11a60 24 64 62 20 65 76 61 6c 20 24 73 71 6c 20 3f 61  $db eval $sql ?a
11a70 72 72 61 79 3f 20 3f 7b 20 20 2e 2e 2e 63 6f 64  rray? ?{  ...cod
11a80 65 2e 2e 2e 20 7d 3f 0a 20 20 2a 2a 0a 20 20 2a  e... }?.  **.  *
11a90 2a 20 54 68 65 20 53 51 4c 20 73 74 61 74 65 6d  * The SQL statem
11aa0 65 6e 74 20 69 6e 20 24 73 71 6c 20 69 73 20 65  ent in $sql is e
11ab0 76 61 6c 75 61 74 65 64 2e 20 20 46 6f 72 20 65  valuated.  For e
11ac0 61 63 68 20 72 6f 77 2c 20 74 68 65 20 76 61 6c  ach row, the val
11ad0 75 65 73 20 61 72 65 0a 20 20 2a 2a 20 70 6c 61  ues are.  ** pla
11ae0 63 65 64 20 69 6e 20 65 6c 65 6d 65 6e 74 73 20  ced in elements 
11af0 6f 66 20 74 68 65 20 61 72 72 61 79 20 6e 61 6d  of the array nam
11b00 65 64 20 22 61 72 72 61 79 22 20 61 6e 64 20 2e  ed "array" and .
11b10 2e 2e 63 6f 64 65 2e 2e 2e 20 69 73 20 65 78 65  ..code... is exe
11b20 63 75 74 65 64 2e 0a 20 20 2a 2a 20 49 66 20 22  cuted..  ** If "
11b30 61 72 72 61 79 22 20 61 6e 64 20 22 63 6f 64 65  array" and "code
11b40 22 20 61 72 65 20 6f 6d 69 74 74 65 64 2c 20 74  " are omitted, t
11b50 68 65 6e 20 6e 6f 20 63 61 6c 6c 62 61 63 6b 20  hen no callback 
11b60 69 73 20 65 76 65 72 79 20 69 6e 76 6f 6b 65 64  is every invoked
11b70 2e 0a 20 20 2a 2a 20 49 66 20 22 61 72 72 61 79  ..  ** If "array
11b80 22 20 69 73 20 61 6e 20 65 6d 70 74 79 20 73 74  " is an empty st
11b90 72 69 6e 67 2c 20 74 68 65 6e 20 74 68 65 20 76  ring, then the v
11ba0 61 6c 75 65 73 20 61 72 65 20 70 6c 61 63 65 64  alues are placed
11bb0 20 69 6e 20 76 61 72 69 61 62 6c 65 73 0a 20 20   in variables.  
11bc0 2a 2a 20 74 68 61 74 20 68 61 76 65 20 74 68 65  ** that have the
11bd0 20 73 61 6d 65 20 6e 61 6d 65 20 61 73 20 74 68   same name as th
11be0 65 20 66 69 65 6c 64 73 20 65 78 74 72 61 63 74  e fields extract
11bf0 65 64 20 62 79 20 74 68 65 20 71 75 65 72 79 2e  ed by the query.
11c00 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f  .  */.  case DB_
11c10 45 56 41 4c 3a 20 7b 0a 20 20 20 20 69 66 28 20  EVAL: {.    if( 
11c20 6f 62 6a 63 3c 33 20 7c 7c 20 6f 62 6a 63 3e 35  objc<3 || objc>5
11c30 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72   ){.      Tcl_Wr
11c40 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
11c50 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 53 51 4c  p, 2, objv, "SQL
11c60 20 3f 41 52 52 41 59 2d 4e 41 4d 45 3f 20 3f 53   ?ARRAY-NAME? ?S
11c70 43 52 49 50 54 3f 22 29 3b 0a 20 20 20 20 20 20  CRIPT?");.      
11c80 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
11c90 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
11ca0 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20 20 20 20   objc==3 ){.    
11cb0 20 20 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 20    DbEvalContext 
11cc0 73 45 76 61 6c 3b 0a 20 20 20 20 20 20 54 63 6c  sEval;.      Tcl
11cd0 5f 4f 62 6a 20 2a 70 52 65 74 20 3d 20 54 63 6c  _Obj *pRet = Tcl
11ce0 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20 20 20 20 20  _NewObj();.     
11cf0 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
11d00 74 28 70 52 65 74 29 3b 0a 20 20 20 20 20 20 64  t(pRet);.      d
11d10 62 45 76 61 6c 49 6e 69 74 28 26 73 45 76 61 6c  bEvalInit(&sEval
11d20 2c 20 70 44 62 2c 20 6f 62 6a 76 5b 32 5d 2c 20  , pDb, objv[2], 
11d30 30 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  0);.      while(
11d40 20 54 43 4c 5f 4f 4b 3d 3d 28 72 63 20 3d 20 64   TCL_OK==(rc = d
11d50 62 45 76 61 6c 53 74 65 70 28 26 73 45 76 61 6c  bEvalStep(&sEval
11d60 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  )) ){.        in
11d70 74 20 69 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  t i;.        int
11d80 20 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 64   nCol;.        d
11d90 62 45 76 61 6c 52 6f 77 49 6e 66 6f 28 26 73 45  bEvalRowInfo(&sE
11da0 76 61 6c 2c 20 26 6e 43 6f 6c 2c 20 30 29 3b 0a  val, &nCol, 0);.
11db0 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
11dc0 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20   i<nCol; i++){. 
11dd0 20 20 20 20 20 20 20 20 20 54 63 6c 5f 4c 69 73           Tcl_Lis
11de0 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
11df0 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74 2c 20  t(interp, pRet, 
11e00 64 62 45 76 61 6c 43 6f 6c 75 6d 6e 56 61 6c 75  dbEvalColumnValu
11e10 65 28 26 73 45 76 61 6c 2c 20 69 29 29 3b 0a 20  e(&sEval, i));. 
11e20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
11e30 0a 20 20 20 20 20 20 64 62 45 76 61 6c 46 69 6e  .      dbEvalFin
11e40 61 6c 69 7a 65 28 26 73 45 76 61 6c 29 3b 0a 20  alize(&sEval);. 
11e50 20 20 20 20 20 69 66 28 20 72 63 3d 3d 54 43 4c       if( rc==TCL
11e60 5f 42 52 45 41 4b 20 29 7b 0a 20 20 20 20 20 20  _BREAK ){.      
11e70 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
11e80 6c 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74 29  lt(interp, pRet)
11e90 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 54  ;.        rc = T
11ea0 43 4c 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  CL_OK;.      }. 
11eb0 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66       Tcl_DecrRef
11ec0 43 6f 75 6e 74 28 70 52 65 74 29 3b 0a 20 20 20  Count(pRet);.   
11ed0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 43 6c   }else{.      Cl
11ee0 69 65 6e 74 44 61 74 61 20 63 64 5b 32 5d 3b 0a  ientData cd[2];.
11ef0 20 20 20 20 20 20 44 62 45 76 61 6c 43 6f 6e 74        DbEvalCont
11f00 65 78 74 20 2a 70 3b 0a 20 20 20 20 20 20 54 63  ext *p;.      Tc
11f10 6c 5f 4f 62 6a 20 2a 70 41 72 72 61 79 20 3d 20  l_Obj *pArray = 
11f20 30 3b 0a 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a  0;.      Tcl_Obj
11f30 20 2a 70 53 63 72 69 70 74 3b 0a 0a 20 20 20 20   *pScript;..    
11f40 20 20 69 66 28 20 6f 62 6a 63 3d 3d 35 20 26 26    if( objc==5 &&
11f50 20 2a 28 63 68 61 72 20 2a 29 54 63 6c 5f 47 65   *(char *)Tcl_Ge
11f60 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d 29  tString(objv[3])
11f70 20 29 7b 0a 20 20 20 20 20 20 20 20 70 41 72 72   ){.        pArr
11f80 61 79 20 3d 20 6f 62 6a 76 5b 33 5d 3b 0a 20 20  ay = objv[3];.  
11f90 20 20 20 20 7d 0a 20 20 20 20 20 20 70 53 63 72      }.      pScr
11fa0 69 70 74 20 3d 20 6f 62 6a 76 5b 6f 62 6a 63 2d  ipt = objv[objc-
11fb0 31 5d 3b 0a 20 20 20 20 20 20 54 63 6c 5f 49 6e  1];.      Tcl_In
11fc0 63 72 52 65 66 43 6f 75 6e 74 28 70 53 63 72 69  crRefCount(pScri
11fd0 70 74 29 3b 0a 20 20 20 20 20 20 0a 20 20 20 20  pt);.      .    
11fe0 20 20 70 20 3d 20 28 44 62 45 76 61 6c 43 6f 6e    p = (DbEvalCon
11ff0 74 65 78 74 20 2a 29 54 63 6c 5f 41 6c 6c 6f 63  text *)Tcl_Alloc
12000 28 73 69 7a 65 6f 66 28 44 62 45 76 61 6c 43 6f  (sizeof(DbEvalCo
12010 6e 74 65 78 74 29 29 3b 0a 20 20 20 20 20 20 64  ntext));.      d
12020 62 45 76 61 6c 49 6e 69 74 28 70 2c 20 70 44 62  bEvalInit(p, pDb
12030 2c 20 6f 62 6a 76 5b 32 5d 2c 20 70 41 72 72 61  , objv[2], pArra
12040 79 29 3b 0a 0a 20 20 20 20 20 20 63 64 5b 30 5d  y);..      cd[0]
12050 20 3d 20 28 76 6f 69 64 20 2a 29 70 3b 0a 20 20   = (void *)p;.  
12060 20 20 20 20 63 64 5b 31 5d 20 3d 20 28 76 6f 69      cd[1] = (voi
12070 64 20 2a 29 70 53 63 72 69 70 74 3b 0a 20 20 20  d *)pScript;.   
12080 20 20 20 72 63 20 3d 20 44 62 45 76 61 6c 4e 65     rc = DbEvalNe
12090 78 74 43 6d 64 28 63 64 2c 20 69 6e 74 65 72 70  xtCmd(cd, interp
120a0 2c 20 54 43 4c 5f 4f 4b 29 3b 0a 20 20 20 20 7d  , TCL_OK);.    }
120b0 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
120c0 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24  .  /*.  **     $
120d0 64 62 20 66 75 6e 63 74 69 6f 6e 20 4e 41 4d 45  db function NAME
120e0 20 5b 2d 61 72 67 63 6f 75 6e 74 20 4e 5d 20 53   [-argcount N] S
120f0 43 52 49 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20  CRIPT.  **.  ** 
12100 43 72 65 61 74 65 20 61 20 6e 65 77 20 53 51 4c  Create a new SQL
12110 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64   function called
12120 20 4e 41 4d 45 2e 20 20 57 68 65 6e 65 76 65 72   NAME.  Whenever
12130 20 74 68 61 74 20 66 75 6e 63 74 69 6f 6e 20 69   that function i
12140 73 0a 20 20 2a 2a 20 63 61 6c 6c 65 64 2c 20 69  s.  ** called, i
12150 6e 76 6f 6b 65 20 53 43 52 49 50 54 20 74 6f 20  nvoke SCRIPT to 
12160 65 76 61 6c 75 61 74 65 20 74 68 65 20 66 75 6e  evaluate the fun
12170 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 63 61  ction..  */.  ca
12180 73 65 20 44 42 5f 46 55 4e 43 54 49 4f 4e 3a 20  se DB_FUNCTION: 
12190 7b 0a 20 20 20 20 53 71 6c 46 75 6e 63 20 2a 70  {.    SqlFunc *p
121a0 46 75 6e 63 3b 0a 20 20 20 20 54 63 6c 5f 4f 62  Func;.    Tcl_Ob
121b0 6a 20 2a 70 53 63 72 69 70 74 3b 0a 20 20 20 20  j *pScript;.    
121c0 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20  char *zName;.   
121d0 20 69 6e 74 20 6e 41 72 67 20 3d 20 2d 31 3b 0a   int nArg = -1;.
121e0 20 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d 36 20      if( objc==6 
121f0 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  ){.      const c
12200 68 61 72 20 2a 7a 20 3d 20 54 63 6c 5f 47 65 74  har *z = Tcl_Get
12210 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b  String(objv[3]);
12220 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 73  .      int n = s
12230 74 72 6c 65 6e 33 30 28 7a 29 3b 0a 20 20 20 20  trlen30(z);.    
12240 20 20 69 66 28 20 6e 3e 32 20 26 26 20 73 74 72    if( n>2 && str
12250 6e 63 6d 70 28 7a 2c 20 22 2d 61 72 67 63 6f 75  ncmp(z, "-argcou
12260 6e 74 22 2c 6e 29 3d 3d 30 20 29 7b 0a 20 20 20  nt",n)==0 ){.   
12270 20 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74       if( Tcl_Get
12280 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
12290 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 26 6e 41 72  p, objv[4], &nAr
122a0 67 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  g) ) return TCL_
122b0 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 69  ERROR;.        i
122c0 66 28 20 6e 41 72 67 3c 30 20 29 7b 0a 20 20 20  f( nArg<0 ){.   
122d0 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e         Tcl_Appen
122e0 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
122f0 22 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d  "number of argum
12300 65 6e 74 73 20 6d 75 73 74 20 62 65 20 6e 6f 6e  ents must be non
12310 2d 6e 65 67 61 74 69 76 65 22 2c 0a 20 20 20 20  -negative",.    
12320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12330 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 30 29         (char*)0)
12340 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
12350 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
12360 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
12370 20 20 20 20 20 20 70 53 63 72 69 70 74 20 3d 20        pScript = 
12380 6f 62 6a 76 5b 35 5d 3b 0a 20 20 20 20 7d 65 6c  objv[5];.    }el
12390 73 65 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29  se if( objc!=4 )
123a0 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e  {.      Tcl_Wron
123b0 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
123c0 20 32 2c 20 6f 62 6a 76 2c 20 22 4e 41 4d 45 20   2, objv, "NAME 
123d0 5b 2d 61 72 67 63 6f 75 6e 74 20 4e 5d 20 53 43  [-argcount N] SC
123e0 52 49 50 54 22 29 3b 0a 20 20 20 20 20 20 72 65  RIPT");.      re
123f0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
12400 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
12410 20 70 53 63 72 69 70 74 20 3d 20 6f 62 6a 76 5b   pScript = objv[
12420 33 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4e  3];.    }.    zN
12430 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  ame = Tcl_GetStr
12440 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
12450 32 5d 2c 20 30 29 3b 0a 20 20 20 20 70 46 75 6e  2], 0);.    pFun
12460 63 20 3d 20 66 69 6e 64 53 71 6c 46 75 6e 63 28  c = findSqlFunc(
12470 70 44 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  pDb, zName);.   
12480 20 69 66 28 20 70 46 75 6e 63 3d 3d 30 20 29 20   if( pFunc==0 ) 
12490 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
124a0 3b 0a 20 20 20 20 69 66 28 20 70 46 75 6e 63 2d  ;.    if( pFunc-
124b0 3e 70 53 63 72 69 70 74 20 29 7b 0a 20 20 20 20  >pScript ){.    
124c0 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
124d0 6e 74 28 70 46 75 6e 63 2d 3e 70 53 63 72 69 70  nt(pFunc->pScrip
124e0 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 46  t);.    }.    pF
124f0 75 6e 63 2d 3e 70 53 63 72 69 70 74 20 3d 20 70  unc->pScript = p
12500 53 63 72 69 70 74 3b 0a 20 20 20 20 54 63 6c 5f  Script;.    Tcl_
12510 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 53 63  IncrRefCount(pSc
12520 72 69 70 74 29 3b 0a 20 20 20 20 70 46 75 6e 63  ript);.    pFunc
12530 2d 3e 75 73 65 45 76 61 6c 4f 62 6a 76 20 3d 20  ->useEvalObjv = 
12540 73 61 66 65 54 6f 55 73 65 45 76 61 6c 4f 62 6a  safeToUseEvalObj
12550 76 28 69 6e 74 65 72 70 2c 20 70 53 63 72 69 70  v(interp, pScrip
12560 74 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  t);.    rc = sql
12570 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
12580 74 69 6f 6e 28 70 44 62 2d 3e 64 62 2c 20 7a 4e  tion(pDb->db, zN
12590 61 6d 65 2c 20 6e 41 72 67 2c 20 53 51 4c 49 54  ame, nArg, SQLIT
125a0 45 5f 55 54 46 38 2c 0a 20 20 20 20 20 20 20 20  E_UTF8,.        
125b0 70 46 75 6e 63 2c 20 74 63 6c 53 71 6c 46 75 6e  pFunc, tclSqlFun
125c0 63 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66  c, 0, 0);.    if
125d0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
125e0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 54 43  ){.      rc = TC
125f0 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 54  L_ERROR;.      T
12600 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
12610 65 72 70 2c 20 28 63 68 61 72 20 2a 29 73 71 6c  erp, (char *)sql
12620 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d  ite3_errmsg(pDb-
12630 3e 64 62 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49  >db), TCL_VOLATI
12640 4c 45 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62  LE);.    }.    b
12650 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a  reak;.  }..  /*.
12660 20 20 2a 2a 20 20 20 20 20 24 64 62 20 69 6e 63    **     $db inc
12670 72 62 6c 6f 62 20 3f 2d 72 65 61 64 6f 6e 6c 79  rblob ?-readonly
12680 3f 20 3f 44 42 3f 20 54 41 42 4c 45 20 43 4f 4c  ? ?DB? TABLE COL
12690 55 4d 4e 20 52 4f 57 49 44 0a 20 20 2a 2f 0a 20  UMN ROWID.  */. 
126a0 20 63 61 73 65 20 44 42 5f 49 4e 43 52 42 4c 4f   case DB_INCRBLO
126b0 42 3a 20 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  B: {.#ifdef SQLI
126c0 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42  TE_OMIT_INCRBLOB
126d0 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
126e0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 69  esult(interp, "i
126f0 6e 63 72 62 6c 6f 62 20 6e 6f 74 20 61 76 61 69  ncrblob not avai
12700 6c 61 62 6c 65 20 69 6e 20 74 68 69 73 20 62 75  lable in this bu
12710 69 6c 64 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  ild", 0);.    re
12720 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
12730 23 65 6c 73 65 0a 20 20 20 20 69 6e 74 20 69 73  #else.    int is
12740 52 65 61 64 6f 6e 6c 79 20 3d 20 30 3b 0a 20 20  Readonly = 0;.  
12750 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
12760 62 20 3d 20 22 6d 61 69 6e 22 3b 0a 20 20 20 20  b = "main";.    
12770 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62  const char *zTab
12780 6c 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  le;.    const ch
12790 61 72 20 2a 7a 43 6f 6c 75 6d 6e 3b 0a 20 20 20  ar *zColumn;.   
127a0 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 69 52   sqlite_int64 iR
127b0 6f 77 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63  ow;..    /* Chec
127c0 6b 20 66 6f 72 20 74 68 65 20 2d 72 65 61 64 6f  k for the -reado
127d0 6e 6c 79 20 6f 70 74 69 6f 6e 20 2a 2f 0a 20 20  nly option */.  
127e0 20 20 69 66 28 20 6f 62 6a 63 3e 33 20 26 26 20    if( objc>3 && 
127f0 73 74 72 63 6d 70 28 54 63 6c 5f 47 65 74 53 74  strcmp(Tcl_GetSt
12800 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 2c 20 22  ring(objv[2]), "
12810 2d 72 65 61 64 6f 6e 6c 79 22 29 3d 3d 30 20 29  -readonly")==0 )
12820 7b 0a 20 20 20 20 20 20 69 73 52 65 61 64 6f 6e  {.      isReadon
12830 6c 79 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20  ly = 1;.    }.. 
12840 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 28 35 2b     if( objc!=(5+
12850 69 73 52 65 61 64 6f 6e 6c 79 29 20 26 26 20 6f  isReadonly) && o
12860 62 6a 63 21 3d 28 36 2b 69 73 52 65 61 64 6f 6e  bjc!=(6+isReadon
12870 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  ly) ){.      Tcl
12880 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
12890 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22  terp, 2, objv, "
128a0 3f 2d 72 65 61 64 6f 6e 6c 79 3f 20 3f 44 42 3f  ?-readonly? ?DB?
128b0 20 54 41 42 4c 45 20 43 4f 4c 55 4d 4e 20 52 4f   TABLE COLUMN RO
128c0 57 49 44 22 29 3b 0a 20 20 20 20 20 20 72 65 74  WID");.      ret
128d0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
128e0 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 6f 62     }..    if( ob
128f0 6a 63 3d 3d 28 36 2b 69 73 52 65 61 64 6f 6e 6c  jc==(6+isReadonl
12900 79 29 20 29 7b 0a 20 20 20 20 20 20 7a 44 62 20  y) ){.      zDb 
12910 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  = Tcl_GetString(
12920 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 20 20 7d 0a  objv[2]);.    }.
12930 20 20 20 20 7a 54 61 62 6c 65 20 3d 20 54 63 6c      zTable = Tcl
12940 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
12950 6f 62 6a 63 2d 33 5d 29 3b 0a 20 20 20 20 7a 43  objc-3]);.    zC
12960 6f 6c 75 6d 6e 20 3d 20 54 63 6c 5f 47 65 74 53  olumn = Tcl_GetS
12970 74 72 69 6e 67 28 6f 62 6a 76 5b 6f 62 6a 63 2d  tring(objv[objc-
12980 32 5d 29 3b 0a 20 20 20 20 72 63 20 3d 20 54 63  2]);.    rc = Tc
12990 6c 5f 47 65 74 57 69 64 65 49 6e 74 46 72 6f 6d  l_GetWideIntFrom
129a0 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
129b0 5b 6f 62 6a 63 2d 31 5d 2c 20 26 69 52 6f 77 29  [objc-1], &iRow)
129c0 3b 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 54  ;..    if( rc==T
129d0 43 4c 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  CL_OK ){.      r
129e0 63 20 3d 20 63 72 65 61 74 65 49 6e 63 72 62 6c  c = createIncrbl
129f0 6f 62 43 68 61 6e 6e 65 6c 28 0a 20 20 20 20 20  obChannel(.     
12a00 20 20 20 20 20 69 6e 74 65 72 70 2c 20 70 44 62       interp, pDb
12a10 2c 20 7a 44 62 2c 20 7a 54 61 62 6c 65 2c 20 7a  , zDb, zTable, z
12a20 43 6f 6c 75 6d 6e 2c 20 69 52 6f 77 2c 20 69 73  Column, iRow, is
12a30 52 65 61 64 6f 6e 6c 79 0a 20 20 20 20 20 20 29  Readonly.      )
12a40 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
12a50 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
12a60 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62   /*.  **     $db
12a70 20 69 6e 74 65 72 72 75 70 74 0a 20 20 2a 2a 0a   interrupt.  **.
12a80 20 20 2a 2a 20 49 6e 74 65 72 72 75 70 74 20 74    ** Interrupt t
12a90 68 65 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20  he execution of 
12aa0 74 68 65 20 69 6e 6e 65 72 2d 6d 6f 73 74 20 53  the inner-most S
12ab0 51 4c 20 69 6e 74 65 72 70 72 65 74 65 72 2e 20  QL interpreter. 
12ac0 20 54 68 69 73 0a 20 20 2a 2a 20 63 61 75 73 65   This.  ** cause
12ad0 73 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d  s the SQL statem
12ae0 65 6e 74 20 74 6f 20 72 65 74 75 72 6e 20 61 6e  ent to return an
12af0 20 65 72 72 6f 72 20 6f 66 20 53 51 4c 49 54 45   error of SQLITE
12b00 5f 49 4e 54 45 52 52 55 50 54 2e 0a 20 20 2a 2f  _INTERRUPT..  */
12b10 0a 20 20 63 61 73 65 20 44 42 5f 49 4e 54 45 52  .  case DB_INTER
12b20 52 55 50 54 3a 20 7b 0a 20 20 20 20 73 71 6c 69  RUPT: {.    sqli
12b30 74 65 33 5f 69 6e 74 65 72 72 75 70 74 28 70 44  te3_interrupt(pD
12b40 62 2d 3e 64 62 29 3b 0a 20 20 20 20 62 72 65 61  b->db);.    brea
12b50 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  k;.  }..  /*.  *
12b60 2a 20 20 20 20 20 24 64 62 20 6e 75 6c 6c 76 61  *     $db nullva
12b70 6c 75 65 20 3f 53 54 52 49 4e 47 3f 0a 20 20 2a  lue ?STRING?.  *
12b80 2a 0a 20 20 2a 2a 20 43 68 61 6e 67 65 20 74 65  *.  ** Change te
12b90 78 74 20 75 73 65 64 20 77 68 65 6e 20 61 20 4e  xt used when a N
12ba0 55 4c 4c 20 63 6f 6d 65 73 20 62 61 63 6b 20 66  ULL comes back f
12bb0 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
12bc0 2e 20 49 66 20 3f 53 54 52 49 4e 47 3f 0a 20 20  . If ?STRING?.  
12bd0 2a 2a 20 69 73 20 6e 6f 74 20 70 72 65 73 65 6e  ** is not presen
12be0 74 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 72  t, then the curr
12bf0 65 6e 74 20 73 74 72 69 6e 67 20 75 73 65 64 20  ent string used 
12c00 66 6f 72 20 4e 55 4c 4c 20 69 73 20 72 65 74 75  for NULL is retu
12c10 72 6e 65 64 2e 0a 20 20 2a 2a 20 49 66 20 53 54  rned..  ** If ST
12c20 52 49 4e 47 20 69 73 20 70 72 65 73 65 6e 74 2c  RING is present,
12c30 20 74 68 65 6e 20 53 54 52 49 4e 47 20 69 73 20   then STRING is 
12c40 72 65 74 75 72 6e 65 64 2e 0a 20 20 2a 2a 0a 20  returned..  **. 
12c50 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 4e 55   */.  case DB_NU
12c60 4c 4c 56 41 4c 55 45 3a 20 7b 0a 20 20 20 20 69  LLVALUE: {.    i
12c70 66 28 20 6f 62 6a 63 21 3d 32 20 26 26 20 6f 62  f( objc!=2 && ob
12c80 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 54  jc!=3 ){.      T
12c90 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
12ca0 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c  interp, 2, objv,
12cb0 20 22 4e 55 4c 4c 56 41 4c 55 45 22 29 3b 0a 20   "NULLVALUE");. 
12cc0 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
12cd0 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
12ce0 20 69 66 28 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a   if( objc==3 ){.
12cf0 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20        int len;. 
12d00 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 75 6c 6c       char *zNull
12d10 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
12d20 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c  FromObj(objv[2],
12d30 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69 66   &len);.      if
12d40 28 20 70 44 62 2d 3e 7a 4e 75 6c 6c 20 29 7b 0a  ( pDb->zNull ){.
12d50 20 20 20 20 20 20 20 20 54 63 6c 5f 46 72 65 65          Tcl_Free
12d60 28 70 44 62 2d 3e 7a 4e 75 6c 6c 29 3b 0a 20 20  (pDb->zNull);.  
12d70 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
12d80 7a 4e 75 6c 6c 20 26 26 20 6c 65 6e 3e 30 20 29  zNull && len>0 )
12d90 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a  {.        pDb->z
12da0 4e 75 6c 6c 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63  Null = Tcl_Alloc
12db0 28 20 6c 65 6e 20 2b 20 31 20 29 3b 0a 20 20 20  ( len + 1 );.   
12dc0 20 20 20 20 20 73 74 72 6e 63 70 79 28 70 44 62       strncpy(pDb
12dd0 2d 3e 7a 4e 75 6c 6c 2c 20 7a 4e 75 6c 6c 2c 20  ->zNull, zNull, 
12de0 6c 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 70 44  len);.        pD
12df0 62 2d 3e 7a 4e 75 6c 6c 5b 6c 65 6e 5d 20 3d 20  b->zNull[len] = 
12e00 27 5c 30 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73  '\0';.      }els
12e10 65 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e  e{.        pDb->
12e20 7a 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 20  zNull = 0;.     
12e30 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c   }.    }.    Tcl
12e40 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
12e50 74 65 72 70 2c 20 64 62 54 65 78 74 54 6f 4f 62  terp, dbTextToOb
12e60 6a 28 70 44 62 2d 3e 7a 4e 75 6c 6c 29 29 3b 0a  j(pDb->zNull));.
12e70 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
12e80 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64    /*.  **     $d
12e90 62 20 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f  b last_insert_ro
12ea0 77 69 64 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52  wid .  **.  ** R
12eb0 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72  eturn an integer
12ec0 20 77 68 69 63 68 20 69 73 20 74 68 65 20 52 4f   which is the RO
12ed0 57 49 44 20 66 6f 72 20 74 68 65 20 6d 6f 73 74  WID for the most
12ee0 20 72 65 63 65 6e 74 20 69 6e 73 65 72 74 2e 0a   recent insert..
12ef0 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 4c    */.  case DB_L
12f00 41 53 54 5f 49 4e 53 45 52 54 5f 52 4f 57 49 44  AST_INSERT_ROWID
12f10 3a 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20  : {.    Tcl_Obj 
12f20 2a 70 52 65 73 75 6c 74 3b 0a 20 20 20 20 54 63  *pResult;.    Tc
12f30 6c 5f 57 69 64 65 49 6e 74 20 72 6f 77 69 64 3b  l_WideInt rowid;
12f40 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 32  .    if( objc!=2
12f50 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72   ){.      Tcl_Wr
12f60 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
12f70 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 22 29 3b  p, 2, objv, "");
12f80 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
12f90 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
12fa0 20 20 20 72 6f 77 69 64 20 3d 20 73 71 6c 69 74     rowid = sqlit
12fb0 65 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72  e3_last_insert_r
12fc0 6f 77 69 64 28 70 44 62 2d 3e 64 62 29 3b 0a 20  owid(pDb->db);. 
12fd0 20 20 20 70 52 65 73 75 6c 74 20 3d 20 54 63 6c     pResult = Tcl
12fe0 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _GetObjResult(in
12ff0 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f 53  terp);.    Tcl_S
13000 65 74 57 69 64 65 49 6e 74 4f 62 6a 28 70 52 65  etWideIntObj(pRe
13010 73 75 6c 74 2c 20 72 6f 77 69 64 29 3b 0a 20 20  sult, rowid);.  
13020 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
13030 2f 2a 0a 20 20 2a 2a 20 54 68 65 20 44 42 5f 4f  /*.  ** The DB_O
13040 4e 45 43 4f 4c 55 4d 4e 20 6d 65 74 68 6f 64 20  NECOLUMN method 
13050 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 74  is implemented t
13060 6f 67 65 74 68 65 72 20 77 69 74 68 20 44 42 5f  ogether with DB_
13070 45 58 49 53 54 53 2e 0a 20 20 2a 2f 0a 0a 20 20  EXISTS..  */..  
13080 2f 2a 20 20 20 20 24 64 62 20 70 72 6f 67 72 65  /*    $db progre
13090 73 73 20 3f 4e 20 43 41 4c 4c 42 41 43 4b 3f 0a  ss ?N CALLBACK?.
130a0 20 20 2a 2a 20 0a 20 20 2a 2a 20 49 6e 76 6f 6b    ** .  ** Invok
130b0 65 20 74 68 65 20 67 69 76 65 6e 20 63 61 6c 6c  e the given call
130c0 62 61 63 6b 20 65 76 65 72 79 20 4e 20 76 69 72  back every N vir
130d0 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 6f 70 63  tual machine opc
130e0 6f 64 65 73 20 77 68 69 6c 65 20 65 78 65 63 75  odes while execu
130f0 74 69 6e 67 0a 20 20 2a 2a 20 71 75 65 72 69 65  ting.  ** querie
13100 73 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  s..  */.  case D
13110 42 5f 50 52 4f 47 52 45 53 53 3a 20 7b 0a 20 20  B_PROGRESS: {.  
13120 20 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b    if( objc==2 ){
13130 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e  .      if( pDb->
13140 7a 50 72 6f 67 72 65 73 73 20 29 7b 0a 20 20 20  zProgress ){.   
13150 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
13160 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 44  esult(interp, pD
13170 62 2d 3e 7a 50 72 6f 67 72 65 73 73 2c 20 30 29  b->zProgress, 0)
13180 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
13190 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d 34 20  lse if( objc==4 
131a0 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  ){.      char *z
131b0 50 72 6f 67 72 65 73 73 3b 0a 20 20 20 20 20 20  Progress;.      
131c0 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20 69  int len;.      i
131d0 6e 74 20 4e 3b 0a 20 20 20 20 20 20 69 66 28 20  nt N;.      if( 
131e0 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 49  TCL_OK!=Tcl_GetI
131f0 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
13200 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 4e 29 20 29  , objv[2], &N) )
13210 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
13220 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
13230 20 20 7d 3b 0a 20 20 20 20 20 20 69 66 28 20 70    };.      if( p
13240 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 20 29 7b  Db->zProgress ){
13250 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 46 72 65  .        Tcl_Fre
13260 65 28 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73  e(pDb->zProgress
13270 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
13280 20 7a 50 72 6f 67 72 65 73 73 20 3d 20 54 63 6c   zProgress = Tcl
13290 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
132a0 6a 28 6f 62 6a 76 5b 33 5d 2c 20 26 6c 65 6e 29  j(objv[3], &len)
132b0 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 50 72 6f  ;.      if( zPro
132c0 67 72 65 73 73 20 26 26 20 6c 65 6e 3e 30 20 29  gress && len>0 )
132d0 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a  {.        pDb->z
132e0 50 72 6f 67 72 65 73 73 20 3d 20 54 63 6c 5f 41  Progress = Tcl_A
132f0 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20 31 20 29 3b  lloc( len + 1 );
13300 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
13310 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 2c 20  pDb->zProgress, 
13320 7a 50 72 6f 67 72 65 73 73 2c 20 6c 65 6e 2b 31  zProgress, len+1
13330 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
13340 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 50 72          pDb->zPr
13350 6f 67 72 65 73 73 20 3d 20 30 3b 0a 20 20 20 20  ogress = 0;.    
13360 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
13370 54 45 5f 4f 4d 49 54 5f 50 52 4f 47 52 45 53 53  TE_OMIT_PROGRESS
13380 5f 43 41 4c 4c 42 41 43 4b 0a 20 20 20 20 20 20  _CALLBACK.      
13390 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65  if( pDb->zProgre
133a0 73 73 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44  ss ){.        pD
133b0 62 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65  b->interp = inte
133c0 72 70 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  rp;.        sqli
133d0 74 65 33 5f 70 72 6f 67 72 65 73 73 5f 68 61 6e  te3_progress_han
133e0 64 6c 65 72 28 70 44 62 2d 3e 64 62 2c 20 4e 2c  dler(pDb->db, N,
133f0 20 44 62 50 72 6f 67 72 65 73 73 48 61 6e 64 6c   DbProgressHandl
13400 65 72 2c 20 70 44 62 29 3b 0a 20 20 20 20 20 20  er, pDb);.      
13410 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
13420 71 6c 69 74 65 33 5f 70 72 6f 67 72 65 73 73 5f  qlite3_progress_
13430 68 61 6e 64 6c 65 72 28 70 44 62 2d 3e 64 62 2c  handler(pDb->db,
13440 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20   0, 0, 0);.     
13450 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65   }.#endif.    }e
13460 6c 73 65 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57  lse{.      Tcl_W
13470 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
13480 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 4e 20  rp, 2, objv, "N 
13490 43 41 4c 4c 42 41 43 4b 22 29 3b 0a 20 20 20 20  CALLBACK");.    
134a0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
134b0 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 72  OR;.    }.    br
134c0 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20  eak;.  }..  /*  
134d0 20 20 24 64 62 20 70 72 6f 66 69 6c 65 20 3f 43    $db profile ?C
134e0 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a 0a 20 20  ALLBACK?.  **.  
134f0 2a 2a 20 4d 61 6b 65 20 61 72 72 61 6e 67 65 6d  ** Make arrangem
13500 65 6e 74 73 20 74 6f 20 69 6e 76 6f 6b 65 20 74  ents to invoke t
13510 68 65 20 43 41 4c 4c 42 41 43 4b 20 72 6f 75 74  he CALLBACK rout
13520 69 6e 65 20 61 66 74 65 72 20 65 61 63 68 20 53  ine after each S
13530 51 4c 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a  QL statement.  *
13540 2a 20 74 68 61 74 20 68 61 73 20 72 75 6e 2e 20  * that has run. 
13550 20 54 68 65 20 74 65 78 74 20 6f 66 20 74 68 65   The text of the
13560 20 53 51 4c 20 61 6e 64 20 74 68 65 20 61 6d 6f   SQL and the amo
13570 75 6e 74 20 6f 66 20 65 6c 61 70 73 65 20 74 69  unt of elapse ti
13580 6d 65 20 61 72 65 0a 20 20 2a 2a 20 61 70 70 65  me are.  ** appe
13590 6e 64 65 64 20 74 6f 20 43 41 4c 4c 42 41 43 4b  nded to CALLBACK
135a0 20 62 65 66 6f 72 65 20 74 68 65 20 73 63 72 69   before the scri
135b0 70 74 20 69 73 20 72 75 6e 2e 0a 20 20 2a 2f 0a  pt is run..  */.
135c0 20 20 63 61 73 65 20 44 42 5f 50 52 4f 46 49 4c    case DB_PROFIL
135d0 45 3a 20 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a  E: {.    if( obj
135e0 63 3e 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  c>3 ){.      Tcl
135f0 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
13600 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22  terp, 2, objv, "
13610 3f 43 41 4c 4c 42 41 43 4b 3f 22 29 3b 0a 20 20  ?CALLBACK?");.  
13620 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
13630 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73 65 20  RROR;.    }else 
13640 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20  if( objc==2 ){. 
13650 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 50       if( pDb->zP
13660 72 6f 66 69 6c 65 20 29 7b 0a 20 20 20 20 20 20  rofile ){.      
13670 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
13680 6c 74 28 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e  lt(interp, pDb->
13690 7a 50 72 6f 66 69 6c 65 2c 20 30 29 3b 0a 20 20  zProfile, 0);.  
136a0 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
136b0 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 50 72  .      char *zPr
136c0 6f 66 69 6c 65 3b 0a 20 20 20 20 20 20 69 6e 74  ofile;.      int
136d0 20 6c 65 6e 3b 0a 20 20 20 20 20 20 69 66 28 20   len;.      if( 
136e0 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 20 29 7b  pDb->zProfile ){
136f0 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 46 72 65  .        Tcl_Fre
13700 65 28 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 29  e(pDb->zProfile)
13710 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
13720 7a 50 72 6f 66 69 6c 65 20 3d 20 54 63 6c 5f 47  zProfile = Tcl_G
13730 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
13740 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a  objv[2], &len);.
13750 20 20 20 20 20 20 69 66 28 20 7a 50 72 6f 66 69        if( zProfi
13760 6c 65 20 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20  le && len>0 ){. 
13770 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 50 72 6f         pDb->zPro
13780 66 69 6c 65 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63  file = Tcl_Alloc
13790 28 20 6c 65 6e 20 2b 20 31 20 29 3b 0a 20 20 20  ( len + 1 );.   
137a0 20 20 20 20 20 6d 65 6d 63 70 79 28 70 44 62 2d       memcpy(pDb-
137b0 3e 7a 50 72 6f 66 69 6c 65 2c 20 7a 50 72 6f 66  >zProfile, zProf
137c0 69 6c 65 2c 20 6c 65 6e 2b 31 29 3b 0a 20 20 20  ile, len+1);.   
137d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
137e0 20 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 20    pDb->zProfile 
137f0 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66  = 0;.      }.#if
13800 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
13810 5f 4f 4d 49 54 5f 54 52 41 43 45 29 20 26 26 20  _OMIT_TRACE) && 
13820 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
13830 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f  OMIT_FLOATING_PO
13840 49 4e 54 29 0a 20 20 20 20 20 20 69 66 28 20 70  INT).      if( p
13850 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 20 29 7b 0a  Db->zProfile ){.
13860 20 20 20 20 20 20 20 20 70 44 62 2d 3e 69 6e 74          pDb->int
13870 65 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20  erp = interp;.  
13880 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 70 72        sqlite3_pr
13890 6f 66 69 6c 65 28 70 44 62 2d 3e 64 62 2c 20 44  ofile(pDb->db, D
138a0 62 50 72 6f 66 69 6c 65 48 61 6e 64 6c 65 72 2c  bProfileHandler,
138b0 20 70 44 62 29 3b 0a 20 20 20 20 20 20 7d 65 6c   pDb);.      }el
138c0 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
138d0 74 65 33 5f 70 72 6f 66 69 6c 65 28 70 44 62 2d  te3_profile(pDb-
138e0 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  >db, 0, 0);.    
138f0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d    }.#endif.    }
13900 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
13910 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24  .  /*.  **     $
13920 64 62 20 72 65 6b 65 79 20 4b 45 59 0a 20 20 2a  db rekey KEY.  *
13930 2a 0a 20 20 2a 2a 20 43 68 61 6e 67 65 20 74 68  *.  ** Change th
13940 65 20 65 6e 63 72 79 70 74 69 6f 6e 20 6b 65 79  e encryption key
13950 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 6c   on the currentl
13960 79 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 2e  y open database.
13970 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f  .  */.  case DB_
13980 52 45 4b 45 59 3a 20 7b 0a 20 20 20 20 69 6e 74  REKEY: {.    int
13990 20 6e 4b 65 79 3b 0a 20 20 20 20 76 6f 69 64 20   nKey;.    void 
139a0 2a 70 4b 65 79 3b 0a 20 20 20 20 69 66 28 20 6f  *pKey;.    if( o
139b0 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20  bjc!=3 ){.      
139c0 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
139d0 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76  (interp, 2, objv
139e0 2c 20 22 4b 45 59 22 29 3b 0a 20 20 20 20 20 20  , "KEY");.      
139f0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
13a00 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4b 65 79  ;.    }.    pKey
13a10 20 3d 20 54 63 6c 5f 47 65 74 42 79 74 65 41 72   = Tcl_GetByteAr
13a20 72 61 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  rayFromObj(objv[
13a30 32 5d 2c 20 26 6e 4b 65 79 29 3b 0a 23 69 66 64  2], &nKey);.#ifd
13a40 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  ef SQLITE_HAS_CO
13a50 44 45 43 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  DEC.    rc = sql
13a60 69 74 65 33 5f 72 65 6b 65 79 28 70 44 62 2d 3e  ite3_rekey(pDb->
13a70 64 62 2c 20 70 4b 65 79 2c 20 6e 4b 65 79 29 3b  db, pKey, nKey);
13a80 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
13a90 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
13aa0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 73 71  esult(interp, sq
13ab0 6c 69 74 65 33 45 72 72 53 74 72 28 72 63 29 2c  lite3ErrStr(rc),
13ac0 20 30 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20   0);.      rc = 
13ad0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
13ae0 0a 23 65 6e 64 69 66 0a 20 20 20 20 62 72 65 61  .#endif.    brea
13af0 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20  k;.  }..  /*    
13b00 24 64 62 20 72 65 73 74 6f 72 65 20 3f 44 41 54  $db restore ?DAT
13b10 41 42 41 53 45 3f 20 46 49 4c 45 4e 41 4d 45 0a  ABASE? FILENAME.
13b20 20 20 2a 2a 0a 20 20 2a 2a 20 4f 70 65 6e 20 61    **.  ** Open a
13b30 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e   database file n
13b40 61 6d 65 64 20 46 49 4c 45 4e 41 4d 45 2e 20 20  amed FILENAME.  
13b50 54 72 61 6e 73 66 65 72 20 74 68 65 20 63 6f 6e  Transfer the con
13b60 74 65 6e 74 20 0a 20 20 2a 2a 20 6f 66 20 46 49  tent .  ** of FI
13b70 4c 45 4e 41 4d 45 20 69 6e 74 6f 20 74 68 65 20  LENAME into the 
13b80 6c 6f 63 61 6c 20 64 61 74 61 62 61 73 65 20 44  local database D
13b90 41 54 41 42 41 53 45 20 28 64 65 66 61 75 6c 74  ATABASE (default
13ba0 3a 20 22 6d 61 69 6e 22 29 2e 0a 20 20 2a 2f 0a  : "main")..  */.
13bb0 20 20 63 61 73 65 20 44 42 5f 52 45 53 54 4f 52    case DB_RESTOR
13bc0 45 3a 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  E: {.    const c
13bd0 68 61 72 20 2a 7a 53 72 63 46 69 6c 65 3b 0a 20  har *zSrcFile;. 
13be0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
13bf0 44 65 73 74 44 62 3b 0a 20 20 20 20 73 71 6c 69  DestDb;.    sqli
13c00 74 65 33 20 2a 70 53 72 63 3b 0a 20 20 20 20 73  te3 *pSrc;.    s
13c10 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 2a 70  qlite3_backup *p
13c20 42 61 63 6b 75 70 3b 0a 20 20 20 20 69 6e 74 20  Backup;.    int 
13c30 6e 54 69 6d 65 6f 75 74 20 3d 20 30 3b 0a 0a 20  nTimeout = 0;.. 
13c40 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d 33 20 29     if( objc==3 )
13c50 7b 0a 20 20 20 20 20 20 7a 44 65 73 74 44 62 20  {.      zDestDb 
13c60 3d 20 22 6d 61 69 6e 22 3b 0a 20 20 20 20 20 20  = "main";.      
13c70 7a 53 72 63 46 69 6c 65 20 3d 20 54 63 6c 5f 47  zSrcFile = Tcl_G
13c80 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d  etString(objv[2]
13c90 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
13ca0 20 6f 62 6a 63 3d 3d 34 20 29 7b 0a 20 20 20 20   objc==4 ){.    
13cb0 20 20 7a 44 65 73 74 44 62 20 3d 20 54 63 6c 5f    zDestDb = Tcl_
13cc0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32  GetString(objv[2
13cd0 5d 29 3b 0a 20 20 20 20 20 20 7a 53 72 63 46 69  ]);.      zSrcFi
13ce0 6c 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  le = Tcl_GetStri
13cf0 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a 20 20 20  ng(objv[3]);.   
13d00 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 54 63   }else{.      Tc
13d10 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
13d20 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
13d30 22 3f 44 41 54 41 42 41 53 45 3f 20 46 49 4c 45  "?DATABASE? FILE
13d40 4e 41 4d 45 22 29 3b 0a 20 20 20 20 20 20 72 65  NAME");.      re
13d50 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
13d60 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73      }.    rc = s
13d70 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 7a  qlite3_open_v2(z
13d80 53 72 63 46 69 6c 65 2c 20 26 70 53 72 63 2c 20  SrcFile, &pSrc, 
13d90 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
13da0 4f 4e 4c 59 2c 20 30 29 3b 0a 20 20 20 20 69 66  ONLY, 0);.    if
13db0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
13dc0 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70  ){.      Tcl_App
13dd0 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
13de0 2c 20 22 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 73  , "cannot open s
13df0 6f 75 72 63 65 20 64 61 74 61 62 61 73 65 3a 20  ource database: 
13e00 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 73 71  ",.           sq
13e10 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 53 72  lite3_errmsg(pSr
13e20 63 29 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20  c), (char*)0);. 
13e30 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f       sqlite3_clo
13e40 73 65 28 70 53 72 63 29 3b 0a 20 20 20 20 20 20  se(pSrc);.      
13e50 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
13e60 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 61 63  ;.    }.    pBac
13e70 6b 75 70 20 3d 20 73 71 6c 69 74 65 33 5f 62 61  kup = sqlite3_ba
13e80 63 6b 75 70 5f 69 6e 69 74 28 70 44 62 2d 3e 64  ckup_init(pDb->d
13e90 62 2c 20 7a 44 65 73 74 44 62 2c 20 70 53 72 63  b, zDestDb, pSrc
13ea0 2c 20 22 6d 61 69 6e 22 29 3b 0a 20 20 20 20 69  , "main");.    i
13eb0 66 28 20 70 42 61 63 6b 75 70 3d 3d 30 20 29 7b  f( pBackup==0 ){
13ec0 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  .      Tcl_Appen
13ed0 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
13ee0 22 72 65 73 74 6f 72 65 20 66 61 69 6c 65 64 3a  "restore failed:
13ef0 20 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 73   ",.           s
13f00 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44  qlite3_errmsg(pD
13f10 62 2d 3e 64 62 29 2c 20 28 63 68 61 72 2a 29 30  b->db), (char*)0
13f20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
13f30 5f 63 6c 6f 73 65 28 70 53 72 63 29 3b 0a 20 20  _close(pSrc);.  
13f40 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
13f50 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
13f60 77 68 69 6c 65 28 20 28 72 63 20 3d 20 73 71 6c  while( (rc = sql
13f70 69 74 65 33 5f 62 61 63 6b 75 70 5f 73 74 65 70  ite3_backup_step
13f80 28 70 42 61 63 6b 75 70 2c 31 30 30 29 29 3d 3d  (pBackup,100))==
13f90 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 20 20 20  SQLITE_OK.      
13fa0 20 20 20 20 20 20 20 20 7c 7c 20 72 63 3d 3d 53          || rc==S
13fb0 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20  QLITE_BUSY ){.  
13fc0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
13fd0 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20  TE_BUSY ){.     
13fe0 20 20 20 69 66 28 20 6e 54 69 6d 65 6f 75 74 2b     if( nTimeout+
13ff0 2b 20 3e 3d 20 33 20 29 20 62 72 65 61 6b 3b 0a  + >= 3 ) break;.
14000 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
14010 73 6c 65 65 70 28 31 30 30 29 3b 0a 20 20 20 20  sleep(100);.    
14020 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
14030 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f 66 69 6e  lite3_backup_fin
14040 69 73 68 28 70 42 61 63 6b 75 70 29 3b 0a 20 20  ish(pBackup);.  
14050 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
14060 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 72  _DONE ){.      r
14070 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20  c = TCL_OK;.    
14080 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51  }else if( rc==SQ
14090 4c 49 54 45 5f 42 55 53 59 20 7c 7c 20 72 63 3d  LITE_BUSY || rc=
140a0 3d 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 29  =SQLITE_LOCKED )
140b0 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65  {.      Tcl_Appe
140c0 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
140d0 20 22 72 65 73 74 6f 72 65 20 66 61 69 6c 65 64   "restore failed
140e0 3a 20 73 6f 75 72 63 65 20 64 61 74 61 62 61 73  : source databas
140f0 65 20 62 75 73 79 22 2c 0a 20 20 20 20 20 20 20  e busy",.       
14100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14110 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20  (char*)0);.     
14120 20 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b   rc = TCL_ERROR;
14130 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
14140 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
14150 6c 74 28 69 6e 74 65 72 70 2c 20 22 72 65 73 74  lt(interp, "rest
14160 6f 72 65 20 66 61 69 6c 65 64 3a 20 22 2c 0a 20  ore failed: ",. 
14170 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
14180 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62  3_errmsg(pDb->db
14190 29 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  ), (char*)0);.  
141a0 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45 52 52      rc = TCL_ERR
141b0 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  OR;.    }.    sq
141c0 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70 53 72 63  lite3_close(pSrc
141d0 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  );.    break;.  
141e0 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20  }..  /*.  **    
141f0 20 24 64 62 20 73 74 61 74 75 73 20 28 73 74 65   $db status (ste
14200 70 7c 73 6f 72 74 7c 61 75 74 6f 69 6e 64 65 78  p|sort|autoindex
14210 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 44 69 73 70  ).  **.  ** Disp
14220 6c 61 79 20 53 51 4c 49 54 45 5f 53 54 4d 54 53  lay SQLITE_STMTS
14230 54 41 54 55 53 5f 46 55 4c 4c 53 43 41 4e 5f 53  TATUS_FULLSCAN_S
14240 54 45 50 20 6f 72 20 0a 20 20 2a 2a 20 53 51 4c  TEP or .  ** SQL
14250 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 53  ITE_STMTSTATUS_S
14260 4f 52 54 20 66 6f 72 20 74 68 65 20 6d 6f 73 74  ORT for the most
14270 20 72 65 63 65 6e 74 20 65 76 61 6c 2e 0a 20 20   recent eval..  
14280 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 53 54 41  */.  case DB_STA
14290 54 55 53 3a 20 7b 0a 20 20 20 20 69 6e 74 20 76  TUS: {.    int v
142a0 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
142b0 20 2a 7a 4f 70 3b 0a 20 20 20 20 69 66 28 20 6f   *zOp;.    if( o
142c0 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20  bjc!=3 ){.      
142d0 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
142e0 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76  (interp, 2, objv
142f0 2c 20 22 28 73 74 65 70 7c 73 6f 72 74 7c 61 75  , "(step|sort|au
14300 74 6f 69 6e 64 65 78 29 22 29 3b 0a 20 20 20 20  toindex)");.    
14310 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
14320 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4f  OR;.    }.    zO
14330 70 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  p = Tcl_GetStrin
14340 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 20 20  g(objv[2]);.    
14350 69 66 28 20 73 74 72 63 6d 70 28 7a 4f 70 2c 20  if( strcmp(zOp, 
14360 22 73 74 65 70 22 29 3d 3d 30 20 29 7b 0a 20 20  "step")==0 ){.  
14370 20 20 20 20 76 20 3d 20 70 44 62 2d 3e 6e 53 74      v = pDb->nSt
14380 65 70 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  ep;.    }else if
14390 28 20 73 74 72 63 6d 70 28 7a 4f 70 2c 20 22 73  ( strcmp(zOp, "s
143a0 6f 72 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ort")==0 ){.    
143b0 20 20 76 20 3d 20 70 44 62 2d 3e 6e 53 6f 72 74    v = pDb->nSort
143c0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
143d0 73 74 72 63 6d 70 28 7a 4f 70 2c 20 22 61 75 74  strcmp(zOp, "aut
143e0 6f 69 6e 64 65 78 22 29 3d 3d 30 20 29 7b 0a 20  oindex")==0 ){. 
143f0 20 20 20 20 20 76 20 3d 20 70 44 62 2d 3e 6e 49       v = pDb->nI
14400 6e 64 65 78 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ndex;.    }else{
14410 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  .      Tcl_Appen
14420 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
14430 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 62 61  .            "ba
14440 64 20 61 72 67 75 6d 65 6e 74 3a 20 73 68 6f 75  d argument: shou
14450 6c 64 20 62 65 20 61 75 74 6f 69 6e 64 65 78 2c  ld be autoindex,
14460 20 73 74 65 70 2c 20 6f 72 20 73 6f 72 74 22 2c   step, or sort",
14470 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 63   .            (c
14480 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 72  har*)0);.      r
14490 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
144a0 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 53  .    }.    Tcl_S
144b0 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
144c0 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  rp, Tcl_NewIntOb
144d0 6a 28 76 29 29 3b 0a 20 20 20 20 62 72 65 61 6b  j(v));.    break
144e0 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 0a 20 20  ;.  }.  .  /*.  
144f0 2a 2a 20 20 20 20 20 24 64 62 20 74 69 6d 65 6f  **     $db timeo
14500 75 74 20 4d 49 4c 4c 45 53 45 43 4f 4e 44 53 0a  ut MILLESECONDS.
14510 20 20 2a 2a 0a 20 20 2a 2a 20 44 65 6c 61 79 20    **.  ** Delay 
14520 66 6f 72 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  for the number o
14530 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 73  f milliseconds s
14540 70 65 63 69 66 69 65 64 20 77 68 65 6e 20 61 20  pecified when a 
14550 66 69 6c 65 20 69 73 20 6c 6f 63 6b 65 64 2e 0a  file is locked..
14560 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 54    */.  case DB_T
14570 49 4d 45 4f 55 54 3a 20 7b 0a 20 20 20 20 69 6e  IMEOUT: {.    in
14580 74 20 6d 73 3b 0a 20 20 20 20 69 66 28 20 6f 62  t ms;.    if( ob
14590 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 54  jc!=3 ){.      T
145a0 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
145b0 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c  interp, 2, objv,
145c0 20 22 4d 49 4c 4c 49 53 45 43 4f 4e 44 53 22 29   "MILLISECONDS")
145d0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
145e0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
145f0 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49      if( Tcl_GetI
14600 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
14610 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 6d 73 29 20  , objv[2], &ms) 
14620 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
14630 4f 52 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  OR;.    sqlite3_
14640 62 75 73 79 5f 74 69 6d 65 6f 75 74 28 70 44 62  busy_timeout(pDb
14650 2d 3e 64 62 2c 20 6d 73 29 3b 0a 20 20 20 20 62  ->db, ms);.    b
14660 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f  reak;.  }.  .  /
14670 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20 74  *.  **     $db t
14680 6f 74 61 6c 5f 63 68 61 6e 67 65 73 0a 20 20 2a  otal_changes.  *
14690 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 74 68  *.  ** Return th
146a0 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
146b0 20 74 68 61 74 20 77 65 72 65 20 6d 6f 64 69 66   that were modif
146c0 69 65 64 2c 20 69 6e 73 65 72 74 65 64 2c 20 6f  ied, inserted, o
146d0 72 20 64 65 6c 65 74 65 64 20 0a 20 20 2a 2a 20  r deleted .  ** 
146e0 73 69 6e 63 65 20 74 68 65 20 64 61 74 61 62 61  since the databa
146f0 73 65 20 68 61 6e 64 6c 65 20 77 61 73 20 63 72  se handle was cr
14700 65 61 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 63 61  eated..  */.  ca
14710 73 65 20 44 42 5f 54 4f 54 41 4c 5f 43 48 41 4e  se DB_TOTAL_CHAN
14720 47 45 53 3a 20 7b 0a 20 20 20 20 54 63 6c 5f 4f  GES: {.    Tcl_O
14730 62 6a 20 2a 70 52 65 73 75 6c 74 3b 0a 20 20 20  bj *pResult;.   
14740 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a   if( objc!=2 ){.
14750 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
14760 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
14770 2c 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 20 20 20  , objv, "");.   
14780 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
14790 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ROR;.    }.    p
147a0 52 65 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65 74  Result = Tcl_Get
147b0 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
147c0 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 49 6e  );.    Tcl_SetIn
147d0 74 4f 62 6a 28 70 52 65 73 75 6c 74 2c 20 73 71  tObj(pResult, sq
147e0 6c 69 74 65 33 5f 74 6f 74 61 6c 5f 63 68 61 6e  lite3_total_chan
147f0 67 65 73 28 70 44 62 2d 3e 64 62 29 29 3b 0a 20  ges(pDb->db));. 
14800 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
14810 20 2f 2a 20 20 20 20 24 64 62 20 74 72 61 63 65   /*    $db trace
14820 20 3f 43 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a   ?CALLBACK?.  **
14830 0a 20 20 2a 2a 20 4d 61 6b 65 20 61 72 72 61 6e  .  ** Make arran
14840 67 65 6d 65 6e 74 73 20 74 6f 20 69 6e 76 6f 6b  gements to invok
14850 65 20 74 68 65 20 43 41 4c 4c 42 41 43 4b 20 72  e the CALLBACK r
14860 6f 75 74 69 6e 65 20 66 6f 72 20 65 61 63 68 20  outine for each 
14870 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 0a 20 20  SQL statement.  
14880 2a 2a 20 74 68 61 74 20 69 73 20 65 78 65 63 75  ** that is execu
14890 74 65 64 2e 20 20 54 68 65 20 74 65 78 74 20 6f  ted.  The text o
148a0 66 20 74 68 65 20 53 51 4c 20 69 73 20 61 70 70  f the SQL is app
148b0 65 6e 64 65 64 20 74 6f 20 43 41 4c 4c 42 41 43  ended to CALLBAC
148c0 4b 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20 69 74  K before.  ** it
148d0 20 69 73 20 65 78 65 63 75 74 65 64 2e 0a 20 20   is executed..  
148e0 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 54 52 41  */.  case DB_TRA
148f0 43 45 3a 20 7b 0a 20 20 20 20 69 66 28 20 6f 62  CE: {.    if( ob
14900 6a 63 3e 33 20 29 7b 0a 20 20 20 20 20 20 54 63  jc>3 ){.      Tc
14910 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
14920 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
14930 22 3f 43 41 4c 4c 42 41 43 4b 3f 22 29 3b 0a 20  "?CALLBACK?");. 
14940 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
14950 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73 65  ERROR;.    }else
14960 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a   if( objc==2 ){.
14970 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a        if( pDb->z
14980 54 72 61 63 65 20 29 7b 0a 20 20 20 20 20 20 20  Trace ){.       
14990 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
149a0 74 28 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a  t(interp, pDb->z
149b0 54 72 61 63 65 2c 20 30 29 3b 0a 20 20 20 20 20  Trace, 0);.     
149c0 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
149d0 20 20 20 20 63 68 61 72 20 2a 7a 54 72 61 63 65      char *zTrace
149e0 3b 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b  ;.      int len;
149f0 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e  .      if( pDb->
14a00 7a 54 72 61 63 65 20 29 7b 0a 20 20 20 20 20 20  zTrace ){.      
14a10 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e    Tcl_Free(pDb->
14a20 7a 54 72 61 63 65 29 3b 0a 20 20 20 20 20 20 7d  zTrace);.      }
14a30 0a 20 20 20 20 20 20 7a 54 72 61 63 65 20 3d 20  .      zTrace = 
14a40 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
14a50 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c  mObj(objv[2], &l
14a60 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  en);.      if( z
14a70 54 72 61 63 65 20 26 26 20 6c 65 6e 3e 30 20 29  Trace && len>0 )
14a80 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a  {.        pDb->z
14a90 54 72 61 63 65 20 3d 20 54 63 6c 5f 41 6c 6c 6f  Trace = Tcl_Allo
14aa0 63 28 20 6c 65 6e 20 2b 20 31 20 29 3b 0a 20 20  c( len + 1 );.  
14ab0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 44 62        memcpy(pDb
14ac0 2d 3e 7a 54 72 61 63 65 2c 20 7a 54 72 61 63 65  ->zTrace, zTrace
14ad0 2c 20 6c 65 6e 2b 31 29 3b 0a 20 20 20 20 20 20  , len+1);.      
14ae0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
14af0 44 62 2d 3e 7a 54 72 61 63 65 20 3d 20 30 3b 0a  Db->zTrace = 0;.
14b00 20 20 20 20 20 20 7d 0a 23 69 66 20 21 64 65 66        }.#if !def
14b10 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
14b20 5f 54 52 41 43 45 29 20 26 26 20 21 64 65 66 69  _TRACE) && !defi
14b30 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
14b40 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 29 0a  FLOATING_POINT).
14b50 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a        if( pDb->z
14b60 54 72 61 63 65 20 29 7b 0a 20 20 20 20 20 20 20  Trace ){.       
14b70 20 70 44 62 2d 3e 69 6e 74 65 72 70 20 3d 20 69   pDb->interp = i
14b80 6e 74 65 72 70 3b 0a 20 20 20 20 20 20 20 20 73  nterp;.        s
14b90 71 6c 69 74 65 33 5f 74 72 61 63 65 28 70 44 62  qlite3_trace(pDb
14ba0 2d 3e 64 62 2c 20 44 62 54 72 61 63 65 48 61 6e  ->db, DbTraceHan
14bb0 64 6c 65 72 2c 20 70 44 62 29 3b 0a 20 20 20 20  dler, pDb);.    
14bc0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
14bd0 20 73 71 6c 69 74 65 33 5f 74 72 61 63 65 28 70   sqlite3_trace(p
14be0 44 62 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20  Db->db, 0, 0);. 
14bf0 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
14c00 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20    }.    break;. 
14c10 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20   }..  /*    $db 
14c20 74 72 61 6e 73 61 63 74 69 6f 6e 20 5b 2d 64 65  transaction [-de
14c30 66 65 72 72 65 64 7c 2d 69 6d 6d 65 64 69 61 74  ferred|-immediat
14c40 65 7c 2d 65 78 63 6c 75 73 69 76 65 5d 20 53 43  e|-exclusive] SC
14c50 52 49 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53  RIPT.  **.  ** S
14c60 74 61 72 74 20 61 20 6e 65 77 20 74 72 61 6e 73  tart a new trans
14c70 61 63 74 69 6f 6e 20 28 69 66 20 77 65 20 61 72  action (if we ar
14c80 65 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 69 6e  e not already in
14c90 20 74 68 65 20 6d 69 64 73 74 20 6f 66 20 61 0a   the midst of a.
14ca0 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
14cb0 29 20 61 6e 64 20 65 78 65 63 75 74 65 20 74 68  ) and execute th
14cc0 65 20 54 43 4c 20 73 63 72 69 70 74 20 53 43 52  e TCL script SCR
14cd0 49 50 54 2e 20 20 41 66 74 65 72 20 53 43 52 49  IPT.  After SCRI
14ce0 50 54 0a 20 20 2a 2a 20 63 6f 6d 70 6c 65 74 65  PT.  ** complete
14cf0 73 2c 20 65 69 74 68 65 72 20 63 6f 6d 6d 69 74  s, either commit
14d00 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
14d10 20 6f 72 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b   or roll it back
14d20 20 69 66 20 53 43 52 49 50 54 0a 20 20 2a 2a 20   if SCRIPT.  ** 
14d30 74 68 72 6f 77 73 20 61 6e 20 65 78 63 65 70 74  throws an except
14d40 69 6f 6e 2e 20 20 4f 72 20 69 66 20 6e 6f 20 6e  ion.  Or if no n
14d50 65 77 20 74 72 61 6e 73 61 74 69 6f 6e 20 77 61  ew transation wa
14d60 73 20 73 74 61 72 74 65 64 2c 20 64 6f 20 6e 6f  s started, do no
14d70 74 68 69 6e 67 2e 0a 20 20 2a 2a 20 70 61 73 73  thing..  ** pass
14d80 20 74 68 65 20 65 78 63 65 70 74 69 6f 6e 20 6f   the exception o
14d90 6e 20 75 70 20 74 68 65 20 73 74 61 63 6b 2e 0a  n up the stack..
14da0 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 63    **.  ** This c
14db0 6f 6d 6d 61 6e 64 20 77 61 73 20 69 6e 73 70 69  ommand was inspi
14dc0 72 65 64 20 62 79 20 44 61 76 65 20 54 68 6f 6d  red by Dave Thom
14dd0 61 73 27 73 20 74 61 6c 6b 20 6f 6e 20 52 75 62  as's talk on Rub
14de0 79 20 61 74 20 74 68 65 0a 20 20 2a 2a 20 32 30  y at the.  ** 20
14df0 30 35 20 4f 27 52 65 69 6c 6c 79 20 4f 70 65 6e  05 O'Reilly Open
14e00 20 53 6f 75 72 63 65 20 43 6f 6e 76 65 6e 74 69   Source Conventi
14e10 6f 6e 20 28 4f 53 43 4f 4e 29 2e 0a 20 20 2a 2f  on (OSCON)..  */
14e20 0a 20 20 63 61 73 65 20 44 42 5f 54 52 41 4e 53  .  case DB_TRANS
14e30 41 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 54 63  ACTION: {.    Tc
14e40 6c 5f 4f 62 6a 20 2a 70 53 63 72 69 70 74 3b 0a  l_Obj *pScript;.
14e50 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
14e60 7a 42 65 67 69 6e 20 3d 20 22 53 41 56 45 50 4f  zBegin = "SAVEPO
14e70 49 4e 54 20 5f 74 63 6c 5f 74 72 61 6e 73 61 63  INT _tcl_transac
14e80 74 69 6f 6e 22 3b 0a 20 20 20 20 69 66 28 20 6f  tion";.    if( o
14e90 62 6a 63 21 3d 33 20 26 26 20 6f 62 6a 63 21 3d  bjc!=3 && objc!=
14ea0 34 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57  4 ){.      Tcl_W
14eb0 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
14ec0 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 5b 54  rp, 2, objv, "[T
14ed0 59 50 45 5d 20 53 43 52 49 50 54 22 29 3b 0a 20  YPE] SCRIPT");. 
14ee0 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
14ef0 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20  ERROR;.    }..  
14f00 20 20 69 66 28 20 70 44 62 2d 3e 6e 54 72 61 6e    if( pDb->nTran
14f10 73 61 63 74 69 6f 6e 3d 3d 30 20 26 26 20 6f 62  saction==0 && ob
14f20 6a 63 3d 3d 34 20 29 7b 0a 20 20 20 20 20 20 73  jc==4 ){.      s
14f30 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
14f40 20 2a 54 54 59 50 45 5f 73 74 72 73 5b 5d 20 3d   *TTYPE_strs[] =
14f50 20 7b 0a 20 20 20 20 20 20 20 20 22 64 65 66 65   {.        "defe
14f60 72 72 65 64 22 2c 20 20 20 22 65 78 63 6c 75 73  rred",   "exclus
14f70 69 76 65 22 2c 20 20 22 69 6d 6d 65 64 69 61 74  ive",  "immediat
14f80 65 22 2c 20 30 0a 20 20 20 20 20 20 7d 3b 0a 20  e", 0.      };. 
14f90 20 20 20 20 20 65 6e 75 6d 20 54 54 59 50 45 5f       enum TTYPE_
14fa0 65 6e 75 6d 20 7b 0a 20 20 20 20 20 20 20 20 54  enum {.        T
14fb0 54 59 50 45 5f 44 45 46 45 52 52 45 44 2c 20 54  TYPE_DEFERRED, T
14fc0 54 59 50 45 5f 45 58 43 4c 55 53 49 56 45 2c 20  TYPE_EXCLUSIVE, 
14fd0 54 54 59 50 45 5f 49 4d 4d 45 44 49 41 54 45 0a  TTYPE_IMMEDIATE.
14fe0 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 69        };.      i
14ff0 6e 74 20 74 74 79 70 65 3b 0a 20 20 20 20 20 20  nt ttype;.      
15000 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 64 65 78  if( Tcl_GetIndex
15010 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
15020 6f 62 6a 76 5b 32 5d 2c 20 54 54 59 50 45 5f 73  objv[2], TTYPE_s
15030 74 72 73 2c 20 22 74 72 61 6e 73 61 63 74 69 6f  trs, "transactio
15040 6e 20 74 79 70 65 22 2c 0a 20 20 20 20 20 20 20  n type",.       
15050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15060 20 20 20 20 20 20 20 30 2c 20 26 74 74 79 70 65         0, &ttype
15070 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  ) ){.        ret
15080 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
15090 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 77 69       }.      swi
150a0 74 63 68 28 20 28 65 6e 75 6d 20 54 54 59 50 45  tch( (enum TTYPE
150b0 5f 65 6e 75 6d 29 74 74 79 70 65 20 29 7b 0a 20  _enum)ttype ){. 
150c0 20 20 20 20 20 20 20 63 61 73 65 20 54 54 59 50         case TTYP
150d0 45 5f 44 45 46 45 52 52 45 44 3a 20 20 20 20 2f  E_DEFERRED:    /
150e0 2a 20 6e 6f 2d 6f 70 20 2a 2f 3b 20 20 20 20 20  * no-op */;     
150f0 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
15100 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  k;.        case 
15110 54 54 59 50 45 5f 45 58 43 4c 55 53 49 56 45 3a  TTYPE_EXCLUSIVE:
15120 20 20 20 7a 42 65 67 69 6e 20 3d 20 22 42 45 47     zBegin = "BEG
15130 49 4e 20 45 58 43 4c 55 53 49 56 45 22 3b 20 20  IN EXCLUSIVE";  
15140 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63  break;.        c
15150 61 73 65 20 54 54 59 50 45 5f 49 4d 4d 45 44 49  ase TTYPE_IMMEDI
15160 41 54 45 3a 20 20 20 7a 42 65 67 69 6e 20 3d 20  ATE:   zBegin = 
15170 22 42 45 47 49 4e 20 49 4d 4d 45 44 49 41 54 45  "BEGIN IMMEDIATE
15180 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ";  break;.     
15190 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 63   }.    }.    pSc
151a0 72 69 70 74 20 3d 20 6f 62 6a 76 5b 6f 62 6a 63  ript = objv[objc
151b0 2d 31 5d 3b 0a 0a 20 20 20 20 2f 2a 20 52 75 6e  -1];..    /* Run
151c0 20 74 68 65 20 53 51 4c 69 74 65 20 42 45 47 49   the SQLite BEGI
151d0 4e 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 6f 70 65  N command to ope
151e0 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  n a transaction 
151f0 6f 72 20 73 61 76 65 70 6f 69 6e 74 2e 20 2a 2f  or savepoint. */
15200 0a 20 20 20 20 70 44 62 2d 3e 64 69 73 61 62 6c  .    pDb->disabl
15210 65 41 75 74 68 2b 2b 3b 0a 20 20 20 20 72 63 20  eAuth++;.    rc 
15220 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70  = sqlite3_exec(p
15230 44 62 2d 3e 64 62 2c 20 7a 42 65 67 69 6e 2c 20  Db->db, zBegin, 
15240 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 70 44  0, 0, 0);.    pD
15250 62 2d 3e 64 69 73 61 62 6c 65 41 75 74 68 2d 2d  b->disableAuth--
15260 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
15270 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
15280 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
15290 74 28 69 6e 74 65 72 70 2c 20 73 71 6c 69 74 65  t(interp, sqlite
152a0 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62  3_errmsg(pDb->db
152b0 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 65 74  ), 0);.      ret
152c0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
152d0 20 20 20 7d 0a 20 20 20 20 70 44 62 2d 3e 6e 54     }.    pDb->nT
152e0 72 61 6e 73 61 63 74 69 6f 6e 2b 2b 3b 0a 0a 20  ransaction++;.. 
152f0 20 20 20 2f 2a 20 49 66 20 75 73 69 6e 67 20 4e     /* If using N
15300 52 45 2c 20 73 63 68 65 64 75 6c 65 20 61 20 63  RE, schedule a c
15310 61 6c 6c 62 61 63 6b 20 74 6f 20 69 6e 76 6f 6b  allback to invok
15320 65 20 74 68 65 20 73 63 72 69 70 74 20 70 53 63  e the script pSc
15330 72 69 70 74 2c 20 74 68 65 6e 0a 20 20 20 20 2a  ript, then.    *
15340 2a 20 61 20 73 65 63 6f 6e 64 20 63 61 6c 6c 62  * a second callb
15350 61 63 6b 20 74 6f 20 63 6f 6d 6d 69 74 20 28 6f  ack to commit (o
15360 72 20 72 6f 6c 6c 62 61 63 6b 29 20 74 68 65 20  r rollback) the 
15370 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 72 20 73  transaction or s
15380 61 76 65 70 6f 69 6e 74 0a 20 20 20 20 2a 2a 20  avepoint.    ** 
15390 6f 70 65 6e 65 64 20 61 62 6f 76 65 2e 20 49 66  opened above. If
153a0 20 6e 6f 74 20 75 73 69 6e 67 20 4e 52 45 2c 20   not using NRE, 
153b0 65 76 61 6c 75 61 74 65 20 74 68 65 20 73 63 72  evaluate the scr
153c0 69 70 74 20 64 69 72 65 63 74 6c 79 2c 20 74 68  ipt directly, th
153d0 65 6e 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 66  en.    ** call f
153e0 75 6e 63 74 69 6f 6e 20 44 62 54 72 61 6e 73 50  unction DbTransP
153f0 6f 73 74 43 6d 64 28 29 20 74 6f 20 63 6f 6d 6d  ostCmd() to comm
15400 69 74 20 28 6f 72 20 72 6f 6c 6c 62 61 63 6b 29  it (or rollback)
15410 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
15420 20 0a 20 20 20 20 2a 2a 20 6f 72 20 73 61 76 65   .    ** or save
15430 70 6f 69 6e 74 2e 20 20 2a 2f 0a 20 20 20 20 69  point.  */.    i
15440 66 28 20 44 62 55 73 65 4e 72 65 28 29 20 29 7b  f( DbUseNre() ){
15450 0a 20 20 20 20 20 20 54 63 6c 5f 4e 52 41 64 64  .      Tcl_NRAdd
15460 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c  Callback(interp,
15470 20 44 62 54 72 61 6e 73 50 6f 73 74 43 6d 64 2c   DbTransPostCmd,
15480 20 63 64 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20   cd, 0, 0, 0);. 
15490 20 20 20 20 20 54 63 6c 5f 4e 52 45 76 61 6c 4f       Tcl_NREvalO
154a0 62 6a 28 69 6e 74 65 72 70 2c 20 70 53 63 72 69  bj(interp, pScri
154b0 70 74 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73  pt, 0);.    }els
154c0 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 44 62  e{.      rc = Db
154d0 54 72 61 6e 73 50 6f 73 74 43 6d 64 28 26 63 64  TransPostCmd(&cd
154e0 2c 20 69 6e 74 65 72 70 2c 20 54 63 6c 5f 45 76  , interp, Tcl_Ev
154f0 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c 20  alObjEx(interp, 
15500 70 53 63 72 69 70 74 2c 20 30 29 29 3b 0a 20 20  pScript, 0));.  
15510 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20    }.    break;. 
15520 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20   }..  /*.  **   
15530 20 24 64 62 20 75 6e 6c 6f 63 6b 5f 6e 6f 74 69   $db unlock_noti
15540 66 79 20 3f 73 63 72 69 70 74 3f 0a 20 20 2a 2f  fy ?script?.  */
15550 0a 20 20 63 61 73 65 20 44 42 5f 55 4e 4c 4f 43  .  case DB_UNLOC
15560 4b 5f 4e 4f 54 49 46 59 3a 20 7b 0a 23 69 66 6e  K_NOTIFY: {.#ifn
15570 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
15580 45 5f 55 4e 4c 4f 43 4b 5f 4e 4f 54 49 46 59 0a  E_UNLOCK_NOTIFY.
15590 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
155a0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e  sult(interp, "un
155b0 6c 6f 63 6b 5f 6e 6f 74 69 66 79 20 6e 6f 74 20  lock_notify not 
155c0 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 74 68 69  available in thi
155d0 73 20 62 75 69 6c 64 22 2c 20 30 29 3b 0a 20 20  s build", 0);.  
155e0 20 20 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52    rc = TCL_ERROR
155f0 3b 0a 23 65 6c 73 65 0a 20 20 20 20 69 66 28 20  ;.#else.    if( 
15600 6f 62 6a 63 21 3d 32 20 26 26 20 6f 62 6a 63 21  objc!=2 && objc!
15610 3d 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  =3 ){.      Tcl_
15620 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
15630 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f  erp, 2, objv, "?
15640 53 43 52 49 50 54 3f 22 29 3b 0a 20 20 20 20 20  SCRIPT?");.     
15650 20 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b   rc = TCL_ERROR;
15660 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
15670 20 20 76 6f 69 64 20 28 2a 78 4e 6f 74 69 66 79    void (*xNotify
15680 29 28 76 6f 69 64 20 2a 2a 2c 20 69 6e 74 29 20  )(void **, int) 
15690 3d 20 30 3b 0a 20 20 20 20 20 20 76 6f 69 64 20  = 0;.      void 
156a0 2a 70 4e 6f 74 69 66 79 41 72 67 20 3d 20 30 3b  *pNotifyArg = 0;
156b0 0a 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d  ..      if( pDb-
156c0 3e 70 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 20 29  >pUnlockNotify )
156d0 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 44 65  {.        Tcl_De
156e0 63 72 52 65 66 43 6f 75 6e 74 28 70 44 62 2d 3e  crRefCount(pDb->
156f0 70 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 29 3b 0a  pUnlockNotify);.
15700 20 20 20 20 20 20 20 20 70 44 62 2d 3e 70 55 6e          pDb->pUn
15710 6c 6f 63 6b 4e 6f 74 69 66 79 20 3d 20 30 3b 0a  lockNotify = 0;.
15720 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20        }.  .     
15730 20 69 66 28 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a   if( objc==3 ){.
15740 20 20 20 20 20 20 20 20 78 4e 6f 74 69 66 79 20          xNotify 
15750 3d 20 44 62 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79  = DbUnlockNotify
15760 3b 0a 20 20 20 20 20 20 20 20 70 4e 6f 74 69 66  ;.        pNotif
15770 79 41 72 67 20 3d 20 28 76 6f 69 64 20 2a 29 70  yArg = (void *)p
15780 44 62 3b 0a 20 20 20 20 20 20 20 20 70 44 62 2d  Db;.        pDb-
15790 3e 70 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 20 3d  >pUnlockNotify =
157a0 20 6f 62 6a 76 5b 32 5d 3b 0a 20 20 20 20 20 20   objv[2];.      
157b0 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
157c0 6e 74 28 70 44 62 2d 3e 70 55 6e 6c 6f 63 6b 4e  nt(pDb->pUnlockN
157d0 6f 74 69 66 79 29 3b 0a 20 20 20 20 20 20 7d 0a  otify);.      }.
157e0 20 20 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c    .      if( sql
157f0 69 74 65 33 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74 69  ite3_unlock_noti
15800 66 79 28 70 44 62 2d 3e 64 62 2c 20 78 4e 6f 74  fy(pDb->db, xNot
15810 69 66 79 2c 20 70 4e 6f 74 69 66 79 41 72 67 29  ify, pNotifyArg)
15820 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f   ){.        Tcl_
15830 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
15840 65 72 70 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  erp, sqlite3_err
15850 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c 20 30 29  msg(pDb->db), 0)
15860 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 54  ;.        rc = T
15870 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  CL_ERROR;.      
15880 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  }.    }.#endif. 
15890 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
158a0 20 63 61 73 65 20 44 42 5f 50 52 45 55 50 44 41   case DB_PREUPDA
158b0 54 45 3a 20 7b 0a 20 20 20 20 73 74 61 74 69 63  TE: {.    static
158c0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 53   const char *azS
158d0 75 62 5b 5d 20 3d 20 7b 22 63 6f 75 6e 74 22 2c  ub[] = {"count",
158e0 20 22 68 6f 6f 6b 22 2c 20 22 6d 6f 64 69 66 69   "hook", "modifi
158f0 65 64 22 2c 20 22 6f 6c 64 22 2c 20 30 7d 3b 0a  ed", "old", 0};.
15900 20 20 20 20 65 6e 75 6d 20 44 62 50 72 65 75 70      enum DbPreup
15910 64 61 74 65 53 75 62 43 6d 64 20 7b 0a 20 20 20  dateSubCmd {.   
15920 20 20 20 50 52 45 5f 43 4f 55 4e 54 2c 20 50 52     PRE_COUNT, PR
15930 45 5f 48 4f 4f 4b 2c 20 50 52 45 5f 4d 4f 44 49  E_HOOK, PRE_MODI
15940 46 49 45 44 2c 20 50 52 45 5f 4f 4c 44 0a 20 20  FIED, PRE_OLD.  
15950 20 20 7d 3b 0a 20 20 20 20 69 6e 74 20 69 53 75    };.    int iSu
15960 62 3b 0a 0a 20 20 20 20 69 66 28 20 6f 62 6a 63  b;..    if( objc
15970 3c 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  <3 ){.      Tcl_
15980 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
15990 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 53  erp, 2, objv, "S
159a0 55 42 2d 43 4f 4d 4d 41 4e 44 20 3f 41 52 47 53  UB-COMMAND ?ARGS
159b0 3f 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ?");.    }.    i
159c0 66 28 20 54 63 6c 5f 47 65 74 49 6e 64 65 78 46  f( Tcl_GetIndexF
159d0 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
159e0 62 6a 76 5b 32 5d 2c 20 61 7a 53 75 62 2c 20 22  bjv[2], azSub, "
159f0 73 75 62 2d 63 6f 6d 6d 61 6e 64 22 2c 20 30 2c  sub-command", 0,
15a00 20 26 69 53 75 62 29 20 29 7b 0a 20 20 20 20 20   &iSub) ){.     
15a10 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
15a20 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 77  R;.    }..    sw
15a30 69 74 63 68 28 20 28 65 6e 75 6d 20 44 62 50 72  itch( (enum DbPr
15a40 65 75 70 64 61 74 65 53 75 62 43 6d 64 29 69 53  eupdateSubCmd)iS
15a50 75 62 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65  ub ){.      case
15a60 20 50 52 45 5f 43 4f 55 4e 54 3a 20 7b 0a 20 20   PRE_COUNT: {.  
15a70 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c 20 3d        int nCol =
15a80 20 73 71 6c 69 74 65 33 5f 70 72 65 75 70 64 61   sqlite3_preupda
15a90 74 65 5f 63 6f 75 6e 74 28 70 44 62 2d 3e 64 62  te_count(pDb->db
15aa0 29 3b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 53  );.        Tcl_S
15ab0 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
15ac0 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  rp, Tcl_NewIntOb
15ad0 6a 28 6e 43 6f 6c 29 29 3b 0a 20 20 20 20 20 20  j(nCol));.      
15ae0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
15af0 0a 0a 20 20 20 20 20 20 63 61 73 65 20 50 52 45  ..      case PRE
15b00 5f 48 4f 4f 4b 3a 20 7b 0a 20 20 20 20 20 20 20  _HOOK: {.       
15b10 20 69 66 28 20 6f 62 6a 63 3e 34 20 29 7b 0a 20   if( objc>4 ){. 
15b20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 57 72 6f           Tcl_Wro
15b30 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
15b40 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 68 6f 6f 6b  , 2, objv, "hook
15b50 20 3f 53 43 52 49 50 54 3f 22 29 3b 0a 20 20 20   ?SCRIPT?");.   
15b60 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43         return TC
15b70 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20  L_ERROR;.       
15b80 20 7d 0a 20 20 20 20 20 20 20 20 44 62 48 6f 6f   }.        DbHoo
15b90 6b 43 6d 64 28 69 6e 74 65 72 70 2c 20 70 44 62  kCmd(interp, pDb
15ba0 2c 20 28 6f 62 6a 63 3d 3d 34 20 3f 20 6f 62 6a  , (objc==4 ? obj
15bb0 76 5b 33 5d 20 3a 20 30 29 2c 20 26 70 44 62 2d  v[3] : 0), &pDb-
15bc0 3e 70 50 72 65 55 70 64 61 74 65 48 6f 6f 6b 29  >pPreUpdateHook)
15bd0 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
15be0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
15bf0 63 61 73 65 20 50 52 45 5f 4d 4f 44 49 46 49 45  case PRE_MODIFIE
15c00 44 3a 0a 20 20 20 20 20 20 63 61 73 65 20 50 52  D:.      case PR
15c10 45 5f 4f 4c 44 3a 20 7b 0a 20 20 20 20 20 20 20  E_OLD: {.       
15c20 20 69 6e 74 20 69 49 64 78 3b 0a 20 20 20 20 20   int iIdx;.     
15c30 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29     if( objc!=4 )
15c40 7b 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f  {.          Tcl_
15c50 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
15c60 65 72 70 2c 20 33 2c 20 6f 62 6a 76 2c 20 22 49  erp, 3, objv, "I
15c70 4e 44 45 58 22 29 3b 0a 20 20 20 20 20 20 20 20  NDEX");.        
15c80 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
15c90 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  OR;.        }.  
15ca0 20 20 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65        if( Tcl_Ge
15cb0 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
15cc0 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 69 49  rp, objv[3], &iI
15cd0 64 78 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  dx) ){.         
15ce0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
15cf0 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  R;.        }..  
15d00 20 20 20 20 20 20 69 66 28 20 69 53 75 62 3d 3d        if( iSub==
15d10 50 52 45 5f 4d 4f 44 49 46 49 45 44 20 29 7b 0a  PRE_MODIFIED ){.
15d20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 52            int iR
15d30 65 73 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  es;.          rc
15d40 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 75 70   = sqlite3_preup
15d50 64 61 74 65 5f 6d 6f 64 69 66 69 65 64 28 70 44  date_modified(pD
15d60 62 2d 3e 64 62 2c 20 69 49 64 78 2c 20 26 69 52  b->db, iIdx, &iR
15d70 65 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  es);.          i
15d80 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
15d90 20 29 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73   ) Tcl_SetObjRes
15da0 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
15db0 4e 65 77 49 6e 74 4f 62 6a 28 69 52 65 73 29 29  NewIntObj(iRes))
15dc0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
15dd0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
15de0 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 75 65  e3_value *pValue
15df0 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
15e00 72 74 28 20 69 53 75 62 3d 3d 50 52 45 5f 4f 4c  rt( iSub==PRE_OL
15e10 44 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  D );.          r
15e20 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 75  c = sqlite3_preu
15e30 70 64 61 74 65 5f 6f 6c 64 28 70 44 62 2d 3e 64  pdate_old(pDb->d
15e40 62 2c 20 69 49 64 78 2c 20 26 70 56 61 6c 75 65  b, iIdx, &pValue
15e50 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
15e60 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
15e70 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 54 63  {.            Tc
15e80 6c 5f 4f 62 6a 20 2a 70 4f 62 6a 20 3d 20 54 63  l_Obj *pObj = Tc
15e90 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 73  l_NewStringObj(s
15ea0 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
15eb0 74 28 70 56 61 6c 75 65 29 2c 20 2d 31 29 3b 0a  t(pValue), -1);.
15ec0 20 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f              Tcl_
15ed0 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
15ee0 65 72 70 2c 20 70 4f 62 6a 29 3b 0a 20 20 20 20  erp, pObj);.    
15ef0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
15f00 7d 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  }..        if( r
15f10 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
15f20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70            Tcl_Ap
15f30 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
15f40 70 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  p, sqlite3_errms
15f50 67 28 70 44 62 2d 3e 64 62 29 2c 20 30 29 3b 0a  g(pDb->db), 0);.
15f60 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
15f70 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
15f80 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
15f90 20 20 7d 0a 0a 20 20 20 20 62 72 65 61 6b 3b 0a    }..    break;.
15fa0 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20    }..  /*.  **  
15fb0 20 20 24 64 62 20 77 61 6c 5f 68 6f 6f 6b 20 3f    $db wal_hook ?
15fc0 73 63 72 69 70 74 3f 0a 20 20 2a 2a 20 20 20 20  script?.  **    
15fd0 24 64 62 20 75 70 64 61 74 65 5f 68 6f 6f 6b 20  $db update_hook 
15fe0 3f 73 63 72 69 70 74 3f 0a 20 20 2a 2a 20 20 20  ?script?.  **   
15ff0 20 24 64 62 20 72 6f 6c 6c 62 61 63 6b 5f 68 6f   $db rollback_ho
16000 6f 6b 20 3f 73 63 72 69 70 74 3f 0a 20 20 2a 2f  ok ?script?.  */
16010 0a 20 20 63 61 73 65 20 44 42 5f 57 41 4c 5f 48  .  case DB_WAL_H
16020 4f 4f 4b 3a 20 0a 20 20 63 61 73 65 20 44 42 5f  OOK: .  case DB_
16030 55 50 44 41 54 45 5f 48 4f 4f 4b 3a 20 0a 20 20  UPDATE_HOOK: .  
16040 63 61 73 65 20 44 42 5f 52 4f 4c 4c 42 41 43 4b  case DB_ROLLBACK
16050 5f 48 4f 4f 4b 3a 20 7b 0a 20 20 20 20 73 71 6c  _HOOK: {.    sql
16060 69 74 65 33 20 2a 64 62 20 3d 20 70 44 62 2d 3e  ite3 *db = pDb->
16070 64 62 3b 0a 0a 20 20 20 20 2f 2a 20 73 65 74 20  db;..    /* set 
16080 70 70 48 6f 6f 6b 20 74 6f 20 70 6f 69 6e 74 20  ppHook to point 
16090 61 74 20 70 55 70 64 61 74 65 48 6f 6f 6b 20 6f  at pUpdateHook o
160a0 72 20 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 2c  r pRollbackHook,
160b0 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 0a 20   depending on . 
160c0 20 20 20 2a 2a 20 77 68 65 74 68 65 72 20 5b 24     ** whether [$
160d0 64 62 20 75 70 64 61 74 65 5f 68 6f 6f 6b 5d 20  db update_hook] 
160e0 6f 72 20 5b 24 64 62 20 72 6f 6c 6c 62 61 63 6b  or [$db rollback
160f0 5f 68 6f 6f 6b 5d 20 77 61 73 20 69 6e 76 6f 6b  _hook] was invok
16100 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 54  ed..    */.    T
16110 63 6c 5f 4f 62 6a 20 2a 2a 70 70 48 6f 6f 6b 3b  cl_Obj **ppHook;
16120 20 0a 20 20 20 20 69 66 28 20 63 68 6f 69 63 65   .    if( choice
16130 3d 3d 44 42 5f 57 41 4c 5f 48 4f 4f 4b 20 29 20  ==DB_WAL_HOOK ) 
16140 70 70 48 6f 6f 6b 20 3d 20 26 70 44 62 2d 3e 70  ppHook = &pDb->p
16150 57 61 6c 48 6f 6f 6b 3b 0a 20 20 20 20 69 66 28  WalHook;.    if(
16160 20 63 68 6f 69 63 65 3d 3d 44 42 5f 55 50 44 41   choice==DB_UPDA
16170 54 45 5f 48 4f 4f 4b 20 29 20 70 70 48 6f 6f 6b  TE_HOOK ) ppHook
16180 20 3d 20 26 70 44 62 2d 3e 70 55 70 64 61 74 65   = &pDb->pUpdate
16190 48 6f 6f 6b 3b 0a 20 20 20 20 69 66 28 20 63 68  Hook;.    if( ch
161a0 6f 69 63 65 3d 3d 44 42 5f 52 4f 4c 4c 42 41 43  oice==DB_ROLLBAC
161b0 4b 5f 48 4f 4f 4b 20 29 20 70 70 48 6f 6f 6b 20  K_HOOK ) ppHook 
161c0 3d 20 26 70 44 62 2d 3e 70 52 6f 6c 6c 62 61 63  = &pDb->pRollbac
161d0 6b 48 6f 6f 6b 3b 0a 20 20 20 20 69 66 28 20 6f  kHook;.    if( o
161e0 62 6a 63 3e 33 20 29 7b 0a 20 20 20 20 20 20 20  bjc>3 ){.       
161f0 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
16200 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76  (interp, 2, objv
16210 2c 20 22 3f 53 43 52 49 50 54 3f 22 29 3b 0a 20  , "?SCRIPT?");. 
16220 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
16230 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
16240 20 20 20 44 62 48 6f 6f 6b 43 6d 64 28 69 6e 74     DbHookCmd(int
16250 65 72 70 2c 20 70 44 62 2c 20 28 6f 62 6a 63 3d  erp, pDb, (objc=
16260 3d 33 20 3f 20 6f 62 6a 76 5b 32 5d 20 3a 20 30  =3 ? objv[2] : 0
16270 29 2c 20 70 70 48 6f 6f 6b 29 3b 0a 20 20 20 20  ), ppHook);.    
16280 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
16290 20 20 20 20 24 64 62 20 76 65 72 73 69 6f 6e 0a      $db version.
162a0 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e    **.  ** Return
162b0 20 74 68 65 20 76 65 72 73 69 6f 6e 20 73 74 72   the version str
162c0 69 6e 67 20 66 6f 72 20 74 68 69 73 20 64 61 74  ing for this dat
162d0 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 63 61  abase..  */.  ca
162e0 73 65 20 44 42 5f 56 45 52 53 49 4f 4e 3a 20 7b  se DB_VERSION: {
162f0 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75  .    Tcl_SetResu
16300 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72  lt(interp, (char
16310 20 2a 29 73 71 6c 69 74 65 33 5f 6c 69 62 76 65   *)sqlite3_libve
16320 72 73 69 6f 6e 28 29 2c 20 54 43 4c 5f 53 54 41  rsion(), TCL_STA
16330 54 49 43 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b  TIC);.    break;
16340 0a 20 20 7d 0a 0a 0a 20 20 7d 20 2f 2a 20 45 6e  .  }...  } /* En
16350 64 20 6f 66 20 74 68 65 20 53 57 49 54 43 48 20  d of the SWITCH 
16360 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 72  statement */.  r
16370 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
16380 20 53 51 4c 49 54 45 5f 54 43 4c 5f 4e 52 45 0a   SQLITE_TCL_NRE.
16390 2f 2a 0a 2a 2a 20 41 64 61 70 74 6f 72 20 74 68  /*.** Adaptor th
163a0 61 74 20 70 72 6f 76 69 64 65 73 20 61 6e 20 6f  at provides an o
163b0 62 6a 43 6d 64 20 69 6e 74 65 72 66 61 63 65 20  bjCmd interface 
163c0 74 6f 20 74 68 65 20 4e 52 45 2d 65 6e 61 62 6c  to the NRE-enabl
163d0 65 64 0a 2a 2a 20 69 6e 74 65 72 66 61 63 65 20  ed.** interface 
163e0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 0a  implementation..
163f0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 44 62  */.static int Db
16400 4f 62 6a 43 6d 64 41 64 61 70 74 6f 72 28 0a 20  ObjCmdAdaptor(. 
16410 20 76 6f 69 64 20 2a 63 64 2c 0a 20 20 54 63 6c   void *cd,.  Tcl
16420 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
16430 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
16440 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 2a 6f 62  cl_Obj *const*ob
16450 6a 76 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 54  jv.){.  return T
16460 63 6c 5f 4e 52 43 61 6c 6c 4f 62 6a 50 72 6f 63  cl_NRCallObjProc
16470 28 69 6e 74 65 72 70 2c 20 44 62 4f 62 6a 43 6d  (interp, DbObjCm
16480 64 2c 20 63 64 2c 20 6f 62 6a 63 2c 20 6f 62 6a  d, cd, objc, obj
16490 76 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  v);.}.#endif /* 
164a0 53 51 4c 49 54 45 5f 54 43 4c 5f 4e 52 45 20 2a  SQLITE_TCL_NRE *
164b0 2f 0a 0a 2f 2a 0a 2a 2a 20 20 20 73 71 6c 69 74  /../*.**   sqlit
164c0 65 33 20 44 42 4e 41 4d 45 20 46 49 4c 45 4e 41  e3 DBNAME FILENA
164d0 4d 45 20 3f 2d 76 66 73 20 56 46 53 4e 41 4d 45  ME ?-vfs VFSNAME
164e0 3f 20 3f 2d 6b 65 79 20 4b 45 59 3f 20 3f 2d 72  ? ?-key KEY? ?-r
164f0 65 61 64 6f 6e 6c 79 20 42 4f 4f 4c 45 41 4e 3f  eadonly BOOLEAN?
16500 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
16510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3f 2d                ?-
16520 63 72 65 61 74 65 20 42 4f 4f 4c 45 41 4e 3f 20  create BOOLEAN? 
16530 3f 2d 6e 6f 6d 75 74 65 78 20 42 4f 4f 4c 45 41  ?-nomutex BOOLEA
16540 4e 3f 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  N?.**.** This is
16550 20 74 68 65 20 6d 61 69 6e 20 54 63 6c 20 63 6f   the main Tcl co
16560 6d 6d 61 6e 64 2e 20 20 57 68 65 6e 20 74 68 65  mmand.  When the
16570 20 22 73 71 6c 69 74 65 22 20 54 63 6c 20 63 6f   "sqlite" Tcl co
16580 6d 6d 61 6e 64 20 69 73 0a 2a 2a 20 69 6e 76 6f  mmand is.** invo
16590 6b 65 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ked, this routin
165a0 65 20 72 75 6e 73 20 74 6f 20 70 72 6f 63 65 73  e runs to proces
165b0 73 20 74 68 61 74 20 63 6f 6d 6d 61 6e 64 2e 0a  s that command..
165c0 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20  **.** The first 
165d0 61 72 67 75 6d 65 6e 74 2c 20 44 42 4e 41 4d 45  argument, DBNAME
165e0 2c 20 69 73 20 61 6e 20 61 72 62 69 74 72 61 72  , is an arbitrar
165f0 79 20 6e 61 6d 65 20 66 6f 72 20 61 20 6e 65 77  y name for a new
16600 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e  .** database con
16610 6e 65 63 74 69 6f 6e 2e 20 20 54 68 69 73 20 63  nection.  This c
16620 6f 6d 6d 61 6e 64 20 63 72 65 61 74 65 73 20 61  ommand creates a
16630 20 6e 65 77 20 63 6f 6d 6d 61 6e 64 20 6e 61 6d   new command nam
16640 65 64 0a 2a 2a 20 44 42 4e 41 4d 45 20 74 68 61  ed.** DBNAME tha
16650 74 20 69 73 20 75 73 65 64 20 74 6f 20 63 6f 6e  t is used to con
16660 74 72 6f 6c 20 74 68 61 74 20 63 6f 6e 6e 65 63  trol that connec
16670 74 69 6f 6e 2e 20 20 54 68 65 20 64 61 74 61 62  tion.  The datab
16680 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f  ase.** connectio
16690 6e 20 69 73 20 64 65 6c 65 74 65 64 20 77 68 65  n is deleted whe
166a0 6e 20 74 68 65 20 44 42 4e 41 4d 45 20 63 6f 6d  n the DBNAME com
166b0 6d 61 6e 64 20 69 73 20 64 65 6c 65 74 65 64 2e  mand is deleted.
166c0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e  .**.** The secon
166d0 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68  d argument is th
166e0 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  e name of the da
166f0 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a  tabase file..**.
16700 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 44 62  */.static int Db
16710 4d 61 69 6e 28 76 6f 69 64 20 2a 63 64 2c 20 54  Main(void *cd, T
16720 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
16730 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 54 63 6c 5f  p, int objc,Tcl_
16740 4f 62 6a 20 2a 63 6f 6e 73 74 2a 6f 62 6a 76 29  Obj *const*objv)
16750 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 3b  {.  SqliteDb *p;
16760 0a 20 20 76 6f 69 64 20 2a 70 4b 65 79 20 3d 20  .  void *pKey = 
16770 30 3b 0a 20 20 69 6e 74 20 6e 4b 65 79 20 3d 20  0;.  int nKey = 
16780 30 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  0;.  const char 
16790 2a 7a 41 72 67 3b 0a 20 20 63 68 61 72 20 2a 7a  *zArg;.  char *z
167a0 45 72 72 4d 73 67 3b 0a 20 20 69 6e 74 20 69 3b  ErrMsg;.  int i;
167b0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
167c0 46 69 6c 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68  File;.  const ch
167d0 61 72 20 2a 7a 56 66 73 20 3d 20 30 3b 0a 20 20  ar *zVfs = 0;.  
167e0 69 6e 74 20 66 6c 61 67 73 3b 0a 20 20 54 63 6c  int flags;.  Tcl
167f0 5f 44 53 74 72 69 6e 67 20 74 72 61 6e 73 6c 61  _DString transla
16800 74 65 64 46 69 6c 65 6e 61 6d 65 3b 0a 0a 20 20  tedFilename;..  
16810 2f 2a 20 49 6e 20 6e 6f 72 6d 61 6c 20 75 73 65  /* In normal use
16820 2c 20 65 61 63 68 20 54 43 4c 20 69 6e 74 65 72  , each TCL inter
16830 70 72 65 74 65 72 20 72 75 6e 73 20 69 6e 20 61  preter runs in a
16840 20 73 69 6e 67 6c 65 20 74 68 72 65 61 64 2e 20   single thread. 
16850 20 53 6f 0a 20 20 2a 2a 20 62 79 20 64 65 66 61   So.  ** by defa
16860 75 6c 74 2c 20 77 65 20 63 61 6e 20 74 75 72 6e  ult, we can turn
16870 20 6f 66 20 6d 75 74 65 78 69 6e 67 20 6f 6e 20   of mutexing on 
16880 53 51 4c 69 74 65 20 64 61 74 61 62 61 73 65 20  SQLite database 
16890 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 0a 20 20 2a  connections..  *
168a0 2a 20 48 6f 77 65 76 65 72 2c 20 66 6f 72 20 74  * However, for t
168b0 65 73 74 69 6e 67 20 70 75 72 70 6f 73 65 73 20  esting purposes 
168c0 69 74 20 69 73 20 75 73 65 66 75 6c 20 74 6f 20  it is useful to 
168d0 68 61 76 65 20 6d 75 74 65 78 65 73 20 74 75 72  have mutexes tur
168e0 6e 65 64 0a 20 20 2a 2a 20 6f 6e 2e 20 20 53 6f  ned.  ** on.  So
168f0 2c 20 62 79 20 64 65 66 61 75 6c 74 2c 20 6d 75  , by default, mu
16900 74 65 78 65 73 20 64 65 66 61 75 6c 74 20 6f 66  texes default of
16910 66 2e 20 20 42 75 74 20 69 66 20 63 6f 6d 70 69  f.  But if compi
16920 6c 65 64 20 77 69 74 68 0a 20 20 2a 2a 20 53 51  led with.  ** SQ
16930 4c 49 54 45 5f 54 43 4c 5f 44 45 46 41 55 4c 54  LITE_TCL_DEFAULT
16940 5f 46 55 4c 4c 4d 55 54 45 58 20 74 68 65 6e 20  _FULLMUTEX then 
16950 6d 75 74 65 78 65 73 20 64 65 66 61 75 6c 74 20  mutexes default 
16960 6f 6e 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20  on..  */.#ifdef 
16970 53 51 4c 49 54 45 5f 54 43 4c 5f 44 45 46 41 55  SQLITE_TCL_DEFAU
16980 4c 54 5f 46 55 4c 4c 4d 55 54 45 58 0a 20 20 66  LT_FULLMUTEX.  f
16990 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50  lags = SQLITE_OP
169a0 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53  EN_READWRITE | S
169b0 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
169c0 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  E | SQLITE_OPEN_
169d0 46 55 4c 4c 4d 55 54 45 58 3b 0a 23 65 6c 73 65  FULLMUTEX;.#else
169e0 0a 20 20 66 6c 61 67 73 20 3d 20 53 51 4c 49 54  .  flags = SQLIT
169f0 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
16a00 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43   | SQLITE_OPEN_C
16a10 52 45 41 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f  REATE | SQLITE_O
16a20 50 45 4e 5f 4e 4f 4d 55 54 45 58 3b 0a 23 65 6e  PEN_NOMUTEX;.#en
16a30 64 69 66 0a 0a 20 20 69 66 28 20 6f 62 6a 63 3d  dif..  if( objc=
16a40 3d 32 20 29 7b 0a 20 20 20 20 7a 41 72 67 20 3d  =2 ){.    zArg =
16a50 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
16a60 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 30  omObj(objv[1], 0
16a70 29 3b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d  );.    if( strcm
16a80 70 28 7a 41 72 67 2c 22 2d 76 65 72 73 69 6f 6e  p(zArg,"-version
16a90 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 54  ")==0 ){.      T
16aa0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
16ab0 69 6e 74 65 72 70 2c 73 71 6c 69 74 65 33 5f 76  interp,sqlite3_v
16ac0 65 72 73 69 6f 6e 2c 30 29 3b 0a 20 20 20 20 20  ersion,0);.     
16ad0 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
16ae0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 74      }.    if( st
16af0 72 63 6d 70 28 7a 41 72 67 2c 22 2d 68 61 73 2d  rcmp(zArg,"-has-
16b00 63 6f 64 65 63 22 29 3d 3d 30 20 29 7b 0a 23 69  codec")==0 ){.#i
16b10 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f  fdef SQLITE_HAS_
16b20 43 4f 44 45 43 0a 20 20 20 20 20 20 54 63 6c 5f  CODEC.      Tcl_
16b30 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
16b40 65 72 70 2c 22 31 22 2c 30 29 3b 0a 23 65 6c 73  erp,"1",0);.#els
16b50 65 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65  e.      Tcl_Appe
16b60 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
16b70 22 30 22 2c 30 29 3b 0a 23 65 6e 64 69 66 0a 20  "0",0);.#endif. 
16b80 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
16b90 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  OK;.    }.  }.  
16ba0 66 6f 72 28 69 3d 33 3b 20 69 2b 31 3c 6f 62 6a  for(i=3; i+1<obj
16bb0 63 3b 20 69 2b 3d 32 29 7b 0a 20 20 20 20 7a 41  c; i+=2){.    zA
16bc0 72 67 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  rg = Tcl_GetStri
16bd0 6e 67 28 6f 62 6a 76 5b 69 5d 29 3b 0a 20 20 20  ng(objv[i]);.   
16be0 20 69 66 28 20 73 74 72 63 6d 70 28 7a 41 72 67   if( strcmp(zArg
16bf0 2c 22 2d 6b 65 79 22 29 3d 3d 30 20 29 7b 0a 20  ,"-key")==0 ){. 
16c00 20 20 20 20 20 70 4b 65 79 20 3d 20 54 63 6c 5f       pKey = Tcl_
16c10 47 65 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d  GetByteArrayFrom
16c20 4f 62 6a 28 6f 62 6a 76 5b 69 2b 31 5d 2c 20 26  Obj(objv[i+1], &
16c30 6e 4b 65 79 29 3b 0a 20 20 20 20 7d 65 6c 73 65  nKey);.    }else
16c40 20 69 66 28 20 73 74 72 63 6d 70 28 7a 41 72 67   if( strcmp(zArg
16c50 2c 20 22 2d 76 66 73 22 29 3d 3d 30 20 29 7b 0a  , "-vfs")==0 ){.
16c60 20 20 20 20 20 20 7a 56 66 73 20 3d 20 54 63 6c        zVfs = Tcl
16c70 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
16c80 69 2b 31 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65  i+1]);.    }else
16c90 20 69 66 28 20 73 74 72 63 6d 70 28 7a 41 72 67   if( strcmp(zArg
16ca0 2c 20 22 2d 72 65 61 64 6f 6e 6c 79 22 29 3d 3d  , "-readonly")==
16cb0 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 62  0 ){.      int b
16cc0 3b 0a 20 20 20 20 20 20 69 66 28 20 54 63 6c 5f  ;.      if( Tcl_
16cd0 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62  GetBooleanFromOb
16ce0 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 69  j(interp, objv[i
16cf0 2b 31 5d 2c 20 26 62 29 20 29 20 72 65 74 75 72  +1], &b) ) retur
16d00 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
16d10 20 20 20 69 66 28 20 62 20 29 7b 0a 20 20 20 20     if( b ){.    
16d20 20 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 28 53      flags &= ~(S
16d30 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
16d40 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  RITE|SQLITE_OPEN
16d50 5f 43 52 45 41 54 45 29 3b 0a 20 20 20 20 20 20  _CREATE);.      
16d60 20 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54    flags |= SQLIT
16d70 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b  E_OPEN_READONLY;
16d80 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
16d90 20 20 20 20 20 20 66 6c 61 67 73 20 26 3d 20 7e        flags &= ~
16da0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
16db0 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 20 20 66 6c  ONLY;.        fl
16dc0 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50  ags |= SQLITE_OP
16dd0 45 4e 5f 52 45 41 44 57 52 49 54 45 3b 0a 20 20  EN_READWRITE;.  
16de0 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
16df0 69 66 28 20 73 74 72 63 6d 70 28 7a 41 72 67 2c  if( strcmp(zArg,
16e00 20 22 2d 63 72 65 61 74 65 22 29 3d 3d 30 20 29   "-create")==0 )
16e10 7b 0a 20 20 20 20 20 20 69 6e 74 20 62 3b 0a 20  {.      int b;. 
16e20 20 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74       if( Tcl_Get
16e30 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69  BooleanFromObj(i
16e40 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 69 2b 31 5d  nterp, objv[i+1]
16e50 2c 20 26 62 29 20 29 20 72 65 74 75 72 6e 20 54  , &b) ) return T
16e60 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  CL_ERROR;.      
16e70 69 66 28 20 62 20 26 26 20 28 66 6c 61 67 73 20  if( b && (flags 
16e80 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  & SQLITE_OPEN_RE
16e90 41 44 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a 20 20  ADONLY)==0 ){.  
16ea0 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 53        flags |= S
16eb0 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
16ec0 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  E;.      }else{.
16ed0 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 26 3d          flags &=
16ee0 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52   ~SQLITE_OPEN_CR
16ef0 45 41 54 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20  EATE;.      }.  
16f00 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
16f10 6d 70 28 7a 41 72 67 2c 20 22 2d 6e 6f 6d 75 74  mp(zArg, "-nomut
16f20 65 78 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ex")==0 ){.     
16f30 20 69 6e 74 20 62 3b 0a 20 20 20 20 20 20 69 66   int b;.      if
16f40 28 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e  ( Tcl_GetBoolean
16f50 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
16f60 6f 62 6a 76 5b 69 2b 31 5d 2c 20 26 62 29 20 29  objv[i+1], &b) )
16f70 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
16f80 52 3b 0a 20 20 20 20 20 20 69 66 28 20 62 20 29  R;.      if( b )
16f90 7b 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73 20  {.        flags 
16fa0 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e  |= SQLITE_OPEN_N
16fb0 4f 4d 55 54 45 58 3b 0a 20 20 20 20 20 20 20 20  OMUTEX;.        
16fc0 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45  flags &= ~SQLITE
16fd0 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54 45 58 3b  _OPEN_FULLMUTEX;
16fe0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
16ff0 20 20 20 20 20 20 66 6c 61 67 73 20 26 3d 20 7e        flags &= ~
17000 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55  SQLITE_OPEN_NOMU
17010 54 45 58 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  TEX;.      }.   
17020 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
17030 28 7a 41 72 67 2c 20 22 2d 66 75 6c 6c 6d 75 74  (zArg, "-fullmut
17040 65 78 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ex")==0 ){.     
17050 20 69 6e 74 20 62 3b 0a 20 20 20 20 20 20 69 66   int b;.      if
17060 28 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e  ( Tcl_GetBoolean
17070 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
17080 6f 62 6a 76 5b 69 2b 31 5d 2c 20 26 62 29 20 29  objv[i+1], &b) )
17090 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
170a0 52 3b 0a 20 20 20 20 20 20 69 66 28 20 62 20 29  R;.      if( b )
170b0 7b 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73 20  {.        flags 
170c0 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46  |= SQLITE_OPEN_F
170d0 55 4c 4c 4d 55 54 45 58 3b 0a 20 20 20 20 20 20  ULLMUTEX;.      
170e0 20 20 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49    flags &= ~SQLI
170f0 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58 3b  TE_OPEN_NOMUTEX;
17100 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
17110 20 20 20 20 20 20 66 6c 61 67 73 20 26 3d 20 7e        flags &= ~
17120 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c  SQLITE_OPEN_FULL
17130 4d 55 54 45 58 3b 0a 20 20 20 20 20 20 7d 0a 20  MUTEX;.      }. 
17140 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
17150 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
17160 28 69 6e 74 65 72 70 2c 20 22 75 6e 6b 6e 6f 77  (interp, "unknow
17170 6e 20 6f 70 74 69 6f 6e 3a 20 22 2c 20 7a 41 72  n option: ", zAr
17180 67 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  g, (char*)0);.  
17190 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
171a0 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  RROR;.    }.  }.
171b0 20 20 69 66 28 20 6f 62 6a 63 3c 33 20 7c 7c 20    if( objc<3 || 
171c0 28 6f 62 6a 63 26 31 29 21 3d 31 20 29 7b 0a 20  (objc&1)!=1 ){. 
171d0 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
171e0 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
171f0 62 6a 76 2c 20 0a 20 20 20 20 20 20 22 48 41 4e  bjv, .      "HAN
17200 44 4c 45 20 46 49 4c 45 4e 41 4d 45 20 3f 2d 76  DLE FILENAME ?-v
17210 66 73 20 56 46 53 4e 41 4d 45 3f 20 3f 2d 72 65  fs VFSNAME? ?-re
17220 61 64 6f 6e 6c 79 20 42 4f 4f 4c 45 41 4e 3f 20  adonly BOOLEAN? 
17230 3f 2d 63 72 65 61 74 65 20 42 4f 4f 4c 45 41 4e  ?-create BOOLEAN
17240 3f 22 0a 20 20 20 20 20 20 22 20 3f 2d 6e 6f 6d  ?".      " ?-nom
17250 75 74 65 78 20 42 4f 4f 4c 45 41 4e 3f 20 3f 2d  utex BOOLEAN? ?-
17260 66 75 6c 6c 6d 75 74 65 78 20 42 4f 4f 4c 45 41  fullmutex BOOLEA
17270 4e 3f 22 0a 23 69 66 64 65 66 20 53 51 4c 49 54  N?".#ifdef SQLIT
17280 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 20 20  E_HAS_CODEC.    
17290 20 20 22 20 3f 2d 6b 65 79 20 43 4f 44 45 43 4b    " ?-key CODECK
172a0 45 59 3f 22 0a 23 65 6e 64 69 66 0a 20 20 20 20  EY?".#endif.    
172b0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
172c0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a  L_ERROR;.  }.  z
172d0 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 70 20  ErrMsg = 0;.  p 
172e0 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 54 63 6c  = (SqliteDb*)Tcl
172f0 5f 41 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a  _Alloc( sizeof(*
17300 70 29 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30  p) );.  if( p==0
17310 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52   ){.    Tcl_SetR
17320 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 6d  esult(interp, "m
17330 61 6c 6c 6f 63 20 66 61 69 6c 65 64 22 2c 20 54  alloc failed", T
17340 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  CL_STATIC);.    
17350 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
17360 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70  ;.  }.  memset(p
17370 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29  , 0, sizeof(*p))
17380 3b 0a 20 20 7a 46 69 6c 65 20 3d 20 54 63 6c 5f  ;.  zFile = Tcl_
17390 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
173a0 28 6f 62 6a 76 5b 32 5d 2c 20 30 29 3b 0a 20 20  (objv[2], 0);.  
173b0 7a 46 69 6c 65 20 3d 20 54 63 6c 5f 54 72 61 6e  zFile = Tcl_Tran
173c0 73 6c 61 74 65 46 69 6c 65 4e 61 6d 65 28 69 6e  slateFileName(in
173d0 74 65 72 70 2c 20 7a 46 69 6c 65 2c 20 26 74 72  terp, zFile, &tr
173e0 61 6e 73 6c 61 74 65 64 46 69 6c 65 6e 61 6d 65  anslatedFilename
173f0 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6f 70 65  );.  sqlite3_ope
17400 6e 5f 76 32 28 7a 46 69 6c 65 2c 20 26 70 2d 3e  n_v2(zFile, &p->
17410 64 62 2c 20 66 6c 61 67 73 2c 20 7a 56 66 73 29  db, flags, zVfs)
17420 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46  ;.  Tcl_DStringF
17430 72 65 65 28 26 74 72 61 6e 73 6c 61 74 65 64 46  ree(&translatedF
17440 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20  ilename);.  if( 
17450 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74  SQLITE_OK!=sqlit
17460 65 33 5f 65 72 72 63 6f 64 65 28 70 2d 3e 64 62  e3_errcode(p->db
17470 29 20 29 7b 0a 20 20 20 20 7a 45 72 72 4d 73 67  ) ){.    zErrMsg
17480 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
17490 74 66 28 22 25 73 22 2c 20 73 71 6c 69 74 65 33  tf("%s", sqlite3
174a0 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62 29 29 3b  _errmsg(p->db));
174b0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f  .    sqlite3_clo
174c0 73 65 28 70 2d 3e 64 62 29 3b 0a 20 20 20 20 70  se(p->db);.    p
174d0 2d 3e 64 62 20 3d 20 30 3b 0a 20 20 7d 0a 23 69  ->db = 0;.  }.#i
174e0 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f  fdef SQLITE_HAS_
174f0 43 4f 44 45 43 0a 20 20 69 66 28 20 70 2d 3e 64  CODEC.  if( p->d
17500 62 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  b ){.    sqlite3
17510 5f 6b 65 79 28 70 2d 3e 64 62 2c 20 70 4b 65 79  _key(p->db, pKey
17520 2c 20 6e 4b 65 79 29 3b 0a 20 20 7d 0a 23 65 6e  , nKey);.  }.#en
17530 64 69 66 0a 20 20 69 66 28 20 70 2d 3e 64 62 3d  dif.  if( p->db=
17540 3d 30 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65  =0 ){.    Tcl_Se
17550 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  tResult(interp, 
17560 7a 45 72 72 4d 73 67 2c 20 54 43 4c 5f 56 4f 4c  zErrMsg, TCL_VOL
17570 41 54 49 4c 45 29 3b 0a 20 20 20 20 54 63 6c 5f  ATILE);.    Tcl_
17580 46 72 65 65 28 28 63 68 61 72 2a 29 70 29 3b 0a  Free((char*)p);.
17590 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
175a0 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 72  (zErrMsg);.    r
175b0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
175c0 0a 20 20 7d 0a 20 20 70 2d 3e 6d 61 78 53 74 6d  .  }.  p->maxStm
175d0 74 20 3d 20 4e 55 4d 5f 50 52 45 50 41 52 45 44  t = NUM_PREPARED
175e0 5f 53 54 4d 54 53 3b 0a 20 20 70 2d 3e 69 6e 74  _STMTS;.  p->int
175f0 65 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20  erp = interp;.  
17600 7a 41 72 67 20 3d 20 54 63 6c 5f 47 65 74 53 74  zArg = Tcl_GetSt
17610 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
17620 5b 31 5d 2c 20 30 29 3b 0a 20 20 69 66 28 20 44  [1], 0);.  if( D
17630 62 55 73 65 4e 72 65 28 29 20 29 7b 0a 20 20 20  bUseNre() ){.   
17640 20 54 63 6c 5f 4e 52 43 72 65 61 74 65 43 6f 6d   Tcl_NRCreateCom
17650 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 7a 41 72  mand(interp, zAr
17660 67 2c 20 44 62 4f 62 6a 43 6d 64 41 64 61 70 74  g, DbObjCmdAdapt
17670 6f 72 2c 20 44 62 4f 62 6a 43 6d 64 2c 0a 20 20  or, DbObjCmd,.  
17680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17690 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 2c 20        (char*)p, 
176a0 44 62 44 65 6c 65 74 65 43 6d 64 29 3b 0a 20 20  DbDeleteCmd);.  
176b0 7d 65 6c 73 65 7b 0a 20 20 20 20 54 63 6c 5f 43  }else{.    Tcl_C
176c0 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28  reateObjCommand(
176d0 69 6e 74 65 72 70 2c 20 7a 41 72 67 2c 20 44 62  interp, zArg, Db
176e0 4f 62 6a 43 6d 64 2c 20 28 63 68 61 72 2a 29 70  ObjCmd, (char*)p
176f0 2c 20 44 62 44 65 6c 65 74 65 43 6d 64 29 3b 0a  , DbDeleteCmd);.
17700 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c    }.  return TCL
17710 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72  _OK;.}../*.** Pr
17720 6f 76 69 64 65 20 61 20 64 75 6d 6d 79 20 54 63  ovide a dummy Tc
17730 6c 5f 49 6e 69 74 53 74 75 62 73 20 69 66 20 77  l_InitStubs if w
17740 65 20 61 72 65 20 75 73 69 6e 67 20 74 68 69 73  e are using this
17750 20 61 73 20 61 20 73 74 61 74 69 63 0a 2a 2a 20   as a static.** 
17760 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 23 69 66 6e  library..*/.#ifn
17770 64 65 66 20 55 53 45 5f 54 43 4c 5f 53 54 55 42  def USE_TCL_STUB
17780 53 0a 23 20 75 6e 64 65 66 20 20 54 63 6c 5f 49  S.# undef  Tcl_I
17790 6e 69 74 53 74 75 62 73 0a 23 20 64 65 66 69 6e  nitStubs.# defin
177a0 65 20 54 63 6c 5f 49 6e 69 74 53 74 75 62 73 28  e Tcl_InitStubs(
177b0 61 2c 62 2c 63 29 0a 23 65 6e 64 69 66 0a 0a 2f  a,b,c).#endif../
177c0 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 77  *.** Make sure w
177d0 65 20 68 61 76 65 20 61 20 50 41 43 4b 41 47 45  e have a PACKAGE
177e0 5f 56 45 52 53 49 4f 4e 20 6d 61 63 72 6f 20 64  _VERSION macro d
177f0 65 66 69 6e 65 64 2e 20 20 54 68 69 73 20 77 69  efined.  This wi
17800 6c 6c 20 62 65 0a 2a 2a 20 64 65 66 69 6e 65 64  ll be.** defined
17810 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 62   automatically b
17820 79 20 74 68 65 20 54 45 41 20 6d 61 6b 65 66 69  y the TEA makefi
17830 6c 65 2e 20 20 42 75 74 20 6f 74 68 65 72 20 6d  le.  But other m
17840 61 6b 65 66 69 6c 65 73 0a 2a 2a 20 64 6f 20 6e  akefiles.** do n
17850 6f 74 20 64 65 66 69 6e 65 20 69 74 2e 0a 2a 2f  ot define it..*/
17860 0a 23 69 66 6e 64 65 66 20 50 41 43 4b 41 47 45  .#ifndef PACKAGE
17870 5f 56 45 52 53 49 4f 4e 0a 23 20 64 65 66 69 6e  _VERSION.# defin
17880 65 20 50 41 43 4b 41 47 45 5f 56 45 52 53 49 4f  e PACKAGE_VERSIO
17890 4e 20 53 51 4c 49 54 45 5f 56 45 52 53 49 4f 4e  N SQLITE_VERSION
178a0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49  .#endif../*.** I
178b0 6e 69 74 69 61 6c 69 7a 65 20 74 68 69 73 20 6d  nitialize this m
178c0 6f 64 75 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  odule..**.** Thi
178d0 73 20 54 63 6c 20 6d 6f 64 75 6c 65 20 63 6f 6e  s Tcl module con
178e0 74 61 69 6e 73 20 6f 6e 6c 79 20 61 20 73 69 6e  tains only a sin
178f0 67 6c 65 20 6e 65 77 20 54 63 6c 20 63 6f 6d 6d  gle new Tcl comm
17900 61 6e 64 20 6e 61 6d 65 64 20 22 73 71 6c 69 74  and named "sqlit
17910 65 22 2e 0a 2a 2a 20 28 48 65 6e 63 65 20 74 68  e"..** (Hence th
17920 65 72 65 20 69 73 20 6e 6f 20 6e 61 6d 65 73 70  ere is no namesp
17930 61 63 65 2e 20 20 54 68 65 72 65 20 69 73 20 6e  ace.  There is n
17940 6f 20 70 6f 69 6e 74 20 69 6e 20 75 73 69 6e 67  o point in using
17950 20 61 20 6e 61 6d 65 73 70 61 63 65 0a 2a 2a 20   a namespace.** 
17960 69 66 20 74 68 65 20 65 78 74 65 6e 73 69 6f 6e  if the extension
17970 20 6f 6e 6c 79 20 73 75 70 70 6c 69 65 73 20 6f   only supplies o
17980 6e 65 20 6e 65 77 20 6e 61 6d 65 21 29 20 20 54  ne new name!)  T
17990 68 65 20 22 73 71 6c 69 74 65 22 20 63 6f 6d 6d  he "sqlite" comm
179a0 61 6e 64 20 69 73 0a 2a 2a 20 75 73 65 64 20 74  and is.** used t
179b0 6f 20 6f 70 65 6e 20 61 20 6e 65 77 20 53 51 4c  o open a new SQL
179c0 69 74 65 20 64 61 74 61 62 61 73 65 2e 20 20 53  ite database.  S
179d0 65 65 20 74 68 65 20 44 62 4d 61 69 6e 28 29 20  ee the DbMain() 
179e0 72 6f 75 74 69 6e 65 20 61 62 6f 76 65 0a 2a 2a  routine above.**
179f0 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20   for additional 
17a00 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2a 0a  information..**.
17a10 2a 2a 20 54 68 65 20 45 58 54 45 52 4e 20 6d 61  ** The EXTERN ma
17a20 63 72 6f 73 20 61 72 65 20 72 65 71 75 69 72 65  cros are require
17a30 64 20 62 79 20 54 43 4c 20 69 6e 20 6f 72 64 65  d by TCL in orde
17a40 72 20 74 6f 20 77 6f 72 6b 20 6f 6e 20 77 69 6e  r to work on win
17a50 64 6f 77 73 2e 0a 2a 2f 0a 45 58 54 45 52 4e 20  dows..*/.EXTERN 
17a60 69 6e 74 20 53 71 6c 69 74 65 33 5f 49 6e 69 74  int Sqlite3_Init
17a70 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74  (Tcl_Interp *int
17a80 65 72 70 29 7b 0a 20 20 54 63 6c 5f 49 6e 69 74  erp){.  Tcl_Init
17a90 53 74 75 62 73 28 69 6e 74 65 72 70 2c 20 22 38  Stubs(interp, "8
17aa0 2e 34 22 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 43  .4", 0);.  Tcl_C
17ab0 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28  reateObjCommand(
17ac0 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 33  interp, "sqlite3
17ad0 22 2c 20 28 54 63 6c 5f 4f 62 6a 43 6d 64 50 72  ", (Tcl_ObjCmdPr
17ae0 6f 63 2a 29 44 62 4d 61 69 6e 2c 20 30 2c 20 30  oc*)DbMain, 0, 0
17af0 29 3b 0a 20 20 54 63 6c 5f 50 6b 67 50 72 6f 76  );.  Tcl_PkgProv
17b00 69 64 65 28 69 6e 74 65 72 70 2c 20 22 73 71 6c  ide(interp, "sql
17b10 69 74 65 33 22 2c 20 50 41 43 4b 41 47 45 5f 56  ite3", PACKAGE_V
17b20 45 52 53 49 4f 4e 29 3b 0a 0a 23 69 66 6e 64 65  ERSION);..#ifnde
17b30 66 20 53 51 4c 49 54 45 5f 33 5f 53 55 46 46 49  f SQLITE_3_SUFFI
17b40 58 5f 4f 4e 4c 59 0a 20 20 2f 2a 20 54 68 65 20  X_ONLY.  /* The 
17b50 22 73 71 6c 69 74 65 22 20 61 6c 69 61 73 20 69  "sqlite" alias i
17b60 73 20 75 6e 64 6f 63 75 6d 65 6e 74 65 64 2e 20  s undocumented. 
17b70 20 49 74 20 69 73 20 68 65 72 65 20 6f 6e 6c 79   It is here only
17b80 20 74 6f 20 73 75 70 70 6f 72 74 0a 20 20 2a 2a   to support.  **
17b90 20 6c 65 67 61 63 79 20 73 63 72 69 70 74 73 2e   legacy scripts.
17ba0 20 20 41 6c 6c 20 6e 65 77 20 73 63 72 69 70 74    All new script
17bb0 73 20 73 68 6f 75 6c 64 20 75 73 65 20 6f 6e 6c  s should use onl
17bc0 79 20 74 68 65 20 22 73 71 6c 69 74 65 33 22 0a  y the "sqlite3".
17bd0 20 20 2a 2a 20 63 6f 6d 6d 61 6e 64 2e 0a 20 20    ** command..  
17be0 2a 2f 0a 20 20 54 63 6c 5f 43 72 65 61 74 65 4f  */.  Tcl_CreateO
17bf0 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70  bjCommand(interp
17c00 2c 20 22 73 71 6c 69 74 65 22 2c 20 28 54 63 6c  , "sqlite", (Tcl
17c10 5f 4f 62 6a 43 6d 64 50 72 6f 63 2a 29 44 62 4d  _ObjCmdProc*)DbM
17c20 61 69 6e 2c 20 30 2c 20 30 29 3b 0a 23 65 6e 64  ain, 0, 0);.#end
17c30 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  if..  return TCL
17c40 5f 4f 4b 3b 0a 7d 0a 45 58 54 45 52 4e 20 69 6e  _OK;.}.EXTERN in
17c50 74 20 54 63 6c 73 71 6c 69 74 65 33 5f 49 6e 69  t Tclsqlite3_Ini
17c60 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  t(Tcl_Interp *in
17c70 74 65 72 70 29 7b 20 72 65 74 75 72 6e 20 53 71  terp){ return Sq
17c80 6c 69 74 65 33 5f 49 6e 69 74 28 69 6e 74 65 72  lite3_Init(inter
17c90 70 29 3b 20 7d 0a 45 58 54 45 52 4e 20 69 6e 74  p); }.EXTERN int
17ca0 20 53 71 6c 69 74 65 33 5f 53 61 66 65 49 6e 69   Sqlite3_SafeIni
17cb0 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  t(Tcl_Interp *in
17cc0 74 65 72 70 29 7b 20 72 65 74 75 72 6e 20 54 43  terp){ return TC
17cd0 4c 5f 4f 4b 3b 20 7d 0a 45 58 54 45 52 4e 20 69  L_OK; }.EXTERN i
17ce0 6e 74 20 54 63 6c 73 71 6c 69 74 65 33 5f 53 61  nt Tclsqlite3_Sa
17cf0 66 65 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  feInit(Tcl_Inter
17d00 70 20 2a 69 6e 74 65 72 70 29 7b 20 72 65 74 75  p *interp){ retu
17d10 72 6e 20 54 43 4c 5f 4f 4b 3b 20 7d 0a 45 58 54  rn TCL_OK; }.EXT
17d20 45 52 4e 20 69 6e 74 20 53 71 6c 69 74 65 33 5f  ERN int Sqlite3_
17d30 55 6e 6c 6f 61 64 28 54 63 6c 5f 49 6e 74 65 72  Unload(Tcl_Inter
17d40 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 66  p *interp, int f
17d50 6c 61 67 73 29 7b 20 72 65 74 75 72 6e 20 54 43  lags){ return TC
17d60 4c 5f 4f 4b 3b 20 7d 0a 45 58 54 45 52 4e 20 69  L_OK; }.EXTERN i
17d70 6e 74 20 54 63 6c 73 71 6c 69 74 65 33 5f 55 6e  nt Tclsqlite3_Un
17d80 6c 6f 61 64 28 54 63 6c 5f 49 6e 74 65 72 70 20  load(Tcl_Interp 
17d90 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 66 6c 61  *interp, int fla
17da0 67 73 29 7b 20 72 65 74 75 72 6e 20 54 43 4c 5f  gs){ return TCL_
17db0 4f 4b 3b 20 7d 0a 45 58 54 45 52 4e 20 69 6e 74  OK; }.EXTERN int
17dc0 20 53 71 6c 69 74 65 33 5f 53 61 66 65 55 6e 6c   Sqlite3_SafeUnl
17dd0 6f 61 64 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a  oad(Tcl_Interp *
17de0 69 6e 74 65 72 70 2c 20 69 6e 74 20 66 6c 61 67  interp, int flag
17df0 73 29 7b 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  s){ return TCL_O
17e00 4b 3b 20 7d 0a 45 58 54 45 52 4e 20 69 6e 74 20  K; }.EXTERN int 
17e10 54 63 6c 73 71 6c 69 74 65 33 5f 53 61 66 65 55  Tclsqlite3_SafeU
17e20 6e 6c 6f 61 64 28 54 63 6c 5f 49 6e 74 65 72 70  nload(Tcl_Interp
17e30 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 66 6c   *interp, int fl
17e40 61 67 73 29 7b 20 72 65 74 75 72 6e 20 54 43 4c  ags){ return TCL
17e50 5f 4f 4b 3b 7d 0a 0a 0a 23 69 66 6e 64 65 66 20  _OK;}...#ifndef 
17e60 53 51 4c 49 54 45 5f 33 5f 53 55 46 46 49 58 5f  SQLITE_3_SUFFIX_
17e70 4f 4e 4c 59 0a 69 6e 74 20 53 71 6c 69 74 65 5f  ONLY.int Sqlite_
17e80 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20  Init(Tcl_Interp 
17e90 2a 69 6e 74 65 72 70 29 7b 20 72 65 74 75 72 6e  *interp){ return
17ea0 20 53 71 6c 69 74 65 33 5f 49 6e 69 74 28 69 6e   Sqlite3_Init(in
17eb0 74 65 72 70 29 3b 20 7d 0a 69 6e 74 20 54 63 6c  terp); }.int Tcl
17ec0 73 71 6c 69 74 65 5f 49 6e 69 74 28 54 63 6c 5f  sqlite_Init(Tcl_
17ed0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b  Interp *interp){
17ee0 20 72 65 74 75 72 6e 20 53 71 6c 69 74 65 33 5f   return Sqlite3_
17ef0 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 20 7d 0a  Init(interp); }.
17f00 69 6e 74 20 53 71 6c 69 74 65 5f 53 61 66 65 49  int Sqlite_SafeI
17f10 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a  nit(Tcl_Interp *
17f20 69 6e 74 65 72 70 29 7b 20 72 65 74 75 72 6e 20  interp){ return 
17f30 54 43 4c 5f 4f 4b 3b 20 7d 0a 69 6e 74 20 54 63  TCL_OK; }.int Tc
17f40 6c 73 71 6c 69 74 65 5f 53 61 66 65 49 6e 69 74  lsqlite_SafeInit
17f50 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74  (Tcl_Interp *int
17f60 65 72 70 29 7b 20 72 65 74 75 72 6e 20 54 43 4c  erp){ return TCL
17f70 5f 4f 4b 3b 20 7d 0a 69 6e 74 20 53 71 6c 69 74  _OK; }.int Sqlit
17f80 65 5f 55 6e 6c 6f 61 64 28 54 63 6c 5f 49 6e 74  e_Unload(Tcl_Int
17f90 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74  erp *interp, int
17fa0 20 66 6c 61 67 73 29 7b 20 72 65 74 75 72 6e 20   flags){ return 
17fb0 54 43 4c 5f 4f 4b 3b 20 7d 0a 69 6e 74 20 54 63  TCL_OK; }.int Tc
17fc0 6c 73 71 6c 69 74 65 5f 55 6e 6c 6f 61 64 28 54  lsqlite_Unload(T
17fd0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
17fe0 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 20 72  p, int flags){ r
17ff0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 7d 0a  eturn TCL_OK; }.
18000 69 6e 74 20 53 71 6c 69 74 65 5f 53 61 66 65 55  int Sqlite_SafeU
18010 6e 6c 6f 61 64 28 54 63 6c 5f 49 6e 74 65 72 70  nload(Tcl_Interp
18020 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 66 6c   *interp, int fl
18030 61 67 73 29 7b 20 72 65 74 75 72 6e 20 54 43 4c  ags){ return TCL
18040 5f 4f 4b 3b 20 7d 0a 69 6e 74 20 54 63 6c 73 71  _OK; }.int Tclsq
18050 6c 69 74 65 5f 53 61 66 65 55 6e 6c 6f 61 64 28  lite_SafeUnload(
18060 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
18070 72 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 20  rp, int flags){ 
18080 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 7d 0a  return TCL_OK;}.
18090 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 54  #endif..#ifdef T
180a0 43 4c 53 48 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  CLSH./**********
180b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
180c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
180d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
180e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
180f0 2a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 66 20 74 68  ***.** All of th
18100 65 20 63 6f 64 65 20 74 68 61 74 20 66 6f 6c 6c  e code that foll
18110 6f 77 73 20 69 73 20 75 73 65 64 20 74 6f 20 62  ows is used to b
18120 75 69 6c 64 20 73 74 61 6e 64 61 6c 6f 6e 65 20  uild standalone 
18130 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 73  TCL interpreters
18140 0a 2a 2a 20 74 68 61 74 20 61 72 65 20 73 74 61  .** that are sta
18150 74 69 63 61 6c 6c 79 20 6c 69 6e 6b 65 64 20 77  tically linked w
18160 69 74 68 20 53 51 4c 69 74 65 2e 20 20 45 6e 61  ith SQLite.  Ena
18170 62 6c 65 20 74 68 65 73 65 20 62 79 20 63 6f 6d  ble these by com
18180 70 69 6c 69 6e 67 0a 2a 2a 20 77 69 74 68 20 2d  piling.** with -
18190 44 54 43 4c 53 48 3d 6e 20 77 68 65 72 65 20 6e  DTCLSH=n where n
181a0 20 63 61 6e 20 62 65 20 31 20 6f 72 20 32 2e 20   can be 1 or 2. 
181b0 20 41 6e 20 6e 20 6f 66 20 31 20 67 65 6e 65 72   An n of 1 gener
181c0 61 74 65 73 20 61 20 73 74 61 6e 64 61 72 64 0a  ates a standard.
181d0 2a 2a 20 74 63 6c 73 68 20 62 75 74 20 77 69 74  ** tclsh but wit
181e0 68 20 53 51 4c 69 74 65 20 62 75 69 6c 74 20 69  h SQLite built i
181f0 6e 2e 20 20 41 6e 20 6e 20 6f 66 20 32 20 67 65  n.  An n of 2 ge
18200 6e 65 72 61 74 65 73 20 74 68 65 20 53 51 4c 69  nerates the SQLi
18210 74 65 20 73 70 61 63 65 0a 2a 2a 20 61 6e 61 6c  te space.** anal
18220 79 73 69 73 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f  ysis program..*/
18230 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ..#if defined(SQ
18240 4c 49 54 45 5f 54 45 53 54 29 20 7c 7c 20 64 65  LITE_TEST) || de
18250 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 43 4c  fined(SQLITE_TCL
18260 4d 44 35 29 0a 2f 2a 0a 20 2a 20 54 68 69 73 20  MD5)./*. * This 
18270 63 6f 64 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20  code implements 
18280 74 68 65 20 4d 44 35 20 6d 65 73 73 61 67 65 2d  the MD5 message-
18290 64 69 67 65 73 74 20 61 6c 67 6f 72 69 74 68 6d  digest algorithm
182a0 2e 0a 20 2a 20 54 68 65 20 61 6c 67 6f 72 69 74  .. * The algorit
182b0 68 6d 20 69 73 20 64 75 65 20 74 6f 20 52 6f 6e  hm is due to Ron
182c0 20 52 69 76 65 73 74 2e 20 20 54 68 69 73 20 63   Rivest.  This c
182d0 6f 64 65 20 77 61 73 0a 20 2a 20 77 72 69 74 74  ode was. * writt
182e0 65 6e 20 62 79 20 43 6f 6c 69 6e 20 50 6c 75 6d  en by Colin Plum
182f0 62 20 69 6e 20 31 39 39 33 2c 20 6e 6f 20 63 6f  b in 1993, no co
18300 70 79 72 69 67 68 74 20 69 73 20 63 6c 61 69 6d  pyright is claim
18310 65 64 2e 0a 20 2a 20 54 68 69 73 20 63 6f 64 65  ed.. * This code
18320 20 69 73 20 69 6e 20 74 68 65 20 70 75 62 6c 69   is in the publi
18330 63 20 64 6f 6d 61 69 6e 3b 20 64 6f 20 77 69 74  c domain; do wit
18340 68 20 69 74 20 77 68 61 74 20 79 6f 75 20 77 69  h it what you wi
18350 73 68 2e 0a 20 2a 0a 20 2a 20 45 71 75 69 76 61  sh.. *. * Equiva
18360 6c 65 6e 74 20 63 6f 64 65 20 69 73 20 61 76 61  lent code is ava
18370 69 6c 61 62 6c 65 20 66 72 6f 6d 20 52 53 41 20  ilable from RSA 
18380 44 61 74 61 20 53 65 63 75 72 69 74 79 2c 20 49  Data Security, I
18390 6e 63 2e 0a 20 2a 20 54 68 69 73 20 63 6f 64 65  nc.. * This code
183a0 20 68 61 73 20 62 65 65 6e 20 74 65 73 74 65 64   has been tested
183b0 20 61 67 61 69 6e 73 74 20 74 68 61 74 2c 20 61   against that, a
183c0 6e 64 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74  nd is equivalent
183d0 2c 0a 20 2a 20 65 78 63 65 70 74 20 74 68 61 74  ,. * except that
183e0 20 79 6f 75 20 64 6f 6e 27 74 20 6e 65 65 64 20   you don't need 
183f0 74 6f 20 69 6e 63 6c 75 64 65 20 74 77 6f 20 70  to include two p
18400 61 67 65 73 20 6f 66 20 6c 65 67 61 6c 65 73 65  ages of legalese
18410 0a 20 2a 20 77 69 74 68 20 65 76 65 72 79 20 63  . * with every c
18420 6f 70 79 2e 0a 20 2a 0a 20 2a 20 54 6f 20 63 6f  opy.. *. * To co
18430 6d 70 75 74 65 20 74 68 65 20 6d 65 73 73 61 67  mpute the messag
18440 65 20 64 69 67 65 73 74 20 6f 66 20 61 20 63 68  e digest of a ch
18450 75 6e 6b 20 6f 66 20 62 79 74 65 73 2c 20 64 65  unk of bytes, de
18460 63 6c 61 72 65 20 61 6e 0a 20 2a 20 4d 44 35 43  clare an. * MD5C
18470 6f 6e 74 65 78 74 20 73 74 72 75 63 74 75 72 65  ontext structure
18480 2c 20 70 61 73 73 20 69 74 20 74 6f 20 4d 44 35  , pass it to MD5
18490 49 6e 69 74 2c 20 63 61 6c 6c 20 4d 44 35 55 70  Init, call MD5Up
184a0 64 61 74 65 20 61 73 0a 20 2a 20 6e 65 65 64 65  date as. * neede
184b0 64 20 6f 6e 20 62 75 66 66 65 72 73 20 66 75 6c  d on buffers ful
184c0 6c 20 6f 66 20 62 79 74 65 73 2c 20 61 6e 64 20  l of bytes, and 
184d0 74 68 65 6e 20 63 61 6c 6c 20 4d 44 35 46 69 6e  then call MD5Fin
184e0 61 6c 2c 20 77 68 69 63 68 0a 20 2a 20 77 69 6c  al, which. * wil
184f0 6c 20 66 69 6c 6c 20 61 20 73 75 70 70 6c 69 65  l fill a supplie
18500 64 20 31 36 2d 62 79 74 65 20 61 72 72 61 79 20  d 16-byte array 
18510 77 69 74 68 20 74 68 65 20 64 69 67 65 73 74 2e  with the digest.
18520 0a 20 2a 2f 0a 0a 2f 2a 0a 20 2a 20 49 66 20 63  . */../*. * If c
18530 6f 6d 70 69 6c 65 64 20 6f 6e 20 61 20 6d 61 63  ompiled on a mac
18540 68 69 6e 65 20 74 68 61 74 20 64 6f 65 73 6e 27  hine that doesn'
18550 74 20 68 61 76 65 20 61 20 33 32 2d 62 69 74 20  t have a 32-bit 
18560 69 6e 74 65 67 65 72 2c 0a 20 2a 20 79 6f 75 20  integer,. * you 
18570 6a 75 73 74 20 73 65 74 20 22 75 69 6e 74 33 32  just set "uint32
18580 22 20 74 6f 20 74 68 65 20 61 70 70 72 6f 70 72  " to the appropr
18590 69 61 74 65 20 64 61 74 61 74 79 70 65 20 66 6f  iate datatype fo
185a0 72 20 61 6e 0a 20 2a 20 75 6e 73 69 67 6e 65 64  r an. * unsigned
185b0 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 2e   32-bit integer.
185c0 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 20    For example:. 
185d0 2a 0a 20 2a 20 20 20 20 20 20 20 63 63 20 2d 44  *. *       cc -D
185e0 75 69 6e 74 33 32 3d 27 75 6e 73 69 67 6e 65 64  uint32='unsigned
185f0 20 6c 6f 6e 67 27 20 6d 64 35 2e 63 0a 20 2a 0a   long' md5.c. *.
18600 20 2a 2f 0a 23 69 66 6e 64 65 66 20 75 69 6e 74   */.#ifndef uint
18610 33 32 0a 23 20 20 64 65 66 69 6e 65 20 75 69 6e  32.#  define uin
18620 74 33 32 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  t32 unsigned int
18630 0a 23 65 6e 64 69 66 0a 0a 73 74 72 75 63 74 20  .#endif..struct 
18640 4d 44 35 43 6f 6e 74 65 78 74 20 7b 0a 20 20 69  MD5Context {.  i
18650 6e 74 20 69 73 49 6e 69 74 3b 0a 20 20 75 69 6e  nt isInit;.  uin
18660 74 33 32 20 62 75 66 5b 34 5d 3b 0a 20 20 75 69  t32 buf[4];.  ui
18670 6e 74 33 32 20 62 69 74 73 5b 32 5d 3b 0a 20 20  nt32 bits[2];.  
18680 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 69 6e  unsigned char in
18690 5b 36 34 5d 3b 0a 7d 3b 0a 74 79 70 65 64 65 66  [64];.};.typedef
186a0 20 73 74 72 75 63 74 20 4d 44 35 43 6f 6e 74 65   struct MD5Conte
186b0 78 74 20 4d 44 35 43 6f 6e 74 65 78 74 3b 0a 0a  xt MD5Context;..
186c0 2f 2a 0a 20 2a 20 4e 6f 74 65 3a 20 74 68 69 73  /*. * Note: this
186d0 20 63 6f 64 65 20 69 73 20 68 61 72 6d 6c 65 73   code is harmles
186e0 73 20 6f 6e 20 6c 69 74 74 6c 65 2d 65 6e 64 69  s on little-endi
186f0 61 6e 20 6d 61 63 68 69 6e 65 73 2e 0a 20 2a 2f  an machines.. */
18700 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 79 74  .static void byt
18710 65 52 65 76 65 72 73 65 20 28 75 6e 73 69 67 6e  eReverse (unsign
18720 65 64 20 63 68 61 72 20 2a 62 75 66 2c 20 75 6e  ed char *buf, un
18730 73 69 67 6e 65 64 20 6c 6f 6e 67 73 29 7b 0a 20  signed longs){. 
18740 20 20 20 20 20 20 20 75 69 6e 74 33 32 20 74 3b         uint32 t;
18750 0a 20 20 20 20 20 20 20 20 64 6f 20 7b 0a 20 20  .        do {.  
18760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 20                t 
18770 3d 20 28 75 69 6e 74 33 32 29 28 28 75 6e 73 69  = (uint32)((unsi
18780 67 6e 65 64 29 62 75 66 5b 33 5d 3c 3c 38 20 7c  gned)buf[3]<<8 |
18790 20 62 75 66 5b 32 5d 29 20 3c 3c 20 31 36 20 7c   buf[2]) << 16 |
187a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
187b0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 28 75               ((u
187c0 6e 73 69 67 6e 65 64 29 62 75 66 5b 31 5d 3c 3c  nsigned)buf[1]<<
187d0 38 20 7c 20 62 75 66 5b 30 5d 29 3b 0a 20 20 20  8 | buf[0]);.   
187e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 28 75               *(u
187f0 69 6e 74 33 32 20 2a 29 62 75 66 20 3d 20 74 3b  int32 *)buf = t;
18800 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
18810 20 62 75 66 20 2b 3d 20 34 3b 0a 20 20 20 20 20   buf += 4;.     
18820 20 20 20 7d 20 77 68 69 6c 65 20 28 2d 2d 6c 6f     } while (--lo
18830 6e 67 73 29 3b 0a 7d 0a 2f 2a 20 54 68 65 20 66  ngs);.}./* The f
18840 6f 75 72 20 63 6f 72 65 20 66 75 6e 63 74 69 6f  our core functio
18850 6e 73 20 2d 20 46 31 20 69 73 20 6f 70 74 69 6d  ns - F1 is optim
18860 69 7a 65 64 20 73 6f 6d 65 77 68 61 74 20 2a 2f  ized somewhat */
18870 0a 0a 2f 2a 20 23 64 65 66 69 6e 65 20 46 31 28  ../* #define F1(
18880 78 2c 20 79 2c 20 7a 29 20 28 78 20 26 20 79 20  x, y, z) (x & y 
18890 7c 20 7e 78 20 26 20 7a 29 20 2a 2f 0a 23 64 65  | ~x & z) */.#de
188a0 66 69 6e 65 20 46 31 28 78 2c 20 79 2c 20 7a 29  fine F1(x, y, z)
188b0 20 28 7a 20 5e 20 28 78 20 26 20 28 79 20 5e 20   (z ^ (x & (y ^ 
188c0 7a 29 29 29 0a 23 64 65 66 69 6e 65 20 46 32 28  z))).#define F2(
188d0 78 2c 20 79 2c 20 7a 29 20 46 31 28 7a 2c 20 78  x, y, z) F1(z, x
188e0 2c 20 79 29 0a 23 64 65 66 69 6e 65 20 46 33 28  , y).#define F3(
188f0 78 2c 20 79 2c 20 7a 29 20 28 78 20 5e 20 79 20  x, y, z) (x ^ y 
18900 5e 20 7a 29 0a 23 64 65 66 69 6e 65 20 46 34 28  ^ z).#define F4(
18910 78 2c 20 79 2c 20 7a 29 20 28 79 20 5e 20 28 78  x, y, z) (y ^ (x
18920 20 7c 20 7e 7a 29 29 0a 0a 2f 2a 20 54 68 69 73   | ~z))../* This
18930 20 69 73 20 74 68 65 20 63 65 6e 74 72 61 6c 20   is the central 
18940 73 74 65 70 20 69 6e 20 74 68 65 20 4d 44 35 20  step in the MD5 
18950 61 6c 67 6f 72 69 74 68 6d 2e 20 2a 2f 0a 23 64  algorithm. */.#d
18960 65 66 69 6e 65 20 4d 44 35 53 54 45 50 28 66 2c  efine MD5STEP(f,
18970 20 77 2c 20 78 2c 20 79 2c 20 7a 2c 20 64 61 74   w, x, y, z, dat
18980 61 2c 20 73 29 20 5c 0a 20 20 20 20 20 20 20 20  a, s) \.        
18990 28 20 77 20 2b 3d 20 66 28 78 2c 20 79 2c 20 7a  ( w += f(x, y, z
189a0 29 20 2b 20 64 61 74 61 2c 20 20 77 20 3d 20 77  ) + data,  w = w
189b0 3c 3c 73 20 7c 20 77 3e 3e 28 33 32 2d 73 29 2c  <<s | w>>(32-s),
189c0 20 20 77 20 2b 3d 20 78 20 29 0a 0a 2f 2a 0a 20    w += x )../*. 
189d0 2a 20 54 68 65 20 63 6f 72 65 20 6f 66 20 74 68  * The core of th
189e0 65 20 4d 44 35 20 61 6c 67 6f 72 69 74 68 6d 2c  e MD5 algorithm,
189f0 20 74 68 69 73 20 61 6c 74 65 72 73 20 61 6e 20   this alters an 
18a00 65 78 69 73 74 69 6e 67 20 4d 44 35 20 68 61 73  existing MD5 has
18a10 68 20 74 6f 0a 20 2a 20 72 65 66 6c 65 63 74 20  h to. * reflect 
18a20 74 68 65 20 61 64 64 69 74 69 6f 6e 20 6f 66 20  the addition of 
18a30 31 36 20 6c 6f 6e 67 77 6f 72 64 73 20 6f 66 20  16 longwords of 
18a40 6e 65 77 20 64 61 74 61 2e 20 20 4d 44 35 55 70  new data.  MD5Up
18a50 64 61 74 65 20 62 6c 6f 63 6b 73 0a 20 2a 20 74  date blocks. * t
18a60 68 65 20 64 61 74 61 20 61 6e 64 20 63 6f 6e 76  he data and conv
18a70 65 72 74 73 20 62 79 74 65 73 20 69 6e 74 6f 20  erts bytes into 
18a80 6c 6f 6e 67 77 6f 72 64 73 20 66 6f 72 20 74 68  longwords for th
18a90 69 73 20 72 6f 75 74 69 6e 65 2e 0a 20 2a 2f 0a  is routine.. */.
18aa0 73 74 61 74 69 63 20 76 6f 69 64 20 4d 44 35 54  static void MD5T
18ab0 72 61 6e 73 66 6f 72 6d 28 75 69 6e 74 33 32 20  ransform(uint32 
18ac0 62 75 66 5b 34 5d 2c 20 63 6f 6e 73 74 20 75 69  buf[4], const ui
18ad0 6e 74 33 32 20 69 6e 5b 31 36 5d 29 7b 0a 20 20  nt32 in[16]){.  
18ae0 20 20 20 20 20 20 72 65 67 69 73 74 65 72 20 75        register u
18af0 69 6e 74 33 32 20 61 2c 20 62 2c 20 63 2c 20 64  int32 a, b, c, d
18b00 3b 0a 0a 20 20 20 20 20 20 20 20 61 20 3d 20 62  ;..        a = b
18b10 75 66 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20 62  uf[0];.        b
18b20 20 3d 20 62 75 66 5b 31 5d 3b 0a 20 20 20 20 20   = buf[1];.     
18b30 20 20 20 63 20 3d 20 62 75 66 5b 32 5d 3b 0a 20     c = buf[2];. 
18b40 20 20 20 20 20 20 20 64 20 3d 20 62 75 66 5b 33         d = buf[3
18b50 5d 3b 0a 0a 20 20 20 20 20 20 20 20 4d 44 35 53  ];..        MD5S
18b60 54 45 50 28 46 31 2c 20 61 2c 20 62 2c 20 63 2c  TEP(F1, a, b, c,
18b70 20 64 2c 20 69 6e 5b 20 30 5d 2b 30 78 64 37 36   d, in[ 0]+0xd76
18b80 61 61 34 37 38 2c 20 20 37 29 3b 0a 20 20 20 20  aa478,  7);.    
18b90 20 20 20 20 4d 44 35 53 54 45 50 28 46 31 2c 20      MD5STEP(F1, 
18ba0 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e 5b 20  d, a, b, c, in[ 
18bb0 31 5d 2b 30 78 65 38 63 37 62 37 35 36 2c 20 31  1]+0xe8c7b756, 1
18bc0 32 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53  2);.        MD5S
18bd0 54 45 50 28 46 31 2c 20 63 2c 20 64 2c 20 61 2c  TEP(F1, c, d, a,
18be0 20 62 2c 20 69 6e 5b 20 32 5d 2b 30 78 32 34 32   b, in[ 2]+0x242
18bf0 30 37 30 64 62 2c 20 31 37 29 3b 0a 20 20 20 20  070db, 17);.    
18c00 20 20 20 20 4d 44 35 53 54 45 50 28 46 31 2c 20      MD5STEP(F1, 
18c10 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e 5b 20  b, c, d, a, in[ 
18c20 33 5d 2b 30 78 63 31 62 64 63 65 65 65 2c 20 32  3]+0xc1bdceee, 2
18c30 32 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53  2);.        MD5S
18c40 54 45 50 28 46 31 2c 20 61 2c 20 62 2c 20 63 2c  TEP(F1, a, b, c,
18c50 20 64 2c 20 69 6e 5b 20 34 5d 2b 30 78 66 35 37   d, in[ 4]+0xf57
18c60 63 30 66 61 66 2c 20 20 37 29 3b 0a 20 20 20 20  c0faf,  7);.    
18c70 20 20 20 20 4d 44 35 53 54 45 50 28 46 31 2c 20      MD5STEP(F1, 
18c80 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e 5b 20  d, a, b, c, in[ 
18c90 35 5d 2b 30 78 34 37 38 37 63 36 32 61 2c 20 31  5]+0x4787c62a, 1
18ca0 32 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53  2);.        MD5S
18cb0 54 45 50 28 46 31 2c 20 63 2c 20 64 2c 20 61 2c  TEP(F1, c, d, a,
18cc0 20 62 2c 20 69 6e 5b 20 36 5d 2b 30 78 61 38 33   b, in[ 6]+0xa83
18cd0 30 34 36 31 33 2c 20 31 37 29 3b 0a 20 20 20 20  04613, 17);.    
18ce0 20 20 20 20 4d 44 35 53 54 45 50 28 46 31 2c 20      MD5STEP(F1, 
18cf0 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e 5b 20  b, c, d, a, in[ 
18d00 37 5d 2b 30 78 66 64 34 36 39 35 30 31 2c 20 32  7]+0xfd469501, 2
18d10 32 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53  2);.        MD5S
18d20 54 45 50 28 46 31 2c 20 61 2c 20 62 2c 20 63 2c  TEP(F1, a, b, c,
18d30 20 64 2c 20 69 6e 5b 20 38 5d 2b 30 78 36 39 38   d, in[ 8]+0x698
18d40 30 39 38 64 38 2c 20 20 37 29 3b 0a 20 20 20 20  098d8,  7);.    
18d50 20 20 20 20 4d 44 35 53 54 45 50 28 46 31 2c 20      MD5STEP(F1, 
18d60 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e 5b 20  d, a, b, c, in[ 
18d70 39 5d 2b 30 78 38 62 34 34 66 37 61 66 2c 20 31  9]+0x8b44f7af, 1
18d80 32 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53  2);.        MD5S
18d90 54 45 50 28 46 31 2c 20 63 2c 20 64 2c 20 61 2c  TEP(F1, c, d, a,
18da0 20 62 2c 20 69 6e 5b 31 30 5d 2b 30 78 66 66 66   b, in[10]+0xfff
18db0 66 35 62 62 31 2c 20 31 37 29 3b 0a 20 20 20 20  f5bb1, 17);.    
18dc0 20 20 20 20 4d 44 35 53 54 45 50 28 46 31 2c 20      MD5STEP(F1, 
18dd0 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e 5b 31  b, c, d, a, in[1
18de0 31 5d 2b 30 78 38 39 35 63 64 37 62 65 2c 20 32  1]+0x895cd7be, 2
18df0 32 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53  2);.        MD5S
18e00 54 45 50 28 46 31 2c 20 61 2c 20 62 2c 20 63 2c  TEP(F1, a, b, c,
18e10 20 64 2c 20 69 6e 5b 31 32 5d 2b 30 78 36 62 39   d, in[12]+0x6b9
18e20 30 31 31 32 32 2c 20 20 37 29 3b 0a 20 20 20 20  01122,  7);.    
18e30 20 20 20 20 4d 44 35 53 54 45 50 28 46 31 2c 20      MD5STEP(F1, 
18e40 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e 5b 31  d, a, b, c, in[1
18e50 33 5d 2b 30 78 66 64 39 38 37 31 39 33 2c 20 31  3]+0xfd987193, 1
18e60 32 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53  2);.        MD5S
18e70 54 45 50 28 46 31 2c 20 63 2c 20 64 2c 20 61 2c  TEP(F1, c, d, a,
18e80 20 62 2c 20 69 6e 5b 31 34 5d 2b 30 78 61 36 37   b, in[14]+0xa67
18e90 39 34 33 38 65 2c 20 31 37 29 3b 0a 20 20 20 20  9438e, 17);.    
18ea0 20 20 20 20 4d 44 35 53 54 45 50 28 46 31 2c 20      MD5STEP(F1, 
18eb0 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e 5b 31  b, c, d, a, in[1
18ec0 35 5d 2b 30 78 34 39 62 34 30 38 32 31 2c 20 32  5]+0x49b40821, 2
18ed0 32 29 3b 0a 0a 20 20 20 20 20 20 20 20 4d 44 35  2);..        MD5
18ee0 53 54 45 50 28 46 32 2c 20 61 2c 20 62 2c 20 63  STEP(F2, a, b, c
18ef0 2c 20 64 2c 20 69 6e 5b 20 31 5d 2b 30 78 66 36  , d, in[ 1]+0xf6
18f00 31 65 32 35 36 32 2c 20 20 35 29 3b 0a 20 20 20  1e2562,  5);.   
18f10 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 32 2c       MD5STEP(F2,
18f20 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e 5b   d, a, b, c, in[
18f30 20 36 5d 2b 30 78 63 30 34 30 62 33 34 30 2c 20   6]+0xc040b340, 
18f40 20 39 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35   9);.        MD5
18f50 53 54 45 50 28 46 32 2c 20 63 2c 20 64 2c 20 61  STEP(F2, c, d, a
18f60 2c 20 62 2c 20 69 6e 5b 31 31 5d 2b 30 78 32 36  , b, in[11]+0x26
18f70 35 65 35 61 35 31 2c 20 31 34 29 3b 0a 20 20 20  5e5a51, 14);.   
18f80 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 32 2c       MD5STEP(F2,
18f90 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e 5b   b, c, d, a, in[
18fa0 20 30 5d 2b 30 78 65 39 62 36 63 37 61 61 2c 20   0]+0xe9b6c7aa, 
18fb0 32 30 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35  20);.        MD5
18fc0 53 54 45 50 28 46 32 2c 20 61 2c 20 62 2c 20 63  STEP(F2, a, b, c
18fd0 2c 20 64 2c 20 69 6e 5b 20 35 5d 2b 30 78 64 36  , d, in[ 5]+0xd6
18fe0 32 66 31 30 35 64 2c 20 20 35 29 3b 0a 20 20 20  2f105d,  5);.   
18ff0 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 32 2c       MD5STEP(F2,
19000 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e 5b   d, a, b, c, in[
19010 31 30 5d 2b 30 78 30 32 34 34 31 34 35 33 2c 20  10]+0x02441453, 
19020 20 39 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35   9);.        MD5
19030 53 54 45 50 28 46 32 2c 20 63 2c 20 64 2c 20 61  STEP(F2, c, d, a
19040 2c 20 62 2c 20 69 6e 5b 31 35 5d 2b 30 78 64 38  , b, in[15]+0xd8
19050 61 31 65 36 38 31 2c 20 31 34 29 3b 0a 20 20 20  a1e681, 14);.   
19060 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 32 2c       MD5STEP(F2,
19070 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e 5b   b, c, d, a, in[
19080 20 34 5d 2b 30 78 65 37 64 33 66 62 63 38 2c 20   4]+0xe7d3fbc8, 
19090 32 30 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35  20);.        MD5
190a0 53 54 45 50 28 46 32 2c 20 61 2c 20 62 2c 20 63  STEP(F2, a, b, c
190b0 2c 20 64 2c 20 69 6e 5b 20 39 5d 2b 30 78 32 31  , d, in[ 9]+0x21
190c0 65 31 63 64 65 36 2c 20 20 35 29 3b 0a 20 20 20  e1cde6,  5);.   
190d0 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 32 2c       MD5STEP(F2,
190e0 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e 5b   d, a, b, c, in[
190f0 31 34 5d 2b 30 78 63 33 33 37 30 37 64 36 2c 20  14]+0xc33707d6, 
19100 20 39 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35   9);.        MD5
19110 53 54 45 50 28 46 32 2c 20 63 2c 20 64 2c 20 61  STEP(F2, c, d, a
19120 2c 20 62 2c 20 69 6e 5b 20 33 5d 2b 30 78 66 34  , b, in[ 3]+0xf4
19130 64 35 30 64 38 37 2c 20 31 34 29 3b 0a 20 20 20  d50d87, 14);.   
19140 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 32 2c       MD5STEP(F2,
19150 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e 5b   b, c, d, a, in[
19160 20 38 5d 2b 30 78 34 35 35 61 31 34 65 64 2c 20   8]+0x455a14ed, 
19170 32 30 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35  20);.        MD5
19180 53 54 45 50 28 46 32 2c 20 61 2c 20 62 2c 20 63  STEP(F2, a, b, c
19190 2c 20 64 2c 20 69 6e 5b 31 33 5d 2b 30 78 61 39  , d, in[13]+0xa9
191a0 65 33 65 39 30 35 2c 20 20 35 29 3b 0a 20 20 20  e3e905,  5);.   
191b0 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 32 2c       MD5STEP(F2,
191c0 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e 5b   d, a, b, c, in[
191d0 20 32 5d 2b 30 78 66 63 65 66 61 33 66 38 2c 20   2]+0xfcefa3f8, 
191e0 20 39 29 3b 0a 20 20 20 20 20 20 20 20 4d 44 35   9);.        MD5
191f0 53 54 45 50 28 46 32 2c 20 63 2c 20 64 2c 20 61  STEP(F2, c, d, a
19200 2c 20 62 2c 20 69 6e 5b 20 37 5d 2b 30 78 36 37  , b, in[ 7]+0x67
19210 36 66 30 32 64 39 2c 20 31 34 29 3b 0a 20 20 20  6f02d9, 14);.   
19220 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 32 2c       MD5STEP(F2,
19230 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e 5b   b, c, d, a, in[
19240 31 32 5d 2b 30 78 38 64 32 61 34 63 38 61 2c 20  12]+0x8d2a4c8a, 
19250 32 30 29 3b 0a 0a 20 20 20 20 20 20 20 20 4d 44  20);..        MD
19260 35 53 54 45 50 28 46 33 2c 20 61 2c 20 62 2c 20  5STEP(F3, a, b, 
19270 63 2c 20 64 2c 20 69 6e 5b 20 35 5d 2b 30 78 66  c, d, in[ 5]+0xf
19280 66 66 61 33 39 34 32 2c 20 20 34 29 3b 0a 20 20  ffa3942,  4);.  
19290 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 33        MD5STEP(F3
192a0 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e  , d, a, b, c, in
192b0 5b 20 38 5d 2b 30 78 38 37 37 31 66 36 38 31 2c  [ 8]+0x8771f681,
192c0 20 31 31 29 3b 0a 20 20 20 20 20 20 20 20 4d 44   11);.        MD
192d0 35 53 54 45 50 28 46 33 2c 20 63 2c 20 64 2c 20  5STEP(F3, c, d, 
192e0 61 2c 20 62 2c 20 69 6e 5b 31 31 5d 2b 30 78 36  a, b, in[11]+0x6
192f0 64 39 64 36 31 32 32 2c 20 31 36 29 3b 0a 20 20  d9d6122, 16);.  
19300 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 33        MD5STEP(F3
19310 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e  , b, c, d, a, in
19320 5b 31 34 5d 2b 30 78 66 64 65 35 33 38 30 63 2c  [14]+0xfde5380c,
19330 20 32 33 29 3b 0a 20 20 20 20 20 20 20 20 4d 44   23);.        MD
19340 35 53 54 45 50 28 46 33 2c 20 61 2c 20 62 2c 20  5STEP(F3, a, b, 
19350 63 2c 20 64 2c 20 69 6e 5b 20 31 5d 2b 30 78 61  c, d, in[ 1]+0xa
19360 34 62 65 65 61 34 34 2c 20 20 34 29 3b 0a 20 20  4beea44,  4);.  
19370 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 33        MD5STEP(F3
19380 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e  , d, a, b, c, in
19390 5b 20 34 5d 2b 30 78 34 62 64 65 63 66 61 39 2c  [ 4]+0x4bdecfa9,
193a0 20 31 31 29 3b 0a 20 20 20 20 20 20 20 20 4d 44   11);.        MD
193b0 35 53 54 45 50 28 46 33 2c 20 63 2c 20 64 2c 20  5STEP(F3, c, d, 
193c0 61 2c 20 62 2c 20 69 6e 5b 20 37 5d 2b 30 78 66  a, b, in[ 7]+0xf
193d0 36 62 62 34 62 36 30 2c 20 31 36 29 3b 0a 20 20  6bb4b60, 16);.  
193e0 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 33        MD5STEP(F3
193f0 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e  , b, c, d, a, in
19400 5b 31 30 5d 2b 30 78 62 65 62 66 62 63 37 30 2c  [10]+0xbebfbc70,
19410 20 32 33 29 3b 0a 20 20 20 20 20 20 20 20 4d 44   23);.        MD
19420 35 53 54 45 50 28 46 33 2c 20 61 2c 20 62 2c 20  5STEP(F3, a, b, 
19430 63 2c 20 64 2c 20 69 6e 5b 31 33 5d 2b 30 78 32  c, d, in[13]+0x2
19440 38 39 62 37 65 63 36 2c 20 20 34 29 3b 0a 20 20  89b7ec6,  4);.  
19450 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 33        MD5STEP(F3
19460 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e  , d, a, b, c, in
19470 5b 20 30 5d 2b 30 78 65 61 61 31 32 37 66 61 2c  [ 0]+0xeaa127fa,
19480 20 31 31 29 3b 0a 20 20 20 20 20 20 20 20 4d 44   11);.        MD
19490 35 53 54 45 50 28 46 33 2c 20 63 2c 20 64 2c 20  5STEP(F3, c, d, 
194a0 61 2c 20 62 2c 20 69 6e 5b 20 33 5d 2b 30 78 64  a, b, in[ 3]+0xd
194b0 34 65 66 33 30 38 35 2c 20 31 36 29 3b 0a 20 20  4ef3085, 16);.  
194c0 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 33        MD5STEP(F3
194d0 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e  , b, c, d, a, in
194e0 5b 20 36 5d 2b 30 78 30 34 38 38 31 64 30 35 2c  [ 6]+0x04881d05,
194f0 20 32 33 29 3b 0a 20 20 20 20 20 20 20 20 4d 44   23);.        MD
19500 35 53 54 45 50 28 46 33 2c 20 61 2c 20 62 2c 20  5STEP(F3, a, b, 
19510 63 2c 20 64 2c 20 69 6e 5b 20 39 5d 2b 30 78 64  c, d, in[ 9]+0xd
19520 39 64 34 64 30 33 39 2c 20 20 34 29 3b 0a 20 20  9d4d039,  4);.  
19530 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 33        MD5STEP(F3
19540 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e  , d, a, b, c, in
19550 5b 31 32 5d 2b 30 78 65 36 64 62 39 39 65 35 2c  [12]+0xe6db99e5,
19560 20 31 31 29 3b 0a 20 20 20 20 20 20 20 20 4d 44   11);.        MD
19570 35 53 54 45 50 28 46 33 2c 20 63 2c 20 64 2c 20  5STEP(F3, c, d, 
19580 61 2c 20 62 2c 20 69 6e 5b 31 35 5d 2b 30 78 31  a, b, in[15]+0x1
19590 66 61 32 37 63 66 38 2c 20 31 36 29 3b 0a 20 20  fa27cf8, 16);.  
195a0 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 33        MD5STEP(F3
195b0 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e  , b, c, d, a, in
195c0 5b 20 32 5d 2b 30 78 63 34 61 63 35 36 36 35 2c  [ 2]+0xc4ac5665,
195d0 20 32 33 29 3b 0a 0a 20 20 20 20 20 20 20 20 4d   23);..        M
195e0 44 35 53 54 45 50 28 46 34 2c 20 61 2c 20 62 2c  D5STEP(F4, a, b,
195f0 20 63 2c 20 64 2c 20 69 6e 5b 20 30 5d 2b 30 78   c, d, in[ 0]+0x
19600 66 34 32 39 32 32 34 34 2c 20 20 36 29 3b 0a 20  f4292244,  6);. 
19610 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
19620 34 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69  4, d, a, b, c, i
19630 6e 5b 20 37 5d 2b 30 78 34 33 32 61 66 66 39 37  n[ 7]+0x432aff97
19640 2c 20 31 30 29 3b 0a 20 20 20 20 20 20 20 20 4d  , 10);.        M
19650 44 35 53 54 45 50 28 46 34 2c 20 63 2c 20 64 2c  D5STEP(F4, c, d,
19660 20 61 2c 20 62 2c 20 69 6e 5b 31 34 5d 2b 30 78   a, b, in[14]+0x
19670 61 62 39 34 32 33 61 37 2c 20 31 35 29 3b 0a 20  ab9423a7, 15);. 
19680 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
19690 34 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69  4, b, c, d, a, i
196a0 6e 5b 20 35 5d 2b 30 78 66 63 39 33 61 30 33 39  n[ 5]+0xfc93a039
196b0 2c 20 32 31 29 3b 0a 20 20 20 20 20 20 20 20 4d  , 21);.        M
196c0 44 35 53 54 45 50 28 46 34 2c 20 61 2c 20 62 2c  D5STEP(F4, a, b,
196d0 20 63 2c 20 64 2c 20 69 6e 5b 31 32 5d 2b 30 78   c, d, in[12]+0x
196e0 36 35 35 62 35 39 63 33 2c 20 20 36 29 3b 0a 20  655b59c3,  6);. 
196f0 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
19700 34 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69  4, d, a, b, c, i
19710 6e 5b 20 33 5d 2b 30 78 38 66 30 63 63 63 39 32  n[ 3]+0x8f0ccc92
19720 2c 20 31 30 29 3b 0a 20 20 20 20 20 20 20 20 4d  , 10);.        M
19730 44 35 53 54 45 50 28 46 34 2c 20 63 2c 20 64 2c  D5STEP(F4, c, d,
19740 20 61 2c 20 62 2c 20 69 6e 5b 31 30 5d 2b 30 78   a, b, in[10]+0x
19750 66 66 65 66 66 34 37 64 2c 20 31 35 29 3b 0a 20  ffeff47d, 15);. 
19760 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
19770 34 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69  4, b, c, d, a, i
19780 6e 5b 20 31 5d 2b 30 78 38 35 38 34 35 64 64 31  n[ 1]+0x85845dd1
19790 2c 20 32 31 29 3b 0a 20 20 20 20 20 20 20 20 4d  , 21);.        M
197a0 44 35 53 54 45 50 28 46 34 2c 20 61 2c 20 62 2c  D5STEP(F4, a, b,
197b0 20 63 2c 20 64 2c 20 69 6e 5b 20 38 5d 2b 30 78   c, d, in[ 8]+0x
197c0 36 66 61 38 37 65 34 66 2c 20 20 36 29 3b 0a 20  6fa87e4f,  6);. 
197d0 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
197e0 34 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69  4, d, a, b, c, i
197f0 6e 5b 31 35 5d 2b 30 78 66 65 32 63 65 36 65 30  n[15]+0xfe2ce6e0
19800 2c 20 31 30 29 3b 0a 20 20 20 20 20 20 20 20 4d  , 10);.        M
19810 44 35 53 54 45 50 28 46 34 2c 20 63 2c 20 64 2c  D5STEP(F4, c, d,
19820 20 61 2c 20 62 2c 20 69 6e 5b 20 36 5d 2b 30 78   a, b, in[ 6]+0x
19830 61 33 30 31 34 33 31 34 2c 20 31 35 29 3b 0a 20  a3014314, 15);. 
19840 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
19850 34 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69  4, b, c, d, a, i
19860 6e 5b 31 33 5d 2b 30 78 34 65 30 38 31 31 61 31  n[13]+0x4e0811a1
19870 2c 20 32 31 29 3b 0a 20 20 20 20 20 20 20 20 4d  , 21);.        M
19880 44 35 53 54 45 50 28 46 34 2c 20 61 2c 20 62 2c  D5STEP(F4, a, b,
19890 20 63 2c 20 64 2c 20 69 6e 5b 20 34 5d 2b 30 78   c, d, in[ 4]+0x
198a0 66 37 35 33 37 65 38 32 2c 20 20 36 29 3b 0a 20  f7537e82,  6);. 
198b0 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
198c0 34 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69  4, d, a, b, c, i
198d0 6e 5b 31 31 5d 2b 30 78 62 64 33 61 66 32 33 35  n[11]+0xbd3af235
198e0 2c 20 31 30 29 3b 0a 20 20 20 20 20 20 20 20 4d  , 10);.        M
198f0 44 35 53 54 45 50 28 46 34 2c 20 63 2c 20 64 2c  D5STEP(F4, c, d,
19900 20 61 2c 20 62 2c 20 69 6e 5b 20 32 5d 2b 30 78   a, b, in[ 2]+0x
19910 32 61 64 37 64 32 62 62 2c 20 31 35 29 3b 0a 20  2ad7d2bb, 15);. 
19920 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
19930 34 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69  4, b, c, d, a, i
19940 6e 5b 20 39 5d 2b 30 78 65 62 38 36 64 33 39 31  n[ 9]+0xeb86d391
19950 2c 20 32 31 29 3b 0a 0a 20 20 20 20 20 20 20 20  , 21);..        
19960 62 75 66 5b 30 5d 20 2b 3d 20 61 3b 0a 20 20 20  buf[0] += a;.   
19970 20 20 20 20 20 62 75 66 5b 31 5d 20 2b 3d 20 62       buf[1] += b
19980 3b 0a 20 20 20 20 20 20 20 20 62 75 66 5b 32 5d  ;.        buf[2]
19990 20 2b 3d 20 63 3b 0a 20 20 20 20 20 20 20 20 62   += c;.        b
199a0 75 66 5b 33 5d 20 2b 3d 20 64 3b 0a 7d 0a 0a 2f  uf[3] += d;.}../
199b0 2a 0a 20 2a 20 53 74 61 72 74 20 4d 44 35 20 61  *. * Start MD5 a
199c0 63 63 75 6d 75 6c 61 74 69 6f 6e 2e 20 20 53 65  ccumulation.  Se
199d0 74 20 62 69 74 20 63 6f 75 6e 74 20 74 6f 20 30  t bit count to 0
199e0 20 61 6e 64 20 62 75 66 66 65 72 20 74 6f 20 6d   and buffer to m
199f0 79 73 74 65 72 69 6f 75 73 0a 20 2a 20 69 6e 69  ysterious. * ini
19a00 74 69 61 6c 69 7a 61 74 69 6f 6e 20 63 6f 6e 73  tialization cons
19a10 74 61 6e 74 73 2e 0a 20 2a 2f 0a 73 74 61 74 69  tants.. */.stati
19a20 63 20 76 6f 69 64 20 4d 44 35 49 6e 69 74 28 4d  c void MD5Init(M
19a30 44 35 43 6f 6e 74 65 78 74 20 2a 63 74 78 29 7b  D5Context *ctx){
19a40 0a 20 20 20 20 20 20 20 20 63 74 78 2d 3e 69 73  .        ctx->is
19a50 49 6e 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  Init = 1;.      
19a60 20 20 63 74 78 2d 3e 62 75 66 5b 30 5d 20 3d 20    ctx->buf[0] = 
19a70 30 78 36 37 34 35 32 33 30 31 3b 0a 20 20 20 20  0x67452301;.    
19a80 20 20 20 20 63 74 78 2d 3e 62 75 66 5b 31 5d 20      ctx->buf[1] 
19a90 3d 20 30 78 65 66 63 64 61 62 38 39 3b 0a 20 20  = 0xefcdab89;.  
19aa0 20 20 20 20 20 20 63 74 78 2d 3e 62 75 66 5b 32        ctx->buf[2
19ab0 5d 20 3d 20 30 78 39 38 62 61 64 63 66 65 3b 0a  ] = 0x98badcfe;.
19ac0 20 20 20 20 20 20 20 20 63 74 78 2d 3e 62 75 66          ctx->buf
19ad0 5b 33 5d 20 3d 20 30 78 31 30 33 32 35 34 37 36  [3] = 0x10325476
19ae0 3b 0a 20 20 20 20 20 20 20 20 63 74 78 2d 3e 62  ;.        ctx->b
19af0 69 74 73 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20  its[0] = 0;.    
19b00 20 20 20 20 63 74 78 2d 3e 62 69 74 73 5b 31 5d      ctx->bits[1]
19b10 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 55   = 0;.}../*. * U
19b20 70 64 61 74 65 20 63 6f 6e 74 65 78 74 20 74 6f  pdate context to
19b30 20 72 65 66 6c 65 63 74 20 74 68 65 20 63 6f 6e   reflect the con
19b40 63 61 74 65 6e 61 74 69 6f 6e 20 6f 66 20 61 6e  catenation of an
19b50 6f 74 68 65 72 20 62 75 66 66 65 72 20 66 75 6c  other buffer ful
19b60 6c 0a 20 2a 20 6f 66 20 62 79 74 65 73 2e 0a 20  l. * of bytes.. 
19b70 2a 2f 0a 73 74 61 74 69 63 20 0a 76 6f 69 64 20  */.static .void 
19b80 4d 44 35 55 70 64 61 74 65 28 4d 44 35 43 6f 6e  MD5Update(MD5Con
19b90 74 65 78 74 20 2a 63 74 78 2c 20 63 6f 6e 73 74  text *ctx, const
19ba0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
19bb0 62 75 66 2c 20 75 6e 73 69 67 6e 65 64 20 69 6e  buf, unsigned in
19bc0 74 20 6c 65 6e 29 7b 0a 20 20 20 20 20 20 20 20  t len){.        
19bd0 75 69 6e 74 33 32 20 74 3b 0a 0a 20 20 20 20 20  uint32 t;..     
19be0 20 20 20 2f 2a 20 55 70 64 61 74 65 20 62 69 74     /* Update bit
19bf0 63 6f 75 6e 74 20 2a 2f 0a 0a 20 20 20 20 20 20  count */..      
19c00 20 20 74 20 3d 20 63 74 78 2d 3e 62 69 74 73 5b    t = ctx->bits[
19c10 30 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 20 28  0];.        if (
19c20 28 63 74 78 2d 3e 62 69 74 73 5b 30 5d 20 3d 20  (ctx->bits[0] = 
19c30 74 20 2b 20 28 28 75 69 6e 74 33 32 29 6c 65 6e  t + ((uint32)len
19c40 20 3c 3c 20 33 29 29 20 3c 20 74 29 0a 20 20 20   << 3)) < t).   
19c50 20 20 20 20 20 20 20 20 20 20 20 20 20 63 74 78               ctx
19c60 2d 3e 62 69 74 73 5b 31 5d 2b 2b 3b 20 2f 2a 20  ->bits[1]++; /* 
19c70 43 61 72 72 79 20 66 72 6f 6d 20 6c 6f 77 20 74  Carry from low t
19c80 6f 20 68 69 67 68 20 2a 2f 0a 20 20 20 20 20 20  o high */.      
19c90 20 20 63 74 78 2d 3e 62 69 74 73 5b 31 5d 20 2b    ctx->bits[1] +
19ca0 3d 20 6c 65 6e 20 3e 3e 20 32 39 3b 0a 0a 20 20  = len >> 29;..  
19cb0 20 20 20 20 20 20 74 20 3d 20 28 74 20 3e 3e 20        t = (t >> 
19cc0 33 29 20 26 20 30 78 33 66 3b 20 20 20 20 2f 2a  3) & 0x3f;    /*
19cd0 20 42 79 74 65 73 20 61 6c 72 65 61 64 79 20 69   Bytes already i
19ce0 6e 20 73 68 73 49 6e 66 6f 2d 3e 64 61 74 61 20  n shsInfo->data 
19cf0 2a 2f 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 48  */..        /* H
19d00 61 6e 64 6c 65 20 61 6e 79 20 6c 65 61 64 69 6e  andle any leadin
19d10 67 20 6f 64 64 2d 73 69 7a 65 64 20 63 68 75 6e  g odd-sized chun
19d20 6b 73 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 69  ks */..        i
19d30 66 20 28 20 74 20 29 20 7b 0a 20 20 20 20 20 20  f ( t ) {.      
19d40 20 20 20 20 20 20 20 20 20 20 75 6e 73 69 67 6e            unsign
19d50 65 64 20 63 68 61 72 20 2a 70 20 3d 20 28 75 6e  ed char *p = (un
19d60 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 63 74  signed char *)ct
19d70 78 2d 3e 69 6e 20 2b 20 74 3b 0a 0a 20 20 20 20  x->in + t;..    
19d80 20 20 20 20 20 20 20 20 20 20 20 20 74 20 3d 20              t = 
19d90 36 34 2d 74 3b 0a 20 20 20 20 20 20 20 20 20 20  64-t;.          
19da0 20 20 20 20 20 20 69 66 20 28 6c 65 6e 20 3c 20        if (len < 
19db0 74 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t) {.           
19dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d               mem
19dd0 63 70 79 28 70 2c 20 62 75 66 2c 20 6c 65 6e 29  cpy(p, buf, len)
19de0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
19df0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
19e00 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
19e10 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
19e20 20 20 20 20 6d 65 6d 63 70 79 28 70 2c 20 62 75      memcpy(p, bu
19e30 66 2c 20 74 29 3b 0a 20 20 20 20 20 20 20 20 20  f, t);.         
19e40 20 20 20 20 20 20 20 62 79 74 65 52 65 76 65 72         byteRever
19e50 73 65 28 63 74 78 2d 3e 69 6e 2c 20 31 36 29 3b  se(ctx->in, 16);
19e60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
19e70 20 4d 44 35 54 72 61 6e 73 66 6f 72 6d 28 63 74   MD5Transform(ct
19e80 78 2d 3e 62 75 66 2c 20 28 75 69 6e 74 33 32 20  x->buf, (uint32 
19e90 2a 29 63 74 78 2d 3e 69 6e 29 3b 0a 20 20 20 20  *)ctx->in);.    
19ea0 20 20 20 20 20 20 20 20 20 20 20 20 62 75 66 20              buf 
19eb0 2b 3d 20 74 3b 0a 20 20 20 20 20 20 20 20 20 20  += t;.          
19ec0 20 20 20 20 20 20 6c 65 6e 20 2d 3d 20 74 3b 0a        len -= t;.
19ed0 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
19ee0 20 20 20 2f 2a 20 50 72 6f 63 65 73 73 20 64 61     /* Process da
19ef0 74 61 20 69 6e 20 36 34 2d 62 79 74 65 20 63 68  ta in 64-byte ch
19f00 75 6e 6b 73 20 2a 2f 0a 0a 20 20 20 20 20 20 20  unks */..       
19f10 20 77 68 69 6c 65 20 28 6c 65 6e 20 3e 3d 20 36   while (len >= 6
19f20 34 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  4) {.           
19f30 20 20 20 20 20 6d 65 6d 63 70 79 28 63 74 78 2d       memcpy(ctx-
19f40 3e 69 6e 2c 20 62 75 66 2c 20 36 34 29 3b 0a 20  >in, buf, 64);. 
19f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
19f60 79 74 65 52 65 76 65 72 73 65 28 63 74 78 2d 3e  yteReverse(ctx->
19f70 69 6e 2c 20 31 36 29 3b 0a 20 20 20 20 20 20 20  in, 16);.       
19f80 20 20 20 20 20 20 20 20 20 4d 44 35 54 72 61 6e           MD5Tran
19f90 73 66 6f 72 6d 28 63 74 78 2d 3e 62 75 66 2c 20  sform(ctx->buf, 
19fa0 28 75 69 6e 74 33 32 20 2a 29 63 74 78 2d 3e 69  (uint32 *)ctx->i
19fb0 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  n);.            
19fc0 20 20 20 20 62 75 66 20 2b 3d 20 36 34 3b 0a 20      buf += 64;. 
19fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c                 l
19fe0 65 6e 20 2d 3d 20 36 34 3b 0a 20 20 20 20 20 20  en -= 64;.      
19ff0 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20    }..        /* 
1a000 48 61 6e 64 6c 65 20 61 6e 79 20 72 65 6d 61 69  Handle any remai
1a010 6e 69 6e 67 20 62 79 74 65 73 20 6f 66 20 64 61  ning bytes of da
1a020 74 61 2e 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20  ta. */..        
1a030 6d 65 6d 63 70 79 28 63 74 78 2d 3e 69 6e 2c 20  memcpy(ctx->in, 
1a040 62 75 66 2c 20 6c 65 6e 29 3b 0a 7d 0a 0a 2f 2a  buf, len);.}../*
1a050 0a 20 2a 20 46 69 6e 61 6c 20 77 72 61 70 75 70  . * Final wrapup
1a060 20 2d 20 70 61 64 20 74 6f 20 36 34 2d 62 79 74   - pad to 64-byt
1a070 65 20 62 6f 75 6e 64 61 72 79 20 77 69 74 68 20  e boundary with 
1a080 74 68 65 20 62 69 74 20 70 61 74 74 65 72 6e 20  the bit pattern 
1a090 0a 20 2a 20 31 20 30 2a 20 28 36 34 2d 62 69 74  . * 1 0* (64-bit
1a0a0 20 63 6f 75 6e 74 20 6f 66 20 62 69 74 73 20 70   count of bits p
1a0b0 72 6f 63 65 73 73 65 64 2c 20 4d 53 42 2d 66 69  rocessed, MSB-fi
1a0c0 72 73 74 29 0a 20 2a 2f 0a 73 74 61 74 69 63 20  rst). */.static 
1a0d0 76 6f 69 64 20 4d 44 35 46 69 6e 61 6c 28 75 6e  void MD5Final(un
1a0e0 73 69 67 6e 65 64 20 63 68 61 72 20 64 69 67 65  signed char dige
1a0f0 73 74 5b 31 36 5d 2c 20 4d 44 35 43 6f 6e 74 65  st[16], MD5Conte
1a100 78 74 20 2a 63 74 78 29 7b 0a 20 20 20 20 20 20  xt *ctx){.      
1a110 20 20 75 6e 73 69 67 6e 65 64 20 63 6f 75 6e 74    unsigned count
1a120 3b 0a 20 20 20 20 20 20 20 20 75 6e 73 69 67 6e  ;.        unsign
1a130 65 64 20 63 68 61 72 20 2a 70 3b 0a 0a 20 20 20  ed char *p;..   
1a140 20 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20       /* Compute 
1a150 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
1a160 6d 6f 64 20 36 34 20 2a 2f 0a 20 20 20 20 20 20  mod 64 */.      
1a170 20 20 63 6f 75 6e 74 20 3d 20 28 63 74 78 2d 3e    count = (ctx->
1a180 62 69 74 73 5b 30 5d 20 3e 3e 20 33 29 20 26 20  bits[0] >> 3) & 
1a190 30 78 33 46 3b 0a 0a 20 20 20 20 20 20 20 20 2f  0x3F;..        /
1a1a0 2a 20 53 65 74 20 74 68 65 20 66 69 72 73 74 20  * Set the first 
1a1b0 63 68 61 72 20 6f 66 20 70 61 64 64 69 6e 67 20  char of padding 
1a1c0 74 6f 20 30 78 38 30 2e 20 20 54 68 69 73 20 69  to 0x80.  This i
1a1d0 73 20 73 61 66 65 20 73 69 6e 63 65 20 74 68 65  s safe since the
1a1e0 72 65 20 69 73 0a 20 20 20 20 20 20 20 20 20 20  re is.          
1a1f0 20 61 6c 77 61 79 73 20 61 74 20 6c 65 61 73 74   always at least
1a200 20 6f 6e 65 20 62 79 74 65 20 66 72 65 65 20 2a   one byte free *
1a210 2f 0a 20 20 20 20 20 20 20 20 70 20 3d 20 63 74  /.        p = ct
1a220 78 2d 3e 69 6e 20 2b 20 63 6f 75 6e 74 3b 0a 20  x->in + count;. 
1a230 20 20 20 20 20 20 20 2a 70 2b 2b 20 3d 20 30 78         *p++ = 0x
1a240 38 30 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20  80;..        /* 
1a250 42 79 74 65 73 20 6f 66 20 70 61 64 64 69 6e 67  Bytes of padding
1a260 20 6e 65 65 64 65 64 20 74 6f 20 6d 61 6b 65 20   needed to make 
1a270 36 34 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20  64 bytes */.    
1a280 20 20 20 20 63 6f 75 6e 74 20 3d 20 36 34 20 2d      count = 64 -
1a290 20 31 20 2d 20 63 6f 75 6e 74 3b 0a 0a 20 20 20   1 - count;..   
1a2a0 20 20 20 20 20 2f 2a 20 50 61 64 20 6f 75 74 20       /* Pad out 
1a2b0 74 6f 20 35 36 20 6d 6f 64 20 36 34 20 2a 2f 0a  to 56 mod 64 */.
1a2c0 20 20 20 20 20 20 20 20 69 66 20 28 63 6f 75 6e          if (coun
1a2d0 74 20 3c 20 38 29 20 7b 0a 20 20 20 20 20 20 20  t < 8) {.       
1a2e0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 77 6f 20           /* Two 
1a2f0 6c 6f 74 73 20 6f 66 20 70 61 64 64 69 6e 67 3a  lots of padding:
1a300 20 20 50 61 64 20 74 68 65 20 66 69 72 73 74 20    Pad the first 
1a310 62 6c 6f 63 6b 20 74 6f 20 36 34 20 62 79 74 65  block to 64 byte
1a320 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  s */.           
1a330 20 20 20 20 20 6d 65 6d 73 65 74 28 70 2c 20 30       memset(p, 0
1a340 2c 20 63 6f 75 6e 74 29 3b 0a 20 20 20 20 20 20  , count);.      
1a350 20 20 20 20 20 20 20 20 20 20 62 79 74 65 52 65            byteRe
1a360 76 65 72 73 65 28 63 74 78 2d 3e 69 6e 2c 20 31  verse(ctx->in, 1
1a370 36 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  6);.            
1a380 20 20 20 20 4d 44 35 54 72 61 6e 73 66 6f 72 6d      MD5Transform
1a390 28 63 74 78 2d 3e 62 75 66 2c 20 28 75 69 6e 74  (ctx->buf, (uint
1a3a0 33 32 20 2a 29 63 74 78 2d 3e 69 6e 29 3b 0a 0a  32 *)ctx->in);..
1a3b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a3c0 2f 2a 20 4e 6f 77 20 66 69 6c 6c 20 74 68 65 20  /* Now fill the 
1a3d0 6e 65 78 74 20 62 6c 6f 63 6b 20 77 69 74 68 20  next block with 
1a3e0 35 36 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20  56 bytes */.    
1a3f0 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 73              mems
1a400 65 74 28 63 74 78 2d 3e 69 6e 2c 20 30 2c 20 35  et(ctx->in, 0, 5
1a410 36 29 3b 0a 20 20 20 20 20 20 20 20 7d 20 65 6c  6);.        } el
1a420 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  se {.           
1a430 20 20 20 20 20 2f 2a 20 50 61 64 20 62 6c 6f 63       /* Pad bloc
1a440 6b 20 74 6f 20 35 36 20 62 79 74 65 73 20 2a 2f  k to 56 bytes */
1a450 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1a460 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 63 6f   memset(p, 0, co
1a470 75 6e 74 2d 38 29 3b 0a 20 20 20 20 20 20 20 20  unt-8);.        
1a480 7d 0a 20 20 20 20 20 20 20 20 62 79 74 65 52 65  }.        byteRe
1a490 76 65 72 73 65 28 63 74 78 2d 3e 69 6e 2c 20 31  verse(ctx->in, 1
1a4a0 34 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20  4);..        /* 
1a4b0 41 70 70 65 6e 64 20 6c 65 6e 67 74 68 20 69 6e  Append length in
1a4c0 20 62 69 74 73 20 61 6e 64 20 74 72 61 6e 73 66   bits and transf
1a4d0 6f 72 6d 20 2a 2f 0a 20 20 20 20 20 20 20 20 28  orm */.        (
1a4e0 28 75 69 6e 74 33 32 20 2a 29 63 74 78 2d 3e 69  (uint32 *)ctx->i
1a4f0 6e 29 5b 20 31 34 20 5d 20 3d 20 63 74 78 2d 3e  n)[ 14 ] = ctx->
1a500 62 69 74 73 5b 30 5d 3b 0a 20 20 20 20 20 20 20  bits[0];.       
1a510 20 28 28 75 69 6e 74 33 32 20 2a 29 63 74 78 2d   ((uint32 *)ctx-
1a520 3e 69 6e 29 5b 20 31 35 20 5d 20 3d 20 63 74 78  >in)[ 15 ] = ctx
1a530 2d 3e 62 69 74 73 5b 31 5d 3b 0a 0a 20 20 20 20  ->bits[1];..    
1a540 20 20 20 20 4d 44 35 54 72 61 6e 73 66 6f 72 6d      MD5Transform
1a550 28 63 74 78 2d 3e 62 75 66 2c 20 28 75 69 6e 74  (ctx->buf, (uint
1a560 33 32 20 2a 29 63 74 78 2d 3e 69 6e 29 3b 0a 20  32 *)ctx->in);. 
1a570 20 20 20 20 20 20 20 62 79 74 65 52 65 76 65 72         byteRever
1a580 73 65 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61  se((unsigned cha
1a590 72 20 2a 29 63 74 78 2d 3e 62 75 66 2c 20 34 29  r *)ctx->buf, 4)
1a5a0 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  ;.        memcpy
1a5b0 28 64 69 67 65 73 74 2c 20 63 74 78 2d 3e 62 75  (digest, ctx->bu
1a5c0 66 2c 20 31 36 29 3b 0a 20 20 20 20 20 20 20 20  f, 16);.        
1a5d0 6d 65 6d 73 65 74 28 63 74 78 2c 20 30 2c 20 73  memset(ctx, 0, s
1a5e0 69 7a 65 6f 66 28 63 74 78 29 29 3b 20 20 20 20  izeof(ctx));    
1a5f0 2f 2a 20 49 6e 20 63 61 73 65 20 69 74 20 69 73  /* In case it is
1a600 20 73 65 6e 73 69 74 69 76 65 20 2a 2f 0a 7d 0a   sensitive */.}.
1a610 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61  ./*.** Convert a
1a620 20 31 32 38 2d 62 69 74 20 4d 44 35 20 64 69 67   128-bit MD5 dig
1a630 65 73 74 20 69 6e 74 6f 20 61 20 33 32 2d 64 69  est into a 32-di
1a640 67 69 74 20 62 61 73 65 2d 31 36 20 6e 75 6d 62  git base-16 numb
1a650 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  er..*/.static vo
1a660 69 64 20 4d 44 35 44 69 67 65 73 74 54 6f 42 61  id MD5DigestToBa
1a670 73 65 31 36 28 75 6e 73 69 67 6e 65 64 20 63 68  se16(unsigned ch
1a680 61 72 20 2a 64 69 67 65 73 74 2c 20 63 68 61 72  ar *digest, char
1a690 20 2a 7a 42 75 66 29 7b 0a 20 20 73 74 61 74 69   *zBuf){.  stati
1a6a0 63 20 63 68 61 72 20 63 6f 6e 73 74 20 7a 45 6e  c char const zEn
1a6b0 63 6f 64 65 5b 5d 20 3d 20 22 30 31 32 33 34 35  code[] = "012345
1a6c0 36 37 38 39 61 62 63 64 65 66 22 3b 0a 20 20 69  6789abcdef";.  i
1a6d0 6e 74 20 69 2c 20 6a 3b 0a 0a 20 20 66 6f 72 28  nt i, j;..  for(
1a6e0 6a 3d 69 3d 30 3b 20 69 3c 31 36 3b 20 69 2b 2b  j=i=0; i<16; i++
1a6f0 29 7b 0a 20 20 20 20 69 6e 74 20 61 20 3d 20 64  ){.    int a = d
1a700 69 67 65 73 74 5b 69 5d 3b 0a 20 20 20 20 7a 42  igest[i];.    zB
1a710 75 66 5b 6a 2b 2b 5d 20 3d 20 7a 45 6e 63 6f 64  uf[j++] = zEncod
1a720 65 5b 28 61 3e 3e 34 29 26 30 78 66 5d 3b 0a 20  e[(a>>4)&0xf];. 
1a730 20 20 20 7a 42 75 66 5b 6a 2b 2b 5d 20 3d 20 7a     zBuf[j++] = z
1a740 45 6e 63 6f 64 65 5b 61 20 26 20 30 78 66 5d 3b  Encode[a & 0xf];
1a750 0a 20 20 7d 0a 20 20 7a 42 75 66 5b 6a 5d 20 3d  .  }.  zBuf[j] =
1a760 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f   0;.}.../*.** Co
1a770 6e 76 65 72 74 20 61 20 31 32 38 2d 62 69 74 20  nvert a 128-bit 
1a780 4d 44 35 20 64 69 67 65 73 74 20 69 6e 74 6f 20  MD5 digest into 
1a790 73 65 71 75 65 6e 63 79 20 6f 66 20 65 69 67 68  sequency of eigh
1a7a0 74 20 35 2d 64 69 67 69 74 20 69 6e 74 65 67 65  t 5-digit intege
1a7b0 72 73 0a 2a 2a 20 65 61 63 68 20 72 65 70 72 65  rs.** each repre
1a7c0 73 65 6e 74 69 6e 67 20 31 36 20 62 69 74 73 20  senting 16 bits 
1a7d0 6f 66 20 74 68 65 20 64 69 67 65 73 74 20 61 6e  of the digest an
1a7e0 64 20 73 65 70 61 72 61 74 65 64 20 66 72 6f 6d  d separated from
1a7f0 20 65 61 63 68 0a 2a 2a 20 6f 74 68 65 72 20 62   each.** other b
1a800 79 20 61 20 22 2d 22 20 63 68 61 72 61 63 74 65  y a "-" characte
1a810 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  r..*/.static voi
1a820 64 20 4d 44 35 44 69 67 65 73 74 54 6f 42 61 73  d MD5DigestToBas
1a830 65 31 30 78 38 28 75 6e 73 69 67 6e 65 64 20 63  e10x8(unsigned c
1a840 68 61 72 20 64 69 67 65 73 74 5b 31 36 5d 2c 20  har digest[16], 
1a850 63 68 61 72 20 7a 44 69 67 65 73 74 5b 35 30 5d  char zDigest[50]
1a860 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  ){.  int i, j;. 
1a870 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 78 3b   unsigned int x;
1a880 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c  .  for(i=j=0; i<
1a890 31 36 3b 20 69 2b 3d 32 29 7b 0a 20 20 20 20 78  16; i+=2){.    x
1a8a0 20 3d 20 64 69 67 65 73 74 5b 69 5d 2a 32 35 36   = digest[i]*256
1a8b0 20 2b 20 64 69 67 65 73 74 5b 69 2b 31 5d 3b 0a   + digest[i+1];.
1a8c0 20 20 20 20 69 66 28 20 69 3e 30 20 29 20 7a 44      if( i>0 ) zD
1a8d0 69 67 65 73 74 5b 6a 2b 2b 5d 20 3d 20 27 2d 27  igest[j++] = '-'
1a8e0 3b 0a 20 20 20 20 73 70 72 69 6e 74 66 28 26 7a  ;.    sprintf(&z
1a8f0 44 69 67 65 73 74 5b 6a 5d 2c 20 22 25 30 35 75  Digest[j], "%05u
1a900 22 2c 20 78 29 3b 0a 20 20 20 20 6a 20 2b 3d 20  ", x);.    j += 
1a910 35 3b 0a 20 20 7d 0a 20 20 7a 44 69 67 65 73 74  5;.  }.  zDigest
1a920 5b 6a 5d 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  [j] = 0;.}../*.*
1a930 2a 20 41 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20  * A TCL command 
1a940 66 6f 72 20 6d 64 35 2e 20 20 54 68 65 20 61 72  for md5.  The ar
1a950 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 74 65  gument is the te
1a960 78 74 20 74 6f 20 62 65 20 68 61 73 68 65 64 2e  xt to be hashed.
1a970 20 20 54 68 65 0a 2a 2a 20 52 65 73 75 6c 74 20    The.** Result 
1a980 69 73 20 74 68 65 20 68 61 73 68 20 69 6e 20 62  is the hash in b
1a990 61 73 65 36 34 2e 20 20 0a 2a 2f 0a 73 74 61 74  ase64.  .*/.stat
1a9a0 69 63 20 69 6e 74 20 6d 64 35 5f 63 6d 64 28 76  ic int md5_cmd(v
1a9b0 6f 69 64 2a 63 64 2c 20 54 63 6c 5f 49 6e 74 65  oid*cd, Tcl_Inte
1a9c0 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20  rp *interp, int 
1a9d0 61 72 67 63 2c 20 63 6f 6e 73 74 20 63 68 61 72  argc, const char
1a9e0 20 2a 2a 61 72 67 76 29 7b 0a 20 20 4d 44 35 43   **argv){.  MD5C
1a9f0 6f 6e 74 65 78 74 20 63 74 78 3b 0a 20 20 75 6e  ontext ctx;.  un
1aa00 73 69 67 6e 65 64 20 63 68 61 72 20 64 69 67 65  signed char dige
1aa10 73 74 5b 31 36 5d 3b 0a 20 20 63 68 61 72 20 7a  st[16];.  char z
1aa20 42 75 66 5b 35 30 5d 3b 0a 20 20 76 6f 69 64 20  Buf[50];.  void 
1aa30 28 2a 63 6f 6e 76 65 72 74 65 72 29 28 75 6e 73  (*converter)(uns
1aa40 69 67 6e 65 64 20 63 68 61 72 2a 2c 20 63 68 61  igned char*, cha
1aa50 72 2a 29 3b 0a 0a 20 20 69 66 28 20 61 72 67 63  r*);..  if( argc
1aa60 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=2 ){.    Tcl_A
1aa70 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
1aa80 72 70 2c 22 77 72 6f 6e 67 20 23 20 61 72 67 73  rp,"wrong # args
1aa90 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
1aaa0 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20   argv[0], .     
1aab0 20 20 20 22 20 54 45 58 54 5c 22 22 2c 20 30 29     " TEXT\"", 0)
1aac0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
1aad0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 4d 44  _ERROR;.  }.  MD
1aae0 35 49 6e 69 74 28 26 63 74 78 29 3b 0a 20 20 4d  5Init(&ctx);.  M
1aaf0 44 35 55 70 64 61 74 65 28 26 63 74 78 2c 20 28  D5Update(&ctx, (
1ab00 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 61  unsigned char*)a
1ab10 72 67 76 5b 31 5d 2c 20 28 75 6e 73 69 67 6e 65  rgv[1], (unsigne
1ab20 64 29 73 74 72 6c 65 6e 28 61 72 67 76 5b 31 5d  d)strlen(argv[1]
1ab30 29 29 3b 0a 20 20 4d 44 35 46 69 6e 61 6c 28 64  ));.  MD5Final(d
1ab40 69 67 65 73 74 2c 20 26 63 74 78 29 3b 0a 20 20  igest, &ctx);.  
1ab50 63 6f 6e 76 65 72 74 65 72 20 3d 20 28 76 6f 69  converter = (voi
1ab60 64 28 2a 29 28 75 6e 73 69 67 6e 65 64 20 63 68  d(*)(unsigned ch
1ab70 61 72 2a 2c 63 68 61 72 2a 29 29 63 64 3b 0a 20  ar*,char*))cd;. 
1ab80 20 63 6f 6e 76 65 72 74 65 72 28 64 69 67 65 73   converter(diges
1ab90 74 2c 20 7a 42 75 66 29 3b 0a 20 20 54 63 6c 5f  t, zBuf);.  Tcl_
1aba0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
1abb0 65 72 70 2c 20 7a 42 75 66 2c 20 28 63 68 61 72  erp, zBuf, (char
1abc0 2a 29 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  *)0);.  return T
1abd0 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
1abe0 41 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20 74 6f  A TCL command to
1abf0 20 74 61 6b 65 20 74 68 65 20 6d 64 35 20 68 61   take the md5 ha
1ac00 73 68 20 6f 66 20 61 20 66 69 6c 65 2e 20 20 54  sh of a file.  T
1ac10 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74  he argument is t
1ac20 68 65 0a 2a 2a 20 6e 61 6d 65 20 6f 66 20 74 68  he.** name of th
1ac30 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  e file..*/.stati
1ac40 63 20 69 6e 74 20 6d 64 35 66 69 6c 65 5f 63 6d  c int md5file_cm
1ac50 64 28 76 6f 69 64 2a 63 64 2c 20 54 63 6c 5f 49  d(void*cd, Tcl_I
1ac60 6e 74 65 72 70 2a 69 6e 74 65 72 70 2c 20 69 6e  nterp*interp, in
1ac70 74 20 61 72 67 63 2c 20 63 6f 6e 73 74 20 63 68  t argc, const ch
1ac80 61 72 20 2a 2a 61 72 67 76 29 7b 0a 20 20 46 49  ar **argv){.  FI
1ac90 4c 45 20 2a 69 6e 3b 0a 20 20 4d 44 35 43 6f 6e  LE *in;.  MD5Con
1aca0 74 65 78 74 20 63 74 78 3b 0a 20 20 76 6f 69 64  text ctx;.  void
1acb0 20 28 2a 63 6f 6e 76 65 72 74 65 72 29 28 75 6e   (*converter)(un
1acc0 73 69 67 6e 65 64 20 63 68 61 72 2a 2c 20 63 68  signed char*, ch
1acd0 61 72 2a 29 3b 0a 20 20 75 6e 73 69 67 6e 65 64  ar*);.  unsigned
1ace0 20 63 68 61 72 20 64 69 67 65 73 74 5b 31 36 5d   char digest[16]
1acf0 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 31 30  ;.  char zBuf[10
1ad00 32 34 30 5d 3b 0a 0a 20 20 69 66 28 20 61 72 67  240];..  if( arg
1ad10 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=2 ){.    Tcl_
1ad20 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
1ad30 65 72 70 2c 22 77 72 6f 6e 67 20 23 20 61 72 67  erp,"wrong # arg
1ad40 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
1ad50 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20  , argv[0], .    
1ad60 20 20 20 20 22 20 46 49 4c 45 4e 41 4d 45 5c 22      " FILENAME\"
1ad70 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
1ad80 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
1ad90 0a 20 20 69 6e 20 3d 20 66 6f 70 65 6e 28 61 72  .  in = fopen(ar
1ada0 67 76 5b 31 5d 2c 22 72 62 22 29 3b 0a 20 20 69  gv[1],"rb");.  i
1adb0 66 28 20 69 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  f( in==0 ){.    
1adc0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
1add0 28 69 6e 74 65 72 70 2c 22 75 6e 61 62 6c 65 20  (interp,"unable 
1ade0 74 6f 20 6f 70 65 6e 20 66 69 6c 65 20 5c 22 22  to open file \""
1adf0 2c 20 61 72 67 76 5b 31 5d 2c 20 0a 20 20 20 20  , argv[1], .    
1ae00 20 20 20 20 20 22 5c 22 20 66 6f 72 20 72 65 61       "\" for rea
1ae10 64 69 6e 67 22 2c 20 30 29 3b 0a 20 20 20 20 72  ding", 0);.    r
1ae20 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1ae30 0a 20 20 7d 0a 20 20 4d 44 35 49 6e 69 74 28 26  .  }.  MD5Init(&
1ae40 63 74 78 29 3b 0a 20 20 66 6f 72 28 3b 3b 29 7b  ctx);.  for(;;){
1ae50 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20  .    int n;.    
1ae60 6e 20 3d 20 66 72 65 61 64 28 7a 42 75 66 2c 20  n = fread(zBuf, 
1ae70 31 2c 20 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c  1, sizeof(zBuf),
1ae80 20 69 6e 29 3b 0a 20 20 20 20 69 66 28 20 6e 3c   in);.    if( n<
1ae90 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
1aea0 4d 44 35 55 70 64 61 74 65 28 26 63 74 78 2c 20  MD5Update(&ctx, 
1aeb0 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29  (unsigned char*)
1aec0 7a 42 75 66 2c 20 28 75 6e 73 69 67 6e 65 64 29  zBuf, (unsigned)
1aed0 6e 29 3b 0a 20 20 7d 0a 20 20 66 63 6c 6f 73 65  n);.  }.  fclose
1aee0 28 69 6e 29 3b 0a 20 20 4d 44 35 46 69 6e 61 6c  (in);.  MD5Final
1aef0 28 64 69 67 65 73 74 2c 20 26 63 74 78 29 3b 0a  (digest, &ctx);.
1af00 20 20 63 6f 6e 76 65 72 74 65 72 20 3d 20 28 76    converter = (v
1af10 6f 69 64 28 2a 29 28 75 6e 73 69 67 6e 65 64 20  oid(*)(unsigned 
1af20 63 68 61 72 2a 2c 63 68 61 72 2a 29 29 63 64 3b  char*,char*))cd;
1af30 0a 20 20 63 6f 6e 76 65 72 74 65 72 28 64 69 67  .  converter(dig
1af40 65 73 74 2c 20 7a 42 75 66 29 3b 0a 20 20 54 63  est, zBuf);.  Tc
1af50 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
1af60 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 28 63 68  nterp, zBuf, (ch
1af70 61 72 2a 29 30 29 3b 0a 20 20 72 65 74 75 72 6e  ar*)0);.  return
1af80 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
1af90 2a 20 52 65 67 69 73 74 65 72 20 74 68 65 20 66  * Register the f
1afa0 6f 75 72 20 6e 65 77 20 54 43 4c 20 63 6f 6d 6d  our new TCL comm
1afb0 61 6e 64 73 20 66 6f 72 20 67 65 6e 65 72 61 74  ands for generat
1afc0 69 6e 67 20 4d 44 35 20 63 68 65 63 6b 73 75 6d  ing MD5 checksum
1afd0 73 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 54 43  s.** with the TC
1afe0 4c 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0a 2a  L interpreter..*
1aff0 2f 0a 69 6e 74 20 4d 64 35 5f 49 6e 69 74 28 54  /.int Md5_Init(T
1b000 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
1b010 70 29 7b 0a 20 20 54 63 6c 5f 43 72 65 61 74 65  p){.  Tcl_Create
1b020 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20  Command(interp, 
1b030 22 6d 64 35 22 2c 20 28 54 63 6c 5f 43 6d 64 50  "md5", (Tcl_CmdP
1b040 72 6f 63 2a 29 6d 64 35 5f 63 6d 64 2c 0a 20 20  roc*)md5_cmd,.  
1b050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b060 20 20 4d 44 35 44 69 67 65 73 74 54 6f 42 61 73    MD5DigestToBas
1b070 65 31 36 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 43  e16, 0);.  Tcl_C
1b080 72 65 61 74 65 43 6f 6d 6d 61 6e 64 28 69 6e 74  reateCommand(int
1b090 65 72 70 2c 20 22 6d 64 35 2d 31 30 78 38 22 2c  erp, "md5-10x8",
1b0a0 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 6d   (Tcl_CmdProc*)m
1b0b0 64 35 5f 63 6d 64 2c 0a 20 20 20 20 20 20 20 20  d5_cmd,.        
1b0c0 20 20 20 20 20 20 20 20 20 20 20 20 4d 44 35 44              MD5D
1b0d0 69 67 65 73 74 54 6f 42 61 73 65 31 30 78 38 2c  igestToBase10x8,
1b0e0 20 30 29 3b 0a 20 20 54 63 6c 5f 43 72 65 61 74   0);.  Tcl_Creat
1b0f0 65 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c  eCommand(interp,
1b100 20 22 6d 64 35 66 69 6c 65 22 2c 20 28 54 63 6c   "md5file", (Tcl
1b110 5f 43 6d 64 50 72 6f 63 2a 29 6d 64 35 66 69 6c  _CmdProc*)md5fil
1b120 65 5f 63 6d 64 2c 0a 20 20 20 20 20 20 20 20 20  e_cmd,.         
1b130 20 20 20 20 20 20 20 20 20 20 20 4d 44 35 44 69             MD5Di
1b140 67 65 73 74 54 6f 42 61 73 65 31 36 2c 20 30 29  gestToBase16, 0)
1b150 3b 0a 20 20 54 63 6c 5f 43 72 65 61 74 65 43 6f  ;.  Tcl_CreateCo
1b160 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 6d  mmand(interp, "m
1b170 64 35 66 69 6c 65 2d 31 30 78 38 22 2c 20 28 54  d5file-10x8", (T
1b180 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 6d 64 35 66  cl_CmdProc*)md5f
1b190 69 6c 65 5f 63 6d 64 2c 0a 20 20 20 20 20 20 20  ile_cmd,.       
1b1a0 20 20 20 20 20 20 20 20 20 20 20 20 20 4d 44 35               MD5
1b1b0 44 69 67 65 73 74 54 6f 42 61 73 65 31 30 78 38  DigestToBase10x8
1b1c0 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  , 0);.  return T
1b1d0 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20  CL_OK;.}.#endif 
1b1e0 2f 2a 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  /* defined(SQLIT
1b1f0 45 5f 54 45 53 54 29 20 7c 7c 20 64 65 66 69 6e  E_TEST) || defin
1b200 65 64 28 53 51 4c 49 54 45 5f 54 43 4c 4d 44 35  ed(SQLITE_TCLMD5
1b210 29 20 2a 2f 0a 0a 23 69 66 20 64 65 66 69 6e 65  ) */..#if define
1b220 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 2f  d(SQLITE_TEST)./
1b230 2a 0a 2a 2a 20 44 75 72 69 6e 67 20 74 65 73 74  *.** During test
1b240 69 6e 67 2c 20 74 68 65 20 73 70 65 63 69 61 6c  ing, the special
1b250 20 6d 64 35 73 75 6d 28 29 20 61 67 67 72 65 67   md5sum() aggreg
1b260 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  ate function is 
1b270 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 20 69 6e  available..** in
1b280 73 69 64 65 20 53 51 4c 69 74 65 2e 20 20 54 68  side SQLite.  Th
1b290 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74  e following rout
1b2a0 69 6e 65 73 20 69 6d 70 6c 65 6d 65 6e 74 20 74  ines implement t
1b2b0 68 61 74 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  hat function..*/
1b2c0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d 64 35  .static void md5
1b2d0 73 74 65 70 28 73 71 6c 69 74 65 33 5f 63 6f 6e  step(sqlite3_con
1b2e0 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 69  text *context, i
1b2f0 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33  nt argc, sqlite3
1b300 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 29 7b 0a  _value **argv){.
1b310 20 20 4d 44 35 43 6f 6e 74 65 78 74 20 2a 70 3b    MD5Context *p;
1b320 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
1b330 61 72 67 63 3c 31 20 29 20 72 65 74 75 72 6e 3b  argc<1 ) return;
1b340 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 61  .  p = sqlite3_a
1b350 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74  ggregate_context
1b360 28 63 6f 6e 74 65 78 74 2c 20 73 69 7a 65 6f 66  (context, sizeof
1b370 28 2a 70 29 29 3b 0a 20 20 69 66 28 20 70 3d 3d  (*p));.  if( p==
1b380 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
1b390 28 20 21 70 2d 3e 69 73 49 6e 69 74 20 29 7b 0a  ( !p->isInit ){.
1b3a0 20 20 20 20 4d 44 35 49 6e 69 74 28 70 29 3b 0a      MD5Init(p);.
1b3b0 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69    }.  for(i=0; i
1b3c0 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  <argc; i++){.   
1b3d0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 61   const char *zDa
1b3e0 74 61 20 3d 20 28 63 68 61 72 2a 29 73 71 6c 69  ta = (char*)sqli
1b3f0 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
1b400 72 67 76 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28  rgv[i]);.    if(
1b410 20 7a 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20   zData ){.      
1b420 4d 44 35 55 70 64 61 74 65 28 70 2c 20 28 75 6e  MD5Update(p, (un
1b430 73 69 67 6e 65 64 20 63 68 61 72 2a 29 7a 44 61  signed char*)zDa
1b440 74 61 2c 20 73 74 72 6c 65 6e 28 7a 44 61 74 61  ta, strlen(zData
1b450 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  ));.    }.  }.}.
1b460 73 74 61 74 69 63 20 76 6f 69 64 20 6d 64 35 66  static void md5f
1b470 69 6e 61 6c 69 7a 65 28 73 71 6c 69 74 65 33 5f  inalize(sqlite3_
1b480 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  context *context
1b490 29 7b 0a 20 20 4d 44 35 43 6f 6e 74 65 78 74 20  ){.  MD5Context 
1b4a0 2a 70 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  *p;.  unsigned c
1b4b0 68 61 72 20 64 69 67 65 73 74 5b 31 36 5d 3b 0a  har digest[16];.
1b4c0 20 20 63 68 61 72 20 7a 42 75 66 5b 33 33 5d 3b    char zBuf[33];
1b4d0 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 61  .  p = sqlite3_a
1b4e0 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74  ggregate_context
1b4f0 28 63 6f 6e 74 65 78 74 2c 20 73 69 7a 65 6f 66  (context, sizeof
1b500 28 2a 70 29 29 3b 0a 20 20 4d 44 35 46 69 6e 61  (*p));.  MD5Fina
1b510 6c 28 64 69 67 65 73 74 2c 70 29 3b 0a 20 20 4d  l(digest,p);.  M
1b520 44 35 44 69 67 65 73 74 54 6f 42 61 73 65 31 36  D5DigestToBase16
1b530 28 64 69 67 65 73 74 2c 20 7a 42 75 66 29 3b 0a  (digest, zBuf);.
1b540 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
1b550 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 7a  _text(context, z
1b560 42 75 66 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f  Buf, -1, SQLITE_
1b570 54 52 41 4e 53 49 45 4e 54 29 3b 0a 7d 0a 69 6e  TRANSIENT);.}.in
1b580 74 20 4d 64 35 5f 52 65 67 69 73 74 65 72 28 73  t Md5_Register(s
1b590 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69  qlite3 *db){.  i
1b5a0 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  nt rc = sqlite3_
1b5b0 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28  create_function(
1b5c0 64 62 2c 20 22 6d 64 35 73 75 6d 22 2c 20 2d 31  db, "md5sum", -1
1b5d0 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30  , SQLITE_UTF8, 0
1b5e0 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20  , 0, .          
1b5f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b600 20 20 20 20 20 20 20 6d 64 35 73 74 65 70 2c 20         md5step, 
1b610 6d 64 35 66 69 6e 61 6c 69 7a 65 29 3b 0a 20 20  md5finalize);.  
1b620 73 71 6c 69 74 65 33 5f 6f 76 65 72 6c 6f 61 64  sqlite3_overload
1b630 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 6d  _function(db, "m
1b640 64 35 73 75 6d 22 2c 20 2d 31 29 3b 20 20 2f 2a  d5sum", -1);  /*
1b650 20 54 6f 20 65 78 65 72 63 69 73 65 20 74 68 69   To exercise thi
1b660 73 20 41 50 49 20 2a 2f 0a 20 20 72 65 74 75 72  s API */.  retur
1b670 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  n rc;.}.#endif /
1b680 2a 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  * defined(SQLITE
1b690 5f 54 45 53 54 29 20 2a 2f 0a 0a 0a 2f 2a 0a 2a  _TEST) */.../*.*
1b6a0 2a 20 49 66 20 74 68 65 20 6d 61 63 72 6f 20 54  * If the macro T
1b6b0 43 4c 53 48 20 69 73 20 6f 6e 65 2c 20 74 68 65  CLSH is one, the
1b6c0 6e 20 70 75 74 20 69 6e 20 63 6f 64 65 20 74 68  n put in code th
1b6d0 69 73 20 66 6f 72 20 74 68 65 0a 2a 2a 20 22 6d  is for the.** "m
1b6e0 61 69 6e 22 20 72 6f 75 74 69 6e 65 20 74 68 61  ain" routine tha
1b6f0 74 20 77 69 6c 6c 20 69 6e 69 74 69 61 6c 69 7a  t will initializ
1b700 65 20 54 63 6c 20 61 6e 64 20 74 61 6b 65 20 69  e Tcl and take i
1b710 6e 70 75 74 20 66 72 6f 6d 0a 2a 2a 20 73 74 61  nput from.** sta
1b720 6e 64 61 72 64 20 69 6e 70 75 74 2c 20 6f 72 20  ndard input, or 
1b730 69 66 20 61 20 66 69 6c 65 20 69 73 20 6e 61 6d  if a file is nam
1b740 65 64 20 6f 6e 20 74 68 65 20 63 6f 6d 6d 61 6e  ed on the comman
1b750 64 20 6c 69 6e 65 0a 2a 2a 20 74 68 65 20 54 43  d line.** the TC
1b760 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 72 65  L interpreter re
1b770 61 64 73 20 61 6e 64 20 65 76 61 6c 75 61 74 65  ads and evaluate
1b780 73 20 74 68 61 74 20 66 69 6c 65 2e 0a 2a 2f 0a  s that file..*/.
1b790 23 69 66 20 54 43 4c 53 48 3d 3d 31 0a 73 74 61  #if TCLSH==1.sta
1b7a0 74 69 63 20 63 68 61 72 20 7a 4d 61 69 6e 6c 6f  tic char zMainlo
1b7b0 6f 70 5b 5d 20 3d 0a 20 20 22 73 65 74 20 6c 69  op[] =.  "set li
1b7c0 6e 65 20 7b 7d 5c 6e 22 0a 20 20 22 77 68 69 6c  ne {}\n".  "whil
1b7d0 65 20 7b 21 5b 65 6f 66 20 73 74 64 69 6e 5d 7d  e {![eof stdin]}
1b7e0 20 7b 5c 6e 22 0a 20 20 20 20 22 69 66 20 7b 24   {\n".    "if {$
1b7f0 6c 69 6e 65 21 3d 5c 22 5c 22 7d 20 7b 5c 6e 22  line!=\"\"} {\n"
1b800 0a 20 20 20 20 20 20 22 70 75 74 73 20 2d 6e 6f  .      "puts -no
1b810 6e 65 77 6c 69 6e 65 20 5c 22 3e 20 5c 22 5c 6e  newline \"> \"\n
1b820 22 0a 20 20 20 20 22 7d 20 65 6c 73 65 20 7b 5c  ".    "} else {\
1b830 6e 22 0a 20 20 20 20 20 20 22 70 75 74 73 20 2d  n".      "puts -
1b840 6e 6f 6e 65 77 6c 69 6e 65 20 5c 22 25 20 5c 22  nonewline \"% \"
1b850 5c 6e 22 0a 20 20 20 20 22 7d 5c 6e 22 0a 20 20  \n".    "}\n".  
1b860 20 20 22 66 6c 75 73 68 20 73 74 64 6f 75 74 5c    "flush stdout\
1b870 6e 22 0a 20 20 20 20 22 61 70 70 65 6e 64 20 6c  n".    "append l
1b880 69 6e 65 20 5b 67 65 74 73 20 73 74 64 69 6e 5d  ine [gets stdin]
1b890 5c 6e 22 0a 20 20 20 20 22 69 66 20 7b 5b 69 6e  \n".    "if {[in
1b8a0 66 6f 20 63 6f 6d 70 6c 65 74 65 20 24 6c 69 6e  fo complete $lin
1b8b0 65 5d 7d 20 7b 5c 6e 22 0a 20 20 20 20 20 20 22  e]} {\n".      "
1b8c0 69 66 20 7b 5b 63 61 74 63 68 20 7b 75 70 6c 65  if {[catch {uple
1b8d0 76 65 6c 20 23 30 20 24 6c 69 6e 65 7d 20 72 65  vel #0 $line} re
1b8e0 73 75 6c 74 5d 7d 20 7b 5c 6e 22 0a 20 20 20 20  sult]} {\n".    
1b8f0 20 20 20 20 22 70 75 74 73 20 73 74 64 65 72 72      "puts stderr
1b900 20 5c 22 45 72 72 6f 72 3a 20 24 72 65 73 75 6c   \"Error: $resul
1b910 74 5c 22 5c 6e 22 0a 20 20 20 20 20 20 22 7d 20  t\"\n".      "} 
1b920 65 6c 73 65 69 66 20 7b 24 72 65 73 75 6c 74 21  elseif {$result!
1b930 3d 5c 22 5c 22 7d 20 7b 5c 6e 22 0a 20 20 20 20  =\"\"} {\n".    
1b940 20 20 20 20 22 70 75 74 73 20 24 72 65 73 75 6c      "puts $resul
1b950 74 5c 6e 22 0a 20 20 20 20 20 20 22 7d 5c 6e 22  t\n".      "}\n"
1b960 0a 20 20 20 20 20 20 22 73 65 74 20 6c 69 6e 65  .      "set line
1b970 20 7b 7d 5c 6e 22 0a 20 20 20 20 22 7d 20 65 6c   {}\n".    "} el
1b980 73 65 20 7b 5c 6e 22 0a 20 20 20 20 20 20 22 61  se {\n".      "a
1b990 70 70 65 6e 64 20 6c 69 6e 65 20 5c 5c 6e 5c 6e  ppend line \\n\n
1b9a0 22 0a 20 20 20 20 22 7d 5c 6e 22 0a 20 20 22 7d  ".    "}\n".  "}
1b9b0 5c 6e 22 0a 3b 0a 23 65 6e 64 69 66 0a 23 69 66  \n".;.#endif.#if
1b9c0 20 54 43 4c 53 48 3d 3d 32 0a 73 74 61 74 69 63   TCLSH==2.static
1b9d0 20 63 68 61 72 20 7a 4d 61 69 6e 6c 6f 6f 70 5b   char zMainloop[
1b9e0 5d 20 3d 20 0a 23 69 6e 63 6c 75 64 65 20 22 73  ] = .#include "s
1b9f0 70 61 63 65 61 6e 61 6c 5f 74 63 6c 2e 68 22 0a  paceanal_tcl.h".
1ba00 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66  ;.#endif..#ifdef
1ba10 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 73 74 61   SQLITE_TEST.sta
1ba20 74 69 63 20 76 6f 69 64 20 69 6e 69 74 5f 61 6c  tic void init_al
1ba30 6c 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 29 3b  l(Tcl_Interp *);
1ba40 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 69 74  .static int init
1ba50 5f 61 6c 6c 5f 63 6d 64 28 0a 20 20 43 6c 69 65  _all_cmd(.  Clie
1ba60 6e 74 44 61 74 61 20 63 64 2c 0a 20 20 54 63 6c  ntData cd,.  Tcl
1ba70 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
1ba80 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
1ba90 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
1baa0 6a 76 5b 5d 0a 29 7b 0a 0a 20 20 54 63 6c 5f 49  jv[].){..  Tcl_I
1bab0 6e 74 65 72 70 20 2a 73 6c 61 76 65 3b 0a 20 20  nterp *slave;.  
1bac0 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20  if( objc!=2 ){. 
1bad0 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
1bae0 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
1baf0 62 6a 76 2c 20 22 53 4c 41 56 45 22 29 3b 0a 20  bjv, "SLAVE");. 
1bb00 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
1bb10 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 73 6c 61 76  ROR;.  }..  slav
1bb20 65 20 3d 20 54 63 6c 5f 47 65 74 53 6c 61 76 65  e = Tcl_GetSlave
1bb30 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
1bb40 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 29  String(objv[1]))
1bb50 3b 0a 20 20 69 66 28 20 21 73 6c 61 76 65 20 29  ;.  if( !slave )
1bb60 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  {.    return TCL
1bb70 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69  _ERROR;.  }..  i
1bb80 6e 69 74 5f 61 6c 6c 28 73 6c 61 76 65 29 3b 0a  nit_all(slave);.
1bb90 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
1bba0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
1bbb0 20 43 6f 6e 66 69 67 75 72 65 20 74 68 65 20 69   Configure the i
1bbc0 6e 74 65 72 70 72 65 74 65 72 20 70 61 73 73 65  nterpreter passe
1bbd0 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61  d as the first a
1bbe0 72 67 75 6d 65 6e 74 20 74 6f 20 68 61 76 65 20  rgument to have 
1bbf0 61 63 63 65 73 73 0a 2a 2a 20 74 6f 20 74 68 65  access.** to the
1bc00 20 63 6f 6d 6d 61 6e 64 73 20 61 6e 64 20 6c 69   commands and li
1bc10 6e 6b 65 64 20 76 61 72 69 61 62 6c 65 73 20 74  nked variables t
1bc20 68 61 74 20 6d 61 6b 65 20 75 70 3a 0a 2a 2a 0a  hat make up:.**.
1bc30 2a 2a 20 20 20 2a 20 74 68 65 20 5b 73 71 6c 69  **   * the [sqli
1bc40 74 65 33 5d 20 65 78 74 65 6e 73 69 6f 6e 20 69  te3] extension i
1bc50 74 73 65 6c 66 2c 20 0a 2a 2a 0a 2a 2a 20 20 20  tself, .**.**   
1bc60 2a 20 49 66 20 53 51 4c 49 54 45 5f 54 43 4c 4d  * If SQLITE_TCLM
1bc70 44 35 20 6f 72 20 53 51 4c 49 54 45 5f 54 45 53  D5 or SQLITE_TES
1bc80 54 20 69 73 20 64 65 66 69 6e 65 64 2c 20 74 68  T is defined, th
1bc90 65 20 4d 64 35 20 63 6f 6d 6d 61 6e 64 73 2c 20  e Md5 commands, 
1bca0 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66  and.**.**   * If
1bcb0 20 53 51 4c 49 54 45 5f 54 45 53 54 20 69 73 20   SQLITE_TEST is 
1bcc0 73 65 74 2c 20 74 68 65 20 76 61 72 69 6f 75 73  set, the various
1bcd0 20 74 65 73 74 20 69 6e 74 65 72 66 61 63 65 73   test interfaces
1bce0 20 75 73 65 64 20 62 79 20 74 68 65 20 54 63 6c   used by the Tcl
1bcf0 0a 2a 2a 20 20 20 20 20 74 65 73 74 20 73 75 69  .**     test sui
1bd00 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  te..*/.static vo
1bd10 69 64 20 69 6e 69 74 5f 61 6c 6c 28 54 63 6c 5f  id init_all(Tcl_
1bd20 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b  Interp *interp){
1bd30 0a 20 20 53 71 6c 69 74 65 33 5f 49 6e 69 74 28  .  Sqlite3_Init(
1bd40 69 6e 74 65 72 70 29 3b 0a 0a 23 69 66 20 64 65  interp);..#if de
1bd50 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53  fined(SQLITE_TES
1bd60 54 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  T) || defined(SQ
1bd70 4c 49 54 45 5f 54 43 4c 4d 44 35 29 0a 20 20 4d  LITE_TCLMD5).  M
1bd80 64 35 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b  d5_Init(interp);
1bd90 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20  .#endif..#ifdef 
1bda0 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 7b 0a  SQLITE_TEST.  {.
1bdb0 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53      extern int S
1bdc0 71 6c 69 74 65 63 6f 6e 66 69 67 5f 49 6e 69 74  qliteconfig_Init
1bdd0 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20  (Tcl_Interp*);. 
1bde0 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71     extern int Sq
1bdf0 6c 69 74 65 74 65 73 74 31 5f 49 6e 69 74 28 54  litetest1_Init(T
1be00 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20  cl_Interp*);.   
1be10 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69   extern int Sqli
1be20 74 65 74 65 73 74 32 5f 49 6e 69 74 28 54 63 6c  tetest2_Init(Tcl
1be30 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65  _Interp*);.    e
1be40 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65  xtern int Sqlite
1be50 74 65 73 74 33 5f 49 6e 69 74 28 54 63 6c 5f 49  test3_Init(Tcl_I
1be60 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74  nterp*);.    ext
1be70 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65  ern int Sqlitete
1be80 73 74 34 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74  st4_Init(Tcl_Int
1be90 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72  erp*);.    exter
1bea0 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74  n int Sqlitetest
1beb0 35 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  5_Init(Tcl_Inter
1bec0 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20  p*);.    extern 
1bed0 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 36 5f  int Sqlitetest6_
1bee0 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a  Init(Tcl_Interp*
1bef0 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e  );.    extern in
1bf00 74 20 53 71 6c 69 74 65 74 65 73 74 37 5f 49 6e  t Sqlitetest7_In
1bf10 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b  it(Tcl_Interp*);
1bf20 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20  .    extern int 
1bf30 53 71 6c 69 74 65 74 65 73 74 38 5f 49 6e 69 74  Sqlitetest8_Init
1bf40 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20  (Tcl_Interp*);. 
1bf50 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71     extern int Sq
1bf60 6c 69 74 65 74 65 73 74 39 5f 49 6e 69 74 28 54  litetest9_Init(T
1bf70 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20  cl_Interp*);.   
1bf80 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69   extern int Sqli
1bf90 74 65 74 65 73 74 61 73 79 6e 63 5f 49 6e 69 74  tetestasync_Init
1bfa0 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20  (Tcl_Interp*);. 
1bfb0 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71     extern int Sq
1bfc0 6c 69 74 65 74 65 73 74 5f 61 75 74 6f 65 78 74  litetest_autoext
1bfd0 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
1bfe0 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69  *);.    extern i
1bff0 6e 74 20 53 71 6c 69 74 65 74 65 73 74 5f 64 65  nt Sqlitetest_de
1c000 6d 6f 76 66 73 5f 49 6e 69 74 28 54 63 6c 5f 49  movfs_Init(Tcl_I
1c010 6e 74 65 72 70 20 2a 29 3b 0a 20 20 20 20 65 78  nterp *);.    ex
1c020 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74  tern int Sqlitet
1c030 65 73 74 5f 66 75 6e 63 5f 49 6e 69 74 28 54 63  est_func_Init(Tc
1c040 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20  l_Interp*);.    
1c050 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74  extern int Sqlit
1c060 65 74 65 73 74 5f 68 65 78 69 6f 5f 49 6e 69 74  etest_hexio_Init
1c070 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20  (Tcl_Interp*);. 
1c080 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71     extern int Sq
1c090 6c 69 74 65 74 65 73 74 5f 69 6e 69 74 5f 49 6e  litetest_init_In
1c0a0 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b  it(Tcl_Interp*);
1c0b0 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20  .    extern int 
1c0c0 53 71 6c 69 74 65 74 65 73 74 5f 6d 61 6c 6c 6f  Sqlitetest_mallo
1c0d0 63 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  c_Init(Tcl_Inter
1c0e0 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20  p*);.    extern 
1c0f0 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 5f 6d  int Sqlitetest_m
1c100 75 74 65 78 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  utex_Init(Tcl_In
1c110 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65  terp*);.    exte
1c120 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73  rn int Sqlitetes
1c130 74 73 63 68 65 6d 61 5f 49 6e 69 74 28 54 63 6c  tschema_Init(Tcl
1c140 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65  _Interp*);.    e
1c150 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65  xtern int Sqlite
1c160 74 65 73 74 73 73 65 5f 49 6e 69 74 28 54 63 6c  testsse_Init(Tcl
1c170 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65  _Interp*);.    e
1c180 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65  xtern int Sqlite
1c190 74 65 73 74 74 63 6c 76 61 72 5f 49 6e 69 74 28  testtclvar_Init(
1c1a0 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20  Tcl_Interp*);.  
1c1b0 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c    extern int Sql
1c1c0 69 74 65 74 65 73 74 54 68 72 65 61 64 5f 49 6e  itetestThread_In
1c1d0 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b  it(Tcl_Interp*);
1c1e0 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20  .    extern int 
1c1f0 53 71 6c 69 74 65 74 65 73 74 4f 6e 65 66 69 6c  SqlitetestOnefil
1c200 65 5f 49 6e 69 74 28 29 3b 0a 20 20 20 20 65 78  e_Init();.    ex
1c210 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74  tern int Sqlitet
1c220 65 73 74 4f 73 69 6e 73 74 5f 49 6e 69 74 28 54  estOsinst_Init(T
1c230 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20  cl_Interp*);.   
1c240 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69   extern int Sqli
1c250 74 65 74 65 73 74 62 61 63 6b 75 70 5f 49 6e 69  tetestbackup_Ini
1c260 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a  t(Tcl_Interp*);.
1c270 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53      extern int S
1c280 71 6c 69 74 65 74 65 73 74 69 6e 74 61 72 72 61  qlitetestintarra
1c290 79 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  y_Init(Tcl_Inter
1c2a0 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20  p*);.    extern 
1c2b0 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 76 66  int Sqlitetestvf
1c2c0 73 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  s_Init(Tcl_Inter
1c2d0 70 20 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e  p *);.    extern
1c2e0 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 53   int SqlitetestS
1c2f0 74 61 74 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74  tat_Init(Tcl_Int
1c300 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72  erp*);.    exter
1c310 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74  n int Sqlitetest
1c320 72 74 72 65 65 5f 49 6e 69 74 28 54 63 6c 5f 49  rtree_Init(Tcl_I
1c330 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74  nterp*);.    ext
1c340 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 71 75  ern int Sqlitequ
1c350 6f 74 61 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74  ota_Init(Tcl_Int
1c360 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72  erp*);.    exter
1c370 6e 20 69 6e 74 20 53 71 6c 69 74 65 6d 75 6c 74  n int Sqlitemult
1c380 69 70 6c 65 78 5f 49 6e 69 74 28 54 63 6c 5f 49  iplex_Init(Tcl_I
1c390 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74  nterp*);.    ext
1c3a0 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 53 75  ern int SqliteSu
1c3b0 70 65 72 6c 6f 63 6b 5f 49 6e 69 74 28 54 63 6c  perlock_Init(Tcl
1c3c0 5f 49 6e 74 65 72 70 2a 29 3b 0a 23 69 66 64 65  _Interp*);.#ifde
1c3d0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
1c3e0 53 45 53 53 49 4f 4e 0a 20 20 20 20 65 78 74 65  SESSION.    exte
1c3f0 72 6e 20 69 6e 74 20 54 65 73 74 53 65 73 73 69  rn int TestSessi
1c400 6f 6e 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  on_Init(Tcl_Inte
1c410 72 70 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69  rp*);.#endif..#i
1c420 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
1c430 4c 45 5f 5a 49 50 56 46 53 0a 20 20 20 20 65 78  LE_ZIPVFS.    ex
1c440 74 65 72 6e 20 69 6e 74 20 5a 69 70 76 66 73 5f  tern int Zipvfs_
1c450 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a  Init(Tcl_Interp*
1c460 29 3b 0a 20 20 20 20 5a 69 70 76 66 73 5f 49 6e  );.    Zipvfs_In
1c470 69 74 28 69 6e 74 65 72 70 29 3b 0a 23 65 6e 64  it(interp);.#end
1c480 69 66 0a 0a 20 20 20 20 53 71 6c 69 74 65 63 6f  if..    Sqliteco
1c490 6e 66 69 67 5f 49 6e 69 74 28 69 6e 74 65 72 70  nfig_Init(interp
1c4a0 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73  );.    Sqlitetes
1c4b0 74 31 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b  t1_Init(interp);
1c4c0 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 32  .    Sqlitetest2
1c4d0 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20  _Init(interp);. 
1c4e0 20 20 20 53 71 6c 69 74 65 74 65 73 74 33 5f 49     Sqlitetest3_I
1c4f0 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20  nit(interp);.   
1c500 20 53 71 6c 69 74 65 74 65 73 74 34 5f 49 6e 69   Sqlitetest4_Ini
1c510 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53  t(interp);.    S
1c520 71 6c 69 74 65 74 65 73 74 35 5f 49 6e 69 74 28  qlitetest5_Init(
1c530 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c  interp);.    Sql
1c540 69 74 65 74 65 73 74 36 5f 49 6e 69 74 28 69 6e  itetest6_Init(in
1c550 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74  terp);.    Sqlit
1c560 65 74 65 73 74 37 5f 49 6e 69 74 28 69 6e 74 65  etest7_Init(inte
1c570 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74  rp);.    Sqlitet
1c580 65 73 74 38 5f 49 6e 69 74 28 69 6e 74 65 72 70  est8_Init(interp
1c590 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73  );.    Sqlitetes
1c5a0 74 39 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b  t9_Init(interp);
1c5b0 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 61  .    Sqlitetesta
1c5c0 73 79 6e 63 5f 49 6e 69 74 28 69 6e 74 65 72 70  sync_Init(interp
1c5d0 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73  );.    Sqlitetes
1c5e0 74 5f 61 75 74 6f 65 78 74 5f 49 6e 69 74 28 69  t_autoext_Init(i
1c5f0 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69  nterp);.    Sqli
1c600 74 65 74 65 73 74 5f 64 65 6d 6f 76 66 73 5f 49  tetest_demovfs_I
1c610 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20  nit(interp);.   
1c620 20 53 71 6c 69 74 65 74 65 73 74 5f 66 75 6e 63   Sqlitetest_func
1c630 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20  _Init(interp);. 
1c640 20 20 20 53 71 6c 69 74 65 74 65 73 74 5f 68 65     Sqlitetest_he
1c650 78 69 6f 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  xio_Init(interp)
1c660 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74  ;.    Sqlitetest
1c670 5f 69 6e 69 74 5f 49 6e 69 74 28 69 6e 74 65 72  _init_Init(inter
1c680 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65  p);.    Sqlitete
1c690 73 74 5f 6d 61 6c 6c 6f 63 5f 49 6e 69 74 28 69  st_malloc_Init(i
1c6a0 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69  nterp);.    Sqli
1c6b0 74 65 74 65 73 74 5f 6d 75 74 65 78 5f 49 6e 69  tetest_mutex_Ini
1c6c0 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53  t(interp);.    S
1c6d0 71 6c 69 74 65 74 65 73 74 73 63 68 65 6d 61 5f  qlitetestschema_
1c6e0 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  Init(interp);.  
1c6f0 20 20 53 71 6c 69 74 65 74 65 73 74 74 63 6c 76    Sqlitetesttclv
1c700 61 72 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b  ar_Init(interp);
1c710 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 54  .    SqlitetestT
1c720 68 72 65 61 64 5f 49 6e 69 74 28 69 6e 74 65 72  hread_Init(inter
1c730 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65  p);.    Sqlitete
1c740 73 74 4f 6e 65 66 69 6c 65 5f 49 6e 69 74 28 69  stOnefile_Init(i
1c750 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69  nterp);.    Sqli
1c760 74 65 74 65 73 74 4f 73 69 6e 73 74 5f 49 6e 69  tetestOsinst_Ini
1c770 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53  t(interp);.    S
1c780 71 6c 69 74 65 74 65 73 74 62 61 63 6b 75 70 5f  qlitetestbackup_
1c790 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  Init(interp);.  
1c7a0 20 20 53 71 6c 69 74 65 74 65 73 74 69 6e 74 61    Sqlitetestinta
1c7b0 72 72 61 79 5f 49 6e 69 74 28 69 6e 74 65 72 70  rray_Init(interp
1c7c0 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73  );.    Sqlitetes
1c7d0 74 76 66 73 5f 49 6e 69 74 28 69 6e 74 65 72 70  tvfs_Init(interp
1c7e0 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73  );.    Sqlitetes
1c7f0 74 53 74 61 74 5f 49 6e 69 74 28 69 6e 74 65 72  tStat_Init(inter
1c800 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65  p);.    Sqlitete
1c810 73 74 72 74 72 65 65 5f 49 6e 69 74 28 69 6e 74  strtree_Init(int
1c820 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65  erp);.    Sqlite
1c830 71 75 6f 74 61 5f 49 6e 69 74 28 69 6e 74 65 72  quota_Init(inter
1c840 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 6d 75  p);.    Sqlitemu
1c850 6c 74 69 70 6c 65 78 5f 49 6e 69 74 28 69 6e 74  ltiplex_Init(int
1c860 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65  erp);.    Sqlite
1c870 53 75 70 65 72 6c 6f 63 6b 5f 49 6e 69 74 28 69  Superlock_Init(i
1c880 6e 74 65 72 70 29 3b 0a 23 69 66 64 65 66 20 53  nterp);.#ifdef S
1c890 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45 53  QLITE_ENABLE_SES
1c8a0 53 49 4f 4e 0a 20 20 20 20 54 65 73 74 53 65 73  SION.    TestSes
1c8b0 73 69 6f 6e 5f 49 6e 69 74 28 69 6e 74 65 72 70  sion_Init(interp
1c8c0 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 54  );.#endif..    T
1c8d0 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d  cl_CreateObjComm
1c8e0 61 6e 64 28 69 6e 74 65 72 70 2c 22 6c 6f 61 64  and(interp,"load
1c8f0 5f 74 65 73 74 66 69 78 74 75 72 65 5f 65 78 74  _testfixture_ext
1c900 65 6e 73 69 6f 6e 73 22 2c 69 6e 69 74 5f 61 6c  ensions",init_al
1c910 6c 5f 63 6d 64 2c 30 2c 30 29 3b 0a 0a 23 69 66  l_cmd,0,0);..#if
1c920 64 65 66 20 53 51 4c 49 54 45 5f 53 53 45 0a 20  def SQLITE_SSE. 
1c930 20 20 20 53 71 6c 69 74 65 74 65 73 74 73 73 65     Sqlitetestsse
1c940 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 23  _Init(interp);.#
1c950 65 6e 64 69 66 0a 20 20 7d 0a 23 65 6e 64 69 66  endif.  }.#endif
1c960 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 54 43 4c 53  .}..#define TCLS
1c970 48 5f 4d 41 49 4e 20 6d 61 69 6e 20 20 20 2f 2a  H_MAIN main   /*
1c980 20 4e 65 65 64 65 64 20 74 6f 20 66 61 6b 65 20   Needed to fake 
1c990 6f 75 74 20 6d 6b 74 63 6c 61 70 70 20 2a 2f 0a  out mktclapp */.
1c9a0 69 6e 74 20 54 43 4c 53 48 5f 4d 41 49 4e 28 69  int TCLSH_MAIN(i
1c9b0 6e 74 20 61 72 67 63 2c 20 63 68 61 72 20 2a 2a  nt argc, char **
1c9c0 61 72 67 76 29 7b 0a 20 20 54 63 6c 5f 49 6e 74  argv){.  Tcl_Int
1c9d0 65 72 70 20 2a 69 6e 74 65 72 70 3b 0a 20 20 0a  erp *interp;.  .
1c9e0 20 20 2f 2a 20 43 61 6c 6c 20 73 71 6c 69 74 65    /* Call sqlite
1c9f0 33 5f 73 68 75 74 64 6f 77 6e 28 29 20 6f 6e 63  3_shutdown() onc
1ca00 65 20 62 65 66 6f 72 65 20 64 6f 69 6e 67 20 61  e before doing a
1ca10 6e 79 74 68 69 6e 67 20 65 6c 73 65 2e 20 54 68  nything else. Th
1ca20 69 73 20 69 73 20 74 6f 0a 20 20 2a 2a 20 74 65  is is to.  ** te
1ca30 73 74 20 74 68 61 74 20 73 71 6c 69 74 65 33 5f  st that sqlite3_
1ca40 73 68 75 74 64 6f 77 6e 28 29 20 63 61 6e 20 62  shutdown() can b
1ca50 65 20 73 61 66 65 6c 79 20 63 61 6c 6c 65 64 20  e safely called 
1ca60 62 79 20 61 20 70 72 6f 63 65 73 73 20 62 65 66  by a process bef
1ca70 6f 72 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33  ore.  ** sqlite3
1ca80 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 20 69 73  _initialize() is
1ca90 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73  . */.  sqlite3_s
1caa0 68 75 74 64 6f 77 6e 28 29 3b 0a 0a 23 69 66 20  hutdown();..#if 
1cab0 54 43 4c 53 48 3d 3d 32 0a 20 20 73 71 6c 69 74  TCLSH==2.  sqlit
1cac0 65 33 5f 63 6f 6e 66 69 67 28 53 51 4c 49 54 45  e3_config(SQLITE
1cad0 5f 43 4f 4e 46 49 47 5f 53 49 4e 47 4c 45 54 48  _CONFIG_SINGLETH
1cae0 52 45 41 44 29 3b 0a 23 65 6e 64 69 66 0a 20 20  READ);.#endif.  
1caf0 54 63 6c 5f 46 69 6e 64 45 78 65 63 75 74 61 62  Tcl_FindExecutab
1cb00 6c 65 28 61 72 67 76 5b 30 5d 29 3b 0a 0a 20 20  le(argv[0]);..  
1cb10 69 6e 74 65 72 70 20 3d 20 54 63 6c 5f 43 72 65  interp = Tcl_Cre
1cb20 61 74 65 49 6e 74 65 72 70 28 29 3b 0a 20 20 69  ateInterp();.  i
1cb30 6e 69 74 5f 61 6c 6c 28 69 6e 74 65 72 70 29 3b  nit_all(interp);
1cb40 0a 20 20 69 66 28 20 61 72 67 63 3e 3d 32 20 29  .  if( argc>=2 )
1cb50 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
1cb60 20 63 68 61 72 20 7a 41 72 67 63 5b 33 32 5d 3b   char zArgc[32];
1cb70 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
1cb80 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 41 72  rintf(sizeof(zAr
1cb90 67 63 29 2c 20 7a 41 72 67 63 2c 20 22 25 64 22  gc), zArgc, "%d"
1cba0 2c 20 61 72 67 63 2d 28 33 2d 54 43 4c 53 48 29  , argc-(3-TCLSH)
1cbb0 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 56 61  );.    Tcl_SetVa
1cbc0 72 28 69 6e 74 65 72 70 2c 22 61 72 67 63 22 2c  r(interp,"argc",
1cbd0 20 7a 41 72 67 63 2c 20 54 43 4c 5f 47 4c 4f 42   zArgc, TCL_GLOB
1cbe0 41 4c 5f 4f 4e 4c 59 29 3b 0a 20 20 20 20 54 63  AL_ONLY);.    Tc
1cbf0 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c  l_SetVar(interp,
1cc00 22 61 72 67 76 30 22 2c 61 72 67 76 5b 31 5d 2c  "argv0",argv[1],
1cc10 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29  TCL_GLOBAL_ONLY)
1cc20 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 56 61 72  ;.    Tcl_SetVar
1cc30 28 69 6e 74 65 72 70 2c 22 61 72 67 76 22 2c 20  (interp,"argv", 
1cc40 22 22 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f  "", TCL_GLOBAL_O
1cc50 4e 4c 59 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  NLY);.    for(i=
1cc60 33 2d 54 43 4c 53 48 3b 20 69 3c 61 72 67 63 3b  3-TCLSH; i<argc;
1cc70 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 54 63 6c   i++){.      Tcl
1cc80 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c 20  _SetVar(interp, 
1cc90 22 61 72 67 76 22 2c 20 61 72 67 76 5b 69 5d 2c  "argv", argv[i],
1cca0 0a 20 20 20 20 20 20 20 20 20 20 54 43 4c 5f 47  .          TCL_G
1ccb0 4c 4f 42 41 4c 5f 4f 4e 4c 59 20 7c 20 54 43 4c  LOBAL_ONLY | TCL
1ccc0 5f 4c 49 53 54 5f 45 4c 45 4d 45 4e 54 20 7c 20  _LIST_ELEMENT | 
1ccd0 54 43 4c 5f 41 50 50 45 4e 44 5f 56 41 4c 55 45  TCL_APPEND_VALUE
1cce0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
1ccf0 20 54 43 4c 53 48 3d 3d 31 20 26 26 20 54 63 6c   TCLSH==1 && Tcl
1cd00 5f 45 76 61 6c 46 69 6c 65 28 69 6e 74 65 72 70  _EvalFile(interp
1cd10 2c 20 61 72 67 76 5b 31 5d 29 21 3d 54 43 4c 5f  , argv[1])!=TCL_
1cd20 4f 4b 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73  OK ){.      cons
1cd30 74 20 63 68 61 72 20 2a 7a 49 6e 66 6f 20 3d 20  t char *zInfo = 
1cd40 54 63 6c 5f 47 65 74 56 61 72 28 69 6e 74 65 72  Tcl_GetVar(inter
1cd50 70 2c 20 22 65 72 72 6f 72 49 6e 66 6f 22 2c 20  p, "errorInfo", 
1cd60 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29  TCL_GLOBAL_ONLY)
1cd70 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 49 6e 66  ;.      if( zInf
1cd80 6f 3d 3d 30 20 29 20 7a 49 6e 66 6f 20 3d 20 54  o==0 ) zInfo = T
1cd90 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75  cl_GetStringResu
1cda0 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  lt(interp);.    
1cdb0 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
1cdc0 2c 22 25 73 3a 20 25 73 5c 6e 22 2c 20 2a 61 72  ,"%s: %s\n", *ar
1cdd0 67 76 2c 20 7a 49 6e 66 6f 29 3b 0a 20 20 20 20  gv, zInfo);.    
1cde0 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
1cdf0 7d 0a 20 20 7d 0a 20 20 69 66 28 20 54 43 4c 53  }.  }.  if( TCLS
1ce00 48 3d 3d 32 20 7c 7c 20 61 72 67 63 3c 3d 31 20  H==2 || argc<=1 
1ce10 29 7b 0a 20 20 20 20 54 63 6c 5f 47 6c 6f 62 61  ){.    Tcl_Globa
1ce20 6c 45 76 61 6c 28 69 6e 74 65 72 70 2c 20 7a 4d  lEval(interp, zM
1ce30 61 69 6e 6c 6f 6f 70 29 3b 0a 20 20 7d 0a 20 20  ainloop);.  }.  
1ce40 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64  return 0;.}.#end
1ce50 69 66 20 2f 2a 20 54 43 4c 53 48 20 2a 2f 0a     if /* TCLSH */.