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

Artifact 3213f3101e3b85f047d6e389da5a53d76d3d7540:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 41 20 54 43 4c 20  ******.** A TCL 
0180: 49 6e 74 65 72 66 61 63 65 20 74 6f 20 53 51 4c  Interface to SQL
0190: 69 74 65 2e 20 20 41 70 70 65 6e 64 20 74 68 69  ite.  Append thi
01a0: 73 20 66 69 6c 65 20 74 6f 20 73 71 6c 69 74 65  s file to sqlite
01b0: 33 2e 63 20 61 6e 64 0a 2a 2a 20 63 6f 6d 70 69  3.c and.** compi
01c0: 6c 65 20 74 68 65 20 77 68 6f 6c 65 20 74 68 69  le the whole thi
01d0: 6e 67 20 74 6f 20 62 75 69 6c 64 20 61 20 54 43  ng to build a TC
01e0: 4c 2d 65 6e 61 62 6c 65 64 20 76 65 72 73 69 6f  L-enabled versio
01f0: 6e 20 6f 66 20 53 51 4c 69 74 65 2e 0a 2a 2a 0a  n of SQLite..**.
0200: 2a 2a 20 43 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  ** Compile-time 
0210: 6f 70 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20  options:.**.**  
0220: 2d 44 54 43 4c 53 48 3d 31 20 20 20 20 20 20 20  -DTCLSH=1       
0230: 20 20 20 20 20 20 41 64 64 20 61 20 22 6d 61 69        Add a "mai
0240: 6e 28 29 22 20 72 6f 75 74 69 6e 65 20 74 68 61  n()" routine tha
0250: 74 20 77 6f 72 6b 73 20 61 73 20 61 20 74 63 6c  t works as a tcl
0260: 73 68 2e 0a 2a 2a 0a 2a 2a 20 20 2d 44 53 51 4c  sh..**.**  -DSQL
0270: 49 54 45 5f 54 43 4c 4d 44 35 20 20 20 20 20 20  ITE_TCLMD5      
0280: 20 57 68 65 6e 20 75 73 65 64 20 69 6e 20 63 6f   When used in co
0290: 6e 6a 75 63 74 69 6f 6e 20 77 69 74 68 20 2d 44  njuction with -D
02a0: 54 43 4c 53 48 3d 31 2c 20 61 64 64 0a 2a 2a 20  TCLSH=1, add.** 
02b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
02c0: 20 20 20 20 20 20 20 66 6f 75 72 20 6e 65 77 20         four new 
02d0: 63 6f 6d 6d 61 6e 64 73 20 74 6f 20 74 68 65 20  commands to the 
02e0: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
02f0: 66 6f 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  for.**          
0300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 67 65                ge
0310: 6e 65 72 61 74 69 6e 67 20 4d 44 35 20 63 68 65  nerating MD5 che
0320: 63 6b 73 75 6d 73 3a 20 20 6d 64 35 2c 20 6d 64  cksums:  md5, md
0330: 35 66 69 6c 65 2c 0a 2a 2a 20 20 20 20 20 20 20  5file,.**       
0340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0350: 20 6d 64 35 2d 31 30 78 38 2c 20 61 6e 64 20 6d   md5-10x8, and m
0360: 64 35 66 69 6c 65 2d 31 30 78 38 2e 0a 2a 2a 0a  d5file-10x8..**.
0370: 2a 2a 20 20 2d 44 53 51 4c 49 54 45 5f 54 45 53  **  -DSQLITE_TES
0380: 54 20 20 20 20 20 20 20 20 20 57 68 65 6e 20 75  T         When u
0390: 73 65 64 20 69 6e 20 63 6f 6e 6a 75 63 74 69 6f  sed in conjuctio
03a0: 6e 20 77 69 74 68 20 2d 44 54 43 4c 53 48 3d 31  n with -DTCLSH=1
03b0: 2c 20 61 64 64 0a 2a 2a 20 20 20 20 20 20 20 20  , add.**        
03c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
03d0: 68 75 6e 64 72 65 64 73 20 6f 66 20 6e 65 77 20  hundreds of new 
03e0: 63 6f 6d 6d 61 6e 64 73 20 75 73 65 64 20 66 6f  commands used fo
03f0: 72 20 74 65 73 74 69 6e 67 0a 2a 2a 20 20 20 20  r testing.**    
0400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0410: 20 20 20 20 53 51 4c 69 74 65 2e 20 20 54 68 69      SQLite.  Thi
0420: 73 20 6f 70 74 69 6f 6e 20 69 6d 70 6c 69 65 73  s option implies
0430: 20 2d 44 53 51 4c 49 54 45 5f 54 43 4c 4d 44 35   -DSQLITE_TCLMD5
0440: 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 74  ..*/.#include "t
0450: 63 6c 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c  cl.h".#include <
0460: 65 72 72 6e 6f 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20  errno.h>../*.** 
0470: 53 6f 6d 65 20 61 64 64 69 74 69 6f 6e 61 6c 20  Some additional 
0480: 69 6e 63 6c 75 64 65 20 66 69 6c 65 73 20 61 72  include files ar
0490: 65 20 6e 65 65 64 65 64 20 69 66 20 74 68 69 73  e needed if this
04a0: 20 66 69 6c 65 20 69 73 20 6e 6f 74 0a 2a 2a 20   file is not.** 
04b0: 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20  appended to the 
04c0: 61 6d 61 6c 67 61 6d 61 74 69 6f 6e 2e 0a 2a 2f  amalgamation..*/
04d0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
04e0: 41 4d 41 4c 47 41 4d 41 54 49 4f 4e 0a 23 20 69  AMALGAMATION.# i
04f0: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 33 2e  nclude "sqlite3.
0500: 68 22 0a 23 20 69 6e 63 6c 75 64 65 20 3c 73 74  h".# include <st
0510: 64 6c 69 62 2e 68 3e 0a 23 20 69 6e 63 6c 75 64  dlib.h>.# includ
0520: 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a 23 20 69  e <string.h>.# i
0530: 6e 63 6c 75 64 65 20 3c 61 73 73 65 72 74 2e 68  nclude <assert.h
0540: 3e 0a 20 20 74 79 70 65 64 65 66 20 75 6e 73 69  >.  typedef unsi
0550: 67 6e 65 64 20 63 68 61 72 20 75 38 3b 0a 23 65  gned char u8;.#e
0560: 6e 64 69 66 0a 23 69 6e 63 6c 75 64 65 20 3c 63  ndif.#include <c
0570: 74 79 70 65 2e 68 3e 0a 0a 2f 2a 0a 20 2a 20 57  type.h>../*. * W
0580: 69 6e 64 6f 77 73 20 6e 65 65 64 73 20 74 6f 20  indows needs to 
0590: 6b 6e 6f 77 20 77 68 69 63 68 20 73 79 6d 62 6f  know which symbo
05a0: 6c 73 20 74 6f 20 65 78 70 6f 72 74 2e 20 20 55  ls to export.  U
05b0: 6e 69 78 20 64 6f 65 73 20 6e 6f 74 2e 0a 20 2a  nix does not.. *
05c0: 20 42 55 49 4c 44 5f 73 71 6c 69 74 65 20 73 68   BUILD_sqlite sh
05d0: 6f 75 6c 64 20 62 65 20 75 6e 64 65 66 69 6e 65  ould be undefine
05e0: 64 20 66 6f 72 20 55 6e 69 78 2e 0a 20 2a 2f 0a  d for Unix.. */.
05f0: 23 69 66 64 65 66 20 42 55 49 4c 44 5f 73 71 6c  #ifdef BUILD_sql
0600: 69 74 65 0a 23 75 6e 64 65 66 20 54 43 4c 5f 53  ite.#undef TCL_S
0610: 54 4f 52 41 47 45 5f 43 4c 41 53 53 0a 23 64 65  TORAGE_CLASS.#de
0620: 66 69 6e 65 20 54 43 4c 5f 53 54 4f 52 41 47 45  fine TCL_STORAGE
0630: 5f 43 4c 41 53 53 20 44 4c 4c 45 58 50 4f 52 54  _CLASS DLLEXPORT
0640: 0a 23 65 6e 64 69 66 20 2f 2a 20 42 55 49 4c 44  .#endif /* BUILD
0650: 5f 73 71 6c 69 74 65 20 2a 2f 0a 0a 23 64 65 66  _sqlite */..#def
0660: 69 6e 65 20 4e 55 4d 5f 50 52 45 50 41 52 45 44  ine NUM_PREPARED
0670: 5f 53 54 4d 54 53 20 31 30 0a 23 64 65 66 69 6e  _STMTS 10.#defin
0680: 65 20 4d 41 58 5f 50 52 45 50 41 52 45 44 5f 53  e MAX_PREPARED_S
0690: 54 4d 54 53 20 31 30 30 0a 0a 2f 2a 20 46 6f 72  TMTS 100../* For
06a0: 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e  ward declaration
06b0: 20 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75   */.typedef stru
06c0: 63 74 20 53 71 6c 69 74 65 44 62 20 53 71 6c 69  ct SqliteDb Sqli
06d0: 74 65 44 62 3b 0a 0a 2f 2a 0a 2a 2a 20 4e 65 77  teDb;../*.** New
06e0: 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 73 20 63   SQL functions c
06f0: 61 6e 20 62 65 20 63 72 65 61 74 65 64 20 61 73  an be created as
0700: 20 54 43 4c 20 73 63 72 69 70 74 73 2e 20 20 45   TCL scripts.  E
0710: 61 63 68 20 73 75 63 68 20 66 75 6e 63 74 69 6f  ach such functio
0720: 6e 0a 2a 2a 20 69 73 20 64 65 73 63 72 69 62 65  n.** is describe
0730: 64 20 62 79 20 61 6e 20 69 6e 73 74 61 6e 63 65  d by an instance
0740: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
0750: 67 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a  g structure..*/.
0760: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 53  typedef struct S
0770: 71 6c 46 75 6e 63 20 53 71 6c 46 75 6e 63 3b 0a  qlFunc SqlFunc;.
0780: 73 74 72 75 63 74 20 53 71 6c 46 75 6e 63 20 7b  struct SqlFunc {
0790: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
07a0: 6e 74 65 72 70 3b 20 20 20 2f 2a 20 54 68 65 20  nterp;   /* The 
07b0: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 20 74 6f  TCL interpret to
07c0: 20 65 78 65 63 75 74 65 20 74 68 65 20 66 75 6e   execute the fun
07d0: 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 4f  ction */.  Tcl_O
07e0: 62 6a 20 2a 70 53 63 72 69 70 74 3b 20 20 20 20  bj *pScript;    
07f0: 20 2f 2a 20 54 68 65 20 54 63 6c 5f 4f 62 6a 20   /* The Tcl_Obj 
0800: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f  representation o
0810: 66 20 74 68 65 20 73 63 72 69 70 74 20 2a 2f 0a  f the script */.
0820: 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 3b    SqliteDb *pDb;
0830: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
0840: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74  ase connection t
0850: 68 61 74 20 6f 77 6e 73 20 74 68 69 73 20 66 75  hat owns this fu
0860: 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  nction */.  int 
0870: 75 73 65 45 76 61 6c 4f 62 6a 76 3b 20 20 20 20  useEvalObjv;    
0880: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 69 74 20    /* True if it 
0890: 69 73 20 73 61 66 65 20 74 6f 20 75 73 65 20 54  is safe to use T
08a0: 63 6c 5f 45 76 61 6c 4f 62 6a 76 20 2a 2f 0a 20  cl_EvalObjv */. 
08b0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20   char *zName;   
08c0: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
08d0: 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  f this function 
08e0: 2a 2f 0a 20 20 53 71 6c 46 75 6e 63 20 2a 70 4e  */.  SqlFunc *pN
08f0: 65 78 74 3b 20 20 20 20 20 20 20 2f 2a 20 4e 65  ext;       /* Ne
0900: 78 74 20 66 75 6e 63 74 69 6f 6e 20 6f 6e 20 74  xt function on t
0910: 68 65 20 6c 69 73 74 20 6f 66 20 74 68 65 6d 20  he list of them 
0920: 61 6c 6c 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  all */.};../*.**
0930: 20 4e 65 77 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   New collation s
0940: 65 71 75 65 6e 63 65 73 20 66 75 6e 63 74 69 6f  equences functio
0950: 6e 20 63 61 6e 20 62 65 20 63 72 65 61 74 65 64  n can be created
0960: 20 61 73 20 54 43 4c 20 73 63 72 69 70 74 73 2e   as TCL scripts.
0970: 20 20 45 61 63 68 20 73 75 63 68 0a 2a 2a 20 66    Each such.** f
0980: 75 6e 63 74 69 6f 6e 20 69 73 20 64 65 73 63 72  unction is descr
0990: 69 62 65 64 20 62 79 20 61 6e 20 69 6e 73 74 61  ibed by an insta
09a0: 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
09b0: 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 0a  wing structure..
09c0: 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
09d0: 74 20 53 71 6c 43 6f 6c 6c 61 74 65 20 53 71 6c  t SqlCollate Sql
09e0: 43 6f 6c 6c 61 74 65 3b 0a 73 74 72 75 63 74 20  Collate;.struct 
09f0: 53 71 6c 43 6f 6c 6c 61 74 65 20 7b 0a 20 20 54  SqlCollate {.  T
0a00: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
0a10: 70 3b 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  p;   /* The TCL 
0a20: 69 6e 74 65 72 70 72 65 74 20 74 6f 20 65 78 65  interpret to exe
0a30: 63 75 74 65 20 74 68 65 20 66 75 6e 63 74 69 6f  cute the functio
0a40: 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 53 63  n */.  char *zSc
0a50: 72 69 70 74 3b 20 20 20 20 20 20 20 20 2f 2a 20  ript;        /* 
0a60: 54 68 65 20 73 63 72 69 70 74 20 74 6f 20 62 65  The script to be
0a70: 20 72 75 6e 20 2a 2f 0a 20 20 53 71 6c 43 6f 6c   run */.  SqlCol
0a80: 6c 61 74 65 20 2a 70 4e 65 78 74 3b 20 20 20 20  late *pNext;    
0a90: 2f 2a 20 4e 65 78 74 20 66 75 6e 63 74 69 6f 6e  /* Next function
0aa0: 20 6f 6e 20 74 68 65 20 6c 69 73 74 20 6f 66 20   on the list of 
0ab0: 74 68 65 6d 20 61 6c 6c 20 2a 2f 0a 7d 3b 0a 0a  them all */.};..
0ac0: 2f 2a 0a 2a 2a 20 50 72 65 70 61 72 65 64 20 73  /*.** Prepared s
0ad0: 74 61 74 65 6d 65 6e 74 73 20 61 72 65 20 63 61  tatements are ca
0ae0: 63 68 65 64 20 66 6f 72 20 66 61 73 74 65 72 20  ched for faster 
0af0: 65 78 65 63 75 74 69 6f 6e 2e 20 20 45 61 63 68  execution.  Each
0b00: 20 70 72 65 70 61 72 65 64 0a 2a 2a 20 73 74 61   prepared.** sta
0b10: 74 65 6d 65 6e 74 20 69 73 20 64 65 73 63 72 69  tement is descri
0b20: 62 65 64 20 62 79 20 61 6e 20 69 6e 73 74 61 6e  bed by an instan
0b30: 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ce of the follow
0b40: 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  ing structure..*
0b50: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
0b60: 20 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74   SqlPreparedStmt
0b70: 20 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d 74   SqlPreparedStmt
0b80: 3b 0a 73 74 72 75 63 74 20 53 71 6c 50 72 65 70  ;.struct SqlPrep
0b90: 61 72 65 64 53 74 6d 74 20 7b 0a 20 20 53 71 6c  aredStmt {.  Sql
0ba0: 50 72 65 70 61 72 65 64 53 74 6d 74 20 2a 70 4e  PreparedStmt *pN
0bb0: 65 78 74 3b 20 20 2f 2a 20 4e 65 78 74 20 69 6e  ext;  /* Next in
0bc0: 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 2a 2f 0a   linked list */.
0bd0: 20 20 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d    SqlPreparedStm
0be0: 74 20 2a 70 50 72 65 76 3b 20 20 2f 2a 20 50 72  t *pPrev;  /* Pr
0bf0: 65 76 69 6f 75 73 20 6f 6e 20 74 68 65 20 6c 69  evious on the li
0c00: 73 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  st */.  sqlite3_
0c10: 73 74 6d 74 20 2a 70 53 74 6d 74 3b 20 20 20 20  stmt *pStmt;    
0c20: 20 2f 2a 20 54 68 65 20 70 72 65 70 61 72 65 64   /* The prepared
0c30: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
0c40: 69 6e 74 20 6e 53 71 6c 3b 20 20 20 20 20 20 20  int nSql;       
0c50: 20 20 20 20 20 20 20 20 20 2f 2a 20 63 68 61 72           /* char
0c60: 73 20 69 6e 20 7a 53 71 6c 5b 5d 20 2a 2f 0a 20  s in zSql[] */. 
0c70: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71   const char *zSq
0c80: 6c 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78  l;        /* Tex
0c90: 74 20 6f 66 20 74 68 65 20 53 51 4c 20 73 74 61  t of the SQL sta
0ca0: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  tement */.  int 
0cb0: 6e 50 61 72 6d 3b 20 20 20 20 20 20 20 20 20 20  nParm;          
0cc0: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
0cd0: 61 70 50 61 72 6d 20 61 72 72 61 79 20 2a 2f 0a  apParm array */.
0ce0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 61 70 50 61    Tcl_Obj **apPa
0cf0: 72 6d 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 72  rm;        /* Ar
0d00: 72 61 79 20 6f 66 20 72 65 66 65 72 65 6e 63 65  ray of reference
0d10: 64 20 6f 62 6a 65 63 74 20 70 6f 69 6e 74 65 72  d object pointer
0d20: 73 20 2a 2f 0a 7d 3b 0a 0a 74 79 70 65 64 65 66  s */.};..typedef
0d30: 20 73 74 72 75 63 74 20 49 6e 63 72 62 6c 6f 62   struct Incrblob
0d40: 43 68 61 6e 6e 65 6c 20 49 6e 63 72 62 6c 6f 62  Channel Incrblob
0d50: 43 68 61 6e 6e 65 6c 3b 0a 0a 2f 2a 0a 2a 2a 20  Channel;../*.** 
0d60: 54 68 65 72 65 20 69 73 20 6f 6e 65 20 69 6e 73  There is one ins
0d70: 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 73 74  tance of this st
0d80: 72 75 63 74 75 72 65 20 66 6f 72 20 65 61 63 68  ructure for each
0d90: 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73 65   SQLite database
0da0: 0a 2a 2a 20 74 68 61 74 20 68 61 73 20 62 65 65  .** that has bee
0db0: 6e 20 6f 70 65 6e 65 64 20 62 79 20 74 68 65 20  n opened by the 
0dc0: 53 51 4c 69 74 65 20 54 43 4c 20 69 6e 74 65 72  SQLite TCL inter
0dd0: 66 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  face..**.** If t
0de0: 68 69 73 20 6d 6f 64 75 6c 65 20 69 73 20 62 75  his module is bu
0df0: 69 6c 74 20 77 69 74 68 20 53 51 4c 49 54 45 5f  ilt with SQLITE_
0e00: 54 45 53 54 20 64 65 66 69 6e 65 64 20 28 74 6f  TEST defined (to
0e10: 20 63 72 65 61 74 65 20 74 68 65 20 53 51 4c 69   create the SQLi
0e20: 74 65 0a 2a 2a 20 74 65 73 74 66 69 78 74 75 72  te.** testfixtur
0e30: 65 20 65 78 65 63 75 74 61 62 6c 65 29 2c 20 74  e executable), t
0e40: 68 65 6e 20 69 74 20 6d 61 79 20 62 65 20 63 6f  hen it may be co
0e50: 6e 66 69 67 75 72 65 64 20 74 6f 20 75 73 65 20  nfigured to use 
0e60: 65 69 74 68 65 72 0a 2a 2a 20 73 71 6c 69 74 65  either.** sqlite
0e70: 33 5f 70 72 65 70 61 72 65 5f 76 32 28 29 20 6f  3_prepare_v2() o
0e80: 72 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  r sqlite3_prepar
0e90: 65 28 29 20 74 6f 20 70 72 65 70 61 72 65 20 53  e() to prepare S
0ea0: 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a  QL statements..*
0eb0: 2a 20 49 66 20 53 71 6c 69 74 65 44 62 2e 62 4c  * If SqliteDb.bL
0ec0: 65 67 61 63 79 50 72 65 70 61 72 65 20 69 73 20  egacyPrepare is 
0ed0: 74 72 75 65 2c 20 73 71 6c 69 74 65 33 5f 70 72  true, sqlite3_pr
0ee0: 65 70 61 72 65 28 29 20 69 73 20 75 73 65 64 2e  epare() is used.
0ef0: 0a 2a 2f 0a 73 74 72 75 63 74 20 53 71 6c 69 74  .*/.struct Sqlit
0f00: 65 44 62 20 7b 0a 20 20 73 71 6c 69 74 65 33 20  eDb {.  sqlite3 
0f10: 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  *db;            
0f20: 20 20 20 2f 2a 20 54 68 65 20 22 72 65 61 6c 22     /* The "real"
0f30: 20 64 61 74 61 62 61 73 65 20 73 74 72 75 63 74   database struct
0f40: 75 72 65 2e 20 4d 55 53 54 20 42 45 20 46 49 52  ure. MUST BE FIR
0f50: 53 54 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65  ST */.  Tcl_Inte
0f60: 72 70 20 2a 69 6e 74 65 72 70 3b 20 20 20 20 20  rp *interp;     
0f70: 20 20 20 2f 2a 20 54 68 65 20 69 6e 74 65 72 70     /* The interp
0f80: 72 65 74 65 72 20 75 73 65 64 20 66 6f 72 20 74  reter used for t
0f90: 68 69 73 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  his database */.
0fa0: 20 20 63 68 61 72 20 2a 7a 42 75 73 79 3b 20 20    char *zBusy;  
0fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
0fc0: 54 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63  The busy callbac
0fd0: 6b 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 63  k routine */.  c
0fe0: 68 61 72 20 2a 7a 43 6f 6d 6d 69 74 3b 20 20 20  har *zCommit;   
0ff0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1000: 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20 63 61 6c   commit hook cal
1010: 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 20 2a 2f  lback routine */
1020: 0a 20 20 63 68 61 72 20 2a 7a 54 72 61 63 65 3b  .  char *zTrace;
1030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1040: 20 54 68 65 20 74 72 61 63 65 20 63 61 6c 6c 62   The trace callb
1050: 61 63 6b 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 20  ack routine */. 
1060: 20 63 68 61 72 20 2a 7a 50 72 6f 66 69 6c 65 3b   char *zProfile;
1070: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1080: 68 65 20 70 72 6f 66 69 6c 65 20 63 61 6c 6c 62  he profile callb
1090: 61 63 6b 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 20  ack routine */. 
10a0: 20 63 68 61 72 20 2a 7a 50 72 6f 67 72 65 73 73   char *zProgress
10b0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ;           /* T
10c0: 68 65 20 70 72 6f 67 72 65 73 73 20 63 61 6c 6c  he progress call
10d0: 62 61 63 6b 20 72 6f 75 74 69 6e 65 20 2a 2f 0a  back routine */.
10e0: 20 20 63 68 61 72 20 2a 7a 41 75 74 68 3b 20 20    char *zAuth;  
10f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1100: 54 68 65 20 61 75 74 68 6f 72 69 7a 61 74 69 6f  The authorizatio
1110: 6e 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69  n callback routi
1120: 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 64 69 73 61  ne */.  int disa
1130: 62 6c 65 41 75 74 68 3b 20 20 20 20 20 20 20 20  bleAuth;        
1140: 20 20 20 2f 2a 20 44 69 73 61 62 6c 65 20 74 68     /* Disable th
1150: 65 20 61 75 74 68 6f 72 69 7a 65 72 20 69 66 20  e authorizer if 
1160: 69 74 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 63  it exists */.  c
1170: 68 61 72 20 2a 7a 4e 75 6c 6c 3b 20 20 20 20 20  har *zNull;     
1180: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78            /* Tex
1190: 74 20 74 6f 20 73 75 62 73 74 69 74 75 74 65 20  t to substitute 
11a0: 66 6f 72 20 61 6e 20 53 51 4c 20 4e 55 4c 4c 20  for an SQL NULL 
11b0: 76 61 6c 75 65 20 2a 2f 0a 20 20 53 71 6c 46 75  value */.  SqlFu
11c0: 6e 63 20 2a 70 46 75 6e 63 3b 20 20 20 20 20 20  nc *pFunc;      
11d0: 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
11e0: 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 73 20 2a   SQL functions *
11f0: 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 55 70  /.  Tcl_Obj *pUp
1200: 64 61 74 65 48 6f 6f 6b 3b 20 20 20 20 20 20 2f  dateHook;      /
1210: 2a 20 55 70 64 61 74 65 20 68 6f 6f 6b 20 73 63  * Update hook sc
1220: 72 69 70 74 20 28 69 66 20 61 6e 79 29 20 2a 2f  ript (if any) */
1230: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 6f 6c  .  Tcl_Obj *pRol
1240: 6c 62 61 63 6b 48 6f 6f 6b 3b 20 20 20 20 2f 2a  lbackHook;    /*
1250: 20 52 6f 6c 6c 62 61 63 6b 20 68 6f 6f 6b 20 73   Rollback hook s
1260: 63 72 69 70 74 20 28 69 66 20 61 6e 79 29 20 2a  cript (if any) *
1270: 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 57 61  /.  Tcl_Obj *pWa
1280: 6c 48 6f 6f 6b 3b 20 20 20 20 20 20 20 20 20 2f  lHook;         /
1290: 2a 20 57 41 4c 20 68 6f 6f 6b 20 73 63 72 69 70  * WAL hook scrip
12a0: 74 20 28 69 66 20 61 6e 79 29 20 2a 2f 0a 20 20  t (if any) */.  
12b0: 54 63 6c 5f 4f 62 6a 20 2a 70 55 6e 6c 6f 63 6b  Tcl_Obj *pUnlock
12c0: 4e 6f 74 69 66 79 3b 20 20 20 20 2f 2a 20 55 6e  Notify;    /* Un
12d0: 6c 6f 63 6b 20 6e 6f 74 69 66 79 20 73 63 72 69  lock notify scri
12e0: 70 74 20 28 69 66 20 61 6e 79 29 20 2a 2f 0a 20  pt (if any) */. 
12f0: 20 53 71 6c 43 6f 6c 6c 61 74 65 20 2a 70 43 6f   SqlCollate *pCo
1300: 6c 6c 61 74 65 3b 20 20 20 20 20 20 2f 2a 20 4c  llate;      /* L
1310: 69 73 74 20 6f 66 20 53 51 4c 20 63 6f 6c 6c 61  ist of SQL colla
1320: 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 73 20 2a  tion functions *
1330: 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
1340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1350: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 6f 66  * Return code of
1360: 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 73 71 6c   most recent sql
1370: 69 74 65 33 5f 65 78 65 63 28 29 20 2a 2f 0a 20  ite3_exec() */. 
1380: 20 54 63 6c 5f 4f 62 6a 20 2a 70 43 6f 6c 6c 61   Tcl_Obj *pColla
1390: 74 65 4e 65 65 64 65 64 3b 20 20 20 2f 2a 20 43  teNeeded;   /* C
13a0: 6f 6c 6c 61 74 69 6f 6e 20 6e 65 65 64 65 64 20  ollation needed 
13b0: 73 63 72 69 70 74 20 2a 2f 0a 20 20 53 71 6c 50  script */.  SqlP
13c0: 72 65 70 61 72 65 64 53 74 6d 74 20 2a 73 74 6d  reparedStmt *stm
13d0: 74 4c 69 73 74 3b 20 2f 2a 20 4c 69 73 74 20 6f  tList; /* List o
13e0: 66 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  f prepared state
13f0: 6d 65 6e 74 73 2a 2f 0a 20 20 53 71 6c 50 72 65  ments*/.  SqlPre
1400: 70 61 72 65 64 53 74 6d 74 20 2a 73 74 6d 74 4c  paredStmt *stmtL
1410: 61 73 74 3b 20 2f 2a 20 4c 61 73 74 20 73 74 61  ast; /* Last sta
1420: 74 65 6d 65 6e 74 20 69 6e 20 74 68 65 20 6c 69  tement in the li
1430: 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6d 61 78 53  st */.  int maxS
1440: 74 6d 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  tmt;            
1450: 20 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 6d     /* The next m
1460: 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  aximum number of
1470: 20 73 74 6d 74 4c 69 73 74 20 2a 2f 0a 20 20 69   stmtList */.  i
1480: 6e 74 20 6e 53 74 6d 74 3b 20 20 20 20 20 20 20  nt nStmt;       
1490: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
14a0: 62 65 72 20 6f 66 20 73 74 61 74 65 6d 65 6e 74  ber of statement
14b0: 73 20 69 6e 20 73 74 6d 74 4c 69 73 74 20 2a 2f  s in stmtList */
14c0: 0a 20 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e  .  IncrblobChann
14d0: 65 6c 20 2a 70 49 6e 63 72 62 6c 6f 62 3b 2f 2a  el *pIncrblob;/*
14e0: 20 4c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20   Linked list of 
14f0: 6f 70 65 6e 20 69 6e 63 72 62 6c 6f 62 20 63 68  open incrblob ch
1500: 61 6e 6e 65 6c 73 20 2a 2f 0a 20 20 69 6e 74 20  annels */.  int 
1510: 6e 53 74 65 70 2c 20 6e 53 6f 72 74 2c 20 6e 49  nStep, nSort, nI
1520: 6e 64 65 78 3b 20 20 2f 2a 20 53 74 61 74 69 73  ndex;  /* Statis
1530: 74 69 63 73 20 66 6f 72 20 6d 6f 73 74 20 72 65  tics for most re
1540: 63 65 6e 74 20 6f 70 65 72 61 74 69 6f 6e 20 2a  cent operation *
1550: 2f 0a 20 20 69 6e 74 20 6e 54 72 61 6e 73 61 63  /.  int nTransac
1560: 74 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 2f  tion;          /
1570: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6e 65 73 74  * Number of nest
1580: 65 64 20 5b 74 72 61 6e 73 61 63 74 69 6f 6e 5d  ed [transaction]
1590: 20 6d 65 74 68 6f 64 73 20 2a 2f 0a 23 69 66 64   methods */.#ifd
15a0: 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
15b0: 20 69 6e 74 20 62 4c 65 67 61 63 79 50 72 65 70   int bLegacyPrep
15c0: 61 72 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  are;        /* T
15d0: 72 75 65 20 74 6f 20 75 73 65 20 73 71 6c 69 74  rue to use sqlit
15e0: 65 33 5f 70 72 65 70 61 72 65 28 29 20 2a 2f 0a  e3_prepare() */.
15f0: 23 65 6e 64 69 66 0a 7d 3b 0a 0a 73 74 72 75 63  #endif.};..struc
1600: 74 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65  t IncrblobChanne
1610: 6c 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 62 6c  l {.  sqlite3_bl
1620: 6f 62 20 2a 70 42 6c 6f 62 3b 20 20 20 20 20 20  ob *pBlob;      
1630: 2f 2a 20 73 71 6c 69 74 65 33 20 62 6c 6f 62 20  /* sqlite3 blob 
1640: 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 53 71 6c 69  handle */.  Sqli
1650: 74 65 44 62 20 2a 70 44 62 3b 20 20 20 20 20 20  teDb *pDb;      
1660: 20 20 20 20 20 20 2f 2a 20 41 73 73 6f 63 69 61        /* Associa
1670: 74 65 64 20 64 61 74 61 62 61 73 65 20 63 6f 6e  ted database con
1680: 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  nection */.  int
1690: 20 69 53 65 65 6b 3b 20 20 20 20 20 20 20 20 20   iSeek;         
16a0: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
16b0: 74 20 73 65 65 6b 20 6f 66 66 73 65 74 20 2a 2f  t seek offset */
16c0: 0a 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63  .  Tcl_Channel c
16d0: 68 61 6e 6e 65 6c 3b 20 20 20 20 20 20 2f 2a 20  hannel;      /* 
16e0: 43 68 61 6e 6e 65 6c 20 69 64 65 6e 74 69 66 69  Channel identifi
16f0: 65 72 20 2a 2f 0a 20 20 49 6e 63 72 62 6c 6f 62  er */.  Incrblob
1700: 43 68 61 6e 6e 65 6c 20 2a 70 4e 65 78 74 3b 20  Channel *pNext; 
1710: 20 20 2f 2a 20 4c 69 6e 6b 65 64 20 6c 69 73 74    /* Linked list
1720: 20 6f 66 20 61 6c 6c 20 6f 70 65 6e 20 69 6e 63   of all open inc
1730: 72 62 6c 6f 62 20 63 68 61 6e 6e 65 6c 73 20 2a  rblob channels *
1740: 2f 0a 20 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e  /.  IncrblobChan
1750: 6e 65 6c 20 2a 70 50 72 65 76 3b 20 20 20 2f 2a  nel *pPrev;   /*
1760: 20 4c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20   Linked list of 
1770: 61 6c 6c 20 6f 70 65 6e 20 69 6e 63 72 62 6c 6f  all open incrblo
1780: 62 20 63 68 61 6e 6e 65 6c 73 20 2a 2f 0a 7d 3b  b channels */.};
1790: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20  ../*.** Compute 
17a0: 61 20 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  a string length 
17b0: 74 68 61 74 20 69 73 20 6c 69 6d 69 74 65 64 20  that is limited 
17c0: 74 6f 20 77 68 61 74 20 63 61 6e 20 62 65 20 73  to what can be s
17d0: 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 6c 6f 77 65  tored in.** lowe
17e0: 72 20 33 30 20 62 69 74 73 20 6f 66 20 61 20 33  r 30 bits of a 3
17f0: 32 2d 62 69 74 20 73 69 67 6e 65 64 20 69 6e 74  2-bit signed int
1800: 65 67 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  eger..*/.static 
1810: 69 6e 74 20 73 74 72 6c 65 6e 33 30 28 63 6f 6e  int strlen30(con
1820: 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 63  st char *z){.  c
1830: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 32 20 3d 20  onst char *z2 = 
1840: 7a 3b 0a 20 20 77 68 69 6c 65 28 20 2a 7a 32 20  z;.  while( *z2 
1850: 29 7b 20 7a 32 2b 2b 3b 20 7d 0a 20 20 72 65 74  ){ z2++; }.  ret
1860: 75 72 6e 20 30 78 33 66 66 66 66 66 66 66 20 26  urn 0x3fffffff &
1870: 20 28 69 6e 74 29 28 7a 32 20 2d 20 7a 29 3b 0a   (int)(z2 - z);.
1880: 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  }...#ifndef SQLI
1890: 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42  TE_OMIT_INCRBLOB
18a0: 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c  ./*.** Close all
18b0: 20 69 6e 63 72 62 6c 6f 62 20 63 68 61 6e 6e 65   incrblob channe
18c0: 6c 73 20 6f 70 65 6e 65 64 20 75 73 69 6e 67 20  ls opened using 
18d0: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
18e0: 69 6f 6e 20 70 44 62 2e 0a 2a 2a 20 54 68 69 73  ion pDb..** This
18f0: 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   is called when 
1900: 73 68 75 74 74 69 6e 67 20 64 6f 77 6e 20 74 68  shutting down th
1910: 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
1920: 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
1930: 20 76 6f 69 64 20 63 6c 6f 73 65 49 6e 63 72 62   void closeIncrb
1940: 6c 6f 62 43 68 61 6e 6e 65 6c 73 28 53 71 6c 69  lobChannels(Sqli
1950: 74 65 44 62 20 2a 70 44 62 29 7b 0a 20 20 49 6e  teDb *pDb){.  In
1960: 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 70  crblobChannel *p
1970: 3b 0a 20 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e  ;.  IncrblobChan
1980: 6e 65 6c 20 2a 70 4e 65 78 74 3b 0a 0a 20 20 66  nel *pNext;..  f
1990: 6f 72 28 70 3d 70 44 62 2d 3e 70 49 6e 63 72 62  or(p=pDb->pIncrb
19a0: 6c 6f 62 3b 20 70 3b 20 70 3d 70 4e 65 78 74 29  lob; p; p=pNext)
19b0: 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 2d  {.    pNext = p-
19c0: 3e 70 4e 65 78 74 3b 0a 0a 20 20 20 20 2f 2a 20  >pNext;..    /* 
19d0: 4e 6f 74 65 3a 20 43 61 6c 6c 69 6e 67 20 75 6e  Note: Calling un
19e0: 72 65 67 69 73 74 65 72 20 68 65 72 65 20 63 61  register here ca
19f0: 6c 6c 20 54 63 6c 5f 43 6c 6f 73 65 20 6f 6e 20  ll Tcl_Close on 
1a00: 74 68 65 20 69 6e 63 72 62 6c 6f 62 20 63 68 61  the incrblob cha
1a10: 6e 6e 65 6c 2c 20 0a 20 20 20 20 2a 2a 20 77 68  nnel, .    ** wh
1a20: 69 63 68 20 64 65 6c 65 74 65 73 20 74 68 65 20  ich deletes the 
1a30: 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20  IncrblobChannel 
1a40: 73 74 72 75 63 74 75 72 65 20 61 74 20 2a 70 2e  structure at *p.
1a50: 20 53 6f 20 64 6f 20 6e 6f 74 0a 20 20 20 20 2a   So do not.    *
1a60: 2a 20 63 61 6c 6c 20 54 63 6c 5f 46 72 65 65 28  * call Tcl_Free(
1a70: 29 20 68 65 72 65 2e 0a 20 20 20 20 2a 2f 0a 20  ) here..    */. 
1a80: 20 20 20 54 63 6c 5f 55 6e 72 65 67 69 73 74 65     Tcl_Unregiste
1a90: 72 43 68 61 6e 6e 65 6c 28 70 44 62 2d 3e 69 6e  rChannel(pDb->in
1aa0: 74 65 72 70 2c 20 70 2d 3e 63 68 61 6e 6e 65 6c  terp, p->channel
1ab0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
1ac0: 43 6c 6f 73 65 20 61 6e 20 69 6e 63 72 65 6d 65  Close an increme
1ad0: 6e 74 61 6c 20 62 6c 6f 62 20 63 68 61 6e 6e 65  ntal blob channe
1ae0: 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  l..*/.static int
1af0: 20 69 6e 63 72 62 6c 6f 62 43 6c 6f 73 65 28 43   incrblobClose(C
1b00: 6c 69 65 6e 74 44 61 74 61 20 69 6e 73 74 61 6e  lientData instan
1b10: 63 65 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65  ceData, Tcl_Inte
1b20: 72 70 20 2a 69 6e 74 65 72 70 29 7b 0a 20 20 49  rp *interp){.  I
1b30: 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a  ncrblobChannel *
1b40: 70 20 3d 20 28 49 6e 63 72 62 6c 6f 62 43 68 61  p = (IncrblobCha
1b50: 6e 6e 65 6c 20 2a 29 69 6e 73 74 61 6e 63 65 44  nnel *)instanceD
1b60: 61 74 61 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ata;.  int rc = 
1b70: 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 63 6c 6f  sqlite3_blob_clo
1b80: 73 65 28 70 2d 3e 70 42 6c 6f 62 29 3b 0a 20 20  se(p->pBlob);.  
1b90: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d  sqlite3 *db = p-
1ba0: 3e 70 44 62 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20  >pDb->db;..  /* 
1bb0: 52 65 6d 6f 76 65 20 74 68 65 20 63 68 61 6e 6e  Remove the chann
1bc0: 65 6c 20 66 72 6f 6d 20 74 68 65 20 53 71 6c 69  el from the Sqli
1bd0: 74 65 44 62 2e 70 49 6e 63 72 62 6c 6f 62 20 6c  teDb.pIncrblob l
1be0: 69 73 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 2d  ist. */.  if( p-
1bf0: 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 70 2d  >pNext ){.    p-
1c00: 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20  >pNext->pPrev = 
1c10: 70 2d 3e 70 50 72 65 76 3b 0a 20 20 7d 0a 20 20  p->pPrev;.  }.  
1c20: 69 66 28 20 70 2d 3e 70 50 72 65 76 20 29 7b 0a  if( p->pPrev ){.
1c30: 20 20 20 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e      p->pPrev->pN
1c40: 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a  ext = p->pNext;.
1c50: 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 44 62    }.  if( p->pDb
1c60: 2d 3e 70 49 6e 63 72 62 6c 6f 62 3d 3d 70 20 29  ->pIncrblob==p )
1c70: 7b 0a 20 20 20 20 70 2d 3e 70 44 62 2d 3e 70 49  {.    p->pDb->pI
1c80: 6e 63 72 62 6c 6f 62 20 3d 20 70 2d 3e 70 4e 65  ncrblob = p->pNe
1c90: 78 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 72  xt;.  }..  /* Fr
1ca0: 65 65 20 74 68 65 20 49 6e 63 72 62 6c 6f 62 43  ee the IncrblobC
1cb0: 68 61 6e 6e 65 6c 20 73 74 72 75 63 74 75 72 65  hannel structure
1cc0: 20 2a 2f 0a 20 20 54 63 6c 5f 46 72 65 65 28 28   */.  Tcl_Free((
1cd0: 63 68 61 72 20 2a 29 70 29 3b 0a 0a 20 20 69 66  char *)p);..  if
1ce0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1cf0: 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65  ){.    Tcl_SetRe
1d00: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68  sult(interp, (ch
1d10: 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 65 72 72  ar *)sqlite3_err
1d20: 6d 73 67 28 64 62 29 2c 20 54 43 4c 5f 56 4f 4c  msg(db), TCL_VOL
1d30: 41 54 49 4c 45 29 3b 0a 20 20 20 20 72 65 74 75  ATILE);.    retu
1d40: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1d50: 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  }.  return TCL_O
1d60: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  K;.}../*.** Read
1d70: 20 64 61 74 61 20 66 72 6f 6d 20 61 6e 20 69 6e   data from an in
1d80: 63 72 65 6d 65 6e 74 61 6c 20 62 6c 6f 62 20 63  cremental blob c
1d90: 68 61 6e 6e 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69  hannel..*/.stati
1da0: 63 20 69 6e 74 20 69 6e 63 72 62 6c 6f 62 49 6e  c int incrblobIn
1db0: 70 75 74 28 0a 20 20 43 6c 69 65 6e 74 44 61 74  put(.  ClientDat
1dc0: 61 20 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 20  a instanceData, 
1dd0: 0a 20 20 63 68 61 72 20 2a 62 75 66 2c 20 0a 20  .  char *buf, . 
1de0: 20 69 6e 74 20 62 75 66 53 69 7a 65 2c 0a 20 20   int bufSize,.  
1df0: 69 6e 74 20 2a 65 72 72 6f 72 43 6f 64 65 50 74  int *errorCodePt
1e00: 72 0a 29 7b 0a 20 20 49 6e 63 72 62 6c 6f 62 43  r.){.  IncrblobC
1e10: 68 61 6e 6e 65 6c 20 2a 70 20 3d 20 28 49 6e 63  hannel *p = (Inc
1e20: 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a 29 69  rblobChannel *)i
1e30: 6e 73 74 61 6e 63 65 44 61 74 61 3b 0a 20 20 69  nstanceData;.  i
1e40: 6e 74 20 6e 52 65 61 64 20 3d 20 62 75 66 53 69  nt nRead = bufSi
1e50: 7a 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ze;         /* N
1e60: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74  umber of bytes t
1e70: 6f 20 72 65 61 64 20 2a 2f 0a 20 20 69 6e 74 20  o read */.  int 
1e80: 6e 42 6c 6f 62 3b 20 20 20 20 20 20 20 20 20 20  nBlob;          
1e90: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61           /* Tota
1ea0: 6c 20 73 69 7a 65 20 6f 66 20 74 68 65 20 62 6c  l size of the bl
1eb0: 6f 62 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  ob */.  int rc; 
1ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ed0: 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 20 65       /* sqlite e
1ee0: 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 0a 20 20  rror code */..  
1ef0: 6e 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f  nBlob = sqlite3_
1f00: 62 6c 6f 62 5f 62 79 74 65 73 28 70 2d 3e 70 42  blob_bytes(p->pB
1f10: 6c 6f 62 29 3b 0a 20 20 69 66 28 20 28 70 2d 3e  lob);.  if( (p->
1f20: 69 53 65 65 6b 2b 6e 52 65 61 64 29 3e 6e 42 6c  iSeek+nRead)>nBl
1f30: 6f 62 20 29 7b 0a 20 20 20 20 6e 52 65 61 64 20  ob ){.    nRead 
1f40: 3d 20 6e 42 6c 6f 62 2d 70 2d 3e 69 53 65 65 6b  = nBlob-p->iSeek
1f50: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 52 65 61  ;.  }.  if( nRea
1f60: 64 3c 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  d<=0 ){.    retu
1f70: 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 72 63 20  rn 0;.  }..  rc 
1f80: 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 72  = sqlite3_blob_r
1f90: 65 61 64 28 70 2d 3e 70 42 6c 6f 62 2c 20 28 76  ead(p->pBlob, (v
1fa0: 6f 69 64 20 2a 29 62 75 66 2c 20 6e 52 65 61 64  oid *)buf, nRead
1fb0: 2c 20 70 2d 3e 69 53 65 65 6b 29 3b 0a 20 20 69  , p->iSeek);.  i
1fc0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1fd0: 20 29 7b 0a 20 20 20 20 2a 65 72 72 6f 72 43 6f   ){.    *errorCo
1fe0: 64 65 50 74 72 20 3d 20 72 63 3b 0a 20 20 20 20  dePtr = rc;.    
1ff0: 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 0a  return -1;.  }..
2000: 20 20 70 2d 3e 69 53 65 65 6b 20 2b 3d 20 6e 52    p->iSeek += nR
2010: 65 61 64 3b 0a 20 20 72 65 74 75 72 6e 20 6e 52  ead;.  return nR
2020: 65 61 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72  ead;.}../*.** Wr
2030: 69 74 65 20 64 61 74 61 20 74 6f 20 61 6e 20 69  ite data to an i
2040: 6e 63 72 65 6d 65 6e 74 61 6c 20 62 6c 6f 62 20  ncremental blob 
2050: 63 68 61 6e 6e 65 6c 2e 0a 2a 2f 0a 73 74 61 74  channel..*/.stat
2060: 69 63 20 69 6e 74 20 69 6e 63 72 62 6c 6f 62 4f  ic int incrblobO
2070: 75 74 70 75 74 28 0a 20 20 43 6c 69 65 6e 74 44  utput(.  ClientD
2080: 61 74 61 20 69 6e 73 74 61 6e 63 65 44 61 74 61  ata instanceData
2090: 2c 20 0a 20 20 43 4f 4e 53 54 20 63 68 61 72 20  , .  CONST char 
20a0: 2a 62 75 66 2c 20 0a 20 20 69 6e 74 20 74 6f 57  *buf, .  int toW
20b0: 72 69 74 65 2c 0a 20 20 69 6e 74 20 2a 65 72 72  rite,.  int *err
20c0: 6f 72 43 6f 64 65 50 74 72 0a 29 7b 0a 20 20 49  orCodePtr.){.  I
20d0: 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a  ncrblobChannel *
20e0: 70 20 3d 20 28 49 6e 63 72 62 6c 6f 62 43 68 61  p = (IncrblobCha
20f0: 6e 6e 65 6c 20 2a 29 69 6e 73 74 61 6e 63 65 44  nnel *)instanceD
2100: 61 74 61 3b 0a 20 20 69 6e 74 20 6e 57 72 69 74  ata;.  int nWrit
2110: 65 20 3d 20 74 6f 57 72 69 74 65 3b 20 20 20 20  e = toWrite;    
2120: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2130: 20 62 79 74 65 73 20 74 6f 20 77 72 69 74 65 20   bytes to write 
2140: 2a 2f 0a 20 20 69 6e 74 20 6e 42 6c 6f 62 3b 20  */.  int nBlob; 
2150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2160: 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20    /* Total size 
2170: 6f 66 20 74 68 65 20 62 6c 6f 62 20 2a 2f 0a 20  of the blob */. 
2180: 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
2190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21a0: 20 73 71 6c 69 74 65 20 65 72 72 6f 72 20 63 6f   sqlite error co
21b0: 64 65 20 2a 2f 0a 0a 20 20 6e 42 6c 6f 62 20 3d  de */..  nBlob =
21c0: 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 62 79   sqlite3_blob_by
21d0: 74 65 73 28 70 2d 3e 70 42 6c 6f 62 29 3b 0a 20  tes(p->pBlob);. 
21e0: 20 69 66 28 20 28 70 2d 3e 69 53 65 65 6b 2b 6e   if( (p->iSeek+n
21f0: 57 72 69 74 65 29 3e 6e 42 6c 6f 62 20 29 7b 0a  Write)>nBlob ){.
2200: 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74      *errorCodePt
2210: 72 20 3d 20 45 49 4e 56 41 4c 3b 0a 20 20 20 20  r = EINVAL;.    
2220: 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 20  return -1;.  }. 
2230: 20 69 66 28 20 6e 57 72 69 74 65 3c 3d 30 20 29   if( nWrite<=0 )
2240: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
2250: 20 20 7d 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69    }..  rc = sqli
2260: 74 65 33 5f 62 6c 6f 62 5f 77 72 69 74 65 28 70  te3_blob_write(p
2270: 2d 3e 70 42 6c 6f 62 2c 20 28 76 6f 69 64 20 2a  ->pBlob, (void *
2280: 29 62 75 66 2c 20 6e 57 72 69 74 65 2c 20 70 2d  )buf, nWrite, p-
2290: 3e 69 53 65 65 6b 29 3b 0a 20 20 69 66 28 20 72  >iSeek);.  if( r
22a0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
22b0: 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74      *errorCodePt
22c0: 72 20 3d 20 45 49 4f 3b 0a 20 20 20 20 72 65 74  r = EIO;.    ret
22d0: 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 70  urn -1;.  }..  p
22e0: 2d 3e 69 53 65 65 6b 20 2b 3d 20 6e 57 72 69 74  ->iSeek += nWrit
22f0: 65 3b 0a 20 20 72 65 74 75 72 6e 20 6e 57 72 69  e;.  return nWri
2300: 74 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 65  te;.}../*.** See
2310: 6b 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c  k an incremental
2320: 20 62 6c 6f 62 20 63 68 61 6e 6e 65 6c 2e 0a 2a   blob channel..*
2330: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 63  /.static int inc
2340: 72 62 6c 6f 62 53 65 65 6b 28 0a 20 20 43 6c 69  rblobSeek(.  Cli
2350: 65 6e 74 44 61 74 61 20 69 6e 73 74 61 6e 63 65  entData instance
2360: 44 61 74 61 2c 20 0a 20 20 6c 6f 6e 67 20 6f 66  Data, .  long of
2370: 66 73 65 74 2c 0a 20 20 69 6e 74 20 73 65 65 6b  fset,.  int seek
2380: 4d 6f 64 65 2c 0a 20 20 69 6e 74 20 2a 65 72 72  Mode,.  int *err
2390: 6f 72 43 6f 64 65 50 74 72 0a 29 7b 0a 20 20 49  orCodePtr.){.  I
23a0: 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 20 2a  ncrblobChannel *
23b0: 70 20 3d 20 28 49 6e 63 72 62 6c 6f 62 43 68 61  p = (IncrblobCha
23c0: 6e 6e 65 6c 20 2a 29 69 6e 73 74 61 6e 63 65 44  nnel *)instanceD
23d0: 61 74 61 3b 0a 0a 20 20 73 77 69 74 63 68 28 20  ata;..  switch( 
23e0: 73 65 65 6b 4d 6f 64 65 20 29 7b 0a 20 20 20 20  seekMode ){.    
23f0: 63 61 73 65 20 53 45 45 4b 5f 53 45 54 3a 0a 20  case SEEK_SET:. 
2400: 20 20 20 20 20 70 2d 3e 69 53 65 65 6b 20 3d 20       p->iSeek = 
2410: 6f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 62 72  offset;.      br
2420: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 45  eak;.    case SE
2430: 45 4b 5f 43 55 52 3a 0a 20 20 20 20 20 20 70 2d  EK_CUR:.      p-
2440: 3e 69 53 65 65 6b 20 2b 3d 20 6f 66 66 73 65 74  >iSeek += offset
2450: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
2460: 20 20 20 63 61 73 65 20 53 45 45 4b 5f 45 4e 44     case SEEK_END
2470: 3a 0a 20 20 20 20 20 20 70 2d 3e 69 53 65 65 6b  :.      p->iSeek
2480: 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f   = sqlite3_blob_
2490: 62 79 74 65 73 28 70 2d 3e 70 42 6c 6f 62 29 20  bytes(p->pBlob) 
24a0: 2b 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  + offset;.      
24b0: 62 72 65 61 6b 3b 0a 0a 20 20 20 20 64 65 66 61  break;..    defa
24c0: 75 6c 74 3a 20 61 73 73 65 72 74 28 21 22 42 61  ult: assert(!"Ba
24d0: 64 20 73 65 65 6b 4d 6f 64 65 22 29 3b 0a 20 20  d seekMode");.  
24e0: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 69  }..  return p->i
24f0: 53 65 65 6b 3b 0a 7d 0a 0a 0a 73 74 61 74 69 63  Seek;.}...static
2500: 20 76 6f 69 64 20 69 6e 63 72 62 6c 6f 62 57 61   void incrblobWa
2510: 74 63 68 28 43 6c 69 65 6e 74 44 61 74 61 20 69  tch(ClientData i
2520: 6e 73 74 61 6e 63 65 44 61 74 61 2c 20 69 6e 74  nstanceData, int
2530: 20 6d 6f 64 65 29 7b 20 0a 20 20 2f 2a 20 4e 4f   mode){ .  /* NO
2540: 2d 4f 50 20 2a 2f 20 0a 7d 0a 73 74 61 74 69 63  -OP */ .}.static
2550: 20 69 6e 74 20 69 6e 63 72 62 6c 6f 62 48 61 6e   int incrblobHan
2560: 64 6c 65 28 43 6c 69 65 6e 74 44 61 74 61 20 69  dle(ClientData i
2570: 6e 73 74 61 6e 63 65 44 61 74 61 2c 20 69 6e 74  nstanceData, int
2580: 20 64 69 72 2c 20 43 6c 69 65 6e 74 44 61 74 61   dir, ClientData
2590: 20 2a 68 50 74 72 29 7b 0a 20 20 72 65 74 75 72   *hPtr){.  retur
25a0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 7d 0a 0a  n TCL_ERROR;.}..
25b0: 73 74 61 74 69 63 20 54 63 6c 5f 43 68 61 6e 6e  static Tcl_Chann
25c0: 65 6c 54 79 70 65 20 49 6e 63 72 62 6c 6f 62 43  elType IncrblobC
25d0: 68 61 6e 6e 65 6c 54 79 70 65 20 3d 20 7b 0a 20  hannelType = {. 
25e0: 20 22 69 6e 63 72 62 6c 6f 62 22 2c 20 20 20 20   "incrblob",    
25f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2600: 20 20 20 20 2f 2a 20 74 79 70 65 4e 61 6d 65 20      /* typeName 
2610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2620: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20              */. 
2630: 20 54 43 4c 5f 43 48 41 4e 4e 45 4c 5f 56 45 52   TCL_CHANNEL_VER
2640: 53 49 4f 4e 5f 32 2c 20 20 20 20 20 20 20 20 20  SION_2,         
2650: 20 20 20 20 2f 2a 20 76 65 72 73 69 6f 6e 20 20      /* version  
2660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2670: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20              */. 
2680: 20 69 6e 63 72 62 6c 6f 62 43 6c 6f 73 65 2c 20   incrblobClose, 
2690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26a0: 20 20 20 20 2f 2a 20 63 6c 6f 73 65 50 72 6f 63      /* closeProc
26b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26c0: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20              */. 
26d0: 20 69 6e 63 72 62 6c 6f 62 49 6e 70 75 74 2c 20   incrblobInput, 
26e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26f0: 20 20 20 20 2f 2a 20 69 6e 70 75 74 50 72 6f 63      /* inputProc
2700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2710: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20              */. 
2720: 20 69 6e 63 72 62 6c 6f 62 4f 75 74 70 75 74 2c   incrblobOutput,
2730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2740: 20 20 20 20 2f 2a 20 6f 75 74 70 75 74 50 72 6f      /* outputPro
2750: 63 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c               
2760: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20              */. 
2770: 20 69 6e 63 72 62 6c 6f 62 53 65 65 6b 2c 20 20   incrblobSeek,  
2780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2790: 20 20 20 20 2f 2a 20 73 65 65 6b 50 72 6f 63 20      /* seekProc 
27a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27b0: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20              */. 
27c0: 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
27d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27e0: 20 20 20 20 2f 2a 20 73 65 74 4f 70 74 69 6f 6e      /* setOption
27f0: 50 72 6f 63 20 20 20 20 20 20 20 20 20 20 20 20  Proc            
2800: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20              */. 
2810: 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
2820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2830: 20 20 20 20 2f 2a 20 67 65 74 4f 70 74 69 6f 6e      /* getOption
2840: 50 72 6f 63 20 20 20 20 20 20 20 20 20 20 20 20  Proc            
2850: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20              */. 
2860: 20 69 6e 63 72 62 6c 6f 62 57 61 74 63 68 2c 20   incrblobWatch, 
2870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2880: 20 20 20 20 2f 2a 20 77 61 74 63 68 50 72 6f 63      /* watchProc
2890: 20 28 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f   (this is a no-o
28a0: 70 29 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  p)          */. 
28b0: 20 69 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 2c   incrblobHandle,
28c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28d0: 20 20 20 20 2f 2a 20 67 65 74 48 61 6e 64 6c 65      /* getHandle
28e0: 50 72 6f 63 20 28 61 6c 77 61 79 73 20 72 65 74  Proc (always ret
28f0: 75 72 6e 73 20 65 72 72 6f 72 29 20 2a 2f 0a 20  urns error) */. 
2900: 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
2910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2920: 20 20 20 20 2f 2a 20 63 6c 6f 73 65 32 50 72 6f      /* close2Pro
2930: 63 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c               
2940: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20              */. 
2950: 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
2960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2970: 20 20 20 20 2f 2a 20 62 6c 6f 63 6b 4d 6f 64 65      /* blockMode
2980: 50 72 6f 63 20 20 20 20 20 20 20 20 20 20 20 20  Proc            
2990: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20              */. 
29a0: 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
29b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29c0: 20 20 20 20 2f 2a 20 66 6c 75 73 68 50 72 6f 63      /* flushProc
29d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29e0: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20              */. 
29f0: 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
2a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a10: 20 20 20 20 2f 2a 20 68 61 6e 64 6c 65 72 50 72      /* handlerPr
2a20: 6f 63 20 20 20 20 20 20 20 20 20 20 20 20 20 20  oc              
2a30: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20              */. 
2a40: 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
2a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a60: 20 20 20 20 2f 2a 20 77 69 64 65 53 65 65 6b 50      /* wideSeekP
2a70: 72 6f 63 20 20 20 20 20 20 20 20 20 20 20 20 20  roc             
2a80: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 7d              */.}
2a90: 3b 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  ;../*.** Create 
2aa0: 61 20 6e 65 77 20 69 6e 63 72 62 6c 6f 62 20 63  a new incrblob c
2ab0: 68 61 6e 6e 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69  hannel..*/.stati
2ac0: 63 20 69 6e 74 20 63 72 65 61 74 65 49 6e 63 72  c int createIncr
2ad0: 62 6c 6f 62 43 68 61 6e 6e 65 6c 28 0a 20 20 54  blobChannel(.  T
2ae0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
2af0: 70 2c 20 0a 20 20 53 71 6c 69 74 65 44 62 20 2a  p, .  SqliteDb *
2b00: 70 44 62 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68  pDb, .  const ch
2b10: 61 72 20 2a 7a 44 62 2c 0a 20 20 63 6f 6e 73 74  ar *zDb,.  const
2b20: 20 63 68 61 72 20 2a 7a 54 61 62 6c 65 2c 20 0a   char *zTable, .
2b30: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
2b40: 6f 6c 75 6d 6e 2c 20 0a 20 20 73 71 6c 69 74 65  olumn, .  sqlite
2b50: 5f 69 6e 74 36 34 20 69 52 6f 77 2c 0a 20 20 69  _int64 iRow,.  i
2b60: 6e 74 20 69 73 52 65 61 64 6f 6e 6c 79 0a 29 7b  nt isReadonly.){
2b70: 0a 20 20 49 6e 63 72 62 6c 6f 62 43 68 61 6e 6e  .  IncrblobChann
2b80: 65 6c 20 2a 70 3b 0a 20 20 73 71 6c 69 74 65 33  el *p;.  sqlite3
2b90: 20 2a 64 62 20 3d 20 70 44 62 2d 3e 64 62 3b 0a   *db = pDb->db;.
2ba0: 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 20 2a    sqlite3_blob *
2bb0: 70 42 6c 6f 62 3b 0a 20 20 69 6e 74 20 72 63 3b  pBlob;.  int rc;
2bc0: 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 54  .  int flags = T
2bd0: 43 4c 5f 52 45 41 44 41 42 4c 45 7c 28 69 73 52  CL_READABLE|(isR
2be0: 65 61 64 6f 6e 6c 79 20 3f 20 30 20 3a 20 54 43  eadonly ? 0 : TC
2bf0: 4c 5f 57 52 49 54 41 42 4c 45 29 3b 0a 0a 20 20  L_WRITABLE);..  
2c00: 2f 2a 20 54 68 69 73 20 76 61 72 69 61 62 6c 65  /* This variable
2c10: 20 69 73 20 75 73 65 64 20 74 6f 20 6e 61 6d 65   is used to name
2c20: 20 74 68 65 20 63 68 61 6e 6e 65 6c 73 3a 20 22   the channels: "
2c30: 69 6e 63 72 62 6c 6f 62 5f 5b 69 6e 63 72 20 63  incrblob_[incr c
2c40: 6f 75 6e 74 5d 22 20 2a 2f 0a 20 20 73 74 61 74  ount]" */.  stat
2c50: 69 63 20 69 6e 74 20 63 6f 75 6e 74 20 3d 20 30  ic int count = 0
2c60: 3b 0a 20 20 63 68 61 72 20 7a 43 68 61 6e 6e 65  ;.  char zChanne
2c70: 6c 5b 36 34 5d 3b 0a 0a 20 20 72 63 20 3d 20 73  l[64];..  rc = s
2c80: 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 6f 70 65 6e  qlite3_blob_open
2c90: 28 64 62 2c 20 7a 44 62 2c 20 7a 54 61 62 6c 65  (db, zDb, zTable
2ca0: 2c 20 7a 43 6f 6c 75 6d 6e 2c 20 69 52 6f 77 2c  , zColumn, iRow,
2cb0: 20 21 69 73 52 65 61 64 6f 6e 6c 79 2c 20 26 70   !isReadonly, &p
2cc0: 42 6c 6f 62 29 3b 0a 20 20 69 66 28 20 72 63 21  Blob);.  if( rc!
2cd0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2ce0: 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28    Tcl_SetResult(
2cf0: 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29  interp, (char *)
2d00: 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70  sqlite3_errmsg(p
2d10: 44 62 2d 3e 64 62 29 2c 20 54 43 4c 5f 56 4f 4c  Db->db), TCL_VOL
2d20: 41 54 49 4c 45 29 3b 0a 20 20 20 20 72 65 74 75  ATILE);.    retu
2d30: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
2d40: 7d 0a 0a 20 20 70 20 3d 20 28 49 6e 63 72 62 6c  }..  p = (Incrbl
2d50: 6f 62 43 68 61 6e 6e 65 6c 20 2a 29 54 63 6c 5f  obChannel *)Tcl_
2d60: 41 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 49 6e 63  Alloc(sizeof(Inc
2d70: 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 29 29 3b 0a  rblobChannel));.
2d80: 20 20 70 2d 3e 69 53 65 65 6b 20 3d 20 30 3b 0a    p->iSeek = 0;.
2d90: 20 20 70 2d 3e 70 42 6c 6f 62 20 3d 20 70 42 6c    p->pBlob = pBl
2da0: 6f 62 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73  ob;..  sqlite3_s
2db0: 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a  nprintf(sizeof(z
2dc0: 43 68 61 6e 6e 65 6c 29 2c 20 7a 43 68 61 6e 6e  Channel), zChann
2dd0: 65 6c 2c 20 22 69 6e 63 72 62 6c 6f 62 5f 25 64  el, "incrblob_%d
2de0: 22 2c 20 2b 2b 63 6f 75 6e 74 29 3b 0a 20 20 70  ", ++count);.  p
2df0: 2d 3e 63 68 61 6e 6e 65 6c 20 3d 20 54 63 6c 5f  ->channel = Tcl_
2e00: 43 72 65 61 74 65 43 68 61 6e 6e 65 6c 28 26 49  CreateChannel(&I
2e10: 6e 63 72 62 6c 6f 62 43 68 61 6e 6e 65 6c 54 79  ncrblobChannelTy
2e20: 70 65 2c 20 7a 43 68 61 6e 6e 65 6c 2c 20 70 2c  pe, zChannel, p,
2e30: 20 66 6c 61 67 73 29 3b 0a 20 20 54 63 6c 5f 52   flags);.  Tcl_R
2e40: 65 67 69 73 74 65 72 43 68 61 6e 6e 65 6c 28 69  egisterChannel(i
2e50: 6e 74 65 72 70 2c 20 70 2d 3e 63 68 61 6e 6e 65  nterp, p->channe
2e60: 6c 29 3b 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74  l);..  /* Link t
2e70: 68 65 20 6e 65 77 20 63 68 61 6e 6e 65 6c 20 69  he new channel i
2e80: 6e 74 6f 20 74 68 65 20 53 71 6c 69 74 65 44 62  nto the SqliteDb
2e90: 2e 70 49 6e 63 72 62 6c 6f 62 20 6c 69 73 74 2e  .pIncrblob list.
2ea0: 20 2a 2f 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d   */.  p->pNext =
2eb0: 20 70 44 62 2d 3e 70 49 6e 63 72 62 6c 6f 62 3b   pDb->pIncrblob;
2ec0: 0a 20 20 70 2d 3e 70 50 72 65 76 20 3d 20 30 3b  .  p->pPrev = 0;
2ed0: 0a 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20  .  if( p->pNext 
2ee0: 29 7b 0a 20 20 20 20 70 2d 3e 70 4e 65 78 74 2d  ){.    p->pNext-
2ef0: 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 7d 0a  >pPrev = p;.  }.
2f00: 20 20 70 44 62 2d 3e 70 49 6e 63 72 62 6c 6f 62    pDb->pIncrblob
2f10: 20 3d 20 70 3b 0a 20 20 70 2d 3e 70 44 62 20 3d   = p;.  p->pDb =
2f20: 20 70 44 62 3b 0a 0a 20 20 54 63 6c 5f 53 65 74   pDb;..  Tcl_Set
2f30: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28  Result(interp, (
2f40: 63 68 61 72 20 2a 29 54 63 6c 5f 47 65 74 43 68  char *)Tcl_GetCh
2f50: 61 6e 6e 65 6c 4e 61 6d 65 28 70 2d 3e 63 68 61  annelName(p->cha
2f60: 6e 6e 65 6c 29 2c 20 54 43 4c 5f 56 4f 4c 41 54  nnel), TCL_VOLAT
2f70: 49 4c 45 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  ILE);.  return T
2f80: 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6c 73 65 20 20  CL_OK;.}.#else  
2f90: 2f 2a 20 65 6c 73 65 20 63 6c 61 75 73 65 20 66  /* else clause f
2fa0: 6f 72 20 22 23 69 66 6e 64 65 66 20 53 51 4c 49  or "#ifndef SQLI
2fb0: 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42  TE_OMIT_INCRBLOB
2fc0: 22 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 63  " */.  #define c
2fd0: 6c 6f 73 65 49 6e 63 72 62 6c 6f 62 43 68 61 6e  loseIncrblobChan
2fe0: 6e 65 6c 73 28 70 44 62 29 0a 23 65 6e 64 69 66  nels(pDb).#endif
2ff0: 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 6f 6b 20 61 74 20  ../*.** Look at 
3000: 74 68 65 20 73 63 72 69 70 74 20 70 72 65 66 69  the script prefi
3010: 78 20 69 6e 20 70 43 6d 64 2e 20 20 57 65 20 77  x in pCmd.  We w
3020: 69 6c 6c 20 62 65 20 65 78 65 63 75 74 69 6e 67  ill be executing
3030: 20 74 68 69 73 20 73 63 72 69 70 74 0a 2a 2a 20   this script.** 
3040: 61 66 74 65 72 20 66 69 72 73 74 20 61 70 70 65  after first appe
3050: 6e 64 69 6e 67 20 6f 6e 65 20 6f 72 20 6d 6f 72  nding one or mor
3060: 65 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 54 68  e arguments.  Th
3070: 69 73 20 72 6f 75 74 69 6e 65 20 61 6e 61 6c 79  is routine analy
3080: 7a 65 73 0a 2a 2a 20 74 68 65 20 73 63 72 69 70  zes.** the scrip
3090: 74 20 74 6f 20 73 65 65 20 69 66 20 69 74 20 69  t to see if it i
30a0: 73 20 73 61 66 65 20 74 6f 20 75 73 65 20 54 63  s safe to use Tc
30b0: 6c 5f 45 76 61 6c 4f 62 6a 76 28 29 20 6f 6e 20  l_EvalObjv() on 
30c0: 74 68 65 20 73 63 72 69 70 74 0a 2a 2a 20 72 61  the script.** ra
30d0: 74 68 65 72 20 74 68 61 6e 20 74 68 65 20 6d 6f  ther than the mo
30e0: 72 65 20 67 65 6e 65 72 61 6c 20 54 63 6c 5f 45  re general Tcl_E
30f0: 76 61 6c 45 78 28 29 2e 20 20 54 63 6c 5f 45 76  valEx().  Tcl_Ev
3100: 61 6c 4f 62 6a 76 28 29 20 69 73 20 6d 75 63 68  alObjv() is much
3110: 0a 2a 2a 20 66 61 73 74 65 72 2e 0a 2a 2a 0a 2a  .** faster..**.*
3120: 2a 20 53 63 72 69 70 74 73 20 74 68 61 74 20 61  * Scripts that a
3130: 72 65 20 73 61 66 65 20 74 6f 20 75 73 65 20 77  re safe to use w
3140: 69 74 68 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 76  ith Tcl_EvalObjv
3150: 28 29 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61  () consists of a
3160: 0a 2a 2a 20 63 6f 6d 6d 61 6e 64 20 6e 61 6d 65  .** command name
3170: 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 7a 65 72   followed by zer
3180: 6f 20 6f 72 20 6d 6f 72 65 20 61 72 67 75 6d 65  o or more argume
3190: 6e 74 73 20 77 69 74 68 20 6e 6f 20 5b 2e 2e 2e  nts with no [...
31a0: 5d 20 6f 72 20 24 0a 2a 2a 20 6f 72 20 7b 2e 2e  ] or $.** or {..
31b0: 2e 7d 20 6f 72 20 3b 20 74 6f 20 62 65 20 73 65  .} or ; to be se
31c0: 65 6e 20 61 6e 79 77 68 65 72 65 2e 20 20 4d 6f  en anywhere.  Mo
31d0: 73 74 20 63 61 6c 6c 62 61 63 6b 20 73 63 72 69  st callback scri
31e0: 70 74 73 20 63 6f 6e 73 69 73 74 0a 2a 2a 20 6f  pts consist.** o
31f0: 66 20 6a 75 73 74 20 61 20 73 69 6e 67 6c 65 20  f just a single 
3200: 70 72 6f 63 65 64 75 72 65 20 6e 61 6d 65 20 61  procedure name a
3210: 6e 64 20 74 68 65 79 20 6d 65 65 74 20 74 68 69  nd they meet thi
3220: 73 20 72 65 71 75 69 72 65 6d 65 6e 74 2e 0a 2a  s requirement..*
3230: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 66  /.static int saf
3240: 65 54 6f 55 73 65 45 76 61 6c 4f 62 6a 76 28 54  eToUseEvalObjv(T
3250: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
3260: 70 2c 20 54 63 6c 5f 4f 62 6a 20 2a 70 43 6d 64  p, Tcl_Obj *pCmd
3270: 29 7b 0a 20 20 2f 2a 20 57 65 20 63 6f 75 6c 64  ){.  /* We could
3280: 20 74 72 79 20 74 6f 20 64 6f 20 73 6f 6d 65 74   try to do somet
3290: 68 69 6e 67 20 77 69 74 68 20 54 63 6c 5f 50 61  hing with Tcl_Pa
32a0: 72 73 65 28 29 2e 20 20 42 75 74 20 77 65 20 77  rse().  But we w
32b0: 69 6c 6c 20 69 6e 73 74 65 61 64 0a 20 20 2a 2a  ill instead.  **
32c0: 20 6a 75 73 74 20 64 6f 20 61 20 73 65 61 72 63   just do a searc
32d0: 68 20 66 6f 72 20 66 6f 72 62 69 64 64 65 6e 20  h for forbidden 
32e0: 63 68 61 72 61 63 74 65 72 73 2e 20 20 49 66 20  characters.  If 
32f0: 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 72 62 69  any of the forbi
3300: 64 64 65 6e 0a 20 20 2a 2a 20 63 68 61 72 61 63  dden.  ** charac
3310: 74 65 72 73 20 61 70 70 65 61 72 20 69 6e 20 70  ters appear in p
3320: 43 6d 64 2c 20 77 65 20 77 69 6c 6c 20 72 65 70  Cmd, we will rep
3330: 6f 72 74 20 74 68 65 20 73 74 72 69 6e 67 20 61  ort the string a
3340: 73 20 75 6e 73 61 66 65 2e 0a 20 20 2a 2f 0a 20  s unsafe..  */. 
3350: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a   const char *z;.
3360: 20 20 69 6e 74 20 6e 3b 0a 20 20 7a 20 3d 20 54    int n;.  z = T
3370: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
3380: 4f 62 6a 28 70 43 6d 64 2c 20 26 6e 29 3b 0a 20  Obj(pCmd, &n);. 
3390: 20 77 68 69 6c 65 28 20 6e 2d 2d 20 3e 20 30 20   while( n-- > 0 
33a0: 29 7b 0a 20 20 20 20 69 6e 74 20 63 20 3d 20 2a  ){.    int c = *
33b0: 28 7a 2b 2b 29 3b 0a 20 20 20 20 69 66 28 20 63  (z++);.    if( c
33c0: 3d 3d 27 24 27 20 7c 7c 20 63 3d 3d 27 5b 27 20  =='$' || c=='[' 
33d0: 7c 7c 20 63 3d 3d 27 3b 27 20 29 20 72 65 74 75  || c==';' ) retu
33e0: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 0;.  }.  retu
33f0: 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  rn 1;.}../*.** F
3400: 69 6e 64 20 61 6e 20 53 71 6c 46 75 6e 63 20 73  ind an SqlFunc s
3410: 74 72 75 63 74 75 72 65 20 77 69 74 68 20 74 68  tructure with th
3420: 65 20 67 69 76 65 6e 20 6e 61 6d 65 2e 20 20 4f  e given name.  O
3430: 72 20 63 72 65 61 74 65 20 61 20 6e 65 77 0a 2a  r create a new.*
3440: 2a 20 6f 6e 65 20 69 66 20 61 6e 20 65 78 69 73  * one if an exis
3450: 74 69 6e 67 20 6f 6e 65 20 63 61 6e 6e 6f 74 20  ting one cannot 
3460: 62 65 20 66 6f 75 6e 64 2e 20 20 52 65 74 75 72  be found.  Retur
3470: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
3480: 68 65 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e  he.** structure.
3490: 0a 2a 2f 0a 73 74 61 74 69 63 20 53 71 6c 46 75  .*/.static SqlFu
34a0: 6e 63 20 2a 66 69 6e 64 53 71 6c 46 75 6e 63 28  nc *findSqlFunc(
34b0: 53 71 6c 69 74 65 44 62 20 2a 70 44 62 2c 20 63  SqliteDb *pDb, c
34c0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
34d0: 29 7b 0a 20 20 53 71 6c 46 75 6e 63 20 2a 70 2c  ){.  SqlFunc *p,
34e0: 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 69 3b   *pNew;.  int i;
34f0: 0a 20 20 70 4e 65 77 20 3d 20 28 53 71 6c 46 75  .  pNew = (SqlFu
3500: 6e 63 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28 20 73  nc*)Tcl_Alloc( s
3510: 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 2b 20 73  izeof(*pNew) + s
3520: 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 20 2b  trlen30(zName) +
3530: 20 31 20 29 3b 0a 20 20 70 4e 65 77 2d 3e 7a 4e   1 );.  pNew->zN
3540: 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70 4e  ame = (char*)&pN
3550: 65 77 5b 31 5d 3b 0a 20 20 66 6f 72 28 69 3d 30  ew[1];.  for(i=0
3560: 3b 20 7a 4e 61 6d 65 5b 69 5d 3b 20 69 2b 2b 29  ; zName[i]; i++)
3570: 7b 20 70 4e 65 77 2d 3e 7a 4e 61 6d 65 5b 69 5d  { pNew->zName[i]
3580: 20 3d 20 74 6f 6c 6f 77 65 72 28 7a 4e 61 6d 65   = tolower(zName
3590: 5b 69 5d 29 3b 20 7d 0a 20 20 70 4e 65 77 2d 3e  [i]); }.  pNew->
35a0: 7a 4e 61 6d 65 5b 69 5d 20 3d 20 30 3b 0a 20 20  zName[i] = 0;.  
35b0: 66 6f 72 28 70 3d 70 44 62 2d 3e 70 46 75 6e 63  for(p=pDb->pFunc
35c0: 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29  ; p; p=p->pNext)
35d0: 7b 20 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d  { .    if( strcm
35e0: 70 28 70 2d 3e 7a 4e 61 6d 65 2c 20 70 4e 65 77  p(p->zName, pNew
35f0: 2d 3e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20  ->zName)==0 ){. 
3600: 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28 28 63       Tcl_Free((c
3610: 68 61 72 2a 29 70 4e 65 77 29 3b 0a 20 20 20 20  har*)pNew);.    
3620: 20 20 72 65 74 75 72 6e 20 70 3b 0a 20 20 20 20    return p;.    
3630: 7d 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 69 6e  }.  }.  pNew->in
3640: 74 65 72 70 20 3d 20 70 44 62 2d 3e 69 6e 74 65  terp = pDb->inte
3650: 72 70 3b 0a 20 20 70 4e 65 77 2d 3e 70 44 62 20  rp;.  pNew->pDb 
3660: 3d 20 70 44 62 3b 0a 20 20 70 4e 65 77 2d 3e 70  = pDb;.  pNew->p
3670: 53 63 72 69 70 74 20 3d 20 30 3b 0a 20 20 70 4e  Script = 0;.  pN
3680: 65 77 2d 3e 70 4e 65 78 74 20 3d 20 70 44 62 2d  ew->pNext = pDb-
3690: 3e 70 46 75 6e 63 3b 0a 20 20 70 44 62 2d 3e 70  >pFunc;.  pDb->p
36a0: 46 75 6e 63 20 3d 20 70 4e 65 77 3b 0a 20 20 72  Func = pNew;.  r
36b0: 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f  eturn pNew;.}../
36c0: 2a 0a 2a 2a 20 46 72 65 65 20 61 20 73 69 6e 67  *.** Free a sing
36d0: 6c 65 20 53 71 6c 50 72 65 70 61 72 65 64 53 74  le SqlPreparedSt
36e0: 6d 74 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74  mt object..*/.st
36f0: 61 74 69 63 20 76 6f 69 64 20 64 62 46 72 65 65  atic void dbFree
3700: 53 74 6d 74 28 53 71 6c 50 72 65 70 61 72 65 64  Stmt(SqlPrepared
3710: 53 74 6d 74 20 2a 70 53 74 6d 74 29 7b 0a 23 69  Stmt *pStmt){.#i
3720: 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
3730: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73  .  if( sqlite3_s
3740: 71 6c 28 70 53 74 6d 74 2d 3e 70 53 74 6d 74 29  ql(pStmt->pStmt)
3750: 3d 3d 30 20 29 7b 0a 20 20 20 20 54 63 6c 5f 46  ==0 ){.    Tcl_F
3760: 72 65 65 28 28 63 68 61 72 20 2a 29 70 53 74 6d  ree((char *)pStm
3770: 74 2d 3e 7a 53 71 6c 29 3b 0a 20 20 7d 0a 23 65  t->zSql);.  }.#e
3780: 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 66  ndif.  sqlite3_f
3790: 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 2d 3e 70  inalize(pStmt->p
37a0: 53 74 6d 74 29 3b 0a 20 20 54 63 6c 5f 46 72 65  Stmt);.  Tcl_Fre
37b0: 65 28 28 63 68 61 72 20 2a 29 70 53 74 6d 74 29  e((char *)pStmt)
37c0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 61 6c  ;.}../*.** Final
37d0: 69 7a 65 20 61 6e 64 20 66 72 65 65 20 61 20 6c  ize and free a l
37e0: 69 73 74 20 6f 66 20 70 72 65 70 61 72 65 64 20  ist of prepared 
37f0: 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2f 0a 73 74  statements.*/.st
3800: 61 74 69 63 20 76 6f 69 64 20 66 6c 75 73 68 53  atic void flushS
3810: 74 6d 74 43 61 63 68 65 28 53 71 6c 69 74 65 44  tmtCache(SqliteD
3820: 62 20 2a 70 44 62 29 7b 0a 20 20 53 71 6c 50 72  b *pDb){.  SqlPr
3830: 65 70 61 72 65 64 53 74 6d 74 20 2a 70 50 72 65  eparedStmt *pPre
3840: 53 74 6d 74 3b 0a 20 20 53 71 6c 50 72 65 70 61  Stmt;.  SqlPrepa
3850: 72 65 64 53 74 6d 74 20 2a 70 4e 65 78 74 3b 0a  redStmt *pNext;.
3860: 0a 20 20 66 6f 72 28 70 50 72 65 53 74 6d 74 20  .  for(pPreStmt 
3870: 3d 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74 3b  = pDb->stmtList;
3880: 20 70 50 72 65 53 74 6d 74 3b 20 70 50 72 65 53   pPreStmt; pPreS
3890: 74 6d 74 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20  tmt=pNext){.    
38a0: 70 4e 65 78 74 20 3d 20 70 50 72 65 53 74 6d 74  pNext = pPreStmt
38b0: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 64 62 46  ->pNext;.    dbF
38c0: 72 65 65 53 74 6d 74 28 70 50 72 65 53 74 6d 74  reeStmt(pPreStmt
38d0: 29 3b 0a 20 20 7d 0a 20 20 70 44 62 2d 3e 6e 53  );.  }.  pDb->nS
38e0: 74 6d 74 20 3d 20 30 3b 0a 20 20 70 44 62 2d 3e  tmt = 0;.  pDb->
38f0: 73 74 6d 74 4c 61 73 74 20 3d 20 30 3b 0a 20 20  stmtLast = 0;.  
3900: 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74 20 3d 20  pDb->stmtList = 
3910: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 43 4c 20  0;.}../*.** TCL 
3920: 63 61 6c 6c 73 20 74 68 69 73 20 70 72 6f 63 65  calls this proce
3930: 64 75 72 65 20 77 68 65 6e 20 61 6e 20 73 71 6c  dure when an sql
3940: 69 74 65 33 20 64 61 74 61 62 61 73 65 20 63 6f  ite3 database co
3950: 6d 6d 61 6e 64 20 69 73 0a 2a 2a 20 64 65 6c 65  mmand is.** dele
3960: 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ted..*/.static v
3970: 6f 69 64 20 44 62 44 65 6c 65 74 65 43 6d 64 28  oid DbDeleteCmd(
3980: 76 6f 69 64 20 2a 64 62 29 7b 0a 20 20 53 71 6c  void *db){.  Sql
3990: 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53 71  iteDb *pDb = (Sq
39a0: 6c 69 74 65 44 62 2a 29 64 62 3b 0a 20 20 66 6c  liteDb*)db;.  fl
39b0: 75 73 68 53 74 6d 74 43 61 63 68 65 28 70 44 62  ushStmtCache(pDb
39c0: 29 3b 0a 20 20 63 6c 6f 73 65 49 6e 63 72 62 6c  );.  closeIncrbl
39d0: 6f 62 43 68 61 6e 6e 65 6c 73 28 70 44 62 29 3b  obChannels(pDb);
39e0: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65  .  sqlite3_close
39f0: 28 70 44 62 2d 3e 64 62 29 3b 0a 20 20 77 68 69  (pDb->db);.  whi
3a00: 6c 65 28 20 70 44 62 2d 3e 70 46 75 6e 63 20 29  le( pDb->pFunc )
3a10: 7b 0a 20 20 20 20 53 71 6c 46 75 6e 63 20 2a 70  {.    SqlFunc *p
3a20: 46 75 6e 63 20 3d 20 70 44 62 2d 3e 70 46 75 6e  Func = pDb->pFun
3a30: 63 3b 0a 20 20 20 20 70 44 62 2d 3e 70 46 75 6e  c;.    pDb->pFun
3a40: 63 20 3d 20 70 46 75 6e 63 2d 3e 70 4e 65 78 74  c = pFunc->pNext
3a50: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46  ;.    assert( pF
3a60: 75 6e 63 2d 3e 70 44 62 3d 3d 70 44 62 20 29 3b  unc->pDb==pDb );
3a70: 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66  .    Tcl_DecrRef
3a80: 43 6f 75 6e 74 28 70 46 75 6e 63 2d 3e 70 53 63  Count(pFunc->pSc
3a90: 72 69 70 74 29 3b 0a 20 20 20 20 54 63 6c 5f 46  ript);.    Tcl_F
3aa0: 72 65 65 28 28 63 68 61 72 2a 29 70 46 75 6e 63  ree((char*)pFunc
3ab0: 29 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20  );.  }.  while( 
3ac0: 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 20 29 7b  pDb->pCollate ){
3ad0: 0a 20 20 20 20 53 71 6c 43 6f 6c 6c 61 74 65 20  .    SqlCollate 
3ae0: 2a 70 43 6f 6c 6c 61 74 65 20 3d 20 70 44 62 2d  *pCollate = pDb-
3af0: 3e 70 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 70  >pCollate;.    p
3b00: 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 20 3d 20 70  Db->pCollate = p
3b10: 43 6f 6c 6c 61 74 65 2d 3e 70 4e 65 78 74 3b 0a  Collate->pNext;.
3b20: 20 20 20 20 54 63 6c 5f 46 72 65 65 28 28 63 68      Tcl_Free((ch
3b30: 61 72 2a 29 70 43 6f 6c 6c 61 74 65 29 3b 0a 20  ar*)pCollate);. 
3b40: 20 7d 0a 20 20 69 66 28 20 70 44 62 2d 3e 7a 42   }.  if( pDb->zB
3b50: 75 73 79 20 29 7b 0a 20 20 20 20 54 63 6c 5f 46  usy ){.    Tcl_F
3b60: 72 65 65 28 70 44 62 2d 3e 7a 42 75 73 79 29 3b  ree(pDb->zBusy);
3b70: 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 62 2d 3e  .  }.  if( pDb->
3b80: 7a 54 72 61 63 65 20 29 7b 0a 20 20 20 20 54 63  zTrace ){.    Tc
3b90: 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 54 72 61  l_Free(pDb->zTra
3ba0: 63 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ce);.  }.  if( p
3bb0: 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 20 29 7b 0a  Db->zProfile ){.
3bc0: 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62      Tcl_Free(pDb
3bd0: 2d 3e 7a 50 72 6f 66 69 6c 65 29 3b 0a 20 20 7d  ->zProfile);.  }
3be0: 0a 20 20 69 66 28 20 70 44 62 2d 3e 7a 41 75 74  .  if( pDb->zAut
3bf0: 68 20 29 7b 0a 20 20 20 20 54 63 6c 5f 46 72 65  h ){.    Tcl_Fre
3c00: 65 28 70 44 62 2d 3e 7a 41 75 74 68 29 3b 0a 20  e(pDb->zAuth);. 
3c10: 20 7d 0a 20 20 69 66 28 20 70 44 62 2d 3e 7a 4e   }.  if( pDb->zN
3c20: 75 6c 6c 20 29 7b 0a 20 20 20 20 54 63 6c 5f 46  ull ){.    Tcl_F
3c30: 72 65 65 28 70 44 62 2d 3e 7a 4e 75 6c 6c 29 3b  ree(pDb->zNull);
3c40: 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 62 2d 3e  .  }.  if( pDb->
3c50: 70 55 70 64 61 74 65 48 6f 6f 6b 20 29 7b 0a 20  pUpdateHook ){. 
3c60: 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f     Tcl_DecrRefCo
3c70: 75 6e 74 28 70 44 62 2d 3e 70 55 70 64 61 74 65  unt(pDb->pUpdate
3c80: 48 6f 6f 6b 29 3b 0a 20 20 7d 0a 20 20 69 66 28  Hook);.  }.  if(
3c90: 20 70 44 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 48   pDb->pRollbackH
3ca0: 6f 6f 6b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 44  ook ){.    Tcl_D
3cb0: 65 63 72 52 65 66 43 6f 75 6e 74 28 70 44 62 2d  ecrRefCount(pDb-
3cc0: 3e 70 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 29 3b  >pRollbackHook);
3cd0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 62 2d 3e  .  }.  if( pDb->
3ce0: 70 57 61 6c 48 6f 6f 6b 20 29 7b 0a 20 20 20 20  pWalHook ){.    
3cf0: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
3d00: 28 70 44 62 2d 3e 70 57 61 6c 48 6f 6f 6b 29 3b  (pDb->pWalHook);
3d10: 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 62 2d 3e  .  }.  if( pDb->
3d20: 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64 20 29  pCollateNeeded )
3d30: 7b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65  {.    Tcl_DecrRe
3d40: 66 43 6f 75 6e 74 28 70 44 62 2d 3e 70 43 6f 6c  fCount(pDb->pCol
3d50: 6c 61 74 65 4e 65 65 64 65 64 29 3b 0a 20 20 7d  lateNeeded);.  }
3d60: 0a 20 20 54 63 6c 5f 46 72 65 65 28 28 63 68 61  .  Tcl_Free((cha
3d70: 72 2a 29 70 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  r*)pDb);.}../*.*
3d80: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
3d90: 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20  s called when a 
3da0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
3db0: 20 6c 6f 63 6b 65 64 20 77 68 69 6c 65 20 74 72   locked while tr
3dc0: 79 69 6e 67 0a 2a 2a 20 74 6f 20 65 78 65 63 75  ying.** to execu
3dd0: 74 65 20 53 51 4c 2e 0a 2a 2f 0a 73 74 61 74 69  te SQL..*/.stati
3de0: 63 20 69 6e 74 20 44 62 42 75 73 79 48 61 6e 64  c int DbBusyHand
3df0: 6c 65 72 28 76 6f 69 64 20 2a 63 64 2c 20 69 6e  ler(void *cd, in
3e00: 74 20 6e 54 72 69 65 73 29 7b 0a 20 20 53 71 6c  t nTries){.  Sql
3e10: 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53 71  iteDb *pDb = (Sq
3e20: 6c 69 74 65 44 62 2a 29 63 64 3b 0a 20 20 69 6e  liteDb*)cd;.  in
3e30: 74 20 72 63 3b 0a 20 20 63 68 61 72 20 7a 56 61  t rc;.  char zVa
3e40: 6c 5b 33 30 5d 3b 0a 0a 20 20 73 71 6c 69 74 65  l[30];..  sqlite
3e50: 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
3e60: 66 28 7a 56 61 6c 29 2c 20 7a 56 61 6c 2c 20 22  f(zVal), zVal, "
3e70: 25 64 22 2c 20 6e 54 72 69 65 73 29 3b 0a 20 20  %d", nTries);.  
3e80: 72 63 20 3d 20 54 63 6c 5f 56 61 72 45 76 61 6c  rc = Tcl_VarEval
3e90: 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20 70 44  (pDb->interp, pD
3ea0: 62 2d 3e 7a 42 75 73 79 2c 20 22 20 22 2c 20 7a  b->zBusy, " ", z
3eb0: 56 61 6c 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  Val, (char*)0);.
3ec0: 20 20 69 66 28 20 72 63 21 3d 54 43 4c 5f 4f 4b    if( rc!=TCL_OK
3ed0: 20 7c 7c 20 61 74 6f 69 28 54 63 6c 5f 47 65 74   || atoi(Tcl_Get
3ee0: 53 74 72 69 6e 67 52 65 73 75 6c 74 28 70 44 62  StringResult(pDb
3ef0: 2d 3e 69 6e 74 65 72 70 29 29 20 29 7b 0a 20 20  ->interp)) ){.  
3f00: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
3f10: 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 23    return 1;.}..#
3f20: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
3f30: 49 54 5f 50 52 4f 47 52 45 53 53 5f 43 41 4c 4c  IT_PROGRESS_CALL
3f40: 42 41 43 4b 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  BACK./*.** This 
3f50: 72 6f 75 74 69 6e 65 20 69 73 20 69 6e 76 6f 6b  routine is invok
3f60: 65 64 20 61 73 20 74 68 65 20 27 70 72 6f 67 72  ed as the 'progr
3f70: 65 73 73 20 63 61 6c 6c 62 61 63 6b 27 20 66 6f  ess callback' fo
3f80: 72 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  r the database..
3f90: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 44 62  */.static int Db
3fa0: 50 72 6f 67 72 65 73 73 48 61 6e 64 6c 65 72 28  ProgressHandler(
3fb0: 76 6f 69 64 20 2a 63 64 29 7b 0a 20 20 53 71 6c  void *cd){.  Sql
3fc0: 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53 71  iteDb *pDb = (Sq
3fd0: 6c 69 74 65 44 62 2a 29 63 64 3b 0a 20 20 69 6e  liteDb*)cd;.  in
3fe0: 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
3ff0: 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 20   pDb->zProgress 
4000: 29 3b 0a 20 20 72 63 20 3d 20 54 63 6c 5f 45 76  );.  rc = Tcl_Ev
4010: 61 6c 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20  al(pDb->interp, 
4020: 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 29 3b  pDb->zProgress);
4030: 0a 20 20 69 66 28 20 72 63 21 3d 54 43 4c 5f 4f  .  if( rc!=TCL_O
4040: 4b 20 7c 7c 20 61 74 6f 69 28 54 63 6c 5f 47 65  K || atoi(Tcl_Ge
4050: 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28 70 44  tStringResult(pD
4060: 62 2d 3e 69 6e 74 65 72 70 29 29 20 29 7b 0a 20  b->interp)) ){. 
4070: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
4080: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23  .  return 0;.}.#
4090: 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
40a0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45  QLITE_OMIT_TRACE
40b0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
40c0: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79  ine is called by
40d0: 20 74 68 65 20 53 51 4c 69 74 65 20 74 72 61 63   the SQLite trac
40e0: 65 20 68 61 6e 64 6c 65 72 20 77 68 65 6e 65 76  e handler whenev
40f0: 65 72 20 61 20 6e 65 77 0a 2a 2a 20 62 6c 6f 63  er a new.** bloc
4100: 6b 20 6f 66 20 53 51 4c 20 69 73 20 65 78 65 63  k of SQL is exec
4110: 75 74 65 64 2e 20 20 54 68 65 20 54 43 4c 20 73  uted.  The TCL s
4120: 63 72 69 70 74 20 69 6e 20 70 44 62 2d 3e 7a 54  cript in pDb->zT
4130: 72 61 63 65 20 69 73 20 65 78 65 63 75 74 65 64  race is executed
4140: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
4150: 20 44 62 54 72 61 63 65 48 61 6e 64 6c 65 72 28   DbTraceHandler(
4160: 76 6f 69 64 20 2a 63 64 2c 20 63 6f 6e 73 74 20  void *cd, const 
4170: 63 68 61 72 20 2a 7a 53 71 6c 29 7b 0a 20 20 53  char *zSql){.  S
4180: 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28  qliteDb *pDb = (
4190: 53 71 6c 69 74 65 44 62 2a 29 63 64 3b 0a 20 20  SqliteDb*)cd;.  
41a0: 54 63 6c 5f 44 53 74 72 69 6e 67 20 73 74 72 3b  Tcl_DString str;
41b0: 0a 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49  ..  Tcl_DStringI
41c0: 6e 69 74 28 26 73 74 72 29 3b 0a 20 20 54 63 6c  nit(&str);.  Tcl
41d0: 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64 28 26  _DStringAppend(&
41e0: 73 74 72 2c 20 70 44 62 2d 3e 7a 54 72 61 63 65  str, pDb->zTrace
41f0: 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 44 53 74  , -1);.  Tcl_DSt
4200: 72 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e  ringAppendElemen
4210: 74 28 26 73 74 72 2c 20 7a 53 71 6c 29 3b 0a 20  t(&str, zSql);. 
4220: 20 54 63 6c 5f 45 76 61 6c 28 70 44 62 2d 3e 69   Tcl_Eval(pDb->i
4230: 6e 74 65 72 70 2c 20 54 63 6c 5f 44 53 74 72 69  nterp, Tcl_DStri
4240: 6e 67 56 61 6c 75 65 28 26 73 74 72 29 29 3b 0a  ngValue(&str));.
4250: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65    Tcl_DStringFre
4260: 65 28 26 73 74 72 29 3b 0a 20 20 54 63 6c 5f 52  e(&str);.  Tcl_R
4270: 65 73 65 74 52 65 73 75 6c 74 28 70 44 62 2d 3e  esetResult(pDb->
4280: 69 6e 74 65 72 70 29 3b 0a 7d 0a 23 65 6e 64 69  interp);.}.#endi
4290: 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  f..#ifndef SQLIT
42a0: 45 5f 4f 4d 49 54 5f 54 52 41 43 45 0a 2f 2a 0a  E_OMIT_TRACE./*.
42b0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
42c0: 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65  is called by the
42d0: 20 53 51 4c 69 74 65 20 70 72 6f 66 69 6c 65 20   SQLite profile 
42e0: 68 61 6e 64 6c 65 72 20 61 66 74 65 72 20 61 20  handler after a 
42f0: 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 53 51 4c  statement.** SQL
4300: 20 68 61 73 20 65 78 65 63 75 74 65 64 2e 20 20   has executed.  
4310: 54 68 65 20 54 43 4c 20 73 63 72 69 70 74 20 69  The TCL script i
4320: 6e 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 20  n pDb->zProfile 
4330: 69 73 20 65 76 61 6c 75 61 74 65 64 2e 0a 2a 2f  is evaluated..*/
4340: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 44 62 50  .static void DbP
4350: 72 6f 66 69 6c 65 48 61 6e 64 6c 65 72 28 76 6f  rofileHandler(vo
4360: 69 64 20 2a 63 64 2c 20 63 6f 6e 73 74 20 63 68  id *cd, const ch
4370: 61 72 20 2a 7a 53 71 6c 2c 20 73 71 6c 69 74 65  ar *zSql, sqlite
4380: 5f 75 69 6e 74 36 34 20 74 6d 29 7b 0a 20 20 53  _uint64 tm){.  S
4390: 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28  qliteDb *pDb = (
43a0: 53 71 6c 69 74 65 44 62 2a 29 63 64 3b 0a 20 20  SqliteDb*)cd;.  
43b0: 54 63 6c 5f 44 53 74 72 69 6e 67 20 73 74 72 3b  Tcl_DString str;
43c0: 0a 20 20 63 68 61 72 20 7a 54 6d 5b 31 30 30 5d  .  char zTm[100]
43d0: 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  ;..  sqlite3_snp
43e0: 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 54 6d  rintf(sizeof(zTm
43f0: 29 2d 31 2c 20 7a 54 6d 2c 20 22 25 6c 6c 64 22  )-1, zTm, "%lld"
4400: 2c 20 74 6d 29 3b 0a 20 20 54 63 6c 5f 44 53 74  , tm);.  Tcl_DSt
4410: 72 69 6e 67 49 6e 69 74 28 26 73 74 72 29 3b 0a  ringInit(&str);.
4420: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70    Tcl_DStringApp
4430: 65 6e 64 28 26 73 74 72 2c 20 70 44 62 2d 3e 7a  end(&str, pDb->z
4440: 50 72 6f 66 69 6c 65 2c 20 2d 31 29 3b 0a 20 20  Profile, -1);.  
4450: 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e  Tcl_DStringAppen
4460: 64 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c 20 7a  dElement(&str, z
4470: 53 71 6c 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72  Sql);.  Tcl_DStr
4480: 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ingAppendElement
4490: 28 26 73 74 72 2c 20 7a 54 6d 29 3b 0a 20 20 54  (&str, zTm);.  T
44a0: 63 6c 5f 45 76 61 6c 28 70 44 62 2d 3e 69 6e 74  cl_Eval(pDb->int
44b0: 65 72 70 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67  erp, Tcl_DString
44c0: 56 61 6c 75 65 28 26 73 74 72 29 29 3b 0a 20 20  Value(&str));.  
44d0: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28  Tcl_DStringFree(
44e0: 26 73 74 72 29 3b 0a 20 20 54 63 6c 5f 52 65 73  &str);.  Tcl_Res
44f0: 65 74 52 65 73 75 6c 74 28 70 44 62 2d 3e 69 6e  etResult(pDb->in
4500: 74 65 72 70 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  terp);.}.#endif.
4510: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
4520: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ine is called wh
4530: 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  en a transaction
4540: 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2e 20 20   is committed.  
4550: 54 68 65 0a 2a 2a 20 54 43 4c 20 73 63 72 69 70  The.** TCL scrip
4560: 74 20 69 6e 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69  t in pDb->zCommi
4570: 74 20 69 73 20 65 78 65 63 75 74 65 64 2e 20 20  t is executed.  
4580: 49 66 20 69 74 20 72 65 74 75 72 6e 73 20 6e 6f  If it returns no
4590: 6e 2d 7a 65 72 6f 20 6f 72 0a 2a 2a 20 69 66 20  n-zero or.** if 
45a0: 69 74 20 74 68 72 6f 77 73 20 61 6e 20 65 78 63  it throws an exc
45b0: 65 70 74 69 6f 6e 2c 20 74 68 65 20 74 72 61 6e  eption, the tran
45c0: 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65  saction is rolle
45d0: 64 20 62 61 63 6b 20 69 6e 73 74 65 61 64 0a 2a  d back instead.*
45e0: 2a 20 6f 66 20 62 65 69 6e 67 20 63 6f 6d 6d 69  * of being commi
45f0: 74 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tted..*/.static 
4600: 69 6e 74 20 44 62 43 6f 6d 6d 69 74 48 61 6e 64  int DbCommitHand
4610: 6c 65 72 28 76 6f 69 64 20 2a 63 64 29 7b 0a 20  ler(void *cd){. 
4620: 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d   SqliteDb *pDb =
4630: 20 28 53 71 6c 69 74 65 44 62 2a 29 63 64 3b 0a   (SqliteDb*)cd;.
4640: 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 72 63 20    int rc;..  rc 
4650: 3d 20 54 63 6c 5f 45 76 61 6c 28 70 44 62 2d 3e  = Tcl_Eval(pDb->
4660: 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a 43 6f  interp, pDb->zCo
4670: 6d 6d 69 74 29 3b 0a 20 20 69 66 28 20 72 63 21  mmit);.  if( rc!
4680: 3d 54 43 4c 5f 4f 4b 20 7c 7c 20 61 74 6f 69 28  =TCL_OK || atoi(
4690: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73  Tcl_GetStringRes
46a0: 75 6c 74 28 70 44 62 2d 3e 69 6e 74 65 72 70 29  ult(pDb->interp)
46b0: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
46c0: 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
46d0: 30 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69  0;.}..static voi
46e0: 64 20 44 62 52 6f 6c 6c 62 61 63 6b 48 61 6e 64  d DbRollbackHand
46f0: 6c 65 72 28 76 6f 69 64 20 2a 63 6c 69 65 6e 74  ler(void *client
4700: 44 61 74 61 29 7b 0a 20 20 53 71 6c 69 74 65 44  Data){.  SqliteD
4710: 62 20 2a 70 44 62 20 3d 20 28 53 71 6c 69 74 65  b *pDb = (Sqlite
4720: 44 62 2a 29 63 6c 69 65 6e 74 44 61 74 61 3b 0a  Db*)clientData;.
4730: 20 20 61 73 73 65 72 74 28 70 44 62 2d 3e 70 52    assert(pDb->pR
4740: 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 29 3b 0a 20 20  ollbackHook);.  
4750: 69 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f  if( TCL_OK!=Tcl_
4760: 45 76 61 6c 4f 62 6a 45 78 28 70 44 62 2d 3e 69  EvalObjEx(pDb->i
4770: 6e 74 65 72 70 2c 20 70 44 62 2d 3e 70 52 6f 6c  nterp, pDb->pRol
4780: 6c 62 61 63 6b 48 6f 6f 6b 2c 20 30 29 20 29 7b  lbackHook, 0) ){
4790: 0a 20 20 20 20 54 63 6c 5f 42 61 63 6b 67 72 6f  .    Tcl_Backgro
47a0: 75 6e 64 45 72 72 6f 72 28 70 44 62 2d 3e 69 6e  undError(pDb->in
47b0: 74 65 72 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  terp);.  }.}../*
47c0: 0a 2a 2a 20 54 68 69 73 20 70 72 6f 63 65 64 75  .** This procedu
47d0: 72 65 20 68 61 6e 64 6c 65 73 20 77 61 6c 5f 68  re handles wal_h
47e0: 6f 6f 6b 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 2a  ook callbacks..*
47f0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 44 62 57  /.static int DbW
4800: 61 6c 48 61 6e 64 6c 65 72 28 0a 20 20 76 6f 69  alHandler(.  voi
4810: 64 20 2a 63 6c 69 65 6e 74 44 61 74 61 2c 20 0a  d *clientData, .
4820: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a    sqlite3 *db, .
4830: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
4840: 62 2c 20 0a 20 20 69 6e 74 20 6e 45 6e 74 72 79  b, .  int nEntry
4850: 0a 29 7b 0a 20 20 69 6e 74 20 72 65 74 20 3d 20  .){.  int ret = 
4860: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 54 63 6c  SQLITE_OK;.  Tcl
4870: 5f 4f 62 6a 20 2a 70 3b 0a 20 20 53 71 6c 69 74  _Obj *p;.  Sqlit
4880: 65 44 62 20 2a 70 44 62 20 3d 20 28 53 71 6c 69  eDb *pDb = (Sqli
4890: 74 65 44 62 2a 29 63 6c 69 65 6e 74 44 61 74 61  teDb*)clientData
48a0: 3b 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ;.  Tcl_Interp *
48b0: 69 6e 74 65 72 70 20 3d 20 70 44 62 2d 3e 69 6e  interp = pDb->in
48c0: 74 65 72 70 3b 0a 20 20 61 73 73 65 72 74 28 70  terp;.  assert(p
48d0: 44 62 2d 3e 70 57 61 6c 48 6f 6f 6b 29 3b 0a 0a  Db->pWalHook);..
48e0: 20 20 70 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63    p = Tcl_Duplic
48f0: 61 74 65 4f 62 6a 28 70 44 62 2d 3e 70 57 61 6c  ateObj(pDb->pWal
4900: 48 6f 6f 6b 29 3b 0a 20 20 54 63 6c 5f 49 6e 63  Hook);.  Tcl_Inc
4910: 72 52 65 66 43 6f 75 6e 74 28 70 29 3b 0a 20 20  rRefCount(p);.  
4920: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
4930: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
4940: 20 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e   p, Tcl_NewStrin
4950: 67 4f 62 6a 28 7a 44 62 2c 20 2d 31 29 29 3b 0a  gObj(zDb, -1));.
4960: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
4970: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
4980: 70 2c 20 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74  p, p, Tcl_NewInt
4990: 4f 62 6a 28 6e 45 6e 74 72 79 29 29 3b 0a 20 20  Obj(nEntry));.  
49a0: 69 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f  if( TCL_OK!=Tcl_
49b0: 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70  EvalObjEx(interp
49c0: 2c 20 70 2c 20 30 29 20 0a 20 20 20 7c 7c 20 54  , p, 0) .   || T
49d0: 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 49 6e  CL_OK!=Tcl_GetIn
49e0: 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
49f0: 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c   Tcl_GetObjResul
4a00: 74 28 69 6e 74 65 72 70 29 2c 20 26 72 65 74 29  t(interp), &ret)
4a10: 0a 20 20 29 7b 0a 20 20 20 20 54 63 6c 5f 42 61  .  ){.    Tcl_Ba
4a20: 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72 28 69 6e  ckgroundError(in
4a30: 74 65 72 70 29 3b 0a 20 20 7d 0a 20 20 54 63 6c  terp);.  }.  Tcl
4a40: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 29  _DecrRefCount(p)
4a50: 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 65 74 3b  ;..  return ret;
4a60: 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .}..#if defined(
4a70: 53 51 4c 49 54 45 5f 54 45 53 54 29 20 26 26 20  SQLITE_TEST) && 
4a80: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
4a90: 4e 41 42 4c 45 5f 55 4e 4c 4f 43 4b 5f 4e 4f 54  NABLE_UNLOCK_NOT
4aa0: 49 46 59 29 0a 73 74 61 74 69 63 20 76 6f 69 64  IFY).static void
4ab0: 20 73 65 74 54 65 73 74 55 6e 6c 6f 63 6b 4e 6f   setTestUnlockNo
4ac0: 74 69 66 79 56 61 72 73 28 54 63 6c 5f 49 6e 74  tifyVars(Tcl_Int
4ad0: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74  erp *interp, int
4ae0: 20 69 41 72 67 2c 20 69 6e 74 20 6e 41 72 67 29   iArg, int nArg)
4af0: 7b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 36 34  {.  char zBuf[64
4b00: 5d 3b 0a 20 20 73 70 72 69 6e 74 66 28 7a 42 75  ];.  sprintf(zBu
4b10: 66 2c 20 22 25 64 22 2c 20 69 41 72 67 29 3b 0a  f, "%d", iArg);.
4b20: 20 20 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74    Tcl_SetVar(int
4b30: 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 75 6e 6c  erp, "sqlite_unl
4b40: 6f 63 6b 5f 6e 6f 74 69 66 79 5f 61 72 67 22 2c  ock_notify_arg",
4b50: 20 7a 42 75 66 2c 20 54 43 4c 5f 47 4c 4f 42 41   zBuf, TCL_GLOBA
4b60: 4c 5f 4f 4e 4c 59 29 3b 0a 20 20 73 70 72 69 6e  L_ONLY);.  sprin
4b70: 74 66 28 7a 42 75 66 2c 20 22 25 64 22 2c 20 6e  tf(zBuf, "%d", n
4b80: 41 72 67 29 3b 0a 20 20 54 63 6c 5f 53 65 74 56  Arg);.  Tcl_SetV
4b90: 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69  ar(interp, "sqli
4ba0: 74 65 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79  te_unlock_notify
4bb0: 5f 61 72 67 63 6f 75 6e 74 22 2c 20 7a 42 75 66  _argcount", zBuf
4bc0: 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c  , TCL_GLOBAL_ONL
4bd0: 59 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65  Y);.}.#else.# de
4be0: 66 69 6e 65 20 73 65 74 54 65 73 74 55 6e 6c 6f  fine setTestUnlo
4bf0: 63 6b 4e 6f 74 69 66 79 56 61 72 73 28 78 2c 79  ckNotifyVars(x,y
4c00: 2c 7a 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64  ,z).#endif..#ifd
4c10: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
4c20: 5f 55 4e 4c 4f 43 4b 5f 4e 4f 54 49 46 59 0a 73  _UNLOCK_NOTIFY.s
4c30: 74 61 74 69 63 20 76 6f 69 64 20 44 62 55 6e 6c  tatic void DbUnl
4c40: 6f 63 6b 4e 6f 74 69 66 79 28 76 6f 69 64 20 2a  ockNotify(void *
4c50: 2a 61 70 41 72 67 2c 20 69 6e 74 20 6e 41 72 67  *apArg, int nArg
4c60: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  ){.  int i;.  fo
4c70: 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69  r(i=0; i<nArg; i
4c80: 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69  ++){.    const i
4c90: 6e 74 20 66 6c 61 67 73 20 3d 20 28 54 43 4c 5f  nt flags = (TCL_
4ca0: 45 56 41 4c 5f 47 4c 4f 42 41 4c 7c 54 43 4c 5f  EVAL_GLOBAL|TCL_
4cb0: 45 56 41 4c 5f 44 49 52 45 43 54 29 3b 0a 20 20  EVAL_DIRECT);.  
4cc0: 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20    SqliteDb *pDb 
4cd0: 3d 20 28 53 71 6c 69 74 65 44 62 20 2a 29 61 70  = (SqliteDb *)ap
4ce0: 41 72 67 5b 69 5d 3b 0a 20 20 20 20 73 65 74 54  Arg[i];.    setT
4cf0: 65 73 74 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 56  estUnlockNotifyV
4d00: 61 72 73 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c  ars(pDb->interp,
4d10: 20 69 2c 20 6e 41 72 67 29 3b 0a 20 20 20 20 61   i, nArg);.    a
4d20: 73 73 65 72 74 28 20 70 44 62 2d 3e 70 55 6e 6c  ssert( pDb->pUnl
4d30: 6f 63 6b 4e 6f 74 69 66 79 29 3b 0a 20 20 20 20  ockNotify);.    
4d40: 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70 44  Tcl_EvalObjEx(pD
4d50: 62 2d 3e 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e  b->interp, pDb->
4d60: 70 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 2c 20 66  pUnlockNotify, f
4d70: 6c 61 67 73 29 3b 0a 20 20 20 20 54 63 6c 5f 44  lags);.    Tcl_D
4d80: 65 63 72 52 65 66 43 6f 75 6e 74 28 70 44 62 2d  ecrRefCount(pDb-
4d90: 3e 70 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79 29 3b  >pUnlockNotify);
4da0: 0a 20 20 20 20 70 44 62 2d 3e 70 55 6e 6c 6f 63  .    pDb->pUnloc
4db0: 6b 4e 6f 74 69 66 79 20 3d 20 30 3b 0a 20 20 7d  kNotify = 0;.  }
4dc0: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 73 74 61 74 69  .}.#endif..stati
4dd0: 63 20 76 6f 69 64 20 44 62 55 70 64 61 74 65 48  c void DbUpdateH
4de0: 61 6e 64 6c 65 72 28 0a 20 20 76 6f 69 64 20 2a  andler(.  void *
4df0: 70 2c 20 0a 20 20 69 6e 74 20 6f 70 2c 0a 20 20  p, .  int op,.  
4e00: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 2c  const char *zDb,
4e10: 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a   .  const char *
4e20: 7a 54 62 6c 2c 20 0a 20 20 73 71 6c 69 74 65 5f  zTbl, .  sqlite_
4e30: 69 6e 74 36 34 20 72 6f 77 69 64 0a 29 7b 0a 20  int64 rowid.){. 
4e40: 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d   SqliteDb *pDb =
4e50: 20 28 53 71 6c 69 74 65 44 62 20 2a 29 70 3b 0a   (SqliteDb *)p;.
4e60: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 43 6d 64 3b    Tcl_Obj *pCmd;
4e70: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 44 62 2d  ..  assert( pDb-
4e80: 3e 70 55 70 64 61 74 65 48 6f 6f 6b 20 29 3b 0a  >pUpdateHook );.
4e90: 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 53 51    assert( op==SQ
4ea0: 4c 49 54 45 5f 49 4e 53 45 52 54 20 7c 7c 20 6f  LITE_INSERT || o
4eb0: 70 3d 3d 53 51 4c 49 54 45 5f 55 50 44 41 54 45  p==SQLITE_UPDATE
4ec0: 20 7c 7c 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 44   || op==SQLITE_D
4ed0: 45 4c 45 54 45 20 29 3b 0a 0a 20 20 70 43 6d 64  ELETE );..  pCmd
4ee0: 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65   = Tcl_Duplicate
4ef0: 4f 62 6a 28 70 44 62 2d 3e 70 55 70 64 61 74 65  Obj(pDb->pUpdate
4f00: 48 6f 6f 6b 29 3b 0a 20 20 54 63 6c 5f 49 6e 63  Hook);.  Tcl_Inc
4f10: 72 52 65 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b  rRefCount(pCmd);
4f20: 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  .  Tcl_ListObjAp
4f30: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70  pendElement(0, p
4f40: 43 6d 64 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Cmd, Tcl_NewStri
4f50: 6e 67 4f 62 6a 28 0a 20 20 20 20 28 20 28 6f 70  ngObj(.    ( (op
4f60: 3d 3d 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 29  ==SQLITE_INSERT)
4f70: 3f 22 49 4e 53 45 52 54 22 3a 28 6f 70 3d 3d 53  ?"INSERT":(op==S
4f80: 51 4c 49 54 45 5f 55 50 44 41 54 45 29 3f 22 55  QLITE_UPDATE)?"U
4f90: 50 44 41 54 45 22 3a 22 44 45 4c 45 54 45 22 29  PDATE":"DELETE")
4fa0: 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69  , -1));.  Tcl_Li
4fb0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
4fc0: 6e 74 28 30 2c 20 70 43 6d 64 2c 20 54 63 6c 5f  nt(0, pCmd, Tcl_
4fd0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 44 62  NewStringObj(zDb
4fe0: 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69  , -1));.  Tcl_Li
4ff0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
5000: 6e 74 28 30 2c 20 70 43 6d 64 2c 20 54 63 6c 5f  nt(0, pCmd, Tcl_
5010: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 54 62  NewStringObj(zTb
5020: 6c 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c  l, -1));.  Tcl_L
5030: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
5040: 65 6e 74 28 30 2c 20 70 43 6d 64 2c 20 54 63 6c  ent(0, pCmd, Tcl
5050: 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 72  _NewWideIntObj(r
5060: 6f 77 69 64 29 29 3b 0a 20 20 54 63 6c 5f 45 76  owid));.  Tcl_Ev
5070: 61 6c 4f 62 6a 45 78 28 70 44 62 2d 3e 69 6e 74  alObjEx(pDb->int
5080: 65 72 70 2c 20 70 43 6d 64 2c 20 54 43 4c 5f 45  erp, pCmd, TCL_E
5090: 56 41 4c 5f 44 49 52 45 43 54 29 3b 0a 20 20 54  VAL_DIRECT);.  T
50a0: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
50b0: 70 43 6d 64 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  pCmd);.}..static
50c0: 20 76 6f 69 64 20 74 63 6c 43 6f 6c 6c 61 74 65   void tclCollate
50d0: 4e 65 65 64 65 64 28 0a 20 20 76 6f 69 64 20 2a  Needed(.  void *
50e0: 70 43 74 78 2c 0a 20 20 73 71 6c 69 74 65 33 20  pCtx,.  sqlite3 
50f0: 2a 64 62 2c 0a 20 20 69 6e 74 20 65 6e 63 2c 0a  *db,.  int enc,.
5100: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
5110: 61 6d 65 0a 29 7b 0a 20 20 53 71 6c 69 74 65 44  ame.){.  SqliteD
5120: 62 20 2a 70 44 62 20 3d 20 28 53 71 6c 69 74 65  b *pDb = (Sqlite
5130: 44 62 20 2a 29 70 43 74 78 3b 0a 20 20 54 63 6c  Db *)pCtx;.  Tcl
5140: 5f 4f 62 6a 20 2a 70 53 63 72 69 70 74 20 3d 20  _Obj *pScript = 
5150: 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a  Tcl_DuplicateObj
5160: 28 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65  (pDb->pCollateNe
5170: 65 64 65 64 29 3b 0a 20 20 54 63 6c 5f 49 6e 63  eded);.  Tcl_Inc
5180: 72 52 65 66 43 6f 75 6e 74 28 70 53 63 72 69 70  rRefCount(pScrip
5190: 74 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62  t);.  Tcl_ListOb
51a0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30  jAppendElement(0
51b0: 2c 20 70 53 63 72 69 70 74 2c 20 54 63 6c 5f 4e  , pScript, Tcl_N
51c0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 4e 61 6d  ewStringObj(zNam
51d0: 65 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 45  e, -1));.  Tcl_E
51e0: 76 61 6c 4f 62 6a 45 78 28 70 44 62 2d 3e 69 6e  valObjEx(pDb->in
51f0: 74 65 72 70 2c 20 70 53 63 72 69 70 74 2c 20 30  terp, pScript, 0
5200: 29 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66  );.  Tcl_DecrRef
5210: 43 6f 75 6e 74 28 70 53 63 72 69 70 74 29 3b 0a  Count(pScript);.
5220: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
5230: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
5240: 74 6f 20 65 76 61 6c 75 61 74 65 20 61 6e 20 53  to evaluate an S
5250: 51 4c 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e  QL collation fun
5260: 63 74 69 6f 6e 20 69 6d 70 6c 65 6d 65 6e 74 65  ction implemente
5270: 64 0a 2a 2a 20 75 73 69 6e 67 20 54 43 4c 20 73  d.** using TCL s
5280: 63 72 69 70 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  cript..*/.static
5290: 20 69 6e 74 20 74 63 6c 53 71 6c 43 6f 6c 6c 61   int tclSqlColla
52a0: 74 65 28 0a 20 20 76 6f 69 64 20 2a 70 43 74 78  te(.  void *pCtx
52b0: 2c 0a 20 20 69 6e 74 20 6e 41 2c 0a 20 20 63 6f  ,.  int nA,.  co
52c0: 6e 73 74 20 76 6f 69 64 20 2a 7a 41 2c 0a 20 20  nst void *zA,.  
52d0: 69 6e 74 20 6e 42 2c 0a 20 20 63 6f 6e 73 74 20  int nB,.  const 
52e0: 76 6f 69 64 20 2a 7a 42 0a 29 7b 0a 20 20 53 71  void *zB.){.  Sq
52f0: 6c 43 6f 6c 6c 61 74 65 20 2a 70 20 3d 20 28 53  lCollate *p = (S
5300: 71 6c 43 6f 6c 6c 61 74 65 20 2a 29 70 43 74 78  qlCollate *)pCtx
5310: 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 43 6d  ;.  Tcl_Obj *pCm
5320: 64 3b 0a 0a 20 20 70 43 6d 64 20 3d 20 54 63 6c  d;..  pCmd = Tcl
5330: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 2d  _NewStringObj(p-
5340: 3e 7a 53 63 72 69 70 74 2c 20 2d 31 29 3b 0a 20  >zScript, -1);. 
5350: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
5360: 74 28 70 43 6d 64 29 3b 0a 20 20 54 63 6c 5f 4c  t(pCmd);.  Tcl_L
5370: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
5380: 65 6e 74 28 70 2d 3e 69 6e 74 65 72 70 2c 20 70  ent(p->interp, p
5390: 43 6d 64 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Cmd, Tcl_NewStri
53a0: 6e 67 4f 62 6a 28 7a 41 2c 20 6e 41 29 29 3b 0a  ngObj(zA, nA));.
53b0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
53c0: 65 6e 64 45 6c 65 6d 65 6e 74 28 70 2d 3e 69 6e  endElement(p->in
53d0: 74 65 72 70 2c 20 70 43 6d 64 2c 20 54 63 6c 5f  terp, pCmd, Tcl_
53e0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 42 2c  NewStringObj(zB,
53f0: 20 6e 42 29 29 3b 0a 20 20 54 63 6c 5f 45 76 61   nB));.  Tcl_Eva
5400: 6c 4f 62 6a 45 78 28 70 2d 3e 69 6e 74 65 72 70  lObjEx(p->interp
5410: 2c 20 70 43 6d 64 2c 20 54 43 4c 5f 45 56 41 4c  , pCmd, TCL_EVAL
5420: 5f 44 49 52 45 43 54 29 3b 0a 20 20 54 63 6c 5f  _DIRECT);.  Tcl_
5430: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 43 6d  DecrRefCount(pCm
5440: 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 61 74  d);.  return (at
5450: 6f 69 28 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  oi(Tcl_GetString
5460: 52 65 73 75 6c 74 28 70 2d 3e 69 6e 74 65 72 70  Result(p->interp
5470: 29 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  )));.}../*.** Th
5480: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
5490: 6c 6c 65 64 20 74 6f 20 65 76 61 6c 75 61 74 65  lled to evaluate
54a0: 20 61 6e 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e   an SQL function
54b0: 20 69 6d 70 6c 65 6d 65 6e 74 65 64 0a 2a 2a 20   implemented.** 
54c0: 75 73 69 6e 67 20 54 43 4c 20 73 63 72 69 70 74  using TCL script
54d0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
54e0: 20 74 63 6c 53 71 6c 46 75 6e 63 28 73 71 6c 69   tclSqlFunc(sqli
54f0: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e  te3_context *con
5500: 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20  text, int argc, 
5510: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 2a 61  sqlite3_value**a
5520: 72 67 76 29 7b 0a 20 20 53 71 6c 46 75 6e 63 20  rgv){.  SqlFunc 
5530: 2a 70 20 3d 20 73 71 6c 69 74 65 33 5f 75 73 65  *p = sqlite3_use
5540: 72 5f 64 61 74 61 28 63 6f 6e 74 65 78 74 29 3b  r_data(context);
5550: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 43 6d 64  .  Tcl_Obj *pCmd
5560: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ;.  int i;.  int
5570: 20 72 63 3b 0a 0a 20 20 69 66 28 20 61 72 67 63   rc;..  if( argc
5580: 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  ==0 ){.    /* If
5590: 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 61 72   there are no ar
55a0: 67 75 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 66  guments to the f
55b0: 75 6e 63 74 69 6f 6e 2c 20 63 61 6c 6c 20 54 63  unction, call Tc
55c0: 6c 5f 45 76 61 6c 4f 62 6a 45 78 20 6f 6e 20 74  l_EvalObjEx on t
55d0: 68 65 0a 20 20 20 20 2a 2a 20 73 63 72 69 70 74  he.    ** script
55e0: 20 6f 62 6a 65 63 74 20 64 69 72 65 63 74 6c 79   object directly
55f0: 2e 20 20 54 68 69 73 20 61 6c 6c 6f 77 73 20 74  .  This allows t
5600: 68 65 20 54 43 4c 20 63 6f 6d 70 69 6c 65 72 20  he TCL compiler 
5610: 74 6f 20 67 65 6e 65 72 61 74 65 0a 20 20 20 20  to generate.    
5620: 2a 2a 20 62 79 74 65 63 6f 64 65 20 66 6f 72 20  ** bytecode for 
5630: 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6f 6e 20 74  the command on t
5640: 68 65 20 66 69 72 73 74 20 69 6e 76 6f 63 61 74  he first invocat
5650: 69 6f 6e 20 61 6e 64 20 74 68 75 73 20 6d 61 6b  ion and thus mak
5660: 65 0a 20 20 20 20 2a 2a 20 73 75 62 73 65 71 75  e.    ** subsequ
5670: 65 6e 74 20 69 6e 76 6f 63 61 74 69 6f 6e 73 20  ent invocations 
5680: 6d 75 63 68 20 66 61 73 74 65 72 2e 20 2a 2f 0a  much faster. */.
5690: 20 20 20 20 70 43 6d 64 20 3d 20 70 2d 3e 70 53      pCmd = p->pS
56a0: 63 72 69 70 74 3b 0a 20 20 20 20 54 63 6c 5f 49  cript;.    Tcl_I
56b0: 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 43 6d 64  ncrRefCount(pCmd
56c0: 29 3b 0a 20 20 20 20 72 63 20 3d 20 54 63 6c 5f  );.    rc = Tcl_
56d0: 45 76 61 6c 4f 62 6a 45 78 28 70 2d 3e 69 6e 74  EvalObjEx(p->int
56e0: 65 72 70 2c 20 70 43 6d 64 2c 20 30 29 3b 0a 20  erp, pCmd, 0);. 
56f0: 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f     Tcl_DecrRefCo
5700: 75 6e 74 28 70 43 6d 64 29 3b 0a 20 20 7d 65 6c  unt(pCmd);.  }el
5710: 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  se{.    /* If th
5720: 65 72 65 20 61 72 65 20 61 72 67 75 6d 65 6e 74  ere are argument
5730: 73 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f  s to the functio
5740: 6e 2c 20 6d 61 6b 65 20 61 20 73 68 61 6c 6c 6f  n, make a shallo
5750: 77 20 63 6f 70 79 20 6f 66 20 74 68 65 0a 20 20  w copy of the.  
5760: 20 20 2a 2a 20 73 63 72 69 70 74 20 6f 62 6a 65    ** script obje
5770: 63 74 2c 20 6c 61 70 70 65 6e 64 20 74 68 65 20  ct, lappend the 
5780: 61 72 67 75 6d 65 6e 74 73 2c 20 74 68 65 6e 20  arguments, then 
5790: 65 76 61 6c 75 61 74 65 20 74 68 65 20 63 6f 70  evaluate the cop
57a0: 79 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  y..    **.    **
57b0: 20 42 79 20 22 73 68 61 6c 6c 6f 77 22 20 63 6f   By "shallow" co
57c0: 70 79 2c 20 77 65 20 6d 65 61 6e 20 61 20 6f 6e  py, we mean a on
57d0: 6c 79 20 74 68 65 20 6f 75 74 65 72 20 6c 69 73  ly the outer lis
57e0: 74 20 54 63 6c 5f 4f 62 6a 20 69 73 20 64 75 70  t Tcl_Obj is dup
57f0: 6c 69 63 61 74 65 64 2e 0a 20 20 20 20 2a 2a 20  licated..    ** 
5800: 54 68 65 20 6e 65 77 20 54 63 6c 5f 4f 62 6a 20  The new Tcl_Obj 
5810: 63 6f 6e 74 61 69 6e 73 20 70 6f 69 6e 74 65 72  contains pointer
5820: 73 20 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61  s to the origina
5830: 6c 20 6c 69 73 74 20 65 6c 65 6d 65 6e 74 73 2e  l list elements.
5840: 20 0a 20 20 20 20 2a 2a 20 54 68 61 74 20 77 61   .    ** That wa
5850: 79 2c 20 77 68 65 6e 20 54 63 6c 5f 45 76 61 6c  y, when Tcl_Eval
5860: 4f 62 6a 76 28 29 20 69 73 20 72 75 6e 20 61 6e  Objv() is run an
5870: 64 20 73 68 69 6d 6d 65 72 73 20 74 68 65 20 66  d shimmers the f
5880: 69 72 73 74 20 65 6c 65 6d 65 6e 74 0a 20 20 20  irst element.   
5890: 20 2a 2a 20 6f 66 20 74 68 65 20 6c 69 73 74 20   ** of the list 
58a0: 74 6f 20 74 63 6c 43 6d 64 4e 61 6d 65 54 79 70  to tclCmdNameTyp
58b0: 65 2c 20 74 68 61 74 20 61 6c 74 65 72 6e 61 74  e, that alternat
58c0: 65 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  e representation
58d0: 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20   will.    ** be 
58e0: 70 72 65 73 65 72 76 65 64 20 61 6e 64 20 72 65  preserved and re
58f0: 75 73 65 64 20 6f 6e 20 74 68 65 20 6e 65 78 74  used on the next
5900: 20 69 6e 76 6f 63 61 74 69 6f 6e 2e 0a 20 20 20   invocation..   
5910: 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20   */.    Tcl_Obj 
5920: 2a 2a 61 41 72 67 3b 0a 20 20 20 20 69 6e 74 20  **aArg;.    int 
5930: 6e 41 72 67 3b 0a 20 20 20 20 69 66 28 20 54 63  nArg;.    if( Tc
5940: 6c 5f 4c 69 73 74 4f 62 6a 47 65 74 45 6c 65 6d  l_ListObjGetElem
5950: 65 6e 74 73 28 70 2d 3e 69 6e 74 65 72 70 2c 20  ents(p->interp, 
5960: 70 2d 3e 70 53 63 72 69 70 74 2c 20 26 6e 41 72  p->pScript, &nAr
5970: 67 2c 20 26 61 41 72 67 29 20 29 7b 0a 20 20 20  g, &aArg) ){.   
5980: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
5990: 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c  t_error(context,
59a0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65   Tcl_GetStringRe
59b0: 73 75 6c 74 28 70 2d 3e 69 6e 74 65 72 70 29 2c  sult(p->interp),
59c0: 20 2d 31 29 3b 20 0a 20 20 20 20 20 20 72 65 74   -1); .      ret
59d0: 75 72 6e 3b 0a 20 20 20 20 7d 20 20 20 20 20 0a  urn;.    }     .
59e0: 20 20 20 20 70 43 6d 64 20 3d 20 54 63 6c 5f 4e      pCmd = Tcl_N
59f0: 65 77 4c 69 73 74 4f 62 6a 28 6e 41 72 67 2c 20  ewListObj(nArg, 
5a00: 61 41 72 67 29 3b 0a 20 20 20 20 54 63 6c 5f 49  aArg);.    Tcl_I
5a10: 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 43 6d 64  ncrRefCount(pCmd
5a20: 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
5a30: 69 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20  i<argc; i++){.  
5a40: 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75      sqlite3_valu
5a50: 65 20 2a 70 49 6e 20 3d 20 61 72 67 76 5b 69 5d  e *pIn = argv[i]
5a60: 3b 0a 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20  ;.      Tcl_Obj 
5a70: 2a 70 56 61 6c 3b 0a 20 20 20 20 20 20 20 20 20  *pVal;.         
5a80: 20 20 20 0a 20 20 20 20 20 20 2f 2a 20 53 65 74     .      /* Set
5a90: 20 70 56 61 6c 20 74 6f 20 63 6f 6e 74 61 69 6e   pVal to contain
5aa0: 20 74 68 65 20 69 27 74 68 20 63 6f 6c 75 6d 6e   the i'th column
5ab0: 20 6f 66 20 74 68 69 73 20 72 6f 77 2e 20 2a 2f   of this row. */
5ac0: 0a 20 20 20 20 20 20 73 77 69 74 63 68 28 20 73  .      switch( s
5ad0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
5ae0: 65 28 70 49 6e 29 20 29 7b 0a 20 20 20 20 20 20  e(pIn) ){.      
5af0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 42 4c    case SQLITE_BL
5b00: 4f 42 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20  OB: {.          
5b10: 69 6e 74 20 62 79 74 65 73 20 3d 20 73 71 6c 69  int bytes = sqli
5b20: 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28  te3_value_bytes(
5b30: 70 49 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20  pIn);.          
5b40: 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 42 79  pVal = Tcl_NewBy
5b50: 74 65 41 72 72 61 79 4f 62 6a 28 73 71 6c 69 74  teArrayObj(sqlit
5b60: 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 70 49  e3_value_blob(pI
5b70: 6e 29 2c 20 62 79 74 65 73 29 3b 0a 20 20 20 20  n), bytes);.    
5b80: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
5b90: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63       }.        c
5ba0: 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 47  ase SQLITE_INTEG
5bb0: 45 52 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20  ER: {.          
5bc0: 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 76 20 3d  sqlite_int64 v =
5bd0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69   sqlite3_value_i
5be0: 6e 74 36 34 28 70 49 6e 29 3b 0a 20 20 20 20 20  nt64(pIn);.     
5bf0: 20 20 20 20 20 69 66 28 20 76 3e 3d 2d 32 31 34       if( v>=-214
5c00: 37 34 38 33 36 34 37 20 26 26 20 76 3c 3d 32 31  7483647 && v<=21
5c10: 34 37 34 38 33 36 34 37 20 29 7b 0a 20 20 20 20  47483647 ){.    
5c20: 20 20 20 20 20 20 20 20 70 56 61 6c 20 3d 20 54          pVal = T
5c30: 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 28 69 6e  cl_NewIntObj((in
5c40: 74 29 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20  t)v);.          
5c50: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
5c60: 20 20 20 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65     pVal = Tcl_Ne
5c70: 77 57 69 64 65 49 6e 74 4f 62 6a 28 76 29 3b 0a  wWideIntObj(v);.
5c80: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
5c90: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
5ca0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63       }.        c
5cb0: 61 73 65 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54  ase SQLITE_FLOAT
5cc0: 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 64 6f  : {.          do
5cd0: 75 62 6c 65 20 72 20 3d 20 73 71 6c 69 74 65 33  uble r = sqlite3
5ce0: 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65 28 70 49  _value_double(pI
5cf0: 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 56  n);.          pV
5d00: 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 44 6f 75 62  al = Tcl_NewDoub
5d10: 6c 65 4f 62 6a 28 72 29 3b 0a 20 20 20 20 20 20  leObj(r);.      
5d20: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
5d30: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63 61 73     }.        cas
5d40: 65 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 3a 20 7b  e SQLITE_NULL: {
5d50: 0a 20 20 20 20 20 20 20 20 20 20 70 56 61 6c 20  .          pVal 
5d60: 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  = Tcl_NewStringO
5d70: 62 6a 28 70 2d 3e 70 44 62 2d 3e 7a 4e 75 6c 6c  bj(p->pDb->zNull
5d80: 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20  , -1);.         
5d90: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
5da0: 7d 0a 20 20 20 20 20 20 20 20 64 65 66 61 75 6c  }.        defaul
5db0: 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 69  t: {.          i
5dc0: 6e 74 20 62 79 74 65 73 20 3d 20 73 71 6c 69 74  nt bytes = sqlit
5dd0: 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 70  e3_value_bytes(p
5de0: 49 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  In);.          p
5df0: 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72  Val = Tcl_NewStr
5e00: 69 6e 67 4f 62 6a 28 28 63 68 61 72 20 2a 29 73  ingObj((char *)s
5e10: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
5e20: 74 28 70 49 6e 29 2c 20 62 79 74 65 73 29 3b 0a  t(pIn), bytes);.
5e30: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
5e40: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
5e50: 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 54 63   }.      rc = Tc
5e60: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
5e70: 6c 65 6d 65 6e 74 28 70 2d 3e 69 6e 74 65 72 70  lement(p->interp
5e80: 2c 20 70 43 6d 64 2c 20 70 56 61 6c 29 3b 0a 20  , pCmd, pVal);. 
5e90: 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
5ea0: 20 20 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52         Tcl_DecrR
5eb0: 65 66 43 6f 75 6e 74 28 70 43 6d 64 29 3b 0a 20  efCount(pCmd);. 
5ec0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72         sqlite3_r
5ed0: 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74  esult_error(cont
5ee0: 65 78 74 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  ext, Tcl_GetStri
5ef0: 6e 67 52 65 73 75 6c 74 28 70 2d 3e 69 6e 74 65  ngResult(p->inte
5f00: 72 70 29 2c 20 2d 31 29 3b 20 0a 20 20 20 20 20  rp), -1); .     
5f10: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20     return;.     
5f20: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
5f30: 20 21 70 2d 3e 75 73 65 45 76 61 6c 4f 62 6a 76   !p->useEvalObjv
5f40: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 63 6c   ){.      /* Tcl
5f50: 5f 45 76 61 6c 4f 62 6a 45 78 28 29 20 77 69 6c  _EvalObjEx() wil
5f60: 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  l automatically 
5f70: 63 61 6c 6c 20 54 63 6c 5f 45 76 61 6c 4f 62 6a  call Tcl_EvalObj
5f80: 76 28 29 20 69 66 20 70 43 6d 64 0a 20 20 20 20  v() if pCmd.    
5f90: 20 20 2a 2a 20 69 73 20 61 20 6c 69 73 74 20 77    ** is a list w
5fa0: 69 74 68 6f 75 74 20 61 20 73 74 72 69 6e 67 20  ithout a string 
5fb0: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 2e 20  representation. 
5fc0: 20 54 6f 20 70 72 65 76 65 6e 74 20 74 68 69 73   To prevent this
5fd0: 20 66 72 6f 6d 0a 20 20 20 20 20 20 2a 2a 20 68   from.      ** h
5fe0: 61 70 70 65 6e 69 6e 67 2c 20 6d 61 6b 65 20 73  appening, make s
5ff0: 75 72 65 20 70 43 6d 64 20 68 61 73 20 61 20 76  ure pCmd has a v
6000: 61 6c 69 64 20 73 74 72 69 6e 67 20 72 65 70 72  alid string repr
6010: 65 73 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20  esentation */.  
6020: 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
6030: 67 28 70 43 6d 64 29 3b 0a 20 20 20 20 7d 0a 20  g(pCmd);.    }. 
6040: 20 20 20 72 63 20 3d 20 54 63 6c 5f 45 76 61 6c     rc = Tcl_Eval
6050: 4f 62 6a 45 78 28 70 2d 3e 69 6e 74 65 72 70 2c  ObjEx(p->interp,
6060: 20 70 43 6d 64 2c 20 54 43 4c 5f 45 56 41 4c 5f   pCmd, TCL_EVAL_
6070: 44 49 52 45 43 54 29 3b 0a 20 20 20 20 54 63 6c  DIRECT);.    Tcl
6080: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 43  _DecrRefCount(pC
6090: 6d 64 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  md);.  }..  if( 
60a0: 72 63 20 26 26 20 72 63 21 3d 54 43 4c 5f 52 45  rc && rc!=TCL_RE
60b0: 54 55 52 4e 20 29 7b 0a 20 20 20 20 73 71 6c 69  TURN ){.    sqli
60c0: 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72  te3_result_error
60d0: 28 63 6f 6e 74 65 78 74 2c 20 54 63 6c 5f 47 65  (context, Tcl_Ge
60e0: 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28 70 2d  tStringResult(p-
60f0: 3e 69 6e 74 65 72 70 29 2c 20 2d 31 29 3b 20 0a  >interp), -1); .
6100: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 54 63 6c    }else{.    Tcl
6110: 5f 4f 62 6a 20 2a 70 56 61 72 20 3d 20 54 63 6c  _Obj *pVar = Tcl
6120: 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 70 2d  _GetObjResult(p-
6130: 3e 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 69 6e  >interp);.    in
6140: 74 20 6e 3b 0a 20 20 20 20 75 38 20 2a 64 61 74  t n;.    u8 *dat
6150: 61 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  a;.    const cha
6160: 72 20 2a 7a 54 79 70 65 20 3d 20 28 70 56 61 72  r *zType = (pVar
6170: 2d 3e 74 79 70 65 50 74 72 20 3f 20 70 56 61 72  ->typePtr ? pVar
6180: 2d 3e 74 79 70 65 50 74 72 2d 3e 6e 61 6d 65 20  ->typePtr->name 
6190: 3a 20 22 22 29 3b 0a 20 20 20 20 63 68 61 72 20  : "");.    char 
61a0: 63 20 3d 20 7a 54 79 70 65 5b 30 5d 3b 0a 20 20  c = zType[0];.  
61b0: 20 20 69 66 28 20 63 3d 3d 27 62 27 20 26 26 20    if( c=='b' && 
61c0: 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 22 62 79  strcmp(zType,"by
61d0: 74 65 61 72 72 61 79 22 29 3d 3d 30 20 26 26 20  tearray")==0 && 
61e0: 70 56 61 72 2d 3e 62 79 74 65 73 3d 3d 30 20 29  pVar->bytes==0 )
61f0: 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 6c 79 20  {.      /* Only 
6200: 72 65 74 75 72 6e 20 61 20 42 4c 4f 42 20 74 79  return a BLOB ty
6210: 70 65 20 69 66 20 74 68 65 20 54 63 6c 20 76 61  pe if the Tcl va
6220: 72 69 61 62 6c 65 20 69 73 20 61 20 62 79 74 65  riable is a byte
6230: 61 72 72 61 79 20 61 6e 64 0a 20 20 20 20 20 20  array and.      
6240: 2a 2a 20 68 61 73 20 6e 6f 20 73 74 72 69 6e 67  ** has no string
6250: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 2e   representation.
6260: 20 2a 2f 0a 20 20 20 20 20 20 64 61 74 61 20 3d   */.      data =
6270: 20 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61   Tcl_GetByteArra
6280: 79 46 72 6f 6d 4f 62 6a 28 70 56 61 72 2c 20 26  yFromObj(pVar, &
6290: 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  n);.      sqlite
62a0: 33 5f 72 65 73 75 6c 74 5f 62 6c 6f 62 28 63 6f  3_result_blob(co
62b0: 6e 74 65 78 74 2c 20 64 61 74 61 2c 20 6e 2c 20  ntext, data, n, 
62c0: 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
62d0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
62e0: 20 63 3d 3d 27 62 27 20 26 26 20 73 74 72 63 6d   c=='b' && strcm
62f0: 70 28 7a 54 79 70 65 2c 22 62 6f 6f 6c 65 61 6e  p(zType,"boolean
6300: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 54  ")==0 ){.      T
6310: 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
6320: 28 30 2c 20 70 56 61 72 2c 20 26 6e 29 3b 0a 20  (0, pVar, &n);. 
6330: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
6340: 75 6c 74 5f 69 6e 74 28 63 6f 6e 74 65 78 74 2c  ult_int(context,
6350: 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69   n);.    }else i
6360: 66 28 20 63 3d 3d 27 64 27 20 26 26 20 73 74 72  f( c=='d' && str
6370: 63 6d 70 28 7a 54 79 70 65 2c 22 64 6f 75 62 6c  cmp(zType,"doubl
6380: 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  e")==0 ){.      
6390: 64 6f 75 62 6c 65 20 72 3b 0a 20 20 20 20 20 20  double r;.      
63a0: 54 63 6c 5f 47 65 74 44 6f 75 62 6c 65 46 72 6f  Tcl_GetDoubleFro
63b0: 6d 4f 62 6a 28 30 2c 20 70 56 61 72 2c 20 26 72  mObj(0, pVar, &r
63c0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
63d0: 5f 72 65 73 75 6c 74 5f 64 6f 75 62 6c 65 28 63  _result_double(c
63e0: 6f 6e 74 65 78 74 2c 20 72 29 3b 0a 20 20 20 20  ontext, r);.    
63f0: 7d 65 6c 73 65 20 69 66 28 20 28 63 3d 3d 27 77  }else if( (c=='w
6400: 27 20 26 26 20 73 74 72 63 6d 70 28 7a 54 79 70  ' && strcmp(zTyp
6410: 65 2c 22 77 69 64 65 49 6e 74 22 29 3d 3d 30 29  e,"wideInt")==0)
6420: 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 28 63   ||.          (c
6430: 3d 3d 27 69 27 20 26 26 20 73 74 72 63 6d 70 28  =='i' && strcmp(
6440: 7a 54 79 70 65 2c 22 69 6e 74 22 29 3d 3d 30 29  zType,"int")==0)
6450: 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 69   ){.      Tcl_Wi
6460: 64 65 49 6e 74 20 76 3b 0a 20 20 20 20 20 20 54  deInt v;.      T
6470: 63 6c 5f 47 65 74 57 69 64 65 49 6e 74 46 72 6f  cl_GetWideIntFro
6480: 6d 4f 62 6a 28 30 2c 20 70 56 61 72 2c 20 26 76  mObj(0, pVar, &v
6490: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
64a0: 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 63 6f  _result_int64(co
64b0: 6e 74 65 78 74 2c 20 76 29 3b 0a 20 20 20 20 7d  ntext, v);.    }
64c0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 64 61 74 61  else{.      data
64d0: 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61   = (unsigned cha
64e0: 72 20 2a 29 54 63 6c 5f 47 65 74 53 74 72 69 6e  r *)Tcl_GetStrin
64f0: 67 46 72 6f 6d 4f 62 6a 28 70 56 61 72 2c 20 26  gFromObj(pVar, &
6500: 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  n);.      sqlite
6510: 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f  3_result_text(co
6520: 6e 74 65 78 74 2c 20 28 63 68 61 72 20 2a 29 64  ntext, (char *)d
6530: 61 74 61 2c 20 6e 2c 20 53 51 4c 49 54 45 5f 54  ata, n, SQLITE_T
6540: 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 7d  RANSIENT);.    }
6550: 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  .  }.}..#ifndef 
6560: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48  SQLITE_OMIT_AUTH
6570: 4f 52 49 5a 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20  ORIZATION./*.** 
6580: 54 68 69 73 20 69 73 20 74 68 65 20 61 75 74 68  This is the auth
6590: 65 6e 74 69 63 61 74 69 6f 6e 20 66 75 6e 63 74  entication funct
65a0: 69 6f 6e 2e 20 20 49 74 20 61 70 70 65 6e 64 73  ion.  It appends
65b0: 20 74 68 65 20 61 75 74 68 65 6e 74 69 63 61 74   the authenticat
65c0: 69 6f 6e 0a 2a 2a 20 74 79 70 65 20 63 6f 64 65  ion.** type code
65d0: 20 61 6e 64 20 74 68 65 20 74 77 6f 20 61 72 67   and the two arg
65e0: 75 6d 65 6e 74 73 20 74 6f 20 7a 43 6d 64 5b 5d  uments to zCmd[]
65f0: 20 74 68 65 6e 20 69 6e 76 6f 6b 65 73 20 74 68   then invokes th
6600: 65 20 72 65 73 75 6c 74 0a 2a 2a 20 6f 6e 20 74  e result.** on t
6610: 68 65 20 69 6e 74 65 72 70 72 65 74 65 72 2e 20  he interpreter. 
6620: 20 54 68 65 20 72 65 70 6c 79 20 69 73 20 65 78   The reply is ex
6630: 61 6d 69 6e 65 64 20 74 6f 20 64 65 74 65 72 6d  amined to determ
6640: 69 6e 65 20 69 66 20 74 68 65 0a 2a 2a 20 61 75  ine if the.** au
6650: 74 68 65 6e 74 69 63 61 74 69 6f 6e 20 66 61 69  thentication fai
6660: 6c 73 20 6f 72 20 73 75 63 63 65 65 64 73 2e 0a  ls or succeeds..
6670: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 75  */.static int au
6680: 74 68 5f 63 61 6c 6c 62 61 63 6b 28 0a 20 20 76  th_callback(.  v
6690: 6f 69 64 20 2a 70 41 72 67 2c 0a 20 20 69 6e 74  oid *pArg,.  int
66a0: 20 63 6f 64 65 2c 0a 20 20 63 6f 6e 73 74 20 63   code,.  const c
66b0: 68 61 72 20 2a 7a 41 72 67 31 2c 0a 20 20 63 6f  har *zArg1,.  co
66c0: 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67 32 2c  nst char *zArg2,
66d0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
66e0: 41 72 67 33 2c 0a 20 20 63 6f 6e 73 74 20 63 68  Arg3,.  const ch
66f0: 61 72 20 2a 7a 41 72 67 34 0a 29 7b 0a 20 20 63  ar *zArg4.){.  c
6700: 68 61 72 20 2a 7a 43 6f 64 65 3b 0a 20 20 54 63  har *zCode;.  Tc
6710: 6c 5f 44 53 74 72 69 6e 67 20 73 74 72 3b 0a 20  l_DString str;. 
6720: 20 69 6e 74 20 72 63 3b 0a 20 20 63 6f 6e 73 74   int rc;.  const
6730: 20 63 68 61 72 20 2a 7a 52 65 70 6c 79 3b 0a 20   char *zReply;. 
6740: 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d   SqliteDb *pDb =
6750: 20 28 53 71 6c 69 74 65 44 62 2a 29 70 41 72 67   (SqliteDb*)pArg
6760: 3b 0a 20 20 69 66 28 20 70 44 62 2d 3e 64 69 73  ;.  if( pDb->dis
6770: 61 62 6c 65 41 75 74 68 20 29 20 72 65 74 75 72  ableAuth ) retur
6780: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  n SQLITE_OK;..  
6790: 73 77 69 74 63 68 28 20 63 6f 64 65 20 29 7b 0a  switch( code ){.
67a0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
67b0: 43 4f 50 59 20 20 20 20 20 20 20 20 20 20 20 20  COPY            
67c0: 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54    : zCode="SQLIT
67d0: 45 5f 43 4f 50 59 22 3b 20 62 72 65 61 6b 3b 0a  E_COPY"; break;.
67e0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
67f0: 43 52 45 41 54 45 5f 49 4e 44 45 58 20 20 20 20  CREATE_INDEX    
6800: 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54    : zCode="SQLIT
6810: 45 5f 43 52 45 41 54 45 5f 49 4e 44 45 58 22 3b  E_CREATE_INDEX";
6820: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
6830: 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54   SQLITE_CREATE_T
6840: 41 42 4c 45 20 20 20 20 20 20 3a 20 7a 43 6f 64  ABLE      : zCod
6850: 65 3d 22 53 51 4c 49 54 45 5f 43 52 45 41 54 45  e="SQLITE_CREATE
6860: 5f 54 41 42 4c 45 22 3b 20 62 72 65 61 6b 3b 0a  _TABLE"; break;.
6870: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
6880: 43 52 45 41 54 45 5f 54 45 4d 50 5f 49 4e 44 45  CREATE_TEMP_INDE
6890: 58 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54  X : zCode="SQLIT
68a0: 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 49 4e  E_CREATE_TEMP_IN
68b0: 44 45 58 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  DEX"; break;.   
68c0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 52 45   case SQLITE_CRE
68d0: 41 54 45 5f 54 45 4d 50 5f 54 41 42 4c 45 20 3a  ATE_TEMP_TABLE :
68e0: 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43   zCode="SQLITE_C
68f0: 52 45 41 54 45 5f 54 45 4d 50 5f 54 41 42 4c 45  REATE_TEMP_TABLE
6900: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
6910: 73 65 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45  se SQLITE_CREATE
6920: 5f 54 45 4d 50 5f 54 52 49 47 47 45 52 3a 20 7a  _TEMP_TRIGGER: z
6930: 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43 52 45  Code="SQLITE_CRE
6940: 41 54 45 5f 54 45 4d 50 5f 54 52 49 47 47 45 52  ATE_TEMP_TRIGGER
6950: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
6960: 73 65 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45  se SQLITE_CREATE
6970: 5f 54 45 4d 50 5f 56 49 45 57 20 20 3a 20 7a 43  _TEMP_VIEW  : zC
6980: 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43 52 45 41  ode="SQLITE_CREA
6990: 54 45 5f 54 45 4d 50 5f 56 49 45 57 22 3b 20 62  TE_TEMP_VIEW"; b
69a0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
69b0: 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 52 49  QLITE_CREATE_TRI
69c0: 47 47 45 52 20 20 20 20 3a 20 7a 43 6f 64 65 3d  GGER    : zCode=
69d0: 22 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54  "SQLITE_CREATE_T
69e0: 52 49 47 47 45 52 22 3b 20 62 72 65 61 6b 3b 0a  RIGGER"; break;.
69f0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
6a00: 43 52 45 41 54 45 5f 56 49 45 57 20 20 20 20 20  CREATE_VIEW     
6a10: 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54    : zCode="SQLIT
6a20: 45 5f 43 52 45 41 54 45 5f 56 49 45 57 22 3b 20  E_CREATE_VIEW"; 
6a30: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
6a40: 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 20 20 20  SQLITE_DELETE   
6a50: 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65           : zCode
6a60: 3d 22 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 22  ="SQLITE_DELETE"
6a70: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
6a80: 65 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 49 4e  e SQLITE_DROP_IN
6a90: 44 45 58 20 20 20 20 20 20 20 20 3a 20 7a 43 6f  DEX        : zCo
6aa0: 64 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f  de="SQLITE_DROP_
6ab0: 49 4e 44 45 58 22 3b 20 62 72 65 61 6b 3b 0a 20  INDEX"; break;. 
6ac0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44     case SQLITE_D
6ad0: 52 4f 50 5f 54 41 42 4c 45 20 20 20 20 20 20 20  ROP_TABLE       
6ae0: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
6af0: 5f 44 52 4f 50 5f 54 41 42 4c 45 22 3b 20 62 72  _DROP_TABLE"; br
6b00: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
6b10: 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 49  LITE_DROP_TEMP_I
6b20: 4e 44 45 58 20 20 20 3a 20 7a 43 6f 64 65 3d 22  NDEX   : zCode="
6b30: 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50  SQLITE_DROP_TEMP
6b40: 5f 49 4e 44 45 58 22 3b 20 62 72 65 61 6b 3b 0a  _INDEX"; break;.
6b50: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
6b60: 44 52 4f 50 5f 54 45 4d 50 5f 54 41 42 4c 45 20  DROP_TEMP_TABLE 
6b70: 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54    : zCode="SQLIT
6b80: 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 54 41 42 4c  E_DROP_TEMP_TABL
6b90: 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  E"; break;.    c
6ba0: 61 73 65 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f  ase SQLITE_DROP_
6bb0: 54 45 4d 50 5f 54 52 49 47 47 45 52 20 3a 20 7a  TEMP_TRIGGER : z
6bc0: 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f  Code="SQLITE_DRO
6bd0: 50 5f 54 45 4d 50 5f 54 52 49 47 47 45 52 22 3b  P_TEMP_TRIGGER";
6be0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
6bf0: 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d   SQLITE_DROP_TEM
6c00: 50 5f 56 49 45 57 20 20 20 20 3a 20 7a 43 6f 64  P_VIEW    : zCod
6c10: 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54  e="SQLITE_DROP_T
6c20: 45 4d 50 5f 56 49 45 57 22 3b 20 62 72 65 61 6b  EMP_VIEW"; break
6c30: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
6c40: 45 5f 44 52 4f 50 5f 54 52 49 47 47 45 52 20 20  E_DROP_TRIGGER  
6c50: 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c      : zCode="SQL
6c60: 49 54 45 5f 44 52 4f 50 5f 54 52 49 47 47 45 52  ITE_DROP_TRIGGER
6c70: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
6c80: 73 65 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56  se SQLITE_DROP_V
6c90: 49 45 57 20 20 20 20 20 20 20 20 20 3a 20 7a 43  IEW         : zC
6ca0: 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50  ode="SQLITE_DROP
6cb0: 5f 56 49 45 57 22 3b 20 62 72 65 61 6b 3b 0a 20  _VIEW"; break;. 
6cc0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
6cd0: 4e 53 45 52 54 20 20 20 20 20 20 20 20 20 20 20  NSERT           
6ce0: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
6cf0: 5f 49 4e 53 45 52 54 22 3b 20 62 72 65 61 6b 3b  _INSERT"; break;
6d00: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
6d10: 5f 50 52 41 47 4d 41 20 20 20 20 20 20 20 20 20  _PRAGMA         
6d20: 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49     : zCode="SQLI
6d30: 54 45 5f 50 52 41 47 4d 41 22 3b 20 62 72 65 61  TE_PRAGMA"; brea
6d40: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
6d50: 54 45 5f 52 45 41 44 20 20 20 20 20 20 20 20 20  TE_READ         
6d60: 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51       : zCode="SQ
6d70: 4c 49 54 45 5f 52 45 41 44 22 3b 20 62 72 65 61  LITE_READ"; brea
6d80: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
6d90: 54 45 5f 53 45 4c 45 43 54 20 20 20 20 20 20 20  TE_SELECT       
6da0: 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51       : zCode="SQ
6db0: 4c 49 54 45 5f 53 45 4c 45 43 54 22 3b 20 62 72  LITE_SELECT"; br
6dc0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
6dd0: 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e  LITE_TRANSACTION
6de0: 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22         : zCode="
6df0: 53 51 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49  SQLITE_TRANSACTI
6e00: 4f 4e 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  ON"; break;.    
6e10: 63 61 73 65 20 53 51 4c 49 54 45 5f 55 50 44 41  case SQLITE_UPDA
6e20: 54 45 20 20 20 20 20 20 20 20 20 20 20 20 3a 20  TE            : 
6e30: 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 55 50  zCode="SQLITE_UP
6e40: 44 41 54 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20  DATE"; break;.  
6e50: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 54    case SQLITE_AT
6e60: 54 41 43 48 20 20 20 20 20 20 20 20 20 20 20 20  TACH            
6e70: 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f  : zCode="SQLITE_
6e80: 41 54 54 41 43 48 22 3b 20 62 72 65 61 6b 3b 0a  ATTACH"; break;.
6e90: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
6ea0: 44 45 54 41 43 48 20 20 20 20 20 20 20 20 20 20  DETACH          
6eb0: 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54    : zCode="SQLIT
6ec0: 45 5f 44 45 54 41 43 48 22 3b 20 62 72 65 61 6b  E_DETACH"; break
6ed0: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
6ee0: 45 5f 41 4c 54 45 52 5f 54 41 42 4c 45 20 20 20  E_ALTER_TABLE   
6ef0: 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c      : zCode="SQL
6f00: 49 54 45 5f 41 4c 54 45 52 5f 54 41 42 4c 45 22  ITE_ALTER_TABLE"
6f10: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
6f20: 65 20 53 51 4c 49 54 45 5f 52 45 49 4e 44 45 58  e SQLITE_REINDEX
6f30: 20 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f             : zCo
6f40: 64 65 3d 22 53 51 4c 49 54 45 5f 52 45 49 4e 44  de="SQLITE_REIND
6f50: 45 58 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  EX"; break;.    
6f60: 63 61 73 65 20 53 51 4c 49 54 45 5f 41 4e 41 4c  case SQLITE_ANAL
6f70: 59 5a 45 20 20 20 20 20 20 20 20 20 20 20 3a 20  YZE           : 
6f80: 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 41 4e  zCode="SQLITE_AN
6f90: 41 4c 59 5a 45 22 3b 20 62 72 65 61 6b 3b 0a 20  ALYZE"; break;. 
6fa0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
6fb0: 52 45 41 54 45 5f 56 54 41 42 4c 45 20 20 20 20  REATE_VTABLE    
6fc0: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
6fd0: 5f 43 52 45 41 54 45 5f 56 54 41 42 4c 45 22 3b  _CREATE_VTABLE";
6fe0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
6ff0: 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56 54 41   SQLITE_DROP_VTA
7000: 42 4c 45 20 20 20 20 20 20 20 3a 20 7a 43 6f 64  BLE       : zCod
7010: 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56  e="SQLITE_DROP_V
7020: 54 41 42 4c 45 22 3b 20 62 72 65 61 6b 3b 0a 20  TABLE"; break;. 
7030: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
7040: 55 4e 43 54 49 4f 4e 20 20 20 20 20 20 20 20 20  UNCTION         
7050: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
7060: 5f 46 55 4e 43 54 49 4f 4e 22 3b 20 62 72 65 61  _FUNCTION"; brea
7070: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
7080: 54 45 5f 53 41 56 45 50 4f 49 4e 54 20 20 20 20  TE_SAVEPOINT    
7090: 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51       : zCode="SQ
70a0: 4c 49 54 45 5f 53 41 56 45 50 4f 49 4e 54 22 3b  LITE_SAVEPOINT";
70b0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61   break;.    defa
70c0: 75 6c 74 20 20 20 20 20 20 20 20 20 20 20 20 20  ult             
70d0: 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64            : zCod
70e0: 65 3d 22 3f 3f 3f 3f 22 3b 20 62 72 65 61 6b 3b  e="????"; break;
70f0: 0a 20 20 7d 0a 20 20 54 63 6c 5f 44 53 74 72 69  .  }.  Tcl_DStri
7100: 6e 67 49 6e 69 74 28 26 73 74 72 29 3b 0a 20 20  ngInit(&str);.  
7110: 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e  Tcl_DStringAppen
7120: 64 28 26 73 74 72 2c 20 70 44 62 2d 3e 7a 41 75  d(&str, pDb->zAu
7130: 74 68 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 44  th, -1);.  Tcl_D
7140: 53 74 72 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d  StringAppendElem
7150: 65 6e 74 28 26 73 74 72 2c 20 7a 43 6f 64 65 29  ent(&str, zCode)
7160: 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41  ;.  Tcl_DStringA
7170: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 26 73 74  ppendElement(&st
7180: 72 2c 20 7a 41 72 67 31 20 3f 20 7a 41 72 67 31  r, zArg1 ? zArg1
7190: 20 3a 20 22 22 29 3b 0a 20 20 54 63 6c 5f 44 53   : "");.  Tcl_DS
71a0: 74 72 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65  tringAppendEleme
71b0: 6e 74 28 26 73 74 72 2c 20 7a 41 72 67 32 20 3f  nt(&str, zArg2 ?
71c0: 20 7a 41 72 67 32 20 3a 20 22 22 29 3b 0a 20 20   zArg2 : "");.  
71d0: 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e  Tcl_DStringAppen
71e0: 64 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c 20 7a  dElement(&str, z
71f0: 41 72 67 33 20 3f 20 7a 41 72 67 33 20 3a 20 22  Arg3 ? zArg3 : "
7200: 22 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e  ");.  Tcl_DStrin
7210: 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 26  gAppendElement(&
7220: 73 74 72 2c 20 7a 41 72 67 34 20 3f 20 7a 41 72  str, zArg4 ? zAr
7230: 67 34 20 3a 20 22 22 29 3b 0a 20 20 72 63 20 3d  g4 : "");.  rc =
7240: 20 54 63 6c 5f 47 6c 6f 62 61 6c 45 76 61 6c 28   Tcl_GlobalEval(
7250: 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20 54 63 6c  pDb->interp, Tcl
7260: 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 73  _DStringValue(&s
7270: 74 72 29 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72  tr));.  Tcl_DStr
7280: 69 6e 67 46 72 65 65 28 26 73 74 72 29 3b 0a 20  ingFree(&str);. 
7290: 20 7a 52 65 70 6c 79 20 3d 20 72 63 3d 3d 54 43   zReply = rc==TC
72a0: 4c 5f 4f 4b 20 3f 20 54 63 6c 5f 47 65 74 53 74  L_OK ? Tcl_GetSt
72b0: 72 69 6e 67 52 65 73 75 6c 74 28 70 44 62 2d 3e  ringResult(pDb->
72c0: 69 6e 74 65 72 70 29 20 3a 20 22 53 51 4c 49 54  interp) : "SQLIT
72d0: 45 5f 44 45 4e 59 22 3b 0a 20 20 69 66 28 20 73  E_DENY";.  if( s
72e0: 74 72 63 6d 70 28 7a 52 65 70 6c 79 2c 22 53 51  trcmp(zReply,"SQ
72f0: 4c 49 54 45 5f 4f 4b 22 29 3d 3d 30 20 29 7b 0a  LITE_OK")==0 ){.
7300: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
7310: 4f 4b 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  OK;.  }else if( 
7320: 73 74 72 63 6d 70 28 7a 52 65 70 6c 79 2c 22 53  strcmp(zReply,"S
7330: 51 4c 49 54 45 5f 44 45 4e 59 22 29 3d 3d 30 20  QLITE_DENY")==0 
7340: 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
7350: 54 45 5f 44 45 4e 59 3b 0a 20 20 7d 65 6c 73 65  TE_DENY;.  }else
7360: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 52 65 70   if( strcmp(zRep
7370: 6c 79 2c 22 53 51 4c 49 54 45 5f 49 47 4e 4f 52  ly,"SQLITE_IGNOR
7380: 45 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63  E")==0 ){.    rc
7390: 20 3d 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45   = SQLITE_IGNORE
73a0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
73b0: 63 20 3d 20 39 39 39 3b 0a 20 20 7d 0a 20 20 72  c = 999;.  }.  r
73c0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64  eturn rc;.}.#end
73d0: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
73e0: 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 20  T_AUTHORIZATION 
73f0: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  */../*.** This r
7400: 6f 75 74 69 6e 65 20 72 65 61 64 73 20 61 20 6c  outine reads a l
7410: 69 6e 65 20 6f 66 20 74 65 78 74 20 66 72 6f 6d  ine of text from
7420: 20 46 49 4c 45 20 69 6e 2c 20 73 74 6f 72 65 73   FILE in, stores
7430: 0a 2a 2a 20 74 68 65 20 74 65 78 74 20 69 6e 20  .** the text in 
7440: 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20  memory obtained 
7450: 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 20 61 6e  from malloc() an
7460: 64 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e  d returns a poin
7470: 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 74 65  ter.** to the te
7480: 78 74 2e 20 20 4e 55 4c 4c 20 69 73 20 72 65 74  xt.  NULL is ret
7490: 75 72 6e 65 64 20 61 74 20 65 6e 64 20 6f 66 20  urned at end of 
74a0: 66 69 6c 65 2c 20 6f 72 20 69 66 20 6d 61 6c 6c  file, or if mall
74b0: 6f 63 28 29 0a 2a 2a 20 66 61 69 6c 73 2e 0a 2a  oc().** fails..*
74c0: 2a 0a 2a 2a 20 54 68 65 20 69 6e 74 65 72 66 61  *.** The interfa
74d0: 63 65 20 69 73 20 6c 69 6b 65 20 22 72 65 61 64  ce is like "read
74e0: 6c 69 6e 65 22 20 62 75 74 20 6e 6f 20 63 6f 6d  line" but no com
74f0: 6d 61 6e 64 2d 6c 69 6e 65 20 65 64 69 74 69 6e  mand-line editin
7500: 67 0a 2a 2a 20 69 73 20 64 6f 6e 65 2e 0a 2a 2a  g.** is done..**
7510: 0a 2a 2a 20 63 6f 70 69 65 64 20 66 72 6f 6d 20  .** copied from 
7520: 73 68 65 6c 6c 2e 63 20 66 72 6f 6d 20 27 2e 69  shell.c from '.i
7530: 6d 70 6f 72 74 27 20 63 6f 6d 6d 61 6e 64 0a 2a  mport' command.*
7540: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 6c  /.static char *l
7550: 6f 63 61 6c 5f 67 65 74 6c 69 6e 65 28 63 68 61  ocal_getline(cha
7560: 72 20 2a 7a 50 72 6f 6d 70 74 2c 20 46 49 4c 45  r *zPrompt, FILE
7570: 20 2a 69 6e 29 7b 0a 20 20 63 68 61 72 20 2a 7a   *in){.  char *z
7580: 4c 69 6e 65 3b 0a 20 20 69 6e 74 20 6e 4c 69 6e  Line;.  int nLin
7590: 65 3b 0a 20 20 69 6e 74 20 6e 3b 0a 0a 20 20 6e  e;.  int n;..  n
75a0: 4c 69 6e 65 20 3d 20 31 30 30 3b 0a 20 20 7a 4c  Line = 100;.  zL
75b0: 69 6e 65 20 3d 20 6d 61 6c 6c 6f 63 28 20 6e 4c  ine = malloc( nL
75c0: 69 6e 65 20 29 3b 0a 20 20 69 66 28 20 7a 4c 69  ine );.  if( zLi
75d0: 6e 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ne==0 ) return 0
75e0: 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20 20 77 68 69  ;.  n = 0;.  whi
75f0: 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 69 66 28  le( 1 ){.    if(
7600: 20 6e 2b 31 30 30 3e 6e 4c 69 6e 65 20 29 7b 0a   n+100>nLine ){.
7610: 20 20 20 20 20 20 6e 4c 69 6e 65 20 3d 20 6e 4c        nLine = nL
7620: 69 6e 65 2a 32 20 2b 20 31 30 30 3b 0a 20 20 20  ine*2 + 100;.   
7630: 20 20 20 7a 4c 69 6e 65 20 3d 20 72 65 61 6c 6c     zLine = reall
7640: 6f 63 28 7a 4c 69 6e 65 2c 20 6e 4c 69 6e 65 29  oc(zLine, nLine)
7650: 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 4c 69 6e  ;.      if( zLin
7660: 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  e==0 ) return 0;
7670: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 66  .    }.    if( f
7680: 67 65 74 73 28 26 7a 4c 69 6e 65 5b 6e 5d 2c 20  gets(&zLine[n], 
7690: 6e 4c 69 6e 65 20 2d 20 6e 2c 20 69 6e 29 3d 3d  nLine - n, in)==
76a0: 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e  0 ){.      if( n
76b0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66  ==0 ){.        f
76c0: 72 65 65 28 7a 4c 69 6e 65 29 3b 0a 20 20 20 20  ree(zLine);.    
76d0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
76e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 4c 69 6e      }.      zLin
76f0: 65 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  e[n] = 0;.      
7700: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
7710: 20 77 68 69 6c 65 28 20 7a 4c 69 6e 65 5b 6e 5d   while( zLine[n]
7720: 20 29 7b 20 6e 2b 2b 3b 20 7d 0a 20 20 20 20 69   ){ n++; }.    i
7730: 66 28 20 6e 3e 30 20 26 26 20 7a 4c 69 6e 65 5b  f( n>0 && zLine[
7740: 6e 2d 31 5d 3d 3d 27 5c 6e 27 20 29 7b 0a 20 20  n-1]=='\n' ){.  
7750: 20 20 20 20 6e 2d 2d 3b 0a 20 20 20 20 20 20 7a      n--;.      z
7760: 4c 69 6e 65 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20  Line[n] = 0;.   
7770: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
7780: 20 20 7d 0a 20 20 7a 4c 69 6e 65 20 3d 20 72 65    }.  zLine = re
7790: 61 6c 6c 6f 63 28 20 7a 4c 69 6e 65 2c 20 6e 2b  alloc( zLine, n+
77a0: 31 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 4c  1 );.  return zL
77b0: 69 6e 65 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54  ine;.}.../*.** T
77c0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
77d0: 70 61 72 74 20 6f 66 20 74 68 65 20 69 6d 70 6c  part of the impl
77e0: 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  ementation of th
77f0: 65 20 63 6f 6d 6d 61 6e 64 3a 0a 2a 2a 0a 2a 2a  e command:.**.**
7800: 20 20 20 24 64 62 20 74 72 61 6e 73 61 63 74 69     $db transacti
7810: 6f 6e 20 5b 2d 64 65 66 65 72 72 65 64 7c 2d 69  on [-deferred|-i
7820: 6d 6d 65 64 69 61 74 65 7c 2d 65 78 63 6c 75 73  mmediate|-exclus
7830: 69 76 65 5d 20 53 43 52 49 50 54 0a 2a 2a 0a 2a  ive] SCRIPT.**.*
7840: 2a 20 49 74 20 69 73 20 69 6e 76 6f 6b 65 64 20  * It is invoked 
7850: 61 66 74 65 72 20 65 76 61 6c 75 61 74 69 6e 67  after evaluating
7860: 20 74 68 65 20 73 63 72 69 70 74 20 53 43 52 49   the script SCRI
7870: 50 54 20 74 6f 20 63 6f 6d 6d 69 74 20 6f 72 20  PT to commit or 
7880: 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 74 68 65 20  rollback.** the 
7890: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 72 20 73  transaction or s
78a0: 61 76 65 70 6f 69 6e 74 20 6f 70 65 6e 65 64 20  avepoint opened 
78b0: 62 79 20 74 68 65 20 5b 74 72 61 6e 73 61 63 74  by the [transact
78c0: 69 6f 6e 5d 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f  ion] command..*/
78d0: 0a 73 74 61 74 69 63 20 69 6e 74 20 44 62 54 72  .static int DbTr
78e0: 61 6e 73 50 6f 73 74 43 6d 64 28 0a 20 20 43 6c  ansPostCmd(.  Cl
78f0: 69 65 6e 74 44 61 74 61 20 64 61 74 61 5b 5d 2c  ientData data[],
7900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7910: 20 20 20 2f 2a 20 64 61 74 61 5b 30 5d 20 69 73     /* data[0] is
7920: 20 74 68 65 20 53 71 6c 69 74 65 33 44 62 2a 20   the Sqlite3Db* 
7930: 66 6f 72 20 24 64 62 20 2a 2f 0a 20 20 54 63 6c  for $db */.  Tcl
7940: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
7950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7960: 20 20 2f 2a 20 54 63 6c 20 69 6e 74 65 72 70 72    /* Tcl interpr
7970: 65 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65  eter */.  int re
7980: 73 75 6c 74 20 20 20 20 20 20 20 20 20 20 20 20  sult            
7990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
79a0: 2a 20 52 65 73 75 6c 74 20 6f 66 20 65 76 61 6c  * Result of eval
79b0: 75 61 74 69 6e 67 20 53 43 52 49 50 54 20 2a 2f  uating SCRIPT */
79c0: 0a 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  .){.  static con
79d0: 73 74 20 63 68 61 72 20 2a 61 7a 45 6e 64 5b 5d  st char *azEnd[]
79e0: 20 3d 20 7b 0a 20 20 20 20 22 52 45 4c 45 41 53   = {.    "RELEAS
79f0: 45 20 5f 74 63 6c 5f 74 72 61 6e 73 61 63 74 69  E _tcl_transacti
7a00: 6f 6e 22 2c 20 20 20 20 20 20 20 20 2f 2a 20 72  on",        /* r
7a10: 63 3d 3d 54 43 4c 5f 45 52 52 4f 52 2c 20 6e 54  c==TCL_ERROR, nT
7a20: 72 61 6e 73 61 63 74 69 6f 6e 21 3d 30 20 2a 2f  ransaction!=0 */
7a30: 0a 20 20 20 20 22 43 4f 4d 4d 49 54 22 2c 20 20  .    "COMMIT",  
7a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7a50: 20 20 20 20 20 20 20 20 2f 2a 20 72 63 21 3d 54          /* rc!=T
7a60: 43 4c 5f 45 52 52 4f 52 2c 20 6e 54 72 61 6e 73  CL_ERROR, nTrans
7a70: 61 63 74 69 6f 6e 3d 3d 30 20 2a 2f 0a 20 20 20  action==0 */.   
7a80: 20 22 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 5f 74   "ROLLBACK TO _t
7a90: 63 6c 5f 74 72 61 6e 73 61 63 74 69 6f 6e 20 3b  cl_transaction ;
7aa0: 20 52 45 4c 45 41 53 45 20 5f 74 63 6c 5f 74 72   RELEASE _tcl_tr
7ab0: 61 6e 73 61 63 74 69 6f 6e 22 2c 0a 20 20 20 20  ansaction",.    
7ac0: 22 52 4f 4c 4c 42 41 43 4b 22 20 20 20 20 20 20  "ROLLBACK"      
7ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ae0: 20 20 20 2f 2a 20 72 63 3d 3d 54 43 4c 5f 45 52     /* rc==TCL_ER
7af0: 52 4f 52 2c 20 6e 54 72 61 6e 73 61 63 74 69 6f  ROR, nTransactio
7b00: 6e 3d 3d 30 20 2a 2f 0a 20 20 7d 3b 0a 20 20 53  n==0 */.  };.  S
7b10: 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28  qliteDb *pDb = (
7b20: 53 71 6c 69 74 65 44 62 2a 29 64 61 74 61 5b 30  SqliteDb*)data[0
7b30: 5d 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 72 65  ];.  int rc = re
7b40: 73 75 6c 74 3b 0a 20 20 63 6f 6e 73 74 20 63 68  sult;.  const ch
7b50: 61 72 20 2a 7a 45 6e 64 3b 0a 0a 20 20 70 44 62  ar *zEnd;..  pDb
7b60: 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2d 2d  ->nTransaction--
7b70: 3b 0a 20 20 7a 45 6e 64 20 3d 20 61 7a 45 6e 64  ;.  zEnd = azEnd
7b80: 5b 28 72 63 3d 3d 54 43 4c 5f 45 52 52 4f 52 29  [(rc==TCL_ERROR)
7b90: 2a 32 20 2b 20 28 70 44 62 2d 3e 6e 54 72 61 6e  *2 + (pDb->nTran
7ba0: 73 61 63 74 69 6f 6e 3d 3d 30 29 5d 3b 0a 0a 20  saction==0)];.. 
7bb0: 20 70 44 62 2d 3e 64 69 73 61 62 6c 65 41 75 74   pDb->disableAut
7bc0: 68 2b 2b 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  h++;.  if( sqlit
7bd0: 65 33 5f 65 78 65 63 28 70 44 62 2d 3e 64 62 2c  e3_exec(pDb->db,
7be0: 20 7a 45 6e 64 2c 20 30 2c 20 30 2c 20 30 29 20   zEnd, 0, 0, 0) 
7bf0: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73  ){.      /* This
7c00: 20 69 73 20 61 20 74 72 69 63 6b 79 20 73 63 65   is a tricky sce
7c10: 6e 61 72 69 6f 20 74 6f 20 68 61 6e 64 6c 65 2e  nario to handle.
7c20: 20 54 68 65 20 6d 6f 73 74 20 6c 69 6b 65 6c 79   The most likely
7c30: 20 63 61 75 73 65 20 6f 66 20 61 6e 0a 20 20 20   cause of an.   
7c40: 20 20 20 2a 2a 20 65 72 72 6f 72 20 69 73 20 74     ** error is t
7c50: 68 61 74 20 74 68 65 20 65 78 65 63 28 29 20 61  hat the exec() a
7c60: 62 6f 76 65 20 77 61 73 20 61 6e 20 61 74 74 65  bove was an atte
7c70: 6d 70 74 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68  mpt to commit th
7c80: 65 20 0a 20 20 20 20 20 20 2a 2a 20 74 6f 70 2d  e .      ** top-
7c90: 6c 65 76 65 6c 20 74 72 61 6e 73 61 63 74 69 6f  level transactio
7ca0: 6e 20 74 68 61 74 20 72 65 74 75 72 6e 65 64 20  n that returned 
7cb0: 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 4f 72 2c  SQLITE_BUSY. Or,
7cc0: 20 6c 65 73 73 20 6c 69 6b 65 6c 79 2c 0a 20 20   less likely,.  
7cd0: 20 20 20 20 2a 2a 20 74 68 61 74 20 61 6e 20 49      ** that an I
7ce0: 4f 2d 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75  O-error has occu
7cf0: 72 65 64 2e 20 49 6e 20 65 69 74 68 65 72 20 63  red. In either c
7d00: 61 73 65 2c 20 74 68 72 6f 77 20 61 20 54 63 6c  ase, throw a Tcl
7d10: 20 65 78 63 65 70 74 69 6f 6e 0a 20 20 20 20 20   exception.     
7d20: 20 2a 2a 20 61 6e 64 20 74 72 79 20 74 6f 20 72   ** and try to r
7d30: 6f 6c 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e  ollback the tran
7d40: 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a  saction..      *
7d50: 2a 0a 20 20 20 20 20 20 2a 2a 20 42 75 74 20 69  *.      ** But i
7d60: 74 20 63 6f 75 6c 64 20 61 6c 73 6f 20 62 65 20  t could also be 
7d70: 74 68 61 74 20 74 68 65 20 75 73 65 72 20 65 78  that the user ex
7d80: 65 63 75 74 65 64 20 6f 6e 65 20 6f 72 20 6d 6f  ecuted one or mo
7d90: 72 65 20 42 45 47 49 4e 2c 20 0a 20 20 20 20 20  re BEGIN, .     
7da0: 20 2a 2a 20 43 4f 4d 4d 49 54 2c 20 53 41 56 45   ** COMMIT, SAVE
7db0: 50 4f 49 4e 54 2c 20 52 45 4c 45 41 53 45 20 6f  POINT, RELEASE o
7dc0: 72 20 52 4f 4c 4c 42 41 43 4b 20 63 6f 6d 6d 61  r ROLLBACK comma
7dd0: 6e 64 73 20 74 68 61 74 20 61 72 65 20 63 6f 6e  nds that are con
7de0: 66 75 73 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20  fusing.      ** 
7df0: 74 68 69 73 20 6d 65 74 68 6f 64 27 73 20 6c 6f  this method's lo
7e00: 67 69 63 2e 20 4e 6f 74 20 63 6c 65 61 72 20 68  gic. Not clear h
7e10: 6f 77 20 74 68 69 73 20 77 6f 75 6c 64 20 62 65  ow this would be
7e20: 20 62 65 73 74 20 68 61 6e 64 6c 65 64 2e 0a 20   best handled.. 
7e30: 20 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20       */.    if( 
7e40: 72 63 21 3d 54 43 4c 5f 45 52 52 4f 52 20 29 7b  rc!=TCL_ERROR ){
7e50: 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  .      Tcl_Appen
7e60: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
7e70: 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70  sqlite3_errmsg(p
7e80: 44 62 2d 3e 64 62 29 2c 20 30 29 3b 0a 20 20 20  Db->db), 0);.   
7e90: 20 20 20 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f     rc = TCL_ERRO
7ea0: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  R;.    }.    sql
7eb0: 69 74 65 33 5f 65 78 65 63 28 70 44 62 2d 3e 64  ite3_exec(pDb->d
7ec0: 62 2c 20 22 52 4f 4c 4c 42 41 43 4b 22 2c 20 30  b, "ROLLBACK", 0
7ed0: 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 70  , 0, 0);.  }.  p
7ee0: 44 62 2d 3e 64 69 73 61 62 6c 65 41 75 74 68 2d  Db->disableAuth-
7ef0: 2d 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  -;..  return rc;
7f00: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 65 73 73  .}../*.** Unless
7f10: 20 53 51 4c 49 54 45 5f 54 45 53 54 20 69 73 20   SQLITE_TEST is 
7f20: 64 65 66 69 6e 65 64 2c 20 74 68 69 73 20 66 75  defined, this fu
7f30: 6e 63 74 69 6f 6e 20 69 73 20 61 20 73 69 6d 70  nction is a simp
7f40: 6c 65 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e  le wrapper aroun
7f50: 64 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 70 72 65  d.** sqlite3_pre
7f60: 70 61 72 65 5f 76 32 28 29 2e 20 49 66 20 53 51  pare_v2(). If SQ
7f70: 4c 49 54 45 5f 54 45 53 54 20 69 73 20 64 65 66  LITE_TEST is def
7f80: 69 6e 65 64 2c 20 74 68 65 6e 20 69 74 20 75 73  ined, then it us
7f90: 65 73 20 65 69 74 68 65 72 0a 2a 2a 20 73 71 6c  es either.** sql
7fa0: 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28  ite3_prepare_v2(
7fb0: 29 20 6f 72 20 6c 65 67 61 63 79 20 69 6e 74 65  ) or legacy inte
7fc0: 72 66 61 63 65 20 73 71 6c 69 74 65 33 5f 70 72  rface sqlite3_pr
7fd0: 65 70 61 72 65 28 29 2c 20 64 65 70 65 6e 64 69  epare(), dependi
7fe0: 6e 67 0a 2a 2a 20 6f 6e 20 77 68 65 74 68 65 72  ng.** on whether
7ff0: 20 6f 72 20 6e 6f 74 20 74 68 65 20 5b 64 62 5f   or not the [db_
8000: 75 73 65 5f 6c 65 67 61 63 79 5f 70 72 65 70 61  use_legacy_prepa
8010: 72 65 5d 20 63 6f 6d 6d 61 6e 64 20 68 61 73 20  re] command has 
8020: 62 65 65 6e 20 75 73 65 64 20 74 6f 20 0a 2a 2a  been used to .**
8030: 20 63 6f 6e 66 69 67 75 72 65 20 74 68 65 20 63   configure the c
8040: 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  onnection..*/.st
8050: 61 74 69 63 20 69 6e 74 20 64 62 50 72 65 70 61  atic int dbPrepa
8060: 72 65 28 0a 20 20 53 71 6c 69 74 65 44 62 20 2a  re(.  SqliteDb *
8070: 70 44 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  pDb,            
8080: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
8090: 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 6f  e object */.  co
80a0: 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 2c 20  nst char *zSql, 
80b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
80c0: 20 53 51 4c 20 74 6f 20 63 6f 6d 70 69 6c 65 20   SQL to compile 
80d0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  */.  sqlite3_stm
80e0: 74 20 2a 2a 70 70 53 74 6d 74 2c 20 20 20 20 20  t **ppStmt,     
80f0: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 50 72 65       /* OUT: Pre
8100: 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20  pared statement 
8110: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
8120: 2a 2a 70 7a 4f 75 74 20 20 20 20 20 20 20 20 20  **pzOut         
8130: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 50 6f 69       /* OUT: Poi
8140: 6e 74 65 72 20 74 6f 20 6e 65 78 74 20 53 51 4c  nter to next SQL
8150: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 29 7b   statement */.){
8160: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
8170: 45 53 54 0a 20 20 69 66 28 20 70 44 62 2d 3e 62  EST.  if( pDb->b
8180: 4c 65 67 61 63 79 50 72 65 70 61 72 65 20 29 7b  LegacyPrepare ){
8190: 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69  .    return sqli
81a0: 74 65 33 5f 70 72 65 70 61 72 65 28 70 44 62 2d  te3_prepare(pDb-
81b0: 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 70  >db, zSql, -1, p
81c0: 70 53 74 6d 74 2c 20 70 7a 4f 75 74 29 3b 0a 20  pStmt, pzOut);. 
81d0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75   }.#endif.  retu
81e0: 72 6e 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61  rn sqlite3_prepa
81f0: 72 65 5f 76 32 28 70 44 62 2d 3e 64 62 2c 20 7a  re_v2(pDb->db, z
8200: 53 71 6c 2c 20 2d 31 2c 20 70 70 53 74 6d 74 2c  Sql, -1, ppStmt,
8210: 20 70 7a 4f 75 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   pzOut);.}../*.*
8220: 2a 20 53 65 61 72 63 68 20 74 68 65 20 63 61 63  * Search the cac
8230: 68 65 20 66 6f 72 20 61 20 70 72 65 70 61 72 65  he for a prepare
8240: 64 2d 73 74 61 74 65 6d 65 6e 74 20 6f 62 6a 65  d-statement obje
8250: 63 74 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e  ct that implemen
8260: 74 73 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20  ts the.** first 
8270: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 69 6e  SQL statement in
8280: 20 74 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e   the buffer poin
8290: 74 65 64 20 74 6f 20 62 79 20 70 61 72 61 6d 65  ted to by parame
82a0: 74 65 72 20 7a 49 6e 2e 20 49 66 0a 2a 2a 20 6e  ter zIn. If.** n
82b0: 6f 20 73 75 63 68 20 70 72 65 70 61 72 65 64 2d  o such prepared-
82c0: 73 74 61 74 65 6d 65 6e 74 20 63 61 6e 20 62 65  statement can be
82d0: 20 66 6f 75 6e 64 2c 20 61 6c 6c 6f 63 61 74 65   found, allocate
82e0: 20 61 6e 64 20 70 72 65 70 61 72 65 20 61 20 6e   and prepare a n
82f0: 65 77 0a 2a 2a 20 6f 6e 65 2e 20 49 6e 20 65 69  ew.** one. In ei
8300: 74 68 65 72 20 63 61 73 65 2c 20 62 69 6e 64 20  ther case, bind 
8310: 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75  the current valu
8320: 65 73 20 6f 66 20 74 68 65 20 72 65 6c 65 76 61  es of the releva
8330: 6e 74 20 54 63 6c 0a 2a 2a 20 76 61 72 69 61 62  nt Tcl.** variab
8340: 6c 65 73 20 74 6f 20 61 6e 79 20 24 76 61 72 2c  les to any $var,
8350: 20 3a 76 61 72 20 6f 72 20 40 76 61 72 20 76 61   :var or @var va
8360: 72 69 61 62 6c 65 73 20 69 6e 20 74 68 65 20 73  riables in the s
8370: 74 61 74 65 6d 65 6e 74 2e 20 42 65 66 6f 72 65  tatement. Before
8380: 0a 2a 2a 20 72 65 74 75 72 6e 69 6e 67 2c 20 73  .** returning, s
8390: 65 74 20 2a 70 70 50 72 65 53 74 6d 74 20 74 6f  et *ppPreStmt to
83a0: 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 70 72   point to the pr
83b0: 65 70 61 72 65 64 2d 73 74 61 74 65 6d 65 6e 74  epared-statement
83c0: 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 4f   object..**.** O
83d0: 75 74 70 75 74 20 70 61 72 61 6d 65 74 65 72 20  utput parameter 
83e0: 2a 70 7a 4f 75 74 20 69 73 20 73 65 74 20 74 6f  *pzOut is set to
83f0: 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e 65   point to the ne
8400: 78 74 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  xt SQL statement
8410: 20 69 6e 0a 2a 2a 20 62 75 66 66 65 72 20 7a 49   in.** buffer zI
8420: 6e 2c 20 6f 72 20 74 6f 20 74 68 65 20 27 5c 30  n, or to the '\0
8430: 27 20 62 79 74 65 20 61 74 20 74 68 65 20 65 6e  ' byte at the en
8440: 64 20 6f 66 20 7a 49 6e 20 69 66 20 74 68 65 72  d of zIn if ther
8450: 65 20 69 73 20 6e 6f 0a 2a 2a 20 6e 65 78 74 20  e is no.** next 
8460: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a  statement..**.**
8470: 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
8480: 54 43 4c 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  TCL_OK is return
8490: 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 54  ed. Otherwise, T
84a0: 43 4c 5f 45 52 52 4f 52 20 69 73 20 72 65 74 75  CL_ERROR is retu
84b0: 72 6e 65 64 0a 2a 2a 20 61 6e 64 20 61 6e 20 65  rned.** and an e
84c0: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 6c 6f 61  rror message loa
84d0: 64 65 64 20 69 6e 74 6f 20 69 6e 74 65 72 70 72  ded into interpr
84e0: 65 74 65 72 20 70 44 62 2d 3e 69 6e 74 65 72 70  eter pDb->interp
84f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
8500: 64 62 50 72 65 70 61 72 65 41 6e 64 42 69 6e 64  dbPrepareAndBind
8510: 28 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44  (.  SqliteDb *pD
8520: 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
8530: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
8540: 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 68 61 72  object */.  char
8550: 20 63 6f 6e 73 74 20 2a 7a 49 6e 2c 20 20 20 20   const *zIn,    
8560: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
8570: 51 4c 20 74 6f 20 63 6f 6d 70 69 6c 65 20 2a 2f  QL to compile */
8580: 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 2a  .  char const **
8590: 70 7a 4f 75 74 2c 20 20 20 20 20 20 20 20 20 20  pzOut,          
85a0: 20 20 20 2f 2a 20 4f 55 54 3a 20 50 6f 69 6e 74     /* OUT: Point
85b0: 65 72 20 74 6f 20 6e 65 78 74 20 53 51 4c 20 73  er to next SQL s
85c0: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 53 71  tatement */.  Sq
85d0: 6c 50 72 65 70 61 72 65 64 53 74 6d 74 20 2a 2a  lPreparedStmt **
85e0: 70 70 50 72 65 53 74 6d 74 20 20 20 20 20 2f 2a  ppPreStmt     /*
85f0: 20 4f 55 54 3a 20 4f 62 6a 65 63 74 20 75 73 65   OUT: Object use
8600: 64 20 74 6f 20 63 61 63 68 65 20 73 74 61 74 65  d to cache state
8610: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e  ment */.){.  con
8620: 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20  st char *zSql = 
8630: 7a 49 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  zIn;         /* 
8640: 50 6f 69 6e 74 65 72 20 74 6f 20 66 69 72 73 74  Pointer to first
8650: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 69   SQL statement i
8660: 6e 20 7a 49 6e 20 2a 2f 0a 20 20 73 71 6c 69 74  n zIn */.  sqlit
8670: 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 20  e3_stmt *pStmt; 
8680: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72             /* Pr
8690: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
86a0: 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 53 71 6c   object */.  Sql
86b0: 50 72 65 70 61 72 65 64 53 74 6d 74 20 2a 70 50  PreparedStmt *pP
86c0: 72 65 53 74 6d 74 3b 20 20 20 20 20 20 2f 2a 20  reStmt;      /* 
86d0: 50 6f 69 6e 74 65 72 20 74 6f 20 63 61 63 68 65  Pointer to cache
86e0: 64 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  d statement */. 
86f0: 20 69 6e 74 20 6e 53 71 6c 3b 20 20 20 20 20 20   int nSql;      
8700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8710: 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 7a 53   /* Length of zS
8720: 71 6c 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  ql in bytes */. 
8730: 20 69 6e 74 20 6e 56 61 72 3b 20 20 20 20 20 20   int nVar;      
8740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8750: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 76 61   /* Number of va
8760: 72 69 61 62 6c 65 73 20 69 6e 20 73 74 61 74 65  riables in state
8770: 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 50  ment */.  int iP
8780: 61 72 6d 20 3d 20 30 3b 20 20 20 20 20 20 20 20  arm = 0;        
8790: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78            /* Nex
87a0: 74 20 66 72 65 65 20 65 6e 74 72 79 20 69 6e 20  t free entry in 
87b0: 61 70 50 61 72 6d 20 2a 2f 0a 20 20 69 6e 74 20  apParm */.  int 
87c0: 69 3b 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  i;.  Tcl_Interp 
87d0: 2a 69 6e 74 65 72 70 20 3d 20 70 44 62 2d 3e 69  *interp = pDb->i
87e0: 6e 74 65 72 70 3b 0a 0a 20 20 2a 70 70 50 72 65  nterp;..  *ppPre
87f0: 53 74 6d 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20  Stmt = 0;..  /* 
8800: 54 72 69 6d 20 73 70 61 63 65 73 20 66 72 6f 6d  Trim spaces from
8810: 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 7a 53   the start of zS
8820: 71 6c 20 61 6e 64 20 63 61 6c 63 75 6c 61 74 65  ql and calculate
8830: 20 74 68 65 20 72 65 6d 61 69 6e 69 6e 67 20 6c   the remaining l
8840: 65 6e 67 74 68 2e 20 2a 2f 0a 20 20 77 68 69 6c  ength. */.  whil
8850: 65 28 20 69 73 73 70 61 63 65 28 7a 53 71 6c 5b  e( isspace(zSql[
8860: 30 5d 29 20 29 7b 20 7a 53 71 6c 2b 2b 3b 20 7d  0]) ){ zSql++; }
8870: 0a 20 20 6e 53 71 6c 20 3d 20 73 74 72 6c 65 6e  .  nSql = strlen
8880: 33 30 28 7a 53 71 6c 29 3b 0a 0a 20 20 66 6f 72  30(zSql);..  for
8890: 28 70 50 72 65 53 74 6d 74 20 3d 20 70 44 62 2d  (pPreStmt = pDb-
88a0: 3e 73 74 6d 74 4c 69 73 74 3b 20 70 50 72 65 53  >stmtList; pPreS
88b0: 74 6d 74 3b 20 70 50 72 65 53 74 6d 74 3d 70 50  tmt; pPreStmt=pP
88c0: 72 65 53 74 6d 74 2d 3e 70 4e 65 78 74 29 7b 0a  reStmt->pNext){.
88d0: 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 50 72 65      int n = pPre
88e0: 53 74 6d 74 2d 3e 6e 53 71 6c 3b 0a 20 20 20 20  Stmt->nSql;.    
88f0: 69 66 28 20 6e 53 71 6c 3e 3d 6e 20 0a 20 20 20  if( nSql>=n .   
8900: 20 20 20 20 20 26 26 20 6d 65 6d 63 6d 70 28 70       && memcmp(p
8910: 50 72 65 53 74 6d 74 2d 3e 7a 53 71 6c 2c 20 7a  PreStmt->zSql, z
8920: 53 71 6c 2c 20 6e 29 3d 3d 30 0a 20 20 20 20 20  Sql, n)==0.     
8930: 20 20 20 26 26 20 28 7a 53 71 6c 5b 6e 5d 3d 3d     && (zSql[n]==
8940: 30 20 7c 7c 20 7a 53 71 6c 5b 6e 2d 31 5d 3d 3d  0 || zSql[n-1]==
8950: 27 3b 27 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  ';').    ){.    
8960: 20 20 70 53 74 6d 74 20 3d 20 70 50 72 65 53 74    pStmt = pPreSt
8970: 6d 74 2d 3e 70 53 74 6d 74 3b 0a 20 20 20 20 20  mt->pStmt;.     
8980: 20 2a 70 7a 4f 75 74 20 3d 20 26 7a 53 71 6c 5b   *pzOut = &zSql[
8990: 70 50 72 65 53 74 6d 74 2d 3e 6e 53 71 6c 5d 3b  pPreStmt->nSql];
89a0: 0a 0a 20 20 20 20 20 20 2f 2a 20 57 68 65 6e 20  ..      /* When 
89b0: 61 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  a prepared state
89c0: 6d 65 6e 74 20 69 73 20 66 6f 75 6e 64 2c 20 75  ment is found, u
89d0: 6e 6c 69 6e 6b 20 69 74 20 66 72 6f 6d 20 74 68  nlink it from th
89e0: 65 0a 20 20 20 20 20 20 2a 2a 20 63 61 63 68 65  e.      ** cache
89f0: 20 6c 69 73 74 2e 20 20 49 74 20 77 69 6c 6c 20   list.  It will 
8a00: 6c 61 74 65 72 20 62 65 20 61 64 64 65 64 20 62  later be added b
8a10: 61 63 6b 20 74 6f 20 74 68 65 20 62 65 67 69 6e  ack to the begin
8a20: 6e 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 6f 66  ning.      ** of
8a30: 20 74 68 65 20 63 61 63 68 65 20 6c 69 73 74 20   the cache list 
8a40: 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6d 70 6c  in order to impl
8a50: 65 6d 65 6e 74 20 4c 52 55 20 72 65 70 6c 61 63  ement LRU replac
8a60: 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f 0a  ement..      */.
8a70: 20 20 20 20 20 20 69 66 28 20 70 50 72 65 53 74        if( pPreSt
8a80: 6d 74 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20 20  mt->pPrev ){.   
8a90: 20 20 20 20 20 70 50 72 65 53 74 6d 74 2d 3e 70       pPreStmt->p
8aa0: 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 50  Prev->pNext = pP
8ab0: 72 65 53 74 6d 74 2d 3e 70 4e 65 78 74 3b 0a 20  reStmt->pNext;. 
8ac0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
8ad0: 20 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73      pDb->stmtLis
8ae0: 74 20 3d 20 70 50 72 65 53 74 6d 74 2d 3e 70 4e  t = pPreStmt->pN
8af0: 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ext;.      }.   
8b00: 20 20 20 69 66 28 20 70 50 72 65 53 74 6d 74 2d     if( pPreStmt-
8b10: 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20  >pNext ){.      
8b20: 20 20 70 50 72 65 53 74 6d 74 2d 3e 70 4e 65 78    pPreStmt->pNex
8b30: 74 2d 3e 70 50 72 65 76 20 3d 20 70 50 72 65 53  t->pPrev = pPreS
8b40: 74 6d 74 2d 3e 70 50 72 65 76 3b 0a 20 20 20 20  tmt->pPrev;.    
8b50: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
8b60: 20 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74 20 3d   pDb->stmtLast =
8b70: 20 70 50 72 65 53 74 6d 74 2d 3e 70 50 72 65 76   pPreStmt->pPrev
8b80: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
8b90: 70 44 62 2d 3e 6e 53 74 6d 74 2d 2d 3b 0a 20 20  pDb->nStmt--;.  
8ba0: 20 20 20 20 6e 56 61 72 20 3d 20 73 71 6c 69 74      nVar = sqlit
8bb0: 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65  e3_bind_paramete
8bc0: 72 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29 3b 0a  r_count(pStmt);.
8bd0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
8be0: 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 49   }.  }.  .  /* I
8bf0: 66 20 6e 6f 20 70 72 65 70 61 72 65 64 20 73 74  f no prepared st
8c00: 61 74 65 6d 65 6e 74 20 77 61 73 20 66 6f 75 6e  atement was foun
8c10: 64 2e 20 43 6f 6d 70 69 6c 65 20 74 68 65 20 53  d. Compile the S
8c20: 51 4c 20 74 65 78 74 2e 20 41 6c 73 6f 20 61 6c  QL text. Also al
8c30: 6c 6f 63 61 74 65 0a 20 20 2a 2a 20 61 20 6e 65  locate.  ** a ne
8c40: 77 20 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d  w SqlPreparedStm
8c50: 74 20 73 74 72 75 63 74 75 72 65 2e 20 20 2a 2f  t structure.  */
8c60: 0a 20 20 69 66 28 20 70 50 72 65 53 74 6d 74 3d  .  if( pPreStmt=
8c70: 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 42  =0 ){.    int nB
8c80: 79 74 65 3b 0a 0a 20 20 20 20 69 66 28 20 53 51  yte;..    if( SQ
8c90: 4c 49 54 45 5f 4f 4b 21 3d 64 62 50 72 65 70 61  LITE_OK!=dbPrepa
8ca0: 72 65 28 70 44 62 2c 20 7a 53 71 6c 2c 20 26 70  re(pDb, zSql, &p
8cb0: 53 74 6d 74 2c 20 70 7a 4f 75 74 29 20 29 7b 0a  Stmt, pzOut) ){.
8cc0: 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a        Tcl_SetObj
8cd0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
8ce0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
8cf0: 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70  sqlite3_errmsg(p
8d00: 44 62 2d 3e 64 62 29 2c 20 2d 31 29 29 3b 0a 20  Db->db), -1));. 
8d10: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
8d20: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
8d30: 20 69 66 28 20 70 53 74 6d 74 3d 3d 30 20 29 7b   if( pStmt==0 ){
8d40: 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54  .      if( SQLIT
8d50: 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 5f 65 72  E_OK!=sqlite3_er
8d60: 72 63 6f 64 65 28 70 44 62 2d 3e 64 62 29 20 29  rcode(pDb->db) )
8d70: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 20 63  {.        /* A c
8d80: 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 65 72 72 6f  ompile-time erro
8d90: 72 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65  r in the stateme
8da0: 6e 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 54  nt. */.        T
8db0: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
8dc0: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53  interp, Tcl_NewS
8dd0: 74 72 69 6e 67 4f 62 6a 28 73 71 6c 69 74 65 33  tringObj(sqlite3
8de0: 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64 62 29  _errmsg(pDb->db)
8df0: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 20 20 20 20  , -1));.        
8e00: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
8e10: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
8e20: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 74         /* The st
8e30: 61 74 65 6d 65 6e 74 20 77 61 73 20 61 20 6e 6f  atement was a no
8e40: 2d 6f 70 2e 20 20 43 6f 6e 74 69 6e 75 65 20 74  -op.  Continue t
8e50: 6f 20 74 68 65 20 6e 65 78 74 20 73 74 61 74 65  o the next state
8e60: 6d 65 6e 74 0a 20 20 20 20 20 20 20 20 2a 2a 20  ment.        ** 
8e70: 69 6e 20 74 68 65 20 53 51 4c 20 73 74 72 69 6e  in the SQL strin
8e80: 67 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  g..        */.  
8e90: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
8ea0: 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  _OK;.      }.   
8eb0: 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20   }..    assert( 
8ec0: 70 50 72 65 53 74 6d 74 3d 3d 30 20 29 3b 0a 20  pPreStmt==0 );. 
8ed0: 20 20 20 6e 56 61 72 20 3d 20 73 71 6c 69 74 65     nVar = sqlite
8ee0: 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72  3_bind_parameter
8ef0: 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29 3b 0a 20  _count(pStmt);. 
8f00: 20 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f     nByte = sizeo
8f10: 66 28 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d  f(SqlPreparedStm
8f20: 74 29 20 2b 20 6e 56 61 72 2a 73 69 7a 65 6f 66  t) + nVar*sizeof
8f30: 28 54 63 6c 5f 4f 62 6a 20 2a 29 3b 0a 20 20 20  (Tcl_Obj *);.   
8f40: 20 70 50 72 65 53 74 6d 74 20 3d 20 28 53 71 6c   pPreStmt = (Sql
8f50: 50 72 65 70 61 72 65 64 53 74 6d 74 2a 29 54 63  PreparedStmt*)Tc
8f60: 6c 5f 41 6c 6c 6f 63 28 6e 42 79 74 65 29 3b 0a  l_Alloc(nByte);.
8f70: 20 20 20 20 6d 65 6d 73 65 74 28 70 50 72 65 53      memset(pPreS
8f80: 74 6d 74 2c 20 30 2c 20 6e 42 79 74 65 29 3b 0a  tmt, 0, nByte);.
8f90: 0a 20 20 20 20 70 50 72 65 53 74 6d 74 2d 3e 70  .    pPreStmt->p
8fa0: 53 74 6d 74 20 3d 20 70 53 74 6d 74 3b 0a 20 20  Stmt = pStmt;.  
8fb0: 20 20 70 50 72 65 53 74 6d 74 2d 3e 6e 53 71 6c    pPreStmt->nSql
8fc0: 20 3d 20 28 69 6e 74 29 28 2a 70 7a 4f 75 74 20   = (int)(*pzOut 
8fd0: 2d 20 7a 53 71 6c 29 3b 0a 20 20 20 20 70 50 72  - zSql);.    pPr
8fe0: 65 53 74 6d 74 2d 3e 7a 53 71 6c 20 3d 20 73 71  eStmt->zSql = sq
8ff0: 6c 69 74 65 33 5f 73 71 6c 28 70 53 74 6d 74 29  lite3_sql(pStmt)
9000: 3b 0a 20 20 20 20 70 50 72 65 53 74 6d 74 2d 3e  ;.    pPreStmt->
9010: 61 70 50 61 72 6d 20 3d 20 28 54 63 6c 5f 4f 62  apParm = (Tcl_Ob
9020: 6a 20 2a 2a 29 26 70 50 72 65 53 74 6d 74 5b 31  j **)&pPreStmt[1
9030: 5d 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ];.#ifdef SQLITE
9040: 5f 54 45 53 54 0a 20 20 20 20 69 66 28 20 70 50  _TEST.    if( pP
9050: 72 65 53 74 6d 74 2d 3e 7a 53 71 6c 3d 3d 30 20  reStmt->zSql==0 
9060: 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  ){.      char *z
9070: 43 6f 70 79 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63  Copy = Tcl_Alloc
9080: 28 70 50 72 65 53 74 6d 74 2d 3e 6e 53 71 6c 20  (pPreStmt->nSql 
9090: 2b 20 31 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63  + 1);.      memc
90a0: 70 79 28 7a 43 6f 70 79 2c 20 7a 53 71 6c 2c 20  py(zCopy, zSql, 
90b0: 70 50 72 65 53 74 6d 74 2d 3e 6e 53 71 6c 29 3b  pPreStmt->nSql);
90c0: 0a 20 20 20 20 20 20 7a 43 6f 70 79 5b 70 50 72  .      zCopy[pPr
90d0: 65 53 74 6d 74 2d 3e 6e 53 71 6c 5d 20 3d 20 27  eStmt->nSql] = '
90e0: 5c 30 27 3b 0a 20 20 20 20 20 20 70 50 72 65 53  \0';.      pPreS
90f0: 74 6d 74 2d 3e 7a 53 71 6c 20 3d 20 7a 43 6f 70  tmt->zSql = zCop
9100: 79 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  y;.    }.#endif.
9110: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50    }.  assert( pP
9120: 72 65 53 74 6d 74 20 29 3b 0a 20 20 61 73 73 65  reStmt );.  asse
9130: 72 74 28 20 73 74 72 6c 65 6e 33 30 28 70 50 72  rt( strlen30(pPr
9140: 65 53 74 6d 74 2d 3e 7a 53 71 6c 29 3d 3d 70 50  eStmt->zSql)==pP
9150: 72 65 53 74 6d 74 2d 3e 6e 53 71 6c 20 29 3b 0a  reStmt->nSql );.
9160: 20 20 61 73 73 65 72 74 28 20 30 3d 3d 6d 65 6d    assert( 0==mem
9170: 63 6d 70 28 70 50 72 65 53 74 6d 74 2d 3e 7a 53  cmp(pPreStmt->zS
9180: 71 6c 2c 20 7a 53 71 6c 2c 20 70 50 72 65 53 74  ql, zSql, pPreSt
9190: 6d 74 2d 3e 6e 53 71 6c 29 20 29 3b 0a 0a 20 20  mt->nSql) );..  
91a0: 2f 2a 20 42 69 6e 64 20 76 61 6c 75 65 73 20 74  /* Bind values t
91b0: 6f 20 70 61 72 61 6d 65 74 65 72 73 20 74 68 61  o parameters tha
91c0: 74 20 62 65 67 69 6e 20 77 69 74 68 20 24 20 6f  t begin with $ o
91d0: 72 20 3a 20 2a 2f 20 20 0a 20 20 66 6f 72 28 69  r : */  .  for(i
91e0: 3d 31 3b 20 69 3c 3d 6e 56 61 72 3b 20 69 2b 2b  =1; i<=nVar; i++
91f0: 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ){.    const cha
9200: 72 20 2a 7a 56 61 72 20 3d 20 73 71 6c 69 74 65  r *zVar = sqlite
9210: 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72  3_bind_parameter
9220: 5f 6e 61 6d 65 28 70 53 74 6d 74 2c 20 69 29 3b  _name(pStmt, i);
9230: 0a 20 20 20 20 69 66 28 20 7a 56 61 72 21 3d 30  .    if( zVar!=0
9240: 20 26 26 20 28 7a 56 61 72 5b 30 5d 3d 3d 27 24   && (zVar[0]=='$
9250: 27 20 7c 7c 20 7a 56 61 72 5b 30 5d 3d 3d 27 3a  ' || zVar[0]==':
9260: 27 20 7c 7c 20 7a 56 61 72 5b 30 5d 3d 3d 27 40  ' || zVar[0]=='@
9270: 27 29 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  ') ){.      Tcl_
9280: 4f 62 6a 20 2a 70 56 61 72 20 3d 20 54 63 6c 5f  Obj *pVar = Tcl_
9290: 47 65 74 56 61 72 32 45 78 28 69 6e 74 65 72 70  GetVar2Ex(interp
92a0: 2c 20 26 7a 56 61 72 5b 31 5d 2c 20 30 2c 20 30  , &zVar[1], 0, 0
92b0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 56 61  );.      if( pVa
92c0: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  r ){.        int
92d0: 20 6e 3b 0a 20 20 20 20 20 20 20 20 75 38 20 2a   n;.        u8 *
92e0: 64 61 74 61 3b 0a 20 20 20 20 20 20 20 20 63 6f  data;.        co
92f0: 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 20  nst char *zType 
9300: 3d 20 28 70 56 61 72 2d 3e 74 79 70 65 50 74 72  = (pVar->typePtr
9310: 20 3f 20 70 56 61 72 2d 3e 74 79 70 65 50 74 72   ? pVar->typePtr
9320: 2d 3e 6e 61 6d 65 20 3a 20 22 22 29 3b 0a 20 20  ->name : "");.  
9330: 20 20 20 20 20 20 63 68 61 72 20 63 20 3d 20 7a        char c = z
9340: 54 79 70 65 5b 30 5d 3b 0a 20 20 20 20 20 20 20  Type[0];.       
9350: 20 69 66 28 20 7a 56 61 72 5b 30 5d 3d 3d 27 40   if( zVar[0]=='@
9360: 27 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20  ' ||.           
9370: 28 63 3d 3d 27 62 27 20 26 26 20 73 74 72 63 6d  (c=='b' && strcm
9380: 70 28 7a 54 79 70 65 2c 22 62 79 74 65 61 72 72  p(zType,"bytearr
9390: 61 79 22 29 3d 3d 30 20 26 26 20 70 56 61 72 2d  ay")==0 && pVar-
93a0: 3e 62 79 74 65 73 3d 3d 30 29 20 29 7b 0a 20 20  >bytes==0) ){.  
93b0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 61 64 20          /* Load 
93c0: 61 20 42 4c 4f 42 20 74 79 70 65 20 69 66 20 74  a BLOB type if t
93d0: 68 65 20 54 63 6c 20 76 61 72 69 61 62 6c 65 20  he Tcl variable 
93e0: 69 73 20 61 20 62 79 74 65 61 72 72 61 79 20 61  is a bytearray a
93f0: 6e 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  nd.          ** 
9400: 69 74 20 68 61 73 20 6e 6f 20 73 74 72 69 6e 67  it has no string
9410: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
9420: 6f 72 20 74 68 65 20 68 6f 73 74 0a 20 20 20 20  or the host.    
9430: 20 20 20 20 20 20 2a 2a 20 70 61 72 61 6d 65 74        ** paramet
9440: 65 72 20 6e 61 6d 65 20 62 65 67 69 6e 73 20 77  er name begins w
9450: 69 74 68 20 22 40 22 2e 20 2a 2f 0a 20 20 20 20  ith "@". */.    
9460: 20 20 20 20 20 20 64 61 74 61 20 3d 20 54 63 6c        data = Tcl
9470: 5f 47 65 74 42 79 74 65 41 72 72 61 79 46 72 6f  _GetByteArrayFro
9480: 6d 4f 62 6a 28 70 56 61 72 2c 20 26 6e 29 3b 0a  mObj(pVar, &n);.
9490: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
94a0: 33 5f 62 69 6e 64 5f 62 6c 6f 62 28 70 53 74 6d  3_bind_blob(pStm
94b0: 74 2c 20 69 2c 20 64 61 74 61 2c 20 6e 2c 20 53  t, i, data, n, S
94c0: 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20  QLITE_STATIC);. 
94d0: 20 20 20 20 20 20 20 20 20 54 63 6c 5f 49 6e 63           Tcl_Inc
94e0: 72 52 65 66 43 6f 75 6e 74 28 70 56 61 72 29 3b  rRefCount(pVar);
94f0: 0a 20 20 20 20 20 20 20 20 20 20 70 50 72 65 53  .          pPreS
9500: 74 6d 74 2d 3e 61 70 50 61 72 6d 5b 69 50 61 72  tmt->apParm[iPar
9510: 6d 2b 2b 5d 20 3d 20 70 56 61 72 3b 0a 20 20 20  m++] = pVar;.   
9520: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63       }else if( c
9530: 3d 3d 27 62 27 20 26 26 20 73 74 72 63 6d 70 28  =='b' && strcmp(
9540: 7a 54 79 70 65 2c 22 62 6f 6f 6c 65 61 6e 22 29  zType,"boolean")
9550: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
9560: 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
9570: 62 6a 28 69 6e 74 65 72 70 2c 20 70 56 61 72 2c  bj(interp, pVar,
9580: 20 26 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20   &n);.          
9590: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
95a0: 28 70 53 74 6d 74 2c 20 69 2c 20 6e 29 3b 0a 20  (pStmt, i, n);. 
95b0: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
95c0: 20 63 3d 3d 27 64 27 20 26 26 20 73 74 72 63 6d   c=='d' && strcm
95d0: 70 28 7a 54 79 70 65 2c 22 64 6f 75 62 6c 65 22  p(zType,"double"
95e0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
95f0: 20 20 64 6f 75 62 6c 65 20 72 3b 0a 20 20 20 20    double r;.    
9600: 20 20 20 20 20 20 54 63 6c 5f 47 65 74 44 6f 75        Tcl_GetDou
9610: 62 6c 65 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  bleFromObj(inter
9620: 70 2c 20 70 56 61 72 2c 20 26 72 29 3b 0a 20 20  p, pVar, &r);.  
9630: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
9640: 62 69 6e 64 5f 64 6f 75 62 6c 65 28 70 53 74 6d  bind_double(pStm
9650: 74 2c 20 69 2c 20 72 29 3b 0a 20 20 20 20 20 20  t, i, r);.      
9660: 20 20 7d 65 6c 73 65 20 69 66 28 20 28 63 3d 3d    }else if( (c==
9670: 27 77 27 20 26 26 20 73 74 72 63 6d 70 28 7a 54  'w' && strcmp(zT
9680: 79 70 65 2c 22 77 69 64 65 49 6e 74 22 29 3d 3d  ype,"wideInt")==
9690: 30 29 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20  0) ||.          
96a0: 20 20 20 20 28 63 3d 3d 27 69 27 20 26 26 20 73      (c=='i' && s
96b0: 74 72 63 6d 70 28 7a 54 79 70 65 2c 22 69 6e 74  trcmp(zType,"int
96c0: 22 29 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20 20  ")==0) ){.      
96d0: 20 20 20 20 54 63 6c 5f 57 69 64 65 49 6e 74 20      Tcl_WideInt 
96e0: 76 3b 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c  v;.          Tcl
96f0: 5f 47 65 74 57 69 64 65 49 6e 74 46 72 6f 6d 4f  _GetWideIntFromO
9700: 62 6a 28 69 6e 74 65 72 70 2c 20 70 56 61 72 2c  bj(interp, pVar,
9710: 20 26 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20   &v);.          
9720: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
9730: 36 34 28 70 53 74 6d 74 2c 20 69 2c 20 76 29 3b  64(pStmt, i, v);
9740: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
9750: 20 20 20 20 20 20 20 20 20 20 64 61 74 61 20 3d            data =
9760: 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20   (unsigned char 
9770: 2a 29 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  *)Tcl_GetStringF
9780: 72 6f 6d 4f 62 6a 28 70 56 61 72 2c 20 26 6e 29  romObj(pVar, &n)
9790: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
97a0: 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 53  te3_bind_text(pS
97b0: 74 6d 74 2c 20 69 2c 20 28 63 68 61 72 20 2a 29  tmt, i, (char *)
97c0: 64 61 74 61 2c 20 6e 2c 20 53 51 4c 49 54 45 5f  data, n, SQLITE_
97d0: 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 20  STATIC);.       
97e0: 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f     Tcl_IncrRefCo
97f0: 75 6e 74 28 70 56 61 72 29 3b 0a 20 20 20 20 20  unt(pVar);.     
9800: 20 20 20 20 20 70 50 72 65 53 74 6d 74 2d 3e 61       pPreStmt->a
9810: 70 50 61 72 6d 5b 69 50 61 72 6d 2b 2b 5d 20 3d  pParm[iParm++] =
9820: 20 70 56 61 72 3b 0a 20 20 20 20 20 20 20 20 7d   pVar;.        }
9830: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
9840: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69        sqlite3_bi
9850: 6e 64 5f 6e 75 6c 6c 28 70 53 74 6d 74 2c 20 69  nd_null(pStmt, i
9860: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
9870: 0a 20 20 7d 0a 20 20 70 50 72 65 53 74 6d 74 2d  .  }.  pPreStmt-
9880: 3e 6e 50 61 72 6d 20 3d 20 69 50 61 72 6d 3b 0a  >nParm = iParm;.
9890: 20 20 2a 70 70 50 72 65 53 74 6d 74 20 3d 20 70    *ppPreStmt = p
98a0: 50 72 65 53 74 6d 74 3b 0a 0a 20 20 72 65 74 75  PreStmt;..  retu
98b0: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
98c0: 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 73 74  .** Release a st
98d0: 61 74 65 6d 65 6e 74 20 72 65 66 65 72 65 6e 63  atement referenc
98e0: 65 20 6f 62 74 61 69 6e 65 64 20 62 79 20 63 61  e obtained by ca
98f0: 6c 6c 69 6e 67 20 64 62 50 72 65 70 61 72 65 41  lling dbPrepareA
9900: 6e 64 42 69 6e 64 28 29 2e 0a 2a 2a 20 54 68 65  ndBind()..** The
9910: 72 65 20 73 68 6f 75 6c 64 20 62 65 20 65 78 61  re should be exa
9920: 63 74 6c 79 20 6f 6e 65 20 63 61 6c 6c 20 74 6f  ctly one call to
9930: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 66   this function f
9940: 6f 72 20 65 61 63 68 20 63 61 6c 6c 20 74 6f 0a  or each call to.
9950: 2a 2a 20 64 62 50 72 65 70 61 72 65 41 6e 64 42  ** dbPrepareAndB
9960: 69 6e 64 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ind()..**.** If 
9970: 74 68 65 20 64 69 73 63 61 72 64 20 70 61 72 61  the discard para
9980: 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72  meter is non-zer
9990: 6f 2c 20 74 68 65 6e 20 74 68 65 20 73 74 61 74  o, then the stat
99a0: 65 6d 65 6e 74 20 69 73 20 64 65 6c 65 74 65 64  ement is deleted
99b0: 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e  .** immediately.
99c0: 20 4f 74 68 65 72 77 69 73 65 20 69 74 20 69 73   Otherwise it is
99d0: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 4c 52   added to the LR
99e0: 55 20 6c 69 73 74 20 61 6e 64 20 6d 61 79 20 62  U list and may b
99f0: 65 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 62 79  e returned.** by
9a00: 20 61 20 73 75 62 73 65 71 75 65 6e 74 20 63 61   a subsequent ca
9a10: 6c 6c 20 74 6f 20 64 62 50 72 65 70 61 72 65 41  ll to dbPrepareA
9a20: 6e 64 42 69 6e 64 28 29 2e 0a 2a 2f 0a 73 74 61  ndBind()..*/.sta
9a30: 74 69 63 20 76 6f 69 64 20 64 62 52 65 6c 65 61  tic void dbRelea
9a40: 73 65 53 74 6d 74 28 0a 20 20 53 71 6c 69 74 65  seStmt(.  Sqlite
9a50: 44 62 20 2a 70 44 62 2c 20 20 20 20 20 20 20 20  Db *pDb,        
9a60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
9a70: 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a  abase handle */.
9a80: 20 20 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d    SqlPreparedStm
9a90: 74 20 2a 70 50 72 65 53 74 6d 74 2c 20 20 20 20  t *pPreStmt,    
9aa0: 20 20 2f 2a 20 50 72 65 70 61 72 65 64 20 73 74    /* Prepared st
9ab0: 61 74 65 6d 65 6e 74 20 68 61 6e 64 6c 65 20 74  atement handle t
9ac0: 6f 20 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 69  o release */.  i
9ad0: 6e 74 20 64 69 73 63 61 72 64 20 20 20 20 20 20  nt discard      
9ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9af0: 2a 20 54 72 75 65 20 74 6f 20 64 65 6c 65 74 65  * True to delete
9b00: 20 28 6e 6f 74 20 63 61 63 68 65 29 20 74 68 65   (not cache) the
9b10: 20 70 50 72 65 53 74 6d 74 20 2a 2f 0a 29 7b 0a   pPreStmt */.){.
9b20: 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 46    int i;..  /* F
9b30: 72 65 65 20 74 68 65 20 62 6f 75 6e 64 20 73 74  ree the bound st
9b40: 72 69 6e 67 20 61 6e 64 20 62 6c 6f 62 20 70 61  ring and blob pa
9b50: 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20 66 6f  rameters */.  fo
9b60: 72 28 69 3d 30 3b 20 69 3c 70 50 72 65 53 74 6d  r(i=0; i<pPreStm
9b70: 74 2d 3e 6e 50 61 72 6d 3b 20 69 2b 2b 29 7b 0a  t->nParm; i++){.
9b80: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
9b90: 6f 75 6e 74 28 70 50 72 65 53 74 6d 74 2d 3e 61  ount(pPreStmt->a
9ba0: 70 50 61 72 6d 5b 69 5d 29 3b 0a 20 20 7d 0a 20  pParm[i]);.  }. 
9bb0: 20 70 50 72 65 53 74 6d 74 2d 3e 6e 50 61 72 6d   pPreStmt->nParm
9bc0: 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70 44 62   = 0;..  if( pDb
9bd0: 2d 3e 6d 61 78 53 74 6d 74 3c 3d 30 20 7c 7c 20  ->maxStmt<=0 || 
9be0: 64 69 73 63 61 72 64 20 29 7b 0a 20 20 20 20 2f  discard ){.    /
9bf0: 2a 20 49 66 20 74 68 65 20 63 61 63 68 65 20 69  * If the cache i
9c00: 73 20 74 75 72 6e 65 64 20 6f 66 66 2c 20 64 65  s turned off, de
9c10: 61 6c 6c 6f 63 61 74 65 64 20 74 68 65 20 73 74  allocated the st
9c20: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 64  atement */.    d
9c30: 62 46 72 65 65 53 74 6d 74 28 70 50 72 65 53 74  bFreeStmt(pPreSt
9c40: 6d 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  mt);.  }else{.  
9c50: 20 20 2f 2a 20 41 64 64 20 74 68 65 20 70 72 65    /* Add the pre
9c60: 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20  pared statement 
9c70: 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  to the beginning
9c80: 20 6f 66 20 74 68 65 20 63 61 63 68 65 20 6c 69   of the cache li
9c90: 73 74 2e 20 2a 2f 0a 20 20 20 20 70 50 72 65 53  st. */.    pPreS
9ca0: 74 6d 74 2d 3e 70 4e 65 78 74 20 3d 20 70 44 62  tmt->pNext = pDb
9cb0: 2d 3e 73 74 6d 74 4c 69 73 74 3b 0a 20 20 20 20  ->stmtList;.    
9cc0: 70 50 72 65 53 74 6d 74 2d 3e 70 50 72 65 76 20  pPreStmt->pPrev 
9cd0: 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 44 62  = 0;.    if( pDb
9ce0: 2d 3e 73 74 6d 74 4c 69 73 74 20 29 7b 0a 20 20  ->stmtList ){.  
9cf0: 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c 69 73 74     pDb->stmtList
9d00: 2d 3e 70 50 72 65 76 20 3d 20 70 50 72 65 53 74  ->pPrev = pPreSt
9d10: 6d 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 44  mt;.    }.    pD
9d20: 62 2d 3e 73 74 6d 74 4c 69 73 74 20 3d 20 70 50  b->stmtList = pP
9d30: 72 65 53 74 6d 74 3b 0a 20 20 20 20 69 66 28 20  reStmt;.    if( 
9d40: 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74 3d 3d 30  pDb->stmtLast==0
9d50: 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
9d60: 28 20 70 44 62 2d 3e 6e 53 74 6d 74 3d 3d 30 20  ( pDb->nStmt==0 
9d70: 29 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e 73 74  );.      pDb->st
9d80: 6d 74 4c 61 73 74 20 3d 20 70 50 72 65 53 74 6d  mtLast = pPreStm
9d90: 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  t;.    }else{.  
9da0: 20 20 20 20 61 73 73 65 72 74 28 20 70 44 62 2d      assert( pDb-
9db0: 3e 6e 53 74 6d 74 3e 30 20 29 3b 0a 20 20 20 20  >nStmt>0 );.    
9dc0: 7d 0a 20 20 20 20 70 44 62 2d 3e 6e 53 74 6d 74  }.    pDb->nStmt
9dd0: 2b 2b 3b 0a 20 20 20 0a 20 20 20 20 2f 2a 20 49  ++;.   .    /* I
9de0: 66 20 77 65 20 68 61 76 65 20 74 6f 6f 20 6d 61  f we have too ma
9df0: 6e 79 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20  ny statement in 
9e00: 63 61 63 68 65 2c 20 72 65 6d 6f 76 65 20 74 68  cache, remove th
9e10: 65 20 73 75 72 70 6c 75 73 20 66 72 6f 6d 20 0a  e surplus from .
9e20: 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 64 20 6f      ** the end o
9e30: 66 20 74 68 65 20 63 61 63 68 65 20 6c 69 73 74  f the cache list
9e40: 2e 20 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28  .  */.    while(
9e50: 20 70 44 62 2d 3e 6e 53 74 6d 74 3e 70 44 62 2d   pDb->nStmt>pDb-
9e60: 3e 6d 61 78 53 74 6d 74 20 29 7b 0a 20 20 20 20  >maxStmt ){.    
9e70: 20 20 53 71 6c 50 72 65 70 61 72 65 64 53 74 6d    SqlPreparedStm
9e80: 74 20 2a 70 4c 61 73 74 20 3d 20 70 44 62 2d 3e  t *pLast = pDb->
9e90: 73 74 6d 74 4c 61 73 74 3b 0a 20 20 20 20 20 20  stmtLast;.      
9ea0: 70 44 62 2d 3e 73 74 6d 74 4c 61 73 74 20 3d 20  pDb->stmtLast = 
9eb0: 70 4c 61 73 74 2d 3e 70 50 72 65 76 3b 0a 20 20  pLast->pPrev;.  
9ec0: 20 20 20 20 70 44 62 2d 3e 73 74 6d 74 4c 61 73      pDb->stmtLas
9ed0: 74 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20  t->pNext = 0;.  
9ee0: 20 20 20 20 70 44 62 2d 3e 6e 53 74 6d 74 2d 2d      pDb->nStmt--
9ef0: 3b 0a 20 20 20 20 20 20 64 62 46 72 65 65 53 74  ;.      dbFreeSt
9f00: 6d 74 28 70 4c 61 73 74 29 3b 0a 20 20 20 20 7d  mt(pLast);.    }
9f10: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74  .  }.}../*.** St
9f20: 72 75 63 74 75 72 65 20 75 73 65 64 20 77 69 74  ructure used wit
9f30: 68 20 64 62 45 76 61 6c 58 58 58 28 29 20 66 75  h dbEvalXXX() fu
9f40: 6e 63 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20  nctions:.**.**  
9f50: 20 64 62 45 76 61 6c 49 6e 69 74 28 29 0a 2a 2a   dbEvalInit().**
9f60: 20 20 20 64 62 45 76 61 6c 53 74 65 70 28 29 0a     dbEvalStep().
9f70: 2a 2a 20 20 20 64 62 45 76 61 6c 46 69 6e 61 6c  **   dbEvalFinal
9f80: 69 7a 65 28 29 0a 2a 2a 20 20 20 64 62 45 76 61  ize().**   dbEva
9f90: 6c 52 6f 77 49 6e 66 6f 28 29 0a 2a 2a 20 20 20  lRowInfo().**   
9fa0: 64 62 45 76 61 6c 43 6f 6c 75 6d 6e 56 61 6c 75  dbEvalColumnValu
9fb0: 65 28 29 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  e().*/.typedef s
9fc0: 74 72 75 63 74 20 44 62 45 76 61 6c 43 6f 6e 74  truct DbEvalCont
9fd0: 65 78 74 20 44 62 45 76 61 6c 43 6f 6e 74 65 78  ext DbEvalContex
9fe0: 74 3b 0a 73 74 72 75 63 74 20 44 62 45 76 61 6c  t;.struct DbEval
9ff0: 43 6f 6e 74 65 78 74 20 7b 0a 20 20 53 71 6c 69  Context {.  Sqli
a000: 74 65 44 62 20 2a 70 44 62 3b 20 20 20 20 20 20  teDb *pDb;      
a010: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
a020: 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a  atabase handle *
a030: 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 53 71  /.  Tcl_Obj *pSq
a040: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
a050: 20 20 20 20 2f 2a 20 4f 62 6a 65 63 74 20 68 6f      /* Object ho
a060: 6c 64 69 6e 67 20 73 74 72 69 6e 67 20 7a 53 71  lding string zSq
a070: 6c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  l */.  const cha
a080: 72 20 2a 7a 53 71 6c 3b 20 20 20 20 20 20 20 20  r *zSql;        
a090: 20 20 20 20 20 20 20 2f 2a 20 52 65 6d 61 69 6e         /* Remain
a0a0: 69 6e 67 20 53 51 4c 20 74 6f 20 65 78 65 63 75  ing SQL to execu
a0b0: 74 65 20 2a 2f 0a 20 20 53 71 6c 50 72 65 70 61  te */.  SqlPrepa
a0c0: 72 65 64 53 74 6d 74 20 2a 70 50 72 65 53 74 6d  redStmt *pPreStm
a0d0: 74 3b 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65  t;      /* Curre
a0e0: 6e 74 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  nt statement */.
a0f0: 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20    int nCol;     
a100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a110: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
a120: 6f 6c 75 6d 6e 73 20 72 65 74 75 72 6e 65 64 20  olumns returned 
a130: 62 79 20 70 53 74 6d 74 20 2a 2f 0a 20 20 54 63  by pStmt */.  Tc
a140: 6c 5f 4f 62 6a 20 2a 70 41 72 72 61 79 3b 20 20  l_Obj *pArray;  
a150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a160: 20 4e 61 6d 65 20 6f 66 20 61 72 72 61 79 20 76   Name of array v
a170: 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 54 63 6c  ariable */.  Tcl
a180: 5f 4f 62 6a 20 2a 2a 61 70 43 6f 6c 4e 61 6d 65  _Obj **apColName
a190: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
a1a0: 41 72 72 61 79 20 6f 66 20 63 6f 6c 75 6d 6e 20  Array of column 
a1b0: 6e 61 6d 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a  names */.};../*.
a1c0: 2a 2a 20 52 65 6c 65 61 73 65 20 61 6e 79 20 63  ** Release any c
a1d0: 61 63 68 65 20 6f 66 20 63 6f 6c 75 6d 6e 20 6e  ache of column n
a1e0: 61 6d 65 73 20 63 75 72 72 65 6e 74 6c 79 20 68  ames currently h
a1f0: 65 6c 64 20 61 73 20 70 61 72 74 20 6f 66 0a 2a  eld as part of.*
a200: 2a 20 74 68 65 20 44 62 45 76 61 6c 43 6f 6e 74  * the DbEvalCont
a210: 65 78 74 20 73 74 72 75 63 74 75 72 65 20 70 61  ext structure pa
a220: 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73  ssed as the firs
a230: 74 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73  t argument..*/.s
a240: 74 61 74 69 63 20 76 6f 69 64 20 64 62 52 65 6c  tatic void dbRel
a250: 65 61 73 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  easeColumnNames(
a260: 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 20 2a 70  DbEvalContext *p
a270: 29 7b 0a 20 20 69 66 28 20 70 2d 3e 61 70 43 6f  ){.  if( p->apCo
a280: 6c 4e 61 6d 65 20 29 7b 0a 20 20 20 20 69 6e 74  lName ){.    int
a290: 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   i;.    for(i=0;
a2a0: 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29   i<p->nCol; i++)
a2b0: 7b 0a 20 20 20 20 20 20 54 63 6c 5f 44 65 63 72  {.      Tcl_Decr
a2c0: 52 65 66 43 6f 75 6e 74 28 70 2d 3e 61 70 43 6f  RefCount(p->apCo
a2d0: 6c 4e 61 6d 65 5b 69 5d 29 3b 0a 20 20 20 20 7d  lName[i]);.    }
a2e0: 0a 20 20 20 20 54 63 6c 5f 46 72 65 65 28 28 63  .    Tcl_Free((c
a2f0: 68 61 72 20 2a 29 70 2d 3e 61 70 43 6f 6c 4e 61  har *)p->apColNa
a300: 6d 65 29 3b 0a 20 20 20 20 70 2d 3e 61 70 43 6f  me);.    p->apCo
a310: 6c 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  lName = 0;.  }. 
a320: 20 70 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 7d 0a   p->nCol = 0;.}.
a330: 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
a340: 65 20 61 20 44 62 45 76 61 6c 43 6f 6e 74 65 78  e a DbEvalContex
a350: 74 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a  t structure..**.
a360: 2a 2a 20 49 66 20 70 41 72 72 61 79 20 69 73 20  ** If pArray is 
a370: 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 69  not NULL, then i
a380: 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e  t contains the n
a390: 61 6d 65 20 6f 66 20 61 20 54 63 6c 20 61 72 72  ame of a Tcl arr
a3a0: 61 79 0a 2a 2a 20 76 61 72 69 61 62 6c 65 2e 20  ay.** variable. 
a3b0: 54 68 65 20 22 2a 22 20 6d 65 6d 62 65 72 20 6f  The "*" member o
a3c0: 66 20 74 68 69 73 20 61 72 72 61 79 20 69 73 20  f this array is 
a3d0: 73 65 74 20 74 6f 20 61 20 6c 69 73 74 20 63 6f  set to a list co
a3e0: 6e 74 61 69 6e 69 6e 67 0a 2a 2a 20 74 68 65 20  ntaining.** the 
a3f0: 6e 61 6d 65 73 20 6f 66 20 74 68 65 20 63 6f 6c  names of the col
a400: 75 6d 6e 73 20 72 65 74 75 72 6e 65 64 20 62 79  umns returned by
a410: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 61   the statement a
a420: 73 20 70 61 72 74 20 6f 66 20 65 61 63 68 0a 2a  s part of each.*
a430: 2a 20 63 61 6c 6c 20 74 6f 20 64 62 45 76 61 6c  * call to dbEval
a440: 53 74 65 70 28 29 2c 20 69 6e 20 6f 72 64 65 72  Step(), in order
a450: 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69   from left to ri
a460: 67 68 74 2e 20 65 2e 67 2e 20 69 66 20 74 68 65  ght. e.g. if the
a470: 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f 66 20 74 68   names .** of th
a480: 65 20 72 65 74 75 72 6e 65 64 20 63 6f 6c 75 6d  e returned colum
a490: 6e 73 20 61 72 65 20 61 2c 20 62 20 61 6e 64 20  ns are a, b and 
a4a0: 63 2c 20 69 74 20 64 6f 65 73 20 74 68 65 20 65  c, it does the e
a4b0: 71 75 69 76 61 6c 65 6e 74 20 6f 66 20 74 68 65  quivalent of the
a4c0: 20 0a 2a 2a 20 74 63 6c 20 63 6f 6d 6d 61 6e 64   .** tcl command
a4d0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 73 65 74 20  :.**.**     set 
a4e0: 24 7b 70 41 72 72 61 79 7d 28 2a 29 20 7b 61 20  ${pArray}(*) {a 
a4f0: 62 20 63 7d 0a 2a 2f 0a 73 74 61 74 69 63 20 76  b c}.*/.static v
a500: 6f 69 64 20 64 62 45 76 61 6c 49 6e 69 74 28 0a  oid dbEvalInit(.
a510: 20 20 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 20    DbEvalContext 
a520: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
a530: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
a540: 73 74 72 75 63 74 75 72 65 20 74 6f 20 69 6e 69  structure to ini
a550: 74 69 61 6c 69 7a 65 20 2a 2f 0a 20 20 53 71 6c  tialize */.  Sql
a560: 69 74 65 44 62 20 2a 70 44 62 2c 20 20 20 20 20  iteDb *pDb,     
a570: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a580: 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  Database handle 
a590: 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 53  */.  Tcl_Obj *pS
a5a0: 71 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ql,             
a5b0: 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63 74 20 63       /* Object c
a5c0: 6f 6e 74 61 69 6e 69 6e 67 20 53 51 4c 20 73 63  ontaining SQL sc
a5d0: 72 69 70 74 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62  ript */.  Tcl_Ob
a5e0: 6a 20 2a 70 41 72 72 61 79 20 20 20 20 20 20 20  j *pArray       
a5f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
a600: 65 20 6f 66 20 54 63 6c 20 61 72 72 61 79 20 74  e of Tcl array t
a610: 6f 20 73 65 74 20 28 2a 29 20 65 6c 65 6d 65 6e  o set (*) elemen
a620: 74 20 6f 66 20 2a 2f 0a 29 7b 0a 20 20 6d 65 6d  t of */.){.  mem
a630: 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66  set(p, 0, sizeof
a640: 28 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 29 29  (DbEvalContext))
a650: 3b 0a 20 20 70 2d 3e 70 44 62 20 3d 20 70 44 62  ;.  p->pDb = pDb
a660: 3b 0a 20 20 70 2d 3e 7a 53 71 6c 20 3d 20 54 63  ;.  p->zSql = Tc
a670: 6c 5f 47 65 74 53 74 72 69 6e 67 28 70 53 71 6c  l_GetString(pSql
a680: 29 3b 0a 20 20 70 2d 3e 70 53 71 6c 20 3d 20 70  );.  p->pSql = p
a690: 53 71 6c 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52  Sql;.  Tcl_IncrR
a6a0: 65 66 43 6f 75 6e 74 28 70 53 71 6c 29 3b 0a 20  efCount(pSql);. 
a6b0: 20 69 66 28 20 70 41 72 72 61 79 20 29 7b 0a 20   if( pArray ){. 
a6c0: 20 20 20 70 2d 3e 70 41 72 72 61 79 20 3d 20 70     p->pArray = p
a6d0: 41 72 72 61 79 3b 0a 20 20 20 20 54 63 6c 5f 49  Array;.    Tcl_I
a6e0: 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 41 72 72  ncrRefCount(pArr
a6f0: 61 79 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ay);.  }.}../*.*
a700: 2a 20 4f 62 74 61 69 6e 20 69 6e 66 6f 72 6d 61  * Obtain informa
a710: 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 72  tion about the r
a720: 6f 77 20 74 68 61 74 20 74 68 65 20 44 62 45 76  ow that the DbEv
a730: 61 6c 43 6f 6e 74 65 78 74 20 70 61 73 73 65 64  alContext passed
a740: 20 61 73 20 74 68 65 0a 2a 2a 20 66 69 72 73 74   as the.** first
a750: 20 61 72 67 75 6d 65 6e 74 20 63 75 72 72 65 6e   argument curren
a760: 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 2e 0a 2a  tly points to..*
a770: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 62  /.static void db
a780: 45 76 61 6c 52 6f 77 49 6e 66 6f 28 0a 20 20 44  EvalRowInfo(.  D
a790: 62 45 76 61 6c 43 6f 6e 74 65 78 74 20 2a 70 2c  bEvalContext *p,
a7a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a7b0: 2a 20 45 76 61 6c 75 61 74 69 6f 6e 20 63 6f 6e  * Evaluation con
a7c0: 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  text */.  int *p
a7d0: 6e 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20  nCol,           
a7e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
a7f0: 3a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  : Number of colu
a800: 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 54 63  mn names */.  Tc
a810: 6c 5f 4f 62 6a 20 2a 2a 2a 70 61 70 43 6f 6c 4e  l_Obj ***papColN
a820: 61 6d 65 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ame           /*
a830: 20 4f 55 54 3a 20 41 72 72 61 79 20 6f 66 20 63   OUT: Array of c
a840: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 29  olumn names */.)
a850: 7b 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 63  {.  /* Compute c
a860: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20  olumn names */. 
a870: 20 69 66 28 20 30 3d 3d 70 2d 3e 61 70 43 6f 6c   if( 0==p->apCol
a880: 4e 61 6d 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  Name ){.    sqli
a890: 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20  te3_stmt *pStmt 
a8a0: 3d 20 70 2d 3e 70 50 72 65 53 74 6d 74 2d 3e 70  = p->pPreStmt->p
a8b0: 53 74 6d 74 3b 0a 20 20 20 20 69 6e 74 20 69 3b  Stmt;.    int i;
a8c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a8d0: 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61          /* Itera
a8e0: 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a  tor variable */.
a8f0: 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20      int nCol;   
a900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a910: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
a920: 6f 6c 75 6d 6e 73 20 72 65 74 75 72 6e 65 64 20  olumns returned 
a930: 62 79 20 70 53 74 6d 74 20 2a 2f 0a 20 20 20 20  by pStmt */.    
a940: 54 63 6c 5f 4f 62 6a 20 2a 2a 61 70 43 6f 6c 4e  Tcl_Obj **apColN
a950: 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a  ame = 0;      /*
a960: 20 41 72 72 61 79 20 6f 66 20 63 6f 6c 75 6d 6e   Array of column
a970: 20 6e 61 6d 65 73 20 2a 2f 0a 0a 20 20 20 20 70   names */..    p
a980: 2d 3e 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 20 3d 20  ->nCol = nCol = 
a990: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63  sqlite3_column_c
a9a0: 6f 75 6e 74 28 70 53 74 6d 74 29 3b 0a 20 20 20  ount(pStmt);.   
a9b0: 20 69 66 28 20 6e 43 6f 6c 3e 30 20 26 26 20 28   if( nCol>0 && (
a9c0: 70 61 70 43 6f 6c 4e 61 6d 65 20 7c 7c 20 70 2d  papColName || p-
a9d0: 3e 70 41 72 72 61 79 29 20 29 7b 0a 20 20 20 20  >pArray) ){.    
a9e0: 20 20 61 70 43 6f 6c 4e 61 6d 65 20 3d 20 28 54    apColName = (T
a9f0: 63 6c 5f 4f 62 6a 2a 2a 29 54 63 6c 5f 41 6c 6c  cl_Obj**)Tcl_All
aa00: 6f 63 28 20 73 69 7a 65 6f 66 28 54 63 6c 5f 4f  oc( sizeof(Tcl_O
aa10: 62 6a 2a 29 2a 6e 43 6f 6c 20 29 3b 0a 20 20 20  bj*)*nCol );.   
aa20: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
aa30: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
aa40: 20 20 61 70 43 6f 6c 4e 61 6d 65 5b 69 5d 20 3d    apColName[i] =
aa50: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
aa60: 6a 28 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  j(sqlite3_column
aa70: 5f 6e 61 6d 65 28 70 53 74 6d 74 2c 69 29 2c 20  _name(pStmt,i), 
aa80: 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 54 63 6c  -1);.        Tcl
aa90: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 61 70  _IncrRefCount(ap
aaa0: 43 6f 6c 4e 61 6d 65 5b 69 5d 29 3b 0a 20 20 20  ColName[i]);.   
aab0: 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 61 70     }.      p->ap
aac0: 43 6f 6c 4e 61 6d 65 20 3d 20 61 70 43 6f 6c 4e  ColName = apColN
aad0: 61 6d 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ame;.    }..    
aae0: 2f 2a 20 49 66 20 72 65 73 75 6c 74 73 20 61 72  /* If results ar
aaf0: 65 20 62 65 69 6e 67 20 73 74 6f 72 65 64 20 69  e being stored i
ab00: 6e 20 61 6e 20 61 72 72 61 79 20 76 61 72 69 61  n an array varia
ab10: 62 6c 65 2c 20 74 68 65 6e 20 63 72 65 61 74 65  ble, then create
ab20: 0a 20 20 20 20 2a 2a 20 74 68 65 20 61 72 72 61  .    ** the arra
ab30: 79 28 2a 29 20 65 6e 74 72 79 20 66 6f 72 20 74  y(*) entry for t
ab40: 68 61 74 20 61 72 72 61 79 0a 20 20 20 20 2a 2f  hat array.    */
ab50: 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 41 72 72  .    if( p->pArr
ab60: 61 79 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  ay ){.      Tcl_
ab70: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 20 3d  Interp *interp =
ab80: 20 70 2d 3e 70 44 62 2d 3e 69 6e 74 65 72 70 3b   p->pDb->interp;
ab90: 0a 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a  .      Tcl_Obj *
aba0: 70 43 6f 6c 4c 69 73 74 20 3d 20 54 63 6c 5f 4e  pColList = Tcl_N
abb0: 65 77 4f 62 6a 28 29 3b 0a 20 20 20 20 20 20 54  ewObj();.      T
abc0: 63 6c 5f 4f 62 6a 20 2a 70 53 74 61 72 20 3d 20  cl_Obj *pStar = 
abd0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
abe0: 28 22 2a 22 2c 20 2d 31 29 3b 0a 0a 20 20 20 20  ("*", -1);..    
abf0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f    for(i=0; i<nCo
ac00: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; i++){.       
ac10: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
ac20: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
ac30: 2c 20 70 43 6f 6c 4c 69 73 74 2c 20 61 70 43 6f  , pColList, apCo
ac40: 6c 4e 61 6d 65 5b 69 5d 29 3b 0a 20 20 20 20 20  lName[i]);.     
ac50: 20 7d 0a 20 20 20 20 20 20 54 63 6c 5f 49 6e 63   }.      Tcl_Inc
ac60: 72 52 65 66 43 6f 75 6e 74 28 70 53 74 61 72 29  rRefCount(pStar)
ac70: 3b 0a 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 53  ;.      Tcl_ObjS
ac80: 65 74 56 61 72 32 28 69 6e 74 65 72 70 2c 20 70  etVar2(interp, p
ac90: 2d 3e 70 41 72 72 61 79 2c 20 70 53 74 61 72 2c  ->pArray, pStar,
aca0: 20 70 43 6f 6c 4c 69 73 74 2c 20 30 29 3b 0a 20   pColList, 0);. 
acb0: 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66       Tcl_DecrRef
acc0: 43 6f 75 6e 74 28 70 53 74 61 72 29 3b 0a 20 20  Count(pStar);.  
acd0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70    }.  }..  if( p
ace0: 61 70 43 6f 6c 4e 61 6d 65 20 29 7b 0a 20 20 20  apColName ){.   
acf0: 20 2a 70 61 70 43 6f 6c 4e 61 6d 65 20 3d 20 70   *papColName = p
ad00: 2d 3e 61 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20 7d  ->apColName;.  }
ad10: 0a 20 20 69 66 28 20 70 6e 43 6f 6c 20 29 7b 0a  .  if( pnCol ){.
ad20: 20 20 20 20 2a 70 6e 43 6f 6c 20 3d 20 70 2d 3e      *pnCol = p->
ad30: 6e 43 6f 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  nCol;.  }.}../*.
ad40: 2a 2a 20 52 65 74 75 72 6e 20 6f 6e 65 20 6f 66  ** Return one of
ad50: 20 54 43 4c 5f 4f 4b 2c 20 54 43 4c 5f 42 52 45   TCL_OK, TCL_BRE
ad60: 41 4b 20 6f 72 20 54 43 4c 5f 45 52 52 4f 52 2e  AK or TCL_ERROR.
ad70: 20 49 66 20 54 43 4c 5f 45 52 52 4f 52 20 69 73   If TCL_ERROR is
ad80: 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2c 20 74 68  .** returned, th
ad90: 65 6e 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  en an error mess
ada0: 61 67 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e  age is stored in
adb0: 20 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 72   the interpreter
adc0: 20 62 65 66 6f 72 65 0a 2a 2a 20 72 65 74 75 72   before.** retur
add0: 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41 20 72 65  ning..**.** A re
ade0: 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 54 43  turn value of TC
adf0: 4c 5f 4f 4b 20 6d 65 61 6e 73 20 74 68 65 72 65  L_OK means there
ae00: 20 69 73 20 61 20 72 6f 77 20 6f 66 20 64 61 74   is a row of dat
ae10: 61 20 61 76 61 69 6c 61 62 6c 65 2e 20 54 68 65  a available. The
ae20: 0a 2a 2a 20 64 61 74 61 20 6d 61 79 20 62 65 20  .** data may be 
ae30: 61 63 63 65 73 73 65 64 20 75 73 69 6e 67 20 64  accessed using d
ae40: 62 45 76 61 6c 52 6f 77 49 6e 66 6f 28 29 20 61  bEvalRowInfo() a
ae50: 6e 64 20 64 62 45 76 61 6c 43 6f 6c 75 6d 6e 56  nd dbEvalColumnV
ae60: 61 6c 75 65 28 29 2e 20 54 68 69 73 0a 2a 2a 20  alue(). This.** 
ae70: 69 73 20 61 6e 61 6c 6f 67 6f 75 73 20 74 6f 20  is analogous to 
ae80: 61 20 72 65 74 75 72 6e 20 6f 66 20 53 51 4c 49  a return of SQLI
ae90: 54 45 5f 52 4f 57 20 66 72 6f 6d 20 73 71 6c 69  TE_ROW from sqli
aea0: 74 65 33 5f 73 74 65 70 28 29 2e 20 49 66 20 54  te3_step(). If T
aeb0: 43 4c 5f 42 52 45 41 4b 0a 2a 2a 20 69 73 20 72  CL_BREAK.** is r
aec0: 65 74 75 72 6e 65 64 2c 20 74 68 65 6e 20 74 68  eturned, then th
aed0: 65 20 53 51 4c 20 73 63 72 69 70 74 20 68 61 73  e SQL script has
aee0: 20 66 69 6e 69 73 68 65 64 20 65 78 65 63 75 74   finished execut
aef0: 69 6e 67 20 61 6e 64 20 74 68 65 72 65 20 61 72  ing and there ar
af00: 65 0a 2a 2a 20 6e 6f 20 66 75 72 74 68 65 72 20  e.** no further 
af10: 72 6f 77 73 20 61 76 61 69 6c 61 62 6c 65 2e 20  rows available. 
af20: 54 68 69 73 20 69 73 20 73 69 6d 69 6c 61 72 20  This is similar 
af30: 74 6f 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a  to SQLITE_DONE..
af40: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 62  */.static int db
af50: 45 76 61 6c 53 74 65 70 28 44 62 45 76 61 6c 43  EvalStep(DbEvalC
af60: 6f 6e 74 65 78 74 20 2a 70 29 7b 0a 20 20 63 6f  ontext *p){.  co
af70: 6e 73 74 20 63 68 61 72 20 2a 7a 50 72 65 76 53  nst char *zPrevS
af80: 71 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  ql = 0;       /*
af90: 20 50 72 65 76 69 6f 75 73 20 76 61 6c 75 65 20   Previous value 
afa0: 6f 66 20 70 2d 3e 7a 53 71 6c 20 2a 2f 0a 0a 20  of p->zSql */.. 
afb0: 20 77 68 69 6c 65 28 20 70 2d 3e 7a 53 71 6c 5b   while( p->zSql[
afc0: 30 5d 20 7c 7c 20 70 2d 3e 70 50 72 65 53 74 6d  0] || p->pPreStm
afd0: 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b  t ){.    int rc;
afe0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 50 72 65  .    if( p->pPre
aff0: 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Stmt==0 ){.     
b000: 20 7a 50 72 65 76 53 71 6c 20 3d 20 28 70 2d 3e   zPrevSql = (p->
b010: 7a 53 71 6c 3d 3d 7a 50 72 65 76 53 71 6c 20 3f  zSql==zPrevSql ?
b020: 20 30 20 3a 20 70 2d 3e 7a 53 71 6c 29 3b 0a 20   0 : p->zSql);. 
b030: 20 20 20 20 20 72 63 20 3d 20 64 62 50 72 65 70       rc = dbPrep
b040: 61 72 65 41 6e 64 42 69 6e 64 28 70 2d 3e 70 44  areAndBind(p->pD
b050: 62 2c 20 70 2d 3e 7a 53 71 6c 2c 20 26 70 2d 3e  b, p->zSql, &p->
b060: 7a 53 71 6c 2c 20 26 70 2d 3e 70 50 72 65 53 74  zSql, &p->pPreSt
b070: 6d 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  mt);.      if( r
b080: 63 21 3d 54 43 4c 5f 4f 4b 20 29 20 72 65 74 75  c!=TCL_OK ) retu
b090: 72 6e 20 72 63 3b 0a 20 20 20 20 7d 65 6c 73 65  rn rc;.    }else
b0a0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 73 3b  {.      int rcs;
b0b0: 0a 20 20 20 20 20 20 53 71 6c 69 74 65 44 62 20  .      SqliteDb 
b0c0: 2a 70 44 62 20 3d 20 70 2d 3e 70 44 62 3b 0a 20  *pDb = p->pDb;. 
b0d0: 20 20 20 20 20 53 71 6c 50 72 65 70 61 72 65 64       SqlPrepared
b0e0: 53 74 6d 74 20 2a 70 50 72 65 53 74 6d 74 20 3d  Stmt *pPreStmt =
b0f0: 20 70 2d 3e 70 50 72 65 53 74 6d 74 3b 0a 20 20   p->pPreStmt;.  
b100: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74      sqlite3_stmt
b110: 20 2a 70 53 74 6d 74 20 3d 20 70 50 72 65 53 74   *pStmt = pPreSt
b120: 6d 74 2d 3e 70 53 74 6d 74 3b 0a 0a 20 20 20 20  mt->pStmt;..    
b130: 20 20 72 63 73 20 3d 20 73 71 6c 69 74 65 33 5f    rcs = sqlite3_
b140: 73 74 65 70 28 70 53 74 6d 74 29 3b 0a 20 20 20  step(pStmt);.   
b150: 20 20 20 69 66 28 20 72 63 73 3d 3d 53 51 4c 49     if( rcs==SQLI
b160: 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20 20  TE_ROW ){.      
b170: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
b180: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
b190: 66 28 20 70 2d 3e 70 41 72 72 61 79 20 29 7b 0a  f( p->pArray ){.
b1a0: 20 20 20 20 20 20 20 20 64 62 45 76 61 6c 52 6f          dbEvalRo
b1b0: 77 49 6e 66 6f 28 70 2c 20 30 2c 20 30 29 3b 0a  wInfo(p, 0, 0);.
b1c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63        }.      rc
b1d0: 73 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65  s = sqlite3_rese
b1e0: 74 28 70 53 74 6d 74 29 3b 0a 0a 20 20 20 20 20  t(pStmt);..     
b1f0: 20 70 44 62 2d 3e 6e 53 74 65 70 20 3d 20 73 71   pDb->nStep = sq
b200: 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74 61 74 75  lite3_stmt_statu
b210: 73 28 70 53 74 6d 74 2c 53 51 4c 49 54 45 5f 53  s(pStmt,SQLITE_S
b220: 54 4d 54 53 54 41 54 55 53 5f 46 55 4c 4c 53 43  TMTSTATUS_FULLSC
b230: 41 4e 5f 53 54 45 50 2c 31 29 3b 0a 20 20 20 20  AN_STEP,1);.    
b240: 20 20 70 44 62 2d 3e 6e 53 6f 72 74 20 3d 20 73    pDb->nSort = s
b250: 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74 61 74  qlite3_stmt_stat
b260: 75 73 28 70 53 74 6d 74 2c 53 51 4c 49 54 45 5f  us(pStmt,SQLITE_
b270: 53 54 4d 54 53 54 41 54 55 53 5f 53 4f 52 54 2c  STMTSTATUS_SORT,
b280: 31 29 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e 6e  1);.      pDb->n
b290: 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33 5f  Index = sqlite3_
b2a0: 73 74 6d 74 5f 73 74 61 74 75 73 28 70 53 74 6d  stmt_status(pStm
b2b0: 74 2c 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41  t,SQLITE_STMTSTA
b2c0: 54 55 53 5f 41 55 54 4f 49 4e 44 45 58 2c 31 29  TUS_AUTOINDEX,1)
b2d0: 3b 0a 20 20 20 20 20 20 64 62 52 65 6c 65 61 73  ;.      dbReleas
b2e0: 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 29 3b  eColumnNames(p);
b2f0: 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 65 53 74  .      p->pPreSt
b300: 6d 74 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 69  mt = 0;..      i
b310: 66 28 20 72 63 73 21 3d 53 51 4c 49 54 45 5f 4f  f( rcs!=SQLITE_O
b320: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  K ){.        /* 
b330: 49 66 20 61 20 72 75 6e 2d 74 69 6d 65 20 65 72  If a run-time er
b340: 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 70 6f  ror occurs, repo
b350: 72 74 20 74 68 65 20 65 72 72 6f 72 20 61 6e 64  rt the error and
b360: 20 73 74 6f 70 20 72 65 61 64 69 6e 67 0a 20 20   stop reading.  
b370: 20 20 20 20 20 20 2a 2a 20 74 68 65 20 53 51 4c        ** the SQL
b380: 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 64 62  .  */.        db
b390: 52 65 6c 65 61 73 65 53 74 6d 74 28 70 44 62 2c  ReleaseStmt(pDb,
b3a0: 20 70 50 72 65 53 74 6d 74 2c 20 31 29 3b 0a 23   pPreStmt, 1);.#
b3b0: 69 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  if SQLITE_TEST. 
b3c0: 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 44         if( p->pD
b3d0: 62 2d 3e 62 4c 65 67 61 63 79 50 72 65 70 61 72  b->bLegacyPrepar
b3e0: 65 20 26 26 20 72 63 73 3d 3d 53 51 4c 49 54 45  e && rcs==SQLITE
b3f0: 5f 53 43 48 45 4d 41 20 26 26 20 7a 50 72 65 76  _SCHEMA && zPrev
b400: 53 71 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Sql ){.         
b410: 20 2f 2a 20 49 66 20 74 68 65 20 72 75 6e 74 69   /* If the runti
b420: 6d 65 20 65 72 72 6f 72 20 77 61 73 20 61 6e 20  me error was an 
b430: 53 51 4c 49 54 45 5f 53 43 48 45 4d 41 2c 20 61  SQLITE_SCHEMA, a
b440: 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  nd the database.
b450: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 68 61 6e            ** han
b460: 64 6c 65 20 69 73 20 63 6f 6e 66 69 67 75 72 65  dle is configure
b470: 64 20 74 6f 20 75 73 65 20 74 68 65 20 6c 65 67  d to use the leg
b480: 61 63 79 20 73 71 6c 69 74 65 33 5f 70 72 65 70  acy sqlite3_prep
b490: 61 72 65 28 29 20 0a 20 20 20 20 20 20 20 20 20  are() .         
b4a0: 20 2a 2a 20 69 6e 74 65 72 66 61 63 65 2c 20 72   ** interface, r
b4b0: 65 74 72 79 20 70 72 65 70 61 72 65 28 29 2f 73  etry prepare()/s
b4c0: 74 65 70 28 29 20 6f 6e 20 74 68 65 20 73 61 6d  tep() on the sam
b4d0: 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e  e SQL statement.
b4e0: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 54 68  .          ** Th
b4f0: 69 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20  is only happens 
b500: 6f 6e 63 65 2e 20 49 66 20 74 68 65 72 65 20 69  once. If there i
b510: 73 20 61 20 73 65 63 6f 6e 64 20 53 51 4c 49 54  s a second SQLIT
b520: 45 5f 53 43 48 45 4d 41 0a 20 20 20 20 20 20 20  E_SCHEMA.       
b530: 20 20 20 2a 2a 20 65 72 72 6f 72 2c 20 74 68 65     ** error, the
b540: 20 65 72 72 6f 72 20 77 69 6c 6c 20 62 65 20 72   error will be r
b550: 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63  eturned to the c
b560: 61 6c 6c 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  aller. */.      
b570: 20 20 20 20 70 2d 3e 7a 53 71 6c 20 3d 20 7a 50      p->zSql = zP
b580: 72 65 76 53 71 6c 3b 0a 20 20 20 20 20 20 20 20  revSql;.        
b590: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
b5a0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
b5b0: 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52       Tcl_SetObjR
b5c0: 65 73 75 6c 74 28 70 44 62 2d 3e 69 6e 74 65 72  esult(pDb->inter
b5d0: 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  p,.             
b5e0: 20 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f              Tcl_
b5f0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 73 71 6c  NewStringObj(sql
b600: 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d  ite3_errmsg(pDb-
b610: 3e 64 62 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20  >db), -1));.    
b620: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
b630: 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 65 6c 73  RROR;.      }els
b640: 65 7b 0a 20 20 20 20 20 20 20 20 64 62 52 65 6c  e{.        dbRel
b650: 65 61 73 65 53 74 6d 74 28 70 44 62 2c 20 70 50  easeStmt(pDb, pP
b660: 72 65 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20  reStmt, 0);.    
b670: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
b680: 20 2f 2a 20 46 69 6e 69 73 68 65 64 20 2a 2f 0a   /* Finished */.
b690: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 42 52 45    return TCL_BRE
b6a0: 41 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65  AK;.}../*.** Fre
b6b0: 65 20 61 6c 6c 20 72 65 73 6f 75 72 63 65 73 20  e all resources 
b6c0: 63 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 20 62  currently held b
b6d0: 79 20 74 68 65 20 44 62 45 76 61 6c 43 6f 6e 74  y the DbEvalCont
b6e0: 65 78 74 20 73 74 72 75 63 74 75 72 65 20 70 61  ext structure pa
b6f0: 73 73 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 66  ssed.** as the f
b700: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 54  irst argument. T
b710: 68 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20 65  here should be e
b720: 78 61 63 74 6c 79 20 6f 6e 65 20 63 61 6c 6c 20  xactly one call 
b730: 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
b740: 0a 2a 2a 20 66 6f 72 20 65 61 63 68 20 63 61 6c  .** for each cal
b750: 6c 20 74 6f 20 64 62 45 76 61 6c 49 6e 69 74 28  l to dbEvalInit(
b760: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  )..*/.static voi
b770: 64 20 64 62 45 76 61 6c 46 69 6e 61 6c 69 7a 65  d dbEvalFinalize
b780: 28 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 20 2a  (DbEvalContext *
b790: 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72  p){.  if( p->pPr
b7a0: 65 53 74 6d 74 20 29 7b 0a 20 20 20 20 73 71 6c  eStmt ){.    sql
b7b0: 69 74 65 33 5f 72 65 73 65 74 28 70 2d 3e 70 50  ite3_reset(p->pP
b7c0: 72 65 53 74 6d 74 2d 3e 70 53 74 6d 74 29 3b 0a  reStmt->pStmt);.
b7d0: 20 20 20 20 64 62 52 65 6c 65 61 73 65 53 74 6d      dbReleaseStm
b7e0: 74 28 70 2d 3e 70 44 62 2c 20 70 2d 3e 70 50 72  t(p->pDb, p->pPr
b7f0: 65 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 70  eStmt, 0);.    p
b800: 2d 3e 70 50 72 65 53 74 6d 74 20 3d 20 30 3b 0a  ->pPreStmt = 0;.
b810: 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 41 72    }.  if( p->pAr
b820: 72 61 79 20 29 7b 0a 20 20 20 20 54 63 6c 5f 44  ray ){.    Tcl_D
b830: 65 63 72 52 65 66 43 6f 75 6e 74 28 70 2d 3e 70  ecrRefCount(p->p
b840: 41 72 72 61 79 29 3b 0a 20 20 20 20 70 2d 3e 70  Array);.    p->p
b850: 41 72 72 61 79 20 3d 20 30 3b 0a 20 20 7d 0a 20  Array = 0;.  }. 
b860: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
b870: 74 28 70 2d 3e 70 53 71 6c 29 3b 0a 20 20 64 62  t(p->pSql);.  db
b880: 52 65 6c 65 61 73 65 43 6f 6c 75 6d 6e 4e 61 6d  ReleaseColumnNam
b890: 65 73 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  es(p);.}../*.** 
b8a0: 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
b8b0: 20 74 6f 20 61 20 54 63 6c 5f 4f 62 6a 20 73 74   to a Tcl_Obj st
b8c0: 72 75 63 74 75 72 65 20 77 69 74 68 20 72 65 66  ructure with ref
b8d0: 2d 63 6f 75 6e 74 20 30 20 74 68 61 74 20 63 6f  -count 0 that co
b8e0: 6e 74 61 69 6e 73 0a 2a 2a 20 74 68 65 20 76 61  ntains.** the va
b8f0: 6c 75 65 20 66 6f 72 20 74 68 65 20 69 43 6f 6c  lue for the iCol
b900: 27 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  'th column of th
b910: 65 20 72 6f 77 20 63 75 72 72 65 6e 74 6c 79 20  e row currently 
b920: 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 0a 2a 2a  pointed to by.**
b930: 20 74 68 65 20 44 62 45 76 61 6c 43 6f 6e 74 65   the DbEvalConte
b940: 78 74 20 73 74 72 75 63 74 75 72 65 20 70 61 73  xt structure pas
b950: 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74  sed as the first
b960: 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74   argument..*/.st
b970: 61 74 69 63 20 54 63 6c 5f 4f 62 6a 20 2a 64 62  atic Tcl_Obj *db
b980: 45 76 61 6c 43 6f 6c 75 6d 6e 56 61 6c 75 65 28  EvalColumnValue(
b990: 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 20 2a 70  DbEvalContext *p
b9a0: 2c 20 69 6e 74 20 69 43 6f 6c 29 7b 0a 20 20 73  , int iCol){.  s
b9b0: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
b9c0: 6d 74 20 3d 20 70 2d 3e 70 50 72 65 53 74 6d 74  mt = p->pPreStmt
b9d0: 2d 3e 70 53 74 6d 74 3b 0a 20 20 73 77 69 74 63  ->pStmt;.  switc
b9e0: 68 28 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  h( sqlite3_colum
b9f0: 6e 5f 74 79 70 65 28 70 53 74 6d 74 2c 20 69 43  n_type(pStmt, iC
ba00: 6f 6c 29 20 29 7b 0a 20 20 20 20 63 61 73 65 20  ol) ){.    case 
ba10: 53 51 4c 49 54 45 5f 42 4c 4f 42 3a 20 7b 0a 20  SQLITE_BLOB: {. 
ba20: 20 20 20 20 20 69 6e 74 20 62 79 74 65 73 20 3d       int bytes =
ba30: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
ba40: 62 79 74 65 73 28 70 53 74 6d 74 2c 20 69 43 6f  bytes(pStmt, iCo
ba50: 6c 29 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20  l);.      const 
ba60: 63 68 61 72 20 2a 7a 42 6c 6f 62 20 3d 20 73 71  char *zBlob = sq
ba70: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f  lite3_column_blo
ba80: 62 28 70 53 74 6d 74 2c 20 69 43 6f 6c 29 3b 0a  b(pStmt, iCol);.
ba90: 20 20 20 20 20 20 69 66 28 20 21 7a 42 6c 6f 62        if( !zBlob
baa0: 20 29 20 62 79 74 65 73 20 3d 20 30 3b 0a 20 20   ) bytes = 0;.  
bab0: 20 20 20 20 72 65 74 75 72 6e 20 54 63 6c 5f 4e      return Tcl_N
bac0: 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 28  ewByteArrayObj((
bad0: 75 38 2a 29 7a 42 6c 6f 62 2c 20 62 79 74 65 73  u8*)zBlob, bytes
bae0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  );.    }.    cas
baf0: 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52  e SQLITE_INTEGER
bb00: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
bb10: 5f 69 6e 74 36 34 20 76 20 3d 20 73 71 6c 69 74  _int64 v = sqlit
bb20: 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28  e3_column_int64(
bb30: 70 53 74 6d 74 2c 20 69 43 6f 6c 29 3b 0a 20 20  pStmt, iCol);.  
bb40: 20 20 20 20 69 66 28 20 76 3e 3d 2d 32 31 34 37      if( v>=-2147
bb50: 34 38 33 36 34 37 20 26 26 20 76 3c 3d 32 31 34  483647 && v<=214
bb60: 37 34 38 33 36 34 37 20 29 7b 0a 20 20 20 20 20  7483647 ){.     
bb70: 20 20 20 72 65 74 75 72 6e 20 54 63 6c 5f 4e 65     return Tcl_Ne
bb80: 77 49 6e 74 4f 62 6a 28 28 69 6e 74 29 76 29 3b  wIntObj((int)v);
bb90: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
bba0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 63 6c        return Tcl
bbb0: 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 76  _NewWideIntObj(v
bbc0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
bbd0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
bbe0: 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20  _FLOAT: {.      
bbf0: 72 65 74 75 72 6e 20 54 63 6c 5f 4e 65 77 44 6f  return Tcl_NewDo
bc00: 75 62 6c 65 4f 62 6a 28 73 71 6c 69 74 65 33 5f  ubleObj(sqlite3_
bc10: 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 28 70 53  column_double(pS
bc20: 74 6d 74 2c 20 69 43 6f 6c 29 29 3b 0a 20 20 20  tmt, iCol));.   
bc30: 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
bc40: 54 45 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20  TE_NULL: {.     
bc50: 20 72 65 74 75 72 6e 20 54 63 6c 5f 4e 65 77 53   return Tcl_NewS
bc60: 74 72 69 6e 67 4f 62 6a 28 70 2d 3e 70 44 62 2d  tringObj(p->pDb-
bc70: 3e 7a 4e 75 6c 6c 2c 20 2d 31 29 3b 0a 20 20 20  >zNull, -1);.   
bc80: 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
bc90: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
bca0: 6a 28 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33  j((char*)sqlite3
bcb0: 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74  _column_text(pSt
bcc0: 6d 74 2c 20 69 43 6f 6c 29 2c 20 2d 31 29 3b 0a  mt, iCol), -1);.
bcd0: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 75 73 69 6e  }../*.** If usin
bce0: 67 20 54 63 6c 20 76 65 72 73 69 6f 6e 20 38 2e  g Tcl version 8.
bcf0: 36 20 6f 72 20 67 72 65 61 74 65 72 2c 20 75 73  6 or greater, us
bd00: 65 20 74 68 65 20 4e 52 20 66 75 6e 63 74 69 6f  e the NR functio
bd10: 6e 73 20 74 6f 20 61 76 6f 69 64 0a 2a 2a 20 72  ns to avoid.** r
bd20: 65 63 75 72 73 69 76 65 20 65 76 61 6c 75 74 69  ecursive evaluti
bd30: 6f 6e 20 6f 66 20 73 63 72 69 70 74 73 20 62 79  on of scripts by
bd40: 20 74 68 65 20 5b 64 62 20 65 76 61 6c 5d 20 61   the [db eval] a
bd50: 6e 64 20 5b 64 62 20 74 72 61 6e 73 5d 0a 2a 2a  nd [db trans].**
bd60: 20 63 6f 6d 6d 61 6e 64 73 2e 20 45 76 65 6e 20   commands. Even 
bd70: 69 66 20 74 68 65 20 68 65 61 64 65 72 73 20 75  if the headers u
bd80: 73 65 64 20 77 68 69 6c 65 20 63 6f 6d 70 69 6c  sed while compil
bd90: 69 6e 67 20 74 68 65 20 65 78 74 65 6e 73 69 6f  ing the extensio
bda0: 6e 0a 2a 2a 20 61 72 65 20 38 2e 36 20 6f 72 20  n.** are 8.6 or 
bdb0: 6e 65 77 65 72 2c 20 74 68 65 20 63 6f 64 65 20  newer, the code 
bdc0: 73 74 69 6c 6c 20 74 65 73 74 73 20 74 68 65 20  still tests the 
bdd0: 54 63 6c 20 76 65 72 73 69 6f 6e 20 61 74 20 72  Tcl version at r
bde0: 75 6e 74 69 6d 65 2e 0a 2a 2a 20 54 68 69 73 20  untime..** This 
bdf0: 61 6c 6c 6f 77 73 20 73 74 75 62 73 2d 65 6e 61  allows stubs-ena
be00: 62 6c 65 64 20 62 75 69 6c 64 73 20 74 6f 20 62  bled builds to b
be10: 65 20 75 73 65 64 20 77 69 74 68 20 6f 6c 64 65  e used with olde
be20: 72 20 54 63 6c 20 6c 69 62 72 61 72 69 65 73 2e  r Tcl libraries.
be30: 0a 2a 2f 0a 23 69 66 20 54 43 4c 5f 4d 41 4a 4f  .*/.#if TCL_MAJO
be40: 52 5f 56 45 52 53 49 4f 4e 3e 38 20 7c 7c 20 28  R_VERSION>8 || (
be50: 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f  TCL_MAJOR_VERSIO
be60: 4e 3d 3d 38 20 26 26 20 54 43 4c 5f 4d 49 4e 4f  N==8 && TCL_MINO
be70: 52 5f 56 45 52 53 49 4f 4e 3e 3d 36 29 0a 23 20  R_VERSION>=6).# 
be80: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 54 43  define SQLITE_TC
be90: 4c 5f 4e 52 45 20 31 0a 73 74 61 74 69 63 20 69  L_NRE 1.static i
bea0: 6e 74 20 44 62 55 73 65 4e 72 65 28 76 6f 69 64  nt DbUseNre(void
beb0: 29 7b 0a 20 20 69 6e 74 20 6d 61 6a 6f 72 2c 20  ){.  int major, 
bec0: 6d 69 6e 6f 72 3b 0a 20 20 54 63 6c 5f 47 65 74  minor;.  Tcl_Get
bed0: 56 65 72 73 69 6f 6e 28 26 6d 61 6a 6f 72 2c 20  Version(&major, 
bee0: 26 6d 69 6e 6f 72 2c 20 30 2c 20 30 29 3b 0a 20  &minor, 0, 0);. 
bef0: 20 72 65 74 75 72 6e 28 20 28 6d 61 6a 6f 72 3d   return( (major=
bf00: 3d 38 20 26 26 20 6d 69 6e 6f 72 3e 3d 36 29 20  =8 && minor>=6) 
bf10: 7c 7c 20 6d 61 6a 6f 72 3e 38 20 29 3b 0a 7d 0a  || major>8 );.}.
bf20: 23 65 6c 73 65 0a 2f 2a 20 0a 2a 2a 20 43 6f 6d  #else./* .** Com
bf30: 70 69 6c 69 6e 67 20 75 73 69 6e 67 20 68 65 61  piling using hea
bf40: 64 65 72 73 20 65 61 72 6c 69 65 72 20 74 68 61  ders earlier tha
bf50: 6e 20 38 2e 36 2e 20 49 6e 20 74 68 69 73 20 63  n 8.6. In this c
bf60: 61 73 65 20 4e 52 20 63 61 6e 6e 6f 74 20 62 65  ase NR cannot be
bf70: 0a 2a 2a 20 75 73 65 64 2c 20 73 6f 20 44 62 55  .** used, so DbU
bf80: 73 65 4e 72 65 28 29 20 74 6f 20 61 6c 77 61 79  seNre() to alway
bf90: 73 20 72 65 74 75 72 6e 20 7a 65 72 6f 2e 20 41  s return zero. A
bfa0: 64 64 20 23 64 65 66 69 6e 65 73 20 66 6f 72 20  dd #defines for 
bfb0: 74 68 65 20 6f 74 68 65 72 0a 2a 2a 20 54 63 6c  the other.** Tcl
bfc0: 5f 4e 52 78 78 78 28 29 20 66 75 6e 63 74 69 6f  _NRxxx() functio
bfd0: 6e 73 20 74 6f 20 70 72 65 76 65 6e 74 20 74 68  ns to prevent th
bfe0: 65 6d 20 66 72 6f 6d 20 63 61 75 73 69 6e 67 20  em from causing 
bff0: 63 6f 6d 70 69 6c 61 74 69 6f 6e 20 65 72 72 6f  compilation erro
c000: 72 73 2c 0a 2a 2a 20 65 76 65 6e 20 74 68 6f 75  rs,.** even thou
c010: 67 68 20 74 68 65 20 6f 6e 6c 79 20 69 6e 76 6f  gh the only invo
c020: 63 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 6d 20  cations of them 
c030: 61 72 65 20 77 69 74 68 69 6e 20 63 6f 6e 64 69  are within condi
c040: 74 69 6f 6e 61 6c 20 62 6c 6f 63 6b 73 20 0a 2a  tional blocks .*
c050: 2a 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a  * of the form:.*
c060: 2a 0a 2a 2a 20 20 20 69 66 28 20 44 62 55 73 65  *.**   if( DbUse
c070: 4e 72 65 28 29 20 29 20 7b 20 2e 2e 2e 20 7d 0a  Nre() ) { ... }.
c080: 2a 2f 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49  */.# define SQLI
c090: 54 45 5f 54 43 4c 5f 4e 52 45 20 30 0a 23 20 64  TE_TCL_NRE 0.# d
c0a0: 65 66 69 6e 65 20 44 62 55 73 65 4e 72 65 28 29  efine DbUseNre()
c0b0: 20 30 0a 23 20 64 65 66 69 6e 65 20 54 63 6c 5f   0.# define Tcl_
c0c0: 4e 52 41 64 64 43 61 6c 6c 62 61 63 6b 28 61 2c  NRAddCallback(a,
c0d0: 62 2c 63 2c 64 2c 65 2c 66 29 20 30 0a 23 20 64  b,c,d,e,f) 0.# d
c0e0: 65 66 69 6e 65 20 54 63 6c 5f 4e 52 45 76 61 6c  efine Tcl_NREval
c0f0: 4f 62 6a 28 61 2c 62 2c 63 29 20 30 0a 23 20 64  Obj(a,b,c) 0.# d
c100: 65 66 69 6e 65 20 54 63 6c 5f 4e 52 43 72 65 61  efine Tcl_NRCrea
c110: 74 65 43 6f 6d 6d 61 6e 64 28 61 2c 62 2c 63 2c  teCommand(a,b,c,
c120: 64 2c 65 2c 66 29 20 30 0a 23 65 6e 64 69 66 0a  d,e,f) 0.#endif.
c130: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
c140: 74 69 6f 6e 20 69 73 20 70 61 72 74 20 6f 66 20  tion is part of 
c150: 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  the implementati
c160: 6f 6e 20 6f 66 20 74 68 65 20 63 6f 6d 6d 61 6e  on of the comman
c170: 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 24 64 62 20 65  d:.**.**   $db e
c180: 76 61 6c 20 53 51 4c 20 3f 41 52 52 41 59 4e 41  val SQL ?ARRAYNA
c190: 4d 45 3f 20 53 43 52 49 50 54 0a 2a 2f 0a 73 74  ME? SCRIPT.*/.st
c1a0: 61 74 69 63 20 69 6e 74 20 44 62 45 76 61 6c 4e  atic int DbEvalN
c1b0: 65 78 74 43 6d 64 28 0a 20 20 43 6c 69 65 6e 74  extCmd(.  Client
c1c0: 44 61 74 61 20 64 61 74 61 5b 5d 2c 20 20 20 20  Data data[],    
c1d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
c1e0: 2a 20 64 61 74 61 5b 30 5d 20 69 73 20 74 68 65  * data[0] is the
c1f0: 20 28 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 2a   (DbEvalContext*
c200: 29 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ) */.  Tcl_Inter
c210: 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 20 20  p *interp,      
c220: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
c230: 63 6c 20 69 6e 74 65 72 70 72 65 74 65 72 20 2a  cl interpreter *
c240: 2f 0a 20 20 69 6e 74 20 72 65 73 75 6c 74 20 20  /.  int result  
c250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c260: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
c270: 6c 74 20 73 6f 20 66 61 72 20 2a 2f 0a 29 7b 0a  lt so far */.){.
c280: 20 20 69 6e 74 20 72 63 20 3d 20 72 65 73 75 6c    int rc = resul
c290: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
c2a0: 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
c2b0: 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54   code */..  /* T
c2c0: 68 65 20 66 69 72 73 74 20 65 6c 65 6d 65 6e 74  he first element
c2d0: 20 6f 66 20 74 68 65 20 64 61 74 61 5b 5d 20 61   of the data[] a
c2e0: 72 72 61 79 20 69 73 20 61 20 70 6f 69 6e 74 65  rray is a pointe
c2f0: 72 20 74 6f 20 61 20 44 62 45 76 61 6c 43 6f 6e  r to a DbEvalCon
c300: 74 65 78 74 0a 20 20 2a 2a 20 73 74 72 75 63 74  text.  ** struct
c310: 75 72 65 20 61 6c 6c 6f 63 61 74 65 64 20 75 73  ure allocated us
c320: 69 6e 67 20 54 63 6c 5f 41 6c 6c 6f 63 28 29 2e  ing Tcl_Alloc().
c330: 20 54 68 65 20 73 65 63 6f 6e 64 20 65 6c 65 6d   The second elem
c340: 65 6e 74 20 6f 66 20 64 61 74 61 5b 5d 0a 20 20  ent of data[].  
c350: 2a 2a 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  ** is a pointer 
c360: 74 6f 20 61 20 54 63 6c 5f 4f 62 6a 20 63 6f 6e  to a Tcl_Obj con
c370: 74 61 69 6e 69 6e 67 20 74 68 65 20 73 63 72 69  taining the scri
c380: 70 74 20 74 6f 20 72 75 6e 20 66 6f 72 20 65 61  pt to run for ea
c390: 63 68 20 72 6f 77 0a 20 20 2a 2a 20 72 65 74 75  ch row.  ** retu
c3a0: 72 6e 65 64 20 62 79 20 74 68 65 20 71 75 65 72  rned by the quer
c3b0: 69 65 73 20 65 6e 63 61 70 73 75 6c 61 74 65 64  ies encapsulated
c3c0: 20 69 6e 20 64 61 74 61 5b 30 5d 2e 20 2a 2f 0a   in data[0]. */.
c3d0: 20 20 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 20    DbEvalContext 
c3e0: 2a 70 20 3d 20 28 44 62 45 76 61 6c 43 6f 6e 74  *p = (DbEvalCont
c3f0: 65 78 74 20 2a 29 64 61 74 61 5b 30 5d 3b 0a 20  ext *)data[0];. 
c400: 20 54 63 6c 5f 4f 62 6a 20 2a 70 53 63 72 69 70   Tcl_Obj *pScrip
c410: 74 20 3d 20 28 54 63 6c 5f 4f 62 6a 20 2a 29 64  t = (Tcl_Obj *)d
c420: 61 74 61 5b 31 5d 3b 0a 20 20 54 63 6c 5f 4f 62  ata[1];.  Tcl_Ob
c430: 6a 20 2a 70 41 72 72 61 79 20 3d 20 70 2d 3e 70  j *pArray = p->p
c440: 41 72 72 61 79 3b 0a 0a 20 20 77 68 69 6c 65 28  Array;..  while(
c450: 20 28 72 63 3d 3d 54 43 4c 5f 4f 4b 20 7c 7c 20   (rc==TCL_OK || 
c460: 72 63 3d 3d 54 43 4c 5f 43 4f 4e 54 49 4e 55 45  rc==TCL_CONTINUE
c470: 29 20 26 26 20 54 43 4c 5f 4f 4b 3d 3d 28 72 63  ) && TCL_OK==(rc
c480: 20 3d 20 64 62 45 76 61 6c 53 74 65 70 28 70 29   = dbEvalStep(p)
c490: 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  ) ){.    int i;.
c4a0: 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20      int nCol;.  
c4b0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 61 70 43 6f    Tcl_Obj **apCo
c4c0: 6c 4e 61 6d 65 3b 0a 20 20 20 20 64 62 45 76 61  lName;.    dbEva
c4d0: 6c 52 6f 77 49 6e 66 6f 28 70 2c 20 26 6e 43 6f  lRowInfo(p, &nCo
c4e0: 6c 2c 20 26 61 70 43 6f 6c 4e 61 6d 65 29 3b 0a  l, &apColName);.
c4f0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
c500: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
c510: 20 54 63 6c 5f 4f 62 6a 20 2a 70 56 61 6c 20 3d   Tcl_Obj *pVal =
c520: 20 64 62 45 76 61 6c 43 6f 6c 75 6d 6e 56 61 6c   dbEvalColumnVal
c530: 75 65 28 70 2c 20 69 29 3b 0a 20 20 20 20 20 20  ue(p, i);.      
c540: 69 66 28 20 70 41 72 72 61 79 3d 3d 30 20 29 7b  if( pArray==0 ){
c550: 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a  .        Tcl_Obj
c560: 53 65 74 56 61 72 32 28 69 6e 74 65 72 70 2c 20  SetVar2(interp, 
c570: 61 70 43 6f 6c 4e 61 6d 65 5b 69 5d 2c 20 30 2c  apColName[i], 0,
c580: 20 70 56 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20   pVal, 0);.     
c590: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
c5a0: 54 63 6c 5f 4f 62 6a 53 65 74 56 61 72 32 28 69  Tcl_ObjSetVar2(i
c5b0: 6e 74 65 72 70 2c 20 70 41 72 72 61 79 2c 20 61  nterp, pArray, a
c5c0: 70 43 6f 6c 4e 61 6d 65 5b 69 5d 2c 20 70 56 61  pColName[i], pVa
c5d0: 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  l, 0);.      }. 
c5e0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65     }..    /* The
c5f0: 20 72 65 71 75 69 72 65 64 20 69 6e 74 65 72 70   required interp
c600: 72 65 74 65 72 20 76 61 72 69 61 62 6c 65 73 20  reter variables 
c610: 61 72 65 20 6e 6f 77 20 70 6f 70 75 6c 61 74 65  are now populate
c620: 64 20 77 69 74 68 20 74 68 65 20 64 61 74 61 20  d with the data 
c630: 0a 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65  .    ** from the
c640: 20 63 75 72 72 65 6e 74 20 72 6f 77 2e 20 49 66   current row. If
c650: 20 75 73 69 6e 67 20 4e 52 45 2c 20 73 63 68 65   using NRE, sche
c660: 64 75 6c 65 20 63 61 6c 6c 62 61 63 6b 73 20 74  dule callbacks t
c670: 6f 20 65 76 61 6c 75 61 74 65 0a 20 20 20 20 2a  o evaluate.    *
c680: 2a 20 73 63 72 69 70 74 20 70 53 63 72 69 70 74  * script pScript
c690: 2c 20 74 68 65 6e 20 74 6f 20 69 6e 76 6f 6b 65  , then to invoke
c6a0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   this function a
c6b0: 67 61 69 6e 20 74 6f 20 66 65 74 63 68 20 74 68  gain to fetch th
c6c0: 65 20 6e 65 78 74 0a 20 20 20 20 2a 2a 20 72 6f  e next.    ** ro
c6d0: 77 20 28 6f 72 20 63 6c 65 61 6e 20 75 70 20 69  w (or clean up i
c6e0: 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65  f there is no ne
c6f0: 78 74 20 72 6f 77 20 6f 72 20 74 68 65 20 73 63  xt row or the sc
c700: 72 69 70 74 20 74 68 72 6f 77 73 20 61 6e 0a 20  ript throws an. 
c710: 20 20 20 2a 2a 20 65 78 63 65 70 74 69 6f 6e 29     ** exception)
c720: 2e 20 41 66 74 65 72 20 73 63 68 65 64 75 6c 69  . After scheduli
c730: 6e 67 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 73  ng the callbacks
c740: 2c 20 72 65 74 75 72 6e 20 63 6f 6e 74 72 6f 6c  , return control
c750: 20 74 6f 20 74 68 65 20 0a 20 20 20 20 2a 2a 20   to the .    ** 
c760: 63 61 6c 6c 65 72 2e 0a 20 20 20 20 2a 2a 0a 20  caller..    **. 
c770: 20 20 20 2a 2a 20 49 66 20 6e 6f 74 20 75 73 69     ** If not usi
c780: 6e 67 20 4e 52 45 2c 20 65 76 61 6c 75 61 74 65  ng NRE, evaluate
c790: 20 70 53 63 72 69 70 74 20 64 69 72 65 63 74 6c   pScript directl
c7a0: 79 20 61 6e 64 20 63 6f 6e 74 69 6e 75 65 20 77  y and continue w
c7b0: 69 74 68 20 74 68 65 0a 20 20 20 20 2a 2a 20 6e  ith the.    ** n
c7c0: 65 78 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66  ext iteration of
c7d0: 20 74 68 69 73 20 77 68 69 6c 65 28 2e 2e 2e 29   this while(...)
c7e0: 20 6c 6f 6f 70 2e 20 20 2a 2f 0a 20 20 20 20 69   loop.  */.    i
c7f0: 66 28 20 44 62 55 73 65 4e 72 65 28 29 20 29 7b  f( DbUseNre() ){
c800: 0a 20 20 20 20 20 20 54 63 6c 5f 4e 52 41 64 64  .      Tcl_NRAdd
c810: 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c  Callback(interp,
c820: 20 44 62 45 76 61 6c 4e 65 78 74 43 6d 64 2c 20   DbEvalNextCmd, 
c830: 28 76 6f 69 64 2a 29 70 2c 20 28 76 6f 69 64 2a  (void*)p, (void*
c840: 29 70 53 63 72 69 70 74 2c 20 30 2c 20 30 29 3b  )pScript, 0, 0);
c850: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 63  .      return Tc
c860: 6c 5f 4e 52 45 76 61 6c 4f 62 6a 28 69 6e 74 65  l_NREvalObj(inte
c870: 72 70 2c 20 70 53 63 72 69 70 74 2c 20 30 29 3b  rp, pScript, 0);
c880: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
c890: 20 20 72 63 20 3d 20 54 63 6c 5f 45 76 61 6c 4f    rc = Tcl_EvalO
c8a0: 62 6a 45 78 28 69 6e 74 65 72 70 2c 20 70 53 63  bjEx(interp, pSc
c8b0: 72 69 70 74 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  ript, 0);.    }.
c8c0: 20 20 7d 0a 0a 20 20 54 63 6c 5f 44 65 63 72 52    }..  Tcl_DecrR
c8d0: 65 66 43 6f 75 6e 74 28 70 53 63 72 69 70 74 29  efCount(pScript)
c8e0: 3b 0a 20 20 64 62 45 76 61 6c 46 69 6e 61 6c 69  ;.  dbEvalFinali
c8f0: 7a 65 28 70 29 3b 0a 20 20 54 63 6c 5f 46 72 65  ze(p);.  Tcl_Fre
c900: 65 28 28 63 68 61 72 20 2a 29 70 29 3b 0a 0a 20  e((char *)p);.. 
c910: 20 69 66 28 20 72 63 3d 3d 54 43 4c 5f 4f 4b 20   if( rc==TCL_OK 
c920: 7c 7c 20 72 63 3d 3d 54 43 4c 5f 42 52 45 41 4b  || rc==TCL_BREAK
c930: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 52 65 73 65   ){.    Tcl_Rese
c940: 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b  tResult(interp);
c950: 0a 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 4f 4b  .    rc = TCL_OK
c960: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
c970: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  c;.}../*.** The 
c980: 22 73 71 6c 69 74 65 22 20 63 6f 6d 6d 61 6e 64  "sqlite" command
c990: 20 62 65 6c 6f 77 20 63 72 65 61 74 65 73 20 61   below creates a
c9a0: 20 6e 65 77 20 54 63 6c 20 63 6f 6d 6d 61 6e 64   new Tcl command
c9b0: 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20 63 6f 6e   for each.** con
c9c0: 6e 65 63 74 69 6f 6e 20 69 74 20 6f 70 65 6e 73  nection it opens
c9d0: 20 74 6f 20 61 6e 20 53 51 4c 69 74 65 20 64 61   to an SQLite da
c9e0: 74 61 62 61 73 65 2e 20 20 54 68 69 73 20 72 6f  tabase.  This ro
c9f0: 75 74 69 6e 65 20 69 73 20 69 6e 76 6f 6b 65 64  utine is invoked
ca00: 0a 2a 2a 20 77 68 65 6e 65 76 65 72 20 6f 6e 65  .** whenever one
ca10: 20 6f 66 20 74 68 6f 73 65 20 63 6f 6e 6e 65 63   of those connec
ca20: 74 69 6f 6e 2d 73 70 65 63 69 66 69 63 20 63 6f  tion-specific co
ca30: 6d 6d 61 6e 64 73 20 69 73 20 65 78 65 63 75 74  mmands is execut
ca40: 65 64 0a 2a 2a 20 69 6e 20 54 63 6c 2e 20 20 46  ed.** in Tcl.  F
ca50: 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 79  or example, if y
ca60: 6f 75 20 72 75 6e 20 54 63 6c 20 63 6f 64 65 20  ou run Tcl code 
ca70: 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a  like this:.**.**
ca80: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 64         sqlite3 d
ca90: 62 31 20 20 22 6d 79 5f 64 61 74 61 62 61 73 65  b1  "my_database
caa0: 22 0a 2a 2a 20 20 20 20 20 20 20 64 62 31 20 63  ".**       db1 c
cab0: 6c 6f 73 65 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  lose.**.** The f
cac0: 69 72 73 74 20 63 6f 6d 6d 61 6e 64 20 6f 70 65  irst command ope
cad0: 6e 73 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ns a connection 
cae0: 74 6f 20 74 68 65 20 22 6d 79 5f 64 61 74 61 62  to the "my_datab
caf0: 61 73 65 22 20 64 61 74 61 62 61 73 65 0a 2a 2a  ase" database.**
cb00: 20 61 6e 64 20 63 61 6c 6c 73 20 74 68 61 74 20   and calls that 
cb10: 63 6f 6e 6e 65 63 74 69 6f 6e 20 22 64 62 31 22  connection "db1"
cb20: 2e 20 20 54 68 65 20 73 65 63 6f 6e 64 20 63 6f  .  The second co
cb30: 6d 6d 61 6e 64 20 63 61 75 73 65 73 20 74 68 69  mmand causes thi
cb40: 73 0a 2a 2a 20 73 75 62 72 6f 75 74 69 6e 65 20  s.** subroutine 
cb50: 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 2e 0a 2a  to be invoked..*
cb60: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 44 62 4f  /.static int DbO
cb70: 62 6a 43 6d 64 28 76 6f 69 64 20 2a 63 64 2c 20  bjCmd(void *cd, 
cb80: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
cb90: 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 54 63 6c  rp, int objc,Tcl
cba0: 5f 4f 62 6a 20 2a 63 6f 6e 73 74 2a 6f 62 6a 76  _Obj *const*objv
cbb0: 29 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70  ){.  SqliteDb *p
cbc0: 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29  Db = (SqliteDb*)
cbd0: 63 64 3b 0a 20 20 69 6e 74 20 63 68 6f 69 63 65  cd;.  int choice
cbe0: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 54 43 4c  ;.  int rc = TCL
cbf0: 5f 4f 4b 3b 0a 20 20 73 74 61 74 69 63 20 63 6f  _OK;.  static co
cc00: 6e 73 74 20 63 68 61 72 20 2a 44 42 5f 73 74 72  nst char *DB_str
cc10: 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 22 61 75 74  s[] = {.    "aut
cc20: 68 6f 72 69 7a 65 72 22 2c 20 20 20 20 20 20 20  horizer",       
cc30: 20 20 22 62 61 63 6b 75 70 22 2c 20 20 20 20 20    "backup",     
cc40: 20 20 20 20 20 20 20 22 62 75 73 79 22 2c 0a 20         "busy",. 
cc50: 20 20 20 22 63 61 63 68 65 22 2c 20 20 20 20 20     "cache",     
cc60: 20 20 20 20 20 20 20 20 20 22 63 68 61 6e 67 65           "change
cc70: 73 22 2c 20 20 20 20 20 20 20 20 20 20 20 22 63  s",           "c
cc80: 6c 6f 73 65 22 2c 0a 20 20 20 20 22 63 6f 6c 6c  lose",.    "coll
cc90: 61 74 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ate",           
cca0: 20 22 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64   "collation_need
ccb0: 65 64 22 2c 20 20 22 63 6f 6d 6d 69 74 5f 68 6f  ed",  "commit_ho
ccc0: 6f 6b 22 2c 0a 20 20 20 20 22 63 6f 6d 70 6c 65  ok",.    "comple
ccd0: 74 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 22  te",           "
cce0: 63 6f 70 79 22 2c 20 20 20 20 20 20 20 20 20 20  copy",          
ccf0: 20 20 20 20 22 65 6e 61 62 6c 65 5f 6c 6f 61 64      "enable_load
cd00: 5f 65 78 74 65 6e 73 69 6f 6e 22 2c 0a 20 20 20  _extension",.   
cd10: 20 22 65 72 72 6f 72 63 6f 64 65 22 2c 20 20 20   "errorcode",   
cd20: 20 20 20 20 20 20 20 22 65 76 61 6c 22 2c 20 20         "eval",  
cd30: 20 20 20 20 20 20 20 20 20 20 20 20 22 65 78 69              "exi
cd40: 73 74 73 22 2c 0a 20 20 20 20 22 66 75 6e 63 74  sts",.    "funct
cd50: 69 6f 6e 22 2c 20 20 20 20 20 20 20 20 20 20 20  ion",           
cd60: 22 69 6e 63 72 62 6c 6f 62 22 2c 20 20 20 20 20  "incrblob",     
cd70: 20 20 20 20 20 22 69 6e 74 65 72 72 75 70 74 22       "interrupt"
cd80: 2c 0a 20 20 20 20 22 6c 61 73 74 5f 69 6e 73 65  ,.    "last_inse
cd90: 72 74 5f 72 6f 77 69 64 22 2c 20 20 22 6e 75 6c  rt_rowid",  "nul
cda0: 6c 76 61 6c 75 65 22 2c 20 20 20 20 20 20 20 20  lvalue",        
cdb0: 20 22 6f 6e 65 63 6f 6c 75 6d 6e 22 2c 0a 20 20   "onecolumn",.  
cdc0: 20 20 22 70 72 6f 66 69 6c 65 22 2c 20 20 20 20    "profile",    
cdd0: 20 20 20 20 20 20 20 20 22 70 72 6f 67 72 65 73          "progres
cde0: 73 22 2c 20 20 20 20 20 20 20 20 20 20 22 72 65  s",          "re
cdf0: 6b 65 79 22 2c 0a 20 20 20 20 22 72 65 73 74 6f  key",.    "resto
ce00: 72 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  re",            
ce10: 22 72 6f 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 22 2c  "rollback_hook",
ce20: 20 20 20 20 20 22 73 74 61 74 75 73 22 2c 0a 20       "status",. 
ce30: 20 20 20 22 74 69 6d 65 6f 75 74 22 2c 20 20 20     "timeout",   
ce40: 20 20 20 20 20 20 20 20 20 22 74 6f 74 61 6c 5f           "total_
ce50: 63 68 61 6e 67 65 73 22 2c 20 20 20 20 20 22 74  changes",     "t
ce60: 72 61 63 65 22 2c 0a 20 20 20 20 22 74 72 61 6e  race",.    "tran
ce70: 73 61 63 74 69 6f 6e 22 2c 20 20 20 20 20 20 20  saction",       
ce80: 20 22 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79 22   "unlock_notify"
ce90: 2c 20 20 20 20 20 22 75 70 64 61 74 65 5f 68 6f  ,     "update_ho
cea0: 6f 6b 22 2c 0a 20 20 20 20 22 76 65 72 73 69 6f  ok",.    "versio
ceb0: 6e 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 22  n",            "
cec0: 77 61 6c 5f 68 6f 6f 6b 22 2c 20 20 20 20 20 20  wal_hook",      
ced0: 20 20 20 20 30 0a 20 20 7d 3b 0a 20 20 65 6e 75      0.  };.  enu
cee0: 6d 20 44 42 5f 65 6e 75 6d 20 7b 0a 20 20 20 20  m DB_enum {.    
cef0: 44 42 5f 41 55 54 48 4f 52 49 5a 45 52 2c 20 20  DB_AUTHORIZER,  
cf00: 20 20 20 20 20 20 44 42 5f 42 41 43 4b 55 50 2c        DB_BACKUP,
cf10: 20 20 20 20 20 20 20 20 20 20 20 44 42 5f 42 55             DB_BU
cf20: 53 59 2c 0a 20 20 20 20 44 42 5f 43 41 43 48 45  SY,.    DB_CACHE
cf30: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 44 42  ,             DB
cf40: 5f 43 48 41 4e 47 45 53 2c 20 20 20 20 20 20 20  _CHANGES,       
cf50: 20 20 20 44 42 5f 43 4c 4f 53 45 2c 0a 20 20 20     DB_CLOSE,.   
cf60: 20 44 42 5f 43 4f 4c 4c 41 54 45 2c 20 20 20 20   DB_COLLATE,    
cf70: 20 20 20 20 20 20 20 44 42 5f 43 4f 4c 4c 41 54         DB_COLLAT
cf80: 49 4f 4e 5f 4e 45 45 44 45 44 2c 20 44 42 5f 43  ION_NEEDED, DB_C
cf90: 4f 4d 4d 49 54 5f 48 4f 4f 4b 2c 0a 20 20 20 20  OMMIT_HOOK,.    
cfa0: 44 42 5f 43 4f 4d 50 4c 45 54 45 2c 20 20 20 20  DB_COMPLETE,    
cfb0: 20 20 20 20 20 20 44 42 5f 43 4f 50 59 2c 20 20        DB_COPY,  
cfc0: 20 20 20 20 20 20 20 20 20 20 20 44 42 5f 45 4e             DB_EN
cfd0: 41 42 4c 45 5f 4c 4f 41 44 5f 45 58 54 45 4e 53  ABLE_LOAD_EXTENS
cfe0: 49 4f 4e 2c 0a 20 20 20 20 44 42 5f 45 52 52 4f  ION,.    DB_ERRO
cff0: 52 43 4f 44 45 2c 20 20 20 20 20 20 20 20 20 44  RCODE,         D
d000: 42 5f 45 56 41 4c 2c 20 20 20 20 20 20 20 20 20  B_EVAL,         
d010: 20 20 20 20 44 42 5f 45 58 49 53 54 53 2c 0a 20      DB_EXISTS,. 
d020: 20 20 20 44 42 5f 46 55 4e 43 54 49 4f 4e 2c 20     DB_FUNCTION, 
d030: 20 20 20 20 20 20 20 20 20 44 42 5f 49 4e 43 52           DB_INCR
d040: 42 4c 4f 42 2c 20 20 20 20 20 20 20 20 20 44 42  BLOB,         DB
d050: 5f 49 4e 54 45 52 52 55 50 54 2c 0a 20 20 20 20  _INTERRUPT,.    
d060: 44 42 5f 4c 41 53 54 5f 49 4e 53 45 52 54 5f 52  DB_LAST_INSERT_R
d070: 4f 57 49 44 2c 20 44 42 5f 4e 55 4c 4c 56 41 4c  OWID, DB_NULLVAL
d080: 55 45 2c 20 20 20 20 20 20 20 20 44 42 5f 4f 4e  UE,        DB_ON
d090: 45 43 4f 4c 55 4d 4e 2c 0a 20 20 20 20 44 42 5f  ECOLUMN,.    DB_
d0a0: 50 52 4f 46 49 4c 45 2c 20 20 20 20 20 20 20 20  PROFILE,        
d0b0: 20 20 20 44 42 5f 50 52 4f 47 52 45 53 53 2c 20     DB_PROGRESS, 
d0c0: 20 20 20 20 20 20 20 20 44 42 5f 52 45 4b 45 59          DB_REKEY
d0d0: 2c 0a 20 20 20 20 44 42 5f 52 45 53 54 4f 52 45  ,.    DB_RESTORE
d0e0: 2c 20 20 20 20 20 20 20 20 20 20 20 44 42 5f 52  ,           DB_R
d0f0: 4f 4c 4c 42 41 43 4b 5f 48 4f 4f 4b 2c 20 20 20  OLLBACK_HOOK,   
d100: 20 44 42 5f 53 54 41 54 55 53 2c 0a 20 20 20 20   DB_STATUS,.    
d110: 44 42 5f 54 49 4d 45 4f 55 54 2c 20 20 20 20 20  DB_TIMEOUT,     
d120: 20 20 20 20 20 20 44 42 5f 54 4f 54 41 4c 5f 43        DB_TOTAL_C
d130: 48 41 4e 47 45 53 2c 20 20 20 20 44 42 5f 54 52  HANGES,    DB_TR
d140: 41 43 45 2c 0a 20 20 20 20 44 42 5f 54 52 41 4e  ACE,.    DB_TRAN
d150: 53 41 43 54 49 4f 4e 2c 20 20 20 20 20 20 20 44  SACTION,       D
d160: 42 5f 55 4e 4c 4f 43 4b 5f 4e 4f 54 49 46 59 2c  B_UNLOCK_NOTIFY,
d170: 20 20 20 20 44 42 5f 55 50 44 41 54 45 5f 48 4f      DB_UPDATE_HO
d180: 4f 4b 2c 0a 20 20 20 20 44 42 5f 56 45 52 53 49  OK,.    DB_VERSI
d190: 4f 4e 2c 20 20 20 20 20 20 20 20 20 20 20 44 42  ON,           DB
d1a0: 5f 57 41 4c 5f 48 4f 4f 4b 0a 20 20 7d 3b 0a 20  _WAL_HOOK.  };. 
d1b0: 20 2f 2a 20 64 6f 6e 27 74 20 6c 65 61 76 65 20   /* don't leave 
d1c0: 74 72 61 69 6c 69 6e 67 20 63 6f 6d 6d 61 73 20  trailing commas 
d1d0: 6f 6e 20 44 42 5f 65 6e 75 6d 2c 20 69 74 20 63  on DB_enum, it c
d1e0: 6f 6e 66 75 73 65 73 20 74 68 65 20 41 49 58 20  onfuses the AIX 
d1f0: 78 6c 63 20 63 6f 6d 70 69 6c 65 72 20 2a 2f 0a  xlc compiler */.
d200: 0a 20 20 69 66 28 20 6f 62 6a 63 3c 32 20 29 7b  .  if( objc<2 ){
d210: 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  .    Tcl_WrongNu
d220: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
d230: 20 6f 62 6a 76 2c 20 22 53 55 42 43 4f 4d 4d 41   objv, "SUBCOMMA
d240: 4e 44 20 2e 2e 2e 22 29 3b 0a 20 20 20 20 72 65  ND ...");.    re
d250: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
d260: 20 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47 65    }.  if( Tcl_Ge
d270: 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e  tIndexFromObj(in
d280: 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 44  terp, objv[1], D
d290: 42 5f 73 74 72 73 2c 20 22 6f 70 74 69 6f 6e 22  B_strs, "option"
d2a0: 2c 20 30 2c 20 26 63 68 6f 69 63 65 29 20 29 7b  , 0, &choice) ){
d2b0: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
d2c0: 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 73 77  ERROR;.  }..  sw
d2d0: 69 74 63 68 28 20 28 65 6e 75 6d 20 44 42 5f 65  itch( (enum DB_e
d2e0: 6e 75 6d 29 63 68 6f 69 63 65 20 29 7b 0a 0a 20  num)choice ){.. 
d2f0: 20 2f 2a 20 20 20 20 24 64 62 20 61 75 74 68 6f   /*    $db autho
d300: 72 69 7a 65 72 20 3f 43 41 4c 4c 42 41 43 4b 3f  rizer ?CALLBACK?
d310: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 76 6f 6b  .  **.  ** Invok
d320: 65 20 74 68 65 20 67 69 76 65 6e 20 63 61 6c 6c  e the given call
d330: 62 61 63 6b 20 74 6f 20 61 75 74 68 6f 72 69 7a  back to authoriz
d340: 65 20 65 61 63 68 20 53 51 4c 20 6f 70 65 72 61  e each SQL opera
d350: 74 69 6f 6e 20 61 73 20 69 74 20 69 73 0a 20 20  tion as it is.  
d360: 2a 2a 20 63 6f 6d 70 69 6c 65 64 2e 20 20 35 20  ** compiled.  5 
d370: 61 72 67 75 6d 65 6e 74 73 20 61 72 65 20 61 70  arguments are ap
d380: 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 63 61  pended to the ca
d390: 6c 6c 62 61 63 6b 20 62 65 66 6f 72 65 20 69 74  llback before it
d3a0: 20 69 73 0a 20 20 2a 2a 20 69 6e 76 6f 6b 65 64   is.  ** invoked
d3b0: 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 28 31  :.  **.  **   (1
d3c0: 29 20 54 68 65 20 61 75 74 68 6f 72 69 7a 61 74  ) The authorizat
d3d0: 69 6f 6e 20 74 79 70 65 20 28 65 78 3a 20 53 51  ion type (ex: SQ
d3e0: 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 41 42 4c  LITE_CREATE_TABL
d3f0: 45 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54  E, SQLITE_INSERT
d400: 2c 20 2e 2e 2e 29 0a 20 20 2a 2a 20 20 20 28 32  , ...).  **   (2
d410: 29 20 46 69 72 73 74 20 64 65 73 63 72 69 70 74  ) First descript
d420: 69 76 65 20 6e 61 6d 65 20 28 64 65 70 65 6e 64  ive name (depend
d430: 73 20 6f 6e 20 61 75 74 68 6f 72 69 7a 61 74 69  s on authorizati
d440: 6f 6e 20 74 79 70 65 29 0a 20 20 2a 2a 20 20 20  on type).  **   
d450: 28 33 29 20 53 65 63 6f 6e 64 20 64 65 73 63 72  (3) Second descr
d460: 69 70 74 69 76 65 20 6e 61 6d 65 0a 20 20 2a 2a  iptive name.  **
d470: 20 20 20 28 34 29 20 4e 61 6d 65 20 6f 66 20 74     (4) Name of t
d480: 68 65 20 64 61 74 61 62 61 73 65 20 28 65 78 3a  he database (ex:
d490: 20 22 6d 61 69 6e 22 2c 20 22 74 65 6d 70 22 29   "main", "temp")
d4a0: 0a 20 20 2a 2a 20 20 20 28 35 29 20 4e 61 6d 65  .  **   (5) Name
d4b0: 20 6f 66 20 74 72 69 67 67 65 72 20 74 68 61 74   of trigger that
d4c0: 20 69 73 20 64 6f 69 6e 67 20 74 68 65 20 61 63   is doing the ac
d4d0: 63 65 73 73 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  cess.  **.  ** T
d4e0: 68 65 20 63 61 6c 6c 62 61 63 6b 20 73 68 6f 75  he callback shou
d4f0: 6c 64 20 72 65 74 75 72 6e 20 6f 6e 20 6f 66 20  ld return on of 
d500: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
d510: 72 69 6e 67 73 3a 20 53 51 4c 49 54 45 5f 4f 4b  rings: SQLITE_OK
d520: 2c 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 49 47  ,.  ** SQLITE_IG
d530: 4e 4f 52 45 2c 20 6f 72 20 53 51 4c 49 54 45 5f  NORE, or SQLITE_
d540: 44 45 4e 59 2e 20 20 41 6e 79 20 6f 74 68 65 72  DENY.  Any other
d550: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73   return value is
d560: 20 61 6e 20 65 72 72 6f 72 2e 0a 20 20 2a 2a 0a   an error..  **.
d570: 20 20 2a 2a 20 49 66 20 74 68 69 73 20 6d 65 74    ** If this met
d580: 68 6f 64 20 69 73 20 69 6e 76 6f 6b 65 64 20 77  hod is invoked w
d590: 69 74 68 20 6e 6f 20 61 72 67 75 6d 65 6e 74 73  ith no arguments
d5a0: 2c 20 74 68 65 20 63 75 72 72 65 6e 74 20 61 75  , the current au
d5b0: 74 68 6f 72 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a  thorization.  **
d5c0: 20 63 61 6c 6c 62 61 63 6b 20 73 74 72 69 6e 67   callback string
d5d0: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 20 20   is returned..  
d5e0: 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 41 55 54  */.  case DB_AUT
d5f0: 48 4f 52 49 5a 45 52 3a 20 7b 0a 23 69 66 64 65  HORIZER: {.#ifde
d600: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
d610: 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 20 20  THORIZATION.    
d620: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
d630: 28 69 6e 74 65 72 70 2c 20 22 61 75 74 68 6f 72  (interp, "author
d640: 69 7a 61 74 69 6f 6e 20 6e 6f 74 20 61 76 61 69  ization not avai
d650: 6c 61 62 6c 65 20 69 6e 20 74 68 69 73 20 62 75  lable in this bu
d660: 69 6c 64 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  ild", 0);.    re
d670: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
d680: 23 65 6c 73 65 0a 20 20 20 20 69 66 28 20 6f 62  #else.    if( ob
d690: 6a 63 3e 33 20 29 7b 0a 20 20 20 20 20 20 54 63  jc>3 ){.      Tc
d6a0: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
d6b0: 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
d6c0: 22 3f 43 41 4c 4c 42 41 43 4b 3f 22 29 3b 0a 20  "?CALLBACK?");. 
d6d0: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
d6e0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73 65  ERROR;.    }else
d6f0: 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a   if( objc==2 ){.
d700: 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a        if( pDb->z
d710: 41 75 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20  Auth ){.        
d720: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
d730: 28 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a 41  (interp, pDb->zA
d740: 75 74 68 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  uth, 0);.      }
d750: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
d760: 20 20 63 68 61 72 20 2a 7a 41 75 74 68 3b 0a 20    char *zAuth;. 
d770: 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20       int len;.  
d780: 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 41 75      if( pDb->zAu
d790: 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63  th ){.        Tc
d7a0: 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 41 75 74  l_Free(pDb->zAut
d7b0: 68 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  h);.      }.    
d7c0: 20 20 7a 41 75 74 68 20 3d 20 54 63 6c 5f 47 65    zAuth = Tcl_Ge
d7d0: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
d7e0: 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a 20  bjv[2], &len);. 
d7f0: 20 20 20 20 20 69 66 28 20 7a 41 75 74 68 20 26       if( zAuth &
d800: 26 20 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20  & len>0 ){.     
d810: 20 20 20 70 44 62 2d 3e 7a 41 75 74 68 20 3d 20     pDb->zAuth = 
d820: 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b  Tcl_Alloc( len +
d830: 20 31 20 29 3b 0a 20 20 20 20 20 20 20 20 6d 65   1 );.        me
d840: 6d 63 70 79 28 70 44 62 2d 3e 7a 41 75 74 68 2c  mcpy(pDb->zAuth,
d850: 20 7a 41 75 74 68 2c 20 6c 65 6e 2b 31 29 3b 0a   zAuth, len+1);.
d860: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
d870: 20 20 20 20 20 70 44 62 2d 3e 7a 41 75 74 68 20       pDb->zAuth 
d880: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
d890: 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 41 75 74     if( pDb->zAut
d8a0: 68 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62  h ){.        pDb
d8b0: 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72  ->interp = inter
d8c0: 70 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  p;.        sqlit
d8d0: 65 33 5f 73 65 74 5f 61 75 74 68 6f 72 69 7a 65  e3_set_authorize
d8e0: 72 28 70 44 62 2d 3e 64 62 2c 20 61 75 74 68 5f  r(pDb->db, auth_
d8f0: 63 61 6c 6c 62 61 63 6b 2c 20 70 44 62 29 3b 0a  callback, pDb);.
d900: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
d910: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 65 74       sqlite3_set
d920: 5f 61 75 74 68 6f 72 69 7a 65 72 28 70 44 62 2d  _authorizer(pDb-
d930: 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  >db, 0, 0);.    
d940: 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66    }.    }.#endif
d950: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
d960: 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 62 61 63  .  /*    $db bac
d970: 6b 75 70 20 3f 44 41 54 41 42 41 53 45 3f 20 46  kup ?DATABASE? F
d980: 49 4c 45 4e 41 4d 45 0a 20 20 2a 2a 0a 20 20 2a  ILENAME.  **.  *
d990: 2a 20 4f 70 65 6e 20 6f 72 20 63 72 65 61 74 65  * Open or create
d9a0: 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65   a database file
d9b0: 20 6e 61 6d 65 64 20 46 49 4c 45 4e 41 4d 45 2e   named FILENAME.
d9c0: 20 20 54 72 61 6e 73 66 65 72 20 74 68 65 0a 20    Transfer the. 
d9d0: 20 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20 6c   ** content of l
d9e0: 6f 63 61 6c 20 64 61 74 61 62 61 73 65 20 44 41  ocal database DA
d9f0: 54 41 42 41 53 45 20 28 64 65 66 61 75 6c 74 3a  TABASE (default:
da00: 20 22 6d 61 69 6e 22 29 20 69 6e 74 6f 20 74 68   "main") into th
da10: 65 0a 20 20 2a 2a 20 46 49 4c 45 4e 41 4d 45 20  e.  ** FILENAME 
da20: 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20  database..  */. 
da30: 20 63 61 73 65 20 44 42 5f 42 41 43 4b 55 50 3a   case DB_BACKUP:
da40: 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61   {.    const cha
da50: 72 20 2a 7a 44 65 73 74 46 69 6c 65 3b 0a 20 20  r *zDestFile;.  
da60: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
da70: 72 63 44 62 3b 0a 20 20 20 20 73 71 6c 69 74 65  rcDb;.    sqlite
da80: 33 20 2a 70 44 65 73 74 3b 0a 20 20 20 20 73 71  3 *pDest;.    sq
da90: 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 2a 70 42  lite3_backup *pB
daa0: 61 63 6b 75 70 3b 0a 0a 20 20 20 20 69 66 28 20  ackup;..    if( 
dab0: 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20 20 20 20 20  objc==3 ){.     
dac0: 20 7a 53 72 63 44 62 20 3d 20 22 6d 61 69 6e 22   zSrcDb = "main"
dad0: 3b 0a 20 20 20 20 20 20 7a 44 65 73 74 46 69 6c  ;.      zDestFil
dae0: 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  e = Tcl_GetStrin
daf0: 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 20 20  g(objv[2]);.    
db00: 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d  }else if( objc==
db10: 34 20 29 7b 0a 20 20 20 20 20 20 7a 53 72 63 44  4 ){.      zSrcD
db20: 62 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  b = Tcl_GetStrin
db30: 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 20 20  g(objv[2]);.    
db40: 20 20 7a 44 65 73 74 46 69 6c 65 20 3d 20 54 63    zDestFile = Tc
db50: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
db60: 5b 33 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  [3]);.    }else{
db70: 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  .      Tcl_Wrong
db80: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
db90: 32 2c 20 6f 62 6a 76 2c 20 22 3f 44 41 54 41 42  2, objv, "?DATAB
dba0: 41 53 45 3f 20 46 49 4c 45 4e 41 4d 45 22 29 3b  ASE? FILENAME");
dbb0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
dbc0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
dbd0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
dbe0: 6f 70 65 6e 28 7a 44 65 73 74 46 69 6c 65 2c 20  open(zDestFile, 
dbf0: 26 70 44 65 73 74 29 3b 0a 20 20 20 20 69 66 28  &pDest);.    if(
dc00: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
dc10: 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65  {.      Tcl_Appe
dc20: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
dc30: 20 22 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 74 61   "cannot open ta
dc40: 72 67 65 74 20 64 61 74 61 62 61 73 65 3a 20 22  rget database: "
dc50: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  ,.           sql
dc60: 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44 65 73  ite3_errmsg(pDes
dc70: 74 29 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20  t), (char*)0);. 
dc80: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f       sqlite3_clo
dc90: 73 65 28 70 44 65 73 74 29 3b 0a 20 20 20 20 20  se(pDest);.     
dca0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
dcb0: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 61  R;.    }.    pBa
dcc0: 63 6b 75 70 20 3d 20 73 71 6c 69 74 65 33 5f 62  ckup = sqlite3_b
dcd0: 61 63 6b 75 70 5f 69 6e 69 74 28 70 44 65 73 74  ackup_init(pDest
dce0: 2c 20 22 6d 61 69 6e 22 2c 20 70 44 62 2d 3e 64  , "main", pDb->d
dcf0: 62 2c 20 7a 53 72 63 44 62 29 3b 0a 20 20 20 20  b, zSrcDb);.    
dd00: 69 66 28 20 70 42 61 63 6b 75 70 3d 3d 30 20 29  if( pBackup==0 )
dd10: 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65  {.      Tcl_Appe
dd20: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
dd30: 20 22 62 61 63 6b 75 70 20 66 61 69 6c 65 64 3a   "backup failed:
dd40: 20 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 73   ",.           s
dd50: 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44  qlite3_errmsg(pD
dd60: 65 73 74 29 2c 20 28 63 68 61 72 2a 29 30 29 3b  est), (char*)0);
dd70: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63  .      sqlite3_c
dd80: 6c 6f 73 65 28 70 44 65 73 74 29 3b 0a 20 20 20  lose(pDest);.   
dd90: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
dda0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77  ROR;.    }.    w
ddb0: 68 69 6c 65 28 20 20 28 72 63 20 3d 20 73 71 6c  hile(  (rc = sql
ddc0: 69 74 65 33 5f 62 61 63 6b 75 70 5f 73 74 65 70  ite3_backup_step
ddd0: 28 70 42 61 63 6b 75 70 2c 31 30 30 29 29 3d 3d  (pBackup,100))==
dde0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 7d 0a 20 20  SQLITE_OK ){}.  
ddf0: 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70    sqlite3_backup
de00: 5f 66 69 6e 69 73 68 28 70 42 61 63 6b 75 70 29  _finish(pBackup)
de10: 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
de20: 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20  LITE_DONE ){.   
de30: 20 20 20 72 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a     rc = TCL_OK;.
de40: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
de50: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
de60: 74 28 69 6e 74 65 72 70 2c 20 22 62 61 63 6b 75  t(interp, "backu
de70: 70 20 66 61 69 6c 65 64 3a 20 22 2c 0a 20 20 20  p failed: ",.   
de80: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
de90: 65 72 72 6d 73 67 28 70 44 65 73 74 29 2c 20 28  errmsg(pDest), (
dea0: 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20  char*)0);.      
deb0: 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  rc = TCL_ERROR;.
dec0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
ded0: 33 5f 63 6c 6f 73 65 28 70 44 65 73 74 29 3b 0a  3_close(pDest);.
dee0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
def0: 20 20 2f 2a 20 20 20 20 24 64 62 20 62 75 73 79    /*    $db busy
df00: 20 3f 43 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a   ?CALLBACK?.  **
df10: 0a 20 20 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65  .  ** Invoke the
df20: 20 67 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b 20   given callback 
df30: 69 66 20 61 6e 20 53 51 4c 20 73 74 61 74 65 6d  if an SQL statem
df40: 65 6e 74 20 61 74 74 65 6d 70 74 73 20 74 6f 20  ent attempts to 
df50: 6f 70 65 6e 0a 20 20 2a 2a 20 61 20 6c 6f 63 6b  open.  ** a lock
df60: 65 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ed database file
df70: 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  ..  */.  case DB
df80: 5f 42 55 53 59 3a 20 7b 0a 20 20 20 20 69 66 28  _BUSY: {.    if(
df90: 20 6f 62 6a 63 3e 33 20 29 7b 0a 20 20 20 20 20   objc>3 ){.     
dfa0: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
dfb0: 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a  s(interp, 2, obj
dfc0: 76 2c 20 22 43 41 4c 4c 42 41 43 4b 22 29 3b 0a  v, "CALLBACK");.
dfd0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
dfe0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73  _ERROR;.    }els
dff0: 65 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b  e if( objc==2 ){
e000: 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e  .      if( pDb->
e010: 7a 42 75 73 79 20 29 7b 0a 20 20 20 20 20 20 20  zBusy ){.       
e020: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
e030: 74 28 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a  t(interp, pDb->z
e040: 42 75 73 79 2c 20 30 29 3b 0a 20 20 20 20 20 20  Busy, 0);.      
e050: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
e060: 20 20 20 63 68 61 72 20 2a 7a 42 75 73 79 3b 0a     char *zBusy;.
e070: 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20        int len;. 
e080: 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 42       if( pDb->zB
e090: 75 73 79 20 29 7b 0a 20 20 20 20 20 20 20 20 54  usy ){.        T
e0a0: 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 42 75  cl_Free(pDb->zBu
e0b0: 73 79 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  sy);.      }.   
e0c0: 20 20 20 7a 42 75 73 79 20 3d 20 54 63 6c 5f 47     zBusy = Tcl_G
e0d0: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
e0e0: 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a  objv[2], &len);.
e0f0: 20 20 20 20 20 20 69 66 28 20 7a 42 75 73 79 20        if( zBusy 
e100: 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20  && len>0 ){.    
e110: 20 20 20 20 70 44 62 2d 3e 7a 42 75 73 79 20 3d      pDb->zBusy =
e120: 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20   Tcl_Alloc( len 
e130: 2b 20 31 20 29 3b 0a 20 20 20 20 20 20 20 20 6d  + 1 );.        m
e140: 65 6d 63 70 79 28 70 44 62 2d 3e 7a 42 75 73 79  emcpy(pDb->zBusy
e150: 2c 20 7a 42 75 73 79 2c 20 6c 65 6e 2b 31 29 3b  , zBusy, len+1);
e160: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
e170: 20 20 20 20 20 20 70 44 62 2d 3e 7a 42 75 73 79        pDb->zBusy
e180: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
e190: 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 42 75      if( pDb->zBu
e1a0: 73 79 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44  sy ){.        pD
e1b0: 62 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65  b->interp = inte
e1c0: 72 70 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  rp;.        sqli
e1d0: 74 65 33 5f 62 75 73 79 5f 68 61 6e 64 6c 65 72  te3_busy_handler
e1e0: 28 70 44 62 2d 3e 64 62 2c 20 44 62 42 75 73 79  (pDb->db, DbBusy
e1f0: 48 61 6e 64 6c 65 72 2c 20 70 44 62 29 3b 0a 20  Handler, pDb);. 
e200: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
e210: 20 20 20 20 73 71 6c 69 74 65 33 5f 62 75 73 79      sqlite3_busy
e220: 5f 68 61 6e 64 6c 65 72 28 70 44 62 2d 3e 64 62  _handler(pDb->db
e230: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  , 0, 0);.      }
e240: 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b  .    }.    break
e250: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 20  ;.  }..  /*     
e260: 24 64 62 20 63 61 63 68 65 20 66 6c 75 73 68 0a  $db cache flush.
e270: 20 20 2a 2a 20 20 20 20 20 24 64 62 20 63 61 63    **     $db cac
e280: 68 65 20 73 69 7a 65 20 6e 0a 20 20 2a 2a 0a 20  he size n.  **. 
e290: 20 2a 2a 20 46 6c 75 73 68 20 74 68 65 20 70 72   ** Flush the pr
e2a0: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
e2b0: 20 63 61 63 68 65 2c 20 6f 72 20 73 65 74 20 74   cache, or set t
e2c0: 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65  he maximum numbe
e2d0: 72 20 6f 66 0a 20 20 2a 2a 20 63 61 63 68 65 64  r of.  ** cached
e2e0: 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 2a   statements..  *
e2f0: 2f 0a 20 20 63 61 73 65 20 44 42 5f 43 41 43 48  /.  case DB_CACH
e300: 45 3a 20 7b 0a 20 20 20 20 63 68 61 72 20 2a 73  E: {.    char *s
e310: 75 62 43 6d 64 3b 0a 20 20 20 20 69 6e 74 20 6e  ubCmd;.    int n
e320: 3b 0a 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3c  ;..    if( objc<
e330: 3d 32 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  =2 ){.      Tcl_
e340: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
e350: 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63  erp, 1, objv, "c
e360: 61 63 68 65 20 6f 70 74 69 6f 6e 20 3f 61 72 67  ache option ?arg
e370: 3f 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ?");.      retur
e380: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
e390: 20 7d 0a 20 20 20 20 73 75 62 43 6d 64 20 3d 20   }.    subCmd = 
e3a0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
e3b0: 6d 4f 62 6a 28 20 6f 62 6a 76 5b 32 5d 2c 20 30  mObj( objv[2], 0
e3c0: 20 29 3b 0a 20 20 20 20 69 66 28 20 2a 73 75 62   );.    if( *sub
e3d0: 43 6d 64 3d 3d 27 66 27 20 26 26 20 73 74 72 63  Cmd=='f' && strc
e3e0: 6d 70 28 73 75 62 43 6d 64 2c 22 66 6c 75 73 68  mp(subCmd,"flush
e3f0: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ")==0 ){.      i
e400: 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20  f( objc!=3 ){.  
e410: 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
e420: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
e430: 2c 20 6f 62 6a 76 2c 20 22 66 6c 75 73 68 22 29  , objv, "flush")
e440: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
e450: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
e460: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
e470: 20 66 6c 75 73 68 53 74 6d 74 43 61 63 68 65 28   flushStmtCache(
e480: 20 70 44 62 20 29 3b 0a 20 20 20 20 20 20 7d 0a   pDb );.      }.
e490: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 2a 73      }else if( *s
e4a0: 75 62 43 6d 64 3d 3d 27 73 27 20 26 26 20 73 74  ubCmd=='s' && st
e4b0: 72 63 6d 70 28 73 75 62 43 6d 64 2c 22 73 69 7a  rcmp(subCmd,"siz
e4c0: 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  e")==0 ){.      
e4d0: 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20  if( objc!=4 ){. 
e4e0: 20 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67         Tcl_Wrong
e4f0: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
e500: 32 2c 20 6f 62 6a 76 2c 20 22 73 69 7a 65 20 6e  2, objv, "size n
e510: 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  ");.        retu
e520: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
e530: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
e540: 20 20 20 69 66 28 20 54 43 4c 5f 45 52 52 4f 52     if( TCL_ERROR
e550: 3d 3d 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  ==Tcl_GetIntFrom
e560: 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
e570: 5b 33 5d 2c 20 26 6e 29 20 29 7b 0a 20 20 20 20  [3], &n) ){.    
e580: 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
e590: 52 65 73 75 6c 74 28 20 69 6e 74 65 72 70 2c 20  Result( interp, 
e5a0: 22 63 61 6e 6e 6f 74 20 63 6f 6e 76 65 72 74 20  "cannot convert 
e5b0: 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20  \"", .          
e5c0: 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
e5d0: 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33  ngFromObj(objv[3
e5e0: 5d 2c 30 29 2c 20 22 5c 22 20 74 6f 20 69 6e 74  ],0), "\" to int
e5f0: 65 67 65 72 22 2c 20 30 29 3b 0a 20 20 20 20 20  eger", 0);.     
e600: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
e610: 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d  ERROR;.        }
e620: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
e630: 69 66 28 20 6e 3c 30 20 29 7b 0a 20 20 20 20 20  if( n<0 ){.     
e640: 20 20 20 20 20 20 20 66 6c 75 73 68 53 74 6d 74         flushStmt
e650: 43 61 63 68 65 28 20 70 44 62 20 29 3b 0a 20 20  Cache( pDb );.  
e660: 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20 30 3b            n = 0;
e670: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
e680: 20 69 66 28 20 6e 3e 4d 41 58 5f 50 52 45 50 41   if( n>MAX_PREPA
e690: 52 45 44 5f 53 54 4d 54 53 20 29 7b 0a 20 20 20  RED_STMTS ){.   
e6a0: 20 20 20 20 20 20 20 20 20 6e 20 3d 20 4d 41 58           n = MAX
e6b0: 5f 50 52 45 50 41 52 45 44 5f 53 54 4d 54 53 3b  _PREPARED_STMTS;
e6c0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
e6d0: 20 20 20 20 20 20 20 70 44 62 2d 3e 6d 61 78 53         pDb->maxS
e6e0: 74 6d 74 20 3d 20 6e 3b 0a 20 20 20 20 20 20 20  tmt = n;.       
e6f0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
e700: 65 6c 73 65 7b 0a 20 20 20 20 20 20 54 63 6c 5f  else{.      Tcl_
e710: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 20 69 6e  AppendResult( in
e720: 74 65 72 70 2c 20 22 62 61 64 20 6f 70 74 69 6f  terp, "bad optio
e730: 6e 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 20  n \"", .        
e740: 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46    Tcl_GetStringF
e750: 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 30  romObj(objv[2],0
e760: 29 2c 20 22 5c 22 3a 20 6d 75 73 74 20 62 65 20  ), "\": must be 
e770: 66 6c 75 73 68 20 6f 72 20 73 69 7a 65 22 2c 20  flush or size", 
e780: 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  0);.      return
e790: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
e7a0: 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  }.    break;.  }
e7b0: 0a 0a 20 20 2f 2a 20 20 20 20 20 24 64 62 20 63  ..  /*     $db c
e7c0: 68 61 6e 67 65 73 0a 20 20 2a 2a 0a 20 20 2a 2a  hanges.  **.  **
e7d0: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
e7e0: 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20  er of rows that 
e7f0: 77 65 72 65 20 6d 6f 64 69 66 69 65 64 2c 20 69  were modified, i
e800: 6e 73 65 72 74 65 64 2c 20 6f 72 20 64 65 6c 65  nserted, or dele
e810: 74 65 64 20 62 79 0a 20 20 2a 2a 20 74 68 65 20  ted by.  ** the 
e820: 6d 6f 73 74 20 72 65 63 65 6e 74 20 49 4e 53 45  most recent INSE
e830: 52 54 2c 20 55 50 44 41 54 45 20 6f 72 20 44 45  RT, UPDATE or DE
e840: 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74 2c 20  LETE statement, 
e850: 6e 6f 74 20 69 6e 63 6c 75 64 69 6e 67 20 0a 20  not including . 
e860: 20 2a 2a 20 61 6e 79 20 63 68 61 6e 67 65 73 20   ** any changes 
e870: 6d 61 64 65 20 62 79 20 74 72 69 67 67 65 72 20  made by trigger 
e880: 70 72 6f 67 72 61 6d 73 2e 0a 20 20 2a 2f 0a 20  programs..  */. 
e890: 20 63 61 73 65 20 44 42 5f 43 48 41 4e 47 45 53   case DB_CHANGES
e8a0: 3a 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20  : {.    Tcl_Obj 
e8b0: 2a 70 52 65 73 75 6c 74 3b 0a 20 20 20 20 69 66  *pResult;.    if
e8c0: 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20  ( objc!=2 ){.   
e8d0: 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
e8e0: 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
e8f0: 62 6a 76 2c 20 22 22 29 3b 0a 20 20 20 20 20 20  bjv, "");.      
e900: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
e910: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 52 65 73  ;.    }.    pRes
e920: 75 6c 74 20 3d 20 54 63 6c 5f 47 65 74 4f 62 6a  ult = Tcl_GetObj
e930: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a  Result(interp);.
e940: 20 20 20 20 54 63 6c 5f 53 65 74 49 6e 74 4f 62      Tcl_SetIntOb
e950: 6a 28 70 52 65 73 75 6c 74 2c 20 73 71 6c 69 74  j(pResult, sqlit
e960: 65 33 5f 63 68 61 6e 67 65 73 28 70 44 62 2d 3e  e3_changes(pDb->
e970: 64 62 29 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b  db));.    break;
e980: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64  .  }..  /*    $d
e990: 62 20 63 6c 6f 73 65 0a 20 20 2a 2a 0a 20 20 2a  b close.  **.  *
e9a0: 2a 20 53 68 75 74 64 6f 77 6e 20 74 68 65 20 64  * Shutdown the d
e9b0: 61 74 61 62 61 73 65 0a 20 20 2a 2f 0a 20 20 63  atabase.  */.  c
e9c0: 61 73 65 20 44 42 5f 43 4c 4f 53 45 3a 20 7b 0a  ase DB_CLOSE: {.
e9d0: 20 20 20 20 54 63 6c 5f 44 65 6c 65 74 65 43 6f      Tcl_DeleteCo
e9e0: 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 54 63  mmand(interp, Tc
e9f0: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
ea00: 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 29 3b  bj(objv[0], 0));
ea10: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
ea20: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24  .  /*.  **     $
ea30: 64 62 20 63 6f 6c 6c 61 74 65 20 4e 41 4d 45 20  db collate NAME 
ea40: 53 43 52 49 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a  SCRIPT.  **.  **
ea50: 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 53 51   Create a new SQ
ea60: 4c 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e 63  L collation func
ea70: 74 69 6f 6e 20 63 61 6c 6c 65 64 20 4e 41 4d 45  tion called NAME
ea80: 2e 20 20 57 68 65 6e 65 76 65 72 0a 20 20 2a 2a  .  Whenever.  **
ea90: 20 74 68 61 74 20 66 75 6e 63 74 69 6f 6e 20 69   that function i
eaa0: 73 20 63 61 6c 6c 65 64 2c 20 69 6e 76 6f 6b 65  s called, invoke
eab0: 20 53 43 52 49 50 54 20 74 6f 20 65 76 61 6c 75   SCRIPT to evalu
eac0: 61 74 65 20 74 68 65 20 66 75 6e 63 74 69 6f 6e  ate the function
ead0: 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  ..  */.  case DB
eae0: 5f 43 4f 4c 4c 41 54 45 3a 20 7b 0a 20 20 20 20  _COLLATE: {.    
eaf0: 53 71 6c 43 6f 6c 6c 61 74 65 20 2a 70 43 6f 6c  SqlCollate *pCol
eb00: 6c 61 74 65 3b 0a 20 20 20 20 63 68 61 72 20 2a  late;.    char *
eb10: 7a 4e 61 6d 65 3b 0a 20 20 20 20 63 68 61 72 20  zName;.    char 
eb20: 2a 7a 53 63 72 69 70 74 3b 0a 20 20 20 20 69 6e  *zScript;.    in
eb30: 74 20 6e 53 63 72 69 70 74 3b 0a 20 20 20 20 69  t nScript;.    i
eb40: 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20  f( objc!=4 ){.  
eb50: 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
eb60: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20  Args(interp, 2, 
eb70: 6f 62 6a 76 2c 20 22 4e 41 4d 45 20 53 43 52 49  objv, "NAME SCRI
eb80: 50 54 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  PT");.      retu
eb90: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
eba0: 20 20 7d 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20    }.    zName = 
ebb0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
ebc0: 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30 29  mObj(objv[2], 0)
ebd0: 3b 0a 20 20 20 20 7a 53 63 72 69 70 74 20 3d 20  ;.    zScript = 
ebe0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
ebf0: 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d 2c 20 26 6e  mObj(objv[3], &n
ec00: 53 63 72 69 70 74 29 3b 0a 20 20 20 20 70 43 6f  Script);.    pCo
ec10: 6c 6c 61 74 65 20 3d 20 28 53 71 6c 43 6f 6c 6c  llate = (SqlColl
ec20: 61 74 65 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28 20  ate*)Tcl_Alloc( 
ec30: 73 69 7a 65 6f 66 28 2a 70 43 6f 6c 6c 61 74 65  sizeof(*pCollate
ec40: 29 20 2b 20 6e 53 63 72 69 70 74 20 2b 20 31 20  ) + nScript + 1 
ec50: 29 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c  );.    if( pColl
ec60: 61 74 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ate==0 ) return 
ec70: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 70  TCL_ERROR;.    p
ec80: 43 6f 6c 6c 61 74 65 2d 3e 69 6e 74 65 72 70 20  Collate->interp 
ec90: 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 70 43  = interp;.    pC
eca0: 6f 6c 6c 61 74 65 2d 3e 70 4e 65 78 74 20 3d 20  ollate->pNext = 
ecb0: 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 3b 0a 20  pDb->pCollate;. 
ecc0: 20 20 20 70 43 6f 6c 6c 61 74 65 2d 3e 7a 53 63     pCollate->zSc
ecd0: 72 69 70 74 20 3d 20 28 63 68 61 72 2a 29 26 70  ript = (char*)&p
ece0: 43 6f 6c 6c 61 74 65 5b 31 5d 3b 0a 20 20 20 20  Collate[1];.    
ecf0: 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 20 3d 20  pDb->pCollate = 
ed00: 70 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 6d 65  pCollate;.    me
ed10: 6d 63 70 79 28 70 43 6f 6c 6c 61 74 65 2d 3e 7a  mcpy(pCollate->z
ed20: 53 63 72 69 70 74 2c 20 7a 53 63 72 69 70 74 2c  Script, zScript,
ed30: 20 6e 53 63 72 69 70 74 2b 31 29 3b 0a 20 20 20   nScript+1);.   
ed40: 20 69 66 28 20 73 71 6c 69 74 65 33 5f 63 72 65   if( sqlite3_cre
ed50: 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 70 44  ate_collation(pD
ed60: 62 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20 53 51  b->db, zName, SQ
ed70: 4c 49 54 45 5f 55 54 46 38 2c 20 0a 20 20 20 20  LITE_UTF8, .    
ed80: 20 20 20 20 70 43 6f 6c 6c 61 74 65 2c 20 74 63      pCollate, tc
ed90: 6c 53 71 6c 43 6f 6c 6c 61 74 65 29 20 29 7b 0a  lSqlCollate) ){.
eda0: 20 20 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73        Tcl_SetRes
edb0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61  ult(interp, (cha
edc0: 72 20 2a 29 73 71 6c 69 74 65 33 5f 65 72 72 6d  r *)sqlite3_errm
edd0: 73 67 28 70 44 62 2d 3e 64 62 29 2c 20 54 43 4c  sg(pDb->db), TCL
ede0: 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 20 20  _VOLATILE);.    
edf0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
ee00: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 72  OR;.    }.    br
ee10: 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  eak;.  }..  /*. 
ee20: 20 2a 2a 20 20 20 20 20 24 64 62 20 63 6f 6c 6c   **     $db coll
ee30: 61 74 69 6f 6e 5f 6e 65 65 64 65 64 20 53 43 52  ation_needed SCR
ee40: 49 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 72  IPT.  **.  ** Cr
ee50: 65 61 74 65 20 61 20 6e 65 77 20 53 51 4c 20 63  eate a new SQL c
ee60: 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f  ollation functio
ee70: 6e 20 63 61 6c 6c 65 64 20 4e 41 4d 45 2e 20 20  n called NAME.  
ee80: 57 68 65 6e 65 76 65 72 0a 20 20 2a 2a 20 74 68  Whenever.  ** th
ee90: 61 74 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  at function is c
eea0: 61 6c 6c 65 64 2c 20 69 6e 76 6f 6b 65 20 53 43  alled, invoke SC
eeb0: 52 49 50 54 20 74 6f 20 65 76 61 6c 75 61 74 65  RIPT to evaluate
eec0: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 20   the function.. 
eed0: 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 43 4f   */.  case DB_CO
eee0: 4c 4c 41 54 49 4f 4e 5f 4e 45 45 44 45 44 3a 20  LLATION_NEEDED: 
eef0: 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d  {.    if( objc!=
ef00: 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57  3 ){.      Tcl_W
ef10: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
ef20: 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 53 43  rp, 2, objv, "SC
ef30: 52 49 50 54 22 29 3b 0a 20 20 20 20 20 20 72 65  RIPT");.      re
ef40: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
ef50: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 44      }.    if( pD
ef60: 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65  b->pCollateNeede
ef70: 64 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 44  d ){.      Tcl_D
ef80: 65 63 72 52 65 66 43 6f 75 6e 74 28 70 44 62 2d  ecrRefCount(pDb-
ef90: 3e 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64 29  >pCollateNeeded)
efa0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 44 62 2d  ;.    }.    pDb-
efb0: 3e 70 43 6f 6c 6c 61 74 65 4e 65 65 64 65 64 20  >pCollateNeeded 
efc0: 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f  = Tcl_DuplicateO
efd0: 62 6a 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 20  bj(objv[2]);.   
efe0: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
eff0: 74 28 70 44 62 2d 3e 70 43 6f 6c 6c 61 74 65 4e  t(pDb->pCollateN
f000: 65 65 64 65 64 29 3b 0a 20 20 20 20 73 71 6c 69  eeded);.    sqli
f010: 74 65 33 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65  te3_collation_ne
f020: 65 64 65 64 28 70 44 62 2d 3e 64 62 2c 20 70 44  eded(pDb->db, pD
f030: 62 2c 20 74 63 6c 43 6f 6c 6c 61 74 65 4e 65 65  b, tclCollateNee
f040: 64 65 64 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b  ded);.    break;
f050: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64  .  }..  /*    $d
f060: 62 20 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 20 3f 43  b commit_hook ?C
f070: 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a 0a 20 20  ALLBACK?.  **.  
f080: 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 67 69  ** Invoke the gi
f090: 76 65 6e 20 63 61 6c 6c 62 61 63 6b 20 6a 75 73  ven callback jus
f0a0: 74 20 62 65 66 6f 72 65 20 63 6f 6d 6d 69 74 74  t before committ
f0b0: 69 6e 67 20 65 76 65 72 79 20 53 51 4c 20 74 72  ing every SQL tr
f0c0: 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20  ansaction..  ** 
f0d0: 49 66 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20  If the callback 
f0e0: 74 68 72 6f 77 73 20 61 6e 20 65 78 63 65 70 74  throws an except
f0f0: 69 6f 6e 20 6f 72 20 72 65 74 75 72 6e 73 20 6e  ion or returns n
f100: 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  on-zero, then th
f110: 65 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69  e.  ** transacti
f120: 6f 6e 20 69 73 20 61 62 6f 72 74 65 64 2e 20 20  on is aborted.  
f130: 49 66 20 43 41 4c 4c 42 41 43 4b 20 69 73 20 61  If CALLBACK is a
f140: 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2c 20  n empty string, 
f150: 74 68 65 20 63 61 6c 6c 62 61 63 6b 0a 20 20 2a  the callback.  *
f160: 2a 20 69 73 20 64 69 73 61 62 6c 65 64 2e 0a 20  * is disabled.. 
f170: 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 43 4f   */.  case DB_CO
f180: 4d 4d 49 54 5f 48 4f 4f 4b 3a 20 7b 0a 20 20 20  MMIT_HOOK: {.   
f190: 20 69 66 28 20 6f 62 6a 63 3e 33 20 29 7b 0a 20   if( objc>3 ){. 
f1a0: 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
f1b0: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
f1c0: 20 6f 62 6a 76 2c 20 22 3f 43 41 4c 4c 42 41 43   objv, "?CALLBAC
f1d0: 4b 3f 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  K?");.      retu
f1e0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
f1f0: 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a 63    }else if( objc
f200: 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==2 ){.      if(
f210: 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 20 29 7b   pDb->zCommit ){
f220: 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70  .        Tcl_App
f230: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
f240: 2c 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 2c 20  , pDb->zCommit, 
f250: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
f260: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61  }else{.      cha
f270: 72 20 2a 7a 43 6f 6d 6d 69 74 3b 0a 20 20 20 20  r *zCommit;.    
f280: 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20    int len;.     
f290: 20 69 66 28 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69   if( pDb->zCommi
f2a0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c  t ){.        Tcl
f2b0: 5f 46 72 65 65 28 70 44 62 2d 3e 7a 43 6f 6d 6d  _Free(pDb->zComm
f2c0: 69 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  it);.      }.   
f2d0: 20 20 20 7a 43 6f 6d 6d 69 74 20 3d 20 54 63 6c     zCommit = Tcl
f2e0: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
f2f0: 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29  j(objv[2], &len)
f300: 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 43 6f 6d  ;.      if( zCom
f310: 6d 69 74 20 26 26 20 6c 65 6e 3e 30 20 29 7b 0a  mit && len>0 ){.
f320: 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 43 6f          pDb->zCo
f330: 6d 6d 69 74 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63  mmit = Tcl_Alloc
f340: 28 20 6c 65 6e 20 2b 20 31 20 29 3b 0a 20 20 20  ( len + 1 );.   
f350: 20 20 20 20 20 6d 65 6d 63 70 79 28 70 44 62 2d       memcpy(pDb-
f360: 3e 7a 43 6f 6d 6d 69 74 2c 20 7a 43 6f 6d 6d 69  >zCommit, zCommi
f370: 74 2c 20 6c 65 6e 2b 31 29 3b 0a 20 20 20 20 20  t, len+1);.     
f380: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
f390: 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 20 3d 20 30  pDb->zCommit = 0
f3a0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
f3b0: 69 66 28 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74  if( pDb->zCommit
f3c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d   ){.        pDb-
f3d0: 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70  >interp = interp
f3e0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
f3f0: 33 5f 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 28 70 44  3_commit_hook(pD
f400: 62 2d 3e 64 62 2c 20 44 62 43 6f 6d 6d 69 74 48  b->db, DbCommitH
f410: 61 6e 64 6c 65 72 2c 20 70 44 62 29 3b 0a 20 20  andler, pDb);.  
f420: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
f430: 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6d 6d 69     sqlite3_commi
f440: 74 5f 68 6f 6f 6b 28 70 44 62 2d 3e 64 62 2c 20  t_hook(pDb->db, 
f450: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  0, 0);.      }. 
f460: 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a     }.    break;.
f470: 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62    }..  /*    $db
f480: 20 63 6f 6d 70 6c 65 74 65 20 53 51 4c 0a 20 20   complete SQL.  
f490: 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 54  **.  ** Return T
f4a0: 52 55 45 20 69 66 20 53 51 4c 20 69 73 20 61 20  RUE if SQL is a 
f4b0: 63 6f 6d 70 6c 65 74 65 20 53 51 4c 20 73 74 61  complete SQL sta
f4c0: 74 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 20  tement.  Return 
f4d0: 46 41 4c 53 45 20 69 66 0a 20 20 2a 2a 20 61 64  FALSE if.  ** ad
f4e0: 64 69 74 69 6f 6e 61 6c 20 6c 69 6e 65 73 20 6f  ditional lines o
f4f0: 66 20 69 6e 70 75 74 20 61 72 65 20 6e 65 65 64  f input are need
f500: 65 64 2e 20 20 54 68 69 73 20 69 73 20 73 69 6d  ed.  This is sim
f510: 69 6c 61 72 20 74 6f 20 74 68 65 0a 20 20 2a 2a  ilar to the.  **
f520: 20 62 75 69 6c 74 2d 69 6e 20 22 69 6e 66 6f 20   built-in "info 
f530: 63 6f 6d 70 6c 65 74 65 22 20 63 6f 6d 6d 61 6e  complete" comman
f540: 64 20 6f 66 20 54 63 6c 2e 0a 20 20 2a 2f 0a 20  d of Tcl..  */. 
f550: 20 63 61 73 65 20 44 42 5f 43 4f 4d 50 4c 45 54   case DB_COMPLET
f560: 45 3a 20 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  E: {.#ifndef SQL
f570: 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4c 45 54  ITE_OMIT_COMPLET
f580: 45 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  E.    Tcl_Obj *p
f590: 52 65 73 75 6c 74 3b 0a 20 20 20 20 69 6e 74 20  Result;.    int 
f5a0: 69 73 43 6f 6d 70 6c 65 74 65 3b 0a 20 20 20 20  isComplete;.    
f5b0: 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20  if( objc!=3 ){. 
f5c0: 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
f5d0: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
f5e0: 20 6f 62 6a 76 2c 20 22 53 51 4c 22 29 3b 0a 20   objv, "SQL");. 
f5f0: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
f600: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
f610: 20 69 73 43 6f 6d 70 6c 65 74 65 20 3d 20 73 71   isComplete = sq
f620: 6c 69 74 65 33 5f 63 6f 6d 70 6c 65 74 65 28 20  lite3_complete( 
f630: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
f640: 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30 29  mObj(objv[2], 0)
f650: 20 29 3b 0a 20 20 20 20 70 52 65 73 75 6c 74 20   );.    pResult 
f660: 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75  = Tcl_GetObjResu
f670: 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  lt(interp);.    
f680: 54 63 6c 5f 53 65 74 42 6f 6f 6c 65 61 6e 4f 62  Tcl_SetBooleanOb
f690: 6a 28 70 52 65 73 75 6c 74 2c 20 69 73 43 6f 6d  j(pResult, isCom
f6a0: 70 6c 65 74 65 29 3b 0a 23 65 6e 64 69 66 0a 20  plete);.#endif. 
f6b0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
f6c0: 20 2f 2a 20 20 20 20 24 64 62 20 63 6f 70 79 20   /*    $db copy 
f6d0: 63 6f 6e 66 6c 69 63 74 2d 61 6c 67 6f 72 69 74  conflict-algorit
f6e0: 68 6d 20 74 61 62 6c 65 20 66 69 6c 65 6e 61 6d  hm table filenam
f6f0: 65 20 3f 53 45 50 41 52 41 54 4f 52 3f 20 3f 4e  e ?SEPARATOR? ?N
f700: 55 4c 4c 49 4e 44 49 43 41 54 4f 52 3f 0a 20 20  ULLINDICATOR?.  
f710: 2a 2a 0a 20 20 2a 2a 20 43 6f 70 79 20 64 61 74  **.  ** Copy dat
f720: 61 20 69 6e 74 6f 20 74 61 62 6c 65 20 66 72 6f  a into table fro
f730: 6d 20 66 69 6c 65 6e 61 6d 65 2c 20 6f 70 74 69  m filename, opti
f740: 6f 6e 61 6c 6c 79 20 75 73 69 6e 67 20 53 45 50  onally using SEP
f750: 41 52 41 54 4f 52 0a 20 20 2a 2a 20 61 73 20 63  ARATOR.  ** as c
f760: 6f 6c 75 6d 6e 20 73 65 70 61 72 61 74 6f 72 73  olumn separators
f770: 2e 20 20 49 66 20 61 20 63 6f 6c 75 6d 6e 20 63  .  If a column c
f780: 6f 6e 74 61 69 6e 73 20 61 20 6e 75 6c 6c 20 73  ontains a null s
f790: 74 72 69 6e 67 2c 20 6f 72 20 74 68 65 0a 20 20  tring, or the.  
f7a0: 2a 2a 20 76 61 6c 75 65 20 6f 66 20 4e 55 4c 4c  ** value of NULL
f7b0: 49 4e 44 49 43 41 54 4f 52 2c 20 61 20 4e 55 4c  INDICATOR, a NUL
f7c0: 4c 20 69 73 20 69 6e 73 65 72 74 65 64 20 66 6f  L is inserted fo
f7d0: 72 20 74 68 65 20 63 6f 6c 75 6d 6e 2e 0a 20 20  r the column..  
f7e0: 2a 2a 20 63 6f 6e 66 6c 69 63 74 2d 61 6c 67 6f  ** conflict-algo
f7f0: 72 69 74 68 6d 20 69 73 20 6f 6e 65 20 6f 66 20  rithm is one of 
f800: 74 68 65 20 73 71 6c 69 74 65 20 63 6f 6e 66 6c  the sqlite confl
f810: 69 63 74 20 61 6c 67 6f 72 69 74 68 6d 73 3a 0a  ict algorithms:.
f820: 20 20 2a 2a 20 20 20 20 72 6f 6c 6c 62 61 63 6b    **    rollback
f830: 2c 20 61 62 6f 72 74 2c 20 66 61 69 6c 2c 20 69  , abort, fail, i
f840: 67 6e 6f 72 65 2c 20 72 65 70 6c 61 63 65 0a 20  gnore, replace. 
f850: 20 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c 20   ** On success, 
f860: 72 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  return the numbe
f870: 72 20 6f 66 20 6c 69 6e 65 73 20 70 72 6f 63 65  r of lines proce
f880: 73 73 65 64 2c 20 6e 6f 74 20 6e 65 63 65 73 73  ssed, not necess
f890: 61 72 69 6c 79 20 73 61 6d 65 0a 20 20 2a 2a 20  arily same.  ** 
f8a0: 61 73 20 27 64 62 20 63 68 61 6e 67 65 73 27 20  as 'db changes' 
f8b0: 64 75 65 20 74 6f 20 63 6f 6e 66 6c 69 63 74 2d  due to conflict-
f8c0: 61 6c 67 6f 72 69 74 68 6d 20 73 65 6c 65 63 74  algorithm select
f8d0: 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  ed..  **.  ** Th
f8e0: 69 73 20 63 6f 64 65 20 69 73 20 62 61 73 69 63  is code is basic
f8f0: 61 6c 6c 79 20 61 6e 20 69 6d 70 6c 65 6d 65 6e  ally an implemen
f900: 74 61 74 69 6f 6e 2f 65 6e 68 61 6e 63 65 6d 65  tation/enhanceme
f910: 6e 74 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 73  nt of.  ** the s
f920: 71 6c 69 74 65 33 20 73 68 65 6c 6c 2e 63 20 22  qlite3 shell.c "
f930: 2e 69 6d 70 6f 72 74 22 20 63 6f 6d 6d 61 6e 64  .import" command
f940: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73  ..  **.  ** This
f950: 20 63 6f 6d 6d 61 6e 64 20 75 73 61 67 65 20 69   command usage i
f960: 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20  s equivalent to 
f970: 74 68 65 20 73 71 6c 69 74 65 32 2e 78 20 43 4f  the sqlite2.x CO
f980: 50 59 20 73 74 61 74 65 6d 65 6e 74 2c 0a 20 20  PY statement,.  
f990: 2a 2a 20 77 68 69 63 68 20 69 6d 70 6f 72 74 73  ** which imports
f9a0: 20 66 69 6c 65 20 64 61 74 61 20 69 6e 74 6f 20   file data into 
f9b0: 61 20 74 61 62 6c 65 20 75 73 69 6e 67 20 74 68  a table using th
f9c0: 65 20 50 6f 73 74 67 72 65 53 51 4c 20 43 4f 50  e PostgreSQL COP
f9d0: 59 20 66 69 6c 65 20 66 6f 72 6d 61 74 3a 0a 20  Y file format:. 
f9e0: 20 2a 2a 20 20 20 24 64 62 20 63 6f 70 79 20 24   **   $db copy $
f9f0: 63 6f 6e 66 6c 69 74 5f 61 6c 67 6f 20 24 74 61  conflit_algo $ta
fa00: 62 6c 65 5f 6e 61 6d 65 20 24 66 69 6c 65 6e 61  ble_name $filena
fa10: 6d 65 20 5c 74 20 5c 5c 4e 0a 20 20 2a 2f 0a 20  me \t \\N.  */. 
fa20: 20 63 61 73 65 20 44 42 5f 43 4f 50 59 3a 20 7b   case DB_COPY: {
fa30: 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 61 62 6c  .    char *zTabl
fa40: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
fa50: 20 2f 2a 20 49 6e 73 65 72 74 20 64 61 74 61 20   /* Insert data 
fa60: 69 6e 74 6f 20 74 68 69 73 20 74 61 62 6c 65 20  into this table 
fa70: 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 46 69  */.    char *zFi
fa80: 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  le;             
fa90: 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 66     /* The file f
faa0: 72 6f 6d 20 77 68 69 63 68 20 74 6f 20 65 78 74  rom which to ext
fab0: 72 61 63 74 20 64 61 74 61 20 2a 2f 0a 20 20 20  ract data */.   
fac0: 20 63 68 61 72 20 2a 7a 43 6f 6e 66 6c 69 63 74   char *zConflict
fad0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
fae0: 54 68 65 20 63 6f 6e 66 6c 69 63 74 20 61 6c 67  The conflict alg
faf0: 6f 72 69 74 68 6d 20 74 6f 20 75 73 65 20 2a 2f  orithm to use */
fb00: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  .    sqlite3_stm
fb10: 74 20 2a 70 53 74 6d 74 3b 20 20 20 20 20 20 20  t *pStmt;       
fb20: 20 2f 2a 20 41 20 73 74 61 74 65 6d 65 6e 74 20   /* A statement 
fb30: 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b  */.    int nCol;
fb40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fb50: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
fb60: 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 74  columns in the t
fb70: 61 62 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20  able */.    int 
fb80: 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20 20 20  nByte;          
fb90: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
fba0: 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 61 6e  r of bytes in an
fbb0: 20 53 51 4c 20 73 74 72 69 6e 67 20 2a 2f 0a 20   SQL string */. 
fbc0: 20 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20     int i, j;    
fbd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
fbe0: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20  * Loop counters 
fbf0: 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53 65 70 3b  */.    int nSep;
fc00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc10: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
fc20: 62 79 74 65 73 20 69 6e 20 7a 53 65 70 5b 5d 20  bytes in zSep[] 
fc30: 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 4e 75 6c 6c  */.    int nNull
fc40: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
fc50: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
fc60: 62 79 74 65 73 20 69 6e 20 7a 4e 75 6c 6c 5b 5d  bytes in zNull[]
fc70: 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 53   */.    char *zS
fc80: 71 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ql;             
fc90: 20 20 20 20 2f 2a 20 41 6e 20 53 51 4c 20 73 74      /* An SQL st
fca0: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 63  atement */.    c
fcb0: 68 61 72 20 2a 7a 4c 69 6e 65 3b 20 20 20 20 20  har *zLine;     
fcc0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
fcd0: 73 69 6e 67 6c 65 20 6c 69 6e 65 20 6f 66 20 69  single line of i
fce0: 6e 70 75 74 20 66 72 6f 6d 20 74 68 65 20 66 69  nput from the fi
fcf0: 6c 65 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a  le */.    char *
fd00: 2a 61 7a 43 6f 6c 3b 20 20 20 20 20 20 20 20 20  *azCol;         
fd10: 20 20 20 20 20 20 2f 2a 20 7a 4c 69 6e 65 5b 5d        /* zLine[]
fd20: 20 62 72 6f 6b 65 6e 20 75 70 20 69 6e 74 6f 20   broken up into 
fd30: 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 63  columns */.    c
fd40: 68 61 72 20 2a 7a 43 6f 6d 6d 69 74 3b 20 20 20  har *zCommit;   
fd50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f             /* Ho
fd60: 77 20 74 6f 20 63 6f 6d 6d 69 74 20 63 68 61 6e  w to commit chan
fd70: 67 65 73 20 2a 2f 0a 20 20 20 20 46 49 4c 45 20  ges */.    FILE 
fd80: 2a 69 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  *in;            
fd90: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e         /* The in
fda0: 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20  put file */.    
fdb0: 69 6e 74 20 6c 69 6e 65 6e 6f 20 3d 20 30 3b 20  int lineno = 0; 
fdc0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
fdd0: 69 6e 65 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e  ine number of in
fde0: 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20  put file */.    
fdf0: 63 68 61 72 20 7a 4c 69 6e 65 4e 75 6d 5b 38 30  char zLineNum[80
fe00: 5d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c  ];          /* L
fe10: 69 6e 65 20 6e 75 6d 62 65 72 20 70 72 69 6e 74  ine number print
fe20: 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 20 20 54   buffer */.    T
fe30: 63 6c 5f 4f 62 6a 20 2a 70 52 65 73 75 6c 74 3b  cl_Obj *pResult;
fe40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 6e             /* in
fe50: 74 65 72 70 20 72 65 73 75 6c 74 20 2a 2f 0a 0a  terp result */..
fe60: 20 20 20 20 63 68 61 72 20 2a 7a 53 65 70 3b 0a      char *zSep;.
fe70: 20 20 20 20 63 68 61 72 20 2a 7a 4e 75 6c 6c 3b      char *zNull;
fe80: 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3c 35 20  .    if( objc<5 
fe90: 7c 7c 20 6f 62 6a 63 3e 37 20 29 7b 0a 20 20 20  || objc>7 ){.   
fea0: 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
feb0: 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
fec0: 62 6a 76 2c 20 0a 20 20 20 20 20 20 20 20 20 22  bjv, .         "
fed0: 43 4f 4e 46 4c 49 43 54 2d 41 4c 47 4f 52 49 54  CONFLICT-ALGORIT
fee0: 48 4d 20 54 41 42 4c 45 20 46 49 4c 45 4e 41 4d  HM TABLE FILENAM
fef0: 45 20 3f 53 45 50 41 52 41 54 4f 52 3f 20 3f 4e  E ?SEPARATOR? ?N
ff00: 55 4c 4c 49 4e 44 49 43 41 54 4f 52 3f 22 29 3b  ULLINDICATOR?");
ff10: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
ff20: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
ff30: 20 20 20 69 66 28 20 6f 62 6a 63 3e 3d 36 20 29     if( objc>=6 )
ff40: 7b 0a 20 20 20 20 20 20 7a 53 65 70 20 3d 20 54  {.      zSep = T
ff50: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
ff60: 4f 62 6a 28 6f 62 6a 76 5b 35 5d 2c 20 30 29 3b  Obj(objv[5], 0);
ff70: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
ff80: 20 20 7a 53 65 70 20 3d 20 22 5c 74 22 3b 0a 20    zSep = "\t";. 
ff90: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 62 6a     }.    if( obj
ffa0: 63 3e 3d 37 20 29 7b 0a 20 20 20 20 20 20 7a 4e  c>=7 ){.      zN
ffb0: 75 6c 6c 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  ull = Tcl_GetStr
ffc0: 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
ffd0: 36 5d 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73  6], 0);.    }els
ffe0: 65 7b 0a 20 20 20 20 20 20 7a 4e 75 6c 6c 20 3d  e{.      zNull =
fff0: 20 22 22 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a   "";.    }.    z
10000 43 6f 6e 66 6c 69 63 74 20 3d 20 54 63 6c 5f 47  Conflict = Tcl_G
10010 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
10020 6f 62 6a 76 5b 32 5d 2c 20 30 29 3b 0a 20 20 20  objv[2], 0);.   
10030 20 7a 54 61 62 6c 65 20 3d 20 54 63 6c 5f 47 65   zTable = Tcl_Ge
10040 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
10050 62 6a 76 5b 33 5d 2c 20 30 29 3b 0a 20 20 20 20  bjv[3], 0);.    
10060 7a 46 69 6c 65 20 3d 20 54 63 6c 5f 47 65 74 53  zFile = Tcl_GetS
10070 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
10080 76 5b 34 5d 2c 20 30 29 3b 0a 20 20 20 20 6e 53  v[4], 0);.    nS
10090 65 70 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 53  ep = strlen30(zS
100a0 65 70 29 3b 0a 20 20 20 20 6e 4e 75 6c 6c 20 3d  ep);.    nNull =
100b0 20 73 74 72 6c 65 6e 33 30 28 7a 4e 75 6c 6c 29   strlen30(zNull)
100c0 3b 0a 20 20 20 20 69 66 28 20 6e 53 65 70 3d 3d  ;.    if( nSep==
100d0 30 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41  0 ){.      Tcl_A
100e0 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
100f0 72 70 2c 22 45 72 72 6f 72 3a 20 6e 6f 6e 2d 6e  rp,"Error: non-n
10100 75 6c 6c 20 73 65 70 61 72 61 74 6f 72 20 72 65  ull separator re
10110 71 75 69 72 65 64 20 66 6f 72 20 63 6f 70 79 22  quired for copy"
10120 2c 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ,0);.      retur
10130 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
10140 20 7d 0a 20 20 20 20 69 66 28 73 74 72 63 6d 70   }.    if(strcmp
10150 28 7a 43 6f 6e 66 6c 69 63 74 2c 20 22 72 6f 6c  (zConflict, "rol
10160 6c 62 61 63 6b 22 29 20 21 3d 20 30 20 26 26 0a  lback") != 0 &&.
10170 20 20 20 20 20 20 20 73 74 72 63 6d 70 28 7a 43         strcmp(zC
10180 6f 6e 66 6c 69 63 74 2c 20 22 61 62 6f 72 74 22  onflict, "abort"
10190 20 20 20 29 20 21 3d 20 30 20 26 26 0a 20 20 20     ) != 0 &&.   
101a0 20 20 20 20 73 74 72 63 6d 70 28 7a 43 6f 6e 66      strcmp(zConf
101b0 6c 69 63 74 2c 20 22 66 61 69 6c 22 20 20 20 20  lict, "fail"    
101c0 29 20 21 3d 20 30 20 26 26 0a 20 20 20 20 20 20  ) != 0 &&.      
101d0 20 73 74 72 63 6d 70 28 7a 43 6f 6e 66 6c 69 63   strcmp(zConflic
101e0 74 2c 20 22 69 67 6e 6f 72 65 22 20 20 29 20 21  t, "ignore"  ) !
101f0 3d 20 30 20 26 26 0a 20 20 20 20 20 20 20 73 74  = 0 &&.       st
10200 72 63 6d 70 28 7a 43 6f 6e 66 6c 69 63 74 2c 20  rcmp(zConflict, 
10210 22 72 65 70 6c 61 63 65 22 20 29 20 21 3d 20 30  "replace" ) != 0
10220 20 29 20 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41   ) {.      Tcl_A
10230 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
10240 72 70 2c 20 22 45 72 72 6f 72 3a 20 5c 22 22 2c  rp, "Error: \"",
10250 20 7a 43 6f 6e 66 6c 69 63 74 2c 20 0a 20 20 20   zConflict, .   
10260 20 20 20 20 20 20 20 20 20 22 5c 22 2c 20 63 6f           "\", co
10270 6e 66 6c 69 63 74 2d 61 6c 67 6f 72 69 74 68 6d  nflict-algorithm
10280 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f 66 3a   must be one of:
10290 20 72 6f 6c 6c 62 61 63 6b 2c 20 22 0a 20 20 20   rollback, ".   
102a0 20 20 20 20 20 20 20 20 20 22 61 62 6f 72 74 2c           "abort,
102b0 20 66 61 69 6c 2c 20 69 67 6e 6f 72 65 2c 20 6f   fail, ignore, o
102c0 72 20 72 65 70 6c 61 63 65 22 2c 20 30 29 3b 0a  r replace", 0);.
102d0 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
102e0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
102f0 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33    zSql = sqlite3
10300 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c 45 43 54  _mprintf("SELECT
10310 20 2a 20 46 52 4f 4d 20 27 25 71 27 22 2c 20 7a   * FROM '%q'", z
10320 54 61 62 6c 65 29 3b 0a 20 20 20 20 69 66 28 20  Table);.    if( 
10330 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20  zSql==0 ){.     
10340 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
10350 74 28 69 6e 74 65 72 70 2c 20 22 45 72 72 6f 72  t(interp, "Error
10360 3a 20 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 3a  : no such table:
10370 20 22 2c 20 7a 54 61 62 6c 65 2c 20 30 29 3b 0a   ", zTable, 0);.
10380 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
10390 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
103a0 20 20 6e 42 79 74 65 20 3d 20 73 74 72 6c 65 6e    nByte = strlen
103b0 33 30 28 7a 53 71 6c 29 3b 0a 20 20 20 20 72 63  30(zSql);.    rc
103c0 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61   = sqlite3_prepa
103d0 72 65 28 70 44 62 2d 3e 64 62 2c 20 7a 53 71 6c  re(pDb->db, zSql
103e0 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29  , -1, &pStmt, 0)
103f0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
10400 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 69 66  ee(zSql);.    if
10410 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 54 63  ( rc ){.      Tc
10420 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
10430 6e 74 65 72 70 2c 20 22 45 72 72 6f 72 3a 20 22  nterp, "Error: "
10440 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  , sqlite3_errmsg
10450 28 70 44 62 2d 3e 64 62 29 2c 20 30 29 3b 0a 20  (pDb->db), 0);. 
10460 20 20 20 20 20 6e 43 6f 6c 20 3d 20 30 3b 0a 20       nCol = 0;. 
10470 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
10480 6e 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63  nCol = sqlite3_c
10490 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70 53 74 6d  olumn_count(pStm
104a0 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  t);.    }.    sq
104b0 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
104c0 53 74 6d 74 29 3b 0a 20 20 20 20 69 66 28 20 6e  Stmt);.    if( n
104d0 43 6f 6c 3d 3d 30 20 29 20 7b 0a 20 20 20 20 20  Col==0 ) {.     
104e0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
104f0 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 53 71  R;.    }.    zSq
10500 6c 20 3d 20 6d 61 6c 6c 6f 63 28 20 6e 42 79 74  l = malloc( nByt
10510 65 20 2b 20 35 30 20 2b 20 6e 43 6f 6c 2a 32 20  e + 50 + nCol*2 
10520 29 3b 0a 20 20 20 20 69 66 28 20 7a 53 71 6c 3d  );.    if( zSql=
10530 3d 30 20 29 20 7b 0a 20 20 20 20 20 20 54 63 6c  =0 ) {.      Tcl
10540 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
10550 74 65 72 70 2c 20 22 45 72 72 6f 72 3a 20 63 61  terp, "Error: ca
10560 6e 27 74 20 6d 61 6c 6c 6f 63 28 29 22 2c 20 30  n't malloc()", 0
10570 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
10580 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
10590 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
105a0 72 69 6e 74 66 28 6e 42 79 74 65 2b 35 30 2c 20  rintf(nByte+50, 
105b0 7a 53 71 6c 2c 20 22 49 4e 53 45 52 54 20 4f 52  zSql, "INSERT OR
105c0 20 25 71 20 49 4e 54 4f 20 27 25 71 27 20 56 41   %q INTO '%q' VA
105d0 4c 55 45 53 28 3f 22 2c 0a 20 20 20 20 20 20 20  LUES(?",.       
105e0 20 20 7a 43 6f 6e 66 6c 69 63 74 2c 20 7a 54 61    zConflict, zTa
105f0 62 6c 65 29 3b 0a 20 20 20 20 6a 20 3d 20 73 74  ble);.    j = st
10600 72 6c 65 6e 33 30 28 7a 53 71 6c 29 3b 0a 20 20  rlen30(zSql);.  
10610 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 43 6f    for(i=1; i<nCo
10620 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 7a  l; i++){.      z
10630 53 71 6c 5b 6a 2b 2b 5d 20 3d 20 27 2c 27 3b 0a  Sql[j++] = ',';.
10640 20 20 20 20 20 20 7a 53 71 6c 5b 6a 2b 2b 5d 20        zSql[j++] 
10650 3d 20 27 3f 27 3b 0a 20 20 20 20 7d 0a 20 20 20  = '?';.    }.   
10660 20 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d 20 27 29 27   zSql[j++] = ')'
10670 3b 0a 20 20 20 20 7a 53 71 6c 5b 6a 5d 20 3d 20  ;.    zSql[j] = 
10680 30 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  0;.    rc = sqli
10690 74 65 33 5f 70 72 65 70 61 72 65 28 70 44 62 2d  te3_prepare(pDb-
106a0 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26  >db, zSql, -1, &
106b0 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 66  pStmt, 0);.    f
106c0 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 69  ree(zSql);.    i
106d0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 54  f( rc ){.      T
106e0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
106f0 69 6e 74 65 72 70 2c 20 22 45 72 72 6f 72 3a 20  interp, "Error: 
10700 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  ", sqlite3_errms
10710 67 28 70 44 62 2d 3e 64 62 29 2c 20 30 29 3b 0a  g(pDb->db), 0);.
10720 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69        sqlite3_fi
10730 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20  nalize(pStmt);. 
10740 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
10750 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
10760 20 69 6e 20 3d 20 66 6f 70 65 6e 28 7a 46 69 6c   in = fopen(zFil
10770 65 2c 20 22 72 62 22 29 3b 0a 20 20 20 20 69 66  e, "rb");.    if
10780 28 20 69 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ( in==0 ){.     
10790 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
107a0 74 28 69 6e 74 65 72 70 2c 20 22 45 72 72 6f 72  t(interp, "Error
107b0 3a 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 66 69  : cannot open fi
107c0 6c 65 3a 20 22 2c 20 7a 46 69 6c 65 2c 20 4e 55  le: ", zFile, NU
107d0 4c 4c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  LL);.      sqlit
107e0 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
107f0 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  t);.      return
10800 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
10810 7d 0a 20 20 20 20 61 7a 43 6f 6c 20 3d 20 6d 61  }.    azCol = ma
10820 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 61 7a 43  lloc( sizeof(azC
10830 6f 6c 5b 30 5d 29 2a 28 6e 43 6f 6c 2b 31 29 20  ol[0])*(nCol+1) 
10840 29 3b 0a 20 20 20 20 69 66 28 20 61 7a 43 6f 6c  );.    if( azCol
10850 3d 3d 30 20 29 20 7b 0a 20 20 20 20 20 20 54 63  ==0 ) {.      Tc
10860 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
10870 6e 74 65 72 70 2c 20 22 45 72 72 6f 72 3a 20 63  nterp, "Error: c
10880 61 6e 27 74 20 6d 61 6c 6c 6f 63 28 29 22 2c 20  an't malloc()", 
10890 30 29 3b 0a 20 20 20 20 20 20 66 63 6c 6f 73 65  0);.      fclose
108a0 28 69 6e 29 3b 0a 20 20 20 20 20 20 72 65 74 75  (in);.      retu
108b0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
108c0 20 20 7d 0a 20 20 20 20 28 76 6f 69 64 29 73 71    }.    (void)sq
108d0 6c 69 74 65 33 5f 65 78 65 63 28 70 44 62 2d 3e  lite3_exec(pDb->
108e0 64 62 2c 20 22 42 45 47 49 4e 22 2c 20 30 2c 20  db, "BEGIN", 0, 
108f0 30 2c 20 30 29 3b 0a 20 20 20 20 7a 43 6f 6d 6d  0, 0);.    zComm
10900 69 74 20 3d 20 22 43 4f 4d 4d 49 54 22 3b 0a 20  it = "COMMIT";. 
10910 20 20 20 77 68 69 6c 65 28 20 28 7a 4c 69 6e 65     while( (zLine
10920 20 3d 20 6c 6f 63 61 6c 5f 67 65 74 6c 69 6e 65   = local_getline
10930 28 30 2c 20 69 6e 29 29 21 3d 30 20 29 7b 0a 20  (0, in))!=0 ){. 
10940 20 20 20 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20       char *z;.  
10950 20 20 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20      lineno++;.  
10960 20 20 20 20 61 7a 43 6f 6c 5b 30 5d 20 3d 20 7a      azCol[0] = z
10970 4c 69 6e 65 3b 0a 20 20 20 20 20 20 66 6f 72 28  Line;.      for(
10980 69 3d 30 2c 20 7a 3d 7a 4c 69 6e 65 3b 20 2a 7a  i=0, z=zLine; *z
10990 3b 20 7a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; z++){.        
109a0 69 66 28 20 2a 7a 3d 3d 7a 53 65 70 5b 30 5d 20  if( *z==zSep[0] 
109b0 26 26 20 73 74 72 6e 63 6d 70 28 7a 2c 20 7a 53  && strncmp(z, zS
109c0 65 70 2c 20 6e 53 65 70 29 3d 3d 30 20 29 7b 0a  ep, nSep)==0 ){.
109d0 20 20 20 20 20 20 20 20 20 20 2a 7a 20 3d 20 30            *z = 0
109e0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 2b 2b 3b  ;.          i++;
109f0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
10a00 3c 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20  <nCol ){.       
10a10 20 20 20 20 20 61 7a 43 6f 6c 5b 69 5d 20 3d 20       azCol[i] = 
10a20 26 7a 5b 6e 53 65 70 5d 3b 0a 20 20 20 20 20 20  &z[nSep];.      
10a30 20 20 20 20 20 20 7a 20 2b 3d 20 6e 53 65 70 2d        z += nSep-
10a40 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  1;.          }. 
10a50 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
10a60 0a 20 20 20 20 20 20 69 66 28 20 69 2b 31 21 3d  .      if( i+1!=
10a70 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  nCol ){.        
10a80 63 68 61 72 20 2a 7a 45 72 72 3b 0a 20 20 20 20  char *zErr;.    
10a90 20 20 20 20 69 6e 74 20 6e 45 72 72 20 3d 20 73      int nErr = s
10aa0 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 29 20 2b  trlen30(zFile) +
10ab0 20 32 30 30 3b 0a 20 20 20 20 20 20 20 20 7a 45   200;.        zE
10ac0 72 72 20 3d 20 6d 61 6c 6c 6f 63 28 6e 45 72 72  rr = malloc(nErr
10ad0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a  );.        if( z
10ae0 45 72 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Err ){.         
10af0 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
10b00 66 28 6e 45 72 72 2c 20 7a 45 72 72 2c 0a 20 20  f(nErr, zErr,.  
10b10 20 20 20 20 20 20 20 20 20 20 20 22 45 72 72 6f             "Erro
10b20 72 3a 20 25 73 20 6c 69 6e 65 20 25 64 3a 20 65  r: %s line %d: e
10b30 78 70 65 63 74 65 64 20 25 64 20 63 6f 6c 75 6d  xpected %d colum
10b40 6e 73 20 6f 66 20 64 61 74 61 20 62 75 74 20 66  ns of data but f
10b50 6f 75 6e 64 20 25 64 22 2c 0a 20 20 20 20 20 20  ound %d",.      
10b60 20 20 20 20 20 20 20 7a 46 69 6c 65 2c 20 6c 69         zFile, li
10b70 6e 65 6e 6f 2c 20 6e 43 6f 6c 2c 20 69 2b 31 29  neno, nCol, i+1)
10b80 3b 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f  ;.          Tcl_
10b90 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
10ba0 65 72 70 2c 20 7a 45 72 72 2c 20 30 29 3b 0a 20  erp, zErr, 0);. 
10bb0 20 20 20 20 20 20 20 20 20 66 72 65 65 28 7a 45           free(zE
10bc0 72 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  rr);.        }. 
10bd0 20 20 20 20 20 20 20 7a 43 6f 6d 6d 69 74 20 3d         zCommit =
10be0 20 22 52 4f 4c 4c 42 41 43 4b 22 3b 0a 20 20 20   "ROLLBACK";.   
10bf0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
10c00 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d    }.      for(i=
10c10 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  0; i<nCol; i++){
10c20 0a 20 20 20 20 20 20 20 20 2f 2a 20 63 68 65 63  .        /* chec
10c30 6b 20 66 6f 72 20 6e 75 6c 6c 20 64 61 74 61 2c  k for null data,
10c40 20 69 66 20 73 6f 2c 20 62 69 6e 64 20 61 73 20   if so, bind as 
10c50 6e 75 6c 6c 20 2a 2f 0a 20 20 20 20 20 20 20 20  null */.        
10c60 69 66 28 20 28 6e 4e 75 6c 6c 3e 30 20 26 26 20  if( (nNull>0 && 
10c70 73 74 72 63 6d 70 28 61 7a 43 6f 6c 5b 69 5d 2c  strcmp(azCol[i],
10c80 20 7a 4e 75 6c 6c 29 3d 3d 30 29 0a 20 20 20 20   zNull)==0).    
10c90 20 20 20 20 20 20 7c 7c 20 73 74 72 6c 65 6e 33        || strlen3
10ca0 30 28 61 7a 43 6f 6c 5b 69 5d 29 3d 3d 30 20 0a  0(azCol[i])==0 .
10cb0 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
10cc0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e       sqlite3_bin
10cd0 64 5f 6e 75 6c 6c 28 70 53 74 6d 74 2c 20 69 2b  d_null(pStmt, i+
10ce0 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  1);.        }els
10cf0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  e{.          sql
10d00 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70  ite3_bind_text(p
10d10 53 74 6d 74 2c 20 69 2b 31 2c 20 61 7a 43 6f 6c  Stmt, i+1, azCol
10d20 5b 69 5d 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f  [i], -1, SQLITE_
10d30 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 20  STATIC);.       
10d40 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
10d50 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53   sqlite3_step(pS
10d60 74 6d 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  tmt);.      rc =
10d70 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70   sqlite3_reset(p
10d80 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 66 72 65  Stmt);.      fre
10d90 65 28 7a 4c 69 6e 65 29 3b 0a 20 20 20 20 20 20  e(zLine);.      
10da0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
10db0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c  K ){.        Tcl
10dc0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
10dd0 74 65 72 70 2c 22 45 72 72 6f 72 3a 20 22 2c 20  terp,"Error: ", 
10de0 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70  sqlite3_errmsg(p
10df0 44 62 2d 3e 64 62 29 2c 20 30 29 3b 0a 20 20 20  Db->db), 0);.   
10e00 20 20 20 20 20 7a 43 6f 6d 6d 69 74 20 3d 20 22       zCommit = "
10e10 52 4f 4c 4c 42 41 43 4b 22 3b 0a 20 20 20 20 20  ROLLBACK";.     
10e20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
10e30 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65  }.    }.    free
10e40 28 61 7a 43 6f 6c 29 3b 0a 20 20 20 20 66 63 6c  (azCol);.    fcl
10e50 6f 73 65 28 69 6e 29 3b 0a 20 20 20 20 73 71 6c  ose(in);.    sql
10e60 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53  ite3_finalize(pS
10e70 74 6d 74 29 3b 0a 20 20 20 20 28 76 6f 69 64 29  tmt);.    (void)
10e80 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 44 62  sqlite3_exec(pDb
10e90 2d 3e 64 62 2c 20 7a 43 6f 6d 6d 69 74 2c 20 30  ->db, zCommit, 0
10ea0 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 20 20 69 66  , 0, 0);..    if
10eb0 28 20 7a 43 6f 6d 6d 69 74 5b 30 5d 20 3d 3d 20  ( zCommit[0] == 
10ec0 27 43 27 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  'C' ){.      /* 
10ed0 73 75 63 63 65 73 73 2c 20 73 65 74 20 72 65 73  success, set res
10ee0 75 6c 74 20 61 73 20 6e 75 6d 62 65 72 20 6f 66  ult as number of
10ef0 20 6c 69 6e 65 73 20 70 72 6f 63 65 73 73 65 64   lines processed
10f00 20 2a 2f 0a 20 20 20 20 20 20 70 52 65 73 75 6c   */.      pResul
10f10 74 20 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65  t = Tcl_GetObjRe
10f20 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  sult(interp);.  
10f30 20 20 20 20 54 63 6c 5f 53 65 74 49 6e 74 4f 62      Tcl_SetIntOb
10f40 6a 28 70 52 65 73 75 6c 74 2c 20 6c 69 6e 65 6e  j(pResult, linen
10f50 6f 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 54  o);.      rc = T
10f60 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65  CL_OK;.    }else
10f70 7b 0a 20 20 20 20 20 20 2f 2a 20 66 61 69 6c 75  {.      /* failu
10f80 72 65 2c 20 61 70 70 65 6e 64 20 6c 69 6e 65 6e  re, append linen
10f90 6f 20 77 68 65 72 65 20 66 61 69 6c 65 64 20 2a  o where failed *
10fa0 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  /.      sqlite3_
10fb0 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
10fc0 7a 4c 69 6e 65 4e 75 6d 29 2c 20 7a 4c 69 6e 65  zLineNum), zLine
10fd0 4e 75 6d 2c 22 25 64 22 2c 6c 69 6e 65 6e 6f 29  Num,"%d",lineno)
10fe0 3b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65  ;.      Tcl_Appe
10ff0 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
11000 22 2c 20 66 61 69 6c 65 64 20 77 68 69 6c 65 20  ", failed while 
11010 70 72 6f 63 65 73 73 69 6e 67 20 6c 69 6e 65 3a  processing line:
11020 20 22 2c 7a 4c 69 6e 65 4e 75 6d 2c 30 29 3b 0a   ",zLineNum,0);.
11030 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45        rc = TCL_E
11040 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
11050 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
11060 0a 20 20 2a 2a 20 20 20 20 24 64 62 20 65 6e 61  .  **    $db ena
11070 62 6c 65 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69  ble_load_extensi
11080 6f 6e 20 42 4f 4f 4c 45 41 4e 0a 20 20 2a 2a 0a  on BOOLEAN.  **.
11090 20 20 2a 2a 20 54 75 72 6e 20 74 68 65 20 65 78    ** Turn the ex
110a0 74 65 6e 73 69 6f 6e 20 6c 6f 61 64 69 6e 67 20  tension loading 
110b0 66 65 61 74 75 72 65 20 6f 6e 20 6f 72 20 6f 66  feature on or of
110c0 66 2e 20 20 49 74 20 69 66 20 6f 66 66 20 62 79  f.  It if off by
110d0 0a 20 20 2a 2a 20 64 65 66 61 75 6c 74 2e 0a 20  .  ** default.. 
110e0 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 45 4e   */.  case DB_EN
110f0 41 42 4c 45 5f 4c 4f 41 44 5f 45 58 54 45 4e 53  ABLE_LOAD_EXTENS
11100 49 4f 4e 3a 20 7b 0a 23 69 66 6e 64 65 66 20 53  ION: {.#ifndef S
11110 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f  QLITE_OMIT_LOAD_
11120 45 58 54 45 4e 53 49 4f 4e 0a 20 20 20 20 69 6e  EXTENSION.    in
11130 74 20 6f 6e 6f 66 66 3b 0a 20 20 20 20 69 66 28  t onoff;.    if(
11140 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20   objc!=3 ){.    
11150 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
11160 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62  gs(interp, 2, ob
11170 6a 76 2c 20 22 42 4f 4f 4c 45 41 4e 22 29 3b 0a  jv, "BOOLEAN");.
11180 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
11190 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
111a0 20 20 69 66 28 20 54 63 6c 5f 47 65 74 42 6f 6f    if( Tcl_GetBoo
111b0 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  leanFromObj(inte
111c0 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 6f 6e  rp, objv[2], &on
111d0 6f 66 66 29 20 29 7b 0a 20 20 20 20 20 20 72 65  off) ){.      re
111e0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
111f0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
11200 33 5f 65 6e 61 62 6c 65 5f 6c 6f 61 64 5f 65 78  3_enable_load_ex
11210 74 65 6e 73 69 6f 6e 28 70 44 62 2d 3e 64 62 2c  tension(pDb->db,
11220 20 6f 6e 6f 66 66 29 3b 0a 20 20 20 20 62 72 65   onoff);.    bre
11230 61 6b 3b 0a 23 65 6c 73 65 0a 20 20 20 20 54 63  ak;.#else.    Tc
11240 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
11250 6e 74 65 72 70 2c 20 22 65 78 74 65 6e 73 69 6f  nterp, "extensio
11260 6e 20 6c 6f 61 64 69 6e 67 20 69 73 20 74 75 72  n loading is tur
11270 6e 65 64 20 6f 66 66 20 61 74 20 63 6f 6d 70 69  ned off at compi
11280 6c 65 2d 74 69 6d 65 22 2c 0a 20 20 20 20 20 20  le-time",.      
11290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
112a0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
112b0 4c 5f 45 52 52 4f 52 3b 0a 23 65 6e 64 69 66 0a  L_ERROR;.#endif.
112c0 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20    }..  /*.  **  
112d0 20 20 24 64 62 20 65 72 72 6f 72 63 6f 64 65 0a    $db errorcode.
112e0 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e    **.  ** Return
112f0 20 74 68 65 20 6e 75 6d 65 72 69 63 20 65 72 72   the numeric err
11300 6f 72 20 63 6f 64 65 20 74 68 61 74 20 77 61 73  or code that was
11310 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65   returned by the
11320 20 6d 6f 73 74 20 72 65 63 65 6e 74 0a 20 20 2a   most recent.  *
11330 2a 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  * call to sqlite
11340 33 5f 65 78 65 63 28 29 2e 0a 20 20 2a 2f 0a 20  3_exec()..  */. 
11350 20 63 61 73 65 20 44 42 5f 45 52 52 4f 52 43 4f   case DB_ERRORCO
11360 44 45 3a 20 7b 0a 20 20 20 20 54 63 6c 5f 53 65  DE: {.    Tcl_Se
11370 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
11380 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  p, Tcl_NewIntObj
11390 28 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65  (sqlite3_errcode
113a0 28 70 44 62 2d 3e 64 62 29 29 29 3b 0a 20 20 20  (pDb->db)));.   
113b0 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
113c0 2a 0a 20 20 2a 2a 20 20 20 20 24 64 62 20 65 78  *.  **    $db ex
113d0 69 73 74 73 20 24 73 71 6c 0a 20 20 2a 2a 20 20  ists $sql.  **  
113e0 20 20 24 64 62 20 6f 6e 65 63 6f 6c 75 6d 6e 20    $db onecolumn 
113f0 24 73 71 6c 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  $sql.  **.  ** T
11400 68 65 20 6f 6e 65 63 6f 6c 75 6d 6e 20 6d 65 74  he onecolumn met
11410 68 6f 64 20 69 73 20 74 68 65 20 65 71 75 69 76  hod is the equiv
11420 61 6c 65 6e 74 20 6f 66 3a 0a 20 20 2a 2a 20 20  alent of:.  **  
11430 20 20 20 6c 69 6e 64 65 78 20 5b 24 64 62 20 65     lindex [$db e
11440 76 61 6c 20 24 73 71 6c 5d 20 30 0a 20 20 2a 2f  val $sql] 0.  */
11450 0a 20 20 63 61 73 65 20 44 42 5f 45 58 49 53 54  .  case DB_EXIST
11460 53 3a 20 0a 20 20 63 61 73 65 20 44 42 5f 4f 4e  S: .  case DB_ON
11470 45 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 44  ECOLUMN: {.    D
11480 62 45 76 61 6c 43 6f 6e 74 65 78 74 20 73 45 76  bEvalContext sEv
11490 61 6c 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63  al;.    if( objc
114a0 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  !=3 ){.      Tcl
114b0 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
114c0 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22  terp, 2, objv, "
114d0 53 51 4c 22 29 3b 0a 20 20 20 20 20 20 72 65 74  SQL");.      ret
114e0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
114f0 20 20 20 7d 0a 0a 20 20 20 20 64 62 45 76 61 6c     }..    dbEval
11500 49 6e 69 74 28 26 73 45 76 61 6c 2c 20 70 44 62  Init(&sEval, pDb
11510 2c 20 6f 62 6a 76 5b 32 5d 2c 20 30 29 3b 0a 20  , objv[2], 0);. 
11520 20 20 20 72 63 20 3d 20 64 62 45 76 61 6c 53 74     rc = dbEvalSt
11530 65 70 28 26 73 45 76 61 6c 29 3b 0a 20 20 20 20  ep(&sEval);.    
11540 69 66 28 20 63 68 6f 69 63 65 3d 3d 44 42 5f 4f  if( choice==DB_O
11550 4e 45 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20  NECOLUMN ){.    
11560 20 20 69 66 28 20 72 63 3d 3d 54 43 4c 5f 4f 4b    if( rc==TCL_OK
11570 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f   ){.        Tcl_
11580 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
11590 65 72 70 2c 20 64 62 45 76 61 6c 43 6f 6c 75 6d  erp, dbEvalColum
115a0 6e 56 61 6c 75 65 28 26 73 45 76 61 6c 2c 20 30  nValue(&sEval, 0
115b0 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  ));.      }else 
115c0 69 66 28 20 72 63 3d 3d 54 43 4c 5f 42 52 45 41  if( rc==TCL_BREA
115d0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c  K ){.        Tcl
115e0 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74  _ResetResult(int
115f0 65 72 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  erp);.      }.  
11600 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d    }else if( rc==
11610 54 43 4c 5f 42 52 45 41 4b 20 7c 7c 20 72 63 3d  TCL_BREAK || rc=
11620 3d 54 43 4c 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  =TCL_OK ){.     
11630 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
11640 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
11650 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28 72 63 3d 3d  wBooleanObj(rc==
11660 54 43 4c 5f 4f 4b 29 29 3b 0a 20 20 20 20 7d 0a  TCL_OK));.    }.
11670 20 20 20 20 64 62 45 76 61 6c 46 69 6e 61 6c 69      dbEvalFinali
11680 7a 65 28 26 73 45 76 61 6c 29 3b 0a 0a 20 20 20  ze(&sEval);..   
11690 20 69 66 28 20 72 63 3d 3d 54 43 4c 5f 42 52 45   if( rc==TCL_BRE
116a0 41 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  AK ){.      rc =
116b0 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20   TCL_OK;.    }. 
116c0 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20     break;.  }.  
116d0 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 24   .  /*.  **    $
116e0 64 62 20 65 76 61 6c 20 24 73 71 6c 20 3f 61 72  db eval $sql ?ar
116f0 72 61 79 3f 20 3f 7b 20 20 2e 2e 2e 63 6f 64 65  ray? ?{  ...code
11700 2e 2e 2e 20 7d 3f 0a 20 20 2a 2a 0a 20 20 2a 2a  ... }?.  **.  **
11710 20 54 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65   The SQL stateme
11720 6e 74 20 69 6e 20 24 73 71 6c 20 69 73 20 65 76  nt in $sql is ev
11730 61 6c 75 61 74 65 64 2e 20 20 46 6f 72 20 65 61  aluated.  For ea
11740 63 68 20 72 6f 77 2c 20 74 68 65 20 76 61 6c 75  ch row, the valu
11750 65 73 20 61 72 65 0a 20 20 2a 2a 20 70 6c 61 63  es are.  ** plac
11760 65 64 20 69 6e 20 65 6c 65 6d 65 6e 74 73 20 6f  ed in elements o
11770 66 20 74 68 65 20 61 72 72 61 79 20 6e 61 6d 65  f the array name
11780 64 20 22 61 72 72 61 79 22 20 61 6e 64 20 2e 2e  d "array" and ..
11790 2e 63 6f 64 65 2e 2e 2e 20 69 73 20 65 78 65 63  .code... is exec
117a0 75 74 65 64 2e 0a 20 20 2a 2a 20 49 66 20 22 61  uted..  ** If "a
117b0 72 72 61 79 22 20 61 6e 64 20 22 63 6f 64 65 22  rray" and "code"
117c0 20 61 72 65 20 6f 6d 69 74 74 65 64 2c 20 74 68   are omitted, th
117d0 65 6e 20 6e 6f 20 63 61 6c 6c 62 61 63 6b 20 69  en no callback i
117e0 73 20 65 76 65 72 79 20 69 6e 76 6f 6b 65 64 2e  s every invoked.
117f0 0a 20 20 2a 2a 20 49 66 20 22 61 72 72 61 79 22  .  ** If "array"
11800 20 69 73 20 61 6e 20 65 6d 70 74 79 20 73 74 72   is an empty str
11810 69 6e 67 2c 20 74 68 65 6e 20 74 68 65 20 76 61  ing, then the va
11820 6c 75 65 73 20 61 72 65 20 70 6c 61 63 65 64 20  lues are placed 
11830 69 6e 20 76 61 72 69 61 62 6c 65 73 0a 20 20 2a  in variables.  *
11840 2a 20 74 68 61 74 20 68 61 76 65 20 74 68 65 20  * that have the 
11850 73 61 6d 65 20 6e 61 6d 65 20 61 73 20 74 68 65  same name as the
11860 20 66 69 65 6c 64 73 20 65 78 74 72 61 63 74 65   fields extracte
11870 64 20 62 79 20 74 68 65 20 71 75 65 72 79 2e 0a  d by the query..
11880 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 45    */.  case DB_E
11890 56 41 4c 3a 20 7b 0a 20 20 20 20 69 66 28 20 6f  VAL: {.    if( o
118a0 62 6a 63 3c 33 20 7c 7c 20 6f 62 6a 63 3e 35 20  bjc<3 || objc>5 
118b0 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f  ){.      Tcl_Wro
118c0 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
118d0 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 53 51 4c 20  , 2, objv, "SQL 
118e0 3f 41 52 52 41 59 2d 4e 41 4d 45 3f 20 3f 53 43  ?ARRAY-NAME? ?SC
118f0 52 49 50 54 3f 22 29 3b 0a 20 20 20 20 20 20 72  RIPT?");.      r
11900 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
11910 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
11920 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20 20 20 20 20  objc==3 ){.     
11930 20 44 62 45 76 61 6c 43 6f 6e 74 65 78 74 20 73   DbEvalContext s
11940 45 76 61 6c 3b 0a 20 20 20 20 20 20 54 63 6c 5f  Eval;.      Tcl_
11950 4f 62 6a 20 2a 70 52 65 74 20 3d 20 54 63 6c 5f  Obj *pRet = Tcl_
11960 4e 65 77 4f 62 6a 28 29 3b 0a 20 20 20 20 20 20  NewObj();.      
11970 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
11980 28 70 52 65 74 29 3b 0a 20 20 20 20 20 20 64 62  (pRet);.      db
11990 45 76 61 6c 49 6e 69 74 28 26 73 45 76 61 6c 2c  EvalInit(&sEval,
119a0 20 70 44 62 2c 20 6f 62 6a 76 5b 32 5d 2c 20 30   pDb, objv[2], 0
119b0 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  );.      while( 
119c0 54 43 4c 5f 4f 4b 3d 3d 28 72 63 20 3d 20 64 62  TCL_OK==(rc = db
119d0 45 76 61 6c 53 74 65 70 28 26 73 45 76 61 6c 29  EvalStep(&sEval)
119e0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  ) ){.        int
119f0 20 69 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   i;.        int 
11a00 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 64 62  nCol;.        db
11a10 45 76 61 6c 52 6f 77 49 6e 66 6f 28 26 73 45 76  EvalRowInfo(&sEv
11a20 61 6c 2c 20 26 6e 43 6f 6c 2c 20 30 29 3b 0a 20  al, &nCol, 0);. 
11a30 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
11a40 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  i<nCol; i++){.  
11a50 20 20 20 20 20 20 20 20 54 63 6c 5f 4c 69 73 74          Tcl_List
11a60 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
11a70 28 69 6e 74 65 72 70 2c 20 70 52 65 74 2c 20 64  (interp, pRet, d
11a80 62 45 76 61 6c 43 6f 6c 75 6d 6e 56 61 6c 75 65  bEvalColumnValue
11a90 28 26 73 45 76 61 6c 2c 20 69 29 29 3b 0a 20 20  (&sEval, i));.  
11aa0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
11ab0 20 20 20 20 20 20 64 62 45 76 61 6c 46 69 6e 61        dbEvalFina
11ac0 6c 69 7a 65 28 26 73 45 76 61 6c 29 3b 0a 20 20  lize(&sEval);.  
11ad0 20 20 20 20 69 66 28 20 72 63 3d 3d 54 43 4c 5f      if( rc==TCL_
11ae0 42 52 45 41 4b 20 29 7b 0a 20 20 20 20 20 20 20  BREAK ){.       
11af0 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
11b00 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74 29 3b  t(interp, pRet);
11b10 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 54 43  .        rc = TC
11b20 4c 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  L_OK;.      }.  
11b30 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
11b40 6f 75 6e 74 28 70 52 65 74 29 3b 0a 20 20 20 20  ount(pRet);.    
11b50 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 43 6c 69  }else{.      Cli
11b60 65 6e 74 44 61 74 61 20 63 64 5b 32 5d 3b 0a 20  entData cd[2];. 
11b70 20 20 20 20 20 44 62 45 76 61 6c 43 6f 6e 74 65       DbEvalConte
11b80 78 74 20 2a 70 3b 0a 20 20 20 20 20 20 54 63 6c  xt *p;.      Tcl
11b90 5f 4f 62 6a 20 2a 70 41 72 72 61 79 20 3d 20 30  _Obj *pArray = 0
11ba0 3b 0a 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20  ;.      Tcl_Obj 
11bb0 2a 70 53 63 72 69 70 74 3b 0a 0a 20 20 20 20 20  *pScript;..     
11bc0 20 69 66 28 20 6f 62 6a 63 3d 3d 35 20 26 26 20   if( objc==5 && 
11bd0 2a 28 63 68 61 72 20 2a 29 54 63 6c 5f 47 65 74  *(char *)Tcl_Get
11be0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 20  String(objv[3]) 
11bf0 29 7b 0a 20 20 20 20 20 20 20 20 70 41 72 72 61  ){.        pArra
11c00 79 20 3d 20 6f 62 6a 76 5b 33 5d 3b 0a 20 20 20  y = objv[3];.   
11c10 20 20 20 7d 0a 20 20 20 20 20 20 70 53 63 72 69     }.      pScri
11c20 70 74 20 3d 20 6f 62 6a 76 5b 6f 62 6a 63 2d 31  pt = objv[objc-1
11c30 5d 3b 0a 20 20 20 20 20 20 54 63 6c 5f 49 6e 63  ];.      Tcl_Inc
11c40 72 52 65 66 43 6f 75 6e 74 28 70 53 63 72 69 70  rRefCount(pScrip
11c50 74 29 3b 0a 20 20 20 20 20 20 0a 20 20 20 20 20  t);.      .     
11c60 20 70 20 3d 20 28 44 62 45 76 61 6c 43 6f 6e 74   p = (DbEvalCont
11c70 65 78 74 20 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28  ext *)Tcl_Alloc(
11c80 73 69 7a 65 6f 66 28 44 62 45 76 61 6c 43 6f 6e  sizeof(DbEvalCon
11c90 74 65 78 74 29 29 3b 0a 20 20 20 20 20 20 64 62  text));.      db
11ca0 45 76 61 6c 49 6e 69 74 28 70 2c 20 70 44 62 2c  EvalInit(p, pDb,
11cb0 20 6f 62 6a 76 5b 32 5d 2c 20 70 41 72 72 61 79   objv[2], pArray
11cc0 29 3b 0a 0a 20 20 20 20 20 20 63 64 5b 30 5d 20  );..      cd[0] 
11cd0 3d 20 28 76 6f 69 64 20 2a 29 70 3b 0a 20 20 20  = (void *)p;.   
11ce0 20 20 20 63 64 5b 31 5d 20 3d 20 28 76 6f 69 64     cd[1] = (void
11cf0 20 2a 29 70 53 63 72 69 70 74 3b 0a 20 20 20 20   *)pScript;.    
11d00 20 20 72 63 20 3d 20 44 62 45 76 61 6c 4e 65 78    rc = DbEvalNex
11d10 74 43 6d 64 28 63 64 2c 20 69 6e 74 65 72 70 2c  tCmd(cd, interp,
11d20 20 54 43 4c 5f 4f 4b 29 3b 0a 20 20 20 20 7d 0a   TCL_OK);.    }.
11d30 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
11d40 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64    /*.  **     $d
11d50 62 20 66 75 6e 63 74 69 6f 6e 20 4e 41 4d 45 20  b function NAME 
11d60 5b 2d 61 72 67 63 6f 75 6e 74 20 4e 5d 20 53 43  [-argcount N] SC
11d70 52 49 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43  RIPT.  **.  ** C
11d80 72 65 61 74 65 20 61 20 6e 65 77 20 53 51 4c 20  reate a new SQL 
11d90 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 20  function called 
11da0 4e 41 4d 45 2e 20 20 57 68 65 6e 65 76 65 72 20  NAME.  Whenever 
11db0 74 68 61 74 20 66 75 6e 63 74 69 6f 6e 20 69 73  that function is
11dc0 0a 20 20 2a 2a 20 63 61 6c 6c 65 64 2c 20 69 6e  .  ** called, in
11dd0 76 6f 6b 65 20 53 43 52 49 50 54 20 74 6f 20 65  voke SCRIPT to e
11de0 76 61 6c 75 61 74 65 20 74 68 65 20 66 75 6e 63  valuate the func
11df0 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 63 61 73  tion..  */.  cas
11e00 65 20 44 42 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b  e DB_FUNCTION: {
11e10 0a 20 20 20 20 53 71 6c 46 75 6e 63 20 2a 70 46  .    SqlFunc *pF
11e20 75 6e 63 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  unc;.    Tcl_Obj
11e30 20 2a 70 53 63 72 69 70 74 3b 0a 20 20 20 20 63   *pScript;.    c
11e40 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20  har *zName;.    
11e50 69 6e 74 20 6e 41 72 67 20 3d 20 2d 31 3b 0a 20  int nArg = -1;. 
11e60 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d 36 20 29     if( objc==6 )
11e70 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  {.      const ch
11e80 61 72 20 2a 7a 20 3d 20 54 63 6c 5f 47 65 74 53  ar *z = Tcl_GetS
11e90 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a  tring(objv[3]);.
11ea0 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 74        int n = st
11eb0 72 6c 65 6e 33 30 28 7a 29 3b 0a 20 20 20 20 20  rlen30(z);.     
11ec0 20 69 66 28 20 6e 3e 32 20 26 26 20 73 74 72 6e   if( n>2 && strn
11ed0 63 6d 70 28 7a 2c 20 22 2d 61 72 67 63 6f 75 6e  cmp(z, "-argcoun
11ee0 74 22 2c 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  t",n)==0 ){.    
11ef0 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49      if( Tcl_GetI
11f00 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
11f10 2c 20 6f 62 6a 76 5b 34 5d 2c 20 26 6e 41 72 67  , objv[4], &nArg
11f20 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
11f30 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 69 66  RROR;.        if
11f40 28 20 6e 41 72 67 3c 30 20 29 7b 0a 20 20 20 20  ( nArg<0 ){.    
11f50 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
11f60 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
11f70 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  number of argume
11f80 6e 74 73 20 6d 75 73 74 20 62 65 20 6e 6f 6e 2d  nts must be non-
11f90 6e 65 67 61 74 69 76 65 22 2c 0a 20 20 20 20 20  negative",.     
11fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11fb0 20 20 20 20 20 20 28 63 68 61 72 2a 29 30 29 3b        (char*)0);
11fc0 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
11fd0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
11fe0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
11ff0 20 20 20 20 20 70 53 63 72 69 70 74 20 3d 20 6f       pScript = o
12000 62 6a 76 5b 35 5d 3b 0a 20 20 20 20 7d 65 6c 73  bjv[5];.    }els
12010 65 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b  e if( objc!=4 ){
12020 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  .      Tcl_Wrong
12030 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
12040 32 2c 20 6f 62 6a 76 2c 20 22 4e 41 4d 45 20 5b  2, objv, "NAME [
12050 2d 61 72 67 63 6f 75 6e 74 20 4e 5d 20 53 43 52  -argcount N] SCR
12060 49 50 54 22 29 3b 0a 20 20 20 20 20 20 72 65 74  IPT");.      ret
12070 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
12080 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
12090 70 53 63 72 69 70 74 20 3d 20 6f 62 6a 76 5b 33  pScript = objv[3
120a0 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4e 61  ];.    }.    zNa
120b0 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  me = Tcl_GetStri
120c0 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32  ngFromObj(objv[2
120d0 5d 2c 20 30 29 3b 0a 20 20 20 20 70 46 75 6e 63  ], 0);.    pFunc
120e0 20 3d 20 66 69 6e 64 53 71 6c 46 75 6e 63 28 70   = findSqlFunc(p
120f0 44 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  Db, zName);.    
12100 69 66 28 20 70 46 75 6e 63 3d 3d 30 20 29 20 72  if( pFunc==0 ) r
12110 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
12120 0a 20 20 20 20 69 66 28 20 70 46 75 6e 63 2d 3e  .    if( pFunc->
12130 70 53 63 72 69 70 74 20 29 7b 0a 20 20 20 20 20  pScript ){.     
12140 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
12150 74 28 70 46 75 6e 63 2d 3e 70 53 63 72 69 70 74  t(pFunc->pScript
12160 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 46 75  );.    }.    pFu
12170 6e 63 2d 3e 70 53 63 72 69 70 74 20 3d 20 70 53  nc->pScript = pS
12180 63 72 69 70 74 3b 0a 20 20 20 20 54 63 6c 5f 49  cript;.    Tcl_I
12190 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 53 63 72  ncrRefCount(pScr
121a0 69 70 74 29 3b 0a 20 20 20 20 70 46 75 6e 63 2d  ipt);.    pFunc-
121b0 3e 75 73 65 45 76 61 6c 4f 62 6a 76 20 3d 20 73  >useEvalObjv = s
121c0 61 66 65 54 6f 55 73 65 45 76 61 6c 4f 62 6a 76  afeToUseEvalObjv
121d0 28 69 6e 74 65 72 70 2c 20 70 53 63 72 69 70 74  (interp, pScript
121e0 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
121f0 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
12200 69 6f 6e 28 70 44 62 2d 3e 64 62 2c 20 7a 4e 61  ion(pDb->db, zNa
12210 6d 65 2c 20 6e 41 72 67 2c 20 53 51 4c 49 54 45  me, nArg, SQLITE
12220 5f 55 54 46 38 2c 0a 20 20 20 20 20 20 20 20 70  _UTF8,.        p
12230 46 75 6e 63 2c 20 74 63 6c 53 71 6c 46 75 6e 63  Func, tclSqlFunc
12240 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  , 0, 0);.    if(
12250 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
12260 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c  {.      rc = TCL
12270 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 54 63  _ERROR;.      Tc
12280 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
12290 72 70 2c 20 28 63 68 61 72 20 2a 29 73 71 6c 69  rp, (char *)sqli
122a0 74 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e  te3_errmsg(pDb->
122b0 64 62 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c  db), TCL_VOLATIL
122c0 45 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 72  E);.    }.    br
122d0 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  eak;.  }..  /*. 
122e0 20 2a 2a 20 20 20 20 20 24 64 62 20 69 6e 63 72   **     $db incr
122f0 62 6c 6f 62 20 3f 2d 72 65 61 64 6f 6e 6c 79 3f  blob ?-readonly?
12300 20 3f 44 42 3f 20 54 41 42 4c 45 20 43 4f 4c 55   ?DB? TABLE COLU
12310 4d 4e 20 52 4f 57 49 44 0a 20 20 2a 2f 0a 20 20  MN ROWID.  */.  
12320 63 61 73 65 20 44 42 5f 49 4e 43 52 42 4c 4f 42  case DB_INCRBLOB
12330 3a 20 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  : {.#ifdef SQLIT
12340 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a  E_OMIT_INCRBLOB.
12350 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
12360 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 69 6e  sult(interp, "in
12370 63 72 62 6c 6f 62 20 6e 6f 74 20 61 76 61 69 6c  crblob not avail
12380 61 62 6c 65 20 69 6e 20 74 68 69 73 20 62 75 69  able in this bui
12390 6c 64 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  ld", 0);.    ret
123a0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23  urn TCL_ERROR;.#
123b0 65 6c 73 65 0a 20 20 20 20 69 6e 74 20 69 73 52  else.    int isR
123c0 65 61 64 6f 6e 6c 79 20 3d 20 30 3b 0a 20 20 20  eadonly = 0;.   
123d0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
123e0 20 3d 20 22 6d 61 69 6e 22 3b 0a 20 20 20 20 63   = "main";.    c
123f0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 6c  onst char *zTabl
12400 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  e;.    const cha
12410 72 20 2a 7a 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  r *zColumn;.    
12420 54 63 6c 5f 57 69 64 65 49 6e 74 20 69 52 6f 77  Tcl_WideInt iRow
12430 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  ;..    /* Check 
12440 66 6f 72 20 74 68 65 20 2d 72 65 61 64 6f 6e 6c  for the -readonl
12450 79 20 6f 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  y option */.    
12460 69 66 28 20 6f 62 6a 63 3e 33 20 26 26 20 73 74  if( objc>3 && st
12470 72 63 6d 70 28 54 63 6c 5f 47 65 74 53 74 72 69  rcmp(Tcl_GetStri
12480 6e 67 28 6f 62 6a 76 5b 32 5d 29 2c 20 22 2d 72  ng(objv[2]), "-r
12490 65 61 64 6f 6e 6c 79 22 29 3d 3d 30 20 29 7b 0a  eadonly")==0 ){.
124a0 20 20 20 20 20 20 69 73 52 65 61 64 6f 6e 6c 79        isReadonly
124b0 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   = 1;.    }..   
124c0 20 69 66 28 20 6f 62 6a 63 21 3d 28 35 2b 69 73   if( objc!=(5+is
124d0 52 65 61 64 6f 6e 6c 79 29 20 26 26 20 6f 62 6a  Readonly) && obj
124e0 63 21 3d 28 36 2b 69 73 52 65 61 64 6f 6e 6c 79  c!=(6+isReadonly
124f0 29 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57  ) ){.      Tcl_W
12500 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
12510 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 2d  rp, 2, objv, "?-
12520 72 65 61 64 6f 6e 6c 79 3f 20 3f 44 42 3f 20 54  readonly? ?DB? T
12530 41 42 4c 45 20 43 4f 4c 55 4d 4e 20 52 4f 57 49  ABLE COLUMN ROWI
12540 44 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  D");.      retur
12550 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
12560 20 7d 0a 0a 20 20 20 20 69 66 28 20 6f 62 6a 63   }..    if( objc
12570 3d 3d 28 36 2b 69 73 52 65 61 64 6f 6e 6c 79 29  ==(6+isReadonly)
12580 20 29 7b 0a 20 20 20 20 20 20 7a 44 62 20 3d 20   ){.      zDb = 
12590 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
125a0 6a 76 5b 32 5d 29 3b 0a 20 20 20 20 7d 0a 20 20  jv[2]);.    }.  
125b0 20 20 7a 54 61 62 6c 65 20 3d 20 54 63 6c 5f 47    zTable = Tcl_G
125c0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 6f 62  etString(objv[ob
125d0 6a 63 2d 33 5d 29 3b 0a 20 20 20 20 7a 43 6f 6c  jc-3]);.    zCol
125e0 75 6d 6e 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  umn = Tcl_GetStr
125f0 69 6e 67 28 6f 62 6a 76 5b 6f 62 6a 63 2d 32 5d  ing(objv[objc-2]
12600 29 3b 0a 20 20 20 20 72 63 20 3d 20 54 63 6c 5f  );.    rc = Tcl_
12610 47 65 74 57 69 64 65 49 6e 74 46 72 6f 6d 4f 62  GetWideIntFromOb
12620 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 6f  j(interp, objv[o
12630 62 6a 63 2d 31 5d 2c 20 26 69 52 6f 77 29 3b 0a  bjc-1], &iRow);.
12640 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 54 43 4c  .    if( rc==TCL
12650 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
12660 3d 20 63 72 65 61 74 65 49 6e 63 72 62 6c 6f 62  = createIncrblob
12670 43 68 61 6e 6e 65 6c 28 0a 20 20 20 20 20 20 20  Channel(.       
12680 20 20 20 69 6e 74 65 72 70 2c 20 70 44 62 2c 20     interp, pDb, 
12690 7a 44 62 2c 20 7a 54 61 62 6c 65 2c 20 7a 43 6f  zDb, zTable, zCo
126a0 6c 75 6d 6e 2c 20 69 52 6f 77 2c 20 69 73 52 65  lumn, iRow, isRe
126b0 61 64 6f 6e 6c 79 0a 20 20 20 20 20 20 29 3b 0a  adonly.      );.
126c0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
126d0 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
126e0 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20 69  *.  **     $db i
126f0 6e 74 65 72 72 75 70 74 0a 20 20 2a 2a 0a 20 20  nterrupt.  **.  
12700 2a 2a 20 49 6e 74 65 72 72 75 70 74 20 74 68 65  ** Interrupt the
12710 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 74 68   execution of th
12720 65 20 69 6e 6e 65 72 2d 6d 6f 73 74 20 53 51 4c  e inner-most SQL
12730 20 69 6e 74 65 72 70 72 65 74 65 72 2e 20 20 54   interpreter.  T
12740 68 69 73 0a 20 20 2a 2a 20 63 61 75 73 65 73 20  his.  ** causes 
12750 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  the SQL statemen
12760 74 20 74 6f 20 72 65 74 75 72 6e 20 61 6e 20 65  t to return an e
12770 72 72 6f 72 20 6f 66 20 53 51 4c 49 54 45 5f 49  rror of SQLITE_I
12780 4e 54 45 52 52 55 50 54 2e 0a 20 20 2a 2f 0a 20  NTERRUPT..  */. 
12790 20 63 61 73 65 20 44 42 5f 49 4e 54 45 52 52 55   case DB_INTERRU
127a0 50 54 3a 20 7b 0a 20 20 20 20 73 71 6c 69 74 65  PT: {.    sqlite
127b0 33 5f 69 6e 74 65 72 72 75 70 74 28 70 44 62 2d  3_interrupt(pDb-
127c0 3e 64 62 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b  >db);.    break;
127d0 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
127e0 20 20 20 20 24 64 62 20 6e 75 6c 6c 76 61 6c 75      $db nullvalu
127f0 65 20 3f 53 54 52 49 4e 47 3f 0a 20 20 2a 2a 0a  e ?STRING?.  **.
12800 20 20 2a 2a 20 43 68 61 6e 67 65 20 74 65 78 74    ** Change text
12810 20 75 73 65 64 20 77 68 65 6e 20 61 20 4e 55 4c   used when a NUL
12820 4c 20 63 6f 6d 65 73 20 62 61 63 6b 20 66 72 6f  L comes back fro
12830 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  m the database. 
12840 49 66 20 3f 53 54 52 49 4e 47 3f 0a 20 20 2a 2a  If ?STRING?.  **
12850 20 69 73 20 6e 6f 74 20 70 72 65 73 65 6e 74 2c   is not present,
12860 20 74 68 65 6e 20 74 68 65 20 63 75 72 72 65 6e   then the curren
12870 74 20 73 74 72 69 6e 67 20 75 73 65 64 20 66 6f  t string used fo
12880 72 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e  r NULL is return
12890 65 64 2e 0a 20 20 2a 2a 20 49 66 20 53 54 52 49  ed..  ** If STRI
128a0 4e 47 20 69 73 20 70 72 65 73 65 6e 74 2c 20 74  NG is present, t
128b0 68 65 6e 20 53 54 52 49 4e 47 20 69 73 20 72 65  hen STRING is re
128c0 74 75 72 6e 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a  turned..  **.  *
128d0 2f 0a 20 20 63 61 73 65 20 44 42 5f 4e 55 4c 4c  /.  case DB_NULL
128e0 56 41 4c 55 45 3a 20 7b 0a 20 20 20 20 69 66 28  VALUE: {.    if(
128f0 20 6f 62 6a 63 21 3d 32 20 26 26 20 6f 62 6a 63   objc!=2 && objc
12900 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  !=3 ){.      Tcl
12910 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
12920 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22  terp, 2, objv, "
12930 4e 55 4c 4c 56 41 4c 55 45 22 29 3b 0a 20 20 20  NULLVALUE");.   
12940 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
12950 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ROR;.    }.    i
12960 66 28 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20 20  f( objc==3 ){.  
12970 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20      int len;.   
12980 20 20 20 63 68 61 72 20 2a 7a 4e 75 6c 6c 20 3d     char *zNull =
12990 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
129a0 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26  omObj(objv[2], &
129b0 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20  len);.      if( 
129c0 70 44 62 2d 3e 7a 4e 75 6c 6c 20 29 7b 0a 20 20  pDb->zNull ){.  
129d0 20 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70        Tcl_Free(p
129e0 44 62 2d 3e 7a 4e 75 6c 6c 29 3b 0a 20 20 20 20  Db->zNull);.    
129f0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 4e    }.      if( zN
12a00 75 6c 6c 20 26 26 20 6c 65 6e 3e 30 20 29 7b 0a  ull && len>0 ){.
12a10 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e 75          pDb->zNu
12a20 6c 6c 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 20  ll = Tcl_Alloc( 
12a30 6c 65 6e 20 2b 20 31 20 29 3b 0a 20 20 20 20 20  len + 1 );.     
12a40 20 20 20 6d 65 6d 63 70 79 28 70 44 62 2d 3e 7a     memcpy(pDb->z
12a50 4e 75 6c 6c 2c 20 7a 4e 75 6c 6c 2c 20 6c 65 6e  Null, zNull, len
12a60 29 3b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e  );.        pDb->
12a70 7a 4e 75 6c 6c 5b 6c 65 6e 5d 20 3d 20 27 5c 30  zNull[len] = '\0
12a80 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  ';.      }else{.
12a90 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e 75          pDb->zNu
12aa0 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  ll = 0;.      }.
12ab0 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 53 65      }.    Tcl_Se
12ac0 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
12ad0 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  p, Tcl_NewString
12ae0 4f 62 6a 28 70 44 62 2d 3e 7a 4e 75 6c 6c 2c 20  Obj(pDb->zNull, 
12af0 2d 31 29 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b  -1));.    break;
12b00 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
12b10 20 20 20 20 24 64 62 20 6c 61 73 74 5f 69 6e 73      $db last_ins
12b20 65 72 74 5f 72 6f 77 69 64 20 0a 20 20 2a 2a 0a  ert_rowid .  **.
12b30 20 20 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20 69    ** Return an i
12b40 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20  nteger which is 
12b50 74 68 65 20 52 4f 57 49 44 20 66 6f 72 20 74 68  the ROWID for th
12b60 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 69 6e  e most recent in
12b70 73 65 72 74 2e 0a 20 20 2a 2f 0a 20 20 63 61 73  sert..  */.  cas
12b80 65 20 44 42 5f 4c 41 53 54 5f 49 4e 53 45 52 54  e DB_LAST_INSERT
12b90 5f 52 4f 57 49 44 3a 20 7b 0a 20 20 20 20 54 63  _ROWID: {.    Tc
12ba0 6c 5f 4f 62 6a 20 2a 70 52 65 73 75 6c 74 3b 0a  l_Obj *pResult;.
12bb0 20 20 20 20 54 63 6c 5f 57 69 64 65 49 6e 74 20      Tcl_WideInt 
12bc0 72 6f 77 69 64 3b 0a 20 20 20 20 69 66 28 20 6f  rowid;.    if( o
12bd0 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 20 20  bjc!=2 ){.      
12be0 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
12bf0 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76  (interp, 2, objv
12c00 2c 20 22 22 29 3b 0a 20 20 20 20 20 20 72 65 74  , "");.      ret
12c10 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
12c20 20 20 20 7d 0a 20 20 20 20 72 6f 77 69 64 20 3d     }.    rowid =
12c30 20 73 71 6c 69 74 65 33 5f 6c 61 73 74 5f 69 6e   sqlite3_last_in
12c40 73 65 72 74 5f 72 6f 77 69 64 28 70 44 62 2d 3e  sert_rowid(pDb->
12c50 64 62 29 3b 0a 20 20 20 20 70 52 65 73 75 6c 74  db);.    pResult
12c60 20 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73   = Tcl_GetObjRes
12c70 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20  ult(interp);.   
12c80 20 54 63 6c 5f 53 65 74 57 69 64 65 49 6e 74 4f   Tcl_SetWideIntO
12c90 62 6a 28 70 52 65 73 75 6c 74 2c 20 72 6f 77 69  bj(pResult, rowi
12ca0 64 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20  d);.    break;. 
12cb0 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54 68   }..  /*.  ** Th
12cc0 65 20 44 42 5f 4f 4e 45 43 4f 4c 55 4d 4e 20 6d  e DB_ONECOLUMN m
12cd0 65 74 68 6f 64 20 69 73 20 69 6d 70 6c 65 6d 65  ethod is impleme
12ce0 6e 74 65 64 20 74 6f 67 65 74 68 65 72 20 77 69  nted together wi
12cf0 74 68 20 44 42 5f 45 58 49 53 54 53 2e 0a 20 20  th DB_EXISTS..  
12d00 2a 2f 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20  */..  /*    $db 
12d10 70 72 6f 67 72 65 73 73 20 3f 4e 20 43 41 4c 4c  progress ?N CALL
12d20 42 41 43 4b 3f 0a 20 20 2a 2a 20 0a 20 20 2a 2a  BACK?.  ** .  **
12d30 20 49 6e 76 6f 6b 65 20 74 68 65 20 67 69 76 65   Invoke the give
12d40 6e 20 63 61 6c 6c 62 61 63 6b 20 65 76 65 72 79  n callback every
12d50 20 4e 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69   N virtual machi
12d60 6e 65 20 6f 70 63 6f 64 65 73 20 77 68 69 6c 65  ne opcodes while
12d70 20 65 78 65 63 75 74 69 6e 67 0a 20 20 2a 2a 20   executing.  ** 
12d80 71 75 65 72 69 65 73 2e 0a 20 20 2a 2f 0a 20 20  queries..  */.  
12d90 63 61 73 65 20 44 42 5f 50 52 4f 47 52 45 53 53  case DB_PROGRESS
12da0 3a 20 7b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63  : {.    if( objc
12db0 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==2 ){.      if(
12dc0 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 20   pDb->zProgress 
12dd0 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41  ){.        Tcl_A
12de0 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
12df0 72 70 2c 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65  rp, pDb->zProgre
12e00 73 73 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  ss, 0);.      }.
12e10 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 62      }else if( ob
12e20 6a 63 3d 3d 34 20 29 7b 0a 20 20 20 20 20 20 63  jc==4 ){.      c
12e30 68 61 72 20 2a 7a 50 72 6f 67 72 65 73 73 3b 0a  har *zProgress;.
12e40 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20        int len;. 
12e50 20 20 20 20 20 69 6e 74 20 4e 3b 0a 20 20 20 20       int N;.    
12e60 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63    if( TCL_OK!=Tc
12e70 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
12e80 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c  interp, objv[2],
12e90 20 26 4e 29 20 29 7b 0a 20 20 20 20 20 20 20 20   &N) ){.        
12ea0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
12eb0 3b 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20  ;.      };.     
12ec0 20 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f 67 72   if( pDb->zProgr
12ed0 65 73 73 20 29 7b 0a 20 20 20 20 20 20 20 20 54  ess ){.        T
12ee0 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 50 72  cl_Free(pDb->zPr
12ef0 6f 67 72 65 73 73 29 3b 0a 20 20 20 20 20 20 7d  ogress);.      }
12f00 0a 20 20 20 20 20 20 7a 50 72 6f 67 72 65 73 73  .      zProgress
12f10 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
12f20 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d 2c  FromObj(objv[3],
12f30 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69 66   &len);.      if
12f40 28 20 7a 50 72 6f 67 72 65 73 73 20 26 26 20 6c  ( zProgress && l
12f50 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  en>0 ){.        
12f60 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73 20 3d  pDb->zProgress =
12f70 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20   Tcl_Alloc( len 
12f80 2b 20 31 20 29 3b 0a 20 20 20 20 20 20 20 20 6d  + 1 );.        m
12f90 65 6d 63 70 79 28 70 44 62 2d 3e 7a 50 72 6f 67  emcpy(pDb->zProg
12fa0 72 65 73 73 2c 20 7a 50 72 6f 67 72 65 73 73 2c  ress, zProgress,
12fb0 20 6c 65 6e 2b 31 29 3b 0a 20 20 20 20 20 20 7d   len+1);.      }
12fc0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 44  else{.        pD
12fd0 62 2d 3e 7a 50 72 6f 67 72 65 73 73 20 3d 20 30  b->zProgress = 0
12fe0 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65  ;.      }.#ifnde
12ff0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 52  f SQLITE_OMIT_PR
13000 4f 47 52 45 53 53 5f 43 41 4c 4c 42 41 43 4b 0a  OGRESS_CALLBACK.
13010 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a        if( pDb->z
13020 50 72 6f 67 72 65 73 73 20 29 7b 0a 20 20 20 20  Progress ){.    
13030 20 20 20 20 70 44 62 2d 3e 69 6e 74 65 72 70 20      pDb->interp 
13040 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 20 20  = interp;.      
13050 20 20 73 71 6c 69 74 65 33 5f 70 72 6f 67 72 65    sqlite3_progre
13060 73 73 5f 68 61 6e 64 6c 65 72 28 70 44 62 2d 3e  ss_handler(pDb->
13070 64 62 2c 20 4e 2c 20 44 62 50 72 6f 67 72 65 73  db, N, DbProgres
13080 73 48 61 6e 64 6c 65 72 2c 20 70 44 62 29 3b 0a  sHandler, pDb);.
13090 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
130a0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 70 72 6f       sqlite3_pro
130b0 67 72 65 73 73 5f 68 61 6e 64 6c 65 72 28 70 44  gress_handler(pD
130c0 62 2d 3e 64 62 2c 20 30 2c 20 30 2c 20 30 29 3b  b->db, 0, 0, 0);
130d0 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
130e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
130f0 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
13100 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a  s(interp, 2, obj
13110 76 2c 20 22 4e 20 43 41 4c 4c 42 41 43 4b 22 29  v, "N CALLBACK")
13120 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
13130 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
13140 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
13150 20 20 2f 2a 20 20 20 20 24 64 62 20 70 72 6f 66    /*    $db prof
13160 69 6c 65 20 3f 43 41 4c 4c 42 41 43 4b 3f 0a 20  ile ?CALLBACK?. 
13170 20 2a 2a 0a 20 20 2a 2a 20 4d 61 6b 65 20 61 72   **.  ** Make ar
13180 72 61 6e 67 65 6d 65 6e 74 73 20 74 6f 20 69 6e  rangements to in
13190 76 6f 6b 65 20 74 68 65 20 43 41 4c 4c 42 41 43  voke the CALLBAC
131a0 4b 20 72 6f 75 74 69 6e 65 20 61 66 74 65 72 20  K routine after 
131b0 65 61 63 68 20 53 51 4c 20 73 74 61 74 65 6d 65  each SQL stateme
131c0 6e 74 0a 20 20 2a 2a 20 74 68 61 74 20 68 61 73  nt.  ** that has
131d0 20 72 75 6e 2e 20 20 54 68 65 20 74 65 78 74 20   run.  The text 
131e0 6f 66 20 74 68 65 20 53 51 4c 20 61 6e 64 20 74  of the SQL and t
131f0 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 65 6c 61  he amount of ela
13200 70 73 65 20 74 69 6d 65 20 61 72 65 0a 20 20 2a  pse time are.  *
13210 2a 20 61 70 70 65 6e 64 65 64 20 74 6f 20 43 41  * appended to CA
13220 4c 4c 42 41 43 4b 20 62 65 66 6f 72 65 20 74 68  LLBACK before th
13230 65 20 73 63 72 69 70 74 20 69 73 20 72 75 6e 2e  e script is run.
13240 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f  .  */.  case DB_
13250 50 52 4f 46 49 4c 45 3a 20 7b 0a 20 20 20 20 69  PROFILE: {.    i
13260 66 28 20 6f 62 6a 63 3e 33 20 29 7b 0a 20 20 20  f( objc>3 ){.   
13270 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
13280 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
13290 62 6a 76 2c 20 22 3f 43 41 4c 4c 42 41 43 4b 3f  bjv, "?CALLBACK?
132a0 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
132b0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
132c0 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d  }else if( objc==
132d0 32 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  2 ){.      if( p
132e0 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 20 29 7b 0a  Db->zProfile ){.
132f0 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65          Tcl_Appe
13300 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
13310 20 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 2c 20   pDb->zProfile, 
13320 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
13330 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61  }else{.      cha
13340 72 20 2a 7a 50 72 6f 66 69 6c 65 3b 0a 20 20 20  r *zProfile;.   
13350 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20     int len;.    
13360 20 20 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f 66    if( pDb->zProf
13370 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 54  ile ){.        T
13380 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 50 72  cl_Free(pDb->zPr
13390 6f 66 69 6c 65 29 3b 0a 20 20 20 20 20 20 7d 0a  ofile);.      }.
133a0 20 20 20 20 20 20 7a 50 72 6f 66 69 6c 65 20 3d        zProfile =
133b0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
133c0 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26  omObj(objv[2], &
133d0 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20  len);.      if( 
133e0 7a 50 72 6f 66 69 6c 65 20 26 26 20 6c 65 6e 3e  zProfile && len>
133f0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62  0 ){.        pDb
13400 2d 3e 7a 50 72 6f 66 69 6c 65 20 3d 20 54 63 6c  ->zProfile = Tcl
13410 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20 31 20  _Alloc( len + 1 
13420 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  );.        memcp
13430 79 28 70 44 62 2d 3e 7a 50 72 6f 66 69 6c 65 2c  y(pDb->zProfile,
13440 20 7a 50 72 6f 66 69 6c 65 2c 20 6c 65 6e 2b 31   zProfile, len+1
13450 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
13460 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 50 72          pDb->zPr
13470 6f 66 69 6c 65 20 3d 20 30 3b 0a 20 20 20 20 20  ofile = 0;.     
13480 20 7d 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28   }.#if !defined(
13490 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43  SQLITE_OMIT_TRAC
134a0 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  E) && !defined(S
134b0 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54  QLITE_OMIT_FLOAT
134c0 49 4e 47 5f 50 4f 49 4e 54 29 0a 20 20 20 20 20  ING_POINT).     
134d0 20 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f 66 69   if( pDb->zProfi
134e0 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44  le ){.        pD
134f0 62 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65  b->interp = inte
13500 72 70 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  rp;.        sqli
13510 74 65 33 5f 70 72 6f 66 69 6c 65 28 70 44 62 2d  te3_profile(pDb-
13520 3e 64 62 2c 20 44 62 50 72 6f 66 69 6c 65 48 61  >db, DbProfileHa
13530 6e 64 6c 65 72 2c 20 70 44 62 29 3b 0a 20 20 20  ndler, pDb);.   
13540 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
13550 20 20 73 71 6c 69 74 65 33 5f 70 72 6f 66 69 6c    sqlite3_profil
13560 65 28 70 44 62 2d 3e 64 62 2c 20 30 2c 20 30 29  e(pDb->db, 0, 0)
13570 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
13580 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b  .    }.    break
13590 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ;.  }..  /*.  **
135a0 20 20 20 20 20 24 64 62 20 72 65 6b 65 79 20 4b       $db rekey K
135b0 45 59 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 68 61  EY.  **.  ** Cha
135c0 6e 67 65 20 74 68 65 20 65 6e 63 72 79 70 74 69  nge the encrypti
135d0 6f 6e 20 6b 65 79 20 6f 6e 20 74 68 65 20 63 75  on key on the cu
135e0 72 72 65 6e 74 6c 79 20 6f 70 65 6e 20 64 61 74  rrently open dat
135f0 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 63 61  abase..  */.  ca
13600 73 65 20 44 42 5f 52 45 4b 45 59 3a 20 7b 0a 23  se DB_REKEY: {.#
13610 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53  ifdef SQLITE_HAS
13620 5f 43 4f 44 45 43 0a 20 20 20 20 69 6e 74 20 6e  _CODEC.    int n
13630 4b 65 79 3b 0a 20 20 20 20 76 6f 69 64 20 2a 70  Key;.    void *p
13640 4b 65 79 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  Key;.#endif.    
13650 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20  if( objc!=3 ){. 
13660 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
13670 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
13680 20 6f 62 6a 76 2c 20 22 4b 45 59 22 29 3b 0a 20   objv, "KEY");. 
13690 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
136a0 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 23 69 66  ERROR;.    }.#if
136b0 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43  def SQLITE_HAS_C
136c0 4f 44 45 43 0a 20 20 20 20 70 4b 65 79 20 3d 20  ODEC.    pKey = 
136d0 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79  Tcl_GetByteArray
136e0 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c  FromObj(objv[2],
136f0 20 26 6e 4b 65 79 29 3b 0a 20 20 20 20 72 63 20   &nKey);.    rc 
13700 3d 20 73 71 6c 69 74 65 33 5f 72 65 6b 65 79 28  = sqlite3_rekey(
13710 70 44 62 2d 3e 64 62 2c 20 70 4b 65 79 2c 20 6e  pDb->db, pKey, n
13720 4b 65 79 29 3b 0a 20 20 20 20 69 66 28 20 72 63  Key);.    if( rc
13730 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70   ){.      Tcl_Ap
13740 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
13750 70 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 73 74  p, sqlite3_errst
13760 72 28 72 63 29 2c 20 30 29 3b 0a 20 20 20 20 20  r(rc), 0);.     
13770 20 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b   rc = TCL_ERROR;
13780 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
13790 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
137a0 2f 2a 20 20 20 20 24 64 62 20 72 65 73 74 6f 72  /*    $db restor
137b0 65 20 3f 44 41 54 41 42 41 53 45 3f 20 46 49 4c  e ?DATABASE? FIL
137c0 45 4e 41 4d 45 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ENAME.  **.  ** 
137d0 4f 70 65 6e 20 61 20 64 61 74 61 62 61 73 65 20  Open a database 
137e0 66 69 6c 65 20 6e 61 6d 65 64 20 46 49 4c 45 4e  file named FILEN
137f0 41 4d 45 2e 20 20 54 72 61 6e 73 66 65 72 20 74  AME.  Transfer t
13800 68 65 20 63 6f 6e 74 65 6e 74 20 0a 20 20 2a 2a  he content .  **
13810 20 6f 66 20 46 49 4c 45 4e 41 4d 45 20 69 6e 74   of FILENAME int
13820 6f 20 74 68 65 20 6c 6f 63 61 6c 20 64 61 74 61  o the local data
13830 62 61 73 65 20 44 41 54 41 42 41 53 45 20 28 64  base DATABASE (d
13840 65 66 61 75 6c 74 3a 20 22 6d 61 69 6e 22 29 2e  efault: "main").
13850 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f  .  */.  case DB_
13860 52 45 53 54 4f 52 45 3a 20 7b 0a 20 20 20 20 63  RESTORE: {.    c
13870 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 72 63 46  onst char *zSrcF
13880 69 6c 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ile;.    const c
13890 68 61 72 20 2a 7a 44 65 73 74 44 62 3b 0a 20 20  har *zDestDb;.  
138a0 20 20 73 71 6c 69 74 65 33 20 2a 70 53 72 63 3b    sqlite3 *pSrc;
138b0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 61 63  .    sqlite3_bac
138c0 6b 75 70 20 2a 70 42 61 63 6b 75 70 3b 0a 20 20  kup *pBackup;.  
138d0 20 20 69 6e 74 20 6e 54 69 6d 65 6f 75 74 20 3d    int nTimeout =
138e0 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 6f 62 6a   0;..    if( obj
138f0 63 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20 7a 44  c==3 ){.      zD
13900 65 73 74 44 62 20 3d 20 22 6d 61 69 6e 22 3b 0a  estDb = "main";.
13910 20 20 20 20 20 20 7a 53 72 63 46 69 6c 65 20 3d        zSrcFile =
13920 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
13930 62 6a 76 5b 32 5d 29 3b 0a 20 20 20 20 7d 65 6c  bjv[2]);.    }el
13940 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d 34 20 29  se if( objc==4 )
13950 7b 0a 20 20 20 20 20 20 7a 44 65 73 74 44 62 20  {.      zDestDb 
13960 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  = Tcl_GetString(
13970 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 20 20 20 20  objv[2]);.      
13980 7a 53 72 63 46 69 6c 65 20 3d 20 54 63 6c 5f 47  zSrcFile = Tcl_G
13990 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d  etString(objv[3]
139a0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
139b0 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
139c0 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20  Args(interp, 2, 
139d0 6f 62 6a 76 2c 20 22 3f 44 41 54 41 42 41 53 45  objv, "?DATABASE
139e0 3f 20 46 49 4c 45 4e 41 4d 45 22 29 3b 0a 20 20  ? FILENAME");.  
139f0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
13a00 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
13a10 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 6f 70 65  rc = sqlite3_ope
13a20 6e 5f 76 32 28 7a 53 72 63 46 69 6c 65 2c 20 26  n_v2(zSrcFile, &
13a30 70 53 72 63 2c 20 53 51 4c 49 54 45 5f 4f 50 45  pSrc, SQLITE_OPE
13a40 4e 5f 52 45 41 44 4f 4e 4c 59 2c 20 30 29 3b 0a  N_READONLY, 0);.
13a50 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
13a60 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 54  TE_OK ){.      T
13a70 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
13a80 69 6e 74 65 72 70 2c 20 22 63 61 6e 6e 6f 74 20  interp, "cannot 
13a90 6f 70 65 6e 20 73 6f 75 72 63 65 20 64 61 74 61  open source data
13aa0 62 61 73 65 3a 20 22 2c 0a 20 20 20 20 20 20 20  base: ",.       
13ab0 20 20 20 20 73 71 6c 69 74 65 33 5f 65 72 72 6d      sqlite3_errm
13ac0 73 67 28 70 53 72 63 29 2c 20 28 63 68 61 72 2a  sg(pSrc), (char*
13ad0 29 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  )0);.      sqlit
13ae0 65 33 5f 63 6c 6f 73 65 28 70 53 72 63 29 3b 0a  e3_close(pSrc);.
13af0 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
13b00 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
13b10 20 20 70 42 61 63 6b 75 70 20 3d 20 73 71 6c 69    pBackup = sqli
13b20 74 65 33 5f 62 61 63 6b 75 70 5f 69 6e 69 74 28  te3_backup_init(
13b30 70 44 62 2d 3e 64 62 2c 20 7a 44 65 73 74 44 62  pDb->db, zDestDb
13b40 2c 20 70 53 72 63 2c 20 22 6d 61 69 6e 22 29 3b  , pSrc, "main");
13b50 0a 20 20 20 20 69 66 28 20 70 42 61 63 6b 75 70  .    if( pBackup
13b60 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  ==0 ){.      Tcl
13b70 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
13b80 74 65 72 70 2c 20 22 72 65 73 74 6f 72 65 20 66  terp, "restore f
13b90 61 69 6c 65 64 3a 20 22 2c 0a 20 20 20 20 20 20  ailed: ",.      
13ba0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65 72 72       sqlite3_err
13bb0 6d 73 67 28 70 44 62 2d 3e 64 62 29 2c 20 28 63  msg(pDb->db), (c
13bc0 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 73  har*)0);.      s
13bd0 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70 53 72  qlite3_close(pSr
13be0 63 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  c);.      return
13bf0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
13c00 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 28 72 63  }.    while( (rc
13c10 20 3d 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75   = sqlite3_backu
13c20 70 5f 73 74 65 70 28 70 42 61 63 6b 75 70 2c 31  p_step(pBackup,1
13c30 30 30 29 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a  00))==SQLITE_OK.
13c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c                ||
13c50 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59   rc==SQLITE_BUSY
13c60 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 72 63   ){.      if( rc
13c70 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b  ==SQLITE_BUSY ){
13c80 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 54 69  .        if( nTi
13c90 6d 65 6f 75 74 2b 2b 20 3e 3d 20 33 20 29 20 62  meout++ >= 3 ) b
13ca0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 73 71  reak;.        sq
13cb0 6c 69 74 65 33 5f 73 6c 65 65 70 28 31 30 30 29  lite3_sleep(100)
13cc0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
13cd0 20 20 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b      sqlite3_back
13ce0 75 70 5f 66 69 6e 69 73 68 28 70 42 61 63 6b 75  up_finish(pBacku
13cf0 70 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  p);.    if( rc==
13d00 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20  SQLITE_DONE ){. 
13d10 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 4f 4b       rc = TCL_OK
13d20 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
13d30 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc==SQLITE_BUSY 
13d40 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4c 4f  || rc==SQLITE_LO
13d50 43 4b 45 44 20 29 7b 0a 20 20 20 20 20 20 54 63  CKED ){.      Tc
13d60 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
13d70 6e 74 65 72 70 2c 20 22 72 65 73 74 6f 72 65 20  nterp, "restore 
13d80 66 61 69 6c 65 64 3a 20 73 6f 75 72 63 65 20 64  failed: source d
13d90 61 74 61 62 61 73 65 20 62 75 73 79 22 2c 0a 20  atabase busy",. 
13da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13db0 20 20 20 20 20 20 28 63 68 61 72 2a 29 30 29 3b        (char*)0);
13dc0 0a 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f  .      rc = TCL_
13dd0 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73 65  ERROR;.    }else
13de0 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65  {.      Tcl_Appe
13df0 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
13e00 20 22 72 65 73 74 6f 72 65 20 66 61 69 6c 65 64   "restore failed
13e10 3a 20 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  : ",.           
13e20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70  sqlite3_errmsg(p
13e30 44 62 2d 3e 64 62 29 2c 20 28 63 68 61 72 2a 29  Db->db), (char*)
13e40 30 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 54  0);.      rc = T
13e50 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
13e60 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73      sqlite3_clos
13e70 65 28 70 53 72 63 29 3b 0a 20 20 20 20 62 72 65  e(pSrc);.    bre
13e80 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  ak;.  }..  /*.  
13e90 2a 2a 20 20 20 20 20 24 64 62 20 73 74 61 74 75  **     $db statu
13ea0 73 20 28 73 74 65 70 7c 73 6f 72 74 7c 61 75 74  s (step|sort|aut
13eb0 6f 69 6e 64 65 78 29 0a 20 20 2a 2a 0a 20 20 2a  oindex).  **.  *
13ec0 2a 20 44 69 73 70 6c 61 79 20 53 51 4c 49 54 45  * Display SQLITE
13ed0 5f 53 54 4d 54 53 54 41 54 55 53 5f 46 55 4c 4c  _STMTSTATUS_FULL
13ee0 53 43 41 4e 5f 53 54 45 50 20 6f 72 20 0a 20 20  SCAN_STEP or .  
13ef0 2a 2a 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54  ** SQLITE_STMTST
13f00 41 54 55 53 5f 53 4f 52 54 20 66 6f 72 20 74 68  ATUS_SORT for th
13f10 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 65 76  e most recent ev
13f20 61 6c 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  al..  */.  case 
13f30 44 42 5f 53 54 41 54 55 53 3a 20 7b 0a 20 20 20  DB_STATUS: {.   
13f40 20 69 6e 74 20 76 3b 0a 20 20 20 20 63 6f 6e 73   int v;.    cons
13f50 74 20 63 68 61 72 20 2a 7a 4f 70 3b 0a 20 20 20  t char *zOp;.   
13f60 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a   if( objc!=3 ){.
13f70 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
13f80 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
13f90 2c 20 6f 62 6a 76 2c 20 22 28 73 74 65 70 7c 73  , objv, "(step|s
13fa0 6f 72 74 7c 61 75 74 6f 69 6e 64 65 78 29 22 29  ort|autoindex)")
13fb0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
13fc0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
13fd0 20 20 20 20 7a 4f 70 20 3d 20 54 63 6c 5f 47 65      zOp = Tcl_Ge
13fe0 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29  tString(objv[2])
13ff0 3b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70  ;.    if( strcmp
14000 28 7a 4f 70 2c 20 22 73 74 65 70 22 29 3d 3d 30  (zOp, "step")==0
14010 20 29 7b 0a 20 20 20 20 20 20 76 20 3d 20 70 44   ){.      v = pD
14020 62 2d 3e 6e 53 74 65 70 3b 0a 20 20 20 20 7d 65  b->nStep;.    }e
14030 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a  lse if( strcmp(z
14040 4f 70 2c 20 22 73 6f 72 74 22 29 3d 3d 30 20 29  Op, "sort")==0 )
14050 7b 0a 20 20 20 20 20 20 76 20 3d 20 70 44 62 2d  {.      v = pDb-
14060 3e 6e 53 6f 72 74 3b 0a 20 20 20 20 7d 65 6c 73  >nSort;.    }els
14070 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4f 70  e if( strcmp(zOp
14080 2c 20 22 61 75 74 6f 69 6e 64 65 78 22 29 3d 3d  , "autoindex")==
14090 30 20 29 7b 0a 20 20 20 20 20 20 76 20 3d 20 70  0 ){.      v = p
140a0 44 62 2d 3e 6e 49 6e 64 65 78 3b 0a 20 20 20 20  Db->nIndex;.    
140b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 54 63 6c  }else{.      Tcl
140c0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
140d0 74 65 72 70 2c 20 0a 20 20 20 20 20 20 20 20 20  terp, .         
140e0 20 20 20 22 62 61 64 20 61 72 67 75 6d 65 6e 74     "bad argument
140f0 3a 20 73 68 6f 75 6c 64 20 62 65 20 61 75 74 6f  : should be auto
14100 69 6e 64 65 78 2c 20 73 74 65 70 2c 20 6f 72 20  index, step, or 
14110 73 6f 72 74 22 2c 20 0a 20 20 20 20 20 20 20 20  sort", .        
14120 20 20 20 20 28 63 68 61 72 2a 29 30 29 3b 0a 20      (char*)0);. 
14130 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
14140 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
14150 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
14160 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
14170 77 49 6e 74 4f 62 6a 28 76 29 29 3b 0a 20 20 20  wIntObj(v));.   
14180 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 0a 20   break;.  }.  . 
14190 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62   /*.  **     $db
141a0 20 74 69 6d 65 6f 75 74 20 4d 49 4c 4c 45 53 45   timeout MILLESE
141b0 43 4f 4e 44 53 0a 20 20 2a 2a 0a 20 20 2a 2a 20  CONDS.  **.  ** 
141c0 44 65 6c 61 79 20 66 6f 72 20 74 68 65 20 6e 75  Delay for the nu
141d0 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73 65 63  mber of millisec
141e0 6f 6e 64 73 20 73 70 65 63 69 66 69 65 64 20 77  onds specified w
141f0 68 65 6e 20 61 20 66 69 6c 65 20 69 73 20 6c 6f  hen a file is lo
14200 63 6b 65 64 2e 0a 20 20 2a 2f 0a 20 20 63 61 73  cked..  */.  cas
14210 65 20 44 42 5f 54 49 4d 45 4f 55 54 3a 20 7b 0a  e DB_TIMEOUT: {.
14220 20 20 20 20 69 6e 74 20 6d 73 3b 0a 20 20 20 20      int ms;.    
14230 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20  if( objc!=3 ){. 
14240 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
14250 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
14260 20 6f 62 6a 76 2c 20 22 4d 49 4c 4c 49 53 45 43   objv, "MILLISEC
14270 4f 4e 44 53 22 29 3b 0a 20 20 20 20 20 20 72 65  ONDS");.      re
14280 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
14290 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 54 63      }.    if( Tc
142a0 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
142b0 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c  interp, objv[2],
142c0 20 26 6d 73 29 20 29 20 72 65 74 75 72 6e 20 54   &ms) ) return T
142d0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 73 71  CL_ERROR;.    sq
142e0 6c 69 74 65 33 5f 62 75 73 79 5f 74 69 6d 65 6f  lite3_busy_timeo
142f0 75 74 28 70 44 62 2d 3e 64 62 2c 20 6d 73 29 3b  ut(pDb->db, ms);
14300 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
14310 20 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20    .  /*.  **    
14320 20 24 64 62 20 74 6f 74 61 6c 5f 63 68 61 6e 67   $db total_chang
14330 65 73 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74  es.  **.  ** Ret
14340 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
14350 66 20 72 6f 77 73 20 74 68 61 74 20 77 65 72 65  f rows that were
14360 20 6d 6f 64 69 66 69 65 64 2c 20 69 6e 73 65 72   modified, inser
14370 74 65 64 2c 20 6f 72 20 64 65 6c 65 74 65 64 20  ted, or deleted 
14380 0a 20 20 2a 2a 20 73 69 6e 63 65 20 74 68 65 20  .  ** since the 
14390 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
143a0 77 61 73 20 63 72 65 61 74 65 64 2e 0a 20 20 2a  was created..  *
143b0 2f 0a 20 20 63 61 73 65 20 44 42 5f 54 4f 54 41  /.  case DB_TOTA
143c0 4c 5f 43 48 41 4e 47 45 53 3a 20 7b 0a 20 20 20  L_CHANGES: {.   
143d0 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 73 75 6c   Tcl_Obj *pResul
143e0 74 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21  t;.    if( objc!
143f0 3d 32 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  =2 ){.      Tcl_
14400 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
14410 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 22  erp, 2, objv, ""
14420 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
14430 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
14440 0a 20 20 20 20 70 52 65 73 75 6c 74 20 3d 20 54  .    pResult = T
14450 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_GetObjResult(
14460 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c  interp);.    Tcl
14470 5f 53 65 74 49 6e 74 4f 62 6a 28 70 52 65 73 75  _SetIntObj(pResu
14480 6c 74 2c 20 73 71 6c 69 74 65 33 5f 74 6f 74 61  lt, sqlite3_tota
14490 6c 5f 63 68 61 6e 67 65 73 28 70 44 62 2d 3e 64  l_changes(pDb->d
144a0 62 29 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a  b));.    break;.
144b0 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62    }..  /*    $db
144c0 20 74 72 61 63 65 20 3f 43 41 4c 4c 42 41 43 4b   trace ?CALLBACK
144d0 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 61 6b 65  ?.  **.  ** Make
144e0 20 61 72 72 61 6e 67 65 6d 65 6e 74 73 20 74 6f   arrangements to
144f0 20 69 6e 76 6f 6b 65 20 74 68 65 20 43 41 4c 4c   invoke the CALL
14500 42 41 43 4b 20 72 6f 75 74 69 6e 65 20 66 6f 72  BACK routine for
14510 20 65 61 63 68 20 53 51 4c 20 73 74 61 74 65 6d   each SQL statem
14520 65 6e 74 0a 20 20 2a 2a 20 74 68 61 74 20 69 73  ent.  ** that is
14530 20 65 78 65 63 75 74 65 64 2e 20 20 54 68 65 20   executed.  The 
14540 74 65 78 74 20 6f 66 20 74 68 65 20 53 51 4c 20  text of the SQL 
14550 69 73 20 61 70 70 65 6e 64 65 64 20 74 6f 20 43  is appended to C
14560 41 4c 4c 42 41 43 4b 20 62 65 66 6f 72 65 0a 20  ALLBACK before. 
14570 20 2a 2a 20 69 74 20 69 73 20 65 78 65 63 75 74   ** it is execut
14580 65 64 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  ed..  */.  case 
14590 44 42 5f 54 52 41 43 45 3a 20 7b 0a 20 20 20 20  DB_TRACE: {.    
145a0 69 66 28 20 6f 62 6a 63 3e 33 20 29 7b 0a 20 20  if( objc>3 ){.  
145b0 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
145c0 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20  Args(interp, 2, 
145d0 6f 62 6a 76 2c 20 22 3f 43 41 4c 4c 42 41 43 4b  objv, "?CALLBACK
145e0 3f 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ?");.      retur
145f0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
14600 20 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d   }else if( objc=
14610 3d 32 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =2 ){.      if( 
14620 70 44 62 2d 3e 7a 54 72 61 63 65 20 29 7b 0a 20  pDb->zTrace ){. 
14630 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e         Tcl_Appen
14640 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
14650 70 44 62 2d 3e 7a 54 72 61 63 65 2c 20 30 29 3b  pDb->zTrace, 0);
14660 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
14670 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  se{.      char *
14680 7a 54 72 61 63 65 3b 0a 20 20 20 20 20 20 69 6e  zTrace;.      in
14690 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20 69 66 28  t len;.      if(
146a0 20 70 44 62 2d 3e 7a 54 72 61 63 65 20 29 7b 0a   pDb->zTrace ){.
146b0 20 20 20 20 20 20 20 20 54 63 6c 5f 46 72 65 65          Tcl_Free
146c0 28 70 44 62 2d 3e 7a 54 72 61 63 65 29 3b 0a 20  (pDb->zTrace);. 
146d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 54 72       }.      zTr
146e0 61 63 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  ace = Tcl_GetStr
146f0 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
14700 32 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20  2], &len);.     
14710 20 69 66 28 20 7a 54 72 61 63 65 20 26 26 20 6c   if( zTrace && l
14720 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  en>0 ){.        
14730 70 44 62 2d 3e 7a 54 72 61 63 65 20 3d 20 54 63  pDb->zTrace = Tc
14740 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20 31  l_Alloc( len + 1
14750 20 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63   );.        memc
14760 70 79 28 70 44 62 2d 3e 7a 54 72 61 63 65 2c 20  py(pDb->zTrace, 
14770 7a 54 72 61 63 65 2c 20 6c 65 6e 2b 31 29 3b 0a  zTrace, len+1);.
14780 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
14790 20 20 20 20 20 70 44 62 2d 3e 7a 54 72 61 63 65       pDb->zTrace
147a0 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23 69   = 0;.      }.#i
147b0 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
147c0 45 5f 4f 4d 49 54 5f 54 52 41 43 45 29 20 26 26  E_OMIT_TRACE) &&
147d0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
147e0 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50  _OMIT_FLOATING_P
147f0 4f 49 4e 54 29 0a 20 20 20 20 20 20 69 66 28 20  OINT).      if( 
14800 70 44 62 2d 3e 7a 54 72 61 63 65 20 29 7b 0a 20  pDb->zTrace ){. 
14810 20 20 20 20 20 20 20 70 44 62 2d 3e 69 6e 74 65         pDb->inte
14820 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20  rp = interp;.   
14830 20 20 20 20 20 73 71 6c 69 74 65 33 5f 74 72 61       sqlite3_tra
14840 63 65 28 70 44 62 2d 3e 64 62 2c 20 44 62 54 72  ce(pDb->db, DbTr
14850 61 63 65 48 61 6e 64 6c 65 72 2c 20 70 44 62 29  aceHandler, pDb)
14860 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
14870 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 74         sqlite3_t
14880 72 61 63 65 28 70 44 62 2d 3e 64 62 2c 20 30 2c  race(pDb->db, 0,
14890 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e   0);.      }.#en
148a0 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 62 72  dif.    }.    br
148b0 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20  eak;.  }..  /*  
148c0 20 20 24 64 62 20 74 72 61 6e 73 61 63 74 69 6f    $db transactio
148d0 6e 20 5b 2d 64 65 66 65 72 72 65 64 7c 2d 69 6d  n [-deferred|-im
148e0 6d 65 64 69 61 74 65 7c 2d 65 78 63 6c 75 73 69  mediate|-exclusi
148f0 76 65 5d 20 53 43 52 49 50 54 0a 20 20 2a 2a 0a  ve] SCRIPT.  **.
14900 20 20 2a 2a 20 53 74 61 72 74 20 61 20 6e 65 77    ** Start a new
14910 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 28 69 66   transaction (if
14920 20 77 65 20 61 72 65 20 6e 6f 74 20 61 6c 72 65   we are not alre
14930 61 64 79 20 69 6e 20 74 68 65 20 6d 69 64 73 74  ady in the midst
14940 20 6f 66 20 61 0a 20 20 2a 2a 20 74 72 61 6e 73   of a.  ** trans
14950 61 63 74 69 6f 6e 29 20 61 6e 64 20 65 78 65 63  action) and exec
14960 75 74 65 20 74 68 65 20 54 43 4c 20 73 63 72 69  ute the TCL scri
14970 70 74 20 53 43 52 49 50 54 2e 20 20 41 66 74 65  pt SCRIPT.  Afte
14980 72 20 53 43 52 49 50 54 0a 20 20 2a 2a 20 63 6f  r SCRIPT.  ** co
14990 6d 70 6c 65 74 65 73 2c 20 65 69 74 68 65 72 20  mpletes, either 
149a0 63 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73  commit the trans
149b0 61 63 74 69 6f 6e 20 6f 72 20 72 6f 6c 6c 20 69  action or roll i
149c0 74 20 62 61 63 6b 20 69 66 20 53 43 52 49 50 54  t back if SCRIPT
149d0 0a 20 20 2a 2a 20 74 68 72 6f 77 73 20 61 6e 20  .  ** throws an 
149e0 65 78 63 65 70 74 69 6f 6e 2e 20 20 4f 72 20 69  exception.  Or i
149f0 66 20 6e 6f 20 6e 65 77 20 74 72 61 6e 73 61 74  f no new transat
14a00 69 6f 6e 20 77 61 73 20 73 74 61 72 74 65 64 2c  ion was started,
14a10 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 0a 20 20 2a   do nothing..  *
14a20 2a 20 70 61 73 73 20 74 68 65 20 65 78 63 65 70  * pass the excep
14a30 74 69 6f 6e 20 6f 6e 20 75 70 20 74 68 65 20 73  tion on up the s
14a40 74 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  tack..  **.  ** 
14a50 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20 77 61 73  This command was
14a60 20 69 6e 73 70 69 72 65 64 20 62 79 20 44 61 76   inspired by Dav
14a70 65 20 54 68 6f 6d 61 73 27 73 20 74 61 6c 6b 20  e Thomas's talk 
14a80 6f 6e 20 52 75 62 79 20 61 74 20 74 68 65 0a 20  on Ruby at the. 
14a90 20 2a 2a 20 32 30 30 35 20 4f 27 52 65 69 6c 6c   ** 2005 O'Reill
14aa0 79 20 4f 70 65 6e 20 53 6f 75 72 63 65 20 43 6f  y Open Source Co
14ab0 6e 76 65 6e 74 69 6f 6e 20 28 4f 53 43 4f 4e 29  nvention (OSCON)
14ac0 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  ..  */.  case DB
14ad0 5f 54 52 41 4e 53 41 43 54 49 4f 4e 3a 20 7b 0a  _TRANSACTION: {.
14ae0 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 53 63      Tcl_Obj *pSc
14af0 72 69 70 74 3b 0a 20 20 20 20 63 6f 6e 73 74 20  ript;.    const 
14b00 63 68 61 72 20 2a 7a 42 65 67 69 6e 20 3d 20 22  char *zBegin = "
14b10 53 41 56 45 50 4f 49 4e 54 20 5f 74 63 6c 5f 74  SAVEPOINT _tcl_t
14b20 72 61 6e 73 61 63 74 69 6f 6e 22 3b 0a 20 20 20  ransaction";.   
14b30 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 26 26 20   if( objc!=3 && 
14b40 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 20  objc!=4 ){.     
14b50 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
14b60 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a  s(interp, 2, obj
14b70 76 2c 20 22 5b 54 59 50 45 5d 20 53 43 52 49 50  v, "[TYPE] SCRIP
14b80 54 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  T");.      retur
14b90 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
14ba0 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 44 62 2d   }..    if( pDb-
14bb0 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 30  >nTransaction==0
14bc0 20 26 26 20 6f 62 6a 63 3d 3d 34 20 29 7b 0a 20   && objc==4 ){. 
14bd0 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73       static cons
14be0 74 20 63 68 61 72 20 2a 54 54 59 50 45 5f 73 74  t char *TTYPE_st
14bf0 72 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20  rs[] = {.       
14c00 20 22 64 65 66 65 72 72 65 64 22 2c 20 20 20 22   "deferred",   "
14c10 65 78 63 6c 75 73 69 76 65 22 2c 20 20 22 69 6d  exclusive",  "im
14c20 6d 65 64 69 61 74 65 22 2c 20 30 0a 20 20 20 20  mediate", 0.    
14c30 20 20 7d 3b 0a 20 20 20 20 20 20 65 6e 75 6d 20    };.      enum 
14c40 54 54 59 50 45 5f 65 6e 75 6d 20 7b 0a 20 20 20  TTYPE_enum {.   
14c50 20 20 20 20 20 54 54 59 50 45 5f 44 45 46 45 52       TTYPE_DEFER
14c60 52 45 44 2c 20 54 54 59 50 45 5f 45 58 43 4c 55  RED, TTYPE_EXCLU
14c70 53 49 56 45 2c 20 54 54 59 50 45 5f 49 4d 4d 45  SIVE, TTYPE_IMME
14c80 44 49 41 54 45 0a 20 20 20 20 20 20 7d 3b 0a 20  DIATE.      };. 
14c90 20 20 20 20 20 69 6e 74 20 74 74 79 70 65 3b 0a       int ttype;.
14ca0 20 20 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65        if( Tcl_Ge
14cb0 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e  tIndexFromObj(in
14cc0 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 54  terp, objv[2], T
14cd0 54 59 50 45 5f 73 74 72 73 2c 20 22 74 72 61 6e  TYPE_strs, "tran
14ce0 73 61 63 74 69 6f 6e 20 74 79 70 65 22 2c 0a 20  saction type",. 
14cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14d00 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20               0, 
14d10 26 74 74 79 70 65 29 20 29 7b 0a 20 20 20 20 20  &ttype) ){.     
14d20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
14d30 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ROR;.      }.   
14d40 20 20 20 73 77 69 74 63 68 28 20 28 65 6e 75 6d     switch( (enum
14d50 20 54 54 59 50 45 5f 65 6e 75 6d 29 74 74 79 70   TTYPE_enum)ttyp
14d60 65 20 29 7b 0a 20 20 20 20 20 20 20 20 63 61 73  e ){.        cas
14d70 65 20 54 54 59 50 45 5f 44 45 46 45 52 52 45 44  e TTYPE_DEFERRED
14d80 3a 20 20 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f  :    /* no-op */
14d90 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
14da0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
14db0 20 63 61 73 65 20 54 54 59 50 45 5f 45 58 43 4c   case TTYPE_EXCL
14dc0 55 53 49 56 45 3a 20 20 20 7a 42 65 67 69 6e 20  USIVE:   zBegin 
14dd0 3d 20 22 42 45 47 49 4e 20 45 58 43 4c 55 53 49  = "BEGIN EXCLUSI
14de0 56 45 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20  VE";  break;.   
14df0 20 20 20 20 20 63 61 73 65 20 54 54 59 50 45 5f       case TTYPE_
14e00 49 4d 4d 45 44 49 41 54 45 3a 20 20 20 7a 42 65  IMMEDIATE:   zBe
14e10 67 69 6e 20 3d 20 22 42 45 47 49 4e 20 49 4d 4d  gin = "BEGIN IMM
14e20 45 44 49 41 54 45 22 3b 20 20 62 72 65 61 6b 3b  EDIATE";  break;
14e30 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
14e40 20 20 20 70 53 63 72 69 70 74 20 3d 20 6f 62 6a     pScript = obj
14e50 76 5b 6f 62 6a 63 2d 31 5d 3b 0a 0a 20 20 20 20  v[objc-1];..    
14e60 2f 2a 20 52 75 6e 20 74 68 65 20 53 51 4c 69 74  /* Run the SQLit
14e70 65 20 42 45 47 49 4e 20 63 6f 6d 6d 61 6e 64 20  e BEGIN command 
14e80 74 6f 20 6f 70 65 6e 20 61 20 74 72 61 6e 73 61  to open a transa
14e90 63 74 69 6f 6e 20 6f 72 20 73 61 76 65 70 6f 69  ction or savepoi
14ea0 6e 74 2e 20 2a 2f 0a 20 20 20 20 70 44 62 2d 3e  nt. */.    pDb->
14eb0 64 69 73 61 62 6c 65 41 75 74 68 2b 2b 3b 0a 20  disableAuth++;. 
14ec0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
14ed0 65 78 65 63 28 70 44 62 2d 3e 64 62 2c 20 7a 42  exec(pDb->db, zB
14ee0 65 67 69 6e 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  egin, 0, 0, 0);.
14ef0 20 20 20 20 70 44 62 2d 3e 64 69 73 61 62 6c 65      pDb->disable
14f00 41 75 74 68 2d 2d 3b 0a 20 20 20 20 69 66 28 20  Auth--;.    if( 
14f10 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
14f20 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  .      Tcl_Appen
14f30 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
14f40 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70  sqlite3_errmsg(p
14f50 44 62 2d 3e 64 62 29 2c 20 30 29 3b 0a 20 20 20  Db->db), 0);.   
14f60 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
14f70 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ROR;.    }.    p
14f80 44 62 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e  Db->nTransaction
14f90 2b 2b 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 75  ++;..    /* If u
14fa0 73 69 6e 67 20 4e 52 45 2c 20 73 63 68 65 64 75  sing NRE, schedu
14fb0 6c 65 20 61 20 63 61 6c 6c 62 61 63 6b 20 74 6f  le a callback to
14fc0 20 69 6e 76 6f 6b 65 20 74 68 65 20 73 63 72 69   invoke the scri
14fd0 70 74 20 70 53 63 72 69 70 74 2c 20 74 68 65 6e  pt pScript, then
14fe0 0a 20 20 20 20 2a 2a 20 61 20 73 65 63 6f 6e 64  .    ** a second
14ff0 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20 63 6f 6d   callback to com
15000 6d 69 74 20 28 6f 72 20 72 6f 6c 6c 62 61 63 6b  mit (or rollback
15010 29 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  ) the transactio
15020 6e 20 6f 72 20 73 61 76 65 70 6f 69 6e 74 0a 20  n or savepoint. 
15030 20 20 20 2a 2a 20 6f 70 65 6e 65 64 20 61 62 6f     ** opened abo
15040 76 65 2e 20 49 66 20 6e 6f 74 20 75 73 69 6e 67  ve. If not using
15050 20 4e 52 45 2c 20 65 76 61 6c 75 61 74 65 20 74   NRE, evaluate t
15060 68 65 20 73 63 72 69 70 74 20 64 69 72 65 63 74  he script direct
15070 6c 79 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20  ly, then.    ** 
15080 63 61 6c 6c 20 66 75 6e 63 74 69 6f 6e 20 44 62  call function Db
15090 54 72 61 6e 73 50 6f 73 74 43 6d 64 28 29 20 74  TransPostCmd() t
150a0 6f 20 63 6f 6d 6d 69 74 20 28 6f 72 20 72 6f 6c  o commit (or rol
150b0 6c 62 61 63 6b 29 20 74 68 65 20 74 72 61 6e 73  lback) the trans
150c0 61 63 74 69 6f 6e 20 0a 20 20 20 20 2a 2a 20 6f  action .    ** o
150d0 72 20 73 61 76 65 70 6f 69 6e 74 2e 20 20 2a 2f  r savepoint.  */
150e0 0a 20 20 20 20 69 66 28 20 44 62 55 73 65 4e 72  .    if( DbUseNr
150f0 65 28 29 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  e() ){.      Tcl
15100 5f 4e 52 41 64 64 43 61 6c 6c 62 61 63 6b 28 69  _NRAddCallback(i
15110 6e 74 65 72 70 2c 20 44 62 54 72 61 6e 73 50 6f  nterp, DbTransPo
15120 73 74 43 6d 64 2c 20 63 64 2c 20 30 2c 20 30 2c  stCmd, cd, 0, 0,
15130 20 30 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 4e   0);.      Tcl_N
15140 52 45 76 61 6c 4f 62 6a 28 69 6e 74 65 72 70 2c  REvalObj(interp,
15150 20 70 53 63 72 69 70 74 2c 20 30 29 3b 0a 20 20   pScript, 0);.  
15160 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
15170 63 20 3d 20 44 62 54 72 61 6e 73 50 6f 73 74 43  c = DbTransPostC
15180 6d 64 28 26 63 64 2c 20 69 6e 74 65 72 70 2c 20  md(&cd, interp, 
15190 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69 6e  Tcl_EvalObjEx(in
151a0 74 65 72 70 2c 20 70 53 63 72 69 70 74 2c 20 30  terp, pScript, 0
151b0 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 72  ));.    }.    br
151c0 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  eak;.  }..  /*. 
151d0 20 2a 2a 20 20 20 20 24 64 62 20 75 6e 6c 6f 63   **    $db unloc
151e0 6b 5f 6e 6f 74 69 66 79 20 3f 73 63 72 69 70 74  k_notify ?script
151f0 3f 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  ?.  */.  case DB
15200 5f 55 4e 4c 4f 43 4b 5f 4e 4f 54 49 46 59 3a 20  _UNLOCK_NOTIFY: 
15210 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
15220 5f 45 4e 41 42 4c 45 5f 55 4e 4c 4f 43 4b 5f 4e  _ENABLE_UNLOCK_N
15230 4f 54 49 46 59 0a 20 20 20 20 54 63 6c 5f 41 70  OTIFY.    Tcl_Ap
15240 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
15250 70 2c 20 22 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66  p, "unlock_notif
15260 79 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20  y not available 
15270 69 6e 20 74 68 69 73 20 62 75 69 6c 64 22 2c 20  in this build", 
15280 30 29 3b 0a 20 20 20 20 72 63 20 3d 20 54 43 4c  0);.    rc = TCL
15290 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 20 20  _ERROR;.#else.  
152a0 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 26 26    if( objc!=2 &&
152b0 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20   objc!=3 ){.    
152c0 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
152d0 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62  gs(interp, 2, ob
152e0 6a 76 2c 20 22 3f 53 43 52 49 50 54 3f 22 29 3b  jv, "?SCRIPT?");
152f0 0a 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f  .      rc = TCL_
15300 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73 65  ERROR;.    }else
15310 7b 0a 20 20 20 20 20 20 76 6f 69 64 20 28 2a 78  {.      void (*x
15320 4e 6f 74 69 66 79 29 28 76 6f 69 64 20 2a 2a 2c  Notify)(void **,
15330 20 69 6e 74 29 20 3d 20 30 3b 0a 20 20 20 20 20   int) = 0;.     
15340 20 76 6f 69 64 20 2a 70 4e 6f 74 69 66 79 41 72   void *pNotifyAr
15350 67 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 69 66  g = 0;..      if
15360 28 20 70 44 62 2d 3e 70 55 6e 6c 6f 63 6b 4e 6f  ( pDb->pUnlockNo
15370 74 69 66 79 20 29 7b 0a 20 20 20 20 20 20 20 20  tify ){.        
15380 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
15390 28 70 44 62 2d 3e 70 55 6e 6c 6f 63 6b 4e 6f 74  (pDb->pUnlockNot
153a0 69 66 79 29 3b 0a 20 20 20 20 20 20 20 20 70 44  ify);.        pD
153b0 62 2d 3e 70 55 6e 6c 6f 63 6b 4e 6f 74 69 66 79  b->pUnlockNotify
153c0 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
153d0 0a 20 20 20 20 20 20 69 66 28 20 6f 62 6a 63 3d  .      if( objc=
153e0 3d 33 20 29 7b 0a 20 20 20 20 20 20 20 20 78 4e  =3 ){.        xN
153f0 6f 74 69 66 79 20 3d 20 44 62 55 6e 6c 6f 63 6b  otify = DbUnlock
15400 4e 6f 74 69 66 79 3b 0a 20 20 20 20 20 20 20 20  Notify;.        
15410 70 4e 6f 74 69 66 79 41 72 67 20 3d 20 28 76 6f  pNotifyArg = (vo
15420 69 64 20 2a 29 70 44 62 3b 0a 20 20 20 20 20 20  id *)pDb;.      
15430 20 20 70 44 62 2d 3e 70 55 6e 6c 6f 63 6b 4e 6f    pDb->pUnlockNo
15440 74 69 66 79 20 3d 20 6f 62 6a 76 5b 32 5d 3b 0a  tify = objv[2];.
15450 20 20 20 20 20 20 20 20 54 63 6c 5f 49 6e 63 72          Tcl_Incr
15460 52 65 66 43 6f 75 6e 74 28 70 44 62 2d 3e 70 55  RefCount(pDb->pU
15470 6e 6c 6f 63 6b 4e 6f 74 69 66 79 29 3b 0a 20 20  nlockNotify);.  
15480 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 69      }.  .      i
15490 66 28 20 73 71 6c 69 74 65 33 5f 75 6e 6c 6f 63  f( sqlite3_unloc
154a0 6b 5f 6e 6f 74 69 66 79 28 70 44 62 2d 3e 64 62  k_notify(pDb->db
154b0 2c 20 78 4e 6f 74 69 66 79 2c 20 70 4e 6f 74 69  , xNotify, pNoti
154c0 66 79 41 72 67 29 20 29 7b 0a 20 20 20 20 20 20  fyArg) ){.      
154d0 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
154e0 6c 74 28 69 6e 74 65 72 70 2c 20 73 71 6c 69 74  lt(interp, sqlit
154f0 65 33 5f 65 72 72 6d 73 67 28 70 44 62 2d 3e 64  e3_errmsg(pDb->d
15500 62 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  b), 0);.        
15510 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  rc = TCL_ERROR;.
15520 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65        }.    }.#e
15530 6e 64 69 66 0a 20 20 20 20 62 72 65 61 6b 3b 0a  ndif.    break;.
15540 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20    }..  /*.  **  
15550 20 20 24 64 62 20 77 61 6c 5f 68 6f 6f 6b 20 3f    $db wal_hook ?
15560 73 63 72 69 70 74 3f 0a 20 20 2a 2a 20 20 20 20  script?.  **    
15570 24 64 62 20 75 70 64 61 74 65 5f 68 6f 6f 6b 20  $db update_hook 
15580 3f 73 63 72 69 70 74 3f 0a 20 20 2a 2a 20 20 20  ?script?.  **   
15590 20 24 64 62 20 72 6f 6c 6c 62 61 63 6b 5f 68 6f   $db rollback_ho
155a0 6f 6b 20 3f 73 63 72 69 70 74 3f 0a 20 20 2a 2f  ok ?script?.  */
155b0 0a 20 20 63 61 73 65 20 44 42 5f 57 41 4c 5f 48  .  case DB_WAL_H
155c0 4f 4f 4b 3a 20 0a 20 20 63 61 73 65 20 44 42 5f  OOK: .  case DB_
155d0 55 50 44 41 54 45 5f 48 4f 4f 4b 3a 20 0a 20 20  UPDATE_HOOK: .  
155e0 63 61 73 65 20 44 42 5f 52 4f 4c 4c 42 41 43 4b  case DB_ROLLBACK
155f0 5f 48 4f 4f 4b 3a 20 7b 0a 0a 20 20 20 20 2f 2a  _HOOK: {..    /*
15600 20 73 65 74 20 70 70 48 6f 6f 6b 20 74 6f 20 70   set ppHook to p
15610 6f 69 6e 74 20 61 74 20 70 55 70 64 61 74 65 48  oint at pUpdateH
15620 6f 6f 6b 20 6f 72 20 70 52 6f 6c 6c 62 61 63 6b  ook or pRollback
15630 48 6f 6f 6b 2c 20 64 65 70 65 6e 64 69 6e 67 20  Hook, depending 
15640 6f 6e 20 0a 20 20 20 20 2a 2a 20 77 68 65 74 68  on .    ** wheth
15650 65 72 20 5b 24 64 62 20 75 70 64 61 74 65 5f 68  er [$db update_h
15660 6f 6f 6b 5d 20 6f 72 20 5b 24 64 62 20 72 6f 6c  ook] or [$db rol
15670 6c 62 61 63 6b 5f 68 6f 6f 6b 5d 20 77 61 73 20  lback_hook] was 
15680 69 6e 76 6f 6b 65 64 2e 0a 20 20 20 20 2a 2f 0a  invoked..    */.
15690 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 70 70      Tcl_Obj **pp
156a0 48 6f 6f 6b 3b 20 0a 20 20 20 20 69 66 28 20 63  Hook; .    if( c
156b0 68 6f 69 63 65 3d 3d 44 42 5f 55 50 44 41 54 45  hoice==DB_UPDATE
156c0 5f 48 4f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  _HOOK ){.      p
156d0 70 48 6f 6f 6b 20 3d 20 26 70 44 62 2d 3e 70 55  pHook = &pDb->pU
156e0 70 64 61 74 65 48 6f 6f 6b 3b 0a 20 20 20 20 7d  pdateHook;.    }
156f0 65 6c 73 65 20 69 66 28 20 63 68 6f 69 63 65 3d  else if( choice=
15700 3d 44 42 5f 57 41 4c 5f 48 4f 4f 4b 20 29 7b 0a  =DB_WAL_HOOK ){.
15710 20 20 20 20 20 20 70 70 48 6f 6f 6b 20 3d 20 26        ppHook = &
15720 70 44 62 2d 3e 70 57 61 6c 48 6f 6f 6b 3b 0a 20  pDb->pWalHook;. 
15730 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
15740 70 70 48 6f 6f 6b 20 3d 20 26 70 44 62 2d 3e 70  ppHook = &pDb->p
15750 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 3b 0a 20 20  RollbackHook;.  
15760 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 6f 62 6a    }..    if( obj
15770 63 21 3d 32 20 26 26 20 6f 62 6a 63 21 3d 33 20  c!=2 && objc!=3 
15780 29 7b 0a 20 20 20 20 20 20 20 54 63 6c 5f 57 72  ){.       Tcl_Wr
15790 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
157a0 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 3f 53 43  p, 2, objv, "?SC
157b0 52 49 50 54 3f 22 29 3b 0a 20 20 20 20 20 20 20  RIPT?");.       
157c0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
157d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
157e0 2a 70 70 48 6f 6f 6b 20 29 7b 0a 20 20 20 20 20  *ppHook ){.     
157f0 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
15800 74 28 69 6e 74 65 72 70 2c 20 2a 70 70 48 6f 6f  t(interp, *ppHoo
15810 6b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 62  k);.      if( ob
15820 6a 63 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20 20  jc==3 ){.       
15830 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
15840 74 28 2a 70 70 48 6f 6f 6b 29 3b 0a 20 20 20 20  t(*ppHook);.    
15850 20 20 20 20 2a 70 70 48 6f 6f 6b 20 3d 20 30 3b      *ppHook = 0;
15860 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
15870 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d 33 20 29     if( objc==3 )
15880 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
15890 21 28 2a 70 70 48 6f 6f 6b 29 20 29 3b 0a 20 20  !(*ppHook) );.  
158a0 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 43      if( Tcl_GetC
158b0 68 61 72 4c 65 6e 67 74 68 28 6f 62 6a 76 5b 32  harLength(objv[2
158c0 5d 29 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ])>0 ){.        
158d0 2a 70 70 48 6f 6f 6b 20 3d 20 6f 62 6a 76 5b 32  *ppHook = objv[2
158e0 5d 3b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 49  ];.        Tcl_I
158f0 6e 63 72 52 65 66 43 6f 75 6e 74 28 2a 70 70 48  ncrRefCount(*ppH
15900 6f 6f 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ook);.      }.  
15910 20 20 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65 33    }..    sqlite3
15920 5f 75 70 64 61 74 65 5f 68 6f 6f 6b 28 70 44 62  _update_hook(pDb
15930 2d 3e 64 62 2c 20 28 70 44 62 2d 3e 70 55 70 64  ->db, (pDb->pUpd
15940 61 74 65 48 6f 6f 6b 3f 44 62 55 70 64 61 74 65  ateHook?DbUpdate
15950 48 61 6e 64 6c 65 72 3a 30 29 2c 20 70 44 62 29  Handler:0), pDb)
15960 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 6f  ;.    sqlite3_ro
15970 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 28 70 44 62 2d  llback_hook(pDb-
15980 3e 64 62 2c 28 70 44 62 2d 3e 70 52 6f 6c 6c 62  >db,(pDb->pRollb
15990 61 63 6b 48 6f 6f 6b 3f 44 62 52 6f 6c 6c 62 61  ackHook?DbRollba
159a0 63 6b 48 61 6e 64 6c 65 72 3a 30 29 2c 70 44 62  ckHandler:0),pDb
159b0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 77  );.    sqlite3_w
159c0 61 6c 5f 68 6f 6f 6b 28 70 44 62 2d 3e 64 62 2c  al_hook(pDb->db,
159d0 28 70 44 62 2d 3e 70 57 61 6c 48 6f 6f 6b 3f 44  (pDb->pWalHook?D
159e0 62 57 61 6c 48 61 6e 64 6c 65 72 3a 30 29 2c 70  bWalHandler:0),p
159f0 44 62 29 3b 0a 0a 20 20 20 20 62 72 65 61 6b 3b  Db);..    break;
15a00 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64  .  }..  /*    $d
15a10 62 20 76 65 72 73 69 6f 6e 0a 20 20 2a 2a 0a 20  b version.  **. 
15a20 20 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76   ** Return the v
15a30 65 72 73 69 6f 6e 20 73 74 72 69 6e 67 20 66 6f  ersion string fo
15a40 72 20 74 68 69 73 20 64 61 74 61 62 61 73 65 2e  r this database.
15a50 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f  .  */.  case DB_
15a60 56 45 52 53 49 4f 4e 3a 20 7b 0a 20 20 20 20 54  VERSION: {.    T
15a70 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
15a80 65 72 70 2c 20 28 63 68 61 72 20 2a 29 73 71 6c  erp, (char *)sql
15a90 69 74 65 33 5f 6c 69 62 76 65 72 73 69 6f 6e 28  ite3_libversion(
15aa0 29 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a  ), TCL_STATIC);.
15ab0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
15ac0 0a 20 20 7d 20 2f 2a 20 45 6e 64 20 6f 66 20 74  .  } /* End of t
15ad0 68 65 20 53 57 49 54 43 48 20 73 74 61 74 65 6d  he SWITCH statem
15ae0 65 6e 74 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  ent */.  return 
15af0 72 63 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54  rc;.}..#if SQLIT
15b00 45 5f 54 43 4c 5f 4e 52 45 0a 2f 2a 0a 2a 2a 20  E_TCL_NRE./*.** 
15b10 41 64 61 70 74 6f 72 20 74 68 61 74 20 70 72 6f  Adaptor that pro
15b20 76 69 64 65 73 20 61 6e 20 6f 62 6a 43 6d 64 20  vides an objCmd 
15b30 69 6e 74 65 72 66 61 63 65 20 74 6f 20 74 68 65  interface to the
15b40 20 4e 52 45 2d 65 6e 61 62 6c 65 64 0a 2a 2a 20   NRE-enabled.** 
15b50 69 6e 74 65 72 66 61 63 65 20 69 6d 70 6c 65 6d  interface implem
15b60 65 6e 74 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  entation..*/.sta
15b70 74 69 63 20 69 6e 74 20 44 62 4f 62 6a 43 6d 64  tic int DbObjCmd
15b80 41 64 61 70 74 6f 72 28 0a 20 20 76 6f 69 64 20  Adaptor(.  void 
15b90 2a 63 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  *cd,.  Tcl_Inter
15ba0 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
15bb0 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
15bc0 20 2a 63 6f 6e 73 74 2a 6f 62 6a 76 0a 29 7b 0a   *const*objv.){.
15bd0 20 20 72 65 74 75 72 6e 20 54 63 6c 5f 4e 52 43    return Tcl_NRC
15be0 61 6c 6c 4f 62 6a 50 72 6f 63 28 69 6e 74 65 72  allObjProc(inter
15bf0 70 2c 20 44 62 4f 62 6a 43 6d 64 2c 20 63 64 2c  p, DbObjCmd, cd,
15c00 20 6f 62 6a 63 2c 20 6f 62 6a 76 29 3b 0a 7d 0a   objc, objv);.}.
15c10 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
15c20 5f 54 43 4c 5f 4e 52 45 20 2a 2f 0a 0a 2f 2a 0a  _TCL_NRE */../*.
15c30 2a 2a 20 20 20 73 71 6c 69 74 65 33 20 44 42 4e  **   sqlite3 DBN
15c40 41 4d 45 20 46 49 4c 45 4e 41 4d 45 20 3f 2d 76  AME FILENAME ?-v
15c50 66 73 20 56 46 53 4e 41 4d 45 3f 20 3f 2d 6b 65  fs VFSNAME? ?-ke
15c60 79 20 4b 45 59 3f 20 3f 2d 72 65 61 64 6f 6e 6c  y KEY? ?-readonl
15c70 79 20 42 4f 4f 4c 45 41 4e 3f 0a 2a 2a 20 20 20  y BOOLEAN?.**   
15c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15c90 20 20 20 20 20 20 20 20 3f 2d 63 72 65 61 74 65          ?-create
15ca0 20 42 4f 4f 4c 45 41 4e 3f 20 3f 2d 6e 6f 6d 75   BOOLEAN? ?-nomu
15cb0 74 65 78 20 42 4f 4f 4c 45 41 4e 3f 0a 2a 2a 0a  tex BOOLEAN?.**.
15cc0 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 6d  ** This is the m
15cd0 61 69 6e 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 2e  ain Tcl command.
15ce0 20 20 57 68 65 6e 20 74 68 65 20 22 73 71 6c 69    When the "sqli
15cf0 74 65 22 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 20  te" Tcl command 
15d00 69 73 0a 2a 2a 20 69 6e 76 6f 6b 65 64 2c 20 74  is.** invoked, t
15d10 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73  his routine runs
15d20 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 61 74   to process that
15d30 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20   command..**.** 
15d40 54 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  The first argume
15d50 6e 74 2c 20 44 42 4e 41 4d 45 2c 20 69 73 20 61  nt, DBNAME, is a
15d60 6e 20 61 72 62 69 74 72 61 72 79 20 6e 61 6d 65  n arbitrary name
15d70 20 66 6f 72 20 61 20 6e 65 77 0a 2a 2a 20 64 61   for a new.** da
15d80 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
15d90 6e 2e 20 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64  n.  This command
15da0 20 63 72 65 61 74 65 73 20 61 20 6e 65 77 20 63   creates a new c
15db0 6f 6d 6d 61 6e 64 20 6e 61 6d 65 64 0a 2a 2a 20  ommand named.** 
15dc0 44 42 4e 41 4d 45 20 74 68 61 74 20 69 73 20 75  DBNAME that is u
15dd0 73 65 64 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 74  sed to control t
15de0 68 61 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20  hat connection. 
15df0 20 54 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   The database.**
15e00 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 64   connection is d
15e10 65 6c 65 74 65 64 20 77 68 65 6e 20 74 68 65 20  eleted when the 
15e20 44 42 4e 41 4d 45 20 63 6f 6d 6d 61 6e 64 20 69  DBNAME command i
15e30 73 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a  s deleted..**.**
15e40 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   The second argu
15e50 6d 65 6e 74 20 69 73 20 74 68 65 20 6e 61 6d 65  ment is the name
15e60 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
15e70 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2f 0a 73 74 61   file..**.*/.sta
15e80 74 69 63 20 69 6e 74 20 44 62 4d 61 69 6e 28 76  tic int DbMain(v
15e90 6f 69 64 20 2a 63 64 2c 20 54 63 6c 5f 49 6e 74  oid *cd, Tcl_Int
15ea0 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74  erp *interp, int
15eb0 20 6f 62 6a 63 2c 54 63 6c 5f 4f 62 6a 20 2a 63   objc,Tcl_Obj *c
15ec0 6f 6e 73 74 2a 6f 62 6a 76 29 7b 0a 20 20 53 71  onst*objv){.  Sq
15ed0 6c 69 74 65 44 62 20 2a 70 3b 0a 20 20 63 6f 6e  liteDb *p;.  con
15ee0 73 74 20 63 68 61 72 20 2a 7a 41 72 67 3b 0a 20  st char *zArg;. 
15ef0 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 3b 0a   char *zErrMsg;.
15f00 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e 73 74    int i;.  const
15f10 20 63 68 61 72 20 2a 7a 46 69 6c 65 3b 0a 20 20   char *zFile;.  
15f20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 66 73  const char *zVfs
15f30 20 3d 20 30 3b 0a 20 20 69 6e 74 20 66 6c 61 67   = 0;.  int flag
15f40 73 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  s;.  Tcl_DString
15f50 20 74 72 61 6e 73 6c 61 74 65 64 46 69 6c 65 6e   translatedFilen
15f60 61 6d 65 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  ame;.#ifdef SQLI
15f70 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 76  TE_HAS_CODEC.  v
15f80 6f 69 64 20 2a 70 4b 65 79 20 3d 20 30 3b 0a 20  oid *pKey = 0;. 
15f90 20 69 6e 74 20 6e 4b 65 79 20 3d 20 30 3b 0a 23   int nKey = 0;.#
15fa0 65 6e 64 69 66 0a 20 20 69 6e 74 20 72 63 3b 0a  endif.  int rc;.
15fb0 0a 20 20 2f 2a 20 49 6e 20 6e 6f 72 6d 61 6c 20  .  /* In normal 
15fc0 75 73 65 2c 20 65 61 63 68 20 54 43 4c 20 69 6e  use, each TCL in
15fd0 74 65 72 70 72 65 74 65 72 20 72 75 6e 73 20 69  terpreter runs i
15fe0 6e 20 61 20 73 69 6e 67 6c 65 20 74 68 72 65 61  n a single threa
15ff0 64 2e 20 20 53 6f 0a 20 20 2a 2a 20 62 79 20 64  d.  So.  ** by d
16000 65 66 61 75 6c 74 2c 20 77 65 20 63 61 6e 20 74  efault, we can t
16010 75 72 6e 20 6f 66 20 6d 75 74 65 78 69 6e 67 20  urn of mutexing 
16020 6f 6e 20 53 51 4c 69 74 65 20 64 61 74 61 62 61  on SQLite databa
16030 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 0a  se connections..
16040 20 20 2a 2a 20 48 6f 77 65 76 65 72 2c 20 66 6f    ** However, fo
16050 72 20 74 65 73 74 69 6e 67 20 70 75 72 70 6f 73  r testing purpos
16060 65 73 20 69 74 20 69 73 20 75 73 65 66 75 6c 20  es it is useful 
16070 74 6f 20 68 61 76 65 20 6d 75 74 65 78 65 73 20  to have mutexes 
16080 74 75 72 6e 65 64 0a 20 20 2a 2a 20 6f 6e 2e 20  turned.  ** on. 
16090 20 53 6f 2c 20 62 79 20 64 65 66 61 75 6c 74 2c   So, by default,
160a0 20 6d 75 74 65 78 65 73 20 64 65 66 61 75 6c 74   mutexes default
160b0 20 6f 66 66 2e 20 20 42 75 74 20 69 66 20 63 6f   off.  But if co
160c0 6d 70 69 6c 65 64 20 77 69 74 68 0a 20 20 2a 2a  mpiled with.  **
160d0 20 53 51 4c 49 54 45 5f 54 43 4c 5f 44 45 46 41   SQLITE_TCL_DEFA
160e0 55 4c 54 5f 46 55 4c 4c 4d 55 54 45 58 20 74 68  ULT_FULLMUTEX th
160f0 65 6e 20 6d 75 74 65 78 65 73 20 64 65 66 61 75  en mutexes defau
16100 6c 74 20 6f 6e 2e 0a 20 20 2a 2f 0a 23 69 66 64  lt on..  */.#ifd
16110 65 66 20 53 51 4c 49 54 45 5f 54 43 4c 5f 44 45  ef SQLITE_TCL_DE
16120 46 41 55 4c 54 5f 46 55 4c 4c 4d 55 54 45 58 0a  FAULT_FULLMUTEX.
16130 20 20 66 6c 61 67 73 20 3d 20 53 51 4c 49 54 45    flags = SQLITE
16140 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20  _OPEN_READWRITE 
16150 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  | SQLITE_OPEN_CR
16160 45 41 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50  EATE | SQLITE_OP
16170 45 4e 5f 46 55 4c 4c 4d 55 54 45 58 3b 0a 23 65  EN_FULLMUTEX;.#e
16180 6c 73 65 0a 20 20 66 6c 61 67 73 20 3d 20 53 51  lse.  flags = SQ
16190 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
161a0 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45  ITE | SQLITE_OPE
161b0 4e 5f 43 52 45 41 54 45 20 7c 20 53 51 4c 49 54  N_CREATE | SQLIT
161c0 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58 3b 0a  E_OPEN_NOMUTEX;.
161d0 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 6f 62  #endif..  if( ob
161e0 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20 7a 41 72  jc==2 ){.    zAr
161f0 67 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  g = Tcl_GetStrin
16200 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d  gFromObj(objv[1]
16210 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 73 74  , 0);.    if( st
16220 72 63 6d 70 28 7a 41 72 67 2c 22 2d 76 65 72 73  rcmp(zArg,"-vers
16230 69 6f 6e 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ion")==0 ){.    
16240 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
16250 6c 74 28 69 6e 74 65 72 70 2c 73 71 6c 69 74 65  lt(interp,sqlite
16260 33 5f 76 65 72 73 69 6f 6e 2c 30 29 3b 0a 20 20  3_version,0);.  
16270 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f      return TCL_O
16280 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  K;.    }.    if(
16290 20 73 74 72 63 6d 70 28 7a 41 72 67 2c 22 2d 68   strcmp(zArg,"-h
162a0 61 73 2d 63 6f 64 65 63 22 29 3d 3d 30 20 29 7b  as-codec")==0 ){
162b0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48  .#ifdef SQLITE_H
162c0 41 53 5f 43 4f 44 45 43 0a 20 20 20 20 20 20 54  AS_CODEC.      T
162d0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
162e0 69 6e 74 65 72 70 2c 22 31 22 2c 30 29 3b 0a 23  interp,"1",0);.#
162f0 65 6c 73 65 0a 20 20 20 20 20 20 54 63 6c 5f 41  else.      Tcl_A
16300 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
16310 72 70 2c 22 30 22 2c 30 29 3b 0a 23 65 6e 64 69  rp,"0",0);.#endi
16320 66 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  f.      return T
16330 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d  CL_OK;.    }.  }
16340 0a 20 20 66 6f 72 28 69 3d 33 3b 20 69 2b 31 3c  .  for(i=3; i+1<
16350 6f 62 6a 63 3b 20 69 2b 3d 32 29 7b 0a 20 20 20  objc; i+=2){.   
16360 20 7a 41 72 67 20 3d 20 54 63 6c 5f 47 65 74 53   zArg = Tcl_GetS
16370 74 72 69 6e 67 28 6f 62 6a 76 5b 69 5d 29 3b 0a  tring(objv[i]);.
16380 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
16390 41 72 67 2c 22 2d 6b 65 79 22 29 3d 3d 30 20 29  Arg,"-key")==0 )
163a0 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
163b0 48 41 53 5f 43 4f 44 45 43 0a 20 20 20 20 20 20  HAS_CODEC.      
163c0 70 4b 65 79 20 3d 20 54 63 6c 5f 47 65 74 42 79  pKey = Tcl_GetBy
163d0 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6f  teArrayFromObj(o
163e0 62 6a 76 5b 69 2b 31 5d 2c 20 26 6e 4b 65 79 29  bjv[i+1], &nKey)
163f0 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c  ;.#endif.    }el
16400 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 41  se if( strcmp(zA
16410 72 67 2c 20 22 2d 76 66 73 22 29 3d 3d 30 20 29  rg, "-vfs")==0 )
16420 7b 0a 20 20 20 20 20 20 7a 56 66 73 20 3d 20 54  {.      zVfs = T
16430 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
16440 76 5b 69 2b 31 5d 29 3b 0a 20 20 20 20 7d 65 6c  v[i+1]);.    }el
16450 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 41  se if( strcmp(zA
16460 72 67 2c 20 22 2d 72 65 61 64 6f 6e 6c 79 22 29  rg, "-readonly")
16470 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ==0 ){.      int
16480 20 62 3b 0a 20 20 20 20 20 20 69 66 28 20 54 63   b;.      if( Tc
16490 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d  l_GetBooleanFrom
164a0 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
164b0 5b 69 2b 31 5d 2c 20 26 62 29 20 29 20 72 65 74  [i+1], &b) ) ret
164c0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
164d0 20 20 20 20 20 69 66 28 20 62 20 29 7b 0a 20 20       if( b ){.  
164e0 20 20 20 20 20 20 66 6c 61 67 73 20 26 3d 20 7e        flags &= ~
164f0 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41  (SQLITE_OPEN_REA
16500 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50  DWRITE|SQLITE_OP
16510 45 4e 5f 43 52 45 41 54 45 29 3b 0a 20 20 20 20  EN_CREATE);.    
16520 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c      flags |= SQL
16530 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
16540 59 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  Y;.      }else{.
16550 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 26 3d          flags &=
16560 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45   ~SQLITE_OPEN_RE
16570 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 20 20  ADONLY;.        
16580 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  flags |= SQLITE_
16590 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 3b 0a  OPEN_READWRITE;.
165a0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
165b0 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 41 72  e if( strcmp(zAr
165c0 67 2c 20 22 2d 63 72 65 61 74 65 22 29 3d 3d 30  g, "-create")==0
165d0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 62 3b   ){.      int b;
165e0 0a 20 20 20 20 20 20 69 66 28 20 54 63 6c 5f 47  .      if( Tcl_G
165f0 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a  etBooleanFromObj
16600 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 69 2b  (interp, objv[i+
16610 31 5d 2c 20 26 62 29 20 29 20 72 65 74 75 72 6e  1], &b) ) return
16620 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
16630 20 20 69 66 28 20 62 20 26 26 20 28 66 6c 61 67    if( b && (flag
16640 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
16650 52 45 41 44 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a  READONLY)==0 ){.
16660 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d          flags |=
16670 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45   SQLITE_OPEN_CRE
16680 41 54 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ATE;.      }else
16690 7b 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73 20  {.        flags 
166a0 26 3d 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  &= ~SQLITE_OPEN_
166b0 43 52 45 41 54 45 3b 0a 20 20 20 20 20 20 7d 0a  CREATE;.      }.
166c0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
166d0 72 63 6d 70 28 7a 41 72 67 2c 20 22 2d 6e 6f 6d  rcmp(zArg, "-nom
166e0 75 74 65 78 22 29 3d 3d 30 20 29 7b 0a 20 20 20  utex")==0 ){.   
166f0 20 20 20 69 6e 74 20 62 3b 0a 20 20 20 20 20 20     int b;.      
16700 69 66 28 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65  if( Tcl_GetBoole
16710 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  anFromObj(interp
16720 2c 20 6f 62 6a 76 5b 69 2b 31 5d 2c 20 26 62 29  , objv[i+1], &b)
16730 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
16740 52 4f 52 3b 0a 20 20 20 20 20 20 69 66 28 20 62  ROR;.      if( b
16750 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6c 61 67   ){.        flag
16760 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e  s |= SQLITE_OPEN
16770 5f 4e 4f 4d 55 54 45 58 3b 0a 20 20 20 20 20 20  _NOMUTEX;.      
16780 20 20 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49    flags &= ~SQLI
16790 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54 45  TE_OPEN_FULLMUTE
167a0 58 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  X;.      }else{.
167b0 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 26 3d          flags &=
167c0 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f   ~SQLITE_OPEN_NO
167d0 4d 55 54 45 58 3b 0a 20 20 20 20 20 20 7d 0a 20  MUTEX;.      }. 
167e0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
167f0 63 6d 70 28 7a 41 72 67 2c 20 22 2d 66 75 6c 6c  cmp(zArg, "-full
16800 6d 75 74 65 78 22 29 3d 3d 30 20 29 7b 0a 20 20  mutex")==0 ){.  
16810 20 20 20 20 69 6e 74 20 62 3b 0a 20 20 20 20 20      int b;.     
16820 20 69 66 28 20 54 63 6c 5f 47 65 74 42 6f 6f 6c   if( Tcl_GetBool
16830 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  eanFromObj(inter
16840 70 2c 20 6f 62 6a 76 5b 69 2b 31 5d 2c 20 26 62  p, objv[i+1], &b
16850 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
16860 52 52 4f 52 3b 0a 20 20 20 20 20 20 69 66 28 20  RROR;.      if( 
16870 62 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6c 61  b ){.        fla
16880 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45  gs |= SQLITE_OPE
16890 4e 5f 46 55 4c 4c 4d 55 54 45 58 3b 0a 20 20 20  N_FULLMUTEX;.   
168a0 20 20 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 53       flags &= ~S
168b0 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54  QLITE_OPEN_NOMUT
168c0 45 58 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  EX;.      }else{
168d0 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 26  .        flags &
168e0 3d 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46  = ~SQLITE_OPEN_F
168f0 55 4c 4c 4d 55 54 45 58 3b 0a 20 20 20 20 20 20  ULLMUTEX;.      
16900 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  }.    }else if( 
16910 73 74 72 63 6d 70 28 7a 41 72 67 2c 20 22 2d 75  strcmp(zArg, "-u
16920 72 69 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ri")==0 ){.     
16930 20 69 6e 74 20 62 3b 0a 20 20 20 20 20 20 69 66   int b;.      if
16940 28 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e  ( Tcl_GetBoolean
16950 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
16960 6f 62 6a 76 5b 69 2b 31 5d 2c 20 26 62 29 20 29  objv[i+1], &b) )
16970 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
16980 52 3b 0a 20 20 20 20 20 20 69 66 28 20 62 20 29  R;.      if( b )
16990 7b 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73 20  {.        flags 
169a0 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55  |= SQLITE_OPEN_U
169b0 52 49 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  RI;.      }else{
169c0 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 26  .        flags &
169d0 3d 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55  = ~SQLITE_OPEN_U
169e0 52 49 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  RI;.      }.    
169f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 54 63 6c  }else{.      Tcl
16a00 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
16a10 74 65 72 70 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6f  terp, "unknown o
16a20 70 74 69 6f 6e 3a 20 22 2c 20 7a 41 72 67 2c 20  ption: ", zArg, 
16a30 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20  (char*)0);.     
16a40 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
16a50 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  R;.    }.  }.  i
16a60 66 28 20 6f 62 6a 63 3c 33 20 7c 7c 20 28 6f 62  f( objc<3 || (ob
16a70 6a 63 26 31 29 21 3d 31 20 29 7b 0a 20 20 20 20  jc&1)!=1 ){.    
16a80 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
16a90 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
16aa0 2c 20 0a 20 20 20 20 20 20 22 48 41 4e 44 4c 45  , .      "HANDLE
16ab0 20 46 49 4c 45 4e 41 4d 45 20 3f 2d 76 66 73 20   FILENAME ?-vfs 
16ac0 56 46 53 4e 41 4d 45 3f 20 3f 2d 72 65 61 64 6f  VFSNAME? ?-reado
16ad0 6e 6c 79 20 42 4f 4f 4c 45 41 4e 3f 20 3f 2d 63  nly BOOLEAN? ?-c
16ae0 72 65 61 74 65 20 42 4f 4f 4c 45 41 4e 3f 22 0a  reate BOOLEAN?".
16af0 20 20 20 20 20 20 22 20 3f 2d 6e 6f 6d 75 74 65        " ?-nomute
16b00 78 20 42 4f 4f 4c 45 41 4e 3f 20 3f 2d 66 75 6c  x BOOLEAN? ?-ful
16b10 6c 6d 75 74 65 78 20 42 4f 4f 4c 45 41 4e 3f 20  lmutex BOOLEAN? 
16b20 3f 2d 75 72 69 20 42 4f 4f 4c 45 41 4e 3f 22 0a  ?-uri BOOLEAN?".
16b30 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41  #ifdef SQLITE_HA
16b40 53 5f 43 4f 44 45 43 0a 20 20 20 20 20 20 22 20  S_CODEC.      " 
16b50 3f 2d 6b 65 79 20 43 4f 44 45 43 4b 45 59 3f 22  ?-key CODECKEY?"
16b60 0a 23 65 6e 64 69 66 0a 20 20 20 20 29 3b 0a 20  .#endif.    );. 
16b70 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
16b80 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 45 72 72 4d  ROR;.  }.  zErrM
16b90 73 67 20 3d 20 30 3b 0a 20 20 70 20 3d 20 28 53  sg = 0;.  p = (S
16ba0 71 6c 69 74 65 44 62 2a 29 54 63 6c 5f 41 6c 6c  qliteDb*)Tcl_All
16bb0 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 29 20 29  oc( sizeof(*p) )
16bc0 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a  ;.  if( p==0 ){.
16bd0 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c      Tcl_SetResul
16be0 74 28 69 6e 74 65 72 70 2c 20 22 6d 61 6c 6c 6f  t(interp, "mallo
16bf0 63 20 66 61 69 6c 65 64 22 2c 20 54 43 4c 5f 53  c failed", TCL_S
16c00 54 41 54 49 43 29 3b 0a 20 20 20 20 72 65 74 75  TATIC);.    retu
16c10 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
16c20 7d 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c  }.  memset(p, 0,
16c30 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20   sizeof(*p));.  
16c40 7a 46 69 6c 65 20 3d 20 54 63 6c 5f 47 65 74 53  zFile = Tcl_GetS
16c50 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
16c60 76 5b 32 5d 2c 20 30 29 3b 0a 20 20 7a 46 69 6c  v[2], 0);.  zFil
16c70 65 20 3d 20 54 63 6c 5f 54 72 61 6e 73 6c 61 74  e = Tcl_Translat
16c80 65 46 69 6c 65 4e 61 6d 65 28 69 6e 74 65 72 70  eFileName(interp
16c90 2c 20 7a 46 69 6c 65 2c 20 26 74 72 61 6e 73 6c  , zFile, &transl
16ca0 61 74 65 64 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  atedFilename);. 
16cb0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 6f 70   rc = sqlite3_op
16cc0 65 6e 5f 76 32 28 7a 46 69 6c 65 2c 20 26 70 2d  en_v2(zFile, &p-
16cd0 3e 64 62 2c 20 66 6c 61 67 73 2c 20 7a 56 66 73  >db, flags, zVfs
16ce0 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  );.  Tcl_DString
16cf0 46 72 65 65 28 26 74 72 61 6e 73 6c 61 74 65 64  Free(&translated
16d00 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28  Filename);.  if(
16d10 20 70 2d 3e 64 62 20 29 7b 0a 20 20 20 20 69 66   p->db ){.    if
16d20 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c  ( SQLITE_OK!=sql
16d30 69 74 65 33 5f 65 72 72 63 6f 64 65 28 70 2d 3e  ite3_errcode(p->
16d40 64 62 29 20 29 7b 0a 20 20 20 20 20 20 7a 45 72  db) ){.      zEr
16d50 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d  rMsg = sqlite3_m
16d60 70 72 69 6e 74 66 28 22 25 73 22 2c 20 73 71 6c  printf("%s", sql
16d70 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64  ite3_errmsg(p->d
16d80 62 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  b));.      sqlit
16d90 65 33 5f 63 6c 6f 73 65 28 70 2d 3e 64 62 29 3b  e3_close(p->db);
16da0 0a 20 20 20 20 20 20 70 2d 3e 64 62 20 3d 20 30  .      p->db = 0
16db0 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
16dc0 0a 20 20 20 20 7a 45 72 72 4d 73 67 20 3d 20 73  .    zErrMsg = s
16dd0 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
16de0 25 73 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  %s", sqlite3_err
16df0 73 74 72 28 72 63 29 29 3b 0a 20 20 7d 0a 23 69  str(rc));.  }.#i
16e00 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f  fdef SQLITE_HAS_
16e10 43 4f 44 45 43 0a 20 20 69 66 28 20 70 2d 3e 64  CODEC.  if( p->d
16e20 62 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  b ){.    sqlite3
16e30 5f 6b 65 79 28 70 2d 3e 64 62 2c 20 70 4b 65 79  _key(p->db, pKey
16e40 2c 20 6e 4b 65 79 29 3b 0a 20 20 7d 0a 23 65 6e  , nKey);.  }.#en
16e50 64 69 66 0a 20 20 69 66 28 20 70 2d 3e 64 62 3d  dif.  if( p->db=
16e60 3d 30 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65  =0 ){.    Tcl_Se
16e70 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  tResult(interp, 
16e80 7a 45 72 72 4d 73 67 2c 20 54 43 4c 5f 56 4f 4c  zErrMsg, TCL_VOL
16e90 41 54 49 4c 45 29 3b 0a 20 20 20 20 54 63 6c 5f  ATILE);.    Tcl_
16ea0 46 72 65 65 28 28 63 68 61 72 2a 29 70 29 3b 0a  Free((char*)p);.
16eb0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
16ec0 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 72  (zErrMsg);.    r
16ed0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
16ee0 0a 20 20 7d 0a 20 20 70 2d 3e 6d 61 78 53 74 6d  .  }.  p->maxStm
16ef0 74 20 3d 20 4e 55 4d 5f 50 52 45 50 41 52 45 44  t = NUM_PREPARED
16f00 5f 53 54 4d 54 53 3b 0a 20 20 70 2d 3e 69 6e 74  _STMTS;.  p->int
16f10 65 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20  erp = interp;.  
16f20 7a 41 72 67 20 3d 20 54 63 6c 5f 47 65 74 53 74  zArg = Tcl_GetSt
16f30 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
16f40 5b 31 5d 2c 20 30 29 3b 0a 20 20 69 66 28 20 44  [1], 0);.  if( D
16f50 62 55 73 65 4e 72 65 28 29 20 29 7b 0a 20 20 20  bUseNre() ){.   
16f60 20 54 63 6c 5f 4e 52 43 72 65 61 74 65 43 6f 6d   Tcl_NRCreateCom
16f70 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 7a 41 72  mand(interp, zAr
16f80 67 2c 20 44 62 4f 62 6a 43 6d 64 41 64 61 70 74  g, DbObjCmdAdapt
16f90 6f 72 2c 20 44 62 4f 62 6a 43 6d 64 2c 0a 20 20  or, DbObjCmd,.  
16fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16fb0 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 2c 20        (char*)p, 
16fc0 44 62 44 65 6c 65 74 65 43 6d 64 29 3b 0a 20 20  DbDeleteCmd);.  
16fd0 7d 65 6c 73 65 7b 0a 20 20 20 20 54 63 6c 5f 43  }else{.    Tcl_C
16fe0 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28  reateObjCommand(
16ff0 69 6e 74 65 72 70 2c 20 7a 41 72 67 2c 20 44 62  interp, zArg, Db
17000 4f 62 6a 43 6d 64 2c 20 28 63 68 61 72 2a 29 70  ObjCmd, (char*)p
17010 2c 20 44 62 44 65 6c 65 74 65 43 6d 64 29 3b 0a  , DbDeleteCmd);.
17020 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c    }.  return TCL
17030 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72  _OK;.}../*.** Pr
17040 6f 76 69 64 65 20 61 20 64 75 6d 6d 79 20 54 63  ovide a dummy Tc
17050 6c 5f 49 6e 69 74 53 74 75 62 73 20 69 66 20 77  l_InitStubs if w
17060 65 20 61 72 65 20 75 73 69 6e 67 20 74 68 69 73  e are using this
17070 20 61 73 20 61 20 73 74 61 74 69 63 0a 2a 2a 20   as a static.** 
17080 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 23 69 66 6e  library..*/.#ifn
17090 64 65 66 20 55 53 45 5f 54 43 4c 5f 53 54 55 42  def USE_TCL_STUB
170a0 53 0a 23 20 75 6e 64 65 66 20 20 54 63 6c 5f 49  S.# undef  Tcl_I
170b0 6e 69 74 53 74 75 62 73 0a 23 20 64 65 66 69 6e  nitStubs.# defin
170c0 65 20 54 63 6c 5f 49 6e 69 74 53 74 75 62 73 28  e Tcl_InitStubs(
170d0 61 2c 62 2c 63 29 0a 23 65 6e 64 69 66 0a 0a 2f  a,b,c).#endif../
170e0 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 77  *.** Make sure w
170f0 65 20 68 61 76 65 20 61 20 50 41 43 4b 41 47 45  e have a PACKAGE
17100 5f 56 45 52 53 49 4f 4e 20 6d 61 63 72 6f 20 64  _VERSION macro d
17110 65 66 69 6e 65 64 2e 20 20 54 68 69 73 20 77 69  efined.  This wi
17120 6c 6c 20 62 65 0a 2a 2a 20 64 65 66 69 6e 65 64  ll be.** defined
17130 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 62   automatically b
17140 79 20 74 68 65 20 54 45 41 20 6d 61 6b 65 66 69  y the TEA makefi
17150 6c 65 2e 20 20 42 75 74 20 6f 74 68 65 72 20 6d  le.  But other m
17160 61 6b 65 66 69 6c 65 73 0a 2a 2a 20 64 6f 20 6e  akefiles.** do n
17170 6f 74 20 64 65 66 69 6e 65 20 69 74 2e 0a 2a 2f  ot define it..*/
17180 0a 23 69 66 6e 64 65 66 20 50 41 43 4b 41 47 45  .#ifndef PACKAGE
17190 5f 56 45 52 53 49 4f 4e 0a 23 20 64 65 66 69 6e  _VERSION.# defin
171a0 65 20 50 41 43 4b 41 47 45 5f 56 45 52 53 49 4f  e PACKAGE_VERSIO
171b0 4e 20 53 51 4c 49 54 45 5f 56 45 52 53 49 4f 4e  N SQLITE_VERSION
171c0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49  .#endif../*.** I
171d0 6e 69 74 69 61 6c 69 7a 65 20 74 68 69 73 20 6d  nitialize this m
171e0 6f 64 75 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  odule..**.** Thi
171f0 73 20 54 63 6c 20 6d 6f 64 75 6c 65 20 63 6f 6e  s Tcl module con
17200 74 61 69 6e 73 20 6f 6e 6c 79 20 61 20 73 69 6e  tains only a sin
17210 67 6c 65 20 6e 65 77 20 54 63 6c 20 63 6f 6d 6d  gle new Tcl comm
17220 61 6e 64 20 6e 61 6d 65 64 20 22 73 71 6c 69 74  and named "sqlit
17230 65 22 2e 0a 2a 2a 20 28 48 65 6e 63 65 20 74 68  e"..** (Hence th
17240 65 72 65 20 69 73 20 6e 6f 20 6e 61 6d 65 73 70  ere is no namesp
17250 61 63 65 2e 20 20 54 68 65 72 65 20 69 73 20 6e  ace.  There is n
17260 6f 20 70 6f 69 6e 74 20 69 6e 20 75 73 69 6e 67  o point in using
17270 20 61 20 6e 61 6d 65 73 70 61 63 65 0a 2a 2a 20   a namespace.** 
17280 69 66 20 74 68 65 20 65 78 74 65 6e 73 69 6f 6e  if the extension
17290 20 6f 6e 6c 79 20 73 75 70 70 6c 69 65 73 20 6f   only supplies o
172a0 6e 65 20 6e 65 77 20 6e 61 6d 65 21 29 20 20 54  ne new name!)  T
172b0 68 65 20 22 73 71 6c 69 74 65 22 20 63 6f 6d 6d  he "sqlite" comm
172c0 61 6e 64 20 69 73 0a 2a 2a 20 75 73 65 64 20 74  and is.** used t
172d0 6f 20 6f 70 65 6e 20 61 20 6e 65 77 20 53 51 4c  o open a new SQL
172e0 69 74 65 20 64 61 74 61 62 61 73 65 2e 20 20 53  ite database.  S
172f0 65 65 20 74 68 65 20 44 62 4d 61 69 6e 28 29 20  ee the DbMain() 
17300 72 6f 75 74 69 6e 65 20 61 62 6f 76 65 0a 2a 2a  routine above.**
17310 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20   for additional 
17320 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2a 0a  information..**.
17330 2a 2a 20 54 68 65 20 45 58 54 45 52 4e 20 6d 61  ** The EXTERN ma
17340 63 72 6f 73 20 61 72 65 20 72 65 71 75 69 72 65  cros are require
17350 64 20 62 79 20 54 43 4c 20 69 6e 20 6f 72 64 65  d by TCL in orde
17360 72 20 74 6f 20 77 6f 72 6b 20 6f 6e 20 77 69 6e  r to work on win
17370 64 6f 77 73 2e 0a 2a 2f 0a 45 58 54 45 52 4e 20  dows..*/.EXTERN 
17380 69 6e 74 20 53 71 6c 69 74 65 33 5f 49 6e 69 74  int Sqlite3_Init
17390 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74  (Tcl_Interp *int
173a0 65 72 70 29 7b 0a 20 20 54 63 6c 5f 49 6e 69 74  erp){.  Tcl_Init
173b0 53 74 75 62 73 28 69 6e 74 65 72 70 2c 20 22 38  Stubs(interp, "8
173c0 2e 34 22 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 43  .4", 0);.  Tcl_C
173d0 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28  reateObjCommand(
173e0 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 33  interp, "sqlite3
173f0 22 2c 20 28 54 63 6c 5f 4f 62 6a 43 6d 64 50 72  ", (Tcl_ObjCmdPr
17400 6f 63 2a 29 44 62 4d 61 69 6e 2c 20 30 2c 20 30  oc*)DbMain, 0, 0
17410 29 3b 0a 20 20 54 63 6c 5f 50 6b 67 50 72 6f 76  );.  Tcl_PkgProv
17420 69 64 65 28 69 6e 74 65 72 70 2c 20 22 73 71 6c  ide(interp, "sql
17430 69 74 65 33 22 2c 20 50 41 43 4b 41 47 45 5f 56  ite3", PACKAGE_V
17440 45 52 53 49 4f 4e 29 3b 0a 0a 23 69 66 6e 64 65  ERSION);..#ifnde
17450 66 20 53 51 4c 49 54 45 5f 33 5f 53 55 46 46 49  f SQLITE_3_SUFFI
17460 58 5f 4f 4e 4c 59 0a 20 20 2f 2a 20 54 68 65 20  X_ONLY.  /* The 
17470 22 73 71 6c 69 74 65 22 20 61 6c 69 61 73 20 69  "sqlite" alias i
17480 73 20 75 6e 64 6f 63 75 6d 65 6e 74 65 64 2e 20  s undocumented. 
17490 20 49 74 20 69 73 20 68 65 72 65 20 6f 6e 6c 79   It is here only
174a0 20 74 6f 20 73 75 70 70 6f 72 74 0a 20 20 2a 2a   to support.  **
174b0 20 6c 65 67 61 63 79 20 73 63 72 69 70 74 73 2e   legacy scripts.
174c0 20 20 41 6c 6c 20 6e 65 77 20 73 63 72 69 70 74    All new script
174d0 73 20 73 68 6f 75 6c 64 20 75 73 65 20 6f 6e 6c  s should use onl
174e0 79 20 74 68 65 20 22 73 71 6c 69 74 65 33 22 0a  y the "sqlite3".
174f0 20 20 2a 2a 20 63 6f 6d 6d 61 6e 64 2e 0a 20 20    ** command..  
17500 2a 2f 0a 20 20 54 63 6c 5f 43 72 65 61 74 65 4f  */.  Tcl_CreateO
17510 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70  bjCommand(interp
17520 2c 20 22 73 71 6c 69 74 65 22 2c 20 28 54 63 6c  , "sqlite", (Tcl
17530 5f 4f 62 6a 43 6d 64 50 72 6f 63 2a 29 44 62 4d  _ObjCmdProc*)DbM
17540 61 69 6e 2c 20 30 2c 20 30 29 3b 0a 23 65 6e 64  ain, 0, 0);.#end
17550 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  if..  return TCL
17560 5f 4f 4b 3b 0a 7d 0a 45 58 54 45 52 4e 20 69 6e  _OK;.}.EXTERN in
17570 74 20 54 63 6c 73 71 6c 69 74 65 33 5f 49 6e 69  t Tclsqlite3_Ini
17580 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  t(Tcl_Interp *in
17590 74 65 72 70 29 7b 20 72 65 74 75 72 6e 20 53 71  terp){ return Sq
175a0 6c 69 74 65 33 5f 49 6e 69 74 28 69 6e 74 65 72  lite3_Init(inter
175b0 70 29 3b 20 7d 0a 45 58 54 45 52 4e 20 69 6e 74  p); }.EXTERN int
175c0 20 53 71 6c 69 74 65 33 5f 55 6e 6c 6f 61 64 28   Sqlite3_Unload(
175d0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
175e0 72 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 20  rp, int flags){ 
175f0 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 7d  return TCL_OK; }
17600 0a 45 58 54 45 52 4e 20 69 6e 74 20 54 63 6c 73  .EXTERN int Tcls
17610 71 6c 69 74 65 33 5f 55 6e 6c 6f 61 64 28 54 63  qlite3_Unload(Tc
17620 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
17630 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 20 72 65  , int flags){ re
17640 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 7d 0a 0a  turn TCL_OK; }..
17650 2f 2a 20 42 65 63 61 75 73 65 20 69 74 20 61 63  /* Because it ac
17660 63 65 73 73 65 73 20 74 68 65 20 66 69 6c 65 2d  cesses the file-
17670 73 79 73 74 65 6d 20 61 6e 64 20 75 73 65 73 20  system and uses 
17680 70 65 72 73 69 73 74 65 6e 74 20 73 74 61 74 65  persistent state
17690 2c 20 53 51 4c 69 74 65 0a 2a 2a 20 69 73 20 6e  , SQLite.** is n
176a0 6f 74 20 63 6f 6e 73 69 64 65 72 65 64 20 61 70  ot considered ap
176b0 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 73 61  propriate for sa
176c0 66 65 20 69 6e 74 65 72 70 72 65 74 65 72 73 2e  fe interpreters.
176d0 20 20 48 65 6e 63 65 2c 20 77 65 20 64 65 6c 69    Hence, we deli
176e0 62 65 72 61 74 65 6c 79 0a 2a 2a 20 6f 6d 69 74  berately.** omit
176f0 20 74 68 65 20 5f 53 61 66 65 49 6e 69 74 28 29   the _SafeInit()
17700 20 69 6e 74 65 72 66 61 63 65 73 2e 0a 2a 2f 0a   interfaces..*/.
17710 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
17720 33 5f 53 55 46 46 49 58 5f 4f 4e 4c 59 0a 69 6e  3_SUFFIX_ONLY.in
17730 74 20 53 71 6c 69 74 65 5f 49 6e 69 74 28 54 63  t Sqlite_Init(Tc
17740 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
17750 29 7b 20 72 65 74 75 72 6e 20 53 71 6c 69 74 65  ){ return Sqlite
17760 33 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 20  3_Init(interp); 
17770 7d 0a 69 6e 74 20 54 63 6c 73 71 6c 69 74 65 5f  }.int Tclsqlite_
17780 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20  Init(Tcl_Interp 
17790 2a 69 6e 74 65 72 70 29 7b 20 72 65 74 75 72 6e  *interp){ return
177a0 20 53 71 6c 69 74 65 33 5f 49 6e 69 74 28 69 6e   Sqlite3_Init(in
177b0 74 65 72 70 29 3b 20 7d 0a 69 6e 74 20 53 71 6c  terp); }.int Sql
177c0 69 74 65 5f 55 6e 6c 6f 61 64 28 54 63 6c 5f 49  ite_Unload(Tcl_I
177d0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69  nterp *interp, i
177e0 6e 74 20 66 6c 61 67 73 29 7b 20 72 65 74 75 72  nt flags){ retur
177f0 6e 20 54 43 4c 5f 4f 4b 3b 20 7d 0a 69 6e 74 20  n TCL_OK; }.int 
17800 54 63 6c 73 71 6c 69 74 65 5f 55 6e 6c 6f 61 64  Tclsqlite_Unload
17810 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74  (Tcl_Interp *int
17820 65 72 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b  erp, int flags){
17830 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20   return TCL_OK; 
17840 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66  }.#endif..#ifdef
17850 20 54 43 4c 53 48 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a   TCLSH./********
17860 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17870 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17880 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17890 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
178a0 2a 2a 2a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 66 20  *****.** All of 
178b0 74 68 65 20 63 6f 64 65 20 74 68 61 74 20 66 6f  the code that fo
178c0 6c 6c 6f 77 73 20 69 73 20 75 73 65 64 20 74 6f  llows is used to
178d0 20 62 75 69 6c 64 20 73 74 61 6e 64 61 6c 6f 6e   build standalon
178e0 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
178f0 72 73 0a 2a 2a 20 74 68 61 74 20 61 72 65 20 73  rs.** that are s
17900 74 61 74 69 63 61 6c 6c 79 20 6c 69 6e 6b 65 64  tatically linked
17910 20 77 69 74 68 20 53 51 4c 69 74 65 2e 20 20 45   with SQLite.  E
17920 6e 61 62 6c 65 20 74 68 65 73 65 20 62 79 20 63  nable these by c
17930 6f 6d 70 69 6c 69 6e 67 0a 2a 2a 20 77 69 74 68  ompiling.** with
17940 20 2d 44 54 43 4c 53 48 3d 6e 20 77 68 65 72 65   -DTCLSH=n where
17950 20 6e 20 63 61 6e 20 62 65 20 31 20 6f 72 20 32   n can be 1 or 2
17960 2e 20 20 41 6e 20 6e 20 6f 66 20 31 20 67 65 6e  .  An n of 1 gen
17970 65 72 61 74 65 73 20 61 20 73 74 61 6e 64 61 72  erates a standar
17980 64 0a 2a 2a 20 74 63 6c 73 68 20 62 75 74 20 77  d.** tclsh but w
17990 69 74 68 20 53 51 4c 69 74 65 20 62 75 69 6c 74  ith SQLite built
179a0 20 69 6e 2e 20 20 41 6e 20 6e 20 6f 66 20 32 20   in.  An n of 2 
179b0 67 65 6e 65 72 61 74 65 73 20 74 68 65 20 53 51  generates the SQ
179c0 4c 69 74 65 20 73 70 61 63 65 0a 2a 2a 20 61 6e  Lite space.** an
179d0 61 6c 79 73 69 73 20 70 72 6f 67 72 61 6d 2e 0a  alysis program..
179e0 2a 2f 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  */..#if defined(
179f0 53 51 4c 49 54 45 5f 54 45 53 54 29 20 7c 7c 20  SQLITE_TEST) || 
17a00 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
17a10 43 4c 4d 44 35 29 0a 2f 2a 0a 20 2a 20 54 68 69  CLMD5)./*. * Thi
17a20 73 20 63 6f 64 65 20 69 6d 70 6c 65 6d 65 6e 74  s code implement
17a30 73 20 74 68 65 20 4d 44 35 20 6d 65 73 73 61 67  s the MD5 messag
17a40 65 2d 64 69 67 65 73 74 20 61 6c 67 6f 72 69 74  e-digest algorit
17a50 68 6d 2e 0a 20 2a 20 54 68 65 20 61 6c 67 6f 72  hm.. * The algor
17a60 69 74 68 6d 20 69 73 20 64 75 65 20 74 6f 20 52  ithm is due to R
17a70 6f 6e 20 52 69 76 65 73 74 2e 20 20 54 68 69 73  on Rivest.  This
17a80 20 63 6f 64 65 20 77 61 73 0a 20 2a 20 77 72 69   code was. * wri
17a90 74 74 65 6e 20 62 79 20 43 6f 6c 69 6e 20 50 6c  tten by Colin Pl
17aa0 75 6d 62 20 69 6e 20 31 39 39 33 2c 20 6e 6f 20  umb in 1993, no 
17ab0 63 6f 70 79 72 69 67 68 74 20 69 73 20 63 6c 61  copyright is cla
17ac0 69 6d 65 64 2e 0a 20 2a 20 54 68 69 73 20 63 6f  imed.. * This co
17ad0 64 65 20 69 73 20 69 6e 20 74 68 65 20 70 75 62  de is in the pub
17ae0 6c 69 63 20 64 6f 6d 61 69 6e 3b 20 64 6f 20 77  lic domain; do w
17af0 69 74 68 20 69 74 20 77 68 61 74 20 79 6f 75 20  ith it what you 
17b00 77 69 73 68 2e 0a 20 2a 0a 20 2a 20 45 71 75 69  wish.. *. * Equi
17b10 76 61 6c 65 6e 74 20 63 6f 64 65 20 69 73 20 61  valent code is a
17b20 76 61 69 6c 61 62 6c 65 20 66 72 6f 6d 20 52 53  vailable from RS
17b30 41 20 44 61 74 61 20 53 65 63 75 72 69 74 79 2c  A Data Security,
17b40 20 49 6e 63 2e 0a 20 2a 20 54 68 69 73 20 63 6f   Inc.. * This co
17b50 64 65 20 68 61 73 20 62 65 65 6e 20 74 65 73 74  de has been test
17b60 65 64 20 61 67 61 69 6e 73 74 20 74 68 61 74 2c  ed against that,
17b70 20 61 6e 64 20 69 73 20 65 71 75 69 76 61 6c 65   and is equivale
17b80 6e 74 2c 0a 20 2a 20 65 78 63 65 70 74 20 74 68  nt,. * except th
17b90 61 74 20 79 6f 75 20 64 6f 6e 27 74 20 6e 65 65  at you don't nee
17ba0 64 20 74 6f 20 69 6e 63 6c 75 64 65 20 74 77 6f  d to include two
17bb0 20 70 61 67 65 73 20 6f 66 20 6c 65 67 61 6c 65   pages of legale
17bc0 73 65 0a 20 2a 20 77 69 74 68 20 65 76 65 72 79  se. * with every
17bd0 20 63 6f 70 79 2e 0a 20 2a 0a 20 2a 20 54 6f 20   copy.. *. * To 
17be0 63 6f 6d 70 75 74 65 20 74 68 65 20 6d 65 73 73  compute the mess
17bf0 61 67 65 20 64 69 67 65 73 74 20 6f 66 20 61 20  age digest of a 
17c00 63 68 75 6e 6b 20 6f 66 20 62 79 74 65 73 2c 20  chunk of bytes, 
17c10 64 65 63 6c 61 72 65 20 61 6e 0a 20 2a 20 4d 44  declare an. * MD
17c20 35 43 6f 6e 74 65 78 74 20 73 74 72 75 63 74 75  5Context structu
17c30 72 65 2c 20 70 61 73 73 20 69 74 20 74 6f 20 4d  re, pass it to M
17c40 44 35 49 6e 69 74 2c 20 63 61 6c 6c 20 4d 44 35  D5Init, call MD5
17c50 55 70 64 61 74 65 20 61 73 0a 20 2a 20 6e 65 65  Update as. * nee
17c60 64 65 64 20 6f 6e 20 62 75 66 66 65 72 73 20 66  ded on buffers f
17c70 75 6c 6c 20 6f 66 20 62 79 74 65 73 2c 20 61 6e  ull of bytes, an
17c80 64 20 74 68 65 6e 20 63 61 6c 6c 20 4d 44 35 46  d then call MD5F
17c90 69 6e 61 6c 2c 20 77 68 69 63 68 0a 20 2a 20 77  inal, which. * w
17ca0 69 6c 6c 20 66 69 6c 6c 20 61 20 73 75 70 70 6c  ill fill a suppl
17cb0 69 65 64 20 31 36 2d 62 79 74 65 20 61 72 72 61  ied 16-byte arra
17cc0 79 20 77 69 74 68 20 74 68 65 20 64 69 67 65 73  y with the diges
17cd0 74 2e 0a 20 2a 2f 0a 0a 2f 2a 0a 20 2a 20 49 66  t.. */../*. * If
17ce0 20 63 6f 6d 70 69 6c 65 64 20 6f 6e 20 61 20 6d   compiled on a m
17cf0 61 63 68 69 6e 65 20 74 68 61 74 20 64 6f 65 73  achine that does
17d00 6e 27 74 20 68 61 76 65 20 61 20 33 32 2d 62 69  n't have a 32-bi
17d10 74 20 69 6e 74 65 67 65 72 2c 0a 20 2a 20 79 6f  t integer,. * yo
17d20 75 20 6a 75 73 74 20 73 65 74 20 22 75 69 6e 74  u just set "uint
17d30 33 32 22 20 74 6f 20 74 68 65 20 61 70 70 72 6f  32" to the appro
17d40 70 72 69 61 74 65 20 64 61 74 61 74 79 70 65 20  priate datatype 
17d50 66 6f 72 20 61 6e 0a 20 2a 20 75 6e 73 69 67 6e  for an. * unsign
17d60 65 64 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65  ed 32-bit intege
17d70 72 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a  r.  For example:
17d80 0a 20 2a 0a 20 2a 20 20 20 20 20 20 20 63 63 20  . *. *       cc 
17d90 2d 44 75 69 6e 74 33 32 3d 27 75 6e 73 69 67 6e  -Duint32='unsign
17da0 65 64 20 6c 6f 6e 67 27 20 6d 64 35 2e 63 0a 20  ed long' md5.c. 
17db0 2a 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 75 69  *. */.#ifndef ui
17dc0 6e 74 33 32 0a 23 20 20 64 65 66 69 6e 65 20 75  nt32.#  define u
17dd0 69 6e 74 33 32 20 75 6e 73 69 67 6e 65 64 20 69  int32 unsigned i
17de0 6e 74 0a 23 65 6e 64 69 66 0a 0a 73 74 72 75 63  nt.#endif..struc
17df0 74 20 4d 44 35 43 6f 6e 74 65 78 74 20 7b 0a 20  t MD5Context {. 
17e00 20 69 6e 74 20 69 73 49 6e 69 74 3b 0a 20 20 75   int isInit;.  u
17e10 69 6e 74 33 32 20 62 75 66 5b 34 5d 3b 0a 20 20  int32 buf[4];.  
17e20 75 69 6e 74 33 32 20 62 69 74 73 5b 32 5d 3b 0a  uint32 bits[2];.
17e30 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
17e40 69 6e 5b 36 34 5d 3b 0a 7d 3b 0a 74 79 70 65 64  in[64];.};.typed
17e50 65 66 20 73 74 72 75 63 74 20 4d 44 35 43 6f 6e  ef struct MD5Con
17e60 74 65 78 74 20 4d 44 35 43 6f 6e 74 65 78 74 3b  text MD5Context;
17e70 0a 0a 2f 2a 0a 20 2a 20 4e 6f 74 65 3a 20 74 68  ../*. * Note: th
17e80 69 73 20 63 6f 64 65 20 69 73 20 68 61 72 6d 6c  is code is harml
17e90 65 73 73 20 6f 6e 20 6c 69 74 74 6c 65 2d 65 6e  ess on little-en
17ea0 64 69 61 6e 20 6d 61 63 68 69 6e 65 73 2e 0a 20  dian machines.. 
17eb0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62  */.static void b
17ec0 79 74 65 52 65 76 65 72 73 65 20 28 75 6e 73 69  yteReverse (unsi
17ed0 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66 2c 20  gned char *buf, 
17ee0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 73 29 7b  unsigned longs){
17ef0 0a 20 20 20 20 20 20 20 20 75 69 6e 74 33 32 20  .        uint32 
17f00 74 3b 0a 20 20 20 20 20 20 20 20 64 6f 20 7b 0a  t;.        do {.
17f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f20 74 20 3d 20 28 75 69 6e 74 33 32 29 28 28 75 6e  t = (uint32)((un
17f30 73 69 67 6e 65 64 29 62 75 66 5b 33 5d 3c 3c 38  signed)buf[3]<<8
17f40 20 7c 20 62 75 66 5b 32 5d 29 20 3c 3c 20 31 36   | buf[2]) << 16
17f50 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   |.             
17f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
17f70 28 75 6e 73 69 67 6e 65 64 29 62 75 66 5b 31 5d  (unsigned)buf[1]
17f80 3c 3c 38 20 7c 20 62 75 66 5b 30 5d 29 3b 0a 20  <<8 | buf[0]);. 
17f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
17fa0 28 75 69 6e 74 33 32 20 2a 29 62 75 66 20 3d 20  (uint32 *)buf = 
17fb0 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t;.             
17fc0 20 20 20 62 75 66 20 2b 3d 20 34 3b 0a 20 20 20     buf += 4;.   
17fd0 20 20 20 20 20 7d 20 77 68 69 6c 65 20 28 2d 2d       } while (--
17fe0 6c 6f 6e 67 73 29 3b 0a 7d 0a 2f 2a 20 54 68 65  longs);.}./* The
17ff0 20 66 6f 75 72 20 63 6f 72 65 20 66 75 6e 63 74   four core funct
18000 69 6f 6e 73 20 2d 20 46 31 20 69 73 20 6f 70 74  ions - F1 is opt
18010 69 6d 69 7a 65 64 20 73 6f 6d 65 77 68 61 74 20  imized somewhat 
18020 2a 2f 0a 0a 2f 2a 20 23 64 65 66 69 6e 65 20 46  */../* #define F
18030 31 28 78 2c 20 79 2c 20 7a 29 20 28 78 20 26 20  1(x, y, z) (x & 
18040 79 20 7c 20 7e 78 20 26 20 7a 29 20 2a 2f 0a 23  y | ~x & z) */.#
18050 64 65 66 69 6e 65 20 46 31 28 78 2c 20 79 2c 20  define F1(x, y, 
18060 7a 29 20 28 7a 20 5e 20 28 78 20 26 20 28 79 20  z) (z ^ (x & (y 
18070 5e 20 7a 29 29 29 0a 23 64 65 66 69 6e 65 20 46  ^ z))).#define F
18080 32 28 78 2c 20 79 2c 20 7a 29 20 46 31 28 7a 2c  2(x, y, z) F1(z,
18090 20 78 2c 20 79 29 0a 23 64 65 66 69 6e 65 20 46   x, y).#define F
180a0 33 28 78 2c 20 79 2c 20 7a 29 20 28 78 20 5e 20  3(x, y, z) (x ^ 
180b0 79 20 5e 20 7a 29 0a 23 64 65 66 69 6e 65 20 46  y ^ z).#define F
180c0 34 28 78 2c 20 79 2c 20 7a 29 20 28 79 20 5e 20  4(x, y, z) (y ^ 
180d0 28 78 20 7c 20 7e 7a 29 29 0a 0a 2f 2a 20 54 68  (x | ~z))../* Th
180e0 69 73 20 69 73 20 74 68 65 20 63 65 6e 74 72 61  is is the centra
180f0 6c 20 73 74 65 70 20 69 6e 20 74 68 65 20 4d 44  l step in the MD
18100 35 20 61 6c 67 6f 72 69 74 68 6d 2e 20 2a 2f 0a  5 algorithm. */.
18110 23 64 65 66 69 6e 65 20 4d 44 35 53 54 45 50 28  #define MD5STEP(
18120 66 2c 20 77 2c 20 78 2c 20 79 2c 20 7a 2c 20 64  f, w, x, y, z, d
18130 61 74 61 2c 20 73 29 20 5c 0a 20 20 20 20 20 20  ata, s) \.      
18140 20 20 28 20 77 20 2b 3d 20 66 28 78 2c 20 79 2c    ( w += f(x, y,
18150 20 7a 29 20 2b 20 64 61 74 61 2c 20 20 77 20 3d   z) + data,  w =
18160 20 77 3c 3c 73 20 7c 20 77 3e 3e 28 33 32 2d 73   w<<s | w>>(32-s
18170 29 2c 20 20 77 20 2b 3d 20 78 20 29 0a 0a 2f 2a  ),  w += x )../*
18180 0a 20 2a 20 54 68 65 20 63 6f 72 65 20 6f 66 20  . * The core of 
18190 74 68 65 20 4d 44 35 20 61 6c 67 6f 72 69 74 68  the MD5 algorith
181a0 6d 2c 20 74 68 69 73 20 61 6c 74 65 72 73 20 61  m, this alters a
181b0 6e 20 65 78 69 73 74 69 6e 67 20 4d 44 35 20 68  n existing MD5 h
181c0 61 73 68 20 74 6f 0a 20 2a 20 72 65 66 6c 65 63  ash to. * reflec
181d0 74 20 74 68 65 20 61 64 64 69 74 69 6f 6e 20 6f  t the addition o
181e0 66 20 31 36 20 6c 6f 6e 67 77 6f 72 64 73 20 6f  f 16 longwords o
181f0 66 20 6e 65 77 20 64 61 74 61 2e 20 20 4d 44 35  f new data.  MD5
18200 55 70 64 61 74 65 20 62 6c 6f 63 6b 73 0a 20 2a  Update blocks. *
18210 20 74 68 65 20 64 61 74 61 20 61 6e 64 20 63 6f   the data and co
18220 6e 76 65 72 74 73 20 62 79 74 65 73 20 69 6e 74  nverts bytes int
18230 6f 20 6c 6f 6e 67 77 6f 72 64 73 20 66 6f 72 20  o longwords for 
18240 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 20 2a  this routine.. *
18250 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 4d 44  /.static void MD
18260 35 54 72 61 6e 73 66 6f 72 6d 28 75 69 6e 74 33  5Transform(uint3
18270 32 20 62 75 66 5b 34 5d 2c 20 63 6f 6e 73 74 20  2 buf[4], const 
18280 75 69 6e 74 33 32 20 69 6e 5b 31 36 5d 29 7b 0a  uint32 in[16]){.
18290 20 20 20 20 20 20 20 20 72 65 67 69 73 74 65 72          register
182a0 20 75 69 6e 74 33 32 20 61 2c 20 62 2c 20 63 2c   uint32 a, b, c,
182b0 20 64 3b 0a 0a 20 20 20 20 20 20 20 20 61 20 3d   d;..        a =
182c0 20 62 75 66 5b 30 5d 3b 0a 20 20 20 20 20 20 20   buf[0];.       
182d0 20 62 20 3d 20 62 75 66 5b 31 5d 3b 0a 20 20 20   b = buf[1];.   
182e0 20 20 20 20 20 63 20 3d 20 62 75 66 5b 32 5d 3b       c = buf[2];
182f0 0a 20 20 20 20 20 20 20 20 64 20 3d 20 62 75 66  .        d = buf
18300 5b 33 5d 3b 0a 0a 20 20 20 20 20 20 20 20 4d 44  [3];..        MD
18310 35 53 54 45 50 28 46 31 2c 20 61 2c 20 62 2c 20  5STEP(F1, a, b, 
18320 63 2c 20 64 2c 20 69 6e 5b 20 30 5d 2b 30 78 64  c, d, in[ 0]+0xd
18330 37 36 61 61 34 37 38 2c 20 20 37 29 3b 0a 20 20  76aa478,  7);.  
18340 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 31        MD5STEP(F1
18350 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e  , d, a, b, c, in
18360 5b 20 31 5d 2b 30 78 65 38 63 37 62 37 35 36 2c  [ 1]+0xe8c7b756,
18370 20 31 32 29 3b 0a 20 20 20 20 20 20 20 20 4d 44   12);.        MD
18380 35 53 54 45 50 28 46 31 2c 20 63 2c 20 64 2c 20  5STEP(F1, c, d, 
18390 61 2c 20 62 2c 20 69 6e 5b 20 32 5d 2b 30 78 32  a, b, in[ 2]+0x2
183a0 34 32 30 37 30 64 62 2c 20 31 37 29 3b 0a 20 20  42070db, 17);.  
183b0 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 31        MD5STEP(F1
183c0 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e  , b, c, d, a, in
183d0 5b 20 33 5d 2b 30 78 63 31 62 64 63 65 65 65 2c  [ 3]+0xc1bdceee,
183e0 20 32 32 29 3b 0a 20 20 20 20 20 20 20 20 4d 44   22);.        MD
183f0 35 53 54 45 50 28 46 31 2c 20 61 2c 20 62 2c 20  5STEP(F1, a, b, 
18400 63 2c 20 64 2c 20 69 6e 5b 20 34 5d 2b 30 78 66  c, d, in[ 4]+0xf
18410 35 37 63 30 66 61 66 2c 20 20 37 29 3b 0a 20 20  57c0faf,  7);.  
18420 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 31        MD5STEP(F1
18430 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e  , d, a, b, c, in
18440 5b 20 35 5d 2b 30 78 34 37 38 37 63 36 32 61 2c  [ 5]+0x4787c62a,
18450 20 31 32 29 3b 0a 20 20 20 20 20 20 20 20 4d 44   12);.        MD
18460 35 53 54 45 50 28 46 31 2c 20 63 2c 20 64 2c 20  5STEP(F1, c, d, 
18470 61 2c 20 62 2c 20 69 6e 5b 20 36 5d 2b 30 78 61  a, b, in[ 6]+0xa
18480 38 33 30 34 36 31 33 2c 20 31 37 29 3b 0a 20 20  8304613, 17);.  
18490 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 31        MD5STEP(F1
184a0 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e  , b, c, d, a, in
184b0 5b 20 37 5d 2b 30 78 66 64 34 36 39 35 30 31 2c  [ 7]+0xfd469501,
184c0 20 32 32 29 3b 0a 20 20 20 20 20 20 20 20 4d 44   22);.        MD
184d0 35 53 54 45 50 28 46 31 2c 20 61 2c 20 62 2c 20  5STEP(F1, a, b, 
184e0 63 2c 20 64 2c 20 69 6e 5b 20 38 5d 2b 30 78 36  c, d, in[ 8]+0x6
184f0 39 38 30 39 38 64 38 2c 20 20 37 29 3b 0a 20 20  98098d8,  7);.  
18500 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 31        MD5STEP(F1
18510 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e  , d, a, b, c, in
18520 5b 20 39 5d 2b 30 78 38 62 34 34 66 37 61 66 2c  [ 9]+0x8b44f7af,
18530 20 31 32 29 3b 0a 20 20 20 20 20 20 20 20 4d 44   12);.        MD
18540 35 53 54 45 50 28 46 31 2c 20 63 2c 20 64 2c 20  5STEP(F1, c, d, 
18550 61 2c 20 62 2c 20 69 6e 5b 31 30 5d 2b 30 78 66  a, b, in[10]+0xf
18560 66 66 66 35 62 62 31 2c 20 31 37 29 3b 0a 20 20  fff5bb1, 17);.  
18570 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 31        MD5STEP(F1
18580 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e  , b, c, d, a, in
18590 5b 31 31 5d 2b 30 78 38 39 35 63 64 37 62 65 2c  [11]+0x895cd7be,
185a0 20 32 32 29 3b 0a 20 20 20 20 20 20 20 20 4d 44   22);.        MD
185b0 35 53 54 45 50 28 46 31 2c 20 61 2c 20 62 2c 20  5STEP(F1, a, b, 
185c0 63 2c 20 64 2c 20 69 6e 5b 31 32 5d 2b 30 78 36  c, d, in[12]+0x6
185d0 62 39 30 31 31 32 32 2c 20 20 37 29 3b 0a 20 20  b901122,  7);.  
185e0 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 31        MD5STEP(F1
185f0 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e  , d, a, b, c, in
18600 5b 31 33 5d 2b 30 78 66 64 39 38 37 31 39 33 2c  [13]+0xfd987193,
18610 20 31 32 29 3b 0a 20 20 20 20 20 20 20 20 4d 44   12);.        MD
18620 35 53 54 45 50 28 46 31 2c 20 63 2c 20 64 2c 20  5STEP(F1, c, d, 
18630 61 2c 20 62 2c 20 69 6e 5b 31 34 5d 2b 30 78 61  a, b, in[14]+0xa
18640 36 37 39 34 33 38 65 2c 20 31 37 29 3b 0a 20 20  679438e, 17);.  
18650 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46 31        MD5STEP(F1
18660 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e  , b, c, d, a, in
18670 5b 31 35 5d 2b 30 78 34 39 62 34 30 38 32 31 2c  [15]+0x49b40821,
18680 20 32 32 29 3b 0a 0a 20 20 20 20 20 20 20 20 4d   22);..        M
18690 44 35 53 54 45 50 28 46 32 2c 20 61 2c 20 62 2c  D5STEP(F2, a, b,
186a0 20 63 2c 20 64 2c 20 69 6e 5b 20 31 5d 2b 30 78   c, d, in[ 1]+0x
186b0 66 36 31 65 32 35 36 32 2c 20 20 35 29 3b 0a 20  f61e2562,  5);. 
186c0 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
186d0 32 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69  2, d, a, b, c, i
186e0 6e 5b 20 36 5d 2b 30 78 63 30 34 30 62 33 34 30  n[ 6]+0xc040b340
186f0 2c 20 20 39 29 3b 0a 20 20 20 20 20 20 20 20 4d  ,  9);.        M
18700 44 35 53 54 45 50 28 46 32 2c 20 63 2c 20 64 2c  D5STEP(F2, c, d,
18710 20 61 2c 20 62 2c 20 69 6e 5b 31 31 5d 2b 30 78   a, b, in[11]+0x
18720 32 36 35 65 35 61 35 31 2c 20 31 34 29 3b 0a 20  265e5a51, 14);. 
18730 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
18740 32 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69  2, b, c, d, a, i
18750 6e 5b 20 30 5d 2b 30 78 65 39 62 36 63 37 61 61  n[ 0]+0xe9b6c7aa
18760 2c 20 32 30 29 3b 0a 20 20 20 20 20 20 20 20 4d  , 20);.        M
18770 44 35 53 54 45 50 28 46 32 2c 20 61 2c 20 62 2c  D5STEP(F2, a, b,
18780 20 63 2c 20 64 2c 20 69 6e 5b 20 35 5d 2b 30 78   c, d, in[ 5]+0x
18790 64 36 32 66 31 30 35 64 2c 20 20 35 29 3b 0a 20  d62f105d,  5);. 
187a0 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
187b0 32 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69  2, d, a, b, c, i
187c0 6e 5b 31 30 5d 2b 30 78 30 32 34 34 31 34 35 33  n[10]+0x02441453
187d0 2c 20 20 39 29 3b 0a 20 20 20 20 20 20 20 20 4d  ,  9);.        M
187e0 44 35 53 54 45 50 28 46 32 2c 20 63 2c 20 64 2c  D5STEP(F2, c, d,
187f0 20 61 2c 20 62 2c 20 69 6e 5b 31 35 5d 2b 30 78   a, b, in[15]+0x
18800 64 38 61 31 65 36 38 31 2c 20 31 34 29 3b 0a 20  d8a1e681, 14);. 
18810 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
18820 32 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69  2, b, c, d, a, i
18830 6e 5b 20 34 5d 2b 30 78 65 37 64 33 66 62 63 38  n[ 4]+0xe7d3fbc8
18840 2c 20 32 30 29 3b 0a 20 20 20 20 20 20 20 20 4d  , 20);.        M
18850 44 35 53 54 45 50 28 46 32 2c 20 61 2c 20 62 2c  D5STEP(F2, a, b,
18860 20 63 2c 20 64 2c 20 69 6e 5b 20 39 5d 2b 30 78   c, d, in[ 9]+0x
18870 32 31 65 31 63 64 65 36 2c 20 20 35 29 3b 0a 20  21e1cde6,  5);. 
18880 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
18890 32 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69  2, d, a, b, c, i
188a0 6e 5b 31 34 5d 2b 30 78 63 33 33 37 30 37 64 36  n[14]+0xc33707d6
188b0 2c 20 20 39 29 3b 0a 20 20 20 20 20 20 20 20 4d  ,  9);.        M
188c0 44 35 53 54 45 50 28 46 32 2c 20 63 2c 20 64 2c  D5STEP(F2, c, d,
188d0 20 61 2c 20 62 2c 20 69 6e 5b 20 33 5d 2b 30 78   a, b, in[ 3]+0x
188e0 66 34 64 35 30 64 38 37 2c 20 31 34 29 3b 0a 20  f4d50d87, 14);. 
188f0 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
18900 32 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69  2, b, c, d, a, i
18910 6e 5b 20 38 5d 2b 30 78 34 35 35 61 31 34 65 64  n[ 8]+0x455a14ed
18920 2c 20 32 30 29 3b 0a 20 20 20 20 20 20 20 20 4d  , 20);.        M
18930 44 35 53 54 45 50 28 46 32 2c 20 61 2c 20 62 2c  D5STEP(F2, a, b,
18940 20 63 2c 20 64 2c 20 69 6e 5b 31 33 5d 2b 30 78   c, d, in[13]+0x
18950 61 39 65 33 65 39 30 35 2c 20 20 35 29 3b 0a 20  a9e3e905,  5);. 
18960 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
18970 32 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69  2, d, a, b, c, i
18980 6e 5b 20 32 5d 2b 30 78 66 63 65 66 61 33 66 38  n[ 2]+0xfcefa3f8
18990 2c 20 20 39 29 3b 0a 20 20 20 20 20 20 20 20 4d  ,  9);.        M
189a0 44 35 53 54 45 50 28 46 32 2c 20 63 2c 20 64 2c  D5STEP(F2, c, d,
189b0 20 61 2c 20 62 2c 20 69 6e 5b 20 37 5d 2b 30 78   a, b, in[ 7]+0x
189c0 36 37 36 66 30 32 64 39 2c 20 31 34 29 3b 0a 20  676f02d9, 14);. 
189d0 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28 46         MD5STEP(F
189e0 32 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69  2, b, c, d, a, i
189f0 6e 5b 31 32 5d 2b 30 78 38 64 32 61 34 63 38 61  n[12]+0x8d2a4c8a
18a00 2c 20 32 30 29 3b 0a 0a 20 20 20 20 20 20 20 20  , 20);..        
18a10 4d 44 35 53 54 45 50 28 46 33 2c 20 61 2c 20 62  MD5STEP(F3, a, b
18a20 2c 20 63 2c 20 64 2c 20 69 6e 5b 20 35 5d 2b 30  , c, d, in[ 5]+0
18a30 78 66 66 66 61 33 39 34 32 2c 20 20 34 29 3b 0a  xfffa3942,  4);.
18a40 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28          MD5STEP(
18a50 46 33 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20  F3, d, a, b, c, 
18a60 69 6e 5b 20 38 5d 2b 30 78 38 37 37 31 66 36 38  in[ 8]+0x8771f68
18a70 31 2c 20 31 31 29 3b 0a 20 20 20 20 20 20 20 20  1, 11);.        
18a80 4d 44 35 53 54 45 50 28 46 33 2c 20 63 2c 20 64  MD5STEP(F3, c, d
18a90 2c 20 61 2c 20 62 2c 20 69 6e 5b 31 31 5d 2b 30  , a, b, in[11]+0
18aa0 78 36 64 39 64 36 31 32 32 2c 20 31 36 29 3b 0a  x6d9d6122, 16);.
18ab0 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28          MD5STEP(
18ac0 46 33 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20  F3, b, c, d, a, 
18ad0 69 6e 5b 31 34 5d 2b 30 78 66 64 65 35 33 38 30  in[14]+0xfde5380
18ae0 63 2c 20 32 33 29 3b 0a 20 20 20 20 20 20 20 20  c, 23);.        
18af0 4d 44 35 53 54 45 50 28 46 33 2c 20 61 2c 20 62  MD5STEP(F3, a, b
18b00 2c 20 63 2c 20 64 2c 20 69 6e 5b 20 31 5d 2b 30  , c, d, in[ 1]+0
18b10 78 61 34 62 65 65 61 34 34 2c 20 20 34 29 3b 0a  xa4beea44,  4);.
18b20 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28          MD5STEP(
18b30 46 33 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20  F3, d, a, b, c, 
18b40 69 6e 5b 20 34 5d 2b 30 78 34 62 64 65 63 66 61  in[ 4]+0x4bdecfa
18b50 39 2c 20 31 31 29 3b 0a 20 20 20 20 20 20 20 20  9, 11);.        
18b60 4d 44 35 53 54 45 50 28 46 33 2c 20 63 2c 20 64  MD5STEP(F3, c, d
18b70 2c 20 61 2c 20 62 2c 20 69 6e 5b 20 37 5d 2b 30  , a, b, in[ 7]+0
18b80 78 66 36 62 62 34 62 36 30 2c 20 31 36 29 3b 0a  xf6bb4b60, 16);.
18b90 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28          MD5STEP(
18ba0 46 33 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20  F3, b, c, d, a, 
18bb0 69 6e 5b 31 30 5d 2b 30 78 62 65 62 66 62 63 37  in[10]+0xbebfbc7
18bc0 30 2c 20 32 33 29 3b 0a 20 20 20 20 20 20 20 20  0, 23);.        
18bd0 4d 44 35 53 54 45 50 28 46 33 2c 20 61 2c 20 62  MD5STEP(F3, a, b
18be0 2c 20 63 2c 20 64 2c 20 69 6e 5b 31 33 5d 2b 30  , c, d, in[13]+0
18bf0 78 32 38 39 62 37 65 63 36 2c 20 20 34 29 3b 0a  x289b7ec6,  4);.
18c00 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28          MD5STEP(
18c10 46 33 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20  F3, d, a, b, c, 
18c20 69 6e 5b 20 30 5d 2b 30 78 65 61 61 31 32 37 66  in[ 0]+0xeaa127f
18c30 61 2c 20 31 31 29 3b 0a 20 20 20 20 20 20 20 20  a, 11);.        
18c40 4d 44 35 53 54 45 50 28 46 33 2c 20 63 2c 20 64  MD5STEP(F3, c, d
18c50 2c 20 61 2c 20 62 2c 20 69 6e 5b 20 33 5d 2b 30  , a, b, in[ 3]+0
18c60 78 64 34 65 66 33 30 38 35 2c 20 31 36 29 3b 0a  xd4ef3085, 16);.
18c70 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28          MD5STEP(
18c80 46 33 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20  F3, b, c, d, a, 
18c90 69 6e 5b 20 36 5d 2b 30 78 30 34 38 38 31 64 30  in[ 6]+0x04881d0
18ca0 35 2c 20 32 33 29 3b 0a 20 20 20 20 20 20 20 20  5, 23);.        
18cb0 4d 44 35 53 54 45 50 28 46 33 2c 20 61 2c 20 62  MD5STEP(F3, a, b
18cc0 2c 20 63 2c 20 64 2c 20 69 6e 5b 20 39 5d 2b 30  , c, d, in[ 9]+0
18cd0 78 64 39 64 34 64 30 33 39 2c 20 20 34 29 3b 0a  xd9d4d039,  4);.
18ce0 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28          MD5STEP(
18cf0 46 33 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20  F3, d, a, b, c, 
18d00 69 6e 5b 31 32 5d 2b 30 78 65 36 64 62 39 39 65  in[12]+0xe6db99e
18d10 35 2c 20 31 31 29 3b 0a 20 20 20 20 20 20 20 20  5, 11);.        
18d20 4d 44 35 53 54 45 50 28 46 33 2c 20 63 2c 20 64  MD5STEP(F3, c, d
18d30 2c 20 61 2c 20 62 2c 20 69 6e 5b 31 35 5d 2b 30  , a, b, in[15]+0
18d40 78 31 66 61 32 37 63 66 38 2c 20 31 36 29 3b 0a  x1fa27cf8, 16);.
18d50 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50 28          MD5STEP(
18d60 46 33 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20  F3, b, c, d, a, 
18d70 69 6e 5b 20 32 5d 2b 30 78 63 34 61 63 35 36 36  in[ 2]+0xc4ac566
18d80 35 2c 20 32 33 29 3b 0a 0a 20 20 20 20 20 20 20  5, 23);..       
18d90 20 4d 44 35 53 54 45 50 28 46 34 2c 20 61 2c 20   MD5STEP(F4, a, 
18da0 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 20 30 5d 2b  b, c, d, in[ 0]+
18db0 30 78 66 34 32 39 32 32 34 34 2c 20 20 36 29 3b  0xf4292244,  6);
18dc0 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50  .        MD5STEP
18dd0 28 46 34 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c  (F4, d, a, b, c,
18de0 20 69 6e 5b 20 37 5d 2b 30 78 34 33 32 61 66 66   in[ 7]+0x432aff
18df0 39 37 2c 20 31 30 29 3b 0a 20 20 20 20 20 20 20  97, 10);.       
18e00 20 4d 44 35 53 54 45 50 28 46 34 2c 20 63 2c 20   MD5STEP(F4, c, 
18e10 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 31 34 5d 2b  d, a, b, in[14]+
18e20 30 78 61 62 39 34 32 33 61 37 2c 20 31 35 29 3b  0xab9423a7, 15);
18e30 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50  .        MD5STEP
18e40 28 46 34 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c  (F4, b, c, d, a,
18e50 20 69 6e 5b 20 35 5d 2b 30 78 66 63 39 33 61 30   in[ 5]+0xfc93a0
18e60 33 39 2c 20 32 31 29 3b 0a 20 20 20 20 20 20 20  39, 21);.       
18e70 20 4d 44 35 53 54 45 50 28 46 34 2c 20 61 2c 20   MD5STEP(F4, a, 
18e80 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 31 32 5d 2b  b, c, d, in[12]+
18e90 30 78 36 35 35 62 35 39 63 33 2c 20 20 36 29 3b  0x655b59c3,  6);
18ea0 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50  .        MD5STEP
18eb0 28 46 34 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c  (F4, d, a, b, c,
18ec0 20 69 6e 5b 20 33 5d 2b 30 78 38 66 30 63 63 63   in[ 3]+0x8f0ccc
18ed0 39 32 2c 20 31 30 29 3b 0a 20 20 20 20 20 20 20  92, 10);.       
18ee0 20 4d 44 35 53 54 45 50 28 46 34 2c 20 63 2c 20   MD5STEP(F4, c, 
18ef0 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 31 30 5d 2b  d, a, b, in[10]+
18f00 30 78 66 66 65 66 66 34 37 64 2c 20 31 35 29 3b  0xffeff47d, 15);
18f10 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50  .        MD5STEP
18f20 28 46 34 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c  (F4, b, c, d, a,
18f30 20 69 6e 5b 20 31 5d 2b 30 78 38 35 38 34 35 64   in[ 1]+0x85845d
18f40 64 31 2c 20 32 31 29 3b 0a 20 20 20 20 20 20 20  d1, 21);.       
18f50 20 4d 44 35 53 54 45 50 28 46 34 2c 20 61 2c 20   MD5STEP(F4, a, 
18f60 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 20 38 5d 2b  b, c, d, in[ 8]+
18f70 30 78 36 66 61 38 37 65 34 66 2c 20 20 36 29 3b  0x6fa87e4f,  6);
18f80 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50  .        MD5STEP
18f90 28 46 34 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c  (F4, d, a, b, c,
18fa0 20 69 6e 5b 31 35 5d 2b 30 78 66 65 32 63 65 36   in[15]+0xfe2ce6
18fb0 65 30 2c 20 31 30 29 3b 0a 20 20 20 20 20 20 20  e0, 10);.       
18fc0 20 4d 44 35 53 54 45 50 28 46 34 2c 20 63 2c 20   MD5STEP(F4, c, 
18fd0 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 20 36 5d 2b  d, a, b, in[ 6]+
18fe0 30 78 61 33 30 31 34 33 31 34 2c 20 31 35 29 3b  0xa3014314, 15);
18ff0 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50  .        MD5STEP
19000 28 46 34 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c  (F4, b, c, d, a,
19010 20 69 6e 5b 31 33 5d 2b 30 78 34 65 30 38 31 31   in[13]+0x4e0811
19020 61 31 2c 20 32 31 29 3b 0a 20 20 20 20 20 20 20  a1, 21);.       
19030 20 4d 44 35 53 54 45 50 28 46 34 2c 20 61 2c 20   MD5STEP(F4, a, 
19040 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 20 34 5d 2b  b, c, d, in[ 4]+
19050 30 78 66 37 35 33 37 65 38 32 2c 20 20 36 29 3b  0xf7537e82,  6);
19060 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50  .        MD5STEP
19070 28 46 34 2c 20 64 2c 20 61 2c 20 62 2c 20 63 2c  (F4, d, a, b, c,
19080 20 69 6e 5b 31 31 5d 2b 30 78 62 64 33 61 66 32   in[11]+0xbd3af2
19090 33 35 2c 20 31 30 29 3b 0a 20 20 20 20 20 20 20  35, 10);.       
190a0 20 4d 44 35 53 54 45 50 28 46 34 2c 20 63 2c 20   MD5STEP(F4, c, 
190b0 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 20 32 5d 2b  d, a, b, in[ 2]+
190c0 30 78 32 61 64 37 64 32 62 62 2c 20 31 35 29 3b  0x2ad7d2bb, 15);
190d0 0a 20 20 20 20 20 20 20 20 4d 44 35 53 54 45 50  .        MD5STEP
190e0 28 46 34 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c  (F4, b, c, d, a,
190f0 20 69 6e 5b 20 39 5d 2b 30 78 65 62 38 36 64 33   in[ 9]+0xeb86d3
19100 39 31 2c 20 32 31 29 3b 0a 0a 20 20 20 20 20 20  91, 21);..      
19110 20 20 62 75 66 5b 30 5d 20 2b 3d 20 61 3b 0a 20    buf[0] += a;. 
19120 20 20 20 20 20 20 20 62 75 66 5b 31 5d 20 2b 3d         buf[1] +=
19130 20 62 3b 0a 20 20 20 20 20 20 20 20 62 75 66 5b   b;.        buf[
19140 32 5d 20 2b 3d 20 63 3b 0a 20 20 20 20 20 20 20  2] += c;.       
19150 20 62 75 66 5b 33 5d 20 2b 3d 20 64 3b 0a 7d 0a   buf[3] += d;.}.
19160 0a 2f 2a 0a 20 2a 20 53 74 61 72 74 20 4d 44 35  ./*. * Start MD5
19170 20 61 63 63 75 6d 75 6c 61 74 69 6f 6e 2e 20 20   accumulation.  
19180 53 65 74 20 62 69 74 20 63 6f 75 6e 74 20 74 6f  Set bit count to
19190 20 30 20 61 6e 64 20 62 75 66 66 65 72 20 74 6f   0 and buffer to
191a0 20 6d 79 73 74 65 72 69 6f 75 73 0a 20 2a 20 69   mysterious. * i
191b0 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 63 6f  nitialization co
191c0 6e 73 74 61 6e 74 73 2e 0a 20 2a 2f 0a 73 74 61  nstants.. */.sta
191d0 74 69 63 20 76 6f 69 64 20 4d 44 35 49 6e 69 74  tic void MD5Init
191e0 28 4d 44 35 43 6f 6e 74 65 78 74 20 2a 63 74 78  (MD5Context *ctx
191f0 29 7b 0a 20 20 20 20 20 20 20 20 63 74 78 2d 3e  ){.        ctx->
19200 69 73 49 6e 69 74 20 3d 20 31 3b 0a 20 20 20 20  isInit = 1;.    
19210 20 20 20 20 63 74 78 2d 3e 62 75 66 5b 30 5d 20      ctx->buf[0] 
19220 3d 20 30 78 36 37 34 35 32 33 30 31 3b 0a 20 20  = 0x67452301;.  
19230 20 20 20 20 20 20 63 74 78 2d 3e 62 75 66 5b 31        ctx->buf[1
19240 5d 20 3d 20 30 78 65 66 63 64 61 62 38 39 3b 0a  ] = 0xefcdab89;.
19250 20 20 20 20 20 20 20 20 63 74 78 2d 3e 62 75 66          ctx->buf
19260 5b 32 5d 20 3d 20 30 78 39 38 62 61 64 63 66 65  [2] = 0x98badcfe
19270 3b 0a 20 20 20 20 20 20 20 20 63 74 78 2d 3e 62  ;.        ctx->b
19280 75 66 5b 33 5d 20 3d 20 30 78 31 30 33 32 35 34  uf[3] = 0x103254
19290 37 36 3b 0a 20 20 20 20 20 20 20 20 63 74 78 2d  76;.        ctx-
192a0 3e 62 69 74 73 5b 30 5d 20 3d 20 30 3b 0a 20 20  >bits[0] = 0;.  
192b0 20 20 20 20 20 20 63 74 78 2d 3e 62 69 74 73 5b        ctx->bits[
192c0 31 5d 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 20 2a  1] = 0;.}../*. *
192d0 20 55 70 64 61 74 65 20 63 6f 6e 74 65 78 74 20   Update context 
192e0 74 6f 20 72 65 66 6c 65 63 74 20 74 68 65 20 63  to reflect the c
192f0 6f 6e 63 61 74 65 6e 61 74 69 6f 6e 20 6f 66 20  oncatenation of 
19300 61 6e 6f 74 68 65 72 20 62 75 66 66 65 72 20 66  another buffer f
19310 75 6c 6c 0a 20 2a 20 6f 66 20 62 79 74 65 73 2e  ull. * of bytes.
19320 0a 20 2a 2f 0a 73 74 61 74 69 63 20 0a 76 6f 69  . */.static .voi
19330 64 20 4d 44 35 55 70 64 61 74 65 28 4d 44 35 43  d MD5Update(MD5C
19340 6f 6e 74 65 78 74 20 2a 63 74 78 2c 20 63 6f 6e  ontext *ctx, con
19350 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
19360 20 2a 62 75 66 2c 20 75 6e 73 69 67 6e 65 64 20   *buf, unsigned 
19370 69 6e 74 20 6c 65 6e 29 7b 0a 20 20 20 20 20 20  int len){.      
19380 20 20 75 69 6e 74 33 32 20 74 3b 0a 0a 20 20 20    uint32 t;..   
19390 20 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 62       /* Update b
193a0 69 74 63 6f 75 6e 74 20 2a 2f 0a 0a 20 20 20 20  itcount */..    
193b0 20 20 20 20 74 20 3d 20 63 74 78 2d 3e 62 69 74      t = ctx->bit
193c0 73 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20 69 66  s[0];.        if
193d0 20 28 28 63 74 78 2d 3e 62 69 74 73 5b 30 5d 20   ((ctx->bits[0] 
193e0 3d 20 74 20 2b 20 28 28 75 69 6e 74 33 32 29 6c  = t + ((uint32)l
193f0 65 6e 20 3c 3c 20 33 29 29 20 3c 20 74 29 0a 20  en << 3)) < t). 
19400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
19410 74 78 2d 3e 62 69 74 73 5b 31 5d 2b 2b 3b 20 2f  tx->bits[1]++; /
19420 2a 20 43 61 72 72 79 20 66 72 6f 6d 20 6c 6f 77  * Carry from low
19430 20 74 6f 20 68 69 67 68 20 2a 2f 0a 20 20 20 20   to high */.    
19440 20 20 20 20 63 74 78 2d 3e 62 69 74 73 5b 31 5d      ctx->bits[1]
19450 20 2b 3d 20 6c 65 6e 20 3e 3e 20 32 39 3b 0a 0a   += len >> 29;..
19460 20 20 20 20 20 20 20 20 74 20 3d 20 28 74 20 3e          t = (t >
19470 3e 20 33 29 20 26 20 30 78 33 66 3b 20 20 20 20  > 3) & 0x3f;    
19480 2f 2a 20 42 79 74 65 73 20 61 6c 72 65 61 64 79  /* Bytes already
19490 20 69 6e 20 73 68 73 49 6e 66 6f 2d 3e 64 61 74   in shsInfo->dat
194a0 61 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 2f 2a  a */..        /*
194b0 20 48 61 6e 64 6c 65 20 61 6e 79 20 6c 65 61 64   Handle any lead
194c0 69 6e 67 20 6f 64 64 2d 73 69 7a 65 64 20 63 68  ing odd-sized ch
194d0 75 6e 6b 73 20 2a 2f 0a 0a 20 20 20 20 20 20 20  unks */..       
194e0 20 69 66 20 28 20 74 20 29 20 7b 0a 20 20 20 20   if ( t ) {.    
194f0 20 20 20 20 20 20 20 20 20 20 20 20 75 6e 73 69              unsi
19500 67 6e 65 64 20 63 68 61 72 20 2a 70 20 3d 20 28  gned char *p = (
19510 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
19520 63 74 78 2d 3e 69 6e 20 2b 20 74 3b 0a 0a 20 20  ctx->in + t;..  
19530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 20                t 
19540 3d 20 36 34 2d 74 3b 0a 20 20 20 20 20 20 20 20  = 64-t;.        
19550 20 20 20 20 20 20 20 20 69 66 20 28 6c 65 6e 20          if (len 
19560 3c 20 74 29 20 7b 0a 20 20 20 20 20 20 20 20 20  < t) {.         
19570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d                 m
19580 65 6d 63 70 79 28 70 2c 20 62 75 66 2c 20 6c 65  emcpy(p, buf, le
19590 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  n);.            
195a0 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
195b0 72 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  rn;.            
195c0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
195d0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 2c 20        memcpy(p, 
195e0 62 75 66 2c 20 74 29 3b 0a 20 20 20 20 20 20 20  buf, t);.       
195f0 20 20 20 20 20 20 20 20 20 62 79 74 65 52 65 76           byteRev
19600 65 72 73 65 28 63 74 78 2d 3e 69 6e 2c 20 31 36  erse(ctx->in, 16
19610 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
19620 20 20 20 4d 44 35 54 72 61 6e 73 66 6f 72 6d 28     MD5Transform(
19630 63 74 78 2d 3e 62 75 66 2c 20 28 75 69 6e 74 33  ctx->buf, (uint3
19640 32 20 2a 29 63 74 78 2d 3e 69 6e 29 3b 0a 20 20  2 *)ctx->in);.  
19650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 75                bu
19660 66 20 2b 3d 20 74 3b 0a 20 20 20 20 20 20 20 20  f += t;.        
19670 20 20 20 20 20 20 20 20 6c 65 6e 20 2d 3d 20 74          len -= t
19680 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
19690 20 20 20 20 20 2f 2a 20 50 72 6f 63 65 73 73 20       /* Process 
196a0 64 61 74 61 20 69 6e 20 36 34 2d 62 79 74 65 20  data in 64-byte 
196b0 63 68 75 6e 6b 73 20 2a 2f 0a 0a 20 20 20 20 20  chunks */..     
196c0 20 20 20 77 68 69 6c 65 20 28 6c 65 6e 20 3e 3d     while (len >=
196d0 20 36 34 29 20 7b 0a 20 20 20 20 20 20 20 20 20   64) {.         
196e0 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 63 74         memcpy(ct
196f0 78 2d 3e 69 6e 2c 20 62 75 66 2c 20 36 34 29 3b  x->in, buf, 64);
19700 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
19710 20 62 79 74 65 52 65 76 65 72 73 65 28 63 74 78   byteReverse(ctx
19720 2d 3e 69 6e 2c 20 31 36 29 3b 0a 20 20 20 20 20  ->in, 16);.     
19730 20 20 20 20 20 20 20 20 20 20 20 4d 44 35 54 72             MD5Tr
19740 61 6e 73 66 6f 72 6d 28 63 74 78 2d 3e 62 75 66  ansform(ctx->buf
19750 2c 20 28 75 69 6e 74 33 32 20 2a 29 63 74 78 2d  , (uint32 *)ctx-
19760 3e 69 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20  >in);.          
19770 20 20 20 20 20 20 62 75 66 20 2b 3d 20 36 34 3b        buf += 64;
19780 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
19790 20 6c 65 6e 20 2d 3d 20 36 34 3b 0a 20 20 20 20   len -= 64;.    
197a0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f      }..        /
197b0 2a 20 48 61 6e 64 6c 65 20 61 6e 79 20 72 65 6d  * Handle any rem
197c0 61 69 6e 69 6e 67 20 62 79 74 65 73 20 6f 66 20  aining bytes of 
197d0 64 61 74 61 2e 20 2a 2f 0a 0a 20 20 20 20 20 20  data. */..      
197e0 20 20 6d 65 6d 63 70 79 28 63 74 78 2d 3e 69 6e    memcpy(ctx->in
197f0 2c 20 62 75 66 2c 20 6c 65 6e 29 3b 0a 7d 0a 0a  , buf, len);.}..
19800 2f 2a 0a 20 2a 20 46 69 6e 61 6c 20 77 72 61 70  /*. * Final wrap
19810 75 70 20 2d 20 70 61 64 20 74 6f 20 36 34 2d 62  up - pad to 64-b
19820 79 74 65 20 62 6f 75 6e 64 61 72 79 20 77 69 74  yte boundary wit
19830 68 20 74 68 65 20 62 69 74 20 70 61 74 74 65 72  h the bit patter
19840 6e 20 0a 20 2a 20 31 20 30 2a 20 28 36 34 2d 62  n . * 1 0* (64-b
19850 69 74 20 63 6f 75 6e 74 20 6f 66 20 62 69 74 73  it count of bits
19860 20 70 72 6f 63 65 73 73 65 64 2c 20 4d 53 42 2d   processed, MSB-
19870 66 69 72 73 74 29 0a 20 2a 2f 0a 73 74 61 74 69  first). */.stati
19880 63 20 76 6f 69 64 20 4d 44 35 46 69 6e 61 6c 28  c void MD5Final(
19890 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 64 69  unsigned char di
198a0 67 65 73 74 5b 31 36 5d 2c 20 4d 44 35 43 6f 6e  gest[16], MD5Con
198b0 74 65 78 74 20 2a 63 74 78 29 7b 0a 20 20 20 20  text *ctx){.    
198c0 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 6f 75      unsigned cou
198d0 6e 74 3b 0a 20 20 20 20 20 20 20 20 75 6e 73 69  nt;.        unsi
198e0 67 6e 65 64 20 63 68 61 72 20 2a 70 3b 0a 0a 20  gned char *p;.. 
198f0 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74         /* Comput
19900 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
19910 73 20 6d 6f 64 20 36 34 20 2a 2f 0a 20 20 20 20  s mod 64 */.    
19920 20 20 20 20 63 6f 75 6e 74 20 3d 20 28 63 74 78      count = (ctx
19930 2d 3e 62 69 74 73 5b 30 5d 20 3e 3e 20 33 29 20  ->bits[0] >> 3) 
19940 26 20 30 78 33 46 3b 0a 0a 20 20 20 20 20 20 20  & 0x3F;..       
19950 20 2f 2a 20 53 65 74 20 74 68 65 20 66 69 72 73   /* Set the firs
19960 74 20 63 68 61 72 20 6f 66 20 70 61 64 64 69 6e  t char of paddin
19970 67 20 74 6f 20 30 78 38 30 2e 20 20 54 68 69 73  g to 0x80.  This
19980 20 69 73 20 73 61 66 65 20 73 69 6e 63 65 20 74   is safe since t
19990 68 65 72 65 20 69 73 0a 20 20 20 20 20 20 20 20  here is.        
199a0 20 20 20 61 6c 77 61 79 73 20 61 74 20 6c 65 61     always at lea
199b0 73 74 20 6f 6e 65 20 62 79 74 65 20 66 72 65 65  st one byte free
199c0 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 20 3d 20   */.        p = 
199d0 63 74 78 2d 3e 69 6e 20 2b 20 63 6f 75 6e 74 3b  ctx->in + count;
199e0 0a 20 20 20 20 20 20 20 20 2a 70 2b 2b 20 3d 20  .        *p++ = 
199f0 30 78 38 30 3b 0a 0a 20 20 20 20 20 20 20 20 2f  0x80;..        /
19a00 2a 20 42 79 74 65 73 20 6f 66 20 70 61 64 64 69  * Bytes of paddi
19a10 6e 67 20 6e 65 65 64 65 64 20 74 6f 20 6d 61 6b  ng needed to mak
19a20 65 20 36 34 20 62 79 74 65 73 20 2a 2f 0a 20 20  e 64 bytes */.  
19a30 20 20 20 20 20 20 63 6f 75 6e 74 20 3d 20 36 34        count = 64
19a40 20 2d 20 31 20 2d 20 63 6f 75 6e 74 3b 0a 0a 20   - 1 - count;.. 
19a50 20 20 20 20 20 20 20 2f 2a 20 50 61 64 20 6f 75         /* Pad ou
19a60 74 20 74 6f 20 35 36 20 6d 6f 64 20 36 34 20 2a  t to 56 mod 64 *
19a70 2f 0a 20 20 20 20 20 20 20 20 69 66 20 28 63 6f  /.        if (co
19a80 75 6e 74 20 3c 20 38 29 20 7b 0a 20 20 20 20 20  unt < 8) {.     
19a90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 77             /* Tw
19aa0 6f 20 6c 6f 74 73 20 6f 66 20 70 61 64 64 69 6e  o lots of paddin
19ab0 67 3a 20 20 50 61 64 20 74 68 65 20 66 69 72 73  g:  Pad the firs
19ac0 74 20 62 6c 6f 63 6b 20 74 6f 20 36 34 20 62 79  t block to 64 by
19ad0 74 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  tes */.         
19ae0 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 2c         memset(p,
19af0 20 30 2c 20 63 6f 75 6e 74 29 3b 0a 20 20 20 20   0, count);.    
19b00 20 20 20 20 20 20 20 20 20 20 20 20 62 79 74 65              byte
19b10 52 65 76 65 72 73 65 28 63 74 78 2d 3e 69 6e 2c  Reverse(ctx->in,
19b20 20 31 36 29 3b 0a 20 20 20 20 20 20 20 20 20 20   16);.          
19b30 20 20 20 20 20 20 4d 44 35 54 72 61 6e 73 66 6f        MD5Transfo
19b40 72 6d 28 63 74 78 2d 3e 62 75 66 2c 20 28 75 69  rm(ctx->buf, (ui
19b50 6e 74 33 32 20 2a 29 63 74 78 2d 3e 69 6e 29 3b  nt32 *)ctx->in);
19b60 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
19b70 20 20 2f 2a 20 4e 6f 77 20 66 69 6c 6c 20 74 68    /* Now fill th
19b80 65 20 6e 65 78 74 20 62 6c 6f 63 6b 20 77 69 74  e next block wit
19b90 68 20 35 36 20 62 79 74 65 73 20 2a 2f 0a 20 20  h 56 bytes */.  
19ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 65                me
19bb0 6d 73 65 74 28 63 74 78 2d 3e 69 6e 2c 20 30 2c  mset(ctx->in, 0,
19bc0 20 35 36 29 3b 0a 20 20 20 20 20 20 20 20 7d 20   56);.        } 
19bd0 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20  else {.         
19be0 20 20 20 20 20 20 20 2f 2a 20 50 61 64 20 62 6c         /* Pad bl
19bf0 6f 63 6b 20 74 6f 20 35 36 20 62 79 74 65 73 20  ock to 56 bytes 
19c00 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
19c10 20 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20     memset(p, 0, 
19c20 63 6f 75 6e 74 2d 38 29 3b 0a 20 20 20 20 20 20  count-8);.      
19c30 20 20 7d 0a 20 20 20 20 20 20 20 20 62 79 74 65    }.        byte
19c40 52 65 76 65 72 73 65 28 63 74 78 2d 3e 69 6e 2c  Reverse(ctx->in,
19c50 20 31 34 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f   14);..        /
19c60 2a 20 41 70 70 65 6e 64 20 6c 65 6e 67 74 68 20  * Append length 
19c70 69 6e 20 62 69 74 73 20 61 6e 64 20 74 72 61 6e  in bits and tran
19c80 73 66 6f 72 6d 20 2a 2f 0a 20 20 20 20 20 20 20  sform */.       
19c90 20 28 28 75 69 6e 74 33 32 20 2a 29 63 74 78 2d   ((uint32 *)ctx-
19ca0 3e 69 6e 29 5b 20 31 34 20 5d 20 3d 20 63 74 78  >in)[ 14 ] = ctx
19cb0 2d 3e 62 69 74 73 5b 30 5d 3b 0a 20 20 20 20 20  ->bits[0];.     
19cc0 20 20 20 28 28 75 69 6e 74 33 32 20 2a 29 63 74     ((uint32 *)ct
19cd0 78 2d 3e 69 6e 29 5b 20 31 35 20 5d 20 3d 20 63  x->in)[ 15 ] = c
19ce0 74 78 2d 3e 62 69 74 73 5b 31 5d 3b 0a 0a 20 20  tx->bits[1];..  
19cf0 20 20 20 20 20 20 4d 44 35 54 72 61 6e 73 66 6f        MD5Transfo
19d00 72 6d 28 63 74 78 2d 3e 62 75 66 2c 20 28 75 69  rm(ctx->buf, (ui
19d10 6e 74 33 32 20 2a 29 63 74 78 2d 3e 69 6e 29 3b  nt32 *)ctx->in);
19d20 0a 20 20 20 20 20 20 20 20 62 79 74 65 52 65 76  .        byteRev
19d30 65 72 73 65 28 28 75 6e 73 69 67 6e 65 64 20 63  erse((unsigned c
19d40 68 61 72 20 2a 29 63 74 78 2d 3e 62 75 66 2c 20  har *)ctx->buf, 
19d50 34 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63  4);.        memc
19d60 70 79 28 64 69 67 65 73 74 2c 20 63 74 78 2d 3e  py(digest, ctx->
19d70 62 75 66 2c 20 31 36 29 3b 0a 20 20 20 20 20 20  buf, 16);.      
19d80 20 20 6d 65 6d 73 65 74 28 63 74 78 2c 20 30 2c    memset(ctx, 0,
19d90 20 73 69 7a 65 6f 66 28 63 74 78 29 29 3b 20 20   sizeof(ctx));  
19da0 20 20 2f 2a 20 49 6e 20 63 61 73 65 20 69 74 20    /* In case it 
19db0 69 73 20 73 65 6e 73 69 74 69 76 65 20 2a 2f 0a  is sensitive */.
19dc0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  }../*.** Convert
19dd0 20 61 20 31 32 38 2d 62 69 74 20 4d 44 35 20 64   a 128-bit MD5 d
19de0 69 67 65 73 74 20 69 6e 74 6f 20 61 20 33 32 2d  igest into a 32-
19df0 64 69 67 69 74 20 62 61 73 65 2d 31 36 20 6e 75  digit base-16 nu
19e00 6d 62 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  mber..*/.static 
19e10 76 6f 69 64 20 4d 44 35 44 69 67 65 73 74 54 6f  void MD5DigestTo
19e20 42 61 73 65 31 36 28 75 6e 73 69 67 6e 65 64 20  Base16(unsigned 
19e30 63 68 61 72 20 2a 64 69 67 65 73 74 2c 20 63 68  char *digest, ch
19e40 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 73 74 61  ar *zBuf){.  sta
19e50 74 69 63 20 63 68 61 72 20 63 6f 6e 73 74 20 7a  tic char const z
19e60 45 6e 63 6f 64 65 5b 5d 20 3d 20 22 30 31 32 33  Encode[] = "0123
19e70 34 35 36 37 38 39 61 62 63 64 65 66 22 3b 0a 20  456789abcdef";. 
19e80 20 69 6e 74 20 69 2c 20 6a 3b 0a 0a 20 20 66 6f   int i, j;..  fo
19e90 72 28 6a 3d 69 3d 30 3b 20 69 3c 31 36 3b 20 69  r(j=i=0; i<16; i
19ea0 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 61 20 3d  ++){.    int a =
19eb0 20 64 69 67 65 73 74 5b 69 5d 3b 0a 20 20 20 20   digest[i];.    
19ec0 7a 42 75 66 5b 6a 2b 2b 5d 20 3d 20 7a 45 6e 63  zBuf[j++] = zEnc
19ed0 6f 64 65 5b 28 61 3e 3e 34 29 26 30 78 66 5d 3b  ode[(a>>4)&0xf];
19ee0 0a 20 20 20 20 7a 42 75 66 5b 6a 2b 2b 5d 20 3d  .    zBuf[j++] =
19ef0 20 7a 45 6e 63 6f 64 65 5b 61 20 26 20 30 78 66   zEncode[a & 0xf
19f00 5d 3b 0a 20 20 7d 0a 20 20 7a 42 75 66 5b 6a 5d  ];.  }.  zBuf[j]
19f10 20 3d 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20   = 0;.}.../*.** 
19f20 43 6f 6e 76 65 72 74 20 61 20 31 32 38 2d 62 69  Convert a 128-bi
19f30 74 20 4d 44 35 20 64 69 67 65 73 74 20 69 6e 74  t MD5 digest int
19f40 6f 20 73 65 71 75 65 6e 63 79 20 6f 66 20 65 69  o sequency of ei
19f50 67 68 74 20 35 2d 64 69 67 69 74 20 69 6e 74 65  ght 5-digit inte
19f60 67 65 72 73 0a 2a 2a 20 65 61 63 68 20 72 65 70  gers.** each rep
19f70 72 65 73 65 6e 74 69 6e 67 20 31 36 20 62 69 74  resenting 16 bit
19f80 73 20 6f 66 20 74 68 65 20 64 69 67 65 73 74 20  s of the digest 
19f90 61 6e 64 20 73 65 70 61 72 61 74 65 64 20 66 72  and separated fr
19fa0 6f 6d 20 65 61 63 68 0a 2a 2a 20 6f 74 68 65 72  om each.** other
19fb0 20 62 79 20 61 20 22 2d 22 20 63 68 61 72 61 63   by a "-" charac
19fc0 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ter..*/.static v
19fd0 6f 69 64 20 4d 44 35 44 69 67 65 73 74 54 6f 42  oid MD5DigestToB
19fe0 61 73 65 31 30 78 38 28 75 6e 73 69 67 6e 65 64  ase10x8(unsigned
19ff0 20 63 68 61 72 20 64 69 67 65 73 74 5b 31 36 5d   char digest[16]
1a000 2c 20 63 68 61 72 20 7a 44 69 67 65 73 74 5b 35  , char zDigest[5
1a010 30 5d 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  0]){.  int i, j;
1a020 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  .  unsigned int 
1a030 78 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20  x;.  for(i=j=0; 
1a040 69 3c 31 36 3b 20 69 2b 3d 32 29 7b 0a 20 20 20  i<16; i+=2){.   
1a050 20 78 20 3d 20 64 69 67 65 73 74 5b 69 5d 2a 32   x = digest[i]*2
1a060 35 36 20 2b 20 64 69 67 65 73 74 5b 69 2b 31 5d  56 + digest[i+1]
1a070 3b 0a 20 20 20 20 69 66 28 20 69 3e 30 20 29 20  ;.    if( i>0 ) 
1a080 7a 44 69 67 65 73 74 5b 6a 2b 2b 5d 20 3d 20 27  zDigest[j++] = '
1a090 2d 27 3b 0a 20 20 20 20 73 70 72 69 6e 74 66 28  -';.    sprintf(
1a0a0 26 7a 44 69 67 65 73 74 5b 6a 5d 2c 20 22 25 30  &zDigest[j], "%0
1a0b0 35 75 22 2c 20 78 29 3b 0a 20 20 20 20 6a 20 2b  5u", x);.    j +
1a0c0 3d 20 35 3b 0a 20 20 7d 0a 20 20 7a 44 69 67 65  = 5;.  }.  zDige
1a0d0 73 74 5b 6a 5d 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  st[j] = 0;.}../*
1a0e0 0a 2a 2a 20 41 20 54 43 4c 20 63 6f 6d 6d 61 6e  .** A TCL comman
1a0f0 64 20 66 6f 72 20 6d 64 35 2e 20 20 54 68 65 20  d for md5.  The 
1a100 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20  argument is the 
1a110 74 65 78 74 20 74 6f 20 62 65 20 68 61 73 68 65  text to be hashe
1a120 64 2e 20 20 54 68 65 0a 2a 2a 20 52 65 73 75 6c  d.  The.** Resul
1a130 74 20 69 73 20 74 68 65 20 68 61 73 68 20 69 6e  t is the hash in
1a140 20 62 61 73 65 36 34 2e 20 20 0a 2a 2f 0a 73 74   base64.  .*/.st
1a150 61 74 69 63 20 69 6e 74 20 6d 64 35 5f 63 6d 64  atic int md5_cmd
1a160 28 76 6f 69 64 2a 63 64 2c 20 54 63 6c 5f 49 6e  (void*cd, Tcl_In
1a170 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e  terp *interp, in
1a180 74 20 61 72 67 63 2c 20 63 6f 6e 73 74 20 63 68  t argc, const ch
1a190 61 72 20 2a 2a 61 72 67 76 29 7b 0a 20 20 4d 44  ar **argv){.  MD
1a1a0 35 43 6f 6e 74 65 78 74 20 63 74 78 3b 0a 20 20  5Context ctx;.  
1a1b0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 64 69  unsigned char di
1a1c0 67 65 73 74 5b 31 36 5d 3b 0a 20 20 63 68 61 72  gest[16];.  char
1a1d0 20 7a 42 75 66 5b 35 30 5d 3b 0a 20 20 76 6f 69   zBuf[50];.  voi
1a1e0 64 20 28 2a 63 6f 6e 76 65 72 74 65 72 29 28 75  d (*converter)(u
1a1f0 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 2c 20 63  nsigned char*, c
1a200 68 61 72 2a 29 3b 0a 0a 20 20 69 66 28 20 61 72  har*);..  if( ar
1a210 67 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  gc!=2 ){.    Tcl
1a220 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
1a230 74 65 72 70 2c 22 77 72 6f 6e 67 20 23 20 61 72  terp,"wrong # ar
1a240 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
1a250 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20  ", argv[0], .   
1a260 20 20 20 20 20 22 20 54 45 58 54 5c 22 22 2c 20       " TEXT\"", 
1a270 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
1a280 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
1a290 4d 44 35 49 6e 69 74 28 26 63 74 78 29 3b 0a 20  MD5Init(&ctx);. 
1a2a0 20 4d 44 35 55 70 64 61 74 65 28 26 63 74 78 2c   MD5Update(&ctx,
1a2b0 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a   (unsigned char*
1a2c0 29 61 72 67 76 5b 31 5d 2c 20 28 75 6e 73 69 67  )argv[1], (unsig
1a2d0 6e 65 64 29 73 74 72 6c 65 6e 28 61 72 67 76 5b  ned)strlen(argv[
1a2e0 31 5d 29 29 3b 0a 20 20 4d 44 35 46 69 6e 61 6c  1]));.  MD5Final
1a2f0 28 64 69 67 65 73 74 2c 20 26 63 74 78 29 3b 0a  (digest, &ctx);.
1a300 20 20 63 6f 6e 76 65 72 74 65 72 20 3d 20 28 76    converter = (v
1a310 6f 69 64 28 2a 29 28 75 6e 73 69 67 6e 65 64 20  oid(*)(unsigned 
1a320 63 68 61 72 2a 2c 63 68 61 72 2a 29 29 63 64 3b  char*,char*))cd;
1a330 0a 20 20 63 6f 6e 76 65 72 74 65 72 28 64 69 67  .  converter(dig
1a340 65 73 74 2c 20 7a 42 75 66 29 3b 0a 20 20 54 63  est, zBuf);.  Tc
1a350 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
1a360 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 28 63 68  nterp, zBuf, (ch
1a370 61 72 2a 29 30 29 3b 0a 20 20 72 65 74 75 72 6e  ar*)0);.  return
1a380 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
1a390 2a 20 41 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20  * A TCL command 
1a3a0 74 6f 20 74 61 6b 65 20 74 68 65 20 6d 64 35 20  to take the md5 
1a3b0 68 61 73 68 20 6f 66 20 61 20 66 69 6c 65 2e 20  hash of a file. 
1a3c0 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73   The argument is
1a3d0 20 74 68 65 0a 2a 2a 20 6e 61 6d 65 20 6f 66 20   the.** name of 
1a3e0 74 68 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61  the file..*/.sta
1a3f0 74 69 63 20 69 6e 74 20 6d 64 35 66 69 6c 65 5f  tic int md5file_
1a400 63 6d 64 28 76 6f 69 64 2a 63 64 2c 20 54 63 6c  cmd(void*cd, Tcl
1a410 5f 49 6e 74 65 72 70 2a 69 6e 74 65 72 70 2c 20  _Interp*interp, 
1a420 69 6e 74 20 61 72 67 63 2c 20 63 6f 6e 73 74 20  int argc, const 
1a430 63 68 61 72 20 2a 2a 61 72 67 76 29 7b 0a 20 20  char **argv){.  
1a440 46 49 4c 45 20 2a 69 6e 3b 0a 20 20 4d 44 35 43  FILE *in;.  MD5C
1a450 6f 6e 74 65 78 74 20 63 74 78 3b 0a 20 20 76 6f  ontext ctx;.  vo
1a460 69 64 20 28 2a 63 6f 6e 76 65 72 74 65 72 29 28  id (*converter)(
1a470 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 2c 20  unsigned char*, 
1a480 63 68 61 72 2a 29 3b 0a 20 20 75 6e 73 69 67 6e  char*);.  unsign
1a490 65 64 20 63 68 61 72 20 64 69 67 65 73 74 5b 31  ed char digest[1
1a4a0 36 5d 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b  6];.  char zBuf[
1a4b0 31 30 32 34 30 5d 3b 0a 0a 20 20 69 66 28 20 61  10240];..  if( a
1a4c0 72 67 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  rgc!=2 ){.    Tc
1a4d0 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
1a4e0 6e 74 65 72 70 2c 22 77 72 6f 6e 67 20 23 20 61  nterp,"wrong # a
1a4f0 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
1a500 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20  "", argv[0], .  
1a510 20 20 20 20 20 20 22 20 46 49 4c 45 4e 41 4d 45        " FILENAME
1a520 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  \"", 0);.    ret
1a530 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1a540 20 7d 0a 20 20 69 6e 20 3d 20 66 6f 70 65 6e 28   }.  in = fopen(
1a550 61 72 67 76 5b 31 5d 2c 22 72 62 22 29 3b 0a 20  argv[1],"rb");. 
1a560 20 69 66 28 20 69 6e 3d 3d 30 20 29 7b 0a 20 20   if( in==0 ){.  
1a570 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
1a580 6c 74 28 69 6e 74 65 72 70 2c 22 75 6e 61 62 6c  lt(interp,"unabl
1a590 65 20 74 6f 20 6f 70 65 6e 20 66 69 6c 65 20 5c  e to open file \
1a5a0 22 22 2c 20 61 72 67 76 5b 31 5d 2c 20 0a 20 20  "", argv[1], .  
1a5b0 20 20 20 20 20 20 20 22 5c 22 20 66 6f 72 20 72         "\" for r
1a5c0 65 61 64 69 6e 67 22 2c 20 30 29 3b 0a 20 20 20  eading", 0);.   
1a5d0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1a5e0 52 3b 0a 20 20 7d 0a 20 20 4d 44 35 49 6e 69 74  R;.  }.  MD5Init
1a5f0 28 26 63 74 78 29 3b 0a 20 20 66 6f 72 28 3b 3b  (&ctx);.  for(;;
1a600 29 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20  ){.    int n;.  
1a610 20 20 6e 20 3d 20 28 69 6e 74 29 66 72 65 61 64    n = (int)fread
1a620 28 7a 42 75 66 2c 20 31 2c 20 73 69 7a 65 6f 66  (zBuf, 1, sizeof
1a630 28 7a 42 75 66 29 2c 20 69 6e 29 3b 0a 20 20 20  (zBuf), in);.   
1a640 20 69 66 28 20 6e 3c 3d 30 20 29 20 62 72 65 61   if( n<=0 ) brea
1a650 6b 3b 0a 20 20 20 20 4d 44 35 55 70 64 61 74 65  k;.    MD5Update
1a660 28 26 63 74 78 2c 20 28 75 6e 73 69 67 6e 65 64  (&ctx, (unsigned
1a670 20 63 68 61 72 2a 29 7a 42 75 66 2c 20 28 75 6e   char*)zBuf, (un
1a680 73 69 67 6e 65 64 29 6e 29 3b 0a 20 20 7d 0a 20  signed)n);.  }. 
1a690 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 4d   fclose(in);.  M
1a6a0 44 35 46 69 6e 61 6c 28 64 69 67 65 73 74 2c 20  D5Final(digest, 
1a6b0 26 63 74 78 29 3b 0a 20 20 63 6f 6e 76 65 72 74  &ctx);.  convert
1a6c0 65 72 20 3d 20 28 76 6f 69 64 28 2a 29 28 75 6e  er = (void(*)(un
1a6d0 73 69 67 6e 65 64 20 63 68 61 72 2a 2c 63 68 61  signed char*,cha
1a6e0 72 2a 29 29 63 64 3b 0a 20 20 63 6f 6e 76 65 72  r*))cd;.  conver
1a6f0 74 65 72 28 64 69 67 65 73 74 2c 20 7a 42 75 66  ter(digest, zBuf
1a700 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  );.  Tcl_AppendR
1a710 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42  esult(interp, zB
1a720 75 66 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20  uf, (char*)0);. 
1a730 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
1a740 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65  }../*.** Registe
1a750 72 20 74 68 65 20 66 6f 75 72 20 6e 65 77 20 54  r the four new T
1a760 43 4c 20 63 6f 6d 6d 61 6e 64 73 20 66 6f 72 20  CL commands for 
1a770 67 65 6e 65 72 61 74 69 6e 67 20 4d 44 35 20 63  generating MD5 c
1a780 68 65 63 6b 73 75 6d 73 0a 2a 2a 20 77 69 74 68  hecksums.** with
1a790 20 74 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   the TCL interpr
1a7a0 65 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 4d 64 35  eter..*/.int Md5
1a7b0 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
1a7c0 20 2a 69 6e 74 65 72 70 29 7b 0a 20 20 54 63 6c   *interp){.  Tcl
1a7d0 5f 43 72 65 61 74 65 43 6f 6d 6d 61 6e 64 28 69  _CreateCommand(i
1a7e0 6e 74 65 72 70 2c 20 22 6d 64 35 22 2c 20 28 54  nterp, "md5", (T
1a7f0 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 6d 64 35 5f  cl_CmdProc*)md5_
1a800 63 6d 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20  cmd,.           
1a810 20 20 20 20 20 20 20 20 20 4d 44 35 44 69 67 65           MD5Dige
1a820 73 74 54 6f 42 61 73 65 31 36 2c 20 30 29 3b 0a  stToBase16, 0);.
1a830 20 20 54 63 6c 5f 43 72 65 61 74 65 43 6f 6d 6d    Tcl_CreateComm
1a840 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 6d 64 35  and(interp, "md5
1a850 2d 31 30 78 38 22 2c 20 28 54 63 6c 5f 43 6d 64  -10x8", (Tcl_Cmd
1a860 50 72 6f 63 2a 29 6d 64 35 5f 63 6d 64 2c 0a 20  Proc*)md5_cmd,. 
1a870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a880 20 20 20 4d 44 35 44 69 67 65 73 74 54 6f 42 61     MD5DigestToBa
1a890 73 65 31 30 78 38 2c 20 30 29 3b 0a 20 20 54 63  se10x8, 0);.  Tc
1a8a0 6c 5f 43 72 65 61 74 65 43 6f 6d 6d 61 6e 64 28  l_CreateCommand(
1a8b0 69 6e 74 65 72 70 2c 20 22 6d 64 35 66 69 6c 65  interp, "md5file
1a8c0 22 2c 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a  ", (Tcl_CmdProc*
1a8d0 29 6d 64 35 66 69 6c 65 5f 63 6d 64 2c 0a 20 20  )md5file_cmd,.  
1a8e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a8f0 20 20 4d 44 35 44 69 67 65 73 74 54 6f 42 61 73    MD5DigestToBas
1a900 65 31 36 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 43  e16, 0);.  Tcl_C
1a910 72 65 61 74 65 43 6f 6d 6d 61 6e 64 28 69 6e 74  reateCommand(int
1a920 65 72 70 2c 20 22 6d 64 35 66 69 6c 65 2d 31 30  erp, "md5file-10
1a930 78 38 22 2c 20 28 54 63 6c 5f 43 6d 64 50 72 6f  x8", (Tcl_CmdPro
1a940 63 2a 29 6d 64 35 66 69 6c 65 5f 63 6d 64 2c 0a  c*)md5file_cmd,.
1a950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a960 20 20 20 20 4d 44 35 44 69 67 65 73 74 54 6f 42      MD5DigestToB
1a970 61 73 65 31 30 78 38 2c 20 30 29 3b 0a 20 20 72  ase10x8, 0);.  r
1a980 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
1a990 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65  #endif /* define
1a9a0 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 20 7c  d(SQLITE_TEST) |
1a9b0 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  | defined(SQLITE
1a9c0 5f 54 43 4c 4d 44 35 29 20 2a 2f 0a 0a 23 69 66  _TCLMD5) */..#if
1a9d0 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
1a9e0 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 44 75 72 69  TEST)./*.** Duri
1a9f0 6e 67 20 74 65 73 74 69 6e 67 2c 20 74 68 65 20  ng testing, the 
1aa00 73 70 65 63 69 61 6c 20 6d 64 35 73 75 6d 28 29  special md5sum()
1aa10 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
1aa20 69 6f 6e 20 69 73 20 61 76 61 69 6c 61 62 6c 65  ion is available
1aa30 2e 0a 2a 2a 20 69 6e 73 69 64 65 20 53 51 4c 69  ..** inside SQLi
1aa40 74 65 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  te.  The followi
1aa50 6e 67 20 72 6f 75 74 69 6e 65 73 20 69 6d 70 6c  ng routines impl
1aa60 65 6d 65 6e 74 20 74 68 61 74 20 66 75 6e 63 74  ement that funct
1aa70 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ion..*/.static v
1aa80 6f 69 64 20 6d 64 35 73 74 65 70 28 73 71 6c 69  oid md5step(sqli
1aa90 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e  te3_context *con
1aaa0 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20  text, int argc, 
1aab0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
1aac0 61 72 67 76 29 7b 0a 20 20 4d 44 35 43 6f 6e 74  argv){.  MD5Cont
1aad0 65 78 74 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b  ext *p;.  int i;
1aae0 0a 20 20 69 66 28 20 61 72 67 63 3c 31 20 29 20  .  if( argc<1 ) 
1aaf0 72 65 74 75 72 6e 3b 0a 20 20 70 20 3d 20 73 71  return;.  p = sq
1ab00 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f  lite3_aggregate_
1ab10 63 6f 6e 74 65 78 74 28 63 6f 6e 74 65 78 74 2c  context(context,
1ab20 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20   sizeof(*p));.  
1ab30 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
1ab40 6e 3b 0a 20 20 69 66 28 20 21 70 2d 3e 69 73 49  n;.  if( !p->isI
1ab50 6e 69 74 20 29 7b 0a 20 20 20 20 4d 44 35 49 6e  nit ){.    MD5In
1ab60 69 74 28 70 29 3b 0a 20 20 7d 0a 20 20 66 6f 72  it(p);.  }.  for
1ab70 28 69 3d 30 3b 20 69 3c 61 72 67 63 3b 20 69 2b  (i=0; i<argc; i+
1ab80 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  +){.    const ch
1ab90 61 72 20 2a 7a 44 61 74 61 20 3d 20 28 63 68 61  ar *zData = (cha
1aba0 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  r*)sqlite3_value
1abb0 5f 74 65 78 74 28 61 72 67 76 5b 69 5d 29 3b 0a  _text(argv[i]);.
1abc0 20 20 20 20 69 66 28 20 7a 44 61 74 61 20 29 7b      if( zData ){
1abd0 0a 20 20 20 20 20 20 4d 44 35 55 70 64 61 74 65  .      MD5Update
1abe0 28 70 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68  (p, (unsigned ch
1abf0 61 72 2a 29 7a 44 61 74 61 2c 20 28 69 6e 74 29  ar*)zData, (int)
1ac00 73 74 72 6c 65 6e 28 7a 44 61 74 61 29 29 3b 0a  strlen(zData));.
1ac10 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74      }.  }.}.stat
1ac20 69 63 20 76 6f 69 64 20 6d 64 35 66 69 6e 61 6c  ic void md5final
1ac30 69 7a 65 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  ize(sqlite3_cont
1ac40 65 78 74 20 2a 63 6f 6e 74 65 78 74 29 7b 0a 20  ext *context){. 
1ac50 20 4d 44 35 43 6f 6e 74 65 78 74 20 2a 70 3b 0a   MD5Context *p;.
1ac60 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
1ac70 64 69 67 65 73 74 5b 31 36 5d 3b 0a 20 20 63 68  digest[16];.  ch
1ac80 61 72 20 7a 42 75 66 5b 33 33 5d 3b 0a 20 20 70  ar zBuf[33];.  p
1ac90 20 3d 20 73 71 6c 69 74 65 33 5f 61 67 67 72 65   = sqlite3_aggre
1aca0 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e  gate_context(con
1acb0 74 65 78 74 2c 20 73 69 7a 65 6f 66 28 2a 70 29  text, sizeof(*p)
1acc0 29 3b 0a 20 20 4d 44 35 46 69 6e 61 6c 28 64 69  );.  MD5Final(di
1acd0 67 65 73 74 2c 70 29 3b 0a 20 20 4d 44 35 44 69  gest,p);.  MD5Di
1ace0 67 65 73 74 54 6f 42 61 73 65 31 36 28 64 69 67  gestToBase16(dig
1acf0 65 73 74 2c 20 7a 42 75 66 29 3b 0a 20 20 73 71  est, zBuf);.  sq
1ad00 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78  lite3_result_tex
1ad10 74 28 63 6f 6e 74 65 78 74 2c 20 7a 42 75 66 2c  t(context, zBuf,
1ad20 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e   -1, SQLITE_TRAN
1ad30 53 49 45 4e 54 29 3b 0a 7d 0a 69 6e 74 20 4d 64  SIENT);.}.int Md
1ad40 35 5f 52 65 67 69 73 74 65 72 28 73 71 6c 69 74  5_Register(sqlit
1ad50 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20 72  e3 *db){.  int r
1ad60 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61  c = sqlite3_crea
1ad70 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20  te_function(db, 
1ad80 22 6d 64 35 73 75 6d 22 2c 20 2d 31 2c 20 53 51  "md5sum", -1, SQ
1ad90 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 30 2c  LITE_UTF8, 0, 0,
1ada0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
1adb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1adc0 20 20 20 6d 64 35 73 74 65 70 2c 20 6d 64 35 66     md5step, md5f
1add0 69 6e 61 6c 69 7a 65 29 3b 0a 20 20 73 71 6c 69  inalize);.  sqli
1ade0 74 65 33 5f 6f 76 65 72 6c 6f 61 64 5f 66 75 6e  te3_overload_fun
1adf0 63 74 69 6f 6e 28 64 62 2c 20 22 6d 64 35 73 75  ction(db, "md5su
1ae00 6d 22 2c 20 2d 31 29 3b 20 20 2f 2a 20 54 6f 20  m", -1);  /* To 
1ae10 65 78 65 72 63 69 73 65 20 74 68 69 73 20 41 50  exercise this AP
1ae20 49 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72 63  I */.  return rc
1ae30 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65  ;.}.#endif /* de
1ae40 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53  fined(SQLITE_TES
1ae50 54 29 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66  T) */.../*.** If
1ae60 20 74 68 65 20 6d 61 63 72 6f 20 54 43 4c 53 48   the macro TCLSH
1ae70 20 69 73 20 6f 6e 65 2c 20 74 68 65 6e 20 70 75   is one, then pu
1ae80 74 20 69 6e 20 63 6f 64 65 20 74 68 69 73 20 66  t in code this f
1ae90 6f 72 20 74 68 65 0a 2a 2a 20 22 6d 61 69 6e 22  or the.** "main"
1aea0 20 72 6f 75 74 69 6e 65 20 74 68 61 74 20 77 69   routine that wi
1aeb0 6c 6c 20 69 6e 69 74 69 61 6c 69 7a 65 20 54 63  ll initialize Tc
1aec0 6c 20 61 6e 64 20 74 61 6b 65 20 69 6e 70 75 74  l and take input
1aed0 20 66 72 6f 6d 0a 2a 2a 20 73 74 61 6e 64 61 72   from.** standar
1aee0 64 20 69 6e 70 75 74 2c 20 6f 72 20 69 66 20 61  d input, or if a
1aef0 20 66 69 6c 65 20 69 73 20 6e 61 6d 65 64 20 6f   file is named o
1af00 6e 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69  n the command li
1af10 6e 65 0a 2a 2a 20 74 68 65 20 54 43 4c 20 69 6e  ne.** the TCL in
1af20 74 65 72 70 72 65 74 65 72 20 72 65 61 64 73 20  terpreter reads 
1af30 61 6e 64 20 65 76 61 6c 75 61 74 65 73 20 74 68  and evaluates th
1af40 61 74 20 66 69 6c 65 2e 0a 2a 2f 0a 23 69 66 20  at file..*/.#if 
1af50 54 43 4c 53 48 3d 3d 31 0a 73 74 61 74 69 63 20  TCLSH==1.static 
1af60 63 6f 6e 73 74 20 63 68 61 72 20 2a 74 63 6c 73  const char *tcls
1af70 68 5f 6d 61 69 6e 5f 6c 6f 6f 70 28 76 6f 69 64  h_main_loop(void
1af80 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  ){.  static cons
1af90 74 20 63 68 61 72 20 7a 4d 61 69 6e 6c 6f 6f 70  t char zMainloop
1afa0 5b 5d 20 3d 0a 20 20 20 20 22 73 65 74 20 6c 69  [] =.    "set li
1afb0 6e 65 20 7b 7d 5c 6e 22 0a 20 20 20 20 22 77 68  ne {}\n".    "wh
1afc0 69 6c 65 20 7b 21 5b 65 6f 66 20 73 74 64 69 6e  ile {![eof stdin
1afd0 5d 7d 20 7b 5c 6e 22 0a 20 20 20 20 20 20 22 69  ]} {\n".      "i
1afe0 66 20 7b 24 6c 69 6e 65 21 3d 5c 22 5c 22 7d 20  f {$line!=\"\"} 
1aff0 7b 5c 6e 22 0a 20 20 20 20 20 20 20 20 22 70 75  {\n".        "pu
1b000 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20 5c 22  ts -nonewline \"
1b010 3e 20 5c 22 5c 6e 22 0a 20 20 20 20 20 20 22 7d  > \"\n".      "}
1b020 20 65 6c 73 65 20 7b 5c 6e 22 0a 20 20 20 20 20   else {\n".     
1b030 20 20 20 22 70 75 74 73 20 2d 6e 6f 6e 65 77 6c     "puts -nonewl
1b040 69 6e 65 20 5c 22 25 20 5c 22 5c 6e 22 0a 20 20  ine \"% \"\n".  
1b050 20 20 20 20 22 7d 5c 6e 22 0a 20 20 20 20 20 20      "}\n".      
1b060 22 66 6c 75 73 68 20 73 74 64 6f 75 74 5c 6e 22  "flush stdout\n"
1b070 0a 20 20 20 20 20 20 22 61 70 70 65 6e 64 20 6c  .      "append l
1b080 69 6e 65 20 5b 67 65 74 73 20 73 74 64 69 6e 5d  ine [gets stdin]
1b090 5c 6e 22 0a 20 20 20 20 20 20 22 69 66 20 7b 5b  \n".      "if {[
1b0a0 69 6e 66 6f 20 63 6f 6d 70 6c 65 74 65 20 24 6c  info complete $l
1b0b0 69 6e 65 5d 7d 20 7b 5c 6e 22 0a 20 20 20 20 20  ine]} {\n".     
1b0c0 20 20 20 22 69 66 20 7b 5b 63 61 74 63 68 20 7b     "if {[catch {
1b0d0 75 70 6c 65 76 65 6c 20 23 30 20 24 6c 69 6e 65  uplevel #0 $line
1b0e0 7d 20 72 65 73 75 6c 74 5d 7d 20 7b 5c 6e 22 0a  } result]} {\n".
1b0f0 20 20 20 20 20 20 20 20 20 20 22 70 75 74 73 20            "puts 
1b100 73 74 64 65 72 72 20 5c 22 45 72 72 6f 72 3a 20  stderr \"Error: 
1b110 24 72 65 73 75 6c 74 5c 22 5c 6e 22 0a 20 20 20  $result\"\n".   
1b120 20 20 20 20 20 22 7d 20 65 6c 73 65 69 66 20 7b       "} elseif {
1b130 24 72 65 73 75 6c 74 21 3d 5c 22 5c 22 7d 20 7b  $result!=\"\"} {
1b140 5c 6e 22 0a 20 20 20 20 20 20 20 20 20 20 22 70  \n".          "p
1b150 75 74 73 20 24 72 65 73 75 6c 74 5c 6e 22 0a 20  uts $result\n". 
1b160 20 20 20 20 20 20 20 22 7d 5c 6e 22 0a 20 20 20         "}\n".   
1b170 20 20 20 20 20 22 73 65 74 20 6c 69 6e 65 20 7b       "set line {
1b180 7d 5c 6e 22 0a 20 20 20 20 20 20 22 7d 20 65 6c  }\n".      "} el
1b190 73 65 20 7b 5c 6e 22 0a 20 20 20 20 20 20 20 20  se {\n".        
1b1a0 22 61 70 70 65 6e 64 20 6c 69 6e 65 20 5c 5c 6e  "append line \\n
1b1b0 5c 6e 22 0a 20 20 20 20 20 20 22 7d 5c 6e 22 0a  \n".      "}\n".
1b1c0 20 20 20 20 22 7d 5c 6e 22 0a 20 20 3b 0a 20 20      "}\n".  ;.  
1b1d0 72 65 74 75 72 6e 20 7a 4d 61 69 6e 6c 6f 6f 70  return zMainloop
1b1e0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 54  ;.}.#endif.#if T
1b1f0 43 4c 53 48 3d 3d 32 0a 73 74 61 74 69 63 20 63  CLSH==2.static c
1b200 6f 6e 73 74 20 63 68 61 72 20 2a 74 63 6c 73 68  onst char *tclsh
1b210 5f 6d 61 69 6e 5f 6c 6f 6f 70 28 76 6f 69 64 29  _main_loop(void)
1b220 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66  ;.#endif..#ifdef
1b230 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 73 74 61   SQLITE_TEST.sta
1b240 74 69 63 20 76 6f 69 64 20 69 6e 69 74 5f 61 6c  tic void init_al
1b250 6c 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 29 3b  l(Tcl_Interp *);
1b260 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 69 74  .static int init
1b270 5f 61 6c 6c 5f 63 6d 64 28 0a 20 20 43 6c 69 65  _all_cmd(.  Clie
1b280 6e 74 44 61 74 61 20 63 64 2c 0a 20 20 54 63 6c  ntData cd,.  Tcl
1b290 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
1b2a0 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
1b2b0 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
1b2c0 6a 76 5b 5d 0a 29 7b 0a 0a 20 20 54 63 6c 5f 49  jv[].){..  Tcl_I
1b2d0 6e 74 65 72 70 20 2a 73 6c 61 76 65 3b 0a 20 20  nterp *slave;.  
1b2e0 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20  if( objc!=2 ){. 
1b2f0 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
1b300 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
1b310 62 6a 76 2c 20 22 53 4c 41 56 45 22 29 3b 0a 20  bjv, "SLAVE");. 
1b320 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
1b330 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 73 6c 61 76  ROR;.  }..  slav
1b340 65 20 3d 20 54 63 6c 5f 47 65 74 53 6c 61 76 65  e = Tcl_GetSlave
1b350 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
1b360 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 29  String(objv[1]))
1b370 3b 0a 20 20 69 66 28 20 21 73 6c 61 76 65 20 29  ;.  if( !slave )
1b380 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  {.    return TCL
1b390 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69  _ERROR;.  }..  i
1b3a0 6e 69 74 5f 61 6c 6c 28 73 6c 61 76 65 29 3b 0a  nit_all(slave);.
1b3b0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
1b3c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 63 6c 63 6d 64  .}../*.** Tclcmd
1b3d0 3a 20 64 62 5f 75 73 65 5f 6c 65 67 61 63 79 5f  : db_use_legacy_
1b3e0 70 72 65 70 61 72 65 20 44 42 20 42 4f 4f 4c 45  prepare DB BOOLE
1b3f0 41 4e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 66  AN.**.**   The f
1b400 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f  irst argument to
1b410 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 6d 75   this command mu
1b420 73 74 20 62 65 20 61 20 64 61 74 61 62 61 73 65  st be a database
1b430 20 63 6f 6d 6d 61 6e 64 20 63 72 65 61 74 65 64   command created
1b440 20 62 79 0a 2a 2a 20 20 20 5b 73 71 6c 69 74 65   by.**   [sqlite
1b450 33 5d 2e 20 49 66 20 74 68 65 20 73 65 63 6f 6e  3]. If the secon
1b460 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 72  d argument is tr
1b470 75 65 2c 20 74 68 65 6e 20 74 68 65 20 68 61 6e  ue, then the han
1b480 64 6c 65 20 69 73 20 63 6f 6e 66 69 67 75 72 65  dle is configure
1b490 64 0a 2a 2a 20 20 20 74 6f 20 75 73 65 20 74 68  d.**   to use th
1b4a0 65 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  e sqlite3_prepar
1b4b0 65 5f 76 32 28 29 20 66 75 6e 63 74 69 6f 6e 20  e_v2() function 
1b4c0 74 6f 20 70 72 65 70 61 72 65 20 73 74 61 74 65  to prepare state
1b4d0 6d 65 6e 74 73 2e 20 49 66 20 69 74 0a 2a 2a 20  ments. If it.** 
1b4e0 20 20 69 73 20 66 61 6c 73 65 2c 20 73 71 6c 69    is false, sqli
1b4f0 74 65 33 5f 70 72 65 70 61 72 65 28 29 2e 0a 2a  te3_prepare()..*
1b500 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 62 5f  /.static int db_
1b510 75 73 65 5f 6c 65 67 61 63 79 5f 70 72 65 70 61  use_legacy_prepa
1b520 72 65 5f 63 6d 64 28 0a 20 20 43 6c 69 65 6e 74  re_cmd(.  Client
1b530 44 61 74 61 20 63 64 2c 0a 20 20 54 63 6c 5f 49  Data cd,.  Tcl_I
1b540 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
1b550 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
1b560 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
1b570 5b 5d 0a 29 7b 0a 20 20 54 63 6c 5f 43 6d 64 49  [].){.  Tcl_CmdI
1b580 6e 66 6f 20 63 6d 64 49 6e 66 6f 3b 0a 20 20 53  nfo cmdInfo;.  S
1b590 71 6c 69 74 65 44 62 20 2a 70 44 62 3b 0a 20 20  qliteDb *pDb;.  
1b5a0 69 6e 74 20 62 50 72 65 70 61 72 65 3b 0a 0a 20  int bPrepare;.. 
1b5b0 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a   if( objc!=3 ){.
1b5c0 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
1b5d0 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
1b5e0 6f 62 6a 76 2c 20 22 44 42 20 42 4f 4f 4c 45 41  objv, "DB BOOLEA
1b5f0 4e 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  N");.    return 
1b600 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
1b610 20 20 69 66 28 20 21 54 63 6c 5f 47 65 74 43 6f    if( !Tcl_GetCo
1b620 6d 6d 61 6e 64 49 6e 66 6f 28 69 6e 74 65 72 70  mmandInfo(interp
1b630 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
1b640 6f 62 6a 76 5b 31 5d 29 2c 20 26 63 6d 64 49 6e  objv[1]), &cmdIn
1b650 66 6f 29 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  fo) ){.    Tcl_A
1b660 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
1b670 72 70 2c 20 22 6e 6f 20 73 75 63 68 20 64 62 3a  rp, "no such db:
1b680 20 22 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e   ", Tcl_GetStrin
1b690 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 28 63 68 61  g(objv[1]), (cha
1b6a0 72 2a 29 30 29 3b 0a 20 20 20 20 72 65 74 75 72  r*)0);.    retur
1b6b0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
1b6c0 0a 20 20 70 44 62 20 3d 20 28 53 71 6c 69 74 65  .  pDb = (Sqlite
1b6d0 44 62 2a 29 63 6d 64 49 6e 66 6f 2e 6f 62 6a 43  Db*)cmdInfo.objC
1b6e0 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20 69 66 28  lientData;.  if(
1b6f0 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46   Tcl_GetBooleanF
1b700 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
1b710 62 6a 76 5b 32 5d 2c 20 26 62 50 72 65 70 61 72  bjv[2], &bPrepar
1b720 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  e) ){.    return
1b730 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
1b740 0a 20 20 70 44 62 2d 3e 62 4c 65 67 61 63 79 50  .  pDb->bLegacyP
1b750 72 65 70 61 72 65 20 3d 20 62 50 72 65 70 61 72  repare = bPrepar
1b760 65 3b 0a 0a 20 20 54 63 6c 5f 52 65 73 65 74 52  e;..  Tcl_ResetR
1b770 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20  esult(interp);. 
1b780 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
1b790 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
1b7a0 43 6f 6e 66 69 67 75 72 65 20 74 68 65 20 69 6e  Configure the in
1b7b0 74 65 72 70 72 65 74 65 72 20 70 61 73 73 65 64  terpreter passed
1b7c0 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
1b7d0 67 75 6d 65 6e 74 20 74 6f 20 68 61 76 65 20 61  gument to have a
1b7e0 63 63 65 73 73 0a 2a 2a 20 74 6f 20 74 68 65 20  ccess.** to the 
1b7f0 63 6f 6d 6d 61 6e 64 73 20 61 6e 64 20 6c 69 6e  commands and lin
1b800 6b 65 64 20 76 61 72 69 61 62 6c 65 73 20 74 68  ked variables th
1b810 61 74 20 6d 61 6b 65 20 75 70 3a 0a 2a 2a 0a 2a  at make up:.**.*
1b820 2a 20 20 20 2a 20 74 68 65 20 5b 73 71 6c 69 74  *   * the [sqlit
1b830 65 33 5d 20 65 78 74 65 6e 73 69 6f 6e 20 69 74  e3] extension it
1b840 73 65 6c 66 2c 20 0a 2a 2a 0a 2a 2a 20 20 20 2a  self, .**.**   *
1b850 20 49 66 20 53 51 4c 49 54 45 5f 54 43 4c 4d 44   If SQLITE_TCLMD
1b860 35 20 6f 72 20 53 51 4c 49 54 45 5f 54 45 53 54  5 or SQLITE_TEST
1b870 20 69 73 20 64 65 66 69 6e 65 64 2c 20 74 68 65   is defined, the
1b880 20 4d 64 35 20 63 6f 6d 6d 61 6e 64 73 2c 20 61   Md5 commands, a
1b890 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20  nd.**.**   * If 
1b8a0 53 51 4c 49 54 45 5f 54 45 53 54 20 69 73 20 73  SQLITE_TEST is s
1b8b0 65 74 2c 20 74 68 65 20 76 61 72 69 6f 75 73 20  et, the various 
1b8c0 74 65 73 74 20 69 6e 74 65 72 66 61 63 65 73 20  test interfaces 
1b8d0 75 73 65 64 20 62 79 20 74 68 65 20 54 63 6c 0a  used by the Tcl.
1b8e0 2a 2a 20 20 20 20 20 74 65 73 74 20 73 75 69 74  **     test suit
1b8f0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
1b900 64 20 69 6e 69 74 5f 61 6c 6c 28 54 63 6c 5f 49  d init_all(Tcl_I
1b910 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 0a  nterp *interp){.
1b920 20 20 53 71 6c 69 74 65 33 5f 49 6e 69 74 28 69    Sqlite3_Init(i
1b930 6e 74 65 72 70 29 3b 0a 0a 23 69 66 20 64 65 66  nterp);..#if def
1b940 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54  ined(SQLITE_TEST
1b950 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c  ) || defined(SQL
1b960 49 54 45 5f 54 43 4c 4d 44 35 29 0a 20 20 4d 64  ITE_TCLMD5).  Md
1b970 35 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a  5_Init(interp);.
1b980 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 6e 73  #endif..  /* Ins
1b990 74 61 6c 6c 20 74 68 65 20 5b 72 65 67 69 73 74  tall the [regist
1b9a0 65 72 5f 64 62 73 74 61 74 5f 76 74 61 62 5d 20  er_dbstat_vtab] 
1b9b0 63 6f 6d 6d 61 6e 64 20 74 6f 20 61 63 63 65 73  command to acces
1b9c0 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
1b9d0 74 69 6f 6e 0a 20 20 2a 2a 20 6f 66 20 76 69 72  tion.  ** of vir
1b9e0 74 75 61 6c 20 74 61 62 6c 65 20 64 62 73 74 61  tual table dbsta
1b9f0 74 20 28 73 6f 75 72 63 65 20 66 69 6c 65 20 74  t (source file t
1ba00 65 73 74 5f 73 74 61 74 2e 63 29 2e 20 54 68 69  est_stat.c). Thi
1ba10 73 20 63 6f 6d 6d 61 6e 64 20 69 73 0a 20 20 2a  s command is.  *
1ba20 2a 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 74  * required for t
1ba30 65 73 74 66 69 78 74 75 72 65 20 61 6e 64 20 73  estfixture and s
1ba40 71 6c 69 74 65 33 5f 61 6e 61 6c 79 7a 65 72 2c  qlite3_analyzer,
1ba50 20 62 75 74 20 6e 6f 74 20 62 79 20 74 68 65 20   but not by the 
1ba60 70 72 6f 64 75 63 74 69 6f 6e 0a 20 20 2a 2a 20  production.  ** 
1ba70 54 63 6c 20 65 78 74 65 6e 73 69 6f 6e 2e 20 20  Tcl extension.  
1ba80 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  */.#if defined(S
1ba90 51 4c 49 54 45 5f 54 45 53 54 29 20 7c 7c 20 54  QLITE_TEST) || T
1baa0 43 4c 53 48 3d 3d 32 0a 20 20 7b 0a 20 20 20 20  CLSH==2.  {.    
1bab0 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74  extern int Sqlit
1bac0 65 74 65 73 74 53 74 61 74 5f 49 6e 69 74 28 54  etestStat_Init(T
1bad0 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20  cl_Interp*);.   
1bae0 20 53 71 6c 69 74 65 74 65 73 74 53 74 61 74 5f   SqlitetestStat_
1baf0 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  Init(interp);.  
1bb00 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66  }.#endif..#ifdef
1bb10 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 7b   SQLITE_TEST.  {
1bb20 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20  .    extern int 
1bb30 53 71 6c 69 74 65 63 6f 6e 66 69 67 5f 49 6e 69  Sqliteconfig_Ini
1bb40 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a  t(Tcl_Interp*);.
1bb50 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53      extern int S
1bb60 71 6c 69 74 65 74 65 73 74 31 5f 49 6e 69 74 28  qlitetest1_Init(
1bb70 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20  Tcl_Interp*);.  
1bb80 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c    extern int Sql
1bb90 69 74 65 74 65 73 74 32 5f 49 6e 69 74 28 54 63  itetest2_Init(Tc
1bba0 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20  l_Interp*);.    
1bbb0 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74  extern int Sqlit
1bbc0 65 74 65 73 74 33 5f 49 6e 69 74 28 54 63 6c 5f  etest3_Init(Tcl_
1bbd0 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78  Interp*);.    ex
1bbe0 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74  tern int Sqlitet
1bbf0 65 73 74 34 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  est4_Init(Tcl_In
1bc00 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65  terp*);.    exte
1bc10 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73  rn int Sqlitetes
1bc20 74 35 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  t5_Init(Tcl_Inte
1bc30 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e  rp*);.    extern
1bc40 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 36   int Sqlitetest6
1bc50 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
1bc60 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69  *);.    extern i
1bc70 6e 74 20 53 71 6c 69 74 65 74 65 73 74 37 5f 49  nt Sqlitetest7_I
1bc80 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29  nit(Tcl_Interp*)
1bc90 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74  ;.    extern int
1bca0 20 53 71 6c 69 74 65 74 65 73 74 38 5f 49 6e 69   Sqlitetest8_Ini
1bcb0 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a  t(Tcl_Interp*);.
1bcc0 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53      extern int S
1bcd0 71 6c 69 74 65 74 65 73 74 39 5f 49 6e 69 74 28  qlitetest9_Init(
1bce0 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20  Tcl_Interp*);.  
1bcf0 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c    extern int Sql
1bd00 69 74 65 74 65 73 74 61 73 79 6e 63 5f 49 6e 69  itetestasync_Ini
1bd10 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a  t(Tcl_Interp*);.
1bd20 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53      extern int S
1bd30 71 6c 69 74 65 74 65 73 74 5f 61 75 74 6f 65 78  qlitetest_autoex
1bd40 74 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  t_Init(Tcl_Inter
1bd50 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20  p*);.    extern 
1bd60 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 5f 64  int Sqlitetest_d
1bd70 65 6d 6f 76 66 73 5f 49 6e 69 74 28 54 63 6c 5f  emovfs_Init(Tcl_
1bd80 49 6e 74 65 72 70 20 2a 29 3b 0a 20 20 20 20 65  Interp *);.    e
1bd90 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65  xtern int Sqlite
1bda0 74 65 73 74 5f 66 75 6e 63 5f 49 6e 69 74 28 54  test_func_Init(T
1bdb0 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20  cl_Interp*);.   
1bdc0 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69   extern int Sqli
1bdd0 74 65 74 65 73 74 5f 68 65 78 69 6f 5f 49 6e 69  tetest_hexio_Ini
1bde0 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a  t(Tcl_Interp*);.
1bdf0 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53      extern int S
1be00 71 6c 69 74 65 74 65 73 74 5f 69 6e 69 74 5f 49  qlitetest_init_I
1be10 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29  nit(Tcl_Interp*)
1be20 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74  ;.    extern int
1be30 20 53 71 6c 69 74 65 74 65 73 74 5f 6d 61 6c 6c   Sqlitetest_mall
1be40 6f 63 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  oc_Init(Tcl_Inte
1be50 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e  rp*);.    extern
1be60 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 5f   int Sqlitetest_
1be70 6d 75 74 65 78 5f 49 6e 69 74 28 54 63 6c 5f 49  mutex_Init(Tcl_I
1be80 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74  nterp*);.    ext
1be90 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65  ern int Sqlitete
1bea0 73 74 73 63 68 65 6d 61 5f 49 6e 69 74 28 54 63  stschema_Init(Tc
1beb0 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20  l_Interp*);.    
1bec0 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74  extern int Sqlit
1bed0 65 74 65 73 74 73 73 65 5f 49 6e 69 74 28 54 63  etestsse_Init(Tc
1bee0 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20  l_Interp*);.    
1bef0 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74  extern int Sqlit
1bf00 65 74 65 73 74 74 63 6c 76 61 72 5f 49 6e 69 74  etesttclvar_Init
1bf10 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20  (Tcl_Interp*);. 
1bf20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71     extern int Sq
1bf30 6c 69 74 65 74 65 73 74 66 73 5f 49 6e 69 74 28  litetestfs_Init(
1bf40 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20  Tcl_Interp*);.  
1bf50 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c    extern int Sql
1bf60 69 74 65 74 65 73 74 54 68 72 65 61 64 5f 49 6e  itetestThread_In
1bf70 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b  it(Tcl_Interp*);
1bf80 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20  .    extern int 
1bf90 53 71 6c 69 74 65 74 65 73 74 4f 6e 65 66 69 6c  SqlitetestOnefil
1bfa0 65 5f 49 6e 69 74 28 29 3b 0a 20 20 20 20 65 78  e_Init();.    ex
1bfb0 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74  tern int Sqlitet
1bfc0 65 73 74 4f 73 69 6e 73 74 5f 49 6e 69 74 28 54  estOsinst_Init(T
1bfd0 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20  cl_Interp*);.   
1bfe0 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69   extern int Sqli
1bff0 74 65 74 65 73 74 62 61 63 6b 75 70 5f 49 6e 69  tetestbackup_Ini
1c000 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a  t(Tcl_Interp*);.
1c010 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53      extern int S
1c020 71 6c 69 74 65 74 65 73 74 69 6e 74 61 72 72 61  qlitetestintarra
1c030 79 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  y_Init(Tcl_Inter
1c040 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20  p*);.    extern 
1c050 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 76 66  int Sqlitetestvf
1c060 73 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  s_Init(Tcl_Inter
1c070 70 20 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e  p *);.    extern
1c080 20 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 72   int Sqlitetestr
1c090 74 72 65 65 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  tree_Init(Tcl_In
1c0a0 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65  terp*);.    exte
1c0b0 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 71 75 6f  rn int Sqlitequo
1c0c0 74 61 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  ta_Init(Tcl_Inte
1c0d0 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65 72 6e  rp*);.    extern
1c0e0 20 69 6e 74 20 53 71 6c 69 74 65 6d 75 6c 74 69   int Sqlitemulti
1c0f0 70 6c 65 78 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  plex_Init(Tcl_In
1c100 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65  terp*);.    exte
1c110 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 53 75 70  rn int SqliteSup
1c120 65 72 6c 6f 63 6b 5f 49 6e 69 74 28 54 63 6c 5f  erlock_Init(Tcl_
1c130 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78  Interp*);.    ex
1c140 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74  tern int Sqlitet
1c150 65 73 74 53 79 73 63 61 6c 6c 5f 49 6e 69 74 28  estSyscall_Init(
1c160 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20  Tcl_Interp*);.  
1c170 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c    extern int Sql
1c180 69 74 65 74 65 73 74 66 75 7a 7a 65 72 5f 49 6e  itetestfuzzer_In
1c190 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b  it(Tcl_Interp*);
1c1a0 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20  .    extern int 
1c1b0 53 71 6c 69 74 65 74 65 73 74 77 68 6f 6c 65 6e  Sqlitetestwholen
1c1c0 75 6d 62 65 72 5f 49 6e 69 74 28 54 63 6c 5f 49  umber_Init(Tcl_I
1c1d0 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74  nterp*);.    ext
1c1e0 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74 65  ern int Sqlitete
1c1f0 73 74 72 65 67 65 78 70 5f 49 6e 69 74 28 54 63  stregexp_Init(Tc
1c200 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 0a 23 69 66  l_Interp*);..#if
1c210 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
1c220 45 4e 41 42 4c 45 5f 46 54 53 33 29 20 7c 7c 20  ENABLE_FTS3) || 
1c230 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
1c240 4e 41 42 4c 45 5f 46 54 53 34 29 0a 20 20 20 20  NABLE_FTS4).    
1c250 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74  extern int Sqlit
1c260 65 74 65 73 74 66 74 73 33 5f 49 6e 69 74 28 54  etestfts3_Init(T
1c270 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
1c280 70 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64  p);.#endif..#ifd
1c290 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
1c2a0 5f 5a 49 50 56 46 53 0a 20 20 20 20 65 78 74 65  _ZIPVFS.    exte
1c2b0 72 6e 20 69 6e 74 20 5a 69 70 76 66 73 5f 49 6e  rn int Zipvfs_In
1c2c0 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b  it(Tcl_Interp*);
1c2d0 0a 20 20 20 20 5a 69 70 76 66 73 5f 49 6e 69 74  .    Zipvfs_Init
1c2e0 28 69 6e 74 65 72 70 29 3b 0a 23 65 6e 64 69 66  (interp);.#endif
1c2f0 0a 0a 20 20 20 20 53 71 6c 69 74 65 63 6f 6e 66  ..    Sqliteconf
1c300 69 67 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b  ig_Init(interp);
1c310 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 31  .    Sqlitetest1
1c320 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20  _Init(interp);. 
1c330 20 20 20 53 71 6c 69 74 65 74 65 73 74 32 5f 49     Sqlitetest2_I
1c340 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20  nit(interp);.   
1c350 20 53 71 6c 69 74 65 74 65 73 74 33 5f 49 6e 69   Sqlitetest3_Ini
1c360 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53  t(interp);.    S
1c370 71 6c 69 74 65 74 65 73 74 34 5f 49 6e 69 74 28  qlitetest4_Init(
1c380 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c  interp);.    Sql
1c390 69 74 65 74 65 73 74 35 5f 49 6e 69 74 28 69 6e  itetest5_Init(in
1c3a0 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74  terp);.    Sqlit
1c3b0 65 74 65 73 74 36 5f 49 6e 69 74 28 69 6e 74 65  etest6_Init(inte
1c3c0 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74  rp);.    Sqlitet
1c3d0 65 73 74 37 5f 49 6e 69 74 28 69 6e 74 65 72 70  est7_Init(interp
1c3e0 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73  );.    Sqlitetes
1c3f0 74 38 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b  t8_Init(interp);
1c400 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 39  .    Sqlitetest9
1c410 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20  _Init(interp);. 
1c420 20 20 20 53 71 6c 69 74 65 74 65 73 74 61 73 79     Sqlitetestasy
1c430 6e 63 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b  nc_Init(interp);
1c440 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 5f  .    Sqlitetest_
1c450 61 75 74 6f 65 78 74 5f 49 6e 69 74 28 69 6e 74  autoext_Init(int
1c460 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65  erp);.    Sqlite
1c470 74 65 73 74 5f 64 65 6d 6f 76 66 73 5f 49 6e 69  test_demovfs_Ini
1c480 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53  t(interp);.    S
1c490 71 6c 69 74 65 74 65 73 74 5f 66 75 6e 63 5f 49  qlitetest_func_I
1c4a0 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20  nit(interp);.   
1c4b0 20 53 71 6c 69 74 65 74 65 73 74 5f 68 65 78 69   Sqlitetest_hexi
1c4c0 6f 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a  o_Init(interp);.
1c4d0 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 5f 69      Sqlitetest_i
1c4e0 6e 69 74 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  nit_Init(interp)
1c4f0 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74  ;.    Sqlitetest
1c500 5f 6d 61 6c 6c 6f 63 5f 49 6e 69 74 28 69 6e 74  _malloc_Init(int
1c510 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65  erp);.    Sqlite
1c520 74 65 73 74 5f 6d 75 74 65 78 5f 49 6e 69 74 28  test_mutex_Init(
1c530 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c  interp);.    Sql
1c540 69 74 65 74 65 73 74 73 63 68 65 6d 61 5f 49 6e  itetestschema_In
1c550 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  it(interp);.    
1c560 53 71 6c 69 74 65 74 65 73 74 74 63 6c 76 61 72  Sqlitetesttclvar
1c570 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20  _Init(interp);. 
1c580 20 20 20 53 71 6c 69 74 65 74 65 73 74 66 73 5f     Sqlitetestfs_
1c590 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  Init(interp);.  
1c5a0 20 20 53 71 6c 69 74 65 74 65 73 74 54 68 72 65    SqlitetestThre
1c5b0 61 64 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b  ad_Init(interp);
1c5c0 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 4f  .    SqlitetestO
1c5d0 6e 65 66 69 6c 65 5f 49 6e 69 74 28 69 6e 74 65  nefile_Init(inte
1c5e0 72 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74  rp);.    Sqlitet
1c5f0 65 73 74 4f 73 69 6e 73 74 5f 49 6e 69 74 28 69  estOsinst_Init(i
1c600 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69  nterp);.    Sqli
1c610 74 65 74 65 73 74 62 61 63 6b 75 70 5f 49 6e 69  tetestbackup_Ini
1c620 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53  t(interp);.    S
1c630 71 6c 69 74 65 74 65 73 74 69 6e 74 61 72 72 61  qlitetestintarra
1c640 79 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a  y_Init(interp);.
1c650 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 76 66      Sqlitetestvf
1c660 73 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a  s_Init(interp);.
1c670 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 72 74      Sqlitetestrt
1c680 72 65 65 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  ree_Init(interp)
1c690 3b 0a 20 20 20 20 53 71 6c 69 74 65 71 75 6f 74  ;.    Sqlitequot
1c6a0 61 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a  a_Init(interp);.
1c6b0 20 20 20 20 53 71 6c 69 74 65 6d 75 6c 74 69 70      Sqlitemultip
1c6c0 6c 65 78 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  lex_Init(interp)
1c6d0 3b 0a 20 20 20 20 53 71 6c 69 74 65 53 75 70 65  ;.    SqliteSupe
1c6e0 72 6c 6f 63 6b 5f 49 6e 69 74 28 69 6e 74 65 72  rlock_Init(inter
1c6f0 70 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65  p);.    Sqlitete
1c700 73 74 53 79 73 63 61 6c 6c 5f 49 6e 69 74 28 69  stSyscall_Init(i
1c710 6e 74 65 72 70 29 3b 0a 20 20 20 20 53 71 6c 69  nterp);.    Sqli
1c720 74 65 74 65 73 74 66 75 7a 7a 65 72 5f 49 6e 69  tetestfuzzer_Ini
1c730 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 53  t(interp);.    S
1c740 71 6c 69 74 65 74 65 73 74 77 68 6f 6c 65 6e 75  qlitetestwholenu
1c750 6d 62 65 72 5f 49 6e 69 74 28 69 6e 74 65 72 70  mber_Init(interp
1c760 29 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73  );.    Sqlitetes
1c770 74 72 65 67 65 78 70 5f 49 6e 69 74 28 69 6e 74  tregexp_Init(int
1c780 65 72 70 29 3b 0a 0a 23 69 66 20 64 65 66 69 6e  erp);..#if defin
1c790 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
1c7a0 5f 46 54 53 33 29 20 7c 7c 20 64 65 66 69 6e 65  _FTS3) || define
1c7b0 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
1c7c0 46 54 53 34 29 0a 20 20 20 20 53 71 6c 69 74 65  FTS4).    Sqlite
1c7d0 74 65 73 74 66 74 73 33 5f 49 6e 69 74 28 69 6e  testfts3_Init(in
1c7e0 74 65 72 70 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  terp);.#endif.. 
1c7f0 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a     Tcl_CreateObj
1c800 43 6f 6d 6d 61 6e 64 28 0a 20 20 20 20 20 20 20  Command(.       
1c810 20 69 6e 74 65 72 70 2c 20 22 6c 6f 61 64 5f 74   interp, "load_t
1c820 65 73 74 66 69 78 74 75 72 65 5f 65 78 74 65 6e  estfixture_exten
1c830 73 69 6f 6e 73 22 2c 20 69 6e 69 74 5f 61 6c 6c  sions", init_all
1c840 5f 63 6d 64 2c 20 30 2c 20 30 0a 20 20 20 20 29  _cmd, 0, 0.    )
1c850 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65  ;.    Tcl_Create
1c860 4f 62 6a 43 6f 6d 6d 61 6e 64 28 0a 20 20 20 20  ObjCommand(.    
1c870 20 20 20 20 69 6e 74 65 72 70 2c 20 22 64 62 5f      interp, "db_
1c880 75 73 65 5f 6c 65 67 61 63 79 5f 70 72 65 70 61  use_legacy_prepa
1c890 72 65 22 2c 20 64 62 5f 75 73 65 5f 6c 65 67 61  re", db_use_lega
1c8a0 63 79 5f 70 72 65 70 61 72 65 5f 63 6d 64 2c 20  cy_prepare_cmd, 
1c8b0 30 2c 20 30 0a 20 20 20 20 29 3b 0a 0a 23 69 66  0, 0.    );..#if
1c8c0 64 65 66 20 53 51 4c 49 54 45 5f 53 53 45 0a 20  def SQLITE_SSE. 
1c8d0 20 20 20 53 71 6c 69 74 65 74 65 73 74 73 73 65     Sqlitetestsse
1c8e0 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 23  _Init(interp);.#
1c8f0 65 6e 64 69 66 0a 20 20 7d 0a 23 65 6e 64 69 66  endif.  }.#endif
1c900 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 54 43 4c 53  .}..#define TCLS
1c910 48 5f 4d 41 49 4e 20 6d 61 69 6e 20 20 20 2f 2a  H_MAIN main   /*
1c920 20 4e 65 65 64 65 64 20 74 6f 20 66 61 6b 65 20   Needed to fake 
1c930 6f 75 74 20 6d 6b 74 63 6c 61 70 70 20 2a 2f 0a  out mktclapp */.
1c940 69 6e 74 20 54 43 4c 53 48 5f 4d 41 49 4e 28 69  int TCLSH_MAIN(i
1c950 6e 74 20 61 72 67 63 2c 20 63 68 61 72 20 2a 2a  nt argc, char **
1c960 61 72 67 76 29 7b 0a 20 20 54 63 6c 5f 49 6e 74  argv){.  Tcl_Int
1c970 65 72 70 20 2a 69 6e 74 65 72 70 3b 0a 20 20 0a  erp *interp;.  .
1c980 20 20 2f 2a 20 43 61 6c 6c 20 73 71 6c 69 74 65    /* Call sqlite
1c990 33 5f 73 68 75 74 64 6f 77 6e 28 29 20 6f 6e 63  3_shutdown() onc
1c9a0 65 20 62 65 66 6f 72 65 20 64 6f 69 6e 67 20 61  e before doing a
1c9b0 6e 79 74 68 69 6e 67 20 65 6c 73 65 2e 20 54 68  nything else. Th
1c9c0 69 73 20 69 73 20 74 6f 0a 20 20 2a 2a 20 74 65  is is to.  ** te
1c9d0 73 74 20 74 68 61 74 20 73 71 6c 69 74 65 33 5f  st that sqlite3_
1c9e0 73 68 75 74 64 6f 77 6e 28 29 20 63 61 6e 20 62  shutdown() can b
1c9f0 65 20 73 61 66 65 6c 79 20 63 61 6c 6c 65 64 20  e safely called 
1ca00 62 79 20 61 20 70 72 6f 63 65 73 73 20 62 65 66  by a process bef
1ca10 6f 72 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33  ore.  ** sqlite3
1ca20 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 20 69 73  _initialize() is
1ca30 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73  . */.  sqlite3_s
1ca40 68 75 74 64 6f 77 6e 28 29 3b 0a 0a 20 20 54 63  hutdown();..  Tc
1ca50 6c 5f 46 69 6e 64 45 78 65 63 75 74 61 62 6c 65  l_FindExecutable
1ca60 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 69 6e 74  (argv[0]);.  int
1ca70 65 72 70 20 3d 20 54 63 6c 5f 43 72 65 61 74 65  erp = Tcl_Create
1ca80 49 6e 74 65 72 70 28 29 3b 0a 0a 23 69 66 20 54  Interp();..#if T
1ca90 43 4c 53 48 3d 3d 32 0a 20 20 73 71 6c 69 74 65  CLSH==2.  sqlite
1caa0 33 5f 63 6f 6e 66 69 67 28 53 51 4c 49 54 45 5f  3_config(SQLITE_
1cab0 43 4f 4e 46 49 47 5f 53 49 4e 47 4c 45 54 48 52  CONFIG_SINGLETHR
1cac0 45 41 44 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  EAD);.#endif..  
1cad0 69 6e 69 74 5f 61 6c 6c 28 69 6e 74 65 72 70 29  init_all(interp)
1cae0 3b 0a 20 20 69 66 28 20 61 72 67 63 3e 3d 32 20  ;.  if( argc>=2 
1caf0 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
1cb00 20 20 63 68 61 72 20 7a 41 72 67 63 5b 33 32 5d    char zArgc[32]
1cb10 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  ;.    sqlite3_sn
1cb20 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 41  printf(sizeof(zA
1cb30 72 67 63 29 2c 20 7a 41 72 67 63 2c 20 22 25 64  rgc), zArgc, "%d
1cb40 22 2c 20 61 72 67 63 2d 28 33 2d 54 43 4c 53 48  ", argc-(3-TCLSH
1cb50 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 56  ));.    Tcl_SetV
1cb60 61 72 28 69 6e 74 65 72 70 2c 22 61 72 67 63 22  ar(interp,"argc"
1cb70 2c 20 7a 41 72 67 63 2c 20 54 43 4c 5f 47 4c 4f  , zArgc, TCL_GLO
1cb80 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 20 20 20 20 54  BAL_ONLY);.    T
1cb90 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70  cl_SetVar(interp
1cba0 2c 22 61 72 67 76 30 22 2c 61 72 67 76 5b 31 5d  ,"argv0",argv[1]
1cbb0 2c 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59  ,TCL_GLOBAL_ONLY
1cbc0 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 56 61  );.    Tcl_SetVa
1cbd0 72 28 69 6e 74 65 72 70 2c 22 61 72 67 76 22 2c  r(interp,"argv",
1cbe0 20 22 22 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f   "", TCL_GLOBAL_
1cbf0 4f 4e 4c 59 29 3b 0a 20 20 20 20 66 6f 72 28 69  ONLY);.    for(i
1cc00 3d 33 2d 54 43 4c 53 48 3b 20 69 3c 61 72 67 63  =3-TCLSH; i<argc
1cc10 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 54 63  ; i++){.      Tc
1cc20 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c  l_SetVar(interp,
1cc30 20 22 61 72 67 76 22 2c 20 61 72 67 76 5b 69 5d   "argv", argv[i]
1cc40 2c 0a 20 20 20 20 20 20 20 20 20 20 54 43 4c 5f  ,.          TCL_
1cc50 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 20 7c 20 54 43  GLOBAL_ONLY | TC
1cc60 4c 5f 4c 49 53 54 5f 45 4c 45 4d 45 4e 54 20 7c  L_LIST_ELEMENT |
1cc70 20 54 43 4c 5f 41 50 50 45 4e 44 5f 56 41 4c 55   TCL_APPEND_VALU
1cc80 45 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  E);.    }.    if
1cc90 28 20 54 43 4c 53 48 3d 3d 31 20 26 26 20 54 63  ( TCLSH==1 && Tc
1cca0 6c 5f 45 76 61 6c 46 69 6c 65 28 69 6e 74 65 72  l_EvalFile(inter
1ccb0 70 2c 20 61 72 67 76 5b 31 5d 29 21 3d 54 43 4c  p, argv[1])!=TCL
1ccc0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e  _OK ){.      con
1ccd0 73 74 20 63 68 61 72 20 2a 7a 49 6e 66 6f 20 3d  st char *zInfo =
1cce0 20 54 63 6c 5f 47 65 74 56 61 72 28 69 6e 74 65   Tcl_GetVar(inte
1ccf0 72 70 2c 20 22 65 72 72 6f 72 49 6e 66 6f 22 2c  rp, "errorInfo",
1cd00 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59   TCL_GLOBAL_ONLY
1cd10 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 49 6e  );.      if( zIn
1cd20 66 6f 3d 3d 30 20 29 20 7a 49 6e 66 6f 20 3d 20  fo==0 ) zInfo = 
1cd30 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73  Tcl_GetStringRes
1cd40 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20  ult(interp);.   
1cd50 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
1cd60 72 2c 22 25 73 3a 20 25 73 5c 6e 22 2c 20 2a 61  r,"%s: %s\n", *a
1cd70 72 67 76 2c 20 7a 49 6e 66 6f 29 3b 0a 20 20 20  rgv, zInfo);.   
1cd80 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
1cd90 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 54 43 4c   }.  }.  if( TCL
1cda0 53 48 3d 3d 32 20 7c 7c 20 61 72 67 63 3c 3d 31  SH==2 || argc<=1
1cdb0 20 29 7b 0a 20 20 20 20 54 63 6c 5f 47 6c 6f 62   ){.    Tcl_Glob
1cdc0 61 6c 45 76 61 6c 28 69 6e 74 65 72 70 2c 20 74  alEval(interp, t
1cdd0 63 6c 73 68 5f 6d 61 69 6e 5f 6c 6f 6f 70 28 29  clsh_main_loop()
1cde0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
1cdf0 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 54  0;.}.#endif /* T
1ce00 43 4c 53 48 20 2a 2f 0a                          CLSH */.