/ Hex Artifact Content
Login

Artifact 97a7cb53646107433f463592ed785f6e177b93b5:


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 20 55 73 65 64  type.h>../* Used
0580: 20 74 6f 20 67 65 74 20 74 68 65 20 63 75 72 72   to get the curr
0590: 65 6e 74 20 70 72 6f 63 65 73 73 20 49 44 20 2a  ent process ID *
05a0: 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 5f  /.#if !defined(_
05b0: 57 49 4e 33 32 29 0a 23 20 69 6e 63 6c 75 64 65  WIN32).# include
05c0: 20 3c 75 6e 69 73 74 64 2e 68 3e 0a 23 20 64 65   <unistd.h>.# de
05d0: 66 69 6e 65 20 47 45 54 50 49 44 20 67 65 74 70  fine GETPID getp
05e0: 69 64 0a 23 65 6c 69 66 20 21 64 65 66 69 6e 65  id.#elif !define
05f0: 64 28 5f 57 49 4e 33 32 5f 57 43 45 29 0a 23 20  d(_WIN32_WCE).# 
0600: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 41 4d  ifndef SQLITE_AM
0610: 41 4c 47 41 4d 41 54 49 4f 4e 0a 23 20 20 64 65  ALGAMATION.#  de
0620: 66 69 6e 65 20 57 49 4e 33 32 5f 4c 45 41 4e 5f  fine WIN32_LEAN_
0630: 41 4e 44 5f 4d 45 41 4e 0a 23 20 20 69 6e 63 6c  AND_MEAN.#  incl
0640: 75 64 65 20 3c 77 69 6e 64 6f 77 73 2e 68 3e 0a  ude <windows.h>.
0650: 23 20 65 6e 64 69 66 0a 23 20 64 65 66 69 6e 65  # endif.# define
0660: 20 47 45 54 50 49 44 20 28 69 6e 74 29 47 65 74   GETPID (int)Get
0670: 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64  CurrentProcessId
0680: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 57  .#endif../*. * W
0690: 69 6e 64 6f 77 73 20 6e 65 65 64 73 20 74 6f 20  indows needs to 
06a0: 6b 6e 6f 77 20 77 68 69 63 68 20 73 79 6d 62 6f  know which symbo
06b0: 6c 73 20 74 6f 20 65 78 70 6f 72 74 2e 20 20 55  ls to export.  U
06c0: 6e 69 78 20 64 6f 65 73 20 6e 6f 74 2e 0a 20 2a  nix does not.. *
06d0: 20 42 55 49 4c 44 5f 73 71 6c 69 74 65 20 73 68   BUILD_sqlite sh
06e0: 6f 75 6c 64 20 62 65 20 75 6e 64 65 66 69 6e 65  ould be undefine
06f0: 64 20 66 6f 72 20 55 6e 69 78 2e 0a 20 2a 2f 0a  d for Unix.. */.
0700: 23 69 66 64 65 66 20 42 55 49 4c 44 5f 73 71 6c  #ifdef BUILD_sql
0710: 69 74 65 0a 23 75 6e 64 65 66 20 54 43 4c 5f 53  ite.#undef TCL_S
0720: 54 4f 52 41 47 45 5f 43 4c 41 53 53 0a 23 64 65  TORAGE_CLASS.#de
0730: 66 69 6e 65 20 54 43 4c 5f 53 54 4f 52 41 47 45  fine TCL_STORAGE
0740: 5f 43 4c 41 53 53 20 44 4c 4c 45 58 50 4f 52 54  _CLASS DLLEXPORT
0750: 0a 23 65 6e 64 69 66 20 2f 2a 20 42 55 49 4c 44  .#endif /* BUILD
0760: 5f 73 71 6c 69 74 65 20 2a 2f 0a 0a 23 64 65 66  _sqlite */..#def
0770: 69 6e 65 20 4e 55 4d 5f 50 52 45 50 41 52 45 44  ine NUM_PREPARED
0780: 5f 53 54 4d 54 53 20 31 30 0a 23 64 65 66 69 6e  _STMTS 10.#defin
0790: 65 20 4d 41 58 5f 50 52 45 50 41 52 45 44 5f 53  e MAX_PREPARED_S
07a0: 54 4d 54 53 20 31 30 30 0a 0a 2f 2a 20 46 6f 72  TMTS 100../* For
07b0: 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e  ward declaration
07c0: 20 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75   */.typedef stru
07d0: 63 74 20 53 71 6c 69 74 65 44 62 20 53 71 6c 69  ct SqliteDb Sqli
07e0: 74 65 44 62 3b 0a 0a 2f 2a 0a 2a 2a 20 4e 65 77  teDb;../*.** New
07f0: 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 73 20 63   SQL functions c
0800: 61 6e 20 62 65 20 63 72 65 61 74 65 64 20 61 73  an be created as
0810: 20 54 43 4c 20 73 63 72 69 70 74 73 2e 20 20 45   TCL scripts.  E
0820: 61 63 68 20 73 75 63 68 20 66 75 6e 63 74 69 6f  ach such functio
0830: 6e 0a 2a 2a 20 69 73 20 64 65 73 63 72 69 62 65  n.** is describe
0840: 64 20 62 79 20 61 6e 20 69 6e 73 74 61 6e 63 65  d by an instance
0850: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
0860: 67 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a  g structure..*/.
0870: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 53  typedef struct S
0880: 71 6c 46 75 6e 63 20 53 71 6c 46 75 6e 63 3b 0a  qlFunc SqlFunc;.
0890: 73 74 72 75 63 74 20 53 71 6c 46 75 6e 63 20 7b  struct SqlFunc {
08a0: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
08b0: 6e 74 65 72 70 3b 20 20 20 2f 2a 20 54 68 65 20  nterp;   /* The 
08c0: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 20 74 6f  TCL interpret to
08d0: 20 65 78 65 63 75 74 65 20 74 68 65 20 66 75 6e   execute the fun
08e0: 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 4f  ction */.  Tcl_O
08f0: 62 6a 20 2a 70 53 63 72 69 70 74 3b 20 20 20 20  bj *pScript;    
0900: 20 2f 2a 20 54 68 65 20 54 63 6c 5f 4f 62 6a 20   /* The Tcl_Obj 
0910: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f  representation o
0920: 66 20 74 68 65 20 73 63 72 69 70 74 20 2a 2f 0a  f the script */.
0930: 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 3b    SqliteDb *pDb;
0940: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
0950: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74  ase connection t
0960: 68 61 74 20 6f 77 6e 73 20 74 68 69 73 20 66 75  hat owns this fu
0970: 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  nction */.  int 
0980: 75 73 65 45 76 61 6c 4f 62 6a 76 3b 20 20 20 20  useEvalObjv;    
0990: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 69 74 20    /* True if it 
09a0: 69 73 20 73 61 66 65 20 74 6f 20 75 73 65 20 54  is safe to use T
09b0: 63 6c 5f 45 76 61 6c 4f 62 6a 76 20 2a 2f 0a 20  cl_EvalObjv */. 
09c0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20   char *zName;   
09d0: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
09e0: 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  f this function 
09f0: 2a 2f 0a 20 20 53 71 6c 46 75 6e 63 20 2a 70 4e  */.  SqlFunc *pN
0a00: 65 78 74 3b 20 20 20 20 20 20 20 2f 2a 20 4e 65  ext;       /* Ne
0a10: 78 74 20 66 75 6e 63 74 69 6f 6e 20 6f 6e 20 74  xt function on t
0a20: 68 65 20 6c 69 73 74 20 6f 66 20 74 68 65 6d 20  he list of them 
0a30: 61 6c 6c 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  all */.};../*.**
0a40: 20 4e 65 77 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   New collation s
0a50: 65 71 75 65 6e 63 65 73 20 66 75 6e 63 74 69 6f  equences functio
0a60: 6e 20 63 61 6e 20 62 65 20 63 72 65 61 74 65 64  n can be created
0a70: 20 61 73 20 54 43 4c 20 73 63 72 69 70 74 73 2e   as TCL scripts.
0a80: 20 20 45 61 63 68 20 73 75 63 68 0a 2a 2a 20 66    Each such.** f
0a90: 75 6e 63 74 69 6f 6e 20 69 73 20 64 65 73 63 72  unction is descr
0aa0: 69 62 65 64 20 62 79 20 61 6e 20 69 6e 73 74 61  ibed by an insta
0ab0: 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
0ac0: 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 0a  wing structure..
0ad0: 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
0ae0: 74 20 53 71 6c 43 6f 6c 6c 61 74 65 20 53 71 6c  t SqlCollate Sql
0af0: 43 6f 6c 6c 61 74 65 3b 0a 73 74 72 75 63 74 20  Collate;.struct 
0b00: 53 71 6c 43 6f 6c 6c 61 74 65 20 7b 0a 20 20 54  SqlCollate {.  T
0b10: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
0b20: 70 3b 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  p;   /* The TCL 
0b30: 69 6e 74 65 72 70 72 65 74 20 74 6f 20 65 78 65  interpret to exe
0b40: 63 75 74 65 20 74 68 65 20 66 75 6e 63 74 69 6f  cute the functio
0b50: 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 53 63  n */.  char *zSc
0b60: 72 69 70 74 3b 20 20 20 20 20 20 20 20 2f 2a 20  ript;        /* 
0b70: 54 68 65 20 73 63 72 69 70 74 20 74 6f 20 62 65  The script to be
0b80: 20 72 75 6e 20 2a 2f 0a 20 20 53 71 6c 43 6f 6c   run */.  SqlCol
0b90: 6c 61 74 65 20 2a 70 4e 65 78 74 3b 20 20 20 20  late *pNext;    
0ba0: 2f 2a 20 4e 65 78 74 20 66 75 6e 63 74 69 6f 6e  /* Next function
0bb0: 20 6f 6e 20 74 68 65 20 6c 69 73 74 20 6f 66 20   on the list of 
0bc0: 74 68 65 6d 20 61 6c 6c 20 2a 2f 0a 7d 3b 0a 0a  them all */.};..
0bd0: 2f 2a 0a 2a 2a 20 50 72 65 70 61 72 65 64 20 73  /*.** Prepared s
0be0: 74 61 74 65 6d 65 6e 74 73 20 61 72 65 20 63 61  tatements are ca
0bf0: 63 68 65 64 20 66 6f 72 20 66 61 73 74 65 72 20  ched for faster 
0c00: 65 78 65 63 75 74 69 6f 6e 2e 20 20 45 61 63 68  execution.  Each
0c10: 20 70 72 65 70 61 72 65 64 0a 2a 2a 20 73 74 61   prepared.** sta
0c20: 74 65 6d 65 6e 74 20 69 73 20 64 65 73 63 72 69  tement is descri
0c30: 62 65 64 20 62 79 20 61 6e 20 69 6e 73 74 61 6e  bed by an instan
0c40: 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ce of the follow
0c50: 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  ing structure..*
0c60: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
0c70: 20 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74   SqlPreparedStmt
0c80: 20 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74   SqlPreparedStmt
0c90: 3b 0a 73 74 72 75 63 74 20 53 71 6c 50 72 65 70  ;.struct SqlPrep
0ca0: 61 72 65 64 53 74 6d 74 20 7b 0a 20 20 53 71 6c  aredStmt {.  Sql
0cb0: 50 72 65 70 61 72 65 64 53 74 6d 74 20 2a 70 4e  PreparedStmt *pN
0cc0: 65 78 74 3b 20 20 2f 2a 20 4e 65 78 74 20 69 6e  ext;  /* Next in
0cd0: 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 2a 2f 0a   linked list */.
0ce0: 20 20 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d    SqlPreparedStm
0cf0: 74 20 2a 70 50 72 65 76 3b 20 20 2f 2a 20 50 72  t *pPrev;  /* Pr
0d00: 65 76 69 6f 75 73 20 6f 6e 20 74 68 65 20 6c 69  evious on the li
0d10: 73 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  st */.  sqlite3_
0d20: 73 74 6d 74 20 2a 70 53 74 6d 74 3b 20 20 20 20  stmt *pStmt;    
0d30: 20 2f 2a 20 54 68 65 20 70 72 65 70 61 72 65 64   /* The prepared
0d40: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
0d50: 69 6e 74 20 6e 53 71 6c 3b 20 20 20 20 20 20 20  int nSql;       
0d60: 20 20 20 20 20 20 20 20 20 2f 2a 20 63 68 61 72           /* char
0d70: 73 20 69 6e 20 7a 53 71 6c 5b 5d 20 2a 2f 0a 20  s in zSql[] */. 
0d80: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71   const char *zSq
0d90: 6c 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78  l;        /* Tex
0da0: 74 20 6f 66 20 74 68 65 20 53 51 4c 20 73 74 61  t of the SQL sta
0db0: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  tement */.  int 
0dc0: 6e 50 61 72 6d 3b 20 20 20 20 20 20 20 20 20 20  nParm;          
0dd0: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
0de0: 61 70 50 61 72 6d 20 61 72 72 61 79 20 2a 2f 0a  apParm array */.
0df0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 61 70 50 61    Tcl_Obj **apPa
0e00: 72 6d 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 72  rm;        /* Ar
0e10: 72 61 79 20 6f 66 20 72 65 66 65 72 65 6e 63 65  ray of reference
0e20: 64 20 6f 62 6a 65 63 74 20 70 6f 69 6e 74 65 72  d object pointer
0e30: 73 20 2a 2f 0a 7d 3b 0a 0a 74 79 70 65 64 65 66  s */.};..typedef
0e40: 20 73 74 72 75 63 74 20 49 6e 63 72 62 6c 6f 62   struct Incrblob
0e50: 43 68 61 6e 6e 65 6c 20 49 6e 63 72 62 6c 6f 62  Channel Incrblob
0e60: 43 68 61 6e 6e 65 6c 3b 0a 0a 2f 2a 0a 2a 2a 20  Channel;../*.** 
0e70: 54 68 65 72 65 20 69 73 20 6f 6e 65 20 69 6e 73  There is one ins
0e80: 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 73 74  tance of this st
0e90: 72 75 63 74 75 72 65 20 66 6f 72 20 65 61 63 68  ructure for each
0ea0: 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73 65   SQLite database
0eb0: 0a 2a 2a 20 74 68 61 74 20 68 61 73 20 62 65 65  .** that has bee
0ec0: 6e 20 6f 70 65 6e 65 64 20 62 79 20 74 68 65 20  n opened by the 
0ed0: 53 51 4c 69 74 65 20 54 43 4c 20 69 6e 74 65 72  SQLite TCL inter
0ee0: 66 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  face..**.** If t
0ef0: 68 69 73 20 6d 6f 64 75 6c 65 20 69 73 20 62 75  his module is bu
0f00: 69 6c 74 20 77 69 74 68 20 53 51 4c 49 54 45 5f  ilt with SQLITE_
0f10: 54 45 53 54 20 64 65 66 69 6e 65 64 20 28 74 6f  TEST defined (to
0f20: 20 63 72 65 61 74 65 20 74 68 65 20 53 51 4c 69   create the SQLi
0f30: 74 65 0a 2a 2a 20 74 65 73 74 66 69 78 74 75 72  te.** testfixtur
0f40: 65 20 65 78 65 63 75 74 61 62 6c 65 29 2c 20 74  e executable), t
0f50: 68 65 6e 20 69 74 20 6d 61 79 20 62 65 20 63 6f  hen it may be co
0f60: 6e 66 69 67 75 72 65 64 20 74 6f 20 75 73 65 20  nfigured to use 
0f70: 65 69 74 68 65 72 0a 2a 2a 20 73 71 6c 69 74 65  either.** sqlite
0f80: 33 5f 70 72 65 70 61 72 65 5f 76 32 28 29 20 6f  3_prepare_v2() o
0f90: 72 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  r sqlite3_prepar
0fa0: 65 28 29 20 74 6f 20 70 72 65 70 61 72 65 20 53  e() to prepare S
0fb0: 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a  QL statements..*
0fc0: 2a 20 49 66 20 53 71 6c 69 74 65 44 62 2e 62 4c  * If SqliteDb.bL
0fd0: 65 67 61 63 79 50 72 65 70 61 72 65 20 69 73 20  egacyPrepare is 
0fe0: 74 72 75 65 2c 20 73 71 6c 69 74 65 33 5f 70 72  true, sqlite3_pr
0ff0: 65 70 61 72 65 28 29 20 69 73 20 75 73 65 64 2e  epare() is used.
1000: 0a 2a 2f 0a 73 74 72 75 63 74 20 53 71 6c 69 74  .*/.struct Sqlit
1010: 65 44 62 20 7b 0a 20 20 73 71 6c 69 74 65 33 20  eDb {.  sqlite3 
1020: 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  *db;            
1030: 20 20 20 2f 2a 20 54 68 65 20 22 72 65 61 6c 22     /* The "real"
1040: 20 64 61 74 61 62 61 73 65 20 73 74 72 75 63 74   database struct
1050: 75 72 65 2e 20 4d 55 53 54 20 42 45 20 46 49 52  ure. MUST BE FIR
1060: 53 54 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65  ST */.  Tcl_Inte
1070: 72 70 20 2a 69 6e 74 65 72 70 3b 20 20 20 20 20  rp *interp;     
1080: 20 20 20 2f 2a 20 54 68 65 20 69 6e 74 65 72 70     /* The interp
1090: 72 65 74 65 72 20 75 73 65 64 20 66 6f 72 20 74  reter used for t
10a0: 68 69 73 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  his database */.
10b0: 20 20 63 68 61 72 20 2a 7a 42 75 73 79 3b 20 20    char *zBusy;  
10c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10d0: 54 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63  The busy callbac
10e0: 6b 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 63  k routine */.  c
10f0: 68 61 72 20 2a 7a 43 6f 6d 6d 69 74 3b 20 20 20  har *zCommit;   
1100: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1110: 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20 63 61 6c   commit hook cal
1120: 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 20 2a 2f  lback routine */
1130: 0a 20 20 63 68 61 72 20 2a 7a 54 72 61 63 65 3b  .  char *zTrace;
1140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1150: 20 54 68 65 20 74 72 61 63 65 20 63 61 6c 6c 62   The trace callb
1160: 61 63 6b 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 20  ack routine */. 
1170: 20 63 68 61 72 20 2a 7a 50 72 6f 66 69 6c 65 3b   char *zProfile;
1180: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1190: 68 65 20 70 72 6f 66 69 6c 65 20 63 61 6c 6c 62  he profile callb
11a0: 61 63 6b 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 20  ack routine */. 
11b0: 20 63 68 61 72 20 2a 7a 50 72 6f 67 72 65 73 73   char *zProgress
11c0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ;           /* T
11d0: 68 65 20 70 72 6f 67 72 65 73 73 20 63 61 6c 6c  he progress call
11e0: 62 61 63 6b 20 72 6f 75 74 69 6e 65 20 2a 2f 0a  back routine */.
11f0: 20 20 63 68 61 72 20 2a 7a 41 75 74 68 3b 20 20    char *zAuth;  
1200: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1210: 54 68 65 20 61 75 74 68 6f 72 69 7a 61 74 69 6f  The authorizatio
1220: 6e 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69  n callback routi
1230: 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 64 69 73 61  ne */.  int disa
1240: 62 6c 65 41 75 74 68 3b 20 20 20 20 20 20 20 20  bleAuth;        
1250: 20 20 20 2f 2a 20 44 69 73 61 62 6c 65 20 74 68     /* Disable th
1260: 65 20 61 75 74 68 6f 72 69 7a 65 72 20 69 66 20  e authorizer if 
1270: 69 74 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 63  it exists */.  c
1280: 68 61 72 20 2a 7a 4e 75 6c 6c 3b 20 20 20 20 20  har *zNull;     
1290: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78            /* Tex
12a0: 74 20 74 6f 20 73 75 62 73 74 69 74 75 74 65 20  t to substitute 
12b0: 66 6f 72 20 61 6e 20 53 51 4c 20 4e 55 4c 4c 20  for an SQL NULL 
12c0: 76 61 6c 75 65 20 2a 2f 0a 20 20 53 71 6c 46 75  value */.  SqlFu
12d0: 6e 63 20 2a 70 46 75 6e 63 3b 20 20 20 20 20 20  nc *pFunc;      
12e0: 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
12f0: 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 73 20 2a   SQL functions *
1300: 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 55 70  /.  Tcl_Obj *pUp
1310: 64 61 74 65 48 6f 6f 6b 3b 20 20 20 20 20 20 2f  dateHook;      /
1320: 2a 20 55 70 64 61 74 65 20 68 6f 6f 6b 20 73 63  * Update hook sc
1330: 72 69 70 74 20 28 69 66 20 61 6e 79 29 20 2a 2f  ript (if any) */
1340: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 50 72 65  .  Tcl_Obj *pPre
1350: 55 70 64 61 74 65 48 6f 6f 6b 3b 20 20 20 2f 2a  UpdateHook;   /*
1360: 20 50 72 65 2d 75 70 64 61 74 65 20 68 6f 6f 6b   Pre-update hook
1370: 20 73 63 72 69 70 74 20 28 69 66 20 61 6e 79 29   script (if any)
1380: 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70   */.  Tcl_Obj *p
1390: 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 3b 20 20 20  RollbackHook;   
13a0: 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20 68 6f 6f   /* Rollback hoo
13b0: 6b 20 73 63 72 69 70 74 20 28 69 66 20 61 6e 79  k script (if any
13c0: 29 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  ) */.  Tcl_Obj *
13d0: 70 57 61 6c 48 6f 6f 6b 3b 20 20 20 20 20 20 20  pWalHook;       
13e0: 20 20 2f 2a 20 57 41 4c 20 68 6f 6f 6b 20 73 63    /* WAL hook sc
13f0: 72 69 70 74 20 28 69 66 20 61 6e 79 29 20 2a 2f  ript (if any) */
1400: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 55 6e 6c  .  Tcl_Obj *pUnl
1410: 6f 63 6b 4e 6f 74 69 66 79 3b 20 20 20 20 2f 2a  ockNotify;    /*
1420: 20 55 6e 6c 6f 63 6b 20 6e 6f 74 69 66 79 20 73   Unlock notify s
1430: 63 72 69 70 74 20 28 69 66 20 61 6e 79 29 20 2a  cript (if any) *
1440: 2f 0a 20 20 53 71 6c 43 6f 6c 6c 61 74 65 20 2a  /.  SqlCollate *
1450: 70 43 6f 6c 6c 61 74 65 3b 20 20 20 20 20 20 2f  pCollate;      /
1460: 2a 20 4c 69 73 74 20 6f 66 20 53 51 4c 20 63 6f  * List of SQL co
1470: 6c 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e  llation function
1480: 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  s */.  int rc;  
1490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a0: 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
14b0: 20 6f 66 20 6d 6f 73 74 20 72 65 63 65 6e 74 20   of most recent 
14c0: 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29 20 2a  sqlite3_exec() *
14d0: 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 43 6f  /.  Tcl_Obj *pCo
14e0: 6c 6c 61 74 65 4e 65 65 64 65 64 3b 20 20 20 2f  llateNeeded;   /
14f0: 2a 20 43 6f 6c 6c 61 74 69 6f 6e 20 6e 65 65 64  * Collation need
1500: 65 64 20 73 63 72 69 70 74 20 2a 2f 0a 20 20 53  ed script */.  S
1510: 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74 20 2a  qlPreparedStmt *
1520: 73 74 6d 74 4c 69 73 74 3b 20 2f 2a 20 4c 69 73  stmtList; /* Lis
1530: 74 20 6f 66 20 70 72 65 70 61 72 65 64 20 73 74  t of prepared st
1540: 61 74 65 6d 65 6e 74 73 2a 2f 0a 20 20 53 71 6c  atements*/.  Sql
1550: 50 72 65 70 61 72 65 64 53 74 6d 74 20 2a 73 74  PreparedStmt *st
1560: 6d 74 4c 61 73 74 3b 20 2f 2a 20 4c 61 73 74 20  mtLast; /* Last 
1570: 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 74 68 65  statement in the
1580: 20 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6d   list */.  int m
1590: 61 78 53 74 6d 74 3b 20 20 20 20 20 20 20 20 20  axStmt;         
15a0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 78        /* The nex
15b0: 74 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  t maximum number
15c0: 20 6f 66 20 73 74 6d 74 4c 69 73 74 20 2a 2f 0a   of stmtList */.
15d0: 20 20 69 6e 74 20 6e 53 74 6d 74 3b 20 20 20 20    int nStmt;    
15e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15f0: 4e 75 6d 62 65 72 20 6f 66 20 73 74 61 74 65 6d  Number of statem
1600: 65 6e 74 73 20 69 6e 20 73 74 6d 74 4c 69 73 74  ents in stmtList
1610: 20 2a 2f 0a 20 20 49 6e 63 72 62 6c 6f 62 43 68   */.  IncrblobCh
1620: 61 6e 6e 65 6c 20 2a 70 49 6e 63 72 62 6c 6f 62  annel *pIncrblob
1630: 3b 2f 2a 20 4c 69 6e 6b 65 64 20 6c 69 73 74 20  ;/* Linked list 
1640: 6f 66 20 6f 70 65 6e 20 69 6e 63 72 62 6c 6f 62  of open incrblob
1650: 20 63 68 61 6e 6e 65 6c 73 20 2a 2f 0a 20 20 69   channels */.  i
1660: 6e 74 20 6e 53 74 65 70 2c 20 6e 53 6f 72 74 2c  nt nStep, nSort,
1670: 20 6e 49 6e 64 65 78 3b 20 20 2f 2a 20 53 74 61   nIndex;  /* Sta
1680: 74 69 73 74 69 63 73 20 66 6f 72 20 6d 6f 73 74  tistics for most
1690: 20 72 65 63 65 6e 74 20 6f 70 65 72 61 74 69 6f   recent operatio
16a0: 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 72 61 6e  n */.  int nTran
16b0: 73 61 63 74 69 6f 6e 3b 20 20 20 20 20 20 20 20  saction;        
16c0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6e    /* Number of n
16d0: 65 73 74 65 64 20 5b 74 72 61 6e 73 61 63 74 69  ested [transacti
16e0: 6f 6e 5d 20 6d 65 74 68 6f 64 73 20 2a 2f 0a 23  on] methods */.#
16f0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
1700: 54 0a 20 20 69 6e 74 20 62 4c 65 67 61 63 79 50  T.  int bLegacyP
1710: 72 65 70 61 72 65 3b 20 20 20 20 20 20 20 20 2f  repare;        /
1720: 2a 20 54 72 75 65 20 74 6f 20 75 73 65 20 73 71  * True to use sq
1730: 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28 29 20  lite3_prepare() 
1740: 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 73 74  */.#endif.};..st
1750: 72 75 63 74 20 49 6e 63 72 62 6c 6f 62 43 68 61  ruct IncrblobCha
1760: 6e 6e 65 6c 20 7b 0a 20 20 73 71 6c 69 74 65 33  nnel {.  sqlite3
1770: 5f 62 6c 6f 62 20 2a 70 42 6c 6f 62 3b 20 20 20  _blob *pBlob;   
1780: 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 20 62 6c     /* sqlite3 bl
1790: 6f 62 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 53  ob handle */.  S
17a0: 71 6c 69 74 65 44 62 20 2a 70 44 62 3b 20 20 20  qliteDb *pDb;   
17b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73 6f           /* Asso
17c0: 63 69 61 74 65 64 20 64 61 74 61 62 61 73 65 20  ciated database 
17d0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
17e0: 69 6e 74 20 69 53 65 65 6b 3b 20 20 20 20 20 20  int iSeek;      
17f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
1800: 72 65 6e 74 20 73 65 65 6b 20 6f 66 66 73 65 74  rent seek offset
1810: 20 2a 2f 0a 20 20 54 63 6c 5f 43 68 61 6e 6e 65   */.  Tcl_Channe
1820: 6c 20 63 68 61 6e 6e 65 6c 3b 20 20 20 20 20 20  l channel;      
1830: 2f 2a 20 43 68 61 6e 6e 65 6c 20 69 64 65 6e 74  /* Channel ident
1840: 69 66 69 65 72 20 2a 2f 0a 20 20 49 6e 63 72 62  ifier */.  Incrb
1850: 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 70 4e 65 78  lobChannel *pNex
1860: 74 3b 20 20 20 2f 2a 20 4c 69 6e 6b 65 64 20 6c  t;   /* Linked l
1870: 69 73 74 20 6f 66 20 61 6c 6c 20 6f 70 65 6e 20  ist of all open 
1880: 69 6e 63 72 62 6c 6f 62 20 63 68 61 6e 6e 65 6c  incrblob channel
1890: 73 20 2a 2f 0a 20 20 49 6e 63 72 62 6c 6f 62 43  s */.  IncrblobC
18a0: 68 61 6e 6e 65 6c 20 2a 70 50 72 65 76 3b 20 20  hannel *pPrev;  
18b0: 20 2f 2a 20 4c 69 6e 6b 65 64 20 6c 69 73 74 20   /* Linked list 
18c0: 6f 66 20 61 6c 6c 20 6f 70 65 6e 20 69 6e 63 72  of all open incr
18d0: 62 6c 6f 62 20 63 68 61 6e 6e 65 6c 73 20 2a 2f  blob channels */
18e0: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75  .};../*.** Compu
18f0: 74 65 20 61 20 73 74 72 69 6e 67 20 6c 65 6e 67  te a string leng
1900: 74 68 20 74 68 61 74 20 69 73 20 6c 69 6d 69 74  th that is limit
1910: 65 64 20 74 6f 20 77 68 61 74 20 63 61 6e 20 62  ed to what can b
1920: 65 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 6c  e stored in.** l
1930: 6f 77 65 72 20 33 30 20 62 69 74 73 20 6f 66 20  ower 30 bits of 
1940: 61 20 33 32 2d 62 69 74 20 73 69 67 6e 65 64 20  a 32-bit signed 
1950: 69 6e 74 65 67 65 72 2e 0a 2a 2f 0a 73 74 61 74  integer..*/.stat
1960: 69 63 20 69 6e 74 20 73 74 72 6c 65 6e 33 30 28  ic int strlen30(
1970: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a  const char *z){.
1980: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 32    const char *z2
1990: 20 3d 20 7a 3b 0a 20 20 77 68 69 6c 65 28 20 2a   = z;.  while( *
19a0: 7a 32 20 29 7b 20 7a 32 2b 2b 3b 20 7d 0a 20 20  z2 ){ z2++; }.  
19b0: 72 65 74 75 72 6e 20 30 78 33 66 66 66 66 66 66  return 0x3ffffff
19c0: 66 20 26 20 28 69 6e 74 29 28 7a 32 20 2d 20 7a  f & (int)(z2 - z
19d0: 29 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53  );.}...#ifndef S
19e0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42  QLITE_OMIT_INCRB
19f0: 4c 4f 42 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  LOB./*.** Close 
1a00: 61 6c 6c 20 69 6e 63 72 62 6c 6f 62 20 63 68 61  all incrblob cha
1a10: 6e 6e 65 6c 73 20 6f 70 65 6e 65 64 20 75 73 69  nnels opened usi
1a20: 6e 67 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  ng database conn
1a30: 65 63 74 69 6f 6e 20 70 44 62 2e 0a 2a 2a 20 54  ection pDb..** T
1a40: 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 77 68  his is called wh
1a50: 65 6e 20 73 68 75 74 74 69 6e 67 20 64 6f 77 6e  en shutting down
1a60: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   the database co
1a70: 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  nnection..*/.sta
1a80: 74 69 63 20 76 6f 69 64 20 63 6c 6f 73 65 49 6e  tic void closeIn
1a90: 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 73 28 53  crblobChannels(S
1aa0: 71 6c 69 74 65 44 62 20 2a 70 44 62 29 7b 0a 20  qliteDb *pDb){. 
1ab0: 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c   IncrblobChannel
1ac0: 20 2a 70 3b 0a 20 20 49 6e 63 72 62 6c 6f 62 43   *p;.  IncrblobC
1ad0: 68 61 6e 6e 65 6c 20 2a 70 4e 65 78 74 3b 0a 0a  hannel *pNext;..
1ae0: 20 20 66 6f 72 28 70 3d 70 44 62 2d 3e 70 49 6e    for(p=pDb->pIn
1af0: 63 72 62 6c 6f 62 3b 20 70 3b 20 70 3d 70 4e 65  crblob; p; p=pNe
1b00: 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d  xt){.    pNext =
1b10: 20 70 2d 3e 70 4e 65 78 74 3b 0a 0a 20 20 20 20   p->pNext;..    
1b20: 2f 2a 20 4e 6f 74 65 3a 20 43 61 6c 6c 69 6e 67  /* Note: Calling
1b30: 20 75 6e 72 65 67 69 73 74 65 72 20 68 65 72 65   unregister here
1b40: 20 63 61 6c 6c 20 54 63 6c 5f 43 6c 6f 73 65 20   call Tcl_Close 
1b50: 6f 6e 20 74 68 65 20 69 6e 63 72 62 6c 6f 62 20  on the incrblob 
1b60: 63 68 61 6e 6e 65 6c 2c 20 0a 20 20 20 20 2a 2a  channel, .    **
1b70: 20 77 68 69 63 68 20 64 65 6c 65 74 65 73 20 74   which deletes t
1b80: 68 65 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e  he IncrblobChann
1b90: 65 6c 20 73 74 72 75 63 74 75 72 65 20 61 74 20  el structure at 
1ba0: 2a 70 2e 20 53 6f 20 64 6f 20 6e 6f 74 0a 20 20  *p. So do not.  
1bb0: 20 20 2a 2a 20 63 61 6c 6c 20 54 63 6c 5f 46 72    ** call Tcl_Fr
1bc0: 65 65 28 29 20 68 65 72 65 2e 0a 20 20 20 20 2a  ee() here..    *
1bd0: 2f 0a 20 20 20 20 54 63 6c 5f 55 6e 72 65 67 69  /.    Tcl_Unregi
1be0: 73 74 65 72 43 68 61 6e 6e 65 6c 28 70 44 62 2d  sterChannel(pDb-
1bf0: 3e 69 6e 74 65 72 70 2c 20 70 2d 3e 63 68 61 6e  >interp, p->chan
1c00: 6e 65 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  nel);.  }.}../*.
1c10: 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 69 6e 63 72  ** Close an incr
1c20: 65 6d 65 6e 74 61 6c 20 62 6c 6f 62 20 63 68 61  emental blob cha
1c30: 6e 6e 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  nnel..*/.static 
1c40: 69 6e 74 20 69 6e 63 72 62 6c 6f 62 43 6c 6f 73  int incrblobClos
1c50: 65 28 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73  e(ClientData ins
1c60: 74 61 6e 63 65 44 61 74 61 2c 20 54 63 6c 5f 49  tanceData, Tcl_I
1c70: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 0a  nterp *interp){.
1c80: 20 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65    IncrblobChanne
1c90: 6c 20 2a 70 20 3d 20 28 49 6e 63 72 62 6c 6f 62  l *p = (Incrblob
1ca0: 43 68 61 6e 6e 65 6c 20 2a 29 69 6e 73 74 61 6e  Channel *)instan
1cb0: 63 65 44 61 74 61 3b 0a 20 20 69 6e 74 20 72 63  ceData;.  int rc
1cc0: 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f   = sqlite3_blob_
1cd0: 63 6c 6f 73 65 28 70 2d 3e 70 42 6c 6f 62 29 3b  close(p->pBlob);
1ce0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
1cf0: 20 70 2d 3e 70 44 62 2d 3e 64 62 3b 0a 0a 20 20   p->pDb->db;..  
1d00: 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 63 68  /* Remove the ch
1d10: 61 6e 6e 65 6c 20 66 72 6f 6d 20 74 68 65 20 53  annel from the S
1d20: 71 6c 69 74 65 44 62 2e 70 49 6e 63 72 62 6c 6f  qliteDb.pIncrblo
1d30: 62 20 6c 69 73 74 2e 20 2a 2f 0a 20 20 69 66 28  b list. */.  if(
1d40: 20 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20   p->pNext ){.   
1d50: 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76   p->pNext->pPrev
1d60: 20 3d 20 70 2d 3e 70 50 72 65 76 3b 0a 20 20 7d   = p->pPrev;.  }
1d70: 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 65 76 20  .  if( p->pPrev 
1d80: 29 7b 0a 20 20 20 20 70 2d 3e 70 50 72 65 76 2d  ){.    p->pPrev-
1d90: 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78  >pNext = p->pNex
1da0: 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  t;.  }.  if( p->
1db0: 70 44 62 2d 3e 70 49 6e 63 72 62 6c 6f 62 3d 3d  pDb->pIncrblob==
1dc0: 70 20 29 7b 0a 20 20 20 20 70 2d 3e 70 44 62 2d  p ){.    p->pDb-
1dd0: 3e 70 49 6e 63 72 62 6c 6f 62 20 3d 20 70 2d 3e  >pIncrblob = p->
1de0: 70 4e 65 78 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  pNext;.  }..  /*
1df0: 20 46 72 65 65 20 74 68 65 20 49 6e 63 72 62 6c   Free the Incrbl
1e00: 6f 62 43 68 61 6e 6e 65 6c 20 73 74 72 75 63 74  obChannel struct
1e10: 75 72 65 20 2a 2f 0a 20 20 54 63 6c 5f 46 72 65  ure */.  Tcl_Fre
1e20: 65 28 28 63 68 61 72 20 2a 29 70 29 3b 0a 0a 20  e((char *)p);.. 
1e30: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1e40: 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65  OK ){.    Tcl_Se
1e50: 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  tResult(interp, 
1e60: 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f  (char *)sqlite3_
1e70: 65 72 72 6d 73 67 28 64 62 29 2c 20 54 43 4c 5f  errmsg(db), TCL_
1e80: 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 20 20 72  VOLATILE);.    r
1e90: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1ea0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43  .  }.  return TC
1eb0: 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  L_OK;.}../*.** R
1ec0: 65 61 64 20 64 61 74 61 20 66 72 6f 6d 20 61 6e  ead data from an
1ed0: 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 62 6c 6f   incremental blo
1ee0: 62 20 63 68 61 6e 6e 65 6c 2e 0a 2a 2f 0a 73 74  b channel..*/.st
1ef0: 61 74 69 63 20 69 6e 74 20 69 6e 63 72 62 6c 6f  atic int incrblo
1f00: 62 49 6e 70 75 74 28 0a 20 20 43 6c 69 65 6e 74  bInput(.  Client
1f10: 44 61 74 61 20 69 6e 73 74 61 6e 63 65 44 61 74  Data instanceDat
1f20: 61 2c 20 0a 20 20 63 68 61 72 20 2a 62 75 66 2c  a, .  char *buf,
1f30: 20 0a 20 20 69 6e 74 20 62 75 66 53 69 7a 65 2c   .  int bufSize,
1f40: 0a 20 20 69 6e 74 20 2a 65 72 72 6f 72 43 6f 64  .  int *errorCod
1f50: 65 50 74 72 0a 29 7b 0a 20 20 49 6e 63 72 62 6c  ePtr.){.  Incrbl
1f60: 6f 62 43 68 61 6e 6e 65 6c 20 2a 70 20 3d 20 28  obChannel *p = (
1f70: 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20  IncrblobChannel 
1f80: 2a 29 69 6e 73 74 61 6e 63 65 44 61 74 61 3b 0a  *)instanceData;.
1f90: 20 20 69 6e 74 20 6e 52 65 61 64 20 3d 20 62 75    int nRead = bu
1fa0: 66 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 2f  fSize;         /
1fb0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
1fc0: 73 20 74 6f 20 72 65 61 64 20 2a 2f 0a 20 20 69  s to read */.  i
1fd0: 6e 74 20 6e 42 6c 6f 62 3b 20 20 20 20 20 20 20  nt nBlob;       
1fe0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1ff0: 6f 74 61 6c 20 73 69 7a 65 20 6f 66 20 74 68 65  otal size of the
2000: 20 62 6c 6f 62 20 2a 2f 0a 20 20 69 6e 74 20 72   blob */.  int r
2010: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
2020: 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74          /* sqlit
2030: 65 20 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a  e error code */.
2040: 0a 20 20 6e 42 6c 6f 62 20 3d 20 73 71 6c 69 74  .  nBlob = sqlit
2050: 65 33 5f 62 6c 6f 62 5f 62 79 74 65 73 28 70 2d  e3_blob_bytes(p-
2060: 3e 70 42 6c 6f 62 29 3b 0a 20 20 69 66 28 20 28  >pBlob);.  if( (
2070: 70 2d 3e 69 53 65 65 6b 2b 6e 52 65 61 64 29 3e  p->iSeek+nRead)>
2080: 6e 42 6c 6f 62 20 29 7b 0a 20 20 20 20 6e 52 65  nBlob ){.    nRe
2090: 61 64 20 3d 20 6e 42 6c 6f 62 2d 70 2d 3e 69 53  ad = nBlob-p->iS
20a0: 65 65 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e  eek;.  }.  if( n
20b0: 52 65 61 64 3c 3d 30 20 29 7b 0a 20 20 20 20 72  Read<=0 ){.    r
20c0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20  eturn 0;.  }..  
20d0: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f  rc = sqlite3_blo
20e0: 62 5f 72 65 61 64 28 70 2d 3e 70 42 6c 6f 62 2c  b_read(p->pBlob,
20f0: 20 28 76 6f 69 64 20 2a 29 62 75 66 2c 20 6e 52   (void *)buf, nR
2100: 65 61 64 2c 20 70 2d 3e 69 53 65 65 6b 29 3b 0a  ead, p->iSeek);.
2110: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2120: 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 65 72 72 6f  _OK ){.    *erro
2130: 72 43 6f 64 65 50 74 72 20 3d 20 72 63 3b 0a 20  rCodePtr = rc;. 
2140: 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20     return -1;.  
2150: 7d 0a 0a 20 20 70 2d 3e 69 53 65 65 6b 20 2b 3d  }..  p->iSeek +=
2160: 20 6e 52 65 61 64 3b 0a 20 20 72 65 74 75 72 6e   nRead;.  return
2170: 20 6e 52 65 61 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   nRead;.}../*.**
2180: 20 57 72 69 74 65 20 64 61 74 61 20 74 6f 20 61   Write data to a
2190: 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 62 6c  n incremental bl
21a0: 6f 62 20 63 68 61 6e 6e 65 6c 2e 0a 2a 2f 0a 73  ob channel..*/.s
21b0: 74 61 74 69 63 20 69 6e 74 20 69 6e 63 72 62 6c  tatic int incrbl
21c0: 6f 62 4f 75 74 70 75 74 28 0a 20 20 43 6c 69 65  obOutput(.  Clie
21d0: 6e 74 44 61 74 61 20 69 6e 73 74 61 6e 63 65 44  ntData instanceD
21e0: 61 74 61 2c 20 0a 20 20 43 4f 4e 53 54 20 63 68  ata, .  CONST ch
21f0: 61 72 20 2a 62 75 66 2c 20 0a 20 20 69 6e 74 20  ar *buf, .  int 
2200: 74 6f 57 72 69 74 65 2c 0a 20 20 69 6e 74 20 2a  toWrite,.  int *
2210: 65 72 72 6f 72 43 6f 64 65 50 74 72 0a 29 7b 0a  errorCodePtr.){.
2220: 20 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65    IncrblobChanne
2230: 6c 20 2a 70 20 3d 20 28 49 6e 63 72 62 6c 6f 62  l *p = (Incrblob
2240: 43 68 61 6e 6e 65 6c 20 2a 29 69 6e 73 74 61 6e  Channel *)instan
2250: 63 65 44 61 74 61 3b 0a 20 20 69 6e 74 20 6e 57  ceData;.  int nW
2260: 72 69 74 65 20 3d 20 74 6f 57 72 69 74 65 3b 20  rite = toWrite; 
2270: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2280: 20 6f 66 20 62 79 74 65 73 20 74 6f 20 77 72 69   of bytes to wri
2290: 74 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 6c 6f  te */.  int nBlo
22a0: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
22b0: 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69       /* Total si
22c0: 7a 65 20 6f 66 20 74 68 65 20 62 6c 6f 62 20 2a  ze of the blob *
22d0: 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
22e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f0: 20 2f 2a 20 73 71 6c 69 74 65 20 65 72 72 6f 72   /* sqlite error
2300: 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 6e 42 6c 6f   code */..  nBlo
2310: 62 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62  b = sqlite3_blob
2320: 5f 62 79 74 65 73 28 70 2d 3e 70 42 6c 6f 62 29  _bytes(p->pBlob)
2330: 3b 0a 20 20 69 66 28 20 28 70 2d 3e 69 53 65 65  ;.  if( (p->iSee
2340: 6b 2b 6e 57 72 69 74 65 29 3e 6e 42 6c 6f 62 20  k+nWrite)>nBlob 
2350: 29 7b 0a 20 20 20 20 2a 65 72 72 6f 72 43 6f 64  ){.    *errorCod
2360: 65 50 74 72 20 3d 20 45 49 4e 56 41 4c 3b 0a 20  ePtr = EINVAL;. 
2370: 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20     return -1;.  
2380: 7d 0a 20 20 69 66 28 20 6e 57 72 69 74 65 3c 3d  }.  if( nWrite<=
2390: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
23a0: 30 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 73  0;.  }..  rc = s
23b0: 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 77 72 69 74  qlite3_blob_writ
23c0: 65 28 70 2d 3e 70 42 6c 6f 62 2c 20 28 76 6f 69  e(p->pBlob, (voi
23d0: 64 20 2a 29 62 75 66 2c 20 6e 57 72 69 74 65 2c  d *)buf, nWrite,
23e0: 20 70 2d 3e 69 53 65 65 6b 29 3b 0a 20 20 69 66   p->iSeek);.  if
23f0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2400: 29 7b 0a 20 20 20 20 2a 65 72 72 6f 72 43 6f 64  ){.    *errorCod
2410: 65 50 74 72 20 3d 20 45 49 4f 3b 0a 20 20 20 20  ePtr = EIO;.    
2420: 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 0a  return -1;.  }..
2430: 20 20 70 2d 3e 69 53 65 65 6b 20 2b 3d 20 6e 57    p->iSeek += nW
2440: 72 69 74 65 3b 0a 20 20 72 65 74 75 72 6e 20 6e  rite;.  return n
2450: 57 72 69 74 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Write;.}../*.** 
2460: 53 65 65 6b 20 61 6e 20 69 6e 63 72 65 6d 65 6e  Seek an incremen
2470: 74 61 6c 20 62 6c 6f 62 20 63 68 61 6e 6e 65 6c  tal blob channel
2480: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2490: 69 6e 63 72 62 6c 6f 62 53 65 65 6b 28 0a 20 20  incrblobSeek(.  
24a0: 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73 74 61  ClientData insta
24b0: 6e 63 65 44 61 74 61 2c 20 0a 20 20 6c 6f 6e 67  nceData, .  long
24c0: 20 6f 66 66 73 65 74 2c 0a 20 20 69 6e 74 20 73   offset,.  int s
24d0: 65 65 6b 4d 6f 64 65 2c 0a 20 20 69 6e 74 20 2a  eekMode,.  int *
24e0: 65 72 72 6f 72 43 6f 64 65 50 74 72 0a 29 7b 0a  errorCodePtr.){.
24f0: 20 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65    IncrblobChanne
2500: 6c 20 2a 70 20 3d 20 28 49 6e 63 72 62 6c 6f 62  l *p = (Incrblob
2510: 43 68 61 6e 6e 65 6c 20 2a 29 69 6e 73 74 61 6e  Channel *)instan
2520: 63 65 44 61 74 61 3b 0a 0a 20 20 73 77 69 74 63  ceData;..  switc
2530: 68 28 20 73 65 65 6b 4d 6f 64 65 20 29 7b 0a 20  h( seekMode ){. 
2540: 20 20 20 63 61 73 65 20 53 45 45 4b 5f 53 45 54     case SEEK_SET
2550: 3a 0a 20 20 20 20 20 20 70 2d 3e 69 53 65 65 6b  :.      p->iSeek
2560: 20 3d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 20   = offset;.     
2570: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
2580: 20 53 45 45 4b 5f 43 55 52 3a 0a 20 20 20 20 20   SEEK_CUR:.     
2590: 20 70 2d 3e 69 53 65 65 6b 20 2b 3d 20 6f 66 66   p->iSeek += off
25a0: 73 65 74 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  set;.      break
25b0: 3b 0a 20 20 20 20 63 61 73 65 20 53 45 45 4b 5f  ;.    case SEEK_
25c0: 45 4e 44 3a 0a 20 20 20 20 20 20 70 2d 3e 69 53  END:.      p->iS
25d0: 65 65 6b 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c  eek = sqlite3_bl
25e0: 6f 62 5f 62 79 74 65 73 28 70 2d 3e 70 42 6c 6f  ob_bytes(p->pBlo
25f0: 62 29 20 2b 20 6f 66 66 73 65 74 3b 0a 20 20 20  b) + offset;.   
2600: 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 64     break;..    d
2610: 65 66 61 75 6c 74 3a 20 61 73 73 65 72 74 28 21  efault: assert(!
2620: 22 42 61 64 20 73 65 65 6b 4d 6f 64 65 22 29 3b  "Bad seekMode");
2630: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70  .  }..  return p
2640: 2d 3e 69 53 65 65 6b 3b 0a 7d 0a 0a 0a 73 74 61  ->iSeek;.}...sta
2650: 74 69 63 20 76 6f 69 64 20 69 6e 63 72 62 6c 6f  tic void incrblo
2660: 62 57 61 74 63 68 28 43 6c 69 65 6e 74 44 61 74  bWatch(ClientDat
2670: 61 20 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 20  a instanceData, 
2680: 69 6e 74 20 6d 6f 64 65 29 7b 20 0a 20 20 2f 2a  int mode){ .  /*
2690: 20 4e 4f 2d 4f 50 20 2a 2f 20 0a 7d 0a 73 74 61   NO-OP */ .}.sta
26a0: 74 69 63 20 69 6e 74 20 69 6e 63 72 62 6c 6f 62  tic int incrblob
26b0: 48 61 6e 64 6c 65 28 43 6c 69 65 6e 74 44 61 74  Handle(ClientDat
26c0: 61 20 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 20  a instanceData, 
26d0: 69 6e 74 20 64 69 72 2c 20 43 6c 69 65 6e 74 44  int dir, ClientD
26e0: 61 74 61 20 2a 68 50 74 72 29 7b 0a 20 20 72 65  ata *hPtr){.  re
26f0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
2700: 7d 0a 0a 73 74 61 74 69 63 20 54 63 6c 5f 43 68  }..static Tcl_Ch
2710: 61 6e 6e 65 6c 54 79 70 65 20 49 6e 63 72 62 6c  annelType Incrbl
2720: 6f 62 43 68 61 6e 6e 65 6c 54 79 70 65 20 3d 20  obChannelType = 
2730: 7b 0a 20 20 22 69 6e 63 72 62 6c 6f 62 22 2c 20  {.  "incrblob", 
2740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2750: 20 20 20 20 20 20 20 2f 2a 20 74 79 70 65 4e 61         /* typeNa
2760: 6d 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  me              
2770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
2780: 2f 0a 20 20 54 43 4c 5f 43 48 41 4e 4e 45 4c 5f  /.  TCL_CHANNEL_
2790: 56 45 52 53 49 4f 4e 5f 32 2c 20 20 20 20 20 20  VERSION_2,      
27a0: 20 20 20 20 20 20 20 2f 2a 20 76 65 72 73 69 6f         /* versio
27b0: 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n               
27c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
27d0: 2f 0a 20 20 69 6e 63 72 62 6c 6f 62 43 6c 6f 73  /.  incrblobClos
27e0: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
27f0: 20 20 20 20 20 20 20 2f 2a 20 63 6c 6f 73 65 50         /* closeP
2800: 72 6f 63 20 20 20 20 20 20 20 20 20 20 20 20 20  roc             
2810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
2820: 2f 0a 20 20 69 6e 63 72 62 6c 6f 62 49 6e 70 75  /.  incrblobInpu
2830: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
2840: 20 20 20 20 20 20 20 2f 2a 20 69 6e 70 75 74 50         /* inputP
2850: 72 6f 63 20 20 20 20 20 20 20 20 20 20 20 20 20  roc             
2860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
2870: 2f 0a 20 20 69 6e 63 72 62 6c 6f 62 4f 75 74 70  /.  incrblobOutp
2880: 75 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ut,             
2890: 20 20 20 20 20 20 20 2f 2a 20 6f 75 74 70 75 74         /* output
28a0: 50 72 6f 63 20 20 20 20 20 20 20 20 20 20 20 20  Proc            
28b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
28c0: 2f 0a 20 20 69 6e 63 72 62 6c 6f 62 53 65 65 6b  /.  incrblobSeek
28d0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
28e0: 20 20 20 20 20 20 20 2f 2a 20 73 65 65 6b 50 72         /* seekPr
28f0: 6f 63 20 20 20 20 20 20 20 20 20 20 20 20 20 20  oc              
2900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
2910: 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20  /.  0,          
2920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2930: 20 20 20 20 20 20 20 2f 2a 20 73 65 74 4f 70 74         /* setOpt
2940: 69 6f 6e 50 72 6f 63 20 20 20 20 20 20 20 20 20  ionProc         
2950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
2960: 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20  /.  0,          
2970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2980: 20 20 20 20 20 20 20 2f 2a 20 67 65 74 4f 70 74         /* getOpt
2990: 69 6f 6e 50 72 6f 63 20 20 20 20 20 20 20 20 20  ionProc         
29a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
29b0: 2f 0a 20 20 69 6e 63 72 62 6c 6f 62 57 61 74 63  /.  incrblobWatc
29c0: 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h,              
29d0: 20 20 20 20 20 20 20 2f 2a 20 77 61 74 63 68 50         /* watchP
29e0: 72 6f 63 20 28 74 68 69 73 20 69 73 20 61 20 6e  roc (this is a n
29f0: 6f 2d 6f 70 29 20 20 20 20 20 20 20 20 20 20 2a  o-op)          *
2a00: 2f 0a 20 20 69 6e 63 72 62 6c 6f 62 48 61 6e 64  /.  incrblobHand
2a10: 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  le,             
2a20: 20 20 20 20 20 20 20 2f 2a 20 67 65 74 48 61 6e         /* getHan
2a30: 64 6c 65 50 72 6f 63 20 28 61 6c 77 61 79 73 20  dleProc (always 
2a40: 72 65 74 75 72 6e 73 20 65 72 72 6f 72 29 20 2a  returns error) *
2a50: 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20  /.  0,          
2a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a70: 20 20 20 20 20 20 20 2f 2a 20 63 6c 6f 73 65 32         /* close2
2a80: 50 72 6f 63 20 20 20 20 20 20 20 20 20 20 20 20  Proc            
2a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
2aa0: 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20  /.  0,          
2ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ac0: 20 20 20 20 20 20 20 2f 2a 20 62 6c 6f 63 6b 4d         /* blockM
2ad0: 6f 64 65 50 72 6f 63 20 20 20 20 20 20 20 20 20  odeProc         
2ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
2af0: 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20  /.  0,          
2b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b10: 20 20 20 20 20 20 20 2f 2a 20 66 6c 75 73 68 50         /* flushP
2b20: 72 6f 63 20 20 20 20 20 20 20 20 20 20 20 20 20  roc             
2b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
2b40: 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20  /.  0,          
2b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b60: 20 20 20 20 20 20 20 2f 2a 20 68 61 6e 64 6c 65         /* handle
2b70: 72 50 72 6f 63 20 20 20 20 20 20 20 20 20 20 20  rProc           
2b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
2b90: 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20  /.  0,          
2ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bb0: 20 20 20 20 20 20 20 2f 2a 20 77 69 64 65 53 65         /* wideSe
2bc0: 65 6b 50 72 6f 63 20 20 20 20 20 20 20 20 20 20  ekProc          
2bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
2be0: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  /.};../*.** Crea
2bf0: 74 65 20 61 20 6e 65 77 20 69 6e 63 72 62 6c 6f  te a new incrblo
2c00: 62 20 63 68 61 6e 6e 65 6c 2e 0a 2a 2f 0a 73 74  b channel..*/.st
2c10: 61 74 69 63 20 69 6e 74 20 63 72 65 61 74 65 49  atic int createI
2c20: 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 28 0a  ncrblobChannel(.
2c30: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
2c40: 74 65 72 70 2c 20 0a 20 20 53 71 6c 69 74 65 44  terp, .  SqliteD
2c50: 62 20 2a 70 44 62 2c 20 0a 20 20 63 6f 6e 73 74  b *pDb, .  const
2c60: 20 63 68 61 72 20 2a 7a 44 62 2c 0a 20 20 63 6f   char *zDb,.  co
2c70: 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 6c 65  nst char *zTable
2c80: 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  , .  const char 
2c90: 2a 7a 43 6f 6c 75 6d 6e 2c 20 0a 20 20 73 71 6c  *zColumn, .  sql
2ca0: 69 74 65 5f 69 6e 74 36 34 20 69 52 6f 77 2c 0a  ite_int64 iRow,.
2cb0: 20 20 69 6e 74 20 69 73 52 65 61 64 6f 6e 6c 79    int isReadonly
2cc0: 0a 29 7b 0a 20 20 49 6e 63 72 62 6c 6f 62 43 68  .){.  IncrblobCh
2cd0: 61 6e 6e 65 6c 20 2a 70 3b 0a 20 20 73 71 6c 69  annel *p;.  sqli
2ce0: 74 65 33 20 2a 64 62 20 3d 20 70 44 62 2d 3e 64  te3 *db = pDb->d
2cf0: 62 3b 0a 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f  b;.  sqlite3_blo
2d00: 62 20 2a 70 42 6c 6f 62 3b 0a 20 20 69 6e 74 20  b *pBlob;.  int 
2d10: 72 63 3b 0a 20 20 69 6e 74 20 66 6c 61 67 73 20  rc;.  int flags 
2d20: 3d 20 54 43 4c 5f 52 45 41 44 41 42 4c 45 7c 28  = TCL_READABLE|(
2d30: 69 73 52 65 61 64 6f 6e 6c 79 20 3f 20 30 20 3a  isReadonly ? 0 :
2d40: 20 54 43 4c 5f 57 52 49 54 41 42 4c 45 29 3b 0a   TCL_WRITABLE);.
2d50: 0a 20 20 2f 2a 20 54 68 69 73 20 76 61 72 69 61  .  /* This varia
2d60: 62 6c 65 20 69 73 20 75 73 65 64 20 74 6f 20 6e  ble is used to n
2d70: 61 6d 65 20 74 68 65 20 63 68 61 6e 6e 65 6c 73  ame the channels
2d80: 3a 20 22 69 6e 63 72 62 6c 6f 62 5f 5b 69 6e 63  : "incrblob_[inc
2d90: 72 20 63 6f 75 6e 74 5d 22 20 2a 2f 0a 20 20 73  r count]" */.  s
2da0: 74 61 74 69 63 20 69 6e 74 20 63 6f 75 6e 74 20  tatic int count 
2db0: 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a 43 68 61  = 0;.  char zCha
2dc0: 6e 6e 65 6c 5b 36 34 5d 3b 0a 0a 20 20 72 63 20  nnel[64];..  rc 
2dd0: 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 6f  = sqlite3_blob_o
2de0: 70 65 6e 28 64 62 2c 20 7a 44 62 2c 20 7a 54 61  pen(db, zDb, zTa
2df0: 62 6c 65 2c 20 7a 43 6f 6c 75 6d 6e 2c 20 69 52  ble, zColumn, iR
2e00: 6f 77 2c 20 21 69 73 52 65 61 64 6f 6e 6c 79 2c  ow, !isReadonly,
2e10: 20 26 70 42 6c 6f 62 29 3b 0a 20 20 69 66 28 20   &pBlob);.  if( 
2e20: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2e30: 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75  .    Tcl_SetResu
2e40: 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72  lt(interp, (char
2e50: 20 2a 29 73 71 6c 69 74 65 33 5f 65 72 72 6d 73   *)sqlite3_errms
2e60: 67 28 70 44 62 2d 3e 64 62 29 2c 20 54 43 4c 5f  g(pDb->db), TCL_
2e70: 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 20 20 72  VOLATILE);.    r
2e80: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
2e90: 0a 20 20 7d 0a 0a 20 20 70 20 3d 20 28 49 6e 63  .  }..  p = (Inc
2ea0: 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 29 54  rblobChannel *)T
2eb0: 63 6c 5f 41 6c 6c 6f 63 28 73 69 7a 65 6f 66 28  cl_Alloc(sizeof(
2ec0: 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 29  IncrblobChannel)
2ed0: 29 3b 0a 20 20 70 2d 3e 69 53 65 65 6b 20 3d 20  );.  p->iSeek = 
2ee0: 30 3b 0a 20 20 70 2d 3e 70 42 6c 6f 62 20 3d 20  0;.  p->pBlob = 
2ef0: 70 42 6c 6f 62 3b 0a 0a 20 20 73 71 6c 69 74 65  pBlob;..  sqlite
2f00: 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
2f10: 66 28 7a 43 68 61 6e 6e 65 6c 29 2c 20 7a 43 68  f(zChannel), zCh
2f20: 61 6e 6e 65 6c 2c 20 22 69 6e 63 72 62 6c 6f 62  annel, "incrblob
2f30: 5f 25 64 22 2c 20 2b 2b 63 6f 75 6e 74 29 3b 0a  _%d", ++count);.
2f40: 20 20 70 2d 3e 63 68 61 6e 6e 65 6c 20 3d 20 54    p->channel = T
2f50: 63 6c 5f 43 72 65 61 74 65 43 68 61 6e 6e 65 6c  cl_CreateChannel
2f60: 28 26 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65  (&IncrblobChanne
2f70: 6c 54 79 70 65 2c 20 7a 43 68 61 6e 6e 65 6c 2c  lType, zChannel,
2f80: 20 70 2c 20 66 6c 61 67 73 29 3b 0a 20 20 54 63   p, flags);.  Tc
2f90: 6c 5f 52 65 67 69 73 74 65 72 43 68 61 6e 6e 65  l_RegisterChanne
2fa0: 6c 28 69 6e 74 65 72 70 2c 20 70 2d 3e 63 68 61  l(interp, p->cha
2fb0: 6e 6e 65 6c 29 3b 0a 0a 20 20 2f 2a 20 4c 69 6e  nnel);..  /* Lin
2fc0: 6b 20 74 68 65 20 6e 65 77 20 63 68 61 6e 6e 65  k the new channe
2fd0: 6c 20 69 6e 74 6f 20 74 68 65 20 53 71 6c 69 74  l into the Sqlit
2fe0: 65 44 62 2e 70 49 6e 63 72 62 6c 6f 62 20 6c 69  eDb.pIncrblob li
2ff0: 73 74 2e 20 2a 2f 0a 20 20 70 2d 3e 70 4e 65 78  st. */.  p->pNex
3000: 74 20 3d 20 70 44 62 2d 3e 70 49 6e 63 72 62 6c  t = pDb->pIncrbl
3010: 6f 62 3b 0a 20 20 70 2d 3e 70 50 72 65 76 20 3d  ob;.  p->pPrev =
3020: 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4e 65   0;.  if( p->pNe
3030: 78 74 20 29 7b 0a 20 20 20 20 70 2d 3e 70 4e 65  xt ){.    p->pNe
3040: 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20  xt->pPrev = p;. 
3050: 20 7d 0a 20 20 70 44 62 2d 3e 70 49 6e 63 72 62   }.  pDb->pIncrb
3060: 6c 6f 62 20 3d 20 70 3b 0a 20 20 70 2d 3e 70 44  lob = p;.  p->pD
3070: 62 20 3d 20 70 44 62 3b 0a 0a 20 20 54 63 6c 5f  b = pDb;..  Tcl_
3080: 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
3090: 2c 20 28 63 68 61 72 20 2a 29 54 63 6c 5f 47 65  , (char *)Tcl_Ge
30a0: 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 70 2d 3e  tChannelName(p->
30b0: 63 68 61 6e 6e 65 6c 29 2c 20 54 43 4c 5f 56 4f  channel), TCL_VO
30c0: 4c 41 54 49 4c 45 29 3b 0a 20 20 72 65 74 75 72  LATILE);.  retur
30d0: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6c 73  n TCL_OK;.}.#els
30e0: 65 20 20 2f 2a 20 65 6c 73 65 20 63 6c 61 75 73  e  /* else claus
30f0: 65 20 66 6f 72 20 22 23 69 66 6e 64 65 66 20 53  e for "#ifndef S
3100: 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42  QLITE_OMIT_INCRB
3110: 4c 4f 42 22 20 2a 2f 0a 20 20 23 64 65 66 69 6e  LOB" */.  #defin
3120: 65 20 63 6c 6f 73 65 49 6e 63 72 62 6c 6f 62 43  e closeIncrblobC
3130: 68 61 6e 6e 65 6c 73 28 70 44 62 29 0a 23 65 6e  hannels(pDb).#en
3140: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 6f 6b 20  dif../*.** Look 
3150: 61 74 20 74 68 65 20 73 63 72 69 70 74 20 70 72  at the script pr
3160: 65 66 69 78 20 69 6e 20 70 43 6d 64 2e 20 20 57  efix in pCmd.  W
3170: 65 20 77 69 6c 6c 20 62 65 20 65 78 65 63 75 74  e will be execut
3180: 69 6e 67 20 74 68 69 73 20 73 63 72 69 70 74 0a  ing this script.
3190: 2a 2a 20 61 66 74 65 72 20 66 69 72 73 74 20 61  ** after first a
31a0: 70 70 65 6e 64 69 6e 67 20 6f 6e 65 20 6f 72 20  ppending one or 
31b0: 6d 6f 72 65 20 61 72 67 75 6d 65 6e 74 73 2e 20  more arguments. 
31c0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6e   This routine an
31d0: 61 6c 79 7a 65 73 0a 2a 2a 20 74 68 65 20 73 63  alyzes.** the sc
31e0: 72 69 70 74 20 74 6f 20 73 65 65 20 69 66 20 69  ript to see if i
31f0: 74 20 69 73 20 73 61 66 65 20 74 6f 20 75 73 65  t is safe to use
3200: 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 76 28 29 20   Tcl_EvalObjv() 
3210: 6f 6e 20 74 68 65 20 73 63 72 69 70 74 0a 2a 2a  on the script.**
3220: 20 72 61 74 68 65 72 20 74 68 61 6e 20 74 68 65   rather than the
3230: 20 6d 6f 72 65 20 67 65 6e 65 72 61 6c 20 54 63   more general Tc
3240: 6c 5f 45 76 61 6c 45 78 28 29 2e 20 20 54 63 6c  l_EvalEx().  Tcl
3250: 5f 45 76 61 6c 4f 62 6a 76 28 29 20 69 73 20 6d  _EvalObjv() is m
3260: 75 63 68 0a 2a 2a 20 66 61 73 74 65 72 2e 0a 2a  uch.** faster..*
3270: 2a 0a 2a 2a 20 53 63 72 69 70 74 73 20 74 68 61  *.** Scripts tha
3280: 74 20 61 72 65 20 73 61 66 65 20 74 6f 20 75 73  t are safe to us
3290: 65 20 77 69 74 68 20 54 63 6c 5f 45 76 61 6c 4f  e with Tcl_EvalO
32a0: 62 6a 76 28 29 20 63 6f 6e 73 69 73 74 73 20 6f  bjv() consists o
32b0: 66 20 61 0a 2a 2a 20 63 6f 6d 6d 61 6e 64 20 6e  f a.** command n
32c0: 61 6d 65 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20  ame followed by 
32d0: 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 61 72 67  zero or more arg
32e0: 75 6d 65 6e 74 73 20 77 69 74 68 20 6e 6f 20 5b  uments with no [
32f0: 2e 2e 2e 5d 20 6f 72 20 24 0a 2a 2a 20 6f 72 20  ...] or $.** or 
3300: 7b 2e 2e 2e 7d 20 6f 72 20 3b 20 74 6f 20 62 65  {...} or ; to be
3310: 20 73 65 65 6e 20 61 6e 79 77 68 65 72 65 2e 20   seen anywhere. 
3320: 20 4d 6f 73 74 20 63 61 6c 6c 62 61 63 6b 20 73   Most callback s
3330: 63 72 69 70 74 73 20 63 6f 6e 73 69 73 74 0a 2a  cripts consist.*
3340: 2a 20 6f 66 20 6a 75 73 74 20 61 20 73 69 6e 67  * of just a sing
3350: 6c 65 20 70 72 6f 63 65 64 75 72 65 20 6e 61 6d  le procedure nam
3360: 65 20 61 6e 64 20 74 68 65 79 20 6d 65 65 74 20  e and they meet 
3370: 74 68 69 73 20 72 65 71 75 69 72 65 6d 65 6e 74  this requirement
3380: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
3390: 73 61 66 65 54 6f 55 73 65 45 76 61 6c 4f 62 6a  safeToUseEvalObj
33a0: 76 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  v(Tcl_Interp *in
33b0: 74 65 72 70 2c 20 54 63 6c 5f 4f 62 6a 20 2a 70  terp, Tcl_Obj *p
33c0: 43 6d 64 29 7b 0a 20 20 2f 2a 20 57 65 20 63 6f  Cmd){.  /* We co
33d0: 75 6c 64 20 74 72 79 20 74 6f 20 64 6f 20 73 6f  uld try to do so
33e0: 6d 65 74 68 69 6e 67 20 77 69 74 68 20 54 63 6c  mething with Tcl
33f0: 5f 50 61 72 73 65 28 29 2e 20 20 42 75 74 20 77  _Parse().  But w
3400: 65 20 77 69 6c 6c 20 69 6e 73 74 65 61 64 0a 20  e will instead. 
3410: 20 2a 2a 20 6a 75 73 74 20 64 6f 20 61 20 73 65   ** just do a se
3420: 61 72 63 68 20 66 6f 72 20 66 6f 72 62 69 64 64  arch for forbidd
3430: 65 6e 20 63 68 61 72 61 63 74 65 72 73 2e 20 20  en characters.  
3440: 49 66 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f  If any of the fo
3450: 72 62 69 64 64 65 6e 0a 20 20 2a 2a 20 63 68 61  rbidden.  ** cha
3460: 72 61 63 74 65 72 73 20 61 70 70 65 61 72 20 69  racters appear i
3470: 6e 20 70 43 6d 64 2c 20 77 65 20 77 69 6c 6c 20  n pCmd, we will 
3480: 72 65 70 6f 72 74 20 74 68 65 20 73 74 72 69 6e  report the strin
3490: 67 20 61 73 20 75 6e 73 61 66 65 2e 0a 20 20 2a  g as unsafe..  *
34a0: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
34b0: 7a 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 7a 20  z;.  int n;.  z 
34c0: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  = Tcl_GetStringF
34d0: 72 6f 6d 4f 62 6a 28 70 43 6d 64 2c 20 26 6e 29  romObj(pCmd, &n)
34e0: 3b 0a 20 20 77 68 69 6c 65 28 20 6e 2d 2d 20 3e  ;.  while( n-- >
34f0: 20 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 63 20   0 ){.    int c 
3500: 3d 20 2a 28 7a 2b 2b 29 3b 0a 20 20 20 20 69 66  = *(z++);.    if
3510: 28 20 63 3d 3d 27 24 27 20 7c 7c 20 63 3d 3d 27  ( c=='$' || c=='
3520: 5b 27 20 7c 7c 20 63 3d 3d 27 3b 27 20 29 20 72  [' || c==';' ) r
3530: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72  eturn 0;.  }.  r
3540: 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 1;.}../*.*
3550: 2a 20 46 69 6e 64 20 61 6e 20 53 71 6c 46 75 6e  * Find an SqlFun
3560: 63 20 73 74 72 75 63 74 75 72 65 20 77 69 74 68  c structure with
3570: 20 74 68 65 20 67 69 76 65 6e 20 6e 61 6d 65 2e   the given name.
3580: 20 20 4f 72 20 63 72 65 61 74 65 20 61 20 6e 65    Or create a ne
3590: 77 0a 2a 2a 20 6f 6e 65 20 69 66 20 61 6e 20 65  w.** one if an e
35a0: 78 69 73 74 69 6e 67 20 6f 6e 65 20 63 61 6e 6e  xisting one cann
35b0: 6f 74 20 62 65 20 66 6f 75 6e 64 2e 20 20 52 65  ot be found.  Re
35c0: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
35d0: 6f 20 74 68 65 0a 2a 2a 20 73 74 72 75 63 74 75  o the.** structu
35e0: 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 71  re..*/.static Sq
35f0: 6c 46 75 6e 63 20 2a 66 69 6e 64 53 71 6c 46 75  lFunc *findSqlFu
3600: 6e 63 28 53 71 6c 69 74 65 44 62 20 2a 70 44 62  nc(SqliteDb *pDb
3610: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  , const char *zN
3620: 61 6d 65 29 7b 0a 20 20 53 71 6c 46 75 6e 63 20  ame){.  SqlFunc 
3630: 2a 70 2c 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74  *p, *pNew;.  int
3640: 20 6e 4e 61 6d 65 20 3d 20 73 74 72 6c 65 6e 33   nName = strlen3
3650: 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 70 4e 65 77  0(zName);.  pNew
3660: 20 3d 20 28 53 71 6c 46 75 6e 63 2a 29 54 63 6c   = (SqlFunc*)Tcl
3670: 5f 41 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a  _Alloc( sizeof(*
3680: 70 4e 65 77 29 20 2b 20 6e 4e 61 6d 65 20 2b 20  pNew) + nName + 
3690: 31 20 29 3b 0a 20 20 70 4e 65 77 2d 3e 7a 4e 61  1 );.  pNew->zNa
36a0: 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70 4e 65  me = (char*)&pNe
36b0: 77 5b 31 5d 3b 0a 20 20 6d 65 6d 63 70 79 28 70  w[1];.  memcpy(p
36c0: 4e 65 77 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d  New->zName, zNam
36d0: 65 2c 20 6e 4e 61 6d 65 2b 31 29 3b 0a 20 20 66  e, nName+1);.  f
36e0: 6f 72 28 70 3d 70 44 62 2d 3e 70 46 75 6e 63 3b  or(p=pDb->pFunc;
36f0: 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b   p; p=p->pNext){
3700: 20 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65   .    if( sqlite
3710: 33 5f 73 74 72 69 63 6d 70 28 70 2d 3e 7a 4e 61  3_stricmp(p->zNa
3720: 6d 65 2c 20 70 4e 65 77 2d 3e 7a 4e 61 6d 65 29  me, pNew->zName)
3730: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  ==0 ){.      Tcl
3740: 5f 46 72 65 65 28 28 63 68 61 72 2a 29 70 4e 65  _Free((char*)pNe
3750: 77 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  w);.      return
3760: 20 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   p;.    }.  }.  
3770: 70 4e 65 77 2d 3e 69 6e 74 65 72 70 20 3d 20 70  pNew->interp = p
3780: 44 62 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 70 4e  Db->interp;.  pN
3790: 65 77 2d 3e 70 44 62 20 3d 20 70 44 62 3b 0a 20  ew->pDb = pDb;. 
37a0: 20 70 4e 65 77 2d 3e 70 53 63 72 69 70 74 20 3d   pNew->pScript =
37b0: 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4e 65 78   0;.  pNew->pNex
37c0: 74 20 3d 20 70 44 62 2d 3e 70 46 75 6e 63 3b 0a  t = pDb->pFunc;.
37d0: 20 20 70 44 62 2d 3e 70 46 75 6e 63 20 3d 20 70    pDb->pFunc = p
37e0: 4e 65 77 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e  New;.  return pN
37f0: 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65  ew;.}../*.** Fre
3800: 65 20 61 20 73 69 6e 67 6c 65 20 53 71 6c 50 72  e a single SqlPr
3810: 65 70 61 72 65 64 53 74 6d 74 20 6f 62 6a 65 63  eparedStmt objec
3820: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
3830: 64 20 64 62 46 72 65 65 53 74 6d 74 28 53 71 6c  d dbFreeStmt(Sql
3840: 50 72 65 70 61 72 65 64 53 74 6d 74 20 2a 70 53  PreparedStmt *pS
3850: 74 6d 74 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  tmt){.#ifdef SQL
3860: 49 54 45 5f 54 45 53 54 0a 20 20 69 66 28 20 73  ITE_TEST.  if( s
3870: 71 6c 69 74 65 33 5f 73 71 6c 28 70 53 74 6d 74  qlite3_sql(pStmt
3880: 2d 3e 70 53 74 6d 74 29 3d 3d 30 20 29 7b 0a 20  ->pStmt)==0 ){. 
3890: 20 20 20 54 63 6c 5f 46 72 65 65 28 28 63 68 61     Tcl_Free((cha
38a0: 72 20 2a 29 70 53 74 6d 74 2d 3e 7a 53 71 6c 29  r *)pStmt->zSql)
38b0: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73  ;.  }.#endif.  s
38c0: 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
38d0: 70 53 74 6d 74 2d 3e 70 53 74 6d 74 29 3b 0a 20  pStmt->pStmt);. 
38e0: 20 54 63 6c 5f 46 72 65 65 28 28 63 68 61 72 20   Tcl_Free((char 
38f0: 2a 29 70 53 74 6d 74 29 3b 0a 7d 0a 0a 2f 2a 0a  *)pStmt);.}../*.
3900: 2a 2a 20 46 69 6e 61 6c 69 7a 65 20 61 6e 64 20  ** Finalize and 
3910: 66 72 65 65 20 61 20 6c 69 73 74 20 6f 66 20 70  free a list of p
3920: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
3930: 74 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ts.*/.static voi
3940: 64 20 66 6c 75 73 68 53 74 6d 74 43 61 63 68 65  d flushStmtCache
3950: 28 53 71 6c 69 74 65 44 62 20 2a 70 44 62 29 7b  (SqliteDb *pDb){
3960: 0a 20 20 53 71 6c 50 72 65 70 61 72 65 64 53 74  .  SqlPreparedSt
3970: 6d 74 20 2a 70 50 72 65 53 74 6d 74 3b 0a 20 20  mt *pPreStmt;.  
3980: 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74 20  SqlPreparedStmt 
3990: 2a 70 4e 65 78 74 3b 0a 0a 20 20 66 6f 72 28 70  *pNext;..  for(p
39a0: 50 72 65 53 74 6d 74 20 3d 20 70 44 62 2d 3e 73  PreStmt = pDb->s
39b0: 74 6d 74 4c 69 73 74 3b 20 70 50 72 65 53 74 6d  tmtList; pPreStm
39c0: 74 3b 20 70 50 72 65 53 74 6d 74 3d 70 4e 65 78  t; pPreStmt=pNex
39d0: 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20  t){.    pNext = 
39e0: 70 50 72 65 53 74 6d 74 2d 3e 70 4e 65 78 74 3b  pPreStmt->pNext;
39f0: 0a 20 20 20 20 64 62 46 72 65 65 53 74 6d 74 28  .    dbFreeStmt(
3a00: 70 50 72 65 53 74 6d 74 29 3b 0a 20 20 7d 0a 20  pPreStmt);.  }. 
3a10: 20 70 44 62 2d 3e 6e 53 74 6d 74 20 3d 20 30 3b   pDb->nStmt = 0;
3a20: 0a 20 20 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74  .  pDb->stmtLast
3a30: 20 3d 20 30 3b 0a 20 20 70 44 62 2d 3e 73 74 6d   = 0;.  pDb->stm
3a40: 74 4c 69 73 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  tList = 0;.}../*
3a50: 0a 2a 2a 20 54 43 4c 20 63 61 6c 6c 73 20 74 68  .** TCL calls th
3a60: 69 73 20 70 72 6f 63 65 64 75 72 65 20 77 68 65  is procedure whe
3a70: 6e 20 61 6e 20 73 71 6c 69 74 65 33 20 64 61 74  n an sqlite3 dat
3a80: 61 62 61 73 65 20 63 6f 6d 6d 61 6e 64 20 69 73  abase command is
3a90: 0a 2a 2a 20 64 65 6c 65 74 65 64 2e 0a 2a 2f 0a  .** deleted..*/.
3aa0: 73 74 61 74 69 63 20 76 6f 69 64 20 44 62 44 65  static void DbDe
3ab0: 6c 65 74 65 43 6d 64 28 76 6f 69 64 20 2a 64 62  leteCmd(void *db
3ac0: 29 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70  ){.  SqliteDb *p
3ad0: 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29  Db = (SqliteDb*)
3ae0: 64 62 3b 0a 20 20 66 6c 75 73 68 53 74 6d 74 43  db;.  flushStmtC
3af0: 61 63 68 65 28 70 44 62 29 3b 0a 20 20 63 6c 6f  ache(pDb);.  clo
3b00: 73 65 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65  seIncrblobChanne
3b10: 6c 73 28 70 44 62 29 3b 0a 20 20 73 71 6c 69 74  ls(pDb);.  sqlit
3b20: 65 33 5f 63 6c 6f 73 65 28 70 44 62 2d 3e 64 62  e3_close(pDb->db
3b30: 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 44 62 2d  );.  while( pDb-
3b40: 3e 70 46 75 6e 63 20 29 7b 0a 20 20 20 20 53 71  >pFunc ){.    Sq
3b50: 6c 46 75 6e 63 20 2a 70 46 75 6e 63 20 3d 20 70  lFunc *pFunc = p
3b60: 44 62 2d 3e 70 46 75 6e 63 3b 0a 20 20 20 20 70  Db->pFunc;.    p
3b70: 44 62 2d 3e 70 46 75 6e 63 20 3d 20 70 46 75 6e  Db->pFunc = pFun
3b80: 63 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 61 73  c->pNext;.    as
3b90: 73 65 72 74 28 20 70 46 75 6e 63 2d 3e 70 44 62  sert( pFunc->pDb
3ba0: 3d 3d 70 44 62 20 29 3b 0a 20 20 20 20 54 63 6c  ==pDb );.    Tcl
3bb0: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 46  _DecrRefCount(pF
3bc0: 75 6e 63 2d 3e 70 53 63 72 69 70 74 29 3b 0a 20  unc->pScript);. 
3bd0: 20 20 20 54 63 6c 5f 46 72 65 65 28 28 63 68 61     Tcl_Free((cha
3be0: 72 2a 29 70 46 75 6e 63 29 3b 0a 20 20 7d 0a 20  r*)pFunc);.  }. 
3bf0: 20 77 68 69 6c 65 28 20 70 44 62 2d 3e 70 43 6f   while( pDb->pCo
3c00: 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 53 71 6c  llate ){.    Sql
3c10: 43 6f 6c 6c 61 74 65 20 2a 70 43 6f 6c 6c 61 74  Collate *pCollat
3c20: 65 20 3d 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74  e = pDb->pCollat
3c30: 65 3b 0a 20 20 20 20 70 44 62 2d 3e 70 43 6f 6c  e;.    pDb->pCol
3c40: 6c 61 74 65 20 3d 20 70 43 6f 6c 6c 61 74 65 2d  late = pCollate-
3c50: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 54 63 6c 5f  >pNext;.    Tcl_
3c60: 46 72 65 65 28 28 63 68 61 72 2a 29 70 43 6f 6c  Free((char*)pCol
3c70: 6c 61 74 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28  late);.  }.  if(
3c80: 20 70 44 62 2d 3e 7a 42 75 73 79 20 29 7b 0a 20   pDb->zBusy ){. 
3c90: 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d     Tcl_Free(pDb-
3ca0: 3e 7a 42 75 73 79 29 3b 0a 20 20 7d 0a 20 20 69  >zBusy);.  }.  i
3cb0: 66 28 20 70 44 62 2d 3e 7a 54 72 61 63 65 20 29  f( pDb->zTrace )
3cc0: 7b 0a 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70  {.    Tcl_Free(p
3cd0: 44 62 2d 3e 7a 54 72 61 63 65 29 3b 0a 20 20 7d  Db->zTrace);.  }
3ce0: 0a 20 20 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f  .  if( pDb->zPro
3cf0: 66 69 6c 65 20 29 7b 0a 20 20 20 20 54 63 6c 5f  file ){.    Tcl_
3d00: 46 72 65 65 28 70 44 62 2d 3e 7a 50 72 6f 66 69  Free(pDb->zProfi
3d10: 6c 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  le);.  }.  if( p
3d20: 44 62 2d 3e 7a 41 75 74 68 20 29 7b 0a 20 20 20  Db->zAuth ){.   
3d30: 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a   Tcl_Free(pDb->z
3d40: 41 75 74 68 29 3b 0a 20 20 7d 0a 20 20 69 66 28  Auth);.  }.  if(
3d50: 20 70 44 62 2d 3e 7a 4e 75 6c 6c 20 29 7b 0a 20   pDb->zNull ){. 
3d60: 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d     Tcl_Free(pDb-
3d70: 3e 7a 4e 75 6c 6c 29 3b 0a 20 20 7d 0a 20 20 69  >zNull);.  }.  i
3d80: 66 28 20 70 44 62 2d 3e 70 55 70 64 61 74 65 48  f( pDb->pUpdateH
3d90: 6f 6f 6b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 44  ook ){.    Tcl_D
3da0: 65 63 72 52 65 66 43 6f 75 6e 74 28 70 44 62 2d  ecrRefCount(pDb-
3db0: 3e 70 55 70 64 61 74 65 48 6f 6f 6b 29 3b 0a 20  >pUpdateHook);. 
3dc0: 20 7d 0a 20 20 69 66 28 20 70 44 62 2d 3e 70 50   }.  if( pDb->pP
3dd0: 72 65 55 70 64 61 74 65 48 6f 6f 6b 20 29 7b 0a  reUpdateHook ){.
3de0: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
3df0: 6f 75 6e 74 28 70 44 62 2d 3e 70 50 72 65 55 70  ount(pDb->pPreUp
3e00: 64 61 74 65 48 6f 6f 6b 29 3b 0a 20 20 7d 0a 20  dateHook);.  }. 
3e10: 20 69 66 28 20 70 44 62 2d 3e 70 52 6f 6c 6c 62   if( pDb->pRollb
3e20: 61 63 6b 48 6f 6f 6b 20 29 7b 0a 20 20 20 20 54  ackHook ){.    T
3e30: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
3e40: 70 44 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 48 6f  pDb->pRollbackHo
3e50: 6f 6b 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ok);.  }.  if( p
3e60: 44 62 2d 3e 70 57 61 6c 48 6f 6f 6b 20 29 7b 0a  Db->pWalHook ){.
3e70: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
3e80: 6f 75 6e 74 28 70 44 62 2d 3e 70 57 61 6c 48 6f  ount(pDb->pWalHo
3e90: 6f 6b 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ok);.  }.  if( p
3ea0: 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65 65 64  Db->pCollateNeed
3eb0: 65 64 20 29 7b 0a 20 20 20 20 54 63 6c 5f 44 65  ed ){.    Tcl_De
3ec0: 63 72 52 65 66 43 6f 75 6e 74 28 70 44 62 2d 3e  crRefCount(pDb->
3ed0: 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64 29 3b  pCollateNeeded);
3ee0: 0a 20 20 7d 0a 20 20 54 63 6c 5f 46 72 65 65 28  .  }.  Tcl_Free(
3ef0: 28 63 68 61 72 2a 29 70 44 62 29 3b 0a 7d 0a 0a  (char*)pDb);.}..
3f00: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
3f10: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  ne is called whe
3f20: 6e 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c  n a database fil
3f30: 65 20 69 73 20 6c 6f 63 6b 65 64 20 77 68 69 6c  e is locked whil
3f40: 65 20 74 72 79 69 6e 67 0a 2a 2a 20 74 6f 20 65  e trying.** to e
3f50: 78 65 63 75 74 65 20 53 51 4c 2e 0a 2a 2f 0a 73  xecute SQL..*/.s
3f60: 74 61 74 69 63 20 69 6e 74 20 44 62 42 75 73 79  tatic int DbBusy
3f70: 48 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a 63 64  Handler(void *cd
3f80: 2c 20 69 6e 74 20 6e 54 72 69 65 73 29 7b 0a 20  , int nTries){. 
3f90: 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d   SqliteDb *pDb =
3fa0: 20 28 53 71 6c 69 74 65 44 62 2a 29 63 64 3b 0a   (SqliteDb*)cd;.
3fb0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72    int rc;.  char
3fc0: 20 7a 56 61 6c 5b 33 30 5d 3b 0a 0a 20 20 73 71   zVal[30];..  sq
3fd0: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
3fe0: 69 7a 65 6f 66 28 7a 56 61 6c 29 2c 20 7a 56 61  izeof(zVal), zVa
3ff0: 6c 2c 20 22 25 64 22 2c 20 6e 54 72 69 65 73 29  l, "%d", nTries)
4000: 3b 0a 20 20 72 63 20 3d 20 54 63 6c 5f 56 61 72  ;.  rc = Tcl_Var
4010: 45 76 61 6c 28 70 44 62 2d 3e 69 6e 74 65 72 70  Eval(pDb->interp
4020: 2c 20 70 44 62 2d 3e 7a 42 75 73 79 2c 20 22 20  , pDb->zBusy, " 
4030: 22 2c 20 7a 56 61 6c 2c 20 28 63 68 61 72 2a 29  ", zVal, (char*)
4040: 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 54 43  0);.  if( rc!=TC
4050: 4c 5f 4f 4b 20 7c 7c 20 61 74 6f 69 28 54 63 6c  L_OK || atoi(Tcl
4060: 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74  _GetStringResult
4070: 28 70 44 62 2d 3e 69 6e 74 65 72 70 29 29 20 29  (pDb->interp)) )
4080: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
4090: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a    }.  return 1;.
40a0: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
40b0: 45 5f 4f 4d 49 54 5f 50 52 4f 47 52 45 53 53 5f  E_OMIT_PROGRESS_
40c0: 43 41 4c 4c 42 41 43 4b 0a 2f 2a 0a 2a 2a 20 54  CALLBACK./*.** T
40d0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 69  his routine is i
40e0: 6e 76 6f 6b 65 64 20 61 73 20 74 68 65 20 27 70  nvoked as the 'p
40f0: 72 6f 67 72 65 73 73 20 63 61 6c 6c 62 61 63 6b  rogress callback
4100: 27 20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61  ' for the databa
4110: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
4120: 74 20 44 62 50 72 6f 67 72 65 73 73 48 61 6e 64  t DbProgressHand
4130: 6c 65 72 28 76 6f 69 64 20 2a 63 64 29 7b 0a 20  ler(void *cd){. 
4140: 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d   SqliteDb *pDb =
4150: 20 28 53 71 6c 69 74 65 44 62 2a 29 63 64 3b 0a   (SqliteDb*)cd;.
4160: 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
4170: 65 72 74 28 20 70 44 62 2d 3e 7a 50 72 6f 67 72  ert( pDb->zProgr
4180: 65 73 73 20 29 3b 0a 20 20 72 63 20 3d 20 54 63  ess );.  rc = Tc
4190: 6c 5f 45 76 61 6c 28 70 44 62 2d 3e 69 6e 74 65  l_Eval(pDb->inte
41a0: 72 70 2c 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65  rp, pDb->zProgre
41b0: 73 73 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 54  ss);.  if( rc!=T
41c0: 43 4c 5f 4f 4b 20 7c 7c 20 61 74 6f 69 28 54 63  CL_OK || atoi(Tc
41d0: 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c  l_GetStringResul
41e0: 74 28 70 44 62 2d 3e 69 6e 74 65 72 70 29 29 20  t(pDb->interp)) 
41f0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  ){.    return 1;
4200: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
4210: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  .}.#endif..#ifnd
4220: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ef SQLITE_OMIT_T
4230: 52 41 43 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  RACE./*.** This 
4240: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
4250: 64 20 62 79 20 74 68 65 20 53 51 4c 69 74 65 20  d by the SQLite 
4260: 74 72 61 63 65 20 68 61 6e 64 6c 65 72 20 77 68  trace handler wh
4270: 65 6e 65 76 65 72 20 61 20 6e 65 77 0a 2a 2a 20  enever a new.** 
4280: 62 6c 6f 63 6b 20 6f 66 20 53 51 4c 20 69 73 20  block of SQL is 
4290: 65 78 65 63 75 74 65 64 2e 20 20 54 68 65 20 54  executed.  The T
42a0: 43 4c 20 73 63 72 69 70 74 20 69 6e 20 70 44 62  CL script in pDb
42b0: 2d 3e 7a 54 72 61 63 65 20 69 73 20 65 78 65 63  ->zTrace is exec
42c0: 75 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  uted..*/.static 
42d0: 76 6f 69 64 20 44 62 54 72 61 63 65 48 61 6e 64  void DbTraceHand
42e0: 6c 65 72 28 76 6f 69 64 20 2a 63 64 2c 20 63 6f  ler(void *cd, co
42f0: 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 29 7b  nst char *zSql){
4300: 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62  .  SqliteDb *pDb
4310: 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 63 64   = (SqliteDb*)cd
4320: 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20  ;.  Tcl_DString 
4330: 73 74 72 3b 0a 0a 20 20 54 63 6c 5f 44 53 74 72  str;..  Tcl_DStr
4340: 69 6e 67 49 6e 69 74 28 26 73 74 72 29 3b 0a 20  ingInit(&str);. 
4350: 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65   Tcl_DStringAppe
4360: 6e 64 28 26 73 74 72 2c 20 70 44 62 2d 3e 7a 54  nd(&str, pDb->zT
4370: 72 61 63 65 2c 20 2d 31 29 3b 0a 20 20 54 63 6c  race, -1);.  Tcl
4380: 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64 45 6c  _DStringAppendEl
4390: 65 6d 65 6e 74 28 26 73 74 72 2c 20 7a 53 71 6c  ement(&str, zSql
43a0: 29 3b 0a 20 20 54 63 6c 5f 45 76 61 6c 28 70 44  );.  Tcl_Eval(pD
43b0: 62 2d 3e 69 6e 74 65 72 70 2c 20 54 63 6c 5f 44  b->interp, Tcl_D
43c0: 53 74 72 69 6e 67 56 61 6c 75 65 28 26 73 74 72  StringValue(&str
43d0: 29 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e  ));.  Tcl_DStrin
43e0: 67 46 72 65 65 28 26 73 74 72 29 3b 0a 20 20 54  gFree(&str);.  T
43f0: 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28 70  cl_ResetResult(p
4400: 44 62 2d 3e 69 6e 74 65 72 70 29 3b 0a 7d 0a 23  Db->interp);.}.#
4410: 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
4420: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45  QLITE_OMIT_TRACE
4430: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
4440: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79  ine is called by
4450: 20 74 68 65 20 53 51 4c 69 74 65 20 70 72 6f 66   the SQLite prof
4460: 69 6c 65 20 68 61 6e 64 6c 65 72 20 61 66 74 65  ile handler afte
4470: 72 20 61 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a  r a statement.**
4480: 20 53 51 4c 20 68 61 73 20 65 78 65 63 75 74 65   SQL has execute
4490: 64 2e 20 20 54 68 65 20 54 43 4c 20 73 63 72 69  d.  The TCL scri
44a0: 70 74 20 69 6e 20 70 44 62 2d 3e 7a 50 72 6f 66  pt in pDb->zProf
44b0: 69 6c 65 20 69 73 20 65 76 61 6c 75 61 74 65 64  ile is evaluated
44c0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
44d0: 20 44 62 50 72 6f 66 69 6c 65 48 61 6e 64 6c 65   DbProfileHandle
44e0: 72 28 76 6f 69 64 20 2a 63 64 2c 20 63 6f 6e 73  r(void *cd, cons
44f0: 74 20 63 68 61 72 20 2a 7a 53 71 6c 2c 20 73 71  t char *zSql, sq
4500: 6c 69 74 65 5f 75 69 6e 74 36 34 20 74 6d 29 7b  lite_uint64 tm){
4510: 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62  .  SqliteDb *pDb
4520: 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 63 64   = (SqliteDb*)cd
4530: 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20  ;.  Tcl_DString 
4540: 73 74 72 3b 0a 20 20 63 68 61 72 20 7a 54 6d 5b  str;.  char zTm[
4550: 31 30 30 5d 3b 0a 0a 20 20 73 71 6c 69 74 65 33  100];..  sqlite3
4560: 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
4570: 28 7a 54 6d 29 2d 31 2c 20 7a 54 6d 2c 20 22 25  (zTm)-1, zTm, "%
4580: 6c 6c 64 22 2c 20 74 6d 29 3b 0a 20 20 54 63 6c  lld", tm);.  Tcl
4590: 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 73 74  _DStringInit(&st
45a0: 72 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e  r);.  Tcl_DStrin
45b0: 67 41 70 70 65 6e 64 28 26 73 74 72 2c 20 70 44  gAppend(&str, pD
45c0: 62 2d 3e 7a 50 72 6f 66 69 6c 65 2c 20 2d 31 29  b->zProfile, -1)
45d0: 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41  ;.  Tcl_DStringA
45e0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 26 73 74  ppendElement(&st
45f0: 72 2c 20 7a 53 71 6c 29 3b 0a 20 20 54 63 6c 5f  r, zSql);.  Tcl_
4600: 44 53 74 72 69 6e 67 41 70 70 65 6e 64 45 6c 65  DStringAppendEle
4610: 6d 65 6e 74 28 26 73 74 72 2c 20 7a 54 6d 29 3b  ment(&str, zTm);
4620: 0a 20 20 54 63 6c 5f 45 76 61 6c 28 70 44 62 2d  .  Tcl_Eval(pDb-
4630: 3e 69 6e 74 65 72 70 2c 20 54 63 6c 5f 44 53 74  >interp, Tcl_DSt
4640: 72 69 6e 67 56 61 6c 75 65 28 26 73 74 72 29 29  ringValue(&str))
4650: 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46  ;.  Tcl_DStringF
4660: 72 65 65 28 26 73 74 72 29 3b 0a 20 20 54 63 6c  ree(&str);.  Tcl
4670: 5f 52 65 73 65 74 52 65 73 75 6c 74 28 70 44 62  _ResetResult(pDb
4680: 2d 3e 69 6e 74 65 72 70 29 3b 0a 7d 0a 23 65 6e  ->interp);.}.#en
4690: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  dif../*.** This 
46a0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
46b0: 64 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63  d when a transac
46c0: 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65  tion is committe
46d0: 64 2e 20 20 54 68 65 0a 2a 2a 20 54 43 4c 20 73  d.  The.** TCL s
46e0: 63 72 69 70 74 20 69 6e 20 70 44 62 2d 3e 7a 43  cript in pDb->zC
46f0: 6f 6d 6d 69 74 20 69 73 20 65 78 65 63 75 74 65  ommit is execute
4700: 64 2e 20 20 49 66 20 69 74 20 72 65 74 75 72 6e  d.  If it return
4710: 73 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 72 0a 2a 2a  s non-zero or.**
4720: 20 69 66 20 69 74 20 74 68 72 6f 77 73 20 61 6e   if it throws an
4730: 20 65 78 63 65 70 74 69 6f 6e 2c 20 74 68 65 20   exception, the 
4740: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72  transaction is r
4750: 6f 6c 6c 65 64 20 62 61 63 6b 20 69 6e 73 74 65  olled back inste
4760: 61 64 0a 2a 2a 20 6f 66 20 62 65 69 6e 67 20 63  ad.** of being c
4770: 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2f 0a 73 74 61  ommitted..*/.sta
4780: 74 69 63 20 69 6e 74 20 44 62 43 6f 6d 6d 69 74  tic int DbCommit
4790: 48 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a 63 64  Handler(void *cd
47a0: 29 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70  ){.  SqliteDb *p
47b0: 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29  Db = (SqliteDb*)
47c0: 63 64 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  cd;.  int rc;.. 
47d0: 20 72 63 20 3d 20 54 63 6c 5f 45 76 61 6c 28 70   rc = Tcl_Eval(p
47e0: 44 62 2d 3e 69 6e 74 65 72 70 2c 20 70 44 62 2d  Db->interp, pDb-
47f0: 3e 7a 43 6f 6d 6d 69 74 29 3b 0a 20 20 69 66 28  >zCommit);.  if(
4800: 20 72 63 21 3d 54 43 4c 5f 4f 4b 20 7c 7c 20 61   rc!=TCL_OK || a
4810: 74 6f 69 28 54 63 6c 5f 47 65 74 53 74 72 69 6e  toi(Tcl_GetStrin
4820: 67 52 65 73 75 6c 74 28 70 44 62 2d 3e 69 6e 74  gResult(pDb->int
4830: 65 72 70 29 29 20 29 7b 0a 20 20 20 20 72 65 74  erp)) ){.    ret
4840: 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 1;.  }.  ret
4850: 75 72 6e 20 30 3b 0a 7d 0a 0a 73 74 61 74 69 63  urn 0;.}..static
4860: 20 76 6f 69 64 20 44 62 52 6f 6c 6c 62 61 63 6b   void DbRollback
4870: 48 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a 63 6c  Handler(void *cl
4880: 69 65 6e 74 44 61 74 61 29 7b 0a 20 20 53 71 6c  ientData){.  Sql
4890: 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53 71  iteDb *pDb = (Sq
48a0: 6c 69 74 65 44 62 2a 29 63 6c 69 65 6e 74 44 61  liteDb*)clientDa
48b0: 74 61 3b 0a 20 20 61 73 73 65 72 74 28 70 44 62  ta;.  assert(pDb
48c0: 2d 3e 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 29  ->pRollbackHook)
48d0: 3b 0a 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d  ;.  if( TCL_OK!=
48e0: 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70 44  Tcl_EvalObjEx(pD
48f0: 62 2d 3e 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e  b->interp, pDb->
4900: 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 2c 20 30  pRollbackHook, 0
4910: 29 20 29 7b 0a 20 20 20 20 54 63 6c 5f 42 61 63  ) ){.    Tcl_Bac
4920: 6b 67 72 6f 75 6e 64 45 72 72 6f 72 28 70 44 62  kgroundError(pDb
4930: 2d 3e 69 6e 74 65 72 70 29 3b 0a 20 20 7d 0a 7d  ->interp);.  }.}
4940: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 70 72 6f  ../*.** This pro
4950: 63 65 64 75 72 65 20 68 61 6e 64 6c 65 73 20 77  cedure handles w
4960: 61 6c 5f 68 6f 6f 6b 20 63 61 6c 6c 62 61 63 6b  al_hook callback
4970: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
4980: 20 44 62 57 61 6c 48 61 6e 64 6c 65 72 28 0a 20   DbWalHandler(. 
4990: 20 76 6f 69 64 20 2a 63 6c 69 65 6e 74 44 61 74   void *clientDat
49a0: 61 2c 20 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  a, .  sqlite3 *d
49b0: 62 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  b, .  const char
49c0: 20 2a 7a 44 62 2c 20 0a 20 20 69 6e 74 20 6e 45   *zDb, .  int nE
49d0: 6e 74 72 79 0a 29 7b 0a 20 20 69 6e 74 20 72 65  ntry.){.  int re
49e0: 74 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  t = SQLITE_OK;. 
49f0: 20 54 63 6c 5f 4f 62 6a 20 2a 70 3b 0a 20 20 53   Tcl_Obj *p;.  S
4a00: 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28  qliteDb *pDb = (
4a10: 53 71 6c 69 74 65 44 62 2a 29 63 6c 69 65 6e 74  SqliteDb*)client
4a20: 44 61 74 61 3b 0a 20 20 54 63 6c 5f 49 6e 74 65  Data;.  Tcl_Inte
4a30: 72 70 20 2a 69 6e 74 65 72 70 20 3d 20 70 44 62  rp *interp = pDb
4a40: 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 61 73 73 65  ->interp;.  asse
4a50: 72 74 28 70 44 62 2d 3e 70 57 61 6c 48 6f 6f 6b  rt(pDb->pWalHook
4a60: 29 3b 0a 0a 20 20 70 20 3d 20 54 63 6c 5f 44 75  );..  p = Tcl_Du
4a70: 70 6c 69 63 61 74 65 4f 62 6a 28 70 44 62 2d 3e  plicateObj(pDb->
4a80: 70 57 61 6c 48 6f 6f 6b 29 3b 0a 20 20 54 63 6c  pWalHook);.  Tcl
4a90: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 29  _IncrRefCount(p)
4aa0: 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  ;.  Tcl_ListObjA
4ab0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
4ac0: 65 72 70 2c 20 70 2c 20 54 63 6c 5f 4e 65 77 53  erp, p, Tcl_NewS
4ad0: 74 72 69 6e 67 4f 62 6a 28 7a 44 62 2c 20 2d 31  tringObj(zDb, -1
4ae0: 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ));.  Tcl_ListOb
4af0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
4b00: 6e 74 65 72 70 2c 20 70 2c 20 54 63 6c 5f 4e 65  nterp, p, Tcl_Ne
4b10: 77 49 6e 74 4f 62 6a 28 6e 45 6e 74 72 79 29 29  wIntObj(nEntry))
4b20: 3b 0a 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d  ;.  if( TCL_OK!=
4b30: 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69 6e  Tcl_EvalObjEx(in
4b40: 74 65 72 70 2c 20 70 2c 20 30 29 20 0a 20 20 20  terp, p, 0) .   
4b50: 7c 7c 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47  || TCL_OK!=Tcl_G
4b60: 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
4b70: 65 72 70 2c 20 54 63 6c 5f 47 65 74 4f 62 6a 52  erp, Tcl_GetObjR
4b80: 65 73 75 6c 74 28 69 6e 74 65 72 70 29 2c 20 26  esult(interp), &
4b90: 72 65 74 29 0a 20 20 29 7b 0a 20 20 20 20 54 63  ret).  ){.    Tc
4ba0: 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f  l_BackgroundErro
4bb0: 72 28 69 6e 74 65 72 70 29 3b 0a 20 20 7d 0a 20  r(interp);.  }. 
4bc0: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
4bd0: 74 28 70 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  t(p);..  return 
4be0: 72 65 74 3b 0a 7d 0a 0a 23 69 66 20 64 65 66 69  ret;.}..#if defi
4bf0: 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29  ned(SQLITE_TEST)
4c00: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
4c10: 54 45 5f 45 4e 41 42 4c 45 5f 55 4e 4c 4f 43 4b  TE_ENABLE_UNLOCK
4c20: 5f 4e 4f 54 49 46 59 29 0a 73 74 61 74 69 63 20  _NOTIFY).static 
4c30: 76 6f 69 64 20 73 65 74 54 65 73 74 55 6e 6c 6f  void setTestUnlo
4c40: 63 6b 4e 6f 74 69 66 79 56 61 72 73 28 54 63 6c  ckNotifyVars(Tcl
4c50: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
4c60: 20 69 6e 74 20 69 41 72 67 2c 20 69 6e 74 20 6e   int iArg, int n
4c70: 41 72 67 29 7b 0a 20 20 63 68 61 72 20 7a 42 75  Arg){.  char zBu
4c80: 66 5b 36 34 5d 3b 0a 20 20 73 70 72 69 6e 74 66  f[64];.  sprintf
4c90: 28 7a 42 75 66 2c 20 22 25 64 22 2c 20 69 41 72  (zBuf, "%d", iAr
4ca0: 67 29 3b 0a 20 20 54 63 6c 5f 53 65 74 56 61 72  g);.  Tcl_SetVar
4cb0: 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65  (interp, "sqlite
4cc0: 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79 5f 61  _unlock_notify_a
4cd0: 72 67 22 2c 20 7a 42 75 66 2c 20 54 43 4c 5f 47  rg", zBuf, TCL_G
4ce0: 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 20 20 73  LOBAL_ONLY);.  s
4cf0: 70 72 69 6e 74 66 28 7a 42 75 66 2c 20 22 25 64  printf(zBuf, "%d
4d00: 22 2c 20 6e 41 72 67 29 3b 0a 20 20 54 63 6c 5f  ", nArg);.  Tcl_
4d10: 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c 20 22  SetVar(interp, "
4d20: 73 71 6c 69 74 65 5f 75 6e 6c 6f 63 6b 5f 6e 6f  sqlite_unlock_no
4d30: 74 69 66 79 5f 61 72 67 63 6f 75 6e 74 22 2c 20  tify_argcount", 
4d40: 7a 42 75 66 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c  zBuf, TCL_GLOBAL
4d50: 5f 4f 4e 4c 59 29 3b 0a 7d 0a 23 65 6c 73 65 0a  _ONLY);.}.#else.
4d60: 23 20 64 65 66 69 6e 65 20 73 65 74 54 65 73 74  # define setTest
4d70: 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 56 61 72 73  UnlockNotifyVars
4d80: 28 78 2c 79 2c 7a 29 0a 23 65 6e 64 69 66 0a 0a  (x,y,z).#endif..
4d90: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
4da0: 41 42 4c 45 5f 55 4e 4c 4f 43 4b 5f 4e 4f 54 49  ABLE_UNLOCK_NOTI
4db0: 46 59 0a 73 74 61 74 69 63 20 76 6f 69 64 20 44  FY.static void D
4dc0: 62 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 28 76 6f  bUnlockNotify(vo
4dd0: 69 64 20 2a 2a 61 70 41 72 67 2c 20 69 6e 74 20  id **apArg, int 
4de0: 6e 41 72 67 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  nArg){.  int i;.
4df0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72    for(i=0; i<nAr
4e00: 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e  g; i++){.    con
4e10: 73 74 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 28  st int flags = (
4e20: 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 7c  TCL_EVAL_GLOBAL|
4e30: 54 43 4c 5f 45 56 41 4c 5f 44 49 52 45 43 54 29  TCL_EVAL_DIRECT)
4e40: 3b 0a 20 20 20 20 53 71 6c 69 74 65 44 62 20 2a  ;.    SqliteDb *
4e50: 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62 20  pDb = (SqliteDb 
4e60: 2a 29 61 70 41 72 67 5b 69 5d 3b 0a 20 20 20 20  *)apArg[i];.    
4e70: 73 65 74 54 65 73 74 55 6e 6c 6f 63 6b 4e 6f 74  setTestUnlockNot
4e80: 69 66 79 56 61 72 73 28 70 44 62 2d 3e 69 6e 74  ifyVars(pDb->int
4e90: 65 72 70 2c 20 69 2c 20 6e 41 72 67 29 3b 0a 20  erp, i, nArg);. 
4ea0: 20 20 20 61 73 73 65 72 74 28 20 70 44 62 2d 3e     assert( pDb->
4eb0: 70 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 29 3b 0a  pUnlockNotify);.
4ec0: 20 20 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45      Tcl_EvalObjE
4ed0: 78 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20 70  x(pDb->interp, p
4ee0: 44 62 2d 3e 70 55 6e 6c 6f 63 6b 4e 6f 74 69 66  Db->pUnlockNotif
4ef0: 79 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 54  y, flags);.    T
4f00: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
4f10: 70 44 62 2d 3e 70 55 6e 6c 6f 63 6b 4e 6f 74 69  pDb->pUnlockNoti
4f20: 66 79 29 3b 0a 20 20 20 20 70 44 62 2d 3e 70 55  fy);.    pDb->pU
4f30: 6e 6c 6f 63 6b 4e 6f 74 69 66 79 20 3d 20 30 3b  nlockNotify = 0;
4f40: 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  .  }.}.#endif..#
4f50: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
4f60: 42 4c 45 5f 50 52 45 55 50 44 41 54 45 5f 48 4f  BLE_PREUPDATE_HO
4f70: 4f 4b 0a 2f 2a 0a 2a 2a 20 50 72 65 2d 75 70 64  OK./*.** Pre-upd
4f80: 61 74 65 20 68 6f 6f 6b 20 63 61 6c 6c 62 61 63  ate hook callbac
4f90: 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  k..*/.static voi
4fa0: 64 20 44 62 50 72 65 55 70 64 61 74 65 48 61 6e  d DbPreUpdateHan
4fb0: 64 6c 65 72 28 0a 20 20 76 6f 69 64 20 2a 70 2c  dler(.  void *p,
4fc0: 20 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c   .  sqlite3 *db,
4fd0: 0a 20 20 69 6e 74 20 6f 70 2c 0a 20 20 63 6f 6e  .  int op,.  con
4fe0: 73 74 20 63 68 61 72 20 2a 7a 44 62 2c 20 0a 20  st char *zDb, . 
4ff0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 62   const char *zTb
5000: 6c 2c 20 0a 20 20 73 71 6c 69 74 65 5f 69 6e 74  l, .  sqlite_int
5010: 36 34 20 69 4b 65 79 31 2c 0a 20 20 73 71 6c 69  64 iKey1,.  sqli
5020: 74 65 5f 69 6e 74 36 34 20 69 4b 65 79 32 0a 29  te_int64 iKey2.)
5030: 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44  {.  SqliteDb *pD
5040: 62 20 3d 20 28 53 71 6c 69 74 65 44 62 20 2a 29  b = (SqliteDb *)
5050: 70 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 43  p;.  Tcl_Obj *pC
5060: 6d 64 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  md;.  static con
5070: 73 74 20 63 68 61 72 20 2a 61 7a 53 74 72 5b 5d  st char *azStr[]
5080: 20 3d 20 7b 22 44 45 4c 45 54 45 22 2c 20 22 49   = {"DELETE", "I
5090: 4e 53 45 52 54 22 2c 20 22 55 50 44 41 54 45 22  NSERT", "UPDATE"
50a0: 7d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 28 53  };..  assert( (S
50b0: 51 4c 49 54 45 5f 44 45 4c 45 54 45 2d 31 29 2f  QLITE_DELETE-1)/
50c0: 39 20 3d 3d 20 30 20 29 3b 0a 20 20 61 73 73 65  9 == 0 );.  asse
50d0: 72 74 28 20 28 53 51 4c 49 54 45 5f 49 4e 53 45  rt( (SQLITE_INSE
50e0: 52 54 2d 31 29 2f 39 20 3d 3d 20 31 20 29 3b 0a  RT-1)/9 == 1 );.
50f0: 20 20 61 73 73 65 72 74 28 20 28 53 51 4c 49 54    assert( (SQLIT
5100: 45 5f 55 50 44 41 54 45 2d 31 29 2f 39 20 3d 3d  E_UPDATE-1)/9 ==
5110: 20 32 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20   2 );.  assert( 
5120: 70 44 62 2d 3e 70 50 72 65 55 70 64 61 74 65 48  pDb->pPreUpdateH
5130: 6f 6f 6b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ook );.  assert(
5140: 20 64 62 3d 3d 70 44 62 2d 3e 64 62 20 29 3b 0a   db==pDb->db );.
5150: 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 53 51    assert( op==SQ
5160: 4c 49 54 45 5f 49 4e 53 45 52 54 20 7c 7c 20 6f  LITE_INSERT || o
5170: 70 3d 3d 53 51 4c 49 54 45 5f 55 50 44 41 54 45  p==SQLITE_UPDATE
5180: 20 7c 7c 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 44   || op==SQLITE_D
5190: 45 4c 45 54 45 20 29 3b 0a 0a 20 20 70 43 6d 64  ELETE );..  pCmd
51a0: 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65   = Tcl_Duplicate
51b0: 4f 62 6a 28 70 44 62 2d 3e 70 50 72 65 55 70 64  Obj(pDb->pPreUpd
51c0: 61 74 65 48 6f 6f 6b 29 3b 0a 20 20 54 63 6c 5f  ateHook);.  Tcl_
51d0: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 43 6d  IncrRefCount(pCm
51e0: 64 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62  d);.  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 61 7a 53 74 72 5b 28  tringObj(azStr[(
5220: 6f 70 2d 31 29 2f 39 5d 2c 20 2d 31 29 29 3b 0a  op-1)/9], -1));.
5230: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
5240: 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 43  endElement(0, pC
5250: 6d 64 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  md, Tcl_NewStrin
5260: 67 4f 62 6a 28 7a 44 62 2c 20 2d 31 29 29 3b 0a  gObj(zDb, -1));.
5270: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
5280: 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 43  endElement(0, pC
5290: 6d 64 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  md, Tcl_NewStrin
52a0: 67 4f 62 6a 28 7a 54 62 6c 2c 20 2d 31 29 29 3b  gObj(zTbl, -1));
52b0: 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  .  Tcl_ListObjAp
52c0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70  pendElement(0, p
52d0: 43 6d 64 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65  Cmd, Tcl_NewWide
52e0: 49 6e 74 4f 62 6a 28 69 4b 65 79 31 29 29 3b 0a  IntObj(iKey1));.
52f0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
5300: 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 43  endElement(0, pC
5310: 6d 64 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65 49  md, Tcl_NewWideI
5320: 6e 74 4f 62 6a 28 69 4b 65 79 32 29 29 3b 0a 20  ntObj(iKey2));. 
5330: 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70   Tcl_EvalObjEx(p
5340: 44 62 2d 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64  Db->interp, pCmd
5350: 2c 20 54 43 4c 5f 45 56 41 4c 5f 44 49 52 45 43  , TCL_EVAL_DIREC
5360: 54 29 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52 65  T);.  Tcl_DecrRe
5370: 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 7d 0a  fCount(pCmd);.}.
5380: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
5390: 5f 45 4e 41 42 4c 45 5f 50 52 45 55 50 44 41 54  _ENABLE_PREUPDAT
53a0: 45 5f 48 4f 4f 4b 20 2a 2f 0a 0a 73 74 61 74 69  E_HOOK */..stati
53b0: 63 20 76 6f 69 64 20 44 62 55 70 64 61 74 65 48  c void DbUpdateH
53c0: 61 6e 64 6c 65 72 28 0a 20 20 76 6f 69 64 20 2a  andler(.  void *
53d0: 70 2c 20 0a 20 20 69 6e 74 20 6f 70 2c 0a 20 20  p, .  int op,.  
53e0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 2c  const char *zDb,
53f0: 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a   .  const char *
5400: 7a 54 62 6c 2c 20 0a 20 20 73 71 6c 69 74 65 5f  zTbl, .  sqlite_
5410: 69 6e 74 36 34 20 72 6f 77 69 64 0a 29 7b 0a 20  int64 rowid.){. 
5420: 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d   SqliteDb *pDb =
5430: 20 28 53 71 6c 69 74 65 44 62 20 2a 29 70 3b 0a   (SqliteDb *)p;.
5440: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 43 6d 64 3b    Tcl_Obj *pCmd;
5450: 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
5460: 63 68 61 72 20 2a 61 7a 53 74 72 5b 5d 20 3d 20  char *azStr[] = 
5470: 7b 22 44 45 4c 45 54 45 22 2c 20 22 49 4e 53 45  {"DELETE", "INSE
5480: 52 54 22 2c 20 22 55 50 44 41 54 45 22 7d 3b 0a  RT", "UPDATE"};.
5490: 0a 20 20 61 73 73 65 72 74 28 20 28 53 51 4c 49  .  assert( (SQLI
54a0: 54 45 5f 44 45 4c 45 54 45 2d 31 29 2f 39 20 3d  TE_DELETE-1)/9 =
54b0: 3d 20 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  = 0 );.  assert(
54c0: 20 28 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 2d   (SQLITE_INSERT-
54d0: 31 29 2f 39 20 3d 3d 20 31 20 29 3b 0a 20 20 61  1)/9 == 1 );.  a
54e0: 73 73 65 72 74 28 20 28 53 51 4c 49 54 45 5f 55  ssert( (SQLITE_U
54f0: 50 44 41 54 45 2d 31 29 2f 39 20 3d 3d 20 32 20  PDATE-1)/9 == 2 
5500: 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 44  );..  assert( pD
5510: 62 2d 3e 70 55 70 64 61 74 65 48 6f 6f 6b 20 29  b->pUpdateHook )
5520: 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d  ;.  assert( op==
5530: 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 20 7c 7c  SQLITE_INSERT ||
5540: 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 55 50 44 41   op==SQLITE_UPDA
5550: 54 45 20 7c 7c 20 6f 70 3d 3d 53 51 4c 49 54 45  TE || op==SQLITE
5560: 5f 44 45 4c 45 54 45 20 29 3b 0a 0a 20 20 70 43  _DELETE );..  pC
5570: 6d 64 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61  md = Tcl_Duplica
5580: 74 65 4f 62 6a 28 70 44 62 2d 3e 70 55 70 64 61  teObj(pDb->pUpda
5590: 74 65 48 6f 6f 6b 29 3b 0a 20 20 54 63 6c 5f 49  teHook);.  Tcl_I
55a0: 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 43 6d 64  ncrRefCount(pCmd
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 61 7a 53 74 72 5b 28 6f  ringObj(azStr[(o
55f0: 70 2d 31 29 2f 39 5d 2c 20 2d 31 29 29 3b 0a 20  p-1)/9], -1));. 
5600: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
5610: 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 43 6d  ndElement(0, pCm
5620: 64 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  d, Tcl_NewString
5630: 4f 62 6a 28 7a 44 62 2c 20 2d 31 29 29 3b 0a 20  Obj(zDb, -1));. 
5640: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
5650: 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 43 6d  ndElement(0, pCm
5660: 64 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  d, Tcl_NewString
5670: 4f 62 6a 28 7a 54 62 6c 2c 20 2d 31 29 29 3b 0a  Obj(zTbl, -1));.
5680: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
5690: 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 43  endElement(0, pC
56a0: 6d 64 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65 49  md, Tcl_NewWideI
56b0: 6e 74 4f 62 6a 28 72 6f 77 69 64 29 29 3b 0a 20  ntObj(rowid));. 
56c0: 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70   Tcl_EvalObjEx(p
56d0: 44 62 2d 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64  Db->interp, pCmd
56e0: 2c 20 54 43 4c 5f 45 56 41 4c 5f 44 49 52 45 43  , TCL_EVAL_DIREC
56f0: 54 29 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52 65  T);.  Tcl_DecrRe
5700: 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 7d 0a  fCount(pCmd);.}.
5710: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 63 6c  .static void tcl
5720: 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64 28 0a 20  CollateNeeded(. 
5730: 20 76 6f 69 64 20 2a 70 43 74 78 2c 0a 20 20 73   void *pCtx,.  s
5740: 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 69 6e  qlite3 *db,.  in
5750: 74 20 65 6e 63 2c 0a 20 20 63 6f 6e 73 74 20 63  t enc,.  const c
5760: 68 61 72 20 2a 7a 4e 61 6d 65 0a 29 7b 0a 20 20  har *zName.){.  
5770: 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20  SqliteDb *pDb = 
5780: 28 53 71 6c 69 74 65 44 62 20 2a 29 70 43 74 78  (SqliteDb *)pCtx
5790: 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 53 63  ;.  Tcl_Obj *pSc
57a0: 72 69 70 74 20 3d 20 54 63 6c 5f 44 75 70 6c 69  ript = Tcl_Dupli
57b0: 63 61 74 65 4f 62 6a 28 70 44 62 2d 3e 70 43 6f  cateObj(pDb->pCo
57c0: 6c 6c 61 74 65 4e 65 65 64 65 64 29 3b 0a 20 20  llateNeeded);.  
57d0: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
57e0: 28 70 53 63 72 69 70 74 29 3b 0a 20 20 54 63 6c  (pScript);.  Tcl
57f0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
5800: 65 6d 65 6e 74 28 30 2c 20 70 53 63 72 69 70 74  ement(0, pScript
5810: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
5820: 62 6a 28 7a 4e 61 6d 65 2c 20 2d 31 29 29 3b 0a  bj(zName, -1));.
5830: 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28    Tcl_EvalObjEx(
5840: 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20 70 53 63  pDb->interp, pSc
5850: 72 69 70 74 2c 20 30 29 3b 0a 20 20 54 63 6c 5f  ript, 0);.  Tcl_
5860: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 53 63  DecrRefCount(pSc
5870: 72 69 70 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ript);.}../*.** 
5880: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
5890: 63 61 6c 6c 65 64 20 74 6f 20 65 76 61 6c 75 61  called to evalua
58a0: 74 65 20 61 6e 20 53 51 4c 20 63 6f 6c 6c 61 74  te an SQL collat
58b0: 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 69 6d 70  ion function imp
58c0: 6c 65 6d 65 6e 74 65 64 0a 2a 2a 20 75 73 69 6e  lemented.** usin
58d0: 67 20 54 43 4c 20 73 63 72 69 70 74 2e 0a 2a 2f  g TCL script..*/
58e0: 0a 73 74 61 74 69 63 20 69 6e 74 20 74 63 6c 53  .static int tclS
58f0: 71 6c 43 6f 6c 6c 61 74 65 28 0a 20 20 76 6f 69  qlCollate(.  voi
5900: 64 20 2a 70 43 74 78 2c 0a 20 20 69 6e 74 20 6e  d *pCtx,.  int n
5910: 41 2c 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  A,.  const void 
5920: 2a 7a 41 2c 0a 20 20 69 6e 74 20 6e 42 2c 0a 20  *zA,.  int nB,. 
5930: 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 42 0a   const void *zB.
5940: 29 7b 0a 20 20 53 71 6c 43 6f 6c 6c 61 74 65 20  ){.  SqlCollate 
5950: 2a 70 20 3d 20 28 53 71 6c 43 6f 6c 6c 61 74 65  *p = (SqlCollate
5960: 20 2a 29 70 43 74 78 3b 0a 20 20 54 63 6c 5f 4f   *)pCtx;.  Tcl_O
5970: 62 6a 20 2a 70 43 6d 64 3b 0a 0a 20 20 70 43 6d  bj *pCmd;..  pCm
5980: 64 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  d = Tcl_NewStrin
5990: 67 4f 62 6a 28 70 2d 3e 7a 53 63 72 69 70 74 2c  gObj(p->zScript,
59a0: 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 49 6e 63 72   -1);.  Tcl_Incr
59b0: 52 65 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a  RefCount(pCmd);.
59c0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
59d0: 65 6e 64 45 6c 65 6d 65 6e 74 28 70 2d 3e 69 6e  endElement(p->in
59e0: 74 65 72 70 2c 20 70 43 6d 64 2c 20 54 63 6c 5f  terp, pCmd, Tcl_
59f0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 41 2c  NewStringObj(zA,
5a00: 20 6e 41 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73   nA));.  Tcl_Lis
5a10: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
5a20: 74 28 70 2d 3e 69 6e 74 65 72 70 2c 20 70 43 6d  t(p->interp, pCm
5a30: 64 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  d, Tcl_NewString
5a40: 4f 62 6a 28 7a 42 2c 20 6e 42 29 29 3b 0a 20 20  Obj(zB, nB));.  
5a50: 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70 2d  Tcl_EvalObjEx(p-
5a60: 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c 20 54  >interp, pCmd, T
5a70: 43 4c 5f 45 56 41 4c 5f 44 49 52 45 43 54 29 3b  CL_EVAL_DIRECT);
5a80: 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f  .  Tcl_DecrRefCo
5a90: 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20 72 65 74  unt(pCmd);.  ret
5aa0: 75 72 6e 20 28 61 74 6f 69 28 54 63 6c 5f 47 65  urn (atoi(Tcl_Ge
5ab0: 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28 70 2d  tStringResult(p-
5ac0: 3e 69 6e 74 65 72 70 29 29 29 3b 0a 7d 0a 0a 2f  >interp)));.}../
5ad0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
5ae0: 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 65  e is called to e
5af0: 76 61 6c 75 61 74 65 20 61 6e 20 53 51 4c 20 66  valuate an SQL f
5b00: 75 6e 63 74 69 6f 6e 20 69 6d 70 6c 65 6d 65 6e  unction implemen
5b10: 74 65 64 0a 2a 2a 20 75 73 69 6e 67 20 54 43 4c  ted.** using TCL
5b20: 20 73 63 72 69 70 74 2e 0a 2a 2f 0a 73 74 61 74   script..*/.stat
5b30: 69 63 20 76 6f 69 64 20 74 63 6c 53 71 6c 46 75  ic void tclSqlFu
5b40: 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  nc(sqlite3_conte
5b50: 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 69 6e 74  xt *context, int
5b60: 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76   argc, sqlite3_v
5b70: 61 6c 75 65 2a 2a 61 72 67 76 29 7b 0a 20 20 53  alue**argv){.  S
5b80: 71 6c 46 75 6e 63 20 2a 70 20 3d 20 73 71 6c 69  qlFunc *p = sqli
5b90: 74 65 33 5f 75 73 65 72 5f 64 61 74 61 28 63 6f  te3_user_data(co
5ba0: 6e 74 65 78 74 29 3b 0a 20 20 54 63 6c 5f 4f 62  ntext);.  Tcl_Ob
5bb0: 6a 20 2a 70 43 6d 64 3b 0a 20 20 69 6e 74 20 69  j *pCmd;.  int i
5bc0: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69  ;.  int rc;..  i
5bd0: 66 28 20 61 72 67 63 3d 3d 30 20 29 7b 0a 20 20  f( argc==0 ){.  
5be0: 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72    /* If there ar
5bf0: 65 20 6e 6f 20 61 72 67 75 6d 65 6e 74 73 20 74  e no arguments t
5c00: 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 2c 20  o the function, 
5c10: 63 61 6c 6c 20 54 63 6c 5f 45 76 61 6c 4f 62 6a  call Tcl_EvalObj
5c20: 45 78 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a  Ex on the.    **
5c30: 20 73 63 72 69 70 74 20 6f 62 6a 65 63 74 20 64   script object d
5c40: 69 72 65 63 74 6c 79 2e 20 20 54 68 69 73 20 61  irectly.  This a
5c50: 6c 6c 6f 77 73 20 74 68 65 20 54 43 4c 20 63 6f  llows the TCL co
5c60: 6d 70 69 6c 65 72 20 74 6f 20 67 65 6e 65 72 61  mpiler to genera
5c70: 74 65 0a 20 20 20 20 2a 2a 20 62 79 74 65 63 6f  te.    ** byteco
5c80: 64 65 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d 61  de for the comma
5c90: 6e 64 20 6f 6e 20 74 68 65 20 66 69 72 73 74 20  nd on the first 
5ca0: 69 6e 76 6f 63 61 74 69 6f 6e 20 61 6e 64 20 74  invocation and t
5cb0: 68 75 73 20 6d 61 6b 65 0a 20 20 20 20 2a 2a 20  hus make.    ** 
5cc0: 73 75 62 73 65 71 75 65 6e 74 20 69 6e 76 6f 63  subsequent invoc
5cd0: 61 74 69 6f 6e 73 20 6d 75 63 68 20 66 61 73 74  ations much fast
5ce0: 65 72 2e 20 2a 2f 0a 20 20 20 20 70 43 6d 64 20  er. */.    pCmd 
5cf0: 3d 20 70 2d 3e 70 53 63 72 69 70 74 3b 0a 20 20  = p->pScript;.  
5d00: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
5d10: 6e 74 28 70 43 6d 64 29 3b 0a 20 20 20 20 72 63  nt(pCmd);.    rc
5d20: 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78   = Tcl_EvalObjEx
5d30: 28 70 2d 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64  (p->interp, pCmd
5d40: 2c 20 30 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65  , 0);.    Tcl_De
5d50: 63 72 52 65 66 43 6f 75 6e 74 28 70 43 6d 64 29  crRefCount(pCmd)
5d60: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
5d70: 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 61  * If there are a
5d80: 72 67 75 6d 65 6e 74 73 20 74 6f 20 74 68 65 20  rguments to the 
5d90: 66 75 6e 63 74 69 6f 6e 2c 20 6d 61 6b 65 20 61  function, make a
5da0: 20 73 68 61 6c 6c 6f 77 20 63 6f 70 79 20 6f 66   shallow copy of
5db0: 20 74 68 65 0a 20 20 20 20 2a 2a 20 73 63 72 69   the.    ** scri
5dc0: 70 74 20 6f 62 6a 65 63 74 2c 20 6c 61 70 70 65  pt object, lappe
5dd0: 6e 64 20 74 68 65 20 61 72 67 75 6d 65 6e 74 73  nd the arguments
5de0: 2c 20 74 68 65 6e 20 65 76 61 6c 75 61 74 65 20  , then evaluate 
5df0: 74 68 65 20 63 6f 70 79 2e 0a 20 20 20 20 2a 2a  the copy..    **
5e00: 0a 20 20 20 20 2a 2a 20 42 79 20 22 73 68 61 6c  .    ** By "shal
5e10: 6c 6f 77 22 20 63 6f 70 79 2c 20 77 65 20 6d 65  low" copy, we me
5e20: 61 6e 20 61 20 6f 6e 6c 79 20 74 68 65 20 6f 75  an a only the ou
5e30: 74 65 72 20 6c 69 73 74 20 54 63 6c 5f 4f 62 6a  ter list Tcl_Obj
5e40: 20 69 73 20 64 75 70 6c 69 63 61 74 65 64 2e 0a   is duplicated..
5e50: 20 20 20 20 2a 2a 20 54 68 65 20 6e 65 77 20 54      ** The new T
5e60: 63 6c 5f 4f 62 6a 20 63 6f 6e 74 61 69 6e 73 20  cl_Obj contains 
5e70: 70 6f 69 6e 74 65 72 73 20 74 6f 20 74 68 65 20  pointers to the 
5e80: 6f 72 69 67 69 6e 61 6c 20 6c 69 73 74 20 65 6c  original list el
5e90: 65 6d 65 6e 74 73 2e 20 0a 20 20 20 20 2a 2a 20  ements. .    ** 
5ea0: 54 68 61 74 20 77 61 79 2c 20 77 68 65 6e 20 54  That way, when T
5eb0: 63 6c 5f 45 76 61 6c 4f 62 6a 76 28 29 20 69 73  cl_EvalObjv() is
5ec0: 20 72 75 6e 20 61 6e 64 20 73 68 69 6d 6d 65 72   run and shimmer
5ed0: 73 20 74 68 65 20 66 69 72 73 74 20 65 6c 65 6d  s the first elem
5ee0: 65 6e 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68  ent.    ** of th
5ef0: 65 20 6c 69 73 74 20 74 6f 20 74 63 6c 43 6d 64  e list to tclCmd
5f00: 4e 61 6d 65 54 79 70 65 2c 20 74 68 61 74 20 61  NameType, that a
5f10: 6c 74 65 72 6e 61 74 65 20 72 65 70 72 65 73 65  lternate represe
5f20: 6e 74 61 74 69 6f 6e 20 77 69 6c 6c 0a 20 20 20  ntation will.   
5f30: 20 2a 2a 20 62 65 20 70 72 65 73 65 72 76 65 64   ** be preserved
5f40: 20 61 6e 64 20 72 65 75 73 65 64 20 6f 6e 20 74   and reused on t
5f50: 68 65 20 6e 65 78 74 20 69 6e 76 6f 63 61 74 69  he next invocati
5f60: 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 54  on..    */.    T
5f70: 63 6c 5f 4f 62 6a 20 2a 2a 61 41 72 67 3b 0a 20  cl_Obj **aArg;. 
5f80: 20 20 20 69 6e 74 20 6e 41 72 67 3b 0a 20 20 20     int nArg;.   
5f90: 20 69 66 28 20 54 63 6c 5f 4c 69 73 74 4f 62 6a   if( Tcl_ListObj
5fa0: 47 65 74 45 6c 65 6d 65 6e 74 73 28 70 2d 3e 69  GetElements(p->i
5fb0: 6e 74 65 72 70 2c 20 70 2d 3e 70 53 63 72 69 70  nterp, p->pScrip
5fc0: 74 2c 20 26 6e 41 72 67 2c 20 26 61 41 72 67 29  t, &nArg, &aArg)
5fd0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
5fe0: 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63  3_result_error(c
5ff0: 6f 6e 74 65 78 74 2c 20 54 63 6c 5f 47 65 74 53  ontext, Tcl_GetS
6000: 74 72 69 6e 67 52 65 73 75 6c 74 28 70 2d 3e 69  tringResult(p->i
6010: 6e 74 65 72 70 29 2c 20 2d 31 29 3b 20 0a 20 20  nterp), -1); .  
6020: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
6030: 7d 20 20 20 20 20 0a 20 20 20 20 70 43 6d 64 20  }     .    pCmd 
6040: 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a  = Tcl_NewListObj
6050: 28 6e 41 72 67 2c 20 61 41 72 67 29 3b 0a 20 20  (nArg, aArg);.  
6060: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
6070: 6e 74 28 70 43 6d 64 29 3b 0a 20 20 20 20 66 6f  nt(pCmd);.    fo
6080: 72 28 69 3d 30 3b 20 69 3c 61 72 67 63 3b 20 69  r(i=0; i<argc; i
6090: 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
60a0: 65 33 5f 76 61 6c 75 65 20 2a 70 49 6e 20 3d 20  e3_value *pIn = 
60b0: 61 72 67 76 5b 69 5d 3b 0a 20 20 20 20 20 20 54  argv[i];.      T
60c0: 63 6c 5f 4f 62 6a 20 2a 70 56 61 6c 3b 0a 20 20  cl_Obj *pVal;.  
60d0: 20 20 20 20 20 20 20 20 20 20 0a 20 20 20 20 20            .     
60e0: 20 2f 2a 20 53 65 74 20 70 56 61 6c 20 74 6f 20   /* Set pVal to 
60f0: 63 6f 6e 74 61 69 6e 20 74 68 65 20 69 27 74 68  contain the i'th
6100: 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 69 73 20   column of this 
6110: 72 6f 77 2e 20 2a 2f 0a 20 20 20 20 20 20 73 77  row. */.      sw
6120: 69 74 63 68 28 20 73 71 6c 69 74 65 33 5f 76 61  itch( sqlite3_va
6130: 6c 75 65 5f 74 79 70 65 28 70 49 6e 29 20 29 7b  lue_type(pIn) ){
6140: 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51  .        case SQ
6150: 4c 49 54 45 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20  LITE_BLOB: {.   
6160: 20 20 20 20 20 20 20 69 6e 74 20 62 79 74 65 73         int bytes
6170: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
6180: 5f 62 79 74 65 73 28 70 49 6e 29 3b 0a 20 20 20  _bytes(pIn);.   
6190: 20 20 20 20 20 20 20 70 56 61 6c 20 3d 20 54 63         pVal = Tc
61a0: 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62  l_NewByteArrayOb
61b0: 6a 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  j(sqlite3_value_
61c0: 62 6c 6f 62 28 70 49 6e 29 2c 20 62 79 74 65 73  blob(pIn), bytes
61d0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  );.          bre
61e0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
61f0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
6200: 45 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20  E_INTEGER: {.   
6210: 20 20 20 20 20 20 20 73 71 6c 69 74 65 5f 69 6e         sqlite_in
6220: 74 36 34 20 76 20 3d 20 73 71 6c 69 74 65 33 5f  t64 v = sqlite3_
6230: 76 61 6c 75 65 5f 69 6e 74 36 34 28 70 49 6e 29  value_int64(pIn)
6240: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
6250: 76 3e 3d 2d 32 31 34 37 34 38 33 36 34 37 20 26  v>=-2147483647 &
6260: 26 20 76 3c 3d 32 31 34 37 34 38 33 36 34 37 20  & v<=2147483647 
6270: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
6280: 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 49 6e 74  Val = Tcl_NewInt
6290: 4f 62 6a 28 28 69 6e 74 29 76 29 3b 0a 20 20 20  Obj((int)v);.   
62a0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
62b0: 20 20 20 20 20 20 20 20 20 20 70 56 61 6c 20 3d            pVal =
62c0: 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f   Tcl_NewWideIntO
62d0: 62 6a 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20  bj(v);.         
62e0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 62 72 65   }.          bre
62f0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
6300: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
6310: 45 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20  E_FLOAT: {.     
6320: 20 20 20 20 20 64 6f 75 62 6c 65 20 72 20 3d 20       double r = 
6330: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f  sqlite3_value_do
6340: 75 62 6c 65 28 70 49 6e 29 3b 0a 20 20 20 20 20  uble(pIn);.     
6350: 20 20 20 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f       pVal = Tcl_
6360: 4e 65 77 44 6f 75 62 6c 65 4f 62 6a 28 72 29 3b  NewDoubleObj(r);
6370: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
6380: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
6390: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
63a0: 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 20 20  NULL: {.        
63b0: 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77    pVal = Tcl_New
63c0: 53 74 72 69 6e 67 4f 62 6a 28 70 2d 3e 70 44 62  StringObj(p->pDb
63d0: 2d 3e 7a 4e 75 6c 6c 2c 20 2d 31 29 3b 0a 20 20  ->zNull, -1);.  
63e0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
63f0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
6400: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
6410: 20 20 20 20 20 20 69 6e 74 20 62 79 74 65 73 20        int bytes 
6420: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
6430: 62 79 74 65 73 28 70 49 6e 29 3b 0a 20 20 20 20  bytes(pIn);.    
6440: 20 20 20 20 20 20 70 56 61 6c 20 3d 20 54 63 6c        pVal = Tcl
6450: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 28 63  _NewStringObj((c
6460: 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 76 61  har *)sqlite3_va
6470: 6c 75 65 5f 74 65 78 74 28 70 49 6e 29 2c 20 62  lue_text(pIn), b
6480: 79 74 65 73 29 3b 0a 20 20 20 20 20 20 20 20 20  ytes);.         
6490: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
64a0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
64b0: 72 63 20 3d 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  rc = Tcl_ListObj
64c0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 70 2d  AppendElement(p-
64d0: 3e 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c 20 70  >interp, pCmd, p
64e0: 56 61 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Val);.      if( 
64f0: 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63  rc ){.        Tc
6500: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70  l_DecrRefCount(p
6510: 43 6d 64 29 3b 0a 20 20 20 20 20 20 20 20 73 71  Cmd);.        sq
6520: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72  lite3_result_err
6530: 6f 72 28 63 6f 6e 74 65 78 74 2c 20 54 63 6c 5f  or(context, Tcl_
6540: 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28  GetStringResult(
6550: 70 2d 3e 69 6e 74 65 72 70 29 2c 20 2d 31 29 3b  p->interp), -1);
6560: 20 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e   .        return
6570: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
6580: 20 20 20 20 69 66 28 20 21 70 2d 3e 75 73 65 45      if( !p->useE
6590: 76 61 6c 4f 62 6a 76 20 29 7b 0a 20 20 20 20 20  valObjv ){.     
65a0: 20 2f 2a 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45   /* Tcl_EvalObjE
65b0: 78 28 29 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74  x() will automat
65c0: 69 63 61 6c 6c 79 20 63 61 6c 6c 20 54 63 6c 5f  ically call Tcl_
65d0: 45 76 61 6c 4f 62 6a 76 28 29 20 69 66 20 70 43  EvalObjv() if pC
65e0: 6d 64 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 61  md.      ** is a
65f0: 20 6c 69 73 74 20 77 69 74 68 6f 75 74 20 61 20   list without a 
6600: 73 74 72 69 6e 67 20 72 65 70 72 65 73 65 6e 74  string represent
6610: 61 74 69 6f 6e 2e 20 20 54 6f 20 70 72 65 76 65  ation.  To preve
6620: 6e 74 20 74 68 69 73 20 66 72 6f 6d 0a 20 20 20  nt this from.   
6630: 20 20 20 2a 2a 20 68 61 70 70 65 6e 69 6e 67 2c     ** happening,
6640: 20 6d 61 6b 65 20 73 75 72 65 20 70 43 6d 64 20   make sure pCmd 
6650: 68 61 73 20 61 20 76 61 6c 69 64 20 73 74 72 69  has a valid stri
6660: 6e 67 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  ng representatio
6670: 6e 20 2a 2f 0a 20 20 20 20 20 20 54 63 6c 5f 47  n */.      Tcl_G
6680: 65 74 53 74 72 69 6e 67 28 70 43 6d 64 29 3b 0a  etString(pCmd);.
6690: 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 54      }.    rc = T
66a0: 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70 2d 3e  cl_EvalObjEx(p->
66b0: 69 6e 74 65 72 70 2c 20 70 43 6d 64 2c 20 54 43  interp, pCmd, TC
66c0: 4c 5f 45 56 41 4c 5f 44 49 52 45 43 54 29 3b 0a  L_EVAL_DIRECT);.
66d0: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
66e0: 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20 7d 0a  ount(pCmd);.  }.
66f0: 0a 20 20 69 66 28 20 72 63 20 26 26 20 72 63 21  .  if( rc && rc!
6700: 3d 54 43 4c 5f 52 45 54 55 52 4e 20 29 7b 0a 20  =TCL_RETURN ){. 
6710: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
6720: 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c  t_error(context,
6730: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65   Tcl_GetStringRe
6740: 73 75 6c 74 28 70 2d 3e 69 6e 74 65 72 70 29 2c  sult(p->interp),
6750: 20 2d 31 29 3b 20 0a 20 20 7d 65 6c 73 65 7b 0a   -1); .  }else{.
6760: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 56 61      Tcl_Obj *pVa
6770: 72 20 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65  r = Tcl_GetObjRe
6780: 73 75 6c 74 28 70 2d 3e 69 6e 74 65 72 70 29 3b  sult(p->interp);
6790: 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20  .    int n;.    
67a0: 75 38 20 2a 64 61 74 61 3b 0a 20 20 20 20 63 6f  u8 *data;.    co
67b0: 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 20  nst char *zType 
67c0: 3d 20 28 70 56 61 72 2d 3e 74 79 70 65 50 74 72  = (pVar->typePtr
67d0: 20 3f 20 70 56 61 72 2d 3e 74 79 70 65 50 74 72   ? pVar->typePtr
67e0: 2d 3e 6e 61 6d 65 20 3a 20 22 22 29 3b 0a 20 20  ->name : "");.  
67f0: 20 20 63 68 61 72 20 63 20 3d 20 7a 54 79 70 65    char c = zType
6800: 5b 30 5d 3b 0a 20 20 20 20 69 66 28 20 63 3d 3d  [0];.    if( c==
6810: 27 62 27 20 26 26 20 73 74 72 63 6d 70 28 7a 54  'b' && strcmp(zT
6820: 79 70 65 2c 22 62 79 74 65 61 72 72 61 79 22 29  ype,"bytearray")
6830: 3d 3d 30 20 26 26 20 70 56 61 72 2d 3e 62 79 74  ==0 && pVar->byt
6840: 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  es==0 ){.      /
6850: 2a 20 4f 6e 6c 79 20 72 65 74 75 72 6e 20 61 20  * Only return a 
6860: 42 4c 4f 42 20 74 79 70 65 20 69 66 20 74 68 65  BLOB type if the
6870: 20 54 63 6c 20 76 61 72 69 61 62 6c 65 20 69 73   Tcl variable is
6880: 20 61 20 62 79 74 65 61 72 72 61 79 20 61 6e 64   a bytearray and
6890: 0a 20 20 20 20 20 20 2a 2a 20 68 61 73 20 6e 6f  .      ** has no
68a0: 20 73 74 72 69 6e 67 20 72 65 70 72 65 73 65 6e   string represen
68b0: 74 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20  tation. */.     
68c0: 20 64 61 74 61 20 3d 20 54 63 6c 5f 47 65 74 42   data = Tcl_GetB
68d0: 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28  yteArrayFromObj(
68e0: 70 56 61 72 2c 20 26 6e 29 3b 0a 20 20 20 20 20  pVar, &n);.     
68f0: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
6900: 62 6c 6f 62 28 63 6f 6e 74 65 78 74 2c 20 64 61  blob(context, da
6910: 74 61 2c 20 6e 2c 20 53 51 4c 49 54 45 5f 54 52  ta, n, SQLITE_TR
6920: 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 7d 65  ANSIENT);.    }e
6930: 6c 73 65 20 69 66 28 20 63 3d 3d 27 62 27 20 26  lse if( c=='b' &
6940: 26 20 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22  & strcmp(zType,"
6950: 62 6f 6f 6c 65 61 6e 22 29 3d 3d 30 20 29 7b 0a  boolean")==0 ){.
6960: 20 20 20 20 20 20 54 63 6c 5f 47 65 74 49 6e 74        Tcl_GetInt
6970: 46 72 6f 6d 4f 62 6a 28 30 2c 20 70 56 61 72 2c  FromObj(0, pVar,
6980: 20 26 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   &n);.      sqli
6990: 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63  te3_result_int(c
69a0: 6f 6e 74 65 78 74 2c 20 6e 29 3b 0a 20 20 20 20  ontext, n);.    
69b0: 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 64 27  }else if( c=='d'
69c0: 20 26 26 20 73 74 72 63 6d 70 28 7a 54 79 70 65   && strcmp(zType
69d0: 2c 22 64 6f 75 62 6c 65 22 29 3d 3d 30 20 29 7b  ,"double")==0 ){
69e0: 0a 20 20 20 20 20 20 64 6f 75 62 6c 65 20 72 3b  .      double r;
69f0: 0a 20 20 20 20 20 20 54 63 6c 5f 47 65 74 44 6f  .      Tcl_GetDo
6a00: 75 62 6c 65 46 72 6f 6d 4f 62 6a 28 30 2c 20 70  ubleFromObj(0, p
6a10: 56 61 72 2c 20 26 72 29 3b 0a 20 20 20 20 20 20  Var, &r);.      
6a20: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 64  sqlite3_result_d
6a30: 6f 75 62 6c 65 28 63 6f 6e 74 65 78 74 2c 20 72  ouble(context, r
6a40: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
6a50: 20 28 63 3d 3d 27 77 27 20 26 26 20 73 74 72 63   (c=='w' && strc
6a60: 6d 70 28 7a 54 79 70 65 2c 22 77 69 64 65 49 6e  mp(zType,"wideIn
6a70: 74 22 29 3d 3d 30 29 20 7c 7c 0a 20 20 20 20 20  t")==0) ||.     
6a80: 20 20 20 20 20 28 63 3d 3d 27 69 27 20 26 26 20       (c=='i' && 
6a90: 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22 69 6e  strcmp(zType,"in
6aa0: 74 22 29 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20  t")==0) ){.     
6ab0: 20 54 63 6c 5f 57 69 64 65 49 6e 74 20 76 3b 0a   Tcl_WideInt v;.
6ac0: 20 20 20 20 20 20 54 63 6c 5f 47 65 74 57 69 64        Tcl_GetWid
6ad0: 65 49 6e 74 46 72 6f 6d 4f 62 6a 28 30 2c 20 70  eIntFromObj(0, p
6ae0: 56 61 72 2c 20 26 76 29 3b 0a 20 20 20 20 20 20  Var, &v);.      
6af0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69  sqlite3_result_i
6b00: 6e 74 36 34 28 63 6f 6e 74 65 78 74 2c 20 76 29  nt64(context, v)
6b10: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
6b20: 20 20 20 64 61 74 61 20 3d 20 28 75 6e 73 69 67     data = (unsig
6b30: 6e 65 64 20 63 68 61 72 20 2a 29 54 63 6c 5f 47  ned char *)Tcl_G
6b40: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
6b50: 70 56 61 72 2c 20 26 6e 29 3b 0a 20 20 20 20 20  pVar, &n);.     
6b60: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
6b70: 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 28 63  text(context, (c
6b80: 68 61 72 20 2a 29 64 61 74 61 2c 20 6e 2c 20 53  har *)data, n, S
6b90: 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
6ba0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23  ;.    }.  }.}..#
6bb0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
6bc0: 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e  IT_AUTHORIZATION
6bd0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74  ./*.** This is t
6be0: 68 65 20 61 75 74 68 65 6e 74 69 63 61 74 69 6f  he authenticatio
6bf0: 6e 20 66 75 6e 63 74 69 6f 6e 2e 20 20 49 74 20  n function.  It 
6c00: 61 70 70 65 6e 64 73 20 74 68 65 20 61 75 74 68  appends the auth
6c10: 65 6e 74 69 63 61 74 69 6f 6e 0a 2a 2a 20 74 79  entication.** ty
6c20: 70 65 20 63 6f 64 65 20 61 6e 64 20 74 68 65 20  pe code and the 
6c30: 74 77 6f 20 61 72 67 75 6d 65 6e 74 73 20 74 6f  two arguments to
6c40: 20 7a 43 6d 64 5b 5d 20 74 68 65 6e 20 69 6e 76   zCmd[] then inv
6c50: 6f 6b 65 73 20 74 68 65 20 72 65 73 75 6c 74 0a  okes the result.
6c60: 2a 2a 20 6f 6e 20 74 68 65 20 69 6e 74 65 72 70  ** on the interp
6c70: 72 65 74 65 72 2e 20 20 54 68 65 20 72 65 70 6c  reter.  The repl
6c80: 79 20 69 73 20 65 78 61 6d 69 6e 65 64 20 74 6f  y is examined to
6c90: 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68   determine if th
6ca0: 65 0a 2a 2a 20 61 75 74 68 65 6e 74 69 63 61 74  e.** authenticat
6cb0: 69 6f 6e 20 66 61 69 6c 73 20 6f 72 20 73 75 63  ion fails or suc
6cc0: 63 65 65 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  ceeds..*/.static
6cd0: 20 69 6e 74 20 61 75 74 68 5f 63 61 6c 6c 62 61   int auth_callba
6ce0: 63 6b 28 0a 20 20 76 6f 69 64 20 2a 70 41 72 67  ck(.  void *pArg
6cf0: 2c 0a 20 20 69 6e 74 20 63 6f 64 65 2c 0a 20 20  ,.  int code,.  
6d00: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67  const char *zArg
6d10: 31 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  1,.  const char 
6d20: 2a 7a 41 72 67 32 2c 0a 20 20 63 6f 6e 73 74 20  *zArg2,.  const 
6d30: 63 68 61 72 20 2a 7a 41 72 67 33 2c 0a 20 20 63  char *zArg3,.  c
6d40: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67 34  onst char *zArg4
6d50: 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  .){.  const char
6d60: 20 2a 7a 43 6f 64 65 3b 0a 20 20 54 63 6c 5f 44   *zCode;.  Tcl_D
6d70: 53 74 72 69 6e 67 20 73 74 72 3b 0a 20 20 69 6e  String str;.  in
6d80: 74 20 72 63 3b 0a 20 20 63 6f 6e 73 74 20 63 68  t rc;.  const ch
6d90: 61 72 20 2a 7a 52 65 70 6c 79 3b 0a 20 20 53 71  ar *zReply;.  Sq
6da0: 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53  liteDb *pDb = (S
6db0: 71 6c 69 74 65 44 62 2a 29 70 41 72 67 3b 0a 20  qliteDb*)pArg;. 
6dc0: 20 69 66 28 20 70 44 62 2d 3e 64 69 73 61 62 6c   if( pDb->disabl
6dd0: 65 41 75 74 68 20 29 20 72 65 74 75 72 6e 20 53  eAuth ) return S
6de0: 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 73 77 69  QLITE_OK;..  swi
6df0: 74 63 68 28 20 63 6f 64 65 20 29 7b 0a 20 20 20  tch( code ){.   
6e00: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 50   case SQLITE_COP
6e10: 59 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3a  Y              :
6e20: 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43   zCode="SQLITE_C
6e30: 4f 50 59 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  OPY"; break;.   
6e40: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 52 45   case SQLITE_CRE
6e50: 41 54 45 5f 49 4e 44 45 58 20 20 20 20 20 20 3a  ATE_INDEX      :
6e60: 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43   zCode="SQLITE_C
6e70: 52 45 41 54 45 5f 49 4e 44 45 58 22 3b 20 62 72  REATE_INDEX"; br
6e80: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
6e90: 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 41 42 4c  LITE_CREATE_TABL
6ea0: 45 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22  E      : zCode="
6eb0: 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 41  SQLITE_CREATE_TA
6ec0: 42 4c 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  BLE"; break;.   
6ed0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 52 45   case SQLITE_CRE
6ee0: 41 54 45 5f 54 45 4d 50 5f 49 4e 44 45 58 20 3a  ATE_TEMP_INDEX :
6ef0: 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43   zCode="SQLITE_C
6f00: 52 45 41 54 45 5f 54 45 4d 50 5f 49 4e 44 45 58  REATE_TEMP_INDEX
6f10: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
6f20: 73 65 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45  se SQLITE_CREATE
6f30: 5f 54 45 4d 50 5f 54 41 42 4c 45 20 3a 20 7a 43  _TEMP_TABLE : zC
6f40: 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43 52 45 41  ode="SQLITE_CREA
6f50: 54 45 5f 54 45 4d 50 5f 54 41 42 4c 45 22 3b 20  TE_TEMP_TABLE"; 
6f60: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
6f70: 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45  SQLITE_CREATE_TE
6f80: 4d 50 5f 54 52 49 47 47 45 52 3a 20 7a 43 6f 64  MP_TRIGGER: zCod
6f90: 65 3d 22 53 51 4c 49 54 45 5f 43 52 45 41 54 45  e="SQLITE_CREATE
6fa0: 5f 54 45 4d 50 5f 54 52 49 47 47 45 52 22 3b 20  _TEMP_TRIGGER"; 
6fb0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
6fc0: 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45  SQLITE_CREATE_TE
6fd0: 4d 50 5f 56 49 45 57 20 20 3a 20 7a 43 6f 64 65  MP_VIEW  : zCode
6fe0: 3d 22 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  ="SQLITE_CREATE_
6ff0: 54 45 4d 50 5f 56 49 45 57 22 3b 20 62 72 65 61  TEMP_VIEW"; brea
7000: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
7010: 54 45 5f 43 52 45 41 54 45 5f 54 52 49 47 47 45  TE_CREATE_TRIGGE
7020: 52 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51  R    : zCode="SQ
7030: 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 52 49 47  LITE_CREATE_TRIG
7040: 47 45 52 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  GER"; break;.   
7050: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 52 45   case SQLITE_CRE
7060: 41 54 45 5f 56 49 45 57 20 20 20 20 20 20 20 3a  ATE_VIEW       :
7070: 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43   zCode="SQLITE_C
7080: 52 45 41 54 45 5f 56 49 45 57 22 3b 20 62 72 65  REATE_VIEW"; bre
7090: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
70a0: 49 54 45 5f 44 45 4c 45 54 45 20 20 20 20 20 20  ITE_DELETE      
70b0: 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53        : zCode="S
70c0: 51 4c 49 54 45 5f 44 45 4c 45 54 45 22 3b 20 62  QLITE_DELETE"; b
70d0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
70e0: 51 4c 49 54 45 5f 44 52 4f 50 5f 49 4e 44 45 58  QLITE_DROP_INDEX
70f0: 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d          : zCode=
7100: 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f 49 4e 44  "SQLITE_DROP_IND
7110: 45 58 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  EX"; break;.    
7120: 63 61 73 65 20 53 51 4c 49 54 45 5f 44 52 4f 50  case SQLITE_DROP
7130: 5f 54 41 42 4c 45 20 20 20 20 20 20 20 20 3a 20  _TABLE        : 
7140: 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44 52  zCode="SQLITE_DR
7150: 4f 50 5f 54 41 42 4c 45 22 3b 20 62 72 65 61 6b  OP_TABLE"; break
7160: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
7170: 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 49 4e 44 45  E_DROP_TEMP_INDE
7180: 58 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c  X   : zCode="SQL
7190: 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 49 4e  ITE_DROP_TEMP_IN
71a0: 44 45 58 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  DEX"; break;.   
71b0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44 52 4f   case SQLITE_DRO
71c0: 50 5f 54 45 4d 50 5f 54 41 42 4c 45 20 20 20 3a  P_TEMP_TABLE   :
71d0: 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44   zCode="SQLITE_D
71e0: 52 4f 50 5f 54 45 4d 50 5f 54 41 42 4c 45 22 3b  ROP_TEMP_TABLE";
71f0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
7200: 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d   SQLITE_DROP_TEM
7210: 50 5f 54 52 49 47 47 45 52 20 3a 20 7a 43 6f 64  P_TRIGGER : zCod
7220: 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54  e="SQLITE_DROP_T
7230: 45 4d 50 5f 54 52 49 47 47 45 52 22 3b 20 62 72  EMP_TRIGGER"; br
7240: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
7250: 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 56  LITE_DROP_TEMP_V
7260: 49 45 57 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22  IEW    : zCode="
7270: 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50  SQLITE_DROP_TEMP
7280: 5f 56 49 45 57 22 3b 20 62 72 65 61 6b 3b 0a 20  _VIEW"; break;. 
7290: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44     case SQLITE_D
72a0: 52 4f 50 5f 54 52 49 47 47 45 52 20 20 20 20 20  ROP_TRIGGER     
72b0: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
72c0: 5f 44 52 4f 50 5f 54 52 49 47 47 45 52 22 3b 20  _DROP_TRIGGER"; 
72d0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
72e0: 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56 49 45 57  SQLITE_DROP_VIEW
72f0: 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65           : zCode
7300: 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56 49  ="SQLITE_DROP_VI
7310: 45 57 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  EW"; break;.    
7320: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 53 45  case SQLITE_INSE
7330: 52 54 20 20 20 20 20 20 20 20 20 20 20 20 3a 20  RT            : 
7340: 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 49 4e  zCode="SQLITE_IN
7350: 53 45 52 54 22 3b 20 62 72 65 61 6b 3b 0a 20 20  SERT"; break;.  
7360: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 50 52    case SQLITE_PR
7370: 41 47 4d 41 20 20 20 20 20 20 20 20 20 20 20 20  AGMA            
7380: 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f  : zCode="SQLITE_
7390: 50 52 41 47 4d 41 22 3b 20 62 72 65 61 6b 3b 0a  PRAGMA"; break;.
73a0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
73b0: 52 45 41 44 20 20 20 20 20 20 20 20 20 20 20 20  READ            
73c0: 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54    : zCode="SQLIT
73d0: 45 5f 52 45 41 44 22 3b 20 62 72 65 61 6b 3b 0a  E_READ"; break;.
73e0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
73f0: 53 45 4c 45 43 54 20 20 20 20 20 20 20 20 20 20  SELECT          
7400: 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54    : zCode="SQLIT
7410: 45 5f 53 45 4c 45 43 54 22 3b 20 62 72 65 61 6b  E_SELECT"; break
7420: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
7430: 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 20 20 20  E_TRANSACTION   
7440: 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c      : zCode="SQL
7450: 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 22  ITE_TRANSACTION"
7460: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
7470: 65 20 53 51 4c 49 54 45 5f 55 50 44 41 54 45 20  e SQLITE_UPDATE 
7480: 20 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f             : zCo
7490: 64 65 3d 22 53 51 4c 49 54 45 5f 55 50 44 41 54  de="SQLITE_UPDAT
74a0: 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  E"; break;.    c
74b0: 61 73 65 20 53 51 4c 49 54 45 5f 41 54 54 41 43  ase SQLITE_ATTAC
74c0: 48 20 20 20 20 20 20 20 20 20 20 20 20 3a 20 7a  H            : z
74d0: 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 41 54 54  Code="SQLITE_ATT
74e0: 41 43 48 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  ACH"; break;.   
74f0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44 45 54   case SQLITE_DET
7500: 41 43 48 20 20 20 20 20 20 20 20 20 20 20 20 3a  ACH            :
7510: 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44   zCode="SQLITE_D
7520: 45 54 41 43 48 22 3b 20 62 72 65 61 6b 3b 0a 20  ETACH"; break;. 
7530: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41     case SQLITE_A
7540: 4c 54 45 52 5f 54 41 42 4c 45 20 20 20 20 20 20  LTER_TABLE      
7550: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
7560: 5f 41 4c 54 45 52 5f 54 41 42 4c 45 22 3b 20 62  _ALTER_TABLE"; b
7570: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
7580: 51 4c 49 54 45 5f 52 45 49 4e 44 45 58 20 20 20  QLITE_REINDEX   
7590: 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d          : zCode=
75a0: 22 53 51 4c 49 54 45 5f 52 45 49 4e 44 45 58 22  "SQLITE_REINDEX"
75b0: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
75c0: 65 20 53 51 4c 49 54 45 5f 41 4e 41 4c 59 5a 45  e SQLITE_ANALYZE
75d0: 20 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f             : zCo
75e0: 64 65 3d 22 53 51 4c 49 54 45 5f 41 4e 41 4c 59  de="SQLITE_ANALY
75f0: 5a 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  ZE"; break;.    
7600: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 52 45 41  case SQLITE_CREA
7610: 54 45 5f 56 54 41 42 4c 45 20 20 20 20 20 3a 20  TE_VTABLE     : 
7620: 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43 52  zCode="SQLITE_CR
7630: 45 41 54 45 5f 56 54 41 42 4c 45 22 3b 20 62 72  EATE_VTABLE"; br
7640: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
7650: 4c 49 54 45 5f 44 52 4f 50 5f 56 54 41 42 4c 45  LITE_DROP_VTABLE
7660: 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22         : zCode="
7670: 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56 54 41 42  SQLITE_DROP_VTAB
7680: 4c 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  LE"; break;.    
7690: 63 61 73 65 20 53 51 4c 49 54 45 5f 46 55 4e 43  case SQLITE_FUNC
76a0: 54 49 4f 4e 20 20 20 20 20 20 20 20 20 20 3a 20  TION          : 
76b0: 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 46 55  zCode="SQLITE_FU
76c0: 4e 43 54 49 4f 4e 22 3b 20 62 72 65 61 6b 3b 0a  NCTION"; break;.
76d0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
76e0: 53 41 56 45 50 4f 49 4e 54 20 20 20 20 20 20 20  SAVEPOINT       
76f0: 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54    : zCode="SQLIT
7700: 45 5f 53 41 56 45 50 4f 49 4e 54 22 3b 20 62 72  E_SAVEPOINT"; br
7710: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
7720: 4c 49 54 45 5f 52 45 43 55 52 53 49 56 45 20 20  LITE_RECURSIVE  
7730: 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22         : zCode="
7740: 53 51 4c 49 54 45 5f 52 45 43 55 52 53 49 56 45  SQLITE_RECURSIVE
7750: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65  "; break;.    de
7760: 66 61 75 6c 74 20 20 20 20 20 20 20 20 20 20 20  fault           
7770: 20 20 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43              : zC
7780: 6f 64 65 3d 22 3f 3f 3f 3f 22 3b 20 62 72 65 61  ode="????"; brea
7790: 6b 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 44 53 74  k;.  }.  Tcl_DSt
77a0: 72 69 6e 67 49 6e 69 74 28 26 73 74 72 29 3b 0a  ringInit(&str);.
77b0: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70    Tcl_DStringApp
77c0: 65 6e 64 28 26 73 74 72 2c 20 70 44 62 2d 3e 7a  end(&str, pDb->z
77d0: 41 75 74 68 2c 20 2d 31 29 3b 0a 20 20 54 63 6c  Auth, -1);.  Tcl
77e0: 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64 45 6c  _DStringAppendEl
77f0: 65 6d 65 6e 74 28 26 73 74 72 2c 20 7a 43 6f 64  ement(&str, zCod
7800: 65 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e  e);.  Tcl_DStrin
7810: 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 26  gAppendElement(&
7820: 73 74 72 2c 20 7a 41 72 67 31 20 3f 20 7a 41 72  str, zArg1 ? zAr
7830: 67 31 20 3a 20 22 22 29 3b 0a 20 20 54 63 6c 5f  g1 : "");.  Tcl_
7840: 44 53 74 72 69 6e 67 41 70 70 65 6e 64 45 6c 65  DStringAppendEle
7850: 6d 65 6e 74 28 26 73 74 72 2c 20 7a 41 72 67 32  ment(&str, zArg2
7860: 20 3f 20 7a 41 72 67 32 20 3a 20 22 22 29 3b 0a   ? zArg2 : "");.
7870: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70    Tcl_DStringApp
7880: 65 6e 64 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c  endElement(&str,
7890: 20 7a 41 72 67 33 20 3f 20 7a 41 72 67 33 20 3a   zArg3 ? zArg3 :
78a0: 20 22 22 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72   "");.  Tcl_DStr
78b0: 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ingAppendElement
78c0: 28 26 73 74 72 2c 20 7a 41 72 67 34 20 3f 20 7a  (&str, zArg4 ? z
78d0: 41 72 67 34 20 3a 20 22 22 29 3b 0a 20 20 72 63  Arg4 : "");.  rc
78e0: 20 3d 20 54 63 6c 5f 47 6c 6f 62 61 6c 45 76 61   = Tcl_GlobalEva
78f0: 6c 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20 54  l(pDb->interp, T
7900: 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28  cl_DStringValue(
7910: 26 73 74 72 29 29 3b 0a 20 20 54 63 6c 5f 44 53  &str));.  Tcl_DS
7920: 74 72 69 6e 67 46 72 65 65 28 26 73 74 72 29 3b  tringFree(&str);
7930: 0a 20 20 7a 52 65 70 6c 79 20 3d 20 72 63 3d 3d  .  zReply = rc==
7940: 54 43 4c 5f 4f 4b 20 3f 20 54 63 6c 5f 47 65 74  TCL_OK ? Tcl_Get
7950: 53 74 72 69 6e 67 52 65 73 75 6c 74 28 70 44 62  StringResult(pDb
7960: 2d 3e 69 6e 74 65 72 70 29 20 3a 20 22 53 51 4c  ->interp) : "SQL
7970: 49 54 45 5f 44 45 4e 59 22 3b 0a 20 20 69 66 28  ITE_DENY";.  if(
7980: 20 73 74 72 63 6d 70 28 7a 52 65 70 6c 79 2c 22   strcmp(zReply,"
7990: 53 51 4c 49 54 45 5f 4f 4b 22 29 3d 3d 30 20 29  SQLITE_OK")==0 )
79a0: 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
79b0: 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 20 69 66  E_OK;.  }else if
79c0: 28 20 73 74 72 63 6d 70 28 7a 52 65 70 6c 79 2c  ( strcmp(zReply,
79d0: 22 53 51 4c 49 54 45 5f 44 45 4e 59 22 29 3d 3d  "SQLITE_DENY")==
79e0: 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  0 ){.    rc = SQ
79f0: 4c 49 54 45 5f 44 45 4e 59 3b 0a 20 20 7d 65 6c  LITE_DENY;.  }el
7a00: 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 52  se if( strcmp(zR
7a10: 65 70 6c 79 2c 22 53 51 4c 49 54 45 5f 49 47 4e  eply,"SQLITE_IGN
7a20: 4f 52 45 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ORE")==0 ){.    
7a30: 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 47 4e 4f  rc = SQLITE_IGNO
7a40: 52 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  RE;.  }else{.   
7a50: 20 72 63 20 3d 20 39 39 39 3b 0a 20 20 7d 0a 20   rc = 999;.  }. 
7a60: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65   return rc;.}.#e
7a70: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
7a80: 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f  MIT_AUTHORIZATIO
7a90: 4e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  N */../*.** This
7aa0: 20 72 6f 75 74 69 6e 65 20 72 65 61 64 73 20 61   routine reads a
7ab0: 20 6c 69 6e 65 20 6f 66 20 74 65 78 74 20 66 72   line of text fr
7ac0: 6f 6d 20 46 49 4c 45 20 69 6e 2c 20 73 74 6f 72  om FILE in, stor
7ad0: 65 73 0a 2a 2a 20 74 68 65 20 74 65 78 74 20 69  es.** the text i
7ae0: 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65  n memory obtaine
7af0: 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 20  d from malloc() 
7b00: 61 6e 64 20 72 65 74 75 72 6e 73 20 61 20 70 6f  and returns a po
7b10: 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20  inter.** to the 
7b20: 74 65 78 74 2e 20 20 4e 55 4c 4c 20 69 73 20 72  text.  NULL is r
7b30: 65 74 75 72 6e 65 64 20 61 74 20 65 6e 64 20 6f  eturned at end o
7b40: 66 20 66 69 6c 65 2c 20 6f 72 20 69 66 20 6d 61  f file, or if ma
7b50: 6c 6c 6f 63 28 29 0a 2a 2a 20 66 61 69 6c 73 2e  lloc().** fails.
7b60: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 74 65 72  .**.** The inter
7b70: 66 61 63 65 20 69 73 20 6c 69 6b 65 20 22 72 65  face is like "re
7b80: 61 64 6c 69 6e 65 22 20 62 75 74 20 6e 6f 20 63  adline" but no c
7b90: 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 65 64 69 74  ommand-line edit
7ba0: 69 6e 67 0a 2a 2a 20 69 73 20 64 6f 6e 65 2e 0a  ing.** is done..
7bb0: 2a 2a 0a 2a 2a 20 63 6f 70 69 65 64 20 66 72 6f  **.** copied fro
7bc0: 6d 20 73 68 65 6c 6c 2e 63 20 66 72 6f 6d 20 27  m shell.c from '
7bd0: 2e 69 6d 70 6f 72 74 27 20 63 6f 6d 6d 61 6e 64  .import' command
7be0: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
7bf0: 2a 6c 6f 63 61 6c 5f 67 65 74 6c 69 6e 65 28 63  *local_getline(c
7c00: 68 61 72 20 2a 7a 50 72 6f 6d 70 74 2c 20 46 49  har *zPrompt, FI
7c10: 4c 45 20 2a 69 6e 29 7b 0a 20 20 63 68 61 72 20  LE *in){.  char 
7c20: 2a 7a 4c 69 6e 65 3b 0a 20 20 69 6e 74 20 6e 4c  *zLine;.  int nL
7c30: 69 6e 65 3b 0a 20 20 69 6e 74 20 6e 3b 0a 0a 20  ine;.  int n;.. 
7c40: 20 6e 4c 69 6e 65 20 3d 20 31 30 30 3b 0a 20 20   nLine = 100;.  
7c50: 7a 4c 69 6e 65 20 3d 20 6d 61 6c 6c 6f 63 28 20  zLine = malloc( 
7c60: 6e 4c 69 6e 65 20 29 3b 0a 20 20 69 66 28 20 7a  nLine );.  if( z
7c70: 4c 69 6e 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  Line==0 ) return
7c80: 20 30 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20 20 77   0;.  n = 0;.  w
7c90: 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 69  hile( 1 ){.    i
7ca0: 66 28 20 6e 2b 31 30 30 3e 6e 4c 69 6e 65 20 29  f( n+100>nLine )
7cb0: 7b 0a 20 20 20 20 20 20 6e 4c 69 6e 65 20 3d 20  {.      nLine = 
7cc0: 6e 4c 69 6e 65 2a 32 20 2b 20 31 30 30 3b 0a 20  nLine*2 + 100;. 
7cd0: 20 20 20 20 20 7a 4c 69 6e 65 20 3d 20 72 65 61       zLine = rea
7ce0: 6c 6c 6f 63 28 7a 4c 69 6e 65 2c 20 6e 4c 69 6e  lloc(zLine, nLin
7cf0: 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 4c  e);.      if( zL
7d00: 69 6e 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ine==0 ) return 
7d10: 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  0;.    }.    if(
7d20: 20 66 67 65 74 73 28 26 7a 4c 69 6e 65 5b 6e 5d   fgets(&zLine[n]
7d30: 2c 20 6e 4c 69 6e 65 20 2d 20 6e 2c 20 69 6e 29  , nLine - n, in)
7d40: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==0 ){.      if(
7d50: 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20   n==0 ){.       
7d60: 20 66 72 65 65 28 7a 4c 69 6e 65 29 3b 0a 20 20   free(zLine);.  
7d70: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
7d80: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 4c        }.      zL
7d90: 69 6e 65 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20 20  ine[n] = 0;.    
7da0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
7db0: 20 20 20 77 68 69 6c 65 28 20 7a 4c 69 6e 65 5b     while( zLine[
7dc0: 6e 5d 20 29 7b 20 6e 2b 2b 3b 20 7d 0a 20 20 20  n] ){ n++; }.   
7dd0: 20 69 66 28 20 6e 3e 30 20 26 26 20 7a 4c 69 6e   if( n>0 && zLin
7de0: 65 5b 6e 2d 31 5d 3d 3d 27 5c 6e 27 20 29 7b 0a  e[n-1]=='\n' ){.
7df0: 20 20 20 20 20 20 6e 2d 2d 3b 0a 20 20 20 20 20        n--;.     
7e00: 20 7a 4c 69 6e 65 5b 6e 5d 20 3d 20 30 3b 0a 20   zLine[n] = 0;. 
7e10: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
7e20: 7d 0a 20 20 7d 0a 20 20 7a 4c 69 6e 65 20 3d 20  }.  }.  zLine = 
7e30: 72 65 61 6c 6c 6f 63 28 20 7a 4c 69 6e 65 2c 20  realloc( zLine, 
7e40: 6e 2b 31 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  n+1 );.  return 
7e50: 7a 4c 69 6e 65 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  zLine;.}.../*.**
7e60: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
7e70: 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 69 6d  s part of the im
7e80: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
7e90: 74 68 65 20 63 6f 6d 6d 61 6e 64 3a 0a 2a 2a 0a  the command:.**.
7ea0: 2a 2a 20 20 20 24 64 62 20 74 72 61 6e 73 61 63  **   $db transac
7eb0: 74 69 6f 6e 20 5b 2d 64 65 66 65 72 72 65 64 7c  tion [-deferred|
7ec0: 2d 69 6d 6d 65 64 69 61 74 65 7c 2d 65 78 63 6c  -immediate|-excl
7ed0: 75 73 69 76 65 5d 20 53 43 52 49 50 54 0a 2a 2a  usive] SCRIPT.**
7ee0: 0a 2a 2a 20 49 74 20 69 73 20 69 6e 76 6f 6b 65  .** It is invoke
7ef0: 64 20 61 66 74 65 72 20 65 76 61 6c 75 61 74 69  d after evaluati
7f00: 6e 67 20 74 68 65 20 73 63 72 69 70 74 20 53 43  ng the script SC
7f10: 52 49 50 54 20 74 6f 20 63 6f 6d 6d 69 74 20 6f  RIPT to commit o
7f20: 72 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 74 68  r rollback.** th
7f30: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 72  e transaction or
7f40: 20 73 61 76 65 70 6f 69 6e 74 20 6f 70 65 6e 65   savepoint opene
7f50: 64 20 62 79 20 74 68 65 20 5b 74 72 61 6e 73 61  d by the [transa
7f60: 63 74 69 6f 6e 5d 20 63 6f 6d 6d 61 6e 64 2e 0a  ction] command..
7f70: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 44 62  */.static int Db
7f80: 54 72 61 6e 73 50 6f 73 74 43 6d 64 28 0a 20 20  TransPostCmd(.  
7f90: 43 6c 69 65 6e 74 44 61 74 61 20 64 61 74 61 5b  ClientData data[
7fa0: 5d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ],              
7fb0: 20 20 20 20 20 2f 2a 20 64 61 74 61 5b 30 5d 20       /* data[0] 
7fc0: 69 73 20 74 68 65 20 53 71 6c 69 74 65 33 44 62  is the Sqlite3Db
7fd0: 2a 20 66 6f 72 20 24 64 62 20 2a 2f 0a 20 20 54  * for $db */.  T
7fe0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
7ff0: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
8000: 20 20 20 20 2f 2a 20 54 63 6c 20 69 6e 74 65 72      /* Tcl inter
8010: 70 72 65 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  preter */.  int 
8020: 72 65 73 75 6c 74 20 20 20 20 20 20 20 20 20 20  result          
8030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8040: 20 2f 2a 20 52 65 73 75 6c 74 20 6f 66 20 65 76   /* Result of ev
8050: 61 6c 75 61 74 69 6e 67 20 53 43 52 49 50 54 20  aluating SCRIPT 
8060: 2a 2f 0a 29 7b 0a 20 20 73 74 61 74 69 63 20 63  */.){.  static c
8070: 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 6e 73 74  onst char *const
8080: 20 61 7a 45 6e 64 5b 5d 20 3d 20 7b 0a 20 20 20   azEnd[] = {.   
8090: 20 22 52 45 4c 45 41 53 45 20 5f 74 63 6c 5f 74   "RELEASE _tcl_t
80a0: 72 61 6e 73 61 63 74 69 6f 6e 22 2c 20 20 20 20  ransaction",    
80b0: 20 20 20 20 2f 2a 20 72 63 3d 3d 54 43 4c 5f 45      /* rc==TCL_E
80c0: 52 52 4f 52 2c 20 6e 54 72 61 6e 73 61 63 74 69  RROR, nTransacti
80d0: 6f 6e 21 3d 30 20 2a 2f 0a 20 20 20 20 22 43 4f  on!=0 */.    "CO
80e0: 4d 4d 49 54 22 2c 20 20 20 20 20 20 20 20 20 20  MMIT",          
80f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8100: 2f 2a 20 72 63 21 3d 54 43 4c 5f 45 52 52 4f 52  /* rc!=TCL_ERROR
8110: 2c 20 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  , nTransaction==
8120: 30 20 2a 2f 0a 20 20 20 20 22 52 4f 4c 4c 42 41  0 */.    "ROLLBA
8130: 43 4b 20 54 4f 20 5f 74 63 6c 5f 74 72 61 6e 73  CK TO _tcl_trans
8140: 61 63 74 69 6f 6e 20 3b 20 52 45 4c 45 41 53 45  action ; RELEASE
8150: 20 5f 74 63 6c 5f 74 72 61 6e 73 61 63 74 69 6f   _tcl_transactio
8160: 6e 22 2c 0a 20 20 20 20 22 52 4f 4c 4c 42 41 43  n",.    "ROLLBAC
8170: 4b 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K"              
8180: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 72 63             /* rc
8190: 3d 3d 54 43 4c 5f 45 52 52 4f 52 2c 20 6e 54 72  ==TCL_ERROR, nTr
81a0: 61 6e 73 61 63 74 69 6f 6e 3d 3d 30 20 2a 2f 0a  ansaction==0 */.
81b0: 20 20 7d 3b 0a 20 20 53 71 6c 69 74 65 44 62 20    };.  SqliteDb 
81c0: 2a 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62  *pDb = (SqliteDb
81d0: 2a 29 64 61 74 61 5b 30 5d 3b 0a 20 20 69 6e 74  *)data[0];.  int
81e0: 20 72 63 20 3d 20 72 65 73 75 6c 74 3b 0a 20 20   rc = result;.  
81f0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 6e 64  const char *zEnd
8200: 3b 0a 0a 20 20 70 44 62 2d 3e 6e 54 72 61 6e 73  ;..  pDb->nTrans
8210: 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20 7a 45 6e 64  action--;.  zEnd
8220: 20 3d 20 61 7a 45 6e 64 5b 28 72 63 3d 3d 54 43   = azEnd[(rc==TC
8230: 4c 5f 45 52 52 4f 52 29 2a 32 20 2b 20 28 70 44  L_ERROR)*2 + (pD
8240: 62 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  b->nTransaction=
8250: 3d 30 29 5d 3b 0a 0a 20 20 70 44 62 2d 3e 64 69  =0)];..  pDb->di
8260: 73 61 62 6c 65 41 75 74 68 2b 2b 3b 0a 20 20 69  sableAuth++;.  i
8270: 66 28 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28  f( sqlite3_exec(
8280: 70 44 62 2d 3e 64 62 2c 20 7a 45 6e 64 2c 20 30  pDb->db, zEnd, 0
8290: 2c 20 30 2c 20 30 29 20 29 7b 0a 20 20 20 20 20  , 0, 0) ){.     
82a0: 20 2f 2a 20 54 68 69 73 20 69 73 20 61 20 74 72   /* This is a tr
82b0: 69 63 6b 79 20 73 63 65 6e 61 72 69 6f 20 74 6f  icky scenario to
82c0: 20 68 61 6e 64 6c 65 2e 20 54 68 65 20 6d 6f 73   handle. The mos
82d0: 74 20 6c 69 6b 65 6c 79 20 63 61 75 73 65 20 6f  t likely cause o
82e0: 66 20 61 6e 0a 20 20 20 20 20 20 2a 2a 20 65 72  f an.      ** er
82f0: 72 6f 72 20 69 73 20 74 68 61 74 20 74 68 65 20  ror is that the 
8300: 65 78 65 63 28 29 20 61 62 6f 76 65 20 77 61 73  exec() above was
8310: 20 61 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 63   an attempt to c
8320: 6f 6d 6d 69 74 20 74 68 65 20 0a 20 20 20 20 20  ommit the .     
8330: 20 2a 2a 20 74 6f 70 2d 6c 65 76 65 6c 20 74 72   ** top-level tr
8340: 61 6e 73 61 63 74 69 6f 6e 20 74 68 61 74 20 72  ansaction that r
8350: 65 74 75 72 6e 65 64 20 53 51 4c 49 54 45 5f 42  eturned SQLITE_B
8360: 55 53 59 2e 20 4f 72 2c 20 6c 65 73 73 20 6c 69  USY. Or, less li
8370: 6b 65 6c 79 2c 0a 20 20 20 20 20 20 2a 2a 20 74  kely,.      ** t
8380: 68 61 74 20 61 6e 20 49 4f 2d 65 72 72 6f 72 20  hat an IO-error 
8390: 68 61 73 20 6f 63 63 75 72 72 65 64 2e 20 49 6e  has occurred. In
83a0: 20 65 69 74 68 65 72 20 63 61 73 65 2c 20 74 68   either case, th
83b0: 72 6f 77 20 61 20 54 63 6c 20 65 78 63 65 70 74  row a Tcl except
83c0: 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64  ion.      ** and
83d0: 20 74 72 79 20 74 6f 20 72 6f 6c 6c 62 61 63 6b   try to rollback
83e0: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
83f0: 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
8400: 20 2a 2a 20 42 75 74 20 69 74 20 63 6f 75 6c 64   ** But it could
8410: 20 61 6c 73 6f 20 62 65 20 74 68 61 74 20 74 68   also be that th
8420: 65 20 75 73 65 72 20 65 78 65 63 75 74 65 64 20  e user executed 
8430: 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 42 45 47 49  one or more BEGI
8440: 4e 2c 20 0a 20 20 20 20 20 20 2a 2a 20 43 4f 4d  N, .      ** COM
8450: 4d 49 54 2c 20 53 41 56 45 50 4f 49 4e 54 2c 20  MIT, SAVEPOINT, 
8460: 52 45 4c 45 41 53 45 20 6f 72 20 52 4f 4c 4c 42  RELEASE or ROLLB
8470: 41 43 4b 20 63 6f 6d 6d 61 6e 64 73 20 74 68 61  ACK commands tha
8480: 74 20 61 72 65 20 63 6f 6e 66 75 73 69 6e 67 0a  t are confusing.
8490: 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 6d 65        ** this me
84a0: 74 68 6f 64 27 73 20 6c 6f 67 69 63 2e 20 4e 6f  thod's logic. No
84b0: 74 20 63 6c 65 61 72 20 68 6f 77 20 74 68 69 73  t clear how this
84c0: 20 77 6f 75 6c 64 20 62 65 20 62 65 73 74 20 68   would be best h
84d0: 61 6e 64 6c 65 64 2e 0a 20 20 20 20 20 20 2a 2f  andled..      */
84e0: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 54 43 4c  .    if( rc!=TCL
84f0: 5f 45 52 52 4f 52 20 29 7b 0a 20 20 20 20 20 20  _ERROR ){.      
8500: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
8510: 28 69 6e 74 65 72 70 2c 20 73 71 6c 69 74 65 33  (interp, sqlite3
8520: 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62 29  _errmsg(pDb->db)
8530: 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  , 0);.      rc =
8540: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
8550: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78  }.    sqlite3_ex
8560: 65 63 28 70 44 62 2d 3e 64 62 2c 20 22 52 4f 4c  ec(pDb->db, "ROL
8570: 4c 42 41 43 4b 22 2c 20 30 2c 20 30 2c 20 30 29  LBACK", 0, 0, 0)
8580: 3b 0a 20 20 7d 0a 20 20 70 44 62 2d 3e 64 69 73  ;.  }.  pDb->dis
8590: 61 62 6c 65 41 75 74 68 2d 2d 3b 0a 0a 20 20 72  ableAuth--;..  r
85a0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
85b0: 2a 2a 20 55 6e 6c 65 73 73 20 53 51 4c 49 54 45  ** Unless SQLITE
85c0: 5f 54 45 53 54 20 69 73 20 64 65 66 69 6e 65 64  _TEST is defined
85d0: 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
85e0: 69 73 20 61 20 73 69 6d 70 6c 65 20 77 72 61 70  is a simple wrap
85f0: 70 65 72 20 61 72 6f 75 6e 64 0a 2a 2a 20 73 71  per around.** sq
8600: 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
8610: 28 29 2e 20 49 66 20 53 51 4c 49 54 45 5f 54 45  (). If SQLITE_TE
8620: 53 54 20 69 73 20 64 65 66 69 6e 65 64 2c 20 74  ST is defined, t
8630: 68 65 6e 20 69 74 20 75 73 65 73 20 65 69 74 68  hen it uses eith
8640: 65 72 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 70 72  er.** sqlite3_pr
8650: 65 70 61 72 65 5f 76 32 28 29 20 6f 72 20 6c 65  epare_v2() or le
8660: 67 61 63 79 20 69 6e 74 65 72 66 61 63 65 20 73  gacy interface s
8670: 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28 29  qlite3_prepare()
8680: 2c 20 64 65 70 65 6e 64 69 6e 67 0a 2a 2a 20 6f  , depending.** o
8690: 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  n whether or not
86a0: 20 74 68 65 20 5b 64 62 5f 75 73 65 5f 6c 65 67   the [db_use_leg
86b0: 61 63 79 5f 70 72 65 70 61 72 65 5d 20 63 6f 6d  acy_prepare] com
86c0: 6d 61 6e 64 20 68 61 73 20 62 65 65 6e 20 75 73  mand has been us
86d0: 65 64 20 74 6f 20 0a 2a 2a 20 63 6f 6e 66 69 67  ed to .** config
86e0: 75 72 65 20 74 68 65 20 63 6f 6e 6e 65 63 74 69  ure the connecti
86f0: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
8700: 74 20 64 62 50 72 65 70 61 72 65 28 0a 20 20 53  t dbPrepare(.  S
8710: 71 6c 69 74 65 44 62 20 2a 70 44 62 2c 20 20 20  qliteDb *pDb,   
8720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8730: 2a 20 44 61 74 61 62 61 73 65 20 6f 62 6a 65 63  * Database objec
8740: 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  t */.  const cha
8750: 72 20 2a 7a 53 71 6c 2c 20 20 20 20 20 20 20 20  r *zSql,        
8760: 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 20 74 6f         /* SQL to
8770: 20 63 6f 6d 70 69 6c 65 20 2a 2f 0a 20 20 73 71   compile */.  sq
8780: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 2a 70 70 53  lite3_stmt **ppS
8790: 74 6d 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  tmt,          /*
87a0: 20 4f 55 54 3a 20 50 72 65 70 61 72 65 64 20 73   OUT: Prepared s
87b0: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 63 6f  tatement */.  co
87c0: 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f 75 74  nst char **pzOut
87d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
87e0: 20 4f 55 54 3a 20 50 6f 69 6e 74 65 72 20 74 6f   OUT: Pointer to
87f0: 20 6e 65 78 74 20 53 51 4c 20 73 74 61 74 65 6d   next SQL statem
8800: 65 6e 74 20 2a 2f 0a 29 7b 0a 23 69 66 64 65 66  ent */.){.#ifdef
8810: 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69   SQLITE_TEST.  i
8820: 66 28 20 70 44 62 2d 3e 62 4c 65 67 61 63 79 50  f( pDb->bLegacyP
8830: 72 65 70 61 72 65 20 29 7b 0a 20 20 20 20 72 65  repare ){.    re
8840: 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 70 72 65  turn sqlite3_pre
8850: 70 61 72 65 28 70 44 62 2d 3e 64 62 2c 20 7a 53  pare(pDb->db, zS
8860: 71 6c 2c 20 2d 31 2c 20 70 70 53 74 6d 74 2c 20  ql, -1, ppStmt, 
8870: 70 7a 4f 75 74 29 3b 0a 20 20 7d 0a 23 65 6e 64  pzOut);.  }.#end
8880: 69 66 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  if.  return sqli
8890: 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70  te3_prepare_v2(p
88a0: 44 62 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31  Db->db, zSql, -1
88b0: 2c 20 70 70 53 74 6d 74 2c 20 70 7a 4f 75 74 29  , ppStmt, pzOut)
88c0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63  ;.}../*.** Searc
88d0: 68 20 74 68 65 20 63 61 63 68 65 20 66 6f 72 20  h the cache for 
88e0: 61 20 70 72 65 70 61 72 65 64 2d 73 74 61 74 65  a prepared-state
88f0: 6d 65 6e 74 20 6f 62 6a 65 63 74 20 74 68 61 74  ment object that
8900: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 0a   implements the.
8910: 2a 2a 20 66 69 72 73 74 20 53 51 4c 20 73 74 61  ** first SQL sta
8920: 74 65 6d 65 6e 74 20 69 6e 20 74 68 65 20 62 75  tement in the bu
8930: 66 66 65 72 20 70 6f 69 6e 74 65 64 20 74 6f 20  ffer pointed to 
8940: 62 79 20 70 61 72 61 6d 65 74 65 72 20 7a 49 6e  by parameter zIn
8950: 2e 20 49 66 0a 2a 2a 20 6e 6f 20 73 75 63 68 20  . If.** no such 
8960: 70 72 65 70 61 72 65 64 2d 73 74 61 74 65 6d 65  prepared-stateme
8970: 6e 74 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 2c  nt can be found,
8980: 20 61 6c 6c 6f 63 61 74 65 20 61 6e 64 20 70 72   allocate and pr
8990: 65 70 61 72 65 20 61 20 6e 65 77 0a 2a 2a 20 6f  epare a new.** o
89a0: 6e 65 2e 20 49 6e 20 65 69 74 68 65 72 20 63 61  ne. In either ca
89b0: 73 65 2c 20 62 69 6e 64 20 74 68 65 20 63 75 72  se, bind the cur
89c0: 72 65 6e 74 20 76 61 6c 75 65 73 20 6f 66 20 74  rent values of t
89d0: 68 65 20 72 65 6c 65 76 61 6e 74 20 54 63 6c 0a  he relevant Tcl.
89e0: 2a 2a 20 76 61 72 69 61 62 6c 65 73 20 74 6f 20  ** variables to 
89f0: 61 6e 79 20 24 76 61 72 2c 20 3a 76 61 72 20 6f  any $var, :var o
8a00: 72 20 40 76 61 72 20 76 61 72 69 61 62 6c 65 73  r @var variables
8a10: 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e   in the statemen
8a20: 74 2e 20 42 65 66 6f 72 65 0a 2a 2a 20 72 65 74  t. Before.** ret
8a30: 75 72 6e 69 6e 67 2c 20 73 65 74 20 2a 70 70 50  urning, set *ppP
8a40: 72 65 53 74 6d 74 20 74 6f 20 70 6f 69 6e 74 20  reStmt to point 
8a50: 74 6f 20 74 68 65 20 70 72 65 70 61 72 65 64 2d  to the prepared-
8a60: 73 74 61 74 65 6d 65 6e 74 20 6f 62 6a 65 63 74  statement object
8a70: 2e 0a 2a 2a 0a 2a 2a 20 4f 75 74 70 75 74 20 70  ..**.** Output p
8a80: 61 72 61 6d 65 74 65 72 20 2a 70 7a 4f 75 74 20  arameter *pzOut 
8a90: 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20  is set to point 
8aa0: 74 6f 20 74 68 65 20 6e 65 78 74 20 53 51 4c 20  to the next SQL 
8ab0: 73 74 61 74 65 6d 65 6e 74 20 69 6e 0a 2a 2a 20  statement in.** 
8ac0: 62 75 66 66 65 72 20 7a 49 6e 2c 20 6f 72 20 74  buffer zIn, or t
8ad0: 6f 20 74 68 65 20 27 5c 30 27 20 62 79 74 65 20  o the '\0' byte 
8ae0: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 7a 49  at the end of zI
8af0: 6e 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f  n if there is no
8b00: 0a 2a 2a 20 6e 65 78 74 20 73 74 61 74 65 6d 65  .** next stateme
8b10: 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63  nt..**.** If suc
8b20: 63 65 73 73 66 75 6c 2c 20 54 43 4c 5f 4f 4b 20  cessful, TCL_OK 
8b30: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68  is returned. Oth
8b40: 65 72 77 69 73 65 2c 20 54 43 4c 5f 45 52 52 4f  erwise, TCL_ERRO
8b50: 52 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a  R is returned.**
8b60: 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 6d 65   and an error me
8b70: 73 73 61 67 65 20 6c 6f 61 64 65 64 20 69 6e 74  ssage loaded int
8b80: 6f 20 69 6e 74 65 72 70 72 65 74 65 72 20 70 44  o interpreter pD
8b90: 62 2d 3e 69 6e 74 65 72 70 2e 0a 2a 2f 0a 73 74  b->interp..*/.st
8ba0: 61 74 69 63 20 69 6e 74 20 64 62 50 72 65 70 61  atic int dbPrepa
8bb0: 72 65 41 6e 64 42 69 6e 64 28 0a 20 20 53 71 6c  reAndBind(.  Sql
8bc0: 69 74 65 44 62 20 2a 70 44 62 2c 20 20 20 20 20  iteDb *pDb,     
8bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8be0: 44 61 74 61 62 61 73 65 20 6f 62 6a 65 63 74 20  Database object 
8bf0: 2a 2f 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20  */.  char const 
8c00: 2a 7a 49 6e 2c 20 20 20 20 20 20 20 20 20 20 20  *zIn,           
8c10: 20 20 20 20 20 2f 2a 20 53 51 4c 20 74 6f 20 63       /* SQL to c
8c20: 6f 6d 70 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72  ompile */.  char
8c30: 20 63 6f 6e 73 74 20 2a 2a 70 7a 4f 75 74 2c 20   const **pzOut, 
8c40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
8c50: 55 54 3a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6e  UT: Pointer to n
8c60: 65 78 74 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  ext SQL statemen
8c70: 74 20 2a 2f 0a 20 20 53 71 6c 50 72 65 70 61 72  t */.  SqlPrepar
8c80: 65 64 53 74 6d 74 20 2a 2a 70 70 50 72 65 53 74  edStmt **ppPreSt
8c90: 6d 74 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4f  mt     /* OUT: O
8ca0: 62 6a 65 63 74 20 75 73 65 64 20 74 6f 20 63 61  bject used to ca
8cb0: 63 68 65 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  che statement */
8cc0: 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  .){.  const char
8cd0: 20 2a 7a 53 71 6c 20 3d 20 7a 49 6e 3b 20 20 20   *zSql = zIn;   
8ce0: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
8cf0: 20 74 6f 20 66 69 72 73 74 20 53 51 4c 20 73 74   to first SQL st
8d00: 61 74 65 6d 65 6e 74 20 69 6e 20 7a 49 6e 20 2a  atement in zIn *
8d10: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  /.  sqlite3_stmt
8d20: 20 2a 70 53 74 6d 74 3b 20 20 20 20 20 20 20 20   *pStmt;        
8d30: 20 20 20 20 2f 2a 20 50 72 65 70 61 72 65 64 20      /* Prepared 
8d40: 73 74 61 74 65 6d 65 6e 74 20 6f 62 6a 65 63 74  statement object
8d50: 20 2a 2f 0a 20 20 53 71 6c 50 72 65 70 61 72 65   */.  SqlPrepare
8d60: 64 53 74 6d 74 20 2a 70 50 72 65 53 74 6d 74 3b  dStmt *pPreStmt;
8d70: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
8d80: 20 74 6f 20 63 61 63 68 65 64 20 73 74 61 74 65   to cached state
8d90: 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 53  ment */.  int nS
8da0: 71 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ql;             
8db0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e            /* Len
8dc0: 67 74 68 20 6f 66 20 7a 53 71 6c 20 69 6e 20 62  gth of zSql in b
8dd0: 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 56  ytes */.  int nV
8de0: 61 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ar;             
8df0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
8e00: 62 65 72 20 6f 66 20 76 61 72 69 61 62 6c 65 73  ber of variables
8e10: 20 69 6e 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f   in statement */
8e20: 0a 20 20 69 6e 74 20 69 50 61 72 6d 20 3d 20 30  .  int iParm = 0
8e30: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8e40: 20 20 20 2f 2a 20 4e 65 78 74 20 66 72 65 65 20     /* Next free 
8e50: 65 6e 74 72 79 20 69 6e 20 61 70 50 61 72 6d 20  entry in apParm 
8e60: 2a 2f 0a 20 20 63 68 61 72 20 63 3b 0a 20 20 69  */.  char c;.  i
8e70: 6e 74 20 69 3b 0a 20 20 54 63 6c 5f 49 6e 74 65  nt i;.  Tcl_Inte
8e80: 72 70 20 2a 69 6e 74 65 72 70 20 3d 20 70 44 62  rp *interp = pDb
8e90: 2d 3e 69 6e 74 65 72 70 3b 0a 0a 20 20 2a 70 70  ->interp;..  *pp
8ea0: 50 72 65 53 74 6d 74 20 3d 20 30 3b 0a 0a 20 20  PreStmt = 0;..  
8eb0: 2f 2a 20 54 72 69 6d 20 73 70 61 63 65 73 20 66  /* Trim spaces f
8ec0: 72 6f 6d 20 74 68 65 20 73 74 61 72 74 20 6f 66  rom the start of
8ed0: 20 7a 53 71 6c 20 61 6e 64 20 63 61 6c 63 75 6c   zSql and calcul
8ee0: 61 74 65 20 74 68 65 20 72 65 6d 61 69 6e 69 6e  ate the remainin
8ef0: 67 20 6c 65 6e 67 74 68 2e 20 2a 2f 0a 20 20 77  g length. */.  w
8f00: 68 69 6c 65 28 20 28 63 20 3d 20 7a 53 71 6c 5b  hile( (c = zSql[
8f10: 30 5d 29 3d 3d 27 20 27 20 7c 7c 20 63 3d 3d 27  0])==' ' || c=='
8f20: 5c 74 27 20 7c 7c 20 63 3d 3d 27 5c 72 27 20 7c  \t' || c=='\r' |
8f30: 7c 20 63 3d 3d 27 5c 6e 27 20 29 7b 20 7a 53 71  | c=='\n' ){ zSq
8f40: 6c 2b 2b 3b 20 7d 0a 20 20 6e 53 71 6c 20 3d 20  l++; }.  nSql = 
8f50: 73 74 72 6c 65 6e 33 30 28 7a 53 71 6c 29 3b 0a  strlen30(zSql);.
8f60: 0a 20 20 66 6f 72 28 70 50 72 65 53 74 6d 74 20  .  for(pPreStmt 
8f70: 3d 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74 3b  = pDb->stmtList;
8f80: 20 70 50 72 65 53 74 6d 74 3b 20 70 50 72 65 53   pPreStmt; pPreS
8f90: 74 6d 74 3d 70 50 72 65 53 74 6d 74 2d 3e 70 4e  tmt=pPreStmt->pN
8fa0: 65 78 74 29 7b 0a 20 20 20 20 69 6e 74 20 6e 20  ext){.    int n 
8fb0: 3d 20 70 50 72 65 53 74 6d 74 2d 3e 6e 53 71 6c  = pPreStmt->nSql
8fc0: 3b 0a 20 20 20 20 69 66 28 20 6e 53 71 6c 3e 3d  ;.    if( nSql>=
8fd0: 6e 20 0a 20 20 20 20 20 20 20 20 26 26 20 6d 65  n .        && me
8fe0: 6d 63 6d 70 28 70 50 72 65 53 74 6d 74 2d 3e 7a  mcmp(pPreStmt->z
8ff0: 53 71 6c 2c 20 7a 53 71 6c 2c 20 6e 29 3d 3d 30  Sql, zSql, n)==0
9000: 0a 20 20 20 20 20 20 20 20 26 26 20 28 7a 53 71  .        && (zSq
9010: 6c 5b 6e 5d 3d 3d 30 20 7c 7c 20 7a 53 71 6c 5b  l[n]==0 || zSql[
9020: 6e 2d 31 5d 3d 3d 27 3b 27 29 0a 20 20 20 20 29  n-1]==';').    )
9030: 7b 0a 20 20 20 20 20 20 70 53 74 6d 74 20 3d 20  {.      pStmt = 
9040: 70 50 72 65 53 74 6d 74 2d 3e 70 53 74 6d 74 3b  pPreStmt->pStmt;
9050: 0a 20 20 20 20 20 20 2a 70 7a 4f 75 74 20 3d 20  .      *pzOut = 
9060: 26 7a 53 71 6c 5b 70 50 72 65 53 74 6d 74 2d 3e  &zSql[pPreStmt->
9070: 6e 53 71 6c 5d 3b 0a 0a 20 20 20 20 20 20 2f 2a  nSql];..      /*
9080: 20 57 68 65 6e 20 61 20 70 72 65 70 61 72 65 64   When a prepared
9090: 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 66 6f   statement is fo
90a0: 75 6e 64 2c 20 75 6e 6c 69 6e 6b 20 69 74 20 66  und, unlink it f
90b0: 72 6f 6d 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  rom the.      **
90c0: 20 63 61 63 68 65 20 6c 69 73 74 2e 20 20 49 74   cache list.  It
90d0: 20 77 69 6c 6c 20 6c 61 74 65 72 20 62 65 20 61   will later be a
90e0: 64 64 65 64 20 62 61 63 6b 20 74 6f 20 74 68 65  dded back to the
90f0: 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20 20 20 20   beginning.     
9100: 20 2a 2a 20 6f 66 20 74 68 65 20 63 61 63 68 65   ** of the cache
9110: 20 6c 69 73 74 20 69 6e 20 6f 72 64 65 72 20 74   list in order t
9120: 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 4c 52 55 20  o implement LRU 
9130: 72 65 70 6c 61 63 65 6d 65 6e 74 2e 0a 20 20 20  replacement..   
9140: 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
9150: 70 50 72 65 53 74 6d 74 2d 3e 70 50 72 65 76 20  pPreStmt->pPrev 
9160: 29 7b 0a 20 20 20 20 20 20 20 20 70 50 72 65 53  ){.        pPreS
9170: 74 6d 74 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78  tmt->pPrev->pNex
9180: 74 20 3d 20 70 50 72 65 53 74 6d 74 2d 3e 70 4e  t = pPreStmt->pN
9190: 65 78 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ext;.      }else
91a0: 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 73  {.        pDb->s
91b0: 74 6d 74 4c 69 73 74 20 3d 20 70 50 72 65 53 74  tmtList = pPreSt
91c0: 6d 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  mt->pNext;.     
91d0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 50 72   }.      if( pPr
91e0: 65 53 74 6d 74 2d 3e 70 4e 65 78 74 20 29 7b 0a  eStmt->pNext ){.
91f0: 20 20 20 20 20 20 20 20 70 50 72 65 53 74 6d 74          pPreStmt
9200: 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d  ->pNext->pPrev =
9210: 20 70 50 72 65 53 74 6d 74 2d 3e 70 50 72 65 76   pPreStmt->pPrev
9220: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
9230: 20 20 20 20 20 20 20 70 44 62 2d 3e 73 74 6d 74         pDb->stmt
9240: 4c 61 73 74 20 3d 20 70 50 72 65 53 74 6d 74 2d  Last = pPreStmt-
9250: 3e 70 50 72 65 76 3b 0a 20 20 20 20 20 20 7d 0a  >pPrev;.      }.
9260: 20 20 20 20 20 20 70 44 62 2d 3e 6e 53 74 6d 74        pDb->nStmt
9270: 2d 2d 3b 0a 20 20 20 20 20 20 6e 56 61 72 20 3d  --;.      nVar =
9280: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61   sqlite3_bind_pa
9290: 72 61 6d 65 74 65 72 5f 63 6f 75 6e 74 28 70 53  rameter_count(pS
92a0: 74 6d 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61  tmt);.      brea
92b0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a  k;.    }.  }.  .
92c0: 20 20 2f 2a 20 49 66 20 6e 6f 20 70 72 65 70 61    /* If no prepa
92d0: 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 77 61  red statement wa
92e0: 73 20 66 6f 75 6e 64 2e 20 43 6f 6d 70 69 6c 65  s found. Compile
92f0: 20 74 68 65 20 53 51 4c 20 74 65 78 74 2e 20 41   the SQL text. A
9300: 6c 73 6f 20 61 6c 6c 6f 63 61 74 65 0a 20 20 2a  lso allocate.  *
9310: 2a 20 61 20 6e 65 77 20 53 71 6c 50 72 65 70 61  * a new SqlPrepa
9320: 72 65 64 53 74 6d 74 20 73 74 72 75 63 74 75 72  redStmt structur
9330: 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 72  e.  */.  if( pPr
9340: 65 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20 20 20  eStmt==0 ){.    
9350: 69 6e 74 20 6e 42 79 74 65 3b 0a 0a 20 20 20 20  int nByte;..    
9360: 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 64  if( SQLITE_OK!=d
9370: 62 50 72 65 70 61 72 65 28 70 44 62 2c 20 7a 53  bPrepare(pDb, zS
9380: 71 6c 2c 20 26 70 53 74 6d 74 2c 20 70 7a 4f 75  ql, &pStmt, pzOu
9390: 74 29 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  t) ){.      Tcl_
93a0: 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
93b0: 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  erp, Tcl_NewStri
93c0: 6e 67 4f 62 6a 28 73 71 6c 69 74 65 33 5f 65 72  ngObj(sqlite3_er
93d0: 72 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c 20 2d  rmsg(pDb->db), -
93e0: 31 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  1));.      retur
93f0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
9400: 20 7d 0a 20 20 20 20 69 66 28 20 70 53 74 6d 74   }.    if( pStmt
9410: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==0 ){.      if(
9420: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69   SQLITE_OK!=sqli
9430: 74 65 33 5f 65 72 72 63 6f 64 65 28 70 44 62 2d  te3_errcode(pDb-
9440: 3e 64 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20  >db) ){.        
9450: 2f 2a 20 41 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  /* A compile-tim
9460: 65 20 65 72 72 6f 72 20 69 6e 20 74 68 65 20 73  e error in the s
9470: 74 61 74 65 6d 65 6e 74 2e 20 2a 2f 0a 20 20 20  tatement. */.   
9480: 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52       Tcl_SetObjR
9490: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
94a0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 73  l_NewStringObj(s
94b0: 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44  qlite3_errmsg(pD
94c0: 62 2d 3e 64 62 29 2c 20 2d 31 29 29 3b 0a 20 20  b->db), -1));.  
94d0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
94e0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 65  _ERROR;.      }e
94f0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
9500: 54 68 65 20 73 74 61 74 65 6d 65 6e 74 20 77 61  The statement wa
9510: 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 43 6f 6e 74  s a no-op.  Cont
9520: 69 6e 75 65 20 74 6f 20 74 68 65 20 6e 65 78 74  inue to the next
9530: 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 20 20 20   statement.     
9540: 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 53 51 4c     ** in the SQL
9550: 20 73 74 72 69 6e 67 2e 0a 20 20 20 20 20 20 20   string..       
9560: 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 74 75   */.        retu
9570: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 20  rn TCL_OK;.     
9580: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61 73   }.    }..    as
9590: 73 65 72 74 28 20 70 50 72 65 53 74 6d 74 3d 3d  sert( pPreStmt==
95a0: 30 20 29 3b 0a 20 20 20 20 6e 56 61 72 20 3d 20  0 );.    nVar = 
95b0: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72  sqlite3_bind_par
95c0: 61 6d 65 74 65 72 5f 63 6f 75 6e 74 28 70 53 74  ameter_count(pSt
95d0: 6d 74 29 3b 0a 20 20 20 20 6e 42 79 74 65 20 3d  mt);.    nByte =
95e0: 20 73 69 7a 65 6f 66 28 53 71 6c 50 72 65 70 61   sizeof(SqlPrepa
95f0: 72 65 64 53 74 6d 74 29 20 2b 20 6e 56 61 72 2a  redStmt) + nVar*
9600: 73 69 7a 65 6f 66 28 54 63 6c 5f 4f 62 6a 20 2a  sizeof(Tcl_Obj *
9610: 29 3b 0a 20 20 20 20 70 50 72 65 53 74 6d 74 20  );.    pPreStmt 
9620: 3d 20 28 53 71 6c 50 72 65 70 61 72 65 64 53 74  = (SqlPreparedSt
9630: 6d 74 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28 6e 42  mt*)Tcl_Alloc(nB
9640: 79 74 65 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74  yte);.    memset
9650: 28 70 50 72 65 53 74 6d 74 2c 20 30 2c 20 6e 42  (pPreStmt, 0, nB
9660: 79 74 65 29 3b 0a 0a 20 20 20 20 70 50 72 65 53  yte);..    pPreS
9670: 74 6d 74 2d 3e 70 53 74 6d 74 20 3d 20 70 53 74  tmt->pStmt = pSt
9680: 6d 74 3b 0a 20 20 20 20 70 50 72 65 53 74 6d 74  mt;.    pPreStmt
9690: 2d 3e 6e 53 71 6c 20 3d 20 28 69 6e 74 29 28 2a  ->nSql = (int)(*
96a0: 70 7a 4f 75 74 20 2d 20 7a 53 71 6c 29 3b 0a 20  pzOut - zSql);. 
96b0: 20 20 20 70 50 72 65 53 74 6d 74 2d 3e 7a 53 71     pPreStmt->zSq
96c0: 6c 20 3d 20 73 71 6c 69 74 65 33 5f 73 71 6c 28  l = sqlite3_sql(
96d0: 70 53 74 6d 74 29 3b 0a 20 20 20 20 70 50 72 65  pStmt);.    pPre
96e0: 53 74 6d 74 2d 3e 61 70 50 61 72 6d 20 3d 20 28  Stmt->apParm = (
96f0: 54 63 6c 5f 4f 62 6a 20 2a 2a 29 26 70 50 72 65  Tcl_Obj **)&pPre
9700: 53 74 6d 74 5b 31 5d 3b 0a 23 69 66 64 65 66 20  Stmt[1];.#ifdef 
9710: 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 20 20  SQLITE_TEST.    
9720: 69 66 28 20 70 50 72 65 53 74 6d 74 2d 3e 7a 53  if( pPreStmt->zS
9730: 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 63  ql==0 ){.      c
9740: 68 61 72 20 2a 7a 43 6f 70 79 20 3d 20 54 63 6c  har *zCopy = Tcl
9750: 5f 41 6c 6c 6f 63 28 70 50 72 65 53 74 6d 74 2d  _Alloc(pPreStmt-
9760: 3e 6e 53 71 6c 20 2b 20 31 29 3b 0a 20 20 20 20  >nSql + 1);.    
9770: 20 20 6d 65 6d 63 70 79 28 7a 43 6f 70 79 2c 20    memcpy(zCopy, 
9780: 7a 53 71 6c 2c 20 70 50 72 65 53 74 6d 74 2d 3e  zSql, pPreStmt->
9790: 6e 53 71 6c 29 3b 0a 20 20 20 20 20 20 7a 43 6f  nSql);.      zCo
97a0: 70 79 5b 70 50 72 65 53 74 6d 74 2d 3e 6e 53 71  py[pPreStmt->nSq
97b0: 6c 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20  l] = '\0';.     
97c0: 20 70 50 72 65 53 74 6d 74 2d 3e 7a 53 71 6c 20   pPreStmt->zSql 
97d0: 3d 20 7a 43 6f 70 79 3b 0a 20 20 20 20 7d 0a 23  = zCopy;.    }.#
97e0: 65 6e 64 69 66 0a 20 20 7d 0a 20 20 61 73 73 65  endif.  }.  asse
97f0: 72 74 28 20 70 50 72 65 53 74 6d 74 20 29 3b 0a  rt( pPreStmt );.
9800: 20 20 61 73 73 65 72 74 28 20 73 74 72 6c 65 6e    assert( strlen
9810: 33 30 28 70 50 72 65 53 74 6d 74 2d 3e 7a 53 71  30(pPreStmt->zSq
9820: 6c 29 3d 3d 70 50 72 65 53 74 6d 74 2d 3e 6e 53  l)==pPreStmt->nS
9830: 71 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ql );.  assert( 
9840: 30 3d 3d 6d 65 6d 63 6d 70 28 70 50 72 65 53 74  0==memcmp(pPreSt
9850: 6d 74 2d 3e 7a 53 71 6c 2c 20 7a 53 71 6c 2c 20  mt->zSql, zSql, 
9860: 70 50 72 65 53 74 6d 74 2d 3e 6e 53 71 6c 29 20  pPreStmt->nSql) 
9870: 29 3b 0a 0a 20 20 2f 2a 20 42 69 6e 64 20 76 61  );..  /* Bind va
9880: 6c 75 65 73 20 74 6f 20 70 61 72 61 6d 65 74 65  lues to paramete
9890: 72 73 20 74 68 61 74 20 62 65 67 69 6e 20 77 69  rs that begin wi
98a0: 74 68 20 24 20 6f 72 20 3a 20 2a 2f 20 20 0a 20  th $ or : */  . 
98b0: 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 6e 56 61   for(i=1; i<=nVa
98c0: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e  r; i++){.    con
98d0: 73 74 20 63 68 61 72 20 2a 7a 56 61 72 20 3d 20  st char *zVar = 
98e0: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72  sqlite3_bind_par
98f0: 61 6d 65 74 65 72 5f 6e 61 6d 65 28 70 53 74 6d  ameter_name(pStm
9900: 74 2c 20 69 29 3b 0a 20 20 20 20 69 66 28 20 7a  t, i);.    if( z
9910: 56 61 72 21 3d 30 20 26 26 20 28 7a 56 61 72 5b  Var!=0 && (zVar[
9920: 30 5d 3d 3d 27 24 27 20 7c 7c 20 7a 56 61 72 5b  0]=='$' || zVar[
9930: 30 5d 3d 3d 27 3a 27 20 7c 7c 20 7a 56 61 72 5b  0]==':' || zVar[
9940: 30 5d 3d 3d 27 40 27 29 20 29 7b 0a 20 20 20 20  0]=='@') ){.    
9950: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 56 61 72 20    Tcl_Obj *pVar 
9960: 3d 20 54 63 6c 5f 47 65 74 56 61 72 32 45 78 28  = Tcl_GetVar2Ex(
9970: 69 6e 74 65 72 70 2c 20 26 7a 56 61 72 5b 31 5d  interp, &zVar[1]
9980: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  , 0, 0);.      i
9990: 66 28 20 70 56 61 72 20 29 7b 0a 20 20 20 20 20  f( pVar ){.     
99a0: 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20     int n;.      
99b0: 20 20 75 38 20 2a 64 61 74 61 3b 0a 20 20 20 20    u8 *data;.    
99c0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
99d0: 7a 54 79 70 65 20 3d 20 28 70 56 61 72 2d 3e 74  zType = (pVar->t
99e0: 79 70 65 50 74 72 20 3f 20 70 56 61 72 2d 3e 74  ypePtr ? pVar->t
99f0: 79 70 65 50 74 72 2d 3e 6e 61 6d 65 20 3a 20 22  ypePtr->name : "
9a00: 22 29 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72  ");.        char
9a10: 20 63 20 3d 20 7a 54 79 70 65 5b 30 5d 3b 0a 20   c = zType[0];. 
9a20: 20 20 20 20 20 20 20 69 66 28 20 7a 56 61 72 5b         if( zVar[
9a30: 30 5d 3d 3d 27 40 27 20 7c 7c 0a 20 20 20 20 20  0]=='@' ||.     
9a40: 20 20 20 20 20 20 28 63 3d 3d 27 62 27 20 26 26        (c=='b' &&
9a50: 20 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22 62   strcmp(zType,"b
9a60: 79 74 65 61 72 72 61 79 22 29 3d 3d 30 20 26 26  ytearray")==0 &&
9a70: 20 70 56 61 72 2d 3e 62 79 74 65 73 3d 3d 30 29   pVar->bytes==0)
9a80: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
9a90: 20 4c 6f 61 64 20 61 20 42 4c 4f 42 20 74 79 70   Load a BLOB typ
9aa0: 65 20 69 66 20 74 68 65 20 54 63 6c 20 76 61 72  e if the Tcl var
9ab0: 69 61 62 6c 65 20 69 73 20 61 20 62 79 74 65 61  iable is a bytea
9ac0: 72 72 61 79 20 61 6e 64 0a 20 20 20 20 20 20 20  rray and.       
9ad0: 20 20 20 2a 2a 20 69 74 20 68 61 73 20 6e 6f 20     ** it has no 
9ae0: 73 74 72 69 6e 67 20 72 65 70 72 65 73 65 6e 74  string represent
9af0: 61 74 69 6f 6e 20 6f 72 20 74 68 65 20 68 6f 73  ation or the hos
9b00: 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70  t.          ** p
9b10: 61 72 61 6d 65 74 65 72 20 6e 61 6d 65 20 62 65  arameter name be
9b20: 67 69 6e 73 20 77 69 74 68 20 22 40 22 2e 20 2a  gins with "@". *
9b30: 2f 0a 20 20 20 20 20 20 20 20 20 20 64 61 74 61  /.          data
9b40: 20 3d 20 54 63 6c 5f 47 65 74 42 79 74 65 41 72   = Tcl_GetByteAr
9b50: 72 61 79 46 72 6f 6d 4f 62 6a 28 70 56 61 72 2c  rayFromObj(pVar,
9b60: 20 26 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20   &n);.          
9b70: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f  sqlite3_bind_blo
9b80: 62 28 70 53 74 6d 74 2c 20 69 2c 20 64 61 74 61  b(pStmt, i, data
9b90: 2c 20 6e 2c 20 53 51 4c 49 54 45 5f 53 54 41 54  , n, SQLITE_STAT
9ba0: 49 43 29 3b 0a 20 20 20 20 20 20 20 20 20 20 54  IC);.          T
9bb0: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
9bc0: 70 56 61 72 29 3b 0a 20 20 20 20 20 20 20 20 20  pVar);.         
9bd0: 20 70 50 72 65 53 74 6d 74 2d 3e 61 70 50 61 72   pPreStmt->apPar
9be0: 6d 5b 69 50 61 72 6d 2b 2b 5d 20 3d 20 70 56 61  m[iParm++] = pVa
9bf0: 72 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  r;.        }else
9c00: 20 69 66 28 20 63 3d 3d 27 62 27 20 26 26 20 73   if( c=='b' && s
9c10: 74 72 63 6d 70 28 7a 54 79 70 65 2c 22 62 6f 6f  trcmp(zType,"boo
9c20: 6c 65 61 6e 22 29 3d 3d 30 20 29 7b 0a 20 20 20  lean")==0 ){.   
9c30: 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 49 6e         Tcl_GetIn
9c40: 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
9c50: 20 70 56 61 72 2c 20 26 6e 29 3b 0a 20 20 20 20   pVar, &n);.    
9c60: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69        sqlite3_bi
9c70: 6e 64 5f 69 6e 74 28 70 53 74 6d 74 2c 20 69 2c  nd_int(pStmt, i,
9c80: 20 6e 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c   n);.        }el
9c90: 73 65 20 69 66 28 20 63 3d 3d 27 64 27 20 26 26  se if( c=='d' &&
9ca0: 20 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22 64   strcmp(zType,"d
9cb0: 6f 75 62 6c 65 22 29 3d 3d 30 20 29 7b 0a 20 20  ouble")==0 ){.  
9cc0: 20 20 20 20 20 20 20 20 64 6f 75 62 6c 65 20 72          double r
9cd0: 3b 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f  ;.          Tcl_
9ce0: 47 65 74 44 6f 75 62 6c 65 46 72 6f 6d 4f 62 6a  GetDoubleFromObj
9cf0: 28 69 6e 74 65 72 70 2c 20 70 56 61 72 2c 20 26  (interp, pVar, &
9d00: 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  r);.          sq
9d10: 6c 69 74 65 33 5f 62 69 6e 64 5f 64 6f 75 62 6c  lite3_bind_doubl
9d20: 65 28 70 53 74 6d 74 2c 20 69 2c 20 72 29 3b 0a  e(pStmt, i, r);.
9d30: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
9d40: 28 20 28 63 3d 3d 27 77 27 20 26 26 20 73 74 72  ( (c=='w' && str
9d50: 63 6d 70 28 7a 54 79 70 65 2c 22 77 69 64 65 49  cmp(zType,"wideI
9d60: 6e 74 22 29 3d 3d 30 29 20 7c 7c 0a 20 20 20 20  nt")==0) ||.    
9d70: 20 20 20 20 20 20 20 20 20 20 28 63 3d 3d 27 69            (c=='i
9d80: 27 20 26 26 20 73 74 72 63 6d 70 28 7a 54 79 70  ' && strcmp(zTyp
9d90: 65 2c 22 69 6e 74 22 29 3d 3d 30 29 20 29 7b 0a  e,"int")==0) ){.
9da0: 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 57 69            Tcl_Wi
9db0: 64 65 49 6e 74 20 76 3b 0a 20 20 20 20 20 20 20  deInt v;.       
9dc0: 20 20 20 54 63 6c 5f 47 65 74 57 69 64 65 49 6e     Tcl_GetWideIn
9dd0: 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
9de0: 20 70 56 61 72 2c 20 26 76 29 3b 0a 20 20 20 20   pVar, &v);.    
9df0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69        sqlite3_bi
9e00: 6e 64 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20  nd_int64(pStmt, 
9e10: 69 2c 20 76 29 3b 0a 20 20 20 20 20 20 20 20 7d  i, v);.        }
9e20: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
9e30: 64 61 74 61 20 3d 20 28 75 6e 73 69 67 6e 65 64  data = (unsigned
9e40: 20 63 68 61 72 20 2a 29 54 63 6c 5f 47 65 74 53   char *)Tcl_GetS
9e50: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 70 56 61  tringFromObj(pVa
9e60: 72 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 20 20  r, &n);.        
9e70: 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74    sqlite3_bind_t
9e80: 65 78 74 28 70 53 74 6d 74 2c 20 69 2c 20 28 63  ext(pStmt, i, (c
9e90: 68 61 72 20 2a 29 64 61 74 61 2c 20 6e 2c 20 53  har *)data, n, S
9ea0: 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20  QLITE_STATIC);. 
9eb0: 20 20 20 20 20 20 20 20 20 54 63 6c 5f 49 6e 63           Tcl_Inc
9ec0: 72 52 65 66 43 6f 75 6e 74 28 70 56 61 72 29 3b  rRefCount(pVar);
9ed0: 0a 20 20 20 20 20 20 20 20 20 20 70 50 72 65 53  .          pPreS
9ee0: 74 6d 74 2d 3e 61 70 50 61 72 6d 5b 69 50 61 72  tmt->apParm[iPar
9ef0: 6d 2b 2b 5d 20 3d 20 70 56 61 72 3b 0a 20 20 20  m++] = pVar;.   
9f00: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
9f10: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
9f20: 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28 70 53  te3_bind_null(pS
9f30: 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 7d  tmt, i);.      }
9f40: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 50 72  .    }.  }.  pPr
9f50: 65 53 74 6d 74 2d 3e 6e 50 61 72 6d 20 3d 20 69  eStmt->nParm = i
9f60: 50 61 72 6d 3b 0a 20 20 2a 70 70 50 72 65 53 74  Parm;.  *ppPreSt
9f70: 6d 74 20 3d 20 70 50 72 65 53 74 6d 74 3b 0a 0a  mt = pPreStmt;..
9f80: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
9f90: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73  .}../*.** Releas
9fa0: 65 20 61 20 73 74 61 74 65 6d 65 6e 74 20 72 65  e a statement re
9fb0: 66 65 72 65 6e 63 65 20 6f 62 74 61 69 6e 65 64  ference obtained
9fc0: 20 62 79 20 63 61 6c 6c 69 6e 67 20 64 62 50 72   by calling dbPr
9fd0: 65 70 61 72 65 41 6e 64 42 69 6e 64 28 29 2e 0a  epareAndBind()..
9fe0: 2a 2a 20 54 68 65 72 65 20 73 68 6f 75 6c 64 20  ** There should 
9ff0: 62 65 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 63  be exactly one c
a000: 61 6c 6c 20 74 6f 20 74 68 69 73 20 66 75 6e 63  all to this func
a010: 74 69 6f 6e 20 66 6f 72 20 65 61 63 68 20 63 61  tion for each ca
a020: 6c 6c 20 74 6f 0a 2a 2a 20 64 62 50 72 65 70 61  ll to.** dbPrepa
a030: 72 65 41 6e 64 42 69 6e 64 28 29 2e 0a 2a 2a 0a  reAndBind()..**.
a040: 2a 2a 20 49 66 20 74 68 65 20 64 69 73 63 61 72  ** If the discar
a050: 64 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e  d parameter is n
a060: 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  on-zero, then th
a070: 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 64  e statement is d
a080: 65 6c 65 74 65 64 0a 2a 2a 20 69 6d 6d 65 64 69  eleted.** immedi
a090: 61 74 65 6c 79 2e 20 4f 74 68 65 72 77 69 73 65  ately. Otherwise
a0a0: 20 69 74 20 69 73 20 61 64 64 65 64 20 74 6f 20   it is added to 
a0b0: 74 68 65 20 4c 52 55 20 6c 69 73 74 20 61 6e 64  the LRU list and
a0c0: 20 6d 61 79 20 62 65 20 72 65 74 75 72 6e 65 64   may be returned
a0d0: 0a 2a 2a 20 62 79 20 61 20 73 75 62 73 65 71 75  .** by a subsequ
a0e0: 65 6e 74 20 63 61 6c 6c 20 74 6f 20 64 62 50 72  ent call to dbPr
a0f0: 65 70 61 72 65 41 6e 64 42 69 6e 64 28 29 2e 0a  epareAndBind()..
a100: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64  */.static void d
a110: 62 52 65 6c 65 61 73 65 53 74 6d 74 28 0a 20 20  bReleaseStmt(.  
a120: 53 71 6c 69 74 65 44 62 20 2a 70 44 62 2c 20 20  SqliteDb *pDb,  
a130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a140: 2f 2a 20 44 61 74 61 62 61 73 65 20 68 61 6e 64  /* Database hand
a150: 6c 65 20 2a 2f 0a 20 20 53 71 6c 50 72 65 70 61  le */.  SqlPrepa
a160: 72 65 64 53 74 6d 74 20 2a 70 50 72 65 53 74 6d  redStmt *pPreStm
a170: 74 2c 20 20 20 20 20 20 2f 2a 20 50 72 65 70 61  t,      /* Prepa
a180: 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 68 61  red statement ha
a190: 6e 64 6c 65 20 74 6f 20 72 65 6c 65 61 73 65 20  ndle to release 
a1a0: 2a 2f 0a 20 20 69 6e 74 20 64 69 73 63 61 72 64  */.  int discard
a1b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a1c0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
a1d0: 64 65 6c 65 74 65 20 28 6e 6f 74 20 63 61 63 68  delete (not cach
a1e0: 65 29 20 74 68 65 20 70 50 72 65 53 74 6d 74 20  e) the pPreStmt 
a1f0: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 0a  */.){.  int i;..
a200: 20 20 2f 2a 20 46 72 65 65 20 74 68 65 20 62 6f    /* Free the bo
a210: 75 6e 64 20 73 74 72 69 6e 67 20 61 6e 64 20 62  und string and b
a220: 6c 6f 62 20 70 61 72 61 6d 65 74 65 72 73 20 2a  lob parameters *
a230: 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  /.  for(i=0; i<p
a240: 50 72 65 53 74 6d 74 2d 3e 6e 50 61 72 6d 3b 20  PreStmt->nParm; 
a250: 69 2b 2b 29 7b 0a 20 20 20 20 54 63 6c 5f 44 65  i++){.    Tcl_De
a260: 63 72 52 65 66 43 6f 75 6e 74 28 70 50 72 65 53  crRefCount(pPreS
a270: 74 6d 74 2d 3e 61 70 50 61 72 6d 5b 69 5d 29 3b  tmt->apParm[i]);
a280: 0a 20 20 7d 0a 20 20 70 50 72 65 53 74 6d 74 2d  .  }.  pPreStmt-
a290: 3e 6e 50 61 72 6d 20 3d 20 30 3b 0a 0a 20 20 69  >nParm = 0;..  i
a2a0: 66 28 20 70 44 62 2d 3e 6d 61 78 53 74 6d 74 3c  f( pDb->maxStmt<
a2b0: 3d 30 20 7c 7c 20 64 69 73 63 61 72 64 20 29 7b  =0 || discard ){
a2c0: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63  .    /* If the c
a2d0: 61 63 68 65 20 69 73 20 74 75 72 6e 65 64 20 6f  ache is turned o
a2e0: 66 66 2c 20 64 65 61 6c 6c 6f 63 61 74 65 64 20  ff, deallocated 
a2f0: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  the statement */
a300: 0a 20 20 20 20 64 62 46 72 65 65 53 74 6d 74 28  .    dbFreeStmt(
a310: 70 50 72 65 53 74 6d 74 29 3b 0a 20 20 7d 65 6c  pPreStmt);.  }el
a320: 73 65 7b 0a 20 20 20 20 2f 2a 20 41 64 64 20 74  se{.    /* Add t
a330: 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74  he prepared stat
a340: 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 62 65 67  ement to the beg
a350: 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 63 61  inning of the ca
a360: 63 68 65 20 6c 69 73 74 2e 20 2a 2f 0a 20 20 20  che list. */.   
a370: 20 70 50 72 65 53 74 6d 74 2d 3e 70 4e 65 78 74   pPreStmt->pNext
a380: 20 3d 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74   = pDb->stmtList
a390: 3b 0a 20 20 20 20 70 50 72 65 53 74 6d 74 2d 3e  ;.    pPreStmt->
a3a0: 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 20 20 69  pPrev = 0;.    i
a3b0: 66 28 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74  f( pDb->stmtList
a3c0: 20 29 7b 0a 20 20 20 20 20 70 44 62 2d 3e 73 74   ){.     pDb->st
a3d0: 6d 74 4c 69 73 74 2d 3e 70 50 72 65 76 20 3d 20  mtList->pPrev = 
a3e0: 70 50 72 65 53 74 6d 74 3b 0a 20 20 20 20 7d 0a  pPreStmt;.    }.
a3f0: 20 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73      pDb->stmtLis
a400: 74 20 3d 20 70 50 72 65 53 74 6d 74 3b 0a 20 20  t = pPreStmt;.  
a410: 20 20 69 66 28 20 70 44 62 2d 3e 73 74 6d 74 4c    if( pDb->stmtL
a420: 61 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ast==0 ){.      
a430: 61 73 73 65 72 74 28 20 70 44 62 2d 3e 6e 53 74  assert( pDb->nSt
a440: 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  mt==0 );.      p
a450: 44 62 2d 3e 73 74 6d 74 4c 61 73 74 20 3d 20 70  Db->stmtLast = p
a460: 50 72 65 53 74 6d 74 3b 0a 20 20 20 20 7d 65 6c  PreStmt;.    }el
a470: 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
a480: 28 20 70 44 62 2d 3e 6e 53 74 6d 74 3e 30 20 29  ( pDb->nStmt>0 )
a490: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 44 62 2d  ;.    }.    pDb-
a4a0: 3e 6e 53 74 6d 74 2b 2b 3b 0a 20 20 20 0a 20 20  >nStmt++;.   .  
a4b0: 20 20 2f 2a 20 49 66 20 77 65 20 68 61 76 65 20    /* If we have 
a4c0: 74 6f 6f 20 6d 61 6e 79 20 73 74 61 74 65 6d 65  too many stateme
a4d0: 6e 74 20 69 6e 20 63 61 63 68 65 2c 20 72 65 6d  nt in cache, rem
a4e0: 6f 76 65 20 74 68 65 20 73 75 72 70 6c 75 73 20  ove the surplus 
a4f0: 66 72 6f 6d 20 0a 20 20 20 20 2a 2a 20 74 68 65  from .    ** the
a500: 20 65 6e 64 20 6f 66 20 74 68 65 20 63 61 63 68   end of the cach
a510: 65 20 6c 69 73 74 2e 20 20 2a 2f 0a 20 20 20 20  e list.  */.    
a520: 77 68 69 6c 65 28 20 70 44 62 2d 3e 6e 53 74 6d  while( pDb->nStm
a530: 74 3e 70 44 62 2d 3e 6d 61 78 53 74 6d 74 20 29  t>pDb->maxStmt )
a540: 7b 0a 20 20 20 20 20 20 53 71 6c 50 72 65 70 61  {.      SqlPrepa
a550: 72 65 64 53 74 6d 74 20 2a 70 4c 61 73 74 20 3d  redStmt *pLast =
a560: 20 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74 3b 0a   pDb->stmtLast;.
a570: 20 20 20 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c        pDb->stmtL
a580: 61 73 74 20 3d 20 70 4c 61 73 74 2d 3e 70 50 72  ast = pLast->pPr
a590: 65 76 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e 73  ev;.      pDb->s
a5a0: 74 6d 74 4c 61 73 74 2d 3e 70 4e 65 78 74 20 3d  tmtLast->pNext =
a5b0: 20 30 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e 6e   0;.      pDb->n
a5c0: 53 74 6d 74 2d 2d 3b 0a 20 20 20 20 20 20 64 62  Stmt--;.      db
a5d0: 46 72 65 65 53 74 6d 74 28 70 4c 61 73 74 29 3b  FreeStmt(pLast);
a5e0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
a5f0: 0a 2a 2a 20 53 74 72 75 63 74 75 72 65 20 75 73  .** Structure us
a600: 65 64 20 77 69 74 68 20 64 62 45 76 61 6c 58 58  ed with dbEvalXX
a610: 58 28 29 20 66 75 6e 63 74 69 6f 6e 73 3a 0a 2a  X() functions:.*
a620: 2a 0a 2a 2a 20 20 20 64 62 45 76 61 6c 49 6e 69  *.**   dbEvalIni
a630: 74 28 29 0a 2a 2a 20 20 20 64 62 45 76 61 6c 53  t().**   dbEvalS
a640: 74 65 70 28 29 0a 2a 2a 20 20 20 64 62 45 76 61  tep().**   dbEva
a650: 6c 46 69 6e 61 6c 69 7a 65 28 29 0a 2a 2a 20 20  lFinalize().**  
a660: 20 64 62 45 76 61 6c 52 6f 77 49 6e 66 6f 28 29   dbEvalRowInfo()
a670: 0a 2a 2a 20 20 20 64 62 45 76 61 6c 43 6f 6c 75  .**   dbEvalColu
a680: 6d 6e 56 61 6c 75 65 28 29 0a 2a 2f 0a 74 79 70  mnValue().*/.typ
a690: 65 64 65 66 20 73 74 72 75 63 74 20 44 62 45 76  edef struct DbEv
a6a0: 61 6c 43 6f 6e 74 65 78 74 20 44 62 45 76 61 6c  alContext DbEval
a6b0: 43 6f 6e 74 65 78 74 3b 0a 73 74 72 75 63 74 20  Context;.struct 
a6c0: 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 20 7b 0a  DbEvalContext {.
a6d0: 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 3b    SqliteDb *pDb;
a6e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a6f0: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 61    /* Database ha
a700: 6e 64 6c 65 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62  ndle */.  Tcl_Ob
a710: 6a 20 2a 70 53 71 6c 3b 20 20 20 20 20 20 20 20  j *pSql;        
a720: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a            /* Obj
a730: 65 63 74 20 68 6f 6c 64 69 6e 67 20 73 74 72 69  ect holding stri
a740: 6e 67 20 7a 53 71 6c 20 2a 2f 0a 20 20 63 6f 6e  ng zSql */.  con
a750: 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 3b 20 20  st char *zSql;  
a760: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a770: 52 65 6d 61 69 6e 69 6e 67 20 53 51 4c 20 74 6f  Remaining SQL to
a780: 20 65 78 65 63 75 74 65 20 2a 2f 0a 20 20 53 71   execute */.  Sq
a790: 6c 50 72 65 70 61 72 65 64 53 74 6d 74 20 2a 70  lPreparedStmt *p
a7a0: 50 72 65 53 74 6d 74 3b 20 20 20 20 20 20 2f 2a  PreStmt;      /*
a7b0: 20 43 75 72 72 65 6e 74 20 73 74 61 74 65 6d 65   Current stateme
a7c0: 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c  nt */.  int nCol
a7d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
a7e0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
a7f0: 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 72 65 74  r of columns ret
a800: 75 72 6e 65 64 20 62 79 20 70 53 74 6d 74 20 2a  urned by pStmt *
a810: 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 41 72  /.  Tcl_Obj *pAr
a820: 72 61 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  ray;            
a830: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 61      /* Name of a
a840: 72 72 61 79 20 76 61 72 69 61 62 6c 65 20 2a 2f  rray variable */
a850: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 61 70 43  .  Tcl_Obj **apC
a860: 6f 6c 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20  olName;         
a870: 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 63     /* Array of c
a880: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 7d  olumn names */.}
a890: 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65  ;../*.** Release
a8a0: 20 61 6e 79 20 63 61 63 68 65 20 6f 66 20 63 6f   any cache of co
a8b0: 6c 75 6d 6e 20 6e 61 6d 65 73 20 63 75 72 72 65  lumn names curre
a8c0: 6e 74 6c 79 20 68 65 6c 64 20 61 73 20 70 61 72  ntly held as par
a8d0: 74 20 6f 66 0a 2a 2a 20 74 68 65 20 44 62 45 76  t of.** the DbEv
a8e0: 61 6c 43 6f 6e 74 65 78 74 20 73 74 72 75 63 74  alContext struct
a8f0: 75 72 65 20 70 61 73 73 65 64 20 61 73 20 74 68  ure passed as th
a900: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
a910: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
a920: 20 64 62 52 65 6c 65 61 73 65 43 6f 6c 75 6d 6e   dbReleaseColumn
a930: 4e 61 6d 65 73 28 44 62 45 76 61 6c 43 6f 6e 74  Names(DbEvalCont
a940: 65 78 74 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  ext *p){.  if( p
a950: 2d 3e 61 70 43 6f 6c 4e 61 6d 65 20 29 7b 0a 20  ->apColName ){. 
a960: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
a970: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c  r(i=0; i<p->nCol
a980: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 54 63  ; i++){.      Tc
a990: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70  l_DecrRefCount(p
a9a0: 2d 3e 61 70 43 6f 6c 4e 61 6d 65 5b 69 5d 29 3b  ->apColName[i]);
a9b0: 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 46  .    }.    Tcl_F
a9c0: 72 65 65 28 28 63 68 61 72 20 2a 29 70 2d 3e 61  ree((char *)p->a
a9d0: 70 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 70  pColName);.    p
a9e0: 2d 3e 61 70 43 6f 6c 4e 61 6d 65 20 3d 20 30 3b  ->apColName = 0;
a9f0: 0a 20 20 7d 0a 20 20 70 2d 3e 6e 43 6f 6c 20 3d  .  }.  p->nCol =
aa00: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69   0;.}../*.** Ini
aa10: 74 69 61 6c 69 7a 65 20 61 20 44 62 45 76 61 6c  tialize a DbEval
aa20: 43 6f 6e 74 65 78 74 20 73 74 72 75 63 74 75 72  Context structur
aa30: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 41 72 72  e..**.** If pArr
aa40: 61 79 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  ay is not NULL, 
aa50: 74 68 65 6e 20 69 74 20 63 6f 6e 74 61 69 6e 73  then it contains
aa60: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 54   the name of a T
aa70: 63 6c 20 61 72 72 61 79 0a 2a 2a 20 76 61 72 69  cl array.** vari
aa80: 61 62 6c 65 2e 20 54 68 65 20 22 2a 22 20 6d 65  able. The "*" me
aa90: 6d 62 65 72 20 6f 66 20 74 68 69 73 20 61 72 72  mber of this arr
aaa0: 61 79 20 69 73 20 73 65 74 20 74 6f 20 61 20 6c  ay is set to a l
aab0: 69 73 74 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 2a  ist containing.*
aac0: 2a 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 74  * the names of t
aad0: 68 65 20 63 6f 6c 75 6d 6e 73 20 72 65 74 75 72  he columns retur
aae0: 6e 65 64 20 62 79 20 74 68 65 20 73 74 61 74 65  ned by the state
aaf0: 6d 65 6e 74 20 61 73 20 70 61 72 74 20 6f 66 20  ment as part of 
ab00: 65 61 63 68 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20  each.** call to 
ab10: 64 62 45 76 61 6c 53 74 65 70 28 29 2c 20 69 6e  dbEvalStep(), in
ab20: 20 6f 72 64 65 72 20 66 72 6f 6d 20 6c 65 66 74   order from left
ab30: 20 74 6f 20 72 69 67 68 74 2e 20 65 2e 67 2e 20   to right. e.g. 
ab40: 69 66 20 74 68 65 20 6e 61 6d 65 73 20 0a 2a 2a  if the names .**
ab50: 20 6f 66 20 74 68 65 20 72 65 74 75 72 6e 65 64   of the returned
ab60: 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 61 2c 20   columns are a, 
ab70: 62 20 61 6e 64 20 63 2c 20 69 74 20 64 6f 65 73  b and c, it does
ab80: 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e 74 20   the equivalent 
ab90: 6f 66 20 74 68 65 20 0a 2a 2a 20 74 63 6c 20 63  of the .** tcl c
aba0: 6f 6d 6d 61 6e 64 3a 0a 2a 2a 0a 2a 2a 20 20 20  ommand:.**.**   
abb0: 20 20 73 65 74 20 24 7b 70 41 72 72 61 79 7d 28    set ${pArray}(
abc0: 2a 29 20 7b 61 20 62 20 63 7d 0a 2a 2f 0a 73 74  *) {a b c}.*/.st
abd0: 61 74 69 63 20 76 6f 69 64 20 64 62 45 76 61 6c  atic void dbEval
abe0: 49 6e 69 74 28 0a 20 20 44 62 45 76 61 6c 43 6f  Init(.  DbEvalCo
abf0: 6e 74 65 78 74 20 2a 70 2c 20 20 20 20 20 20 20  ntext *p,       
ac00: 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
ac10: 65 72 20 74 6f 20 73 74 72 75 63 74 75 72 65 20  er to structure 
ac20: 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 2a 2f  to initialize */
ac30: 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62  .  SqliteDb *pDb
ac40: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
ac50: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68     /* Database h
ac60: 61 6e 64 6c 65 20 2a 2f 0a 20 20 54 63 6c 5f 4f  andle */.  Tcl_O
ac70: 62 6a 20 2a 70 53 71 6c 2c 20 20 20 20 20 20 20  bj *pSql,       
ac80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 62             /* Ob
ac90: 6a 65 63 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ject containing 
aca0: 53 51 4c 20 73 63 72 69 70 74 20 2a 2f 0a 20 20  SQL script */.  
acb0: 54 63 6c 5f 4f 62 6a 20 2a 70 41 72 72 61 79 20  Tcl_Obj *pArray 
acc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
acd0: 2f 2a 20 4e 61 6d 65 20 6f 66 20 54 63 6c 20 61  /* Name of Tcl a
ace0: 72 72 61 79 20 74 6f 20 73 65 74 20 28 2a 29 20  rray to set (*) 
acf0: 65 6c 65 6d 65 6e 74 20 6f 66 20 2a 2f 0a 29 7b  element of */.){
ad00: 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20  .  memset(p, 0, 
ad10: 73 69 7a 65 6f 66 28 44 62 45 76 61 6c 43 6f 6e  sizeof(DbEvalCon
ad20: 74 65 78 74 29 29 3b 0a 20 20 70 2d 3e 70 44 62  text));.  p->pDb
ad30: 20 3d 20 70 44 62 3b 0a 20 20 70 2d 3e 7a 53 71   = pDb;.  p->zSq
ad40: 6c 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  l = Tcl_GetStrin
ad50: 67 28 70 53 71 6c 29 3b 0a 20 20 70 2d 3e 70 53  g(pSql);.  p->pS
ad60: 71 6c 20 3d 20 70 53 71 6c 3b 0a 20 20 54 63 6c  ql = pSql;.  Tcl
ad70: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 53  _IncrRefCount(pS
ad80: 71 6c 29 3b 0a 20 20 69 66 28 20 70 41 72 72 61  ql);.  if( pArra
ad90: 79 20 29 7b 0a 20 20 20 20 70 2d 3e 70 41 72 72  y ){.    p->pArr
ada0: 61 79 20 3d 20 70 41 72 72 61 79 3b 0a 20 20 20  ay = pArray;.   
adb0: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
adc0: 74 28 70 41 72 72 61 79 29 3b 0a 20 20 7d 0a 7d  t(pArray);.  }.}
add0: 0a 0a 2f 2a 0a 2a 2a 20 4f 62 74 61 69 6e 20 69  ../*.** Obtain i
ade0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74  nformation about
adf0: 20 74 68 65 20 72 6f 77 20 74 68 61 74 20 74 68   the row that th
ae00: 65 20 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 20  e DbEvalContext 
ae10: 70 61 73 73 65 64 20 61 73 20 74 68 65 0a 2a 2a  passed as the.**
ae20: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
ae30: 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73  currently points
ae40: 20 74 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76   to..*/.static v
ae50: 6f 69 64 20 64 62 45 76 61 6c 52 6f 77 49 6e 66  oid dbEvalRowInf
ae60: 6f 28 0a 20 20 44 62 45 76 61 6c 43 6f 6e 74 65  o(.  DbEvalConte
ae70: 78 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  xt *p,          
ae80: 20 20 20 20 20 2f 2a 20 45 76 61 6c 75 61 74 69       /* Evaluati
ae90: 6f 6e 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  on context */.  
aea0: 69 6e 74 20 2a 70 6e 43 6f 6c 2c 20 20 20 20 20  int *pnCol,     
aeb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aec0: 2f 2a 20 4f 55 54 3a 20 4e 75 6d 62 65 72 20 6f  /* OUT: Number o
aed0: 66 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a  f column names *
aee0: 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 2a 70  /.  Tcl_Obj ***p
aef0: 61 70 43 6f 6c 4e 61 6d 65 20 20 20 20 20 20 20  apColName       
af00: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 41 72 72 61      /* OUT: Arra
af10: 79 20 6f 66 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  y of column name
af20: 73 20 2a 2f 0a 29 7b 0a 20 20 2f 2a 20 43 6f 6d  s */.){.  /* Com
af30: 70 75 74 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  pute column name
af40: 73 20 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 70 2d  s */.  if( 0==p-
af50: 3e 61 70 43 6f 6c 4e 61 6d 65 20 29 7b 0a 20 20  >apColName ){.  
af60: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
af70: 70 53 74 6d 74 20 3d 20 70 2d 3e 70 50 72 65 53  pStmt = p->pPreS
af80: 74 6d 74 2d 3e 70 53 74 6d 74 3b 0a 20 20 20 20  tmt->pStmt;.    
af90: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
afa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
afb0: 20 49 74 65 72 61 74 6f 72 20 76 61 72 69 61 62   Iterator variab
afc0: 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 43  le */.    int nC
afd0: 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ol;             
afe0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
aff0: 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 72 65 74  r of columns ret
b000: 75 72 6e 65 64 20 62 79 20 70 53 74 6d 74 20 2a  urned by pStmt *
b010: 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a  /.    Tcl_Obj **
b020: 61 70 43 6f 6c 4e 61 6d 65 20 3d 20 30 3b 20 20  apColName = 0;  
b030: 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
b040: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a  column names */.
b050: 0a 20 20 20 20 70 2d 3e 6e 43 6f 6c 20 3d 20 6e  .    p->nCol = n
b060: 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  Col = sqlite3_co
b070: 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70 53 74 6d 74  lumn_count(pStmt
b080: 29 3b 0a 20 20 20 20 69 66 28 20 6e 43 6f 6c 3e  );.    if( nCol>
b090: 30 20 26 26 20 28 70 61 70 43 6f 6c 4e 61 6d 65  0 && (papColName
b0a0: 20 7c 7c 20 70 2d 3e 70 41 72 72 61 79 29 20 29   || p->pArray) )
b0b0: 7b 0a 20 20 20 20 20 20 61 70 43 6f 6c 4e 61 6d  {.      apColNam
b0c0: 65 20 3d 20 28 54 63 6c 5f 4f 62 6a 2a 2a 29 54  e = (Tcl_Obj**)T
b0d0: 63 6c 5f 41 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  cl_Alloc( sizeof
b0e0: 28 54 63 6c 5f 4f 62 6a 2a 29 2a 6e 43 6f 6c 20  (Tcl_Obj*)*nCol 
b0f0: 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  );.      for(i=0
b100: 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  ; i<nCol; i++){.
b110: 20 20 20 20 20 20 20 20 61 70 43 6f 6c 4e 61 6d          apColNam
b120: 65 5b 69 5d 20 3d 20 54 63 6c 5f 4e 65 77 53 74  e[i] = Tcl_NewSt
b130: 72 69 6e 67 4f 62 6a 28 73 71 6c 69 74 65 33 5f  ringObj(sqlite3_
b140: 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 28 70 53 74 6d  column_name(pStm
b150: 74 2c 69 29 2c 20 2d 31 29 3b 0a 20 20 20 20 20  t,i), -1);.     
b160: 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f     Tcl_IncrRefCo
b170: 75 6e 74 28 61 70 43 6f 6c 4e 61 6d 65 5b 69 5d  unt(apColName[i]
b180: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
b190: 20 70 2d 3e 61 70 43 6f 6c 4e 61 6d 65 20 3d 20   p->apColName = 
b1a0: 61 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20 20 20 7d  apColName;.    }
b1b0: 0a 0a 20 20 20 20 2f 2a 20 49 66 20 72 65 73 75  ..    /* If resu
b1c0: 6c 74 73 20 61 72 65 20 62 65 69 6e 67 20 73 74  lts are being st
b1d0: 6f 72 65 64 20 69 6e 20 61 6e 20 61 72 72 61 79  ored in an array
b1e0: 20 76 61 72 69 61 62 6c 65 2c 20 74 68 65 6e 20   variable, then 
b1f0: 63 72 65 61 74 65 0a 20 20 20 20 2a 2a 20 74 68  create.    ** th
b200: 65 20 61 72 72 61 79 28 2a 29 20 65 6e 74 72 79  e array(*) entry
b210: 20 66 6f 72 20 74 68 61 74 20 61 72 72 61 79 0a   for that array.
b220: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
b230: 2d 3e 70 41 72 72 61 79 20 29 7b 0a 20 20 20 20  ->pArray ){.    
b240: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
b250: 74 65 72 70 20 3d 20 70 2d 3e 70 44 62 2d 3e 69  terp = p->pDb->i
b260: 6e 74 65 72 70 3b 0a 20 20 20 20 20 20 54 63 6c  nterp;.      Tcl
b270: 5f 4f 62 6a 20 2a 70 43 6f 6c 4c 69 73 74 20 3d  _Obj *pColList =
b280: 20 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20   Tcl_NewObj();. 
b290: 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 53       Tcl_Obj *pS
b2a0: 74 61 72 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72  tar = Tcl_NewStr
b2b0: 69 6e 67 4f 62 6a 28 22 2a 22 2c 20 2d 31 29 3b  ingObj("*", -1);
b2c0: 0a 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ..      for(i=0;
b2d0: 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20   i<nCol; i++){. 
b2e0: 20 20 20 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f         Tcl_ListO
b2f0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
b300: 69 6e 74 65 72 70 2c 20 70 43 6f 6c 4c 69 73 74  interp, pColList
b310: 2c 20 61 70 43 6f 6c 4e 61 6d 65 5b 69 5d 29 3b  , apColName[i]);
b320: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 54  .      }.      T
b330: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
b340: 70 53 74 61 72 29 3b 0a 20 20 20 20 20 20 54 63  pStar);.      Tc
b350: 6c 5f 4f 62 6a 53 65 74 56 61 72 32 28 69 6e 74  l_ObjSetVar2(int
b360: 65 72 70 2c 20 70 2d 3e 70 41 72 72 61 79 2c 20  erp, p->pArray, 
b370: 70 53 74 61 72 2c 20 70 43 6f 6c 4c 69 73 74 2c  pStar, pColList,
b380: 20 30 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 44   0);.      Tcl_D
b390: 65 63 72 52 65 66 43 6f 75 6e 74 28 70 53 74 61  ecrRefCount(pSta
b3a0: 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  r);.    }.  }.. 
b3b0: 20 69 66 28 20 70 61 70 43 6f 6c 4e 61 6d 65 20   if( papColName 
b3c0: 29 7b 0a 20 20 20 20 2a 70 61 70 43 6f 6c 4e 61  ){.    *papColNa
b3d0: 6d 65 20 3d 20 70 2d 3e 61 70 43 6f 6c 4e 61 6d  me = p->apColNam
b3e0: 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 6e 43  e;.  }.  if( pnC
b3f0: 6f 6c 20 29 7b 0a 20 20 20 20 2a 70 6e 43 6f 6c  ol ){.    *pnCol
b400: 20 3d 20 70 2d 3e 6e 43 6f 6c 3b 0a 20 20 7d 0a   = p->nCol;.  }.
b410: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
b420: 6f 6e 65 20 6f 66 20 54 43 4c 5f 4f 4b 2c 20 54  one of TCL_OK, T
b430: 43 4c 5f 42 52 45 41 4b 20 6f 72 20 54 43 4c 5f  CL_BREAK or TCL_
b440: 45 52 52 4f 52 2e 20 49 66 20 54 43 4c 5f 45 52  ERROR. If TCL_ER
b450: 52 4f 52 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e  ROR is.** return
b460: 65 64 2c 20 74 68 65 6e 20 61 6e 20 65 72 72 6f  ed, then an erro
b470: 72 20 6d 65 73 73 61 67 65 20 69 73 20 73 74 6f  r message is sto
b480: 72 65 64 20 69 6e 20 74 68 65 20 69 6e 74 65 72  red in the inter
b490: 70 72 65 74 65 72 20 62 65 66 6f 72 65 0a 2a 2a  preter before.**
b4a0: 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a   returning..**.*
b4b0: 2a 20 41 20 72 65 74 75 72 6e 20 76 61 6c 75 65  * A return value
b4c0: 20 6f 66 20 54 43 4c 5f 4f 4b 20 6d 65 61 6e 73   of TCL_OK means
b4d0: 20 74 68 65 72 65 20 69 73 20 61 20 72 6f 77 20   there is a row 
b4e0: 6f 66 20 64 61 74 61 20 61 76 61 69 6c 61 62 6c  of data availabl
b4f0: 65 2e 20 54 68 65 0a 2a 2a 20 64 61 74 61 20 6d  e. The.** data m
b500: 61 79 20 62 65 20 61 63 63 65 73 73 65 64 20 75  ay be accessed u
b510: 73 69 6e 67 20 64 62 45 76 61 6c 52 6f 77 49 6e  sing dbEvalRowIn
b520: 66 6f 28 29 20 61 6e 64 20 64 62 45 76 61 6c 43  fo() and dbEvalC
b530: 6f 6c 75 6d 6e 56 61 6c 75 65 28 29 2e 20 54 68  olumnValue(). Th
b540: 69 73 0a 2a 2a 20 69 73 20 61 6e 61 6c 6f 67 6f  is.** is analogo
b550: 75 73 20 74 6f 20 61 20 72 65 74 75 72 6e 20 6f  us to a return o
b560: 66 20 53 51 4c 49 54 45 5f 52 4f 57 20 66 72 6f  f SQLITE_ROW fro
b570: 6d 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29  m sqlite3_step()
b580: 2e 20 49 66 20 54 43 4c 5f 42 52 45 41 4b 0a 2a  . If TCL_BREAK.*
b590: 2a 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 74  * is returned, t
b5a0: 68 65 6e 20 74 68 65 20 53 51 4c 20 73 63 72 69  hen the SQL scri
b5b0: 70 74 20 68 61 73 20 66 69 6e 69 73 68 65 64 20  pt has finished 
b5c0: 65 78 65 63 75 74 69 6e 67 20 61 6e 64 20 74 68  executing and th
b5d0: 65 72 65 20 61 72 65 0a 2a 2a 20 6e 6f 20 66 75  ere are.** no fu
b5e0: 72 74 68 65 72 20 72 6f 77 73 20 61 76 61 69 6c  rther rows avail
b5f0: 61 62 6c 65 2e 20 54 68 69 73 20 69 73 20 73 69  able. This is si
b600: 6d 69 6c 61 72 20 74 6f 20 53 51 4c 49 54 45 5f  milar to SQLITE_
b610: 44 4f 4e 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  DONE..*/.static 
b620: 69 6e 74 20 64 62 45 76 61 6c 53 74 65 70 28 44  int dbEvalStep(D
b630: 62 45 76 61 6c 43 6f 6e 74 65 78 74 20 2a 70 29  bEvalContext *p)
b640: 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
b650: 7a 50 72 65 76 53 71 6c 20 3d 20 30 3b 20 20 20  zPrevSql = 0;   
b660: 20 20 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20      /* Previous 
b670: 76 61 6c 75 65 20 6f 66 20 70 2d 3e 7a 53 71 6c  value of p->zSql
b680: 20 2a 2f 0a 0a 20 20 77 68 69 6c 65 28 20 70 2d   */..  while( p-
b690: 3e 7a 53 71 6c 5b 30 5d 20 7c 7c 20 70 2d 3e 70  >zSql[0] || p->p
b6a0: 50 72 65 53 74 6d 74 20 29 7b 0a 20 20 20 20 69  PreStmt ){.    i
b6b0: 6e 74 20 72 63 3b 0a 20 20 20 20 69 66 28 20 70  nt rc;.    if( p
b6c0: 2d 3e 70 50 72 65 53 74 6d 74 3d 3d 30 20 29 7b  ->pPreStmt==0 ){
b6d0: 0a 20 20 20 20 20 20 7a 50 72 65 76 53 71 6c 20  .      zPrevSql 
b6e0: 3d 20 28 70 2d 3e 7a 53 71 6c 3d 3d 7a 50 72 65  = (p->zSql==zPre
b6f0: 76 53 71 6c 20 3f 20 30 20 3a 20 70 2d 3e 7a 53  vSql ? 0 : p->zS
b700: 71 6c 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  ql);.      rc = 
b710: 64 62 50 72 65 70 61 72 65 41 6e 64 42 69 6e 64  dbPrepareAndBind
b720: 28 70 2d 3e 70 44 62 2c 20 70 2d 3e 7a 53 71 6c  (p->pDb, p->zSql
b730: 2c 20 26 70 2d 3e 7a 53 71 6c 2c 20 26 70 2d 3e  , &p->zSql, &p->
b740: 70 50 72 65 53 74 6d 74 29 3b 0a 20 20 20 20 20  pPreStmt);.     
b750: 20 69 66 28 20 72 63 21 3d 54 43 4c 5f 4f 4b 20   if( rc!=TCL_OK 
b760: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
b770: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e   }else{.      in
b780: 74 20 72 63 73 3b 0a 20 20 20 20 20 20 53 71 6c  t rcs;.      Sql
b790: 69 74 65 44 62 20 2a 70 44 62 20 3d 20 70 2d 3e  iteDb *pDb = p->
b7a0: 70 44 62 3b 0a 20 20 20 20 20 20 53 71 6c 50 72  pDb;.      SqlPr
b7b0: 65 70 61 72 65 64 53 74 6d 74 20 2a 70 50 72 65  eparedStmt *pPre
b7c0: 53 74 6d 74 20 3d 20 70 2d 3e 70 50 72 65 53 74  Stmt = p->pPreSt
b7d0: 6d 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  mt;.      sqlite
b7e0: 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20  3_stmt *pStmt = 
b7f0: 70 50 72 65 53 74 6d 74 2d 3e 70 53 74 6d 74 3b  pPreStmt->pStmt;
b800: 0a 0a 20 20 20 20 20 20 72 63 73 20 3d 20 73 71  ..      rcs = sq
b810: 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74  lite3_step(pStmt
b820: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 73  );.      if( rcs
b830: 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a  ==SQLITE_ROW ){.
b840: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54          return T
b850: 43 4c 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  CL_OK;.      }. 
b860: 20 20 20 20 20 69 66 28 20 70 2d 3e 70 41 72 72       if( p->pArr
b870: 61 79 20 29 7b 0a 20 20 20 20 20 20 20 20 64 62  ay ){.        db
b880: 45 76 61 6c 52 6f 77 49 6e 66 6f 28 70 2c 20 30  EvalRowInfo(p, 0
b890: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
b8a0: 20 20 20 20 72 63 73 20 3d 20 73 71 6c 69 74 65      rcs = sqlite
b8b0: 33 5f 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a  3_reset(pStmt);.
b8c0: 0a 20 20 20 20 20 20 70 44 62 2d 3e 6e 53 74 65  .      pDb->nSte
b8d0: 70 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  p = sqlite3_stmt
b8e0: 5f 73 74 61 74 75 73 28 70 53 74 6d 74 2c 53 51  _status(pStmt,SQ
b8f0: 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f  LITE_STMTSTATUS_
b900: 46 55 4c 4c 53 43 41 4e 5f 53 54 45 50 2c 31 29  FULLSCAN_STEP,1)
b910: 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e 6e 53 6f  ;.      pDb->nSo
b920: 72 74 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 6d  rt = sqlite3_stm
b930: 74 5f 73 74 61 74 75 73 28 70 53 74 6d 74 2c 53  t_status(pStmt,S
b940: 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53  QLITE_STMTSTATUS
b950: 5f 53 4f 52 54 2c 31 29 3b 0a 20 20 20 20 20 20  _SORT,1);.      
b960: 70 44 62 2d 3e 6e 49 6e 64 65 78 20 3d 20 73 71  pDb->nIndex = sq
b970: 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74 61 74 75  lite3_stmt_statu
b980: 73 28 70 53 74 6d 74 2c 53 51 4c 49 54 45 5f 53  s(pStmt,SQLITE_S
b990: 54 4d 54 53 54 41 54 55 53 5f 41 55 54 4f 49 4e  TMTSTATUS_AUTOIN
b9a0: 44 45 58 2c 31 29 3b 0a 20 20 20 20 20 20 64 62  DEX,1);.      db
b9b0: 52 65 6c 65 61 73 65 43 6f 6c 75 6d 6e 4e 61 6d  ReleaseColumnNam
b9c0: 65 73 28 70 29 3b 0a 20 20 20 20 20 20 70 2d 3e  es(p);.      p->
b9d0: 70 50 72 65 53 74 6d 74 20 3d 20 30 3b 0a 0a 20  pPreStmt = 0;.. 
b9e0: 20 20 20 20 20 69 66 28 20 72 63 73 21 3d 53 51       if( rcs!=SQ
b9f0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
ba00: 20 20 20 2f 2a 20 49 66 20 61 20 72 75 6e 2d 74     /* If a run-t
ba10: 69 6d 65 20 65 72 72 6f 72 20 6f 63 63 75 72 73  ime error occurs
ba20: 2c 20 72 65 70 6f 72 74 20 74 68 65 20 65 72 72  , report the err
ba30: 6f 72 20 61 6e 64 20 73 74 6f 70 20 72 65 61 64  or and stop read
ba40: 69 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ing.        ** t
ba50: 68 65 20 53 51 4c 2e 20 20 2a 2f 0a 20 20 20 20  he SQL.  */.    
ba60: 20 20 20 20 64 62 52 65 6c 65 61 73 65 53 74 6d      dbReleaseStm
ba70: 74 28 70 44 62 2c 20 70 50 72 65 53 74 6d 74 2c  t(pDb, pPreStmt,
ba80: 20 31 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f   1);.#if SQLITE_
ba90: 54 45 53 54 0a 20 20 20 20 20 20 20 20 69 66 28  TEST.        if(
baa0: 20 70 2d 3e 70 44 62 2d 3e 62 4c 65 67 61 63 79   p->pDb->bLegacy
bab0: 50 72 65 70 61 72 65 20 26 26 20 72 63 73 3d 3d  Prepare && rcs==
bac0: 53 51 4c 49 54 45 5f 53 43 48 45 4d 41 20 26 26  SQLITE_SCHEMA &&
bad0: 20 7a 50 72 65 76 53 71 6c 20 29 7b 0a 20 20 20   zPrevSql ){.   
bae0: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65         /* If the
baf0: 20 72 75 6e 74 69 6d 65 20 65 72 72 6f 72 20 77   runtime error w
bb00: 61 73 20 61 6e 20 53 51 4c 49 54 45 5f 53 43 48  as an SQLITE_SCH
bb10: 45 4d 41 2c 20 61 6e 64 20 74 68 65 20 64 61 74  EMA, and the dat
bb20: 61 62 61 73 65 0a 20 20 20 20 20 20 20 20 20 20  abase.          
bb30: 2a 2a 20 68 61 6e 64 6c 65 20 69 73 20 63 6f 6e  ** handle is con
bb40: 66 69 67 75 72 65 64 20 74 6f 20 75 73 65 20 74  figured to use t
bb50: 68 65 20 6c 65 67 61 63 79 20 73 71 6c 69 74 65  he legacy sqlite
bb60: 33 5f 70 72 65 70 61 72 65 28 29 20 0a 20 20 20  3_prepare() .   
bb70: 20 20 20 20 20 20 20 2a 2a 20 69 6e 74 65 72 66         ** interf
bb80: 61 63 65 2c 20 72 65 74 72 79 20 70 72 65 70 61  ace, retry prepa
bb90: 72 65 28 29 2f 73 74 65 70 28 29 20 6f 6e 20 74  re()/step() on t
bba0: 68 65 20 73 61 6d 65 20 53 51 4c 20 73 74 61 74  he same SQL stat
bbb0: 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20 20 20 20  ement..         
bbc0: 20 2a 2a 20 54 68 69 73 20 6f 6e 6c 79 20 68 61   ** This only ha
bbd0: 70 70 65 6e 73 20 6f 6e 63 65 2e 20 49 66 20 74  ppens once. If t
bbe0: 68 65 72 65 20 69 73 20 61 20 73 65 63 6f 6e 64  here is a second
bbf0: 20 53 51 4c 49 54 45 5f 53 43 48 45 4d 41 0a 20   SQLITE_SCHEMA. 
bc00: 20 20 20 20 20 20 20 20 20 2a 2a 20 65 72 72 6f           ** erro
bc10: 72 2c 20 74 68 65 20 65 72 72 6f 72 20 77 69 6c  r, the error wil
bc20: 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20 74 6f  l be returned to
bc30: 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 2a 2f 0a   the caller. */.
bc40: 20 20 20 20 20 20 20 20 20 20 70 2d 3e 7a 53 71            p->zSq
bc50: 6c 20 3d 20 7a 50 72 65 76 53 71 6c 3b 0a 20 20  l = zPrevSql;.  
bc60: 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
bc70: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64  ;.        }.#end
bc80: 69 66 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 53  if.        Tcl_S
bc90: 65 74 4f 62 6a 52 65 73 75 6c 74 28 70 44 62 2d  etObjResult(pDb-
bca0: 3e 69 6e 74 65 72 70 2c 0a 20 20 20 20 20 20 20  >interp,.       
bcb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bcc0: 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f    Tcl_NewStringO
bcd0: 62 6a 28 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  bj(sqlite3_errms
bce0: 67 28 70 44 62 2d 3e 64 62 29 2c 20 2d 31 29 29  g(pDb->db), -1))
bcf0: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
bd00: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
bd10: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
bd20: 20 64 62 52 65 6c 65 61 73 65 53 74 6d 74 28 70   dbReleaseStmt(p
bd30: 44 62 2c 20 70 50 72 65 53 74 6d 74 2c 20 30 29  Db, pPreStmt, 0)
bd40: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
bd50: 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 69 73 68    }..  /* Finish
bd60: 65 64 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 54  ed */.  return T
bd70: 43 4c 5f 42 52 45 41 4b 3b 0a 7d 0a 0a 2f 2a 0a  CL_BREAK;.}../*.
bd80: 2a 2a 20 46 72 65 65 20 61 6c 6c 20 72 65 73 6f  ** Free all reso
bd90: 75 72 63 65 73 20 63 75 72 72 65 6e 74 6c 79 20  urces currently 
bda0: 68 65 6c 64 20 62 79 20 74 68 65 20 44 62 45 76  held by the DbEv
bdb0: 61 6c 43 6f 6e 74 65 78 74 20 73 74 72 75 63 74  alContext struct
bdc0: 75 72 65 20 70 61 73 73 65 64 0a 2a 2a 20 61 73  ure passed.** as
bdd0: 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
bde0: 65 6e 74 2e 20 54 68 65 72 65 20 73 68 6f 75 6c  ent. There shoul
bdf0: 64 20 62 65 20 65 78 61 63 74 6c 79 20 6f 6e 65  d be exactly one
be00: 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 66 75   call to this fu
be10: 6e 63 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 65 61  nction.** for ea
be20: 63 68 20 63 61 6c 6c 20 74 6f 20 64 62 45 76 61  ch call to dbEva
be30: 6c 49 6e 69 74 28 29 2e 0a 2a 2f 0a 73 74 61 74  lInit()..*/.stat
be40: 69 63 20 76 6f 69 64 20 64 62 45 76 61 6c 46 69  ic void dbEvalFi
be50: 6e 61 6c 69 7a 65 28 44 62 45 76 61 6c 43 6f 6e  nalize(DbEvalCon
be60: 74 65 78 74 20 2a 70 29 7b 0a 20 20 69 66 28 20  text *p){.  if( 
be70: 70 2d 3e 70 50 72 65 53 74 6d 74 20 29 7b 0a 20  p->pPreStmt ){. 
be80: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74     sqlite3_reset
be90: 28 70 2d 3e 70 50 72 65 53 74 6d 74 2d 3e 70 53  (p->pPreStmt->pS
bea0: 74 6d 74 29 3b 0a 20 20 20 20 64 62 52 65 6c 65  tmt);.    dbRele
beb0: 61 73 65 53 74 6d 74 28 70 2d 3e 70 44 62 2c 20  aseStmt(p->pDb, 
bec0: 70 2d 3e 70 50 72 65 53 74 6d 74 2c 20 30 29 3b  p->pPreStmt, 0);
bed0: 0a 20 20 20 20 70 2d 3e 70 50 72 65 53 74 6d 74  .    p->pPreStmt
bee0: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20   = 0;.  }.  if( 
bef0: 70 2d 3e 70 41 72 72 61 79 20 29 7b 0a 20 20 20  p->pArray ){.   
bf00: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
bf10: 74 28 70 2d 3e 70 41 72 72 61 79 29 3b 0a 20 20  t(p->pArray);.  
bf20: 20 20 70 2d 3e 70 41 72 72 61 79 20 3d 20 30 3b    p->pArray = 0;
bf30: 0a 20 20 7d 0a 20 20 54 63 6c 5f 44 65 63 72 52  .  }.  Tcl_DecrR
bf40: 65 66 43 6f 75 6e 74 28 70 2d 3e 70 53 71 6c 29  efCount(p->pSql)
bf50: 3b 0a 20 20 64 62 52 65 6c 65 61 73 65 43 6f 6c  ;.  dbReleaseCol
bf60: 75 6d 6e 4e 61 6d 65 73 28 70 29 3b 0a 7d 0a 0a  umnNames(p);.}..
bf70: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70  /*.** Return a p
bf80: 6f 69 6e 74 65 72 20 74 6f 20 61 20 54 63 6c 5f  ointer to a Tcl_
bf90: 4f 62 6a 20 73 74 72 75 63 74 75 72 65 20 77 69  Obj structure wi
bfa0: 74 68 20 72 65 66 2d 63 6f 75 6e 74 20 30 20 74  th ref-count 0 t
bfb0: 68 61 74 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20  hat contains.** 
bfc0: 74 68 65 20 76 61 6c 75 65 20 66 6f 72 20 74 68  the value for th
bfd0: 65 20 69 43 6f 6c 27 74 68 20 63 6f 6c 75 6d 6e  e iCol'th column
bfe0: 20 6f 66 20 74 68 65 20 72 6f 77 20 63 75 72 72   of the row curr
bff0: 65 6e 74 6c 79 20 70 6f 69 6e 74 65 64 20 74 6f  ently pointed to
c000: 20 62 79 0a 2a 2a 20 74 68 65 20 44 62 45 76 61   by.** the DbEva
c010: 6c 43 6f 6e 74 65 78 74 20 73 74 72 75 63 74 75  lContext structu
c020: 72 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  re passed as the
c030: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e   first argument.
c040: 0a 2a 2f 0a 73 74 61 74 69 63 20 54 63 6c 5f 4f  .*/.static Tcl_O
c050: 62 6a 20 2a 64 62 45 76 61 6c 43 6f 6c 75 6d 6e  bj *dbEvalColumn
c060: 56 61 6c 75 65 28 44 62 45 76 61 6c 43 6f 6e 74  Value(DbEvalCont
c070: 65 78 74 20 2a 70 2c 20 69 6e 74 20 69 43 6f 6c  ext *p, int iCol
c080: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ){.  sqlite3_stm
c090: 74 20 2a 70 53 74 6d 74 20 3d 20 70 2d 3e 70 50  t *pStmt = p->pP
c0a0: 72 65 53 74 6d 74 2d 3e 70 53 74 6d 74 3b 0a 20  reStmt->pStmt;. 
c0b0: 20 73 77 69 74 63 68 28 20 73 71 6c 69 74 65 33   switch( sqlite3
c0c0: 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 28 70 53 74  _column_type(pSt
c0d0: 6d 74 2c 20 69 43 6f 6c 29 20 29 7b 0a 20 20 20  mt, iCol) ){.   
c0e0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 42 4c 4f   case SQLITE_BLO
c0f0: 42 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 62  B: {.      int b
c100: 79 74 65 73 20 3d 20 73 71 6c 69 74 65 33 5f 63  ytes = sqlite3_c
c110: 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 53 74 6d  olumn_bytes(pStm
c120: 74 2c 20 69 43 6f 6c 29 3b 0a 20 20 20 20 20 20  t, iCol);.      
c130: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 42 6c 6f  const char *zBlo
c140: 62 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  b = sqlite3_colu
c150: 6d 6e 5f 62 6c 6f 62 28 70 53 74 6d 74 2c 20 69  mn_blob(pStmt, i
c160: 43 6f 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Col);.      if( 
c170: 21 7a 42 6c 6f 62 20 29 20 62 79 74 65 73 20 3d  !zBlob ) bytes =
c180: 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   0;.      return
c190: 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61   Tcl_NewByteArra
c1a0: 79 4f 62 6a 28 28 75 38 2a 29 7a 42 6c 6f 62 2c  yObj((u8*)zBlob,
c1b0: 20 62 79 74 65 73 29 3b 0a 20 20 20 20 7d 0a 20   bytes);.    }. 
c1c0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
c1d0: 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20 20 20  NTEGER: {.      
c1e0: 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 76 20 3d  sqlite_int64 v =
c1f0: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
c200: 69 6e 74 36 34 28 70 53 74 6d 74 2c 20 69 43 6f  int64(pStmt, iCo
c210: 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20 76 3e  l);.      if( v>
c220: 3d 2d 32 31 34 37 34 38 33 36 34 37 20 26 26 20  =-2147483647 && 
c230: 76 3c 3d 32 31 34 37 34 38 33 36 34 37 20 29 7b  v<=2147483647 ){
c240: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
c250: 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 28 69  Tcl_NewIntObj((i
c260: 6e 74 29 76 29 3b 0a 20 20 20 20 20 20 7d 65 6c  nt)v);.      }el
c270: 73 65 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75  se{.        retu
c280: 72 6e 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e  rn Tcl_NewWideIn
c290: 74 4f 62 6a 28 76 29 3b 0a 20 20 20 20 20 20 7d  tObj(v);.      }
c2a0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
c2b0: 53 51 4c 49 54 45 5f 46 4c 4f 41 54 3a 20 7b 0a  SQLITE_FLOAT: {.
c2c0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 63 6c        return Tcl
c2d0: 5f 4e 65 77 44 6f 75 62 6c 65 4f 62 6a 28 73 71  _NewDoubleObj(sq
c2e0: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 6f 75  lite3_column_dou
c2f0: 62 6c 65 28 70 53 74 6d 74 2c 20 69 43 6f 6c 29  ble(pStmt, iCol)
c300: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  );.    }.    cas
c310: 65 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 3a 20 7b  e SQLITE_NULL: {
c320: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 63  .      return Tc
c330: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70  l_NewStringObj(p
c340: 2d 3e 70 44 62 2d 3e 7a 4e 75 6c 6c 2c 20 2d 31  ->pDb->zNull, -1
c350: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
c360: 72 65 74 75 72 6e 20 54 63 6c 5f 4e 65 77 53 74  return Tcl_NewSt
c370: 72 69 6e 67 4f 62 6a 28 28 63 68 61 72 2a 29 73  ringObj((char*)s
c380: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
c390: 78 74 28 70 53 74 6d 74 2c 20 69 43 6f 6c 29 2c  xt(pStmt, iCol),
c3a0: 20 2d 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49   -1);.}../*.** I
c3b0: 66 20 75 73 69 6e 67 20 54 63 6c 20 76 65 72 73  f using Tcl vers
c3c0: 69 6f 6e 20 38 2e 36 20 6f 72 20 67 72 65 61 74  ion 8.6 or great
c3d0: 65 72 2c 20 75 73 65 20 74 68 65 20 4e 52 20 66  er, use the NR f
c3e0: 75 6e 63 74 69 6f 6e 73 20 74 6f 20 61 76 6f 69  unctions to avoi
c3f0: 64 0a 2a 2a 20 72 65 63 75 72 73 69 76 65 20 65  d.** recursive e
c400: 76 61 6c 75 74 69 6f 6e 20 6f 66 20 73 63 72 69  valution of scri
c410: 70 74 73 20 62 79 20 74 68 65 20 5b 64 62 20 65  pts by the [db e
c420: 76 61 6c 5d 20 61 6e 64 20 5b 64 62 20 74 72 61  val] and [db tra
c430: 6e 73 5d 0a 2a 2a 20 63 6f 6d 6d 61 6e 64 73 2e  ns].** commands.
c440: 20 45 76 65 6e 20 69 66 20 74 68 65 20 68 65 61   Even if the hea
c450: 64 65 72 73 20 75 73 65 64 20 77 68 69 6c 65 20  ders used while 
c460: 63 6f 6d 70 69 6c 69 6e 67 20 74 68 65 20 65 78  compiling the ex
c470: 74 65 6e 73 69 6f 6e 0a 2a 2a 20 61 72 65 20 38  tension.** are 8
c480: 2e 36 20 6f 72 20 6e 65 77 65 72 2c 20 74 68 65  .6 or newer, the
c490: 20 63 6f 64 65 20 73 74 69 6c 6c 20 74 65 73 74   code still test
c4a0: 73 20 74 68 65 20 54 63 6c 20 76 65 72 73 69 6f  s the Tcl versio
c4b0: 6e 20 61 74 20 72 75 6e 74 69 6d 65 2e 0a 2a 2a  n at runtime..**
c4c0: 20 54 68 69 73 20 61 6c 6c 6f 77 73 20 73 74 75   This allows stu
c4d0: 62 73 2d 65 6e 61 62 6c 65 64 20 62 75 69 6c 64  bs-enabled build
c4e0: 73 20 74 6f 20 62 65 20 75 73 65 64 20 77 69 74  s to be used wit
c4f0: 68 20 6f 6c 64 65 72 20 54 63 6c 20 6c 69 62 72  h older Tcl libr
c500: 61 72 69 65 73 2e 0a 2a 2f 0a 23 69 66 20 54 43  aries..*/.#if TC
c510: 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f 4e 3e  L_MAJOR_VERSION>
c520: 38 20 7c 7c 20 28 54 43 4c 5f 4d 41 4a 4f 52 5f  8 || (TCL_MAJOR_
c530: 56 45 52 53 49 4f 4e 3d 3d 38 20 26 26 20 54 43  VERSION==8 && TC
c540: 4c 5f 4d 49 4e 4f 52 5f 56 45 52 53 49 4f 4e 3e  L_MINOR_VERSION>
c550: 3d 36 29 0a 23 20 64 65 66 69 6e 65 20 53 51 4c  =6).# define SQL
c560: 49 54 45 5f 54 43 4c 5f 4e 52 45 20 31 0a 73 74  ITE_TCL_NRE 1.st
c570: 61 74 69 63 20 69 6e 74 20 44 62 55 73 65 4e 72  atic int DbUseNr
c580: 65 28 76 6f 69 64 29 7b 0a 20 20 69 6e 74 20 6d  e(void){.  int m
c590: 61 6a 6f 72 2c 20 6d 69 6e 6f 72 3b 0a 20 20 54  ajor, minor;.  T
c5a0: 63 6c 5f 47 65 74 56 65 72 73 69 6f 6e 28 26 6d  cl_GetVersion(&m
c5b0: 61 6a 6f 72 2c 20 26 6d 69 6e 6f 72 2c 20 30 2c  ajor, &minor, 0,
c5c0: 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 28 20 28   0);.  return( (
c5d0: 6d 61 6a 6f 72 3d 3d 38 20 26 26 20 6d 69 6e 6f  major==8 && mino
c5e0: 72 3e 3d 36 29 20 7c 7c 20 6d 61 6a 6f 72 3e 38  r>=6) || major>8
c5f0: 20 29 3b 0a 7d 0a 23 65 6c 73 65 0a 2f 2a 20 0a   );.}.#else./* .
c600: 2a 2a 20 43 6f 6d 70 69 6c 69 6e 67 20 75 73 69  ** Compiling usi
c610: 6e 67 20 68 65 61 64 65 72 73 20 65 61 72 6c 69  ng headers earli
c620: 65 72 20 74 68 61 6e 20 38 2e 36 2e 20 49 6e 20  er than 8.6. In 
c630: 74 68 69 73 20 63 61 73 65 20 4e 52 20 63 61 6e  this case NR can
c640: 6e 6f 74 20 62 65 0a 2a 2a 20 75 73 65 64 2c 20  not be.** used, 
c650: 73 6f 20 44 62 55 73 65 4e 72 65 28 29 20 74 6f  so DbUseNre() to
c660: 20 61 6c 77 61 79 73 20 72 65 74 75 72 6e 20 7a   always return z
c670: 65 72 6f 2e 20 41 64 64 20 23 64 65 66 69 6e 65  ero. Add #define
c680: 73 20 66 6f 72 20 74 68 65 20 6f 74 68 65 72 0a  s for the other.
c690: 2a 2a 20 54 63 6c 5f 4e 52 78 78 78 28 29 20 66  ** Tcl_NRxxx() f
c6a0: 75 6e 63 74 69 6f 6e 73 20 74 6f 20 70 72 65 76  unctions to prev
c6b0: 65 6e 74 20 74 68 65 6d 20 66 72 6f 6d 20 63 61  ent them from ca
c6c0: 75 73 69 6e 67 20 63 6f 6d 70 69 6c 61 74 69 6f  using compilatio
c6d0: 6e 20 65 72 72 6f 72 73 2c 0a 2a 2a 20 65 76 65  n errors,.** eve
c6e0: 6e 20 74 68 6f 75 67 68 20 74 68 65 20 6f 6e 6c  n though the onl
c6f0: 79 20 69 6e 76 6f 63 61 74 69 6f 6e 73 20 6f 66  y invocations of
c700: 20 74 68 65 6d 20 61 72 65 20 77 69 74 68 69 6e   them are within
c710: 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 62 6c 6f   conditional blo
c720: 63 6b 73 20 0a 2a 2a 20 6f 66 20 74 68 65 20 66  cks .** of the f
c730: 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28  orm:.**.**   if(
c740: 20 44 62 55 73 65 4e 72 65 28 29 20 29 20 7b 20   DbUseNre() ) { 
c750: 2e 2e 2e 20 7d 0a 2a 2f 0a 23 20 64 65 66 69 6e  ... }.*/.# defin
c760: 65 20 53 51 4c 49 54 45 5f 54 43 4c 5f 4e 52 45  e SQLITE_TCL_NRE
c770: 20 30 0a 23 20 64 65 66 69 6e 65 20 44 62 55 73   0.# define DbUs
c780: 65 4e 72 65 28 29 20 30 0a 23 20 64 65 66 69 6e  eNre() 0.# defin
c790: 65 20 54 63 6c 5f 4e 52 41 64 64 43 61 6c 6c 62  e Tcl_NRAddCallb
c7a0: 61 63 6b 28 61 2c 62 2c 63 2c 64 2c 65 2c 66 29  ack(a,b,c,d,e,f)
c7b0: 20 28 76 6f 69 64 29 30 0a 23 20 64 65 66 69 6e   (void)0.# defin
c7c0: 65 20 54 63 6c 5f 4e 52 45 76 61 6c 4f 62 6a 28  e Tcl_NREvalObj(
c7d0: 61 2c 62 2c 63 29 20 30 0a 23 20 64 65 66 69 6e  a,b,c) 0.# defin
c7e0: 65 20 54 63 6c 5f 4e 52 43 72 65 61 74 65 43 6f  e Tcl_NRCreateCo
c7f0: 6d 6d 61 6e 64 28 61 2c 62 2c 63 2c 64 2c 65 2c  mmand(a,b,c,d,e,
c800: 66 29 20 28 76 6f 69 64 29 30 0a 23 65 6e 64 69  f) (void)0.#endi
c810: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  f../*.** This fu
c820: 6e 63 74 69 6f 6e 20 69 73 20 70 61 72 74 20 6f  nction is part o
c830: 66 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  f the implementa
c840: 74 69 6f 6e 20 6f 66 20 74 68 65 20 63 6f 6d 6d  tion of the comm
c850: 61 6e 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 24 64 62  and:.**.**   $db
c860: 20 65 76 61 6c 20 53 51 4c 20 3f 41 52 52 41 59   eval SQL ?ARRAY
c870: 4e 41 4d 45 3f 20 53 43 52 49 50 54 0a 2a 2f 0a  NAME? SCRIPT.*/.
c880: 73 74 61 74 69 63 20 69 6e 74 20 44 62 45 76 61  static int DbEva
c890: 6c 4e 65 78 74 43 6d 64 28 0a 20 20 43 6c 69 65  lNextCmd(.  Clie
c8a0: 6e 74 44 61 74 61 20 64 61 74 61 5b 5d 2c 20 20  ntData data[],  
c8b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c8c0: 20 2f 2a 20 64 61 74 61 5b 30 5d 20 69 73 20 74   /* data[0] is t
c8d0: 68 65 20 28 44 62 45 76 61 6c 43 6f 6e 74 65 78  he (DbEvalContex
c8e0: 74 2a 29 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74  t*) */.  Tcl_Int
c8f0: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
c900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c910: 20 54 63 6c 20 69 6e 74 65 72 70 72 65 74 65 72   Tcl interpreter
c920: 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73 75 6c 74   */.  int result
c930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c940: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
c950: 73 75 6c 74 20 73 6f 20 66 61 72 20 2a 2f 0a 29  sult so far */.)
c960: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 72 65 73  {.  int rc = res
c970: 75 6c 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ult;            
c980: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
c990: 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a  rn code */..  /*
c9a0: 20 54 68 65 20 66 69 72 73 74 20 65 6c 65 6d 65   The first eleme
c9b0: 6e 74 20 6f 66 20 74 68 65 20 64 61 74 61 5b 5d  nt of the data[]
c9c0: 20 61 72 72 61 79 20 69 73 20 61 20 70 6f 69 6e   array is a poin
c9d0: 74 65 72 20 74 6f 20 61 20 44 62 45 76 61 6c 43  ter to a DbEvalC
c9e0: 6f 6e 74 65 78 74 0a 20 20 2a 2a 20 73 74 72 75  ontext.  ** stru
c9f0: 63 74 75 72 65 20 61 6c 6c 6f 63 61 74 65 64 20  cture allocated 
ca00: 75 73 69 6e 67 20 54 63 6c 5f 41 6c 6c 6f 63 28  using Tcl_Alloc(
ca10: 29 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 65 6c  ). The second el
ca20: 65 6d 65 6e 74 20 6f 66 20 64 61 74 61 5b 5d 0a  ement of data[].
ca30: 20 20 2a 2a 20 69 73 20 61 20 70 6f 69 6e 74 65    ** is a pointe
ca40: 72 20 74 6f 20 61 20 54 63 6c 5f 4f 62 6a 20 63  r to a Tcl_Obj c
ca50: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 73 63  ontaining the sc
ca60: 72 69 70 74 20 74 6f 20 72 75 6e 20 66 6f 72 20  ript to run for 
ca70: 65 61 63 68 20 72 6f 77 0a 20 20 2a 2a 20 72 65  each row.  ** re
ca80: 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 71 75  turned by the qu
ca90: 65 72 69 65 73 20 65 6e 63 61 70 73 75 6c 61 74  eries encapsulat
caa0: 65 64 20 69 6e 20 64 61 74 61 5b 30 5d 2e 20 2a  ed in data[0]. *
cab0: 2f 0a 20 20 44 62 45 76 61 6c 43 6f 6e 74 65 78  /.  DbEvalContex
cac0: 74 20 2a 70 20 3d 20 28 44 62 45 76 61 6c 43 6f  t *p = (DbEvalCo
cad0: 6e 74 65 78 74 20 2a 29 64 61 74 61 5b 30 5d 3b  ntext *)data[0];
cae0: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 53 63 72  .  Tcl_Obj *pScr
caf0: 69 70 74 20 3d 20 28 54 63 6c 5f 4f 62 6a 20 2a  ipt = (Tcl_Obj *
cb00: 29 64 61 74 61 5b 31 5d 3b 0a 20 20 54 63 6c 5f  )data[1];.  Tcl_
cb10: 4f 62 6a 20 2a 70 41 72 72 61 79 20 3d 20 70 2d  Obj *pArray = p-
cb20: 3e 70 41 72 72 61 79 3b 0a 0a 20 20 77 68 69 6c  >pArray;..  whil
cb30: 65 28 20 28 72 63 3d 3d 54 43 4c 5f 4f 4b 20 7c  e( (rc==TCL_OK |
cb40: 7c 20 72 63 3d 3d 54 43 4c 5f 43 4f 4e 54 49 4e  | rc==TCL_CONTIN
cb50: 55 45 29 20 26 26 20 54 43 4c 5f 4f 4b 3d 3d 28  UE) && TCL_OK==(
cb60: 72 63 20 3d 20 64 62 45 76 61 6c 53 74 65 70 28  rc = dbEvalStep(
cb70: 70 29 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  p)) ){.    int i
cb80: 3b 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a  ;.    int nCol;.
cb90: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 61 70      Tcl_Obj **ap
cba0: 43 6f 6c 4e 61 6d 65 3b 0a 20 20 20 20 64 62 45  ColName;.    dbE
cbb0: 76 61 6c 52 6f 77 49 6e 66 6f 28 70 2c 20 26 6e  valRowInfo(p, &n
cbc0: 43 6f 6c 2c 20 26 61 70 43 6f 6c 4e 61 6d 65 29  Col, &apColName)
cbd0: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
cbe0: 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nCol; i++){.   
cbf0: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 56 61 6c     Tcl_Obj *pVal
cc00: 20 3d 20 64 62 45 76 61 6c 43 6f 6c 75 6d 6e 56   = dbEvalColumnV
cc10: 61 6c 75 65 28 70 2c 20 69 29 3b 0a 20 20 20 20  alue(p, i);.    
cc20: 20 20 69 66 28 20 70 41 72 72 61 79 3d 3d 30 20    if( pArray==0 
cc30: 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 4f  ){.        Tcl_O
cc40: 62 6a 53 65 74 56 61 72 32 28 69 6e 74 65 72 70  bjSetVar2(interp
cc50: 2c 20 61 70 43 6f 6c 4e 61 6d 65 5b 69 5d 2c 20  , apColName[i], 
cc60: 30 2c 20 70 56 61 6c 2c 20 30 29 3b 0a 20 20 20  0, pVal, 0);.   
cc70: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
cc80: 20 20 54 63 6c 5f 4f 62 6a 53 65 74 56 61 72 32    Tcl_ObjSetVar2
cc90: 28 69 6e 74 65 72 70 2c 20 70 41 72 72 61 79 2c  (interp, pArray,
cca0: 20 61 70 43 6f 6c 4e 61 6d 65 5b 69 5d 2c 20 70   apColName[i], p
ccb0: 56 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  Val, 0);.      }
ccc0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54  .    }..    /* T
ccd0: 68 65 20 72 65 71 75 69 72 65 64 20 69 6e 74 65  he required inte
cce0: 72 70 72 65 74 65 72 20 76 61 72 69 61 62 6c 65  rpreter variable
ccf0: 73 20 61 72 65 20 6e 6f 77 20 70 6f 70 75 6c 61  s are now popula
cd00: 74 65 64 20 77 69 74 68 20 74 68 65 20 64 61 74  ted with the dat
cd10: 61 20 0a 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74  a .    ** from t
cd20: 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 2e 20  he current row. 
cd30: 49 66 20 75 73 69 6e 67 20 4e 52 45 2c 20 73 63  If using NRE, sc
cd40: 68 65 64 75 6c 65 20 63 61 6c 6c 62 61 63 6b 73  hedule callbacks
cd50: 20 74 6f 20 65 76 61 6c 75 61 74 65 0a 20 20 20   to evaluate.   
cd60: 20 2a 2a 20 73 63 72 69 70 74 20 70 53 63 72 69   ** script pScri
cd70: 70 74 2c 20 74 68 65 6e 20 74 6f 20 69 6e 76 6f  pt, then to invo
cd80: 6b 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ke this function
cd90: 20 61 67 61 69 6e 20 74 6f 20 66 65 74 63 68 20   again to fetch 
cda0: 74 68 65 20 6e 65 78 74 0a 20 20 20 20 2a 2a 20  the next.    ** 
cdb0: 72 6f 77 20 28 6f 72 20 63 6c 65 61 6e 20 75 70  row (or clean up
cdc0: 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   if there is no 
cdd0: 6e 65 78 74 20 72 6f 77 20 6f 72 20 74 68 65 20  next row or the 
cde0: 73 63 72 69 70 74 20 74 68 72 6f 77 73 20 61 6e  script throws an
cdf0: 0a 20 20 20 20 2a 2a 20 65 78 63 65 70 74 69 6f  .    ** exceptio
ce00: 6e 29 2e 20 41 66 74 65 72 20 73 63 68 65 64 75  n). After schedu
ce10: 6c 69 6e 67 20 74 68 65 20 63 61 6c 6c 62 61 63  ling the callbac
ce20: 6b 73 2c 20 72 65 74 75 72 6e 20 63 6f 6e 74 72  ks, return contr
ce30: 6f 6c 20 74 6f 20 74 68 65 20 0a 20 20 20 20 2a  ol to the .    *
ce40: 2a 20 63 61 6c 6c 65 72 2e 0a 20 20 20 20 2a 2a  * caller..    **
ce50: 0a 20 20 20 20 2a 2a 20 49 66 20 6e 6f 74 20 75  .    ** If not u
ce60: 73 69 6e 67 20 4e 52 45 2c 20 65 76 61 6c 75 61  sing NRE, evalua
ce70: 74 65 20 70 53 63 72 69 70 74 20 64 69 72 65 63  te pScript direc
ce80: 74 6c 79 20 61 6e 64 20 63 6f 6e 74 69 6e 75 65  tly and continue
ce90: 20 77 69 74 68 20 74 68 65 0a 20 20 20 20 2a 2a   with the.    **
cea0: 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f 6e 20   next iteration 
ceb0: 6f 66 20 74 68 69 73 20 77 68 69 6c 65 28 2e 2e  of this while(..
cec0: 2e 29 20 6c 6f 6f 70 2e 20 20 2a 2f 0a 20 20 20  .) loop.  */.   
ced0: 20 69 66 28 20 44 62 55 73 65 4e 72 65 28 29 20   if( DbUseNre() 
cee0: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 4e 52 41  ){.      Tcl_NRA
cef0: 64 64 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72  ddCallback(inter
cf00: 70 2c 20 44 62 45 76 61 6c 4e 65 78 74 43 6d 64  p, DbEvalNextCmd
cf10: 2c 20 28 76 6f 69 64 2a 29 70 2c 20 28 76 6f 69  , (void*)p, (voi
cf20: 64 2a 29 70 53 63 72 69 70 74 2c 20 30 2c 20 30  d*)pScript, 0, 0
cf30: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
cf40: 54 63 6c 5f 4e 52 45 76 61 6c 4f 62 6a 28 69 6e  Tcl_NREvalObj(in
cf50: 74 65 72 70 2c 20 70 53 63 72 69 70 74 2c 20 30  terp, pScript, 0
cf60: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
cf70: 20 20 20 20 72 63 20 3d 20 54 63 6c 5f 45 76 61      rc = Tcl_Eva
cf80: 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c 20 70  lObjEx(interp, p
cf90: 53 63 72 69 70 74 2c 20 30 29 3b 0a 20 20 20 20  Script, 0);.    
cfa0: 7d 0a 20 20 7d 0a 0a 20 20 54 63 6c 5f 44 65 63  }.  }..  Tcl_Dec
cfb0: 72 52 65 66 43 6f 75 6e 74 28 70 53 63 72 69 70  rRefCount(pScrip
cfc0: 74 29 3b 0a 20 20 64 62 45 76 61 6c 46 69 6e 61  t);.  dbEvalFina
cfd0: 6c 69 7a 65 28 70 29 3b 0a 20 20 54 63 6c 5f 46  lize(p);.  Tcl_F
cfe0: 72 65 65 28 28 63 68 61 72 20 2a 29 70 29 3b 0a  ree((char *)p);.
cff0: 0a 20 20 69 66 28 20 72 63 3d 3d 54 43 4c 5f 4f  .  if( rc==TCL_O
d000: 4b 20 7c 7c 20 72 63 3d 3d 54 43 4c 5f 42 52 45  K || rc==TCL_BRE
d010: 41 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 52 65  AK ){.    Tcl_Re
d020: 73 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  setResult(interp
d030: 29 3b 0a 20 20 20 20 72 63 20 3d 20 54 43 4c 5f  );.    rc = TCL_
d040: 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  OK;.  }.  return
d050: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
d060: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
d070: 73 65 64 20 62 79 20 74 68 65 20 69 6d 70 6c 65  sed by the imple
d080: 6d 65 6e 74 61 74 69 6f 6e 73 20 6f 66 20 74 68  mentations of th
d090: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 64 61 74 61  e following data
d0a0: 62 61 73 65 20 0a 2a 2a 20 68 61 6e 64 6c 65 20  base .** handle 
d0b0: 73 75 62 2d 63 6f 6d 6d 61 6e 64 73 3a 0a 2a 2a  sub-commands:.**
d0c0: 0a 2a 2a 20 20 20 24 64 62 20 75 70 64 61 74 65  .**   $db update
d0d0: 5f 68 6f 6f 6b 20 3f 53 43 52 49 50 54 3f 0a 2a  _hook ?SCRIPT?.*
d0e0: 2a 20 20 20 24 64 62 20 77 61 6c 5f 68 6f 6f 6b  *   $db wal_hook
d0f0: 20 3f 53 43 52 49 50 54 3f 0a 2a 2a 20 20 20 24   ?SCRIPT?.**   $
d100: 64 62 20 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 20 3f  db commit_hook ?
d110: 53 43 52 49 50 54 3f 0a 2a 2a 20 20 20 24 64 62  SCRIPT?.**   $db
d120: 20 70 72 65 75 70 64 61 74 65 20 68 6f 6f 6b 20   preupdate hook 
d130: 3f 53 43 52 49 50 54 3f 0a 2a 2f 0a 73 74 61 74  ?SCRIPT?.*/.stat
d140: 69 63 20 76 6f 69 64 20 44 62 48 6f 6f 6b 43 6d  ic void DbHookCm
d150: 64 28 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  d(.  Tcl_Interp 
d160: 2a 69 6e 74 65 72 70 2c 20 20 20 20 20 20 20 20  *interp,        
d170: 20 20 20 20 20 2f 2a 20 54 63 6c 20 69 6e 74 65       /* Tcl inte
d180: 72 70 72 65 74 65 72 20 2a 2f 0a 20 20 53 71 6c  rpreter */.  Sql
d190: 69 74 65 44 62 20 2a 70 44 62 2c 20 20 20 20 20  iteDb *pDb,     
d1a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d1b0: 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  Database handle 
d1c0: 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 41  */.  Tcl_Obj *pA
d1d0: 72 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  rg,             
d1e0: 20 20 20 20 20 2f 2a 20 53 43 52 49 50 54 20 61       /* SCRIPT a
d1f0: 72 67 75 6d 65 6e 74 20 28 6f 72 20 4e 55 4c 4c  rgument (or NULL
d200: 29 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  ) */.  Tcl_Obj *
d210: 2a 70 70 48 6f 6f 6b 20 20 20 20 20 20 20 20 20  *ppHook         
d220: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
d230: 72 20 74 6f 20 6d 65 6d 62 65 72 20 6f 66 20 53  r to member of S
d240: 71 6c 69 74 65 44 62 20 2a 2f 0a 29 7b 0a 20 20  qliteDb */.){.  
d250: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 44  sqlite3 *db = pD
d260: 62 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 2a 70  b->db;..  if( *p
d270: 70 48 6f 6f 6b 20 29 7b 0a 20 20 20 20 54 63 6c  pHook ){.    Tcl
d280: 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
d290: 74 65 72 70 2c 20 2a 70 70 48 6f 6f 6b 29 3b 0a  terp, *ppHook);.
d2a0: 20 20 20 20 69 66 28 20 70 41 72 67 20 29 7b 0a      if( pArg ){.
d2b0: 20 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65        Tcl_DecrRe
d2c0: 66 43 6f 75 6e 74 28 2a 70 70 48 6f 6f 6b 29 3b  fCount(*ppHook);
d2d0: 0a 20 20 20 20 20 20 2a 70 70 48 6f 6f 6b 20 3d  .      *ppHook =
d2e0: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   0;.    }.  }.  
d2f0: 69 66 28 20 70 41 72 67 20 29 7b 0a 20 20 20 20  if( pArg ){.    
d300: 61 73 73 65 72 74 28 20 21 28 2a 70 70 48 6f 6f  assert( !(*ppHoo
d310: 6b 29 20 29 3b 0a 20 20 20 20 69 66 28 20 54 63  k) );.    if( Tc
d320: 6c 5f 47 65 74 43 68 61 72 4c 65 6e 67 74 68 28  l_GetCharLength(
d330: 70 41 72 67 29 3e 30 20 29 7b 0a 20 20 20 20 20  pArg)>0 ){.     
d340: 20 2a 70 70 48 6f 6f 6b 20 3d 20 70 41 72 67 3b   *ppHook = pArg;
d350: 0a 20 20 20 20 20 20 54 63 6c 5f 49 6e 63 72 52  .      Tcl_IncrR
d360: 65 66 43 6f 75 6e 74 28 2a 70 70 48 6f 6f 6b 29  efCount(*ppHook)
d370: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66  ;.    }.  }..#if
d380: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
d390: 45 5f 50 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b  E_PREUPDATE_HOOK
d3a0: 0a 20 20 73 71 6c 69 74 65 33 5f 70 72 65 75 70  .  sqlite3_preup
d3b0: 64 61 74 65 5f 68 6f 6f 6b 28 64 62 2c 20 28 70  date_hook(db, (p
d3c0: 44 62 2d 3e 70 50 72 65 55 70 64 61 74 65 48 6f  Db->pPreUpdateHo
d3d0: 6f 6b 3f 44 62 50 72 65 55 70 64 61 74 65 48 61  ok?DbPreUpdateHa
d3e0: 6e 64 6c 65 72 3a 30 29 2c 20 70 44 62 29 3b 0a  ndler:0), pDb);.
d3f0: 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
d400: 5f 75 70 64 61 74 65 5f 68 6f 6f 6b 28 64 62 2c  _update_hook(db,
d410: 20 28 70 44 62 2d 3e 70 55 70 64 61 74 65 48 6f   (pDb->pUpdateHo
d420: 6f 6b 3f 44 62 55 70 64 61 74 65 48 61 6e 64 6c  ok?DbUpdateHandl
d430: 65 72 3a 30 29 2c 20 70 44 62 29 3b 0a 20 20 73  er:0), pDb);.  s
d440: 71 6c 69 74 65 33 5f 72 6f 6c 6c 62 61 63 6b 5f  qlite3_rollback_
d450: 68 6f 6f 6b 28 64 62 2c 20 28 70 44 62 2d 3e 70  hook(db, (pDb->p
d460: 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 3f 44 62 52  RollbackHook?DbR
d470: 6f 6c 6c 62 61 63 6b 48 61 6e 64 6c 65 72 3a 30  ollbackHandler:0
d480: 29 2c 20 70 44 62 29 3b 0a 20 20 73 71 6c 69 74  ), pDb);.  sqlit
d490: 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 64 62 2c 20  e3_wal_hook(db, 
d4a0: 28 70 44 62 2d 3e 70 57 61 6c 48 6f 6f 6b 3f 44  (pDb->pWalHook?D
d4b0: 62 57 61 6c 48 61 6e 64 6c 65 72 3a 30 29 2c 20  bWalHandler:0), 
d4c0: 70 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  pDb);.}../*.** T
d4d0: 68 65 20 22 73 71 6c 69 74 65 22 20 63 6f 6d 6d  he "sqlite" comm
d4e0: 61 6e 64 20 62 65 6c 6f 77 20 63 72 65 61 74 65  and below create
d4f0: 73 20 61 20 6e 65 77 20 54 63 6c 20 63 6f 6d 6d  s a new Tcl comm
d500: 61 6e 64 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20  and for each.** 
d510: 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 74 20 6f 70  connection it op
d520: 65 6e 73 20 74 6f 20 61 6e 20 53 51 4c 69 74 65  ens to an SQLite
d530: 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 69 73   database.  This
d540: 20 72 6f 75 74 69 6e 65 20 69 73 20 69 6e 76 6f   routine is invo
d550: 6b 65 64 0a 2a 2a 20 77 68 65 6e 65 76 65 72 20  ked.** whenever 
d560: 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20 63 6f 6e  one of those con
d570: 6e 65 63 74 69 6f 6e 2d 73 70 65 63 69 66 69 63  nection-specific
d580: 20 63 6f 6d 6d 61 6e 64 73 20 69 73 20 65 78 65   commands is exe
d590: 63 75 74 65 64 0a 2a 2a 20 69 6e 20 54 63 6c 2e  cuted.** in Tcl.
d5a0: 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69    For example, i
d5b0: 66 20 79 6f 75 20 72 75 6e 20 54 63 6c 20 63 6f  f you run Tcl co
d5c0: 64 65 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a  de like this:.**
d5d0: 0a 2a 2a 20 20 20 20 20 20 20 73 71 6c 69 74 65  .**       sqlite
d5e0: 33 20 64 62 31 20 20 22 6d 79 5f 64 61 74 61 62  3 db1  "my_datab
d5f0: 61 73 65 22 0a 2a 2a 20 20 20 20 20 20 20 64 62  ase".**       db
d600: 31 20 63 6c 6f 73 65 0a 2a 2a 0a 2a 2a 20 54 68  1 close.**.** Th
d610: 65 20 66 69 72 73 74 20 63 6f 6d 6d 61 6e 64 20  e first command 
d620: 6f 70 65 6e 73 20 61 20 63 6f 6e 6e 65 63 74 69  opens a connecti
d630: 6f 6e 20 74 6f 20 74 68 65 20 22 6d 79 5f 64 61  on to the "my_da
d640: 74 61 62 61 73 65 22 20 64 61 74 61 62 61 73 65  tabase" database
d650: 0a 2a 2a 20 61 6e 64 20 63 61 6c 6c 73 20 74 68  .** and calls th
d660: 61 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 22 64  at connection "d
d670: 62 31 22 2e 20 20 54 68 65 20 73 65 63 6f 6e 64  b1".  The second
d680: 20 63 6f 6d 6d 61 6e 64 20 63 61 75 73 65 73 20   command causes 
d690: 74 68 69 73 0a 2a 2a 20 73 75 62 72 6f 75 74 69  this.** subrouti
d6a0: 6e 65 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64  ne to be invoked
d6b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
d6c0: 44 62 4f 62 6a 43 6d 64 28 76 6f 69 64 20 2a 63  DbObjCmd(void *c
d6d0: 64 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  d, Tcl_Interp *i
d6e0: 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c  nterp, int objc,
d6f0: 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 2a 6f  Tcl_Obj *const*o
d700: 62 6a 76 29 7b 0a 20 20 53 71 6c 69 74 65 44 62  bjv){.  SqliteDb
d710: 20 2a 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44   *pDb = (SqliteD
d720: 62 2a 29 63 64 3b 0a 20 20 69 6e 74 20 63 68 6f  b*)cd;.  int cho
d730: 69 63 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ice;.  int rc = 
d740: 54 43 4c 5f 4f 4b 3b 0a 20 20 73 74 61 74 69 63  TCL_OK;.  static
d750: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 44 42 5f   const char *DB_
d760: 73 74 72 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 22  strs[] = {.    "
d770: 61 75 74 68 6f 72 69 7a 65 72 22 2c 20 20 20 20  authorizer",    
d780: 20 20 20 20 20 22 62 61 63 6b 75 70 22 2c 20 20       "backup",  
d790: 20 20 20 20 20 20 20 20 20 20 22 62 75 73 79 22            "busy"
d7a0: 2c 0a 20 20 20 20 22 63 61 63 68 65 22 2c 20 20  ,.    "cache",  
d7b0: 20 20 20 20 20 20 20 20 20 20 20 20 22 63 68 61              "cha
d7c0: 6e 67 65 73 22 2c 20 20 20 20 20 20 20 20 20 20  nges",          
d7d0: 20 22 63 6c 6f 73 65 22 2c 0a 20 20 20 20 22 63   "close",.    "c
d7e0: 6f 6c 6c 61 74 65 22 2c 20 20 20 20 20 20 20 20  ollate",        
d7f0: 20 20 20 20 22 63 6f 6c 6c 61 74 69 6f 6e 5f 6e      "collation_n
d800: 65 65 64 65 64 22 2c 20 20 22 63 6f 6d 6d 69 74  eeded",  "commit
d810: 5f 68 6f 6f 6b 22 2c 0a 20 20 20 20 22 63 6f 6d  _hook",.    "com
d820: 70 6c 65 74 65 22 2c 20 20 20 20 20 20 20 20 20  plete",         
d830: 20 20 22 63 6f 70 79 22 2c 20 20 20 20 20 20 20    "copy",       
d840: 20 20 20 20 20 20 20 22 65 6e 61 62 6c 65 5f 6c         "enable_l
d850: 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e 22 2c 0a  oad_extension",.
d860: 20 20 20 20 22 65 72 72 6f 72 63 6f 64 65 22 2c      "errorcode",
d870: 20 20 20 20 20 20 20 20 20 20 22 65 76 61 6c 22            "eval"
d880: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  ,              "
d890: 65 78 69 73 74 73 22 2c 0a 20 20 20 20 22 66 75  exists",.    "fu
d8a0: 6e 63 74 69 6f 6e 22 2c 20 20 20 20 20 20 20 20  nction",        
d8b0: 20 20 20 22 69 6e 63 72 62 6c 6f 62 22 2c 20 20     "incrblob",  
d8c0: 20 20 20 20 20 20 20 20 22 69 6e 74 65 72 72 75          "interru
d8d0: 70 74 22 2c 0a 20 20 20 20 22 6c 61 73 74 5f 69  pt",.    "last_i
d8e0: 6e 73 65 72 74 5f 72 6f 77 69 64 22 2c 20 20 22  nsert_rowid",  "
d8f0: 6e 75 6c 6c 76 61 6c 75 65 22 2c 20 20 20 20 20  nullvalue",     
d900: 20 20 20 20 22 6f 6e 65 63 6f 6c 75 6d 6e 22 2c      "onecolumn",
d910: 0a 20 20 20 20 22 70 72 65 75 70 64 61 74 65 22  .    "preupdate"
d920: 2c 20 20 20 20 20 20 20 20 20 20 22 70 72 6f 66  ,          "prof
d930: 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ile",           
d940: 22 70 72 6f 67 72 65 73 73 22 2c 0a 20 20 20 20  "progress",.    
d950: 22 72 65 6b 65 79 22 2c 20 20 20 20 20 20 20 20  "rekey",        
d960: 20 20 20 20 20 20 22 72 65 73 74 6f 72 65 22 2c        "restore",
d970: 20 20 20 20 20 20 20 20 20 20 20 22 72 6f 6c 6c             "roll
d980: 62 61 63 6b 5f 68 6f 6f 6b 22 2c 0a 20 20 20 20  back_hook",.    
d990: 22 73 74 61 74 75 73 22 2c 20 20 20 20 20 20 20  "status",       
d9a0: 20 20 20 20 20 20 22 74 69 6d 65 6f 75 74 22 2c        "timeout",
d9b0: 20 20 20 20 20 20 20 20 20 20 20 22 74 6f 74 61             "tota
d9c0: 6c 5f 63 68 61 6e 67 65 73 22 2c 0a 20 20 20 20  l_changes",.    
d9d0: 22 74 72 61 63 65 22 2c 20 20 20 20 20 20 20 20  "trace",        
d9e0: 20 20 20 20 20 20 22 74 72 61 6e 73 61 63 74 69        "transacti
d9f0: 6f 6e 22 2c 20 20 20 20 20 20 20 22 75 6e 6c 6f  on",       "unlo
da00: 63 6b 5f 6e 6f 74 69 66 79 22 2c 0a 20 20 20 20  ck_notify",.    
da10: 22 75 70 64 61 74 65 5f 68 6f 6f 6b 22 2c 20 20  "update_hook",  
da20: 20 20 20 20 20 20 22 76 65 72 73 69 6f 6e 22 2c        "version",
da30: 20 20 20 20 20 20 20 20 20 20 20 22 77 61 6c 5f             "wal_
da40: 68 6f 6f 6b 22 2c 0a 20 20 20 20 30 20 20 20 20  hook",.    0    
da50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da60: 0a 20 20 7d 3b 0a 20 20 65 6e 75 6d 20 44 42 5f  .  };.  enum DB_
da70: 65 6e 75 6d 20 7b 0a 20 20 20 20 44 42 5f 41 55  enum {.    DB_AU
da80: 54 48 4f 52 49 5a 45 52 2c 20 20 20 20 20 20 20  THORIZER,       
da90: 20 44 42 5f 42 41 43 4b 55 50 2c 20 20 20 20 20   DB_BACKUP,     
daa0: 20 20 20 20 20 20 44 42 5f 42 55 53 59 2c 0a 20        DB_BUSY,. 
dab0: 20 20 20 44 42 5f 43 41 43 48 45 2c 20 20 20 20     DB_CACHE,    
dac0: 20 20 20 20 20 20 20 20 20 44 42 5f 43 48 41 4e           DB_CHAN
dad0: 47 45 53 2c 20 20 20 20 20 20 20 20 20 20 44 42  GES,          DB
dae0: 5f 43 4c 4f 53 45 2c 0a 20 20 20 20 44 42 5f 43  _CLOSE,.    DB_C
daf0: 4f 4c 4c 41 54 45 2c 20 20 20 20 20 20 20 20 20  OLLATE,         
db00: 20 20 44 42 5f 43 4f 4c 4c 41 54 49 4f 4e 5f 4e    DB_COLLATION_N
db10: 45 45 44 45 44 2c 20 44 42 5f 43 4f 4d 4d 49 54  EEDED, DB_COMMIT
db20: 5f 48 4f 4f 4b 2c 0a 20 20 20 20 44 42 5f 43 4f  _HOOK,.    DB_CO
db30: 4d 50 4c 45 54 45 2c 20 20 20 20 20 20 20 20 20  MPLETE,         
db40: 20 44 42 5f 43 4f 50 59 2c 20 20 20 20 20 20 20   DB_COPY,       
db50: 20 20 20 20 20 20 44 42 5f 45 4e 41 42 4c 45 5f        DB_ENABLE_
db60: 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 2c 0a  LOAD_EXTENSION,.
db70: 20 20 20 20 44 42 5f 45 52 52 4f 52 43 4f 44 45      DB_ERRORCODE
db80: 2c 20 20 20 20 20 20 20 20 20 44 42 5f 45 56 41  ,         DB_EVA
db90: 4c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 44  L,             D
dba0: 42 5f 45 58 49 53 54 53 2c 0a 20 20 20 20 44 42  B_EXISTS,.    DB
dbb0: 5f 46 55 4e 43 54 49 4f 4e 2c 20 20 20 20 20 20  _FUNCTION,      
dbc0: 20 20 20 20 44 42 5f 49 4e 43 52 42 4c 4f 42 2c      DB_INCRBLOB,
dbd0: 20 20 20 20 20 20 20 20 20 44 42 5f 49 4e 54 45           DB_INTE
dbe0: 52 52 55 50 54 2c 0a 20 20 20 20 44 42 5f 4c 41  RRUPT,.    DB_LA
dbf0: 53 54 5f 49 4e 53 45 52 54 5f 52 4f 57 49 44 2c  ST_INSERT_ROWID,
dc00: 20 44 42 5f 4e 55 4c 4c 56 41 4c 55 45 2c 20 20   DB_NULLVALUE,  
dc10: 20 20 20 20 20 20 44 42 5f 4f 4e 45 43 4f 4c 55        DB_ONECOLU
dc20: 4d 4e 2c 0a 20 20 20 20 44 42 5f 50 52 45 55 50  MN,.    DB_PREUP
dc30: 44 41 54 45 2c 20 20 20 20 20 20 20 20 20 44 42  DATE,         DB
dc40: 5f 50 52 4f 46 49 4c 45 2c 20 20 20 20 20 20 20  _PROFILE,       
dc50: 20 20 20 44 42 5f 50 52 4f 47 52 45 53 53 2c 0a     DB_PROGRESS,.
dc60: 20 20 20 20 44 42 5f 52 45 4b 45 59 2c 20 20 20      DB_REKEY,   
dc70: 20 20 20 20 20 20 20 20 20 20 44 42 5f 52 45 53            DB_RES
dc80: 54 4f 52 45 2c 20 20 20 20 20 20 20 20 20 20 44  TORE,          D
dc90: 42 5f 52 4f 4c 4c 42 41 43 4b 5f 48 4f 4f 4b 2c  B_ROLLBACK_HOOK,
dca0: 0a 20 20 20 20 44 42 5f 53 54 41 54 55 53 2c 20  .    DB_STATUS, 
dcb0: 20 20 20 20 20 20 20 20 20 20 20 44 42 5f 54 49             DB_TI
dcc0: 4d 45 4f 55 54 2c 20 20 20 20 20 20 20 20 20 20  MEOUT,          
dcd0: 44 42 5f 54 4f 54 41 4c 5f 43 48 41 4e 47 45 53  DB_TOTAL_CHANGES
dce0: 2c 0a 20 20 20 20 44 42 5f 54 52 41 43 45 2c 20  ,.    DB_TRACE, 
dcf0: 20 20 20 20 20 20 20 20 20 20 20 20 44 42 5f 54              DB_T
dd00: 52 41 4e 53 41 43 54 49 4f 4e 2c 20 20 20 20 20  RANSACTION,     
dd10: 20 44 42 5f 55 4e 4c 4f 43 4b 5f 4e 4f 54 49 46   DB_UNLOCK_NOTIF
dd20: 59 2c 0a 20 20 20 20 44 42 5f 55 50 44 41 54 45  Y,.    DB_UPDATE
dd30: 5f 48 4f 4f 4b 2c 20 20 20 20 20 20 20 44 42 5f  _HOOK,       DB_
dd40: 56 45 52 53 49 4f 4e 2c 20 20 20 20 20 20 20 20  VERSION,        
dd50: 20 20 44 42 5f 57 41 4c 5f 48 4f 4f 4b 2c 0a 20    DB_WAL_HOOK,. 
dd60: 20 7d 3b 0a 20 20 2f 2a 20 64 6f 6e 27 74 20 6c   };.  /* don't l
dd70: 65 61 76 65 20 74 72 61 69 6c 69 6e 67 20 63 6f  eave trailing co
dd80: 6d 6d 61 73 20 6f 6e 20 44 42 5f 65 6e 75 6d 2c  mmas on DB_enum,
dd90: 20 69 74 20 63 6f 6e 66 75 73 65 73 20 74 68 65   it confuses the
dda0: 20 41 49 58 20 78 6c 63 20 63 6f 6d 70 69 6c 65   AIX xlc compile
ddb0: 72 20 2a 2f 0a 0a 20 20 69 66 28 20 6f 62 6a 63  r */..  if( objc
ddc0: 3c 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  <2 ){.    Tcl_Wr
ddd0: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
dde0: 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53 55 42  p, 1, objv, "SUB
ddf0: 43 4f 4d 4d 41 4e 44 20 2e 2e 2e 22 29 3b 0a 20  COMMAND ...");. 
de00: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
de10: 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54  ROR;.  }.  if( T
de20: 63 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f  cl_GetIndexFromO
de30: 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
de40: 31 5d 2c 20 44 42 5f 73 74 72 73 2c 20 22 6f 70  1], DB_strs, "op
de50: 74 69 6f 6e 22 2c 20 30 2c 20 26 63 68 6f 69 63  tion", 0, &choic
de60: 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  e) ){.    return
de70: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
de80: 0a 20 20 73 77 69 74 63 68 28 20 28 65 6e 75 6d  .  switch( (enum
de90: 20 44 42 5f 65 6e 75 6d 29 63 68 6f 69 63 65 20   DB_enum)choice 
dea0: 29 7b 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20  ){..  /*    $db 
deb0: 61 75 74 68 6f 72 69 7a 65 72 20 3f 43 41 4c 4c  authorizer ?CALL
dec0: 42 41 43 4b 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20  BACK?.  **.  ** 
ded0: 49 6e 76 6f 6b 65 20 74 68 65 20 67 69 76 65 6e  Invoke the given
dee0: 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20 61 75 74   callback to aut
def0: 68 6f 72 69 7a 65 20 65 61 63 68 20 53 51 4c 20  horize each SQL 
df00: 6f 70 65 72 61 74 69 6f 6e 20 61 73 20 69 74 20  operation as it 
df10: 69 73 0a 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 64  is.  ** compiled
df20: 2e 20 20 35 20 61 72 67 75 6d 65 6e 74 73 20 61  .  5 arguments a
df30: 72 65 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74  re appended to t
df40: 68 65 20 63 61 6c 6c 62 61 63 6b 20 62 65 66 6f  he callback befo
df50: 72 65 20 69 74 20 69 73 0a 20 20 2a 2a 20 69 6e  re it is.  ** in
df60: 76 6f 6b 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  voked:.  **.  **
df70: 20 20 20 28 31 29 20 54 68 65 20 61 75 74 68 6f     (1) The autho
df80: 72 69 7a 61 74 69 6f 6e 20 74 79 70 65 20 28 65  rization type (e
df90: 78 3a 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45  x: SQLITE_CREATE
dfa0: 5f 54 41 42 4c 45 2c 20 53 51 4c 49 54 45 5f 49  _TABLE, SQLITE_I
dfb0: 4e 53 45 52 54 2c 20 2e 2e 2e 29 0a 20 20 2a 2a  NSERT, ...).  **
dfc0: 20 20 20 28 32 29 20 46 69 72 73 74 20 64 65 73     (2) First des
dfd0: 63 72 69 70 74 69 76 65 20 6e 61 6d 65 20 28 64  criptive name (d
dfe0: 65 70 65 6e 64 73 20 6f 6e 20 61 75 74 68 6f 72  epends on author
dff0: 69 7a 61 74 69 6f 6e 20 74 79 70 65 29 0a 20 20  ization type).  
e000: 2a 2a 20 20 20 28 33 29 20 53 65 63 6f 6e 64 20  **   (3) Second 
e010: 64 65 73 63 72 69 70 74 69 76 65 20 6e 61 6d 65  descriptive name
e020: 0a 20 20 2a 2a 20 20 20 28 34 29 20 4e 61 6d 65  .  **   (4) Name
e030: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
e040: 20 28 65 78 3a 20 22 6d 61 69 6e 22 2c 20 22 74   (ex: "main", "t
e050: 65 6d 70 22 29 0a 20 20 2a 2a 20 20 20 28 35 29  emp").  **   (5)
e060: 20 4e 61 6d 65 20 6f 66 20 74 72 69 67 67 65 72   Name of trigger
e070: 20 74 68 61 74 20 69 73 20 64 6f 69 6e 67 20 74   that is doing t
e080: 68 65 20 61 63 63 65 73 73 0a 20 20 2a 2a 0a 20  he access.  **. 
e090: 20 2a 2a 20 54 68 65 20 63 61 6c 6c 62 61 63 6b   ** The callback
e0a0: 20 73 68 6f 75 6c 64 20 72 65 74 75 72 6e 20 6f   should return o
e0b0: 6e 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  n of the followi
e0c0: 6e 67 20 73 74 72 69 6e 67 73 3a 20 53 51 4c 49  ng strings: SQLI
e0d0: 54 45 5f 4f 4b 2c 0a 20 20 2a 2a 20 53 51 4c 49  TE_OK,.  ** SQLI
e0e0: 54 45 5f 49 47 4e 4f 52 45 2c 20 6f 72 20 53 51  TE_IGNORE, or SQ
e0f0: 4c 49 54 45 5f 44 45 4e 59 2e 20 20 41 6e 79 20  LITE_DENY.  Any 
e100: 6f 74 68 65 72 20 72 65 74 75 72 6e 20 76 61 6c  other return val
e110: 75 65 20 69 73 20 61 6e 20 65 72 72 6f 72 2e 0a  ue is an error..
e120: 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69    **.  ** If thi
e130: 73 20 6d 65 74 68 6f 64 20 69 73 20 69 6e 76 6f  s method is invo
e140: 6b 65 64 20 77 69 74 68 20 6e 6f 20 61 72 67 75  ked with no argu
e150: 6d 65 6e 74 73 2c 20 74 68 65 20 63 75 72 72 65  ments, the curre
e160: 6e 74 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e  nt authorization
e170: 0a 20 20 2a 2a 20 63 61 6c 6c 62 61 63 6b 20 73  .  ** callback s
e180: 74 72 69 6e 67 20 69 73 20 72 65 74 75 72 6e 65  tring is returne
e190: 64 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  d..  */.  case D
e1a0: 42 5f 41 55 54 48 4f 52 49 5a 45 52 3a 20 7b 0a  B_AUTHORIZER: {.
e1b0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
e1c0: 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e  IT_AUTHORIZATION
e1d0: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
e1e0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 61  esult(interp, "a
e1f0: 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 6e 6f 74  uthorization not
e200: 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 74 68   available in th
e210: 69 73 20 62 75 69 6c 64 22 2c 20 30 29 3b 0a 20  is build", 0);. 
e220: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
e230: 52 4f 52 3b 0a 23 65 6c 73 65 0a 20 20 20 20 69  ROR;.#else.    i
e240: 66 28 20 6f 62 6a 63 3e 33 20 29 7b 0a 20 20 20  f( objc>3 ){.   
e250: 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
e260: 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
e270: 62 6a 76 2c 20 22 3f 43 41 4c 4c 42 41 43 4b 3f  bjv, "?CALLBACK?
e280: 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
e290: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
e2a0: 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d  }else if( objc==
e2b0: 32 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  2 ){.      if( p
e2c0: 44 62 2d 3e 7a 41 75 74 68 20 29 7b 0a 20 20 20  Db->zAuth ){.   
e2d0: 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
e2e0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 44  esult(interp, pD
e2f0: 62 2d 3e 7a 41 75 74 68 2c 20 30 29 3b 0a 20 20  b->zAuth, 0);.  
e300: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
e310: 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 41 75  .      char *zAu
e320: 74 68 3b 0a 20 20 20 20 20 20 69 6e 74 20 6c 65  th;.      int le
e330: 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62  n;.      if( pDb
e340: 2d 3e 7a 41 75 74 68 20 29 7b 0a 20 20 20 20 20  ->zAuth ){.     
e350: 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d     Tcl_Free(pDb-
e360: 3e 7a 41 75 74 68 29 3b 0a 20 20 20 20 20 20 7d  >zAuth);.      }
e370: 0a 20 20 20 20 20 20 7a 41 75 74 68 20 3d 20 54  .      zAuth = T
e380: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
e390: 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65  Obj(objv[2], &le
e3a0: 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 41  n);.      if( zA
e3b0: 75 74 68 20 26 26 20 6c 65 6e 3e 30 20 29 7b 0a  uth && len>0 ){.
e3c0: 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 41 75          pDb->zAu
e3d0: 74 68 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 20  th = Tcl_Alloc( 
e3e0: 6c 65 6e 20 2b 20 31 20 29 3b 0a 20 20 20 20 20  len + 1 );.     
e3f0: 20 20 20 6d 65 6d 63 70 79 28 70 44 62 2d 3e 7a     memcpy(pDb->z
e400: 41 75 74 68 2c 20 7a 41 75 74 68 2c 20 6c 65 6e  Auth, zAuth, len
e410: 2b 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  +1);.      }else
e420: 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a  {.        pDb->z
e430: 41 75 74 68 20 3d 20 30 3b 0a 20 20 20 20 20 20  Auth = 0;.      
e440: 7d 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d  }.      if( pDb-
e450: 3e 7a 41 75 74 68 20 29 7b 0a 20 20 20 20 20 20  >zAuth ){.      
e460: 20 20 70 44 62 2d 3e 69 6e 74 65 72 70 20 3d 20    pDb->interp = 
e470: 69 6e 74 65 72 70 3b 0a 20 20 20 20 20 20 20 20  interp;.        
e480: 73 71 6c 69 74 65 33 5f 73 65 74 5f 61 75 74 68  sqlite3_set_auth
e490: 6f 72 69 7a 65 72 28 70 44 62 2d 3e 64 62 2c 20  orizer(pDb->db, 
e4a0: 61 75 74 68 5f 63 61 6c 6c 62 61 63 6b 2c 20 70  auth_callback, p
e4b0: 44 62 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  Db);.      }else
e4c0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
e4d0: 33 5f 73 65 74 5f 61 75 74 68 6f 72 69 7a 65 72  3_set_authorizer
e4e0: 28 70 44 62 2d 3e 64 62 2c 20 30 2c 20 30 29 3b  (pDb->db, 0, 0);
e4f0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
e500: 65 6e 64 69 66 0a 20 20 20 20 62 72 65 61 6b 3b  endif.    break;
e510: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64  .  }..  /*    $d
e520: 62 20 62 61 63 6b 75 70 20 3f 44 41 54 41 42 41  b backup ?DATABA
e530: 53 45 3f 20 46 49 4c 45 4e 41 4d 45 0a 20 20 2a  SE? FILENAME.  *
e540: 2a 0a 20 20 2a 2a 20 4f 70 65 6e 20 6f 72 20 63  *.  ** Open or c
e550: 72 65 61 74 65 20 61 20 64 61 74 61 62 61 73 65  reate a database
e560: 20 66 69 6c 65 20 6e 61 6d 65 64 20 46 49 4c 45   file named FILE
e570: 4e 41 4d 45 2e 20 20 54 72 61 6e 73 66 65 72 20  NAME.  Transfer 
e580: 74 68 65 0a 20 20 2a 2a 20 63 6f 6e 74 65 6e 74  the.  ** content
e590: 20 6f 66 20 6c 6f 63 61 6c 20 64 61 74 61 62 61   of local databa
e5a0: 73 65 20 44 41 54 41 42 41 53 45 20 28 64 65 66  se DATABASE (def
e5b0: 61 75 6c 74 3a 20 22 6d 61 69 6e 22 29 20 69 6e  ault: "main") in
e5c0: 74 6f 20 74 68 65 0a 20 20 2a 2a 20 46 49 4c 45  to the.  ** FILE
e5d0: 4e 41 4d 45 20 64 61 74 61 62 61 73 65 2e 0a 20  NAME database.. 
e5e0: 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 42 41   */.  case DB_BA
e5f0: 43 4b 55 50 3a 20 7b 0a 20 20 20 20 63 6f 6e 73  CKUP: {.    cons
e600: 74 20 63 68 61 72 20 2a 7a 44 65 73 74 46 69 6c  t char *zDestFil
e610: 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  e;.    const cha
e620: 72 20 2a 7a 53 72 63 44 62 3b 0a 20 20 20 20 73  r *zSrcDb;.    s
e630: 71 6c 69 74 65 33 20 2a 70 44 65 73 74 3b 0a 20  qlite3 *pDest;. 
e640: 20 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75     sqlite3_backu
e650: 70 20 2a 70 42 61 63 6b 75 70 3b 0a 0a 20 20 20  p *pBackup;..   
e660: 20 69 66 28 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a   if( objc==3 ){.
e670: 20 20 20 20 20 20 7a 53 72 63 44 62 20 3d 20 22        zSrcDb = "
e680: 6d 61 69 6e 22 3b 0a 20 20 20 20 20 20 7a 44 65  main";.      zDe
e690: 73 74 46 69 6c 65 20 3d 20 54 63 6c 5f 47 65 74  stFile = Tcl_Get
e6a0: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b  String(objv[2]);
e6b0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f  .    }else if( o
e6c0: 62 6a 63 3d 3d 34 20 29 7b 0a 20 20 20 20 20 20  bjc==4 ){.      
e6d0: 7a 53 72 63 44 62 20 3d 20 54 63 6c 5f 47 65 74  zSrcDb = Tcl_Get
e6e0: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b  String(objv[2]);
e6f0: 0a 20 20 20 20 20 20 7a 44 65 73 74 46 69 6c 65  .      zDestFile
e700: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
e710: 28 6f 62 6a 76 5b 33 5d 29 3b 0a 20 20 20 20 7d  (objv[3]);.    }
e720: 65 6c 73 65 7b 0a 20 20 20 20 20 20 54 63 6c 5f  else{.      Tcl_
e730: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
e740: 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f  erp, 2, objv, "?
e750: 44 41 54 41 42 41 53 45 3f 20 46 49 4c 45 4e 41  DATABASE? FILENA
e760: 4d 45 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ME");.      retu
e770: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
e780: 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c    }.    rc = sql
e790: 69 74 65 33 5f 6f 70 65 6e 28 7a 44 65 73 74 46  ite3_open(zDestF
e7a0: 69 6c 65 2c 20 26 70 44 65 73 74 29 3b 0a 20 20  ile, &pDest);.  
e7b0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
e7c0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  _OK ){.      Tcl
e7d0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
e7e0: 74 65 72 70 2c 20 22 63 61 6e 6e 6f 74 20 6f 70  terp, "cannot op
e7f0: 65 6e 20 74 61 72 67 65 74 20 64 61 74 61 62 61  en target databa
e800: 73 65 3a 20 22 2c 0a 20 20 20 20 20 20 20 20 20  se: ",.         
e810: 20 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67    sqlite3_errmsg
e820: 28 70 44 65 73 74 29 2c 20 28 63 68 61 72 2a 29  (pDest), (char*)
e830: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
e840: 33 5f 63 6c 6f 73 65 28 70 44 65 73 74 29 3b 0a  3_close(pDest);.
e850: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
e860: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
e870: 20 20 70 42 61 63 6b 75 70 20 3d 20 73 71 6c 69    pBackup = sqli
e880: 74 65 33 5f 62 61 63 6b 75 70 5f 69 6e 69 74 28  te3_backup_init(
e890: 70 44 65 73 74 2c 20 22 6d 61 69 6e 22 2c 20 70  pDest, "main", p
e8a0: 44 62 2d 3e 64 62 2c 20 7a 53 72 63 44 62 29 3b  Db->db, zSrcDb);
e8b0: 0a 20 20 20 20 69 66 28 20 70 42 61 63 6b 75 70  .    if( pBackup
e8c0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  ==0 ){.      Tcl
e8d0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
e8e0: 74 65 72 70 2c 20 22 62 61 63 6b 75 70 20 66 61  terp, "backup fa
e8f0: 69 6c 65 64 3a 20 22 2c 0a 20 20 20 20 20 20 20  iled: ",.       
e900: 20 20 20 20 73 71 6c 69 74 65 33 5f 65 72 72 6d      sqlite3_errm
e910: 73 67 28 70 44 65 73 74 29 2c 20 28 63 68 61 72  sg(pDest), (char
e920: 2a 29 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  *)0);.      sqli
e930: 74 65 33 5f 63 6c 6f 73 65 28 70 44 65 73 74 29  te3_close(pDest)
e940: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
e950: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
e960: 20 20 20 20 77 68 69 6c 65 28 20 20 28 72 63 20      while(  (rc 
e970: 3d 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70  = sqlite3_backup
e980: 5f 73 74 65 70 28 70 42 61 63 6b 75 70 2c 31 30  _step(pBackup,10
e990: 30 29 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  0))==SQLITE_OK )
e9a0: 7b 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62  {}.    sqlite3_b
e9b0: 61 63 6b 75 70 5f 66 69 6e 69 73 68 28 70 42 61  ackup_finish(pBa
e9c0: 63 6b 75 70 29 3b 0a 20 20 20 20 69 66 28 20 72  ckup);.    if( r
e9d0: 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c==SQLITE_DONE )
e9e0: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c  {.      rc = TCL
e9f0: 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  _OK;.    }else{.
ea00: 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
ea10: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
ea20: 62 61 63 6b 75 70 20 66 61 69 6c 65 64 3a 20 22  backup failed: "
ea30: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  ,.           sql
ea40: 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44 65 73  ite3_errmsg(pDes
ea50: 74 29 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20  t), (char*)0);. 
ea60: 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45 52       rc = TCL_ER
ea70: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ROR;.    }.    s
ea80: 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70 44 65  qlite3_close(pDe
ea90: 73 74 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a  st);.    break;.
eaa0: 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62    }..  /*    $db
eab0: 20 62 75 73 79 20 3f 43 41 4c 4c 42 41 43 4b 3f   busy ?CALLBACK?
eac0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 76 6f 6b  .  **.  ** Invok
ead0: 65 20 74 68 65 20 67 69 76 65 6e 20 63 61 6c 6c  e the given call
eae0: 62 61 63 6b 20 69 66 20 61 6e 20 53 51 4c 20 73  back if an SQL s
eaf0: 74 61 74 65 6d 65 6e 74 20 61 74 74 65 6d 70 74  tatement attempt
eb00: 73 20 74 6f 20 6f 70 65 6e 0a 20 20 2a 2a 20 61  s to open.  ** a
eb10: 20 6c 6f 63 6b 65 64 20 64 61 74 61 62 61 73 65   locked database
eb20: 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 63 61   file..  */.  ca
eb30: 73 65 20 44 42 5f 42 55 53 59 3a 20 7b 0a 20 20  se DB_BUSY: {.  
eb40: 20 20 69 66 28 20 6f 62 6a 63 3e 33 20 29 7b 0a    if( objc>3 ){.
eb50: 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
eb60: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
eb70: 2c 20 6f 62 6a 76 2c 20 22 43 41 4c 4c 42 41 43  , objv, "CALLBAC
eb80: 4b 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  K");.      retur
eb90: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
eba0: 20 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d   }else if( objc=
ebb0: 3d 32 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =2 ){.      if( 
ebc0: 70 44 62 2d 3e 7a 42 75 73 79 20 29 7b 0a 20 20  pDb->zBusy ){.  
ebd0: 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
ebe0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70  Result(interp, p
ebf0: 44 62 2d 3e 7a 42 75 73 79 2c 20 30 29 3b 0a 20  Db->zBusy, 0);. 
ec00: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
ec10: 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 42  {.      char *zB
ec20: 75 73 79 3b 0a 20 20 20 20 20 20 69 6e 74 20 6c  usy;.      int l
ec30: 65 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44  en;.      if( pD
ec40: 62 2d 3e 7a 42 75 73 79 20 29 7b 0a 20 20 20 20  b->zBusy ){.    
ec50: 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62      Tcl_Free(pDb
ec60: 2d 3e 7a 42 75 73 79 29 3b 0a 20 20 20 20 20 20  ->zBusy);.      
ec70: 7d 0a 20 20 20 20 20 20 7a 42 75 73 79 20 3d 20  }.      zBusy = 
ec80: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
ec90: 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c  mObj(objv[2], &l
eca0: 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  en);.      if( z
ecb0: 42 75 73 79 20 26 26 20 6c 65 6e 3e 30 20 29 7b  Busy && len>0 ){
ecc0: 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 42  .        pDb->zB
ecd0: 75 73 79 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28  usy = Tcl_Alloc(
ece0: 20 6c 65 6e 20 2b 20 31 20 29 3b 0a 20 20 20 20   len + 1 );.    
ecf0: 20 20 20 20 6d 65 6d 63 70 79 28 70 44 62 2d 3e      memcpy(pDb->
ed00: 7a 42 75 73 79 2c 20 7a 42 75 73 79 2c 20 6c 65  zBusy, zBusy, le
ed10: 6e 2b 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  n+1);.      }els
ed20: 65 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e  e{.        pDb->
ed30: 7a 42 75 73 79 20 3d 20 30 3b 0a 20 20 20 20 20  zBusy = 0;.     
ed40: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 44 62   }.      if( pDb
ed50: 2d 3e 7a 42 75 73 79 20 29 7b 0a 20 20 20 20 20  ->zBusy ){.     
ed60: 20 20 20 70 44 62 2d 3e 69 6e 74 65 72 70 20 3d     pDb->interp =
ed70: 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 20 20 20   interp;.       
ed80: 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 68 61   sqlite3_busy_ha
ed90: 6e 64 6c 65 72 28 70 44 62 2d 3e 64 62 2c 20 44  ndler(pDb->db, D
eda0: 62 42 75 73 79 48 61 6e 64 6c 65 72 2c 20 70 44  bBusyHandler, pD
edb0: 62 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  b);.      }else{
edc0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
edd0: 5f 62 75 73 79 5f 68 61 6e 64 6c 65 72 28 70 44  _busy_handler(pD
ede0: 62 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20  b->db, 0, 0);.  
edf0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
ee00: 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
ee10: 20 20 20 20 20 24 64 62 20 63 61 63 68 65 20 66       $db cache f
ee20: 6c 75 73 68 0a 20 20 2a 2a 20 20 20 20 20 24 64  lush.  **     $d
ee30: 62 20 63 61 63 68 65 20 73 69 7a 65 20 6e 0a 20  b cache size n. 
ee40: 20 2a 2a 0a 20 20 2a 2a 20 46 6c 75 73 68 20 74   **.  ** Flush t
ee50: 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74  he prepared stat
ee60: 65 6d 65 6e 74 20 63 61 63 68 65 2c 20 6f 72 20  ement cache, or 
ee70: 73 65 74 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  set the maximum 
ee80: 6e 75 6d 62 65 72 20 6f 66 0a 20 20 2a 2a 20 63  number of.  ** c
ee90: 61 63 68 65 64 20 73 74 61 74 65 6d 65 6e 74 73  ached statements
eea0: 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  ..  */.  case DB
eeb0: 5f 43 41 43 48 45 3a 20 7b 0a 20 20 20 20 63 68  _CACHE: {.    ch
eec0: 61 72 20 2a 73 75 62 43 6d 64 3b 0a 20 20 20 20  ar *subCmd;.    
eed0: 69 6e 74 20 6e 3b 0a 0a 20 20 20 20 69 66 28 20  int n;..    if( 
eee0: 6f 62 6a 63 3c 3d 32 20 29 7b 0a 20 20 20 20 20  objc<=2 ){.     
eef0: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
ef00: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
ef10: 76 2c 20 22 63 61 63 68 65 20 6f 70 74 69 6f 6e  v, "cache option
ef20: 20 3f 61 72 67 3f 22 29 3b 0a 20 20 20 20 20 20   ?arg?");.      
ef30: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
ef40: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 75 62 43  ;.    }.    subC
ef50: 6d 64 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  md = Tcl_GetStri
ef60: 6e 67 46 72 6f 6d 4f 62 6a 28 20 6f 62 6a 76 5b  ngFromObj( objv[
ef70: 32 5d 2c 20 30 20 29 3b 0a 20 20 20 20 69 66 28  2], 0 );.    if(
ef80: 20 2a 73 75 62 43 6d 64 3d 3d 27 66 27 20 26 26   *subCmd=='f' &&
ef90: 20 73 74 72 63 6d 70 28 73 75 62 43 6d 64 2c 22   strcmp(subCmd,"
efa0: 66 6c 75 73 68 22 29 3d 3d 30 20 29 7b 0a 20 20  flush")==0 ){.  
efb0: 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20      if( objc!=3 
efc0: 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 57  ){.        Tcl_W
efd0: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
efe0: 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 66 6c  rp, 2, objv, "fl
eff0: 75 73 68 22 29 3b 0a 20 20 20 20 20 20 20 20 72  ush");.        r
f000: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
f010: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
f020: 20 20 20 20 20 20 66 6c 75 73 68 53 74 6d 74 43        flushStmtC
f030: 61 63 68 65 28 20 70 44 62 20 29 3b 0a 20 20 20  ache( pDb );.   
f040: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69     }.    }else i
f050: 66 28 20 2a 73 75 62 43 6d 64 3d 3d 27 73 27 20  f( *subCmd=='s' 
f060: 26 26 20 73 74 72 63 6d 70 28 73 75 62 43 6d 64  && strcmp(subCmd
f070: 2c 22 73 69 7a 65 22 29 3d 3d 30 20 29 7b 0a 20  ,"size")==0 ){. 
f080: 20 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 34       if( objc!=4
f090: 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f   ){.        Tcl_
f0a0: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
f0b0: 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 73  erp, 2, objv, "s
f0c0: 69 7a 65 20 6e 22 29 3b 0a 20 20 20 20 20 20 20  ize n");.       
f0d0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
f0e0: 52 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  R;.      }else{.
f0f0: 20 20 20 20 20 20 20 20 69 66 28 20 54 43 4c 5f          if( TCL_
f100: 45 52 52 4f 52 3d 3d 54 63 6c 5f 47 65 74 49 6e  ERROR==Tcl_GetIn
f110: 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
f120: 20 6f 62 6a 76 5b 33 5d 2c 20 26 6e 29 20 29 7b   objv[3], &n) ){
f130: 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 41  .          Tcl_A
f140: 70 70 65 6e 64 52 65 73 75 6c 74 28 20 69 6e 74  ppendResult( int
f150: 65 72 70 2c 20 22 63 61 6e 6e 6f 74 20 63 6f 6e  erp, "cannot con
f160: 76 65 72 74 20 5c 22 22 2c 20 0a 20 20 20 20 20  vert \"", .     
f170: 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65            Tcl_Ge
f180: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
f190: 62 6a 76 5b 33 5d 2c 30 29 2c 20 22 5c 22 20 74  bjv[3],0), "\" t
f1a0: 6f 20 69 6e 74 65 67 65 72 22 2c 20 30 29 3b 0a  o integer", 0);.
f1b0: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
f1c0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
f1d0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
f1e0: 20 20 20 20 20 69 66 28 20 6e 3c 30 20 29 7b 0a       if( n<0 ){.
f1f0: 20 20 20 20 20 20 20 20 20 20 20 20 66 6c 75 73              flus
f200: 68 53 74 6d 74 43 61 63 68 65 28 20 70 44 62 20  hStmtCache( pDb 
f210: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e  );.            n
f220: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
f230: 7d 65 6c 73 65 20 69 66 28 20 6e 3e 4d 41 58 5f  }else if( n>MAX_
f240: 50 52 45 50 41 52 45 44 5f 53 54 4d 54 53 20 29  PREPARED_STMTS )
f250: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 20  {.            n 
f260: 3d 20 4d 41 58 5f 50 52 45 50 41 52 45 44 5f 53  = MAX_PREPARED_S
f270: 54 4d 54 53 3b 0a 20 20 20 20 20 20 20 20 20 20  TMTS;.          
f280: 7d 0a 20 20 20 20 20 20 20 20 20 20 70 44 62 2d  }.          pDb-
f290: 3e 6d 61 78 53 74 6d 74 20 3d 20 6e 3b 0a 20 20  >maxStmt = n;.  
f2a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
f2b0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
f2c0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
f2d0: 74 28 20 69 6e 74 65 72 70 2c 20 22 62 61 64 20  t( interp, "bad 
f2e0: 6f 70 74 69 6f 6e 20 5c 22 22 2c 20 0a 20 20 20  option \"", .   
f2f0: 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
f300: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
f310: 5b 32 5d 2c 30 29 2c 20 22 5c 22 3a 20 6d 75 73  [2],0), "\": mus
f320: 74 20 62 65 20 66 6c 75 73 68 20 6f 72 20 73 69  t be flush or si
f330: 7a 65 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 72  ze", 0);.      r
f340: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
f350: 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b  .    }.    break
f360: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 20  ;.  }..  /*     
f370: 24 64 62 20 63 68 61 6e 67 65 73 0a 20 20 2a 2a  $db changes.  **
f380: 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  .  ** Return the
f390: 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
f3a0: 74 68 61 74 20 77 65 72 65 20 6d 6f 64 69 66 69  that were modifi
f3b0: 65 64 2c 20 69 6e 73 65 72 74 65 64 2c 20 6f 72  ed, inserted, or
f3c0: 20 64 65 6c 65 74 65 64 20 62 79 0a 20 20 2a 2a   deleted by.  **
f3d0: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
f3e0: 20 49 4e 53 45 52 54 2c 20 55 50 44 41 54 45 20   INSERT, UPDATE 
f3f0: 6f 72 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d  or DELETE statem
f400: 65 6e 74 2c 20 6e 6f 74 20 69 6e 63 6c 75 64 69  ent, not includi
f410: 6e 67 20 0a 20 20 2a 2a 20 61 6e 79 20 63 68 61  ng .  ** any cha
f420: 6e 67 65 73 20 6d 61 64 65 20 62 79 20 74 72 69  nges made by tri
f430: 67 67 65 72 20 70 72 6f 67 72 61 6d 73 2e 0a 20  gger programs.. 
f440: 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 43 48   */.  case DB_CH
f450: 41 4e 47 45 53 3a 20 7b 0a 20 20 20 20 54 63 6c  ANGES: {.    Tcl
f460: 5f 4f 62 6a 20 2a 70 52 65 73 75 6c 74 3b 0a 20  _Obj *pResult;. 
f470: 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29     if( objc!=2 )
f480: 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e  {.      Tcl_Wron
f490: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
f4a0: 20 32 2c 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 20   2, objv, "");. 
f4b0: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
f4c0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
f4d0: 20 70 52 65 73 75 6c 74 20 3d 20 54 63 6c 5f 47   pResult = Tcl_G
f4e0: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
f4f0: 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74  rp);.    Tcl_Set
f500: 49 6e 74 4f 62 6a 28 70 52 65 73 75 6c 74 2c 20  IntObj(pResult, 
f510: 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 28  sqlite3_changes(
f520: 70 44 62 2d 3e 64 62 29 29 3b 0a 20 20 20 20 62  pDb->db));.    b
f530: 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  reak;.  }..  /* 
f540: 20 20 20 24 64 62 20 63 6c 6f 73 65 0a 20 20 2a     $db close.  *
f550: 2a 0a 20 20 2a 2a 20 53 68 75 74 64 6f 77 6e 20  *.  ** Shutdown 
f560: 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 2a  the database.  *
f570: 2f 0a 20 20 63 61 73 65 20 44 42 5f 43 4c 4f 53  /.  case DB_CLOS
f580: 45 3a 20 7b 0a 20 20 20 20 54 63 6c 5f 44 65 6c  E: {.    Tcl_Del
f590: 65 74 65 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72  eteCommand(inter
f5a0: 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
f5b0: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c  FromObj(objv[0],
f5c0: 20 30 29 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b   0));.    break;
f5d0: 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
f5e0: 20 20 20 20 24 64 62 20 63 6f 6c 6c 61 74 65 20      $db collate 
f5f0: 4e 41 4d 45 20 53 43 52 49 50 54 0a 20 20 2a 2a  NAME SCRIPT.  **
f600: 0a 20 20 2a 2a 20 43 72 65 61 74 65 20 61 20 6e  .  ** Create a n
f610: 65 77 20 53 51 4c 20 63 6f 6c 6c 61 74 69 6f 6e  ew SQL collation
f620: 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64   function called
f630: 20 4e 41 4d 45 2e 20 20 57 68 65 6e 65 76 65 72   NAME.  Whenever
f640: 0a 20 20 2a 2a 20 74 68 61 74 20 66 75 6e 63 74  .  ** that funct
f650: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69  ion is called, i
f660: 6e 76 6f 6b 65 20 53 43 52 49 50 54 20 74 6f 20  nvoke SCRIPT to 
f670: 65 76 61 6c 75 61 74 65 20 74 68 65 20 66 75 6e  evaluate the fun
f680: 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 63 61  ction..  */.  ca
f690: 73 65 20 44 42 5f 43 4f 4c 4c 41 54 45 3a 20 7b  se DB_COLLATE: {
f6a0: 0a 20 20 20 20 53 71 6c 43 6f 6c 6c 61 74 65 20  .    SqlCollate 
f6b0: 2a 70 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 63  *pCollate;.    c
f6c0: 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20  har *zName;.    
f6d0: 63 68 61 72 20 2a 7a 53 63 72 69 70 74 3b 0a 20  char *zScript;. 
f6e0: 20 20 20 69 6e 74 20 6e 53 63 72 69 70 74 3b 0a     int nScript;.
f6f0: 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20      if( objc!=4 
f700: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f  ){.      Tcl_Wro
f710: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
f720: 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 4e 41 4d 45  , 2, objv, "NAME
f730: 20 53 43 52 49 50 54 22 29 3b 0a 20 20 20 20 20   SCRIPT");.     
f740: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
f750: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4e 61  R;.    }.    zNa
f760: 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  me = Tcl_GetStri
f770: 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32  ngFromObj(objv[2
f780: 5d 2c 20 30 29 3b 0a 20 20 20 20 7a 53 63 72 69  ], 0);.    zScri
f790: 70 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  pt = Tcl_GetStri
f7a0: 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33  ngFromObj(objv[3
f7b0: 5d 2c 20 26 6e 53 63 72 69 70 74 29 3b 0a 20 20  ], &nScript);.  
f7c0: 20 20 70 43 6f 6c 6c 61 74 65 20 3d 20 28 53 71    pCollate = (Sq
f7d0: 6c 43 6f 6c 6c 61 74 65 2a 29 54 63 6c 5f 41 6c  lCollate*)Tcl_Al
f7e0: 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 43 6f  loc( sizeof(*pCo
f7f0: 6c 6c 61 74 65 29 20 2b 20 6e 53 63 72 69 70 74  llate) + nScript
f800: 20 2b 20 31 20 29 3b 0a 20 20 20 20 69 66 28 20   + 1 );.    if( 
f810: 70 43 6f 6c 6c 61 74 65 3d 3d 30 20 29 20 72 65  pCollate==0 ) re
f820: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
f830: 20 20 20 20 70 43 6f 6c 6c 61 74 65 2d 3e 69 6e      pCollate->in
f840: 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20  terp = interp;. 
f850: 20 20 20 70 43 6f 6c 6c 61 74 65 2d 3e 70 4e 65     pCollate->pNe
f860: 78 74 20 3d 20 70 44 62 2d 3e 70 43 6f 6c 6c 61  xt = pDb->pColla
f870: 74 65 3b 0a 20 20 20 20 70 43 6f 6c 6c 61 74 65  te;.    pCollate
f880: 2d 3e 7a 53 63 72 69 70 74 20 3d 20 28 63 68 61  ->zScript = (cha
f890: 72 2a 29 26 70 43 6f 6c 6c 61 74 65 5b 31 5d 3b  r*)&pCollate[1];
f8a0: 0a 20 20 20 20 70 44 62 2d 3e 70 43 6f 6c 6c 61  .    pDb->pColla
f8b0: 74 65 20 3d 20 70 43 6f 6c 6c 61 74 65 3b 0a 20  te = pCollate;. 
f8c0: 20 20 20 6d 65 6d 63 70 79 28 70 43 6f 6c 6c 61     memcpy(pColla
f8d0: 74 65 2d 3e 7a 53 63 72 69 70 74 2c 20 7a 53 63  te->zScript, zSc
f8e0: 72 69 70 74 2c 20 6e 53 63 72 69 70 74 2b 31 29  ript, nScript+1)
f8f0: 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
f900: 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69  3_create_collati
f910: 6f 6e 28 70 44 62 2d 3e 64 62 2c 20 7a 4e 61 6d  on(pDb->db, zNam
f920: 65 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  e, SQLITE_UTF8, 
f930: 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 61 74  .        pCollat
f940: 65 2c 20 74 63 6c 53 71 6c 43 6f 6c 6c 61 74 65  e, tclSqlCollate
f950: 29 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 53  ) ){.      Tcl_S
f960: 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
f970: 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33   (char *)sqlite3
f980: 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62 29  _errmsg(pDb->db)
f990: 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b  , TCL_VOLATILE);
f9a0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
f9b0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
f9c0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
f9d0: 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62   /*.  **     $db
f9e0: 20 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65   collation_neede
f9f0: 64 20 53 43 52 49 50 54 0a 20 20 2a 2a 0a 20 20  d SCRIPT.  **.  
fa00: 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  ** Create a new 
fa10: 53 51 4c 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75  SQL collation fu
fa20: 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 20 4e 41  nction called NA
fa30: 4d 45 2e 20 20 57 68 65 6e 65 76 65 72 0a 20 20  ME.  Whenever.  
fa40: 2a 2a 20 74 68 61 74 20 66 75 6e 63 74 69 6f 6e  ** that function
fa50: 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 6e 76 6f   is called, invo
fa60: 6b 65 20 53 43 52 49 50 54 20 74 6f 20 65 76 61  ke SCRIPT to eva
fa70: 6c 75 61 74 65 20 74 68 65 20 66 75 6e 63 74 69  luate the functi
fa80: 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  on..  */.  case 
fa90: 44 42 5f 43 4f 4c 4c 41 54 49 4f 4e 5f 4e 45 45  DB_COLLATION_NEE
faa0: 44 45 44 3a 20 7b 0a 20 20 20 20 69 66 28 20 6f  DED: {.    if( o
fab0: 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20  bjc!=3 ){.      
fac0: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
fad0: 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76  (interp, 2, objv
fae0: 2c 20 22 53 43 52 49 50 54 22 29 3b 0a 20 20 20  , "SCRIPT");.   
faf0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
fb00: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ROR;.    }.    i
fb10: 66 28 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65  f( pDb->pCollate
fb20: 4e 65 65 64 65 64 20 29 7b 0a 20 20 20 20 20 20  Needed ){.      
fb30: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
fb40: 28 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65  (pDb->pCollateNe
fb50: 65 64 65 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20  eded);.    }.   
fb60: 20 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65   pDb->pCollateNe
fb70: 65 64 65 64 20 3d 20 54 63 6c 5f 44 75 70 6c 69  eded = Tcl_Dupli
fb80: 63 61 74 65 4f 62 6a 28 6f 62 6a 76 5b 32 5d 29  cateObj(objv[2])
fb90: 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65  ;.    Tcl_IncrRe
fba0: 66 43 6f 75 6e 74 28 70 44 62 2d 3e 70 43 6f 6c  fCount(pDb->pCol
fbb0: 6c 61 74 65 4e 65 65 64 65 64 29 3b 0a 20 20 20  lateNeeded);.   
fbc0: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 6c 61 74 69   sqlite3_collati
fbd0: 6f 6e 5f 6e 65 65 64 65 64 28 70 44 62 2d 3e 64  on_needed(pDb->d
fbe0: 62 2c 20 70 44 62 2c 20 74 63 6c 43 6f 6c 6c 61  b, pDb, tclColla
fbf0: 74 65 4e 65 65 64 65 64 29 3b 0a 20 20 20 20 62  teNeeded);.    b
fc00: 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  reak;.  }..  /* 
fc10: 20 20 20 24 64 62 20 63 6f 6d 6d 69 74 5f 68 6f     $db commit_ho
fc20: 6f 6b 20 3f 43 41 4c 4c 42 41 43 4b 3f 0a 20 20  ok ?CALLBACK?.  
fc30: 2a 2a 0a 20 20 2a 2a 20 49 6e 76 6f 6b 65 20 74  **.  ** Invoke t
fc40: 68 65 20 67 69 76 65 6e 20 63 61 6c 6c 62 61 63  he given callbac
fc50: 6b 20 6a 75 73 74 20 62 65 66 6f 72 65 20 63 6f  k just before co
fc60: 6d 6d 69 74 74 69 6e 67 20 65 76 65 72 79 20 53  mmitting every S
fc70: 51 4c 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  QL transaction..
fc80: 20 20 2a 2a 20 49 66 20 74 68 65 20 63 61 6c 6c    ** If the call
fc90: 62 61 63 6b 20 74 68 72 6f 77 73 20 61 6e 20 65  back throws an e
fca0: 78 63 65 70 74 69 6f 6e 20 6f 72 20 72 65 74 75  xception or retu
fcb0: 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68  rns non-zero, th
fcc0: 65 6e 20 74 68 65 0a 20 20 2a 2a 20 74 72 61 6e  en the.  ** tran
fcd0: 73 61 63 74 69 6f 6e 20 69 73 20 61 62 6f 72 74  saction is abort
fce0: 65 64 2e 20 20 49 66 20 43 41 4c 4c 42 41 43 4b  ed.  If CALLBACK
fcf0: 20 69 73 20 61 6e 20 65 6d 70 74 79 20 73 74 72   is an empty str
fd00: 69 6e 67 2c 20 74 68 65 20 63 61 6c 6c 62 61 63  ing, the callbac
fd10: 6b 0a 20 20 2a 2a 20 69 73 20 64 69 73 61 62 6c  k.  ** is disabl
fd20: 65 64 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  ed..  */.  case 
fd30: 44 42 5f 43 4f 4d 4d 49 54 5f 48 4f 4f 4b 3a 20  DB_COMMIT_HOOK: 
fd40: 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 33  {.    if( objc>3
fd50: 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72   ){.      Tcl_Wr
fd60: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
fd70: 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 43 41  p, 2, objv, "?CA
fd80: 4c 4c 42 41 43 4b 3f 22 29 3b 0a 20 20 20 20 20  LLBACK?");.     
fd90: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
fda0: 52 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  R;.    }else if(
fdb0: 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20   objc==2 ){.    
fdc0: 20 20 69 66 28 20 70 44 62 2d 3e 7a 43 6f 6d 6d    if( pDb->zComm
fdd0: 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63  it ){.        Tc
fde0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
fdf0: 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a 43 6f 6d  nterp, pDb->zCom
fe00: 6d 69 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  mit, 0);.      }
fe10: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
fe20: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
fe30: 6f 6d 6d 69 74 3b 0a 20 20 20 20 20 20 69 6e 74  ommit;.      int
fe40: 20 6c 65 6e 3b 0a 20 20 20 20 20 20 69 66 28 20   len;.      if( 
fe50: 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 20 29 7b 0a  pDb->zCommit ){.
fe60: 20 20 20 20 20 20 20 20 54 63 6c 5f 46 72 65 65          Tcl_Free
fe70: 28 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 29 3b 0a  (pDb->zCommit);.
fe80: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 43        }.      zC
fe90: 6f 6d 6d 69 74 20 3d 20 54 63 6c 5f 47 65 74 53  ommit = Tcl_GetS
fea0: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
feb0: 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20 20  v[2], &len);.   
fec0: 20 20 20 69 66 28 20 7a 43 6f 6d 6d 69 74 20 26     if( zCommit &
fed0: 26 20 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20  & len>0 ){.     
fee0: 20 20 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 20     pDb->zCommit 
fef0: 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e  = Tcl_Alloc( len
ff00: 20 2b 20 31 20 29 3b 0a 20 20 20 20 20 20 20 20   + 1 );.        
ff10: 6d 65 6d 63 70 79 28 70 44 62 2d 3e 7a 43 6f 6d  memcpy(pDb->zCom
ff20: 6d 69 74 2c 20 7a 43 6f 6d 6d 69 74 2c 20 6c 65  mit, zCommit, le
ff30: 6e 2b 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  n+1);.      }els
ff40: 65 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e  e{.        pDb->
ff50: 7a 43 6f 6d 6d 69 74 20 3d 20 30 3b 0a 20 20 20  zCommit = 0;.   
ff60: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
ff70: 44 62 2d 3e 7a 43 6f 6d 6d 69 74 20 29 7b 0a 20  Db->zCommit ){. 
ff80: 20 20 20 20 20 20 20 70 44 62 2d 3e 69 6e 74 65         pDb->inte
ff90: 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20  rp = interp;.   
ffa0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6d       sqlite3_com
ffb0: 6d 69 74 5f 68 6f 6f 6b 28 70 44 62 2d 3e 64 62  mit_hook(pDb->db
ffc0: 2c 20 44 62 43 6f 6d 6d 69 74 48 61 6e 64 6c 65  , DbCommitHandle
ffd0: 72 2c 20 70 44 62 29 3b 0a 20 20 20 20 20 20 7d  r, pDb);.      }
ffe0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
fff0: 6c 69 74 65 33 5f 63 6f 6d 6d 69 74 5f 68 6f 6f  lite3_commit_hoo
10000 6b 28 70 44 62 2d 3e 64 62 2c 20 30 2c 20 30 29  k(pDb->db, 0, 0)
10010 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
10020 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
10030 20 20 2f 2a 20 20 20 20 24 64 62 20 63 6f 6d 70    /*    $db comp
10040 6c 65 74 65 20 53 51 4c 0a 20 20 2a 2a 0a 20 20  lete SQL.  **.  
10050 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
10060 66 20 53 51 4c 20 69 73 20 61 20 63 6f 6d 70 6c  f SQL is a compl
10070 65 74 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  ete SQL statemen
10080 74 2e 20 20 52 65 74 75 72 6e 20 46 41 4c 53 45  t.  Return FALSE
10090 20 69 66 0a 20 20 2a 2a 20 61 64 64 69 74 69 6f   if.  ** additio
100a0 6e 61 6c 20 6c 69 6e 65 73 20 6f 66 20 69 6e 70  nal lines of inp
100b0 75 74 20 61 72 65 20 6e 65 65 64 65 64 2e 20 20  ut are needed.  
100c0 54 68 69 73 20 69 73 20 73 69 6d 69 6c 61 72 20  This is similar 
100d0 74 6f 20 74 68 65 0a 20 20 2a 2a 20 62 75 69 6c  to the.  ** buil
100e0 74 2d 69 6e 20 22 69 6e 66 6f 20 63 6f 6d 70 6c  t-in "info compl
100f0 65 74 65 22 20 63 6f 6d 6d 61 6e 64 20 6f 66 20  ete" command of 
10100 54 63 6c 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  Tcl..  */.  case
10110 20 44 42 5f 43 4f 4d 50 4c 45 54 45 3a 20 7b 0a   DB_COMPLETE: {.
10120 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
10130 4d 49 54 5f 43 4f 4d 50 4c 45 54 45 0a 20 20 20  MIT_COMPLETE.   
10140 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 73 75 6c   Tcl_Obj *pResul
10150 74 3b 0a 20 20 20 20 69 6e 74 20 69 73 43 6f 6d  t;.    int isCom
10160 70 6c 65 74 65 3b 0a 20 20 20 20 69 66 28 20 6f  plete;.    if( o
10170 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20  bjc!=3 ){.      
10180 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
10190 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76  (interp, 2, objv
101a0 2c 20 22 53 51 4c 22 29 3b 0a 20 20 20 20 20 20  , "SQL");.      
101b0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
101c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 73 43 6f  ;.    }.    isCo
101d0 6d 70 6c 65 74 65 20 3d 20 73 71 6c 69 74 65 33  mplete = sqlite3
101e0 5f 63 6f 6d 70 6c 65 74 65 28 20 54 63 6c 5f 47  _complete( Tcl_G
101f0 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
10200 6f 62 6a 76 5b 32 5d 2c 20 30 29 20 29 3b 0a 20  objv[2], 0) );. 
10210 20 20 20 70 52 65 73 75 6c 74 20 3d 20 54 63 6c     pResult = Tcl
10220 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _GetObjResult(in
10230 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f 53  terp);.    Tcl_S
10240 65 74 42 6f 6f 6c 65 61 6e 4f 62 6a 28 70 52 65  etBooleanObj(pRe
10250 73 75 6c 74 2c 20 69 73 43 6f 6d 70 6c 65 74 65  sult, isComplete
10260 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 62 72  );.#endif.    br
10270 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20  eak;.  }..  /*  
10280 20 20 24 64 62 20 63 6f 70 79 20 63 6f 6e 66 6c    $db copy confl
10290 69 63 74 2d 61 6c 67 6f 72 69 74 68 6d 20 74 61  ict-algorithm ta
102a0 62 6c 65 20 66 69 6c 65 6e 61 6d 65 20 3f 53 45  ble filename ?SE
102b0 50 41 52 41 54 4f 52 3f 20 3f 4e 55 4c 4c 49 4e  PARATOR? ?NULLIN
102c0 44 49 43 41 54 4f 52 3f 0a 20 20 2a 2a 0a 20 20  DICATOR?.  **.  
102d0 2a 2a 20 43 6f 70 79 20 64 61 74 61 20 69 6e 74  ** Copy data int
102e0 6f 20 74 61 62 6c 65 20 66 72 6f 6d 20 66 69 6c  o table from fil
102f0 65 6e 61 6d 65 2c 20 6f 70 74 69 6f 6e 61 6c 6c  ename, optionall
10300 79 20 75 73 69 6e 67 20 53 45 50 41 52 41 54 4f  y using SEPARATO
10310 52 0a 20 20 2a 2a 20 61 73 20 63 6f 6c 75 6d 6e  R.  ** as column
10320 20 73 65 70 61 72 61 74 6f 72 73 2e 20 20 49 66   separators.  If
10330 20 61 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69   a column contai
10340 6e 73 20 61 20 6e 75 6c 6c 20 73 74 72 69 6e 67  ns a null string
10350 2c 20 6f 72 20 74 68 65 0a 20 20 2a 2a 20 76 61  , or the.  ** va
10360 6c 75 65 20 6f 66 20 4e 55 4c 4c 49 4e 44 49 43  lue of NULLINDIC
10370 41 54 4f 52 2c 20 61 20 4e 55 4c 4c 20 69 73 20  ATOR, a NULL is 
10380 69 6e 73 65 72 74 65 64 20 66 6f 72 20 74 68 65  inserted for the
10390 20 63 6f 6c 75 6d 6e 2e 0a 20 20 2a 2a 20 63 6f   column..  ** co
103a0 6e 66 6c 69 63 74 2d 61 6c 67 6f 72 69 74 68 6d  nflict-algorithm
103b0 20 69 73 20 6f 6e 65 20 6f 66 20 74 68 65 20 73   is one of the s
103c0 71 6c 69 74 65 20 63 6f 6e 66 6c 69 63 74 20 61  qlite conflict a
103d0 6c 67 6f 72 69 74 68 6d 73 3a 0a 20 20 2a 2a 20  lgorithms:.  ** 
103e0 20 20 20 72 6f 6c 6c 62 61 63 6b 2c 20 61 62 6f     rollback, abo
103f0 72 74 2c 20 66 61 69 6c 2c 20 69 67 6e 6f 72 65  rt, fail, ignore
10400 2c 20 72 65 70 6c 61 63 65 0a 20 20 2a 2a 20 4f  , replace.  ** O
10410 6e 20 73 75 63 63 65 73 73 2c 20 72 65 74 75 72  n success, retur
10420 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
10430 6c 69 6e 65 73 20 70 72 6f 63 65 73 73 65 64 2c  lines processed,
10440 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79   not necessarily
10450 20 73 61 6d 65 0a 20 20 2a 2a 20 61 73 20 27 64   same.  ** as 'd
10460 62 20 63 68 61 6e 67 65 73 27 20 64 75 65 20 74  b changes' due t
10470 6f 20 63 6f 6e 66 6c 69 63 74 2d 61 6c 67 6f 72  o conflict-algor
10480 69 74 68 6d 20 73 65 6c 65 63 74 65 64 2e 0a 20  ithm selected.. 
10490 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 63 6f   **.  ** This co
104a0 64 65 20 69 73 20 62 61 73 69 63 61 6c 6c 79 20  de is basically 
104b0 61 6e 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  an implementatio
104c0 6e 2f 65 6e 68 61 6e 63 65 6d 65 6e 74 20 6f 66  n/enhancement of
104d0 0a 20 20 2a 2a 20 74 68 65 20 73 71 6c 69 74 65  .  ** the sqlite
104e0 33 20 73 68 65 6c 6c 2e 63 20 22 2e 69 6d 70 6f  3 shell.c ".impo
104f0 72 74 22 20 63 6f 6d 6d 61 6e 64 2e 0a 20 20 2a  rt" command..  *
10500 2a 0a 20 20 2a 2a 20 54 68 69 73 20 63 6f 6d 6d  *.  ** This comm
10510 61 6e 64 20 75 73 61 67 65 20 69 73 20 65 71 75  and usage is equ
10520 69 76 61 6c 65 6e 74 20 74 6f 20 74 68 65 20 73  ivalent to the s
10530 71 6c 69 74 65 32 2e 78 20 43 4f 50 59 20 73 74  qlite2.x COPY st
10540 61 74 65 6d 65 6e 74 2c 0a 20 20 2a 2a 20 77 68  atement,.  ** wh
10550 69 63 68 20 69 6d 70 6f 72 74 73 20 66 69 6c 65  ich imports file
10560 20 64 61 74 61 20 69 6e 74 6f 20 61 20 74 61 62   data into a tab
10570 6c 65 20 75 73 69 6e 67 20 74 68 65 20 50 6f 73  le using the Pos
10580 74 67 72 65 53 51 4c 20 43 4f 50 59 20 66 69 6c  tgreSQL COPY fil
10590 65 20 66 6f 72 6d 61 74 3a 0a 20 20 2a 2a 20 20  e format:.  **  
105a0 20 24 64 62 20 63 6f 70 79 20 24 63 6f 6e 66 6c   $db copy $confl
105b0 69 74 5f 61 6c 67 6f 20 24 74 61 62 6c 65 5f 6e  it_algo $table_n
105c0 61 6d 65 20 24 66 69 6c 65 6e 61 6d 65 20 5c 74  ame $filename \t
105d0 20 5c 5c 4e 0a 20 20 2a 2f 0a 20 20 63 61 73 65   \\N.  */.  case
105e0 20 44 42 5f 43 4f 50 59 3a 20 7b 0a 20 20 20 20   DB_COPY: {.    
105f0 63 68 61 72 20 2a 7a 54 61 62 6c 65 3b 20 20 20  char *zTable;   
10600 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
10610 6e 73 65 72 74 20 64 61 74 61 20 69 6e 74 6f 20  nsert data into 
10620 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20  this table */.  
10630 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 3b 20 20    char *zFile;  
10640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10650 20 54 68 65 20 66 69 6c 65 20 66 72 6f 6d 20 77   The file from w
10660 68 69 63 68 20 74 6f 20 65 78 74 72 61 63 74 20  hich to extract 
10670 64 61 74 61 20 2a 2f 0a 20 20 20 20 63 68 61 72  data */.    char
10680 20 2a 7a 43 6f 6e 66 6c 69 63 74 3b 20 20 20 20   *zConflict;    
10690 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
106a0 6f 6e 66 6c 69 63 74 20 61 6c 67 6f 72 69 74 68  onflict algorith
106b0 6d 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20 20 20  m to use */.    
106c0 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
106d0 74 6d 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 41  tmt;        /* A
106e0 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
106f0 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20    int nCol;     
10700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10710 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   Number of colum
10720 6e 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  ns in the table 
10730 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65  */.    int nByte
10740 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
10750 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
10760 62 79 74 65 73 20 69 6e 20 61 6e 20 53 51 4c 20  bytes in an SQL 
10770 73 74 72 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e  string */.    in
10780 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20  t i, j;         
10790 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
107a0 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20  p counters */.  
107b0 20 20 69 6e 74 20 6e 53 65 70 3b 20 20 20 20 20    int nSep;     
107c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
107d0 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
107e0 20 69 6e 20 7a 53 65 70 5b 5d 20 2a 2f 0a 20 20   in zSep[] */.  
107f0 20 20 69 6e 74 20 6e 4e 75 6c 6c 3b 20 20 20 20    int nNull;    
10800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10810 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
10820 20 69 6e 20 7a 4e 75 6c 6c 5b 5d 20 2a 2f 0a 20   in zNull[] */. 
10830 20 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 20 20     char *zSql;  
10840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10850 2a 20 41 6e 20 53 51 4c 20 73 74 61 74 65 6d 65  * An SQL stateme
10860 6e 74 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a  nt */.    char *
10870 7a 4c 69 6e 65 3b 20 20 20 20 20 20 20 20 20 20  zLine;          
10880 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c        /* A singl
10890 65 20 6c 69 6e 65 20 6f 66 20 69 6e 70 75 74 20  e line of input 
108a0 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 2a 2f  from the file */
108b0 0a 20 20 20 20 63 68 61 72 20 2a 2a 61 7a 43 6f  .    char **azCo
108c0 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
108d0 20 2f 2a 20 7a 4c 69 6e 65 5b 5d 20 62 72 6f 6b   /* zLine[] brok
108e0 65 6e 20 75 70 20 69 6e 74 6f 20 63 6f 6c 75 6d  en up into colum
108f0 6e 73 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20  ns */.    const 
10900 63 68 61 72 20 2a 7a 43 6f 6d 6d 69 74 3b 20 20  char *zCommit;  
10910 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20        /* How to 
10920 63 6f 6d 6d 69 74 20 63 68 61 6e 67 65 73 20 2a  commit changes *
10930 2f 0a 20 20 20 20 46 49 4c 45 20 2a 69 6e 3b 20  /.    FILE *in; 
10940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10950 20 20 2f 2a 20 54 68 65 20 69 6e 70 75 74 20 66    /* The input f
10960 69 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6c  ile */.    int l
10970 69 6e 65 6e 6f 20 3d 20 30 3b 20 20 20 20 20 20  ineno = 0;      
10980 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e 65 20 6e         /* Line n
10990 75 6d 62 65 72 20 6f 66 20 69 6e 70 75 74 20 66  umber of input f
109a0 69 6c 65 20 2a 2f 0a 20 20 20 20 63 68 61 72 20  ile */.    char 
109b0 7a 4c 69 6e 65 4e 75 6d 5b 38 30 5d 3b 20 20 20  zLineNum[80];   
109c0 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e 65 20 6e         /* Line n
109d0 75 6d 62 65 72 20 70 72 69 6e 74 20 62 75 66 66  umber print buff
109e0 65 72 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62  er */.    Tcl_Ob
109f0 6a 20 2a 70 52 65 73 75 6c 74 3b 20 20 20 20 20  j *pResult;     
10a00 20 20 20 20 20 20 2f 2a 20 69 6e 74 65 72 70 20        /* interp 
10a10 72 65 73 75 6c 74 20 2a 2f 0a 0a 20 20 20 20 63  result */..    c
10a20 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 65 70 3b  onst char *zSep;
10a30 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
10a40 2a 7a 4e 75 6c 6c 3b 0a 20 20 20 20 69 66 28 20  *zNull;.    if( 
10a50 6f 62 6a 63 3c 35 20 7c 7c 20 6f 62 6a 63 3e 37  objc<5 || objc>7
10a60 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72   ){.      Tcl_Wr
10a70 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
10a80 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 0a 20 20 20  p, 2, objv, .   
10a90 20 20 20 20 20 20 22 43 4f 4e 46 4c 49 43 54 2d        "CONFLICT-
10aa0 41 4c 47 4f 52 49 54 48 4d 20 54 41 42 4c 45 20  ALGORITHM TABLE 
10ab0 46 49 4c 45 4e 41 4d 45 20 3f 53 45 50 41 52 41  FILENAME ?SEPARA
10ac0 54 4f 52 3f 20 3f 4e 55 4c 4c 49 4e 44 49 43 41  TOR? ?NULLINDICA
10ad0 54 4f 52 3f 22 29 3b 0a 20 20 20 20 20 20 72 65  TOR?");.      re
10ae0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
10af0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 62      }.    if( ob
10b00 6a 63 3e 3d 36 20 29 7b 0a 20 20 20 20 20 20 7a  jc>=6 ){.      z
10b10 53 65 70 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  Sep = Tcl_GetStr
10b20 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
10b30 35 5d 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73  5], 0);.    }els
10b40 65 7b 0a 20 20 20 20 20 20 7a 53 65 70 20 3d 20  e{.      zSep = 
10b50 22 5c 74 22 3b 0a 20 20 20 20 7d 0a 20 20 20 20  "\t";.    }.    
10b60 69 66 28 20 6f 62 6a 63 3e 3d 37 20 29 7b 0a 20  if( objc>=7 ){. 
10b70 20 20 20 20 20 7a 4e 75 6c 6c 20 3d 20 54 63 6c       zNull = Tcl
10b80 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
10b90 6a 28 6f 62 6a 76 5b 36 5d 2c 20 30 29 3b 0a 20  j(objv[6], 0);. 
10ba0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
10bb0 7a 4e 75 6c 6c 20 3d 20 22 22 3b 0a 20 20 20 20  zNull = "";.    
10bc0 7d 0a 20 20 20 20 7a 43 6f 6e 66 6c 69 63 74 20  }.    zConflict 
10bd0 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  = Tcl_GetStringF
10be0 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20  romObj(objv[2], 
10bf0 30 29 3b 0a 20 20 20 20 7a 54 61 62 6c 65 20 3d  0);.    zTable =
10c00 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
10c10 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d 2c 20 30  omObj(objv[3], 0
10c20 29 3b 0a 20 20 20 20 7a 46 69 6c 65 20 3d 20 54  );.    zFile = T
10c30 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
10c40 4f 62 6a 28 6f 62 6a 76 5b 34 5d 2c 20 30 29 3b  Obj(objv[4], 0);
10c50 0a 20 20 20 20 6e 53 65 70 20 3d 20 73 74 72 6c  .    nSep = strl
10c60 65 6e 33 30 28 7a 53 65 70 29 3b 0a 20 20 20 20  en30(zSep);.    
10c70 6e 4e 75 6c 6c 20 3d 20 73 74 72 6c 65 6e 33 30  nNull = strlen30
10c80 28 7a 4e 75 6c 6c 29 3b 0a 20 20 20 20 69 66 28  (zNull);.    if(
10c90 20 6e 53 65 70 3d 3d 30 20 29 7b 0a 20 20 20 20   nSep==0 ){.    
10ca0 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
10cb0 6c 74 28 69 6e 74 65 72 70 2c 22 45 72 72 6f 72  lt(interp,"Error
10cc0 3a 20 6e 6f 6e 2d 6e 75 6c 6c 20 73 65 70 61 72  : non-null separ
10cd0 61 74 6f 72 20 72 65 71 75 69 72 65 64 20 66 6f  ator required fo
10ce0 72 20 63 6f 70 79 22 2c 30 29 3b 0a 20 20 20 20  r copy",0);.    
10cf0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
10d00 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  OR;.    }.    if
10d10 28 73 74 72 63 6d 70 28 7a 43 6f 6e 66 6c 69 63  (strcmp(zConflic
10d20 74 2c 20 22 72 6f 6c 6c 62 61 63 6b 22 29 20 21  t, "rollback") !
10d30 3d 20 30 20 26 26 0a 20 20 20 20 20 20 20 73 74  = 0 &&.       st
10d40 72 63 6d 70 28 7a 43 6f 6e 66 6c 69 63 74 2c 20  rcmp(zConflict, 
10d50 22 61 62 6f 72 74 22 20 20 20 29 20 21 3d 20 30  "abort"   ) != 0
10d60 20 26 26 0a 20 20 20 20 20 20 20 73 74 72 63 6d   &&.       strcm
10d70 70 28 7a 43 6f 6e 66 6c 69 63 74 2c 20 22 66 61  p(zConflict, "fa
10d80 69 6c 22 20 20 20 20 29 20 21 3d 20 30 20 26 26  il"    ) != 0 &&
10d90 0a 20 20 20 20 20 20 20 73 74 72 63 6d 70 28 7a  .       strcmp(z
10da0 43 6f 6e 66 6c 69 63 74 2c 20 22 69 67 6e 6f 72  Conflict, "ignor
10db0 65 22 20 20 29 20 21 3d 20 30 20 26 26 0a 20 20  e"  ) != 0 &&.  
10dc0 20 20 20 20 20 73 74 72 63 6d 70 28 7a 43 6f 6e       strcmp(zCon
10dd0 66 6c 69 63 74 2c 20 22 72 65 70 6c 61 63 65 22  flict, "replace"
10de0 20 29 20 21 3d 20 30 20 29 20 7b 0a 20 20 20 20   ) != 0 ) {.    
10df0 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
10e00 6c 74 28 69 6e 74 65 72 70 2c 20 22 45 72 72 6f  lt(interp, "Erro
10e10 72 3a 20 5c 22 22 2c 20 7a 43 6f 6e 66 6c 69 63  r: \"", zConflic
10e20 74 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  t, .            
10e30 22 5c 22 2c 20 63 6f 6e 66 6c 69 63 74 2d 61 6c  "\", conflict-al
10e40 67 6f 72 69 74 68 6d 20 6d 75 73 74 20 62 65 20  gorithm must be 
10e50 6f 6e 65 20 6f 66 3a 20 72 6f 6c 6c 62 61 63 6b  one of: rollback
10e60 2c 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  , ".            
10e70 22 61 62 6f 72 74 2c 20 66 61 69 6c 2c 20 69 67  "abort, fail, ig
10e80 6e 6f 72 65 2c 20 6f 72 20 72 65 70 6c 61 63 65  nore, or replace
10e90 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 65 74  ", 0);.      ret
10ea0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
10eb0 20 20 20 7d 0a 20 20 20 20 7a 53 71 6c 20 3d 20     }.    zSql = 
10ec0 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
10ed0 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 27  "SELECT * FROM '
10ee0 25 71 27 22 2c 20 7a 54 61 62 6c 65 29 3b 0a 20  %q'", zTable);. 
10ef0 20 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29     if( zSql==0 )
10f00 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65  {.      Tcl_Appe
10f10 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
10f20 20 22 45 72 72 6f 72 3a 20 6e 6f 20 73 75 63 68   "Error: no such
10f30 20 74 61 62 6c 65 3a 20 22 2c 20 7a 54 61 62 6c   table: ", zTabl
10f40 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 65 74  e, 0);.      ret
10f50 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
10f60 20 20 20 7d 0a 20 20 20 20 6e 42 79 74 65 20 3d     }.    nByte =
10f70 20 73 74 72 6c 65 6e 33 30 28 7a 53 71 6c 29 3b   strlen30(zSql);
10f80 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
10f90 33 5f 70 72 65 70 61 72 65 28 70 44 62 2d 3e 64  3_prepare(pDb->d
10fa0 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53  b, zSql, -1, &pS
10fb0 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  tmt, 0);.    sql
10fc0 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b  ite3_free(zSql);
10fd0 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
10fe0 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
10ff0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 45  esult(interp, "E
11000 72 72 6f 72 3a 20 22 2c 20 73 71 6c 69 74 65 33  rror: ", sqlite3
11010 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62 29  _errmsg(pDb->db)
11020 2c 20 30 29 3b 0a 20 20 20 20 20 20 6e 43 6f 6c  , 0);.      nCol
11030 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
11040 0a 20 20 20 20 20 20 6e 43 6f 6c 20 3d 20 73 71  .      nCol = sq
11050 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75  lite3_column_cou
11060 6e 74 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 7d  nt(pStmt);.    }
11070 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e  .    sqlite3_fin
11080 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20  alize(pStmt);.  
11090 20 20 69 66 28 20 6e 43 6f 6c 3d 3d 30 20 29 20    if( nCol==0 ) 
110a0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  {.      return T
110b0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
110c0 20 20 20 20 7a 53 71 6c 20 3d 20 6d 61 6c 6c 6f      zSql = mallo
110d0 63 28 20 6e 42 79 74 65 20 2b 20 35 30 20 2b 20  c( nByte + 50 + 
110e0 6e 43 6f 6c 2a 32 20 29 3b 0a 20 20 20 20 69 66  nCol*2 );.    if
110f0 28 20 7a 53 71 6c 3d 3d 30 20 29 20 7b 0a 20 20  ( zSql==0 ) {.  
11100 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
11110 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 45 72  sult(interp, "Er
11120 72 6f 72 3a 20 63 61 6e 27 74 20 6d 61 6c 6c 6f  ror: can't mallo
11130 63 28 29 22 2c 20 30 29 3b 0a 20 20 20 20 20 20  c()", 0);.      
11140 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
11150 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
11160 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 79  te3_snprintf(nBy
11170 74 65 2b 35 30 2c 20 7a 53 71 6c 2c 20 22 49 4e  te+50, zSql, "IN
11180 53 45 52 54 20 4f 52 20 25 71 20 49 4e 54 4f 20  SERT OR %q INTO 
11190 27 25 71 27 20 56 41 4c 55 45 53 28 3f 22 2c 0a  '%q' VALUES(?",.
111a0 20 20 20 20 20 20 20 20 20 7a 43 6f 6e 66 6c 69           zConfli
111b0 63 74 2c 20 7a 54 61 62 6c 65 29 3b 0a 20 20 20  ct, zTable);.   
111c0 20 6a 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 53   j = strlen30(zS
111d0 71 6c 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31  ql);.    for(i=1
111e0 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  ; i<nCol; i++){.
111f0 20 20 20 20 20 20 7a 53 71 6c 5b 6a 2b 2b 5d 20        zSql[j++] 
11200 3d 20 27 2c 27 3b 0a 20 20 20 20 20 20 7a 53 71  = ',';.      zSq
11210 6c 5b 6a 2b 2b 5d 20 3d 20 27 3f 27 3b 0a 20 20  l[j++] = '?';.  
11220 20 20 7d 0a 20 20 20 20 7a 53 71 6c 5b 6a 2b 2b    }.    zSql[j++
11230 5d 20 3d 20 27 29 27 3b 0a 20 20 20 20 7a 53 71  ] = ')';.    zSq
11240 6c 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 72 63  l[j] = 0;.    rc
11250 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61   = sqlite3_prepa
11260 72 65 28 70 44 62 2d 3e 64 62 2c 20 7a 53 71 6c  re(pDb->db, zSql
11270 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29  , -1, &pStmt, 0)
11280 3b 0a 20 20 20 20 66 72 65 65 28 7a 53 71 6c 29  ;.    free(zSql)
11290 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  ;.    if( rc ){.
112a0 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
112b0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
112c0 45 72 72 6f 72 3a 20 22 2c 20 73 71 6c 69 74 65  Error: ", sqlite
112d0 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62  3_errmsg(pDb->db
112e0 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  ), 0);.      sql
112f0 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53  ite3_finalize(pS
11300 74 6d 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75  tmt);.      retu
11310 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
11320 20 20 7d 0a 20 20 20 20 69 6e 20 3d 20 66 6f 70    }.    in = fop
11330 65 6e 28 7a 46 69 6c 65 2c 20 22 72 62 22 29 3b  en(zFile, "rb");
11340 0a 20 20 20 20 69 66 28 20 69 6e 3d 3d 30 20 29  .    if( in==0 )
11350 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65  {.      Tcl_Appe
11360 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
11370 20 22 45 72 72 6f 72 3a 20 63 61 6e 6e 6f 74 20   "Error: cannot 
11380 6f 70 65 6e 20 66 69 6c 65 3a 20 22 2c 20 7a 46  open file: ", zF
11390 69 6c 65 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20  ile, NULL);.    
113a0 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
113b0 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20  ze(pStmt);.     
113c0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
113d0 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 7a 43  R;.    }.    azC
113e0 6f 6c 20 3d 20 6d 61 6c 6c 6f 63 28 20 73 69 7a  ol = malloc( siz
113f0 65 6f 66 28 61 7a 43 6f 6c 5b 30 5d 29 2a 28 6e  eof(azCol[0])*(n
11400 43 6f 6c 2b 31 29 20 29 3b 0a 20 20 20 20 69 66  Col+1) );.    if
11410 28 20 61 7a 43 6f 6c 3d 3d 30 20 29 20 7b 0a 20  ( azCol==0 ) {. 
11420 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
11430 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 45  esult(interp, "E
11440 72 72 6f 72 3a 20 63 61 6e 27 74 20 6d 61 6c 6c  rror: can't mall
11450 6f 63 28 29 22 2c 20 30 29 3b 0a 20 20 20 20 20  oc()", 0);.     
11460 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 20   fclose(in);.   
11470 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
11480 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 28  ROR;.    }.    (
11490 76 6f 69 64 29 73 71 6c 69 74 65 33 5f 65 78 65  void)sqlite3_exe
114a0 63 28 70 44 62 2d 3e 64 62 2c 20 22 42 45 47 49  c(pDb->db, "BEGI
114b0 4e 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  N", 0, 0, 0);.  
114c0 20 20 7a 43 6f 6d 6d 69 74 20 3d 20 22 43 4f 4d    zCommit = "COM
114d0 4d 49 54 22 3b 0a 20 20 20 20 77 68 69 6c 65 28  MIT";.    while(
114e0 20 28 7a 4c 69 6e 65 20 3d 20 6c 6f 63 61 6c 5f   (zLine = local_
114f0 67 65 74 6c 69 6e 65 28 30 2c 20 69 6e 29 29 21  getline(0, in))!
11500 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72  =0 ){.      char
11510 20 2a 7a 3b 0a 20 20 20 20 20 20 6c 69 6e 65 6e   *z;.      linen
11520 6f 2b 2b 3b 0a 20 20 20 20 20 20 61 7a 43 6f 6c  o++;.      azCol
11530 5b 30 5d 20 3d 20 7a 4c 69 6e 65 3b 0a 20 20 20  [0] = zLine;.   
11540 20 20 20 66 6f 72 28 69 3d 30 2c 20 7a 3d 7a 4c     for(i=0, z=zL
11550 69 6e 65 3b 20 2a 7a 3b 20 7a 2b 2b 29 7b 0a 20  ine; *z; z++){. 
11560 20 20 20 20 20 20 20 69 66 28 20 2a 7a 3d 3d 7a         if( *z==z
11570 53 65 70 5b 30 5d 20 26 26 20 73 74 72 6e 63 6d  Sep[0] && strncm
11580 70 28 7a 2c 20 7a 53 65 70 2c 20 6e 53 65 70 29  p(z, zSep, nSep)
11590 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
115a0 20 2a 7a 20 3d 20 30 3b 0a 20 20 20 20 20 20 20   *z = 0;.       
115b0 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20 20     i++;.        
115c0 20 20 69 66 28 20 69 3c 6e 43 6f 6c 20 29 7b 0a    if( i<nCol ){.
115d0 20 20 20 20 20 20 20 20 20 20 20 20 61 7a 43 6f              azCo
115e0 6c 5b 69 5d 20 3d 20 26 7a 5b 6e 53 65 70 5d 3b  l[i] = &z[nSep];
115f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 20 2b  .            z +
11600 3d 20 6e 53 65 70 2d 31 3b 0a 20 20 20 20 20 20  = nSep-1;.      
11610 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
11620 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
11630 28 20 69 2b 31 21 3d 6e 43 6f 6c 20 29 7b 0a 20  ( i+1!=nCol ){. 
11640 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 45 72         char *zEr
11650 72 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  r;.        int n
11660 45 72 72 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a  Err = strlen30(z
11670 46 69 6c 65 29 20 2b 20 32 30 30 3b 0a 20 20 20  File) + 200;.   
11680 20 20 20 20 20 7a 45 72 72 20 3d 20 6d 61 6c 6c       zErr = mall
11690 6f 63 28 6e 45 72 72 29 3b 0a 20 20 20 20 20 20  oc(nErr);.      
116a0 20 20 69 66 28 20 7a 45 72 72 20 29 7b 0a 20 20    if( zErr ){.  
116b0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
116c0 73 6e 70 72 69 6e 74 66 28 6e 45 72 72 2c 20 7a  snprintf(nErr, z
116d0 45 72 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Err,.           
116e0 20 20 22 45 72 72 6f 72 3a 20 25 73 20 6c 69 6e    "Error: %s lin
116f0 65 20 25 64 3a 20 65 78 70 65 63 74 65 64 20 25  e %d: expected %
11700 64 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 64 61 74  d columns of dat
11710 61 20 62 75 74 20 66 6f 75 6e 64 20 25 64 22 2c  a but found %d",
11720 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 46  .             zF
11730 69 6c 65 2c 20 6c 69 6e 65 6e 6f 2c 20 6e 43 6f  ile, lineno, nCo
11740 6c 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20 20 20  l, i+1);.       
11750 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
11760 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 45 72 72  ult(interp, zErr
11770 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
11780 66 72 65 65 28 7a 45 72 72 29 3b 0a 20 20 20 20  free(zErr);.    
11790 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a 43      }.        zC
117a0 6f 6d 6d 69 74 20 3d 20 22 52 4f 4c 4c 42 41 43  ommit = "ROLLBAC
117b0 4b 22 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  K";.        brea
117c0 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
117d0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c   for(i=0; i<nCol
117e0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
117f0 2f 2a 20 63 68 65 63 6b 20 66 6f 72 20 6e 75 6c  /* check for nul
11800 6c 20 64 61 74 61 2c 20 69 66 20 73 6f 2c 20 62  l data, if so, b
11810 69 6e 64 20 61 73 20 6e 75 6c 6c 20 2a 2f 0a 20  ind as null */. 
11820 20 20 20 20 20 20 20 69 66 28 20 28 6e 4e 75 6c         if( (nNul
11830 6c 3e 30 20 26 26 20 73 74 72 63 6d 70 28 61 7a  l>0 && strcmp(az
11840 43 6f 6c 5b 69 5d 2c 20 7a 4e 75 6c 6c 29 3d 3d  Col[i], zNull)==
11850 30 29 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20  0).          || 
11860 73 74 72 6c 65 6e 33 30 28 61 7a 43 6f 6c 5b 69  strlen30(azCol[i
11870 5d 29 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 29  ])==0 .        )
11880 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
11890 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28 70 53  te3_bind_null(pS
118a0 74 6d 74 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20  tmt, i+1);.     
118b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
118c0 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
118d0 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 69 2b 31  _text(pStmt, i+1
118e0 2c 20 61 7a 43 6f 6c 5b 69 5d 2c 20 2d 31 2c 20  , azCol[i], -1, 
118f0 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a  SQLITE_STATIC);.
11900 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
11910 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  }.      sqlite3_
11920 73 74 65 70 28 70 53 74 6d 74 29 3b 0a 20 20 20  step(pStmt);.   
11930 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
11940 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 20 20  reset(pStmt);.  
11950 20 20 20 20 66 72 65 65 28 7a 4c 69 6e 65 29 3b      free(zLine);
11960 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
11970 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
11980 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
11990 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 45 72 72  sult(interp,"Err
119a0 6f 72 3a 20 22 2c 20 73 71 6c 69 74 65 33 5f 65  or: ", sqlite3_e
119b0 72 72 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c 20  rrmsg(pDb->db), 
119c0 30 29 3b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6d  0);.        zCom
119d0 6d 69 74 20 3d 20 22 52 4f 4c 4c 42 41 43 4b 22  mit = "ROLLBACK"
119e0 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
119f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
11a00 20 20 20 66 72 65 65 28 61 7a 43 6f 6c 29 3b 0a     free(azCol);.
11a10 20 20 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a      fclose(in);.
11a20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61      sqlite3_fina
11a30 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20  lize(pStmt);.   
11a40 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33 5f 65   (void)sqlite3_e
11a50 78 65 63 28 70 44 62 2d 3e 64 62 2c 20 7a 43 6f  xec(pDb->db, zCo
11a60 6d 6d 69 74 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  mmit, 0, 0, 0);.
11a70 0a 20 20 20 20 69 66 28 20 7a 43 6f 6d 6d 69 74  .    if( zCommit
11a80 5b 30 5d 20 3d 3d 20 27 43 27 20 29 7b 0a 20 20  [0] == 'C' ){.  
11a90 20 20 20 20 2f 2a 20 73 75 63 63 65 73 73 2c 20      /* success, 
11aa0 73 65 74 20 72 65 73 75 6c 74 20 61 73 20 6e 75  set result as nu
11ab0 6d 62 65 72 20 6f 66 20 6c 69 6e 65 73 20 70 72  mber of lines pr
11ac0 6f 63 65 73 73 65 64 20 2a 2f 0a 20 20 20 20 20  ocessed */.     
11ad0 20 70 52 65 73 75 6c 74 20 3d 20 54 63 6c 5f 47   pResult = Tcl_G
11ae0 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
11af0 72 70 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 53  rp);.      Tcl_S
11b00 65 74 49 6e 74 4f 62 6a 28 70 52 65 73 75 6c 74  etIntObj(pResult
11b10 2c 20 6c 69 6e 65 6e 6f 29 3b 0a 20 20 20 20 20  , lineno);.     
11b20 20 72 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20   rc = TCL_OK;.  
11b30 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
11b40 2a 20 66 61 69 6c 75 72 65 2c 20 61 70 70 65 6e  * failure, appen
11b50 64 20 6c 69 6e 65 6e 6f 20 77 68 65 72 65 20 66  d lineno where f
11b60 61 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20 73  ailed */.      s
11b70 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
11b80 73 69 7a 65 6f 66 28 7a 4c 69 6e 65 4e 75 6d 29  sizeof(zLineNum)
11b90 2c 20 7a 4c 69 6e 65 4e 75 6d 2c 22 25 64 22 2c  , zLineNum,"%d",
11ba0 6c 69 6e 65 6e 6f 29 3b 0a 20 20 20 20 20 20 54  lineno);.      T
11bb0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
11bc0 69 6e 74 65 72 70 2c 22 2c 20 66 61 69 6c 65 64  interp,", failed
11bd0 20 77 68 69 6c 65 20 70 72 6f 63 65 73 73 69 6e   while processin
11be0 67 20 6c 69 6e 65 3a 20 22 2c 7a 4c 69 6e 65 4e  g line: ",zLineN
11bf0 75 6d 2c 30 29 3b 0a 20 20 20 20 20 20 72 63 20  um,0);.      rc 
11c00 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  = TCL_ERROR;.   
11c10 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20   }.    break;.  
11c20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20  }..  /*.  **    
11c30 24 64 62 20 65 6e 61 62 6c 65 5f 6c 6f 61 64 5f  $db enable_load_
11c40 65 78 74 65 6e 73 69 6f 6e 20 42 4f 4f 4c 45 41  extension BOOLEA
11c50 4e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 75 72 6e  N.  **.  ** Turn
11c60 20 74 68 65 20 65 78 74 65 6e 73 69 6f 6e 20 6c   the extension l
11c70 6f 61 64 69 6e 67 20 66 65 61 74 75 72 65 20 6f  oading feature o
11c80 6e 20 6f 72 20 6f 66 66 2e 20 20 49 74 20 69 66  n or off.  It if
11c90 20 6f 66 66 20 62 79 0a 20 20 2a 2a 20 64 65 66   off by.  ** def
11ca0 61 75 6c 74 2e 0a 20 20 2a 2f 0a 20 20 63 61 73  ault..  */.  cas
11cb0 65 20 44 42 5f 45 4e 41 42 4c 45 5f 4c 4f 41 44  e DB_ENABLE_LOAD
11cc0 5f 45 58 54 45 4e 53 49 4f 4e 3a 20 7b 0a 23 69  _EXTENSION: {.#i
11cd0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
11ce0 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e  T_LOAD_EXTENSION
11cf0 0a 20 20 20 20 69 6e 74 20 6f 6e 6f 66 66 3b 0a  .    int onoff;.
11d00 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20      if( objc!=3 
11d10 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f  ){.      Tcl_Wro
11d20 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
11d30 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 42 4f 4f 4c  , 2, objv, "BOOL
11d40 45 41 4e 22 29 3b 0a 20 20 20 20 20 20 72 65 74  EAN");.      ret
11d50 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
11d60 20 20 20 7d 0a 20 20 20 20 69 66 28 20 54 63 6c     }.    if( Tcl
11d70 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f  _GetBooleanFromO
11d80 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
11d90 32 5d 2c 20 26 6f 6e 6f 66 66 29 20 29 7b 0a 20  2], &onoff) ){. 
11da0 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
11db0 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
11dc0 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
11dd0 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e 28 70  load_extension(p
11de0 44 62 2d 3e 64 62 2c 20 6f 6e 6f 66 66 29 3b 0a  Db->db, onoff);.
11df0 20 20 20 20 62 72 65 61 6b 3b 0a 23 65 6c 73 65      break;.#else
11e00 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
11e10 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 65  esult(interp, "e
11e20 78 74 65 6e 73 69 6f 6e 20 6c 6f 61 64 69 6e 67  xtension loading
11e30 20 69 73 20 74 75 72 6e 65 64 20 6f 66 66 20 61   is turned off a
11e40 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 22 2c  t compile-time",
11e50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
11e60 20 20 20 20 20 20 30 29 3b 0a 20 20 20 20 72 65        0);.    re
11e70 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
11e80 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a  #endif.  }..  /*
11e90 0a 20 20 2a 2a 20 20 20 20 24 64 62 20 65 72 72  .  **    $db err
11ea0 6f 72 63 6f 64 65 0a 20 20 2a 2a 0a 20 20 2a 2a  orcode.  **.  **
11eb0 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 65   Return the nume
11ec0 72 69 63 20 65 72 72 6f 72 20 63 6f 64 65 20 74  ric error code t
11ed0 68 61 74 20 77 61 73 20 72 65 74 75 72 6e 65 64  hat was returned
11ee0 20 62 79 20 74 68 65 20 6d 6f 73 74 20 72 65 63   by the most rec
11ef0 65 6e 74 0a 20 20 2a 2a 20 63 61 6c 6c 20 74 6f  ent.  ** call to
11f00 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29 2e   sqlite3_exec().
11f10 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f  .  */.  case DB_
11f20 45 52 52 4f 52 43 4f 44 45 3a 20 7b 0a 20 20 20  ERRORCODE: {.   
11f30 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
11f40 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
11f50 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f  wIntObj(sqlite3_
11f60 65 72 72 63 6f 64 65 28 70 44 62 2d 3e 64 62 29  errcode(pDb->db)
11f70 29 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20  ));.    break;. 
11f80 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20   }..  /*.  **   
11f90 20 24 64 62 20 65 78 69 73 74 73 20 24 73 71 6c   $db exists $sql
11fa0 0a 20 20 2a 2a 20 20 20 20 24 64 62 20 6f 6e 65  .  **    $db one
11fb0 63 6f 6c 75 6d 6e 20 24 73 71 6c 0a 20 20 2a 2a  column $sql.  **
11fc0 0a 20 20 2a 2a 20 54 68 65 20 6f 6e 65 63 6f 6c  .  ** The onecol
11fd0 75 6d 6e 20 6d 65 74 68 6f 64 20 69 73 20 74 68  umn method is th
11fe0 65 20 65 71 75 69 76 61 6c 65 6e 74 20 6f 66 3a  e equivalent of:
11ff0 0a 20 20 2a 2a 20 20 20 20 20 6c 69 6e 64 65 78  .  **     lindex
12000 20 5b 24 64 62 20 65 76 61 6c 20 24 73 71 6c 5d   [$db eval $sql]
12010 20 30 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44   0.  */.  case D
12020 42 5f 45 58 49 53 54 53 3a 20 0a 20 20 63 61 73  B_EXISTS: .  cas
12030 65 20 44 42 5f 4f 4e 45 43 4f 4c 55 4d 4e 3a 20  e DB_ONECOLUMN: 
12040 7b 0a 20 20 20 20 44 62 45 76 61 6c 43 6f 6e 74  {.    DbEvalCont
12050 65 78 74 20 73 45 76 61 6c 3b 0a 20 20 20 20 69  ext sEval;.    i
12060 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20  f( objc!=3 ){.  
12070 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
12080 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20  Args(interp, 2, 
12090 6f 62 6a 76 2c 20 22 53 51 4c 22 29 3b 0a 20 20  objv, "SQL");.  
120a0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
120b0 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  RROR;.    }..   
120c0 20 64 62 45 76 61 6c 49 6e 69 74 28 26 73 45 76   dbEvalInit(&sEv
120d0 61 6c 2c 20 70 44 62 2c 20 6f 62 6a 76 5b 32 5d  al, pDb, objv[2]
120e0 2c 20 30 29 3b 0a 20 20 20 20 72 63 20 3d 20 64  , 0);.    rc = d
120f0 62 45 76 61 6c 53 74 65 70 28 26 73 45 76 61 6c  bEvalStep(&sEval
12100 29 3b 0a 20 20 20 20 69 66 28 20 63 68 6f 69 63  );.    if( choic
12110 65 3d 3d 44 42 5f 4f 4e 45 43 4f 4c 55 4d 4e 20  e==DB_ONECOLUMN 
12120 29 7b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  ){.      if( rc=
12130 3d 54 43 4c 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  =TCL_OK ){.     
12140 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73     Tcl_SetObjRes
12150 75 6c 74 28 69 6e 74 65 72 70 2c 20 64 62 45 76  ult(interp, dbEv
12160 61 6c 43 6f 6c 75 6d 6e 56 61 6c 75 65 28 26 73  alColumnValue(&s
12170 45 76 61 6c 2c 20 30 29 29 3b 0a 20 20 20 20 20  Eval, 0));.     
12180 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 54   }else if( rc==T
12190 43 4c 5f 42 52 45 41 4b 20 29 7b 0a 20 20 20 20  CL_BREAK ){.    
121a0 20 20 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73      Tcl_ResetRes
121b0 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20  ult(interp);.   
121c0 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69     }.    }else i
121d0 66 28 20 72 63 3d 3d 54 43 4c 5f 42 52 45 41 4b  f( rc==TCL_BREAK
121e0 20 7c 7c 20 72 63 3d 3d 54 43 4c 5f 4f 4b 20 29   || rc==TCL_OK )
121f0 7b 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f  {.      Tcl_SetO
12200 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
12210 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f   Tcl_NewBooleanO
12220 62 6a 28 72 63 3d 3d 54 43 4c 5f 4f 4b 29 29 3b  bj(rc==TCL_OK));
12230 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 45 76 61  .    }.    dbEva
12240 6c 46 69 6e 61 6c 69 7a 65 28 26 73 45 76 61 6c  lFinalize(&sEval
12250 29 3b 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  );..    if( rc==
12260 54 43 4c 5f 42 52 45 41 4b 20 29 7b 0a 20 20 20  TCL_BREAK ){.   
12270 20 20 20 72 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a     rc = TCL_OK;.
12280 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b      }.    break;
12290 0a 20 20 7d 0a 20 20 20 0a 20 20 2f 2a 0a 20 20  .  }.   .  /*.  
122a0 2a 2a 20 20 20 20 24 64 62 20 65 76 61 6c 20 24  **    $db eval $
122b0 73 71 6c 20 3f 61 72 72 61 79 3f 20 3f 7b 20 20  sql ?array? ?{  
122c0 2e 2e 2e 63 6f 64 65 2e 2e 2e 20 7d 3f 0a 20 20  ...code... }?.  
122d0 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 53 51 4c 20  **.  ** The SQL 
122e0 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 24 73 71  statement in $sq
122f0 6c 20 69 73 20 65 76 61 6c 75 61 74 65 64 2e 20  l is evaluated. 
12300 20 46 6f 72 20 65 61 63 68 20 72 6f 77 2c 20 74   For each row, t
12310 68 65 20 76 61 6c 75 65 73 20 61 72 65 0a 20 20  he values are.  
12320 2a 2a 20 70 6c 61 63 65 64 20 69 6e 20 65 6c 65  ** placed in ele
12330 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 61 72 72  ments of the arr
12340 61 79 20 6e 61 6d 65 64 20 22 61 72 72 61 79 22  ay named "array"
12350 20 61 6e 64 20 2e 2e 2e 63 6f 64 65 2e 2e 2e 20   and ...code... 
12360 69 73 20 65 78 65 63 75 74 65 64 2e 0a 20 20 2a  is executed..  *
12370 2a 20 49 66 20 22 61 72 72 61 79 22 20 61 6e 64  * If "array" and
12380 20 22 63 6f 64 65 22 20 61 72 65 20 6f 6d 69 74   "code" are omit
12390 74 65 64 2c 20 74 68 65 6e 20 6e 6f 20 63 61 6c  ted, then no cal
123a0 6c 62 61 63 6b 20 69 73 20 65 76 65 72 79 20 69  lback is every i
123b0 6e 76 6f 6b 65 64 2e 0a 20 20 2a 2a 20 49 66 20  nvoked..  ** If 
123c0 22 61 72 72 61 79 22 20 69 73 20 61 6e 20 65 6d  "array" is an em
123d0 70 74 79 20 73 74 72 69 6e 67 2c 20 74 68 65 6e  pty string, then
123e0 20 74 68 65 20 76 61 6c 75 65 73 20 61 72 65 20   the values are 
123f0 70 6c 61 63 65 64 20 69 6e 20 76 61 72 69 61 62  placed in variab
12400 6c 65 73 0a 20 20 2a 2a 20 74 68 61 74 20 68 61  les.  ** that ha
12410 76 65 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65  ve the same name
12420 20 61 73 20 74 68 65 20 66 69 65 6c 64 73 20 65   as the fields e
12430 78 74 72 61 63 74 65 64 20 62 79 20 74 68 65 20  xtracted by the 
12440 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 63 61  query..  */.  ca
12450 73 65 20 44 42 5f 45 56 41 4c 3a 20 7b 0a 20 20  se DB_EVAL: {.  
12460 20 20 69 66 28 20 6f 62 6a 63 3c 33 20 7c 7c 20    if( objc<3 || 
12470 6f 62 6a 63 3e 35 20 29 7b 0a 20 20 20 20 20 20  objc>5 ){.      
12480 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
12490 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76  (interp, 2, objv
124a0 2c 20 22 53 51 4c 20 3f 41 52 52 41 59 2d 4e 41  , "SQL ?ARRAY-NA
124b0 4d 45 3f 20 3f 53 43 52 49 50 54 3f 22 29 3b 0a  ME? ?SCRIPT?");.
124c0 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
124d0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
124e0 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d 33 20 29     if( objc==3 )
124f0 7b 0a 20 20 20 20 20 20 44 62 45 76 61 6c 43 6f  {.      DbEvalCo
12500 6e 74 65 78 74 20 73 45 76 61 6c 3b 0a 20 20 20  ntext sEval;.   
12510 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 74     Tcl_Obj *pRet
12520 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b   = Tcl_NewObj();
12530 0a 20 20 20 20 20 20 54 63 6c 5f 49 6e 63 72 52  .      Tcl_IncrR
12540 65 66 43 6f 75 6e 74 28 70 52 65 74 29 3b 0a 20  efCount(pRet);. 
12550 20 20 20 20 20 64 62 45 76 61 6c 49 6e 69 74 28       dbEvalInit(
12560 26 73 45 76 61 6c 2c 20 70 44 62 2c 20 6f 62 6a  &sEval, pDb, obj
12570 76 5b 32 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20  v[2], 0);.      
12580 77 68 69 6c 65 28 20 54 43 4c 5f 4f 4b 3d 3d 28  while( TCL_OK==(
12590 72 63 20 3d 20 64 62 45 76 61 6c 53 74 65 70 28  rc = dbEvalStep(
125a0 26 73 45 76 61 6c 29 29 20 29 7b 0a 20 20 20 20  &sEval)) ){.    
125b0 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
125c0 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 20     int nCol;.   
125d0 20 20 20 20 20 64 62 45 76 61 6c 52 6f 77 49 6e       dbEvalRowIn
125e0 66 6f 28 26 73 45 76 61 6c 2c 20 26 6e 43 6f 6c  fo(&sEval, &nCol
125f0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 66 6f  , 0);.        fo
12600 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69  r(i=0; i<nCol; i
12610 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54  ++){.          T
12620 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
12630 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
12640 70 52 65 74 2c 20 64 62 45 76 61 6c 43 6f 6c 75  pRet, dbEvalColu
12650 6d 6e 56 61 6c 75 65 28 26 73 45 76 61 6c 2c 20  mnValue(&sEval, 
12660 69 29 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  i));.        }. 
12670 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64 62 45       }.      dbE
12680 76 61 6c 46 69 6e 61 6c 69 7a 65 28 26 73 45 76  valFinalize(&sEv
12690 61 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  al);.      if( r
126a0 63 3d 3d 54 43 4c 5f 42 52 45 41 4b 20 29 7b 0a  c==TCL_BREAK ){.
126b0 20 20 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f          Tcl_SetO
126c0 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
126d0 20 70 52 65 74 29 3b 0a 20 20 20 20 20 20 20 20   pRet);.        
126e0 72 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20  rc = TCL_OK;.   
126f0 20 20 20 7d 0a 20 20 20 20 20 20 54 63 6c 5f 44     }.      Tcl_D
12700 65 63 72 52 65 66 43 6f 75 6e 74 28 70 52 65 74  ecrRefCount(pRet
12710 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
12720 20 20 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63      ClientData c
12730 64 5b 32 5d 3b 0a 20 20 20 20 20 20 44 62 45 76  d[2];.      DbEv
12740 61 6c 43 6f 6e 74 65 78 74 20 2a 70 3b 0a 20 20  alContext *p;.  
12750 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 41 72      Tcl_Obj *pAr
12760 72 61 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 54  ray = 0;.      T
12770 63 6c 5f 4f 62 6a 20 2a 70 53 63 72 69 70 74 3b  cl_Obj *pScript;
12780 0a 0a 20 20 20 20 20 20 69 66 28 20 6f 62 6a 63  ..      if( objc
12790 3d 3d 35 20 26 26 20 2a 28 63 68 61 72 20 2a 29  ==5 && *(char *)
127a0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
127b0 6a 76 5b 33 5d 29 20 29 7b 0a 20 20 20 20 20 20  jv[3]) ){.      
127c0 20 20 70 41 72 72 61 79 20 3d 20 6f 62 6a 76 5b    pArray = objv[
127d0 33 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  3];.      }.    
127e0 20 20 70 53 63 72 69 70 74 20 3d 20 6f 62 6a 76    pScript = objv
127f0 5b 6f 62 6a 63 2d 31 5d 3b 0a 20 20 20 20 20 20  [objc-1];.      
12800 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
12810 28 70 53 63 72 69 70 74 29 3b 0a 20 20 20 20 20  (pScript);.     
12820 20 0a 20 20 20 20 20 20 70 20 3d 20 28 44 62 45   .      p = (DbE
12830 76 61 6c 43 6f 6e 74 65 78 74 20 2a 29 54 63 6c  valContext *)Tcl
12840 5f 41 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 44 62  _Alloc(sizeof(Db
12850 45 76 61 6c 43 6f 6e 74 65 78 74 29 29 3b 0a 20  EvalContext));. 
12860 20 20 20 20 20 64 62 45 76 61 6c 49 6e 69 74 28       dbEvalInit(
12870 70 2c 20 70 44 62 2c 20 6f 62 6a 76 5b 32 5d 2c  p, pDb, objv[2],
12880 20 70 41 72 72 61 79 29 3b 0a 0a 20 20 20 20 20   pArray);..     
12890 20 63 64 5b 30 5d 20 3d 20 28 76 6f 69 64 20 2a   cd[0] = (void *
128a0 29 70 3b 0a 20 20 20 20 20 20 63 64 5b 31 5d 20  )p;.      cd[1] 
128b0 3d 20 28 76 6f 69 64 20 2a 29 70 53 63 72 69 70  = (void *)pScrip
128c0 74 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 44 62  t;.      rc = Db
128d0 45 76 61 6c 4e 65 78 74 43 6d 64 28 63 64 2c 20  EvalNextCmd(cd, 
128e0 69 6e 74 65 72 70 2c 20 54 43 4c 5f 4f 4b 29 3b  interp, TCL_OK);
128f0 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b  .    }.    break
12900 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ;.  }..  /*.  **
12910 20 20 20 20 20 24 64 62 20 66 75 6e 63 74 69 6f       $db functio
12920 6e 20 4e 41 4d 45 20 5b 2d 61 72 67 63 6f 75 6e  n NAME [-argcoun
12930 74 20 4e 5d 20 53 43 52 49 50 54 0a 20 20 2a 2a  t N] SCRIPT.  **
12940 0a 20 20 2a 2a 20 43 72 65 61 74 65 20 61 20 6e  .  ** Create a n
12950 65 77 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20  ew SQL function 
12960 63 61 6c 6c 65 64 20 4e 41 4d 45 2e 20 20 57 68  called NAME.  Wh
12970 65 6e 65 76 65 72 20 74 68 61 74 20 66 75 6e 63  enever that func
12980 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 63 61 6c  tion is.  ** cal
12990 6c 65 64 2c 20 69 6e 76 6f 6b 65 20 53 43 52 49  led, invoke SCRI
129a0 50 54 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74  PT to evaluate t
129b0 68 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a  he function..  *
129c0 2f 0a 20 20 63 61 73 65 20 44 42 5f 46 55 4e 43  /.  case DB_FUNC
129d0 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 53 71 6c 46  TION: {.    SqlF
129e0 75 6e 63 20 2a 70 46 75 6e 63 3b 0a 20 20 20 20  unc *pFunc;.    
129f0 54 63 6c 5f 4f 62 6a 20 2a 70 53 63 72 69 70 74  Tcl_Obj *pScript
12a00 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d  ;.    char *zNam
12a10 65 3b 0a 20 20 20 20 69 6e 74 20 6e 41 72 67 20  e;.    int nArg 
12a20 3d 20 2d 31 3b 0a 20 20 20 20 69 66 28 20 6f 62  = -1;.    if( ob
12a30 6a 63 3d 3d 36 20 29 7b 0a 20 20 20 20 20 20 63  jc==6 ){.      c
12a40 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 54  onst char *z = T
12a50 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
12a60 76 5b 33 5d 29 3b 0a 20 20 20 20 20 20 69 6e 74  v[3]);.      int
12a70 20 6e 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 29   n = strlen30(z)
12a80 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 3e 32 20  ;.      if( n>2 
12a90 26 26 20 73 74 72 6e 63 6d 70 28 7a 2c 20 22 2d  && strncmp(z, "-
12aa0 61 72 67 63 6f 75 6e 74 22 2c 6e 29 3d 3d 30 20  argcount",n)==0 
12ab0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 54  ){.        if( T
12ac0 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
12ad0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d  (interp, objv[4]
12ae0 2c 20 26 6e 41 72 67 29 20 29 20 72 65 74 75 72  , &nArg) ) retur
12af0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
12b00 20 20 20 20 20 69 66 28 20 6e 41 72 67 3c 30 20       if( nArg<0 
12b10 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c  ){.          Tcl
12b20 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
12b30 74 65 72 70 2c 20 22 6e 75 6d 62 65 72 20 6f 66  terp, "number of
12b40 20 61 72 67 75 6d 65 6e 74 73 20 6d 75 73 74 20   arguments must 
12b50 62 65 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 22  be non-negative"
12b60 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
12b70 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
12b80 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 20 20  ar*)0);.        
12b90 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
12ba0 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  OR;.        }.  
12bb0 20 20 20 20 7d 0a 20 20 20 20 20 20 70 53 63 72      }.      pScr
12bc0 69 70 74 20 3d 20 6f 62 6a 76 5b 35 5d 3b 0a 20  ipt = objv[5];. 
12bd0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a     }else if( obj
12be0 63 21 3d 34 20 29 7b 0a 20 20 20 20 20 20 54 63  c!=4 ){.      Tc
12bf0 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
12c00 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
12c10 22 4e 41 4d 45 20 5b 2d 61 72 67 63 6f 75 6e 74  "NAME [-argcount
12c20 20 4e 5d 20 53 43 52 49 50 54 22 29 3b 0a 20 20   N] SCRIPT");.  
12c30 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
12c40 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  RROR;.    }else{
12c50 0a 20 20 20 20 20 20 70 53 63 72 69 70 74 20 3d  .      pScript =
12c60 20 6f 62 6a 76 5b 33 5d 3b 0a 20 20 20 20 7d 0a   objv[3];.    }.
12c70 20 20 20 20 7a 4e 61 6d 65 20 3d 20 54 63 6c 5f      zName = Tcl_
12c80 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
12c90 28 6f 62 6a 76 5b 32 5d 2c 20 30 29 3b 0a 20 20  (objv[2], 0);.  
12ca0 20 20 70 46 75 6e 63 20 3d 20 66 69 6e 64 53 71    pFunc = findSq
12cb0 6c 46 75 6e 63 28 70 44 62 2c 20 7a 4e 61 6d 65  lFunc(pDb, zName
12cc0 29 3b 0a 20 20 20 20 69 66 28 20 70 46 75 6e 63  );.    if( pFunc
12cd0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 54 43 4c  ==0 ) return TCL
12ce0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 69 66 28 20  _ERROR;.    if( 
12cf0 70 46 75 6e 63 2d 3e 70 53 63 72 69 70 74 20 29  pFunc->pScript )
12d00 7b 0a 20 20 20 20 20 20 54 63 6c 5f 44 65 63 72  {.      Tcl_Decr
12d10 52 65 66 43 6f 75 6e 74 28 70 46 75 6e 63 2d 3e  RefCount(pFunc->
12d20 70 53 63 72 69 70 74 29 3b 0a 20 20 20 20 7d 0a  pScript);.    }.
12d30 20 20 20 20 70 46 75 6e 63 2d 3e 70 53 63 72 69      pFunc->pScri
12d40 70 74 20 3d 20 70 53 63 72 69 70 74 3b 0a 20 20  pt = pScript;.  
12d50 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
12d60 6e 74 28 70 53 63 72 69 70 74 29 3b 0a 20 20 20  nt(pScript);.   
12d70 20 70 46 75 6e 63 2d 3e 75 73 65 45 76 61 6c 4f   pFunc->useEvalO
12d80 62 6a 76 20 3d 20 73 61 66 65 54 6f 55 73 65 45  bjv = safeToUseE
12d90 76 61 6c 4f 62 6a 76 28 69 6e 74 65 72 70 2c 20  valObjv(interp, 
12da0 70 53 63 72 69 70 74 29 3b 0a 20 20 20 20 72 63  pScript);.    rc
12db0 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74   = sqlite3_creat
12dc0 65 5f 66 75 6e 63 74 69 6f 6e 28 70 44 62 2d 3e  e_function(pDb->
12dd0 64 62 2c 20 7a 4e 61 6d 65 2c 20 6e 41 72 67 2c  db, zName, nArg,
12de0 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 0a 20 20   SQLITE_UTF8,.  
12df0 20 20 20 20 20 20 70 46 75 6e 63 2c 20 74 63 6c        pFunc, tcl
12e00 53 71 6c 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a  SqlFunc, 0, 0);.
12e10 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
12e20 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
12e30 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  c = TCL_ERROR;. 
12e40 20 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75       Tcl_SetResu
12e50 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72  lt(interp, (char
12e60 20 2a 29 73 71 6c 69 74 65 33 5f 65 72 72 6d 73   *)sqlite3_errms
12e70 67 28 70 44 62 2d 3e 64 62 29 2c 20 54 43 4c 5f  g(pDb->db), TCL_
12e80 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 20 20 7d  VOLATILE);.    }
12e90 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
12ea0 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24  .  /*.  **     $
12eb0 64 62 20 69 6e 63 72 62 6c 6f 62 20 3f 2d 72 65  db incrblob ?-re
12ec0 61 64 6f 6e 6c 79 3f 20 3f 44 42 3f 20 54 41 42  adonly? ?DB? TAB
12ed0 4c 45 20 43 4f 4c 55 4d 4e 20 52 4f 57 49 44 0a  LE COLUMN ROWID.
12ee0 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 49    */.  case DB_I
12ef0 4e 43 52 42 4c 4f 42 3a 20 7b 0a 23 69 66 64 65  NCRBLOB: {.#ifde
12f00 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e  f SQLITE_OMIT_IN
12f10 43 52 42 4c 4f 42 0a 20 20 20 20 54 63 6c 5f 41  CRBLOB.    Tcl_A
12f20 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
12f30 72 70 2c 20 22 69 6e 63 72 62 6c 6f 62 20 6e 6f  rp, "incrblob no
12f40 74 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 74  t available in t
12f50 68 69 73 20 62 75 69 6c 64 22 2c 20 30 29 3b 0a  his build", 0);.
12f60 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
12f70 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 20 20 20 20  RROR;.#else.    
12f80 69 6e 74 20 69 73 52 65 61 64 6f 6e 6c 79 20 3d  int isReadonly =
12f90 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   0;.    const ch
12fa0 61 72 20 2a 7a 44 62 20 3d 20 22 6d 61 69 6e 22  ar *zDb = "main"
12fb0 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
12fc0 20 2a 7a 54 61 62 6c 65 3b 0a 20 20 20 20 63 6f   *zTable;.    co
12fd0 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 75 6d  nst char *zColum
12fe0 6e 3b 0a 20 20 20 20 54 63 6c 5f 57 69 64 65 49  n;.    Tcl_WideI
12ff0 6e 74 20 69 52 6f 77 3b 0a 0a 20 20 20 20 2f 2a  nt iRow;..    /*
13000 20 43 68 65 63 6b 20 66 6f 72 20 74 68 65 20 2d   Check for the -
13010 72 65 61 64 6f 6e 6c 79 20 6f 70 74 69 6f 6e 20  readonly option 
13020 2a 2f 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3e  */.    if( objc>
13030 33 20 26 26 20 73 74 72 63 6d 70 28 54 63 6c 5f  3 && strcmp(Tcl_
13040 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32  GetString(objv[2
13050 5d 29 2c 20 22 2d 72 65 61 64 6f 6e 6c 79 22 29  ]), "-readonly")
13060 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 73 52  ==0 ){.      isR
13070 65 61 64 6f 6e 6c 79 20 3d 20 31 3b 0a 20 20 20  eadonly = 1;.   
13080 20 7d 0a 0a 20 20 20 20 69 66 28 20 6f 62 6a 63   }..    if( objc
13090 21 3d 28 35 2b 69 73 52 65 61 64 6f 6e 6c 79 29  !=(5+isReadonly)
130a0 20 26 26 20 6f 62 6a 63 21 3d 28 36 2b 69 73 52   && objc!=(6+isR
130b0 65 61 64 6f 6e 6c 79 29 20 29 7b 0a 20 20 20 20  eadonly) ){.    
130c0 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
130d0 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62  gs(interp, 2, ob
130e0 6a 76 2c 20 22 3f 2d 72 65 61 64 6f 6e 6c 79 3f  jv, "?-readonly?
130f0 20 3f 44 42 3f 20 54 41 42 4c 45 20 43 4f 4c 55   ?DB? TABLE COLU
13100 4d 4e 20 52 4f 57 49 44 22 29 3b 0a 20 20 20 20  MN ROWID");.    
13110 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
13120 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  OR;.    }..    i
13130 66 28 20 6f 62 6a 63 3d 3d 28 36 2b 69 73 52 65  f( objc==(6+isRe
13140 61 64 6f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20  adonly) ){.     
13150 20 7a 44 62 20 3d 20 54 63 6c 5f 47 65 74 53 74   zDb = Tcl_GetSt
13160 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20  ring(objv[2]);. 
13170 20 20 20 7d 0a 20 20 20 20 7a 54 61 62 6c 65 20     }.    zTable 
13180 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  = Tcl_GetString(
13190 6f 62 6a 76 5b 6f 62 6a 63 2d 33 5d 29 3b 0a 20  objv[objc-3]);. 
131a0 20 20 20 7a 43 6f 6c 75 6d 6e 20 3d 20 54 63 6c     zColumn = Tcl
131b0 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
131c0 6f 62 6a 63 2d 32 5d 29 3b 0a 20 20 20 20 72 63  objc-2]);.    rc
131d0 20 3d 20 54 63 6c 5f 47 65 74 57 69 64 65 49 6e   = Tcl_GetWideIn
131e0 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
131f0 20 6f 62 6a 76 5b 6f 62 6a 63 2d 31 5d 2c 20 26   objv[objc-1], &
13200 69 52 6f 77 29 3b 0a 0a 20 20 20 20 69 66 28 20  iRow);..    if( 
13210 72 63 3d 3d 54 43 4c 5f 4f 4b 20 29 7b 0a 20 20  rc==TCL_OK ){.  
13220 20 20 20 20 72 63 20 3d 20 63 72 65 61 74 65 49      rc = createI
13230 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 28 0a  ncrblobChannel(.
13240 20 20 20 20 20 20 20 20 20 20 69 6e 74 65 72 70            interp
13250 2c 20 70 44 62 2c 20 7a 44 62 2c 20 7a 54 61 62  , pDb, zDb, zTab
13260 6c 65 2c 20 7a 43 6f 6c 75 6d 6e 2c 20 69 52 6f  le, zColumn, iRo
13270 77 2c 20 69 73 52 65 61 64 6f 6e 6c 79 0a 20 20  w, isReadonly.  
13280 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 23 65 6e      );.    }.#en
13290 64 69 66 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20  dif.    break;. 
132a0 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20   }..  /*.  **   
132b0 20 20 24 64 62 20 69 6e 74 65 72 72 75 70 74 0a    $db interrupt.
132c0 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 74 65 72 72    **.  ** Interr
132d0 75 70 74 20 74 68 65 20 65 78 65 63 75 74 69 6f  upt the executio
132e0 6e 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 2d 6d  n of the inner-m
132f0 6f 73 74 20 53 51 4c 20 69 6e 74 65 72 70 72 65  ost SQL interpre
13300 74 65 72 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20  ter.  This.  ** 
13310 63 61 75 73 65 73 20 74 68 65 20 53 51 4c 20 73  causes the SQL s
13320 74 61 74 65 6d 65 6e 74 20 74 6f 20 72 65 74 75  tatement to retu
13330 72 6e 20 61 6e 20 65 72 72 6f 72 20 6f 66 20 53  rn an error of S
13340 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 2e  QLITE_INTERRUPT.
13350 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f  .  */.  case DB_
13360 49 4e 54 45 52 52 55 50 54 3a 20 7b 0a 20 20 20  INTERRUPT: {.   
13370 20 73 71 6c 69 74 65 33 5f 69 6e 74 65 72 72 75   sqlite3_interru
13380 70 74 28 70 44 62 2d 3e 64 62 29 3b 0a 20 20 20  pt(pDb->db);.   
13390 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
133a0 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20 6e  *.  **     $db n
133b0 75 6c 6c 76 61 6c 75 65 20 3f 53 54 52 49 4e 47  ullvalue ?STRING
133c0 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 68 61 6e  ?.  **.  ** Chan
133d0 67 65 20 74 65 78 74 20 75 73 65 64 20 77 68 65  ge text used whe
133e0 6e 20 61 20 4e 55 4c 4c 20 63 6f 6d 65 73 20 62  n a NULL comes b
133f0 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ack from the dat
13400 61 62 61 73 65 2e 20 49 66 20 3f 53 54 52 49 4e  abase. If ?STRIN
13410 47 3f 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 70  G?.  ** is not p
13420 72 65 73 65 6e 74 2c 20 74 68 65 6e 20 74 68 65  resent, then the
13430 20 63 75 72 72 65 6e 74 20 73 74 72 69 6e 67 20   current string 
13440 75 73 65 64 20 66 6f 72 20 4e 55 4c 4c 20 69 73  used for NULL is
13450 20 72 65 74 75 72 6e 65 64 2e 0a 20 20 2a 2a 20   returned..  ** 
13460 49 66 20 53 54 52 49 4e 47 20 69 73 20 70 72 65  If STRING is pre
13470 73 65 6e 74 2c 20 74 68 65 6e 20 53 54 52 49 4e  sent, then STRIN
13480 47 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 20  G is returned.. 
13490 20 2a 2a 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20   **.  */.  case 
134a0 44 42 5f 4e 55 4c 4c 56 41 4c 55 45 3a 20 7b 0a  DB_NULLVALUE: {.
134b0 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20      if( objc!=2 
134c0 26 26 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20  && objc!=3 ){.  
134d0 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
134e0 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20  Args(interp, 2, 
134f0 6f 62 6a 76 2c 20 22 4e 55 4c 4c 56 41 4c 55 45  objv, "NULLVALUE
13500 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
13510 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
13520 7d 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d  }.    if( objc==
13530 33 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6c  3 ){.      int l
13540 65 6e 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  en;.      char *
13550 7a 4e 75 6c 6c 20 3d 20 54 63 6c 5f 47 65 74 53  zNull = Tcl_GetS
13560 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
13570 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20 20  v[2], &len);.   
13580 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 4e 75 6c     if( pDb->zNul
13590 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c  l ){.        Tcl
135a0 5f 46 72 65 65 28 70 44 62 2d 3e 7a 4e 75 6c 6c  _Free(pDb->zNull
135b0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
135c0 20 69 66 28 20 7a 4e 75 6c 6c 20 26 26 20 6c 65   if( zNull && le
135d0 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  n>0 ){.        p
135e0 44 62 2d 3e 7a 4e 75 6c 6c 20 3d 20 54 63 6c 5f  Db->zNull = Tcl_
135f0 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20 31 20 29  Alloc( len + 1 )
13600 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  ;.        memcpy
13610 28 70 44 62 2d 3e 7a 4e 75 6c 6c 2c 20 7a 4e 75  (pDb->zNull, zNu
13620 6c 6c 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 20 20  ll, len);.      
13630 20 20 70 44 62 2d 3e 7a 4e 75 6c 6c 5b 6c 65 6e    pDb->zNull[len
13640 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20 20  ] = '\0';.      
13650 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
13660 44 62 2d 3e 7a 4e 75 6c 6c 20 3d 20 30 3b 0a 20  Db->zNull = 0;. 
13670 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
13680 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
13690 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
136a0 77 53 74 72 69 6e 67 4f 62 6a 28 70 44 62 2d 3e  wStringObj(pDb->
136b0 7a 4e 75 6c 6c 2c 20 2d 31 29 29 3b 0a 20 20 20  zNull, -1));.   
136c0 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
136d0 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20 6c  *.  **     $db l
136e0 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64  ast_insert_rowid
136f0 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75   .  **.  ** Retu
13700 72 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 77 68  rn an integer wh
13710 69 63 68 20 69 73 20 74 68 65 20 52 4f 57 49 44  ich is the ROWID
13720 20 66 6f 72 20 74 68 65 20 6d 6f 73 74 20 72 65   for the most re
13730 63 65 6e 74 20 69 6e 73 65 72 74 2e 0a 20 20 2a  cent insert..  *
13740 2f 0a 20 20 63 61 73 65 20 44 42 5f 4c 41 53 54  /.  case DB_LAST
13750 5f 49 4e 53 45 52 54 5f 52 4f 57 49 44 3a 20 7b  _INSERT_ROWID: {
13760 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52  .    Tcl_Obj *pR
13770 65 73 75 6c 74 3b 0a 20 20 20 20 54 63 6c 5f 57  esult;.    Tcl_W
13780 69 64 65 49 6e 74 20 72 6f 77 69 64 3b 0a 20 20  ideInt rowid;.  
13790 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b    if( objc!=2 ){
137a0 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  .      Tcl_Wrong
137b0 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
137c0 32 2c 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 20 20  2, objv, "");.  
137d0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
137e0 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
137f0 72 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33 5f  rowid = sqlite3_
13800 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69  last_insert_rowi
13810 64 28 70 44 62 2d 3e 64 62 29 3b 0a 20 20 20 20  d(pDb->db);.    
13820 70 52 65 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65  pResult = Tcl_Ge
13830 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
13840 70 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 57  p);.    Tcl_SetW
13850 69 64 65 49 6e 74 4f 62 6a 28 70 52 65 73 75 6c  ideIntObj(pResul
13860 74 2c 20 72 6f 77 69 64 29 3b 0a 20 20 20 20 62  t, rowid);.    b
13870 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a  reak;.  }..  /*.
13880 20 20 2a 2a 20 54 68 65 20 44 42 5f 4f 4e 45 43    ** The DB_ONEC
13890 4f 4c 55 4d 4e 20 6d 65 74 68 6f 64 20 69 73 20  OLUMN method is 
138a0 69 6d 70 6c 65 6d 65 6e 74 65 64 20 74 6f 67 65  implemented toge
138b0 74 68 65 72 20 77 69 74 68 20 44 42 5f 45 58 49  ther with DB_EXI
138c0 53 54 53 2e 0a 20 20 2a 2f 0a 0a 20 20 2f 2a 20  STS..  */..  /* 
138d0 20 20 20 24 64 62 20 70 72 6f 67 72 65 73 73 20     $db progress 
138e0 3f 4e 20 43 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a  ?N CALLBACK?.  *
138f0 2a 20 0a 20 20 2a 2a 20 49 6e 76 6f 6b 65 20 74  * .  ** Invoke t
13900 68 65 20 67 69 76 65 6e 20 63 61 6c 6c 62 61 63  he given callbac
13910 6b 20 65 76 65 72 79 20 4e 20 76 69 72 74 75 61  k every N virtua
13920 6c 20 6d 61 63 68 69 6e 65 20 6f 70 63 6f 64 65  l machine opcode
13930 73 20 77 68 69 6c 65 20 65 78 65 63 75 74 69 6e  s while executin
13940 67 0a 20 20 2a 2a 20 71 75 65 72 69 65 73 2e 0a  g.  ** queries..
13950 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 50    */.  case DB_P
13960 52 4f 47 52 45 53 53 3a 20 7b 0a 20 20 20 20 69  ROGRESS: {.    i
13970 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20  f( objc==2 ){.  
13980 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 50 72      if( pDb->zPr
13990 6f 67 72 65 73 73 20 29 7b 0a 20 20 20 20 20 20  ogress ){.      
139a0 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
139b0 6c 74 28 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e  lt(interp, pDb->
139c0 7a 50 72 6f 67 72 65 73 73 2c 20 30 29 3b 0a 20  zProgress, 0);. 
139d0 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
139e0 20 69 66 28 20 6f 62 6a 63 3d 3d 34 20 29 7b 0a   if( objc==4 ){.
139f0 20 20 20 20 20 20 63 68 61 72 20 2a 7a 50 72 6f        char *zPro
13a00 67 72 65 73 73 3b 0a 20 20 20 20 20 20 69 6e 74  gress;.      int
13a10 20 6c 65 6e 3b 0a 20 20 20 20 20 20 69 6e 74 20   len;.      int 
13a20 4e 3b 0a 20 20 20 20 20 20 69 66 28 20 54 43 4c  N;.      if( TCL
13a30 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 49 6e 74 46  _OK!=Tcl_GetIntF
13a40 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
13a50 62 6a 76 5b 32 5d 2c 20 26 4e 29 20 29 7b 0a 20  bjv[2], &N) ){. 
13a60 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43         return TC
13a70 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d  L_ERROR;.      }
13a80 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d  ;.      if( pDb-
13a90 3e 7a 50 72 6f 67 72 65 73 73 20 29 7b 0a 20 20  >zProgress ){.  
13aa0 20 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70        Tcl_Free(p
13ab0 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 29 3b 0a  Db->zProgress);.
13ac0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 50        }.      zP
13ad0 72 6f 67 72 65 73 73 20 3d 20 54 63 6c 5f 47 65  rogress = Tcl_Ge
13ae0 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
13af0 62 6a 76 5b 33 5d 2c 20 26 6c 65 6e 29 3b 0a 20  bjv[3], &len);. 
13b00 20 20 20 20 20 69 66 28 20 7a 50 72 6f 67 72 65       if( zProgre
13b10 73 73 20 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20  ss && len>0 ){. 
13b20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 50 72 6f         pDb->zPro
13b30 67 72 65 73 73 20 3d 20 54 63 6c 5f 41 6c 6c 6f  gress = Tcl_Allo
13b40 63 28 20 6c 65 6e 20 2b 20 31 20 29 3b 0a 20 20  c( len + 1 );.  
13b50 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 44 62        memcpy(pDb
13b60 2d 3e 7a 50 72 6f 67 72 65 73 73 2c 20 7a 50 72  ->zProgress, zPr
13b70 6f 67 72 65 73 73 2c 20 6c 65 6e 2b 31 29 3b 0a  ogress, len+1);.
13b80 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
13b90 20 20 20 20 20 70 44 62 2d 3e 7a 50 72 6f 67 72       pDb->zProgr
13ba0 65 73 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ess = 0;.      }
13bb0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
13bc0 4f 4d 49 54 5f 50 52 4f 47 52 45 53 53 5f 43 41  OMIT_PROGRESS_CA
13bd0 4c 4c 42 41 43 4b 0a 20 20 20 20 20 20 69 66 28  LLBACK.      if(
13be0 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 20   pDb->zProgress 
13bf0 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e  ){.        pDb->
13c00 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b  interp = interp;
13c10 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
13c20 5f 70 72 6f 67 72 65 73 73 5f 68 61 6e 64 6c 65  _progress_handle
13c30 72 28 70 44 62 2d 3e 64 62 2c 20 4e 2c 20 44 62  r(pDb->db, N, Db
13c40 50 72 6f 67 72 65 73 73 48 61 6e 64 6c 65 72 2c  ProgressHandler,
13c50 20 70 44 62 29 3b 0a 20 20 20 20 20 20 7d 65 6c   pDb);.      }el
13c60 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
13c70 74 65 33 5f 70 72 6f 67 72 65 73 73 5f 68 61 6e  te3_progress_han
13c80 64 6c 65 72 28 70 44 62 2d 3e 64 62 2c 20 30 2c  dler(pDb->db, 0,
13c90 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a   0, 0);.      }.
13ca0 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65  #endif.    }else
13cb0 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e  {.      Tcl_Wron
13cc0 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
13cd0 20 32 2c 20 6f 62 6a 76 2c 20 22 4e 20 43 41 4c   2, objv, "N CAL
13ce0 4c 42 41 43 4b 22 29 3b 0a 20 20 20 20 20 20 72  LBACK");.      r
13cf0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
13d00 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b  .    }.    break
13d10 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24  ;.  }..  /*    $
13d20 64 62 20 70 72 6f 66 69 6c 65 20 3f 43 41 4c 4c  db profile ?CALL
13d30 42 41 43 4b 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20  BACK?.  **.  ** 
13d40 4d 61 6b 65 20 61 72 72 61 6e 67 65 6d 65 6e 74  Make arrangement
13d50 73 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20  s to invoke the 
13d60 43 41 4c 4c 42 41 43 4b 20 72 6f 75 74 69 6e 65  CALLBACK routine
13d70 20 61 66 74 65 72 20 65 61 63 68 20 53 51 4c 20   after each SQL 
13d80 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74  statement.  ** t
13d90 68 61 74 20 68 61 73 20 72 75 6e 2e 20 20 54 68  hat has run.  Th
13da0 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 53 51  e text of the SQ
13db0 4c 20 61 6e 64 20 74 68 65 20 61 6d 6f 75 6e 74  L and the amount
13dc0 20 6f 66 20 65 6c 61 70 73 65 20 74 69 6d 65 20   of elapse time 
13dd0 61 72 65 0a 20 20 2a 2a 20 61 70 70 65 6e 64 65  are.  ** appende
13de0 64 20 74 6f 20 43 41 4c 4c 42 41 43 4b 20 62 65  d to CALLBACK be
13df0 66 6f 72 65 20 74 68 65 20 73 63 72 69 70 74 20  fore the script 
13e00 69 73 20 72 75 6e 2e 0a 20 20 2a 2f 0a 20 20 63  is run..  */.  c
13e10 61 73 65 20 44 42 5f 50 52 4f 46 49 4c 45 3a 20  ase DB_PROFILE: 
13e20 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 33  {.    if( objc>3
13e30 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72   ){.      Tcl_Wr
13e40 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
13e50 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 43 41  p, 2, objv, "?CA
13e60 4c 4c 42 41 43 4b 3f 22 29 3b 0a 20 20 20 20 20  LLBACK?");.     
13e70 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
13e80 52 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  R;.    }else if(
13e90 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20   objc==2 ){.    
13ea0 20 20 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f 66    if( pDb->zProf
13eb0 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 54  ile ){.        T
13ec0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
13ed0 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a 50 72  interp, pDb->zPr
13ee0 6f 66 69 6c 65 2c 20 30 29 3b 0a 20 20 20 20 20  ofile, 0);.     
13ef0 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
13f00 20 20 20 20 63 68 61 72 20 2a 7a 50 72 6f 66 69      char *zProfi
13f10 6c 65 3b 0a 20 20 20 20 20 20 69 6e 74 20 6c 65  le;.      int le
13f20 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62  n;.      if( pDb
13f30 2d 3e 7a 50 72 6f 66 69 6c 65 20 29 7b 0a 20 20  ->zProfile ){.  
13f40 20 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70        Tcl_Free(p
13f50 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 29 3b 0a 20  Db->zProfile);. 
13f60 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 50 72       }.      zPr
13f70 6f 66 69 6c 65 20 3d 20 54 63 6c 5f 47 65 74 53  ofile = Tcl_GetS
13f80 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
13f90 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20 20  v[2], &len);.   
13fa0 20 20 20 69 66 28 20 7a 50 72 6f 66 69 6c 65 20     if( zProfile 
13fb0 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20  && len>0 ){.    
13fc0 20 20 20 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c      pDb->zProfil
13fd0 65 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c  e = Tcl_Alloc( l
13fe0 65 6e 20 2b 20 31 20 29 3b 0a 20 20 20 20 20 20  en + 1 );.      
13ff0 20 20 6d 65 6d 63 70 79 28 70 44 62 2d 3e 7a 50    memcpy(pDb->zP
14000 72 6f 66 69 6c 65 2c 20 7a 50 72 6f 66 69 6c 65  rofile, zProfile
14010 2c 20 6c 65 6e 2b 31 29 3b 0a 20 20 20 20 20 20  , len+1);.      
14020 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
14030 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 20 3d 20 30  Db->zProfile = 0
14040 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 20 21 64  ;.      }.#if !d
14050 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
14060 49 54 5f 54 52 41 43 45 29 20 26 26 20 21 64 65  IT_TRACE) && !de
14070 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
14080 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54  T_FLOATING_POINT
14090 29 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d  ).      if( pDb-
140a0 3e 7a 50 72 6f 66 69 6c 65 20 29 7b 0a 20 20 20  >zProfile ){.   
140b0 20 20 20 20 20 70 44 62 2d 3e 69 6e 74 65 72 70       pDb->interp
140c0 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 20   = interp;.     
140d0 20 20 20 73 71 6c 69 74 65 33 5f 70 72 6f 66 69     sqlite3_profi
140e0 6c 65 28 70 44 62 2d 3e 64 62 2c 20 44 62 50 72  le(pDb->db, DbPr
140f0 6f 66 69 6c 65 48 61 6e 64 6c 65 72 2c 20 70 44  ofileHandler, pD
14100 62 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  b);.      }else{
14110 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
14120 5f 70 72 6f 66 69 6c 65 28 70 44 62 2d 3e 64 62  _profile(pDb->db
14130 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  , 0, 0);.      }
14140 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20  .#endif.    }.  
14150 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
14160 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20  /*.  **     $db 
14170 72 65 6b 65 79 20 4b 45 59 0a 20 20 2a 2a 0a 20  rekey KEY.  **. 
14180 20 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 65   ** Change the e
14190 6e 63 72 79 70 74 69 6f 6e 20 6b 65 79 20 6f 6e  ncryption key on
141a0 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79 20 6f   the currently o
141b0 70 65 6e 20 64 61 74 61 62 61 73 65 2e 0a 20 20  pen database..  
141c0 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 52 45 4b  */.  case DB_REK
141d0 45 59 3a 20 7b 0a 23 69 66 64 65 66 20 53 51 4c  EY: {.#ifdef SQL
141e0 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20  ITE_HAS_CODEC.  
141f0 20 20 69 6e 74 20 6e 4b 65 79 3b 0a 20 20 20 20    int nKey;.    
14200 76 6f 69 64 20 2a 70 4b 65 79 3b 0a 23 65 6e 64  void *pKey;.#end
14210 69 66 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21  if.    if( objc!
14220 3d 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  =3 ){.      Tcl_
14230 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
14240 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 4b  erp, 2, objv, "K
14250 45 59 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  EY");.      retu
14260 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
14270 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
14280 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 20 20  E_HAS_CODEC.    
14290 70 4b 65 79 20 3d 20 54 63 6c 5f 47 65 74 42 79  pKey = Tcl_GetBy
142a0 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6f  teArrayFromObj(o
142b0 62 6a 76 5b 32 5d 2c 20 26 6e 4b 65 79 29 3b 0a  bjv[2], &nKey);.
142c0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
142d0 5f 72 65 6b 65 79 28 70 44 62 2d 3e 64 62 2c 20  _rekey(pDb->db, 
142e0 70 4b 65 79 2c 20 6e 4b 65 79 29 3b 0a 20 20 20  pKey, nKey);.   
142f0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
14300 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
14310 74 28 69 6e 74 65 72 70 2c 20 73 71 6c 69 74 65  t(interp, sqlite
14320 33 5f 65 72 72 73 74 72 28 72 63 29 2c 20 30 29  3_errstr(rc), 0)
14330 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c  ;.      rc = TCL
14340 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 23 65  _ERROR;.    }.#e
14350 6e 64 69 66 0a 20 20 20 20 62 72 65 61 6b 3b 0a  ndif.    break;.
14360 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62    }..  /*    $db
14370 20 72 65 73 74 6f 72 65 20 3f 44 41 54 41 42 41   restore ?DATABA
14380 53 45 3f 20 46 49 4c 45 4e 41 4d 45 0a 20 20 2a  SE? FILENAME.  *
14390 2a 0a 20 20 2a 2a 20 4f 70 65 6e 20 61 20 64 61  *.  ** Open a da
143a0 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65  tabase file name
143b0 64 20 46 49 4c 45 4e 41 4d 45 2e 20 20 54 72 61  d FILENAME.  Tra
143c0 6e 73 66 65 72 20 74 68 65 20 63 6f 6e 74 65 6e  nsfer the conten
143d0 74 20 0a 20 20 2a 2a 20 6f 66 20 46 49 4c 45 4e  t .  ** of FILEN
143e0 41 4d 45 20 69 6e 74 6f 20 74 68 65 20 6c 6f 63  AME into the loc
143f0 61 6c 20 64 61 74 61 62 61 73 65 20 44 41 54 41  al database DATA
14400 42 41 53 45 20 28 64 65 66 61 75 6c 74 3a 20 22  BASE (default: "
14410 6d 61 69 6e 22 29 2e 0a 20 20 2a 2f 0a 20 20 63  main")..  */.  c
14420 61 73 65 20 44 42 5f 52 45 53 54 4f 52 45 3a 20  ase DB_RESTORE: 
14430 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
14440 20 2a 7a 53 72 63 46 69 6c 65 3b 0a 20 20 20 20   *zSrcFile;.    
14450 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 65 73  const char *zDes
14460 74 44 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  tDb;.    sqlite3
14470 20 2a 70 53 72 63 3b 0a 20 20 20 20 73 71 6c 69   *pSrc;.    sqli
14480 74 65 33 5f 62 61 63 6b 75 70 20 2a 70 42 61 63  te3_backup *pBac
14490 6b 75 70 3b 0a 20 20 20 20 69 6e 74 20 6e 54 69  kup;.    int nTi
144a0 6d 65 6f 75 74 20 3d 20 30 3b 0a 0a 20 20 20 20  meout = 0;..    
144b0 69 66 28 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20  if( objc==3 ){. 
144c0 20 20 20 20 20 7a 44 65 73 74 44 62 20 3d 20 22       zDestDb = "
144d0 6d 61 69 6e 22 3b 0a 20 20 20 20 20 20 7a 53 72  main";.      zSr
144e0 63 46 69 6c 65 20 3d 20 54 63 6c 5f 47 65 74 53  cFile = Tcl_GetS
144f0 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a  tring(objv[2]);.
14500 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 62      }else if( ob
14510 6a 63 3d 3d 34 20 29 7b 0a 20 20 20 20 20 20 7a  jc==4 ){.      z
14520 44 65 73 74 44 62 20 3d 20 54 63 6c 5f 47 65 74  DestDb = Tcl_Get
14530 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b  String(objv[2]);
14540 0a 20 20 20 20 20 20 7a 53 72 63 46 69 6c 65 20  .      zSrcFile 
14550 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  = Tcl_GetString(
14560 6f 62 6a 76 5b 33 5d 29 3b 0a 20 20 20 20 7d 65  objv[3]);.    }e
14570 6c 73 65 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57  lse{.      Tcl_W
14580 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
14590 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 44  rp, 2, objv, "?D
145a0 41 54 41 42 41 53 45 3f 20 46 49 4c 45 4e 41 4d  ATABASE? FILENAM
145b0 45 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  E");.      retur
145c0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
145d0 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69   }.    rc = sqli
145e0 74 65 33 5f 6f 70 65 6e 5f 76 32 28 7a 53 72 63  te3_open_v2(zSrc
145f0 46 69 6c 65 2c 20 26 70 53 72 63 2c 20 53 51 4c  File, &pSrc, SQL
14600 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
14610 59 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  Y, 0);.    if( r
14620 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
14630 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
14640 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
14650 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 73 6f 75 72  cannot open sour
14660 63 65 20 64 61 74 61 62 61 73 65 3a 20 22 2c 0a  ce database: ",.
14670 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
14680 65 33 5f 65 72 72 6d 73 67 28 70 53 72 63 29 2c  e3_errmsg(pSrc),
14690 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20   (char*)0);.    
146a0 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28    sqlite3_close(
146b0 70 53 72 63 29 3b 0a 20 20 20 20 20 20 72 65 74  pSrc);.      ret
146c0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
146d0 20 20 20 7d 0a 20 20 20 20 70 42 61 63 6b 75 70     }.    pBackup
146e0 20 3d 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75   = sqlite3_backu
146f0 70 5f 69 6e 69 74 28 70 44 62 2d 3e 64 62 2c 20  p_init(pDb->db, 
14700 7a 44 65 73 74 44 62 2c 20 70 53 72 63 2c 20 22  zDestDb, pSrc, "
14710 6d 61 69 6e 22 29 3b 0a 20 20 20 20 69 66 28 20  main");.    if( 
14720 70 42 61 63 6b 75 70 3d 3d 30 20 29 7b 0a 20 20  pBackup==0 ){.  
14730 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
14740 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 72 65  sult(interp, "re
14750 73 74 6f 72 65 20 66 61 69 6c 65 64 3a 20 22 2c  store failed: ",
14760 0a 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  .           sqli
14770 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e  te3_errmsg(pDb->
14780 64 62 29 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  db), (char*)0);.
14790 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c        sqlite3_cl
147a0 6f 73 65 28 70 53 72 63 29 3b 0a 20 20 20 20 20  ose(pSrc);.     
147b0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
147c0 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69  R;.    }.    whi
147d0 6c 65 28 20 28 72 63 20 3d 20 73 71 6c 69 74 65  le( (rc = sqlite
147e0 33 5f 62 61 63 6b 75 70 5f 73 74 65 70 28 70 42  3_backup_step(pB
147f0 61 63 6b 75 70 2c 31 30 30 29 29 3d 3d 53 51 4c  ackup,100))==SQL
14800 49 54 45 5f 4f 4b 0a 20 20 20 20 20 20 20 20 20  ITE_OK.         
14810 20 20 20 20 20 7c 7c 20 72 63 3d 3d 53 51 4c 49       || rc==SQLI
14820 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20  TE_BUSY ){.     
14830 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
14840 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20 20 20  BUSY ){.        
14850 69 66 28 20 6e 54 69 6d 65 6f 75 74 2b 2b 20 3e  if( nTimeout++ >
14860 3d 20 33 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  = 3 ) break;.   
14870 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6c 65       sqlite3_sle
14880 65 70 28 31 30 30 29 3b 0a 20 20 20 20 20 20 7d  ep(100);.      }
14890 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
148a0 65 33 5f 62 61 63 6b 75 70 5f 66 69 6e 69 73 68  e3_backup_finish
148b0 28 70 42 61 63 6b 75 70 29 3b 0a 20 20 20 20 69  (pBackup);.    i
148c0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f  f( rc==SQLITE_DO
148d0 4e 45 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  NE ){.      rc =
148e0 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c   TCL_OK;.    }el
148f0 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  se if( rc==SQLIT
14900 45 5f 42 55 53 59 20 7c 7c 20 72 63 3d 3d 53 51  E_BUSY || rc==SQ
14910 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 29 7b 0a 20  LITE_LOCKED ){. 
14920 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
14930 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 72  esult(interp, "r
14940 65 73 74 6f 72 65 20 66 61 69 6c 65 64 3a 20 73  estore failed: s
14950 6f 75 72 63 65 20 64 61 74 61 62 61 73 65 20 62  ource database b
14960 75 73 79 22 2c 0a 20 20 20 20 20 20 20 20 20 20  usy",.          
14970 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
14980 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 72 63  ar*)0);.      rc
14990 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20   = TCL_ERROR;.  
149a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 54    }else{.      T
149b0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
149c0 69 6e 74 65 72 70 2c 20 22 72 65 73 74 6f 72 65  interp, "restore
149d0 20 66 61 69 6c 65 64 3a 20 22 2c 0a 20 20 20 20   failed: ",.    
149e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65         sqlite3_e
149f0 72 72 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c 20  rrmsg(pDb->db), 
14a00 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20  (char*)0);.     
14a10 20 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b   rc = TCL_ERROR;
14a20 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
14a30 65 33 5f 63 6c 6f 73 65 28 70 53 72 63 29 3b 0a  e3_close(pSrc);.
14a40 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
14a50 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64    /*.  **     $d
14a60 62 20 73 74 61 74 75 73 20 28 73 74 65 70 7c 73  b status (step|s
14a70 6f 72 74 7c 61 75 74 6f 69 6e 64 65 78 29 0a 20  ort|autoindex). 
14a80 20 2a 2a 0a 20 20 2a 2a 20 44 69 73 70 6c 61 79   **.  ** Display
14a90 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54   SQLITE_STMTSTAT
14aa0 55 53 5f 46 55 4c 4c 53 43 41 4e 5f 53 54 45 50  US_FULLSCAN_STEP
14ab0 20 6f 72 20 0a 20 20 2a 2a 20 53 51 4c 49 54 45   or .  ** SQLITE
14ac0 5f 53 54 4d 54 53 54 41 54 55 53 5f 53 4f 52 54  _STMTSTATUS_SORT
14ad0 20 66 6f 72 20 74 68 65 20 6d 6f 73 74 20 72 65   for the most re
14ae0 63 65 6e 74 20 65 76 61 6c 2e 0a 20 20 2a 2f 0a  cent eval..  */.
14af0 20 20 63 61 73 65 20 44 42 5f 53 54 41 54 55 53    case DB_STATUS
14b00 3a 20 7b 0a 20 20 20 20 69 6e 74 20 76 3b 0a 20  : {.    int v;. 
14b10 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
14b20 4f 70 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63  Op;.    if( objc
14b30 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  !=3 ){.      Tcl
14b40 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
14b50 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22  terp, 2, objv, "
14b60 28 73 74 65 70 7c 73 6f 72 74 7c 61 75 74 6f 69  (step|sort|autoi
14b70 6e 64 65 78 29 22 29 3b 0a 20 20 20 20 20 20 72  ndex)");.      r
14b80 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
14b90 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4f 70 20 3d  .    }.    zOp =
14ba0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
14bb0 62 6a 76 5b 32 5d 29 3b 0a 20 20 20 20 69 66 28  bjv[2]);.    if(
14bc0 20 73 74 72 63 6d 70 28 7a 4f 70 2c 20 22 73 74   strcmp(zOp, "st
14bd0 65 70 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ep")==0 ){.     
14be0 20 76 20 3d 20 70 44 62 2d 3e 6e 53 74 65 70 3b   v = pDb->nStep;
14bf0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73  .    }else if( s
14c00 74 72 63 6d 70 28 7a 4f 70 2c 20 22 73 6f 72 74  trcmp(zOp, "sort
14c10 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 76  ")==0 ){.      v
14c20 20 3d 20 70 44 62 2d 3e 6e 53 6f 72 74 3b 0a 20   = pDb->nSort;. 
14c30 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
14c40 63 6d 70 28 7a 4f 70 2c 20 22 61 75 74 6f 69 6e  cmp(zOp, "autoin
14c50 64 65 78 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  dex")==0 ){.    
14c60 20 20 76 20 3d 20 70 44 62 2d 3e 6e 49 6e 64 65    v = pDb->nInde
14c70 78 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  x;.    }else{.  
14c80 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
14c90 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 0a 20 20  sult(interp, .  
14ca0 20 20 20 20 20 20 20 20 20 20 22 62 61 64 20 61            "bad a
14cb0 72 67 75 6d 65 6e 74 3a 20 73 68 6f 75 6c 64 20  rgument: should 
14cc0 62 65 20 61 75 74 6f 69 6e 64 65 78 2c 20 73 74  be autoindex, st
14cd0 65 70 2c 20 6f 72 20 73 6f 72 74 22 2c 20 0a 20  ep, or sort", . 
14ce0 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
14cf0 2a 29 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75  *)0);.      retu
14d00 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
14d10 20 20 7d 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f    }.    Tcl_SetO
14d20 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
14d30 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 76   Tcl_NewIntObj(v
14d40 29 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20  ));.    break;. 
14d50 20 7d 0a 20 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20   }.  .  /*.  ** 
14d60 20 20 20 20 24 64 62 20 74 69 6d 65 6f 75 74 20      $db timeout 
14d70 4d 49 4c 4c 45 53 45 43 4f 4e 44 53 0a 20 20 2a  MILLESECONDS.  *
14d80 2a 0a 20 20 2a 2a 20 44 65 6c 61 79 20 66 6f 72  *.  ** Delay for
14d90 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d   the number of m
14da0 69 6c 6c 69 73 65 63 6f 6e 64 73 20 73 70 65 63  illiseconds spec
14db0 69 66 69 65 64 20 77 68 65 6e 20 61 20 66 69 6c  ified when a fil
14dc0 65 20 69 73 20 6c 6f 63 6b 65 64 2e 0a 20 20 2a  e is locked..  *
14dd0 2f 0a 20 20 63 61 73 65 20 44 42 5f 54 49 4d 45  /.  case DB_TIME
14de0 4f 55 54 3a 20 7b 0a 20 20 20 20 69 6e 74 20 6d  OUT: {.    int m
14df0 73 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21  s;.    if( objc!
14e00 3d 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  =3 ){.      Tcl_
14e10 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
14e20 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 4d  erp, 2, objv, "M
14e30 49 4c 4c 49 53 45 43 4f 4e 44 53 22 29 3b 0a 20  ILLISECONDS");. 
14e40 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
14e50 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
14e60 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46   if( Tcl_GetIntF
14e70 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
14e80 62 6a 76 5b 32 5d 2c 20 26 6d 73 29 20 29 20 72  bjv[2], &ms) ) r
14e90 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
14ea0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 75 73  .    sqlite3_bus
14eb0 79 5f 74 69 6d 65 6f 75 74 28 70 44 62 2d 3e 64  y_timeout(pDb->d
14ec0 62 2c 20 6d 73 29 3b 0a 20 20 20 20 62 72 65 61  b, ms);.    brea
14ed0 6b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 0a 20  k;.  }.  .  /*. 
14ee0 20 2a 2a 20 20 20 20 20 24 64 62 20 74 6f 74 61   **     $db tota
14ef0 6c 5f 63 68 61 6e 67 65 73 0a 20 20 2a 2a 0a 20  l_changes.  **. 
14f00 20 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e   ** Return the n
14f10 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68  umber of rows th
14f20 61 74 20 77 65 72 65 20 6d 6f 64 69 66 69 65 64  at were modified
14f30 2c 20 69 6e 73 65 72 74 65 64 2c 20 6f 72 20 64  , inserted, or d
14f40 65 6c 65 74 65 64 20 0a 20 20 2a 2a 20 73 69 6e  eleted .  ** sin
14f50 63 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ce the database 
14f60 68 61 6e 64 6c 65 20 77 61 73 20 63 72 65 61 74  handle was creat
14f70 65 64 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  ed..  */.  case 
14f80 44 42 5f 54 4f 54 41 4c 5f 43 48 41 4e 47 45 53  DB_TOTAL_CHANGES
14f90 3a 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20  : {.    Tcl_Obj 
14fa0 2a 70 52 65 73 75 6c 74 3b 0a 20 20 20 20 69 66  *pResult;.    if
14fb0 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20  ( objc!=2 ){.   
14fc0 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
14fd0 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
14fe0 62 6a 76 2c 20 22 22 29 3b 0a 20 20 20 20 20 20  bjv, "");.      
14ff0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
15000 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 52 65 73  ;.    }.    pRes
15010 75 6c 74 20 3d 20 54 63 6c 5f 47 65 74 4f 62 6a  ult = Tcl_GetObj
15020 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a  Result(interp);.
15030 20 20 20 20 54 63 6c 5f 53 65 74 49 6e 74 4f 62      Tcl_SetIntOb
15040 6a 28 70 52 65 73 75 6c 74 2c 20 73 71 6c 69 74  j(pResult, sqlit
15050 65 33 5f 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73  e3_total_changes
15060 28 70 44 62 2d 3e 64 62 29 29 3b 0a 20 20 20 20  (pDb->db));.    
15070 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
15080 20 20 20 20 24 64 62 20 74 72 61 63 65 20 3f 43      $db trace ?C
15090 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a 0a 20 20  ALLBACK?.  **.  
150a0 2a 2a 20 4d 61 6b 65 20 61 72 72 61 6e 67 65 6d  ** Make arrangem
150b0 65 6e 74 73 20 74 6f 20 69 6e 76 6f 6b 65 20 74  ents to invoke t
150c0 68 65 20 43 41 4c 4c 42 41 43 4b 20 72 6f 75 74  he CALLBACK rout
150d0 69 6e 65 20 66 6f 72 20 65 61 63 68 20 53 51 4c  ine for each SQL
150e0 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20   statement.  ** 
150f0 74 68 61 74 20 69 73 20 65 78 65 63 75 74 65 64  that is executed
15100 2e 20 20 54 68 65 20 74 65 78 74 20 6f 66 20 74  .  The text of t
15110 68 65 20 53 51 4c 20 69 73 20 61 70 70 65 6e 64  he SQL is append
15120 65 64 20 74 6f 20 43 41 4c 4c 42 41 43 4b 20 62  ed to CALLBACK b
15130 65 66 6f 72 65 0a 20 20 2a 2a 20 69 74 20 69 73  efore.  ** it is
15140 20 65 78 65 63 75 74 65 64 2e 0a 20 20 2a 2f 0a   executed..  */.
15150 20 20 63 61 73 65 20 44 42 5f 54 52 41 43 45 3a    case DB_TRACE:
15160 20 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3e   {.    if( objc>
15170 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57  3 ){.      Tcl_W
15180 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
15190 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 43  rp, 2, objv, "?C
151a0 41 4c 4c 42 41 43 4b 3f 22 29 3b 0a 20 20 20 20  ALLBACK?");.    
151b0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
151c0 4f 52 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  OR;.    }else if
151d0 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20  ( objc==2 ){.   
151e0 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 54 72 61     if( pDb->zTra
151f0 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63  ce ){.        Tc
15200 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
15210 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a 54 72 61  nterp, pDb->zTra
15220 63 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  ce, 0);.      }.
15230 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
15240 20 63 68 61 72 20 2a 7a 54 72 61 63 65 3b 0a 20   char *zTrace;. 
15250 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20       int len;.  
15260 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 54 72      if( pDb->zTr
15270 61 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20 54  ace ){.        T
15280 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 54 72  cl_Free(pDb->zTr
15290 61 63 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ace);.      }.  
152a0 20 20 20 20 7a 54 72 61 63 65 20 3d 20 54 63 6c      zTrace = Tcl
152b0 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
152c0 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29  j(objv[2], &len)
152d0 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 54 72 61  ;.      if( zTra
152e0 63 65 20 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20  ce && len>0 ){. 
152f0 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 54 72 61         pDb->zTra
15300 63 65 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 20  ce = Tcl_Alloc( 
15310 6c 65 6e 20 2b 20 31 20 29 3b 0a 20 20 20 20 20  len + 1 );.     
15320 20 20 20 6d 65 6d 63 70 79 28 70 44 62 2d 3e 7a     memcpy(pDb->z
15330 54 72 61 63 65 2c 20 7a 54 72 61 63 65 2c 20 6c  Trace, zTrace, l
15340 65 6e 2b 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c  en+1);.      }el
15350 73 65 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d  se{.        pDb-
15360 3e 7a 54 72 61 63 65 20 3d 20 30 3b 0a 20 20 20  >zTrace = 0;.   
15370 20 20 20 7d 0a 23 69 66 20 21 64 65 66 69 6e 65     }.#if !define
15380 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  d(SQLITE_OMIT_TR
15390 41 43 45 29 20 26 26 20 21 64 65 66 69 6e 65 64  ACE) && !defined
153a0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f  (SQLITE_OMIT_FLO
153b0 41 54 49 4e 47 5f 50 4f 49 4e 54 29 0a 20 20 20  ATING_POINT).   
153c0 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 54 72 61     if( pDb->zTra
153d0 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44  ce ){.        pD
153e0 62 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65  b->interp = inte
153f0 72 70 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  rp;.        sqli
15400 74 65 33 5f 74 72 61 63 65 28 70 44 62 2d 3e 64  te3_trace(pDb->d
15410 62 2c 20 44 62 54 72 61 63 65 48 61 6e 64 6c 65  b, DbTraceHandle
15420 72 2c 20 70 44 62 29 3b 0a 20 20 20 20 20 20 7d  r, pDb);.      }
15430 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
15440 6c 69 74 65 33 5f 74 72 61 63 65 28 70 44 62 2d  lite3_trace(pDb-
15450 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  >db, 0, 0);.    
15460 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d    }.#endif.    }
15470 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
15480 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 74 72 61  .  /*    $db tra
15490 6e 73 61 63 74 69 6f 6e 20 5b 2d 64 65 66 65 72  nsaction [-defer
154a0 72 65 64 7c 2d 69 6d 6d 65 64 69 61 74 65 7c 2d  red|-immediate|-
154b0 65 78 63 6c 75 73 69 76 65 5d 20 53 43 52 49 50  exclusive] SCRIP
154c0 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 74 61 72  T.  **.  ** Star
154d0 74 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74  t a new transact
154e0 69 6f 6e 20 28 69 66 20 77 65 20 61 72 65 20 6e  ion (if we are n
154f0 6f 74 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68  ot already in th
15500 65 20 6d 69 64 73 74 20 6f 66 20 61 0a 20 20 2a  e midst of a.  *
15510 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 20 61  * transaction) a
15520 6e 64 20 65 78 65 63 75 74 65 20 74 68 65 20 54  nd execute the T
15530 43 4c 20 73 63 72 69 70 74 20 53 43 52 49 50 54  CL script SCRIPT
15540 2e 20 20 41 66 74 65 72 20 53 43 52 49 50 54 0a  .  After SCRIPT.
15550 20 20 2a 2a 20 63 6f 6d 70 6c 65 74 65 73 2c 20    ** completes, 
15560 65 69 74 68 65 72 20 63 6f 6d 6d 69 74 20 74 68  either commit th
15570 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 72  e transaction or
15580 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 20 69 66   roll it back if
15590 20 53 43 52 49 50 54 0a 20 20 2a 2a 20 74 68 72   SCRIPT.  ** thr
155a0 6f 77 73 20 61 6e 20 65 78 63 65 70 74 69 6f 6e  ows an exception
155b0 2e 20 20 4f 72 20 69 66 20 6e 6f 20 6e 65 77 20  .  Or if no new 
155c0 74 72 61 6e 73 61 74 69 6f 6e 20 77 61 73 20 73  transation was s
155d0 74 61 72 74 65 64 2c 20 64 6f 20 6e 6f 74 68 69  tarted, do nothi
155e0 6e 67 2e 0a 20 20 2a 2a 20 70 61 73 73 20 74 68  ng..  ** pass th
155f0 65 20 65 78 63 65 70 74 69 6f 6e 20 6f 6e 20 75  e exception on u
15600 70 20 74 68 65 20 73 74 61 63 6b 2e 0a 20 20 2a  p the stack..  *
15610 2a 0a 20 20 2a 2a 20 54 68 69 73 20 63 6f 6d 6d  *.  ** This comm
15620 61 6e 64 20 77 61 73 20 69 6e 73 70 69 72 65 64  and was inspired
15630 20 62 79 20 44 61 76 65 20 54 68 6f 6d 61 73 27   by Dave Thomas'
15640 73 20 74 61 6c 6b 20 6f 6e 20 52 75 62 79 20 61  s talk on Ruby a
15650 74 20 74 68 65 0a 20 20 2a 2a 20 32 30 30 35 20  t the.  ** 2005 
15660 4f 27 52 65 69 6c 6c 79 20 4f 70 65 6e 20 53 6f  O'Reilly Open So
15670 75 72 63 65 20 43 6f 6e 76 65 6e 74 69 6f 6e 20  urce Convention 
15680 28 4f 53 43 4f 4e 29 2e 0a 20 20 2a 2f 0a 20 20  (OSCON)..  */.  
15690 63 61 73 65 20 44 42 5f 54 52 41 4e 53 41 43 54  case DB_TRANSACT
156a0 49 4f 4e 3a 20 7b 0a 20 20 20 20 54 63 6c 5f 4f  ION: {.    Tcl_O
156b0 62 6a 20 2a 70 53 63 72 69 70 74 3b 0a 20 20 20  bj *pScript;.   
156c0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 42 65   const char *zBe
156d0 67 69 6e 20 3d 20 22 53 41 56 45 50 4f 49 4e 54  gin = "SAVEPOINT
156e0 20 5f 74 63 6c 5f 74 72 61 6e 73 61 63 74 69 6f   _tcl_transactio
156f0 6e 22 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63  n";.    if( objc
15700 21 3d 33 20 26 26 20 6f 62 6a 63 21 3d 34 20 29  !=3 && objc!=4 )
15710 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e  {.      Tcl_Wron
15720 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
15730 20 32 2c 20 6f 62 6a 76 2c 20 22 5b 54 59 50 45   2, objv, "[TYPE
15740 5d 20 53 43 52 49 50 54 22 29 3b 0a 20 20 20 20  ] SCRIPT");.    
15750 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
15760 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  OR;.    }..    i
15770 66 28 20 70 44 62 2d 3e 6e 54 72 61 6e 73 61 63  f( pDb->nTransac
15780 74 69 6f 6e 3d 3d 30 20 26 26 20 6f 62 6a 63 3d  tion==0 && objc=
15790 3d 34 20 29 7b 0a 20 20 20 20 20 20 73 74 61 74  =4 ){.      stat
157a0 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 54  ic const char *T
157b0 54 59 50 45 5f 73 74 72 73 5b 5d 20 3d 20 7b 0a  TYPE_strs[] = {.
157c0 20 20 20 20 20 20 20 20 22 64 65 66 65 72 72 65          "deferre
157d0 64 22 2c 20 20 20 22 65 78 63 6c 75 73 69 76 65  d",   "exclusive
157e0 22 2c 20 20 22 69 6d 6d 65 64 69 61 74 65 22 2c  ",  "immediate",
157f0 20 30 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20   0.      };.    
15800 20 20 65 6e 75 6d 20 54 54 59 50 45 5f 65 6e 75    enum TTYPE_enu
15810 6d 20 7b 0a 20 20 20 20 20 20 20 20 54 54 59 50  m {.        TTYP
15820 45 5f 44 45 46 45 52 52 45 44 2c 20 54 54 59 50  E_DEFERRED, TTYP
15830 45 5f 45 58 43 4c 55 53 49 56 45 2c 20 54 54 59  E_EXCLUSIVE, TTY
15840 50 45 5f 49 4d 4d 45 44 49 41 54 45 0a 20 20 20  PE_IMMEDIATE.   
15850 20 20 20 7d 3b 0a 20 20 20 20 20 20 69 6e 74 20     };.      int 
15860 74 74 79 70 65 3b 0a 20 20 20 20 20 20 69 66 28  ttype;.      if(
15870 20 54 63 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f   Tcl_GetIndexFro
15880 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
15890 76 5b 32 5d 2c 20 54 54 59 50 45 5f 73 74 72 73  v[2], TTYPE_strs
158a0 2c 20 22 74 72 61 6e 73 61 63 74 69 6f 6e 20 74  , "transaction t
158b0 79 70 65 22 2c 0a 20 20 20 20 20 20 20 20 20 20  ype",.          
158c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
158d0 20 20 20 20 30 2c 20 26 74 74 79 70 65 29 20 29      0, &ttype) )
158e0 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
158f0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
15900 20 20 7d 0a 20 20 20 20 20 20 73 77 69 74 63 68    }.      switch
15910 28 20 28 65 6e 75 6d 20 54 54 59 50 45 5f 65 6e  ( (enum TTYPE_en
15920 75 6d 29 74 74 79 70 65 20 29 7b 0a 20 20 20 20  um)ttype ){.    
15930 20 20 20 20 63 61 73 65 20 54 54 59 50 45 5f 44      case TTYPE_D
15940 45 46 45 52 52 45 44 3a 20 20 20 20 2f 2a 20 6e  EFERRED:    /* n
15950 6f 2d 6f 70 20 2a 2f 3b 20 20 20 20 20 20 20 20  o-op */;        
15960 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
15970 20 20 20 20 20 20 20 20 63 61 73 65 20 54 54 59          case TTY
15980 50 45 5f 45 58 43 4c 55 53 49 56 45 3a 20 20 20  PE_EXCLUSIVE:   
15990 7a 42 65 67 69 6e 20 3d 20 22 42 45 47 49 4e 20  zBegin = "BEGIN 
159a0 45 58 43 4c 55 53 49 56 45 22 3b 20 20 62 72 65  EXCLUSIVE";  bre
159b0 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65  ak;.        case
159c0 20 54 54 59 50 45 5f 49 4d 4d 45 44 49 41 54 45   TTYPE_IMMEDIATE
159d0 3a 20 20 20 7a 42 65 67 69 6e 20 3d 20 22 42 45  :   zBegin = "BE
159e0 47 49 4e 20 49 4d 4d 45 44 49 41 54 45 22 3b 20  GIN IMMEDIATE"; 
159f0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
15a00 20 20 20 20 7d 0a 20 20 20 20 70 53 63 72 69 70      }.    pScrip
15a10 74 20 3d 20 6f 62 6a 76 5b 6f 62 6a 63 2d 31 5d  t = objv[objc-1]
15a20 3b 0a 0a 20 20 20 20 2f 2a 20 52 75 6e 20 74 68  ;..    /* Run th
15a30 65 20 53 51 4c 69 74 65 20 42 45 47 49 4e 20 63  e SQLite BEGIN c
15a40 6f 6d 6d 61 6e 64 20 74 6f 20 6f 70 65 6e 20 61  ommand to open a
15a50 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 72 20   transaction or 
15a60 73 61 76 65 70 6f 69 6e 74 2e 20 2a 2f 0a 20 20  savepoint. */.  
15a70 20 20 70 44 62 2d 3e 64 69 73 61 62 6c 65 41 75    pDb->disableAu
15a80 74 68 2b 2b 3b 0a 20 20 20 20 72 63 20 3d 20 73  th++;.    rc = s
15a90 71 6c 69 74 65 33 5f 65 78 65 63 28 70 44 62 2d  qlite3_exec(pDb-
15aa0 3e 64 62 2c 20 7a 42 65 67 69 6e 2c 20 30 2c 20  >db, zBegin, 0, 
15ab0 30 2c 20 30 29 3b 0a 20 20 20 20 70 44 62 2d 3e  0, 0);.    pDb->
15ac0 64 69 73 61 62 6c 65 41 75 74 68 2d 2d 3b 0a 20  disableAuth--;. 
15ad0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
15ae0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 54 63  E_OK ){.      Tc
15af0 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
15b00 6e 74 65 72 70 2c 20 73 71 6c 69 74 65 33 5f 65  nterp, sqlite3_e
15b10 72 72 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c 20  rrmsg(pDb->db), 
15b20 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  0);.      return
15b30 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
15b40 7d 0a 20 20 20 20 70 44 62 2d 3e 6e 54 72 61 6e  }.    pDb->nTran
15b50 73 61 63 74 69 6f 6e 2b 2b 3b 0a 0a 20 20 20 20  saction++;..    
15b60 2f 2a 20 49 66 20 75 73 69 6e 67 20 4e 52 45 2c  /* If using NRE,
15b70 20 73 63 68 65 64 75 6c 65 20 61 20 63 61 6c 6c   schedule a call
15b80 62 61 63 6b 20 74 6f 20 69 6e 76 6f 6b 65 20 74  back to invoke t
15b90 68 65 20 73 63 72 69 70 74 20 70 53 63 72 69 70  he script pScrip
15ba0 74 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 61  t, then.    ** a
15bb0 20 73 65 63 6f 6e 64 20 63 61 6c 6c 62 61 63 6b   second callback
15bc0 20 74 6f 20 63 6f 6d 6d 69 74 20 28 6f 72 20 72   to commit (or r
15bd0 6f 6c 6c 62 61 63 6b 29 20 74 68 65 20 74 72 61  ollback) the tra
15be0 6e 73 61 63 74 69 6f 6e 20 6f 72 20 73 61 76 65  nsaction or save
15bf0 70 6f 69 6e 74 0a 20 20 20 20 2a 2a 20 6f 70 65  point.    ** ope
15c00 6e 65 64 20 61 62 6f 76 65 2e 20 49 66 20 6e 6f  ned above. If no
15c10 74 20 75 73 69 6e 67 20 4e 52 45 2c 20 65 76 61  t using NRE, eva
15c20 6c 75 61 74 65 20 74 68 65 20 73 63 72 69 70 74  luate the script
15c30 20 64 69 72 65 63 74 6c 79 2c 20 74 68 65 6e 0a   directly, then.
15c40 20 20 20 20 2a 2a 20 63 61 6c 6c 20 66 75 6e 63      ** call func
15c50 74 69 6f 6e 20 44 62 54 72 61 6e 73 50 6f 73 74  tion DbTransPost
15c60 43 6d 64 28 29 20 74 6f 20 63 6f 6d 6d 69 74 20  Cmd() to commit 
15c70 28 6f 72 20 72 6f 6c 6c 62 61 63 6b 29 20 74 68  (or rollback) th
15c80 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20  e transaction . 
15c90 20 20 20 2a 2a 20 6f 72 20 73 61 76 65 70 6f 69     ** or savepoi
15ca0 6e 74 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  nt.  */.    if( 
15cb0 44 62 55 73 65 4e 72 65 28 29 20 29 7b 0a 20 20  DbUseNre() ){.  
15cc0 20 20 20 20 54 63 6c 5f 4e 52 41 64 64 43 61 6c      Tcl_NRAddCal
15cd0 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 44 62  lback(interp, Db
15ce0 54 72 61 6e 73 50 6f 73 74 43 6d 64 2c 20 63 64  TransPostCmd, cd
15cf0 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
15d00 20 20 28 76 6f 69 64 29 54 63 6c 5f 4e 52 45 76    (void)Tcl_NREv
15d10 61 6c 4f 62 6a 28 69 6e 74 65 72 70 2c 20 70 53  alObj(interp, pS
15d20 63 72 69 70 74 2c 20 30 29 3b 0a 20 20 20 20 7d  cript, 0);.    }
15d30 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
15d40 20 44 62 54 72 61 6e 73 50 6f 73 74 43 6d 64 28   DbTransPostCmd(
15d50 26 63 64 2c 20 69 6e 74 65 72 70 2c 20 54 63 6c  &cd, interp, Tcl
15d60 5f 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72  _EvalObjEx(inter
15d70 70 2c 20 70 53 63 72 69 70 74 2c 20 30 29 29 3b  p, pScript, 0));
15d80 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b  .    }.    break
15d90 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ;.  }..  /*.  **
15da0 20 20 20 20 24 64 62 20 75 6e 6c 6f 63 6b 5f 6e      $db unlock_n
15db0 6f 74 69 66 79 20 3f 73 63 72 69 70 74 3f 0a 20  otify ?script?. 
15dc0 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 55 4e   */.  case DB_UN
15dd0 4c 4f 43 4b 5f 4e 4f 54 49 46 59 3a 20 7b 0a 23  LOCK_NOTIFY: {.#
15de0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  ifndef SQLITE_EN
15df0 41 42 4c 45 5f 55 4e 4c 4f 43 4b 5f 4e 4f 54 49  ABLE_UNLOCK_NOTI
15e00 46 59 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  FY.    Tcl_Appen
15e10 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
15e20 22 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79 20 6e  "unlock_notify n
15e30 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20  ot available in 
15e40 74 68 69 73 20 62 75 69 6c 64 22 2c 20 30 29 3b  this build", 0);
15e50 0a 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45 52  .    rc = TCL_ER
15e60 52 4f 52 3b 0a 23 65 6c 73 65 0a 20 20 20 20 69  ROR;.#else.    i
15e70 66 28 20 6f 62 6a 63 21 3d 32 20 26 26 20 6f 62  f( objc!=2 && ob
15e80 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 54  jc!=3 ){.      T
15e90 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
15ea0 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c  interp, 2, objv,
15eb0 20 22 3f 53 43 52 49 50 54 3f 22 29 3b 0a 20 20   "?SCRIPT?");.  
15ec0 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45 52 52      rc = TCL_ERR
15ed0 4f 52 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  OR;.    }else{. 
15ee0 20 20 20 20 20 76 6f 69 64 20 28 2a 78 4e 6f 74       void (*xNot
15ef0 69 66 79 29 28 76 6f 69 64 20 2a 2a 2c 20 69 6e  ify)(void **, in
15f00 74 29 20 3d 20 30 3b 0a 20 20 20 20 20 20 76 6f  t) = 0;.      vo
15f10 69 64 20 2a 70 4e 6f 74 69 66 79 41 72 67 20 3d  id *pNotifyArg =
15f20 20 30 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70   0;..      if( p
15f30 44 62 2d 3e 70 55 6e 6c 6f 63 6b 4e 6f 74 69 66  Db->pUnlockNotif
15f40 79 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c  y ){.        Tcl
15f50 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 44  _DecrRefCount(pD
15f60 62 2d 3e 70 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79  b->pUnlockNotify
15f70 29 3b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e  );.        pDb->
15f80 70 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 20 3d 20  pUnlockNotify = 
15f90 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 0a 20 20  0;.      }.  .  
15fa0 20 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d 33 20      if( objc==3 
15fb0 29 7b 0a 20 20 20 20 20 20 20 20 78 4e 6f 74 69  ){.        xNoti
15fc0 66 79 20 3d 20 44 62 55 6e 6c 6f 63 6b 4e 6f 74  fy = DbUnlockNot
15fd0 69 66 79 3b 0a 20 20 20 20 20 20 20 20 70 4e 6f  ify;.        pNo
15fe0 74 69 66 79 41 72 67 20 3d 20 28 76 6f 69 64 20  tifyArg = (void 
15ff0 2a 29 70 44 62 3b 0a 20 20 20 20 20 20 20 20 70  *)pDb;.        p
16000 44 62 2d 3e 70 55 6e 6c 6f 63 6b 4e 6f 74 69 66  Db->pUnlockNotif
16010 79 20 3d 20 6f 62 6a 76 5b 32 5d 3b 0a 20 20 20  y = objv[2];.   
16020 20 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66       Tcl_IncrRef
16030 43 6f 75 6e 74 28 70 44 62 2d 3e 70 55 6e 6c 6f  Count(pDb->pUnlo
16040 63 6b 4e 6f 74 69 66 79 29 3b 0a 20 20 20 20 20  ckNotify);.     
16050 20 7d 0a 20 20 0a 20 20 20 20 20 20 69 66 28 20   }.  .      if( 
16060 73 71 6c 69 74 65 33 5f 75 6e 6c 6f 63 6b 5f 6e  sqlite3_unlock_n
16070 6f 74 69 66 79 28 70 44 62 2d 3e 64 62 2c 20 78  otify(pDb->db, x
16080 4e 6f 74 69 66 79 2c 20 70 4e 6f 74 69 66 79 41  Notify, pNotifyA
16090 72 67 29 20 29 7b 0a 20 20 20 20 20 20 20 20 54  rg) ){.        T
160a0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
160b0 69 6e 74 65 72 70 2c 20 73 71 6c 69 74 65 33 5f  interp, sqlite3_
160c0 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c  errmsg(pDb->db),
160d0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20   0);.        rc 
160e0 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  = TCL_ERROR;.   
160f0 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69     }.    }.#endi
16100 66 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  f.    break;.  }
16110 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 24  ..  /*.  **    $
16120 64 62 20 70 72 65 75 70 64 61 74 65 5f 68 6f 6f  db preupdate_hoo
16130 6b 20 63 6f 75 6e 74 0a 20 20 2a 2a 20 20 20 20  k count.  **    
16140 24 64 62 20 70 72 65 75 70 64 61 74 65 5f 68 6f  $db preupdate_ho
16150 6f 6b 20 68 6f 6f 6b 20 3f 53 43 52 49 50 54 3f  ok hook ?SCRIPT?
16160 0a 20 20 2a 2a 20 20 20 20 24 64 62 20 70 72 65  .  **    $db pre
16170 75 70 64 61 74 65 5f 68 6f 6f 6b 20 6e 65 77 20  update_hook new 
16180 49 4e 44 45 58 0a 20 20 2a 2a 20 20 20 20 24 64  INDEX.  **    $d
16190 62 20 70 72 65 75 70 64 61 74 65 5f 68 6f 6f 6b  b preupdate_hook
161a0 20 6f 6c 64 20 49 4e 44 45 58 0a 20 20 2a 2f 0a   old INDEX.  */.
161b0 20 20 63 61 73 65 20 44 42 5f 50 52 45 55 50 44    case DB_PREUPD
161c0 41 54 45 3a 20 7b 0a 23 69 66 6e 64 65 66 20 53  ATE: {.#ifndef S
161d0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52 45  QLITE_ENABLE_PRE
161e0 55 50 44 41 54 45 5f 48 4f 4f 4b 0a 20 20 20 20  UPDATE_HOOK.    
161f0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
16200 28 69 6e 74 65 72 70 2c 20 22 70 72 65 75 70 64  (interp, "preupd
16210 61 74 65 5f 68 6f 6f 6b 20 77 61 73 20 6f 6d 69  ate_hook was omi
16220 74 74 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d  tted at compile-
16230 74 69 6d 65 22 29 3b 0a 20 20 20 20 72 63 20 3d  time");.    rc =
16240 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73   TCL_ERROR;.#els
16250 65 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e  e.    static con
16260 73 74 20 63 68 61 72 20 2a 61 7a 53 75 62 5b 5d  st char *azSub[]
16270 20 3d 20 7b 22 63 6f 75 6e 74 22 2c 20 22 64 65   = {"count", "de
16280 70 74 68 22 2c 20 22 68 6f 6f 6b 22 2c 20 22 6e  pth", "hook", "n
16290 65 77 22 2c 20 22 6f 6c 64 22 2c 20 30 7d 3b 0a  ew", "old", 0};.
162a0 20 20 20 20 65 6e 75 6d 20 44 62 50 72 65 75 70      enum DbPreup
162b0 64 61 74 65 53 75 62 43 6d 64 20 7b 0a 20 20 20  dateSubCmd {.   
162c0 20 20 20 50 52 45 5f 43 4f 55 4e 54 2c 20 50 52     PRE_COUNT, PR
162d0 45 5f 44 45 50 54 48 2c 20 50 52 45 5f 48 4f 4f  E_DEPTH, PRE_HOO
162e0 4b 2c 20 50 52 45 5f 4e 45 57 2c 20 50 52 45 5f  K, PRE_NEW, PRE_
162f0 4f 4c 44 0a 20 20 20 20 7d 3b 0a 20 20 20 20 69  OLD.    };.    i
16300 6e 74 20 69 53 75 62 3b 0a 0a 20 20 20 20 69 66  nt iSub;..    if
16310 28 20 6f 62 6a 63 3c 33 20 29 7b 0a 20 20 20 20  ( objc<3 ){.    
16320 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
16330 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62  gs(interp, 2, ob
16340 6a 76 2c 20 22 53 55 42 2d 43 4f 4d 4d 41 4e 44  jv, "SUB-COMMAND
16350 20 3f 41 52 47 53 3f 22 29 3b 0a 20 20 20 20 7d   ?ARGS?");.    }
16360 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74  .    if( Tcl_Get
16370 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74  IndexFromObj(int
16380 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 61 7a  erp, objv[2], az
16390 53 75 62 2c 20 22 73 75 62 2d 63 6f 6d 6d 61 6e  Sub, "sub-comman
163a0 64 22 2c 20 30 2c 20 26 69 53 75 62 29 20 29 7b  d", 0, &iSub) ){
163b0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
163c0 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a  L_ERROR;.    }..
163d0 20 20 20 20 73 77 69 74 63 68 28 20 28 65 6e 75      switch( (enu
163e0 6d 20 44 62 50 72 65 75 70 64 61 74 65 53 75 62  m DbPreupdateSub
163f0 43 6d 64 29 69 53 75 62 20 29 7b 0a 20 20 20 20  Cmd)iSub ){.    
16400 20 20 63 61 73 65 20 50 52 45 5f 43 4f 55 4e 54    case PRE_COUNT
16410 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  : {.        int 
16420 6e 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 5f 70  nCol = sqlite3_p
16430 72 65 75 70 64 61 74 65 5f 63 6f 75 6e 74 28 70  reupdate_count(p
16440 44 62 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20 20  Db->db);.       
16450 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
16460 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
16470 77 49 6e 74 4f 62 6a 28 6e 43 6f 6c 29 29 3b 0a  wIntObj(nCol));.
16480 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
16490 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 63 61       }..      ca
164a0 73 65 20 50 52 45 5f 48 4f 4f 4b 3a 20 7b 0a 20  se PRE_HOOK: {. 
164b0 20 20 20 20 20 20 20 69 66 28 20 6f 62 6a 63 3e         if( objc>
164c0 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54  4 ){.          T
164d0 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
164e0 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c  interp, 2, objv,
164f0 20 22 68 6f 6f 6b 20 3f 53 43 52 49 50 54 3f 22   "hook ?SCRIPT?"
16500 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
16510 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
16520 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
16530 20 44 62 48 6f 6f 6b 43 6d 64 28 69 6e 74 65 72   DbHookCmd(inter
16540 70 2c 20 70 44 62 2c 20 28 6f 62 6a 63 3d 3d 34  p, pDb, (objc==4
16550 20 3f 20 6f 62 6a 76 5b 33 5d 20 3a 20 30 29 2c   ? objv[3] : 0),
16560 20 26 70 44 62 2d 3e 70 50 72 65 55 70 64 61 74   &pDb->pPreUpdat
16570 65 48 6f 6f 6b 29 3b 0a 20 20 20 20 20 20 20 20  eHook);.        
16580 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a  break;.      }..
16590 20 20 20 20 20 20 63 61 73 65 20 50 52 45 5f 44        case PRE_D
165a0 45 50 54 48 3a 20 7b 0a 20 20 20 20 20 20 20 20  EPTH: {.        
165b0 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 74 3b 0a 20  Tcl_Obj *pRet;. 
165c0 20 20 20 20 20 20 20 69 66 28 20 6f 62 6a 63 21         if( objc!
165d0 3d 33 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =3 ){.          
165e0 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
165f0 28 69 6e 74 65 72 70 2c 20 33 2c 20 6f 62 6a 76  (interp, 3, objv
16600 2c 20 22 22 29 3b 0a 20 20 20 20 20 20 20 20 20  , "");.         
16610 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
16620 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  R;.        }.   
16630 20 20 20 20 20 70 52 65 74 20 3d 20 54 63 6c 5f       pRet = Tcl_
16640 4e 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65  NewIntObj(sqlite
16650 33 5f 70 72 65 75 70 64 61 74 65 5f 64 65 70 74  3_preupdate_dept
16660 68 28 70 44 62 2d 3e 64 62 29 29 3b 0a 20 20 20  h(pDb->db));.   
16670 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52       Tcl_SetObjR
16680 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 52  esult(interp, pR
16690 65 74 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  et);.        bre
166a0 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ak;.      }..   
166b0 20 20 20 63 61 73 65 20 50 52 45 5f 4e 45 57 3a     case PRE_NEW:
166c0 0a 20 20 20 20 20 20 63 61 73 65 20 50 52 45 5f  .      case PRE_
166d0 4f 4c 44 3a 20 7b 0a 20 20 20 20 20 20 20 20 69  OLD: {.        i
166e0 6e 74 20 69 49 64 78 3b 0a 20 20 20 20 20 20 20  nt iIdx;.       
166f0 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
16700 70 56 61 6c 75 65 3b 0a 20 20 20 20 20 20 20 20  pValue;.        
16710 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20  if( objc!=4 ){. 
16720 20 20 20 20 20 20 20 20 20 54 63 6c 5f 57 72 6f           Tcl_Wro
16730 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
16740 2c 20 33 2c 20 6f 62 6a 76 2c 20 22 49 4e 44 45  , 3, objv, "INDE
16750 58 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  X");.          r
16760 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
16770 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
16780 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e     if( Tcl_GetIn
16790 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
167a0 20 6f 62 6a 76 5b 33 5d 2c 20 26 69 49 64 78 29   objv[3], &iIdx)
167b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
167c0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
167d0 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
167e0 20 20 20 69 66 28 20 69 53 75 62 3d 3d 50 52 45     if( iSub==PRE
167f0 5f 4f 4c 44 20 29 7b 0a 20 20 20 20 20 20 20 20  _OLD ){.        
16800 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70    rc = sqlite3_p
16810 72 65 75 70 64 61 74 65 5f 6f 6c 64 28 70 44 62  reupdate_old(pDb
16820 2d 3e 64 62 2c 20 69 49 64 78 2c 20 26 70 56 61  ->db, iIdx, &pVa
16830 6c 75 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  lue);.        }e
16840 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61  lse{.          a
16850 73 73 65 72 74 28 20 69 53 75 62 3d 3d 50 52 45  ssert( iSub==PRE
16860 5f 4e 45 57 20 29 3b 0a 20 20 20 20 20 20 20 20  _NEW );.        
16870 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70    rc = sqlite3_p
16880 72 65 75 70 64 61 74 65 5f 6e 65 77 28 70 44 62  reupdate_new(pDb
16890 2d 3e 64 62 2c 20 69 49 64 78 2c 20 26 70 56 61  ->db, iIdx, &pVa
168a0 6c 75 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  lue);.        }.
168b0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
168c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
168d0 20 20 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20          Tcl_Obj 
168e0 2a 70 4f 62 6a 3b 0a 20 20 20 20 20 20 20 20 20  *pObj;.         
168f0 20 70 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 53   pObj = Tcl_NewS
16900 74 72 69 6e 67 4f 62 6a 28 28 63 68 61 72 2a 29  tringObj((char*)
16910 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
16920 78 74 28 70 56 61 6c 75 65 29 2c 20 2d 31 29 3b  xt(pValue), -1);
16930 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 53  .          Tcl_S
16940 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
16950 72 70 2c 20 70 4f 62 6a 29 3b 0a 20 20 20 20 20  rp, pObj);.     
16960 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
16970 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
16980 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 73 71 6c  sult(interp, sql
16990 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d  ite3_errmsg(pDb-
169a0 3e 64 62 29 2c 20 30 29 3b 0a 20 20 20 20 20 20  >db), 0);.      
169b0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
169c0 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a  RROR;.        }.
169d0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65        }.    }.#e
169e0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45  ndif /* SQLITE_E
169f0 4e 41 42 4c 45 5f 50 52 45 55 50 44 41 54 45 5f  NABLE_PREUPDATE_
16a00 48 4f 4f 4b 20 2a 2f 0a 20 20 20 20 62 72 65 61  HOOK */.    brea
16a10 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  k;.  }..  /*.  *
16a20 2a 20 20 20 20 24 64 62 20 77 61 6c 5f 68 6f 6f  *    $db wal_hoo
16a30 6b 20 3f 73 63 72 69 70 74 3f 0a 20 20 2a 2a 20  k ?script?.  ** 
16a40 20 20 20 24 64 62 20 75 70 64 61 74 65 5f 68 6f     $db update_ho
16a50 6f 6b 20 3f 73 63 72 69 70 74 3f 0a 20 20 2a 2a  ok ?script?.  **
16a60 20 20 20 20 24 64 62 20 72 6f 6c 6c 62 61 63 6b      $db rollback
16a70 5f 68 6f 6f 6b 20 3f 73 63 72 69 70 74 3f 0a 20  _hook ?script?. 
16a80 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 57 41   */.  case DB_WA
16a90 4c 5f 48 4f 4f 4b 3a 20 0a 20 20 63 61 73 65 20  L_HOOK: .  case 
16aa0 44 42 5f 55 50 44 41 54 45 5f 48 4f 4f 4b 3a 20  DB_UPDATE_HOOK: 
16ab0 0a 20 20 63 61 73 65 20 44 42 5f 52 4f 4c 4c 42  .  case DB_ROLLB
16ac0 41 43 4b 5f 48 4f 4f 4b 3a 20 7b 0a 20 20 20 20  ACK_HOOK: {.    
16ad0 2f 2a 20 73 65 74 20 70 70 48 6f 6f 6b 20 74 6f  /* set ppHook to
16ae0 20 70 6f 69 6e 74 20 61 74 20 70 55 70 64 61 74   point at pUpdat
16af0 65 48 6f 6f 6b 20 6f 72 20 70 52 6f 6c 6c 62 61  eHook or pRollba
16b00 63 6b 48 6f 6f 6b 2c 20 64 65 70 65 6e 64 69 6e  ckHook, dependin
16b10 67 20 6f 6e 20 0a 20 20 20 20 2a 2a 20 77 68 65  g on .    ** whe
16b20 74 68 65 72 20 5b 24 64 62 20 75 70 64 61 74 65  ther [$db update
16b30 5f 68 6f 6f 6b 5d 20 6f 72 20 5b 24 64 62 20 72  _hook] or [$db r
16b40 6f 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 5d 20 77 61  ollback_hook] wa
16b50 73 20 69 6e 76 6f 6b 65 64 2e 0a 20 20 20 20 2a  s invoked..    *
16b60 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a  /.    Tcl_Obj **
16b70 70 70 48 6f 6f 6b 3b 20 0a 20 20 20 20 69 66 28  ppHook; .    if(
16b80 20 63 68 6f 69 63 65 3d 3d 44 42 5f 57 41 4c 5f   choice==DB_WAL_
16b90 48 4f 4f 4b 20 29 20 70 70 48 6f 6f 6b 20 3d 20  HOOK ) ppHook = 
16ba0 26 70 44 62 2d 3e 70 57 61 6c 48 6f 6f 6b 3b 0a  &pDb->pWalHook;.
16bb0 20 20 20 20 69 66 28 20 63 68 6f 69 63 65 3d 3d      if( choice==
16bc0 44 42 5f 55 50 44 41 54 45 5f 48 4f 4f 4b 20 29  DB_UPDATE_HOOK )
16bd0 20 70 70 48 6f 6f 6b 20 3d 20 26 70 44 62 2d 3e   ppHook = &pDb->
16be0 70 55 70 64 61 74 65 48 6f 6f 6b 3b 0a 20 20 20  pUpdateHook;.   
16bf0 20 69 66 28 20 63 68 6f 69 63 65 3d 3d 44 42 5f   if( choice==DB_
16c00 52 4f 4c 4c 42 41 43 4b 5f 48 4f 4f 4b 20 29 20  ROLLBACK_HOOK ) 
16c10 70 70 48 6f 6f 6b 20 3d 20 26 70 44 62 2d 3e 70  ppHook = &pDb->p
16c20 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 3b 0a 20 20  RollbackHook;.  
16c30 20 20 69 66 28 20 6f 62 6a 63 3e 33 20 29 7b 0a    if( objc>3 ){.
16c40 20 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67         Tcl_Wrong
16c50 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
16c60 32 2c 20 6f 62 6a 76 2c 20 22 3f 53 43 52 49 50  2, objv, "?SCRIP
16c70 54 3f 22 29 3b 0a 20 20 20 20 20 20 20 72 65 74  T?");.       ret
16c80 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
16c90 20 20 20 7d 0a 0a 20 20 20 20 44 62 48 6f 6f 6b     }..    DbHook
16ca0 43 6d 64 28 69 6e 74 65 72 70 2c 20 70 44 62 2c  Cmd(interp, pDb,
16cb0 20 28 6f 62 6a 63 3d 3d 33 20 3f 20 6f 62 6a 76   (objc==3 ? objv
16cc0 5b 32 5d 20 3a 20 30 29 2c 20 70 70 48 6f 6f 6b  [2] : 0), ppHook
16cd0 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  );.    break;.  
16ce0 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 76  }..  /*    $db v
16cf0 65 72 73 69 6f 6e 0a 20 20 2a 2a 0a 20 20 2a 2a  ersion.  **.  **
16d00 20 52 65 74 75 72 6e 20 74 68 65 20 76 65 72 73   Return the vers
16d10 69 6f 6e 20 73 74 72 69 6e 67 20 66 6f 72 20 74  ion string for t
16d20 68 69 73 20 64 61 74 61 62 61 73 65 2e 0a 20 20  his database..  
16d30 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 56 45 52  */.  case DB_VER
16d40 53 49 4f 4e 3a 20 7b 0a 20 20 20 20 54 63 6c 5f  SION: {.    Tcl_
16d50 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
16d60 2c 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  , (char *)sqlite
16d70 33 5f 6c 69 62 76 65 72 73 69 6f 6e 28 29 2c 20  3_libversion(), 
16d80 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 20  TCL_STATIC);.   
16d90 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 0a 20 20   break;.  }...  
16da0 7d 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20  } /* End of the 
16db0 53 57 49 54 43 48 20 73 74 61 74 65 6d 65 6e 74  SWITCH statement
16dc0 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   */.  return rc;
16dd0 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 54  .}..#if SQLITE_T
16de0 43 4c 5f 4e 52 45 0a 2f 2a 0a 2a 2a 20 41 64 61  CL_NRE./*.** Ada
16df0 70 74 6f 72 20 74 68 61 74 20 70 72 6f 76 69 64  ptor that provid
16e00 65 73 20 61 6e 20 6f 62 6a 43 6d 64 20 69 6e 74  es an objCmd int
16e10 65 72 66 61 63 65 20 74 6f 20 74 68 65 20 4e 52  erface to the NR
16e20 45 2d 65 6e 61 62 6c 65 64 0a 2a 2a 20 69 6e 74  E-enabled.** int
16e30 65 72 66 61 63 65 20 69 6d 70 6c 65 6d 65 6e 74  erface implement
16e40 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ation..*/.static
16e50 20 69 6e 74 20 44 62 4f 62 6a 43 6d 64 41 64 61   int DbObjCmdAda
16e60 70 74 6f 72 28 0a 20 20 76 6f 69 64 20 2a 63 64  ptor(.  void *cd
16e70 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
16e80 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
16e90 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 63  jc,.  Tcl_Obj *c
16ea0 6f 6e 73 74 2a 6f 62 6a 76 0a 29 7b 0a 20 20 72  onst*objv.){.  r
16eb0 65 74 75 72 6e 20 54 63 6c 5f 4e 52 43 61 6c 6c  eturn Tcl_NRCall
16ec0 4f 62 6a 50 72 6f 63 28 69 6e 74 65 72 70 2c 20  ObjProc(interp, 
16ed0 44 62 4f 62 6a 43 6d 64 2c 20 63 64 2c 20 6f 62  DbObjCmd, cd, ob
16ee0 6a 63 2c 20 6f 62 6a 76 29 3b 0a 7d 0a 23 65 6e  jc, objv);.}.#en
16ef0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 54 43  dif /* SQLITE_TC
16f00 4c 5f 4e 52 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  L_NRE */../*.** 
16f10 20 20 73 71 6c 69 74 65 33 20 44 42 4e 41 4d 45    sqlite3 DBNAME
16f20 20 46 49 4c 45 4e 41 4d 45 20 3f 2d 76 66 73 20   FILENAME ?-vfs 
16f30 56 46 53 4e 41 4d 45 3f 20 3f 2d 6b 65 79 20 4b  VFSNAME? ?-key K
16f40 45 59 3f 20 3f 2d 72 65 61 64 6f 6e 6c 79 20 42  EY? ?-readonly B
16f50 4f 4f 4c 45 41 4e 3f 0a 2a 2a 20 20 20 20 20 20  OOLEAN?.**      
16f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f70 20 20 20 20 20 3f 2d 63 72 65 61 74 65 20 42 4f       ?-create BO
16f80 4f 4c 45 41 4e 3f 20 3f 2d 6e 6f 6d 75 74 65 78  OLEAN? ?-nomutex
16f90 20 42 4f 4f 4c 45 41 4e 3f 0a 2a 2a 0a 2a 2a 20   BOOLEAN?.**.** 
16fa0 54 68 69 73 20 69 73 20 74 68 65 20 6d 61 69 6e  This is the main
16fb0 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 2e 20 20 57   Tcl command.  W
16fc0 68 65 6e 20 74 68 65 20 22 73 71 6c 69 74 65 22  hen the "sqlite"
16fd0 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 20 69 73 0a   Tcl command is.
16fe0 2a 2a 20 69 6e 76 6f 6b 65 64 2c 20 74 68 69 73  ** invoked, this
16ff0 20 72 6f 75 74 69 6e 65 20 72 75 6e 73 20 74 6f   routine runs to
17000 20 70 72 6f 63 65 73 73 20 74 68 61 74 20 63 6f   process that co
17010 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  mmand..**.** The
17020 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2c   first argument,
17030 20 44 42 4e 41 4d 45 2c 20 69 73 20 61 6e 20 61   DBNAME, is an a
17040 72 62 69 74 72 61 72 79 20 6e 61 6d 65 20 66 6f  rbitrary name fo
17050 72 20 61 20 6e 65 77 0a 2a 2a 20 64 61 74 61 62  r a new.** datab
17060 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20  ase connection. 
17070 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20 63 72   This command cr
17080 65 61 74 65 73 20 61 20 6e 65 77 20 63 6f 6d 6d  eates a new comm
17090 61 6e 64 20 6e 61 6d 65 64 0a 2a 2a 20 44 42 4e  and named.** DBN
170a0 41 4d 45 20 74 68 61 74 20 69 73 20 75 73 65 64  AME that is used
170b0 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 74 68 61 74   to control that
170c0 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 20 54 68   connection.  Th
170d0 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f  e database.** co
170e0 6e 6e 65 63 74 69 6f 6e 20 69 73 20 64 65 6c 65  nnection is dele
170f0 74 65 64 20 77 68 65 6e 20 74 68 65 20 44 42 4e  ted when the DBN
17100 41 4d 45 20 63 6f 6d 6d 61 6e 64 20 69 73 20 64  AME command is d
17110 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  eleted..**.** Th
17120 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
17130 74 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  t is the name of
17140 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
17150 6c 65 2e 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63  le..**.*/.static
17160 20 69 6e 74 20 44 62 4d 61 69 6e 28 76 6f 69 64   int DbMain(void
17170 20 2a 63 64 2c 20 54 63 6c 5f 49 6e 74 65 72 70   *cd, Tcl_Interp
17180 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62   *interp, int ob
17190 6a 63 2c 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73  jc,Tcl_Obj *cons
171a0 74 2a 6f 62 6a 76 29 7b 0a 20 20 53 71 6c 69 74  t*objv){.  Sqlit
171b0 65 44 62 20 2a 70 3b 0a 20 20 63 6f 6e 73 74 20  eDb *p;.  const 
171c0 63 68 61 72 20 2a 7a 41 72 67 3b 0a 20 20 63 68  char *zArg;.  ch
171d0 61 72 20 2a 7a 45 72 72 4d 73 67 3b 0a 20 20 69  ar *zErrMsg;.  i
171e0 6e 74 20 69 3b 0a 20 20 63 6f 6e 73 74 20 63 68  nt i;.  const ch
171f0 61 72 20 2a 7a 46 69 6c 65 3b 0a 20 20 63 6f 6e  ar *zFile;.  con
17200 73 74 20 63 68 61 72 20 2a 7a 56 66 73 20 3d 20  st char *zVfs = 
17210 30 3b 0a 20 20 69 6e 74 20 66 6c 61 67 73 3b 0a  0;.  int flags;.
17220 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 74 72    Tcl_DString tr
17230 61 6e 73 6c 61 74 65 64 46 69 6c 65 6e 61 6d 65  anslatedFilename
17240 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
17250 48 41 53 5f 43 4f 44 45 43 0a 20 20 76 6f 69 64  HAS_CODEC.  void
17260 20 2a 70 4b 65 79 20 3d 20 30 3b 0a 20 20 69 6e   *pKey = 0;.  in
17270 74 20 6e 4b 65 79 20 3d 20 30 3b 0a 23 65 6e 64  t nKey = 0;.#end
17280 69 66 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  if.  int rc;..  
17290 2f 2a 20 49 6e 20 6e 6f 72 6d 61 6c 20 75 73 65  /* In normal use
172a0 2c 20 65 61 63 68 20 54 43 4c 20 69 6e 74 65 72  , each TCL inter
172b0 70 72 65 74 65 72 20 72 75 6e 73 20 69 6e 20 61  preter runs in a
172c0 20 73 69 6e 67 6c 65 20 74 68 72 65 61 64 2e 20   single thread. 
172d0 20 53 6f 0a 20 20 2a 2a 20 62 79 20 64 65 66 61   So.  ** by defa
172e0 75 6c 74 2c 20 77 65 20 63 61 6e 20 74 75 72 6e  ult, we can turn
172f0 20 6f 66 20 6d 75 74 65 78 69 6e 67 20 6f 6e 20   of mutexing on 
17300 53 51 4c 69 74 65 20 64 61 74 61 62 61 73 65 20  SQLite database 
17310 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 0a 20 20 2a  connections..  *
17320 2a 20 48 6f 77 65 76 65 72 2c 20 66 6f 72 20 74  * However, for t
17330 65 73 74 69 6e 67 20 70 75 72 70 6f 73 65 73 20  esting purposes 
17340 69 74 20 69 73 20 75 73 65 66 75 6c 20 74 6f 20  it is useful to 
17350 68 61 76 65 20 6d 75 74 65 78 65 73 20 74 75 72  have mutexes tur
17360 6e 65 64 0a 20 20 2a 2a 20 6f 6e 2e 20 20 53 6f  ned.  ** on.  So
17370 2c 20 62 79 20 64 65 66 61 75 6c 74 2c 20 6d 75  , by default, mu
17380 74 65 78 65 73 20 64 65 66 61 75 6c 74 20 6f 66  texes default of
17390 66 2e 20 20 42 75 74 20 69 66 20 63 6f 6d 70 69  f.  But if compi
173a0 6c 65 64 20 77 69 74 68 0a 20 20 2a 2a 20 53 51  led with.  ** SQ
173b0 4c 49 54 45 5f 54 43 4c 5f 44 45 46 41 55 4c 54  LITE_TCL_DEFAULT
173c0 5f 46 55 4c 4c 4d 55 54 45 58 20 74 68 65 6e 20  _FULLMUTEX then 
173d0 6d 75 74 65 78 65 73 20 64 65 66 61 75 6c 74 20  mutexes default 
173e0 6f 6e 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20  on..  */.#ifdef 
173f0 53 51 4c 49 54 45 5f 54 43 4c 5f 44 45 46 41 55  SQLITE_TCL_DEFAU
17400 4c 54 5f 46 55 4c 4c 4d 55 54 45 58 0a 20 20 66  LT_FULLMUTEX.  f
17410 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50  lags = SQLITE_OP
17420 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53  EN_READWRITE | S
17430 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
17440 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  E | SQLITE_OPEN_
17450 46 55 4c 4c 4d 55 54 45 58 3b 0a 23 65 6c 73 65  FULLMUTEX;.#else
17460 0a 20 20 66 6c 61 67 73 20 3d 20 53 51 4c 49 54  .  flags = SQLIT
17470 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
17480 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43   | SQLITE_OPEN_C
17490 52 45 41 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f  REATE | SQLITE_O
174a0 50 45 4e 5f 4e 4f 4d 55 54 45 58 3b 0a 23 65 6e  PEN_NOMUTEX;.#en
174b0 64 69 66 0a 0a 20 20 69 66 28 20 6f 62 6a 63 3d  dif..  if( objc=
174c0 3d 32 20 29 7b 0a 20 20 20 20 7a 41 72 67 20 3d  =2 ){.    zArg =
174d0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
174e0 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 30  omObj(objv[1], 0
174f0 29 3b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d  );.    if( strcm
17500 70 28 7a 41 72 67 2c 22 2d 76 65 72 73 69 6f 6e  p(zArg,"-version
17510 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 54  ")==0 ){.      T
17520 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
17530 69 6e 74 65 72 70 2c 73 71 6c 69 74 65 33 5f 6c  interp,sqlite3_l
17540 69 62 76 65 72 73 69 6f 6e 28 29 2c 30 29 3b 0a  ibversion(),0);.
17550 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
17560 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  _OK;.    }.    i
17570 66 28 20 73 74 72 63 6d 70 28 7a 41 72 67 2c 22  f( strcmp(zArg,"
17580 2d 68 61 73 2d 63 6f 64 65 63 22 29 3d 3d 30 20  -has-codec")==0 
17590 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
175a0 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 20 20 20  _HAS_CODEC.     
175b0 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
175c0 74 28 69 6e 74 65 72 70 2c 22 31 22 2c 30 29 3b  t(interp,"1",0);
175d0 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 54 63 6c  .#else.      Tcl
175e0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
175f0 74 65 72 70 2c 22 30 22 2c 30 29 3b 0a 23 65 6e  terp,"0",0);.#en
17600 64 69 66 0a 20 20 20 20 20 20 72 65 74 75 72 6e  dif.      return
17610 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20   TCL_OK;.    }. 
17620 20 7d 0a 20 20 66 6f 72 28 69 3d 33 3b 20 69 2b   }.  for(i=3; i+
17630 31 3c 6f 62 6a 63 3b 20 69 2b 3d 32 29 7b 0a 20  1<objc; i+=2){. 
17640 20 20 20 7a 41 72 67 20 3d 20 54 63 6c 5f 47 65     zArg = Tcl_Ge
17650 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 69 5d 29  tString(objv[i])
17660 3b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70  ;.    if( strcmp
17670 28 7a 41 72 67 2c 22 2d 6b 65 79 22 29 3d 3d 30  (zArg,"-key")==0
17680 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   ){.#ifdef SQLIT
17690 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 20 20  E_HAS_CODEC.    
176a0 20 20 70 4b 65 79 20 3d 20 54 63 6c 5f 47 65 74    pKey = Tcl_Get
176b0 42 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a  ByteArrayFromObj
176c0 28 6f 62 6a 76 5b 69 2b 31 5d 2c 20 26 6e 4b 65  (objv[i+1], &nKe
176d0 79 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d  y);.#endif.    }
176e0 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
176f0 7a 41 72 67 2c 20 22 2d 76 66 73 22 29 3d 3d 30  zArg, "-vfs")==0
17700 20 29 7b 0a 20 20 20 20 20 20 7a 56 66 73 20 3d   ){.      zVfs =
17710 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
17720 62 6a 76 5b 69 2b 31 5d 29 3b 0a 20 20 20 20 7d  bjv[i+1]);.    }
17730 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
17740 7a 41 72 67 2c 20 22 2d 72 65 61 64 6f 6e 6c 79  zArg, "-readonly
17750 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ")==0 ){.      i
17760 6e 74 20 62 3b 0a 20 20 20 20 20 20 69 66 28 20  nt b;.      if( 
17770 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72  Tcl_GetBooleanFr
17780 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
17790 6a 76 5b 69 2b 31 5d 2c 20 26 62 29 20 29 20 72  jv[i+1], &b) ) r
177a0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
177b0 0a 20 20 20 20 20 20 69 66 28 20 62 20 29 7b 0a  .      if( b ){.
177c0 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 26 3d          flags &=
177d0 20 7e 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52   ~(SQLITE_OPEN_R
177e0 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f  EADWRITE|SQLITE_
177f0 4f 50 45 4e 5f 43 52 45 41 54 45 29 3b 0a 20 20  OPEN_CREATE);.  
17800 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 53        flags |= S
17810 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
17820 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  NLY;.      }else
17830 7b 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73 20  {.        flags 
17840 26 3d 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  &= ~SQLITE_OPEN_
17850 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20  READONLY;.      
17860 20 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54    flags |= SQLIT
17870 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
17880 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
17890 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a  lse if( strcmp(z
178a0 41 72 67 2c 20 22 2d 63 72 65 61 74 65 22 29 3d  Arg, "-create")=
178b0 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =0 ){.      int 
178c0 62 3b 0a 20 20 20 20 20 20 69 66 28 20 54 63 6c  b;.      if( Tcl
178d0 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f  _GetBooleanFromO
178e0 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
178f0 69 2b 31 5d 2c 20 26 62 29 20 29 20 72 65 74 75  i+1], &b) ) retu
17900 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
17910 20 20 20 20 69 66 28 20 62 20 26 26 20 28 66 6c      if( b && (fl
17920 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
17930 4e 5f 52 45 41 44 4f 4e 4c 59 29 3d 3d 30 20 29  N_READONLY)==0 )
17940 7b 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73 20  {.        flags 
17950 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43  |= SQLITE_OPEN_C
17960 52 45 41 54 45 3b 0a 20 20 20 20 20 20 7d 65 6c  REATE;.      }el
17970 73 65 7b 0a 20 20 20 20 20 20 20 20 66 6c 61 67  se{.        flag
17980 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 4f 50 45  s &= ~SQLITE_OPE
17990 4e 5f 43 52 45 41 54 45 3b 0a 20 20 20 20 20 20  N_CREATE;.      
179a0 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  }.    }else if( 
179b0 73 74 72 63 6d 70 28 7a 41 72 67 2c 20 22 2d 6e  strcmp(zArg, "-n
179c0 6f 6d 75 74 65 78 22 29 3d 3d 30 20 29 7b 0a 20  omutex")==0 ){. 
179d0 20 20 20 20 20 69 6e 74 20 62 3b 0a 20 20 20 20       int b;.    
179e0 20 20 69 66 28 20 54 63 6c 5f 47 65 74 42 6f 6f    if( Tcl_GetBoo
179f0 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  leanFromObj(inte
17a00 72 70 2c 20 6f 62 6a 76 5b 69 2b 31 5d 2c 20 26  rp, objv[i+1], &
17a10 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
17a20 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 69 66 28  ERROR;.      if(
17a30 20 62 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6c   b ){.        fl
17a40 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50  ags |= SQLITE_OP
17a50 45 4e 5f 4e 4f 4d 55 54 45 58 3b 0a 20 20 20 20  EN_NOMUTEX;.    
17a60 20 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 53 51      flags &= ~SQ
17a70 4c 49 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55  LITE_OPEN_FULLMU
17a80 54 45 58 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  TEX;.      }else
17a90 7b 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73 20  {.        flags 
17aa0 26 3d 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  &= ~SQLITE_OPEN_
17ab0 4e 4f 4d 55 54 45 58 3b 0a 20 20 20 20 20 20 7d  NOMUTEX;.      }
17ac0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73  .    }else if( s
17ad0 74 72 63 6d 70 28 7a 41 72 67 2c 20 22 2d 66 75  trcmp(zArg, "-fu
17ae0 6c 6c 6d 75 74 65 78 22 29 3d 3d 30 20 29 7b 0a  llmutex")==0 ){.
17af0 20 20 20 20 20 20 69 6e 74 20 62 3b 0a 20 20 20        int b;.   
17b00 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 42 6f     if( Tcl_GetBo
17b10 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74  oleanFromObj(int
17b20 65 72 70 2c 20 6f 62 6a 76 5b 69 2b 31 5d 2c 20  erp, objv[i+1], 
17b30 26 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  &b) ) return TCL
17b40 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 69 66  _ERROR;.      if
17b50 28 20 62 20 29 7b 0a 20 20 20 20 20 20 20 20 66  ( b ){.        f
17b60 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f  lags |= SQLITE_O
17b70 50 45 4e 5f 46 55 4c 4c 4d 55 54 45 58 3b 0a 20  PEN_FULLMUTEX;. 
17b80 20 20 20 20 20 20 20 66 6c 61 67 73 20 26 3d 20         flags &= 
17b90 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d  ~SQLITE_OPEN_NOM
17ba0 55 54 45 58 3b 0a 20 20 20 20 20 20 7d 65 6c 73  UTEX;.      }els
17bb0 65 7b 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73  e{.        flags
17bc0 20 26 3d 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e   &= ~SQLITE_OPEN
17bd0 5f 46 55 4c 4c 4d 55 54 45 58 3b 0a 20 20 20 20  _FULLMUTEX;.    
17be0 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66    }.    }else if
17bf0 28 20 73 74 72 63 6d 70 28 7a 41 72 67 2c 20 22  ( strcmp(zArg, "
17c00 2d 75 72 69 22 29 3d 3d 30 20 29 7b 0a 20 20 20  -uri")==0 ){.   
17c10 20 20 20 69 6e 74 20 62 3b 0a 20 20 20 20 20 20     int b;.      
17c20 69 66 28 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65  if( Tcl_GetBoole
17c30 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  anFromObj(interp
17c40 2c 20 6f 62 6a 76 5b 69 2b 31 5d 2c 20 26 62 29  , objv[i+1], &b)
17c50 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
17c60 52 4f 52 3b 0a 20 20 20 20 20 20 69 66 28 20 62  ROR;.      if( b
17c70 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6c 61 67   ){.        flag
17c80 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e  s |= SQLITE_OPEN
17c90 5f 55 52 49 3b 0a 20 20 20 20 20 20 7d 65 6c 73  _URI;.      }els
17ca0 65 7b 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73  e{.        flags
17cb0 20 26 3d 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e   &= ~SQLITE_OPEN
17cc0 5f 55 52 49 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _URI;.      }.  
17cd0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 54    }else{.      T
17ce0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
17cf0 69 6e 74 65 72 70 2c 20 22 75 6e 6b 6e 6f 77 6e  interp, "unknown
17d00 20 6f 70 74 69 6f 6e 3a 20 22 2c 20 7a 41 72 67   option: ", zArg
17d10 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20  , (char*)0);.   
17d20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
17d30 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ROR;.    }.  }. 
17d40 20 69 66 28 20 6f 62 6a 63 3c 33 20 7c 7c 20 28   if( objc<3 || (
17d50 6f 62 6a 63 26 31 29 21 3d 31 20 29 7b 0a 20 20  objc&1)!=1 ){.  
17d60 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
17d70 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
17d80 6a 76 2c 20 0a 20 20 20 20 20 20 22 48 41 4e 44  jv, .      "HAND
17d90 4c 45 20 46 49 4c 45 4e 41 4d 45 20 3f 2d 76 66  LE FILENAME ?-vf
17da0 73 20 56 46 53 4e 41 4d 45 3f 20 3f 2d 72 65 61  s VFSNAME? ?-rea
17db0 64 6f 6e 6c 79 20 42 4f 4f 4c 45 41 4e 3f 20 3f  donly BOOLEAN? ?
17dc0 2d 63 72 65 61 74 65 20 42 4f 4f 4c 45 41 4e 3f  -create BOOLEAN?
17dd0 22 0a 20 20 20 20 20 20 22 20 3f 2d 6e 6f 6d 75  ".      " ?-nomu
17de0 74 65 78 20 42 4f 4f 4c 45 41 4e 3f 20 3f 2d 66  tex BOOLEAN? ?-f
17df0 75 6c 6c 6d 75 74 65 78 20 42 4f 4f 4c 45 41 4e  ullmutex BOOLEAN
17e00 3f 20 3f 2d 75 72 69 20 42 4f 4f 4c 45 41 4e 3f  ? ?-uri BOOLEAN?
17e10 22 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ".#ifdef SQLITE_
17e20 48 41 53 5f 43 4f 44 45 43 0a 20 20 20 20 20 20  HAS_CODEC.      
17e30 22 20 3f 2d 6b 65 79 20 43 4f 44 45 43 4b 45 59  " ?-key CODECKEY
17e40 3f 22 0a 23 65 6e 64 69 66 0a 20 20 20 20 29 3b  ?".#endif.    );
17e50 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
17e60 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 45 72  ERROR;.  }.  zEr
17e70 72 4d 73 67 20 3d 20 30 3b 0a 20 20 70 20 3d 20  rMsg = 0;.  p = 
17e80 28 53 71 6c 69 74 65 44 62 2a 29 54 63 6c 5f 41  (SqliteDb*)Tcl_A
17e90 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 29  lloc( sizeof(*p)
17ea0 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29   );.  if( p==0 )
17eb0 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73  {.    Tcl_SetRes
17ec0 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61  ult(interp, (cha
17ed0 72 20 2a 29 22 6d 61 6c 6c 6f 63 20 66 61 69 6c  r *)"malloc fail
17ee0 65 64 22 2c 20 54 43 4c 5f 53 54 41 54 49 43 29  ed", TCL_STATIC)
17ef0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
17f00 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 6d 65  _ERROR;.  }.  me
17f10 6d 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f  mset(p, 0, sizeo
17f20 66 28 2a 70 29 29 3b 0a 20 20 7a 46 69 6c 65 20  f(*p));.  zFile 
17f30 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  = Tcl_GetStringF
17f40 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20  romObj(objv[2], 
17f50 30 29 3b 0a 20 20 7a 46 69 6c 65 20 3d 20 54 63  0);.  zFile = Tc
17f60 6c 5f 54 72 61 6e 73 6c 61 74 65 46 69 6c 65 4e  l_TranslateFileN
17f70 61 6d 65 28 69 6e 74 65 72 70 2c 20 7a 46 69 6c  ame(interp, zFil
17f80 65 2c 20 26 74 72 61 6e 73 6c 61 74 65 64 46 69  e, &translatedFi
17f90 6c 65 6e 61 6d 65 29 3b 0a 20 20 72 63 20 3d 20  lename);.  rc = 
17fa0 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28  sqlite3_open_v2(
17fb0 7a 46 69 6c 65 2c 20 26 70 2d 3e 64 62 2c 20 66  zFile, &p->db, f
17fc0 6c 61 67 73 2c 20 7a 56 66 73 29 3b 0a 20 20 54  lags, zVfs);.  T
17fd0 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26  cl_DStringFree(&
17fe0 74 72 61 6e 73 6c 61 74 65 64 46 69 6c 65 6e 61  translatedFilena
17ff0 6d 65 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62  me);.  if( p->db
18000 20 29 7b 0a 20 20 20 20 69 66 28 20 53 51 4c 49   ){.    if( SQLI
18010 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 5f 65  TE_OK!=sqlite3_e
18020 72 72 63 6f 64 65 28 70 2d 3e 64 62 29 20 29 7b  rrcode(p->db) ){
18030 0a 20 20 20 20 20 20 7a 45 72 72 4d 73 67 20 3d  .      zErrMsg =
18040 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
18050 28 22 25 73 22 2c 20 73 71 6c 69 74 65 33 5f 65  ("%s", sqlite3_e
18060 72 72 6d 73 67 28 70 2d 3e 64 62 29 29 3b 0a 20  rrmsg(p->db));. 
18070 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f       sqlite3_clo
18080 73 65 28 70 2d 3e 64 62 29 3b 0a 20 20 20 20 20  se(p->db);.     
18090 20 70 2d 3e 64 62 20 3d 20 30 3b 0a 20 20 20 20   p->db = 0;.    
180a0 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a  }.  }else{.    z
180b0 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33  ErrMsg = sqlite3
180c0 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20 73  _mprintf("%s", s
180d0 71 6c 69 74 65 33 5f 65 72 72 73 74 72 28 72 63  qlite3_errstr(rc
180e0 29 29 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 53  ));.  }.#ifdef S
180f0 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a  QLITE_HAS_CODEC.
18100 20 20 69 66 28 20 70 2d 3e 64 62 20 29 7b 0a 20    if( p->db ){. 
18110 20 20 20 73 71 6c 69 74 65 33 5f 6b 65 79 28 70     sqlite3_key(p
18120 2d 3e 64 62 2c 20 70 4b 65 79 2c 20 6e 4b 65 79  ->db, pKey, nKey
18130 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
18140 69 66 28 20 70 2d 3e 64 62 3d 3d 30 20 29 7b 0a  if( p->db==0 ){.
18150 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c      Tcl_SetResul
18160 74 28 69 6e 74 65 72 70 2c 20 7a 45 72 72 4d 73  t(interp, zErrMs
18170 67 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29  g, TCL_VOLATILE)
18180 3b 0a 20 20 20 20 54 63 6c 5f 46 72 65 65 28 28  ;.    Tcl_Free((
18190 63 68 61 72 2a 29 70 29 3b 0a 20 20 20 20 73 71  char*)p);.    sq
181a0 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72 4d  lite3_free(zErrM
181b0 73 67 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  sg);.    return 
181c0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
181d0 20 70 2d 3e 6d 61 78 53 74 6d 74 20 3d 20 4e 55   p->maxStmt = NU
181e0 4d 5f 50 52 45 50 41 52 45 44 5f 53 54 4d 54 53  M_PREPARED_STMTS
181f0 3b 0a 20 20 70 2d 3e 69 6e 74 65 72 70 20 3d 20  ;.  p->interp = 
18200 69 6e 74 65 72 70 3b 0a 20 20 7a 41 72 67 20 3d  interp;.  zArg =
18210 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
18220 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 30  omObj(objv[1], 0
18230 29 3b 0a 20 20 69 66 28 20 44 62 55 73 65 4e 72  );.  if( DbUseNr
18240 65 28 29 20 29 7b 0a 20 20 20 20 54 63 6c 5f 4e  e() ){.    Tcl_N
18250 52 43 72 65 61 74 65 43 6f 6d 6d 61 6e 64 28 69  RCreateCommand(i
18260 6e 74 65 72 70 2c 20 7a 41 72 67 2c 20 44 62 4f  nterp, zArg, DbO
18270 62 6a 43 6d 64 41 64 61 70 74 6f 72 2c 20 44 62  bjCmdAdaptor, Db
18280 4f 62 6a 43 6d 64 2c 0a 20 20 20 20 20 20 20 20  ObjCmd,.        
18290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
182a0 28 63 68 61 72 2a 29 70 2c 20 44 62 44 65 6c 65  (char*)p, DbDele
182b0 74 65 43 6d 64 29 3b 0a 20 20 7d 65 6c 73 65 7b  teCmd);.  }else{
182c0 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f  .    Tcl_CreateO
182d0 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70  bjCommand(interp
182e0 2c 20 7a 41 72 67 2c 20 44 62 4f 62 6a 43 6d 64  , zArg, DbObjCmd
182f0 2c 20 28 63 68 61 72 2a 29 70 2c 20 44 62 44 65  , (char*)p, DbDe
18300 6c 65 74 65 43 6d 64 29 3b 0a 20 20 7d 0a 20 20  leteCmd);.  }.  
18310 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
18320 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 76 69 64 65 20  ../*.** Provide 
18330 61 20 64 75 6d 6d 79 20 54 63 6c 5f 49 6e 69 74  a dummy Tcl_Init
18340 53 74 75 62 73 20 69 66 20 77 65 20 61 72 65 20  Stubs if we are 
18350 75 73 69 6e 67 20 74 68 69 73 20 61 73 20 61 20  using this as a 
18360 73 74 61 74 69 63 0a 2a 2a 20 6c 69 62 72 61 72  static.** librar
18370 79 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 55 53  y..*/.#ifndef US
18380 45 5f 54 43 4c 5f 53 54 55 42 53 0a 23 20 75 6e  E_TCL_STUBS.# un
18390 64 65 66 20 20 54 63 6c 5f 49 6e 69 74 53 74 75  def  Tcl_InitStu
183a0 62 73 0a 23 20 64 65 66 69 6e 65 20 54 63 6c 5f  bs.# define Tcl_
183b0 49 6e 69 74 53 74 75 62 73 28 61 2c 62 2c 63 29  InitStubs(a,b,c)
183c0 20 54 43 4c 5f 56 45 52 53 49 4f 4e 0a 23 65 6e   TCL_VERSION.#en
183d0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20  dif../*.** Make 
183e0 73 75 72 65 20 77 65 20 68 61 76 65 20 61 20 50  sure we have a P
183f0 41 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e 20 6d  ACKAGE_VERSION m
18400 61 63 72 6f 20 64 65 66 69 6e 65 64 2e 20 20 54  acro defined.  T
18410 68 69 73 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 64  his will be.** d
18420 65 66 69 6e 65 64 20 61 75 74 6f 6d 61 74 69 63  efined automatic
18430 61 6c 6c 79 20 62 79 20 74 68 65 20 54 45 41 20  ally by the TEA 
18440 6d 61 6b 65 66 69 6c 65 2e 20 20 42 75 74 20 6f  makefile.  But o
18450 74 68 65 72 20 6d 61 6b 65 66 69 6c 65 73 0a 2a  ther makefiles.*
18460 2a 20 64 6f 20 6e 6f 74 20 64 65 66 69 6e 65 20  * do not define 
18470 69 74 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 50  it..*/.#ifndef P
18480 41 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e 0a 23  ACKAGE_VERSION.#
18490 20 64 65 66 69 6e 65 20 50 41 43 4b 41 47 45 5f   define PACKAGE_
184a0 56 45 52 53 49 4f 4e 20 53 51 4c 49 54 45 5f 56  VERSION SQLITE_V
184b0 45 52 53 49 4f 4e 0a 23 65 6e 64 69 66 0a 0a 2f  ERSION.#endif../
184c0 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  *.** Initialize 
184d0 74 68 69 73 20 6d 6f 64 75 6c 65 2e 0a 2a 2a 0a  this module..**.
184e0 2a 2a 20 54 68 69 73 20 54 63 6c 20 6d 6f 64 75  ** This Tcl modu
184f0 6c 65 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 6c 79  le contains only
18500 20 61 20 73 69 6e 67 6c 65 20 6e 65 77 20 54 63   a single new Tc
18510 6c 20 63 6f 6d 6d 61 6e 64 20 6e 61 6d 65 64 20  l command named 
18520 22 73 71 6c 69 74 65 22 2e 0a 2a 2a 20 28 48 65  "sqlite"..** (He
18530 6e 63 65 20 74 68 65 72 65 20 69 73 20 6e 6f 20  nce there is no 
18540 6e 61 6d 65 73 70 61 63 65 2e 20 20 54 68 65 72  namespace.  Ther
18550 65 20 69 73 20 6e 6f 20 70 6f 69 6e 74 20 69 6e  e is no point in
18560 20 75 73 69 6e 67 20 61 20 6e 61 6d 65 73 70 61   using a namespa
18570 63 65 0a 2a 2a 20 69 66 20 74 68 65 20 65 78 74  ce.** if the ext
18580 65 6e 73 69 6f 6e 20 6f 6e 6c 79 20 73 75 70 70  ension only supp
18590 6c 69 65 73 20 6f 6e 65 20 6e 65 77 20 6e 61 6d  lies one new nam
185a0 65 21 29 20 20 54 68 65 20 22 73 71 6c 69 74 65  e!)  The "sqlite
185b0 22 20 63 6f 6d 6d 61 6e 64 20 69 73 0a 2a 2a 20  " command is.** 
185c0 75 73 65 64 20 74 6f 20 6f 70 65 6e 20 61 20 6e  used to open a n
185d0 65 77 20 53 51 4c 69 74 65 20 64 61 74 61 62 61  ew SQLite databa
185e0 73 65 2e 20 20 53 65 65 20 74 68 65 20 44 62 4d  se.  See the DbM
185f0 61 69 6e 28 29 20 72 6f 75 74 69 6e 65 20 61 62  ain() routine ab
18600 6f 76 65 0a 2a 2a 20 66 6f 72 20 61 64 64 69 74  ove.** for addit
18610 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
18620 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 58 54  n..**.** The EXT
18630 45 52 4e 20 6d 61 63 72 6f 73 20 61 72 65 20 72  ERN macros are r
18640 65 71 75 69 72 65 64 20 62 79 20 54 43 4c 20 69  equired by TCL i
18650 6e 20 6f 72 64 65 72 20 74 6f 20 77 6f 72 6b 20  n order to work 
18660 6f 6e 20 77 69 6e 64 6f 77 73 2e 0a 2a 2f 0a 45  on windows..*/.E
18670 58 54 45 52 4e 20 69 6e 74 20 53 71 6c 69 74 65  XTERN int Sqlite
18680 33 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  3_Init(Tcl_Inter
18690 70 20 2a 69 6e 74 65 72 70 29 7b 0a 20 20 69 6e  p *interp){.  in
186a0 74 20 72 63 20 3d 20 54 63 6c 5f 49 6e 69 74 53  t rc = Tcl_InitS
186b0 74 75 62 73 28 69 6e 74 65 72 70 2c 20 22 38 2e  tubs(interp, "8.
186c0 34 22 2c 20 30 29 3d 3d 30 20 3f 20 54 43 4c 5f  4", 0)==0 ? TCL_
186d0 45 52 52 4f 52 20 3a 20 54 43 4c 5f 4f 4b 3b 0a  ERROR : TCL_OK;.
186e0 20 20 69 66 28 20 72 63 3d 3d 54 43 4c 5f 4f 4b    if( rc==TCL_OK
186f0 20 29 7b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61   ){.    Tcl_Crea
18700 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74  teObjCommand(int
18710 65 72 70 2c 20 22 73 71 6c 69 74 65 33 22 2c 20  erp, "sqlite3", 
18720 28 54 63 6c 5f 4f 62 6a 43 6d 64 50 72 6f 63 2a  (Tcl_ObjCmdProc*
18730 29 44 62 4d 61 69 6e 2c 20 30 2c 20 30 29 3b 0a  )DbMain, 0, 0);.
18740 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 33  #ifndef SQLITE_3
18750 5f 53 55 46 46 49 58 5f 4f 4e 4c 59 0a 20 20 20  _SUFFIX_ONLY.   
18760 20 2f 2a 20 54 68 65 20 22 73 71 6c 69 74 65 22   /* The "sqlite"
18770 20 61 6c 69 61 73 20 69 73 20 75 6e 64 6f 63 75   alias is undocu
18780 6d 65 6e 74 65 64 2e 20 20 49 74 20 69 73 20 68  mented.  It is h
18790 65 72 65 20 6f 6e 6c 79 20 74 6f 20 73 75 70 70  ere only to supp
187a0 6f 72 74 0a 20 20 20 20 2a 2a 20 6c 65 67 61 63  ort.    ** legac
187b0 79 20 73 63 72 69 70 74 73 2e 20 20 41 6c 6c 20  y scripts.  All 
187c0 6e 65 77 20 73 63 72 69 70 74 73 20 73 68 6f 75  new scripts shou
187d0 6c 64 20 75 73 65 20 6f 6e 6c 79 20 74 68 65 20  ld use only the 
187e0 22 73 71 6c 69 74 65 33 22 0a 20 20 20 20 2a 2a  "sqlite3".    **
187f0 20 63 6f 6d 6d 61 6e 64 2e 20 2a 2f 0a 20 20 20   command. */.   
18800 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f   Tcl_CreateObjCo
18810 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 73  mmand(interp, "s
18820 71 6c 69 74 65 22 2c 20 28 54 63 6c 5f 4f 62 6a  qlite", (Tcl_Obj
18830 43 6d 64 50 72 6f 63 2a 29 44 62 4d 61 69 6e 2c  CmdProc*)DbMain,
18840 20 30 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20   0, 0);.#endif. 
18850 20 20 20 72 63 20 3d 20 54 63 6c 5f 50 6b 67 50     rc = Tcl_PkgP
18860 72 6f 76 69 64 65 28 69 6e 74 65 72 70 2c 20 22  rovide(interp, "
18870 73 71 6c 69 74 65 33 22 2c 20 50 41 43 4b 41 47  sqlite3", PACKAG
18880 45 5f 56 45 52 53 49 4f 4e 29 3b 0a 20 20 7d 0a  E_VERSION);.  }.
18890 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 45    return rc;.}.E
188a0 58 54 45 52 4e 20 69 6e 74 20 54 63 6c 73 71 6c  XTERN int Tclsql
188b0 69 74 65 33 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  ite3_Init(Tcl_In
188c0 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 20 72  terp *interp){ r
188d0 65 74 75 72 6e 20 53 71 6c 69 74 65 33 5f 49 6e  eturn Sqlite3_In
188e0 69 74 28 69 6e 74 65 72 70 29 3b 20 7d 0a 45 58  it(interp); }.EX
188f0 54 45 52 4e 20 69 6e 74 20 53 71 6c 69 74 65 33  TERN int Sqlite3
18900 5f 55 6e 6c 6f 61 64 28 54 63 6c 5f 49 6e 74 65  _Unload(Tcl_Inte
18910 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20  rp *interp, int 
18920 66 6c 61 67 73 29 7b 20 72 65 74 75 72 6e 20 54  flags){ return T
18930 43 4c 5f 4f 4b 3b 20 7d 0a 45 58 54 45 52 4e 20  CL_OK; }.EXTERN 
18940 69 6e 74 20 54 63 6c 73 71 6c 69 74 65 33 5f 55  int Tclsqlite3_U
18950 6e 6c 6f 61 64 28 54 63 6c 5f 49 6e 74 65 72 70  nload(Tcl_Interp
18960 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 66 6c   *interp, int fl
18970 61 67 73 29 7b 20 72 65 74 75 72 6e 20 54 43 4c  ags){ return TCL
18980 5f 4f 4b 3b 20 7d 0a 0a 2f 2a 20 42 65 63 61 75  _OK; }../* Becau
18990 73 65 20 69 74 20 61 63 63 65 73 73 65 73 20 74  se it accesses t
189a0 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 61  he file-system a
189b0 6e 64 20 75 73 65 73 20 70 65 72 73 69 73 74 65  nd uses persiste
189c0 6e 74 20 73 74 61 74 65 2c 20 53 51 4c 69 74 65  nt state, SQLite
189d0 0a 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6e 73 69  .** is not consi
189e0 64 65 72 65 64 20 61 70 70 72 6f 70 72 69 61 74  dered appropriat
189f0 65 20 66 6f 72 20 73 61 66 65 20 69 6e 74 65 72  e for safe inter
18a00 70 72 65 74 65 72 73 2e 20 20 48 65 6e 63 65 2c  preters.  Hence,
18a10 20 77 65 20 64 65 6c 69 62 65 72 61 74 65 6c 79   we deliberately
18a20 0a 2a 2a 20 6f 6d 69 74 20 74 68 65 20 5f 53 61  .** omit the _Sa
18a30 66 65 49 6e 69 74 28 29 20 69 6e 74 65 72 66 61  feInit() interfa
18a40 63 65 73 2e 0a 2a 2f 0a 0a 23 69 66 6e 64 65 66  ces..*/..#ifndef
18a50 20 53 51 4c 49 54 45 5f 33 5f 53 55 46 46 49 58   SQLITE_3_SUFFIX
18a60 5f 4f 4e 4c 59 0a 69 6e 74 20 53 71 6c 69 74 65  _ONLY.int Sqlite
18a70 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
18a80 20 2a 69 6e 74 65 72 70 29 7b 20 72 65 74 75 72   *interp){ retur
18a90 6e 20 53 71 6c 69 74 65 33 5f 49 6e 69 74 28 69  n Sqlite3_Init(i
18aa0 6e 74 65 72 70 29 3b 20 7d 0a 69 6e 74 20 54 63  nterp); }.int Tc
18ab0 6c 73 71 6c 69 74 65 5f 49 6e 69 74 28 54 63 6c  lsqlite_Init(Tcl
18ac0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29  _Interp *interp)
18ad0 7b 20 72 65 74 75 72 6e 20 53 71 6c 69 74 65 33  { return Sqlite3
18ae0 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 20 7d  _Init(interp); }
18af0 0a 69 6e 74 20 53 71 6c 69 74 65 5f 55 6e 6c 6f  .int Sqlite_Unlo
18b00 61 64 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  ad(Tcl_Interp *i
18b10 6e 74 65 72 70 2c 20 69 6e 74 20 66 6c 61 67 73  nterp, int flags
18b20 29 7b 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  ){ return TCL_OK
18b30 3b 20 7d 0a 69 6e 74 20 54 63 6c 73 71 6c 69 74  ; }.int Tclsqlit
18b40 65 5f 55 6e 6c 6f 61 64 28 54 63 6c 5f 49 6e 74  e_Unload(Tcl_Int
18b50 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74  erp *interp, int
18b60 20 66 6c 61 67 73 29 7b 20 72 65 74 75 72 6e 20   flags){ return 
18b70 54 43 4c 5f 4f 4b 3b 20 7d 0a 23 65 6e 64 69 66  TCL_OK; }.#endif
18b80 0a 0a 23 69 66 64 65 66 20 54 43 4c 53 48 0a 2f  ..#ifdef TCLSH./
18b90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18ba0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18bb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18bc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18bd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
18be0 20 41 6c 6c 20 6f 66 20 74 68 65 20 63 6f 64 65   All of the code
18bf0 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20 69 73   that follows is
18c00 20 75 73 65 64 20 74 6f 20 62 75 69 6c 64 20 73   used to build s
18c10 74 61 6e 64 61 6c 6f 6e 65 20 54 43 4c 20 69 6e  tandalone TCL in
18c20 74 65 72 70 72 65 74 65 72 73 0a 2a 2a 20 74 68  terpreters.** th
18c30 61 74 20 61 72 65 20 73 74 61 74 69 63 61 6c 6c  at are staticall
18c40 79 20 6c 69 6e 6b 65 64 20 77 69 74 68 20 53 51  y linked with SQ
18c50 4c 69 74 65 2e 20 20 45 6e 61 62 6c 65 20 74 68  Lite.  Enable th
18c60 65 73 65 20 62 79 20 63 6f 6d 70 69 6c 69 6e 67  ese by compiling
18c70 0a 2a 2a 20 77 69 74 68 20 2d 44 54 43 4c 53 48  .** with -DTCLSH
18c80 3d 6e 20 77 68 65 72 65 20 6e 20 63 61 6e 20 62  =n where n can b
18c90 65 20 31 20 6f 72 20 32 2e 20 20 41 6e 20 6e 20  e 1 or 2.  An n 
18ca0 6f 66 20 31 20 67 65 6e 65 72 61 74 65 73 20 61  of 1 generates a
18cb0 20 73 74 61 6e 64 61 72 64 0a 2a 2a 20 74 63 6c   standard.** tcl
18cc0 73 68 20 62 75 74 20 77 69 74 68 20 53 51 4c 69  sh but with SQLi
18cd0 74 65 20 62 75 69 6c 74 20 69 6e 2e 20 20 41 6e  te built in.  An
18ce0 20 6e 20 6f 66 20 32 20 67 65 6e 65 72 61 74 65   n of 2 generate
18cf0 73 20 74 68 65 20 53 51 4c 69 74 65 20 73 70 61  s the SQLite spa
18d00 63 65 0a 2a 2a 20 61 6e 61 6c 79 73 69 73 20 70  ce.** analysis p
18d10 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 0a 23 69 66 20  rogram..*/..#if 
18d20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
18d30 45 53 54 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  EST) || defined(
18d40 53 51 4c 49 54 45 5f 54 43 4c 4d 44 35 29 0a 2f  SQLITE_TCLMD5)./
18d50 2a 0a 20 2a 20 54 68 69 73 20 63 6f 64 65 20 69  *. * This code i
18d60 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 4d 44  mplements the MD
18d70 35 20 6d 65 73 73 61 67 65 2d 64 69 67 65 73 74  5 message-digest
18d80 20 61 6c 67 6f 72 69 74 68 6d 2e 0a 20 2a 20 54   algorithm.. * T
18d90 68 65 20 61 6c 67 6f 72 69 74 68 6d 20 69 73 20  he algorithm is 
18da0 64 75 65 20 74 6f 20 52 6f 6e 20 52 69 76 65 73  due to Ron Rives
18db0 74 2e 20 20 54 68 69 73 20 63 6f 64 65 20 77 61  t.  This code wa
18dc0 73 0a 20 2a 20 77 72 69 74 74 65 6e 20 62 79 20  s. * written by 
18dd0 43 6f 6c 69 6e 20 50 6c 75 6d 62 20 69 6e 20 31  Colin Plumb in 1
18de0 39 39 33 2c 20 6e 6f 20 63 6f 70 79 72 69 67 68  993, no copyrigh
18df0 74 20 69 73 20 63 6c 61 69 6d 65 64 2e 0a 20 2a  t is claimed.. *
18e00 20 54 68 69 73 20 63 6f 64 65 20 69 73 20 69 6e   This code is in
18e10 20 74 68 65 20 70 75 62 6c 69 63 20 64 6f 6d 61   the public doma
18e20 69 6e 3b 20 64 6f 20 77 69 74 68 20 69 74 20 77  in; do with it w
18e30 68 61 74 20 79 6f 75 20 77 69 73 68 2e 0a 20 2a  hat you wish.. *
18e40 0a 20 2a 20 45 71 75 69 76 61 6c 65 6e 74 20 63  . * Equivalent c
18e50 6f 64 65 20 69 73 20 61 76 61 69 6c 61 62 6c 65  ode is available
18e60 20 66 72 6f 6d 20 52 53 41 20 44 61 74 61 20 53   from RSA Data S
18e70 65 63 75 72 69 74 79 2c 20 49 6e 63 2e 0a 20 2a  ecurity, Inc.. *
18e80 20 54 68 69 73 20 63 6f 64 65 20 68 61 73 20 62   This code has b
18e90 65 65 6e 20 74 65 73 74 65 64 20 61 67 61 69 6e  een tested again
18ea0 73 74 20 74 68 61 74 2c 20 61 6e 64 20 69 73 20  st that, and is 
18eb0 65 71 75 69 76 61 6c 65 6e 74 2c 0a 20 2a 20 65  equivalent,. * e
18ec0 78 63 65 70 74 20 74 68 61 74 20 79 6f 75 20 64  xcept that you d
18ed0 6f 6e 27 74 20 6e 65 65 64 20 74 6f 20 69 6e 63  on't need to inc
18ee0 6c 75 64 65 20 74 77 6f 20 70 61 67 65 73 20 6f  lude two pages o
18ef0 66 20 6c 65 67 61 6c 65 73 65 0a 20 2a 20 77 69  f legalese. * wi
18f00 74 68 20 65 76 65 72 79 20 63 6f 70 79 2e 0a 20  th every copy.. 
18f10 2a 0a 20 2a 20 54 6f 20 63 6f 6d 70 75 74 65 20  *. * To compute 
18f20 74 68 65 20 6d 65 73 73 61 67 65 20 64 69 67 65  the message dige
18f30 73 74 20 6f 66 20 61 20 63 68 75 6e 6b 20 6f 66  st of a chunk of
18f40 20 62 79 74 65 73 2c 20 64 65 63 6c 61 72 65 20   bytes, declare 
18f50 61 6e 0a 20 2a 20 4d 44 35 43 6f 6e 74 65 78 74  an. * MD5Context
18f60 20 73 74 72 75 63 74 75 72 65 2c 20 70 61 73 73   structure, pass
18f70 20 69 74 20 74 6f 20 4d 44 35 49 6e 69 74 2c 20   it to MD5Init, 
18f80 63 61 6c 6c 20 4d 44 35 55 70 64 61 74 65 20 61  call MD5Update a
18f90 73 0a 20 2a 20 6e 65 65 64 65 64 20 6f 6e 20 62  s. * needed on b
18fa0 75 66 66 65 72 73 20 66 75 6c 6c 20 6f 66 20 62  uffers full of b
18fb0 79 74 65 73 2c 20 61 6e 64 20 74 68 65 6e 20 63  ytes, and then c
18fc0 61 6c 6c 20 4d 44 35 46 69 6e 61 6c 2c 20 77 68  all MD5Final, wh
18fd0 69 63 68 0a 20 2a 20 77 69 6c 6c 20 66 69 6c 6c  ich. * will fill
18fe0 20 61 20 73 75 70 70 6c 69 65 64 20 31 36 2d 62   a supplied 16-b
18ff0 79 74 65 20 61 72 72 61 79 20 77 69 74 68 20 74  yte array with t
19000 68 65 20 64 69 67 65 73 74 2e 0a 20 2a 2f 0a 0a  he digest.. */..
19010 2f 2a 0a 20 2a 20 49 66 20 63 6f 6d 70 69 6c 65  /*. * If compile
19020 64 20 6f 6e 20 61 20 6d 61 63 68 69 6e 65 20 74  d on a machine t
19030 68 61 74 20 64 6f 65 73 6e 27 74 20 68 61 76 65  hat doesn't have
19040 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65   a 32-bit intege
19050 72 2c 0a 20 2a 20 79 6f 75 20 6a 75 73 74 20 73  r,. * you just s
19060 65 74 20 22 75 69 6e 74 33 32 22 20 74 6f 20 74  et "uint32" to t
19070 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 64  he appropriate d
19080 61 74 61 74 79 70 65 20 66 6f 72 20 61 6e 0a 20  atatype for an. 
19090 2a 20 75 6e 73 69 67 6e 65 64 20 33 32 2d 62 69  * unsigned 32-bi
190a0 74 20 69 6e 74 65 67 65 72 2e 20 20 46 6f 72 20  t integer.  For 
190b0 65 78 61 6d 70 6c 65 3a 0a 20 2a 0a 20 2a 20 20  example:. *. *  
190c0 20 20 20 20 20 63 63 20 2d 44 75 69 6e 74 33 32       cc -Duint32
190d0 3d 27 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 27  ='unsigned long'
190e0 20 6d 64 35 2e 63 0a 20 2a 0a 20 2a 2f 0a 23 69   md5.c. *. */.#i
190f0 66 6e 64 65 66 20 75 69 6e 74 33 32 0a 23 20 20  fndef uint32.#  
19100 64 65 66 69 6e 65 20 75 69 6e 74 33 32 20 75 6e  define uint32 un
19110 73 69 67 6e 65 64 20 69 6e 74 0a 23 65 6e 64 69  signed int.#endi
19120 66 0a 0a 73 74 72 75 63 74 20 4d 44 35 43 6f 6e  f..struct MD5Con
19130 74 65 78 74 20 7b 0a 20 20 69 6e 74 20 69 73 49  text {.  int isI
19140 6e 69 74 3b 0a 20 20 75 69 6e 74 33 32 20 62 75  nit;.  uint32 bu
19150 66 5b 34 5d 3b 0a 20 20 75 69 6e 74 33 32 20 62  f[4];.  uint32 b
19160 69 74 73 5b 32 5d 3b 0a 20 20 75 6e 73 69 67 6e  its[2];.  unsign
19170 65 64 20 63 68 61 72 20 69 6e 5b 36 34 5d 3b 0a  ed char in[64];.
19180 7d 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  };.typedef struc
19190 74 20 4d 44 35 43 6f 6e 74 65 78 74 20 4d 44 35  t MD5Context MD5
191a0 43 6f 6e 74 65 78 74 3b 0a 0a 2f 2a 0a 20 2a 20  Context;../*. * 
191b0 4e 6f 74 65 3a 20 74 68 69 73 20 63 6f 64 65 20  Note: this code 
191c0 69 73 20 68 61 72 6d 6c 65 73 73 20 6f 6e 20 6c  is harmless on l
191d0 69 74 74 6c 65 2d 65 6e 64 69 61 6e 20 6d 61 63  ittle-endian mac
191e0 68 69 6e 65 73 2e 0a 20 2a 2f 0a 73 74 61 74 69  hines.. */.stati
191f0 63 20 76 6f 69 64 20 62 79 74 65 52 65 76 65 72  c void byteRever
19200 73 65 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61  se (unsigned cha
19210 72 20 2a 62 75 66 2c 20 75 6e 73 69 67 6e 65 64  r *buf, unsigned
19220 20 6c 6f 6e 67 73 29 7b 0a 20 20 20 20 20 20 20   longs){.       
19230 20 75 69 6e 74 33 32 20 74 3b 0a 20 20 20 20 20   uint32 t;.     
19240 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 20 20     do {.        
19250 20 20 20 20 20 20 20 20 74 20 3d 20 28 75 69 6e          t = (uin
19260 74 33 32 29 28 28 75 6e 73 69 67 6e 65 64 29 62  t32)((unsigned)b
19270 75 66 5b 33 5d 3c 3c 38 20 7c 20 62 75 66 5b 32  uf[3]<<8 | buf[2
19280 5d 29 20 3c 3c 20 31 36 20 7c 0a 20 20 20 20 20  ]) << 16 |.     
19290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
192a0 20 20 20 20 20 20 20 28 28 75 6e 73 69 67 6e 65         ((unsigne
192b0 64 29 62 75 66 5b 31 5d 3c 3c 38 20 7c 20 62 75  d)buf[1]<<8 | bu
192c0 66 5b 30 5d 29 3b 0a 20 20 20 20 20 20 20 20 20  f[0]);.         
192d0 20 20 20 20 20 20 20 2a 28 75 69 6e 74 33 32 20         *(uint32 
192e0 2a 29 62 75 66 20 3d 20 74 3b 0a 20 20 20 20 20  *)buf = t;.     
192f0 20 20 20 20 20 20 20 20 20 20 20 62 75 66 20 2b             buf +
19300 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 7d 20 77  = 4;.        } w
19310 68 69 6c 65 20 28 2d 2d 6c 6f 6e 67 73 29 3b 0a  hile (--longs);.
19320 7d 0a 2f 2a 20 54 68 65 20 66 6f 75 72 20 63 6f  }./* The four co
19330 72 65 20 66 75 6e 63 74 69 6f 6e 73 20 2d 20 46  re functions - F
19340 31 20 69 73 20 6f 70 74 69 6d 69 7a 65 64 20 73  1 is optimized s
19350 6f 6d 65 77 68 61 74 20 2a 2f 0a 0a 2f 2a 20 23  omewhat */../* #
19360 64 65 66 69 6e 65 20 46 31 28 78 2c 20 79 2c 20  define F1(x, y, 
19370 7a 29 20 28 78 20 26 20 79 20 7c 20 7e 78 20 26  z) (x & y | ~x &
19380 20 7a 29 20 2a 2f 0a 23 64 65 66 69 6e 65 20 46   z) */.#define F
19390 31 28 78 2c 20 79 2c 20 7a 29 20 28 7a 20 5e 20  1(x, y, z) (z ^ 
193a0 28 78 20 26 20 28 79 20 5e 20 7a 29 29 29 0a 23  (x & (y ^ z))).#
193b0 64 65 66 69 6e 65 20 46 32 28 78 2c 20 79 2c 20  define F2(x, y, 
193c0 7a 29 20 46 31 28 7a 2c 20 78 2c 20 79 29 0a 23  z) F1(z, x, y).#
193d0 64 65 66 69 6e 65 20 46 33 28 78 2c 20 79 2c 20  define F3(x, y, 
193e0 7a 29 20 28 78 20 5e 20 79 20 5e 20 7a 29 0a 23  z) (x ^ y ^ z).#
193f0 64 65 66 69 6e 65 20 46 34 28 78 2c 20 79 2c 20  define F4(x, y, 
19400 7a 29 20 28 79 20 5e 20 28 78 20 7c 20 7e 7a 29  z) (y ^ (x | ~z)
19410 29 0a 0a 2f 2a 20 54 68 69 73 20 69 73 20 74 68  )../* This is th
19420 65 20 63 65 6e 74 72 61 6c 20 73 74 65 70 20 69  e central step i
19430 6e 20 74 68 65 20 4d 44 35 20 61 6c 67 6f 72 69  n the MD5 algori
19440 74 68 6d 2e 20 2a 2f 0a 23 64 65 66 69 6e 65 20  thm. */.#define 
19450 4d 44 35 53 54 45 50 28 66 2c 20 77 2c 20 78 2c  MD5STEP(f, w, x,
19460 20 79 2c 20 7a 2c 20 64 61 74 61 2c 20 73 29 20   y, z, data, s) 
19470 5c 0a 20 20 20 20 20 20 20 20 28 20 77 20 2b 3d  \.        ( w +=
19480 20 66 28 78 2c 20 79 2c 20 7a 29 20 2b 20 64 61   f(x, y, z) + da
19490 74 61 2c 20 20 77 20 3d 20 77 3c 3c 73 20 7c 20  ta,  w = w<<s | 
194a0 77 3e 3e 28 33 32 2d 73 29 2c 20 20 77 20 2b 3d  w>>(32-s),  w +=
194b0 20 78 20 29 0a 0a 2f 2a 0a 20 2a 20 54 68 65 20   x )../*. * The 
194c0 63 6f 72 65 20 6f 66 20 74 68 65 20 4d 44 35 20  core of the MD5 
194d0 61 6c 67 6f 72 69 74 68 6d 2c 20 74 68 69 73 20  algorithm, this 
194e0 61 6c 74 65 72 73 20 61 6e 20 65 78 69 73 74 69  alters an existi
194f0 6e 67 20 4d 44 35 20 68 61 73 68 20 74 6f 0a 20  ng MD5 hash to. 
19500 2a 20 72 65 66 6c 65 63 74 20 74 68 65 20 61 64  * reflect the ad
19510 64 69 74 69 6f 6e 20 6f 66 20 31 36 20 6c 6f 6e  dition of 16 lon
19520 67 77 6f 72 64 73 20 6f 66 20 6e 65 77 20 64 61  gwords of new da
19530 74 61 2e 20 20 4d 44 35 55 70 64 61 74 65 20 62  ta.  MD5Update b
19540 6c 6f 63 6b 73 0a 20 2a 20 74 68 65 20 64 61 74  locks. * the dat
19550 61 20 61 6e 64 20 63 6f 6e 76 65 72 74 73 20 62  a and converts b
19560 79 74 65 73 20 69 6e 74 6f 20 6c 6f 6e 67 77 6f  ytes into longwo
19570 72 64 73 20 66 6f 72 20 74 68 69 73 20 72 6f 75  rds for this rou
19580 74 69 6e 65 2e 0a 20 2a 2f 0a 73 74 61 74 69 63  tine.. */.static
19590 20 76 6f 69 64 20 4d 44 35 54 72 61 6e 73 66 6f   void MD5Transfo
195a0 72 6d 28 75 69 6e 74 33 32 20 62 75 66 5b 34 5d  rm(uint32 buf[4]
195b0 2c 20 63 6f 6e 73 74 20 75 69 6e 74 33 32 20 69  , const uint32 i
195c0 6e 5b 31 36 5d 29 7b 0a 20 20 20 20 20 20 20 20  n[16]){.        
195d0 72 65 67 69 73 74 65 72 20 75 69 6e 74 33 32 20  register uint32 
195e0 61 2c 20 62 2c 20 63 2c 20 64 3b 0a 0a 20 20 20  a, b, c, d;..   
195f0 20 20 20 20 20 61 20 3d 20 62 75 66 5b 30 5d 3b       a = buf[0];
19600 0a 20 20 20 20 20 20 20 20 62 20 3d 20 62 75 66  .        b = buf
19610 5b 31 5d 3b 0a 20 20 20 20 20 20 20 20 63 20 3d  [1];.        c =
19620 20 62 75 66 5b 32 5d 3b 0a 20 20 20 20 20 20 20   buf[2];.       
19630 20 64 20 3d 20 62 75 66 5b 33 5d 3b 0a 0a 20 20   d = buf[3];..  
19640 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 31        MD5STEP(F1
19650 2c 20 61 2c 20 62 2c 20 63 2c 20 64 2c 20 69 6e  , a, b, c, d, in
19660 5b 20 30 5d 2b 30 78 64 37 36 61 61 34 37 38 2c  [ 0]+0xd76aa478,
19670 20 20 37 29 3b 0a 20 20 20 20 20 20 20 20 4d 44    7);.        MD
19680 35 53 54 45 50 28 46 31 2c 20 64 2c 20 61 2c 20  5STEP(F1, d, a, 
19690 62 2c 20 63 2c 20 69 6e 5b 20 31 5d 2b 30 78 65  b, c, in[ 1]+0xe
196a0 38 63 37 62 37 35 36 2c 20 31 32 29 3b 0a 20 20  8c7b756, 12);.  
196b0 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 31        MD5STEP(F1
196c0 2c 20 63 2c 20 64 2c 20 61 2c 20 62 2c 20 69 6e  , c, d, a, b, in
196d0 5b 20 32 5d 2b 30 78 32 34 32 30 37 30 64 62 2c  [ 2]+0x242070db,
196e0 20 31 37 29 3b 0a 20 20 20 20 20 20 20 20 4d 44   17);.        MD
196f0 35 53 54 45 50 28 46 31 2c 20 62 2c 20 63 2c 20  5STEP(F1, b, c, 
19700 64 2c 20 61 2c 20 69 6e 5b 20 33 5d 2b 30 78 63  d, a, in[ 3]+0xc
19710 31 62 64 63 65 65 65 2c 20 32 32 29 3b 0a 20 20  1bdceee, 22);.  
19720 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 31        MD5STEP(F1
19730 2c 20 61 2c 20 62 2c 20 63 2c 20 64 2c 20 69 6e  , a, b, c, d, in
19740 5b 20 34 5d 2b 30 78 66 35 37 63 30 66 61 66 2c  [ 4]+0xf57c0faf,
19750 20 20 37 29 3b 0a 20 20 20 20 20 20 20 20 4d 44    7);.        MD
19760 35 53 54 45 50 28 46 31 2c 20 64 2c 20 61 2c 20  5STEP(F1, d, a, 
19770 62 2c 20 63 2c 20 69 6e 5b 20 35 5d 2b 30 78 34  b, c, in[ 5]+0x4
19780 37 38 37 63 36 32 61 2c 20 31 32 29 3b 0a 20 20  787c62a, 12);.  
19790 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 31        MD5STEP(F1
197a0 2c 20 63 2c 20 64 2c 20 61 2c 20 62 2c 20 69 6e  , c, d, a, b, in
197b0 5b 20 36 5d 2b 30 78 61 38 33 30 34 36 31 33 2c  [ 6]+0xa8304613,
197c0 20 31 37 29 3b 0a 20 20 20 20 20 20 20 20 4d 44   17);.        MD
197d0 35 53 54 45 50 28 46 31 2c 20 62 2c 20 63 2c 20  5STEP(F1, b, c, 
197e0 64 2c 20 61 2c 20 69 6e 5b 20 37 5d 2b 30 78 66  d, a, in[ 7]+0xf
197f0 64 34 36 39 35 30 31 2c 20 32 32 29 3b 0a 20 20  d469501, 22);.  
19800 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 31        MD5STEP(F1
19810 2c 20 61 2c 20 62 2c 20 63 2c 20 64 2c 20 69 6e  , a, b, c, d, in
19820 5b 20 38 5d 2b 30 78 36 39 38 30 39 38 64 38 2c  [ 8]+0x698098d8,
19830 20 20 37 29 3b 0a 20 20 20 20 20 20 20 20 4d 44    7);.        MD
19840 35 53 54 45 50 28 46 31 2c 20 64 2c 20 61 2c 20  5STEP(F1, d, a, 
19850 62 2c 20 63 2c 20 69 6e 5b 20 39 5d 2b 30 78 38  b, c, in[ 9]+0x8
19860 62 34 34 66 37 61 66 2c 20 31 32 29 3b 0a 20 20  b44f7af, 12);.  
19870 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 31        MD5STEP(F1
19880 2c 20 63 2c 20 64 2c 20 61 2c 20 62 2c 20 69 6e  , c, d, a, b, in
19890 5b 31 30 5d 2b 30 78 66 66 66 66 35 62 62 31 2c  [10]+0xffff5bb1,
198a0 20 31 37 29 3b 0a 20 20 20 20 20 20 20 20 4d 44   17);.        MD
198b0 35 53 54 45 50 28 46 31 2c 20 62 2c 20 63 2c 20  5STEP(F1, b, c, 
198c0 64 2c 20 61 2c 20 69 6e 5b 31 31 5d 2b 30 78 38  d, a, in[11]+0x8
198d0 39 35 63 64 37 62 65 2c 20 32 32 29 3b 0a 20 20  95cd7be, 22);.  
198e0 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 31        MD5STEP(F1
198f0 2c 20 61 2c 20 62 2c 20 63 2c 20 64 2c 20 69 6e  , a, b, c, d, in
19900 5b 31 32 5d 2b 30 78 36 62 39 30 31 31 32 32 2c  [12]+0x6b901122,
19910 20 20 37 29 3b 0a 20 20 20 20 20 20 20 20 4d 44    7);.        MD
19920 35 53 54 45 50 28 46 31 2c 20 64 2c 20 61 2c 20  5STEP(F1, d, a, 
19930 62 2c 20 63 2c 20 69 6e 5b 31 33 5d 2b 30 78 66  b, c, in[13]+0xf
19940 64 39 38 37 31 39 33 2c 20 31 32 29 3b 0a 20 20  d987193, 12);.  
19950 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 31        MD5STEP(F1
19960 2c 20 63 2c 20 64 2c 20 61 2c 20 62 2c 20 69 6e  , c, d, a, b, in
19970 5b 31 34 5d 2b 30 78 61 36 37 39 34 33 38 65 2c  [14]+0xa679438e,
19980 20 31 37 29 3b 0a 20 20 20 20 20 20 20 20 4d 44   17);.        MD
19990 35 53 54 45 50 28 46 31 2c 20 62 2c 20 63 2c 20  5STEP(F1, b, c, 
199a0 64 2c 20 61 2c 20 69 6e 5b 31 35 5d 2b 30 78 34  d, a, in[15]+0x4
199b0 39 62 34 30 38 32 31 2c 20 32 32 29 3b 0a 0a 20  9b40821, 22);.. 
199c0 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
199d0 32 2c 20 61 2c 20 62 2c 20 63 2c 20 64 2c 20 69  2, a, b, c, d, i
199e0 6e 5b 20 31 5d 2b 30 78 66 36 31 65 32 35 36 32  n[ 1]+0xf61e2562
199f0 2c 20 20 35 29 3b 0a 20 20 20 20 20 20 20 20 4d  ,  5);.        M
19a00 44 35 53 54 45 50 28 46 32 2c 20 64 2c 20 61 2c  D5STEP(F2, d, a,
19a10 20 62 2c 20 63 2c 20 69 6e 5b 20 36 5d 2b 30 78   b, c, in[ 6]+0x
19a20 63 30 34 30 62 33 34 30 2c 20 20 39 29 3b 0a 20  c040b340,  9);. 
19a30 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
19a40 32 2c 20 63 2c 20 64 2c 20 61 2c 20 62 2c 20 69  2, c, d, a, b, i
19a50 6e 5b 31 31 5d 2b 30 78 32 36 35 65 35 61 35 31  n[11]+0x265e5a51
19a60 2c 20 31 34 29 3b 0a 20 20 20 20 20 20 20 20 4d  , 14);.        M
19a70 44 35 53 54 45 50 28 46 32 2c 20 62 2c 20 63 2c  D5STEP(F2, b, c,
19a80 20 64 2c 20 61 2c 20 69 6e 5b 20 30 5d 2b 30 78   d, a, in[ 0]+0x
19a90 65 39 62 36 63 37 61 61 2c 20 32 30 29 3b 0a 20  e9b6c7aa, 20);. 
19aa0 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
19ab0 32 2c 20 61 2c 20 62 2c 20 63 2c 20 64 2c 20 69  2, a, b, c, d, i
19ac0 6e 5b 20 35 5d 2b 30 78 64 36 32 66 31 30 35 64  n[ 5]+0xd62f105d
19ad0 2c 20 20 35 29 3b 0a 20 20 20 20 20 20 20 20 4d  ,  5);.        M
19ae0 44 35 53 54 45 50 28 46 32 2c 20 64 2c 20 61 2c  D5STEP(F2, d, a,
19af0 20 62 2c 20 63 2c 20 69 6e 5b 31 30 5d 2b 30 78   b, c, in[10]+0x
19b00 30 32 34 34 31 34 35 33 2c 20 20 39 29 3b 0a 20  02441453,  9);. 
19b10 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
19b20 32 2c 20 63 2c 20 64 2c 20 61 2c 20 62 2c 20 69  2, c, d, a, b, i
19b30 6e 5b 31 35 5d 2b 30 78 64 38 61 31 65 36 38 31  n[15]+0xd8a1e681
19b40 2c 20 31 34 29 3b 0a 20 20 20 20 20 20 20 20 4d  , 14);.        M
19b50 44 35 53 54 45 50 28 46 32 2c 20 62 2c 20 63 2c  D5STEP(F2, b, c,
19b60 20 64 2c 20 61 2c 20 69 6e 5b 20 34 5d 2b 30 78   d, a, in[ 4]+0x
19b70 65 37 64 33 66 62 63 38 2c 20 32 30 29 3b 0a 20  e7d3fbc8, 20);. 
19b80 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
19b90 32 2c 20 61 2c 20 62 2c 20 63 2c 20 64 2c 20 69  2, a, b, c, d, i
19ba0 6e 5b 20 39 5d 2b 30 78 32 31 65 31 63 64 65 36  n[ 9]+0x21e1cde6
19bb0 2c 20 20 35 29 3b 0a 20 20 20 20 20 20 20 20 4d  ,  5);.        M
19bc0 44 35 53 54 45 50 28 46 32 2c 20 64 2c 20 61 2c  D5STEP(F2, d, a,
19bd0 20 62 2c 20 63 2c 20 69 6e 5b 31 34 5d 2b 30 78   b, c, in[14]+0x
19be0 63 33 33 37 30 37 64 36 2c 20 20 39 29 3b 0a 20  c33707d6,  9);. 
19bf0 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
19c00 32 2c 20 63 2c 20 64 2c 20 61 2c 20 62 2c 20 69  2, c, d, a, b, i
19c10 6e 5b 20 33 5d 2b 30 78 66 34 64 35 30 64 38 37  n[ 3]+0xf4d50d87
19c20 2c 20 31 34 29 3b 0a 20 20 20 20 20 20 20 20 4d  , 14);.        M
19c30 44 35 53 54 45 50 28 46 32 2c 20 62 2c 20 63 2c  D5STEP(F2, b, c,
19c40 20 64 2c 20 61 2c 20 69 6e 5b 20 38 5d 2b 30 78   d, a, in[ 8]+0x
19c50 34 35 35 61 31 34 65 64 2c 20 32 30 29 3b 0a 20  455a14ed, 20);. 
19c60 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
19c70 32 2c 20 61 2c 20 62 2c 20 63 2c 20 64 2c 20 69  2, a, b, c, d, i
19c80 6e 5b 31 33 5d 2b 30 78 61 39 65 33 65 39 30 35  n[13]+0xa9e3e905
19c90 2c 20 20 35 29 3b 0a 20 20 20 20 20 20 20 20 4d  ,  5);.        M
19ca0 44 35 53 54 45 50 28 46 32 2c 20 64 2c 20 61 2c  D5STEP(F2, d, a,
19cb0 20 62 2c 20 63 2c 20 69 6e 5b 20 32 5d 2b 30 78   b, c, in[ 2]+0x
19cc0 66 63 65 66 61 33 66 38 2c 20 20 39 29 3b 0a 20  fcefa3f8,  9);. 
19cd0 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
19ce0 32 2c 20 63 2c 20 64 2c 20 61 2c 20 62 2c 20 69  2, c, d, a, b, i
19cf0 6e 5b 20 37 5d 2b 30 78 36 37 36 66 30 32 64 39  n[ 7]+0x676f02d9
19d00 2c 20 31 34 29 3b 0a 20 20 20 20 20 20 20 20 4d  , 14);.        M
19d10 44 35 53 54 45 50 28 46 32 2c 20 62 2c 20 63 2c  D5STEP(F2, b, c,
19d20 20 64 2c 20 61 2c 20 69 6e 5b 31 32 5d 2b 30 78   d, a, in[12]+0x
19d30 38 64 32 61 34 63 38 61 2c 20 32 30 29 3b 0a 0a  8d2a4c8a, 20);..
19d40 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28          MD5STEP(
19d50 46 33 2c 20 61 2c 20 62 2c 20 63 2c 20 64 2c 20  F3, a, b, c, d, 
19d60 69 6e 5b 20 35 5d 2b 30 78 66 66 66 61 33 39 34  in[ 5]+0xfffa394
19d70 32 2c 20 20 34 29 3b 0a 20 20 20 20 20 20 20 20  2,  4);.        
19d80 4d 44 35 53 54 45 50 28 46 33 2c 20 64 2c 20 61  MD5STEP(F3, d, a
19d90 2c 20 62 2c 20 63 2c 20 69 6e 5b 20 38 5d 2b 30  , b, c, in[ 8]+0
19da0 78 38 37 37 31 66 36 38 31 2c 20 31 31 29 3b 0a  x8771f681, 11);.
19db0 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28          MD5STEP(
19dc0 46 33 2c 20 63 2c 20 64 2c 20 61 2c 20 62 2c 20  F3, c, d, a, b, 
19dd0 69 6e 5b 31 31 5d 2b 30 78 36 64 39 64 36 31 32  in[11]+0x6d9d612
19de0 32 2c 20 31 36 29 3b 0a 20 20 20 20 20 20 20 20  2, 16);.        
19df0 4d 44 35 53 54 45 50 28 46 33 2c 20 62 2c 20 63  MD5STEP(F3, b, c
19e00 2c 20 64 2c 20 61 2c 20 69 6e 5b 31 34 5d 2b 30  , d, a, in[14]+0
19e10 78 66 64 65 35 33 38 30 63 2c 20 32 33 29 3b 0a  xfde5380c, 23);.
19e20 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28          MD5STEP(
19e30 46 33 2c 20 61 2c 20 62 2c 20 63 2c 20 64 2c 20  F3, a, b, c, d, 
19e40 69 6e 5b 20 31 5d 2b 30 78 61 34 62 65 65 61 34  in[ 1]+0xa4beea4
19e50 34 2c 20 20 34 29 3b 0a 20 20 20 20 20 20 20 20  4,  4);.        
19e60 4d 44 35 53 54 45 50 28 46 33 2c 20 64 2c 20 61  MD5STEP(F3, d, a
19e70 2c 20 62 2c 20 63 2c 20 69 6e 5b 20 34 5d 2b 30  , b, c, in[ 4]+0
19e80 78 34 62 64 65 63 66 61 39 2c 20 31 31 29 3b 0a  x4bdecfa9, 11);.
19e90 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28          MD5STEP(
19ea0 46 33 2c 20 63 2c 20 64 2c 20 61 2c 20 62 2c 20  F3, c, d, a, b, 
19eb0 69 6e 5b 20 37 5d 2b 30 78 66 36 62 62 34 62 36  in[ 7]+0xf6bb4b6
19ec0 30 2c 20 31 36 29 3b 0a 20 20 20 20 20 20 20 20  0, 16);.        
19ed0 4d 44 35 53 54 45 50 28 46 33 2c 20 62 2c 20 63  MD5STEP(F3, b, c
19ee0 2c 20 64 2c 20 61 2c 20 69 6e 5b 31 30 5d 2b 30  , d, a, in[10]+0
19ef0 78 62 65 62 66 62 63 37 30 2c 20 32 33 29 3b 0a  xbebfbc70, 23);.
19f00 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28          MD5STEP(
19f10 46 33 2c 20 61 2c 20 62 2c 20 63 2c 20 64 2c 20  F3, a, b, c, d, 
19f20 69 6e 5b 31 33 5d 2b 30 78 32 38 39 62 37 65 63  in[13]+0x289b7ec
19f30 36 2c 20 20 34 29 3b 0a 20 20 20 20 20 20 20 20  6,  4);.        
19f40 4d 44 35 53 54 45 50 28 46 33 2c 20 64 2c 20 61  MD5STEP(F3, d, a
19f50 2c 20 62 2c 20 63 2c 20 69 6e 5b 20 30 5d 2b 30  , b, c, in[ 0]+0
19f60 78 65 61 61 31 32 37 66 61 2c 20 31 31 29 3b 0a  xeaa127fa, 11);.
19f70 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28          MD5STEP(
19f80 46 33 2c 20 63 2c 20 64 2c 20 61 2c 20 62 2c 20  F3, c, d, a, b, 
19f90 69 6e 5b 20 33 5d 2b 30 78 64 34 65 66 33 30 38  in[ 3]+0xd4ef308
19fa0 35 2c 20 31 36 29 3b 0a 20 20 20 20 20 20 20 20  5, 16);.        
19fb0 4d 44 35 53 54 45 50 28 46 33 2c 20 62 2c 20 63  MD5STEP(F3, b, c
19fc0 2c 20 64 2c 20 61 2c 20 69 6e 5b 20 36 5d 2b 30  , d, a, in[ 6]+0
19fd0 78 30 34 38 38 31 64 30 35 2c 20 32 33 29 3b 0a  x04881d05, 23);.
19fe0 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28          MD5STEP(
19ff0 46 33 2c 20 61 2c 20 62 2c 20 63 2c 20 64 2c 20  F3, a, b, c, d, 
1a000 69 6e 5b 20 39 5d 2b 30 78 64 39 64 34 64 30 33  in[ 9]+0xd9d4d03
1a010 39 2c 20 20 34 29 3b 0a 20 20 20 20 20 20 20 20  9,  4);.        
1a020 4d 44 35 53 54 45 50 28 46 33 2c 20 64 2c 20 61  MD5STEP(F3, d, a
1a030 2c 20 62 2c 20 63 2c 20 69 6e 5b 31 32 5d 2b 30  , b, c, in[12]+0
1a040 78 65 36 64 62 39 39 65 35 2c 20 31 31 29 3b 0a  xe6db99e5, 11);.
1a050 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28          MD5STEP(
1a060 46 33 2c 20 63 2c 20 64 2c 20 61 2c 20 62 2c 20  F3, c, d, a, b, 
1a070 69 6e 5b 31 35 5d 2b 30 78 31 66 61 32 37 63 66  in[15]+0x1fa27cf
1a080 38 2c 20 31 36 29 3b 0a 20 20 20 20 20 20 20 20  8, 16);.        
1a090 4d 44 35 53 54 45 50 28 46 33 2c 20 62 2c 20 63  MD5STEP(F3, b, c
1a0a0 2c 20 64 2c 20 61 2c 20 69 6e 5b 20 32 5d 2b 30  , d, a, in[ 2]+0
1a0b0 78 63 34 61 63 35 36 36 35 2c 20 32 33 29 3b 0a  xc4ac5665, 23);.
1a0c0 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50  .        MD5STEP
1a0d0 28 46 34 2c 20 61 2c 20 62 2c 20 63 2c 20 64 2c  (F4, a, b, c, d,
1a0e0 20 69 6e 5b 20 30 5d 2b 30 78 66 34 32 39 32 32   in[ 0]+0xf42922
1a0f0 34 34 2c 20 20 36 29 3b 0a 20 20 20 20 20 20 20  44,  6);.       
1a100 20 4d 44 35 53 54 45 50 28 46 34 2c 20 64 2c 20   MD5STEP(F4, d, 
1a110 61 2c 20 62 2c 20 63 2c 20 69 6e 5b 20 37 5d 2b  a, b, c, in[ 7]+
1a120 30 78 34 33 32 61 66 66 39 37 2c 20 31 30 29 3b  0x432aff97, 10);
1a130 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50  .        MD5STEP
1a140 28 46 34 2c 20 63 2c 20 64 2c 20 61 2c 20 62 2c  (F4, c, d, a, b,
1a150 20 69 6e 5b 31 34 5d 2b 30 78 61 62 39 34 32 33   in[14]+0xab9423
1a160 61 37 2c 20 31 35 29 3b 0a 20 20 20 20 20 20 20  a7, 15);.       
1a170 20 4d 44 35 53 54 45 50 28 46 34 2c 20 62 2c 20   MD5STEP(F4, b, 
1a180 63 2c 20 64 2c 20 61 2c 20 69 6e 5b 20 35 5d 2b  c, d, a, in[ 5]+
1a190 30 78 66 63 39 33 61 30 33 39 2c 20 32 31 29 3b  0xfc93a039, 21);
1a1a0 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50  .        MD5STEP
1a1b0 28 46 34 2c 20 61 2c 20 62 2c 20 63 2c 20 64 2c  (F4, a, b, c, d,
1a1c0 20 69 6e 5b 31 32 5d 2b 30 78 36 35 35 62 35 39   in[12]+0x655b59
1a1d0 63 33 2c 20 20 36 29 3b 0a 20 20 20 20 20 20 20  c3,  6);.       
1a1e0 20 4d 44 35 53 54 45 50 28 46 34 2c 20 64 2c 20   MD5STEP(F4, d, 
1a1f0 61 2c 20 62 2c 20 63 2c 20 69 6e 5b 20 33 5d 2b  a, b, c, in[ 3]+
1a200 30 78 38 66 30 63 63 63 39 32 2c 20 31 30 29 3b  0x8f0ccc92, 10);
1a210 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50  .        MD5STEP
1a220 28 46 34 2c 20 63 2c 20 64 2c 20 61 2c 20 62 2c  (F4, c, d, a, b,
1a230 20 69 6e 5b 31 30 5d 2b 30 78 66 66 65 66 66 34   in[10]+0xffeff4
1a240 37 64 2c 20 31 35 29 3b 0a 20 20 20 20 20 20 20  7d, 15);.       
1a250 20 4d 44 35 53 54 45 50 28 46 34 2c 20 62 2c 20   MD5STEP(F4, b, 
1a260 63 2c 20 64 2c 20 61 2c 20 69 6e 5b 20 31 5d 2b  c, d, a, in[ 1]+
1a270 30 78 38 35 38 34 35 64 64 31 2c 20 32 31 29 3b  0x85845dd1, 21);
1a280 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50  .        MD5STEP
1a290 28 46 34 2c 20 61 2c 20 62 2c 20 63 2c 20 64 2c  (F4, a, b, c, d,
1a2a0 20 69 6e 5b 20 38 5d 2b 30 78 36 66 61 38 37 65   in[ 8]+0x6fa87e
1a2b0 34 66 2c 20 20 36 29 3b 0a 20 20 20 20 20 20 20  4f,  6);.       
1a2c0 20 4d 44 35 53 54 45 50 28 46 34 2c 20 64 2c 20   MD5STEP(F4, d, 
1a2d0 61 2c 20 62 2c 20 63 2c 20 69 6e 5b 31 35 5d 2b  a, b, c, in[15]+
1a2e0 30 78 66 65 32 63 65 36 65 30 2c 20 31 30 29 3b  0xfe2ce6e0, 10);
1a2f0 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50  .        MD5STEP
1a300 28 46 34 2c 20 63 2c 20 64 2c 20 61 2c 20 62 2c  (F4, c, d, a, b,
1a310 20 69 6e 5b 20 36 5d 2b 30 78 61 33 30 31 34 33   in[ 6]+0xa30143
1a320 31 34 2c 20 31 35 29 3b 0a 20 20 20 20 20 20 20  14, 15);.       
1a330 20 4d 44 35 53 54 45 50 28 46 34 2c 20 62 2c 20   MD5STEP(F4, b, 
1a340 63 2c 20 64 2c 20 61 2c 20 69 6e 5b 31 33 5d 2b  c, d, a, in[13]+
1a350 30 78 34 65 30 38 31 31 61 31 2c 20 32 31 29 3b  0x4e0811a1, 21);
1a360 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50  .        MD5STEP
1a370 28 46 34 2c 20 61 2c 20 62 2c 20 63 2c 20 64 2c  (F4, a, b, c, d,
1a380 20 69 6e 5b 20 34 5d 2b 30 78 66 37 35 33 37 65   in[ 4]+0xf7537e
1a390 38 32 2c 20 20 36 29 3b 0a 20 20 20 20 20 20 20  82,  6);.       
1a3a0 20 4d 44 35 53 54 45 50 28 46 34 2c 20 64 2c 20   MD5STEP(F4, d, 
1a3b0 61 2c 20 62 2c 20 63 2c 20 69 6e 5b 31 31 5d 2b  a, b, c, in[11]+
1a3c0 30 78 62 64 33 61 66 32 33 35 2c 20 31 30 29 3b  0xbd3af235, 10);
1a3d0 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50  .        MD5STEP
1a3e0 28 46 34 2c 20 63 2c 20 64 2c 20 61 2c 20 62 2c  (F4, c, d, a, b,
1a3f0 20 69 6e 5b 20 32 5d 2b 30 78 32 61 64 37 64 32   in[ 2]+0x2ad7d2
1a400 62 62 2c 20 31 35 29 3b 0a 20 20 20 20 20 20 20  bb, 15);.       
1a410 20 4d 44 35 53 54 45 50 28 46 34 2c 20 62 2c 20   MD5STEP(F4, b, 
1a420 63 2c 20 64 2c 20 61 2c 20 69 6e 5b 20 39 5d 2b  c, d, a, in[ 9]+
1a430 30 78 65 62 38 36 64 33 39 31 2c 20 32 31 29 3b  0xeb86d391, 21);
1a440 0a 0a 20 20 20 20 20 20 20 20 62 75 66 5b 30 5d  ..        buf[0]
1a450 20 2b 3d 20 61 3b 0a 20 20 20 20 20 20 20 20 62   += a;.        b
1a460 75 66 5b 31 5d 20 2b 3d 20 62 3b 0a 20 20 20 20  uf[1] += b;.    
1a470 20 20 20 20 62 75 66 5b 32 5d 20 2b 3d 20 63 3b      buf[2] += c;
1a480 0a 20 20 20 20 20 20 20 20 62 75 66 5b 33 5d 20  .        buf[3] 
1a490 2b 3d 20 64 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53  += d;.}../*. * S
1a4a0 74 61 72 74 20 4d 44 35 20 61 63 63 75 6d 75 6c  tart MD5 accumul
1a4b0 61 74 69 6f 6e 2e 20 20 53 65 74 20 62 69 74 20  ation.  Set bit 
1a4c0 63 6f 75 6e 74 20 74 6f 20 30 20 61 6e 64 20 62  count to 0 and b
1a4d0 75 66 66 65 72 20 74 6f 20 6d 79 73 74 65 72 69  uffer to mysteri
1a4e0 6f 75 73 0a 20 2a 20 69 6e 69 74 69 61 6c 69 7a  ous. * initializ
1a4f0 61 74 69 6f 6e 20 63 6f 6e 73 74 61 6e 74 73 2e  ation constants.
1a500 0a 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  . */.static void
1a510 20 4d 44 35 49 6e 69 74 28 4d 44 35 43 6f 6e 74   MD5Init(MD5Cont
1a520 65 78 74 20 2a 63 74 78 29 7b 0a 20 20 20 20 20  ext *ctx){.     
1a530 20 20 20 63 74 78 2d 3e 69 73 49 6e 69 74 20 3d     ctx->isInit =
1a540 20 31 3b 0a 20 20 20 20 20 20 20 20 63 74 78 2d   1;.        ctx-
1a550 3e 62 75 66 5b 30 5d 20 3d 20 30 78 36 37 34 35  >buf[0] = 0x6745
1a560 32 33 30 31 3b 0a 20 20 20 20 20 20 20 20 63 74  2301;.        ct
1a570 78 2d 3e 62 75 66 5b 31 5d 20 3d 20 30 78 65 66  x->buf[1] = 0xef
1a580 63 64 61 62 38 39 3b 0a 20 20 20 20 20 20 20 20  cdab89;.        
1a590 63 74 78 2d 3e 62 75 66 5b 32 5d 20 3d 20 30 78  ctx->buf[2] = 0x
1a5a0 39 38 62 61 64 63 66 65 3b 0a 20 20 20 20 20 20  98badcfe;.      
1a5b0 20 20 63 74 78 2d 3e 62 75 66 5b 33 5d 20 3d 20    ctx->buf[3] = 
1a5c0 30 78 31 30 33 32 35 34 37 36 3b 0a 20 20 20 20  0x10325476;.    
1a5d0 20 20 20 20 63 74 78 2d 3e 62 69 74 73 5b 30 5d      ctx->bits[0]
1a5e0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 63 74   = 0;.        ct
1a5f0 78 2d 3e 62 69 74 73 5b 31 5d 20 3d 20 30 3b 0a  x->bits[1] = 0;.
1a600 7d 0a 0a 2f 2a 0a 20 2a 20 55 70 64 61 74 65 20  }../*. * Update 
1a610 63 6f 6e 74 65 78 74 20 74 6f 20 72 65 66 6c 65  context to refle
1a620 63 74 20 74 68 65 20 63 6f 6e 63 61 74 65 6e 61  ct the concatena
1a630 74 69 6f 6e 20 6f 66 20 61 6e 6f 74 68 65 72 20  tion of another 
1a640 62 75 66 66 65 72 20 66 75 6c 6c 0a 20 2a 20 6f  buffer full. * o
1a650 66 20 62 79 74 65 73 2e 0a 20 2a 2f 0a 73 74 61  f bytes.. */.sta
1a660 74 69 63 20 0a 76 6f 69 64 20 4d 44 35 55 70 64  tic .void MD5Upd
1a670 61 74 65 28 4d 44 35 43 6f 6e 74 65 78 74 20 2a  ate(MD5Context *
1a680 63 74 78 2c 20 63 6f 6e 73 74 20 75 6e 73 69 67  ctx, const unsig
1a690 6e 65 64 20 63 68 61 72 20 2a 62 75 66 2c 20 75  ned char *buf, u
1a6a0 6e 73 69 67 6e 65 64 20 69 6e 74 20 6c 65 6e 29  nsigned int len)
1a6b0 7b 0a 20 20 20 20 20 20 20 20 75 69 6e 74 33 32  {.        uint32
1a6c0 20 74 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20   t;..        /* 
1a6d0 55 70 64 61 74 65 20 62 69 74 63 6f 75 6e 74 20  Update bitcount 
1a6e0 2a 2f 0a 0a 20 20 20 20 20 20 20 20 74 20 3d 20  */..        t = 
1a6f0 63 74 78 2d 3e 62 69 74 73 5b 30 5d 3b 0a 20 20  ctx->bits[0];.  
1a700 20 20 20 20 20 20 69 66 20 28 28 63 74 78 2d 3e        if ((ctx->
1a710 62 69 74 73 5b 30 5d 20 3d 20 74 20 2b 20 28 28  bits[0] = t + ((
1a720 75 69 6e 74 33 32 29 6c 65 6e 20 3c 3c 20 33 29  uint32)len << 3)
1a730 29 20 3c 20 74 29 0a 20 20 20 20 20 20 20 20 20  ) < t).         
1a740 20 20 20 20 20 20 20 63 74 78 2d 3e 62 69 74 73         ctx->bits
1a750 5b 31 5d 2b 2b 3b 20 2f 2a 20 43 61 72 72 79 20  [1]++; /* Carry 
1a760 66 72 6f 6d 20 6c 6f 77 20 74 6f 20 68 69 67 68  from low to high
1a770 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 74 78 2d   */.        ctx-
1a780 3e 62 69 74 73 5b 31 5d 20 2b 3d 20 6c 65 6e 20  >bits[1] += len 
1a790 3e 3e 20 32 39 3b 0a 0a 20 20 20 20 20 20 20 20  >> 29;..        
1a7a0 74 20 3d 20 28 74 20 3e 3e 20 33 29 20 26 20 30  t = (t >> 3) & 0
1a7b0 78 33 66 3b 20 20 20 20 2f 2a 20 42 79 74 65 73  x3f;    /* Bytes
1a7c0 20 61 6c 72 65 61 64 79 20 69 6e 20 73 68 73 49   already in shsI
1a7d0 6e 66 6f 2d 3e 64 61 74 61 20 2a 2f 0a 0a 20 20  nfo->data */..  
1a7e0 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20        /* Handle 
1a7f0 61 6e 79 20 6c 65 61 64 69 6e 67 20 6f 64 64 2d  any leading odd-
1a800 73 69 7a 65 64 20 63 68 75 6e 6b 73 20 2a 2f 0a  sized chunks */.
1a810 0a 20 20 20 20 20 20 20 20 69 66 20 28 20 74 20  .        if ( t 
1a820 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
1a830 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61      unsigned cha
1a840 72 20 2a 70 20 3d 20 28 75 6e 73 69 67 6e 65 64  r *p = (unsigned
1a850 20 63 68 61 72 20 2a 29 63 74 78 2d 3e 69 6e 20   char *)ctx->in 
1a860 2b 20 74 3b 0a 0a 20 20 20 20 20 20 20 20 20 20  + t;..          
1a870 20 20 20 20 20 20 74 20 3d 20 36 34 2d 74 3b 0a        t = 64-t;.
1a880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a890 69 66 20 28 6c 65 6e 20 3c 20 74 29 20 7b 0a 20  if (len < t) {. 
1a8a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a8b0 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 2c         memcpy(p,
1a8c0 20 62 75 66 2c 20 6c 65 6e 29 3b 0a 20 20 20 20   buf, len);.    
1a8d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a8e0 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
1a8f0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
1a900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 65                me
1a910 6d 63 70 79 28 70 2c 20 62 75 66 2c 20 74 29 3b  mcpy(p, buf, t);
1a920 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1a930 20 62 79 74 65 52 65 76 65 72 73 65 28 63 74 78   byteReverse(ctx
1a940 2d 3e 69 6e 2c 20 31 36 29 3b 0a 20 20 20 20 20  ->in, 16);.     
1a950 20 20 20 20 20 20 20 20 20 20 20 4d 44 35 54 72             MD5Tr
1a960 61 6e 73 66 6f 72 6d 28 63 74 78 2d 3e 62 75 66  ansform(ctx->buf
1a970 2c 20 28 75 69 6e 74 33 32 20 2a 29 63 74 78 2d  , (uint32 *)ctx-
1a980 3e 69 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20  >in);.          
1a990 20 20 20 20 20 20 62 75 66 20 2b 3d 20 74 3b 0a        buf += t;.
1a9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a9b0 6c 65 6e 20 2d 3d 20 74 3b 0a 20 20 20 20 20 20  len -= t;.      
1a9c0 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20    }..        /* 
1a9d0 50 72 6f 63 65 73 73 20 64 61 74 61 20 69 6e 20  Process data in 
1a9e0 36 34 2d 62 79 74 65 20 63 68 75 6e 6b 73 20 2a  64-byte chunks *
1a9f0 2f 0a 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65  /..        while
1aa00 20 28 6c 65 6e 20 3e 3d 20 36 34 29 20 7b 0a 20   (len >= 64) {. 
1aa10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d                 m
1aa20 65 6d 63 70 79 28 63 74 78 2d 3e 69 6e 2c 20 62  emcpy(ctx->in, b
1aa30 75 66 2c 20 36 34 29 3b 0a 20 20 20 20 20 20 20  uf, 64);.       
1aa40 20 20 20 20 20 20 20 20 20 62 79 74 65 52 65 76           byteRev
1aa50 65 72 73 65 28 63 74 78 2d 3e 69 6e 2c 20 31 36  erse(ctx->in, 16
1aa60 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
1aa70 20 20 20 4d 44 35 54 72 61 6e 73 66 6f 72 6d 28     MD5Transform(
1aa80 63 74 78 2d 3e 62 75 66 2c 20 28 75 69 6e 74 33  ctx->buf, (uint3
1aa90 32 20 2a 29 63 74 78 2d 3e 69 6e 29 3b 0a 20 20  2 *)ctx->in);.  
1aaa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 75                bu
1aab0 66 20 2b 3d 20 36 34 3b 0a 20 20 20 20 20 20 20  f += 64;.       
1aac0 20 20 20 20 20 20 20 20 20 6c 65 6e 20 2d 3d 20           len -= 
1aad0 36 34 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  64;.        }.. 
1aae0 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65         /* Handle
1aaf0 20 61 6e 79 20 72 65 6d 61 69 6e 69 6e 67 20 62   any remaining b
1ab00 79 74 65 73 20 6f 66 20 64 61 74 61 2e 20 2a 2f  ytes of data. */
1ab10 0a 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  ..        memcpy
1ab20 28 63 74 78 2d 3e 69 6e 2c 20 62 75 66 2c 20 6c  (ctx->in, buf, l
1ab30 65 6e 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 46 69  en);.}../*. * Fi
1ab40 6e 61 6c 20 77 72 61 70 75 70 20 2d 20 70 61 64  nal wrapup - pad
1ab50 20 74 6f 20 36 34 2d 62 79 74 65 20 62 6f 75 6e   to 64-byte boun
1ab60 64 61 72 79 20 77 69 74 68 20 74 68 65 20 62 69  dary with the bi
1ab70 74 20 70 61 74 74 65 72 6e 20 0a 20 2a 20 31 20  t pattern . * 1 
1ab80 30 2a 20 28 36 34 2d 62 69 74 20 63 6f 75 6e 74  0* (64-bit count
1ab90 20 6f 66 20 62 69 74 73 20 70 72 6f 63 65 73 73   of bits process
1aba0 65 64 2c 20 4d 53 42 2d 66 69 72 73 74 29 0a 20  ed, MSB-first). 
1abb0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 4d  */.static void M
1abc0 44 35 46 69 6e 61 6c 28 75 6e 73 69 67 6e 65 64  D5Final(unsigned
1abd0 20 63 68 61 72 20 64 69 67 65 73 74 5b 31 36 5d   char digest[16]
1abe0 2c 20 4d 44 35 43 6f 6e 74 65 78 74 20 2a 63 74  , MD5Context *ct
1abf0 78 29 7b 0a 20 20 20 20 20 20 20 20 75 6e 73 69  x){.        unsi
1ac00 67 6e 65 64 20 63 6f 75 6e 74 3b 0a 20 20 20 20  gned count;.    
1ac10 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61      unsigned cha
1ac20 72 20 2a 70 3b 0a 0a 20 20 20 20 20 20 20 20 2f  r *p;..        /
1ac30 2a 20 43 6f 6d 70 75 74 65 20 6e 75 6d 62 65 72  * Compute number
1ac40 20 6f 66 20 62 79 74 65 73 20 6d 6f 64 20 36 34   of bytes mod 64
1ac50 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f 75 6e   */.        coun
1ac60 74 20 3d 20 28 63 74 78 2d 3e 62 69 74 73 5b 30  t = (ctx->bits[0
1ac70 5d 20 3e 3e 20 33 29 20 26 20 30 78 33 46 3b 0a  ] >> 3) & 0x3F;.
1ac80 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20  .        /* Set 
1ac90 74 68 65 20 66 69 72 73 74 20 63 68 61 72 20 6f  the first char o
1aca0 66 20 70 61 64 64 69 6e 67 20 74 6f 20 30 78 38  f padding to 0x8
1acb0 30 2e 20 20 54 68 69 73 20 69 73 20 73 61 66 65  0.  This is safe
1acc0 20 73 69 6e 63 65 20 74 68 65 72 65 20 69 73 0a   since there is.
1acd0 20 20 20 20 20 20 20 20 20 20 20 61 6c 77 61 79             alway
1ace0 73 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 62  s at least one b
1acf0 79 74 65 20 66 72 65 65 20 2a 2f 0a 20 20 20 20  yte free */.    
1ad00 20 20 20 20 70 20 3d 20 63 74 78 2d 3e 69 6e 20      p = ctx->in 
1ad10 2b 20 63 6f 75 6e 74 3b 0a 20 20 20 20 20 20 20  + count;.       
1ad20 20 2a 70 2b 2b 20 3d 20 30 78 38 30 3b 0a 0a 20   *p++ = 0x80;.. 
1ad30 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20         /* Bytes 
1ad40 6f 66 20 70 61 64 64 69 6e 67 20 6e 65 65 64 65  of padding neede
1ad50 64 20 74 6f 20 6d 61 6b 65 20 36 34 20 62 79 74  d to make 64 byt
1ad60 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f  es */.        co
1ad70 75 6e 74 20 3d 20 36 34 20 2d 20 31 20 2d 20 63  unt = 64 - 1 - c
1ad80 6f 75 6e 74 3b 0a 0a 20 20 20 20 20 20 20 20 2f  ount;..        /
1ad90 2a 20 50 61 64 20 6f 75 74 20 74 6f 20 35 36 20  * Pad out to 56 
1ada0 6d 6f 64 20 36 34 20 2a 2f 0a 20 20 20 20 20 20  mod 64 */.      
1adb0 20 20 69 66 20 28 63 6f 75 6e 74 20 3c 20 38 29    if (count < 8)
1adc0 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
1add0 20 20 20 2f 2a 20 54 77 6f 20 6c 6f 74 73 20 6f     /* Two lots o
1ade0 66 20 70 61 64 64 69 6e 67 3a 20 20 50 61 64 20  f padding:  Pad 
1adf0 74 68 65 20 66 69 72 73 74 20 62 6c 6f 63 6b 20  the first block 
1ae00 74 6f 20 36 34 20 62 79 74 65 73 20 2a 2f 0a 20  to 64 bytes */. 
1ae10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d                 m
1ae20 65 6d 73 65 74 28 70 2c 20 30 2c 20 63 6f 75 6e  emset(p, 0, coun
1ae30 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  t);.            
1ae40 20 20 20 20 62 79 74 65 52 65 76 65 72 73 65 28      byteReverse(
1ae50 63 74 78 2d 3e 69 6e 2c 20 31 36 29 3b 0a 20 20  ctx->in, 16);.  
1ae60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4d 44                MD
1ae70 35 54 72 61 6e 73 66 6f 72 6d 28 63 74 78 2d 3e  5Transform(ctx->
1ae80 62 75 66 2c 20 28 75 69 6e 74 33 32 20 2a 29 63  buf, (uint32 *)c
1ae90 74 78 2d 3e 69 6e 29 3b 0a 0a 20 20 20 20 20 20  tx->in);..      
1aea0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 77            /* Now
1aeb0 20 66 69 6c 6c 20 74 68 65 20 6e 65 78 74 20 62   fill the next b
1aec0 6c 6f 63 6b 20 77 69 74 68 20 35 36 20 62 79 74  lock with 56 byt
1aed0 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  es */.          
1aee0 20 20 20 20 20 20 6d 65 6d 73 65 74 28 63 74 78        memset(ctx
1aef0 2d 3e 69 6e 2c 20 30 2c 20 35 36 29 3b 0a 20 20  ->in, 0, 56);.  
1af00 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20        } else {. 
1af10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1af20 2a 20 50 61 64 20 62 6c 6f 63 6b 20 74 6f 20 35  * Pad block to 5
1af30 36 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 20  6 bytes */.     
1af40 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 73 65             memse
1af50 74 28 70 2c 20 30 2c 20 63 6f 75 6e 74 2d 38 29  t(p, 0, count-8)
1af60 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1af70 20 20 20 20 62 79 74 65 52 65 76 65 72 73 65 28      byteReverse(
1af80 63 74 78 2d 3e 69 6e 2c 20 31 34 29 3b 0a 0a 20  ctx->in, 14);.. 
1af90 20 20 20 20 20 20 20 2f 2a 20 41 70 70 65 6e 64         /* Append
1afa0 20 6c 65 6e 67 74 68 20 69 6e 20 62 69 74 73 20   length in bits 
1afb0 61 6e 64 20 74 72 61 6e 73 66 6f 72 6d 20 2a 2f  and transform */
1afc0 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
1afd0 63 74 78 2d 3e 69 6e 20 2b 20 31 34 2a 34 2c 20  ctx->in + 14*4, 
1afe0 63 74 78 2d 3e 62 69 74 73 2c 20 38 29 3b 0a 0a  ctx->bits, 8);..
1aff0 20 20 20 20 20 20 20 20 4d 44 35 54 72 61 6e 73          MD5Trans
1b000 66 6f 72 6d 28 63 74 78 2d 3e 62 75 66 2c 20 28  form(ctx->buf, (
1b010 75 69 6e 74 33 32 20 2a 29 63 74 78 2d 3e 69 6e  uint32 *)ctx->in
1b020 29 3b 0a 20 20 20 20 20 20 20 20 62 79 74 65 52  );.        byteR
1b030 65 76 65 72 73 65 28 28 75 6e 73 69 67 6e 65 64  everse((unsigned
1b040 20 63 68 61 72 20 2a 29 63 74 78 2d 3e 62 75 66   char *)ctx->buf
1b050 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 6d 65  , 4);.        me
1b060 6d 63 70 79 28 64 69 67 65 73 74 2c 20 63 74 78  mcpy(digest, ctx
1b070 2d 3e 62 75 66 2c 20 31 36 29 3b 0a 7d 0a 0a 2f  ->buf, 16);.}../
1b080 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 31  *.** Convert a 1
1b090 32 38 2d 62 69 74 20 4d 44 35 20 64 69 67 65 73  28-bit MD5 diges
1b0a0 74 20 69 6e 74 6f 20 61 20 33 32 2d 64 69 67 69  t into a 32-digi
1b0b0 74 20 62 61 73 65 2d 31 36 20 6e 75 6d 62 65 72  t base-16 number
1b0c0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1b0d0 20 4d 44 35 44 69 67 65 73 74 54 6f 42 61 73 65   MD5DigestToBase
1b0e0 31 36 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  16(unsigned char
1b0f0 20 2a 64 69 67 65 73 74 2c 20 63 68 61 72 20 2a   *digest, char *
1b100 7a 42 75 66 29 7b 0a 20 20 73 74 61 74 69 63 20  zBuf){.  static 
1b110 63 68 61 72 20 63 6f 6e 73 74 20 7a 45 6e 63 6f  char const zEnco
1b120 64 65 5b 5d 20 3d 20 22 30 31 32 33 34 35 36 37  de[] = "01234567
1b130 38 39 61 62 63 64 65 66 22 3b 0a 20 20 69 6e 74  89abcdef";.  int
1b140 20 69 2c 20 6a 3b 0a 0a 20 20 66 6f 72 28 6a 3d   i, j;..  for(j=
1b150 69 3d 30 3b 20 69 3c 31 36 3b 20 69 2b 2b 29 7b  i=0; i<16; i++){
1b160 0a 20 20 20 20 69 6e 74 20 61 20 3d 20 64 69 67  .    int a = dig
1b170 65 73 74 5b 69 5d 3b 0a 20 20 20 20 7a 42 75 66  est[i];.    zBuf
1b180 5b 6a 2b 2b 5d 20 3d 20 7a 45 6e 63 6f 64 65 5b  [j++] = zEncode[
1b190 28 61 3e 3e 34 29 26 30 78 66 5d 3b 0a 20 20 20  (a>>4)&0xf];.   
1b1a0 20 7a 42 75 66 5b 6a 2b 2b 5d 20 3d 20 7a 45 6e   zBuf[j++] = zEn
1b1b0 63 6f 64 65 5b 61 20 26 20 30 78 66 5d 3b 0a 20  code[a & 0xf];. 
1b1c0 20 7d 0a 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 30   }.  zBuf[j] = 0
1b1d0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76  ;.}.../*.** Conv
1b1e0 65 72 74 20 61 20 31 32 38 2d 62 69 74 20 4d 44  ert a 128-bit MD
1b1f0 35 20 64 69 67 65 73 74 20 69 6e 74 6f 20 73 65  5 digest into se
1b200 71 75 65 6e 63 79 20 6f 66 20 65 69 67 68 74 20  quency of eight 
1b210 35 2d 64 69 67 69 74 20 69 6e 74 65 67 65 72 73  5-digit integers
1b220 0a 2a 2a 20 65 61 63 68 20 72 65 70 72 65 73 65  .** each represe
1b230 6e 74 69 6e 67 20 31 36 20 62 69 74 73 20 6f 66  nting 16 bits of
1b240 20 74 68 65 20 64 69 67 65 73 74 20 61 6e 64 20   the digest and 
1b250 73 65 70 61 72 61 74 65 64 20 66 72 6f 6d 20 65  separated from e
1b260 61 63 68 0a 2a 2a 20 6f 74 68 65 72 20 62 79 20  ach.** other by 
1b270 61 20 22 2d 22 20 63 68 61 72 61 63 74 65 72 2e  a "-" character.
1b280 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1b290 4d 44 35 44 69 67 65 73 74 54 6f 42 61 73 65 31  MD5DigestToBase1
1b2a0 30 78 38 28 75 6e 73 69 67 6e 65 64 20 63 68 61  0x8(unsigned cha
1b2b0 72 20 64 69 67 65 73 74 5b 31 36 5d 2c 20 63 68  r digest[16], ch
1b2c0 61 72 20 7a 44 69 67 65 73 74 5b 35 30 5d 29 7b  ar zDigest[50]){
1b2d0 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 75  .  int i, j;.  u
1b2e0 6e 73 69 67 6e 65 64 20 69 6e 74 20 78 3b 0a 20  nsigned int x;. 
1b2f0 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 31 36   for(i=j=0; i<16
1b300 3b 20 69 2b 3d 32 29 7b 0a 20 20 20 20 78 20 3d  ; i+=2){.    x =
1b310 20 64 69 67 65 73 74 5b 69 5d 2a 32 35 36 20 2b   digest[i]*256 +
1b320 20 64 69 67 65 73 74 5b 69 2b 31 5d 3b 0a 20 20   digest[i+1];.  
1b330 20 20 69 66 28 20 69 3e 30 20 29 20 7a 44 69 67    if( i>0 ) zDig
1b340 65 73 74 5b 6a 2b 2b 5d 20 3d 20 27 2d 27 3b 0a  est[j++] = '-';.
1b350 20 20 20 20 73 70 72 69 6e 74 66 28 26 7a 44 69      sprintf(&zDi
1b360 67 65 73 74 5b 6a 5d 2c 20 22 25 30 35 75 22 2c  gest[j], "%05u",
1b370 20 78 29 3b 0a 20 20 20 20 6a 20 2b 3d 20 35 3b   x);.    j += 5;
1b380 0a 20 20 7d 0a 20 20 7a 44 69 67 65 73 74 5b 6a  .  }.  zDigest[j
1b390 5d 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ] = 0;.}../*.** 
1b3a0 41 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20 66 6f  A TCL command fo
1b3b0 72 20 6d 64 35 2e 20 20 54 68 65 20 61 72 67 75  r md5.  The argu
1b3c0 6d 65 6e 74 20 69 73 20 74 68 65 20 74 65 78 74  ment is the text
1b3d0 20 74 6f 20 62 65 20 68 61 73 68 65 64 2e 20 20   to be hashed.  
1b3e0 54 68 65 0a 2a 2a 20 52 65 73 75 6c 74 20 69 73  The.** Result is
1b3f0 20 74 68 65 20 68 61 73 68 20 69 6e 20 62 61 73   the hash in bas
1b400 65 36 34 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63  e64.  .*/.static
1b410 20 69 6e 74 20 6d 64 35 5f 63 6d 64 28 76 6f 69   int md5_cmd(voi
1b420 64 2a 63 64 2c 20 54 63 6c 5f 49 6e 74 65 72 70  d*cd, Tcl_Interp
1b430 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 61 72   *interp, int ar
1b440 67 63 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  gc, const char *
1b450 2a 61 72 67 76 29 7b 0a 20 20 4d 44 35 43 6f 6e  *argv){.  MD5Con
1b460 74 65 78 74 20 63 74 78 3b 0a 20 20 75 6e 73 69  text ctx;.  unsi
1b470 67 6e 65 64 20 63 68 61 72 20 64 69 67 65 73 74  gned char digest
1b480 5b 31 36 5d 3b 0a 20 20 63 68 61 72 20 7a 42 75  [16];.  char zBu
1b490 66 5b 35 30 5d 3b 0a 20 20 76 6f 69 64 20 28 2a  f[50];.  void (*
1b4a0 63 6f 6e 76 65 72 74 65 72 29 28 75 6e 73 69 67  converter)(unsig
1b4b0 6e 65 64 20 63 68 61 72 2a 2c 20 63 68 61 72 2a  ned char*, char*
1b4c0 29 3b 0a 0a 20 20 69 66 28 20 61 72 67 63 21 3d  );..  if( argc!=
1b4d0 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  2 ){.    Tcl_App
1b4e0 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
1b4f0 2c 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20  ,"wrong # args: 
1b500 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61  should be \"", a
1b510 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20  rgv[0], .       
1b520 20 22 20 54 45 58 54 5c 22 22 2c 20 30 29 3b 0a   " TEXT\"", 0);.
1b530 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
1b540 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 4d 44 35 49  RROR;.  }.  MD5I
1b550 6e 69 74 28 26 63 74 78 29 3b 0a 20 20 4d 44 35  nit(&ctx);.  MD5
1b560 55 70 64 61 74 65 28 26 63 74 78 2c 20 28 75 6e  Update(&ctx, (un
1b570 73 69 67 6e 65 64 20 63 68 61 72 2a 29 61 72 67  signed char*)arg
1b580 76 5b 31 5d 2c 20 28 75 6e 73 69 67 6e 65 64 29  v[1], (unsigned)
1b590 73 74 72 6c 65 6e 28 61 72 67 76 5b 31 5d 29 29  strlen(argv[1]))
1b5a0 3b 0a 20 20 4d 44 35 46 69 6e 61 6c 28 64 69 67  ;.  MD5Final(dig
1b5b0 65 73 74 2c 20 26 63 74 78 29 3b 0a 20 20 63 6f  est, &ctx);.  co
1b5c0 6e 76 65 72 74 65 72 20 3d 20 28 76 6f 69 64 28  nverter = (void(
1b5d0 2a 29 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  *)(unsigned char
1b5e0 2a 2c 63 68 61 72 2a 29 29 63 64 3b 0a 20 20 63  *,char*))cd;.  c
1b5f0 6f 6e 76 65 72 74 65 72 28 64 69 67 65 73 74 2c  onverter(digest,
1b600 20 7a 42 75 66 29 3b 0a 20 20 54 63 6c 5f 41 70   zBuf);.  Tcl_Ap
1b610 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
1b620 70 2c 20 7a 42 75 66 2c 20 28 63 68 61 72 2a 29  p, zBuf, (char*)
1b630 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  0);.  return TCL
1b640 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20  _OK;.}../*.** A 
1b650 54 43 4c 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 74  TCL command to t
1b660 61 6b 65 20 74 68 65 20 6d 64 35 20 68 61 73 68  ake the md5 hash
1b670 20 6f 66 20 61 20 66 69 6c 65 2e 20 20 54 68 65   of a file.  The
1b680 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65   argument is the
1b690 0a 2a 2a 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  .** name of the 
1b6a0 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
1b6b0 69 6e 74 20 6d 64 35 66 69 6c 65 5f 63 6d 64 28  int md5file_cmd(
1b6c0 76 6f 69 64 2a 63 64 2c 20 54 63 6c 5f 49 6e 74  void*cd, Tcl_Int
1b6d0 65 72 70 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20  erp*interp, int 
1b6e0 61 72 67 63 2c 20 63 6f 6e 73 74 20 63 68 61 72  argc, const char
1b6f0 20 2a 2a 61 72 67 76 29 7b 0a 20 20 46 49 4c 45   **argv){.  FILE
1b700 20 2a 69 6e 3b 0a 20 20 4d 44 35 43 6f 6e 74 65   *in;.  MD5Conte
1b710 78 74 20 63 74 78 3b 0a 20 20 76 6f 69 64 20 28  xt ctx;.  void (
1b720 2a 63 6f 6e 76 65 72 74 65 72 29 28 75 6e 73 69  *converter)(unsi
1b730 67 6e 65 64 20 63 68 61 72 2a 2c 20 63 68 61 72  gned char*, char
1b740 2a 29 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  *);.  unsigned c
1b750 68 61 72 20 64 69 67 65 73 74 5b 31 36 5d 3b 0a  har digest[16];.
1b760 20 20 63 68 61 72 20 7a 42 75 66 5b 31 30 32 34    char zBuf[1024
1b770 30 5d 3b 0a 0a 20 20 69 66 28 20 61 72 67 63 21  0];..  if( argc!
1b780 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =2 ){.    Tcl_Ap
1b790 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
1b7a0 70 2c 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  p,"wrong # args:
1b7b0 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
1b7c0 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20  argv[0], .      
1b7d0 20 20 22 20 46 49 4c 45 4e 41 4d 45 5c 22 22 2c    " FILENAME\"",
1b7e0 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
1b7f0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
1b800 20 69 6e 20 3d 20 66 6f 70 65 6e 28 61 72 67 76   in = fopen(argv
1b810 5b 31 5d 2c 22 72 62 22 29 3b 0a 20 20 69 66 28  [1],"rb");.  if(
1b820 20 69 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 54 63   in==0 ){.    Tc
1b830 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
1b840 6e 74 65 72 70 2c 22 75 6e 61 62 6c 65 20 74 6f  nterp,"unable to
1b850 20 6f 70 65 6e 20 66 69 6c 65 20 5c 22 22 2c 20   open file \"", 
1b860 61 72 67 76 5b 31 5d 2c 20 0a 20 20 20 20 20 20  argv[1], .      
1b870 20 20 20 22 5c 22 20 66 6f 72 20 72 65 61 64 69     "\" for readi
1b880 6e 67 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  ng", 0);.    ret
1b890 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1b8a0 20 7d 0a 20 20 4d 44 35 49 6e 69 74 28 26 63 74   }.  MD5Init(&ct
1b8b0 78 29 3b 0a 20 20 66 6f 72 28 3b 3b 29 7b 0a 20  x);.  for(;;){. 
1b8c0 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 6e 20     int n;.    n 
1b8d0 3d 20 28 69 6e 74 29 66 72 65 61 64 28 7a 42 75  = (int)fread(zBu
1b8e0 66 2c 20 31 2c 20 73 69 7a 65 6f 66 28 7a 42 75  f, 1, sizeof(zBu
1b8f0 66 29 2c 20 69 6e 29 3b 0a 20 20 20 20 69 66 28  f), in);.    if(
1b900 20 6e 3c 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20   n<=0 ) break;. 
1b910 20 20 20 4d 44 35 55 70 64 61 74 65 28 26 63 74     MD5Update(&ct
1b920 78 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61  x, (unsigned cha
1b930 72 2a 29 7a 42 75 66 2c 20 28 75 6e 73 69 67 6e  r*)zBuf, (unsign
1b940 65 64 29 6e 29 3b 0a 20 20 7d 0a 20 20 66 63 6c  ed)n);.  }.  fcl
1b950 6f 73 65 28 69 6e 29 3b 0a 20 20 4d 44 35 46 69  ose(in);.  MD5Fi
1b960 6e 61 6c 28 64 69 67 65 73 74 2c 20 26 63 74 78  nal(digest, &ctx
1b970 29 3b 0a 20 20 63 6f 6e 76 65 72 74 65 72 20 3d  );.  converter =
1b980 20 28 76 6f 69 64 28 2a 29 28 75 6e 73 69 67 6e   (void(*)(unsign
1b990 65 64 20 63 68 61 72 2a 2c 63 68 61 72 2a 29 29  ed char*,char*))
1b9a0 63 64 3b 0a 20 20 63 6f 6e 76 65 72 74 65 72 28  cd;.  converter(
1b9b0 64 69 67 65 73 74 2c 20 7a 42 75 66 29 3b 0a 20  digest, zBuf);. 
1b9c0 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
1b9d0 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20  t(interp, zBuf, 
1b9e0 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 72 65 74  (char*)0);.  ret
1b9f0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
1ba00 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 74 68  *.** Register th
1ba10 65 20 66 6f 75 72 20 6e 65 77 20 54 43 4c 20 63  e four new TCL c
1ba20 6f 6d 6d 61 6e 64 73 20 66 6f 72 20 67 65 6e 65  ommands for gene
1ba30 72 61 74 69 6e 67 20 4d 44 35 20 63 68 65 63 6b  rating MD5 check
1ba40 73 75 6d 73 0a 2a 2a 20 77 69 74 68 20 74 68 65  sums.** with the
1ba50 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
1ba60 2e 0a 2a 2f 0a 69 6e 74 20 4d 64 35 5f 49 6e 69  ..*/.int Md5_Ini
1ba70 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  t(Tcl_Interp *in
1ba80 74 65 72 70 29 7b 0a 20 20 54 63 6c 5f 43 72 65  terp){.  Tcl_Cre
1ba90 61 74 65 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72  ateCommand(inter
1baa0 70 2c 20 22 6d 64 35 22 2c 20 28 54 63 6c 5f 43  p, "md5", (Tcl_C
1bab0 6d 64 50 72 6f 63 2a 29 6d 64 35 5f 63 6d 64 2c  mdProc*)md5_cmd,
1bac0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1bad0 20 20 20 20 20 4d 44 35 44 69 67 65 73 74 54 6f       MD5DigestTo
1bae0 42 61 73 65 31 36 2c 20 30 29 3b 0a 20 20 54 63  Base16, 0);.  Tc
1baf0 6c 5f 43 72 65 61 74 65 43 6f 6d 6d 61 6e 64 28  l_CreateCommand(
1bb00 69 6e 74 65 72 70 2c 20 22 6d 64 35 2d 31 30 78  interp, "md5-10x
1bb10 38 22 2c 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63  8", (Tcl_CmdProc
1bb20 2a 29 6d 64 35 5f 63 6d 64 2c 0a 20 20 20 20 20  *)md5_cmd,.     
1bb30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4d                 M
1bb40 44 35 44 69 67 65 73 74 54 6f 42 61 73 65 31 30  D5DigestToBase10
1bb50 78 38 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 43 72  x8, 0);.  Tcl_Cr
1bb60 65 61 74 65 43 6f 6d 6d 61 6e 64 28 69 6e 74 65  eateCommand(inte
1bb70 72 70 2c 20 22 6d 64 35 66 69 6c 65 22 2c 20 28  rp, "md5file", (
1bb80 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 6d 64 35  Tcl_CmdProc*)md5
1bb90 66 69 6c 65 5f 63 6d 64 2c 0a 20 20 20 20 20 20  file_cmd,.      
1bba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4d 44                MD
1bbb0 35 44 69 67 65 73 74 54 6f 42 61 73 65 31 36 2c  5DigestToBase16,
1bbc0 20 30 29 3b 0a 20 20 54 63 6c 5f 43 72 65 61 74   0);.  Tcl_Creat
1bbd0 65 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c  eCommand(interp,
1bbe0 20 22 6d 64 35 66 69 6c 65 2d 31 30 78 38 22 2c   "md5file-10x8",
1bbf0 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 6d   (Tcl_CmdProc*)m
1bc00 64 35 66 69 6c 65 5f 63 6d 64 2c 0a 20 20 20 20  d5file_cmd,.    
1bc10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bc20 4d 44 35 44 69 67 65 73 74 54 6f 42 61 73 65 31  MD5DigestToBase1
1bc30 30 78 38 2c 20 30 29 3b 0a 20 20 72 65 74 75 72  0x8, 0);.  retur
1bc40 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  n TCL_OK;.}.#end
1bc50 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 53 51  if /* defined(SQ
1bc60 4c 49 54 45 5f 54 45 53 54 29 20 7c 7c 20 64 65  LITE_TEST) || de
1bc70 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 43 4c  fined(SQLITE_TCL
1bc80 4d 44 35 29 20 2a 2f 0a 0a 23 69 66 20 64 65 66  MD5) */..#if def
1bc90 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54  ined(SQLITE_TEST
1bca0 29 0a 2f 2a 0a 2a 2a 20 44 75 72 69 6e 67 20 74  )./*.** During t
1bcb0 65 73 74 69 6e 67 2c 20 74 68 65 20 73 70 65 63  esting, the spec
1bcc0 69 61 6c 20 6d 64 35 73 75 6d 28 29 20 61 67 67  ial md5sum() agg
1bcd0 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20  regate function 
1bce0 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a  is available..**
1bcf0 20 69 6e 73 69 64 65 20 53 51 4c 69 74 65 2e 20   inside SQLite. 
1bd00 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72   The following r
1bd10 6f 75 74 69 6e 65 73 20 69 6d 70 6c 65 6d 65 6e  outines implemen
1bd20 74 20 74 68 61 74 20 66 75 6e 63 74 69 6f 6e 2e  t that function.
1bd30 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1bd40 6d 64 35 73 74 65 70 28 73 71 6c 69 74 65 33 5f  md5step(sqlite3_
1bd50 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  context *context
1bd60 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69  , int argc, sqli
1bd70 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76  te3_value **argv
1bd80 29 7b 0a 20 20 4d 44 35 43 6f 6e 74 65 78 74 20  ){.  MD5Context 
1bd90 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  *p;.  int i;.  i
1bda0 66 28 20 61 72 67 63 3c 31 20 29 20 72 65 74 75  f( argc<1 ) retu
1bdb0 72 6e 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65  rn;.  p = sqlite
1bdc0 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74  3_aggregate_cont
1bdd0 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 73 69 7a  ext(context, siz
1bde0 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69 66 28 20  eof(*p));.  if( 
1bdf0 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  p==0 ) return;. 
1be00 20 69 66 28 20 21 70 2d 3e 69 73 49 6e 69 74 20   if( !p->isInit 
1be10 29 7b 0a 20 20 20 20 4d 44 35 49 6e 69 74 28 70  ){.    MD5Init(p
1be20 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  );.  }.  for(i=0
1be30 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a  ; i<argc; i++){.
1be40 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
1be50 7a 44 61 74 61 20 3d 20 28 63 68 61 72 2a 29 73  zData = (char*)s
1be60 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
1be70 74 28 61 72 67 76 5b 69 5d 29 3b 0a 20 20 20 20  t(argv[i]);.    
1be80 69 66 28 20 7a 44 61 74 61 20 29 7b 0a 20 20 20  if( zData ){.   
1be90 20 20 20 4d 44 35 55 70 64 61 74 65 28 70 2c 20     MD5Update(p, 
1bea0 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29  (unsigned char*)
1beb0 7a 44 61 74 61 2c 20 28 69 6e 74 29 73 74 72 6c  zData, (int)strl
1bec0 65 6e 28 7a 44 61 74 61 29 29 3b 0a 20 20 20 20  en(zData));.    
1bed0 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76  }.  }.}.static v
1bee0 6f 69 64 20 6d 64 35 66 69 6e 61 6c 69 7a 65 28  oid md5finalize(
1bef0 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
1bf00 2a 63 6f 6e 74 65 78 74 29 7b 0a 20 20 4d 44 35  *context){.  MD5
1bf10 43 6f 6e 74 65 78 74 20 2a 70 3b 0a 20 20 75 6e  Context *p;.  un
1bf20 73 69 67 6e 65 64 20 63 68 61 72 20 64 69 67 65  signed char dige
1bf30 73 74 5b 31 36 5d 3b 0a 20 20 63 68 61 72 20 7a  st[16];.  char z
1bf40 42 75 66 5b 33 33 5d 3b 0a 20 20 70 20 3d 20 73  Buf[33];.  p = s
1bf50 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74 65  qlite3_aggregate
1bf60 5f 63 6f 6e 74 65 78 74 28 63 6f 6e 74 65 78 74  _context(context
1bf70 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20  , sizeof(*p));. 
1bf80 20 4d 44 35 46 69 6e 61 6c 28 64 69 67 65 73 74   MD5Final(digest
1bf90 2c 70 29 3b 0a 20 20 4d 44 35 44 69 67 65 73 74  ,p);.  MD5Digest
1bfa0 54 6f 42 61 73 65 31 36 28 64 69 67 65 73 74 2c  ToBase16(digest,
1bfb0 20 7a 42 75 66 29 3b 0a 20 20 73 71 6c 69 74 65   zBuf);.  sqlite
1bfc0 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f  3_result_text(co
1bfd0 6e 74 65 78 74 2c 20 7a 42 75 66 2c 20 2d 31 2c  ntext, zBuf, -1,
1bfe0 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
1bff0 54 29 3b 0a 7d 0a 69 6e 74 20 4d 64 35 5f 52 65  T);.}.int Md5_Re
1c000 67 69 73 74 65 72 28 73 71 6c 69 74 65 33 20 2a  gister(sqlite3 *
1c010 64 62 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  db){.  int rc = 
1c020 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
1c030 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 6d 64 35  unction(db, "md5
1c040 73 75 6d 22 2c 20 2d 31 2c 20 53 51 4c 49 54 45  sum", -1, SQLITE
1c050 5f 55 54 46 38 2c 20 30 2c 20 30 2c 20 0a 20 20  _UTF8, 0, 0, .  
1c060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d                 m
1c080 64 35 73 74 65 70 2c 20 6d 64 35 66 69 6e 61 6c  d5step, md5final
1c090 69 7a 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ize);.  sqlite3_
1c0a0 6f 76 65 72 6c 6f 61 64 5f 66 75 6e 63 74 69 6f  overload_functio
1c0b0 6e 28 64 62 2c 20 22 6d 64 35 73 75 6d 22 2c 20  n(db, "md5sum", 
1c0c0 2d 31 29 3b 20 20 2f 2a 20 54 6f 20 65 78 65 72  -1);  /* To exer
1c0d0 63 69 73 65 20 74 68 69 73 20 41 50 49 20 2a 2f  cise this API */
1c0e0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1c0f0 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65  #endif /* define
1c100 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 20 2a  d(SQLITE_TEST) *
1c110 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  /.../*.** If the
1c120 20 6d 61 63 72 6f 20 54 43 4c 53 48 20 69 73 20   macro TCLSH is 
1c130 6f 6e 65 2c 20 74 68 65 6e 20 70 75 74 20 69 6e  one, then put in
1c140 20 63 6f 64 65 20 74 68 69 73 20 66 6f 72 20 74   code this for t
1c150 68 65 0a 2a 2a 20 22 6d 61 69 6e 22 20 72 6f 75  he.** "main" rou
1c160 74 69 6e 65 20 74 68 61 74 20 77 69 6c 6c 20 69  tine that will i
1c170 6e 69 74 69 61 6c 69 7a 65 20 54 63 6c 20 61 6e  nitialize Tcl an
1c180 64 20 74 61 6b 65 20 69 6e 70 75 74 20 66 72 6f  d take input fro
1c190 6d 0a 2a 2a 20 73 74 61 6e 64 61 72 64 20 69 6e  m.** standard in
1c1a0 70 75 74 2c 20 6f 72 20 69 66 20 61 20 66 69 6c  put, or if a fil
1c1b0 65 20 69 73 20 6e 61 6d 65 64 20 6f 6e 20 74 68  e is named on th
1c1c0 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 0a 2a  e command line.*
1c1d0 2a 20 74 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * the TCL interp
1c1e0 72 65 74 65 72 20 72 65 61 64 73 20 61 6e 64 20  reter reads and 
1c1f0 65 76 61 6c 75 61 74 65 73 20 74 68 61 74 20 66  evaluates that f
1c200 69 6c 65 2e 0a 2a 2f 0a 23 69 66 20 54 43 4c 53  ile..*/.#if TCLS
1c210 48 3d 3d 31 0a 73 74 61 74 69 63 20 63 6f 6e 73  H==1.static cons
1c220 74 20 63 68 61 72 20 2a 74 63 6c 73 68 5f 6d 61  t char *tclsh_ma
1c230 69 6e 5f 6c 6f 6f 70 28 76 6f 69 64 29 7b 0a 20  in_loop(void){. 
1c240 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68   static const ch
1c250 61 72 20 7a 4d 61 69 6e 6c 6f 6f 70 5b 5d 20 3d  ar zMainloop[] =
1c260 0a 20 20 20 20 22 73 65 74 20 6c 69 6e 65 20 7b  .    "set line {
1c270 7d 5c 6e 22 0a 20 20 20 20 22 77 68 69 6c 65 20  }\n".    "while 
1c280 7b 21 5b 65 6f 66 20 73 74 64 69 6e 5d 7d 20 7b  {![eof stdin]} {
1c290 5c 6e 22 0a 20 20 20 20 20 20 22 69 66 20 7b 24  \n".      "if {$
1c2a0 6c 69 6e 65 21 3d 5c 22 5c 22 7d 20 7b 5c 6e 22  line!=\"\"} {\n"
1c2b0 0a 20 20 20 20 20 20 20 20 22 70 75 74 73 20 2d  .        "puts -
1c2c0 6e 6f 6e 65 77 6c 69 6e 65 20 5c 22 3e 20 5c 22  nonewline \"> \"
1c2d0 5c 6e 22 0a 20 20 20 20 20 20 22 7d 20 65 6c 73  \n".      "} els
1c2e0 65 20 7b 5c 6e 22 0a 20 20 20 20 20 20 20 20 22  e {\n".        "
1c2f0 70 75 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20  puts -nonewline 
1c300 5c 22 25 20 5c 22 5c 6e 22 0a 20 20 20 20 20 20  \"% \"\n".      
1c310 22 7d 5c 6e 22 0a 20 20 20 20 20 20 22 66 6c 75  "}\n".      "flu
1c320 73 68 20 73 74 64 6f 75 74 5c 6e 22 0a 20 20 20  sh stdout\n".   
1c330 20 20 20 22 61 70 70 65 6e 64 20 6c 69 6e 65 20     "append line 
1c340 5b 67 65 74 73 20 73 74 64 69 6e 5d 5c 6e 22 0a  [gets stdin]\n".
1c350 20 20 20 20 20 20 22 69 66 20 7b 5b 69 6e 66 6f        "if {[info
1c360 20 63 6f 6d 70 6c 65 74 65 20 24 6c 69 6e 65 5d   complete $line]
1c370 7d 20 7b 5c 6e 22 0a 20 20 20 20 20 20 20 20 22  } {\n".        "
1c380 69 66 20 7b 5b 63 61 74 63 68 20 7b 75 70 6c 65  if {[catch {uple
1c390 76 65 6c 20 23 30 20 24 6c 69 6e 65 7d 20 72 65  vel #0 $line} re
1c3a0 73 75 6c 74 5d 7d 20 7b 5c 6e 22 0a 20 20 20 20  sult]} {\n".    
1c3b0 20 20 20 20 20 20 22 70 75 74 73 20 73 74 64 65        "puts stde
1c3c0 72 72 20 5c 22 45 72 72 6f 72 3a 20 24 72 65 73  rr \"Error: $res
1c3d0 75 6c 74 5c 22 5c 6e 22 0a 20 20 20 20 20 20 20  ult\"\n".       
1c3e0 20 22 7d 20 65 6c 73 65 69 66 20 7b 24 72 65 73   "} elseif {$res
1c3f0 75 6c 74 21 3d 5c 22 5c 22 7d 20 7b 5c 6e 22 0a  ult!=\"\"} {\n".
1c400 20 20 20 20 20 20 20 20 20 20 22 70 75 74 73 20            "puts 
1c410 24 72 65 73 75 6c 74 5c 6e 22 0a 20 20 20 20 20  $result\n".     
1c420 20 20 20 22 7d 5c 6e 22 0a 20 20 20 20 20 20 20     "}\n".       
1c430 20 22 73 65 74 20 6c 69 6e 65 20 7b 7d 5c 6e 22   "set line {}\n"
1c440 0a 20 20 20 20 20 20 22 7d 20 65 6c 73 65 20 7b  .      "} else {
1c450 5c 6e 22 0a 20 20 20 20 20 20 20 20 22 61 70 70  \n".        "app
1c460 65 6e 64 20 6c 69 6e 65 20 5c 5c 6e 5c 6e 22 0a  end line \\n\n".
1c470 20 20 20 20 20 20 22 7d 5c 6e 22 0a 20 20 20 20        "}\n".    
1c480 22 7d 5c 6e 22 0a 20 20 3b 0a 20 20 72 65 74 75  "}\n".  ;.  retu
1c490 72 6e 20 7a 4d 61 69 6e 6c 6f 6f 70 3b 0a 7d 0a  rn zMainloop;.}.
1c4a0 23 65 6e 64 69 66 0a 23 69 66 20 54 43 4c 53 48  #endif.#if TCLSH
1c4b0 3d 3d 32 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  ==2.static const
1c4c0 20 63 68 61 72 20 2a 74 63 6c 73 68 5f 6d 61 69   char *tclsh_mai
1c4d0 6e 5f 6c 6f 6f 70 28 76 6f 69 64 29 3b 0a 23 65  n_loop(void);.#e
1c4e0 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c  ndif..#ifdef SQL
1c4f0 49 54 45 5f 54 45 53 54 0a 73 74 61 74 69 63 20  ITE_TEST.static 
1c500 76 6f 69 64 20 69 6e 69 74 5f 61 6c 6c 28 54 63  void init_all(Tc
1c510 6c 5f 49 6e 74 65 72 70 20 2a 29 3b 0a 73 74 61  l_Interp *);.sta
1c520 74 69 63 20 69 6e 74 20 69 6e 69 74 5f 61 6c 6c  tic int init_all
1c530 5f 63 6d 64 28 0a 20 20 43 6c 69 65 6e 74 44 61  _cmd(.  ClientDa
1c540 74 61 20 63 64 2c 0a 20 20 54 63 6c 5f 49 6e 74  ta cd,.  Tcl_Int
1c550 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
1c560 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
1c570 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
1c580 0a 29 7b 0a 0a 20 20 54 63 6c 5f 49 6e 74 65 72  .){..  Tcl_Inter
1c590 70 20 2a 73 6c 61 76 65 3b 0a 20 20 69 66 28 20  p *slave;.  if( 
1c5a0 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  objc!=2 ){.    T
1c5b0 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
1c5c0 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
1c5d0 20 22 53 4c 41 56 45 22 29 3b 0a 20 20 20 20 72   "SLAVE");.    r
1c5e0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1c5f0 0a 20 20 7d 0a 0a 20 20 73 6c 61 76 65 20 3d 20  .  }..  slave = 
1c600 54 63 6c 5f 47 65 74 53 6c 61 76 65 28 69 6e 74  Tcl_GetSlave(int
1c610 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
1c620 6e 67 28 6f 62 6a 76 5b 31 5d 29 29 3b 0a 20 20  ng(objv[1]));.  
1c630 69 66 28 20 21 73 6c 61 76 65 20 29 7b 0a 20 20  if( !slave ){.  
1c640 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
1c650 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 6e 69 74 5f  OR;.  }..  init_
1c660 61 6c 6c 28 73 6c 61 76 65 29 3b 0a 20 20 72 65  all(slave);.  re
1c670 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
1c680 2f 2a 0a 2a 2a 20 54 63 6c 63 6d 64 3a 20 64 62  /*.** Tclcmd: db
1c690 5f 75 73 65 5f 6c 65 67 61 63 79 5f 70 72 65 70  _use_legacy_prep
1c6a0 61 72 65 20 44 42 20 42 4f 4f 4c 45 41 4e 0a 2a  are DB BOOLEAN.*
1c6b0 2a 0a 2a 2a 20 20 20 54 68 65 20 66 69 72 73 74  *.**   The first
1c6c0 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69   argument to thi
1c6d0 73 20 63 6f 6d 6d 61 6e 64 20 6d 75 73 74 20 62  s command must b
1c6e0 65 20 61 20 64 61 74 61 62 61 73 65 20 63 6f 6d  e a database com
1c6f0 6d 61 6e 64 20 63 72 65 61 74 65 64 20 62 79 0a  mand created by.
1c700 2a 2a 20 20 20 5b 73 71 6c 69 74 65 33 5d 2e 20  **   [sqlite3]. 
1c710 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  If the second ar
1c720 67 75 6d 65 6e 74 20 69 73 20 74 72 75 65 2c 20  gument is true, 
1c730 74 68 65 6e 20 74 68 65 20 68 61 6e 64 6c 65 20  then the handle 
1c740 69 73 20 63 6f 6e 66 69 67 75 72 65 64 0a 2a 2a  is configured.**
1c750 20 20 20 74 6f 20 75 73 65 20 74 68 65 20 73 71     to use the sq
1c760 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
1c770 28 29 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 70  () function to p
1c780 72 65 70 61 72 65 20 73 74 61 74 65 6d 65 6e 74  repare statement
1c790 73 2e 20 49 66 20 69 74 0a 2a 2a 20 20 20 69 73  s. If it.**   is
1c7a0 20 66 61 6c 73 65 2c 20 73 71 6c 69 74 65 33 5f   false, sqlite3_
1c7b0 70 72 65 70 61 72 65 28 29 2e 0a 2a 2f 0a 73 74  prepare()..*/.st
1c7c0 61 74 69 63 20 69 6e 74 20 64 62 5f 75 73 65 5f  atic int db_use_
1c7d0 6c 65 67 61 63 79 5f 70 72 65 70 61 72 65 5f 63  legacy_prepare_c
1c7e0 6d 64 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61  md(.  ClientData
1c7f0 20 63 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72   cd,.  Tcl_Inter
1c800 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
1c810 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
1c820 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
1c830 7b 0a 20 20 54 63 6c 5f 43 6d 64 49 6e 66 6f 20  {.  Tcl_CmdInfo 
1c840 63 6d 64 49 6e 66 6f 3b 0a 20 20 53 71 6c 69 74  cmdInfo;.  Sqlit
1c850 65 44 62 20 2a 70 44 62 3b 0a 20 20 69 6e 74 20  eDb *pDb;.  int 
1c860 62 50 72 65 70 61 72 65 3b 0a 0a 20 20 69 66 28  bPrepare;..  if(
1c870 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20   objc!=3 ){.    
1c880 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
1c890 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
1c8a0 2c 20 22 44 42 20 42 4f 4f 4c 45 41 4e 22 29 3b  , "DB BOOLEAN");
1c8b0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
1c8c0 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66  ERROR;.  }..  if
1c8d0 28 20 21 54 63 6c 5f 47 65 74 43 6f 6d 6d 61 6e  ( !Tcl_GetComman
1c8e0 64 49 6e 66 6f 28 69 6e 74 65 72 70 2c 20 54 63  dInfo(interp, Tc
1c8f0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
1c900 5b 31 5d 29 2c 20 26 63 6d 64 49 6e 66 6f 29 20  [1]), &cmdInfo) 
1c910 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
1c920 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
1c930 22 6e 6f 20 73 75 63 68 20 64 62 3a 20 22 2c 20  "no such db: ", 
1c940 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
1c950 6a 76 5b 31 5d 29 2c 20 28 63 68 61 72 2a 29 30  jv[1]), (char*)0
1c960 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
1c970 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70  L_ERROR;.  }.  p
1c980 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29  Db = (SqliteDb*)
1c990 63 6d 64 49 6e 66 6f 2e 6f 62 6a 43 6c 69 65 6e  cmdInfo.objClien
1c9a0 74 44 61 74 61 3b 0a 20 20 69 66 28 20 54 63 6c  tData;.  if( Tcl
1c9b0 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f  _GetBooleanFromO
1c9c0 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
1c9d0 32 5d 2c 20 26 62 50 72 65 70 61 72 65 29 20 29  2], &bPrepare) )
1c9e0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  {.    return TCL
1c9f0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 70  _ERROR;.  }..  p
1ca00 44 62 2d 3e 62 4c 65 67 61 63 79 50 72 65 70 61  Db->bLegacyPrepa
1ca10 72 65 20 3d 20 62 50 72 65 70 61 72 65 3b 0a 0a  re = bPrepare;..
1ca20 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c    Tcl_ResetResul
1ca30 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 72 65 74  t(interp);.  ret
1ca40 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65  urn TCL_OK;.}.#e
1ca50 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66  ndif../*.** Conf
1ca60 69 67 75 72 65 20 74 68 65 20 69 6e 74 65 72 70  igure the interp
1ca70 72 65 74 65 72 20 70 61 73 73 65 64 20 61 73 20  reter passed as 
1ca80 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
1ca90 6e 74 20 74 6f 20 68 61 76 65 20 61 63 63 65 73  nt to have acces
1caa0 73 0a 2a 2a 20 74 6f 20 74 68 65 20 63 6f 6d 6d  s.** to the comm
1cab0 61 6e 64 73 20 61 6e 64 20 6c 69 6e 6b 65 64 20  ands and linked 
1cac0 76 61 72 69 61 62 6c 65 73 20 74 68 61 74 20 6d  variables that m
1cad0 61 6b 65 20 75 70 3a 0a 2a 2a 0a 2a 2a 20 20 20  ake up:.**.**   
1cae0 2a 20 74 68 65 20 5b 73 71 6c 69 74 65 33 5d 20  * the [sqlite3] 
1caf0 65 78 74 65 6e 73 69 6f 6e 20 69 74 73 65 6c 66  extension itself
1cb00 2c 20 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20  , .**.**   * If 
1cb10 53 51 4c 49 54 45 5f 54 43 4c 4d 44 35 20 6f 72  SQLITE_TCLMD5 or
1cb20 20 53 51 4c 49 54 45 5f 54 45 53 54 20 69 73 20   SQLITE_TEST is 
1cb30 64 65 66 69 6e 65 64 2c 20 74 68 65 20 4d 64 35  defined, the Md5
1cb40 20 63 6f 6d 6d 61 6e 64 73 2c 20 61 6e 64 0a 2a   commands, and.*
1cb50 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 53 51 4c 49  *.**   * If SQLI
1cb60 54 45 5f 54 45 53 54 20 69 73 20 73 65 74 2c 20  TE_TEST is set, 
1cb70 74 68 65 20 76 61 72 69 6f 75 73 20 74 65 73 74  the various test
1cb80 20 69 6e 74 65 72 66 61 63 65 73 20 75 73 65 64   interfaces used
1cb90 20 62 79 20 74 68 65 20 54 63 6c 0a 2a 2a 20 20   by the Tcl.**  
1cba0 20 20 20 74 65 73 74 20 73 75 69 74 65 2e 0a 2a     test suite..*
1cbb0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e  /.static void in
1cbc0 69 74 5f 61 6c 6c 28 54 63 6c 5f 49 6e 74 65 72  it_all(Tcl_Inter
1cbd0 70 20 2a 69 6e 74 65 72 70 29 7b 0a 20 20 53 71  p *interp){.  Sq
1cbe0 6c 69 74 65 33 5f 49 6e 69 74 28 69 6e 74 65 72  lite3_Init(inter
1cbf0 70 29 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  p);..#if defined
1cc00 28 53 51 4c 49 54 45 5f 54 45 53 54 29 20 7c 7c  (SQLITE_TEST) ||
1cc10 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
1cc20 54 43 4c 4d 44 35 29 0a 20 20 4d 64 35 5f 49 6e  TCLMD5).  Md5_In
1cc30 69 74 28 69 6e 74 65 72 70 29 3b 0a 23 65 6e 64  it(interp);.#end
1cc40 69 66 0a 0a 20 20 2f 2a 20 49 6e 73 74 61 6c 6c  if..  /* Install
1cc50 20 74 68 65 20 5b 72 65 67 69 73 74 65 72 5f 64   the [register_d
1cc60 62 73 74 61 74 5f 76 74 61 62 5d 20 63 6f 6d 6d  bstat_vtab] comm
1cc70 61 6e 64 20 74 6f 20 61 63 63 65 73 73 20 74 68  and to access th
1cc80 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
1cc90 0a 20 20 2a 2a 20 6f 66 20 76 69 72 74 75 61 6c  .  ** of virtual
1cca0 20 74 61 62 6c 65 20 64 62 73 74 61 74 20 28 73   table dbstat (s
1ccb0 6f 75 72 63 65 20 66 69 6c 65 20 74 65 73 74 5f  ource file test_
1ccc0 73 74 61 74 2e 63 29 2e 20 54 68 69 73 20 63 6f  stat.c). This co
1ccd0 6d 6d 61 6e 64 20 69 73 0a 20 20 2a 2a 20 72 65  mmand is.  ** re
1cce0 71 75 69 72 65 64 20 66 6f 72 20 74 65 73 74 66  quired for testf
1ccf0 69 78 74 75 72 65 20 61 6e 64 20 73 71 6c 69 74  ixture and sqlit
1cd00 65 33 5f 61 6e 61 6c 79 7a 65 72 2c 20 62 75 74  e3_analyzer, but
1cd10 20 6e 6f 74 20 62 79 20 74 68 65 20 70 72 6f 64   not by the prod
1cd20 75 63 74 69 6f 6e 0a 20 20 2a 2a 20 54 63 6c 20  uction.  ** Tcl 
1cd30 65 78 74 65 6e 73 69 6f 6e 2e 20 20 2a 2f 0a 23  extension.  */.#
1cd40 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
1cd50 45 5f 54 45 53 54 29 20 7c 7c 20 54 43 4c 53 48  E_TEST) || TCLSH
1cd60 3d 3d 32 0a 20 20 7b 0a 20 20 20 20 65 78 74 65  ==2.  {.    exte
1cd70 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73  rn int Sqlitetes
1cd80 74 53 74 61 74 5f 49 6e 69 74 28 54 63 6c 5f 49  tStat_Init(Tcl_I
1cd90 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 53 71 6c  nterp*);.    Sql
1cda0 69 74 65 74 65 73 74 53 74 61 74 5f 49 6e 69 74  itetestStat_Init
1cdb0 28 69 6e 74 65 72 70 29 3b 0a 20 20 7d 0a 23 65  (interp);.  }.#e
1cdc0 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c  ndif..#ifdef SQL
1cdd0 49 54 45 5f 54 45 53 54 0a 20 20 7b 0a 20 20 20  ITE_TEST.  {.   
1cde0 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69   extern int Sqli
1cdf0 74 65 63 6f 6e 66 69 67 5f 49 6e 69 74 28 54 63  teconfig_Init(Tc
1ce00 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20  l_Interp*);.    
1ce10 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74  extern int Sqlit
1ce20 65 74 65 73 74 31 5f 49 6e 69 74 28 54 63 6c 5f  etest1_Init(Tcl_
1ce30 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78  Interp*);.    ex
1ce40 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74  tern int Sqlitet
1ce50 65 73 74 32 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  est2_Init(Tcl_In
1ce60 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65  terp*);.    exte
1ce70 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73  rn int Sqlitetes
1ce80 74 33 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  t3_Init(Tcl_Inte
1ce90 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e  rp*);.    extern
1cea0 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 34   int Sqlitetest4
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 65 78 74 65 72 6e 20 69  *);.    extern i
1ced0 6e 74 20 53 71 6c 69 74 65 74 65 73 74 35 5f 49  nt Sqlitetest5_I
1cee0 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29  nit(Tcl_Interp*)
1cef0 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74  ;.    extern int
1cf00 20 53 71 6c 69 74 65 74 65 73 74 36 5f 49 6e 69   Sqlitetest6_Ini
1cf10 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a  t(Tcl_Interp*);.
1cf20 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53      extern int S
1cf30 71 6c 69 74 65 74 65 73 74 37 5f 49 6e 69 74 28  qlitetest7_Init(
1cf40 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20  Tcl_Interp*);.  
1cf50 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c    extern int Sql
1cf60 69 74 65 74 65 73 74 38 5f 49 6e 69 74 28 54 63  itetest8_Init(Tc
1cf70 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20  l_Interp*);.    
1cf80 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74  extern int Sqlit
1cf90 65 74 65 73 74 39 5f 49 6e 69 74 28 54 63 6c 5f  etest9_Init(Tcl_
1cfa0 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78  Interp*);.    ex
1cfb0 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74  tern int Sqlitet
1cfc0 65 73 74 61 73 79 6e 63 5f 49 6e 69 74 28 54 63  estasync_Init(Tc
1cfd0 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20  l_Interp*);.    
1cfe0 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74  extern int Sqlit
1cff0 65 74 65 73 74 5f 61 75 74 6f 65 78 74 5f 49 6e  etest_autoext_In
1d000 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b  it(Tcl_Interp*);
1d010 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20  .    extern int 
1d020 53 71 6c 69 74 65 74 65 73 74 5f 64 65 6d 6f 76  Sqlitetest_demov
1d030 66 73 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  fs_Init(Tcl_Inte
1d040 72 70 20 2a 29 3b 0a 20 20 20 20 65 78 74 65 72  rp *);.    exter
1d050 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74  n int Sqlitetest
1d060 5f 66 75 6e 63 5f 49 6e 69 74 28 54 63 6c 5f 49  _func_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 5f 68 65 78 69 6f 5f 49 6e 69 74 28 54 63  st_hexio_Init(Tc
1d0a0 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20  l_Interp*);.    
1d0b0 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74  extern int Sqlit
1d0c0 65 74 65 73 74 5f 69 6e 69 74 5f 49 6e 69 74 28  etest_init_Init(
1d0d0 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20  Tcl_Interp*);.  
1d0e0 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c    extern int Sql
1d0f0 69 74 65 74 65 73 74 5f 6d 61 6c 6c 6f 63 5f 49  itetest_malloc_I
1d100 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29  nit(Tcl_Interp*)
1d110 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74  ;.    extern int
1d120 20 53 71 6c 69 74 65 74 65 73 74 5f 6d 75 74 65   Sqlitetest_mute
1d130 78 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  x_Init(Tcl_Inter
1d140 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20  p*);.    extern 
1d150 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 73 63  int Sqlitetestsc
1d160 68 65 6d 61 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  hema_Init(Tcl_In
1d170 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65  terp*);.    exte
1d180 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73  rn int Sqlitetes
1d190 74 73 73 65 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  tsse_Init(Tcl_In
1d1a0 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65  terp*);.    exte
1d1b0 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73  rn int Sqlitetes
1d1c0 74 74 63 6c 76 61 72 5f 49 6e 69 74 28 54 63 6c  ttclvar_Init(Tcl
1d1d0 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65  _Interp*);.    e
1d1e0 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65  xtern int Sqlite
1d1f0 74 65 73 74 66 73 5f 49 6e 69 74 28 54 63 6c 5f  testfs_Init(Tcl_
1d200 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78  Interp*);.    ex
1d210 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74  tern int Sqlitet
1d220 65 73 74 54 68 72 65 61 64 5f 49 6e 69 74 28 54  estThread_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 4f 6e 65 66 69 6c 65 5f 49 6e  tetestOnefile_In
1d260 69 74 28 29 3b 0a 20 20 20 20 65 78 74 65 72 6e  it();.    extern
1d270 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 4f   int SqlitetestO
1d280 73 69 6e 73 74 5f 49 6e 69 74 28 54 63 6c 5f 49  sinst_Init(Tcl_I
1d290 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74  nterp*);.    ext
1d2a0 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65  ern int Sqlitete
1d2b0 73 74 62 61 63 6b 75 70 5f 49 6e 69 74 28 54 63  stbackup_Init(Tc
1d2c0 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20  l_Interp*);.    
1d2d0 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74  extern int Sqlit
1d2e0 65 74 65 73 74 69 6e 74 61 72 72 61 79 5f 49 6e  etestintarray_In
1d2f0 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b  it(Tcl_Interp*);
1d300 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20  .    extern int 
1d310 53 71 6c 69 74 65 74 65 73 74 76 66 73 5f 49 6e  Sqlitetestvfs_In
1d320 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 29  it(Tcl_Interp *)
1d330 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74  ;.    extern int
1d340 20 53 71 6c 69 74 65 74 65 73 74 72 74 72 65 65   Sqlitetestrtree
1d350 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
1d360 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69  *);.    extern i
1d370 6e 74 20 53 71 6c 69 74 65 71 75 6f 74 61 5f 49  nt Sqlitequota_I
1d380 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29  nit(Tcl_Interp*)
1d390 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74  ;.    extern int
1d3a0 20 53 71 6c 69 74 65 6d 75 6c 74 69 70 6c 65 78   Sqlitemultiplex
1d3b0 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
1d3c0 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69  *);.    extern i
1d3d0 6e 74 20 53 71 6c 69 74 65 53 75 70 65 72 6c 6f  nt SqliteSuperlo
1d3e0 63 6b 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  ck_Init(Tcl_Inte
1d3f0 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e  rp*);.    extern
1d400 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 53   int SqlitetestS
1d410 79 73 63 61 6c 6c 5f 49 6e 69 74 28 54 63 6c 5f  yscall_Init(Tcl_
1d420 49 6e 74 65 72 70 2a 29 3b 0a 23 69 66 20 64 65  Interp*);.#if de
1d430 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
1d440 42 4c 45 5f 53 45 53 53 49 4f 4e 29 20 26 26 20  BLE_SESSION) && 
1d450 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
1d460 4e 41 42 4c 45 5f 50 52 45 55 50 44 41 54 45 5f  NABLE_PREUPDATE_
1d470 48 4f 4f 4b 29 0a 20 20 20 20 65 78 74 65 72 6e  HOOK).    extern
1d480 20 69 6e 74 20 54 65 73 74 53 65 73 73 69 6f 6e   int TestSession
1d490 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
1d4a0 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  *);.#endif..#if 
1d4b0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
1d4c0 4e 41 42 4c 45 5f 46 54 53 33 29 20 7c 7c 20 64  NABLE_FTS3) || d
1d4d0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
1d4e0 41 42 4c 45 5f 46 54 53 34 29 0a 20 20 20 20 65  ABLE_FTS4).    e
1d4f0 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65  xtern int Sqlite
1d500 74 65 73 74 66 74 73 33 5f 49 6e 69 74 28 54 63  testfts3_Init(Tc
1d510 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
1d520 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65  );.#endif..#ifde
1d530 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
1d540 5a 49 50 56 46 53 0a 20 20 20 20 65 78 74 65 72  ZIPVFS.    exter
1d550 6e 20 69 6e 74 20 5a 69 70 76 66 73 5f 49 6e 69  n int Zipvfs_Ini
1d560 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a  t(Tcl_Interp*);.
1d570 20 20 20 20 5a 69 70 76 66 73 5f 49 6e 69 74 28      Zipvfs_Init(
1d580 69 6e 74 65 72 70 29 3b 0a 23 65 6e 64 69 66 0a  interp);.#endif.
1d590 0a 20 20 20 20 53 71 6c 69 74 65 63 6f 6e 66 69  .    Sqliteconfi
1d5a0 67 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a  g_Init(interp);.
1d5b0 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 31 5f      Sqlitetest1_
1d5c0 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  Init(interp);.  
1d5d0 20 20 53 71 6c 69 74 65 74 65 73 74 32 5f 49 6e    Sqlitetest2_In
1d5e0 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  it(interp);.    
1d5f0 53 71 6c 69 74 65 74 65 73 74 33 5f 49 6e 69 74  Sqlitetest3_Init
1d600 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71  (interp);.    Sq
1d610 6c 69 74 65 74 65 73 74 34 5f 49 6e 69 74 28 69  litetest4_Init(i
1d620 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69  nterp);.    Sqli
1d630 74 65 74 65 73 74 35 5f 49 6e 69 74 28 69 6e 74  tetest5_Init(int
1d640 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65  erp);.    Sqlite
1d650 74 65 73 74 36 5f 49 6e 69 74 28 69 6e 74 65 72  test6_Init(inter
1d660 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65  p);.    Sqlitete
1d670 73 74 37 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  st7_Init(interp)
1d680 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74  ;.    Sqlitetest
1d690 38 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a  8_Init(interp);.
1d6a0 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 39 5f      Sqlitetest9_
1d6b0 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  Init(interp);.  
1d6c0 20 20 53 71 6c 69 74 65 74 65 73 74 61 73 79 6e    Sqlitetestasyn
1d6d0 63 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a  c_Init(interp);.
1d6e0 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 5f 61      Sqlitetest_a
1d6f0 75 74 6f 65 78 74 5f 49 6e 69 74 28 69 6e 74 65  utoext_Init(inte
1d700 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74  rp);.    Sqlitet
1d710 65 73 74 5f 64 65 6d 6f 76 66 73 5f 49 6e 69 74  est_demovfs_Init
1d720 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71  (interp);.    Sq
1d730 6c 69 74 65 74 65 73 74 5f 66 75 6e 63 5f 49 6e  litetest_func_In
1d740 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  it(interp);.    
1d750 53 71 6c 69 74 65 74 65 73 74 5f 68 65 78 69 6f  Sqlitetest_hexio
1d760 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20  _Init(interp);. 
1d770 20 20 20 53 71 6c 69 74 65 74 65 73 74 5f 69 6e     Sqlitetest_in
1d780 69 74 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b  it_Init(interp);
1d790 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 5f  .    Sqlitetest_
1d7a0 6d 61 6c 6c 6f 63 5f 49 6e 69 74 28 69 6e 74 65  malloc_Init(inte
1d7b0 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74  rp);.    Sqlitet
1d7c0 65 73 74 5f 6d 75 74 65 78 5f 49 6e 69 74 28 69  est_mutex_Init(i
1d7d0 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69  nterp);.    Sqli
1d7e0 74 65 74 65 73 74 73 63 68 65 6d 61 5f 49 6e 69  tetestschema_Ini
1d7f0 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53  t(interp);.    S
1d800 71 6c 69 74 65 74 65 73 74 74 63 6c 76 61 72 5f  qlitetesttclvar_
1d810 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  Init(interp);.  
1d820 20 20 53 71 6c 69 74 65 74 65 73 74 66 73 5f 49    Sqlitetestfs_I
1d830 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20  nit(interp);.   
1d840 20 53 71 6c 69 74 65 74 65 73 74 54 68 72 65 61   SqlitetestThrea
1d850 64 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a  d_Init(interp);.
1d860 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 4f 6e      SqlitetestOn
1d870 65 66 69 6c 65 5f 49 6e 69 74 28 69 6e 74 65 72  efile_Init(inter
1d880 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65  p);.    Sqlitete
1d890 73 74 4f 73 69 6e 73 74 5f 49 6e 69 74 28 69 6e  stOsinst_Init(in
1d8a0 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74  terp);.    Sqlit
1d8b0 65 74 65 73 74 62 61 63 6b 75 70 5f 49 6e 69 74  etestbackup_Init
1d8c0 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71  (interp);.    Sq
1d8d0 6c 69 74 65 74 65 73 74 69 6e 74 61 72 72 61 79  litetestintarray
1d8e0 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20  _Init(interp);. 
1d8f0 20 20 20 53 71 6c 69 74 65 74 65 73 74 76 66 73     Sqlitetestvfs
1d900 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20  _Init(interp);. 
1d910 20 20 20 53 71 6c 69 74 65 74 65 73 74 72 74 72     Sqlitetestrtr
1d920 65 65 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b  ee_Init(interp);
1d930 0a 20 20 20 20 53 71 6c 69 74 65 71 75 6f 74 61  .    Sqlitequota
1d940 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20  _Init(interp);. 
1d950 20 20 20 53 71 6c 69 74 65 6d 75 6c 74 69 70 6c     Sqlitemultipl
1d960 65 78 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b  ex_Init(interp);
1d970 0a 20 20 20 20 53 71 6c 69 74 65 53 75 70 65 72  .    SqliteSuper
1d980 6c 6f 63 6b 5f 49 6e 69 74 28 69 6e 74 65 72 70  lock_Init(interp
1d990 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73  );.    Sqlitetes
1d9a0 74 53 79 73 63 61 6c 6c 5f 49 6e 69 74 28 69 6e  tSyscall_Init(in
1d9b0 74 65 72 70 29 3b 0a 23 69 66 20 64 65 66 69 6e  terp);.#if defin
1d9c0 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
1d9d0 5f 53 45 53 53 49 4f 4e 29 20 26 26 20 64 65 66  _SESSION) && def
1d9e0 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
1d9f0 4c 45 5f 50 52 45 55 50 44 41 54 45 5f 48 4f 4f  LE_PREUPDATE_HOO
1da00 4b 29 0a 20 20 20 20 54 65 73 74 53 65 73 73 69  K).    TestSessi
1da10 6f 6e 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b  on_Init(interp);
1da20 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66  .#endif..#if def
1da30 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
1da40 4c 45 5f 46 54 53 33 29 20 7c 7c 20 64 65 66 69  LE_FTS3) || defi
1da50 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
1da60 45 5f 46 54 53 34 29 0a 20 20 20 20 53 71 6c 69  E_FTS4).    Sqli
1da70 74 65 74 65 73 74 66 74 73 33 5f 49 6e 69 74 28  tetestfts3_Init(
1da80 69 6e 74 65 72 70 29 3b 0a 23 65 6e 64 69 66 0a  interp);.#endif.
1da90 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f  .    Tcl_CreateO
1daa0 62 6a 43 6f 6d 6d 61 6e 64 28 0a 20 20 20 20 20  bjCommand(.     
1dab0 20 20 20 69 6e 74 65 72 70 2c 20 22 6c 6f 61 64     interp, "load
1dac0 5f 74 65 73 74 66 69 78 74 75 72 65 5f 65 78 74  _testfixture_ext
1dad0 65 6e 73 69 6f 6e 73 22 2c 20 69 6e 69 74 5f 61  ensions", init_a
1dae0 6c 6c 5f 63 6d 64 2c 20 30 2c 20 30 0a 20 20 20  ll_cmd, 0, 0.   
1daf0 20 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61   );.    Tcl_Crea
1db00 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 0a 20 20  teObjCommand(.  
1db10 20 20 20 20 20 20 69 6e 74 65 72 70 2c 20 22 64        interp, "d
1db20 62 5f 75 73 65 5f 6c 65 67 61 63 79 5f 70 72 65  b_use_legacy_pre
1db30 70 61 72 65 22 2c 20 64 62 5f 75 73 65 5f 6c 65  pare", db_use_le
1db40 67 61 63 79 5f 70 72 65 70 61 72 65 5f 63 6d 64  gacy_prepare_cmd
1db50 2c 20 30 2c 20 30 0a 20 20 20 20 29 3b 0a 0a 23  , 0, 0.    );..#
1db60 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53 53 45  ifdef SQLITE_SSE
1db70 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 73  .    Sqlitetests
1db80 73 65 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b  se_Init(interp);
1db90 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23 65 6e 64  .#endif.  }.#end
1dba0 69 66 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 54 43  if.}..#define TC
1dbb0 4c 53 48 5f 4d 41 49 4e 20 6d 61 69 6e 20 20 20  LSH_MAIN main   
1dbc0 2f 2a 20 4e 65 65 64 65 64 20 74 6f 20 66 61 6b  /* Needed to fak
1dbd0 65 20 6f 75 74 20 6d 6b 74 63 6c 61 70 70 20 2a  e out mktclapp *
1dbe0 2f 0a 69 6e 74 20 54 43 4c 53 48 5f 4d 41 49 4e  /.int TCLSH_MAIN
1dbf0 28 69 6e 74 20 61 72 67 63 2c 20 63 68 61 72 20  (int argc, char 
1dc00 2a 2a 61 72 67 76 29 7b 0a 20 20 54 63 6c 5f 49  **argv){.  Tcl_I
1dc10 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 3b 0a 0a  nterp *interp;..
1dc20 23 69 66 20 21 64 65 66 69 6e 65 64 28 5f 57 49  #if !defined(_WI
1dc30 4e 33 32 5f 57 43 45 29 0a 20 20 69 66 28 20 67  N32_WCE).  if( g
1dc40 65 74 65 6e 76 28 22 42 52 45 41 4b 22 29 20 29  etenv("BREAK") )
1dc50 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74  {.    fprintf(st
1dc60 64 65 72 72 2c 0a 20 20 20 20 20 20 20 20 22 61  derr,.        "a
1dc70 74 74 61 63 68 20 64 65 62 75 67 67 65 72 20 74  ttach debugger t
1dc80 6f 20 70 72 6f 63 65 73 73 20 25 64 20 61 6e 64  o process %d and
1dc90 20 70 72 65 73 73 20 61 6e 79 20 6b 65 79 20 74   press any key t
1dca0 6f 20 63 6f 6e 74 69 6e 75 65 2e 5c 6e 22 2c 0a  o continue.\n",.
1dcb0 20 20 20 20 20 20 20 20 47 45 54 50 49 44 28 29          GETPID()
1dcc0 29 3b 0a 20 20 20 20 66 67 65 74 63 28 73 74 64  );.    fgetc(std
1dcd0 69 6e 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  in);.  }.#endif.
1dce0 0a 20 20 2f 2a 20 43 61 6c 6c 20 73 71 6c 69 74  .  /* Call sqlit
1dcf0 65 33 5f 73 68 75 74 64 6f 77 6e 28 29 20 6f 6e  e3_shutdown() on
1dd00 63 65 20 62 65 66 6f 72 65 20 64 6f 69 6e 67 20  ce before doing 
1dd10 61 6e 79 74 68 69 6e 67 20 65 6c 73 65 2e 20 54  anything else. T
1dd20 68 69 73 20 69 73 20 74 6f 0a 20 20 2a 2a 20 74  his is to.  ** t
1dd30 65 73 74 20 74 68 61 74 20 73 71 6c 69 74 65 33  est that sqlite3
1dd40 5f 73 68 75 74 64 6f 77 6e 28 29 20 63 61 6e 20  _shutdown() can 
1dd50 62 65 20 73 61 66 65 6c 79 20 63 61 6c 6c 65 64  be safely called
1dd60 20 62 79 20 61 20 70 72 6f 63 65 73 73 20 62 65   by a process be
1dd70 66 6f 72 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65  fore.  ** sqlite
1dd80 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 20 69  3_initialize() i
1dd90 73 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  s. */.  sqlite3_
1dda0 73 68 75 74 64 6f 77 6e 28 29 3b 0a 0a 20 20 54  shutdown();..  T
1ddb0 63 6c 5f 46 69 6e 64 45 78 65 63 75 74 61 62 6c  cl_FindExecutabl
1ddc0 65 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 69 6e  e(argv[0]);.  in
1ddd0 74 65 72 70 20 3d 20 54 63 6c 5f 43 72 65 61 74  terp = Tcl_Creat
1dde0 65 49 6e 74 65 72 70 28 29 3b 0a 0a 23 69 66 20  eInterp();..#if 
1ddf0 54 43 4c 53 48 3d 3d 32 0a 20 20 73 71 6c 69 74  TCLSH==2.  sqlit
1de00 65 33 5f 63 6f 6e 66 69 67 28 53 51 4c 49 54 45  e3_config(SQLITE
1de10 5f 43 4f 4e 46 49 47 5f 53 49 4e 47 4c 45 54 48  _CONFIG_SINGLETH
1de20 52 45 41 44 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  READ);.#endif.. 
1de30 20 69 6e 69 74 5f 61 6c 6c 28 69 6e 74 65 72 70   init_all(interp
1de40 29 3b 0a 20 20 69 66 28 20 61 72 67 63 3e 3d 32  );.  if( argc>=2
1de50 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
1de60 20 20 20 63 68 61 72 20 7a 41 72 67 63 5b 33 32     char zArgc[32
1de70 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ];.    sqlite3_s
1de80 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a  nprintf(sizeof(z
1de90 41 72 67 63 29 2c 20 7a 41 72 67 63 2c 20 22 25  Argc), zArgc, "%
1dea0 64 22 2c 20 61 72 67 63 2d 28 33 2d 54 43 4c 53  d", argc-(3-TCLS
1deb0 48 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74  H));.    Tcl_Set
1dec0 56 61 72 28 69 6e 74 65 72 70 2c 22 61 72 67 63  Var(interp,"argc
1ded0 22 2c 20 7a 41 72 67 63 2c 20 54 43 4c 5f 47 4c  ", zArgc, TCL_GL
1dee0 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 20 20 20 20  OBAL_ONLY);.    
1def0 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72  Tcl_SetVar(inter
1df00 70 2c 22 61 72 67 76 30 22 2c 61 72 67 76 5b 31  p,"argv0",argv[1
1df10 5d 2c 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c  ],TCL_GLOBAL_ONL
1df20 59 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 56  Y);.    Tcl_SetV
1df30 61 72 28 69 6e 74 65 72 70 2c 22 61 72 67 76 22  ar(interp,"argv"
1df40 2c 20 22 22 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c  , "", TCL_GLOBAL
1df50 5f 4f 4e 4c 59 29 3b 0a 20 20 20 20 66 6f 72 28  _ONLY);.    for(
1df60 69 3d 33 2d 54 43 4c 53 48 3b 20 69 3c 61 72 67  i=3-TCLSH; i<arg
1df70 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 54  c; i++){.      T
1df80 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70  cl_SetVar(interp
1df90 2c 20 22 61 72 67 76 22 2c 20 61 72 67 76 5b 69  , "argv", argv[i
1dfa0 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 54 43 4c  ],.          TCL
1dfb0 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 20 7c 20 54  _GLOBAL_ONLY | T
1dfc0 43 4c 5f 4c 49 53 54 5f 45 4c 45 4d 45 4e 54 20  CL_LIST_ELEMENT 
1dfd0 7c 20 54 43 4c 5f 41 50 50 45 4e 44 5f 56 41 4c  | TCL_APPEND_VAL
1dfe0 55 45 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  UE);.    }.    i
1dff0 66 28 20 54 43 4c 53 48 3d 3d 31 20 26 26 20 54  f( TCLSH==1 && T
1e000 63 6c 5f 45 76 61 6c 46 69 6c 65 28 69 6e 74 65  cl_EvalFile(inte
1e010 72 70 2c 20 61 72 67 76 5b 31 5d 29 21 3d 54 43  rp, argv[1])!=TC
1e020 4c 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 63 6f  L_OK ){.      co
1e030 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e 66 6f 20  nst char *zInfo 
1e040 3d 20 54 63 6c 5f 47 65 74 56 61 72 28 69 6e 74  = Tcl_GetVar(int
1e050 65 72 70 2c 20 22 65 72 72 6f 72 49 6e 66 6f 22  erp, "errorInfo"
1e060 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c  , TCL_GLOBAL_ONL
1e070 59 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 49  Y);.      if( zI
1e080 6e 66 6f 3d 3d 30 20 29 20 7a 49 6e 66 6f 20 3d  nfo==0 ) zInfo =
1e090 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65   Tcl_GetStringRe
1e0a0 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  sult(interp);.  
1e0b0 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
1e0c0 72 72 2c 22 25 73 3a 20 25 73 5c 6e 22 2c 20 2a  rr,"%s: %s\n", *
1e0d0 61 72 67 76 2c 20 7a 49 6e 66 6f 29 3b 0a 20 20  argv, zInfo);.  
1e0e0 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
1e0f0 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 54 43    }.  }.  if( TC
1e100 4c 53 48 3d 3d 32 20 7c 7c 20 61 72 67 63 3c 3d  LSH==2 || argc<=
1e110 31 20 29 7b 0a 20 20 20 20 54 63 6c 5f 47 6c 6f  1 ){.    Tcl_Glo
1e120 62 61 6c 45 76 61 6c 28 69 6e 74 65 72 70 2c 20  balEval(interp, 
1e130 74 63 6c 73 68 5f 6d 61 69 6e 5f 6c 6f 6f 70 28  tclsh_main_loop(
1e140 29 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ));.  }.  return
1e150 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20   0;.}.#endif /* 
1e160 54 43 4c 53 48 20 2a 2f 0a                       TCLSH */.