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

Artifact b9615cb7f32113724f0b9e89dd1b2adc927991ae:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 41 20 54 43 4c 20  ******.** A TCL 
0180: 49 6e 74 65 72 66 61 63 65 20 74 6f 20 53 51 4c  Interface to SQL
0190: 69 74 65 2e 20 20 41 70 70 65 6e 64 20 74 68 69  ite.  Append thi
01a0: 73 20 66 69 6c 65 20 74 6f 20 73 71 6c 69 74 65  s file to sqlite
01b0: 33 2e 63 20 61 6e 64 0a 2a 2a 20 63 6f 6d 70 69  3.c and.** compi
01c0: 6c 65 20 74 68 65 20 77 68 6f 6c 65 20 74 68 69  le the whole thi
01d0: 6e 67 20 74 6f 20 62 75 69 6c 64 20 61 20 54 43  ng to build a TC
01e0: 4c 2d 65 6e 61 62 6c 65 64 20 76 65 72 73 69 6f  L-enabled versio
01f0: 6e 20 6f 66 20 53 51 4c 69 74 65 2e 0a 2a 2a 0a  n of SQLite..**.
0200: 2a 2a 20 43 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  ** Compile-time 
0210: 6f 70 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20  options:.**.**  
0220: 2d 44 54 43 4c 53 48 3d 31 20 20 20 20 20 20 20  -DTCLSH=1       
0230: 20 20 20 20 20 20 41 64 64 20 61 20 22 6d 61 69        Add a "mai
0240: 6e 28 29 22 20 72 6f 75 74 69 6e 65 20 74 68 61  n()" routine tha
0250: 74 20 77 6f 72 6b 73 20 61 73 20 61 20 74 63 6c  t works as a tcl
0260: 73 68 2e 0a 2a 2a 0a 2a 2a 20 20 2d 44 53 51 4c  sh..**.**  -DSQL
0270: 49 54 45 5f 54 43 4c 4d 44 35 20 20 20 20 20 20  ITE_TCLMD5      
0280: 20 57 68 65 6e 20 75 73 65 64 20 69 6e 20 63 6f   When used in co
0290: 6e 6a 75 63 74 69 6f 6e 20 77 69 74 68 20 2d 44  njuction with -D
02a0: 54 43 4c 53 48 3d 31 2c 20 61 64 64 0a 2a 2a 20  TCLSH=1, add.** 
02b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
02c0: 20 20 20 20 20 20 20 66 6f 75 72 20 6e 65 77 20         four new 
02d0: 63 6f 6d 6d 61 6e 64 73 20 74 6f 20 74 68 65 20  commands to the 
02e0: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
02f0: 66 6f 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  for.**          
0300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 67 65                ge
0310: 6e 65 72 61 74 69 6e 67 20 4d 44 35 20 63 68 65  nerating MD5 che
0320: 63 6b 73 75 6d 73 3a 20 20 6d 64 35 2c 20 6d 64  cksums:  md5, md
0330: 35 66 69 6c 65 2c 0a 2a 2a 20 20 20 20 20 20 20  5file,.**       
0340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0350: 20 6d 64 35 2d 31 30 78 38 2c 20 61 6e 64 20 6d   md5-10x8, and m
0360: 64 35 66 69 6c 65 2d 31 30 78 38 2e 0a 2a 2a 0a  d5file-10x8..**.
0370: 2a 2a 20 20 2d 44 53 51 4c 49 54 45 5f 54 45 53  **  -DSQLITE_TES
0380: 54 20 20 20 20 20 20 20 20 20 57 68 65 6e 20 75  T         When u
0390: 73 65 64 20 69 6e 20 63 6f 6e 6a 75 63 74 69 6f  sed in conjuctio
03a0: 6e 20 77 69 74 68 20 2d 44 54 43 4c 53 48 3d 31  n with -DTCLSH=1
03b0: 2c 20 61 64 64 0a 2a 2a 20 20 20 20 20 20 20 20  , add.**        
03c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
03d0: 68 75 6e 64 72 65 64 73 20 6f 66 20 6e 65 77 20  hundreds of new 
03e0: 63 6f 6d 6d 61 6e 64 73 20 75 73 65 64 20 66 6f  commands used fo
03f0: 72 20 74 65 73 74 69 6e 67 0a 2a 2a 20 20 20 20  r testing.**    
0400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0410: 20 20 20 20 53 51 4c 69 74 65 2e 20 20 54 68 69      SQLite.  Thi
0420: 73 20 6f 70 74 69 6f 6e 20 69 6d 70 6c 69 65 73  s option implies
0430: 20 2d 44 53 51 4c 49 54 45 5f 54 43 4c 4d 44 35   -DSQLITE_TCLMD5
0440: 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 74  ..*/.#include "t
0450: 63 6c 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c  cl.h".#include <
0460: 65 72 72 6e 6f 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20  errno.h>../*.** 
0470: 53 6f 6d 65 20 61 64 64 69 74 69 6f 6e 61 6c 20  Some additional 
0480: 69 6e 63 6c 75 64 65 20 66 69 6c 65 73 20 61 72  include files ar
0490: 65 20 6e 65 65 64 65 64 20 69 66 20 74 68 69 73  e needed if this
04a0: 20 66 69 6c 65 20 69 73 20 6e 6f 74 0a 2a 2a 20   file is not.** 
04b0: 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20  appended to the 
04c0: 61 6d 61 6c 67 61 6d 61 74 69 6f 6e 2e 0a 2a 2f  amalgamation..*/
04d0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
04e0: 41 4d 41 4c 47 41 4d 41 54 49 4f 4e 0a 23 20 69  AMALGAMATION.# i
04f0: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 33 2e  nclude "sqlite3.
0500: 68 22 0a 23 20 69 6e 63 6c 75 64 65 20 3c 73 74  h".# include <st
0510: 64 6c 69 62 2e 68 3e 0a 23 20 69 6e 63 6c 75 64  dlib.h>.# includ
0520: 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a 23 20 69  e <string.h>.# i
0530: 6e 63 6c 75 64 65 20 3c 61 73 73 65 72 74 2e 68  nclude <assert.h
0540: 3e 0a 20 20 74 79 70 65 64 65 66 20 75 6e 73 69  >.  typedef unsi
0550: 67 6e 65 64 20 63 68 61 72 20 75 38 3b 0a 23 65  gned char u8;.#e
0560: 6e 64 69 66 0a 23 69 6e 63 6c 75 64 65 20 3c 63  ndif.#include <c
0570: 74 79 70 65 2e 68 3e 0a 0a 2f 2a 0a 20 2a 20 57  type.h>../*. * W
0580: 69 6e 64 6f 77 73 20 6e 65 65 64 73 20 74 6f 20  indows needs to 
0590: 6b 6e 6f 77 20 77 68 69 63 68 20 73 79 6d 62 6f  know which symbo
05a0: 6c 73 20 74 6f 20 65 78 70 6f 72 74 2e 20 20 55  ls to export.  U
05b0: 6e 69 78 20 64 6f 65 73 20 6e 6f 74 2e 0a 20 2a  nix does not.. *
05c0: 20 42 55 49 4c 44 5f 73 71 6c 69 74 65 20 73 68   BUILD_sqlite sh
05d0: 6f 75 6c 64 20 62 65 20 75 6e 64 65 66 69 6e 65  ould be undefine
05e0: 64 20 66 6f 72 20 55 6e 69 78 2e 0a 20 2a 2f 0a  d for Unix.. */.
05f0: 23 69 66 64 65 66 20 42 55 49 4c 44 5f 73 71 6c  #ifdef BUILD_sql
0600: 69 74 65 0a 23 75 6e 64 65 66 20 54 43 4c 5f 53  ite.#undef TCL_S
0610: 54 4f 52 41 47 45 5f 43 4c 41 53 53 0a 23 64 65  TORAGE_CLASS.#de
0620: 66 69 6e 65 20 54 43 4c 5f 53 54 4f 52 41 47 45  fine TCL_STORAGE
0630: 5f 43 4c 41 53 53 20 44 4c 4c 45 58 50 4f 52 54  _CLASS DLLEXPORT
0640: 0a 23 65 6e 64 69 66 20 2f 2a 20 42 55 49 4c 44  .#endif /* BUILD
0650: 5f 73 71 6c 69 74 65 20 2a 2f 0a 0a 23 64 65 66  _sqlite */..#def
0660: 69 6e 65 20 4e 55 4d 5f 50 52 45 50 41 52 45 44  ine NUM_PREPARED
0670: 5f 53 54 4d 54 53 20 31 30 0a 23 64 65 66 69 6e  _STMTS 10.#defin
0680: 65 20 4d 41 58 5f 50 52 45 50 41 52 45 44 5f 53  e MAX_PREPARED_S
0690: 54 4d 54 53 20 31 30 30 0a 0a 2f 2a 0a 2a 2a 20  TMTS 100../*.** 
06a0: 49 66 20 54 43 4c 20 75 73 65 73 20 55 54 46 2d  If TCL uses UTF-
06b0: 38 20 61 6e 64 20 53 51 4c 69 74 65 20 69 73 20  8 and SQLite is 
06c0: 63 6f 6e 66 69 67 75 72 65 64 20 74 6f 20 75 73  configured to us
06d0: 65 20 69 73 6f 38 38 35 39 2c 20 74 68 65 6e 20  e iso8859, then 
06e0: 77 65 0a 2a 2a 20 68 61 76 65 20 74 6f 20 64 6f  we.** have to do
06f0: 20 61 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20 77   a translation w
0700: 68 65 6e 20 67 6f 69 6e 67 20 62 65 74 77 65 65  hen going betwee
0710: 6e 20 74 68 65 20 74 77 6f 2e 20 20 53 65 74 20  n the two.  Set 
0720: 74 68 65 20 0a 2a 2a 20 55 54 46 5f 54 52 41 4e  the .** UTF_TRAN
0730: 53 4c 41 54 49 4f 4e 5f 4e 45 45 44 45 44 20 6d  SLATION_NEEDED m
0740: 61 63 72 6f 20 74 6f 20 69 6e 64 69 63 61 74 65  acro to indicate
0750: 20 74 68 61 74 20 77 65 20 6e 65 65 64 20 74 6f   that we need to
0760: 20 64 6f 0a 2a 2a 20 74 68 69 73 20 74 72 61 6e   do.** this tran
0770: 73 6c 61 74 69 6f 6e 2e 20 20 0a 2a 2f 0a 23 69  slation.  .*/.#i
0780: 66 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 55 54  f defined(TCL_UT
0790: 46 5f 4d 41 58 29 20 26 26 20 21 64 65 66 69 6e  F_MAX) && !defin
07a0: 65 64 28 53 51 4c 49 54 45 5f 55 54 46 38 29 0a  ed(SQLITE_UTF8).
07b0: 23 20 64 65 66 69 6e 65 20 55 54 46 5f 54 52 41  # define UTF_TRA
07c0: 4e 53 4c 41 54 49 4f 4e 5f 4e 45 45 44 45 44 20  NSLATION_NEEDED 
07d0: 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  1.#endif../*.** 
07e0: 4e 65 77 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e  New SQL function
07f0: 73 20 63 61 6e 20 62 65 20 63 72 65 61 74 65 64  s can be created
0800: 20 61 73 20 54 43 4c 20 73 63 72 69 70 74 73 2e   as TCL scripts.
0810: 20 20 45 61 63 68 20 73 75 63 68 20 66 75 6e 63    Each such func
0820: 74 69 6f 6e 0a 2a 2a 20 69 73 20 64 65 73 63 72  tion.** is descr
0830: 69 62 65 64 20 62 79 20 61 6e 20 69 6e 73 74 61  ibed by an insta
0840: 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
0850: 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 0a  wing structure..
0860: 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
0870: 74 20 53 71 6c 46 75 6e 63 20 53 71 6c 46 75 6e  t SqlFunc SqlFun
0880: 63 3b 0a 73 74 72 75 63 74 20 53 71 6c 46 75 6e  c;.struct SqlFun
0890: 63 20 7b 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  c {.  Tcl_Interp
08a0: 20 2a 69 6e 74 65 72 70 3b 20 20 20 2f 2a 20 54   *interp;   /* T
08b0: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
08c0: 20 74 6f 20 65 78 65 63 75 74 65 20 74 68 65 20   to execute the 
08d0: 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63  function */.  Tc
08e0: 6c 5f 4f 62 6a 20 2a 70 53 63 72 69 70 74 3b 20  l_Obj *pScript; 
08f0: 20 20 20 20 2f 2a 20 54 68 65 20 54 63 6c 5f 4f      /* The Tcl_O
0900: 62 6a 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  bj representatio
0910: 6e 20 6f 66 20 74 68 65 20 73 63 72 69 70 74 20  n of the script 
0920: 2a 2f 0a 20 20 69 6e 74 20 75 73 65 45 76 61 6c  */.  int useEval
0930: 4f 62 6a 76 3b 20 20 20 20 20 20 2f 2a 20 54 72  Objv;      /* Tr
0940: 75 65 20 69 66 20 69 74 20 69 73 20 73 61 66 65  ue if it is safe
0950: 20 74 6f 20 75 73 65 20 54 63 6c 5f 45 76 61 6c   to use Tcl_Eval
0960: 4f 62 6a 76 20 2a 2f 0a 20 20 63 68 61 72 20 2a  Objv */.  char *
0970: 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  zName;          
0980: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 69 73 20  /* Name of this 
0990: 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 53 71  function */.  Sq
09a0: 6c 46 75 6e 63 20 2a 70 4e 65 78 74 3b 20 20 20  lFunc *pNext;   
09b0: 20 20 20 20 2f 2a 20 4e 65 78 74 20 66 75 6e 63      /* Next func
09c0: 74 69 6f 6e 20 6f 6e 20 74 68 65 20 6c 69 73 74  tion on the list
09d0: 20 6f 66 20 74 68 65 6d 20 61 6c 6c 20 2a 2f 0a   of them all */.
09e0: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4e 65 77 20 63 6f  };../*.** New co
09f0: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
0a00: 73 20 66 75 6e 63 74 69 6f 6e 20 63 61 6e 20 62  s function can b
0a10: 65 20 63 72 65 61 74 65 64 20 61 73 20 54 43 4c  e created as TCL
0a20: 20 73 63 72 69 70 74 73 2e 20 20 45 61 63 68 20   scripts.  Each 
0a30: 73 75 63 68 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  such.** function
0a40: 20 69 73 20 64 65 73 63 72 69 62 65 64 20 62 79   is described by
0a50: 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   an instance of 
0a60: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
0a70: 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 74 79 70 65  ructure..*/.type
0a80: 64 65 66 20 73 74 72 75 63 74 20 53 71 6c 43 6f  def struct SqlCo
0a90: 6c 6c 61 74 65 20 53 71 6c 43 6f 6c 6c 61 74 65  llate SqlCollate
0aa0: 3b 0a 73 74 72 75 63 74 20 53 71 6c 43 6f 6c 6c  ;.struct SqlColl
0ab0: 61 74 65 20 7b 0a 20 20 54 63 6c 5f 49 6e 74 65  ate {.  Tcl_Inte
0ac0: 72 70 20 2a 69 6e 74 65 72 70 3b 20 20 20 2f 2a  rp *interp;   /*
0ad0: 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
0ae0: 65 74 20 74 6f 20 65 78 65 63 75 74 65 20 74 68  et to execute th
0af0: 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  e function */.  
0b00: 63 68 61 72 20 2a 7a 53 63 72 69 70 74 3b 20 20  char *zScript;  
0b10: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 63 72        /* The scr
0b20: 69 70 74 20 74 6f 20 62 65 20 72 75 6e 20 2a 2f  ipt to be run */
0b30: 0a 20 20 53 71 6c 43 6f 6c 6c 61 74 65 20 2a 70  .  SqlCollate *p
0b40: 4e 65 78 74 3b 20 20 20 20 2f 2a 20 4e 65 78 74  Next;    /* Next
0b50: 20 66 75 6e 63 74 69 6f 6e 20 6f 6e 20 74 68 65   function on the
0b60: 20 6c 69 73 74 20 6f 66 20 74 68 65 6d 20 61 6c   list of them al
0b70: 6c 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 50  l */.};../*.** P
0b80: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
0b90: 74 73 20 61 72 65 20 63 61 63 68 65 64 20 66 6f  ts are cached fo
0ba0: 72 20 66 61 73 74 65 72 20 65 78 65 63 75 74 69  r faster executi
0bb0: 6f 6e 2e 20 20 45 61 63 68 20 70 72 65 70 61 72  on.  Each prepar
0bc0: 65 64 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20  ed.** statement 
0bd0: 69 73 20 64 65 73 63 72 69 62 65 64 20 62 79 20  is described by 
0be0: 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  an instance of t
0bf0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  he following str
0c00: 75 63 74 75 72 65 2e 0a 2a 2f 0a 74 79 70 65 64  ucture..*/.typed
0c10: 65 66 20 73 74 72 75 63 74 20 53 71 6c 50 72 65  ef struct SqlPre
0c20: 70 61 72 65 64 53 74 6d 74 20 53 71 6c 50 72 65  paredStmt SqlPre
0c30: 70 61 72 65 64 53 74 6d 74 3b 0a 73 74 72 75 63  paredStmt;.struc
0c40: 74 20 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d  t SqlPreparedStm
0c50: 74 20 7b 0a 20 20 53 71 6c 50 72 65 70 61 72 65  t {.  SqlPrepare
0c60: 64 53 74 6d 74 20 2a 70 4e 65 78 74 3b 20 20 2f  dStmt *pNext;  /
0c70: 2a 20 4e 65 78 74 20 69 6e 20 6c 69 6e 6b 65 64  * Next in linked
0c80: 20 6c 69 73 74 20 2a 2f 0a 20 20 53 71 6c 50 72   list */.  SqlPr
0c90: 65 70 61 72 65 64 53 74 6d 74 20 2a 70 50 72 65  eparedStmt *pPre
0ca0: 76 3b 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20  v;  /* Previous 
0cb0: 6f 6e 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a 20  on the list */. 
0cc0: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
0cd0: 53 74 6d 74 3b 20 20 20 20 20 2f 2a 20 54 68 65  Stmt;     /* The
0ce0: 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
0cf0: 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 71  ent */.  int nSq
0d00: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
0d10: 20 20 2f 2a 20 63 68 61 72 73 20 69 6e 20 7a 53    /* chars in zS
0d20: 71 6c 5b 5d 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ql[] */.  const 
0d30: 63 68 61 72 20 2a 7a 53 71 6c 3b 20 20 20 20 20  char *zSql;     
0d40: 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 74 68     /* Text of th
0d50: 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  e SQL statement 
0d60: 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 72 6d 3b 20  */.  int nParm; 
0d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
0d80: 20 53 69 7a 65 20 6f 66 20 61 70 50 61 72 6d 20   Size of apParm 
0d90: 61 72 72 61 79 20 2a 2f 0a 20 20 54 63 6c 5f 4f  array */.  Tcl_O
0da0: 62 6a 20 2a 2a 61 70 50 61 72 6d 3b 20 20 20 20  bj **apParm;    
0db0: 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
0dc0: 72 65 66 65 72 65 6e 63 65 64 20 6f 62 6a 65 63  referenced objec
0dd0: 74 20 70 6f 69 6e 74 65 72 73 20 2a 2f 0a 7d 3b  t pointers */.};
0de0: 0a 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  ..typedef struct
0df0: 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c   IncrblobChannel
0e00: 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c   IncrblobChannel
0e10: 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 72 65 20 69  ;../*.** There i
0e20: 73 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f  s one instance o
0e30: 66 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  f this structure
0e40: 20 66 6f 72 20 65 61 63 68 20 53 51 4c 69 74 65   for each SQLite
0e50: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 74 68 61   database.** tha
0e60: 74 20 68 61 73 20 62 65 65 6e 20 6f 70 65 6e 65  t has been opene
0e70: 64 20 62 79 20 74 68 65 20 53 51 4c 69 74 65 20  d by the SQLite 
0e80: 54 43 4c 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a  TCL interface..*
0e90: 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 6d 6f 64  *.** If this mod
0ea0: 75 6c 65 20 69 73 20 62 75 69 6c 74 20 77 69 74  ule is built wit
0eb0: 68 20 53 51 4c 49 54 45 5f 54 45 53 54 20 64 65  h SQLITE_TEST de
0ec0: 66 69 6e 65 64 20 28 74 6f 20 63 72 65 61 74 65  fined (to create
0ed0: 20 74 68 65 20 53 51 4c 69 74 65 0a 2a 2a 20 74   the SQLite.** t
0ee0: 65 73 74 66 69 78 74 75 72 65 20 65 78 65 63 75  estfixture execu
0ef0: 74 61 62 6c 65 29 2c 20 74 68 65 6e 20 69 74 20  table), then it 
0f00: 6d 61 79 20 62 65 20 63 6f 6e 66 69 67 75 72 65  may be configure
0f10: 64 20 74 6f 20 75 73 65 20 65 69 74 68 65 72 0a  d to use either.
0f20: 2a 2a 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61  ** sqlite3_prepa
0f30: 72 65 5f 76 32 28 29 20 6f 72 20 73 71 6c 69 74  re_v2() or sqlit
0f40: 65 33 5f 70 72 65 70 61 72 65 28 29 20 74 6f 20  e3_prepare() to 
0f50: 70 72 65 70 61 72 65 20 53 51 4c 20 73 74 61 74  prepare SQL stat
0f60: 65 6d 65 6e 74 73 2e 0a 2a 2a 20 49 66 20 53 71  ements..** If Sq
0f70: 6c 69 74 65 44 62 2e 62 4c 65 67 61 63 79 50 72  liteDb.bLegacyPr
0f80: 65 70 61 72 65 20 69 73 20 74 72 75 65 2c 20 73  epare is true, s
0f90: 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28 29  qlite3_prepare()
0fa0: 20 69 73 20 75 73 65 64 2e 0a 2a 2f 0a 74 79 70   is used..*/.typ
0fb0: 65 64 65 66 20 73 74 72 75 63 74 20 53 71 6c 69  edef struct Sqli
0fc0: 74 65 44 62 20 53 71 6c 69 74 65 44 62 3b 0a 73  teDb SqliteDb;.s
0fd0: 74 72 75 63 74 20 53 71 6c 69 74 65 44 62 20 7b  truct SqliteDb {
0fe0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20  .  sqlite3 *db; 
0ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1000: 20 54 68 65 20 22 72 65 61 6c 22 20 64 61 74 61   The "real" data
1010: 62 61 73 65 20 73 74 72 75 63 74 75 72 65 2e 20  base structure. 
1020: 4d 55 53 54 20 42 45 20 46 49 52 53 54 20 2a 2f  MUST BE FIRST */
1030: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
1040: 6e 74 65 72 70 3b 20 20 20 20 20 20 20 20 2f 2a  nterp;        /*
1050: 20 54 68 65 20 69 6e 74 65 72 70 72 65 74 65 72   The interpreter
1060: 20 75 73 65 64 20 66 6f 72 20 74 68 69 73 20 64   used for this d
1070: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 63 68 61  atabase */.  cha
1080: 72 20 2a 7a 42 75 73 79 3b 20 20 20 20 20 20 20  r *zBusy;       
1090: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62          /* The b
10a0: 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75  usy callback rou
10b0: 74 69 6e 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  tine */.  char *
10c0: 7a 43 6f 6d 6d 69 74 3b 20 20 20 20 20 20 20 20  zCommit;        
10d0: 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d 6d       /* The comm
10e0: 69 74 20 68 6f 6f 6b 20 63 61 6c 6c 62 61 63 6b  it hook callback
10f0: 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 63 68   routine */.  ch
1100: 61 72 20 2a 7a 54 72 61 63 65 3b 20 20 20 20 20  ar *zTrace;     
1110: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1120: 74 72 61 63 65 20 63 61 6c 6c 62 61 63 6b 20 72  trace callback r
1130: 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 63 68 61 72  outine */.  char
1140: 20 2a 7a 50 72 6f 66 69 6c 65 3b 20 20 20 20 20   *zProfile;     
1150: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 72         /* The pr
1160: 6f 66 69 6c 65 20 63 61 6c 6c 62 61 63 6b 20 72  ofile callback r
1170: 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 63 68 61 72  outine */.  char
1180: 20 2a 7a 50 72 6f 67 72 65 73 73 3b 20 20 20 20   *zProgress;    
1190: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 72         /* The pr
11a0: 6f 67 72 65 73 73 20 63 61 6c 6c 62 61 63 6b 20  ogress callback 
11b0: 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 63 68 61  routine */.  cha
11c0: 72 20 2a 7a 41 75 74 68 3b 20 20 20 20 20 20 20  r *zAuth;       
11d0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61          /* The a
11e0: 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 63 61 6c  uthorization cal
11f0: 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 20 2a 2f  lback routine */
1200: 0a 20 20 69 6e 74 20 64 69 73 61 62 6c 65 41 75  .  int disableAu
1210: 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  th;           /*
1220: 20 44 69 73 61 62 6c 65 20 74 68 65 20 61 75 74   Disable the aut
1230: 68 6f 72 69 7a 65 72 20 69 66 20 69 74 20 65 78  horizer if it ex
1240: 69 73 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ists */.  char *
1250: 7a 4e 75 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  zNull;          
1260: 20 20 20 20 20 2f 2a 20 54 65 78 74 20 74 6f 20       /* Text to 
1270: 73 75 62 73 74 69 74 75 74 65 20 66 6f 72 20 61  substitute for a
1280: 6e 20 53 51 4c 20 4e 55 4c 4c 20 76 61 6c 75 65  n SQL NULL value
1290: 20 2a 2f 0a 20 20 53 71 6c 46 75 6e 63 20 2a 70   */.  SqlFunc *p
12a0: 46 75 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20  Func;           
12b0: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 53 51 4c 20   /* List of SQL 
12c0: 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 54  functions */.  T
12d0: 63 6c 5f 4f 62 6a 20 2a 70 55 70 64 61 74 65 48  cl_Obj *pUpdateH
12e0: 6f 6f 6b 3b 20 20 20 20 20 20 2f 2a 20 55 70 64  ook;      /* Upd
12f0: 61 74 65 20 68 6f 6f 6b 20 73 63 72 69 70 74 20  ate hook script 
1300: 28 69 66 20 61 6e 79 29 20 2a 2f 0a 20 20 54 63  (if any) */.  Tc
1310: 6c 5f 4f 62 6a 20 2a 70 50 72 65 55 70 64 61 74  l_Obj *pPreUpdat
1320: 65 48 6f 6f 6b 3b 20 20 20 2f 2a 20 50 72 65 2d  eHook;   /* Pre-
1330: 75 70 64 61 74 65 20 68 6f 6f 6b 20 73 63 72 69  update hook scri
1340: 70 74 20 28 69 66 20 61 6e 79 29 20 2a 2f 0a 20  pt (if any) */. 
1350: 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 6f 6c 6c 62   Tcl_Obj *pRollb
1360: 61 63 6b 48 6f 6f 6b 3b 20 20 20 20 2f 2a 20 52  ackHook;    /* R
1370: 6f 6c 6c 62 61 63 6b 20 68 6f 6f 6b 20 73 63 72  ollback hook scr
1380: 69 70 74 20 28 69 66 20 61 6e 79 29 20 2a 2f 0a  ipt (if any) */.
1390: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 57 61 6c 48    Tcl_Obj *pWalH
13a0: 6f 6f 6b 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ook;         /* 
13b0: 57 41 4c 20 68 6f 6f 6b 20 73 63 72 69 70 74 20  WAL hook script 
13c0: 28 69 66 20 61 6e 79 29 20 2a 2f 0a 20 20 54 63  (if any) */.  Tc
13d0: 6c 5f 4f 62 6a 20 2a 70 55 6e 6c 6f 63 6b 4e 6f  l_Obj *pUnlockNo
13e0: 74 69 66 79 3b 20 20 20 20 2f 2a 20 55 6e 6c 6f  tify;    /* Unlo
13f0: 63 6b 20 6e 6f 74 69 66 79 20 73 63 72 69 70 74  ck notify script
1400: 20 28 69 66 20 61 6e 79 29 20 2a 2f 0a 20 20 53   (if any) */.  S
1410: 71 6c 43 6f 6c 6c 61 74 65 20 2a 70 43 6f 6c 6c  qlCollate *pColl
1420: 61 74 65 3b 20 20 20 20 20 20 2f 2a 20 4c 69 73  ate;      /* Lis
1430: 74 20 6f 66 20 53 51 4c 20 63 6f 6c 6c 61 74 69  t of SQL collati
1440: 6f 6e 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a  on functions */.
1450: 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
1460: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1470: 52 65 74 75 72 6e 20 63 6f 64 65 20 6f 66 20 6d  Return code of m
1480: 6f 73 74 20 72 65 63 65 6e 74 20 73 71 6c 69 74  ost recent sqlit
1490: 65 33 5f 65 78 65 63 28 29 20 2a 2f 0a 20 20 54  e3_exec() */.  T
14a0: 63 6c 5f 4f 62 6a 20 2a 70 43 6f 6c 6c 61 74 65  cl_Obj *pCollate
14b0: 4e 65 65 64 65 64 3b 20 20 20 2f 2a 20 43 6f 6c  Needed;   /* Col
14c0: 6c 61 74 69 6f 6e 20 6e 65 65 64 65 64 20 73 63  lation needed sc
14d0: 72 69 70 74 20 2a 2f 0a 20 20 53 71 6c 50 72 65  ript */.  SqlPre
14e0: 70 61 72 65 64 53 74 6d 74 20 2a 73 74 6d 74 4c  paredStmt *stmtL
14f0: 69 73 74 3b 20 2f 2a 20 4c 69 73 74 20 6f 66 20  ist; /* List of 
1500: 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
1510: 6e 74 73 2a 2f 0a 20 20 53 71 6c 50 72 65 70 61  nts*/.  SqlPrepa
1520: 72 65 64 53 74 6d 74 20 2a 73 74 6d 74 4c 61 73  redStmt *stmtLas
1530: 74 3b 20 2f 2a 20 4c 61 73 74 20 73 74 61 74 65  t; /* Last state
1540: 6d 65 6e 74 20 69 6e 20 74 68 65 20 6c 69 73 74  ment in the list
1550: 20 2a 2f 0a 20 20 69 6e 74 20 6d 61 78 53 74 6d   */.  int maxStm
1560: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
1570: 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 6d 61 78   /* The next max
1580: 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 73  imum number of s
1590: 74 6d 74 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74  tmtList */.  int
15a0: 20 6e 53 74 6d 74 3b 20 20 20 20 20 20 20 20 20   nStmt;         
15b0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
15c0: 72 20 6f 66 20 73 74 61 74 65 6d 65 6e 74 73 20  r of statements 
15d0: 69 6e 20 73 74 6d 74 4c 69 73 74 20 2a 2f 0a 20  in stmtList */. 
15e0: 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c   IncrblobChannel
15f0: 20 2a 70 49 6e 63 72 62 6c 6f 62 3b 2f 2a 20 4c   *pIncrblob;/* L
1600: 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 6f 70  inked list of op
1610: 65 6e 20 69 6e 63 72 62 6c 6f 62 20 63 68 61 6e  en incrblob chan
1620: 6e 65 6c 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53  nels */.  int nS
1630: 74 65 70 2c 20 6e 53 6f 72 74 2c 20 6e 49 6e 64  tep, nSort, nInd
1640: 65 78 3b 20 20 2f 2a 20 53 74 61 74 69 73 74 69  ex;  /* Statisti
1650: 63 73 20 66 6f 72 20 6d 6f 73 74 20 72 65 63 65  cs for most rece
1660: 6e 74 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a  nt operation */.
1670: 20 20 69 6e 74 20 6e 54 72 61 6e 73 61 63 74 69    int nTransacti
1680: 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  on;          /* 
1690: 4e 75 6d 62 65 72 20 6f 66 20 6e 65 73 74 65 64  Number of nested
16a0: 20 5b 74 72 61 6e 73 61 63 74 69 6f 6e 5d 20 6d   [transaction] m
16b0: 65 74 68 6f 64 73 20 2a 2f 0a 23 69 66 64 65 66  ethods */.#ifdef
16c0: 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69   SQLITE_TEST.  i
16d0: 6e 74 20 62 4c 65 67 61 63 79 50 72 65 70 61 72  nt bLegacyPrepar
16e0: 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75  e;        /* Tru
16f0: 65 20 74 6f 20 75 73 65 20 73 71 6c 69 74 65 33  e to use sqlite3
1700: 5f 70 72 65 70 61 72 65 28 29 20 2a 2f 0a 23 65  _prepare() */.#e
1710: 6e 64 69 66 0a 7d 3b 0a 0a 73 74 72 75 63 74 20  ndif.};..struct 
1720: 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20  IncrblobChannel 
1730: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62  {.  sqlite3_blob
1740: 20 2a 70 42 6c 6f 62 3b 20 20 20 20 20 20 2f 2a   *pBlob;      /*
1750: 20 73 71 6c 69 74 65 33 20 62 6c 6f 62 20 68 61   sqlite3 blob ha
1760: 6e 64 6c 65 20 2a 2f 0a 20 20 53 71 6c 69 74 65  ndle */.  Sqlite
1770: 44 62 20 2a 70 44 62 3b 20 20 20 20 20 20 20 20  Db *pDb;        
1780: 20 20 20 20 2f 2a 20 41 73 73 6f 63 69 61 74 65      /* Associate
1790: 64 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  d database conne
17a0: 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  ction */.  int i
17b0: 53 65 65 6b 3b 20 20 20 20 20 20 20 20 20 20 20  Seek;           
17c0: 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
17d0: 73 65 65 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 20  seek offset */. 
17e0: 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61   Tcl_Channel cha
17f0: 6e 6e 65 6c 3b 20 20 20 20 20 20 2f 2a 20 43 68  nnel;      /* Ch
1800: 61 6e 6e 65 6c 20 69 64 65 6e 74 69 66 69 65 72  annel identifier
1810: 20 2a 2f 0a 20 20 49 6e 63 72 62 6c 6f 62 43 68   */.  IncrblobCh
1820: 61 6e 6e 65 6c 20 2a 70 4e 65 78 74 3b 20 20 20  annel *pNext;   
1830: 2f 2a 20 4c 69 6e 6b 65 64 20 6c 69 73 74 20 6f  /* Linked list o
1840: 66 20 61 6c 6c 20 6f 70 65 6e 20 69 6e 63 72 62  f all open incrb
1850: 6c 6f 62 20 63 68 61 6e 6e 65 6c 73 20 2a 2f 0a  lob channels */.
1860: 20 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65    IncrblobChanne
1870: 6c 20 2a 70 50 72 65 76 3b 20 20 20 2f 2a 20 4c  l *pPrev;   /* L
1880: 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 61 6c  inked list of al
1890: 6c 20 6f 70 65 6e 20 69 6e 63 72 62 6c 6f 62 20  l open incrblob 
18a0: 63 68 61 6e 6e 65 6c 73 20 2a 2f 0a 7d 3b 0a 0a  channels */.};..
18b0: 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61 20  /*.** Compute a 
18c0: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 74 68  string length th
18d0: 61 74 20 69 73 20 6c 69 6d 69 74 65 64 20 74 6f  at is limited to
18e0: 20 77 68 61 74 20 63 61 6e 20 62 65 20 73 74 6f   what can be sto
18f0: 72 65 64 20 69 6e 0a 2a 2a 20 6c 6f 77 65 72 20  red in.** lower 
1900: 33 30 20 62 69 74 73 20 6f 66 20 61 20 33 32 2d  30 bits of a 32-
1910: 62 69 74 20 73 69 67 6e 65 64 20 69 6e 74 65 67  bit signed integ
1920: 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
1930: 74 20 73 74 72 6c 65 6e 33 30 28 63 6f 6e 73 74  t strlen30(const
1940: 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 63 6f 6e   char *z){.  con
1950: 73 74 20 63 68 61 72 20 2a 7a 32 20 3d 20 7a 3b  st char *z2 = z;
1960: 0a 20 20 77 68 69 6c 65 28 20 2a 7a 32 20 29 7b  .  while( *z2 ){
1970: 20 7a 32 2b 2b 3b 20 7d 0a 20 20 72 65 74 75 72   z2++; }.  retur
1980: 6e 20 30 78 33 66 66 66 66 66 66 66 20 26 20 28  n 0x3fffffff & (
1990: 69 6e 74 29 28 7a 32 20 2d 20 7a 29 3b 0a 7d 0a  int)(z2 - z);.}.
19a0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
19b0: 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 2f  _OMIT_INCRBLOB./
19c0: 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 69  *.** Close all i
19d0: 6e 63 72 62 6c 6f 62 20 63 68 61 6e 6e 65 6c 73  ncrblob channels
19e0: 20 6f 70 65 6e 65 64 20 75 73 69 6e 67 20 64 61   opened using da
19f0: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
1a00: 6e 20 70 44 62 2e 0a 2a 2a 20 54 68 69 73 20 69  n pDb..** This i
1a10: 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 73 68  s called when sh
1a20: 75 74 74 69 6e 67 20 64 6f 77 6e 20 74 68 65 20  utting down the 
1a30: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
1a40: 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ion..*/.static v
1a50: 6f 69 64 20 63 6c 6f 73 65 49 6e 63 72 62 6c 6f  oid closeIncrblo
1a60: 62 43 68 61 6e 6e 65 6c 73 28 53 71 6c 69 74 65  bChannels(Sqlite
1a70: 44 62 20 2a 70 44 62 29 7b 0a 20 20 49 6e 63 72  Db *pDb){.  Incr
1a80: 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 70 3b 0a  blobChannel *p;.
1a90: 20 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65    IncrblobChanne
1aa0: 6c 20 2a 70 4e 65 78 74 3b 0a 0a 20 20 66 6f 72  l *pNext;..  for
1ab0: 28 70 3d 70 44 62 2d 3e 70 49 6e 63 72 62 6c 6f  (p=pDb->pIncrblo
1ac0: 62 3b 20 70 3b 20 70 3d 70 4e 65 78 74 29 7b 0a  b; p; p=pNext){.
1ad0: 20 20 20 20 70 4e 65 78 74 20 3d 20 70 2d 3e 70      pNext = p->p
1ae0: 4e 65 78 74 3b 0a 0a 20 20 20 20 2f 2a 20 4e 6f  Next;..    /* No
1af0: 74 65 3a 20 43 61 6c 6c 69 6e 67 20 75 6e 72 65  te: Calling unre
1b00: 67 69 73 74 65 72 20 68 65 72 65 20 63 61 6c 6c  gister here call
1b10: 20 54 63 6c 5f 43 6c 6f 73 65 20 6f 6e 20 74 68   Tcl_Close on th
1b20: 65 20 69 6e 63 72 62 6c 6f 62 20 63 68 61 6e 6e  e incrblob chann
1b30: 65 6c 2c 20 0a 20 20 20 20 2a 2a 20 77 68 69 63  el, .    ** whic
1b40: 68 20 64 65 6c 65 74 65 73 20 74 68 65 20 49 6e  h deletes the In
1b50: 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 73 74  crblobChannel st
1b60: 72 75 63 74 75 72 65 20 61 74 20 2a 70 2e 20 53  ructure at *p. S
1b70: 6f 20 64 6f 20 6e 6f 74 0a 20 20 20 20 2a 2a 20  o do not.    ** 
1b80: 63 61 6c 6c 20 54 63 6c 5f 46 72 65 65 28 29 20  call Tcl_Free() 
1b90: 68 65 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  here..    */.   
1ba0: 20 54 63 6c 5f 55 6e 72 65 67 69 73 74 65 72 43   Tcl_UnregisterC
1bb0: 68 61 6e 6e 65 6c 28 70 44 62 2d 3e 69 6e 74 65  hannel(pDb->inte
1bc0: 72 70 2c 20 70 2d 3e 63 68 61 6e 6e 65 6c 29 3b  rp, p->channel);
1bd0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  .  }.}../*.** Cl
1be0: 6f 73 65 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74  ose an increment
1bf0: 61 6c 20 62 6c 6f 62 20 63 68 61 6e 6e 65 6c 2e  al blob channel.
1c00: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69  .*/.static int i
1c10: 6e 63 72 62 6c 6f 62 43 6c 6f 73 65 28 43 6c 69  ncrblobClose(Cli
1c20: 65 6e 74 44 61 74 61 20 69 6e 73 74 61 6e 63 65  entData instance
1c30: 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70  Data, Tcl_Interp
1c40: 20 2a 69 6e 74 65 72 70 29 7b 0a 20 20 49 6e 63   *interp){.  Inc
1c50: 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 70 20  rblobChannel *p 
1c60: 3d 20 28 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e  = (IncrblobChann
1c70: 65 6c 20 2a 29 69 6e 73 74 61 6e 63 65 44 61 74  el *)instanceDat
1c80: 61 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71  a;.  int rc = sq
1c90: 6c 69 74 65 33 5f 62 6c 6f 62 5f 63 6c 6f 73 65  lite3_blob_close
1ca0: 28 70 2d 3e 70 42 6c 6f 62 29 3b 0a 20 20 73 71  (p->pBlob);.  sq
1cb0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 70  lite3 *db = p->p
1cc0: 44 62 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 52 65  Db->db;..  /* Re
1cd0: 6d 6f 76 65 20 74 68 65 20 63 68 61 6e 6e 65 6c  move the channel
1ce0: 20 66 72 6f 6d 20 74 68 65 20 53 71 6c 69 74 65   from the Sqlite
1cf0: 44 62 2e 70 49 6e 63 72 62 6c 6f 62 20 6c 69 73  Db.pIncrblob lis
1d00: 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  t. */.  if( p->p
1d10: 4e 65 78 74 20 29 7b 0a 20 20 20 20 70 2d 3e 70  Next ){.    p->p
1d20: 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 2d  Next->pPrev = p-
1d30: 3e 70 50 72 65 76 3b 0a 20 20 7d 0a 20 20 69 66  >pPrev;.  }.  if
1d40: 28 20 70 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20  ( p->pPrev ){.  
1d50: 20 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78    p->pPrev->pNex
1d60: 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20  t = p->pNext;.  
1d70: 7d 0a 20 20 69 66 28 20 70 2d 3e 70 44 62 2d 3e  }.  if( p->pDb->
1d80: 70 49 6e 63 72 62 6c 6f 62 3d 3d 70 20 29 7b 0a  pIncrblob==p ){.
1d90: 20 20 20 20 70 2d 3e 70 44 62 2d 3e 70 49 6e 63      p->pDb->pInc
1da0: 72 62 6c 6f 62 20 3d 20 70 2d 3e 70 4e 65 78 74  rblob = p->pNext
1db0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 72 65 65  ;.  }..  /* Free
1dc0: 20 74 68 65 20 49 6e 63 72 62 6c 6f 62 43 68 61   the IncrblobCha
1dd0: 6e 6e 65 6c 20 73 74 72 75 63 74 75 72 65 20 2a  nnel structure *
1de0: 2f 0a 20 20 54 63 6c 5f 46 72 65 65 28 28 63 68  /.  Tcl_Free((ch
1df0: 61 72 20 2a 29 70 29 3b 0a 0a 20 20 69 66 28 20  ar *)p);..  if( 
1e00: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1e10: 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75  .    Tcl_SetResu
1e20: 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72  lt(interp, (char
1e30: 20 2a 29 73 71 6c 69 74 65 33 5f 65 72 72 6d 73   *)sqlite3_errms
1e40: 67 28 64 62 29 2c 20 54 43 4c 5f 56 4f 4c 41 54  g(db), TCL_VOLAT
1e50: 49 4c 45 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ILE);.    return
1e60: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
1e70: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
1e80: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 64  .}../*.** Read d
1e90: 61 74 61 20 66 72 6f 6d 20 61 6e 20 69 6e 63 72  ata from an incr
1ea0: 65 6d 65 6e 74 61 6c 20 62 6c 6f 62 20 63 68 61  emental blob cha
1eb0: 6e 6e 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  nnel..*/.static 
1ec0: 69 6e 74 20 69 6e 63 72 62 6c 6f 62 49 6e 70 75  int incrblobInpu
1ed0: 74 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20  t(.  ClientData 
1ee0: 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 20 0a 20  instanceData, . 
1ef0: 20 63 68 61 72 20 2a 62 75 66 2c 20 0a 20 20 69   char *buf, .  i
1f00: 6e 74 20 62 75 66 53 69 7a 65 2c 0a 20 20 69 6e  nt bufSize,.  in
1f10: 74 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 0a  t *errorCodePtr.
1f20: 29 7b 0a 20 20 49 6e 63 72 62 6c 6f 62 43 68 61  ){.  IncrblobCha
1f30: 6e 6e 65 6c 20 2a 70 20 3d 20 28 49 6e 63 72 62  nnel *p = (Incrb
1f40: 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 29 69 6e 73  lobChannel *)ins
1f50: 74 61 6e 63 65 44 61 74 61 3b 0a 20 20 69 6e 74  tanceData;.  int
1f60: 20 6e 52 65 61 64 20 3d 20 62 75 66 53 69 7a 65   nRead = bufSize
1f70: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  ;         /* Num
1f80: 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20  ber of bytes to 
1f90: 72 65 61 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 42  read */.  int nB
1fa0: 6c 6f 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  lob;            
1fb0: 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20         /* Total 
1fc0: 73 69 7a 65 20 6f 66 20 74 68 65 20 62 6c 6f 62  size of the blob
1fd0: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
1fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ff0: 20 20 20 2f 2a 20 73 71 6c 69 74 65 20 65 72 72     /* sqlite err
2000: 6f 72 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 6e 42  or code */..  nB
2010: 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c  lob = sqlite3_bl
2020: 6f 62 5f 62 79 74 65 73 28 70 2d 3e 70 42 6c 6f  ob_bytes(p->pBlo
2030: 62 29 3b 0a 20 20 69 66 28 20 28 70 2d 3e 69 53  b);.  if( (p->iS
2040: 65 65 6b 2b 6e 52 65 61 64 29 3e 6e 42 6c 6f 62  eek+nRead)>nBlob
2050: 20 29 7b 0a 20 20 20 20 6e 52 65 61 64 20 3d 20   ){.    nRead = 
2060: 6e 42 6c 6f 62 2d 70 2d 3e 69 53 65 65 6b 3b 0a  nBlob-p->iSeek;.
2070: 20 20 7d 0a 20 20 69 66 28 20 6e 52 65 61 64 3c    }.  if( nRead<
2080: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
2090: 20 30 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20   0;.  }..  rc = 
20a0: 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 72 65 61  sqlite3_blob_rea
20b0: 64 28 70 2d 3e 70 42 6c 6f 62 2c 20 28 76 6f 69  d(p->pBlob, (voi
20c0: 64 20 2a 29 62 75 66 2c 20 6e 52 65 61 64 2c 20  d *)buf, nRead, 
20d0: 70 2d 3e 69 53 65 65 6b 29 3b 0a 20 20 69 66 28  p->iSeek);.  if(
20e0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
20f0: 7b 0a 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65  {.    *errorCode
2100: 50 74 72 20 3d 20 72 63 3b 0a 20 20 20 20 72 65  Ptr = rc;.    re
2110: 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20  turn -1;.  }..  
2120: 70 2d 3e 69 53 65 65 6b 20 2b 3d 20 6e 52 65 61  p->iSeek += nRea
2130: 64 3b 0a 20 20 72 65 74 75 72 6e 20 6e 52 65 61  d;.  return nRea
2140: 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  d;.}../*.** Writ
2150: 65 20 64 61 74 61 20 74 6f 20 61 6e 20 69 6e 63  e data to an inc
2160: 72 65 6d 65 6e 74 61 6c 20 62 6c 6f 62 20 63 68  remental blob ch
2170: 61 6e 6e 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63  annel..*/.static
2180: 20 69 6e 74 20 69 6e 63 72 62 6c 6f 62 4f 75 74   int incrblobOut
2190: 70 75 74 28 0a 20 20 43 6c 69 65 6e 74 44 61 74  put(.  ClientDat
21a0: 61 20 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 20  a instanceData, 
21b0: 0a 20 20 43 4f 4e 53 54 20 63 68 61 72 20 2a 62  .  CONST char *b
21c0: 75 66 2c 20 0a 20 20 69 6e 74 20 74 6f 57 72 69  uf, .  int toWri
21d0: 74 65 2c 0a 20 20 69 6e 74 20 2a 65 72 72 6f 72  te,.  int *error
21e0: 43 6f 64 65 50 74 72 0a 29 7b 0a 20 20 49 6e 63  CodePtr.){.  Inc
21f0: 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 70 20  rblobChannel *p 
2200: 3d 20 28 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e  = (IncrblobChann
2210: 65 6c 20 2a 29 69 6e 73 74 61 6e 63 65 44 61 74  el *)instanceDat
2220: 61 3b 0a 20 20 69 6e 74 20 6e 57 72 69 74 65 20  a;.  int nWrite 
2230: 3d 20 74 6f 57 72 69 74 65 3b 20 20 20 20 20 20  = toWrite;      
2240: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
2250: 79 74 65 73 20 74 6f 20 77 72 69 74 65 20 2a 2f  ytes to write */
2260: 0a 20 20 69 6e 74 20 6e 42 6c 6f 62 3b 20 20 20  .  int nBlob;   
2270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2280: 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20 6f 66  /* Total size of
2290: 20 74 68 65 20 62 6c 6f 62 20 2a 2f 0a 20 20 69   the blob */.  i
22a0: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
22b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
22c0: 71 6c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  qlite error code
22d0: 20 2a 2f 0a 0a 20 20 6e 42 6c 6f 62 20 3d 20 73   */..  nBlob = s
22e0: 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 62 79 74 65  qlite3_blob_byte
22f0: 73 28 70 2d 3e 70 42 6c 6f 62 29 3b 0a 20 20 69  s(p->pBlob);.  i
2300: 66 28 20 28 70 2d 3e 69 53 65 65 6b 2b 6e 57 72  f( (p->iSeek+nWr
2310: 69 74 65 29 3e 6e 42 6c 6f 62 20 29 7b 0a 20 20  ite)>nBlob ){.  
2320: 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20    *errorCodePtr 
2330: 3d 20 45 49 4e 56 41 4c 3b 0a 20 20 20 20 72 65  = EINVAL;.    re
2340: 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 20 20 69  turn -1;.  }.  i
2350: 66 28 20 6e 57 72 69 74 65 3c 3d 30 20 29 7b 0a  f( nWrite<=0 ){.
2360: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
2370: 7d 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  }..  rc = sqlite
2380: 33 5f 62 6c 6f 62 5f 77 72 69 74 65 28 70 2d 3e  3_blob_write(p->
2390: 70 42 6c 6f 62 2c 20 28 76 6f 69 64 20 2a 29 62  pBlob, (void *)b
23a0: 75 66 2c 20 6e 57 72 69 74 65 2c 20 70 2d 3e 69  uf, nWrite, p->i
23b0: 53 65 65 6b 29 3b 0a 20 20 69 66 28 20 72 63 21  Seek);.  if( rc!
23c0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
23d0: 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20    *errorCodePtr 
23e0: 3d 20 45 49 4f 3b 0a 20 20 20 20 72 65 74 75 72  = EIO;.    retur
23f0: 6e 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 70 2d 3e  n -1;.  }..  p->
2400: 69 53 65 65 6b 20 2b 3d 20 6e 57 72 69 74 65 3b  iSeek += nWrite;
2410: 0a 20 20 72 65 74 75 72 6e 20 6e 57 72 69 74 65  .  return nWrite
2420: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20  ;.}../*.** Seek 
2430: 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 62  an incremental b
2440: 6c 6f 62 20 63 68 61 6e 6e 65 6c 2e 0a 2a 2f 0a  lob channel..*/.
2450: 73 74 61 74 69 63 20 69 6e 74 20 69 6e 63 72 62  static int incrb
2460: 6c 6f 62 53 65 65 6b 28 0a 20 20 43 6c 69 65 6e  lobSeek(.  Clien
2470: 74 44 61 74 61 20 69 6e 73 74 61 6e 63 65 44 61  tData instanceDa
2480: 74 61 2c 20 0a 20 20 6c 6f 6e 67 20 6f 66 66 73  ta, .  long offs
2490: 65 74 2c 0a 20 20 69 6e 74 20 73 65 65 6b 4d 6f  et,.  int seekMo
24a0: 64 65 2c 0a 20 20 69 6e 74 20 2a 65 72 72 6f 72  de,.  int *error
24b0: 43 6f 64 65 50 74 72 0a 29 7b 0a 20 20 49 6e 63  CodePtr.){.  Inc
24c0: 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 70 20  rblobChannel *p 
24d0: 3d 20 28 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e  = (IncrblobChann
24e0: 65 6c 20 2a 29 69 6e 73 74 61 6e 63 65 44 61 74  el *)instanceDat
24f0: 61 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 73 65  a;..  switch( se
2500: 65 6b 4d 6f 64 65 20 29 7b 0a 20 20 20 20 63 61  ekMode ){.    ca
2510: 73 65 20 53 45 45 4b 5f 53 45 54 3a 0a 20 20 20  se SEEK_SET:.   
2520: 20 20 20 70 2d 3e 69 53 65 65 6b 20 3d 20 6f 66     p->iSeek = of
2530: 66 73 65 74 3b 0a 20 20 20 20 20 20 62 72 65 61  fset;.      brea
2540: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 45 45 4b  k;.    case SEEK
2550: 5f 43 55 52 3a 0a 20 20 20 20 20 20 70 2d 3e 69  _CUR:.      p->i
2560: 53 65 65 6b 20 2b 3d 20 6f 66 66 73 65 74 3b 0a  Seek += offset;.
2570: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2580: 20 63 61 73 65 20 53 45 45 4b 5f 45 4e 44 3a 0a   case SEEK_END:.
2590: 20 20 20 20 20 20 70 2d 3e 69 53 65 65 6b 20 3d        p->iSeek =
25a0: 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 62 79   sqlite3_blob_by
25b0: 74 65 73 28 70 2d 3e 70 42 6c 6f 62 29 20 2b 20  tes(p->pBlob) + 
25c0: 6f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 62 72  offset;.      br
25d0: 65 61 6b 3b 0a 0a 20 20 20 20 64 65 66 61 75 6c  eak;..    defaul
25e0: 74 3a 20 61 73 73 65 72 74 28 21 22 42 61 64 20  t: assert(!"Bad 
25f0: 73 65 65 6b 4d 6f 64 65 22 29 3b 0a 20 20 7d 0a  seekMode");.  }.
2600: 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 69 53 65  .  return p->iSe
2610: 65 6b 3b 0a 7d 0a 0a 0a 73 74 61 74 69 63 20 76  ek;.}...static v
2620: 6f 69 64 20 69 6e 63 72 62 6c 6f 62 57 61 74 63  oid incrblobWatc
2630: 68 28 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73  h(ClientData ins
2640: 74 61 6e 63 65 44 61 74 61 2c 20 69 6e 74 20 6d  tanceData, int m
2650: 6f 64 65 29 7b 20 0a 20 20 2f 2a 20 4e 4f 2d 4f  ode){ .  /* NO-O
2660: 50 20 2a 2f 20 0a 7d 0a 73 74 61 74 69 63 20 69  P */ .}.static i
2670: 6e 74 20 69 6e 63 72 62 6c 6f 62 48 61 6e 64 6c  nt incrblobHandl
2680: 65 28 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73  e(ClientData ins
2690: 74 61 6e 63 65 44 61 74 61 2c 20 69 6e 74 20 64  tanceData, int d
26a0: 69 72 2c 20 43 6c 69 65 6e 74 44 61 74 61 20 2a  ir, ClientData *
26b0: 68 50 74 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  hPtr){.  return 
26c0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 73 74  TCL_ERROR;.}..st
26d0: 61 74 69 63 20 54 63 6c 5f 43 68 61 6e 6e 65 6c  atic Tcl_Channel
26e0: 54 79 70 65 20 49 6e 63 72 62 6c 6f 62 43 68 61  Type IncrblobCha
26f0: 6e 6e 65 6c 54 79 70 65 20 3d 20 7b 0a 20 20 22  nnelType = {.  "
2700: 69 6e 63 72 62 6c 6f 62 22 2c 20 20 20 20 20 20  incrblob",      
2710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2720: 20 20 2f 2a 20 74 79 70 65 4e 61 6d 65 20 20 20    /* typeName   
2730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2740: 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 54            */.  T
2750: 43 4c 5f 43 48 41 4e 4e 45 4c 5f 56 45 52 53 49  CL_CHANNEL_VERSI
2760: 4f 4e 5f 32 2c 20 20 20 20 20 20 20 20 20 20 20  ON_2,           
2770: 20 20 2f 2a 20 76 65 72 73 69 6f 6e 20 20 20 20    /* version    
2780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2790: 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 69            */.  i
27a0: 6e 63 72 62 6c 6f 62 43 6c 6f 73 65 2c 20 20 20  ncrblobClose,   
27b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27c0: 20 20 2f 2a 20 63 6c 6f 73 65 50 72 6f 63 20 20    /* closeProc  
27d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27e0: 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 69            */.  i
27f0: 6e 63 72 62 6c 6f 62 49 6e 70 75 74 2c 20 20 20  ncrblobInput,   
2800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2810: 20 20 2f 2a 20 69 6e 70 75 74 50 72 6f 63 20 20    /* inputProc  
2820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2830: 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 69            */.  i
2840: 6e 63 72 62 6c 6f 62 4f 75 74 70 75 74 2c 20 20  ncrblobOutput,  
2850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2860: 20 20 2f 2a 20 6f 75 74 70 75 74 50 72 6f 63 20    /* outputProc 
2870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2880: 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 69            */.  i
2890: 6e 63 72 62 6c 6f 62 53 65 65 6b 2c 20 20 20 20  ncrblobSeek,    
28a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b0: 20 20 2f 2a 20 73 65 65 6b 50 72 6f 63 20 20 20    /* seekProc   
28c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28d0: 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 30            */.  0
28e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
28f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2900: 20 20 2f 2a 20 73 65 74 4f 70 74 69 6f 6e 50 72    /* setOptionPr
2910: 6f 63 20 20 20 20 20 20 20 20 20 20 20 20 20 20  oc              
2920: 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 30            */.  0
2930: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2950: 20 20 2f 2a 20 67 65 74 4f 70 74 69 6f 6e 50 72    /* getOptionPr
2960: 6f 63 20 20 20 20 20 20 20 20 20 20 20 20 20 20  oc              
2970: 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 69            */.  i
2980: 6e 63 72 62 6c 6f 62 57 61 74 63 68 2c 20 20 20  ncrblobWatch,   
2990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29a0: 20 20 2f 2a 20 77 61 74 63 68 50 72 6f 63 20 28    /* watchProc (
29b0: 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 29  this is a no-op)
29c0: 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 69            */.  i
29d0: 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 2c 20 20  ncrblobHandle,  
29e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29f0: 20 20 2f 2a 20 67 65 74 48 61 6e 64 6c 65 50 72    /* getHandlePr
2a00: 6f 63 20 28 61 6c 77 61 79 73 20 72 65 74 75 72  oc (always retur
2a10: 6e 73 20 65 72 72 6f 72 29 20 2a 2f 0a 20 20 30  ns error) */.  0
2a20: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a40: 20 20 2f 2a 20 63 6c 6f 73 65 32 50 72 6f 63 20    /* close2Proc 
2a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a60: 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 30            */.  0
2a70: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a90: 20 20 2f 2a 20 62 6c 6f 63 6b 4d 6f 64 65 50 72    /* blockModePr
2aa0: 6f 63 20 20 20 20 20 20 20 20 20 20 20 20 20 20  oc              
2ab0: 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 30            */.  0
2ac0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ae0: 20 20 2f 2a 20 66 6c 75 73 68 50 72 6f 63 20 20    /* flushProc  
2af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b00: 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 30            */.  0
2b10: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b30: 20 20 2f 2a 20 68 61 6e 64 6c 65 72 50 72 6f 63    /* handlerProc
2b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b50: 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 30            */.  0
2b60: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b80: 20 20 2f 2a 20 77 69 64 65 53 65 65 6b 50 72 6f    /* wideSeekPro
2b90: 63 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c               
2ba0: 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 7d 3b 0a            */.};.
2bb0: 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
2bc0: 6e 65 77 20 69 6e 63 72 62 6c 6f 62 20 63 68 61  new incrblob cha
2bd0: 6e 6e 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  nnel..*/.static 
2be0: 69 6e 74 20 63 72 65 61 74 65 49 6e 63 72 62 6c  int createIncrbl
2bf0: 6f 62 43 68 61 6e 6e 65 6c 28 0a 20 20 54 63 6c  obChannel(.  Tcl
2c00: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
2c10: 20 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44   .  SqliteDb *pD
2c20: 62 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  b, .  const char
2c30: 20 2a 7a 44 62 2c 0a 20 20 63 6f 6e 73 74 20 63   *zDb,.  const c
2c40: 68 61 72 20 2a 7a 54 61 62 6c 65 2c 20 0a 20 20  har *zTable, .  
2c50: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c  const char *zCol
2c60: 75 6d 6e 2c 20 0a 20 20 73 71 6c 69 74 65 5f 69  umn, .  sqlite_i
2c70: 6e 74 36 34 20 69 52 6f 77 2c 0a 20 20 69 6e 74  nt64 iRow,.  int
2c80: 20 69 73 52 65 61 64 6f 6e 6c 79 0a 29 7b 0a 20   isReadonly.){. 
2c90: 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c   IncrblobChannel
2ca0: 20 2a 70 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a   *p;.  sqlite3 *
2cb0: 64 62 20 3d 20 70 44 62 2d 3e 64 62 3b 0a 20 20  db = pDb->db;.  
2cc0: 73 71 6c 69 74 65 33 5f 62 6c 6f 62 20 2a 70 42  sqlite3_blob *pB
2cd0: 6c 6f 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  lob;.  int rc;. 
2ce0: 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 54 43 4c   int flags = TCL
2cf0: 5f 52 45 41 44 41 42 4c 45 7c 28 69 73 52 65 61  _READABLE|(isRea
2d00: 64 6f 6e 6c 79 20 3f 20 30 20 3a 20 54 43 4c 5f  donly ? 0 : TCL_
2d10: 57 52 49 54 41 42 4c 45 29 3b 0a 0a 20 20 2f 2a  WRITABLE);..  /*
2d20: 20 54 68 69 73 20 76 61 72 69 61 62 6c 65 20 69   This variable i
2d30: 73 20 75 73 65 64 20 74 6f 20 6e 61 6d 65 20 74  s used to name t
2d40: 68 65 20 63 68 61 6e 6e 65 6c 73 3a 20 22 69 6e  he channels: "in
2d50: 63 72 62 6c 6f 62 5f 5b 69 6e 63 72 20 63 6f 75  crblob_[incr cou
2d60: 6e 74 5d 22 20 2a 2f 0a 20 20 73 74 61 74 69 63  nt]" */.  static
2d70: 20 69 6e 74 20 63 6f 75 6e 74 20 3d 20 30 3b 0a   int count = 0;.
2d80: 20 20 63 68 61 72 20 7a 43 68 61 6e 6e 65 6c 5b    char zChannel[
2d90: 36 34 5d 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c  64];..  rc = sql
2da0: 69 74 65 33 5f 62 6c 6f 62 5f 6f 70 65 6e 28 64  ite3_blob_open(d
2db0: 62 2c 20 7a 44 62 2c 20 7a 54 61 62 6c 65 2c 20  b, zDb, zTable, 
2dc0: 7a 43 6f 6c 75 6d 6e 2c 20 69 52 6f 77 2c 20 21  zColumn, iRow, !
2dd0: 69 73 52 65 61 64 6f 6e 6c 79 2c 20 26 70 42 6c  isReadonly, &pBl
2de0: 6f 62 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ob);.  if( rc!=S
2df0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2e00: 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
2e10: 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 73 71  terp, (char *)sq
2e20: 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62  lite3_errmsg(pDb
2e30: 2d 3e 64 62 29 2c 20 54 43 4c 5f 56 4f 4c 41 54  ->db), TCL_VOLAT
2e40: 49 4c 45 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ILE);.    return
2e50: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
2e60: 0a 20 20 70 20 3d 20 28 49 6e 63 72 62 6c 6f 62  .  p = (Incrblob
2e70: 43 68 61 6e 6e 65 6c 20 2a 29 54 63 6c 5f 41 6c  Channel *)Tcl_Al
2e80: 6c 6f 63 28 73 69 7a 65 6f 66 28 49 6e 63 72 62  loc(sizeof(Incrb
2e90: 6c 6f 62 43 68 61 6e 6e 65 6c 29 29 3b 0a 20 20  lobChannel));.  
2ea0: 70 2d 3e 69 53 65 65 6b 20 3d 20 30 3b 0a 20 20  p->iSeek = 0;.  
2eb0: 70 2d 3e 70 42 6c 6f 62 20 3d 20 70 42 6c 6f 62  p->pBlob = pBlob
2ec0: 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  ;..  sqlite3_snp
2ed0: 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 43 68  rintf(sizeof(zCh
2ee0: 61 6e 6e 65 6c 29 2c 20 7a 43 68 61 6e 6e 65 6c  annel), zChannel
2ef0: 2c 20 22 69 6e 63 72 62 6c 6f 62 5f 25 64 22 2c  , "incrblob_%d",
2f00: 20 2b 2b 63 6f 75 6e 74 29 3b 0a 20 20 70 2d 3e   ++count);.  p->
2f10: 63 68 61 6e 6e 65 6c 20 3d 20 54 63 6c 5f 43 72  channel = Tcl_Cr
2f20: 65 61 74 65 43 68 61 6e 6e 65 6c 28 26 49 6e 63  eateChannel(&Inc
2f30: 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 54 79 70 65  rblobChannelType
2f40: 2c 20 7a 43 68 61 6e 6e 65 6c 2c 20 70 2c 20 66  , zChannel, p, f
2f50: 6c 61 67 73 29 3b 0a 20 20 54 63 6c 5f 52 65 67  lags);.  Tcl_Reg
2f60: 69 73 74 65 72 43 68 61 6e 6e 65 6c 28 69 6e 74  isterChannel(int
2f70: 65 72 70 2c 20 70 2d 3e 63 68 61 6e 6e 65 6c 29  erp, p->channel)
2f80: 3b 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65  ;..  /* Link the
2f90: 20 6e 65 77 20 63 68 61 6e 6e 65 6c 20 69 6e 74   new channel int
2fa0: 6f 20 74 68 65 20 53 71 6c 69 74 65 44 62 2e 70  o the SqliteDb.p
2fb0: 49 6e 63 72 62 6c 6f 62 20 6c 69 73 74 2e 20 2a  Incrblob list. *
2fc0: 2f 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70  /.  p->pNext = p
2fd0: 44 62 2d 3e 70 49 6e 63 72 62 6c 6f 62 3b 0a 20  Db->pIncrblob;. 
2fe0: 20 70 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20   p->pPrev = 0;. 
2ff0: 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 7b   if( p->pNext ){
3000: 0a 20 20 20 20 70 2d 3e 70 4e 65 78 74 2d 3e 70  .    p->pNext->p
3010: 50 72 65 76 20 3d 20 70 3b 0a 20 20 7d 0a 20 20  Prev = p;.  }.  
3020: 70 44 62 2d 3e 70 49 6e 63 72 62 6c 6f 62 20 3d  pDb->pIncrblob =
3030: 20 70 3b 0a 20 20 70 2d 3e 70 44 62 20 3d 20 70   p;.  p->pDb = p
3040: 44 62 3b 0a 0a 20 20 54 63 6c 5f 53 65 74 52 65  Db;..  Tcl_SetRe
3050: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68  sult(interp, (ch
3060: 61 72 20 2a 29 54 63 6c 5f 47 65 74 43 68 61 6e  ar *)Tcl_GetChan
3070: 6e 65 6c 4e 61 6d 65 28 70 2d 3e 63 68 61 6e 6e  nelName(p->chann
3080: 65 6c 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c  el), TCL_VOLATIL
3090: 45 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  E);.  return TCL
30a0: 5f 4f 4b 3b 0a 7d 0a 23 65 6c 73 65 20 20 2f 2a  _OK;.}.#else  /*
30b0: 20 65 6c 73 65 20 63 6c 61 75 73 65 20 66 6f 72   else clause for
30c0: 20 22 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45   "#ifndef SQLITE
30d0: 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 22 20  _OMIT_INCRBLOB" 
30e0: 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 63 6c 6f  */.  #define clo
30f0: 73 65 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65  seIncrblobChanne
3100: 6c 73 28 70 44 62 29 0a 23 65 6e 64 69 66 0a 0a  ls(pDb).#endif..
3110: 2f 2a 0a 2a 2a 20 4c 6f 6f 6b 20 61 74 20 74 68  /*.** Look at th
3120: 65 20 73 63 72 69 70 74 20 70 72 65 66 69 78 20  e script prefix 
3130: 69 6e 20 70 43 6d 64 2e 20 20 57 65 20 77 69 6c  in pCmd.  We wil
3140: 6c 20 62 65 20 65 78 65 63 75 74 69 6e 67 20 74  l be executing t
3150: 68 69 73 20 73 63 72 69 70 74 0a 2a 2a 20 61 66  his script.** af
3160: 74 65 72 20 66 69 72 73 74 20 61 70 70 65 6e 64  ter first append
3170: 69 6e 67 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  ing one or more 
3180: 61 72 67 75 6d 65 6e 74 73 2e 20 20 54 68 69 73  arguments.  This
3190: 20 72 6f 75 74 69 6e 65 20 61 6e 61 6c 79 7a 65   routine analyze
31a0: 73 0a 2a 2a 20 74 68 65 20 73 63 72 69 70 74 20  s.** the script 
31b0: 74 6f 20 73 65 65 20 69 66 20 69 74 20 69 73 20  to see if it is 
31c0: 73 61 66 65 20 74 6f 20 75 73 65 20 54 63 6c 5f  safe to use Tcl_
31d0: 45 76 61 6c 4f 62 6a 76 28 29 20 6f 6e 20 74 68  EvalObjv() on th
31e0: 65 20 73 63 72 69 70 74 0a 2a 2a 20 72 61 74 68  e script.** rath
31f0: 65 72 20 74 68 61 6e 20 74 68 65 20 6d 6f 72 65  er than the more
3200: 20 67 65 6e 65 72 61 6c 20 54 63 6c 5f 45 76 61   general Tcl_Eva
3210: 6c 45 78 28 29 2e 20 20 54 63 6c 5f 45 76 61 6c  lEx().  Tcl_Eval
3220: 4f 62 6a 76 28 29 20 69 73 20 6d 75 63 68 0a 2a  Objv() is much.*
3230: 2a 20 66 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20  * faster..**.** 
3240: 53 63 72 69 70 74 73 20 74 68 61 74 20 61 72 65  Scripts that are
3250: 20 73 61 66 65 20 74 6f 20 75 73 65 20 77 69 74   safe to use wit
3260: 68 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 76 28 29  h Tcl_EvalObjv()
3270: 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 0a 2a   consists of a.*
3280: 2a 20 63 6f 6d 6d 61 6e 64 20 6e 61 6d 65 20 66  * command name f
3290: 6f 6c 6c 6f 77 65 64 20 62 79 20 7a 65 72 6f 20  ollowed by zero 
32a0: 6f 72 20 6d 6f 72 65 20 61 72 67 75 6d 65 6e 74  or more argument
32b0: 73 20 77 69 74 68 20 6e 6f 20 5b 2e 2e 2e 5d 20  s with no [...] 
32c0: 6f 72 20 24 0a 2a 2a 20 6f 72 20 7b 2e 2e 2e 7d  or $.** or {...}
32d0: 20 6f 72 20 3b 20 74 6f 20 62 65 20 73 65 65 6e   or ; to be seen
32e0: 20 61 6e 79 77 68 65 72 65 2e 20 20 4d 6f 73 74   anywhere.  Most
32f0: 20 63 61 6c 6c 62 61 63 6b 20 73 63 72 69 70 74   callback script
3300: 73 20 63 6f 6e 73 69 73 74 0a 2a 2a 20 6f 66 20  s consist.** of 
3310: 6a 75 73 74 20 61 20 73 69 6e 67 6c 65 20 70 72  just a single pr
3320: 6f 63 65 64 75 72 65 20 6e 61 6d 65 20 61 6e 64  ocedure name and
3330: 20 74 68 65 79 20 6d 65 65 74 20 74 68 69 73 20   they meet this 
3340: 72 65 71 75 69 72 65 6d 65 6e 74 2e 0a 2a 2f 0a  requirement..*/.
3350: 73 74 61 74 69 63 20 69 6e 74 20 73 61 66 65 54  static int safeT
3360: 6f 55 73 65 45 76 61 6c 4f 62 6a 76 28 54 63 6c  oUseEvalObjv(Tcl
3370: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
3380: 20 54 63 6c 5f 4f 62 6a 20 2a 70 43 6d 64 29 7b   Tcl_Obj *pCmd){
3390: 0a 20 20 2f 2a 20 57 65 20 63 6f 75 6c 64 20 74  .  /* We could t
33a0: 72 79 20 74 6f 20 64 6f 20 73 6f 6d 65 74 68 69  ry to do somethi
33b0: 6e 67 20 77 69 74 68 20 54 63 6c 5f 50 61 72 73  ng with Tcl_Pars
33c0: 65 28 29 2e 20 20 42 75 74 20 77 65 20 77 69 6c  e().  But we wil
33d0: 6c 20 69 6e 73 74 65 61 64 0a 20 20 2a 2a 20 6a  l instead.  ** j
33e0: 75 73 74 20 64 6f 20 61 20 73 65 61 72 63 68 20  ust do a search 
33f0: 66 6f 72 20 66 6f 72 62 69 64 64 65 6e 20 63 68  for forbidden ch
3400: 61 72 61 63 74 65 72 73 2e 20 20 49 66 20 61 6e  aracters.  If an
3410: 79 20 6f 66 20 74 68 65 20 66 6f 72 62 69 64 64  y of the forbidd
3420: 65 6e 0a 20 20 2a 2a 20 63 68 61 72 61 63 74 65  en.  ** characte
3430: 72 73 20 61 70 70 65 61 72 20 69 6e 20 70 43 6d  rs appear in pCm
3440: 64 2c 20 77 65 20 77 69 6c 6c 20 72 65 70 6f 72  d, we will repor
3450: 74 20 74 68 65 20 73 74 72 69 6e 67 20 61 73 20  t the string as 
3460: 75 6e 73 61 66 65 2e 0a 20 20 2a 2f 0a 20 20 63  unsafe..  */.  c
3470: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20  onst char *z;.  
3480: 69 6e 74 20 6e 3b 0a 20 20 7a 20 3d 20 54 63 6c  int n;.  z = Tcl
3490: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
34a0: 6a 28 70 43 6d 64 2c 20 26 6e 29 3b 0a 20 20 77  j(pCmd, &n);.  w
34b0: 68 69 6c 65 28 20 6e 2d 2d 20 3e 20 30 20 29 7b  hile( n-- > 0 ){
34c0: 0a 20 20 20 20 69 6e 74 20 63 20 3d 20 2a 28 7a  .    int c = *(z
34d0: 2b 2b 29 3b 0a 20 20 20 20 69 66 28 20 63 3d 3d  ++);.    if( c==
34e0: 27 24 27 20 7c 7c 20 63 3d 3d 27 5b 27 20 7c 7c  '$' || c=='[' ||
34f0: 20 63 3d 3d 27 3b 27 20 29 20 72 65 74 75 72 6e   c==';' ) return
3500: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
3510: 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e   1;.}../*.** Fin
3520: 64 20 61 6e 20 53 71 6c 46 75 6e 63 20 73 74 72  d an SqlFunc str
3530: 75 63 74 75 72 65 20 77 69 74 68 20 74 68 65 20  ucture with the 
3540: 67 69 76 65 6e 20 6e 61 6d 65 2e 20 20 4f 72 20  given name.  Or 
3550: 63 72 65 61 74 65 20 61 20 6e 65 77 0a 2a 2a 20  create a new.** 
3560: 6f 6e 65 20 69 66 20 61 6e 20 65 78 69 73 74 69  one if an existi
3570: 6e 67 20 6f 6e 65 20 63 61 6e 6e 6f 74 20 62 65  ng one cannot be
3580: 20 66 6f 75 6e 64 2e 20 20 52 65 74 75 72 6e 20   found.  Return 
3590: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
35a0: 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  .** structure..*
35b0: 2f 0a 73 74 61 74 69 63 20 53 71 6c 46 75 6e 63  /.static SqlFunc
35c0: 20 2a 66 69 6e 64 53 71 6c 46 75 6e 63 28 53 71   *findSqlFunc(Sq
35d0: 6c 69 74 65 44 62 20 2a 70 44 62 2c 20 63 6f 6e  liteDb *pDb, con
35e0: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b  st char *zName){
35f0: 0a 20 20 53 71 6c 46 75 6e 63 20 2a 70 2c 20 2a  .  SqlFunc *p, *
3600: 70 4e 65 77 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  pNew;.  int i;. 
3610: 20 70 4e 65 77 20 3d 20 28 53 71 6c 46 75 6e 63   pNew = (SqlFunc
3620: 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28 20 73 69 7a  *)Tcl_Alloc( siz
3630: 65 6f 66 28 2a 70 4e 65 77 29 20 2b 20 73 74 72  eof(*pNew) + str
3640: 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 20 2b 20 31  len30(zName) + 1
3650: 20 29 3b 0a 20 20 70 4e 65 77 2d 3e 7a 4e 61 6d   );.  pNew->zNam
3660: 65 20 3d 20 28 63 68 61 72 2a 29 26 70 4e 65 77  e = (char*)&pNew
3670: 5b 31 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  [1];.  for(i=0; 
3680: 7a 4e 61 6d 65 5b 69 5d 3b 20 69 2b 2b 29 7b 20  zName[i]; i++){ 
3690: 70 4e 65 77 2d 3e 7a 4e 61 6d 65 5b 69 5d 20 3d  pNew->zName[i] =
36a0: 20 74 6f 6c 6f 77 65 72 28 7a 4e 61 6d 65 5b 69   tolower(zName[i
36b0: 5d 29 3b 20 7d 0a 20 20 70 4e 65 77 2d 3e 7a 4e  ]); }.  pNew->zN
36c0: 61 6d 65 5b 69 5d 20 3d 20 30 3b 0a 20 20 66 6f  ame[i] = 0;.  fo
36d0: 72 28 70 3d 70 44 62 2d 3e 70 46 75 6e 63 3b 20  r(p=pDb->pFunc; 
36e0: 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 20  p; p=p->pNext){ 
36f0: 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28  .    if( strcmp(
3700: 70 2d 3e 7a 4e 61 6d 65 2c 20 70 4e 65 77 2d 3e  p->zName, pNew->
3710: 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20  zName)==0 ){.   
3720: 20 20 20 54 63 6c 5f 46 72 65 65 28 28 63 68 61     Tcl_Free((cha
3730: 72 2a 29 70 4e 65 77 29 3b 0a 20 20 20 20 20 20  r*)pNew);.      
3740: 72 65 74 75 72 6e 20 70 3b 0a 20 20 20 20 7d 0a  return p;.    }.
3750: 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 69 6e 74 65    }.  pNew->inte
3760: 72 70 20 3d 20 70 44 62 2d 3e 69 6e 74 65 72 70  rp = pDb->interp
3770: 3b 0a 20 20 70 4e 65 77 2d 3e 70 53 63 72 69 70  ;.  pNew->pScrip
3780: 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70  t = 0;.  pNew->p
3790: 4e 65 78 74 20 3d 20 70 44 62 2d 3e 70 46 75 6e  Next = pDb->pFun
37a0: 63 3b 0a 20 20 70 44 62 2d 3e 70 46 75 6e 63 20  c;.  pDb->pFunc 
37b0: 3d 20 70 4e 65 77 3b 0a 20 20 72 65 74 75 72 6e  = pNew;.  return
37c0: 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pNew;.}../*.** 
37d0: 46 72 65 65 20 61 20 73 69 6e 67 6c 65 20 53 71  Free a single Sq
37e0: 6c 50 72 65 70 61 72 65 64 53 74 6d 74 20 6f 62  lPreparedStmt ob
37f0: 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ject..*/.static 
3800: 76 6f 69 64 20 64 62 46 72 65 65 53 74 6d 74 28  void dbFreeStmt(
3810: 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74 20  SqlPreparedStmt 
3820: 2a 70 53 74 6d 74 29 7b 0a 23 69 66 64 65 66 20  *pStmt){.#ifdef 
3830: 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 66  SQLITE_TEST.  if
3840: 28 20 73 71 6c 69 74 65 33 5f 73 71 6c 28 70 53  ( sqlite3_sql(pS
3850: 74 6d 74 2d 3e 70 53 74 6d 74 29 3d 3d 30 20 29  tmt->pStmt)==0 )
3860: 7b 0a 20 20 20 20 54 63 6c 5f 46 72 65 65 28 28  {.    Tcl_Free((
3870: 63 68 61 72 20 2a 29 70 53 74 6d 74 2d 3e 7a 53  char *)pStmt->zS
3880: 71 6c 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ql);.  }.#endif.
3890: 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
38a0: 7a 65 28 70 53 74 6d 74 2d 3e 70 53 74 6d 74 29  ze(pStmt->pStmt)
38b0: 3b 0a 20 20 54 63 6c 5f 46 72 65 65 28 28 63 68  ;.  Tcl_Free((ch
38c0: 61 72 20 2a 29 70 53 74 6d 74 29 3b 0a 7d 0a 0a  ar *)pStmt);.}..
38d0: 2f 2a 0a 2a 2a 20 46 69 6e 61 6c 69 7a 65 20 61  /*.** Finalize a
38e0: 6e 64 20 66 72 65 65 20 61 20 6c 69 73 74 20 6f  nd free a list o
38f0: 66 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  f prepared state
3900: 6d 65 6e 74 73 0a 2a 2f 0a 73 74 61 74 69 63 20  ments.*/.static 
3910: 76 6f 69 64 20 66 6c 75 73 68 53 74 6d 74 43 61  void flushStmtCa
3920: 63 68 65 28 53 71 6c 69 74 65 44 62 20 2a 70 44  che(SqliteDb *pD
3930: 62 29 7b 0a 20 20 53 71 6c 50 72 65 70 61 72 65  b){.  SqlPrepare
3940: 64 53 74 6d 74 20 2a 70 50 72 65 53 74 6d 74 3b  dStmt *pPreStmt;
3950: 0a 20 20 53 71 6c 50 72 65 70 61 72 65 64 53 74  .  SqlPreparedSt
3960: 6d 74 20 2a 70 4e 65 78 74 3b 0a 0a 20 20 66 6f  mt *pNext;..  fo
3970: 72 28 70 50 72 65 53 74 6d 74 20 3d 20 70 44 62  r(pPreStmt = pDb
3980: 2d 3e 73 74 6d 74 4c 69 73 74 3b 20 70 50 72 65  ->stmtList; pPre
3990: 53 74 6d 74 3b 20 70 50 72 65 53 74 6d 74 3d 70  Stmt; pPreStmt=p
39a0: 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74  Next){.    pNext
39b0: 20 3d 20 70 50 72 65 53 74 6d 74 2d 3e 70 4e 65   = pPreStmt->pNe
39c0: 78 74 3b 0a 20 20 20 20 64 62 46 72 65 65 53 74  xt;.    dbFreeSt
39d0: 6d 74 28 70 50 72 65 53 74 6d 74 29 3b 0a 20 20  mt(pPreStmt);.  
39e0: 7d 0a 20 20 70 44 62 2d 3e 6e 53 74 6d 74 20 3d  }.  pDb->nStmt =
39f0: 20 30 3b 0a 20 20 70 44 62 2d 3e 73 74 6d 74 4c   0;.  pDb->stmtL
3a00: 61 73 74 20 3d 20 30 3b 0a 20 20 70 44 62 2d 3e  ast = 0;.  pDb->
3a10: 73 74 6d 74 4c 69 73 74 20 3d 20 30 3b 0a 7d 0a  stmtList = 0;.}.
3a20: 0a 2f 2a 0a 2a 2a 20 54 43 4c 20 63 61 6c 6c 73  ./*.** TCL calls
3a30: 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 20   this procedure 
3a40: 77 68 65 6e 20 61 6e 20 73 71 6c 69 74 65 33 20  when an sqlite3 
3a50: 64 61 74 61 62 61 73 65 20 63 6f 6d 6d 61 6e 64  database command
3a60: 20 69 73 0a 2a 2a 20 64 65 6c 65 74 65 64 2e 0a   is.** deleted..
3a70: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 44  */.static void D
3a80: 62 44 65 6c 65 74 65 43 6d 64 28 76 6f 69 64 20  bDeleteCmd(void 
3a90: 2a 64 62 29 7b 0a 20 20 53 71 6c 69 74 65 44 62  *db){.  SqliteDb
3aa0: 20 2a 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44   *pDb = (SqliteD
3ab0: 62 2a 29 64 62 3b 0a 20 20 66 6c 75 73 68 53 74  b*)db;.  flushSt
3ac0: 6d 74 43 61 63 68 65 28 70 44 62 29 3b 0a 20 20  mtCache(pDb);.  
3ad0: 63 6c 6f 73 65 49 6e 63 72 62 6c 6f 62 43 68 61  closeIncrblobCha
3ae0: 6e 6e 65 6c 73 28 70 44 62 29 3b 0a 20 20 73 71  nnels(pDb);.  sq
3af0: 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70 44 62 2d  lite3_close(pDb-
3b00: 3e 64 62 29 3b 0a 20 20 77 68 69 6c 65 28 20 70  >db);.  while( p
3b10: 44 62 2d 3e 70 46 75 6e 63 20 29 7b 0a 20 20 20  Db->pFunc ){.   
3b20: 20 53 71 6c 46 75 6e 63 20 2a 70 46 75 6e 63 20   SqlFunc *pFunc 
3b30: 3d 20 70 44 62 2d 3e 70 46 75 6e 63 3b 0a 20 20  = pDb->pFunc;.  
3b40: 20 20 70 44 62 2d 3e 70 46 75 6e 63 20 3d 20 70    pDb->pFunc = p
3b50: 46 75 6e 63 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  Func->pNext;.   
3b60: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
3b70: 74 28 70 46 75 6e 63 2d 3e 70 53 63 72 69 70 74  t(pFunc->pScript
3b80: 29 3b 0a 20 20 20 20 54 63 6c 5f 46 72 65 65 28  );.    Tcl_Free(
3b90: 28 63 68 61 72 2a 29 70 46 75 6e 63 29 3b 0a 20  (char*)pFunc);. 
3ba0: 20 7d 0a 20 20 77 68 69 6c 65 28 20 70 44 62 2d   }.  while( pDb-
3bb0: 3e 70 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20  >pCollate ){.   
3bc0: 20 53 71 6c 43 6f 6c 6c 61 74 65 20 2a 70 43 6f   SqlCollate *pCo
3bd0: 6c 6c 61 74 65 20 3d 20 70 44 62 2d 3e 70 43 6f  llate = pDb->pCo
3be0: 6c 6c 61 74 65 3b 0a 20 20 20 20 70 44 62 2d 3e  llate;.    pDb->
3bf0: 70 43 6f 6c 6c 61 74 65 20 3d 20 70 43 6f 6c 6c  pCollate = pColl
3c00: 61 74 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  ate->pNext;.    
3c10: 54 63 6c 5f 46 72 65 65 28 28 63 68 61 72 2a 29  Tcl_Free((char*)
3c20: 70 43 6f 6c 6c 61 74 65 29 3b 0a 20 20 7d 0a 20  pCollate);.  }. 
3c30: 20 69 66 28 20 70 44 62 2d 3e 7a 42 75 73 79 20   if( pDb->zBusy 
3c40: 29 7b 0a 20 20 20 20 54 63 6c 5f 46 72 65 65 28  ){.    Tcl_Free(
3c50: 70 44 62 2d 3e 7a 42 75 73 79 29 3b 0a 20 20 7d  pDb->zBusy);.  }
3c60: 0a 20 20 69 66 28 20 70 44 62 2d 3e 7a 54 72 61  .  if( pDb->zTra
3c70: 63 65 20 29 7b 0a 20 20 20 20 54 63 6c 5f 46 72  ce ){.    Tcl_Fr
3c80: 65 65 28 70 44 62 2d 3e 7a 54 72 61 63 65 29 3b  ee(pDb->zTrace);
3c90: 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 62 2d 3e  .  }.  if( pDb->
3ca0: 7a 50 72 6f 66 69 6c 65 20 29 7b 0a 20 20 20 20  zProfile ){.    
3cb0: 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 50  Tcl_Free(pDb->zP
3cc0: 72 6f 66 69 6c 65 29 3b 0a 20 20 7d 0a 20 20 69  rofile);.  }.  i
3cd0: 66 28 20 70 44 62 2d 3e 7a 41 75 74 68 20 29 7b  f( pDb->zAuth ){
3ce0: 0a 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44  .    Tcl_Free(pD
3cf0: 62 2d 3e 7a 41 75 74 68 29 3b 0a 20 20 7d 0a 20  b->zAuth);.  }. 
3d00: 20 69 66 28 20 70 44 62 2d 3e 7a 4e 75 6c 6c 20   if( pDb->zNull 
3d10: 29 7b 0a 20 20 20 20 54 63 6c 5f 46 72 65 65 28  ){.    Tcl_Free(
3d20: 70 44 62 2d 3e 7a 4e 75 6c 6c 29 3b 0a 20 20 7d  pDb->zNull);.  }
3d30: 0a 20 20 69 66 28 20 70 44 62 2d 3e 70 55 70 64  .  if( pDb->pUpd
3d40: 61 74 65 48 6f 6f 6b 20 29 7b 0a 20 20 20 20 54  ateHook ){.    T
3d50: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
3d60: 70 44 62 2d 3e 70 55 70 64 61 74 65 48 6f 6f 6b  pDb->pUpdateHook
3d70: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 62  );.  }.  if( pDb
3d80: 2d 3e 70 50 72 65 55 70 64 61 74 65 48 6f 6f 6b  ->pPreUpdateHook
3d90: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72   ){.    Tcl_Decr
3da0: 52 65 66 43 6f 75 6e 74 28 70 44 62 2d 3e 70 50  RefCount(pDb->pP
3db0: 72 65 55 70 64 61 74 65 48 6f 6f 6b 29 3b 0a 20  reUpdateHook);. 
3dc0: 20 7d 0a 20 20 69 66 28 20 70 44 62 2d 3e 70 52   }.  if( pDb->pR
3dd0: 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 20 29 7b 0a 20  ollbackHook ){. 
3de0: 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f     Tcl_DecrRefCo
3df0: 75 6e 74 28 70 44 62 2d 3e 70 52 6f 6c 6c 62 61  unt(pDb->pRollba
3e00: 63 6b 48 6f 6f 6b 29 3b 0a 20 20 7d 0a 20 20 69  ckHook);.  }.  i
3e10: 66 28 20 70 44 62 2d 3e 70 57 61 6c 48 6f 6f 6b  f( pDb->pWalHook
3e20: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72   ){.    Tcl_Decr
3e30: 52 65 66 43 6f 75 6e 74 28 70 44 62 2d 3e 70 57  RefCount(pDb->pW
3e40: 61 6c 48 6f 6f 6b 29 3b 0a 20 20 7d 0a 20 20 69  alHook);.  }.  i
3e50: 66 28 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65  f( pDb->pCollate
3e60: 4e 65 65 64 65 64 20 29 7b 0a 20 20 20 20 54 63  Needed ){.    Tc
3e70: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70  l_DecrRefCount(p
3e80: 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65 65 64  Db->pCollateNeed
3e90: 65 64 29 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 46  ed);.  }.  Tcl_F
3ea0: 72 65 65 28 28 63 68 61 72 2a 29 70 44 62 29 3b  ree((char*)pDb);
3eb0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
3ec0: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
3ed0: 20 77 68 65 6e 20 61 20 64 61 74 61 62 61 73 65   when a database
3ee0: 20 66 69 6c 65 20 69 73 20 6c 6f 63 6b 65 64 20   file is locked 
3ef0: 77 68 69 6c 65 20 74 72 79 69 6e 67 0a 2a 2a 20  while trying.** 
3f00: 74 6f 20 65 78 65 63 75 74 65 20 53 51 4c 2e 0a  to execute SQL..
3f10: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 44 62  */.static int Db
3f20: 42 75 73 79 48 61 6e 64 6c 65 72 28 76 6f 69 64  BusyHandler(void
3f30: 20 2a 63 64 2c 20 69 6e 74 20 6e 54 72 69 65 73   *cd, int nTries
3f40: 29 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70  ){.  SqliteDb *p
3f50: 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29  Db = (SqliteDb*)
3f60: 63 64 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  cd;.  int rc;.  
3f70: 63 68 61 72 20 7a 56 61 6c 5b 33 30 5d 3b 0a 0a  char zVal[30];..
3f80: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
3f90: 74 66 28 73 69 7a 65 6f 66 28 7a 56 61 6c 29 2c  tf(sizeof(zVal),
3fa0: 20 7a 56 61 6c 2c 20 22 25 64 22 2c 20 6e 54 72   zVal, "%d", nTr
3fb0: 69 65 73 29 3b 0a 20 20 72 63 20 3d 20 54 63 6c  ies);.  rc = Tcl
3fc0: 5f 56 61 72 45 76 61 6c 28 70 44 62 2d 3e 69 6e  _VarEval(pDb->in
3fd0: 74 65 72 70 2c 20 70 44 62 2d 3e 7a 42 75 73 79  terp, pDb->zBusy
3fe0: 2c 20 22 20 22 2c 20 7a 56 61 6c 2c 20 28 63 68  , " ", zVal, (ch
3ff0: 61 72 2a 29 30 29 3b 0a 20 20 69 66 28 20 72 63  ar*)0);.  if( rc
4000: 21 3d 54 43 4c 5f 4f 4b 20 7c 7c 20 61 74 6f 69  !=TCL_OK || atoi
4010: 28 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65  (Tcl_GetStringRe
4020: 73 75 6c 74 28 70 44 62 2d 3e 69 6e 74 65 72 70  sult(pDb->interp
4030: 29 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  )) ){.    return
4040: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
4050: 20 31 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53   1;.}..#ifndef S
4060: 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 52 4f 47 52  QLITE_OMIT_PROGR
4070: 45 53 53 5f 43 41 4c 4c 42 41 43 4b 0a 2f 2a 0a  ESS_CALLBACK./*.
4080: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
4090: 69 73 20 69 6e 76 6f 6b 65 64 20 61 73 20 74 68  is invoked as th
40a0: 65 20 27 70 72 6f 67 72 65 73 73 20 63 61 6c 6c  e 'progress call
40b0: 62 61 63 6b 27 20 66 6f 72 20 74 68 65 20 64 61  back' for the da
40c0: 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  tabase..*/.stati
40d0: 63 20 69 6e 74 20 44 62 50 72 6f 67 72 65 73 73  c int DbProgress
40e0: 48 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a 63 64  Handler(void *cd
40f0: 29 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70  ){.  SqliteDb *p
4100: 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29  Db = (SqliteDb*)
4110: 63 64 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  cd;.  int rc;.. 
4120: 20 61 73 73 65 72 74 28 20 70 44 62 2d 3e 7a 50   assert( pDb->zP
4130: 72 6f 67 72 65 73 73 20 29 3b 0a 20 20 72 63 20  rogress );.  rc 
4140: 3d 20 54 63 6c 5f 45 76 61 6c 28 70 44 62 2d 3e  = Tcl_Eval(pDb->
4150: 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a 50 72  interp, pDb->zPr
4160: 6f 67 72 65 73 73 29 3b 0a 20 20 69 66 28 20 72  ogress);.  if( r
4170: 63 21 3d 54 43 4c 5f 4f 4b 20 7c 7c 20 61 74 6f  c!=TCL_OK || ato
4180: 69 28 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52  i(Tcl_GetStringR
4190: 65 73 75 6c 74 28 70 44 62 2d 3e 69 6e 74 65 72  esult(pDb->inter
41a0: 70 29 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  p)) ){.    retur
41b0: 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 1;.  }.  retur
41c0: 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  n 0;.}.#endif..#
41d0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
41e0: 49 54 5f 54 52 41 43 45 0a 2f 2a 0a 2a 2a 20 54  IT_TRACE./*.** T
41f0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
4200: 61 6c 6c 65 64 20 62 79 20 74 68 65 20 53 51 4c  alled by the SQL
4210: 69 74 65 20 74 72 61 63 65 20 68 61 6e 64 6c 65  ite trace handle
4220: 72 20 77 68 65 6e 65 76 65 72 20 61 20 6e 65 77  r whenever a new
4230: 0a 2a 2a 20 62 6c 6f 63 6b 20 6f 66 20 53 51 4c  .** block of SQL
4240: 20 69 73 20 65 78 65 63 75 74 65 64 2e 20 20 54   is executed.  T
4250: 68 65 20 54 43 4c 20 73 63 72 69 70 74 20 69 6e  he TCL script in
4260: 20 70 44 62 2d 3e 7a 54 72 61 63 65 20 69 73 20   pDb->zTrace is 
4270: 65 78 65 63 75 74 65 64 2e 0a 2a 2f 0a 73 74 61  executed..*/.sta
4280: 74 69 63 20 76 6f 69 64 20 44 62 54 72 61 63 65  tic void DbTrace
4290: 48 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a 63 64  Handler(void *cd
42a0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53  , const char *zS
42b0: 71 6c 29 7b 0a 20 20 53 71 6c 69 74 65 44 62 20  ql){.  SqliteDb 
42c0: 2a 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62  *pDb = (SqliteDb
42d0: 2a 29 63 64 3b 0a 20 20 54 63 6c 5f 44 53 74 72  *)cd;.  Tcl_DStr
42e0: 69 6e 67 20 73 74 72 3b 0a 0a 20 20 54 63 6c 5f  ing str;..  Tcl_
42f0: 44 53 74 72 69 6e 67 49 6e 69 74 28 26 73 74 72  DStringInit(&str
4300: 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  );.  Tcl_DString
4310: 41 70 70 65 6e 64 28 26 73 74 72 2c 20 70 44 62  Append(&str, pDb
4320: 2d 3e 7a 54 72 61 63 65 2c 20 2d 31 29 3b 0a 20  ->zTrace, -1);. 
4330: 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65   Tcl_DStringAppe
4340: 6e 64 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c 20  ndElement(&str, 
4350: 7a 53 71 6c 29 3b 0a 20 20 54 63 6c 5f 45 76 61  zSql);.  Tcl_Eva
4360: 6c 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20 54  l(pDb->interp, T
4370: 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28  cl_DStringValue(
4380: 26 73 74 72 29 29 3b 0a 20 20 54 63 6c 5f 44 53  &str));.  Tcl_DS
4390: 74 72 69 6e 67 46 72 65 65 28 26 73 74 72 29 3b  tringFree(&str);
43a0: 0a 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73 75  .  Tcl_ResetResu
43b0: 6c 74 28 70 44 62 2d 3e 69 6e 74 65 72 70 29 3b  lt(pDb->interp);
43c0: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  .}.#endif..#ifnd
43d0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ef SQLITE_OMIT_T
43e0: 52 41 43 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  RACE./*.** This 
43f0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
4400: 64 20 62 79 20 74 68 65 20 53 51 4c 69 74 65 20  d by the SQLite 
4410: 70 72 6f 66 69 6c 65 20 68 61 6e 64 6c 65 72 20  profile handler 
4420: 61 66 74 65 72 20 61 20 73 74 61 74 65 6d 65 6e  after a statemen
4430: 74 0a 2a 2a 20 53 51 4c 20 68 61 73 20 65 78 65  t.** SQL has exe
4440: 63 75 74 65 64 2e 20 20 54 68 65 20 54 43 4c 20  cuted.  The TCL 
4450: 73 63 72 69 70 74 20 69 6e 20 70 44 62 2d 3e 7a  script in pDb->z
4460: 50 72 6f 66 69 6c 65 20 69 73 20 65 76 61 6c 75  Profile is evalu
4470: 61 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ated..*/.static 
4480: 76 6f 69 64 20 44 62 50 72 6f 66 69 6c 65 48 61  void DbProfileHa
4490: 6e 64 6c 65 72 28 76 6f 69 64 20 2a 63 64 2c 20  ndler(void *cd, 
44a0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c  const char *zSql
44b0: 2c 20 73 71 6c 69 74 65 5f 75 69 6e 74 36 34 20  , sqlite_uint64 
44c0: 74 6d 29 7b 0a 20 20 53 71 6c 69 74 65 44 62 20  tm){.  SqliteDb 
44d0: 2a 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62  *pDb = (SqliteDb
44e0: 2a 29 63 64 3b 0a 20 20 54 63 6c 5f 44 53 74 72  *)cd;.  Tcl_DStr
44f0: 69 6e 67 20 73 74 72 3b 0a 20 20 63 68 61 72 20  ing str;.  char 
4500: 7a 54 6d 5b 31 30 30 5d 3b 0a 0a 20 20 73 71 6c  zTm[100];..  sql
4510: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
4520: 7a 65 6f 66 28 7a 54 6d 29 2d 31 2c 20 7a 54 6d  zeof(zTm)-1, zTm
4530: 2c 20 22 25 6c 6c 64 22 2c 20 74 6d 29 3b 0a 20  , "%lld", tm);. 
4540: 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74   Tcl_DStringInit
4550: 28 26 73 74 72 29 3b 0a 20 20 54 63 6c 5f 44 53  (&str);.  Tcl_DS
4560: 74 72 69 6e 67 41 70 70 65 6e 64 28 26 73 74 72  tringAppend(&str
4570: 2c 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 2c  , pDb->zProfile,
4580: 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72   -1);.  Tcl_DStr
4590: 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ingAppendElement
45a0: 28 26 73 74 72 2c 20 7a 53 71 6c 29 3b 0a 20 20  (&str, zSql);.  
45b0: 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e  Tcl_DStringAppen
45c0: 64 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c 20 7a  dElement(&str, z
45d0: 54 6d 29 3b 0a 20 20 54 63 6c 5f 45 76 61 6c 28  Tm);.  Tcl_Eval(
45e0: 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20 54 63 6c  pDb->interp, Tcl
45f0: 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 73  _DStringValue(&s
4600: 74 72 29 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72  tr));.  Tcl_DStr
4610: 69 6e 67 46 72 65 65 28 26 73 74 72 29 3b 0a 20  ingFree(&str);. 
4620: 20 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74   Tcl_ResetResult
4630: 28 70 44 62 2d 3e 69 6e 74 65 72 70 29 3b 0a 7d  (pDb->interp);.}
4640: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
4650: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
4660: 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 74 72 61  alled when a tra
4670: 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d  nsaction is comm
4680: 69 74 74 65 64 2e 20 20 54 68 65 0a 2a 2a 20 54  itted.  The.** T
4690: 43 4c 20 73 63 72 69 70 74 20 69 6e 20 70 44 62  CL script in pDb
46a0: 2d 3e 7a 43 6f 6d 6d 69 74 20 69 73 20 65 78 65  ->zCommit is exe
46b0: 63 75 74 65 64 2e 20 20 49 66 20 69 74 20 72 65  cuted.  If it re
46c0: 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 20 6f  turns non-zero o
46d0: 72 0a 2a 2a 20 69 66 20 69 74 20 74 68 72 6f 77  r.** if it throw
46e0: 73 20 61 6e 20 65 78 63 65 70 74 69 6f 6e 2c 20  s an exception, 
46f0: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
4700: 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 69  is rolled back i
4710: 6e 73 74 65 61 64 0a 2a 2a 20 6f 66 20 62 65 69  nstead.** of bei
4720: 6e 67 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2f  ng committed..*/
4730: 0a 73 74 61 74 69 63 20 69 6e 74 20 44 62 43 6f  .static int DbCo
4740: 6d 6d 69 74 48 61 6e 64 6c 65 72 28 76 6f 69 64  mmitHandler(void
4750: 20 2a 63 64 29 7b 0a 20 20 53 71 6c 69 74 65 44   *cd){.  SqliteD
4760: 62 20 2a 70 44 62 20 3d 20 28 53 71 6c 69 74 65  b *pDb = (Sqlite
4770: 44 62 2a 29 63 64 3b 0a 20 20 69 6e 74 20 72 63  Db*)cd;.  int rc
4780: 3b 0a 0a 20 20 72 63 20 3d 20 54 63 6c 5f 45 76  ;..  rc = Tcl_Ev
4790: 61 6c 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20  al(pDb->interp, 
47a0: 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 29 3b 0a 20  pDb->zCommit);. 
47b0: 20 69 66 28 20 72 63 21 3d 54 43 4c 5f 4f 4b 20   if( rc!=TCL_OK 
47c0: 7c 7c 20 61 74 6f 69 28 54 63 6c 5f 47 65 74 53  || atoi(Tcl_GetS
47d0: 74 72 69 6e 67 52 65 73 75 6c 74 28 70 44 62 2d  tringResult(pDb-
47e0: 3e 69 6e 74 65 72 70 29 29 20 29 7b 0a 20 20 20  >interp)) ){.   
47f0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
4800: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 73 74   return 0;.}..st
4810: 61 74 69 63 20 76 6f 69 64 20 44 62 52 6f 6c 6c  atic void DbRoll
4820: 62 61 63 6b 48 61 6e 64 6c 65 72 28 76 6f 69 64  backHandler(void
4830: 20 2a 63 6c 69 65 6e 74 44 61 74 61 29 7b 0a 20   *clientData){. 
4840: 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d   SqliteDb *pDb =
4850: 20 28 53 71 6c 69 74 65 44 62 2a 29 63 6c 69 65   (SqliteDb*)clie
4860: 6e 74 44 61 74 61 3b 0a 20 20 61 73 73 65 72 74  ntData;.  assert
4870: 28 70 44 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 48  (pDb->pRollbackH
4880: 6f 6f 6b 29 3b 0a 20 20 69 66 28 20 54 43 4c 5f  ook);.  if( TCL_
4890: 4f 4b 21 3d 54 63 6c 5f 45 76 61 6c 4f 62 6a 45  OK!=Tcl_EvalObjE
48a0: 78 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20 70  x(pDb->interp, p
48b0: 44 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f  Db->pRollbackHoo
48c0: 6b 2c 20 30 29 20 29 7b 0a 20 20 20 20 54 63 6c  k, 0) ){.    Tcl
48d0: 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72  _BackgroundError
48e0: 28 70 44 62 2d 3e 69 6e 74 65 72 70 29 3b 0a 20  (pDb->interp);. 
48f0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
4900: 20 70 72 6f 63 65 64 75 72 65 20 68 61 6e 64 6c   procedure handl
4910: 65 73 20 77 61 6c 5f 68 6f 6f 6b 20 63 61 6c 6c  es wal_hook call
4920: 62 61 63 6b 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  backs..*/.static
4930: 20 69 6e 74 20 44 62 57 61 6c 48 61 6e 64 6c 65   int DbWalHandle
4940: 72 28 0a 20 20 76 6f 69 64 20 2a 63 6c 69 65 6e  r(.  void *clien
4950: 74 44 61 74 61 2c 20 0a 20 20 73 71 6c 69 74 65  tData, .  sqlite
4960: 33 20 2a 64 62 2c 20 0a 20 20 63 6f 6e 73 74 20  3 *db, .  const 
4970: 63 68 61 72 20 2a 7a 44 62 2c 20 0a 20 20 69 6e  char *zDb, .  in
4980: 74 20 6e 45 6e 74 72 79 0a 29 7b 0a 20 20 69 6e  t nEntry.){.  in
4990: 74 20 72 65 74 20 3d 20 53 51 4c 49 54 45 5f 4f  t ret = SQLITE_O
49a0: 4b 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 3b  K;.  Tcl_Obj *p;
49b0: 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62  .  SqliteDb *pDb
49c0: 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 63 6c   = (SqliteDb*)cl
49d0: 69 65 6e 74 44 61 74 61 3b 0a 20 20 54 63 6c 5f  ientData;.  Tcl_
49e0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 20 3d  Interp *interp =
49f0: 20 70 44 62 2d 3e 69 6e 74 65 72 70 3b 0a 20 20   pDb->interp;.  
4a00: 61 73 73 65 72 74 28 70 44 62 2d 3e 70 57 61 6c  assert(pDb->pWal
4a10: 48 6f 6f 6b 29 3b 0a 0a 20 20 70 20 3d 20 54 63  Hook);..  p = Tc
4a20: 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 70  l_DuplicateObj(p
4a30: 44 62 2d 3e 70 57 61 6c 48 6f 6f 6b 29 3b 0a 20  Db->pWalHook);. 
4a40: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
4a50: 74 28 70 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74  t(p);.  Tcl_List
4a60: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
4a70: 28 69 6e 74 65 72 70 2c 20 70 2c 20 54 63 6c 5f  (interp, p, Tcl_
4a80: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 44 62  NewStringObj(zDb
4a90: 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69  , -1));.  Tcl_Li
4aa0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
4ab0: 6e 74 28 69 6e 74 65 72 70 2c 20 70 2c 20 54 63  nt(interp, p, Tc
4ac0: 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 6e 45 6e 74  l_NewIntObj(nEnt
4ad0: 72 79 29 29 3b 0a 20 20 69 66 28 20 54 43 4c 5f  ry));.  if( TCL_
4ae0: 4f 4b 21 3d 54 63 6c 5f 45 76 61 6c 4f 62 6a 45  OK!=Tcl_EvalObjE
4af0: 78 28 69 6e 74 65 72 70 2c 20 70 2c 20 30 29 20  x(interp, p, 0) 
4b00: 0a 20 20 20 7c 7c 20 54 43 4c 5f 4f 4b 21 3d 54  .   || TCL_OK!=T
4b10: 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
4b20: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
4b30: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
4b40: 29 2c 20 26 72 65 74 29 0a 20 20 29 7b 0a 20 20  ), &ret).  ){.  
4b50: 20 20 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64    Tcl_Background
4b60: 45 72 72 6f 72 28 69 6e 74 65 72 70 29 3b 0a 20  Error(interp);. 
4b70: 20 7d 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66   }.  Tcl_DecrRef
4b80: 43 6f 75 6e 74 28 70 29 3b 0a 0a 20 20 72 65 74  Count(p);..  ret
4b90: 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 23 69 66 20  urn ret;.}..#if 
4ba0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
4bb0: 45 53 54 29 20 26 26 20 64 65 66 69 6e 65 64 28  EST) && defined(
4bc0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 55 4e  SQLITE_ENABLE_UN
4bd0: 4c 4f 43 4b 5f 4e 4f 54 49 46 59 29 0a 73 74 61  LOCK_NOTIFY).sta
4be0: 74 69 63 20 76 6f 69 64 20 73 65 74 54 65 73 74  tic void setTest
4bf0: 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 56 61 72 73  UnlockNotifyVars
4c00: 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74  (Tcl_Interp *int
4c10: 65 72 70 2c 20 69 6e 74 20 69 41 72 67 2c 20 69  erp, int iArg, i
4c20: 6e 74 20 6e 41 72 67 29 7b 0a 20 20 63 68 61 72  nt nArg){.  char
4c30: 20 7a 42 75 66 5b 36 34 5d 3b 0a 20 20 73 70 72   zBuf[64];.  spr
4c40: 69 6e 74 66 28 7a 42 75 66 2c 20 22 25 64 22 2c  intf(zBuf, "%d",
4c50: 20 69 41 72 67 29 3b 0a 20 20 54 63 6c 5f 53 65   iArg);.  Tcl_Se
4c60: 74 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71  tVar(interp, "sq
4c70: 6c 69 74 65 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74 69  lite_unlock_noti
4c80: 66 79 5f 61 72 67 22 2c 20 7a 42 75 66 2c 20 54  fy_arg", zBuf, T
4c90: 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b  CL_GLOBAL_ONLY);
4ca0: 0a 20 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c  .  sprintf(zBuf,
4cb0: 20 22 25 64 22 2c 20 6e 41 72 67 29 3b 0a 20 20   "%d", nArg);.  
4cc0: 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72  Tcl_SetVar(inter
4cd0: 70 2c 20 22 73 71 6c 69 74 65 5f 75 6e 6c 6f 63  p, "sqlite_unloc
4ce0: 6b 5f 6e 6f 74 69 66 79 5f 61 72 67 63 6f 75 6e  k_notify_argcoun
4cf0: 74 22 2c 20 7a 42 75 66 2c 20 54 43 4c 5f 47 4c  t", zBuf, TCL_GL
4d00: 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 7d 0a 23 65  OBAL_ONLY);.}.#e
4d10: 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 73 65 74  lse.# define set
4d20: 54 65 73 74 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79  TestUnlockNotify
4d30: 56 61 72 73 28 78 2c 79 2c 7a 29 0a 23 65 6e 64  Vars(x,y,z).#end
4d40: 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  if..#ifdef SQLIT
4d50: 45 5f 45 4e 41 42 4c 45 5f 55 4e 4c 4f 43 4b 5f  E_ENABLE_UNLOCK_
4d60: 4e 4f 54 49 46 59 0a 73 74 61 74 69 63 20 76 6f  NOTIFY.static vo
4d70: 69 64 20 44 62 55 6e 6c 6f 63 6b 4e 6f 74 69 66  id DbUnlockNotif
4d80: 79 28 76 6f 69 64 20 2a 2a 61 70 41 72 67 2c 20  y(void **apArg, 
4d90: 69 6e 74 20 6e 41 72 67 29 7b 0a 20 20 69 6e 74  int nArg){.  int
4da0: 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
4db0: 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nArg; i++){.   
4dc0: 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67 73   const int flags
4dd0: 20 3d 20 28 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f   = (TCL_EVAL_GLO
4de0: 42 41 4c 7c 54 43 4c 5f 45 56 41 4c 5f 44 49 52  BAL|TCL_EVAL_DIR
4df0: 45 43 54 29 3b 0a 20 20 20 20 53 71 6c 69 74 65  ECT);.    Sqlite
4e00: 44 62 20 2a 70 44 62 20 3d 20 28 53 71 6c 69 74  Db *pDb = (Sqlit
4e10: 65 44 62 20 2a 29 61 70 41 72 67 5b 69 5d 3b 0a  eDb *)apArg[i];.
4e20: 20 20 20 20 73 65 74 54 65 73 74 55 6e 6c 6f 63      setTestUnloc
4e30: 6b 4e 6f 74 69 66 79 56 61 72 73 28 70 44 62 2d  kNotifyVars(pDb-
4e40: 3e 69 6e 74 65 72 70 2c 20 69 2c 20 6e 41 72 67  >interp, i, nArg
4e50: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
4e60: 44 62 2d 3e 70 55 6e 6c 6f 63 6b 4e 6f 74 69 66  Db->pUnlockNotif
4e70: 79 29 3b 0a 20 20 20 20 54 63 6c 5f 45 76 61 6c  y);.    Tcl_Eval
4e80: 4f 62 6a 45 78 28 70 44 62 2d 3e 69 6e 74 65 72  ObjEx(pDb->inter
4e90: 70 2c 20 70 44 62 2d 3e 70 55 6e 6c 6f 63 6b 4e  p, pDb->pUnlockN
4ea0: 6f 74 69 66 79 2c 20 66 6c 61 67 73 29 3b 0a 20  otify, flags);. 
4eb0: 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f     Tcl_DecrRefCo
4ec0: 75 6e 74 28 70 44 62 2d 3e 70 55 6e 6c 6f 63 6b  unt(pDb->pUnlock
4ed0: 4e 6f 74 69 66 79 29 3b 0a 20 20 20 20 70 44 62  Notify);.    pDb
4ee0: 2d 3e 70 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 20  ->pUnlockNotify 
4ef0: 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69  = 0;.  }.}.#endi
4f00: 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  f..#ifdef SQLITE
4f10: 5f 45 4e 41 42 4c 45 5f 50 52 45 55 50 44 41 54  _ENABLE_PREUPDAT
4f20: 45 5f 48 4f 4f 4b 0a 2f 2a 0a 2a 2a 20 50 72 65  E_HOOK./*.** Pre
4f30: 2d 75 70 64 61 74 65 20 68 6f 6f 6b 20 63 61 6c  -update hook cal
4f40: 6c 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63  lback..*/.static
4f50: 20 76 6f 69 64 20 44 62 50 72 65 55 70 64 61 74   void DbPreUpdat
4f60: 65 48 61 6e 64 6c 65 72 28 0a 20 20 76 6f 69 64  eHandler(.  void
4f70: 20 2a 70 2c 20 0a 20 20 73 71 6c 69 74 65 33 20   *p, .  sqlite3 
4f80: 2a 64 62 2c 0a 20 20 69 6e 74 20 6f 70 2c 0a 20  *db,.  int op,. 
4f90: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
4fa0: 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  , .  const char 
4fb0: 2a 7a 54 62 6c 2c 20 0a 20 20 73 71 6c 69 74 65  *zTbl, .  sqlite
4fc0: 5f 69 6e 74 36 34 20 69 4b 65 79 31 2c 0a 20 20  _int64 iKey1,.  
4fd0: 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 69 4b 65  sqlite_int64 iKe
4fe0: 79 32 0a 29 7b 0a 20 20 53 71 6c 69 74 65 44 62  y2.){.  SqliteDb
4ff0: 20 2a 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44   *pDb = (SqliteD
5000: 62 20 2a 29 70 3b 0a 20 20 54 63 6c 5f 4f 62 6a  b *)p;.  Tcl_Obj
5010: 20 2a 70 43 6d 64 3b 0a 20 20 73 74 61 74 69 63   *pCmd;.  static
5020: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 53   const char *azS
5030: 74 72 5b 5d 20 3d 20 7b 22 44 45 4c 45 54 45 22  tr[] = {"DELETE"
5040: 2c 20 22 49 4e 53 45 52 54 22 2c 20 22 55 50 44  , "INSERT", "UPD
5050: 41 54 45 22 7d 3b 0a 0a 20 20 61 73 73 65 72 74  ATE"};..  assert
5060: 28 20 28 53 51 4c 49 54 45 5f 44 45 4c 45 54 45  ( (SQLITE_DELETE
5070: 2d 31 29 2f 39 20 3d 3d 20 30 20 29 3b 0a 20 20  -1)/9 == 0 );.  
5080: 61 73 73 65 72 74 28 20 28 53 51 4c 49 54 45 5f  assert( (SQLITE_
5090: 49 4e 53 45 52 54 2d 31 29 2f 39 20 3d 3d 20 31  INSERT-1)/9 == 1
50a0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 53   );.  assert( (S
50b0: 51 4c 49 54 45 5f 55 50 44 41 54 45 2d 31 29 2f  QLITE_UPDATE-1)/
50c0: 39 20 3d 3d 20 32 20 29 3b 0a 20 20 61 73 73 65  9 == 2 );.  asse
50d0: 72 74 28 20 70 44 62 2d 3e 70 50 72 65 55 70 64  rt( pDb->pPreUpd
50e0: 61 74 65 48 6f 6f 6b 20 29 3b 0a 20 20 61 73 73  ateHook );.  ass
50f0: 65 72 74 28 20 64 62 3d 3d 70 44 62 2d 3e 64 62  ert( db==pDb->db
5100: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70   );.  assert( op
5110: 3d 3d 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 20  ==SQLITE_INSERT 
5120: 7c 7c 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 55 50  || op==SQLITE_UP
5130: 44 41 54 45 20 7c 7c 20 6f 70 3d 3d 53 51 4c 49  DATE || op==SQLI
5140: 54 45 5f 44 45 4c 45 54 45 20 29 3b 0a 0a 20 20  TE_DELETE );..  
5150: 70 43 6d 64 20 3d 20 54 63 6c 5f 44 75 70 6c 69  pCmd = Tcl_Dupli
5160: 63 61 74 65 4f 62 6a 28 70 44 62 2d 3e 70 50 72  cateObj(pDb->pPr
5170: 65 55 70 64 61 74 65 48 6f 6f 6b 29 3b 0a 20 20  eUpdateHook);.  
5180: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
5190: 28 70 43 6d 64 29 3b 0a 20 20 54 63 6c 5f 4c 69  (pCmd);.  Tcl_Li
51a0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
51b0: 6e 74 28 30 2c 20 70 43 6d 64 2c 20 54 63 6c 5f  nt(0, pCmd, Tcl_
51c0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 61 7a 53  NewStringObj(azS
51d0: 74 72 5b 28 6f 70 2d 31 29 2f 39 5d 2c 20 2d 31  tr[(op-1)/9], -1
51e0: 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ));.  Tcl_ListOb
51f0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30  jAppendElement(0
5200: 2c 20 70 43 6d 64 2c 20 54 63 6c 5f 4e 65 77 53  , pCmd, Tcl_NewS
5210: 74 72 69 6e 67 4f 62 6a 28 7a 44 62 2c 20 2d 31  tringObj(zDb, -1
5220: 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ));.  Tcl_ListOb
5230: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30  jAppendElement(0
5240: 2c 20 70 43 6d 64 2c 20 54 63 6c 5f 4e 65 77 53  , pCmd, Tcl_NewS
5250: 74 72 69 6e 67 4f 62 6a 28 7a 54 62 6c 2c 20 2d  tringObj(zTbl, -
5260: 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f  1));.  Tcl_ListO
5270: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
5280: 30 2c 20 70 43 6d 64 2c 20 54 63 6c 5f 4e 65 77  0, pCmd, Tcl_New
5290: 57 69 64 65 49 6e 74 4f 62 6a 28 69 4b 65 79 31  WideIntObj(iKey1
52a0: 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ));.  Tcl_ListOb
52b0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30  jAppendElement(0
52c0: 2c 20 70 43 6d 64 2c 20 54 63 6c 5f 4e 65 77 57  , pCmd, Tcl_NewW
52d0: 69 64 65 49 6e 74 4f 62 6a 28 69 4b 65 79 32 29  ideIntObj(iKey2)
52e0: 29 3b 0a 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a  );.  Tcl_EvalObj
52f0: 45 78 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20  Ex(pDb->interp, 
5300: 70 43 6d 64 2c 20 54 43 4c 5f 45 56 41 4c 5f 44  pCmd, TCL_EVAL_D
5310: 49 52 45 43 54 29 3b 0a 20 20 54 63 6c 5f 44 65  IRECT);.  Tcl_De
5320: 63 72 52 65 66 43 6f 75 6e 74 28 70 43 6d 64 29  crRefCount(pCmd)
5330: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
5340: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52 45 55  LITE_ENABLE_PREU
5350: 50 44 41 54 45 5f 48 4f 4f 4b 20 2a 2f 0a 0a 73  PDATE_HOOK */..s
5360: 74 61 74 69 63 20 76 6f 69 64 20 44 62 55 70 64  tatic void DbUpd
5370: 61 74 65 48 61 6e 64 6c 65 72 28 0a 20 20 76 6f  ateHandler(.  vo
5380: 69 64 20 2a 70 2c 20 0a 20 20 69 6e 74 20 6f 70  id *p, .  int op
5390: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
53a0: 7a 44 62 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68  zDb, .  const ch
53b0: 61 72 20 2a 7a 54 62 6c 2c 20 0a 20 20 73 71 6c  ar *zTbl, .  sql
53c0: 69 74 65 5f 69 6e 74 36 34 20 72 6f 77 69 64 0a  ite_int64 rowid.
53d0: 29 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70  ){.  SqliteDb *p
53e0: 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62 20 2a  Db = (SqliteDb *
53f0: 29 70 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  )p;.  Tcl_Obj *p
5400: 43 6d 64 3b 0a 20 20 73 74 61 74 69 63 20 63 6f  Cmd;.  static co
5410: 6e 73 74 20 63 68 61 72 20 2a 61 7a 53 74 72 5b  nst char *azStr[
5420: 5d 20 3d 20 7b 22 44 45 4c 45 54 45 22 2c 20 22  ] = {"DELETE", "
5430: 49 4e 53 45 52 54 22 2c 20 22 55 50 44 41 54 45  INSERT", "UPDATE
5440: 22 7d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 28  "};..  assert( (
5450: 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2d 31 29  SQLITE_DELETE-1)
5460: 2f 39 20 3d 3d 20 30 20 29 3b 0a 20 20 61 73 73  /9 == 0 );.  ass
5470: 65 72 74 28 20 28 53 51 4c 49 54 45 5f 49 4e 53  ert( (SQLITE_INS
5480: 45 52 54 2d 31 29 2f 39 20 3d 3d 20 31 20 29 3b  ERT-1)/9 == 1 );
5490: 0a 20 20 61 73 73 65 72 74 28 20 28 53 51 4c 49  .  assert( (SQLI
54a0: 54 45 5f 55 50 44 41 54 45 2d 31 29 2f 39 20 3d  TE_UPDATE-1)/9 =
54b0: 3d 20 32 20 29 3b 0a 0a 20 20 61 73 73 65 72 74  = 2 );..  assert
54c0: 28 20 70 44 62 2d 3e 70 55 70 64 61 74 65 48 6f  ( pDb->pUpdateHo
54d0: 6f 6b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ok );.  assert( 
54e0: 6f 70 3d 3d 53 51 4c 49 54 45 5f 49 4e 53 45 52  op==SQLITE_INSER
54f0: 54 20 7c 7c 20 6f 70 3d 3d 53 51 4c 49 54 45 5f  T || op==SQLITE_
5500: 55 50 44 41 54 45 20 7c 7c 20 6f 70 3d 3d 53 51  UPDATE || op==SQ
5510: 4c 49 54 45 5f 44 45 4c 45 54 45 20 29 3b 0a 0a  LITE_DELETE );..
5520: 20 20 70 43 6d 64 20 3d 20 54 63 6c 5f 44 75 70    pCmd = Tcl_Dup
5530: 6c 69 63 61 74 65 4f 62 6a 28 70 44 62 2d 3e 70  licateObj(pDb->p
5540: 55 70 64 61 74 65 48 6f 6f 6b 29 3b 0a 20 20 54  UpdateHook);.  T
5550: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
5560: 70 43 6d 64 29 3b 0a 20 20 54 63 6c 5f 4c 69 73  pCmd);.  Tcl_Lis
5570: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
5580: 74 28 30 2c 20 70 43 6d 64 2c 20 54 63 6c 5f 4e  t(0, pCmd, Tcl_N
5590: 65 77 53 74 72 69 6e 67 4f 62 6a 28 61 7a 53 74  ewStringObj(azSt
55a0: 72 5b 28 6f 70 2d 31 29 2f 39 5d 2c 20 2d 31 29  r[(op-1)/9], -1)
55b0: 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  );.  Tcl_ListObj
55c0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c  AppendElement(0,
55d0: 20 70 43 6d 64 2c 20 54 63 6c 5f 4e 65 77 53 74   pCmd, Tcl_NewSt
55e0: 72 69 6e 67 4f 62 6a 28 7a 44 62 2c 20 2d 31 29  ringObj(zDb, -1)
55f0: 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  );.  Tcl_ListObj
5600: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c  AppendElement(0,
5610: 20 70 43 6d 64 2c 20 54 63 6c 5f 4e 65 77 53 74   pCmd, Tcl_NewSt
5620: 72 69 6e 67 4f 62 6a 28 7a 54 62 6c 2c 20 2d 31  ringObj(zTbl, -1
5630: 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ));.  Tcl_ListOb
5640: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30  jAppendElement(0
5650: 2c 20 70 43 6d 64 2c 20 54 63 6c 5f 4e 65 77 57  , pCmd, Tcl_NewW
5660: 69 64 65 49 6e 74 4f 62 6a 28 72 6f 77 69 64 29  ideIntObj(rowid)
5670: 29 3b 0a 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a  );.  Tcl_EvalObj
5680: 45 78 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20  Ex(pDb->interp, 
5690: 70 43 6d 64 2c 20 54 43 4c 5f 45 56 41 4c 5f 44  pCmd, TCL_EVAL_D
56a0: 49 52 45 43 54 29 3b 0a 20 20 54 63 6c 5f 44 65  IRECT);.  Tcl_De
56b0: 63 72 52 65 66 43 6f 75 6e 74 28 70 43 6d 64 29  crRefCount(pCmd)
56c0: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  ;.}..static void
56d0: 20 74 63 6c 43 6f 6c 6c 61 74 65 4e 65 65 64 65   tclCollateNeede
56e0: 64 28 0a 20 20 76 6f 69 64 20 2a 70 43 74 78 2c  d(.  void *pCtx,
56f0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a  .  sqlite3 *db,.
5700: 20 20 69 6e 74 20 65 6e 63 2c 0a 20 20 63 6f 6e    int enc,.  con
5710: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 0a 29  st char *zName.)
5720: 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44  {.  SqliteDb *pD
5730: 62 20 3d 20 28 53 71 6c 69 74 65 44 62 20 2a 29  b = (SqliteDb *)
5740: 70 43 74 78 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20  pCtx;.  Tcl_Obj 
5750: 2a 70 53 63 72 69 70 74 20 3d 20 54 63 6c 5f 44  *pScript = Tcl_D
5760: 75 70 6c 69 63 61 74 65 4f 62 6a 28 70 44 62 2d  uplicateObj(pDb-
5770: 3e 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64 29  >pCollateNeeded)
5780: 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43  ;.  Tcl_IncrRefC
5790: 6f 75 6e 74 28 70 53 63 72 69 70 74 29 3b 0a 20  ount(pScript);. 
57a0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
57b0: 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 53 63  ndElement(0, pSc
57c0: 72 69 70 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72  ript, Tcl_NewStr
57d0: 69 6e 67 4f 62 6a 28 7a 4e 61 6d 65 2c 20 2d 31  ingObj(zName, -1
57e0: 29 29 3b 0a 20 20 54 63 6c 5f 45 76 61 6c 4f 62  ));.  Tcl_EvalOb
57f0: 6a 45 78 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c  jEx(pDb->interp,
5800: 20 70 53 63 72 69 70 74 2c 20 30 29 3b 0a 20 20   pScript, 0);.  
5810: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
5820: 28 70 53 63 72 69 70 74 29 3b 0a 7d 0a 0a 2f 2a  (pScript);.}../*
5830: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
5840: 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 65 76   is called to ev
5850: 61 6c 75 61 74 65 20 61 6e 20 53 51 4c 20 63 6f  aluate an SQL co
5860: 6c 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e  llation function
5870: 20 69 6d 70 6c 65 6d 65 6e 74 65 64 0a 2a 2a 20   implemented.** 
5880: 75 73 69 6e 67 20 54 43 4c 20 73 63 72 69 70 74  using TCL script
5890: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
58a0: 74 63 6c 53 71 6c 43 6f 6c 6c 61 74 65 28 0a 20  tclSqlCollate(. 
58b0: 20 76 6f 69 64 20 2a 70 43 74 78 2c 0a 20 20 69   void *pCtx,.  i
58c0: 6e 74 20 6e 41 2c 0a 20 20 63 6f 6e 73 74 20 76  nt nA,.  const v
58d0: 6f 69 64 20 2a 7a 41 2c 0a 20 20 69 6e 74 20 6e  oid *zA,.  int n
58e0: 42 2c 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  B,.  const void 
58f0: 2a 7a 42 0a 29 7b 0a 20 20 53 71 6c 43 6f 6c 6c  *zB.){.  SqlColl
5900: 61 74 65 20 2a 70 20 3d 20 28 53 71 6c 43 6f 6c  ate *p = (SqlCol
5910: 6c 61 74 65 20 2a 29 70 43 74 78 3b 0a 20 20 54  late *)pCtx;.  T
5920: 63 6c 5f 4f 62 6a 20 2a 70 43 6d 64 3b 0a 0a 20  cl_Obj *pCmd;.. 
5930: 20 70 43 6d 64 20 3d 20 54 63 6c 5f 4e 65 77 53   pCmd = Tcl_NewS
5940: 74 72 69 6e 67 4f 62 6a 28 70 2d 3e 7a 53 63 72  tringObj(p->zScr
5950: 69 70 74 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f  ipt, -1);.  Tcl_
5960: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 43 6d  IncrRefCount(pCm
5970: 64 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62  d);.  Tcl_ListOb
5980: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 70  jAppendElement(p
5990: 2d 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c 20  ->interp, pCmd, 
59a0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
59b0: 28 7a 41 2c 20 6e 41 29 29 3b 0a 20 20 54 63 6c  (zA, nA));.  Tcl
59c0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
59d0: 65 6d 65 6e 74 28 70 2d 3e 69 6e 74 65 72 70 2c  ement(p->interp,
59e0: 20 70 43 6d 64 2c 20 54 63 6c 5f 4e 65 77 53 74   pCmd, Tcl_NewSt
59f0: 72 69 6e 67 4f 62 6a 28 7a 42 2c 20 6e 42 29 29  ringObj(zB, nB))
5a00: 3b 0a 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45  ;.  Tcl_EvalObjE
5a10: 78 28 70 2d 3e 69 6e 74 65 72 70 2c 20 70 43 6d  x(p->interp, pCm
5a20: 64 2c 20 54 43 4c 5f 45 56 41 4c 5f 44 49 52 45  d, TCL_EVAL_DIRE
5a30: 43 54 29 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52  CT);.  Tcl_DecrR
5a40: 65 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20  efCount(pCmd);. 
5a50: 20 72 65 74 75 72 6e 20 28 61 74 6f 69 28 54 63   return (atoi(Tc
5a60: 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c  l_GetStringResul
5a70: 74 28 70 2d 3e 69 6e 74 65 72 70 29 29 29 3b 0a  t(p->interp)));.
5a80: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
5a90: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
5aa0: 74 6f 20 65 76 61 6c 75 61 74 65 20 61 6e 20 53  to evaluate an S
5ab0: 51 4c 20 66 75 6e 63 74 69 6f 6e 20 69 6d 70 6c  QL function impl
5ac0: 65 6d 65 6e 74 65 64 0a 2a 2a 20 75 73 69 6e 67  emented.** using
5ad0: 20 54 43 4c 20 73 63 72 69 70 74 2e 0a 2a 2f 0a   TCL script..*/.
5ae0: 73 74 61 74 69 63 20 76 6f 69 64 20 74 63 6c 53  static void tclS
5af0: 71 6c 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63  qlFunc(sqlite3_c
5b00: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c  ontext *context,
5b10: 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74   int argc, sqlit
5b20: 65 33 5f 76 61 6c 75 65 2a 2a 61 72 67 76 29 7b  e3_value**argv){
5b30: 0a 20 20 53 71 6c 46 75 6e 63 20 2a 70 20 3d 20  .  SqlFunc *p = 
5b40: 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74  sqlite3_user_dat
5b50: 61 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 54 63  a(context);.  Tc
5b60: 6c 5f 4f 62 6a 20 2a 70 43 6d 64 3b 0a 20 20 69  l_Obj *pCmd;.  i
5b70: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  nt i;.  int rc;.
5b80: 0a 20 20 69 66 28 20 61 72 67 63 3d 3d 30 20 29  .  if( argc==0 )
5b90: 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72  {.    /* If ther
5ba0: 65 20 61 72 65 20 6e 6f 20 61 72 67 75 6d 65 6e  e are no argumen
5bb0: 74 73 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69  ts to the functi
5bc0: 6f 6e 2c 20 63 61 6c 6c 20 54 63 6c 5f 45 76 61  on, call Tcl_Eva
5bd0: 6c 4f 62 6a 45 78 20 6f 6e 20 74 68 65 0a 20 20  lObjEx on the.  
5be0: 20 20 2a 2a 20 73 63 72 69 70 74 20 6f 62 6a 65    ** script obje
5bf0: 63 74 20 64 69 72 65 63 74 6c 79 2e 20 20 54 68  ct directly.  Th
5c00: 69 73 20 61 6c 6c 6f 77 73 20 74 68 65 20 54 43  is allows the TC
5c10: 4c 20 63 6f 6d 70 69 6c 65 72 20 74 6f 20 67 65  L compiler to ge
5c20: 6e 65 72 61 74 65 0a 20 20 20 20 2a 2a 20 62 79  nerate.    ** by
5c30: 74 65 63 6f 64 65 20 66 6f 72 20 74 68 65 20 63  tecode for the c
5c40: 6f 6d 6d 61 6e 64 20 6f 6e 20 74 68 65 20 66 69  ommand on the fi
5c50: 72 73 74 20 69 6e 76 6f 63 61 74 69 6f 6e 20 61  rst invocation a
5c60: 6e 64 20 74 68 75 73 20 6d 61 6b 65 0a 20 20 20  nd thus make.   
5c70: 20 2a 2a 20 73 75 62 73 65 71 75 65 6e 74 20 69   ** subsequent i
5c80: 6e 76 6f 63 61 74 69 6f 6e 73 20 6d 75 63 68 20  nvocations much 
5c90: 66 61 73 74 65 72 2e 20 2a 2f 0a 20 20 20 20 70  faster. */.    p
5ca0: 43 6d 64 20 3d 20 70 2d 3e 70 53 63 72 69 70 74  Cmd = p->pScript
5cb0: 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65  ;.    Tcl_IncrRe
5cc0: 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20  fCount(pCmd);.  
5cd0: 20 20 72 63 20 3d 20 54 63 6c 5f 45 76 61 6c 4f    rc = Tcl_EvalO
5ce0: 62 6a 45 78 28 70 2d 3e 69 6e 74 65 72 70 2c 20  bjEx(p->interp, 
5cf0: 70 43 6d 64 2c 20 30 29 3b 0a 20 20 20 20 54 63  pCmd, 0);.    Tc
5d00: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70  l_DecrRefCount(p
5d10: 43 6d 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Cmd);.  }else{. 
5d20: 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61     /* If there a
5d30: 72 65 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20  re arguments to 
5d40: 74 68 65 20 66 75 6e 63 74 69 6f 6e 2c 20 6d 61  the function, ma
5d50: 6b 65 20 61 20 73 68 61 6c 6c 6f 77 20 63 6f 70  ke a shallow cop
5d60: 79 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  y of the.    ** 
5d70: 73 63 72 69 70 74 20 6f 62 6a 65 63 74 2c 20 6c  script object, l
5d80: 61 70 70 65 6e 64 20 74 68 65 20 61 72 67 75 6d  append the argum
5d90: 65 6e 74 73 2c 20 74 68 65 6e 20 65 76 61 6c 75  ents, then evalu
5da0: 61 74 65 20 74 68 65 20 63 6f 70 79 2e 0a 20 20  ate the copy..  
5db0: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 42 79 20 22    **.    ** By "
5dc0: 73 68 61 6c 6c 6f 77 22 20 63 6f 70 79 2c 20 77  shallow" copy, w
5dd0: 65 20 6d 65 61 6e 20 61 20 6f 6e 6c 79 20 74 68  e mean a only th
5de0: 65 20 6f 75 74 65 72 20 6c 69 73 74 20 54 63 6c  e outer list Tcl
5df0: 5f 4f 62 6a 20 69 73 20 64 75 70 6c 69 63 61 74  _Obj is duplicat
5e00: 65 64 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 6e  ed..    ** The n
5e10: 65 77 20 54 63 6c 5f 4f 62 6a 20 63 6f 6e 74 61  ew Tcl_Obj conta
5e20: 69 6e 73 20 70 6f 69 6e 74 65 72 73 20 74 6f 20  ins pointers to 
5e30: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 6c 69 73  the original lis
5e40: 74 20 65 6c 65 6d 65 6e 74 73 2e 20 0a 20 20 20  t elements. .   
5e50: 20 2a 2a 20 54 68 61 74 20 77 61 79 2c 20 77 68   ** That way, wh
5e60: 65 6e 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 76 28  en Tcl_EvalObjv(
5e70: 29 20 69 73 20 72 75 6e 20 61 6e 64 20 73 68 69  ) is run and shi
5e80: 6d 6d 65 72 73 20 74 68 65 20 66 69 72 73 74 20  mmers the first 
5e90: 65 6c 65 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 6f  element.    ** o
5ea0: 66 20 74 68 65 20 6c 69 73 74 20 74 6f 20 74 63  f the list to tc
5eb0: 6c 43 6d 64 4e 61 6d 65 54 79 70 65 2c 20 74 68  lCmdNameType, th
5ec0: 61 74 20 61 6c 74 65 72 6e 61 74 65 20 72 65 70  at alternate rep
5ed0: 72 65 73 65 6e 74 61 74 69 6f 6e 20 77 69 6c 6c  resentation will
5ee0: 0a 20 20 20 20 2a 2a 20 62 65 20 70 72 65 73 65  .    ** be prese
5ef0: 72 76 65 64 20 61 6e 64 20 72 65 75 73 65 64 20  rved and reused 
5f00: 6f 6e 20 74 68 65 20 6e 65 78 74 20 69 6e 76 6f  on the next invo
5f10: 63 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20  cation..    */. 
5f20: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 61 41 72     Tcl_Obj **aAr
5f30: 67 3b 0a 20 20 20 20 69 6e 74 20 6e 41 72 67 3b  g;.    int nArg;
5f40: 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 4c 69 73  .    if( Tcl_Lis
5f50: 74 4f 62 6a 47 65 74 45 6c 65 6d 65 6e 74 73 28  tObjGetElements(
5f60: 70 2d 3e 69 6e 74 65 72 70 2c 20 70 2d 3e 70 53  p->interp, p->pS
5f70: 63 72 69 70 74 2c 20 26 6e 41 72 67 2c 20 26 61  cript, &nArg, &a
5f80: 41 72 67 29 20 29 7b 0a 20 20 20 20 20 20 73 71  Arg) ){.      sq
5f90: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72  lite3_result_err
5fa0: 6f 72 28 63 6f 6e 74 65 78 74 2c 20 54 63 6c 5f  or(context, Tcl_
5fb0: 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28  GetStringResult(
5fc0: 70 2d 3e 69 6e 74 65 72 70 29 2c 20 2d 31 29 3b  p->interp), -1);
5fd0: 20 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a   .      return;.
5fe0: 20 20 20 20 7d 20 20 20 20 20 0a 20 20 20 20 70      }     .    p
5ff0: 43 6d 64 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73  Cmd = Tcl_NewLis
6000: 74 4f 62 6a 28 6e 41 72 67 2c 20 61 41 72 67 29  tObj(nArg, aArg)
6010: 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65  ;.    Tcl_IncrRe
6020: 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20  fCount(pCmd);.  
6030: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 67    for(i=0; i<arg
6040: 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  c; i++){.      s
6050: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 49  qlite3_value *pI
6060: 6e 20 3d 20 61 72 67 76 5b 69 5d 3b 0a 20 20 20  n = argv[i];.   
6070: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 56 61 6c     Tcl_Obj *pVal
6080: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 0a 20  ;.            . 
6090: 20 20 20 20 20 2f 2a 20 53 65 74 20 70 56 61 6c       /* Set pVal
60a0: 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20   to contain the 
60b0: 69 27 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  i'th column of t
60c0: 68 69 73 20 72 6f 77 2e 20 2a 2f 0a 20 20 20 20  his row. */.    
60d0: 20 20 73 77 69 74 63 68 28 20 73 71 6c 69 74 65    switch( sqlite
60e0: 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 70 49 6e  3_value_type(pIn
60f0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63 61 73  ) ){.        cas
6100: 65 20 53 51 4c 49 54 45 5f 42 4c 4f 42 3a 20 7b  e SQLITE_BLOB: {
6110: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 62  .          int b
6120: 79 74 65 73 20 3d 20 73 71 6c 69 74 65 33 5f 76  ytes = sqlite3_v
6130: 61 6c 75 65 5f 62 79 74 65 73 28 70 49 6e 29 3b  alue_bytes(pIn);
6140: 0a 20 20 20 20 20 20 20 20 20 20 70 56 61 6c 20  .          pVal 
6150: 3d 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72  = Tcl_NewByteArr
6160: 61 79 4f 62 6a 28 73 71 6c 69 74 65 33 5f 76 61  ayObj(sqlite3_va
6170: 6c 75 65 5f 62 6c 6f 62 28 70 49 6e 29 2c 20 62  lue_blob(pIn), b
6180: 79 74 65 73 29 3b 0a 20 20 20 20 20 20 20 20 20  ytes);.         
6190: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
61a0: 7d 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 53  }.        case S
61b0: 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3a 20 7b  QLITE_INTEGER: {
61c0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
61d0: 65 5f 69 6e 74 36 34 20 76 20 3d 20 73 71 6c 69  e_int64 v = sqli
61e0: 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28  te3_value_int64(
61f0: 70 49 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20  pIn);.          
6200: 69 66 28 20 76 3e 3d 2d 32 31 34 37 34 38 33 36  if( v>=-21474836
6210: 34 37 20 26 26 20 76 3c 3d 32 31 34 37 34 38 33  47 && v<=2147483
6220: 36 34 37 20 29 7b 0a 20 20 20 20 20 20 20 20 20  647 ){.         
6230: 20 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65     pVal = Tcl_Ne
6240: 77 49 6e 74 4f 62 6a 28 28 69 6e 74 29 76 29 3b  wIntObj((int)v);
6250: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
6260: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 56  {.            pV
6270: 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 57 69 64 65  al = Tcl_NewWide
6280: 49 6e 74 4f 62 6a 28 76 29 3b 0a 20 20 20 20 20  IntObj(v);.     
6290: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
62a0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
62b0: 7d 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 53  }.        case S
62c0: 51 4c 49 54 45 5f 46 4c 4f 41 54 3a 20 7b 0a 20  QLITE_FLOAT: {. 
62d0: 20 20 20 20 20 20 20 20 20 64 6f 75 62 6c 65 20           double 
62e0: 72 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  r = sqlite3_valu
62f0: 65 5f 64 6f 75 62 6c 65 28 70 49 6e 29 3b 0a 20  e_double(pIn);. 
6300: 20 20 20 20 20 20 20 20 20 70 56 61 6c 20 3d 20           pVal = 
6310: 54 63 6c 5f 4e 65 77 44 6f 75 62 6c 65 4f 62 6a  Tcl_NewDoubleObj
6320: 28 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62  (r);.          b
6330: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
6340: 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c          case SQL
6350: 49 54 45 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20  ITE_NULL: {.    
6360: 20 20 20 20 20 20 70 56 61 6c 20 3d 20 54 63 6c        pVal = Tcl
6370: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 22  _NewStringObj(""
6380: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
6390: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
63a0: 0a 20 20 20 20 20 20 20 20 64 65 66 61 75 6c 74  .        default
63b0: 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  : {.          in
63c0: 74 20 62 79 74 65 73 20 3d 20 73 71 6c 69 74 65  t bytes = sqlite
63d0: 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 70 49  3_value_bytes(pI
63e0: 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 56  n);.          pV
63f0: 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69  al = Tcl_NewStri
6400: 6e 67 4f 62 6a 28 28 63 68 61 72 20 2a 29 73 71  ngObj((char *)sq
6410: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
6420: 28 70 49 6e 29 2c 20 62 79 74 65 73 29 3b 0a 20  (pIn), bytes);. 
6430: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
6440: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
6450: 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 54 63 6c  }.      rc = Tcl
6460: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
6470: 65 6d 65 6e 74 28 70 2d 3e 69 6e 74 65 72 70 2c  ement(p->interp,
6480: 20 70 43 6d 64 2c 20 70 56 61 6c 29 3b 0a 20 20   pCmd, pVal);.  
6490: 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
64a0: 20 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65        Tcl_DecrRe
64b0: 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20  fCount(pCmd);.  
64c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
64d0: 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65  sult_error(conte
64e0: 78 74 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  xt, Tcl_GetStrin
64f0: 67 52 65 73 75 6c 74 28 70 2d 3e 69 6e 74 65 72  gResult(p->inter
6500: 70 29 2c 20 2d 31 29 3b 20 0a 20 20 20 20 20 20  p), -1); .      
6510: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20    return;.      
6520: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
6530: 21 70 2d 3e 75 73 65 45 76 61 6c 4f 62 6a 76 20  !p->useEvalObjv 
6540: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 63 6c 5f  ){.      /* Tcl_
6550: 45 76 61 6c 4f 62 6a 45 78 28 29 20 77 69 6c 6c  EvalObjEx() will
6560: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63   automatically c
6570: 61 6c 6c 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 76  all Tcl_EvalObjv
6580: 28 29 20 69 66 20 70 43 6d 64 0a 20 20 20 20 20  () if pCmd.     
6590: 20 2a 2a 20 69 73 20 61 20 6c 69 73 74 20 77 69   ** is a list wi
65a0: 74 68 6f 75 74 20 61 20 73 74 72 69 6e 67 20 72  thout a string r
65b0: 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 2e 20 20  epresentation.  
65c0: 54 6f 20 70 72 65 76 65 6e 74 20 74 68 69 73 20  To prevent this 
65d0: 66 72 6f 6d 0a 20 20 20 20 20 20 2a 2a 20 68 61  from.      ** ha
65e0: 70 70 65 6e 69 6e 67 2c 20 6d 61 6b 65 20 73 75  ppening, make su
65f0: 72 65 20 70 43 6d 64 20 68 61 73 20 61 20 76 61  re pCmd has a va
6600: 6c 69 64 20 73 74 72 69 6e 67 20 72 65 70 72 65  lid string repre
6610: 73 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 20  sentation */.   
6620: 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
6630: 28 70 43 6d 64 29 3b 0a 20 20 20 20 7d 0a 20 20  (pCmd);.    }.  
6640: 20 20 72 63 20 3d 20 54 63 6c 5f 45 76 61 6c 4f    rc = Tcl_EvalO
6650: 62 6a 45 78 28 70 2d 3e 69 6e 74 65 72 70 2c 20  bjEx(p->interp, 
6660: 70 43 6d 64 2c 20 54 43 4c 5f 45 56 41 4c 5f 44  pCmd, TCL_EVAL_D
6670: 49 52 45 43 54 29 3b 0a 20 20 20 20 54 63 6c 5f  IRECT);.    Tcl_
6680: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 43 6d  DecrRefCount(pCm
6690: 64 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72  d);.  }..  if( r
66a0: 63 20 26 26 20 72 63 21 3d 54 43 4c 5f 52 45 54  c && rc!=TCL_RET
66b0: 55 52 4e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  URN ){.    sqlit
66c0: 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28  e3_result_error(
66d0: 63 6f 6e 74 65 78 74 2c 20 54 63 6c 5f 47 65 74  context, Tcl_Get
66e0: 53 74 72 69 6e 67 52 65 73 75 6c 74 28 70 2d 3e  StringResult(p->
66f0: 69 6e 74 65 72 70 29 2c 20 2d 31 29 3b 20 0a 20  interp), -1); . 
6700: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 54 63 6c 5f   }else{.    Tcl_
6710: 4f 62 6a 20 2a 70 56 61 72 20 3d 20 54 63 6c 5f  Obj *pVar = Tcl_
6720: 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 70 2d 3e  GetObjResult(p->
6730: 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 69 6e 74  interp);.    int
6740: 20 6e 3b 0a 20 20 20 20 75 38 20 2a 64 61 74 61   n;.    u8 *data
6750: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
6760: 20 2a 7a 54 79 70 65 20 3d 20 28 70 56 61 72 2d   *zType = (pVar-
6770: 3e 74 79 70 65 50 74 72 20 3f 20 70 56 61 72 2d  >typePtr ? pVar-
6780: 3e 74 79 70 65 50 74 72 2d 3e 6e 61 6d 65 20 3a  >typePtr->name :
6790: 20 22 22 29 3b 0a 20 20 20 20 63 68 61 72 20 63   "");.    char c
67a0: 20 3d 20 7a 54 79 70 65 5b 30 5d 3b 0a 20 20 20   = zType[0];.   
67b0: 20 69 66 28 20 63 3d 3d 27 62 27 20 26 26 20 73   if( c=='b' && s
67c0: 74 72 63 6d 70 28 7a 54 79 70 65 2c 22 62 79 74  trcmp(zType,"byt
67d0: 65 61 72 72 61 79 22 29 3d 3d 30 20 26 26 20 70  earray")==0 && p
67e0: 56 61 72 2d 3e 62 79 74 65 73 3d 3d 30 20 29 7b  Var->bytes==0 ){
67f0: 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 72  .      /* Only r
6800: 65 74 75 72 6e 20 61 20 42 4c 4f 42 20 74 79 70  eturn a BLOB typ
6810: 65 20 69 66 20 74 68 65 20 54 63 6c 20 76 61 72  e if the Tcl var
6820: 69 61 62 6c 65 20 69 73 20 61 20 62 79 74 65 61  iable is a bytea
6830: 72 72 61 79 20 61 6e 64 0a 20 20 20 20 20 20 2a  rray and.      *
6840: 2a 20 68 61 73 20 6e 6f 20 73 74 72 69 6e 67 20  * has no string 
6850: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 2e 20  representation. 
6860: 2a 2f 0a 20 20 20 20 20 20 64 61 74 61 20 3d 20  */.      data = 
6870: 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79  Tcl_GetByteArray
6880: 46 72 6f 6d 4f 62 6a 28 70 56 61 72 2c 20 26 6e  FromObj(pVar, &n
6890: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
68a0: 5f 72 65 73 75 6c 74 5f 62 6c 6f 62 28 63 6f 6e  _result_blob(con
68b0: 74 65 78 74 2c 20 64 61 74 61 2c 20 6e 2c 20 53  text, data, n, S
68c0: 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
68d0: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
68e0: 63 3d 3d 27 62 27 20 26 26 20 73 74 72 63 6d 70  c=='b' && strcmp
68f0: 28 7a 54 79 70 65 2c 22 62 6f 6f 6c 65 61 6e 22  (zType,"boolean"
6900: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 54 63  )==0 ){.      Tc
6910: 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
6920: 30 2c 20 70 56 61 72 2c 20 26 6e 29 3b 0a 20 20  0, pVar, &n);.  
6930: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
6940: 6c 74 5f 69 6e 74 28 63 6f 6e 74 65 78 74 2c 20  lt_int(context, 
6950: 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  n);.    }else if
6960: 28 20 63 3d 3d 27 64 27 20 26 26 20 73 74 72 63  ( c=='d' && strc
6970: 6d 70 28 7a 54 79 70 65 2c 22 64 6f 75 62 6c 65  mp(zType,"double
6980: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 64  ")==0 ){.      d
6990: 6f 75 62 6c 65 20 72 3b 0a 20 20 20 20 20 20 54  ouble r;.      T
69a0: 63 6c 5f 47 65 74 44 6f 75 62 6c 65 46 72 6f 6d  cl_GetDoubleFrom
69b0: 4f 62 6a 28 30 2c 20 70 56 61 72 2c 20 26 72 29  Obj(0, pVar, &r)
69c0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
69d0: 72 65 73 75 6c 74 5f 64 6f 75 62 6c 65 28 63 6f  result_double(co
69e0: 6e 74 65 78 74 2c 20 72 29 3b 0a 20 20 20 20 7d  ntext, r);.    }
69f0: 65 6c 73 65 20 69 66 28 20 28 63 3d 3d 27 77 27  else if( (c=='w'
6a00: 20 26 26 20 73 74 72 63 6d 70 28 7a 54 79 70 65   && strcmp(zType
6a10: 2c 22 77 69 64 65 49 6e 74 22 29 3d 3d 30 29 20  ,"wideInt")==0) 
6a20: 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 28 63 3d  ||.          (c=
6a30: 3d 27 69 27 20 26 26 20 73 74 72 63 6d 70 28 7a  ='i' && strcmp(z
6a40: 54 79 70 65 2c 22 69 6e 74 22 29 3d 3d 30 29 20  Type,"int")==0) 
6a50: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 69 64  ){.      Tcl_Wid
6a60: 65 49 6e 74 20 76 3b 0a 20 20 20 20 20 20 54 63  eInt v;.      Tc
6a70: 6c 5f 47 65 74 57 69 64 65 49 6e 74 46 72 6f 6d  l_GetWideIntFrom
6a80: 4f 62 6a 28 30 2c 20 70 56 61 72 2c 20 26 76 29  Obj(0, pVar, &v)
6a90: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
6aa0: 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 63 6f 6e  result_int64(con
6ab0: 74 65 78 74 2c 20 76 29 3b 0a 20 20 20 20 7d 65  text, v);.    }e
6ac0: 6c 73 65 7b 0a 20 20 20 20 20 20 64 61 74 61 20  lse{.      data 
6ad0: 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  = (unsigned char
6ae0: 20 2a 29 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   *)Tcl_GetString
6af0: 46 72 6f 6d 4f 62 6a 28 70 56 61 72 2c 20 26 6e  FromObj(pVar, &n
6b00: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
6b10: 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e  _result_text(con
6b20: 74 65 78 74 2c 20 28 63 68 61 72 20 2a 29 64 61  text, (char *)da
6b30: 74 61 2c 20 6e 2c 20 53 51 4c 49 54 45 5f 54 52  ta, n, SQLITE_TR
6b40: 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 7d 0a  ANSIENT);.    }.
6b50: 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53    }.}..#ifndef S
6b60: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f  QLITE_OMIT_AUTHO
6b70: 52 49 5a 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 54  RIZATION./*.** T
6b80: 68 69 73 20 69 73 20 74 68 65 20 61 75 74 68 65  his is the authe
6b90: 6e 74 69 63 61 74 69 6f 6e 20 66 75 6e 63 74 69  ntication functi
6ba0: 6f 6e 2e 20 20 49 74 20 61 70 70 65 6e 64 73 20  on.  It appends 
6bb0: 74 68 65 20 61 75 74 68 65 6e 74 69 63 61 74 69  the authenticati
6bc0: 6f 6e 0a 2a 2a 20 74 79 70 65 20 63 6f 64 65 20  on.** type code 
6bd0: 61 6e 64 20 74 68 65 20 74 77 6f 20 61 72 67 75  and the two argu
6be0: 6d 65 6e 74 73 20 74 6f 20 7a 43 6d 64 5b 5d 20  ments to zCmd[] 
6bf0: 74 68 65 6e 20 69 6e 76 6f 6b 65 73 20 74 68 65  then invokes the
6c00: 20 72 65 73 75 6c 74 0a 2a 2a 20 6f 6e 20 74 68   result.** on th
6c10: 65 20 69 6e 74 65 72 70 72 65 74 65 72 2e 20 20  e interpreter.  
6c20: 54 68 65 20 72 65 70 6c 79 20 69 73 20 65 78 61  The reply is exa
6c30: 6d 69 6e 65 64 20 74 6f 20 64 65 74 65 72 6d 69  mined to determi
6c40: 6e 65 20 69 66 20 74 68 65 0a 2a 2a 20 61 75 74  ne if the.** aut
6c50: 68 65 6e 74 69 63 61 74 69 6f 6e 20 66 61 69 6c  hentication fail
6c60: 73 20 6f 72 20 73 75 63 63 65 65 64 73 2e 0a 2a  s or succeeds..*
6c70: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 75 74  /.static int aut
6c80: 68 5f 63 61 6c 6c 62 61 63 6b 28 0a 20 20 76 6f  h_callback(.  vo
6c90: 69 64 20 2a 70 41 72 67 2c 0a 20 20 69 6e 74 20  id *pArg,.  int 
6ca0: 63 6f 64 65 2c 0a 20 20 63 6f 6e 73 74 20 63 68  code,.  const ch
6cb0: 61 72 20 2a 7a 41 72 67 31 2c 0a 20 20 63 6f 6e  ar *zArg1,.  con
6cc0: 73 74 20 63 68 61 72 20 2a 7a 41 72 67 32 2c 0a  st char *zArg2,.
6cd0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41    const char *zA
6ce0: 72 67 33 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  rg3,.  const cha
6cf0: 72 20 2a 7a 41 72 67 34 0a 29 7b 0a 20 20 63 68  r *zArg4.){.  ch
6d00: 61 72 20 2a 7a 43 6f 64 65 3b 0a 20 20 54 63 6c  ar *zCode;.  Tcl
6d10: 5f 44 53 74 72 69 6e 67 20 73 74 72 3b 0a 20 20  _DString str;.  
6d20: 69 6e 74 20 72 63 3b 0a 20 20 63 6f 6e 73 74 20  int rc;.  const 
6d30: 63 68 61 72 20 2a 7a 52 65 70 6c 79 3b 0a 20 20  char *zReply;.  
6d40: 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20  SqliteDb *pDb = 
6d50: 28 53 71 6c 69 74 65 44 62 2a 29 70 41 72 67 3b  (SqliteDb*)pArg;
6d60: 0a 20 20 69 66 28 20 70 44 62 2d 3e 64 69 73 61  .  if( pDb->disa
6d70: 62 6c 65 41 75 74 68 20 29 20 72 65 74 75 72 6e  bleAuth ) return
6d80: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 73   SQLITE_OK;..  s
6d90: 77 69 74 63 68 28 20 63 6f 64 65 20 29 7b 0a 20  witch( code ){. 
6da0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
6db0: 4f 50 59 20 20 20 20 20 20 20 20 20 20 20 20 20  OPY             
6dc0: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
6dd0: 5f 43 4f 50 59 22 3b 20 62 72 65 61 6b 3b 0a 20  _COPY"; break;. 
6de0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
6df0: 52 45 41 54 45 5f 49 4e 44 45 58 20 20 20 20 20  REATE_INDEX     
6e00: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
6e10: 5f 43 52 45 41 54 45 5f 49 4e 44 45 58 22 3b 20  _CREATE_INDEX"; 
6e20: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
6e30: 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 41  SQLITE_CREATE_TA
6e40: 42 4c 45 20 20 20 20 20 20 3a 20 7a 43 6f 64 65  BLE      : zCode
6e50: 3d 22 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  ="SQLITE_CREATE_
6e60: 54 41 42 4c 45 22 3b 20 62 72 65 61 6b 3b 0a 20  TABLE"; break;. 
6e70: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
6e80: 52 45 41 54 45 5f 54 45 4d 50 5f 49 4e 44 45 58  REATE_TEMP_INDEX
6e90: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
6ea0: 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 49 4e 44  _CREATE_TEMP_IND
6eb0: 45 58 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  EX"; break;.    
6ec0: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 52 45 41  case SQLITE_CREA
6ed0: 54 45 5f 54 45 4d 50 5f 54 41 42 4c 45 20 3a 20  TE_TEMP_TABLE : 
6ee0: 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43 52  zCode="SQLITE_CR
6ef0: 45 41 54 45 5f 54 45 4d 50 5f 54 41 42 4c 45 22  EATE_TEMP_TABLE"
6f00: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
6f10: 65 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  e SQLITE_CREATE_
6f20: 54 45 4d 50 5f 54 52 49 47 47 45 52 3a 20 7a 43  TEMP_TRIGGER: zC
6f30: 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43 52 45 41  ode="SQLITE_CREA
6f40: 54 45 5f 54 45 4d 50 5f 54 52 49 47 47 45 52 22  TE_TEMP_TRIGGER"
6f50: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
6f60: 65 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  e SQLITE_CREATE_
6f70: 54 45 4d 50 5f 56 49 45 57 20 20 3a 20 7a 43 6f  TEMP_VIEW  : zCo
6f80: 64 65 3d 22 53 51 4c 49 54 45 5f 43 52 45 41 54  de="SQLITE_CREAT
6f90: 45 5f 54 45 4d 50 5f 56 49 45 57 22 3b 20 62 72  E_TEMP_VIEW"; br
6fa0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
6fb0: 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 52 49 47  LITE_CREATE_TRIG
6fc0: 47 45 52 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22  GER    : zCode="
6fd0: 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 52  SQLITE_CREATE_TR
6fe0: 49 47 47 45 52 22 3b 20 62 72 65 61 6b 3b 0a 20  IGGER"; break;. 
6ff0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
7000: 52 45 41 54 45 5f 56 49 45 57 20 20 20 20 20 20  REATE_VIEW      
7010: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
7020: 5f 43 52 45 41 54 45 5f 56 49 45 57 22 3b 20 62  _CREATE_VIEW"; b
7030: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
7040: 51 4c 49 54 45 5f 44 45 4c 45 54 45 20 20 20 20  QLITE_DELETE    
7050: 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d          : zCode=
7060: 22 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 22 3b  "SQLITE_DELETE";
7070: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
7080: 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 49 4e 44   SQLITE_DROP_IND
7090: 45 58 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64  EX        : zCod
70a0: 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f 49  e="SQLITE_DROP_I
70b0: 4e 44 45 58 22 3b 20 62 72 65 61 6b 3b 0a 20 20  NDEX"; break;.  
70c0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44 52    case SQLITE_DR
70d0: 4f 50 5f 54 41 42 4c 45 20 20 20 20 20 20 20 20  OP_TABLE        
70e0: 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f  : zCode="SQLITE_
70f0: 44 52 4f 50 5f 54 41 42 4c 45 22 3b 20 62 72 65  DROP_TABLE"; bre
7100: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
7110: 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 49 4e  ITE_DROP_TEMP_IN
7120: 44 45 58 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53  DEX   : zCode="S
7130: 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f  QLITE_DROP_TEMP_
7140: 49 4e 44 45 58 22 3b 20 62 72 65 61 6b 3b 0a 20  INDEX"; break;. 
7150: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44     case SQLITE_D
7160: 52 4f 50 5f 54 45 4d 50 5f 54 41 42 4c 45 20 20  ROP_TEMP_TABLE  
7170: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
7180: 5f 44 52 4f 50 5f 54 45 4d 50 5f 54 41 42 4c 45  _DROP_TEMP_TABLE
7190: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
71a0: 73 65 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54  se SQLITE_DROP_T
71b0: 45 4d 50 5f 54 52 49 47 47 45 52 20 3a 20 7a 43  EMP_TRIGGER : zC
71c0: 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50  ode="SQLITE_DROP
71d0: 5f 54 45 4d 50 5f 54 52 49 47 47 45 52 22 3b 20  _TEMP_TRIGGER"; 
71e0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
71f0: 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50  SQLITE_DROP_TEMP
7200: 5f 56 49 45 57 20 20 20 20 3a 20 7a 43 6f 64 65  _VIEW    : zCode
7210: 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45  ="SQLITE_DROP_TE
7220: 4d 50 5f 56 49 45 57 22 3b 20 62 72 65 61 6b 3b  MP_VIEW"; break;
7230: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
7240: 5f 44 52 4f 50 5f 54 52 49 47 47 45 52 20 20 20  _DROP_TRIGGER   
7250: 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49     : zCode="SQLI
7260: 54 45 5f 44 52 4f 50 5f 54 52 49 47 47 45 52 22  TE_DROP_TRIGGER"
7270: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
7280: 65 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56 49  e SQLITE_DROP_VI
7290: 45 57 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f  EW         : zCo
72a0: 64 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f  de="SQLITE_DROP_
72b0: 56 49 45 57 22 3b 20 62 72 65 61 6b 3b 0a 20 20  VIEW"; break;.  
72c0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e    case SQLITE_IN
72d0: 53 45 52 54 20 20 20 20 20 20 20 20 20 20 20 20  SERT            
72e0: 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f  : zCode="SQLITE_
72f0: 49 4e 53 45 52 54 22 3b 20 62 72 65 61 6b 3b 0a  INSERT"; break;.
7300: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
7310: 50 52 41 47 4d 41 20 20 20 20 20 20 20 20 20 20  PRAGMA          
7320: 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54    : zCode="SQLIT
7330: 45 5f 50 52 41 47 4d 41 22 3b 20 62 72 65 61 6b  E_PRAGMA"; break
7340: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
7350: 45 5f 52 45 41 44 20 20 20 20 20 20 20 20 20 20  E_READ          
7360: 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c      : zCode="SQL
7370: 49 54 45 5f 52 45 41 44 22 3b 20 62 72 65 61 6b  ITE_READ"; break
7380: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
7390: 45 5f 53 45 4c 45 43 54 20 20 20 20 20 20 20 20  E_SELECT        
73a0: 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c      : zCode="SQL
73b0: 49 54 45 5f 53 45 4c 45 43 54 22 3b 20 62 72 65  ITE_SELECT"; bre
73c0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
73d0: 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 20  ITE_TRANSACTION 
73e0: 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53        : zCode="S
73f0: 51 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f  QLITE_TRANSACTIO
7400: 4e 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  N"; break;.    c
7410: 61 73 65 20 53 51 4c 49 54 45 5f 55 50 44 41 54  ase SQLITE_UPDAT
7420: 45 20 20 20 20 20 20 20 20 20 20 20 20 3a 20 7a  E            : z
7430: 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 55 50 44  Code="SQLITE_UPD
7440: 41 54 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  ATE"; break;.   
7450: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 54 54   case SQLITE_ATT
7460: 41 43 48 20 20 20 20 20 20 20 20 20 20 20 20 3a  ACH            :
7470: 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 41   zCode="SQLITE_A
7480: 54 54 41 43 48 22 3b 20 62 72 65 61 6b 3b 0a 20  TTACH"; break;. 
7490: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44     case SQLITE_D
74a0: 45 54 41 43 48 20 20 20 20 20 20 20 20 20 20 20  ETACH           
74b0: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
74c0: 5f 44 45 54 41 43 48 22 3b 20 62 72 65 61 6b 3b  _DETACH"; break;
74d0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
74e0: 5f 41 4c 54 45 52 5f 54 41 42 4c 45 20 20 20 20  _ALTER_TABLE    
74f0: 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49     : zCode="SQLI
7500: 54 45 5f 41 4c 54 45 52 5f 54 41 42 4c 45 22 3b  TE_ALTER_TABLE";
7510: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
7520: 20 53 51 4c 49 54 45 5f 52 45 49 4e 44 45 58 20   SQLITE_REINDEX 
7530: 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64            : zCod
7540: 65 3d 22 53 51 4c 49 54 45 5f 52 45 49 4e 44 45  e="SQLITE_REINDE
7550: 58 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  X"; break;.    c
7560: 61 73 65 20 53 51 4c 49 54 45 5f 41 4e 41 4c 59  ase SQLITE_ANALY
7570: 5a 45 20 20 20 20 20 20 20 20 20 20 20 3a 20 7a  ZE           : z
7580: 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 41 4e 41  Code="SQLITE_ANA
7590: 4c 59 5a 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20  LYZE"; break;.  
75a0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 52    case SQLITE_CR
75b0: 45 41 54 45 5f 56 54 41 42 4c 45 20 20 20 20 20  EATE_VTABLE     
75c0: 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f  : zCode="SQLITE_
75d0: 43 52 45 41 54 45 5f 56 54 41 42 4c 45 22 3b 20  CREATE_VTABLE"; 
75e0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
75f0: 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56 54 41 42  SQLITE_DROP_VTAB
7600: 4c 45 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65  LE       : zCode
7610: 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56 54  ="SQLITE_DROP_VT
7620: 41 42 4c 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20  ABLE"; break;.  
7630: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 55    case SQLITE_FU
7640: 4e 43 54 49 4f 4e 20 20 20 20 20 20 20 20 20 20  NCTION          
7650: 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f  : zCode="SQLITE_
7660: 46 55 4e 43 54 49 4f 4e 22 3b 20 62 72 65 61 6b  FUNCTION"; break
7670: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
7680: 45 5f 53 41 56 45 50 4f 49 4e 54 20 20 20 20 20  E_SAVEPOINT     
7690: 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c      : zCode="SQL
76a0: 49 54 45 5f 53 41 56 45 50 4f 49 4e 54 22 3b 20  ITE_SAVEPOINT"; 
76b0: 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75  break;.    defau
76c0: 6c 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  lt              
76d0: 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65           : zCode
76e0: 3d 22 3f 3f 3f 3f 22 3b 20 62 72 65 61 6b 3b 0a  ="????"; break;.
76f0: 20 20 7d 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e    }.  Tcl_DStrin
7700: 67 49 6e 69 74 28 26 73 74 72 29 3b 0a 20 20 54  gInit(&str);.  T
7710: 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64  cl_DStringAppend
7720: 28 26 73 74 72 2c 20 70 44 62 2d 3e 7a 41 75 74  (&str, pDb->zAut
7730: 68 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 44 53  h, -1);.  Tcl_DS
7740: 74 72 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65  tringAppendEleme
7750: 6e 74 28 26 73 74 72 2c 20 7a 43 6f 64 65 29 3b  nt(&str, zCode);
7760: 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70  .  Tcl_DStringAp
7770: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 26 73 74 72  pendElement(&str
7780: 2c 20 7a 41 72 67 31 20 3f 20 7a 41 72 67 31 20  , zArg1 ? zArg1 
7790: 3a 20 22 22 29 3b 0a 20 20 54 63 6c 5f 44 53 74  : "");.  Tcl_DSt
77a0: 72 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e  ringAppendElemen
77b0: 74 28 26 73 74 72 2c 20 7a 41 72 67 32 20 3f 20  t(&str, zArg2 ? 
77c0: 7a 41 72 67 32 20 3a 20 22 22 29 3b 0a 20 20 54  zArg2 : "");.  T
77d0: 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64  cl_DStringAppend
77e0: 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c 20 7a 41  Element(&str, zA
77f0: 72 67 33 20 3f 20 7a 41 72 67 33 20 3a 20 22 22  rg3 ? zArg3 : ""
7800: 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  );.  Tcl_DString
7810: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 26 73  AppendElement(&s
7820: 74 72 2c 20 7a 41 72 67 34 20 3f 20 7a 41 72 67  tr, zArg4 ? zArg
7830: 34 20 3a 20 22 22 29 3b 0a 20 20 72 63 20 3d 20  4 : "");.  rc = 
7840: 54 63 6c 5f 47 6c 6f 62 61 6c 45 76 61 6c 28 70  Tcl_GlobalEval(p
7850: 44 62 2d 3e 69 6e 74 65 72 70 2c 20 54 63 6c 5f  Db->interp, Tcl_
7860: 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 73 74  DStringValue(&st
7870: 72 29 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69  r));.  Tcl_DStri
7880: 6e 67 46 72 65 65 28 26 73 74 72 29 3b 0a 20 20  ngFree(&str);.  
7890: 7a 52 65 70 6c 79 20 3d 20 72 63 3d 3d 54 43 4c  zReply = rc==TCL
78a0: 5f 4f 4b 20 3f 20 54 63 6c 5f 47 65 74 53 74 72  _OK ? Tcl_GetStr
78b0: 69 6e 67 52 65 73 75 6c 74 28 70 44 62 2d 3e 69  ingResult(pDb->i
78c0: 6e 74 65 72 70 29 20 3a 20 22 53 51 4c 49 54 45  nterp) : "SQLITE
78d0: 5f 44 45 4e 59 22 3b 0a 20 20 69 66 28 20 73 74  _DENY";.  if( st
78e0: 72 63 6d 70 28 7a 52 65 70 6c 79 2c 22 53 51 4c  rcmp(zReply,"SQL
78f0: 49 54 45 5f 4f 4b 22 29 3d 3d 30 20 29 7b 0a 20  ITE_OK")==0 ){. 
7900: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
7910: 4b 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73  K;.  }else if( s
7920: 74 72 63 6d 70 28 7a 52 65 70 6c 79 2c 22 53 51  trcmp(zReply,"SQ
7930: 4c 49 54 45 5f 44 45 4e 59 22 29 3d 3d 30 20 29  LITE_DENY")==0 )
7940: 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
7950: 45 5f 44 45 4e 59 3b 0a 20 20 7d 65 6c 73 65 20  E_DENY;.  }else 
7960: 69 66 28 20 73 74 72 63 6d 70 28 7a 52 65 70 6c  if( strcmp(zRepl
7970: 79 2c 22 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45  y,"SQLITE_IGNORE
7980: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  ")==0 ){.    rc 
7990: 3d 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 3b  = SQLITE_IGNORE;
79a0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
79b0: 20 3d 20 39 39 39 3b 0a 20 20 7d 0a 20 20 72 65   = 999;.  }.  re
79c0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69  turn rc;.}.#endi
79d0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
79e0: 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 20 2a  _AUTHORIZATION *
79f0: 2f 0a 0a 2f 2a 0a 2a 2a 20 7a 54 65 78 74 20 69  /../*.** zText i
7a00: 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  s a pointer to t
7a10: 65 78 74 20 6f 62 74 61 69 6e 65 64 20 76 69 61  ext obtained via
7a20: 20 61 6e 20 73 71 6c 69 74 65 33 5f 72 65 73 75   an sqlite3_resu
7a30: 6c 74 5f 74 65 78 74 28 29 0a 2a 2a 20 6f 72 20  lt_text().** or 
7a40: 73 69 6d 69 6c 61 72 20 69 6e 74 65 72 66 61 63  similar interfac
7a50: 65 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  e. This routine 
7a60: 72 65 74 75 72 6e 73 20 61 20 54 63 6c 20 73 74  returns a Tcl st
7a70: 72 69 6e 67 20 6f 62 6a 65 63 74 2c 20 0a 2a 2a  ring object, .**
7a80: 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
7a90: 20 73 65 74 20 74 6f 20 30 2c 20 63 6f 6e 74 61   set to 0, conta
7aa0: 69 6e 69 6e 67 20 74 68 65 20 74 65 78 74 2e 20  ining the text. 
7ab0: 49 66 20 61 20 74 72 61 6e 73 6c 61 74 69 6f 6e  If a translation
7ac0: 0a 2a 2a 20 62 65 74 77 65 65 6e 20 69 73 6f 38  .** between iso8
7ad0: 38 35 39 20 61 6e 64 20 55 54 46 2d 38 20 69 73  859 and UTF-8 is
7ae0: 20 72 65 71 75 69 72 65 64 2c 20 69 74 20 69 73   required, it is
7af0: 20 70 72 65 66 6f 72 6d 65 64 2e 0a 2a 2f 0a 73   preformed..*/.s
7b00: 74 61 74 69 63 20 54 63 6c 5f 4f 62 6a 20 2a 64  tatic Tcl_Obj *d
7b10: 62 54 65 78 74 54 6f 4f 62 6a 28 63 68 61 72 20  bTextToObj(char 
7b20: 63 6f 6e 73 74 20 2a 7a 54 65 78 74 29 7b 0a 20  const *zText){. 
7b30: 20 54 63 6c 5f 4f 62 6a 20 2a 70 56 61 6c 3b 0a   Tcl_Obj *pVal;.
7b40: 23 69 66 64 65 66 20 55 54 46 5f 54 52 41 4e 53  #ifdef UTF_TRANS
7b50: 4c 41 54 49 4f 4e 5f 4e 45 45 44 45 44 0a 20 20  LATION_NEEDED.  
7b60: 54 63 6c 5f 44 53 74 72 69 6e 67 20 64 43 6f 6c  Tcl_DString dCol
7b70: 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49  ;.  Tcl_DStringI
7b80: 6e 69 74 28 26 64 43 6f 6c 29 3b 0a 20 20 54 63  nit(&dCol);.  Tc
7b90: 6c 5f 45 78 74 65 72 6e 61 6c 54 6f 55 74 66 44  l_ExternalToUtfD
7ba0: 53 74 72 69 6e 67 28 4e 55 4c 4c 2c 20 7a 54 65  String(NULL, zTe
7bb0: 78 74 2c 20 2d 31 2c 20 26 64 43 6f 6c 29 3b 0a  xt, -1, &dCol);.
7bc0: 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77    pVal = Tcl_New
7bd0: 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 44 53  StringObj(Tcl_DS
7be0: 74 72 69 6e 67 56 61 6c 75 65 28 26 64 43 6f 6c  tringValue(&dCol
7bf0: 29 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 44 53  ), -1);.  Tcl_DS
7c00: 74 72 69 6e 67 46 72 65 65 28 26 64 43 6f 6c 29  tringFree(&dCol)
7c10: 3b 0a 23 65 6c 73 65 0a 20 20 70 56 61 6c 20 3d  ;.#else.  pVal =
7c20: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
7c30: 6a 28 7a 54 65 78 74 2c 20 2d 31 29 3b 0a 23 65  j(zText, -1);.#e
7c40: 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 70 56  ndif.  return pV
7c50: 61 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  al;.}../*.** Thi
7c60: 73 20 72 6f 75 74 69 6e 65 20 72 65 61 64 73 20  s routine reads 
7c70: 61 20 6c 69 6e 65 20 6f 66 20 74 65 78 74 20 66  a line of text f
7c80: 72 6f 6d 20 46 49 4c 45 20 69 6e 2c 20 73 74 6f  rom FILE in, sto
7c90: 72 65 73 0a 2a 2a 20 74 68 65 20 74 65 78 74 20  res.** the text 
7ca0: 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e  in memory obtain
7cb0: 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29  ed from malloc()
7cc0: 20 61 6e 64 20 72 65 74 75 72 6e 73 20 61 20 70   and returns a p
7cd0: 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65  ointer.** to the
7ce0: 20 74 65 78 74 2e 20 20 4e 55 4c 4c 20 69 73 20   text.  NULL is 
7cf0: 72 65 74 75 72 6e 65 64 20 61 74 20 65 6e 64 20  returned at end 
7d00: 6f 66 20 66 69 6c 65 2c 20 6f 72 20 69 66 20 6d  of file, or if m
7d10: 61 6c 6c 6f 63 28 29 0a 2a 2a 20 66 61 69 6c 73  alloc().** fails
7d20: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 74 65  ..**.** The inte
7d30: 72 66 61 63 65 20 69 73 20 6c 69 6b 65 20 22 72  rface is like "r
7d40: 65 61 64 6c 69 6e 65 22 20 62 75 74 20 6e 6f 20  eadline" but no 
7d50: 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 65 64 69  command-line edi
7d60: 74 69 6e 67 0a 2a 2a 20 69 73 20 64 6f 6e 65 2e  ting.** is done.
7d70: 0a 2a 2a 0a 2a 2a 20 63 6f 70 69 65 64 20 66 72  .**.** copied fr
7d80: 6f 6d 20 73 68 65 6c 6c 2e 63 20 66 72 6f 6d 20  om shell.c from 
7d90: 27 2e 69 6d 70 6f 72 74 27 20 63 6f 6d 6d 61 6e  '.import' comman
7da0: 64 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  d.*/.static char
7db0: 20 2a 6c 6f 63 61 6c 5f 67 65 74 6c 69 6e 65 28   *local_getline(
7dc0: 63 68 61 72 20 2a 7a 50 72 6f 6d 70 74 2c 20 46  char *zPrompt, F
7dd0: 49 4c 45 20 2a 69 6e 29 7b 0a 20 20 63 68 61 72  ILE *in){.  char
7de0: 20 2a 7a 4c 69 6e 65 3b 0a 20 20 69 6e 74 20 6e   *zLine;.  int n
7df0: 4c 69 6e 65 3b 0a 20 20 69 6e 74 20 6e 3b 0a 0a  Line;.  int n;..
7e00: 20 20 6e 4c 69 6e 65 20 3d 20 31 30 30 3b 0a 20    nLine = 100;. 
7e10: 20 7a 4c 69 6e 65 20 3d 20 6d 61 6c 6c 6f 63 28   zLine = malloc(
7e20: 20 6e 4c 69 6e 65 20 29 3b 0a 20 20 69 66 28 20   nLine );.  if( 
7e30: 7a 4c 69 6e 65 3d 3d 30 20 29 20 72 65 74 75 72  zLine==0 ) retur
7e40: 6e 20 30 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20 20  n 0;.  n = 0;.  
7e50: 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20  while( 1 ){.    
7e60: 69 66 28 20 6e 2b 31 30 30 3e 6e 4c 69 6e 65 20  if( n+100>nLine 
7e70: 29 7b 0a 20 20 20 20 20 20 6e 4c 69 6e 65 20 3d  ){.      nLine =
7e80: 20 6e 4c 69 6e 65 2a 32 20 2b 20 31 30 30 3b 0a   nLine*2 + 100;.
7e90: 20 20 20 20 20 20 7a 4c 69 6e 65 20 3d 20 72 65        zLine = re
7ea0: 61 6c 6c 6f 63 28 7a 4c 69 6e 65 2c 20 6e 4c 69  alloc(zLine, nLi
7eb0: 6e 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  ne);.      if( z
7ec0: 4c 69 6e 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  Line==0 ) return
7ed0: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   0;.    }.    if
7ee0: 28 20 66 67 65 74 73 28 26 7a 4c 69 6e 65 5b 6e  ( fgets(&zLine[n
7ef0: 5d 2c 20 6e 4c 69 6e 65 20 2d 20 6e 2c 20 69 6e  ], nLine - n, in
7f00: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  )==0 ){.      if
7f10: 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( n==0 ){.      
7f20: 20 20 66 72 65 65 28 7a 4c 69 6e 65 29 3b 0a 20    free(zLine);. 
7f30: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b         return 0;
7f40: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a  .      }.      z
7f50: 4c 69 6e 65 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20  Line[n] = 0;.   
7f60: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
7f70: 20 20 20 20 77 68 69 6c 65 28 20 7a 4c 69 6e 65      while( zLine
7f80: 5b 6e 5d 20 29 7b 20 6e 2b 2b 3b 20 7d 0a 20 20  [n] ){ n++; }.  
7f90: 20 20 69 66 28 20 6e 3e 30 20 26 26 20 7a 4c 69    if( n>0 && zLi
7fa0: 6e 65 5b 6e 2d 31 5d 3d 3d 27 5c 6e 27 20 29 7b  ne[n-1]=='\n' ){
7fb0: 0a 20 20 20 20 20 20 6e 2d 2d 3b 0a 20 20 20 20  .      n--;.    
7fc0: 20 20 7a 4c 69 6e 65 5b 6e 5d 20 3d 20 30 3b 0a    zLine[n] = 0;.
7fd0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
7fe0: 20 7d 0a 20 20 7d 0a 20 20 7a 4c 69 6e 65 20 3d   }.  }.  zLine =
7ff0: 20 72 65 61 6c 6c 6f 63 28 20 7a 4c 69 6e 65 2c   realloc( zLine,
8000: 20 6e 2b 31 20 29 3b 0a 20 20 72 65 74 75 72 6e   n+1 );.  return
8010: 20 7a 4c 69 6e 65 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a   zLine;.}.../*.*
8020: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
8030: 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 69  is part of the i
8040: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
8050: 20 74 68 65 20 63 6f 6d 6d 61 6e 64 3a 0a 2a 2a   the command:.**
8060: 0a 2a 2a 20 20 20 24 64 62 20 74 72 61 6e 73 61  .**   $db transa
8070: 63 74 69 6f 6e 20 5b 2d 64 65 66 65 72 72 65 64  ction [-deferred
8080: 7c 2d 69 6d 6d 65 64 69 61 74 65 7c 2d 65 78 63  |-immediate|-exc
8090: 6c 75 73 69 76 65 5d 20 53 43 52 49 50 54 0a 2a  lusive] SCRIPT.*
80a0: 2a 0a 2a 2a 20 49 74 20 69 73 20 69 6e 76 6f 6b  *.** It is invok
80b0: 65 64 20 61 66 74 65 72 20 65 76 61 6c 75 61 74  ed after evaluat
80c0: 69 6e 67 20 74 68 65 20 73 63 72 69 70 74 20 53  ing the script S
80d0: 43 52 49 50 54 20 74 6f 20 63 6f 6d 6d 69 74 20  CRIPT to commit 
80e0: 6f 72 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 74  or rollback.** t
80f0: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  he transaction o
8100: 72 20 73 61 76 65 70 6f 69 6e 74 20 6f 70 65 6e  r savepoint open
8110: 65 64 20 62 79 20 74 68 65 20 5b 74 72 61 6e 73  ed by the [trans
8120: 61 63 74 69 6f 6e 5d 20 63 6f 6d 6d 61 6e 64 2e  action] command.
8130: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 44  .*/.static int D
8140: 62 54 72 61 6e 73 50 6f 73 74 43 6d 64 28 0a 20  bTransPostCmd(. 
8150: 20 43 6c 69 65 6e 74 44 61 74 61 20 64 61 74 61   ClientData data
8160: 5b 5d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  [],             
8170: 20 20 20 20 20 20 2f 2a 20 64 61 74 61 5b 30 5d        /* data[0]
8180: 20 69 73 20 74 68 65 20 53 71 6c 69 74 65 33 44   is the Sqlite3D
8190: 62 2a 20 66 6f 72 20 24 64 62 20 2a 2f 0a 20 20  b* for $db */.  
81a0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
81b0: 72 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  rp,             
81c0: 20 20 20 20 20 2f 2a 20 54 63 6c 20 69 6e 74 65       /* Tcl inte
81d0: 72 70 72 65 74 65 72 20 2a 2f 0a 20 20 69 6e 74  rpreter */.  int
81e0: 20 72 65 73 75 6c 74 20 20 20 20 20 20 20 20 20   result         
81f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8200: 20 20 2f 2a 20 52 65 73 75 6c 74 20 6f 66 20 65    /* Result of e
8210: 76 61 6c 75 61 74 69 6e 67 20 53 43 52 49 50 54  valuating SCRIPT
8220: 20 2a 2f 0a 29 7b 0a 20 20 73 74 61 74 69 63 20   */.){.  static 
8230: 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 45 6e  const char *azEn
8240: 64 5b 5d 20 3d 20 7b 0a 20 20 20 20 22 52 45 4c  d[] = {.    "REL
8250: 45 41 53 45 20 5f 74 63 6c 5f 74 72 61 6e 73 61  EASE _tcl_transa
8260: 63 74 69 6f 6e 22 2c 20 20 20 20 20 20 20 20 2f  ction",        /
8270: 2a 20 72 63 3d 3d 54 43 4c 5f 45 52 52 4f 52 2c  * rc==TCL_ERROR,
8280: 20 6e 54 72 61 6e 73 61 63 74 69 6f 6e 21 3d 30   nTransaction!=0
8290: 20 2a 2f 0a 20 20 20 20 22 43 4f 4d 4d 49 54 22   */.    "COMMIT"
82a0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
82b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 72 63             /* rc
82c0: 21 3d 54 43 4c 5f 45 52 52 4f 52 2c 20 6e 54 72  !=TCL_ERROR, nTr
82d0: 61 6e 73 61 63 74 69 6f 6e 3d 3d 30 20 2a 2f 0a  ansaction==0 */.
82e0: 20 20 20 20 22 52 4f 4c 4c 42 41 43 4b 20 54 4f      "ROLLBACK TO
82f0: 20 5f 74 63 6c 5f 74 72 61 6e 73 61 63 74 69 6f   _tcl_transactio
8300: 6e 20 3b 20 52 45 4c 45 41 53 45 20 5f 74 63 6c  n ; RELEASE _tcl
8310: 5f 74 72 61 6e 73 61 63 74 69 6f 6e 22 2c 0a 20  _transaction",. 
8320: 20 20 20 22 52 4f 4c 4c 42 41 43 4b 22 20 20 20     "ROLLBACK"   
8330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8340: 20 20 20 20 20 20 2f 2a 20 72 63 3d 3d 54 43 4c        /* rc==TCL
8350: 5f 45 52 52 4f 52 2c 20 6e 54 72 61 6e 73 61 63  _ERROR, nTransac
8360: 74 69 6f 6e 3d 3d 30 20 2a 2f 0a 20 20 7d 3b 0a  tion==0 */.  };.
8370: 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20    SqliteDb *pDb 
8380: 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 64 61 74  = (SqliteDb*)dat
8390: 61 5b 30 5d 3b 0a 20 20 69 6e 74 20 72 63 20 3d  a[0];.  int rc =
83a0: 20 72 65 73 75 6c 74 3b 0a 20 20 63 6f 6e 73 74   result;.  const
83b0: 20 63 68 61 72 20 2a 7a 45 6e 64 3b 0a 0a 20 20   char *zEnd;..  
83c0: 70 44 62 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f  pDb->nTransactio
83d0: 6e 2d 2d 3b 0a 20 20 7a 45 6e 64 20 3d 20 61 7a  n--;.  zEnd = az
83e0: 45 6e 64 5b 28 72 63 3d 3d 54 43 4c 5f 45 52 52  End[(rc==TCL_ERR
83f0: 4f 52 29 2a 32 20 2b 20 28 70 44 62 2d 3e 6e 54  OR)*2 + (pDb->nT
8400: 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 30 29 5d 3b  ransaction==0)];
8410: 0a 0a 20 20 70 44 62 2d 3e 64 69 73 61 62 6c 65  ..  pDb->disable
8420: 41 75 74 68 2b 2b 3b 0a 20 20 69 66 28 20 73 71  Auth++;.  if( sq
8430: 6c 69 74 65 33 5f 65 78 65 63 28 70 44 62 2d 3e  lite3_exec(pDb->
8440: 64 62 2c 20 7a 45 6e 64 2c 20 30 2c 20 30 2c 20  db, zEnd, 0, 0, 
8450: 30 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  0) ){.      /* T
8460: 68 69 73 20 69 73 20 61 20 74 72 69 63 6b 79 20  his is a tricky 
8470: 73 63 65 6e 61 72 69 6f 20 74 6f 20 68 61 6e 64  scenario to hand
8480: 6c 65 2e 20 54 68 65 20 6d 6f 73 74 20 6c 69 6b  le. The most lik
8490: 65 6c 79 20 63 61 75 73 65 20 6f 66 20 61 6e 0a  ely cause of an.
84a0: 20 20 20 20 20 20 2a 2a 20 65 72 72 6f 72 20 69        ** error i
84b0: 73 20 74 68 61 74 20 74 68 65 20 65 78 65 63 28  s that the exec(
84c0: 29 20 61 62 6f 76 65 20 77 61 73 20 61 6e 20 61  ) above was an a
84d0: 74 74 65 6d 70 74 20 74 6f 20 63 6f 6d 6d 69 74  ttempt to commit
84e0: 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 74   the .      ** t
84f0: 6f 70 2d 6c 65 76 65 6c 20 74 72 61 6e 73 61 63  op-level transac
8500: 74 69 6f 6e 20 74 68 61 74 20 72 65 74 75 72 6e  tion that return
8510: 65 64 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20  ed SQLITE_BUSY. 
8520: 4f 72 2c 20 6c 65 73 73 20 6c 69 6b 65 6c 79 2c  Or, less likely,
8530: 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 61  .      ** that a
8540: 6e 20 49 4f 2d 65 72 72 6f 72 20 68 61 73 20 6f  n IO-error has o
8550: 63 63 75 72 65 64 2e 20 49 6e 20 65 69 74 68 65  ccured. In eithe
8560: 72 20 63 61 73 65 2c 20 74 68 72 6f 77 20 61 20  r case, throw a 
8570: 54 63 6c 20 65 78 63 65 70 74 69 6f 6e 0a 20 20  Tcl exception.  
8580: 20 20 20 20 2a 2a 20 61 6e 64 20 74 72 79 20 74      ** and try t
8590: 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 74  o rollback the t
85a0: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20  ransaction..    
85b0: 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 42 75    **.      ** Bu
85c0: 74 20 69 74 20 63 6f 75 6c 64 20 61 6c 73 6f 20  t it could also 
85d0: 62 65 20 74 68 61 74 20 74 68 65 20 75 73 65 72  be that the user
85e0: 20 65 78 65 63 75 74 65 64 20 6f 6e 65 20 6f 72   executed one or
85f0: 20 6d 6f 72 65 20 42 45 47 49 4e 2c 20 0a 20 20   more BEGIN, .  
8600: 20 20 20 20 2a 2a 20 43 4f 4d 4d 49 54 2c 20 53      ** COMMIT, S
8610: 41 56 45 50 4f 49 4e 54 2c 20 52 45 4c 45 41 53  AVEPOINT, RELEAS
8620: 45 20 6f 72 20 52 4f 4c 4c 42 41 43 4b 20 63 6f  E or ROLLBACK co
8630: 6d 6d 61 6e 64 73 20 74 68 61 74 20 61 72 65 20  mmands that are 
8640: 63 6f 6e 66 75 73 69 6e 67 0a 20 20 20 20 20 20  confusing.      
8650: 2a 2a 20 74 68 69 73 20 6d 65 74 68 6f 64 27 73  ** this method's
8660: 20 6c 6f 67 69 63 2e 20 4e 6f 74 20 63 6c 65 61   logic. Not clea
8670: 72 20 68 6f 77 20 74 68 69 73 20 77 6f 75 6c 64  r how this would
8680: 20 62 65 20 62 65 73 74 20 68 61 6e 64 6c 65 64   be best handled
8690: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 69  ..      */.    i
86a0: 66 28 20 72 63 21 3d 54 43 4c 5f 45 52 52 4f 52  f( rc!=TCL_ERROR
86b0: 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70   ){.      Tcl_Ap
86c0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
86d0: 70 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  p, sqlite3_errms
86e0: 67 28 70 44 62 2d 3e 64 62 29 2c 20 30 29 3b 0a  g(pDb->db), 0);.
86f0: 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45        rc = TCL_E
8700: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
8710: 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 44 62  sqlite3_exec(pDb
8720: 2d 3e 64 62 2c 20 22 52 4f 4c 4c 42 41 43 4b 22  ->db, "ROLLBACK"
8730: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a  , 0, 0, 0);.  }.
8740: 20 20 70 44 62 2d 3e 64 69 73 61 62 6c 65 41 75    pDb->disableAu
8750: 74 68 2d 2d 3b 0a 0a 20 20 72 65 74 75 72 6e 20  th--;..  return 
8760: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c  rc;.}../*.** Unl
8770: 65 73 73 20 53 51 4c 49 54 45 5f 54 45 53 54 20  ess SQLITE_TEST 
8780: 69 73 20 64 65 66 69 6e 65 64 2c 20 74 68 69 73  is defined, this
8790: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 73   function is a s
87a0: 69 6d 70 6c 65 20 77 72 61 70 70 65 72 20 61 72  imple wrapper ar
87b0: 6f 75 6e 64 0a 2a 2a 20 73 71 6c 69 74 65 33 5f  ound.** sqlite3_
87c0: 70 72 65 70 61 72 65 5f 76 32 28 29 2e 20 49 66  prepare_v2(). If
87d0: 20 53 51 4c 49 54 45 5f 54 45 53 54 20 69 73 20   SQLITE_TEST is 
87e0: 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 69 74  defined, then it
87f0: 20 75 73 65 73 20 65 69 74 68 65 72 0a 2a 2a 20   uses either.** 
8800: 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
8810: 76 32 28 29 20 6f 72 20 6c 65 67 61 63 79 20 69  v2() or legacy i
8820: 6e 74 65 72 66 61 63 65 20 73 71 6c 69 74 65 33  nterface sqlite3
8830: 5f 70 72 65 70 61 72 65 28 29 2c 20 64 65 70 65  _prepare(), depe
8840: 6e 64 69 6e 67 0a 2a 2a 20 6f 6e 20 77 68 65 74  nding.** on whet
8850: 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 5b  her or not the [
8860: 64 62 5f 75 73 65 5f 6c 65 67 61 63 79 5f 70 72  db_use_legacy_pr
8870: 65 70 61 72 65 5d 20 63 6f 6d 6d 61 6e 64 20 68  epare] command h
8880: 61 73 20 62 65 65 6e 20 75 73 65 64 20 74 6f 20  as been used to 
8890: 0a 2a 2a 20 63 6f 6e 66 69 67 75 72 65 20 74 68  .** configure th
88a0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f  e connection..*/
88b0: 0a 73 74 61 74 69 63 20 69 6e 74 20 64 62 50 72  .static int dbPr
88c0: 65 70 61 72 65 28 0a 20 20 53 71 6c 69 74 65 44  epare(.  SqliteD
88d0: 62 20 2a 70 44 62 2c 20 20 20 20 20 20 20 20 20  b *pDb,         
88e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
88f0: 62 61 73 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  base object */. 
8900: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71   const char *zSq
8910: 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
8920: 20 2f 2a 20 53 51 4c 20 74 6f 20 63 6f 6d 70 69   /* SQL to compi
8930: 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  le */.  sqlite3_
8940: 73 74 6d 74 20 2a 2a 70 70 53 74 6d 74 2c 20 20  stmt **ppStmt,  
8950: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
8960: 50 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  Prepared stateme
8970: 6e 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  nt */.  const ch
8980: 61 72 20 2a 2a 70 7a 4f 75 74 20 20 20 20 20 20  ar **pzOut      
8990: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
89a0: 50 6f 69 6e 74 65 72 20 74 6f 20 6e 65 78 74 20  Pointer to next 
89b0: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  SQL statement */
89c0: 0a 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .){.#ifdef SQLIT
89d0: 45 5f 54 45 53 54 0a 20 20 69 66 28 20 70 44 62  E_TEST.  if( pDb
89e0: 2d 3e 62 4c 65 67 61 63 79 50 72 65 70 61 72 65  ->bLegacyPrepare
89f0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73   ){.    return s
8a00: 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28 70  qlite3_prepare(p
8a10: 44 62 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31  Db->db, zSql, -1
8a20: 2c 20 70 70 53 74 6d 74 2c 20 70 7a 4f 75 74 29  , ppStmt, pzOut)
8a30: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72  ;.  }.#endif.  r
8a40: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 70 72  eturn sqlite3_pr
8a50: 65 70 61 72 65 5f 76 32 28 70 44 62 2d 3e 64 62  epare_v2(pDb->db
8a60: 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 70 70 53 74  , zSql, -1, ppSt
8a70: 6d 74 2c 20 70 7a 4f 75 74 29 3b 0a 7d 0a 0a 2f  mt, pzOut);.}../
8a80: 2a 0a 2a 2a 20 53 65 61 72 63 68 20 74 68 65 20  *.** Search the 
8a90: 63 61 63 68 65 20 66 6f 72 20 61 20 70 72 65 70  cache for a prep
8aa0: 61 72 65 64 2d 73 74 61 74 65 6d 65 6e 74 20 6f  ared-statement o
8ab0: 62 6a 65 63 74 20 74 68 61 74 20 69 6d 70 6c 65  bject that imple
8ac0: 6d 65 6e 74 73 20 74 68 65 0a 2a 2a 20 66 69 72  ments the.** fir
8ad0: 73 74 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  st SQL statement
8ae0: 20 69 6e 20 74 68 65 20 62 75 66 66 65 72 20 70   in the buffer p
8af0: 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 70 61 72  ointed to by par
8b00: 61 6d 65 74 65 72 20 7a 49 6e 2e 20 49 66 0a 2a  ameter zIn. If.*
8b10: 2a 20 6e 6f 20 73 75 63 68 20 70 72 65 70 61 72  * no such prepar
8b20: 65 64 2d 73 74 61 74 65 6d 65 6e 74 20 63 61 6e  ed-statement can
8b30: 20 62 65 20 66 6f 75 6e 64 2c 20 61 6c 6c 6f 63   be found, alloc
8b40: 61 74 65 20 61 6e 64 20 70 72 65 70 61 72 65 20  ate and prepare 
8b50: 61 20 6e 65 77 0a 2a 2a 20 6f 6e 65 2e 20 49 6e  a new.** one. In
8b60: 20 65 69 74 68 65 72 20 63 61 73 65 2c 20 62 69   either case, bi
8b70: 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 76  nd the current v
8b80: 61 6c 75 65 73 20 6f 66 20 74 68 65 20 72 65 6c  alues of the rel
8b90: 65 76 61 6e 74 20 54 63 6c 0a 2a 2a 20 76 61 72  evant Tcl.** var
8ba0: 69 61 62 6c 65 73 20 74 6f 20 61 6e 79 20 24 76  iables to any $v
8bb0: 61 72 2c 20 3a 76 61 72 20 6f 72 20 40 76 61 72  ar, :var or @var
8bc0: 20 76 61 72 69 61 62 6c 65 73 20 69 6e 20 74 68   variables in th
8bd0: 65 20 73 74 61 74 65 6d 65 6e 74 2e 20 42 65 66  e statement. Bef
8be0: 6f 72 65 0a 2a 2a 20 72 65 74 75 72 6e 69 6e 67  ore.** returning
8bf0: 2c 20 73 65 74 20 2a 70 70 50 72 65 53 74 6d 74  , set *ppPreStmt
8c00: 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   to point to the
8c10: 20 70 72 65 70 61 72 65 64 2d 73 74 61 74 65 6d   prepared-statem
8c20: 65 6e 74 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a  ent object..**.*
8c30: 2a 20 4f 75 74 70 75 74 20 70 61 72 61 6d 65 74  * Output paramet
8c40: 65 72 20 2a 70 7a 4f 75 74 20 69 73 20 73 65 74  er *pzOut is set
8c50: 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   to point to the
8c60: 20 6e 65 78 74 20 53 51 4c 20 73 74 61 74 65 6d   next SQL statem
8c70: 65 6e 74 20 69 6e 0a 2a 2a 20 62 75 66 66 65 72  ent in.** buffer
8c80: 20 7a 49 6e 2c 20 6f 72 20 74 6f 20 74 68 65 20   zIn, or to the 
8c90: 27 5c 30 27 20 62 79 74 65 20 61 74 20 74 68 65  '\0' byte at the
8ca0: 20 65 6e 64 20 6f 66 20 7a 49 6e 20 69 66 20 74   end of zIn if t
8cb0: 68 65 72 65 20 69 73 20 6e 6f 0a 2a 2a 20 6e 65  here is no.** ne
8cc0: 78 74 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  xt statement..**
8cd0: 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75  .** If successfu
8ce0: 6c 2c 20 54 43 4c 5f 4f 4b 20 69 73 20 72 65 74  l, TCL_OK is ret
8cf0: 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65  urned. Otherwise
8d00: 2c 20 54 43 4c 5f 45 52 52 4f 52 20 69 73 20 72  , TCL_ERROR is r
8d10: 65 74 75 72 6e 65 64 0a 2a 2a 20 61 6e 64 20 61  eturned.** and a
8d20: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
8d30: 6c 6f 61 64 65 64 20 69 6e 74 6f 20 69 6e 74 65  loaded into inte
8d40: 72 70 72 65 74 65 72 20 70 44 62 2d 3e 69 6e 74  rpreter pDb->int
8d50: 65 72 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  erp..*/.static i
8d60: 6e 74 20 64 62 50 72 65 70 61 72 65 41 6e 64 42  nt dbPrepareAndB
8d70: 69 6e 64 28 0a 20 20 53 71 6c 69 74 65 44 62 20  ind(.  SqliteDb 
8d80: 2a 70 44 62 2c 20 20 20 20 20 20 20 20 20 20 20  *pDb,           
8d90: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
8da0: 73 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63  se object */.  c
8db0: 68 61 72 20 63 6f 6e 73 74 20 2a 7a 49 6e 2c 20  har const *zIn, 
8dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8dd0: 2a 20 53 51 4c 20 74 6f 20 63 6f 6d 70 69 6c 65  * SQL to compile
8de0: 20 2a 2f 0a 20 20 63 68 61 72 20 63 6f 6e 73 74   */.  char const
8df0: 20 2a 2a 70 7a 4f 75 74 2c 20 20 20 20 20 20 20   **pzOut,       
8e00: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 50 6f        /* OUT: Po
8e10: 69 6e 74 65 72 20 74 6f 20 6e 65 78 74 20 53 51  inter to next SQ
8e20: 4c 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  L statement */. 
8e30: 20 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74   SqlPreparedStmt
8e40: 20 2a 2a 70 70 50 72 65 53 74 6d 74 20 20 20 20   **ppPreStmt    
8e50: 20 2f 2a 20 4f 55 54 3a 20 4f 62 6a 65 63 74 20   /* OUT: Object 
8e60: 75 73 65 64 20 74 6f 20 63 61 63 68 65 20 73 74  used to cache st
8e70: 61 74 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20  atement */.){.  
8e80: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c  const char *zSql
8e90: 20 3d 20 7a 49 6e 3b 20 20 20 20 20 20 20 20 20   = zIn;         
8ea0: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 66 69  /* Pointer to fi
8eb0: 72 73 74 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  rst SQL statemen
8ec0: 74 20 69 6e 20 7a 49 6e 20 2a 2f 0a 20 20 73 71  t in zIn */.  sq
8ed0: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
8ee0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t;            /*
8ef0: 20 50 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   Prepared statem
8f00: 65 6e 74 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ent object */.  
8f10: 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74 20  SqlPreparedStmt 
8f20: 2a 70 50 72 65 53 74 6d 74 3b 20 20 20 20 20 20  *pPreStmt;      
8f30: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 63 61  /* Pointer to ca
8f40: 63 68 65 64 20 73 74 61 74 65 6d 65 6e 74 20 2a  ched statement *
8f50: 2f 0a 20 20 69 6e 74 20 6e 53 71 6c 3b 20 20 20  /.  int nSql;   
8f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8f70: 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66      /* Length of
8f80: 20 7a 53 71 6c 20 69 6e 20 62 79 74 65 73 20 2a   zSql in bytes *
8f90: 2f 0a 20 20 69 6e 74 20 6e 56 61 72 3b 20 20 20  /.  int nVar;   
8fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8fb0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
8fc0: 20 76 61 72 69 61 62 6c 65 73 20 69 6e 20 73 74   variables in st
8fd0: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  atement */.  int
8fe0: 20 69 50 61 72 6d 20 3d 20 30 3b 20 20 20 20 20   iParm = 0;     
8ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9000: 4e 65 78 74 20 66 72 65 65 20 65 6e 74 72 79 20  Next free entry 
9010: 69 6e 20 61 70 50 61 72 6d 20 2a 2f 0a 20 20 69  in apParm */.  i
9020: 6e 74 20 69 3b 0a 20 20 54 63 6c 5f 49 6e 74 65  nt i;.  Tcl_Inte
9030: 72 70 20 2a 69 6e 74 65 72 70 20 3d 20 70 44 62  rp *interp = pDb
9040: 2d 3e 69 6e 74 65 72 70 3b 0a 0a 20 20 2a 70 70  ->interp;..  *pp
9050: 50 72 65 53 74 6d 74 20 3d 20 30 3b 0a 0a 20 20  PreStmt = 0;..  
9060: 2f 2a 20 54 72 69 6d 20 73 70 61 63 65 73 20 66  /* Trim spaces f
9070: 72 6f 6d 20 74 68 65 20 73 74 61 72 74 20 6f 66  rom the start of
9080: 20 7a 53 71 6c 20 61 6e 64 20 63 61 6c 63 75 6c   zSql and calcul
9090: 61 74 65 20 74 68 65 20 72 65 6d 61 69 6e 69 6e  ate the remainin
90a0: 67 20 6c 65 6e 67 74 68 2e 20 2a 2f 0a 20 20 77  g length. */.  w
90b0: 68 69 6c 65 28 20 69 73 73 70 61 63 65 28 7a 53  hile( isspace(zS
90c0: 71 6c 5b 30 5d 29 20 29 7b 20 7a 53 71 6c 2b 2b  ql[0]) ){ zSql++
90d0: 3b 20 7d 0a 20 20 6e 53 71 6c 20 3d 20 73 74 72  ; }.  nSql = str
90e0: 6c 65 6e 33 30 28 7a 53 71 6c 29 3b 0a 0a 20 20  len30(zSql);..  
90f0: 66 6f 72 28 70 50 72 65 53 74 6d 74 20 3d 20 70  for(pPreStmt = p
9100: 44 62 2d 3e 73 74 6d 74 4c 69 73 74 3b 20 70 50  Db->stmtList; pP
9110: 72 65 53 74 6d 74 3b 20 70 50 72 65 53 74 6d 74  reStmt; pPreStmt
9120: 3d 70 50 72 65 53 74 6d 74 2d 3e 70 4e 65 78 74  =pPreStmt->pNext
9130: 29 7b 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20 70  ){.    int n = p
9140: 50 72 65 53 74 6d 74 2d 3e 6e 53 71 6c 3b 0a 20  PreStmt->nSql;. 
9150: 20 20 20 69 66 28 20 6e 53 71 6c 3e 3d 6e 20 0a     if( nSql>=n .
9160: 20 20 20 20 20 20 20 20 26 26 20 6d 65 6d 63 6d          && memcm
9170: 70 28 70 50 72 65 53 74 6d 74 2d 3e 7a 53 71 6c  p(pPreStmt->zSql
9180: 2c 20 7a 53 71 6c 2c 20 6e 29 3d 3d 30 0a 20 20  , zSql, n)==0.  
9190: 20 20 20 20 20 20 26 26 20 28 7a 53 71 6c 5b 6e        && (zSql[n
91a0: 5d 3d 3d 30 20 7c 7c 20 7a 53 71 6c 5b 6e 2d 31  ]==0 || zSql[n-1
91b0: 5d 3d 3d 27 3b 27 29 0a 20 20 20 20 29 7b 0a 20  ]==';').    ){. 
91c0: 20 20 20 20 20 70 53 74 6d 74 20 3d 20 70 50 72       pStmt = pPr
91d0: 65 53 74 6d 74 2d 3e 70 53 74 6d 74 3b 0a 20 20  eStmt->pStmt;.  
91e0: 20 20 20 20 2a 70 7a 4f 75 74 20 3d 20 26 7a 53      *pzOut = &zS
91f0: 71 6c 5b 70 50 72 65 53 74 6d 74 2d 3e 6e 53 71  ql[pPreStmt->nSq
9200: 6c 5d 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57 68  l];..      /* Wh
9210: 65 6e 20 61 20 70 72 65 70 61 72 65 64 20 73 74  en a prepared st
9220: 61 74 65 6d 65 6e 74 20 69 73 20 66 6f 75 6e 64  atement is found
9230: 2c 20 75 6e 6c 69 6e 6b 20 69 74 20 66 72 6f 6d  , unlink it from
9240: 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 63 61   the.      ** ca
9250: 63 68 65 20 6c 69 73 74 2e 20 20 49 74 20 77 69  che list.  It wi
9260: 6c 6c 20 6c 61 74 65 72 20 62 65 20 61 64 64 65  ll later be adde
9270: 64 20 62 61 63 6b 20 74 6f 20 74 68 65 20 62 65  d back to the be
9280: 67 69 6e 6e 69 6e 67 0a 20 20 20 20 20 20 2a 2a  ginning.      **
9290: 20 6f 66 20 74 68 65 20 63 61 63 68 65 20 6c 69   of the cache li
92a0: 73 74 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 69  st in order to i
92b0: 6d 70 6c 65 6d 65 6e 74 20 4c 52 55 20 72 65 70  mplement LRU rep
92c0: 6c 61 63 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20  lacement..      
92d0: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 50 72  */.      if( pPr
92e0: 65 53 74 6d 74 2d 3e 70 50 72 65 76 20 29 7b 0a  eStmt->pPrev ){.
92f0: 20 20 20 20 20 20 20 20 70 50 72 65 53 74 6d 74          pPreStmt
9300: 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d  ->pPrev->pNext =
9310: 20 70 50 72 65 53 74 6d 74 2d 3e 70 4e 65 78 74   pPreStmt->pNext
9320: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
9330: 20 20 20 20 20 20 20 70 44 62 2d 3e 73 74 6d 74         pDb->stmt
9340: 4c 69 73 74 20 3d 20 70 50 72 65 53 74 6d 74 2d  List = pPreStmt-
9350: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a  >pNext;.      }.
9360: 20 20 20 20 20 20 69 66 28 20 70 50 72 65 53 74        if( pPreSt
9370: 6d 74 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20  mt->pNext ){.   
9380: 20 20 20 20 20 70 50 72 65 53 74 6d 74 2d 3e 70       pPreStmt->p
9390: 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 50  Next->pPrev = pP
93a0: 72 65 53 74 6d 74 2d 3e 70 50 72 65 76 3b 0a 20  reStmt->pPrev;. 
93b0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
93c0: 20 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c 61 73      pDb->stmtLas
93d0: 74 20 3d 20 70 50 72 65 53 74 6d 74 2d 3e 70 50  t = pPreStmt->pP
93e0: 72 65 76 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rev;.      }.   
93f0: 20 20 20 70 44 62 2d 3e 6e 53 74 6d 74 2d 2d 3b     pDb->nStmt--;
9400: 0a 20 20 20 20 20 20 6e 56 61 72 20 3d 20 73 71  .      nVar = sq
9410: 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d  lite3_bind_param
9420: 65 74 65 72 5f 63 6f 75 6e 74 28 70 53 74 6d 74  eter_count(pStmt
9430: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
9440: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 2f      }.  }.  .  /
9450: 2a 20 49 66 20 6e 6f 20 70 72 65 70 61 72 65 64  * If no prepared
9460: 20 73 74 61 74 65 6d 65 6e 74 20 77 61 73 20 66   statement was f
9470: 6f 75 6e 64 2e 20 43 6f 6d 70 69 6c 65 20 74 68  ound. Compile th
9480: 65 20 53 51 4c 20 74 65 78 74 2e 20 41 6c 73 6f  e SQL text. Also
9490: 20 61 6c 6c 6f 63 61 74 65 0a 20 20 2a 2a 20 61   allocate.  ** a
94a0: 20 6e 65 77 20 53 71 6c 50 72 65 70 61 72 65 64   new SqlPrepared
94b0: 53 74 6d 74 20 73 74 72 75 63 74 75 72 65 2e 20  Stmt structure. 
94c0: 20 2a 2f 0a 20 20 69 66 28 20 70 50 72 65 53 74   */.  if( pPreSt
94d0: 6d 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  mt==0 ){.    int
94e0: 20 6e 42 79 74 65 3b 0a 0a 20 20 20 20 69 66 28   nByte;..    if(
94f0: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 64 62 50 72   SQLITE_OK!=dbPr
9500: 65 70 61 72 65 28 70 44 62 2c 20 7a 53 71 6c 2c  epare(pDb, zSql,
9510: 20 26 70 53 74 6d 74 2c 20 70 7a 4f 75 74 29 20   &pStmt, pzOut) 
9520: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74  ){.      Tcl_Set
9530: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
9540: 2c 20 64 62 54 65 78 74 54 6f 4f 62 6a 28 73 71  , dbTextToObj(sq
9550: 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62  lite3_errmsg(pDb
9560: 2d 3e 64 62 29 29 29 3b 0a 20 20 20 20 20 20 72  ->db)));.      r
9570: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
9580: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
9590: 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Stmt==0 ){.     
95a0: 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
95b0: 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28  sqlite3_errcode(
95c0: 70 44 62 2d 3e 64 62 29 20 29 7b 0a 20 20 20 20  pDb->db) ){.    
95d0: 20 20 20 20 2f 2a 20 41 20 63 6f 6d 70 69 6c 65      /* A compile
95e0: 2d 74 69 6d 65 20 65 72 72 6f 72 20 69 6e 20 74  -time error in t
95f0: 68 65 20 73 74 61 74 65 6d 65 6e 74 2e 20 2a 2f  he statement. */
9600: 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 53 65 74  .        Tcl_Set
9610: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
9620: 2c 20 64 62 54 65 78 74 54 6f 4f 62 6a 28 73 71  , dbTextToObj(sq
9630: 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62  lite3_errmsg(pDb
9640: 2d 3e 64 62 29 29 29 3b 0a 20 20 20 20 20 20 20  ->db)));.       
9650: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
9660: 52 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  R;.      }else{.
9670: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73          /* The s
9680: 74 61 74 65 6d 65 6e 74 20 77 61 73 20 61 20 6e  tatement was a n
9690: 6f 2d 6f 70 2e 20 20 43 6f 6e 74 69 6e 75 65 20  o-op.  Continue 
96a0: 74 6f 20 74 68 65 20 6e 65 78 74 20 73 74 61 74  to the next stat
96b0: 65 6d 65 6e 74 0a 20 20 20 20 20 20 20 20 2a 2a  ement.        **
96c0: 20 69 6e 20 74 68 65 20 53 51 4c 20 73 74 72 69   in the SQL stri
96d0: 6e 67 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ng..        */. 
96e0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43         return TC
96f0: 4c 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  L_OK;.      }.  
9700: 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28    }..    assert(
9710: 20 70 50 72 65 53 74 6d 74 3d 3d 30 20 29 3b 0a   pPreStmt==0 );.
9720: 20 20 20 20 6e 56 61 72 20 3d 20 73 71 6c 69 74      nVar = sqlit
9730: 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65  e3_bind_paramete
9740: 72 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29 3b 0a  r_count(pStmt);.
9750: 20 20 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65      nByte = size
9760: 6f 66 28 53 71 6c 50 72 65 70 61 72 65 64 53 74  of(SqlPreparedSt
9770: 6d 74 29 20 2b 20 6e 56 61 72 2a 73 69 7a 65 6f  mt) + nVar*sizeo
9780: 66 28 54 63 6c 5f 4f 62 6a 20 2a 29 3b 0a 20 20  f(Tcl_Obj *);.  
9790: 20 20 70 50 72 65 53 74 6d 74 20 3d 20 28 53 71    pPreStmt = (Sq
97a0: 6c 50 72 65 70 61 72 65 64 53 74 6d 74 2a 29 54  lPreparedStmt*)T
97b0: 63 6c 5f 41 6c 6c 6f 63 28 6e 42 79 74 65 29 3b  cl_Alloc(nByte);
97c0: 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 50 72 65  .    memset(pPre
97d0: 53 74 6d 74 2c 20 30 2c 20 6e 42 79 74 65 29 3b  Stmt, 0, nByte);
97e0: 0a 0a 20 20 20 20 70 50 72 65 53 74 6d 74 2d 3e  ..    pPreStmt->
97f0: 70 53 74 6d 74 20 3d 20 70 53 74 6d 74 3b 0a 20  pStmt = pStmt;. 
9800: 20 20 20 70 50 72 65 53 74 6d 74 2d 3e 6e 53 71     pPreStmt->nSq
9810: 6c 20 3d 20 28 2a 70 7a 4f 75 74 20 2d 20 7a 53  l = (*pzOut - zS
9820: 71 6c 29 3b 0a 20 20 20 20 70 50 72 65 53 74 6d  ql);.    pPreStm
9830: 74 2d 3e 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65  t->zSql = sqlite
9840: 33 5f 73 71 6c 28 70 53 74 6d 74 29 3b 0a 20 20  3_sql(pStmt);.  
9850: 20 20 70 50 72 65 53 74 6d 74 2d 3e 61 70 50 61    pPreStmt->apPa
9860: 72 6d 20 3d 20 28 54 63 6c 5f 4f 62 6a 20 2a 2a  rm = (Tcl_Obj **
9870: 29 26 70 50 72 65 53 74 6d 74 5b 31 5d 3b 0a 23  )&pPreStmt[1];.#
9880: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
9890: 54 0a 20 20 20 20 69 66 28 20 70 50 72 65 53 74  T.    if( pPreSt
98a0: 6d 74 2d 3e 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20  mt->zSql==0 ){. 
98b0: 20 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 70 79       char *zCopy
98c0: 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 70 50 72   = Tcl_Alloc(pPr
98d0: 65 53 74 6d 74 2d 3e 6e 53 71 6c 20 2b 20 31 29  eStmt->nSql + 1)
98e0: 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a  ;.      memcpy(z
98f0: 43 6f 70 79 2c 20 7a 53 71 6c 2c 20 70 50 72 65  Copy, zSql, pPre
9900: 53 74 6d 74 2d 3e 6e 53 71 6c 29 3b 0a 20 20 20  Stmt->nSql);.   
9910: 20 20 20 7a 43 6f 70 79 5b 70 50 72 65 53 74 6d     zCopy[pPreStm
9920: 74 2d 3e 6e 53 71 6c 5d 20 3d 20 27 5c 30 27 3b  t->nSql] = '\0';
9930: 0a 20 20 20 20 20 20 70 50 72 65 53 74 6d 74 2d  .      pPreStmt-
9940: 3e 7a 53 71 6c 20 3d 20 7a 43 6f 70 79 3b 0a 20  >zSql = zCopy;. 
9950: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
9960: 20 20 61 73 73 65 72 74 28 20 70 50 72 65 53 74    assert( pPreSt
9970: 6d 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  mt );.  assert( 
9980: 73 74 72 6c 65 6e 33 30 28 70 50 72 65 53 74 6d  strlen30(pPreStm
9990: 74 2d 3e 7a 53 71 6c 29 3d 3d 70 50 72 65 53 74  t->zSql)==pPreSt
99a0: 6d 74 2d 3e 6e 53 71 6c 20 29 3b 0a 20 20 61 73  mt->nSql );.  as
99b0: 73 65 72 74 28 20 30 3d 3d 6d 65 6d 63 6d 70 28  sert( 0==memcmp(
99c0: 70 50 72 65 53 74 6d 74 2d 3e 7a 53 71 6c 2c 20  pPreStmt->zSql, 
99d0: 7a 53 71 6c 2c 20 70 50 72 65 53 74 6d 74 2d 3e  zSql, pPreStmt->
99e0: 6e 53 71 6c 29 20 29 3b 0a 0a 20 20 2f 2a 20 42  nSql) );..  /* B
99f0: 69 6e 64 20 76 61 6c 75 65 73 20 74 6f 20 70 61  ind values to pa
9a00: 72 61 6d 65 74 65 72 73 20 74 68 61 74 20 62 65  rameters that be
9a10: 67 69 6e 20 77 69 74 68 20 24 20 6f 72 20 3a 20  gin with $ or : 
9a20: 2a 2f 20 20 0a 20 20 66 6f 72 28 69 3d 31 3b 20  */  .  for(i=1; 
9a30: 69 3c 3d 6e 56 61 72 3b 20 69 2b 2b 29 7b 0a 20  i<=nVar; i++){. 
9a40: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
9a50: 56 61 72 20 3d 20 73 71 6c 69 74 65 33 5f 62 69  Var = sqlite3_bi
9a60: 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 6e 61 6d  nd_parameter_nam
9a70: 65 28 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20  e(pStmt, i);.   
9a80: 20 69 66 28 20 7a 56 61 72 21 3d 30 20 26 26 20   if( zVar!=0 && 
9a90: 28 7a 56 61 72 5b 30 5d 3d 3d 27 24 27 20 7c 7c  (zVar[0]=='$' ||
9aa0: 20 7a 56 61 72 5b 30 5d 3d 3d 27 3a 27 20 7c 7c   zVar[0]==':' ||
9ab0: 20 7a 56 61 72 5b 30 5d 3d 3d 27 40 27 29 20 29   zVar[0]=='@') )
9ac0: 7b 0a 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20  {.      Tcl_Obj 
9ad0: 2a 70 56 61 72 20 3d 20 54 63 6c 5f 47 65 74 56  *pVar = Tcl_GetV
9ae0: 61 72 32 45 78 28 69 6e 74 65 72 70 2c 20 26 7a  ar2Ex(interp, &z
9af0: 56 61 72 5b 31 5d 2c 20 30 2c 20 30 29 3b 0a 20  Var[1], 0, 0);. 
9b00: 20 20 20 20 20 69 66 28 20 70 56 61 72 20 29 7b       if( pVar ){
9b10: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a  .        int n;.
9b20: 20 20 20 20 20 20 20 20 75 38 20 2a 64 61 74 61          u8 *data
9b30: 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20  ;.        const 
9b40: 63 68 61 72 20 2a 7a 54 79 70 65 20 3d 20 28 70  char *zType = (p
9b50: 56 61 72 2d 3e 74 79 70 65 50 74 72 20 3f 20 70  Var->typePtr ? p
9b60: 56 61 72 2d 3e 74 79 70 65 50 74 72 2d 3e 6e 61  Var->typePtr->na
9b70: 6d 65 20 3a 20 22 22 29 3b 0a 20 20 20 20 20 20  me : "");.      
9b80: 20 20 63 68 61 72 20 63 20 3d 20 7a 54 79 70 65    char c = zType
9b90: 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28  [0];.        if(
9ba0: 20 7a 56 61 72 5b 30 5d 3d 3d 27 40 27 20 7c 7c   zVar[0]=='@' ||
9bb0: 0a 20 20 20 20 20 20 20 20 20 20 20 28 63 3d 3d  .           (c==
9bc0: 27 62 27 20 26 26 20 73 74 72 63 6d 70 28 7a 54  'b' && strcmp(zT
9bd0: 79 70 65 2c 22 62 79 74 65 61 72 72 61 79 22 29  ype,"bytearray")
9be0: 3d 3d 30 20 26 26 20 70 56 61 72 2d 3e 62 79 74  ==0 && pVar->byt
9bf0: 65 73 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20 20  es==0) ){.      
9c00: 20 20 20 20 2f 2a 20 4c 6f 61 64 20 61 20 42 4c      /* Load a BL
9c10: 4f 42 20 74 79 70 65 20 69 66 20 74 68 65 20 54  OB type if the T
9c20: 63 6c 20 76 61 72 69 61 62 6c 65 20 69 73 20 61  cl variable is a
9c30: 20 62 79 74 65 61 72 72 61 79 20 61 6e 64 0a 20   bytearray and. 
9c40: 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 68           ** it h
9c50: 61 73 20 6e 6f 20 73 74 72 69 6e 67 20 72 65 70  as no string rep
9c60: 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 72 20 74  resentation or t
9c70: 68 65 20 68 6f 73 74 0a 20 20 20 20 20 20 20 20  he host.        
9c80: 20 20 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 6e    ** parameter n
9c90: 61 6d 65 20 62 65 67 69 6e 73 20 77 69 74 68 20  ame begins with 
9ca0: 22 40 22 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  "@". */.        
9cb0: 20 20 64 61 74 61 20 3d 20 54 63 6c 5f 47 65 74    data = Tcl_Get
9cc0: 42 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a  ByteArrayFromObj
9cd0: 28 70 56 61 72 2c 20 26 6e 29 3b 0a 20 20 20 20  (pVar, &n);.    
9ce0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69        sqlite3_bi
9cf0: 6e 64 5f 62 6c 6f 62 28 70 53 74 6d 74 2c 20 69  nd_blob(pStmt, i
9d00: 2c 20 64 61 74 61 2c 20 6e 2c 20 53 51 4c 49 54  , data, n, SQLIT
9d10: 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20  E_STATIC);.     
9d20: 20 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66       Tcl_IncrRef
9d30: 43 6f 75 6e 74 28 70 56 61 72 29 3b 0a 20 20 20  Count(pVar);.   
9d40: 20 20 20 20 20 20 20 70 50 72 65 53 74 6d 74 2d         pPreStmt-
9d50: 3e 61 70 50 61 72 6d 5b 69 50 61 72 6d 2b 2b 5d  >apParm[iParm++]
9d60: 20 3d 20 70 56 61 72 3b 0a 20 20 20 20 20 20 20   = pVar;.       
9d70: 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 62   }else if( c=='b
9d80: 27 20 26 26 20 73 74 72 63 6d 70 28 7a 54 79 70  ' && strcmp(zTyp
9d90: 65 2c 22 62 6f 6f 6c 65 61 6e 22 29 3d 3d 30 20  e,"boolean")==0 
9da0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c  ){.          Tcl
9db0: 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
9dc0: 6e 74 65 72 70 2c 20 70 56 61 72 2c 20 26 6e 29  nterp, pVar, &n)
9dd0: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
9de0: 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 53 74  te3_bind_int(pSt
9df0: 6d 74 2c 20 69 2c 20 6e 29 3b 0a 20 20 20 20 20  mt, i, n);.     
9e00: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d     }else if( c==
9e10: 27 64 27 20 26 26 20 73 74 72 63 6d 70 28 7a 54  'd' && strcmp(zT
9e20: 79 70 65 2c 22 64 6f 75 62 6c 65 22 29 3d 3d 30  ype,"double")==0
9e30: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 64 6f   ){.          do
9e40: 75 62 6c 65 20 72 3b 0a 20 20 20 20 20 20 20 20  uble r;.        
9e50: 20 20 54 63 6c 5f 47 65 74 44 6f 75 62 6c 65 46    Tcl_GetDoubleF
9e60: 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 70  romObj(interp, p
9e70: 56 61 72 2c 20 26 72 29 3b 0a 20 20 20 20 20 20  Var, &r);.      
9e80: 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
9e90: 5f 64 6f 75 62 6c 65 28 70 53 74 6d 74 2c 20 69  _double(pStmt, i
9ea0: 2c 20 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  , r);.        }e
9eb0: 6c 73 65 20 69 66 28 20 28 63 3d 3d 27 77 27 20  lse if( (c=='w' 
9ec0: 26 26 20 73 74 72 63 6d 70 28 7a 54 79 70 65 2c  && strcmp(zType,
9ed0: 22 77 69 64 65 49 6e 74 22 29 3d 3d 30 29 20 7c  "wideInt")==0) |
9ee0: 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  |.              
9ef0: 28 63 3d 3d 27 69 27 20 26 26 20 73 74 72 63 6d  (c=='i' && strcm
9f00: 70 28 7a 54 79 70 65 2c 22 69 6e 74 22 29 3d 3d  p(zType,"int")==
9f10: 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  0) ){.          
9f20: 54 63 6c 5f 57 69 64 65 49 6e 74 20 76 3b 0a 20  Tcl_WideInt v;. 
9f30: 20 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74           Tcl_Get
9f40: 57 69 64 65 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  WideIntFromObj(i
9f50: 6e 74 65 72 70 2c 20 70 56 61 72 2c 20 26 76 29  nterp, pVar, &v)
9f60: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
9f70: 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70  te3_bind_int64(p
9f80: 53 74 6d 74 2c 20 69 2c 20 76 29 3b 0a 20 20 20  Stmt, i, v);.   
9f90: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
9fa0: 20 20 20 20 20 20 64 61 74 61 20 3d 20 28 75 6e        data = (un
9fb0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 54 63  signed char *)Tc
9fc0: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
9fd0: 62 6a 28 70 56 61 72 2c 20 26 6e 29 3b 0a 20 20  bj(pVar, &n);.  
9fe0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
9ff0: 62 69 6e 64 5f 74 65 78 74 28 70 53 74 6d 74 2c  bind_text(pStmt,
a000: 20 69 2c 20 28 63 68 61 72 20 2a 29 64 61 74 61   i, (char *)data
a010: 2c 20 6e 2c 20 53 51 4c 49 54 45 5f 53 54 41 54  , n, SQLITE_STAT
a020: 49 43 29 3b 0a 20 20 20 20 20 20 20 20 20 20 54  IC);.          T
a030: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
a040: 70 56 61 72 29 3b 0a 20 20 20 20 20 20 20 20 20  pVar);.         
a050: 20 70 50 72 65 53 74 6d 74 2d 3e 61 70 50 61 72   pPreStmt->apPar
a060: 6d 5b 69 50 61 72 6d 2b 2b 5d 20 3d 20 70 56 61  m[iParm++] = pVa
a070: 72 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  r;.        }.   
a080: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
a090: 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e    sqlite3_bind_n
a0a0: 75 6c 6c 28 70 53 74 6d 74 2c 20 69 29 3b 0a 20  ull(pStmt, i);. 
a0b0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
a0c0: 0a 20 20 70 50 72 65 53 74 6d 74 2d 3e 6e 50 61  .  pPreStmt->nPa
a0d0: 72 6d 20 3d 20 69 50 61 72 6d 3b 0a 20 20 2a 70  rm = iParm;.  *p
a0e0: 70 50 72 65 53 74 6d 74 20 3d 20 70 50 72 65 53  pPreStmt = pPreS
a0f0: 74 6d 74 3b 0a 0a 20 20 72 65 74 75 72 6e 20 54  tmt;..  return T
a100: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
a110: 52 65 6c 65 61 73 65 20 61 20 73 74 61 74 65 6d  Release a statem
a120: 65 6e 74 20 72 65 66 65 72 65 6e 63 65 20 6f 62  ent reference ob
a130: 74 61 69 6e 65 64 20 62 79 20 63 61 6c 6c 69 6e  tained by callin
a140: 67 20 64 62 50 72 65 70 61 72 65 41 6e 64 42 69  g dbPrepareAndBi
a150: 6e 64 28 29 2e 0a 2a 2a 20 54 68 65 72 65 20 73  nd()..** There s
a160: 68 6f 75 6c 64 20 62 65 20 65 78 61 63 74 6c 79  hould be exactly
a170: 20 6f 6e 65 20 63 61 6c 6c 20 74 6f 20 74 68 69   one call to thi
a180: 73 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 65  s function for e
a190: 61 63 68 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20 64  ach call to.** d
a1a0: 62 50 72 65 70 61 72 65 41 6e 64 42 69 6e 64 28  bPrepareAndBind(
a1b0: 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  )..**.** If the 
a1c0: 64 69 73 63 61 72 64 20 70 61 72 61 6d 65 74 65  discard paramete
a1d0: 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  r is non-zero, t
a1e0: 68 65 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e  hen the statemen
a1f0: 74 20 69 73 20 64 65 6c 65 74 65 64 0a 2a 2a 20  t is deleted.** 
a200: 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20 4f 74 68  immediately. Oth
a210: 65 72 77 69 73 65 20 69 74 20 69 73 20 61 64 64  erwise it is add
a220: 65 64 20 74 6f 20 74 68 65 20 4c 52 55 20 6c 69  ed to the LRU li
a230: 73 74 20 61 6e 64 20 6d 61 79 20 62 65 20 72 65  st and may be re
a240: 74 75 72 6e 65 64 0a 2a 2a 20 62 79 20 61 20 73  turned.** by a s
a250: 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 20 74  ubsequent call t
a260: 6f 20 64 62 50 72 65 70 61 72 65 41 6e 64 42 69  o dbPrepareAndBi
a270: 6e 64 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  nd()..*/.static 
a280: 76 6f 69 64 20 64 62 52 65 6c 65 61 73 65 53 74  void dbReleaseSt
a290: 6d 74 28 0a 20 20 53 71 6c 69 74 65 44 62 20 2a  mt(.  SqliteDb *
a2a0: 70 44 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  pDb,            
a2b0: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
a2c0: 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 53 71  e handle */.  Sq
a2d0: 6c 50 72 65 70 61 72 65 64 53 74 6d 74 20 2a 70  lPreparedStmt *p
a2e0: 50 72 65 53 74 6d 74 2c 20 20 20 20 20 20 2f 2a  PreStmt,      /*
a2f0: 20 50 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   Prepared statem
a300: 65 6e 74 20 68 61 6e 64 6c 65 20 74 6f 20 72 65  ent handle to re
a310: 6c 65 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 64  lease */.  int d
a320: 69 73 63 61 72 64 20 20 20 20 20 20 20 20 20 20  iscard          
a330: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
a340: 75 65 20 74 6f 20 64 65 6c 65 74 65 20 28 6e 6f  ue to delete (no
a350: 74 20 63 61 63 68 65 29 20 74 68 65 20 70 50 72  t cache) the pPr
a360: 65 53 74 6d 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e  eStmt */.){.  in
a370: 74 20 69 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20  t i;..  /* Free 
a380: 74 68 65 20 62 6f 75 6e 64 20 73 74 72 69 6e 67  the bound string
a390: 20 61 6e 64 20 62 6c 6f 62 20 70 61 72 61 6d 65   and blob parame
a3a0: 74 65 72 73 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  ters */.  for(i=
a3b0: 30 3b 20 69 3c 70 50 72 65 53 74 6d 74 2d 3e 6e  0; i<pPreStmt->n
a3c0: 50 61 72 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Parm; i++){.    
a3d0: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
a3e0: 28 70 50 72 65 53 74 6d 74 2d 3e 61 70 50 61 72  (pPreStmt->apPar
a3f0: 6d 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 70 50 72  m[i]);.  }.  pPr
a400: 65 53 74 6d 74 2d 3e 6e 50 61 72 6d 20 3d 20 30  eStmt->nParm = 0
a410: 3b 0a 0a 20 20 69 66 28 20 70 44 62 2d 3e 6d 61  ;..  if( pDb->ma
a420: 78 53 74 6d 74 3c 3d 30 20 7c 7c 20 64 69 73 63  xStmt<=0 || disc
a430: 61 72 64 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  ard ){.    /* If
a440: 20 74 68 65 20 63 61 63 68 65 20 69 73 20 74 75   the cache is tu
a450: 72 6e 65 64 20 6f 66 66 2c 20 64 65 61 6c 6c 6f  rned off, deallo
a460: 63 61 74 65 64 20 74 68 65 20 73 74 61 74 65 6d  cated the statem
a470: 65 6e 74 20 2a 2f 0a 20 20 20 20 64 62 46 72 65  ent */.    dbFre
a480: 65 53 74 6d 74 28 70 50 72 65 53 74 6d 74 29 3b  eStmt(pPreStmt);
a490: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
a4a0: 20 41 64 64 20 74 68 65 20 70 72 65 70 61 72 65   Add the prepare
a4b0: 64 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 74  d statement to t
a4c0: 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
a4d0: 74 68 65 20 63 61 63 68 65 20 6c 69 73 74 2e 20  the cache list. 
a4e0: 2a 2f 0a 20 20 20 20 70 50 72 65 53 74 6d 74 2d  */.    pPreStmt-
a4f0: 3e 70 4e 65 78 74 20 3d 20 70 44 62 2d 3e 73 74  >pNext = pDb->st
a500: 6d 74 4c 69 73 74 3b 0a 20 20 20 20 70 50 72 65  mtList;.    pPre
a510: 53 74 6d 74 2d 3e 70 50 72 65 76 20 3d 20 30 3b  Stmt->pPrev = 0;
a520: 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e 73 74  .    if( pDb->st
a530: 6d 74 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 70  mtList ){.     p
a540: 44 62 2d 3e 73 74 6d 74 4c 69 73 74 2d 3e 70 50  Db->stmtList->pP
a550: 72 65 76 20 3d 20 70 50 72 65 53 74 6d 74 3b 0a  rev = pPreStmt;.
a560: 20 20 20 20 7d 0a 20 20 20 20 70 44 62 2d 3e 73      }.    pDb->s
a570: 74 6d 74 4c 69 73 74 20 3d 20 70 50 72 65 53 74  tmtList = pPreSt
a580: 6d 74 3b 0a 20 20 20 20 69 66 28 20 70 44 62 2d  mt;.    if( pDb-
a590: 3e 73 74 6d 74 4c 61 73 74 3d 3d 30 20 29 7b 0a  >stmtLast==0 ){.
a5a0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 44        assert( pD
a5b0: 62 2d 3e 6e 53 74 6d 74 3d 3d 30 20 29 3b 0a 20  b->nStmt==0 );. 
a5c0: 20 20 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c 61       pDb->stmtLa
a5d0: 73 74 20 3d 20 70 50 72 65 53 74 6d 74 3b 0a 20  st = pPreStmt;. 
a5e0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
a5f0: 61 73 73 65 72 74 28 20 70 44 62 2d 3e 6e 53 74  assert( pDb->nSt
a600: 6d 74 3e 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20  mt>0 );.    }.  
a610: 20 20 70 44 62 2d 3e 6e 53 74 6d 74 2b 2b 3b 0a    pDb->nStmt++;.
a620: 20 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 77 65     .    /* If we
a630: 20 68 61 76 65 20 74 6f 6f 20 6d 61 6e 79 20 73   have too many s
a640: 74 61 74 65 6d 65 6e 74 20 69 6e 20 63 61 63 68  tatement in cach
a650: 65 2c 20 72 65 6d 6f 76 65 20 74 68 65 20 73 75  e, remove the su
a660: 72 70 6c 75 73 20 66 72 6f 6d 20 0a 20 20 20 20  rplus from .    
a670: 2a 2a 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  ** the end of th
a680: 65 20 63 61 63 68 65 20 6c 69 73 74 2e 20 20 2a  e cache list.  *
a690: 2f 0a 20 20 20 20 77 68 69 6c 65 28 20 70 44 62  /.    while( pDb
a6a0: 2d 3e 6e 53 74 6d 74 3e 70 44 62 2d 3e 6d 61 78  ->nStmt>pDb->max
a6b0: 53 74 6d 74 20 29 7b 0a 20 20 20 20 20 20 53 71  Stmt ){.      Sq
a6c0: 6c 50 72 65 70 61 72 65 64 53 74 6d 74 20 2a 70  lPreparedStmt *p
a6d0: 4c 61 73 74 20 3d 20 70 44 62 2d 3e 73 74 6d 74  Last = pDb->stmt
a6e0: 4c 61 73 74 3b 0a 20 20 20 20 20 20 70 44 62 2d  Last;.      pDb-
a6f0: 3e 73 74 6d 74 4c 61 73 74 20 3d 20 70 4c 61 73  >stmtLast = pLas
a700: 74 2d 3e 70 50 72 65 76 3b 0a 20 20 20 20 20 20  t->pPrev;.      
a710: 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74 2d 3e 70  pDb->stmtLast->p
a720: 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Next = 0;.      
a730: 70 44 62 2d 3e 6e 53 74 6d 74 2d 2d 3b 0a 20 20  pDb->nStmt--;.  
a740: 20 20 20 20 64 62 46 72 65 65 53 74 6d 74 28 70      dbFreeStmt(p
a750: 4c 61 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Last);.    }.  }
a760: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 72 75 63 74  .}../*.** Struct
a770: 75 72 65 20 75 73 65 64 20 77 69 74 68 20 64 62  ure used with db
a780: 45 76 61 6c 58 58 58 28 29 20 66 75 6e 63 74 69  EvalXXX() functi
a790: 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 64 62 45  ons:.**.**   dbE
a7a0: 76 61 6c 49 6e 69 74 28 29 0a 2a 2a 20 20 20 64  valInit().**   d
a7b0: 62 45 76 61 6c 53 74 65 70 28 29 0a 2a 2a 20 20  bEvalStep().**  
a7c0: 20 64 62 45 76 61 6c 46 69 6e 61 6c 69 7a 65 28   dbEvalFinalize(
a7d0: 29 0a 2a 2a 20 20 20 64 62 45 76 61 6c 52 6f 77  ).**   dbEvalRow
a7e0: 49 6e 66 6f 28 29 0a 2a 2a 20 20 20 64 62 45 76  Info().**   dbEv
a7f0: 61 6c 43 6f 6c 75 6d 6e 56 61 6c 75 65 28 29 0a  alColumnValue().
a800: 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
a810: 74 20 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 20  t DbEvalContext 
a820: 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 3b 0a 73  DbEvalContext;.s
a830: 74 72 75 63 74 20 44 62 45 76 61 6c 43 6f 6e 74  truct DbEvalCont
a840: 65 78 74 20 7b 0a 20 20 53 71 6c 69 74 65 44 62  ext {.  SqliteDb
a850: 20 2a 70 44 62 3b 20 20 20 20 20 20 20 20 20 20   *pDb;          
a860: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
a870: 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ase handle */.  
a880: 54 63 6c 5f 4f 62 6a 20 2a 70 53 71 6c 3b 20 20  Tcl_Obj *pSql;  
a890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a8a0: 2f 2a 20 4f 62 6a 65 63 74 20 68 6f 6c 64 69 6e  /* Object holdin
a8b0: 67 20 73 74 72 69 6e 67 20 7a 53 71 6c 20 2a 2f  g string zSql */
a8c0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
a8d0: 53 71 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Sql;            
a8e0: 20 20 20 2f 2a 20 52 65 6d 61 69 6e 69 6e 67 20     /* Remaining 
a8f0: 53 51 4c 20 74 6f 20 65 78 65 63 75 74 65 20 2a  SQL to execute *
a900: 2f 0a 20 20 53 71 6c 50 72 65 70 61 72 65 64 53  /.  SqlPreparedS
a910: 74 6d 74 20 2a 70 50 72 65 53 74 6d 74 3b 20 20  tmt *pPreStmt;  
a920: 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 73      /* Current s
a930: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e  tatement */.  in
a940: 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20 20  t nCol;         
a950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a960: 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   Number of colum
a970: 6e 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 70  ns returned by p
a980: 53 74 6d 74 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62  Stmt */.  Tcl_Ob
a990: 6a 20 2a 70 41 72 72 61 79 3b 20 20 20 20 20 20  j *pArray;      
a9a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
a9b0: 65 20 6f 66 20 61 72 72 61 79 20 76 61 72 69 61  e of array varia
a9c0: 62 6c 65 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a  ble */.  Tcl_Obj
a9d0: 20 2a 2a 61 70 43 6f 6c 4e 61 6d 65 3b 20 20 20   **apColName;   
a9e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61           /* Arra
a9f0: 79 20 6f 66 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  y of column name
aa00: 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 52  s */.};../*.** R
aa10: 65 6c 65 61 73 65 20 61 6e 79 20 63 61 63 68 65  elease any cache
aa20: 20 6f 66 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73   of column names
aa30: 20 63 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 20   currently held 
aa40: 61 73 20 70 61 72 74 20 6f 66 0a 2a 2a 20 74 68  as part of.** th
aa50: 65 20 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 20  e DbEvalContext 
aa60: 73 74 72 75 63 74 75 72 65 20 70 61 73 73 65 64  structure passed
aa70: 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
aa80: 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  gument..*/.stati
aa90: 63 20 76 6f 69 64 20 64 62 52 65 6c 65 61 73 65  c void dbRelease
aaa0: 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 44 62 45 76  ColumnNames(DbEv
aab0: 61 6c 43 6f 6e 74 65 78 74 20 2a 70 29 7b 0a 20  alContext *p){. 
aac0: 20 69 66 28 20 70 2d 3e 61 70 43 6f 6c 4e 61 6d   if( p->apColNam
aad0: 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  e ){.    int i;.
aae0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
aaf0: 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  ->nCol; i++){.  
ab00: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
ab10: 6f 75 6e 74 28 70 2d 3e 61 70 43 6f 6c 4e 61 6d  ount(p->apColNam
ab20: 65 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20  e[i]);.    }.   
ab30: 20 54 63 6c 5f 46 72 65 65 28 28 63 68 61 72 20   Tcl_Free((char 
ab40: 2a 29 70 2d 3e 61 70 43 6f 6c 4e 61 6d 65 29 3b  *)p->apColName);
ab50: 0a 20 20 20 20 70 2d 3e 61 70 43 6f 6c 4e 61 6d  .    p->apColNam
ab60: 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 2d 3e  e = 0;.  }.  p->
ab70: 6e 43 6f 6c 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  nCol = 0;.}../*.
ab80: 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 20  ** Initialize a 
ab90: 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 20 73 74  DbEvalContext st
aba0: 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49  ructure..**.** I
abb0: 66 20 70 41 72 72 61 79 20 69 73 20 6e 6f 74 20  f pArray is not 
abc0: 4e 55 4c 4c 2c 20 74 68 65 6e 20 69 74 20 63 6f  NULL, then it co
abd0: 6e 74 61 69 6e 73 20 74 68 65 20 6e 61 6d 65 20  ntains the name 
abe0: 6f 66 20 61 20 54 63 6c 20 61 72 72 61 79 0a 2a  of a Tcl array.*
abf0: 2a 20 76 61 72 69 61 62 6c 65 2e 20 54 68 65 20  * variable. The 
ac00: 22 2a 22 20 6d 65 6d 62 65 72 20 6f 66 20 74 68  "*" member of th
ac10: 69 73 20 61 72 72 61 79 20 69 73 20 73 65 74 20  is array is set 
ac20: 74 6f 20 61 20 6c 69 73 74 20 63 6f 6e 74 61 69  to a list contai
ac30: 6e 69 6e 67 0a 2a 2a 20 74 68 65 20 6e 61 6d 65  ning.** the name
ac40: 73 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73  s of the columns
ac50: 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65   returned by the
ac60: 20 73 74 61 74 65 6d 65 6e 74 20 61 73 20 70 61   statement as pa
ac70: 72 74 20 6f 66 20 65 61 63 68 0a 2a 2a 20 63 61  rt of each.** ca
ac80: 6c 6c 20 74 6f 20 64 62 45 76 61 6c 53 74 65 70  ll to dbEvalStep
ac90: 28 29 2c 20 69 6e 20 6f 72 64 65 72 20 66 72 6f  (), in order fro
aca0: 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74 2e  m left to right.
acb0: 20 65 2e 67 2e 20 69 66 20 74 68 65 20 6e 61 6d   e.g. if the nam
acc0: 65 73 20 0a 2a 2a 20 6f 66 20 74 68 65 20 72 65  es .** of the re
acd0: 74 75 72 6e 65 64 20 63 6f 6c 75 6d 6e 73 20 61  turned columns a
ace0: 72 65 20 61 2c 20 62 20 61 6e 64 20 63 2c 20 69  re a, b and c, i
acf0: 74 20 64 6f 65 73 20 74 68 65 20 65 71 75 69 76  t does the equiv
ad00: 61 6c 65 6e 74 20 6f 66 20 74 68 65 20 0a 2a 2a  alent of the .**
ad10: 20 74 63 6c 20 63 6f 6d 6d 61 6e 64 3a 0a 2a 2a   tcl command:.**
ad20: 0a 2a 2a 20 20 20 20 20 73 65 74 20 24 7b 70 41  .**     set ${pA
ad30: 72 72 61 79 7d 28 2a 29 20 7b 61 20 62 20 63 7d  rray}(*) {a b c}
ad40: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
ad50: 64 62 45 76 61 6c 49 6e 69 74 28 0a 20 20 44 62  dbEvalInit(.  Db
ad60: 45 76 61 6c 43 6f 6e 74 65 78 74 20 2a 70 2c 20  EvalContext *p, 
ad70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ad80: 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 74 72 75   Pointer to stru
ad90: 63 74 75 72 65 20 74 6f 20 69 6e 69 74 69 61 6c  cture to initial
ada0: 69 7a 65 20 2a 2f 0a 20 20 53 71 6c 69 74 65 44  ize */.  SqliteD
adb0: 62 20 2a 70 44 62 2c 20 20 20 20 20 20 20 20 20  b *pDb,         
adc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
add0: 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  base handle */. 
ade0: 20 54 63 6c 5f 4f 62 6a 20 2a 70 53 71 6c 2c 20   Tcl_Obj *pSql, 
adf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ae00: 20 2f 2a 20 4f 62 6a 65 63 74 20 63 6f 6e 74 61   /* Object conta
ae10: 69 6e 69 6e 67 20 53 51 4c 20 73 63 72 69 70 74  ining SQL script
ae20: 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70   */.  Tcl_Obj *p
ae30: 41 72 72 61 79 20 20 20 20 20 20 20 20 20 20 20  Array           
ae40: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
ae50: 20 54 63 6c 20 61 72 72 61 79 20 74 6f 20 73 65   Tcl array to se
ae60: 74 20 28 2a 29 20 65 6c 65 6d 65 6e 74 20 6f 66  t (*) element of
ae70: 20 2a 2f 0a 29 7b 0a 20 20 6d 65 6d 73 65 74 28   */.){.  memset(
ae80: 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 44 62 45  p, 0, sizeof(DbE
ae90: 76 61 6c 43 6f 6e 74 65 78 74 29 29 3b 0a 20 20  valContext));.  
aea0: 70 2d 3e 70 44 62 20 3d 20 70 44 62 3b 0a 20 20  p->pDb = pDb;.  
aeb0: 70 2d 3e 7a 53 71 6c 20 3d 20 54 63 6c 5f 47 65  p->zSql = Tcl_Ge
aec0: 74 53 74 72 69 6e 67 28 70 53 71 6c 29 3b 0a 20  tString(pSql);. 
aed0: 20 70 2d 3e 70 53 71 6c 20 3d 20 70 53 71 6c 3b   p->pSql = pSql;
aee0: 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f  .  Tcl_IncrRefCo
aef0: 75 6e 74 28 70 53 71 6c 29 3b 0a 20 20 69 66 28  unt(pSql);.  if(
af00: 20 70 41 72 72 61 79 20 29 7b 0a 20 20 20 20 70   pArray ){.    p
af10: 2d 3e 70 41 72 72 61 79 20 3d 20 70 41 72 72 61  ->pArray = pArra
af20: 79 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52  y;.    Tcl_IncrR
af30: 65 66 43 6f 75 6e 74 28 70 41 72 72 61 79 29 3b  efCount(pArray);
af40: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 62  .  }.}../*.** Ob
af50: 74 61 69 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  tain information
af60: 20 61 62 6f 75 74 20 74 68 65 20 72 6f 77 20 74   about the row t
af70: 68 61 74 20 74 68 65 20 44 62 45 76 61 6c 43 6f  hat the DbEvalCo
af80: 6e 74 65 78 74 20 70 61 73 73 65 64 20 61 73 20  ntext passed as 
af90: 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 61 72 67  the.** first arg
afa0: 75 6d 65 6e 74 20 63 75 72 72 65 6e 74 6c 79 20  ument currently 
afb0: 70 6f 69 6e 74 73 20 74 6f 2e 0a 2a 2f 0a 73 74  points to..*/.st
afc0: 61 74 69 63 20 76 6f 69 64 20 64 62 45 76 61 6c  atic void dbEval
afd0: 52 6f 77 49 6e 66 6f 28 0a 20 20 44 62 45 76 61  RowInfo(.  DbEva
afe0: 6c 43 6f 6e 74 65 78 74 20 2a 70 2c 20 20 20 20  lContext *p,    
aff0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 76             /* Ev
b000: 61 6c 75 61 74 69 6f 6e 20 63 6f 6e 74 65 78 74  aluation context
b010: 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 43 6f 6c   */.  int *pnCol
b020: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
b030: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 75        /* OUT: Nu
b040: 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 20 6e  mber of column n
b050: 61 6d 65 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62  ames */.  Tcl_Ob
b060: 6a 20 2a 2a 2a 70 61 70 43 6f 6c 4e 61 6d 65 20  j ***papColName 
b070: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
b080: 3a 20 41 72 72 61 79 20 6f 66 20 63 6f 6c 75 6d  : Array of colum
b090: 6e 20 6e 61 6d 65 73 20 2a 2f 0a 29 7b 0a 20 20  n names */.){.  
b0a0: 2f 2a 20 43 6f 6d 70 75 74 65 20 63 6f 6c 75 6d  /* Compute colum
b0b0: 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 69 66 28  n names */.  if(
b0c0: 20 30 3d 3d 70 2d 3e 61 70 43 6f 6c 4e 61 6d 65   0==p->apColName
b0d0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
b0e0: 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 70 2d  stmt *pStmt = p-
b0f0: 3e 70 50 72 65 53 74 6d 74 2d 3e 70 53 74 6d 74  >pPreStmt->pStmt
b100: 3b 0a 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20  ;.    int i;    
b110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b120: 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20      /* Iterator 
b130: 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 20 20  variable */.    
b140: 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20  int nCol;       
b150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b160: 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   Number of colum
b170: 6e 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 70  ns returned by p
b180: 53 74 6d 74 20 2a 2f 0a 20 20 20 20 54 63 6c 5f  Stmt */.    Tcl_
b190: 4f 62 6a 20 2a 2a 61 70 43 6f 6c 4e 61 6d 65 20  Obj **apColName 
b1a0: 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 41 72 72  = 0;      /* Arr
b1b0: 61 79 20 6f 66 20 63 6f 6c 75 6d 6e 20 6e 61 6d  ay of column nam
b1c0: 65 73 20 2a 2f 0a 0a 20 20 20 20 70 2d 3e 6e 43  es */..    p->nC
b1d0: 6f 6c 20 3d 20 6e 43 6f 6c 20 3d 20 73 71 6c 69  ol = nCol = sqli
b1e0: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74  te3_column_count
b1f0: 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 69 66 28  (pStmt);.    if(
b200: 20 6e 43 6f 6c 3e 30 20 26 26 20 28 70 61 70 43   nCol>0 && (papC
b210: 6f 6c 4e 61 6d 65 20 7c 7c 20 70 2d 3e 70 41 72  olName || p->pAr
b220: 72 61 79 29 20 29 7b 0a 20 20 20 20 20 20 61 70  ray) ){.      ap
b230: 43 6f 6c 4e 61 6d 65 20 3d 20 28 54 63 6c 5f 4f  ColName = (Tcl_O
b240: 62 6a 2a 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28 20  bj**)Tcl_Alloc( 
b250: 73 69 7a 65 6f 66 28 54 63 6c 5f 4f 62 6a 2a 29  sizeof(Tcl_Obj*)
b260: 2a 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20 66  *nCol );.      f
b270: 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20  or(i=0; i<nCol; 
b280: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 61 70  i++){.        ap
b290: 43 6f 6c 4e 61 6d 65 5b 69 5d 20 3d 20 64 62 54  ColName[i] = dbT
b2a0: 65 78 74 54 6f 4f 62 6a 28 73 71 6c 69 74 65 33  extToObj(sqlite3
b2b0: 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 28 70 53 74  _column_name(pSt
b2c0: 6d 74 2c 69 29 29 3b 0a 20 20 20 20 20 20 20 20  mt,i));.        
b2d0: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
b2e0: 28 61 70 43 6f 6c 4e 61 6d 65 5b 69 5d 29 3b 0a  (apColName[i]);.
b2f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d        }.      p-
b300: 3e 61 70 43 6f 6c 4e 61 6d 65 20 3d 20 61 70 43  >apColName = apC
b310: 6f 6c 4e 61 6d 65 3b 0a 20 20 20 20 7d 0a 0a 20  olName;.    }.. 
b320: 20 20 20 2f 2a 20 49 66 20 72 65 73 75 6c 74 73     /* If results
b330: 20 61 72 65 20 62 65 69 6e 67 20 73 74 6f 72 65   are being store
b340: 64 20 69 6e 20 61 6e 20 61 72 72 61 79 20 76 61  d in an array va
b350: 72 69 61 62 6c 65 2c 20 74 68 65 6e 20 63 72 65  riable, then cre
b360: 61 74 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 61  ate.    ** the a
b370: 72 72 61 79 28 2a 29 20 65 6e 74 72 79 20 66 6f  rray(*) entry fo
b380: 72 20 74 68 61 74 20 61 72 72 61 79 0a 20 20 20  r that array.   
b390: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 70   */.    if( p->p
b3a0: 41 72 72 61 79 20 29 7b 0a 20 20 20 20 20 20 54  Array ){.      T
b3b0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
b3c0: 70 20 3d 20 70 2d 3e 70 44 62 2d 3e 69 6e 74 65  p = p->pDb->inte
b3d0: 72 70 3b 0a 20 20 20 20 20 20 54 63 6c 5f 4f 62  rp;.      Tcl_Ob
b3e0: 6a 20 2a 70 43 6f 6c 4c 69 73 74 20 3d 20 54 63  j *pColList = Tc
b3f0: 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20 20 20 20  l_NewObj();.    
b400: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 53 74 61 72    Tcl_Obj *pStar
b410: 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67   = Tcl_NewString
b420: 4f 62 6a 28 22 2a 22 2c 20 2d 31 29 3b 0a 0a 20  Obj("*", -1);.. 
b430: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
b440: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
b450: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
b460: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
b470: 65 72 70 2c 20 70 43 6f 6c 4c 69 73 74 2c 20 61  erp, pColList, a
b480: 70 43 6f 6c 4e 61 6d 65 5b 69 5d 29 3b 0a 20 20  pColName[i]);.  
b490: 20 20 20 20 7d 0a 20 20 20 20 20 20 54 63 6c 5f      }.      Tcl_
b4a0: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 53 74  IncrRefCount(pSt
b4b0: 61 72 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 4f  ar);.      Tcl_O
b4c0: 62 6a 53 65 74 56 61 72 32 28 69 6e 74 65 72 70  bjSetVar2(interp
b4d0: 2c 20 70 2d 3e 70 41 72 72 61 79 2c 20 70 53 74  , p->pArray, pSt
b4e0: 61 72 2c 20 70 43 6f 6c 4c 69 73 74 2c 20 30 29  ar, pColList, 0)
b4f0: 3b 0a 20 20 20 20 20 20 54 63 6c 5f 44 65 63 72  ;.      Tcl_Decr
b500: 52 65 66 43 6f 75 6e 74 28 70 53 74 61 72 29 3b  RefCount(pStar);
b510: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
b520: 28 20 70 61 70 43 6f 6c 4e 61 6d 65 20 29 7b 0a  ( papColName ){.
b530: 20 20 20 20 2a 70 61 70 43 6f 6c 4e 61 6d 65 20      *papColName 
b540: 3d 20 70 2d 3e 61 70 43 6f 6c 4e 61 6d 65 3b 0a  = p->apColName;.
b550: 20 20 7d 0a 20 20 69 66 28 20 70 6e 43 6f 6c 20    }.  if( pnCol 
b560: 29 7b 0a 20 20 20 20 2a 70 6e 43 6f 6c 20 3d 20  ){.    *pnCol = 
b570: 70 2d 3e 6e 43 6f 6c 3b 0a 20 20 7d 0a 7d 0a 0a  p->nCol;.  }.}..
b580: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 6f 6e 65  /*.** Return one
b590: 20 6f 66 20 54 43 4c 5f 4f 4b 2c 20 54 43 4c 5f   of TCL_OK, TCL_
b5a0: 42 52 45 41 4b 20 6f 72 20 54 43 4c 5f 45 52 52  BREAK or TCL_ERR
b5b0: 4f 52 2e 20 49 66 20 54 43 4c 5f 45 52 52 4f 52  OR. If TCL_ERROR
b5c0: 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2c   is.** returned,
b5d0: 20 74 68 65 6e 20 61 6e 20 65 72 72 6f 72 20 6d   then an error m
b5e0: 65 73 73 61 67 65 20 69 73 20 73 74 6f 72 65 64  essage is stored
b5f0: 20 69 6e 20 74 68 65 20 69 6e 74 65 72 70 72 65   in the interpre
b600: 74 65 72 20 62 65 66 6f 72 65 0a 2a 2a 20 72 65  ter before.** re
b610: 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41  turning..**.** A
b620: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66   return value of
b630: 20 54 43 4c 5f 4f 4b 20 6d 65 61 6e 73 20 74 68   TCL_OK means th
b640: 65 72 65 20 69 73 20 61 20 72 6f 77 20 6f 66 20  ere is a row of 
b650: 64 61 74 61 20 61 76 61 69 6c 61 62 6c 65 2e 20  data available. 
b660: 54 68 65 0a 2a 2a 20 64 61 74 61 20 6d 61 79 20  The.** data may 
b670: 62 65 20 61 63 63 65 73 73 65 64 20 75 73 69 6e  be accessed usin
b680: 67 20 64 62 45 76 61 6c 52 6f 77 49 6e 66 6f 28  g dbEvalRowInfo(
b690: 29 20 61 6e 64 20 64 62 45 76 61 6c 43 6f 6c 75  ) and dbEvalColu
b6a0: 6d 6e 56 61 6c 75 65 28 29 2e 20 54 68 69 73 0a  mnValue(). This.
b6b0: 2a 2a 20 69 73 20 61 6e 61 6c 6f 67 6f 75 73 20  ** is analogous 
b6c0: 74 6f 20 61 20 72 65 74 75 72 6e 20 6f 66 20 53  to a return of S
b6d0: 51 4c 49 54 45 5f 52 4f 57 20 66 72 6f 6d 20 73  QLITE_ROW from s
b6e0: 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2e 20 49  qlite3_step(). I
b6f0: 66 20 54 43 4c 5f 42 52 45 41 4b 0a 2a 2a 20 69  f TCL_BREAK.** i
b700: 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65 6e  s returned, then
b710: 20 74 68 65 20 53 51 4c 20 73 63 72 69 70 74 20   the SQL script 
b720: 68 61 73 20 66 69 6e 69 73 68 65 64 20 65 78 65  has finished exe
b730: 63 75 74 69 6e 67 20 61 6e 64 20 74 68 65 72 65  cuting and there
b740: 20 61 72 65 0a 2a 2a 20 6e 6f 20 66 75 72 74 68   are.** no furth
b750: 65 72 20 72 6f 77 73 20 61 76 61 69 6c 61 62 6c  er rows availabl
b760: 65 2e 20 54 68 69 73 20 69 73 20 73 69 6d 69 6c  e. This is simil
b770: 61 72 20 74 6f 20 53 51 4c 49 54 45 5f 44 4f 4e  ar to SQLITE_DON
b780: 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  E..*/.static int
b790: 20 64 62 45 76 61 6c 53 74 65 70 28 44 62 45 76   dbEvalStep(DbEv
b7a0: 61 6c 43 6f 6e 74 65 78 74 20 2a 70 29 7b 0a 20  alContext *p){. 
b7b0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 72   const char *zPr
b7c0: 65 76 53 71 6c 20 3d 20 30 3b 20 20 20 20 20 20  evSql = 0;      
b7d0: 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 76 61 6c   /* Previous val
b7e0: 75 65 20 6f 66 20 70 2d 3e 7a 53 71 6c 20 2a 2f  ue of p->zSql */
b7f0: 0a 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 7a 53  ..  while( p->zS
b800: 71 6c 5b 30 5d 20 7c 7c 20 70 2d 3e 70 50 72 65  ql[0] || p->pPre
b810: 53 74 6d 74 20 29 7b 0a 20 20 20 20 69 6e 74 20  Stmt ){.    int 
b820: 72 63 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70  rc;.    if( p->p
b830: 50 72 65 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20  PreStmt==0 ){.  
b840: 20 20 20 20 7a 50 72 65 76 53 71 6c 20 3d 20 28      zPrevSql = (
b850: 70 2d 3e 7a 53 71 6c 3d 3d 7a 50 72 65 76 53 71  p->zSql==zPrevSq
b860: 6c 20 3f 20 30 20 3a 20 70 2d 3e 7a 53 71 6c 29  l ? 0 : p->zSql)
b870: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 64 62 50  ;.      rc = dbP
b880: 72 65 70 61 72 65 41 6e 64 42 69 6e 64 28 70 2d  repareAndBind(p-
b890: 3e 70 44 62 2c 20 70 2d 3e 7a 53 71 6c 2c 20 26  >pDb, p->zSql, &
b8a0: 70 2d 3e 7a 53 71 6c 2c 20 26 70 2d 3e 70 50 72  p->zSql, &p->pPr
b8b0: 65 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 69 66  eStmt);.      if
b8c0: 28 20 72 63 21 3d 54 43 4c 5f 4f 4b 20 29 20 72  ( rc!=TCL_OK ) r
b8d0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 65  eturn rc;.    }e
b8e0: 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 72  lse{.      int r
b8f0: 63 73 3b 0a 20 20 20 20 20 20 53 71 6c 69 74 65  cs;.      Sqlite
b900: 44 62 20 2a 70 44 62 20 3d 20 70 2d 3e 70 44 62  Db *pDb = p->pDb
b910: 3b 0a 20 20 20 20 20 20 53 71 6c 50 72 65 70 61  ;.      SqlPrepa
b920: 72 65 64 53 74 6d 74 20 2a 70 50 72 65 53 74 6d  redStmt *pPreStm
b930: 74 20 3d 20 70 2d 3e 70 50 72 65 53 74 6d 74 3b  t = p->pPreStmt;
b940: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
b950: 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 70 50 72  tmt *pStmt = pPr
b960: 65 53 74 6d 74 2d 3e 70 53 74 6d 74 3b 0a 0a 20  eStmt->pStmt;.. 
b970: 20 20 20 20 20 72 63 73 20 3d 20 73 71 6c 69 74       rcs = sqlit
b980: 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3b 0a  e3_step(pStmt);.
b990: 20 20 20 20 20 20 69 66 28 20 72 63 73 3d 3d 53        if( rcs==S
b9a0: 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20  QLITE_ROW ){.   
b9b0: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
b9c0: 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OK;.      }.    
b9d0: 20 20 69 66 28 20 70 2d 3e 70 41 72 72 61 79 20    if( p->pArray 
b9e0: 29 7b 0a 20 20 20 20 20 20 20 20 64 62 45 76 61  ){.        dbEva
b9f0: 6c 52 6f 77 49 6e 66 6f 28 70 2c 20 30 2c 20 30  lRowInfo(p, 0, 0
ba00: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
ba10: 20 72 63 73 20 3d 20 73 71 6c 69 74 65 33 5f 72   rcs = sqlite3_r
ba20: 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 0a 20 20  eset(pStmt);..  
ba30: 20 20 20 20 70 44 62 2d 3e 6e 53 74 65 70 20 3d      pDb->nStep =
ba40: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74   sqlite3_stmt_st
ba50: 61 74 75 73 28 70 53 74 6d 74 2c 53 51 4c 49 54  atus(pStmt,SQLIT
ba60: 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 46 55 4c  E_STMTSTATUS_FUL
ba70: 4c 53 43 41 4e 5f 53 54 45 50 2c 31 29 3b 0a 20  LSCAN_STEP,1);. 
ba80: 20 20 20 20 20 70 44 62 2d 3e 6e 53 6f 72 74 20       pDb->nSort 
ba90: 3d 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73  = sqlite3_stmt_s
baa0: 74 61 74 75 73 28 70 53 74 6d 74 2c 53 51 4c 49  tatus(pStmt,SQLI
bab0: 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 53 4f  TE_STMTSTATUS_SO
bac0: 52 54 2c 31 29 3b 0a 20 20 20 20 20 20 70 44 62  RT,1);.      pDb
bad0: 2d 3e 6e 49 6e 64 65 78 20 3d 20 73 71 6c 69 74  ->nIndex = sqlit
bae0: 65 33 5f 73 74 6d 74 5f 73 74 61 74 75 73 28 70  e3_stmt_status(p
baf0: 53 74 6d 74 2c 53 51 4c 49 54 45 5f 53 54 4d 54  Stmt,SQLITE_STMT
bb00: 53 54 41 54 55 53 5f 41 55 54 4f 49 4e 44 45 58  STATUS_AUTOINDEX
bb10: 2c 31 29 3b 0a 20 20 20 20 20 20 64 62 52 65 6c  ,1);.      dbRel
bb20: 65 61 73 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  easeColumnNames(
bb30: 70 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72  p);.      p->pPr
bb40: 65 53 74 6d 74 20 3d 20 30 3b 0a 0a 20 20 20 20  eStmt = 0;..    
bb50: 20 20 69 66 28 20 72 63 73 21 3d 53 51 4c 49 54    if( rcs!=SQLIT
bb60: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
bb70: 2f 2a 20 49 66 20 61 20 72 75 6e 2d 74 69 6d 65  /* If a run-time
bb80: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72   error occurs, r
bb90: 65 70 6f 72 74 20 74 68 65 20 65 72 72 6f 72 20  eport the error 
bba0: 61 6e 64 20 73 74 6f 70 20 72 65 61 64 69 6e 67  and stop reading
bbb0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
bbc0: 53 51 4c 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  SQL.  */.       
bbd0: 20 64 62 52 65 6c 65 61 73 65 53 74 6d 74 28 70   dbReleaseStmt(p
bbe0: 44 62 2c 20 70 50 72 65 53 74 6d 74 2c 20 31 29  Db, pPreStmt, 1)
bbf0: 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 45 53  ;.#if SQLITE_TES
bc00: 54 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  T.        if( p-
bc10: 3e 70 44 62 2d 3e 62 4c 65 67 61 63 79 50 72 65  >pDb->bLegacyPre
bc20: 70 61 72 65 20 26 26 20 72 63 73 3d 3d 53 51 4c  pare && rcs==SQL
bc30: 49 54 45 5f 53 43 48 45 4d 41 20 26 26 20 7a 50  ITE_SCHEMA && zP
bc40: 72 65 76 53 71 6c 20 29 7b 0a 20 20 20 20 20 20  revSql ){.      
bc50: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 72 75      /* If the ru
bc60: 6e 74 69 6d 65 20 65 72 72 6f 72 20 77 61 73 20  ntime error was 
bc70: 61 6e 20 53 51 4c 49 54 45 5f 53 43 48 45 4d 41  an SQLITE_SCHEMA
bc80: 2c 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61  , and the databa
bc90: 73 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  se.          ** 
bca0: 68 61 6e 64 6c 65 20 69 73 20 63 6f 6e 66 69 67  handle is config
bcb0: 75 72 65 64 20 74 6f 20 75 73 65 20 74 68 65 20  ured to use the 
bcc0: 6c 65 67 61 63 79 20 73 71 6c 69 74 65 33 5f 70  legacy sqlite3_p
bcd0: 72 65 70 61 72 65 28 29 20 0a 20 20 20 20 20 20  repare() .      
bce0: 20 20 20 20 2a 2a 20 69 6e 74 65 72 66 61 63 65      ** interface
bcf0: 2c 20 72 65 74 72 79 20 70 72 65 70 61 72 65 28  , retry prepare(
bd00: 29 2f 73 74 65 70 28 29 20 6f 6e 20 74 68 65 20  )/step() on the 
bd10: 73 61 6d 65 20 53 51 4c 20 73 74 61 74 65 6d 65  same SQL stateme
bd20: 6e 74 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  nt..          **
bd30: 20 54 68 69 73 20 6f 6e 6c 79 20 68 61 70 70 65   This only happe
bd40: 6e 73 20 6f 6e 63 65 2e 20 49 66 20 74 68 65 72  ns once. If ther
bd50: 65 20 69 73 20 61 20 73 65 63 6f 6e 64 20 53 51  e is a second SQ
bd60: 4c 49 54 45 5f 53 43 48 45 4d 41 0a 20 20 20 20  LITE_SCHEMA.    
bd70: 20 20 20 20 20 20 2a 2a 20 65 72 72 6f 72 2c 20        ** error, 
bd80: 74 68 65 20 65 72 72 6f 72 20 77 69 6c 6c 20 62  the error will b
bd90: 65 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68  e returned to th
bda0: 65 20 63 61 6c 6c 65 72 2e 20 2a 2f 0a 20 20 20  e caller. */.   
bdb0: 20 20 20 20 20 20 20 70 2d 3e 7a 53 71 6c 20 3d         p->zSql =
bdc0: 20 7a 50 72 65 76 53 71 6c 3b 0a 20 20 20 20 20   zPrevSql;.     
bdd0: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
bde0: 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a         }.#endif.
bdf0: 20 20 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f          Tcl_SetO
be00: 62 6a 52 65 73 75 6c 74 28 70 44 62 2d 3e 69 6e  bjResult(pDb->in
be10: 74 65 72 70 2c 20 64 62 54 65 78 74 54 6f 4f 62  terp, dbTextToOb
be20: 6a 28 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  j(sqlite3_errmsg
be30: 28 70 44 62 2d 3e 64 62 29 29 29 3b 0a 20 20 20  (pDb->db)));.   
be40: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
be50: 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 65 6c  ERROR;.      }el
be60: 73 65 7b 0a 20 20 20 20 20 20 20 20 64 62 52 65  se{.        dbRe
be70: 6c 65 61 73 65 53 74 6d 74 28 70 44 62 2c 20 70  leaseStmt(pDb, p
be80: 50 72 65 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20  PreStmt, 0);.   
be90: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
bea0: 20 20 2f 2a 20 46 69 6e 69 73 68 65 64 20 2a 2f    /* Finished */
beb0: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 42 52  .  return TCL_BR
bec0: 45 41 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72  EAK;.}../*.** Fr
bed0: 65 65 20 61 6c 6c 20 72 65 73 6f 75 72 63 65 73  ee all resources
bee0: 20 63 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 20   currently held 
bef0: 62 79 20 74 68 65 20 44 62 45 76 61 6c 43 6f 6e  by the DbEvalCon
bf00: 74 65 78 74 20 73 74 72 75 63 74 75 72 65 20 70  text structure p
bf10: 61 73 73 65 64 0a 2a 2a 20 61 73 20 74 68 65 20  assed.** as the 
bf20: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20  first argument. 
bf30: 54 68 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20  There should be 
bf40: 65 78 61 63 74 6c 79 20 6f 6e 65 20 63 61 6c 6c  exactly one call
bf50: 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
bf60: 6e 0a 2a 2a 20 66 6f 72 20 65 61 63 68 20 63 61  n.** for each ca
bf70: 6c 6c 20 74 6f 20 64 62 45 76 61 6c 49 6e 69 74  ll to dbEvalInit
bf80: 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ()..*/.static vo
bf90: 69 64 20 64 62 45 76 61 6c 46 69 6e 61 6c 69 7a  id dbEvalFinaliz
bfa0: 65 28 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 20  e(DbEvalContext 
bfb0: 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 70 50  *p){.  if( p->pP
bfc0: 72 65 53 74 6d 74 20 29 7b 0a 20 20 20 20 73 71  reStmt ){.    sq
bfd0: 6c 69 74 65 33 5f 72 65 73 65 74 28 70 2d 3e 70  lite3_reset(p->p
bfe0: 50 72 65 53 74 6d 74 2d 3e 70 53 74 6d 74 29 3b  PreStmt->pStmt);
bff0: 0a 20 20 20 20 64 62 52 65 6c 65 61 73 65 53 74  .    dbReleaseSt
c000: 6d 74 28 70 2d 3e 70 44 62 2c 20 70 2d 3e 70 50  mt(p->pDb, p->pP
c010: 72 65 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20  reStmt, 0);.    
c020: 70 2d 3e 70 50 72 65 53 74 6d 74 20 3d 20 30 3b  p->pPreStmt = 0;
c030: 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 41  .  }.  if( p->pA
c040: 72 72 61 79 20 29 7b 0a 20 20 20 20 54 63 6c 5f  rray ){.    Tcl_
c050: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 2d 3e  DecrRefCount(p->
c060: 70 41 72 72 61 79 29 3b 0a 20 20 20 20 70 2d 3e  pArray);.    p->
c070: 70 41 72 72 61 79 20 3d 20 30 3b 0a 20 20 7d 0a  pArray = 0;.  }.
c080: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
c090: 6e 74 28 70 2d 3e 70 53 71 6c 29 3b 0a 20 20 64  nt(p->pSql);.  d
c0a0: 62 52 65 6c 65 61 73 65 43 6f 6c 75 6d 6e 4e 61  bReleaseColumnNa
c0b0: 6d 65 73 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  mes(p);.}../*.**
c0c0: 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
c0d0: 72 20 74 6f 20 61 20 54 63 6c 5f 4f 62 6a 20 73  r to a Tcl_Obj s
c0e0: 74 72 75 63 74 75 72 65 20 77 69 74 68 20 72 65  tructure with re
c0f0: 66 2d 63 6f 75 6e 74 20 30 20 74 68 61 74 20 63  f-count 0 that c
c100: 6f 6e 74 61 69 6e 73 0a 2a 2a 20 74 68 65 20 76  ontains.** the v
c110: 61 6c 75 65 20 66 6f 72 20 74 68 65 20 69 43 6f  alue for the iCo
c120: 6c 27 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  l'th column of t
c130: 68 65 20 72 6f 77 20 63 75 72 72 65 6e 74 6c 79  he row currently
c140: 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 0a 2a   pointed to by.*
c150: 2a 20 74 68 65 20 44 62 45 76 61 6c 43 6f 6e 74  * the DbEvalCont
c160: 65 78 74 20 73 74 72 75 63 74 75 72 65 20 70 61  ext structure pa
c170: 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73  ssed as the firs
c180: 74 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73  t argument..*/.s
c190: 74 61 74 69 63 20 54 63 6c 5f 4f 62 6a 20 2a 64  tatic Tcl_Obj *d
c1a0: 62 45 76 61 6c 43 6f 6c 75 6d 6e 56 61 6c 75 65  bEvalColumnValue
c1b0: 28 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 20 2a  (DbEvalContext *
c1c0: 70 2c 20 69 6e 74 20 69 43 6f 6c 29 7b 0a 20 20  p, int iCol){.  
c1d0: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
c1e0: 74 6d 74 20 3d 20 70 2d 3e 70 50 72 65 53 74 6d  tmt = p->pPreStm
c1f0: 74 2d 3e 70 53 74 6d 74 3b 0a 20 20 73 77 69 74  t->pStmt;.  swit
c200: 63 68 28 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ch( sqlite3_colu
c210: 6d 6e 5f 74 79 70 65 28 70 53 74 6d 74 2c 20 69  mn_type(pStmt, i
c220: 43 6f 6c 29 20 29 7b 0a 20 20 20 20 63 61 73 65  Col) ){.    case
c230: 20 53 51 4c 49 54 45 5f 42 4c 4f 42 3a 20 7b 0a   SQLITE_BLOB: {.
c240: 20 20 20 20 20 20 69 6e 74 20 62 79 74 65 73 20        int bytes 
c250: 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
c260: 5f 62 79 74 65 73 28 70 53 74 6d 74 2c 20 69 43  _bytes(pStmt, iC
c270: 6f 6c 29 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74  ol);.      const
c280: 20 63 68 61 72 20 2a 7a 42 6c 6f 62 20 3d 20 73   char *zBlob = s
c290: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c  qlite3_column_bl
c2a0: 6f 62 28 70 53 74 6d 74 2c 20 69 43 6f 6c 29 3b  ob(pStmt, iCol);
c2b0: 0a 20 20 20 20 20 20 69 66 28 20 21 7a 42 6c 6f  .      if( !zBlo
c2c0: 62 20 29 20 62 79 74 65 73 20 3d 20 30 3b 0a 20  b ) bytes = 0;. 
c2d0: 20 20 20 20 20 72 65 74 75 72 6e 20 54 63 6c 5f       return Tcl_
c2e0: 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28  NewByteArrayObj(
c2f0: 28 75 38 2a 29 7a 42 6c 6f 62 2c 20 62 79 74 65  (u8*)zBlob, byte
c300: 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  s);.    }.    ca
c310: 73 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45  se SQLITE_INTEGE
c320: 52 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  R: {.      sqlit
c330: 65 5f 69 6e 74 36 34 20 76 20 3d 20 73 71 6c 69  e_int64 v = sqli
c340: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34  te3_column_int64
c350: 28 70 53 74 6d 74 2c 20 69 43 6f 6c 29 3b 0a 20  (pStmt, iCol);. 
c360: 20 20 20 20 20 69 66 28 20 76 3e 3d 2d 32 31 34       if( v>=-214
c370: 37 34 38 33 36 34 37 20 26 26 20 76 3c 3d 32 31  7483647 && v<=21
c380: 34 37 34 38 33 36 34 37 20 29 7b 0a 20 20 20 20  47483647 ){.    
c390: 20 20 20 20 72 65 74 75 72 6e 20 54 63 6c 5f 4e      return Tcl_N
c3a0: 65 77 49 6e 74 4f 62 6a 28 28 69 6e 74 29 76 29  ewIntObj((int)v)
c3b0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
c3c0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 63         return Tc
c3d0: 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28  l_NewWideIntObj(
c3e0: 76 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  v);.      }.    
c3f0: 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
c400: 45 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20  E_FLOAT: {.     
c410: 20 72 65 74 75 72 6e 20 54 63 6c 5f 4e 65 77 44   return Tcl_NewD
c420: 6f 75 62 6c 65 4f 62 6a 28 73 71 6c 69 74 65 33  oubleObj(sqlite3
c430: 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 28 70  _column_double(p
c440: 53 74 6d 74 2c 20 69 43 6f 6c 29 29 3b 0a 20 20  Stmt, iCol));.  
c450: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
c460: 49 54 45 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20  ITE_NULL: {.    
c470: 20 20 72 65 74 75 72 6e 20 64 62 54 65 78 74 54    return dbTextT
c480: 6f 4f 62 6a 28 70 2d 3e 70 44 62 2d 3e 7a 4e 75  oObj(p->pDb->zNu
c490: 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ll);.    }.  }..
c4a0: 20 20 72 65 74 75 72 6e 20 64 62 54 65 78 74 54    return dbTextT
c4b0: 6f 4f 62 6a 28 28 63 68 61 72 20 2a 29 73 71 6c  oObj((char *)sql
c4c0: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
c4d0: 28 70 53 74 6d 74 2c 20 69 43 6f 6c 29 29 3b 0a  (pStmt, iCol));.
c4e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 75 73 69 6e  }../*.** If usin
c4f0: 67 20 54 63 6c 20 76 65 72 73 69 6f 6e 20 38 2e  g Tcl version 8.
c500: 36 20 6f 72 20 67 72 65 61 74 65 72 2c 20 75 73  6 or greater, us
c510: 65 20 74 68 65 20 4e 52 20 66 75 6e 63 74 69 6f  e the NR functio
c520: 6e 73 20 74 6f 20 61 76 6f 69 64 0a 2a 2a 20 72  ns to avoid.** r
c530: 65 63 75 72 73 69 76 65 20 65 76 61 6c 75 74 69  ecursive evaluti
c540: 6f 6e 20 6f 66 20 73 63 72 69 70 74 73 20 62 79  on of scripts by
c550: 20 74 68 65 20 5b 64 62 20 65 76 61 6c 5d 20 61   the [db eval] a
c560: 6e 64 20 5b 64 62 20 74 72 61 6e 73 5d 0a 2a 2a  nd [db trans].**
c570: 20 63 6f 6d 6d 61 6e 64 73 2e 20 45 76 65 6e 20   commands. Even 
c580: 69 66 20 74 68 65 20 68 65 61 64 65 72 73 20 75  if the headers u
c590: 73 65 64 20 77 68 69 6c 65 20 63 6f 6d 70 69 6c  sed while compil
c5a0: 69 6e 67 20 74 68 65 20 65 78 74 65 6e 73 69 6f  ing the extensio
c5b0: 6e 0a 2a 2a 20 61 72 65 20 38 2e 36 20 6f 72 20  n.** are 8.6 or 
c5c0: 6e 65 77 65 72 2c 20 74 68 65 20 63 6f 64 65 20  newer, the code 
c5d0: 73 74 69 6c 6c 20 74 65 73 74 73 20 74 68 65 20  still tests the 
c5e0: 54 63 6c 20 76 65 72 73 69 6f 6e 20 61 74 20 72  Tcl version at r
c5f0: 75 6e 74 69 6d 65 2e 0a 2a 2a 20 54 68 69 73 20  untime..** This 
c600: 61 6c 6c 6f 77 73 20 73 74 75 62 73 2d 65 6e 61  allows stubs-ena
c610: 62 6c 65 64 20 62 75 69 6c 64 73 20 74 6f 20 62  bled builds to b
c620: 65 20 75 73 65 64 20 77 69 74 68 20 6f 6c 64 65  e used with olde
c630: 72 20 54 63 6c 20 6c 69 62 72 61 72 69 65 73 2e  r Tcl libraries.
c640: 0a 2a 2f 0a 23 69 66 20 54 43 4c 5f 4d 41 4a 4f  .*/.#if TCL_MAJO
c650: 52 5f 56 45 52 53 49 4f 4e 3e 38 20 7c 7c 20 28  R_VERSION>8 || (
c660: 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f  TCL_MAJOR_VERSIO
c670: 4e 3d 3d 38 20 26 26 20 54 43 4c 5f 4d 49 4e 4f  N==8 && TCL_MINO
c680: 52 5f 56 45 52 53 49 4f 4e 3e 3d 36 29 0a 23 20  R_VERSION>=6).# 
c690: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 54 43  define SQLITE_TC
c6a0: 4c 5f 4e 52 45 20 31 0a 73 74 61 74 69 63 20 69  L_NRE 1.static i
c6b0: 6e 74 20 44 62 55 73 65 4e 72 65 28 76 6f 69 64  nt DbUseNre(void
c6c0: 29 7b 0a 20 20 69 6e 74 20 6d 61 6a 6f 72 2c 20  ){.  int major, 
c6d0: 6d 69 6e 6f 72 3b 0a 20 20 54 63 6c 5f 47 65 74  minor;.  Tcl_Get
c6e0: 56 65 72 73 69 6f 6e 28 26 6d 61 6a 6f 72 2c 20  Version(&major, 
c6f0: 26 6d 69 6e 6f 72 2c 20 30 2c 20 30 29 3b 0a 20  &minor, 0, 0);. 
c700: 20 72 65 74 75 72 6e 28 20 28 6d 61 6a 6f 72 3d   return( (major=
c710: 3d 38 20 26 26 20 6d 69 6e 6f 72 3e 3d 36 29 20  =8 && minor>=6) 
c720: 7c 7c 20 6d 61 6a 6f 72 3e 38 20 29 3b 0a 7d 0a  || major>8 );.}.
c730: 23 65 6c 73 65 0a 2f 2a 20 0a 2a 2a 20 43 6f 6d  #else./* .** Com
c740: 70 69 6c 69 6e 67 20 75 73 69 6e 67 20 68 65 61  piling using hea
c750: 64 65 72 73 20 65 61 72 6c 69 65 72 20 74 68 61  ders earlier tha
c760: 6e 20 38 2e 36 2e 20 49 6e 20 74 68 69 73 20 63  n 8.6. In this c
c770: 61 73 65 20 4e 52 20 63 61 6e 6e 6f 74 20 62 65  ase NR cannot be
c780: 0a 2a 2a 20 75 73 65 64 2c 20 73 6f 20 44 62 55  .** used, so DbU
c790: 73 65 4e 72 65 28 29 20 74 6f 20 61 6c 77 61 79  seNre() to alway
c7a0: 73 20 72 65 74 75 72 6e 20 7a 65 72 6f 2e 20 41  s return zero. A
c7b0: 64 64 20 23 64 65 66 69 6e 65 73 20 66 6f 72 20  dd #defines for 
c7c0: 74 68 65 20 6f 74 68 65 72 0a 2a 2a 20 54 63 6c  the other.** Tcl
c7d0: 5f 4e 52 78 78 78 28 29 20 66 75 6e 63 74 69 6f  _NRxxx() functio
c7e0: 6e 73 20 74 6f 20 70 72 65 76 65 6e 74 20 74 68  ns to prevent th
c7f0: 65 6d 20 66 72 6f 6d 20 63 61 75 73 69 6e 67 20  em from causing 
c800: 63 6f 6d 70 69 6c 61 74 69 6f 6e 20 65 72 72 6f  compilation erro
c810: 72 73 2c 0a 2a 2a 20 65 76 65 6e 20 74 68 6f 75  rs,.** even thou
c820: 67 68 20 74 68 65 20 6f 6e 6c 79 20 69 6e 76 6f  gh the only invo
c830: 63 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 6d 20  cations of them 
c840: 61 72 65 20 77 69 74 68 69 6e 20 63 6f 6e 64 69  are within condi
c850: 74 69 6f 6e 61 6c 20 62 6c 6f 63 6b 73 20 0a 2a  tional blocks .*
c860: 2a 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a  * of the form:.*
c870: 2a 0a 2a 2a 20 20 20 69 66 28 20 44 62 55 73 65  *.**   if( DbUse
c880: 4e 72 65 28 29 20 29 20 7b 20 2e 2e 2e 20 7d 0a  Nre() ) { ... }.
c890: 2a 2f 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49  */.# define SQLI
c8a0: 54 45 5f 54 43 4c 5f 4e 52 45 20 30 0a 23 20 64  TE_TCL_NRE 0.# d
c8b0: 65 66 69 6e 65 20 44 62 55 73 65 4e 72 65 28 29  efine DbUseNre()
c8c0: 20 30 0a 23 20 64 65 66 69 6e 65 20 54 63 6c 5f   0.# define Tcl_
c8d0: 4e 52 41 64 64 43 61 6c 6c 62 61 63 6b 28 61 2c  NRAddCallback(a,
c8e0: 62 2c 63 2c 64 2c 65 2c 66 29 20 30 0a 23 20 64  b,c,d,e,f) 0.# d
c8f0: 65 66 69 6e 65 20 54 63 6c 5f 4e 52 45 76 61 6c  efine Tcl_NREval
c900: 4f 62 6a 28 61 2c 62 2c 63 29 20 30 0a 23 20 64  Obj(a,b,c) 0.# d
c910: 65 66 69 6e 65 20 54 63 6c 5f 4e 52 43 72 65 61  efine Tcl_NRCrea
c920: 74 65 43 6f 6d 6d 61 6e 64 28 61 2c 62 2c 63 2c  teCommand(a,b,c,
c930: 64 2c 65 2c 66 29 20 30 0a 23 65 6e 64 69 66 0a  d,e,f) 0.#endif.
c940: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
c950: 74 69 6f 6e 20 69 73 20 70 61 72 74 20 6f 66 20  tion is part of 
c960: 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  the implementati
c970: 6f 6e 20 6f 66 20 74 68 65 20 63 6f 6d 6d 61 6e  on of the comman
c980: 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 24 64 62 20 65  d:.**.**   $db e
c990: 76 61 6c 20 53 51 4c 20 3f 41 52 52 41 59 4e 41  val SQL ?ARRAYNA
c9a0: 4d 45 3f 20 53 43 52 49 50 54 0a 2a 2f 0a 73 74  ME? SCRIPT.*/.st
c9b0: 61 74 69 63 20 69 6e 74 20 44 62 45 76 61 6c 4e  atic int DbEvalN
c9c0: 65 78 74 43 6d 64 28 0a 20 20 43 6c 69 65 6e 74  extCmd(.  Client
c9d0: 44 61 74 61 20 64 61 74 61 5b 5d 2c 20 20 20 20  Data data[],    
c9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
c9f0: 2a 20 64 61 74 61 5b 30 5d 20 69 73 20 74 68 65  * data[0] is the
ca00: 20 28 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 2a   (DbEvalContext*
ca10: 29 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ) */.  Tcl_Inter
ca20: 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 20 20  p *interp,      
ca30: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
ca40: 63 6c 20 69 6e 74 65 72 70 72 65 74 65 72 20 2a  cl interpreter *
ca50: 2f 0a 20 20 69 6e 74 20 72 65 73 75 6c 74 20 20  /.  int result  
ca60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca70: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
ca80: 6c 74 20 73 6f 20 66 61 72 20 2a 2f 0a 29 7b 0a  lt so far */.){.
ca90: 20 20 69 6e 74 20 72 63 20 3d 20 72 65 73 75 6c    int rc = resul
caa0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
cab0: 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
cac0: 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54   code */..  /* T
cad0: 68 65 20 66 69 72 73 74 20 65 6c 65 6d 65 6e 74  he first element
cae0: 20 6f 66 20 74 68 65 20 64 61 74 61 5b 5d 20 61   of the data[] a
caf0: 72 72 61 79 20 69 73 20 61 20 70 6f 69 6e 74 65  rray is a pointe
cb00: 72 20 74 6f 20 61 20 44 62 45 76 61 6c 43 6f 6e  r to a DbEvalCon
cb10: 74 65 78 74 0a 20 20 2a 2a 20 73 74 72 75 63 74  text.  ** struct
cb20: 75 72 65 20 61 6c 6c 6f 63 61 74 65 64 20 75 73  ure allocated us
cb30: 69 6e 67 20 54 63 6c 5f 41 6c 6c 6f 63 28 29 2e  ing Tcl_Alloc().
cb40: 20 54 68 65 20 73 65 63 6f 6e 64 20 65 6c 65 6d   The second elem
cb50: 65 6e 74 20 6f 66 20 64 61 74 61 5b 5d 0a 20 20  ent of data[].  
cb60: 2a 2a 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  ** is a pointer 
cb70: 74 6f 20 61 20 54 63 6c 5f 4f 62 6a 20 63 6f 6e  to a Tcl_Obj con
cb80: 74 61 69 6e 69 6e 67 20 74 68 65 20 73 63 72 69  taining the scri
cb90: 70 74 20 74 6f 20 72 75 6e 20 66 6f 72 20 65 61  pt to run for ea
cba0: 63 68 20 72 6f 77 0a 20 20 2a 2a 20 72 65 74 75  ch row.  ** retu
cbb0: 72 6e 65 64 20 62 79 20 74 68 65 20 71 75 65 72  rned by the quer
cbc0: 69 65 73 20 65 6e 63 61 70 73 75 6c 61 74 65 64  ies encapsulated
cbd0: 20 69 6e 20 64 61 74 61 5b 30 5d 2e 20 2a 2f 0a   in data[0]. */.
cbe0: 20 20 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 20    DbEvalContext 
cbf0: 2a 70 20 3d 20 28 44 62 45 76 61 6c 43 6f 6e 74  *p = (DbEvalCont
cc00: 65 78 74 20 2a 29 64 61 74 61 5b 30 5d 3b 0a 20  ext *)data[0];. 
cc10: 20 54 63 6c 5f 4f 62 6a 20 2a 70 53 63 72 69 70   Tcl_Obj *pScrip
cc20: 74 20 3d 20 28 54 63 6c 5f 4f 62 6a 20 2a 29 64  t = (Tcl_Obj *)d
cc30: 61 74 61 5b 31 5d 3b 0a 20 20 54 63 6c 5f 4f 62  ata[1];.  Tcl_Ob
cc40: 6a 20 2a 70 41 72 72 61 79 20 3d 20 70 2d 3e 70  j *pArray = p->p
cc50: 41 72 72 61 79 3b 0a 0a 20 20 77 68 69 6c 65 28  Array;..  while(
cc60: 20 28 72 63 3d 3d 54 43 4c 5f 4f 4b 20 7c 7c 20   (rc==TCL_OK || 
cc70: 72 63 3d 3d 54 43 4c 5f 43 4f 4e 54 49 4e 55 45  rc==TCL_CONTINUE
cc80: 29 20 26 26 20 54 43 4c 5f 4f 4b 3d 3d 28 72 63  ) && TCL_OK==(rc
cc90: 20 3d 20 64 62 45 76 61 6c 53 74 65 70 28 70 29   = dbEvalStep(p)
cca0: 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  ) ){.    int i;.
ccb0: 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20      int nCol;.  
ccc0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 61 70 43 6f    Tcl_Obj **apCo
ccd0: 6c 4e 61 6d 65 3b 0a 20 20 20 20 64 62 45 76 61  lName;.    dbEva
cce0: 6c 52 6f 77 49 6e 66 6f 28 70 2c 20 26 6e 43 6f  lRowInfo(p, &nCo
ccf0: 6c 2c 20 26 61 70 43 6f 6c 4e 61 6d 65 29 3b 0a  l, &apColName);.
cd00: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
cd10: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
cd20: 20 54 63 6c 5f 4f 62 6a 20 2a 70 56 61 6c 20 3d   Tcl_Obj *pVal =
cd30: 20 64 62 45 76 61 6c 43 6f 6c 75 6d 6e 56 61 6c   dbEvalColumnVal
cd40: 75 65 28 70 2c 20 69 29 3b 0a 20 20 20 20 20 20  ue(p, i);.      
cd50: 69 66 28 20 70 41 72 72 61 79 3d 3d 30 20 29 7b  if( pArray==0 ){
cd60: 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a  .        Tcl_Obj
cd70: 53 65 74 56 61 72 32 28 69 6e 74 65 72 70 2c 20  SetVar2(interp, 
cd80: 61 70 43 6f 6c 4e 61 6d 65 5b 69 5d 2c 20 30 2c  apColName[i], 0,
cd90: 20 70 56 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20   pVal, 0);.     
cda0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
cdb0: 54 63 6c 5f 4f 62 6a 53 65 74 56 61 72 32 28 69  Tcl_ObjSetVar2(i
cdc0: 6e 74 65 72 70 2c 20 70 41 72 72 61 79 2c 20 61  nterp, pArray, a
cdd0: 70 43 6f 6c 4e 61 6d 65 5b 69 5d 2c 20 70 56 61  pColName[i], pVa
cde0: 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  l, 0);.      }. 
cdf0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65     }..    /* The
ce00: 20 72 65 71 75 69 72 65 64 20 69 6e 74 65 72 70   required interp
ce10: 72 65 74 65 72 20 76 61 72 69 61 62 6c 65 73 20  reter variables 
ce20: 61 72 65 20 6e 6f 77 20 70 6f 70 75 6c 61 74 65  are now populate
ce30: 64 20 77 69 74 68 20 74 68 65 20 64 61 74 61 20  d with the data 
ce40: 0a 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65  .    ** from the
ce50: 20 63 75 72 72 65 6e 74 20 72 6f 77 2e 20 49 66   current row. If
ce60: 20 75 73 69 6e 67 20 4e 52 45 2c 20 73 63 68 65   using NRE, sche
ce70: 64 75 6c 65 20 63 61 6c 6c 62 61 63 6b 73 20 74  dule callbacks t
ce80: 6f 20 65 76 61 6c 75 61 74 65 0a 20 20 20 20 2a  o evaluate.    *
ce90: 2a 20 73 63 72 69 70 74 20 70 53 63 72 69 70 74  * script pScript
cea0: 2c 20 74 68 65 6e 20 74 6f 20 69 6e 76 6f 6b 65  , then to invoke
ceb0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   this function a
cec0: 67 61 69 6e 20 74 6f 20 66 65 74 63 68 20 74 68  gain to fetch th
ced0: 65 20 6e 65 78 74 0a 20 20 20 20 2a 2a 20 72 6f  e next.    ** ro
cee0: 77 20 28 6f 72 20 63 6c 65 61 6e 20 75 70 20 69  w (or clean up i
cef0: 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65  f there is no ne
cf00: 78 74 20 72 6f 77 20 6f 72 20 74 68 65 20 73 63  xt row or the sc
cf10: 72 69 70 74 20 74 68 72 6f 77 73 20 61 6e 0a 20  ript throws an. 
cf20: 20 20 20 2a 2a 20 65 78 63 65 70 74 69 6f 6e 29     ** exception)
cf30: 2e 20 41 66 74 65 72 20 73 63 68 65 64 75 6c 69  . After scheduli
cf40: 6e 67 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 73  ng the callbacks
cf50: 2c 20 72 65 74 75 72 6e 20 63 6f 6e 74 72 6f 6c  , return control
cf60: 20 74 6f 20 74 68 65 20 0a 20 20 20 20 2a 2a 20   to the .    ** 
cf70: 63 61 6c 6c 65 72 2e 0a 20 20 20 20 2a 2a 0a 20  caller..    **. 
cf80: 20 20 20 2a 2a 20 49 66 20 6e 6f 74 20 75 73 69     ** If not usi
cf90: 6e 67 20 4e 52 45 2c 20 65 76 61 6c 75 61 74 65  ng NRE, evaluate
cfa0: 20 70 53 63 72 69 70 74 20 64 69 72 65 63 74 6c   pScript directl
cfb0: 79 20 61 6e 64 20 63 6f 6e 74 69 6e 75 65 20 77  y and continue w
cfc0: 69 74 68 20 74 68 65 0a 20 20 20 20 2a 2a 20 6e  ith the.    ** n
cfd0: 65 78 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66  ext iteration of
cfe0: 20 74 68 69 73 20 77 68 69 6c 65 28 2e 2e 2e 29   this while(...)
cff0: 20 6c 6f 6f 70 2e 20 20 2a 2f 0a 20 20 20 20 69   loop.  */.    i
d000: 66 28 20 44 62 55 73 65 4e 72 65 28 29 20 29 7b  f( DbUseNre() ){
d010: 0a 20 20 20 20 20 20 54 63 6c 5f 4e 52 41 64 64  .      Tcl_NRAdd
d020: 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c  Callback(interp,
d030: 20 44 62 45 76 61 6c 4e 65 78 74 43 6d 64 2c 20   DbEvalNextCmd, 
d040: 28 76 6f 69 64 2a 29 70 2c 20 28 76 6f 69 64 2a  (void*)p, (void*
d050: 29 70 53 63 72 69 70 74 2c 20 30 2c 20 30 29 3b  )pScript, 0, 0);
d060: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 63  .      return Tc
d070: 6c 5f 4e 52 45 76 61 6c 4f 62 6a 28 69 6e 74 65  l_NREvalObj(inte
d080: 72 70 2c 20 70 53 63 72 69 70 74 2c 20 30 29 3b  rp, pScript, 0);
d090: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
d0a0: 20 20 72 63 20 3d 20 54 63 6c 5f 45 76 61 6c 4f    rc = Tcl_EvalO
d0b0: 62 6a 45 78 28 69 6e 74 65 72 70 2c 20 70 53 63  bjEx(interp, pSc
d0c0: 72 69 70 74 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  ript, 0);.    }.
d0d0: 20 20 7d 0a 0a 20 20 54 63 6c 5f 44 65 63 72 52    }..  Tcl_DecrR
d0e0: 65 66 43 6f 75 6e 74 28 70 53 63 72 69 70 74 29  efCount(pScript)
d0f0: 3b 0a 20 20 64 62 45 76 61 6c 46 69 6e 61 6c 69  ;.  dbEvalFinali
d100: 7a 65 28 70 29 3b 0a 20 20 54 63 6c 5f 46 72 65  ze(p);.  Tcl_Fre
d110: 65 28 28 63 68 61 72 20 2a 29 70 29 3b 0a 0a 20  e((char *)p);.. 
d120: 20 69 66 28 20 72 63 3d 3d 54 43 4c 5f 4f 4b 20   if( rc==TCL_OK 
d130: 7c 7c 20 72 63 3d 3d 54 43 4c 5f 42 52 45 41 4b  || rc==TCL_BREAK
d140: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 52 65 73 65   ){.    Tcl_Rese
d150: 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b  tResult(interp);
d160: 0a 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 4f 4b  .    rc = TCL_OK
d170: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
d180: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
d190: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
d1a0: 64 20 62 79 20 74 68 65 20 69 6d 70 6c 65 6d 65  d by the impleme
d1b0: 6e 74 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 20  ntations of the 
d1c0: 66 6f 6c 6c 6f 77 69 6e 67 20 64 61 74 61 62 61  following databa
d1d0: 73 65 20 0a 2a 2a 20 68 61 6e 64 6c 65 20 73 75  se .** handle su
d1e0: 62 2d 63 6f 6d 6d 61 6e 64 73 3a 0a 2a 2a 0a 2a  b-commands:.**.*
d1f0: 2a 20 20 20 24 64 62 20 75 70 64 61 74 65 5f 68  *   $db update_h
d200: 6f 6f 6b 20 3f 53 43 52 49 50 54 3f 0a 2a 2a 20  ook ?SCRIPT?.** 
d210: 20 20 24 64 62 20 77 61 6c 5f 68 6f 6f 6b 20 3f    $db wal_hook ?
d220: 53 43 52 49 50 54 3f 0a 2a 2a 20 20 20 24 64 62  SCRIPT?.**   $db
d230: 20 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 20 3f 53 43   commit_hook ?SC
d240: 52 49 50 54 3f 0a 2a 2a 20 20 20 24 64 62 20 70  RIPT?.**   $db p
d250: 72 65 75 70 64 61 74 65 20 68 6f 6f 6b 20 3f 53  reupdate hook ?S
d260: 43 52 49 50 54 3f 0a 2a 2f 0a 73 74 61 74 69 63  CRIPT?.*/.static
d270: 20 76 6f 69 64 20 44 62 48 6f 6f 6b 43 6d 64 28   void DbHookCmd(
d280: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
d290: 6e 74 65 72 70 2c 20 20 20 20 20 20 20 20 20 20  nterp,          
d2a0: 20 20 20 2f 2a 20 54 63 6c 20 69 6e 74 65 72 70     /* Tcl interp
d2b0: 72 65 74 65 72 20 2a 2f 0a 20 20 53 71 6c 69 74  reter */.  Sqlit
d2c0: 65 44 62 20 2a 70 44 62 2c 20 20 20 20 20 20 20  eDb *pDb,       
d2d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
d2e0: 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f  tabase handle */
d2f0: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 41 72 67  .  Tcl_Obj *pArg
d300: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
d310: 20 20 20 2f 2a 20 53 43 52 49 50 54 20 61 72 67     /* SCRIPT arg
d320: 75 6d 65 6e 74 20 28 6f 72 20 4e 55 4c 4c 29 20  ument (or NULL) 
d330: 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 70  */.  Tcl_Obj **p
d340: 70 48 6f 6f 6b 20 20 20 20 20 20 20 20 20 20 20  pHook           
d350: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
d360: 74 6f 20 6d 65 6d 62 65 72 20 6f 66 20 53 71 6c  to member of Sql
d370: 69 74 65 44 62 20 2a 2f 0a 29 7b 0a 20 20 73 71  iteDb */.){.  sq
d380: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 44 62 2d  lite3 *db = pDb-
d390: 3e 64 62 3b 0a 0a 20 20 69 66 28 20 2a 70 70 48  >db;..  if( *ppH
d3a0: 6f 6f 6b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53  ook ){.    Tcl_S
d3b0: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
d3c0: 72 70 2c 20 2a 70 70 48 6f 6f 6b 29 3b 0a 20 20  rp, *ppHook);.  
d3d0: 20 20 69 66 28 20 70 41 72 67 20 29 7b 0a 20 20    if( pArg ){.  
d3e0: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
d3f0: 6f 75 6e 74 28 2a 70 70 48 6f 6f 6b 29 3b 0a 20  ount(*ppHook);. 
d400: 20 20 20 20 20 2a 70 70 48 6f 6f 6b 20 3d 20 30       *ppHook = 0
d410: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
d420: 28 20 70 41 72 67 20 29 7b 0a 20 20 20 20 61 73  ( pArg ){.    as
d430: 73 65 72 74 28 20 21 28 2a 70 70 48 6f 6f 6b 29  sert( !(*ppHook)
d440: 20 29 3b 0a 20 20 20 20 69 66 28 20 54 63 6c 5f   );.    if( Tcl_
d450: 47 65 74 43 68 61 72 4c 65 6e 67 74 68 28 70 41  GetCharLength(pA
d460: 72 67 29 3e 30 20 29 7b 0a 20 20 20 20 20 20 2a  rg)>0 ){.      *
d470: 70 70 48 6f 6f 6b 20 3d 20 70 41 72 67 3b 0a 20  ppHook = pArg;. 
d480: 20 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66       Tcl_IncrRef
d490: 43 6f 75 6e 74 28 2a 70 70 48 6f 6f 6b 29 3b 0a  Count(*ppHook);.
d4a0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 64 65      }.  }..#ifde
d4b0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
d4c0: 50 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b 0a 20  PREUPDATE_HOOK. 
d4d0: 20 73 71 6c 69 74 65 33 5f 70 72 65 75 70 64 61   sqlite3_preupda
d4e0: 74 65 5f 68 6f 6f 6b 28 64 62 2c 20 28 70 44 62  te_hook(db, (pDb
d4f0: 2d 3e 70 50 72 65 55 70 64 61 74 65 48 6f 6f 6b  ->pPreUpdateHook
d500: 3f 44 62 50 72 65 55 70 64 61 74 65 48 61 6e 64  ?DbPreUpdateHand
d510: 6c 65 72 3a 30 29 2c 20 70 44 62 29 3b 0a 23 65  ler:0), pDb);.#e
d520: 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 75  ndif.  sqlite3_u
d530: 70 64 61 74 65 5f 68 6f 6f 6b 28 64 62 2c 20 28  pdate_hook(db, (
d540: 70 44 62 2d 3e 70 55 70 64 61 74 65 48 6f 6f 6b  pDb->pUpdateHook
d550: 3f 44 62 55 70 64 61 74 65 48 61 6e 64 6c 65 72  ?DbUpdateHandler
d560: 3a 30 29 2c 20 70 44 62 29 3b 0a 20 20 73 71 6c  :0), pDb);.  sql
d570: 69 74 65 33 5f 72 6f 6c 6c 62 61 63 6b 5f 68 6f  ite3_rollback_ho
d580: 6f 6b 28 64 62 2c 20 28 70 44 62 2d 3e 70 52 6f  ok(db, (pDb->pRo
d590: 6c 6c 62 61 63 6b 48 6f 6f 6b 3f 44 62 52 6f 6c  llbackHook?DbRol
d5a0: 6c 62 61 63 6b 48 61 6e 64 6c 65 72 3a 30 29 2c  lbackHandler:0),
d5b0: 20 70 44 62 29 3b 0a 20 20 73 71 6c 69 74 65 33   pDb);.  sqlite3
d5c0: 5f 77 61 6c 5f 68 6f 6f 6b 28 64 62 2c 20 28 70  _wal_hook(db, (p
d5d0: 44 62 2d 3e 70 57 61 6c 48 6f 6f 6b 3f 44 62 57  Db->pWalHook?DbW
d5e0: 61 6c 48 61 6e 64 6c 65 72 3a 30 29 2c 20 70 44  alHandler:0), pD
d5f0: 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  b);.}../*.** The
d600: 20 22 73 71 6c 69 74 65 22 20 63 6f 6d 6d 61 6e   "sqlite" comman
d610: 64 20 62 65 6c 6f 77 20 63 72 65 61 74 65 73 20  d below creates 
d620: 61 20 6e 65 77 20 54 63 6c 20 63 6f 6d 6d 61 6e  a new Tcl comman
d630: 64 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20 63 6f  d for each.** co
d640: 6e 6e 65 63 74 69 6f 6e 20 69 74 20 6f 70 65 6e  nnection it open
d650: 73 20 74 6f 20 61 6e 20 53 51 4c 69 74 65 20 64  s to an SQLite d
d660: 61 74 61 62 61 73 65 2e 20 20 54 68 69 73 20 72  atabase.  This r
d670: 6f 75 74 69 6e 65 20 69 73 20 69 6e 76 6f 6b 65  outine is invoke
d680: 64 0a 2a 2a 20 77 68 65 6e 65 76 65 72 20 6f 6e  d.** whenever on
d690: 65 20 6f 66 20 74 68 6f 73 65 20 63 6f 6e 6e 65  e of those conne
d6a0: 63 74 69 6f 6e 2d 73 70 65 63 69 66 69 63 20 63  ction-specific c
d6b0: 6f 6d 6d 61 6e 64 73 20 69 73 20 65 78 65 63 75  ommands is execu
d6c0: 74 65 64 0a 2a 2a 20 69 6e 20 54 63 6c 2e 20 20  ted.** in Tcl.  
d6d0: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20  For example, if 
d6e0: 79 6f 75 20 72 75 6e 20 54 63 6c 20 63 6f 64 65  you run Tcl code
d6f0: 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a   like this:.**.*
d700: 2a 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 20  *       sqlite3 
d710: 64 62 31 20 20 22 6d 79 5f 64 61 74 61 62 61 73  db1  "my_databas
d720: 65 22 0a 2a 2a 20 20 20 20 20 20 20 64 62 31 20  e".**       db1 
d730: 63 6c 6f 73 65 0a 2a 2a 0a 2a 2a 20 54 68 65 20  close.**.** The 
d740: 66 69 72 73 74 20 63 6f 6d 6d 61 6e 64 20 6f 70  first command op
d750: 65 6e 73 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e  ens a connection
d760: 20 74 6f 20 74 68 65 20 22 6d 79 5f 64 61 74 61   to the "my_data
d770: 62 61 73 65 22 20 64 61 74 61 62 61 73 65 0a 2a  base" database.*
d780: 2a 20 61 6e 64 20 63 61 6c 6c 73 20 74 68 61 74  * and calls that
d790: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 22 64 62 31   connection "db1
d7a0: 22 2e 20 20 54 68 65 20 73 65 63 6f 6e 64 20 63  ".  The second c
d7b0: 6f 6d 6d 61 6e 64 20 63 61 75 73 65 73 20 74 68  ommand causes th
d7c0: 69 73 0a 2a 2a 20 73 75 62 72 6f 75 74 69 6e 65  is.** subroutine
d7d0: 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 2e 0a   to be invoked..
d7e0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 44 62  */.static int Db
d7f0: 4f 62 6a 43 6d 64 28 76 6f 69 64 20 2a 63 64 2c  ObjCmd(void *cd,
d800: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
d810: 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 54 63  erp, int objc,Tc
d820: 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 2a 6f 62 6a  l_Obj *const*obj
d830: 76 29 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a  v){.  SqliteDb *
d840: 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62 2a  pDb = (SqliteDb*
d850: 29 63 64 3b 0a 20 20 69 6e 74 20 63 68 6f 69 63  )cd;.  int choic
d860: 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 54 43  e;.  int rc = TC
d870: 4c 5f 4f 4b 3b 0a 20 20 73 74 61 74 69 63 20 63  L_OK;.  static c
d880: 6f 6e 73 74 20 63 68 61 72 20 2a 44 42 5f 73 74  onst char *DB_st
d890: 72 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 22 61 75  rs[] = {.    "au
d8a0: 74 68 6f 72 69 7a 65 72 22 2c 20 20 20 20 20 20  thorizer",      
d8b0: 20 20 20 22 62 61 63 6b 75 70 22 2c 20 20 20 20     "backup",    
d8c0: 20 20 20 20 20 20 20 20 22 62 75 73 79 22 2c 0a          "busy",.
d8d0: 20 20 20 20 22 63 61 63 68 65 22 2c 20 20 20 20      "cache",    
d8e0: 20 20 20 20 20 20 20 20 20 20 22 63 68 61 6e 67            "chang
d8f0: 65 73 22 2c 20 20 20 20 20 20 20 20 20 20 20 22  es",           "
d900: 63 6c 6f 73 65 22 2c 0a 20 20 20 20 22 63 6f 6c  close",.    "col
d910: 6c 61 74 65 22 2c 20 20 20 20 20 20 20 20 20 20  late",          
d920: 20 20 22 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65    "collation_nee
d930: 64 65 64 22 2c 20 20 22 63 6f 6d 6d 69 74 5f 68  ded",  "commit_h
d940: 6f 6f 6b 22 2c 0a 20 20 20 20 22 63 6f 6d 70 6c  ook",.    "compl
d950: 65 74 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ete",           
d960: 22 63 6f 70 79 22 2c 20 20 20 20 20 20 20 20 20  "copy",         
d970: 20 20 20 20 20 22 65 6e 61 62 6c 65 5f 6c 6f 61       "enable_loa
d980: 64 5f 65 78 74 65 6e 73 69 6f 6e 22 2c 0a 20 20  d_extension",.  
d990: 20 20 22 65 72 72 6f 72 63 6f 64 65 22 2c 20 20    "errorcode",  
d9a0: 20 20 20 20 20 20 20 20 22 65 76 61 6c 22 2c 20          "eval", 
d9b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 65 78               "ex
d9c0: 69 73 74 73 22 2c 0a 20 20 20 20 22 66 75 6e 63  ists",.    "func
d9d0: 74 69 6f 6e 22 2c 20 20 20 20 20 20 20 20 20 20  tion",          
d9e0: 20 22 69 6e 63 72 62 6c 6f 62 22 2c 20 20 20 20   "incrblob",    
d9f0: 20 20 20 20 20 20 22 69 6e 74 65 72 72 75 70 74        "interrupt
da00: 22 2c 0a 20 20 20 20 22 6c 61 73 74 5f 69 6e 73  ",.    "last_ins
da10: 65 72 74 5f 72 6f 77 69 64 22 2c 20 20 22 6e 75  ert_rowid",  "nu
da20: 6c 6c 76 61 6c 75 65 22 2c 20 20 20 20 20 20 20  llvalue",       
da30: 20 20 22 6f 6e 65 63 6f 6c 75 6d 6e 22 2c 0a 20    "onecolumn",. 
da40: 20 20 20 22 70 72 65 75 70 64 61 74 65 22 2c 20     "preupdate", 
da50: 20 20 20 20 20 20 20 20 20 22 70 72 6f 66 69 6c           "profil
da60: 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 22 70  e",           "p
da70: 72 6f 67 72 65 73 73 22 2c 0a 20 20 20 20 22 72  rogress",.    "r
da80: 65 6b 65 79 22 2c 20 20 20 20 20 20 20 20 20 20  ekey",          
da90: 20 20 20 20 22 72 65 73 74 6f 72 65 22 2c 20 20      "restore",  
daa0: 20 20 20 20 20 20 20 20 20 22 72 6f 6c 6c 62 61           "rollba
dab0: 63 6b 5f 68 6f 6f 6b 22 2c 0a 20 20 20 20 22 73  ck_hook",.    "s
dac0: 74 61 74 75 73 22 2c 20 20 20 20 20 20 20 20 20  tatus",         
dad0: 20 20 20 20 22 74 69 6d 65 6f 75 74 22 2c 20 20      "timeout",  
dae0: 20 20 20 20 20 20 20 20 20 22 74 6f 74 61 6c 5f           "total_
daf0: 63 68 61 6e 67 65 73 22 2c 0a 20 20 20 20 22 74  changes",.    "t
db00: 72 61 63 65 22 2c 20 20 20 20 20 20 20 20 20 20  race",          
db10: 20 20 20 20 22 74 72 61 6e 73 61 63 74 69 6f 6e      "transaction
db20: 22 2c 20 20 20 20 20 20 20 22 75 6e 6c 6f 63 6b  ",       "unlock
db30: 5f 6e 6f 74 69 66 79 22 2c 0a 20 20 20 20 22 75  _notify",.    "u
db40: 70 64 61 74 65 5f 68 6f 6f 6b 22 2c 20 20 20 20  pdate_hook",    
db50: 20 20 20 20 22 76 65 72 73 69 6f 6e 22 2c 20 20      "version",  
db60: 20 20 20 20 20 20 20 20 20 22 77 61 6c 5f 68 6f           "wal_ho
db70: 6f 6b 22 2c 0a 20 20 20 20 30 20 20 20 20 20 20  ok",.    0      
db80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 20                . 
db90: 20 7d 3b 0a 20 20 65 6e 75 6d 20 44 42 5f 65 6e   };.  enum DB_en
dba0: 75 6d 20 7b 0a 20 20 20 20 44 42 5f 41 55 54 48  um {.    DB_AUTH
dbb0: 4f 52 49 5a 45 52 2c 20 20 20 20 20 20 20 20 44  ORIZER,        D
dbc0: 42 5f 42 41 43 4b 55 50 2c 20 20 20 20 20 20 20  B_BACKUP,       
dbd0: 20 20 20 20 44 42 5f 42 55 53 59 2c 0a 20 20 20      DB_BUSY,.   
dbe0: 20 44 42 5f 43 41 43 48 45 2c 20 20 20 20 20 20   DB_CACHE,      
dbf0: 20 20 20 20 20 20 20 44 42 5f 43 48 41 4e 47 45         DB_CHANGE
dc00: 53 2c 20 20 20 20 20 20 20 20 20 20 44 42 5f 43  S,          DB_C
dc10: 4c 4f 53 45 2c 0a 20 20 20 20 44 42 5f 43 4f 4c  LOSE,.    DB_COL
dc20: 4c 41 54 45 2c 20 20 20 20 20 20 20 20 20 20 20  LATE,           
dc30: 44 42 5f 43 4f 4c 4c 41 54 49 4f 4e 5f 4e 45 45  DB_COLLATION_NEE
dc40: 44 45 44 2c 20 44 42 5f 43 4f 4d 4d 49 54 5f 48  DED, DB_COMMIT_H
dc50: 4f 4f 4b 2c 0a 20 20 20 20 44 42 5f 43 4f 4d 50  OOK,.    DB_COMP
dc60: 4c 45 54 45 2c 20 20 20 20 20 20 20 20 20 20 44  LETE,          D
dc70: 42 5f 43 4f 50 59 2c 20 20 20 20 20 20 20 20 20  B_COPY,         
dc80: 20 20 20 20 44 42 5f 45 4e 41 42 4c 45 5f 4c 4f      DB_ENABLE_LO
dc90: 41 44 5f 45 58 54 45 4e 53 49 4f 4e 2c 0a 20 20  AD_EXTENSION,.  
dca0: 20 20 44 42 5f 45 52 52 4f 52 43 4f 44 45 2c 20    DB_ERRORCODE, 
dcb0: 20 20 20 20 20 20 20 20 44 42 5f 45 56 41 4c 2c          DB_EVAL,
dcc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 44 42 5f               DB_
dcd0: 45 58 49 53 54 53 2c 0a 20 20 20 20 44 42 5f 46  EXISTS,.    DB_F
dce0: 55 4e 43 54 49 4f 4e 2c 20 20 20 20 20 20 20 20  UNCTION,        
dcf0: 20 20 44 42 5f 49 4e 43 52 42 4c 4f 42 2c 20 20    DB_INCRBLOB,  
dd00: 20 20 20 20 20 20 20 44 42 5f 49 4e 54 45 52 52         DB_INTERR
dd10: 55 50 54 2c 0a 20 20 20 20 44 42 5f 4c 41 53 54  UPT,.    DB_LAST
dd20: 5f 49 4e 53 45 52 54 5f 52 4f 57 49 44 2c 20 44  _INSERT_ROWID, D
dd30: 42 5f 4e 55 4c 4c 56 41 4c 55 45 2c 20 20 20 20  B_NULLVALUE,    
dd40: 20 20 20 20 44 42 5f 4f 4e 45 43 4f 4c 55 4d 4e      DB_ONECOLUMN
dd50: 2c 0a 20 20 20 20 44 42 5f 50 52 45 55 50 44 41  ,.    DB_PREUPDA
dd60: 54 45 2c 20 20 20 20 20 20 20 20 20 44 42 5f 50  TE,         DB_P
dd70: 52 4f 46 49 4c 45 2c 20 20 20 20 20 20 20 20 20  ROFILE,         
dd80: 20 44 42 5f 50 52 4f 47 52 45 53 53 2c 0a 20 20   DB_PROGRESS,.  
dd90: 20 20 44 42 5f 52 45 4b 45 59 2c 20 20 20 20 20    DB_REKEY,     
dda0: 20 20 20 20 20 20 20 20 44 42 5f 52 45 53 54 4f          DB_RESTO
ddb0: 52 45 2c 20 20 20 20 20 20 20 20 20 20 44 42 5f  RE,          DB_
ddc0: 52 4f 4c 4c 42 41 43 4b 5f 48 4f 4f 4b 2c 0a 20  ROLLBACK_HOOK,. 
ddd0: 20 20 20 44 42 5f 53 54 41 54 55 53 2c 20 20 20     DB_STATUS,   
dde0: 20 20 20 20 20 20 20 20 20 44 42 5f 54 49 4d 45           DB_TIME
ddf0: 4f 55 54 2c 20 20 20 20 20 20 20 20 20 20 44 42  OUT,          DB
de00: 5f 54 4f 54 41 4c 5f 43 48 41 4e 47 45 53 2c 0a  _TOTAL_CHANGES,.
de10: 20 20 20 20 44 42 5f 54 52 41 43 45 2c 20 20 20      DB_TRACE,   
de20: 20 20 20 20 20 20 20 20 20 20 44 42 5f 54 52 41            DB_TRA
de30: 4e 53 41 43 54 49 4f 4e 2c 20 20 20 20 20 20 44  NSACTION,      D
de40: 42 5f 55 4e 4c 4f 43 4b 5f 4e 4f 54 49 46 59 2c  B_UNLOCK_NOTIFY,
de50: 0a 20 20 20 20 44 42 5f 55 50 44 41 54 45 5f 48  .    DB_UPDATE_H
de60: 4f 4f 4b 2c 20 20 20 20 20 20 20 44 42 5f 56 45  OOK,       DB_VE
de70: 52 53 49 4f 4e 2c 20 20 20 20 20 20 20 20 20 20  RSION,          
de80: 44 42 5f 57 41 4c 5f 48 4f 4f 4b 2c 0a 20 20 7d  DB_WAL_HOOK,.  }
de90: 3b 0a 20 20 2f 2a 20 64 6f 6e 27 74 20 6c 65 61  ;.  /* don't lea
dea0: 76 65 20 74 72 61 69 6c 69 6e 67 20 63 6f 6d 6d  ve trailing comm
deb0: 61 73 20 6f 6e 20 44 42 5f 65 6e 75 6d 2c 20 69  as on DB_enum, i
dec0: 74 20 63 6f 6e 66 75 73 65 73 20 74 68 65 20 41  t confuses the A
ded0: 49 58 20 78 6c 63 20 63 6f 6d 70 69 6c 65 72 20  IX xlc compiler 
dee0: 2a 2f 0a 0a 20 20 69 66 28 20 6f 62 6a 63 3c 32  */..  if( objc<2
def0: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
df00: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
df10: 20 31 2c 20 6f 62 6a 76 2c 20 22 53 55 42 43 4f   1, objv, "SUBCO
df20: 4d 4d 41 4e 44 20 2e 2e 2e 22 29 3b 0a 20 20 20  MMAND ...");.   
df30: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
df40: 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54 63 6c  R;.  }.  if( Tcl
df50: 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a  _GetIndexFromObj
df60: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d  (interp, objv[1]
df70: 2c 20 44 42 5f 73 74 72 73 2c 20 22 6f 70 74 69  , DB_strs, "opti
df80: 6f 6e 22 2c 20 30 2c 20 26 63 68 6f 69 63 65 29  on", 0, &choice)
df90: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54   ){.    return T
dfa0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
dfb0: 20 73 77 69 74 63 68 28 20 28 65 6e 75 6d 20 44   switch( (enum D
dfc0: 42 5f 65 6e 75 6d 29 63 68 6f 69 63 65 20 29 7b  B_enum)choice ){
dfd0: 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 61 75  ..  /*    $db au
dfe0: 74 68 6f 72 69 7a 65 72 20 3f 43 41 4c 4c 42 41  thorizer ?CALLBA
dff0: 43 4b 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e  CK?.  **.  ** In
e000: 76 6f 6b 65 20 74 68 65 20 67 69 76 65 6e 20 63  voke the given c
e010: 61 6c 6c 62 61 63 6b 20 74 6f 20 61 75 74 68 6f  allback to autho
e020: 72 69 7a 65 20 65 61 63 68 20 53 51 4c 20 6f 70  rize each SQL op
e030: 65 72 61 74 69 6f 6e 20 61 73 20 69 74 20 69 73  eration as it is
e040: 0a 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 64 2e 20  .  ** compiled. 
e050: 20 35 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65   5 arguments are
e060: 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65   appended to the
e070: 20 63 61 6c 6c 62 61 63 6b 20 62 65 66 6f 72 65   callback before
e080: 20 69 74 20 69 73 0a 20 20 2a 2a 20 69 6e 76 6f   it is.  ** invo
e090: 6b 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  ked:.  **.  **  
e0a0: 20 28 31 29 20 54 68 65 20 61 75 74 68 6f 72 69   (1) The authori
e0b0: 7a 61 74 69 6f 6e 20 74 79 70 65 20 28 65 78 3a  zation type (ex:
e0c0: 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54   SQLITE_CREATE_T
e0d0: 41 42 4c 45 2c 20 53 51 4c 49 54 45 5f 49 4e 53  ABLE, SQLITE_INS
e0e0: 45 52 54 2c 20 2e 2e 2e 29 0a 20 20 2a 2a 20 20  ERT, ...).  **  
e0f0: 20 28 32 29 20 46 69 72 73 74 20 64 65 73 63 72   (2) First descr
e100: 69 70 74 69 76 65 20 6e 61 6d 65 20 28 64 65 70  iptive name (dep
e110: 65 6e 64 73 20 6f 6e 20 61 75 74 68 6f 72 69 7a  ends on authoriz
e120: 61 74 69 6f 6e 20 74 79 70 65 29 0a 20 20 2a 2a  ation type).  **
e130: 20 20 20 28 33 29 20 53 65 63 6f 6e 64 20 64 65     (3) Second de
e140: 73 63 72 69 70 74 69 76 65 20 6e 61 6d 65 0a 20  scriptive name. 
e150: 20 2a 2a 20 20 20 28 34 29 20 4e 61 6d 65 20 6f   **   (4) Name o
e160: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 28  f the database (
e170: 65 78 3a 20 22 6d 61 69 6e 22 2c 20 22 74 65 6d  ex: "main", "tem
e180: 70 22 29 0a 20 20 2a 2a 20 20 20 28 35 29 20 4e  p").  **   (5) N
e190: 61 6d 65 20 6f 66 20 74 72 69 67 67 65 72 20 74  ame of trigger t
e1a0: 68 61 74 20 69 73 20 64 6f 69 6e 67 20 74 68 65  hat is doing the
e1b0: 20 61 63 63 65 73 73 0a 20 20 2a 2a 0a 20 20 2a   access.  **.  *
e1c0: 2a 20 54 68 65 20 63 61 6c 6c 62 61 63 6b 20 73  * The callback s
e1d0: 68 6f 75 6c 64 20 72 65 74 75 72 6e 20 6f 6e 20  hould return on 
e1e0: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
e1f0: 20 73 74 72 69 6e 67 73 3a 20 53 51 4c 49 54 45   strings: SQLITE
e200: 5f 4f 4b 2c 0a 20 20 2a 2a 20 53 51 4c 49 54 45  _OK,.  ** SQLITE
e210: 5f 49 47 4e 4f 52 45 2c 20 6f 72 20 53 51 4c 49  _IGNORE, or SQLI
e220: 54 45 5f 44 45 4e 59 2e 20 20 41 6e 79 20 6f 74  TE_DENY.  Any ot
e230: 68 65 72 20 72 65 74 75 72 6e 20 76 61 6c 75 65  her return value
e240: 20 69 73 20 61 6e 20 65 72 72 6f 72 2e 0a 20 20   is an error..  
e250: 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69 73 20  **.  ** If this 
e260: 6d 65 74 68 6f 64 20 69 73 20 69 6e 76 6f 6b 65  method is invoke
e270: 64 20 77 69 74 68 20 6e 6f 20 61 72 67 75 6d 65  d with no argume
e280: 6e 74 73 2c 20 74 68 65 20 63 75 72 72 65 6e 74  nts, the current
e290: 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 0a 20   authorization. 
e2a0: 20 2a 2a 20 63 61 6c 6c 62 61 63 6b 20 73 74 72   ** callback str
e2b0: 69 6e 67 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ing is returned.
e2c0: 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f  .  */.  case DB_
e2d0: 41 55 54 48 4f 52 49 5a 45 52 3a 20 7b 0a 23 69  AUTHORIZER: {.#i
e2e0: 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
e2f0: 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20  _AUTHORIZATION. 
e300: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
e310: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 61 75 74  ult(interp, "aut
e320: 68 6f 72 69 7a 61 74 69 6f 6e 20 6e 6f 74 20 61  horization not a
e330: 76 61 69 6c 61 62 6c 65 20 69 6e 20 74 68 69 73  vailable in this
e340: 20 62 75 69 6c 64 22 2c 20 30 29 3b 0a 20 20 20   build", 0);.   
e350: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
e360: 52 3b 0a 23 65 6c 73 65 0a 20 20 20 20 69 66 28  R;.#else.    if(
e370: 20 6f 62 6a 63 3e 33 20 29 7b 0a 20 20 20 20 20   objc>3 ){.     
e380: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
e390: 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a  s(interp, 2, obj
e3a0: 76 2c 20 22 3f 43 41 4c 4c 42 41 43 4b 3f 22 29  v, "?CALLBACK?")
e3b0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
e3c0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65  CL_ERROR;.    }e
e3d0: 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20  lse if( objc==2 
e3e0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62  ){.      if( pDb
e3f0: 2d 3e 7a 41 75 74 68 20 29 7b 0a 20 20 20 20 20  ->zAuth ){.     
e400: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
e410: 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 44 62 2d  ult(interp, pDb-
e420: 3e 7a 41 75 74 68 2c 20 30 29 3b 0a 20 20 20 20  >zAuth, 0);.    
e430: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
e440: 20 20 20 20 20 63 68 61 72 20 2a 7a 41 75 74 68       char *zAuth
e450: 3b 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b  ;.      int len;
e460: 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e  .      if( pDb->
e470: 7a 41 75 74 68 20 29 7b 0a 20 20 20 20 20 20 20  zAuth ){.       
e480: 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a   Tcl_Free(pDb->z
e490: 41 75 74 68 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Auth);.      }. 
e4a0: 20 20 20 20 20 7a 41 75 74 68 20 3d 20 54 63 6c       zAuth = Tcl
e4b0: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
e4c0: 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29  j(objv[2], &len)
e4d0: 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 41 75 74  ;.      if( zAut
e4e0: 68 20 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20 20  h && len>0 ){.  
e4f0: 20 20 20 20 20 20 70 44 62 2d 3e 7a 41 75 74 68        pDb->zAuth
e500: 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65   = Tcl_Alloc( le
e510: 6e 20 2b 20 31 20 29 3b 0a 20 20 20 20 20 20 20  n + 1 );.       
e520: 20 6d 65 6d 63 70 79 28 70 44 62 2d 3e 7a 41 75   memcpy(pDb->zAu
e530: 74 68 2c 20 7a 41 75 74 68 2c 20 6c 65 6e 2b 31  th, zAuth, len+1
e540: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
e550: 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 41 75          pDb->zAu
e560: 74 68 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  th = 0;.      }.
e570: 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a        if( pDb->z
e580: 41 75 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20  Auth ){.        
e590: 70 44 62 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e  pDb->interp = in
e5a0: 74 65 72 70 3b 0a 20 20 20 20 20 20 20 20 73 71  terp;.        sq
e5b0: 6c 69 74 65 33 5f 73 65 74 5f 61 75 74 68 6f 72  lite3_set_author
e5c0: 69 7a 65 72 28 70 44 62 2d 3e 64 62 2c 20 61 75  izer(pDb->db, au
e5d0: 74 68 5f 63 61 6c 6c 62 61 63 6b 2c 20 70 44 62  th_callback, pDb
e5e0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
e5f0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
e600: 73 65 74 5f 61 75 74 68 6f 72 69 7a 65 72 28 70  set_authorizer(p
e610: 44 62 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20  Db->db, 0, 0);. 
e620: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e       }.    }.#en
e630: 64 69 66 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20  dif.    break;. 
e640: 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20   }..  /*    $db 
e650: 62 61 63 6b 75 70 20 3f 44 41 54 41 42 41 53 45  backup ?DATABASE
e660: 3f 20 46 49 4c 45 4e 41 4d 45 0a 20 20 2a 2a 0a  ? FILENAME.  **.
e670: 20 20 2a 2a 20 4f 70 65 6e 20 6f 72 20 63 72 65    ** Open or cre
e680: 61 74 65 20 61 20 64 61 74 61 62 61 73 65 20 66  ate a database f
e690: 69 6c 65 20 6e 61 6d 65 64 20 46 49 4c 45 4e 41  ile named FILENA
e6a0: 4d 45 2e 20 20 54 72 61 6e 73 66 65 72 20 74 68  ME.  Transfer th
e6b0: 65 0a 20 20 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f  e.  ** content o
e6c0: 66 20 6c 6f 63 61 6c 20 64 61 74 61 62 61 73 65  f local database
e6d0: 20 44 41 54 41 42 41 53 45 20 28 64 65 66 61 75   DATABASE (defau
e6e0: 6c 74 3a 20 22 6d 61 69 6e 22 29 20 69 6e 74 6f  lt: "main") into
e6f0: 20 74 68 65 0a 20 20 2a 2a 20 46 49 4c 45 4e 41   the.  ** FILENA
e700: 4d 45 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a  ME database..  *
e710: 2f 0a 20 20 63 61 73 65 20 44 42 5f 42 41 43 4b  /.  case DB_BACK
e720: 55 50 3a 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20  UP: {.    const 
e730: 63 68 61 72 20 2a 7a 44 65 73 74 46 69 6c 65 3b  char *zDestFile;
e740: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
e750: 2a 7a 53 72 63 44 62 3b 0a 20 20 20 20 73 71 6c  *zSrcDb;.    sql
e760: 69 74 65 33 20 2a 70 44 65 73 74 3b 0a 20 20 20  ite3 *pDest;.   
e770: 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20   sqlite3_backup 
e780: 2a 70 42 61 63 6b 75 70 3b 0a 0a 20 20 20 20 69  *pBackup;..    i
e790: 66 28 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20 20  f( objc==3 ){.  
e7a0: 20 20 20 20 7a 53 72 63 44 62 20 3d 20 22 6d 61      zSrcDb = "ma
e7b0: 69 6e 22 3b 0a 20 20 20 20 20 20 7a 44 65 73 74  in";.      zDest
e7c0: 46 69 6c 65 20 3d 20 54 63 6c 5f 47 65 74 53 74  File = Tcl_GetSt
e7d0: 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20  ring(objv[2]);. 
e7e0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a     }else if( obj
e7f0: 63 3d 3d 34 20 29 7b 0a 20 20 20 20 20 20 7a 53  c==4 ){.      zS
e800: 72 63 44 62 20 3d 20 54 63 6c 5f 47 65 74 53 74  rcDb = Tcl_GetSt
e810: 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20  ring(objv[2]);. 
e820: 20 20 20 20 20 7a 44 65 73 74 46 69 6c 65 20 3d       zDestFile =
e830: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
e840: 62 6a 76 5b 33 5d 29 3b 0a 20 20 20 20 7d 65 6c  bjv[3]);.    }el
e850: 73 65 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72  se{.      Tcl_Wr
e860: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
e870: 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 44 41  p, 2, objv, "?DA
e880: 54 41 42 41 53 45 3f 20 46 49 4c 45 4e 41 4d 45  TABASE? FILENAME
e890: 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
e8a0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
e8b0: 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  }.    rc = sqlit
e8c0: 65 33 5f 6f 70 65 6e 28 7a 44 65 73 74 46 69 6c  e3_open(zDestFil
e8d0: 65 2c 20 26 70 44 65 73 74 29 3b 0a 20 20 20 20  e, &pDest);.    
e8e0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
e8f0: 4b 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41  K ){.      Tcl_A
e900: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
e910: 72 70 2c 20 22 63 61 6e 6e 6f 74 20 6f 70 65 6e  rp, "cannot open
e920: 20 74 61 72 67 65 74 20 64 61 74 61 62 61 73 65   target database
e930: 3a 20 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  : ",.           
e940: 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70  sqlite3_errmsg(p
e950: 44 65 73 74 29 2c 20 28 63 68 61 72 2a 29 30 29  Dest), (char*)0)
e960: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
e970: 63 6c 6f 73 65 28 70 44 65 73 74 29 3b 0a 20 20  close(pDest);.  
e980: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
e990: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
e9a0: 70 42 61 63 6b 75 70 20 3d 20 73 71 6c 69 74 65  pBackup = sqlite
e9b0: 33 5f 62 61 63 6b 75 70 5f 69 6e 69 74 28 70 44  3_backup_init(pD
e9c0: 65 73 74 2c 20 22 6d 61 69 6e 22 2c 20 70 44 62  est, "main", pDb
e9d0: 2d 3e 64 62 2c 20 7a 53 72 63 44 62 29 3b 0a 20  ->db, zSrcDb);. 
e9e0: 20 20 20 69 66 28 20 70 42 61 63 6b 75 70 3d 3d     if( pBackup==
e9f0: 30 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41  0 ){.      Tcl_A
ea00: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
ea10: 72 70 2c 20 22 62 61 63 6b 75 70 20 66 61 69 6c  rp, "backup fail
ea20: 65 64 3a 20 22 2c 0a 20 20 20 20 20 20 20 20 20  ed: ",.         
ea30: 20 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67    sqlite3_errmsg
ea40: 28 70 44 65 73 74 29 2c 20 28 63 68 61 72 2a 29  (pDest), (char*)
ea50: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
ea60: 33 5f 63 6c 6f 73 65 28 70 44 65 73 74 29 3b 0a  3_close(pDest);.
ea70: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
ea80: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
ea90: 20 20 77 68 69 6c 65 28 20 20 28 72 63 20 3d 20    while(  (rc = 
eaa0: 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f 73  sqlite3_backup_s
eab0: 74 65 70 28 70 42 61 63 6b 75 70 2c 31 30 30 29  tep(pBackup,100)
eac0: 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 7d  )==SQLITE_OK ){}
ead0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 61 63  .    sqlite3_bac
eae0: 6b 75 70 5f 66 69 6e 69 73 68 28 70 42 61 63 6b  kup_finish(pBack
eaf0: 75 70 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  up);.    if( rc=
eb00: 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a  =SQLITE_DONE ){.
eb10: 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 4f        rc = TCL_O
eb20: 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  K;.    }else{.  
eb30: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
eb40: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 61  sult(interp, "ba
eb50: 63 6b 75 70 20 66 61 69 6c 65 64 3a 20 22 2c 0a  ckup failed: ",.
eb60: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
eb70: 65 33 5f 65 72 72 6d 73 67 28 70 44 65 73 74 29  e3_errmsg(pDest)
eb80: 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20  , (char*)0);.   
eb90: 20 20 20 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f     rc = TCL_ERRO
eba0: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  R;.    }.    sql
ebb0: 69 74 65 33 5f 63 6c 6f 73 65 28 70 44 65 73 74  ite3_close(pDest
ebc0: 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  );.    break;.  
ebd0: 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 62  }..  /*    $db b
ebe0: 75 73 79 20 3f 43 41 4c 4c 42 41 43 4b 3f 0a 20  usy ?CALLBACK?. 
ebf0: 20 2a 2a 0a 20 20 2a 2a 20 49 6e 76 6f 6b 65 20   **.  ** Invoke 
ec00: 74 68 65 20 67 69 76 65 6e 20 63 61 6c 6c 62 61  the given callba
ec10: 63 6b 20 69 66 20 61 6e 20 53 51 4c 20 73 74 61  ck if an SQL sta
ec20: 74 65 6d 65 6e 74 20 61 74 74 65 6d 70 74 73 20  tement attempts 
ec30: 74 6f 20 6f 70 65 6e 0a 20 20 2a 2a 20 61 20 6c  to open.  ** a l
ec40: 6f 63 6b 65 64 20 64 61 74 61 62 61 73 65 20 66  ocked database f
ec50: 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  ile..  */.  case
ec60: 20 44 42 5f 42 55 53 59 3a 20 7b 0a 20 20 20 20   DB_BUSY: {.    
ec70: 69 66 28 20 6f 62 6a 63 3e 33 20 29 7b 0a 20 20  if( objc>3 ){.  
ec80: 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
ec90: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20  Args(interp, 2, 
eca0: 6f 62 6a 76 2c 20 22 43 41 4c 4c 42 41 43 4b 22  objv, "CALLBACK"
ecb0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
ecc0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
ecd0: 65 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d 32  else if( objc==2
ece0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 44   ){.      if( pD
ecf0: 62 2d 3e 7a 42 75 73 79 20 29 7b 0a 20 20 20 20  b->zBusy ){.    
ed00: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
ed10: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 44 62  sult(interp, pDb
ed20: 2d 3e 7a 42 75 73 79 2c 20 30 29 3b 0a 20 20 20  ->zBusy, 0);.   
ed30: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
ed40: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 42 75 73        char *zBus
ed50: 79 3b 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e  y;.      int len
ed60: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d  ;.      if( pDb-
ed70: 3e 7a 42 75 73 79 20 29 7b 0a 20 20 20 20 20 20  >zBusy ){.      
ed80: 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e    Tcl_Free(pDb->
ed90: 7a 42 75 73 79 29 3b 0a 20 20 20 20 20 20 7d 0a  zBusy);.      }.
eda0: 20 20 20 20 20 20 7a 42 75 73 79 20 3d 20 54 63        zBusy = Tc
edb0: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
edc0: 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e  bj(objv[2], &len
edd0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 42 75  );.      if( zBu
ede0: 73 79 20 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20  sy && len>0 ){. 
edf0: 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 42 75 73         pDb->zBus
ee00: 79 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c  y = Tcl_Alloc( l
ee10: 65 6e 20 2b 20 31 20 29 3b 0a 20 20 20 20 20 20  en + 1 );.      
ee20: 20 20 6d 65 6d 63 70 79 28 70 44 62 2d 3e 7a 42    memcpy(pDb->zB
ee30: 75 73 79 2c 20 7a 42 75 73 79 2c 20 6c 65 6e 2b  usy, zBusy, len+
ee40: 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  1);.      }else{
ee50: 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 42  .        pDb->zB
ee60: 75 73 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  usy = 0;.      }
ee70: 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e  .      if( pDb->
ee80: 7a 42 75 73 79 20 29 7b 0a 20 20 20 20 20 20 20  zBusy ){.       
ee90: 20 70 44 62 2d 3e 69 6e 74 65 72 70 20 3d 20 69   pDb->interp = i
eea0: 6e 74 65 72 70 3b 0a 20 20 20 20 20 20 20 20 73  nterp;.        s
eeb0: 71 6c 69 74 65 33 5f 62 75 73 79 5f 68 61 6e 64  qlite3_busy_hand
eec0: 6c 65 72 28 70 44 62 2d 3e 64 62 2c 20 44 62 42  ler(pDb->db, DbB
eed0: 75 73 79 48 61 6e 64 6c 65 72 2c 20 70 44 62 29  usyHandler, pDb)
eee0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
eef0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62         sqlite3_b
ef00: 75 73 79 5f 68 61 6e 64 6c 65 72 28 70 44 62 2d  usy_handler(pDb-
ef10: 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  >db, 0, 0);.    
ef20: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 62 72    }.    }.    br
ef30: 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20  eak;.  }..  /*  
ef40: 20 20 20 24 64 62 20 63 61 63 68 65 20 66 6c 75     $db cache flu
ef50: 73 68 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20  sh.  **     $db 
ef60: 63 61 63 68 65 20 73 69 7a 65 20 6e 0a 20 20 2a  cache size n.  *
ef70: 2a 0a 20 20 2a 2a 20 46 6c 75 73 68 20 74 68 65  *.  ** Flush the
ef80: 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
ef90: 65 6e 74 20 63 61 63 68 65 2c 20 6f 72 20 73 65  ent cache, or se
efa0: 74 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75  t the maximum nu
efb0: 6d 62 65 72 20 6f 66 0a 20 20 2a 2a 20 63 61 63  mber of.  ** cac
efc0: 68 65 64 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a  hed statements..
efd0: 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 43    */.  case DB_C
efe0: 41 43 48 45 3a 20 7b 0a 20 20 20 20 63 68 61 72  ACHE: {.    char
eff0: 20 2a 73 75 62 43 6d 64 3b 0a 20 20 20 20 69 6e   *subCmd;.    in
f000: 74 20 6e 3b 0a 0a 20 20 20 20 69 66 28 20 6f 62  t n;..    if( ob
f010: 6a 63 3c 3d 32 20 29 7b 0a 20 20 20 20 20 20 54  jc<=2 ){.      T
f020: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
f030: 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
f040: 20 22 63 61 63 68 65 20 6f 70 74 69 6f 6e 20 3f   "cache option ?
f050: 61 72 67 3f 22 29 3b 0a 20 20 20 20 20 20 72 65  arg?");.      re
f060: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
f070: 20 20 20 20 7d 0a 20 20 20 20 73 75 62 43 6d 64      }.    subCmd
f080: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
f090: 46 72 6f 6d 4f 62 6a 28 20 6f 62 6a 76 5b 32 5d  FromObj( objv[2]
f0a0: 2c 20 30 20 29 3b 0a 20 20 20 20 69 66 28 20 2a  , 0 );.    if( *
f0b0: 73 75 62 43 6d 64 3d 3d 27 66 27 20 26 26 20 73  subCmd=='f' && s
f0c0: 74 72 63 6d 70 28 73 75 62 43 6d 64 2c 22 66 6c  trcmp(subCmd,"fl
f0d0: 75 73 68 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ush")==0 ){.    
f0e0: 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b    if( objc!=3 ){
f0f0: 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 57 72 6f  .        Tcl_Wro
f100: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
f110: 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 66 6c 75 73  , 2, objv, "flus
f120: 68 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  h");.        ret
f130: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
f140: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
f150: 20 20 20 20 66 6c 75 73 68 53 74 6d 74 43 61 63      flushStmtCac
f160: 68 65 28 20 70 44 62 20 29 3b 0a 20 20 20 20 20  he( pDb );.     
f170: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28   }.    }else if(
f180: 20 2a 73 75 62 43 6d 64 3d 3d 27 73 27 20 26 26   *subCmd=='s' &&
f190: 20 73 74 72 63 6d 70 28 73 75 62 43 6d 64 2c 22   strcmp(subCmd,"
f1a0: 73 69 7a 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20  size")==0 ){.   
f1b0: 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29     if( objc!=4 )
f1c0: 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 57 72  {.        Tcl_Wr
f1d0: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
f1e0: 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 73 69 7a  p, 2, objv, "siz
f1f0: 65 20 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 72  e n");.        r
f200: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
f210: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
f220: 20 20 20 20 20 20 69 66 28 20 54 43 4c 5f 45 52        if( TCL_ER
f230: 52 4f 52 3d 3d 54 63 6c 5f 47 65 74 49 6e 74 46  ROR==Tcl_GetIntF
f240: 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
f250: 62 6a 76 5b 33 5d 2c 20 26 6e 29 20 29 7b 0a 20  bjv[3], &n) ){. 
f260: 20 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70           Tcl_App
f270: 65 6e 64 52 65 73 75 6c 74 28 20 69 6e 74 65 72  endResult( inter
f280: 70 2c 20 22 63 61 6e 6e 6f 74 20 63 6f 6e 76 65  p, "cannot conve
f290: 72 74 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20  rt \"", .       
f2a0: 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53          Tcl_GetS
f2b0: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
f2c0: 76 5b 33 5d 2c 30 29 2c 20 22 5c 22 20 74 6f 20  v[3],0), "\" to 
f2d0: 69 6e 74 65 67 65 72 22 2c 20 30 29 3b 0a 20 20  integer", 0);.  
f2e0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54          return T
f2f0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  CL_ERROR;.      
f300: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
f310: 20 20 20 69 66 28 20 6e 3c 30 20 29 7b 0a 20 20     if( n<0 ){.  
f320: 20 20 20 20 20 20 20 20 20 20 66 6c 75 73 68 53            flushS
f330: 74 6d 74 43 61 63 68 65 28 20 70 44 62 20 29 3b  tmtCache( pDb );
f340: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 20 3d  .            n =
f350: 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65   0;.          }e
f360: 6c 73 65 20 69 66 28 20 6e 3e 4d 41 58 5f 50 52  lse if( n>MAX_PR
f370: 45 50 41 52 45 44 5f 53 54 4d 54 53 20 29 7b 0a  EPARED_STMTS ){.
f380: 20 20 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20              n = 
f390: 4d 41 58 5f 50 52 45 50 41 52 45 44 5f 53 54 4d  MAX_PREPARED_STM
f3a0: 54 53 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  TS;.          }.
f3b0: 20 20 20 20 20 20 20 20 20 20 70 44 62 2d 3e 6d            pDb->m
f3c0: 61 78 53 74 6d 74 20 3d 20 6e 3b 0a 20 20 20 20  axStmt = n;.    
f3d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
f3e0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 54    }else{.      T
f3f0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
f400: 20 69 6e 74 65 72 70 2c 20 22 62 61 64 20 6f 70   interp, "bad op
f410: 74 69 6f 6e 20 5c 22 22 2c 20 0a 20 20 20 20 20  tion \"", .     
f420: 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
f430: 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32  ngFromObj(objv[2
f440: 5d 2c 30 29 2c 20 22 5c 22 3a 20 6d 75 73 74 20  ],0), "\": must 
f450: 62 65 20 66 6c 75 73 68 20 6f 72 20 73 69 7a 65  be flush or size
f460: 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 65 74  ", 0);.      ret
f470: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
f480: 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a     }.    break;.
f490: 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 20 24 64    }..  /*     $d
f4a0: 62 20 63 68 61 6e 67 65 73 0a 20 20 2a 2a 0a 20  b changes.  **. 
f4b0: 20 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e   ** Return the n
f4c0: 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68  umber of rows th
f4d0: 61 74 20 77 65 72 65 20 6d 6f 64 69 66 69 65 64  at were modified
f4e0: 2c 20 69 6e 73 65 72 74 65 64 2c 20 6f 72 20 64  , inserted, or d
f4f0: 65 6c 65 74 65 64 20 62 79 0a 20 20 2a 2a 20 74  eleted by.  ** t
f500: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 49  he most recent I
f510: 4e 53 45 52 54 2c 20 55 50 44 41 54 45 20 6f 72  NSERT, UPDATE or
f520: 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e   DELETE statemen
f530: 74 2c 20 6e 6f 74 20 69 6e 63 6c 75 64 69 6e 67  t, not including
f540: 20 0a 20 20 2a 2a 20 61 6e 79 20 63 68 61 6e 67   .  ** any chang
f550: 65 73 20 6d 61 64 65 20 62 79 20 74 72 69 67 67  es made by trigg
f560: 65 72 20 70 72 6f 67 72 61 6d 73 2e 0a 20 20 2a  er programs..  *
f570: 2f 0a 20 20 63 61 73 65 20 44 42 5f 43 48 41 4e  /.  case DB_CHAN
f580: 47 45 53 3a 20 7b 0a 20 20 20 20 54 63 6c 5f 4f  GES: {.    Tcl_O
f590: 62 6a 20 2a 70 52 65 73 75 6c 74 3b 0a 20 20 20  bj *pResult;.   
f5a0: 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a   if( objc!=2 ){.
f5b0: 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
f5c0: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
f5d0: 2c 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 20 20 20  , objv, "");.   
f5e0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
f5f0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ROR;.    }.    p
f600: 52 65 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65 74  Result = Tcl_Get
f610: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
f620: 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 49 6e  );.    Tcl_SetIn
f630: 74 4f 62 6a 28 70 52 65 73 75 6c 74 2c 20 73 71  tObj(pResult, sq
f640: 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 28 70 44  lite3_changes(pD
f650: 62 2d 3e 64 62 29 29 3b 0a 20 20 20 20 62 72 65  b->db));.    bre
f660: 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20  ak;.  }..  /*   
f670: 20 24 64 62 20 63 6c 6f 73 65 0a 20 20 2a 2a 0a   $db close.  **.
f680: 20 20 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74 68    ** Shutdown th
f690: 65 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2f 0a  e database.  */.
f6a0: 20 20 63 61 73 65 20 44 42 5f 43 4c 4f 53 45 3a    case DB_CLOSE:
f6b0: 20 7b 0a 20 20 20 20 54 63 6c 5f 44 65 6c 65 74   {.    Tcl_Delet
f6c0: 65 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c  eCommand(interp,
f6d0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
f6e0: 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30  omObj(objv[0], 0
f6f0: 29 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20  ));.    break;. 
f700: 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20   }..  /*.  **   
f710: 20 20 24 64 62 20 63 6f 6c 6c 61 74 65 20 4e 41    $db collate NA
f720: 4d 45 20 53 43 52 49 50 54 0a 20 20 2a 2a 0a 20  ME SCRIPT.  **. 
f730: 20 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77   ** Create a new
f740: 20 53 51 4c 20 63 6f 6c 6c 61 74 69 6f 6e 20 66   SQL collation f
f750: 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 20 4e  unction called N
f760: 41 4d 45 2e 20 20 57 68 65 6e 65 76 65 72 0a 20  AME.  Whenever. 
f770: 20 2a 2a 20 74 68 61 74 20 66 75 6e 63 74 69 6f   ** that functio
f780: 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 6e 76  n is called, inv
f790: 6f 6b 65 20 53 43 52 49 50 54 20 74 6f 20 65 76  oke SCRIPT to ev
f7a0: 61 6c 75 61 74 65 20 74 68 65 20 66 75 6e 63 74  aluate the funct
f7b0: 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  ion..  */.  case
f7c0: 20 44 42 5f 43 4f 4c 4c 41 54 45 3a 20 7b 0a 20   DB_COLLATE: {. 
f7d0: 20 20 20 53 71 6c 43 6f 6c 6c 61 74 65 20 2a 70     SqlCollate *p
f7e0: 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 63 68 61  Collate;.    cha
f7f0: 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 63 68  r *zName;.    ch
f800: 61 72 20 2a 7a 53 63 72 69 70 74 3b 0a 20 20 20  ar *zScript;.   
f810: 20 69 6e 74 20 6e 53 63 72 69 70 74 3b 0a 20 20   int nScript;.  
f820: 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b    if( objc!=4 ){
f830: 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  .      Tcl_Wrong
f840: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
f850: 32 2c 20 6f 62 6a 76 2c 20 22 4e 41 4d 45 20 53  2, objv, "NAME S
f860: 43 52 49 50 54 22 29 3b 0a 20 20 20 20 20 20 72  CRIPT");.      r
f870: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
f880: 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4e 61 6d 65  .    }.    zName
f890: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
f8a0: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c  FromObj(objv[2],
f8b0: 20 30 29 3b 0a 20 20 20 20 7a 53 63 72 69 70 74   0);.    zScript
f8c0: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
f8d0: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d 2c  FromObj(objv[3],
f8e0: 20 26 6e 53 63 72 69 70 74 29 3b 0a 20 20 20 20   &nScript);.    
f8f0: 70 43 6f 6c 6c 61 74 65 20 3d 20 28 53 71 6c 43  pCollate = (SqlC
f900: 6f 6c 6c 61 74 65 2a 29 54 63 6c 5f 41 6c 6c 6f  ollate*)Tcl_Allo
f910: 63 28 20 73 69 7a 65 6f 66 28 2a 70 43 6f 6c 6c  c( sizeof(*pColl
f920: 61 74 65 29 20 2b 20 6e 53 63 72 69 70 74 20 2b  ate) + nScript +
f930: 20 31 20 29 3b 0a 20 20 20 20 69 66 28 20 70 43   1 );.    if( pC
f940: 6f 6c 6c 61 74 65 3d 3d 30 20 29 20 72 65 74 75  ollate==0 ) retu
f950: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
f960: 20 20 70 43 6f 6c 6c 61 74 65 2d 3e 69 6e 74 65    pCollate->inte
f970: 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20  rp = interp;.   
f980: 20 70 43 6f 6c 6c 61 74 65 2d 3e 70 4e 65 78 74   pCollate->pNext
f990: 20 3d 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65   = pDb->pCollate
f9a0: 3b 0a 20 20 20 20 70 43 6f 6c 6c 61 74 65 2d 3e  ;.    pCollate->
f9b0: 7a 53 63 72 69 70 74 20 3d 20 28 63 68 61 72 2a  zScript = (char*
f9c0: 29 26 70 43 6f 6c 6c 61 74 65 5b 31 5d 3b 0a 20  )&pCollate[1];. 
f9d0: 20 20 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65     pDb->pCollate
f9e0: 20 3d 20 70 43 6f 6c 6c 61 74 65 3b 0a 20 20 20   = pCollate;.   
f9f0: 20 6d 65 6d 63 70 79 28 70 43 6f 6c 6c 61 74 65   memcpy(pCollate
fa00: 2d 3e 7a 53 63 72 69 70 74 2c 20 7a 53 63 72 69  ->zScript, zScri
fa10: 70 74 2c 20 6e 53 63 72 69 70 74 2b 31 29 3b 0a  pt, nScript+1);.
fa20: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f      if( sqlite3_
fa30: 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e  create_collation
fa40: 28 70 44 62 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c  (pDb->db, zName,
fa50: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 0a 20   SQLITE_UTF8, . 
fa60: 20 20 20 20 20 20 20 70 43 6f 6c 6c 61 74 65 2c         pCollate,
fa70: 20 74 63 6c 53 71 6c 43 6f 6c 6c 61 74 65 29 20   tclSqlCollate) 
fa80: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74  ){.      Tcl_Set
fa90: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28  Result(interp, (
faa0: 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 65  char *)sqlite3_e
fab0: 72 72 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c 20  rrmsg(pDb->db), 
fac0: 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20  TCL_VOLATILE);. 
fad0: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
fae0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
faf0: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
fb00: 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20 63  *.  **     $db c
fb10: 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64 20  ollation_needed 
fb20: 53 43 52 49 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a  SCRIPT.  **.  **
fb30: 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 53 51   Create a new SQ
fb40: 4c 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e 63  L collation func
fb50: 74 69 6f 6e 20 63 61 6c 6c 65 64 20 4e 41 4d 45  tion called NAME
fb60: 2e 20 20 57 68 65 6e 65 76 65 72 0a 20 20 2a 2a  .  Whenever.  **
fb70: 20 74 68 61 74 20 66 75 6e 63 74 69 6f 6e 20 69   that function i
fb80: 73 20 63 61 6c 6c 65 64 2c 20 69 6e 76 6f 6b 65  s called, invoke
fb90: 20 53 43 52 49 50 54 20 74 6f 20 65 76 61 6c 75   SCRIPT to evalu
fba0: 61 74 65 20 74 68 65 20 66 75 6e 63 74 69 6f 6e  ate the function
fbb0: 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  ..  */.  case DB
fbc0: 5f 43 4f 4c 4c 41 54 49 4f 4e 5f 4e 45 45 44 45  _COLLATION_NEEDE
fbd0: 44 3a 20 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a  D: {.    if( obj
fbe0: 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 54 63  c!=3 ){.      Tc
fbf0: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
fc00: 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
fc10: 22 53 43 52 49 50 54 22 29 3b 0a 20 20 20 20 20  "SCRIPT");.     
fc20: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
fc30: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  R;.    }.    if(
fc40: 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65   pDb->pCollateNe
fc50: 65 64 65 64 20 29 7b 0a 20 20 20 20 20 20 54 63  eded ){.      Tc
fc60: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70  l_DecrRefCount(p
fc70: 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65 65 64  Db->pCollateNeed
fc80: 65 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ed);.    }.    p
fc90: 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65 65 64  Db->pCollateNeed
fca0: 65 64 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61  ed = Tcl_Duplica
fcb0: 74 65 4f 62 6a 28 6f 62 6a 76 5b 32 5d 29 3b 0a  teObj(objv[2]);.
fcc0: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43      Tcl_IncrRefC
fcd0: 6f 75 6e 74 28 70 44 62 2d 3e 70 43 6f 6c 6c 61  ount(pDb->pColla
fce0: 74 65 4e 65 65 64 65 64 29 3b 0a 20 20 20 20 73  teNeeded);.    s
fcf0: 71 6c 69 74 65 33 5f 63 6f 6c 6c 61 74 69 6f 6e  qlite3_collation
fd00: 5f 6e 65 65 64 65 64 28 70 44 62 2d 3e 64 62 2c  _needed(pDb->db,
fd10: 20 70 44 62 2c 20 74 63 6c 43 6f 6c 6c 61 74 65   pDb, tclCollate
fd20: 4e 65 65 64 65 64 29 3b 0a 20 20 20 20 62 72 65  Needed);.    bre
fd30: 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20  ak;.  }..  /*   
fd40: 20 24 64 62 20 63 6f 6d 6d 69 74 5f 68 6f 6f 6b   $db commit_hook
fd50: 20 3f 43 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a   ?CALLBACK?.  **
fd60: 0a 20 20 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65  .  ** Invoke the
fd70: 20 67 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b 20   given callback 
fd80: 6a 75 73 74 20 62 65 66 6f 72 65 20 63 6f 6d 6d  just before comm
fd90: 69 74 74 69 6e 67 20 65 76 65 72 79 20 53 51 4c  itting every SQL
fda0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20   transaction..  
fdb0: 2a 2a 20 49 66 20 74 68 65 20 63 61 6c 6c 62 61  ** If the callba
fdc0: 63 6b 20 74 68 72 6f 77 73 20 61 6e 20 65 78 63  ck throws an exc
fdd0: 65 70 74 69 6f 6e 20 6f 72 20 72 65 74 75 72 6e  eption or return
fde0: 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
fdf0: 20 74 68 65 0a 20 20 2a 2a 20 74 72 61 6e 73 61   the.  ** transa
fe00: 63 74 69 6f 6e 20 69 73 20 61 62 6f 72 74 65 64  ction is aborted
fe10: 2e 20 20 49 66 20 43 41 4c 4c 42 41 43 4b 20 69  .  If CALLBACK i
fe20: 73 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e  s an empty strin
fe30: 67 2c 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 0a  g, the callback.
fe40: 20 20 2a 2a 20 69 73 20 64 69 73 61 62 6c 65 64    ** is disabled
fe50: 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  ..  */.  case DB
fe60: 5f 43 4f 4d 4d 49 54 5f 48 4f 4f 4b 3a 20 7b 0a  _COMMIT_HOOK: {.
fe70: 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 33 20 29      if( objc>3 )
fe80: 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e  {.      Tcl_Wron
fe90: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
fea0: 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 43 41 4c 4c   2, objv, "?CALL
feb0: 42 41 43 4b 3f 22 29 3b 0a 20 20 20 20 20 20 72  BACK?");.      r
fec0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
fed0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f  .    }else if( o
fee0: 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20  bjc==2 ){.      
fef0: 69 66 28 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74  if( pDb->zCommit
ff00: 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f   ){.        Tcl_
ff10: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
ff20: 65 72 70 2c 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69  erp, pDb->zCommi
ff30: 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  t, 0);.      }. 
ff40: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
ff50: 63 68 61 72 20 2a 7a 43 6f 6d 6d 69 74 3b 0a 20  char *zCommit;. 
ff60: 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20       int len;.  
ff70: 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 43 6f      if( pDb->zCo
ff80: 6d 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20  mmit ){.        
ff90: 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 43  Tcl_Free(pDb->zC
ffa0: 6f 6d 6d 69 74 29 3b 0a 20 20 20 20 20 20 7d 0a  ommit);.      }.
ffb0: 20 20 20 20 20 20 7a 43 6f 6d 6d 69 74 20 3d 20        zCommit = 
ffc0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
ffd0: 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c  mObj(objv[2], &l
ffe0: 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  en);.      if( z
fff0: 43 6f 6d 6d 69 74 20 26 26 20 6c 65 6e 3e 30 20  Commit && len>0 
10000 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e  ){.        pDb->
10010 7a 43 6f 6d 6d 69 74 20 3d 20 54 63 6c 5f 41 6c  zCommit = Tcl_Al
10020 6c 6f 63 28 20 6c 65 6e 20 2b 20 31 20 29 3b 0a  loc( len + 1 );.
10030 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70          memcpy(p
10040 44 62 2d 3e 7a 43 6f 6d 6d 69 74 2c 20 7a 43 6f  Db->zCommit, zCo
10050 6d 6d 69 74 2c 20 6c 65 6e 2b 31 29 3b 0a 20 20  mmit, len+1);.  
10060 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
10070 20 20 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 20     pDb->zCommit 
10080 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
10090 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 43 6f 6d     if( pDb->zCom
100a0 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70  mit ){.        p
100b0 44 62 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74  Db->interp = int
100c0 65 72 70 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  erp;.        sql
100d0 69 74 65 33 5f 63 6f 6d 6d 69 74 5f 68 6f 6f 6b  ite3_commit_hook
100e0 28 70 44 62 2d 3e 64 62 2c 20 44 62 43 6f 6d 6d  (pDb->db, DbComm
100f0 69 74 48 61 6e 64 6c 65 72 2c 20 70 44 62 29 3b  itHandler, pDb);
10100 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
10110 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f        sqlite3_co
10120 6d 6d 69 74 5f 68 6f 6f 6b 28 70 44 62 2d 3e 64  mmit_hook(pDb->d
10130 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  b, 0, 0);.      
10140 7d 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61  }.    }.    brea
10150 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20  k;.  }..  /*    
10160 24 64 62 20 63 6f 6d 70 6c 65 74 65 20 53 51 4c  $db complete SQL
10170 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72  .  **.  ** Retur
10180 6e 20 54 52 55 45 20 69 66 20 53 51 4c 20 69 73  n TRUE if SQL is
10190 20 61 20 63 6f 6d 70 6c 65 74 65 20 53 51 4c 20   a complete SQL 
101a0 73 74 61 74 65 6d 65 6e 74 2e 20 20 52 65 74 75  statement.  Retu
101b0 72 6e 20 46 41 4c 53 45 20 69 66 0a 20 20 2a 2a  rn FALSE if.  **
101c0 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 69 6e 65   additional line
101d0 73 20 6f 66 20 69 6e 70 75 74 20 61 72 65 20 6e  s of input are n
101e0 65 65 64 65 64 2e 20 20 54 68 69 73 20 69 73 20  eeded.  This is 
101f0 73 69 6d 69 6c 61 72 20 74 6f 20 74 68 65 0a 20  similar to the. 
10200 20 2a 2a 20 62 75 69 6c 74 2d 69 6e 20 22 69 6e   ** built-in "in
10210 66 6f 20 63 6f 6d 70 6c 65 74 65 22 20 63 6f 6d  fo complete" com
10220 6d 61 6e 64 20 6f 66 20 54 63 6c 2e 0a 20 20 2a  mand of Tcl..  *
10230 2f 0a 20 20 63 61 73 65 20 44 42 5f 43 4f 4d 50  /.  case DB_COMP
10240 4c 45 54 45 3a 20 7b 0a 23 69 66 6e 64 65 66 20  LETE: {.#ifndef 
10250 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50  SQLITE_OMIT_COMP
10260 4c 45 54 45 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  LETE.    Tcl_Obj
10270 20 2a 70 52 65 73 75 6c 74 3b 0a 20 20 20 20 69   *pResult;.    i
10280 6e 74 20 69 73 43 6f 6d 70 6c 65 74 65 3b 0a 20  nt isComplete;. 
10290 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29     if( objc!=3 )
102a0 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e  {.      Tcl_Wron
102b0 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
102c0 20 32 2c 20 6f 62 6a 76 2c 20 22 53 51 4c 22 29   2, objv, "SQL")
102d0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
102e0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
102f0 20 20 20 20 69 73 43 6f 6d 70 6c 65 74 65 20 3d      isComplete =
10300 20 73 71 6c 69 74 65 33 5f 63 6f 6d 70 6c 65 74   sqlite3_complet
10310 65 28 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  e( Tcl_GetString
10320 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c  FromObj(objv[2],
10330 20 30 29 20 29 3b 0a 20 20 20 20 70 52 65 73 75   0) );.    pResu
10340 6c 74 20 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52  lt = Tcl_GetObjR
10350 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20  esult(interp);. 
10360 20 20 20 54 63 6c 5f 53 65 74 42 6f 6f 6c 65 61     Tcl_SetBoolea
10370 6e 4f 62 6a 28 70 52 65 73 75 6c 74 2c 20 69 73  nObj(pResult, is
10380 43 6f 6d 70 6c 65 74 65 29 3b 0a 23 65 6e 64 69  Complete);.#endi
10390 66 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  f.    break;.  }
103a0 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 63 6f  ..  /*    $db co
103b0 70 79 20 63 6f 6e 66 6c 69 63 74 2d 61 6c 67 6f  py conflict-algo
103c0 72 69 74 68 6d 20 74 61 62 6c 65 20 66 69 6c 65  rithm table file
103d0 6e 61 6d 65 20 3f 53 45 50 41 52 41 54 4f 52 3f  name ?SEPARATOR?
103e0 20 3f 4e 55 4c 4c 49 4e 44 49 43 41 54 4f 52 3f   ?NULLINDICATOR?
103f0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 6f 70 79 20  .  **.  ** Copy 
10400 64 61 74 61 20 69 6e 74 6f 20 74 61 62 6c 65 20  data into table 
10410 66 72 6f 6d 20 66 69 6c 65 6e 61 6d 65 2c 20 6f  from filename, o
10420 70 74 69 6f 6e 61 6c 6c 79 20 75 73 69 6e 67 20  ptionally using 
10430 53 45 50 41 52 41 54 4f 52 0a 20 20 2a 2a 20 61  SEPARATOR.  ** a
10440 73 20 63 6f 6c 75 6d 6e 20 73 65 70 61 72 61 74  s column separat
10450 6f 72 73 2e 20 20 49 66 20 61 20 63 6f 6c 75 6d  ors.  If a colum
10460 6e 20 63 6f 6e 74 61 69 6e 73 20 61 20 6e 75 6c  n contains a nul
10470 6c 20 73 74 72 69 6e 67 2c 20 6f 72 20 74 68 65  l string, or the
10480 0a 20 20 2a 2a 20 76 61 6c 75 65 20 6f 66 20 4e  .  ** value of N
10490 55 4c 4c 49 4e 44 49 43 41 54 4f 52 2c 20 61 20  ULLINDICATOR, a 
104a0 4e 55 4c 4c 20 69 73 20 69 6e 73 65 72 74 65 64  NULL is inserted
104b0 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 2e   for the column.
104c0 0a 20 20 2a 2a 20 63 6f 6e 66 6c 69 63 74 2d 61  .  ** conflict-a
104d0 6c 67 6f 72 69 74 68 6d 20 69 73 20 6f 6e 65 20  lgorithm is one 
104e0 6f 66 20 74 68 65 20 73 71 6c 69 74 65 20 63 6f  of the sqlite co
104f0 6e 66 6c 69 63 74 20 61 6c 67 6f 72 69 74 68 6d  nflict algorithm
10500 73 3a 0a 20 20 2a 2a 20 20 20 20 72 6f 6c 6c 62  s:.  **    rollb
10510 61 63 6b 2c 20 61 62 6f 72 74 2c 20 66 61 69 6c  ack, abort, fail
10520 2c 20 69 67 6e 6f 72 65 2c 20 72 65 70 6c 61 63  , ignore, replac
10530 65 0a 20 20 2a 2a 20 4f 6e 20 73 75 63 63 65 73  e.  ** On succes
10540 73 2c 20 72 65 74 75 72 6e 20 74 68 65 20 6e 75  s, return the nu
10550 6d 62 65 72 20 6f 66 20 6c 69 6e 65 73 20 70 72  mber of lines pr
10560 6f 63 65 73 73 65 64 2c 20 6e 6f 74 20 6e 65 63  ocessed, not nec
10570 65 73 73 61 72 69 6c 79 20 73 61 6d 65 0a 20 20  essarily same.  
10580 2a 2a 20 61 73 20 27 64 62 20 63 68 61 6e 67 65  ** as 'db change
10590 73 27 20 64 75 65 20 74 6f 20 63 6f 6e 66 6c 69  s' due to confli
105a0 63 74 2d 61 6c 67 6f 72 69 74 68 6d 20 73 65 6c  ct-algorithm sel
105b0 65 63 74 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  ected..  **.  **
105c0 20 54 68 69 73 20 63 6f 64 65 20 69 73 20 62 61   This code is ba
105d0 73 69 63 61 6c 6c 79 20 61 6e 20 69 6d 70 6c 65  sically an imple
105e0 6d 65 6e 74 61 74 69 6f 6e 2f 65 6e 68 61 6e 63  mentation/enhanc
105f0 65 6d 65 6e 74 20 6f 66 0a 20 20 2a 2a 20 74 68  ement of.  ** th
10600 65 20 73 71 6c 69 74 65 33 20 73 68 65 6c 6c 2e  e sqlite3 shell.
10610 63 20 22 2e 69 6d 70 6f 72 74 22 20 63 6f 6d 6d  c ".import" comm
10620 61 6e 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  and..  **.  ** T
10630 68 69 73 20 63 6f 6d 6d 61 6e 64 20 75 73 61 67  his command usag
10640 65 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20  e is equivalent 
10650 74 6f 20 74 68 65 20 73 71 6c 69 74 65 32 2e 78  to the sqlite2.x
10660 20 43 4f 50 59 20 73 74 61 74 65 6d 65 6e 74 2c   COPY statement,
10670 0a 20 20 2a 2a 20 77 68 69 63 68 20 69 6d 70 6f  .  ** which impo
10680 72 74 73 20 66 69 6c 65 20 64 61 74 61 20 69 6e  rts file data in
10690 74 6f 20 61 20 74 61 62 6c 65 20 75 73 69 6e 67  to a table using
106a0 20 74 68 65 20 50 6f 73 74 67 72 65 53 51 4c 20   the PostgreSQL 
106b0 43 4f 50 59 20 66 69 6c 65 20 66 6f 72 6d 61 74  COPY file format
106c0 3a 0a 20 20 2a 2a 20 20 20 24 64 62 20 63 6f 70  :.  **   $db cop
106d0 79 20 24 63 6f 6e 66 6c 69 74 5f 61 6c 67 6f 20  y $conflit_algo 
106e0 24 74 61 62 6c 65 5f 6e 61 6d 65 20 24 66 69 6c  $table_name $fil
106f0 65 6e 61 6d 65 20 5c 74 20 5c 5c 4e 0a 20 20 2a  ename \t \\N.  *
10700 2f 0a 20 20 63 61 73 65 20 44 42 5f 43 4f 50 59  /.  case DB_COPY
10710 3a 20 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 54  : {.    char *zT
10720 61 62 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20  able;           
10730 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 64 61      /* Insert da
10740 74 61 20 69 6e 74 6f 20 74 68 69 73 20 74 61 62  ta into this tab
10750 6c 65 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a  le */.    char *
10760 7a 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20  zFile;          
10770 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c        /* The fil
10780 65 20 66 72 6f 6d 20 77 68 69 63 68 20 74 6f 20  e from which to 
10790 65 78 74 72 61 63 74 20 64 61 74 61 20 2a 2f 0a  extract data */.
107a0 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6e 66 6c      char *zConfl
107b0 69 63 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ict;            
107c0 2f 2a 20 54 68 65 20 63 6f 6e 66 6c 69 63 74 20  /* The conflict 
107d0 61 6c 67 6f 72 69 74 68 6d 20 74 6f 20 75 73 65  algorithm to use
107e0 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   */.    sqlite3_
107f0 73 74 6d 74 20 2a 70 53 74 6d 74 3b 20 20 20 20  stmt *pStmt;    
10800 20 20 20 20 2f 2a 20 41 20 73 74 61 74 65 6d 65      /* A stateme
10810 6e 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 43  nt */.    int nC
10820 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ol;             
10830 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
10840 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  of columns in th
10850 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 69  e table */.    i
10860 6e 74 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20  nt nByte;       
10870 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
10880 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
10890 20 61 6e 20 53 51 4c 20 73 74 72 69 6e 67 20 2a   an SQL string *
108a0 2f 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 20  /.    int i, j; 
108b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
108c0 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
108d0 72 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53  rs */.    int nS
108e0 65 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ep;             
108f0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
10900 6f 66 20 62 79 74 65 73 20 69 6e 20 7a 53 65 70  of bytes in zSep
10910 5b 5d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 4e  [] */.    int nN
10920 75 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  ull;            
10930 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
10940 6f 66 20 62 79 74 65 73 20 69 6e 20 7a 4e 75 6c  of bytes in zNul
10950 6c 5b 5d 20 2a 2f 0a 20 20 20 20 63 68 61 72 20  l[] */.    char 
10960 2a 7a 53 71 6c 3b 20 20 20 20 20 20 20 20 20 20  *zSql;          
10970 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 53 51 4c         /* An SQL
10980 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
10990 20 20 63 68 61 72 20 2a 7a 4c 69 6e 65 3b 20 20    char *zLine;  
109a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
109b0 20 41 20 73 69 6e 67 6c 65 20 6c 69 6e 65 20 6f   A single line o
109c0 66 20 69 6e 70 75 74 20 66 72 6f 6d 20 74 68 65  f input from the
109d0 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 63 68 61   file */.    cha
109e0 72 20 2a 2a 61 7a 43 6f 6c 3b 20 20 20 20 20 20  r **azCol;      
109f0 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 4c 69 6e           /* zLin
10a00 65 5b 5d 20 62 72 6f 6b 65 6e 20 75 70 20 69 6e  e[] broken up in
10a10 74 6f 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20  to columns */.  
10a20 20 20 63 68 61 72 20 2a 7a 43 6f 6d 6d 69 74 3b    char *zCommit;
10a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10a40 20 48 6f 77 20 74 6f 20 63 6f 6d 6d 69 74 20 63   How to commit c
10a50 68 61 6e 67 65 73 20 2a 2f 0a 20 20 20 20 46 49  hanges */.    FI
10a60 4c 45 20 2a 69 6e 3b 20 20 20 20 20 20 20 20 20  LE *in;         
10a70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
10a80 20 69 6e 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20   input file */. 
10a90 20 20 20 69 6e 74 20 6c 69 6e 65 6e 6f 20 3d 20     int lineno = 
10aa0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
10ab0 2a 20 4c 69 6e 65 20 6e 75 6d 62 65 72 20 6f 66  * Line number of
10ac0 20 69 6e 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20   input file */. 
10ad0 20 20 20 63 68 61 72 20 7a 4c 69 6e 65 4e 75 6d     char zLineNum
10ae0 5b 38 30 5d 3b 20 20 20 20 20 20 20 20 20 20 2f  [80];          /
10af0 2a 20 4c 69 6e 65 20 6e 75 6d 62 65 72 20 70 72  * Line number pr
10b00 69 6e 74 20 62 75 66 66 65 72 20 2a 2f 0a 20 20  int buffer */.  
10b10 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 73 75    Tcl_Obj *pResu
10b20 6c 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  lt;           /*
10b30 20 69 6e 74 65 72 70 20 72 65 73 75 6c 74 20 2a   interp result *
10b40 2f 0a 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 65  /..    char *zSe
10b50 70 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4e 75  p;.    char *zNu
10b60 6c 6c 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63  ll;.    if( objc
10b70 3c 35 20 7c 7c 20 6f 62 6a 63 3e 37 20 29 7b 0a  <5 || objc>7 ){.
10b80 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
10b90 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
10ba0 2c 20 6f 62 6a 76 2c 20 0a 20 20 20 20 20 20 20  , objv, .       
10bb0 20 20 22 43 4f 4e 46 4c 49 43 54 2d 41 4c 47 4f    "CONFLICT-ALGO
10bc0 52 49 54 48 4d 20 54 41 42 4c 45 20 46 49 4c 45  RITHM TABLE FILE
10bd0 4e 41 4d 45 20 3f 53 45 50 41 52 41 54 4f 52 3f  NAME ?SEPARATOR?
10be0 20 3f 4e 55 4c 4c 49 4e 44 49 43 41 54 4f 52 3f   ?NULLINDICATOR?
10bf0 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
10c00 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
10c10 7d 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 3d  }.    if( objc>=
10c20 36 20 29 7b 0a 20 20 20 20 20 20 7a 53 65 70 20  6 ){.      zSep 
10c30 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  = Tcl_GetStringF
10c40 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 35 5d 2c 20  romObj(objv[5], 
10c50 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  0);.    }else{. 
10c60 20 20 20 20 20 7a 53 65 70 20 3d 20 22 5c 74 22       zSep = "\t"
10c70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
10c80 6f 62 6a 63 3e 3d 37 20 29 7b 0a 20 20 20 20 20  objc>=7 ){.     
10c90 20 7a 4e 75 6c 6c 20 3d 20 54 63 6c 5f 47 65 74   zNull = Tcl_Get
10ca0 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
10cb0 6a 76 5b 36 5d 2c 20 30 29 3b 0a 20 20 20 20 7d  jv[6], 0);.    }
10cc0 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 4e 75 6c  else{.      zNul
10cd0 6c 20 3d 20 22 22 3b 0a 20 20 20 20 7d 0a 20 20  l = "";.    }.  
10ce0 20 20 7a 43 6f 6e 66 6c 69 63 74 20 3d 20 54 63    zConflict = Tc
10cf0 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
10d00 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30 29 3b 0a  bj(objv[2], 0);.
10d10 20 20 20 20 7a 54 61 62 6c 65 20 3d 20 54 63 6c      zTable = Tcl
10d20 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
10d30 6a 28 6f 62 6a 76 5b 33 5d 2c 20 30 29 3b 0a 20  j(objv[3], 0);. 
10d40 20 20 20 7a 46 69 6c 65 20 3d 20 54 63 6c 5f 47     zFile = Tcl_G
10d50 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
10d60 6f 62 6a 76 5b 34 5d 2c 20 30 29 3b 0a 20 20 20  objv[4], 0);.   
10d70 20 6e 53 65 70 20 3d 20 73 74 72 6c 65 6e 33 30   nSep = strlen30
10d80 28 7a 53 65 70 29 3b 0a 20 20 20 20 6e 4e 75 6c  (zSep);.    nNul
10d90 6c 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 4e 75  l = strlen30(zNu
10da0 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 6e 53 65  ll);.    if( nSe
10db0 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 54 63  p==0 ){.      Tc
10dc0 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
10dd0 6e 74 65 72 70 2c 22 45 72 72 6f 72 3a 20 6e 6f  nterp,"Error: no
10de0 6e 2d 6e 75 6c 6c 20 73 65 70 61 72 61 74 6f 72  n-null separator
10df0 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 63 6f   required for co
10e00 70 79 22 2c 30 29 3b 0a 20 20 20 20 20 20 72 65  py",0);.      re
10e10 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
10e20 20 20 20 20 7d 0a 20 20 20 20 69 66 28 73 74 72      }.    if(str
10e30 63 6d 70 28 7a 43 6f 6e 66 6c 69 63 74 2c 20 22  cmp(zConflict, "
10e40 72 6f 6c 6c 62 61 63 6b 22 29 20 21 3d 20 30 20  rollback") != 0 
10e50 26 26 0a 20 20 20 20 20 20 20 73 74 72 63 6d 70  &&.       strcmp
10e60 28 7a 43 6f 6e 66 6c 69 63 74 2c 20 22 61 62 6f  (zConflict, "abo
10e70 72 74 22 20 20 20 29 20 21 3d 20 30 20 26 26 0a  rt"   ) != 0 &&.
10e80 20 20 20 20 20 20 20 73 74 72 63 6d 70 28 7a 43         strcmp(zC
10e90 6f 6e 66 6c 69 63 74 2c 20 22 66 61 69 6c 22 20  onflict, "fail" 
10ea0 20 20 20 29 20 21 3d 20 30 20 26 26 0a 20 20 20     ) != 0 &&.   
10eb0 20 20 20 20 73 74 72 63 6d 70 28 7a 43 6f 6e 66      strcmp(zConf
10ec0 6c 69 63 74 2c 20 22 69 67 6e 6f 72 65 22 20 20  lict, "ignore"  
10ed0 29 20 21 3d 20 30 20 26 26 0a 20 20 20 20 20 20  ) != 0 &&.      
10ee0 20 73 74 72 63 6d 70 28 7a 43 6f 6e 66 6c 69 63   strcmp(zConflic
10ef0 74 2c 20 22 72 65 70 6c 61 63 65 22 20 29 20 21  t, "replace" ) !
10f00 3d 20 30 20 29 20 7b 0a 20 20 20 20 20 20 54 63  = 0 ) {.      Tc
10f10 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
10f20 6e 74 65 72 70 2c 20 22 45 72 72 6f 72 3a 20 5c  nterp, "Error: \
10f30 22 22 2c 20 7a 43 6f 6e 66 6c 69 63 74 2c 20 0a  "", zConflict, .
10f40 20 20 20 20 20 20 20 20 20 20 20 20 22 5c 22 2c              "\",
10f50 20 63 6f 6e 66 6c 69 63 74 2d 61 6c 67 6f 72 69   conflict-algori
10f60 74 68 6d 20 6d 75 73 74 20 62 65 20 6f 6e 65 20  thm must be one 
10f70 6f 66 3a 20 72 6f 6c 6c 62 61 63 6b 2c 20 22 0a  of: rollback, ".
10f80 20 20 20 20 20 20 20 20 20 20 20 20 22 61 62 6f              "abo
10f90 72 74 2c 20 66 61 69 6c 2c 20 69 67 6e 6f 72 65  rt, fail, ignore
10fa0 2c 20 6f 72 20 72 65 70 6c 61 63 65 22 2c 20 30  , or replace", 0
10fb0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
10fc0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
10fd0 0a 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69  .    zSql = sqli
10fe0 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c  te3_mprintf("SEL
10ff0 45 43 54 20 2a 20 46 52 4f 4d 20 27 25 71 27 22  ECT * FROM '%q'"
11000 2c 20 7a 54 61 62 6c 65 29 3b 0a 20 20 20 20 69  , zTable);.    i
11010 66 28 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20  f( zSql==0 ){.  
11020 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
11030 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 45 72  sult(interp, "Er
11040 72 6f 72 3a 20 6e 6f 20 73 75 63 68 20 74 61 62  ror: no such tab
11050 6c 65 3a 20 22 2c 20 7a 54 61 62 6c 65 2c 20 30  le: ", zTable, 0
11060 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
11070 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
11080 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 73 74 72  .    nByte = str
11090 6c 65 6e 33 30 28 7a 53 71 6c 29 3b 0a 20 20 20  len30(zSql);.   
110a0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72   rc = sqlite3_pr
110b0 65 70 61 72 65 28 70 44 62 2d 3e 64 62 2c 20 7a  epare(pDb->db, z
110c0 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c  Sql, -1, &pStmt,
110d0 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
110e0 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20  _free(zSql);.   
110f0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
11100 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
11110 74 28 69 6e 74 65 72 70 2c 20 22 45 72 72 6f 72  t(interp, "Error
11120 3a 20 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  : ", sqlite3_err
11130 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c 20 30 29  msg(pDb->db), 0)
11140 3b 0a 20 20 20 20 20 20 6e 43 6f 6c 20 3d 20 30  ;.      nCol = 0
11150 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
11160 20 20 20 6e 43 6f 6c 20 3d 20 73 71 6c 69 74 65     nCol = sqlite
11170 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70  3_column_count(p
11180 53 74 6d 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Stmt);.    }.   
11190 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
111a0 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 69 66  e(pStmt);.    if
111b0 28 20 6e 43 6f 6c 3d 3d 30 20 29 20 7b 0a 20 20  ( nCol==0 ) {.  
111c0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
111d0 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
111e0 7a 53 71 6c 20 3d 20 6d 61 6c 6c 6f 63 28 20 6e  zSql = malloc( n
111f0 42 79 74 65 20 2b 20 35 30 20 2b 20 6e 43 6f 6c  Byte + 50 + nCol
11200 2a 32 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 53  *2 );.    if( zS
11210 71 6c 3d 3d 30 20 29 20 7b 0a 20 20 20 20 20 20  ql==0 ) {.      
11220 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
11230 28 69 6e 74 65 72 70 2c 20 22 45 72 72 6f 72 3a  (interp, "Error:
11240 20 63 61 6e 27 74 20 6d 61 6c 6c 6f 63 28 29 22   can't malloc()"
11250 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75  , 0);.      retu
11260 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
11270 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
11280 73 6e 70 72 69 6e 74 66 28 6e 42 79 74 65 2b 35  snprintf(nByte+5
11290 30 2c 20 7a 53 71 6c 2c 20 22 49 4e 53 45 52 54  0, zSql, "INSERT
112a0 20 4f 52 20 25 71 20 49 4e 54 4f 20 27 25 71 27   OR %q INTO '%q'
112b0 20 56 41 4c 55 45 53 28 3f 22 2c 0a 20 20 20 20   VALUES(?",.    
112c0 20 20 20 20 20 7a 43 6f 6e 66 6c 69 63 74 2c 20       zConflict, 
112d0 7a 54 61 62 6c 65 29 3b 0a 20 20 20 20 6a 20 3d  zTable);.    j =
112e0 20 73 74 72 6c 65 6e 33 30 28 7a 53 71 6c 29 3b   strlen30(zSql);
112f0 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c  .    for(i=1; i<
11300 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
11310 20 20 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d 20 27 2c    zSql[j++] = ',
11320 27 3b 0a 20 20 20 20 20 20 7a 53 71 6c 5b 6a 2b  ';.      zSql[j+
11330 2b 5d 20 3d 20 27 3f 27 3b 0a 20 20 20 20 7d 0a  +] = '?';.    }.
11340 20 20 20 20 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d 20      zSql[j++] = 
11350 27 29 27 3b 0a 20 20 20 20 7a 53 71 6c 5b 6a 5d  ')';.    zSql[j]
11360 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 73   = 0;.    rc = s
11370 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28 70  qlite3_prepare(p
11380 44 62 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31  Db->db, zSql, -1
11390 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20  , &pStmt, 0);.  
113a0 20 20 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20    free(zSql);.  
113b0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
113c0 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
113d0 6c 74 28 69 6e 74 65 72 70 2c 20 22 45 72 72 6f  lt(interp, "Erro
113e0 72 3a 20 22 2c 20 73 71 6c 69 74 65 33 5f 65 72  r: ", sqlite3_er
113f0 72 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c 20 30  rmsg(pDb->db), 0
11400 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
11410 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
11420 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
11430 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
11440 20 20 20 20 69 6e 20 3d 20 66 6f 70 65 6e 28 7a      in = fopen(z
11450 46 69 6c 65 2c 20 22 72 62 22 29 3b 0a 20 20 20  File, "rb");.   
11460 20 69 66 28 20 69 6e 3d 3d 30 20 29 7b 0a 20 20   if( in==0 ){.  
11470 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
11480 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 45 72  sult(interp, "Er
11490 72 6f 72 3a 20 63 61 6e 6e 6f 74 20 6f 70 65 6e  ror: cannot open
114a0 20 66 69 6c 65 3a 20 22 2c 20 7a 46 69 6c 65 2c   file: ", zFile,
114b0 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 71   NULL);.      sq
114c0 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
114d0 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 72 65 74  Stmt);.      ret
114e0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
114f0 20 20 20 7d 0a 20 20 20 20 61 7a 43 6f 6c 20 3d     }.    azCol =
11500 20 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28   malloc( sizeof(
11510 61 7a 43 6f 6c 5b 30 5d 29 2a 28 6e 43 6f 6c 2b  azCol[0])*(nCol+
11520 31 29 20 29 3b 0a 20 20 20 20 69 66 28 20 61 7a  1) );.    if( az
11530 43 6f 6c 3d 3d 30 20 29 20 7b 0a 20 20 20 20 20  Col==0 ) {.     
11540 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
11550 74 28 69 6e 74 65 72 70 2c 20 22 45 72 72 6f 72  t(interp, "Error
11560 3a 20 63 61 6e 27 74 20 6d 61 6c 6c 6f 63 28 29  : can't malloc()
11570 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 66 63 6c  ", 0);.      fcl
11580 6f 73 65 28 69 6e 29 3b 0a 20 20 20 20 20 20 72  ose(in);.      r
11590 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
115a0 0a 20 20 20 20 7d 0a 20 20 20 20 28 76 6f 69 64  .    }.    (void
115b0 29 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 44  )sqlite3_exec(pD
115c0 62 2d 3e 64 62 2c 20 22 42 45 47 49 4e 22 2c 20  b->db, "BEGIN", 
115d0 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7a 43  0, 0, 0);.    zC
115e0 6f 6d 6d 69 74 20 3d 20 22 43 4f 4d 4d 49 54 22  ommit = "COMMIT"
115f0 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 7a 4c  ;.    while( (zL
11600 69 6e 65 20 3d 20 6c 6f 63 61 6c 5f 67 65 74 6c  ine = local_getl
11610 69 6e 65 28 30 2c 20 69 6e 29 29 21 3d 30 20 29  ine(0, in))!=0 )
11620 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 3b  {.      char *z;
11630 0a 20 20 20 20 20 20 6c 69 6e 65 6e 6f 2b 2b 3b  .      lineno++;
11640 0a 20 20 20 20 20 20 61 7a 43 6f 6c 5b 30 5d 20  .      azCol[0] 
11650 3d 20 7a 4c 69 6e 65 3b 0a 20 20 20 20 20 20 66  = zLine;.      f
11660 6f 72 28 69 3d 30 2c 20 7a 3d 7a 4c 69 6e 65 3b  or(i=0, z=zLine;
11670 20 2a 7a 3b 20 7a 2b 2b 29 7b 0a 20 20 20 20 20   *z; z++){.     
11680 20 20 20 69 66 28 20 2a 7a 3d 3d 7a 53 65 70 5b     if( *z==zSep[
11690 30 5d 20 26 26 20 73 74 72 6e 63 6d 70 28 7a 2c  0] && strncmp(z,
116a0 20 7a 53 65 70 2c 20 6e 53 65 70 29 3d 3d 30 20   zSep, nSep)==0 
116b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 7a 20  ){.          *z 
116c0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69  = 0;.          i
116d0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ++;.          if
116e0 28 20 69 3c 6e 43 6f 6c 20 29 7b 0a 20 20 20 20  ( i<nCol ){.    
116f0 20 20 20 20 20 20 20 20 61 7a 43 6f 6c 5b 69 5d          azCol[i]
11700 20 3d 20 26 7a 5b 6e 53 65 70 5d 3b 0a 20 20 20   = &z[nSep];.   
11710 20 20 20 20 20 20 20 20 20 7a 20 2b 3d 20 6e 53           z += nS
11720 65 70 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20  ep-1;.          
11730 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
11740 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 2b    }.      if( i+
11750 31 21 3d 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20  1!=nCol ){.     
11760 20 20 20 63 68 61 72 20 2a 7a 45 72 72 3b 0a 20     char *zErr;. 
11770 20 20 20 20 20 20 20 69 6e 74 20 6e 45 72 72 20         int nErr 
11780 3d 20 73 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65  = strlen30(zFile
11790 29 20 2b 20 32 30 30 3b 0a 20 20 20 20 20 20 20  ) + 200;.       
117a0 20 7a 45 72 72 20 3d 20 6d 61 6c 6c 6f 63 28 6e   zErr = malloc(n
117b0 45 72 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66  Err);.        if
117c0 28 20 7a 45 72 72 20 29 7b 0a 20 20 20 20 20 20  ( zErr ){.      
117d0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
117e0 69 6e 74 66 28 6e 45 72 72 2c 20 7a 45 72 72 2c  intf(nErr, zErr,
117f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 22 45  .             "E
11800 72 72 6f 72 3a 20 25 73 20 6c 69 6e 65 20 25 64  rror: %s line %d
11810 3a 20 65 78 70 65 63 74 65 64 20 25 64 20 63 6f  : expected %d co
11820 6c 75 6d 6e 73 20 6f 66 20 64 61 74 61 20 62 75  lumns of data bu
11830 74 20 66 6f 75 6e 64 20 25 64 22 2c 0a 20 20 20  t found %d",.   
11840 20 20 20 20 20 20 20 20 20 20 7a 46 69 6c 65 2c            zFile,
11850 20 6c 69 6e 65 6e 6f 2c 20 6e 43 6f 6c 2c 20 69   lineno, nCol, i
11860 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 54  +1);.          T
11870 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
11880 69 6e 74 65 72 70 2c 20 7a 45 72 72 2c 20 30 29  interp, zErr, 0)
11890 3b 0a 20 20 20 20 20 20 20 20 20 20 66 72 65 65  ;.          free
118a0 28 7a 45 72 72 29 3b 0a 20 20 20 20 20 20 20 20  (zErr);.        
118b0 7d 0a 20 20 20 20 20 20 20 20 7a 43 6f 6d 6d 69  }.        zCommi
118c0 74 20 3d 20 22 52 4f 4c 4c 42 41 43 4b 22 3b 0a  t = "ROLLBACK";.
118d0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
118e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72       }.      for
118f0 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b  (i=0; i<nCol; i+
11900 2b 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 63  +){.        /* c
11910 68 65 63 6b 20 66 6f 72 20 6e 75 6c 6c 20 64 61  heck for null da
11920 74 61 2c 20 69 66 20 73 6f 2c 20 62 69 6e 64 20  ta, if so, bind 
11930 61 73 20 6e 75 6c 6c 20 2a 2f 0a 20 20 20 20 20  as null */.     
11940 20 20 20 69 66 28 20 28 6e 4e 75 6c 6c 3e 30 20     if( (nNull>0 
11950 26 26 20 73 74 72 63 6d 70 28 61 7a 43 6f 6c 5b  && strcmp(azCol[
11960 69 5d 2c 20 7a 4e 75 6c 6c 29 3d 3d 30 29 0a 20  i], zNull)==0). 
11970 20 20 20 20 20 20 20 20 20 7c 7c 20 73 74 72 6c           || strl
11980 65 6e 33 30 28 61 7a 43 6f 6c 5b 69 5d 29 3d 3d  en30(azCol[i])==
11990 30 20 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  0 .        ){.  
119a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
119b0 62 69 6e 64 5f 6e 75 6c 6c 28 70 53 74 6d 74 2c  bind_null(pStmt,
119c0 20 69 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 7d   i+1);.        }
119d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
119e0 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78  sqlite3_bind_tex
119f0 74 28 70 53 74 6d 74 2c 20 69 2b 31 2c 20 61 7a  t(pStmt, i+1, az
11a00 43 6f 6c 5b 69 5d 2c 20 2d 31 2c 20 53 51 4c 49  Col[i], -1, SQLI
11a10 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  TE_STATIC);.    
11a20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
11a30 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70      sqlite3_step
11a40 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 72  (pStmt);.      r
11a50 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65  c = sqlite3_rese
11a60 74 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20  t(pStmt);.      
11a70 66 72 65 65 28 7a 4c 69 6e 65 29 3b 0a 20 20 20  free(zLine);.   
11a80 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
11a90 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
11aa0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
11ab0 28 69 6e 74 65 72 70 2c 22 45 72 72 6f 72 3a 20  (interp,"Error: 
11ac0 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  ", sqlite3_errms
11ad0 67 28 70 44 62 2d 3e 64 62 29 2c 20 30 29 3b 0a  g(pDb->db), 0);.
11ae0 20 20 20 20 20 20 20 20 7a 43 6f 6d 6d 69 74 20          zCommit 
11af0 3d 20 22 52 4f 4c 4c 42 41 43 4b 22 3b 0a 20 20  = "ROLLBACK";.  
11b00 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
11b10 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66     }.    }.    f
11b20 72 65 65 28 61 7a 43 6f 6c 29 3b 0a 20 20 20 20  ree(azCol);.    
11b30 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 20 20  fclose(in);.    
11b40 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
11b50 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 28 76 6f  (pStmt);.    (vo
11b60 69 64 29 73 71 6c 69 74 65 33 5f 65 78 65 63 28  id)sqlite3_exec(
11b70 70 44 62 2d 3e 64 62 2c 20 7a 43 6f 6d 6d 69 74  pDb->db, zCommit
11b80 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 20  , 0, 0, 0);..   
11b90 20 69 66 28 20 7a 43 6f 6d 6d 69 74 5b 30 5d 20   if( zCommit[0] 
11ba0 3d 3d 20 27 43 27 20 29 7b 0a 20 20 20 20 20 20  == 'C' ){.      
11bb0 2f 2a 20 73 75 63 63 65 73 73 2c 20 73 65 74 20  /* success, set 
11bc0 72 65 73 75 6c 74 20 61 73 20 6e 75 6d 62 65 72  result as number
11bd0 20 6f 66 20 6c 69 6e 65 73 20 70 72 6f 63 65 73   of lines proces
11be0 73 65 64 20 2a 2f 0a 20 20 20 20 20 20 70 52 65  sed */.      pRe
11bf0 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65 74 4f 62  sult = Tcl_GetOb
11c00 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b  jResult(interp);
11c10 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74 49 6e  .      Tcl_SetIn
11c20 74 4f 62 6a 28 70 52 65 73 75 6c 74 2c 20 6c 69  tObj(pResult, li
11c30 6e 65 6e 6f 29 3b 0a 20 20 20 20 20 20 72 63 20  neno);.      rc 
11c40 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 65  = TCL_OK;.    }e
11c50 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 66 61  lse{.      /* fa
11c60 69 6c 75 72 65 2c 20 61 70 70 65 6e 64 20 6c 69  ilure, append li
11c70 6e 65 6e 6f 20 77 68 65 72 65 20 66 61 69 6c 65  neno where faile
11c80 64 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  d */.      sqlit
11c90 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
11ca0 6f 66 28 7a 4c 69 6e 65 4e 75 6d 29 2c 20 7a 4c  of(zLineNum), zL
11cb0 69 6e 65 4e 75 6d 2c 22 25 64 22 2c 6c 69 6e 65  ineNum,"%d",line
11cc0 6e 6f 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 41  no);.      Tcl_A
11cd0 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
11ce0 72 70 2c 22 2c 20 66 61 69 6c 65 64 20 77 68 69  rp,", failed whi
11cf0 6c 65 20 70 72 6f 63 65 73 73 69 6e 67 20 6c 69  le processing li
11d00 6e 65 3a 20 22 2c 7a 4c 69 6e 65 4e 75 6d 2c 30  ne: ",zLineNum,0
11d10 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 54 43  );.      rc = TC
11d20 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
11d30 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
11d40 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 24 64 62 20   /*.  **    $db 
11d50 65 6e 61 62 6c 65 5f 6c 6f 61 64 5f 65 78 74 65  enable_load_exte
11d60 6e 73 69 6f 6e 20 42 4f 4f 4c 45 41 4e 0a 20 20  nsion BOOLEAN.  
11d70 2a 2a 0a 20 20 2a 2a 20 54 75 72 6e 20 74 68 65  **.  ** Turn the
11d80 20 65 78 74 65 6e 73 69 6f 6e 20 6c 6f 61 64 69   extension loadi
11d90 6e 67 20 66 65 61 74 75 72 65 20 6f 6e 20 6f 72  ng feature on or
11da0 20 6f 66 66 2e 20 20 49 74 20 69 66 20 6f 66 66   off.  It if off
11db0 20 62 79 0a 20 20 2a 2a 20 64 65 66 61 75 6c 74   by.  ** default
11dc0 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  ..  */.  case DB
11dd0 5f 45 4e 41 42 4c 45 5f 4c 4f 41 44 5f 45 58 54  _ENABLE_LOAD_EXT
11de0 45 4e 53 49 4f 4e 3a 20 7b 0a 23 69 66 6e 64 65  ENSION: {.#ifnde
11df0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f  f SQLITE_OMIT_LO
11e00 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 20 20 20  AD_EXTENSION.   
11e10 20 69 6e 74 20 6f 6e 6f 66 66 3b 0a 20 20 20 20   int onoff;.    
11e20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20  if( objc!=3 ){. 
11e30 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
11e40 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
11e50 20 6f 62 6a 76 2c 20 22 42 4f 4f 4c 45 41 4e 22   objv, "BOOLEAN"
11e60 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
11e70 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
11e80 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74  .    if( Tcl_Get
11e90 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69  BooleanFromObj(i
11ea0 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20  nterp, objv[2], 
11eb0 26 6f 6e 6f 66 66 29 20 29 7b 0a 20 20 20 20 20  &onoff) ){.     
11ec0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
11ed0 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  R;.    }.    sql
11ee0 69 74 65 33 5f 65 6e 61 62 6c 65 5f 6c 6f 61 64  ite3_enable_load
11ef0 5f 65 78 74 65 6e 73 69 6f 6e 28 70 44 62 2d 3e  _extension(pDb->
11f00 64 62 2c 20 6f 6e 6f 66 66 29 3b 0a 20 20 20 20  db, onoff);.    
11f10 62 72 65 61 6b 3b 0a 23 65 6c 73 65 0a 20 20 20  break;.#else.   
11f20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
11f30 74 28 69 6e 74 65 72 70 2c 20 22 65 78 74 65 6e  t(interp, "exten
11f40 73 69 6f 6e 20 6c 6f 61 64 69 6e 67 20 69 73 20  sion loading is 
11f50 74 75 72 6e 65 64 20 6f 66 66 20 61 74 20 63 6f  turned off at co
11f60 6d 70 69 6c 65 2d 74 69 6d 65 22 2c 0a 20 20 20  mpile-time",.   
11f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11f80 20 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e    0);.    return
11f90 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6e 64   TCL_ERROR;.#end
11fa0 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  if.  }..  /*.  *
11fb0 2a 20 20 20 20 24 64 62 20 65 72 72 6f 72 63 6f  *    $db errorco
11fc0 64 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74  de.  **.  ** Ret
11fd0 75 72 6e 20 74 68 65 20 6e 75 6d 65 72 69 63 20  urn the numeric 
11fe0 65 72 72 6f 72 20 63 6f 64 65 20 74 68 61 74 20  error code that 
11ff0 77 61 73 20 72 65 74 75 72 6e 65 64 20 62 79 20  was returned by 
12000 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 0a  the most recent.
12010 20 20 2a 2a 20 63 61 6c 6c 20 74 6f 20 73 71 6c    ** call to sql
12020 69 74 65 33 5f 65 78 65 63 28 29 2e 0a 20 20 2a  ite3_exec()..  *
12030 2f 0a 20 20 63 61 73 65 20 44 42 5f 45 52 52 4f  /.  case DB_ERRO
12040 52 43 4f 44 45 3a 20 7b 0a 20 20 20 20 54 63 6c  RCODE: {.    Tcl
12050 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
12060 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74  terp, Tcl_NewInt
12070 4f 62 6a 28 73 71 6c 69 74 65 33 5f 65 72 72 63  Obj(sqlite3_errc
12080 6f 64 65 28 70 44 62 2d 3e 64 62 29 29 29 3b 0a  ode(pDb->db)));.
12090 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
120a0 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 24 64 62    /*.  **    $db
120b0 20 65 78 69 73 74 73 20 24 73 71 6c 0a 20 20 2a   exists $sql.  *
120c0 2a 20 20 20 20 24 64 62 20 6f 6e 65 63 6f 6c 75  *    $db onecolu
120d0 6d 6e 20 24 73 71 6c 0a 20 20 2a 2a 0a 20 20 2a  mn $sql.  **.  *
120e0 2a 20 54 68 65 20 6f 6e 65 63 6f 6c 75 6d 6e 20  * The onecolumn 
120f0 6d 65 74 68 6f 64 20 69 73 20 74 68 65 20 65 71  method is the eq
12100 75 69 76 61 6c 65 6e 74 20 6f 66 3a 0a 20 20 2a  uivalent of:.  *
12110 2a 20 20 20 20 20 6c 69 6e 64 65 78 20 5b 24 64  *     lindex [$d
12120 62 20 65 76 61 6c 20 24 73 71 6c 5d 20 30 0a 20  b eval $sql] 0. 
12130 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 45 58   */.  case DB_EX
12140 49 53 54 53 3a 20 0a 20 20 63 61 73 65 20 44 42  ISTS: .  case DB
12150 5f 4f 4e 45 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20  _ONECOLUMN: {.  
12160 20 20 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 20    DbEvalContext 
12170 73 45 76 61 6c 3b 0a 20 20 20 20 69 66 28 20 6f  sEval;.    if( o
12180 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20  bjc!=3 ){.      
12190 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
121a0 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76  (interp, 2, objv
121b0 2c 20 22 53 51 4c 22 29 3b 0a 20 20 20 20 20 20  , "SQL");.      
121c0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
121d0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 62 45  ;.    }..    dbE
121e0 76 61 6c 49 6e 69 74 28 26 73 45 76 61 6c 2c 20  valInit(&sEval, 
121f0 70 44 62 2c 20 6f 62 6a 76 5b 32 5d 2c 20 30 29  pDb, objv[2], 0)
12200 3b 0a 20 20 20 20 72 63 20 3d 20 64 62 45 76 61  ;.    rc = dbEva
12210 6c 53 74 65 70 28 26 73 45 76 61 6c 29 3b 0a 20  lStep(&sEval);. 
12220 20 20 20 69 66 28 20 63 68 6f 69 63 65 3d 3d 44     if( choice==D
12230 42 5f 4f 4e 45 43 4f 4c 55 4d 4e 20 29 7b 0a 20  B_ONECOLUMN ){. 
12240 20 20 20 20 20 69 66 28 20 72 63 3d 3d 54 43 4c       if( rc==TCL
12250 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 54  _OK ){.        T
12260 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
12270 69 6e 74 65 72 70 2c 20 64 62 45 76 61 6c 43 6f  interp, dbEvalCo
12280 6c 75 6d 6e 56 61 6c 75 65 28 26 73 45 76 61 6c  lumnValue(&sEval
12290 2c 20 30 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c  , 0));.      }el
122a0 73 65 20 69 66 28 20 72 63 3d 3d 54 43 4c 5f 42  se if( rc==TCL_B
122b0 52 45 41 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  REAK ){.        
122c0 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28  Tcl_ResetResult(
122d0 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 20 20 7d  interp);.      }
122e0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72  .    }else if( r
122f0 63 3d 3d 54 43 4c 5f 42 52 45 41 4b 20 7c 7c 20  c==TCL_BREAK || 
12300 72 63 3d 3d 54 43 4c 5f 4f 4b 20 29 7b 0a 20 20  rc==TCL_OK ){.  
12310 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65      Tcl_SetObjRe
12320 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
12330 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28 72  _NewBooleanObj(r
12340 63 3d 3d 54 43 4c 5f 4f 4b 29 29 3b 0a 20 20 20  c==TCL_OK));.   
12350 20 7d 0a 20 20 20 20 64 62 45 76 61 6c 46 69 6e   }.    dbEvalFin
12360 61 6c 69 7a 65 28 26 73 45 76 61 6c 29 3b 0a 0a  alize(&sEval);..
12370 20 20 20 20 69 66 28 20 72 63 3d 3d 54 43 4c 5f      if( rc==TCL_
12380 42 52 45 41 4b 20 29 7b 0a 20 20 20 20 20 20 72  BREAK ){.      r
12390 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20  c = TCL_OK;.    
123a0 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  }.    break;.  }
123b0 0a 20 20 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20  .   .  /*.  **  
123c0 20 20 24 64 62 20 65 76 61 6c 20 24 73 71 6c 20    $db eval $sql 
123d0 3f 61 72 72 61 79 3f 20 3f 7b 20 20 2e 2e 2e 63  ?array? ?{  ...c
123e0 6f 64 65 2e 2e 2e 20 7d 3f 0a 20 20 2a 2a 0a 20  ode... }?.  **. 
123f0 20 2a 2a 20 54 68 65 20 53 51 4c 20 73 74 61 74   ** The SQL stat
12400 65 6d 65 6e 74 20 69 6e 20 24 73 71 6c 20 69 73  ement in $sql is
12410 20 65 76 61 6c 75 61 74 65 64 2e 20 20 46 6f 72   evaluated.  For
12420 20 65 61 63 68 20 72 6f 77 2c 20 74 68 65 20 76   each row, the v
12430 61 6c 75 65 73 20 61 72 65 0a 20 20 2a 2a 20 70  alues are.  ** p
12440 6c 61 63 65 64 20 69 6e 20 65 6c 65 6d 65 6e 74  laced in element
12450 73 20 6f 66 20 74 68 65 20 61 72 72 61 79 20 6e  s of the array n
12460 61 6d 65 64 20 22 61 72 72 61 79 22 20 61 6e 64  amed "array" and
12470 20 2e 2e 2e 63 6f 64 65 2e 2e 2e 20 69 73 20 65   ...code... is e
12480 78 65 63 75 74 65 64 2e 0a 20 20 2a 2a 20 49 66  xecuted..  ** If
12490 20 22 61 72 72 61 79 22 20 61 6e 64 20 22 63 6f   "array" and "co
124a0 64 65 22 20 61 72 65 20 6f 6d 69 74 74 65 64 2c  de" are omitted,
124b0 20 74 68 65 6e 20 6e 6f 20 63 61 6c 6c 62 61 63   then no callbac
124c0 6b 20 69 73 20 65 76 65 72 79 20 69 6e 76 6f 6b  k is every invok
124d0 65 64 2e 0a 20 20 2a 2a 20 49 66 20 22 61 72 72  ed..  ** If "arr
124e0 61 79 22 20 69 73 20 61 6e 20 65 6d 70 74 79 20  ay" is an empty 
124f0 73 74 72 69 6e 67 2c 20 74 68 65 6e 20 74 68 65  string, then the
12500 20 76 61 6c 75 65 73 20 61 72 65 20 70 6c 61 63   values are plac
12510 65 64 20 69 6e 20 76 61 72 69 61 62 6c 65 73 0a  ed in variables.
12520 20 20 2a 2a 20 74 68 61 74 20 68 61 76 65 20 74    ** that have t
12530 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 61 73 20  he same name as 
12540 74 68 65 20 66 69 65 6c 64 73 20 65 78 74 72 61  the fields extra
12550 63 74 65 64 20 62 79 20 74 68 65 20 71 75 65 72  cted by the quer
12560 79 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  y..  */.  case D
12570 42 5f 45 56 41 4c 3a 20 7b 0a 20 20 20 20 69 66  B_EVAL: {.    if
12580 28 20 6f 62 6a 63 3c 33 20 7c 7c 20 6f 62 6a 63  ( objc<3 || objc
12590 3e 35 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  >5 ){.      Tcl_
125a0 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
125b0 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 53  erp, 2, objv, "S
125c0 51 4c 20 3f 41 52 52 41 59 2d 4e 41 4d 45 3f 20  QL ?ARRAY-NAME? 
125d0 3f 53 43 52 49 50 54 3f 22 29 3b 0a 20 20 20 20  ?SCRIPT?");.    
125e0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
125f0 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  OR;.    }..    i
12600 66 28 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20 20  f( objc==3 ){.  
12610 20 20 20 20 44 62 45 76 61 6c 43 6f 6e 74 65 78      DbEvalContex
12620 74 20 73 45 76 61 6c 3b 0a 20 20 20 20 20 20 54  t sEval;.      T
12630 63 6c 5f 4f 62 6a 20 2a 70 52 65 74 20 3d 20 54  cl_Obj *pRet = T
12640 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20 20 20  cl_NewObj();.   
12650 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f     Tcl_IncrRefCo
12660 75 6e 74 28 70 52 65 74 29 3b 0a 20 20 20 20 20  unt(pRet);.     
12670 20 64 62 45 76 61 6c 49 6e 69 74 28 26 73 45 76   dbEvalInit(&sEv
12680 61 6c 2c 20 70 44 62 2c 20 6f 62 6a 76 5b 32 5d  al, pDb, objv[2]
12690 2c 20 30 29 3b 0a 20 20 20 20 20 20 77 68 69 6c  , 0);.      whil
126a0 65 28 20 54 43 4c 5f 4f 4b 3d 3d 28 72 63 20 3d  e( TCL_OK==(rc =
126b0 20 64 62 45 76 61 6c 53 74 65 70 28 26 73 45 76   dbEvalStep(&sEv
126c0 61 6c 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20  al)) ){.        
126d0 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20 69  int i;.        i
126e0 6e 74 20 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 20  nt nCol;.       
126f0 20 64 62 45 76 61 6c 52 6f 77 49 6e 66 6f 28 26   dbEvalRowInfo(&
12700 73 45 76 61 6c 2c 20 26 6e 43 6f 6c 2c 20 30 29  sEval, &nCol, 0)
12710 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
12720 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  0; i<nCol; i++){
12730 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 4c  .          Tcl_L
12740 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
12750 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74  ent(interp, pRet
12760 2c 20 64 62 45 76 61 6c 43 6f 6c 75 6d 6e 56 61  , dbEvalColumnVa
12770 6c 75 65 28 26 73 45 76 61 6c 2c 20 69 29 29 3b  lue(&sEval, i));
12780 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
12790 20 7d 0a 20 20 20 20 20 20 64 62 45 76 61 6c 46   }.      dbEvalF
127a0 69 6e 61 6c 69 7a 65 28 26 73 45 76 61 6c 29 3b  inalize(&sEval);
127b0 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 54  .      if( rc==T
127c0 43 4c 5f 42 52 45 41 4b 20 29 7b 0a 20 20 20 20  CL_BREAK ){.    
127d0 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65      Tcl_SetObjRe
127e0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 52 65  sult(interp, pRe
127f0 74 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  t);.        rc =
12800 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d   TCL_OK;.      }
12810 0a 20 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52  .      Tcl_DecrR
12820 65 66 43 6f 75 6e 74 28 70 52 65 74 29 3b 0a 20  efCount(pRet);. 
12830 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
12840 43 6c 69 65 6e 74 44 61 74 61 20 63 64 5b 32 5d  ClientData cd[2]
12850 3b 0a 20 20 20 20 20 20 44 62 45 76 61 6c 43 6f  ;.      DbEvalCo
12860 6e 74 65 78 74 20 2a 70 3b 0a 20 20 20 20 20 20  ntext *p;.      
12870 54 63 6c 5f 4f 62 6a 20 2a 70 41 72 72 61 79 20  Tcl_Obj *pArray 
12880 3d 20 30 3b 0a 20 20 20 20 20 20 54 63 6c 5f 4f  = 0;.      Tcl_O
12890 62 6a 20 2a 70 53 63 72 69 70 74 3b 0a 0a 20 20  bj *pScript;..  
128a0 20 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d 35 20      if( objc==5 
128b0 26 26 20 2a 28 63 68 61 72 20 2a 29 54 63 6c 5f  && *(char *)Tcl_
128c0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33  GetString(objv[3
128d0 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 41  ]) ){.        pA
128e0 72 72 61 79 20 3d 20 6f 62 6a 76 5b 33 5d 3b 0a  rray = objv[3];.
128f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 53        }.      pS
12900 63 72 69 70 74 20 3d 20 6f 62 6a 76 5b 6f 62 6a  cript = objv[obj
12910 63 2d 31 5d 3b 0a 20 20 20 20 20 20 54 63 6c 5f  c-1];.      Tcl_
12920 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 53 63  IncrRefCount(pSc
12930 72 69 70 74 29 3b 0a 20 20 20 20 20 20 0a 20 20  ript);.      .  
12940 20 20 20 20 70 20 3d 20 28 44 62 45 76 61 6c 43      p = (DbEvalC
12950 6f 6e 74 65 78 74 20 2a 29 54 63 6c 5f 41 6c 6c  ontext *)Tcl_All
12960 6f 63 28 73 69 7a 65 6f 66 28 44 62 45 76 61 6c  oc(sizeof(DbEval
12970 43 6f 6e 74 65 78 74 29 29 3b 0a 20 20 20 20 20  Context));.     
12980 20 64 62 45 76 61 6c 49 6e 69 74 28 70 2c 20 70   dbEvalInit(p, p
12990 44 62 2c 20 6f 62 6a 76 5b 32 5d 2c 20 70 41 72  Db, objv[2], pAr
129a0 72 61 79 29 3b 0a 0a 20 20 20 20 20 20 63 64 5b  ray);..      cd[
129b0 30 5d 20 3d 20 28 76 6f 69 64 20 2a 29 70 3b 0a  0] = (void *)p;.
129c0 20 20 20 20 20 20 63 64 5b 31 5d 20 3d 20 28 76        cd[1] = (v
129d0 6f 69 64 20 2a 29 70 53 63 72 69 70 74 3b 0a 20  oid *)pScript;. 
129e0 20 20 20 20 20 72 63 20 3d 20 44 62 45 76 61 6c       rc = DbEval
129f0 4e 65 78 74 43 6d 64 28 63 64 2c 20 69 6e 74 65  NextCmd(cd, inte
12a00 72 70 2c 20 54 43 4c 5f 4f 4b 29 3b 0a 20 20 20  rp, TCL_OK);.   
12a10 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20   }.    break;.  
12a20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20  }..  /*.  **    
12a30 20 24 64 62 20 66 75 6e 63 74 69 6f 6e 20 4e 41   $db function NA
12a40 4d 45 20 5b 2d 61 72 67 63 6f 75 6e 74 20 4e 5d  ME [-argcount N]
12a50 20 53 43 52 49 50 54 0a 20 20 2a 2a 0a 20 20 2a   SCRIPT.  **.  *
12a60 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 53  * Create a new S
12a70 51 4c 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c  QL function call
12a80 65 64 20 4e 41 4d 45 2e 20 20 57 68 65 6e 65 76  ed NAME.  Whenev
12a90 65 72 20 74 68 61 74 20 66 75 6e 63 74 69 6f 6e  er that function
12aa0 20 69 73 0a 20 20 2a 2a 20 63 61 6c 6c 65 64 2c   is.  ** called,
12ab0 20 69 6e 76 6f 6b 65 20 53 43 52 49 50 54 20 74   invoke SCRIPT t
12ac0 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65 20 66  o evaluate the f
12ad0 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20  unction..  */.  
12ae0 63 61 73 65 20 44 42 5f 46 55 4e 43 54 49 4f 4e  case DB_FUNCTION
12af0 3a 20 7b 0a 20 20 20 20 53 71 6c 46 75 6e 63 20  : {.    SqlFunc 
12b00 2a 70 46 75 6e 63 3b 0a 20 20 20 20 54 63 6c 5f  *pFunc;.    Tcl_
12b10 4f 62 6a 20 2a 70 53 63 72 69 70 74 3b 0a 20 20  Obj *pScript;.  
12b20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20    char *zName;. 
12b30 20 20 20 69 6e 74 20 6e 41 72 67 20 3d 20 2d 31     int nArg = -1
12b40 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d  ;.    if( objc==
12b50 36 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  6 ){.      const
12b60 20 63 68 61 72 20 2a 7a 20 3d 20 54 63 6c 5f 47   char *z = Tcl_G
12b70 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d  etString(objv[3]
12b80 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d  );.      int n =
12b90 20 73 74 72 6c 65 6e 33 30 28 7a 29 3b 0a 20 20   strlen30(z);.  
12ba0 20 20 20 20 69 66 28 20 6e 3e 32 20 26 26 20 73      if( n>2 && s
12bb0 74 72 6e 63 6d 70 28 7a 2c 20 22 2d 61 72 67 63  trncmp(z, "-argc
12bc0 6f 75 6e 74 22 2c 6e 29 3d 3d 30 20 29 7b 0a 20  ount",n)==0 ){. 
12bd0 20 20 20 20 20 20 20 69 66 28 20 54 63 6c 5f 47         if( Tcl_G
12be0 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
12bf0 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 26 6e  erp, objv[4], &n
12c00 41 72 67 29 20 29 20 72 65 74 75 72 6e 20 54 43  Arg) ) return TC
12c10 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20  L_ERROR;.       
12c20 20 69 66 28 20 6e 41 72 67 3c 30 20 29 7b 0a 20   if( nArg<0 ){. 
12c30 20 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70           Tcl_App
12c40 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
12c50 2c 20 22 6e 75 6d 62 65 72 20 6f 66 20 61 72 67  , "number of arg
12c60 75 6d 65 6e 74 73 20 6d 75 73 74 20 62 65 20 6e  uments must be n
12c70 6f 6e 2d 6e 65 67 61 74 69 76 65 22 2c 0a 20 20  on-negative",.  
12c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12c90 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29           (char*)
12ca0 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  0);.          re
12cb0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
12cc0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
12cd0 7d 0a 20 20 20 20 20 20 70 53 63 72 69 70 74 20  }.      pScript 
12ce0 3d 20 6f 62 6a 76 5b 35 5d 3b 0a 20 20 20 20 7d  = objv[5];.    }
12cf0 65 6c 73 65 20 69 66 28 20 6f 62 6a 63 21 3d 34  else if( objc!=4
12d00 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72   ){.      Tcl_Wr
12d10 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
12d20 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 4e 41 4d  p, 2, objv, "NAM
12d30 45 20 5b 2d 61 72 67 63 6f 75 6e 74 20 4e 5d 20  E [-argcount N] 
12d40 53 43 52 49 50 54 22 29 3b 0a 20 20 20 20 20 20  SCRIPT");.      
12d50 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
12d60 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
12d70 20 20 20 70 53 63 72 69 70 74 20 3d 20 6f 62 6a     pScript = obj
12d80 76 5b 33 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  v[3];.    }.    
12d90 7a 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53  zName = Tcl_GetS
12da0 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
12db0 76 5b 32 5d 2c 20 30 29 3b 0a 20 20 20 20 70 46  v[2], 0);.    pF
12dc0 75 6e 63 20 3d 20 66 69 6e 64 53 71 6c 46 75 6e  unc = findSqlFun
12dd0 63 28 70 44 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20  c(pDb, zName);. 
12de0 20 20 20 69 66 28 20 70 46 75 6e 63 3d 3d 30 20     if( pFunc==0 
12df0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
12e00 4f 52 3b 0a 20 20 20 20 69 66 28 20 70 46 75 6e  OR;.    if( pFun
12e10 63 2d 3e 70 53 63 72 69 70 74 20 29 7b 0a 20 20  c->pScript ){.  
12e20 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
12e30 6f 75 6e 74 28 70 46 75 6e 63 2d 3e 70 53 63 72  ount(pFunc->pScr
12e40 69 70 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ipt);.    }.    
12e50 70 46 75 6e 63 2d 3e 70 53 63 72 69 70 74 20 3d  pFunc->pScript =
12e60 20 70 53 63 72 69 70 74 3b 0a 20 20 20 20 54 63   pScript;.    Tc
12e70 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70  l_IncrRefCount(p
12e80 53 63 72 69 70 74 29 3b 0a 20 20 20 20 70 46 75  Script);.    pFu
12e90 6e 63 2d 3e 75 73 65 45 76 61 6c 4f 62 6a 76 20  nc->useEvalObjv 
12ea0 3d 20 73 61 66 65 54 6f 55 73 65 45 76 61 6c 4f  = safeToUseEvalO
12eb0 62 6a 76 28 69 6e 74 65 72 70 2c 20 70 53 63 72  bjv(interp, pScr
12ec0 69 70 74 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  ipt);.    rc = s
12ed0 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
12ee0 6e 63 74 69 6f 6e 28 70 44 62 2d 3e 64 62 2c 20  nction(pDb->db, 
12ef0 7a 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 53 51 4c  zName, nArg, SQL
12f00 49 54 45 5f 55 54 46 38 2c 0a 20 20 20 20 20 20  ITE_UTF8,.      
12f10 20 20 70 46 75 6e 63 2c 20 74 63 6c 53 71 6c 46    pFunc, tclSqlF
12f20 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  unc, 0, 0);.    
12f30 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
12f40 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
12f50 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  TCL_ERROR;.     
12f60 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
12f70 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 73  nterp, (char *)s
12f80 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44  qlite3_errmsg(pD
12f90 62 2d 3e 64 62 29 2c 20 54 43 4c 5f 56 4f 4c 41  b->db), TCL_VOLA
12fa0 54 49 4c 45 29 3b 0a 20 20 20 20 7d 0a 20 20 20  TILE);.    }.   
12fb0 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
12fc0 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20 69  *.  **     $db i
12fd0 6e 63 72 62 6c 6f 62 20 3f 2d 72 65 61 64 6f 6e  ncrblob ?-readon
12fe0 6c 79 3f 20 3f 44 42 3f 20 54 41 42 4c 45 20 43  ly? ?DB? TABLE C
12ff0 4f 4c 55 4d 4e 20 52 4f 57 49 44 0a 20 20 2a 2f  OLUMN ROWID.  */
13000 0a 20 20 63 61 73 65 20 44 42 5f 49 4e 43 52 42  .  case DB_INCRB
13010 4c 4f 42 3a 20 7b 0a 23 69 66 64 65 66 20 53 51  LOB: {.#ifdef SQ
13020 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c  LITE_OMIT_INCRBL
13030 4f 42 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  OB.    Tcl_Appen
13040 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
13050 22 69 6e 63 72 62 6c 6f 62 20 6e 6f 74 20 61 76  "incrblob not av
13060 61 69 6c 61 62 6c 65 20 69 6e 20 74 68 69 73 20  ailable in this 
13070 62 75 69 6c 64 22 2c 20 30 29 3b 0a 20 20 20 20  build", 0);.    
13080 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
13090 3b 0a 23 65 6c 73 65 0a 20 20 20 20 69 6e 74 20  ;.#else.    int 
130a0 69 73 52 65 61 64 6f 6e 6c 79 20 3d 20 30 3b 0a  isReadonly = 0;.
130b0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
130c0 7a 44 62 20 3d 20 22 6d 61 69 6e 22 3b 0a 20 20  zDb = "main";.  
130d0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
130e0 61 62 6c 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20  able;.    const 
130f0 63 68 61 72 20 2a 7a 43 6f 6c 75 6d 6e 3b 0a 20  char *zColumn;. 
13100 20 20 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20     sqlite_int64 
13110 69 52 6f 77 3b 0a 0a 20 20 20 20 2f 2a 20 43 68  iRow;..    /* Ch
13120 65 63 6b 20 66 6f 72 20 74 68 65 20 2d 72 65 61  eck for the -rea
13130 64 6f 6e 6c 79 20 6f 70 74 69 6f 6e 20 2a 2f 0a  donly option */.
13140 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 33 20 26      if( objc>3 &
13150 26 20 73 74 72 63 6d 70 28 54 63 6c 5f 47 65 74  & strcmp(Tcl_Get
13160 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 2c  String(objv[2]),
13170 20 22 2d 72 65 61 64 6f 6e 6c 79 22 29 3d 3d 30   "-readonly")==0
13180 20 29 7b 0a 20 20 20 20 20 20 69 73 52 65 61 64   ){.      isRead
13190 6f 6e 6c 79 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  only = 1;.    }.
131a0 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 28  .    if( objc!=(
131b0 35 2b 69 73 52 65 61 64 6f 6e 6c 79 29 20 26 26  5+isReadonly) &&
131c0 20 6f 62 6a 63 21 3d 28 36 2b 69 73 52 65 61 64   objc!=(6+isRead
131d0 6f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 54  only) ){.      T
131e0 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
131f0 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c  interp, 2, objv,
13200 20 22 3f 2d 72 65 61 64 6f 6e 6c 79 3f 20 3f 44   "?-readonly? ?D
13210 42 3f 20 54 41 42 4c 45 20 43 4f 4c 55 4d 4e 20  B? TABLE COLUMN 
13220 52 4f 57 49 44 22 29 3b 0a 20 20 20 20 20 20 72  ROWID");.      r
13230 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
13240 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
13250 6f 62 6a 63 3d 3d 28 36 2b 69 73 52 65 61 64 6f  objc==(6+isReado
13260 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 7a 44  nly) ){.      zD
13270 62 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  b = Tcl_GetStrin
13280 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 20 20  g(objv[2]);.    
13290 7d 0a 20 20 20 20 7a 54 61 62 6c 65 20 3d 20 54  }.    zTable = T
132a0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
132b0 76 5b 6f 62 6a 63 2d 33 5d 29 3b 0a 20 20 20 20  v[objc-3]);.    
132c0 7a 43 6f 6c 75 6d 6e 20 3d 20 54 63 6c 5f 47 65  zColumn = Tcl_Ge
132d0 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 6f 62 6a  tString(objv[obj
132e0 63 2d 32 5d 29 3b 0a 20 20 20 20 72 63 20 3d 20  c-2]);.    rc = 
132f0 54 63 6c 5f 47 65 74 57 69 64 65 49 6e 74 46 72  Tcl_GetWideIntFr
13300 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
13310 6a 76 5b 6f 62 6a 63 2d 31 5d 2c 20 26 69 52 6f  jv[objc-1], &iRo
13320 77 29 3b 0a 0a 20 20 20 20 69 66 28 20 72 63 3d  w);..    if( rc=
13330 3d 54 43 4c 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  =TCL_OK ){.     
13340 20 72 63 20 3d 20 63 72 65 61 74 65 49 6e 63 72   rc = createIncr
13350 62 6c 6f 62 43 68 61 6e 6e 65 6c 28 0a 20 20 20  blobChannel(.   
13360 20 20 20 20 20 20 20 69 6e 74 65 72 70 2c 20 70         interp, p
13370 44 62 2c 20 7a 44 62 2c 20 7a 54 61 62 6c 65 2c  Db, zDb, zTable,
13380 20 7a 43 6f 6c 75 6d 6e 2c 20 69 52 6f 77 2c 20   zColumn, iRow, 
13390 69 73 52 65 61 64 6f 6e 6c 79 0a 20 20 20 20 20  isReadonly.     
133a0 20 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66   );.    }.#endif
133b0 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
133c0 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24  .  /*.  **     $
133d0 64 62 20 69 6e 74 65 72 72 75 70 74 0a 20 20 2a  db interrupt.  *
133e0 2a 0a 20 20 2a 2a 20 49 6e 74 65 72 72 75 70 74  *.  ** Interrupt
133f0 20 74 68 65 20 65 78 65 63 75 74 69 6f 6e 20 6f   the execution o
13400 66 20 74 68 65 20 69 6e 6e 65 72 2d 6d 6f 73 74  f the inner-most
13410 20 53 51 4c 20 69 6e 74 65 72 70 72 65 74 65 72   SQL interpreter
13420 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20 63 61 75  .  This.  ** cau
13430 73 65 73 20 74 68 65 20 53 51 4c 20 73 74 61 74  ses the SQL stat
13440 65 6d 65 6e 74 20 74 6f 20 72 65 74 75 72 6e 20  ement to return 
13450 61 6e 20 65 72 72 6f 72 20 6f 66 20 53 51 4c 49  an error of SQLI
13460 54 45 5f 49 4e 54 45 52 52 55 50 54 2e 0a 20 20  TE_INTERRUPT..  
13470 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 49 4e 54  */.  case DB_INT
13480 45 52 52 55 50 54 3a 20 7b 0a 20 20 20 20 73 71  ERRUPT: {.    sq
13490 6c 69 74 65 33 5f 69 6e 74 65 72 72 75 70 74 28  lite3_interrupt(
134a0 70 44 62 2d 3e 64 62 29 3b 0a 20 20 20 20 62 72  pDb->db);.    br
134b0 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  eak;.  }..  /*. 
134c0 20 2a 2a 20 20 20 20 20 24 64 62 20 6e 75 6c 6c   **     $db null
134d0 76 61 6c 75 65 20 3f 53 54 52 49 4e 47 3f 0a 20  value ?STRING?. 
134e0 20 2a 2a 0a 20 20 2a 2a 20 43 68 61 6e 67 65 20   **.  ** Change 
134f0 74 65 78 74 20 75 73 65 64 20 77 68 65 6e 20 61  text used when a
13500 20 4e 55 4c 4c 20 63 6f 6d 65 73 20 62 61 63 6b   NULL comes back
13510 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
13520 73 65 2e 20 49 66 20 3f 53 54 52 49 4e 47 3f 0a  se. If ?STRING?.
13530 20 20 2a 2a 20 69 73 20 6e 6f 74 20 70 72 65 73    ** is not pres
13540 65 6e 74 2c 20 74 68 65 6e 20 74 68 65 20 63 75  ent, then the cu
13550 72 72 65 6e 74 20 73 74 72 69 6e 67 20 75 73 65  rrent string use
13560 64 20 66 6f 72 20 4e 55 4c 4c 20 69 73 20 72 65  d for NULL is re
13570 74 75 72 6e 65 64 2e 0a 20 20 2a 2a 20 49 66 20  turned..  ** If 
13580 53 54 52 49 4e 47 20 69 73 20 70 72 65 73 65 6e  STRING is presen
13590 74 2c 20 74 68 65 6e 20 53 54 52 49 4e 47 20 69  t, then STRING i
135a0 73 20 72 65 74 75 72 6e 65 64 2e 0a 20 20 2a 2a  s returned..  **
135b0 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f  .  */.  case DB_
135c0 4e 55 4c 4c 56 41 4c 55 45 3a 20 7b 0a 20 20 20  NULLVALUE: {.   
135d0 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 26 26 20   if( objc!=2 && 
135e0 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 20  objc!=3 ){.     
135f0 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
13600 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a  s(interp, 2, obj
13610 76 2c 20 22 4e 55 4c 4c 56 41 4c 55 45 22 29 3b  v, "NULLVALUE");
13620 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
13630 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
13640 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d 33 20 29     if( objc==3 )
13650 7b 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b  {.      int len;
13660 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 75  .      char *zNu
13670 6c 6c 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  ll = Tcl_GetStri
13680 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32  ngFromObj(objv[2
13690 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20  ], &len);.      
136a0 69 66 28 20 70 44 62 2d 3e 7a 4e 75 6c 6c 20 29  if( pDb->zNull )
136b0 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 46 72  {.        Tcl_Fr
136c0 65 65 28 70 44 62 2d 3e 7a 4e 75 6c 6c 29 3b 0a  ee(pDb->zNull);.
136d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
136e0 28 20 7a 4e 75 6c 6c 20 26 26 20 6c 65 6e 3e 30  ( zNull && len>0
136f0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d   ){.        pDb-
13700 3e 7a 4e 75 6c 6c 20 3d 20 54 63 6c 5f 41 6c 6c  >zNull = Tcl_All
13710 6f 63 28 20 6c 65 6e 20 2b 20 31 20 29 3b 0a 20  oc( len + 1 );. 
13720 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 44         memcpy(pD
13730 62 2d 3e 7a 4e 75 6c 6c 2c 20 7a 4e 75 6c 6c 2c  b->zNull, zNull,
13740 20 6c 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 70   len);.        p
13750 44 62 2d 3e 7a 4e 75 6c 6c 5b 6c 65 6e 5d 20 3d  Db->zNull[len] =
13760 20 27 5c 30 27 3b 0a 20 20 20 20 20 20 7d 65 6c   '\0';.      }el
13770 73 65 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d  se{.        pDb-
13780 3e 7a 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20  >zNull = 0;.    
13790 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 54 63    }.    }.    Tc
137a0 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
137b0 6e 74 65 72 70 2c 20 64 62 54 65 78 74 54 6f 4f  nterp, dbTextToO
137c0 62 6a 28 70 44 62 2d 3e 7a 4e 75 6c 6c 29 29 3b  bj(pDb->zNull));
137d0 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
137e0 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24  .  /*.  **     $
137f0 64 62 20 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72  db last_insert_r
13800 6f 77 69 64 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  owid .  **.  ** 
13810 52 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65  Return an intege
13820 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20 52  r which is the R
13830 4f 57 49 44 20 66 6f 72 20 74 68 65 20 6d 6f 73  OWID for the mos
13840 74 20 72 65 63 65 6e 74 20 69 6e 73 65 72 74 2e  t recent insert.
13850 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f  .  */.  case DB_
13860 4c 41 53 54 5f 49 4e 53 45 52 54 5f 52 4f 57 49  LAST_INSERT_ROWI
13870 44 3a 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  D: {.    Tcl_Obj
13880 20 2a 70 52 65 73 75 6c 74 3b 0a 20 20 20 20 54   *pResult;.    T
13890 63 6c 5f 57 69 64 65 49 6e 74 20 72 6f 77 69 64  cl_WideInt rowid
138a0 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d  ;.    if( objc!=
138b0 32 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57  2 ){.      Tcl_W
138c0 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
138d0 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 22 29  rp, 2, objv, "")
138e0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
138f0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
13900 20 20 20 20 72 6f 77 69 64 20 3d 20 73 71 6c 69      rowid = sqli
13910 74 65 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f  te3_last_insert_
13920 72 6f 77 69 64 28 70 44 62 2d 3e 64 62 29 3b 0a  rowid(pDb->db);.
13930 20 20 20 20 70 52 65 73 75 6c 74 20 3d 20 54 63      pResult = Tc
13940 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_GetObjResult(i
13950 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f  nterp);.    Tcl_
13960 53 65 74 57 69 64 65 49 6e 74 4f 62 6a 28 70 52  SetWideIntObj(pR
13970 65 73 75 6c 74 2c 20 72 6f 77 69 64 29 3b 0a 20  esult, rowid);. 
13980 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
13990 20 2f 2a 0a 20 20 2a 2a 20 54 68 65 20 44 42 5f   /*.  ** The DB_
139a0 4f 4e 45 43 4f 4c 55 4d 4e 20 6d 65 74 68 6f 64  ONECOLUMN method
139b0 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20   is implemented 
139c0 74 6f 67 65 74 68 65 72 20 77 69 74 68 20 44 42  together with DB
139d0 5f 45 58 49 53 54 53 2e 0a 20 20 2a 2f 0a 0a 20  _EXISTS..  */.. 
139e0 20 2f 2a 20 20 20 20 24 64 62 20 70 72 6f 67 72   /*    $db progr
139f0 65 73 73 20 3f 4e 20 43 41 4c 4c 42 41 43 4b 3f  ess ?N CALLBACK?
13a00 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 49 6e 76 6f  .  ** .  ** Invo
13a10 6b 65 20 74 68 65 20 67 69 76 65 6e 20 63 61 6c  ke the given cal
13a20 6c 62 61 63 6b 20 65 76 65 72 79 20 4e 20 76 69  lback every N vi
13a30 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 6f 70  rtual machine op
13a40 63 6f 64 65 73 20 77 68 69 6c 65 20 65 78 65 63  codes while exec
13a50 75 74 69 6e 67 0a 20 20 2a 2a 20 71 75 65 72 69  uting.  ** queri
13a60 65 73 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  es..  */.  case 
13a70 44 42 5f 50 52 4f 47 52 45 53 53 3a 20 7b 0a 20  DB_PROGRESS: {. 
13a80 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29     if( objc==2 )
13a90 7b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d  {.      if( pDb-
13aa0 3e 7a 50 72 6f 67 72 65 73 73 20 29 7b 0a 20 20  >zProgress ){.  
13ab0 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
13ac0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70  Result(interp, p
13ad0 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 2c 20 30  Db->zProgress, 0
13ae0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
13af0 65 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d 34  else if( objc==4
13b00 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a   ){.      char *
13b10 7a 50 72 6f 67 72 65 73 73 3b 0a 20 20 20 20 20  zProgress;.     
13b20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20   int len;.      
13b30 69 6e 74 20 4e 3b 0a 20 20 20 20 20 20 69 66 28  int N;.      if(
13b40 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74   TCL_OK!=Tcl_Get
13b50 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
13b60 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 4e 29 20  p, objv[2], &N) 
13b70 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
13b80 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
13b90 20 20 20 7d 3b 0a 20 20 20 20 20 20 69 66 28 20     };.      if( 
13ba0 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 20 29  pDb->zProgress )
13bb0 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 46 72  {.        Tcl_Fr
13bc0 65 65 28 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73  ee(pDb->zProgres
13bd0 73 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  s);.      }.    
13be0 20 20 7a 50 72 6f 67 72 65 73 73 20 3d 20 54 63    zProgress = Tc
13bf0 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
13c00 62 6a 28 6f 62 6a 76 5b 33 5d 2c 20 26 6c 65 6e  bj(objv[3], &len
13c10 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 50 72  );.      if( zPr
13c20 6f 67 72 65 73 73 20 26 26 20 6c 65 6e 3e 30 20  ogress && len>0 
13c30 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e  ){.        pDb->
13c40 7a 50 72 6f 67 72 65 73 73 20 3d 20 54 63 6c 5f  zProgress = Tcl_
13c50 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20 31 20 29  Alloc( len + 1 )
13c60 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  ;.        memcpy
13c70 28 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 2c  (pDb->zProgress,
13c80 20 7a 50 72 6f 67 72 65 73 73 2c 20 6c 65 6e 2b   zProgress, len+
13c90 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  1);.      }else{
13ca0 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 50  .        pDb->zP
13cb0 72 6f 67 72 65 73 73 20 3d 20 30 3b 0a 20 20 20  rogress = 0;.   
13cc0 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
13cd0 49 54 45 5f 4f 4d 49 54 5f 50 52 4f 47 52 45 53  ITE_OMIT_PROGRES
13ce0 53 5f 43 41 4c 4c 42 41 43 4b 0a 20 20 20 20 20  S_CALLBACK.     
13cf0 20 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f 67 72   if( pDb->zProgr
13d00 65 73 73 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ess ){.        p
13d10 44 62 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74  Db->interp = int
13d20 65 72 70 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  erp;.        sql
13d30 69 74 65 33 5f 70 72 6f 67 72 65 73 73 5f 68 61  ite3_progress_ha
13d40 6e 64 6c 65 72 28 70 44 62 2d 3e 64 62 2c 20 4e  ndler(pDb->db, N
13d50 2c 20 44 62 50 72 6f 67 72 65 73 73 48 61 6e 64  , DbProgressHand
13d60 6c 65 72 2c 20 70 44 62 29 3b 0a 20 20 20 20 20  ler, pDb);.     
13d70 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
13d80 73 71 6c 69 74 65 33 5f 70 72 6f 67 72 65 73 73  sqlite3_progress
13d90 5f 68 61 6e 64 6c 65 72 28 70 44 62 2d 3e 64 62  _handler(pDb->db
13da0 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
13db0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d    }.#endif.    }
13dc0 65 6c 73 65 7b 0a 20 20 20 20 20 20 54 63 6c 5f  else{.      Tcl_
13dd0 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
13de0 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 4e  erp, 2, objv, "N
13df0 20 43 41 4c 4c 42 41 43 4b 22 29 3b 0a 20 20 20   CALLBACK");.   
13e00 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
13e10 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62  ROR;.    }.    b
13e20 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  reak;.  }..  /* 
13e30 20 20 20 24 64 62 20 70 72 6f 66 69 6c 65 20 3f     $db profile ?
13e40 43 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a 0a 20  CALLBACK?.  **. 
13e50 20 2a 2a 20 4d 61 6b 65 20 61 72 72 61 6e 67 65   ** Make arrange
13e60 6d 65 6e 74 73 20 74 6f 20 69 6e 76 6f 6b 65 20  ments to invoke 
13e70 74 68 65 20 43 41 4c 4c 42 41 43 4b 20 72 6f 75  the CALLBACK rou
13e80 74 69 6e 65 20 61 66 74 65 72 20 65 61 63 68 20  tine after each 
13e90 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 0a 20 20  SQL statement.  
13ea0 2a 2a 20 74 68 61 74 20 68 61 73 20 72 75 6e 2e  ** that has run.
13eb0 20 20 54 68 65 20 74 65 78 74 20 6f 66 20 74 68    The text of th
13ec0 65 20 53 51 4c 20 61 6e 64 20 74 68 65 20 61 6d  e SQL and the am
13ed0 6f 75 6e 74 20 6f 66 20 65 6c 61 70 73 65 20 74  ount of elapse t
13ee0 69 6d 65 20 61 72 65 0a 20 20 2a 2a 20 61 70 70  ime are.  ** app
13ef0 65 6e 64 65 64 20 74 6f 20 43 41 4c 4c 42 41 43  ended to CALLBAC
13f00 4b 20 62 65 66 6f 72 65 20 74 68 65 20 73 63 72  K before the scr
13f10 69 70 74 20 69 73 20 72 75 6e 2e 0a 20 20 2a 2f  ipt is run..  */
13f20 0a 20 20 63 61 73 65 20 44 42 5f 50 52 4f 46 49  .  case DB_PROFI
13f30 4c 45 3a 20 7b 0a 20 20 20 20 69 66 28 20 6f 62  LE: {.    if( ob
13f40 6a 63 3e 33 20 29 7b 0a 20 20 20 20 20 20 54 63  jc>3 ){.      Tc
13f50 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
13f60 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
13f70 22 3f 43 41 4c 4c 42 41 43 4b 3f 22 29 3b 0a 20  "?CALLBACK?");. 
13f80 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
13f90 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73 65  ERROR;.    }else
13fa0 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a   if( objc==2 ){.
13fb0 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a        if( pDb->z
13fc0 50 72 6f 66 69 6c 65 20 29 7b 0a 20 20 20 20 20  Profile ){.     
13fd0 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
13fe0 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 44 62 2d  ult(interp, pDb-
13ff0 3e 7a 50 72 6f 66 69 6c 65 2c 20 30 29 3b 0a 20  >zProfile, 0);. 
14000 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
14010 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 50  {.      char *zP
14020 72 6f 66 69 6c 65 3b 0a 20 20 20 20 20 20 69 6e  rofile;.      in
14030 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20 69 66 28  t len;.      if(
14040 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 20 29   pDb->zProfile )
14050 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 46 72  {.        Tcl_Fr
14060 65 65 28 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65  ee(pDb->zProfile
14070 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
14080 20 7a 50 72 6f 66 69 6c 65 20 3d 20 54 63 6c 5f   zProfile = Tcl_
14090 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
140a0 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b  (objv[2], &len);
140b0 0a 20 20 20 20 20 20 69 66 28 20 7a 50 72 6f 66  .      if( zProf
140c0 69 6c 65 20 26 26 20 6c 65 6e 3e 30 20 29 7b 0a  ile && len>0 ){.
140d0 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 50 72          pDb->zPr
140e0 6f 66 69 6c 65 20 3d 20 54 63 6c 5f 41 6c 6c 6f  ofile = Tcl_Allo
140f0 63 28 20 6c 65 6e 20 2b 20 31 20 29 3b 0a 20 20  c( len + 1 );.  
14100 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 44 62        memcpy(pDb
14110 2d 3e 7a 50 72 6f 66 69 6c 65 2c 20 7a 50 72 6f  ->zProfile, zPro
14120 66 69 6c 65 2c 20 6c 65 6e 2b 31 29 3b 0a 20 20  file, len+1);.  
14130 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
14140 20 20 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65     pDb->zProfile
14150 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23 69   = 0;.      }.#i
14160 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
14170 45 5f 4f 4d 49 54 5f 54 52 41 43 45 29 20 26 26  E_OMIT_TRACE) &&
14180 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
14190 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50  _OMIT_FLOATING_P
141a0 4f 49 4e 54 29 0a 20 20 20 20 20 20 69 66 28 20  OINT).      if( 
141b0 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 20 29 7b  pDb->zProfile ){
141c0 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 69 6e  .        pDb->in
141d0 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20  terp = interp;. 
141e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 70         sqlite3_p
141f0 72 6f 66 69 6c 65 28 70 44 62 2d 3e 64 62 2c 20  rofile(pDb->db, 
14200 44 62 50 72 6f 66 69 6c 65 48 61 6e 64 6c 65 72  DbProfileHandler
14210 2c 20 70 44 62 29 3b 0a 20 20 20 20 20 20 7d 65  , pDb);.      }e
14220 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
14230 69 74 65 33 5f 70 72 6f 66 69 6c 65 28 70 44 62  ite3_profile(pDb
14240 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ->db, 0, 0);.   
14250 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
14260 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  }.    break;.  }
14270 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20  ..  /*.  **     
14280 24 64 62 20 72 65 6b 65 79 20 4b 45 59 0a 20 20  $db rekey KEY.  
14290 2a 2a 0a 20 20 2a 2a 20 43 68 61 6e 67 65 20 74  **.  ** Change t
142a0 68 65 20 65 6e 63 72 79 70 74 69 6f 6e 20 6b 65  he encryption ke
142b0 79 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74  y on the current
142c0 6c 79 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65  ly open database
142d0 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  ..  */.  case DB
142e0 5f 52 45 4b 45 59 3a 20 7b 0a 23 69 66 64 65 66  _REKEY: {.#ifdef
142f0 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45   SQLITE_HAS_CODE
14300 43 0a 20 20 20 20 69 6e 74 20 6e 4b 65 79 3b 0a  C.    int nKey;.
14310 20 20 20 20 76 6f 69 64 20 2a 70 4b 65 79 3b 0a      void *pKey;.
14320 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 6f  #endif.    if( o
14330 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20  bjc!=3 ){.      
14340 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
14350 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76  (interp, 2, objv
14360 2c 20 22 4b 45 59 22 29 3b 0a 20 20 20 20 20 20  , "KEY");.      
14370 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
14380 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53  ;.    }.#ifdef S
14390 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a  QLITE_HAS_CODEC.
143a0 20 20 20 20 70 4b 65 79 20 3d 20 54 63 6c 5f 47      pKey = Tcl_G
143b0 65 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d 4f  etByteArrayFromO
143c0 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6e 4b 65  bj(objv[2], &nKe
143d0 79 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  y);.    rc = sql
143e0 69 74 65 33 5f 72 65 6b 65 79 28 70 44 62 2d 3e  ite3_rekey(pDb->
143f0 64 62 2c 20 70 4b 65 79 2c 20 6e 4b 65 79 29 3b  db, pKey, nKey);
14400 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
14410 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
14420 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 73 71  esult(interp, sq
14430 6c 69 74 65 33 45 72 72 53 74 72 28 72 63 29 2c  lite3ErrStr(rc),
14440 20 30 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20   0);.      rc = 
14450 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
14460 0a 23 65 6e 64 69 66 0a 20 20 20 20 62 72 65 61  .#endif.    brea
14470 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20  k;.  }..  /*    
14480 24 64 62 20 72 65 73 74 6f 72 65 20 3f 44 41 54  $db restore ?DAT
14490 41 42 41 53 45 3f 20 46 49 4c 45 4e 41 4d 45 0a  ABASE? FILENAME.
144a0 20 20 2a 2a 0a 20 20 2a 2a 20 4f 70 65 6e 20 61    **.  ** Open a
144b0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e   database file n
144c0 61 6d 65 64 20 46 49 4c 45 4e 41 4d 45 2e 20 20  amed FILENAME.  
144d0 54 72 61 6e 73 66 65 72 20 74 68 65 20 63 6f 6e  Transfer the con
144e0 74 65 6e 74 20 0a 20 20 2a 2a 20 6f 66 20 46 49  tent .  ** of FI
144f0 4c 45 4e 41 4d 45 20 69 6e 74 6f 20 74 68 65 20  LENAME into the 
14500 6c 6f 63 61 6c 20 64 61 74 61 62 61 73 65 20 44  local database D
14510 41 54 41 42 41 53 45 20 28 64 65 66 61 75 6c 74  ATABASE (default
14520 3a 20 22 6d 61 69 6e 22 29 2e 0a 20 20 2a 2f 0a  : "main")..  */.
14530 20 20 63 61 73 65 20 44 42 5f 52 45 53 54 4f 52    case DB_RESTOR
14540 45 3a 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  E: {.    const c
14550 68 61 72 20 2a 7a 53 72 63 46 69 6c 65 3b 0a 20  har *zSrcFile;. 
14560 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
14570 44 65 73 74 44 62 3b 0a 20 20 20 20 73 71 6c 69  DestDb;.    sqli
14580 74 65 33 20 2a 70 53 72 63 3b 0a 20 20 20 20 73  te3 *pSrc;.    s
14590 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 2a 70  qlite3_backup *p
145a0 42 61 63 6b 75 70 3b 0a 20 20 20 20 69 6e 74 20  Backup;.    int 
145b0 6e 54 69 6d 65 6f 75 74 20 3d 20 30 3b 0a 0a 20  nTimeout = 0;.. 
145c0 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d 33 20 29     if( objc==3 )
145d0 7b 0a 20 20 20 20 20 20 7a 44 65 73 74 44 62 20  {.      zDestDb 
145e0 3d 20 22 6d 61 69 6e 22 3b 0a 20 20 20 20 20 20  = "main";.      
145f0 7a 53 72 63 46 69 6c 65 20 3d 20 54 63 6c 5f 47  zSrcFile = Tcl_G
14600 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d  etString(objv[2]
14610 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
14620 20 6f 62 6a 63 3d 3d 34 20 29 7b 0a 20 20 20 20   objc==4 ){.    
14630 20 20 7a 44 65 73 74 44 62 20 3d 20 54 63 6c 5f    zDestDb = Tcl_
14640 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32  GetString(objv[2
14650 5d 29 3b 0a 20 20 20 20 20 20 7a 53 72 63 46 69  ]);.      zSrcFi
14660 6c 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  le = Tcl_GetStri
14670 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a 20 20 20  ng(objv[3]);.   
14680 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 54 63   }else{.      Tc
14690 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
146a0 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
146b0 22 3f 44 41 54 41 42 41 53 45 3f 20 46 49 4c 45  "?DATABASE? FILE
146c0 4e 41 4d 45 22 29 3b 0a 20 20 20 20 20 20 72 65  NAME");.      re
146d0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
146e0 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73      }.    rc = s
146f0 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 7a  qlite3_open_v2(z
14700 53 72 63 46 69 6c 65 2c 20 26 70 53 72 63 2c 20  SrcFile, &pSrc, 
14710 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
14720 4f 4e 4c 59 2c 20 30 29 3b 0a 20 20 20 20 69 66  ONLY, 0);.    if
14730 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
14740 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70  ){.      Tcl_App
14750 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
14760 2c 20 22 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 73  , "cannot open s
14770 6f 75 72 63 65 20 64 61 74 61 62 61 73 65 3a 20  ource database: 
14780 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 73 71  ",.           sq
14790 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 53 72  lite3_errmsg(pSr
147a0 63 29 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20  c), (char*)0);. 
147b0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f       sqlite3_clo
147c0 73 65 28 70 53 72 63 29 3b 0a 20 20 20 20 20 20  se(pSrc);.      
147d0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
147e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 61 63  ;.    }.    pBac
147f0 6b 75 70 20 3d 20 73 71 6c 69 74 65 33 5f 62 61  kup = sqlite3_ba
14800 63 6b 75 70 5f 69 6e 69 74 28 70 44 62 2d 3e 64  ckup_init(pDb->d
14810 62 2c 20 7a 44 65 73 74 44 62 2c 20 70 53 72 63  b, zDestDb, pSrc
14820 2c 20 22 6d 61 69 6e 22 29 3b 0a 20 20 20 20 69  , "main");.    i
14830 66 28 20 70 42 61 63 6b 75 70 3d 3d 30 20 29 7b  f( pBackup==0 ){
14840 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  .      Tcl_Appen
14850 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
14860 22 72 65 73 74 6f 72 65 20 66 61 69 6c 65 64 3a  "restore failed:
14870 20 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 73   ",.           s
14880 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44  qlite3_errmsg(pD
14890 62 2d 3e 64 62 29 2c 20 28 63 68 61 72 2a 29 30  b->db), (char*)0
148a0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
148b0 5f 63 6c 6f 73 65 28 70 53 72 63 29 3b 0a 20 20  _close(pSrc);.  
148c0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
148d0 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
148e0 77 68 69 6c 65 28 20 28 72 63 20 3d 20 73 71 6c  while( (rc = sql
148f0 69 74 65 33 5f 62 61 63 6b 75 70 5f 73 74 65 70  ite3_backup_step
14900 28 70 42 61 63 6b 75 70 2c 31 30 30 29 29 3d 3d  (pBackup,100))==
14910 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 20 20 20  SQLITE_OK.      
14920 20 20 20 20 20 20 20 20 7c 7c 20 72 63 3d 3d 53          || rc==S
14930 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20  QLITE_BUSY ){.  
14940 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
14950 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20  TE_BUSY ){.     
14960 20 20 20 69 66 28 20 6e 54 69 6d 65 6f 75 74 2b     if( nTimeout+
14970 2b 20 3e 3d 20 33 20 29 20 62 72 65 61 6b 3b 0a  + >= 3 ) break;.
14980 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
14990 73 6c 65 65 70 28 31 30 30 29 3b 0a 20 20 20 20  sleep(100);.    
149a0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
149b0 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f 66 69 6e  lite3_backup_fin
149c0 69 73 68 28 70 42 61 63 6b 75 70 29 3b 0a 20 20  ish(pBackup);.  
149d0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
149e0 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 72  _DONE ){.      r
149f0 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20  c = TCL_OK;.    
14a00 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51  }else if( rc==SQ
14a10 4c 49 54 45 5f 42 55 53 59 20 7c 7c 20 72 63 3d  LITE_BUSY || rc=
14a20 3d 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 29  =SQLITE_LOCKED )
14a30 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65  {.      Tcl_Appe
14a40 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
14a50 20 22 72 65 73 74 6f 72 65 20 66 61 69 6c 65 64   "restore failed
14a60 3a 20 73 6f 75 72 63 65 20 64 61 74 61 62 61 73  : source databas
14a70 65 20 62 75 73 79 22 2c 0a 20 20 20 20 20 20 20  e busy",.       
14a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a90 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20  (char*)0);.     
14aa0 20 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b   rc = TCL_ERROR;
14ab0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
14ac0 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
14ad0 6c 74 28 69 6e 74 65 72 70 2c 20 22 72 65 73 74  lt(interp, "rest
14ae0 6f 72 65 20 66 61 69 6c 65 64 3a 20 22 2c 0a 20  ore failed: ",. 
14af0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
14b00 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62  3_errmsg(pDb->db
14b10 29 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  ), (char*)0);.  
14b20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45 52 52      rc = TCL_ERR
14b30 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  OR;.    }.    sq
14b40 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70 53 72 63  lite3_close(pSrc
14b50 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  );.    break;.  
14b60 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20  }..  /*.  **    
14b70 20 24 64 62 20 73 74 61 74 75 73 20 28 73 74 65   $db status (ste
14b80 70 7c 73 6f 72 74 7c 61 75 74 6f 69 6e 64 65 78  p|sort|autoindex
14b90 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 44 69 73 70  ).  **.  ** Disp
14ba0 6c 61 79 20 53 51 4c 49 54 45 5f 53 54 4d 54 53  lay SQLITE_STMTS
14bb0 54 41 54 55 53 5f 46 55 4c 4c 53 43 41 4e 5f 53  TATUS_FULLSCAN_S
14bc0 54 45 50 20 6f 72 20 0a 20 20 2a 2a 20 53 51 4c  TEP or .  ** SQL
14bd0 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 53  ITE_STMTSTATUS_S
14be0 4f 52 54 20 66 6f 72 20 74 68 65 20 6d 6f 73 74  ORT for the most
14bf0 20 72 65 63 65 6e 74 20 65 76 61 6c 2e 0a 20 20   recent eval..  
14c00 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 53 54 41  */.  case DB_STA
14c10 54 55 53 3a 20 7b 0a 20 20 20 20 69 6e 74 20 76  TUS: {.    int v
14c20 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
14c30 20 2a 7a 4f 70 3b 0a 20 20 20 20 69 66 28 20 6f   *zOp;.    if( o
14c40 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20  bjc!=3 ){.      
14c50 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
14c60 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76  (interp, 2, objv
14c70 2c 20 22 28 73 74 65 70 7c 73 6f 72 74 7c 61 75  , "(step|sort|au
14c80 74 6f 69 6e 64 65 78 29 22 29 3b 0a 20 20 20 20  toindex)");.    
14c90 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
14ca0 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4f  OR;.    }.    zO
14cb0 70 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  p = Tcl_GetStrin
14cc0 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 20 20  g(objv[2]);.    
14cd0 69 66 28 20 73 74 72 63 6d 70 28 7a 4f 70 2c 20  if( strcmp(zOp, 
14ce0 22 73 74 65 70 22 29 3d 3d 30 20 29 7b 0a 20 20  "step")==0 ){.  
14cf0 20 20 20 20 76 20 3d 20 70 44 62 2d 3e 6e 53 74      v = pDb->nSt
14d00 65 70 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  ep;.    }else if
14d10 28 20 73 74 72 63 6d 70 28 7a 4f 70 2c 20 22 73  ( strcmp(zOp, "s
14d20 6f 72 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ort")==0 ){.    
14d30 20 20 76 20 3d 20 70 44 62 2d 3e 6e 53 6f 72 74    v = pDb->nSort
14d40 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
14d50 73 74 72 63 6d 70 28 7a 4f 70 2c 20 22 61 75 74  strcmp(zOp, "aut
14d60 6f 69 6e 64 65 78 22 29 3d 3d 30 20 29 7b 0a 20  oindex")==0 ){. 
14d70 20 20 20 20 20 76 20 3d 20 70 44 62 2d 3e 6e 49       v = pDb->nI
14d80 6e 64 65 78 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ndex;.    }else{
14d90 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  .      Tcl_Appen
14da0 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
14db0 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 62 61  .            "ba
14dc0 64 20 61 72 67 75 6d 65 6e 74 3a 20 73 68 6f 75  d argument: shou
14dd0 6c 64 20 62 65 20 61 75 74 6f 69 6e 64 65 78 2c  ld be autoindex,
14de0 20 73 74 65 70 2c 20 6f 72 20 73 6f 72 74 22 2c   step, or sort",
14df0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 63   .            (c
14e00 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 72  har*)0);.      r
14e10 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
14e20 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 53  .    }.    Tcl_S
14e30 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
14e40 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  rp, Tcl_NewIntOb
14e50 6a 28 76 29 29 3b 0a 20 20 20 20 62 72 65 61 6b  j(v));.    break
14e60 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 0a 20 20  ;.  }.  .  /*.  
14e70 2a 2a 20 20 20 20 20 24 64 62 20 74 69 6d 65 6f  **     $db timeo
14e80 75 74 20 4d 49 4c 4c 45 53 45 43 4f 4e 44 53 0a  ut MILLESECONDS.
14e90 20 20 2a 2a 0a 20 20 2a 2a 20 44 65 6c 61 79 20    **.  ** Delay 
14ea0 66 6f 72 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  for the number o
14eb0 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 73  f milliseconds s
14ec0 70 65 63 69 66 69 65 64 20 77 68 65 6e 20 61 20  pecified when a 
14ed0 66 69 6c 65 20 69 73 20 6c 6f 63 6b 65 64 2e 0a  file is locked..
14ee0 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 54    */.  case DB_T
14ef0 49 4d 45 4f 55 54 3a 20 7b 0a 20 20 20 20 69 6e  IMEOUT: {.    in
14f00 74 20 6d 73 3b 0a 20 20 20 20 69 66 28 20 6f 62  t ms;.    if( ob
14f10 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 54  jc!=3 ){.      T
14f20 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
14f30 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c  interp, 2, objv,
14f40 20 22 4d 49 4c 4c 49 53 45 43 4f 4e 44 53 22 29   "MILLISECONDS")
14f50 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
14f60 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
14f70 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49      if( Tcl_GetI
14f80 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
14f90 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 6d 73 29 20  , objv[2], &ms) 
14fa0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
14fb0 4f 52 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  OR;.    sqlite3_
14fc0 62 75 73 79 5f 74 69 6d 65 6f 75 74 28 70 44 62  busy_timeout(pDb
14fd0 2d 3e 64 62 2c 20 6d 73 29 3b 0a 20 20 20 20 62  ->db, ms);.    b
14fe0 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f  reak;.  }.  .  /
14ff0 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20 74  *.  **     $db t
15000 6f 74 61 6c 5f 63 68 61 6e 67 65 73 0a 20 20 2a  otal_changes.  *
15010 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 74 68  *.  ** Return th
15020 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
15030 20 74 68 61 74 20 77 65 72 65 20 6d 6f 64 69 66   that were modif
15040 69 65 64 2c 20 69 6e 73 65 72 74 65 64 2c 20 6f  ied, inserted, o
15050 72 20 64 65 6c 65 74 65 64 20 0a 20 20 2a 2a 20  r deleted .  ** 
15060 73 69 6e 63 65 20 74 68 65 20 64 61 74 61 62 61  since the databa
15070 73 65 20 68 61 6e 64 6c 65 20 77 61 73 20 63 72  se handle was cr
15080 65 61 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 63 61  eated..  */.  ca
15090 73 65 20 44 42 5f 54 4f 54 41 4c 5f 43 48 41 4e  se DB_TOTAL_CHAN
150a0 47 45 53 3a 20 7b 0a 20 20 20 20 54 63 6c 5f 4f  GES: {.    Tcl_O
150b0 62 6a 20 2a 70 52 65 73 75 6c 74 3b 0a 20 20 20  bj *pResult;.   
150c0 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a   if( objc!=2 ){.
150d0 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
150e0 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
150f0 2c 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 20 20 20  , objv, "");.   
15100 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
15110 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ROR;.    }.    p
15120 52 65 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65 74  Result = Tcl_Get
15130 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
15140 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 49 6e  );.    Tcl_SetIn
15150 74 4f 62 6a 28 70 52 65 73 75 6c 74 2c 20 73 71  tObj(pResult, sq
15160 6c 69 74 65 33 5f 74 6f 74 61 6c 5f 63 68 61 6e  lite3_total_chan
15170 67 65 73 28 70 44 62 2d 3e 64 62 29 29 3b 0a 20  ges(pDb->db));. 
15180 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
15190 20 2f 2a 20 20 20 20 24 64 62 20 74 72 61 63 65   /*    $db trace
151a0 20 3f 43 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a   ?CALLBACK?.  **
151b0 0a 20 20 2a 2a 20 4d 61 6b 65 20 61 72 72 61 6e  .  ** Make arran
151c0 67 65 6d 65 6e 74 73 20 74 6f 20 69 6e 76 6f 6b  gements to invok
151d0 65 20 74 68 65 20 43 41 4c 4c 42 41 43 4b 20 72  e the CALLBACK r
151e0 6f 75 74 69 6e 65 20 66 6f 72 20 65 61 63 68 20  outine for each 
151f0 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 0a 20 20  SQL statement.  
15200 2a 2a 20 74 68 61 74 20 69 73 20 65 78 65 63 75  ** that is execu
15210 74 65 64 2e 20 20 54 68 65 20 74 65 78 74 20 6f  ted.  The text o
15220 66 20 74 68 65 20 53 51 4c 20 69 73 20 61 70 70  f the SQL is app
15230 65 6e 64 65 64 20 74 6f 20 43 41 4c 4c 42 41 43  ended to CALLBAC
15240 4b 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20 69 74  K before.  ** it
15250 20 69 73 20 65 78 65 63 75 74 65 64 2e 0a 20 20   is executed..  
15260 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 54 52 41  */.  case DB_TRA
15270 43 45 3a 20 7b 0a 20 20 20 20 69 66 28 20 6f 62  CE: {.    if( ob
15280 6a 63 3e 33 20 29 7b 0a 20 20 20 20 20 20 54 63  jc>3 ){.      Tc
15290 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
152a0 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
152b0 22 3f 43 41 4c 4c 42 41 43 4b 3f 22 29 3b 0a 20  "?CALLBACK?");. 
152c0 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
152d0 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73 65  ERROR;.    }else
152e0 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a   if( objc==2 ){.
152f0 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a        if( pDb->z
15300 54 72 61 63 65 20 29 7b 0a 20 20 20 20 20 20 20  Trace ){.       
15310 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
15320 74 28 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a  t(interp, pDb->z
15330 54 72 61 63 65 2c 20 30 29 3b 0a 20 20 20 20 20  Trace, 0);.     
15340 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
15350 20 20 20 20 63 68 61 72 20 2a 7a 54 72 61 63 65      char *zTrace
15360 3b 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b  ;.      int len;
15370 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e  .      if( pDb->
15380 7a 54 72 61 63 65 20 29 7b 0a 20 20 20 20 20 20  zTrace ){.      
15390 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e    Tcl_Free(pDb->
153a0 7a 54 72 61 63 65 29 3b 0a 20 20 20 20 20 20 7d  zTrace);.      }
153b0 0a 20 20 20 20 20 20 7a 54 72 61 63 65 20 3d 20  .      zTrace = 
153c0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
153d0 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c  mObj(objv[2], &l
153e0 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  en);.      if( z
153f0 54 72 61 63 65 20 26 26 20 6c 65 6e 3e 30 20 29  Trace && len>0 )
15400 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a  {.        pDb->z
15410 54 72 61 63 65 20 3d 20 54 63 6c 5f 41 6c 6c 6f  Trace = Tcl_Allo
15420 63 28 20 6c 65 6e 20 2b 20 31 20 29 3b 0a 20 20  c( len + 1 );.  
15430 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 44 62        memcpy(pDb
15440 2d 3e 7a 54 72 61 63 65 2c 20 7a 54 72 61 63 65  ->zTrace, zTrace
15450 2c 20 6c 65 6e 2b 31 29 3b 0a 20 20 20 20 20 20  , len+1);.      
15460 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
15470 44 62 2d 3e 7a 54 72 61 63 65 20 3d 20 30 3b 0a  Db->zTrace = 0;.
15480 20 20 20 20 20 20 7d 0a 23 69 66 20 21 64 65 66        }.#if !def
15490 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
154a0 5f 54 52 41 43 45 29 20 26 26 20 21 64 65 66 69  _TRACE) && !defi
154b0 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
154c0 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 29 0a  FLOATING_POINT).
154d0 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a        if( pDb->z
154e0 54 72 61 63 65 20 29 7b 0a 20 20 20 20 20 20 20  Trace ){.       
154f0 20 70 44 62 2d 3e 69 6e 74 65 72 70 20 3d 20 69   pDb->interp = i
15500 6e 74 65 72 70 3b 0a 20 20 20 20 20 20 20 20 73  nterp;.        s
15510 71 6c 69 74 65 33 5f 74 72 61 63 65 28 70 44 62  qlite3_trace(pDb
15520 2d 3e 64 62 2c 20 44 62 54 72 61 63 65 48 61 6e  ->db, DbTraceHan
15530 64 6c 65 72 2c 20 70 44 62 29 3b 0a 20 20 20 20  dler, pDb);.    
15540 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
15550 20 73 71 6c 69 74 65 33 5f 74 72 61 63 65 28 70   sqlite3_trace(p
15560 44 62 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20  Db->db, 0, 0);. 
15570 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
15580 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20    }.    break;. 
15590 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20   }..  /*    $db 
155a0 74 72 61 6e 73 61 63 74 69 6f 6e 20 5b 2d 64 65  transaction [-de
155b0 66 65 72 72 65 64 7c 2d 69 6d 6d 65 64 69 61 74  ferred|-immediat
155c0 65 7c 2d 65 78 63 6c 75 73 69 76 65 5d 20 53 43  e|-exclusive] SC
155d0 52 49 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53  RIPT.  **.  ** S
155e0 74 61 72 74 20 61 20 6e 65 77 20 74 72 61 6e 73  tart a new trans
155f0 61 63 74 69 6f 6e 20 28 69 66 20 77 65 20 61 72  action (if we ar
15600 65 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 69 6e  e not already in
15610 20 74 68 65 20 6d 69 64 73 74 20 6f 66 20 61 0a   the midst of a.
15620 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
15630 29 20 61 6e 64 20 65 78 65 63 75 74 65 20 74 68  ) and execute th
15640 65 20 54 43 4c 20 73 63 72 69 70 74 20 53 43 52  e TCL script SCR
15650 49 50 54 2e 20 20 41 66 74 65 72 20 53 43 52 49  IPT.  After SCRI
15660 50 54 0a 20 20 2a 2a 20 63 6f 6d 70 6c 65 74 65  PT.  ** complete
15670 73 2c 20 65 69 74 68 65 72 20 63 6f 6d 6d 69 74  s, either commit
15680 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
15690 20 6f 72 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b   or roll it back
156a0 20 69 66 20 53 43 52 49 50 54 0a 20 20 2a 2a 20   if SCRIPT.  ** 
156b0 74 68 72 6f 77 73 20 61 6e 20 65 78 63 65 70 74  throws an except
156c0 69 6f 6e 2e 20 20 4f 72 20 69 66 20 6e 6f 20 6e  ion.  Or if no n
156d0 65 77 20 74 72 61 6e 73 61 74 69 6f 6e 20 77 61  ew transation wa
156e0 73 20 73 74 61 72 74 65 64 2c 20 64 6f 20 6e 6f  s started, do no
156f0 74 68 69 6e 67 2e 0a 20 20 2a 2a 20 70 61 73 73  thing..  ** pass
15700 20 74 68 65 20 65 78 63 65 70 74 69 6f 6e 20 6f   the exception o
15710 6e 20 75 70 20 74 68 65 20 73 74 61 63 6b 2e 0a  n up the stack..
15720 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 63    **.  ** This c
15730 6f 6d 6d 61 6e 64 20 77 61 73 20 69 6e 73 70 69  ommand was inspi
15740 72 65 64 20 62 79 20 44 61 76 65 20 54 68 6f 6d  red by Dave Thom
15750 61 73 27 73 20 74 61 6c 6b 20 6f 6e 20 52 75 62  as's talk on Rub
15760 79 20 61 74 20 74 68 65 0a 20 20 2a 2a 20 32 30  y at the.  ** 20
15770 30 35 20 4f 27 52 65 69 6c 6c 79 20 4f 70 65 6e  05 O'Reilly Open
15780 20 53 6f 75 72 63 65 20 43 6f 6e 76 65 6e 74 69   Source Conventi
15790 6f 6e 20 28 4f 53 43 4f 4e 29 2e 0a 20 20 2a 2f  on (OSCON)..  */
157a0 0a 20 20 63 61 73 65 20 44 42 5f 54 52 41 4e 53  .  case DB_TRANS
157b0 41 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 54 63  ACTION: {.    Tc
157c0 6c 5f 4f 62 6a 20 2a 70 53 63 72 69 70 74 3b 0a  l_Obj *pScript;.
157d0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
157e0 7a 42 65 67 69 6e 20 3d 20 22 53 41 56 45 50 4f  zBegin = "SAVEPO
157f0 49 4e 54 20 5f 74 63 6c 5f 74 72 61 6e 73 61 63  INT _tcl_transac
15800 74 69 6f 6e 22 3b 0a 20 20 20 20 69 66 28 20 6f  tion";.    if( o
15810 62 6a 63 21 3d 33 20 26 26 20 6f 62 6a 63 21 3d  bjc!=3 && objc!=
15820 34 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57  4 ){.      Tcl_W
15830 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
15840 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 5b 54  rp, 2, objv, "[T
15850 59 50 45 5d 20 53 43 52 49 50 54 22 29 3b 0a 20  YPE] SCRIPT");. 
15860 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
15870 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20  ERROR;.    }..  
15880 20 20 69 66 28 20 70 44 62 2d 3e 6e 54 72 61 6e    if( pDb->nTran
15890 73 61 63 74 69 6f 6e 3d 3d 30 20 26 26 20 6f 62  saction==0 && ob
158a0 6a 63 3d 3d 34 20 29 7b 0a 20 20 20 20 20 20 73  jc==4 ){.      s
158b0 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
158c0 20 2a 54 54 59 50 45 5f 73 74 72 73 5b 5d 20 3d   *TTYPE_strs[] =
158d0 20 7b 0a 20 20 20 20 20 20 20 20 22 64 65 66 65   {.        "defe
158e0 72 72 65 64 22 2c 20 20 20 22 65 78 63 6c 75 73  rred",   "exclus
158f0 69 76 65 22 2c 20 20 22 69 6d 6d 65 64 69 61 74  ive",  "immediat
15900 65 22 2c 20 30 0a 20 20 20 20 20 20 7d 3b 0a 20  e", 0.      };. 
15910 20 20 20 20 20 65 6e 75 6d 20 54 54 59 50 45 5f       enum TTYPE_
15920 65 6e 75 6d 20 7b 0a 20 20 20 20 20 20 20 20 54  enum {.        T
15930 54 59 50 45 5f 44 45 46 45 52 52 45 44 2c 20 54  TYPE_DEFERRED, T
15940 54 59 50 45 5f 45 58 43 4c 55 53 49 56 45 2c 20  TYPE_EXCLUSIVE, 
15950 54 54 59 50 45 5f 49 4d 4d 45 44 49 41 54 45 0a  TTYPE_IMMEDIATE.
15960 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 69        };.      i
15970 6e 74 20 74 74 79 70 65 3b 0a 20 20 20 20 20 20  nt ttype;.      
15980 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 64 65 78  if( Tcl_GetIndex
15990 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
159a0 6f 62 6a 76 5b 32 5d 2c 20 54 54 59 50 45 5f 73  objv[2], TTYPE_s
159b0 74 72 73 2c 20 22 74 72 61 6e 73 61 63 74 69 6f  trs, "transactio
159c0 6e 20 74 79 70 65 22 2c 0a 20 20 20 20 20 20 20  n type",.       
159d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
159e0 20 20 20 20 20 20 20 30 2c 20 26 74 74 79 70 65         0, &ttype
159f0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  ) ){.        ret
15a00 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
15a10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 77 69       }.      swi
15a20 74 63 68 28 20 28 65 6e 75 6d 20 54 54 59 50 45  tch( (enum TTYPE
15a30 5f 65 6e 75 6d 29 74 74 79 70 65 20 29 7b 0a 20  _enum)ttype ){. 
15a40 20 20 20 20 20 20 20 63 61 73 65 20 54 54 59 50         case TTYP
15a50 45 5f 44 45 46 45 52 52 45 44 3a 20 20 20 20 2f  E_DEFERRED:    /
15a60 2a 20 6e 6f 2d 6f 70 20 2a 2f 3b 20 20 20 20 20  * no-op */;     
15a70 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
15a80 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  k;.        case 
15a90 54 54 59 50 45 5f 45 58 43 4c 55 53 49 56 45 3a  TTYPE_EXCLUSIVE:
15aa0 20 20 20 7a 42 65 67 69 6e 20 3d 20 22 42 45 47     zBegin = "BEG
15ab0 49 4e 20 45 58 43 4c 55 53 49 56 45 22 3b 20 20  IN EXCLUSIVE";  
15ac0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63  break;.        c
15ad0 61 73 65 20 54 54 59 50 45 5f 49 4d 4d 45 44 49  ase TTYPE_IMMEDI
15ae0 41 54 45 3a 20 20 20 7a 42 65 67 69 6e 20 3d 20  ATE:   zBegin = 
15af0 22 42 45 47 49 4e 20 49 4d 4d 45 44 49 41 54 45  "BEGIN IMMEDIATE
15b00 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ";  break;.     
15b10 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 63   }.    }.    pSc
15b20 72 69 70 74 20 3d 20 6f 62 6a 76 5b 6f 62 6a 63  ript = objv[objc
15b30 2d 31 5d 3b 0a 0a 20 20 20 20 2f 2a 20 52 75 6e  -1];..    /* Run
15b40 20 74 68 65 20 53 51 4c 69 74 65 20 42 45 47 49   the SQLite BEGI
15b50 4e 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 6f 70 65  N command to ope
15b60 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  n a transaction 
15b70 6f 72 20 73 61 76 65 70 6f 69 6e 74 2e 20 2a 2f  or savepoint. */
15b80 0a 20 20 20 20 70 44 62 2d 3e 64 69 73 61 62 6c  .    pDb->disabl
15b90 65 41 75 74 68 2b 2b 3b 0a 20 20 20 20 72 63 20  eAuth++;.    rc 
15ba0 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70  = sqlite3_exec(p
15bb0 44 62 2d 3e 64 62 2c 20 7a 42 65 67 69 6e 2c 20  Db->db, zBegin, 
15bc0 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 70 44  0, 0, 0);.    pD
15bd0 62 2d 3e 64 69 73 61 62 6c 65 41 75 74 68 2d 2d  b->disableAuth--
15be0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
15bf0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
15c00 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
15c10 74 28 69 6e 74 65 72 70 2c 20 73 71 6c 69 74 65  t(interp, sqlite
15c20 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62  3_errmsg(pDb->db
15c30 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 65 74  ), 0);.      ret
15c40 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
15c50 20 20 20 7d 0a 20 20 20 20 70 44 62 2d 3e 6e 54     }.    pDb->nT
15c60 72 61 6e 73 61 63 74 69 6f 6e 2b 2b 3b 0a 0a 20  ransaction++;.. 
15c70 20 20 20 2f 2a 20 49 66 20 75 73 69 6e 67 20 4e     /* If using N
15c80 52 45 2c 20 73 63 68 65 64 75 6c 65 20 61 20 63  RE, schedule a c
15c90 61 6c 6c 62 61 63 6b 20 74 6f 20 69 6e 76 6f 6b  allback to invok
15ca0 65 20 74 68 65 20 73 63 72 69 70 74 20 70 53 63  e the script pSc
15cb0 72 69 70 74 2c 20 74 68 65 6e 0a 20 20 20 20 2a  ript, then.    *
15cc0 2a 20 61 20 73 65 63 6f 6e 64 20 63 61 6c 6c 62  * a second callb
15cd0 61 63 6b 20 74 6f 20 63 6f 6d 6d 69 74 20 28 6f  ack to commit (o
15ce0 72 20 72 6f 6c 6c 62 61 63 6b 29 20 74 68 65 20  r rollback) the 
15cf0 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 72 20 73  transaction or s
15d00 61 76 65 70 6f 69 6e 74 0a 20 20 20 20 2a 2a 20  avepoint.    ** 
15d10 6f 70 65 6e 65 64 20 61 62 6f 76 65 2e 20 49 66  opened above. If
15d20 20 6e 6f 74 20 75 73 69 6e 67 20 4e 52 45 2c 20   not using NRE, 
15d30 65 76 61 6c 75 61 74 65 20 74 68 65 20 73 63 72  evaluate the scr
15d40 69 70 74 20 64 69 72 65 63 74 6c 79 2c 20 74 68  ipt directly, th
15d50 65 6e 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 66  en.    ** call f
15d60 75 6e 63 74 69 6f 6e 20 44 62 54 72 61 6e 73 50  unction DbTransP
15d70 6f 73 74 43 6d 64 28 29 20 74 6f 20 63 6f 6d 6d  ostCmd() to comm
15d80 69 74 20 28 6f 72 20 72 6f 6c 6c 62 61 63 6b 29  it (or rollback)
15d90 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
15da0 20 0a 20 20 20 20 2a 2a 20 6f 72 20 73 61 76 65   .    ** or save
15db0 70 6f 69 6e 74 2e 20 20 2a 2f 0a 20 20 20 20 69  point.  */.    i
15dc0 66 28 20 44 62 55 73 65 4e 72 65 28 29 20 29 7b  f( DbUseNre() ){
15dd0 0a 20 20 20 20 20 20 54 63 6c 5f 4e 52 41 64 64  .      Tcl_NRAdd
15de0 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c  Callback(interp,
15df0 20 44 62 54 72 61 6e 73 50 6f 73 74 43 6d 64 2c   DbTransPostCmd,
15e00 20 63 64 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20   cd, 0, 0, 0);. 
15e10 20 20 20 20 20 54 63 6c 5f 4e 52 45 76 61 6c 4f       Tcl_NREvalO
15e20 62 6a 28 69 6e 74 65 72 70 2c 20 70 53 63 72 69  bj(interp, pScri
15e30 70 74 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73  pt, 0);.    }els
15e40 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 44 62  e{.      rc = Db
15e50 54 72 61 6e 73 50 6f 73 74 43 6d 64 28 26 63 64  TransPostCmd(&cd
15e60 2c 20 69 6e 74 65 72 70 2c 20 54 63 6c 5f 45 76  , interp, Tcl_Ev
15e70 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c 20  alObjEx(interp, 
15e80 70 53 63 72 69 70 74 2c 20 30 29 29 3b 0a 20 20  pScript, 0));.  
15e90 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20    }.    break;. 
15ea0 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20   }..  /*.  **   
15eb0 20 24 64 62 20 75 6e 6c 6f 63 6b 5f 6e 6f 74 69   $db unlock_noti
15ec0 66 79 20 3f 73 63 72 69 70 74 3f 0a 20 20 2a 2f  fy ?script?.  */
15ed0 0a 20 20 63 61 73 65 20 44 42 5f 55 4e 4c 4f 43  .  case DB_UNLOC
15ee0 4b 5f 4e 4f 54 49 46 59 3a 20 7b 0a 23 69 66 6e  K_NOTIFY: {.#ifn
15ef0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
15f00 45 5f 55 4e 4c 4f 43 4b 5f 4e 4f 54 49 46 59 0a  E_UNLOCK_NOTIFY.
15f10 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
15f20 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e  sult(interp, "un
15f30 6c 6f 63 6b 5f 6e 6f 74 69 66 79 20 6e 6f 74 20  lock_notify not 
15f40 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 74 68 69  available in thi
15f50 73 20 62 75 69 6c 64 22 2c 20 30 29 3b 0a 20 20  s build", 0);.  
15f60 20 20 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52    rc = TCL_ERROR
15f70 3b 0a 23 65 6c 73 65 0a 20 20 20 20 69 66 28 20  ;.#else.    if( 
15f80 6f 62 6a 63 21 3d 32 20 26 26 20 6f 62 6a 63 21  objc!=2 && objc!
15f90 3d 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  =3 ){.      Tcl_
15fa0 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
15fb0 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f  erp, 2, objv, "?
15fc0 53 43 52 49 50 54 3f 22 29 3b 0a 20 20 20 20 20  SCRIPT?");.     
15fd0 20 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b   rc = TCL_ERROR;
15fe0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
15ff0 20 20 76 6f 69 64 20 28 2a 78 4e 6f 74 69 66 79    void (*xNotify
16000 29 28 76 6f 69 64 20 2a 2a 2c 20 69 6e 74 29 20  )(void **, int) 
16010 3d 20 30 3b 0a 20 20 20 20 20 20 76 6f 69 64 20  = 0;.      void 
16020 2a 70 4e 6f 74 69 66 79 41 72 67 20 3d 20 30 3b  *pNotifyArg = 0;
16030 0a 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d  ..      if( pDb-
16040 3e 70 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 20 29  >pUnlockNotify )
16050 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 44 65  {.        Tcl_De
16060 63 72 52 65 66 43 6f 75 6e 74 28 70 44 62 2d 3e  crRefCount(pDb->
16070 70 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 29 3b 0a  pUnlockNotify);.
16080 20 20 20 20 20 20 20 20 70 44 62 2d 3e 70 55 6e          pDb->pUn
16090 6c 6f 63 6b 4e 6f 74 69 66 79 20 3d 20 30 3b 0a  lockNotify = 0;.
160a0 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20        }.  .     
160b0 20 69 66 28 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a   if( objc==3 ){.
160c0 20 20 20 20 20 20 20 20 78 4e 6f 74 69 66 79 20          xNotify 
160d0 3d 20 44 62 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79  = DbUnlockNotify
160e0 3b 0a 20 20 20 20 20 20 20 20 70 4e 6f 74 69 66  ;.        pNotif
160f0 79 41 72 67 20 3d 20 28 76 6f 69 64 20 2a 29 70  yArg = (void *)p
16100 44 62 3b 0a 20 20 20 20 20 20 20 20 70 44 62 2d  Db;.        pDb-
16110 3e 70 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 20 3d  >pUnlockNotify =
16120 20 6f 62 6a 76 5b 32 5d 3b 0a 20 20 20 20 20 20   objv[2];.      
16130 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
16140 6e 74 28 70 44 62 2d 3e 70 55 6e 6c 6f 63 6b 4e  nt(pDb->pUnlockN
16150 6f 74 69 66 79 29 3b 0a 20 20 20 20 20 20 7d 0a  otify);.      }.
16160 20 20 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c    .      if( sql
16170 69 74 65 33 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74 69  ite3_unlock_noti
16180 66 79 28 70 44 62 2d 3e 64 62 2c 20 78 4e 6f 74  fy(pDb->db, xNot
16190 69 66 79 2c 20 70 4e 6f 74 69 66 79 41 72 67 29  ify, pNotifyArg)
161a0 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f   ){.        Tcl_
161b0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
161c0 65 72 70 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  erp, sqlite3_err
161d0 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c 20 30 29  msg(pDb->db), 0)
161e0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 54  ;.        rc = T
161f0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  CL_ERROR;.      
16200 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  }.    }.#endif. 
16210 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
16220 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 24 64 62 20   /*.  **    $db 
16230 70 72 65 75 70 64 61 74 65 5f 68 6f 6f 6b 20 63  preupdate_hook c
16240 6f 75 6e 74 0a 20 20 2a 2a 20 20 20 20 24 64 62  ount.  **    $db
16250 20 70 72 65 75 70 64 61 74 65 5f 68 6f 6f 6b 20   preupdate_hook 
16260 68 6f 6f 6b 20 3f 53 43 52 49 50 54 3f 0a 20 20  hook ?SCRIPT?.  
16270 2a 2a 20 20 20 20 24 64 62 20 70 72 65 75 70 64  **    $db preupd
16280 61 74 65 5f 68 6f 6f 6b 20 6e 65 77 20 49 4e 44  ate_hook new IND
16290 45 58 0a 20 20 2a 2a 20 20 20 20 24 64 62 20 70  EX.  **    $db p
162a0 72 65 75 70 64 61 74 65 5f 68 6f 6f 6b 20 6f 6c  reupdate_hook ol
162b0 64 20 49 4e 44 45 58 0a 20 20 2a 2f 0a 20 20 63  d INDEX.  */.  c
162c0 61 73 65 20 44 42 5f 50 52 45 55 50 44 41 54 45  ase DB_PREUPDATE
162d0 3a 20 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  : {.#ifndef SQLI
162e0 54 45 5f 45 4e 41 42 4c 45 5f 50 52 45 55 50 44  TE_ENABLE_PREUPD
162f0 41 54 45 5f 48 4f 4f 4b 0a 20 20 20 20 54 63 6c  ATE_HOOK.    Tcl
16300 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
16310 74 65 72 70 2c 20 22 70 72 65 75 70 64 61 74 65  terp, "preupdate
16320 5f 68 6f 6f 6b 20 77 61 73 20 6f 6d 69 74 74 65  _hook was omitte
16330 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  d at compile-tim
16340 65 22 29 3b 0a 20 20 20 20 72 63 20 3d 20 54 43  e");.    rc = TC
16350 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 20  L_ERROR;.#else. 
16360 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
16370 63 68 61 72 20 2a 61 7a 53 75 62 5b 5d 20 3d 20  char *azSub[] = 
16380 7b 22 63 6f 75 6e 74 22 2c 20 22 64 65 70 74 68  {"count", "depth
16390 22 2c 20 22 68 6f 6f 6b 22 2c 20 22 6e 65 77 22  ", "hook", "new"
163a0 2c 20 22 6f 6c 64 22 2c 20 30 7d 3b 0a 20 20 20  , "old", 0};.   
163b0 20 65 6e 75 6d 20 44 62 50 72 65 75 70 64 61 74   enum DbPreupdat
163c0 65 53 75 62 43 6d 64 20 7b 0a 20 20 20 20 20 20  eSubCmd {.      
163d0 50 52 45 5f 43 4f 55 4e 54 2c 20 50 52 45 5f 44  PRE_COUNT, PRE_D
163e0 45 50 54 48 2c 20 50 52 45 5f 48 4f 4f 4b 2c 20  EPTH, PRE_HOOK, 
163f0 50 52 45 5f 4e 45 57 2c 20 50 52 45 5f 4f 4c 44  PRE_NEW, PRE_OLD
16400 0a 20 20 20 20 7d 3b 0a 20 20 20 20 69 6e 74 20  .    };.    int 
16410 69 53 75 62 3b 0a 0a 20 20 20 20 69 66 28 20 6f  iSub;..    if( o
16420 62 6a 63 3c 33 20 29 7b 0a 20 20 20 20 20 20 54  bjc<3 ){.      T
16430 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
16440 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c  interp, 2, objv,
16450 20 22 53 55 42 2d 43 4f 4d 4d 41 4e 44 20 3f 41   "SUB-COMMAND ?A
16460 52 47 53 3f 22 29 3b 0a 20 20 20 20 7d 0a 20 20  RGS?");.    }.  
16470 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 64    if( Tcl_GetInd
16480 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  exFromObj(interp
16490 2c 20 6f 62 6a 76 5b 32 5d 2c 20 61 7a 53 75 62  , objv[2], azSub
164a0 2c 20 22 73 75 62 2d 63 6f 6d 6d 61 6e 64 22 2c  , "sub-command",
164b0 20 30 2c 20 26 69 53 75 62 29 20 29 7b 0a 20 20   0, &iSub) ){.  
164c0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
164d0 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  RROR;.    }..   
164e0 20 73 77 69 74 63 68 28 20 28 65 6e 75 6d 20 44   switch( (enum D
164f0 62 50 72 65 75 70 64 61 74 65 53 75 62 43 6d 64  bPreupdateSubCmd
16500 29 69 53 75 62 20 29 7b 0a 20 20 20 20 20 20 63  )iSub ){.      c
16510 61 73 65 20 50 52 45 5f 43 4f 55 4e 54 3a 20 7b  ase PRE_COUNT: {
16520 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43 6f  .        int nCo
16530 6c 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 75  l = sqlite3_preu
16540 70 64 61 74 65 5f 63 6f 75 6e 74 28 70 44 62 2d  pdate_count(pDb-
16550 3e 64 62 29 3b 0a 20 20 20 20 20 20 20 20 54 63  >db);.        Tc
16560 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
16570 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e  nterp, Tcl_NewIn
16580 74 4f 62 6a 28 6e 43 6f 6c 29 29 3b 0a 20 20 20  tObj(nCol));.   
16590 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
165a0 20 20 7d 0a 0a 20 20 20 20 20 20 63 61 73 65 20    }..      case 
165b0 50 52 45 5f 48 4f 4f 4b 3a 20 7b 0a 20 20 20 20  PRE_HOOK: {.    
165c0 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 34 20 29      if( objc>4 )
165d0 7b 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f  {.          Tcl_
165e0 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
165f0 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 68  erp, 2, objv, "h
16600 6f 6f 6b 20 3f 53 43 52 49 50 54 3f 22 29 3b 0a  ook ?SCRIPT?");.
16610 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
16620 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
16630 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 44 62      }.        Db
16640 48 6f 6f 6b 43 6d 64 28 69 6e 74 65 72 70 2c 20  HookCmd(interp, 
16650 70 44 62 2c 20 28 6f 62 6a 63 3d 3d 34 20 3f 20  pDb, (objc==4 ? 
16660 6f 62 6a 76 5b 33 5d 20 3a 20 30 29 2c 20 26 70  objv[3] : 0), &p
16670 44 62 2d 3e 70 50 72 65 55 70 64 61 74 65 48 6f  Db->pPreUpdateHo
16680 6f 6b 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  ok);.        bre
16690 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ak;.      }..   
166a0 20 20 20 63 61 73 65 20 50 52 45 5f 44 45 50 54     case PRE_DEPT
166b0 48 3a 20 7b 0a 20 20 20 20 20 20 20 20 54 63 6c  H: {.        Tcl
166c0 5f 4f 62 6a 20 2a 70 52 65 74 3b 0a 20 20 20 20  _Obj *pRet;.    
166d0 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20      if( objc!=3 
166e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c  ){.          Tcl
166f0 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
16700 74 65 72 70 2c 20 33 2c 20 6f 62 6a 76 2c 20 22  terp, 3, objv, "
16710 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  ");.          re
16720 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
16730 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
16740 20 20 70 52 65 74 20 3d 20 54 63 6c 5f 4e 65 77    pRet = Tcl_New
16750 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f 70  IntObj(sqlite3_p
16760 72 65 75 70 64 61 74 65 5f 64 65 70 74 68 28 70  reupdate_depth(p
16770 44 62 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20 20  Db->db));.      
16780 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
16790 6c 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74 29  lt(interp, pRet)
167a0 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
167b0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
167c0 63 61 73 65 20 50 52 45 5f 4e 45 57 3a 0a 20 20  case PRE_NEW:.  
167d0 20 20 20 20 63 61 73 65 20 50 52 45 5f 4f 4c 44      case PRE_OLD
167e0 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  : {.        int 
167f0 69 49 64 78 3b 0a 20 20 20 20 20 20 20 20 73 71  iIdx;.        sq
16800 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61  lite3_value *pVa
16810 6c 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  lue;.        if(
16820 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20   objc!=4 ){.    
16830 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
16840 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 33  umArgs(interp, 3
16850 2c 20 6f 62 6a 76 2c 20 22 49 4e 44 45 58 22 29  , objv, "INDEX")
16860 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
16870 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
16880 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
16890 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72  if( Tcl_GetIntFr
168a0 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
168b0 6a 76 5b 33 5d 2c 20 26 69 49 64 78 29 20 29 7b  jv[3], &iIdx) ){
168c0 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
168d0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
168e0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
168f0 69 66 28 20 69 53 75 62 3d 3d 50 52 45 5f 4f 4c  if( iSub==PRE_OL
16900 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  D ){.          r
16910 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 75  c = sqlite3_preu
16920 70 64 61 74 65 5f 6f 6c 64 28 70 44 62 2d 3e 64  pdate_old(pDb->d
16930 62 2c 20 69 49 64 78 2c 20 26 70 56 61 6c 75 65  b, iIdx, &pValue
16940 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
16950 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  {.          asse
16960 72 74 28 20 69 53 75 62 3d 3d 50 52 45 5f 4e 45  rt( iSub==PRE_NE
16970 57 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  W );.          r
16980 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 75  c = sqlite3_preu
16990 70 64 61 74 65 5f 6e 65 77 28 70 44 62 2d 3e 64  pdate_new(pDb->d
169a0 62 2c 20 69 49 64 78 2c 20 26 70 56 61 6c 75 65  b, iIdx, &pValue
169b0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  );.        }..  
169c0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
169d0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
169e0 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 4f       Tcl_Obj *pO
169f0 62 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4f  bj;.          pO
16a00 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69  bj = Tcl_NewStri
16a10 6e 67 4f 62 6a 28 28 63 68 61 72 2a 29 73 71 6c  ngObj((char*)sql
16a20 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
16a30 70 56 61 6c 75 65 29 2c 20 2d 31 29 3b 0a 20 20  pValue), -1);.  
16a40 20 20 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f          Tcl_SetO
16a50 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
16a60 20 70 4f 62 6a 29 3b 0a 20 20 20 20 20 20 20 20   pObj);.        
16a70 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
16a80 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
16a90 74 28 69 6e 74 65 72 70 2c 20 73 71 6c 69 74 65  t(interp, sqlite
16aa0 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62  3_errmsg(pDb->db
16ab0 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  ), 0);.         
16ac0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
16ad0 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  R;.        }.   
16ae0 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69     }.    }.#endi
16af0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42  f /* SQLITE_ENAB
16b00 4c 45 5f 50 52 45 55 50 44 41 54 45 5f 48 4f 4f  LE_PREUPDATE_HOO
16b10 4b 20 2a 2f 0a 20 20 20 20 62 72 65 61 6b 3b 0a  K */.    break;.
16b20 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20    }..  /*.  **  
16b30 20 20 24 64 62 20 77 61 6c 5f 68 6f 6f 6b 20 3f    $db wal_hook ?
16b40 73 63 72 69 70 74 3f 0a 20 20 2a 2a 20 20 20 20  script?.  **    
16b50 24 64 62 20 75 70 64 61 74 65 5f 68 6f 6f 6b 20  $db update_hook 
16b60 3f 73 63 72 69 70 74 3f 0a 20 20 2a 2a 20 20 20  ?script?.  **   
16b70 20 24 64 62 20 72 6f 6c 6c 62 61 63 6b 5f 68 6f   $db rollback_ho
16b80 6f 6b 20 3f 73 63 72 69 70 74 3f 0a 20 20 2a 2f  ok ?script?.  */
16b90 0a 20 20 63 61 73 65 20 44 42 5f 57 41 4c 5f 48  .  case DB_WAL_H
16ba0 4f 4f 4b 3a 20 0a 20 20 63 61 73 65 20 44 42 5f  OOK: .  case DB_
16bb0 55 50 44 41 54 45 5f 48 4f 4f 4b 3a 20 0a 20 20  UPDATE_HOOK: .  
16bc0 63 61 73 65 20 44 42 5f 52 4f 4c 4c 42 41 43 4b  case DB_ROLLBACK
16bd0 5f 48 4f 4f 4b 3a 20 7b 0a 20 20 20 20 2f 2a 20  _HOOK: {.    /* 
16be0 73 65 74 20 70 70 48 6f 6f 6b 20 74 6f 20 70 6f  set ppHook to po
16bf0 69 6e 74 20 61 74 20 70 55 70 64 61 74 65 48 6f  int at pUpdateHo
16c00 6f 6b 20 6f 72 20 70 52 6f 6c 6c 62 61 63 6b 48  ok or pRollbackH
16c10 6f 6f 6b 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f  ook, depending o
16c20 6e 20 0a 20 20 20 20 2a 2a 20 77 68 65 74 68 65  n .    ** whethe
16c30 72 20 5b 24 64 62 20 75 70 64 61 74 65 5f 68 6f  r [$db update_ho
16c40 6f 6b 5d 20 6f 72 20 5b 24 64 62 20 72 6f 6c 6c  ok] or [$db roll
16c50 62 61 63 6b 5f 68 6f 6f 6b 5d 20 77 61 73 20 69  back_hook] was i
16c60 6e 76 6f 6b 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  nvoked..    */. 
16c70 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 70 70 48     Tcl_Obj **ppH
16c80 6f 6f 6b 3b 20 0a 20 20 20 20 69 66 28 20 63 68  ook; .    if( ch
16c90 6f 69 63 65 3d 3d 44 42 5f 57 41 4c 5f 48 4f 4f  oice==DB_WAL_HOO
16ca0 4b 20 29 20 70 70 48 6f 6f 6b 20 3d 20 26 70 44  K ) ppHook = &pD
16cb0 62 2d 3e 70 57 61 6c 48 6f 6f 6b 3b 0a 20 20 20  b->pWalHook;.   
16cc0 20 69 66 28 20 63 68 6f 69 63 65 3d 3d 44 42 5f   if( choice==DB_
16cd0 55 50 44 41 54 45 5f 48 4f 4f 4b 20 29 20 70 70  UPDATE_HOOK ) pp
16ce0 48 6f 6f 6b 20 3d 20 26 70 44 62 2d 3e 70 55 70  Hook = &pDb->pUp
16cf0 64 61 74 65 48 6f 6f 6b 3b 0a 20 20 20 20 69 66  dateHook;.    if
16d00 28 20 63 68 6f 69 63 65 3d 3d 44 42 5f 52 4f 4c  ( choice==DB_ROL
16d10 4c 42 41 43 4b 5f 48 4f 4f 4b 20 29 20 70 70 48  LBACK_HOOK ) ppH
16d20 6f 6f 6b 20 3d 20 26 70 44 62 2d 3e 70 52 6f 6c  ook = &pDb->pRol
16d30 6c 62 61 63 6b 48 6f 6f 6b 3b 0a 20 20 20 20 69  lbackHook;.    i
16d40 66 28 20 6f 62 6a 63 3e 33 20 29 7b 0a 20 20 20  f( objc>3 ){.   
16d50 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
16d60 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20  Args(interp, 2, 
16d70 6f 62 6a 76 2c 20 22 3f 53 43 52 49 50 54 3f 22  objv, "?SCRIPT?"
16d80 29 3b 0a 20 20 20 20 20 20 20 72 65 74 75 72 6e  );.       return
16d90 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
16da0 7d 0a 0a 20 20 20 20 44 62 48 6f 6f 6b 43 6d 64  }..    DbHookCmd
16db0 28 69 6e 74 65 72 70 2c 20 70 44 62 2c 20 28 6f  (interp, pDb, (o
16dc0 62 6a 63 3d 3d 33 20 3f 20 6f 62 6a 76 5b 32 5d  bjc==3 ? objv[2]
16dd0 20 3a 20 30 29 2c 20 70 70 48 6f 6f 6b 29 3b 0a   : 0), ppHook);.
16de0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
16df0 20 20 2f 2a 20 20 20 20 24 64 62 20 76 65 72 73    /*    $db vers
16e00 69 6f 6e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65  ion.  **.  ** Re
16e10 74 75 72 6e 20 74 68 65 20 76 65 72 73 69 6f 6e  turn the version
16e20 20 73 74 72 69 6e 67 20 66 6f 72 20 74 68 69 73   string for this
16e30 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a   database..  */.
16e40 20 20 63 61 73 65 20 44 42 5f 56 45 52 53 49 4f    case DB_VERSIO
16e50 4e 3a 20 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74  N: {.    Tcl_Set
16e60 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28  Result(interp, (
16e70 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 6c  char *)sqlite3_l
16e80 69 62 76 65 72 73 69 6f 6e 28 29 2c 20 54 43 4c  ibversion(), TCL
16e90 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 62 72  _STATIC);.    br
16ea0 65 61 6b 3b 0a 20 20 7d 0a 0a 0a 20 20 7d 20 2f  eak;.  }...  } /
16eb0 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 53 57 49  * End of the SWI
16ec0 54 43 48 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  TCH statement */
16ed0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
16ee0 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 43 4c 5f  .#if SQLITE_TCL_
16ef0 4e 52 45 0a 2f 2a 0a 2a 2a 20 41 64 61 70 74 6f  NRE./*.** Adapto
16f00 72 20 74 68 61 74 20 70 72 6f 76 69 64 65 73 20  r that provides 
16f10 61 6e 20 6f 62 6a 43 6d 64 20 69 6e 74 65 72 66  an objCmd interf
16f20 61 63 65 20 74 6f 20 74 68 65 20 4e 52 45 2d 65  ace to the NRE-e
16f30 6e 61 62 6c 65 64 0a 2a 2a 20 69 6e 74 65 72 66  nabled.** interf
16f40 61 63 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ace implementati
16f50 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
16f60 74 20 44 62 4f 62 6a 43 6d 64 41 64 61 70 74 6f  t DbObjCmdAdapto
16f70 72 28 0a 20 20 76 6f 69 64 20 2a 63 64 2c 0a 20  r(.  void *cd,. 
16f80 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
16f90 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
16fa0 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73  .  Tcl_Obj *cons
16fb0 74 2a 6f 62 6a 76 0a 29 7b 0a 20 20 72 65 74 75  t*objv.){.  retu
16fc0 72 6e 20 54 63 6c 5f 4e 52 43 61 6c 6c 4f 62 6a  rn Tcl_NRCallObj
16fd0 50 72 6f 63 28 69 6e 74 65 72 70 2c 20 44 62 4f  Proc(interp, DbO
16fe0 62 6a 43 6d 64 2c 20 63 64 2c 20 6f 62 6a 63 2c  bjCmd, cd, objc,
16ff0 20 6f 62 6a 76 29 3b 0a 7d 0a 23 65 6e 64 69 66   objv);.}.#endif
17000 20 2f 2a 20 53 51 4c 49 54 45 5f 54 43 4c 5f 4e   /* SQLITE_TCL_N
17010 52 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 20 20 73  RE */../*.**   s
17020 71 6c 69 74 65 33 20 44 42 4e 41 4d 45 20 46 49  qlite3 DBNAME FI
17030 4c 45 4e 41 4d 45 20 3f 2d 76 66 73 20 56 46 53  LENAME ?-vfs VFS
17040 4e 41 4d 45 3f 20 3f 2d 6b 65 79 20 4b 45 59 3f  NAME? ?-key KEY?
17050 20 3f 2d 72 65 61 64 6f 6e 6c 79 20 42 4f 4f 4c   ?-readonly BOOL
17060 45 41 4e 3f 0a 2a 2a 20 20 20 20 20 20 20 20 20  EAN?.**         
17070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17080 20 20 3f 2d 63 72 65 61 74 65 20 42 4f 4f 4c 45    ?-create BOOLE
17090 41 4e 3f 20 3f 2d 6e 6f 6d 75 74 65 78 20 42 4f  AN? ?-nomutex BO
170a0 4f 4c 45 41 4e 3f 0a 2a 2a 0a 2a 2a 20 54 68 69  OLEAN?.**.** Thi
170b0 73 20 69 73 20 74 68 65 20 6d 61 69 6e 20 54 63  s is the main Tc
170c0 6c 20 63 6f 6d 6d 61 6e 64 2e 20 20 57 68 65 6e  l command.  When
170d0 20 74 68 65 20 22 73 71 6c 69 74 65 22 20 54 63   the "sqlite" Tc
170e0 6c 20 63 6f 6d 6d 61 6e 64 20 69 73 0a 2a 2a 20  l command is.** 
170f0 69 6e 76 6f 6b 65 64 2c 20 74 68 69 73 20 72 6f  invoked, this ro
17100 75 74 69 6e 65 20 72 75 6e 73 20 74 6f 20 70 72  utine runs to pr
17110 6f 63 65 73 73 20 74 68 61 74 20 63 6f 6d 6d 61  ocess that comma
17120 6e 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69  nd..**.** The fi
17130 72 73 74 20 61 72 67 75 6d 65 6e 74 2c 20 44 42  rst argument, DB
17140 4e 41 4d 45 2c 20 69 73 20 61 6e 20 61 72 62 69  NAME, is an arbi
17150 74 72 61 72 79 20 6e 61 6d 65 20 66 6f 72 20 61  trary name for a
17160 20 6e 65 77 0a 2a 2a 20 64 61 74 61 62 61 73 65   new.** database
17170 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 20 54 68   connection.  Th
17180 69 73 20 63 6f 6d 6d 61 6e 64 20 63 72 65 61 74  is command creat
17190 65 73 20 61 20 6e 65 77 20 63 6f 6d 6d 61 6e 64  es a new command
171a0 20 6e 61 6d 65 64 0a 2a 2a 20 44 42 4e 41 4d 45   named.** DBNAME
171b0 20 74 68 61 74 20 69 73 20 75 73 65 64 20 74 6f   that is used to
171c0 20 63 6f 6e 74 72 6f 6c 20 74 68 61 74 20 63 6f   control that co
171d0 6e 6e 65 63 74 69 6f 6e 2e 20 20 54 68 65 20 64  nnection.  The d
171e0 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65  atabase.** conne
171f0 63 74 69 6f 6e 20 69 73 20 64 65 6c 65 74 65 64  ction is deleted
17200 20 77 68 65 6e 20 74 68 65 20 44 42 4e 41 4d 45   when the DBNAME
17210 20 63 6f 6d 6d 61 6e 64 20 69 73 20 64 65 6c 65   command is dele
17220 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  ted..**.** The s
17230 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69  econd argument i
17240 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
17250 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
17260 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  .**.*/.static in
17270 74 20 44 62 4d 61 69 6e 28 76 6f 69 64 20 2a 63  t DbMain(void *c
17280 64 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  d, Tcl_Interp *i
17290 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c  nterp, int objc,
172a0 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 2a 6f  Tcl_Obj *const*o
172b0 62 6a 76 29 7b 0a 20 20 53 71 6c 69 74 65 44 62  bjv){.  SqliteDb
172c0 20 2a 70 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61   *p;.  const cha
172d0 72 20 2a 7a 41 72 67 3b 0a 20 20 63 68 61 72 20  r *zArg;.  char 
172e0 2a 7a 45 72 72 4d 73 67 3b 0a 20 20 69 6e 74 20  *zErrMsg;.  int 
172f0 69 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  i;.  const char 
17300 2a 7a 46 69 6c 65 3b 0a 20 20 63 6f 6e 73 74 20  *zFile;.  const 
17310 63 68 61 72 20 2a 7a 56 66 73 20 3d 20 30 3b 0a  char *zVfs = 0;.
17320 20 20 69 6e 74 20 66 6c 61 67 73 3b 0a 20 20 54    int flags;.  T
17330 63 6c 5f 44 53 74 72 69 6e 67 20 74 72 61 6e 73  cl_DString trans
17340 6c 61 74 65 64 46 69 6c 65 6e 61 6d 65 3b 0a 23  latedFilename;.#
17350 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53  ifdef SQLITE_HAS
17360 5f 43 4f 44 45 43 0a 20 20 76 6f 69 64 20 2a 70  _CODEC.  void *p
17370 4b 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e  Key = 0;.  int n
17380 4b 65 79 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  Key = 0;.#endif.
17390 0a 20 20 2f 2a 20 49 6e 20 6e 6f 72 6d 61 6c 20  .  /* In normal 
173a0 75 73 65 2c 20 65 61 63 68 20 54 43 4c 20 69 6e  use, each TCL in
173b0 74 65 72 70 72 65 74 65 72 20 72 75 6e 73 20 69  terpreter runs i
173c0 6e 20 61 20 73 69 6e 67 6c 65 20 74 68 72 65 61  n a single threa
173d0 64 2e 20 20 53 6f 0a 20 20 2a 2a 20 62 79 20 64  d.  So.  ** by d
173e0 65 66 61 75 6c 74 2c 20 77 65 20 63 61 6e 20 74  efault, we can t
173f0 75 72 6e 20 6f 66 20 6d 75 74 65 78 69 6e 67 20  urn of mutexing 
17400 6f 6e 20 53 51 4c 69 74 65 20 64 61 74 61 62 61  on SQLite databa
17410 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 0a  se connections..
17420 20 20 2a 2a 20 48 6f 77 65 76 65 72 2c 20 66 6f    ** However, fo
17430 72 20 74 65 73 74 69 6e 67 20 70 75 72 70 6f 73  r testing purpos
17440 65 73 20 69 74 20 69 73 20 75 73 65 66 75 6c 20  es it is useful 
17450 74 6f 20 68 61 76 65 20 6d 75 74 65 78 65 73 20  to have mutexes 
17460 74 75 72 6e 65 64 0a 20 20 2a 2a 20 6f 6e 2e 20  turned.  ** on. 
17470 20 53 6f 2c 20 62 79 20 64 65 66 61 75 6c 74 2c   So, by default,
17480 20 6d 75 74 65 78 65 73 20 64 65 66 61 75 6c 74   mutexes default
17490 20 6f 66 66 2e 20 20 42 75 74 20 69 66 20 63 6f   off.  But if co
174a0 6d 70 69 6c 65 64 20 77 69 74 68 0a 20 20 2a 2a  mpiled with.  **
174b0 20 53 51 4c 49 54 45 5f 54 43 4c 5f 44 45 46 41   SQLITE_TCL_DEFA
174c0 55 4c 54 5f 46 55 4c 4c 4d 55 54 45 58 20 74 68  ULT_FULLMUTEX th
174d0 65 6e 20 6d 75 74 65 78 65 73 20 64 65 66 61 75  en mutexes defau
174e0 6c 74 20 6f 6e 2e 0a 20 20 2a 2f 0a 23 69 66 64  lt on..  */.#ifd
174f0 65 66 20 53 51 4c 49 54 45 5f 54 43 4c 5f 44 45  ef SQLITE_TCL_DE
17500 46 41 55 4c 54 5f 46 55 4c 4c 4d 55 54 45 58 0a  FAULT_FULLMUTEX.
17510 20 20 66 6c 61 67 73 20 3d 20 53 51 4c 49 54 45    flags = SQLITE
17520 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20  _OPEN_READWRITE 
17530 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  | SQLITE_OPEN_CR
17540 45 41 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50  EATE | SQLITE_OP
17550 45 4e 5f 46 55 4c 4c 4d 55 54 45 58 3b 0a 23 65  EN_FULLMUTEX;.#e
17560 6c 73 65 0a 20 20 66 6c 61 67 73 20 3d 20 53 51  lse.  flags = SQ
17570 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
17580 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45  ITE | SQLITE_OPE
17590 4e 5f 43 52 45 41 54 45 20 7c 20 53 51 4c 49 54  N_CREATE | SQLIT
175a0 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58 3b 0a  E_OPEN_NOMUTEX;.
175b0 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 6f 62  #endif..  if( ob
175c0 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20 7a 41 72  jc==2 ){.    zAr
175d0 67 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  g = Tcl_GetStrin
175e0 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d  gFromObj(objv[1]
175f0 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 73 74  , 0);.    if( st
17600 72 63 6d 70 28 7a 41 72 67 2c 22 2d 76 65 72 73  rcmp(zArg,"-vers
17610 69 6f 6e 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ion")==0 ){.    
17620 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
17630 6c 74 28 69 6e 74 65 72 70 2c 73 71 6c 69 74 65  lt(interp,sqlite
17640 33 5f 76 65 72 73 69 6f 6e 2c 30 29 3b 0a 20 20  3_version,0);.  
17650 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f      return TCL_O
17660 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  K;.    }.    if(
17670 20 73 74 72 63 6d 70 28 7a 41 72 67 2c 22 2d 68   strcmp(zArg,"-h
17680 61 73 2d 63 6f 64 65 63 22 29 3d 3d 30 20 29 7b  as-codec")==0 ){
17690 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48  .#ifdef SQLITE_H
176a0 41 53 5f 43 4f 44 45 43 0a 20 20 20 20 20 20 54  AS_CODEC.      T
176b0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
176c0 69 6e 74 65 72 70 2c 22 31 22 2c 30 29 3b 0a 23  interp,"1",0);.#
176d0 65 6c 73 65 0a 20 20 20 20 20 20 54 63 6c 5f 41  else.      Tcl_A
176e0 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
176f0 72 70 2c 22 30 22 2c 30 29 3b 0a 23 65 6e 64 69  rp,"0",0);.#endi
17700 66 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  f.      return T
17710 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d  CL_OK;.    }.  }
17720 0a 20 20 66 6f 72 28 69 3d 33 3b 20 69 2b 31 3c  .  for(i=3; i+1<
17730 6f 62 6a 63 3b 20 69 2b 3d 32 29 7b 0a 20 20 20  objc; i+=2){.   
17740 20 7a 41 72 67 20 3d 20 54 63 6c 5f 47 65 74 53   zArg = Tcl_GetS
17750 74 72 69 6e 67 28 6f 62 6a 76 5b 69 5d 29 3b 0a  tring(objv[i]);.
17760 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
17770 41 72 67 2c 22 2d 6b 65 79 22 29 3d 3d 30 20 29  Arg,"-key")==0 )
17780 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
17790 48 41 53 5f 43 4f 44 45 43 0a 20 20 20 20 20 20  HAS_CODEC.      
177a0 70 4b 65 79 20 3d 20 54 63 6c 5f 47 65 74 42 79  pKey = Tcl_GetBy
177b0 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6f  teArrayFromObj(o
177c0 62 6a 76 5b 69 2b 31 5d 2c 20 26 6e 4b 65 79 29  bjv[i+1], &nKey)
177d0 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c  ;.#endif.    }el
177e0 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 41  se if( strcmp(zA
177f0 72 67 2c 20 22 2d 76 66 73 22 29 3d 3d 30 20 29  rg, "-vfs")==0 )
17800 7b 0a 20 20 20 20 20 20 7a 56 66 73 20 3d 20 54  {.      zVfs = T
17810 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
17820 76 5b 69 2b 31 5d 29 3b 0a 20 20 20 20 7d 65 6c  v[i+1]);.    }el
17830 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 41  se if( strcmp(zA
17840 72 67 2c 20 22 2d 72 65 61 64 6f 6e 6c 79 22 29  rg, "-readonly")
17850 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ==0 ){.      int
17860 20 62 3b 0a 20 20 20 20 20 20 69 66 28 20 54 63   b;.      if( Tc
17870 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d  l_GetBooleanFrom
17880 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
17890 5b 69 2b 31 5d 2c 20 26 62 29 20 29 20 72 65 74  [i+1], &b) ) ret
178a0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
178b0 20 20 20 20 20 69 66 28 20 62 20 29 7b 0a 20 20       if( b ){.  
178c0 20 20 20 20 20 20 66 6c 61 67 73 20 26 3d 20 7e        flags &= ~
178d0 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41  (SQLITE_OPEN_REA
178e0 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50  DWRITE|SQLITE_OP
178f0 45 4e 5f 43 52 45 41 54 45 29 3b 0a 20 20 20 20  EN_CREATE);.    
17900 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c      flags |= SQL
17910 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
17920 59 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  Y;.      }else{.
17930 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 26 3d          flags &=
17940 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45   ~SQLITE_OPEN_RE
17950 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 20 20  ADONLY;.        
17960 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  flags |= SQLITE_
17970 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 3b 0a  OPEN_READWRITE;.
17980 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
17990 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 41 72  e if( strcmp(zAr
179a0 67 2c 20 22 2d 63 72 65 61 74 65 22 29 3d 3d 30  g, "-create")==0
179b0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 62 3b   ){.      int b;
179c0 0a 20 20 20 20 20 20 69 66 28 20 54 63 6c 5f 47  .      if( Tcl_G
179d0 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a  etBooleanFromObj
179e0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 69 2b  (interp, objv[i+
179f0 31 5d 2c 20 26 62 29 20 29 20 72 65 74 75 72 6e  1], &b) ) return
17a00 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
17a10 20 20 69 66 28 20 62 20 26 26 20 28 66 6c 61 67    if( b && (flag
17a20 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
17a30 52 45 41 44 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a  READONLY)==0 ){.
17a40 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d          flags |=
17a50 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45   SQLITE_OPEN_CRE
17a60 41 54 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ATE;.      }else
17a70 7b 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73 20  {.        flags 
17a80 26 3d 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  &= ~SQLITE_OPEN_
17a90 43 52 45 41 54 45 3b 0a 20 20 20 20 20 20 7d 0a  CREATE;.      }.
17aa0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
17ab0 72 63 6d 70 28 7a 41 72 67 2c 20 22 2d 6e 6f 6d  rcmp(zArg, "-nom
17ac0 75 74 65 78 22 29 3d 3d 30 20 29 7b 0a 20 20 20  utex")==0 ){.   
17ad0 20 20 20 69 6e 74 20 62 3b 0a 20 20 20 20 20 20     int b;.      
17ae0 69 66 28 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65  if( Tcl_GetBoole
17af0 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  anFromObj(interp
17b00 2c 20 6f 62 6a 76 5b 69 2b 31 5d 2c 20 26 62 29  , objv[i+1], &b)
17b10 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
17b20 52 4f 52 3b 0a 20 20 20 20 20 20 69 66 28 20 62  ROR;.      if( b
17b30 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6c 61 67   ){.        flag
17b40 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e  s |= SQLITE_OPEN
17b50 5f 4e 4f 4d 55 54 45 58 3b 0a 20 20 20 20 20 20  _NOMUTEX;.      
17b60 20 20 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49    flags &= ~SQLI
17b70 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54 45  TE_OPEN_FULLMUTE
17b80 58 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  X;.      }else{.
17b90 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 26 3d          flags &=
17ba0 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f   ~SQLITE_OPEN_NO
17bb0 4d 55 54 45 58 3b 0a 20 20 20 20 20 20 7d 0a 20  MUTEX;.      }. 
17bc0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
17bd0 63 6d 70 28 7a 41 72 67 2c 20 22 2d 66 75 6c 6c  cmp(zArg, "-full
17be0 6d 75 74 65 78 22 29 3d 3d 30 20 29 7b 0a 20 20  mutex")==0 ){.  
17bf0 20 20 20 20 69 6e 74 20 62 3b 0a 20 20 20 20 20      int b;.     
17c00 20 69 66 28 20 54 63 6c 5f 47 65 74 42 6f 6f 6c   if( Tcl_GetBool
17c10 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  eanFromObj(inter
17c20 70 2c 20 6f 62 6a 76 5b 69 2b 31 5d 2c 20 26 62  p, objv[i+1], &b
17c30 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
17c40 52 52 4f 52 3b 0a 20 20 20 20 20 20 69 66 28 20  RROR;.      if( 
17c50 62 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6c 61  b ){.        fla
17c60 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45  gs |= SQLITE_OPE
17c70 4e 5f 46 55 4c 4c 4d 55 54 45 58 3b 0a 20 20 20  N_FULLMUTEX;.   
17c80 20 20 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 53       flags &= ~S
17c90 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54  QLITE_OPEN_NOMUT
17ca0 45 58 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  EX;.      }else{
17cb0 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 26  .        flags &
17cc0 3d 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46  = ~SQLITE_OPEN_F
17cd0 55 4c 4c 4d 55 54 45 58 3b 0a 20 20 20 20 20 20  ULLMUTEX;.      
17ce0 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
17cf0 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
17d00 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 6b  ult(interp, "unk
17d10 6e 6f 77 6e 20 6f 70 74 69 6f 6e 3a 20 22 2c 20  nown option: ", 
17d20 7a 41 72 67 2c 20 28 63 68 61 72 2a 29 30 29 3b  zArg, (char*)0);
17d30 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
17d40 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
17d50 20 7d 0a 20 20 69 66 28 20 6f 62 6a 63 3c 33 20   }.  if( objc<3 
17d60 7c 7c 20 28 6f 62 6a 63 26 31 29 21 3d 31 20 29  || (objc&1)!=1 )
17d70 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
17d80 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
17d90 2c 20 6f 62 6a 76 2c 20 0a 20 20 20 20 20 20 22  , objv, .      "
17da0 48 41 4e 44 4c 45 20 46 49 4c 45 4e 41 4d 45 20  HANDLE FILENAME 
17db0 3f 2d 76 66 73 20 56 46 53 4e 41 4d 45 3f 20 3f  ?-vfs VFSNAME? ?
17dc0 2d 72 65 61 64 6f 6e 6c 79 20 42 4f 4f 4c 45 41  -readonly BOOLEA
17dd0 4e 3f 20 3f 2d 63 72 65 61 74 65 20 42 4f 4f 4c  N? ?-create BOOL
17de0 45 41 4e 3f 22 0a 20 20 20 20 20 20 22 20 3f 2d  EAN?".      " ?-
17df0 6e 6f 6d 75 74 65 78 20 42 4f 4f 4c 45 41 4e 3f  nomutex BOOLEAN?
17e00 20 3f 2d 66 75 6c 6c 6d 75 74 65 78 20 42 4f 4f   ?-fullmutex BOO
17e10 4c 45 41 4e 3f 22 0a 23 69 66 64 65 66 20 53 51  LEAN?".#ifdef SQ
17e20 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20  LITE_HAS_CODEC. 
17e30 20 20 20 20 20 22 20 3f 2d 6b 65 79 20 43 4f 44       " ?-key COD
17e40 45 43 4b 45 59 3f 22 0a 23 65 6e 64 69 66 0a 20  ECKEY?".#endif. 
17e50 20 20 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e     );.    return
17e60 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
17e70 20 20 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20    zErrMsg = 0;. 
17e80 20 70 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29   p = (SqliteDb*)
17e90 54 63 6c 5f 41 6c 6c 6f 63 28 20 73 69 7a 65 6f  Tcl_Alloc( sizeo
17ea0 66 28 2a 70 29 20 29 3b 0a 20 20 69 66 28 20 70  f(*p) );.  if( p
17eb0 3d 3d 30 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53  ==0 ){.    Tcl_S
17ec0 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
17ed0 20 22 6d 61 6c 6c 6f 63 20 66 61 69 6c 65 64 22   "malloc failed"
17ee0 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20  , TCL_STATIC);. 
17ef0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
17f00 52 4f 52 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65  ROR;.  }.  memse
17f10 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  t(p, 0, sizeof(*
17f20 70 29 29 3b 0a 20 20 7a 46 69 6c 65 20 3d 20 54  p));.  zFile = T
17f30 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
17f40 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30 29 3b  Obj(objv[2], 0);
17f50 0a 20 20 7a 46 69 6c 65 20 3d 20 54 63 6c 5f 54  .  zFile = Tcl_T
17f60 72 61 6e 73 6c 61 74 65 46 69 6c 65 4e 61 6d 65  ranslateFileName
17f70 28 69 6e 74 65 72 70 2c 20 7a 46 69 6c 65 2c 20  (interp, zFile, 
17f80 26 74 72 61 6e 73 6c 61 74 65 64 46 69 6c 65 6e  &translatedFilen
17f90 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ame);.  sqlite3_
17fa0 6f 70 65 6e 5f 76 32 28 7a 46 69 6c 65 2c 20 26  open_v2(zFile, &
17fb0 70 2d 3e 64 62 2c 20 66 6c 61 67 73 2c 20 7a 56  p->db, flags, zV
17fc0 66 73 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69  fs);.  Tcl_DStri
17fd0 6e 67 46 72 65 65 28 26 74 72 61 6e 73 6c 61 74  ngFree(&translat
17fe0 65 64 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69  edFilename);.  i
17ff0 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71  f( SQLITE_OK!=sq
18000 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28 70 2d  lite3_errcode(p-
18010 3e 64 62 29 20 29 7b 0a 20 20 20 20 7a 45 72 72  >db) ){.    zErr
18020 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Msg = sqlite3_mp
18030 72 69 6e 74 66 28 22 25 73 22 2c 20 73 71 6c 69  rintf("%s", sqli
18040 74 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62  te3_errmsg(p->db
18050 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  ));.    sqlite3_
18060 63 6c 6f 73 65 28 70 2d 3e 64 62 29 3b 0a 20 20  close(p->db);.  
18070 20 20 70 2d 3e 64 62 20 3d 20 30 3b 0a 20 20 7d    p->db = 0;.  }
18080 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48  .#ifdef SQLITE_H
18090 41 53 5f 43 4f 44 45 43 0a 20 20 69 66 28 20 70  AS_CODEC.  if( p
180a0 2d 3e 64 62 20 29 7b 0a 20 20 20 20 73 71 6c 69  ->db ){.    sqli
180b0 74 65 33 5f 6b 65 79 28 70 2d 3e 64 62 2c 20 70  te3_key(p->db, p
180c0 4b 65 79 2c 20 6e 4b 65 79 29 3b 0a 20 20 7d 0a  Key, nKey);.  }.
180d0 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 2d 3e  #endif.  if( p->
180e0 64 62 3d 3d 30 20 29 7b 0a 20 20 20 20 54 63 6c  db==0 ){.    Tcl
180f0 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
18100 70 2c 20 7a 45 72 72 4d 73 67 2c 20 54 43 4c 5f  p, zErrMsg, TCL_
18110 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 20 20 54  VOLATILE);.    T
18120 63 6c 5f 46 72 65 65 28 28 63 68 61 72 2a 29 70  cl_Free((char*)p
18130 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
18140 72 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20  ree(zErrMsg);.  
18150 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
18160 4f 52 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d 61 78  OR;.  }.  p->max
18170 53 74 6d 74 20 3d 20 4e 55 4d 5f 50 52 45 50 41  Stmt = NUM_PREPA
18180 52 45 44 5f 53 54 4d 54 53 3b 0a 20 20 70 2d 3e  RED_STMTS;.  p->
18190 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b  interp = interp;
181a0 0a 20 20 7a 41 72 67 20 3d 20 54 63 6c 5f 47 65  .  zArg = Tcl_Ge
181b0 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
181c0 62 6a 76 5b 31 5d 2c 20 30 29 3b 0a 20 20 69 66  bjv[1], 0);.  if
181d0 28 20 44 62 55 73 65 4e 72 65 28 29 20 29 7b 0a  ( DbUseNre() ){.
181e0 20 20 20 20 54 63 6c 5f 4e 52 43 72 65 61 74 65      Tcl_NRCreate
181f0 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20  Command(interp, 
18200 7a 41 72 67 2c 20 44 62 4f 62 6a 43 6d 64 41 64  zArg, DbObjCmdAd
18210 61 70 74 6f 72 2c 20 44 62 4f 62 6a 43 6d 64 2c  aptor, DbObjCmd,
18220 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
18230 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29           (char*)
18240 70 2c 20 44 62 44 65 6c 65 74 65 43 6d 64 29 3b  p, DbDeleteCmd);
18250 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 54 63  .  }else{.    Tc
18260 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61  l_CreateObjComma
18270 6e 64 28 69 6e 74 65 72 70 2c 20 7a 41 72 67 2c  nd(interp, zArg,
18280 20 44 62 4f 62 6a 43 6d 64 2c 20 28 63 68 61 72   DbObjCmd, (char
18290 2a 29 70 2c 20 44 62 44 65 6c 65 74 65 43 6d 64  *)p, DbDeleteCmd
182a0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
182b0 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
182c0 20 50 72 6f 76 69 64 65 20 61 20 64 75 6d 6d 79   Provide a dummy
182d0 20 54 63 6c 5f 49 6e 69 74 53 74 75 62 73 20 69   Tcl_InitStubs i
182e0 66 20 77 65 20 61 72 65 20 75 73 69 6e 67 20 74  f we are using t
182f0 68 69 73 20 61 73 20 61 20 73 74 61 74 69 63 0a  his as a static.
18300 2a 2a 20 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 23  ** library..*/.#
18310 69 66 6e 64 65 66 20 55 53 45 5f 54 43 4c 5f 53  ifndef USE_TCL_S
18320 54 55 42 53 0a 23 20 75 6e 64 65 66 20 20 54 63  TUBS.# undef  Tc
18330 6c 5f 49 6e 69 74 53 74 75 62 73 0a 23 20 64 65  l_InitStubs.# de
18340 66 69 6e 65 20 54 63 6c 5f 49 6e 69 74 53 74 75  fine Tcl_InitStu
18350 62 73 28 61 2c 62 2c 63 29 0a 23 65 6e 64 69 66  bs(a,b,c).#endif
18360 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72  ../*.** Make sur
18370 65 20 77 65 20 68 61 76 65 20 61 20 50 41 43 4b  e we have a PACK
18380 41 47 45 5f 56 45 52 53 49 4f 4e 20 6d 61 63 72  AGE_VERSION macr
18390 6f 20 64 65 66 69 6e 65 64 2e 20 20 54 68 69 73  o defined.  This
183a0 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 64 65 66 69   will be.** defi
183b0 6e 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  ned automaticall
183c0 79 20 62 79 20 74 68 65 20 54 45 41 20 6d 61 6b  y by the TEA mak
183d0 65 66 69 6c 65 2e 20 20 42 75 74 20 6f 74 68 65  efile.  But othe
183e0 72 20 6d 61 6b 65 66 69 6c 65 73 0a 2a 2a 20 64  r makefiles.** d
183f0 6f 20 6e 6f 74 20 64 65 66 69 6e 65 20 69 74 2e  o not define it.
18400 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 50 41 43 4b  .*/.#ifndef PACK
18410 41 47 45 5f 56 45 52 53 49 4f 4e 0a 23 20 64 65  AGE_VERSION.# de
18420 66 69 6e 65 20 50 41 43 4b 41 47 45 5f 56 45 52  fine PACKAGE_VER
18430 53 49 4f 4e 20 53 51 4c 49 54 45 5f 56 45 52 53  SION SQLITE_VERS
18440 49 4f 4e 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ION.#endif../*.*
18450 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 69  * Initialize thi
18460 73 20 6d 6f 64 75 6c 65 2e 0a 2a 2a 0a 2a 2a 20  s module..**.** 
18470 54 68 69 73 20 54 63 6c 20 6d 6f 64 75 6c 65 20  This Tcl module 
18480 63 6f 6e 74 61 69 6e 73 20 6f 6e 6c 79 20 61 20  contains only a 
18490 73 69 6e 67 6c 65 20 6e 65 77 20 54 63 6c 20 63  single new Tcl c
184a0 6f 6d 6d 61 6e 64 20 6e 61 6d 65 64 20 22 73 71  ommand named "sq
184b0 6c 69 74 65 22 2e 0a 2a 2a 20 28 48 65 6e 63 65  lite"..** (Hence
184c0 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 61 6d   there is no nam
184d0 65 73 70 61 63 65 2e 20 20 54 68 65 72 65 20 69  espace.  There i
184e0 73 20 6e 6f 20 70 6f 69 6e 74 20 69 6e 20 75 73  s no point in us
184f0 69 6e 67 20 61 20 6e 61 6d 65 73 70 61 63 65 0a  ing a namespace.
18500 2a 2a 20 69 66 20 74 68 65 20 65 78 74 65 6e 73  ** if the extens
18510 69 6f 6e 20 6f 6e 6c 79 20 73 75 70 70 6c 69 65  ion only supplie
18520 73 20 6f 6e 65 20 6e 65 77 20 6e 61 6d 65 21 29  s one new name!)
18530 20 20 54 68 65 20 22 73 71 6c 69 74 65 22 20 63    The "sqlite" c
18540 6f 6d 6d 61 6e 64 20 69 73 0a 2a 2a 20 75 73 65  ommand is.** use
18550 64 20 74 6f 20 6f 70 65 6e 20 61 20 6e 65 77 20  d to open a new 
18560 53 51 4c 69 74 65 20 64 61 74 61 62 61 73 65 2e  SQLite database.
18570 20 20 53 65 65 20 74 68 65 20 44 62 4d 61 69 6e    See the DbMain
18580 28 29 20 72 6f 75 74 69 6e 65 20 61 62 6f 76 65  () routine above
18590 0a 2a 2a 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  .** for addition
185a0 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
185b0 2a 2a 0a 2a 2a 20 54 68 65 20 45 58 54 45 52 4e  **.** The EXTERN
185c0 20 6d 61 63 72 6f 73 20 61 72 65 20 72 65 71 75   macros are requ
185d0 69 72 65 64 20 62 79 20 54 43 4c 20 69 6e 20 6f  ired by TCL in o
185e0 72 64 65 72 20 74 6f 20 77 6f 72 6b 20 6f 6e 20  rder to work on 
185f0 77 69 6e 64 6f 77 73 2e 0a 2a 2f 0a 45 58 54 45  windows..*/.EXTE
18600 52 4e 20 69 6e 74 20 53 71 6c 69 74 65 33 5f 49  RN int Sqlite3_I
18610 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a  nit(Tcl_Interp *
18620 69 6e 74 65 72 70 29 7b 0a 20 20 54 63 6c 5f 49  interp){.  Tcl_I
18630 6e 69 74 53 74 75 62 73 28 69 6e 74 65 72 70 2c  nitStubs(interp,
18640 20 22 38 2e 34 22 2c 20 30 29 3b 0a 20 20 54 63   "8.4", 0);.  Tc
18650 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61  l_CreateObjComma
18660 6e 64 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69  nd(interp, "sqli
18670 74 65 33 22 2c 20 28 54 63 6c 5f 4f 62 6a 43 6d  te3", (Tcl_ObjCm
18680 64 50 72 6f 63 2a 29 44 62 4d 61 69 6e 2c 20 30  dProc*)DbMain, 0
18690 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 50 6b 67 50  , 0);.  Tcl_PkgP
186a0 72 6f 76 69 64 65 28 69 6e 74 65 72 70 2c 20 22  rovide(interp, "
186b0 73 71 6c 69 74 65 33 22 2c 20 50 41 43 4b 41 47  sqlite3", PACKAG
186c0 45 5f 56 45 52 53 49 4f 4e 29 3b 0a 0a 23 69 66  E_VERSION);..#if
186d0 6e 64 65 66 20 53 51 4c 49 54 45 5f 33 5f 53 55  ndef SQLITE_3_SU
186e0 46 46 49 58 5f 4f 4e 4c 59 0a 20 20 2f 2a 20 54  FFIX_ONLY.  /* T
186f0 68 65 20 22 73 71 6c 69 74 65 22 20 61 6c 69 61  he "sqlite" alia
18700 73 20 69 73 20 75 6e 64 6f 63 75 6d 65 6e 74 65  s is undocumente
18710 64 2e 20 20 49 74 20 69 73 20 68 65 72 65 20 6f  d.  It is here o
18720 6e 6c 79 20 74 6f 20 73 75 70 70 6f 72 74 0a 20  nly to support. 
18730 20 2a 2a 20 6c 65 67 61 63 79 20 73 63 72 69 70   ** legacy scrip
18740 74 73 2e 20 20 41 6c 6c 20 6e 65 77 20 73 63 72  ts.  All new scr
18750 69 70 74 73 20 73 68 6f 75 6c 64 20 75 73 65 20  ipts should use 
18760 6f 6e 6c 79 20 74 68 65 20 22 73 71 6c 69 74 65  only the "sqlite
18770 33 22 0a 20 20 2a 2a 20 63 6f 6d 6d 61 6e 64 2e  3".  ** command.
18780 0a 20 20 2a 2f 0a 20 20 54 63 6c 5f 43 72 65 61  .  */.  Tcl_Crea
18790 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74  teObjCommand(int
187a0 65 72 70 2c 20 22 73 71 6c 69 74 65 22 2c 20 28  erp, "sqlite", (
187b0 54 63 6c 5f 4f 62 6a 43 6d 64 50 72 6f 63 2a 29  Tcl_ObjCmdProc*)
187c0 44 62 4d 61 69 6e 2c 20 30 2c 20 30 29 3b 0a 23  DbMain, 0, 0);.#
187d0 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20  endif..  return 
187e0 54 43 4c 5f 4f 4b 3b 0a 7d 0a 45 58 54 45 52 4e  TCL_OK;.}.EXTERN
187f0 20 69 6e 74 20 54 63 6c 73 71 6c 69 74 65 33 5f   int Tclsqlite3_
18800 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20  Init(Tcl_Interp 
18810 2a 69 6e 74 65 72 70 29 7b 20 72 65 74 75 72 6e  *interp){ return
18820 20 53 71 6c 69 74 65 33 5f 49 6e 69 74 28 69 6e   Sqlite3_Init(in
18830 74 65 72 70 29 3b 20 7d 0a 45 58 54 45 52 4e 20  terp); }.EXTERN 
18840 69 6e 74 20 53 71 6c 69 74 65 33 5f 53 61 66 65  int Sqlite3_Safe
18850 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20  Init(Tcl_Interp 
18860 2a 69 6e 74 65 72 70 29 7b 20 72 65 74 75 72 6e  *interp){ return
18870 20 54 43 4c 5f 4f 4b 3b 20 7d 0a 45 58 54 45 52   TCL_OK; }.EXTER
18880 4e 20 69 6e 74 20 54 63 6c 73 71 6c 69 74 65 33  N int Tclsqlite3
18890 5f 53 61 66 65 49 6e 69 74 28 54 63 6c 5f 49 6e  _SafeInit(Tcl_In
188a0 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 20 72  terp *interp){ r
188b0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 7d 0a  eturn TCL_OK; }.
188c0 45 58 54 45 52 4e 20 69 6e 74 20 53 71 6c 69 74  EXTERN int Sqlit
188d0 65 33 5f 55 6e 6c 6f 61 64 28 54 63 6c 5f 49 6e  e3_Unload(Tcl_In
188e0 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e  terp *interp, in
188f0 74 20 66 6c 61 67 73 29 7b 20 72 65 74 75 72 6e  t flags){ return
18900 20 54 43 4c 5f 4f 4b 3b 20 7d 0a 45 58 54 45 52   TCL_OK; }.EXTER
18910 4e 20 69 6e 74 20 54 63 6c 73 71 6c 69 74 65 33  N int Tclsqlite3
18920 5f 55 6e 6c 6f 61 64 28 54 63 6c 5f 49 6e 74 65  _Unload(Tcl_Inte
18930 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20  rp *interp, int 
18940 66 6c 61 67 73 29 7b 20 72 65 74 75 72 6e 20 54  flags){ return T
18950 43 4c 5f 4f 4b 3b 20 7d 0a 45 58 54 45 52 4e 20  CL_OK; }.EXTERN 
18960 69 6e 74 20 53 71 6c 69 74 65 33 5f 53 61 66 65  int Sqlite3_Safe
18970 55 6e 6c 6f 61 64 28 54 63 6c 5f 49 6e 74 65 72  Unload(Tcl_Inter
18980 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 66  p *interp, int f
18990 6c 61 67 73 29 7b 20 72 65 74 75 72 6e 20 54 43  lags){ return TC
189a0 4c 5f 4f 4b 3b 20 7d 0a 45 58 54 45 52 4e 20 69  L_OK; }.EXTERN i
189b0 6e 74 20 54 63 6c 73 71 6c 69 74 65 33 5f 53 61  nt Tclsqlite3_Sa
189c0 66 65 55 6e 6c 6f 61 64 28 54 63 6c 5f 49 6e 74  feUnload(Tcl_Int
189d0 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74  erp *interp, int
189e0 20 66 6c 61 67 73 29 7b 20 72 65 74 75 72 6e 20   flags){ return 
189f0 54 43 4c 5f 4f 4b 3b 7d 0a 0a 0a 23 69 66 6e 64  TCL_OK;}...#ifnd
18a00 65 66 20 53 51 4c 49 54 45 5f 33 5f 53 55 46 46  ef SQLITE_3_SUFF
18a10 49 58 5f 4f 4e 4c 59 0a 69 6e 74 20 53 71 6c 69  IX_ONLY.int Sqli
18a20 74 65 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  te_Init(Tcl_Inte
18a30 72 70 20 2a 69 6e 74 65 72 70 29 7b 20 72 65 74  rp *interp){ ret
18a40 75 72 6e 20 53 71 6c 69 74 65 33 5f 49 6e 69 74  urn Sqlite3_Init
18a50 28 69 6e 74 65 72 70 29 3b 20 7d 0a 69 6e 74 20  (interp); }.int 
18a60 54 63 6c 73 71 6c 69 74 65 5f 49 6e 69 74 28 54  Tclsqlite_Init(T
18a70 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
18a80 70 29 7b 20 72 65 74 75 72 6e 20 53 71 6c 69 74  p){ return Sqlit
18a90 65 33 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b  e3_Init(interp);
18aa0 20 7d 0a 69 6e 74 20 53 71 6c 69 74 65 5f 53 61   }.int Sqlite_Sa
18ab0 66 65 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  feInit(Tcl_Inter
18ac0 70 20 2a 69 6e 74 65 72 70 29 7b 20 72 65 74 75  p *interp){ retu
18ad0 72 6e 20 54 43 4c 5f 4f 4b 3b 20 7d 0a 69 6e 74  rn TCL_OK; }.int
18ae0 20 54 63 6c 73 71 6c 69 74 65 5f 53 61 66 65 49   Tclsqlite_SafeI
18af0 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a  nit(Tcl_Interp *
18b00 69 6e 74 65 72 70 29 7b 20 72 65 74 75 72 6e 20  interp){ return 
18b10 54 43 4c 5f 4f 4b 3b 20 7d 0a 69 6e 74 20 53 71  TCL_OK; }.int Sq
18b20 6c 69 74 65 5f 55 6e 6c 6f 61 64 28 54 63 6c 5f  lite_Unload(Tcl_
18b30 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
18b40 69 6e 74 20 66 6c 61 67 73 29 7b 20 72 65 74 75  int flags){ retu
18b50 72 6e 20 54 43 4c 5f 4f 4b 3b 20 7d 0a 69 6e 74  rn TCL_OK; }.int
18b60 20 54 63 6c 73 71 6c 69 74 65 5f 55 6e 6c 6f 61   Tclsqlite_Unloa
18b70 64 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  d(Tcl_Interp *in
18b80 74 65 72 70 2c 20 69 6e 74 20 66 6c 61 67 73 29  terp, int flags)
18b90 7b 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b  { return TCL_OK;
18ba0 20 7d 0a 69 6e 74 20 53 71 6c 69 74 65 5f 53 61   }.int Sqlite_Sa
18bb0 66 65 55 6e 6c 6f 61 64 28 54 63 6c 5f 49 6e 74  feUnload(Tcl_Int
18bc0 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74  erp *interp, int
18bd0 20 66 6c 61 67 73 29 7b 20 72 65 74 75 72 6e 20   flags){ return 
18be0 54 43 4c 5f 4f 4b 3b 20 7d 0a 69 6e 74 20 54 63  TCL_OK; }.int Tc
18bf0 6c 73 71 6c 69 74 65 5f 53 61 66 65 55 6e 6c 6f  lsqlite_SafeUnlo
18c00 61 64 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  ad(Tcl_Interp *i
18c10 6e 74 65 72 70 2c 20 69 6e 74 20 66 6c 61 67 73  nterp, int flags
18c20 29 7b 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  ){ return TCL_OK
18c30 3b 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65  ;}.#endif..#ifde
18c40 66 20 54 43 4c 53 48 0a 2f 2a 2a 2a 2a 2a 2a 2a  f TCLSH./*******
18c50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18c60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18c70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18c80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18c90 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 66  ******.** All of
18ca0 20 74 68 65 20 63 6f 64 65 20 74 68 61 74 20 66   the code that f
18cb0 6f 6c 6c 6f 77 73 20 69 73 20 75 73 65 64 20 74  ollows is used t
18cc0 6f 20 62 75 69 6c 64 20 73 74 61 6e 64 61 6c 6f  o build standalo
18cd0 6e 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  ne TCL interpret
18ce0 65 72 73 0a 2a 2a 20 74 68 61 74 20 61 72 65 20  ers.** that are 
18cf0 73 74 61 74 69 63 61 6c 6c 79 20 6c 69 6e 6b 65  statically linke
18d00 64 20 77 69 74 68 20 53 51 4c 69 74 65 2e 20 20  d with SQLite.  
18d10 45 6e 61 62 6c 65 20 74 68 65 73 65 20 62 79 20  Enable these by 
18d20 63 6f 6d 70 69 6c 69 6e 67 0a 2a 2a 20 77 69 74  compiling.** wit
18d30 68 20 2d 44 54 43 4c 53 48 3d 6e 20 77 68 65 72  h -DTCLSH=n wher
18d40 65 20 6e 20 63 61 6e 20 62 65 20 31 20 6f 72 20  e n can be 1 or 
18d50 32 2e 20 20 41 6e 20 6e 20 6f 66 20 31 20 67 65  2.  An n of 1 ge
18d60 6e 65 72 61 74 65 73 20 61 20 73 74 61 6e 64 61  nerates a standa
18d70 72 64 0a 2a 2a 20 74 63 6c 73 68 20 62 75 74 20  rd.** tclsh but 
18d80 77 69 74 68 20 53 51 4c 69 74 65 20 62 75 69 6c  with SQLite buil
18d90 74 20 69 6e 2e 20 20 41 6e 20 6e 20 6f 66 20 32  t in.  An n of 2
18da0 20 67 65 6e 65 72 61 74 65 73 20 74 68 65 20 53   generates the S
18db0 51 4c 69 74 65 20 73 70 61 63 65 0a 2a 2a 20 61  QLite space.** a
18dc0 6e 61 6c 79 73 69 73 20 70 72 6f 67 72 61 6d 2e  nalysis program.
18dd0 0a 2a 2f 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  .*/..#if defined
18de0 28 53 51 4c 49 54 45 5f 54 45 53 54 29 20 7c 7c  (SQLITE_TEST) ||
18df0 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
18e00 54 43 4c 4d 44 35 29 0a 2f 2a 0a 20 2a 20 54 68  TCLMD5)./*. * Th
18e10 69 73 20 63 6f 64 65 20 69 6d 70 6c 65 6d 65 6e  is code implemen
18e20 74 73 20 74 68 65 20 4d 44 35 20 6d 65 73 73 61  ts the MD5 messa
18e30 67 65 2d 64 69 67 65 73 74 20 61 6c 67 6f 72 69  ge-digest algori
18e40 74 68 6d 2e 0a 20 2a 20 54 68 65 20 61 6c 67 6f  thm.. * The algo
18e50 72 69 74 68 6d 20 69 73 20 64 75 65 20 74 6f 20  rithm is due to 
18e60 52 6f 6e 20 52 69 76 65 73 74 2e 20 20 54 68 69  Ron Rivest.  Thi
18e70 73 20 63 6f 64 65 20 77 61 73 0a 20 2a 20 77 72  s code was. * wr
18e80 69 74 74 65 6e 20 62 79 20 43 6f 6c 69 6e 20 50  itten by Colin P
18e90 6c 75 6d 62 20 69 6e 20 31 39 39 33 2c 20 6e 6f  lumb in 1993, no
18ea0 20 63 6f 70 79 72 69 67 68 74 20 69 73 20 63 6c   copyright is cl
18eb0 61 69 6d 65 64 2e 0a 20 2a 20 54 68 69 73 20 63  aimed.. * This c
18ec0 6f 64 65 20 69 73 20 69 6e 20 74 68 65 20 70 75  ode is in the pu
18ed0 62 6c 69 63 20 64 6f 6d 61 69 6e 3b 20 64 6f 20  blic domain; do 
18ee0 77 69 74 68 20 69 74 20 77 68 61 74 20 79 6f 75  with it what you
18ef0 20 77 69 73 68 2e 0a 20 2a 0a 20 2a 20 45 71 75   wish.. *. * Equ
18f00 69 76 61 6c 65 6e 74 20 63 6f 64 65 20 69 73 20  ivalent code is 
18f10 61 76 61 69 6c 61 62 6c 65 20 66 72 6f 6d 20 52  available from R
18f20 53 41 20 44 61 74 61 20 53 65 63 75 72 69 74 79  SA Data Security
18f30 2c 20 49 6e 63 2e 0a 20 2a 20 54 68 69 73 20 63  , Inc.. * This c
18f40 6f 64 65 20 68 61 73 20 62 65 65 6e 20 74 65 73  ode has been tes
18f50 74 65 64 20 61 67 61 69 6e 73 74 20 74 68 61 74  ted against that
18f60 2c 20 61 6e 64 20 69 73 20 65 71 75 69 76 61 6c  , and is equival
18f70 65 6e 74 2c 0a 20 2a 20 65 78 63 65 70 74 20 74  ent,. * except t
18f80 68 61 74 20 79 6f 75 20 64 6f 6e 27 74 20 6e 65  hat you don't ne
18f90 65 64 20 74 6f 20 69 6e 63 6c 75 64 65 20 74 77  ed to include tw
18fa0 6f 20 70 61 67 65 73 20 6f 66 20 6c 65 67 61 6c  o pages of legal
18fb0 65 73 65 0a 20 2a 20 77 69 74 68 20 65 76 65 72  ese. * with ever
18fc0 79 20 63 6f 70 79 2e 0a 20 2a 0a 20 2a 20 54 6f  y copy.. *. * To
18fd0 20 63 6f 6d 70 75 74 65 20 74 68 65 20 6d 65 73   compute the mes
18fe0 73 61 67 65 20 64 69 67 65 73 74 20 6f 66 20 61  sage digest of a
18ff0 20 63 68 75 6e 6b 20 6f 66 20 62 79 74 65 73 2c   chunk of bytes,
19000 20 64 65 63 6c 61 72 65 20 61 6e 0a 20 2a 20 4d   declare an. * M
19010 44 35 43 6f 6e 74 65 78 74 20 73 74 72 75 63 74  D5Context struct
19020 75 72 65 2c 20 70 61 73 73 20 69 74 20 74 6f 20  ure, pass it to 
19030 4d 44 35 49 6e 69 74 2c 20 63 61 6c 6c 20 4d 44  MD5Init, call MD
19040 35 55 70 64 61 74 65 20 61 73 0a 20 2a 20 6e 65  5Update as. * ne
19050 65 64 65 64 20 6f 6e 20 62 75 66 66 65 72 73 20  eded on buffers 
19060 66 75 6c 6c 20 6f 66 20 62 79 74 65 73 2c 20 61  full of bytes, a
19070 6e 64 20 74 68 65 6e 20 63 61 6c 6c 20 4d 44 35  nd then call MD5
19080 46 69 6e 61 6c 2c 20 77 68 69 63 68 0a 20 2a 20  Final, which. * 
19090 77 69 6c 6c 20 66 69 6c 6c 20 61 20 73 75 70 70  will fill a supp
190a0 6c 69 65 64 20 31 36 2d 62 79 74 65 20 61 72 72  lied 16-byte arr
190b0 61 79 20 77 69 74 68 20 74 68 65 20 64 69 67 65  ay with the dige
190c0 73 74 2e 0a 20 2a 2f 0a 0a 2f 2a 0a 20 2a 20 49  st.. */../*. * I
190d0 66 20 63 6f 6d 70 69 6c 65 64 20 6f 6e 20 61 20  f compiled on a 
190e0 6d 61 63 68 69 6e 65 20 74 68 61 74 20 64 6f 65  machine that doe
190f0 73 6e 27 74 20 68 61 76 65 20 61 20 33 32 2d 62  sn't have a 32-b
19100 69 74 20 69 6e 74 65 67 65 72 2c 0a 20 2a 20 79  it integer,. * y
19110 6f 75 20 6a 75 73 74 20 73 65 74 20 22 75 69 6e  ou just set "uin
19120 74 33 32 22 20 74 6f 20 74 68 65 20 61 70 70 72  t32" to the appr
19130 6f 70 72 69 61 74 65 20 64 61 74 61 74 79 70 65  opriate datatype
19140 20 66 6f 72 20 61 6e 0a 20 2a 20 75 6e 73 69 67   for an. * unsig
19150 6e 65 64 20 33 32 2d 62 69 74 20 69 6e 74 65 67  ned 32-bit integ
19160 65 72 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65  er.  For example
19170 3a 0a 20 2a 0a 20 2a 20 20 20 20 20 20 20 63 63  :. *. *       cc
19180 20 2d 44 75 69 6e 74 33 32 3d 27 75 6e 73 69 67   -Duint32='unsig
19190 6e 65 64 20 6c 6f 6e 67 27 20 6d 64 35 2e 63 0a  ned long' md5.c.
191a0 20 2a 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 75   *. */.#ifndef u
191b0 69 6e 74 33 32 0a 23 20 20 64 65 66 69 6e 65 20  int32.#  define 
191c0 75 69 6e 74 33 32 20 75 6e 73 69 67 6e 65 64 20  uint32 unsigned 
191d0 69 6e 74 0a 23 65 6e 64 69 66 0a 0a 73 74 72 75  int.#endif..stru
191e0 63 74 20 4d 44 35 43 6f 6e 74 65 78 74 20 7b 0a  ct MD5Context {.
191f0 20 20 69 6e 74 20 69 73 49 6e 69 74 3b 0a 20 20    int isInit;.  
19200 75 69 6e 74 33 32 20 62 75 66 5b 34 5d 3b 0a 20  uint32 buf[4];. 
19210 20 75 69 6e 74 33 32 20 62 69 74 73 5b 32 5d 3b   uint32 bits[2];
19220 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
19230 20 69 6e 5b 36 34 5d 3b 0a 7d 3b 0a 74 79 70 65   in[64];.};.type
19240 64 65 66 20 73 74 72 75 63 74 20 4d 44 35 43 6f  def struct MD5Co
19250 6e 74 65 78 74 20 4d 44 35 43 6f 6e 74 65 78 74  ntext MD5Context
19260 3b 0a 0a 2f 2a 0a 20 2a 20 4e 6f 74 65 3a 20 74  ;../*. * Note: t
19270 68 69 73 20 63 6f 64 65 20 69 73 20 68 61 72 6d  his code is harm
19280 6c 65 73 73 20 6f 6e 20 6c 69 74 74 6c 65 2d 65  less on little-e
19290 6e 64 69 61 6e 20 6d 61 63 68 69 6e 65 73 2e 0a  ndian machines..
192a0 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20   */.static void 
192b0 62 79 74 65 52 65 76 65 72 73 65 20 28 75 6e 73  byteReverse (uns
192c0 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66 2c  igned char *buf,
192d0 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 73 29   unsigned longs)
192e0 7b 0a 20 20 20 20 20 20 20 20 75 69 6e 74 33 32  {.        uint32
192f0 20 74 3b 0a 20 20 20 20 20 20 20 20 64 6f 20 7b   t;.        do {
19300 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
19310 20 74 20 3d 20 28 75 69 6e 74 33 32 29 28 28 75   t = (uint32)((u
19320 6e 73 69 67 6e 65 64 29 62 75 66 5b 33 5d 3c 3c  nsigned)buf[3]<<
19330 38 20 7c 20 62 75 66 5b 32 5d 29 20 3c 3c 20 31  8 | buf[2]) << 1
19340 36 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20  6 |.            
19350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19360 28 28 75 6e 73 69 67 6e 65 64 29 62 75 66 5b 31  ((unsigned)buf[1
19370 5d 3c 3c 38 20 7c 20 62 75 66 5b 30 5d 29 3b 0a  ]<<8 | buf[0]);.
19380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19390 2a 28 75 69 6e 74 33 32 20 2a 29 62 75 66 20 3d  *(uint32 *)buf =
193a0 20 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   t;.            
193b0 20 20 20 20 62 75 66 20 2b 3d 20 34 3b 0a 20 20      buf += 4;.  
193c0 20 20 20 20 20 20 7d 20 77 68 69 6c 65 20 28 2d        } while (-
193d0 2d 6c 6f 6e 67 73 29 3b 0a 7d 0a 2f 2a 20 54 68  -longs);.}./* Th
193e0 65 20 66 6f 75 72 20 63 6f 72 65 20 66 75 6e 63  e four core func
193f0 74 69 6f 6e 73 20 2d 20 46 31 20 69 73 20 6f 70  tions - F1 is op
19400 74 69 6d 69 7a 65 64 20 73 6f 6d 65 77 68 61 74  timized somewhat
19410 20 2a 2f 0a 0a 2f 2a 20 23 64 65 66 69 6e 65 20   */../* #define 
19420 46 31 28 78 2c 20 79 2c 20 7a 29 20 28 78 20 26  F1(x, y, z) (x &
19430 20 79 20 7c 20 7e 78 20 26 20 7a 29 20 2a 2f 0a   y | ~x & z) */.
19440 23 64 65 66 69 6e 65 20 46 31 28 78 2c 20 79 2c  #define F1(x, y,
19450 20 7a 29 20 28 7a 20 5e 20 28 78 20 26 20 28 79   z) (z ^ (x & (y
19460 20 5e 20 7a 29 29 29 0a 23 64 65 66 69 6e 65 20   ^ z))).#define 
19470 46 32 28 78 2c 20 79 2c 20 7a 29 20 46 31 28 7a  F2(x, y, z) F1(z
19480 2c 20 78 2c 20 79 29 0a 23 64 65 66 69 6e 65 20  , x, y).#define 
19490 46 33 28 78 2c 20 79 2c 20 7a 29 20 28 78 20 5e  F3(x, y, z) (x ^
194a0 20 79 20 5e 20 7a 29 0a 23 64 65 66 69 6e 65 20   y ^ z).#define 
194b0 46 34 28 78 2c 20 79 2c 20 7a 29 20 28 79 20 5e  F4(x, y, z) (y ^
194c0 20 28 78 20 7c 20 7e 7a 29 29 0a 0a 2f 2a 20 54   (x | ~z))../* T
194d0 68 69 73 20 69 73 20 74 68 65 20 63 65 6e 74 72  his is the centr
194e0 61 6c 20 73 74 65 70 20 69 6e 20 74 68 65 20 4d  al step in the M
194f0 44 35 20 61 6c 67 6f 72 69 74 68 6d 2e 20 2a 2f  D5 algorithm. */
19500 0a 23 64 65 66 69 6e 65 20 4d 44 35 53 54 45 50  .#define MD5STEP
19510 28 66 2c 20 77 2c 20 78 2c 20 79 2c 20 7a 2c 20  (f, w, x, y, z, 
19520 64 61 74 61 2c 20 73 29 20 5c 0a 20 20 20 20 20  data, s) \.     
19530 20 20 20 28 20 77 20 2b 3d 20 66 28 78 2c 20 79     ( w += f(x, y
19540 2c 20 7a 29 20 2b 20 64 61 74 61 2c 20 20 77 20  , z) + data,  w 
19550 3d 20 77 3c 3c 73 20 7c 20 77 3e 3e 28 33 32 2d  = w<<s | w>>(32-
19560 73 29 2c 20 20 77 20 2b 3d 20 78 20 29 0a 0a 2f  s),  w += x )../
19570 2a 0a 20 2a 20 54 68 65 20 63 6f 72 65 20 6f 66  *. * The core of
19580 20 74 68 65 20 4d 44 35 20 61 6c 67 6f 72 69 74   the MD5 algorit
19590 68 6d 2c 20 74 68 69 73 20 61 6c 74 65 72 73 20  hm, this alters 
195a0 61 6e 20 65 78 69 73 74 69 6e 67 20 4d 44 35 20  an existing MD5 
195b0 68 61 73 68 20 74 6f 0a 20 2a 20 72 65 66 6c 65  hash to. * refle
195c0 63 74 20 74 68 65 20 61 64 64 69 74 69 6f 6e 20  ct the addition 
195d0 6f 66 20 31 36 20 6c 6f 6e 67 77 6f 72 64 73 20  of 16 longwords 
195e0 6f 66 20 6e 65 77 20 64 61 74 61 2e 20 20 4d 44  of new data.  MD
195f0 35 55 70 64 61 74 65 20 62 6c 6f 63 6b 73 0a 20  5Update blocks. 
19600 2a 20 74 68 65 20 64 61 74 61 20 61 6e 64 20 63  * the data and c
19610 6f 6e 76 65 72 74 73 20 62 79 74 65 73 20 69 6e  onverts bytes in
19620 74 6f 20 6c 6f 6e 67 77 6f 72 64 73 20 66 6f 72  to longwords for
19630 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 20   this routine.. 
19640 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 4d  */.static void M
19650 44 35 54 72 61 6e 73 66 6f 72 6d 28 75 69 6e 74  D5Transform(uint
19660 33 32 20 62 75 66 5b 34 5d 2c 20 63 6f 6e 73 74  32 buf[4], const
19670 20 75 69 6e 74 33 32 20 69 6e 5b 31 36 5d 29 7b   uint32 in[16]){
19680 0a 20 20 20 20 20 20 20 20 72 65 67 69 73 74 65  .        registe
19690 72 20 75 69 6e 74 33 32 20 61 2c 20 62 2c 20 63  r uint32 a, b, c
196a0 2c 20 64 3b 0a 0a 20 20 20 20 20 20 20 20 61 20  , d;..        a 
196b0 3d 20 62 75 66 5b 30 5d 3b 0a 20 20 20 20 20 20  = buf[0];.      
196c0 20 20 62 20 3d 20 62 75 66 5b 31 5d 3b 0a 20 20    b = buf[1];.  
196d0 20 20 20 20 20 20 63 20 3d 20 62 75 66 5b 32 5d        c = buf[2]
196e0 3b 0a 20 20 20 20 20 20 20 20 64 20 3d 20 62 75  ;.        d = bu
196f0 66 5b 33 5d 3b 0a 0a 20 20 20 20 20 20 20 20 4d  f[3];..        M
19700 44 35 53 54 45 50 28 46 31 2c 20 61 2c 20 62 2c  D5STEP(F1, a, b,
19710 20 63 2c 20 64 2c 20 69 6e 5b 20 30 5d 2b 30 78   c, d, in[ 0]+0x
19720 64 37 36 61 61 34 37 38 2c 20 20 37 29 3b 0a 20  d76aa478,  7);. 
19730 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
19740 31 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69  1, d, a, b, c, i
19750 6e 5b 20 31 5d 2b 30 78 65 38 63 37 62 37 35 36  n[ 1]+0xe8c7b756
19760 2c 20 31 32 29 3b 0a 20 20 20 20 20 20 20 20 4d  , 12);.        M
19770 44 35 53 54 45 50 28 46 31 2c 20 63 2c 20 64 2c  D5STEP(F1, c, d,
19780 20 61 2c 20 62 2c 20 69 6e 5b 20 32 5d 2b 30 78   a, b, in[ 2]+0x
19790 32 34 32 30 37 30 64 62 2c 20 31 37 29 3b 0a 20  242070db, 17);. 
197a0 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
197b0 31 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69  1, b, c, d, a, i
197c0 6e 5b 20 33 5d 2b 30 78 63 31 62 64 63 65 65 65  n[ 3]+0xc1bdceee
197d0 2c 20 32 32 29 3b 0a 20 20 20 20 20 20 20 20 4d  , 22);.        M
197e0 44 35 53 54 45 50 28 46 31 2c 20 61 2c 20 62 2c  D5STEP(F1, a, b,
197f0 20 63 2c 20 64 2c 20 69 6e 5b 20 34 5d 2b 30 78   c, d, in[ 4]+0x
19800 66 35 37 63 30 66 61 66 2c 20 20 37 29 3b 0a 20  f57c0faf,  7);. 
19810 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
19820 31 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69  1, d, a, b, c, i
19830 6e 5b 20 35 5d 2b 30 78 34 37 38 37 63 36 32 61  n[ 5]+0x4787c62a
19840 2c 20 31 32 29 3b 0a 20 20 20 20 20 20 20 20 4d  , 12);.        M
19850 44 35 53 54 45 50 28 46 31 2c 20 63 2c 20 64 2c  D5STEP(F1, c, d,
19860 20 61 2c 20 62 2c 20 69 6e 5b 20 36 5d 2b 30 78   a, b, in[ 6]+0x
19870 61 38 33 30 34 36 31 33 2c 20 31 37 29 3b 0a 20  a8304613, 17);. 
19880 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
19890 31 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69  1, b, c, d, a, i
198a0 6e 5b 20 37 5d 2b 30 78 66 64 34 36 39 35 30 31  n[ 7]+0xfd469501
198b0 2c 20 32 32 29 3b 0a 20 20 20 20 20 20 20 20 4d  , 22);.        M
198c0 44 35 53 54 45 50 28 46 31 2c 20 61 2c 20 62 2c  D5STEP(F1, a, b,
198d0 20 63 2c 20 64 2c 20 69 6e 5b 20 38 5d 2b 30 78   c, d, in[ 8]+0x
198e0 36 39 38 30 39 38 64 38 2c 20 20 37 29 3b 0a 20  698098d8,  7);. 
198f0 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
19900 31 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69  1, d, a, b, c, i
19910 6e 5b 20 39 5d 2b 30 78 38 62 34 34 66 37 61 66  n[ 9]+0x8b44f7af
19920 2c 20 31 32 29 3b 0a 20 20 20 20 20 20 20 20 4d  , 12);.        M
19930 44 35 53 54 45 50 28 46 31 2c 20 63 2c 20 64 2c  D5STEP(F1, c, d,
19940 20 61 2c 20 62 2c 20 69 6e 5b 31 30 5d 2b 30 78   a, b, in[10]+0x
19950 66 66 66 66 35 62 62 31 2c 20 31 37 29 3b 0a 20  ffff5bb1, 17);. 
19960 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
19970 31 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69  1, b, c, d, a, i
19980 6e 5b 31 31 5d 2b 30 78 38 39 35 63 64 37 62 65  n[11]+0x895cd7be
19990 2c 20 32 32 29 3b 0a 20 20 20 20 20 20 20 20 4d  , 22);.        M
199a0 44 35 53 54 45 50 28 46 31 2c 20 61 2c 20 62 2c  D5STEP(F1, a, b,
199b0 20 63 2c 20 64 2c 20 69 6e 5b 31 32 5d 2b 30 78   c, d, in[12]+0x
199c0 36 62 39 30 31 31 32 32 2c 20 20 37 29 3b 0a 20  6b901122,  7);. 
199d0 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
199e0 31 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69  1, d, a, b, c, i
199f0 6e 5b 31 33 5d 2b 30 78 66 64 39 38 37 31 39 33  n[13]+0xfd987193
19a00 2c 20 31 32 29 3b 0a 20 20 20 20 20 20 20 20 4d  , 12);.        M
19a10 44 35 53 54 45 50 28 46 31 2c 20 63 2c 20 64 2c  D5STEP(F1, c, d,
19a20 20 61 2c 20 62 2c 20 69 6e 5b 31 34 5d 2b 30 78   a, b, in[14]+0x
19a30 61 36 37 39 34 33 38 65 2c 20 31 37 29 3b 0a 20  a679438e, 17);. 
19a40 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
19a50 31 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69  1, b, c, d, a, i
19a60 6e 5b 31 35 5d 2b 30 78 34 39 62 34 30 38 32 31  n[15]+0x49b40821
19a70 2c 20 32 32 29 3b 0a 0a 20 20 20 20 20 20 20 20  , 22);..        
19a80 4d 44 35 53 54 45 50 28 46 32 2c 20 61 2c 20 62  MD5STEP(F2, a, b
19a90 2c 20 63 2c 20 64 2c 20 69 6e 5b 20 31 5d 2b 30  , c, d, in[ 1]+0
19aa0 78 66 36 31 65 32 35 36 32 2c 20 20 35 29 3b 0a  xf61e2562,  5);.
19ab0 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28          MD5STEP(
19ac0 46 32 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20  F2, d, a, b, c, 
19ad0 69 6e 5b 20 36 5d 2b 30 78 63 30 34 30 62 33 34  in[ 6]+0xc040b34
19ae0 30 2c 20 20 39 29 3b 0a 20 20 20 20 20 20 20 20  0,  9);.        
19af0 4d 44 35 53 54 45 50 28 46 32 2c 20 63 2c 20 64  MD5STEP(F2, c, d
19b00 2c 20 61 2c 20 62 2c 20 69 6e 5b 31 31 5d 2b 30  , a, b, in[11]+0
19b10 78 32 36 35 65 35 61 35 31 2c 20 31 34 29 3b 0a  x265e5a51, 14);.
19b20 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28          MD5STEP(
19b30 46 32 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20  F2, b, c, d, a, 
19b40 69 6e 5b 20 30 5d 2b 30 78 65 39 62 36 63 37 61  in[ 0]+0xe9b6c7a
19b50 61 2c 20 32 30 29 3b 0a 20 20 20 20 20 20 20 20  a, 20);.        
19b60 4d 44 35 53 54 45 50 28 46 32 2c 20 61 2c 20 62  MD5STEP(F2, a, b
19b70 2c 20 63 2c 20 64 2c 20 69 6e 5b 20 35 5d 2b 30  , c, d, in[ 5]+0
19b80 78 64 36 32 66 31 30 35 64 2c 20 20 35 29 3b 0a  xd62f105d,  5);.
19b90 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28          MD5STEP(
19ba0 46 32 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20  F2, d, a, b, c, 
19bb0 69 6e 5b 31 30 5d 2b 30 78 30 32 34 34 31 34 35  in[10]+0x0244145
19bc0 33 2c 20 20 39 29 3b 0a 20 20 20 20 20 20 20 20  3,  9);.        
19bd0 4d 44 35 53 54 45 50 28 46 32 2c 20 63 2c 20 64  MD5STEP(F2, c, d
19be0 2c 20 61 2c 20 62 2c 20 69 6e 5b 31 35 5d 2b 30  , a, b, in[15]+0
19bf0 78 64 38 61 31 65 36 38 31 2c 20 31 34 29 3b 0a  xd8a1e681, 14);.
19c00 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28          MD5STEP(
19c10 46 32 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20  F2, b, c, d, a, 
19c20 69 6e 5b 20 34 5d 2b 30 78 65 37 64 33 66 62 63  in[ 4]+0xe7d3fbc
19c30 38 2c 20 32 30 29 3b 0a 20 20 20 20 20 20 20 20  8, 20);.        
19c40 4d 44 35 53 54 45 50 28 46 32 2c 20 61 2c 20 62  MD5STEP(F2, a, b
19c50 2c 20 63 2c 20 64 2c 20 69 6e 5b 20 39 5d 2b 30  , c, d, in[ 9]+0
19c60 78 32 31 65 31 63 64 65 36 2c 20 20 35 29 3b 0a  x21e1cde6,  5);.
19c70 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28          MD5STEP(
19c80 46 32 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20  F2, d, a, b, c, 
19c90 69 6e 5b 31 34 5d 2b 30 78 63 33 33 37 30 37 64  in[14]+0xc33707d
19ca0 36 2c 20 20 39 29 3b 0a 20 20 20 20 20 20 20 20  6,  9);.        
19cb0 4d 44 35 53 54 45 50 28 46 32 2c 20 63 2c 20 64  MD5STEP(F2, c, d
19cc0 2c 20 61 2c 20 62 2c 20 69 6e 5b 20 33 5d 2b 30  , a, b, in[ 3]+0
19cd0 78 66 34 64 35 30 64 38 37 2c 20 31 34 29 3b 0a  xf4d50d87, 14);.
19ce0 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28          MD5STEP(
19cf0 46 32 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20  F2, b, c, d, a, 
19d00 69 6e 5b 20 38 5d 2b 30 78 34 35 35 61 31 34 65  in[ 8]+0x455a14e
19d10 64 2c 20 32 30 29 3b 0a 20 20 20 20 20 20 20 20  d, 20);.        
19d20 4d 44 35 53 54 45 50 28 46 32 2c 20 61 2c 20 62  MD5STEP(F2, a, b
19d30 2c 20 63 2c 20 64 2c 20 69 6e 5b 31 33 5d 2b 30  , c, d, in[13]+0
19d40 78 61 39 65 33 65 39 30 35 2c 20 20 35 29 3b 0a  xa9e3e905,  5);.
19d50 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28          MD5STEP(
19d60 46 32 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20  F2, d, a, b, c, 
19d70 69 6e 5b 20 32 5d 2b 30 78 66 63 65 66 61 33 66  in[ 2]+0xfcefa3f
19d80 38 2c 20 20 39 29 3b 0a 20 20 20 20 20 20 20 20  8,  9);.        
19d90 4d 44 35 53 54 45 50 28 46 32 2c 20 63 2c 20 64  MD5STEP(F2, c, d
19da0 2c 20 61 2c 20 62 2c 20 69 6e 5b 20 37 5d 2b 30  , a, b, in[ 7]+0
19db0 78 36 37 36 66 30 32 64 39 2c 20 31 34 29 3b 0a  x676f02d9, 14);.
19dc0 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28          MD5STEP(
19dd0 46 32 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20  F2, b, c, d, a, 
19de0 69 6e 5b 31 32 5d 2b 30 78 38 64 32 61 34 63 38  in[12]+0x8d2a4c8
19df0 61 2c 20 32 30 29 3b 0a 0a 20 20 20 20 20 20 20  a, 20);..       
19e00 20 4d 44 35 53 54 45 50 28 46 33 2c 20 61 2c 20   MD5STEP(F3, a, 
19e10 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 20 35 5d 2b  b, c, d, in[ 5]+
19e20 30 78 66 66 66 61 33 39 34 32 2c 20 20 34 29 3b  0xfffa3942,  4);
19e30 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50  .        MD5STEP
19e40 28 46 33 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c  (F3, d, a, b, c,
19e50 20 69 6e 5b 20 38 5d 2b 30 78 38 37 37 31 66 36   in[ 8]+0x8771f6
19e60 38 31 2c 20 31 31 29 3b 0a 20 20 20 20 20 20 20  81, 11);.       
19e70 20 4d 44 35 53 54 45 50 28 46 33 2c 20 63 2c 20   MD5STEP(F3, c, 
19e80 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 31 31 5d 2b  d, a, b, in[11]+
19e90 30 78 36 64 39 64 36 31 32 32 2c 20 31 36 29 3b  0x6d9d6122, 16);
19ea0 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50  .        MD5STEP
19eb0 28 46 33 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c  (F3, b, c, d, a,
19ec0 20 69 6e 5b 31 34 5d 2b 30 78 66 64 65 35 33 38   in[14]+0xfde538
19ed0 30 63 2c 20 32 33 29 3b 0a 20 20 20 20 20 20 20  0c, 23);.       
19ee0 20 4d 44 35 53 54 45 50 28 46 33 2c 20 61 2c 20   MD5STEP(F3, a, 
19ef0 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 20 31 5d 2b  b, c, d, in[ 1]+
19f00 30 78 61 34 62 65 65 61 34 34 2c 20 20 34 29 3b  0xa4beea44,  4);
19f10 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50  .        MD5STEP
19f20 28 46 33 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c  (F3, d, a, b, c,
19f30 20 69 6e 5b 20 34 5d 2b 30 78 34 62 64 65 63 66   in[ 4]+0x4bdecf
19f40 61 39 2c 20 31 31 29 3b 0a 20 20 20 20 20 20 20  a9, 11);.       
19f50 20 4d 44 35 53 54 45 50 28 46 33 2c 20 63 2c 20   MD5STEP(F3, c, 
19f60 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 20 37 5d 2b  d, a, b, in[ 7]+
19f70 30 78 66 36 62 62 34 62 36 30 2c 20 31 36 29 3b  0xf6bb4b60, 16);
19f80 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50  .        MD5STEP
19f90 28 46 33 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c  (F3, b, c, d, a,
19fa0 20 69 6e 5b 31 30 5d 2b 30 78 62 65 62 66 62 63   in[10]+0xbebfbc
19fb0 37 30 2c 20 32 33 29 3b 0a 20 20 20 20 20 20 20  70, 23);.       
19fc0 20 4d 44 35 53 54 45 50 28 46 33 2c 20 61 2c 20   MD5STEP(F3, a, 
19fd0 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 31 33 5d 2b  b, c, d, in[13]+
19fe0 30 78 32 38 39 62 37 65 63 36 2c 20 20 34 29 3b  0x289b7ec6,  4);
19ff0 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50  .        MD5STEP
1a000 28 46 33 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c  (F3, d, a, b, c,
1a010 20 69 6e 5b 20 30 5d 2b 30 78 65 61 61 31 32 37   in[ 0]+0xeaa127
1a020 66 61 2c 20 31 31 29 3b 0a 20 20 20 20 20 20 20  fa, 11);.       
1a030 20 4d 44 35 53 54 45 50 28 46 33 2c 20 63 2c 20   MD5STEP(F3, c, 
1a040 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 20 33 5d 2b  d, a, b, in[ 3]+
1a050 30 78 64 34 65 66 33 30 38 35 2c 20 31 36 29 3b  0xd4ef3085, 16);
1a060 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50  .        MD5STEP
1a070 28 46 33 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c  (F3, b, c, d, a,
1a080 20 69 6e 5b 20 36 5d 2b 30 78 30 34 38 38 31 64   in[ 6]+0x04881d
1a090 30 35 2c 20 32 33 29 3b 0a 20 20 20 20 20 20 20  05, 23);.       
1a0a0 20 4d 44 35 53 54 45 50 28 46 33 2c 20 61 2c 20   MD5STEP(F3, a, 
1a0b0 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 20 39 5d 2b  b, c, d, in[ 9]+
1a0c0 30 78 64 39 64 34 64 30 33 39 2c 20 20 34 29 3b  0xd9d4d039,  4);
1a0d0 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50  .        MD5STEP
1a0e0 28 46 33 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c  (F3, d, a, b, c,
1a0f0 20 69 6e 5b 31 32 5d 2b 30 78 65 36 64 62 39 39   in[12]+0xe6db99
1a100 65 35 2c 20 31 31 29 3b 0a 20 20 20 20 20 20 20  e5, 11);.       
1a110 20 4d 44 35 53 54 45 50 28 46 33 2c 20 63 2c 20   MD5STEP(F3, c, 
1a120 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 31 35 5d 2b  d, a, b, in[15]+
1a130 30 78 31 66 61 32 37 63 66 38 2c 20 31 36 29 3b  0x1fa27cf8, 16);
1a140 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50  .        MD5STEP
1a150 28 46 33 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c  (F3, b, c, d, a,
1a160 20 69 6e 5b 20 32 5d 2b 30 78 63 34 61 63 35 36   in[ 2]+0xc4ac56
1a170 36 35 2c 20 32 33 29 3b 0a 0a 20 20 20 20 20 20  65, 23);..      
1a180 20 20 4d 44 35 53 54 45 50 28 46 34 2c 20 61 2c    MD5STEP(F4, a,
1a190 20 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 20 30 5d   b, c, d, in[ 0]
1a1a0 2b 30 78 66 34 32 39 32 32 34 34 2c 20 20 36 29  +0xf4292244,  6)
1a1b0 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45  ;.        MD5STE
1a1c0 50 28 46 34 2c 20 64 2c 20 61 2c 20 62 2c 20 63  P(F4, d, a, b, c
1a1d0 2c 20 69 6e 5b 20 37 5d 2b 30 78 34 33 32 61 66  , in[ 7]+0x432af
1a1e0 66 39 37 2c 20 31 30 29 3b 0a 20 20 20 20 20 20  f97, 10);.      
1a1f0 20 20 4d 44 35 53 54 45 50 28 46 34 2c 20 63 2c    MD5STEP(F4, c,
1a200 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 31 34 5d   d, a, b, in[14]
1a210 2b 30 78 61 62 39 34 32 33 61 37 2c 20 31 35 29  +0xab9423a7, 15)
1a220 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45  ;.        MD5STE
1a230 50 28 46 34 2c 20 62 2c 20 63 2c 20 64 2c 20 61  P(F4, b, c, d, a
1a240 2c 20 69 6e 5b 20 35 5d 2b 30 78 66 63 39 33 61  , in[ 5]+0xfc93a
1a250 30 33 39 2c 20 32 31 29 3b 0a 20 20 20 20 20 20  039, 21);.      
1a260 20 20 4d 44 35 53 54 45 50 28 46 34 2c 20 61 2c    MD5STEP(F4, a,
1a270 20 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 31 32 5d   b, c, d, in[12]
1a280 2b 30 78 36 35 35 62 35 39 63 33 2c 20 20 36 29  +0x655b59c3,  6)
1a290 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45  ;.        MD5STE
1a2a0 50 28 46 34 2c 20 64 2c 20 61 2c 20 62 2c 20 63  P(F4, d, a, b, c
1a2b0 2c 20 69 6e 5b 20 33 5d 2b 30 78 38 66 30 63 63  , in[ 3]+0x8f0cc
1a2c0 63 39 32 2c 20 31 30 29 3b 0a 20 20 20 20 20 20  c92, 10);.      
1a2d0 20 20 4d 44 35 53 54 45 50 28 46 34 2c 20 63 2c    MD5STEP(F4, c,
1a2e0 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 31 30 5d   d, a, b, in[10]
1a2f0 2b 30 78 66 66 65 66 66 34 37 64 2c 20 31 35 29  +0xffeff47d, 15)
1a300 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45  ;.        MD5STE
1a310 50 28 46 34 2c 20 62 2c 20 63 2c 20 64 2c 20 61  P(F4, b, c, d, a
1a320 2c 20 69 6e 5b 20 31 5d 2b 30 78 38 35 38 34 35  , in[ 1]+0x85845
1a330 64 64 31 2c 20 32 31 29 3b 0a 20 20 20 20 20 20  dd1, 21);.      
1a340 20 20 4d 44 35 53 54 45 50 28 46 34 2c 20 61 2c    MD5STEP(F4, a,
1a350 20 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 20 38 5d   b, c, d, in[ 8]
1a360 2b 30 78 36 66 61 38 37 65 34 66 2c 20 20 36 29  +0x6fa87e4f,  6)
1a370 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45  ;.        MD5STE
1a380 50 28 46 34 2c 20 64 2c 20 61 2c 20 62 2c 20 63  P(F4, d, a, b, c
1a390 2c 20 69 6e 5b 31 35 5d 2b 30 78 66 65 32 63 65  , in[15]+0xfe2ce
1a3a0 36 65 30 2c 20 31 30 29 3b 0a 20 20 20 20 20 20  6e0, 10);.      
1a3b0 20 20 4d 44 35 53 54 45 50 28 46 34 2c 20 63 2c    MD5STEP(F4, c,
1a3c0 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 20 36 5d   d, a, b, in[ 6]
1a3d0 2b 30 78 61 33 30 31 34 33 31 34 2c 20 31 35 29  +0xa3014314, 15)
1a3e0 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45  ;.        MD5STE
1a3f0 50 28 46 34 2c 20 62 2c 20 63 2c 20 64 2c 20 61  P(F4, b, c, d, a
1a400 2c 20 69 6e 5b 31 33 5d 2b 30 78 34 65 30 38 31  , in[13]+0x4e081
1a410 31 61 31 2c 20 32 31 29 3b 0a 20 20 20 20 20 20  1a1, 21);.      
1a420 20 20 4d 44 35 53 54 45 50 28 46 34 2c 20 61 2c    MD5STEP(F4, a,
1a430 20 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 20 34 5d   b, c, d, in[ 4]
1a440 2b 30 78 66 37 35 33 37 65 38 32 2c 20 20 36 29  +0xf7537e82,  6)
1a450 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45  ;.        MD5STE
1a460 50 28 46 34 2c 20 64 2c 20 61 2c 20 62 2c 20 63  P(F4, d, a, b, c
1a470 2c 20 69 6e 5b 31 31 5d 2b 30 78 62 64 33 61 66  , in[11]+0xbd3af
1a480 32 33 35 2c 20 31 30 29 3b 0a 20 20 20 20 20 20  235, 10);.      
1a490 20 20 4d 44 35 53 54 45 50 28 46 34 2c 20 63 2c    MD5STEP(F4, c,
1a4a0 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 20 32 5d   d, a, b, in[ 2]
1a4b0 2b 30 78 32 61 64 37 64 32 62 62 2c 20 31 35 29  +0x2ad7d2bb, 15)
1a4c0 3b 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45  ;.        MD5STE
1a4d0 50 28 46 34 2c 20 62 2c 20 63 2c 20 64 2c 20 61  P(F4, b, c, d, a
1a4e0 2c 20 69 6e 5b 20 39 5d 2b 30 78 65 62 38 36 64  , in[ 9]+0xeb86d
1a4f0 33 39 31 2c 20 32 31 29 3b 0a 0a 20 20 20 20 20  391, 21);..     
1a500 20 20 20 62 75 66 5b 30 5d 20 2b 3d 20 61 3b 0a     buf[0] += a;.
1a510 20 20 20 20 20 20 20 20 62 75 66 5b 31 5d 20 2b          buf[1] +
1a520 3d 20 62 3b 0a 20 20 20 20 20 20 20 20 62 75 66  = b;.        buf
1a530 5b 32 5d 20 2b 3d 20 63 3b 0a 20 20 20 20 20 20  [2] += c;.      
1a540 20 20 62 75 66 5b 33 5d 20 2b 3d 20 64 3b 0a 7d    buf[3] += d;.}
1a550 0a 0a 2f 2a 0a 20 2a 20 53 74 61 72 74 20 4d 44  ../*. * Start MD
1a560 35 20 61 63 63 75 6d 75 6c 61 74 69 6f 6e 2e 20  5 accumulation. 
1a570 20 53 65 74 20 62 69 74 20 63 6f 75 6e 74 20 74   Set bit count t
1a580 6f 20 30 20 61 6e 64 20 62 75 66 66 65 72 20 74  o 0 and buffer t
1a590 6f 20 6d 79 73 74 65 72 69 6f 75 73 0a 20 2a 20  o mysterious. * 
1a5a0 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 63  initialization c
1a5b0 6f 6e 73 74 61 6e 74 73 2e 0a 20 2a 2f 0a 73 74  onstants.. */.st
1a5c0 61 74 69 63 20 76 6f 69 64 20 4d 44 35 49 6e 69  atic void MD5Ini
1a5d0 74 28 4d 44 35 43 6f 6e 74 65 78 74 20 2a 63 74  t(MD5Context *ct
1a5e0 78 29 7b 0a 20 20 20 20 20 20 20 20 63 74 78 2d  x){.        ctx-
1a5f0 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a 20 20 20  >isInit = 1;.   
1a600 20 20 20 20 20 63 74 78 2d 3e 62 75 66 5b 30 5d       ctx->buf[0]
1a610 20 3d 20 30 78 36 37 34 35 32 33 30 31 3b 0a 20   = 0x67452301;. 
1a620 20 20 20 20 20 20 20 63 74 78 2d 3e 62 75 66 5b         ctx->buf[
1a630 31 5d 20 3d 20 30 78 65 66 63 64 61 62 38 39 3b  1] = 0xefcdab89;
1a640 0a 20 20 20 20 20 20 20 20 63 74 78 2d 3e 62 75  .        ctx->bu
1a650 66 5b 32 5d 20 3d 20 30 78 39 38 62 61 64 63 66  f[2] = 0x98badcf
1a660 65 3b 0a 20 20 20 20 20 20 20 20 63 74 78 2d 3e  e;.        ctx->
1a670 62 75 66 5b 33 5d 20 3d 20 30 78 31 30 33 32 35  buf[3] = 0x10325
1a680 34 37 36 3b 0a 20 20 20 20 20 20 20 20 63 74 78  476;.        ctx
1a690 2d 3e 62 69 74 73 5b 30 5d 20 3d 20 30 3b 0a 20  ->bits[0] = 0;. 
1a6a0 20 20 20 20 20 20 20 63 74 78 2d 3e 62 69 74 73         ctx->bits
1a6b0 5b 31 5d 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 20  [1] = 0;.}../*. 
1a6c0 2a 20 55 70 64 61 74 65 20 63 6f 6e 74 65 78 74  * Update context
1a6d0 20 74 6f 20 72 65 66 6c 65 63 74 20 74 68 65 20   to reflect the 
1a6e0 63 6f 6e 63 61 74 65 6e 61 74 69 6f 6e 20 6f 66  concatenation of
1a6f0 20 61 6e 6f 74 68 65 72 20 62 75 66 66 65 72 20   another buffer 
1a700 66 75 6c 6c 0a 20 2a 20 6f 66 20 62 79 74 65 73  full. * of bytes
1a710 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20 0a 76 6f  .. */.static .vo
1a720 69 64 20 4d 44 35 55 70 64 61 74 65 28 4d 44 35  id MD5Update(MD5
1a730 43 6f 6e 74 65 78 74 20 2a 63 74 78 2c 20 63 6f  Context *ctx, co
1a740 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
1a750 72 20 2a 62 75 66 2c 20 75 6e 73 69 67 6e 65 64  r *buf, unsigned
1a760 20 69 6e 74 20 6c 65 6e 29 7b 0a 20 20 20 20 20   int len){.     
1a770 20 20 20 75 69 6e 74 33 32 20 74 3b 0a 0a 20 20     uint32 t;..  
1a780 20 20 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20        /* Update 
1a790 62 69 74 63 6f 75 6e 74 20 2a 2f 0a 0a 20 20 20  bitcount */..   
1a7a0 20 20 20 20 20 74 20 3d 20 63 74 78 2d 3e 62 69       t = ctx->bi
1a7b0 74 73 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20 69  ts[0];.        i
1a7c0 66 20 28 28 63 74 78 2d 3e 62 69 74 73 5b 30 5d  f ((ctx->bits[0]
1a7d0 20 3d 20 74 20 2b 20 28 28 75 69 6e 74 33 32 29   = t + ((uint32)
1a7e0 6c 65 6e 20 3c 3c 20 33 29 29 20 3c 20 74 29 0a  len << 3)) < t).
1a7f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a800 63 74 78 2d 3e 62 69 74 73 5b 31 5d 2b 2b 3b 20  ctx->bits[1]++; 
1a810 2f 2a 20 43 61 72 72 79 20 66 72 6f 6d 20 6c 6f  /* Carry from lo
1a820 77 20 74 6f 20 68 69 67 68 20 2a 2f 0a 20 20 20  w to high */.   
1a830 20 20 20 20 20 63 74 78 2d 3e 62 69 74 73 5b 31       ctx->bits[1
1a840 5d 20 2b 3d 20 6c 65 6e 20 3e 3e 20 32 39 3b 0a  ] += len >> 29;.
1a850 0a 20 20 20 20 20 20 20 20 74 20 3d 20 28 74 20  .        t = (t 
1a860 3e 3e 20 33 29 20 26 20 30 78 33 66 3b 20 20 20  >> 3) & 0x3f;   
1a870 20 2f 2a 20 42 79 74 65 73 20 61 6c 72 65 61 64   /* Bytes alread
1a880 79 20 69 6e 20 73 68 73 49 6e 66 6f 2d 3e 64 61  y in shsInfo->da
1a890 74 61 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 2f  ta */..        /
1a8a0 2a 20 48 61 6e 64 6c 65 20 61 6e 79 20 6c 65 61  * Handle any lea
1a8b0 64 69 6e 67 20 6f 64 64 2d 73 69 7a 65 64 20 63  ding odd-sized c
1a8c0 68 75 6e 6b 73 20 2a 2f 0a 0a 20 20 20 20 20 20  hunks */..      
1a8d0 20 20 69 66 20 28 20 74 20 29 20 7b 0a 20 20 20    if ( t ) {.   
1a8e0 20 20 20 20 20 20 20 20 20 20 20 20 20 75 6e 73               uns
1a8f0 69 67 6e 65 64 20 63 68 61 72 20 2a 70 20 3d 20  igned char *p = 
1a900 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  (unsigned char *
1a910 29 63 74 78 2d 3e 69 6e 20 2b 20 74 3b 0a 0a 20  )ctx->in + t;.. 
1a920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
1a930 20 3d 20 36 34 2d 74 3b 0a 20 20 20 20 20 20 20   = 64-t;.       
1a940 20 20 20 20 20 20 20 20 20 69 66 20 28 6c 65 6e           if (len
1a950 20 3c 20 74 29 20 7b 0a 20 20 20 20 20 20 20 20   < t) {.        
1a960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a970 6d 65 6d 63 70 79 28 70 2c 20 62 75 66 2c 20 6c  memcpy(p, buf, l
1a980 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  en);.           
1a990 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74               ret
1a9a0 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20  urn;.           
1a9b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1a9c0 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 2c         memcpy(p,
1a9d0 20 62 75 66 2c 20 74 29 3b 0a 20 20 20 20 20 20   buf, t);.      
1a9e0 20 20 20 20 20 20 20 20 20 20 62 79 74 65 52 65            byteRe
1a9f0 76 65 72 73 65 28 63 74 78 2d 3e 69 6e 2c 20 31  verse(ctx->in, 1
1aa00 36 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  6);.            
1aa10 20 20 20 20 4d 44 35 54 72 61 6e 73 66 6f 72 6d      MD5Transform
1aa20 28 63 74 78 2d 3e 62 75 66 2c 20 28 75 69 6e 74  (ctx->buf, (uint
1aa30 33 32 20 2a 29 63 74 78 2d 3e 69 6e 29 3b 0a 20  32 *)ctx->in);. 
1aa40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
1aa50 75 66 20 2b 3d 20 74 3b 0a 20 20 20 20 20 20 20  uf += t;.       
1aa60 20 20 20 20 20 20 20 20 20 6c 65 6e 20 2d 3d 20           len -= 
1aa70 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  t;.        }..  
1aa80 20 20 20 20 20 20 2f 2a 20 50 72 6f 63 65 73 73        /* Process
1aa90 20 64 61 74 61 20 69 6e 20 36 34 2d 62 79 74 65   data in 64-byte
1aaa0 20 63 68 75 6e 6b 73 20 2a 2f 0a 0a 20 20 20 20   chunks */..    
1aab0 20 20 20 20 77 68 69 6c 65 20 28 6c 65 6e 20 3e      while (len >
1aac0 3d 20 36 34 29 20 7b 0a 20 20 20 20 20 20 20 20  = 64) {.        
1aad0 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 63          memcpy(c
1aae0 74 78 2d 3e 69 6e 2c 20 62 75 66 2c 20 36 34 29  tx->in, buf, 64)
1aaf0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1ab00 20 20 62 79 74 65 52 65 76 65 72 73 65 28 63 74    byteReverse(ct
1ab10 78 2d 3e 69 6e 2c 20 31 36 29 3b 0a 20 20 20 20  x->in, 16);.    
1ab20 20 20 20 20 20 20 20 20 20 20 20 20 4d 44 35 54              MD5T
1ab30 72 61 6e 73 66 6f 72 6d 28 63 74 78 2d 3e 62 75  ransform(ctx->bu
1ab40 66 2c 20 28 75 69 6e 74 33 32 20 2a 29 63 74 78  f, (uint32 *)ctx
1ab50 2d 3e 69 6e 29 3b 0a 20 20 20 20 20 20 20 20 20  ->in);.         
1ab60 20 20 20 20 20 20 20 62 75 66 20 2b 3d 20 36 34         buf += 64
1ab70 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1ab80 20 20 6c 65 6e 20 2d 3d 20 36 34 3b 0a 20 20 20    len -= 64;.   
1ab90 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
1aba0 2f 2a 20 48 61 6e 64 6c 65 20 61 6e 79 20 72 65  /* Handle any re
1abb0 6d 61 69 6e 69 6e 67 20 62 79 74 65 73 20 6f 66  maining bytes of
1abc0 20 64 61 74 61 2e 20 2a 2f 0a 0a 20 20 20 20 20   data. */..     
1abd0 20 20 20 6d 65 6d 63 70 79 28 63 74 78 2d 3e 69     memcpy(ctx->i
1abe0 6e 2c 20 62 75 66 2c 20 6c 65 6e 29 3b 0a 7d 0a  n, buf, len);.}.
1abf0 0a 2f 2a 0a 20 2a 20 46 69 6e 61 6c 20 77 72 61  ./*. * Final wra
1ac00 70 75 70 20 2d 20 70 61 64 20 74 6f 20 36 34 2d  pup - pad to 64-
1ac10 62 79 74 65 20 62 6f 75 6e 64 61 72 79 20 77 69  byte boundary wi
1ac20 74 68 20 74 68 65 20 62 69 74 20 70 61 74 74 65  th the bit patte
1ac30 72 6e 20 0a 20 2a 20 31 20 30 2a 20 28 36 34 2d  rn . * 1 0* (64-
1ac40 62 69 74 20 63 6f 75 6e 74 20 6f 66 20 62 69 74  bit count of bit
1ac50 73 20 70 72 6f 63 65 73 73 65 64 2c 20 4d 53 42  s processed, MSB
1ac60 2d 66 69 72 73 74 29 0a 20 2a 2f 0a 73 74 61 74  -first). */.stat
1ac70 69 63 20 76 6f 69 64 20 4d 44 35 46 69 6e 61 6c  ic void MD5Final
1ac80 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 64  (unsigned char d
1ac90 69 67 65 73 74 5b 31 36 5d 2c 20 4d 44 35 43 6f  igest[16], MD5Co
1aca0 6e 74 65 78 74 20 2a 63 74 78 29 7b 0a 20 20 20  ntext *ctx){.   
1acb0 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 6f       unsigned co
1acc0 75 6e 74 3b 0a 20 20 20 20 20 20 20 20 75 6e 73  unt;.        uns
1acd0 69 67 6e 65 64 20 63 68 61 72 20 2a 70 3b 0a 0a  igned char *p;..
1ace0 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 75          /* Compu
1acf0 74 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  te number of byt
1ad00 65 73 20 6d 6f 64 20 36 34 20 2a 2f 0a 20 20 20  es mod 64 */.   
1ad10 20 20 20 20 20 63 6f 75 6e 74 20 3d 20 28 63 74       count = (ct
1ad20 78 2d 3e 62 69 74 73 5b 30 5d 20 3e 3e 20 33 29  x->bits[0] >> 3)
1ad30 20 26 20 30 78 33 46 3b 0a 0a 20 20 20 20 20 20   & 0x3F;..      
1ad40 20 20 2f 2a 20 53 65 74 20 74 68 65 20 66 69 72    /* Set the fir
1ad50 73 74 20 63 68 61 72 20 6f 66 20 70 61 64 64 69  st char of paddi
1ad60 6e 67 20 74 6f 20 30 78 38 30 2e 20 20 54 68 69  ng to 0x80.  Thi
1ad70 73 20 69 73 20 73 61 66 65 20 73 69 6e 63 65 20  s is safe since 
1ad80 74 68 65 72 65 20 69 73 0a 20 20 20 20 20 20 20  there is.       
1ad90 20 20 20 20 61 6c 77 61 79 73 20 61 74 20 6c 65      always at le
1ada0 61 73 74 20 6f 6e 65 20 62 79 74 65 20 66 72 65  ast one byte fre
1adb0 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 20 3d  e */.        p =
1adc0 20 63 74 78 2d 3e 69 6e 20 2b 20 63 6f 75 6e 74   ctx->in + count
1add0 3b 0a 20 20 20 20 20 20 20 20 2a 70 2b 2b 20 3d  ;.        *p++ =
1ade0 20 30 78 38 30 3b 0a 0a 20 20 20 20 20 20 20 20   0x80;..        
1adf0 2f 2a 20 42 79 74 65 73 20 6f 66 20 70 61 64 64  /* Bytes of padd
1ae00 69 6e 67 20 6e 65 65 64 65 64 20 74 6f 20 6d 61  ing needed to ma
1ae10 6b 65 20 36 34 20 62 79 74 65 73 20 2a 2f 0a 20  ke 64 bytes */. 
1ae20 20 20 20 20 20 20 20 63 6f 75 6e 74 20 3d 20 36         count = 6
1ae30 34 20 2d 20 31 20 2d 20 63 6f 75 6e 74 3b 0a 0a  4 - 1 - count;..
1ae40 20 20 20 20 20 20 20 20 2f 2a 20 50 61 64 20 6f          /* Pad o
1ae50 75 74 20 74 6f 20 35 36 20 6d 6f 64 20 36 34 20  ut to 56 mod 64 
1ae60 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 20 28 63  */.        if (c
1ae70 6f 75 6e 74 20 3c 20 38 29 20 7b 0a 20 20 20 20  ount < 8) {.    
1ae80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1ae90 77 6f 20 6c 6f 74 73 20 6f 66 20 70 61 64 64 69  wo lots of paddi
1aea0 6e 67 3a 20 20 50 61 64 20 74 68 65 20 66 69 72  ng:  Pad the fir
1aeb0 73 74 20 62 6c 6f 63 6b 20 74 6f 20 36 34 20 62  st block to 64 b
1aec0 79 74 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  ytes */.        
1aed0 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70          memset(p
1aee0 2c 20 30 2c 20 63 6f 75 6e 74 29 3b 0a 20 20 20  , 0, count);.   
1aef0 20 20 20 20 20 20 20 20 20 20 20 20 20 62 79 74               byt
1af00 65 52 65 76 65 72 73 65 28 63 74 78 2d 3e 69 6e  eReverse(ctx->in
1af10 2c 20 31 36 29 3b 0a 20 20 20 20 20 20 20 20 20  , 16);.         
1af20 20 20 20 20 20 20 20 4d 44 35 54 72 61 6e 73 66         MD5Transf
1af30 6f 72 6d 28 63 74 78 2d 3e 62 75 66 2c 20 28 75  orm(ctx->buf, (u
1af40 69 6e 74 33 32 20 2a 29 63 74 78 2d 3e 69 6e 29  int32 *)ctx->in)
1af50 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ;..             
1af60 20 20 20 2f 2a 20 4e 6f 77 20 66 69 6c 6c 20 74     /* Now fill t
1af70 68 65 20 6e 65 78 74 20 62 6c 6f 63 6b 20 77 69  he next block wi
1af80 74 68 20 35 36 20 62 79 74 65 73 20 2a 2f 0a 20  th 56 bytes */. 
1af90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d                 m
1afa0 65 6d 73 65 74 28 63 74 78 2d 3e 69 6e 2c 20 30  emset(ctx->in, 0
1afb0 2c 20 35 36 29 3b 0a 20 20 20 20 20 20 20 20 7d  , 56);.        }
1afc0 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20   else {.        
1afd0 20 20 20 20 20 20 20 20 2f 2a 20 50 61 64 20 62          /* Pad b
1afe0 6c 6f 63 6b 20 74 6f 20 35 36 20 62 79 74 65 73  lock to 56 bytes
1aff0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
1b000 20 20 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c      memset(p, 0,
1b010 20 63 6f 75 6e 74 2d 38 29 3b 0a 20 20 20 20 20   count-8);.     
1b020 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 79 74     }.        byt
1b030 65 52 65 76 65 72 73 65 28 63 74 78 2d 3e 69 6e  eReverse(ctx->in
1b040 2c 20 31 34 29 3b 0a 0a 20 20 20 20 20 20 20 20  , 14);..        
1b050 2f 2a 20 41 70 70 65 6e 64 20 6c 65 6e 67 74 68  /* Append length
1b060 20 69 6e 20 62 69 74 73 20 61 6e 64 20 74 72 61   in bits and tra
1b070 6e 73 66 6f 72 6d 20 2a 2f 0a 20 20 20 20 20 20  nsform */.      
1b080 20 20 28 28 75 69 6e 74 33 32 20 2a 29 63 74 78    ((uint32 *)ctx
1b090 2d 3e 69 6e 29 5b 20 31 34 20 5d 20 3d 20 63 74  ->in)[ 14 ] = ct
1b0a0 78 2d 3e 62 69 74 73 5b 30 5d 3b 0a 20 20 20 20  x->bits[0];.    
1b0b0 20 20 20 20 28 28 75 69 6e 74 33 32 20 2a 29 63      ((uint32 *)c
1b0c0 74 78 2d 3e 69 6e 29 5b 20 31 35 20 5d 20 3d 20  tx->in)[ 15 ] = 
1b0d0 63 74 78 2d 3e 62 69 74 73 5b 31 5d 3b 0a 0a 20  ctx->bits[1];.. 
1b0e0 20 20 20 20 20 20 20 4d 44 35 54 72 61 6e 73 66         MD5Transf
1b0f0 6f 72 6d 28 63 74 78 2d 3e 62 75 66 2c 20 28 75  orm(ctx->buf, (u
1b100 69 6e 74 33 32 20 2a 29 63 74 78 2d 3e 69 6e 29  int32 *)ctx->in)
1b110 3b 0a 20 20 20 20 20 20 20 20 62 79 74 65 52 65  ;.        byteRe
1b120 76 65 72 73 65 28 28 75 6e 73 69 67 6e 65 64 20  verse((unsigned 
1b130 63 68 61 72 20 2a 29 63 74 78 2d 3e 62 75 66 2c  char *)ctx->buf,
1b140 20 34 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d   4);.        mem
1b150 63 70 79 28 64 69 67 65 73 74 2c 20 63 74 78 2d  cpy(digest, ctx-
1b160 3e 62 75 66 2c 20 31 36 29 3b 0a 20 20 20 20 20  >buf, 16);.     
1b170 20 20 20 6d 65 6d 73 65 74 28 63 74 78 2c 20 30     memset(ctx, 0
1b180 2c 20 73 69 7a 65 6f 66 28 63 74 78 29 29 3b 20  , sizeof(ctx)); 
1b190 20 20 20 2f 2a 20 49 6e 20 63 61 73 65 20 69 74     /* In case it
1b1a0 20 69 73 20 73 65 6e 73 69 74 69 76 65 20 2a 2f   is sensitive */
1b1b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72  .}../*.** Conver
1b1c0 74 20 61 20 31 32 38 2d 62 69 74 20 4d 44 35 20  t a 128-bit MD5 
1b1d0 64 69 67 65 73 74 20 69 6e 74 6f 20 61 20 33 32  digest into a 32
1b1e0 2d 64 69 67 69 74 20 62 61 73 65 2d 31 36 20 6e  -digit base-16 n
1b1f0 75 6d 62 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  umber..*/.static
1b200 20 76 6f 69 64 20 4d 44 35 44 69 67 65 73 74 54   void MD5DigestT
1b210 6f 42 61 73 65 31 36 28 75 6e 73 69 67 6e 65 64  oBase16(unsigned
1b220 20 63 68 61 72 20 2a 64 69 67 65 73 74 2c 20 63   char *digest, c
1b230 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 73 74  har *zBuf){.  st
1b240 61 74 69 63 20 63 68 61 72 20 63 6f 6e 73 74 20  atic char const 
1b250 7a 45 6e 63 6f 64 65 5b 5d 20 3d 20 22 30 31 32  zEncode[] = "012
1b260 33 34 35 36 37 38 39 61 62 63 64 65 66 22 3b 0a  3456789abcdef";.
1b270 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 0a 20 20 66    int i, j;..  f
1b280 6f 72 28 6a 3d 69 3d 30 3b 20 69 3c 31 36 3b 20  or(j=i=0; i<16; 
1b290 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 61 20  i++){.    int a 
1b2a0 3d 20 64 69 67 65 73 74 5b 69 5d 3b 0a 20 20 20  = digest[i];.   
1b2b0 20 7a 42 75 66 5b 6a 2b 2b 5d 20 3d 20 7a 45 6e   zBuf[j++] = zEn
1b2c0 63 6f 64 65 5b 28 61 3e 3e 34 29 26 30 78 66 5d  code[(a>>4)&0xf]
1b2d0 3b 0a 20 20 20 20 7a 42 75 66 5b 6a 2b 2b 5d 20  ;.    zBuf[j++] 
1b2e0 3d 20 7a 45 6e 63 6f 64 65 5b 61 20 26 20 30 78  = zEncode[a & 0x
1b2f0 66 5d 3b 0a 20 20 7d 0a 20 20 7a 42 75 66 5b 6a  f];.  }.  zBuf[j
1b300 5d 20 3d 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  ] = 0;.}.../*.**
1b310 20 43 6f 6e 76 65 72 74 20 61 20 31 32 38 2d 62   Convert a 128-b
1b320 69 74 20 4d 44 35 20 64 69 67 65 73 74 20 69 6e  it MD5 digest in
1b330 74 6f 20 73 65 71 75 65 6e 63 79 20 6f 66 20 65  to sequency of e
1b340 69 67 68 74 20 35 2d 64 69 67 69 74 20 69 6e 74  ight 5-digit int
1b350 65 67 65 72 73 0a 2a 2a 20 65 61 63 68 20 72 65  egers.** each re
1b360 70 72 65 73 65 6e 74 69 6e 67 20 31 36 20 62 69  presenting 16 bi
1b370 74 73 20 6f 66 20 74 68 65 20 64 69 67 65 73 74  ts of the digest
1b380 20 61 6e 64 20 73 65 70 61 72 61 74 65 64 20 66   and separated f
1b390 72 6f 6d 20 65 61 63 68 0a 2a 2a 20 6f 74 68 65  rom each.** othe
1b3a0 72 20 62 79 20 61 20 22 2d 22 20 63 68 61 72 61  r by a "-" chara
1b3b0 63 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  cter..*/.static 
1b3c0 76 6f 69 64 20 4d 44 35 44 69 67 65 73 74 54 6f  void MD5DigestTo
1b3d0 42 61 73 65 31 30 78 38 28 75 6e 73 69 67 6e 65  Base10x8(unsigne
1b3e0 64 20 63 68 61 72 20 64 69 67 65 73 74 5b 31 36  d char digest[16
1b3f0 5d 2c 20 63 68 61 72 20 7a 44 69 67 65 73 74 5b  ], char zDigest[
1b400 35 30 5d 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a  50]){.  int i, j
1b410 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  ;.  unsigned int
1b420 20 78 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b   x;.  for(i=j=0;
1b430 20 69 3c 31 36 3b 20 69 2b 3d 32 29 7b 0a 20 20   i<16; i+=2){.  
1b440 20 20 78 20 3d 20 64 69 67 65 73 74 5b 69 5d 2a    x = digest[i]*
1b450 32 35 36 20 2b 20 64 69 67 65 73 74 5b 69 2b 31  256 + digest[i+1
1b460 5d 3b 0a 20 20 20 20 69 66 28 20 69 3e 30 20 29  ];.    if( i>0 )
1b470 20 7a 44 69 67 65 73 74 5b 6a 2b 2b 5d 20 3d 20   zDigest[j++] = 
1b480 27 2d 27 3b 0a 20 20 20 20 73 70 72 69 6e 74 66  '-';.    sprintf
1b490 28 26 7a 44 69 67 65 73 74 5b 6a 5d 2c 20 22 25  (&zDigest[j], "%
1b4a0 30 35 75 22 2c 20 78 29 3b 0a 20 20 20 20 6a 20  05u", x);.    j 
1b4b0 2b 3d 20 35 3b 0a 20 20 7d 0a 20 20 7a 44 69 67  += 5;.  }.  zDig
1b4c0 65 73 74 5b 6a 5d 20 3d 20 30 3b 0a 7d 0a 0a 2f  est[j] = 0;.}../
1b4d0 2a 0a 2a 2a 20 41 20 54 43 4c 20 63 6f 6d 6d 61  *.** A TCL comma
1b4e0 6e 64 20 66 6f 72 20 6d 64 35 2e 20 20 54 68 65  nd for md5.  The
1b4f0 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65   argument is the
1b500 20 74 65 78 74 20 74 6f 20 62 65 20 68 61 73 68   text to be hash
1b510 65 64 2e 20 20 54 68 65 0a 2a 2a 20 52 65 73 75  ed.  The.** Resu
1b520 6c 74 20 69 73 20 74 68 65 20 68 61 73 68 20 69  lt is the hash i
1b530 6e 20 62 61 73 65 36 34 2e 20 20 0a 2a 2f 0a 73  n base64.  .*/.s
1b540 74 61 74 69 63 20 69 6e 74 20 6d 64 35 5f 63 6d  tatic int md5_cm
1b550 64 28 76 6f 69 64 2a 63 64 2c 20 54 63 6c 5f 49  d(void*cd, Tcl_I
1b560 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69  nterp *interp, i
1b570 6e 74 20 61 72 67 63 2c 20 63 6f 6e 73 74 20 63  nt argc, const c
1b580 68 61 72 20 2a 2a 61 72 67 76 29 7b 0a 20 20 4d  har **argv){.  M
1b590 44 35 43 6f 6e 74 65 78 74 20 63 74 78 3b 0a 20  D5Context ctx;. 
1b5a0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 64   unsigned char d
1b5b0 69 67 65 73 74 5b 31 36 5d 3b 0a 20 20 63 68 61  igest[16];.  cha
1b5c0 72 20 7a 42 75 66 5b 35 30 5d 3b 0a 20 20 76 6f  r zBuf[50];.  vo
1b5d0 69 64 20 28 2a 63 6f 6e 76 65 72 74 65 72 29 28  id (*converter)(
1b5e0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 2c 20  unsigned char*, 
1b5f0 63 68 61 72 2a 29 3b 0a 0a 20 20 69 66 28 20 61  char*);..  if( a
1b600 72 67 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  rgc!=2 ){.    Tc
1b610 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
1b620 6e 74 65 72 70 2c 22 77 72 6f 6e 67 20 23 20 61  nterp,"wrong # a
1b630 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
1b640 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20  "", argv[0], .  
1b650 20 20 20 20 20 20 22 20 54 45 58 54 5c 22 22 2c        " TEXT\"",
1b660 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
1b670 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
1b680 20 4d 44 35 49 6e 69 74 28 26 63 74 78 29 3b 0a   MD5Init(&ctx);.
1b690 20 20 4d 44 35 55 70 64 61 74 65 28 26 63 74 78    MD5Update(&ctx
1b6a0 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  , (unsigned char
1b6b0 2a 29 61 72 67 76 5b 31 5d 2c 20 28 75 6e 73 69  *)argv[1], (unsi
1b6c0 67 6e 65 64 29 73 74 72 6c 65 6e 28 61 72 67 76  gned)strlen(argv
1b6d0 5b 31 5d 29 29 3b 0a 20 20 4d 44 35 46 69 6e 61  [1]));.  MD5Fina
1b6e0 6c 28 64 69 67 65 73 74 2c 20 26 63 74 78 29 3b  l(digest, &ctx);
1b6f0 0a 20 20 63 6f 6e 76 65 72 74 65 72 20 3d 20 28  .  converter = (
1b700 76 6f 69 64 28 2a 29 28 75 6e 73 69 67 6e 65 64  void(*)(unsigned
1b710 20 63 68 61 72 2a 2c 63 68 61 72 2a 29 29 63 64   char*,char*))cd
1b720 3b 0a 20 20 63 6f 6e 76 65 72 74 65 72 28 64 69  ;.  converter(di
1b730 67 65 73 74 2c 20 7a 42 75 66 29 3b 0a 20 20 54  gest, zBuf);.  T
1b740 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
1b750 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 28 63  interp, zBuf, (c
1b760 68 61 72 2a 29 30 29 3b 0a 20 20 72 65 74 75 72  har*)0);.  retur
1b770 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
1b780 2a 2a 20 41 20 54 43 4c 20 63 6f 6d 6d 61 6e 64  ** A TCL command
1b790 20 74 6f 20 74 61 6b 65 20 74 68 65 20 6d 64 35   to take the md5
1b7a0 20 68 61 73 68 20 6f 66 20 61 20 66 69 6c 65 2e   hash of a file.
1b7b0 20 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20 69    The argument i
1b7c0 73 20 74 68 65 0a 2a 2a 20 6e 61 6d 65 20 6f 66  s the.** name of
1b7d0 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74   the file..*/.st
1b7e0 61 74 69 63 20 69 6e 74 20 6d 64 35 66 69 6c 65  atic int md5file
1b7f0 5f 63 6d 64 28 76 6f 69 64 2a 63 64 2c 20 54 63  _cmd(void*cd, Tc
1b800 6c 5f 49 6e 74 65 72 70 2a 69 6e 74 65 72 70 2c  l_Interp*interp,
1b810 20 69 6e 74 20 61 72 67 63 2c 20 63 6f 6e 73 74   int argc, const
1b820 20 63 68 61 72 20 2a 2a 61 72 67 76 29 7b 0a 20   char **argv){. 
1b830 20 46 49 4c 45 20 2a 69 6e 3b 0a 20 20 4d 44 35   FILE *in;.  MD5
1b840 43 6f 6e 74 65 78 74 20 63 74 78 3b 0a 20 20 76  Context ctx;.  v
1b850 6f 69 64 20 28 2a 63 6f 6e 76 65 72 74 65 72 29  oid (*converter)
1b860 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 2c  (unsigned char*,
1b870 20 63 68 61 72 2a 29 3b 0a 20 20 75 6e 73 69 67   char*);.  unsig
1b880 6e 65 64 20 63 68 61 72 20 64 69 67 65 73 74 5b  ned char digest[
1b890 31 36 5d 3b 0a 20 20 63 68 61 72 20 7a 42 75 66  16];.  char zBuf
1b8a0 5b 31 30 32 34 30 5d 3b 0a 0a 20 20 69 66 28 20  [10240];..  if( 
1b8b0 61 72 67 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  argc!=2 ){.    T
1b8c0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
1b8d0 69 6e 74 65 72 70 2c 22 77 72 6f 6e 67 20 23 20  interp,"wrong # 
1b8e0 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
1b8f0 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20  \"", argv[0], . 
1b900 20 20 20 20 20 20 20 22 20 46 49 4c 45 4e 41 4d         " FILENAM
1b910 45 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  E\"", 0);.    re
1b920 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1b930 20 20 7d 0a 20 20 69 6e 20 3d 20 66 6f 70 65 6e    }.  in = fopen
1b940 28 61 72 67 76 5b 31 5d 2c 22 72 62 22 29 3b 0a  (argv[1],"rb");.
1b950 20 20 69 66 28 20 69 6e 3d 3d 30 20 29 7b 0a 20    if( in==0 ){. 
1b960 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
1b970 75 6c 74 28 69 6e 74 65 72 70 2c 22 75 6e 61 62  ult(interp,"unab
1b980 6c 65 20 74 6f 20 6f 70 65 6e 20 66 69 6c 65 20  le to open file 
1b990 5c 22 22 2c 20 61 72 67 76 5b 31 5d 2c 20 0a 20  \"", argv[1], . 
1b9a0 20 20 20 20 20 20 20 20 22 5c 22 20 66 6f 72 20          "\" for 
1b9b0 72 65 61 64 69 6e 67 22 2c 20 30 29 3b 0a 20 20  reading", 0);.  
1b9c0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
1b9d0 4f 52 3b 0a 20 20 7d 0a 20 20 4d 44 35 49 6e 69  OR;.  }.  MD5Ini
1b9e0 74 28 26 63 74 78 29 3b 0a 20 20 66 6f 72 28 3b  t(&ctx);.  for(;
1b9f0 3b 29 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20  ;){.    int n;. 
1ba00 20 20 20 6e 20 3d 20 66 72 65 61 64 28 7a 42 75     n = fread(zBu
1ba10 66 2c 20 31 2c 20 73 69 7a 65 6f 66 28 7a 42 75  f, 1, sizeof(zBu
1ba20 66 29 2c 20 69 6e 29 3b 0a 20 20 20 20 69 66 28  f), in);.    if(
1ba30 20 6e 3c 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20   n<=0 ) break;. 
1ba40 20 20 20 4d 44 35 55 70 64 61 74 65 28 26 63 74     MD5Update(&ct
1ba50 78 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61  x, (unsigned cha
1ba60 72 2a 29 7a 42 75 66 2c 20 28 75 6e 73 69 67 6e  r*)zBuf, (unsign
1ba70 65 64 29 6e 29 3b 0a 20 20 7d 0a 20 20 66 63 6c  ed)n);.  }.  fcl
1ba80 6f 73 65 28 69 6e 29 3b 0a 20 20 4d 44 35 46 69  ose(in);.  MD5Fi
1ba90 6e 61 6c 28 64 69 67 65 73 74 2c 20 26 63 74 78  nal(digest, &ctx
1baa0 29 3b 0a 20 20 63 6f 6e 76 65 72 74 65 72 20 3d  );.  converter =
1bab0 20 28 76 6f 69 64 28 2a 29 28 75 6e 73 69 67 6e   (void(*)(unsign
1bac0 65 64 20 63 68 61 72 2a 2c 63 68 61 72 2a 29 29  ed char*,char*))
1bad0 63 64 3b 0a 20 20 63 6f 6e 76 65 72 74 65 72 28  cd;.  converter(
1bae0 64 69 67 65 73 74 2c 20 7a 42 75 66 29 3b 0a 20  digest, zBuf);. 
1baf0 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
1bb00 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20  t(interp, zBuf, 
1bb10 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 72 65 74  (char*)0);.  ret
1bb20 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
1bb30 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 74 68  *.** Register th
1bb40 65 20 66 6f 75 72 20 6e 65 77 20 54 43 4c 20 63  e four new TCL c
1bb50 6f 6d 6d 61 6e 64 73 20 66 6f 72 20 67 65 6e 65  ommands for gene
1bb60 72 61 74 69 6e 67 20 4d 44 35 20 63 68 65 63 6b  rating MD5 check
1bb70 73 75 6d 73 0a 2a 2a 20 77 69 74 68 20 74 68 65  sums.** with the
1bb80 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
1bb90 2e 0a 2a 2f 0a 69 6e 74 20 4d 64 35 5f 49 6e 69  ..*/.int Md5_Ini
1bba0 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  t(Tcl_Interp *in
1bbb0 74 65 72 70 29 7b 0a 20 20 54 63 6c 5f 43 72 65  terp){.  Tcl_Cre
1bbc0 61 74 65 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72  ateCommand(inter
1bbd0 70 2c 20 22 6d 64 35 22 2c 20 28 54 63 6c 5f 43  p, "md5", (Tcl_C
1bbe0 6d 64 50 72 6f 63 2a 29 6d 64 35 5f 63 6d 64 2c  mdProc*)md5_cmd,
1bbf0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1bc00 20 20 20 20 20 4d 44 35 44 69 67 65 73 74 54 6f       MD5DigestTo
1bc10 42 61 73 65 31 36 2c 20 30 29 3b 0a 20 20 54 63  Base16, 0);.  Tc
1bc20 6c 5f 43 72 65 61 74 65 43 6f 6d 6d 61 6e 64 28  l_CreateCommand(
1bc30 69 6e 74 65 72 70 2c 20 22 6d 64 35 2d 31 30 78  interp, "md5-10x
1bc40 38 22 2c 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63  8", (Tcl_CmdProc
1bc50 2a 29 6d 64 35 5f 63 6d 64 2c 0a 20 20 20 20 20  *)md5_cmd,.     
1bc60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4d                 M
1bc70 44 35 44 69 67 65 73 74 54 6f 42 61 73 65 31 30  D5DigestToBase10
1bc80 78 38 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 43 72  x8, 0);.  Tcl_Cr
1bc90 65 61 74 65 43 6f 6d 6d 61 6e 64 28 69 6e 74 65  eateCommand(inte
1bca0 72 70 2c 20 22 6d 64 35 66 69 6c 65 22 2c 20 28  rp, "md5file", (
1bcb0 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 6d 64 35  Tcl_CmdProc*)md5
1bcc0 66 69 6c 65 5f 63 6d 64 2c 0a 20 20 20 20 20 20  file_cmd,.      
1bcd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4d 44                MD
1bce0 35 44 69 67 65 73 74 54 6f 42 61 73 65 31 36 2c  5DigestToBase16,
1bcf0 20 30 29 3b 0a 20 20 54 63 6c 5f 43 72 65 61 74   0);.  Tcl_Creat
1bd00 65 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c  eCommand(interp,
1bd10 20 22 6d 64 35 66 69 6c 65 2d 31 30 78 38 22 2c   "md5file-10x8",
1bd20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 6d   (Tcl_CmdProc*)m
1bd30 64 35 66 69 6c 65 5f 63 6d 64 2c 0a 20 20 20 20  d5file_cmd,.    
1bd40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bd50 4d 44 35 44 69 67 65 73 74 54 6f 42 61 73 65 31  MD5DigestToBase1
1bd60 30 78 38 2c 20 30 29 3b 0a 20 20 72 65 74 75 72  0x8, 0);.  retur
1bd70 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  n TCL_OK;.}.#end
1bd80 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 53 51  if /* defined(SQ
1bd90 4c 49 54 45 5f 54 45 53 54 29 20 7c 7c 20 64 65  LITE_TEST) || de
1bda0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 43 4c  fined(SQLITE_TCL
1bdb0 4d 44 35 29 20 2a 2f 0a 0a 23 69 66 20 64 65 66  MD5) */..#if def
1bdc0 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54  ined(SQLITE_TEST
1bdd0 29 0a 2f 2a 0a 2a 2a 20 44 75 72 69 6e 67 20 74  )./*.** During t
1bde0 65 73 74 69 6e 67 2c 20 74 68 65 20 73 70 65 63  esting, the spec
1bdf0 69 61 6c 20 6d 64 35 73 75 6d 28 29 20 61 67 67  ial md5sum() agg
1be00 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20  regate function 
1be10 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a  is available..**
1be20 20 69 6e 73 69 64 65 20 53 51 4c 69 74 65 2e 20   inside SQLite. 
1be30 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72   The following r
1be40 6f 75 74 69 6e 65 73 20 69 6d 70 6c 65 6d 65 6e  outines implemen
1be50 74 20 74 68 61 74 20 66 75 6e 63 74 69 6f 6e 2e  t that function.
1be60 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1be70 6d 64 35 73 74 65 70 28 73 71 6c 69 74 65 33 5f  md5step(sqlite3_
1be80 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  context *context
1be90 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69  , int argc, sqli
1bea0 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76  te3_value **argv
1beb0 29 7b 0a 20 20 4d 44 35 43 6f 6e 74 65 78 74 20  ){.  MD5Context 
1bec0 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  *p;.  int i;.  i
1bed0 66 28 20 61 72 67 63 3c 31 20 29 20 72 65 74 75  f( argc<1 ) retu
1bee0 72 6e 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65  rn;.  p = sqlite
1bef0 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74  3_aggregate_cont
1bf00 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 73 69 7a  ext(context, siz
1bf10 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69 66 28 20  eof(*p));.  if( 
1bf20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  p==0 ) return;. 
1bf30 20 69 66 28 20 21 70 2d 3e 69 73 49 6e 69 74 20   if( !p->isInit 
1bf40 29 7b 0a 20 20 20 20 4d 44 35 49 6e 69 74 28 70  ){.    MD5Init(p
1bf50 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  );.  }.  for(i=0
1bf60 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a  ; i<argc; i++){.
1bf70 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
1bf80 7a 44 61 74 61 20 3d 20 28 63 68 61 72 2a 29 73  zData = (char*)s
1bf90 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
1bfa0 74 28 61 72 67 76 5b 69 5d 29 3b 0a 20 20 20 20  t(argv[i]);.    
1bfb0 69 66 28 20 7a 44 61 74 61 20 29 7b 0a 20 20 20  if( zData ){.   
1bfc0 20 20 20 4d 44 35 55 70 64 61 74 65 28 70 2c 20     MD5Update(p, 
1bfd0 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29  (unsigned char*)
1bfe0 7a 44 61 74 61 2c 20 73 74 72 6c 65 6e 28 7a 44  zData, strlen(zD
1bff0 61 74 61 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ata));.    }.  }
1c000 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d  .}.static void m
1c010 64 35 66 69 6e 61 6c 69 7a 65 28 73 71 6c 69 74  d5finalize(sqlit
1c020 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  e3_context *cont
1c030 65 78 74 29 7b 0a 20 20 4d 44 35 43 6f 6e 74 65  ext){.  MD5Conte
1c040 78 74 20 2a 70 3b 0a 20 20 75 6e 73 69 67 6e 65  xt *p;.  unsigne
1c050 64 20 63 68 61 72 20 64 69 67 65 73 74 5b 31 36  d char digest[16
1c060 5d 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 33  ];.  char zBuf[3
1c070 33 5d 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65  3];.  p = sqlite
1c080 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74  3_aggregate_cont
1c090 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 73 69 7a  ext(context, siz
1c0a0 65 6f 66 28 2a 70 29 29 3b 0a 20 20 4d 44 35 46  eof(*p));.  MD5F
1c0b0 69 6e 61 6c 28 64 69 67 65 73 74 2c 70 29 3b 0a  inal(digest,p);.
1c0c0 20 20 4d 44 35 44 69 67 65 73 74 54 6f 42 61 73    MD5DigestToBas
1c0d0 65 31 36 28 64 69 67 65 73 74 2c 20 7a 42 75 66  e16(digest, zBuf
1c0e0 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73  );.  sqlite3_res
1c0f0 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74  ult_text(context
1c100 2c 20 7a 42 75 66 2c 20 2d 31 2c 20 53 51 4c 49  , zBuf, -1, SQLI
1c110 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 7d  TE_TRANSIENT);.}
1c120 0a 69 6e 74 20 4d 64 35 5f 52 65 67 69 73 74 65  .int Md5_Registe
1c130 72 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  r(sqlite3 *db){.
1c140 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74    int rc = sqlit
1c150 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
1c160 6f 6e 28 64 62 2c 20 22 6d 64 35 73 75 6d 22 2c  on(db, "md5sum",
1c170 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38   -1, SQLITE_UTF8
1c180 2c 20 30 2c 20 30 2c 20 0a 20 20 20 20 20 20 20  , 0, 0, .       
1c190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c1a0 20 20 20 20 20 20 20 20 20 20 6d 64 35 73 74 65            md5ste
1c1b0 70 2c 20 6d 64 35 66 69 6e 61 6c 69 7a 65 29 3b  p, md5finalize);
1c1c0 0a 20 20 73 71 6c 69 74 65 33 5f 6f 76 65 72 6c  .  sqlite3_overl
1c1d0 6f 61 64 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c  oad_function(db,
1c1e0 20 22 6d 64 35 73 75 6d 22 2c 20 2d 31 29 3b 20   "md5sum", -1); 
1c1f0 20 2f 2a 20 54 6f 20 65 78 65 72 63 69 73 65 20   /* To exercise 
1c200 74 68 69 73 20 41 50 49 20 2a 2f 0a 20 20 72 65  this API */.  re
1c210 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69  turn rc;.}.#endi
1c220 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 53 51 4c  f /* defined(SQL
1c230 49 54 45 5f 54 45 53 54 29 20 2a 2f 0a 0a 0a 2f  ITE_TEST) */.../
1c240 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6d 61 63 72  *.** If the macr
1c250 6f 20 54 43 4c 53 48 20 69 73 20 6f 6e 65 2c 20  o TCLSH is one, 
1c260 74 68 65 6e 20 70 75 74 20 69 6e 20 63 6f 64 65  then put in code
1c270 20 74 68 69 73 20 66 6f 72 20 74 68 65 0a 2a 2a   this for the.**
1c280 20 22 6d 61 69 6e 22 20 72 6f 75 74 69 6e 65 20   "main" routine 
1c290 74 68 61 74 20 77 69 6c 6c 20 69 6e 69 74 69 61  that will initia
1c2a0 6c 69 7a 65 20 54 63 6c 20 61 6e 64 20 74 61 6b  lize Tcl and tak
1c2b0 65 20 69 6e 70 75 74 20 66 72 6f 6d 0a 2a 2a 20  e input from.** 
1c2c0 73 74 61 6e 64 61 72 64 20 69 6e 70 75 74 2c 20  standard input, 
1c2d0 6f 72 20 69 66 20 61 20 66 69 6c 65 20 69 73 20  or if a file is 
1c2e0 6e 61 6d 65 64 20 6f 6e 20 74 68 65 20 63 6f 6d  named on the com
1c2f0 6d 61 6e 64 20 6c 69 6e 65 0a 2a 2a 20 74 68 65  mand line.** the
1c300 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
1c310 20 72 65 61 64 73 20 61 6e 64 20 65 76 61 6c 75   reads and evalu
1c320 61 74 65 73 20 74 68 61 74 20 66 69 6c 65 2e 0a  ates that file..
1c330 2a 2f 0a 23 69 66 20 54 43 4c 53 48 3d 3d 31 0a  */.#if TCLSH==1.
1c340 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
1c350 72 20 2a 74 63 6c 73 68 5f 6d 61 69 6e 5f 6c 6f  r *tclsh_main_lo
1c360 6f 70 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74  op(void){.  stat
1c370 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 7a 4d  ic const char zM
1c380 61 69 6e 6c 6f 6f 70 5b 5d 20 3d 0a 20 20 20 20  ainloop[] =.    
1c390 22 73 65 74 20 6c 69 6e 65 20 7b 7d 5c 6e 22 0a  "set line {}\n".
1c3a0 20 20 20 20 22 77 68 69 6c 65 20 7b 21 5b 65 6f      "while {![eo
1c3b0 66 20 73 74 64 69 6e 5d 7d 20 7b 5c 6e 22 0a 20  f stdin]} {\n". 
1c3c0 20 20 20 20 20 22 69 66 20 7b 24 6c 69 6e 65 21       "if {$line!
1c3d0 3d 5c 22 5c 22 7d 20 7b 5c 6e 22 0a 20 20 20 20  =\"\"} {\n".    
1c3e0 20 20 20 20 22 70 75 74 73 20 2d 6e 6f 6e 65 77      "puts -nonew
1c3f0 6c 69 6e 65 20 5c 22 3e 20 5c 22 5c 6e 22 0a 20  line \"> \"\n". 
1c400 20 20 20 20 20 22 7d 20 65 6c 73 65 20 7b 5c 6e       "} else {\n
1c410 22 0a 20 20 20 20 20 20 20 20 22 70 75 74 73 20  ".        "puts 
1c420 2d 6e 6f 6e 65 77 6c 69 6e 65 20 5c 22 25 20 5c  -nonewline \"% \
1c430 22 5c 6e 22 0a 20 20 20 20 20 20 22 7d 5c 6e 22  "\n".      "}\n"
1c440 0a 20 20 20 20 20 20 22 66 6c 75 73 68 20 73 74  .      "flush st
1c450 64 6f 75 74 5c 6e 22 0a 20 20 20 20 20 20 22 61  dout\n".      "a
1c460 70 70 65 6e 64 20 6c 69 6e 65 20 5b 67 65 74 73  ppend line [gets
1c470 20 73 74 64 69 6e 5d 5c 6e 22 0a 20 20 20 20 20   stdin]\n".     
1c480 20 22 69 66 20 7b 5b 69 6e 66 6f 20 63 6f 6d 70   "if {[info comp
1c490 6c 65 74 65 20 24 6c 69 6e 65 5d 7d 20 7b 5c 6e  lete $line]} {\n
1c4a0 22 0a 20 20 20 20 20 20 20 20 22 69 66 20 7b 5b  ".        "if {[
1c4b0 63 61 74 63 68 20 7b 75 70 6c 65 76 65 6c 20 23  catch {uplevel #
1c4c0 30 20 24 6c 69 6e 65 7d 20 72 65 73 75 6c 74 5d  0 $line} result]
1c4d0 7d 20 7b 5c 6e 22 0a 20 20 20 20 20 20 20 20 20  } {\n".         
1c4e0 20 22 70 75 74 73 20 73 74 64 65 72 72 20 5c 22   "puts stderr \"
1c4f0 45 72 72 6f 72 3a 20 24 72 65 73 75 6c 74 5c 22  Error: $result\"
1c500 5c 6e 22 0a 20 20 20 20 20 20 20 20 22 7d 20 65  \n".        "} e
1c510 6c 73 65 69 66 20 7b 24 72 65 73 75 6c 74 21 3d  lseif {$result!=
1c520 5c 22 5c 22 7d 20 7b 5c 6e 22 0a 20 20 20 20 20  \"\"} {\n".     
1c530 20 20 20 20 20 22 70 75 74 73 20 24 72 65 73 75       "puts $resu
1c540 6c 74 5c 6e 22 0a 20 20 20 20 20 20 20 20 22 7d  lt\n".        "}
1c550 5c 6e 22 0a 20 20 20 20 20 20 20 20 22 73 65 74  \n".        "set
1c560 20 6c 69 6e 65 20 7b 7d 5c 6e 22 0a 20 20 20 20   line {}\n".    
1c570 20 20 22 7d 20 65 6c 73 65 20 7b 5c 6e 22 0a 20    "} else {\n". 
1c580 20 20 20 20 20 20 20 22 61 70 70 65 6e 64 20 6c         "append l
1c590 69 6e 65 20 5c 5c 6e 5c 6e 22 0a 20 20 20 20 20  ine \\n\n".     
1c5a0 20 22 7d 5c 6e 22 0a 20 20 20 20 22 7d 5c 6e 22   "}\n".    "}\n"
1c5b0 0a 20 20 3b 0a 20 20 72 65 74 75 72 6e 20 7a 4d  .  ;.  return zM
1c5c0 61 69 6e 6c 6f 6f 70 3b 0a 7d 0a 23 65 6e 64 69  ainloop;.}.#endi
1c5d0 66 0a 23 69 66 20 54 43 4c 53 48 3d 3d 32 0a 73  f.#if TCLSH==2.s
1c5e0 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
1c5f0 20 2a 74 63 6c 73 68 5f 6d 61 69 6e 5f 6c 6f 6f   *tclsh_main_loo
1c600 70 28 76 6f 69 64 29 3b 0a 23 65 6e 64 69 66 0a  p(void);.#endif.
1c610 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
1c620 45 53 54 0a 73 74 61 74 69 63 20 76 6f 69 64 20  EST.static void 
1c630 69 6e 69 74 5f 61 6c 6c 28 54 63 6c 5f 49 6e 74  init_all(Tcl_Int
1c640 65 72 70 20 2a 29 3b 0a 73 74 61 74 69 63 20 69  erp *);.static i
1c650 6e 74 20 69 6e 69 74 5f 61 6c 6c 5f 63 6d 64 28  nt init_all_cmd(
1c660 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 64  .  ClientData cd
1c670 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
1c680 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
1c690 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
1c6a0 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 0a  ONST objv[].){..
1c6b0 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 73 6c    Tcl_Interp *sl
1c6c0 61 76 65 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21  ave;.  if( objc!
1c6d0 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  =2 ){.    Tcl_Wr
1c6e0 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
1c6f0 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53 4c 41  p, 1, objv, "SLA
1c700 56 45 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  VE");.    return
1c710 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
1c720 0a 20 20 73 6c 61 76 65 20 3d 20 54 63 6c 5f 47  .  slave = Tcl_G
1c730 65 74 53 6c 61 76 65 28 69 6e 74 65 72 70 2c 20  etSlave(interp, 
1c740 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
1c750 6a 76 5b 31 5d 29 29 3b 0a 20 20 69 66 28 20 21  jv[1]));.  if( !
1c760 73 6c 61 76 65 20 29 7b 0a 20 20 20 20 72 65 74  slave ){.    ret
1c770 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1c780 20 7d 0a 0a 20 20 69 6e 69 74 5f 61 6c 6c 28 73   }..  init_all(s
1c790 6c 61 76 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  lave);.  return 
1c7a0 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
1c7b0 20 54 63 6c 63 6d 64 3a 20 64 62 5f 75 73 65 5f   Tclcmd: db_use_
1c7c0 6c 65 67 61 63 79 5f 70 72 65 70 61 72 65 20 44  legacy_prepare D
1c7d0 42 20 42 4f 4f 4c 45 41 4e 0a 2a 2a 0a 2a 2a 20  B BOOLEAN.**.** 
1c7e0 20 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75    The first argu
1c7f0 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 63 6f 6d  ment to this com
1c800 6d 61 6e 64 20 6d 75 73 74 20 62 65 20 61 20 64  mand must be a d
1c810 61 74 61 62 61 73 65 20 63 6f 6d 6d 61 6e 64 20  atabase command 
1c820 63 72 65 61 74 65 64 20 62 79 0a 2a 2a 20 20 20  created by.**   
1c830 5b 73 71 6c 69 74 65 33 5d 2e 20 49 66 20 74 68  [sqlite3]. If th
1c840 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
1c850 74 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  t is true, then 
1c860 74 68 65 20 68 61 6e 64 6c 65 20 69 73 20 63 6f  the handle is co
1c870 6e 66 69 67 75 72 65 64 0a 2a 2a 20 20 20 74 6f  nfigured.**   to
1c880 20 75 73 65 20 74 68 65 20 73 71 6c 69 74 65 33   use the sqlite3
1c890 5f 70 72 65 70 61 72 65 5f 76 32 28 29 20 66 75  _prepare_v2() fu
1c8a0 6e 63 74 69 6f 6e 20 74 6f 20 70 72 65 70 61 72  nction to prepar
1c8b0 65 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 49 66  e statements. If
1c8c0 20 69 74 0a 2a 2a 20 20 20 69 73 20 66 61 6c 73   it.**   is fals
1c8d0 65 2c 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61  e, sqlite3_prepa
1c8e0 72 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  re()..*/.static 
1c8f0 69 6e 74 20 64 62 5f 75 73 65 5f 6c 65 67 61 63  int db_use_legac
1c900 79 5f 70 72 65 70 61 72 65 5f 63 6d 64 28 0a 20  y_prepare_cmd(. 
1c910 20 43 6c 69 65 6e 74 44 61 74 61 20 63 64 2c 0a   ClientData cd,.
1c920 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
1c930 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
1c940 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
1c950 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 54  ST objv[].){.  T
1c960 63 6c 5f 43 6d 64 49 6e 66 6f 20 63 6d 64 49 6e  cl_CmdInfo cmdIn
1c970 66 6f 3b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a  fo;.  SqliteDb *
1c980 70 44 62 3b 0a 20 20 69 6e 74 20 62 50 72 65 70  pDb;.  int bPrep
1c990 61 72 65 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63  are;..  if( objc
1c9a0 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  !=3 ){.    Tcl_W
1c9b0 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
1c9c0 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42  rp, 1, objv, "DB
1c9d0 20 42 4f 4f 4c 45 41 4e 22 29 3b 0a 20 20 20 20   BOOLEAN");.    
1c9e0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1c9f0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 54 63  ;.  }..  if( !Tc
1ca00 6c 5f 47 65 74 43 6f 6d 6d 61 6e 64 49 6e 66 6f  l_GetCommandInfo
1ca10 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
1ca20 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
1ca30 20 26 63 6d 64 49 6e 66 6f 29 20 29 7b 0a 20 20   &cmdInfo) ){.  
1ca40 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
1ca50 6c 74 28 69 6e 74 65 72 70 2c 20 22 6e 6f 20 73  lt(interp, "no s
1ca60 75 63 68 20 64 62 3a 20 22 2c 20 54 63 6c 5f 47  uch db: ", Tcl_G
1ca70 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
1ca80 29 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  ), (char*)0);.  
1ca90 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
1caa0 4f 52 3b 0a 20 20 7d 0a 20 20 70 44 62 20 3d 20  OR;.  }.  pDb = 
1cab0 28 53 71 6c 69 74 65 44 62 2a 29 63 6d 64 49 6e  (SqliteDb*)cmdIn
1cac0 66 6f 2e 6f 62 6a 43 6c 69 65 6e 74 44 61 74 61  fo.objClientData
1cad0 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 42  ;.  if( Tcl_GetB
1cae0 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e  ooleanFromObj(in
1caf0 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26  terp, objv[2], &
1cb00 62 50 72 65 70 61 72 65 29 20 29 7b 0a 20 20 20  bPrepare) ){.   
1cb10 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1cb20 52 3b 0a 20 20 7d 0a 0a 20 20 70 44 62 2d 3e 62  R;.  }..  pDb->b
1cb30 4c 65 67 61 63 79 50 72 65 70 61 72 65 20 3d 20  LegacyPrepare = 
1cb40 62 50 72 65 70 61 72 65 3b 0a 0a 20 20 54 63 6c  bPrepare;..  Tcl
1cb50 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74  _ResetResult(int
1cb60 65 72 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  erp);.  return T
1cb70 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a  CL_OK;.}.#endif.
1cb80 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 65  ./*.** Configure
1cb90 20 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 72   the interpreter
1cba0 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66   passed as the f
1cbb0 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f  irst argument to
1cbc0 20 68 61 76 65 20 61 63 63 65 73 73 0a 2a 2a 20   have access.** 
1cbd0 74 6f 20 74 68 65 20 63 6f 6d 6d 61 6e 64 73 20  to the commands 
1cbe0 61 6e 64 20 6c 69 6e 6b 65 64 20 76 61 72 69 61  and linked varia
1cbf0 62 6c 65 73 20 74 68 61 74 20 6d 61 6b 65 20 75  bles that make u
1cc00 70 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65  p:.**.**   * the
1cc10 20 5b 73 71 6c 69 74 65 33 5d 20 65 78 74 65 6e   [sqlite3] exten
1cc20 73 69 6f 6e 20 69 74 73 65 6c 66 2c 20 0a 2a 2a  sion itself, .**
1cc30 0a 2a 2a 20 20 20 2a 20 49 66 20 53 51 4c 49 54  .**   * If SQLIT
1cc40 45 5f 54 43 4c 4d 44 35 20 6f 72 20 53 51 4c 49  E_TCLMD5 or SQLI
1cc50 54 45 5f 54 45 53 54 20 69 73 20 64 65 66 69 6e  TE_TEST is defin
1cc60 65 64 2c 20 74 68 65 20 4d 64 35 20 63 6f 6d 6d  ed, the Md5 comm
1cc70 61 6e 64 73 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20  ands, and.**.** 
1cc80 20 20 2a 20 49 66 20 53 51 4c 49 54 45 5f 54 45    * If SQLITE_TE
1cc90 53 54 20 69 73 20 73 65 74 2c 20 74 68 65 20 76  ST is set, the v
1cca0 61 72 69 6f 75 73 20 74 65 73 74 20 69 6e 74 65  arious test inte
1ccb0 72 66 61 63 65 73 20 75 73 65 64 20 62 79 20 74  rfaces used by t
1ccc0 68 65 20 54 63 6c 0a 2a 2a 20 20 20 20 20 74 65  he Tcl.**     te
1ccd0 73 74 20 73 75 69 74 65 2e 0a 2a 2f 0a 73 74 61  st suite..*/.sta
1cce0 74 69 63 20 76 6f 69 64 20 69 6e 69 74 5f 61 6c  tic void init_al
1ccf0 6c 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  l(Tcl_Interp *in
1cd00 74 65 72 70 29 7b 0a 20 20 53 71 6c 69 74 65 33  terp){.  Sqlite3
1cd10 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 0a  _Init(interp);..
1cd20 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
1cd30 54 45 5f 54 45 53 54 29 20 7c 7c 20 64 65 66 69  TE_TEST) || defi
1cd40 6e 65 64 28 53 51 4c 49 54 45 5f 54 43 4c 4d 44  ned(SQLITE_TCLMD
1cd50 35 29 0a 20 20 4d 64 35 5f 49 6e 69 74 28 69 6e  5).  Md5_Init(in
1cd60 74 65 72 70 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  terp);.#endif.. 
1cd70 20 2f 2a 20 49 6e 73 74 61 6c 6c 20 74 68 65 20   /* Install the 
1cd80 5b 72 65 67 69 73 74 65 72 5f 64 62 73 74 61 74  [register_dbstat
1cd90 5f 76 74 61 62 5d 20 63 6f 6d 6d 61 6e 64 20 74  _vtab] command t
1cda0 6f 20 61 63 63 65 73 73 20 74 68 65 20 69 6d 70  o access the imp
1cdb0 6c 65 6d 65 6e 74 61 74 69 6f 6e 0a 20 20 2a 2a  lementation.  **
1cdc0 20 6f 66 20 76 69 72 74 75 61 6c 20 74 61 62 6c   of virtual tabl
1cdd0 65 20 64 62 73 74 61 74 20 28 73 6f 75 72 63 65  e dbstat (source
1cde0 20 66 69 6c 65 20 74 65 73 74 5f 73 74 61 74 2e   file test_stat.
1cdf0 63 29 2e 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64  c). This command
1ce00 20 69 73 0a 20 20 2a 2a 20 72 65 71 75 69 72 65   is.  ** require
1ce10 64 20 66 6f 72 20 74 65 73 74 66 69 78 74 75 72  d for testfixtur
1ce20 65 20 61 6e 64 20 73 71 6c 69 74 65 33 5f 61 6e  e and sqlite3_an
1ce30 61 6c 79 7a 65 72 2c 20 62 75 74 20 6e 6f 74 20  alyzer, but not 
1ce40 62 79 20 74 68 65 20 70 72 6f 64 75 63 74 69 6f  by the productio
1ce50 6e 0a 20 20 2a 2a 20 54 63 6c 20 65 78 74 65 6e  n.  ** Tcl exten
1ce60 73 69 6f 6e 2e 20 20 2a 2f 0a 23 69 66 20 64 65  sion.  */.#if de
1ce70 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53  fined(SQLITE_TES
1ce80 54 29 20 7c 7c 20 54 43 4c 53 48 3d 3d 32 0a 20  T) || TCLSH==2. 
1ce90 20 7b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e   {.    extern in
1cea0 74 20 53 71 6c 69 74 65 74 65 73 74 53 74 61 74  t SqlitetestStat
1ceb0 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
1cec0 2a 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65  *);.    Sqlitete
1ced0 73 74 53 74 61 74 5f 49 6e 69 74 28 69 6e 74 65  stStat_Init(inte
1cee0 72 70 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  rp);.  }.#endif.
1cef0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
1cf00 45 53 54 0a 20 20 7b 0a 20 20 20 20 65 78 74 65  EST.  {.    exte
1cf10 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 63 6f 6e  rn int Sqlitecon
1cf20 66 69 67 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74  fig_Init(Tcl_Int
1cf30 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72  erp*);.    exter
1cf40 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74  n int Sqlitetest
1cf50 31 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  1_Init(Tcl_Inter
1cf60 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20  p*);.    extern 
1cf70 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 32 5f  int Sqlitetest2_
1cf80 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a  Init(Tcl_Interp*
1cf90 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e  );.    extern in
1cfa0 74 20 53 71 6c 69 74 65 74 65 73 74 33 5f 49 6e  t Sqlitetest3_In
1cfb0 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b  it(Tcl_Interp*);
1cfc0 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20  .    extern int 
1cfd0 53 71 6c 69 74 65 74 65 73 74 34 5f 49 6e 69 74  Sqlitetest4_Init
1cfe0 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20  (Tcl_Interp*);. 
1cff0 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71     extern int Sq
1d000 6c 69 74 65 74 65 73 74 35 5f 49 6e 69 74 28 54  litetest5_Init(T
1d010 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20  cl_Interp*);.   
1d020 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69   extern int Sqli
1d030 74 65 74 65 73 74 36 5f 49 6e 69 74 28 54 63 6c  tetest6_Init(Tcl
1d040 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65  _Interp*);.    e
1d050 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65  xtern int Sqlite
1d060 74 65 73 74 37 5f 49 6e 69 74 28 54 63 6c 5f 49  test7_Init(Tcl_I
1d070 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74  nterp*);.    ext
1d080 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65  ern int Sqlitete
1d090 73 74 38 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74  st8_Init(Tcl_Int
1d0a0 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72  erp*);.    exter
1d0b0 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74  n int Sqlitetest
1d0c0 39 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  9_Init(Tcl_Inter
1d0d0 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20  p*);.    extern 
1d0e0 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 61 73  int Sqlitetestas
1d0f0 79 6e 63 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74  ync_Init(Tcl_Int
1d100 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72  erp*);.    exter
1d110 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74  n int Sqlitetest
1d120 5f 61 75 74 6f 65 78 74 5f 49 6e 69 74 28 54 63  _autoext_Init(Tc
1d130 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20  l_Interp*);.    
1d140 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74  extern int Sqlit
1d150 65 74 65 73 74 5f 64 65 6d 6f 76 66 73 5f 49 6e  etest_demovfs_In
1d160 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 29  it(Tcl_Interp *)
1d170 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74  ;.    extern int
1d180 20 53 71 6c 69 74 65 74 65 73 74 5f 66 75 6e 63   Sqlitetest_func
1d190 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
1d1a0 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69  *);.    extern i
1d1b0 6e 74 20 53 71 6c 69 74 65 74 65 73 74 5f 68 65  nt Sqlitetest_he
1d1c0 78 69 6f 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74  xio_Init(Tcl_Int
1d1d0 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72  erp*);.    exter
1d1e0 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74  n int Sqlitetest
1d1f0 5f 69 6e 69 74 5f 49 6e 69 74 28 54 63 6c 5f 49  _init_Init(Tcl_I
1d200 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74  nterp*);.    ext
1d210 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65  ern int Sqlitete
1d220 73 74 5f 6d 61 6c 6c 6f 63 5f 49 6e 69 74 28 54  st_malloc_Init(T
1d230 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20  cl_Interp*);.   
1d240 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69   extern int Sqli
1d250 74 65 74 65 73 74 5f 6d 75 74 65 78 5f 49 6e 69  tetest_mutex_Ini
1d260 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a  t(Tcl_Interp*);.
1d270 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53      extern int S
1d280 71 6c 69 74 65 74 65 73 74 73 63 68 65 6d 61 5f  qlitetestschema_
1d290 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a  Init(Tcl_Interp*
1d2a0 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e  );.    extern in
1d2b0 74 20 53 71 6c 69 74 65 74 65 73 74 73 73 65 5f  t Sqlitetestsse_
1d2c0 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a  Init(Tcl_Interp*
1d2d0 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e  );.    extern in
1d2e0 74 20 53 71 6c 69 74 65 74 65 73 74 74 63 6c 76  t Sqlitetesttclv
1d2f0 61 72 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  ar_Init(Tcl_Inte
1d300 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e  rp*);.    extern
1d310 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 54   int SqlitetestT
1d320 68 72 65 61 64 5f 49 6e 69 74 28 54 63 6c 5f 49  hread_Init(Tcl_I
1d330 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74  nterp*);.    ext
1d340 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65  ern int Sqlitete
1d350 73 74 4f 6e 65 66 69 6c 65 5f 49 6e 69 74 28 29  stOnefile_Init()
1d360 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74  ;.    extern int
1d370 20 53 71 6c 69 74 65 74 65 73 74 4f 73 69 6e 73   SqlitetestOsins
1d380 74 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  t_Init(Tcl_Inter
1d390 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20  p*);.    extern 
1d3a0 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 62 61  int Sqlitetestba
1d3b0 63 6b 75 70 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  ckup_Init(Tcl_In
1d3c0 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65  terp*);.    exte
1d3d0 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73  rn int Sqlitetes
1d3e0 74 69 6e 74 61 72 72 61 79 5f 49 6e 69 74 28 54  tintarray_Init(T
1d3f0 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20  cl_Interp*);.   
1d400 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69   extern int Sqli
1d410 74 65 74 65 73 74 76 66 73 5f 49 6e 69 74 28 54  tetestvfs_Init(T
1d420 63 6c 5f 49 6e 74 65 72 70 20 2a 29 3b 0a 20 20  cl_Interp *);.  
1d430 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c    extern int Sql
1d440 69 74 65 74 65 73 74 72 74 72 65 65 5f 49 6e 69  itetestrtree_Ini
1d450 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a  t(Tcl_Interp*);.
1d460 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53      extern int S
1d470 71 6c 69 74 65 71 75 6f 74 61 5f 49 6e 69 74 28  qlitequota_Init(
1d480 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20  Tcl_Interp*);.  
1d490 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c    extern int Sql
1d4a0 69 74 65 6d 75 6c 74 69 70 6c 65 78 5f 49 6e 69  itemultiplex_Ini
1d4b0 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a  t(Tcl_Interp*);.
1d4c0 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53      extern int S
1d4d0 71 6c 69 74 65 53 75 70 65 72 6c 6f 63 6b 5f 49  qliteSuperlock_I
1d4e0 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29  nit(Tcl_Interp*)
1d4f0 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74  ;.    extern int
1d500 20 53 71 6c 69 74 65 74 65 73 74 53 79 73 63 61   SqlitetestSysca
1d510 6c 6c 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  ll_Init(Tcl_Inte
1d520 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e  rp*);.    extern
1d530 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 66   int Sqlitetestf
1d540 75 7a 7a 65 72 5f 49 6e 69 74 28 54 63 6c 5f 49  uzzer_Init(Tcl_I
1d550 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74  nterp*);.    ext
1d560 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65  ern int Sqlitete
1d570 73 74 77 68 6f 6c 65 6e 75 6d 62 65 72 5f 49 6e  stwholenumber_In
1d580 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b  it(Tcl_Interp*);
1d590 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
1d5a0 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45 53 53 49  ITE_ENABLE_SESSI
1d5b0 4f 4e 29 20 26 26 20 64 65 66 69 6e 65 64 28 53  ON) && defined(S
1d5c0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52 45  QLITE_ENABLE_PRE
1d5d0 55 50 44 41 54 45 5f 48 4f 4f 4b 29 0a 20 20 20  UPDATE_HOOK).   
1d5e0 20 65 78 74 65 72 6e 20 69 6e 74 20 54 65 73 74   extern int Test
1d5f0 53 65 73 73 69 6f 6e 5f 49 6e 69 74 28 54 63 6c  Session_Init(Tcl
1d600 5f 49 6e 74 65 72 70 2a 29 3b 0a 23 65 6e 64 69  _Interp*);.#endi
1d610 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  f.#if defined(SQ
1d620 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 33  LITE_ENABLE_FTS3
1d630 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c  ) || defined(SQL
1d640 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 34 29  ITE_ENABLE_FTS4)
1d650 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20  .    extern int 
1d660 53 71 6c 69 74 65 74 65 73 74 66 74 73 33 5f 49  Sqlitetestfts3_I
1d670 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a  nit(Tcl_Interp *
1d680 69 6e 74 65 72 70 29 3b 0a 23 65 6e 64 69 66 0a  interp);.#endif.
1d690 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
1d6a0 4e 41 42 4c 45 5f 5a 49 50 56 46 53 0a 20 20 20  NABLE_ZIPVFS.   
1d6b0 20 65 78 74 65 72 6e 20 69 6e 74 20 5a 69 70 76   extern int Zipv
1d6c0 66 73 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  fs_Init(Tcl_Inte
1d6d0 72 70 2a 29 3b 0a 20 20 20 20 5a 69 70 76 66 73  rp*);.    Zipvfs
1d6e0 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 23  _Init(interp);.#
1d6f0 65 6e 64 69 66 0a 0a 20 20 20 20 53 71 6c 69 74  endif..    Sqlit
1d700 65 63 6f 6e 66 69 67 5f 49 6e 69 74 28 69 6e 74  econfig_Init(int
1d710 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65  erp);.    Sqlite
1d720 74 65 73 74 31 5f 49 6e 69 74 28 69 6e 74 65 72  test1_Init(inter
1d730 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65  p);.    Sqlitete
1d740 73 74 32 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  st2_Init(interp)
1d750 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74  ;.    Sqlitetest
1d760 33 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a  3_Init(interp);.
1d770 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 34 5f      Sqlitetest4_
1d780 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  Init(interp);.  
1d790 20 20 53 71 6c 69 74 65 74 65 73 74 35 5f 49 6e    Sqlitetest5_In
1d7a0 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  it(interp);.    
1d7b0 53 71 6c 69 74 65 74 65 73 74 36 5f 49 6e 69 74  Sqlitetest6_Init
1d7c0 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71  (interp);.    Sq
1d7d0 6c 69 74 65 74 65 73 74 37 5f 49 6e 69 74 28 69  litetest7_Init(i
1d7e0 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69  nterp);.    Sqli
1d7f0 74 65 74 65 73 74 38 5f 49 6e 69 74 28 69 6e 74  tetest8_Init(int
1d800 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65  erp);.    Sqlite
1d810 74 65 73 74 39 5f 49 6e 69 74 28 69 6e 74 65 72  test9_Init(inter
1d820 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65  p);.    Sqlitete
1d830 73 74 61 73 79 6e 63 5f 49 6e 69 74 28 69 6e 74  stasync_Init(int
1d840 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65  erp);.    Sqlite
1d850 74 65 73 74 5f 61 75 74 6f 65 78 74 5f 49 6e 69  test_autoext_Ini
1d860 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53  t(interp);.    S
1d870 71 6c 69 74 65 74 65 73 74 5f 64 65 6d 6f 76 66  qlitetest_demovf
1d880 73 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a  s_Init(interp);.
1d890 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 5f 66      Sqlitetest_f
1d8a0 75 6e 63 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  unc_Init(interp)
1d8b0 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74  ;.    Sqlitetest
1d8c0 5f 68 65 78 69 6f 5f 49 6e 69 74 28 69 6e 74 65  _hexio_Init(inte
1d8d0 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74  rp);.    Sqlitet
1d8e0 65 73 74 5f 69 6e 69 74 5f 49 6e 69 74 28 69 6e  est_init_Init(in
1d8f0 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74  terp);.    Sqlit
1d900 65 74 65 73 74 5f 6d 61 6c 6c 6f 63 5f 49 6e 69  etest_malloc_Ini
1d910 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53  t(interp);.    S
1d920 71 6c 69 74 65 74 65 73 74 5f 6d 75 74 65 78 5f  qlitetest_mutex_
1d930 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  Init(interp);.  
1d940 20 20 53 71 6c 69 74 65 74 65 73 74 73 63 68 65    Sqlitetestsche
1d950 6d 61 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b  ma_Init(interp);
1d960 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 74  .    Sqlitetestt
1d970 63 6c 76 61 72 5f 49 6e 69 74 28 69 6e 74 65 72  clvar_Init(inter
1d980 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65  p);.    Sqlitete
1d990 73 74 54 68 72 65 61 64 5f 49 6e 69 74 28 69 6e  stThread_Init(in
1d9a0 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74  terp);.    Sqlit
1d9b0 65 74 65 73 74 4f 6e 65 66 69 6c 65 5f 49 6e 69  etestOnefile_Ini
1d9c0 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53  t(interp);.    S
1d9d0 71 6c 69 74 65 74 65 73 74 4f 73 69 6e 73 74 5f  qlitetestOsinst_
1d9e0 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  Init(interp);.  
1d9f0 20 20 53 71 6c 69 74 65 74 65 73 74 62 61 63 6b    Sqlitetestback
1da00 75 70 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b  up_Init(interp);
1da10 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 69  .    Sqlitetesti
1da20 6e 74 61 72 72 61 79 5f 49 6e 69 74 28 69 6e 74  ntarray_Init(int
1da30 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65  erp);.    Sqlite
1da40 74 65 73 74 76 66 73 5f 49 6e 69 74 28 69 6e 74  testvfs_Init(int
1da50 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65  erp);.    Sqlite
1da60 74 65 73 74 72 74 72 65 65 5f 49 6e 69 74 28 69  testrtree_Init(i
1da70 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69  nterp);.    Sqli
1da80 74 65 71 75 6f 74 61 5f 49 6e 69 74 28 69 6e 74  tequota_Init(int
1da90 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65  erp);.    Sqlite
1daa0 6d 75 6c 74 69 70 6c 65 78 5f 49 6e 69 74 28 69  multiplex_Init(i
1dab0 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69  nterp);.    Sqli
1dac0 74 65 53 75 70 65 72 6c 6f 63 6b 5f 49 6e 69 74  teSuperlock_Init
1dad0 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71  (interp);.    Sq
1dae0 6c 69 74 65 74 65 73 74 53 79 73 63 61 6c 6c 5f  litetestSyscall_
1daf0 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  Init(interp);.  
1db00 20 20 53 71 6c 69 74 65 74 65 73 74 66 75 7a 7a    Sqlitetestfuzz
1db10 65 72 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b  er_Init(interp);
1db20 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 77  .    Sqlitetestw
1db30 68 6f 6c 65 6e 75 6d 62 65 72 5f 49 6e 69 74 28  holenumber_Init(
1db40 69 6e 74 65 72 70 29 3b 0a 23 69 66 20 64 65 66  interp);.#if def
1db50 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
1db60 4c 45 5f 53 45 53 53 49 4f 4e 29 20 26 26 20 64  LE_SESSION) && d
1db70 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
1db80 41 42 4c 45 5f 50 52 45 55 50 44 41 54 45 5f 48  ABLE_PREUPDATE_H
1db90 4f 4f 4b 29 0a 20 20 20 20 54 65 73 74 53 65 73  OOK).    TestSes
1dba0 73 69 6f 6e 5f 49 6e 69 74 28 69 6e 74 65 72 70  sion_Init(interp
1dbb0 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65  );.#endif.#if de
1dbc0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
1dbd0 42 4c 45 5f 46 54 53 33 29 20 7c 7c 20 64 65 66  BLE_FTS3) || def
1dbe0 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
1dbf0 4c 45 5f 46 54 53 34 29 0a 20 20 20 20 53 71 6c  LE_FTS4).    Sql
1dc00 69 74 65 74 65 73 74 66 74 73 33 5f 49 6e 69 74  itetestfts3_Init
1dc10 28 69 6e 74 65 72 70 29 3b 0a 23 65 6e 64 69 66  (interp);.#endif
1dc20 0a 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65  ..    Tcl_Create
1dc30 4f 62 6a 43 6f 6d 6d 61 6e 64 28 0a 20 20 20 20  ObjCommand(.    
1dc40 20 20 20 20 69 6e 74 65 72 70 2c 20 22 6c 6f 61      interp, "loa
1dc50 64 5f 74 65 73 74 66 69 78 74 75 72 65 5f 65 78  d_testfixture_ex
1dc60 74 65 6e 73 69 6f 6e 73 22 2c 20 69 6e 69 74 5f  tensions", init_
1dc70 61 6c 6c 5f 63 6d 64 2c 20 30 2c 20 30 0a 20 20  all_cmd, 0, 0.  
1dc80 20 20 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65    );.    Tcl_Cre
1dc90 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 0a 20  ateObjCommand(. 
1dca0 20 20 20 20 20 20 20 69 6e 74 65 72 70 2c 20 22         interp, "
1dcb0 64 62 5f 75 73 65 5f 6c 65 67 61 63 79 5f 70 72  db_use_legacy_pr
1dcc0 65 70 61 72 65 22 2c 20 64 62 5f 75 73 65 5f 6c  epare", db_use_l
1dcd0 65 67 61 63 79 5f 70 72 65 70 61 72 65 5f 63 6d  egacy_prepare_cm
1dce0 64 2c 20 30 2c 20 30 0a 20 20 20 20 29 3b 0a 0a  d, 0, 0.    );..
1dcf0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53 53  #ifdef SQLITE_SS
1dd00 45 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74  E.    Sqlitetest
1dd10 73 73 65 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  sse_Init(interp)
1dd20 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23 65 6e  ;.#endif.  }.#en
1dd30 64 69 66 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 54  dif.}..#define T
1dd40 43 4c 53 48 5f 4d 41 49 4e 20 6d 61 69 6e 20 20  CLSH_MAIN main  
1dd50 20 2f 2a 20 4e 65 65 64 65 64 20 74 6f 20 66 61   /* Needed to fa
1dd60 6b 65 20 6f 75 74 20 6d 6b 74 63 6c 61 70 70 20  ke out mktclapp 
1dd70 2a 2f 0a 69 6e 74 20 54 43 4c 53 48 5f 4d 41 49  */.int TCLSH_MAI
1dd80 4e 28 69 6e 74 20 61 72 67 63 2c 20 63 68 61 72  N(int argc, char
1dd90 20 2a 2a 61 72 67 76 29 7b 0a 20 20 54 63 6c 5f   **argv){.  Tcl_
1dda0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 3b 0a  Interp *interp;.
1ddb0 20 20 0a 20 20 2f 2a 20 43 61 6c 6c 20 73 71 6c    .  /* Call sql
1ddc0 69 74 65 33 5f 73 68 75 74 64 6f 77 6e 28 29 20  ite3_shutdown() 
1ddd0 6f 6e 63 65 20 62 65 66 6f 72 65 20 64 6f 69 6e  once before doin
1dde0 67 20 61 6e 79 74 68 69 6e 67 20 65 6c 73 65 2e  g anything else.
1ddf0 20 54 68 69 73 20 69 73 20 74 6f 0a 20 20 2a 2a   This is to.  **
1de00 20 74 65 73 74 20 74 68 61 74 20 73 71 6c 69 74   test that sqlit
1de10 65 33 5f 73 68 75 74 64 6f 77 6e 28 29 20 63 61  e3_shutdown() ca
1de20 6e 20 62 65 20 73 61 66 65 6c 79 20 63 61 6c 6c  n be safely call
1de30 65 64 20 62 79 20 61 20 70 72 6f 63 65 73 73 20  ed by a process 
1de40 62 65 66 6f 72 65 0a 20 20 2a 2a 20 73 71 6c 69  before.  ** sqli
1de50 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29  te3_initialize()
1de60 20 69 73 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65   is. */.  sqlite
1de70 33 5f 73 68 75 74 64 6f 77 6e 28 29 3b 0a 0a 20  3_shutdown();.. 
1de80 20 54 63 6c 5f 46 69 6e 64 45 78 65 63 75 74 61   Tcl_FindExecuta
1de90 62 6c 65 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20  ble(argv[0]);.  
1dea0 69 6e 74 65 72 70 20 3d 20 54 63 6c 5f 43 72 65  interp = Tcl_Cre
1deb0 61 74 65 49 6e 74 65 72 70 28 29 3b 0a 0a 23 69  ateInterp();..#i
1dec0 66 20 54 43 4c 53 48 3d 3d 32 0a 20 20 73 71 6c  f TCLSH==2.  sql
1ded0 69 74 65 33 5f 63 6f 6e 66 69 67 28 53 51 4c 49  ite3_config(SQLI
1dee0 54 45 5f 43 4f 4e 46 49 47 5f 53 49 4e 47 4c 45  TE_CONFIG_SINGLE
1def0 54 48 52 45 41 44 29 3b 0a 23 65 6e 64 69 66 0a  THREAD);.#endif.
1df00 0a 20 20 69 6e 69 74 5f 61 6c 6c 28 69 6e 74 65  .  init_all(inte
1df10 72 70 29 3b 0a 20 20 69 66 28 20 61 72 67 63 3e  rp);.  if( argc>
1df20 3d 32 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  =2 ){.    int i;
1df30 0a 20 20 20 20 63 68 61 72 20 7a 41 72 67 63 5b  .    char zArgc[
1df40 33 32 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  32];.    sqlite3
1df50 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
1df60 28 7a 41 72 67 63 29 2c 20 7a 41 72 67 63 2c 20  (zArgc), zArgc, 
1df70 22 25 64 22 2c 20 61 72 67 63 2d 28 33 2d 54 43  "%d", argc-(3-TC
1df80 4c 53 48 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53  LSH));.    Tcl_S
1df90 65 74 56 61 72 28 69 6e 74 65 72 70 2c 22 61 72  etVar(interp,"ar
1dfa0 67 63 22 2c 20 7a 41 72 67 63 2c 20 54 43 4c 5f  gc", zArgc, TCL_
1dfb0 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 20 20  GLOBAL_ONLY);.  
1dfc0 20 20 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74    Tcl_SetVar(int
1dfd0 65 72 70 2c 22 61 72 67 76 30 22 2c 61 72 67 76  erp,"argv0",argv
1dfe0 5b 31 5d 2c 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f  [1],TCL_GLOBAL_O
1dff0 4e 4c 59 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65  NLY);.    Tcl_Se
1e000 74 56 61 72 28 69 6e 74 65 72 70 2c 22 61 72 67  tVar(interp,"arg
1e010 76 22 2c 20 22 22 2c 20 54 43 4c 5f 47 4c 4f 42  v", "", TCL_GLOB
1e020 41 4c 5f 4f 4e 4c 59 29 3b 0a 20 20 20 20 66 6f  AL_ONLY);.    fo
1e030 72 28 69 3d 33 2d 54 43 4c 53 48 3b 20 69 3c 61  r(i=3-TCLSH; i<a
1e040 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  rgc; i++){.     
1e050 20 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65   Tcl_SetVar(inte
1e060 72 70 2c 20 22 61 72 67 76 22 2c 20 61 72 67 76  rp, "argv", argv
1e070 5b 69 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 54  [i],.          T
1e080 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 20 7c  CL_GLOBAL_ONLY |
1e090 20 54 43 4c 5f 4c 49 53 54 5f 45 4c 45 4d 45 4e   TCL_LIST_ELEMEN
1e0a0 54 20 7c 20 54 43 4c 5f 41 50 50 45 4e 44 5f 56  T | TCL_APPEND_V
1e0b0 41 4c 55 45 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ALUE);.    }.   
1e0c0 20 69 66 28 20 54 43 4c 53 48 3d 3d 31 20 26 26   if( TCLSH==1 &&
1e0d0 20 54 63 6c 5f 45 76 61 6c 46 69 6c 65 28 69 6e   Tcl_EvalFile(in
1e0e0 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 29 21 3d  terp, argv[1])!=
1e0f0 54 43 4c 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  TCL_OK ){.      
1e100 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e 66  const char *zInf
1e110 6f 20 3d 20 54 63 6c 5f 47 65 74 56 61 72 28 69  o = Tcl_GetVar(i
1e120 6e 74 65 72 70 2c 20 22 65 72 72 6f 72 49 6e 66  nterp, "errorInf
1e130 6f 22 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f  o", TCL_GLOBAL_O
1e140 4e 4c 59 29 3b 0a 20 20 20 20 20 20 69 66 28 20  NLY);.      if( 
1e150 7a 49 6e 66 6f 3d 3d 30 20 29 20 7a 49 6e 66 6f  zInfo==0 ) zInfo
1e160 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
1e170 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a  Result(interp);.
1e180 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74        fprintf(st
1e190 64 65 72 72 2c 22 25 73 3a 20 25 73 5c 6e 22 2c  derr,"%s: %s\n",
1e1a0 20 2a 61 72 67 76 2c 20 7a 49 6e 66 6f 29 3b 0a   *argv, zInfo);.
1e1b0 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
1e1c0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
1e1d0 54 43 4c 53 48 3d 3d 32 20 7c 7c 20 61 72 67 63  TCLSH==2 || argc
1e1e0 3c 3d 31 20 29 7b 0a 20 20 20 20 54 63 6c 5f 47  <=1 ){.    Tcl_G
1e1f0 6c 6f 62 61 6c 45 76 61 6c 28 69 6e 74 65 72 70  lobalEval(interp
1e200 2c 20 74 63 6c 73 68 5f 6d 61 69 6e 5f 6c 6f 6f  , tclsh_main_loo
1e210 70 28 29 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  p());.  }.  retu
1e220 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  rn 0;.}.#endif /
1e230 2a 20 54 43 4c 53 48 20 2a 2f 0a                 * TCLSH */.